xref: /petsc/src/dm/interface/dmget.c (revision d8d19677bbccf95218448bee62e6b87f4513e133)
1af0996ceSBarry Smith #include <petsc/private/dmimpl.h> /*I "petscdm.h" I*/
268260fa0SJed Brown 
368260fa0SJed Brown /*@
46eb26441SStefano Zampini    DMGetLocalVector - Gets a PETSc vector that may be used with the DM local routines. This vector has spaces for the ghost values.
568260fa0SJed Brown 
668260fa0SJed Brown    Not Collective
768260fa0SJed Brown 
868260fa0SJed Brown    Input Parameter:
96eb26441SStefano Zampini .  dm - the dm
1068260fa0SJed Brown 
1168260fa0SJed Brown    Output Parameter:
1268260fa0SJed Brown .  g - the local vector
1368260fa0SJed Brown 
1468260fa0SJed Brown    Level: beginner
1568260fa0SJed Brown 
1668260fa0SJed Brown    Note:
1768260fa0SJed Brown    The vector values are NOT initialized and may have garbage in them, so you may need
1868260fa0SJed Brown    to zero them.
1968260fa0SJed Brown 
2068260fa0SJed Brown    The output parameter, g, is a regular PETSc vector that should be returned with
2168260fa0SJed Brown    DMRestoreLocalVector() DO NOT call VecDestroy() on it.
2268260fa0SJed Brown 
23f1978aafSBarry Smith    This is intended to be used for vectors you need for a short time, like within a single function call.
24f1978aafSBarry Smith    For vectors that you intend to keep around (for example in a C struct) or pass around large parts of your
25f1978aafSBarry Smith    code you should use DMCreateLocalVector().
26f1978aafSBarry Smith 
2768260fa0SJed Brown    VecStride*() operations can be useful when using DM with dof > 1
2868260fa0SJed Brown 
2968260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(),
3068260fa0SJed Brown           DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(),
3168260fa0SJed Brown           DMGlobalToLocalEnd(), DMLocalToGlobalBegin(), DMCreateLocalVector(), DMRestoreLocalVector(),
3268260fa0SJed Brown           VecStrideMax(), VecStrideMin(), VecStrideNorm()
3368260fa0SJed Brown @*/
3468260fa0SJed Brown PetscErrorCode  DMGetLocalVector(DM dm,Vec *g)
3568260fa0SJed Brown {
3668260fa0SJed Brown   PetscErrorCode ierr,i;
3768260fa0SJed Brown 
3868260fa0SJed Brown   PetscFunctionBegin;
3968260fa0SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4068260fa0SJed Brown   PetscValidPointer(g,2);
4168260fa0SJed Brown   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
4268260fa0SJed Brown     if (dm->localin[i]) {
436eb26441SStefano Zampini       DM vdm;
446eb26441SStefano Zampini 
4568260fa0SJed Brown       *g             = dm->localin[i];
460298fd71SBarry Smith       dm->localin[i] = NULL;
476eb26441SStefano Zampini 
486eb26441SStefano Zampini       ierr = VecGetDM(*g,&vdm);CHKERRQ(ierr);
496eb26441SStefano Zampini       if (vdm) SETERRQ(PetscObjectComm((PetscObject)vdm),PETSC_ERR_LIB,"Invalid vector");
506eb26441SStefano Zampini       ierr = VecSetDM(*g,dm);CHKERRQ(ierr);
5168260fa0SJed Brown       goto alldone;
5268260fa0SJed Brown     }
5368260fa0SJed Brown   }
5468260fa0SJed Brown   ierr = DMCreateLocalVector(dm,g);CHKERRQ(ierr);
5568260fa0SJed Brown 
5668260fa0SJed Brown alldone:
5768260fa0SJed Brown   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
5868260fa0SJed Brown     if (!dm->localout[i]) {
5968260fa0SJed Brown       dm->localout[i] = *g;
6068260fa0SJed Brown       break;
6168260fa0SJed Brown     }
6268260fa0SJed Brown   }
6368260fa0SJed Brown   PetscFunctionReturn(0);
6468260fa0SJed Brown }
6568260fa0SJed Brown 
6668260fa0SJed Brown /*@
676eb26441SStefano Zampini    DMRestoreLocalVector - Returns a PETSc vector that was
6868260fa0SJed Brown      obtained from DMGetLocalVector(). Do not use with vector obtained via
6968260fa0SJed Brown      DMCreateLocalVector().
7068260fa0SJed Brown 
7168260fa0SJed Brown    Not Collective
7268260fa0SJed Brown 
73*d8d19677SJose E. Roman    Input Parameters:
746eb26441SStefano Zampini +  dm - the dm
7568260fa0SJed Brown -  g - the local vector
7668260fa0SJed Brown 
7768260fa0SJed Brown    Level: beginner
7868260fa0SJed Brown 
7968260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(),
8068260fa0SJed Brown           DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(),
8168260fa0SJed Brown           DMGlobalToLocalEnd(), DMLocalToGlobalBegin(), DMCreateLocalVector(), DMGetLocalVector()
8268260fa0SJed Brown @*/
8368260fa0SJed Brown PetscErrorCode  DMRestoreLocalVector(DM dm,Vec *g)
8468260fa0SJed Brown {
8568260fa0SJed Brown   PetscErrorCode ierr;
8668260fa0SJed Brown   PetscInt       i,j;
8768260fa0SJed Brown 
8868260fa0SJed Brown   PetscFunctionBegin;
8968260fa0SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
9068260fa0SJed Brown   PetscValidPointer(g,2);
9168260fa0SJed Brown   for (j=0; j<DM_MAX_WORK_VECTORS; j++) {
9268260fa0SJed Brown     if (*g == dm->localout[j]) {
936eb26441SStefano Zampini       DM vdm;
946eb26441SStefano Zampini 
956eb26441SStefano Zampini       ierr = VecGetDM(*g,&vdm);CHKERRQ(ierr);
966eb26441SStefano Zampini       if (vdm != dm) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Invalid vector");
976eb26441SStefano Zampini       ierr = VecSetDM(*g,NULL);CHKERRQ(ierr);
980298fd71SBarry Smith       dm->localout[j] = NULL;
9968260fa0SJed Brown       for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
10068260fa0SJed Brown         if (!dm->localin[i]) {
10168260fa0SJed Brown           dm->localin[i] = *g;
10268260fa0SJed Brown           goto alldone;
10368260fa0SJed Brown         }
10468260fa0SJed Brown       }
10568260fa0SJed Brown     }
10668260fa0SJed Brown   }
10768260fa0SJed Brown   ierr = VecDestroy(g);CHKERRQ(ierr);
10868260fa0SJed Brown alldone:
109dd6887adSBarry Smith   *g = NULL;
11068260fa0SJed Brown   PetscFunctionReturn(0);
11168260fa0SJed Brown }
11268260fa0SJed Brown 
11368260fa0SJed Brown /*@
1146eb26441SStefano Zampini    DMGetGlobalVector - Gets a PETSc vector that may be used with the DM global routines.
11568260fa0SJed Brown 
116d083f849SBarry Smith    Collective on dm
11768260fa0SJed Brown 
11868260fa0SJed Brown    Input Parameter:
1196eb26441SStefano Zampini .  dm - the dm
12068260fa0SJed Brown 
12168260fa0SJed Brown    Output Parameter:
12268260fa0SJed Brown .  g - the global vector
12368260fa0SJed Brown 
12468260fa0SJed Brown    Level: beginner
12568260fa0SJed Brown 
12668260fa0SJed Brown    Note:
12768260fa0SJed Brown    The vector values are NOT initialized and may have garbage in them, so you may need
12868260fa0SJed Brown    to zero them.
12968260fa0SJed Brown 
13068260fa0SJed Brown    The output parameter, g, is a regular PETSc vector that should be returned with
13168260fa0SJed Brown    DMRestoreGlobalVector() DO NOT call VecDestroy() on it.
13268260fa0SJed Brown 
133f1978aafSBarry Smith    This is intended to be used for vectors you need for a short time, like within a single function call.
134f1978aafSBarry Smith    For vectors that you intend to keep around (for example in a C struct) or pass around large parts of your
135f1978aafSBarry Smith    code you should use DMCreateGlobalVector().
136f1978aafSBarry Smith 
13768260fa0SJed Brown    VecStride*() operations can be useful when using DM with dof > 1
13868260fa0SJed Brown 
13968260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(),
14068260fa0SJed Brown           DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(),
14168260fa0SJed Brown           DMGlobalToLocalEnd(), DMLocalToGlobalBegin(), DMCreateLocalVector(), DMRestoreLocalVector()
14268260fa0SJed Brown           VecStrideMax(), VecStrideMin(), VecStrideNorm()
14368260fa0SJed Brown @*/
14468260fa0SJed Brown PetscErrorCode  DMGetGlobalVector(DM dm,Vec *g)
14568260fa0SJed Brown {
14668260fa0SJed Brown   PetscErrorCode ierr;
14768260fa0SJed Brown   PetscInt       i;
14868260fa0SJed Brown 
14968260fa0SJed Brown   PetscFunctionBegin;
15068260fa0SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
15168260fa0SJed Brown   PetscValidPointer(g,2);
15268260fa0SJed Brown   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
15368260fa0SJed Brown     if (dm->globalin[i]) {
1546eb26441SStefano Zampini       DM vdm;
1556eb26441SStefano Zampini 
15668260fa0SJed Brown       *g              = dm->globalin[i];
1570298fd71SBarry Smith       dm->globalin[i] = NULL;
1586eb26441SStefano Zampini 
1596eb26441SStefano Zampini       ierr = VecGetDM(*g,&vdm);CHKERRQ(ierr);
1606eb26441SStefano Zampini       if (vdm) SETERRQ(PetscObjectComm((PetscObject)vdm),PETSC_ERR_LIB,"Invalid vector");
1616eb26441SStefano Zampini       ierr = VecSetDM(*g,dm);CHKERRQ(ierr);
16268260fa0SJed Brown       goto alldone;
16368260fa0SJed Brown     }
16468260fa0SJed Brown   }
16568260fa0SJed Brown   ierr = DMCreateGlobalVector(dm,g);CHKERRQ(ierr);
16668260fa0SJed Brown 
16768260fa0SJed Brown alldone:
16868260fa0SJed Brown   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
16968260fa0SJed Brown     if (!dm->globalout[i]) {
17068260fa0SJed Brown       dm->globalout[i] = *g;
17168260fa0SJed Brown       break;
17268260fa0SJed Brown     }
17368260fa0SJed Brown   }
17468260fa0SJed Brown   PetscFunctionReturn(0);
17568260fa0SJed Brown }
17668260fa0SJed Brown 
17768260fa0SJed Brown /*@
17868260fa0SJed Brown    DMClearGlobalVectors - Destroys all the global vectors that have been stashed in this DM
17968260fa0SJed Brown 
180d083f849SBarry Smith    Collective on dm
18168260fa0SJed Brown 
18268260fa0SJed Brown    Input Parameter:
1836eb26441SStefano Zampini .  dm - the dm
18468260fa0SJed Brown 
18568260fa0SJed Brown    Level: developer
18668260fa0SJed Brown 
18768260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(),
18868260fa0SJed Brown           DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(),
18968260fa0SJed Brown           DMGlobalToLocalEnd(), DMLocalToGlobalBegin(), DMCreateLocalVector(), DMRestoreLocalVector()
19068260fa0SJed Brown           VecStrideMax(), VecStrideMin(), VecStrideNorm()
19168260fa0SJed Brown @*/
19268260fa0SJed Brown PetscErrorCode  DMClearGlobalVectors(DM dm)
19368260fa0SJed Brown {
19468260fa0SJed Brown   PetscErrorCode ierr;
19568260fa0SJed Brown   PetscInt       i;
19668260fa0SJed Brown 
19768260fa0SJed Brown   PetscFunctionBegin;
19868260fa0SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
19968260fa0SJed Brown   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
20062d839e9SJed Brown     Vec g;
2016eb26441SStefano Zampini 
2026eb26441SStefano Zampini     if (dm->globalout[i]) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Clearing DM of global vectors that has a global vector obtained with DMGetGlobalVector()");
20362d839e9SJed Brown     g = dm->globalin[i];
20462d839e9SJed Brown     dm->globalin[i] = NULL;
2056eb26441SStefano Zampini     if (g) {
2066eb26441SStefano Zampini       DM vdm;
2076eb26441SStefano Zampini 
2086eb26441SStefano Zampini       ierr = VecGetDM(g,&vdm);CHKERRQ(ierr);
2096eb26441SStefano Zampini       if (vdm) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Clearing global vector that has a DM attached");
2106eb26441SStefano Zampini     }
21162d839e9SJed Brown     ierr = VecDestroy(&g);CHKERRQ(ierr);
21268260fa0SJed Brown   }
21368260fa0SJed Brown   PetscFunctionReturn(0);
21468260fa0SJed Brown }
21568260fa0SJed Brown 
21650eeb1caSToby Isaac /*@
21750eeb1caSToby Isaac    DMClearLocalVectors - Destroys all the local vectors that have been stashed in this DM
21850eeb1caSToby Isaac 
219d083f849SBarry Smith    Collective on dm
22050eeb1caSToby Isaac 
22150eeb1caSToby Isaac    Input Parameter:
2226eb26441SStefano Zampini .  dm - the dm
22350eeb1caSToby Isaac 
22450eeb1caSToby Isaac    Level: developer
22550eeb1caSToby Isaac 
22650eeb1caSToby Isaac .seealso: DMCreateLocalVector(), VecDuplicate(), VecDuplicateVecs(),
22750eeb1caSToby Isaac           DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMLocalToLocalBegin(),
22850eeb1caSToby Isaac           DMLocalToLocalEnd(), DMLocalToLocalBegin(), DMCreateLocalVector(), DMRestoreLocalVector()
22950eeb1caSToby Isaac           VecStrideMax(), VecStrideMin(), VecStrideNorm()
23050eeb1caSToby Isaac @*/
23150eeb1caSToby Isaac PetscErrorCode  DMClearLocalVectors(DM dm)
23250eeb1caSToby Isaac {
23350eeb1caSToby Isaac   PetscErrorCode ierr;
23450eeb1caSToby Isaac   PetscInt       i;
23550eeb1caSToby Isaac 
23650eeb1caSToby Isaac   PetscFunctionBegin;
23750eeb1caSToby Isaac   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
23850eeb1caSToby Isaac   for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
23950eeb1caSToby Isaac     Vec g;
2406eb26441SStefano Zampini 
2416eb26441SStefano Zampini     if (dm->localout[i]) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Clearing DM of local vectors that has a local vector obtained with DMGetLocalVector()");
24250eeb1caSToby Isaac     g = dm->localin[i];
24350eeb1caSToby Isaac     dm->localin[i] = NULL;
2446eb26441SStefano Zampini     if (g) {
2456eb26441SStefano Zampini       DM vdm;
2466eb26441SStefano Zampini 
2476eb26441SStefano Zampini       ierr = VecGetDM(g,&vdm);CHKERRQ(ierr);
2486eb26441SStefano Zampini       if (vdm) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Clearing local vector that has a DM attached");
2496eb26441SStefano Zampini     }
25050eeb1caSToby Isaac     ierr = VecDestroy(&g);CHKERRQ(ierr);
25150eeb1caSToby Isaac   }
25250eeb1caSToby Isaac   PetscFunctionReturn(0);
25350eeb1caSToby Isaac }
25450eeb1caSToby Isaac 
25568260fa0SJed Brown /*@
2566eb26441SStefano Zampini    DMRestoreGlobalVector - Returns a PETSc vector that
25768260fa0SJed Brown      obtained from DMGetGlobalVector(). Do not use with vector obtained via
25868260fa0SJed Brown      DMCreateGlobalVector().
25968260fa0SJed Brown 
26068260fa0SJed Brown    Not Collective
26168260fa0SJed Brown 
262*d8d19677SJose E. Roman    Input Parameters:
2636eb26441SStefano Zampini +  dm - the dm
26468260fa0SJed Brown -  g - the global vector
26568260fa0SJed Brown 
26668260fa0SJed Brown    Level: beginner
26768260fa0SJed Brown 
26868260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(),
26968260fa0SJed Brown           DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToGlobalBegin(),
27068260fa0SJed Brown           DMGlobalToGlobalEnd(), DMGlobalToGlobal(), DMCreateLocalVector(), DMGetGlobalVector()
27168260fa0SJed Brown @*/
27268260fa0SJed Brown PetscErrorCode  DMRestoreGlobalVector(DM dm,Vec *g)
27368260fa0SJed Brown {
27468260fa0SJed Brown   PetscErrorCode ierr;
27568260fa0SJed Brown   PetscInt       i,j;
27668260fa0SJed Brown 
27768260fa0SJed Brown   PetscFunctionBegin;
27868260fa0SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
27968260fa0SJed Brown   PetscValidPointer(g,2);
28085ea3df1SSatish Balay   ierr = VecSetErrorIfLocked(*g, 2);CHKERRQ(ierr);
28168260fa0SJed Brown   for (j=0; j<DM_MAX_WORK_VECTORS; j++) {
28268260fa0SJed Brown     if (*g == dm->globalout[j]) {
2836eb26441SStefano Zampini       DM vdm;
2846eb26441SStefano Zampini 
2856eb26441SStefano Zampini       ierr = VecGetDM(*g,&vdm);CHKERRQ(ierr);
2866eb26441SStefano Zampini       if (vdm != dm) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Invalid vector");
2876eb26441SStefano Zampini       ierr = VecSetDM(*g,NULL);CHKERRQ(ierr);
2880298fd71SBarry Smith       dm->globalout[j] = NULL;
28968260fa0SJed Brown       for (i=0; i<DM_MAX_WORK_VECTORS; i++) {
29068260fa0SJed Brown         if (!dm->globalin[i]) {
29168260fa0SJed Brown           dm->globalin[i] = *g;
29268260fa0SJed Brown           goto alldone;
29368260fa0SJed Brown         }
29468260fa0SJed Brown       }
29568260fa0SJed Brown     }
29668260fa0SJed Brown   }
29768260fa0SJed Brown   ierr = VecDestroy(g);CHKERRQ(ierr);
29868260fa0SJed Brown alldone:
299dd6887adSBarry Smith   *g = NULL;
30068260fa0SJed Brown   PetscFunctionReturn(0);
30168260fa0SJed Brown }
30268260fa0SJed Brown 
303e77ac854SMatthew G. Knepley /*@C
304e77ac854SMatthew G. Knepley    DMHasNamedGlobalVector - check for a named, persistent global vector
305e77ac854SMatthew G. Knepley 
306e77ac854SMatthew G. Knepley    Not Collective
307e77ac854SMatthew G. Knepley 
308e77ac854SMatthew G. Knepley    Input Arguments:
309e77ac854SMatthew G. Knepley +  dm - DM to hold named vectors
310e77ac854SMatthew G. Knepley -  name - unique name for Vec
311e77ac854SMatthew G. Knepley 
312e77ac854SMatthew G. Knepley    Output Arguments:
313e77ac854SMatthew G. Knepley .  exists - true if the vector was previously created
314e77ac854SMatthew G. Knepley 
315e77ac854SMatthew G. Knepley    Level: developer
316e77ac854SMatthew G. Knepley 
317e77ac854SMatthew G. Knepley    Note: If a Vec with the given name does not exist, it is created.
318e77ac854SMatthew G. Knepley 
319e77ac854SMatthew G. Knepley .seealso: DMGetNamedGlobalVector(), DMRestoreNamedLocalVector()
320e77ac854SMatthew G. Knepley @*/
321e77ac854SMatthew G. Knepley PetscErrorCode DMHasNamedGlobalVector(DM dm,const char *name,PetscBool *exists)
322e77ac854SMatthew G. Knepley {
323e77ac854SMatthew G. Knepley   PetscErrorCode ierr;
324e77ac854SMatthew G. Knepley   DMNamedVecLink link;
325e77ac854SMatthew G. Knepley 
326e77ac854SMatthew G. Knepley   PetscFunctionBegin;
327e77ac854SMatthew G. Knepley   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
328e77ac854SMatthew G. Knepley   PetscValidCharPointer(name,2);
329534a8f05SLisandro Dalcin   PetscValidBoolPointer(exists,3);
330e77ac854SMatthew G. Knepley   *exists = PETSC_FALSE;
331e77ac854SMatthew G. Knepley   for (link=dm->namedglobal; link; link=link->next) {
332e77ac854SMatthew G. Knepley     PetscBool match;
333e77ac854SMatthew G. Knepley     ierr = PetscStrcmp(name,link->name,&match);CHKERRQ(ierr);
334e77ac854SMatthew G. Knepley     if (match) {
335e77ac854SMatthew G. Knepley       *exists = PETSC_TRUE;
336e77ac854SMatthew G. Knepley       break;
337e77ac854SMatthew G. Knepley     }
338e77ac854SMatthew G. Knepley   }
339e77ac854SMatthew G. Knepley   PetscFunctionReturn(0);
340e77ac854SMatthew G. Knepley }
341e77ac854SMatthew G. Knepley 
34268260fa0SJed Brown /*@C
34368260fa0SJed Brown    DMGetNamedGlobalVector - get access to a named, persistent global vector
34468260fa0SJed Brown 
345d083f849SBarry Smith    Collective on dm
34668260fa0SJed Brown 
34768260fa0SJed Brown    Input Arguments:
34868260fa0SJed Brown +  dm - DM to hold named vectors
34968260fa0SJed Brown -  name - unique name for Vec
35068260fa0SJed Brown 
35168260fa0SJed Brown    Output Arguments:
35268260fa0SJed Brown .  X - named Vec
35368260fa0SJed Brown 
35468260fa0SJed Brown    Level: developer
35568260fa0SJed Brown 
35668260fa0SJed Brown    Note: If a Vec with the given name does not exist, it is created.
35768260fa0SJed Brown 
35868260fa0SJed Brown .seealso: DMRestoreNamedGlobalVector()
35968260fa0SJed Brown @*/
36068260fa0SJed Brown PetscErrorCode DMGetNamedGlobalVector(DM dm,const char *name,Vec *X)
36168260fa0SJed Brown {
36268260fa0SJed Brown   PetscErrorCode ierr;
36368260fa0SJed Brown   DMNamedVecLink link;
36468260fa0SJed Brown 
36568260fa0SJed Brown   PetscFunctionBegin;
36668260fa0SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
36768260fa0SJed Brown   PetscValidCharPointer(name,2);
36868260fa0SJed Brown   PetscValidPointer(X,3);
36968260fa0SJed Brown   for (link=dm->namedglobal; link; link=link->next) {
37068260fa0SJed Brown     PetscBool match;
3716eb26441SStefano Zampini 
37268260fa0SJed Brown     ierr = PetscStrcmp(name,link->name,&match);CHKERRQ(ierr);
37368260fa0SJed Brown     if (match) {
3746eb26441SStefano Zampini       DM vdm;
3756eb26441SStefano Zampini 
376ce94432eSBarry Smith       if (link->status != DMVEC_STATUS_IN) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Vec name '%s' already checked out",name);
3776eb26441SStefano Zampini       ierr = VecGetDM(link->X,&vdm);CHKERRQ(ierr);
3786eb26441SStefano Zampini       if (vdm) SETERRQ(PetscObjectComm((PetscObject)vdm),PETSC_ERR_LIB,"Invalid vector");
3796eb26441SStefano Zampini       ierr = VecSetDM(link->X,dm);CHKERRQ(ierr);
38068260fa0SJed Brown       goto found;
38168260fa0SJed Brown     }
38268260fa0SJed Brown   }
38368260fa0SJed Brown 
38468260fa0SJed Brown   /* Create the Vec */
385854ce69bSBarry Smith   ierr            = PetscNew(&link);CHKERRQ(ierr);
38668260fa0SJed Brown   ierr            = PetscStrallocpy(name,&link->name);CHKERRQ(ierr);
38768260fa0SJed Brown   ierr            = DMCreateGlobalVector(dm,&link->X);CHKERRQ(ierr);
38868260fa0SJed Brown   link->next      = dm->namedglobal;
38968260fa0SJed Brown   dm->namedglobal = link;
39068260fa0SJed Brown 
39168260fa0SJed Brown found:
39268260fa0SJed Brown   *X           = link->X;
39368260fa0SJed Brown   link->status = DMVEC_STATUS_OUT;
39468260fa0SJed Brown   PetscFunctionReturn(0);
39568260fa0SJed Brown }
39668260fa0SJed Brown 
39768260fa0SJed Brown /*@C
39868260fa0SJed Brown    DMRestoreNamedGlobalVector - restore access to a named, persistent global vector
39968260fa0SJed Brown 
400d083f849SBarry Smith    Collective on dm
40168260fa0SJed Brown 
40268260fa0SJed Brown    Input Arguments:
40368260fa0SJed Brown +  dm - DM on which the vector was gotten
40468260fa0SJed Brown .  name - name under which the vector was gotten
40568260fa0SJed Brown -  X - Vec to restore
40668260fa0SJed Brown 
40768260fa0SJed Brown    Output Arguments:
40868260fa0SJed Brown 
40968260fa0SJed Brown    Level: developer
41068260fa0SJed Brown 
41168260fa0SJed Brown .seealso: DMGetNamedGlobalVector()
41268260fa0SJed Brown @*/
41368260fa0SJed Brown PetscErrorCode DMRestoreNamedGlobalVector(DM dm,const char *name,Vec *X)
41468260fa0SJed Brown {
41568260fa0SJed Brown   PetscErrorCode ierr;
41668260fa0SJed Brown   DMNamedVecLink link;
41768260fa0SJed Brown 
41868260fa0SJed Brown   PetscFunctionBegin;
41968260fa0SJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
42068260fa0SJed Brown   PetscValidCharPointer(name,2);
42168260fa0SJed Brown   PetscValidPointer(X,3);
42268260fa0SJed Brown   PetscValidHeaderSpecific(*X,VEC_CLASSID,3);
42368260fa0SJed Brown   for (link=dm->namedglobal; link; link=link->next) {
42468260fa0SJed Brown     PetscBool match;
4256eb26441SStefano Zampini 
42668260fa0SJed Brown     ierr = PetscStrcmp(name,link->name,&match);CHKERRQ(ierr);
42768260fa0SJed Brown     if (match) {
4286eb26441SStefano Zampini       DM vdm;
4296eb26441SStefano Zampini 
4306eb26441SStefano Zampini       ierr = VecGetDM(*X,&vdm);CHKERRQ(ierr);
431ce94432eSBarry Smith       if (link->status != DMVEC_STATUS_OUT) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Vec name '%s' was not checked out",name);
432ce94432eSBarry Smith       if (link->X != *X) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Attempt to restore Vec name '%s', but Vec does not match the cache",name);
4336eb26441SStefano Zampini       if (vdm != dm) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Invalid vector");
4346eb26441SStefano Zampini 
43568260fa0SJed Brown       link->status = DMVEC_STATUS_IN;
4366eb26441SStefano Zampini       ierr         = VecSetDM(link->X,NULL);CHKERRQ(ierr);
4370298fd71SBarry Smith       *X           = NULL;
43868260fa0SJed Brown       PetscFunctionReturn(0);
43968260fa0SJed Brown     }
44068260fa0SJed Brown   }
441ce94432eSBarry Smith   SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Could not find Vec name '%s' to restore",name);
44268260fa0SJed Brown }
4432348bcf4SPeter Brune 
444e77ac854SMatthew G. Knepley /*@C
445e77ac854SMatthew G. Knepley    DMHasNamedLocalVector - check for a named, persistent local vector
446e77ac854SMatthew G. Knepley 
447e77ac854SMatthew G. Knepley    Not Collective
448e77ac854SMatthew G. Knepley 
449e77ac854SMatthew G. Knepley    Input Arguments:
450e77ac854SMatthew G. Knepley +  dm - DM to hold named vectors
451e77ac854SMatthew G. Knepley -  name - unique name for Vec
452e77ac854SMatthew G. Knepley 
453e77ac854SMatthew G. Knepley    Output Arguments:
454e77ac854SMatthew G. Knepley .  exists - true if the vector was previously created
455e77ac854SMatthew G. Knepley 
456e77ac854SMatthew G. Knepley    Level: developer
457e77ac854SMatthew G. Knepley 
458e77ac854SMatthew G. Knepley    Note: If a Vec with the given name does not exist, it is created.
459e77ac854SMatthew G. Knepley 
460e77ac854SMatthew G. Knepley .seealso: DMGetNamedGlobalVector(), DMRestoreNamedLocalVector()
461e77ac854SMatthew G. Knepley @*/
462e77ac854SMatthew G. Knepley PetscErrorCode DMHasNamedLocalVector(DM dm,const char *name,PetscBool *exists)
463e77ac854SMatthew G. Knepley {
464e77ac854SMatthew G. Knepley   PetscErrorCode ierr;
465e77ac854SMatthew G. Knepley   DMNamedVecLink link;
466e77ac854SMatthew G. Knepley 
467e77ac854SMatthew G. Knepley   PetscFunctionBegin;
468e77ac854SMatthew G. Knepley   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
469e77ac854SMatthew G. Knepley   PetscValidCharPointer(name,2);
470e77ac854SMatthew G. Knepley   PetscValidPointer(exists,3);
471e77ac854SMatthew G. Knepley   *exists = PETSC_FALSE;
472e77ac854SMatthew G. Knepley   for (link=dm->namedlocal; link; link=link->next) {
473e77ac854SMatthew G. Knepley     PetscBool match;
474e77ac854SMatthew G. Knepley     ierr = PetscStrcmp(name,link->name,&match);CHKERRQ(ierr);
475e77ac854SMatthew G. Knepley     if (match) {
476e77ac854SMatthew G. Knepley       *exists = PETSC_TRUE;
477e77ac854SMatthew G. Knepley       break;
478e77ac854SMatthew G. Knepley     }
479e77ac854SMatthew G. Knepley   }
480e77ac854SMatthew G. Knepley   PetscFunctionReturn(0);
481e77ac854SMatthew G. Knepley }
482e77ac854SMatthew G. Knepley 
4832348bcf4SPeter Brune /*@C
4842348bcf4SPeter Brune    DMGetNamedLocalVector - get access to a named, persistent local vector
4852348bcf4SPeter Brune 
4862348bcf4SPeter Brune    Not Collective
4872348bcf4SPeter Brune 
4882348bcf4SPeter Brune    Input Arguments:
4892348bcf4SPeter Brune +  dm - DM to hold named vectors
4902348bcf4SPeter Brune -  name - unique name for Vec
4912348bcf4SPeter Brune 
4922348bcf4SPeter Brune    Output Arguments:
4932348bcf4SPeter Brune .  X - named Vec
4942348bcf4SPeter Brune 
4952348bcf4SPeter Brune    Level: developer
4962348bcf4SPeter Brune 
4972348bcf4SPeter Brune    Note: If a Vec with the given name does not exist, it is created.
4982348bcf4SPeter Brune 
4992348bcf4SPeter Brune .seealso: DMGetNamedGlobalVector(), DMRestoreNamedLocalVector()
5002348bcf4SPeter Brune @*/
5012348bcf4SPeter Brune PetscErrorCode DMGetNamedLocalVector(DM dm,const char *name,Vec *X)
5022348bcf4SPeter Brune {
5032348bcf4SPeter Brune   PetscErrorCode ierr;
5042348bcf4SPeter Brune   DMNamedVecLink link;
5052348bcf4SPeter Brune 
5062348bcf4SPeter Brune   PetscFunctionBegin;
5072348bcf4SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5082348bcf4SPeter Brune   PetscValidCharPointer(name,2);
5092348bcf4SPeter Brune   PetscValidPointer(X,3);
5102348bcf4SPeter Brune   for (link=dm->namedlocal; link; link=link->next) {
5112348bcf4SPeter Brune     PetscBool match;
5126eb26441SStefano Zampini 
5132348bcf4SPeter Brune     ierr = PetscStrcmp(name,link->name,&match);CHKERRQ(ierr);
5142348bcf4SPeter Brune     if (match) {
5156eb26441SStefano Zampini       DM vdm;
5166eb26441SStefano Zampini 
517ce94432eSBarry Smith       if (link->status != DMVEC_STATUS_IN) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Vec name '%s' already checked out",name);
5186eb26441SStefano Zampini       ierr = VecGetDM(link->X,&vdm);CHKERRQ(ierr);
5196eb26441SStefano Zampini       if (vdm) SETERRQ(PetscObjectComm((PetscObject)vdm),PETSC_ERR_LIB,"Invalid vector");
5206eb26441SStefano Zampini       ierr = VecSetDM(link->X,dm);CHKERRQ(ierr);
5212348bcf4SPeter Brune       goto found;
5222348bcf4SPeter Brune     }
5232348bcf4SPeter Brune   }
5242348bcf4SPeter Brune 
5252348bcf4SPeter Brune   /* Create the Vec */
526854ce69bSBarry Smith   ierr           = PetscNew(&link);CHKERRQ(ierr);
5272348bcf4SPeter Brune   ierr           = PetscStrallocpy(name,&link->name);CHKERRQ(ierr);
5282348bcf4SPeter Brune   ierr           = DMCreateLocalVector(dm,&link->X);CHKERRQ(ierr);
5292348bcf4SPeter Brune   link->next     = dm->namedlocal;
5302348bcf4SPeter Brune   dm->namedlocal = link;
5312348bcf4SPeter Brune 
5322348bcf4SPeter Brune found:
5332348bcf4SPeter Brune   *X           = link->X;
5342348bcf4SPeter Brune   link->status = DMVEC_STATUS_OUT;
5352348bcf4SPeter Brune   PetscFunctionReturn(0);
5362348bcf4SPeter Brune }
5372348bcf4SPeter Brune 
5382348bcf4SPeter Brune /*@C
5392348bcf4SPeter Brune    DMRestoreNamedLocalVector - restore access to a named, persistent local vector
5402348bcf4SPeter Brune 
5412348bcf4SPeter Brune    Not Collective
5422348bcf4SPeter Brune 
5432348bcf4SPeter Brune    Input Arguments:
5442348bcf4SPeter Brune +  dm - DM on which the vector was gotten
5452348bcf4SPeter Brune .  name - name under which the vector was gotten
5462348bcf4SPeter Brune -  X - Vec to restore
5472348bcf4SPeter Brune 
5482348bcf4SPeter Brune    Output Arguments:
5492348bcf4SPeter Brune 
5502348bcf4SPeter Brune    Level: developer
5512348bcf4SPeter Brune 
5522348bcf4SPeter Brune .seealso: DMRestoreNamedGlobalVector(), DMGetNamedLocalVector()
5532348bcf4SPeter Brune @*/
5542348bcf4SPeter Brune PetscErrorCode DMRestoreNamedLocalVector(DM dm,const char *name,Vec *X)
5552348bcf4SPeter Brune {
5562348bcf4SPeter Brune   PetscErrorCode ierr;
5572348bcf4SPeter Brune   DMNamedVecLink link;
5582348bcf4SPeter Brune 
5592348bcf4SPeter Brune   PetscFunctionBegin;
5602348bcf4SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5612348bcf4SPeter Brune   PetscValidCharPointer(name,2);
5622348bcf4SPeter Brune   PetscValidPointer(X,3);
5632348bcf4SPeter Brune   PetscValidHeaderSpecific(*X,VEC_CLASSID,3);
5642348bcf4SPeter Brune   for (link=dm->namedlocal; link; link=link->next) {
5652348bcf4SPeter Brune     PetscBool match;
5666eb26441SStefano Zampini 
5672348bcf4SPeter Brune     ierr = PetscStrcmp(name,link->name,&match);CHKERRQ(ierr);
5682348bcf4SPeter Brune     if (match) {
5696eb26441SStefano Zampini       DM vdm;
5706eb26441SStefano Zampini 
5716eb26441SStefano Zampini       ierr = VecGetDM(*X,&vdm);CHKERRQ(ierr);
572ce94432eSBarry Smith       if (link->status != DMVEC_STATUS_OUT) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Vec name '%s' was not checked out",name);
573ce94432eSBarry Smith       if (link->X != *X) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Attempt to restore Vec name '%s', but Vec does not match the cache",name);
5746eb26441SStefano Zampini       if (vdm != dm) SETERRQ(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Invalid vector");
5756eb26441SStefano Zampini 
5762348bcf4SPeter Brune       link->status = DMVEC_STATUS_IN;
5776eb26441SStefano Zampini       ierr         = VecSetDM(link->X,NULL);CHKERRQ(ierr);
5780298fd71SBarry Smith       *X           = NULL;
5792348bcf4SPeter Brune       PetscFunctionReturn(0);
5802348bcf4SPeter Brune     }
5812348bcf4SPeter Brune   }
582ce94432eSBarry Smith   SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Could not find Vec name '%s' to restore",name);
5832348bcf4SPeter Brune }
584