//  a example to test the level of optimisation
// --------------------------------------------
// PARAM -n 100
// debugmacro 
include "getARGV.idp"

int nn=getARGV("-n",300);
// nodebugmacro
 mesh Th=square(nn,nn);
verbosity=5;
 fespace Vh(Th,P1);     // P1 FE space
 Vh uh,vh;              // unkown and test function. 
 func f=1;                 //  right hand side function 
 func g=0;                 //  boundary condition function

 problem laplace0(uh,vh,solver=Cholesky,tgv=1e30) =                    //  definion of  the problem 
    int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) //  bilinear form
  + int1d(Th,1)( uh*vh) 
  + int1d(Th,1)( - vh)
  + int2d(Th)( -f*vh )                          //  linear form
  + on(2,3,4,uh=g) ;                      //  boundary condition form

 problem laplace1(uh,vh,solver=CG,tgv=1e30) =                    //  definion of  the problem 
    int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) //  bilinear form
  + int1d(Th,1)( uh*vh) 
  + int1d(Th,1)( - vh)
  + int2d(Th)( -f*vh )                          //  linear form
  + on(2,3,4,uh=g) ;                      //  boundary condition form

 problem laplaceLU(uh,vh,solver=LU,tgv=1e30) =                    //  definion of  the problem 
    int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) //  bilinear form
  + int1d(Th,1)( uh*vh) 
  + int1d(Th,1)( - vh)
  + int2d(Th)( -f*vh )                          //  linear form
  + on(2,3,4,uh=g) ;                      //  boundary condition form

 problem laplaceCrout(uh,vh,solver=Crout,tgv=1e30) =                    //  definion of  the problem 
    int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) //  bilinear form
  + int1d(Th,1)( uh*vh) 
  + int1d(Th,1)( - vh)
  + int2d(Th)( -f*vh )                          //  linear form
  + on(2,3,4,uh=g) ;                      //  boundary condition form

real cpu=clock() ;
laplace0; // solve the problem plot(uh); // to see the result
cout << "-- lap Cholesky " << nn << "x" << nn << "  : " <<  -cpu+clock() << " s,  max =" << uh[].max << endl;
uh=0;
cpu=clock() ;
laplace1; // solve the problem plot(uh); // to see the result
cout << "-- lap CG       " << nn << "x" << nn << "  : " <<  -cpu+clock() << " s,  max =" << uh[].max << endl;
uh=0;

cpu=clock() ;
laplaceLU; // solve the problem plot(uh); // to see the result
cout << "-- lap LU       " << nn << "x" << nn << "  : " <<  -cpu+clock() << " s,  max =" << uh[].max << endl;
uh=0;

cpu=clock() ;
laplaceCrout; // solve the problem plot(uh); // to see the result
cout << "-- lap Crout    " << nn << "x" << nn << "  : " <<  -cpu+clock() << " s,  max =" << uh[].max << endl;

// FFCS: reference value for regression tests
real regtest=uh[].max;

uh=0;

if(HaveUMFPACK){
  problem laplace2(uh,vh,solver="SPARSESOLVER",tgv=1e30) =                    //  definion of  the problem 
    int2d(Th)( dx(uh)*dx(vh) + dy(uh)*dy(vh) ) //  bilinear form
    + int1d(Th,1)( uh*vh) 
    + int1d(Th,1)( - vh)
    + int2d(Th)( -f*vh )                          //  linear form
    + on(2,3,4,uh=g) ;                      //  boundary condition form

  cpu=clock(); 
  laplace2; // solve the problem plot(uh); // to see the result
  cout << "-- lap UMFPACK  " << nn << "x" << nn << "  : "
       <<  -cpu+clock() << " s,  max =" << uh[].max << endl;
}
else{
  cout << "-- lap UMFPACK  " << nn << "x" << nn << "  : "
       <<  "not available" << endl;
}

//  plot(uh,ps="lap1-cpu.eps",value=true);
