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