22 params.
addParam<std::vector<SolverSystemName>>(
23 "active_scalar_systems", {},
"The solver system for each active scalar advection equation.");
28 params.
addParam<std::vector<Real>>(
"active_scalar_equation_relaxation",
30 "The relaxation which should be used for the active scalar " 31 "equations. (=1 for no relaxation, " 32 "diagonal dominance will still be enforced)");
36 "Singleton PETSc options for the active scalar equation(s)");
38 "active_scalar_petsc_options_iname",
40 "Names of PETSc name/value pairs for the active scalar equation(s)");
41 params.
addParam<std::vector<std::string>>(
42 "active_scalar_petsc_options_value",
43 "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\" for the " 44 "active scalar equation(s)");
46 "active_scalar_absolute_tolerance",
48 "The absolute tolerance(s) on the normalized residual(s) of the active scalar equation(s).");
51 "0.0<=active_scalar_l_tol & active_scalar_l_tol<1.0",
52 "The relative tolerance on the normalized residual in the " 53 "linear solver of the active scalar equation(s).");
56 "0.0<active_scalar_l_abs_tol",
57 "The absolute tolerance on the normalized residual in the " 58 "linear solver of the active scalar equation(s).");
60 "active_scalar_l_max_its",
62 "The maximum allowed iterations in the linear solver of the turbulence equation.");
65 "active_scalar_systems active_scalar_equation_relaxation active_scalar_petsc_options " 66 "active_scalar_petsc_options_iname " 67 "active_scalar_petsc_options_value active_scalar_petsc_options_value " 68 "active_scalar_absolute_tolerance " 69 "active_scalar_l_tol active_scalar_l_abs_tol active_scalar_l_max_its",
70 "Active Scalars Equations");
77 _pressure_sys_number(_problem.linearSysNum(getParam<SolverSystemName>(
"pressure_system"))),
78 _pressure_system(_problem.getLinearSystem(_pressure_sys_number)),
79 _energy_sys_number(_has_energy_system
80 ? _problem.linearSysNum(getParam<SolverSystemName>(
"energy_system"))
82 _energy_system(_has_energy_system ? &_problem.getLinearSystem(_energy_sys_number) : nullptr),
83 _solid_energy_sys_number(
84 _has_solid_energy_system
85 ? _problem.linearSysNum(getParam<SolverSystemName>(
"solid_energy_system"))
88 _has_solid_energy_system ? &_problem.getLinearSystem(_solid_energy_sys_number) : nullptr),
89 _active_scalar_system_names(getParam<
std::vector<SolverSystemName>>(
"active_scalar_systems")),
90 _has_active_scalar_systems(!_active_scalar_system_names.empty()),
91 _active_scalar_equation_relaxation(
92 getParam<
std::vector<
Real>>(
"active_scalar_equation_relaxation")),
93 _active_scalar_l_abs_tol(getParam<
Real>(
"active_scalar_l_abs_tol")),
94 _active_scalar_absolute_tolerance(
95 getParam<
std::vector<
Real>>(
"active_scalar_absolute_tolerance"))
127 system->system().prefix_with_name(
false);
138 const auto & active_scalar_petsc_options =
139 getParam<MultiMooseEnum>(
"active_scalar_petsc_options");
140 const auto & active_scalar_petsc_pair_options = getParam<MooseEnumItem, std::string>(
141 "active_scalar_petsc_options_iname",
"active_scalar_petsc_options_value");
151 getParam<Real>(
"active_scalar_l_tol");
153 getParam<Real>(
"active_scalar_l_abs_tol");
155 getParam<unsigned int>(
"active_scalar_l_max_its");
159 paramError(
"active_scalar_equation_relaxation",
160 "Should be the same size as the number of systems");
167 const_cast<RhieChowMassFlux *
>(&getUserObject<RhieChowMassFlux>(
"rhie_chow_user_object"));
177 std::vector<std::pair<unsigned int, Real>>
182 std::vector<std::pair<unsigned int, Real>> its_normalized_residuals;
188 libMesh::cast_ref<PetscLinearSolver<Real> &>(*momentum_system_0.
get_linear_solver());
199 libMesh::cast_ref<LinearImplicitSystem &>(
_momentum_systems[system_i]->system());
220 LibmeshPetscCall(KSPSetNormType(momentum_solver.ksp(), KSP_NORM_UNPRECONDITIONED));
227 auto its_resid_pair = momentum_solver.solve(mmat, mmat, solution, rhs);
232 momentum_solver.reuse_preconditioner(
true);
235 its_normalized_residuals.push_back(
236 std::make_pair(its_resid_pair.first, momentum_solver.get_initial_residual() / norm_factor));
240 _console <<
" solution after solve " << std::endl;
242 _console <<
" matrix when we solve " << std::endl;
244 _console <<
" rhs when we solve " << std::endl;
246 _console <<
" velocity solution component " << system_i << std::endl;
248 _console <<
"Norm factor " << norm_factor << std::endl;
255 ? std::string(
" Component ") + std::to_string(system_i + 1) + std::string(
" ")
257 << COLOR_GREEN << its_normalized_residuals[system_i].second << COLOR_DEFAULT
258 <<
" Linear its: " << its_normalized_residuals[system_i].first << std::endl;
264 libMesh::cast_ref<LinearImplicitSystem &>(
_momentum_systems[system_i]->system());
271 momentum_solver.reuse_preconditioner(
false);
273 return its_normalized_residuals;
276 std::pair<unsigned int, Real>
293 libMesh::cast_ref<PetscLinearSolver<Real> &>(*pressure_system.
get_linear_solver());
299 _console <<
"Pressure matrix" << std::endl;
307 LibmeshPetscCall(KSPSetNormType(pressure_solver.
ksp(), KSP_NORM_UNPRECONDITIONED));
317 auto its_res_pair = pressure_solver.
solve(mmat, mmat, solution, rhs);
322 _console <<
" rhs when we solve pressure " << std::endl;
324 _console <<
" Pressure " << std::endl;
326 _console <<
"Norm factor " << norm_factor << std::endl;
331 const auto residuals =
334 _console <<
" Pressure equation: " << COLOR_GREEN << residuals.second << COLOR_DEFAULT
335 <<
" Linear its: " << residuals.first << std::endl;
340 std::pair<unsigned int, Real>
363 _console <<
"Solid energy matrix" << std::endl;
371 LibmeshPetscCall(KSPSetNormType(solver.
ksp(), KSP_NORM_UNPRECONDITIONED));
377 auto its_res_pair = solver.
solve(mmat, mmat, solution, rhs);
382 _console <<
" rhs when we solve solid energy " << std::endl;
384 _console <<
" Solid energy " << std::endl;
386 _console <<
"Norm factor " << norm_factor << std::endl;
391 const auto residuals =
394 _console <<
" Solid energy equation: " << COLOR_GREEN << residuals.second << COLOR_DEFAULT
395 <<
" Linear its: " << residuals.first << std::endl;
400 std::pair<unsigned int, Real>
402 const bool recompute_face_mass_flux,
419 if (recompute_face_mass_flux)
430 pressure_old_solution = pressure_current_solution;
442 std::pair<unsigned int, Real>
445 const Real relaxation_factor,
447 const Real absolute_tol)
475 _console << system.
name() <<
" system matrix" << std::endl;
483 LibmeshPetscCall(KSPSetNormType(linear_solver.
ksp(), KSP_NORM_UNPRECONDITIONED));
490 auto its_res_pair = linear_solver.
solve(mmat, mmat, solution, rhs);
495 _console <<
" rhs when we solve " << system.
name() << std::endl;
499 _console <<
" Norm factor " << norm_factor << std::endl;
504 const auto residuals =
507 _console <<
" Advected system: " << system.
name() <<
" " << COLOR_GREEN << residuals.second
508 << COLOR_DEFAULT <<
" Linear its: " << residuals.first << std::endl;
522 solver_params.
_type = Moose::SolveType::ST_LINEAR;
523 solver_params.
_line_search = Moose::LineSearchType::LS_NONE;
526 unsigned int simple_iteration_counter = 0;
531 std::vector<std::pair<unsigned int, Real>> ns_residuals(no_systems, std::make_pair(0, 1.0));
540 ns_abs_tols.push_back(scalar_tol);
546 simple_iteration_counter++;
555 if (simple_iteration_counter == 1)
558 _console <<
"Iteration " << simple_iteration_counter <<
" Initial residual norms:" << std::endl;
562 for (
const auto system_i :
index_range(momentum_residual))
563 ns_residuals[system_i] = momentum_residual[system_i];
567 ns_residuals[momentum_residual.size()] =
correctVelocity(
true,
true, solver_params);
623 bool passive_scalar_converged =
false;
624 unsigned int ps_iteration_counter = 0;
626 _console <<
"Passive scalar iteration " << ps_iteration_counter
627 <<
" Initial residual norms:" << std::endl;
629 while (ps_iteration_counter <
_num_iterations && !passive_scalar_converged)
631 ps_iteration_counter++;
632 std::vector<std::pair<unsigned int, Real>> scalar_residuals(
634 std::vector<Real> scalar_abs_tols;
636 scalar_abs_tols.push_back(scalar_tol);
MultiMooseEnum getCommonPetscKeys()
void relaxMatrix(SparseMatrix< Number > &matrix_in, const Real relaxation_parameter, NumericVector< Number > &diff_diagonal)
Relax the matrix to ensure diagonal dominance, we hold onto the difference in diagonals for later use...
const std::vector< Real > _active_scalar_equation_relaxation
The user-defined relaxation parameter(s) for the active scalar equation(s)
static InputParameters validParams()
SIMPLESolverConfiguration _momentum_linear_control
Options for the linear solver of the momentum equation.
const Real _energy_absolute_tolerance
The user-defined absolute tolerance for determining the convergence in energy.
const unsigned int _num_iterations
The maximum number of momentum-pressure iterations.
User object responsible for determining the face fluxes using the Rhie-Chow interpolation in a segreg...
SIMPLESolverConfiguration _energy_linear_control
Options for the linear solver of the energy equation.
const unsigned int invalid_uint
const bool _print_fields
Debug parameter which allows printing the coupling and solution vectors/matrices. ...
const Real _solid_energy_l_abs_tol
Absolute linear tolerance for the energy equations.
const bool _has_energy_system
Boolean for easy check if a fluid energy system shall be solved or not.
Moose::LineSearchType _line_search
Real computeNormalizationFactor(const NumericVector< Number > &solution, const SparseMatrix< Number > &mat, const NumericVector< Number > &rhs)
Compute a normalization factor which is applied to the linear residual to determine convergence...
SIMPLESolverConfiguration _active_scalar_linear_control
Options for the linear solver of the active scalar equation(s)
const Real _passive_scalar_l_abs_tol
Absolute linear tolerance for the passive scalar equation(s).
std::pair< unsigned int, Real > solveSolidEnergy()
Solve an equation which contains the solid energy conservation.
std::vector< LinearSystem * > _passive_scalar_systems
Pointer(s) to the system(s) corresponding to the passive scalar equation(s)
Moose::PetscSupport::PetscOptions _solid_energy_petsc_options
Options which hold the petsc settings for the fluid energy equation.
const Real _momentum_equation_relaxation
The user-defined relaxation parameter for the momentum equation.
virtual std::unique_ptr< NumericVector< T > > zero_clone() const=0
void computeFaceMassFlux()
Update the values of the face velocities in the containers.
static InputParameters validParams()
LinearSystem * _solid_energy_system
Pointer to the nonlinear system corresponding to the solid energy equation.
NumericVector< Number > * rhs
const Real _momentum_l_abs_tol
Absolute linear tolerance for the momentum equation(s).
void setSolution(const NumericVector< Number > &soln)
const bool _has_active_scalar_systems
Boolean for easy check if a active scalar systems shall be solved or not.
virtual std::pair< unsigned int, Real > solve(SparseMatrix< T > &matrix_in, NumericVector< T > &solution_in, NumericVector< T > &rhs_in, const std::optional< double > tol=std::nullopt, const std::optional< unsigned int > m_its=std::nullopt) override
const Real _active_scalar_l_abs_tol
Absolute linear tolerance for the active scalar equation(s).
virtual LinearSolver< Number > * get_linear_solver() const override
RhieChowMassFlux * _rc_uo
Pointer to the segregated RhieChow interpolation object.
The following methods are specializations for using the Parallel::packed_range_* routines for a vecto...
void relaxRightHandSide(NumericVector< Number > &rhs_in, const NumericVector< Number > &solution_in, const NumericVector< Number > &diff_diagonal)
Relax the right hand side of an equation, this needs to be called once and the system matrix has been...
std::map< std::string, Real > real_valued_data
virtual std::pair< unsigned int, Real > correctVelocity(const bool subtract_updated_pressure, const bool recompute_face_mass_flux, const SolverParams &solver_params)
Computes new velocity field based on computed pressure gradients.
bool converged(const std::vector< std::pair< unsigned int, Real >> &residuals, const std::vector< Real > &abs_tolerances)
Based on the residuals, determine if the iterative process converged or not.
const Real _pressure_absolute_tolerance
The user-defined absolute tolerance for determining the convergence in pressure.
const Real _pressure_variable_relaxation
The user-defined relaxation parameter for the pressure variable.
virtual void computeLinearSystemSys(libMesh::LinearImplicitSystem &sys, libMesh::SparseMatrix< libMesh::Number > &system_matrix, NumericVector< libMesh::Number > &rhs, const bool compute_gradients=true)
const Real _momentum_absolute_tolerance
The user-defined absolute tolerance for determining the convergence in momentum.
virtual const std::string & name() const
const std::vector< SolverSystemName > & _passive_scalar_system_names
The names of the passive scalar systems.
const unsigned int _solid_energy_sys_number
The number of the system corresponding to the solid energy equation.
std::vector< LinearSystem * > _active_scalar_systems
Pointer(s) to the system(s) corresponding to the active scalar equation(s)
SIMPLESolverConfiguration _passive_scalar_linear_control
Options for the linear solver of the passive scalar equation(s)
void computeHbyA(const bool with_updated_pressure, const bool verbose)
Computes the inverse of the diagonal (1/A) of the system matrix plus the H/A components for the press...
virtual void execute(const ExecFlagType &exec_type)
Moose::PetscSupport::PetscOptions _energy_petsc_options
Options which hold the petsc settings for the fluid energy equation.
LinearSystem & _pressure_system
Reference to the nonlinear system corresponding to the pressure equation.
std::vector< unsigned int > _momentum_system_numbers
The number(s) of the system(s) corresponding to the momentum equation(s)
SIMPLESolverConfiguration _pressure_linear_control
Options for the linear solver of the pressure equation.
MultiMooseEnum getCommonPetscFlags()
LinearSystem * _energy_system
Pointer to the nonlinear system corresponding to the fluid energy equation.
const unsigned int _energy_sys_number
The number of the system corresponding to the energy equation.
Moose::PetscSupport::PetscOptions _passive_scalar_petsc_options
Options which hold the petsc settings for the passive scalar equation(s)
virtual unsigned int dimension() const
std::map< std::string, int > int_valued_data
virtual std::unique_ptr< SparseMatrix< T > > zero_clone() const=0
void linkMomentumPressureSystems(const std::vector< LinearSystem *> &momentum_systems, const LinearSystem &pressure_system, const std::vector< unsigned int > &momentum_system_numbers)
Update the momentum system-related information.
Moose::PetscSupport::PetscOptions _momentum_petsc_options
Options which hold the petsc settings for the momentum equation.
const Real _pressure_l_abs_tol
Absolute linear tolerance for the pressure equation.
const std::vector< Real > _passive_scalar_absolute_tolerance
The user-defined absolute tolerance for determining the convergence in passive scalars.
std::unique_ptr< NumericVector< Number > > solution
dof_id_type _pressure_pin_dof
The dof ID where the pressure needs to be pinned.
void computeCellVelocity()
Update the cell values of the velocity variables.
virtual bool solve() override
Performs the momentum pressure coupling.
virtual void print(std::ostream &os=libMesh::out) const
const bool _pin_pressure
If the pressure needs to be pinned.
void paramError(const std::string ¶m, Args... args) const
const Real _energy_l_abs_tol
Absolute linear tolerance for the energy equations.
std::string stringify(const T &t)
void petscSetOptions(const PetscOptions &po, const SolverParams &solver_params, FEProblemBase *const problem=nullptr)
virtual void linkRhieChowUserObject() override
Fetch the Rhie Chow user object that is reponsible for determining face velocities and mass flux...
LinearSystem & getLinearSystem(unsigned int sys_num)
void set_solver_configuration(SolverConfiguration &solver_configuration)
const std::vector< SolverSystemName > & _momentum_system_names
The names of the momentum systems.
LinearAssemblySegregatedSolve(Executioner &ex)
const ExecFlagType EXEC_NONLINEAR
const std::vector< Real > _passive_scalar_equation_relaxation
The user-defined relaxation parameter(s) for the passive scalar equation(s)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const std::vector< SolverSystemName > & _active_scalar_system_names
The names of the active scalar systems.
void addPetscPairsToPetscOptions(const std::vector< std::pair< MooseEnumItem, std::string >> &petsc_pair_options, const unsigned int mesh_dimension, const std::string &prefix, const ParallelParamObject ¶m_object, PetscOptions &petsc_options)
Real get_initial_residual()
const Real _energy_equation_relaxation
The user-defined relaxation parameter for the energy equation.
SparseMatrix< Number > * matrix
void setCurrentLinearSystem(unsigned int sys_num)
std::vector< LinearSystem * > _systems_to_solve
Shortcut to every linear system that we solve for here.
const Real _pressure_pin_value
The value we want to enforce for pressure.
virtual std::vector< std::pair< unsigned int, Real > > solveMomentumPredictor() override
Solve a momentum predictor step with a fixed pressure field.
virtual MooseMesh & mesh() override
unsigned int linearSysNum(const LinearSystemName &linear_sys_name) const override
virtual std::pair< unsigned int, Real > solvePressureCorrector() override
Solve a pressure corrector step.
Moose::PetscSupport::PetscOptions _active_scalar_petsc_options
Options which hold the petsc settings for the active scalar equation(s)
std::unique_ptr< NumericVector< Number > > current_local_solution
virtual const NumericVector< Number > * solutionPreviousNewton() const
Solve class serving as a base class for the two SIMPLE solvers that operate with different assembly a...
const bool _has_passive_scalar_systems
Boolean for easy check if a passive scalar systems shall be solved or not.
const std::vector< Real > _active_scalar_absolute_tolerance
The user-defined absolute tolerance for determining the convergence in active scalars.
void addPetscFlagsToPetscOptions(const MultiMooseEnum &petsc_flags, const std::string &prefix, const ParallelParamObject ¶m_object, PetscOptions &petsc_options)
const ConsoleStream _console
const Real _solid_energy_absolute_tolerance
The user-defined absolute tolerance for determining the convergence in solid energy.
std::vector< unsigned int > _active_scalar_system_numbers
SIMPLESolverConfiguration _solid_energy_linear_control
Options for the linear solver of the energy equation.
std::vector< LinearSystem * > _momentum_systems
Pointer(s) to the system(s) corresponding to the momentum equation(s)
const bool _continue_on_max_its
If solve should continue if maximum number of iterations is hit.
void constrainSystem(SparseMatrix< Number > &mx, NumericVector< Number > &rhs, const Real desired_value, const dof_id_type dof_id)
Implicitly constrain the system by adding a factor*(u-u_desired) to it at a desired dof value...
bool isRecovering() const
void relaxSolutionUpdate(NumericVector< Number > &vec_new, const NumericVector< Number > &vec_old, const Real relaxation_factor)
Relax the update on a solution field using the following approach: $u = u_{old}+ (u - u_{old})$...
auto index_range(const T &sizable)
void print(std::ostream &os=libMesh::out, const bool sparse=false) const
std::vector< unsigned int > _passive_scalar_system_numbers
void initCouplingField()
Initialize the coupling fields (HbyA and Ainv)
Moose::PetscSupport::PetscOptions _pressure_petsc_options
Options which hold the petsc settings for the pressure equation.
virtual System & system() override
const bool _has_solid_energy_system
Boolean for easy check if a solid energy system shall be solved or not.
void initFaceMassFlux()
Initialize the container for face velocities.
std::pair< unsigned int, Real > solveAdvectedSystem(const unsigned int system_num, LinearSystem &system, const Real relaxation_factor, libMesh::SolverConfiguration &solver_config, const Real abs_tol)
Solve an equation which contains an advection term that depends on the solution of the segregated Nav...
const unsigned int _pressure_sys_number
The number of the system corresponding to the pressure equation.