15754ecacSJeremy L Thompson /// @file 25754ecacSJeremy L Thompson /// DM setup for solid mechanics example using PETSc 35754ecacSJeremy L Thompson 45754ecacSJeremy L Thompson #include "../include/boundary.h" 55754ecacSJeremy L Thompson #include "../include/setup-dm.h" 65754ecacSJeremy L Thompson 75754ecacSJeremy L Thompson // ----------------------------------------------------------------------------- 85754ecacSJeremy L Thompson // Setup DM 95754ecacSJeremy L Thompson // ----------------------------------------------------------------------------- 105754ecacSJeremy L Thompson PetscErrorCode CreateBCLabel(DM dm, const char name[]) { 115754ecacSJeremy L Thompson PetscErrorCode ierr; 125754ecacSJeremy L Thompson DMLabel label; 135754ecacSJeremy L Thompson 145754ecacSJeremy L Thompson PetscFunctionBeginUser; 155754ecacSJeremy L Thompson 165754ecacSJeremy L Thompson ierr = DMCreateLabel(dm, name); CHKERRQ(ierr); 175754ecacSJeremy L Thompson ierr = DMGetLabel(dm, name, &label); CHKERRQ(ierr); 185754ecacSJeremy L Thompson ierr = DMPlexMarkBoundaryFaces(dm, 1, label); CHKERRQ(ierr); 195754ecacSJeremy L Thompson ierr = DMPlexLabelComplete(dm, label); CHKERRQ(ierr); 205754ecacSJeremy L Thompson 215754ecacSJeremy L Thompson PetscFunctionReturn(0); 225754ecacSJeremy L Thompson }; 235754ecacSJeremy L Thompson 245754ecacSJeremy L Thompson // Read mesh and distribute DM in parallel 255754ecacSJeremy L Thompson PetscErrorCode CreateDistributedDM(MPI_Comm comm, AppCtx app_ctx, DM *dm) { 265754ecacSJeremy L Thompson PetscErrorCode ierr; 275754ecacSJeremy L Thompson const char *filename = app_ctx->mesh_file; 285754ecacSJeremy L Thompson PetscBool interpolate = PETSC_TRUE; 295754ecacSJeremy L Thompson DM distributed_mesh = NULL; 305754ecacSJeremy L Thompson PetscPartitioner part; 315754ecacSJeremy L Thompson 325754ecacSJeremy L Thompson PetscFunctionBeginUser; 335754ecacSJeremy L Thompson 345754ecacSJeremy L Thompson if (!*filename) { 355754ecacSJeremy L Thompson PetscInt dim = 3, faces[3] = {3, 3, 3}; 365754ecacSJeremy L Thompson ierr = PetscOptionsGetIntArray(NULL, NULL, "-dm_plex_box_faces", 375754ecacSJeremy L Thompson faces, &dim, NULL); CHKERRQ(ierr); 3820e46440SLeila Ghaffari if (!dim) dim = 3; 395754ecacSJeremy L Thompson ierr = DMPlexCreateBoxMesh(comm, dim, PETSC_FALSE, faces, NULL, 405754ecacSJeremy L Thompson NULL, NULL, interpolate, dm); CHKERRQ(ierr); 415754ecacSJeremy L Thompson } else { 427ed3e4cdSJeremy L Thompson ierr = DMPlexCreateFromFile(comm, filename, NULL, interpolate, dm); 437ed3e4cdSJeremy L Thompson CHKERRQ(ierr); 445754ecacSJeremy L Thompson } 455754ecacSJeremy L Thompson 465754ecacSJeremy L Thompson // Distribute DM in parallel 475754ecacSJeremy L Thompson ierr = DMPlexGetPartitioner(*dm, &part); CHKERRQ(ierr); 485754ecacSJeremy L Thompson ierr = PetscPartitionerSetFromOptions(part); CHKERRQ(ierr); 495754ecacSJeremy L Thompson ierr = DMPlexDistribute(*dm, 0, NULL, &distributed_mesh); CHKERRQ(ierr); 505754ecacSJeremy L Thompson if (distributed_mesh) { 515754ecacSJeremy L Thompson ierr = DMDestroy(dm); CHKERRQ(ierr); 525754ecacSJeremy L Thompson *dm = distributed_mesh; 535754ecacSJeremy L Thompson } 545754ecacSJeremy L Thompson ierr = DMViewFromOptions(*dm, NULL, "-dm_view"); CHKERRQ(ierr); 555754ecacSJeremy L Thompson 565754ecacSJeremy L Thompson PetscFunctionReturn(0); 575754ecacSJeremy L Thompson }; 585754ecacSJeremy L Thompson 595754ecacSJeremy L Thompson // Setup DM with FE space of appropriate degree 605754ecacSJeremy L Thompson PetscErrorCode SetupDMByDegree(DM dm, AppCtx app_ctx, PetscInt order, 615754ecacSJeremy L Thompson PetscBool boundary, PetscInt num_comp_u) { 625754ecacSJeremy L Thompson PetscErrorCode ierr; 6365233696SJeremy L Thompson MPI_Comm comm; 645754ecacSJeremy L Thompson PetscInt dim; 655754ecacSJeremy L Thompson PetscFE fe; 665754ecacSJeremy L Thompson IS face_set_is; // Index Set for Face Sets 675754ecacSJeremy L Thompson const char *name = "Face Sets"; // PETSc internal requirement 685754ecacSJeremy L Thompson PetscInt num_face_sets; // Number of FaceSets in face_set_is 695754ecacSJeremy L Thompson const PetscInt *face_set_ids; // id of each FaceSet 705754ecacSJeremy L Thompson 715754ecacSJeremy L Thompson PetscFunctionBeginUser; 725754ecacSJeremy L Thompson 735754ecacSJeremy L Thompson // Setup DM 745754ecacSJeremy L Thompson ierr = DMGetDimension(dm, &dim); CHKERRQ(ierr); 7565233696SJeremy L Thompson ierr = PetscObjectGetComm((PetscObject)dm, &comm); CHKERRQ(ierr); 7665233696SJeremy L Thompson ierr = PetscFECreateLagrange(comm, dim, num_comp_u, PETSC_FALSE, order, order, 7765233696SJeremy L Thompson &fe); CHKERRQ(ierr); 785754ecacSJeremy L Thompson ierr = DMSetFromOptions(dm); CHKERRQ(ierr); 795754ecacSJeremy L Thompson ierr = DMAddField(dm, NULL, (PetscObject)fe); CHKERRQ(ierr); 805754ecacSJeremy L Thompson ierr = DMCreateDS(dm); CHKERRQ(ierr); 817ed3e4cdSJeremy L Thompson { 827ed3e4cdSJeremy L Thompson /* create FE field for coordinates */ 837ed3e4cdSJeremy L Thompson PetscFE fe_coords; 847ed3e4cdSJeremy L Thompson PetscInt num_comp_coord; 857ed3e4cdSJeremy L Thompson ierr = DMGetCoordinateDim(dm, &num_comp_coord); CHKERRQ(ierr); 867ed3e4cdSJeremy L Thompson ierr = PetscFECreateLagrange(comm, dim, num_comp_coord, PETSC_FALSE, 1, 1, 877ed3e4cdSJeremy L Thompson &fe_coords); CHKERRQ(ierr); 887ed3e4cdSJeremy L Thompson ierr = DMProjectCoordinates(dm, fe_coords); CHKERRQ(ierr); 897ed3e4cdSJeremy L Thompson ierr = PetscFEDestroy(&fe_coords); CHKERRQ(ierr); 907ed3e4cdSJeremy L Thompson } 915754ecacSJeremy L Thompson 925754ecacSJeremy L Thompson // Add Dirichlet (Essential) boundary 935754ecacSJeremy L Thompson if (boundary) { 945754ecacSJeremy L Thompson if (app_ctx->forcing_choice == FORCE_MMS) { 955754ecacSJeremy L Thompson if (app_ctx->test_mode) { 965754ecacSJeremy L Thompson // -- Test mode - box mesh 975754ecacSJeremy L Thompson PetscBool has_label; 985754ecacSJeremy L Thompson PetscInt marker_ids[1] = {1}; 995754ecacSJeremy L Thompson ierr = DMHasLabel(dm, "marker", &has_label); CHKERRQ(ierr); 1005754ecacSJeremy L Thompson if (!has_label) { 1015754ecacSJeremy L Thompson ierr = CreateBCLabel(dm, "marker"); CHKERRQ(ierr); 1025754ecacSJeremy L Thompson } 1035754ecacSJeremy L Thompson DMLabel label; 1045754ecacSJeremy L Thompson ierr = DMGetLabel(dm, "marker", &label); CHKERRQ(ierr); 105*b8962995SJeremy L Thompson ierr = DMAddBoundary(dm, DM_BC_ESSENTIAL, "mms", label, 1, marker_ids, 1065754ecacSJeremy L Thompson 0, 0, NULL, (void(*)(void))BCMMS, NULL, NULL, NULL); 1075754ecacSJeremy L Thompson CHKERRQ(ierr); 1085754ecacSJeremy L Thompson } else { 1095754ecacSJeremy L Thompson // -- ExodusII mesh with MMS 1105754ecacSJeremy L Thompson ierr = DMGetLabelIdIS(dm, name, &face_set_is); CHKERRQ(ierr); 1115754ecacSJeremy L Thompson ierr = ISGetSize(face_set_is,&num_face_sets); CHKERRQ(ierr); 1125754ecacSJeremy L Thompson ierr = ISGetIndices(face_set_is, &face_set_ids); CHKERRQ(ierr); 1135754ecacSJeremy L Thompson DMLabel label; 1145754ecacSJeremy L Thompson ierr = DMGetLabel(dm, "Face Sets", &label); CHKERRQ(ierr); 115*b8962995SJeremy L Thompson ierr = DMAddBoundary(dm, DM_BC_ESSENTIAL, "mms", label, 1165754ecacSJeremy L Thompson num_face_sets, face_set_ids, 0, 0, NULL, 1175754ecacSJeremy L Thompson (void(*)(void))BCMMS, NULL, NULL, NULL); 1185754ecacSJeremy L Thompson CHKERRQ(ierr); 1195754ecacSJeremy L Thompson ierr = ISRestoreIndices(face_set_is, &face_set_ids); CHKERRQ(ierr); 1205754ecacSJeremy L Thompson ierr = ISDestroy(&face_set_is); CHKERRQ(ierr); 1215754ecacSJeremy L Thompson } 1225754ecacSJeremy L Thompson } else { 1237ed3e4cdSJeremy L Thompson // -- Mesh with user specified BCs 1245754ecacSJeremy L Thompson DMLabel label; 1255754ecacSJeremy L Thompson ierr = DMGetLabel(dm, "Face Sets", &label); CHKERRQ(ierr); 1267ed3e4cdSJeremy L Thompson // -- Clamp BCs 1275754ecacSJeremy L Thompson for (PetscInt i = 0; i < app_ctx->bc_clamp_count; i++) { 1285754ecacSJeremy L Thompson char bcName[25]; 1295754ecacSJeremy L Thompson snprintf(bcName, sizeof bcName, "clamp_%d", app_ctx->bc_clamp_faces[i]); 130*b8962995SJeremy L Thompson ierr = DMAddBoundary(dm, DM_BC_ESSENTIAL, bcName, label, 1, 1315754ecacSJeremy L Thompson &app_ctx->bc_clamp_faces[i], 0, 0, 1325754ecacSJeremy L Thompson NULL, (void(*)(void))BCClamp, NULL, 1335754ecacSJeremy L Thompson (void *)&app_ctx->bc_clamp_max[i], NULL); 1345754ecacSJeremy L Thompson CHKERRQ(ierr); 1355754ecacSJeremy L Thompson } 1365754ecacSJeremy L Thompson } 1375754ecacSJeremy L Thompson } 1385754ecacSJeremy L Thompson ierr = DMPlexSetClosurePermutationTensor(dm, PETSC_DETERMINE, NULL); 1395754ecacSJeremy L Thompson CHKERRQ(ierr); 1405754ecacSJeremy L Thompson 1415754ecacSJeremy L Thompson // Cleanup 1425754ecacSJeremy L Thompson ierr = PetscFEDestroy(&fe); CHKERRQ(ierr); 1435754ecacSJeremy L Thompson 1445754ecacSJeremy L Thompson PetscFunctionReturn(0); 1455754ecacSJeremy L Thompson }; 146