| Line 28... |
Line 28... |
@*/
|
@*/
|
PetscErrorCode EPSSetUp(EPS eps)
|
PetscErrorCode EPSSetUp(EPS eps)
|
{
|
{
|
PetscErrorCode ierr;
|
PetscErrorCode ierr;
|
int i;
|
int i;
|
Vec v0;
|
Vec v0,w0;
|
Mat A,B;
|
Mat A,B;
|
|
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidHeaderSpecific(eps,EPS_COOKIE,1);
|
PetscValidHeaderSpecific(eps,EPS_COOKIE,1);
|
|
|
| Line 62... |
Line 62... |
}
|
}
|
} else if ((B && !eps->isgeneralized) || (!B && eps->isgeneralized)) {
|
} else if ((B && !eps->isgeneralized) || (!B && eps->isgeneralized)) {
|
SETERRQ(0,"Warning: Inconsistent EPS state");
|
SETERRQ(0,"Warning: Inconsistent EPS state");
|
}
|
}
|
|
|
/* Check if the EPS initial vector has been set */
|
/* Create random initial vectors if not set */
|
|
/* right */
|
ierr = EPSGetInitialVector(eps,&v0);CHKERRQ(ierr);
|
ierr = EPSGetInitialVector(eps,&v0);CHKERRQ(ierr);
|
if (!eps->vec_initial_set && !v0) {
|
if (!eps->vec_initial_set && !v0) {
|
ierr = MatGetVecs(A,&v0,PETSC_NULL);CHKERRQ(ierr);
|
ierr = MatGetVecs(A,&v0,PETSC_NULL);CHKERRQ(ierr);
|
ierr = SlepcVecSetRandom(v0);CHKERRQ(ierr);
|
ierr = SlepcVecSetRandom(v0);CHKERRQ(ierr);
|
eps->vec_initial = v0;
|
eps->vec_initial = v0;
|
|
}
|
|
/* left */
|
|
ierr = EPSGetLeftInitialVector(eps,&w0);CHKERRQ(ierr);
|
|
if (!eps->vec_initial_left_set && !w0) {
|
|
ierr = MatGetVecs(A,PETSC_NULL,&w0);CHKERRQ(ierr);
|
|
ierr = SlepcVecSetRandom(w0);CHKERRQ(ierr);
|
|
eps->vec_initial_left = w0;
|
}
|
}
|
|
|
ierr = (*eps->ops->setup)(eps);CHKERRQ(ierr);
|
ierr = (*eps->ops->setup)(eps);CHKERRQ(ierr);
|
ierr = STSetUp(eps->OP); CHKERRQ(ierr);
|
ierr = STSetUp(eps->OP); CHKERRQ(ierr);
|
|
|
| Line 108... |
Line 116... |
+ eps - the eigensolver context
|
+ eps - the eigensolver context
|
- vec - the vector
|
- vec - the vector
|
|
|
Level: intermediate
|
Level: intermediate
|
|
|
.seealso: EPSGetInitialVector()
|
.seealso: EPSGetInitialVector(), EPSSetLeftInitialVector()
|
|
|
@*/
|
@*/
|
PetscErrorCode EPSSetInitialVector(EPS eps,Vec vec)
|
PetscErrorCode EPSSetInitialVector(EPS eps,Vec vec)
|
{
|
{
|
PetscErrorCode ierr;
|
PetscErrorCode ierr;
|
| Line 145... |
Line 153... |
Output Parameter:
|
Output Parameter:
|
. vec - the vector
|
. vec - the vector
|
|
|
Level: intermediate
|
Level: intermediate
|
|
|
.seealso: EPSSetInitialVector()
|
.seealso: EPSSetInitialVector(), EPSGetLeftInitialVector()
|
|
|
@*/
|
@*/
|
PetscErrorCode EPSGetInitialVector(EPS eps,Vec *vec)
|
PetscErrorCode EPSGetInitialVector(EPS eps,Vec *vec)
|
{
|
{
|
PetscFunctionBegin;
|
PetscFunctionBegin;
|
PetscValidHeaderSpecific(eps,EPS_COOKIE,1);
|
PetscValidHeaderSpecific(eps,EPS_COOKIE,1);
|
*vec = eps->vec_initial;
|
*vec = eps->vec_initial;
|
|
PetscFunctionReturn(0);
|
|
}
|
|
|
|
#undef __FUNCT__
|
|
#define __FUNCT__ "EPSSetLeftInitialVector"
|
|
/*@
|
|
EPSSetInitialVector - Sets the initial vector from which the eigensolver
|
|
starts to iterate, corresponding to the left recurrence (two-sided solvers).
|
|
|
|
Collective on EPS and Vec
|
|
|
|
Input Parameters:
|
|
+ eps - the eigensolver context
|
|
- vec - the vector
|
|
|
|
Level: intermediate
|
|
|
|
.seealso: EPSGetLeftInitialVector(), EPSSetInitialVector()
|
|
|
|
@*/
|
|
PetscErrorCode EPSSetLeftInitialVector(EPS eps,Vec vec)
|
|
{
|
|
PetscErrorCode ierr;
|
|
|
|
PetscFunctionBegin;
|
|
PetscValidHeaderSpecific(eps,EPS_COOKIE,1);
|
|
PetscValidHeaderSpecific(vec,VEC_COOKIE,2);
|
|
PetscCheckSameComm(eps,1,vec,2);
|
|
if (eps->vec_initial_left) {
|
|
ierr = VecDestroy(eps->vec_initial_left); CHKERRQ(ierr);
|
|
}
|
|
eps->vec_initial_left = vec;
|
|
PetscObjectReference((PetscObject)eps->vec_initial_left);
|
|
eps->vec_initial_left_set = PETSC_TRUE;
|
|
PetscFunctionReturn(0);
|
|
}
|
|
|
|
#undef __FUNCT__
|
|
#define __FUNCT__ "EPSGetLeftInitialVector"
|
|
/*@
|
|
EPSGetInitialVector - Gets the left initial vector associated with the
|
|
eigensolver; if the vector was not set it will return a 0 pointer or
|
|
a vector randomly generated by EPSSetUp().
|
|
|
|
Not collective, but vector is shared by all processors that share the EPS
|
|
|
|
Input Parameter:
|
|
. eps - the eigensolver context
|
|
|
|
Output Parameter:
|
|
. vec - the vector
|
|
|
|
Level: intermediate
|
|
|
|
.seealso: EPSSetLeftInitialVector(), EPSGetLeftInitialVector()
|
|
|
|
@*/
|
|
PetscErrorCode EPSGetLeftInitialVector(EPS eps,Vec *vec)
|
|
{
|
|
PetscFunctionBegin;
|
|
PetscValidHeaderSpecific(eps,EPS_COOKIE,1);
|
|
*vec = eps->vec_initial_left;
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|
#undef __FUNCT__
|
#undef __FUNCT__
|
#define __FUNCT__ "EPSSetOperators"
|
#define __FUNCT__ "EPSSetOperators"
|
| Line 195... |
Line 265... |
if (m!=n) { SETERRQ(1,"B is a non-square matrix"); }
|
if (m!=n) { SETERRQ(1,"B is a non-square matrix"); }
|
}
|
}
|
|
|
ierr = STSetOperators(eps->OP,A,B);CHKERRQ(ierr);
|
ierr = STSetOperators(eps->OP,A,B);CHKERRQ(ierr);
|
eps->setupcalled = 0; /* so that next solve call will call setup */
|
eps->setupcalled = 0; /* so that next solve call will call setup */
|
|
|
|
/* Destroy randomly generated initial vectors */
|
if (!eps->vec_initial_set && eps->vec_initial) {
|
if (!eps->vec_initial_set && eps->vec_initial) {
|
ierr = VecDestroy(eps->vec_initial);CHKERRQ(ierr);
|
ierr = VecDestroy(eps->vec_initial);CHKERRQ(ierr);
|
eps->vec_initial = PETSC_NULL;
|
eps->vec_initial = PETSC_NULL;
|
|
}
|
|
if (!eps->vec_initial_left_set && eps->vec_initial_left) {
|
|
ierr = VecDestroy(eps->vec_initial_left);CHKERRQ(ierr);
|
|
eps->vec_initial_left = PETSC_NULL;
|
}
|
}
|
|
|
PetscFunctionReturn(0);
|
PetscFunctionReturn(0);
|
}
|
}
|
|
|