1af0996ceSBarry Smith #include <petsc/private/dmimpl.h> /*I "petscdm.h" I*/ 268260fa0SJed Brown 368260fa0SJed Brown /*@ 420f4b53cSBarry Smith 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: 920f4b53cSBarry Smith . 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 2020f4b53cSBarry Smith The output parameter, `g`, is a regular PETSc vector that should be returned with 2120f4b53cSBarry Smith `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 2520f4b53cSBarry Smith code you should use `DMCreateLocalVector()`. 26f1978aafSBarry Smith 2768260fa0SJed Brown VecStride*() operations can be useful when using DM with dof > 1 2868260fa0SJed Brown 2920f4b53cSBarry Smith .seealso: `DM`, `DMCreateGlobalVector()`, `VecDuplicate()`, `VecDuplicateVecs()`, 30db781477SPatrick Sanan `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMGlobalToLocalBegin()`, 31db781477SPatrick Sanan `DMGlobalToLocalEnd()`, `DMLocalToGlobalBegin()`, `DMCreateLocalVector()`, `DMRestoreLocalVector()`, 32db781477SPatrick Sanan `VecStrideMax()`, `VecStrideMin()`, `VecStrideNorm()` 3368260fa0SJed Brown @*/ 34d71ae5a4SJacob Faibussowitsch PetscErrorCode DMGetLocalVector(DM dm, Vec *g) 35d71ae5a4SJacob Faibussowitsch { 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 469566063dSJacob Faibussowitsch PetscCall(VecGetDM(*g, &vdm)); 4728b400f6SJacob Faibussowitsch PetscCheck(!vdm, PetscObjectComm((PetscObject)vdm), PETSC_ERR_LIB, "Invalid vector"); 489566063dSJacob Faibussowitsch PetscCall(VecSetDM(*g, dm)); 4968260fa0SJed Brown goto alldone; 5068260fa0SJed Brown } 5168260fa0SJed Brown } 529566063dSJacob Faibussowitsch PetscCall(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 } 613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6268260fa0SJed Brown } 6368260fa0SJed Brown 6468260fa0SJed Brown /*@ 656eb26441SStefano Zampini DMRestoreLocalVector - Returns a PETSc vector that was 66dce8aebaSBarry Smith obtained from `DMGetLocalVector()`. Do not use with vector obtained via 67dce8aebaSBarry Smith `DMCreateLocalVector()`. 6868260fa0SJed Brown 6968260fa0SJed Brown Not Collective 7068260fa0SJed Brown 71d8d19677SJose E. Roman Input Parameters: 7220f4b53cSBarry Smith + dm - the `DM` 7368260fa0SJed Brown - g - the local vector 7468260fa0SJed Brown 7568260fa0SJed Brown Level: beginner 7668260fa0SJed Brown 7720f4b53cSBarry Smith .seealso: `DM`, `DM`, `DMCreateGlobalVector()`, `VecDuplicate()`, `VecDuplicateVecs()`, 78db781477SPatrick Sanan `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMGlobalToLocalBegin()`, 79db781477SPatrick Sanan `DMGlobalToLocalEnd()`, `DMLocalToGlobalBegin()`, `DMCreateLocalVector()`, `DMGetLocalVector()` 8068260fa0SJed Brown @*/ 81d71ae5a4SJacob Faibussowitsch PetscErrorCode DMRestoreLocalVector(DM dm, Vec *g) 82d71ae5a4SJacob Faibussowitsch { 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 929566063dSJacob Faibussowitsch PetscCall(VecGetDM(*g, &vdm)); 9308401ef6SPierre Jolivet PetscCheck(vdm == dm, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Invalid vector"); 949566063dSJacob Faibussowitsch PetscCall(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 } 1049566063dSJacob Faibussowitsch PetscCall(VecDestroy(g)); 10568260fa0SJed Brown alldone: 106dd6887adSBarry Smith *g = NULL; 1073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 10868260fa0SJed Brown } 10968260fa0SJed Brown 11068260fa0SJed Brown /*@ 111dce8aebaSBarry Smith 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: 11620f4b53cSBarry Smith . 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 12720f4b53cSBarry Smith The output parameter, `g`, is a regular PETSc vector that should be returned with 128dce8aebaSBarry Smith `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 132dce8aebaSBarry Smith code you should use `DMCreateGlobalVector()`. 133f1978aafSBarry Smith 134dce8aebaSBarry Smith VecStride*() operations can be useful when using `DM` with dof > 1 13568260fa0SJed Brown 13620f4b53cSBarry Smith .seealso: `DM`, `DM`, `DMCreateGlobalVector()`, `VecDuplicate()`, `VecDuplicateVecs()`, 137db781477SPatrick Sanan `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMGlobalToLocalBegin()`, 138db781477SPatrick Sanan `DMGlobalToLocalEnd()`, `DMLocalToGlobalBegin()`, `DMCreateLocalVector()`, `DMRestoreLocalVector()` 139db781477SPatrick Sanan `VecStrideMax()`, `VecStrideMin()`, `VecStrideNorm()` 14068260fa0SJed Brown @*/ 141d71ae5a4SJacob Faibussowitsch PetscErrorCode DMGetGlobalVector(DM dm, Vec *g) 142d71ae5a4SJacob Faibussowitsch { 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 1559566063dSJacob Faibussowitsch PetscCall(VecGetDM(*g, &vdm)); 15628b400f6SJacob Faibussowitsch PetscCheck(!vdm, PetscObjectComm((PetscObject)vdm), PETSC_ERR_LIB, "Invalid vector"); 1579566063dSJacob Faibussowitsch PetscCall(VecSetDM(*g, dm)); 15868260fa0SJed Brown goto alldone; 15968260fa0SJed Brown } 16068260fa0SJed Brown } 1619566063dSJacob Faibussowitsch PetscCall(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 } 1703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 17168260fa0SJed Brown } 17268260fa0SJed Brown 17368260fa0SJed Brown /*@ 17420f4b53cSBarry Smith DMClearGlobalVectors - Destroys all the global vectors that have been stashed in this `DM` 17568260fa0SJed Brown 17620f4b53cSBarry Smith Collective 17768260fa0SJed Brown 17868260fa0SJed Brown Input Parameter: 17920f4b53cSBarry Smith . dm - the `DM` 18068260fa0SJed Brown 18168260fa0SJed Brown Level: developer 18268260fa0SJed Brown 18320f4b53cSBarry Smith .seealso: `DM`, `DMCreateGlobalVector()`, `VecDuplicate()`, `VecDuplicateVecs()`, 184db781477SPatrick Sanan `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMGlobalToLocalBegin()`, 185db781477SPatrick Sanan `DMGlobalToLocalEnd()`, `DMLocalToGlobalBegin()`, `DMCreateLocalVector()`, `DMRestoreLocalVector()` 186db781477SPatrick Sanan `VecStrideMax()`, `VecStrideMin()`, `VecStrideNorm()` 18768260fa0SJed Brown @*/ 188d71ae5a4SJacob Faibussowitsch PetscErrorCode DMClearGlobalVectors(DM dm) 189d71ae5a4SJacob Faibussowitsch { 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 1971dca8a05SBarry Smith PetscCheck(!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 2039566063dSJacob Faibussowitsch PetscCall(VecGetDM(g, &vdm)); 20428b400f6SJacob Faibussowitsch PetscCheck(!vdm, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Clearing global vector that has a DM attached"); 2056eb26441SStefano Zampini } 2069566063dSJacob Faibussowitsch PetscCall(VecDestroy(&g)); 20768260fa0SJed Brown } 2083ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20968260fa0SJed Brown } 21068260fa0SJed Brown 21150eeb1caSToby Isaac /*@ 21220f4b53cSBarry Smith DMClearLocalVectors - Destroys all the local vectors that have been stashed in this `DM` 21350eeb1caSToby Isaac 21420f4b53cSBarry Smith Collective 21550eeb1caSToby Isaac 21650eeb1caSToby Isaac Input Parameter: 21720f4b53cSBarry Smith . dm - the `DM` 21850eeb1caSToby Isaac 21950eeb1caSToby Isaac Level: developer 22050eeb1caSToby Isaac 22120f4b53cSBarry Smith .seealso: `DM`, `DMCreateLocalVector()`, `VecDuplicate()`, `VecDuplicateVecs()`, 222db781477SPatrick Sanan `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMLocalToLocalBegin()`, 223db781477SPatrick Sanan `DMLocalToLocalEnd()`, `DMLocalToLocalBegin()`, `DMCreateLocalVector()`, `DMRestoreLocalVector()` 224db781477SPatrick Sanan `VecStrideMax()`, `VecStrideMin()`, `VecStrideNorm()` 22550eeb1caSToby Isaac @*/ 226d71ae5a4SJacob Faibussowitsch PetscErrorCode DMClearLocalVectors(DM dm) 227d71ae5a4SJacob Faibussowitsch { 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 2351dca8a05SBarry Smith PetscCheck(!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 2419566063dSJacob Faibussowitsch PetscCall(VecGetDM(g, &vdm)); 24228b400f6SJacob Faibussowitsch PetscCheck(!vdm, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Clearing local vector that has a DM attached"); 2436eb26441SStefano Zampini } 2449566063dSJacob Faibussowitsch PetscCall(VecDestroy(&g)); 24550eeb1caSToby Isaac } 2463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 24750eeb1caSToby Isaac } 24850eeb1caSToby Isaac 24968260fa0SJed Brown /*@ 2506eb26441SStefano Zampini DMRestoreGlobalVector - Returns a PETSc vector that 25120f4b53cSBarry Smith obtained from `DMGetGlobalVector()`. Do not use with vector obtained via 25220f4b53cSBarry Smith `DMCreateGlobalVector()`. 25368260fa0SJed Brown 25468260fa0SJed Brown Not Collective 25568260fa0SJed Brown 256d8d19677SJose E. Roman Input Parameters: 25720f4b53cSBarry Smith + dm - the `DM` 25868260fa0SJed Brown - g - the global vector 25968260fa0SJed Brown 26068260fa0SJed Brown Level: beginner 26168260fa0SJed Brown 26220f4b53cSBarry Smith .seealso: `DM`, `DMCreateGlobalVector()`, `VecDuplicate()`, `VecDuplicateVecs()`, 263db781477SPatrick Sanan `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMGlobalToGlobalBegin()`, 264db781477SPatrick Sanan `DMGlobalToGlobalEnd()`, `DMGlobalToGlobal()`, `DMCreateLocalVector()`, `DMGetGlobalVector()` 26568260fa0SJed Brown @*/ 266d71ae5a4SJacob Faibussowitsch PetscErrorCode DMRestoreGlobalVector(DM dm, Vec *g) 267d71ae5a4SJacob Faibussowitsch { 26868260fa0SJed Brown PetscInt i, j; 26968260fa0SJed Brown 27068260fa0SJed Brown PetscFunctionBegin; 27168260fa0SJed Brown PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 27268260fa0SJed Brown PetscValidPointer(g, 2); 2739566063dSJacob Faibussowitsch PetscCall(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 2789566063dSJacob Faibussowitsch PetscCall(VecGetDM(*g, &vdm)); 27908401ef6SPierre Jolivet PetscCheck(vdm == dm, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Invalid vector"); 2809566063dSJacob Faibussowitsch PetscCall(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 } 2909566063dSJacob Faibussowitsch PetscCall(VecDestroy(g)); 29168260fa0SJed Brown alldone: 292dd6887adSBarry Smith *g = NULL; 2933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 29468260fa0SJed Brown } 29568260fa0SJed Brown 296*974ca4ecSStefano Zampini /*@ 297*974ca4ecSStefano Zampini DMClearNamedGlobalVectors - Destroys all the named global vectors that have been stashed in this `DM` 298*974ca4ecSStefano Zampini 299*974ca4ecSStefano Zampini Collective 300*974ca4ecSStefano Zampini 301*974ca4ecSStefano Zampini Input Parameter: 302*974ca4ecSStefano Zampini . dm - the `DM` 303*974ca4ecSStefano Zampini 304*974ca4ecSStefano Zampini Level: developer 305*974ca4ecSStefano Zampini 306*974ca4ecSStefano Zampini .seealso: `DM`, `DMGetNamedGlobalVector()`, `DMGetNamedLocalVector()`, `DMClearNamedLocalVectors()` 307*974ca4ecSStefano Zampini @*/ 308*974ca4ecSStefano Zampini PetscErrorCode DMClearNamedGlobalVectors(DM dm) 309*974ca4ecSStefano Zampini { 310*974ca4ecSStefano Zampini DMNamedVecLink nnext; 311*974ca4ecSStefano Zampini 312*974ca4ecSStefano Zampini PetscFunctionBegin; 313*974ca4ecSStefano Zampini PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 314*974ca4ecSStefano Zampini nnext = dm->namedglobal; 315*974ca4ecSStefano Zampini dm->namedglobal = NULL; 316*974ca4ecSStefano Zampini for (DMNamedVecLink nlink = nnext; nlink; nlink = nnext) { /* Destroy the named vectors */ 317*974ca4ecSStefano Zampini nnext = nlink->next; 318*974ca4ecSStefano Zampini PetscCheck(nlink->status == DMVEC_STATUS_IN, ((PetscObject)dm)->comm, PETSC_ERR_ARG_WRONGSTATE, "DM still has global Vec named '%s' checked out", nlink->name); 319*974ca4ecSStefano Zampini PetscCall(PetscFree(nlink->name)); 320*974ca4ecSStefano Zampini PetscCall(VecDestroy(&nlink->X)); 321*974ca4ecSStefano Zampini PetscCall(PetscFree(nlink)); 322*974ca4ecSStefano Zampini } 323*974ca4ecSStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 324*974ca4ecSStefano Zampini } 325*974ca4ecSStefano Zampini 326*974ca4ecSStefano Zampini /*@ 327*974ca4ecSStefano Zampini DMClearNamedLocalVectors - Destroys all the named local vectors that have been stashed in this `DM` 328*974ca4ecSStefano Zampini 329*974ca4ecSStefano Zampini Collective 330*974ca4ecSStefano Zampini 331*974ca4ecSStefano Zampini Input Parameter: 332*974ca4ecSStefano Zampini . dm - the `DM` 333*974ca4ecSStefano Zampini 334*974ca4ecSStefano Zampini Level: developer 335*974ca4ecSStefano Zampini 336*974ca4ecSStefano Zampini .seealso: `DM`, `DMGetNamedGlobalVector()`, `DMGetNamedLocalVector()`, `DMClearNamedGlobalVectors()` 337*974ca4ecSStefano Zampini @*/ 338*974ca4ecSStefano Zampini PetscErrorCode DMClearNamedLocalVectors(DM dm) 339*974ca4ecSStefano Zampini { 340*974ca4ecSStefano Zampini DMNamedVecLink nnext; 341*974ca4ecSStefano Zampini 342*974ca4ecSStefano Zampini PetscFunctionBegin; 343*974ca4ecSStefano Zampini PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 344*974ca4ecSStefano Zampini nnext = dm->namedlocal; 345*974ca4ecSStefano Zampini dm->namedlocal = NULL; 346*974ca4ecSStefano Zampini for (DMNamedVecLink nlink = nnext; nlink; nlink = nnext) { /* Destroy the named vectors */ 347*974ca4ecSStefano Zampini nnext = nlink->next; 348*974ca4ecSStefano Zampini PetscCheck(nlink->status == DMVEC_STATUS_IN, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "DM still has local Vec named '%s' checked out", nlink->name); 349*974ca4ecSStefano Zampini PetscCall(PetscFree(nlink->name)); 350*974ca4ecSStefano Zampini PetscCall(VecDestroy(&nlink->X)); 351*974ca4ecSStefano Zampini PetscCall(PetscFree(nlink)); 352*974ca4ecSStefano Zampini } 353*974ca4ecSStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 354*974ca4ecSStefano Zampini } 355*974ca4ecSStefano Zampini 356e77ac854SMatthew G. Knepley /*@C 357e77ac854SMatthew G. Knepley DMHasNamedGlobalVector - check for a named, persistent global vector 358e77ac854SMatthew G. Knepley 359e77ac854SMatthew G. Knepley Not Collective 360e77ac854SMatthew G. Knepley 3614165533cSJose E. Roman Input Parameters: 36220f4b53cSBarry Smith + dm - `DM` to hold named vectors 36320f4b53cSBarry Smith - name - unique name for `Vec` 364e77ac854SMatthew G. Knepley 3654165533cSJose E. Roman Output Parameter: 366e77ac854SMatthew G. Knepley . exists - true if the vector was previously created 367e77ac854SMatthew G. Knepley 368e77ac854SMatthew G. Knepley Level: developer 369e77ac854SMatthew G. Knepley 37020f4b53cSBarry Smith .seealso: `DM`, `DMGetNamedGlobalVector()`, `DMRestoreNamedLocalVector()` 371e77ac854SMatthew G. Knepley @*/ 372d71ae5a4SJacob Faibussowitsch PetscErrorCode DMHasNamedGlobalVector(DM dm, const char *name, PetscBool *exists) 373d71ae5a4SJacob Faibussowitsch { 374e77ac854SMatthew G. Knepley DMNamedVecLink link; 375e77ac854SMatthew G. Knepley 376e77ac854SMatthew G. Knepley PetscFunctionBegin; 377e77ac854SMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 378e77ac854SMatthew G. Knepley PetscValidCharPointer(name, 2); 379534a8f05SLisandro Dalcin PetscValidBoolPointer(exists, 3); 380e77ac854SMatthew G. Knepley *exists = PETSC_FALSE; 381e77ac854SMatthew G. Knepley for (link = dm->namedglobal; link; link = link->next) { 382e77ac854SMatthew G. Knepley PetscBool match; 3839566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(name, link->name, &match)); 384e77ac854SMatthew G. Knepley if (match) { 385e77ac854SMatthew G. Knepley *exists = PETSC_TRUE; 386e77ac854SMatthew G. Knepley break; 387e77ac854SMatthew G. Knepley } 388e77ac854SMatthew G. Knepley } 3893ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 390e77ac854SMatthew G. Knepley } 391e77ac854SMatthew G. Knepley 39268260fa0SJed Brown /*@C 39368260fa0SJed Brown DMGetNamedGlobalVector - get access to a named, persistent global vector 39468260fa0SJed Brown 39520f4b53cSBarry Smith Collective 39668260fa0SJed Brown 3974165533cSJose E. Roman Input Parameters: 39820f4b53cSBarry Smith + dm - `DM` to hold named vectors 39920f4b53cSBarry Smith - name - unique name for `Vec` 40068260fa0SJed Brown 4014165533cSJose E. Roman Output Parameter: 40220f4b53cSBarry Smith . X - named `Vec` 40368260fa0SJed Brown 40468260fa0SJed Brown Level: developer 40568260fa0SJed Brown 40620f4b53cSBarry Smith Note: 40720f4b53cSBarry Smith If a `Vec` with the given name does not exist, it is created. 40868260fa0SJed Brown 40920f4b53cSBarry Smith .seealso: `DM`, `DMRestoreNamedGlobalVector()` 41068260fa0SJed Brown @*/ 411d71ae5a4SJacob Faibussowitsch PetscErrorCode DMGetNamedGlobalVector(DM dm, const char *name, Vec *X) 412d71ae5a4SJacob Faibussowitsch { 41368260fa0SJed Brown DMNamedVecLink link; 41468260fa0SJed Brown 41568260fa0SJed Brown PetscFunctionBegin; 41668260fa0SJed Brown PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 41768260fa0SJed Brown PetscValidCharPointer(name, 2); 41868260fa0SJed Brown PetscValidPointer(X, 3); 41968260fa0SJed Brown for (link = dm->namedglobal; link; link = link->next) { 42068260fa0SJed Brown PetscBool match; 4216eb26441SStefano Zampini 4229566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(name, link->name, &match)); 42368260fa0SJed Brown if (match) { 4246eb26441SStefano Zampini DM vdm; 4256eb26441SStefano Zampini 42608401ef6SPierre Jolivet PetscCheck(link->status == DMVEC_STATUS_IN, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Vec name '%s' already checked out", name); 4279566063dSJacob Faibussowitsch PetscCall(VecGetDM(link->X, &vdm)); 42828b400f6SJacob Faibussowitsch PetscCheck(!vdm, PetscObjectComm((PetscObject)vdm), PETSC_ERR_LIB, "Invalid vector"); 4299566063dSJacob Faibussowitsch PetscCall(VecSetDM(link->X, dm)); 43068260fa0SJed Brown goto found; 43168260fa0SJed Brown } 43268260fa0SJed Brown } 43368260fa0SJed Brown 43468260fa0SJed Brown /* Create the Vec */ 4359566063dSJacob Faibussowitsch PetscCall(PetscNew(&link)); 4369566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(name, &link->name)); 4379566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &link->X)); 43868260fa0SJed Brown link->next = dm->namedglobal; 43968260fa0SJed Brown dm->namedglobal = link; 44068260fa0SJed Brown 44168260fa0SJed Brown found: 44268260fa0SJed Brown *X = link->X; 44368260fa0SJed Brown link->status = DMVEC_STATUS_OUT; 4443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 44568260fa0SJed Brown } 44668260fa0SJed Brown 44768260fa0SJed Brown /*@C 44868260fa0SJed Brown DMRestoreNamedGlobalVector - restore access to a named, persistent global vector 44968260fa0SJed Brown 45020f4b53cSBarry Smith Collective 45168260fa0SJed Brown 4524165533cSJose E. Roman Input Parameters: 45320f4b53cSBarry Smith + dm - `DM` on which the vector was gotten 45468260fa0SJed Brown . name - name under which the vector was gotten 45520f4b53cSBarry Smith - X - `Vec` to restore 45668260fa0SJed Brown 45768260fa0SJed Brown Level: developer 45868260fa0SJed Brown 45920f4b53cSBarry Smith .seealso: `DM`, `DMGetNamedGlobalVector()` 46068260fa0SJed Brown @*/ 461d71ae5a4SJacob Faibussowitsch PetscErrorCode DMRestoreNamedGlobalVector(DM dm, const char *name, Vec *X) 462d71ae5a4SJacob Faibussowitsch { 46368260fa0SJed Brown DMNamedVecLink link; 46468260fa0SJed Brown 46568260fa0SJed Brown PetscFunctionBegin; 46668260fa0SJed Brown PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 46768260fa0SJed Brown PetscValidCharPointer(name, 2); 46868260fa0SJed Brown PetscValidPointer(X, 3); 46968260fa0SJed Brown PetscValidHeaderSpecific(*X, VEC_CLASSID, 3); 47068260fa0SJed Brown for (link = dm->namedglobal; link; link = link->next) { 47168260fa0SJed Brown PetscBool match; 4726eb26441SStefano Zampini 4739566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(name, link->name, &match)); 47468260fa0SJed Brown if (match) { 4756eb26441SStefano Zampini DM vdm; 4766eb26441SStefano Zampini 4779566063dSJacob Faibussowitsch PetscCall(VecGetDM(*X, &vdm)); 47808401ef6SPierre Jolivet PetscCheck(link->status == DMVEC_STATUS_OUT, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Vec name '%s' was not checked out", name); 47908401ef6SPierre Jolivet PetscCheck(link->X == *X, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_INCOMP, "Attempt to restore Vec name '%s', but Vec does not match the cache", name); 48008401ef6SPierre Jolivet PetscCheck(vdm == dm, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Invalid vector"); 4816eb26441SStefano Zampini 48268260fa0SJed Brown link->status = DMVEC_STATUS_IN; 4839566063dSJacob Faibussowitsch PetscCall(VecSetDM(link->X, NULL)); 4840298fd71SBarry Smith *X = NULL; 4853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 48668260fa0SJed Brown } 48768260fa0SJed Brown } 48898921bdaSJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_INCOMP, "Could not find Vec name '%s' to restore", name); 48968260fa0SJed Brown } 4902348bcf4SPeter Brune 491e77ac854SMatthew G. Knepley /*@C 492e77ac854SMatthew G. Knepley DMHasNamedLocalVector - check for a named, persistent local vector 493e77ac854SMatthew G. Knepley 494e77ac854SMatthew G. Knepley Not Collective 495e77ac854SMatthew G. Knepley 4964165533cSJose E. Roman Input Parameters: 49720f4b53cSBarry Smith + dm - `DM` to hold named vectors 49820f4b53cSBarry Smith - name - unique name for `Vec` 499e77ac854SMatthew G. Knepley 5004165533cSJose E. Roman Output Parameter: 501e77ac854SMatthew G. Knepley . exists - true if the vector was previously created 502e77ac854SMatthew G. Knepley 503e77ac854SMatthew G. Knepley Level: developer 504e77ac854SMatthew G. Knepley 50520f4b53cSBarry Smith Note: 50620f4b53cSBarry Smith If a `Vec` with the given name does not exist, it is created. 507e77ac854SMatthew G. Knepley 50820f4b53cSBarry Smith .seealso: `DM`, `DMGetNamedGlobalVector()`, `DMRestoreNamedLocalVector()` 509e77ac854SMatthew G. Knepley @*/ 510d71ae5a4SJacob Faibussowitsch PetscErrorCode DMHasNamedLocalVector(DM dm, const char *name, PetscBool *exists) 511d71ae5a4SJacob Faibussowitsch { 512e77ac854SMatthew G. Knepley DMNamedVecLink link; 513e77ac854SMatthew G. Knepley 514e77ac854SMatthew G. Knepley PetscFunctionBegin; 515e77ac854SMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 516e77ac854SMatthew G. Knepley PetscValidCharPointer(name, 2); 517dadcf809SJacob Faibussowitsch PetscValidBoolPointer(exists, 3); 518e77ac854SMatthew G. Knepley *exists = PETSC_FALSE; 519e77ac854SMatthew G. Knepley for (link = dm->namedlocal; link; link = link->next) { 520e77ac854SMatthew G. Knepley PetscBool match; 5219566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(name, link->name, &match)); 522e77ac854SMatthew G. Knepley if (match) { 523e77ac854SMatthew G. Knepley *exists = PETSC_TRUE; 524e77ac854SMatthew G. Knepley break; 525e77ac854SMatthew G. Knepley } 526e77ac854SMatthew G. Knepley } 5273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 528e77ac854SMatthew G. Knepley } 529e77ac854SMatthew G. Knepley 5302348bcf4SPeter Brune /*@C 5312348bcf4SPeter Brune DMGetNamedLocalVector - get access to a named, persistent local vector 5322348bcf4SPeter Brune 5332348bcf4SPeter Brune Not Collective 5342348bcf4SPeter Brune 5354165533cSJose E. Roman Input Parameters: 53620f4b53cSBarry Smith + dm - `DM` to hold named vectors 53720f4b53cSBarry Smith - name - unique name for `Vec` 5382348bcf4SPeter Brune 5394165533cSJose E. Roman Output Parameter: 54020f4b53cSBarry Smith . X - named `Vec` 5412348bcf4SPeter Brune 5422348bcf4SPeter Brune Level: developer 5432348bcf4SPeter Brune 54420f4b53cSBarry Smith Note: 54520f4b53cSBarry Smith If a `Vec` with the given name does not exist, it is created. 5462348bcf4SPeter Brune 54720f4b53cSBarry Smith .seealso: `DM`, `DMGetNamedGlobalVector()`, `DMRestoreNamedLocalVector()` 5482348bcf4SPeter Brune @*/ 549d71ae5a4SJacob Faibussowitsch PetscErrorCode DMGetNamedLocalVector(DM dm, const char *name, Vec *X) 550d71ae5a4SJacob Faibussowitsch { 5512348bcf4SPeter Brune DMNamedVecLink link; 5522348bcf4SPeter Brune 5532348bcf4SPeter Brune PetscFunctionBegin; 5542348bcf4SPeter Brune PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5552348bcf4SPeter Brune PetscValidCharPointer(name, 2); 5562348bcf4SPeter Brune PetscValidPointer(X, 3); 5572348bcf4SPeter Brune for (link = dm->namedlocal; link; link = link->next) { 5582348bcf4SPeter Brune PetscBool match; 5596eb26441SStefano Zampini 5609566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(name, link->name, &match)); 5612348bcf4SPeter Brune if (match) { 5626eb26441SStefano Zampini DM vdm; 5636eb26441SStefano Zampini 56408401ef6SPierre Jolivet PetscCheck(link->status == DMVEC_STATUS_IN, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Vec name '%s' already checked out", name); 5659566063dSJacob Faibussowitsch PetscCall(VecGetDM(link->X, &vdm)); 56628b400f6SJacob Faibussowitsch PetscCheck(!vdm, PetscObjectComm((PetscObject)vdm), PETSC_ERR_LIB, "Invalid vector"); 5679566063dSJacob Faibussowitsch PetscCall(VecSetDM(link->X, dm)); 5682348bcf4SPeter Brune goto found; 5692348bcf4SPeter Brune } 5702348bcf4SPeter Brune } 5712348bcf4SPeter Brune 5722348bcf4SPeter Brune /* Create the Vec */ 5739566063dSJacob Faibussowitsch PetscCall(PetscNew(&link)); 5749566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(name, &link->name)); 5759566063dSJacob Faibussowitsch PetscCall(DMCreateLocalVector(dm, &link->X)); 5762348bcf4SPeter Brune link->next = dm->namedlocal; 5772348bcf4SPeter Brune dm->namedlocal = link; 5782348bcf4SPeter Brune 5792348bcf4SPeter Brune found: 5802348bcf4SPeter Brune *X = link->X; 5812348bcf4SPeter Brune link->status = DMVEC_STATUS_OUT; 5823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5832348bcf4SPeter Brune } 5842348bcf4SPeter Brune 5852348bcf4SPeter Brune /*@C 5862348bcf4SPeter Brune DMRestoreNamedLocalVector - restore access to a named, persistent local vector 5872348bcf4SPeter Brune 5882348bcf4SPeter Brune Not Collective 5892348bcf4SPeter Brune 5904165533cSJose E. Roman Input Parameters: 59120f4b53cSBarry Smith + dm - `DM` on which the vector was gotten 5922348bcf4SPeter Brune . name - name under which the vector was gotten 59320f4b53cSBarry Smith - X - `Vec` to restore 5942348bcf4SPeter Brune 5952348bcf4SPeter Brune Level: developer 5962348bcf4SPeter Brune 59720f4b53cSBarry Smith .seealso: `DM`, `DMRestoreNamedGlobalVector()`, `DMGetNamedLocalVector()` 5982348bcf4SPeter Brune @*/ 599d71ae5a4SJacob Faibussowitsch PetscErrorCode DMRestoreNamedLocalVector(DM dm, const char *name, Vec *X) 600d71ae5a4SJacob Faibussowitsch { 6012348bcf4SPeter Brune DMNamedVecLink link; 6022348bcf4SPeter Brune 6032348bcf4SPeter Brune PetscFunctionBegin; 6042348bcf4SPeter Brune PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 6052348bcf4SPeter Brune PetscValidCharPointer(name, 2); 6062348bcf4SPeter Brune PetscValidPointer(X, 3); 6072348bcf4SPeter Brune PetscValidHeaderSpecific(*X, VEC_CLASSID, 3); 6082348bcf4SPeter Brune for (link = dm->namedlocal; link; link = link->next) { 6092348bcf4SPeter Brune PetscBool match; 6106eb26441SStefano Zampini 6119566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(name, link->name, &match)); 6122348bcf4SPeter Brune if (match) { 6136eb26441SStefano Zampini DM vdm; 6146eb26441SStefano Zampini 6159566063dSJacob Faibussowitsch PetscCall(VecGetDM(*X, &vdm)); 61608401ef6SPierre Jolivet PetscCheck(link->status == DMVEC_STATUS_OUT, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Vec name '%s' was not checked out", name); 61708401ef6SPierre Jolivet PetscCheck(link->X == *X, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_INCOMP, "Attempt to restore Vec name '%s', but Vec does not match the cache", name); 61808401ef6SPierre Jolivet PetscCheck(vdm == dm, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Invalid vector"); 6196eb26441SStefano Zampini 6202348bcf4SPeter Brune link->status = DMVEC_STATUS_IN; 6219566063dSJacob Faibussowitsch PetscCall(VecSetDM(link->X, NULL)); 6220298fd71SBarry Smith *X = NULL; 6233ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6242348bcf4SPeter Brune } 6252348bcf4SPeter Brune } 62698921bdaSJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_INCOMP, "Could not find Vec name '%s' to restore", name); 6272348bcf4SPeter Brune } 628