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, §ion);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 3213efe6655SBarry Smith /*MC 3223efe6655SBarry Smith DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions. 3233efe6655SBarry Smith In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points. 3243efe6655SBarry Smith In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width. 3253efe6655SBarry Smith 3263efe6655SBarry 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 3273efe6655SBarry Smith vertex centered. 3283efe6655SBarry Smith 3293efe6655SBarry Smith Level: intermediate 3303efe6655SBarry Smith 3313efe6655SBarry Smith .seealso: DMType, DMCOMPOSITE, DMDACreate(), DMCreate(), DMSetType() 3323efe6655SBarry Smith M*/ 3333efe6655SBarry Smith 334c970b36aSToby Isaac PETSC_EXTERN PetscErrorCode DMProjectFunctionLocal_DA(DM, PetscReal, PetscErrorCode (**)(PetscInt, PetscReal, const PetscReal [], PetscInt, PetscScalar *, void *), void **, InsertMode, Vec); 335c970b36aSToby Isaac PETSC_EXTERN PetscErrorCode DMComputeL2Diff_DA(DM, PetscReal, PetscErrorCode (**)(PetscInt, PetscReal, const PetscReal [], PetscInt, PetscScalar *, void *), void **, Vec, PetscReal *); 336*b698f381SToby Isaac PETSC_EXTERN PetscErrorCode DMComputeL2GradientDiff_DA(DM, PetscReal, PetscErrorCode (**)(PetscInt, PetscReal, const PetscReal [], const PetscReal [],PetscInt, PetscScalar *, void *), void **, Vec,const PetscReal [], PetscReal *); 337c970b36aSToby Isaac 3381c3fb106SBarry Smith 33947c6ae99SBarry Smith #undef __FUNCT__ 340a4121054SBarry Smith #define __FUNCT__ "DMCreate_DA" 3418cc058d9SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_DA(DM da) 34247c6ae99SBarry Smith { 34347c6ae99SBarry Smith PetscErrorCode ierr; 34447c6ae99SBarry Smith DM_DA *dd; 34547c6ae99SBarry Smith 34647c6ae99SBarry Smith PetscFunctionBegin; 347a4121054SBarry Smith PetscValidPointer(da,1); 348b00a9115SJed Brown ierr = PetscNewLog(da,&dd);CHKERRQ(ierr); 349a4121054SBarry Smith da->data = dd; 35047c6ae99SBarry Smith 351c73cfb54SMatthew G. Knepley da->dim = -1; 352aa219208SBarry Smith dd->interptype = DMDA_Q1; 35347c6ae99SBarry Smith dd->refine_x = 2; 35447c6ae99SBarry Smith dd->refine_y = 2; 35547c6ae99SBarry Smith dd->refine_z = 2; 35681c108dcSJed Brown dd->coarsen_x = 2; 35781c108dcSJed Brown dd->coarsen_y = 2; 35881c108dcSJed Brown dd->coarsen_z = 2; 3590298fd71SBarry Smith dd->fieldname = NULL; 36047c6ae99SBarry Smith dd->nlocal = -1; 36147c6ae99SBarry Smith dd->Nlocal = -1; 36247c6ae99SBarry Smith dd->M = -1; 36347c6ae99SBarry Smith dd->N = -1; 36447c6ae99SBarry Smith dd->P = -1; 36547c6ae99SBarry Smith dd->m = -1; 36647c6ae99SBarry Smith dd->n = -1; 36747c6ae99SBarry Smith dd->p = -1; 36847c6ae99SBarry Smith dd->w = -1; 36947c6ae99SBarry Smith dd->s = -1; 3708865f1eaSKarl Rupp 37147c6ae99SBarry Smith dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1; 37247c6ae99SBarry Smith dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1; 37347c6ae99SBarry Smith 3743e7870d2SPeter Brune dd->Nsub = 1; 3757ddda789SPeter Brune dd->xol = 0; 3767ddda789SPeter Brune dd->yol = 0; 3777ddda789SPeter Brune dd->zol = 0; 378d886c4f4SPeter Brune dd->xo = 0; 379d886c4f4SPeter Brune dd->yo = 0; 380d886c4f4SPeter Brune dd->zo = 0; 381e30e807fSPeter Brune dd->Mo = -1; 382e30e807fSPeter Brune dd->No = -1; 383e30e807fSPeter Brune dd->Po = -1; 38488661749SPeter Brune 3850298fd71SBarry Smith dd->gtol = NULL; 3860298fd71SBarry Smith dd->ltol = NULL; 3870298fd71SBarry Smith dd->ao = NULL; 3889db3d8bcSStefano Zampini PetscStrallocpy(AOBASIC,(char**)&dd->aotype); 38947c6ae99SBarry Smith dd->base = -1; 390bff4a2f0SMatthew G. Knepley dd->bx = DM_BOUNDARY_NONE; 391bff4a2f0SMatthew G. Knepley dd->by = DM_BOUNDARY_NONE; 392bff4a2f0SMatthew G. Knepley dd->bz = DM_BOUNDARY_NONE; 393aa219208SBarry Smith dd->stencil_type = DMDA_STENCIL_BOX; 394aa219208SBarry Smith dd->interptype = DMDA_Q1; 3950298fd71SBarry Smith dd->lx = NULL; 3960298fd71SBarry Smith dd->ly = NULL; 3970298fd71SBarry Smith dd->lz = NULL; 39847c6ae99SBarry Smith 399454e267fSLisandro Dalcin dd->elementtype = DMDA_ELEMENT_Q1; 400454e267fSLisandro Dalcin 401a4121054SBarry Smith da->ops->globaltolocalbegin = DMGlobalToLocalBegin_DA; 402a4121054SBarry Smith da->ops->globaltolocalend = DMGlobalToLocalEnd_DA; 403a4121054SBarry Smith da->ops->localtoglobalbegin = DMLocalToGlobalBegin_DA; 404a4121054SBarry Smith da->ops->localtoglobalend = DMLocalToGlobalEnd_DA; 405d78e899eSRichard Tran Mills da->ops->localtolocalbegin = DMLocalToLocalBegin_DA; 406d78e899eSRichard Tran Mills da->ops->localtolocalend = DMLocalToLocalEnd_DA; 407a4121054SBarry Smith da->ops->createglobalvector = DMCreateGlobalVector_DA; 408a4121054SBarry Smith da->ops->createlocalvector = DMCreateLocalVector_DA; 40925296bd5SBarry Smith da->ops->createinterpolation = DMCreateInterpolation_DA; 410e727c939SJed Brown da->ops->getcoloring = DMCreateColoring_DA; 41125296bd5SBarry Smith da->ops->creatematrix = DMCreateMatrix_DA; 412a4121054SBarry Smith da->ops->refine = DMRefine_DA; 413a4121054SBarry Smith da->ops->coarsen = DMCoarsen_DA; 414a4121054SBarry Smith da->ops->refinehierarchy = DMRefineHierarchy_DA; 415a4121054SBarry Smith da->ops->coarsenhierarchy = DMCoarsenHierarchy_DA; 416e727c939SJed Brown da->ops->getinjection = DMCreateInjection_DA; 417e727c939SJed Brown da->ops->getaggregates = DMCreateAggregates_DA; 418a4121054SBarry Smith da->ops->destroy = DMDestroy_DA; 419a4121054SBarry Smith da->ops->view = 0; 420a4121054SBarry Smith da->ops->setfromoptions = DMSetFromOptions_DA; 421a4121054SBarry Smith da->ops->setup = DMSetUp_DA; 42238221697SMatthew G. Knepley da->ops->clone = DMClone_DA; 423b859378eSBarry Smith da->ops->load = DMLoad_DA; 4246636e97aSMatthew G Knepley da->ops->createcoordinatedm = DMCreateCoordinateDM_DA; 425d724dfffSBarry Smith da->ops->createsubdm = DMCreateSubDM_DA; 42616621825SDmitry Karpeev da->ops->createfielddecomposition = DMCreateFieldDecomposition_DA; 427e30e807fSPeter Brune da->ops->createdomaindecomposition = DMCreateDomainDecomposition_DA; 428e30e807fSPeter Brune da->ops->createddscatters = DMCreateDomainDecompositionScatters_DA; 429793f3fe5SMatthew G. Knepley da->ops->getdimpoints = DMGetDimPoints_DA; 430c970b36aSToby Isaac da->ops->projectfunctionlocal = DMProjectFunctionLocal_DA; 431c970b36aSToby Isaac da->ops->computel2diff = DMComputeL2Diff_DA; 432*b698f381SToby Isaac da->ops->computel2gradientdiff = DMComputeL2GradientDiff_DA; 433a4121054SBarry Smith PetscFunctionReturn(0); 434a4121054SBarry Smith } 43547c6ae99SBarry Smith 436a4121054SBarry Smith #undef __FUNCT__ 437a4121054SBarry Smith #define __FUNCT__ "DMDACreate" 438a4121054SBarry Smith /*@ 439a4121054SBarry Smith DMDACreate - Creates a DMDA object. 440a4121054SBarry Smith 441a4121054SBarry Smith Collective on MPI_Comm 442a4121054SBarry Smith 443a4121054SBarry Smith Input Parameter: 444a4121054SBarry Smith . comm - The communicator for the DMDA object 445a4121054SBarry Smith 446a4121054SBarry Smith Output Parameter: 447a4121054SBarry Smith . da - The DMDA object 448a4121054SBarry Smith 449e0f5d30fSBarry Smith Level: advanced 450e0f5d30fSBarry Smith 451e0f5d30fSBarry Smith Developers Note: Since there exists DMDACreate1/2/3d() should this routine even exist? 452a4121054SBarry Smith 453a4121054SBarry Smith .keywords: DMDA, create 454e0f5d30fSBarry Smith .seealso: DMDASetSizes(), DMDADuplicate(), DMDACreate1d(), DMDACreate2d(), DMDACreate3d() 455a4121054SBarry Smith @*/ 4567087cfbeSBarry Smith PetscErrorCode DMDACreate(MPI_Comm comm, DM *da) 457a4121054SBarry Smith { 458a4121054SBarry Smith PetscErrorCode ierr; 459a4121054SBarry Smith 460a4121054SBarry Smith PetscFunctionBegin; 461a4121054SBarry Smith PetscValidPointer(da,2); 462a4121054SBarry Smith ierr = DMCreate(comm,da);CHKERRQ(ierr); 463a4121054SBarry Smith ierr = DMSetType(*da,DMDA);CHKERRQ(ierr); 46447c6ae99SBarry Smith PetscFunctionReturn(0); 46547c6ae99SBarry Smith } 466b859378eSBarry Smith 467b859378eSBarry Smith 468