Subversion Repositories slepc-dev

Rev

Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 691 Rev 780
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);
}
}