168260fa0SJed Brown #include <petsc-private/dmimpl.h> /*I "petscdm.h" I*/ 268260fa0SJed Brown 368260fa0SJed Brown #undef __FUNCT__ 468260fa0SJed Brown #define __FUNCT__ "DMGetLocalVector" 568260fa0SJed Brown /*@ 668260fa0SJed Brown DMGetLocalVector - Gets a Seq PETSc vector that 768260fa0SJed Brown may be used with the DMXXX routines. This vector has spaces for the ghost values. 868260fa0SJed Brown 968260fa0SJed Brown Not Collective 1068260fa0SJed Brown 1168260fa0SJed Brown Input Parameter: 1268260fa0SJed Brown . dm - the distributed array 1368260fa0SJed Brown 1468260fa0SJed Brown Output Parameter: 1568260fa0SJed Brown . g - the local vector 1668260fa0SJed Brown 1768260fa0SJed Brown Level: beginner 1868260fa0SJed Brown 1968260fa0SJed Brown Note: 2068260fa0SJed Brown The vector values are NOT initialized and may have garbage in them, so you may need 2168260fa0SJed Brown to zero them. 2268260fa0SJed Brown 2368260fa0SJed Brown The output parameter, g, is a regular PETSc vector that should be returned with 2468260fa0SJed Brown DMRestoreLocalVector() DO NOT call VecDestroy() on it. 2568260fa0SJed Brown 2668260fa0SJed Brown VecStride*() operations can be useful when using DM with dof > 1 2768260fa0SJed Brown 2868260fa0SJed Brown .keywords: distributed array, create, local, vector 2968260fa0SJed Brown 3068260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(), 3168260fa0SJed Brown DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(), 3268260fa0SJed Brown DMGlobalToLocalEnd(), DMLocalToGlobalBegin(), DMCreateLocalVector(), DMRestoreLocalVector(), 3368260fa0SJed Brown VecStrideMax(), VecStrideMin(), VecStrideNorm() 3468260fa0SJed Brown @*/ 3568260fa0SJed Brown PetscErrorCode DMGetLocalVector(DM dm,Vec *g) 3668260fa0SJed Brown { 3768260fa0SJed Brown PetscErrorCode ierr,i; 3868260fa0SJed Brown 3968260fa0SJed Brown PetscFunctionBegin; 4068260fa0SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4168260fa0SJed Brown PetscValidPointer(g,2); 4268260fa0SJed Brown for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 4368260fa0SJed Brown if (dm->localin[i]) { 4468260fa0SJed Brown *g = dm->localin[i]; 450298fd71SBarry Smith dm->localin[i] = NULL; 4668260fa0SJed Brown goto alldone; 4768260fa0SJed Brown } 4868260fa0SJed Brown } 4968260fa0SJed Brown ierr = DMCreateLocalVector(dm,g);CHKERRQ(ierr); 5068260fa0SJed Brown 5168260fa0SJed Brown alldone: 5268260fa0SJed Brown for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 5368260fa0SJed Brown if (!dm->localout[i]) { 5468260fa0SJed Brown dm->localout[i] = *g; 5568260fa0SJed Brown break; 5668260fa0SJed Brown } 5768260fa0SJed Brown } 5868260fa0SJed Brown PetscFunctionReturn(0); 5968260fa0SJed Brown } 6068260fa0SJed Brown 6168260fa0SJed Brown #undef __FUNCT__ 6268260fa0SJed Brown #define __FUNCT__ "DMRestoreLocalVector" 6368260fa0SJed Brown /*@ 6468260fa0SJed Brown DMRestoreLocalVector - Returns a Seq PETSc vector that 6568260fa0SJed Brown obtained from DMGetLocalVector(). Do not use with vector obtained via 6668260fa0SJed Brown DMCreateLocalVector(). 6768260fa0SJed Brown 6868260fa0SJed Brown Not Collective 6968260fa0SJed Brown 7068260fa0SJed Brown Input Parameter: 7168260fa0SJed Brown + dm - the distributed array 7268260fa0SJed Brown - g - the local vector 7368260fa0SJed Brown 7468260fa0SJed Brown Level: beginner 7568260fa0SJed Brown 7668260fa0SJed Brown .keywords: distributed array, create, local, vector 7768260fa0SJed Brown 7868260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(), 7968260fa0SJed Brown DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(), 8068260fa0SJed Brown DMGlobalToLocalEnd(), DMLocalToGlobalBegin(), DMCreateLocalVector(), DMGetLocalVector() 8168260fa0SJed Brown @*/ 8268260fa0SJed Brown PetscErrorCode DMRestoreLocalVector(DM dm,Vec *g) 8368260fa0SJed Brown { 8468260fa0SJed Brown PetscErrorCode ierr; 8568260fa0SJed Brown PetscInt i,j; 8668260fa0SJed Brown 8768260fa0SJed Brown PetscFunctionBegin; 8868260fa0SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 8968260fa0SJed Brown PetscValidPointer(g,2); 9068260fa0SJed Brown for (j=0; j<DM_MAX_WORK_VECTORS; j++) { 9168260fa0SJed Brown if (*g == dm->localout[j]) { 920298fd71SBarry Smith dm->localout[j] = NULL; 9368260fa0SJed Brown for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 9468260fa0SJed Brown if (!dm->localin[i]) { 9568260fa0SJed Brown dm->localin[i] = *g; 9668260fa0SJed Brown goto alldone; 9768260fa0SJed Brown } 9868260fa0SJed Brown } 9968260fa0SJed Brown } 10068260fa0SJed Brown } 10168260fa0SJed Brown ierr = VecDestroy(g);CHKERRQ(ierr); 10268260fa0SJed Brown alldone: 103*dd6887adSBarry Smith *g = NULL; 10468260fa0SJed Brown PetscFunctionReturn(0); 10568260fa0SJed Brown } 10668260fa0SJed Brown 10768260fa0SJed Brown #undef __FUNCT__ 10868260fa0SJed Brown #define __FUNCT__ "DMGetGlobalVector" 10968260fa0SJed Brown /*@ 11068260fa0SJed Brown DMGetGlobalVector - Gets a MPI PETSc vector that 11168260fa0SJed Brown may be used with the DMXXX routines. 11268260fa0SJed Brown 11368260fa0SJed Brown Collective on DM 11468260fa0SJed Brown 11568260fa0SJed Brown Input Parameter: 11668260fa0SJed Brown . dm - the distributed array 11768260fa0SJed Brown 11868260fa0SJed Brown Output Parameter: 11968260fa0SJed Brown . g - the global vector 12068260fa0SJed Brown 12168260fa0SJed Brown Level: beginner 12268260fa0SJed Brown 12368260fa0SJed Brown Note: 12468260fa0SJed Brown The vector values are NOT initialized and may have garbage in them, so you may need 12568260fa0SJed Brown to zero them. 12668260fa0SJed Brown 12768260fa0SJed Brown The output parameter, g, is a regular PETSc vector that should be returned with 12868260fa0SJed Brown DMRestoreGlobalVector() DO NOT call VecDestroy() on it. 12968260fa0SJed Brown 13068260fa0SJed Brown VecStride*() operations can be useful when using DM with dof > 1 13168260fa0SJed Brown 13268260fa0SJed Brown .keywords: distributed array, create, Global, vector 13368260fa0SJed Brown 13468260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(), 13568260fa0SJed Brown DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(), 13668260fa0SJed Brown DMGlobalToLocalEnd(), DMLocalToGlobalBegin(), DMCreateLocalVector(), DMRestoreLocalVector() 13768260fa0SJed Brown VecStrideMax(), VecStrideMin(), VecStrideNorm() 13868260fa0SJed Brown 13968260fa0SJed Brown @*/ 14068260fa0SJed Brown PetscErrorCode DMGetGlobalVector(DM dm,Vec *g) 14168260fa0SJed Brown { 14268260fa0SJed Brown PetscErrorCode ierr; 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]) { 15068260fa0SJed Brown *g = dm->globalin[i]; 1510298fd71SBarry Smith dm->globalin[i] = NULL; 15268260fa0SJed Brown goto alldone; 15368260fa0SJed Brown } 15468260fa0SJed Brown } 15568260fa0SJed Brown ierr = DMCreateGlobalVector(dm,g);CHKERRQ(ierr); 15668260fa0SJed Brown 15768260fa0SJed Brown alldone: 15868260fa0SJed Brown for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 15968260fa0SJed Brown if (!dm->globalout[i]) { 16068260fa0SJed Brown dm->globalout[i] = *g; 16168260fa0SJed Brown break; 16268260fa0SJed Brown } 16368260fa0SJed Brown } 16468260fa0SJed Brown PetscFunctionReturn(0); 16568260fa0SJed Brown } 16668260fa0SJed Brown 16768260fa0SJed Brown #undef __FUNCT__ 16868260fa0SJed Brown #define __FUNCT__ "DMClearGlobalVectors" 16968260fa0SJed Brown /*@ 17068260fa0SJed Brown DMClearGlobalVectors - Destroys all the global vectors that have been stashed in this DM 17168260fa0SJed Brown 17268260fa0SJed Brown Collective on DM 17368260fa0SJed Brown 17468260fa0SJed Brown Input Parameter: 17568260fa0SJed Brown . dm - the distributed array 17668260fa0SJed Brown 17768260fa0SJed Brown Level: developer 17868260fa0SJed Brown 17968260fa0SJed Brown .keywords: distributed array, create, Global, vector 18068260fa0SJed Brown 18168260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(), 18268260fa0SJed Brown DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToLocalBegin(), 18368260fa0SJed Brown DMGlobalToLocalEnd(), DMLocalToGlobalBegin(), DMCreateLocalVector(), DMRestoreLocalVector() 18468260fa0SJed Brown VecStrideMax(), VecStrideMin(), VecStrideNorm() 18568260fa0SJed Brown 18668260fa0SJed Brown @*/ 18768260fa0SJed Brown PetscErrorCode DMClearGlobalVectors(DM dm) 18868260fa0SJed Brown { 18968260fa0SJed Brown PetscErrorCode ierr; 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; 19668260fa0SJed Brown if (dm->globalout[i]) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Clearing DM of global vectors that has a global vector obtained with DMGetGlobalVector()"); 19762d839e9SJed Brown g = dm->globalin[i]; 19862d839e9SJed Brown dm->globalin[i] = NULL; 19962d839e9SJed Brown ierr = VecDestroy(&g);CHKERRQ(ierr); 20068260fa0SJed Brown } 20168260fa0SJed Brown PetscFunctionReturn(0); 20268260fa0SJed Brown } 20368260fa0SJed Brown 20468260fa0SJed Brown #undef __FUNCT__ 20568260fa0SJed Brown #define __FUNCT__ "DMRestoreGlobalVector" 20668260fa0SJed Brown /*@ 20768260fa0SJed Brown DMRestoreGlobalVector - Returns a Seq PETSc vector that 20868260fa0SJed Brown obtained from DMGetGlobalVector(). Do not use with vector obtained via 20968260fa0SJed Brown DMCreateGlobalVector(). 21068260fa0SJed Brown 21168260fa0SJed Brown Not Collective 21268260fa0SJed Brown 21368260fa0SJed Brown Input Parameter: 21468260fa0SJed Brown + dm - the distributed array 21568260fa0SJed Brown - g - the global vector 21668260fa0SJed Brown 21768260fa0SJed Brown Level: beginner 21868260fa0SJed Brown 21968260fa0SJed Brown .keywords: distributed array, create, global, vector 22068260fa0SJed Brown 22168260fa0SJed Brown .seealso: DMCreateGlobalVector(), VecDuplicate(), VecDuplicateVecs(), 22268260fa0SJed Brown DMDACreate1d(), DMDACreate2d(), DMDACreate3d(), DMGlobalToGlobalBegin(), 22368260fa0SJed Brown DMGlobalToGlobalEnd(), DMGlobalToGlobal(), DMCreateLocalVector(), DMGetGlobalVector() 22468260fa0SJed Brown @*/ 22568260fa0SJed Brown PetscErrorCode DMRestoreGlobalVector(DM dm,Vec *g) 22668260fa0SJed Brown { 22768260fa0SJed Brown PetscErrorCode ierr; 22868260fa0SJed Brown PetscInt i,j; 22968260fa0SJed Brown 23068260fa0SJed Brown PetscFunctionBegin; 23168260fa0SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 23268260fa0SJed Brown PetscValidPointer(g,2); 23368260fa0SJed Brown for (j=0; j<DM_MAX_WORK_VECTORS; j++) { 23468260fa0SJed Brown if (*g == dm->globalout[j]) { 2350298fd71SBarry Smith dm->globalout[j] = NULL; 23668260fa0SJed Brown for (i=0; i<DM_MAX_WORK_VECTORS; i++) { 23768260fa0SJed Brown if (!dm->globalin[i]) { 23868260fa0SJed Brown dm->globalin[i] = *g; 23968260fa0SJed Brown goto alldone; 24068260fa0SJed Brown } 24168260fa0SJed Brown } 24268260fa0SJed Brown } 24368260fa0SJed Brown } 24468260fa0SJed Brown ierr = VecDestroy(g);CHKERRQ(ierr); 24568260fa0SJed Brown alldone: 246*dd6887adSBarry Smith *g = NULL; 24768260fa0SJed Brown PetscFunctionReturn(0); 24868260fa0SJed Brown } 24968260fa0SJed Brown 25068260fa0SJed Brown #undef __FUNCT__ 25168260fa0SJed Brown #define __FUNCT__ "DMGetNamedGlobalVector" 25268260fa0SJed Brown /*@C 25368260fa0SJed Brown DMGetNamedGlobalVector - get access to a named, persistent global vector 25468260fa0SJed Brown 25568260fa0SJed Brown Collective on DM 25668260fa0SJed Brown 25768260fa0SJed Brown Input Arguments: 25868260fa0SJed Brown + dm - DM to hold named vectors 25968260fa0SJed Brown - name - unique name for Vec 26068260fa0SJed Brown 26168260fa0SJed Brown Output Arguments: 26268260fa0SJed Brown . X - named Vec 26368260fa0SJed Brown 26468260fa0SJed Brown Level: developer 26568260fa0SJed Brown 26668260fa0SJed Brown Note: If a Vec with the given name does not exist, it is created. 26768260fa0SJed Brown 26868260fa0SJed Brown .seealso: DMRestoreNamedGlobalVector() 26968260fa0SJed Brown @*/ 27068260fa0SJed Brown PetscErrorCode DMGetNamedGlobalVector(DM dm,const char *name,Vec *X) 27168260fa0SJed Brown { 27268260fa0SJed Brown PetscErrorCode ierr; 27368260fa0SJed Brown DMNamedVecLink link; 27468260fa0SJed Brown 27568260fa0SJed Brown PetscFunctionBegin; 27668260fa0SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 27768260fa0SJed Brown PetscValidCharPointer(name,2); 27868260fa0SJed Brown PetscValidPointer(X,3); 27968260fa0SJed Brown for (link=dm->namedglobal; link; link=link->next) { 28068260fa0SJed Brown PetscBool match; 28168260fa0SJed Brown ierr = PetscStrcmp(name,link->name,&match);CHKERRQ(ierr); 28268260fa0SJed Brown if (match) { 283ce94432eSBarry Smith if (link->status != DMVEC_STATUS_IN) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Vec name '%s' already checked out",name); 28468260fa0SJed Brown goto found; 28568260fa0SJed Brown } 28668260fa0SJed Brown } 28768260fa0SJed Brown 28868260fa0SJed Brown /* Create the Vec */ 289854ce69bSBarry Smith ierr = PetscNew(&link);CHKERRQ(ierr); 29068260fa0SJed Brown ierr = PetscStrallocpy(name,&link->name);CHKERRQ(ierr); 29168260fa0SJed Brown ierr = DMCreateGlobalVector(dm,&link->X);CHKERRQ(ierr); 29268260fa0SJed Brown link->next = dm->namedglobal; 29368260fa0SJed Brown dm->namedglobal = link; 29468260fa0SJed Brown 29568260fa0SJed Brown found: 29668260fa0SJed Brown *X = link->X; 29768260fa0SJed Brown link->status = DMVEC_STATUS_OUT; 29868260fa0SJed Brown PetscFunctionReturn(0); 29968260fa0SJed Brown } 30068260fa0SJed Brown 30168260fa0SJed Brown #undef __FUNCT__ 30268260fa0SJed Brown #define __FUNCT__ "DMRestoreNamedGlobalVector" 30368260fa0SJed Brown /*@C 30468260fa0SJed Brown DMRestoreNamedGlobalVector - restore access to a named, persistent global vector 30568260fa0SJed Brown 30668260fa0SJed Brown Collective on DM 30768260fa0SJed Brown 30868260fa0SJed Brown Input Arguments: 30968260fa0SJed Brown + dm - DM on which the vector was gotten 31068260fa0SJed Brown . name - name under which the vector was gotten 31168260fa0SJed Brown - X - Vec to restore 31268260fa0SJed Brown 31368260fa0SJed Brown Output Arguments: 31468260fa0SJed Brown 31568260fa0SJed Brown Level: developer 31668260fa0SJed Brown 31768260fa0SJed Brown .seealso: DMGetNamedGlobalVector() 31868260fa0SJed Brown @*/ 31968260fa0SJed Brown PetscErrorCode DMRestoreNamedGlobalVector(DM dm,const char *name,Vec *X) 32068260fa0SJed Brown { 32168260fa0SJed Brown PetscErrorCode ierr; 32268260fa0SJed Brown DMNamedVecLink link; 32368260fa0SJed Brown 32468260fa0SJed Brown PetscFunctionBegin; 32568260fa0SJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 32668260fa0SJed Brown PetscValidCharPointer(name,2); 32768260fa0SJed Brown PetscValidPointer(X,3); 32868260fa0SJed Brown PetscValidHeaderSpecific(*X,VEC_CLASSID,3); 32968260fa0SJed Brown for (link=dm->namedglobal; link; link=link->next) { 33068260fa0SJed Brown PetscBool match; 33168260fa0SJed Brown ierr = PetscStrcmp(name,link->name,&match);CHKERRQ(ierr); 33268260fa0SJed Brown if (match) { 333ce94432eSBarry Smith if (link->status != DMVEC_STATUS_OUT) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Vec name '%s' was not checked out",name); 334ce94432eSBarry 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); 33568260fa0SJed Brown link->status = DMVEC_STATUS_IN; 3360298fd71SBarry Smith *X = NULL; 33768260fa0SJed Brown PetscFunctionReturn(0); 33868260fa0SJed Brown } 33968260fa0SJed Brown } 340ce94432eSBarry Smith SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Could not find Vec name '%s' to restore",name); 34168260fa0SJed Brown PetscFunctionReturn(0); 34268260fa0SJed Brown } 3432348bcf4SPeter Brune 3442348bcf4SPeter Brune #undef __FUNCT__ 3452348bcf4SPeter Brune #define __FUNCT__ "DMGetNamedLocalVector" 3462348bcf4SPeter Brune /*@C 3472348bcf4SPeter Brune DMGetNamedLocalVector - get access to a named, persistent local vector 3482348bcf4SPeter Brune 3492348bcf4SPeter Brune Not Collective 3502348bcf4SPeter Brune 3512348bcf4SPeter Brune Input Arguments: 3522348bcf4SPeter Brune + dm - DM to hold named vectors 3532348bcf4SPeter Brune - name - unique name for Vec 3542348bcf4SPeter Brune 3552348bcf4SPeter Brune Output Arguments: 3562348bcf4SPeter Brune . X - named Vec 3572348bcf4SPeter Brune 3582348bcf4SPeter Brune Level: developer 3592348bcf4SPeter Brune 3602348bcf4SPeter Brune Note: If a Vec with the given name does not exist, it is created. 3612348bcf4SPeter Brune 3622348bcf4SPeter Brune .seealso: DMGetNamedGlobalVector(),DMRestoreNamedLocalVector() 3632348bcf4SPeter Brune @*/ 3642348bcf4SPeter Brune PetscErrorCode DMGetNamedLocalVector(DM dm,const char *name,Vec *X) 3652348bcf4SPeter Brune { 3662348bcf4SPeter Brune PetscErrorCode ierr; 3672348bcf4SPeter Brune DMNamedVecLink link; 3682348bcf4SPeter Brune 3692348bcf4SPeter Brune PetscFunctionBegin; 3702348bcf4SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3712348bcf4SPeter Brune PetscValidCharPointer(name,2); 3722348bcf4SPeter Brune PetscValidPointer(X,3); 3732348bcf4SPeter Brune for (link=dm->namedlocal; link; link=link->next) { 3742348bcf4SPeter Brune PetscBool match; 3752348bcf4SPeter Brune ierr = PetscStrcmp(name,link->name,&match);CHKERRQ(ierr); 3762348bcf4SPeter Brune if (match) { 377ce94432eSBarry Smith if (link->status != DMVEC_STATUS_IN) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Vec name '%s' already checked out",name); 3782348bcf4SPeter Brune goto found; 3792348bcf4SPeter Brune } 3802348bcf4SPeter Brune } 3812348bcf4SPeter Brune 3822348bcf4SPeter Brune /* Create the Vec */ 383854ce69bSBarry Smith ierr = PetscNew(&link);CHKERRQ(ierr); 3842348bcf4SPeter Brune ierr = PetscStrallocpy(name,&link->name);CHKERRQ(ierr); 3852348bcf4SPeter Brune ierr = DMCreateLocalVector(dm,&link->X);CHKERRQ(ierr); 3862348bcf4SPeter Brune link->next = dm->namedlocal; 3872348bcf4SPeter Brune dm->namedlocal = link; 3882348bcf4SPeter Brune 3892348bcf4SPeter Brune found: 3902348bcf4SPeter Brune *X = link->X; 3912348bcf4SPeter Brune link->status = DMVEC_STATUS_OUT; 3922348bcf4SPeter Brune PetscFunctionReturn(0); 3932348bcf4SPeter Brune } 3942348bcf4SPeter Brune 3952348bcf4SPeter Brune #undef __FUNCT__ 3962348bcf4SPeter Brune #define __FUNCT__ "DMRestoreNamedLocalVector" 3972348bcf4SPeter Brune /*@C 3982348bcf4SPeter Brune DMRestoreNamedLocalVector - restore access to a named, persistent local vector 3992348bcf4SPeter Brune 4002348bcf4SPeter Brune Not Collective 4012348bcf4SPeter Brune 4022348bcf4SPeter Brune Input Arguments: 4032348bcf4SPeter Brune + dm - DM on which the vector was gotten 4042348bcf4SPeter Brune . name - name under which the vector was gotten 4052348bcf4SPeter Brune - X - Vec to restore 4062348bcf4SPeter Brune 4072348bcf4SPeter Brune Output Arguments: 4082348bcf4SPeter Brune 4092348bcf4SPeter Brune Level: developer 4102348bcf4SPeter Brune 4112348bcf4SPeter Brune .seealso: DMRestoreNamedGlobalVector(),DMGetNamedLocalVector() 4122348bcf4SPeter Brune @*/ 4132348bcf4SPeter Brune PetscErrorCode DMRestoreNamedLocalVector(DM dm,const char *name,Vec *X) 4142348bcf4SPeter Brune { 4152348bcf4SPeter Brune PetscErrorCode ierr; 4162348bcf4SPeter Brune DMNamedVecLink link; 4172348bcf4SPeter Brune 4182348bcf4SPeter Brune PetscFunctionBegin; 4192348bcf4SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4202348bcf4SPeter Brune PetscValidCharPointer(name,2); 4212348bcf4SPeter Brune PetscValidPointer(X,3); 4222348bcf4SPeter Brune PetscValidHeaderSpecific(*X,VEC_CLASSID,3); 4232348bcf4SPeter Brune for (link=dm->namedlocal; link; link=link->next) { 4242348bcf4SPeter Brune PetscBool match; 4252348bcf4SPeter Brune ierr = PetscStrcmp(name,link->name,&match);CHKERRQ(ierr); 4262348bcf4SPeter Brune if (match) { 427ce94432eSBarry Smith if (link->status != DMVEC_STATUS_OUT) SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_WRONGSTATE,"Vec name '%s' was not checked out",name); 428ce94432eSBarry 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); 4292348bcf4SPeter Brune link->status = DMVEC_STATUS_IN; 4300298fd71SBarry Smith *X = NULL; 4312348bcf4SPeter Brune PetscFunctionReturn(0); 4322348bcf4SPeter Brune } 4332348bcf4SPeter Brune } 434ce94432eSBarry Smith SETERRQ1(PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_INCOMP,"Could not find Vec name '%s' to restore",name); 4352348bcf4SPeter Brune PetscFunctionReturn(0); 4362348bcf4SPeter Brune } 437