Subversion Repositories slepc-dev

Rev

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

Rev 2809 Rev 2814
Line 532... Line 532...
{
{
  PetscErrorCode ierr;
  PetscErrorCode ierr;
 
 
  PetscFunctionBegin;
  PetscFunctionBegin;
  PetscValidHeaderSpecific(ps,PS_CLASSID,1);
  PetscValidHeaderSpecific(ps,PS_CLASSID,1);
  if (!ps->ops->translate) SETERRQ1(((PetscObject)ps)->comm,PETSC_ERR_SUP,"PS type %s",((PetscObject)ps)->type_name);
  if (!ps->ops->transharm) SETERRQ1(((PetscObject)ps)->comm,PETSC_ERR_SUP,"PS type %s",((PetscObject)ps)->type_name);
  ierr = PetscLogEventBegin(PS_Other,ps,0,0,0);CHKERRQ(ierr);
  ierr = PetscLogEventBegin(PS_Other,ps,0,0,0);CHKERRQ(ierr);
  ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
  ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
  ierr = (*ps->ops->translate)(ps,tau,beta,recover,g,gamma);CHKERRQ(ierr);
  ierr = (*ps->ops->transharm)(ps,tau,beta,recover,g,gamma);CHKERRQ(ierr);
  ierr = PetscFPTrapPop();CHKERRQ(ierr);
  ierr = PetscFPTrapPop();CHKERRQ(ierr);
  ierr = PetscLogEventEnd(PS_Other,ps,0,0,0);CHKERRQ(ierr);
  ierr = PetscLogEventEnd(PS_Other,ps,0,0,0);CHKERRQ(ierr);
  ps->state = PS_STATE_RAW;
  ps->state = PS_STATE_RAW;
 
  ierr = PetscObjectStateIncrease((PetscObject)ps);CHKERRQ(ierr);
 
  PetscFunctionReturn(0);
 
}
 
 
 
#undef __FUNCT__  
 
#define __FUNCT__ "PSTranslateRKS"
 
/*@C
 
   PSTranslateRKS - Computes a modification of the projected matrix corresponding
 
   to an update of the shift in a rational Krylov method.
 
 
 
   Logically Collective on PS
 
 
 
   Input Parameters:
 
+  ps    - the projected system context
 
-  alpha - the translation amount
 
 
 
   Notes:
 
   This function is intended for use in the context of Krylov methods only.
 
   It takes the leading (k+1,k) submatrix of A, containing the truncated
 
   Rayleigh quotient of a Krylov-Schur relation computed from a shift
 
   sigma1 and transforms it to obtain a Krylov relation as if computed
 
   from a different shift sigma2. The new matrix is computed as
 
   1.0/alpha*(eye(k)-Q*inv(R)), where [Q,R]=qr(eye(k)-alpha*A) and
 
   alpha = sigma1-sigma2.
 
 
 
   Matrix Q is placed in PS_MAT_Q so that it can be used to update the
 
   Krylov basis.
 
 
 
   Level: developer
 
@*/
 
PetscErrorCode PSTranslateRKS(PS ps,PetscScalar alpha)
 
{
 
  PetscErrorCode ierr;
 
 
 
  PetscFunctionBegin;
 
  PetscValidHeaderSpecific(ps,PS_CLASSID,1);
 
  if (!ps->ops->transrks) SETERRQ1(((PetscObject)ps)->comm,PETSC_ERR_SUP,"PS type %s",((PetscObject)ps)->type_name);
 
  ierr = PetscLogEventBegin(PS_Other,ps,0,0,0);CHKERRQ(ierr);
 
  ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
 
  ierr = (*ps->ops->transrks)(ps,alpha);CHKERRQ(ierr);
 
  ierr = PetscFPTrapPop();CHKERRQ(ierr);
 
  ierr = PetscLogEventEnd(PS_Other,ps,0,0,0);CHKERRQ(ierr);
 
  ps->state   = PS_STATE_RAW;
 
  ps->compact = PETSC_FALSE;
  ierr = PetscObjectStateIncrease((PetscObject)ps);CHKERRQ(ierr);
  ierr = PetscObjectStateIncrease((PetscObject)ps);CHKERRQ(ierr);
  PetscFunctionReturn(0);
  PetscFunctionReturn(0);
}
}