1 #include <petsc-private/patchimpl.h> /*I "petscdmpatch.h" I*/ 2 #include <petscdmda.h> 3 4 #undef __FUNCT__ 5 #define __FUNCT__ "DMSetFromOptions_Patch" 6 PetscErrorCode DMSetFromOptions_Patch(DM dm) 7 { 8 DM_Patch *mesh = (DM_Patch *) dm->data; 9 PetscInt p; 10 PetscErrorCode ierr; 11 12 PetscFunctionBegin; 13 PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 14 ierr = PetscOptionsHead("DMPatch Options");CHKERRQ(ierr); 15 /* Handle associated vectors */ 16 /* Handle viewing */ 17 ierr = PetscOptionsTail();CHKERRQ(ierr); 18 for(p = 0; p < mesh->numPatches; ++p) { 19 ierr = DMSetFromOptions(mesh->patches[p]);CHKERRQ(ierr); 20 } 21 PetscFunctionReturn(0); 22 } 23 24 /* External function declarations here */ 25 extern PetscErrorCode DMSetUp_Patch(DM dm); 26 extern PetscErrorCode DMView_Patch(DM dm, PetscViewer viewer); 27 extern PetscErrorCode DMCreateGlobalVector_Patch(DM dm, Vec *g); 28 extern PetscErrorCode DMCreateLocalVector_Patch(DM dm, Vec *l); 29 extern PetscErrorCode DMDestroy_Patch(DM dm); 30 extern PetscErrorCode DMCreateSubDM_Patch(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm); 31 32 #undef __FUNCT__ 33 #define __FUNCT__ "DMInitialize_Patch" 34 PetscErrorCode DMInitialize_Patch(DM dm) 35 { 36 PetscErrorCode ierr; 37 38 PetscFunctionBegin; 39 ierr = PetscStrallocpy(VECSTANDARD, &dm->vectype);CHKERRQ(ierr); 40 dm->ops->view = DMView_Patch; 41 dm->ops->setfromoptions = DMSetFromOptions_Patch; 42 dm->ops->setup = DMSetUp_Patch; 43 dm->ops->createglobalvector = DMCreateGlobalVector_Patch; 44 dm->ops->createlocalvector = DMCreateLocalVector_Patch; 45 dm->ops->createlocaltoglobalmapping = PETSC_NULL; 46 dm->ops->createlocaltoglobalmappingblock = PETSC_NULL; 47 dm->ops->createfieldis = PETSC_NULL; 48 dm->ops->getcoloring = 0; 49 dm->ops->creatematrix = 0; 50 dm->ops->createinterpolation= 0; 51 dm->ops->getaggregates = 0; 52 dm->ops->getinjection = 0; 53 dm->ops->refine = 0; 54 dm->ops->coarsen = 0; 55 dm->ops->refinehierarchy = 0; 56 dm->ops->coarsenhierarchy = 0; 57 dm->ops->globaltolocalbegin = PETSC_NULL; 58 dm->ops->globaltolocalend = PETSC_NULL; 59 dm->ops->localtoglobalbegin = PETSC_NULL; 60 dm->ops->localtoglobalend = PETSC_NULL; 61 dm->ops->destroy = DMDestroy_Patch; 62 dm->ops->createsubdm = DMCreateSubDM_Patch; 63 PetscFunctionReturn(0); 64 } 65 66 EXTERN_C_BEGIN 67 #undef __FUNCT__ 68 #define __FUNCT__ "DMCreate_Patch" 69 PetscErrorCode DMCreate_Patch(DM dm) 70 { 71 DM_Patch *mesh; 72 PetscErrorCode ierr; 73 74 PetscFunctionBegin; 75 PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 76 ierr = PetscNewLog(dm, DM_Patch, &mesh);CHKERRQ(ierr); 77 dm->data = mesh; 78 79 mesh->refct = 1; 80 mesh->numPatches = 0; 81 mesh->patches = PETSC_NULL; 82 mesh->dmCoarse = PETSC_NULL; 83 mesh->activePatch = -1; 84 85 ierr = DMInitialize_Patch(dm);CHKERRQ(ierr); 86 PetscFunctionReturn(0); 87 } 88 EXTERN_C_END 89 90 #undef __FUNCT__ 91 #define __FUNCT__ "DMPatchCreate" 92 /*@ 93 DMPatchCreate - Creates a DMPatch object, which is a collections of DMs called patches. 94 95 Collective on MPI_Comm 96 97 Input Parameter: 98 . comm - The communicator for the DMPatch object 99 100 Output Parameter: 101 . mesh - The DMPatch object 102 103 Level: beginner 104 105 .keywords: DMPatch, create 106 @*/ 107 PetscErrorCode DMPatchCreate(MPI_Comm comm, DM *mesh) 108 { 109 PetscErrorCode ierr; 110 111 PetscFunctionBegin; 112 PetscValidPointer(mesh,2); 113 ierr = DMCreate(comm, mesh);CHKERRQ(ierr); 114 ierr = DMSetType(*mesh, DMPATCH);CHKERRQ(ierr); 115 PetscFunctionReturn(0); 116 } 117 118 #undef __FUNCT__ 119 #define __FUNCT__ "DMPatchCreateGrid" 120 PetscErrorCode DMPatchCreateGrid(MPI_Comm comm, PetscInt dim, MatStencil patchSize, MatStencil gridSize, DM *dm) 121 { 122 DM_Patch *mesh; 123 PetscInt p; 124 PetscErrorCode ierr; 125 126 PetscFunctionBegin; 127 ierr = DMPatchCreate(comm, dm);CHKERRQ(ierr); 128 mesh = (DM_Patch *) (*dm)->data; 129 mesh->dim = dim; 130 if (dim < 2) { 131 gridSize.j = 1; 132 patchSize.j = 1; 133 } 134 if (dim < 3) { 135 gridSize.k = 1; 136 patchSize.k = 1; 137 } 138 mesh->numPatches = gridSize.i*gridSize.j*gridSize.k; 139 ierr = PetscMalloc(mesh->numPatches * sizeof(DM), &mesh->patches);CHKERRQ(ierr); 140 for(p = 0; p < mesh->numPatches; ++p) { 141 /* Patches are overlapping: Right now we do not account for boundaries */ 142 DM da; 143 PetscInt dof = 1, width = 1; 144 145 ierr = DMCreate(comm, &da); 146 ierr = DMSetType(da, DMDA); 147 ierr = DMDASetDim(da, dim);CHKERRQ(ierr); 148 ierr = DMDASetSizes(da, patchSize.i+width*2, patchSize.j+width*2, patchSize.k+width*2);CHKERRQ(ierr); 149 ierr = DMDASetBoundaryType(da, DMDA_BOUNDARY_NONE, DMDA_BOUNDARY_NONE, DMDA_BOUNDARY_NONE);CHKERRQ(ierr); 150 ierr = DMDASetDof(da, dof);CHKERRQ(ierr); 151 ierr = DMDASetStencilType(da, DMDA_STENCIL_BOX);CHKERRQ(ierr); 152 ierr = DMDASetStencilWidth(da, width);CHKERRQ(ierr); 153 mesh->patches[p] = da; 154 } 155 { 156 DM da; 157 PetscInt dof = 1, width = 1; 158 159 ierr = DMCreate(comm, &da); 160 ierr = DMSetType(da, DMDA); 161 ierr = DMDASetDim(da, dim);CHKERRQ(ierr); 162 ierr = DMDASetSizes(da, gridSize.i, gridSize.j, gridSize.k);CHKERRQ(ierr); 163 ierr = DMDASetBoundaryType(da, DMDA_BOUNDARY_NONE, DMDA_BOUNDARY_NONE, DMDA_BOUNDARY_NONE);CHKERRQ(ierr); 164 ierr = DMDASetDof(da, dof);CHKERRQ(ierr); 165 ierr = DMDASetStencilType(da, DMDA_STENCIL_BOX);CHKERRQ(ierr); 166 ierr = DMDASetStencilWidth(da, width);CHKERRQ(ierr); 167 mesh->dmCoarse = da; 168 } 169 PetscFunctionReturn(0); 170 } 171