int TestPoisson(void) { bool test = true; field f; init_empty_field(&f); int vec=1; // num of conservative variables f(vi) for each vi, phi, E, rho, u, // p, e (ou T) f.model.m=_MV+6; f.vmax = _VMAX; // maximal wave speed f.model.NumFlux = VlasovP_Lagrangian_NumFlux; f.model.Source = VlasovP_Lagrangian_Source; //f.model.Source = NULL; f.model.BoundaryFlux = TestPoisson_BoundaryFlux; f.model.InitData = TestPoisson_InitData; f.model.ImposedData = TestPoisson_ImposedData; f.varindex = GenericVarindex; f.pre_dtfield = NULL; f.update_after_rk = NULL; f.interp.interp_param[0] = f.model.m; // _M f.interp.interp_param[1] = 3; // x direction degree f.interp.interp_param[2] = 0; // y direction degree f.interp.interp_param[3] = 0; // z direction degree f.interp.interp_param[4] = 32; // x direction refinement f.interp.interp_param[5] = 1; // y direction refinement f.interp.interp_param[6] = 1; // z direction refinement // read the gmsh file ReadMacroMesh(&(f.macromesh),"../test/testcube.msh"); // try to detect a 2d mesh //bool is1d=Detect1DMacroMesh(&(f.macromesh)); Detect1DMacroMesh(&(f.macromesh)); bool is1d=f.macromesh.is1d; assert(is1d); // mesh preparation BuildConnectivity(&(f.macromesh)); PrintMacroMesh(&(f.macromesh)); //assert(1==2); //AffineMapMacroMesh(&(f.macromesh)); // prepare the initial fields Initfield(&f); f.nb_diags=0; // prudence... CheckMacroMesh(&(f.macromesh),f.interp.interp_param+1); printf("cfl param =%f\n",f.hmin); // time derivative //dtField(&f); //DisplayField(&f); //assert(1==2); // apply the DG scheme // time integration by RK2 scheme // up to final time = 1. /*Compute_electric_field(&f); // check the gradient on every glop for(int ie=0;ie<f.macromesh.nbelems;ie++){ printf("elem %d\n",ie); for(int ipg=0;ipg<NPG(f.interp_param+1);ipg++){ real xref[3],wpg; ref_pg_vol(f.interp_param+1,ipg,xref,&wpg,NULL); printf("Gauss point %d %f %f %f \n",ipg,xref[0],xref[1],xref[2]); int imem=f.varindex(f.interp_param,ie,ipg,_MV+1); printf("gradphi exact=%f gradphinum=%f\n",1-2*xref[0],f.wn[imem]); test=test && (fabs(f.wn[imem]-(1-2*xref[0]))<1e-10); } }*/ //Computation_charge_density(f); SolvePoisson1D(&f,f.wn,1,0.0,0.0,LU,NONE); // check the gradient given by the poisson solver for(int ie=0;ie<f.macromesh.nbelems;ie++){ MacroCell *mcell = f.mcell + ie; for(int ipg=0;ipg<NPG(mcell->raf, mcell->deg);ipg++){ real xref[3],wpg; int *raf = f.interp_param+4; int *deg = f.interp_param+1; ref_pg_vol(raf, deg, ipg, xref, &wpg, NULL); //printf("Gauss point %d %f %f %f \n",ipg,xref[0],xref[1],xref[2]); int imem=f.varindex(f.interp_param, ipg, _MV + 1) + mcell->woffset; // printf("gradphi exact=%f gradphinum=%f rap=%f\n", //1-2*xref[0],f.wn[imem],(1-2*xref[0])/f.wn[imem]); real tolerance; if(sizeof(real) == sizeof(double)) tolerance = 1e-8; else tolerance = 1e-4; test=test && (fabs(f.wn[imem]-(-1+2*xref[0])) < tolerance); } } return test; }
int Test_TransportVP() { bool test = true; field f; init_empty_field(&f); int vec=1; f.model.m=_INDEX_MAX; // num of conservative variables f(vi) for // each vi, phi, E, rho, u, p, e (ou T) f.model.NumFlux=VlasovP_Lagrangian_NumFlux; //f.model.Source = NULL; f.model.InitData = Test_TransportVP_InitData; f.model.ImposedData = Test_TransportVP_ImposedData; f.model.BoundaryFlux = Test_TransportVP_BoundaryFlux; f.varindex = GenericVarindex; f.interp.interp_param[0] = f.model.m; // _M f.interp.interp_param[1] = 2; // x direction degree f.interp.interp_param[2] = 0; // y direction degree f.interp.interp_param[3] = 0; // z direction degree f.interp.interp_param[4] = 16; // x direction refinement f.interp.interp_param[5] = 1; // y direction refinement f.interp.interp_param[6] = 1; // z direction refinement // read the gmsh file ReadMacroMesh(&(f.macromesh), "../test/testcube.msh"); // try to detect a 2d mesh Detect1DMacroMesh(&(f.macromesh)); bool is1d = f.macromesh.is1d; assert(is1d); // mesh preparation BuildConnectivity(&(f.macromesh)); //AffineMapMacroMesh(&(f.macromesh)); // prepare the initial fields f.model.cfl = 0.05; Initfield(&f); f.vmax = _VMAX; // maximal wave speed f.nb_diags = 3; f.pre_dtfield = UpdateVlasovPoisson; f.post_dtfield=NULL; f.update_after_rk = PlotVlasovPoisson; f.model.Source = VlasovP_Lagrangian_Source; // prudence... CheckMacroMesh(&(f.macromesh), f.interp.interp_param + 1); printf("cfl param =%f\n", f.hmin); real tmax = 0.03; real dt = set_dt(&f); RK2(&f, tmax, dt); //RK2(&f,0.03,0.05); // save the results and the error int iel = 2 * _NB_ELEM_V / 3; int iloc = _DEG_V; printf("Trace vi=%f\n", -_VMAX + iel * _DV + _DV * glop(_DEG_V, iloc)); Plotfield(iloc + iel * _DEG_V, false, &f, "sol","dgvisu.msh"); Plotfield(iloc + iel * _DEG_V, true, &f, "error","dgerror.msh"); Plot_Energies(&f, dt); real dd_Kinetic = L2_Kinetic_error(&f); printf("erreur kinetic L2=%lf\n", dd_Kinetic); test= test && (dd_Kinetic < 1e-2); return test; }
int TestPeriodic(void) { bool test=true; field f; init_empty_field(&f); f.model.m=_INDEX_MAX; // num of conservative variables f.vmax = _VMAX; // maximal wave speed f.model.NumFlux=VlasovP_Lagrangian_NumFlux; f.model.Source = NULL; f.model.BoundaryFlux = TestPeriodic_BoundaryFlux; f.model.InitData = TestPeriodic_InitData; f.model.ImposedData = TestPeriodic_ImposedData; f.varindex=GenericVarindex; f.pre_dtfield=NULL; f.post_dtfield=NULL; f.update_after_rk=NULL; f.model.cfl=0.05; f.interp.interp_param[0]=f.model.m; // _M f.interp.interp_param[1]=3; // x direction degree f.interp.interp_param[2]=0; // y direction degree f.interp.interp_param[3]=0; // z direction degree f.interp.interp_param[4]=10; // x direction refinement f.interp.interp_param[5]=1; // y direction refinement f.interp.interp_param[6]=1; // z direction refinement // read the gmsh file ReadMacroMesh(&(f.macromesh), "test/testcube.msh"); // try to detect a 2d mesh Detect1DMacroMesh(&(f.macromesh)); assert(f.macromesh.is1d); // mesh preparation f.macromesh.period[0]=1; BuildConnectivity(&(f.macromesh)); PrintMacroMesh(&(f.macromesh)); //assert(1==2); //AffineMapMacroMesh(&(f.macromesh)); // prepare the initial fields Initfield(&f); f.nb_diags = 0; // prudence... CheckMacroMesh(&(f.macromesh),f.interp.interp_param+1); printf("cfl param =%f\n",f.hmin); // time derivative //dtField(&f); //DisplayField(&f); //assert(1==2); // apply the DG scheme // time integration by RK2 scheme // up to final time = 1. //RK2(&f,0.5,0.1); f.vmax=_VMAX; real dt = set_dt(&f); RK2(&f,0.5, dt); // save the results and the error Plotfield(0,(1==0),&f,"sol","dgvisu.msh"); Plotfield(0,(1==1),&f,"error","dgerror.msh"); real dd=L2error(&f); real dd_Kinetic=L2_Kinetic_error(&f); printf("erreur kinetic L2=%lf\n",dd_Kinetic); printf("erreur L2=%lf\n",dd); test= test && (dd<3e-3); //SolvePoisson(&f); return test; }
int TestMHD1D(int argc, char *argv[]) { real cfl = 0.2; real tmax = 1.0; bool writemsh = false; real vmax = 6.0; bool usegpu = false; real dt = 0.0; for (;;) { int cc = getopt(argc, argv, "c:t:w:D:P:g:s:"); if (cc == -1) break; switch (cc) { case 0: break; case 'c': cfl = atof(optarg); break; case 'g': usegpu = atoi(optarg); break; case 't': tmax = atof(optarg); break; case 'w': writemsh = true; break; case 'D': ndevice_cl= atoi(optarg); break; case 'P': nplatform_cl = atoi(optarg); break; default: printf("Error: invalid option.\n"); printf("Usage:\n"); printf("./testmanyv -c <cfl> -d <deg> -n <nraf> -t <tmax> -C\n -P <cl platform number> -D <cl device number> FIXME"); exit(1); } } bool test = true; field f; init_empty_field(&f); f.varindex = GenericVarindex; f.model.m = 9; f.model.cfl = cfl; strcpy(f.model.name,"MHD"); f.model.NumFlux=MHDNumFluxRusanov; f.model.BoundaryFlux=MHDBoundaryFlux; f.model.InitData=MHDInitData; f.model.ImposedData=MHDImposedData; char buf[1000]; sprintf(buf, "-D _M=%d", f.model.m); strcat(cl_buildoptions, buf); sprintf(numflux_cl_name, "%s", "MHDNumFluxRusanov"); sprintf(buf," -D NUMFLUX="); strcat(buf, numflux_cl_name); strcat(cl_buildoptions, buf); sprintf(buf, " -D BOUNDARYFLUX=%s", "MHDBoundaryFlux"); strcat(cl_buildoptions, buf); // Set the global parameters for the Vlasov equation f.interp.interp_param[0] = f.model.m; // _M f.interp.interp_param[1] = 1; // x direction degree f.interp.interp_param[2] = 0; // y direction degree f.interp.interp_param[3] = 0; // z direction degree f.interp.interp_param[4] = 10; // x direction refinement f.interp.interp_param[5] = 1; // y direction refinement f.interp.interp_param[6] = 1; // z direction refinement //set_vlasov_params(&(f.model)); // Read the gmsh file ReadMacroMesh(&(f.macromesh), "test/testcartesiangrid1d.msh"); //ReadMacroMesh(&(f.macromesh), "test/testcube.msh"); // Try to detect a 2d mesh Detect1DMacroMesh(&(f.macromesh)); bool is1d=f.macromesh.is1d; assert(is1d); f.macromesh.period[0]=10; // Mesh preparation BuildConnectivity(&(f.macromesh)); // Prepare the initial fields Initfield(&f); // Prudence... CheckMacroMesh(&(f.macromesh), f.interp.interp_param + 1); Plotfield(0, (1==0), &f, "Rho", "dginit.msh"); f.vmax=vmax; if(dt <= 0) dt = set_dt(&f); real executiontime; if(usegpu) { printf("Using OpenCL:\n"); //executiontime = seconds(); assert(1==2); RK2(&f, tmax, dt); //executiontime = seconds() - executiontime; } else { printf("Using C:\n"); //executiontime = seconds(); RK2(&f, tmax, dt); //executiontime = seconds() - executiontime; } Plotfield(0,false,&f, "Rho", "dgvisu.msh"); Gnuplot(&f,0,0.0,"data1D.dat"); printf("tmax: %f, cfl: %f\n", tmax, f.model.cfl); printf("deltax:\n"); printf("%f\n", f.hmin); printf("deltat:\n"); printf("%f\n", dt); printf("DOF:\n"); printf("%d\n", f.wsize); printf("executiontime (s):\n"); printf("%f\n", executiontime); printf("time per RK2 (s):\n"); printf("%f\n", executiontime / (real)f.itermax); return test; }