xref: /petsc/src/dm/impls/da/dacreate.c (revision ea78f98c112368f404cd6d4fff6d4dfe73e5a1e7)
17d0a6c19SBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h>    /*I   "petscdmda.h"   I*/
347c6ae99SBarry Smith 
44416b707SBarry Smith PetscErrorCode  DMSetFromOptions_DA(PetscOptionItems *PetscOptionsObject,DM da)
547c6ae99SBarry Smith {
647c6ae99SBarry Smith   PetscErrorCode ierr;
747c6ae99SBarry Smith   DM_DA          *dd    = (DM_DA*)da->data;
8c73cfb54SMatthew G. Knepley   PetscInt       refine = 0,dim = da->dim,maxnlevels = 100,refx[100],refy[100],refz[100],n,i;
9897f7067SBarry Smith   PetscBool      flg;
1047c6ae99SBarry Smith 
1147c6ae99SBarry Smith   PetscFunctionBegin;
1247c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
1347c6ae99SBarry Smith 
14897f7067SBarry Smith   if (dd->M < 0) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_ARG_OUTOFRANGE,"Dimension must be non-negative, call DMSetFromOptions() if you want to change the value at runtime");
15897f7067SBarry Smith   if (dd->N < 0) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_ARG_OUTOFRANGE,"Dimension must be non-negative, call DMSetFromOptions() if you want to change the value at runtime");
16897f7067SBarry Smith   if (dd->P < 0) SETERRQ(PetscObjectComm((PetscObject)da),PETSC_ERR_ARG_OUTOFRANGE,"Dimension must be non-negative, call DMSetFromOptions() if you want to change the value at runtime");
17235683edSBarry Smith 
18e55864a3SBarry Smith   ierr = PetscOptionsHead(PetscOptionsObject,"DMDA Options");CHKERRQ(ierr);
195a856986SBarry Smith   ierr = PetscOptionsBoundedInt("-da_grid_x","Number of grid points in x direction","DMDASetSizes",dd->M,&dd->M,NULL,1);CHKERRQ(ierr);
205a856986SBarry Smith   ierr = PetscOptionsBoundedInt("-da_grid_y","Number of grid points in y direction","DMDASetSizes",dd->N,&dd->N,NULL,1);CHKERRQ(ierr);
215a856986SBarry Smith   ierr = PetscOptionsBoundedInt("-da_grid_z","Number of grid points in z direction","DMDASetSizes",dd->P,&dd->P,NULL,1);CHKERRQ(ierr);
227ddda789SPeter Brune 
235a856986SBarry Smith   ierr = PetscOptionsBoundedInt("-da_overlap","Decomposition overlap in all directions","DMDASetOverlap",dd->xol,&dd->xol,&flg,0);CHKERRQ(ierr);
247ddda789SPeter Brune   if (flg) {ierr = DMDASetOverlap(da,dd->xol,dd->xol,dd->xol);CHKERRQ(ierr);}
255a856986SBarry Smith   ierr = PetscOptionsBoundedInt("-da_overlap_x","Decomposition overlap in x direction","DMDASetOverlap",dd->xol,&dd->xol,NULL,0);CHKERRQ(ierr);
265a856986SBarry Smith   if (dim > 1) {ierr = PetscOptionsBoundedInt("-da_overlap_y","Decomposition overlap in y direction","DMDASetOverlap",dd->yol,&dd->yol,NULL,0);CHKERRQ(ierr);}
275a856986SBarry Smith   if (dim > 2) {ierr = PetscOptionsBoundedInt("-da_overlap_z","Decomposition overlap in z direction","DMDASetOverlap",dd->zol,&dd->zol,NULL,0);CHKERRQ(ierr);}
283e7870d2SPeter Brune 
295a856986SBarry Smith   ierr = PetscOptionsBoundedInt("-da_local_subdomains","","DMDASetNumLocalSubdomains",dd->Nsub,&dd->Nsub,&flg,PETSC_DECIDE);CHKERRQ(ierr);
303e7870d2SPeter Brune   if (flg) {ierr = DMDASetNumLocalSubDomains(da,dd->Nsub);CHKERRQ(ierr);}
313e7870d2SPeter Brune 
328d07fd27SPatrick Sanan   /* Handle DMDA parallel distribution */
335a856986SBarry Smith   ierr = PetscOptionsBoundedInt("-da_processors_x","Number of processors in x direction","DMDASetNumProcs",dd->m,&dd->m,NULL,PETSC_DECIDE);CHKERRQ(ierr);
345a856986SBarry Smith   if (dim > 1) {ierr = PetscOptionsBoundedInt("-da_processors_y","Number of processors in y direction","DMDASetNumProcs",dd->n,&dd->n,NULL,PETSC_DECIDE);CHKERRQ(ierr);}
355a856986SBarry Smith   if (dim > 2) {ierr = PetscOptionsBoundedInt("-da_processors_z","Number of processors in z direction","DMDASetNumProcs",dd->p,&dd->p,NULL,PETSC_DECIDE);CHKERRQ(ierr);}
36aa219208SBarry Smith   /* Handle DMDA refinement */
375a856986SBarry Smith   ierr = PetscOptionsBoundedInt("-da_refine_x","Refinement ratio in x direction","DMDASetRefinementFactor",dd->refine_x,&dd->refine_x,NULL,1);CHKERRQ(ierr);
385a856986SBarry Smith   if (dim > 1) {ierr = PetscOptionsBoundedInt("-da_refine_y","Refinement ratio in y direction","DMDASetRefinementFactor",dd->refine_y,&dd->refine_y,NULL,1);CHKERRQ(ierr);}
395a856986SBarry Smith   if (dim > 2) {ierr = PetscOptionsBoundedInt("-da_refine_z","Refinement ratio in z direction","DMDASetRefinementFactor",dd->refine_z,&dd->refine_z,NULL,1);CHKERRQ(ierr);}
4038fb6c91SJed Brown   dd->coarsen_x = dd->refine_x; dd->coarsen_y = dd->refine_y; dd->coarsen_z = dd->refine_z;
4147c6ae99SBarry Smith 
42397b6216SJed Brown   /* Get refinement factors, defaults taken from the coarse DMDA */
43397b6216SJed Brown   ierr = DMDAGetRefinementFactor(da,&refx[0],&refy[0],&refz[0]);CHKERRQ(ierr);
44397b6216SJed Brown   for (i=1; i<maxnlevels; i++) {
45397b6216SJed Brown     refx[i] = refx[0];
46397b6216SJed Brown     refy[i] = refy[0];
47397b6216SJed Brown     refz[i] = refz[0];
48397b6216SJed Brown   }
49397b6216SJed Brown   n    = maxnlevels;
50897f7067SBarry Smith   ierr = PetscOptionsIntArray("-da_refine_hierarchy_x","Refinement factor for each level","None",refx,&n,&flg);CHKERRQ(ierr);
51897f7067SBarry Smith   if (flg) {
52897f7067SBarry Smith     dd->refine_x = refx[0];
53897f7067SBarry Smith     dd->refine_x_hier_n = n;
54897f7067SBarry Smith     ierr = PetscMalloc1(n,&dd->refine_x_hier);CHKERRQ(ierr);
55580bdb30SBarry Smith     ierr = PetscArraycpy(dd->refine_x_hier,refx,n);CHKERRQ(ierr);
56897f7067SBarry Smith   }
57c73cfb54SMatthew G. Knepley   if (dim > 1) {
58397b6216SJed Brown     n    = maxnlevels;
59897f7067SBarry Smith     ierr = PetscOptionsIntArray("-da_refine_hierarchy_y","Refinement factor for each level","None",refy,&n,&flg);CHKERRQ(ierr);
60897f7067SBarry Smith     if (flg) {
61897f7067SBarry Smith       dd->refine_y = refy[0];
62897f7067SBarry Smith       dd->refine_y_hier_n = n;
63897f7067SBarry Smith       ierr = PetscMalloc1(n,&dd->refine_y_hier);CHKERRQ(ierr);
64580bdb30SBarry Smith       ierr = PetscArraycpy(dd->refine_y_hier,refy,n);CHKERRQ(ierr);
65897f7067SBarry Smith     }
66397b6216SJed Brown   }
67c73cfb54SMatthew G. Knepley   if (dim > 2) {
68397b6216SJed Brown     n    = maxnlevels;
69897f7067SBarry Smith     ierr = PetscOptionsIntArray("-da_refine_hierarchy_z","Refinement factor for each level","None",refz,&n,&flg);CHKERRQ(ierr);
70897f7067SBarry Smith     if (flg) {
71897f7067SBarry Smith       dd->refine_z = refz[0];
72897f7067SBarry Smith       dd->refine_z_hier_n = n;
73897f7067SBarry Smith       ierr = PetscMalloc1(n,&dd->refine_z_hier);CHKERRQ(ierr);
74580bdb30SBarry Smith       ierr = PetscArraycpy(dd->refine_z_hier,refz,n);CHKERRQ(ierr);
75897f7067SBarry Smith     }
76397b6216SJed Brown   }
77397b6216SJed Brown 
785a856986SBarry Smith   ierr = PetscOptionsBoundedInt("-da_refine","Uniformly refine DA one or more times","None",refine,&refine,NULL,0);CHKERRQ(ierr);
79f9ba7244SBarry Smith   ierr = PetscOptionsTail();CHKERRQ(ierr);
80235683edSBarry Smith 
81e0f5d30fSBarry Smith   while (refine--) {
82bff4a2f0SMatthew G. Knepley     if (dd->bx == DM_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
83e0f5d30fSBarry Smith       dd->M = dd->refine_x*dd->M;
84e0f5d30fSBarry Smith     } else {
85e0f5d30fSBarry Smith       dd->M = 1 + dd->refine_x*(dd->M - 1);
86e0f5d30fSBarry Smith     }
87bff4a2f0SMatthew G. Knepley     if (dd->by == DM_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
88e0f5d30fSBarry Smith       dd->N = dd->refine_y*dd->N;
89e0f5d30fSBarry Smith     } else {
90e0f5d30fSBarry Smith       dd->N = 1 + dd->refine_y*(dd->N - 1);
91e0f5d30fSBarry Smith     }
92bff4a2f0SMatthew G. Knepley     if (dd->bz == DM_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
93e0f5d30fSBarry Smith       dd->P = dd->refine_z*dd->P;
94e0f5d30fSBarry Smith     } else {
95e0f5d30fSBarry Smith       dd->P = 1 + dd->refine_z*(dd->P - 1);
96e0f5d30fSBarry Smith     }
97e0f5d30fSBarry Smith     da->levelup++;
9885fc4b34SJed Brown     if (da->levelup - da->leveldown >= 0) {
9985fc4b34SJed Brown       dd->refine_x = refx[da->levelup - da->leveldown];
10085fc4b34SJed Brown       dd->refine_y = refy[da->levelup - da->leveldown];
10185fc4b34SJed Brown       dd->refine_z = refz[da->levelup - da->leveldown];
10285fc4b34SJed Brown     }
10385fc4b34SJed Brown     if (da->levelup - da->leveldown >= 1) {
10485fc4b34SJed Brown       dd->coarsen_x = refx[da->levelup - da->leveldown - 1];
10585fc4b34SJed Brown       dd->coarsen_y = refy[da->levelup - da->leveldown - 1];
10685fc4b34SJed Brown       dd->coarsen_z = refz[da->levelup - da->leveldown - 1];
10785fc4b34SJed Brown     }
108e0f5d30fSBarry Smith   }
10947c6ae99SBarry Smith   PetscFunctionReturn(0);
11047c6ae99SBarry Smith }
11147c6ae99SBarry Smith 
1127087cfbeSBarry Smith extern PetscErrorCode  DMCreateGlobalVector_DA(DM,Vec*);
1137087cfbeSBarry Smith extern PetscErrorCode  DMCreateLocalVector_DA(DM,Vec*);
1147087cfbeSBarry Smith extern PetscErrorCode  DMGlobalToLocalBegin_DA(DM,Vec,InsertMode,Vec);
1157087cfbeSBarry Smith extern PetscErrorCode  DMGlobalToLocalEnd_DA(DM,Vec,InsertMode,Vec);
1167087cfbeSBarry Smith extern PetscErrorCode  DMLocalToGlobalBegin_DA(DM,Vec,InsertMode,Vec);
1177087cfbeSBarry Smith extern PetscErrorCode  DMLocalToGlobalEnd_DA(DM,Vec,InsertMode,Vec);
118d78e899eSRichard Tran Mills extern PetscErrorCode  DMLocalToLocalBegin_DA(DM,Vec,InsertMode,Vec);
119d78e899eSRichard Tran Mills extern PetscErrorCode  DMLocalToLocalEnd_DA(DM,Vec,InsertMode,Vec);
120e727c939SJed Brown extern PetscErrorCode  DMCreateInterpolation_DA(DM,DM,Mat*,Vec*);
121b412c318SBarry Smith extern PetscErrorCode  DMCreateColoring_DA(DM,ISColoringType,ISColoring*);
122b412c318SBarry Smith extern PetscErrorCode  DMCreateMatrix_DA(DM,Mat*);
1236636e97aSMatthew G Knepley extern PetscErrorCode  DMCreateCoordinateDM_DA(DM,DM*);
1247087cfbeSBarry Smith extern PetscErrorCode  DMRefine_DA(DM,MPI_Comm,DM*);
1257087cfbeSBarry Smith extern PetscErrorCode  DMCoarsen_DA(DM,MPI_Comm,DM*);
1267087cfbeSBarry Smith extern PetscErrorCode  DMRefineHierarchy_DA(DM,PetscInt,DM[]);
1277087cfbeSBarry Smith extern PetscErrorCode  DMCoarsenHierarchy_DA(DM,PetscInt,DM[]);
1286dbf9973SLawrence Mitchell extern PetscErrorCode  DMCreateInjection_DA(DM,DM,Mat*);
1297087cfbeSBarry Smith extern PetscErrorCode  DMView_DA(DM,PetscViewer);
1307087cfbeSBarry Smith extern PetscErrorCode  DMSetUp_DA(DM);
1317087cfbeSBarry Smith extern PetscErrorCode  DMDestroy_DA(DM);
132e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecomposition_DA(DM,PetscInt*,char***,IS**,IS**,DM**);
133e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecompositionScatters_DA(DM,PetscInt,DM*,VecScatter**,VecScatter**,VecScatter**);
1347c3cd84eSPatrick Sanan PETSC_INTERN PetscErrorCode DMGetCompatibility_DA(DM,DM,PetscBool*,PetscBool*);
1359a42bb27SBarry Smith 
136b859378eSBarry Smith PetscErrorCode DMLoad_DA(DM da,PetscViewer viewer)
137b859378eSBarry Smith {
138b859378eSBarry Smith   PetscErrorCode   ierr;
139060da220SMatthew G. Knepley   PetscInt         dim,m,n,p,dof,swidth;
140b859378eSBarry Smith   DMDAStencilType  stencil;
141bff4a2f0SMatthew G. Knepley   DMBoundaryType   bx,by,bz;
142bc2bf880SBarry Smith   PetscBool        coors;
143bc2bf880SBarry Smith   DM               dac;
144bc2bf880SBarry Smith   Vec              c;
145b859378eSBarry Smith 
146b859378eSBarry Smith   PetscFunctionBegin;
147060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&dim,1,NULL,PETSC_INT);CHKERRQ(ierr);
148060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&m,1,NULL,PETSC_INT);CHKERRQ(ierr);
149060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&n,1,NULL,PETSC_INT);CHKERRQ(ierr);
150060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&p,1,NULL,PETSC_INT);CHKERRQ(ierr);
151060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&dof,1,NULL,PETSC_INT);CHKERRQ(ierr);
152060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&swidth,1,NULL,PETSC_INT);CHKERRQ(ierr);
153060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&bx,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
154060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&by,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
155060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&bz,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
156060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&stencil,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
157b859378eSBarry Smith 
158c73cfb54SMatthew G. Knepley   ierr = DMSetDimension(da, dim);CHKERRQ(ierr);
159bc2bf880SBarry Smith   ierr = DMDASetSizes(da, m,n,p);CHKERRQ(ierr);
160b859378eSBarry Smith   ierr = DMDASetBoundaryType(da, bx, by, bz);CHKERRQ(ierr);
161b859378eSBarry Smith   ierr = DMDASetDof(da, dof);CHKERRQ(ierr);
162b859378eSBarry Smith   ierr = DMDASetStencilType(da, stencil);CHKERRQ(ierr);
163b859378eSBarry Smith   ierr = DMDASetStencilWidth(da, swidth);CHKERRQ(ierr);
164b859378eSBarry Smith   ierr = DMSetUp(da);CHKERRQ(ierr);
165060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&coors,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
166bc2bf880SBarry Smith   if (coors) {
1676636e97aSMatthew G Knepley     ierr = DMGetCoordinateDM(da,&dac);CHKERRQ(ierr);
168bc2bf880SBarry Smith     ierr = DMCreateGlobalVector(dac,&c);CHKERRQ(ierr);
169bc2bf880SBarry Smith     ierr = VecLoad(c,viewer);CHKERRQ(ierr);
1706636e97aSMatthew G Knepley     ierr = DMSetCoordinates(da,c);CHKERRQ(ierr);
171bc2bf880SBarry Smith     ierr = VecDestroy(&c);CHKERRQ(ierr);
172bc2bf880SBarry Smith   }
173b859378eSBarry Smith   PetscFunctionReturn(0);
174b859378eSBarry Smith }
175b859378eSBarry Smith 
176276c5506SMatthew G. Knepley PetscErrorCode DMCreateSubDM_DA(DM dm, PetscInt numFields, const PetscInt fields[], IS *is, DM *subdm)
177d724dfffSBarry Smith {
178d724dfffSBarry Smith   DM_DA         *da = (DM_DA*) dm->data;
1794d9407bcSMatthew G. Knepley   PetscErrorCode ierr;
180d724dfffSBarry Smith 
181d724dfffSBarry Smith   PetscFunctionBegin;
182d724dfffSBarry Smith   if (subdm) {
183c38c1269SMatthew G. Knepley     PetscSF sf;
184c38c1269SMatthew G. Knepley     Vec     coords;
185c38c1269SMatthew G. Knepley     void   *ctx;
186c38c1269SMatthew G. Knepley     /* Cannot use DMClone since the dof stuff is mixed in. Ugh
187c38c1269SMatthew G. Knepley     ierr = DMClone(dm, subdm);CHKERRQ(ierr); */
188c38c1269SMatthew G. Knepley     ierr = DMCreate(PetscObjectComm((PetscObject)dm), subdm);CHKERRQ(ierr);
189c38c1269SMatthew G. Knepley     ierr = DMGetPointSF(dm, &sf);CHKERRQ(ierr);
190c38c1269SMatthew G. Knepley     ierr = DMSetPointSF(*subdm, sf);CHKERRQ(ierr);
191c38c1269SMatthew G. Knepley     ierr = DMGetApplicationContext(dm, &ctx);CHKERRQ(ierr);
192c38c1269SMatthew G. Knepley     ierr = DMSetApplicationContext(*subdm, ctx);CHKERRQ(ierr);
193c38c1269SMatthew G. Knepley     ierr = DMGetCoordinatesLocal(dm, &coords);CHKERRQ(ierr);
194c38c1269SMatthew G. Knepley     if (coords) {
195c38c1269SMatthew G. Knepley       ierr = DMSetCoordinatesLocal(*subdm, coords);CHKERRQ(ierr);
196c38c1269SMatthew G. Knepley     } else {
197c38c1269SMatthew G. Knepley       ierr = DMGetCoordinates(dm, &coords);CHKERRQ(ierr);
198c38c1269SMatthew G. Knepley       if (coords) {ierr = DMSetCoordinates(*subdm, coords);CHKERRQ(ierr);}
199c38c1269SMatthew G. Knepley     }
200c38c1269SMatthew G. Knepley 
201c38c1269SMatthew G. Knepley     ierr = DMSetType(*subdm, DMDA);CHKERRQ(ierr);
202c73cfb54SMatthew G. Knepley     ierr = DMSetDimension(*subdm, dm->dim);CHKERRQ(ierr);
203c38c1269SMatthew G. Knepley     ierr = DMDASetSizes(*subdm, da->M, da->N, da->P);CHKERRQ(ierr);
204c38c1269SMatthew G. Knepley     ierr = DMDASetNumProcs(*subdm, da->m, da->n, da->p);CHKERRQ(ierr);
205c38c1269SMatthew G. Knepley     ierr = DMDASetBoundaryType(*subdm, da->bx, da->by, da->bz);CHKERRQ(ierr);
20638221697SMatthew G. Knepley     ierr = DMDASetDof(*subdm, numFields);CHKERRQ(ierr);
207c38c1269SMatthew G. Knepley     ierr = DMDASetStencilType(*subdm, da->stencil_type);CHKERRQ(ierr);
208c38c1269SMatthew G. Knepley     ierr = DMDASetStencilWidth(*subdm, da->s);CHKERRQ(ierr);
209c38c1269SMatthew G. Knepley     ierr = DMDASetOwnershipRanges(*subdm, da->lx, da->ly, da->lz);CHKERRQ(ierr);
210d724dfffSBarry Smith   }
211d724dfffSBarry Smith   if (is) {
212d724dfffSBarry Smith     PetscInt *indices, cnt = 0, dof = da->w, i, j;
21338221697SMatthew G. Knepley 
214785e854fSJed Brown     ierr = PetscMalloc1(da->Nlocal*numFields/dof, &indices);CHKERRQ(ierr);
21538221697SMatthew G. Knepley     for (i = da->base/dof; i < (da->base+da->Nlocal)/dof; ++i) {
21638221697SMatthew G. Knepley       for (j = 0; j < numFields; ++j) {
217d724dfffSBarry Smith         indices[cnt++] = dof*i + fields[j];
218d724dfffSBarry Smith       }
219d724dfffSBarry Smith     }
220cb004a26SBarry Smith     if (cnt != da->Nlocal*numFields/dof) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_PLIB, "Count %D does not equal expected value %D", cnt, da->Nlocal*numFields/dof);
22138221697SMatthew G. Knepley     ierr = ISCreateGeneral(PetscObjectComm((PetscObject) dm), cnt, indices, PETSC_OWN_POINTER, is);CHKERRQ(ierr);
222d724dfffSBarry Smith   }
223d724dfffSBarry Smith   PetscFunctionReturn(0);
224d724dfffSBarry Smith }
225d724dfffSBarry Smith 
22616621825SDmitry Karpeev PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len,char ***namelist, IS **islist, DM **dmlist)
2271c3fb106SBarry Smith {
2281c3fb106SBarry Smith   PetscInt       i;
2291c3fb106SBarry Smith   PetscErrorCode ierr;
2301c3fb106SBarry Smith   DM_DA          *dd = (DM_DA*)dm->data;
2311c3fb106SBarry Smith   PetscInt       dof = dd->w;
2321c3fb106SBarry Smith 
2331c3fb106SBarry Smith   PetscFunctionBegin;
234731c8d9eSDmitry Karpeev   if (len) *len = dof;
2351c3fb106SBarry Smith   if (islist) {
2361c3fb106SBarry Smith     Vec      v;
2371c3fb106SBarry Smith     PetscInt rstart,n;
2381c3fb106SBarry Smith 
2391c3fb106SBarry Smith     ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr);
2400298fd71SBarry Smith     ierr = VecGetOwnershipRange(v,&rstart,NULL);CHKERRQ(ierr);
2411c3fb106SBarry Smith     ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr);
2421c3fb106SBarry Smith     ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr);
243785e854fSJed Brown     ierr = PetscMalloc1(dof,islist);CHKERRQ(ierr);
2441c3fb106SBarry Smith     for (i=0; i<dof; i++) {
245ce94432eSBarry Smith       ierr = ISCreateStride(PetscObjectComm((PetscObject)dm),n/dof,rstart+i,dof,&(*islist)[i]);CHKERRQ(ierr);
2461c3fb106SBarry Smith     }
2471c3fb106SBarry Smith   }
2481c3fb106SBarry Smith   if (namelist) {
249785e854fSJed Brown     ierr = PetscMalloc1(dof, namelist);CHKERRQ(ierr);
2501c3fb106SBarry Smith     if (dd->fieldname) {
2511c3fb106SBarry Smith       for (i=0; i<dof; i++) {
2521c3fb106SBarry Smith         ierr = PetscStrallocpy(dd->fieldname[i],&(*namelist)[i]);CHKERRQ(ierr);
2531c3fb106SBarry Smith       }
2541c3fb106SBarry Smith     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Currently DMDA must have fieldnames");
2551c3fb106SBarry Smith   }
2561c3fb106SBarry Smith   if (dmlist) {
2571c3fb106SBarry Smith     DM da;
2581c3fb106SBarry Smith 
259ce94432eSBarry Smith     ierr = DMDACreate(PetscObjectComm((PetscObject)dm), &da);CHKERRQ(ierr);
2601cced630SBarry Smith     ierr = DMSetDimension(da, dm->dim);CHKERRQ(ierr);
2611c3fb106SBarry Smith     ierr = DMDASetSizes(da, dd->M, dd->N, dd->P);CHKERRQ(ierr);
2621c3fb106SBarry Smith     ierr = DMDASetNumProcs(da, dd->m, dd->n, dd->p);CHKERRQ(ierr);
2631c3fb106SBarry Smith     ierr = DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz);CHKERRQ(ierr);
2641c3fb106SBarry Smith     ierr = DMDASetDof(da, 1);CHKERRQ(ierr);
2651c3fb106SBarry Smith     ierr = DMDASetStencilType(da, dd->stencil_type);CHKERRQ(ierr);
2661c3fb106SBarry Smith     ierr = DMDASetStencilWidth(da, dd->s);CHKERRQ(ierr);
2671c3fb106SBarry Smith     ierr = DMSetUp(da);CHKERRQ(ierr);
268785e854fSJed Brown     ierr = PetscMalloc1(dof,dmlist);CHKERRQ(ierr);
269c893992eSBarry Smith     for (i=0; i<dof-1; i++) {ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);}
2701c3fb106SBarry Smith     for (i=0; i<dof; i++) (*dmlist)[i] = da;
2711c3fb106SBarry Smith   }
2721c3fb106SBarry Smith   PetscFunctionReturn(0);
2731c3fb106SBarry Smith }
2741c3fb106SBarry Smith 
27538221697SMatthew G. Knepley PetscErrorCode DMClone_DA(DM dm, DM *newdm)
27638221697SMatthew G. Knepley {
27738221697SMatthew G. Knepley   DM_DA         *da = (DM_DA *) dm->data;
27838221697SMatthew G. Knepley   PetscErrorCode ierr;
27938221697SMatthew G. Knepley 
28038221697SMatthew G. Knepley   PetscFunctionBegin;
2814271099bSMatthew G. Knepley   ierr = DMSetType(*newdm, DMDA);CHKERRQ(ierr);
282c73cfb54SMatthew G. Knepley   ierr = DMSetDimension(*newdm, dm->dim);CHKERRQ(ierr);
2834271099bSMatthew G. Knepley   ierr = DMDASetSizes(*newdm, da->M, da->N, da->P);CHKERRQ(ierr);
2844271099bSMatthew G. Knepley   ierr = DMDASetNumProcs(*newdm, da->m, da->n, da->p);CHKERRQ(ierr);
2854271099bSMatthew G. Knepley   ierr = DMDASetBoundaryType(*newdm, da->bx, da->by, da->bz);CHKERRQ(ierr);
2864271099bSMatthew G. Knepley   ierr = DMDASetDof(*newdm, da->w);CHKERRQ(ierr);
2874271099bSMatthew G. Knepley   ierr = DMDASetStencilType(*newdm, da->stencil_type);CHKERRQ(ierr);
2884271099bSMatthew G. Knepley   ierr = DMDASetStencilWidth(*newdm, da->s);CHKERRQ(ierr);
2894271099bSMatthew G. Knepley   ierr = DMDASetOwnershipRanges(*newdm, da->lx, da->ly, da->lz);CHKERRQ(ierr);
290a9811db3SMatthew G. Knepley   ierr = DMSetUp(*newdm);CHKERRQ(ierr);
29138221697SMatthew G. Knepley   PetscFunctionReturn(0);
29238221697SMatthew G. Knepley }
29338221697SMatthew G. Knepley 
2944a7a4c06SLawrence Mitchell static PetscErrorCode DMHasCreateInjection_DA(DM dm, PetscBool *flg)
2954a7a4c06SLawrence Mitchell {
2964a7a4c06SLawrence Mitchell   DM_DA          *da = (DM_DA *)dm->data;
2974a7a4c06SLawrence Mitchell 
2984a7a4c06SLawrence Mitchell   PetscFunctionBegin;
2994a7a4c06SLawrence Mitchell   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
300534a8f05SLisandro Dalcin   PetscValidBoolPointer(flg,2);
301131f56ebSLawrence Mitchell   *flg = da->interptype == DMDA_Q1 ? PETSC_TRUE : PETSC_FALSE;
3024a7a4c06SLawrence Mitchell   PetscFunctionReturn(0);
3034a7a4c06SLawrence Mitchell }
3044a7a4c06SLawrence Mitchell 
305793f3fe5SMatthew G. Knepley static PetscErrorCode DMGetDimPoints_DA(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd)
306793f3fe5SMatthew G. Knepley {
307793f3fe5SMatthew G. Knepley   PetscErrorCode ierr;
308793f3fe5SMatthew G. Knepley 
309793f3fe5SMatthew G. Knepley   PetscFunctionBegin;
310793f3fe5SMatthew G. Knepley   ierr = DMDAGetDepthStratum(dm, dim, pStart, pEnd);CHKERRQ(ierr);
311793f3fe5SMatthew G. Knepley   PetscFunctionReturn(0);
312793f3fe5SMatthew G. Knepley }
313793f3fe5SMatthew G. Knepley 
314502a2867SDave May static PetscErrorCode DMGetNeighbors_DA(DM dm, PetscInt *nranks, const PetscMPIInt *ranks[])
315502a2867SDave May {
316502a2867SDave May   PetscErrorCode ierr;
317502a2867SDave May   PetscInt dim;
318502a2867SDave May   DMDAStencilType st;
319502a2867SDave May 
320502a2867SDave May   PetscFunctionBegin;
321502a2867SDave May   ierr = DMDAGetNeighbors(dm,ranks);CHKERRQ(ierr);
322502a2867SDave May   ierr = DMDAGetInfo(dm,&dim,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&st);CHKERRQ(ierr);
323502a2867SDave May 
324502a2867SDave May   switch (dim) {
325502a2867SDave May     case 1:
326502a2867SDave May       *nranks = 3;
327d2ebda5dSSatish Balay       /* if (st == DMDA_STENCIL_STAR) { *nranks = 3; } */
328502a2867SDave May       break;
329502a2867SDave May     case 2:
330502a2867SDave May       *nranks = 9;
331d2ebda5dSSatish Balay       /* if (st == DMDA_STENCIL_STAR) { *nranks = 5; } */
332502a2867SDave May       break;
333502a2867SDave May     case 3:
334502a2867SDave May       *nranks = 27;
335d2ebda5dSSatish Balay       /* if (st == DMDA_STENCIL_STAR) { *nranks = 7; } */
336502a2867SDave May       break;
337502a2867SDave May     default:
338502a2867SDave May       break;
339502a2867SDave May   }
340502a2867SDave May   PetscFunctionReturn(0);
341502a2867SDave May }
342502a2867SDave May 
3433efe6655SBarry Smith /*MC
3443efe6655SBarry Smith    DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions.
3453efe6655SBarry Smith          In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points.
3463efe6655SBarry Smith          In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width.
3473efe6655SBarry Smith 
3483efe6655SBarry Smith          The vectors can be thought of as either cell centered or vertex centered on the mesh. But some variables cannot be cell centered and others
3493bd220d7SPatrick Sanan          vertex centered; see the documentation for DMSTAG, a similar DM implementation which supports these staggered grids.
3503efe6655SBarry Smith 
3513efe6655SBarry Smith   Level: intermediate
3523efe6655SBarry Smith 
3533bd220d7SPatrick Sanan .seealso: DMType, DMCOMPOSITE, DMSTAG, DMDACreate(), DMCreate(), DMSetType()
3543efe6655SBarry Smith M*/
3553efe6655SBarry Smith 
35605264a50SDave May extern PetscErrorCode DMLocatePoints_DA_Regular(DM,Vec,DMPointLocationType,PetscSF);
3578135c375SStefano Zampini PETSC_INTERN PetscErrorCode DMSetUpGLVisViewer_DMDA(PetscObject,PetscViewer);
3581c3fb106SBarry Smith 
3598cc058d9SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_DA(DM da)
36047c6ae99SBarry Smith {
36147c6ae99SBarry Smith   PetscErrorCode ierr;
36247c6ae99SBarry Smith   DM_DA          *dd;
36347c6ae99SBarry Smith 
36447c6ae99SBarry Smith   PetscFunctionBegin;
365a4121054SBarry Smith   PetscValidPointer(da,1);
366b00a9115SJed Brown   ierr     = PetscNewLog(da,&dd);CHKERRQ(ierr);
367a4121054SBarry Smith   da->data = dd;
36847c6ae99SBarry Smith 
369c73cfb54SMatthew G. Knepley   da->dim        = -1;
370aa219208SBarry Smith   dd->interptype = DMDA_Q1;
37147c6ae99SBarry Smith   dd->refine_x   = 2;
37247c6ae99SBarry Smith   dd->refine_y   = 2;
37347c6ae99SBarry Smith   dd->refine_z   = 2;
37481c108dcSJed Brown   dd->coarsen_x  = 2;
37581c108dcSJed Brown   dd->coarsen_y  = 2;
37681c108dcSJed Brown   dd->coarsen_z  = 2;
3770298fd71SBarry Smith   dd->fieldname  = NULL;
37847c6ae99SBarry Smith   dd->nlocal     = -1;
37947c6ae99SBarry Smith   dd->Nlocal     = -1;
38047c6ae99SBarry Smith   dd->M          = -1;
38147c6ae99SBarry Smith   dd->N          = -1;
38247c6ae99SBarry Smith   dd->P          = -1;
38347c6ae99SBarry Smith   dd->m          = -1;
38447c6ae99SBarry Smith   dd->n          = -1;
38547c6ae99SBarry Smith   dd->p          = -1;
38647c6ae99SBarry Smith   dd->w          = -1;
38747c6ae99SBarry Smith   dd->s          = -1;
3888865f1eaSKarl Rupp 
38947c6ae99SBarry Smith   dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1;
39047c6ae99SBarry Smith   dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1;
39147c6ae99SBarry Smith 
3923e7870d2SPeter Brune   dd->Nsub            = 1;
3937ddda789SPeter Brune   dd->xol             = 0;
3947ddda789SPeter Brune   dd->yol             = 0;
3957ddda789SPeter Brune   dd->zol             = 0;
396d886c4f4SPeter Brune   dd->xo              = 0;
397d886c4f4SPeter Brune   dd->yo              = 0;
398d886c4f4SPeter Brune   dd->zo              = 0;
399e30e807fSPeter Brune   dd->Mo              = -1;
400e30e807fSPeter Brune   dd->No              = -1;
401e30e807fSPeter Brune   dd->Po              = -1;
40288661749SPeter Brune 
4030298fd71SBarry Smith   dd->gtol         = NULL;
4040298fd71SBarry Smith   dd->ltol         = NULL;
4050298fd71SBarry Smith   dd->ao           = NULL;
4069db3d8bcSStefano Zampini   PetscStrallocpy(AOBASIC,(char**)&dd->aotype);
40747c6ae99SBarry Smith   dd->base         = -1;
408bff4a2f0SMatthew G. Knepley   dd->bx           = DM_BOUNDARY_NONE;
409bff4a2f0SMatthew G. Knepley   dd->by           = DM_BOUNDARY_NONE;
410bff4a2f0SMatthew G. Knepley   dd->bz           = DM_BOUNDARY_NONE;
411aa219208SBarry Smith   dd->stencil_type = DMDA_STENCIL_BOX;
412aa219208SBarry Smith   dd->interptype   = DMDA_Q1;
4130298fd71SBarry Smith   dd->lx           = NULL;
4140298fd71SBarry Smith   dd->ly           = NULL;
4150298fd71SBarry Smith   dd->lz           = NULL;
41647c6ae99SBarry Smith 
417454e267fSLisandro Dalcin   dd->elementtype = DMDA_ELEMENT_Q1;
418454e267fSLisandro Dalcin 
419a4121054SBarry Smith   da->ops->globaltolocalbegin          = DMGlobalToLocalBegin_DA;
420a4121054SBarry Smith   da->ops->globaltolocalend            = DMGlobalToLocalEnd_DA;
421a4121054SBarry Smith   da->ops->localtoglobalbegin          = DMLocalToGlobalBegin_DA;
422a4121054SBarry Smith   da->ops->localtoglobalend            = DMLocalToGlobalEnd_DA;
423d78e899eSRichard Tran Mills   da->ops->localtolocalbegin           = DMLocalToLocalBegin_DA;
424d78e899eSRichard Tran Mills   da->ops->localtolocalend             = DMLocalToLocalEnd_DA;
425a4121054SBarry Smith   da->ops->createglobalvector          = DMCreateGlobalVector_DA;
426a4121054SBarry Smith   da->ops->createlocalvector           = DMCreateLocalVector_DA;
42725296bd5SBarry Smith   da->ops->createinterpolation         = DMCreateInterpolation_DA;
428e727c939SJed Brown   da->ops->getcoloring                 = DMCreateColoring_DA;
42925296bd5SBarry Smith   da->ops->creatematrix                = DMCreateMatrix_DA;
430a4121054SBarry Smith   da->ops->refine                      = DMRefine_DA;
431a4121054SBarry Smith   da->ops->coarsen                     = DMCoarsen_DA;
432a4121054SBarry Smith   da->ops->refinehierarchy             = DMRefineHierarchy_DA;
433a4121054SBarry Smith   da->ops->coarsenhierarchy            = DMCoarsenHierarchy_DA;
4345a84ad33SLisandro Dalcin   da->ops->createinjection             = DMCreateInjection_DA;
4354a7a4c06SLawrence Mitchell   da->ops->hascreateinjection          = DMHasCreateInjection_DA;
436a4121054SBarry Smith   da->ops->destroy                     = DMDestroy_DA;
437*ea78f98cSLisandro Dalcin   da->ops->view                        = NULL;
438a4121054SBarry Smith   da->ops->setfromoptions              = DMSetFromOptions_DA;
439a4121054SBarry Smith   da->ops->setup                       = DMSetUp_DA;
44038221697SMatthew G. Knepley   da->ops->clone                       = DMClone_DA;
441b859378eSBarry Smith   da->ops->load                        = DMLoad_DA;
4426636e97aSMatthew G Knepley   da->ops->createcoordinatedm          = DMCreateCoordinateDM_DA;
443d724dfffSBarry Smith   da->ops->createsubdm                 = DMCreateSubDM_DA;
44416621825SDmitry Karpeev   da->ops->createfielddecomposition    = DMCreateFieldDecomposition_DA;
445e30e807fSPeter Brune   da->ops->createdomaindecomposition   = DMCreateDomainDecomposition_DA;
446e30e807fSPeter Brune   da->ops->createddscatters            = DMCreateDomainDecompositionScatters_DA;
447793f3fe5SMatthew G. Knepley   da->ops->getdimpoints                = DMGetDimPoints_DA;
448502a2867SDave May   da->ops->getneighbors                = DMGetNeighbors_DA;
44905264a50SDave May   da->ops->locatepoints                = DMLocatePoints_DA_Regular;
4507c3cd84eSPatrick Sanan   da->ops->getcompatibility            = DMGetCompatibility_DA;
4518135c375SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)da,"DMSetUpGLVisViewer_C",DMSetUpGLVisViewer_DMDA);CHKERRQ(ierr);
452a4121054SBarry Smith   PetscFunctionReturn(0);
453a4121054SBarry Smith }
45447c6ae99SBarry Smith 
455a4121054SBarry Smith /*@
456a4121054SBarry Smith   DMDACreate - Creates a DMDA object.
457a4121054SBarry Smith 
4585edebc4bSPatrick Sanan   Collective
459a4121054SBarry Smith 
460a4121054SBarry Smith   Input Parameter:
461a4121054SBarry Smith . comm - The communicator for the DMDA object
462a4121054SBarry Smith 
463a4121054SBarry Smith   Output Parameter:
464a4121054SBarry Smith . da  - The DMDA object
465a4121054SBarry Smith 
466e0f5d30fSBarry Smith   Level: advanced
467e0f5d30fSBarry Smith 
4685edebc4bSPatrick Sanan   Developers Note:
4695edebc4bSPatrick Sanan   Since there exists DMDACreate1/2/3d() should this routine even exist?
470a4121054SBarry Smith 
4715edebc4bSPatrick Sanan .seealso:  DMDASetSizes(), DMClone(),  DMDACreate1d(), DMDACreate2d(), DMDACreate3d()
472a4121054SBarry Smith @*/
4737087cfbeSBarry Smith PetscErrorCode  DMDACreate(MPI_Comm comm, DM *da)
474a4121054SBarry Smith {
475a4121054SBarry Smith   PetscErrorCode ierr;
476a4121054SBarry Smith 
477a4121054SBarry Smith   PetscFunctionBegin;
478a4121054SBarry Smith   PetscValidPointer(da,2);
479a4121054SBarry Smith   ierr = DMCreate(comm,da);CHKERRQ(ierr);
480a4121054SBarry Smith   ierr = DMSetType(*da,DMDA);CHKERRQ(ierr);
48147c6ae99SBarry Smith   PetscFunctionReturn(0);
48247c6ae99SBarry Smith }
483b859378eSBarry Smith 
484b859378eSBarry Smith 
485