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