1af0996ceSBarry Smith #include <petsc/private/dmimpl.h> /*I "petscdm.h" I*/ 268260fa0SJed Brown 368260fa0SJed Brown /*@ 4*20f4b53cSBarry 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: 9*20f4b53cSBarry 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 20*20f4b53cSBarry Smith The output parameter, `g`, is a regular PETSc vector that should be returned with 21*20f4b53cSBarry 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 25*20f4b53cSBarry Smith code you should use `DMCreateLocalVector()`. 26f1978aafSBarry Smith 2768260fa0SJed Brown VecStride*() operations can be useful when using DM with dof > 1 2868260fa0SJed Brown 29*20f4b53cSBarry 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: 72*20f4b53cSBarry Smith + dm - the `DM` 7368260fa0SJed Brown - g - the local vector 7468260fa0SJed Brown 7568260fa0SJed Brown Level: beginner 7668260fa0SJed Brown 77*20f4b53cSBarry 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: 116*20f4b53cSBarry 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 127*20f4b53cSBarry 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 136*20f4b53cSBarry 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 /*@ 174*20f4b53cSBarry Smith DMClearGlobalVectors - Destroys all the global vectors that have been stashed in this `DM` 17568260fa0SJed Brown 176*20f4b53cSBarry Smith Collective 17768260fa0SJed Brown 17868260fa0SJed Brown Input Parameter: 179*20f4b53cSBarry Smith . dm - the `DM` 18068260fa0SJed Brown 18168260fa0SJed Brown Level: developer 18268260fa0SJed Brown 183*20f4b53cSBarry 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 /*@ 212*20f4b53cSBarry Smith DMClearLocalVectors - Destroys all the local vectors that have been stashed in this `DM` 21350eeb1caSToby Isaac 214*20f4b53cSBarry Smith Collective 21550eeb1caSToby Isaac 21650eeb1caSToby Isaac Input Parameter: 217*20f4b53cSBarry Smith . dm - the `DM` 21850eeb1caSToby Isaac 21950eeb1caSToby Isaac Level: developer 22050eeb1caSToby Isaac 221*20f4b53cSBarry 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 251*20f4b53cSBarry Smith obtained from `DMGetGlobalVector()`. Do not use with vector obtained via 252*20f4b53cSBarry Smith `DMCreateGlobalVector()`. 25368260fa0SJed Brown 25468260fa0SJed Brown Not Collective 25568260fa0SJed Brown 256d8d19677SJose E. Roman Input Parameters: 257*20f4b53cSBarry Smith + dm - the `DM` 25868260fa0SJed Brown - g - the global vector 25968260fa0SJed Brown 26068260fa0SJed Brown Level: beginner 26168260fa0SJed Brown 262*20f4b53cSBarry 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 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: 302*20f4b53cSBarry Smith + dm - `DM` to hold named vectors 303*20f4b53cSBarry Smith - 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 310*20f4b53cSBarry Smith .seealso: `DM`, `DMGetNamedGlobalVector()`, `DMRestoreNamedLocalVector()` 311e77ac854SMatthew G. Knepley @*/ 312d71ae5a4SJacob Faibussowitsch PetscErrorCode DMHasNamedGlobalVector(DM dm, const char *name, PetscBool *exists) 313d71ae5a4SJacob Faibussowitsch { 314e77ac854SMatthew G. Knepley DMNamedVecLink link; 315e77ac854SMatthew G. Knepley 316e77ac854SMatthew G. Knepley PetscFunctionBegin; 317e77ac854SMatthew G. Knepley PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 318e77ac854SMatthew G. Knepley PetscValidCharPointer(name, 2); 319534a8f05SLisandro Dalcin PetscValidBoolPointer(exists, 3); 320e77ac854SMatthew G. Knepley *exists = PETSC_FALSE; 321e77ac854SMatthew G. Knepley for (link = dm->namedglobal; link; link = link->next) { 322e77ac854SMatthew G. Knepley PetscBool match; 3239566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(name, link->name, &match)); 324e77ac854SMatthew G. Knepley if (match) { 325e77ac854SMatthew G. Knepley *exists = PETSC_TRUE; 326e77ac854SMatthew G. Knepley break; 327e77ac854SMatthew G. Knepley } 328e77ac854SMatthew G. Knepley } 3293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 330e77ac854SMatthew G. Knepley } 331e77ac854SMatthew G. Knepley 33268260fa0SJed Brown /*@C 33368260fa0SJed Brown DMGetNamedGlobalVector - get access to a named, persistent global vector 33468260fa0SJed Brown 335*20f4b53cSBarry Smith Collective 33668260fa0SJed Brown 3374165533cSJose E. Roman Input Parameters: 338*20f4b53cSBarry Smith + dm - `DM` to hold named vectors 339*20f4b53cSBarry Smith - name - unique name for `Vec` 34068260fa0SJed Brown 3414165533cSJose E. Roman Output Parameter: 342*20f4b53cSBarry Smith . X - named `Vec` 34368260fa0SJed Brown 34468260fa0SJed Brown Level: developer 34568260fa0SJed Brown 346*20f4b53cSBarry Smith Note: 347*20f4b53cSBarry Smith If a `Vec` with the given name does not exist, it is created. 34868260fa0SJed Brown 349*20f4b53cSBarry Smith .seealso: `DM`, `DMRestoreNamedGlobalVector()` 35068260fa0SJed Brown @*/ 351d71ae5a4SJacob Faibussowitsch PetscErrorCode DMGetNamedGlobalVector(DM dm, const char *name, Vec *X) 352d71ae5a4SJacob Faibussowitsch { 35368260fa0SJed Brown DMNamedVecLink link; 35468260fa0SJed Brown 35568260fa0SJed Brown PetscFunctionBegin; 35668260fa0SJed Brown PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 35768260fa0SJed Brown PetscValidCharPointer(name, 2); 35868260fa0SJed Brown PetscValidPointer(X, 3); 35968260fa0SJed Brown for (link = dm->namedglobal; link; link = link->next) { 36068260fa0SJed Brown PetscBool match; 3616eb26441SStefano Zampini 3629566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(name, link->name, &match)); 36368260fa0SJed Brown if (match) { 3646eb26441SStefano Zampini DM vdm; 3656eb26441SStefano Zampini 36608401ef6SPierre Jolivet PetscCheck(link->status == DMVEC_STATUS_IN, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Vec name '%s' already checked out", name); 3679566063dSJacob Faibussowitsch PetscCall(VecGetDM(link->X, &vdm)); 36828b400f6SJacob Faibussowitsch PetscCheck(!vdm, PetscObjectComm((PetscObject)vdm), PETSC_ERR_LIB, "Invalid vector"); 3699566063dSJacob Faibussowitsch PetscCall(VecSetDM(link->X, dm)); 37068260fa0SJed Brown goto found; 37168260fa0SJed Brown } 37268260fa0SJed Brown } 37368260fa0SJed Brown 37468260fa0SJed Brown /* Create the Vec */ 3759566063dSJacob Faibussowitsch PetscCall(PetscNew(&link)); 3769566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(name, &link->name)); 3779566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm, &link->X)); 37868260fa0SJed Brown link->next = dm->namedglobal; 37968260fa0SJed Brown dm->namedglobal = link; 38068260fa0SJed Brown 38168260fa0SJed Brown found: 38268260fa0SJed Brown *X = link->X; 38368260fa0SJed Brown link->status = DMVEC_STATUS_OUT; 3843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 38568260fa0SJed Brown } 38668260fa0SJed Brown 38768260fa0SJed Brown /*@C 38868260fa0SJed Brown DMRestoreNamedGlobalVector - restore access to a named, persistent global vector 38968260fa0SJed Brown 390*20f4b53cSBarry Smith Collective 39168260fa0SJed Brown 3924165533cSJose E. Roman Input Parameters: 393*20f4b53cSBarry Smith + dm - `DM` on which the vector was gotten 39468260fa0SJed Brown . name - name under which the vector was gotten 395*20f4b53cSBarry Smith - X - `Vec` to restore 39668260fa0SJed Brown 39768260fa0SJed Brown Level: developer 39868260fa0SJed Brown 399*20f4b53cSBarry Smith .seealso: `DM`, `DMGetNamedGlobalVector()` 40068260fa0SJed Brown @*/ 401d71ae5a4SJacob Faibussowitsch PetscErrorCode DMRestoreNamedGlobalVector(DM dm, const char *name, Vec *X) 402d71ae5a4SJacob Faibussowitsch { 40368260fa0SJed Brown DMNamedVecLink link; 40468260fa0SJed Brown 40568260fa0SJed Brown PetscFunctionBegin; 40668260fa0SJed Brown PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 40768260fa0SJed Brown PetscValidCharPointer(name, 2); 40868260fa0SJed Brown PetscValidPointer(X, 3); 40968260fa0SJed Brown PetscValidHeaderSpecific(*X, VEC_CLASSID, 3); 41068260fa0SJed Brown for (link = dm->namedglobal; link; link = link->next) { 41168260fa0SJed Brown PetscBool match; 4126eb26441SStefano Zampini 4139566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(name, link->name, &match)); 41468260fa0SJed Brown if (match) { 4156eb26441SStefano Zampini DM vdm; 4166eb26441SStefano Zampini 4179566063dSJacob Faibussowitsch PetscCall(VecGetDM(*X, &vdm)); 41808401ef6SPierre Jolivet PetscCheck(link->status == DMVEC_STATUS_OUT, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Vec name '%s' was not checked out", name); 41908401ef6SPierre 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); 42008401ef6SPierre Jolivet PetscCheck(vdm == dm, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Invalid vector"); 4216eb26441SStefano Zampini 42268260fa0SJed Brown link->status = DMVEC_STATUS_IN; 4239566063dSJacob Faibussowitsch PetscCall(VecSetDM(link->X, NULL)); 4240298fd71SBarry Smith *X = NULL; 4253ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 42668260fa0SJed Brown } 42768260fa0SJed Brown } 42898921bdaSJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_INCOMP, "Could not find Vec name '%s' to restore", name); 42968260fa0SJed Brown } 4302348bcf4SPeter Brune 431e77ac854SMatthew G. Knepley /*@C 432e77ac854SMatthew G. Knepley DMHasNamedLocalVector - check for a named, persistent local vector 433e77ac854SMatthew G. Knepley 434e77ac854SMatthew G. Knepley Not Collective 435e77ac854SMatthew G. Knepley 4364165533cSJose E. Roman Input Parameters: 437*20f4b53cSBarry Smith + dm - `DM` to hold named vectors 438*20f4b53cSBarry Smith - name - unique name for `Vec` 439e77ac854SMatthew G. Knepley 4404165533cSJose E. Roman Output Parameter: 441e77ac854SMatthew G. Knepley . exists - true if the vector was previously created 442e77ac854SMatthew G. Knepley 443e77ac854SMatthew G. Knepley Level: developer 444e77ac854SMatthew G. Knepley 445*20f4b53cSBarry Smith Note: 446*20f4b53cSBarry Smith If a `Vec` with the given name does not exist, it is created. 447e77ac854SMatthew G. Knepley 448*20f4b53cSBarry Smith .seealso: `DM`, `DMGetNamedGlobalVector()`, `DMRestoreNamedLocalVector()` 449e77ac854SMatthew G. Knepley @*/ 450d71ae5a4SJacob Faibussowitsch PetscErrorCode DMHasNamedLocalVector(DM dm, const char *name, PetscBool *exists) 451d71ae5a4SJacob Faibussowitsch { 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); 457dadcf809SJacob Faibussowitsch PetscValidBoolPointer(exists, 3); 458e77ac854SMatthew G. Knepley *exists = PETSC_FALSE; 459e77ac854SMatthew G. Knepley for (link = dm->namedlocal; link; link = link->next) { 460e77ac854SMatthew G. Knepley PetscBool match; 4619566063dSJacob Faibussowitsch PetscCall(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 } 4673ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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: 476*20f4b53cSBarry Smith + dm - `DM` to hold named vectors 477*20f4b53cSBarry Smith - name - unique name for `Vec` 4782348bcf4SPeter Brune 4794165533cSJose E. Roman Output Parameter: 480*20f4b53cSBarry Smith . X - named `Vec` 4812348bcf4SPeter Brune 4822348bcf4SPeter Brune Level: developer 4832348bcf4SPeter Brune 484*20f4b53cSBarry Smith Note: 485*20f4b53cSBarry Smith If a `Vec` with the given name does not exist, it is created. 4862348bcf4SPeter Brune 487*20f4b53cSBarry Smith .seealso: `DM`, `DMGetNamedGlobalVector()`, `DMRestoreNamedLocalVector()` 4882348bcf4SPeter Brune @*/ 489d71ae5a4SJacob Faibussowitsch PetscErrorCode DMGetNamedLocalVector(DM dm, const char *name, Vec *X) 490d71ae5a4SJacob Faibussowitsch { 4912348bcf4SPeter Brune DMNamedVecLink link; 4922348bcf4SPeter Brune 4932348bcf4SPeter Brune PetscFunctionBegin; 4942348bcf4SPeter Brune PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4952348bcf4SPeter Brune PetscValidCharPointer(name, 2); 4962348bcf4SPeter Brune PetscValidPointer(X, 3); 4972348bcf4SPeter Brune for (link = dm->namedlocal; link; link = link->next) { 4982348bcf4SPeter Brune PetscBool match; 4996eb26441SStefano Zampini 5009566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(name, link->name, &match)); 5012348bcf4SPeter Brune if (match) { 5026eb26441SStefano Zampini DM vdm; 5036eb26441SStefano Zampini 50408401ef6SPierre Jolivet PetscCheck(link->status == DMVEC_STATUS_IN, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Vec name '%s' already checked out", name); 5059566063dSJacob Faibussowitsch PetscCall(VecGetDM(link->X, &vdm)); 50628b400f6SJacob Faibussowitsch PetscCheck(!vdm, PetscObjectComm((PetscObject)vdm), PETSC_ERR_LIB, "Invalid vector"); 5079566063dSJacob Faibussowitsch PetscCall(VecSetDM(link->X, dm)); 5082348bcf4SPeter Brune goto found; 5092348bcf4SPeter Brune } 5102348bcf4SPeter Brune } 5112348bcf4SPeter Brune 5122348bcf4SPeter Brune /* Create the Vec */ 5139566063dSJacob Faibussowitsch PetscCall(PetscNew(&link)); 5149566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(name, &link->name)); 5159566063dSJacob Faibussowitsch PetscCall(DMCreateLocalVector(dm, &link->X)); 5162348bcf4SPeter Brune link->next = dm->namedlocal; 5172348bcf4SPeter Brune dm->namedlocal = link; 5182348bcf4SPeter Brune 5192348bcf4SPeter Brune found: 5202348bcf4SPeter Brune *X = link->X; 5212348bcf4SPeter Brune link->status = DMVEC_STATUS_OUT; 5223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5232348bcf4SPeter Brune } 5242348bcf4SPeter Brune 5252348bcf4SPeter Brune /*@C 5262348bcf4SPeter Brune DMRestoreNamedLocalVector - restore access to a named, persistent local vector 5272348bcf4SPeter Brune 5282348bcf4SPeter Brune Not Collective 5292348bcf4SPeter Brune 5304165533cSJose E. Roman Input Parameters: 531*20f4b53cSBarry Smith + dm - `DM` on which the vector was gotten 5322348bcf4SPeter Brune . name - name under which the vector was gotten 533*20f4b53cSBarry Smith - X - `Vec` to restore 5342348bcf4SPeter Brune 5352348bcf4SPeter Brune Level: developer 5362348bcf4SPeter Brune 537*20f4b53cSBarry Smith .seealso: `DM`, `DMRestoreNamedGlobalVector()`, `DMGetNamedLocalVector()` 5382348bcf4SPeter Brune @*/ 539d71ae5a4SJacob Faibussowitsch PetscErrorCode DMRestoreNamedLocalVector(DM dm, const char *name, Vec *X) 540d71ae5a4SJacob Faibussowitsch { 5412348bcf4SPeter Brune DMNamedVecLink link; 5422348bcf4SPeter Brune 5432348bcf4SPeter Brune PetscFunctionBegin; 5442348bcf4SPeter Brune PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5452348bcf4SPeter Brune PetscValidCharPointer(name, 2); 5462348bcf4SPeter Brune PetscValidPointer(X, 3); 5472348bcf4SPeter Brune PetscValidHeaderSpecific(*X, VEC_CLASSID, 3); 5482348bcf4SPeter Brune for (link = dm->namedlocal; link; link = link->next) { 5492348bcf4SPeter Brune PetscBool match; 5506eb26441SStefano Zampini 5519566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(name, link->name, &match)); 5522348bcf4SPeter Brune if (match) { 5536eb26441SStefano Zampini DM vdm; 5546eb26441SStefano Zampini 5559566063dSJacob Faibussowitsch PetscCall(VecGetDM(*X, &vdm)); 55608401ef6SPierre Jolivet PetscCheck(link->status == DMVEC_STATUS_OUT, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Vec name '%s' was not checked out", name); 55708401ef6SPierre 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); 55808401ef6SPierre Jolivet PetscCheck(vdm == dm, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_WRONGSTATE, "Invalid vector"); 5596eb26441SStefano Zampini 5602348bcf4SPeter Brune link->status = DMVEC_STATUS_IN; 5619566063dSJacob Faibussowitsch PetscCall(VecSetDM(link->X, NULL)); 5620298fd71SBarry Smith *X = NULL; 5633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5642348bcf4SPeter Brune } 5652348bcf4SPeter Brune } 56698921bdaSJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_INCOMP, "Could not find Vec name '%s' to restore", name); 5672348bcf4SPeter Brune } 568