PetscErrorCode StokesSetupPC(Stokes* s, KSP ksp) { KSP* subksp; PC pc; PetscInt n = 1; PetscErrorCode ierr; PetscFunctionBeginUser; ierr = KSPGetPC(ksp, &pc); CHKERRQ(ierr); ierr = PCFieldSplitSetIS(pc, "0", s->isg[0]); CHKERRQ(ierr); ierr = PCFieldSplitSetIS(pc, "1", s->isg[1]); CHKERRQ(ierr); if (s->userPC) { ierr = PCFieldSplitSetSchurPre(pc, PC_FIELDSPLIT_SCHUR_PRE_USER, s->myS); CHKERRQ(ierr); } if (s->userKSP) { ierr = PCSetUp(pc); CHKERRQ(ierr); ierr = PCFieldSplitGetSubKSP(pc, &n, &subksp); CHKERRQ(ierr); ierr = KSPSetOperators(subksp[1], s->myS, s->myS); CHKERRQ(ierr); ierr = PetscFree(subksp); CHKERRQ(ierr); } PetscFunctionReturn(0); }
PETSC_EXTERN void PETSC_STDCALL pcfieldsplitsetschurpre_(PC pc,PCFieldSplitSchurPreType *ptype,Mat pre, int *__ierr ){ *__ierr = PCFieldSplitSetSchurPre( (PC)PetscToPointer((pc) ),*ptype, (Mat)PetscToPointer((pre) )); }