xref: /petsc/src/dm/impls/plex/tests/ex33.c (revision 834855d6effb0d027771461c8e947ee1ce5a1e17)
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