11 #include "FEProblem.h"
12 #include "MooseMesh.h"
13 #include "DisplacedProblem.h"
16 #include "libmesh/quadrature.h"
26 params.addClassDescription(
"Damper that limits the change in element Jacobians");
27 params.addParam<std::vector<VariableName>>(
"displacements",
28 "The nonlinear displacement variables");
29 params.addParam<Real>(
32 "The maximum permissible relative increment in the Jacobian per Newton iteration");
33 params.set<
bool>(
"use_displaced_mesh") =
true;
38 : GeneralDamper(parameters),
39 _tid(parameters.get<THREAD_ID>(
"_tid")),
40 _assembly(_subproblem.assembly(_tid)),
41 _qrule(_assembly.qRule()),
42 _JxW(_assembly.JxW()),
43 _fe_problem(*parameters.getCheckedPointerParam<FEProblemBase *>(
"_fe_problem_base")),
44 _displaced_problem(_fe_problem.getDisplacedProblem()),
45 _max_jacobian_diff(parameters.get<Real>(
"max_increment"))
48 mooseError(
"ElementJacobianDamper: Must use displaced problem");
52 const std::vector<VariableName> & nl_vnames(getParam<std::vector<VariableName>>(
"displacements"));
55 for (
unsigned int i = 0; i <
_ndisp; ++i)
57 _disp_var.push_back(&_sys.getFieldVariable<Real>(
_tid, nl_vnames[i]));
69 const NumericVector<Number> & update)
72 Real max_difference = 0.0;
73 MooseArray<Real> JxW_displaced;
76 std::vector<Point> point_copies;
79 for (
auto & current_elem :
_mesh->getMesh().active_local_element_ptr_range())
82 point_copies.reserve(current_elem->n_nodes());
85 for (
unsigned int i = 0; i < current_elem->n_nodes(); ++i)
87 Node & displaced_node = current_elem->node_ref(i);
89 point_copies.push_back(displaced_node);
91 for (
unsigned int j = 0; j <
_ndisp; ++j)
93 dof_id_type disp_dof_num =
94 displaced_node.dof_number(_sys.number(),
_disp_var[j]->number(), 0);
95 displaced_node(j) += update(disp_dof_num);
101 JxW_displaced =
_JxW;
104 for (
unsigned int i = 0; i < current_elem->n_nodes(); ++i)
106 Node & displaced_node = current_elem->node_ref(i);
108 for (
unsigned int j = 0; j <
_ndisp; ++j)
109 displaced_node(j) = point_copies[i](j);
115 for (
unsigned int qp = 0; qp <
_qrule->n_points(); ++qp)
117 Real diff = std::abs(JxW_displaced[qp] -
_JxW[qp]) /
_JxW[qp];
118 if (diff > max_difference)
119 max_difference = diff;
122 JxW_displaced.release();
125 _communicator.max(max_difference);