NuTo
Numerics Tool
ModifiedMisesStrainNorm.h
Go to the documentation of this file.
1 #pragma once
2 #include "nuto/base/Exception.h"
4 #include "EngineeringStrain.h"
7 
8 namespace NuTo
9 {
10 namespace Constitutive
11 {
30 template <int TDim>
32 {
33 public:
38  ModifiedMisesStrainNorm(double nu, double k, ePlaneState planeState = ePlaneState::PLANE_STRAIN);
39 
44 
45 
48  double Value(const NuTo::EngineeringStrain<TDim>& strain) const;
49 
53 
54 private:
59  EngineeringStrain<3> Strain3D(const EngineeringStrain<TDim>& strain, double nu, ePlaneState) const;
60 
61  double mNu;
62  double mK;
63  ePlaneState mPlaneState;
64 
65  double mK1;
66  double mK2;
67 };
68 
69 
70 template <int TDim>
72  : mNu(nu)
73  , mK(k)
74  , mPlaneState(planeState)
75  , mK1((mK - 1.) / (2. * mK * (1 - 2 * mNu)))
76  , mK2(3. / (mK * (1. + mNu) * (1. + mNu)))
77 {
78 }
79 
80 template <int TDim>
82  : ModifiedMisesStrainNorm<TDim>::ModifiedMisesStrainNorm(m.nu, m.fc / m.ft, planeState)
83 {
84 }
85 
86 template <>
88  ePlaneState) const
89 {
91  v[0] = strain[0];
92  v[1] = -nu * strain[0];
93  v[2] = -nu * strain[0];
94  v[3] = 0.;
95  v[4] = 0.;
96  v[5] = 0;
97  return v;
98 }
99 
100 template <>
102  ePlaneState planeState) const
103 {
105  if (planeState == ePlaneState::PLANE_STRAIN)
106  {
107  v[0] = strain[0];
108  v[1] = strain[1];
109  v[2] = 0;
110  v[3] = 0.;
111  v[4] = 0.;
112  v[5] = strain[2];
113  return v;
114  }
115  if (planeState == ePlaneState::PLANE_STRESS)
116  {
117  v[0] = strain[0];
118  v[1] = strain[1];
119  v[2] = nu / (nu - 1.) * (strain[0] + strain[1]);
120  v[3] = 0.;
121  v[4] = 0.;
122  v[5] = strain[2];
123  return v;
124  }
125  throw Exception(__PRETTY_FUNCTION__, "Specify section behavior, either PLANE_STRAIN or PLANE_STRESS");
126 }
127 
128 template <>
130  ePlaneState) const
131 {
132  return strain;
133 }
134 
135 
136 template <int TDim>
138 {
139  EngineeringStrain<3> strain3D = Strain3D(strain, mNu, mPlaneState);
140  double I1 = NuTo::EngineeringStrainInvariants::I1(strain3D);
141  double J2 = NuTo::EngineeringStrainInvariants::J2(strain3D);
142 
143  double A = std::sqrt(mK1 * mK1 * I1 * I1 + mK2 * J2);
144 
145  return mK1 * I1 + A;
146 }
147 
148 
149 template <>
152 {
153  Eigen::Matrix<double, 1, 1> derivative;
154  double dJ2dexx = 2. / 3. * strain[0] * (1 + mNu) * (1 + mNu);
155  double dI1dexx = (1 - 2 * mNu);
156 
157  EngineeringStrain<3> strain3D = Strain3D(strain, mNu, mPlaneState);
158  double I1 = NuTo::EngineeringStrainInvariants::I1(strain3D);
159  double J2 = NuTo::EngineeringStrainInvariants::J2(strain3D);
160 
161  double A = std::sqrt(mK1 * mK1 * I1 * I1 + mK2 * J2);
162 
163  if (A == 0)
164  derivative[0] = mK1 * dI1dexx;
165  else
166  derivative[0] = mK1 * dI1dexx + 1. / (2 * A) * (2 * mK1 * mK1 * I1 * dI1dexx + mK2 * dJ2dexx);
167 
168  return derivative;
169 }
170 
171 template <>
174 {
175  Eigen::Matrix<double, 3, 1> derivative;
176 
177  EngineeringStrain<3> strain3D = Strain3D(strain, mNu, mPlaneState);
178  double I1 = NuTo::EngineeringStrainInvariants::I1(strain3D);
179  double J2 = NuTo::EngineeringStrainInvariants::J2(strain3D);
180 
181  double A = std::sqrt(mK1 * mK1 * I1 * I1 + mK2 * J2);
182 
183  switch (mPlaneState)
184  {
186  {
187  if (A == 0)
188  {
189  derivative[0] = mK1;
190  derivative[1] = mK1;
191  derivative[2] = 0;
192  }
193  else
194  {
195  double dJ2dexx = 1. / 3. * (2 * strain[0] - strain[1]);
196  double dJ2deyy = 1. / 3. * (2 * strain[1] - strain[0]);
197  double dJ2dgxy = 0.5 * strain[2];
198 
199  derivative[0] = mK1 + 1. / (2 * A) * (2 * mK1 * mK1 * I1 + mK2 * dJ2dexx);
200  derivative[1] = mK1 + 1. / (2 * A) * (2 * mK1 * mK1 * I1 + mK2 * dJ2deyy);
201  derivative[2] = 1. / (2 * A) * (mK2 * dJ2dgxy);
202  }
203  break;
204  }
206  {
207  double dI1dexxeyy = (1 + mNu / (mNu - 1));
208  if (A == 0)
209  {
210  derivative[0] = dI1dexxeyy * mK1;
211  derivative[1] = dI1dexxeyy * mK1;
212  derivative[2] = 0;
213  }
214  else
215  {
216  double strainxy = mNu / (mNu - 1.) * (strain[0] + strain[1]);
217  double dJ2dexx = 1. / 3. * (2. * strain[0] - strain[1] - 2. * strainxy + 2 * mNu / (mNu - 1) * strainxy);
218  double dJ2deyy = 1. / 3. * (2. * strain[1] - strain[0] - 2. * strainxy + 2 * mNu / (mNu - 1) * strainxy);
219  double dJ2dgxy = .5 * strain[2];
220 
221  derivative[0] = dI1dexxeyy * mK1 + 1. / (2. * A) * (2. * dI1dexxeyy * mK1 * mK1 * I1 + mK2 * dJ2dexx);
222  derivative[1] = dI1dexxeyy * mK1 + 1. / (2. * A) * (2. * dI1dexxeyy * mK1 * mK1 * I1 + mK2 * dJ2deyy);
223  derivative[2] = 1. / (2. * A) * (mK2 * dJ2dgxy);
224  }
225  break;
226  }
227  }
228  return derivative;
229 }
230 
231 template <>
234 {
235  Eigen::Matrix<double, 6, 1> derivative;
236 
237  double I1 = NuTo::EngineeringStrainInvariants::I1(strain);
238  double J2 = NuTo::EngineeringStrainInvariants::J2(strain);
239 
240  double A = std::sqrt(mK1 * mK1 * I1 * I1 + mK2 * J2);
241 
242  if (A == 0)
243  {
244  derivative[0] = mK1;
245  derivative[1] = mK1;
246  derivative[2] = mK1;
247  derivative[3] = 0;
248  derivative[4] = 0;
249  derivative[5] = 0;
250  }
251  else
252  {
253  double dJ2dexx = 1. / 3. * (2 * strain[0] - strain[1] - strain[2]);
254  double dJ2deyy = 1. / 3. * (2 * strain[1] - strain[0] - strain[2]);
255  double dJ2dezz = 1. / 3. * (2 * strain[2] - strain[0] - strain[1]);
256  double dJ2dgyz = 0.5 * strain[3];
257  double dJ2dgzx = 0.5 * strain[4];
258  double dJ2dgxy = 0.5 * strain[5];
259 
260  derivative[0] = mK1 + 1. / (2 * A) * (2 * mK1 * mK1 * I1 + mK2 * dJ2dexx);
261  derivative[1] = mK1 + 1. / (2 * A) * (2 * mK1 * mK1 * I1 + mK2 * dJ2deyy);
262  derivative[2] = mK1 + 1. / (2 * A) * (2 * mK1 * mK1 * I1 + mK2 * dJ2dezz);
263  derivative[3] = 1. / (2 * A) * mK2 * dJ2dgyz;
264  derivative[4] = 1. / (2 * A) * mK2 * dJ2dgzx;
265  derivative[5] = 1. / (2 * A) * mK2 * dJ2dgxy;
266  }
267  return derivative;
268 }
269 
270 } /* Constitutive */
271 } /* NuTo */
ePlaneState
Definition: ConstitutivePlaneStateEnum.h:4
Engineering strain.
Definition: EngineeringStrain.h:33
Base class for all exceptions thrown in NuTo.
Definition: Exception.h:9
double Value(const NuTo::EngineeringStrain< TDim > &strain) const
Definition: ModifiedMisesStrainNorm.h:137
Equivalent strain (strain norm) based on the modified mises norm.
Definition: ModifiedMisesStrainNorm.h:31
Eigen::Matrix< double, Voigt::Dim(TDim), 1 > Derivative(const NuTo::EngineeringStrain< TDim > &strain) const
double J2(const EngineeringStrain< 3 > &v)
returns J2 - the second deviatoric strain invariant of the characteristic equation Note the minus si...
Definition: EngineeringStrainInvariants.h:59
const double nu
Definition: LinearElasticDamageBenchmark.cpp:7
Common material parameters for softening materials.
Definition: SofteningMaterial.h:12
ModifiedMisesStrainNorm(double nu, double k, ePlaneState planeState=ePlaneState::PLANE_STRAIN)
Constructor.
Definition: ModifiedMisesStrainNorm.h:71
int v
Definition: Quad2DPatchTest.py:9
Definition: Exception.h:6
double I1(const EngineeringStrain< 3 > &v)
returns I1 - the first strain invariant of the characteristic equation
Definition: EngineeringStrainInvariants.h:32
const NuTo::EngineeringStrain< 3 > strain
Definition: LinearElasticDamageBenchmark.cpp:9
int A
Definition: TimeIntegrationResultForce.py:7