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