xref: /petsc/src/dm/impls/da/dalocal.c (revision 47c6ae997ffd1b2afd66b6474dff5950ae8613d1)
1*47c6ae99SBarry Smith #define PETSCDM_DLL
2*47c6ae99SBarry Smith 
3*47c6ae99SBarry Smith /*
4*47c6ae99SBarry Smith   Code for manipulating distributed regular arrays in parallel.
5*47c6ae99SBarry Smith */
6*47c6ae99SBarry Smith 
7*47c6ae99SBarry Smith #include "private/daimpl.h"    /*I   "petscda.h"   I*/
8*47c6ae99SBarry Smith 
9*47c6ae99SBarry Smith /*
10*47c6ae99SBarry Smith    This allows the DA vectors to properly tell Matlab their dimensions
11*47c6ae99SBarry Smith */
12*47c6ae99SBarry Smith #if defined(PETSC_HAVE_MATLAB_ENGINE)
13*47c6ae99SBarry Smith #include "engine.h"   /* Matlab include file */
14*47c6ae99SBarry Smith #include "mex.h"      /* Matlab include file */
15*47c6ae99SBarry Smith EXTERN_C_BEGIN
16*47c6ae99SBarry Smith #undef __FUNCT__
17*47c6ae99SBarry Smith #define __FUNCT__ "VecMatlabEnginePut_DA2d"
18*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT VecMatlabEnginePut_DA2d(PetscObject obj,void *mengine)
19*47c6ae99SBarry Smith {
20*47c6ae99SBarry Smith   PetscErrorCode ierr;
21*47c6ae99SBarry Smith   PetscInt       n,m;
22*47c6ae99SBarry Smith   Vec            vec = (Vec)obj;
23*47c6ae99SBarry Smith   PetscScalar    *array;
24*47c6ae99SBarry Smith   mxArray        *mat;
25*47c6ae99SBarry Smith   DA             da;
26*47c6ae99SBarry Smith 
27*47c6ae99SBarry Smith   PetscFunctionBegin;
28*47c6ae99SBarry Smith   ierr = PetscObjectQuery((PetscObject)vec,"DA",(PetscObject*)&da);CHKERRQ(ierr);
29*47c6ae99SBarry Smith   if (!da) SETERRQ(((PetscObject)vec)->comm,PETSC_ERR_ARG_WRONGSTATE,"Vector not associated with a DA");
30*47c6ae99SBarry Smith   ierr = DAGetGhostCorners(da,0,0,0,&m,&n,0);CHKERRQ(ierr);
31*47c6ae99SBarry Smith 
32*47c6ae99SBarry Smith   ierr = VecGetArray(vec,&array);CHKERRQ(ierr);
33*47c6ae99SBarry Smith #if !defined(PETSC_USE_COMPLEX)
34*47c6ae99SBarry Smith   mat  = mxCreateDoubleMatrix(m,n,mxREAL);
35*47c6ae99SBarry Smith #else
36*47c6ae99SBarry Smith   mat  = mxCreateDoubleMatrix(m,n,mxCOMPLEX);
37*47c6ae99SBarry Smith #endif
38*47c6ae99SBarry Smith   ierr = PetscMemcpy(mxGetPr(mat),array,n*m*sizeof(PetscScalar));CHKERRQ(ierr);
39*47c6ae99SBarry Smith   ierr = PetscObjectName(obj);CHKERRQ(ierr);
40*47c6ae99SBarry Smith   engPutVariable((Engine *)mengine,obj->name,mat);
41*47c6ae99SBarry Smith 
42*47c6ae99SBarry Smith   ierr = VecRestoreArray(vec,&array);CHKERRQ(ierr);
43*47c6ae99SBarry Smith   PetscFunctionReturn(0);
44*47c6ae99SBarry Smith }
45*47c6ae99SBarry Smith EXTERN_C_END
46*47c6ae99SBarry Smith #endif
47*47c6ae99SBarry Smith 
48*47c6ae99SBarry Smith 
49*47c6ae99SBarry Smith #undef __FUNCT__
50*47c6ae99SBarry Smith #define __FUNCT__ "DACreateLocalVector"
51*47c6ae99SBarry Smith /*@
52*47c6ae99SBarry Smith    DACreateLocalVector - Creates a Seq PETSc vector that
53*47c6ae99SBarry Smith    may be used with the DAXXX routines.
54*47c6ae99SBarry Smith 
55*47c6ae99SBarry Smith    Not Collective
56*47c6ae99SBarry Smith 
57*47c6ae99SBarry Smith    Input Parameter:
58*47c6ae99SBarry Smith .  da - the distributed array
59*47c6ae99SBarry Smith 
60*47c6ae99SBarry Smith    Output Parameter:
61*47c6ae99SBarry Smith .  g - the local vector
62*47c6ae99SBarry Smith 
63*47c6ae99SBarry Smith    Level: beginner
64*47c6ae99SBarry Smith 
65*47c6ae99SBarry Smith    Note:
66*47c6ae99SBarry Smith    The output parameter, g, is a regular PETSc vector that should be destroyed
67*47c6ae99SBarry Smith    with a call to VecDestroy() when usage is finished.
68*47c6ae99SBarry Smith 
69*47c6ae99SBarry Smith .keywords: distributed array, create, local, vector
70*47c6ae99SBarry Smith 
71*47c6ae99SBarry Smith .seealso: DACreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(),
72*47c6ae99SBarry Smith           DACreate1d(), DACreate2d(), DACreate3d(), DAGlobalToLocalBegin(),
73*47c6ae99SBarry Smith           DAGlobalToLocalEnd(), DALocalToGlobal(), DAGetLocalVector(), DARestoreLocalVector()
74*47c6ae99SBarry Smith @*/
75*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DACreateLocalVector(DA da,Vec* g)
76*47c6ae99SBarry Smith {
77*47c6ae99SBarry Smith   PetscErrorCode ierr;
78*47c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
79*47c6ae99SBarry Smith 
80*47c6ae99SBarry Smith   PetscFunctionBegin;
81*47c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
82*47c6ae99SBarry Smith   PetscValidPointer(g,2);
83*47c6ae99SBarry Smith   ierr = VecCreate(PETSC_COMM_SELF,g);CHKERRQ(ierr);
84*47c6ae99SBarry Smith   ierr = VecSetSizes(*g,dd->nlocal,PETSC_DETERMINE);CHKERRQ(ierr);
85*47c6ae99SBarry Smith   ierr = VecSetType(*g,da->vectype);CHKERRQ(ierr);
86*47c6ae99SBarry Smith   ierr = VecSetBlockSize(*g,dd->w);CHKERRQ(ierr);
87*47c6ae99SBarry Smith   ierr = PetscObjectCompose((PetscObject)*g,"DA",(PetscObject)da);CHKERRQ(ierr);
88*47c6ae99SBarry Smith #if defined(PETSC_HAVE_MATLAB_ENGINE)
89*47c6ae99SBarry Smith   if (dd->w == 1  && dd->dim == 2) {
90*47c6ae99SBarry Smith     ierr = PetscObjectComposeFunctionDynamic((PetscObject)*g,"PetscMatlabEnginePut_C","VecMatlabEnginePut_DA2d",VecMatlabEnginePut_DA2d);CHKERRQ(ierr);
91*47c6ae99SBarry Smith   }
92*47c6ae99SBarry Smith #endif
93*47c6ae99SBarry Smith   PetscFunctionReturn(0);
94*47c6ae99SBarry Smith }
95*47c6ae99SBarry Smith 
96*47c6ae99SBarry Smith #undef __FUNCT__
97*47c6ae99SBarry Smith #define __FUNCT__ "DMGetLocalVector"
98*47c6ae99SBarry Smith /*@
99*47c6ae99SBarry Smith    DMGetLocalVector - Gets a Seq PETSc vector that
100*47c6ae99SBarry Smith    may be used with the DMXXX routines. This vector has spaces for the ghost values.
101*47c6ae99SBarry Smith 
102*47c6ae99SBarry Smith    Not Collective
103*47c6ae99SBarry Smith 
104*47c6ae99SBarry Smith    Input Parameter:
105*47c6ae99SBarry Smith .  dm - the distributed array
106*47c6ae99SBarry Smith 
107*47c6ae99SBarry Smith    Output Parameter:
108*47c6ae99SBarry Smith .  g - the local vector
109*47c6ae99SBarry Smith 
110*47c6ae99SBarry Smith    Level: beginner
111*47c6ae99SBarry Smith 
112*47c6ae99SBarry Smith    Note:
113*47c6ae99SBarry Smith    The vector values are NOT initialized and may have garbage in them, so you may need
114*47c6ae99SBarry Smith    to zero them.
115*47c6ae99SBarry Smith 
116*47c6ae99SBarry Smith    The output parameter, g, is a regular PETSc vector that should be returned with
117*47c6ae99SBarry Smith    DMRestoreLocalVector() DO NOT call VecDestroy() on it.
118*47c6ae99SBarry Smith 
119*47c6ae99SBarry Smith    VecStride*() operations can be useful when using DM with dof > 1
120*47c6ae99SBarry Smith 
121*47c6ae99SBarry Smith .keywords: distributed array, create, local, vector
122*47c6ae99SBarry Smith 
123*47c6ae99SBarry Smith .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(),
124*47c6ae99SBarry Smith           DACreate1d(), DACreate2d(), DACreate3d(), DMGlobalToLocalBegin(),
125*47c6ae99SBarry Smith           DMGlobalToLocalEnd(), DMLocalToGlobal(), DMCreateLocalVector(), DMRestoreLocalVector(),
126*47c6ae99SBarry Smith           VecStrideMax(), VecStrideMin(), VecStrideNorm()
127*47c6ae99SBarry Smith @*/
128*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetLocalVector(DM dm,Vec* g)
129*47c6ae99SBarry Smith {
130*47c6ae99SBarry Smith   PetscErrorCode ierr,i;
131*47c6ae99SBarry Smith 
132*47c6ae99SBarry Smith   PetscFunctionBegin;
133*47c6ae99SBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
134*47c6ae99SBarry Smith   PetscValidPointer(g,2);
135*47c6ae99SBarry Smith   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
136*47c6ae99SBarry Smith     if (dm->localin[i]) {
137*47c6ae99SBarry Smith       *g             = dm->localin[i];
138*47c6ae99SBarry Smith       dm->localin[i] = PETSC_NULL;
139*47c6ae99SBarry Smith       goto alldone;
140*47c6ae99SBarry Smith     }
141*47c6ae99SBarry Smith   }
142*47c6ae99SBarry Smith   ierr = DMCreateLocalVector(dm,g);CHKERRQ(ierr);
143*47c6ae99SBarry Smith 
144*47c6ae99SBarry Smith   alldone:
145*47c6ae99SBarry Smith   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
146*47c6ae99SBarry Smith     if (!dm->localout[i]) {
147*47c6ae99SBarry Smith       dm->localout[i] = *g;
148*47c6ae99SBarry Smith       break;
149*47c6ae99SBarry Smith     }
150*47c6ae99SBarry Smith   }
151*47c6ae99SBarry Smith   PetscFunctionReturn(0);
152*47c6ae99SBarry Smith }
153*47c6ae99SBarry Smith 
154*47c6ae99SBarry Smith #undef __FUNCT__
155*47c6ae99SBarry Smith #define __FUNCT__ "DMRestoreLocalVector"
156*47c6ae99SBarry Smith /*@
157*47c6ae99SBarry Smith    DMRestoreLocalVector - Returns a Seq PETSc vector that
158*47c6ae99SBarry Smith      obtained from DMGetLocalVector(). Do not use with vector obtained via
159*47c6ae99SBarry Smith      DMCreateLocalVector().
160*47c6ae99SBarry Smith 
161*47c6ae99SBarry Smith    Not Collective
162*47c6ae99SBarry Smith 
163*47c6ae99SBarry Smith    Input Parameter:
164*47c6ae99SBarry Smith +  dm - the distributed array
165*47c6ae99SBarry Smith -  g - the local vector
166*47c6ae99SBarry Smith 
167*47c6ae99SBarry Smith    Level: beginner
168*47c6ae99SBarry Smith 
169*47c6ae99SBarry Smith .keywords: distributed array, create, local, vector
170*47c6ae99SBarry Smith 
171*47c6ae99SBarry Smith .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(),
172*47c6ae99SBarry Smith           DACreate1d(), DACreate2d(), DACreate3d(), DMGlobalToLocalBegin(),
173*47c6ae99SBarry Smith           DMGlobalToLocalEnd(), DMLocalToGlobal(), DMCreateLocalVector(), DMGetLocalVector()
174*47c6ae99SBarry Smith @*/
175*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMRestoreLocalVector(DM dm,Vec* g)
176*47c6ae99SBarry Smith {
177*47c6ae99SBarry Smith   PetscErrorCode ierr;
178*47c6ae99SBarry Smith   PetscInt       i,j;
179*47c6ae99SBarry Smith 
180*47c6ae99SBarry Smith   PetscFunctionBegin;
181*47c6ae99SBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
182*47c6ae99SBarry Smith   PetscValidPointer(g,2);
183*47c6ae99SBarry Smith   for (j=0; j<DM_MAX_WORK_VECTORS; j++) {
184*47c6ae99SBarry Smith     if (*g == dm->localout[j]) {
185*47c6ae99SBarry Smith       dm->localout[j] = PETSC_NULL;
186*47c6ae99SBarry Smith       for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
187*47c6ae99SBarry Smith         if (!dm->localin[i]) {
188*47c6ae99SBarry Smith           dm->localin[i] = *g;
189*47c6ae99SBarry Smith           goto alldone;
190*47c6ae99SBarry Smith         }
191*47c6ae99SBarry Smith       }
192*47c6ae99SBarry Smith     }
193*47c6ae99SBarry Smith   }
194*47c6ae99SBarry Smith   ierr = VecDestroy(*g);CHKERRQ(ierr);
195*47c6ae99SBarry Smith   alldone:
196*47c6ae99SBarry Smith   PetscFunctionReturn(0);
197*47c6ae99SBarry Smith }
198*47c6ae99SBarry Smith 
199*47c6ae99SBarry Smith #undef __FUNCT__
200*47c6ae99SBarry Smith #define __FUNCT__ "DMGetGlobalVector"
201*47c6ae99SBarry Smith /*@
202*47c6ae99SBarry Smith    DMGetGlobalVector - Gets a MPI PETSc vector that
203*47c6ae99SBarry Smith    may be used with the DMXXX routines.
204*47c6ae99SBarry Smith 
205*47c6ae99SBarry Smith    Collective on DM
206*47c6ae99SBarry Smith 
207*47c6ae99SBarry Smith    Input Parameter:
208*47c6ae99SBarry Smith .  dm - the distributed array
209*47c6ae99SBarry Smith 
210*47c6ae99SBarry Smith    Output Parameter:
211*47c6ae99SBarry Smith .  g - the global vector
212*47c6ae99SBarry Smith 
213*47c6ae99SBarry Smith    Level: beginner
214*47c6ae99SBarry Smith 
215*47c6ae99SBarry Smith    Note:
216*47c6ae99SBarry Smith    The vector values are NOT initialized and may have garbage in them, so you may need
217*47c6ae99SBarry Smith    to zero them.
218*47c6ae99SBarry Smith 
219*47c6ae99SBarry Smith    The output parameter, g, is a regular PETSc vector that should be returned with
220*47c6ae99SBarry Smith    DMRestoreGlobalVector() DO NOT call VecDestroy() on it.
221*47c6ae99SBarry Smith 
222*47c6ae99SBarry Smith    VecStride*() operations can be useful when using DM with dof > 1
223*47c6ae99SBarry Smith 
224*47c6ae99SBarry Smith .keywords: distributed array, create, Global, vector
225*47c6ae99SBarry Smith 
226*47c6ae99SBarry Smith .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(),
227*47c6ae99SBarry Smith           DACreate1d(), DACreate2d(), DACreate3d(), DMGlobalToLocalBegin(),
228*47c6ae99SBarry Smith           DMGlobalToLocalEnd(), DMLocalToGlobal(), DMCreateLocalVector(), DMRestoreLocalVector()
229*47c6ae99SBarry Smith           VecStrideMax(), VecStrideMin(), VecStrideNorm()
230*47c6ae99SBarry Smith 
231*47c6ae99SBarry Smith @*/
232*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMGetGlobalVector(DM dm,Vec* g)
233*47c6ae99SBarry Smith {
234*47c6ae99SBarry Smith   PetscErrorCode ierr;
235*47c6ae99SBarry Smith   PetscInt       i;
236*47c6ae99SBarry Smith 
237*47c6ae99SBarry Smith   PetscFunctionBegin;
238*47c6ae99SBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
239*47c6ae99SBarry Smith   PetscValidPointer(g,2);
240*47c6ae99SBarry Smith   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
241*47c6ae99SBarry Smith     if (dm->globalin[i]) {
242*47c6ae99SBarry Smith       *g             = dm->globalin[i];
243*47c6ae99SBarry Smith       dm->globalin[i] = PETSC_NULL;
244*47c6ae99SBarry Smith       goto alldone;
245*47c6ae99SBarry Smith     }
246*47c6ae99SBarry Smith   }
247*47c6ae99SBarry Smith   ierr = DMCreateGlobalVector(dm,g);CHKERRQ(ierr);
248*47c6ae99SBarry Smith 
249*47c6ae99SBarry Smith   alldone:
250*47c6ae99SBarry Smith   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
251*47c6ae99SBarry Smith     if (!dm->globalout[i]) {
252*47c6ae99SBarry Smith       dm->globalout[i] = *g;
253*47c6ae99SBarry Smith       break;
254*47c6ae99SBarry Smith     }
255*47c6ae99SBarry Smith   }
256*47c6ae99SBarry Smith   PetscFunctionReturn(0);
257*47c6ae99SBarry Smith }
258*47c6ae99SBarry Smith 
259*47c6ae99SBarry Smith #undef __FUNCT__
260*47c6ae99SBarry Smith #define __FUNCT__ "DMRestoreGlobalVector"
261*47c6ae99SBarry Smith /*@
262*47c6ae99SBarry Smith    DMRestoreGlobalVector - Returns a Seq PETSc vector that
263*47c6ae99SBarry Smith      obtained from DMGetGlobalVector(). Do not use with vector obtained via
264*47c6ae99SBarry Smith      DMCreateGlobalVector().
265*47c6ae99SBarry Smith 
266*47c6ae99SBarry Smith    Not Collective
267*47c6ae99SBarry Smith 
268*47c6ae99SBarry Smith    Input Parameter:
269*47c6ae99SBarry Smith +  dm - the distributed array
270*47c6ae99SBarry Smith -  g - the global vector
271*47c6ae99SBarry Smith 
272*47c6ae99SBarry Smith    Level: beginner
273*47c6ae99SBarry Smith 
274*47c6ae99SBarry Smith .keywords: distributed array, create, global, vector
275*47c6ae99SBarry Smith 
276*47c6ae99SBarry Smith .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(),
277*47c6ae99SBarry Smith           DACreate1d(), DACreate2d(), DACreate3d(), DMGlobalToGlobalBegin(),
278*47c6ae99SBarry Smith           DMGlobalToGlobalEnd(), DMGlobalToGlobal(), DMCreateLocalVector(), DMGetGlobalVector()
279*47c6ae99SBarry Smith @*/
280*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DMRestoreGlobalVector(DM dm,Vec* g)
281*47c6ae99SBarry Smith {
282*47c6ae99SBarry Smith   PetscErrorCode ierr;
283*47c6ae99SBarry Smith   PetscInt       i,j;
284*47c6ae99SBarry Smith 
285*47c6ae99SBarry Smith   PetscFunctionBegin;
286*47c6ae99SBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
287*47c6ae99SBarry Smith   PetscValidPointer(g,2);
288*47c6ae99SBarry Smith   for (j=0; j<DM_MAX_WORK_VECTORS; j++) {
289*47c6ae99SBarry Smith     if (*g == dm->globalout[j]) {
290*47c6ae99SBarry Smith       dm->globalout[j] = PETSC_NULL;
291*47c6ae99SBarry Smith       for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
292*47c6ae99SBarry Smith         if (!dm->globalin[i]) {
293*47c6ae99SBarry Smith           dm->globalin[i] = *g;
294*47c6ae99SBarry Smith           goto alldone;
295*47c6ae99SBarry Smith         }
296*47c6ae99SBarry Smith       }
297*47c6ae99SBarry Smith     }
298*47c6ae99SBarry Smith   }
299*47c6ae99SBarry Smith   ierr = VecDestroy(*g);CHKERRQ(ierr);
300*47c6ae99SBarry Smith   alldone:
301*47c6ae99SBarry Smith   PetscFunctionReturn(0);
302*47c6ae99SBarry Smith }
303*47c6ae99SBarry Smith 
304*47c6ae99SBarry Smith /* ------------------------------------------------------------------- */
305*47c6ae99SBarry Smith #if defined(PETSC_HAVE_ADIC)
306*47c6ae99SBarry Smith 
307*47c6ae99SBarry Smith EXTERN_C_BEGIN
308*47c6ae99SBarry Smith #include "adic/ad_utils.h"
309*47c6ae99SBarry Smith EXTERN_C_END
310*47c6ae99SBarry Smith 
311*47c6ae99SBarry Smith #undef __FUNCT__
312*47c6ae99SBarry Smith #define __FUNCT__ "DAGetAdicArray"
313*47c6ae99SBarry Smith /*@C
314*47c6ae99SBarry Smith      DAGetAdicArray - Gets an array of derivative types for a DA
315*47c6ae99SBarry Smith 
316*47c6ae99SBarry Smith     Input Parameter:
317*47c6ae99SBarry Smith +    da - information about my local patch
318*47c6ae99SBarry Smith -    ghosted - do you want arrays for the ghosted or nonghosted patch
319*47c6ae99SBarry Smith 
320*47c6ae99SBarry Smith     Output Parameters:
321*47c6ae99SBarry Smith +    vptr - array data structured to be passed to ad_FormFunctionLocal()
322*47c6ae99SBarry Smith .    array_start - actual start of 1d array of all values that adiC can access directly (may be null)
323*47c6ae99SBarry Smith -    tdof - total number of degrees of freedom represented in array_start (may be null)
324*47c6ae99SBarry Smith 
325*47c6ae99SBarry Smith      Notes:
326*47c6ae99SBarry Smith        The vector values are NOT initialized and may have garbage in them, so you may need
327*47c6ae99SBarry Smith        to zero them.
328*47c6ae99SBarry Smith 
329*47c6ae99SBarry Smith        Returns the same type of object as the DAVecGetArray() except its elements are
330*47c6ae99SBarry Smith            derivative types instead of PetscScalars
331*47c6ae99SBarry Smith 
332*47c6ae99SBarry Smith      Level: advanced
333*47c6ae99SBarry Smith 
334*47c6ae99SBarry Smith .seealso: DARestoreAdicArray()
335*47c6ae99SBarry Smith 
336*47c6ae99SBarry Smith @*/
337*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DAGetAdicArray(DA da,PetscBool  ghosted,void *vptr,void *array_start,PetscInt *tdof)
338*47c6ae99SBarry Smith {
339*47c6ae99SBarry Smith   PetscErrorCode ierr;
340*47c6ae99SBarry Smith   PetscInt       j,i,deriv_type_size,xs,ys,xm,ym,zs,zm,itdof;
341*47c6ae99SBarry Smith   char           *iarray_start;
342*47c6ae99SBarry Smith   void           **iptr = (void**)vptr;
343*47c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
344*47c6ae99SBarry Smith 
345*47c6ae99SBarry Smith   PetscFunctionBegin;
346*47c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
347*47c6ae99SBarry Smith   if (ghosted) {
348*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
349*47c6ae99SBarry Smith       if (dd->adarrayghostedin[i]) {
350*47c6ae99SBarry Smith         *iptr                   = dd->adarrayghostedin[i];
351*47c6ae99SBarry Smith         iarray_start            = (char*)dd->adstartghostedin[i];
352*47c6ae99SBarry Smith         itdof                   = dd->ghostedtdof;
353*47c6ae99SBarry Smith         dd->adarrayghostedin[i] = PETSC_NULL;
354*47c6ae99SBarry Smith         dd->adstartghostedin[i] = PETSC_NULL;
355*47c6ae99SBarry Smith 
356*47c6ae99SBarry Smith         goto done;
357*47c6ae99SBarry Smith       }
358*47c6ae99SBarry Smith     }
359*47c6ae99SBarry Smith     xs = dd->Xs;
360*47c6ae99SBarry Smith     ys = dd->Ys;
361*47c6ae99SBarry Smith     zs = dd->Zs;
362*47c6ae99SBarry Smith     xm = dd->Xe-dd->Xs;
363*47c6ae99SBarry Smith     ym = dd->Ye-dd->Ys;
364*47c6ae99SBarry Smith     zm = dd->Ze-dd->Zs;
365*47c6ae99SBarry Smith   } else {
366*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
367*47c6ae99SBarry Smith       if (dd->adarrayin[i]) {
368*47c6ae99SBarry Smith         *iptr            = dd->adarrayin[i];
369*47c6ae99SBarry Smith         iarray_start     = (char*)dd->adstartin[i];
370*47c6ae99SBarry Smith         itdof            = dd->tdof;
371*47c6ae99SBarry Smith         dd->adarrayin[i] = PETSC_NULL;
372*47c6ae99SBarry Smith         dd->adstartin[i] = PETSC_NULL;
373*47c6ae99SBarry Smith 
374*47c6ae99SBarry Smith         goto done;
375*47c6ae99SBarry Smith       }
376*47c6ae99SBarry Smith     }
377*47c6ae99SBarry Smith     xs = dd->xs;
378*47c6ae99SBarry Smith     ys = dd->ys;
379*47c6ae99SBarry Smith     zs = dd->zs;
380*47c6ae99SBarry Smith     xm = dd->xe-dd->xs;
381*47c6ae99SBarry Smith     ym = dd->ye-dd->ys;
382*47c6ae99SBarry Smith     zm = dd->ze-dd->zs;
383*47c6ae99SBarry Smith   }
384*47c6ae99SBarry Smith   deriv_type_size = PetscADGetDerivTypeSize();
385*47c6ae99SBarry Smith 
386*47c6ae99SBarry Smith   switch (dd->dim) {
387*47c6ae99SBarry Smith     case 1: {
388*47c6ae99SBarry Smith       void *ptr;
389*47c6ae99SBarry Smith       itdof = xm;
390*47c6ae99SBarry Smith 
391*47c6ae99SBarry Smith       ierr  = PetscMalloc(xm*deriv_type_size,&iarray_start);CHKERRQ(ierr);
392*47c6ae99SBarry Smith 
393*47c6ae99SBarry Smith       ptr   = (void*)(iarray_start - xs*deriv_type_size);
394*47c6ae99SBarry Smith       *iptr = (void*)ptr;
395*47c6ae99SBarry Smith       break;}
396*47c6ae99SBarry Smith     case 2: {
397*47c6ae99SBarry Smith       void **ptr;
398*47c6ae99SBarry Smith       itdof = xm*ym;
399*47c6ae99SBarry Smith 
400*47c6ae99SBarry Smith       ierr  = PetscMalloc((ym+1)*sizeof(void*)+xm*ym*deriv_type_size,&iarray_start);CHKERRQ(ierr);
401*47c6ae99SBarry Smith 
402*47c6ae99SBarry Smith       ptr  = (void**)(iarray_start + xm*ym*deriv_type_size - ys*sizeof(void*));
403*47c6ae99SBarry Smith       for(j=ys;j<ys+ym;j++) {
404*47c6ae99SBarry Smith         ptr[j] = iarray_start + deriv_type_size*(xm*(j-ys) - xs);
405*47c6ae99SBarry Smith       }
406*47c6ae99SBarry Smith       *iptr = (void*)ptr;
407*47c6ae99SBarry Smith       break;}
408*47c6ae99SBarry Smith     case 3: {
409*47c6ae99SBarry Smith       void ***ptr,**bptr;
410*47c6ae99SBarry Smith       itdof = xm*ym*zm;
411*47c6ae99SBarry Smith 
412*47c6ae99SBarry Smith       ierr  = PetscMalloc((zm+1)*sizeof(void **)+(ym*zm+1)*sizeof(void*)+xm*ym*zm*deriv_type_size,&iarray_start);CHKERRQ(ierr);
413*47c6ae99SBarry Smith 
414*47c6ae99SBarry Smith       ptr  = (void***)(iarray_start + xm*ym*zm*deriv_type_size - zs*sizeof(void*));
415*47c6ae99SBarry Smith       bptr = (void**)(iarray_start + xm*ym*zm*deriv_type_size + zm*sizeof(void**));
416*47c6ae99SBarry Smith 
417*47c6ae99SBarry Smith       for(i=zs;i<zs+zm;i++) {
418*47c6ae99SBarry Smith         ptr[i] = bptr + ((i-zs)*ym - ys);
419*47c6ae99SBarry Smith       }
420*47c6ae99SBarry Smith       for (i=zs; i<zs+zm; i++) {
421*47c6ae99SBarry Smith         for (j=ys; j<ys+ym; j++) {
422*47c6ae99SBarry Smith           ptr[i][j] = iarray_start + deriv_type_size*(xm*ym*(i-zs) + xm*(j-ys) - xs);
423*47c6ae99SBarry Smith         }
424*47c6ae99SBarry Smith       }
425*47c6ae99SBarry Smith 
426*47c6ae99SBarry Smith       *iptr = (void*)ptr;
427*47c6ae99SBarry Smith       break;}
428*47c6ae99SBarry Smith     default:
429*47c6ae99SBarry Smith       SETERRQ1(((PetscObject)da)->comm,PETSC_ERR_SUP,"Dimension %D not supported",dd->dim);
430*47c6ae99SBarry Smith   }
431*47c6ae99SBarry Smith 
432*47c6ae99SBarry Smith   done:
433*47c6ae99SBarry Smith   /* add arrays to the checked out list */
434*47c6ae99SBarry Smith   if (ghosted) {
435*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
436*47c6ae99SBarry Smith       if (!dd->adarrayghostedout[i]) {
437*47c6ae99SBarry Smith         dd->adarrayghostedout[i] = *iptr ;
438*47c6ae99SBarry Smith         dd->adstartghostedout[i] = iarray_start;
439*47c6ae99SBarry Smith         dd->ghostedtdof          = itdof;
440*47c6ae99SBarry Smith         break;
441*47c6ae99SBarry Smith       }
442*47c6ae99SBarry Smith     }
443*47c6ae99SBarry Smith   } else {
444*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
445*47c6ae99SBarry Smith       if (!dd->adarrayout[i]) {
446*47c6ae99SBarry Smith         dd->adarrayout[i] = *iptr ;
447*47c6ae99SBarry Smith         dd->adstartout[i] = iarray_start;
448*47c6ae99SBarry Smith         dd->tdof          = itdof;
449*47c6ae99SBarry Smith         break;
450*47c6ae99SBarry Smith       }
451*47c6ae99SBarry Smith     }
452*47c6ae99SBarry Smith   }
453*47c6ae99SBarry Smith   if (i == DA_MAX_AD_ARRAYS+1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Too many DA ADIC arrays obtained");
454*47c6ae99SBarry Smith   if (tdof)        *tdof = itdof;
455*47c6ae99SBarry Smith   if (array_start) *(void**)array_start = iarray_start;
456*47c6ae99SBarry Smith   PetscFunctionReturn(0);
457*47c6ae99SBarry Smith }
458*47c6ae99SBarry Smith 
459*47c6ae99SBarry Smith #undef __FUNCT__
460*47c6ae99SBarry Smith #define __FUNCT__ "DARestoreAdicArray"
461*47c6ae99SBarry Smith /*@C
462*47c6ae99SBarry Smith      DARestoreAdicArray - Restores an array of derivative types for a DA
463*47c6ae99SBarry Smith 
464*47c6ae99SBarry Smith     Input Parameter:
465*47c6ae99SBarry Smith +    da - information about my local patch
466*47c6ae99SBarry Smith -    ghosted - do you want arrays for the ghosted or nonghosted patch
467*47c6ae99SBarry Smith 
468*47c6ae99SBarry Smith     Output Parameters:
469*47c6ae99SBarry Smith +    ptr - array data structured to be passed to ad_FormFunctionLocal()
470*47c6ae99SBarry Smith .    array_start - actual start of 1d array of all values that adiC can access directly
471*47c6ae99SBarry Smith -    tdof - total number of degrees of freedom represented in array_start
472*47c6ae99SBarry Smith 
473*47c6ae99SBarry Smith      Level: advanced
474*47c6ae99SBarry Smith 
475*47c6ae99SBarry Smith .seealso: DAGetAdicArray()
476*47c6ae99SBarry Smith 
477*47c6ae99SBarry Smith @*/
478*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DARestoreAdicArray(DA da,PetscBool  ghosted,void *ptr,void *array_start,PetscInt *tdof)
479*47c6ae99SBarry Smith {
480*47c6ae99SBarry Smith   PetscInt  i;
481*47c6ae99SBarry Smith   void      **iptr = (void**)ptr,iarray_start = 0;
482*47c6ae99SBarry Smith 
483*47c6ae99SBarry Smith   PetscFunctionBegin;
484*47c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
485*47c6ae99SBarry Smith   if (ghosted) {
486*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
487*47c6ae99SBarry Smith       if (dd->adarrayghostedout[i] == *iptr) {
488*47c6ae99SBarry Smith         iarray_start             = dd->adstartghostedout[i];
489*47c6ae99SBarry Smith         dd->adarrayghostedout[i] = PETSC_NULL;
490*47c6ae99SBarry Smith         dd->adstartghostedout[i] = PETSC_NULL;
491*47c6ae99SBarry Smith         break;
492*47c6ae99SBarry Smith       }
493*47c6ae99SBarry Smith     }
494*47c6ae99SBarry Smith     if (!iarray_start) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Could not find array in checkout list");
495*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
496*47c6ae99SBarry Smith       if (!dd->adarrayghostedin[i]){
497*47c6ae99SBarry Smith         dd->adarrayghostedin[i] = *iptr;
498*47c6ae99SBarry Smith         dd->adstartghostedin[i] = iarray_start;
499*47c6ae99SBarry Smith         break;
500*47c6ae99SBarry Smith       }
501*47c6ae99SBarry Smith     }
502*47c6ae99SBarry Smith   } else {
503*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
504*47c6ae99SBarry Smith       if (dd->adarrayout[i] == *iptr) {
505*47c6ae99SBarry Smith         iarray_start      = dd->adstartout[i];
506*47c6ae99SBarry Smith         dd->adarrayout[i] = PETSC_NULL;
507*47c6ae99SBarry Smith         dd->adstartout[i] = PETSC_NULL;
508*47c6ae99SBarry Smith         break;
509*47c6ae99SBarry Smith       }
510*47c6ae99SBarry Smith     }
511*47c6ae99SBarry Smith     if (!iarray_start) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Could not find array in checkout list");
512*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
513*47c6ae99SBarry Smith       if (!dd->adarrayin[i]){
514*47c6ae99SBarry Smith         dd->adarrayin[i]   = *iptr;
515*47c6ae99SBarry Smith         dd->adstartin[i]   = iarray_start;
516*47c6ae99SBarry Smith         break;
517*47c6ae99SBarry Smith       }
518*47c6ae99SBarry Smith     }
519*47c6ae99SBarry Smith   }
520*47c6ae99SBarry Smith   PetscFunctionReturn(0);
521*47c6ae99SBarry Smith }
522*47c6ae99SBarry Smith 
523*47c6ae99SBarry Smith #undef __FUNCT__
524*47c6ae99SBarry Smith #define __FUNCT__ "ad_DAGetArray"
525*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT ad_DAGetArray(DA da,PetscBool  ghosted,void *iptr)
526*47c6ae99SBarry Smith {
527*47c6ae99SBarry Smith   PetscErrorCode ierr;
528*47c6ae99SBarry Smith   PetscFunctionBegin;
529*47c6ae99SBarry Smith   ierr = DAGetAdicArray(da,ghosted,iptr,0,0);CHKERRQ(ierr);
530*47c6ae99SBarry Smith   PetscFunctionReturn(0);
531*47c6ae99SBarry Smith }
532*47c6ae99SBarry Smith 
533*47c6ae99SBarry Smith #undef __FUNCT__
534*47c6ae99SBarry Smith #define __FUNCT__ "ad_DARestoreArray"
535*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT ad_DARestoreArray(DA da,PetscBool  ghosted,void *iptr)
536*47c6ae99SBarry Smith {
537*47c6ae99SBarry Smith   PetscErrorCode ierr;
538*47c6ae99SBarry Smith   PetscFunctionBegin;
539*47c6ae99SBarry Smith   ierr = DARestoreAdicArray(da,ghosted,iptr,0,0);CHKERRQ(ierr);
540*47c6ae99SBarry Smith   PetscFunctionReturn(0);
541*47c6ae99SBarry Smith }
542*47c6ae99SBarry Smith 
543*47c6ae99SBarry Smith #endif
544*47c6ae99SBarry Smith 
545*47c6ae99SBarry Smith #undef __FUNCT__
546*47c6ae99SBarry Smith #define __FUNCT__ "DAGetArray"
547*47c6ae99SBarry Smith /*@C
548*47c6ae99SBarry Smith      DAGetArray - Gets a work array for a DA
549*47c6ae99SBarry Smith 
550*47c6ae99SBarry Smith     Input Parameter:
551*47c6ae99SBarry Smith +    da - information about my local patch
552*47c6ae99SBarry Smith -    ghosted - do you want arrays for the ghosted or nonghosted patch
553*47c6ae99SBarry Smith 
554*47c6ae99SBarry Smith     Output Parameters:
555*47c6ae99SBarry Smith .    vptr - array data structured
556*47c6ae99SBarry Smith 
557*47c6ae99SBarry Smith     Note:  The vector values are NOT initialized and may have garbage in them, so you may need
558*47c6ae99SBarry Smith            to zero them.
559*47c6ae99SBarry Smith 
560*47c6ae99SBarry Smith   Level: advanced
561*47c6ae99SBarry Smith 
562*47c6ae99SBarry Smith .seealso: DARestoreArray(), DAGetAdicArray()
563*47c6ae99SBarry Smith 
564*47c6ae99SBarry Smith @*/
565*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DAGetArray(DA da,PetscBool  ghosted,void *vptr)
566*47c6ae99SBarry Smith {
567*47c6ae99SBarry Smith   PetscErrorCode ierr;
568*47c6ae99SBarry Smith   PetscInt       j,i,xs,ys,xm,ym,zs,zm;
569*47c6ae99SBarry Smith   char           *iarray_start;
570*47c6ae99SBarry Smith   void           **iptr = (void**)vptr;
571*47c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
572*47c6ae99SBarry Smith 
573*47c6ae99SBarry Smith   PetscFunctionBegin;
574*47c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
575*47c6ae99SBarry Smith   if (ghosted) {
576*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_WORK_ARRAYS; i++) {
577*47c6ae99SBarry Smith       if (dd->arrayghostedin[i]) {
578*47c6ae99SBarry Smith         *iptr                 = dd->arrayghostedin[i];
579*47c6ae99SBarry Smith         iarray_start          = (char*)dd->startghostedin[i];
580*47c6ae99SBarry Smith         dd->arrayghostedin[i] = PETSC_NULL;
581*47c6ae99SBarry Smith         dd->startghostedin[i] = PETSC_NULL;
582*47c6ae99SBarry Smith 
583*47c6ae99SBarry Smith         goto done;
584*47c6ae99SBarry Smith       }
585*47c6ae99SBarry Smith     }
586*47c6ae99SBarry Smith     xs = dd->Xs;
587*47c6ae99SBarry Smith     ys = dd->Ys;
588*47c6ae99SBarry Smith     zs = dd->Zs;
589*47c6ae99SBarry Smith     xm = dd->Xe-dd->Xs;
590*47c6ae99SBarry Smith     ym = dd->Ye-dd->Ys;
591*47c6ae99SBarry Smith     zm = dd->Ze-dd->Zs;
592*47c6ae99SBarry Smith   } else {
593*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_WORK_ARRAYS; i++) {
594*47c6ae99SBarry Smith       if (dd->arrayin[i]) {
595*47c6ae99SBarry Smith         *iptr          = dd->arrayin[i];
596*47c6ae99SBarry Smith         iarray_start   = (char*)dd->startin[i];
597*47c6ae99SBarry Smith         dd->arrayin[i] = PETSC_NULL;
598*47c6ae99SBarry Smith         dd->startin[i] = PETSC_NULL;
599*47c6ae99SBarry Smith 
600*47c6ae99SBarry Smith         goto done;
601*47c6ae99SBarry Smith       }
602*47c6ae99SBarry Smith     }
603*47c6ae99SBarry Smith     xs = dd->xs;
604*47c6ae99SBarry Smith     ys = dd->ys;
605*47c6ae99SBarry Smith     zs = dd->zs;
606*47c6ae99SBarry Smith     xm = dd->xe-dd->xs;
607*47c6ae99SBarry Smith     ym = dd->ye-dd->ys;
608*47c6ae99SBarry Smith     zm = dd->ze-dd->zs;
609*47c6ae99SBarry Smith   }
610*47c6ae99SBarry Smith 
611*47c6ae99SBarry Smith   switch (dd->dim) {
612*47c6ae99SBarry Smith     case 1: {
613*47c6ae99SBarry Smith       void *ptr;
614*47c6ae99SBarry Smith 
615*47c6ae99SBarry Smith       ierr  = PetscMalloc(xm*sizeof(PetscScalar),&iarray_start);CHKERRQ(ierr);
616*47c6ae99SBarry Smith 
617*47c6ae99SBarry Smith       ptr   = (void*)(iarray_start - xs*sizeof(PetscScalar));
618*47c6ae99SBarry Smith       *iptr = (void*)ptr;
619*47c6ae99SBarry Smith       break;}
620*47c6ae99SBarry Smith     case 2: {
621*47c6ae99SBarry Smith       void **ptr;
622*47c6ae99SBarry Smith 
623*47c6ae99SBarry Smith       ierr  = PetscMalloc((ym+1)*sizeof(void*)+xm*ym*sizeof(PetscScalar),&iarray_start);CHKERRQ(ierr);
624*47c6ae99SBarry Smith 
625*47c6ae99SBarry Smith       ptr  = (void**)(iarray_start + xm*ym*sizeof(PetscScalar) - ys*sizeof(void*));
626*47c6ae99SBarry Smith       for(j=ys;j<ys+ym;j++) {
627*47c6ae99SBarry Smith         ptr[j] = iarray_start + sizeof(PetscScalar)*(xm*(j-ys) - xs);
628*47c6ae99SBarry Smith       }
629*47c6ae99SBarry Smith       *iptr = (void*)ptr;
630*47c6ae99SBarry Smith       break;}
631*47c6ae99SBarry Smith     case 3: {
632*47c6ae99SBarry Smith       void ***ptr,**bptr;
633*47c6ae99SBarry Smith 
634*47c6ae99SBarry Smith       ierr  = PetscMalloc((zm+1)*sizeof(void **)+(ym*zm+1)*sizeof(void*)+xm*ym*zm*sizeof(PetscScalar),&iarray_start);CHKERRQ(ierr);
635*47c6ae99SBarry Smith 
636*47c6ae99SBarry Smith       ptr  = (void***)(iarray_start + xm*ym*zm*sizeof(PetscScalar) - zs*sizeof(void*));
637*47c6ae99SBarry Smith       bptr = (void**)(iarray_start + xm*ym*zm*sizeof(PetscScalar) + zm*sizeof(void**));
638*47c6ae99SBarry Smith       for(i=zs;i<zs+zm;i++) {
639*47c6ae99SBarry Smith         ptr[i] = bptr + ((i-zs)*ym - ys);
640*47c6ae99SBarry Smith       }
641*47c6ae99SBarry Smith       for (i=zs; i<zs+zm; i++) {
642*47c6ae99SBarry Smith         for (j=ys; j<ys+ym; j++) {
643*47c6ae99SBarry Smith           ptr[i][j] = iarray_start + sizeof(PetscScalar)*(xm*ym*(i-zs) + xm*(j-ys) - xs);
644*47c6ae99SBarry Smith         }
645*47c6ae99SBarry Smith       }
646*47c6ae99SBarry Smith 
647*47c6ae99SBarry Smith       *iptr = (void*)ptr;
648*47c6ae99SBarry Smith       break;}
649*47c6ae99SBarry Smith     default:
650*47c6ae99SBarry Smith       SETERRQ1(((PetscObject)da)->comm,PETSC_ERR_SUP,"Dimension %D not supported",dd->dim);
651*47c6ae99SBarry Smith   }
652*47c6ae99SBarry Smith 
653*47c6ae99SBarry Smith   done:
654*47c6ae99SBarry Smith   /* add arrays to the checked out list */
655*47c6ae99SBarry Smith   if (ghosted) {
656*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_WORK_ARRAYS; i++) {
657*47c6ae99SBarry Smith       if (!dd->arrayghostedout[i]) {
658*47c6ae99SBarry Smith         dd->arrayghostedout[i] = *iptr ;
659*47c6ae99SBarry Smith         dd->startghostedout[i] = iarray_start;
660*47c6ae99SBarry Smith         break;
661*47c6ae99SBarry Smith       }
662*47c6ae99SBarry Smith     }
663*47c6ae99SBarry Smith   } else {
664*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_WORK_ARRAYS; i++) {
665*47c6ae99SBarry Smith       if (!dd->arrayout[i]) {
666*47c6ae99SBarry Smith         dd->arrayout[i] = *iptr ;
667*47c6ae99SBarry Smith         dd->startout[i] = iarray_start;
668*47c6ae99SBarry Smith         break;
669*47c6ae99SBarry Smith       }
670*47c6ae99SBarry Smith     }
671*47c6ae99SBarry Smith   }
672*47c6ae99SBarry Smith   PetscFunctionReturn(0);
673*47c6ae99SBarry Smith }
674*47c6ae99SBarry Smith 
675*47c6ae99SBarry Smith #undef __FUNCT__
676*47c6ae99SBarry Smith #define __FUNCT__ "DARestoreArray"
677*47c6ae99SBarry Smith /*@C
678*47c6ae99SBarry Smith      DARestoreArray - Restores an array of derivative types for a DA
679*47c6ae99SBarry Smith 
680*47c6ae99SBarry Smith     Input Parameter:
681*47c6ae99SBarry Smith +    da - information about my local patch
682*47c6ae99SBarry Smith .    ghosted - do you want arrays for the ghosted or nonghosted patch
683*47c6ae99SBarry Smith -    vptr - array data structured to be passed to ad_FormFunctionLocal()
684*47c6ae99SBarry Smith 
685*47c6ae99SBarry Smith      Level: advanced
686*47c6ae99SBarry Smith 
687*47c6ae99SBarry Smith .seealso: DAGetArray(), DAGetAdicArray()
688*47c6ae99SBarry Smith 
689*47c6ae99SBarry Smith @*/
690*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DARestoreArray(DA da,PetscBool  ghosted,void *vptr)
691*47c6ae99SBarry Smith {
692*47c6ae99SBarry Smith   PetscInt  i;
693*47c6ae99SBarry Smith   void      **iptr = (void**)vptr,*iarray_start = 0;
694*47c6ae99SBarry Smith   DM_DA     *dd = (DM_DA*)da->data;
695*47c6ae99SBarry Smith 
696*47c6ae99SBarry Smith   PetscFunctionBegin;
697*47c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
698*47c6ae99SBarry Smith   if (ghosted) {
699*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_WORK_ARRAYS; i++) {
700*47c6ae99SBarry Smith       if (dd->arrayghostedout[i] == *iptr) {
701*47c6ae99SBarry Smith         iarray_start           = dd->startghostedout[i];
702*47c6ae99SBarry Smith         dd->arrayghostedout[i] = PETSC_NULL;
703*47c6ae99SBarry Smith         dd->startghostedout[i] = PETSC_NULL;
704*47c6ae99SBarry Smith         break;
705*47c6ae99SBarry Smith       }
706*47c6ae99SBarry Smith     }
707*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_WORK_ARRAYS; i++) {
708*47c6ae99SBarry Smith       if (!dd->arrayghostedin[i]){
709*47c6ae99SBarry Smith         dd->arrayghostedin[i] = *iptr;
710*47c6ae99SBarry Smith         dd->startghostedin[i] = iarray_start;
711*47c6ae99SBarry Smith         break;
712*47c6ae99SBarry Smith       }
713*47c6ae99SBarry Smith     }
714*47c6ae99SBarry Smith   } else {
715*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_WORK_ARRAYS; i++) {
716*47c6ae99SBarry Smith       if (dd->arrayout[i] == *iptr) {
717*47c6ae99SBarry Smith         iarray_start    = dd->startout[i];
718*47c6ae99SBarry Smith         dd->arrayout[i] = PETSC_NULL;
719*47c6ae99SBarry Smith         dd->startout[i] = PETSC_NULL;
720*47c6ae99SBarry Smith         break;
721*47c6ae99SBarry Smith       }
722*47c6ae99SBarry Smith     }
723*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_WORK_ARRAYS; i++) {
724*47c6ae99SBarry Smith       if (!dd->arrayin[i]){
725*47c6ae99SBarry Smith         dd->arrayin[i]  = *iptr;
726*47c6ae99SBarry Smith         dd->startin[i]  = iarray_start;
727*47c6ae99SBarry Smith         break;
728*47c6ae99SBarry Smith       }
729*47c6ae99SBarry Smith     }
730*47c6ae99SBarry Smith   }
731*47c6ae99SBarry Smith   PetscFunctionReturn(0);
732*47c6ae99SBarry Smith }
733*47c6ae99SBarry Smith 
734*47c6ae99SBarry Smith #undef __FUNCT__
735*47c6ae99SBarry Smith #define __FUNCT__ "DAGetAdicMFArray"
736*47c6ae99SBarry Smith /*@C
737*47c6ae99SBarry Smith      DAGetAdicMFArray - Gets an array of derivative types for a DA for matrix-free ADIC.
738*47c6ae99SBarry Smith 
739*47c6ae99SBarry Smith      Input Parameter:
740*47c6ae99SBarry Smith +    da - information about my local patch
741*47c6ae99SBarry Smith -    ghosted - do you want arrays for the ghosted or nonghosted patch?
742*47c6ae99SBarry Smith 
743*47c6ae99SBarry Smith      Output Parameters:
744*47c6ae99SBarry Smith +    vptr - array data structured to be passed to ad_FormFunctionLocal()
745*47c6ae99SBarry Smith .    array_start - actual start of 1d array of all values that adiC can access directly (may be null)
746*47c6ae99SBarry Smith -    tdof - total number of degrees of freedom represented in array_start (may be null)
747*47c6ae99SBarry Smith 
748*47c6ae99SBarry Smith      Notes:
749*47c6ae99SBarry Smith      The vector values are NOT initialized and may have garbage in them, so you may need
750*47c6ae99SBarry Smith      to zero them.
751*47c6ae99SBarry Smith 
752*47c6ae99SBarry Smith      This routine returns the same type of object as the DAVecGetArray(), except its
753*47c6ae99SBarry Smith      elements are derivative types instead of PetscScalars.
754*47c6ae99SBarry Smith 
755*47c6ae99SBarry Smith      Level: advanced
756*47c6ae99SBarry Smith 
757*47c6ae99SBarry Smith .seealso: DARestoreAdicMFArray(), DAGetArray(), DAGetAdicArray()
758*47c6ae99SBarry Smith 
759*47c6ae99SBarry Smith @*/
760*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DAGetAdicMFArray(DA da,PetscBool  ghosted,void *vptr,void *array_start,PetscInt *tdof)
761*47c6ae99SBarry Smith {
762*47c6ae99SBarry Smith   PetscErrorCode ierr;
763*47c6ae99SBarry Smith   PetscInt       j,i,xs,ys,xm,ym,zs,zm,itdof = 0;
764*47c6ae99SBarry Smith   char           *iarray_start;
765*47c6ae99SBarry Smith   void           **iptr = (void**)vptr;
766*47c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
767*47c6ae99SBarry Smith 
768*47c6ae99SBarry Smith   PetscFunctionBegin;
769*47c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
770*47c6ae99SBarry Smith   if (ghosted) {
771*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
772*47c6ae99SBarry Smith       if (dd->admfarrayghostedin[i]) {
773*47c6ae99SBarry Smith         *iptr                     = dd->admfarrayghostedin[i];
774*47c6ae99SBarry Smith         iarray_start              = (char*)dd->admfstartghostedin[i];
775*47c6ae99SBarry Smith         itdof                     = dd->ghostedtdof;
776*47c6ae99SBarry Smith         dd->admfarrayghostedin[i] = PETSC_NULL;
777*47c6ae99SBarry Smith         dd->admfstartghostedin[i] = PETSC_NULL;
778*47c6ae99SBarry Smith 
779*47c6ae99SBarry Smith         goto done;
780*47c6ae99SBarry Smith       }
781*47c6ae99SBarry Smith     }
782*47c6ae99SBarry Smith     xs = dd->Xs;
783*47c6ae99SBarry Smith     ys = dd->Ys;
784*47c6ae99SBarry Smith     zs = dd->Zs;
785*47c6ae99SBarry Smith     xm = dd->Xe-dd->Xs;
786*47c6ae99SBarry Smith     ym = dd->Ye-dd->Ys;
787*47c6ae99SBarry Smith     zm = dd->Ze-dd->Zs;
788*47c6ae99SBarry Smith   } else {
789*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
790*47c6ae99SBarry Smith       if (dd->admfarrayin[i]) {
791*47c6ae99SBarry Smith         *iptr              = dd->admfarrayin[i];
792*47c6ae99SBarry Smith         iarray_start       = (char*)dd->admfstartin[i];
793*47c6ae99SBarry Smith         itdof              = dd->tdof;
794*47c6ae99SBarry Smith         dd->admfarrayin[i] = PETSC_NULL;
795*47c6ae99SBarry Smith         dd->admfstartin[i] = PETSC_NULL;
796*47c6ae99SBarry Smith 
797*47c6ae99SBarry Smith         goto done;
798*47c6ae99SBarry Smith       }
799*47c6ae99SBarry Smith     }
800*47c6ae99SBarry Smith     xs = dd->xs;
801*47c6ae99SBarry Smith     ys = dd->ys;
802*47c6ae99SBarry Smith     zs = dd->zs;
803*47c6ae99SBarry Smith     xm = dd->xe-dd->xs;
804*47c6ae99SBarry Smith     ym = dd->ye-dd->ys;
805*47c6ae99SBarry Smith     zm = dd->ze-dd->zs;
806*47c6ae99SBarry Smith   }
807*47c6ae99SBarry Smith 
808*47c6ae99SBarry Smith   switch (dd->dim) {
809*47c6ae99SBarry Smith     case 1: {
810*47c6ae99SBarry Smith       void *ptr;
811*47c6ae99SBarry Smith       itdof = xm;
812*47c6ae99SBarry Smith 
813*47c6ae99SBarry Smith       ierr  = PetscMalloc(xm*2*sizeof(PetscScalar),&iarray_start);CHKERRQ(ierr);
814*47c6ae99SBarry Smith 
815*47c6ae99SBarry Smith       ptr   = (void*)(iarray_start - xs*2*sizeof(PetscScalar));
816*47c6ae99SBarry Smith       *iptr = (void*)ptr;
817*47c6ae99SBarry Smith       break;}
818*47c6ae99SBarry Smith     case 2: {
819*47c6ae99SBarry Smith       void **ptr;
820*47c6ae99SBarry Smith       itdof = xm*ym;
821*47c6ae99SBarry Smith 
822*47c6ae99SBarry Smith       ierr  = PetscMalloc((ym+1)*sizeof(void*)+xm*ym*2*sizeof(PetscScalar),&iarray_start);CHKERRQ(ierr);
823*47c6ae99SBarry Smith 
824*47c6ae99SBarry Smith       ptr  = (void**)(iarray_start + xm*ym*2*sizeof(PetscScalar) - ys*sizeof(void*));
825*47c6ae99SBarry Smith       for(j=ys;j<ys+ym;j++) {
826*47c6ae99SBarry Smith         ptr[j] = iarray_start + 2*sizeof(PetscScalar)*(xm*(j-ys) - xs);
827*47c6ae99SBarry Smith       }
828*47c6ae99SBarry Smith       *iptr = (void*)ptr;
829*47c6ae99SBarry Smith       break;}
830*47c6ae99SBarry Smith     case 3: {
831*47c6ae99SBarry Smith       void ***ptr,**bptr;
832*47c6ae99SBarry Smith       itdof = xm*ym*zm;
833*47c6ae99SBarry Smith 
834*47c6ae99SBarry Smith       ierr  = PetscMalloc((zm+1)*sizeof(void **)+(ym*zm+1)*sizeof(void*)+xm*ym*zm*2*sizeof(PetscScalar),&iarray_start);CHKERRQ(ierr);
835*47c6ae99SBarry Smith 
836*47c6ae99SBarry Smith       ptr  = (void***)(iarray_start + xm*ym*zm*2*sizeof(PetscScalar) - zs*sizeof(void*));
837*47c6ae99SBarry Smith       bptr = (void**)(iarray_start + xm*ym*zm*2*sizeof(PetscScalar) + zm*sizeof(void**));
838*47c6ae99SBarry Smith       for(i=zs;i<zs+zm;i++) {
839*47c6ae99SBarry Smith         ptr[i] = bptr + ((i-zs)*ym* - ys)*sizeof(void*);
840*47c6ae99SBarry Smith       }
841*47c6ae99SBarry Smith       for (i=zs; i<zs+zm; i++) {
842*47c6ae99SBarry Smith         for (j=ys; j<ys+ym; j++) {
843*47c6ae99SBarry Smith           ptr[i][j] = iarray_start + 2*sizeof(PetscScalar)*(xm*ym*(i-zs) + xm*(j-ys) - xs);
844*47c6ae99SBarry Smith         }
845*47c6ae99SBarry Smith       }
846*47c6ae99SBarry Smith 
847*47c6ae99SBarry Smith       *iptr = (void*)ptr;
848*47c6ae99SBarry Smith       break;}
849*47c6ae99SBarry Smith     default:
850*47c6ae99SBarry Smith       SETERRQ1(((PetscObject)da)->comm,PETSC_ERR_SUP,"Dimension %D not supported",dd->dim);
851*47c6ae99SBarry Smith   }
852*47c6ae99SBarry Smith 
853*47c6ae99SBarry Smith   done:
854*47c6ae99SBarry Smith   /* add arrays to the checked out list */
855*47c6ae99SBarry Smith   if (ghosted) {
856*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
857*47c6ae99SBarry Smith       if (!dd->admfarrayghostedout[i]) {
858*47c6ae99SBarry Smith         dd->admfarrayghostedout[i] = *iptr ;
859*47c6ae99SBarry Smith         dd->admfstartghostedout[i] = iarray_start;
860*47c6ae99SBarry Smith         dd->ghostedtdof            = itdof;
861*47c6ae99SBarry Smith         break;
862*47c6ae99SBarry Smith       }
863*47c6ae99SBarry Smith     }
864*47c6ae99SBarry Smith   } else {
865*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
866*47c6ae99SBarry Smith       if (!dd->admfarrayout[i]) {
867*47c6ae99SBarry Smith         dd->admfarrayout[i] = *iptr ;
868*47c6ae99SBarry Smith         dd->admfstartout[i] = iarray_start;
869*47c6ae99SBarry Smith         dd->tdof            = itdof;
870*47c6ae99SBarry Smith         break;
871*47c6ae99SBarry Smith       }
872*47c6ae99SBarry Smith     }
873*47c6ae99SBarry Smith   }
874*47c6ae99SBarry Smith   if (i == DA_MAX_AD_ARRAYS+1) SETERRQ(((PetscObject)da)->comm,PETSC_ERR_ARG_WRONG,"Too many DA ADIC arrays obtained");
875*47c6ae99SBarry Smith   if (tdof)        *tdof = itdof;
876*47c6ae99SBarry Smith   if (array_start) *(void**)array_start = iarray_start;
877*47c6ae99SBarry Smith   PetscFunctionReturn(0);
878*47c6ae99SBarry Smith }
879*47c6ae99SBarry Smith 
880*47c6ae99SBarry Smith #undef __FUNCT__
881*47c6ae99SBarry Smith #define __FUNCT__ "DAGetAdicMFArray4"
882*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DAGetAdicMFArray4(DA da,PetscBool  ghosted,void *vptr,void *array_start,PetscInt *tdof)
883*47c6ae99SBarry Smith {
884*47c6ae99SBarry Smith   PetscErrorCode ierr;
885*47c6ae99SBarry Smith   PetscInt       j,i,xs,ys,xm,ym,zs,zm,itdof = 0;
886*47c6ae99SBarry Smith   char           *iarray_start;
887*47c6ae99SBarry Smith   void           **iptr = (void**)vptr;
888*47c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
889*47c6ae99SBarry Smith 
890*47c6ae99SBarry Smith   PetscFunctionBegin;
891*47c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
892*47c6ae99SBarry Smith   if (ghosted) {
893*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
894*47c6ae99SBarry Smith       if (dd->admfarrayghostedin[i]) {
895*47c6ae99SBarry Smith         *iptr                     = dd->admfarrayghostedin[i];
896*47c6ae99SBarry Smith         iarray_start              = (char*)dd->admfstartghostedin[i];
897*47c6ae99SBarry Smith         itdof                     = dd->ghostedtdof;
898*47c6ae99SBarry Smith         dd->admfarrayghostedin[i] = PETSC_NULL;
899*47c6ae99SBarry Smith         dd->admfstartghostedin[i] = PETSC_NULL;
900*47c6ae99SBarry Smith 
901*47c6ae99SBarry Smith         goto done;
902*47c6ae99SBarry Smith       }
903*47c6ae99SBarry Smith     }
904*47c6ae99SBarry Smith     xs = dd->Xs;
905*47c6ae99SBarry Smith     ys = dd->Ys;
906*47c6ae99SBarry Smith     zs = dd->Zs;
907*47c6ae99SBarry Smith     xm = dd->Xe-dd->Xs;
908*47c6ae99SBarry Smith     ym = dd->Ye-dd->Ys;
909*47c6ae99SBarry Smith     zm = dd->Ze-dd->Zs;
910*47c6ae99SBarry Smith   } else {
911*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
912*47c6ae99SBarry Smith       if (dd->admfarrayin[i]) {
913*47c6ae99SBarry Smith         *iptr              = dd->admfarrayin[i];
914*47c6ae99SBarry Smith         iarray_start       = (char*)dd->admfstartin[i];
915*47c6ae99SBarry Smith         itdof              = dd->tdof;
916*47c6ae99SBarry Smith         dd->admfarrayin[i] = PETSC_NULL;
917*47c6ae99SBarry Smith         dd->admfstartin[i] = PETSC_NULL;
918*47c6ae99SBarry Smith 
919*47c6ae99SBarry Smith         goto done;
920*47c6ae99SBarry Smith       }
921*47c6ae99SBarry Smith     }
922*47c6ae99SBarry Smith     xs = dd->xs;
923*47c6ae99SBarry Smith     ys = dd->ys;
924*47c6ae99SBarry Smith     zs = dd->zs;
925*47c6ae99SBarry Smith     xm = dd->xe-dd->xs;
926*47c6ae99SBarry Smith     ym = dd->ye-dd->ys;
927*47c6ae99SBarry Smith     zm = dd->ze-dd->zs;
928*47c6ae99SBarry Smith   }
929*47c6ae99SBarry Smith 
930*47c6ae99SBarry Smith   switch (dd->dim) {
931*47c6ae99SBarry Smith     case 2: {
932*47c6ae99SBarry Smith       void **ptr;
933*47c6ae99SBarry Smith       itdof = xm*ym;
934*47c6ae99SBarry Smith 
935*47c6ae99SBarry Smith       ierr  = PetscMalloc((ym+1)*sizeof(void*)+xm*ym*5*sizeof(PetscScalar),&iarray_start);CHKERRQ(ierr);
936*47c6ae99SBarry Smith 
937*47c6ae99SBarry Smith       ptr  = (void**)(iarray_start + xm*ym*5*sizeof(PetscScalar) - ys*sizeof(void*));
938*47c6ae99SBarry Smith       for(j=ys;j<ys+ym;j++) {
939*47c6ae99SBarry Smith         ptr[j] = iarray_start + 5*sizeof(PetscScalar)*(xm*(j-ys) - xs);
940*47c6ae99SBarry Smith       }
941*47c6ae99SBarry Smith       *iptr = (void*)ptr;
942*47c6ae99SBarry Smith       break;}
943*47c6ae99SBarry Smith     default:
944*47c6ae99SBarry Smith       SETERRQ1(((PetscObject)da)->comm,PETSC_ERR_SUP,"Dimension %D not supported",dd->dim);
945*47c6ae99SBarry Smith   }
946*47c6ae99SBarry Smith 
947*47c6ae99SBarry Smith   done:
948*47c6ae99SBarry Smith   /* add arrays to the checked out list */
949*47c6ae99SBarry Smith   if (ghosted) {
950*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
951*47c6ae99SBarry Smith       if (!dd->admfarrayghostedout[i]) {
952*47c6ae99SBarry Smith         dd->admfarrayghostedout[i] = *iptr ;
953*47c6ae99SBarry Smith         dd->admfstartghostedout[i] = iarray_start;
954*47c6ae99SBarry Smith         dd->ghostedtdof            = itdof;
955*47c6ae99SBarry Smith         break;
956*47c6ae99SBarry Smith       }
957*47c6ae99SBarry Smith     }
958*47c6ae99SBarry Smith   } else {
959*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
960*47c6ae99SBarry Smith       if (!dd->admfarrayout[i]) {
961*47c6ae99SBarry Smith         dd->admfarrayout[i] = *iptr ;
962*47c6ae99SBarry Smith         dd->admfstartout[i] = iarray_start;
963*47c6ae99SBarry Smith         dd->tdof            = itdof;
964*47c6ae99SBarry Smith         break;
965*47c6ae99SBarry Smith       }
966*47c6ae99SBarry Smith     }
967*47c6ae99SBarry Smith   }
968*47c6ae99SBarry Smith   if (i == DA_MAX_AD_ARRAYS+1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Too many DA ADIC arrays obtained");
969*47c6ae99SBarry Smith   if (tdof)        *tdof = itdof;
970*47c6ae99SBarry Smith   if (array_start) *(void**)array_start = iarray_start;
971*47c6ae99SBarry Smith   PetscFunctionReturn(0);
972*47c6ae99SBarry Smith }
973*47c6ae99SBarry Smith 
974*47c6ae99SBarry Smith #undef __FUNCT__
975*47c6ae99SBarry Smith #define __FUNCT__ "DAGetAdicMFArray9"
976*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DAGetAdicMFArray9(DA da,PetscBool  ghosted,void *vptr,void *array_start,PetscInt *tdof)
977*47c6ae99SBarry Smith {
978*47c6ae99SBarry Smith   PetscErrorCode ierr;
979*47c6ae99SBarry Smith   PetscInt       j,i,xs,ys,xm,ym,zs,zm,itdof = 0;
980*47c6ae99SBarry Smith   char           *iarray_start;
981*47c6ae99SBarry Smith   void           **iptr = (void**)vptr;
982*47c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
983*47c6ae99SBarry Smith 
984*47c6ae99SBarry Smith   PetscFunctionBegin;
985*47c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
986*47c6ae99SBarry Smith   if (ghosted) {
987*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
988*47c6ae99SBarry Smith       if (dd->admfarrayghostedin[i]) {
989*47c6ae99SBarry Smith         *iptr                     = dd->admfarrayghostedin[i];
990*47c6ae99SBarry Smith         iarray_start              = (char*)dd->admfstartghostedin[i];
991*47c6ae99SBarry Smith         itdof                     = dd->ghostedtdof;
992*47c6ae99SBarry Smith         dd->admfarrayghostedin[i] = PETSC_NULL;
993*47c6ae99SBarry Smith         dd->admfstartghostedin[i] = PETSC_NULL;
994*47c6ae99SBarry Smith 
995*47c6ae99SBarry Smith         goto done;
996*47c6ae99SBarry Smith       }
997*47c6ae99SBarry Smith     }
998*47c6ae99SBarry Smith     xs = dd->Xs;
999*47c6ae99SBarry Smith     ys = dd->Ys;
1000*47c6ae99SBarry Smith     zs = dd->Zs;
1001*47c6ae99SBarry Smith     xm = dd->Xe-dd->Xs;
1002*47c6ae99SBarry Smith     ym = dd->Ye-dd->Ys;
1003*47c6ae99SBarry Smith     zm = dd->Ze-dd->Zs;
1004*47c6ae99SBarry Smith   } else {
1005*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
1006*47c6ae99SBarry Smith       if (dd->admfarrayin[i]) {
1007*47c6ae99SBarry Smith         *iptr              = dd->admfarrayin[i];
1008*47c6ae99SBarry Smith         iarray_start       = (char*)dd->admfstartin[i];
1009*47c6ae99SBarry Smith         itdof              = dd->tdof;
1010*47c6ae99SBarry Smith         dd->admfarrayin[i] = PETSC_NULL;
1011*47c6ae99SBarry Smith         dd->admfstartin[i] = PETSC_NULL;
1012*47c6ae99SBarry Smith 
1013*47c6ae99SBarry Smith         goto done;
1014*47c6ae99SBarry Smith       }
1015*47c6ae99SBarry Smith     }
1016*47c6ae99SBarry Smith     xs = dd->xs;
1017*47c6ae99SBarry Smith     ys = dd->ys;
1018*47c6ae99SBarry Smith     zs = dd->zs;
1019*47c6ae99SBarry Smith     xm = dd->xe-dd->xs;
1020*47c6ae99SBarry Smith     ym = dd->ye-dd->ys;
1021*47c6ae99SBarry Smith     zm = dd->ze-dd->zs;
1022*47c6ae99SBarry Smith   }
1023*47c6ae99SBarry Smith 
1024*47c6ae99SBarry Smith   switch (dd->dim) {
1025*47c6ae99SBarry Smith     case 2: {
1026*47c6ae99SBarry Smith       void **ptr;
1027*47c6ae99SBarry Smith       itdof = xm*ym;
1028*47c6ae99SBarry Smith 
1029*47c6ae99SBarry Smith       ierr  = PetscMalloc((ym+1)*sizeof(void*)+xm*ym*10*sizeof(PetscScalar),&iarray_start);CHKERRQ(ierr);
1030*47c6ae99SBarry Smith 
1031*47c6ae99SBarry Smith       ptr  = (void**)(iarray_start + xm*ym*10*sizeof(PetscScalar) - ys*sizeof(void*));
1032*47c6ae99SBarry Smith       for(j=ys;j<ys+ym;j++) {
1033*47c6ae99SBarry Smith         ptr[j] = iarray_start + 10*sizeof(PetscScalar)*(xm*(j-ys) - xs);
1034*47c6ae99SBarry Smith       }
1035*47c6ae99SBarry Smith       *iptr = (void*)ptr;
1036*47c6ae99SBarry Smith       break;}
1037*47c6ae99SBarry Smith     default:
1038*47c6ae99SBarry Smith       SETERRQ1(((PetscObject)da)->comm,PETSC_ERR_SUP,"Dimension %D not supported",dd->dim);
1039*47c6ae99SBarry Smith   }
1040*47c6ae99SBarry Smith 
1041*47c6ae99SBarry Smith   done:
1042*47c6ae99SBarry Smith   /* add arrays to the checked out list */
1043*47c6ae99SBarry Smith   if (ghosted) {
1044*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
1045*47c6ae99SBarry Smith       if (!dd->admfarrayghostedout[i]) {
1046*47c6ae99SBarry Smith         dd->admfarrayghostedout[i] = *iptr ;
1047*47c6ae99SBarry Smith         dd->admfstartghostedout[i] = iarray_start;
1048*47c6ae99SBarry Smith         dd->ghostedtdof            = itdof;
1049*47c6ae99SBarry Smith         break;
1050*47c6ae99SBarry Smith       }
1051*47c6ae99SBarry Smith     }
1052*47c6ae99SBarry Smith   } else {
1053*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
1054*47c6ae99SBarry Smith       if (!dd->admfarrayout[i]) {
1055*47c6ae99SBarry Smith         dd->admfarrayout[i] = *iptr ;
1056*47c6ae99SBarry Smith         dd->admfstartout[i] = iarray_start;
1057*47c6ae99SBarry Smith         dd->tdof            = itdof;
1058*47c6ae99SBarry Smith         break;
1059*47c6ae99SBarry Smith       }
1060*47c6ae99SBarry Smith     }
1061*47c6ae99SBarry Smith   }
1062*47c6ae99SBarry Smith   if (i == DA_MAX_AD_ARRAYS+1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Too many DA ADIC arrays obtained");
1063*47c6ae99SBarry Smith   if (tdof)        *tdof = itdof;
1064*47c6ae99SBarry Smith   if (array_start) *(void**)array_start = iarray_start;
1065*47c6ae99SBarry Smith   PetscFunctionReturn(0);
1066*47c6ae99SBarry Smith }
1067*47c6ae99SBarry Smith 
1068*47c6ae99SBarry Smith #undef __FUNCT__
1069*47c6ae99SBarry Smith #define __FUNCT__ "DAGetAdicMFArrayb"
1070*47c6ae99SBarry Smith /*@C
1071*47c6ae99SBarry Smith      DAGetAdicMFArrayb - Gets an array of derivative types for a DA for matrix-free ADIC.
1072*47c6ae99SBarry Smith 
1073*47c6ae99SBarry Smith      Input Parameter:
1074*47c6ae99SBarry Smith +    da - information about my local patch
1075*47c6ae99SBarry Smith -    ghosted - do you want arrays for the ghosted or nonghosted patch?
1076*47c6ae99SBarry Smith 
1077*47c6ae99SBarry Smith      Output Parameters:
1078*47c6ae99SBarry Smith +    vptr - array data structured to be passed to ad_FormFunctionLocal()
1079*47c6ae99SBarry Smith .    array_start - actual start of 1d array of all values that adiC can access directly (may be null)
1080*47c6ae99SBarry Smith -    tdof - total number of degrees of freedom represented in array_start (may be null)
1081*47c6ae99SBarry Smith 
1082*47c6ae99SBarry Smith      Notes:
1083*47c6ae99SBarry Smith      The vector values are NOT initialized and may have garbage in them, so you may need
1084*47c6ae99SBarry Smith      to zero them.
1085*47c6ae99SBarry Smith 
1086*47c6ae99SBarry Smith      This routine returns the same type of object as the DAVecGetArray(), except its
1087*47c6ae99SBarry Smith      elements are derivative types instead of PetscScalars.
1088*47c6ae99SBarry Smith 
1089*47c6ae99SBarry Smith      Level: advanced
1090*47c6ae99SBarry Smith 
1091*47c6ae99SBarry Smith .seealso: DARestoreAdicMFArray(), DAGetArray(), DAGetAdicArray()
1092*47c6ae99SBarry Smith 
1093*47c6ae99SBarry Smith @*/
1094*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DAGetAdicMFArrayb(DA da,PetscBool  ghosted,void *vptr,void *array_start,PetscInt *tdof)
1095*47c6ae99SBarry Smith {
1096*47c6ae99SBarry Smith   PetscErrorCode ierr;
1097*47c6ae99SBarry Smith   PetscInt       j,i,xs,ys,xm,ym,zs,zm,itdof = 0;
1098*47c6ae99SBarry Smith   char           *iarray_start;
1099*47c6ae99SBarry Smith   void           **iptr = (void**)vptr;
1100*47c6ae99SBarry Smith   DM_DA          *dd = (DM_DA*)da->data;
1101*47c6ae99SBarry Smith   PetscInt       bs = dd->w,bs1 = bs+1;
1102*47c6ae99SBarry Smith 
1103*47c6ae99SBarry Smith   PetscFunctionBegin;
1104*47c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
1105*47c6ae99SBarry Smith   if (ghosted) {
1106*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
1107*47c6ae99SBarry Smith       if (dd->admfarrayghostedin[i]) {
1108*47c6ae99SBarry Smith         *iptr                     = dd->admfarrayghostedin[i];
1109*47c6ae99SBarry Smith         iarray_start              = (char*)dd->admfstartghostedin[i];
1110*47c6ae99SBarry Smith         itdof                     = dd->ghostedtdof;
1111*47c6ae99SBarry Smith         dd->admfarrayghostedin[i] = PETSC_NULL;
1112*47c6ae99SBarry Smith         dd->admfstartghostedin[i] = PETSC_NULL;
1113*47c6ae99SBarry Smith 
1114*47c6ae99SBarry Smith         goto done;
1115*47c6ae99SBarry Smith       }
1116*47c6ae99SBarry Smith     }
1117*47c6ae99SBarry Smith     xs = dd->Xs;
1118*47c6ae99SBarry Smith     ys = dd->Ys;
1119*47c6ae99SBarry Smith     zs = dd->Zs;
1120*47c6ae99SBarry Smith     xm = dd->Xe-dd->Xs;
1121*47c6ae99SBarry Smith     ym = dd->Ye-dd->Ys;
1122*47c6ae99SBarry Smith     zm = dd->Ze-dd->Zs;
1123*47c6ae99SBarry Smith   } else {
1124*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
1125*47c6ae99SBarry Smith       if (dd->admfarrayin[i]) {
1126*47c6ae99SBarry Smith         *iptr              = dd->admfarrayin[i];
1127*47c6ae99SBarry Smith         iarray_start       = (char*)dd->admfstartin[i];
1128*47c6ae99SBarry Smith         itdof              = dd->tdof;
1129*47c6ae99SBarry Smith         dd->admfarrayin[i] = PETSC_NULL;
1130*47c6ae99SBarry Smith         dd->admfstartin[i] = PETSC_NULL;
1131*47c6ae99SBarry Smith 
1132*47c6ae99SBarry Smith         goto done;
1133*47c6ae99SBarry Smith       }
1134*47c6ae99SBarry Smith     }
1135*47c6ae99SBarry Smith     xs = dd->xs;
1136*47c6ae99SBarry Smith     ys = dd->ys;
1137*47c6ae99SBarry Smith     zs = dd->zs;
1138*47c6ae99SBarry Smith     xm = dd->xe-dd->xs;
1139*47c6ae99SBarry Smith     ym = dd->ye-dd->ys;
1140*47c6ae99SBarry Smith     zm = dd->ze-dd->zs;
1141*47c6ae99SBarry Smith   }
1142*47c6ae99SBarry Smith 
1143*47c6ae99SBarry Smith   switch (dd->dim) {
1144*47c6ae99SBarry Smith     case 1: {
1145*47c6ae99SBarry Smith       void *ptr;
1146*47c6ae99SBarry Smith       itdof = xm;
1147*47c6ae99SBarry Smith 
1148*47c6ae99SBarry Smith       ierr  = PetscMalloc(xm*bs1*sizeof(PetscScalar),&iarray_start);CHKERRQ(ierr);
1149*47c6ae99SBarry Smith 
1150*47c6ae99SBarry Smith       ptr   = (void*)(iarray_start - xs*bs1*sizeof(PetscScalar));
1151*47c6ae99SBarry Smith       *iptr = (void*)ptr;
1152*47c6ae99SBarry Smith       break;}
1153*47c6ae99SBarry Smith     case 2: {
1154*47c6ae99SBarry Smith       void **ptr;
1155*47c6ae99SBarry Smith       itdof = xm*ym;
1156*47c6ae99SBarry Smith 
1157*47c6ae99SBarry Smith       ierr  = PetscMalloc((ym+1)*sizeof(void*)+xm*ym*bs1*sizeof(PetscScalar),&iarray_start);CHKERRQ(ierr);
1158*47c6ae99SBarry Smith 
1159*47c6ae99SBarry Smith       ptr  = (void**)(iarray_start + xm*ym*bs1*sizeof(PetscScalar) - ys*sizeof(void*));
1160*47c6ae99SBarry Smith       for(j=ys;j<ys+ym;j++) {
1161*47c6ae99SBarry Smith         ptr[j] = iarray_start + bs1*sizeof(PetscScalar)*(xm*(j-ys) - xs);
1162*47c6ae99SBarry Smith       }
1163*47c6ae99SBarry Smith       *iptr = (void*)ptr;
1164*47c6ae99SBarry Smith       break;}
1165*47c6ae99SBarry Smith     case 3: {
1166*47c6ae99SBarry Smith       void ***ptr,**bptr;
1167*47c6ae99SBarry Smith       itdof = xm*ym*zm;
1168*47c6ae99SBarry Smith 
1169*47c6ae99SBarry Smith       ierr  = PetscMalloc((zm+1)*sizeof(void **)+(ym*zm+1)*sizeof(void*)+xm*ym*zm*bs1*sizeof(PetscScalar),&iarray_start);CHKERRQ(ierr);
1170*47c6ae99SBarry Smith 
1171*47c6ae99SBarry Smith       ptr  = (void***)(iarray_start + xm*ym*zm*2*sizeof(PetscScalar) - zs*sizeof(void*));
1172*47c6ae99SBarry Smith       bptr = (void**)(iarray_start + xm*ym*zm*2*sizeof(PetscScalar) + zm*sizeof(void**));
1173*47c6ae99SBarry Smith       for(i=zs;i<zs+zm;i++) {
1174*47c6ae99SBarry Smith         ptr[i] = bptr + ((i-zs)*ym* - ys)*sizeof(void*);
1175*47c6ae99SBarry Smith       }
1176*47c6ae99SBarry Smith       for (i=zs; i<zs+zm; i++) {
1177*47c6ae99SBarry Smith         for (j=ys; j<ys+ym; j++) {
1178*47c6ae99SBarry Smith           ptr[i][j] = iarray_start + bs1*sizeof(PetscScalar)*(xm*ym*(i-zs) + xm*(j-ys) - xs);
1179*47c6ae99SBarry Smith         }
1180*47c6ae99SBarry Smith       }
1181*47c6ae99SBarry Smith 
1182*47c6ae99SBarry Smith       *iptr = (void*)ptr;
1183*47c6ae99SBarry Smith       break;}
1184*47c6ae99SBarry Smith     default:
1185*47c6ae99SBarry Smith       SETERRQ1(((PetscObject)da)->comm,PETSC_ERR_SUP,"Dimension %D not supported",dd->dim);
1186*47c6ae99SBarry Smith   }
1187*47c6ae99SBarry Smith 
1188*47c6ae99SBarry Smith   done:
1189*47c6ae99SBarry Smith   /* add arrays to the checked out list */
1190*47c6ae99SBarry Smith   if (ghosted) {
1191*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
1192*47c6ae99SBarry Smith       if (!dd->admfarrayghostedout[i]) {
1193*47c6ae99SBarry Smith         dd->admfarrayghostedout[i] = *iptr ;
1194*47c6ae99SBarry Smith         dd->admfstartghostedout[i] = iarray_start;
1195*47c6ae99SBarry Smith         dd->ghostedtdof            = itdof;
1196*47c6ae99SBarry Smith         break;
1197*47c6ae99SBarry Smith       }
1198*47c6ae99SBarry Smith     }
1199*47c6ae99SBarry Smith   } else {
1200*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
1201*47c6ae99SBarry Smith       if (!dd->admfarrayout[i]) {
1202*47c6ae99SBarry Smith         dd->admfarrayout[i] = *iptr ;
1203*47c6ae99SBarry Smith         dd->admfstartout[i] = iarray_start;
1204*47c6ae99SBarry Smith         dd->tdof            = itdof;
1205*47c6ae99SBarry Smith         break;
1206*47c6ae99SBarry Smith       }
1207*47c6ae99SBarry Smith     }
1208*47c6ae99SBarry Smith   }
1209*47c6ae99SBarry Smith   if (i == DA_MAX_AD_ARRAYS+1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Too many DA ADIC arrays obtained");
1210*47c6ae99SBarry Smith   if (tdof)        *tdof = itdof;
1211*47c6ae99SBarry Smith   if (array_start) *(void**)array_start = iarray_start;
1212*47c6ae99SBarry Smith   PetscFunctionReturn(0);
1213*47c6ae99SBarry Smith }
1214*47c6ae99SBarry Smith 
1215*47c6ae99SBarry Smith #undef __FUNCT__
1216*47c6ae99SBarry Smith #define __FUNCT__ "DARestoreAdicMFArray"
1217*47c6ae99SBarry Smith /*@C
1218*47c6ae99SBarry Smith      DARestoreAdicMFArray - Restores an array of derivative types for a DA.
1219*47c6ae99SBarry Smith 
1220*47c6ae99SBarry Smith      Input Parameter:
1221*47c6ae99SBarry Smith +    da - information about my local patch
1222*47c6ae99SBarry Smith -    ghosted - do you want arrays for the ghosted or nonghosted patch?
1223*47c6ae99SBarry Smith 
1224*47c6ae99SBarry Smith      Output Parameters:
1225*47c6ae99SBarry Smith +    ptr - array data structure to be passed to ad_FormFunctionLocal()
1226*47c6ae99SBarry Smith .    array_start - actual start of 1d array of all values that adiC can access directly
1227*47c6ae99SBarry Smith -    tdof - total number of degrees of freedom represented in array_start
1228*47c6ae99SBarry Smith 
1229*47c6ae99SBarry Smith      Level: advanced
1230*47c6ae99SBarry Smith 
1231*47c6ae99SBarry Smith .seealso: DAGetAdicArray()
1232*47c6ae99SBarry Smith 
1233*47c6ae99SBarry Smith @*/
1234*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT DARestoreAdicMFArray(DA da,PetscBool  ghosted,void *vptr,void *array_start,PetscInt *tdof)
1235*47c6ae99SBarry Smith {
1236*47c6ae99SBarry Smith   PetscInt  i;
1237*47c6ae99SBarry Smith   void      **iptr = (void**)vptr,*iarray_start = 0;
1238*47c6ae99SBarry Smith   DM_DA     *dd = (DM_DA*)da->data;
1239*47c6ae99SBarry Smith 
1240*47c6ae99SBarry Smith   PetscFunctionBegin;
1241*47c6ae99SBarry Smith   PetscValidHeaderSpecific(da,DM_CLASSID,1);
1242*47c6ae99SBarry Smith   if (ghosted) {
1243*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
1244*47c6ae99SBarry Smith       if (dd->admfarrayghostedout[i] == *iptr) {
1245*47c6ae99SBarry Smith         iarray_start               = dd->admfstartghostedout[i];
1246*47c6ae99SBarry Smith         dd->admfarrayghostedout[i] = PETSC_NULL;
1247*47c6ae99SBarry Smith         dd->admfstartghostedout[i] = PETSC_NULL;
1248*47c6ae99SBarry Smith         break;
1249*47c6ae99SBarry Smith       }
1250*47c6ae99SBarry Smith     }
1251*47c6ae99SBarry Smith     if (!iarray_start) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Could not find array in checkout list");
1252*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
1253*47c6ae99SBarry Smith       if (!dd->admfarrayghostedin[i]){
1254*47c6ae99SBarry Smith         dd->admfarrayghostedin[i] = *iptr;
1255*47c6ae99SBarry Smith         dd->admfstartghostedin[i] = iarray_start;
1256*47c6ae99SBarry Smith         break;
1257*47c6ae99SBarry Smith       }
1258*47c6ae99SBarry Smith     }
1259*47c6ae99SBarry Smith   } else {
1260*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
1261*47c6ae99SBarry Smith       if (dd->admfarrayout[i] == *iptr) {
1262*47c6ae99SBarry Smith         iarray_start        = dd->admfstartout[i];
1263*47c6ae99SBarry Smith         dd->admfarrayout[i] = PETSC_NULL;
1264*47c6ae99SBarry Smith         dd->admfstartout[i] = PETSC_NULL;
1265*47c6ae99SBarry Smith         break;
1266*47c6ae99SBarry Smith       }
1267*47c6ae99SBarry Smith     }
1268*47c6ae99SBarry Smith     if (!iarray_start) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Could not find array in checkout list");
1269*47c6ae99SBarry Smith     for (i=0; i<DA_MAX_AD_ARRAYS; i++) {
1270*47c6ae99SBarry Smith       if (!dd->admfarrayin[i]){
1271*47c6ae99SBarry Smith         dd->admfarrayin[i] = *iptr;
1272*47c6ae99SBarry Smith         dd->admfstartin[i] = iarray_start;
1273*47c6ae99SBarry Smith         break;
1274*47c6ae99SBarry Smith       }
1275*47c6ae99SBarry Smith     }
1276*47c6ae99SBarry Smith   }
1277*47c6ae99SBarry Smith   PetscFunctionReturn(0);
1278*47c6ae99SBarry Smith }
1279*47c6ae99SBarry Smith 
1280*47c6ae99SBarry Smith #undef __FUNCT__
1281*47c6ae99SBarry Smith #define __FUNCT__ "admf_DAGetArray"
1282*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT admf_DAGetArray(DA da,PetscBool  ghosted,void *iptr)
1283*47c6ae99SBarry Smith {
1284*47c6ae99SBarry Smith   PetscErrorCode ierr;
1285*47c6ae99SBarry Smith   PetscFunctionBegin;
1286*47c6ae99SBarry Smith   ierr = DAGetAdicMFArray(da,ghosted,iptr,0,0);CHKERRQ(ierr);
1287*47c6ae99SBarry Smith   PetscFunctionReturn(0);
1288*47c6ae99SBarry Smith }
1289*47c6ae99SBarry Smith 
1290*47c6ae99SBarry Smith #undef __FUNCT__
1291*47c6ae99SBarry Smith #define __FUNCT__ "admf_DARestoreArray"
1292*47c6ae99SBarry Smith PetscErrorCode PETSCDM_DLLEXPORT admf_DARestoreArray(DA da,PetscBool  ghosted,void *iptr)
1293*47c6ae99SBarry Smith {
1294*47c6ae99SBarry Smith   PetscErrorCode ierr;
1295*47c6ae99SBarry Smith   PetscFunctionBegin;
1296*47c6ae99SBarry Smith   ierr = DARestoreAdicMFArray(da,ghosted,iptr,0,0);CHKERRQ(ierr);
1297*47c6ae99SBarry Smith   PetscFunctionReturn(0);
1298*47c6ae99SBarry Smith }
1299*47c6ae99SBarry Smith 
1300*47c6ae99SBarry Smith /*M
1301*47c6ae99SBarry Smith   DAGetLocalVector - same as DMGetLocalVector
1302*47c6ae99SBarry Smith 
1303*47c6ae99SBarry Smith   Synopsis:
1304*47c6ae99SBarry Smith   PetscErrorCode DAGetLocalVector(DM dm,Vec* g)
1305*47c6ae99SBarry Smith 
1306*47c6ae99SBarry Smith   Not Collective
1307*47c6ae99SBarry Smith 
1308*47c6ae99SBarry Smith   Level: beginner
1309*47c6ae99SBarry Smith M*/
1310*47c6ae99SBarry Smith 
1311*47c6ae99SBarry Smith 
1312*47c6ae99SBarry Smith /*M
1313*47c6ae99SBarry Smith   DARestoreLocalVector - same as DMRestoreLocalVector
1314*47c6ae99SBarry Smith 
1315*47c6ae99SBarry Smith   Synopsis:
1316*47c6ae99SBarry Smith   PetscErrorCode DARestoreLocalVector(DM dm,Vec* g)
1317*47c6ae99SBarry Smith 
1318*47c6ae99SBarry Smith   Not Collective
1319*47c6ae99SBarry Smith 
1320*47c6ae99SBarry Smith   Level: beginner
1321*47c6ae99SBarry Smith M*/
1322*47c6ae99SBarry Smith 
1323*47c6ae99SBarry Smith 
1324*47c6ae99SBarry Smith /*M
1325*47c6ae99SBarry Smith   DAGetGlobalVector - same as DMGetGlobalVector
1326*47c6ae99SBarry Smith 
1327*47c6ae99SBarry Smith   Synopsis:
1328*47c6ae99SBarry Smith   PetscErrorCode  DAGetGlobalVector(DM dm,Vec* g)
1329*47c6ae99SBarry Smith 
1330*47c6ae99SBarry Smith   Collective on DM
1331*47c6ae99SBarry Smith 
1332*47c6ae99SBarry Smith   Level: beginner
1333*47c6ae99SBarry Smith M*/
1334*47c6ae99SBarry Smith 
1335*47c6ae99SBarry Smith 
1336*47c6ae99SBarry Smith /*M
1337*47c6ae99SBarry Smith   DARestoreGlobalVector - same as DMRestoreGlobalVector
1338*47c6ae99SBarry Smith 
1339*47c6ae99SBarry Smith   Synopsis:
1340*47c6ae99SBarry Smith   PetscErrorCode DARestoreGlobalVector(DM dm,Vec* g)
1341*47c6ae99SBarry Smith 
1342*47c6ae99SBarry Smith   Collective on DM
1343*47c6ae99SBarry Smith 
1344*47c6ae99SBarry Smith   Level: beginner
1345*47c6ae99SBarry Smith M*/
1346