1*47c6ae99SBarry Smith #define PETSCDM_DLL 2*47c6ae99SBarry Smith #include "private/daimpl.h" /*I "petscda.h" I*/ 3*47c6ae99SBarry Smith 4*47c6ae99SBarry Smith #undef __FUNCT__ 5*47c6ae99SBarry Smith #define __FUNCT__ "DAViewFromOptions" 6*47c6ae99SBarry Smith /*@ 7*47c6ae99SBarry Smith DAViewFromOptions - This function visualizes the DA based upon user options. 8*47c6ae99SBarry Smith 9*47c6ae99SBarry Smith Collective on DA 10*47c6ae99SBarry Smith 11*47c6ae99SBarry Smith Input Parameters: 12*47c6ae99SBarry Smith + da - The DA 13*47c6ae99SBarry Smith - title - The title (currently ignored) 14*47c6ae99SBarry Smith 15*47c6ae99SBarry Smith Level: intermediate 16*47c6ae99SBarry Smith 17*47c6ae99SBarry Smith .keywords: DA, view, options, database 18*47c6ae99SBarry Smith .seealso: DASetFromOptions(), DAView() 19*47c6ae99SBarry Smith @*/ 20*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DAViewFromOptions(DA da, const char title[]) 21*47c6ae99SBarry Smith { 22*47c6ae99SBarry Smith PetscErrorCode ierr; 23*47c6ae99SBarry Smith 24*47c6ae99SBarry Smith PetscFunctionBegin; 25*47c6ae99SBarry Smith ierr = DAView_Private(da);CHKERRQ(ierr); 26*47c6ae99SBarry Smith PetscFunctionReturn(0); 27*47c6ae99SBarry Smith } 28*47c6ae99SBarry Smith 29*47c6ae99SBarry Smith #undef __FUNCT__ 30*47c6ae99SBarry Smith #define __FUNCT__ "DASetTypeFromOptions_Private" 31*47c6ae99SBarry Smith /* 32*47c6ae99SBarry Smith DASetTypeFromOptions_Private - Sets the type of DA from user options. Defaults to a 1D DA. 33*47c6ae99SBarry Smith 34*47c6ae99SBarry Smith Collective on Vec 35*47c6ae99SBarry Smith 36*47c6ae99SBarry Smith Input Parameter: 37*47c6ae99SBarry Smith . da - The DA 38*47c6ae99SBarry Smith 39*47c6ae99SBarry Smith Level: intermediate 40*47c6ae99SBarry Smith 41*47c6ae99SBarry Smith .keywords: DA, set, options, database, type 42*47c6ae99SBarry Smith .seealso: DASetFromOptions(), DASetType() 43*47c6ae99SBarry Smith */ 44*47c6ae99SBarry Smith static PetscErrorCode DASetTypeFromOptions_Private(DA da) 45*47c6ae99SBarry Smith { 46*47c6ae99SBarry Smith const DAType defaultType = DA1D; 47*47c6ae99SBarry Smith char typeName[256]; 48*47c6ae99SBarry Smith PetscBool opt = PETSC_FALSE; 49*47c6ae99SBarry Smith PetscErrorCode ierr; 50*47c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 51*47c6ae99SBarry Smith 52*47c6ae99SBarry Smith PetscFunctionBegin; 53*47c6ae99SBarry Smith switch (dd->dim) { 54*47c6ae99SBarry Smith case 1: defaultType = DA1D; break; 55*47c6ae99SBarry Smith case 2: defaultType = DA2D; break; 56*47c6ae99SBarry Smith case 3: defaultType = DA3D; break; 57*47c6ae99SBarry Smith } 58*47c6ae99SBarry Smith if (((PetscObject)da)->type_name) { 59*47c6ae99SBarry Smith defaultType = ((PetscObject)da)->type_name; 60*47c6ae99SBarry Smith } 61*47c6ae99SBarry Smith if (!DARegisterAllCalled) {ierr = DARegisterAll(PETSC_NULL);CHKERRQ(ierr);} 62*47c6ae99SBarry Smith if (dd->dim == PETSC_DECIDE) { 63*47c6ae99SBarry Smith ierr = PetscOptionsList("-da_type","DA type","DASetType",DAList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 64*47c6ae99SBarry Smith } 65*47c6ae99SBarry Smith if (opt) { 66*47c6ae99SBarry Smith ierr = DASetType(da, typeName);CHKERRQ(ierr); 67*47c6ae99SBarry Smith } else { 68*47c6ae99SBarry Smith ierr = DASetType(da, defaultType);CHKERRQ(ierr); 69*47c6ae99SBarry Smith } 70*47c6ae99SBarry Smith PetscFunctionReturn(0); 71*47c6ae99SBarry Smith } 72*47c6ae99SBarry Smith 73*47c6ae99SBarry Smith #undef __FUNCT__ 74*47c6ae99SBarry Smith #define __FUNCT__ "DASetFromOptions" 75*47c6ae99SBarry Smith /*@ 76*47c6ae99SBarry Smith DASetFromOptions - Configures the vector from the options database. 77*47c6ae99SBarry Smith 78*47c6ae99SBarry Smith Collective on DA 79*47c6ae99SBarry Smith 80*47c6ae99SBarry Smith Input Parameter: 81*47c6ae99SBarry Smith . da - The DA 82*47c6ae99SBarry Smith 83*47c6ae99SBarry Smith Notes: To see all options, run your program with the -help option, or consult the <A href="../../docs/manual.pdf">Users Manual</A>. 84*47c6ae99SBarry Smith Must be called after DACreate() but before the DA is used. 85*47c6ae99SBarry Smith 86*47c6ae99SBarry Smith Level: beginner 87*47c6ae99SBarry Smith 88*47c6ae99SBarry Smith Concepts: DA^setting options 89*47c6ae99SBarry Smith Concepts: DA^setting type 90*47c6ae99SBarry Smith 91*47c6ae99SBarry Smith .keywords: DA, set, options, database 92*47c6ae99SBarry Smith .seealso: DACreate(), DASetOptionsPrefix() 93*47c6ae99SBarry Smith @*/ 94*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DASetFromOptions(DA da) 95*47c6ae99SBarry Smith { 96*47c6ae99SBarry Smith PetscErrorCode ierr; 97*47c6ae99SBarry Smith PetscBool flg; 98*47c6ae99SBarry Smith char typeName[256]; 99*47c6ae99SBarry Smith DM_DA *dd = (DM_DA*)da->data; 100*47c6ae99SBarry Smith 101*47c6ae99SBarry Smith PetscFunctionBegin; 102*47c6ae99SBarry Smith PetscValidHeaderSpecific(da,DM_CLASSID,1); 103*47c6ae99SBarry Smith 104*47c6ae99SBarry Smith ierr = PetscOptionsBegin(((PetscObject)da)->comm,((PetscObject)da)->prefix,"DA Options","DA");CHKERRQ(ierr); 105*47c6ae99SBarry Smith /* Handle DA grid sizes */ 106*47c6ae99SBarry Smith if (dd->M < 0) { 107*47c6ae99SBarry Smith PetscInt newM = -dd->M; 108*47c6ae99SBarry Smith ierr = PetscOptionsInt("-da_grid_x","Number of grid points in x direction","DASetSizes",newM,&newM,PETSC_NULL);CHKERRQ(ierr); 109*47c6ae99SBarry Smith dd->M = newM; 110*47c6ae99SBarry Smith } 111*47c6ae99SBarry Smith if (dd->dim > 1 && dd->N < 0) { 112*47c6ae99SBarry Smith PetscInt newN = -dd->N; 113*47c6ae99SBarry Smith ierr = PetscOptionsInt("-da_grid_y","Number of grid points in y direction","DASetSizes",newN,&newN,PETSC_NULL);CHKERRQ(ierr); 114*47c6ae99SBarry Smith dd->N = newN; 115*47c6ae99SBarry Smith } 116*47c6ae99SBarry Smith if (dd->dim > 2 && dd->P < 0) { 117*47c6ae99SBarry Smith PetscInt newP = -dd->P; 118*47c6ae99SBarry Smith ierr = PetscOptionsInt("-da_grid_z","Number of grid points in z direction","DASetSizes",newP,&newP,PETSC_NULL);CHKERRQ(ierr); 119*47c6ae99SBarry Smith dd->P = newP; 120*47c6ae99SBarry Smith } 121*47c6ae99SBarry Smith /* Handle DA parallel distibution */ 122*47c6ae99SBarry Smith ierr = PetscOptionsInt("-da_processors_x","Number of processors in x direction","DASetNumProcs",dd->m,&dd->m,PETSC_NULL);CHKERRQ(ierr); 123*47c6ae99SBarry Smith if (dd->dim > 1) {ierr = PetscOptionsInt("-da_processors_y","Number of processors in y direction","DASetNumProcs",dd->n,&dd->n,PETSC_NULL);CHKERRQ(ierr);} 124*47c6ae99SBarry Smith if (dd->dim > 2) {ierr = PetscOptionsInt("-da_processors_z","Number of processors in z direction","DASetNumProcs",dd->p,&dd->p,PETSC_NULL);CHKERRQ(ierr);} 125*47c6ae99SBarry Smith /* Handle DA refinement */ 126*47c6ae99SBarry Smith ierr = PetscOptionsInt("-da_refine_x","Refinement ratio in x direction","DASetRefinementFactor",dd->refine_x,&dd->refine_x,PETSC_NULL);CHKERRQ(ierr); 127*47c6ae99SBarry Smith if (dd->dim > 1) {ierr = PetscOptionsInt("-da_refine_y","Refinement ratio in y direction","DASetRefinementFactor",dd->refine_y,&dd->refine_y,PETSC_NULL);CHKERRQ(ierr);} 128*47c6ae99SBarry Smith if (dd->dim > 2) {ierr = PetscOptionsInt("-da_refine_z","Refinement ratio in z direction","DASetRefinementFactor",dd->refine_z,&dd->refine_z,PETSC_NULL);CHKERRQ(ierr);} 129*47c6ae99SBarry Smith /* Handle DA type options; only makes sense to call if dimension has not yet been set */ 130*47c6ae99SBarry Smith ierr = DASetTypeFromOptions_Private(da);CHKERRQ(ierr); 131*47c6ae99SBarry Smith 132*47c6ae99SBarry Smith if (!VecRegisterAllCalled) {ierr = VecRegisterAll(PETSC_NULL);CHKERRQ(ierr);} 133*47c6ae99SBarry Smith ierr = PetscOptionsList("-da_vec_type","Vector type used for created vectors","DASetVecType",VecList,da->vectype,typeName,256,&flg);CHKERRQ(ierr); 134*47c6ae99SBarry Smith if (flg) { 135*47c6ae99SBarry Smith ierr = DASetVecType(da,typeName);CHKERRQ(ierr); 136*47c6ae99SBarry Smith } 137*47c6ae99SBarry Smith 138*47c6ae99SBarry Smith /* Handle specific DA options */ 139*47c6ae99SBarry Smith if (da->ops->setfromoptions) { 140*47c6ae99SBarry Smith ierr = (*da->ops->setfromoptions)(da);CHKERRQ(ierr); 141*47c6ae99SBarry Smith } 142*47c6ae99SBarry Smith 143*47c6ae99SBarry Smith /* process any options handlers added with PetscObjectAddOptionsHandler() */ 144*47c6ae99SBarry Smith ierr = PetscObjectProcessOptionsHandlers((PetscObject)da);CHKERRQ(ierr); 145*47c6ae99SBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 146*47c6ae99SBarry Smith 147*47c6ae99SBarry Smith ierr = DAViewFromOptions(da, ((PetscObject)da)->name);CHKERRQ(ierr); 148*47c6ae99SBarry Smith PetscFunctionReturn(0); 149*47c6ae99SBarry Smith } 150*47c6ae99SBarry Smith 151*47c6ae99SBarry Smith #undef __FUNCT__ 152*47c6ae99SBarry Smith #define __FUNCT__ "DACreate" 153*47c6ae99SBarry Smith /*@ 154*47c6ae99SBarry Smith DACreate - Creates an empty DA object. The type can then be set with DASetType(), 155*47c6ae99SBarry Smith or DASetFromOptions(). 156*47c6ae99SBarry Smith 157*47c6ae99SBarry Smith If you never call DASetType() or DASetFromOptions() it will generate an 158*47c6ae99SBarry Smith error when you try to use the DA. 159*47c6ae99SBarry Smith 160*47c6ae99SBarry Smith Collective on MPI_Comm 161*47c6ae99SBarry Smith 162*47c6ae99SBarry Smith Input Parameter: 163*47c6ae99SBarry Smith . comm - The communicator for the DA object 164*47c6ae99SBarry Smith 165*47c6ae99SBarry Smith Output Parameter: 166*47c6ae99SBarry Smith . da - The DA object 167*47c6ae99SBarry Smith 168*47c6ae99SBarry Smith Level: beginner 169*47c6ae99SBarry Smith 170*47c6ae99SBarry Smith .keywords: DA, create 171*47c6ae99SBarry Smith .seealso: DASetType(), DASetSizes(), DADuplicate() 172*47c6ae99SBarry Smith @*/ 173*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DACreate(MPI_Comm comm, DA *da) 174*47c6ae99SBarry Smith { 175*47c6ae99SBarry Smith DA d; 176*47c6ae99SBarry Smith PetscErrorCode ierr; 177*47c6ae99SBarry Smith DM_DA *dd; 178*47c6ae99SBarry Smith 179*47c6ae99SBarry Smith PetscFunctionBegin; 180*47c6ae99SBarry Smith PetscValidPointer(da,2); 181*47c6ae99SBarry Smith *da = PETSC_NULL; 182*47c6ae99SBarry Smith #ifndef PETSC_USE_DYNAMIC_LIBRARIES 183*47c6ae99SBarry Smith ierr = DMInitializePackage(PETSC_NULL);CHKERRQ(ierr); 184*47c6ae99SBarry Smith #endif 185*47c6ae99SBarry Smith 186*47c6ae99SBarry Smith ierr = PetscHeaderCreate(d, _p_DM, struct _DMOps, DM_CLASSID, 0, "DM", comm, DADestroy, DAView);CHKERRQ(ierr); 187*47c6ae99SBarry Smith ierr = PetscMemzero(d->ops, sizeof(struct _DMOps));CHKERRQ(ierr); 188*47c6ae99SBarry Smith ierr = PetscNewLog(d,DM_DA,&dd);CHKERRQ(ierr); 189*47c6ae99SBarry Smith d->data = dd; 190*47c6ae99SBarry Smith 191*47c6ae99SBarry Smith dd->dim = -1; 192*47c6ae99SBarry Smith dd->interptype = DA_Q1; 193*47c6ae99SBarry Smith dd->refine_x = 2; 194*47c6ae99SBarry Smith dd->refine_y = 2; 195*47c6ae99SBarry Smith dd->refine_z = 2; 196*47c6ae99SBarry Smith dd->fieldname = PETSC_NULL; 197*47c6ae99SBarry Smith dd->nlocal = -1; 198*47c6ae99SBarry Smith dd->Nlocal = -1; 199*47c6ae99SBarry Smith dd->M = -1; 200*47c6ae99SBarry Smith dd->N = -1; 201*47c6ae99SBarry Smith dd->P = -1; 202*47c6ae99SBarry Smith dd->m = -1; 203*47c6ae99SBarry Smith dd->n = -1; 204*47c6ae99SBarry Smith dd->p = -1; 205*47c6ae99SBarry Smith dd->w = -1; 206*47c6ae99SBarry Smith dd->s = -1; 207*47c6ae99SBarry Smith dd->xs = -1; dd->xe = -1; dd->ys = -1; dd->ye = -1; dd->zs = -1; dd->ze = -1; 208*47c6ae99SBarry Smith dd->Xs = -1; dd->Xe = -1; dd->Ys = -1; dd->Ye = -1; dd->Zs = -1; dd->Ze = -1; 209*47c6ae99SBarry Smith 210*47c6ae99SBarry Smith dd->gtol = PETSC_NULL; 211*47c6ae99SBarry Smith dd->ltog = PETSC_NULL; 212*47c6ae99SBarry Smith dd->ltol = PETSC_NULL; 213*47c6ae99SBarry Smith dd->ltogmap = PETSC_NULL; 214*47c6ae99SBarry Smith dd->ltogmapb = PETSC_NULL; 215*47c6ae99SBarry Smith dd->ao = PETSC_NULL; 216*47c6ae99SBarry Smith dd->base = -1; 217*47c6ae99SBarry Smith dd->wrap = DA_NONPERIODIC; 218*47c6ae99SBarry Smith dd->stencil_type = DA_STENCIL_BOX; 219*47c6ae99SBarry Smith dd->interptype = DA_Q1; 220*47c6ae99SBarry Smith dd->idx = PETSC_NULL; 221*47c6ae99SBarry Smith dd->Nl = -1; 222*47c6ae99SBarry Smith dd->lx = PETSC_NULL; 223*47c6ae99SBarry Smith dd->ly = PETSC_NULL; 224*47c6ae99SBarry Smith dd->lz = PETSC_NULL; 225*47c6ae99SBarry Smith 226*47c6ae99SBarry Smith ierr = PetscStrallocpy(VECSTANDARD,&d->vectype);CHKERRQ(ierr); 227*47c6ae99SBarry Smith d->ops->globaltolocalbegin = DAGlobalToLocalBegin; 228*47c6ae99SBarry Smith d->ops->globaltolocalend = DAGlobalToLocalEnd; 229*47c6ae99SBarry Smith d->ops->localtoglobal = DALocalToGlobal; 230*47c6ae99SBarry Smith d->ops->createglobalvector = DACreateGlobalVector; 231*47c6ae99SBarry Smith d->ops->createlocalvector = DACreateLocalVector; 232*47c6ae99SBarry Smith d->ops->getinterpolation = DAGetInterpolation; 233*47c6ae99SBarry Smith d->ops->getcoloring = DAGetColoring; 234*47c6ae99SBarry Smith d->ops->getmatrix = DAGetMatrix; 235*47c6ae99SBarry Smith d->ops->refine = DARefine; 236*47c6ae99SBarry Smith d->ops->coarsen = DACoarsen; 237*47c6ae99SBarry Smith d->ops->refinehierarchy = DARefineHierarchy; 238*47c6ae99SBarry Smith d->ops->coarsenhierarchy = DACoarsenHierarchy; 239*47c6ae99SBarry Smith d->ops->getinjection = DAGetInjection; 240*47c6ae99SBarry Smith d->ops->getaggregates = DAGetAggregates; 241*47c6ae99SBarry Smith 242*47c6ae99SBarry Smith *da = d; 243*47c6ae99SBarry Smith PetscFunctionReturn(0); 244*47c6ae99SBarry Smith } 245