www.mooseframework.org
AbaqusUmatMaterial.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 "AbaqusUmatMaterial.h"
11 #include "Factory.h"
12 #include "MooseMesh.h"
13 
14 #include <dlfcn.h>
15 #define QUOTE(macro) stringifyName(macro)
16 
17 registerMooseObject("SolidMechanicsApp", AbaqusUmatMaterial);
18 
19 template <>
20 InputParameters
22 {
23  InputParameters params = validParams<SolidModel>();
24  params.addRequiredParam<FileName>(
25  "plugin", "The path to the compiled dynamic library for the plugin you want to use");
26  params.addRequiredParam<std::vector<Real>>("mechanical_constants",
27  "Mechanical Material Properties");
28  params.addParam<std::vector<Real>>("thermal_constants", "Thermal Material Properties");
29  params.addRequiredParam<unsigned int>("num_state_vars",
30  "The number of state variables this UMAT is going to use");
31  return params;
32 }
33 
34 AbaqusUmatMaterial::AbaqusUmatMaterial(const InputParameters & parameters)
35  : SolidModel(parameters),
36  _plugin(getParam<FileName>("plugin")),
37  _mechanical_constants(getParam<std::vector<Real>>("mechanical_constants")),
38  _thermal_constants(getParam<std::vector<Real>>("thermal_constants")),
39  _num_state_vars(getParam<unsigned int>("num_state_vars")),
40  _grad_disp_x(coupledGradient("disp_x")),
41  _grad_disp_y(coupledGradient("disp_y")),
42  _grad_disp_z(coupledGradient("disp_z")),
43  _grad_disp_x_old(coupledGradientOld("disp_x")),
44  _grad_disp_y_old(coupledGradientOld("disp_y")),
45  _grad_disp_z_old(coupledGradientOld("disp_z")),
46  _state_var(declareProperty<std::vector<Real>>("state_var")),
47  _state_var_old(getMaterialPropertyOld<std::vector<Real>>("state_var")),
48  _Fbar(declareProperty<ColumnMajorMatrix>("Fbar")),
49  _Fbar_old(getMaterialPropertyOld<ColumnMajorMatrix>("Fbar")),
50  _elastic_strain_energy(declareProperty<Real>("elastic_strain_energy")),
51  _plastic_dissipation(declareProperty<Real>("plastic_dissipation")),
52  _creep_dissipation(declareProperty<Real>("creep_dissipation"))
53 {
54 #if defined(METHOD)
55  _plugin += std::string("-") + QUOTE(METHOD) + ".plugin";
56 #endif
57 
58  // Size and create full (mechanical+thermal) material property array
60  std::vector<Real> props_array(_num_props);
61  for (unsigned int i = 0; i < _mechanical_constants.size(); ++i)
62  props_array[i] = _mechanical_constants[i];
63  for (unsigned int i = _mechanical_constants.size(); i < _num_props; ++i)
64  props_array[i] = _thermal_constants[i];
65 
66  // Read mesh dimension and size UMAT arrays
67  if (_mesh.dimension() == 3) // 3D case
68  {
69  _NTENS = 6; // Size of the stress or strain component array (NDI+NSHR)
70  _NSHR = 3; // Number of engineering shear stress components
71  _NDI = 3; // Number of direct stress components (always 3)
72  }
73  else if (_mesh.dimension() == 2) // 2D case
74  {
75  _NTENS = 4;
76  _NSHR = 1;
77  _NDI = 3;
78  }
79 
80  _STATEV = new Real[_num_state_vars];
81  _DDSDDT = new Real[_NTENS];
82  _DRPLDE = new Real[_NTENS];
83  _STRAN = new Real[_NTENS];
84  _DFGRD0 = new Real[9];
85  _DFGRD1 = new Real[9];
86  _STRESS = new Real[_NTENS];
87  _DDSDDE = new Real[_NTENS * _NTENS];
88  _DSTRAN = new Real[_NTENS];
89  _PROPS = new Real[_num_props];
90 
91  for (unsigned int i = 0; i < _num_state_vars; ++i)
92  {
93  _STATEV[i] = 0.0;
94  }
95 
96  for (int i = 0; i < _NTENS; ++i)
97  {
98  _DDSDDT[i] = 0.0;
99  _DRPLDE[i] = 0.0;
100  _STRAN[i] = 0.0;
101  _STRESS[i] = 0.0;
102  _DSTRAN[i] = 0.0;
103  }
104 
105  for (unsigned int i = 0; i < 9; ++i)
106  {
107  _DFGRD0[i] = 0.0;
108  _DFGRD1[i] = 0.0;
109  }
110 
111  for (int i = 0; i < _NTENS * _NTENS; ++i)
112  {
113  _DDSDDE[i] = 0.0;
114  }
115 
116  // Assign materials properties from vector form into an array
117  for (unsigned int i = 0; i < _num_props; ++i)
118  {
119  _PROPS[i] = props_array[i];
120  }
121 
122  // Size UMAT state variable (NSTATV) and material constant (NPROPS) arrays
125 
126  // Open the library
127  _handle = dlopen(_plugin.c_str(), RTLD_LAZY);
128 
129  if (!_handle)
130  {
131  std::ostringstream error;
132  error << "Cannot open library: " << dlerror() << '\n';
133  mooseError(error.str());
134  }
135 
136  // Reset errors
137  dlerror();
138 
139  // Snag the function pointer from the library
140  {
141  void * pointer = dlsym(_handle, "umat_");
142  _umat = *reinterpret_cast<umat_t *>(&pointer);
143  }
144 
145  // Catch errors
146  const char * dlsym_error = dlerror();
147  if (dlsym_error)
148  {
149  dlclose(_handle);
150  std::ostringstream error;
151  error << "Cannot load symbol 'umat_': " << dlsym_error << '\n';
152  mooseError(error.str());
153  }
154 }
155 
157 {
158  delete _STATEV;
159  delete _DDSDDT;
160  delete _DRPLDE;
161  delete _STRAN;
162  delete _DFGRD0;
163  delete _DFGRD1;
164  delete _STRESS;
165  delete _DDSDDE;
166  delete _DSTRAN;
167  delete _PROPS;
168 
169  dlclose(_handle);
170 }
171 
172 void
174 {
175  // Initialize state variable vector
176  _state_var[_qp].resize(_num_state_vars);
177  for (unsigned int i = 0; i < _num_state_vars; ++i)
178  _state_var[_qp][i] = 0.0;
179 }
180 
181 void
183 {
184  // Calculate deformation gradient - modeled from "solid_mechanics/src/materials/Nonlinear3D.C"
185  // Fbar = 1 + grad(u(k))
186  ColumnMajorMatrix Fbar;
187 
188  Fbar(0, 0) = _grad_disp_x[_qp](0);
189  Fbar(0, 1) = _grad_disp_x[_qp](1);
190  Fbar(0, 2) = _grad_disp_x[_qp](2);
191  Fbar(1, 0) = _grad_disp_y[_qp](0);
192  Fbar(1, 1) = _grad_disp_y[_qp](1);
193  Fbar(1, 2) = _grad_disp_y[_qp](2);
194  Fbar(2, 0) = _grad_disp_z[_qp](0);
195  Fbar(2, 1) = _grad_disp_z[_qp](1);
196  Fbar(2, 2) = _grad_disp_z[_qp](2);
197 
198  Fbar.addDiag(1);
199  _Fbar[_qp] = Fbar;
200 
201  Real myDFGRD0[9] = {_Fbar_old[_qp](0, 0),
202  _Fbar_old[_qp](1, 0),
203  _Fbar_old[_qp](2, 0),
204  _Fbar_old[_qp](0, 1),
205  _Fbar_old[_qp](1, 1),
206  _Fbar_old[_qp](2, 1),
207  _Fbar_old[_qp](0, 2),
208  _Fbar_old[_qp](1, 2),
209  _Fbar_old[_qp](2, 2)};
210  Real myDFGRD1[9] = {_Fbar[_qp](0, 0),
211  _Fbar[_qp](1, 0),
212  _Fbar[_qp](2, 0),
213  _Fbar[_qp](0, 1),
214  _Fbar[_qp](1, 1),
215  _Fbar[_qp](2, 1),
216  _Fbar[_qp](0, 2),
217  _Fbar[_qp](1, 2),
218  _Fbar[_qp](2, 2)};
219 
220  for (unsigned int i = 0; i < 9; ++i)
221  {
222  _DFGRD0[i] = myDFGRD0[i];
223  _DFGRD1[i] = myDFGRD1[i];
224  }
225 
226  // Recover "old" state variables
227  for (unsigned int i = 0; i < _num_state_vars; ++i)
228  _STATEV[i] = _state_var_old[_qp][i];
229 
230  // Pass through updated stress, total strain, and strain increment arrays
231  for (int i = 0; i < _NTENS; ++i)
232  {
233  _STRESS[i] = _stress_old.component(i);
234  _STRAN[i] = _total_strain[_qp].component(i);
236  }
237 
238  // Pass through step , time, and coordinate system information
239  _KSTEP = _t_step; // Step number
240  _TIME[0] = _t; // Value of step time at the beginning of the current increment - Check
241  _TIME[1] = _t - _dt; // Value of total time at the beginning of the current increment - Check
242  _DTIME = _dt; // Time increment
243  for (unsigned int i = 0; i < 3; ++i) // Loop current coordinates in UMAT COORDS
244  _COORDS[i] = _coord[i];
245 
246  // Connection to extern statement
247  _umat(_STRESS,
248  _STATEV,
249  _DDSDDE,
250  &_SSE,
251  &_SPD,
252  &_SCD,
253  &_RPL,
254  _DDSDDT,
255  _DRPLDE,
256  &_DRPLDT,
257  _STRAN,
258  _DSTRAN,
259  _TIME,
260  &_DTIME,
261  &_TEMP,
262  &_DTEMP,
263  _PREDEF,
264  _DPRED,
265  &_CMNAME,
266  &_NDI,
267  &_NSHR,
268  &_NTENS,
269  &_NSTATV,
270  _PROPS,
271  &_NPROPS,
272  _COORDS,
273  _DROT,
274  &_PNEWDT,
275  &_CELENT,
276  _DFGRD0,
277  _DFGRD1,
278  &_NOEL,
279  &_NPT,
280  &_LAYER,
281  &_KSPT,
282  &_KSTEP,
283  &_KINC);
284 
285  // Energy outputs
287  _plastic_dissipation[_qp] = _SPD;
288  _creep_dissipation[_qp] = _SCD;
289 
290  // Update state variables
291  for (unsigned int i = 0; i < _num_state_vars; ++i)
292  _state_var[_qp][i] = _STATEV[i];
293 
294  // Get new stress tensor - UMAT should update stress
295  SymmTensor stressnew(_STRESS[0], _STRESS[1], _STRESS[2], _STRESS[3], _STRESS[4], _STRESS[5]);
296  _stress[_qp] = stressnew;
297 }
AbaqusUmatMaterial::_NPROPS
int _NPROPS
Definition: AbaqusUmatMaterial.h:82
AbaqusUmatMaterial::_umat
umat_t _umat
Definition: AbaqusUmatMaterial.h:76
AbaqusUmatMaterial::_PNEWDT
Real _PNEWDT
Definition: AbaqusUmatMaterial.h:79
AbaqusUmatMaterial::_STRAN
Real * _STRAN
Definition: AbaqusUmatMaterial.h:85
AbaqusUmatMaterial.h
AbaqusUmatMaterial::_KSTEP
int _KSTEP
Definition: AbaqusUmatMaterial.h:82
AbaqusUmatMaterial::_num_state_vars
unsigned int _num_state_vars
Definition: AbaqusUmatMaterial.h:69
AbaqusUmatMaterial::AbaqusUmatMaterial
AbaqusUmatMaterial(const InputParameters &parameters)
Definition: AbaqusUmatMaterial.C:34
AbaqusUmatMaterial::_thermal_constants
std::vector< Real > _thermal_constants
Definition: AbaqusUmatMaterial.h:68
AbaqusUmatMaterial::_Fbar
MaterialProperty< ColumnMajorMatrix > & _Fbar
Definition: AbaqusUmatMaterial.h:99
AbaqusUmatMaterial::_DDSDDE
Real * _DDSDDE
Definition: AbaqusUmatMaterial.h:85
AbaqusUmatMaterial::_DRPLDT
Real _DRPLDT
Definition: AbaqusUmatMaterial.h:79
AbaqusUmatMaterial::_PROPS
Real * _PROPS
Definition: AbaqusUmatMaterial.h:85
AbaqusUmatMaterial::_creep_dissipation
MaterialProperty< Real > & _creep_dissipation
Definition: AbaqusUmatMaterial.h:103
AbaqusUmatMaterial::_SPD
Real _SPD
Definition: AbaqusUmatMaterial.h:79
AbaqusUmatMaterial::_DPRED
Real _DPRED[1]
Definition: AbaqusUmatMaterial.h:85
AbaqusUmatMaterial::_DRPLDE
Real * _DRPLDE
Definition: AbaqusUmatMaterial.h:85
SymmTensor::component
Real component(unsigned int i) const
Definition: SymmTensor.h:99
SolidModel::_strain_increment
SymmTensor _strain_increment
In most models, this is the mechanical strain increment, but for inelastic models,...
Definition: SolidModel.h:151
AbaqusUmatMaterial::~AbaqusUmatMaterial
virtual ~AbaqusUmatMaterial()
Definition: AbaqusUmatMaterial.C:156
AbaqusUmatMaterial::_grad_disp_z
const VariableGradient & _grad_disp_z
Definition: AbaqusUmatMaterial.h:93
AbaqusUmatMaterial::_CELENT
Real _CELENT
Definition: AbaqusUmatMaterial.h:79
AbaqusUmatMaterial::_COORDS
Real _COORDS[3]
Definition: AbaqusUmatMaterial.h:85
AbaqusUmatMaterial::_SSE
Real _SSE
Definition: AbaqusUmatMaterial.h:79
AbaqusUmatMaterial::_RPL
Real _RPL
Definition: AbaqusUmatMaterial.h:79
AbaqusUmatMaterial::_Fbar_old
const MaterialProperty< ColumnMajorMatrix > & _Fbar_old
Definition: AbaqusUmatMaterial.h:100
AbaqusUmatMaterial::_NPT
int _NPT
Definition: AbaqusUmatMaterial.h:82
AbaqusUmatMaterial::_NSHR
int _NSHR
Definition: AbaqusUmatMaterial.h:82
AbaqusUmatMaterial::_CMNAME
Real _CMNAME
Definition: AbaqusUmatMaterial.h:79
AbaqusUmatMaterial::_LAYER
int _LAYER
Definition: AbaqusUmatMaterial.h:82
AbaqusUmatMaterial::_KINC
int _KINC
Definition: AbaqusUmatMaterial.h:82
registerMooseObject
registerMooseObject("SolidMechanicsApp", AbaqusUmatMaterial)
AbaqusUmatMaterial::_TEMP
Real _TEMP
Definition: AbaqusUmatMaterial.h:79
AbaqusUmatMaterial::_TIME
Real _TIME[2]
Definition: AbaqusUmatMaterial.h:85
AbaqusUmatMaterial::_SCD
Real _SCD
Definition: AbaqusUmatMaterial.h:79
AbaqusUmatMaterial::_STRESS
Real * _STRESS
Definition: AbaqusUmatMaterial.h:85
validParams< AbaqusUmatMaterial >
InputParameters validParams< AbaqusUmatMaterial >()
Definition: AbaqusUmatMaterial.C:21
AbaqusUmatMaterial::_num_props
unsigned int _num_props
Definition: AbaqusUmatMaterial.h:70
AbaqusUmatMaterial::_STATEV
Real * _STATEV
Definition: AbaqusUmatMaterial.h:85
AbaqusUmatMaterial::initQpStatefulProperties
virtual void initQpStatefulProperties()
Definition: AbaqusUmatMaterial.C:173
SolidModel
SolidModel is the base class for all this module's solid mechanics material models.
Definition: SolidModel.h:33
AbaqusUmatMaterial::_DTIME
Real _DTIME
Definition: AbaqusUmatMaterial.h:79
AbaqusUmatMaterial::_mechanical_constants
std::vector< Real > _mechanical_constants
Definition: AbaqusUmatMaterial.h:67
AbaqusUmatMaterial::_PREDEF
Real _PREDEF[1]
Definition: AbaqusUmatMaterial.h:85
SymmTensor
Definition: SymmTensor.h:21
AbaqusUmatMaterial::_NTENS
int _NTENS
Definition: AbaqusUmatMaterial.h:82
AbaqusUmatMaterial::_NSTATV
int _NSTATV
Definition: AbaqusUmatMaterial.h:82
AbaqusUmatMaterial::_grad_disp_y
const VariableGradient & _grad_disp_y
Definition: AbaqusUmatMaterial.h:92
AbaqusUmatMaterial::_plastic_dissipation
MaterialProperty< Real > & _plastic_dissipation
Definition: AbaqusUmatMaterial.h:102
SolidModel::_total_strain
MaterialProperty< SymmTensor > & _total_strain
Definition: SolidModel.h:116
AbaqusUmatMaterial::_grad_disp_x
const VariableGradient & _grad_disp_x
Definition: AbaqusUmatMaterial.h:91
AbaqusUmatMaterial::_handle
void * _handle
Definition: AbaqusUmatMaterial.h:73
validParams< SolidModel >
InputParameters validParams< SolidModel >()
Definition: SolidModel.C:31
SolidModel::_stress
MaterialProperty< SymmTensor > & _stress
Definition: SolidModel.h:108
AbaqusUmatMaterial::_state_var_old
const MaterialProperty< std::vector< Real > > & _state_var_old
Definition: AbaqusUmatMaterial.h:98
AbaqusUmatMaterial::_DFGRD0
Real * _DFGRD0
Definition: AbaqusUmatMaterial.h:85
AbaqusUmatMaterial::_elastic_strain_energy
MaterialProperty< Real > & _elastic_strain_energy
Definition: AbaqusUmatMaterial.h:101
AbaqusUmatMaterial::_NOEL
int _NOEL
Definition: AbaqusUmatMaterial.h:82
SolidModel::_stress_old
SymmTensor _stress_old
Definition: SolidModel.h:114
AbaqusUmatMaterial::_DDSDDT
Real * _DDSDDT
Definition: AbaqusUmatMaterial.h:85
AbaqusUmatMaterial
Definition: AbaqusUmatMaterial.h:59
AbaqusUmatMaterial::_DTEMP
Real _DTEMP
Definition: AbaqusUmatMaterial.h:79
AbaqusUmatMaterial::_NDI
int _NDI
Definition: AbaqusUmatMaterial.h:82
AbaqusUmatMaterial::_state_var
MaterialProperty< std::vector< Real > > & _state_var
Definition: AbaqusUmatMaterial.h:97
AbaqusUmatMaterial::computeStress
virtual void computeStress()
Compute the stress (sigma += deltaSigma)
Definition: AbaqusUmatMaterial.C:182
AbaqusUmatMaterial::_DFGRD1
Real * _DFGRD1
Definition: AbaqusUmatMaterial.h:85
AbaqusUmatMaterial::_DSTRAN
Real * _DSTRAN
Definition: AbaqusUmatMaterial.h:85
AbaqusUmatMaterial::_plugin
FileName _plugin
Definition: AbaqusUmatMaterial.h:66
AbaqusUmatMaterial::_DROT
Real _DROT[3][3]
Definition: AbaqusUmatMaterial.h:85
AbaqusUmatMaterial::_KSPT
int _KSPT
Definition: AbaqusUmatMaterial.h:82