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