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