LCOV - code coverage report
Current view: top level - src/moab - CartVect.hpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 85 92 92.4 %
Date: 2020-12-16 07:07:30 Functions: 27 29 93.1 %
Branches: 9 18 50.0 %

           Branch data     Line data    Source code
       1                 :            : #ifndef MB_CART_VECT_HPP
       2                 :            : #define MB_CART_VECT_HPP
       3                 :            : 
       4                 :            : #include <cmath>
       5                 :            : #include <iosfwd>
       6                 :            : #include <float.h>
       7                 :            : 
       8                 :            : namespace moab
       9                 :            : {
      10                 :            : 
      11                 :            : /**
      12                 :            :  * \brief Cartesian Vector
      13                 :            :  */
      14                 :            : class CartVect
      15                 :            : {
      16                 :            :   private:
      17                 :            :     double d[3];
      18                 :            : 
      19                 :            :   public:
      20                 :   10860837 :     inline CartVect() {}
      21                 :            :     /**Initialze all three values to same scalar (typically zero)*/
      22                 :    1450666 :     explicit inline CartVect( double v )
      23                 :            :     {
      24                 :    1450666 :         d[0] = d[1] = d[2] = v;
      25                 :    1450666 :     }
      26                 :   27047020 :     inline CartVect( double i, double j, double k )
      27                 :            :     {
      28                 :   27047020 :         d[0] = i;
      29                 :   27047020 :         d[1] = j;
      30                 :   27047020 :         d[2] = k;
      31                 :   27047020 :     }
      32                 :            :     /**Initialze from array*/
      33                 :     526345 :     explicit inline CartVect( const double a[3] )
      34                 :            :     {
      35                 :     526345 :         d[0] = a[0];
      36                 :     526345 :         d[1] = a[1];
      37                 :     526345 :         d[2] = a[2];
      38                 :     526345 :     }
      39                 :         60 :     inline CartVect& operator=( const double v[3] )
      40                 :            :     {
      41                 :         60 :         d[0] = v[0];
      42                 :         60 :         d[1] = v[1];
      43                 :         60 :         d[2] = v[2];
      44                 :         60 :         return *this;
      45                 :            :     }
      46                 :            : 
      47                 :   27627113 :     inline double& operator[]( unsigned i )
      48                 :            :     {
      49                 :   27627113 :         return d[i];
      50                 :            :     }
      51                 :  267352247 :     inline double operator[]( unsigned i ) const
      52                 :            :     {
      53                 :  267352247 :         return d[i];
      54                 :            :     }
      55                 :            : 
      56                 :    3882718 :     inline CartVect& operator+=( const CartVect& v )
      57                 :            :     {
      58                 :    3882718 :         d[0] += v.d[0];
      59                 :    3882718 :         d[1] += v.d[1];
      60                 :    3882718 :         d[2] += v.d[2];
      61                 :    3882718 :         return *this;
      62                 :            :     }
      63                 :     241704 :     inline CartVect& operator-=( const CartVect& v )
      64                 :            :     {
      65                 :     241704 :         d[0] -= v.d[0];
      66                 :     241704 :         d[1] -= v.d[1];
      67                 :     241704 :         d[2] -= v.d[2];
      68                 :     241704 :         return *this;
      69                 :            :     }
      70                 :            :     /** Assign cross product to this */
      71                 :            :     inline CartVect& operator*=( const CartVect& v );
      72                 :            : 
      73                 :            :     inline CartVect& operator+=( double s )
      74                 :            :     {
      75                 :            :         d[0] += s;
      76                 :            :         d[1] += s;
      77                 :            :         d[2] += s;
      78                 :            :         return *this;
      79                 :            :     }
      80                 :            :     inline CartVect& operator-=( double s )
      81                 :            :     {
      82                 :            :         d[0] -= s;
      83                 :            :         d[1] -= s;
      84                 :            :         d[2] -= s;
      85                 :            :         return *this;
      86                 :            :     }
      87                 :        228 :     inline CartVect& operator*=( double s )
      88                 :            :     {
      89                 :        228 :         d[0] *= s;
      90                 :        228 :         d[1] *= s;
      91                 :        228 :         d[2] *= s;
      92                 :        228 :         return *this;
      93                 :            :     }
      94                 :    1174705 :     inline CartVect& operator/=( double s )
      95                 :            :     {
      96                 :    1174705 :         d[0] /= s;
      97                 :    1174705 :         d[1] /= s;
      98                 :    1174705 :         d[2] /= s;
      99                 :    1174705 :         return *this;
     100                 :            :     }
     101                 :          0 :     inline bool operator==( const CartVect& v ) const
     102                 :            :     {
     103 [ #  # ][ #  # ]:          0 :         return d[0] == v[0] && d[1] == v[1] && d[2] == v[2];
                 [ #  # ]
     104                 :            :     }
     105                 :        813 :     inline bool operator==( double val ) const
     106                 :            :     {
     107 [ +  + ][ +  + ]:        813 :         return d[0] == val && d[1] == val && d[2] == val;
                 [ +  - ]
     108                 :            :     }
     109                 :            : 
     110                 :            :     inline double length() const;  //!< vector length
     111                 :            : 
     112                 :            :     inline double length_squared() const;
     113                 :            : 
     114                 :            :     inline void normalize();  //!< make unit length, or 0 if length < DBL_MIN
     115                 :            : 
     116                 :            :     inline void flip();  //!< flip direction
     117                 :            : 
     118                 :            :     /** per-element scalar multiply (this[0] *= v[0], this[1] *= v[1], ...) */
     119                 :            :     inline void scale( const CartVect& v )
     120                 :            :     {
     121                 :            :         d[0] *= v.d[0];
     122                 :            :         d[1] *= v.d[1];
     123                 :            :         d[2] *= v.d[2];
     124                 :            :     }
     125                 :            : 
     126                 :            :     // get pointer to array of three doubles
     127                 :    3459019 :     inline double* array()
     128                 :            :     {
     129                 :    3459019 :         return d;
     130                 :            :     }
     131                 :      49225 :     inline const double* array() const
     132                 :            :     {
     133                 :      49225 :         return d;
     134                 :            :     }
     135                 :            : 
     136                 :            :     /** initialize double array from this */
     137                 :      40474 :     inline void get( double v[3] ) const
     138                 :            :     {
     139                 :      40474 :         v[0] = d[0];
     140                 :      40474 :         v[1] = d[1];
     141                 :      40474 :         v[2] = d[2];
     142                 :      40474 :     }
     143                 :            : 
     144                 :            :     /** initialize float array from this */
     145                 :          0 :     inline void get( float v[3] ) const
     146                 :            :     {
     147                 :          0 :         v[0] = static_cast< float >( d[0] );
     148                 :          0 :         v[1] = static_cast< float >( d[1] );
     149                 :          0 :         v[2] = static_cast< float >( d[2] );
     150                 :          0 :     }
     151                 :            : };
     152                 :            : 
     153                 :    5196441 : inline CartVect operator+( const CartVect& u, const CartVect& v )
     154                 :            : {
     155                 :    5196441 :     return CartVect( u[0] + v[0], u[1] + v[1], u[2] + v[2] );
     156                 :            : }
     157                 :            : 
     158                 :    9155533 : inline CartVect operator-( const CartVect& u, const CartVect& v )
     159                 :            : {
     160                 :    9155533 :     return CartVect( u[0] - v[0], u[1] - v[1], u[2] - v[2] );
     161                 :            : }
     162                 :            : 
     163                 :            : /** cross product */
     164                 :    1765902 : inline CartVect operator*( const CartVect& u, const CartVect& v )
     165                 :            : {
     166                 :    1765902 :     return CartVect( u[1] * v[2] - u[2] * v[1], u[2] * v[0] - u[0] * v[2], u[0] * v[1] - u[1] * v[0] );
     167                 :            : }
     168                 :            : 
     169                 :            : //! Dot product
     170                 :    8729122 : inline double operator%( const CartVect& u, const CartVect& v )
     171                 :            : {
     172                 :    8729122 :     return u[0] * v[0] + u[1] * v[1] + u[2] * v[2];
     173                 :            : }
     174                 :            : 
     175                 :            : inline CartVect& CartVect::operator*=( const CartVect& v )
     176                 :            : {
     177                 :            :     return *this = *this * v;
     178                 :            : }
     179                 :            : 
     180                 :    1483851 : inline double CartVect::length() const
     181                 :            : {
     182                 :    1483851 :     return std::sqrt( *this % *this );
     183                 :            : }
     184                 :            : 
     185                 :     442668 : inline double CartVect::length_squared() const
     186                 :            : {
     187                 :     442668 :     return d[0] * d[0] + d[1] * d[1] + d[2] * d[2];
     188                 :            : }
     189                 :            : 
     190                 :     142346 : inline void CartVect::normalize()
     191                 :            : {
     192                 :     142346 :     double tmp = length();
     193         [ +  + ]:     142346 :     if( tmp < DBL_MIN )
     194                 :          7 :         d[0] = d[1] = d[2] = 0;
     195                 :            :     else
     196                 :     142339 :         *this /= tmp;
     197                 :     142346 : }
     198                 :            : 
     199                 :            : inline void CartVect::flip()
     200                 :            : {
     201                 :            :     d[0] = -d[0];
     202                 :            :     d[1] = -d[1];
     203                 :            :     d[2] = -d[2];
     204                 :            : }
     205                 :            : 
     206                 :            : //! Interior angle between two vectors
     207                 :     162945 : inline double angle( const CartVect& u, const CartVect& v )
     208                 :            : {
     209                 :     162945 :     double tmp = ( u % v ) / std::sqrt( ( u % u ) * ( v % v ) );
     210         [ -  + ]:     162945 :     if( tmp > 1. ) tmp = 1.;
     211         [ -  + ]:     162945 :     if( tmp < -1. ) tmp = -1.;
     212                 :     162945 :     return std::acos( tmp );
     213                 :            : }
     214                 :            : 
     215                 :     612386 : inline CartVect operator-( const CartVect& v )
     216                 :            : {
     217                 :     612386 :     return CartVect( -v[0], -v[1], -v[2] );
     218                 :            : }
     219                 :            : inline CartVect operator+( const CartVect& v, double s )
     220                 :            : {
     221                 :            :     return CartVect( v[0] + s, v[1] + s, v[2] + s );
     222                 :            : }
     223                 :            : inline CartVect operator-( const CartVect& v, double s )
     224                 :            : {
     225                 :            :     return CartVect( v[0] - s, v[1] - s, v[2] - s );
     226                 :            : }
     227                 :       1758 : inline CartVect operator*( const CartVect& v, double s )
     228                 :            : {
     229                 :       1758 :     return CartVect( v[0] * s, v[1] * s, v[2] * s );
     230                 :            : }
     231                 :    1409025 : inline CartVect operator/( const CartVect& v, double s )
     232                 :            : {
     233                 :    1409025 :     return CartVect( v[0] / s, v[1] / s, v[2] / s );
     234                 :            : }
     235                 :            : inline CartVect operator+( double s, const CartVect& v )
     236                 :            : {
     237                 :            :     return CartVect( v[0] + s, v[1] + s, v[2] + s );
     238                 :            : }
     239                 :            : inline CartVect operator-( double s, const CartVect& v )
     240                 :            : {
     241                 :            :     return CartVect( v[0] - s, v[1] - s, v[2] - s );
     242                 :            : }
     243                 :    5075699 : inline CartVect operator*( double s, const CartVect& v )
     244                 :            : {
     245                 :    5075699 :     return CartVect( v[0] * s, v[1] * s, v[2] * s );
     246                 :            : }
     247                 :            : 
     248                 :            : //! Get unit vector in same direction
     249                 :            : inline CartVect unit( const CartVect& v )
     250                 :            : {
     251                 :            :     const double len = v.length();
     252                 :            :     return CartVect( v[0] / len, v[1] / len, v[2] / len );
     253                 :            : }
     254                 :            : 
     255                 :            : std::ostream& operator<<( std::ostream& s, const CartVect& v );
     256                 :            : 
     257                 :            : }  // namespace moab
     258                 :            : 
     259                 :            : #endif

Generated by: LCOV version 1.11