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; 10*0b45a142SBarry Smith PetscInt refine = 0,maxnlevels = 100,refx[100],refy[100],refz[100],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 = 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; 640298fd71SBarry Smith ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_x",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]; 67397b6216SJed Brown if (dd->dim > 1) { 68397b6216SJed Brown n = maxnlevels; 690298fd71SBarry Smith ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_y",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 } 73397b6216SJed Brown if (dd->dim > 2) { 74397b6216SJed Brown n = maxnlevels; 750298fd71SBarry Smith ierr = PetscOptionsGetIntArray(((PetscObject)da)->prefix,"-da_refine_hierarchy_z",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 800298fd71SBarry Smith if (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--) { 84e0f5d30fSBarry Smith if (dd->bx == DMDA_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 } 89e0f5d30fSBarry Smith if (dd->by == DMDA_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 } 94e0f5d30fSBarry Smith if (dd->bz == DMDA_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); 120e727c939SJed Brown extern PetscErrorCode DMCreateInterpolation_DA(DM,DM,Mat*,Vec*); 12119fd82e9SBarry Smith extern PetscErrorCode DMCreateColoring_DA(DM,ISColoringType,MatType,ISColoring*); 12219fd82e9SBarry Smith extern PetscErrorCode DMCreateMatrix_DA(DM,MatType,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[]); 128e727c939SJed Brown extern PetscErrorCode DMCreateInjection_DA(DM,DM,VecScatter*); 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 #undef __FUNCT__ 137b859378eSBarry Smith #define __FUNCT__ "DMLoad_DA" 138b859378eSBarry Smith PetscErrorCode DMLoad_DA(DM da,PetscViewer viewer) 139b859378eSBarry Smith { 140b859378eSBarry Smith PetscErrorCode ierr; 141bc2bf880SBarry Smith PetscInt dim,m,n,p,dof,swidth; 142b859378eSBarry Smith DMDAStencilType stencil; 143b859378eSBarry Smith DMDABoundaryType bx,by,bz; 144bc2bf880SBarry Smith PetscBool coors; 145bc2bf880SBarry Smith DM dac; 146bc2bf880SBarry Smith Vec c; 147b859378eSBarry Smith 148b859378eSBarry Smith PetscFunctionBegin; 149b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&dim,1,PETSC_INT);CHKERRQ(ierr); 150b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&m,1,PETSC_INT);CHKERRQ(ierr); 151b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&n,1,PETSC_INT);CHKERRQ(ierr); 152b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&p,1,PETSC_INT);CHKERRQ(ierr); 153b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&dof,1,PETSC_INT);CHKERRQ(ierr); 154b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&swidth,1,PETSC_INT);CHKERRQ(ierr); 155b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&bx,1,PETSC_ENUM);CHKERRQ(ierr); 156b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&by,1,PETSC_ENUM);CHKERRQ(ierr); 157b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&bz,1,PETSC_ENUM);CHKERRQ(ierr); 158b859378eSBarry Smith ierr = PetscViewerBinaryRead(viewer,&stencil,1,PETSC_ENUM);CHKERRQ(ierr); 159b859378eSBarry Smith 160bc2bf880SBarry Smith ierr = DMDASetDim(da, dim);CHKERRQ(ierr); 161bc2bf880SBarry Smith ierr = DMDASetSizes(da, m,n,p);CHKERRQ(ierr); 162b859378eSBarry Smith ierr = DMDASetBoundaryType(da, bx, by, bz);CHKERRQ(ierr); 163b859378eSBarry Smith ierr = DMDASetDof(da, dof);CHKERRQ(ierr); 164b859378eSBarry Smith ierr = DMDASetStencilType(da, stencil);CHKERRQ(ierr); 165b859378eSBarry Smith ierr = DMDASetStencilWidth(da, swidth);CHKERRQ(ierr); 166b859378eSBarry Smith ierr = DMSetUp(da);CHKERRQ(ierr); 167bc2bf880SBarry Smith ierr = PetscViewerBinaryRead(viewer,&coors,1,PETSC_ENUM);CHKERRQ(ierr); 168bc2bf880SBarry Smith if (coors) { 1696636e97aSMatthew G Knepley ierr = DMGetCoordinateDM(da,&dac);CHKERRQ(ierr); 170bc2bf880SBarry Smith ierr = DMCreateGlobalVector(dac,&c);CHKERRQ(ierr); 171bc2bf880SBarry Smith ierr = VecLoad(c,viewer);CHKERRQ(ierr); 1726636e97aSMatthew G Knepley ierr = DMSetCoordinates(da,c);CHKERRQ(ierr); 173bc2bf880SBarry Smith ierr = VecDestroy(&c);CHKERRQ(ierr); 174bc2bf880SBarry Smith } 175b859378eSBarry Smith PetscFunctionReturn(0); 176b859378eSBarry Smith } 177b859378eSBarry Smith 1781c3fb106SBarry Smith #undef __FUNCT__ 179d724dfffSBarry Smith #define __FUNCT__ "DMCreateSubDM_DA" 180d724dfffSBarry Smith PetscErrorCode DMCreateSubDM_DA(DM dm, PetscInt numFields, PetscInt fields[], IS *is, DM *subdm) 181d724dfffSBarry Smith { 182d724dfffSBarry Smith PetscErrorCode ierr; 183d724dfffSBarry Smith DM_DA *da = (DM_DA*)dm->data; 184d724dfffSBarry Smith 185d724dfffSBarry Smith PetscFunctionBegin; 186ce94432eSBarry Smith if (da->dim != 2) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_SUP,"Support only implemented for 2d"); 187d724dfffSBarry Smith if (subdm) { 188ce94432eSBarry Smith ierr = DMDACreate2d(PetscObjectComm((PetscObject)dm),da->bx,da->by,da->stencil_type,da->M,da->N,da->m,da->n,numFields,da->s,da->lx,da->ly,subdm);CHKERRQ(ierr); 189d724dfffSBarry Smith } 190d724dfffSBarry Smith if (is) { 191d724dfffSBarry Smith PetscInt *indices,cnt = 0, dof = da->w,i,j; 192d724dfffSBarry Smith ierr = PetscMalloc(sizeof(PetscInt)*da->Nlocal*numFields/dof,&indices);CHKERRQ(ierr); 193d724dfffSBarry Smith for (i=da->base/dof; i<(da->base+da->Nlocal)/dof; i++) { 194d724dfffSBarry Smith for (j=0; j<numFields; j++) { 195d724dfffSBarry Smith indices[cnt++] = dof*i + fields[j]; 196d724dfffSBarry Smith } 197d724dfffSBarry Smith } 198d724dfffSBarry Smith if (cnt != da->Nlocal*numFields/dof) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Count does not equal expected value"); 199ce94432eSBarry Smith ierr = ISCreateGeneral(PetscObjectComm((PetscObject)dm),da->Nlocal*numFields/dof,indices,PETSC_OWN_POINTER,is);CHKERRQ(ierr); 200d724dfffSBarry Smith } 201d724dfffSBarry Smith PetscFunctionReturn(0); 202d724dfffSBarry Smith } 203d724dfffSBarry Smith 204d724dfffSBarry Smith #undef __FUNCT__ 20516621825SDmitry Karpeev #define __FUNCT__ "DMCreateFieldDecomposition_DA" 20616621825SDmitry Karpeev PetscErrorCode DMCreateFieldDecomposition_DA(DM dm, PetscInt *len,char ***namelist, IS **islist, DM **dmlist) 2071c3fb106SBarry Smith { 2081c3fb106SBarry Smith PetscInt i; 2091c3fb106SBarry Smith PetscErrorCode ierr; 2101c3fb106SBarry Smith DM_DA *dd = (DM_DA*)dm->data; 2111c3fb106SBarry Smith PetscInt dof = dd->w; 2121c3fb106SBarry Smith 2131c3fb106SBarry Smith PetscFunctionBegin; 214731c8d9eSDmitry Karpeev if (len) *len = dof; 2151c3fb106SBarry Smith if (islist) { 2161c3fb106SBarry Smith Vec v; 2171c3fb106SBarry Smith PetscInt rstart,n; 2181c3fb106SBarry Smith 2191c3fb106SBarry Smith ierr = DMGetGlobalVector(dm,&v);CHKERRQ(ierr); 2200298fd71SBarry Smith ierr = VecGetOwnershipRange(v,&rstart,NULL);CHKERRQ(ierr); 2211c3fb106SBarry Smith ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr); 2221c3fb106SBarry Smith ierr = DMRestoreGlobalVector(dm,&v);CHKERRQ(ierr); 2231c3fb106SBarry Smith ierr = PetscMalloc(dof*sizeof(IS),islist);CHKERRQ(ierr); 2241c3fb106SBarry Smith for (i=0; i<dof; i++) { 225ce94432eSBarry Smith ierr = ISCreateStride(PetscObjectComm((PetscObject)dm),n/dof,rstart+i,dof,&(*islist)[i]);CHKERRQ(ierr); 2261c3fb106SBarry Smith } 2271c3fb106SBarry Smith } 2281c3fb106SBarry Smith if (namelist) { 2291c3fb106SBarry Smith ierr = PetscMalloc(dof*sizeof(const char*), namelist);CHKERRQ(ierr); 2301c3fb106SBarry Smith if (dd->fieldname) { 2311c3fb106SBarry Smith for (i=0; i<dof; i++) { 2321c3fb106SBarry Smith ierr = PetscStrallocpy(dd->fieldname[i],&(*namelist)[i]);CHKERRQ(ierr); 2331c3fb106SBarry Smith } 2341c3fb106SBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Currently DMDA must have fieldnames"); 2351c3fb106SBarry Smith } 2361c3fb106SBarry Smith if (dmlist) { 2371c3fb106SBarry Smith DM da; 2381c3fb106SBarry Smith 239ce94432eSBarry Smith ierr = DMDACreate(PetscObjectComm((PetscObject)dm), &da);CHKERRQ(ierr); 2401c3fb106SBarry Smith ierr = DMDASetDim(da, dd->dim);CHKERRQ(ierr); 2411c3fb106SBarry Smith ierr = DMDASetSizes(da, dd->M, dd->N, dd->P);CHKERRQ(ierr); 2421c3fb106SBarry Smith ierr = DMDASetNumProcs(da, dd->m, dd->n, dd->p);CHKERRQ(ierr); 2431c3fb106SBarry Smith ierr = DMDASetBoundaryType(da, dd->bx, dd->by, dd->bz);CHKERRQ(ierr); 2441c3fb106SBarry Smith ierr = DMDASetDof(da, 1);CHKERRQ(ierr); 2451c3fb106SBarry Smith ierr = DMDASetStencilType(da, dd->stencil_type);CHKERRQ(ierr); 2461c3fb106SBarry Smith ierr = DMDASetStencilWidth(da, dd->s);CHKERRQ(ierr); 2471c3fb106SBarry Smith ierr = DMSetUp(da);CHKERRQ(ierr); 2481c3fb106SBarry Smith ierr = PetscMalloc(dof*sizeof(DM),dmlist);CHKERRQ(ierr); 249c893992eSBarry Smith for (i=0; i<dof-1; i++) {ierr = PetscObjectReference((PetscObject)da);CHKERRQ(ierr);} 2501c3fb106SBarry Smith for (i=0; i<dof; i++) (*dmlist)[i] = da; 2511c3fb106SBarry Smith } 2521c3fb106SBarry Smith PetscFunctionReturn(0); 2531c3fb106SBarry Smith } 2541c3fb106SBarry Smith 2553efe6655SBarry Smith /*MC 2563efe6655SBarry Smith DMDA = "da" - A DM object that is used to manage data for a structured grid in 1, 2, or 3 dimensions. 2573efe6655SBarry Smith In the global representation of the vector each process stores a non-overlapping rectangular (or slab in 3d) portion of the grid points. 2583efe6655SBarry Smith In the local representation these rectangular regions (slabs) are extended in all directions by a stencil width. 2593efe6655SBarry Smith 2603efe6655SBarry 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 2613efe6655SBarry Smith vertex centered. 2623efe6655SBarry Smith 2633efe6655SBarry Smith 2643efe6655SBarry Smith Level: intermediate 2653efe6655SBarry Smith 2663efe6655SBarry Smith .seealso: DMType, DMCOMPOSITE, DMDACreate(), DMCreate(), DMSetType() 2673efe6655SBarry Smith M*/ 2683efe6655SBarry Smith 2691c3fb106SBarry Smith 27047c6ae99SBarry Smith #undef __FUNCT__ 271a4121054SBarry Smith #define __FUNCT__ "DMCreate_DA" 2728cc058d9SJed Brown PETSC_EXTERN PetscErrorCode DMCreate_DA(DM da) 27347c6ae99SBarry Smith { 27447c6ae99SBarry Smith PetscErrorCode ierr; 27547c6ae99SBarry Smith DM_DA *dd; 27647c6ae99SBarry Smith 27747c6ae99SBarry Smith PetscFunctionBegin; 278a4121054SBarry Smith PetscValidPointer(da,1); 279a4121054SBarry Smith ierr = PetscNewLog(da,DM_DA,&dd);CHKERRQ(ierr); 280a4121054SBarry Smith da->data = dd; 28147c6ae99SBarry Smith 28247c6ae99SBarry Smith dd->dim = -1; 283aa219208SBarry Smith dd->interptype = DMDA_Q1; 28447c6ae99SBarry Smith dd->refine_x = 2; 28547c6ae99SBarry Smith dd->refine_y = 2; 28647c6ae99SBarry Smith dd->refine_z = 2; 28781c108dcSJed Brown dd->coarsen_x = 2; 28881c108dcSJed Brown dd->coarsen_y = 2; 28981c108dcSJed Brown dd->coarsen_z = 2; 2900298fd71SBarry Smith dd->fieldname = NULL; 29147c6ae99SBarry Smith dd->nlocal = -1; 29247c6ae99SBarry Smith dd->Nlocal = -1; 29347c6ae99SBarry Smith dd->M = -1; 29447c6ae99SBarry Smith dd->N = -1; 29547c6ae99SBarry Smith dd->P = -1; 29647c6ae99SBarry Smith dd->m = -1; 29747c6ae99SBarry Smith dd->n = -1; 29847c6ae99SBarry Smith dd->p = -1; 29947c6ae99SBarry Smith dd->w = -1; 30047c6ae99SBarry Smith dd->s = -1; 3018865f1eaSKarl Rupp 30247c6ae99SBarry Smith dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1; 30347c6ae99SBarry Smith dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1; 30447c6ae99SBarry Smith 3053e7870d2SPeter Brune dd->Nsub = 1; 3067ddda789SPeter Brune dd->xol = 0; 3077ddda789SPeter Brune dd->yol = 0; 3087ddda789SPeter Brune dd->zol = 0; 309d886c4f4SPeter Brune dd->xo = 0; 310d886c4f4SPeter Brune dd->yo = 0; 311d886c4f4SPeter Brune dd->zo = 0; 312e30e807fSPeter Brune dd->Mo = -1; 313e30e807fSPeter Brune dd->No = -1; 314e30e807fSPeter Brune dd->Po = -1; 31588661749SPeter Brune 3160298fd71SBarry Smith dd->gtol = NULL; 3170298fd71SBarry Smith dd->ltog = NULL; 3180298fd71SBarry Smith dd->ltol = NULL; 3190298fd71SBarry Smith dd->ao = NULL; 32047c6ae99SBarry Smith dd->base = -1; 3211321219cSEthan Coon dd->bx = DMDA_BOUNDARY_NONE; 3221321219cSEthan Coon dd->by = DMDA_BOUNDARY_NONE; 3231321219cSEthan Coon dd->bz = DMDA_BOUNDARY_NONE; 324aa219208SBarry Smith dd->stencil_type = DMDA_STENCIL_BOX; 325aa219208SBarry Smith dd->interptype = DMDA_Q1; 3260298fd71SBarry Smith dd->idx = NULL; 32747c6ae99SBarry Smith dd->Nl = -1; 3280298fd71SBarry Smith dd->lx = NULL; 3290298fd71SBarry Smith dd->ly = NULL; 3300298fd71SBarry Smith dd->lz = NULL; 33147c6ae99SBarry Smith 332454e267fSLisandro Dalcin dd->elementtype = DMDA_ELEMENT_Q1; 333454e267fSLisandro Dalcin 33419fd82e9SBarry Smith ierr = PetscStrallocpy(VECSTANDARD,(char**)&da->vectype);CHKERRQ(ierr); 3358865f1eaSKarl Rupp 336a4121054SBarry Smith da->ops->globaltolocalbegin = DMGlobalToLocalBegin_DA; 337a4121054SBarry Smith da->ops->globaltolocalend = DMGlobalToLocalEnd_DA; 338a4121054SBarry Smith da->ops->localtoglobalbegin = DMLocalToGlobalBegin_DA; 339a4121054SBarry Smith da->ops->localtoglobalend = DMLocalToGlobalEnd_DA; 340a4121054SBarry Smith da->ops->createglobalvector = DMCreateGlobalVector_DA; 341a4121054SBarry Smith da->ops->createlocalvector = DMCreateLocalVector_DA; 34225296bd5SBarry Smith da->ops->createinterpolation = DMCreateInterpolation_DA; 343e727c939SJed Brown da->ops->getcoloring = DMCreateColoring_DA; 34425296bd5SBarry Smith da->ops->creatematrix = DMCreateMatrix_DA; 345a4121054SBarry Smith da->ops->refine = DMRefine_DA; 346a4121054SBarry Smith da->ops->coarsen = DMCoarsen_DA; 347a4121054SBarry Smith da->ops->refinehierarchy = DMRefineHierarchy_DA; 348a4121054SBarry Smith da->ops->coarsenhierarchy = DMCoarsenHierarchy_DA; 349e727c939SJed Brown da->ops->getinjection = DMCreateInjection_DA; 350e727c939SJed Brown da->ops->getaggregates = DMCreateAggregates_DA; 351a4121054SBarry Smith da->ops->destroy = DMDestroy_DA; 352a4121054SBarry Smith da->ops->view = 0; 353a4121054SBarry Smith da->ops->setfromoptions = DMSetFromOptions_DA; 354a4121054SBarry Smith da->ops->setup = DMSetUp_DA; 355b859378eSBarry Smith da->ops->load = DMLoad_DA; 3566636e97aSMatthew G Knepley da->ops->createcoordinatedm = DMCreateCoordinateDM_DA; 357d724dfffSBarry Smith da->ops->createsubdm = DMCreateSubDM_DA; 35816621825SDmitry Karpeev da->ops->createfielddecomposition = DMCreateFieldDecomposition_DA; 359e30e807fSPeter Brune da->ops->createdomaindecomposition = DMCreateDomainDecomposition_DA; 360e30e807fSPeter Brune da->ops->createddscatters = DMCreateDomainDecompositionScatters_DA; 361a4121054SBarry Smith PetscFunctionReturn(0); 362a4121054SBarry Smith } 36347c6ae99SBarry Smith 364a4121054SBarry Smith #undef __FUNCT__ 365a4121054SBarry Smith #define __FUNCT__ "DMDACreate" 366a4121054SBarry Smith /*@ 367a4121054SBarry Smith DMDACreate - Creates a DMDA object. 368a4121054SBarry Smith 369a4121054SBarry Smith Collective on MPI_Comm 370a4121054SBarry Smith 371a4121054SBarry Smith Input Parameter: 372a4121054SBarry Smith . comm - The communicator for the DMDA object 373a4121054SBarry Smith 374a4121054SBarry Smith Output Parameter: 375a4121054SBarry Smith . da - The DMDA object 376a4121054SBarry Smith 377e0f5d30fSBarry Smith Level: advanced 378e0f5d30fSBarry Smith 379e0f5d30fSBarry Smith Developers Note: Since there exists DMDACreate1/2/3d() should this routine even exist? 380a4121054SBarry Smith 381a4121054SBarry Smith .keywords: DMDA, create 382e0f5d30fSBarry Smith .seealso: DMDASetSizes(), DMDADuplicate(), DMDACreate1d(), DMDACreate2d(), DMDACreate3d() 383a4121054SBarry Smith @*/ 3847087cfbeSBarry Smith PetscErrorCode DMDACreate(MPI_Comm comm, DM *da) 385a4121054SBarry Smith { 386a4121054SBarry Smith PetscErrorCode ierr; 387a4121054SBarry Smith 388a4121054SBarry Smith PetscFunctionBegin; 389a4121054SBarry Smith PetscValidPointer(da,2); 390a4121054SBarry Smith ierr = DMCreate(comm,da);CHKERRQ(ierr); 391a4121054SBarry Smith ierr = DMSetType(*da,DMDA);CHKERRQ(ierr); 39247c6ae99SBarry Smith PetscFunctionReturn(0); 39347c6ae99SBarry Smith } 394b859378eSBarry Smith 395b859378eSBarry Smith 396