Actual source code: ex32.c
1: static char help[] = "Tests for periodic mesh output\n\n";
3: #include <petscdmplex.h>
5: PetscErrorCode CheckMesh(DM dm)
6: {
7: PetscReal detJ, J[9];
8: PetscReal vol;
9: PetscInt dim, depth, cStart, cEnd, c;
11: PetscFunctionBegin;
12: PetscCall(DMGetDimension(dm, &dim));
13: PetscCall(DMPlexGetDepth(dm, &depth));
14: PetscCall(DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd));
15: for (c = cStart; c < cEnd; ++c) {
16: PetscCall(DMPlexComputeCellGeometryFEM(dm, c, NULL, NULL, J, NULL, &detJ));
17: PetscCheck(detJ > 0.0, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mesh cell %" PetscInt_FMT " is inverted, |J| = %g", c, (double)detJ);
18: if (depth > 1) {
19: PetscCall(DMPlexComputeCellGeometryFVM(dm, c, &vol, NULL, NULL));
20: PetscCheck(vol > 0.0, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Mesh cell %" PetscInt_FMT " is inverted, vol = %g", c, (double)vol);
21: }
22: }
23: PetscFunctionReturn(PETSC_SUCCESS);
24: }
26: PetscErrorCode CreateMesh(MPI_Comm comm, DM *dm)
27: {
28: PetscFunctionBegin;
29: PetscCall(DMCreate(comm, dm));
30: PetscCall(DMSetType(*dm, DMPLEX));
31: PetscCall(DMSetFromOptions(*dm));
32: PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view"));
33: PetscFunctionReturn(PETSC_SUCCESS);
34: }
36: int main(int argc, char **argv)
37: {
38: DM dm;
40: PetscFunctionBeginUser;
41: PetscCall(PetscInitialize(&argc, &argv, NULL, help));
42: PetscCall(CreateMesh(PETSC_COMM_WORLD, &dm));
43: PetscCall(CheckMesh(dm));
44: PetscCall(DMDestroy(&dm));
45: PetscCall(PetscFinalize());
46: return 0;
47: }
49: /*TEST
51: test:
52: suffix: 0
53: args: -dm_plex_simplex 0 -dm_plex_box_faces 3,1,0 -dm_plex_box_bd periodic,none -dm_view ::ascii_info_detail
54: test:
55: suffix: 1
56: nsize: 2
57: args: -dm_plex_simplex 0 -dm_plex_box_faces 3,1,0 -dm_plex_box_bd periodic,none -petscpartitioner_type simple -dm_view ::ascii_info_detail
58: test:
59: suffix: 2
60: nsize: 2
61: args: -dm_plex_simplex 0 -dm_plex_box_faces 6,2,0 -dm_plex_box_bd periodic,none -petscpartitioner_type simple -dm_view ::ascii_info_detail
62: test:
63: suffix: 3
64: nsize: 4
65: args: -dm_plex_simplex 0 -dm_plex_box_faces 6,2,0 -dm_plex_box_bd periodic,none -petscpartitioner_type simple -dm_view ::ascii_info_detail
66: test:
67: suffix: 4
68: nsize: 2
69: args: -dm_plex_simplex 0 -dm_plex_box_faces 3,1,0 -dm_plex_box_bd periodic,none -dm_plex_periodic_cut -petscpartitioner_type simple -dm_view ::ascii_info_detail
70: test:
71: suffix: 5
72: nsize: 2
73: args: -dm_plex_simplex 0 -dm_plex_box_faces 6,2,0 -dm_plex_box_bd periodic,none -dm_plex_periodic_cut -petscpartitioner_type simple -dm_view ::ascii_info_detail
74: # This checks that the SF with extra root for periodic cut still checks
75: test:
76: suffix: 5_hdf5
77: requires: hdf5
78: nsize: 2
79: args: -dm_plex_simplex 0 -dm_plex_box_faces 6,2,0 -dm_plex_box_bd periodic,none -dm_plex_periodic_cut -petscpartitioner_type simple -dm_view hdf5:mesh.h5
80: test:
81: suffix: 6
82: nsize: 4
83: args: -dm_plex_simplex 0 -dm_plex_box_faces 6,2,0 -dm_plex_box_bd periodic,none -dm_plex_periodic_cut -petscpartitioner_type simple -dm_view ::ascii_info_detail
85: TEST*/