1 #include <petsc/private/dmpatchimpl.h> /*I "petscdmpatch.h" I*/ 2 #include <petscdmda.h> 3 4 PetscErrorCode DMSetFromOptions_Patch(DM dm, PetscOptionItems *PetscOptionsObject) { 5 /* DM_Patch *mesh = (DM_Patch*) dm->data; */ 6 7 PetscFunctionBegin; 8 PetscOptionsHeadBegin(PetscOptionsObject, "DMPatch Options"); 9 /* Handle associated vectors */ 10 /* Handle viewing */ 11 PetscOptionsHeadEnd(); 12 PetscFunctionReturn(0); 13 } 14 15 /* External function declarations here */ 16 extern PetscErrorCode DMSetUp_Patch(DM dm); 17 extern PetscErrorCode DMView_Patch(DM dm, PetscViewer viewer); 18 extern PetscErrorCode DMCreateGlobalVector_Patch(DM dm, Vec *g); 19 extern PetscErrorCode DMCreateLocalVector_Patch(DM dm, Vec *l); 20 extern PetscErrorCode DMDestroy_Patch(DM dm); 21 extern PetscErrorCode DMCreateSubDM_Patch(DM dm, PetscInt numFields, const PetscInt fields[], IS *is, DM *subdm); 22 23 PetscErrorCode DMInitialize_Patch(DM dm) { 24 PetscFunctionBegin; 25 dm->ops->view = DMView_Patch; 26 dm->ops->setfromoptions = DMSetFromOptions_Patch; 27 dm->ops->setup = DMSetUp_Patch; 28 dm->ops->createglobalvector = DMCreateGlobalVector_Patch; 29 dm->ops->createlocalvector = DMCreateLocalVector_Patch; 30 dm->ops->getlocaltoglobalmapping = NULL; 31 dm->ops->createfieldis = NULL; 32 dm->ops->getcoloring = NULL; 33 dm->ops->creatematrix = NULL; 34 dm->ops->createinterpolation = NULL; 35 dm->ops->createinjection = NULL; 36 dm->ops->refine = NULL; 37 dm->ops->coarsen = NULL; 38 dm->ops->refinehierarchy = NULL; 39 dm->ops->coarsenhierarchy = NULL; 40 dm->ops->globaltolocalbegin = NULL; 41 dm->ops->globaltolocalend = NULL; 42 dm->ops->localtoglobalbegin = NULL; 43 dm->ops->localtoglobalend = NULL; 44 dm->ops->destroy = DMDestroy_Patch; 45 dm->ops->createsubdm = DMCreateSubDM_Patch; 46 PetscFunctionReturn(0); 47 } 48 49 PETSC_EXTERN PetscErrorCode DMCreate_Patch(DM dm) { 50 DM_Patch *mesh; 51 52 PetscFunctionBegin; 53 PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 54 PetscCall(PetscNewLog(dm, &mesh)); 55 dm->data = mesh; 56 57 mesh->refct = 1; 58 mesh->dmCoarse = NULL; 59 mesh->patchSize.i = 0; 60 mesh->patchSize.j = 0; 61 mesh->patchSize.k = 0; 62 mesh->patchSize.c = 0; 63 64 PetscCall(DMInitialize_Patch(dm)); 65 PetscFunctionReturn(0); 66 } 67 68 /*@ 69 DMPatchCreate - Creates a DMPatch object, which is a collections of DMs called patches. 70 71 Collective 72 73 Input Parameter: 74 . comm - The communicator for the DMPatch object 75 76 Output Parameter: 77 . mesh - The DMPatch object 78 79 Notes: 80 81 This code is incomplete and not used by other parts of PETSc. 82 83 Level: beginner 84 85 .seealso: `DMPatchZoom()` 86 87 @*/ 88 PetscErrorCode DMPatchCreate(MPI_Comm comm, DM *mesh) { 89 PetscFunctionBegin; 90 PetscValidPointer(mesh, 2); 91 PetscCall(DMCreate(comm, mesh)); 92 PetscCall(DMSetType(*mesh, DMPATCH)); 93 PetscFunctionReturn(0); 94 } 95 96 PetscErrorCode DMPatchCreateGrid(MPI_Comm comm, PetscInt dim, MatStencil patchSize, MatStencil commSize, MatStencil gridSize, DM *dm) { 97 DM_Patch *mesh; 98 DM da; 99 PetscInt dof = 1, width = 1; 100 101 PetscFunctionBegin; 102 PetscCall(DMPatchCreate(comm, dm)); 103 mesh = (DM_Patch *)(*dm)->data; 104 if (dim < 2) { 105 gridSize.j = 1; 106 patchSize.j = 1; 107 } 108 if (dim < 3) { 109 gridSize.k = 1; 110 patchSize.k = 1; 111 } 112 PetscCall(DMCreate(comm, &da)); 113 PetscCall(DMSetType(da, DMDA)); 114 PetscCall(DMSetDimension(da, dim)); 115 PetscCall(DMDASetSizes(da, gridSize.i, gridSize.j, gridSize.k)); 116 PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE)); 117 PetscCall(DMDASetDof(da, dof)); 118 PetscCall(DMDASetStencilType(da, DMDA_STENCIL_BOX)); 119 PetscCall(DMDASetStencilWidth(da, width)); 120 121 mesh->dmCoarse = da; 122 123 PetscCall(DMPatchSetPatchSize(*dm, patchSize)); 124 PetscCall(DMPatchSetCommSize(*dm, commSize)); 125 PetscFunctionReturn(0); 126 } 127