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