LCOV - code coverage report
Current view: top level - src/LocalDiscretization - QuadraticHex.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 38 44 86.4 %
Date: 2020-12-16 07:07:30 Functions: 8 10 80.0 %
Branches: 35 58 60.3 %

           Branch data     Line data    Source code
       1                 :            : #include "moab/LocalDiscretization/QuadraticHex.hpp"
       2                 :            : #include "moab/Forward.hpp"
       3                 :            : 
       4                 :            : namespace moab
       5                 :            : {
       6                 :            : 
       7                 :            : // those are not just the corners, but for simplicity, keep this name
       8                 :            : //
       9                 :            : const int QuadraticHex::corner[27][3] = { { -1, -1, -1 }, { 1, -1, -1 }, { 1, 1, -1 },  // corner nodes: 0-7
      10                 :            :                                           { -1, 1, -1 },                                // mid-edge nodes: 8-19
      11                 :            :                                           { -1, -1, 1 },                 // center-face nodes 20-25  center node  26
      12                 :            :                                           { 1, -1, 1 },                  //
      13                 :            :                                           { 1, 1, 1 },    { -1, 1, 1 },  //                    4   ----- 19   -----  7
      14                 :            :                                           { 0, -1, -1 },                 //                .   |                 .   |
      15                 :            :                                           { 1, 0, -1 },                  //            16         25         18      |
      16                 :            :                                           { 0, 1, -1 },                  //         .          |          .          |
      17                 :            :                                           { -1, 0, -1 },                 //      5   ----- 17   -----  6             |
      18                 :            :                                           { -1, -1, 0 },                 //      |            12       | 23         15
      19                 :            :                                           { 1, -1, 0 },                  //      |                     |             |
      20                 :            :                                           { 1, 1, 0 },                   //      |     20      |  26   |     22      |
      21                 :            :                                           { -1, 1, 0 },                  //      |                     |             |
      22                 :            :                                           { 0, -1, 1 },                  //     13         21  |      14             |
      23                 :            :                                           { 1, 0, 1 },                   //      |             0   ----- 11   -----  3
      24                 :            :                                           { 0, 1, 1 },                   //      |         .           |         .
      25                 :            :                                           { -1, 0, 1 },                  //      |      8         24   |     10
      26                 :            :                                           { 0, -1, 0 },                  //      |  .                  |  .
      27                 :            :                                           { 1, 0, 0 },                   //      1   -----  9   -----  2
      28                 :            :                                           { 0, 1, 0 },                   //
      29                 :            :                                           { -1, 0, 0 },   { 0, 0, -1 },  { 0, 0, 1 },  { 0, 0, 0 } };
      30                 :            : 
      31                 :     538893 : double QuadraticHex::SH( const int i, const double params )
      32                 :            : {
      33   [ +  +  +  - ]:     538893 :     switch( i )
      34                 :            :     {
      35                 :            :         case -1:
      36                 :     179631 :             return ( params * params - params ) / 2;
      37                 :            :         case 0:
      38                 :     179631 :             return 1 - params * params;
      39                 :            :         case 1:
      40                 :     179631 :             return ( params * params + params ) / 2;
      41                 :            :         default:
      42                 :          0 :             return 0.;
      43                 :            :     }
      44                 :            : }
      45                 :     215541 : double QuadraticHex::DSH( const int i, const double params )
      46                 :            : {
      47   [ +  +  +  - ]:     215541 :     switch( i )
      48                 :            :     {
      49                 :            :         case -1:
      50                 :      71847 :             return params - 0.5;
      51                 :            :         case 0:
      52                 :      71847 :             return -2 * params;
      53                 :            :         case 1:
      54                 :      71847 :             return params + 0.5;
      55                 :            :         default:
      56                 :          0 :             return 0.;
      57                 :            :     }
      58                 :            : }
      59                 :            : 
      60                 :       3992 : ErrorCode QuadraticHex::evalFcn( const double* params, const double* field, const int /*ndim*/, const int num_tuples,
      61                 :            :                                  double* /*work*/, double* result )
      62                 :            : {
      63 [ +  - ][ +  - ]:       3992 :     assert( params && field && num_tuples > 0 );
                 [ -  + ]
      64         [ +  - ]:       3992 :     std::fill( result, result + num_tuples, 0.0 );
      65         [ +  + ]:     111776 :     for( int i = 0; i < 27; i++ )
      66                 :            :     {
      67                 :     107784 :         const double sh = SH( corner[i][0], params[0] ) * SH( corner[i][1], params[1] ) * SH( corner[i][2], params[2] );
      68         [ +  + ]:     431136 :         for( int j = 0; j < num_tuples; j++ )
      69                 :     323352 :             result[j] += sh * field[num_tuples * i + j];
      70                 :            :     }
      71                 :            : 
      72                 :       3992 :     return MB_SUCCESS;
      73                 :            : }
      74                 :            : 
      75                 :       2661 : ErrorCode QuadraticHex::jacobianFcn( const double* params, const double* verts, const int nverts, const int ndim,
      76                 :            :                                      double* /*work*/, double* result )
      77                 :            : {
      78 [ +  - ][ +  - ]:       2661 :     assert( 27 == nverts && params && verts );
                 [ -  + ]
      79         [ -  + ]:       2661 :     if( 27 != nverts ) return MB_FAILURE;
      80                 :       2661 :     Matrix3* J = reinterpret_cast< Matrix3* >( result );
      81         [ +  + ]:      74508 :     for( int i = 0; i < 27; i++ )
      82                 :            :     {
      83 [ +  - ][ +  - ]:      71847 :         const double sh[3]  = { SH( corner[i][0], params[0] ), SH( corner[i][1], params[1] ),
      84         [ +  - ]:      71847 :                                SH( corner[i][2], params[2] ) };
      85 [ +  - ][ +  - ]:      71847 :         const double dsh[3] = { DSH( corner[i][0], params[0] ), DSH( corner[i][1], params[1] ),
      86         [ +  - ]:      71847 :                                 DSH( corner[i][2], params[2] ) };
      87                 :            : 
      88         [ +  + ]:     287388 :         for( int j = 0; j < 3; j++ )
      89                 :            :         {
      90         [ +  - ]:     215541 :             ( *J )( j, 0 ) += dsh[0] * sh[1] * sh[2] * verts[ndim * i + j];  // dxj/dr first column
      91         [ +  - ]:     215541 :             ( *J )( j, 1 ) += sh[0] * dsh[1] * sh[2] * verts[ndim * i + j];  // dxj/ds
      92         [ +  - ]:     215541 :             ( *J )( j, 2 ) += sh[0] * sh[1] * dsh[2] * verts[ndim * i + j];  // dxj/dt
      93                 :            :         }
      94                 :            :     }
      95                 :            : 
      96                 :       2661 :     return MB_SUCCESS;
      97                 :            : }
      98                 :            : 
      99                 :          0 : ErrorCode QuadraticHex::integrateFcn( const double* /*field*/, const double* /*verts*/, const int /*nverts*/,
     100                 :            :                                       const int /*ndim*/, const int /*num_tuples*/, double* /*work*/,
     101                 :            :                                       double* /*result*/ )
     102                 :            : {
     103                 :          0 :     return MB_NOT_IMPLEMENTED;
     104                 :            : }
     105                 :            : 
     106                 :       1331 : ErrorCode QuadraticHex::reverseEvalFcn( EvalFcn eval, JacobianFcn jacob, InsideFcn ins, const double* posn,
     107                 :            :                                         const double* verts, const int nverts, const int ndim, const double iter_tol,
     108                 :            :                                         const double inside_tol, double* work, double* params, int* is_inside )
     109                 :            : {
     110 [ +  - ][ -  + ]:       1331 :     assert( posn && verts );
     111                 :            :     return EvalSet::evaluate_reverse( eval, jacob, ins, posn, verts, nverts, ndim, iter_tol, inside_tol, work, params,
     112                 :       1331 :                                       is_inside );
     113                 :            : }
     114                 :            : 
     115                 :       2662 : int QuadraticHex::insideFcn( const double* params, const int ndim, const double tol )
     116                 :            : {
     117                 :       2662 :     return EvalSet::inside_function( params, ndim, tol );
     118                 :            : }
     119                 :            : 
     120                 :          0 : ErrorCode QuadraticHex::normalFcn( const int /*ientDim*/, const int /*facet*/, const int /*nverts*/,
     121                 :            :                                    const double* /*verts*/, double* /*normal[3]*/ )
     122                 :            : {
     123                 :          0 :     return MB_NOT_IMPLEMENTED;
     124                 :            : }
     125 [ +  - ][ +  - ]:        228 : }  // namespace moab

Generated by: LCOV version 1.11