/***********************************************************************/
/* finite_difference.cc: main program for finite difference simulation */
/*             of 1D conservation law                                  */
/*                                                                     */
/* B. Haasdonk, 22.10.2008                                             */
/***********************************************************************/

#include "finite_difference.hh"

// main loop for finite difference simulation
int main(int argc, char** argv)
{ 
  if (argc!=7)
  {
    cerr << "Too few arguments. Usage: \n";
    cerr << argv[0] << " a b N T K filename\n";
    return(EXIT_FAILURE);
  }
  else
  {
    // read command line parameters:  
    double a = atof(argv[1]);
    double b = atof(argv[2]);
    int N = atoi(argv[3]);
    double T = atof(argv[4]);
    int K = atoi(argv[5]);
    double dt = T/K;
    string filename(argv[6]);
    
    Model model; // initialize model
    Grid grid(a,b,N); // construct grid
    DiscreteFunction solution(grid); // allocate memory for solution
    DiscreteFunction update(grid); // allocate memory for update

    NumericalFlux numFlux(model); // initialize the numericalflux
    
    // initialize time variable:
    double t=0;
    // initialize discrete space operator:
    DiscreteSpaceOperator discOperator(numFlux, model, t); 
    
    // initialize projection operator
    Projection projection;
    
    // project initial data from model and store in solution
    projection.apply(model, solution);
    
    
    while (t<T)
    {
      discOperator.apply(solution,update);
      update*=dt;
      solution+=update;    
      t+=dt;  // increase t 
    }
    
    // at end time:
    solution.writeAsciiFile(filename);
    
    return(EXIT_SUCCESS);
    
  } // end of else branch
  
}