16 #include "libmesh/quadrature.h" 25 params.
addParam<std::vector<VariableName>>(
26 "displacements", {},
"The nonlinear displacement variables");
30 "The maximum permissible relative increment in the Jacobian per Newton iteration");
31 params.
set<
bool>(
"use_displaced_mesh") =
true;
38 _assembly(_subproblem.assembly(_tid, _sys.number())),
39 _qrule(_assembly.qRule()),
40 _JxW(_assembly.JxW()),
41 _fe_problem(*parameters.getCheckedPointerParam<
FEProblemBase *>(
"_fe_problem_base")),
42 _displaced_problem(_fe_problem.getDisplacedProblem()),
43 _max_jacobian_diff(parameters.
get<
Real>(
"max_increment"))
46 mooseError(
"ElementJacobianDamper: Must use displaced problem");
50 const std::vector<VariableName> & nl_vnames(
getParam<std::vector<VariableName>>(
"displacements"));
53 for (
unsigned int i = 0; i <
_ndisp; ++i)
70 Real max_difference = 0.0;
74 std::vector<Point> point_copies;
77 for (
auto & current_elem :
_mesh->
getMesh().active_local_element_ptr_range())
80 point_copies.reserve(current_elem->n_nodes());
83 for (
unsigned int i = 0; i < current_elem->n_nodes(); ++i)
85 Node & displaced_node = current_elem->node_ref(i);
87 point_copies.push_back(displaced_node);
93 displaced_node(
j) += update(disp_dof_num);
102 for (
unsigned int i = 0; i < current_elem->n_nodes(); ++i)
104 Node & displaced_node = current_elem->node_ref(i);
106 for (
unsigned int j = 0;
j <
_ndisp; ++
j)
107 displaced_node(
j) = point_copies[i](
j);
113 for (
unsigned int qp = 0; qp <
_qrule->n_points(); ++qp)
115 Real diff = std::abs(JxW_displaced[qp] -
_JxW[qp]) /
_JxW[qp];
116 if (diff > max_difference)
117 max_difference = diff;
static InputParameters validParams()
const QBase *const & _qrule
Quadrature rule.
This class implements a damper that limits the change in the Jacobian of elements.
unsigned int _ndisp
The number of displacement variables.
static InputParameters validParams()
MooseSharedPointer< DisplacedProblem > _displaced_problem
The displaced problem.
registerMooseObject("SolidMechanicsApp", ElementJacobianDamper)
const Parallel::Communicator & _communicator
std::vector< VariableValue > _disp_incr
The current Newton increment in the displacement variables.
MooseMesh * _mesh
The displaced mesh.
void reinit(const Elem *elem)
const Real _max_jacobian_diff
Maximum allowed relative increment in Jacobian.
const MooseArray< Real > & _JxW
Transformed Jacobian weights.
ElementJacobianDamper(const InputParameters ¶meters)
virtual Real computeDamping(const NumericVector< Number > &, const NumericVector< Number > &update) override
Computes this Damper's damping.
const T & getParam(const std::string &name) const
std::vector< MooseVariable * > _disp_var
The displacement variables.
unsigned int number() const
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void max(const T &r, T &o, Request &req) const
MooseVariableFE< T > & getFieldVariable(THREAD_ID tid, const std::string &var_name)
virtual void initialSetup() override
void mooseError(Args &&... args) const
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
const Elem & get(const ElemType type_in)