void PetscPreconditioner::set_petsc_subpreconditioner_type(const PCType type, PC& pc) { int ierr; KSP* subksps; int nlocal; ierr = PCASMGetSubKSP(pc, &nlocal, PETSC_NULL, &subksps); CHKERRABORT(MPI_COMM_WORLD, ierr); PetscReal epsilon = 1.e-16; for(int i = 0; i < nlocal; i++) { PC subpc; ierr = KSPGetPC(subksps[i], &subpc); CHKERRABORT(MPI_COMM_WORLD, ierr); ierr = KSPSetTolerances(subksps[i], PETSC_DEFAULT, PETSC_DEFAULT, PETSC_DEFAULT, 1); CHKERRABORT(MPI_COMM_WORLD, ierr); ierr = KSPSetFromOptions(subksps[i]); CHKERRABORT(MPI_COMM_WORLD, ierr); ierr = PCSetType(subpc, type); CHKERRABORT(MPI_COMM_WORLD, ierr); ierr = PCFactorSetZeroPivot(subpc, epsilon); CHKERRABORT(MPI_COMM_WORLD, ierr); ierr = PCFactorSetShiftType(subpc, MAT_SHIFT_NONZERO); CHKERRABORT(MPI_COMM_WORLD, ierr); } }
void PETSC_STDCALL pcfactorsetzeropivot_(PC pc,PetscReal *zero, int *__ierr ){ *__ierr = PCFactorSetZeroPivot( (PC)PetscToPointer((pc) ),*zero); }