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