LCOV - code coverage report
Current view: top level - src/verdict - verdict_defines.hpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 4 4 100.0 %
Date: 2020-12-16 07:07:30 Functions: 2 2 100.0 %
Branches: 1 2 50.0 %

           Branch data     Line data    Source code
       1                 :            : /*=========================================================================
       2                 :            : 
       3                 :            :   Module:    $RCSfile: verdict_defines.hpp,v $
       4                 :            : 
       5                 :            :   Copyright (c) 2006 Sandia Corporation.
       6                 :            :   All rights reserved.
       7                 :            :   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
       8                 :            : 
       9                 :            :      This software is distributed WITHOUT ANY WARRANTY; without even
      10                 :            :      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
      11                 :            :      PURPOSE.  See the above copyright notice for more information.
      12                 :            : 
      13                 :            : =========================================================================*/
      14                 :            : 
      15                 :            : /*
      16                 :            :  * verdict_defines.cpp contains common definitions
      17                 :            :  *
      18                 :            :  * This file is part of VERDICT
      19                 :            :  *
      20                 :            :  */
      21                 :            : 
      22                 :            : #ifndef VERDICT_DEFINES
      23                 :            : #define VERDICT_DEFINES
      24                 :            : 
      25                 :            : #include <math.h>
      26                 :            : #include "v_vector.h"
      27                 :            : #include "VerdictVector.hpp"
      28                 :            : 
      29                 :            : enum VerdictBoolean
      30                 :            : {
      31                 :            :     VERDICT_FALSE = 0,
      32                 :            :     VERDICT_TRUE  = 1
      33                 :            : };
      34                 :            : 
      35                 :            : #define VERDICT_MIN( a, b ) ( ( a ) < ( b ) ? ( a ) : ( b ) )
      36                 :            : #define VERDICT_MAX( a, b ) ( ( a ) > ( b ) ? ( a ) : ( b ) )
      37                 :            : 
      38                 :         91 : inline double determinant( double a, double b, double c, double d )
      39                 :            : {
      40                 :         91 :     return ( ( a ) * ( d ) - ( b ) * ( c ) );
      41                 :            : }
      42                 :            : 
      43                 :         46 : inline double determinant( VerdictVector v1, VerdictVector v2, VerdictVector v3 )
      44                 :            : {
      45         [ +  - ]:         46 :     return v1 % ( v2 * v3 );
      46                 :            : }
      47                 :            : 
      48                 :            : #define jacobian_matrix( a, b, c, d, e, f, g ) \
      49                 :            :     double jac_mat_tmp;                        \
      50                 :            :     jac_mat_tmp = sqrt( a );                   \
      51                 :            :     if( jac_mat_tmp == 0 )                     \
      52                 :            :     {                                          \
      53                 :            :         d = 0;                                 \
      54                 :            :         e = 0;                                 \
      55                 :            :         f = 0;                                 \
      56                 :            :         g = 0;                                 \
      57                 :            :     }                                          \
      58                 :            :     else                                       \
      59                 :            :     {                                          \
      60                 :            :         d = jac_mat_tmp;                       \
      61                 :            :         e = 0;                                 \
      62                 :            :         f = b / jac_mat_tmp;                   \
      63                 :            :         g = c / jac_mat_tmp;                   \
      64                 :            :     }
      65                 :            : 
      66                 :            : // this assumes that detmw != 0
      67                 :            : #define form_t( m11, m21, m12, m22, mw11, mw21, mw12, mw22, detmw, xm11, xm21, xm12, xm22 ) \
      68                 :            :     xm11 = ( m11 * mw22 - m12 * mw21 ) / detmw;                                             \
      69                 :            :     xm21 = ( m21 * mw22 - m22 * mw21 ) / detmw;                                             \
      70                 :            :     xm12 = ( m12 * mw11 - m11 * mw12 ) / detmw;                                             \
      71                 :            :     xm22 = ( m22 * mw11 - m21 * mw12 ) / detmw;
      72                 :            : 
      73                 :            : extern double verdictSqrt2;
      74                 :            : 
      75                 :            : inline double normalize_jacobian( double jacobi, VerdictVector& v1, VerdictVector& v2, VerdictVector& v3,
      76                 :            :                                   int tet_flag = 0 )
      77                 :            : {
      78                 :            :     double return_value = 0.0;
      79                 :            : 
      80                 :            :     if( jacobi != 0.0 )
      81                 :            :     {
      82                 :            : 
      83                 :            :         double l1, l2, l3, length_product;
      84                 :            :         // Note: there may be numerical problems if one is a lot shorter
      85                 :            :         // than the others this way. But scaling each vector before the
      86                 :            :         // triple product would involve 3 square roots instead of just
      87                 :            :         // one.
      88                 :            :         l1             = v1.length_squared();
      89                 :            :         l2             = v2.length_squared();
      90                 :            :         l3             = v3.length_squared();
      91                 :            :         length_product = sqrt( l1 * l2 * l3 );
      92                 :            : 
      93                 :            :         // if some numerical scaling problem, or just plain roundoff,
      94                 :            :         // then push back into range [-1,1].
      95                 :            :         if( length_product < fabs( jacobi ) ) { length_product = fabs( jacobi ); }
      96                 :            : 
      97                 :            :         if( tet_flag == 1 )
      98                 :            :             return_value = verdictSqrt2 * jacobi / length_product;
      99                 :            :         else
     100                 :            :             return_value = jacobi / length_product;
     101                 :            :     }
     102                 :            :     return return_value;
     103                 :            : }
     104                 :            : 
     105                 :            : inline double norm_squared( double m11, double m21, double m12, double m22 )
     106                 :            : {
     107                 :            :     return m11 * m11 + m21 * m21 + m12 * m12 + m22 * m22;
     108                 :            : }
     109                 :            : 
     110                 :            : #define metric_matrix( m11, m21, m12, m22, gm11, gm12, gm22 ) \
     111                 :            :     gm11 = m11 * m11 + m21 * m21;                             \
     112                 :            :     gm12 = m11 * m12 + m21 * m22;                             \
     113                 :            :     gm22 = m12 * m12 + m22 * m22;
     114                 :            : 
     115                 :            : inline int skew_matrix( double gm11, double gm12, double gm22, double det, double& qm11, double& qm21, double& qm12,
     116                 :            :                         double& qm22 )
     117                 :            : {
     118                 :            :     double tmp = sqrt( gm11 * gm22 );
     119                 :            :     if( tmp == 0 ) { return false; }
     120                 :            : 
     121                 :            :     qm11 = 1;
     122                 :            :     qm21 = 0;
     123                 :            :     qm12 = gm12 / tmp;
     124                 :            :     qm22 = det / tmp;
     125                 :            :     return true;
     126                 :            : }
     127                 :            : 
     128                 :            : inline void inverse( VerdictVector x1, VerdictVector x2, VerdictVector x3, VerdictVector& u1, VerdictVector& u2,
     129                 :            :                      VerdictVector& u3 )
     130                 :            : {
     131                 :            :     double detx = determinant( x1, x2, x3 );
     132                 :            :     VerdictVector rx1, rx2, rx3;
     133                 :            : 
     134                 :            :     rx1.set( x1.x(), x2.x(), x3.x() );
     135                 :            :     rx2.set( x1.y(), x2.y(), x3.y() );
     136                 :            :     rx3.set( x1.z(), x2.z(), x3.z() );
     137                 :            : 
     138                 :            :     u1 = rx2 * rx3;
     139                 :            :     u2 = rx3 * rx1;
     140                 :            :     u3 = rx1 * rx2;
     141                 :            : 
     142                 :            :     u1 /= detx;
     143                 :            :     u2 /= detx;
     144                 :            :     u3 /= detx;
     145                 :            : }
     146                 :            : 
     147                 :            : /*
     148                 :            : inline void form_T(double a1[3],
     149                 :            :   double a2[3],
     150                 :            :   double a3[3],
     151                 :            :   double w1[3],
     152                 :            :   double w2[3],
     153                 :            :   double w3[3],
     154                 :            :   double t1[3],
     155                 :            :   double t2[3],
     156                 :            :   double t3[3] )
     157                 :            : {
     158                 :            : 
     159                 :            :   double x1[3], x2[3], x3[3];
     160                 :            :   double ra1[3], ra2[3], ra3[3];
     161                 :            : 
     162                 :            :   x1[0] = a1[0];
     163                 :            :   x1[1] = a2[0];
     164                 :            :   x1[2] = a3[0];
     165                 :            : 
     166                 :            :   x2[0] = a1[1];
     167                 :            :   x2[1] = a2[1];
     168                 :            :   x2[2] = a3[1];
     169                 :            : 
     170                 :            :   x3[0] = a1[2];
     171                 :            :   x3[1] = a2[2];
     172                 :            :   x3[2] = a3[2];
     173                 :            : 
     174                 :            :   inverse(w1,w2,w3,x1,x2,x3);
     175                 :            : 
     176                 :            :   t1[0] = dot_product(ra1, x1);
     177                 :            :   t1[1] = dot_product(ra1, x2);
     178                 :            :   t1[2] = dot_product(ra1, x3);
     179                 :            : 
     180                 :            :   t2[0] = dot_product(ra2, x1);
     181                 :            :   t2[0] = dot_product(ra2, x2);
     182                 :            :   t2[0] = dot_product(ra2, x3);
     183                 :            : 
     184                 :            :   t3[0] = dot_product(ra3, x1);
     185                 :            :   t3[0] = dot_product(ra3, x2);
     186                 :            :   t3[0] = dot_product(ra3, x3);
     187                 :            : 
     188                 :            : }
     189                 :            : */
     190                 :            : 
     191                 :            : inline void form_Q( const VerdictVector& v1, const VerdictVector& v2, const VerdictVector& v3, VerdictVector& q1,
     192                 :            :                     VerdictVector& q2, VerdictVector& q3 )
     193                 :            : {
     194                 :            : 
     195                 :            :     double g11, g12, g13, g22, g23, g33;
     196                 :            : 
     197                 :            :     g11 = v1 % v1;
     198                 :            :     g12 = v1 % v2;
     199                 :            :     g13 = v1 % v3;
     200                 :            :     g22 = v2 % v2;
     201                 :            :     g23 = v2 % v3;
     202                 :            :     g33 = v3 % v3;
     203                 :            : 
     204                 :            :     double rtg11 = sqrt( g11 );
     205                 :            :     double rtg22 = sqrt( g22 );
     206                 :            :     double rtg33 = sqrt( g33 );
     207                 :            :     VerdictVector temp1;
     208                 :            : 
     209                 :            :     temp1 = v1 * v2;
     210                 :            : 
     211                 :            :     double cross = sqrt( temp1 % temp1 );
     212                 :            : 
     213                 :            :     double q11, q21, q31;
     214                 :            :     double q12, q22, q32;
     215                 :            :     double q13, q23, q33;
     216                 :            : 
     217                 :            :     q11 = 1;
     218                 :            :     q21 = 0;
     219                 :            :     q31 = 0;
     220                 :            : 
     221                 :            :     q12 = g12 / rtg11 / rtg22;
     222                 :            :     q22 = cross / rtg11 / rtg22;
     223                 :            :     q32 = 0;
     224                 :            : 
     225                 :            :     q13   = g13 / rtg11 / rtg33;
     226                 :            :     q23   = ( g11 * g23 - g12 * g13 ) / rtg11 / rtg33 / cross;
     227                 :            :     temp1 = v2 * v3;
     228                 :            :     q33   = ( v1 % temp1 ) / rtg33 / cross;
     229                 :            : 
     230                 :            :     q1.set( q11, q21, q31 );
     231                 :            :     q2.set( q12, q22, q32 );
     232                 :            :     q3.set( q13, q23, q33 );
     233                 :            : }
     234                 :            : 
     235                 :            : inline void product( VerdictVector& a1, VerdictVector& a2, VerdictVector& a3, VerdictVector& b1, VerdictVector& b2,
     236                 :            :                      VerdictVector& b3, VerdictVector& c1, VerdictVector& c2, VerdictVector& c3 )
     237                 :            : {
     238                 :            : 
     239                 :            :     VerdictVector x1, x2, x3;
     240                 :            : 
     241                 :            :     x1.set( a1.x(), a2.x(), a3.x() );
     242                 :            :     x2.set( a1.y(), a2.y(), a3.y() );
     243                 :            :     x3.set( a1.z(), a2.z(), a3.z() );
     244                 :            : 
     245                 :            :     c1.set( x1 % b1, x2 % b1, x3 % b1 );
     246                 :            :     c2.set( x1 % b2, x2 % b2, x3 % b2 );
     247                 :            :     c3.set( x1 % b3, x2 % b3, x3 % b3 );
     248                 :            : }
     249                 :            : 
     250                 :            : inline double norm_squared( VerdictVector& x1, VerdictVector& x2, VerdictVector& x3 )
     251                 :            : 
     252                 :            : {
     253                 :            :     return ( x1 % x1 ) + ( x2 % x2 ) + ( x3 % x3 );
     254                 :            : }
     255                 :            : 
     256                 :            : inline double skew_x( VerdictVector& q1, VerdictVector& q2, VerdictVector& q3, VerdictVector& qw1, VerdictVector& qw2,
     257                 :            :                       VerdictVector& qw3 )
     258                 :            : {
     259                 :            :     double normsq1, normsq2, kappa;
     260                 :            :     VerdictVector u1, u2, u3;
     261                 :            :     VerdictVector x1, x2, x3;
     262                 :            : 
     263                 :            :     inverse( qw1, qw2, qw3, u1, u2, u3 );
     264                 :            :     product( q1, q2, q3, u1, u2, u3, x1, x2, x3 );
     265                 :            :     inverse( x1, x2, x3, u1, u2, u3 );
     266                 :            :     normsq1 = norm_squared( x1, x2, x3 );
     267                 :            :     normsq2 = norm_squared( u1, u2, u3 );
     268                 :            :     kappa   = sqrt( normsq1 * normsq2 );
     269                 :            : 
     270                 :            :     double skew = 0;
     271                 :            :     if( kappa > VERDICT_DBL_MIN ) skew = 3 / kappa;
     272                 :            : 
     273                 :            :     return skew;
     274                 :            : }
     275                 :            : 
     276                 :            : #endif

Generated by: LCOV version 1.11