23 SymTensor() { d11_ = d22_ = d33_ = d12_ = d13_ = d23_ = initVal<double>(); }
26 #pragma warning(disable:26495) // Init warning- not initializing on purpose 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) { }
41 bool operator==(
const SymTensor &s)
const;
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_; }
68 inline const double &operator[](
unsigned int i)
const;
69 inline double &operator[](
unsigned int i);
72 const double &operator()(
unsigned int i,
unsigned int j)
const;
74 double &operator()(
unsigned int i,
unsigned int j);
83 double getTrace()
const {
return d11_+d22_+d33_; }
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(); }
95 double getJ2(
SymTensor *dev,
double *I1=
nullptr);
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;
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);
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; }
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_)))))); }
177 enum class Type { ThreeDCube, ThreeDJacobi, ZMax, ZMid, ZMin };
193 return (d11_ == s.d11_ && d22_ == s.d22_ &&
194 d33_ == s.d33_ && d12_ == s.d12_ && d13_ == s.d13_ &&
227 return sqrt(I1*I1/3.0 + 2.0*J2);
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());
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;
247 inline const SymTensor &SymTensor::operator*=(
const double &mul) {
257 inline SymTensor SymTensor::operator/(
const double &mul)
const {
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;
268 inline const SymTensor &SymTensor::operator/=(
const double &mul) {
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_;
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_;
300 inline void SymTensor::adjustTrace(
const double &newTrace) {
301 static const double d1d3 = 0.33333333333333333333333333333333;
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;
311 inline void SymTensor::rotate(
const DVect3 &rot) {
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());
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