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