17d0a6c19SBarry Smith 2af0996ceSBarry Smith #include <petsc/private/dmdaimpl.h> /*I "petscdmda.h" I*/ 347c6ae99SBarry Smith 49371c9d4SSatish Balay PetscErrorCode DMSetFromOptions_DA(DM da, PetscOptionItems *PetscOptionsObject) { 547c6ae99SBarry Smith DM_DA *dd = (DM_DA *)da->data; 6c73cfb54SMatthew G. Knepley PetscInt refine = 0, dim = da->dim, maxnlevels = 100, refx[100], refy[100], refz[100], n, i; 7897f7067SBarry Smith PetscBool flg; 847c6ae99SBarry Smith 947c6ae99SBarry Smith PetscFunctionBegin; 1008401ef6SPierre Jolivet PetscCheck(dd->M >= 0, PetscObjectComm((PetscObject)da), PETSC_ERR_ARG_OUTOFRANGE, "Dimension must be non-negative, call DMSetFromOptions() if you want to change the value at runtime"); 1108401ef6SPierre Jolivet PetscCheck(dd->N >= 0, PetscObjectComm((PetscObject)da), PETSC_ERR_ARG_OUTOFRANGE, "Dimension must be non-negative, call DMSetFromOptions() if you want to change the value at runtime"); 1208401ef6SPierre Jolivet PetscCheck(dd->P >= 0, PetscObjectComm((PetscObject)da), PETSC_ERR_ARG_OUTOFRANGE, "Dimension must be non-negative, call DMSetFromOptions() if you want to change the value at runtime"); 13235683edSBarry Smith 14d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "DMDA Options"); 159566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-da_grid_x", "Number of grid points in x direction", "DMDASetSizes", dd->M, &dd->M, NULL, 1)); 169566063dSJacob Faibussowitsch if (dim > 1) PetscCall(PetscOptionsBoundedInt("-da_grid_y", "Number of grid points in y direction", "DMDASetSizes", dd->N, &dd->N, NULL, 1)); 179566063dSJacob Faibussowitsch if (dim > 2) PetscCall(PetscOptionsBoundedInt("-da_grid_z", "Number of grid points in z direction", "DMDASetSizes", dd->P, &dd->P, NULL, 1)); 187ddda789SPeter Brune 199566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-da_overlap", "Decomposition overlap in all directions", "DMDASetOverlap", dd->xol, &dd->xol, &flg, 0)); 209566063dSJacob Faibussowitsch if (flg) PetscCall(DMDASetOverlap(da, dd->xol, dd->xol, dd->xol)); 219566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-da_overlap_x", "Decomposition overlap in x direction", "DMDASetOverlap", dd->xol, &dd->xol, NULL, 0)); 229566063dSJacob Faibussowitsch if (dim > 1) PetscCall(PetscOptionsBoundedInt("-da_overlap_y", "Decomposition overlap in y direction", "DMDASetOverlap", dd->yol, &dd->yol, NULL, 0)); 239566063dSJacob Faibussowitsch if (dim > 2) PetscCall(PetscOptionsBoundedInt("-da_overlap_z", "Decomposition overlap in z direction", "DMDASetOverlap", dd->zol, &dd->zol, NULL, 0)); 243e7870d2SPeter Brune 259566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-da_local_subdomains", "", "DMDASetNumLocalSubdomains", dd->Nsub, &dd->Nsub, &flg, PETSC_DECIDE)); 269566063dSJacob Faibussowitsch if (flg) PetscCall(DMDASetNumLocalSubDomains(da, dd->Nsub)); 273e7870d2SPeter Brune 288d07fd27SPatrick Sanan /* Handle DMDA parallel distribution */ 299566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-da_processors_x", "Number of processors in x direction", "DMDASetNumProcs", dd->m, &dd->m, NULL, PETSC_DECIDE)); 309566063dSJacob Faibussowitsch if (dim > 1) PetscCall(PetscOptionsBoundedInt("-da_processors_y", "Number of processors in y direction", "DMDASetNumProcs", dd->n, &dd->n, NULL, PETSC_DECIDE)); 319566063dSJacob Faibussowitsch if (dim > 2) PetscCall(PetscOptionsBoundedInt("-da_processors_z", "Number of processors in z direction", "DMDASetNumProcs", dd->p, &dd->p, NULL, PETSC_DECIDE)); 32aa219208SBarry Smith /* Handle DMDA refinement */ 339566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-da_refine_x", "Refinement ratio in x direction", "DMDASetRefinementFactor", dd->refine_x, &dd->refine_x, NULL, 1)); 349566063dSJacob Faibussowitsch if (dim > 1) PetscCall(PetscOptionsBoundedInt("-da_refine_y", "Refinement ratio in y direction", "DMDASetRefinementFactor", dd->refine_y, &dd->refine_y, NULL, 1)); 359566063dSJacob Faibussowitsch if (dim > 2) PetscCall(PetscOptionsBoundedInt("-da_refine_z", "Refinement ratio in z direction", "DMDASetRefinementFactor", dd->refine_z, &dd->refine_z, NULL, 1)); 369371c9d4SSatish Balay dd->coarsen_x = dd->refine_x; 379371c9d4SSatish Balay dd->coarsen_y = dd->refine_y; 389371c9d4SSatish Balay dd->coarsen_z = dd->refine_z; 3947c6ae99SBarry Smith 40397b6216SJed Brown /* Get refinement factors, defaults taken from the coarse DMDA */ 419566063dSJacob Faibussowitsch PetscCall(DMDAGetRefinementFactor(da, &refx[0], &refy[0], &refz[0])); 42397b6216SJed Brown for (i = 1; i < maxnlevels; i++) { 43397b6216SJed Brown refx[i] = refx[0]; 44397b6216SJed Brown refy[i] = refy[0]; 45397b6216SJed Brown refz[i] = refz[0]; 46397b6216SJed Brown } 47397b6216SJed Brown n = maxnlevels; 489566063dSJacob Faibussowitsch PetscCall(PetscOptionsIntArray("-da_refine_hierarchy_x", "Refinement factor for each level", "None", refx, &n, &flg)); 49897f7067SBarry Smith if (flg) { 50897f7067SBarry Smith dd->refine_x = refx[0]; 51897f7067SBarry Smith dd->refine_x_hier_n = n; 529566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n, &dd->refine_x_hier)); 539566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(dd->refine_x_hier, refx, n)); 54897f7067SBarry Smith } 55c73cfb54SMatthew G. Knepley if (dim > 1) { 56397b6216SJed Brown n = maxnlevels; 579566063dSJacob Faibussowitsch PetscCall(PetscOptionsIntArray("-da_refine_hierarchy_y", "Refinement factor for each level", "None", refy, &n, &flg)); 58897f7067SBarry Smith if (flg) { 59897f7067SBarry Smith dd->refine_y = refy[0]; 60897f7067SBarry Smith dd->refine_y_hier_n = n; 619566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n, &dd->refine_y_hier)); 629566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(dd->refine_y_hier, refy, n)); 63897f7067SBarry Smith } 64397b6216SJed Brown } 65c73cfb54SMatthew G. Knepley if (dim > 2) { 66397b6216SJed Brown n = maxnlevels; 679566063dSJacob Faibussowitsch PetscCall(PetscOptionsIntArray("-da_refine_hierarchy_z", "Refinement factor for each level", "None", refz, &n, &flg)); 68897f7067SBarry Smith if (flg) { 69897f7067SBarry Smith dd->refine_z = refz[0]; 70897f7067SBarry Smith dd->refine_z_hier_n = n; 719566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n, &dd->refine_z_hier)); 729566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(dd->refine_z_hier, refz, n)); 73897f7067SBarry Smith } 74397b6216SJed Brown } 75397b6216SJed Brown 769566063dSJacob Faibussowitsch PetscCall(PetscOptionsBoundedInt("-da_refine", "Uniformly refine DA one or more times", "None", refine, &refine, NULL, 0)); 77d0609cedSBarry Smith PetscOptionsHeadEnd(); 78235683edSBarry Smith 79e0f5d30fSBarry Smith while (refine--) { 80bff4a2f0SMatthew G. Knepley if (dd->bx == DM_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) { 817a3b7fd5SBarry Smith PetscCall(PetscIntMultError(dd->refine_x, dd->M, &dd->M)); 82e0f5d30fSBarry Smith } else { 837a3b7fd5SBarry Smith PetscCall(PetscIntMultError(dd->refine_x, dd->M - 1, &dd->M)); 847a3b7fd5SBarry Smith dd->M += 1; 85e0f5d30fSBarry Smith } 86bff4a2f0SMatthew G. Knepley if (dd->by == DM_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) { 877a3b7fd5SBarry Smith PetscCall(PetscIntMultError(dd->refine_y, dd->N, &dd->N)); 88e0f5d30fSBarry Smith } else { 897a3b7fd5SBarry Smith PetscCall(PetscIntMultError(dd->refine_y, dd->N - 1, &dd->N)); 907a3b7fd5SBarry Smith dd->N += 1; 91e0f5d30fSBarry Smith } 92bff4a2f0SMatthew G. Knepley if (dd->bz == DM_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) { 937a3b7fd5SBarry Smith PetscCall(PetscIntMultError(dd->refine_z, dd->P, &dd->P)); 94e0f5d30fSBarry Smith } else { 957a3b7fd5SBarry Smith PetscCall(PetscIntMultError(dd->refine_z, dd->P - 1, &dd->P)); 967a3b7fd5SBarry Smith dd->P += 1; 97e0f5d30fSBarry Smith } 98e0f5d30fSBarry Smith da->levelup++; 9985fc4b34SJed Brown if (da->levelup - da->leveldown >= 0) { 10085fc4b34SJed Brown dd->refine_x = refx[da->levelup - da->leveldown]; 10185fc4b34SJed Brown dd->refine_y = refy[da->levelup - da->leveldown]; 10285fc4b34SJed Brown dd->refine_z = refz[da->levelup - da->leveldown]; 10385fc4b34SJed Brown } 10485fc4b34SJed Brown if (da->levelup - da->leveldown >= 1) { 10585fc4b34SJed Brown dd->coarsen_x = refx[da->levelup - da->leveldown - 1]; 10685fc4b34SJed Brown dd->coarsen_y = refy[da->levelup - da->leveldown - 1]; 10785fc4b34SJed Brown dd->coarsen_z = refz[da->levelup - da->leveldown - 1]; 10885fc4b34SJed Brown } 109e0f5d30fSBarry Smith } 11047c6ae99SBarry Smith PetscFunctionReturn(0); 11147c6ae99SBarry Smith } 11247c6ae99SBarry Smith 1137087cfbeSBarry Smith extern PetscErrorCode DMCreateGlobalVector_DA(DM, Vec *); 1147087cfbeSBarry Smith extern PetscErrorCode DMCreateLocalVector_DA(DM, Vec *); 1157087cfbeSBarry Smith extern PetscErrorCode DMGlobalToLocalBegin_DA(DM, Vec, InsertMode, Vec); 1167087cfbeSBarry Smith extern PetscErrorCode DMGlobalToLocalEnd_DA(DM, Vec, InsertMode, Vec); 1177087cfbeSBarry Smith extern PetscErrorCode DMLocalToGlobalBegin_DA(DM, Vec, InsertMode, Vec); 1187087cfbeSBarry Smith extern PetscErrorCode DMLocalToGlobalEnd_DA(DM, Vec, InsertMode, Vec); 119d78e899eSRichard Tran Mills extern PetscErrorCode DMLocalToLocalBegin_DA(DM, Vec, InsertMode, Vec); 120d78e899eSRichard Tran Mills extern PetscErrorCode DMLocalToLocalEnd_DA(DM, Vec, InsertMode, Vec); 121e727c939SJed Brown extern PetscErrorCode DMCreateInterpolation_DA(DM, DM, Mat *, Vec *); 122b412c318SBarry Smith extern PetscErrorCode DMCreateColoring_DA(DM, ISColoringType, ISColoring *); 123b412c318SBarry Smith extern PetscErrorCode DMCreateMatrix_DA(DM, Mat *); 1246636e97aSMatthew G Knepley extern PetscErrorCode DMCreateCoordinateDM_DA(DM, DM *); 1257087cfbeSBarry Smith extern PetscErrorCode DMRefine_DA(DM, MPI_Comm, DM *); 1267087cfbeSBarry Smith extern PetscErrorCode DMCoarsen_DA(DM, MPI_Comm, DM *); 1277087cfbeSBarry Smith extern PetscErrorCode DMRefineHierarchy_DA(DM, PetscInt, DM[]); 1287087cfbeSBarry Smith extern PetscErrorCode DMCoarsenHierarchy_DA(DM, PetscInt, DM[]); 1296dbf9973SLawrence Mitchell extern PetscErrorCode DMCreateInjection_DA(DM, DM, Mat *); 1307087cfbeSBarry Smith extern PetscErrorCode DMView_DA(DM, PetscViewer); 1317087cfbeSBarry Smith extern PetscErrorCode DMSetUp_DA(DM); 1327087cfbeSBarry Smith extern PetscErrorCode DMDestroy_DA(DM); 133e30e807fSPeter Brune extern PetscErrorCode DMCreateDomainDecomposition_DA(DM, PetscInt *, char ***, IS **, IS **, DM **); 134e30e807fSPeter Brune extern PetscErrorCode DMCreateDomainDecompositionScatters_DA(DM, PetscInt, DM *, VecScatter **, VecScatter **, VecScatter **); 1357c3cd84eSPatrick Sanan PETSC_INTERN PetscErrorCode DMGetCompatibility_DA(DM, DM, PetscBool *, PetscBool *); 1369a42bb27SBarry Smith 1379371c9d4SSatish Balay PetscErrorCode DMLoad_DA(DM da, PetscViewer viewer) { 138060da220SMatthew G. Knepley PetscInt dim, m, n, p, dof, swidth; 139b859378eSBarry Smith DMDAStencilType stencil; 140bff4a2f0SMatthew G. Knepley DMBoundaryType bx, by, bz; 141bc2bf880SBarry Smith PetscBool coors; 142bc2bf880SBarry Smith DM dac; 143bc2bf880SBarry Smith Vec c; 144b859378eSBarry Smith 145b859378eSBarry Smith PetscFunctionBegin; 1469566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &dim, 1, NULL, PETSC_INT)); 1479566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &m, 1, NULL, PETSC_INT)); 1489566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &n, 1, NULL, PETSC_INT)); 1499566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &p, 1, NULL, PETSC_INT)); 1509566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &dof, 1, NULL, PETSC_INT)); 1519566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &swidth, 1, NULL, PETSC_INT)); 1529566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &bx, 1, NULL, PETSC_ENUM)); 1539566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &by, 1, NULL, PETSC_ENUM)); 1549566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &bz, 1, NULL, PETSC_ENUM)); 1559566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &stencil, 1, NULL, PETSC_ENUM)); 156b859378eSBarry Smith 1579566063dSJacob Faibussowitsch PetscCall(DMSetDimension(da, dim)); 1589566063dSJacob Faibussowitsch PetscCall(DMDASetSizes(da, m, n, p)); 1599566063dSJacob Faibussowitsch PetscCall(DMDASetBoundaryType(da, bx, by, bz)); 1609566063dSJacob Faibussowitsch PetscCall(DMDASetDof(da, dof)); 1619566063dSJacob Faibussowitsch PetscCall(DMDASetStencilType(da, stencil)); 1629566063dSJacob Faibussowitsch PetscCall(DMDASetStencilWidth(da, swidth)); 1639566063dSJacob Faibussowitsch PetscCall(DMSetUp(da)); 1649566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &coors, 1, NULL, PETSC_ENUM)); 165bc2bf880SBarry Smith if (coors) { 1669566063dSJacob Faibussowitsch PetscCall(DMGetCoordinateDM(da, &dac)); 1679566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dac, &c)); 1689566063dSJacob Faibussowitsch PetscCall(VecLoad(c, viewer)); 1699566063dSJacob Faibussowitsch PetscCall(DMSetCoordinates(da, c)); 1709566063dSJacob Faibussowitsch PetscCall(VecDestroy(&c)); 171bc2bf880SBarry Smith } 172b859378eSBarry Smith PetscFunctionReturn(0); 173b859378eSBarry Smith } 174b859378eSBarry Smith 1759371c9d4SSatish Balay PetscErrorCode DMCreateSubDM_DA(DM dm, PetscInt numFields, const PetscInt fields[], IS *is, DM *subdm) { 176d724dfffSBarry Smith DM_DA *da = (DM_DA *)dm->data; 177d724dfffSBarry Smith 178d724dfffSBarry Smith PetscFunctionBegin; 179d724dfffSBarry Smith if (subdm) { 180c38c1269SMatthew G. Knepley PetscSF sf; 181c38c1269SMatthew G. Knepley Vec coords; 182c38c1269SMatthew G. Knepley void *ctx; 183c38c1269SMatthew G. Knepley /* Cannot use DMClone since the dof stuff is mixed in. Ugh 1849566063dSJacob Faibussowitsch PetscCall(DMClone(dm, subdm)); */ 1859566063dSJacob Faibussowitsch PetscCall(DMCreate(PetscObjectComm((PetscObject)dm), subdm)); 1869566063dSJacob Faibussowitsch PetscCall(DMGetPointSF(dm, &sf)); 1879566063dSJacob Faibussowitsch PetscCall(DMSetPointSF(*subdm, sf)); 1889566063dSJacob Faibussowitsch PetscCall(DMGetApplicationContext(dm, &ctx)); 1899566063dSJacob Faibussowitsch PetscCall(DMSetApplicationContext(*subdm, ctx)); 1909566063dSJacob Faibussowitsch PetscCall(DMGetCoordinatesLocal(dm, &coords)); 191c38c1269SMatthew G. Knepley if (coords) { 1929566063dSJacob Faibussowitsch PetscCall(DMSetCoordinatesLocal(*subdm, coords)); 193c38c1269SMatthew G. Knepley } else { 1949566063dSJacob Faibussowitsch PetscCall(DMGetCoordinates(dm, &coords)); 1959566063dSJacob Faibussowitsch if (coords) PetscCall(DMSetCoordinates(*subdm, coords)); 196c38c1269SMatthew G. Knepley } 197c38c1269SMatthew G. Knepley 1989566063dSJacob Faibussowitsch PetscCall(DMSetType(*subdm, DMDA)); 1999566063dSJacob Faibussowitsch PetscCall(DMSetDimension(*subdm, dm->dim)); 2009566063dSJacob Faibussowitsch PetscCall(DMDASetSizes(*subdm, da->M, da->N, da->P)); 2019566063dSJacob Faibussowitsch PetscCall(DMDASetNumProcs(*subdm, da->m, da->n, da->p)); 2029566063dSJacob Faibussowitsch PetscCall(DMDASetBoundaryType(*subdm, da->bx, da->by, da->bz)); 2039566063dSJacob Faibussowitsch PetscCall(DMDASetDof(*subdm, numFields)); 2049566063dSJacob Faibussowitsch PetscCall(DMDASetStencilType(*subdm, da->stencil_type)); 2059566063dSJacob Faibussowitsch PetscCall(DMDASetStencilWidth(*subdm, da->s)); 2069566063dSJacob Faibussowitsch PetscCall(DMDASetOwnershipRanges(*subdm, da->lx, da->ly, da->lz)); 207d724dfffSBarry Smith } 208d724dfffSBarry Smith if (is) { 209d724dfffSBarry Smith PetscInt *indices, cnt = 0, dof = da->w, i, j; 21038221697SMatthew G. Knepley 2119566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(da->Nlocal * numFields / dof, &indices)); 21238221697SMatthew G. Knepley for (i = da->base / dof; i < (da->base + da->Nlocal) / dof; ++i) { 2139371c9d4SSatish Balay for (j = 0; j < numFields; ++j) { indices[cnt++] = dof * i + fields[j]; } 214d724dfffSBarry Smith } 21563a3b9bcSJacob Faibussowitsch PetscCheck(cnt == da->Nlocal * numFields / dof, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Count %" PetscInt_FMT " does not equal expected value %" PetscInt_FMT, cnt, da->Nlocal * numFields / dof); 2169566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PetscObjectComm((PetscObject)dm), cnt, indices, PETSC_OWN_POINTER, is)); 217d724dfffSBarry Smith } 218d724dfffSBarry Smith PetscFunctionReturn(0); 219d724dfffSBarry Smith } 220d724dfffSBarry Smith 2219371c9d4SSatish Balay PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len, char ***namelist, IS **islist, DM **dmlist) { 2221c3fb106SBarry Smith PetscInt i; 2231c3fb106SBarry Smith DM_DA *dd = (DM_DA *)dm->data; 2241c3fb106SBarry Smith PetscInt dof = dd->w; 2251c3fb106SBarry Smith 2261c3fb106SBarry Smith PetscFunctionBegin; 227731c8d9eSDmitry Karpeev if (len) *len = dof; 2281c3fb106SBarry Smith if (islist) { 2291c3fb106SBarry Smith Vec v; 2301c3fb106SBarry Smith PetscInt rstart, n; 2311c3fb106SBarry Smith 2329566063dSJacob Faibussowitsch PetscCall(DMGetGlobalVector(dm, &v)); 2339566063dSJacob Faibussowitsch PetscCall(VecGetOwnershipRange(v, &rstart, NULL)); 2349566063dSJacob Faibussowitsch PetscCall(VecGetLocalSize(v, &n)); 2359566063dSJacob Faibussowitsch PetscCall(DMRestoreGlobalVector(dm, &v)); 2369566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(dof, islist)); 237*48a46eb9SPierre Jolivet for (i = 0; i < dof; i++) PetscCall(ISCreateStride(PetscObjectComm((PetscObject)dm), n / dof, rstart + i, dof, &(*islist)[i])); 2381c3fb106SBarry Smith } 2391c3fb106SBarry Smith if (namelist) { 2409566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(dof, namelist)); 2411c3fb106SBarry Smith if (dd->fieldname) { 242*48a46eb9SPierre Jolivet for (i = 0; i < dof; i++) PetscCall(PetscStrallocpy(dd->fieldname[i], &(*namelist)[i])); 2431c3fb106SBarry Smith } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Currently DMDA must have fieldnames"); 2441c3fb106SBarry Smith } 2451c3fb106SBarry Smith if (dmlist) { 2461c3fb106SBarry Smith DM da; 2471c3fb106SBarry Smith 2489566063dSJacob Faibussowitsch PetscCall(DMDACreate(PetscObjectComm((PetscObject)dm), &da)); 2499566063dSJacob Faibussowitsch PetscCall(DMSetDimension(da, dm->dim)); 2509566063dSJacob Faibussowitsch PetscCall(DMDASetSizes(da, dd->M, dd->N, dd->P)); 2519566063dSJacob Faibussowitsch PetscCall(DMDASetNumProcs(da, dd->m, dd->n, dd->p)); 2529566063dSJacob Faibussowitsch PetscCall(DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz)); 2539566063dSJacob Faibussowitsch PetscCall(DMDASetDof(da, 1)); 2549566063dSJacob Faibussowitsch PetscCall(DMDASetStencilType(da, dd->stencil_type)); 2559566063dSJacob Faibussowitsch PetscCall(DMDASetStencilWidth(da, dd->s)); 2569566063dSJacob Faibussowitsch PetscCall(DMSetUp(da)); 2579566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(dof, dmlist)); 2589566063dSJacob Faibussowitsch for (i = 0; i < dof - 1; i++) PetscCall(PetscObjectReference((PetscObject)da)); 2591c3fb106SBarry Smith for (i = 0; i < dof; i++) (*dmlist)[i] = da; 2601c3fb106SBarry Smith } 2611c3fb106SBarry Smith PetscFunctionReturn(0); 2621c3fb106SBarry Smith } 2631c3fb106SBarry Smith 2649371c9d4SSatish Balay PetscErrorCode DMClone_DA(DM dm, DM *newdm) { 26538221697SMatthew G. Knepley DM_DA *da = (DM_DA *)dm->data; 26638221697SMatthew G. Knepley 26738221697SMatthew G. Knepley PetscFunctionBegin; 2689566063dSJacob Faibussowitsch PetscCall(DMSetType(*newdm, DMDA)); 2699566063dSJacob Faibussowitsch PetscCall(DMSetDimension(*newdm, dm->dim)); 2709566063dSJacob Faibussowitsch PetscCall(DMDASetSizes(*newdm, da->M, da->N, da->P)); 2719566063dSJacob Faibussowitsch PetscCall(DMDASetNumProcs(*newdm, da->m, da->n, da->p)); 2729566063dSJacob Faibussowitsch PetscCall(DMDASetBoundaryType(*newdm, da->bx, da->by, da->bz)); 2739566063dSJacob Faibussowitsch PetscCall(DMDASetDof(*newdm, da->w)); 2749566063dSJacob Faibussowitsch PetscCall(DMDASetStencilType(*newdm, da->stencil_type)); 2759566063dSJacob Faibussowitsch PetscCall(DMDASetStencilWidth(*newdm, da->s)); 2769566063dSJacob Faibussowitsch PetscCall(DMDASetOwnershipRanges(*newdm, da->lx, da->ly, da->lz)); 2779566063dSJacob Faibussowitsch PetscCall(DMSetUp(*newdm)); 27838221697SMatthew G. Knepley PetscFunctionReturn(0); 27938221697SMatthew G. Knepley } 28038221697SMatthew G. Knepley 2819371c9d4SSatish Balay static PetscErrorCode DMHasCreateInjection_DA(DM dm, PetscBool *flg) { 2824a7a4c06SLawrence Mitchell DM_DA *da = (DM_DA *)dm->data; 2834a7a4c06SLawrence Mitchell 2844a7a4c06SLawrence Mitchell PetscFunctionBegin; 2854a7a4c06SLawrence Mitchell PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 286534a8f05SLisandro Dalcin PetscValidBoolPointer(flg, 2); 287131f56ebSLawrence Mitchell *flg = da->interptype == DMDA_Q1 ? PETSC_TRUE : PETSC_FALSE; 2884a7a4c06SLawrence Mitchell PetscFunctionReturn(0); 2894a7a4c06SLawrence Mitchell } 2904a7a4c06SLawrence Mitchell 2919371c9d4SSatish Balay static PetscErrorCode DMGetDimPoints_DA(DM dm, PetscInt dim, PetscInt *pStart, PetscInt *pEnd) { 292793f3fe5SMatthew G. Knepley PetscFunctionBegin; 2939566063dSJacob Faibussowitsch PetscCall(DMDAGetDepthStratum(dm, dim, pStart, pEnd)); 294793f3fe5SMatthew G. Knepley PetscFunctionReturn(0); 295793f3fe5SMatthew G. Knepley } 296793f3fe5SMatthew G. Knepley 2979371c9d4SSatish Balay static PetscErrorCode DMGetNeighbors_DA(DM dm, PetscInt *nranks, const PetscMPIInt *ranks[]) { 298502a2867SDave May PetscInt dim; 299502a2867SDave May DMDAStencilType st; 300502a2867SDave May 301502a2867SDave May PetscFunctionBegin; 3029566063dSJacob Faibussowitsch PetscCall(DMDAGetNeighbors(dm, ranks)); 3039566063dSJacob Faibussowitsch PetscCall(DMDAGetInfo(dm, &dim, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &st)); 304502a2867SDave May 305502a2867SDave May switch (dim) { 306502a2867SDave May case 1: 307502a2867SDave May *nranks = 3; 308d2ebda5dSSatish Balay /* if (st == DMDA_STENCIL_STAR) { *nranks = 3; } */ 309502a2867SDave May break; 310502a2867SDave May case 2: 311502a2867SDave May *nranks = 9; 312d2ebda5dSSatish Balay /* if (st == DMDA_STENCIL_STAR) { *nranks = 5; } */ 313502a2867SDave May break; 314502a2867SDave May case 3: 315502a2867SDave May *nranks = 27; 316d2ebda5dSSatish Balay /* if (st == DMDA_STENCIL_STAR) { *nranks = 7; } */ 317502a2867SDave May break; 3189371c9d4SSatish Balay default: break; 319502a2867SDave May } 320502a2867SDave May PetscFunctionReturn(0); 321502a2867SDave May } 322502a2867SDave May 3233efe6655SBarry Smith /*MC 3243efe6655SBarry Smith DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions. 3253efe6655SBarry Smith In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points. 3263efe6655SBarry Smith In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width. 3273efe6655SBarry Smith 3283efe6655SBarry 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 3293bd220d7SPatrick Sanan vertex centered; see the documentation for DMSTAG, a similar DM implementation which supports these staggered grids. 3303efe6655SBarry Smith 3313efe6655SBarry Smith Level: intermediate 3323efe6655SBarry Smith 333db781477SPatrick Sanan .seealso: `DMType`, `DMCOMPOSITE`, `DMSTAG`, `DMDACreate()`, `DMCreate()`, `DMSetType()` 3343efe6655SBarry Smith M*/ 3353efe6655SBarry Smith 33605264a50SDave May extern PetscErrorCode DMLocatePoints_DA_Regular(DM, Vec, DMPointLocationType, PetscSF); 3378135c375SStefano Zampini PETSC_INTERN PetscErrorCode DMSetUpGLVisViewer_DMDA(PetscObject, PetscViewer); 3381c3fb106SBarry Smith 3399371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode DMCreate_DA(DM da) { 34047c6ae99SBarry Smith DM_DA *dd; 34147c6ae99SBarry Smith 34247c6ae99SBarry Smith PetscFunctionBegin; 343a4121054SBarry Smith PetscValidPointer(da, 1); 3449566063dSJacob Faibussowitsch PetscCall(PetscNewLog(da, &dd)); 345a4121054SBarry Smith da->data = dd; 34647c6ae99SBarry Smith 347c73cfb54SMatthew G. Knepley da->dim = -1; 348aa219208SBarry Smith dd->interptype = DMDA_Q1; 34947c6ae99SBarry Smith dd->refine_x = 2; 35047c6ae99SBarry Smith dd->refine_y = 2; 35147c6ae99SBarry Smith dd->refine_z = 2; 35281c108dcSJed Brown dd->coarsen_x = 2; 35381c108dcSJed Brown dd->coarsen_y = 2; 35481c108dcSJed Brown dd->coarsen_z = 2; 3550298fd71SBarry Smith dd->fieldname = NULL; 35647c6ae99SBarry Smith dd->nlocal = -1; 35747c6ae99SBarry Smith dd->Nlocal = -1; 35847c6ae99SBarry Smith dd->M = -1; 35947c6ae99SBarry Smith dd->N = -1; 36047c6ae99SBarry Smith dd->P = -1; 36147c6ae99SBarry Smith dd->m = -1; 36247c6ae99SBarry Smith dd->n = -1; 36347c6ae99SBarry Smith dd->p = -1; 36447c6ae99SBarry Smith dd->w = -1; 36547c6ae99SBarry Smith dd->s = -1; 3668865f1eaSKarl Rupp 3679371c9d4SSatish Balay dd->xs = -1; 3689371c9d4SSatish Balay dd->xe = -1; 3699371c9d4SSatish Balay dd->ys = -1; 3709371c9d4SSatish Balay dd->ye = -1; 3719371c9d4SSatish Balay dd->zs = -1; 3729371c9d4SSatish Balay dd->ze = -1; 3739371c9d4SSatish Balay dd->Xs = -1; 3749371c9d4SSatish Balay dd->Xe = -1; 3759371c9d4SSatish Balay dd->Ys = -1; 3769371c9d4SSatish Balay dd->Ye = -1; 3779371c9d4SSatish Balay dd->Zs = -1; 3789371c9d4SSatish Balay dd->Ze = -1; 37947c6ae99SBarry Smith 3803e7870d2SPeter Brune dd->Nsub = 1; 3817ddda789SPeter Brune dd->xol = 0; 3827ddda789SPeter Brune dd->yol = 0; 3837ddda789SPeter Brune dd->zol = 0; 384d886c4f4SPeter Brune dd->xo = 0; 385d886c4f4SPeter Brune dd->yo = 0; 386d886c4f4SPeter Brune dd->zo = 0; 387e30e807fSPeter Brune dd->Mo = -1; 388e30e807fSPeter Brune dd->No = -1; 389e30e807fSPeter Brune dd->Po = -1; 39088661749SPeter Brune 3910298fd71SBarry Smith dd->gtol = NULL; 3920298fd71SBarry Smith dd->ltol = NULL; 3930298fd71SBarry Smith dd->ao = NULL; 3949db3d8bcSStefano Zampini PetscStrallocpy(AOBASIC, (char **)&dd->aotype); 39547c6ae99SBarry Smith dd->base = -1; 396bff4a2f0SMatthew G. Knepley dd->bx = DM_BOUNDARY_NONE; 397bff4a2f0SMatthew G. Knepley dd->by = DM_BOUNDARY_NONE; 398bff4a2f0SMatthew G. Knepley dd->bz = DM_BOUNDARY_NONE; 399aa219208SBarry Smith dd->stencil_type = DMDA_STENCIL_BOX; 400aa219208SBarry Smith dd->interptype = DMDA_Q1; 4010298fd71SBarry Smith dd->lx = NULL; 4020298fd71SBarry Smith dd->ly = NULL; 4030298fd71SBarry Smith dd->lz = NULL; 40447c6ae99SBarry Smith 405454e267fSLisandro Dalcin dd->elementtype = DMDA_ELEMENT_Q1; 406454e267fSLisandro Dalcin 407a4121054SBarry Smith da->ops->globaltolocalbegin = DMGlobalToLocalBegin_DA; 408a4121054SBarry Smith da->ops->globaltolocalend = DMGlobalToLocalEnd_DA; 409a4121054SBarry Smith da->ops->localtoglobalbegin = DMLocalToGlobalBegin_DA; 410a4121054SBarry Smith da->ops->localtoglobalend = DMLocalToGlobalEnd_DA; 411d78e899eSRichard Tran Mills da->ops->localtolocalbegin = DMLocalToLocalBegin_DA; 412d78e899eSRichard Tran Mills da->ops->localtolocalend = DMLocalToLocalEnd_DA; 413a4121054SBarry Smith da->ops->createglobalvector = DMCreateGlobalVector_DA; 414a4121054SBarry Smith da->ops->createlocalvector = DMCreateLocalVector_DA; 41525296bd5SBarry Smith da->ops->createinterpolation = DMCreateInterpolation_DA; 416e727c939SJed Brown da->ops->getcoloring = DMCreateColoring_DA; 41725296bd5SBarry Smith da->ops->creatematrix = DMCreateMatrix_DA; 418a4121054SBarry Smith da->ops->refine = DMRefine_DA; 419a4121054SBarry Smith da->ops->coarsen = DMCoarsen_DA; 420a4121054SBarry Smith da->ops->refinehierarchy = DMRefineHierarchy_DA; 421a4121054SBarry Smith da->ops->coarsenhierarchy = DMCoarsenHierarchy_DA; 4225a84ad33SLisandro Dalcin da->ops->createinjection = DMCreateInjection_DA; 4234a7a4c06SLawrence Mitchell da->ops->hascreateinjection = DMHasCreateInjection_DA; 424a4121054SBarry Smith da->ops->destroy = DMDestroy_DA; 425ea78f98cSLisandro Dalcin da->ops->view = NULL; 426a4121054SBarry Smith da->ops->setfromoptions = DMSetFromOptions_DA; 427a4121054SBarry Smith da->ops->setup = DMSetUp_DA; 42838221697SMatthew G. Knepley da->ops->clone = DMClone_DA; 429b859378eSBarry Smith da->ops->load = DMLoad_DA; 4306636e97aSMatthew G Knepley da->ops->createcoordinatedm = DMCreateCoordinateDM_DA; 431d724dfffSBarry Smith da->ops->createsubdm = DMCreateSubDM_DA; 43216621825SDmitry Karpeev da->ops->createfielddecomposition = DMCreateFieldDecomposition_DA; 433e30e807fSPeter Brune da->ops->createdomaindecomposition = DMCreateDomainDecomposition_DA; 434e30e807fSPeter Brune da->ops->createddscatters = DMCreateDomainDecompositionScatters_DA; 435793f3fe5SMatthew G. Knepley da->ops->getdimpoints = DMGetDimPoints_DA; 436502a2867SDave May da->ops->getneighbors = DMGetNeighbors_DA; 43705264a50SDave May da->ops->locatepoints = DMLocatePoints_DA_Regular; 4387c3cd84eSPatrick Sanan da->ops->getcompatibility = DMGetCompatibility_DA; 4399566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)da, "DMSetUpGLVisViewer_C", DMSetUpGLVisViewer_DMDA)); 440a4121054SBarry Smith PetscFunctionReturn(0); 441a4121054SBarry Smith } 44247c6ae99SBarry Smith 443a4121054SBarry Smith /*@ 444a4121054SBarry Smith DMDACreate - Creates a DMDA object. 445a4121054SBarry Smith 4465edebc4bSPatrick Sanan Collective 447a4121054SBarry Smith 448a4121054SBarry Smith Input Parameter: 449a4121054SBarry Smith . comm - The communicator for the DMDA object 450a4121054SBarry Smith 451a4121054SBarry Smith Output Parameter: 452a4121054SBarry Smith . da - The DMDA object 453a4121054SBarry Smith 454e0f5d30fSBarry Smith Level: advanced 455e0f5d30fSBarry Smith 4565edebc4bSPatrick Sanan Developers Note: 4575edebc4bSPatrick Sanan Since there exists DMDACreate1/2/3d() should this routine even exist? 458a4121054SBarry Smith 459db781477SPatrick Sanan .seealso: `DMDASetSizes()`, `DMClone()`, `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()` 460a4121054SBarry Smith @*/ 4619371c9d4SSatish Balay PetscErrorCode DMDACreate(MPI_Comm comm, DM *da) { 462a4121054SBarry Smith PetscFunctionBegin; 463a4121054SBarry Smith PetscValidPointer(da, 2); 4649566063dSJacob Faibussowitsch PetscCall(DMCreate(comm, da)); 4659566063dSJacob Faibussowitsch PetscCall(DMSetType(*da, DMDA)); 46647c6ae99SBarry Smith PetscFunctionReturn(0); 46747c6ae99SBarry Smith } 468