1af0996ceSBarry Smith #include <petsc/private/dmimpl.h> /*I "petscdm.h" I*/ 268260fa0SJed Brown 368260fa0SJed Brown /*@ 46eb26441SStefano Zampini DMGetLocalVector - Gets a PETSc vector that may be used with the DM local routines. This vector has spaces for the ghost values. 568260fa0SJed Brown 668260fa0SJed Brown Not Collective 768260fa0SJed Brown 868260fa0SJed Brown Input Parameter: 96eb26441SStefano Zampini . dm - the dm 1068260fa0SJed Brown 1168260fa0SJed Brown Output Parameter: 1268260fa0SJed Brown . g - the local vector 1368260fa0SJed Brown 1468260fa0SJed Brown Level: beginner 1568260fa0SJed Brown 1668260fa0SJed Brown Note: 1768260fa0SJed Brown The vector values are NOT initialized and may have garbage in them, so you may need 1868260fa0SJed Brown to zero them. 1968260fa0SJed Brown 2068260fa0SJed Brown The output parameter, g, is a regular PETSc vector that should be returned with 2168260fa0SJed Brown DMRestoreLocalVector() DO NOT call VecDestroy() on it. 2268260fa0SJed Brown 23f1978aafSBarry Smith This is intended to be used for vectors you need for a short time, like within a single function call. 24f1978aafSBarry Smith For vectors that you intend to keep around (for example in a C struct) or pass around large parts of your 25f1978aafSBarry Smith code you should use DMCreateLocalVector(). 26f1978aafSBarry Smith 2768260fa0SJed Brown VecStride*() operations can be useful when using DM with dof > 1 2868260fa0SJed Brown 2968260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(), 3068260fa0SJed Brown DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(), 3168260fa0SJed Brown DMGlobalToLocalEnd(), DMLocalToGlobalBegin(), DMCreateLocalVector(), DMRestoreLocalVector(), 3268260fa0SJed Brown VecStrideMax(), VecStrideMin(), VecStrideNorm() 3368260fa0SJed Brown @*/ 3468260fa0SJed Brown PetscErrorCode DMGetLocalVector(DM dm,Vec *g) 3568260fa0SJed Brown { 3668260fa0SJed Brown PetscFunctionBegin; 3768260fa0SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3868260fa0SJed Brown PetscValidPointer(g,2); 395f80ce2aSJacob Faibussowitsch for (PetscInt i=0; i<DM_MAX_WORK_VECTORS; i++) { 4068260fa0SJed Brown if (dm->localin[i]) { 416eb26441SStefano Zampini DM vdm; 426eb26441SStefano Zampini 4368260fa0SJed Brown *g = dm->localin[i]; 440298fd71SBarry Smith dm->localin[i] = NULL; 456eb26441SStefano Zampini 465f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetDM(*g,&vdm)); 47*28b400f6SJacob Faibussowitsch PetscCheck(!vdm,PetscObjectComm((PetscObject)vdm),PETSC_ERR_LIB,"Invalid vector"); 485f80ce2aSJacob Faibussowitsch CHKERRQ(VecSetDM(*g,dm)); 4968260fa0SJed Brown goto alldone; 5068260fa0SJed Brown } 5168260fa0SJed Brown } 525f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateLocalVector(dm,g)); 5368260fa0SJed Brown 5468260fa0SJed Brown alldone: 555f80ce2aSJacob Faibussowitsch for (PetscInt i=0; i<DM_MAX_WORK_VECTORS; i++) { 5668260fa0SJed Brown if (!dm->localout[i]) { 5768260fa0SJed Brown dm->localout[i] = *g; 5868260fa0SJed Brown break; 5968260fa0SJed Brown } 6068260fa0SJed Brown } 6168260fa0SJed Brown PetscFunctionReturn(0); 6268260fa0SJed Brown } 6368260fa0SJed Brown 6468260fa0SJed Brown /*@ 656eb26441SStefano Zampini DMRestoreLocalVector - Returns a PETSc vector that was 6668260fa0SJed Brown obtained from DMGetLocalVector(). Do not use with vector obtained via 6768260fa0SJed Brown DMCreateLocalVector(). 6868260fa0SJed Brown 6968260fa0SJed Brown Not Collective 7068260fa0SJed Brown 71d8d19677SJose E. Roman Input Parameters: 726eb26441SStefano Zampini + dm - the dm 7368260fa0SJed Brown - g - the local vector 7468260fa0SJed Brown 7568260fa0SJed Brown Level: beginner 7668260fa0SJed Brown 7768260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(), 7868260fa0SJed Brown DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(), 7968260fa0SJed Brown DMGlobalToLocalEnd(), DMLocalToGlobalBegin(), DMCreateLocalVector(), DMGetLocalVector() 8068260fa0SJed Brown @*/ 8168260fa0SJed Brown PetscErrorCode DMRestoreLocalVector(DM dm,Vec *g) 8268260fa0SJed Brown { 8368260fa0SJed Brown PetscInt i,j; 8468260fa0SJed Brown 8568260fa0SJed Brown PetscFunctionBegin; 8668260fa0SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8768260fa0SJed Brown PetscValidPointer(g,2); 8868260fa0SJed Brown for (j=0; j<DM_MAX_WORK_VECTORS; j++) { 8968260fa0SJed Brown if (*g == dm->localout[j]) { 906eb26441SStefano Zampini DM vdm; 916eb26441SStefano Zampini 925f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetDM(*g,&vdm)); 932c71b3e2SJacob Faibussowitsch PetscCheckFalse(vdm != dm,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Invalid vector"); 945f80ce2aSJacob Faibussowitsch CHKERRQ(VecSetDM(*g,NULL)); 950298fd71SBarry Smith dm->localout[j] = NULL; 9668260fa0SJed Brown for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 9768260fa0SJed Brown if (!dm->localin[i]) { 9868260fa0SJed Brown dm->localin[i] = *g; 9968260fa0SJed Brown goto alldone; 10068260fa0SJed Brown } 10168260fa0SJed Brown } 10268260fa0SJed Brown } 10368260fa0SJed Brown } 1045f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(g)); 10568260fa0SJed Brown alldone: 106dd6887adSBarry Smith *g = NULL; 10768260fa0SJed Brown PetscFunctionReturn(0); 10868260fa0SJed Brown } 10968260fa0SJed Brown 11068260fa0SJed Brown /*@ 1116eb26441SStefano Zampini DMGetGlobalVector - Gets a PETSc vector that may be used with the DM global routines. 11268260fa0SJed Brown 113d083f849SBarry Smith Collective on dm 11468260fa0SJed Brown 11568260fa0SJed Brown Input Parameter: 1166eb26441SStefano Zampini . dm - the dm 11768260fa0SJed Brown 11868260fa0SJed Brown Output Parameter: 11968260fa0SJed Brown . g - the global vector 12068260fa0SJed Brown 12168260fa0SJed Brown Level: beginner 12268260fa0SJed Brown 12368260fa0SJed Brown Note: 12468260fa0SJed Brown The vector values are NOT initialized and may have garbage in them, so you may need 12568260fa0SJed Brown to zero them. 12668260fa0SJed Brown 12768260fa0SJed Brown The output parameter, g, is a regular PETSc vector that should be returned with 12868260fa0SJed Brown DMRestoreGlobalVector() DO NOT call VecDestroy() on it. 12968260fa0SJed Brown 130f1978aafSBarry Smith This is intended to be used for vectors you need for a short time, like within a single function call. 131f1978aafSBarry Smith For vectors that you intend to keep around (for example in a C struct) or pass around large parts of your 132f1978aafSBarry Smith code you should use DMCreateGlobalVector(). 133f1978aafSBarry Smith 13468260fa0SJed Brown VecStride*() operations can be useful when using DM with dof > 1 13568260fa0SJed Brown 13668260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(), 13768260fa0SJed Brown DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(), 13868260fa0SJed Brown DMGlobalToLocalEnd(), DMLocalToGlobalBegin(), DMCreateLocalVector(), DMRestoreLocalVector() 13968260fa0SJed Brown VecStrideMax(), VecStrideMin(), VecStrideNorm() 14068260fa0SJed Brown @*/ 14168260fa0SJed Brown PetscErrorCode DMGetGlobalVector(DM dm,Vec *g) 14268260fa0SJed Brown { 14368260fa0SJed Brown PetscInt i; 14468260fa0SJed Brown 14568260fa0SJed Brown PetscFunctionBegin; 14668260fa0SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 14768260fa0SJed Brown PetscValidPointer(g,2); 14868260fa0SJed Brown for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 14968260fa0SJed Brown if (dm->globalin[i]) { 1506eb26441SStefano Zampini DM vdm; 1516eb26441SStefano Zampini 15268260fa0SJed Brown *g = dm->globalin[i]; 1530298fd71SBarry Smith dm->globalin[i] = NULL; 1546eb26441SStefano Zampini 1555f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetDM(*g,&vdm)); 156*28b400f6SJacob Faibussowitsch PetscCheck(!vdm,PetscObjectComm((PetscObject)vdm),PETSC_ERR_LIB,"Invalid vector"); 1575f80ce2aSJacob Faibussowitsch CHKERRQ(VecSetDM(*g,dm)); 15868260fa0SJed Brown goto alldone; 15968260fa0SJed Brown } 16068260fa0SJed Brown } 1615f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateGlobalVector(dm,g)); 16268260fa0SJed Brown 16368260fa0SJed Brown alldone: 16468260fa0SJed Brown for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 16568260fa0SJed Brown if (!dm->globalout[i]) { 16668260fa0SJed Brown dm->globalout[i] = *g; 16768260fa0SJed Brown break; 16868260fa0SJed Brown } 16968260fa0SJed Brown } 17068260fa0SJed Brown PetscFunctionReturn(0); 17168260fa0SJed Brown } 17268260fa0SJed Brown 17368260fa0SJed Brown /*@ 17468260fa0SJed Brown DMClearGlobalVectors - Destroys all the global vectors that have been stashed in this DM 17568260fa0SJed Brown 176d083f849SBarry Smith Collective on dm 17768260fa0SJed Brown 17868260fa0SJed Brown Input Parameter: 1796eb26441SStefano Zampini . dm - the dm 18068260fa0SJed Brown 18168260fa0SJed Brown Level: developer 18268260fa0SJed Brown 18368260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(), 18468260fa0SJed Brown DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(), 18568260fa0SJed Brown DMGlobalToLocalEnd(), DMLocalToGlobalBegin(), DMCreateLocalVector(), DMRestoreLocalVector() 18668260fa0SJed Brown VecStrideMax(), VecStrideMin(), VecStrideNorm() 18768260fa0SJed Brown @*/ 18868260fa0SJed Brown PetscErrorCode DMClearGlobalVectors(DM dm) 18968260fa0SJed Brown { 19068260fa0SJed Brown PetscInt i; 19168260fa0SJed Brown 19268260fa0SJed Brown PetscFunctionBegin; 19368260fa0SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 19468260fa0SJed Brown for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 19562d839e9SJed Brown Vec g; 1966eb26441SStefano Zampini 1972c71b3e2SJacob Faibussowitsch PetscCheckFalse(dm->globalout[i],PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Clearing DM of global vectors that has a global vector obtained with DMGetGlobalVector()"); 19862d839e9SJed Brown g = dm->globalin[i]; 19962d839e9SJed Brown dm->globalin[i] = NULL; 2006eb26441SStefano Zampini if (g) { 2016eb26441SStefano Zampini DM vdm; 2026eb26441SStefano Zampini 2035f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetDM(g,&vdm)); 204*28b400f6SJacob Faibussowitsch PetscCheck(!vdm,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Clearing global vector that has a DM attached"); 2056eb26441SStefano Zampini } 2065f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&g)); 20768260fa0SJed Brown } 20868260fa0SJed Brown PetscFunctionReturn(0); 20968260fa0SJed Brown } 21068260fa0SJed Brown 21150eeb1caSToby Isaac /*@ 21250eeb1caSToby Isaac DMClearLocalVectors - Destroys all the local vectors that have been stashed in this DM 21350eeb1caSToby Isaac 214d083f849SBarry Smith Collective on dm 21550eeb1caSToby Isaac 21650eeb1caSToby Isaac Input Parameter: 2176eb26441SStefano Zampini . dm - the dm 21850eeb1caSToby Isaac 21950eeb1caSToby Isaac Level: developer 22050eeb1caSToby Isaac 22150eeb1caSToby Isaac .seealso: DMCreateLocalVector(), VecDuplicate(), VecDuplicateVecs(), 22250eeb1caSToby Isaac DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMLocalToLocalBegin(), 22350eeb1caSToby Isaac DMLocalToLocalEnd(), DMLocalToLocalBegin(), DMCreateLocalVector(), DMRestoreLocalVector() 22450eeb1caSToby Isaac VecStrideMax(), VecStrideMin(), VecStrideNorm() 22550eeb1caSToby Isaac @*/ 22650eeb1caSToby Isaac PetscErrorCode DMClearLocalVectors(DM dm) 22750eeb1caSToby Isaac { 22850eeb1caSToby Isaac PetscInt i; 22950eeb1caSToby Isaac 23050eeb1caSToby Isaac PetscFunctionBegin; 23150eeb1caSToby Isaac PetscValidHeaderSpecific(dm,DM_CLASSID,1); 23250eeb1caSToby Isaac for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 23350eeb1caSToby Isaac Vec g; 2346eb26441SStefano Zampini 2352c71b3e2SJacob Faibussowitsch PetscCheckFalse(dm->localout[i],PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Clearing DM of local vectors that has a local vector obtained with DMGetLocalVector()"); 23650eeb1caSToby Isaac g = dm->localin[i]; 23750eeb1caSToby Isaac dm->localin[i] = NULL; 2386eb26441SStefano Zampini if (g) { 2396eb26441SStefano Zampini DM vdm; 2406eb26441SStefano Zampini 2415f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetDM(g,&vdm)); 242*28b400f6SJacob Faibussowitsch PetscCheck(!vdm,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Clearing local vector that has a DM attached"); 2436eb26441SStefano Zampini } 2445f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&g)); 24550eeb1caSToby Isaac } 24650eeb1caSToby Isaac PetscFunctionReturn(0); 24750eeb1caSToby Isaac } 24850eeb1caSToby Isaac 24968260fa0SJed Brown /*@ 2506eb26441SStefano Zampini DMRestoreGlobalVector - Returns a PETSc vector that 25168260fa0SJed Brown obtained from DMGetGlobalVector(). Do not use with vector obtained via 25268260fa0SJed Brown DMCreateGlobalVector(). 25368260fa0SJed Brown 25468260fa0SJed Brown Not Collective 25568260fa0SJed Brown 256d8d19677SJose E. Roman Input Parameters: 2576eb26441SStefano Zampini + dm - the dm 25868260fa0SJed Brown - g - the global vector 25968260fa0SJed Brown 26068260fa0SJed Brown Level: beginner 26168260fa0SJed Brown 26268260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(), 26368260fa0SJed Brown DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToGlobalBegin(), 26468260fa0SJed Brown DMGlobalToGlobalEnd(), DMGlobalToGlobal(), DMCreateLocalVector(), DMGetGlobalVector() 26568260fa0SJed Brown @*/ 26668260fa0SJed Brown PetscErrorCode DMRestoreGlobalVector(DM dm,Vec *g) 26768260fa0SJed Brown { 26868260fa0SJed Brown PetscInt i,j; 26968260fa0SJed Brown 27068260fa0SJed Brown PetscFunctionBegin; 27168260fa0SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 27268260fa0SJed Brown PetscValidPointer(g,2); 2735f80ce2aSJacob Faibussowitsch CHKERRQ(VecSetErrorIfLocked(*g, 2)); 27468260fa0SJed Brown for (j=0; j<DM_MAX_WORK_VECTORS; j++) { 27568260fa0SJed Brown if (*g == dm->globalout[j]) { 2766eb26441SStefano Zampini DM vdm; 2776eb26441SStefano Zampini 2785f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetDM(*g,&vdm)); 2792c71b3e2SJacob Faibussowitsch PetscCheckFalse(vdm != dm,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Invalid vector"); 2805f80ce2aSJacob Faibussowitsch CHKERRQ(VecSetDM(*g,NULL)); 2810298fd71SBarry Smith dm->globalout[j] = NULL; 28268260fa0SJed Brown for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 28368260fa0SJed Brown if (!dm->globalin[i]) { 28468260fa0SJed Brown dm->globalin[i] = *g; 28568260fa0SJed Brown goto alldone; 28668260fa0SJed Brown } 28768260fa0SJed Brown } 28868260fa0SJed Brown } 28968260fa0SJed Brown } 2905f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(g)); 29168260fa0SJed Brown alldone: 292dd6887adSBarry Smith *g = NULL; 29368260fa0SJed Brown PetscFunctionReturn(0); 29468260fa0SJed Brown } 29568260fa0SJed Brown 296e77ac854SMatthew G. Knepley /*@C 297e77ac854SMatthew G. Knepley DMHasNamedGlobalVector - check for a named, persistent global vector 298e77ac854SMatthew G. Knepley 299e77ac854SMatthew G. Knepley Not Collective 300e77ac854SMatthew G. Knepley 3014165533cSJose E. Roman Input Parameters: 302e77ac854SMatthew G. Knepley + dm - DM to hold named vectors 303e77ac854SMatthew G. Knepley - name - unique name for Vec 304e77ac854SMatthew G. Knepley 3054165533cSJose E. Roman Output Parameter: 306e77ac854SMatthew G. Knepley . exists - true if the vector was previously created 307e77ac854SMatthew G. Knepley 308e77ac854SMatthew G. Knepley Level: developer 309e77ac854SMatthew G. Knepley 310e77ac854SMatthew G. Knepley Note: If a Vec with the given name does not exist, it is created. 311e77ac854SMatthew G. Knepley 312e77ac854SMatthew G. Knepley .seealso: DMGetNamedGlobalVector(), DMRestoreNamedLocalVector() 313e77ac854SMatthew G. Knepley @*/ 314e77ac854SMatthew G. Knepley PetscErrorCode DMHasNamedGlobalVector(DM dm,const char *name,PetscBool *exists) 315e77ac854SMatthew G. Knepley { 316e77ac854SMatthew G. Knepley DMNamedVecLink link; 317e77ac854SMatthew G. Knepley 318e77ac854SMatthew G. Knepley PetscFunctionBegin; 319e77ac854SMatthew G. Knepley PetscValidHeaderSpecific(dm,DM_CLASSID,1); 320e77ac854SMatthew G. Knepley PetscValidCharPointer(name,2); 321534a8f05SLisandro Dalcin PetscValidBoolPointer(exists,3); 322e77ac854SMatthew G. Knepley *exists = PETSC_FALSE; 323e77ac854SMatthew G. Knepley for (link=dm->namedglobal; link; link=link->next) { 324e77ac854SMatthew G. Knepley PetscBool match; 3255f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrcmp(name,link->name,&match)); 326e77ac854SMatthew G. Knepley if (match) { 327e77ac854SMatthew G. Knepley *exists = PETSC_TRUE; 328e77ac854SMatthew G. Knepley break; 329e77ac854SMatthew G. Knepley } 330e77ac854SMatthew G. Knepley } 331e77ac854SMatthew G. Knepley PetscFunctionReturn(0); 332e77ac854SMatthew G. Knepley } 333e77ac854SMatthew G. Knepley 33468260fa0SJed Brown /*@C 33568260fa0SJed Brown DMGetNamedGlobalVector - get access to a named, persistent global vector 33668260fa0SJed Brown 337d083f849SBarry Smith Collective on dm 33868260fa0SJed Brown 3394165533cSJose E. Roman Input Parameters: 34068260fa0SJed Brown + dm - DM to hold named vectors 34168260fa0SJed Brown - name - unique name for Vec 34268260fa0SJed Brown 3434165533cSJose E. Roman Output Parameter: 34468260fa0SJed Brown . X - named Vec 34568260fa0SJed Brown 34668260fa0SJed Brown Level: developer 34768260fa0SJed Brown 34868260fa0SJed Brown Note: If a Vec with the given name does not exist, it is created. 34968260fa0SJed Brown 35068260fa0SJed Brown .seealso: DMRestoreNamedGlobalVector() 35168260fa0SJed Brown @*/ 35268260fa0SJed Brown PetscErrorCode DMGetNamedGlobalVector(DM dm,const char *name,Vec *X) 35368260fa0SJed Brown { 35468260fa0SJed Brown DMNamedVecLink link; 35568260fa0SJed Brown 35668260fa0SJed Brown PetscFunctionBegin; 35768260fa0SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 35868260fa0SJed Brown PetscValidCharPointer(name,2); 35968260fa0SJed Brown PetscValidPointer(X,3); 36068260fa0SJed Brown for (link=dm->namedglobal; link; link=link->next) { 36168260fa0SJed Brown PetscBool match; 3626eb26441SStefano Zampini 3635f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrcmp(name,link->name,&match)); 36468260fa0SJed Brown if (match) { 3656eb26441SStefano Zampini DM vdm; 3666eb26441SStefano Zampini 3672c71b3e2SJacob Faibussowitsch PetscCheckFalse(link->status != DMVEC_STATUS_IN,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Vec name '%s' already checked out",name); 3685f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetDM(link->X,&vdm)); 369*28b400f6SJacob Faibussowitsch PetscCheck(!vdm,PetscObjectComm((PetscObject)vdm),PETSC_ERR_LIB,"Invalid vector"); 3705f80ce2aSJacob Faibussowitsch CHKERRQ(VecSetDM(link->X,dm)); 37168260fa0SJed Brown goto found; 37268260fa0SJed Brown } 37368260fa0SJed Brown } 37468260fa0SJed Brown 37568260fa0SJed Brown /* Create the Vec */ 3765f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNew(&link)); 3775f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrallocpy(name,&link->name)); 3785f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateGlobalVector(dm,&link->X)); 37968260fa0SJed Brown link->next = dm->namedglobal; 38068260fa0SJed Brown dm->namedglobal = link; 38168260fa0SJed Brown 38268260fa0SJed Brown found: 38368260fa0SJed Brown *X = link->X; 38468260fa0SJed Brown link->status = DMVEC_STATUS_OUT; 38568260fa0SJed Brown PetscFunctionReturn(0); 38668260fa0SJed Brown } 38768260fa0SJed Brown 38868260fa0SJed Brown /*@C 38968260fa0SJed Brown DMRestoreNamedGlobalVector - restore access to a named, persistent global vector 39068260fa0SJed Brown 391d083f849SBarry Smith Collective on dm 39268260fa0SJed Brown 3934165533cSJose E. Roman Input Parameters: 39468260fa0SJed Brown + dm - DM on which the vector was gotten 39568260fa0SJed Brown . name - name under which the vector was gotten 39668260fa0SJed Brown - X - Vec to restore 39768260fa0SJed Brown 39868260fa0SJed Brown Level: developer 39968260fa0SJed Brown 40068260fa0SJed Brown .seealso: DMGetNamedGlobalVector() 40168260fa0SJed Brown @*/ 40268260fa0SJed Brown PetscErrorCode DMRestoreNamedGlobalVector(DM dm,const char *name,Vec *X) 40368260fa0SJed Brown { 40468260fa0SJed Brown DMNamedVecLink link; 40568260fa0SJed Brown 40668260fa0SJed Brown PetscFunctionBegin; 40768260fa0SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 40868260fa0SJed Brown PetscValidCharPointer(name,2); 40968260fa0SJed Brown PetscValidPointer(X,3); 41068260fa0SJed Brown PetscValidHeaderSpecific(*X,VEC_CLASSID,3); 41168260fa0SJed Brown for (link=dm->namedglobal; link; link=link->next) { 41268260fa0SJed Brown PetscBool match; 4136eb26441SStefano Zampini 4145f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrcmp(name,link->name,&match)); 41568260fa0SJed Brown if (match) { 4166eb26441SStefano Zampini DM vdm; 4176eb26441SStefano Zampini 4185f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetDM(*X,&vdm)); 4192c71b3e2SJacob Faibussowitsch PetscCheckFalse(link->status != DMVEC_STATUS_OUT,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Vec name '%s' was not checked out",name); 4202c71b3e2SJacob Faibussowitsch PetscCheckFalse(link->X != *X,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Attempt to restore Vec name '%s', but Vec does not match the cache",name); 4212c71b3e2SJacob Faibussowitsch PetscCheckFalse(vdm != dm,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Invalid vector"); 4226eb26441SStefano Zampini 42368260fa0SJed Brown link->status = DMVEC_STATUS_IN; 4245f80ce2aSJacob Faibussowitsch CHKERRQ(VecSetDM(link->X,NULL)); 4250298fd71SBarry Smith *X = NULL; 42668260fa0SJed Brown PetscFunctionReturn(0); 42768260fa0SJed Brown } 42868260fa0SJed Brown } 42998921bdaSJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Could not find Vec name '%s' to restore",name); 43068260fa0SJed Brown } 4312348bcf4SPeter Brune 432e77ac854SMatthew G. Knepley /*@C 433e77ac854SMatthew G. Knepley DMHasNamedLocalVector - check for a named, persistent local vector 434e77ac854SMatthew G. Knepley 435e77ac854SMatthew G. Knepley Not Collective 436e77ac854SMatthew G. Knepley 4374165533cSJose E. Roman Input Parameters: 438e77ac854SMatthew G. Knepley + dm - DM to hold named vectors 439e77ac854SMatthew G. Knepley - name - unique name for Vec 440e77ac854SMatthew G. Knepley 4414165533cSJose E. Roman Output Parameter: 442e77ac854SMatthew G. Knepley . exists - true if the vector was previously created 443e77ac854SMatthew G. Knepley 444e77ac854SMatthew G. Knepley Level: developer 445e77ac854SMatthew G. Knepley 446e77ac854SMatthew G. Knepley Note: If a Vec with the given name does not exist, it is created. 447e77ac854SMatthew G. Knepley 448e77ac854SMatthew G. Knepley .seealso: DMGetNamedGlobalVector(), DMRestoreNamedLocalVector() 449e77ac854SMatthew G. Knepley @*/ 450e77ac854SMatthew G. Knepley PetscErrorCode DMHasNamedLocalVector(DM dm,const char *name,PetscBool *exists) 451e77ac854SMatthew G. Knepley { 452e77ac854SMatthew G. Knepley DMNamedVecLink link; 453e77ac854SMatthew G. Knepley 454e77ac854SMatthew G. Knepley PetscFunctionBegin; 455e77ac854SMatthew G. Knepley PetscValidHeaderSpecific(dm,DM_CLASSID,1); 456e77ac854SMatthew G. Knepley PetscValidCharPointer(name,2); 457e77ac854SMatthew G. Knepley PetscValidPointer(exists,3); 458e77ac854SMatthew G. Knepley *exists = PETSC_FALSE; 459e77ac854SMatthew G. Knepley for (link=dm->namedlocal; link; link=link->next) { 460e77ac854SMatthew G. Knepley PetscBool match; 4615f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrcmp(name,link->name,&match)); 462e77ac854SMatthew G. Knepley if (match) { 463e77ac854SMatthew G. Knepley *exists = PETSC_TRUE; 464e77ac854SMatthew G. Knepley break; 465e77ac854SMatthew G. Knepley } 466e77ac854SMatthew G. Knepley } 467e77ac854SMatthew G. Knepley PetscFunctionReturn(0); 468e77ac854SMatthew G. Knepley } 469e77ac854SMatthew G. Knepley 4702348bcf4SPeter Brune /*@C 4712348bcf4SPeter Brune DMGetNamedLocalVector - get access to a named, persistent local vector 4722348bcf4SPeter Brune 4732348bcf4SPeter Brune Not Collective 4742348bcf4SPeter Brune 4754165533cSJose E. Roman Input Parameters: 4762348bcf4SPeter Brune + dm - DM to hold named vectors 4772348bcf4SPeter Brune - name - unique name for Vec 4782348bcf4SPeter Brune 4794165533cSJose E. Roman Output Parameter: 4802348bcf4SPeter Brune . X - named Vec 4812348bcf4SPeter Brune 4822348bcf4SPeter Brune Level: developer 4832348bcf4SPeter Brune 4842348bcf4SPeter Brune Note: If a Vec with the given name does not exist, it is created. 4852348bcf4SPeter Brune 4862348bcf4SPeter Brune .seealso: DMGetNamedGlobalVector(), DMRestoreNamedLocalVector() 4872348bcf4SPeter Brune @*/ 4882348bcf4SPeter Brune PetscErrorCode DMGetNamedLocalVector(DM dm,const char *name,Vec *X) 4892348bcf4SPeter Brune { 4902348bcf4SPeter Brune DMNamedVecLink link; 4912348bcf4SPeter Brune 4922348bcf4SPeter Brune PetscFunctionBegin; 4932348bcf4SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4942348bcf4SPeter Brune PetscValidCharPointer(name,2); 4952348bcf4SPeter Brune PetscValidPointer(X,3); 4962348bcf4SPeter Brune for (link=dm->namedlocal; link; link=link->next) { 4972348bcf4SPeter Brune PetscBool match; 4986eb26441SStefano Zampini 4995f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrcmp(name,link->name,&match)); 5002348bcf4SPeter Brune if (match) { 5016eb26441SStefano Zampini DM vdm; 5026eb26441SStefano Zampini 5032c71b3e2SJacob Faibussowitsch PetscCheckFalse(link->status != DMVEC_STATUS_IN,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Vec name '%s' already checked out",name); 5045f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetDM(link->X,&vdm)); 505*28b400f6SJacob Faibussowitsch PetscCheck(!vdm,PetscObjectComm((PetscObject)vdm),PETSC_ERR_LIB,"Invalid vector"); 5065f80ce2aSJacob Faibussowitsch CHKERRQ(VecSetDM(link->X,dm)); 5072348bcf4SPeter Brune goto found; 5082348bcf4SPeter Brune } 5092348bcf4SPeter Brune } 5102348bcf4SPeter Brune 5112348bcf4SPeter Brune /* Create the Vec */ 5125f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNew(&link)); 5135f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrallocpy(name,&link->name)); 5145f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateLocalVector(dm,&link->X)); 5152348bcf4SPeter Brune link->next = dm->namedlocal; 5162348bcf4SPeter Brune dm->namedlocal = link; 5172348bcf4SPeter Brune 5182348bcf4SPeter Brune found: 5192348bcf4SPeter Brune *X = link->X; 5202348bcf4SPeter Brune link->status = DMVEC_STATUS_OUT; 5212348bcf4SPeter Brune PetscFunctionReturn(0); 5222348bcf4SPeter Brune } 5232348bcf4SPeter Brune 5242348bcf4SPeter Brune /*@C 5252348bcf4SPeter Brune DMRestoreNamedLocalVector - restore access to a named, persistent local vector 5262348bcf4SPeter Brune 5272348bcf4SPeter Brune Not Collective 5282348bcf4SPeter Brune 5294165533cSJose E. Roman Input Parameters: 5302348bcf4SPeter Brune + dm - DM on which the vector was gotten 5312348bcf4SPeter Brune . name - name under which the vector was gotten 5322348bcf4SPeter Brune - X - Vec to restore 5332348bcf4SPeter Brune 5342348bcf4SPeter Brune Level: developer 5352348bcf4SPeter Brune 5362348bcf4SPeter Brune .seealso: DMRestoreNamedGlobalVector(), DMGetNamedLocalVector() 5372348bcf4SPeter Brune @*/ 5382348bcf4SPeter Brune PetscErrorCode DMRestoreNamedLocalVector(DM dm,const char *name,Vec *X) 5392348bcf4SPeter Brune { 5402348bcf4SPeter Brune DMNamedVecLink link; 5412348bcf4SPeter Brune 5422348bcf4SPeter Brune PetscFunctionBegin; 5432348bcf4SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5442348bcf4SPeter Brune PetscValidCharPointer(name,2); 5452348bcf4SPeter Brune PetscValidPointer(X,3); 5462348bcf4SPeter Brune PetscValidHeaderSpecific(*X,VEC_CLASSID,3); 5472348bcf4SPeter Brune for (link=dm->namedlocal; link; link=link->next) { 5482348bcf4SPeter Brune PetscBool match; 5496eb26441SStefano Zampini 5505f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrcmp(name,link->name,&match)); 5512348bcf4SPeter Brune if (match) { 5526eb26441SStefano Zampini DM vdm; 5536eb26441SStefano Zampini 5545f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetDM(*X,&vdm)); 5552c71b3e2SJacob Faibussowitsch PetscCheckFalse(link->status != DMVEC_STATUS_OUT,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Vec name '%s' was not checked out",name); 5562c71b3e2SJacob Faibussowitsch PetscCheckFalse(link->X != *X,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Attempt to restore Vec name '%s', but Vec does not match the cache",name); 5572c71b3e2SJacob Faibussowitsch PetscCheckFalse(vdm != dm,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Invalid vector"); 5586eb26441SStefano Zampini 5592348bcf4SPeter Brune link->status = DMVEC_STATUS_IN; 5605f80ce2aSJacob Faibussowitsch CHKERRQ(VecSetDM(link->X,NULL)); 5610298fd71SBarry Smith *X = NULL; 5622348bcf4SPeter Brune PetscFunctionReturn(0); 5632348bcf4SPeter Brune } 5642348bcf4SPeter Brune } 56598921bdaSJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Could not find Vec name '%s' to restore",name); 5662348bcf4SPeter Brune } 567