xref: /petsc/src/dm/impls/da/dacreate.c (revision c38c1269c985b74cd049ca66ed489ffaaa83df6a)
17d0a6c19SBarry Smith 
24035e84dSBarry Smith #include <petsc-private/dmdaimpl.h>    /*I   "petscdmda.h"   I*/
347c6ae99SBarry Smith 
447c6ae99SBarry Smith #undef __FUNCT__
59a42bb27SBarry Smith #define __FUNCT__ "DMSetFromOptions_DA"
67087cfbeSBarry Smith PetscErrorCode  DMSetFromOptions_DA(DM da)
747c6ae99SBarry Smith {
847c6ae99SBarry Smith   PetscErrorCode ierr;
947c6ae99SBarry Smith   DM_DA          *dd         = (DM_DA*)da->data;
10397b6216SJed Brown   PetscInt       refine      = 0,maxnlevels = 100,*refx,*refy,*refz,n,i;
117ddda789SPeter Brune   PetscBool      negativeMNP = PETSC_FALSE,bM = PETSC_FALSE,bN = PETSC_FALSE, bP = PETSC_FALSE,flg;
1247c6ae99SBarry Smith 
1347c6ae99SBarry Smith   PetscFunctionBegin;
1447c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
1547c6ae99SBarry Smith 
1647c6ae99SBarry Smith   if (dd->M < 0) {
17235683edSBarry Smith     dd->M       = -dd->M;
18235683edSBarry Smith     bM          = PETSC_TRUE;
19e0f5d30fSBarry Smith     negativeMNP = PETSC_TRUE;
2047c6ae99SBarry Smith   }
2147c6ae99SBarry Smith   if (dd->dim > 1 && dd->N < 0) {
22235683edSBarry Smith     dd->N       = -dd->N;
23235683edSBarry Smith     bN          = PETSC_TRUE;
24e0f5d30fSBarry Smith     negativeMNP = PETSC_TRUE;
2547c6ae99SBarry Smith   }
2647c6ae99SBarry Smith   if (dd->dim > 2 && dd->P < 0) {
27235683edSBarry Smith     dd->P       = -dd->P;
28235683edSBarry Smith     bP          = PETSC_TRUE;
29e0f5d30fSBarry Smith     negativeMNP = PETSC_TRUE;
3047c6ae99SBarry Smith   }
31235683edSBarry Smith 
32f9ba7244SBarry Smith   ierr = PetscOptionsHead("DMDA Options");CHKERRQ(ierr);
330298fd71SBarry Smith   if (bM) {ierr = PetscOptionsInt("-da_grid_x","Number of grid points in x direction","DMDASetSizes",dd->M,&dd->M,NULL);CHKERRQ(ierr);}
340298fd71SBarry Smith   if (bN) {ierr = PetscOptionsInt("-da_grid_y","Number of grid points in y direction","DMDASetSizes",dd->N,&dd->N,NULL);CHKERRQ(ierr);}
350298fd71SBarry Smith   if (bP) {ierr = PetscOptionsInt("-da_grid_z","Number of grid points in z direction","DMDASetSizes",dd->P,&dd->P,NULL);CHKERRQ(ierr);}
367ddda789SPeter Brune 
377ddda789SPeter Brune   ierr = PetscOptionsInt("-da_overlap","Decomposition overlap in all directions","DMDASetOverlap",dd->xol,&dd->xol,&flg);CHKERRQ(ierr);
387ddda789SPeter Brune   if (flg) {ierr = DMDASetOverlap(da,dd->xol,dd->xol,dd->xol);CHKERRQ(ierr);}
397ddda789SPeter Brune   ierr = PetscOptionsInt("-da_overlap_x","Decomposition overlap in x direction","DMDASetOverlap",dd->xol,&dd->xol,NULL);CHKERRQ(ierr);
407ddda789SPeter Brune   if (dd->dim > 1) {ierr = PetscOptionsInt("-da_overlap_y","Decomposition overlap in y direction","DMDASetOverlap",dd->yol,&dd->yol,NULL);CHKERRQ(ierr);}
417ddda789SPeter Brune   if (dd->dim > 2) {ierr = PetscOptionsInt("-da_overlap_z","Decomposition overlap in z direction","DMDASetOverlap",dd->zol,&dd->zol,NULL);CHKERRQ(ierr);}
423e7870d2SPeter Brune 
433e7870d2SPeter Brune   ierr = PetscOptionsInt("-da_local_subdomains","","DMDASetNumLocalSubdomains",dd->Nsub,&dd->Nsub,&flg);CHKERRQ(ierr);
443e7870d2SPeter Brune   if (flg) {ierr = DMDASetNumLocalSubDomains(da,dd->Nsub);CHKERRQ(ierr);}
453e7870d2SPeter Brune 
46aa219208SBarry Smith   /* Handle DMDA parallel distibution */
470298fd71SBarry Smith   ierr = PetscOptionsInt("-da_processors_x","Number of processors in x direction","DMDASetNumProcs",dd->m,&dd->m,NULL);CHKERRQ(ierr);
480298fd71SBarry Smith   if (dd->dim > 1) {ierr = PetscOptionsInt("-da_processors_y","Number of processors in y direction","DMDASetNumProcs",dd->n,&dd->n,NULL);CHKERRQ(ierr);}
490298fd71SBarry Smith   if (dd->dim > 2) {ierr = PetscOptionsInt("-da_processors_z","Number of processors in z direction","DMDASetNumProcs",dd->p,&dd->p,NULL);CHKERRQ(ierr);}
50aa219208SBarry Smith   /* Handle DMDA refinement */
510298fd71SBarry Smith   ierr = PetscOptionsInt("-da_refine_x","Refinement ratio in x direction","DMDASetRefinementFactor",dd->refine_x,&dd->refine_x,NULL);CHKERRQ(ierr);
520298fd71SBarry Smith   if (dd->dim > 1) {ierr = PetscOptionsInt("-da_refine_y","Refinement ratio in y direction","DMDASetRefinementFactor",dd->refine_y,&dd->refine_y,NULL);CHKERRQ(ierr);}
530298fd71SBarry Smith   if (dd->dim > 2) {ierr = PetscOptionsInt("-da_refine_z","Refinement ratio in z direction","DMDASetRefinementFactor",dd->refine_z,&dd->refine_z,NULL);CHKERRQ(ierr);}
5438fb6c91SJed Brown   dd->coarsen_x = dd->refine_x; dd->coarsen_y = dd->refine_y; dd->coarsen_z = dd->refine_z;
5547c6ae99SBarry Smith 
56397b6216SJed Brown   /* Get refinement factors, defaults taken from the coarse DMDA */
57397b6216SJed Brown   ierr = PetscMalloc3(maxnlevels,PetscInt,&refx,maxnlevels,PetscInt,&refy,maxnlevels,PetscInt,&refz);CHKERRQ(ierr);
58397b6216SJed Brown   ierr = DMDAGetRefinementFactor(da,&refx[0],&refy[0],&refz[0]);CHKERRQ(ierr);
59397b6216SJed Brown   for (i=1; i<maxnlevels; i++) {
60397b6216SJed Brown     refx[i] = refx[0];
61397b6216SJed Brown     refy[i] = refy[0];
62397b6216SJed Brown     refz[i] = refz[0];
63397b6216SJed Brown   }
64397b6216SJed Brown   n    = maxnlevels;
650298fd71SBarry Smith   ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_x",refx,&n,NULL);CHKERRQ(ierr);
66397b6216SJed Brown   if (da->levelup - da->leveldown >= 0) dd->refine_x = refx[da->levelup - da->leveldown];
67397b6216SJed Brown   if (da->levelup - da->leveldown >= 1) dd->coarsen_x = refx[da->levelup - da->leveldown - 1];
68397b6216SJed Brown   if (dd->dim > 1) {
69397b6216SJed Brown     n    = maxnlevels;
700298fd71SBarry Smith     ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_y",refy,&n,NULL);CHKERRQ(ierr);
71397b6216SJed Brown     if (da->levelup - da->leveldown >= 0) dd->refine_y = refy[da->levelup - da->leveldown];
72397b6216SJed Brown     if (da->levelup - da->leveldown >= 1) dd->coarsen_y = refy[da->levelup - da->leveldown - 1];
73397b6216SJed Brown   }
74397b6216SJed Brown   if (dd->dim > 2) {
75397b6216SJed Brown     n    = maxnlevels;
760298fd71SBarry Smith     ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_z",refz,&n,NULL);CHKERRQ(ierr);
77397b6216SJed Brown     if (da->levelup - da->leveldown >= 0) dd->refine_z = refz[da->levelup - da->leveldown];
78397b6216SJed Brown     if (da->levelup - da->leveldown >= 1) dd->coarsen_z = refz[da->levelup - da->leveldown - 1];
79397b6216SJed Brown   }
80397b6216SJed Brown 
810298fd71SBarry Smith   if (negativeMNP) {ierr = PetscOptionsInt("-da_refine","Uniformly refine DA one or more times","None",refine,&refine,NULL);CHKERRQ(ierr);}
82f9ba7244SBarry Smith   ierr = PetscOptionsTail();CHKERRQ(ierr);
83235683edSBarry Smith 
84e0f5d30fSBarry Smith   while (refine--) {
85e0f5d30fSBarry Smith     if (dd->bx == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
86e0f5d30fSBarry Smith       dd->M = dd->refine_x*dd->M;
87e0f5d30fSBarry Smith     } else {
88e0f5d30fSBarry Smith       dd->M = 1 + dd->refine_x*(dd->M - 1);
89e0f5d30fSBarry Smith     }
90e0f5d30fSBarry Smith     if (dd->by == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
91e0f5d30fSBarry Smith       dd->N = dd->refine_y*dd->N;
92e0f5d30fSBarry Smith     } else {
93e0f5d30fSBarry Smith       dd->N = 1 + dd->refine_y*(dd->N - 1);
94e0f5d30fSBarry Smith     }
95e0f5d30fSBarry Smith     if (dd->bz == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
96e0f5d30fSBarry Smith       dd->P = dd->refine_z*dd->P;
97e0f5d30fSBarry Smith     } else {
98e0f5d30fSBarry Smith       dd->P = 1 + dd->refine_z*(dd->P - 1);
99e0f5d30fSBarry Smith     }
100e0f5d30fSBarry Smith     da->levelup++;
10185fc4b34SJed Brown     if (da->levelup - da->leveldown >= 0) {
10285fc4b34SJed Brown       dd->refine_x = refx[da->levelup - da->leveldown];
10385fc4b34SJed Brown       dd->refine_y = refy[da->levelup - da->leveldown];
10485fc4b34SJed Brown       dd->refine_z = refz[da->levelup - da->leveldown];
10585fc4b34SJed Brown     }
10685fc4b34SJed Brown     if (da->levelup - da->leveldown >= 1) {
10785fc4b34SJed Brown       dd->coarsen_x = refx[da->levelup - da->leveldown - 1];
10885fc4b34SJed Brown       dd->coarsen_y = refy[da->levelup - da->leveldown - 1];
10985fc4b34SJed Brown       dd->coarsen_z = refz[da->levelup - da->leveldown - 1];
11085fc4b34SJed Brown     }
111e0f5d30fSBarry Smith   }
112397b6216SJed Brown   ierr = PetscFree3(refx,refy,refz);CHKERRQ(ierr);
11347c6ae99SBarry Smith   PetscFunctionReturn(0);
11447c6ae99SBarry Smith }
11547c6ae99SBarry Smith 
1167087cfbeSBarry Smith extern PetscErrorCode  DMCreateGlobalVector_DA(DM,Vec*);
1177087cfbeSBarry Smith extern PetscErrorCode  DMCreateLocalVector_DA(DM,Vec*);
1187087cfbeSBarry Smith extern PetscErrorCode  DMGlobalToLocalBegin_DA(DM,Vec,InsertMode,Vec);
1197087cfbeSBarry Smith extern PetscErrorCode  DMGlobalToLocalEnd_DA(DM,Vec,InsertMode,Vec);
1207087cfbeSBarry Smith extern PetscErrorCode  DMLocalToGlobalBegin_DA(DM,Vec,InsertMode,Vec);
1217087cfbeSBarry Smith extern PetscErrorCode  DMLocalToGlobalEnd_DA(DM,Vec,InsertMode,Vec);
122d78e899eSRichard Tran Mills extern PetscErrorCode  DMLocalToLocalBegin_DA(DM,Vec,InsertMode,Vec);
123d78e899eSRichard Tran Mills extern PetscErrorCode  DMLocalToLocalEnd_DA(DM,Vec,InsertMode,Vec);
124e727c939SJed Brown extern PetscErrorCode  DMCreateInterpolation_DA(DM,DM,Mat*,Vec*);
12519fd82e9SBarry Smith extern PetscErrorCode  DMCreateColoring_DA(DM,ISColoringType,MatType,ISColoring*);
12619fd82e9SBarry Smith extern PetscErrorCode  DMCreateMatrix_DA(DM,MatType,Mat*);
1276636e97aSMatthew G Knepley extern PetscErrorCode  DMCreateCoordinateDM_DA(DM,DM*);
1287087cfbeSBarry Smith extern PetscErrorCode  DMRefine_DA(DM,MPI_Comm,DM*);
1297087cfbeSBarry Smith extern PetscErrorCode  DMCoarsen_DA(DM,MPI_Comm,DM*);
1307087cfbeSBarry Smith extern PetscErrorCode  DMRefineHierarchy_DA(DM,PetscInt,DM[]);
1317087cfbeSBarry Smith extern PetscErrorCode  DMCoarsenHierarchy_DA(DM,PetscInt,DM[]);
132e727c939SJed Brown extern PetscErrorCode  DMCreateInjection_DA(DM,DM,VecScatter*);
133e727c939SJed Brown extern PetscErrorCode  DMCreateAggregates_DA(DM,DM,Mat*);
1347087cfbeSBarry Smith extern PetscErrorCode  DMView_DA(DM,PetscViewer);
1357087cfbeSBarry Smith extern PetscErrorCode  DMSetUp_DA(DM);
1367087cfbeSBarry Smith extern PetscErrorCode  DMDestroy_DA(DM);
137e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecomposition_DA(DM,PetscInt*,char***,IS**,IS**,DM**);
138e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecompositionScatters_DA(DM,PetscInt,DM*,VecScatter**,VecScatter**,VecScatter**);
1399a42bb27SBarry Smith 
140b859378eSBarry Smith #undef __FUNCT__
141b859378eSBarry Smith #define __FUNCT__ "DMLoad_DA"
142b859378eSBarry Smith PetscErrorCode DMLoad_DA(DM da,PetscViewer viewer)
143b859378eSBarry Smith {
144b859378eSBarry Smith   PetscErrorCode   ierr;
145bc2bf880SBarry Smith   PetscInt         dim,m,n,p,dof,swidth;
146b859378eSBarry Smith   DMDAStencilType  stencil;
147b859378eSBarry Smith   DMDABoundaryType bx,by,bz;
148bc2bf880SBarry Smith   PetscBool        coors;
149bc2bf880SBarry Smith   DM               dac;
150bc2bf880SBarry Smith   Vec              c;
151b859378eSBarry Smith 
152b859378eSBarry Smith   PetscFunctionBegin;
153b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&dim,1,PETSC_INT);CHKERRQ(ierr);
154b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&m,1,PETSC_INT);CHKERRQ(ierr);
155b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&n,1,PETSC_INT);CHKERRQ(ierr);
156b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&p,1,PETSC_INT);CHKERRQ(ierr);
157b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&dof,1,PETSC_INT);CHKERRQ(ierr);
158b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&swidth,1,PETSC_INT);CHKERRQ(ierr);
159b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&bx,1,PETSC_ENUM);CHKERRQ(ierr);
160b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&by,1,PETSC_ENUM);CHKERRQ(ierr);
161b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&bz,1,PETSC_ENUM);CHKERRQ(ierr);
162b859378eSBarry Smith   ierr = PetscViewerBinaryRead(viewer,&stencil,1,PETSC_ENUM);CHKERRQ(ierr);
163b859378eSBarry Smith 
164bc2bf880SBarry Smith   ierr = DMDASetDim(da, dim);CHKERRQ(ierr);
165bc2bf880SBarry Smith   ierr = DMDASetSizes(da, m,n,p);CHKERRQ(ierr);
166b859378eSBarry Smith   ierr = DMDASetBoundaryType(da, bx, by, bz);CHKERRQ(ierr);
167b859378eSBarry Smith   ierr = DMDASetDof(da, dof);CHKERRQ(ierr);
168b859378eSBarry Smith   ierr = DMDASetStencilType(da, stencil);CHKERRQ(ierr);
169b859378eSBarry Smith   ierr = DMDASetStencilWidth(da, swidth);CHKERRQ(ierr);
170b859378eSBarry Smith   ierr = DMSetUp(da);CHKERRQ(ierr);
171bc2bf880SBarry Smith   ierr = PetscViewerBinaryRead(viewer,&coors,1,PETSC_ENUM);CHKERRQ(ierr);
172bc2bf880SBarry Smith   if (coors) {
1736636e97aSMatthew G Knepley     ierr = DMGetCoordinateDM(da,&dac);CHKERRQ(ierr);
174bc2bf880SBarry Smith     ierr = DMCreateGlobalVector(dac,&c);CHKERRQ(ierr);
175bc2bf880SBarry Smith     ierr = VecLoad(c,viewer);CHKERRQ(ierr);
1766636e97aSMatthew G Knepley     ierr = DMSetCoordinates(da,c);CHKERRQ(ierr);
177bc2bf880SBarry Smith     ierr = VecDestroy(&c);CHKERRQ(ierr);
178bc2bf880SBarry Smith   }
179b859378eSBarry Smith   PetscFunctionReturn(0);
180b859378eSBarry Smith }
181b859378eSBarry Smith 
1821c3fb106SBarry Smith #undef __FUNCT__
183d724dfffSBarry Smith #define __FUNCT__ "DMCreateSubDM_DA"
184d724dfffSBarry Smith PetscErrorCode DMCreateSubDM_DA(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm)
185d724dfffSBarry Smith {
186d724dfffSBarry Smith   DM_DA         *da = (DM_DA*) dm->data;
1874d9407bcSMatthew G. Knepley   PetscSection   section;
1884d9407bcSMatthew G. Knepley   PetscErrorCode ierr;
189d724dfffSBarry Smith 
190d724dfffSBarry Smith   PetscFunctionBegin;
191d724dfffSBarry Smith   if (subdm) {
192*c38c1269SMatthew G. Knepley     PetscSF sf;
193*c38c1269SMatthew G. Knepley     Vec     coords;
194*c38c1269SMatthew G. Knepley     void   *ctx;
195*c38c1269SMatthew G. Knepley     /* Cannot use DMClone since the dof stuff is mixed in. Ugh
196*c38c1269SMatthew G. Knepley     ierr = DMClone(dm, subdm);CHKERRQ(ierr); */
197*c38c1269SMatthew G. Knepley     ierr = DMCreate(PetscObjectComm((PetscObject)dm), subdm);CHKERRQ(ierr);
198*c38c1269SMatthew G. Knepley     ierr = DMGetPointSF(dm, &sf);CHKERRQ(ierr);
199*c38c1269SMatthew G. Knepley     ierr = DMSetPointSF(*subdm, sf);CHKERRQ(ierr);
200*c38c1269SMatthew G. Knepley     ierr = DMGetApplicationContext(dm, &ctx);CHKERRQ(ierr);
201*c38c1269SMatthew G. Knepley     ierr = DMSetApplicationContext(*subdm, ctx);CHKERRQ(ierr);
202*c38c1269SMatthew G. Knepley     ierr = DMGetCoordinatesLocal(dm, &coords);CHKERRQ(ierr);
203*c38c1269SMatthew G. Knepley     if (coords) {
204*c38c1269SMatthew G. Knepley       ierr = DMSetCoordinatesLocal(*subdm, coords);CHKERRQ(ierr);
205*c38c1269SMatthew G. Knepley     } else {
206*c38c1269SMatthew G. Knepley       ierr = DMGetCoordinates(dm, &coords);CHKERRQ(ierr);
207*c38c1269SMatthew G. Knepley       if (coords) {ierr = DMSetCoordinates(*subdm, coords);CHKERRQ(ierr);}
208*c38c1269SMatthew G. Knepley     }
209*c38c1269SMatthew G. Knepley 
210*c38c1269SMatthew G. Knepley     ierr = DMSetType(*subdm, DMDA);CHKERRQ(ierr);
211*c38c1269SMatthew G. Knepley     ierr = DMDASetDim(*subdm, da->dim);CHKERRQ(ierr);
212*c38c1269SMatthew G. Knepley     ierr = DMDASetSizes(*subdm, da->M, da->N, da->P);CHKERRQ(ierr);
213*c38c1269SMatthew G. Knepley     ierr = DMDASetNumProcs(*subdm, da->m, da->n, da->p);CHKERRQ(ierr);
214*c38c1269SMatthew G. Knepley     ierr = DMDASetBoundaryType(*subdm, da->bx, da->by, da->bz);CHKERRQ(ierr);
21538221697SMatthew G. Knepley     ierr = DMDASetDof(*subdm, numFields);CHKERRQ(ierr);
216*c38c1269SMatthew G. Knepley     ierr = DMDASetStencilType(*subdm, da->stencil_type);CHKERRQ(ierr);
217*c38c1269SMatthew G. Knepley     ierr = DMDASetStencilWidth(*subdm, da->s);CHKERRQ(ierr);
218*c38c1269SMatthew G. Knepley     ierr = DMDASetOwnershipRanges(*subdm, da->lx, da->ly, da->lz);CHKERRQ(ierr);
219d724dfffSBarry Smith   }
2204d9407bcSMatthew G. Knepley   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
2214d9407bcSMatthew G. Knepley   if (section) {
2224d9407bcSMatthew G. Knepley     ierr = DMCreateSubDM_Section_Private(dm, numFields, fields, is, subdm);CHKERRQ(ierr);
2234d9407bcSMatthew G. Knepley   } else {
224d724dfffSBarry Smith     if (is) {
225d724dfffSBarry Smith       PetscInt *indices, cnt = 0, dof = da->w, i, j;
22638221697SMatthew G. Knepley 
22738221697SMatthew G. Knepley       ierr = PetscMalloc(da->Nlocal*numFields/dof * sizeof(PetscInt), &indices);CHKERRQ(ierr);
22838221697SMatthew G. Knepley       for (i = da->base/dof; i < (da->base+da->Nlocal)/dof; ++i) {
22938221697SMatthew G. Knepley         for (j = 0; j < numFields; ++j) {
230d724dfffSBarry Smith           indices[cnt++] = dof*i + fields[j];
231d724dfffSBarry Smith         }
232d724dfffSBarry Smith       }
23338221697SMatthew 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);
23438221697SMatthew G. Knepley       ierr = ISCreateGeneral(PetscObjectComm((PetscObject) dm), cnt, indices, PETSC_OWN_POINTER, is);CHKERRQ(ierr);
235d724dfffSBarry Smith     }
236d724dfffSBarry Smith   }
237d724dfffSBarry Smith   PetscFunctionReturn(0);
238d724dfffSBarry Smith }
239d724dfffSBarry Smith 
240d724dfffSBarry Smith #undef __FUNCT__
24116621825SDmitry Karpeev #define __FUNCT__ "DMCreateFieldDecomposition_DA"
24216621825SDmitry Karpeev PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len,char ***namelist, IS **islist, DM **dmlist)
2431c3fb106SBarry Smith {
2441c3fb106SBarry Smith   PetscInt       i;
2451c3fb106SBarry Smith   PetscErrorCode ierr;
2461c3fb106SBarry Smith   DM_DA          *dd = (DM_DA*)dm->data;
2471c3fb106SBarry Smith   PetscInt       dof = dd->w;
2481c3fb106SBarry Smith 
2491c3fb106SBarry Smith   PetscFunctionBegin;
250731c8d9eSDmitry Karpeev   if (len) *len = dof;
2511c3fb106SBarry Smith   if (islist) {
2521c3fb106SBarry Smith     Vec      v;
2531c3fb106SBarry Smith     PetscInt rstart,n;
2541c3fb106SBarry Smith 
2551c3fb106SBarry Smith     ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr);
2560298fd71SBarry Smith     ierr = VecGetOwnershipRange(v,&rstart,NULL);CHKERRQ(ierr);
2571c3fb106SBarry Smith     ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr);
2581c3fb106SBarry Smith     ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr);
2591c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(IS),islist);CHKERRQ(ierr);
2601c3fb106SBarry Smith     for (i=0; i<dof; i++) {
261ce94432eSBarry Smith       ierr = ISCreateStride(PetscObjectComm((PetscObject)dm),n/dof,rstart+i,dof,&(*islist)[i]);CHKERRQ(ierr);
2621c3fb106SBarry Smith     }
2631c3fb106SBarry Smith   }
2641c3fb106SBarry Smith   if (namelist) {
2651c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(const char*), namelist);CHKERRQ(ierr);
2661c3fb106SBarry Smith     if (dd->fieldname) {
2671c3fb106SBarry Smith       for (i=0; i<dof; i++) {
2681c3fb106SBarry Smith         ierr = PetscStrallocpy(dd->fieldname[i],&(*namelist)[i]);CHKERRQ(ierr);
2691c3fb106SBarry Smith       }
2701c3fb106SBarry Smith     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Currently DMDA must have fieldnames");
2711c3fb106SBarry Smith   }
2721c3fb106SBarry Smith   if (dmlist) {
2731c3fb106SBarry Smith     DM da;
2741c3fb106SBarry Smith 
275ce94432eSBarry Smith     ierr = DMDACreate(PetscObjectComm((PetscObject)dm), &da);CHKERRQ(ierr);
2761c3fb106SBarry Smith     ierr = DMDASetDim(da, dd->dim);CHKERRQ(ierr);
2771c3fb106SBarry Smith     ierr = DMDASetSizes(da, dd->M, dd->N, dd->P);CHKERRQ(ierr);
2781c3fb106SBarry Smith     ierr = DMDASetNumProcs(da, dd->m, dd->n, dd->p);CHKERRQ(ierr);
2791c3fb106SBarry Smith     ierr = DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz);CHKERRQ(ierr);
2801c3fb106SBarry Smith     ierr = DMDASetDof(da, 1);CHKERRQ(ierr);
2811c3fb106SBarry Smith     ierr = DMDASetStencilType(da, dd->stencil_type);CHKERRQ(ierr);
2821c3fb106SBarry Smith     ierr = DMDASetStencilWidth(da, dd->s);CHKERRQ(ierr);
2831c3fb106SBarry Smith     ierr = DMSetUp(da);CHKERRQ(ierr);
2841c3fb106SBarry Smith     ierr = PetscMalloc(dof*sizeof(DM),dmlist);CHKERRQ(ierr);
285c893992eSBarry Smith     for (i=0; i<dof-1; i++) {ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);}
2861c3fb106SBarry Smith     for (i=0; i<dof; i++) (*dmlist)[i] = da;
2871c3fb106SBarry Smith   }
2881c3fb106SBarry Smith   PetscFunctionReturn(0);
2891c3fb106SBarry Smith }
2901c3fb106SBarry Smith 
29138221697SMatthew G. Knepley #undef __FUNCT__
29238221697SMatthew G. Knepley #define __FUNCT__ "DMClone_DA"
29338221697SMatthew G. Knepley PetscErrorCode DMClone_DA(DM dm, DM *newdm)
29438221697SMatthew G. Knepley {
29538221697SMatthew G. Knepley   DM_DA         *da = (DM_DA *) dm->data;
29638221697SMatthew G. Knepley   PetscErrorCode ierr;
29738221697SMatthew G. Knepley 
29838221697SMatthew G. Knepley   PetscFunctionBegin;
2994271099bSMatthew G. Knepley   ierr = DMSetType(*newdm, DMDA);CHKERRQ(ierr);
3004271099bSMatthew G. Knepley   ierr = DMDASetDim(*newdm, da->dim);CHKERRQ(ierr);
3014271099bSMatthew G. Knepley   ierr = DMDASetSizes(*newdm, da->M, da->N, da->P);CHKERRQ(ierr);
3024271099bSMatthew G. Knepley   ierr = DMDASetNumProcs(*newdm, da->m, da->n, da->p);CHKERRQ(ierr);
3034271099bSMatthew G. Knepley   ierr = DMDASetBoundaryType(*newdm, da->bx, da->by, da->bz);CHKERRQ(ierr);
3044271099bSMatthew G. Knepley   ierr = DMDASetDof(*newdm, da->w);CHKERRQ(ierr);
3054271099bSMatthew G. Knepley   ierr = DMDASetStencilType(*newdm, da->stencil_type);CHKERRQ(ierr);
3064271099bSMatthew G. Knepley   ierr = DMDASetStencilWidth(*newdm, da->s);CHKERRQ(ierr);
3074271099bSMatthew G. Knepley   ierr = DMDASetOwnershipRanges(*newdm, da->lx, da->ly, da->lz);CHKERRQ(ierr);
308a9811db3SMatthew G. Knepley   ierr = DMSetUp(*newdm);CHKERRQ(ierr);
30938221697SMatthew G. Knepley   PetscFunctionReturn(0);
31038221697SMatthew G. Knepley }
31138221697SMatthew G. Knepley 
3123efe6655SBarry Smith /*MC
3133efe6655SBarry Smith    DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions.
3143efe6655SBarry Smith          In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points.
3153efe6655SBarry Smith          In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width.
3163efe6655SBarry Smith 
3173efe6655SBarry 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
3183efe6655SBarry Smith          vertex centered.
3193efe6655SBarry Smith 
3203efe6655SBarry Smith 
3213efe6655SBarry Smith   Level: intermediate
3223efe6655SBarry Smith 
3233efe6655SBarry Smith .seealso: DMType, DMCOMPOSITE, DMDACreate(), DMCreate(), DMSetType()
3243efe6655SBarry Smith M*/
3253efe6655SBarry Smith 
3261c3fb106SBarry Smith 
32747c6ae99SBarry Smith #undef __FUNCT__
328a4121054SBarry Smith #define __FUNCT__ "DMCreate_DA"
3298cc058d9SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_DA(DM da)
33047c6ae99SBarry Smith {
33147c6ae99SBarry Smith   PetscErrorCode ierr;
33247c6ae99SBarry Smith   DM_DA          *dd;
33347c6ae99SBarry Smith 
33447c6ae99SBarry Smith   PetscFunctionBegin;
335a4121054SBarry Smith   PetscValidPointer(da,1);
336a4121054SBarry Smith   ierr     = PetscNewLog(da,DM_DA,&dd);CHKERRQ(ierr);
337a4121054SBarry Smith   da->data = dd;
33847c6ae99SBarry Smith 
33947c6ae99SBarry Smith   dd->dim        = -1;
340aa219208SBarry Smith   dd->interptype = DMDA_Q1;
34147c6ae99SBarry Smith   dd->refine_x   = 2;
34247c6ae99SBarry Smith   dd->refine_y   = 2;
34347c6ae99SBarry Smith   dd->refine_z   = 2;
34481c108dcSJed Brown   dd->coarsen_x  = 2;
34581c108dcSJed Brown   dd->coarsen_y  = 2;
34681c108dcSJed Brown   dd->coarsen_z  = 2;
3470298fd71SBarry Smith   dd->fieldname  = NULL;
34847c6ae99SBarry Smith   dd->nlocal     = -1;
34947c6ae99SBarry Smith   dd->Nlocal     = -1;
35047c6ae99SBarry Smith   dd->M          = -1;
35147c6ae99SBarry Smith   dd->N          = -1;
35247c6ae99SBarry Smith   dd->P          = -1;
35347c6ae99SBarry Smith   dd->m          = -1;
35447c6ae99SBarry Smith   dd->n          = -1;
35547c6ae99SBarry Smith   dd->p          = -1;
35647c6ae99SBarry Smith   dd->w          = -1;
35747c6ae99SBarry Smith   dd->s          = -1;
3588865f1eaSKarl Rupp 
35947c6ae99SBarry Smith   dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1;
36047c6ae99SBarry Smith   dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1;
36147c6ae99SBarry Smith 
3623e7870d2SPeter Brune   dd->Nsub            = 1;
3637ddda789SPeter Brune   dd->xol             = 0;
3647ddda789SPeter Brune   dd->yol             = 0;
3657ddda789SPeter Brune   dd->zol             = 0;
366d886c4f4SPeter Brune   dd->xo              = 0;
367d886c4f4SPeter Brune   dd->yo              = 0;
368d886c4f4SPeter Brune   dd->zo              = 0;
369e30e807fSPeter Brune   dd->Mo              = -1;
370e30e807fSPeter Brune   dd->No              = -1;
371e30e807fSPeter Brune   dd->Po              = -1;
37288661749SPeter Brune 
3730298fd71SBarry Smith   dd->gtol         = NULL;
3740298fd71SBarry Smith   dd->ltog         = NULL;
3750298fd71SBarry Smith   dd->ltol         = NULL;
3760298fd71SBarry Smith   dd->ao           = NULL;
37747c6ae99SBarry Smith   dd->base         = -1;
3781321219cSEthan Coon   dd->bx           = DMDA_BOUNDARY_NONE;
3791321219cSEthan Coon   dd->by           = DMDA_BOUNDARY_NONE;
3801321219cSEthan Coon   dd->bz           = DMDA_BOUNDARY_NONE;
381aa219208SBarry Smith   dd->stencil_type = DMDA_STENCIL_BOX;
382aa219208SBarry Smith   dd->interptype   = DMDA_Q1;
3830298fd71SBarry Smith   dd->idx          = NULL;
38447c6ae99SBarry Smith   dd->Nl           = -1;
3850298fd71SBarry Smith   dd->lx           = NULL;
3860298fd71SBarry Smith   dd->ly           = NULL;
3870298fd71SBarry Smith   dd->lz           = NULL;
38847c6ae99SBarry Smith 
389454e267fSLisandro Dalcin   dd->elementtype = DMDA_ELEMENT_Q1;
390454e267fSLisandro Dalcin 
39119fd82e9SBarry Smith   ierr = PetscStrallocpy(VECSTANDARD,(char**)&da->vectype);CHKERRQ(ierr);
3928865f1eaSKarl Rupp 
393a4121054SBarry Smith   da->ops->globaltolocalbegin          = DMGlobalToLocalBegin_DA;
394a4121054SBarry Smith   da->ops->globaltolocalend            = DMGlobalToLocalEnd_DA;
395a4121054SBarry Smith   da->ops->localtoglobalbegin          = DMLocalToGlobalBegin_DA;
396a4121054SBarry Smith   da->ops->localtoglobalend            = DMLocalToGlobalEnd_DA;
397d78e899eSRichard Tran Mills   da->ops->localtolocalbegin           = DMLocalToLocalBegin_DA;
398d78e899eSRichard Tran Mills   da->ops->localtolocalend             = DMLocalToLocalEnd_DA;
399a4121054SBarry Smith   da->ops->createglobalvector          = DMCreateGlobalVector_DA;
400a4121054SBarry Smith   da->ops->createlocalvector           = DMCreateLocalVector_DA;
40125296bd5SBarry Smith   da->ops->createinterpolation         = DMCreateInterpolation_DA;
402e727c939SJed Brown   da->ops->getcoloring                 = DMCreateColoring_DA;
40325296bd5SBarry Smith   da->ops->creatematrix                = DMCreateMatrix_DA;
404a4121054SBarry Smith   da->ops->refine                      = DMRefine_DA;
405a4121054SBarry Smith   da->ops->coarsen                     = DMCoarsen_DA;
406a4121054SBarry Smith   da->ops->refinehierarchy             = DMRefineHierarchy_DA;
407a4121054SBarry Smith   da->ops->coarsenhierarchy            = DMCoarsenHierarchy_DA;
408e727c939SJed Brown   da->ops->getinjection                = DMCreateInjection_DA;
409e727c939SJed Brown   da->ops->getaggregates               = DMCreateAggregates_DA;
410a4121054SBarry Smith   da->ops->destroy                     = DMDestroy_DA;
411a4121054SBarry Smith   da->ops->view                        = 0;
412a4121054SBarry Smith   da->ops->setfromoptions              = DMSetFromOptions_DA;
413a4121054SBarry Smith   da->ops->setup                       = DMSetUp_DA;
41438221697SMatthew G. Knepley   da->ops->clone                       = DMClone_DA;
415b859378eSBarry Smith   da->ops->load                        = DMLoad_DA;
4166636e97aSMatthew G Knepley   da->ops->createcoordinatedm          = DMCreateCoordinateDM_DA;
417d724dfffSBarry Smith   da->ops->createsubdm                 = DMCreateSubDM_DA;
41816621825SDmitry Karpeev   da->ops->createfielddecomposition    = DMCreateFieldDecomposition_DA;
419e30e807fSPeter Brune   da->ops->createdomaindecomposition   = DMCreateDomainDecomposition_DA;
420e30e807fSPeter Brune   da->ops->createddscatters            = DMCreateDomainDecompositionScatters_DA;
421a4121054SBarry Smith   PetscFunctionReturn(0);
422a4121054SBarry Smith }
42347c6ae99SBarry Smith 
424a4121054SBarry Smith #undef __FUNCT__
425a4121054SBarry Smith #define __FUNCT__ "DMDACreate"
426a4121054SBarry Smith /*@
427a4121054SBarry Smith   DMDACreate - Creates a DMDA object.
428a4121054SBarry Smith 
429a4121054SBarry Smith   Collective on MPI_Comm
430a4121054SBarry Smith 
431a4121054SBarry Smith   Input Parameter:
432a4121054SBarry Smith . comm - The communicator for the DMDA object
433a4121054SBarry Smith 
434a4121054SBarry Smith   Output Parameter:
435a4121054SBarry Smith . da  - The DMDA object
436a4121054SBarry Smith 
437e0f5d30fSBarry Smith   Level: advanced
438e0f5d30fSBarry Smith 
439e0f5d30fSBarry Smith   Developers Note: Since there exists DMDACreate1/2/3d() should this routine even exist?
440a4121054SBarry Smith 
441a4121054SBarry Smith .keywords: DMDA, create
442e0f5d30fSBarry Smith .seealso:  DMDASetSizes(), DMDADuplicate(),  DMDACreate1d(), DMDACreate2d(), DMDACreate3d()
443a4121054SBarry Smith @*/
4447087cfbeSBarry Smith PetscErrorCode  DMDACreate(MPI_Comm comm, DM *da)
445a4121054SBarry Smith {
446a4121054SBarry Smith   PetscErrorCode ierr;
447a4121054SBarry Smith 
448a4121054SBarry Smith   PetscFunctionBegin;
449a4121054SBarry Smith   PetscValidPointer(da,2);
450a4121054SBarry Smith   ierr = DMCreate(comm,da);CHKERRQ(ierr);
451a4121054SBarry Smith   ierr = DMSetType(*da,DMDA);CHKERRQ(ierr);
45247c6ae99SBarry Smith   PetscFunctionReturn(0);
45347c6ae99SBarry Smith }
454b859378eSBarry Smith 
455b859378eSBarry Smith 
456