https://mooseframework.inl.gov
Classes | Functions
Moose::PetscSupport Namespace Reference

Classes

class  PetscOptions
 A struct for storing the various types of petsc options and values. More...
 

Functions

void petscSetOptions (const PetscOptions &po, const SolverParams &solver_params, FEProblemBase *const problem=nullptr)
 A function for setting the PETSc options in PETSc from the options supplied to MOOSE. More...
 
void petscSetOptions (const PetscOptions &po, const std::vector< SolverParams > &solver_params, FEProblemBase *problem)
 A function for setting the PETSc options in PETSc from the options supplied to MOOSE. More...
 
void petscSetKSPDefaults (FEProblemBase &problem, KSP ksp)
 Set the default options for a KSP. More...
 
template<typename T >
void setLinearSolverDefaults (FEProblemBase &problem, libMesh::LinearSolver< T > &linear_solver)
 Set the defaults for a libMesh LinearSolver. More...
 
void petscSetDefaults (FEProblemBase &problem)
 Sets the default options for PETSc. More...
 
PetscErrorCode petscSetupOutput (CommandLine *cmd_line)
 
void outputNorm (libMesh::Real old_norm, libMesh::Real norm, bool use_color=false)
 Helper function for outputting the norm values with/without color. More...
 
PetscErrorCode petscLinearMonitor (KSP, PetscInt its, PetscReal rnorm, void *void_ptr)
 Helper function for displaying the linear residual during PETSC solve. More...
 
void processSingletonMooseWrappedOptions (FEProblemBase &fe_problem, const InputParameters &params)
 Process some MOOSE-wrapped PETSc options. More...
 
void storePetscOptions (FEProblemBase &fe_problem, const std::string &prefix, const ParallelParamObject &param_object)
 Stores the PETSc options supplied from the parameter object on the problem. More...
 
void setConvergedReasonFlags (FEProblemBase &fe_problem, std::string prefix)
 Set flags that will instruct the user on the reason their simulation diverged from PETSc's perspective. More...
 
void setSolveTypeFromParams (FEProblemBase &fe_problem, const InputParameters &params)
 Sets the FE problem's solve type from the input params. More...
 
void setLineSearchFromParams (FEProblemBase &fe_problem, const InputParameters &params)
 Sets the FE problem's line search from the input params. More...
 
void setMFFDTypeFromParams (FEProblemBase &fe_problem, const InputParameters &params)
 Sets the FE problem's matrix-free finite difference type from the input params. More...
 
void storePetscOptionsFromParams (FEProblemBase &fe_problem, const InputParameters &params)
 Stores the Petsc flags and pair options fron the input params in the given PetscOptions object. More...
 
void addPetscFlagsToPetscOptions (const MultiMooseEnum &petsc_flags, std::string prefix, const ParallelParamObject &param_object, PetscOptions &petsc_options)
 Populate flags in a given PetscOptions object using a vector of input arguments. More...
 
void addPetscPairsToPetscOptions (const std::vector< std::pair< MooseEnumItem, std::string >> &petsc_pair_options, const unsigned int mesh_dimension, std::string prefix, const ParallelParamObject &param_object, PetscOptions &petsc_options)
 Populate name and value pairs in a given PetscOptions object using vectors of input arguments. More...
 
std::set< std::string > getPetscValidLineSearches ()
 Returns the valid petsc line search options as a set of strings. More...
 
InputParameters getPetscValidParams ()
 Returns the PETSc options that are common between Executioners and Preconditioners. More...
 
MultiMooseEnum getCommonPetscFlags ()
 A helper function to produce a MultiMooseEnum with commonly used PETSc single options (flags) More...
 
MultiMooseEnum getCommonSNESFlags ()
 A helper function to produce a MultiMooseEnum with commonly used PETSc snes single options (flags) More...
 
MultiMooseEnum getCommonKSPFlags ()
 A helper function to produce a MultiMooseEnum with commonly used PETSc ksp single options (flags) More...
 
MultiMooseEnum getCommonPetscKeys ()
 A helper function to produce a MultiMooseEnum with commonly used PETSc iname options (keys in key-value pairs) More...
 
MultiMooseEnum getCommonSNESKeys ()
 A helper function to produce a MultiMooseEnum with commonly used PETSc snes option names (keys) More...
 
MultiMooseEnum getCommonKSPKeys ()
 A helper function to produce a MultiMooseEnum with commonly used PETSc ksp option names (keys) More...
 
bool isSNESVI (FEProblemBase &fe_problem)
 check if SNES type is variational inequalities (VI) solver More...
 
void setSinglePetscOption (const std::string &name, const std::string &value="", FEProblemBase *const problem=nullptr)
 A wrapper function for dealing with different versions of PetscOptionsSetValue. More...
 
void setSinglePetscOptionIfAppropriate (const MultiMooseEnum &dont_add_these_options, const std::string &name, const std::string &value="", FEProblemBase *const problem=nullptr)
 Same as setSinglePetscOption, but does not set the option if it doesn't make sense for the current simulation type, e.g. More...
 
void addPetscOptionsFromCommandline ()
 
void petscSetDefaultPCSide (FEProblemBase &problem, KSP ksp)
 Setup which side we want to apply preconditioner. More...
 
void petscSetDefaultKSPNormType (FEProblemBase &problem, KSP ksp)
 Set norm type. More...
 
void colorAdjacencyMatrix (PetscScalar *adjacency_matrix, unsigned int size, unsigned int colors, std::vector< unsigned int > &vertex_colors, const char *coloring_algorithm)
 This method takes an adjacency matrix, and a desired number of colors and applies a graph coloring algorithm to produce a coloring. More...
 
void dontAddPetscFlag (const std::string &flag, PetscOptions &petsc_options)
 Function to ensure that a particular petsc option is not added to the PetscOptions storage object to be later set unless explicitly specified in input or on the command line. More...
 
void dontAddNonlinearConvergedReason (FEProblemBase &fe_problem)
 Function to ensure that -snes_converged_reason is not added to the PetscOptions storage object to be later set unless explicitly specified in input or on the command line. More...
 
void dontAddLinearConvergedReason (FEProblemBase &fe_problem)
 Function to ensure that -ksp_converged_reason is not added to the PetscOptions storage object to be later set unless explicitly specified in input or on the command line. More...
 
void dontAddCommonKSPOptions (FEProblemBase &fe_problem)
 Function to ensure that common KSP options are not added to the PetscOptions storage object to be later set unless explicitly specified in input or on the command line. More...
 
void dontAddCommonSNESOptions (FEProblemBase &fe_problem)
 Function to ensure that common SNES options are not added to the PetscOptions storage object to be later set unless explicitly specified in input or on the command line. More...
 
std::unique_ptr< PetscMatrix< Number > > createMatrixFromFile (const libMesh::Parallel::Communicator &comm, Mat &petsc_mat, const std::string &binary_mat_file, unsigned int mat_number_to_load=1)
 Create a matrix from a binary file. More...
 
std::string stringify (const LineSearchType &t)
 
std::string stringify (const MffdType &t)
 
void setSolverOptions (const SolverParams &solver_params, const MultiMooseEnum &dont_add_these_options)
 
void petscSetOptionsHelper (const PetscOptions &po, FEProblemBase *const problem)
 
PetscErrorCode petscNonlinearConverged (SNES, PetscInt it, PetscReal, PetscReal, PetscReal, SNESConvergedReason *reason, void *ctx)
 
PetscErrorCode petscLinearConverged (KSP, PetscInt it, PetscReal, KSPConvergedReason *reason, void *ctx)
 
PCSide getPetscPCSide (Moose::PCSideType pcs)
 
KSPNormType getPetscKSPNormType (Moose::MooseKSPNormType kspnorm)
 
template<typename T >
void checkUserProvidedPetscOption (const T &option, const ParallelParamObject &param_object)
 

Function Documentation

◆ addPetscFlagsToPetscOptions()

void Moose::PetscSupport::addPetscFlagsToPetscOptions ( const MultiMooseEnum petsc_flags,
std::string  prefix,
const ParallelParamObject param_object,
PetscOptions petsc_options 
)

Populate flags in a given PetscOptions object using a vector of input arguments.

Parameters
petsc_flagsContainer holding the flags of the petsc options
prefixThe prefix to add to the user provided petsc_flags. This should not contain a leading dash per PETSc prefix convention. Note that this function will immediately add said dash at the start of prefix so that later calls to PetscOptionsSetValue work. This is the reason we pass prefix by value
param_objectThe ParallelParamObject adding the PETSc options
petsc_optionsData structure which handles petsc options within moose

"-log_summary" cannot be used in the input file. This option needs to be set when PETSc is initialized which happens before the parser is even created. We'll throw an error if somebody attempts to add this option later.

"-log_summary" cannot be used in the input file. This option needs to be set when PETSc is initialized which happens before the parser is even created. We'll throw an error if somebody attempts to add this option later.

Definition at line 639 of file PetscSupport.C.

Referenced by storePetscOptions().

