PetscErrorCode KSPInitialResidual(KSP ksp,Vec vsoln,Vec vt1,Vec vt2,Vec vres,Vec vb) { Mat Amat,Pmat; PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(ksp,KSP_CLASSID,1); PetscValidHeaderSpecific(vsoln,VEC_CLASSID,2); PetscValidHeaderSpecific(vres,VEC_CLASSID,5); PetscValidHeaderSpecific(vb,VEC_CLASSID,6); if (!ksp->pc) {ierr = KSPGetPC(ksp,&ksp->pc);CHKERRQ(ierr);} ierr = PCGetOperators(ksp->pc,&Amat,&Pmat);CHKERRQ(ierr); if (!ksp->guess_zero) { /* skip right scaling since current guess already has it */ ierr = KSP_MatMult(ksp,Amat,vsoln,vt1);CHKERRQ(ierr); ierr = VecCopy(vb,vt2);CHKERRQ(ierr); ierr = VecAXPY(vt2,-1.0,vt1);CHKERRQ(ierr); ierr = (ksp->pc_side == PC_RIGHT) ? (VecCopy(vt2,vres)) : (KSP_PCApply(ksp,vt2,vres));CHKERRQ(ierr); ierr = PCDiagonalScaleLeft(ksp->pc,vres,vres);CHKERRQ(ierr); } else { ierr = VecCopy(vb,vt2);CHKERRQ(ierr); if (ksp->pc_side == PC_RIGHT) { ierr = PCDiagonalScaleLeft(ksp->pc,vb,vres);CHKERRQ(ierr); } else if (ksp->pc_side == PC_LEFT) { ierr = KSP_PCApply(ksp,vb,vres);CHKERRQ(ierr); ierr = PCDiagonalScaleLeft(ksp->pc,vres,vres);CHKERRQ(ierr); } else if (ksp->pc_side == PC_SYMMETRIC) { ierr = PCApplySymmetricLeft(ksp->pc, vb, vres);CHKERRQ(ierr); } else SETERRQ1(PetscObjectComm((PetscObject)ksp),PETSC_ERR_SUP, "Invalid preconditioning side %d", (int)ksp->pc_side); } PetscFunctionReturn(0); }
PETSC_EXTERN void PETSC_STDCALL pcdiagonalscaleleft_(PC pc,Vec in,Vec out, int *__ierr ){ *__ierr = PCDiagonalScaleLeft( (PC)PetscToPointer((pc) ), (Vec)PetscToPointer((in) ), (Vec)PetscToPointer((out) )); }