18b438e21SMatthew G. Knepley static char help[] = "Tests for high order geometry\n\n";
28b438e21SMatthew G. Knepley
38b438e21SMatthew G. Knepley #include <petscdmplex.h>
48b438e21SMatthew G. Knepley #include <petscds.h>
58b438e21SMatthew G. Knepley
68b438e21SMatthew G. Knepley typedef struct {
78b438e21SMatthew G. Knepley PetscReal volume; /* Analytical volume of the mesh */
88b438e21SMatthew G. Knepley PetscReal tol; /* Tolerance for volume check */
98b438e21SMatthew G. Knepley } AppCtx;
108b438e21SMatthew G. Knepley
ProcessOptions(MPI_Comm comm,AppCtx * options)11d71ae5a4SJacob Faibussowitsch PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
12d71ae5a4SJacob Faibussowitsch {
138b438e21SMatthew G. Knepley PetscFunctionBegin;
148b438e21SMatthew G. Knepley options->volume = -1.0;
158b438e21SMatthew G. Knepley options->tol = PETSC_SMALL;
168b438e21SMatthew G. Knepley
17d0609cedSBarry Smith PetscOptionsBegin(comm, "", "Meshing Interpolation Test Options", "DMPLEX");
189566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-volume", "The analytical volume of the mesh", "ex33.c", options->volume, &options->volume, NULL));
199566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-tol", "The tolerance for the volume check", "ex33.c", options->tol, &options->tol, NULL));
20d0609cedSBarry Smith PetscOptionsEnd();
213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
228b438e21SMatthew G. Knepley }
238b438e21SMatthew G. Knepley
CreateMesh(MPI_Comm comm,AppCtx * ctx,DM * dm)24d71ae5a4SJacob Faibussowitsch PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *ctx, DM *dm)
25d71ae5a4SJacob Faibussowitsch {
268b438e21SMatthew G. Knepley PetscFunctionBegin;
279566063dSJacob Faibussowitsch PetscCall(DMCreate(comm, dm));
289566063dSJacob Faibussowitsch PetscCall(DMSetType(*dm, DMPLEX));
299566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(*dm));
309566063dSJacob Faibussowitsch PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view"));
313ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
328b438e21SMatthew G. Knepley }
338b438e21SMatthew G. Knepley
volume(PetscInt dim,PetscInt Nf,PetscInt NfAux,const PetscInt uOff[],const PetscInt uOff_x[],const PetscScalar u[],const PetscScalar u_t[],const PetscScalar u_x[],const PetscInt aOff[],const PetscInt aOff_x[],const PetscScalar a[],const PetscScalar a_t[],const PetscScalar a_x[],PetscReal t,const PetscReal x[],PetscInt numConstants,const PetscScalar constants[],PetscScalar vol[])34d71ae5a4SJacob Faibussowitsch static void volume(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar vol[])
35d71ae5a4SJacob Faibussowitsch {
368b438e21SMatthew G. Knepley vol[0] = 1.;
378b438e21SMatthew G. Knepley }
388b438e21SMatthew G. Knepley
CreateDiscretization(DM dm,AppCtx * ctx)39d71ae5a4SJacob Faibussowitsch static PetscErrorCode CreateDiscretization(DM dm, AppCtx *ctx)
40d71ae5a4SJacob Faibussowitsch {
418b438e21SMatthew G. Knepley PetscDS ds;
428b438e21SMatthew G. Knepley PetscFE fe;
4339290ff6SMatthew G. Knepley DMPolytopeType ct;
4439290ff6SMatthew G. Knepley PetscInt dim, cStart;
458b438e21SMatthew G. Knepley
468b438e21SMatthew G. Knepley PetscFunctionBeginUser;
479566063dSJacob Faibussowitsch PetscCall(DMGetDimension(dm, &dim));
489566063dSJacob Faibussowitsch PetscCall(DMPlexGetHeightStratum(dm, 0, &cStart, NULL));
499566063dSJacob Faibussowitsch PetscCall(DMPlexGetCellType(dm, cStart, &ct));
50ae2d839dSMatthew G. Knepley PetscCall(PetscFECreateByCell(PETSC_COMM_SELF, dim, 1, ct, NULL, PETSC_DETERMINE, &fe));
519566063dSJacob Faibussowitsch PetscCall(PetscFESetName(fe, "scalar"));
529566063dSJacob Faibussowitsch PetscCall(DMAddField(dm, NULL, (PetscObject)fe));
539566063dSJacob Faibussowitsch PetscCall(PetscFEDestroy(&fe));
549566063dSJacob Faibussowitsch PetscCall(DMCreateDS(dm));
559566063dSJacob Faibussowitsch PetscCall(DMGetDS(dm, &ds));
569566063dSJacob Faibussowitsch PetscCall(PetscDSSetObjective(ds, 0, volume));
573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
588b438e21SMatthew G. Knepley }
598b438e21SMatthew G. Knepley
CheckVolume(DM dm,AppCtx * ctx)60d71ae5a4SJacob Faibussowitsch static PetscErrorCode CheckVolume(DM dm, AppCtx *ctx)
61d71ae5a4SJacob Faibussowitsch {
628b438e21SMatthew G. Knepley Vec u;
638b438e21SMatthew G. Knepley PetscScalar result;
648b438e21SMatthew G. Knepley PetscReal vol, tol = ctx->tol;
658b438e21SMatthew G. Knepley
668b438e21SMatthew G. Knepley PetscFunctionBeginUser;
679566063dSJacob Faibussowitsch PetscCall(DMGetGlobalVector(dm, &u));
689566063dSJacob Faibussowitsch PetscCall(DMPlexComputeIntegralFEM(dm, u, &result, ctx));
698b438e21SMatthew G. Knepley vol = PetscRealPart(result);
709566063dSJacob Faibussowitsch PetscCall(DMRestoreGlobalVector(dm, &u));
719566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PetscObjectComm((PetscObject)dm), "Volume: %g\n", (double)vol));
72*966bd95aSPierre Jolivet PetscCheck(ctx->volume <= 0.0 || PetscAbsReal(ctx->volume - vol) <= tol, PetscObjectComm((PetscObject)dm), PETSC_ERR_PLIB, "Calculated volume %g != %g actual volume (error %g > %g tol)", (double)vol, (double)ctx->volume, (double)PetscAbsReal(ctx->volume - vol), (double)tol);
733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
748b438e21SMatthew G. Knepley }
758b438e21SMatthew G. Knepley
main(int argc,char ** argv)76d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
77d71ae5a4SJacob Faibussowitsch {
7839290ff6SMatthew G. Knepley DM dm;
798b438e21SMatthew G. Knepley AppCtx user;
808b438e21SMatthew G. Knepley
81327415f7SBarry Smith PetscFunctionBeginUser;
829566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help));
839566063dSJacob Faibussowitsch PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user));
849566063dSJacob Faibussowitsch PetscCall(CreateMesh(PETSC_COMM_WORLD, &user, &dm));
859566063dSJacob Faibussowitsch PetscCall(CreateDiscretization(dm, &user));
869566063dSJacob Faibussowitsch PetscCall(CheckVolume(dm, &user));
879566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dm));
889566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
89b122ec5aSJacob Faibussowitsch return 0;
908b438e21SMatthew G. Knepley }
918b438e21SMatthew G. Knepley
928b438e21SMatthew G. Knepley /*TEST
938b438e21SMatthew G. Knepley
9430602db0SMatthew G. Knepley testset:
95ae2d839dSMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_box_faces 1,1 -dm_plex_box_lower -1.,-1. -dm_plex_box_upper 1.,1. -volume 4.
9630602db0SMatthew G. Knepley
978b438e21SMatthew G. Knepley test:
988b438e21SMatthew G. Knepley suffix: square_0
9930602db0SMatthew G. Knepley args: -dm_coord_petscspace_degree 1
1008b438e21SMatthew G. Knepley
1018b438e21SMatthew G. Knepley test:
1028b438e21SMatthew G. Knepley suffix: square_1
10330602db0SMatthew G. Knepley args: -dm_coord_petscspace_degree 2
1048b438e21SMatthew G. Knepley
1058b438e21SMatthew G. Knepley test:
1068b438e21SMatthew G. Knepley suffix: square_2
10730602db0SMatthew G. Knepley args: -dm_refine 1 -dm_coord_petscspace_degree 1
1088b438e21SMatthew G. Knepley
1098b438e21SMatthew G. Knepley test:
1108b438e21SMatthew G. Knepley suffix: square_3
11130602db0SMatthew G. Knepley args: -dm_refine 1 -dm_coord_petscspace_degree 2
11230602db0SMatthew G. Knepley
11330602db0SMatthew G. Knepley testset:
114ae2d839dSMatthew G. Knepley args: -dm_plex_dim 3 -dm_plex_simplex 0 -dm_plex_box_faces 1,1,1 -dm_plex_box_lower -1.,-1.,-1. -dm_plex_box_upper 1.,1.,1. -volume 8.
1158b438e21SMatthew G. Knepley
1168b438e21SMatthew G. Knepley test:
1178b438e21SMatthew G. Knepley suffix: cube_0
11830602db0SMatthew G. Knepley args: -dm_coord_petscspace_degree 1
1198b438e21SMatthew G. Knepley
1208b438e21SMatthew G. Knepley test:
1218b438e21SMatthew G. Knepley suffix: cube_1
12230602db0SMatthew G. Knepley args: -dm_coord_petscspace_degree 2
1238b438e21SMatthew G. Knepley
1248b438e21SMatthew G. Knepley test:
1258b438e21SMatthew G. Knepley suffix: cube_2
12630602db0SMatthew G. Knepley args: -dm_refine 1 -dm_coord_petscspace_degree 1
1278b438e21SMatthew G. Knepley
1288b438e21SMatthew G. Knepley test:
1298b438e21SMatthew G. Knepley suffix: cube_3
13030602db0SMatthew G. Knepley args: -dm_refine 1 -dm_coord_petscspace_degree 2
13130602db0SMatthew G. Knepley
13230602db0SMatthew G. Knepley testset:
133ae2d839dSMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_box_faces 1,1 -dm_plex_box_lower -1.,-1. -dm_plex_box_upper 1.,1. \
134ae2d839dSMatthew G. Knepley -volume 4. -dm_coord_remap -dm_coord_map shear -dm_coord_map_params 0.0,0.0,3.0
1358b438e21SMatthew G. Knepley
1368b438e21SMatthew G. Knepley test:
1378b438e21SMatthew G. Knepley suffix: shear_0
138ae2d839dSMatthew G. Knepley args: -dm_coord_petscspace_degree 1
1398b438e21SMatthew G. Knepley
1408b438e21SMatthew G. Knepley test:
1418b438e21SMatthew G. Knepley suffix: shear_1
142ae2d839dSMatthew G. Knepley args: -dm_coord_petscspace_degree 2
1438b438e21SMatthew G. Knepley
1448b438e21SMatthew G. Knepley test:
1458b438e21SMatthew G. Knepley suffix: shear_2
146ae2d839dSMatthew G. Knepley args: -dm_refine 1 -dm_coord_petscspace_degree 1
1478b438e21SMatthew G. Knepley
1488b438e21SMatthew G. Knepley test:
1498b438e21SMatthew G. Knepley suffix: shear_3
150ae2d839dSMatthew G. Knepley args: -dm_refine 1 -dm_coord_petscspace_degree 2
15130602db0SMatthew G. Knepley
15230602db0SMatthew G. Knepley testset:
153ae2d839dSMatthew G. Knepley args: -dm_plex_dim 3 -dm_plex_simplex 0 -dm_plex_box_faces 1,1,1 -dm_plex_box_lower -1.,-1.,-1. -dm_plex_box_upper 1.,1.,1. \
154ae2d839dSMatthew G. Knepley -volume 8. -dm_coord_remap -dm_coord_map shear -dm_coord_map_params 0.0,0.0,3.0,4.0
1558b438e21SMatthew G. Knepley
1568b438e21SMatthew G. Knepley test:
1578b438e21SMatthew G. Knepley suffix: shear_4
158ae2d839dSMatthew G. Knepley args: -dm_coord_petscspace_degree 1
1598b438e21SMatthew G. Knepley
1608b438e21SMatthew G. Knepley test:
1618b438e21SMatthew G. Knepley suffix: shear_5
162ae2d839dSMatthew G. Knepley args: -dm_coord_petscspace_degree 2
1638b438e21SMatthew G. Knepley
1648b438e21SMatthew G. Knepley test:
1658b438e21SMatthew G. Knepley suffix: shear_6
166ae2d839dSMatthew G. Knepley args: -dm_refine 1 -dm_coord_petscspace_degree 1
1678b438e21SMatthew G. Knepley
1688b438e21SMatthew G. Knepley test:
1698b438e21SMatthew G. Knepley suffix: shear_7
170ae2d839dSMatthew G. Knepley args: -dm_refine 1 -dm_coord_petscspace_degree 2
17130602db0SMatthew G. Knepley
17230602db0SMatthew G. Knepley testset:
173ae2d839dSMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_box_faces 1,1 -dm_plex_box_lower 1.,-1. -dm_plex_box_upper 3.,1. \
174ae2d839dSMatthew G. Knepley -dm_coord_petscspace_degree 1 -volume 8. -dm_coord_remap -dm_coord_map flare
17560c1a66aSMatthew G. Knepley
17660c1a66aSMatthew G. Knepley test:
17760c1a66aSMatthew G. Knepley suffix: flare_0
17860c1a66aSMatthew G. Knepley args:
17960c1a66aSMatthew G. Knepley
18060c1a66aSMatthew G. Knepley test:
18160c1a66aSMatthew G. Knepley suffix: flare_1
18260c1a66aSMatthew G. Knepley args: -dm_refine 2
18360c1a66aSMatthew G. Knepley
18460c1a66aSMatthew G. Knepley testset:
18530602db0SMatthew G. Knepley # Area: 3/4 \pi = 2.3562
186ae2d839dSMatthew G. Knepley args: -dm_plex_simplex 0 -dm_plex_box_faces 1,1 -petscfe_default_quadrature_order 2 \
187ae2d839dSMatthew G. Knepley -volume 2.35619449019235 -dm_coord_remap -dm_coord_map annulus
1888b438e21SMatthew G. Knepley
1898b438e21SMatthew G. Knepley test:
1908b438e21SMatthew G. Knepley # Area: (a+b)/2 h = 3/\sqrt{2} (sqrt{2} - 1/\sqrt{2}) = 3/2
1918b438e21SMatthew G. Knepley suffix: annulus_0
1928b438e21SMatthew G. Knepley requires: double
19330602db0SMatthew G. Knepley args: -dm_coord_petscspace_degree 1 -volume 1.5
1948b438e21SMatthew G. Knepley
1958b438e21SMatthew G. Knepley test:
1968b438e21SMatthew G. Knepley suffix: annulus_1
1978b438e21SMatthew G. Knepley requires: double
19830602db0SMatthew G. Knepley args: -dm_refine 3 -dm_coord_petscspace_degree 1 -tol .016
1998b438e21SMatthew G. Knepley
2008b438e21SMatthew G. Knepley test:
2018b438e21SMatthew G. Knepley suffix: annulus_2
2028b438e21SMatthew G. Knepley requires: double
20330602db0SMatthew G. Knepley args: -dm_refine 3 -dm_coord_petscspace_degree 2 -tol .0038
2048b438e21SMatthew G. Knepley
2058b438e21SMatthew G. Knepley test:
2068b438e21SMatthew G. Knepley suffix: annulus_3
2078b438e21SMatthew G. Knepley requires: double
20830602db0SMatthew G. Knepley args: -dm_refine 3 -dm_coord_petscspace_degree 3 -tol 2.2e-6
2098b438e21SMatthew G. Knepley
2108b438e21SMatthew G. Knepley test:
2118b438e21SMatthew G. Knepley suffix: annulus_4
2128b438e21SMatthew G. Knepley requires: double
213ae2d839dSMatthew G. Knepley args: -dm_refine 2 -dm_coord_petscspace_degree 2 -tol .00012
2148b438e21SMatthew G. Knepley
2158b438e21SMatthew G. Knepley test:
2168b438e21SMatthew G. Knepley suffix: annulus_5
2178b438e21SMatthew G. Knepley requires: double
21830602db0SMatthew G. Knepley args: -dm_refine 2 -dm_coord_petscspace_degree 3 -petscfe_default_quadrature_order 3 -tol 1.2e-7
21930602db0SMatthew G. Knepley
22030602db0SMatthew G. Knepley testset:
22130602db0SMatthew G. Knepley # Volume: 4/3 \pi (8 - 1)/2 = 14/3 \pi = 14.66076571675238
222ae2d839dSMatthew G. Knepley args: -dm_plex_dim 3 -dm_plex_simplex 0 -dm_plex_box_faces 1,1,1 -dm_plex_box_lower -1.,-1.,-1. -dm_plex_box_upper 1.,1.,1. \
223ae2d839dSMatthew G. Knepley -volume 14.66076571675238 -dm_coord_remap -dm_coord_map shell
2248b438e21SMatthew G. Knepley
2258b438e21SMatthew G. Knepley test:
2268b438e21SMatthew G. Knepley suffix: shell_0
2278b438e21SMatthew G. Knepley requires: double
22830602db0SMatthew G. Knepley args: -dm_refine 1 -dm_coord_petscspace_degree 1 -petscfe_default_quadrature_order 1 -volume 5.633164922 -tol 1.0e-7
2298b438e21SMatthew G. Knepley
2308b438e21SMatthew G. Knepley test:
2318b438e21SMatthew G. Knepley suffix: shell_1
2328b438e21SMatthew G. Knepley requires: double
23330602db0SMatthew G. Knepley args: -dm_refine 2 -dm_coord_petscspace_degree 1 -petscfe_default_quadrature_order 1 -tol 3.1
2348b438e21SMatthew G. Knepley
2358b438e21SMatthew G. Knepley test:
2368b438e21SMatthew G. Knepley suffix: shell_2
2378b438e21SMatthew G. Knepley requires: double
23830602db0SMatthew G. Knepley args: -dm_refine 2 -dm_coord_petscspace_degree 2 -petscfe_default_quadrature_order 2 -tol .1
2398b438e21SMatthew G. Knepley
2408b438e21SMatthew G. Knepley test:
2418b438e21SMatthew G. Knepley suffix: shell_3
2428b438e21SMatthew G. Knepley requires: double
24330602db0SMatthew G. Knepley args: -dm_refine 2 -dm_coord_petscspace_degree 3 -petscfe_default_quadrature_order 3 -tol .02
2448b438e21SMatthew G. Knepley
2458b438e21SMatthew G. Knepley test:
2468b438e21SMatthew G. Knepley suffix: shell_4
2478b438e21SMatthew G. Knepley requires: double
24830602db0SMatthew G. Knepley args: -dm_refine 2 -dm_coord_petscspace_degree 4 -petscfe_default_quadrature_order 4 -tol .006
24939290ff6SMatthew G. Knepley
25039290ff6SMatthew G. Knepley test:
25139290ff6SMatthew G. Knepley # Volume: 1.0
25239290ff6SMatthew G. Knepley suffix: gmsh_q2
25339290ff6SMatthew G. Knepley requires: double
254ae2d839dSMatthew G. Knepley args: -dm_plex_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/quads-q2.msh -dm_plex_gmsh_project -volume 1.0 -tol 1e-6
25539290ff6SMatthew G. Knepley
25639290ff6SMatthew G. Knepley test:
25739290ff6SMatthew G. Knepley # Volume: 1.0
25839290ff6SMatthew G. Knepley suffix: gmsh_q3
25939290ff6SMatthew G. Knepley requires: double
26024b9a4b1SJed Brown nsize: {{1 2}}
261ae2d839dSMatthew G. Knepley args: -dm_plex_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/quads-q3.msh -dm_plex_gmsh_project -volume 1.0 -tol 1e-6
2628b438e21SMatthew G. Knepley
263396e07e5SMatthew G. Knepley test:
264396e07e5SMatthew G. Knepley # Volume: 1.0
265396e07e5SMatthew G. Knepley suffix: gmsh_3d_q2
266396e07e5SMatthew G. Knepley requires: double
267ae2d839dSMatthew G. Knepley args: -dm_plex_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/cube_q2.msh -dm_plex_gmsh_project -volume 1.0 -tol 1e-6
268396e07e5SMatthew G. Knepley
269396e07e5SMatthew G. Knepley test:
270396e07e5SMatthew G. Knepley # Volume: 1.0
271396e07e5SMatthew G. Knepley suffix: gmsh_3d_q3
272396e07e5SMatthew G. Knepley requires: double
273396e07e5SMatthew G. Knepley nsize: {{1 2}}
274ae2d839dSMatthew G. Knepley args: -dm_plex_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/cube_q3.msh -dm_plex_gmsh_project -volume 1.0 -tol 1e-6
275396e07e5SMatthew G. Knepley
2768b438e21SMatthew G. Knepley TEST*/
277