xref: /petsc/src/dm/impls/plex/tests/ex33.c (revision ae2d839d87bb0e558a84780ab7d6a9c39f9bf259)
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 
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 
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 
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 
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));
50*ae2d839dSMatthew 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 
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));
728b438e21SMatthew G. Knepley   if (ctx->volume > 0.0 && PetscAbsReal(ctx->volume - vol) > tol) {
7398921bdaSJacob Faibussowitsch     SETERRQ(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);
748b438e21SMatthew G. Knepley   }
753ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
768b438e21SMatthew G. Knepley }
778b438e21SMatthew G. Knepley 
78d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
79d71ae5a4SJacob Faibussowitsch {
8039290ff6SMatthew G. Knepley   DM     dm;
818b438e21SMatthew G. Knepley   AppCtx user;
828b438e21SMatthew G. Knepley 
83327415f7SBarry Smith   PetscFunctionBeginUser;
849566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
859566063dSJacob Faibussowitsch   PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user));
869566063dSJacob Faibussowitsch   PetscCall(CreateMesh(PETSC_COMM_WORLD, &user, &dm));
879566063dSJacob Faibussowitsch   PetscCall(CreateDiscretization(dm, &user));
889566063dSJacob Faibussowitsch   PetscCall(CheckVolume(dm, &user));
899566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dm));
909566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
91b122ec5aSJacob Faibussowitsch   return 0;
928b438e21SMatthew G. Knepley }
938b438e21SMatthew G. Knepley 
948b438e21SMatthew G. Knepley /*TEST
958b438e21SMatthew G. Knepley 
9630602db0SMatthew G. Knepley   testset:
97*ae2d839dSMatthew 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.
9830602db0SMatthew G. Knepley 
998b438e21SMatthew G. Knepley     test:
1008b438e21SMatthew G. Knepley       suffix: square_0
10130602db0SMatthew G. Knepley       args: -dm_coord_petscspace_degree 1
1028b438e21SMatthew G. Knepley 
1038b438e21SMatthew G. Knepley     test:
1048b438e21SMatthew G. Knepley       suffix: square_1
10530602db0SMatthew G. Knepley       args: -dm_coord_petscspace_degree 2
1068b438e21SMatthew G. Knepley 
1078b438e21SMatthew G. Knepley     test:
1088b438e21SMatthew G. Knepley       suffix: square_2
10930602db0SMatthew G. Knepley       args: -dm_refine 1 -dm_coord_petscspace_degree 1
1108b438e21SMatthew G. Knepley 
1118b438e21SMatthew G. Knepley     test:
1128b438e21SMatthew G. Knepley       suffix: square_3
11330602db0SMatthew G. Knepley       args: -dm_refine 1 -dm_coord_petscspace_degree 2
11430602db0SMatthew G. Knepley 
11530602db0SMatthew G. Knepley   testset:
116*ae2d839dSMatthew 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.
1178b438e21SMatthew G. Knepley 
1188b438e21SMatthew G. Knepley     test:
1198b438e21SMatthew G. Knepley       suffix: cube_0
12030602db0SMatthew G. Knepley       args: -dm_coord_petscspace_degree 1
1218b438e21SMatthew G. Knepley 
1228b438e21SMatthew G. Knepley     test:
1238b438e21SMatthew G. Knepley       suffix: cube_1
12430602db0SMatthew G. Knepley       args: -dm_coord_petscspace_degree 2
1258b438e21SMatthew G. Knepley 
1268b438e21SMatthew G. Knepley     test:
1278b438e21SMatthew G. Knepley       suffix: cube_2
12830602db0SMatthew G. Knepley       args: -dm_refine 1 -dm_coord_petscspace_degree 1
1298b438e21SMatthew G. Knepley 
1308b438e21SMatthew G. Knepley     test:
1318b438e21SMatthew G. Knepley       suffix: cube_3
13230602db0SMatthew G. Knepley       args: -dm_refine 1 -dm_coord_petscspace_degree 2
13330602db0SMatthew G. Knepley 
13430602db0SMatthew G. Knepley   testset:
135*ae2d839dSMatthew 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. \
136*ae2d839dSMatthew G. Knepley           -volume 4. -dm_coord_remap -dm_coord_map shear -dm_coord_map_params 0.0,0.0,3.0
1378b438e21SMatthew G. Knepley 
1388b438e21SMatthew G. Knepley     test:
1398b438e21SMatthew G. Knepley       suffix: shear_0
140*ae2d839dSMatthew G. Knepley       args: -dm_coord_petscspace_degree 1
1418b438e21SMatthew G. Knepley 
1428b438e21SMatthew G. Knepley     test:
1438b438e21SMatthew G. Knepley       suffix: shear_1
144*ae2d839dSMatthew G. Knepley       args: -dm_coord_petscspace_degree 2
1458b438e21SMatthew G. Knepley 
1468b438e21SMatthew G. Knepley     test:
1478b438e21SMatthew G. Knepley       suffix: shear_2
148*ae2d839dSMatthew G. Knepley       args: -dm_refine 1 -dm_coord_petscspace_degree 1
1498b438e21SMatthew G. Knepley 
1508b438e21SMatthew G. Knepley     test:
1518b438e21SMatthew G. Knepley       suffix: shear_3
152*ae2d839dSMatthew G. Knepley       args: -dm_refine 1 -dm_coord_petscspace_degree 2
15330602db0SMatthew G. Knepley 
15430602db0SMatthew G. Knepley   testset:
155*ae2d839dSMatthew 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. \
156*ae2d839dSMatthew G. Knepley           -volume 8. -dm_coord_remap -dm_coord_map shear -dm_coord_map_params 0.0,0.0,3.0,4.0
1578b438e21SMatthew G. Knepley 
1588b438e21SMatthew G. Knepley     test:
1598b438e21SMatthew G. Knepley       suffix: shear_4
160*ae2d839dSMatthew G. Knepley       args: -dm_coord_petscspace_degree 1
1618b438e21SMatthew G. Knepley 
1628b438e21SMatthew G. Knepley     test:
1638b438e21SMatthew G. Knepley       suffix: shear_5
164*ae2d839dSMatthew G. Knepley       args: -dm_coord_petscspace_degree 2
1658b438e21SMatthew G. Knepley 
1668b438e21SMatthew G. Knepley     test:
1678b438e21SMatthew G. Knepley       suffix: shear_6
168*ae2d839dSMatthew G. Knepley       args: -dm_refine 1 -dm_coord_petscspace_degree 1
1698b438e21SMatthew G. Knepley 
1708b438e21SMatthew G. Knepley     test:
1718b438e21SMatthew G. Knepley       suffix: shear_7
172*ae2d839dSMatthew G. Knepley       args: -dm_refine 1 -dm_coord_petscspace_degree 2
17330602db0SMatthew G. Knepley 
17430602db0SMatthew G. Knepley   testset:
175*ae2d839dSMatthew 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. \
176*ae2d839dSMatthew G. Knepley           -dm_coord_petscspace_degree 1 -volume 8. -dm_coord_remap -dm_coord_map flare
17760c1a66aSMatthew G. Knepley 
17860c1a66aSMatthew G. Knepley     test:
17960c1a66aSMatthew G. Knepley       suffix: flare_0
18060c1a66aSMatthew G. Knepley       args:
18160c1a66aSMatthew G. Knepley 
18260c1a66aSMatthew G. Knepley     test:
18360c1a66aSMatthew G. Knepley       suffix: flare_1
18460c1a66aSMatthew G. Knepley       args: -dm_refine 2
18560c1a66aSMatthew G. Knepley 
18660c1a66aSMatthew G. Knepley   testset:
18730602db0SMatthew G. Knepley     # Area: 3/4 \pi = 2.3562
188*ae2d839dSMatthew G. Knepley     args: -dm_plex_simplex 0 -dm_plex_box_faces 1,1 -petscfe_default_quadrature_order 2 \
189*ae2d839dSMatthew G. Knepley           -volume 2.35619449019235 -dm_coord_remap -dm_coord_map annulus
1908b438e21SMatthew G. Knepley 
1918b438e21SMatthew G. Knepley     test:
1928b438e21SMatthew G. Knepley       # Area: (a+b)/2 h = 3/\sqrt{2} (sqrt{2} - 1/\sqrt{2}) = 3/2
1938b438e21SMatthew G. Knepley       suffix: annulus_0
1948b438e21SMatthew G. Knepley       requires: double
19530602db0SMatthew G. Knepley       args: -dm_coord_petscspace_degree 1 -volume 1.5
1968b438e21SMatthew G. Knepley 
1978b438e21SMatthew G. Knepley     test:
1988b438e21SMatthew G. Knepley       suffix: annulus_1
1998b438e21SMatthew G. Knepley       requires: double
20030602db0SMatthew G. Knepley       args: -dm_refine 3 -dm_coord_petscspace_degree 1 -tol .016
2018b438e21SMatthew G. Knepley 
2028b438e21SMatthew G. Knepley     test:
2038b438e21SMatthew G. Knepley       suffix: annulus_2
2048b438e21SMatthew G. Knepley       requires: double
20530602db0SMatthew G. Knepley       args: -dm_refine 3 -dm_coord_petscspace_degree 2 -tol .0038
2068b438e21SMatthew G. Knepley 
2078b438e21SMatthew G. Knepley     test:
2088b438e21SMatthew G. Knepley       suffix: annulus_3
2098b438e21SMatthew G. Knepley       requires: double
21030602db0SMatthew G. Knepley       args: -dm_refine 3 -dm_coord_petscspace_degree 3 -tol 2.2e-6
2118b438e21SMatthew G. Knepley 
2128b438e21SMatthew G. Knepley     test:
2138b438e21SMatthew G. Knepley       suffix: annulus_4
2148b438e21SMatthew G. Knepley       requires: double
215*ae2d839dSMatthew G. Knepley       args: -dm_refine 2 -dm_coord_petscspace_degree 2 -tol .00012
2168b438e21SMatthew G. Knepley 
2178b438e21SMatthew G. Knepley     test:
2188b438e21SMatthew G. Knepley       suffix: annulus_5
2198b438e21SMatthew G. Knepley       requires: double
22030602db0SMatthew G. Knepley       args: -dm_refine 2 -dm_coord_petscspace_degree 3 -petscfe_default_quadrature_order 3 -tol 1.2e-7
22130602db0SMatthew G. Knepley 
22230602db0SMatthew G. Knepley   testset:
22330602db0SMatthew G. Knepley     # Volume: 4/3 \pi (8 - 1)/2 = 14/3 \pi = 14.66076571675238
224*ae2d839dSMatthew 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. \
225*ae2d839dSMatthew G. Knepley           -volume 14.66076571675238 -dm_coord_remap -dm_coord_map shell
2268b438e21SMatthew G. Knepley 
2278b438e21SMatthew G. Knepley     test:
2288b438e21SMatthew G. Knepley       suffix: shell_0
2298b438e21SMatthew G. Knepley       requires: double
23030602db0SMatthew G. Knepley       args: -dm_refine 1 -dm_coord_petscspace_degree 1 -petscfe_default_quadrature_order 1 -volume 5.633164922 -tol 1.0e-7
2318b438e21SMatthew G. Knepley 
2328b438e21SMatthew G. Knepley     test:
2338b438e21SMatthew G. Knepley       suffix: shell_1
2348b438e21SMatthew G. Knepley       requires: double
23530602db0SMatthew G. Knepley       args: -dm_refine 2 -dm_coord_petscspace_degree 1 -petscfe_default_quadrature_order 1 -tol 3.1
2368b438e21SMatthew G. Knepley 
2378b438e21SMatthew G. Knepley     test:
2388b438e21SMatthew G. Knepley       suffix: shell_2
2398b438e21SMatthew G. Knepley       requires: double
24030602db0SMatthew G. Knepley       args: -dm_refine 2 -dm_coord_petscspace_degree 2 -petscfe_default_quadrature_order 2 -tol .1
2418b438e21SMatthew G. Knepley 
2428b438e21SMatthew G. Knepley     test:
2438b438e21SMatthew G. Knepley       suffix: shell_3
2448b438e21SMatthew G. Knepley       requires: double
24530602db0SMatthew G. Knepley       args: -dm_refine 2 -dm_coord_petscspace_degree 3 -petscfe_default_quadrature_order 3 -tol .02
2468b438e21SMatthew G. Knepley 
2478b438e21SMatthew G. Knepley     test:
2488b438e21SMatthew G. Knepley       suffix: shell_4
2498b438e21SMatthew G. Knepley       requires: double
25030602db0SMatthew G. Knepley       args: -dm_refine 2 -dm_coord_petscspace_degree 4 -petscfe_default_quadrature_order 4 -tol .006
25139290ff6SMatthew G. Knepley 
25239290ff6SMatthew G. Knepley   test:
25339290ff6SMatthew G. Knepley     # Volume: 1.0
25439290ff6SMatthew G. Knepley     suffix: gmsh_q2
25539290ff6SMatthew G. Knepley     requires: double
256*ae2d839dSMatthew 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
25739290ff6SMatthew G. Knepley 
25839290ff6SMatthew G. Knepley   test:
25939290ff6SMatthew G. Knepley     # Volume: 1.0
26039290ff6SMatthew G. Knepley     suffix: gmsh_q3
26139290ff6SMatthew G. Knepley     requires: double
26224b9a4b1SJed Brown     nsize: {{1 2}}
263*ae2d839dSMatthew 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
2648b438e21SMatthew G. Knepley 
265396e07e5SMatthew G. Knepley   test:
266396e07e5SMatthew G. Knepley     # Volume: 1.0
267396e07e5SMatthew G. Knepley     suffix: gmsh_3d_q2
268396e07e5SMatthew G. Knepley     requires: double
269*ae2d839dSMatthew 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
270396e07e5SMatthew G. Knepley 
271396e07e5SMatthew G. Knepley   test:
272396e07e5SMatthew G. Knepley     # Volume: 1.0
273396e07e5SMatthew G. Knepley     suffix: gmsh_3d_q3
274396e07e5SMatthew G. Knepley     requires: double
275396e07e5SMatthew G. Knepley     nsize: {{1 2}}
276*ae2d839dSMatthew 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
277396e07e5SMatthew G. Knepley 
2788b438e21SMatthew G. Knepley TEST*/
279