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
270b3275a6SBarry Smith 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()`,
320b3275a6SBarry Smith `VecStrideMax()`, `VecStrideMin()`, `VecStrideNorm()`, `DMClearLocalVectors()`, `DMGetNamedGlobalVector()`, `DMGetNamedLocalVector()`
3368260fa0SJed Brown @*/
DMGetLocalVector(DM dm,Vec * g)34d71ae5a4SJacob Faibussowitsch PetscErrorCode DMGetLocalVector(DM dm, Vec *g)
35d71ae5a4SJacob Faibussowitsch {
3668260fa0SJed Brown PetscFunctionBegin;
3768260fa0SJed Brown PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
384f572ea9SToby Isaac PetscAssertPointer(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
7760225df5SJacob Faibussowitsch .seealso: `DM`, `DMCreateGlobalVector()`, `VecDuplicate()`, `VecDuplicateVecs()`,
78db781477SPatrick Sanan `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMGlobalToLocalBegin()`,
790b3275a6SBarry Smith `DMGlobalToLocalEnd()`, `DMLocalToGlobalBegin()`, `DMCreateLocalVector()`, `DMGetLocalVector()`, `DMClearLocalVectors()`
8068260fa0SJed Brown @*/
DMRestoreLocalVector(DM dm,Vec * g)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);
874f572ea9SToby Isaac PetscAssertPointer(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
1138f14a041SBarry Smith Collective
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
13660225df5SJacob Faibussowitsch .seealso: `DM`, `DMCreateGlobalVector()`, `VecDuplicate()`, `VecDuplicateVecs()`,
137db781477SPatrick Sanan `DMDACreate1d()`, `DMDACreate2d()`, `DMDACreate3d()`, `DMGlobalToLocalBegin()`,
138db781477SPatrick Sanan `DMGlobalToLocalEnd()`, `DMLocalToGlobalBegin()`, `DMCreateLocalVector()`, `DMRestoreLocalVector()`
1390b3275a6SBarry Smith `VecStrideMax()`, `VecStrideMin()`, `VecStrideNorm()`, `DMClearGlobalVectors()`, `DMGetNamedGlobalVector()`, `DMGetNamedLocalVector()`
14068260fa0SJed Brown @*/
DMGetGlobalVector(DM dm,Vec * g)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);
1474f572ea9SToby Isaac PetscAssertPointer(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 /*@
1740b3275a6SBarry Smith DMClearGlobalVectors - Destroys all the global vectors that have been created for `DMGetGlobalVector()` calls 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()`
1860b3275a6SBarry Smith `VecStrideMax()`, `VecStrideMin()`, `VecStrideNorm()`, `DMClearLocalVectors()`
18768260fa0SJed Brown @*/
DMClearGlobalVectors(DM dm)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 /*@
2120b3275a6SBarry Smith DMClearLocalVectors - Destroys all the local vectors that have been created for `DMGetLocalVector()` calls 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()`,
22360225df5SJacob Faibussowitsch `DMLocalToLocalEnd()`, `DMRestoreLocalVector()`
2240b3275a6SBarry Smith `VecStrideMax()`, `VecStrideMin()`, `VecStrideNorm()`, `DMClearGlobalVectors()`
22550eeb1caSToby Isaac @*/
DMClearLocalVectors(DM dm)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
235245d7360SStefano Zampini PetscCheck(!dm->localout[i], PETSC_COMM_SELF, 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));
242245d7360SStefano Zampini PetscCheck(!vdm, PETSC_COMM_SELF, 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()`,
2640b3275a6SBarry Smith `DMGlobalToGlobalEnd()`, `DMGlobalToGlobal()`, `DMCreateLocalVector()`, `DMGetGlobalVector()`, `DMClearGlobalVectors()`
26568260fa0SJed Brown @*/
DMRestoreGlobalVector(DM dm,Vec * g)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);
2724f572ea9SToby Isaac PetscAssertPointer(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
296974ca4ecSStefano Zampini /*@
2970b3275a6SBarry Smith DMClearNamedGlobalVectors - Destroys all the named global vectors that have been created with `DMGetNamedGlobalVector()` in this `DM`
298974ca4ecSStefano Zampini
299974ca4ecSStefano Zampini Collective
300974ca4ecSStefano Zampini
301974ca4ecSStefano Zampini Input Parameter:
302974ca4ecSStefano Zampini . dm - the `DM`
303974ca4ecSStefano Zampini
304974ca4ecSStefano Zampini Level: developer
305974ca4ecSStefano Zampini
306974ca4ecSStefano Zampini .seealso: `DM`, `DMGetNamedGlobalVector()`, `DMGetNamedLocalVector()`, `DMClearNamedLocalVectors()`
307974ca4ecSStefano Zampini @*/
DMClearNamedGlobalVectors(DM dm)308974ca4ecSStefano Zampini PetscErrorCode DMClearNamedGlobalVectors(DM dm)
309974ca4ecSStefano Zampini {
310974ca4ecSStefano Zampini DMNamedVecLink nnext;
311974ca4ecSStefano Zampini
312974ca4ecSStefano Zampini PetscFunctionBegin;
313974ca4ecSStefano Zampini PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
314974ca4ecSStefano Zampini nnext = dm->namedglobal;
315974ca4ecSStefano Zampini dm->namedglobal = NULL;
316974ca4ecSStefano Zampini for (DMNamedVecLink nlink = nnext; nlink; nlink = nnext) { /* Destroy the named vectors */
317974ca4ecSStefano Zampini nnext = nlink->next;
318974ca4ecSStefano 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);
319974ca4ecSStefano Zampini PetscCall(PetscFree(nlink->name));
320974ca4ecSStefano Zampini PetscCall(VecDestroy(&nlink->X));
321974ca4ecSStefano Zampini PetscCall(PetscFree(nlink));
322974ca4ecSStefano Zampini }
323974ca4ecSStefano Zampini PetscFunctionReturn(PETSC_SUCCESS);
324974ca4ecSStefano Zampini }
325974ca4ecSStefano Zampini
326974ca4ecSStefano Zampini /*@
3270b3275a6SBarry Smith DMClearNamedLocalVectors - Destroys all the named local vectors that have been created with `DMGetNamedLocalVector()` in this `DM`
328974ca4ecSStefano Zampini
329974ca4ecSStefano Zampini Collective
330974ca4ecSStefano Zampini
331974ca4ecSStefano Zampini Input Parameter:
332974ca4ecSStefano Zampini . dm - the `DM`
333974ca4ecSStefano Zampini
334974ca4ecSStefano Zampini Level: developer
335974ca4ecSStefano Zampini
336974ca4ecSStefano Zampini .seealso: `DM`, `DMGetNamedGlobalVector()`, `DMGetNamedLocalVector()`, `DMClearNamedGlobalVectors()`
337974ca4ecSStefano Zampini @*/
DMClearNamedLocalVectors(DM dm)338974ca4ecSStefano Zampini PetscErrorCode DMClearNamedLocalVectors(DM dm)
339974ca4ecSStefano Zampini {
340974ca4ecSStefano Zampini DMNamedVecLink nnext;
341974ca4ecSStefano Zampini
342974ca4ecSStefano Zampini PetscFunctionBegin;
343974ca4ecSStefano Zampini PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
344974ca4ecSStefano Zampini nnext = dm->namedlocal;
345974ca4ecSStefano Zampini dm->namedlocal = NULL;
346974ca4ecSStefano Zampini for (DMNamedVecLink nlink = nnext; nlink; nlink = nnext) { /* Destroy the named vectors */
347974ca4ecSStefano Zampini nnext = nlink->next;
348974ca4ecSStefano 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);
349974ca4ecSStefano Zampini PetscCall(PetscFree(nlink->name));
350974ca4ecSStefano Zampini PetscCall(VecDestroy(&nlink->X));
351974ca4ecSStefano Zampini PetscCall(PetscFree(nlink));
352974ca4ecSStefano Zampini }
353974ca4ecSStefano Zampini PetscFunctionReturn(PETSC_SUCCESS);
354974ca4ecSStefano Zampini }
355974ca4ecSStefano Zampini
356*5d83a8b1SBarry Smith /*@
3570b3275a6SBarry Smith DMHasNamedGlobalVector - check for a named, persistent global vector created with `DMGetNamedGlobalVector()`
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
3700b3275a6SBarry Smith .seealso: `DM`, `DMGetNamedGlobalVector()`, `DMRestoreNamedLocalVector()`, `DMClearNamedGlobalVectors()`
371e77ac854SMatthew G. Knepley @*/
DMHasNamedGlobalVector(DM dm,const char * name,PetscBool * exists)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);
3784f572ea9SToby Isaac PetscAssertPointer(name, 2);
3794f572ea9SToby Isaac PetscAssertPointer(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
392*5d83a8b1SBarry Smith /*@
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
3990b3275a6SBarry Smith - name - unique name for `X`
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
4090b3275a6SBarry Smith .seealso: `DM`, `DMRestoreNamedGlobalVector()`, `DMHasNamedGlobalVector()`, `DMClearNamedGlobalVectors()`, `DMGetGlobalVector()`, `DMGetLocalVector()`
41068260fa0SJed Brown @*/
DMGetNamedGlobalVector(DM dm,const char * name,Vec * X)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);
4174f572ea9SToby Isaac PetscAssertPointer(name, 2);
4184f572ea9SToby Isaac PetscAssertPointer(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
447*5d83a8b1SBarry Smith /*@
44868260fa0SJed Brown DMRestoreNamedGlobalVector - restore access to a named, persistent global vector
44968260fa0SJed Brown
45020f4b53cSBarry Smith Collective
45168260fa0SJed Brown
4524165533cSJose E. Roman Input Parameters:
4530b3275a6SBarry Smith + dm - `DM` on which `X` was gotten
4540b3275a6SBarry Smith . name - name under which `X` was gotten
45520f4b53cSBarry Smith - X - `Vec` to restore
45668260fa0SJed Brown
45768260fa0SJed Brown Level: developer
45868260fa0SJed Brown
4590b3275a6SBarry Smith .seealso: `DM`, `DMGetNamedGlobalVector()`, `DMClearNamedGlobalVectors()`
46068260fa0SJed Brown @*/
DMRestoreNamedGlobalVector(DM dm,const char * name,Vec * X)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);
4674f572ea9SToby Isaac PetscAssertPointer(name, 2);
4684f572ea9SToby Isaac PetscAssertPointer(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
491*5d83a8b1SBarry Smith /*@
4920b3275a6SBarry Smith DMHasNamedLocalVector - check for a named, persistent local vector created with `DMGetNamedLocalVector()`
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
5080b3275a6SBarry Smith .seealso: `DM`, `DMGetNamedGlobalVector()`, `DMRestoreNamedLocalVector()`, `DMClearNamedLocalVectors()`
509e77ac854SMatthew G. Knepley @*/
DMHasNamedLocalVector(DM dm,const char * name,PetscBool * exists)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);
5164f572ea9SToby Isaac PetscAssertPointer(name, 2);
5174f572ea9SToby Isaac PetscAssertPointer(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
530*5d83a8b1SBarry Smith /*@
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
5370b3275a6SBarry Smith - name - unique name for `X`
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
5470b3275a6SBarry Smith .seealso: `DM`, `DMGetNamedGlobalVector()`, `DMRestoreNamedLocalVector()`, `DMHasNamedLocalVector()`, `DMClearNamedLocalVectors()`, `DMGetGlobalVector()`, `DMGetLocalVector()`
5482348bcf4SPeter Brune @*/
DMGetNamedLocalVector(DM dm,const char * name,Vec * X)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);
5554f572ea9SToby Isaac PetscAssertPointer(name, 2);
5564f572ea9SToby Isaac PetscAssertPointer(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
585*5d83a8b1SBarry Smith /*@
5860b3275a6SBarry Smith DMRestoreNamedLocalVector - restore access to a named, persistent local vector obtained with `DMGetNamedLocalVector()`
5872348bcf4SPeter Brune
5882348bcf4SPeter Brune Not Collective
5892348bcf4SPeter Brune
5904165533cSJose E. Roman Input Parameters:
5910b3275a6SBarry Smith + dm - `DM` on which `X` was gotten
5920b3275a6SBarry Smith . name - name under which `X` was gotten
59320f4b53cSBarry Smith - X - `Vec` to restore
5942348bcf4SPeter Brune
5952348bcf4SPeter Brune Level: developer
5962348bcf4SPeter Brune
5970b3275a6SBarry Smith .seealso: `DM`, `DMRestoreNamedGlobalVector()`, `DMGetNamedLocalVector()`, `DMClearNamedLocalVectors()`
5982348bcf4SPeter Brune @*/
DMRestoreNamedLocalVector(DM dm,const char * name,Vec * X)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);
6054f572ea9SToby Isaac PetscAssertPointer(name, 2);
6064f572ea9SToby Isaac PetscAssertPointer(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