Actual source code: ex40.c

  1: static const char help[] = "Tests for Plex transforms, including regular refinement";

  3: #include <petscdmplex.h>
  4: #include <petscsf.h>

  6: #include <petsc/private/dmpleximpl.h>

  8: static PetscErrorCode LabelPoints(DM dm)
  9: {
 10:   DMLabel   label;
 11:   PetscInt  pStart, pEnd, p;
 12:   PetscBool flg = PETSC_FALSE;

 14:   PetscFunctionBegin;
 15:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-label_mesh", &flg, NULL));
 16:   if (!flg) PetscFunctionReturn(PETSC_SUCCESS);
 17:   PetscCall(DMCreateLabel(dm, "test"));
 18:   PetscCall(DMGetLabel(dm, "test", &label));
 19:   PetscCall(DMPlexGetChart(dm, &pStart, &pEnd));
 20:   for (p = pStart; p < pEnd; ++p) PetscCall(DMLabelSetValue(label, p, p));
 21:   PetscFunctionReturn(PETSC_SUCCESS);
 22: }

 24: static PetscErrorCode CreateMesh(MPI_Comm comm, DM *dm)
 25: {
 26:   PetscFunctionBegin;
 27:   PetscCall(DMCreate(comm, dm));
 28:   PetscCall(DMSetType(*dm, DMPLEX));
 29:   PetscCall(DMSetFromOptions(*dm));
 30:   PetscCall(LabelPoints(*dm));
 31:   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*dm, "post_label_"));
 32:   PetscCall(DMPlexDistributeSetDefault(*dm, PETSC_FALSE));
 33:   PetscCall(DMSetFromOptions(*dm));
 34:   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*dm, NULL));
 35:   PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view"));
 36:   PetscFunctionReturn(PETSC_SUCCESS);
 37: }

 39: int main(int argc, char **argv)
 40: {
 41:   DM dm;

 43:   PetscFunctionBeginUser;
 44:   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
 45:   PetscCall(CreateMesh(PETSC_COMM_WORLD, &dm));
 46:   PetscCall(DMDestroy(&dm));
 47:   PetscCall(PetscFinalize());
 48:   return 0;
 49: }

 51: /*TEST
 52:   test:
 53:     suffix: ref_seg
 54:     args: -dm_plex_reference_cell_domain -dm_plex_cell segment -dm_refine 1 -dm_plex_check_all

 56:   test:
 57:     suffix: ref_tri
 58:     args: -dm_plex_reference_cell_domain -dm_plex_cell triangle -dm_refine 2 -dm_plex_check_all

 60:   test:
 61:     suffix: box_tri
 62:     requires: triangle parmetis
 63:     nsize: {{1 3 5}}
 64:     args: -dm_plex_box_faces 3,3 -dm_refine 2 -dm_plex_check_all -petscpartitioner_type parmetis

 66:   test:
 67:     suffix: ref_quad
 68:     args: -dm_plex_reference_cell_domain -dm_plex_cell quadrilateral -dm_refine 2 -dm_plex_check_all

 70:   test:
 71:     suffix: box_quad
 72:     nsize: {{1 3 5}}
 73:     requires: parmetis
 74:     args: -dm_plex_box_faces 3,3 -dm_plex_simplex 0 -dm_refine 2 -dm_plex_check_all -petscpartitioner_type parmetis

 76:   test:
 77:     suffix: box_quad_label
 78:     args: -dm_plex_box_faces 3,3 -dm_plex_simplex 0 -dm_refine 2 -dm_plex_check_all -dm_plex_transform_label_match_strata {{0 1}separate output} -dm_view

 80:   test:
 81:     suffix: ref_tet
 82:     args: -dm_plex_reference_cell_domain -dm_plex_cell tetrahedron -dm_refine 2 -dm_plex_check_all

 84:   test:
 85:     suffix: box_tet
 86:     requires: ctetgen parmetis
 87:     nsize: {{1 3 5}}
 88:     args: -dm_plex_dim 3 -dm_plex_box_faces 3,3,3 -dm_refine 2 -dm_plex_check_all -petscpartitioner_type parmetis

 90:   test:
 91:     suffix: ref_hex
 92:     args: -dm_plex_reference_cell_domain -dm_plex_cell hexahedron -dm_refine 2 -dm_plex_check_all

 94:   test:
 95:     suffix: box_hex
 96:     requires: parmetis
 97:     nsize: {{1 3 5}}
 98:     args: -dm_plex_dim 3 -dm_plex_box_faces 3,3,3 -dm_plex_simplex 0 -dm_refine 2 -dm_plex_check_all -petscpartitioner_type parmetis

100:   test:
101:     suffix: ref_trip
102:     args: -dm_plex_reference_cell_domain -dm_plex_cell triangular_prism -dm_refine 2 -dm_plex_check_all

104:   test:
105:     suffix: ref_tquad
106:     args: -dm_plex_reference_cell_domain -dm_plex_cell tensor_quad -dm_refine 2 -dm_plex_check_all

108:   test:
109:     suffix: ref_ttrip
110:     args: -dm_plex_reference_cell_domain -dm_plex_cell tensor_triangular_prism -dm_refine 2 -dm_plex_check_all

112:   test:
113:     suffix: ref_tquadp
114:     args: -dm_plex_reference_cell_domain -dm_plex_cell tensor_quadrilateral_prism -dm_refine 2 -dm_plex_check_all

116:   test:
117:     suffix: ref_pyramid
118:     args: -dm_plex_reference_cell_domain -dm_plex_cell pyramid -dm_refine 2 -dm_plex_check_all

120:   testset:
121:     args: -dm_coord_space 0 -dm_plex_transform_type refine_tobox -dm_plex_check_all

123:     test:
124:       suffix: ref_tri_tobox
125:       args: -dm_plex_reference_cell_domain -dm_plex_cell triangle -dm_refine 2

127:     test:
128:       suffix: box_tri_tobox
129:       requires: triangle parmetis
130:       nsize: {{1 3 5}}
131:       args: -dm_plex_box_faces 3,3 -dm_refine 2 -petscpartitioner_type parmetis

133:     test:
134:       suffix: ref_tet_tobox
135:       args: -dm_plex_reference_cell_domain -dm_plex_cell tetrahedron -dm_refine 2

137:     test:
138:       suffix: box_tet_tobox
139:       requires: ctetgen parmetis
140:       nsize: {{1 3 5}}
141:       args: -dm_plex_dim 3 -dm_plex_box_faces 3,3,3 -dm_refine 2 -petscpartitioner_type parmetis

143:     test:
144:       suffix: ref_trip_tobox
145:       args: -dm_plex_reference_cell_domain -dm_plex_cell triangular_prism -dm_refine 2

147:     test:
148:       suffix: ref_ttrip_tobox
149:       args: -dm_plex_reference_cell_domain -dm_plex_cell tensor_triangular_prism -dm_refine 2

151:     test:
152:       suffix: ref_tquadp_tobox
153:       args: -dm_plex_reference_cell_domain -dm_plex_cell tensor_quadrilateral_prism -dm_refine 2

155:   testset:
156:     args: -dm_coord_space 0 -label_mesh -post_label_dm_extrude 2 -post_label_dm_plex_check_all -dm_view ::ascii_info_detail

158:     test:
159:       suffix: extrude_quad
160:       args: -dm_plex_simplex 0

162: TEST*/