xref: /petsc/src/dm/impls/patch/patchcreate.c (revision 66976f2f44dcc61d86a452a70219fb23b45d00f0)
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