30    explicit SymTensor(
double i11,
double i22=0.0,
double i33=0.0,
double i12=0.0,
double i13=0.0,
double i23=0.0)
 
   31                      : d11_(i11), d22_(i22), d33_(i33), d12_(i12), d13_(i13), d23_(i23) { }
 
 
   36    bool operator==(
const SymTensor &s) 
const;
 
   40    double s11()
 const { 
return d11_; }
 
   41    double s22()
 const { 
return d22_; } 
 
   42    double s33()
 const { 
return d33_; } 
 
   43    double s12()
 const { 
return d12_; } 
 
   44    double s13()
 const { 
return d13_; } 
 
   45    double s23()
 const { 
return d23_; } 
 
   46    double s21()
 const { 
return d12_; } 
 
   47    double s31()
 const { 
return d13_; } 
 
   48    double s32()
 const { 
return d23_; } 
 
   50    double &
rs11() { 
return d11_; }
 
   51    double &
rs22() { 
return d22_; } 
 
   52    double &
rs33() { 
return d33_; } 
 
   53    double &
rs12() { 
return d12_; } 
 
   54    double &
rs13() { 
return d13_; } 
 
   55    double &
rs23() { 
return d23_; } 
 
   56    double &
rs21() { 
return d12_; } 
 
   57    double &
rs31() { 
return d13_; } 
 
   58    double &
rs32() { 
return d23_; } 
 
   63    inline double operator[](
unsigned int i) 
const;
 
   64    inline double &operator[](
unsigned int i);
 
   67    double operator()(
unsigned int i,
unsigned int j) 
const;
 
   69    double &operator()(
unsigned int i,
unsigned int j);
 
   78    double getTrace()
 const { 
return d11_+d22_+d33_; }
 
   82    double getI1()
 const { 
return getTrace(); }
 
   84    double getI2()
 const { 
return d11_*d22_ + d22_*d33_ + d11_*d33_ - d12_*d12_ - d23_*d23_ - d13_*d13_; }
 
   86    double getI3()
 const { 
return getDeterminate(); }
 
   90    double getJ2(
SymTensor *dev, 
double *I1=
nullptr);
 
  101    double getJ3() 
const;
 
  103    double getLode(
double *I1 = 
nullptr, 
double *J2 = 
nullptr, 
double *J3 = 
nullptr);
 
  105    double getDeterminate() 
const;
 
  107    double getNorm2()
 const { 
return d11_*d11_ + d22_*d22_ + d33_*d33_ + 2.0*(d12_*d12_ + d13_*d13_ + d23_*d23_); }
 
  111    double getTotalMeasure() 
const;
 
  118    inline DVect3 operator*(
const DVect3 &input) 
const;
 
  119    inline DVect2 operator*(
const DVect2 &input) 
const;
 
  120    inline SymTensor operator*(
const double &mul) 
const;
 
  121    inline const SymTensor &operator*=(
const double &mul);
 
  122    inline SymTensor operator/(
const double &mul) 
const;
 
  123    inline const SymTensor &operator/=(
const double &mul);
 
  128    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; }
 
  136    static SymTensor fromForceNormal(
const DVect3 &normal, 
const DVect3 &force);
 
  137    static inline uint32 doubleToSingleComponent(uint32 dof1,uint32 dof2);
 
  139    bool isDiagonal(
double tol = std::numeric_limits<double>::epsilon()*1000.0)
 const { 
return (abs(d12_) > tol || abs(d13_) > tol || abs(d23_) > tol) ? false : 
true; }
 
  140    inline bool isIsotropic(
double tol = std::numeric_limits<double>::epsilon()*1000.0) 
const;
 
  141    inline void adjustTrace(
const double newTrace);
 
  142    inline void incrementDiagonal(
const double increment) { d11_ += increment;  d22_ += increment;  d33_ += increment; }
 
  143    inline void rotate(
const DVect3 &rot);
 
  144    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_)))))); }
 
  145    inline bool zero()
 const { 
return (d11_==0.0) and (d22_==0.0) and (d33_==0.0) and (d12_==0.0) and (d13_==0.0) and (d23_==0.0); }
 
  146    inline std::array<
