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