https://mooseframework.inl.gov
Loading...
Searching...
No Matches
TrussMaterial.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
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
52void
59
60void
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}
virtual MooseVariable & getStandardVariable(const THREAD_ID tid, const std::string &var_name) override
NonlinearSystemBase & getNonlinearSystemBase(const unsigned int sys_num)
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 addCoupledVar(const std::string &name, const std::string &doc_string)
THREAD_ID _tid
unsigned int _qp
FEProblemBase & _fe_problem
static InputParameters validParams()
const Elem *const & _current_elem
const QBase *const & _qrule
const T & getParam(const std::string &name) const
virtual const NumericVector< Number > *const & currentSolution() const override final
unsigned int number() const
virtual void computeQpStrain()=0
TrussMaterial(const InputParameters &parameters)
MaterialProperty< Real > & _axial_stress
const VariableValue & _youngs_modulus
virtual void computeQpStress()=0
virtual void initQpStatefulProperties()
MaterialProperty< Real > & _e_over_l
std::vector< MooseVariable * > _disp_var
MaterialProperty< Real > & _total_stretch
unsigned int _ndisp
Number of displacement variables.
MaterialProperty< Real > & _elastic_stretch
static InputParameters validParams()
virtual void computeProperties()