xref: /petsc/src/dm/impls/da/dacorn.c (revision dce8aeba1c9b69b19f651c53d8a6b674bd7e9cbd)
147c6ae99SBarry Smith 
247c6ae99SBarry Smith /*
347c6ae99SBarry Smith   Code for manipulating distributed regular arrays in parallel.
447c6ae99SBarry Smith */
547c6ae99SBarry Smith 
6af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h> /*I   "petscdmda.h"   I*/
7f19dbd58SToby Isaac #include <petscdmfield.h>
847c6ae99SBarry Smith 
9d71ae5a4SJacob Faibussowitsch PetscErrorCode DMCreateCoordinateDM_DA(DM dm, DM *cdm)
10d71ae5a4SJacob Faibussowitsch {
113f2d3b52SPeter Brune   PetscFunctionBegin;
129566063dSJacob Faibussowitsch   PetscCall(DMDACreateCompatibleDMDA(dm, dm->dim, cdm));
1347c6ae99SBarry Smith   PetscFunctionReturn(0);
1447c6ae99SBarry Smith }
1547c6ae99SBarry Smith 
16d71ae5a4SJacob Faibussowitsch PetscErrorCode DMCreateCoordinateField_DA(DM dm, DMField *field)
17d71ae5a4SJacob Faibussowitsch {
18f19dbd58SToby Isaac   PetscReal   gmin[3], gmax[3];
194d1a973fSToby Isaac   PetscScalar corners[24];
20f19dbd58SToby Isaac   PetscInt    dim;
21f19dbd58SToby Isaac   PetscInt    i, j;
22f19dbd58SToby Isaac   DM          cdm;
23f19dbd58SToby Isaac 
24f19dbd58SToby Isaac   PetscFunctionBegin;
259566063dSJacob Faibussowitsch   PetscCall(DMGetDimension(dm, &dim));
26f19dbd58SToby Isaac   /* TODO: this is wrong if coordinates are not rectilinear */
279566063dSJacob Faibussowitsch   PetscCall(DMGetBoundingBox(dm, gmin, gmax));
28f19dbd58SToby Isaac   for (i = 0; i < (1 << dim); i++) {
29ad540459SPierre Jolivet     for (j = 0; j < dim; j++) corners[i * dim + j] = (i & (1 << j)) ? gmax[j] : gmin[j];
30f19dbd58SToby Isaac   }
319566063dSJacob Faibussowitsch   PetscCall(DMClone(dm, &cdm));
329566063dSJacob Faibussowitsch   PetscCall(DMFieldCreateDA(cdm, dim, corners, field));
339566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&cdm));
34f19dbd58SToby Isaac   PetscFunctionReturn(0);
35f19dbd58SToby Isaac }
36f19dbd58SToby Isaac 
3747c6ae99SBarry Smith /*@C
38aa219208SBarry Smith    DMDASetFieldName - Sets the names of individual field components in multicomponent
39*dce8aebaSBarry Smith    vectors associated with a `DMDA`.
4047c6ae99SBarry Smith 
41b1dd8793SDave May    Logically collective; name must contain a common value
4247c6ae99SBarry Smith 
4347c6ae99SBarry Smith    Input Parameters:
4447c6ae99SBarry Smith +  da - the distributed array
45*dce8aebaSBarry Smith .  nf - field number for the `DMDA` (0, 1, ... dof-1), where dof indicates the
46*dce8aebaSBarry Smith         number of degrees of freedom per node within the `DMDA`
4747c6ae99SBarry Smith -  names - the name of the field (component)
4847c6ae99SBarry Smith 
4947c6ae99SBarry Smith   Level: intermediate
5047c6ae99SBarry Smith 
51*dce8aebaSBarry Smith   Note:
52*dce8aebaSBarry Smith     It must be called after having called `DMSetUp()`.
53*dce8aebaSBarry Smith 
54*dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMDAGetFieldName()`, `DMDASetCoordinateName()`, `DMDAGetCoordinateName()`, `DMDASetFieldNames()`, `DMSetUp()`
5547c6ae99SBarry Smith @*/
56d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDASetFieldName(DM da, PetscInt nf, const char name[])
57d71ae5a4SJacob Faibussowitsch {
5847c6ae99SBarry Smith   DM_DA *dd = (DM_DA *)da->data;
5947c6ae99SBarry Smith 
6047c6ae99SBarry Smith   PetscFunctionBegin;
61a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
621dca8a05SBarry Smith   PetscCheck(nf >= 0 && nf < dd->w, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid field number: %" PetscInt_FMT, nf);
637a8be351SBarry Smith   PetscCheck(dd->fieldname, PetscObjectComm((PetscObject)da), PETSC_ERR_ORDER, "You should call DMSetUp() first");
649566063dSJacob Faibussowitsch   PetscCall(PetscFree(dd->fieldname[nf]));
659566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(name, &dd->fieldname[nf]));
6647c6ae99SBarry Smith   PetscFunctionReturn(0);
6747c6ae99SBarry Smith }
6847c6ae99SBarry Smith 
69c629b14aSBarry Smith /*@C
70*dce8aebaSBarry Smith    DMDAGetFieldNames - Gets the name of each component in the vector associated with the `DMDA`
71c629b14aSBarry Smith 
72b1dd8793SDave May    Not collective; names will contain a common value
73c629b14aSBarry Smith 
74c629b14aSBarry Smith    Input Parameter:
75*dce8aebaSBarry Smith .  dm - the `DMDA` object
76c629b14aSBarry Smith 
77c629b14aSBarry Smith    Output Parameter:
78*dce8aebaSBarry Smith .  names - the names of the components, final string is NULL, will have the same number of entries as the dof used in creating the `DMDA`
79c629b14aSBarry Smith 
80c629b14aSBarry Smith    Level: intermediate
81c629b14aSBarry Smith 
82*dce8aebaSBarry Smith    Fortran Note:
83*dce8aebaSBarry Smith    Not supported from Fortran, use `DMDAGetFieldName()`
84f5f57ec0SBarry Smith 
85*dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMDAGetFieldName()`, `DMDASetCoordinateName()`, `DMDAGetCoordinateName()`, `DMDASetFieldName()`, `DMDASetFieldNames()`
86c629b14aSBarry Smith @*/
87d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDAGetFieldNames(DM da, const char *const **names)
88d71ae5a4SJacob Faibussowitsch {
89c629b14aSBarry Smith   DM_DA *dd = (DM_DA *)da->data;
90c629b14aSBarry Smith 
91c629b14aSBarry Smith   PetscFunctionBegin;
92c629b14aSBarry Smith   *names = (const char *const *)dd->fieldname;
93c629b14aSBarry Smith   PetscFunctionReturn(0);
94c629b14aSBarry Smith }
95c629b14aSBarry Smith 
96c629b14aSBarry Smith /*@C
97c629b14aSBarry Smith    DMDASetFieldNames - Sets the name of each component in the vector associated with the DMDA
98c629b14aSBarry Smith 
99b1dd8793SDave May    Logically collective; names must contain a common value
100c629b14aSBarry Smith 
101c629b14aSBarry Smith    Input Parameters:
102*dce8aebaSBarry Smith +  dm - the `DMDA` object
103*dce8aebaSBarry Smith -  names - the names of the components, final string must be NULL, must have the same number of entries as the dof used in creating the `DMDA`
1043eac1ceeSStefano Zampini 
105c629b14aSBarry Smith    Level: intermediate
106c629b14aSBarry Smith 
107*dce8aebaSBarry Smith    Note:
108*dce8aebaSBarry Smith     It must be called after having called `DMSetUp()`.
109f5f57ec0SBarry Smith 
110*dce8aebaSBarry Smith    Fortran Note:
111*dce8aebaSBarry Smith    Not supported from Fortran, use `DMDASetFieldName()`
112*dce8aebaSBarry Smith 
113*dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMDAGetFieldName()`, `DMDASetCoordinateName()`, `DMDAGetCoordinateName()`, `DMDASetFieldName()`, `DMSetUp()`
114c629b14aSBarry Smith @*/
115d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDASetFieldNames(DM da, const char *const *names)
116d71ae5a4SJacob Faibussowitsch {
117c629b14aSBarry Smith   DM_DA   *dd = (DM_DA *)da->data;
1183eac1ceeSStefano Zampini   char   **fieldname;
1193eac1ceeSStefano Zampini   PetscInt nf = 0;
120c629b14aSBarry Smith 
121c629b14aSBarry Smith   PetscFunctionBegin;
1227a8be351SBarry Smith   PetscCheck(dd->fieldname, PetscObjectComm((PetscObject)da), PETSC_ERR_ORDER, "You should call DMSetUp() first");
1233eac1ceeSStefano Zampini   while (names[nf++]) { };
12463a3b9bcSJacob Faibussowitsch   PetscCheck(nf == dd->w + 1, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid number of fields %" PetscInt_FMT, nf - 1);
1259566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayallocpy(names, &fieldname));
1269566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&dd->fieldname));
1273eac1ceeSStefano Zampini   dd->fieldname = fieldname;
128c629b14aSBarry Smith   PetscFunctionReturn(0);
129c629b14aSBarry Smith }
130c629b14aSBarry Smith 
13147c6ae99SBarry Smith /*@C
132aa219208SBarry Smith    DMDAGetFieldName - Gets the names of individual field components in multicomponent
133*dce8aebaSBarry Smith    vectors associated with a `DMDA`.
13447c6ae99SBarry Smith 
135b1dd8793SDave May    Not collective; name will contain a common value
13647c6ae99SBarry Smith 
137d8d19677SJose E. Roman    Input Parameters:
13847c6ae99SBarry Smith +  da - the distributed array
139*dce8aebaSBarry Smith -  nf - field number for the `DMDA` (0, 1, ... dof-1), where dof indicates the
140*dce8aebaSBarry Smith         number of degrees of freedom per node within the `DMDA`
14147c6ae99SBarry Smith 
14247c6ae99SBarry Smith    Output Parameter:
14347c6ae99SBarry Smith .  names - the name of the field (component)
14447c6ae99SBarry Smith 
14547c6ae99SBarry Smith   Level: intermediate
14647c6ae99SBarry Smith 
147*dce8aebaSBarry Smith   Note:
148*dce8aebaSBarry Smith     It must be called after having called `DMSetUp()`.
149*dce8aebaSBarry Smith 
150*dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMDASetFieldName()`, `DMDASetCoordinateName()`, `DMDAGetCoordinateName()`, `DMSetUp()`
15147c6ae99SBarry Smith @*/
152d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDAGetFieldName(DM da, PetscInt nf, const char **name)
153d71ae5a4SJacob Faibussowitsch {
15447c6ae99SBarry Smith   DM_DA *dd = (DM_DA *)da->data;
15547c6ae99SBarry Smith 
15647c6ae99SBarry Smith   PetscFunctionBegin;
157a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
15847c6ae99SBarry Smith   PetscValidPointer(name, 3);
1591dca8a05SBarry Smith   PetscCheck(nf >= 0 && nf < dd->w, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid field number: %" PetscInt_FMT, nf);
1607a8be351SBarry Smith   PetscCheck(dd->fieldname, PetscObjectComm((PetscObject)da), PETSC_ERR_ORDER, "You should call DMSetUp() first");
16147c6ae99SBarry Smith   *name = dd->fieldname[nf];
16247c6ae99SBarry Smith   PetscFunctionReturn(0);
16347c6ae99SBarry Smith }
16447c6ae99SBarry Smith 
165109c9344SBarry Smith /*@C
166*dce8aebaSBarry Smith    DMDASetCoordinateName - Sets the name of the coordinate directions associated with a `DMDA`, for example "x" or "y"
167109c9344SBarry Smith 
168b1dd8793SDave May    Logically collective; name must contain a common value
169109c9344SBarry Smith 
170109c9344SBarry Smith    Input Parameters:
171*dce8aebaSBarry Smith +  dm - the `DMDA`
172109c9344SBarry Smith .  nf - coordinate number for the DMDA (0, 1, ... dim-1),
173109c9344SBarry Smith -  name - the name of the coordinate
174109c9344SBarry Smith 
175109c9344SBarry Smith   Level: intermediate
176109c9344SBarry Smith 
177*dce8aebaSBarry Smith   Note:
178*dce8aebaSBarry Smith     It must be called after having called `DMSetUp()`.
179*dce8aebaSBarry Smith 
180*dce8aebaSBarry Smith   Fortran Note:
181f5f57ec0SBarry Smith   Not supported from Fortran
182f5f57ec0SBarry Smith 
183*dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMDAGetCoordinateName()`, `DMDASetFieldName()`, `DMDAGetFieldName()`, `DMSetUp()`
184109c9344SBarry Smith @*/
185d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDASetCoordinateName(DM dm, PetscInt nf, const char name[])
186d71ae5a4SJacob Faibussowitsch {
187c73cfb54SMatthew G. Knepley   DM_DA *dd = (DM_DA *)dm->data;
188109c9344SBarry Smith 
189109c9344SBarry Smith   PetscFunctionBegin;
190a9a02de4SBarry Smith   PetscValidHeaderSpecificType(dm, DM_CLASSID, 1, DMDA);
1911dca8a05SBarry Smith   PetscCheck(nf >= 0 && nf < dm->dim, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid coordinate number: %" PetscInt_FMT, nf);
1927a8be351SBarry Smith   PetscCheck(dd->coordinatename, PetscObjectComm((PetscObject)dm), PETSC_ERR_ORDER, "You should call DMSetUp() first");
1939566063dSJacob Faibussowitsch   PetscCall(PetscFree(dd->coordinatename[nf]));
1949566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(name, &dd->coordinatename[nf]));
195109c9344SBarry Smith   PetscFunctionReturn(0);
196109c9344SBarry Smith }
197109c9344SBarry Smith 
198109c9344SBarry Smith /*@C
199*dce8aebaSBarry Smith    DMDAGetCoordinateName - Gets the name of a coodinate direction associated with a `DMDA`.
200109c9344SBarry Smith 
201b1dd8793SDave May    Not collective; name will contain a common value
202109c9344SBarry Smith 
203d8d19677SJose E. Roman    Input Parameters:
204*dce8aebaSBarry Smith +  dm - the `DMDA`
205109c9344SBarry Smith -  nf -  number for the DMDA (0, 1, ... dim-1)
206109c9344SBarry Smith 
207109c9344SBarry Smith    Output Parameter:
208109c9344SBarry Smith .  names - the name of the coordinate direction
209109c9344SBarry Smith 
210109c9344SBarry Smith   Level: intermediate
211109c9344SBarry Smith 
212*dce8aebaSBarry Smith   Note:
213*dce8aebaSBarry Smith     It must be called after having called `DMSetUp()`.
214*dce8aebaSBarry Smith 
215*dce8aebaSBarry Smith   Fortran Note:
216f5f57ec0SBarry Smith   Not supported from Fortran
217f5f57ec0SBarry Smith 
218*dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMDASetCoordinateName()`, `DMDASetFieldName()`, `DMDAGetFieldName()`, `DMSetUp()`
219109c9344SBarry Smith @*/
220d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDAGetCoordinateName(DM dm, PetscInt nf, const char **name)
221d71ae5a4SJacob Faibussowitsch {
222c73cfb54SMatthew G. Knepley   DM_DA *dd = (DM_DA *)dm->data;
223109c9344SBarry Smith 
224109c9344SBarry Smith   PetscFunctionBegin;
225a9a02de4SBarry Smith   PetscValidHeaderSpecificType(dm, DM_CLASSID, 1, DMDA);
226109c9344SBarry Smith   PetscValidPointer(name, 3);
2271dca8a05SBarry Smith   PetscCheck(nf >= 0 && nf < dm->dim, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Invalid coordinate number: %" PetscInt_FMT, nf);
2287a8be351SBarry Smith   PetscCheck(dd->coordinatename, PetscObjectComm((PetscObject)dm), PETSC_ERR_ORDER, "You should call DMSetUp() first");
229109c9344SBarry Smith   *name = dd->coordinatename[nf];
230109c9344SBarry Smith   PetscFunctionReturn(0);
231109c9344SBarry Smith }
232109c9344SBarry Smith 
233a5d1443cSVincent Le Chenadec /*@C
234aa219208SBarry Smith    DMDAGetCorners - Returns the global (x,y,z) indices of the lower left
23559f3ab6dSMatthew G. Knepley    corner and size of the local region, excluding ghost points.
23647c6ae99SBarry Smith 
237b1dd8793SDave May    Not collective
23847c6ae99SBarry Smith 
23947c6ae99SBarry Smith    Input Parameter:
24047c6ae99SBarry Smith .  da - the distributed array
24147c6ae99SBarry Smith 
24247c6ae99SBarry Smith    Output Parameters:
2436b867d5aSJose E. Roman +  x - the corner index for the first dimension
2446b867d5aSJose E. Roman .  y - the corner index for the second dimension (only used in 2D and 3D problems)
2456b867d5aSJose E. Roman .  z - the corner index for the third dimension (only used in 3D problems)
2466b867d5aSJose E. Roman .  m - the width in the first dimension
2476b867d5aSJose E. Roman .  n - the width in the second dimension (only used in 2D and 3D problems)
2486b867d5aSJose E. Roman -  p - the width in the third dimension (only used in 3D problems)
24947c6ae99SBarry Smith 
250*dce8aebaSBarry Smith   Level: beginner
251*dce8aebaSBarry Smith 
25247c6ae99SBarry Smith    Note:
25347c6ae99SBarry Smith    The corner information is independent of the number of degrees of
254*dce8aebaSBarry Smith    freedom per node set with the `DMDACreateXX()` routine. Thus the x, y, z, and
25547c6ae99SBarry Smith    m, n, p can be thought of as coordinates on a logical grid, where each
25647c6ae99SBarry Smith    grid point has (potentially) several degrees of freedom.
2570298fd71SBarry Smith    Any of y, z, n, and p can be passed in as NULL if not needed.
25847c6ae99SBarry Smith 
259*dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMDAGetGhostCorners()`, `DMDAGetOwnershipRanges()`, `DMStagGetCorners()`
26047c6ae99SBarry Smith @*/
261d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDAGetCorners(DM da, PetscInt *x, PetscInt *y, PetscInt *z, PetscInt *m, PetscInt *n, PetscInt *p)
262d71ae5a4SJacob Faibussowitsch {
26347c6ae99SBarry Smith   PetscInt w;
26447c6ae99SBarry Smith   DM_DA   *dd = (DM_DA *)da->data;
26547c6ae99SBarry Smith 
26647c6ae99SBarry Smith   PetscFunctionBegin;
267a9a02de4SBarry Smith   PetscValidHeaderSpecificType(da, DM_CLASSID, 1, DMDA);
26847c6ae99SBarry Smith   /* since the xs, xe ... have all been multiplied by the number of degrees
26947c6ae99SBarry Smith      of freedom per cell, w = dd->w, we divide that out before returning.*/
27047c6ae99SBarry Smith   w = dd->w;
27159bc5b24SSatish Balay   if (x) *x = dd->xs / w + dd->xo;
27247c6ae99SBarry Smith   /* the y and z have NOT been multiplied by w */
27359bc5b24SSatish Balay   if (y) *y = dd->ys + dd->yo;
27459bc5b24SSatish Balay   if (z) *z = dd->zs + dd->zo;
27559bc5b24SSatish Balay   if (m) *m = (dd->xe - dd->xs) / w;
27659bc5b24SSatish Balay   if (n) *n = (dd->ye - dd->ys);
27759bc5b24SSatish Balay   if (p) *p = (dd->ze - dd->zs);
27847c6ae99SBarry Smith   PetscFunctionReturn(0);
27947c6ae99SBarry Smith }
28047c6ae99SBarry Smith 
281d71ae5a4SJacob Faibussowitsch PetscErrorCode DMGetLocalBoundingIndices_DMDA(DM dm, PetscReal lmin[], PetscReal lmax[])
282d71ae5a4SJacob Faibussowitsch {
2837324c66bSJed Brown   DMDALocalInfo info;
28447c6ae99SBarry Smith 
28547c6ae99SBarry Smith   PetscFunctionBegin;
2869566063dSJacob Faibussowitsch   PetscCall(DMDAGetLocalInfo(dm, &info));
287b2e4378dSMatthew G. Knepley   lmin[0] = info.xs;
288b2e4378dSMatthew G. Knepley   lmin[1] = info.ys;
289b2e4378dSMatthew G. Knepley   lmin[2] = info.zs;
290b2e4378dSMatthew G. Knepley   lmax[0] = info.xs + info.xm - 1;
291b2e4378dSMatthew G. Knepley   lmax[1] = info.ys + info.ym - 1;
292b2e4378dSMatthew G. Knepley   lmax[2] = info.zs + info.zm - 1;
29347c6ae99SBarry Smith   PetscFunctionReturn(0);
29447c6ae99SBarry Smith }
295bc2bf880SBarry Smith 
296bc2bf880SBarry Smith /*@
29783d91586SPatrick Sanan    DMDAGetReducedDMDA - Deprecated; use DMDACreateCompatibleDMDA()
29883d91586SPatrick Sanan 
29983d91586SPatrick Sanan    Level: deprecated
30083d91586SPatrick Sanan @*/
301d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDAGetReducedDMDA(DM da, PetscInt nfields, DM *nda)
302d71ae5a4SJacob Faibussowitsch {
30383d91586SPatrick Sanan   PetscFunctionBegin;
3049566063dSJacob Faibussowitsch   PetscCall(DMDACreateCompatibleDMDA(da, nfields, nda));
30583d91586SPatrick Sanan   PetscFunctionReturn(0);
30683d91586SPatrick Sanan }
30783d91586SPatrick Sanan 
30883d91586SPatrick Sanan /*@
309*dce8aebaSBarry Smith    DMDACreateCompatibleDMDA - Creates a `DMDA` with the same layout but with fewer or more fields
310bc2bf880SBarry Smith 
311b1dd8793SDave May    Collective
312bc2bf880SBarry Smith 
313907376e6SBarry Smith    Input Parameters:
314bc2bf880SBarry Smith +  da - the distributed array
315*dce8aebaSBarry Smith -  nfields - number of fields in new `DMDA`
316bc2bf880SBarry Smith 
317bc2bf880SBarry Smith    Output Parameter:
318*dce8aebaSBarry Smith .  nda - the new `DMDA`
319bc2bf880SBarry Smith 
320bc2bf880SBarry Smith   Level: intermediate
321bc2bf880SBarry Smith 
322*dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMDAGetGhostCorners()`, `DMSetCoordinates()`, `DMDASetUniformCoordinates()`, `DMGetCoordinates()`, `DMDAGetGhostedCoordinates()`, `DMStagCreateCompatibleDMStag()`
323bc2bf880SBarry Smith @*/
324d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDACreateCompatibleDMDA(DM da, PetscInt nfields, DM *nda)
325d71ae5a4SJacob Faibussowitsch {
326bc2bf880SBarry Smith   DM_DA          *dd = (DM_DA *)da->data;
32795c13181SPeter Brune   PetscInt        s, m, n, p, M, N, P, dim, Mo, No, Po;
328320964c4SBlaise Bourdin   const PetscInt *lx, *ly, *lz;
329bff4a2f0SMatthew G. Knepley   DMBoundaryType  bx, by, bz;
330320964c4SBlaise Bourdin   DMDAStencilType stencil_type;
3316858538eSMatthew G. Knepley   Vec             coords;
33295c13181SPeter Brune   PetscInt        ox, oy, oz;
33395c13181SPeter Brune   PetscInt        cl, rl;
334320964c4SBlaise Bourdin 
335320964c4SBlaise Bourdin   PetscFunctionBegin;
336c73cfb54SMatthew G. Knepley   dim = da->dim;
33795c13181SPeter Brune   M   = dd->M;
33895c13181SPeter Brune   N   = dd->N;
33995c13181SPeter Brune   P   = dd->P;
34095c13181SPeter Brune   m   = dd->m;
34195c13181SPeter Brune   n   = dd->n;
34295c13181SPeter Brune   p   = dd->p;
34395c13181SPeter Brune   s   = dd->s;
34495c13181SPeter Brune   bx  = dd->bx;
34595c13181SPeter Brune   by  = dd->by;
34695c13181SPeter Brune   bz  = dd->bz;
3478865f1eaSKarl Rupp 
34895c13181SPeter Brune   stencil_type = dd->stencil_type;
3498865f1eaSKarl Rupp 
3509566063dSJacob Faibussowitsch   PetscCall(DMDAGetOwnershipRanges(da, &lx, &ly, &lz));
351320964c4SBlaise Bourdin   if (dim == 1) {
3529566063dSJacob Faibussowitsch     PetscCall(DMDACreate1d(PetscObjectComm((PetscObject)da), bx, M, nfields, s, dd->lx, nda));
353320964c4SBlaise Bourdin   } else if (dim == 2) {
3549566063dSJacob Faibussowitsch     PetscCall(DMDACreate2d(PetscObjectComm((PetscObject)da), bx, by, stencil_type, M, N, m, n, nfields, s, lx, ly, nda));
355320964c4SBlaise Bourdin   } else if (dim == 3) {
3569566063dSJacob Faibussowitsch     PetscCall(DMDACreate3d(PetscObjectComm((PetscObject)da), bx, by, bz, stencil_type, M, N, P, m, n, p, nfields, s, lx, ly, lz, nda));
357bc2bf880SBarry Smith   }
3589566063dSJacob Faibussowitsch   PetscCall(DMSetUp(*nda));
3596858538eSMatthew G. Knepley   PetscCall(DMGetCoordinates(da, &coords));
3606858538eSMatthew G. Knepley   PetscCall(DMSetCoordinates(*nda, coords));
36195c13181SPeter Brune 
36295c13181SPeter Brune   /* allow for getting a reduced DA corresponding to a domain decomposition */
3639566063dSJacob Faibussowitsch   PetscCall(DMDAGetOffset(da, &ox, &oy, &oz, &Mo, &No, &Po));
3649566063dSJacob Faibussowitsch   PetscCall(DMDASetOffset(*nda, ox, oy, oz, Mo, No, Po));
36595c13181SPeter Brune 
36695c13181SPeter Brune   /* allow for getting a reduced DA corresponding to a coarsened DA */
3679566063dSJacob Faibussowitsch   PetscCall(DMGetCoarsenLevel(da, &cl));
3689566063dSJacob Faibussowitsch   PetscCall(DMGetRefineLevel(da, &rl));
3698865f1eaSKarl Rupp 
37095c13181SPeter Brune   (*nda)->levelup   = rl;
37195c13181SPeter Brune   (*nda)->leveldown = cl;
372bc2bf880SBarry Smith   PetscFunctionReturn(0);
373bc2bf880SBarry Smith }
374bc2bf880SBarry Smith 
375c593f006SBarry Smith /*@C
376*dce8aebaSBarry Smith    DMDAGetCoordinateArray - Gets an array containing the coordinates of the `DMDA`
377c593f006SBarry Smith 
378b1dd8793SDave May    Not collective
379c593f006SBarry Smith 
380c593f006SBarry Smith    Input Parameter:
381*dce8aebaSBarry Smith .  dm - the `DMDA`
382c593f006SBarry Smith 
383c593f006SBarry Smith    Output Parameter:
384c593f006SBarry Smith .  xc - the coordinates
385c593f006SBarry Smith 
386c593f006SBarry Smith   Level: intermediate
387c593f006SBarry Smith 
388*dce8aebaSBarry Smith   Fortran Note:
389f5f57ec0SBarry Smith   Not supported from Fortran
390f5f57ec0SBarry Smith 
391*dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMDASetCoordinateName()`, `DMDASetFieldName()`, `DMDAGetFieldName()`, `DMDARestoreCoordinateArray()`
392c593f006SBarry Smith @*/
393d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDAGetCoordinateArray(DM dm, void *xc)
394d71ae5a4SJacob Faibussowitsch {
395c593f006SBarry Smith   DM  cdm;
396c593f006SBarry Smith   Vec x;
397c593f006SBarry Smith 
398c593f006SBarry Smith   PetscFunctionBegin;
399c593f006SBarry Smith   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4009566063dSJacob Faibussowitsch   PetscCall(DMGetCoordinates(dm, &x));
4019566063dSJacob Faibussowitsch   PetscCall(DMGetCoordinateDM(dm, &cdm));
4029566063dSJacob Faibussowitsch   PetscCall(DMDAVecGetArray(cdm, x, xc));
403c593f006SBarry Smith   PetscFunctionReturn(0);
404c593f006SBarry Smith }
405c593f006SBarry Smith 
406c593f006SBarry Smith /*@C
407*dce8aebaSBarry Smith    DMDARestoreCoordinateArray - Sets an array containing the coordinates of the `DMDA`
408c593f006SBarry Smith 
409b1dd8793SDave May    Not collective
410c593f006SBarry Smith 
411d8d19677SJose E. Roman    Input Parameters:
412*dce8aebaSBarry Smith +  dm - the `DMDA`
413c593f006SBarry Smith -  xc - the coordinates
414c593f006SBarry Smith 
415c593f006SBarry Smith   Level: intermediate
416c593f006SBarry Smith 
417*dce8aebaSBarry Smith   Fortran Note:
418f5f57ec0SBarry Smith   Not supported from Fortran
419f5f57ec0SBarry Smith 
420*dce8aebaSBarry Smith .seealso: `DM`, `DMDA`, `DMDASetCoordinateName()`, `DMDASetFieldName()`, `DMDAGetFieldName()`, `DMDAGetCoordinateArray()`
421c593f006SBarry Smith @*/
422d71ae5a4SJacob Faibussowitsch PetscErrorCode DMDARestoreCoordinateArray(DM dm, void *xc)
423d71ae5a4SJacob Faibussowitsch {
424c593f006SBarry Smith   DM  cdm;
425c593f006SBarry Smith   Vec x;
426c593f006SBarry Smith 
427c593f006SBarry Smith   PetscFunctionBegin;
428c593f006SBarry Smith   PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
4299566063dSJacob Faibussowitsch   PetscCall(DMGetCoordinates(dm, &x));
4309566063dSJacob Faibussowitsch   PetscCall(DMGetCoordinateDM(dm, &cdm));
4319566063dSJacob Faibussowitsch   PetscCall(DMDAVecRestoreArray(cdm, x, xc));
432c593f006SBarry Smith   PetscFunctionReturn(0);
433c593f006SBarry Smith }
434