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 32*8d07fd27SPatrick 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**); 1359a42bb27SBarry Smith 136b859378eSBarry Smith PetscErrorCode DMLoad_DA(DM da,PetscViewer viewer) 137b859378eSBarry Smith { 138b859378eSBarry Smith PetscErrorCode ierr; 139060da220SMatthew G. Knepley PetscInt dim,m,n,p,dof,swidth; 140b859378eSBarry Smith DMDAStencilType stencil; 141bff4a2f0SMatthew G. Knepley DMBoundaryType bx,by,bz; 142bc2bf880SBarry Smith PetscBool coors; 143bc2bf880SBarry Smith DM dac; 144bc2bf880SBarry Smith Vec c; 145b859378eSBarry Smith 146b859378eSBarry Smith PetscFunctionBegin; 147060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&dim,1,NULL,PETSC_INT);CHKERRQ(ierr); 148060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&m,1,NULL,PETSC_INT);CHKERRQ(ierr); 149060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&n,1,NULL,PETSC_INT);CHKERRQ(ierr); 150060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&p,1,NULL,PETSC_INT);CHKERRQ(ierr); 151060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&dof,1,NULL,PETSC_INT);CHKERRQ(ierr); 152060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&swidth,1,NULL,PETSC_INT);CHKERRQ(ierr); 153060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&bx,1,NULL,PETSC_ENUM);CHKERRQ(ierr); 154060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&by,1,NULL,PETSC_ENUM);CHKERRQ(ierr); 155060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&bz,1,NULL,PETSC_ENUM);CHKERRQ(ierr); 156060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&stencil,1,NULL,PETSC_ENUM);CHKERRQ(ierr); 157b859378eSBarry Smith 158c73cfb54SMatthew G. Knepley ierr = DMSetDimension(da, dim);CHKERRQ(ierr); 159bc2bf880SBarry Smith ierr = DMDASetSizes(da, m,n,p);CHKERRQ(ierr); 160b859378eSBarry Smith ierr = DMDASetBoundaryType(da, bx, by, bz);CHKERRQ(ierr); 161b859378eSBarry Smith ierr = DMDASetDof(da, dof);CHKERRQ(ierr); 162b859378eSBarry Smith ierr = DMDASetStencilType(da, stencil);CHKERRQ(ierr); 163b859378eSBarry Smith ierr = DMDASetStencilWidth(da, swidth);CHKERRQ(ierr); 164b859378eSBarry Smith ierr = DMSetUp(da);CHKERRQ(ierr); 165060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&coors,1,NULL,PETSC_ENUM);CHKERRQ(ierr); 166bc2bf880SBarry Smith if (coors) { 1676636e97aSMatthew G Knepley ierr = DMGetCoordinateDM(da,&dac);CHKERRQ(ierr); 168bc2bf880SBarry Smith ierr = DMCreateGlobalVector(dac,&c);CHKERRQ(ierr); 169bc2bf880SBarry Smith ierr = VecLoad(c,viewer);CHKERRQ(ierr); 1706636e97aSMatthew G Knepley ierr = DMSetCoordinates(da,c);CHKERRQ(ierr); 171bc2bf880SBarry Smith ierr = VecDestroy(&c);CHKERRQ(ierr); 172bc2bf880SBarry Smith } 173b859378eSBarry Smith PetscFunctionReturn(0); 174b859378eSBarry Smith } 175b859378eSBarry Smith 176276c5506SMatthew G. Knepley PetscErrorCode DMCreateSubDM_DA(DM dm, PetscInt numFields, const PetscInt fields[], IS *is, DM *subdm) 177d724dfffSBarry Smith { 178d724dfffSBarry Smith DM_DA *da = (DM_DA*) dm->data; 1794d9407bcSMatthew G. Knepley PetscSection section; 1804d9407bcSMatthew G. Knepley PetscErrorCode ierr; 181d724dfffSBarry Smith 182d724dfffSBarry Smith PetscFunctionBegin; 183d724dfffSBarry Smith if (subdm) { 184c38c1269SMatthew G. Knepley PetscSF sf; 185c38c1269SMatthew G. Knepley Vec coords; 186c38c1269SMatthew G. Knepley void *ctx; 187c38c1269SMatthew G. Knepley /* Cannot use DMClone since the dof stuff is mixed in. Ugh 188c38c1269SMatthew G. Knepley ierr = DMClone(dm, subdm);CHKERRQ(ierr); */ 189c38c1269SMatthew G. Knepley ierr = DMCreate(PetscObjectComm((PetscObject)dm), subdm);CHKERRQ(ierr); 190c38c1269SMatthew G. Knepley ierr = DMGetPointSF(dm, &sf);CHKERRQ(ierr); 191c38c1269SMatthew G. Knepley ierr = DMSetPointSF(*subdm, sf);CHKERRQ(ierr); 192c38c1269SMatthew G. Knepley ierr = DMGetApplicationContext(dm, &ctx);CHKERRQ(ierr); 193c38c1269SMatthew G. Knepley ierr = DMSetApplicationContext(*subdm, ctx);CHKERRQ(ierr); 194c38c1269SMatthew G. Knepley ierr = DMGetCoordinatesLocal(dm, &coords);CHKERRQ(ierr); 195c38c1269SMatthew G. Knepley if (coords) { 196c38c1269SMatthew G. Knepley ierr = DMSetCoordinatesLocal(*subdm, coords);CHKERRQ(ierr); 197c38c1269SMatthew G. Knepley } else { 198c38c1269SMatthew G. Knepley ierr = DMGetCoordinates(dm, &coords);CHKERRQ(ierr); 199c38c1269SMatthew G. Knepley if (coords) {ierr = DMSetCoordinates(*subdm, coords);CHKERRQ(ierr);} 200c38c1269SMatthew G. Knepley } 201c38c1269SMatthew G. Knepley 202c38c1269SMatthew G. Knepley ierr = DMSetType(*subdm, DMDA);CHKERRQ(ierr); 203c73cfb54SMatthew G. Knepley ierr = DMSetDimension(*subdm, dm->dim);CHKERRQ(ierr); 204c38c1269SMatthew G. Knepley ierr = DMDASetSizes(*subdm, da->M, da->N, da->P);CHKERRQ(ierr); 205c38c1269SMatthew G. Knepley ierr = DMDASetNumProcs(*subdm, da->m, da->n, da->p);CHKERRQ(ierr); 206c38c1269SMatthew G. Knepley ierr = DMDASetBoundaryType(*subdm, da->bx, da->by, da->bz);CHKERRQ(ierr); 20738221697SMatthew G. Knepley ierr = DMDASetDof(*subdm, numFields);CHKERRQ(ierr); 208c38c1269SMatthew G. Knepley ierr = DMDASetStencilType(*subdm, da->stencil_type);CHKERRQ(ierr); 209c38c1269SMatthew G. Knepley ierr = DMDASetStencilWidth(*subdm, da->s);CHKERRQ(ierr); 210c38c1269SMatthew G. Knepley ierr = DMDASetOwnershipRanges(*subdm, da->lx, da->ly, da->lz);CHKERRQ(ierr); 211d724dfffSBarry Smith } 2124d9407bcSMatthew G. Knepley ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 2134d9407bcSMatthew G. Knepley if (section) { 2144d9407bcSMatthew G. Knepley ierr = DMCreateSubDM_Section_Private(dm, numFields, fields, is, subdm);CHKERRQ(ierr); 2154d9407bcSMatthew G. Knepley } else { 216d724dfffSBarry Smith if (is) { 217d724dfffSBarry Smith PetscInt *indices, cnt = 0, dof = da->w, i, j; 21838221697SMatthew G. Knepley 219785e854fSJed Brown ierr = PetscMalloc1(da->Nlocal*numFields/dof, &indices);CHKERRQ(ierr); 22038221697SMatthew G. Knepley for (i = da->base/dof; i < (da->base+da->Nlocal)/dof; ++i) { 22138221697SMatthew G. Knepley for (j = 0; j < numFields; ++j) { 222d724dfffSBarry Smith indices[cnt++] = dof*i + fields[j]; 223d724dfffSBarry Smith } 224d724dfffSBarry Smith } 22538221697SMatthew 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); 22638221697SMatthew G. Knepley ierr = ISCreateGeneral(PetscObjectComm((PetscObject) dm), cnt, indices, PETSC_OWN_POINTER, is);CHKERRQ(ierr); 227d724dfffSBarry Smith } 228d724dfffSBarry Smith } 229d724dfffSBarry Smith PetscFunctionReturn(0); 230d724dfffSBarry Smith } 231d724dfffSBarry Smith 23216621825SDmitry Karpeev PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len,char ***namelist, IS **islist, DM **dmlist) 2331c3fb106SBarry Smith { 2341c3fb106SBarry Smith PetscInt i; 2351c3fb106SBarry Smith PetscErrorCode ierr; 2361c3fb106SBarry Smith DM_DA *dd = (DM_DA*)dm->data; 2371c3fb106SBarry Smith PetscInt dof = dd->w; 2381c3fb106SBarry Smith 2391c3fb106SBarry Smith PetscFunctionBegin; 240731c8d9eSDmitry Karpeev if (len) *len = dof; 2411c3fb106SBarry Smith if (islist) { 2421c3fb106SBarry Smith Vec v; 2431c3fb106SBarry Smith PetscInt rstart,n; 2441c3fb106SBarry Smith 2451c3fb106SBarry Smith ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr); 2460298fd71SBarry Smith ierr = VecGetOwnershipRange(v,&rstart,NULL);CHKERRQ(ierr); 2471c3fb106SBarry Smith ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr); 2481c3fb106SBarry Smith ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr); 249785e854fSJed Brown ierr = PetscMalloc1(dof,islist);CHKERRQ(ierr); 2501c3fb106SBarry Smith for (i=0; i<dof; i++) { 251ce94432eSBarry Smith ierr = ISCreateStride(PetscObjectComm((PetscObject)dm),n/dof,rstart+i,dof,&(*islist)[i]);CHKERRQ(ierr); 2521c3fb106SBarry Smith } 2531c3fb106SBarry Smith } 2541c3fb106SBarry Smith if (namelist) { 255785e854fSJed Brown ierr = PetscMalloc1(dof, namelist);CHKERRQ(ierr); 2561c3fb106SBarry Smith if (dd->fieldname) { 2571c3fb106SBarry Smith for (i=0; i<dof; i++) { 2581c3fb106SBarry Smith ierr = PetscStrallocpy(dd->fieldname[i],&(*namelist)[i]);CHKERRQ(ierr); 2591c3fb106SBarry Smith } 2601c3fb106SBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Currently DMDA must have fieldnames"); 2611c3fb106SBarry Smith } 2621c3fb106SBarry Smith if (dmlist) { 2631c3fb106SBarry Smith DM da; 2641c3fb106SBarry Smith 265ce94432eSBarry Smith ierr = DMDACreate(PetscObjectComm((PetscObject)dm), &da);CHKERRQ(ierr); 2661cced630SBarry Smith ierr = DMSetDimension(da, dm->dim);CHKERRQ(ierr); 2671c3fb106SBarry Smith ierr = DMDASetSizes(da, dd->M, dd->N, dd->P);CHKERRQ(ierr); 2681c3fb106SBarry Smith ierr = DMDASetNumProcs(da, dd->m, dd->n, dd->p);CHKERRQ(ierr); 2691c3fb106SBarry Smith ierr = DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz);CHKERRQ(ierr); 2701c3fb106SBarry Smith ierr = DMDASetDof(da, 1);CHKERRQ(ierr); 2711c3fb106SBarry Smith ierr = DMDASetStencilType(da, dd->stencil_type);CHKERRQ(ierr); 2721c3fb106SBarry Smith ierr = DMDASetStencilWidth(da, dd->s);CHKERRQ(ierr); 2731c3fb106SBarry Smith ierr = DMSetUp(da);CHKERRQ(ierr); 274785e854fSJed Brown ierr = PetscMalloc1(dof,dmlist);CHKERRQ(ierr); 275c893992eSBarry Smith for (i=0; i<dof-1; i++) {ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);} 2761c3fb106SBarry Smith for (i=0; i<dof; i++) (*dmlist)[i] = da; 2771c3fb106SBarry Smith } 2781c3fb106SBarry Smith PetscFunctionReturn(0); 2791c3fb106SBarry Smith } 2801c3fb106SBarry Smith 28138221697SMatthew G. Knepley PetscErrorCode DMClone_DA(DM dm, DM *newdm) 28238221697SMatthew G. Knepley { 28338221697SMatthew G. Knepley DM_DA *da = (DM_DA *) dm->data; 28438221697SMatthew G. Knepley PetscErrorCode ierr; 28538221697SMatthew G. Knepley 28638221697SMatthew G. Knepley PetscFunctionBegin; 2874271099bSMatthew G. Knepley ierr = DMSetType(*newdm, DMDA);CHKERRQ(ierr); 288c73cfb54SMatthew G. Knepley ierr = DMSetDimension(*newdm, dm->dim);CHKERRQ(ierr); 2894271099bSMatthew G. Knepley ierr = DMDASetSizes(*newdm, da->M, da->N, da->P);CHKERRQ(ierr); 2904271099bSMatthew G. Knepley ierr = DMDASetNumProcs(*newdm, da->m, da->n, da->p);CHKERRQ(ierr); 2914271099bSMatthew G. Knepley ierr = DMDASetBoundaryType(*newdm, da->bx, da->by, da->bz);CHKERRQ(ierr); 2924271099bSMatthew G. Knepley ierr = DMDASetDof(*newdm, da->w);CHKERRQ(ierr); 2934271099bSMatthew G. Knepley ierr = DMDASetStencilType(*newdm, da->stencil_type);CHKERRQ(ierr); 2944271099bSMatthew G. Knepley ierr = DMDASetStencilWidth(*newdm, da->s);CHKERRQ(ierr); 2954271099bSMatthew G. Knepley ierr = DMDASetOwnershipRanges(*newdm, da->lx, da->ly, da->lz);CHKERRQ(ierr); 296a9811db3SMatthew G. Knepley ierr = DMSetUp(*newdm);CHKERRQ(ierr); 29738221697SMatthew G. Knepley PetscFunctionReturn(0); 29838221697SMatthew G. Knepley } 29938221697SMatthew G. Knepley 3004a7a4c06SLawrence Mitchell static PetscErrorCode DMHasCreateInjection_DA(DM dm, PetscBool *flg) 3014a7a4c06SLawrence Mitchell { 3024a7a4c06SLawrence Mitchell DM_DA *da = (DM_DA *)dm->data; 3034a7a4c06SLawrence Mitchell 3044a7a4c06SLawrence Mitchell PetscFunctionBegin; 3054a7a4c06SLawrence Mitchell PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3064a7a4c06SLawrence Mitchell PetscValidPointer(flg,2); 307131f56ebSLawrence Mitchell *flg = da->interptype == DMDA_Q1 ? PETSC_TRUE : PETSC_FALSE; 3084a7a4c06SLawrence Mitchell PetscFunctionReturn(0); 3094a7a4c06SLawrence Mitchell } 3104a7a4c06SLawrence Mitchell 311793f3fe5SMatthew G. Knepley static PetscErrorCode DMGetDimPoints_DA(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd) 312793f3fe5SMatthew G. Knepley { 313793f3fe5SMatthew G. Knepley PetscErrorCode ierr; 314793f3fe5SMatthew G. Knepley 315793f3fe5SMatthew G. Knepley PetscFunctionBegin; 316793f3fe5SMatthew G. Knepley ierr = DMDAGetDepthStratum(dm, dim, pStart, pEnd);CHKERRQ(ierr); 317793f3fe5SMatthew G. Knepley PetscFunctionReturn(0); 318793f3fe5SMatthew G. Knepley } 319793f3fe5SMatthew G. Knepley 320502a2867SDave May static PetscErrorCode DMGetNeighbors_DA(DM dm, PetscInt *nranks, const PetscMPIInt *ranks[]) 321502a2867SDave May { 322502a2867SDave May PetscErrorCode ierr; 323502a2867SDave May PetscInt dim; 324502a2867SDave May DMDAStencilType st; 325502a2867SDave May 326502a2867SDave May PetscFunctionBegin; 327502a2867SDave May ierr = DMDAGetNeighbors(dm,ranks);CHKERRQ(ierr); 328502a2867SDave May ierr = DMDAGetInfo(dm,&dim,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&st);CHKERRQ(ierr); 329502a2867SDave May 330502a2867SDave May switch (dim) { 331502a2867SDave May case 1: 332502a2867SDave May *nranks = 3; 333d2ebda5dSSatish Balay /* if (st == DMDA_STENCIL_STAR) { *nranks = 3; } */ 334502a2867SDave May break; 335502a2867SDave May case 2: 336502a2867SDave May *nranks = 9; 337d2ebda5dSSatish Balay /* if (st == DMDA_STENCIL_STAR) { *nranks = 5; } */ 338502a2867SDave May break; 339502a2867SDave May case 3: 340502a2867SDave May *nranks = 27; 341d2ebda5dSSatish Balay /* if (st == DMDA_STENCIL_STAR) { *nranks = 7; } */ 342502a2867SDave May break; 343502a2867SDave May default: 344502a2867SDave May break; 345502a2867SDave May } 346502a2867SDave May PetscFunctionReturn(0); 347502a2867SDave May } 348502a2867SDave May 3493efe6655SBarry Smith /*MC 3503efe6655SBarry Smith DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions. 3513efe6655SBarry Smith In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points. 3523efe6655SBarry Smith In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width. 3533efe6655SBarry Smith 3543efe6655SBarry 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 3553efe6655SBarry Smith vertex centered. 3563efe6655SBarry Smith 3573efe6655SBarry Smith Level: intermediate 3583efe6655SBarry Smith 3593efe6655SBarry Smith .seealso: DMType, DMCOMPOSITE, DMDACreate(), DMCreate(), DMSetType() 3603efe6655SBarry Smith M*/ 3613efe6655SBarry Smith 3629f52d53eSToby Isaac extern PetscErrorCode DMProjectFunctionLocal_DA(DM, PetscReal, PetscErrorCode (**)(PetscInt, PetscReal, const PetscReal [], PetscInt, PetscScalar *, void *), void **, InsertMode, Vec); 3639f52d53eSToby Isaac extern PetscErrorCode DMComputeL2Diff_DA(DM, PetscReal, PetscErrorCode (**)(PetscInt, PetscReal, const PetscReal [], PetscInt, PetscScalar *, void *), void **, Vec, PetscReal *); 3649f52d53eSToby Isaac extern PetscErrorCode DMComputeL2GradientDiff_DA(DM, PetscReal, PetscErrorCode (**)(PetscInt, PetscReal, const PetscReal [], const PetscReal [],PetscInt, PetscScalar *, void *), void **, Vec,const PetscReal [], PetscReal *); 36505264a50SDave May extern PetscErrorCode DMLocatePoints_DA_Regular(DM,Vec,DMPointLocationType,PetscSF); 3668135c375SStefano Zampini PETSC_INTERN PetscErrorCode DMSetUpGLVisViewer_DMDA(PetscObject,PetscViewer); 3671c3fb106SBarry Smith 3688cc058d9SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_DA(DM da) 36947c6ae99SBarry Smith { 37047c6ae99SBarry Smith PetscErrorCode ierr; 37147c6ae99SBarry Smith DM_DA *dd; 37247c6ae99SBarry Smith 37347c6ae99SBarry Smith PetscFunctionBegin; 374a4121054SBarry Smith PetscValidPointer(da,1); 375b00a9115SJed Brown ierr = PetscNewLog(da,&dd);CHKERRQ(ierr); 376a4121054SBarry Smith da->data = dd; 37747c6ae99SBarry Smith 378c73cfb54SMatthew G. Knepley da->dim = -1; 379aa219208SBarry Smith dd->interptype = DMDA_Q1; 38047c6ae99SBarry Smith dd->refine_x = 2; 38147c6ae99SBarry Smith dd->refine_y = 2; 38247c6ae99SBarry Smith dd->refine_z = 2; 38381c108dcSJed Brown dd->coarsen_x = 2; 38481c108dcSJed Brown dd->coarsen_y = 2; 38581c108dcSJed Brown dd->coarsen_z = 2; 3860298fd71SBarry Smith dd->fieldname = NULL; 38747c6ae99SBarry Smith dd->nlocal = -1; 38847c6ae99SBarry Smith dd->Nlocal = -1; 38947c6ae99SBarry Smith dd->M = -1; 39047c6ae99SBarry Smith dd->N = -1; 39147c6ae99SBarry Smith dd->P = -1; 39247c6ae99SBarry Smith dd->m = -1; 39347c6ae99SBarry Smith dd->n = -1; 39447c6ae99SBarry Smith dd->p = -1; 39547c6ae99SBarry Smith dd->w = -1; 39647c6ae99SBarry Smith dd->s = -1; 3978865f1eaSKarl Rupp 39847c6ae99SBarry Smith dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1; 39947c6ae99SBarry Smith dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1; 40047c6ae99SBarry Smith 4013e7870d2SPeter Brune dd->Nsub = 1; 4027ddda789SPeter Brune dd->xol = 0; 4037ddda789SPeter Brune dd->yol = 0; 4047ddda789SPeter Brune dd->zol = 0; 405d886c4f4SPeter Brune dd->xo = 0; 406d886c4f4SPeter Brune dd->yo = 0; 407d886c4f4SPeter Brune dd->zo = 0; 408e30e807fSPeter Brune dd->Mo = -1; 409e30e807fSPeter Brune dd->No = -1; 410e30e807fSPeter Brune dd->Po = -1; 41188661749SPeter Brune 4120298fd71SBarry Smith dd->gtol = NULL; 4130298fd71SBarry Smith dd->ltol = NULL; 4140298fd71SBarry Smith dd->ao = NULL; 4159db3d8bcSStefano Zampini PetscStrallocpy(AOBASIC,(char**)&dd->aotype); 41647c6ae99SBarry Smith dd->base = -1; 417bff4a2f0SMatthew G. Knepley dd->bx = DM_BOUNDARY_NONE; 418bff4a2f0SMatthew G. Knepley dd->by = DM_BOUNDARY_NONE; 419bff4a2f0SMatthew G. Knepley dd->bz = DM_BOUNDARY_NONE; 420aa219208SBarry Smith dd->stencil_type = DMDA_STENCIL_BOX; 421aa219208SBarry Smith dd->interptype = DMDA_Q1; 4220298fd71SBarry Smith dd->lx = NULL; 4230298fd71SBarry Smith dd->ly = NULL; 4240298fd71SBarry Smith dd->lz = NULL; 42547c6ae99SBarry Smith 426454e267fSLisandro Dalcin dd->elementtype = DMDA_ELEMENT_Q1; 427454e267fSLisandro Dalcin 428a4121054SBarry Smith da->ops->globaltolocalbegin = DMGlobalToLocalBegin_DA; 429a4121054SBarry Smith da->ops->globaltolocalend = DMGlobalToLocalEnd_DA; 430a4121054SBarry Smith da->ops->localtoglobalbegin = DMLocalToGlobalBegin_DA; 431a4121054SBarry Smith da->ops->localtoglobalend = DMLocalToGlobalEnd_DA; 432d78e899eSRichard Tran Mills da->ops->localtolocalbegin = DMLocalToLocalBegin_DA; 433d78e899eSRichard Tran Mills da->ops->localtolocalend = DMLocalToLocalEnd_DA; 434a4121054SBarry Smith da->ops->createglobalvector = DMCreateGlobalVector_DA; 435a4121054SBarry Smith da->ops->createlocalvector = DMCreateLocalVector_DA; 43625296bd5SBarry Smith da->ops->createinterpolation = DMCreateInterpolation_DA; 437e727c939SJed Brown da->ops->getcoloring = DMCreateColoring_DA; 43825296bd5SBarry Smith da->ops->creatematrix = DMCreateMatrix_DA; 439a4121054SBarry Smith da->ops->refine = DMRefine_DA; 440a4121054SBarry Smith da->ops->coarsen = DMCoarsen_DA; 441a4121054SBarry Smith da->ops->refinehierarchy = DMRefineHierarchy_DA; 442a4121054SBarry Smith da->ops->coarsenhierarchy = DMCoarsenHierarchy_DA; 443e727c939SJed Brown da->ops->getinjection = DMCreateInjection_DA; 4444a7a4c06SLawrence Mitchell da->ops->hascreateinjection = DMHasCreateInjection_DA; 445e727c939SJed Brown da->ops->getaggregates = DMCreateAggregates_DA; 446a4121054SBarry Smith da->ops->destroy = DMDestroy_DA; 447a4121054SBarry Smith da->ops->view = 0; 448a4121054SBarry Smith da->ops->setfromoptions = DMSetFromOptions_DA; 449a4121054SBarry Smith da->ops->setup = DMSetUp_DA; 45038221697SMatthew G. Knepley da->ops->clone = DMClone_DA; 451b859378eSBarry Smith da->ops->load = DMLoad_DA; 4526636e97aSMatthew G Knepley da->ops->createcoordinatedm = DMCreateCoordinateDM_DA; 453d724dfffSBarry Smith da->ops->createsubdm = DMCreateSubDM_DA; 45416621825SDmitry Karpeev da->ops->createfielddecomposition = DMCreateFieldDecomposition_DA; 455e30e807fSPeter Brune da->ops->createdomaindecomposition = DMCreateDomainDecomposition_DA; 456e30e807fSPeter Brune da->ops->createddscatters = DMCreateDomainDecompositionScatters_DA; 457793f3fe5SMatthew G. Knepley da->ops->getdimpoints = DMGetDimPoints_DA; 458c970b36aSToby Isaac da->ops->projectfunctionlocal = DMProjectFunctionLocal_DA; 459c970b36aSToby Isaac da->ops->computel2diff = DMComputeL2Diff_DA; 460b698f381SToby Isaac da->ops->computel2gradientdiff = DMComputeL2GradientDiff_DA; 461502a2867SDave May da->ops->getneighbors = DMGetNeighbors_DA; 46205264a50SDave May da->ops->locatepoints = DMLocatePoints_DA_Regular; 4638135c375SStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)da,"DMSetUpGLVisViewer_C",DMSetUpGLVisViewer_DMDA);CHKERRQ(ierr); 464a4121054SBarry Smith PetscFunctionReturn(0); 465a4121054SBarry Smith } 46647c6ae99SBarry Smith 467a4121054SBarry Smith /*@ 468a4121054SBarry Smith DMDACreate - Creates a DMDA object. 469a4121054SBarry Smith 470a4121054SBarry Smith Collective on MPI_Comm 471a4121054SBarry Smith 472a4121054SBarry Smith Input Parameter: 473a4121054SBarry Smith . comm - The communicator for the DMDA object 474a4121054SBarry Smith 475a4121054SBarry Smith Output Parameter: 476a4121054SBarry Smith . da - The DMDA object 477a4121054SBarry Smith 478e0f5d30fSBarry Smith Level: advanced 479e0f5d30fSBarry Smith 480e0f5d30fSBarry Smith Developers Note: Since there exists DMDACreate1/2/3d() should this routine even exist? 481a4121054SBarry Smith 482a4121054SBarry Smith .keywords: DMDA, create 483e0f5d30fSBarry Smith .seealso: DMDASetSizes(), DMDADuplicate(), DMDACreate1d(), DMDACreate2d(), DMDACreate3d() 484a4121054SBarry Smith @*/ 4857087cfbeSBarry Smith PetscErrorCode DMDACreate(MPI_Comm comm, DM *da) 486a4121054SBarry Smith { 487a4121054SBarry Smith PetscErrorCode ierr; 488a4121054SBarry Smith 489a4121054SBarry Smith PetscFunctionBegin; 490a4121054SBarry Smith PetscValidPointer(da,2); 491a4121054SBarry Smith ierr = DMCreate(comm,da);CHKERRQ(ierr); 492a4121054SBarry Smith ierr = DMSetType(*da,DMDA);CHKERRQ(ierr); 49347c6ae99SBarry Smith PetscFunctionReturn(0); 49447c6ae99SBarry Smith } 495b859378eSBarry Smith 496b859378eSBarry Smith 497