11 #include "SubProblem.h"
12 #include "libmesh/utility.h"
13 #include "MooseVariable.h"
15 #include "NonlinearSystem.h"
16 #include "AuxiliarySystem.h"
17 #include "MooseMesh.h"
27 params.addClassDescription(
"Calculates the residual for the inertial force/moment and the "
28 "contribution of mass dependent Rayleigh damping and HHT time "
29 "integration scheme.");
30 params.set<
bool>(
"use_displaced_mesh") =
true;
31 params.addRequiredCoupledVar(
33 "The rotational variables appropriate for the simulation geometry and coordinate system");
34 params.addRequiredCoupledVar(
36 "The displacement variables appropriate for the simulation geometry and coordinate system");
37 params.addCoupledVar(
"velocities",
"Translational velocity variables");
38 params.addCoupledVar(
"accelerations",
"Translational acceleration variables");
39 params.addCoupledVar(
"rotational_velocities",
"Rotational velocity variables");
40 params.addCoupledVar(
"rotational_accelerations",
"Rotational acceleration variables");
41 params.addRangeCheckedParam<Real>(
42 "beta",
"beta>0.0",
"beta parameter for Newmark Time integration");
43 params.addRangeCheckedParam<Real>(
44 "gamma",
"gamma>0.0",
"gamma parameter for Newmark Time integration");
45 params.addParam<MaterialPropertyName>(
"eta",
47 "Name of material property or a constant real "
48 "number defining the eta parameter for the "
50 params.addRangeCheckedParam<Real>(
"alpha",
52 "alpha >= -0.3333 & alpha <= 0.0",
53 "Alpha parameter for mass dependent numerical damping induced "
54 "by HHT time integration scheme");
55 params.addParam<MaterialPropertyName>(
58 "Name of Material Property or a constant real number defining the density of the beam.");
59 params.addRequiredCoupledVar(
"area",
"Variable containing cross-section area");
60 params.addCoupledVar(
"Ay", 0.0,
"Variable containing first moment of area about y axis");
61 params.addCoupledVar(
"Az", 0.0,
"Variable containing first moment of area about z axis");
62 params.addCoupledVar(
"Ix",
63 "Variable containing second moment of area about x axis. Defaults to Iy+Iz");
64 params.addRequiredCoupledVar(
"Iy",
"Variable containing second moment of area about y axis");
65 params.addRequiredCoupledVar(
"Iz",
"Variable containing second moment of area about z axis");
66 params.addRequiredRangeCheckedParam<
unsigned int>(
69 "An integer corresponding to the direction "
70 "the variable this kernel acts in. (0 for disp_x, "
71 "1 for disp_y, 2 for disp_z, 3 for rot_x, 4 for rot_y and 5 for rot_z)");
76 : TimeKernel(parameters),
77 _has_beta(isParamValid(
"beta")),
78 _has_gamma(isParamValid(
"gamma")),
79 _has_velocities(isParamValid(
"velocities")),
80 _has_rot_velocities(isParamValid(
"rotational_velocities")),
81 _has_accelerations(isParamValid(
"accelerations")),
82 _has_rot_accelerations(isParamValid(
"rotational_accelerations")),
83 _has_Ix(isParamValid(
"Ix")),
84 _density(getMaterialProperty<Real>(
"density")),
85 _nrot(coupledComponents(
"rotations")),
86 _ndisp(coupledComponents(
"displacements")),
92 _rot_accel_num(_nrot),
93 _area(coupledValue(
"area")),
94 _Ay(coupledValue(
"Ay")),
95 _Az(coupledValue(
"Az")),
96 _Ix(_has_Ix ? coupledValue(
"Ix") : _zero),
97 _Iy(coupledValue(
"Iy")),
98 _Iz(coupledValue(
"Iz")),
99 _beta(_has_beta ? getParam<Real>(
"beta") : 0.1),
100 _gamma(_has_gamma ? getParam<Real>(
"gamma") : 0.1),
101 _eta(getMaterialProperty<Real>(
"eta")),
102 _alpha(getParam<Real>(
"alpha")),
103 _original_local_config(getMaterialPropertyByName<
RankTwoTensor>(
"initial_rotation")),
104 _original_length(getMaterialPropertyByName<Real>(
"original_length")),
105 _component(getParam<unsigned int>(
"component")),
111 mooseError(
"InertialForceBeam: The number of variables supplied in 'displacements' and "
112 "'rotations' must match.");
117 if ((coupledComponents(
"velocities") !=
_ndisp) ||
118 (coupledComponents(
"accelerations") !=
_ndisp) ||
119 (coupledComponents(
"rotational_velocities") !=
_ndisp) ||
120 (coupledComponents(
"rotational_accelerations") !=
_ndisp))
122 "InertialForceBeam: The number of variables supplied in 'velocities', "
123 "'accelerations', 'rotational_velocities' and 'rotational_accelerations' must match "
124 "the number of displacement variables.");
127 for (
unsigned int i = 0; i <
_ndisp; ++i)
129 MooseVariable * vel_variable = getVar(
"velocities", i);
130 _vel_num[i] = vel_variable->number();
132 MooseVariable * accel_variable = getVar(
"accelerations", i);
135 MooseVariable * rot_vel_variable = getVar(
"rotational_velocities", i);
138 MooseVariable * rot_accel_variable = getVar(
"rotational_accelerations", i);
145 _du_dot_du = &coupledDotDu(
"displacements", 0);
149 mooseError(
"InertialForceBeam: Either all or none of `beta`, `gamma`, `velocities`, "
150 "`accelerations`, `rotational_velocities` and `rotational_accelerations` should be "
151 "provided as input.");
154 for (
unsigned int i = 0; i <
_ndisp; ++i)
156 MooseVariable * disp_variable = getVar(
"displacements", i);
159 MooseVariable * rot_variable = getVar(
"rotations", i);
160 _rot_num[i] = rot_variable->number();
167 prepareVectorTag(_assembly, _var.number());
172 std::vector<const Node *> node;
173 for (
unsigned int i = 0; i < 2; ++i)
174 node.push_back(_current_elem->node_ptr(i));
177 NonlinearSystemBase & nonlinear_sys = _fe_problem.getNonlinearSystemBase();
181 const NumericVector<Number> & sol = *nonlinear_sys.currentSolution();
182 const NumericVector<Number> & sol_old = nonlinear_sys.solutionOld();
184 AuxiliarySystem & aux = _fe_problem.getAuxiliarySystem();
185 const NumericVector<Number> & aux_sol_old = aux.solutionOld();
187 mooseAssert(
_beta > 0.0,
"InertialForceBeam: Beta parameter should be positive.");
188 mooseAssert(
_eta[0] >= 0.0,
"InertialForceBeam: Eta parameter should be non-negative.");
190 for (
unsigned int i = 0; i <
_ndisp; ++i)
193 unsigned int dof_index_0 = node[0]->dof_number(nonlinear_sys.number(),
_disp_num[i], 0);
194 unsigned int dof_index_1 = node[1]->dof_number(nonlinear_sys.number(),
_disp_num[i], 0);
195 const Real disp_0 = sol(dof_index_0) - sol_old(dof_index_0);
196 const Real disp_1 = sol(dof_index_1) - sol_old(dof_index_1);
198 dof_index_0 = node[0]->dof_number(nonlinear_sys.number(),
_rot_num[i], 0);
199 dof_index_1 = node[1]->dof_number(nonlinear_sys.number(),
_rot_num[i], 0);
200 const Real rot_0 = sol(dof_index_0) - sol_old(dof_index_0);
201 const Real rot_1 = sol(dof_index_1) - sol_old(dof_index_1);
207 const Real accel_old_0 = aux_sol_old(node[0]->dof_number(aux.number(),
_accel_num[i], 0));
208 const Real accel_old_1 = aux_sol_old(node[1]->dof_number(aux.number(),
_accel_num[i], 0));
212 const Real rot_accel_old_0 =
213 aux_sol_old(node[0]->dof_number(aux.number(),
_rot_accel_num[i], 0));
214 const Real rot_accel_old_1 =
215 aux_sol_old(node[1]->dof_number(aux.number(),
_rot_accel_num[i], 0));
238 if (!nonlinear_sys.solutionUDot())
239 mooseError(
"InertialForceBeam: Time derivative of solution (`u_dot`) is not stored. Please "
240 "set uDotRequested() to true in FEProblemBase before requesting `u_dot`.");
242 if (!nonlinear_sys.solutionUDotOld())
243 mooseError(
"InertialForceBeam: Old time derivative of solution (`u_dot_old`) is not "
244 "stored. Please set uDotOldRequested() to true in FEProblemBase before "
245 "requesting `u_dot_old`.");
247 if (!nonlinear_sys.solutionUDotDot())
248 mooseError(
"InertialForceBeam: Second time derivative of solution (`u_dotdot`) is not "
249 "stored. Please set uDotDotRequested() to true in FEProblemBase before "
250 "requesting `u_dotdot`.");
252 const NumericVector<Number> & vel = *nonlinear_sys.solutionUDot();
253 const NumericVector<Number> & vel_old = *nonlinear_sys.solutionUDotOld();
254 const NumericVector<Number> & accel = *nonlinear_sys.solutionUDotDot();
256 for (
unsigned int i = 0; i <
_ndisp; ++i)
259 unsigned int dof_index_0 = node[0]->dof_number(nonlinear_sys.number(),
_disp_num[i], 0);
260 unsigned int dof_index_1 = node[1]->dof_number(nonlinear_sys.number(),
_disp_num[i], 0);
261 _vel_0(i) = vel(dof_index_0);
262 _vel_1(i) = vel(dof_index_1);
269 dof_index_0 = node[0]->dof_number(nonlinear_sys.number(),
_rot_num[i], 0);
270 dof_index_1 = node[1]->dof_number(nonlinear_sys.number(),
_rot_num[i], 0);
297 for (
unsigned int i = 0; i <
_ndisp; ++i)
414 accumulateTaggedLocalResidual();
418 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
419 for (
unsigned int i = 0; i < _save_in.size(); ++i)
420 _save_in[i]->sys().solution().add_vector(_local_re, _save_in[i]->dofIndices());
427 prepareMatrixTag(_assembly, _var.number(), _var.number());
429 mooseAssert(
_beta > 0.0,
"InertialForceBeam: Beta parameter should be positive.");
437 for (
unsigned int i = 0; i < _test.size(); ++i)
439 for (
unsigned int j = 0; j < _phi.size(); ++j)
442 _local_ke(i, j) = (i == j ? 1.0 / 3.0 : 1.0 / 6.0) *
_density[0] *
_area[0] *
450 I(0, 0) =
_Iy[0] +
_Iz[0];
457 _local_ke(i, j) = (i == j ? 1.0 / 3.0 : 1.0 / 6.0) *
_density[0] *
463 accumulateTaggedLocalMatrix();
465 if (_has_diag_save_in)
467 unsigned int rows = _local_ke.m();
468 DenseVector<Number> diag(rows);
469 for (
unsigned int i = 0; i < rows; ++i)
470 diag(i) = _local_ke(i, i);
472 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
473 for (
unsigned int i = 0; i < _diag_save_in.size(); ++i)
474 _diag_save_in[i]->sys().solution().add_vector(diag, _diag_save_in[i]->dofIndices());
481 mooseAssert(
_beta > 0.0,
"InertialForceBeam: Beta parameter should be positive.");
489 size_t jvar_num = jvar.number();
490 if (jvar_num == _var.number())
494 unsigned int coupled_component = 0;
495 bool disp_coupled =
false;
496 bool rot_coupled =
false;
498 for (
unsigned int i = 0; i <
_ndisp; ++i)
502 coupled_component = i;
508 for (
unsigned int i = 0; i <
_nrot; ++i)
512 coupled_component = i + 3;
518 prepareMatrixTag(_assembly, _var.number(), jvar_num);
520 if (disp_coupled || rot_coupled)
522 for (
unsigned int i = 0; i < _test.size(); ++i)
524 for (
unsigned int j = 0; j < _phi.size(); ++j)
526 if (_component < 3 && coupled_component > 2)
538 _local_ke(i, j) += (i == j ? 1.0 / 3.0 : 1.0 / 6.0) *
_density[0] *
541 else if (
_component > 2 && coupled_component < 3)
553 _local_ke(i, j) += (i == j ? 1.0 / 3.0 : 1.0 / 6.0) *
_density[0] *
556 else if (
_component > 2 && coupled_component > 2)
562 I(0, 0) =
_Iy[0] +
_Iz[0];
570 _local_ke(i, j) += (i == j ? 1.0 / 3.0 : 1.0 / 6.0) *
_density[0] *
578 accumulateTaggedLocalMatrix();