xref: /petsc/src/dm/impls/da/dacreate.c (revision 47c6ae997ffd1b2afd66b6474dff5950ae8613d1)
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