https://mooseframework.inl.gov
Loading...
Searching...
No Matches
StressDivergenceTensorsTruss.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
11
12// MOOSE includes
13#include "Assembly.h"
14#include "Material.h"
15#include "MooseVariable.h"
16#include "SystemBase.h"
17
19
22{
24 params.addClassDescription("Kernel for truss element");
25 params.addRequiredParam<unsigned int>("component",
26 "An integer corresponding to the direction "
27 "the variable this kernel acts in. (0 for x, "
28 "1 for y, 2 for z)");
29 params.addCoupledVar("displacements",
30 "The string of displacements suitable for the problem statement");
31 params.addCoupledVar("temperature", "The temperature");
32 params.addCoupledVar("area", "Cross-sectional area of truss element");
33 params.addParam<std::string>("base_name", "Material property base name");
34 params.set<bool>("use_displaced_mesh") = true;
35 return params;
36}
37
39 : Kernel(parameters),
40 _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
41 _axial_stress(getMaterialPropertyByName<Real>(_base_name + "axial_stress")),
42 _e_over_l(getMaterialPropertyByName<Real>(_base_name + "e_over_l")),
43 _component(getParam<unsigned int>("component")),
44 _ndisp(coupledComponents("displacements")),
45 _temp_coupled(isCoupled("temperature")),
46 _temp_var(_temp_coupled ? coupled("temperature") : 0),
47 _area(coupledValue("area")),
48 _orientation(NULL)
49{
50 for (unsigned int i = 0; i < _ndisp; ++i)
51 _disp_var.push_back(coupled("displacements", i));
52}
53
54void
56{
58 .getFE(FEType().set_p_refinement(false), 1)
59 ->get_dxyzdxi();
60}
61
62void
64{
66
67 mooseAssert(_local_re.size() == 2, "Truss element has and only has two nodes.");
68
69 RealGradient orientation((*_orientation)[0]);
70 orientation /= orientation.norm();
71
72 VectorValue<Real> force_local = _axial_stress[0] * _area[0] * orientation;
73
74 _local_re(0) = -force_local(_component);
75 _local_re(1) = -_local_re(0);
76
78
79 if (_has_save_in)
80 {
81 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
82 for (unsigned int i = 0; i < _save_in.size(); ++i)
83 _save_in[i]->sys().solution().add_vector(_local_re, _save_in[i]->dofIndices());
84 }
85}
86
87Real
89{
90 RealGradient orientation((*_orientation)[0]);
91 orientation /= orientation.norm();
92
93 return orientation(i) * orientation(j) * _e_over_l[0] * _area[0];
94}
95
96void
98{
100
101 for (unsigned int i = 0; i < _test.size(); ++i)
102 for (unsigned int j = 0; j < _phi.size(); ++j)
103 _local_ke(i, j) += (i == j ? 1 : -1) * computeStiffness(_component, _component);
104
106
108 {
109 unsigned int rows = _local_ke.m();
110 DenseVector<Number> diag(rows);
111 for (unsigned int i = 0; i < rows; ++i)
112 diag(i) = _local_ke(i, i);
113
114 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
115 for (unsigned int i = 0; i < _diag_save_in.size(); ++i)
116 _diag_save_in[i]->sys().solution().add_vector(diag, _diag_save_in[i]->dofIndices());
117 }
118}
119
120void
122{
123 if (jvar_num == _var.number())
125 else
126 {
127 const auto & jvar = getVariable(jvar_num);
128
129 // This (undisplaced) jvar could potentially yield the wrong phi size if this object is acting
130 // on the displaced mesh
131 auto phi_size = jvar.dofIndices().size();
132
133 unsigned int coupled_component = 0;
134 bool disp_coupled = false;
135
136 for (unsigned int i = 0; i < _ndisp; ++i)
137 if (jvar_num == _disp_var[i])
138 {
139 coupled_component = i;
140 disp_coupled = true;
141 break;
142 }
143
144 if (disp_coupled)
145 {
147
148 for (unsigned int i = 0; i < _test.size(); ++i)
149 for (unsigned int j = 0; j < phi_size; ++j)
150 _local_ke(i, j) += (i == j ? 1 : -1) * computeStiffness(_component, coupled_component);
151
153 }
154 else if (false) // Need some code here for coupling with temperature
155 {
156 }
157 }
158}
registerMooseObject("SolidMechanicsApp", StressDivergenceTensorsTruss)
void ErrorVector unsigned int
const FEBase *const & getFE(FEType type, unsigned int dim) const
virtual unsigned int coupled(const std::string &var_name, unsigned int comp=0) const
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
T & set(const std::string &name, bool quiet_mode=false)
void addCoupledVar(const std::string &name, const std::string &doc_string)
std::vector< MooseVariableFEBase * > _save_in
bool _has_diag_save_in
bool _has_save_in
std::vector< MooseVariableFEBase * > _diag_save_in
MooseVariable & _var
const VariablePhiValue & _phi
const VariableTestValue & _test
static InputParameters validParams()
unsigned int number() const
THREAD_ID _tid
Assembly & _assembly
const MooseVariableFieldBase & getVariable(unsigned int jvar_num) const
SubProblem & _subproblem
SystemBase & _sys
std::vector< unsigned int > _disp_var
Variable numbers of coupled displacement variables.
const std::vector< RealGradient > * _orientation
StressDivergenceTensorsTruss(const InputParameters &parameters)
const unsigned int _ndisp
Number of displacement variables.
virtual Real computeStiffness(unsigned int i, unsigned int j)
virtual void computeOffDiagJacobian(unsigned int jvar) override
const MaterialProperty< Real > & _e_over_l
const MaterialProperty< Real > & _axial_stress
const unsigned int _component
An integer corresponding to the direction this kernel acts in.
virtual Assembly & assembly(const THREAD_ID tid, const unsigned int sys_num)=0
unsigned int number() const
DenseMatrix< Number > _local_ke
void accumulateTaggedLocalMatrix()
void prepareMatrixTag(Assembly &assembly, unsigned int ivar, unsigned int jvar)
void accumulateTaggedLocalResidual()
void prepareVectorTag(Assembly &assembly, unsigned int ivar)
DenseVector< Number > _local_re
unsigned int m() const
virtual unsigned int size() const override final