643 {
644  prefix.insert(prefix.begin(), '-');
645  checkPrefix(prefix);
646 
647  // Update the PETSc single flags
648  for (const auto & option : petsc_flags)
649  {
650  checkUserProvidedPetscOption(option, param_object);
651 
652  const std::string & string_option = option.name();
653 
660  if (option == "-log_summary" || option == "-log_view")
661  mooseError("The PETSc option \"-log_summary\" or \"-log_view\" can only be used on the "
662  "command line. Please "
663  "remove it from the input file");
664 
665  // Update the stored items, but do not create duplicates
666  const std::string prefixed_option = prefix + string_option.substr(1);
667  if (!po.flags.isValueSet(prefixed_option))
668  {
669  po.flags.setAdditionalValue(prefixed_option);
670  po.user_set_options.setAdditionalValue(prefixed_option);
671  }
672  }
673 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:323
void checkUserProvidedPetscOption(const T &option, const ParallelParamObject &param_object)
Definition: PetscSupport.C:631

◆ addPetscOptionsFromCommandline()

void Moose::PetscSupport::addPetscOptionsFromCommandline ( )

Definition at line 191 of file PetscSupport.C.

Referenced by petscSetOptionsHelper(), and Moose::SlepcSupport::slepcSetOptions().

192 {
193  // commandline options always win
194  // the options from a user commandline will overwrite the existing ones if any conflicts
195  { // Get any options specified on the command-line
196  int argc;
197  char ** args;
198 
199  LibmeshPetscCallA(PETSC_COMM_WORLD, PetscGetArgs(&argc, &args));
200 #if PETSC_VERSION_LESS_THAN(3, 7, 0)
201  LibmeshPetscCallA(PETSC_COMM_WORLD, PetscOptionsInsert(&argc, &args, NULL));
202 #else
203  LibmeshPetscCallA(PETSC_COMM_WORLD,
204  PetscOptionsInsert(LIBMESH_PETSC_NULLPTR, &argc, &args, NULL));
205 #endif
206  }
207 }

◆ addPetscPairsToPetscOptions()

void Moose::PetscSupport::addPetscPairsToPetscOptions ( const std::vector< std::pair< MooseEnumItem, std::string >> &  petsc_pair_options,
const unsigned int  mesh_dimension,
std::string  prefix,
const ParallelParamObject param_object,
PetscOptions petsc_options 
)

Populate name and value pairs in a given PetscOptions object using vectors of input arguments.

Parameters
petsc_pair_optionsOption-value pairs of petsc settings
mesh_dimensionThe mesh dimension, needed for multigrid settings
prefixThe prefix to add to the user provided petsc_pair_options. This should not contain a leading dash per PETSc prefix convention. Note that this function will immediately add said dash at the start of prefix so that later calls to PetscOptionsSetValue work. This is the reason we pass prefix by value
param_objectThe ParallelParamObject adding the PETSc options
petsc_optionsData structure which handles petsc options within moose

Definition at line 700 of file PetscSupport.C.

Referenced by PhysicsBase::addPetscPairsToPetscOptions(), and storePetscOptions().

706 {
707  prefix.insert(prefix.begin(), '-');
708  checkPrefix(prefix);
709 
710  // Setup the name value pairs
711  bool boomeramg_found = false;
712  bool strong_threshold_found = false;
713 #if !PETSC_VERSION_LESS_THAN(3, 7, 0)
714  bool superlu_dist_found = false;
715  bool fact_pattern_found = false;
716  bool tiny_pivot_found = false;
717 #endif
718  std::string pc_description = "";
719 #if !PETSC_VERSION_LESS_THAN(3, 12, 0)
720  // If users use HMG, we would like to set
721  bool hmg_found = false;
722  bool matptap_found = false;
723  bool hmg_strong_threshold_found = false;
724 #endif
725  std::vector<std::pair<std::string, std::string>> new_options;
726 
727  for (const auto & [option_name, option_value] : petsc_pair_options)
728  {
729  checkUserProvidedPetscOption(option_name, param_object);
730 
731  new_options.clear();
732  const std::string prefixed_option_name =
733  prefix + static_cast<const std::string &>(option_name).substr(1);
734 
735  // Do not add duplicate settings
736  if (auto it =
737  MooseUtils::findPair(po.pairs, po.pairs.begin(), prefixed_option_name, MooseUtils::Any);
738  it == po.pairs.end())
739  {
740 #if !PETSC_VERSION_LESS_THAN(3, 9, 0)
741  if (option_name == "-pc_factor_mat_solver_package")
742  new_options.emplace_back(prefix + "pc_factor_mat_solver_type", option_value);
743 #else
744  if (option_name == "-pc_factor_mat_solver_type")
745  new_options.push_back(prefix + "pc_factor_mat_solver_package", option_value);
746 #endif
747 
748  // Look for a pc description
749  if (option_name == "-pc_type" || option_name == "-sub_pc_type" ||
750  option_name == "-pc_hypre_type")
751  pc_description += option_value + ' ';
752 
753 #if !PETSC_VERSION_LESS_THAN(3, 12, 0)
754  if (option_name == "-pc_type" && option_value == "hmg")
755  hmg_found = true;
756 
757  // MPIAIJ for PETSc 3.12.0: -matptap_via
758  // MAIJ for PETSc 3.12.0: -matmaijptap_via
759  // MPIAIJ for PETSc 3.13 to 3.16: -matptap_via, -matproduct_ptap_via
760  // MAIJ for PETSc 3.13 to 3.16: -matproduct_ptap_via
761  // MPIAIJ for PETSc 3.17 and higher: -matptap_via, -mat_product_algorithm
762  // MAIJ for PETSc 3.17 and higher: -mat_product_algorithm
763 #if !PETSC_VERSION_LESS_THAN(3, 17, 0)
764  if (hmg_found && (option_name == "-matptap_via" || option_name == "-matmaijptap_via" ||
765  option_name == "-matproduct_ptap_via"))
766  new_options.emplace_back(prefix + "mat_product_algorithm", option_value);
767 #elif !PETSC_VERSION_LESS_THAN(3, 13, 0)
768  if (hmg_found && (option_name == "-matptap_via" || option_name == "-matmaijptap_via"))
769  new_options.emplace_back(prefix + "matproduct_ptap_via", option_value);
770 #else
771  if (hmg_found && (option_name == "-matproduct_ptap_via"))
772  {
773  new_options.emplace_back(prefix + "matptap_via", option_value);
774  new_options.emplace_back(prefix + "matmaijptap_via", option_value);
775  }
776 #endif
777 
778  if (option_name == "-matptap_via" || option_name == "-matmaijptap_via" ||
779  option_name == "-matproduct_ptap_via" || option_name == "-mat_product_algorithm")
780  matptap_found = true;
781 
782  // For 3D problems, we need to set this 0.7
783  if (option_name == "-hmg_inner_pc_hypre_boomeramg_strong_threshold")
784  hmg_strong_threshold_found = true;
785 #endif
786  // This special case is common enough that we'd like to handle it for the user.
787  if (option_name == "-pc_hypre_type" && option_value == "boomeramg")
788  boomeramg_found = true;
789  if (option_name == "-pc_hypre_boomeramg_strong_threshold")
790  strong_threshold_found = true;
791 #if !PETSC_VERSION_LESS_THAN(3, 7, 0)
792  if ((option_name == "-pc_factor_mat_solver_package" ||
793  option_name == "-pc_factor_mat_solver_type") &&
794  option_value == "superlu_dist")
795  superlu_dist_found = true;
796  if (option_name == "-mat_superlu_dist_fact")
797  fact_pattern_found = true;
798  if (option_name == "-mat_superlu_dist_replacetinypivot")
799  tiny_pivot_found = true;
800 #endif
801 
802  if (!new_options.empty())
803  {
804  std::copy(new_options.begin(), new_options.end(), std::back_inserter(po.pairs));
805  for (const auto & option : new_options)
806  po.user_set_options.setAdditionalValue(option.first);
807  }
808  else
809  {
810  po.pairs.push_back(std::make_pair(prefixed_option_name, option_value));
811  po.user_set_options.setAdditionalValue(prefixed_option_name);
812  }
813  }
814  else
815  {
816  do
817  {
818  it->second = option_value;
819  it = MooseUtils::findPair(po.pairs, std::next(it), prefixed_option_name, MooseUtils::Any);
820  } while (it != po.pairs.end());
821  }
822  }
823 
824  // When running a 3D mesh with boomeramg, it is almost always best to supply a strong threshold
825  // value. We will provide that for the user here if they haven't supplied it themselves.
826  if (boomeramg_found && !strong_threshold_found && mesh_dimension == 3)
827  {
828  po.pairs.emplace_back(prefix + "pc_hypre_boomeramg_strong_threshold", "0.7");
829  pc_description += "strong_threshold: 0.7 (auto)";
830  }
831 
832 #if !PETSC_VERSION_LESS_THAN(3, 12, 0)
833  if (hmg_found && !hmg_strong_threshold_found && mesh_dimension == 3)
834  {
835  po.pairs.emplace_back(prefix + "hmg_inner_pc_hypre_boomeramg_strong_threshold", "0.7");
836  pc_description += "strong_threshold: 0.7 (auto)";
837  }
838 
839  // Default PETSc PtAP takes too much memory, and it is not quite useful
840  // Let us switch to use new algorithm
841  if (hmg_found && !matptap_found)
842  {
843 #if !PETSC_VERSION_LESS_THAN(3, 17, 0)
844  po.pairs.emplace_back(prefix + "mat_product_algorithm", "allatonce");
845 #elif !PETSC_VERSION_LESS_THAN(3, 13, 0)
846  po.pairs.emplace_back(prefix + "matproduct_ptap_via", "allatonce");
847 #else
848  po.pairs.emplace_back(prefix + "matptap_via", "allatonce");
849  po.pairs.emplace_back(prefix + "matmaijptap_via", "allatonce");
850 #endif
851  }
852 #endif
853 
854 #if !PETSC_VERSION_LESS_THAN(3, 7, 0)
855  // In PETSc-3.7.{0--4}, there is a bug when using superlu_dist, and we have to use
856  // SamePattern_SameRowPerm, otherwise we use whatever we have in PETSc
857  if (superlu_dist_found && !fact_pattern_found)
858  {
859  po.pairs.emplace_back(prefix + "mat_superlu_dist_fact",
860 #if PETSC_VERSION_LESS_THAN(3, 7, 5)
861  "SamePattern_SameRowPerm");
862  pc_description += "mat_superlu_dist_fact: SamePattern_SameRowPerm ";
863 #else
864  "SamePattern");
865  pc_description += "mat_superlu_dist_fact: SamePattern ";
866 #endif
867  }
868 
869  // restore this superlu option
870  if (superlu_dist_found && !tiny_pivot_found)
871  {
872  po.pairs.emplace_back(prefix + "mat_superlu_dist_replacetinypivot", "1");
873  pc_description += " mat_superlu_dist_replacetinypivot: true ";
874  }
875 #endif
876  // Set Preconditioner description
877  if (!pc_description.empty() && prefix.size() > 1)
878  po.pc_description += "[" + prefix.substr(1, prefix.size() - 2) + "]: ";
879  po.pc_description += pc_description;
880 }
void checkUserProvidedPetscOption(const T &option, const ParallelParamObject &param_object)
Definition: PetscSupport.C:631
auto findPair(C &container, It start_iterator, const M1 &first, const M2 &second)
Find a specific pair in a container matching on first, second or both pair components.
Definition: MooseUtils.h:1039
static const struct MooseUtils::AnyType Any

◆ checkUserProvidedPetscOption()

template<typename T >
void Moose::PetscSupport::checkUserProvidedPetscOption ( const T &  option,
const ParallelParamObject param_object 
)

Definition at line 631 of file PetscSupport.C.

Referenced by addPetscFlagsToPetscOptions(), and addPetscPairsToPetscOptions().

632 {
633  const auto & string_option = static_cast<const std::string &>(option);
634  if (string_option[0] != '-')
635  param_object.mooseError("PETSc option '", string_option, "' does not begin with '-'");
636 }
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type and optionally a file path to the top-level block p...
Definition: MooseBase.h:271

◆ colorAdjacencyMatrix()

void Moose::PetscSupport::colorAdjacencyMatrix ( PetscScalar *  adjacency_matrix,
unsigned int  size,
unsigned int  colors,
std::vector< unsigned int > &  vertex_colors,
const char *  coloring_algorithm 
)

