int TestfieldDG() { int test = true; field f; init_empty_field(&f); f.model.cfl = 0.05; f.model.m = 1; // only one conservative variable f.model.NumFlux = TransNumFlux; f.model.BoundaryFlux = TestTransBoundaryFlux; f.model.InitData = TestTransInitData; f.model.ImposedData = TestTransImposedData; f.model.Source = NULL; f.varindex = GenericVarindex; f.interp.interp_param[0] = 1; // _M f.interp.interp_param[1] = 2; // x direction degree f.interp.interp_param[2] = 2; // y direction degree f.interp.interp_param[3] = 2; // z direction degree f.interp.interp_param[4] = 2; // x direction refinement f.interp.interp_param[5] = 2; // y direction refinement f.interp.interp_param[6] = 2; // z direction refinement ReadMacroMesh(&(f.macromesh), "../test/testcube2.msh"); //ReadMacroMesh(&(f.macromesh),"test/testmacromesh.msh"); BuildConnectivity(&(f.macromesh)); PrintMacroMesh(&(f.macromesh)); //AffineMapMacroMesh(&(f.macromesh)); PrintMacroMesh(&(f.macromesh)); real tnow = 0.0; Initfield(&f); CheckMacroMesh(&(f.macromesh), f.interp.interp_param + 1); dtfield(&f, tnow, f.wn, f.dtwn); Displayfield(&f); /* Plotfield(0, false, &f, NULL, "visu.msh"); */ /* Plotfield(0, true, &f, "error", "error.msh"); */ // Test the time derivative with the exact solution int *raf = f.interp.interp_param + 4; int *deg = f.interp.interp_param + 1; for(int i = 0; i < f.model.m * f.macromesh.nbelems * NPG(raf, deg); i++){ test = test && fabs(4 * f.wn[i] - pow(f.dtwn[i], 2)) < 1e-2; printf("i=%d err=%f \n",i,4 * f.wn[i] - pow(f.dtwn[i], 2)); assert(test); } return test; };
int TestfieldSubCellDGVol() { int test = true; field f; init_empty_field(&f); f.model.cfl = 0.05; f.model.m = 1; // only one conservative variable f.model.NumFlux = TransNumFlux; f.model.BoundaryFlux = TestTransBoundaryFlux; f.model.InitData = TestTransInitData; f.model.ImposedData = TestTransImposedData; f.varindex = GenericVarindex; f.interp.interp_param[0] = 1; // _M f.interp.interp_param[1] = 2; // x direction degree f.interp.interp_param[2] = 2; // y direction degree f.interp.interp_param[3] = 2; // z direction degree f.interp.interp_param[4] = 2; // x direction refinement f.interp.interp_param[5] = 2; // y direction refinement f.interp.interp_param[6] = 1; // z direction refinement ReadMacroMesh(&f.macromesh, "../test/testcube.msh"); //ReadMacroMesh(&f.macromesh,"test/testdisque.msh"); BuildConnectivity(&f.macromesh); PrintMacroMesh(&f.macromesh); //AffineMapMacroMesh(&f.macromesh); PrintMacroMesh(&f.macromesh); Initfield(&f); CheckMacroMesh(&f.macromesh, f.interp.interp_param + 1); real tnow = 0.0; for(int ie = 0;ie < f.macromesh.nbelems; ie++) DGMacroCellInterfaceSlow((void*) (f.mcell+ie), &f, f.wn, f.dtwn); for(int ie = 0; ie < f.macromesh.nbelems; ie++) { DGSubCellInterface((void*) (f.mcell+ie), &f, f.wn, f.dtwn); DGVolume((void*) (f.mcell+ie), &f, f.wn, f.dtwn); DGMass((void*) (f.mcell+ie), &f, f.dtwn); DGSource((void*) (f.mcell+ie), &f, tnow, f.wn, f.dtwn); } /* DGMacroCellInterfaceSlow(&f); */ /* DGSubCellInterface(&f); */ /* DGVolume(&f); */ /* DGMass(&f); */ Displayfield(&f); /* Plotfield(0, false, &f, NULL, "visu.msh"); */ /* Plotfield(0, true, &f, "error", "error.msh"); */ // test the time derivative with the exact solution int *raf = f.interp.interp_param + 4; int *deg = f.interp.interp_param + 1; for(int i=0; i < f.model.m * f.macromesh.nbelems * NPG(raf, deg); i++) { test = test && fabs(4 * f.wn[i] - pow(f.dtwn[i] , 2)) < 1e-2; assert(test); } return test; }
// some unit tests of the macromesh code int TestPICAccumulate(void) { MacroMesh m; bool test=true; int param[]={4, 4, 4, 1, 1, 1, 0}; field f; init_empty_field(&f); // test gmsh file reading ReadMacroMesh(&(f.macromesh), "test/testmacromesh.msh"); BuildConnectivity(&(f.macromesh)); CheckMacroMesh(&(f.macromesh), param); //PrintMacroMesh(&m); PIC pic; InitPIC(&pic,1); CreateParticles(&pic,&(f.macromesh)); PlotParticles(&pic,&(f.macromesh)); f.model.m = 7; // num of conservative variables /* f.model.NumFlux = Maxwell2DNumFlux; */ /* f.model.BoundaryFlux = Maxwell2DBoundaryFlux; */ f.model.InitData = Maxwell2DConstInitData; /* f.model.ImposedData = Maxwell2DImposedData; */ f.varindex = GenericVarindex; f.interp.interp_param[0] = f.model.m; f.interp.interp_param[1] = 1; // x direction degree f.interp.interp_param[2] = 1; // y direction degree f.interp.interp_param[3] = 0; // z direction degree f.interp.interp_param[4] = 1; // x direction refinement f.interp.interp_param[5] = 1; // y direction refinement f.interp.interp_param[6] = 1; // z direction refinement Initfield(&f); // place the particle at (0,1,0) and v=(1,0,0) pic.xv[0]=0; pic.xv[1]=0; pic.xv[2]=0.5; real xref[3]; pic.cell_id[0]=NumElemFromPoint(&f.macromesh,pic.xv,xref); pic.xv[0]=xref[0]; pic.xv[1]=xref[1]; pic.xv[2]=xref[2]; pic.xv[3]=1; pic.xv[4]=0; pic.xv[5]=0; PlotParticles(&pic,&(f.macromesh)); int ie=2; int ipg=2; int iv=4; int imem=f.varindex(f.interp_param, ie, ipg, iv); AccumulateParticles(&pic,&f); printf("w=%f wex=%f\n",f.wn[imem],1/1.96); test = test && (fabs(f.wn[imem]-1/1.96) < 1e-8); Displayfield(&f); return test; }