int TestMaxwell2D() { bool test = true; field f; init_empty_field(&f); f.model.cfl = 0.05; f.model.m = 7; // num of conservative variables f.model.NumFlux = Maxwell2DNumFlux_uncentered; //f.model.NumFlux = Maxwell2DNumFlux_centered; f.model.BoundaryFlux = Maxwell2DBoundaryFlux_uncentered; f.model.InitData = Maxwell2DInitData; f.model.ImposedData = Maxwell2DImposedData; f.varindex = GenericVarindex; f.model.Source = Maxwell2DSource; f.interp.interp_param[0] = f.model.m; f.interp.interp_param[1] = 3; // x direction degree f.interp.interp_param[2] = 3; // y direction degree f.interp.interp_param[3] = 0; // z direction degree f.interp.interp_param[4] = 4; // x direction refinement f.interp.interp_param[5] = 4; // y direction refinement f.interp.interp_param[6] = 1; // z direction refinement ReadMacroMesh(&(f.macromesh), "../test/testcube.msh"); Detect2DMacroMesh(&(f.macromesh)); assert(f.macromesh.is2d); BuildConnectivity(&(f.macromesh)); char buf[1000]; sprintf(buf, "-D _M=%d", f.model.m); strcat(cl_buildoptions, buf); set_source_CL(&f, "Maxwell2DSource"); sprintf(numflux_cl_name, "%s", "Maxwell2DNumFlux_uncentered"); sprintf(buf," -D NUMFLUX="); strcat(buf, numflux_cl_name); strcat(cl_buildoptions, buf); sprintf(buf, " -D BOUNDARYFLUX=%s", "Maxwell2DBoundaryFlux_uncentered"); strcat(cl_buildoptions, buf); Initfield(&f); CheckMacroMesh(&(f.macromesh), f.interp.interp_param + 1); real tmax = 0.1; f.vmax = 1; real dt = set_dt(&f); #if 0 // C version RK2(&f, tmax, dt); #else // OpenCL version CopyfieldtoGPU(&f); RK2_CL(&f, tmax, dt, 0, 0, 0); CopyfieldtoCPU(&f); printf("\nOpenCL Kernel time:\n"); show_cl_timing(&f); printf("\n"); #endif // Save the results and the error /* Plotfield(0, false, &f, NULL, "dgvisu.msh"); */ /* Plotfield(0, true, &f, "error", "dgerror.msh"); */ real dd = L2error(&f); real tolerance = 1.1e-2; test = test && (dd < tolerance); printf("L2 error: %f\n", dd); return test; }
int TestDtfield_CL(void){ bool test = true; if(!cldevice_is_acceptable(nplatform_cl, ndevice_cl)) { printf("OpenCL device not acceptable.\n"); return true; } field f; // 2D meshes: // test/disque2d.msh // test/testdisque2d.msh // test/testmacromesh.msh // test/unit-cube.msh char *mshname = "test/disque2d.msh"; ReadMacroMesh(&(f.macromesh), mshname); Detect2DMacroMesh(&f.macromesh); BuildConnectivity(&f.macromesh); #if 1 // 2D version assert(f.macromesh.is2d); f.model.cfl = 0.05; f.model.m = 1; m = f.model.m; f.model.NumFlux = TransNumFlux2d; f.model.BoundaryFlux = TransBoundaryFlux2d; f.model.InitData = TransInitData2d; f.model.ImposedData = TransImposedData2d; f.varindex = GenericVarindex; f.interp.interp_param[0] = f.model.m; f.interp.interp_param[1] = 2; // x direction degree f.interp.interp_param[2] = 2; // y direction degree f.interp.interp_param[3] = 0; // z direction degree f.interp.interp_param[4] = 4; // x direction refinement f.interp.interp_param[5] = 4; // y direction refinement f.interp.interp_param[6] = 1; // z direction refinement #else // 3D version f.model.cfl = 0.05; f.model.m = 1; f.model.NumFlux = TransNumFlux; f.model.BoundaryFlux = TestTransBoundaryFlux; f.model.InitData = TestTransInitData; f.model.ImposedData = TestTransImposedData; f.varindex = GenericVarindex; f.interp.interp_param[0] = f.model.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] = 3; // x direction refinement f.interp.interp_param[5] = 3; // y direction refinement f.interp.interp_param[6] = 3; // z direction refinement #endif set_global_m(f.model.m); set_source_CL(&f, "OneSource"); Initfield(&f); cl_event clv_dtfield = clCreateUserEvent(f.cli.context, NULL); dtfield_CL(&f, &f.wn_cl, 0, NULL, &clv_dtfield); clWaitForEvents(1, &clv_dtfield); CopyfieldtoCPU(&f); // Displayfield(&f); show_cl_timing(&f); real *saveptr = f.dtwn; f.dtwn = calloc(f.wsize, sizeof(real)); f.model.Source = OneSource; dtfield(&f, f.wn, f.dtwn); real maxerr = 0; for(int i = 0; i < f.wsize; i++) { real error = f.dtwn[i] - saveptr[i]; //printf("error= \t%f\t%f\t%f\n", error, f.dtwn[i], saveptr[i]); maxerr = fmax(fabs(error), maxerr); } printf("max error: %f\n", maxerr); test = (maxerr < 1e-8); return test; }