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