/*! \brief KSP and PC type KSPRICHARDSON "richardson" KSPCHEBYCHEV "chebychev" KSPCG "cg" KSPCGNE "cgne" KSPNASH "nash" KSPSTCG "stcg" KSPGLTR "gltr" KSPGMRES "gmres" KSPFGMRES "fgmres" KSPLGMRES "lgmres" KSPDGMRES "dgmres" KSPTCQMR "tcqmr" KSPBCGS "bcgs" KSPIBCGS "ibcgs" KSPBCGSL "bcgsl" KSPCGS "cgs" KSPTFQMR "tfqmr" KSPCR "cr" KSPLSQR "lsqr" KSPPREONLY "preonly" KSPQCG "qcg" KSPBICG "bicg" KSPMINRES "minres" KSPSYMMLQ "symmlq" KSPLCD "lcd" KSPPYTHON "python" KSPBROYDEN "broyden" KSPGCR "gcr" KSPNGMRES "ngmres" KSPSPECEST "specest" PCNONE "none" PCJACOBI "jacobi" PCSOR "sor" PCLU "lu" PCSHELL "shell" PCBJACOBI "bjacobi" PCMG "mg" PCEISENSTAT "eisenstat" PCILU "ilu" PCICC "icc" PCASM "asm" PCGASM "gasm" PCKSP "ksp" PCCOMPOSITE "composite" PCREDUNDANT "redundant" PCSPAI "spai" PCNN "nn" PCCHOLESKY "cholesky" PCPBJACOBI "pbjacobi" PCMAT "mat" PCHYPRE "hypre" PCPARMS "parms" PCFIELDSPLIT "fieldsplit" PCTFS "tfs" PCML "ml" PCPROMETHEUS "prometheus" PCGALERKIN "galerkin" PCEXOTIC "exotic" PCHMPI "hmpi" PCSUPPORTGRAPH "supportgraph" PCASA "asa" PCCP "cp" PCBFBT "bfbt" PCLSC "lsc" PCPYTHON "python" PCPFMG "pfmg" PCSYSPFMG "syspfmg" PCREDISTRIBUTE "redistribute" PCSACUSP "sacusp" PCSACUSPPOLY "sacusppoly" PCBICGSTABCUSP "bicgstabcusp" PCSVD "svd" PCAINVCUSP "ainvcusp" PCGAMG "gamg" */ void PETScLinearSolver::Config(const PetscReal tol, const PetscInt maxits, const KSPType lsol, const PCType prec_type, const std::string &prefix) { ltolerance = tol; sol_type = lsol; pc_type = prec_type; KSPCreate(PETSC_COMM_WORLD,&lsolver); #if (PETSC_VERSION_MAJOR == 3) && (PETSC_VERSION_MINOR > 4) KSPSetOperators(lsolver, A, A); #else KSPSetOperators(lsolver, A, A, DIFFERENT_NONZERO_PATTERN); #endif KSPSetType(lsolver,lsol); KSPGetPC(lsolver, &prec); PCSetType(prec, prec_type); // PCJACOBI); //PCNONE); KSPSetTolerances(lsolver,ltolerance, PETSC_DEFAULT, PETSC_DEFAULT, maxits); if( !prefix.empty() ) { KSPSetOptionsPrefix(lsolver, prefix.c_str()); PCSetOptionsPrefix(prec, prefix.c_str()); } KSPSetFromOptions(lsolver); }
/// Do what is necessary to build this instance void p_build(const std::string& option_prefix) { PetscErrorCode ierr; try { parallel::Communicator comm(this->communicator()); if (this->p_doSerial) { comm = this->communicator().self(); } ierr = KSPCreate(comm, &p_KSP); CHKERRXX(ierr); if (!this->p_guessZero) { ierr = KSPSetInitialGuessNonzero(p_KSP,PETSC_TRUE); CHKERRXX(ierr); } else { ierr = KSPSetInitialGuessNonzero(p_KSP,PETSC_FALSE); CHKERRXX(ierr); } ierr = KSPSetOptionsPrefix(p_KSP, option_prefix.c_str()); CHKERRXX(ierr); PC pc; ierr = KSPGetPC(p_KSP, &pc); CHKERRXX(ierr); ierr = PCSetOptionsPrefix(pc, option_prefix.c_str()); CHKERRXX(ierr); ierr = KSPSetTolerances(p_KSP, LinearSolverImplementation<T, I>::p_relativeTolerance, LinearSolverImplementation<T, I>::p_solutionTolerance, PETSC_DEFAULT, LinearSolverImplementation<T, I>::p_maxIterations); CHKERRXX(ierr); ierr = KSPSetFromOptions(p_KSP);CHKERRXX(ierr); } catch (const PETSC_EXCEPTION_TYPE& e) { throw PETScException(ierr, e); } }
/*@C KSPSetOptionsPrefix - Sets the prefix used for searching for all KSP options in the database. Logically Collective on KSP Input Parameters: + ksp - the Krylov context - prefix - the prefix string to prepend to all KSP option requests Notes: A hyphen (-) must NOT be given at the beginning of the prefix name. The first character of all runtime options is AUTOMATICALLY the hyphen. For example, to distinguish between the runtime options for two different KSP contexts, one could call .vb KSPSetOptionsPrefix(ksp1,"sys1_") KSPSetOptionsPrefix(ksp2,"sys2_") .ve This would enable use of different options for each system, such as .vb -sys1_ksp_type gmres -sys1_ksp_rtol 1.e-3 -sys2_ksp_type bcgs -sys2_ksp_rtol 1.e-4 .ve Level: advanced .keywords: KSP, set, options, prefix, database .seealso: KSPAppendOptionsPrefix(), KSPGetOptionsPrefix() @*/ PetscErrorCode KSPSetOptionsPrefix(KSP ksp,const char prefix[]) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(ksp,KSP_CLASSID,1); if (!ksp->pc) {ierr = KSPGetPC(ksp,&ksp->pc);CHKERRQ(ierr);} ierr = PCSetOptionsPrefix(ksp->pc,prefix);CHKERRQ(ierr); ierr = PetscObjectSetOptionsPrefix((PetscObject)ksp,prefix);CHKERRQ(ierr); PetscFunctionReturn(0); }
// ------------------------------------------------------------- // PetscNonlinearSolverImplementation::p_build // ------------------------------------------------------------- void PetscNonlinearSolverImplementation::p_build(const std::string& option_prefix) { PetscErrorCode ierr(0); try { ierr = SNESCreate(this->communicator(), &p_snes); CHKERRXX(ierr); p_petsc_F = PETScVector(*p_F); if (!p_function.empty()) { ierr = SNESSetFunction(p_snes, *p_petsc_F, FormFunction, static_cast<void *>(this)); CHKERRXX(ierr); } p_petsc_J = PETScMatrix(*p_J); if (!p_jacobian.empty()) { ierr = SNESSetJacobian(p_snes, *p_petsc_J, *p_petsc_J, FormJacobian, static_cast<void *>(this)); CHKERRXX(ierr); } // set the ierr = SNESSetOptionsPrefix(p_snes, option_prefix.c_str()); CHKERRXX(ierr); KSP ksp; ierr = SNESGetKSP(p_snes, &ksp); CHKERRXX(ierr); ierr = KSPSetOptionsPrefix(ksp, option_prefix.c_str()); CHKERRXX(ierr); PC pc; ierr = KSPGetPC(ksp, &pc); CHKERRXX(ierr); ierr = PCSetOptionsPrefix(pc, option_prefix.c_str()); CHKERRXX(ierr); ierr = SNESMonitorSet(p_snes, MonitorNorms, PETSC_NULL, PETSC_NULL); CHKERRXX(ierr); ierr = SNESSetTolerances(p_snes, p_functionTolerance, PETSC_DEFAULT, p_solutionTolerance, p_maxIterations, PETSC_DEFAULT); ierr = SNESSetFromOptions(p_snes); CHKERRXX(ierr); } catch (const PETSC_EXCEPTION_TYPE& e) { throw PETScException(ierr, e); } }
static PetscErrorCode PCCompositeAddPC_Composite(PC pc,PCType type) { PC_Composite *jac; PC_CompositeLink next,ilink; PetscErrorCode ierr; PetscInt cnt = 0; const char *prefix; char newprefix[8]; PetscFunctionBegin; ierr = PetscNewLog(pc,&ilink);CHKERRQ(ierr); ilink->next = 0; ierr = PCCreate(PetscObjectComm((PetscObject)pc),&ilink->pc);CHKERRQ(ierr); ierr = PetscLogObjectParent((PetscObject)pc,(PetscObject)ilink->pc);CHKERRQ(ierr); jac = (PC_Composite*)pc->data; next = jac->head; if (!next) { jac->head = ilink; ilink->previous = NULL; } else { cnt++; while (next->next) { next = next->next; cnt++; } next->next = ilink; ilink->previous = next; } ierr = PCGetOptionsPrefix(pc,&prefix);CHKERRQ(ierr); ierr = PCSetOptionsPrefix(ilink->pc,prefix);CHKERRQ(ierr); sprintf(newprefix,"sub_%d_",(int)cnt); ierr = PCAppendOptionsPrefix(ilink->pc,newprefix);CHKERRQ(ierr); /* type is set after prefix, because some methods may modify prefix, e.g. pcksp */ ierr = PCSetType(ilink->pc,type);CHKERRQ(ierr); PetscFunctionReturn(0); }
*ierr = PCView(*pc,v); } PETSC_EXTERN void PETSC_STDCALL pcgetoperators_(PC *pc,Mat *mat,Mat *pmat,PetscErrorCode *ierr) { CHKFORTRANNULLOBJECTDEREFERENCE(mat); CHKFORTRANNULLOBJECTDEREFERENCE(pmat); *ierr = PCGetOperators(*pc,mat,pmat); } PETSC_EXTERN void PETSC_STDCALL pcsetoptionsprefix_(PC *pc,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) { char *t; FIXCHAR(prefix,len,t); *ierr = PCSetOptionsPrefix(*pc,t); FREECHAR(prefix,t); } PETSC_EXTERN void PETSC_STDCALL pcappendoptionsprefix_(PC *pc,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) { char *t; FIXCHAR(prefix,len,t); *ierr = PCAppendOptionsPrefix(*pc,t); FREECHAR(prefix,t); } PETSC_EXTERN void PETSC_STDCALL pcgetoptionsprefix_(PC *pc,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) { const char *tname;
#define pcgetoptionsprefix_ pcgetoptionsprefix #endif PETSC_EXTERN void PETSC_STDCALL pcview_(PC *pc,PetscViewer *viewer, PetscErrorCode *ierr) { PetscViewer v; PetscPatchDefaultViewers_Fortran(viewer,v); *ierr = PCView(*pc,v); } PETSC_EXTERN void PETSC_STDCALL pcsetoptionsprefix_(PC *pc,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) { char *t; FIXCHAR(prefix,len,t); *ierr = PCSetOptionsPrefix(*pc,t);if (*ierr) return; FREECHAR(prefix,t); } PETSC_EXTERN void PETSC_STDCALL pcappendoptionsprefix_(PC *pc,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) { char *t; FIXCHAR(prefix,len,t); *ierr = PCAppendOptionsPrefix(*pc,t);if (*ierr) return; FREECHAR(prefix,t); } PETSC_EXTERN void PETSC_STDCALL pcgetoptionsprefix_(PC *pc,char* prefix PETSC_MIXED_LEN(len),PetscErrorCode *ierr PETSC_END_LEN(len)) { const char *tname;