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