Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
PETSC_EXTERN void PETSC_STDCALL  pcfieldsplitsetschurpre_(PC pc,PCFieldSplitSchurPreType *ptype,Mat pre, int *__ierr ){
*__ierr = PCFieldSplitSetSchurPre(
	(PC)PetscToPointer((pc) ),*ptype,
	(Mat)PetscToPointer((pre) ));
}