17d0a6c19SBarry Smith 24035e84dSBarry Smith #include <petsc-private/dmdaimpl.h> /*I "petscdmda.h" I*/ 347c6ae99SBarry Smith 447c6ae99SBarry Smith #undef __FUNCT__ 59a42bb27SBarry Smith #define __FUNCT__ "DMSetFromOptions_DA" 67087cfbeSBarry Smith PetscErrorCode DMSetFromOptions_DA(DM da) 747c6ae99SBarry Smith { 847c6ae99SBarry Smith PetscErrorCode ierr; 947c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 10397b6216SJed Brown PetscInt refine = 0,maxnlevels = 100,*refx,*refy,*refz,n,i; 117ddda789SPeter Brune PetscBool negativeMNP = PETSC_FALSE,bM = PETSC_FALSE,bN = PETSC_FALSE, bP = PETSC_FALSE,flg; 1247c6ae99SBarry Smith 1347c6ae99SBarry Smith PetscFunctionBegin; 1447c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 1547c6ae99SBarry Smith 1647c6ae99SBarry Smith if (dd->M < 0) { 17235683edSBarry Smith dd->M = -dd->M; 18235683edSBarry Smith bM = PETSC_TRUE; 19e0f5d30fSBarry Smith negativeMNP = PETSC_TRUE; 2047c6ae99SBarry Smith } 2147c6ae99SBarry Smith if (dd->dim > 1 && dd->N < 0) { 22235683edSBarry Smith dd->N = -dd->N; 23235683edSBarry Smith bN = PETSC_TRUE; 24e0f5d30fSBarry Smith negativeMNP = PETSC_TRUE; 2547c6ae99SBarry Smith } 2647c6ae99SBarry Smith if (dd->dim > 2 && dd->P < 0) { 27235683edSBarry Smith dd->P = -dd->P; 28235683edSBarry Smith bP = PETSC_TRUE; 29e0f5d30fSBarry Smith negativeMNP = PETSC_TRUE; 3047c6ae99SBarry Smith } 31235683edSBarry Smith 32f9ba7244SBarry Smith ierr = PetscOptionsHead("DMDA Options");CHKERRQ(ierr); 330298fd71SBarry Smith if (bM) {ierr = PetscOptionsInt("-da_grid_x","Number of grid points in x direction","DMDASetSizes",dd->M,&dd->M,NULL);CHKERRQ(ierr);} 340298fd71SBarry Smith if (bN) {ierr = PetscOptionsInt("-da_grid_y","Number of grid points in y direction","DMDASetSizes",dd->N,&dd->N,NULL);CHKERRQ(ierr);} 350298fd71SBarry Smith if (bP) {ierr = PetscOptionsInt("-da_grid_z","Number of grid points in z direction","DMDASetSizes",dd->P,&dd->P,NULL);CHKERRQ(ierr);} 367ddda789SPeter Brune 377ddda789SPeter Brune ierr = PetscOptionsInt("-da_overlap","Decomposition overlap in all directions","DMDASetOverlap",dd->xol,&dd->xol,&flg);CHKERRQ(ierr); 387ddda789SPeter Brune if (flg) {ierr = DMDASetOverlap(da,dd->xol,dd->xol,dd->xol);CHKERRQ(ierr);} 397ddda789SPeter Brune ierr = PetscOptionsInt("-da_overlap_x","Decomposition overlap in x direction","DMDASetOverlap",dd->xol,&dd->xol,NULL);CHKERRQ(ierr); 407ddda789SPeter Brune if (dd->dim > 1) {ierr = PetscOptionsInt("-da_overlap_y","Decomposition overlap in y direction","DMDASetOverlap",dd->yol,&dd->yol,NULL);CHKERRQ(ierr);} 417ddda789SPeter Brune if (dd->dim > 2) {ierr = PetscOptionsInt("-da_overlap_z","Decomposition overlap in z direction","DMDASetOverlap",dd->zol,&dd->zol,NULL);CHKERRQ(ierr);} 423e7870d2SPeter Brune 433e7870d2SPeter Brune ierr = PetscOptionsInt("-da_local_subdomains","","DMDASetNumLocalSubdomains",dd->Nsub,&dd->Nsub,&flg);CHKERRQ(ierr); 443e7870d2SPeter Brune if (flg) {ierr = DMDASetNumLocalSubDomains(da,dd->Nsub);CHKERRQ(ierr);} 453e7870d2SPeter Brune 46aa219208SBarry Smith /* Handle DMDA parallel distibution */ 470298fd71SBarry Smith ierr = PetscOptionsInt("-da_processors_x","Number of processors in x direction","DMDASetNumProcs",dd->m,&dd->m,NULL);CHKERRQ(ierr); 480298fd71SBarry Smith if (dd->dim > 1) {ierr = PetscOptionsInt("-da_processors_y","Number of processors in y direction","DMDASetNumProcs",dd->n,&dd->n,NULL);CHKERRQ(ierr);} 490298fd71SBarry Smith if (dd->dim > 2) {ierr = PetscOptionsInt("-da_processors_z","Number of processors in z direction","DMDASetNumProcs",dd->p,&dd->p,NULL);CHKERRQ(ierr);} 50aa219208SBarry Smith /* Handle DMDA refinement */ 510298fd71SBarry Smith ierr = PetscOptionsInt("-da_refine_x","Refinement ratio in x direction","DMDASetRefinementFactor",dd->refine_x,&dd->refine_x,NULL);CHKERRQ(ierr); 520298fd71SBarry Smith if (dd->dim > 1) {ierr = PetscOptionsInt("-da_refine_y","Refinement ratio in y direction","DMDASetRefinementFactor",dd->refine_y,&dd->refine_y,NULL);CHKERRQ(ierr);} 530298fd71SBarry Smith if (dd->dim > 2) {ierr = PetscOptionsInt("-da_refine_z","Refinement ratio in z direction","DMDASetRefinementFactor",dd->refine_z,&dd->refine_z,NULL);CHKERRQ(ierr);} 5438fb6c91SJed Brown dd->coarsen_x = dd->refine_x; dd->coarsen_y = dd->refine_y; dd->coarsen_z = dd->refine_z; 5547c6ae99SBarry Smith 56397b6216SJed Brown /* Get refinement factors, defaults taken from the coarse DMDA */ 57397b6216SJed Brown ierr = PetscMalloc3(maxnlevels,PetscInt,&refx,maxnlevels,PetscInt,&refy,maxnlevels,PetscInt,&refz);CHKERRQ(ierr); 58397b6216SJed Brown ierr = DMDAGetRefinementFactor(da,&refx[0],&refy[0],&refz[0]);CHKERRQ(ierr); 59397b6216SJed Brown for (i=1; i<maxnlevels; i++) { 60397b6216SJed Brown refx[i] = refx[0]; 61397b6216SJed Brown refy[i] = refy[0]; 62397b6216SJed Brown refz[i] = refz[0]; 63397b6216SJed Brown } 64397b6216SJed Brown n = maxnlevels; 650298fd71SBarry Smith ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_x",refx,&n,NULL);CHKERRQ(ierr); 66397b6216SJed Brown if (da->levelup - da->leveldown >= 0) dd->refine_x = refx[da->levelup - da->leveldown]; 67397b6216SJed Brown if (da->levelup - da->leveldown >= 1) dd->coarsen_x = refx[da->levelup - da->leveldown - 1]; 68397b6216SJed Brown if (dd->dim > 1) { 69397b6216SJed Brown n = maxnlevels; 700298fd71SBarry Smith ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_y",refy,&n,NULL);CHKERRQ(ierr); 71397b6216SJed Brown if (da->levelup - da->leveldown >= 0) dd->refine_y = refy[da->levelup - da->leveldown]; 72397b6216SJed Brown if (da->levelup - da->leveldown >= 1) dd->coarsen_y = refy[da->levelup - da->leveldown - 1]; 73397b6216SJed Brown } 74397b6216SJed Brown if (dd->dim > 2) { 75397b6216SJed Brown n = maxnlevels; 760298fd71SBarry Smith ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_z",refz,&n,NULL);CHKERRQ(ierr); 77397b6216SJed Brown if (da->levelup - da->leveldown >= 0) dd->refine_z = refz[da->levelup - da->leveldown]; 78397b6216SJed Brown if (da->levelup - da->leveldown >= 1) dd->coarsen_z = refz[da->levelup - da->leveldown - 1]; 79397b6216SJed Brown } 80397b6216SJed Brown 810298fd71SBarry Smith if (negativeMNP) {ierr = PetscOptionsInt("-da_refine","Uniformly refine DA one or more times","None",refine,&refine,NULL);CHKERRQ(ierr);} 82f9ba7244SBarry Smith ierr = PetscOptionsTail();CHKERRQ(ierr); 83235683edSBarry Smith 84e0f5d30fSBarry Smith while (refine--) { 85e0f5d30fSBarry Smith if (dd->bx == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) { 86e0f5d30fSBarry Smith dd->M = dd->refine_x*dd->M; 87e0f5d30fSBarry Smith } else { 88e0f5d30fSBarry Smith dd->M = 1 + dd->refine_x*(dd->M - 1); 89e0f5d30fSBarry Smith } 90e0f5d30fSBarry Smith if (dd->by == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) { 91e0f5d30fSBarry Smith dd->N = dd->refine_y*dd->N; 92e0f5d30fSBarry Smith } else { 93e0f5d30fSBarry Smith dd->N = 1 + dd->refine_y*(dd->N - 1); 94e0f5d30fSBarry Smith } 95e0f5d30fSBarry Smith if (dd->bz == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0) { 96e0f5d30fSBarry Smith dd->P = dd->refine_z*dd->P; 97e0f5d30fSBarry Smith } else { 98e0f5d30fSBarry Smith dd->P = 1 + dd->refine_z*(dd->P - 1); 99e0f5d30fSBarry Smith } 100e0f5d30fSBarry Smith da->levelup++; 10185fc4b34SJed Brown if (da->levelup - da->leveldown >= 0) { 10285fc4b34SJed Brown dd->refine_x = refx[da->levelup - da->leveldown]; 10385fc4b34SJed Brown dd->refine_y = refy[da->levelup - da->leveldown]; 10485fc4b34SJed Brown dd->refine_z = refz[da->levelup - da->leveldown]; 10585fc4b34SJed Brown } 10685fc4b34SJed Brown if (da->levelup - da->leveldown >= 1) { 10785fc4b34SJed Brown dd->coarsen_x = refx[da->levelup - da->leveldown - 1]; 10885fc4b34SJed Brown dd->coarsen_y = refy[da->levelup - da->leveldown - 1]; 10985fc4b34SJed Brown dd->coarsen_z = refz[da->levelup - da->leveldown - 1]; 11085fc4b34SJed Brown } 111e0f5d30fSBarry Smith } 112397b6216SJed Brown ierr = PetscFree3(refx,refy,refz);CHKERRQ(ierr); 11347c6ae99SBarry Smith PetscFunctionReturn(0); 11447c6ae99SBarry Smith } 11547c6ae99SBarry Smith 1167087cfbeSBarry Smith extern PetscErrorCode DMCreateGlobalVector_DA(DM,Vec*); 1177087cfbeSBarry Smith extern PetscErrorCode DMCreateLocalVector_DA(DM,Vec*); 1187087cfbeSBarry Smith extern PetscErrorCode DMGlobalToLocalBegin_DA(DM,Vec,InsertMode,Vec); 1197087cfbeSBarry Smith extern PetscErrorCode DMGlobalToLocalEnd_DA(DM,Vec,InsertMode,Vec); 1207087cfbeSBarry Smith extern PetscErrorCode DMLocalToGlobalBegin_DA(DM,Vec,InsertMode,Vec); 1217087cfbeSBarry Smith extern PetscErrorCode DMLocalToGlobalEnd_DA(DM,Vec,InsertMode,Vec); 122d78e899eSRichard Tran Mills extern PetscErrorCode DMLocalToLocalBegin_DA(DM,Vec,InsertMode,Vec); 123d78e899eSRichard Tran Mills extern PetscErrorCode DMLocalToLocalEnd_DA(DM,Vec,InsertMode,Vec); 124e727c939SJed Brown extern PetscErrorCode DMCreateInterpolation_DA(DM,DM,Mat*,Vec*); 125*b412c318SBarry Smith extern PetscErrorCode DMCreateColoring_DA(DM,ISColoringType,ISColoring*); 126*b412c318SBarry Smith extern PetscErrorCode DMCreateMatrix_DA(DM,Mat*); 1276636e97aSMatthew G Knepley extern PetscErrorCode DMCreateCoordinateDM_DA(DM,DM*); 1287087cfbeSBarry Smith extern PetscErrorCode DMRefine_DA(DM,MPI_Comm,DM*); 1297087cfbeSBarry Smith extern PetscErrorCode DMCoarsen_DA(DM,MPI_Comm,DM*); 1307087cfbeSBarry Smith extern PetscErrorCode DMRefineHierarchy_DA(DM,PetscInt,DM[]); 1317087cfbeSBarry Smith extern PetscErrorCode DMCoarsenHierarchy_DA(DM,PetscInt,DM[]); 132e727c939SJed Brown extern PetscErrorCode DMCreateInjection_DA(DM,DM,VecScatter*); 133e727c939SJed Brown extern PetscErrorCode DMCreateAggregates_DA(DM,DM,Mat*); 1347087cfbeSBarry Smith extern PetscErrorCode DMView_DA(DM,PetscViewer); 1357087cfbeSBarry Smith extern PetscErrorCode DMSetUp_DA(DM); 1367087cfbeSBarry Smith extern PetscErrorCode DMDestroy_DA(DM); 137e30e807fSPeter Brune extern PetscErrorCode DMCreateDomainDecomposition_DA(DM,PetscInt*,char***,IS**,IS**,DM**); 138e30e807fSPeter Brune extern PetscErrorCode DMCreateDomainDecompositionScatters_DA(DM,PetscInt,DM*,VecScatter**,VecScatter**,VecScatter**); 1399a42bb27SBarry Smith 140b859378eSBarry Smith #undef __FUNCT__ 141b859378eSBarry Smith #define __FUNCT__ "DMLoad_DA" 142b859378eSBarry Smith PetscErrorCode DMLoad_DA(DM da,PetscViewer viewer) 143b859378eSBarry Smith { 144b859378eSBarry Smith PetscErrorCode ierr; 145bc2bf880SBarry Smith PetscInt dim,m,n,p,dof,swidth; 146b859378eSBarry Smith DMDAStencilType stencil; 147b859378eSBarry Smith DMDABoundaryType bx,by,bz; 148bc2bf880SBarry Smith PetscBool coors; 149bc2bf880SBarry Smith DM dac; 150bc2bf880SBarry Smith Vec c; 151b859378eSBarry Smith 152b859378eSBarry Smith PetscFunctionBegin; 153b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&dim,1,PETSC_INT);CHKERRQ(ierr); 154b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&m,1,PETSC_INT);CHKERRQ(ierr); 155b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&n,1,PETSC_INT);CHKERRQ(ierr); 156b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&p,1,PETSC_INT);CHKERRQ(ierr); 157b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&dof,1,PETSC_INT);CHKERRQ(ierr); 158b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&swidth,1,PETSC_INT);CHKERRQ(ierr); 159b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&bx,1,PETSC_ENUM);CHKERRQ(ierr); 160b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&by,1,PETSC_ENUM);CHKERRQ(ierr); 161b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&bz,1,PETSC_ENUM);CHKERRQ(ierr); 162b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&stencil,1,PETSC_ENUM);CHKERRQ(ierr); 163b859378eSBarry Smith 164bc2bf880SBarry Smith ierr = DMDASetDim(da, dim);CHKERRQ(ierr); 165bc2bf880SBarry Smith ierr = DMDASetSizes(da, m,n,p);CHKERRQ(ierr); 166b859378eSBarry Smith ierr = DMDASetBoundaryType(da, bx, by, bz);CHKERRQ(ierr); 167b859378eSBarry Smith ierr = DMDASetDof(da, dof);CHKERRQ(ierr); 168b859378eSBarry Smith ierr = DMDASetStencilType(da, stencil);CHKERRQ(ierr); 169b859378eSBarry Smith ierr = DMDASetStencilWidth(da, swidth);CHKERRQ(ierr); 170b859378eSBarry Smith ierr = DMSetUp(da);CHKERRQ(ierr); 171bc2bf880SBarry Smith ierr = PetscViewerBinaryRead(viewer,&coors,1,PETSC_ENUM);CHKERRQ(ierr); 172bc2bf880SBarry Smith if (coors) { 1736636e97aSMatthew G Knepley ierr = DMGetCoordinateDM(da,&dac);CHKERRQ(ierr); 174bc2bf880SBarry Smith ierr = DMCreateGlobalVector(dac,&c);CHKERRQ(ierr); 175bc2bf880SBarry Smith ierr = VecLoad(c,viewer);CHKERRQ(ierr); 1766636e97aSMatthew G Knepley ierr = DMSetCoordinates(da,c);CHKERRQ(ierr); 177bc2bf880SBarry Smith ierr = VecDestroy(&c);CHKERRQ(ierr); 178bc2bf880SBarry Smith } 179b859378eSBarry Smith PetscFunctionReturn(0); 180b859378eSBarry Smith } 181b859378eSBarry Smith 1821c3fb106SBarry Smith #undef __FUNCT__ 183d724dfffSBarry Smith #define __FUNCT__ "DMCreateSubDM_DA" 184d724dfffSBarry Smith PetscErrorCode DMCreateSubDM_DA(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm) 185d724dfffSBarry Smith { 186d724dfffSBarry Smith DM_DA *da = (DM_DA*) dm->data; 1874d9407bcSMatthew G. Knepley PetscSection section; 1884d9407bcSMatthew G. Knepley PetscErrorCode ierr; 189d724dfffSBarry Smith 190d724dfffSBarry Smith PetscFunctionBegin; 191d724dfffSBarry Smith if (subdm) { 19238221697SMatthew G. Knepley ierr = DMClone(dm, subdm);CHKERRQ(ierr); 19338221697SMatthew G. Knepley ierr = DMDASetDof(*subdm, numFields);CHKERRQ(ierr); 194d724dfffSBarry Smith } 1954d9407bcSMatthew G. Knepley ierr = DMGetDefaultSection(dm, §ion);CHKERRQ(ierr); 1964d9407bcSMatthew G. Knepley if (section) { 1974d9407bcSMatthew G. Knepley ierr = DMCreateSubDM_Section_Private(dm, numFields, fields, is, subdm);CHKERRQ(ierr); 1984d9407bcSMatthew G. Knepley } else { 199d724dfffSBarry Smith if (is) { 200d724dfffSBarry Smith PetscInt *indices, cnt = 0, dof = da->w, i, j; 20138221697SMatthew G. Knepley 20238221697SMatthew G. Knepley ierr = PetscMalloc(da->Nlocal*numFields/dof * sizeof(PetscInt), &indices);CHKERRQ(ierr); 20338221697SMatthew G. Knepley for (i = da->base/dof; i < (da->base+da->Nlocal)/dof; ++i) { 20438221697SMatthew G. Knepley for (j = 0; j < numFields; ++j) { 205d724dfffSBarry Smith indices[cnt++] = dof*i + fields[j]; 206d724dfffSBarry Smith } 207d724dfffSBarry Smith } 20838221697SMatthew 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); 20938221697SMatthew G. Knepley ierr = ISCreateGeneral(PetscObjectComm((PetscObject) dm), cnt, indices, PETSC_OWN_POINTER, is);CHKERRQ(ierr); 210d724dfffSBarry Smith } 211d724dfffSBarry Smith } 212d724dfffSBarry Smith PetscFunctionReturn(0); 213d724dfffSBarry Smith } 214d724dfffSBarry Smith 215d724dfffSBarry Smith #undef __FUNCT__ 21616621825SDmitry Karpeev #define __FUNCT__ "DMCreateFieldDecomposition_DA" 21716621825SDmitry Karpeev PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len,char ***namelist, IS **islist, DM **dmlist) 2181c3fb106SBarry Smith { 2191c3fb106SBarry Smith PetscInt i; 2201c3fb106SBarry Smith PetscErrorCode ierr; 2211c3fb106SBarry Smith DM_DA *dd = (DM_DA*)dm->data; 2221c3fb106SBarry Smith PetscInt dof = dd->w; 2231c3fb106SBarry Smith 2241c3fb106SBarry Smith PetscFunctionBegin; 225731c8d9eSDmitry Karpeev if (len) *len = dof; 2261c3fb106SBarry Smith if (islist) { 2271c3fb106SBarry Smith Vec v; 2281c3fb106SBarry Smith PetscInt rstart,n; 2291c3fb106SBarry Smith 2301c3fb106SBarry Smith ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr); 2310298fd71SBarry Smith ierr = VecGetOwnershipRange(v,&rstart,NULL);CHKERRQ(ierr); 2321c3fb106SBarry Smith ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr); 2331c3fb106SBarry Smith ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr); 2341c3fb106SBarry Smith ierr = PetscMalloc(dof*sizeof(IS),islist);CHKERRQ(ierr); 2351c3fb106SBarry Smith for (i=0; i<dof; i++) { 236ce94432eSBarry Smith ierr = ISCreateStride(PetscObjectComm((PetscObject)dm),n/dof,rstart+i,dof,&(*islist)[i]);CHKERRQ(ierr); 2371c3fb106SBarry Smith } 2381c3fb106SBarry Smith } 2391c3fb106SBarry Smith if (namelist) { 2401c3fb106SBarry Smith ierr = PetscMalloc(dof*sizeof(const char*), namelist);CHKERRQ(ierr); 2411c3fb106SBarry Smith if (dd->fieldname) { 2421c3fb106SBarry Smith for (i=0; i<dof; i++) { 2431c3fb106SBarry Smith ierr = PetscStrallocpy(dd->fieldname[i],&(*namelist)[i]);CHKERRQ(ierr); 2441c3fb106SBarry Smith } 2451c3fb106SBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Currently DMDA must have fieldnames"); 2461c3fb106SBarry Smith } 2471c3fb106SBarry Smith if (dmlist) { 2481c3fb106SBarry Smith DM da; 2491c3fb106SBarry Smith 250ce94432eSBarry Smith ierr = DMDACreate(PetscObjectComm((PetscObject)dm), &da);CHKERRQ(ierr); 2511c3fb106SBarry Smith ierr = DMDASetDim(da, dd->dim);CHKERRQ(ierr); 2521c3fb106SBarry Smith ierr = DMDASetSizes(da, dd->M, dd->N, dd->P);CHKERRQ(ierr); 2531c3fb106SBarry Smith ierr = DMDASetNumProcs(da, dd->m, dd->n, dd->p);CHKERRQ(ierr); 2541c3fb106SBarry Smith ierr = DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz);CHKERRQ(ierr); 2551c3fb106SBarry Smith ierr = DMDASetDof(da, 1);CHKERRQ(ierr); 2561c3fb106SBarry Smith ierr = DMDASetStencilType(da, dd->stencil_type);CHKERRQ(ierr); 2571c3fb106SBarry Smith ierr = DMDASetStencilWidth(da, dd->s);CHKERRQ(ierr); 2581c3fb106SBarry Smith ierr = DMSetUp(da);CHKERRQ(ierr); 2591c3fb106SBarry Smith ierr = PetscMalloc(dof*sizeof(DM),dmlist);CHKERRQ(ierr); 260c893992eSBarry Smith for (i=0; i<dof-1; i++) {ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);} 2611c3fb106SBarry Smith for (i=0; i<dof; i++) (*dmlist)[i] = da; 2621c3fb106SBarry Smith } 2631c3fb106SBarry Smith PetscFunctionReturn(0); 2641c3fb106SBarry Smith } 2651c3fb106SBarry Smith 26638221697SMatthew G. Knepley #undef __FUNCT__ 26738221697SMatthew G. Knepley #define __FUNCT__ "DMClone_DA" 26838221697SMatthew G. Knepley PetscErrorCode DMClone_DA(DM dm, DM *newdm) 26938221697SMatthew G. Knepley { 27038221697SMatthew G. Knepley DM_DA *da = (DM_DA *) dm->data; 27138221697SMatthew G. Knepley PetscErrorCode ierr; 27238221697SMatthew G. Knepley 27338221697SMatthew G. Knepley PetscFunctionBegin; 2744271099bSMatthew G. Knepley ierr = DMSetType(*newdm, DMDA);CHKERRQ(ierr); 2754271099bSMatthew G. Knepley ierr = DMDASetDim(*newdm, da->dim);CHKERRQ(ierr); 2764271099bSMatthew G. Knepley ierr = DMDASetSizes(*newdm, da->M, da->N, da->P);CHKERRQ(ierr); 2774271099bSMatthew G. Knepley ierr = DMDASetNumProcs(*newdm, da->m, da->n, da->p);CHKERRQ(ierr); 2784271099bSMatthew G. Knepley ierr = DMDASetBoundaryType(*newdm, da->bx, da->by, da->bz);CHKERRQ(ierr); 2794271099bSMatthew G. Knepley ierr = DMDASetDof(*newdm, da->w);CHKERRQ(ierr); 2804271099bSMatthew G. Knepley ierr = DMDASetStencilType(*newdm, da->stencil_type);CHKERRQ(ierr); 2814271099bSMatthew G. Knepley ierr = DMDASetStencilWidth(*newdm, da->s);CHKERRQ(ierr); 2824271099bSMatthew G. Knepley ierr = DMDASetOwnershipRanges(*newdm, da->lx, da->ly, da->lz);CHKERRQ(ierr); 28338221697SMatthew G. Knepley PetscFunctionReturn(0); 28438221697SMatthew G. Knepley } 28538221697SMatthew G. Knepley 2863efe6655SBarry Smith /*MC 2873efe6655SBarry Smith DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions. 2883efe6655SBarry Smith In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points. 2893efe6655SBarry Smith In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width. 2903efe6655SBarry Smith 2913efe6655SBarry 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 2923efe6655SBarry Smith vertex centered. 2933efe6655SBarry Smith 2943efe6655SBarry Smith 2953efe6655SBarry Smith Level: intermediate 2963efe6655SBarry Smith 2973efe6655SBarry Smith .seealso: DMType, DMCOMPOSITE, DMDACreate(), DMCreate(), DMSetType() 2983efe6655SBarry Smith M*/ 2993efe6655SBarry Smith 3001c3fb106SBarry Smith 30147c6ae99SBarry Smith #undef __FUNCT__ 302a4121054SBarry Smith #define __FUNCT__ "DMCreate_DA" 3038cc058d9SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_DA(DM da) 30447c6ae99SBarry Smith { 30547c6ae99SBarry Smith PetscErrorCode ierr; 30647c6ae99SBarry Smith DM_DA *dd; 30747c6ae99SBarry Smith 30847c6ae99SBarry Smith PetscFunctionBegin; 309a4121054SBarry Smith PetscValidPointer(da,1); 310a4121054SBarry Smith ierr = PetscNewLog(da,DM_DA,&dd);CHKERRQ(ierr); 311a4121054SBarry Smith da->data = dd; 31247c6ae99SBarry Smith 31347c6ae99SBarry Smith dd->dim = -1; 314aa219208SBarry Smith dd->interptype = DMDA_Q1; 31547c6ae99SBarry Smith dd->refine_x = 2; 31647c6ae99SBarry Smith dd->refine_y = 2; 31747c6ae99SBarry Smith dd->refine_z = 2; 31881c108dcSJed Brown dd->coarsen_x = 2; 31981c108dcSJed Brown dd->coarsen_y = 2; 32081c108dcSJed Brown dd->coarsen_z = 2; 3210298fd71SBarry Smith dd->fieldname = NULL; 32247c6ae99SBarry Smith dd->nlocal = -1; 32347c6ae99SBarry Smith dd->Nlocal = -1; 32447c6ae99SBarry Smith dd->M = -1; 32547c6ae99SBarry Smith dd->N = -1; 32647c6ae99SBarry Smith dd->P = -1; 32747c6ae99SBarry Smith dd->m = -1; 32847c6ae99SBarry Smith dd->n = -1; 32947c6ae99SBarry Smith dd->p = -1; 33047c6ae99SBarry Smith dd->w = -1; 33147c6ae99SBarry Smith dd->s = -1; 3328865f1eaSKarl Rupp 33347c6ae99SBarry Smith dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1; 33447c6ae99SBarry Smith dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1; 33547c6ae99SBarry Smith 3363e7870d2SPeter Brune dd->Nsub = 1; 3377ddda789SPeter Brune dd->xol = 0; 3387ddda789SPeter Brune dd->yol = 0; 3397ddda789SPeter Brune dd->zol = 0; 340d886c4f4SPeter Brune dd->xo = 0; 341d886c4f4SPeter Brune dd->yo = 0; 342d886c4f4SPeter Brune dd->zo = 0; 343e30e807fSPeter Brune dd->Mo = -1; 344e30e807fSPeter Brune dd->No = -1; 345e30e807fSPeter Brune dd->Po = -1; 34688661749SPeter Brune 3470298fd71SBarry Smith dd->gtol = NULL; 3480298fd71SBarry Smith dd->ltog = NULL; 3490298fd71SBarry Smith dd->ltol = NULL; 3500298fd71SBarry Smith dd->ao = NULL; 35147c6ae99SBarry Smith dd->base = -1; 3521321219cSEthan Coon dd->bx = DMDA_BOUNDARY_NONE; 3531321219cSEthan Coon dd->by = DMDA_BOUNDARY_NONE; 3541321219cSEthan Coon dd->bz = DMDA_BOUNDARY_NONE; 355aa219208SBarry Smith dd->stencil_type = DMDA_STENCIL_BOX; 356aa219208SBarry Smith dd->interptype = DMDA_Q1; 3570298fd71SBarry Smith dd->idx = NULL; 35847c6ae99SBarry Smith dd->Nl = -1; 3590298fd71SBarry Smith dd->lx = NULL; 3600298fd71SBarry Smith dd->ly = NULL; 3610298fd71SBarry Smith dd->lz = NULL; 36247c6ae99SBarry Smith 363454e267fSLisandro Dalcin dd->elementtype = DMDA_ELEMENT_Q1; 364454e267fSLisandro Dalcin 36519fd82e9SBarry Smith ierr = PetscStrallocpy(VECSTANDARD,(char**)&da->vectype);CHKERRQ(ierr); 3668865f1eaSKarl Rupp 367a4121054SBarry Smith da->ops->globaltolocalbegin = DMGlobalToLocalBegin_DA; 368a4121054SBarry Smith da->ops->globaltolocalend = DMGlobalToLocalEnd_DA; 369a4121054SBarry Smith da->ops->localtoglobalbegin = DMLocalToGlobalBegin_DA; 370a4121054SBarry Smith da->ops->localtoglobalend = DMLocalToGlobalEnd_DA; 371d78e899eSRichard Tran Mills da->ops->localtolocalbegin = DMLocalToLocalBegin_DA; 372d78e899eSRichard Tran Mills da->ops->localtolocalend = DMLocalToLocalEnd_DA; 373a4121054SBarry Smith da->ops->createglobalvector = DMCreateGlobalVector_DA; 374a4121054SBarry Smith da->ops->createlocalvector = DMCreateLocalVector_DA; 37525296bd5SBarry Smith da->ops->createinterpolation = DMCreateInterpolation_DA; 376e727c939SJed Brown da->ops->getcoloring = DMCreateColoring_DA; 37725296bd5SBarry Smith da->ops->creatematrix = DMCreateMatrix_DA; 378a4121054SBarry Smith da->ops->refine = DMRefine_DA; 379a4121054SBarry Smith da->ops->coarsen = DMCoarsen_DA; 380a4121054SBarry Smith da->ops->refinehierarchy = DMRefineHierarchy_DA; 381a4121054SBarry Smith da->ops->coarsenhierarchy = DMCoarsenHierarchy_DA; 382e727c939SJed Brown da->ops->getinjection = DMCreateInjection_DA; 383e727c939SJed Brown da->ops->getaggregates = DMCreateAggregates_DA; 384a4121054SBarry Smith da->ops->destroy = DMDestroy_DA; 385a4121054SBarry Smith da->ops->view = 0; 386a4121054SBarry Smith da->ops->setfromoptions = DMSetFromOptions_DA; 387a4121054SBarry Smith da->ops->setup = DMSetUp_DA; 38838221697SMatthew G. Knepley da->ops->clone = DMClone_DA; 389b859378eSBarry Smith da->ops->load = DMLoad_DA; 3906636e97aSMatthew G Knepley da->ops->createcoordinatedm = DMCreateCoordinateDM_DA; 391d724dfffSBarry Smith da->ops->createsubdm = DMCreateSubDM_DA; 39216621825SDmitry Karpeev da->ops->createfielddecomposition = DMCreateFieldDecomposition_DA; 393e30e807fSPeter Brune da->ops->createdomaindecomposition = DMCreateDomainDecomposition_DA; 394e30e807fSPeter Brune da->ops->createddscatters = DMCreateDomainDecompositionScatters_DA; 395a4121054SBarry Smith PetscFunctionReturn(0); 396a4121054SBarry Smith } 39747c6ae99SBarry Smith 398a4121054SBarry Smith #undef __FUNCT__ 399a4121054SBarry Smith #define __FUNCT__ "DMDACreate" 400a4121054SBarry Smith /*@ 401a4121054SBarry Smith DMDACreate - Creates a DMDA object. 402a4121054SBarry Smith 403a4121054SBarry Smith Collective on MPI_Comm 404a4121054SBarry Smith 405a4121054SBarry Smith Input Parameter: 406a4121054SBarry Smith . comm - The communicator for the DMDA object 407a4121054SBarry Smith 408a4121054SBarry Smith Output Parameter: 409a4121054SBarry Smith . da - The DMDA object 410a4121054SBarry Smith 411e0f5d30fSBarry Smith Level: advanced 412e0f5d30fSBarry Smith 413e0f5d30fSBarry Smith Developers Note: Since there exists DMDACreate1/2/3d() should this routine even exist? 414a4121054SBarry Smith 415a4121054SBarry Smith .keywords: DMDA, create 416e0f5d30fSBarry Smith .seealso: DMDASetSizes(), DMDADuplicate(), DMDACreate1d(), DMDACreate2d(), DMDACreate3d() 417a4121054SBarry Smith @*/ 4187087cfbeSBarry Smith PetscErrorCode DMDACreate(MPI_Comm comm, DM *da) 419a4121054SBarry Smith { 420a4121054SBarry Smith PetscErrorCode ierr; 421a4121054SBarry Smith 422a4121054SBarry Smith PetscFunctionBegin; 423a4121054SBarry Smith PetscValidPointer(da,2); 424a4121054SBarry Smith ierr = DMCreate(comm,da);CHKERRQ(ierr); 425a4121054SBarry Smith ierr = DMSetType(*da,DMDA);CHKERRQ(ierr); 42647c6ae99SBarry Smith PetscFunctionReturn(0); 42747c6ae99SBarry Smith } 428b859378eSBarry Smith 429b859378eSBarry Smith 430