This method takes an adjacency matrix, and a desired number of colors and applies a graph coloring algorithm to produce a coloring.

The coloring is returned as a vector of unsigned integers indicating which color or group each vextex in the adjacency matrix belongs to.

Definition at line 1104 of file PetscSupport.C.

1109 {
1110  // Mat A will be a dense matrix from the incoming data structure
1111  Mat A;
1112  LibmeshPetscCallA(PETSC_COMM_SELF, MatCreate(PETSC_COMM_SELF, &A));
1113  LibmeshPetscCallA(PETSC_COMM_SELF, MatSetSizes(A, size, size, size, size));
1114  LibmeshPetscCallA(PETSC_COMM_SELF, MatSetType(A, MATSEQDENSE));
1115  // PETSc requires a non-const data array to populate the matrix
1116  LibmeshPetscCallA(PETSC_COMM_SELF, MatSeqDenseSetPreallocation(A, adjacency_matrix));
1117  LibmeshPetscCallA(PETSC_COMM_SELF, MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
1118  LibmeshPetscCallA(PETSC_COMM_SELF, MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
1119 
1120  // Convert A to a sparse matrix
1121 #if PETSC_VERSION_LESS_THAN(3, 7, 0)
1122  LibmeshPetscCallA(PETSC_COMM_SELF, MatConvert(A, MATAIJ, MAT_REUSE_MATRIX, &A));
1123 #else
1124  LibmeshPetscCallA(PETSC_COMM_SELF, MatConvert(A, MATAIJ, MAT_INPLACE_MATRIX, &A));
1125 #endif
1126 
1127  ISColoring iscoloring;
1128  MatColoring mc;
1129  LibmeshPetscCallA(PETSC_COMM_SELF, MatColoringCreate(A, &mc));
1130  LibmeshPetscCallA(PETSC_COMM_SELF, MatColoringSetType(mc, coloring_algorithm));
1131  LibmeshPetscCallA(PETSC_COMM_SELF, MatColoringSetMaxColors(mc, static_cast<PetscInt>(colors)));
1132 
1133  // Petsc normally colors by distance two (neighbors of neighbors), we just want one
1134  LibmeshPetscCallA(PETSC_COMM_SELF, MatColoringSetDistance(mc, 1));
1135  LibmeshPetscCallA(PETSC_COMM_SELF, MatColoringSetFromOptions(mc));
1136  LibmeshPetscCallA(PETSC_COMM_SELF, MatColoringApply(mc, &iscoloring));
1137 
1138  PetscInt nn;
1139  IS * is;
1140 #if PETSC_RELEASE_LESS_THAN(3, 12, 0)
1141  LibmeshPetscCallA(PETSC_COMM_SELF, ISColoringGetIS(iscoloring, &nn, &is));
1142 #else
1143  LibmeshPetscCallA(PETSC_COMM_SELF, ISColoringGetIS(iscoloring, PETSC_USE_POINTER, &nn, &is));
1144 #endif
1145 
1146  if (nn > static_cast<PetscInt>(colors))
1147  throw std::runtime_error("Not able to color with designated number of colors");
1148 
1149  for (int i = 0; i < nn; i++)
1150  {
1151  PetscInt isize;
1152  const PetscInt * indices;
1153  LibmeshPetscCallA(PETSC_COMM_SELF, ISGetLocalSize(is[i], &isize));
1154  LibmeshPetscCallA(PETSC_COMM_SELF, ISGetIndices(is[i], &indices));
1155  for (int j = 0; j < isize; j++)
1156  {
1157  mooseAssert(indices[j] < static_cast<PetscInt>(vertex_colors.size()), "Index out of bounds");
1158  vertex_colors[indices[j]] = i;
1159  }
1160  LibmeshPetscCallA(PETSC_COMM_SELF, ISRestoreIndices(is[i], &indices));
1161  }
1162 
1163  LibmeshPetscCallA(PETSC_COMM_SELF, MatDestroy(&A));
1164  LibmeshPetscCallA(PETSC_COMM_SELF, MatColoringDestroy(&mc));
1165  LibmeshPetscCallA(PETSC_COMM_SELF, ISColoringDestroy(&iscoloring));
1166 }
PetscErrorCode PetscInt const PetscInt IS * is

◆ createMatrixFromFile()

std::unique_ptr< PetscMatrix< Number > > Moose::PetscSupport::createMatrixFromFile ( const libMesh::Parallel::Communicator comm,
Mat &  petsc_mat,
const std::string &  binary_mat_file,
unsigned int  mat_number_to_load = 1 
)

Create a matrix from a binary file.

Note that the returned libMesh matrix wrapper will not destroy the created matrix on destruction. petsc_mat must be destroyed manually via MatDestroy

Parameters
mat_number_to_loadA binary file may contain multiple writes of a matrix. This parameter can be used to load a particular matrix from the binary file. By default we load the first written matrix

Definition at line 1210 of file PetscSupport.C.

Referenced by MatrixSymmetryCheck::execute().

1214 {
1215  LibmeshPetscCallA(comm.get(), MatCreate(comm.get(), &mat));
1216  PetscViewer matviewer;
1217  LibmeshPetscCallA(
1218  comm.get(),
1219  PetscViewerBinaryOpen(comm.get(), binary_mat_file.c_str(), FILE_MODE_READ, &matviewer));
1220  for (unsigned int i = 0; i < mat_number_to_load; ++i)
1221  LibmeshPetscCallA(comm.get(), MatLoad(mat, matviewer));
1222  LibmeshPetscCallA(comm.get(), PetscViewerDestroy(&matviewer));
1223 
1224  return std::make_unique<PetscMatrix<Number>>(mat, comm);
1225 }

◆ dontAddCommonKSPOptions()

void Moose::PetscSupport::dontAddCommonKSPOptions ( FEProblemBase fe_problem)

Function to ensure that common KSP options are not added to the PetscOptions storage object to be later set unless explicitly specified in input or on the command line.

Definition at line 1188 of file PetscSupport.C.

1189 {
1190  auto & petsc_options = fe_problem.getPetscOptions();
1191  for (const auto & flag : getCommonKSPFlags().getNames())
1192  dontAddPetscFlag(flag, petsc_options);
1193  for (const auto & key : getCommonKSPKeys().getNames())
1194  dontAddPetscFlag(key, petsc_options);
1195 }
MultiMooseEnum getCommonKSPKeys()
A helper function to produce a MultiMooseEnum with commonly used PETSc ksp option names (keys) ...
Definition: PetscSupport.C:960
Moose::PetscSupport::PetscOptions & getPetscOptions()
Retrieve a writable reference the PETSc options (used by PetscSupport)
void dontAddPetscFlag(const std::string &flag, PetscOptions &petsc_options)
Function to ensure that a particular petsc option is not added to the PetscOptions storage object to ...
MultiMooseEnum getCommonKSPFlags()
A helper function to produce a MultiMooseEnum with commonly used PETSc ksp single options (flags) ...
Definition: PetscSupport.C:935

◆ dontAddCommonSNESOptions()

void Moose::PetscSupport::dontAddCommonSNESOptions ( FEProblemBase fe_problem)

Function to ensure that common SNES options are not added to the PetscOptions storage object to be later set unless explicitly specified in input or on the command line.

Definition at line 1198 of file PetscSupport.C.

Referenced by ExplicitTimeIntegrator::ExplicitTimeIntegrator().

1199 {
1200  auto & petsc_options = fe_problem.getPetscOptions();
1201  for (const auto & flag : getCommonSNESFlags().getNames())
1202  if (!petsc_options.dont_add_these_options.contains(flag))
1203  petsc_options.dont_add_these_options.setAdditionalValue(flag);
1204  for (const auto & key : getCommonSNESKeys().getNames())
1205  if (!petsc_options.dont_add_these_options.contains(key))
1206  petsc_options.dont_add_these_options.setAdditionalValue(key);
1207 }
Moose::PetscSupport::PetscOptions & getPetscOptions()
Retrieve a writable reference the PETSc options (used by PetscSupport)
void setAdditionalValue(const std::string &names)
Insert operators Operator to insert (push_back) values into the enum.
MultiMooseEnum getCommonSNESFlags()
A helper function to produce a MultiMooseEnum with commonly used PETSc snes single options (flags) ...
Definition: PetscSupport.C:924
MultiMooseEnum getCommonSNESKeys()
A helper function to produce a MultiMooseEnum with commonly used PETSc snes option names (keys) ...
Definition: PetscSupport.C:951
MultiMooseEnum dont_add_these_options
Flags to explicitly not set, even if they are specified programmatically.
Definition: PetscSupport.h:59

◆ dontAddLinearConvergedReason()

void Moose::PetscSupport::dontAddLinearConvergedReason ( FEProblemBase fe_problem)

Function to ensure that -ksp_converged_reason is not added to the PetscOptions storage object to be later set unless explicitly specified in input or on the command line.

Definition at line 1182 of file PetscSupport.C.

Referenced by CommonOutputAction::act(), and Eigenvalue::Eigenvalue().

1183 {
1184  dontAddPetscFlag("-ksp_converged_reason", fe_problem.getPetscOptions());
1185 }
Moose::PetscSupport::PetscOptions & getPetscOptions()
Retrieve a writable reference the PETSc options (used by PetscSupport)
void dontAddPetscFlag(const std::string &flag, PetscOptions &petsc_options)
Function to ensure that a particular petsc option is not added to the PetscOptions storage object to ...

◆ dontAddNonlinearConvergedReason()

void Moose::PetscSupport::dontAddNonlinearConvergedReason ( FEProblemBase fe_problem)

Function to ensure that -snes_converged_reason is not added to the PetscOptions storage object to be later set unless explicitly specified in input or on the command line.

Definition at line 1176 of file PetscSupport.C.

Referenced by CommonOutputAction::act(), and Eigenvalue::Eigenvalue().

1177 {
1178  dontAddPetscFlag("-snes_converged_reason", fe_problem.getPetscOptions());
1179 }
Moose::PetscSupport::PetscOptions & getPetscOptions()
Retrieve a writable reference the PETSc options (used by PetscSupport)
void dontAddPetscFlag(const std::string &flag, PetscOptions &petsc_options)
Function to ensure that a particular petsc option is not added to the PetscOptions storage object to ...

◆ dontAddPetscFlag()

void Moose::PetscSupport::dontAddPetscFlag ( const std::string &  flag,
PetscOptions petsc_options 
)

Function to ensure that a particular petsc option is not added to the PetscOptions storage object to be later set unless explicitly specified in input or on the command line.

Definition at line 1169 of file PetscSupport.C.

Referenced by dontAddCommonKSPOptions(), dontAddLinearConvergedReason(), dontAddNonlinearConvergedReason(), and Eigenvalue::Eigenvalue().

1170 {
1171  if (!petsc_options.dont_add_these_options.contains(flag))
1172  petsc_options.dont_add_these_options.setAdditionalValue(flag);
1173 }

◆ getCommonKSPFlags()

MultiMooseEnum Moose::PetscSupport::getCommonKSPFlags ( )

A helper function to produce a MultiMooseEnum with commonly used PETSc ksp single options (flags)

Definition at line 935 of file PetscSupport.C.

Referenced by dontAddCommonKSPOptions(), and getCommonPetscFlags().

936 {
937  return MultiMooseEnum(
938  "-ksp_converged_reason -ksp_gmres_modifiedgramschmidt -ksp_monitor", "", true);
939 }
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...

◆ getCommonKSPKeys()

MultiMooseEnum Moose::PetscSupport::getCommonKSPKeys ( )

A helper function to produce a MultiMooseEnum with commonly used PETSc ksp option names (keys)

Definition at line 960 of file PetscSupport.C.

Referenced by dontAddCommonKSPOptions(), and getCommonPetscKeys().

961 {
962  return MultiMooseEnum("-ksp_atol -ksp_gmres_restart -ksp_max_it -ksp_pc_side -ksp_rtol "
963  "-ksp_type -sub_ksp_type",
964  "",
965  true);
966 }
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...

◆ getCommonPetscFlags()

MultiMooseEnum Moose::PetscSupport::getCommonPetscFlags ( )

A helper function to produce a MultiMooseEnum with commonly used PETSc single options (flags)

Definition at line 942 of file PetscSupport.C.

Referenced by getPetscValidParams(), AddFieldSplitAction::validParams(), and Split::validParams().

943 {
944  auto options = MultiMooseEnum("-dm_moose_print_embedding -dm_view", "", true);
945  options.addValidName(getCommonKSPFlags());
946  options.addValidName(getCommonSNESFlags());
947  return options;
948 }
MultiMooseEnum getCommonSNESFlags()
A helper function to produce a MultiMooseEnum with commonly used PETSc snes single options (flags) ...
Definition: PetscSupport.C:924
MultiMooseEnum getCommonKSPFlags()
A helper function to produce a MultiMooseEnum with commonly used PETSc ksp single options (flags) ...
Definition: PetscSupport.C:935
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...

◆ getCommonPetscKeys()

MultiMooseEnum Moose::PetscSupport::getCommonPetscKeys ( )

A helper function to produce a MultiMooseEnum with commonly used PETSc iname options (keys in key-value pairs)

Definition at line 968 of file PetscSupport.C.

Referenced by getPetscValidParams(), AddFieldSplitAction::validParams(), and Split::validParams().

969 {
970  auto options = MultiMooseEnum("-mat_fd_coloring_err -mat_fd_type -mat_mffd_type "
971  "-pc_asm_overlap -pc_factor_levels "
972  "-pc_factor_mat_ordering_type -pc_hypre_boomeramg_grid_sweeps_all "
973  "-pc_hypre_boomeramg_max_iter "
974  "-pc_hypre_boomeramg_strong_threshold -pc_hypre_type -pc_type "
975  "-sub_pc_type",
976  "",
977  true);
978  options.addValidName(getCommonKSPKeys());
979  options.addValidName(getCommonSNESKeys());
980  return options;
981 }
MultiMooseEnum getCommonKSPKeys()
A helper function to produce a MultiMooseEnum with commonly used PETSc ksp option names (keys) ...
Definition: PetscSupport.C:960
MultiMooseEnum getCommonSNESKeys()
A helper function to produce a MultiMooseEnum with commonly used PETSc snes option names (keys) ...
Definition: PetscSupport.C:951
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...

◆ getCommonSNESFlags()

MultiMooseEnum Moose::PetscSupport::getCommonSNESFlags ( )

A helper function to produce a MultiMooseEnum with commonly used PETSc snes single options (flags)

Definition at line 924 of file PetscSupport.C.

Referenced by dontAddCommonSNESOptions(), and getCommonPetscFlags().

925 {
926  return MultiMooseEnum(
927  "-ksp_monitor_snes_lg -snes_ksp_ew -ksp_snes_ew -snes_converged_reason "
928  "-snes_ksp -snes_linesearch_monitor -snes_mf -snes_mf_operator -snes_monitor "
929  "-snes_test_display -snes_view -snes_monitor_cancel",
930  "",
931  true);
932 }
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...

◆ getCommonSNESKeys()

MultiMooseEnum Moose::PetscSupport::getCommonSNESKeys ( )

A helper function to produce a MultiMooseEnum with commonly used PETSc snes option names (keys)

Definition at line 951 of file PetscSupport.C.

Referenced by dontAddCommonSNESOptions(), and getCommonPetscKeys().

952 {
953  return MultiMooseEnum("-snes_atol -snes_linesearch_type -snes_ls -snes_max_it -snes_rtol "
954  "-snes_divergence_tolerance -snes_type",
955  "",
956  true);
957 }
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...

◆ getPetscKSPNormType()

KSPNormType Moose::PetscSupport::getPetscKSPNormType ( Moose::MooseKSPNormType  kspnorm)

Definition at line 383 of file PetscSupport.C.

Referenced by petscSetDefaultKSPNormType().

384 {
385  switch (kspnorm)
386  {
387  case Moose::KSPN_NONE:
388  return KSP_NORM_NONE;
390  return KSP_NORM_PRECONDITIONED;
392  return KSP_NORM_UNPRECONDITIONED;
393  case Moose::KSPN_NATURAL:
394  return KSP_NORM_NATURAL;
395  case Moose::KSPN_DEFAULT:
396  return KSP_NORM_DEFAULT;
397  default:
398  mooseError("Unknown KSP norm type requested.");
399  break;
400  }
401 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:323
Use whatever we have in PETSc.
Definition: MooseTypes.h:837

◆ getPetscPCSide()

PCSide Moose::PetscSupport::getPetscPCSide ( Moose::PCSideType  pcs)

Definition at line 366 of file PetscSupport.C.

Referenced by petscSetDefaultPCSide().

367 {
368  switch (pcs)
369  {
370  case Moose::PCS_LEFT:
371  return PC_LEFT;
372  case Moose::PCS_RIGHT:
373  return PC_RIGHT;
375  return PC_SYMMETRIC;
376  default:
377  mooseError("Unknown PC side requested.");
378  break;
379  }
380 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:323

◆ getPetscValidLineSearches()

std::set< std::string > Moose::PetscSupport::getPetscValidLineSearches ( )

Returns the valid petsc line search options as a set of strings.

Definition at line 883 of file PetscSupport.C.

Referenced by FEProblemSolve::validParams().

884 {
885  return {"default", "shell", "none", "basic", "l2", "bt", "cp"};
886 }

◆ getPetscValidParams()

InputParameters Moose::PetscSupport::getPetscValidParams ( )

Returns the PETSc options that are common between Executioners and Preconditioners.

Returns
InputParameters object containing the PETSc related parameters

The output of this function should be added to the the parameters object of the overarching class

See also
CreateExecutionerAction

Definition at line 889 of file PetscSupport.C.

Referenced by FEProblemSolve::validParams(), and MoosePreconditioner::validParams().

890 {
892 
893  MooseEnum solve_type("PJFNK JFNK NEWTON FD LINEAR");
894  params.addParam<MooseEnum>("solve_type",
895  solve_type,
896  "PJFNK: Preconditioned Jacobian-Free Newton Krylov "
897  "JFNK: Jacobian-Free Newton Krylov "
898  "NEWTON: Full Newton Solve "
899  "FD: Use finite differences to compute Jacobian "
900  "LINEAR: Solving a linear problem");
901 
902  MooseEnum mffd_type("wp ds", "wp");
903  params.addParam<MooseEnum>("mffd_type",
904  mffd_type,
905  "Specifies the finite differencing type for "
906  "Jacobian-free solve types. Note that the "
907  "default is wp (for Walker and Pernice).");
908 
909  params.addParam<MultiMooseEnum>(
910  "petsc_options", getCommonPetscFlags(), "Singleton PETSc options");
911  params.addParam<MultiMooseEnum>(
912  "petsc_options_iname", getCommonPetscKeys(), "Names of PETSc name/value pairs");
913  params.addParam<std::vector<std::string>>(
914  "petsc_options_value",
915  "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\"");
916  params.addParamNamesToGroup("solve_type petsc_options petsc_options_iname petsc_options_value "
917  "mffd_type",
918  "PETSc");
919 
920  return params;
921 }
MultiMooseEnum getCommonPetscKeys()
A helper function to produce a MultiMooseEnum with commonly used PETSc iname options (keys in key-val...
Definition: PetscSupport.C:968
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
InputParameters emptyInputParameters()
MultiMooseEnum getCommonPetscFlags()
A helper function to produce a MultiMooseEnum with commonly used PETSc single options (flags) ...
Definition: PetscSupport.C:942
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:33
void addParam(const std::string &name, const S &value, const std::string &doc_string)
These methods add an optional parameter and a documentation string to the InputParameters object...
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...
void addParamNamesToGroup(const std::string &space_delim_names, const std::string group_name)
This method takes a space delimited list of parameter names and adds them to the specified group name...

◆ isSNESVI()

bool Moose::PetscSupport::isSNESVI ( FEProblemBase fe_problem)

check if SNES type is variational inequalities (VI) solver

Definition at line 984 of file PetscSupport.C.

Referenced by BoundsBase::initialSetup().

985 {
986  const PetscOptions & petsc = fe_problem.getPetscOptions();
987 
988  int argc;
989  char ** args;
990  LibmeshPetscCallA(fe_problem.comm().get(), PetscGetArgs(&argc, &args));
991 
992  std::vector<std::string> cml_arg;
993  for (int i = 0; i < argc; i++)
994  cml_arg.push_back(args[i]);
995 
996  if (MooseUtils::findPair(petsc.pairs, petsc.pairs.begin(), MooseUtils::Any, "vinewtonssls") ==
997  petsc.pairs.end() &&
998  MooseUtils::findPair(petsc.pairs, petsc.pairs.begin(), MooseUtils::Any, "vinewtonrsls") ==
999  petsc.pairs.end() &&
1000  std::find(cml_arg.begin(), cml_arg.end(), "vinewtonssls") == cml_arg.end() &&
1001  std::find(cml_arg.begin(), cml_arg.end(), "vinewtonrsls") == cml_arg.end())
1002  return false;
1003 
1004  return true;
1005 }
Moose::PetscSupport::PetscOptions & getPetscOptions()
Retrieve a writable reference the PETSc options (used by PetscSupport)
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
Find a value in an array.
Definition: KokkosUtils.h:30
const Parallel::Communicator & comm() const
auto findPair(C &container, It start_iterator, const M1 &first, const M2 &second)
Find a specific pair in a container matching on first, second or both pair components.
Definition: MooseUtils.h:1039
static const struct MooseUtils::AnyType Any

◆ outputNorm()

void Moose::PetscSupport::outputNorm ( libMesh::Real  old_norm,
libMesh::Real  norm,
bool  use_color = false 
)

Helper function for outputting the norm values with/without color.

◆ petscLinearConverged()

PetscErrorCode Moose::PetscSupport::petscLinearConverged ( KSP  ,
PetscInt  it,
PetscReal  ,
KSPConvergedReason *  reason,
void ctx 
)

Definition at line 316 of file PetscSupport.C.

Referenced by petscSetDefaults().

318 {
320  FEProblemBase & problem = *static_cast<FEProblemBase *>(ctx);
321 
322  // execute objects that may be used in convergence check
323  // Right now, setting objects to execute on this flag would be ignored except in the
324  // linear-system-only use case.
326 
327  // perform the convergence check
329  if (problem.getFailNextSystemConvergenceCheck())
330  {
333  }
334  else
335  {
336  auto & convergence = problem.getConvergence(
337  problem.getLinearConvergenceNames()[problem.currentLinearSystem().number()]);
338  status = convergence.checkConvergence(it);
339  }
340 
341  // convert convergence status to PETSc converged reason
342  switch (status)
343  {
345  *reason = KSP_CONVERGED_ITERATING;
346  break;
347 
348  // TODO: find a KSP code that works better for this case
350 #if PETSC_VERSION_LESS_THAN(3, 24, 0)
351  *reason = KSP_CONVERGED_RTOL_NORMAL;
352 #else
353  *reason = KSP_CONVERGED_RTOL_NORMAL_EQUATIONS;
354 #endif
355  break;
356 
358  *reason = KSP_DIVERGED_DTOL;
359  break;
360  }
361 
362  PetscFunctionReturn(PETSC_SUCCESS);
363 }
const ExecFlagType EXEC_LINEAR_CONVERGENCE
Definition: Moose.C:32
virtual MooseConvergenceStatus checkConvergence(unsigned int iter)=0
Returns convergence status.
PetscFunctionBegin
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
MPI_Status status
virtual void execute(const ExecFlagType &exec_type)
Convenience function for performing execution of MOOSE systems.
virtual Convergence & getConvergence(const std::string &name, const THREAD_ID tid=0) const
Gets a Convergence object.
PetscFunctionReturn(PETSC_SUCCESS)
unsigned int number() const
Gets the number of this system.
Definition: SystemBase.C:1157
bool getFailNextSystemConvergenceCheck() const
Whether it will fail the next system convergence check(s), triggering failed step behavior...
MooseConvergenceStatus
Status returned by calls to checkConvergence.
Definition: Convergence.h:33
LinearSystem & currentLinearSystem()
Get a non-constant reference to the current linear system.
void resetFailNextSystemConvergenceCheck()
Tell the problem that the system convergence check(s) may proceed as normal.
void * ctx
const std::vector< ConvergenceName > & getLinearConvergenceNames() const
Gets the linear convergence object name(s).

◆ petscLinearMonitor()

PetscErrorCode Moose::PetscSupport::petscLinearMonitor ( KSP  ,
PetscInt  its,
PetscReal  rnorm,
void void_ptr 
)

Helper function for displaying the linear residual during PETSC solve.

◆ petscNonlinearConverged()

PetscErrorCode Moose::PetscSupport::petscNonlinearConverged ( SNES  ,
PetscInt  it,
PetscReal  ,
PetscReal  ,
PetscReal  ,
SNESConvergedReason *  reason,
void ctx 
)

Definition at line 268 of file PetscSupport.C.

Referenced by petscSetDefaults().

275 {
277  FEProblemBase & problem = *static_cast<FEProblemBase *>(ctx);
278 
279  // execute objects that may be used in convergence check
281 
282  // perform the convergence check
285  {
288  }
289  else
290  {
291  auto & convergence = problem.getConvergence(
293  status = convergence.checkConvergence(it);
294  }
295 
296  // convert convergence status to PETSc converged reason
297  switch (status)
298  {
300  *reason = SNES_CONVERGED_ITERATING;
301  break;
302 
304  *reason = SNES_CONVERGED_FNORM_ABS;
305  break;
306 
308  *reason = SNES_DIVERGED_DTOL;
309  break;
310  }
311 
312  PetscFunctionReturn(PETSC_SUCCESS);
313 }
void resetFailNextNonlinearConvergenceCheck()
Tell the problem that the nonlinear convergence check(s) may proceed as normal.
const std::vector< ConvergenceName > & getNonlinearConvergenceNames() const
Gets the nonlinear system convergence object name(s).
const ExecFlagType EXEC_NONLINEAR_CONVERGENCE
Definition: Moose.C:34
virtual MooseConvergenceStatus checkConvergence(unsigned int iter)=0
Returns convergence status.
PetscFunctionBegin
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
MPI_Status status
virtual void execute(const ExecFlagType &exec_type)
Convenience function for performing execution of MOOSE systems.
virtual Convergence & getConvergence(const std::string &name, const THREAD_ID tid=0) const
Gets a Convergence object.
NonlinearSystemBase & currentNonlinearSystem()
PetscFunctionReturn(PETSC_SUCCESS)
unsigned int number() const
Gets the number of this system.
Definition: SystemBase.C:1157
MooseConvergenceStatus
Status returned by calls to checkConvergence.
Definition: Convergence.h:33
bool getFailNextNonlinearConvergenceCheck() const
Whether it will skip further residual evaluations and fail the next nonlinear convergence check(s) ...
void * ctx

◆ petscSetDefaultKSPNormType()

void Moose::PetscSupport::petscSetDefaultKSPNormType ( FEProblemBase problem,
KSP  ksp 
)

Set norm type.

Definition at line 404 of file PetscSupport.C.

Referenced by Moose::SlepcSupport::mooseSlepcEPSSNESKSPSetPCSide(), and petscSetKSPDefaults().

405 {
406  for (const auto i : make_range(problem.numSolverSystems()))
407  {
408  SolverSystem & sys = problem.getSolverSystem(i);
409  LibmeshPetscCallA(problem.comm().get(),
410  KSPSetNormType(ksp, getPetscKSPNormType(sys.getMooseKSPNormType())));
411  }
412 }
KSPNormType getPetscKSPNormType(Moose::MooseKSPNormType kspnorm)
Definition: PetscSupport.C:383
const Parallel::Communicator & comm() const
IntRange< T > make_range(T beg, T end)
SolverSystem & getSolverSystem(unsigned int sys_num)
Get non-constant reference to a solver system.
Moose::MooseKSPNormType getMooseKSPNormType()
Get the norm in which the linear convergence is measured.
Definition: SolverSystem.h:87
virtual std::size_t numSolverSystems() const override

◆ petscSetDefaultPCSide()

void Moose::PetscSupport::petscSetDefaultPCSide ( FEProblemBase problem,
KSP  ksp 
)

Setup which side we want to apply preconditioner.

Definition at line 415 of file PetscSupport.C.

Referenced by Moose::SlepcSupport::mooseSlepcEPSSNESKSPSetPCSide(), and petscSetKSPDefaults().

416 {
417  for (const auto i : make_range(problem.numSolverSystems()))
418  {
419  SolverSystem & sys = problem.getSolverSystem(i);
420 
421  // PETSc 3.2.x+
422  if (sys.getPCSide() != Moose::PCS_DEFAULT)
423  LibmeshPetscCallA(problem.comm().get(), KSPSetPCSide(ksp, getPetscPCSide(sys.getPCSide())));
424  }
425 }
const Parallel::Communicator & comm() const
PCSide getPetscPCSide(Moose::PCSideType pcs)
Definition: PetscSupport.C:366
Use whatever we have in PETSc.
Definition: MooseTypes.h:825
IntRange< T > make_range(T beg, T end)
SolverSystem & getSolverSystem(unsigned int sys_num)
Get non-constant reference to a solver system.
virtual std::size_t numSolverSystems() const override
Moose::PCSideType getPCSide()
Get the current preconditioner side.
Definition: SolverSystem.h:76

◆ petscSetDefaults()

void Moose::PetscSupport::petscSetDefaults ( FEProblemBase problem)

Sets the default options for PETSc.

Definition at line 450 of file PetscSupport.C.

Referenced by FEProblemBase::initPetscOutputAndSomeSolverSettings(), Moose::setSolverDefaults(), and FEProblemBase::solveLinearSystem().

451 {
452  // We care about both nonlinear and linear systems when setting the SNES prefix because
453  // SNESSetOptionsPrefix will also set its KSP prefix which could compete with linear system KSPs
454  for (const auto nl_index : make_range(problem.numNonlinearSystems()))
455  {
456  NonlinearSystemBase & nl = problem.getNonlinearSystemBase(nl_index);
457 
458  //
459  // prefix system matrices
460  //
461 
462  auto & lm_sys = nl.system();
463  // This check is necessary because we still have at least the system matrix lying around even
464  // when doing matrix-free, but critically even though the libmesh object(s) exist, the wrapped
465  // PETSc Mat(s) do not
466  if (problem.solverParams(nl_index)._type != Moose::ST_JFNK)
467  for (auto & [mat_name, mat] : as_range(lm_sys.matrices_begin(), lm_sys.matrices_end()))
468  {
469  libmesh_ignore(mat_name);
470  if (auto * const petsc_mat = dynamic_cast<PetscMatrixBase<Number> *>(mat.get()); petsc_mat)
471  {
472  LibmeshPetscCallA(nl.comm().get(),
473  MatSetOptionsPrefix(petsc_mat->mat(), (nl.name() + "_").c_str()));
474  // We should call this here to ensure that options from the command line are properly
475  // applied
476  LibmeshPetscCallA(nl.comm().get(), MatSetFromOptions(petsc_mat->mat()));
477  }
478  }
479 
480  //
481  // prefix SNES/KSP
482  //
483 
484  // dig out PETSc solver
485  auto * const petsc_solver = cast_ptr<PetscNonlinearSolver<Number> *>(nl.nonlinearSolver());
486  const char * snes_prefix = nullptr;
487  std::string snes_prefix_str;
488  if (nl.system().prefix_with_name())
489  {
490  snes_prefix_str = nl.system().prefix();
491  snes_prefix = snes_prefix_str.c_str();
492  }
493  SNES snes = petsc_solver->snes(snes_prefix);
494  KSP ksp;
495  LibmeshPetscCallA(nl.comm().get(), SNESGetKSP(snes, &ksp));
496 
497  LibmeshPetscCallA(nl.comm().get(), SNESSetMaxLinearSolveFailures(snes, 1000000));
498 
499  LibmeshPetscCallA(nl.comm().get(), SNESSetCheckJacobianDomainError(snes, PETSC_TRUE));
500 
501  // In 3.0.0, the context pointer must actually be used, and the
502  // final argument to KSPSetConvergenceTest() is a pointer to a
503  // routine for destroying said private data context. In this case,
504  // we use the default context provided by PETSc in addition to
505  // a few other tests.
506  {
507  LibmeshPetscCallA(
508  nl.comm().get(),
509  SNESSetConvergenceTest(snes, petscNonlinearConverged, &problem, LIBMESH_PETSC_NULLPTR));
510  }
511 
512  petscSetKSPDefaults(problem, ksp);
513  }
514 
515  for (auto sys_index : make_range(problem.numLinearSystems()))
516  {
517  // dig out PETSc solver
518  LinearSystem & lin_sys = problem.getLinearSystem(sys_index);
519  PetscLinearSolver<Number> * petsc_solver = dynamic_cast<PetscLinearSolver<Number> *>(
521  KSP ksp = petsc_solver->ksp();
522 
523  if (problem.hasLinearConvergenceObjects())
524  LibmeshPetscCallA(
525  lin_sys.comm().get(),
526  KSPSetConvergenceTest(ksp, petscLinearConverged, &problem, LIBMESH_PETSC_NULLPTR));
527 
528  // We dont set the KSP defaults here because they seem to clash with the linear solve parameters
529  // set in FEProblemBase::solveLinearSystem
530  }
531 }
virtual std::size_t numNonlinearSystems() const override
libMesh::LinearImplicitSystem & linearImplicitSystem()
Return a reference to the stored linear implicit system.
Definition: LinearSystem.h:86
const Parallel::Communicator & comm() const
void petscSetKSPDefaults(FEProblemBase &problem, KSP ksp)
Set the default options for a KSP.
Definition: PetscSupport.C:428
virtual libMesh::NonlinearSolver< Number > * nonlinearSolver()=0
virtual LinearSolver< Number > * get_linear_solver() const override
bool hasLinearConvergenceObjects() const
Whether we have linear convergence objects.
Nonlinear system to be solved.
virtual const std::string & name() const
Definition: SystemBase.C:1340
PetscErrorCode petscLinearConverged(KSP, PetscInt it, PetscReal, KSPConvergedReason *reason, void *ctx)
Definition: PetscSupport.C:316
void libmesh_ignore(const Args &...)
PetscErrorCode petscNonlinearConverged(SNES, PetscInt it, PetscReal, PetscReal, PetscReal, SNESConvergedReason *reason, void *ctx)
Definition: PetscSupport.C:268
std::string prefix() const
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
Jacobian-Free Newton Krylov.
Definition: MooseTypes.h:846
Moose::SolveType _type
Definition: SolverParams.h:19
NonlinearSystemBase & getNonlinearSystemBase(const unsigned int sys_num)
LinearSystem & getLinearSystem(unsigned int sys_num)
Get non-constant reference to a linear system.
IntRange< T > make_range(T beg, T end)
SolverParams & solverParams(unsigned int solver_sys_num=0)
Get the solver parameters.
Linear system to be solved.
Definition: LinearSystem.h:35
virtual std::size_t numLinearSystems() const override
void prefix_with_name(bool value)
virtual libMesh::System & system() override
Get the reference to the libMesh system.

◆ petscSetKSPDefaults()

void Moose::PetscSupport::petscSetKSPDefaults ( FEProblemBase problem,
KSP  ksp 
)

Set the default options for a KSP.

Definition at line 428 of file PetscSupport.C.

Referenced by petscSetDefaults(), and setLinearSolverDefaults().

429 {
430  auto & es = problem.es();
431 
432  PetscReal rtol = es.parameters.get<Real>("linear solver tolerance");
433  PetscReal atol = es.parameters.get<Real>("linear solver absolute tolerance");
434 
435  // MOOSE defaults this to -1 for some dumb reason
436  if (atol < 0)
437  atol = 1e-50;
438 
439  PetscReal maxits = es.parameters.get<unsigned int>("linear solver maximum iterations");
440 
441  // 1e100 is because we don't use divtol currently
442  LibmeshPetscCallA(problem.comm().get(), KSPSetTolerances(ksp, rtol, atol, 1e100, maxits));
443 
444  petscSetDefaultPCSide(problem, ksp);
445 
446  petscSetDefaultKSPNormType(problem, ksp);
447 }
const Parallel::Communicator & comm() const
void petscSetDefaultKSPNormType(FEProblemBase &problem, KSP ksp)
Set norm type.
Definition: PetscSupport.C:404
const T & get(std::string_view) const
virtual libMesh::EquationSystems & es() override
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void petscSetDefaultPCSide(FEProblemBase &problem, KSP ksp)
Setup which side we want to apply preconditioner.
Definition: PetscSupport.C:415

◆ petscSetOptions() [1/2]

void Moose::PetscSupport::petscSetOptions ( const PetscOptions po,
const SolverParams solver_params,
FEProblemBase *const  problem = nullptr 
)

A function for setting the PETSc options in PETSc from the options supplied to MOOSE.

This interface function should be used when setting options on a per-system basis

Definition at line 230 of file PetscSupport.C.

Referenced by Moose::SlepcSupport::slepcSetOptions(), FEProblemBase::solve(), and FEProblemBase::solveLinearSystem().

233 {
234  PetscCallAbort(PETSC_COMM_WORLD, PetscOptionsClear(LIBMESH_PETSC_NULLPTR));
235  setSolverOptions(solver_params, po.dont_add_these_options);
236  petscSetOptionsHelper(po, problem);
237 }
void setSolverOptions(const SolverParams &solver_params, const MultiMooseEnum &dont_add_these_options)
Definition: PetscSupport.C:145
void petscSetOptionsHelper(const PetscOptions &po, FEProblemBase *const problem)
Definition: PetscSupport.C:210

◆ petscSetOptions() [2/2]

void Moose::PetscSupport::petscSetOptions ( const PetscOptions po,
const std::vector< SolverParams > &  solver_params,
FEProblemBase problem 
)

A function for setting the PETSc options in PETSc from the options supplied to MOOSE.

This interface function should be used for setting options all at once for all systems in a multi-system context. Note that PetscOptions is not a vector because the options database has prefixes for the different systems

Definition at line 240 of file PetscSupport.C.

243 {
244  PetscCallAbort(PETSC_COMM_WORLD, PetscOptionsClear(LIBMESH_PETSC_NULLPTR));
245  for (const auto & solver_params : solver_params_vec)
246  setSolverOptions(solver_params, po.dont_add_these_options);
247  petscSetOptionsHelper(po, problem);
248 }
void setSolverOptions(const SolverParams &solver_params, const MultiMooseEnum &dont_add_these_options)
Definition: PetscSupport.C:145
void petscSetOptionsHelper(const PetscOptions &po, FEProblemBase *const problem)
Definition: PetscSupport.C:210

◆ petscSetOptionsHelper()

void Moose::PetscSupport::petscSetOptionsHelper ( const PetscOptions po,
FEProblemBase *const  problem 
)

Definition at line 210 of file PetscSupport.C.

Referenced by petscSetOptions().

211 {
212  // Add any additional options specified in the input file
213  for (const auto & flag : po.flags)
214  // Need to use name method here to pass a str instead of an EnumItem because
215  // we don't care if the id attributes match
216  if (!po.dont_add_these_options.contains(flag.name()) ||
217  po.user_set_options.contains(flag.name()))
218  setSinglePetscOption(flag.rawName().c_str());
219 
220  // Add option pairs
221  for (auto & option : po.pairs)
222  if (!po.dont_add_these_options.contains(option.first) ||
223  po.user_set_options.contains(option.first))
224  setSinglePetscOption(option.first, option.second, problem);
225 
227 }
void addPetscOptionsFromCommandline()
Definition: PetscSupport.C:191
void setSinglePetscOption(const std::string &name, const std::string &value="", FEProblemBase *const problem=nullptr)
A wrapper function for dealing with different versions of PetscOptionsSetValue.

◆ petscSetupOutput()

PetscErrorCode Moose::PetscSupport::petscSetupOutput ( CommandLine cmd_line)

Definition at line 251 of file PetscSupport.C.

Referenced by MooseApp::executeExecutioner().

252 {
254  char code[10] = {45, 45, 109, 111, 111, 115, 101};
255  const std::vector<std::string> argv = cmd_line->getArguments();
256  for (const auto & arg : argv)
257  {
258  if (arg.compare(code) == 0)
259  {
261  break;
262  }
263  }
264  PetscFunctionReturn(PETSC_SUCCESS);
265 }
static void petscSetupOutput()
Output string for setting up PETSC output.
Definition: Console.C:859
PetscFunctionBegin
PetscFunctionReturn(PETSC_SUCCESS)
const std::vector< std::string > & getArguments()
Definition: CommandLine.h:132

◆ processSingletonMooseWrappedOptions()

void Moose::PetscSupport::processSingletonMooseWrappedOptions ( FEProblemBase fe_problem,
const InputParameters params 
)

Process some MOOSE-wrapped PETSc options.

These options have no support for multi-system as indicated by the fact that this function takes no prefix nor solver system argument

Definition at line 534 of file PetscSupport.C.

Referenced by storePetscOptions().

535 {
536  setSolveTypeFromParams(fe_problem, params);
537  setLineSearchFromParams(fe_problem, params);
538  setMFFDTypeFromParams(fe_problem, params);
539 }
void setMFFDTypeFromParams(FEProblemBase &fe_problem, const InputParameters &params)
Sets the FE problem&#39;s matrix-free finite difference type from the input params.
Definition: PetscSupport.C:619
void setSolveTypeFromParams(FEProblemBase &fe_problem, const InputParameters &params)
Sets the FE problem&#39;s solve type from the input params.
Definition: PetscSupport.C:574
void setLineSearchFromParams(FEProblemBase &fe_problem, const InputParameters &params)
Sets the FE problem&#39;s line search from the input params.
Definition: PetscSupport.C:587

◆ setConvergedReasonFlags()

void Moose::PetscSupport::setConvergedReasonFlags ( FEProblemBase fe_problem,
std::string  prefix 
)

Set flags that will instruct the user on the reason their simulation diverged from PETSc's perspective.

Parameters
fe_problemThe problem from which to retrieve the PETSc options
prefixThe prefix to add to the convergence flags. This should not contain a leading dash per PETSc prefix convention. Note that this function will immediately add said dash at the start of prefix so that calls to PetscOptionsSetValue work. This is the reason we pass prefix by value

Definition at line 676 of file PetscSupport.C.

Referenced by FEProblemSolve::FEProblemSolve().

677 {
678  prefix.insert(prefix.begin(), '-');
679  checkPrefix(prefix);
680  libmesh_ignore(fe_problem); // avoid unused warnings for old PETSc
681 
682 #if !PETSC_VERSION_LESS_THAN(3, 14, 0)
683  // the boolean in these pairs denote whether the user has specified any of the reason flags in the
684  // input file
685  std::array<std::string, 2> reason_flags = {{"snes_converged_reason", "ksp_converged_reason"}};
686 
687  auto & po = fe_problem.getPetscOptions();
688 
689  for (const auto & reason_flag : reason_flags)
690  if (!po.flags.isValueSet(prefix + reason_flag) &&
691  (std::find_if(po.pairs.begin(),
692  po.pairs.end(),
693  [&reason_flag, &prefix](auto & pair)
694  { return pair.first == (prefix + reason_flag); }) == po.pairs.end()))
695  po.pairs.emplace_back(prefix + reason_flag, "::failed");
696 #endif
697 }
Moose::PetscSupport::PetscOptions & getPetscOptions()
Retrieve a writable reference the PETSc options (used by PetscSupport)
std::vector< std::pair< std::string, std::string > > pairs
PETSc key-value pairs.
Definition: PetscSupport.h:53
void libmesh_ignore(const Args &...)

◆ setLinearSolverDefaults()

template<typename T >
void Moose::PetscSupport::setLinearSolverDefaults ( FEProblemBase problem,
libMesh::LinearSolver< T > &  linear_solver 
)

Set the defaults for a libMesh LinearSolver.

Used in explicit solves

Definition at line 98 of file PetscSupport.h.

Referenced by ExplicitTimeIntegrator::meshChanged().

99 {
100  petscSetKSPDefaults(problem,
101  libMesh::cast_ref<libMesh::PetscLinearSolver<T> &>(linear_solver).ksp());
102 }
Tnew cast_ref(Told &oldvar)
void petscSetKSPDefaults(FEProblemBase &problem, KSP ksp)
Set the default options for a KSP.
Definition: PetscSupport.C:428

◆ setLineSearchFromParams()

void Moose::PetscSupport::setLineSearchFromParams ( FEProblemBase fe_problem,
const InputParameters params 
)

Sets the FE problem's line search from the input params.

Definition at line 587 of file PetscSupport.C.

Referenced by processSingletonMooseWrappedOptions().

588 {
589  // Note: Options set in the Preconditioner block will override those set in the Executioner block
590  if (params.isParamValid("line_search"))
591  {
592  const auto & line_search = params.get<MooseEnum>("line_search");
593  for (const auto i : make_range(fe_problem.numNonlinearSystems()))
594  if (fe_problem.solverParams(i)._line_search == Moose::LS_INVALID || line_search != "default")
595  {
596  Moose::LineSearchType enum_line_search =
597  Moose::stringToEnum<Moose::LineSearchType>(line_search);
598  fe_problem.solverParams(i)._line_search = enum_line_search;
599  if (enum_line_search == LS_CONTACT || enum_line_search == LS_PROJECT)
600  {
601  NonlinearImplicitSystem * nl_system = dynamic_cast<NonlinearImplicitSystem *>(
602  &fe_problem.getNonlinearSystemBase(i).system());
603  if (!nl_system)
604  mooseError("You've requested a line search but you must be solving an EigenProblem. "
605  "These two things are not consistent.");
606  PetscNonlinearSolver<Real> * petsc_nonlinear_solver =
607  dynamic_cast<PetscNonlinearSolver<Real> *>(nl_system->nonlinear_solver.get());
608  if (!petsc_nonlinear_solver)
609  mooseError("Currently the MOOSE line searches all use Petsc, so you "
610  "must use Petsc as your non-linear solver.");
611  petsc_nonlinear_solver->linesearch_object =
612  std::make_unique<ComputeLineSearchObjectWrapper>(fe_problem);
613  }
614  }
615  }
616 }
std::unique_ptr< NonlinearSolver< Number > > nonlinear_solver
virtual std::size_t numNonlinearSystems() const override
Moose::LineSearchType _line_search
Definition: SolverParams.h:20
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:323
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
Combine two vector parameters into a single vector of pairs.
LineSearchType
Type of the line search.
Definition: MooseTypes.h:926
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:33
NonlinearSystemBase & getNonlinearSystemBase(const unsigned int sys_num)
std::unique_ptr< ComputeLineSearchObject > linesearch_object
IntRange< T > make_range(T beg, T end)
SolverParams & solverParams(unsigned int solver_sys_num=0)
Get the solver parameters.
means not set
Definition: MooseTypes.h:928
bool isParamValid(const std::string &name) const
This method returns parameters that have been initialized in one fashion or another, i.e.
virtual libMesh::System & system() override
Get the reference to the libMesh system.

◆ setMFFDTypeFromParams()

void Moose::PetscSupport::setMFFDTypeFromParams ( FEProblemBase fe_problem,
const InputParameters params 
)

Sets the FE problem's matrix-free finite difference type from the input params.

Definition at line 619 of file PetscSupport.C.

Referenced by processSingletonMooseWrappedOptions().

620 {
621  if (params.isParamValid("mffd_type"))
622  {
623  const auto & mffd_type = params.get<MooseEnum>("mffd_type");
624  for (const auto i : make_range(fe_problem.numNonlinearSystems()))
625  fe_problem.solverParams(i)._mffd_type = Moose::stringToEnum<Moose::MffdType>(mffd_type);
626  }
627 }
virtual std::size_t numNonlinearSystems() const override
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
Combine two vector parameters into a single vector of pairs.
Moose::MffdType _mffd_type
Definition: SolverParams.h:21
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:33
IntRange< T > make_range(T beg, T end)
SolverParams & solverParams(unsigned int solver_sys_num=0)
Get the solver parameters.
bool isParamValid(const std::string &name) const
This method returns parameters that have been initialized in one fashion or another, i.e.

◆ setSinglePetscOption()

void Moose::PetscSupport::setSinglePetscOption ( const std::string &  name,
const std::string &  value = "",
FEProblemBase *const  problem = nullptr 
)

A wrapper function for dealing with different versions of PetscOptionsSetValue.

This is not generally called from MOOSE code, it is instead intended to be called by stuff in MOOSE::PetscSupport.

Definition at line 1008 of file PetscSupport.C.

Referenced by Moose::SlepcSupport::clearFreeNonlinearPowerIterations(), FEProblemBase::FEProblemBase(), petscSetOptionsHelper(), CommandLine::printUsage(), Moose::SlepcSupport::setEigenSolverOptions(), Moose::SlepcSupport::setFreeNonlinearPowerIterations(), Moose::SlepcSupport::setNewtonPetscOptions(), Moose::SlepcSupport::setNonlinearPowerOptions(), and setSinglePetscOptionIfAppropriate().

1011 {
1012  static const TIMPI::Communicator comm_world(PETSC_COMM_WORLD);
1013  const TIMPI::Communicator & comm = problem ? problem->comm() : comm_world;
1014  LibmeshPetscCallA(comm.get(),
1015  PetscOptionsSetValue(LIBMESH_PETSC_NULLPTR,
1016  name.c_str(),
1017  value == "" ? LIBMESH_PETSC_NULLPTR : value.c_str()));
1018  const auto lower_case_name = MooseUtils::toLower(name);
1019  auto check_problem = [problem, &lower_case_name]()
1020  {
1021  if (!problem)
1022  mooseError(
1023  "Setting the option '",
1024  lower_case_name,
1025  "' requires passing a 'problem' parameter. Contact a developer of your application "
1026  "to have them update their code. If in doubt, reach out to the MOOSE team on Github "
1027  "discussions");
1028  };
1029 
1030  // Select vector type from user-passed PETSc options
1031  if (lower_case_name.find("-vec_type") != std::string::npos)
1032  {
1033  check_problem();
1034  for (auto & solver_system : problem->_solver_systems)
1035  {
1036  auto & lm_sys = solver_system->system();
1037  for (auto & [vec_name, vec] : as_range(lm_sys.vectors_begin(), lm_sys.vectors_end()))
1038  {
1039  libmesh_ignore(vec_name);
1040  auto * const petsc_vec = cast_ptr<PetscVector<Number> *>(vec.get());
1041  LibmeshPetscCallA(comm.get(), VecSetFromOptions(petsc_vec->vec()));
1042  }
1043  // The solution vectors aren't included in the system vectors storage
1044  auto * petsc_vec = cast_ptr<PetscVector<Number> *>(lm_sys.solution.get());
1045  LibmeshPetscCallA(comm.get(), VecSetFromOptions(petsc_vec->vec()));
1046  petsc_vec = cast_ptr<PetscVector<Number> *>(lm_sys.current_local_solution.get());
1047  LibmeshPetscCallA(comm.get(), VecSetFromOptions(petsc_vec->vec()));
1048  }
1049  }
1050  // Select matrix type from user-passed PETSc options
1051  else if (lower_case_name.find("mat_type") != std::string::npos)
1052  {
1053  check_problem();
1054 
1055  bool found_matching_prefix = false;
1056  for (const auto i : index_range(problem->_solver_systems))
1057  {
1058  const auto & solver_sys_name = problem->_solver_sys_names[i];
1059  if (lower_case_name.find("-" + MooseUtils::toLower(solver_sys_name) + "_mat_type") ==
1060  std::string::npos)
1061  continue;
1062 
1063  if (problem->solverParams(i)._type == Moose::ST_JFNK)
1064  mooseError(
1065  "Setting option '", lower_case_name, "' is incompatible with a JFNK 'solve_type'");
1066 
1067  auto & lm_sys = problem->_solver_systems[i]->system();
1068  for (auto & [mat_name, mat] : as_range(lm_sys.matrices_begin(), lm_sys.matrices_end()))
1069  {
1070  libmesh_ignore(mat_name);
1071  if (auto * const petsc_mat = dynamic_cast<PetscMatrixBase<Number> *>(mat.get()); petsc_mat)
1072  {
1073 #ifdef DEBUG
1074  const char * mat_prefix;
1075  LibmeshPetscCallA(comm.get(), MatGetOptionsPrefix(petsc_mat->mat(), &mat_prefix));
1076  mooseAssert(strcmp(mat_prefix, (solver_sys_name + "_").c_str()) == 0,
1077  "We should have prefixed these matrices previously");
1078 #endif
1079  LibmeshPetscCallA(comm.get(), MatSetFromOptions(petsc_mat->mat()));
1080  }
1081  }
1082  found_matching_prefix = true;
1083  break;
1084  }
1085 
1086  if (!found_matching_prefix)
1087  mooseError("We did not find a matching solver system name for the petsc option '",
1088  lower_case_name,
1089  "'");
1090  }
1091 }
std::string name(const ElemQuality q)
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:323
const Parallel::Communicator & comm() const
std::vector< std::shared_ptr< SolverSystem > > _solver_systems
Combined container to base pointer of every solver system.
std::vector< SolverSystemName > _solver_sys_names
The union of nonlinear and linear system names.
void libmesh_ignore(const Args &...)
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
Jacobian-Free Newton Krylov.
Definition: MooseTypes.h:846
Moose::SolveType _type
Definition: SolverParams.h:19
std::string toLower(std::string name)
Convert supplied string to lower case.
communicator & get()
SolverParams & solverParams(unsigned int solver_sys_num=0)
Get the solver parameters.
auto index_range(const T &sizable)

◆ setSinglePetscOptionIfAppropriate()

void Moose::PetscSupport::setSinglePetscOptionIfAppropriate ( const MultiMooseEnum dont_add_these_options,
const std::string &  name,
const std::string &  value = "",
FEProblemBase *const  problem = nullptr 
)

Same as setSinglePetscOption, but does not set the option if it doesn't make sense for the current simulation type, e.g.

if name is contained within dont_add_these_options

Definition at line 1094 of file PetscSupport.C.

Referenced by Moose::SlepcSupport::setEigenProblemOptions(), Moose::SlepcSupport::setSlepcEigenSolverTolerances(), setSolverOptions(), Moose::SlepcSupport::setWhichEigenPairsOptions(), and Moose::SlepcSupport::slepcSetOptions().

1098 {
1099  if (!dont_add_these_options.contains(name))
1100  setSinglePetscOption(name, value, problem);
1101 }
bool contains(const std::string &value) const
Methods for seeing if a value is set in the MultiMooseEnum.
void setSinglePetscOption(const std::string &name, const std::string &value="", FEProblemBase *const problem=nullptr)
A wrapper function for dealing with different versions of PetscOptionsSetValue.

◆ setSolverOptions()

void Moose::PetscSupport::setSolverOptions ( const SolverParams solver_params,
const MultiMooseEnum dont_add_these_options 
)

Definition at line 145 of file PetscSupport.C.

Referenced by petscSetOptions().

146 {
147  const auto prefix_with_dash = '-' + solver_params._prefix;
148  // set PETSc options implied by a solve type
149  switch (solver_params._type)
150  {
151  case Moose::ST_PJFNK:
152  setSinglePetscOptionIfAppropriate(dont_add_these_options,
153  prefix_with_dash + "snes_mf_operator");
154  setSinglePetscOptionIfAppropriate(dont_add_these_options,
155  prefix_with_dash + "mat_mffd_type",
156  stringify(solver_params._mffd_type));
157  break;
158 
159  case Moose::ST_JFNK:
160  setSinglePetscOptionIfAppropriate(dont_add_these_options, prefix_with_dash + "snes_mf");
161  setSinglePetscOptionIfAppropriate(dont_add_these_options,
162  prefix_with_dash + "mat_mffd_type",
163  stringify(solver_params._mffd_type));
164  break;
165 
166  case Moose::ST_NEWTON:
167  break;
168 
169  case Moose::ST_FD:
170  setSinglePetscOptionIfAppropriate(dont_add_these_options, prefix_with_dash + "snes_fd");
171  break;
172 
173  case Moose::ST_LINEAR:
175  dont_add_these_options, prefix_with_dash + "snes_type", "ksponly");
176  setSinglePetscOptionIfAppropriate(dont_add_these_options,
177  prefix_with_dash + "snes_monitor_cancel");
178  break;
179  }
180 
181  Moose::LineSearchType ls_type = solver_params._line_search;
182  if (ls_type == Moose::LS_NONE)
183  ls_type = Moose::LS_BASIC;
184 
185  if (ls_type != Moose::LS_DEFAULT && ls_type != Moose::LS_CONTACT && ls_type != Moose::LS_PROJECT)
187  dont_add_these_options, prefix_with_dash + "snes_linesearch_type", stringify(ls_type));
188 }
Full Newton Solve.
Definition: MooseTypes.h:847
std::string _prefix
Definition: SolverParams.h:35
Moose::LineSearchType _line_search
Definition: SolverParams.h:20
Solving a linear problem.
Definition: MooseTypes.h:849
Moose::MffdType _mffd_type
Definition: SolverParams.h:21
LineSearchType
Type of the line search.
Definition: MooseTypes.h:926
std::string stringify(const MffdType &t)
Definition: PetscSupport.C:130
Jacobian-Free Newton Krylov.
Definition: MooseTypes.h:846
Moose::SolveType _type
Definition: SolverParams.h:19
Use finite differences to compute Jacobian.
Definition: MooseTypes.h:848
void setSinglePetscOptionIfAppropriate(const MultiMooseEnum &dont_add_these_options, const std::string &name, const std::string &value="", FEProblemBase *const problem=nullptr)
Same as setSinglePetscOption, but does not set the option if it doesn&#39;t make sense for the current si...
Preconditioned Jacobian-Free Newton Krylov.
Definition: MooseTypes.h:845

◆ setSolveTypeFromParams()

void Moose::PetscSupport::setSolveTypeFromParams ( FEProblemBase fe_problem,
const InputParameters params 
)

Sets the FE problem's solve type from the input params.

Definition at line 574 of file PetscSupport.C.

Referenced by MoosePreconditioner::MoosePreconditioner(), and processSingletonMooseWrappedOptions().

575 {
576  // Note: Options set in the Preconditioner block will override those set in the Executioner block
577  if (params.isParamValid("solve_type") && !params.isParamValid("_use_eigen_value"))
578  {
579  // Extract the solve type
580  const std::string & solve_type = params.get<MooseEnum>("solve_type");
581  for (const auto i : make_range(fe_problem.numNonlinearSystems()))
582  fe_problem.solverParams(i)._type = Moose::stringToEnum<Moose::SolveType>(solve_type);
583  }
584 }
virtual std::size_t numNonlinearSystems() const override
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
Combine two vector parameters into a single vector of pairs.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
Definition: MooseEnum.h:33
Moose::SolveType _type
Definition: SolverParams.h:19
IntRange< T > make_range(T beg, T end)
SolverParams & solverParams(unsigned int solver_sys_num=0)
Get the solver parameters.
bool isParamValid(const std::string &name) const
This method returns parameters that have been initialized in one fashion or another, i.e.

◆ storePetscOptions()

void Moose::PetscSupport::storePetscOptions ( FEProblemBase fe_problem,
const std::string &  prefix,
const ParallelParamObject param_object 
)

Stores the PETSc options supplied from the parameter object on the problem.

Parameters
fe_problemThe problem on which we will store the parameters
prefixA prefix to apply to all the parameter object's PETSc options. This should either be a single character '-' or a string like "-foo_" where the trailing '_' is required
param_objectThe parameter object potentially holding PETSc options String prefixes may be used to select the system the parameters is applied to

Definition at line 549 of file PetscSupport.C.

Referenced by FEProblemSolve::FEProblemSolve(), MooseStaticCondensationPreconditioner::initialSetup(), MoosePreconditioner::initialSetup(), and Split::setup().

552 {
553  const auto & params = param_object.parameters();
554  processSingletonMooseWrappedOptions(fe_problem, params);
555 
556  // The parameters contained in the Action
557  const auto & petsc_options = params.get<MultiMooseEnum>("petsc_options");
558  const auto & petsc_pair_options =
559  params.get<MooseEnumItem, std::string>("petsc_options_iname", "petsc_options_value");
560 
561  // A reference to the PetscOptions object that contains the settings that will be used in the
562  // solve
563  auto & po = fe_problem.getPetscOptions();
564 
565  // First process the single petsc options/flags
566  addPetscFlagsToPetscOptions(petsc_options, prefix, param_object, po);
567 
568  // Then process the option-value pairs
570  petsc_pair_options, fe_problem.mesh().dimension(), prefix, param_object, po);
571 }
Moose::PetscSupport::PetscOptions & getPetscOptions()
Retrieve a writable reference the PETSc options (used by PetscSupport)
void addPetscFlagsToPetscOptions(const MultiMooseEnum &petsc_flags, std::string prefix, const ParallelParamObject &param_object, PetscOptions &petsc_options)
Populate flags in a given PetscOptions object using a vector of input arguments.
Definition: PetscSupport.C:639
void addPetscPairsToPetscOptions(const std::vector< std::pair< MooseEnumItem, std::string >> &petsc_pair_options, const unsigned int mesh_dimension, std::string prefix, const ParallelParamObject &param_object, PetscOptions &petsc_options)
Populate name and value pairs in a given PetscOptions object using vectors of input arguments...
Definition: PetscSupport.C:700
const InputParameters & parameters() const
Get the parameters of the object.
Definition: MooseBase.h:131
void processSingletonMooseWrappedOptions(FEProblemBase &fe_problem, const InputParameters &params)
Process some MOOSE-wrapped PETSc options.
Definition: PetscSupport.C:534
virtual unsigned int dimension() const
Returns MeshBase::mesh_dimension(), (not MeshBase::spatial_dimension()!) of the underlying libMesh me...
Definition: MooseMesh.C:2968
unsigned int get(unsigned int i) const
Indexing operator Operator to retrieve the id of an item from the MultiMooseEnum. ...
Class for containing MooseEnum item information.
Definition: MooseEnumItem.h:18
virtual MooseMesh & mesh() override
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...

◆ storePetscOptionsFromParams()

void Moose::PetscSupport::storePetscOptionsFromParams ( FEProblemBase fe_problem,
const InputParameters params 
)

Stores the Petsc flags and pair options fron the input params in the given PetscOptions object.

◆ stringify() [1/2]

std::string Moose::PetscSupport::stringify ( const LineSearchType t)

Definition at line 101 of file PetscSupport.C.

102 {
103  switch (t)
104  {
105  case LS_BASIC:
106  return "basic";
107  case LS_DEFAULT:
108  return "default";
109  case LS_NONE:
110  return "none";
111  case LS_SHELL:
112  return "shell";
113  case LS_L2:
114  return "l2";
115  case LS_BT:
116  return "bt";
117  case LS_CP:
118  return "cp";
119  case LS_CONTACT:
120  return "contact";
121  case LS_PROJECT:
122  return "project";
123  case LS_INVALID:
124  mooseError("Invalid LineSearchType");
125  }
126  return "";
127 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:323
means not set
Definition: MooseTypes.h:928

◆ stringify() [2/2]

std::string Moose::PetscSupport::stringify ( const MffdType t)

Definition at line 130 of file PetscSupport.C.

Referenced by setSolverOptions().

131 {
132  switch (t)
133  {
134  case MFFD_WP:
135  return "wp";
136  case MFFD_DS:
137  return "ds";
138  case MFFD_INVALID:
139  mooseError("Invalid MffdType");
140  }
141  return "";
142 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:323
means not set
Definition: MooseTypes.h:945