FEDEM Solver  R8.0
Source code of the dynamics solver
FFaTensor2.H
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2023 SAP SE
2 //
3 // SPDX-License-Identifier: Apache-2.0
4 //
5 // This file is part of FEDEM - https://openfedem.org
7 
8 #ifndef FFA_TENSOR2_H
9 #define FFA_TENSOR2_H
10 
11 #include <array>
12 #include <iostream>
13 
14 class FaVec3;
15 class FaMat33;
16 class FaMat34;
17 class FFaTensor1;
18 class FFaTensor3;
19 
20 
28 {
29  std::array<double,3> myT;
30 
31 public:
32 
33  // Constructors
34 
35  FFaTensor2(double d = 0.0) { myT.fill(d); }
36  FFaTensor2(const float* t) { for (int i=0; i<3; i++) myT[i] = t[i]; }
37  FFaTensor2(const double* t) { for (int i=0; i<3; i++) myT[i] = t[i]; }
38  FFaTensor2(const FFaTensor2& t) { for (int i=0; i<3; i++) myT[i] = t.myT[i]; }
39  FFaTensor2(const FFaTensor1& t);
40  FFaTensor2(const FFaTensor3& t);
41  FFaTensor2(double t11, double t22, double t12 = 0.0) { myT = {t11,t22,t12}; }
42 
43  void fill(double d) { myT.fill(d); }
44 
45  // Local operators
46 
47  FFaTensor2& operator= (const FFaTensor1& t);
48  FFaTensor2& operator= (const FFaTensor2& t);
49  FFaTensor2& operator= (const FFaTensor3& t);
50 
52  {
53  for (int i=0; i<3; i++) myT[i] += t.myT[i];
54  return *this;
55  }
56 
58  {
59  for (int i=0; i<3; i++) myT[i] -= t.myT[i];
60  return *this;
61  }
62 
64  {
65  for (int i=0; i<3; i++) myT[i] *= d;
66  return *this;
67  }
68 
70  {
71  for (int i=0; i<3; i++) myT[i] /= d;
72  return *this;
73  }
74 
75  // Access to internal array
76 
77  const double* getPt() const { return myT.data(); }
78  double* getPt() { return myT.data(); }
79 
80  // Indexing
81 
82  const double& operator[] (int i) const;
83  double& operator[] (int i);
84 
85  // Special functions
86 
87  FFaTensor2& rotate(const double ex[2], const double ey[2]);
88 
89  double vonMises() const;
90  double maxShear() const;
91  void maxShear(FaVec3& v) const;
92  double maxPrinsipal(bool absMax = false) const;
93  double minPrinsipal() const;
94  void prinsipalValues(double& max, double& min) const;
95  void prinsipalValues(FaVec3& values, FaMat33& rotation) const;
96 
97  // Global operators
98 
99  friend FFaTensor2 operator- (const FFaTensor2&);
100  friend FFaTensor2 operator+ (const FFaTensor2&, const FFaTensor2&);
101  friend FFaTensor2 operator- (const FFaTensor2&, const FFaTensor2&);
102  // Scaling by scalar
103  friend FFaTensor2 operator* (const FFaTensor2&, double);
104  friend FFaTensor2 operator* (double, const FFaTensor2&);
105  friend FFaTensor2 operator/ (const FFaTensor2&, double);
106  // Equality
107  friend bool operator== (const FFaTensor2&, const FFaTensor2&);
108  friend bool operator!= (const FFaTensor2&, const FFaTensor2&);
109  // Rotation
110  friend FFaTensor3 operator* (const FFaTensor2&, const FaMat33&);
111  friend FFaTensor3 operator* (const FFaTensor2&, const FaMat34&);
112  friend FFaTensor3 operator* (const FaMat33& , const FFaTensor2&);
113  friend FFaTensor3 operator* (const FaMat34& , const FFaTensor2&);
114  // Writing and reading
115  friend std::ostream& operator<< (std::ostream& s, const FFaTensor2& b);
116  friend std::istream& operator>> (std::istream& s, FFaTensor2& b);
117 };
118 
119 
120 // --- inline functions ---
121 
122 inline const double& FFaTensor2::operator[] (int i) const
123 {
124 #ifdef FFA_INDEXCHECK
125  if (i < 0 || i > 2)
126  std::cerr <<"FFaTensor2::operator[]: index i="<< i
127  <<" is out of range [0,2]"<< std::endl;
128 #endif
129  return myT[i];
130 }
131 
132 inline double& FFaTensor2::operator[] (int i)
133 {
134 #ifdef FFA_INDEXCHECK
135  if (i < 0 || i > 2)
136  std::cerr <<"FFaTensor2::operator[]: index i="<< i
137  <<" is out of range [0,2]"<< std::endl;
138 #endif
139  return myT[i];
140 }
141 
142 #endif
Definition: FFaTensor1.H:24
Definition: FFaTensor2.H:28
FFaTensor2 & operator+=(const FFaTensor2 &t)
Definition: FFaTensor2.H:51
FFaTensor2 & rotate(const double ex[2], const double ey[2])
Definition: FFaTensor2.C:64
FFaTensor2 & operator/=(double d)
Definition: FFaTensor2.H:69
friend FFaTensor2 operator-(const FFaTensor2 &)
Definition: FFaTensor2.C:189
FFaTensor2(double d=0.0)
Definition: FFaTensor2.H:35
const double & operator[](int i) const
Definition: FFaTensor2.H:122
FFaTensor2 & operator*=(double d)
Definition: FFaTensor2.H:63
void prinsipalValues(double &max, double &min) const
Definition: FFaTensor2.C:150
friend FFaTensor2 operator+(const FFaTensor2 &, const FFaTensor2 &)
Definition: FFaTensor2.C:195
FFaTensor2(const double *t)
Definition: FFaTensor2.H:37
FFaTensor2(const float *t)
Definition: FFaTensor2.H:36
double maxShear() const
Definition: FFaTensor2.C:86
friend std::istream & operator>>(std::istream &s, FFaTensor2 &b)
Definition: FFaTensor2.C:280
const double * getPt() const
Definition: FFaTensor2.H:77
double * getPt()
Definition: FFaTensor2.H:78
friend std::ostream & operator<<(std::ostream &s, const FFaTensor2 &b)
Definition: FFaTensor2.C:274
FFaTensor2 & operator=(const FFaTensor1 &t)
Definition: FFaTensor2.C:52
void fill(double d)
Definition: FFaTensor2.H:43
double minPrinsipal() const
Definition: FFaTensor2.C:135
double maxPrinsipal(bool absMax=false) const
Definition: FFaTensor2.C:120
friend FFaTensor2 operator/(const FFaTensor2 &, double)
Definition: FFaTensor2.C:221
FFaTensor2 & operator-=(const FFaTensor2 &t)
Definition: FFaTensor2.H:57
FFaTensor2(double t11, double t22, double t12=0.0)
Definition: FFaTensor2.H:41
friend bool operator==(const FFaTensor2 &, const FFaTensor2 &)
Definition: FFaTensor2.C:230
friend FFaTensor2 operator*(const FFaTensor2 &, double)
Definition: FFaTensor2.C:210
double vonMises() const
Definition: FFaTensor2.C:75
std::array< double, 3 > myT
Definition: FFaTensor2.H:29
FFaTensor2(const FFaTensor2 &t)
Definition: FFaTensor2.H:38
friend bool operator!=(const FFaTensor2 &, const FFaTensor2 &)
Definition: FFaTensor2.C:236
Definition: FFaTensor3.H:28
Definition: FFaMat33.H:15
Definition: FFaMat34.H:16
Class for point vectors in 3D space.
Definition: FFaVec3.H:40
real(sp), dimension(:,:,:), pointer b
Definition: diffractionModule.f90:22