https://mooseframework.inl.gov
Loading...
Searching...
No Matches
TimeIntegrator.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#include "TimeIntegrator.h"
11#include "FEProblem.h"
12#include "NonlinearSystemBase.h"
13
14#include "libmesh/nonlinear_implicit_system.h"
15#include "libmesh/nonlinear_solver.h"
16#include "libmesh/dof_map.h"
17
18using namespace libMesh;
19
22{
24 params.addParam<std::vector<VariableName>>(
25 "variables", {}, "A subset of the variables that this time integrator should be applied to");
26 params.registerBase("TimeIntegrator");
27 return params;
28}
29
31 : MooseObject(parameters),
32 Restartable(this, "TimeIntegrators"),
33 NonlinearTimeIntegratorInterface(*getCheckedPointerParam<FEProblemBase *>("_fe_problem_base"),
34 *getCheckedPointerParam<SystemBase *>("_sys")),
35 LinearTimeIntegratorInterface(*getCheckedPointerParam<SystemBase *>("_sys")),
36 _fe_problem(*getCheckedPointerParam<FEProblemBase *>("_fe_problem_base")),
37 _sys(*getCheckedPointerParam<SystemBase *>("_sys")),
38 _du_dot_du(_sys.duDotDus()),
39 _solution(_sys.currentSolution()),
40 _solution_old(_sys.solutionState(1)),
41 _solution_sub(declareRestartableDataWithContext<std::unique_ptr<NumericVector<Number>>>(
42 "solution_sub", &const_cast<libMesh::Parallel::Communicator &>(this->comm()))),
43 _solution_old_sub(declareRestartableDataWithContext<std::unique_ptr<NumericVector<Number>>>(
44 "solution_old_sub", &const_cast<libMesh::Parallel::Communicator &>(this->comm()))),
45 _t_step(_fe_problem.timeStep()),
46 _dt(_fe_problem.dt()),
47 _dt_old(_fe_problem.dtOld()),
48 _n_nonlinear_iterations(0),
49 _n_linear_iterations(0),
50 _is_lumped(false),
51 _var_restriction(declareRestartableData<bool>(
52 "var_restriction", !getParam<std::vector<VariableName>>("variables").empty())),
53 _local_indices(declareRestartableData<std::vector<dof_id_type>>("local_indices")),
54 _vars(declareRestartableData<std::unordered_set<unsigned int>>("vars")),
55 _from_subvector(
57{
59}
60
61void
63{
65 return;
66
67 const auto & var_names = getParam<std::vector<VariableName>>("variables");
68 std::vector<unsigned int> var_num_vec;
69 auto & lm_sys = _sys.system();
70 lm_sys.get_all_variable_numbers(var_num_vec);
71 std::unordered_set<unsigned int> var_nums(var_num_vec.begin(), var_num_vec.end());
72 for (const auto & var_name : var_names)
73 if (lm_sys.has_variable(var_name))
74 {
75 const auto var_num = lm_sys.variable_number(var_name);
76 _vars.insert(var_num);
77 var_nums.erase(var_num);
78 }
79
80 // If var_nums is empty then that means the user has specified all the variables in this system
81 if (var_nums.empty())
82 {
83 _var_restriction = false;
84 return;
85 }
86
87 std::vector<dof_id_type> var_dof_indices, work_vec;
88 for (const auto var_num : _vars)
89 {
90 work_vec = _local_indices;
91 _local_indices.clear();
92 lm_sys.get_dof_map().local_variable_indices(var_dof_indices, lm_sys.get_mesh(), var_num);
93 std::merge(work_vec.begin(),
94 work_vec.end(),
95 var_dof_indices.begin(),
96 var_dof_indices.end(),
97 std::back_inserter(_local_indices));
98 }
99
104}
105
106void
108{
109 mooseError("Calling TimeIntegrator::solve() is no longer supported");
110}
111
112void
118
119unsigned int
124
125unsigned int
127{
128 auto & nonlinear_solver = _nonlinear_implicit_system->nonlinear_solver;
129 libmesh_assert(nonlinear_solver);
130
131 return nonlinear_solver->get_total_linear_iterations();
132}
133
134void
136{
137 if (!_var_restriction)
138 to = from;
139 else
140 {
141 auto to_sub = to.get_subvector(_local_indices);
143 *to_sub = *_from_subvector;
144 to.restore_subvector(std::move(to_sub), _local_indices);
145 }
146}
147
148bool
149TimeIntegrator::integratesVar(const unsigned int var_num) const
150{
151 if (!_var_restriction)
152 return true;
153
154 return _vars.count(var_num);
155}
156
157void
159{
160 const auto coeff = duDotDuCoeff();
161 for (const auto i : index_range(_du_dot_du))
162 if (integratesVar(i))
163 _du_dot_du[i] = coeff / _dt;
164}
void ErrorVector unsigned int
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
virtual void setUDotRequested(const bool u_dot_requested)
Set boolean flag to true to store solution time derivative.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
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.
void registerBase(const std::string &value)
This method must be called from every base "Moose System" to create linkage with the Action System.
Interface class for routines and member variables for time integrators relying on linear system assem...
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
Every object that can be built by the factory should be derived from this class.
Definition MooseObject.h:31
static InputParameters validParams()
Definition MooseObject.C:25
Interface class for routines and member variables for time integrators relying on Newton's method.
libMesh::NonlinearImplicitSystem * _nonlinear_implicit_system
libMesh nonlinear implicit system, if applicable; otherwise, nullptr
A class for creating restricted objects.
Definition Restartable.h:29
Base class for a system (of equations)
Definition SystemBase.h:87
virtual libMesh::System & system()=0
Get the reference to the libMesh system.
std::vector< dof_id_type > & _local_indices
The local degree of freedom indices this time integrator is being applied to.
bool & _var_restriction
Whether the user has requested that the time integrator be applied to a subset of variables.
std::unique_ptr< NumericVector< Number > > & _solution_old_sub
void setNumIterationsLastSolve()
Record the linear and nonlinear iterations from a just finished solve.
void computeDuDotDu()
Compute _du_dot_du.
unsigned int getNumLinearIterationsLastSolve() const
Gets the number of linear iterations in the most recent solve.
std::unordered_set< unsigned int > & _vars
The variables that this time integrator integrates.
void copyVector(const NumericVector< Number > &from, NumericVector< Number > &to)
Copy from one vector into another.
const NumericVector< Number > *const & _solution
unsigned int _n_linear_iterations
Total number of linear iterations over all stages of the time step.
std::unique_ptr< NumericVector< Number > > _from_subvector
A vector that is used for creating 'from' subvectors in the copyVector() method.
bool integratesVar(const unsigned int var_num) const
unsigned int _n_nonlinear_iterations
Total number of nonlinear iterations over all stages of the time step.
static InputParameters validParams()
FEProblemBase & _fe_problem
Reference to the problem.
virtual void init()
Called only before the very first timestep (t_step = 0) Never called again (not even during recover/r...
unsigned int getNumNonlinearIterationsLastSolve() const
Gets the number of nonlinear iterations in the most recent solve.
SystemBase & _sys
Reference to the system this time integrator operates on.
virtual void solve()
Solves the time step and sets the number of nonlinear and linear iterations.
Real & _dt
The current time step size.
TimeIntegrator(const InputParameters &parameters)
std::vector< Real > & _du_dot_du
Derivative of time derivative with respect to current solution: for the different variables.
std::unique_ptr< NumericVector< Number > > & _solution_sub
virtual Real duDotDuCoeff() const
const NumericVector< Number > & _solution_old
std::unique_ptr< NonlinearSolver< Number > > nonlinear_solver
unsigned int n_nonlinear_iterations() const
virtual std::unique_ptr< NumericVector< T > > get_subvector(const std::vector< numeric_index_type > &)
virtual void create_subvector(NumericVector< T > &, const std::vector< numeric_index_type > &, bool=true) const
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
virtual void restore_subvector(std::unique_ptr< NumericVector< T > >, const std::vector< numeric_index_type > &)
const Parallel::Communicator & comm() const
void get_all_variable_numbers(std::vector< unsigned int > &all_variable_numbers) const
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
auto index_range(const T &sizable)
SolverPackage default_solver_package()
libmesh_assert(ctx)
Real Number
uint8_t dof_id_type