https://mooseframework.inl.gov
Loading...
Searching...
No Matches
ActuallyExplicitEuler.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// MOOSE includes
12#include "NonlinearSystem.h"
13#include "FEProblem.h"
14
15// libMesh includes
16#include "libmesh/nonlinear_solver.h"
17
19
22{
24
26 "Implementation of Explicit/Forward Euler without invoking any of the nonlinear solver");
27
28 params.addParam<bool>("use_constant_mass",
29 false,
30 "If set to true, will only compute the mass matrix in the first time step, "
31 "and keep using it throughout the simulation.");
32
33 return params;
34}
35
37 : ExplicitTimeIntegrator(parameters), _constant_mass(getParam<bool>("use_constant_mass"))
38{
39}
40
41void
43{
44 if (!_sys.solutionUDot())
45 mooseError("ActuallyExplicitEuler: Time derivative of solution (`u_dot`) is not stored. Please "
46 "set uDotRequested() to true in FEProblemBase before requesting `u_dot`.");
47
48 NumericVector<Number> & u_dot = *_sys.solutionUDot();
49 u_dot = *_solution;
51 u_dot.close();
53}
54
55void
57 const dof_id_type & dof,
58 ADReal & /*ad_u_dotdot*/) const
59{
61}
62
63void
65{
66 // Reset iteration counts
69
71
72 // Set time to the time at which to evaluate the residual
75
76 // Compute the residual
77 _explicit_residual->zero();
80
81 // Move the residual to the RHS
82 *_explicit_residual *= -1.0;
83
84 // Compute the mass matrix
85 auto & mass_matrix = _nonlinear_implicit_system->get_system_matrix();
86 if (!_constant_mass || (_constant_mass && _t_step == 1))
89
90 // Perform the linear solve
91 bool converged = performExplicitSolve(mass_matrix);
92
93 // Update the solution
96
97 // Constraints may be solved in an uncoupled way. For example, momentum-balance equations may be
98 // solved node-wise and then the solution (e.g. velocities or positions)can be applied to those
99 // nodes without solving for such constraints on a system level. This strategy is being used for
100 // node-face contact in explicit dynamics.
102
103 // Enforce contraints on the solution
104 DofMap & dof_map = _nonlinear_implicit_system->get_dof_map();
108
110
111 _nonlinear_implicit_system->nonlinear_solver->converged = converged;
112}
113
114void
115ActuallyExplicitEuler::postResidual(NumericVector<Number> & residual)
116{
117 residual += *_Re_time;
118 residual += *_Re_non_time;
119 residual.close();
120
121 // Reset time to the time at which to evaluate nodal BCs, which comes next
123}
DualNumber< Real, DNDerivativeType, true > ADReal
registerMooseObject("MooseApp", ActuallyExplicitEuler)
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
Implements a truly explicit (no nonlinear solve) first-order, forward Euler time integration scheme.
void computeADTimeDerivatives(ADReal &ad_u_dot, const dof_id_type &dof, ADReal &ad_u_dotdot) const override
method for computing local automatic differentiation time derivatives
virtual void postResidual(NumericVector< Number > &residual) override
Callback to the NonLinearTimeIntegratorInterface called immediately after the residuals are computed ...
void computeTimeDerivativeHelper(T &u_dot, const T2 &u_old) const
Helper function that actually does the math for computing the time derivative.
ActuallyExplicitEuler(const InputParameters &parameters)
virtual void computeTimeDerivatives() override
Computes the time derivative and the Jacobian of the time derivative.
virtual void solve() override
Solves the time step and sets the number of nonlinear and linear iterations.
static InputParameters validParams()
Base class for explicit time integrators that are implemented without using a nonlinear solver.
virtual bool performExplicitSolve(SparseMatrix< Number > &mass_matrix)
Solves a linear system using the chosen solve type.
Real _current_time
Save off current time to reset it back and forth.
static InputParameters validParams()
TagID _Ke_time_tag
For computing the mass matrix.
NumericVector< Real > * _solution_update
Solution vector for the linear solve.
NumericVector< Real > * _explicit_residual
Residual used for the RHS.
void computeResidual(libMesh::NonlinearImplicitSystem &sys, const NumericVector< libMesh::Number > &soln, NumericVector< libMesh::Number > &residual)
This function is called by Libmesh to form a residual.
virtual Real & timeOld() const
virtual Real & time() const
virtual void computeJacobianTag(const NumericVector< libMesh::Number > &soln, libMesh::SparseMatrix< libMesh::Number > &jacobian, TagID tag)
Form a Jacobian matrix for a given tag.
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 addClassDescription(const std::string &doc_string)
This method adds a description of the class that will be displayed in the input file syntax dump.
void overwriteNodeFace(NumericVector< Number > &soln)
Called from explicit time stepping to overwrite boundary positions (explicit dynamics).
NonlinearSystemBase * _nl
Pointer to the nonlinear system, can happen that we dont have any.
NumericVector< Number > * _Re_non_time
residual vector for non-time contributions
NumericVector< Number > * _Re_time
residual vector for time contributions
libMesh::NonlinearImplicitSystem * _nonlinear_implicit_system
libMesh nonlinear implicit system, if applicable; otherwise, nullptr
void setSolution(const NumericVector< Number > &soln)
Set the solution to a given vector.
virtual NumericVector< Number > * solutionUDot()
Definition SystemBase.h:289
unsigned int number() const
Gets the number of this system.
NumericVector< Number > & solutionOld()
Definition SystemBase.h:213
void computeDuDotDu()
Compute _du_dot_du.
const NumericVector< Number > *const & _solution
unsigned int _n_linear_iterations
Total number of linear iterations over all stages of the time step.
unsigned int _n_nonlinear_iterations
Total number of nonlinear iterations over all stages of the time step.
FEProblemBase & _fe_problem
Reference to the problem.
SystemBase & _sys
Reference to the system this time integrator operates on.
int & _t_step
The current time step number.
const NumericVector< Number > & _solution_old
void enforce_constraints_exactly(const System &system, NumericVector< Number > *v=nullptr, bool homogeneous=false) const
const SparseMatrix< Number > & get_system_matrix() const
std::unique_ptr< NonlinearSolver< Number > > nonlinear_solver
virtual void close()=0
std::unique_ptr< NumericVector< Number > > current_local_solution
std::unique_ptr< NumericVector< Number > > solution
const DofMap & get_dof_map() const