Date: 2022-08-02T03:14:13+00:00

Actual source code: daghost.c

      2: /*
      3:   Code for manipulating distributed regular arrays in parallel.
      4: */

      6: #include <petsc/private/dmdaimpl.h>

      8: /*@C
      9:    DMDAGetGhostCorners - Returns the global (x,y,z) indices of the lower left
     10:    corner and size of the local region, including ghost points.

     12:    Not Collective

     14:    Input Parameter:
     15: .  da - the distributed array

     17:    Output Parameters:
     18: +  x - the corner index for the first dimension
     19: .  y - the corner index for the second dimension (only used in 2D and 3D problems)
     20: .  z - the corner index for the third dimension (only used in 3D problems)
     21: .  m - the width in the first dimension
     22: .  n - the width in the second dimension (only used in 2D and 3D problems)
     23: -  p - the width in the third dimension (only used in 3D problems)

     25:    Level: beginner

     27:    Note:
     28:    The corner information is independent of the number of degrees of
     29:    freedom per node set with the DMDACreateXX() routine. Thus the x, y, z, and
     30:    m, n, p can be thought of as coordinates on a logical grid, where each
     31:    grid point has (potentially) several degrees of freedom.
     32:    Any of y, z, n, and p can be passed in as NULL if not needed.

     34: .seealso: DMDAGetCorners(), DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMDAGetOwnershipRanges(), DMStagGetGhostCorners()

     36: @*/
     37: PetscErrorCode  DMDAGetGhostCorners(DM da,PetscInt *x,PetscInt *y,PetscInt *z,PetscInt *m,PetscInt *n,PetscInt *p)
     38: {
     39:   PetscInt w;
     40:   DM_DA    *dd = (DM_DA*)da->data;

     43:   /* since the xs, xe ... have all been multiplied by the number of degrees
     44:      of freedom per cell, w = dd->w, we divide that out before returning.*/
     45:   w = dd->w;
     46:   if (x) *x = dd->Xs/w + dd->xo;
     47:   if (y) *y = dd->Ys   + dd->yo;
     48:   if (z) *z = dd->Zs   + dd->zo;
     49:   if (m) *m = (dd->Xe - dd->Xs)/w;
     50:   if (n) *n = (dd->Ye - dd->Ys);
     51:   if (p) *p = (dd->Ze - dd->Zs);
     52:   return 0;
     53: }