/*@ KSPUnwindPreconditioner - Unwinds the preconditioning in the solution. That is, takes solution to the preconditioned problem and gets the solution to the original problem from it. Collective on KSP Input Parameters: + ksp - iterative context . vsoln - solution vector - vt1 - temporary work vector Output Parameter: . vsoln - contains solution on output Notes: If preconditioning either symmetrically or on the right, this routine solves for the correction to the unpreconditioned problem. If preconditioning on the left, nothing is done. Level: advanced .keywords: KSP, unwind, preconditioner .seealso: KSPSetPCSide() @*/ PetscErrorCode KSPUnwindPreconditioner(KSP ksp,Vec vsoln,Vec vt1) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(ksp,KSP_CLASSID,1); PetscValidHeaderSpecific(vsoln,VEC_CLASSID,2); if (!ksp->pc) {ierr = KSPGetPC(ksp,&ksp->pc);CHKERRQ(ierr);} if (ksp->pc_side == PC_RIGHT) { ierr = KSP_PCApply(ksp,vsoln,vt1);CHKERRQ(ierr); ierr = PCDiagonalScaleRight(ksp->pc,vt1,vsoln);CHKERRQ(ierr); } else if (ksp->pc_side == PC_SYMMETRIC) { ierr = PCApplySymmetricRight(ksp->pc,vsoln,vt1);CHKERRQ(ierr); ierr = VecCopy(vt1,vsoln);CHKERRQ(ierr); } else { ierr = PCDiagonalScaleRight(ksp->pc,vsoln,vsoln);CHKERRQ(ierr); } PetscFunctionReturn(0); }
PETSC_EXTERN void PETSC_STDCALL pcdiagonalscaleright_(PC pc,Vec in,Vec out, int *__ierr ){ *__ierr = PCDiagonalScaleRight( (PC)PetscToPointer((pc) ), (Vec)PetscToPointer((in) ), (Vec)PetscToPointer((out) )); }