xref: /petsc/src/dm/impls/da/dacreate.c (revision d2ebda5dc63913b1e21b49d168148e9df5e6b3bc)
17d0a6c19SBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h>    /*I   "petscdmda.h"   I*/
347c6ae99SBarry Smith 
447c6ae99SBarry Smith #undef __FUNCT__
59a42bb27SBarry Smith #define __FUNCT__ "DMSetFromOptions_DA"
64416b707SBarry Smith PetscErrorCode  DMSetFromOptions_DA(PetscOptionItems *PetscOptionsObject,DM da)
747c6ae99SBarry Smith {
847c6ae99SBarry Smith   PetscErrorCode ierr;
947c6ae99SBarry Smith   DM_DA          *dd    = (DM_DA*)da->data;
10c73cfb54SMatthew G. Knepley   PetscInt       refine = 0,dim = da->dim,maxnlevels = 100,refx[100],refy[100],refz[100],n,i;
1112655325SBarry Smith   PetscBool      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;
193e211508SBarry Smith     dd->negativeMNP = PETSC_TRUE;
2047c6ae99SBarry Smith   }
2112655325SBarry Smith   if (da->dim > 1 && dd->N < 0) {
22235683edSBarry Smith     dd->N           = -dd->N;
23235683edSBarry Smith     bN              = PETSC_TRUE;
243e211508SBarry Smith     dd->negativeMNP = PETSC_TRUE;
2547c6ae99SBarry Smith   }
2612655325SBarry Smith   if (da->dim > 2 && dd->P < 0) {
27235683edSBarry Smith     dd->P           = -dd->P;
28235683edSBarry Smith     bP              = PETSC_TRUE;
293e211508SBarry Smith     dd->negativeMNP = PETSC_TRUE;
3047c6ae99SBarry Smith   }
31235683edSBarry Smith 
32e55864a3SBarry Smith   ierr = PetscOptionsHead(PetscOptionsObject,"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);
40c73cfb54SMatthew G. Knepley   if (dim > 1) {ierr = PetscOptionsInt("-da_overlap_y","Decomposition overlap in y direction","DMDASetOverlap",dd->yol,&dd->yol,NULL);CHKERRQ(ierr);}
41c73cfb54SMatthew G. Knepley   if (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);
48c73cfb54SMatthew G. Knepley   if (dim > 1) {ierr = PetscOptionsInt("-da_processors_y","Number of processors in y direction","DMDASetNumProcs",dd->n,&dd->n,NULL);CHKERRQ(ierr);}
49c73cfb54SMatthew G. Knepley   if (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);
52c73cfb54SMatthew 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);}
53c73cfb54SMatthew 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);}
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 = DMDAGetRefinementFactor(da,&refx[0],&refy[0],&refz[0]);CHKERRQ(ierr);
58397b6216SJed Brown   for (i=1; i<maxnlevels; i++) {
59397b6216SJed Brown     refx[i] = refx[0];
60397b6216SJed Brown     refy[i] = refy[0];
61397b6216SJed Brown     refz[i] = refz[0];
62397b6216SJed Brown   }
63397b6216SJed Brown   n    = maxnlevels;
64c5929fdfSBarry Smith   ierr = PetscOptionsIntArray("-da_refine_hierarchy_x","Refinement factor for each level","None",refx,&n,NULL);CHKERRQ(ierr);
65397b6216SJed Brown   if (da->levelup - da->leveldown >= 0) dd->refine_x = refx[da->levelup - da->leveldown];
66397b6216SJed Brown   if (da->levelup - da->leveldown >= 1) dd->coarsen_x = refx[da->levelup - da->leveldown - 1];
67c73cfb54SMatthew G. Knepley   if (dim > 1) {
68397b6216SJed Brown     n    = maxnlevels;
69c5929fdfSBarry Smith     ierr = PetscOptionsIntArray("-da_refine_hierarchy_y","Refinement factor for each level","None",refy,&n,NULL);CHKERRQ(ierr);
70397b6216SJed Brown     if (da->levelup - da->leveldown >= 0) dd->refine_y = refy[da->levelup - da->leveldown];
71397b6216SJed Brown     if (da->levelup - da->leveldown >= 1) dd->coarsen_y = refy[da->levelup - da->leveldown - 1];
72397b6216SJed Brown   }
73c73cfb54SMatthew G. Knepley   if (dim > 2) {
74397b6216SJed Brown     n    = maxnlevels;
75c5929fdfSBarry Smith     ierr = PetscOptionsIntArray("-da_refine_hierarchy_z","Refinement factor for each level","None",refz,&n,NULL);CHKERRQ(ierr);
76397b6216SJed Brown     if (da->levelup - da->leveldown >= 0) dd->refine_z = refz[da->levelup - da->leveldown];
77397b6216SJed Brown     if (da->levelup - da->leveldown >= 1) dd->coarsen_z = refz[da->levelup - da->leveldown - 1];
78397b6216SJed Brown   }
79397b6216SJed Brown 
803e211508SBarry Smith   if (dd->negativeMNP) {ierr = PetscOptionsInt("-da_refine","Uniformly refine DA one or more times","None",refine,&refine,NULL);CHKERRQ(ierr);}
81f9ba7244SBarry Smith   ierr = PetscOptionsTail();CHKERRQ(ierr);
82235683edSBarry Smith 
83e0f5d30fSBarry Smith   while (refine--) {
84bff4a2f0SMatthew G. Knepley     if (dd->bx == DM_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
85e0f5d30fSBarry Smith       dd->M = dd->refine_x*dd->M;
86e0f5d30fSBarry Smith     } else {
87e0f5d30fSBarry Smith       dd->M = 1 + dd->refine_x*(dd->M - 1);
88e0f5d30fSBarry Smith     }
89bff4a2f0SMatthew G. Knepley     if (dd->by == DM_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
90e0f5d30fSBarry Smith       dd->N = dd->refine_y*dd->N;
91e0f5d30fSBarry Smith     } else {
92e0f5d30fSBarry Smith       dd->N = 1 + dd->refine_y*(dd->N - 1);
93e0f5d30fSBarry Smith     }
94bff4a2f0SMatthew G. Knepley     if (dd->bz == DM_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) {
95e0f5d30fSBarry Smith       dd->P = dd->refine_z*dd->P;
96e0f5d30fSBarry Smith     } else {
97e0f5d30fSBarry Smith       dd->P = 1 + dd->refine_z*(dd->P - 1);
98e0f5d30fSBarry Smith     }
99e0f5d30fSBarry Smith     da->levelup++;
10085fc4b34SJed Brown     if (da->levelup - da->leveldown >= 0) {
10185fc4b34SJed Brown       dd->refine_x = refx[da->levelup - da->leveldown];
10285fc4b34SJed Brown       dd->refine_y = refy[da->levelup - da->leveldown];
10385fc4b34SJed Brown       dd->refine_z = refz[da->levelup - da->leveldown];
10485fc4b34SJed Brown     }
10585fc4b34SJed Brown     if (da->levelup - da->leveldown >= 1) {
10685fc4b34SJed Brown       dd->coarsen_x = refx[da->levelup - da->leveldown - 1];
10785fc4b34SJed Brown       dd->coarsen_y = refy[da->levelup - da->leveldown - 1];
10885fc4b34SJed Brown       dd->coarsen_z = refz[da->levelup - da->leveldown - 1];
10985fc4b34SJed Brown     }
110e0f5d30fSBarry Smith   }
11147c6ae99SBarry Smith   PetscFunctionReturn(0);
11247c6ae99SBarry Smith }
11347c6ae99SBarry Smith 
1147087cfbeSBarry Smith extern PetscErrorCode  DMCreateGlobalVector_DA(DM,Vec*);
1157087cfbeSBarry Smith extern PetscErrorCode  DMCreateLocalVector_DA(DM,Vec*);
1167087cfbeSBarry Smith extern PetscErrorCode  DMGlobalToLocalBegin_DA(DM,Vec,InsertMode,Vec);
1177087cfbeSBarry Smith extern PetscErrorCode  DMGlobalToLocalEnd_DA(DM,Vec,InsertMode,Vec);
1187087cfbeSBarry Smith extern PetscErrorCode  DMLocalToGlobalBegin_DA(DM,Vec,InsertMode,Vec);
1197087cfbeSBarry Smith extern PetscErrorCode  DMLocalToGlobalEnd_DA(DM,Vec,InsertMode,Vec);
120d78e899eSRichard Tran Mills extern PetscErrorCode  DMLocalToLocalBegin_DA(DM,Vec,InsertMode,Vec);
121d78e899eSRichard Tran Mills extern PetscErrorCode  DMLocalToLocalEnd_DA(DM,Vec,InsertMode,Vec);
122e727c939SJed Brown extern PetscErrorCode  DMCreateInterpolation_DA(DM,DM,Mat*,Vec*);
123b412c318SBarry Smith extern PetscErrorCode  DMCreateColoring_DA(DM,ISColoringType,ISColoring*);
124b412c318SBarry Smith extern PetscErrorCode  DMCreateMatrix_DA(DM,Mat*);
1256636e97aSMatthew G Knepley extern PetscErrorCode  DMCreateCoordinateDM_DA(DM,DM*);
1267087cfbeSBarry Smith extern PetscErrorCode  DMRefine_DA(DM,MPI_Comm,DM*);
1277087cfbeSBarry Smith extern PetscErrorCode  DMCoarsen_DA(DM,MPI_Comm,DM*);
1287087cfbeSBarry Smith extern PetscErrorCode  DMRefineHierarchy_DA(DM,PetscInt,DM[]);
1297087cfbeSBarry Smith extern PetscErrorCode  DMCoarsenHierarchy_DA(DM,PetscInt,DM[]);
1306dbf9973SLawrence Mitchell extern PetscErrorCode  DMCreateInjection_DA(DM,DM,Mat*);
131e727c939SJed Brown extern PetscErrorCode  DMCreateAggregates_DA(DM,DM,Mat*);
1327087cfbeSBarry Smith extern PetscErrorCode  DMView_DA(DM,PetscViewer);
1337087cfbeSBarry Smith extern PetscErrorCode  DMSetUp_DA(DM);
1347087cfbeSBarry Smith extern PetscErrorCode  DMDestroy_DA(DM);
135e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecomposition_DA(DM,PetscInt*,char***,IS**,IS**,DM**);
136e30e807fSPeter Brune extern PetscErrorCode  DMCreateDomainDecompositionScatters_DA(DM,PetscInt,DM*,VecScatter**,VecScatter**,VecScatter**);
1379a42bb27SBarry Smith 
138b859378eSBarry Smith #undef __FUNCT__
139b859378eSBarry Smith #define __FUNCT__ "DMLoad_DA"
140b859378eSBarry Smith PetscErrorCode DMLoad_DA(DM da,PetscViewer viewer)
141b859378eSBarry Smith {
142b859378eSBarry Smith   PetscErrorCode   ierr;
143060da220SMatthew G. Knepley   PetscInt         dim,m,n,p,dof,swidth;
144b859378eSBarry Smith   DMDAStencilType  stencil;
145bff4a2f0SMatthew G. Knepley   DMBoundaryType   bx,by,bz;
146bc2bf880SBarry Smith   PetscBool        coors;
147bc2bf880SBarry Smith   DM               dac;
148bc2bf880SBarry Smith   Vec              c;
149b859378eSBarry Smith 
150b859378eSBarry Smith   PetscFunctionBegin;
151060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&dim,1,NULL,PETSC_INT);CHKERRQ(ierr);
152060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&m,1,NULL,PETSC_INT);CHKERRQ(ierr);
153060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&n,1,NULL,PETSC_INT);CHKERRQ(ierr);
154060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&p,1,NULL,PETSC_INT);CHKERRQ(ierr);
155060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&dof,1,NULL,PETSC_INT);CHKERRQ(ierr);
156060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&swidth,1,NULL,PETSC_INT);CHKERRQ(ierr);
157060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&bx,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
158060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&by,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
159060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&bz,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
160060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&stencil,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
161b859378eSBarry Smith 
162c73cfb54SMatthew G. Knepley   ierr = DMSetDimension(da, dim);CHKERRQ(ierr);
163bc2bf880SBarry Smith   ierr = DMDASetSizes(da, m,n,p);CHKERRQ(ierr);
164b859378eSBarry Smith   ierr = DMDASetBoundaryType(da, bx, by, bz);CHKERRQ(ierr);
165b859378eSBarry Smith   ierr = DMDASetDof(da, dof);CHKERRQ(ierr);
166b859378eSBarry Smith   ierr = DMDASetStencilType(da, stencil);CHKERRQ(ierr);
167b859378eSBarry Smith   ierr = DMDASetStencilWidth(da, swidth);CHKERRQ(ierr);
168b859378eSBarry Smith   ierr = DMSetUp(da);CHKERRQ(ierr);
169060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&coors,1,NULL,PETSC_ENUM);CHKERRQ(ierr);
170bc2bf880SBarry Smith   if (coors) {
1716636e97aSMatthew G Knepley     ierr = DMGetCoordinateDM(da,&dac);CHKERRQ(ierr);
172bc2bf880SBarry Smith     ierr = DMCreateGlobalVector(dac,&c);CHKERRQ(ierr);
173bc2bf880SBarry Smith     ierr = VecLoad(c,viewer);CHKERRQ(ierr);
1746636e97aSMatthew G Knepley     ierr = DMSetCoordinates(da,c);CHKERRQ(ierr);
175bc2bf880SBarry Smith     ierr = VecDestroy(&c);CHKERRQ(ierr);
176bc2bf880SBarry Smith   }
177b859378eSBarry Smith   PetscFunctionReturn(0);
178b859378eSBarry Smith }
179b859378eSBarry Smith 
1801c3fb106SBarry Smith #undef __FUNCT__
181d724dfffSBarry Smith #define __FUNCT__ "DMCreateSubDM_DA"
182d724dfffSBarry Smith PetscErrorCode DMCreateSubDM_DA(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm)
183d724dfffSBarry Smith {
184d724dfffSBarry Smith   DM_DA         *da = (DM_DA*) dm->data;
1854d9407bcSMatthew G. Knepley   PetscSection   section;
1864d9407bcSMatthew G. Knepley   PetscErrorCode ierr;
187d724dfffSBarry Smith 
188d724dfffSBarry Smith   PetscFunctionBegin;
189d724dfffSBarry Smith   if (subdm) {
190c38c1269SMatthew G. Knepley     PetscSF sf;
191c38c1269SMatthew G. Knepley     Vec     coords;
192c38c1269SMatthew G. Knepley     void   *ctx;
193c38c1269SMatthew G. Knepley     /* Cannot use DMClone since the dof stuff is mixed in. Ugh
194c38c1269SMatthew G. Knepley     ierr = DMClone(dm, subdm);CHKERRQ(ierr); */
195c38c1269SMatthew G. Knepley     ierr = DMCreate(PetscObjectComm((PetscObject)dm), subdm);CHKERRQ(ierr);
196c38c1269SMatthew G. Knepley     ierr = DMGetPointSF(dm, &sf);CHKERRQ(ierr);
197c38c1269SMatthew G. Knepley     ierr = DMSetPointSF(*subdm, sf);CHKERRQ(ierr);
198c38c1269SMatthew G. Knepley     ierr = DMGetApplicationContext(dm, &ctx);CHKERRQ(ierr);
199c38c1269SMatthew G. Knepley     ierr = DMSetApplicationContext(*subdm, ctx);CHKERRQ(ierr);
200c38c1269SMatthew G. Knepley     ierr = DMGetCoordinatesLocal(dm, &coords);CHKERRQ(ierr);
201c38c1269SMatthew G. Knepley     if (coords) {
202c38c1269SMatthew G. Knepley       ierr = DMSetCoordinatesLocal(*subdm, coords);CHKERRQ(ierr);
203c38c1269SMatthew G. Knepley     } else {
204c38c1269SMatthew G. Knepley       ierr = DMGetCoordinates(dm, &coords);CHKERRQ(ierr);
205c38c1269SMatthew G. Knepley       if (coords) {ierr = DMSetCoordinates(*subdm, coords);CHKERRQ(ierr);}
206c38c1269SMatthew G. Knepley     }
207c38c1269SMatthew G. Knepley 
208c38c1269SMatthew G. Knepley     ierr = DMSetType(*subdm, DMDA);CHKERRQ(ierr);
209c73cfb54SMatthew G. Knepley     ierr = DMSetDimension(*subdm, dm->dim);CHKERRQ(ierr);
210c38c1269SMatthew G. Knepley     ierr = DMDASetSizes(*subdm, da->M, da->N, da->P);CHKERRQ(ierr);
211c38c1269SMatthew G. Knepley     ierr = DMDASetNumProcs(*subdm, da->m, da->n, da->p);CHKERRQ(ierr);
212c38c1269SMatthew G. Knepley     ierr = DMDASetBoundaryType(*subdm, da->bx, da->by, da->bz);CHKERRQ(ierr);
21338221697SMatthew G. Knepley     ierr = DMDASetDof(*subdm, numFields);CHKERRQ(ierr);
214c38c1269SMatthew G. Knepley     ierr = DMDASetStencilType(*subdm, da->stencil_type);CHKERRQ(ierr);
215c38c1269SMatthew G. Knepley     ierr = DMDASetStencilWidth(*subdm, da->s);CHKERRQ(ierr);
216c38c1269SMatthew G. Knepley     ierr = DMDASetOwnershipRanges(*subdm, da->lx, da->ly, da->lz);CHKERRQ(ierr);
217d724dfffSBarry Smith   }
2184d9407bcSMatthew G. Knepley   ierr = DMGetDefaultSection(dm, &section);CHKERRQ(ierr);
2194d9407bcSMatthew G. Knepley   if (section) {
2204d9407bcSMatthew G. Knepley     ierr = DMCreateSubDM_Section_Private(dm, numFields, fields, is, subdm);CHKERRQ(ierr);
2214d9407bcSMatthew G. Knepley   } else {
222d724dfffSBarry Smith     if (is) {
223d724dfffSBarry Smith       PetscInt *indices, cnt = 0, dof = da->w, i, j;
22438221697SMatthew G. Knepley 
225785e854fSJed Brown       ierr = PetscMalloc1(da->Nlocal*numFields/dof, &indices);CHKERRQ(ierr);
22638221697SMatthew G. Knepley       for (i = da->base/dof; i < (da->base+da->Nlocal)/dof; ++i) {
22738221697SMatthew G. Knepley         for (j = 0; j < numFields; ++j) {
228d724dfffSBarry Smith           indices[cnt++] = dof*i + fields[j];
229d724dfffSBarry Smith         }
230d724dfffSBarry Smith       }
23138221697SMatthew 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);
23238221697SMatthew G. Knepley       ierr = ISCreateGeneral(PetscObjectComm((PetscObject) dm), cnt, indices, PETSC_OWN_POINTER, is);CHKERRQ(ierr);
233d724dfffSBarry Smith     }
234d724dfffSBarry Smith   }
235d724dfffSBarry Smith   PetscFunctionReturn(0);
236d724dfffSBarry Smith }
237d724dfffSBarry Smith 
238d724dfffSBarry Smith #undef __FUNCT__
23916621825SDmitry Karpeev #define __FUNCT__ "DMCreateFieldDecomposition_DA"
24016621825SDmitry Karpeev PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len,char ***namelist, IS **islist, DM **dmlist)
2411c3fb106SBarry Smith {
2421c3fb106SBarry Smith   PetscInt       i;
2431c3fb106SBarry Smith   PetscErrorCode ierr;
2441c3fb106SBarry Smith   DM_DA          *dd = (DM_DA*)dm->data;
2451c3fb106SBarry Smith   PetscInt       dof = dd->w;
2461c3fb106SBarry Smith 
2471c3fb106SBarry Smith   PetscFunctionBegin;
248731c8d9eSDmitry Karpeev   if (len) *len = dof;
2491c3fb106SBarry Smith   if (islist) {
2501c3fb106SBarry Smith     Vec      v;
2511c3fb106SBarry Smith     PetscInt rstart,n;
2521c3fb106SBarry Smith 
2531c3fb106SBarry Smith     ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr);
2540298fd71SBarry Smith     ierr = VecGetOwnershipRange(v,&rstart,NULL);CHKERRQ(ierr);
2551c3fb106SBarry Smith     ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr);
2561c3fb106SBarry Smith     ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr);
257785e854fSJed Brown     ierr = PetscMalloc1(dof,islist);CHKERRQ(ierr);
2581c3fb106SBarry Smith     for (i=0; i<dof; i++) {
259ce94432eSBarry Smith       ierr = ISCreateStride(PetscObjectComm((PetscObject)dm),n/dof,rstart+i,dof,&(*islist)[i]);CHKERRQ(ierr);
2601c3fb106SBarry Smith     }
2611c3fb106SBarry Smith   }
2621c3fb106SBarry Smith   if (namelist) {
263785e854fSJed Brown     ierr = PetscMalloc1(dof, namelist);CHKERRQ(ierr);
2641c3fb106SBarry Smith     if (dd->fieldname) {
2651c3fb106SBarry Smith       for (i=0; i<dof; i++) {
2661c3fb106SBarry Smith         ierr = PetscStrallocpy(dd->fieldname[i],&(*namelist)[i]);CHKERRQ(ierr);
2671c3fb106SBarry Smith       }
2681c3fb106SBarry Smith     } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Currently DMDA must have fieldnames");
2691c3fb106SBarry Smith   }
2701c3fb106SBarry Smith   if (dmlist) {
2711c3fb106SBarry Smith     DM da;
2721c3fb106SBarry Smith 
273ce94432eSBarry Smith     ierr = DMDACreate(PetscObjectComm((PetscObject)dm), &da);CHKERRQ(ierr);
2741cced630SBarry Smith     ierr = DMSetDimension(da, dm->dim);CHKERRQ(ierr);
2751c3fb106SBarry Smith     ierr = DMDASetSizes(da, dd->M, dd->N, dd->P);CHKERRQ(ierr);
2761c3fb106SBarry Smith     ierr = DMDASetNumProcs(da, dd->m, dd->n, dd->p);CHKERRQ(ierr);
2771c3fb106SBarry Smith     ierr = DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz);CHKERRQ(ierr);
2781c3fb106SBarry Smith     ierr = DMDASetDof(da, 1);CHKERRQ(ierr);
2791c3fb106SBarry Smith     ierr = DMDASetStencilType(da, dd->stencil_type);CHKERRQ(ierr);
2801c3fb106SBarry Smith     ierr = DMDASetStencilWidth(da, dd->s);CHKERRQ(ierr);
2811c3fb106SBarry Smith     ierr = DMSetUp(da);CHKERRQ(ierr);
282785e854fSJed Brown     ierr = PetscMalloc1(dof,dmlist);CHKERRQ(ierr);
283c893992eSBarry Smith     for (i=0; i<dof-1; i++) {ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);}
2841c3fb106SBarry Smith     for (i=0; i<dof; i++) (*dmlist)[i] = da;
2851c3fb106SBarry Smith   }
2861c3fb106SBarry Smith   PetscFunctionReturn(0);
2871c3fb106SBarry Smith }
2881c3fb106SBarry Smith 
28938221697SMatthew G. Knepley #undef __FUNCT__
29038221697SMatthew G. Knepley #define __FUNCT__ "DMClone_DA"
29138221697SMatthew G. Knepley PetscErrorCode DMClone_DA(DM dm, DM *newdm)
29238221697SMatthew G. Knepley {
29338221697SMatthew G. Knepley   DM_DA         *da = (DM_DA *) dm->data;
29438221697SMatthew G. Knepley   PetscErrorCode ierr;
29538221697SMatthew G. Knepley 
29638221697SMatthew G. Knepley   PetscFunctionBegin;
2974271099bSMatthew G. Knepley   ierr = DMSetType(*newdm, DMDA);CHKERRQ(ierr);
298c73cfb54SMatthew G. Knepley   ierr = DMSetDimension(*newdm, dm->dim);CHKERRQ(ierr);
2994271099bSMatthew G. Knepley   ierr = DMDASetSizes(*newdm, da->M, da->N, da->P);CHKERRQ(ierr);
3004271099bSMatthew G. Knepley   ierr = DMDASetNumProcs(*newdm, da->m, da->n, da->p);CHKERRQ(ierr);
3014271099bSMatthew G. Knepley   ierr = DMDASetBoundaryType(*newdm, da->bx, da->by, da->bz);CHKERRQ(ierr);
3024271099bSMatthew G. Knepley   ierr = DMDASetDof(*newdm, da->w);CHKERRQ(ierr);
3034271099bSMatthew G. Knepley   ierr = DMDASetStencilType(*newdm, da->stencil_type);CHKERRQ(ierr);
3044271099bSMatthew G. Knepley   ierr = DMDASetStencilWidth(*newdm, da->s);CHKERRQ(ierr);
3054271099bSMatthew G. Knepley   ierr = DMDASetOwnershipRanges(*newdm, da->lx, da->ly, da->lz);CHKERRQ(ierr);
306a9811db3SMatthew G. Knepley   ierr = DMSetUp(*newdm);CHKERRQ(ierr);
30738221697SMatthew G. Knepley   PetscFunctionReturn(0);
30838221697SMatthew G. Knepley }
30938221697SMatthew G. Knepley 
310793f3fe5SMatthew G. Knepley #undef __FUNCT__
311793f3fe5SMatthew G. Knepley #define __FUNCT__ "DMGetDimPoints_DA"
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 #undef __FUNCT__
322502a2867SDave May #define __FUNCT__ "DMGetNeighbors_DA"
323502a2867SDave May static PetscErrorCode DMGetNeighbors_DA(DM dm, PetscInt *nranks, const PetscMPIInt *ranks[])
324502a2867SDave May {
325502a2867SDave May   PetscErrorCode ierr;
326502a2867SDave May   PetscInt dim;
327502a2867SDave May   DMDAStencilType st;
328502a2867SDave May 
329502a2867SDave May   PetscFunctionBegin;
330502a2867SDave May   ierr = DMDAGetNeighbors(dm,ranks);CHKERRQ(ierr);
331502a2867SDave May   ierr = DMDAGetInfo(dm,&dim,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&st);CHKERRQ(ierr);
332502a2867SDave May 
333502a2867SDave May   switch (dim) {
334502a2867SDave May     case 1:
335502a2867SDave May       *nranks = 3;
336*d2ebda5dSSatish Balay       /* if (st == DMDA_STENCIL_STAR) { *nranks = 3; } */
337502a2867SDave May       break;
338502a2867SDave May     case 2:
339502a2867SDave May       *nranks = 9;
340*d2ebda5dSSatish Balay       /* if (st == DMDA_STENCIL_STAR) { *nranks = 5; } */
341502a2867SDave May       break;
342502a2867SDave May     case 3:
343502a2867SDave May       *nranks = 27;
344*d2ebda5dSSatish Balay       /* if (st == DMDA_STENCIL_STAR) { *nranks = 7; } */
345502a2867SDave May       break;
346502a2867SDave May     default:
347502a2867SDave May       break;
348502a2867SDave May   }
349502a2867SDave May   PetscFunctionReturn(0);
350502a2867SDave May }
351502a2867SDave May 
3523efe6655SBarry Smith /*MC
3533efe6655SBarry Smith    DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions.
3543efe6655SBarry Smith          In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points.
3553efe6655SBarry Smith          In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width.
3563efe6655SBarry Smith 
3573efe6655SBarry 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
3583efe6655SBarry Smith          vertex centered.
3593efe6655SBarry Smith 
3603efe6655SBarry Smith   Level: intermediate
3613efe6655SBarry Smith 
3623efe6655SBarry Smith .seealso: DMType, DMCOMPOSITE, DMDACreate(), DMCreate(), DMSetType()
3633efe6655SBarry Smith M*/
3643efe6655SBarry Smith 
3659f52d53eSToby Isaac extern PetscErrorCode DMProjectFunctionLocal_DA(DM, PetscReal, PetscErrorCode (**)(PetscInt, PetscReal, const PetscReal [], PetscInt, PetscScalar *, void *), void **, InsertMode, Vec);
3669f52d53eSToby Isaac extern PetscErrorCode DMComputeL2Diff_DA(DM, PetscReal, PetscErrorCode (**)(PetscInt, PetscReal, const PetscReal [], PetscInt, PetscScalar *, void *), void **, Vec, PetscReal *);
3679f52d53eSToby Isaac extern PetscErrorCode DMComputeL2GradientDiff_DA(DM, PetscReal, PetscErrorCode (**)(PetscInt, PetscReal, const PetscReal [], const PetscReal [],PetscInt, PetscScalar *, void *), void **, Vec,const PetscReal [], PetscReal *);
368c970b36aSToby Isaac 
3691c3fb106SBarry Smith 
37047c6ae99SBarry Smith #undef __FUNCT__
371a4121054SBarry Smith #define __FUNCT__ "DMCreate_DA"
3728cc058d9SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_DA(DM da)
37347c6ae99SBarry Smith {
37447c6ae99SBarry Smith   PetscErrorCode ierr;
37547c6ae99SBarry Smith   DM_DA          *dd;
37647c6ae99SBarry Smith 
37747c6ae99SBarry Smith   PetscFunctionBegin;
378a4121054SBarry Smith   PetscValidPointer(da,1);
379b00a9115SJed Brown   ierr     = PetscNewLog(da,&dd);CHKERRQ(ierr);
380a4121054SBarry Smith   da->data = dd;
38147c6ae99SBarry Smith 
382c73cfb54SMatthew G. Knepley   da->dim        = -1;
383aa219208SBarry Smith   dd->interptype = DMDA_Q1;
38447c6ae99SBarry Smith   dd->refine_x   = 2;
38547c6ae99SBarry Smith   dd->refine_y   = 2;
38647c6ae99SBarry Smith   dd->refine_z   = 2;
38781c108dcSJed Brown   dd->coarsen_x  = 2;
38881c108dcSJed Brown   dd->coarsen_y  = 2;
38981c108dcSJed Brown   dd->coarsen_z  = 2;
3900298fd71SBarry Smith   dd->fieldname  = NULL;
39147c6ae99SBarry Smith   dd->nlocal     = -1;
39247c6ae99SBarry Smith   dd->Nlocal     = -1;
39347c6ae99SBarry Smith   dd->M          = -1;
39447c6ae99SBarry Smith   dd->N          = -1;
39547c6ae99SBarry Smith   dd->P          = -1;
39647c6ae99SBarry Smith   dd->m          = -1;
39747c6ae99SBarry Smith   dd->n          = -1;
39847c6ae99SBarry Smith   dd->p          = -1;
39947c6ae99SBarry Smith   dd->w          = -1;
40047c6ae99SBarry Smith   dd->s          = -1;
4018865f1eaSKarl Rupp 
40247c6ae99SBarry Smith   dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1;
40347c6ae99SBarry Smith   dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1;
40447c6ae99SBarry Smith 
4053e7870d2SPeter Brune   dd->Nsub            = 1;
4067ddda789SPeter Brune   dd->xol             = 0;
4077ddda789SPeter Brune   dd->yol             = 0;
4087ddda789SPeter Brune   dd->zol             = 0;
409d886c4f4SPeter Brune   dd->xo              = 0;
410d886c4f4SPeter Brune   dd->yo              = 0;
411d886c4f4SPeter Brune   dd->zo              = 0;
412e30e807fSPeter Brune   dd->Mo              = -1;
413e30e807fSPeter Brune   dd->No              = -1;
414e30e807fSPeter Brune   dd->Po              = -1;
41588661749SPeter Brune 
4160298fd71SBarry Smith   dd->gtol         = NULL;
4170298fd71SBarry Smith   dd->ltol         = NULL;
4180298fd71SBarry Smith   dd->ao           = NULL;
4199db3d8bcSStefano Zampini   PetscStrallocpy(AOBASIC,(char**)&dd->aotype);
42047c6ae99SBarry Smith   dd->base         = -1;
421bff4a2f0SMatthew G. Knepley   dd->bx           = DM_BOUNDARY_NONE;
422bff4a2f0SMatthew G. Knepley   dd->by           = DM_BOUNDARY_NONE;
423bff4a2f0SMatthew G. Knepley   dd->bz           = DM_BOUNDARY_NONE;
424aa219208SBarry Smith   dd->stencil_type = DMDA_STENCIL_BOX;
425aa219208SBarry Smith   dd->interptype   = DMDA_Q1;
4260298fd71SBarry Smith   dd->lx           = NULL;
4270298fd71SBarry Smith   dd->ly           = NULL;
4280298fd71SBarry Smith   dd->lz           = NULL;
42947c6ae99SBarry Smith 
430454e267fSLisandro Dalcin   dd->elementtype = DMDA_ELEMENT_Q1;
431454e267fSLisandro Dalcin 
432a4121054SBarry Smith   da->ops->globaltolocalbegin          = DMGlobalToLocalBegin_DA;
433a4121054SBarry Smith   da->ops->globaltolocalend            = DMGlobalToLocalEnd_DA;
434a4121054SBarry Smith   da->ops->localtoglobalbegin          = DMLocalToGlobalBegin_DA;
435a4121054SBarry Smith   da->ops->localtoglobalend            = DMLocalToGlobalEnd_DA;
436d78e899eSRichard Tran Mills   da->ops->localtolocalbegin           = DMLocalToLocalBegin_DA;
437d78e899eSRichard Tran Mills   da->ops->localtolocalend             = DMLocalToLocalEnd_DA;
438a4121054SBarry Smith   da->ops->createglobalvector          = DMCreateGlobalVector_DA;
439a4121054SBarry Smith   da->ops->createlocalvector           = DMCreateLocalVector_DA;
44025296bd5SBarry Smith   da->ops->createinterpolation         = DMCreateInterpolation_DA;
441e727c939SJed Brown   da->ops->getcoloring                 = DMCreateColoring_DA;
44225296bd5SBarry Smith   da->ops->creatematrix                = DMCreateMatrix_DA;
443a4121054SBarry Smith   da->ops->refine                      = DMRefine_DA;
444a4121054SBarry Smith   da->ops->coarsen                     = DMCoarsen_DA;
445a4121054SBarry Smith   da->ops->refinehierarchy             = DMRefineHierarchy_DA;
446a4121054SBarry Smith   da->ops->coarsenhierarchy            = DMCoarsenHierarchy_DA;
447e727c939SJed Brown   da->ops->getinjection                = DMCreateInjection_DA;
448e727c939SJed Brown   da->ops->getaggregates               = DMCreateAggregates_DA;
449a4121054SBarry Smith   da->ops->destroy                     = DMDestroy_DA;
450a4121054SBarry Smith   da->ops->view                        = 0;
451a4121054SBarry Smith   da->ops->setfromoptions              = DMSetFromOptions_DA;
452a4121054SBarry Smith   da->ops->setup                       = DMSetUp_DA;
45338221697SMatthew G. Knepley   da->ops->clone                       = DMClone_DA;
454b859378eSBarry Smith   da->ops->load                        = DMLoad_DA;
4556636e97aSMatthew G Knepley   da->ops->createcoordinatedm          = DMCreateCoordinateDM_DA;
456d724dfffSBarry Smith   da->ops->createsubdm                 = DMCreateSubDM_DA;
45716621825SDmitry Karpeev   da->ops->createfielddecomposition    = DMCreateFieldDecomposition_DA;
458e30e807fSPeter Brune   da->ops->createdomaindecomposition   = DMCreateDomainDecomposition_DA;
459e30e807fSPeter Brune   da->ops->createddscatters            = DMCreateDomainDecompositionScatters_DA;
460793f3fe5SMatthew G. Knepley   da->ops->getdimpoints                = DMGetDimPoints_DA;
461c970b36aSToby Isaac   da->ops->projectfunctionlocal        = DMProjectFunctionLocal_DA;
462c970b36aSToby Isaac   da->ops->computel2diff               = DMComputeL2Diff_DA;
463b698f381SToby Isaac   da->ops->computel2gradientdiff       = DMComputeL2GradientDiff_DA;
464502a2867SDave May   da->ops->getneighbors                = DMGetNeighbors_DA;
465a4121054SBarry Smith   PetscFunctionReturn(0);
466a4121054SBarry Smith }
46747c6ae99SBarry Smith 
468a4121054SBarry Smith #undef __FUNCT__
469a4121054SBarry Smith #define __FUNCT__ "DMDACreate"
470a4121054SBarry Smith /*@
471a4121054SBarry Smith   DMDACreate - Creates a DMDA object.
472a4121054SBarry Smith 
473a4121054SBarry Smith   Collective on MPI_Comm
474a4121054SBarry Smith 
475a4121054SBarry Smith   Input Parameter:
476a4121054SBarry Smith . comm - The communicator for the DMDA object
477a4121054SBarry Smith 
478a4121054SBarry Smith   Output Parameter:
479a4121054SBarry Smith . da  - The DMDA object
480a4121054SBarry Smith 
481e0f5d30fSBarry Smith   Level: advanced
482e0f5d30fSBarry Smith 
483e0f5d30fSBarry Smith   Developers Note: Since there exists DMDACreate1/2/3d() should this routine even exist?
484a4121054SBarry Smith 
485a4121054SBarry Smith .keywords: DMDA, create
486e0f5d30fSBarry Smith .seealso:  DMDASetSizes(), DMDADuplicate(),  DMDACreate1d(), DMDACreate2d(), DMDACreate3d()
487a4121054SBarry Smith @*/
4887087cfbeSBarry Smith PetscErrorCode  DMDACreate(MPI_Comm comm, DM *da)
489a4121054SBarry Smith {
490a4121054SBarry Smith   PetscErrorCode ierr;
491a4121054SBarry Smith 
492a4121054SBarry Smith   PetscFunctionBegin;
493a4121054SBarry Smith   PetscValidPointer(da,2);
494a4121054SBarry Smith   ierr = DMCreate(comm,da);CHKERRQ(ierr);
495a4121054SBarry Smith   ierr = DMSetType(*da,DMDA);CHKERRQ(ierr);
49647c6ae99SBarry Smith   PetscFunctionReturn(0);
49747c6ae99SBarry Smith }
498b859378eSBarry Smith 
499b859378eSBarry Smith 
500