Itasca C++ Interface
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
symtensor.h
Go to the documentation of this file.
1 #pragma once
2 
8 #include "axes.h"
9 #include <cassert>
10 #include <limits>
11 #include <algorithm>
12 
13 class SymTensorInfo;
14 
20 public:
22 #ifdef _DEBUG
23  SymTensor() { d11_ = d22_ = d33_ = d12_ = d13_ = d23_ = initVal<double>(); }
24 #else
25 #pragma warning(push)
26 #pragma warning(disable:26495) // Init warning- not initializing on purpose
27  SymTensor() { }
28 #pragma warning(pop)
29 #endif
30  SymTensor(const SymTensor &s) { operator=(s); }
34  explicit SymTensor(const double &i11,const double &i22=0.0,const double &i33=0.0,
35  const double &i12=0.0,const double &i13=0.0,const double &i23=0.0)
36  : d11_(i11), d22_(i22), d33_(i33), d12_(i12), d13_(i13), d23_(i23) { }
38  const SymTensor &operator=(const SymTensor &s);
39 
41  bool operator==(const SymTensor &s) const;
42  bool operator<(const SymTensor &s) const;
43 
45  const double &s11() const { return d11_; }
46  const double &s22() const { return d22_; }
47  const double &s33() const { return d33_; }
48  const double &s12() const { return d12_; }
49  const double &s13() const { return d13_; }
50  const double &s23() const { return d23_; }
51  const double &s21() const { return d12_; }
52  const double &s31() const { return d13_; }
53  const double &s32() const { return d23_; }
54  double &rs11() { return d11_; }
56  double &rs22() { return d22_; }
57  double &rs33() { return d33_; }
58  double &rs12() { return d12_; }
59  double &rs13() { return d13_; }
60  double &rs23() { return d23_; }
61  double &rs21() { return d12_; }
62  double &rs31() { return d13_; }
63  double &rs32() { return d23_; }
64 
68  inline const double &operator[](unsigned int i) const;
69  inline double &operator[](unsigned int i);
70 
72  const double &operator()(unsigned int i,unsigned int j) const;
74  double &operator()(unsigned int i,unsigned int j);
75 
81  DVect3 getEigenInfo(SymTensorInfo *si=0) const;
83  double getTrace() const { return d11_+d22_+d33_; }
85  SymTensor getDeviatoric() const { double p=getTrace()/3.0; return SymTensor(d11_-p, d22_-p, d33_-p, d12_, d13_, d23_); }
87  double getI1() const { return getTrace(); }
89  double getI2() const { return d11_*d22_ + d22_*d33_ + d11_*d33_ - d12_*d12_ - d23_*d23_ - d13_*d13_; }
91  double getI3() const { return getDeterminate(); }
93  double getJ2() const;
95  double getJ2(SymTensor *dev, double *I1=nullptr);
96  //Keep only getJ2(), Von Mises and Octahedral stress/strain are calculated from J2.
98  //double getVonMises() const { return sqrt(3.0*getJ2()); }
100  //double getVonMisesStrain() const { return sqrt(4.0*getJ2()/9.0); }
102  //double getOctahedralShear() const { return sqrt(2.0*getJ2()/3.0); }
104  //double getOctahedralShearStrain() const { return sqrt(8.0*getJ2()/3.0); }
106  double getJ3() const;
108  double getLode(double *I1 = nullptr, double *J2 = nullptr, double *J3 = nullptr);
110  double getDeterminate() const;
112  double getNorm2() const { return d11_*d11_ + d22_*d22_ + d33_*d33_ + 2.0*(d12_*d12_ + d13_*d13_ + d23_*d23_); }
116  double getTotalMeasure() const;
118  SymTensor toGlobal(const Axes3D &a) const;
123  inline DVect3 operator*(const DVect3 &input) const;
124  inline SymTensor operator*(const double &mul) const;
125  inline const SymTensor &operator*=(const double &mul);
126  inline SymTensor operator/(const double &mul) const;
127  inline const SymTensor &operator/=(const double &mul);
129  SymTensor mul(const double &d) const { SymTensor ret(d11_*d,d22_*d,d33_*d,d12_*d,d13_*d,d23_*d); return ret; }
131  const SymTensor &operator+=(const SymTensor &s) { d11_+=s.d11_; d22_+=s.d22_; d33_+=s.d33_; d12_+=s.d12_; d13_+=s.d13_; d23_+=s.d23_; return *this; }
132  const SymTensor &operator-=(const SymTensor &s) { d11_-=s.d11_; d22_-=s.d22_; d33_-=s.d33_; d12_-=s.d12_; d13_-=s.d13_; d23_-=s.d23_; return *this; }
133  inline SymTensor operator+(const SymTensor &s) const;
134  inline SymTensor operator-(const SymTensor &s) const;
136  static SymTensor fromPrincipal(const DVect3 &prin,const Axes3D &axes);
140  static SymTensor fromForceNormal(const DVect3 &normal, const DVect3 &force);
142  bool isDiagonal(double tol = std::numeric_limits<double>::epsilon()*1000.0) const { return (abs(d12_) > tol || abs(d13_) > tol || abs(d23_) > tol) ? false : true; }
143  inline void adjustTrace(const double &newTrace);
144  inline void incrementDiagonal(const double &increment) { d11_ += increment; d22_ += increment; d33_ += increment; }
145  inline void rotate(const DVect3 &rot);
146  inline double maxAbs() const { return std::max(std::abs(d11_),std::max(std::abs(d22_),std::max(std::abs(d33_),std::max(std::abs(d12_),std::max(std::abs(d13_),std::abs(d23_)))))); }
147 private:
148  double d11_;
149  double d22_;
150  double d33_;
151  double d12_;
152  double d13_;
153  double d23_;
154 };
155 
164 public:
165  friend class SymTensor;
167  BASE_EXPORT SymTensorInfo(): type_(Type::ThreeDCube) { }
173  BASE_EXPORT Axes3D getAxes() const;
175  BASE_EXPORT SymTensor resolve(const DVect3 &prin) const;
176 private:
177  enum class Type { ThreeDCube, ThreeDJacobi, ZMax, ZMid, ZMin };
178  Type type_;
179  Axes3D axes_;
180 };
181 
182 inline const SymTensor &SymTensor::operator=(const SymTensor &s) {
183  d11_ = s.d11_;
184  d22_ = s.d22_;
185  d33_ = s.d33_;
186  d12_ = s.d12_;
187  d13_ = s.d13_;
188  d23_ = s.d23_;
189  return *this;
190 }
191 
192 inline bool SymTensor::operator==(const SymTensor &s) const {
193  return (d11_ == s.d11_ && d22_ == s.d22_ &&
194  d33_ == s.d33_ && d12_ == s.d12_ && d13_ == s.d13_ &&
195  d23_ == s.d23_);
196 }
197 
198 inline const double &SymTensor::operator[](unsigned int i) const {
199  assert(i<6);
200  switch (i) {
201  case 0: return d11_;
202  case 1: return d22_;
203  case 2: return d33_;
204  case 3: return d12_;
205  case 4: return d13_;
206  case 5: return d23_;
207  }
208  return d11_;
209 }
210 
211 inline double &SymTensor::operator[](unsigned int i) {
212  assert(i<6);
213  switch (i) {
214  case 0: return d11_;
215  case 1: return d22_;
216  case 2: return d33_;
217  case 3: return d12_;
218  case 4: return d13_;
219  case 5: return d23_;
220  }
221  return d11_;
222 }
223 
224 inline double SymTensor::getTotalMeasure() const {
225  double I1 = getTrace();
226  double J2 = getJ2();
227  return sqrt(I1*I1/3.0 + 2.0*J2);
228 }
229 
230 inline DVect3 SymTensor::operator*(const DVect3 &normal) const {
231  return DVect3(normal.x()*s11() + normal.y()*s12() + normal.z()*s13(),
232  normal.x()*s21() + normal.y()*s22() + normal.z()*s23(),
233  normal.x()*s31() + normal.y()*s32() + normal.z()*s33());
234 }
235 
236 inline SymTensor SymTensor::operator*(const double &mul) const {
237  SymTensor ret;
238  ret.d11_ = d11_ * mul;
239  ret.d22_ = d22_ * mul;
240  ret.d33_ = d33_ * mul;
241  ret.d12_ = d12_ * mul;
242  ret.d13_ = d13_ * mul;
243  ret.d23_ = d23_ * mul;
244  return ret;
245 }
246 
247 inline const SymTensor &SymTensor::operator*=(const double &mul) {
248  d11_ *= mul;
249  d22_ *= mul;
250  d33_ *= mul;
251  d12_ *= mul;
252  d13_ *= mul;
253  d23_ *= mul;
254  return *this;
255 }
256 
257 inline SymTensor SymTensor::operator/(const double &mul) const {
258  SymTensor ret;
259  ret.d11_ = d11_ / mul;
260  ret.d22_ = d22_ / mul;
261  ret.d33_ = d33_ / mul;
262  ret.d12_ = d12_ / mul;
263  ret.d13_ = d13_ / mul;
264  ret.d23_ = d23_ / mul;
265  return ret;
266 }
267 
268 inline const SymTensor &SymTensor::operator/=(const double &mul) {
269  d11_ /= mul;
270  d22_ /= mul;
271  d33_ /= mul;
272  d12_ /= mul;
273  d13_ /= mul;
274  d23_ /= mul;
275  return *this;
276 }
277 
278 inline SymTensor SymTensor::operator+(const SymTensor &s) const {
279  SymTensor ret;
280  ret.d11_ = d11_ + s.d11_;
281  ret.d22_ = d22_ + s.d22_;
282  ret.d33_ = d33_ + s.d33_;
283  ret.d12_ = d12_ + s.d12_;
284  ret.d13_ = d13_ + s.d13_;
285  ret.d23_ = d23_ + s.d23_;
286  return ret;
287 }
288 
289 inline SymTensor SymTensor::operator-(const SymTensor &s) const {
290  SymTensor ret;
291  ret.d11_ = d11_ - s.d11_;
292  ret.d22_ = d22_ - s.d22_;
293  ret.d33_ = d33_ - s.d33_;
294  ret.d12_ = d12_ - s.d12_;
295  ret.d13_ = d13_ - s.d13_;
296  ret.d23_ = d23_ - s.d23_;
297  return ret;
298 }
299 
300 inline void SymTensor::adjustTrace(const double &newTrace) {
301  static const double d1d3 = 0.33333333333333333333333333333333;
302  /* --- strain differences --- */
303  double dx = s11() - s22();
304  double dy = s22() - s33();
305  double dz = s33() - s11();
306  rs11() = (newTrace + dx - dz) * d1d3;
307  rs22() = (newTrace + dy - dx) * d1d3;
308  rs33() = (newTrace + dz - dy) * d1d3;
309 }
310 
311 inline void SymTensor::rotate(const DVect3 &rot) {
312  SymTensor copy(*this);
313  d11_ += 2.0*( copy.s12()*rot.x() + copy.s13()*rot.y());
314  d22_ += 2.0*(-copy.s12()*rot.x() + copy.s23()*rot.z());
315  d33_ += -2.0*( copy.s13()*rot.y() + copy.s23()*rot.z());
316  d12_ += ((copy.s22() - copy.s11())*rot.x() + copy.s23()*rot.x() + copy.s13()*rot.z());
317  d13_ += ( copy.s23()*rot.x() + (copy.s33() - copy.s11())*rot.x() - copy.s12()*rot.z());
318  d23_ += ( -copy.s13()*rot.x() - copy.s12()*rot.x() + (copy.s33() - copy.s22())*rot.z());
319 }
320 
322 // EoF
double & rs22()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:56
const SymTensor & operator=(const SymTensor &s)
Assignment operator.
Definition: symtensor.h:182
const double & s33() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:47
const double & s22() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:46
BASE_EXPORT SymTensor resolve(const DVect3 &prin) const
Regenerates full tensor from info + principal directions.
Definition: symtensor.cpp:574
BASE_EXPORT Axes3D getAxes() const
Returns eigen directions (minimum, intermediate, maximum).
Definition: symtensor.cpp:567
const double & s32() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:53
double & rs31()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:62
const double & s11() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:45
double getTotalMeasure() const
Definition: symtensor.h:224
Class for specifying a particular 3D cartesian axes system, and converting to and from it.
Definition: axes.h:120
double & rs33()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:57
bool isDiagonal(double tol=std::numeric_limits< double >::epsilon() *1000.0) const
Determines whether or not the SymTensor is diagonal.
Definition: symtensor.h:142
const double & s12() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:48
double getI2() const
Returns the second invariant.
Definition: symtensor.h:89
BASE_EXPORT SymTensorInfo()
Default constructor.
Definition: symtensor.h:167
double getI1() const
Same as getTrace() - returns the first invariant.
Definition: symtensor.h:87
2D and 3D cartesian Axes systems.
double & rs23()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:60
#define BASE_EXPORT
Definition: basedef.h:21
DVect3 operator *(const DVect3 &input) const
Performs the linear mapping represented by the tensor on the vector input.
Definition: symtensor.h:230
A symmetric 2nd order tensor.
Definition: symtensor.h:19
double getI3() const
Returns the third invariant, or I3.
Definition: symtensor.h:91
SymTensor()
Default constructor, no data initialization.
Definition: symtensor.h:27
const double & s13() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:49
const double & operator[](unsigned int i) const
Allows Index access to tensor components.
Definition: symtensor.h:198
SymTensor eigenvalue and direction helper class.
Definition: symtensor.h:163
const double & s23() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:50
SymTensor getDeviatoric() const
Returns the deviatoric tensor.
Definition: symtensor.h:85
Vector3< T > max(const Vector3< T > &v1, const Vector3< T > &v2)
Template specialization for max, min.
Definition: vect.h:431
BASE_EXPORT const SymTensorInfo & operator=(const SymTensorInfo &si)
Equality operator.
Definition: symtensor.cpp:561
double & rs12()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:58
bool operator==(const SymTensor &s) const
Equality operator.
Definition: symtensor.h:192
const SymTensor & operator+=(const SymTensor &s)
+= operator for a SymTensor
Definition: symtensor.h:131
double & rs11()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:55
double & rs13()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:59
Vector3< Double > DVect3
Definition: vect.h:289
double getTrace() const
Returns the trace of the tensor (11+22+33). I1.
Definition: symtensor.h:83
double & rs32()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:63
SymTensor mul(const double &d) const
Returns a SymTensor with every component multiplied by a scalar value.
Definition: symtensor.h:129
double & rs21()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:61
SymTensor(const double &i11, const double &i22=0.0, const double &i33=0.0, const double &i12=0.0, const double &i13=0.0, const double &i23=0.0)
Definition: symtensor.h:34
double getJ2() const
Returns the second invariant of the deviatoric – J2.
Definition: symtensor.cpp:156
double getNorm2() const
Returns a scalar norm (magnitude) value for the tensor, can be used for tolerance checking,...
Definition: symtensor.h:112
const double & s31() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:52
const double & s21() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition: symtensor.h:51