www.mooseframework.org
TrussMaterial.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 
10 #include "TrussMaterial.h"
11 
12 // MOOSE includes
13 #include "Material.h"
14 #include "MooseMesh.h"
15 #include "MooseVariable.h"
16 #include "NonlinearSystem.h"
17 
18 #include "libmesh/quadrature.h"
19 
22 {
24  params.addParam<std::string>("base_name",
25  "Optional parameter that allows the user to define "
26  "multiple mechanics material systems on the same "
27  "block, i.e. for multiple phases");
28  params.addRequiredParam<std::vector<VariableName>>(
29  "displacements",
30  "The displacements appropriate for the simulation geometry and coordinate system");
31  params.addCoupledVar("youngs_modulus", "Variable containing Young's modulus");
32  return params;
33 }
34 
36  : Material(parameters),
37  _base_name(isParamValid("base_name") ? getParam<std::string>("base_name") + "_" : ""),
38  _youngs_modulus(coupledValue("youngs_modulus")),
39  _total_stretch(declareProperty<Real>(_base_name + "total_stretch")),
40  _elastic_stretch(declareProperty<Real>(_base_name + "elastic_stretch")),
41  _axial_stress(declareProperty<Real>(_base_name + "axial_stress")),
42  _e_over_l(declareProperty<Real>(_base_name + "e_over_l"))
43 {
44  const std::vector<VariableName> & nl_vnames(getParam<std::vector<VariableName>>("displacements"));
45  _ndisp = nl_vnames.size();
46 
47  // fetch nonlinear variables
48  for (unsigned int i = 0; i < _ndisp; ++i)
49  _disp_var.push_back(&_fe_problem.getStandardVariable(_tid, nl_vnames[i]));
50 }
51 
52 void
54 {
55  _axial_stress[_qp] = 0.0;
56  _total_stretch[_qp] = 0.0;
57  _elastic_stretch[_qp] = 0.0;
58 }
59 
60 void
62 {
63  // check for consistency of the number of element nodes
64  mooseAssert(_current_elem->n_nodes() == 2, "Truss element needs to have exactly two nodes.");
65 
66  // fetch the two end nodes for _current_elem
67  std::vector<const Node *> node;
68  for (unsigned int i = 0; i < 2; ++i)
69  node.push_back(_current_elem->node_ptr(i));
70 
71  // calculate original length of a truss element
72  RealGradient dxyz;
73  for (unsigned int i = 0; i < _ndisp; ++i)
74  dxyz(i) = (*node[1])(i) - (*node[0])(i);
75  _origin_length = dxyz.norm();
76 
77  // fetch the solution for the two end nodes
78  NonlinearSystemBase & nonlinear_sys = _fe_problem.getNonlinearSystemBase(/*nl_sys_num=*/0);
79  const NumericVector<Number> & sol = *nonlinear_sys.currentSolution();
80 
81  std::vector<Real> disp0, disp1;
82  for (unsigned int i = 0; i < _ndisp; ++i)
83  {
84  disp0.push_back(sol(node[0]->dof_number(nonlinear_sys.number(), _disp_var[i]->number(), 0)));
85  disp1.push_back(sol(node[1]->dof_number(nonlinear_sys.number(), _disp_var[i]->number(), 0)));
86  }
87 
88  // calculate current length of a truss element
89  for (unsigned int i = 0; i < _ndisp; ++i)
90  dxyz(i) += disp1[i] - disp0[i];
91  _current_length = dxyz.norm();
92 
93  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
94  {
96 
99  }
100 }
Real _current_length
Definition: TrussMaterial.h:45
FEProblemBase & _fe_problem
const QBase *const & _qrule
auto norm() const -> decltype(std::norm(Real()))
TrussMaterial(const InputParameters &parameters)
Definition: TrussMaterial.C:35
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
std::vector< MooseVariable * > _disp_var
Definition: TrussMaterial.h:30
MaterialProperty< Real > & _total_stretch
Definition: TrussMaterial.h:39
const VariableValue & _youngs_modulus
Definition: TrussMaterial.h:37
void addRequiredParam(const std::string &name, const std::string &doc_string)
unsigned int _qp
unsigned int _ndisp
Number of displacement variables.
Definition: TrussMaterial.h:36
MaterialProperty< Real > & _elastic_stretch
Definition: TrussMaterial.h:40
static InputParameters validParams()
virtual void computeQpStrain()=0
THREAD_ID _tid
const T & getParam(const std::string &name) const
NonlinearSystemBase & getNonlinearSystemBase(const unsigned int sys_num)
unsigned int number() const
MaterialProperty< Real > & _e_over_l
Definition: TrussMaterial.h:42
virtual void computeProperties()
Definition: TrussMaterial.C:61
virtual MooseVariable & getStandardVariable(const THREAD_ID tid, const std::string &var_name) override
void addCoupledVar(const std::string &name, const std::string &doc_string)
const NumericVector< Number > *const & currentSolution() const override
static InputParameters validParams()
Definition: TrussMaterial.C:21
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
MaterialProperty< Real > & _axial_stress
Definition: TrussMaterial.h:41
virtual void initQpStatefulProperties()
Definition: TrussMaterial.C:53
virtual void computeQpStress()=0
const Elem *const & _current_elem