xref: /petsc/src/dm/impls/da/dacreate.c (revision 792b654f27c3f98f26c08906a9622a869ea02fb9)
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);
19897f7067SBarry Smith   ierr = PetscOptionsInt("-da_grid_x","Number of grid points in x direction","DMDASetSizes",dd->M,&dd->M,NULL);CHKERRQ(ierr);
20897f7067SBarry Smith   ierr = PetscOptionsInt("-da_grid_y","Number of grid points in y direction","DMDASetSizes",dd->N,&dd->N,NULL);CHKERRQ(ierr);
21897f7067SBarry Smith   ierr = PetscOptionsInt("-da_grid_z","Number of grid points in z direction","DMDASetSizes",dd->P,&dd->P,NULL);CHKERRQ(ierr);
227ddda789SPeter Brune 
237ddda789SPeter Brune   ierr = PetscOptionsInt("-da_overlap","Decomposition overlap in all directions","DMDASetOverlap",dd->xol,&dd->xol,&flg);CHKERRQ(ierr);
247ddda789SPeter Brune   if (flg) {ierr = DMDASetOverlap(da,dd->xol,dd->xol,dd->xol);CHKERRQ(ierr);}
257ddda789SPeter Brune   ierr = PetscOptionsInt("-da_overlap_x","Decomposition overlap in x direction","DMDASetOverlap",dd->xol,&dd->xol,NULL);CHKERRQ(ierr);
26c73cfb54SMatthew G. Knepley   if (dim > 1) {ierr = PetscOptionsInt("-da_overlap_y","Decomposition overlap in y direction","DMDASetOverlap",dd->yol,&dd->yol,NULL);CHKERRQ(ierr);}
27c73cfb54SMatthew G. Knepley   if (dim > 2) {ierr = PetscOptionsInt("-da_overlap_z","Decomposition overlap in z direction","DMDASetOverlap",dd->zol,&dd->zol,NULL);CHKERRQ(ierr);}
283e7870d2SPeter Brune 
293e7870d2SPeter Brune   ierr = PetscOptionsInt("-da_local_subdomains","","DMDASetNumLocalSubdomains",dd->Nsub,&dd->Nsub,&flg);CHKERRQ(ierr);
303e7870d2SPeter Brune   if (flg) {ierr = DMDASetNumLocalSubDomains(da,dd->Nsub);CHKERRQ(ierr);}
313e7870d2SPeter Brune 
328d07fd27SPatrick Sanan   /* Handle DMDA parallel distribution */
330298fd71SBarry Smith   ierr = PetscOptionsInt("-da_processors_x","Number of processors in x direction","DMDASetNumProcs",dd->m,&dd->m,NULL);CHKERRQ(ierr);
34c73cfb54SMatthew G. Knepley   if (dim > 1) {ierr = PetscOptionsInt("-da_processors_y","Number of processors in y direction","DMDASetNumProcs",dd->n,&dd->n,NULL);CHKERRQ(ierr);}
35c73cfb54SMatthew G. Knepley   if (dim > 2) {ierr = PetscOptionsInt("-da_processors_z","Number of processors in z direction","DMDASetNumProcs",dd->p,&dd->p,NULL);CHKERRQ(ierr);}
36aa219208SBarry Smith   /* Handle DMDA refinement */
370298fd71SBarry Smith   ierr = PetscOptionsInt("-da_refine_x","Refinement ratio in x direction","DMDASetRefinementFactor",dd->refine_x,&dd->refine_x,NULL);CHKERRQ(ierr);
38c73cfb54SMatthew G. Knepley   if (dim > 1) {ierr = PetscOptionsInt("-da_refine_y","Refinement ratio in y direction","DMDASetRefinementFactor",dd->refine_y,&dd->refine_y,NULL);CHKERRQ(ierr);}
39c73cfb54SMatthew G. Knepley   if (dim > 2) {ierr = PetscOptionsInt("-da_refine_z","Refinement ratio in z direction","DMDASetRefinementFactor",dd->refine_z,&dd->refine_z,NULL);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);
55897f7067SBarry Smith     ierr = PetscMemcpy(dd->refine_x_hier,refx,n*sizeof(PetscInt));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);
64897f7067SBarry Smith       ierr = PetscMemcpy(dd->refine_y_hier,refy,n*sizeof(PetscInt));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);
74897f7067SBarry Smith       ierr = PetscMemcpy(dd->refine_z_hier,refz,n*sizeof(PetscInt));CHKERRQ(ierr);
75897f7067SBarry Smith     }
76397b6216SJed Brown   }
77397b6216SJed Brown 
78897f7067SBarry Smith   ierr = PetscOptionsInt("-da_refine","Uniformly refine DA one or more times","None",refine,&refine,NULL);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*);
129e727c939SJed Brown extern PetscErrorCode  DMCreateAggregates_DA(DM,DM,Mat*);
1307087cfbeSBarry Smith extern PetscErrorCode  DMView_DA(DM,PetscViewer);
1317087cfbeSBarry Smith extern PetscErrorCode  DMSetUp_DA(DM);
1327087cfbeSBarry Smith extern PetscErrorCode  DMDestroy_DA(DM);
133e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecomposition_DA(DM,PetscInt*,char***,IS**,IS**,DM**);
134e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecompositionScatters_DA(DM,PetscInt,DM*,VecScatter**,VecScatter**,VecScatter**);
1357c3cd84eSPatrick Sanan PETSC_INTERN PetscErrorCode DMGetCompatibility_DA(DM,DM,PetscBool*,PetscBool*);
1369a42bb27SBarry Smith 
137b859378eSBarry Smith PetscErrorCode DMLoad_DA(DM da,PetscViewer viewer)
138b859378eSBarry Smith {
139b859378eSBarry Smith   PetscErrorCode   ierr;
140060da220SMatthew G. Knepley   PetscInt         dim,m,n,p,dof,swidth;
141b859378eSBarry Smith   DMDAStencilType  stencil;
142bff4a2f0SMatthew G. Knepley   DMBoundaryType   bx,by,bz;
143bc2bf880SBarry Smith   PetscBool        coors;
144bc2bf880SBarry Smith   DM               dac;
145bc2bf880SBarry Smith   Vec              c;
146b859378eSBarry Smith 
147b859378eSBarry Smith   PetscFunctionBegin;
148060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&dim,1,NULL,PETSC_INT);CHKERRQ(ierr);
149060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&m,1,NULL,PETSC_INT);CHKERRQ(ierr);
150060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&n,1,NULL,PETSC_INT);CHKERRQ(ierr);
151060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&p,1,NULL,PETSC_INT);CHKERRQ(ierr);
152060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&dof,1,NULL,PETSC_INT);CHKERRQ(ierr);
153060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&swidth,1,NULL,PETSC_INT);CHKERRQ(ierr);
154060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&bx,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
155060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&by,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
156060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&bz,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
157060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&stencil,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
158b859378eSBarry Smith 
159c73cfb54SMatthew G. Knepley   ierr = DMSetDimension(da, dim);CHKERRQ(ierr);
160bc2bf880SBarry Smith   ierr = DMDASetSizes(da, m,n,p);CHKERRQ(ierr);
161b859378eSBarry Smith   ierr = DMDASetBoundaryType(da, bx, by, bz);CHKERRQ(ierr);
162b859378eSBarry Smith   ierr = DMDASetDof(da, dof);CHKERRQ(ierr);
163b859378eSBarry Smith   ierr = DMDASetStencilType(da, stencil);CHKERRQ(ierr);
164b859378eSBarry Smith   ierr = DMDASetStencilWidth(da, swidth);CHKERRQ(ierr);
165b859378eSBarry Smith   ierr = DMSetUp(da);CHKERRQ(ierr);
166060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&coors,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
167bc2bf880SBarry Smith   if (coors) {
1686636e97aSMatthew G Knepley     ierr = DMGetCoordinateDM(da,&dac);CHKERRQ(ierr);
169bc2bf880SBarry Smith     ierr = DMCreateGlobalVector(dac,&c);CHKERRQ(ierr);
170bc2bf880SBarry Smith     ierr = VecLoad(c,viewer);CHKERRQ(ierr);
1716636e97aSMatthew G Knepley     ierr = DMSetCoordinates(da,c);CHKERRQ(ierr);
172bc2bf880SBarry Smith     ierr = VecDestroy(&c);CHKERRQ(ierr);
173bc2bf880SBarry Smith   }
174b859378eSBarry Smith   PetscFunctionReturn(0);
175b859378eSBarry Smith }
176b859378eSBarry Smith 
177276c5506SMatthew G. Knepley PetscErrorCode DMCreateSubDM_DA(DM dm, PetscInt numFields, const PetscInt fields[], IS *is, DM *subdm)
178d724dfffSBarry Smith {
179d724dfffSBarry Smith   DM_DA         *da = (DM_DA*) dm->data;
1804d9407bcSMatthew G. Knepley   PetscSection   section;
1814d9407bcSMatthew G. Knepley   PetscErrorCode ierr;
182d724dfffSBarry Smith 
183d724dfffSBarry Smith   PetscFunctionBegin;
184d724dfffSBarry Smith   if (subdm) {
185c38c1269SMatthew G. Knepley     PetscSF sf;
186c38c1269SMatthew G. Knepley     Vec     coords;
187c38c1269SMatthew G. Knepley     void   *ctx;
188c38c1269SMatthew G. Knepley     /* Cannot use DMClone since the dof stuff is mixed in. Ugh
189c38c1269SMatthew G. Knepley     ierr = DMClone(dm, subdm);CHKERRQ(ierr); */
190c38c1269SMatthew G. Knepley     ierr = DMCreate(PetscObjectComm((PetscObject)dm), subdm);CHKERRQ(ierr);
191c38c1269SMatthew G. Knepley     ierr = DMGetPointSF(dm, &sf);CHKERRQ(ierr);
192c38c1269SMatthew G. Knepley     ierr = DMSetPointSF(*subdm, sf);CHKERRQ(ierr);
193c38c1269SMatthew G. Knepley     ierr = DMGetApplicationContext(dm, &ctx);CHKERRQ(ierr);
194c38c1269SMatthew G. Knepley     ierr = DMSetApplicationContext(*subdm, ctx);CHKERRQ(ierr);
195c38c1269SMatthew G. Knepley     ierr = DMGetCoordinatesLocal(dm, &coords);CHKERRQ(ierr);
196c38c1269SMatthew G. Knepley     if (coords) {
197c38c1269SMatthew G. Knepley       ierr = DMSetCoordinatesLocal(*subdm, coords);CHKERRQ(ierr);
198c38c1269SMatthew G. Knepley     } else {
199c38c1269SMatthew G. Knepley       ierr = DMGetCoordinates(dm, &coords);CHKERRQ(ierr);
200c38c1269SMatthew G. Knepley       if (coords) {ierr = DMSetCoordinates(*subdm, coords);CHKERRQ(ierr);}
201c38c1269SMatthew G. Knepley     }
202c38c1269SMatthew G. Knepley 
203c38c1269SMatthew G. Knepley     ierr = DMSetType(*subdm, DMDA);CHKERRQ(ierr);
204c73cfb54SMatthew G. Knepley     ierr = DMSetDimension(*subdm, dm->dim);CHKERRQ(ierr);
205c38c1269SMatthew G. Knepley     ierr = DMDASetSizes(*subdm, da->M, da->N, da->P);CHKERRQ(ierr);
206c38c1269SMatthew G. Knepley     ierr = DMDASetNumProcs(*subdm, da->m, da->n, da->p);CHKERRQ(ierr);
207c38c1269SMatthew G. Knepley     ierr = DMDASetBoundaryType(*subdm, da->bx, da->by, da->bz);CHKERRQ(ierr);
20838221697SMatthew G. Knepley     ierr = DMDASetDof(*subdm, numFields);CHKERRQ(ierr);
209c38c1269SMatthew G. Knepley     ierr = DMDASetStencilType(*subdm, da->stencil_type);CHKERRQ(ierr);
210c38c1269SMatthew G. Knepley     ierr = DMDASetStencilWidth(*subdm, da->s);CHKERRQ(ierr);
211c38c1269SMatthew G. Knepley     ierr = DMDASetOwnershipRanges(*subdm, da->lx, da->ly, da->lz);CHKERRQ(ierr);
212d724dfffSBarry Smith   }
213e87a4003SBarry Smith   ierr = DMGetSection(dm, &section);CHKERRQ(ierr);
2144d9407bcSMatthew G. Knepley   if (section) {
215*792b654fSMatthew G. Knepley     ierr = DMCreateSectionSubDM(dm, numFields, fields, is, subdm);CHKERRQ(ierr);
2164d9407bcSMatthew G. Knepley   } else {
217d724dfffSBarry Smith     if (is) {
218d724dfffSBarry Smith       PetscInt *indices, cnt = 0, dof = da->w, i, j;
21938221697SMatthew G. Knepley 
220785e854fSJed Brown       ierr = PetscMalloc1(da->Nlocal*numFields/dof, &indices);CHKERRQ(ierr);
22138221697SMatthew G. Knepley       for (i = da->base/dof; i < (da->base+da->Nlocal)/dof; ++i) {
22238221697SMatthew G. Knepley         for (j = 0; j < numFields; ++j) {
223d724dfffSBarry Smith           indices[cnt++] = dof*i + fields[j];
224d724dfffSBarry Smith         }
225d724dfffSBarry Smith       }
22638221697SMatthew G. Knepley       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);
22738221697SMatthew G. Knepley       ierr = ISCreateGeneral(PetscObjectComm((PetscObject) dm), cnt, indices, PETSC_OWN_POINTER, is);CHKERRQ(ierr);
228d724dfffSBarry Smith     }
229d724dfffSBarry Smith   }
230d724dfffSBarry Smith   PetscFunctionReturn(0);
231d724dfffSBarry Smith }
232d724dfffSBarry Smith 
23316621825SDmitry Karpeev PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len,char ***namelist, IS **islist, DM **dmlist)
2341c3fb106SBarry Smith {
2351c3fb106SBarry Smith   PetscInt       i;
2361c3fb106SBarry Smith   PetscErrorCode ierr;
2371c3fb106SBarry Smith   DM_DA          *dd = (DM_DA*)dm->data;
2381c3fb106SBarry Smith   PetscInt       dof = dd->w;
2391c3fb106SBarry Smith 
2401c3fb106SBarry Smith   PetscFunctionBegin;
241731c8d9eSDmitry Karpeev   if (len) *len = dof;
2421c3fb106SBarry Smith   if (islist) {
2431c3fb106SBarry Smith     Vec      v;
2441c3fb106SBarry Smith     PetscInt rstart,n;
2451c3fb106SBarry Smith 
2461c3fb106SBarry Smith     ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr);
2470298fd71SBarry Smith     ierr = VecGetOwnershipRange(v,&rstart,NULL);CHKERRQ(ierr);
2481c3fb106SBarry Smith     ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr);
2491c3fb106SBarry Smith     ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr);
250785e854fSJed Brown     ierr = PetscMalloc1(dof,islist);CHKERRQ(ierr);
2511c3fb106SBarry Smith     for (i=0; i<dof; i++) {
252ce94432eSBarry Smith       ierr = ISCreateStride(PetscObjectComm((PetscObject)dm),n/dof,rstart+i,dof,&(*islist)[i]);CHKERRQ(ierr);
2531c3fb106SBarry Smith     }
2541c3fb106SBarry Smith   }
2551c3fb106SBarry Smith   if (namelist) {
256785e854fSJed Brown     ierr = PetscMalloc1(dof, namelist);CHKERRQ(ierr);
2571c3fb106SBarry Smith     if (dd->fieldname) {
2581c3fb106SBarry Smith       for (i=0; i<dof; i++) {
2591c3fb106SBarry Smith         ierr = PetscStrallocpy(dd->fieldname[i],&(*namelist)[i]);CHKERRQ(ierr);
2601c3fb106SBarry Smith       }
2611c3fb106SBarry Smith     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Currently DMDA must have fieldnames");
2621c3fb106SBarry Smith   }
2631c3fb106SBarry Smith   if (dmlist) {
2641c3fb106SBarry Smith     DM da;
2651c3fb106SBarry Smith 
266ce94432eSBarry Smith     ierr = DMDACreate(PetscObjectComm((PetscObject)dm), &da);CHKERRQ(ierr);
2671cced630SBarry Smith     ierr = DMSetDimension(da, dm->dim);CHKERRQ(ierr);
2681c3fb106SBarry Smith     ierr = DMDASetSizes(da, dd->M, dd->N, dd->P);CHKERRQ(ierr);
2691c3fb106SBarry Smith     ierr = DMDASetNumProcs(da, dd->m, dd->n, dd->p);CHKERRQ(ierr);
2701c3fb106SBarry Smith     ierr = DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz);CHKERRQ(ierr);
2711c3fb106SBarry Smith     ierr = DMDASetDof(da, 1);CHKERRQ(ierr);
2721c3fb106SBarry Smith     ierr = DMDASetStencilType(da, dd->stencil_type);CHKERRQ(ierr);
2731c3fb106SBarry Smith     ierr = DMDASetStencilWidth(da, dd->s);CHKERRQ(ierr);
2741c3fb106SBarry Smith     ierr = DMSetUp(da);CHKERRQ(ierr);
275785e854fSJed Brown     ierr = PetscMalloc1(dof,dmlist);CHKERRQ(ierr);
276c893992eSBarry Smith     for (i=0; i<dof-1; i++) {ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);}
2771c3fb106SBarry Smith     for (i=0; i<dof; i++) (*dmlist)[i] = da;
2781c3fb106SBarry Smith   }
2791c3fb106SBarry Smith   PetscFunctionReturn(0);
2801c3fb106SBarry Smith }
2811c3fb106SBarry Smith 
28238221697SMatthew G. Knepley PetscErrorCode DMClone_DA(DM dm, DM *newdm)
28338221697SMatthew G. Knepley {
28438221697SMatthew G. Knepley   DM_DA         *da = (DM_DA *) dm->data;
28538221697SMatthew G. Knepley   PetscErrorCode ierr;
28638221697SMatthew G. Knepley 
28738221697SMatthew G. Knepley   PetscFunctionBegin;
2884271099bSMatthew G. Knepley   ierr = DMSetType(*newdm, DMDA);CHKERRQ(ierr);
289c73cfb54SMatthew G. Knepley   ierr = DMSetDimension(*newdm, dm->dim);CHKERRQ(ierr);
2904271099bSMatthew G. Knepley   ierr = DMDASetSizes(*newdm, da->M, da->N, da->P);CHKERRQ(ierr);
2914271099bSMatthew G. Knepley   ierr = DMDASetNumProcs(*newdm, da->m, da->n, da->p);CHKERRQ(ierr);
2924271099bSMatthew G. Knepley   ierr = DMDASetBoundaryType(*newdm, da->bx, da->by, da->bz);CHKERRQ(ierr);
2934271099bSMatthew G. Knepley   ierr = DMDASetDof(*newdm, da->w);CHKERRQ(ierr);
2944271099bSMatthew G. Knepley   ierr = DMDASetStencilType(*newdm, da->stencil_type);CHKERRQ(ierr);
2954271099bSMatthew G. Knepley   ierr = DMDASetStencilWidth(*newdm, da->s);CHKERRQ(ierr);
2964271099bSMatthew G. Knepley   ierr = DMDASetOwnershipRanges(*newdm, da->lx, da->ly, da->lz);CHKERRQ(ierr);
297a9811db3SMatthew G. Knepley   ierr = DMSetUp(*newdm);CHKERRQ(ierr);
29838221697SMatthew G. Knepley   PetscFunctionReturn(0);
29938221697SMatthew G. Knepley }
30038221697SMatthew G. Knepley 
3014a7a4c06SLawrence Mitchell static PetscErrorCode DMHasCreateInjection_DA(DM dm, PetscBool *flg)
3024a7a4c06SLawrence Mitchell {
3034a7a4c06SLawrence Mitchell   DM_DA          *da = (DM_DA *)dm->data;
3044a7a4c06SLawrence Mitchell 
3054a7a4c06SLawrence Mitchell   PetscFunctionBegin;
3064a7a4c06SLawrence Mitchell   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3074a7a4c06SLawrence Mitchell   PetscValidPointer(flg,2);
308131f56ebSLawrence Mitchell   *flg = da->interptype == DMDA_Q1 ? PETSC_TRUE : PETSC_FALSE;
3094a7a4c06SLawrence Mitchell   PetscFunctionReturn(0);
3104a7a4c06SLawrence Mitchell }
3114a7a4c06SLawrence Mitchell 
312793f3fe5SMatthew G. Knepley static PetscErrorCode DMGetDimPoints_DA(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd)
313793f3fe5SMatthew G. Knepley {
314793f3fe5SMatthew G. Knepley   PetscErrorCode ierr;
315793f3fe5SMatthew G. Knepley 
316793f3fe5SMatthew G. Knepley   PetscFunctionBegin;
317793f3fe5SMatthew G. Knepley   ierr = DMDAGetDepthStratum(dm, dim, pStart, pEnd);CHKERRQ(ierr);
318793f3fe5SMatthew G. Knepley   PetscFunctionReturn(0);
319793f3fe5SMatthew G. Knepley }
320793f3fe5SMatthew G. Knepley 
321502a2867SDave May static PetscErrorCode DMGetNeighbors_DA(DM dm, PetscInt *nranks, const PetscMPIInt *ranks[])
322502a2867SDave May {
323502a2867SDave May   PetscErrorCode ierr;
324502a2867SDave May   PetscInt dim;
325502a2867SDave May   DMDAStencilType st;
326502a2867SDave May 
327502a2867SDave May   PetscFunctionBegin;
328502a2867SDave May   ierr = DMDAGetNeighbors(dm,ranks);CHKERRQ(ierr);
329502a2867SDave May   ierr = DMDAGetInfo(dm,&dim,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&st);CHKERRQ(ierr);
330502a2867SDave May 
331502a2867SDave May   switch (dim) {
332502a2867SDave May     case 1:
333502a2867SDave May       *nranks = 3;
334d2ebda5dSSatish Balay       /* if (st == DMDA_STENCIL_STAR) { *nranks = 3; } */
335502a2867SDave May       break;
336502a2867SDave May     case 2:
337502a2867SDave May       *nranks = 9;
338d2ebda5dSSatish Balay       /* if (st == DMDA_STENCIL_STAR) { *nranks = 5; } */
339502a2867SDave May       break;
340502a2867SDave May     case 3:
341502a2867SDave May       *nranks = 27;
342d2ebda5dSSatish Balay       /* if (st == DMDA_STENCIL_STAR) { *nranks = 7; } */
343502a2867SDave May       break;
344502a2867SDave May     default:
345502a2867SDave May       break;
346502a2867SDave May   }
347502a2867SDave May   PetscFunctionReturn(0);
348502a2867SDave May }
349502a2867SDave May 
3503efe6655SBarry Smith /*MC
3513efe6655SBarry Smith    DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions.
3523efe6655SBarry Smith          In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points.
3533efe6655SBarry Smith          In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width.
3543efe6655SBarry Smith 
3553efe6655SBarry 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
3563efe6655SBarry Smith          vertex centered.
3573efe6655SBarry Smith 
3583efe6655SBarry Smith   Level: intermediate
3593efe6655SBarry Smith 
3603efe6655SBarry Smith .seealso: DMType, DMCOMPOSITE, DMDACreate(), DMCreate(), DMSetType()
3613efe6655SBarry Smith M*/
3623efe6655SBarry Smith 
3639f52d53eSToby Isaac extern PetscErrorCode DMProjectFunctionLocal_DA(DM, PetscReal, PetscErrorCode (**)(PetscInt, PetscReal, const PetscReal [], PetscInt, PetscScalar *, void *), void **, InsertMode, Vec);
3649f52d53eSToby Isaac extern PetscErrorCode DMComputeL2Diff_DA(DM, PetscReal, PetscErrorCode (**)(PetscInt, PetscReal, const PetscReal [], PetscInt, PetscScalar *, void *), void **, Vec, PetscReal *);
3659f52d53eSToby Isaac extern PetscErrorCode DMComputeL2GradientDiff_DA(DM, PetscReal, PetscErrorCode (**)(PetscInt, PetscReal, const PetscReal [], const PetscReal [],PetscInt, PetscScalar *, void *), void **, Vec,const PetscReal [], PetscReal *);
36605264a50SDave May extern PetscErrorCode DMLocatePoints_DA_Regular(DM,Vec,DMPointLocationType,PetscSF);
3678135c375SStefano Zampini PETSC_INTERN PetscErrorCode DMSetUpGLVisViewer_DMDA(PetscObject,PetscViewer);
3681c3fb106SBarry Smith 
3698cc058d9SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_DA(DM da)
37047c6ae99SBarry Smith {
37147c6ae99SBarry Smith   PetscErrorCode ierr;
37247c6ae99SBarry Smith   DM_DA          *dd;
37347c6ae99SBarry Smith 
37447c6ae99SBarry Smith   PetscFunctionBegin;
375a4121054SBarry Smith   PetscValidPointer(da,1);
376b00a9115SJed Brown   ierr     = PetscNewLog(da,&dd);CHKERRQ(ierr);
377a4121054SBarry Smith   da->data = dd;
37847c6ae99SBarry Smith 
379c73cfb54SMatthew G. Knepley   da->dim        = -1;
380aa219208SBarry Smith   dd->interptype = DMDA_Q1;
38147c6ae99SBarry Smith   dd->refine_x   = 2;
38247c6ae99SBarry Smith   dd->refine_y   = 2;
38347c6ae99SBarry Smith   dd->refine_z   = 2;
38481c108dcSJed Brown   dd->coarsen_x  = 2;
38581c108dcSJed Brown   dd->coarsen_y  = 2;
38681c108dcSJed Brown   dd->coarsen_z  = 2;
3870298fd71SBarry Smith   dd->fieldname  = NULL;
38847c6ae99SBarry Smith   dd->nlocal     = -1;
38947c6ae99SBarry Smith   dd->Nlocal     = -1;
39047c6ae99SBarry Smith   dd->M          = -1;
39147c6ae99SBarry Smith   dd->N          = -1;
39247c6ae99SBarry Smith   dd->P          = -1;
39347c6ae99SBarry Smith   dd->m          = -1;
39447c6ae99SBarry Smith   dd->n          = -1;
39547c6ae99SBarry Smith   dd->p          = -1;
39647c6ae99SBarry Smith   dd->w          = -1;
39747c6ae99SBarry Smith   dd->s          = -1;
3988865f1eaSKarl Rupp 
39947c6ae99SBarry Smith   dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1;
40047c6ae99SBarry Smith   dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1;
40147c6ae99SBarry Smith 
4023e7870d2SPeter Brune   dd->Nsub            = 1;
4037ddda789SPeter Brune   dd->xol             = 0;
4047ddda789SPeter Brune   dd->yol             = 0;
4057ddda789SPeter Brune   dd->zol             = 0;
406d886c4f4SPeter Brune   dd->xo              = 0;
407d886c4f4SPeter Brune   dd->yo              = 0;
408d886c4f4SPeter Brune   dd->zo              = 0;
409e30e807fSPeter Brune   dd->Mo              = -1;
410e30e807fSPeter Brune   dd->No              = -1;
411e30e807fSPeter Brune   dd->Po              = -1;
41288661749SPeter Brune 
4130298fd71SBarry Smith   dd->gtol         = NULL;
4140298fd71SBarry Smith   dd->ltol         = NULL;
4150298fd71SBarry Smith   dd->ao           = NULL;
4169db3d8bcSStefano Zampini   PetscStrallocpy(AOBASIC,(char**)&dd->aotype);
41747c6ae99SBarry Smith   dd->base         = -1;
418bff4a2f0SMatthew G. Knepley   dd->bx           = DM_BOUNDARY_NONE;
419bff4a2f0SMatthew G. Knepley   dd->by           = DM_BOUNDARY_NONE;
420bff4a2f0SMatthew G. Knepley   dd->bz           = DM_BOUNDARY_NONE;
421aa219208SBarry Smith   dd->stencil_type = DMDA_STENCIL_BOX;
422aa219208SBarry Smith   dd->interptype   = DMDA_Q1;
4230298fd71SBarry Smith   dd->lx           = NULL;
4240298fd71SBarry Smith   dd->ly           = NULL;
4250298fd71SBarry Smith   dd->lz           = NULL;
42647c6ae99SBarry Smith 
427454e267fSLisandro Dalcin   dd->elementtype = DMDA_ELEMENT_Q1;
428454e267fSLisandro Dalcin 
429a4121054SBarry Smith   da->ops->globaltolocalbegin          = DMGlobalToLocalBegin_DA;
430a4121054SBarry Smith   da->ops->globaltolocalend            = DMGlobalToLocalEnd_DA;
431a4121054SBarry Smith   da->ops->localtoglobalbegin          = DMLocalToGlobalBegin_DA;
432a4121054SBarry Smith   da->ops->localtoglobalend            = DMLocalToGlobalEnd_DA;
433d78e899eSRichard Tran Mills   da->ops->localtolocalbegin           = DMLocalToLocalBegin_DA;
434d78e899eSRichard Tran Mills   da->ops->localtolocalend             = DMLocalToLocalEnd_DA;
435a4121054SBarry Smith   da->ops->createglobalvector          = DMCreateGlobalVector_DA;
436a4121054SBarry Smith   da->ops->createlocalvector           = DMCreateLocalVector_DA;
43725296bd5SBarry Smith   da->ops->createinterpolation         = DMCreateInterpolation_DA;
438e727c939SJed Brown   da->ops->getcoloring                 = DMCreateColoring_DA;
43925296bd5SBarry Smith   da->ops->creatematrix                = DMCreateMatrix_DA;
440a4121054SBarry Smith   da->ops->refine                      = DMRefine_DA;
441a4121054SBarry Smith   da->ops->coarsen                     = DMCoarsen_DA;
442a4121054SBarry Smith   da->ops->refinehierarchy             = DMRefineHierarchy_DA;
443a4121054SBarry Smith   da->ops->coarsenhierarchy            = DMCoarsenHierarchy_DA;
444e727c939SJed Brown   da->ops->getinjection                = DMCreateInjection_DA;
4454a7a4c06SLawrence Mitchell   da->ops->hascreateinjection          = DMHasCreateInjection_DA;
446e727c939SJed Brown   da->ops->getaggregates               = DMCreateAggregates_DA;
447a4121054SBarry Smith   da->ops->destroy                     = DMDestroy_DA;
448a4121054SBarry Smith   da->ops->view                        = 0;
449a4121054SBarry Smith   da->ops->setfromoptions              = DMSetFromOptions_DA;
450a4121054SBarry Smith   da->ops->setup                       = DMSetUp_DA;
45138221697SMatthew G. Knepley   da->ops->clone                       = DMClone_DA;
452b859378eSBarry Smith   da->ops->load                        = DMLoad_DA;
4536636e97aSMatthew G Knepley   da->ops->createcoordinatedm          = DMCreateCoordinateDM_DA;
454d724dfffSBarry Smith   da->ops->createsubdm                 = DMCreateSubDM_DA;
45516621825SDmitry Karpeev   da->ops->createfielddecomposition    = DMCreateFieldDecomposition_DA;
456e30e807fSPeter Brune   da->ops->createdomaindecomposition   = DMCreateDomainDecomposition_DA;
457e30e807fSPeter Brune   da->ops->createddscatters            = DMCreateDomainDecompositionScatters_DA;
458793f3fe5SMatthew G. Knepley   da->ops->getdimpoints                = DMGetDimPoints_DA;
459c970b36aSToby Isaac   da->ops->projectfunctionlocal        = DMProjectFunctionLocal_DA;
460c970b36aSToby Isaac   da->ops->computel2diff               = DMComputeL2Diff_DA;
461b698f381SToby Isaac   da->ops->computel2gradientdiff       = DMComputeL2GradientDiff_DA;
462502a2867SDave May   da->ops->getneighbors                = DMGetNeighbors_DA;
46305264a50SDave May   da->ops->locatepoints                = DMLocatePoints_DA_Regular;
4647c3cd84eSPatrick Sanan   da->ops->getcompatibility            = DMGetCompatibility_DA;
4658135c375SStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)da,"DMSetUpGLVisViewer_C",DMSetUpGLVisViewer_DMDA);CHKERRQ(ierr);
466a4121054SBarry Smith   PetscFunctionReturn(0);
467a4121054SBarry Smith }
46847c6ae99SBarry Smith 
469a4121054SBarry Smith /*@
470a4121054SBarry Smith   DMDACreate - Creates a DMDA object.
471a4121054SBarry Smith 
472a4121054SBarry Smith   Collective on MPI_Comm
473a4121054SBarry Smith 
474a4121054SBarry Smith   Input Parameter:
475a4121054SBarry Smith . comm - The communicator for the DMDA object
476a4121054SBarry Smith 
477a4121054SBarry Smith   Output Parameter:
478a4121054SBarry Smith . da  - The DMDA object
479a4121054SBarry Smith 
480e0f5d30fSBarry Smith   Level: advanced
481e0f5d30fSBarry Smith 
482e0f5d30fSBarry Smith   Developers Note: Since there exists DMDACreate1/2/3d() should this routine even exist?
483a4121054SBarry Smith 
484a4121054SBarry Smith .keywords: DMDA, create
485e0f5d30fSBarry Smith .seealso:  DMDASetSizes(), DMDADuplicate(),  DMDACreate1d(), DMDACreate2d(), DMDACreate3d()
486a4121054SBarry Smith @*/
4877087cfbeSBarry Smith PetscErrorCode  DMDACreate(MPI_Comm comm, DM *da)
488a4121054SBarry Smith {
489a4121054SBarry Smith   PetscErrorCode ierr;
490a4121054SBarry Smith 
491a4121054SBarry Smith   PetscFunctionBegin;
492a4121054SBarry Smith   PetscValidPointer(da,2);
493a4121054SBarry Smith   ierr = DMCreate(comm,da);CHKERRQ(ierr);
494a4121054SBarry Smith   ierr = DMSetType(*da,DMDA);CHKERRQ(ierr);
49547c6ae99SBarry Smith   PetscFunctionReturn(0);
49647c6ae99SBarry Smith }
497b859378eSBarry Smith 
498b859378eSBarry Smith 
499