libMesh
diff_physics.C
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2024 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3 
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License, or (at your option) any later version.
8 
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
13 
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 
18 
19 #include "libmesh/diff_context.h"
20 #include "libmesh/diff_physics.h"
21 #include "libmesh/system.h"
22 
23 namespace libMesh
24 {
25 
27 
29 {
30  _time_evolving.resize(0);
31 }
32 
33 
34 
36 {
37  // give us flags for every variable that might be time evolving
38  _time_evolving.resize(sys.n_vars(), false);
39 }
40 
41 void DifferentiablePhysics::time_evolving (unsigned int var,
42  unsigned int order)
43 {
44  libmesh_error_msg_if(order != 1 && order != 2, "Input order must be 1 or 2!");
45 
46  if (_time_evolving.size() <= var)
47  _time_evolving.resize(var+1, 0);
48 
49  _time_evolving[var] = order;
50 
51  if (order == 1)
52  _first_order_vars.insert(var);
53  else
54  _second_order_vars.insert(var);
55 }
56 
58  DiffContext & c)
59 {
60  FEMContext & context = cast_ref<FEMContext &>(c);
61 
62  for (auto var : make_range(context.n_vars()))
63  {
64  if (!this->is_time_evolving(var))
65  continue;
66 
67  if (c.get_system().variable(var).type().family != SCALAR)
68  continue;
69 
70  const std::vector<dof_id_type> & dof_indices =
71  context.get_dof_indices(var);
72 
73  const unsigned int n_dofs = cast_int<unsigned int>
74  (dof_indices.size());
75 
76  DenseSubVector<Number> & Fs = context.get_elem_residual(var);
77  DenseSubMatrix<Number> & Kss = context.get_elem_jacobian( var, var );
78 
80  context.get_elem_solution(var);
81 
82  for (unsigned int i=0; i != n_dofs; ++i)
83  {
84  Fs(i) -= Us(i);
85 
86  if (request_jacobian)
87  Kss(i,i) -= context.elem_solution_rate_derivative;
88  }
89  }
90 
91  return request_jacobian;
92 }
93 
94 
95 
96 bool DifferentiablePhysics::_eulerian_time_deriv (bool request_jacobian,
97  DiffContext & context)
98 {
99  // For any problem we need time derivative terms
100  request_jacobian =
101  this->element_time_derivative(request_jacobian, context);
102 
103  // For a moving mesh problem we may need the pseudoconvection term too
104  return this->eulerian_residual(request_jacobian, context) &&
105  request_jacobian;
106 }
107 
108 } // namespace libMesh
FEFamily family
The type of finite element.
Definition: fe_type.h:207
const DenseMatrix< Number > & get_elem_jacobian() const
Const accessor for element Jacobian.
Definition: diff_context.h:274
virtual void clear_physics()
Clear any data structures associated with the physics.
Definition: diff_physics.C:28
const Variable & variable(unsigned int var) const
Return a constant reference to Variable var.
Definition: system.h:2377
This class provides all data required for a physics package (e.g.
Definition: diff_context.h:55
virtual ~DifferentiablePhysics()
Destructor.
virtual bool element_time_derivative(bool request_jacobian, DiffContext &)
Adds the time derivative contribution on elem to elem_residual.
Definition: diff_physics.h:125
virtual bool eulerian_residual(bool request_jacobian, DiffContext &)
Adds a pseudo-convection contribution on elem to elem_residual, if the nodes of elem are being transl...
Definition: diff_physics.h:277
std::set< unsigned int > _second_order_vars
Variable indices for those variables that are second order in time.
Definition: diff_physics.h:553
The libMesh namespace provides an interface to certain functionality in the library.
virtual void time_evolving(unsigned int var, unsigned int order)
Tells the DiffSystem that variable var is evolving with respect to time.
Definition: diff_physics.C:41
bool _eulerian_time_deriv(bool request_jacobian, DiffContext &)
This method simply combines element_time_derivative() and eulerian_residual(), which makes its addres...
Definition: diff_physics.C:96
Defines a dense subvector for use in finite element computations.
virtual void init_physics(const System &sys)
Initialize any data structures associated with the physics.
Definition: diff_physics.C:35
Real elem_solution_rate_derivative
The derivative of elem_solution_rate with respect to the current nonlinear solution, for use by systems with non default mass_residual terms.
Definition: diff_context.h:503
const DenseVector< Number > & get_elem_solution() const
Accessor for element solution.
Definition: diff_context.h:112
const System & get_system() const
Accessor for associated system.
Definition: diff_context.h:106
Manages consistently variables, degrees of freedom, and coefficient vectors.
Definition: system.h:96
Defines a dense submatrix for use in Finite Element-type computations.
This class provides all data required for a physics package (e.g.
Definition: fem_context.h:62
const std::vector< dof_id_type > & get_dof_indices() const
Accessor for element dof indices.
Definition: diff_context.h:363
const DenseVector< Number > & get_elem_residual() const
Const accessor for element residual.
Definition: diff_context.h:242
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition: int_range.h:134
bool is_time_evolving(unsigned int var) const
Definition: diff_physics.h:260
unsigned int n_vars() const
Definition: system.h:2349
unsigned int n_vars() const
Number of variables in solution.
Definition: diff_context.h:100
std::set< unsigned int > _first_order_vars
Variable indices for those variables that are first order in time.
Definition: diff_physics.h:548
std::vector< unsigned int > _time_evolving
Stores unsigned int to tell us which variables are evolving as first order in time (1)...
Definition: diff_physics.h:543
virtual bool nonlocal_mass_residual(bool request_jacobian, DiffContext &c)
Subtracts any nonlocal mass vector contributions (e.g.
Definition: diff_physics.C:57
const FEType & type() const
Definition: variable.h:140