1af0996ceSBarry Smith #include <petsc/private/dmpatchimpl.h> /*I "petscdmpatch.h" I*/ 23a19ef87SMatthew G Knepley #include <petscdmda.h> 33a19ef87SMatthew G Knepley 4*66976f2fSJacob Faibussowitsch static PetscErrorCode DMSetFromOptions_Patch(DM dm, PetscOptionItems *PetscOptionsObject) 5d71ae5a4SJacob Faibussowitsch { 66fbb21edSJed Brown /* DM_Patch *mesh = (DM_Patch*) dm->data; */ 73a19ef87SMatthew G Knepley 83a19ef87SMatthew G Knepley PetscFunctionBegin; 9d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "DMPatch Options"); 103a19ef87SMatthew G Knepley /* Handle associated vectors */ 113a19ef87SMatthew G Knepley /* Handle viewing */ 12d0609cedSBarry Smith PetscOptionsHeadEnd(); 133ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 143a19ef87SMatthew G Knepley } 153a19ef87SMatthew G Knepley 163a19ef87SMatthew G Knepley /* External function declarations here */ 173a19ef87SMatthew G Knepley extern PetscErrorCode DMSetUp_Patch(DM dm); 183a19ef87SMatthew G Knepley extern PetscErrorCode DMView_Patch(DM dm, PetscViewer viewer); 193a19ef87SMatthew G Knepley extern PetscErrorCode DMCreateGlobalVector_Patch(DM dm, Vec *g); 203a19ef87SMatthew G Knepley extern PetscErrorCode DMCreateLocalVector_Patch(DM dm, Vec *l); 213a19ef87SMatthew G Knepley extern PetscErrorCode DMDestroy_Patch(DM dm); 22276c5506SMatthew G. Knepley extern PetscErrorCode DMCreateSubDM_Patch(DM dm, PetscInt numFields, const PetscInt fields[], IS *is, DM *subdm); 233a19ef87SMatthew G Knepley 24*66976f2fSJacob Faibussowitsch static PetscErrorCode DMInitialize_Patch(DM dm) 25d71ae5a4SJacob Faibussowitsch { 263a19ef87SMatthew G Knepley PetscFunctionBegin; 273a19ef87SMatthew G Knepley dm->ops->view = DMView_Patch; 283a19ef87SMatthew G Knepley dm->ops->setfromoptions = DMSetFromOptions_Patch; 293a19ef87SMatthew G Knepley dm->ops->setup = DMSetUp_Patch; 303a19ef87SMatthew G Knepley dm->ops->createglobalvector = DMCreateGlobalVector_Patch; 313a19ef87SMatthew G Knepley dm->ops->createlocalvector = DMCreateLocalVector_Patch; 32184d77edSJed Brown dm->ops->getlocaltoglobalmapping = NULL; 330298fd71SBarry Smith dm->ops->createfieldis = NULL; 34ea78f98cSLisandro Dalcin dm->ops->getcoloring = NULL; 35ea78f98cSLisandro Dalcin dm->ops->creatematrix = NULL; 36ea78f98cSLisandro Dalcin dm->ops->createinterpolation = NULL; 37ea78f98cSLisandro Dalcin dm->ops->createinjection = NULL; 38ea78f98cSLisandro Dalcin dm->ops->refine = NULL; 39ea78f98cSLisandro Dalcin dm->ops->coarsen = NULL; 40ea78f98cSLisandro Dalcin dm->ops->refinehierarchy = NULL; 41ea78f98cSLisandro Dalcin dm->ops->coarsenhierarchy = NULL; 420298fd71SBarry Smith dm->ops->globaltolocalbegin = NULL; 430298fd71SBarry Smith dm->ops->globaltolocalend = NULL; 440298fd71SBarry Smith dm->ops->localtoglobalbegin = NULL; 450298fd71SBarry Smith dm->ops->localtoglobalend = NULL; 463a19ef87SMatthew G Knepley dm->ops->destroy = DMDestroy_Patch; 473a19ef87SMatthew G Knepley dm->ops->createsubdm = DMCreateSubDM_Patch; 483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 493a19ef87SMatthew G Knepley } 503a19ef87SMatthew G Knepley 51d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMCreate_Patch(DM dm) 52d71ae5a4SJacob Faibussowitsch { 533a19ef87SMatthew G Knepley DM_Patch *mesh; 543a19ef87SMatthew G Knepley 553a19ef87SMatthew G Knepley PetscFunctionBegin; 563a19ef87SMatthew G Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 574dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&mesh)); 583a19ef87SMatthew G Knepley dm->data = mesh; 593a19ef87SMatthew G Knepley 603a19ef87SMatthew G Knepley mesh->refct = 1; 610298fd71SBarry Smith mesh->dmCoarse = NULL; 62392fa6c6SMatthew G Knepley mesh->patchSize.i = 0; 63392fa6c6SMatthew G Knepley mesh->patchSize.j = 0; 64392fa6c6SMatthew G Knepley mesh->patchSize.k = 0; 65392fa6c6SMatthew G Knepley mesh->patchSize.c = 0; 663a19ef87SMatthew G Knepley 679566063dSJacob Faibussowitsch PetscCall(DMInitialize_Patch(dm)); 683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 693a19ef87SMatthew G Knepley } 703a19ef87SMatthew G Knepley 713a19ef87SMatthew G Knepley /*@ 723a19ef87SMatthew G Knepley DMPatchCreate - Creates a DMPatch object, which is a collections of DMs called patches. 733a19ef87SMatthew G Knepley 74d083f849SBarry Smith Collective 753a19ef87SMatthew G Knepley 763a19ef87SMatthew G Knepley Input Parameter: 773a19ef87SMatthew G Knepley . comm - The communicator for the DMPatch object 783a19ef87SMatthew G Knepley 793a19ef87SMatthew G Knepley Output Parameter: 803a19ef87SMatthew G Knepley . mesh - The DMPatch object 813a19ef87SMatthew G Knepley 8260c22052SBarry Smith Notes: 8360c22052SBarry Smith 8460c22052SBarry Smith This code is incomplete and not used by other parts of PETSc. 8560c22052SBarry Smith 863a19ef87SMatthew G Knepley Level: beginner 873a19ef87SMatthew G Knepley 88db781477SPatrick Sanan .seealso: `DMPatchZoom()` 8960c22052SBarry Smith 903a19ef87SMatthew G Knepley @*/ 91d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPatchCreate(MPI_Comm comm, DM *mesh) 92d71ae5a4SJacob Faibussowitsch { 933a19ef87SMatthew G Knepley PetscFunctionBegin; 944f572ea9SToby Isaac PetscAssertPointer(mesh, 2); 959566063dSJacob Faibussowitsch PetscCall(DMCreate(comm, mesh)); 969566063dSJacob Faibussowitsch PetscCall(DMSetType(*mesh, DMPATCH)); 973ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 983a19ef87SMatthew G Knepley } 993a19ef87SMatthew G Knepley 100d71ae5a4SJacob Faibussowitsch PetscErrorCode DMPatchCreateGrid(MPI_Comm comm, PetscInt dim, MatStencil patchSize, MatStencil commSize, MatStencil gridSize, DM *dm) 101d71ae5a4SJacob Faibussowitsch { 1023a19ef87SMatthew G Knepley DM_Patch *mesh; 103392fa6c6SMatthew G Knepley DM da; 104392fa6c6SMatthew G Knepley PetscInt dof = 1, width = 1; 1053a19ef87SMatthew G Knepley 1063a19ef87SMatthew G Knepley PetscFunctionBegin; 1079566063dSJacob Faibussowitsch PetscCall(DMPatchCreate(comm, dm)); 1083a19ef87SMatthew G Knepley mesh = (DM_Patch *)(*dm)->data; 1093a19ef87SMatthew G Knepley if (dim < 2) { 1103a19ef87SMatthew G Knepley gridSize.j = 1; 1113a19ef87SMatthew G Knepley patchSize.j = 1; 1123a19ef87SMatthew G Knepley } 1133a19ef87SMatthew G Knepley if (dim < 3) { 1143a19ef87SMatthew G Knepley gridSize.k = 1; 1153a19ef87SMatthew G Knepley patchSize.k = 1; 1163a19ef87SMatthew G Knepley } 1179566063dSJacob Faibussowitsch PetscCall(DMCreate(comm, &da)); 1189566063dSJacob Faibussowitsch PetscCall(DMSetType(da, DMDA)); 1199566063dSJacob Faibussowitsch PetscCall(DMSetDimension(da, dim)); 1209566063dSJacob Faibussowitsch PetscCall(DMDASetSizes(da, gridSize.i, gridSize.j, gridSize.k)); 1219566063dSJacob Faibussowitsch PetscCall(DMDASetBoundaryType(da, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE)); 1229566063dSJacob Faibussowitsch PetscCall(DMDASetDof(da, dof)); 1239566063dSJacob Faibussowitsch PetscCall(DMDASetStencilType(da, DMDA_STENCIL_BOX)); 1249566063dSJacob Faibussowitsch PetscCall(DMDASetStencilWidth(da, width)); 1258865f1eaSKarl Rupp 1263a19ef87SMatthew G Knepley mesh->dmCoarse = da; 1278865f1eaSKarl Rupp 1289566063dSJacob Faibussowitsch PetscCall(DMPatchSetPatchSize(*dm, patchSize)); 1299566063dSJacob Faibussowitsch PetscCall(DMPatchSetCommSize(*dm, commSize)); 1303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1313a19ef87SMatthew G Knepley } 132