FEDEM Solver  R8.0
Source code of the dynamics solver
FFaVec3.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 
13 #ifndef FFA_VEC3_H
14 #define FFA_VEC3_H
15 
16 #include <iostream>
17 #include <cmath>
18 
19 
24 {
25  VX,
26  VY,
27  VZ,
28  VW
29 };
30 
31 
39 class FaVec3
40 {
41 public:
43  FaVec3() { this->clear(); }
45  FaVec3(double x, double y, double z) { n[VX] = x; n[VY] = y; n[VZ] = z; }
47  FaVec3(const double* v) { n[VX] = v[VX]; n[VY] = v[VY]; n[VZ] = v[VZ]; }
49  FaVec3(const float* v) { n[VX] = v[VX]; n[VY] = v[VY]; n[VZ] = v[VZ]; }
51  FaVec3(const FaVec3& v) { n[VX] = v.n[VX]; n[VY] = v.n[VY]; n[VZ] = v.n[VZ]; }
53  virtual ~FaVec3() {}
54 
56  FaVec3& operator= (const FaVec3& v);
58  FaVec3& operator+= (const FaVec3& v);
60  FaVec3& operator-= (const FaVec3& v);
62  FaVec3& operator*= (double d);
64  FaVec3& operator/= (double d);
65 
67  const double* getPt() const { return n; }
69  double* getPt() { return n; }
70 
72  const double& operator[] (int i) const;
74  double& operator[] (int i);
75 
77  const double& operator() (int i) const;
79  double& operator() (int i);
80 
82  double x() const { return n[VX]; }
84  double y() const { return n[VY]; }
86  double z() const { return n[VZ]; }
87 
89  void x(double v) { n[VX] = v; }
91  void y(double v) { n[VY] = v; }
93  void z(double v) { n[VZ] = v; }
95  void clear() { n[VX] = n[VY] = n[VZ] = 0.0; }
96 
98  int isParallell (const FaVec3& otherVec, double tolerance = 1.0e-10) const;
100  bool equals (const FaVec3& otherVec, double tolerance = 0.0) const;
102  double angle (const FaVec3& otherVec) const;
104  bool isZero (double tolerance = 1.0e-10) const;
105 
107  double sqrLength() const { return n[VX]*n[VX] + n[VY]*n[VY] + n[VZ]*n[VZ]; }
109  double length() const { return sqrt(this->sqrLength()); }
110 
112  FaVec3& truncate(double tolerance = 1.0e-10);
114  FaVec3& normalize(double truncTol = 0.0);
116  FaVec3& round(int precision);
117 
120  FaVec3& setByCylCoords(const FaVec3& cylCoords, FFaVec3IdxEnum axis = VZ);
123  FaVec3 getAsCylCoords(FFaVec3IdxEnum axis = VZ) const;
124 
127  FaVec3& setBySphCoords(const FaVec3& sphCoords, FFaVec3IdxEnum axis = VZ);
130  FaVec3 getAsSphCoords(FFaVec3IdxEnum axis = VZ) const;
131 
133  friend FaVec3 operator- (const FaVec3& v);
135  friend FaVec3 operator+ (const FaVec3& a, const FaVec3& b);
137  friend FaVec3 operator- (const FaVec3& a, const FaVec3& b);
139  friend FaVec3 operator* (const FaVec3& a, double d);
141  friend FaVec3 operator* ( double d, const FaVec3& a);
143  friend FaVec3 operator/ (const FaVec3& a, double d);
145  friend double operator* (const FaVec3& a, const FaVec3& b);
147  friend FaVec3 operator^ (const FaVec3& a, const FaVec3& b);
149  friend bool operator== (const FaVec3& a, const FaVec3& b);
151  friend bool operator!= (const FaVec3& a, const FaVec3& b);
152 
154  friend std::ostream& operator<< (std::ostream& s, const FaVec3& v);
156  friend std::istream& operator>> (std::istream& s, FaVec3& v);
157 
158 private:
159  double n[3];
160 };
161 
162 
163 // --- inline functions ---
164 
166 {
167  if (this != &v)
168  for (int i = 0; i < 3; i++)
169  n[i] = v.n[i];
170 
171  return *this;
172 }
173 
174 inline const double& FaVec3::operator[] (int i) const
175 {
176 #ifdef FFA_INDEXCHECK
177  if (i < 0 || i > 2)
178  std::cerr <<"FaVec3::operator[]: index i="<< i <<" is out of range [0,2]"
179  << std::endl;
180 #endif
181  return n[i];
182 }
183 
184 inline double& FaVec3::operator[] (int i)
185 {
186 #ifdef FFA_INDEXCHECK
187  if (i < 0 || i > 2)
188  std::cerr <<"FaVec3::operator[]: index i="<< i <<" is out of range [0,2]"
189  << std::endl;
190 #endif
191  return n[i];
192 }
193 
194 inline const double& FaVec3::operator() (int i) const
195 {
196 #ifdef FFA_INDEXCHECK
197  if (i < 1 || i > 3)
198  std::cerr <<"FaVec3::operator(): index i="<< i <<" is out of range [1,3]"
199  << std::endl;
200 #endif
201  return n[i-1];
202 }
203 
204 inline double& FaVec3::operator() (int i)
205 {
206 #ifdef FFA_INDEXCHECK
207  if (i < 1 || i > 3)
208  std::cerr <<"FaVec3::operator(): index i="<< i <<" is out of range [1,3]"
209  << std::endl;
210 #endif
211  return n[i-1];
212 }
213 
214 #endif
FFaVec3IdxEnum
Enums representing vector and matrix indices.
Definition: FFaVec3.H:24
@ VX
The X-component.
Definition: FFaVec3.H:25
@ VY
The Y-component.
Definition: FFaVec3.H:26
@ VZ
The Z-component.
Definition: FFaVec3.H:27
@ VW
Translation part of a FaMat34 object.
Definition: FFaVec3.H:28
Class for point vectors in 3D space.
Definition: FFaVec3.H:40
double * getPt()
Access to internal array (for manipulation).
Definition: FFaVec3.H:69
double n[3]
The actual vector components.
Definition: FFaVec3.H:159
friend FaVec3 operator*(const FaVec3 &a, double d)
Scaling by scalar.
Definition: FFaVec3.C:329
bool isZero(double tolerance=1.0e-10) const
Checks if this vector is zero.
Definition: FFaVec3.C:140
friend FaVec3 operator^(const FaVec3 &a, const FaVec3 &b)
Cross product.
Definition: FFaVec3.C:359
bool equals(const FaVec3 &otherVec, double tolerance=0.0) const
Checks if this vector is equal to otherVec.
Definition: FFaVec3.C:121
friend bool operator!=(const FaVec3 &a, const FaVec3 &b)
Unequality operator.
Definition: FFaVec3.C:374
FaVec3 & operator=(const FaVec3 &v)
Assignment operator.
Definition: FFaVec3.H:165
int isParallell(const FaVec3 &otherVec, double tolerance=1.0e-10) const
Checks if this vector is parallel to otherVec.
Definition: FFaVec3.C:80
FaVec3 & operator/=(double d)
Scaling operator (division by a scalar).
Definition: FFaVec3.C:52
friend FaVec3 operator/(const FaVec3 &a, double d)
Division by scalar.
Definition: FFaVec3.C:339
FaVec3 & setByCylCoords(const FaVec3 &cylCoords, FFaVec3IdxEnum axis=VZ)
Sets this vector to the Cartesian equivalent of the cylindrical coordinates cylCoords.
Definition: FFaVec3.C:223
const double & operator[](int i) const
Zero-based indexing operator (read only).
Definition: FFaVec3.H:174
friend std::ostream & operator<<(std::ostream &s, const FaVec3 &v)
Printing operator.
Definition: FFaVec3.C:382
FaVec3()
Default constructor.
Definition: FFaVec3.H:43
void clear()
Sets the vector to zero.
Definition: FFaVec3.H:95
FaVec3 getAsCylCoords(FFaVec3IdxEnum axis=VZ) const
Returns the cylindrical coordinates corresponding to the Cartesian position of this vector.
Definition: FFaVec3.C:245
FaVec3 & operator*=(double d)
Scaling operator (multiplication by a scalar).
Definition: FFaVec3.C:43
FaVec3 & operator-=(const FaVec3 &v)
Subtraction operator.
Definition: FFaVec3.C:34
friend FaVec3 operator-(const FaVec3 &v)
Unary negation operator.
Definition: FFaVec3.C:313
friend FaVec3 operator+(const FaVec3 &a, const FaVec3 &b)
Global addition operator.
Definition: FFaVec3.C:318
void x(double v)
Assigns the X-component of the vector.
Definition: FFaVec3.H:89
FaVec3 & truncate(double tolerance=1.0e-10)
Truncates small components of this vector to zero.
Definition: FFaVec3.C:153
friend bool operator==(const FaVec3 &a, const FaVec3 &b)
Equality operator.
Definition: FFaVec3.C:367
FaVec3 & round(int precision)
Rounds off the components down to precision significant digits.
Definition: FFaVec3.C:203
FaVec3 & normalize(double truncTol=0.0)
Normalizes this vector to unit length.
Definition: FFaVec3.C:173
FaVec3 & operator+=(const FaVec3 &v)
Addition operator.
Definition: FFaVec3.C:25
FaVec3 & setBySphCoords(const FaVec3 &sphCoords, FFaVec3IdxEnum axis=VZ)
Sets this vector to the Cartesian equivalent of the spherical coordinates sphCoords.
Definition: FFaVec3.C:266
double angle(const FaVec3 &otherVec) const
Calculates angle between this vector and otherVec.
Definition: FFaVec3.C:97
FaVec3(const FaVec3 &v)
Copy constructor.
Definition: FFaVec3.H:51
double z() const
Returns the Z-component of the vector.
Definition: FFaVec3.H:86
FaVec3(const float *v)
Constructor creating a vector from a float array.
Definition: FFaVec3.H:49
friend std::istream & operator>>(std::istream &s, FaVec3 &v)
Reading operator.
Definition: FFaVec3.C:388
FaVec3(const double *v)
Constructor creating a vector from a double array.
Definition: FFaVec3.H:47
const double * getPt() const
Access to internal array (read only).
Definition: FFaVec3.H:67
void z(double v)
Assigns the Z-component of the vector.
Definition: FFaVec3.H:93
double sqrLength() const
Returns the square of the length of this vector.
Definition: FFaVec3.H:107
virtual ~FaVec3()
Empty destructor.
Definition: FFaVec3.H:53
void y(double v)
Assigns the Y-component of the vector.
Definition: FFaVec3.H:91
const double & operator()(int i) const
One-based indexing operator (read only).
Definition: FFaVec3.H:194
double y() const
Returns the Y-component of the vector.
Definition: FFaVec3.H:84
double length() const
Returns the length of this vector.
Definition: FFaVec3.H:109
double x() const
Returns the X-component of the vector.
Definition: FFaVec3.H:82
FaVec3 getAsSphCoords(FFaVec3IdxEnum axis=VZ) const
Returns the spherical coordinates corresponding to the Cartesian position of this vector.
Definition: FFaVec3.C:288
FaVec3(double x, double y, double z)
Constructor creating a vector from three double values.
Definition: FFaVec3.H:45
real(sp), dimension(:,:,:), pointer b
Definition: diffractionModule.f90:22
real(sp), dimension(:,:,:), pointer a
Definition: diffractionModule.f90:21