17d0a6c19SBarry Smith 2c6db04a5SJed Brown #include <private/daimpl.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 PetscBool flg; 1047c6ae99SBarry Smith char typeName[256]; 1147c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 12e0f5d30fSBarry Smith PetscInt refine = 0; 13*235683edSBarry Smith PetscBool negativeMNP = PETSC_FALSE,bM = PETSC_FALSE,bN = PETSC_FALSE, bP = PETSC_FALSE; 1447c6ae99SBarry Smith 1547c6ae99SBarry Smith PetscFunctionBegin; 1647c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 1747c6ae99SBarry Smith 1847c6ae99SBarry Smith if (dd->M < 0) { 19*235683edSBarry Smith dd->M = -dd->M; 20*235683edSBarry Smith bM = PETSC_TRUE; 21e0f5d30fSBarry Smith negativeMNP = PETSC_TRUE; 2247c6ae99SBarry Smith } 2347c6ae99SBarry Smith if (dd->dim > 1 && dd->N < 0) { 24*235683edSBarry Smith dd->N = -dd->N; 25*235683edSBarry Smith bN = PETSC_TRUE; 26e0f5d30fSBarry Smith negativeMNP = PETSC_TRUE; 2747c6ae99SBarry Smith } 2847c6ae99SBarry Smith if (dd->dim > 2 && dd->P < 0) { 29*235683edSBarry Smith dd->P = -dd->P; 30*235683edSBarry Smith bP = PETSC_TRUE; 31e0f5d30fSBarry Smith negativeMNP = PETSC_TRUE; 3247c6ae99SBarry Smith } 33*235683edSBarry Smith 34*235683edSBarry Smith ierr = PetscOptionsBegin(((PetscObject)da)->comm,((PetscObject)da)->prefix,"DMDA Options","DMDA");CHKERRQ(ierr); 35*235683edSBarry Smith if (bM) {ierr = PetscOptionsInt("-da_grid_x","Number of grid points in x direction","DMDASetSizes",dd->M,&dd->M,PETSC_NULL);CHKERRQ(ierr);} 36*235683edSBarry Smith if (bN) {ierr = PetscOptionsInt("-da_grid_y","Number of grid points in y direction","DMDASetSizes",dd->N,&dd->N,PETSC_NULL);CHKERRQ(ierr);} 37*235683edSBarry Smith if (bP) {ierr = PetscOptionsInt("-da_grid_z","Number of grid points in z direction","DMDASetSizes",dd->P,&dd->P,PETSC_NULL);CHKERRQ(ierr);} 38aa219208SBarry Smith /* Handle DMDA parallel distibution */ 39aa219208SBarry Smith ierr = PetscOptionsInt("-da_processors_x","Number of processors in x direction","DMDASetNumProcs",dd->m,&dd->m,PETSC_NULL);CHKERRQ(ierr); 40aa219208SBarry Smith if (dd->dim > 1) {ierr = PetscOptionsInt("-da_processors_y","Number of processors in y direction","DMDASetNumProcs",dd->n,&dd->n,PETSC_NULL);CHKERRQ(ierr);} 41aa219208SBarry Smith if (dd->dim > 2) {ierr = PetscOptionsInt("-da_processors_z","Number of processors in z direction","DMDASetNumProcs",dd->p,&dd->p,PETSC_NULL);CHKERRQ(ierr);} 42aa219208SBarry Smith /* Handle DMDA refinement */ 43aa219208SBarry Smith ierr = PetscOptionsInt("-da_refine_x","Refinement ratio in x direction","DMDASetRefinementFactor",dd->refine_x,&dd->refine_x,PETSC_NULL);CHKERRQ(ierr); 44aa219208SBarry Smith if (dd->dim > 1) {ierr = PetscOptionsInt("-da_refine_y","Refinement ratio in y direction","DMDASetRefinementFactor",dd->refine_y,&dd->refine_y,PETSC_NULL);CHKERRQ(ierr);} 45aa219208SBarry Smith if (dd->dim > 2) {ierr = PetscOptionsInt("-da_refine_z","Refinement ratio in z direction","DMDASetRefinementFactor",dd->refine_z,&dd->refine_z,PETSC_NULL);CHKERRQ(ierr);} 4647c6ae99SBarry Smith 4747c6ae99SBarry Smith if (!VecRegisterAllCalled) {ierr = VecRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 489a42bb27SBarry Smith ierr = PetscOptionsList("-da_vec_type","Vector type used for created vectors","DMSetVecType",VecList,da->vectype,typeName,256,&flg);CHKERRQ(ierr); 4947c6ae99SBarry Smith if (flg) { 509a42bb27SBarry Smith ierr = DMSetVecType(da,typeName);CHKERRQ(ierr); 5147c6ae99SBarry Smith } 52*235683edSBarry Smith if (negativeMNP) {ierr = PetscOptionsInt("-da_refine","Uniformly refine DA one or more times","None",refine,&refine,PETSC_NULL);CHKERRQ(ierr);} 5347c6ae99SBarry Smith 54*235683edSBarry Smith /* process any options handlers added with PetscObjectAddOptionsHandler() */ 55*235683edSBarry Smith ierr = PetscObjectProcessOptionsHandlers((PetscObject)da);CHKERRQ(ierr); 56*235683edSBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 57*235683edSBarry Smith 58e0f5d30fSBarry Smith while (refine--) { 59e0f5d30fSBarry Smith if (dd->bx == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0){ 60e0f5d30fSBarry Smith dd->M = dd->refine_x*dd->M; 61e0f5d30fSBarry Smith } else { 62e0f5d30fSBarry Smith dd->M = 1 + dd->refine_x*(dd->M - 1); 63e0f5d30fSBarry Smith } 64e0f5d30fSBarry Smith if (dd->by == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0){ 65e0f5d30fSBarry Smith dd->N = dd->refine_y*dd->N; 66e0f5d30fSBarry Smith } else { 67e0f5d30fSBarry Smith dd->N = 1 + dd->refine_y*(dd->N - 1); 68e0f5d30fSBarry Smith } 69e0f5d30fSBarry Smith if (dd->bz == DMDA_BOUNDARY_PERIODIC || dd->interptype == DMDA_Q0){ 70e0f5d30fSBarry Smith dd->P = dd->refine_z*dd->P; 71e0f5d30fSBarry Smith } else { 72e0f5d30fSBarry Smith dd->P = 1 + dd->refine_z*(dd->P - 1); 73e0f5d30fSBarry Smith } 74e0f5d30fSBarry Smith da->levelup++; 75e0f5d30fSBarry Smith } 7647c6ae99SBarry Smith PetscFunctionReturn(0); 7747c6ae99SBarry Smith } 7847c6ae99SBarry Smith 797087cfbeSBarry Smith extern PetscErrorCode DMCreateGlobalVector_DA(DM,Vec*); 807087cfbeSBarry Smith extern PetscErrorCode DMCreateLocalVector_DA(DM,Vec*); 817087cfbeSBarry Smith extern PetscErrorCode DMGlobalToLocalBegin_DA(DM,Vec,InsertMode,Vec); 827087cfbeSBarry Smith extern PetscErrorCode DMGlobalToLocalEnd_DA(DM,Vec,InsertMode,Vec); 837087cfbeSBarry Smith extern PetscErrorCode DMLocalToGlobalBegin_DA(DM,Vec,InsertMode,Vec); 847087cfbeSBarry Smith extern PetscErrorCode DMLocalToGlobalEnd_DA(DM,Vec,InsertMode,Vec); 857087cfbeSBarry Smith extern PetscErrorCode DMGetInterpolation_DA(DM,DM,Mat*,Vec*); 867087cfbeSBarry Smith extern PetscErrorCode DMGetColoring_DA(DM,ISColoringType,const MatType,ISColoring*); 877087cfbeSBarry Smith extern PetscErrorCode DMGetMatrix_DA(DM,const MatType,Mat*); 887087cfbeSBarry Smith extern PetscErrorCode DMRefine_DA(DM,MPI_Comm,DM*); 897087cfbeSBarry Smith extern PetscErrorCode DMCoarsen_DA(DM,MPI_Comm,DM*); 907087cfbeSBarry Smith extern PetscErrorCode DMRefineHierarchy_DA(DM,PetscInt,DM[]); 917087cfbeSBarry Smith extern PetscErrorCode DMCoarsenHierarchy_DA(DM,PetscInt,DM[]); 927087cfbeSBarry Smith extern PetscErrorCode DMGetInjection_DA(DM,DM,VecScatter*); 937087cfbeSBarry Smith extern PetscErrorCode DMGetAggregates_DA(DM,DM,Mat*); 947087cfbeSBarry Smith extern PetscErrorCode DMView_DA(DM,PetscViewer); 957087cfbeSBarry Smith extern PetscErrorCode DMSetUp_DA(DM); 967087cfbeSBarry Smith extern PetscErrorCode DMDestroy_DA(DM); 979a42bb27SBarry Smith 98a4121054SBarry Smith EXTERN_C_BEGIN 9947c6ae99SBarry Smith #undef __FUNCT__ 100a4121054SBarry Smith #define __FUNCT__ "DMCreate_DA" 1017087cfbeSBarry Smith PetscErrorCode DMCreate_DA(DM da) 10247c6ae99SBarry Smith { 10347c6ae99SBarry Smith PetscErrorCode ierr; 10447c6ae99SBarry Smith DM_DA *dd; 10547c6ae99SBarry Smith 10647c6ae99SBarry Smith PetscFunctionBegin; 107a4121054SBarry Smith PetscValidPointer(da,1); 108a4121054SBarry Smith ierr = PetscNewLog(da,DM_DA,&dd);CHKERRQ(ierr); 109a4121054SBarry Smith da->data = dd; 11047c6ae99SBarry Smith 11147c6ae99SBarry Smith dd->dim = -1; 112aa219208SBarry Smith dd->interptype = DMDA_Q1; 11347c6ae99SBarry Smith dd->refine_x = 2; 11447c6ae99SBarry Smith dd->refine_y = 2; 11547c6ae99SBarry Smith dd->refine_z = 2; 11647c6ae99SBarry Smith dd->fieldname = PETSC_NULL; 11747c6ae99SBarry Smith dd->nlocal = -1; 11847c6ae99SBarry Smith dd->Nlocal = -1; 11947c6ae99SBarry Smith dd->M = -1; 12047c6ae99SBarry Smith dd->N = -1; 12147c6ae99SBarry Smith dd->P = -1; 12247c6ae99SBarry Smith dd->m = -1; 12347c6ae99SBarry Smith dd->n = -1; 12447c6ae99SBarry Smith dd->p = -1; 12547c6ae99SBarry Smith dd->w = -1; 12647c6ae99SBarry Smith dd->s = -1; 12747c6ae99SBarry Smith dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1; 12847c6ae99SBarry Smith dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1; 12947c6ae99SBarry Smith 13047c6ae99SBarry Smith dd->gtol = PETSC_NULL; 13147c6ae99SBarry Smith dd->ltog = PETSC_NULL; 13247c6ae99SBarry Smith dd->ltol = PETSC_NULL; 13347c6ae99SBarry Smith dd->ao = PETSC_NULL; 13447c6ae99SBarry Smith dd->base = -1; 1351321219cSEthan Coon dd->bx = DMDA_BOUNDARY_NONE; 1361321219cSEthan Coon dd->by = DMDA_BOUNDARY_NONE; 1371321219cSEthan Coon dd->bz = DMDA_BOUNDARY_NONE; 138aa219208SBarry Smith dd->stencil_type = DMDA_STENCIL_BOX; 139aa219208SBarry Smith dd->interptype = DMDA_Q1; 14047c6ae99SBarry Smith dd->idx = PETSC_NULL; 14147c6ae99SBarry Smith dd->Nl = -1; 14247c6ae99SBarry Smith dd->lx = PETSC_NULL; 14347c6ae99SBarry Smith dd->ly = PETSC_NULL; 14447c6ae99SBarry Smith dd->lz = PETSC_NULL; 14547c6ae99SBarry Smith 146454e267fSLisandro Dalcin dd->elementtype = DMDA_ELEMENT_Q1; 147454e267fSLisandro Dalcin 148a4121054SBarry Smith ierr = PetscStrallocpy(VECSTANDARD,&da->vectype);CHKERRQ(ierr); 149a4121054SBarry Smith da->ops->globaltolocalbegin = DMGlobalToLocalBegin_DA; 150a4121054SBarry Smith da->ops->globaltolocalend = DMGlobalToLocalEnd_DA; 151a4121054SBarry Smith da->ops->localtoglobalbegin = DMLocalToGlobalBegin_DA; 152a4121054SBarry Smith da->ops->localtoglobalend = DMLocalToGlobalEnd_DA; 153a4121054SBarry Smith da->ops->createglobalvector = DMCreateGlobalVector_DA; 154a4121054SBarry Smith da->ops->createlocalvector = DMCreateLocalVector_DA; 155a4121054SBarry Smith da->ops->getinterpolation = DMGetInterpolation_DA; 156a4121054SBarry Smith da->ops->getcoloring = DMGetColoring_DA; 157a4121054SBarry Smith da->ops->getmatrix = DMGetMatrix_DA; 158a4121054SBarry Smith da->ops->refine = DMRefine_DA; 159a4121054SBarry Smith da->ops->coarsen = DMCoarsen_DA; 160a4121054SBarry Smith da->ops->refinehierarchy = DMRefineHierarchy_DA; 161a4121054SBarry Smith da->ops->coarsenhierarchy = DMCoarsenHierarchy_DA; 162a4121054SBarry Smith da->ops->getinjection = DMGetInjection_DA; 163a4121054SBarry Smith da->ops->getaggregates = DMGetAggregates_DA; 164a4121054SBarry Smith da->ops->destroy = DMDestroy_DA; 165a4121054SBarry Smith da->ops->view = 0; 166a4121054SBarry Smith da->ops->setfromoptions = DMSetFromOptions_DA; 167a4121054SBarry Smith da->ops->setup = DMSetUp_DA; 168a4121054SBarry Smith PetscFunctionReturn(0); 169a4121054SBarry Smith } 170a4121054SBarry Smith EXTERN_C_END 17147c6ae99SBarry Smith 172a4121054SBarry Smith #undef __FUNCT__ 173a4121054SBarry Smith #define __FUNCT__ "DMDACreate" 174a4121054SBarry Smith /*@ 175a4121054SBarry Smith DMDACreate - Creates a DMDA object. 176a4121054SBarry Smith 177a4121054SBarry Smith Collective on MPI_Comm 178a4121054SBarry Smith 179a4121054SBarry Smith Input Parameter: 180a4121054SBarry Smith . comm - The communicator for the DMDA object 181a4121054SBarry Smith 182a4121054SBarry Smith Output Parameter: 183a4121054SBarry Smith . da - The DMDA object 184a4121054SBarry Smith 185e0f5d30fSBarry Smith Level: advanced 186e0f5d30fSBarry Smith 187e0f5d30fSBarry Smith Developers Note: Since there exists DMDACreate1/2/3d() should this routine even exist? 188a4121054SBarry Smith 189a4121054SBarry Smith .keywords: DMDA, create 190e0f5d30fSBarry Smith .seealso: DMDASetSizes(), DMDADuplicate(), DMDACreate1d(), DMDACreate2d(), DMDACreate3d() 191a4121054SBarry Smith @*/ 1927087cfbeSBarry Smith PetscErrorCode DMDACreate(MPI_Comm comm, DM *da) 193a4121054SBarry Smith { 194a4121054SBarry Smith PetscErrorCode ierr; 195a4121054SBarry Smith 196a4121054SBarry Smith PetscFunctionBegin; 197a4121054SBarry Smith PetscValidPointer(da,2); 198a4121054SBarry Smith ierr = DMCreate(comm,da);CHKERRQ(ierr); 199a4121054SBarry Smith ierr = DMSetType(*da,DMDA);CHKERRQ(ierr); 20047c6ae99SBarry Smith PetscFunctionReturn(0); 20147c6ae99SBarry Smith } 202