double, 6> toStressArray()
 const { 
return {d11_, d22_, d33_, d12_, d13_, d23_}; }
 
  147    inline std::array<double, 6> toStrainArray()
 const { 
return {d11_, d22_, d33_, 2.0*d12_, 2.0*d13_, 2.0*d23_}; }
 
  179    enum class Type { ThreeDCube, ThreeDJacobi, ZMax, ZMid, ZMin };
 
 
  185    return (d11_ == s.d11_ && d22_ == s.d22_ &&
 
  186            d33_ == s.d33_ && d12_ == s.d12_ && d13_ == s.d13_ &&
 
 
  219    return sqrt(I1*I1/3.0 + 2.0*J2);
 
 
  223    return DVect3(normal.x()*
s11() + normal.y()*
s12() + normal.z()*
s13(),
 
  224                  normal.x()*
s21() + normal.y()*
s22() + normal.z()*
s23(),
 
  225                  normal.x()*
s31() + normal.y()*
s32() + normal.z()*
s33());
 
 
  229    return DVect2(normal.x()*
s11() + normal.y()*
s12(),
 
  230                  normal.x()*
s21() + normal.y()*
s22());
 
  235    ret.d11_ = d11_ * 
mul;
 
  236    ret.d22_ = d22_ * 
mul;
 
  237    ret.d33_ = d33_ * 
mul;
 
  238    ret.d12_ = d12_ * 
mul;
 
  239    ret.d13_ = d13_ * 
mul;
 
  240    ret.d23_ = d23_ * 
mul;
 
  244inline const SymTensor &SymTensor::operator*=(
const double &
mul) {
 
  254inline SymTensor SymTensor::operator/(
const double &
mul)
 const {
 
  256    ret.d11_ = d11_ / 
mul;
 
  257    ret.d22_ = d22_ / 
mul;
 
  258    ret.d33_ = d33_ / 
mul;
 
  259    ret.d12_ = d12_ / 
mul;
 
  260    ret.d13_ = d13_ / 
mul;
 
  261    ret.d23_ = d23_ / 
mul;
 
  265inline const SymTensor &SymTensor::operator/=(
const double &
mul) {
 
  277    ret.d11_ = d11_ + s.d11_;
 
  278    ret.d22_ = d22_ + s.d22_;
 
  279    ret.d33_ = d33_ + s.d33_;
 
  280    ret.d12_ = d12_ + s.d12_;
 
  281    ret.d13_ = d13_ + s.d13_;
 
  282    ret.d23_ = d23_ + s.d23_;
 
  288    ret.d11_ = d11_ - s.d11_;
 
  289    ret.d22_ = d22_ - s.d22_;
 
  290    ret.d33_ = d33_ - s.d33_;
 
  291    ret.d12_ = d12_ - s.d12_;
 
  292    ret.d13_ = d13_ - s.d13_;
 
  293    ret.d23_ = d23_ - s.d23_;
 
  297inline bool SymTensor::isIsotropic(
double tol)
 const {
 
  298    double dtol = 
std::max(std::max(std::abs(
s11()),std::abs(
s22())),std::abs(
s33())) * tol;
 
  299    if (std::abs(
s11()-
s22()) > dtol) 
return false;
 
  300    if (std::abs(
s11()-
s33()) > dtol) 
return false;
 
  301    if (std::abs(
s12()) > dtol) 
return false;
 
  302    if (std::abs(
s13()) > dtol) 
return false;
 
  303    if (std::abs(
s23()) > dtol) 
return false;
 
  307inline void SymTensor::adjustTrace(
const double newTrace) {
 
  308    static constexpr double d1d3 = 1.0 / 3.0;
 
  310    double dx = 
s11() - 
s22();
 
  311    double dy = 
s22() - 
s33();
 
  312    double dz = 
s33() - 
s11();
 
  313    rs11() = (newTrace + dx - dz) * d1d3;
 
  314    rs22() = (newTrace + dy - dx) * d1d3;
 
  315    rs33() = (newTrace + dz - dy) * d1d3;
 
  318inline void SymTensor::rotate(
const DVect3 &rot) {
 
  320    d11_ +=  2.0*( copy.s12()*rot.x() + copy.s13()*rot.y());
 
  321    d22_ +=  2.0*(-copy.s12()*rot.x()                      + copy.s23()*rot.z());
 
  322    d33_ += -2.0*(                      copy.s13()*rot.y() + copy.s23()*rot.z());
 
  323    d12_ += ((copy.s22() - copy.s11())*rot.x() +                copy.s23()*rot.x() +                copy.s13()*rot.z());
 
  324    d13_ += (               copy.s23()*rot.x() + (copy.s33() - copy.s11())*rot.x() -                copy.s12()*rot.z());
 
  325    d23_ += (              -copy.s13()*rot.x() -                copy.s12()*rot.x() + (copy.s33() - copy.s22())*rot.z());
 
  334uint32 SymTensor::doubleToSingleComponent(uint32 dof1,uint32 dof2) {
 
  335    dof1 = std::clamp<uint32>(dof1,0,2);
 
  336    dof2 = std::clamp<uint32>(dof2,0,2);
 
  364    BASE_EXPORT string ts(
const SymTensor &s, 
int width=0, 
char notation = 
'\0', 
int precision = -1, 
char fill = 
' ');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2D and 3D cartesian Axes systems.
Class for specifying a particular 3D cartesian axes system, and converting to and from it.
Definition axes.h:121
A symmetric 2nd order tensor.
Definition symtensor.h:22
double & rs31()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:57
double & rs22()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:51
double & rs13()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:54
double & rs11()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:50
double getI3() const
Returns the third invariant, or I3.
Definition symtensor.h:86
const SymTensor & operator+=(const SymTensor &s)
+= operator for a SymTensor
Definition symtensor.h:127
double & rs12()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:53
double s21() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:46
SymTensor & operator=(const SymTensor &s)=default
Assignment operator.
SymTensor(double i11, double i22=0.0, double i33=0.0, double i12=0.0, double i13=0.0, double i23=0.0)
Definition symtensor.h:30
double getI1() const
Same as getTrace() - returns the first invariant.
Definition symtensor.h:82
double s33() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:42
double s12() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:43
double s11() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:40
SymTensor mul(const double &d) const
Returns a SymTensor with every component multiplied by a scalar value.
Definition symtensor.h:125
double & rs33()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:52
bool isDiagonal(double tol=std::numeric_limits< double >::epsilon() *1000.0) const
Determines whether or not the SymTensor is diagonal.
Definition symtensor.h:139
double s32() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:48
double s22() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:41
double getI2() const
Returns the second invariant.
Definition symtensor.h:84
double & rs21()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:56
double getTrace() const
Returns the trace of the tensor (11+22+33). I1.
Definition symtensor.h:78
double & rs23()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:55
double getJ2() const
Returns the second invariant of the deviatoric – J2.
Definition symtensor.cpp:160
SymTensor()
Default constructor, no data initialization.
Definition symtensor.h:25
double & rs32()
Reference access to components, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:58
double s31() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:47
double s23() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:45
double getNorm2() const
Returns a scalar norm (magnitude) value for the tensor, can be used for tolerance checking,...
Definition symtensor.h:107
SymTensor getDeviatoric() const
Returns the deviatoric tensor.
Definition symtensor.h:80
double s13() const
Component access, note that s12 is equivalent to s21 (for instance).
Definition symtensor.h:44
SymTensor(const SymTensor &s)=default
Copy constructor.
SymTensor eigenvalue and direction helper class.
Definition symtensor.h:165
BASE_EXPORT SymTensorInfo()
Default constructor.
Definition symtensor.h:169
BASE_EXPORT Axes3D getAxes() const
Returns eigen directions (minimum, intermediate, maximum).
Definition symtensor.cpp:569
BASE_EXPORT SymTensor resolve(const DVect3 &prin) const
Regenerates full tensor from info + principal directions.
Definition symtensor.cpp:576
BASE_EXPORT const SymTensorInfo & operator=(const SymTensorInfo &si)
Equality operator.
Definition symtensor.cpp:563
double getTotalMeasure() const
Definition symtensor.h:216
bool operator==(const SymTensor &s) const
Equality operator.
Definition symtensor.h:184
#define BASE_EXPORT
Definition basedef.h:25
double operator[](unsigned int i) const
Allows Index access to tensor components.
Definition symtensor.h:190
DVect3 operator*(const DVect3 &input) const
Performs the linear mapping represented by the tensor on the vector input.
Definition symtensor.h:222
constexpr Vector2< T > max(const Vector2< T > &v1, const Vector2< T > &v2)
Template specialization for max, min.
Definition vect.h:404