Actual source code: shift.c

  1: /*
  2:     Shift spectral transformation, applies (A + sigma I) as operator, or 
  3:     inv(B)(A + sigma B) for generalized problems
  4: */
 5:  #include src/st/stimpl.h

  9: PetscErrorCode STApply_Shift(ST st,Vec x,Vec y)
 10: {
 11:   PetscErrorCode ierr;

 14:   if (st->B) {
 15:     /* generalized eigenproblem: y = (B^-1 A + sI) x */
 16:     MatMult(st->A,x,st->w);
 17:     STAssociatedKSPSolve(st,st->w,y);
 18:   }
 19:   else {
 20:     /* standard eigenproblem: y = (A + sI) x */
 21:     MatMult(st->A,x,y);
 22:   }
 23:   if (st->sigma != 0.0) {
 24:     VecAXPY(&st->sigma,x,y);
 25:   }
 26:   return(0);
 27: }

 31: PetscErrorCode STApplyB_Shift(ST st,Vec x,Vec y)
 32: {
 33:   PetscErrorCode ierr;

 36:   VecCopy( x, y );
 37:   return(0);
 38: }

 42: PetscErrorCode STBackTransform_Shift(ST st,PetscScalar *eigr,PetscScalar *eigi)
 43: {
 45:   if (eigr) *eigr -= st->sigma;
 46:   return(0);
 47: }

 51: PetscErrorCode STSetUp_Shift(ST st)
 52: {
 53:   PetscErrorCode ierr;

 56:   if (st->B) {
 57:     KSPSetOperators(st->ksp,st->B,st->B,DIFFERENT_NONZERO_PATTERN);
 58:     KSPSetUp(st->ksp);
 59:   }
 60:   return(0);
 61: }


 66: PetscErrorCode STView_Shift(ST st,PetscViewer viewer)
 67: {
 68:   PetscErrorCode ierr;

 71:   if (st->B) {
 72:     STView_Default(st,viewer);
 73:   }
 74:   return(0);
 75: }

 77: EXTERN_C_BEGIN
 80: PetscErrorCode STCreate_Shift(ST st)
 81: {
 83:   st->ops->apply       = STApply_Shift;
 84:   st->ops->applyB      = STApplyB_Shift;
 85:   st->ops->applynoB    = STApply_Shift;
 86:   st->ops->backtr      = STBackTransform_Shift;
 87:   st->ops->setup       = STSetUp_Shift;
 88:   st->ops->view        = STView_Shift;
 89:   st->checknullspace   = 0;
 90:   return(0);
 91: }
 92: EXTERN_C_END