![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #include "moab/LocalDiscretization/QuadraticHex.hpp"
00002 #include "moab/Forward.hpp"
00003
00004 namespace moab
00005 {
00006
00007 // those are not just the corners, but for simplicity, keep this name
00008 //
00009 const int QuadraticHex::corner[27][3] = { { -1, -1, -1 }, { 1, -1, -1 }, { 1, 1, -1 }, // corner nodes: 0-7
00010 { -1, 1, -1 }, // mid-edge nodes: 8-19
00011 { -1, -1, 1 }, // center-face nodes 20-25 center node 26
00012 { 1, -1, 1 }, //
00013 { 1, 1, 1 }, { -1, 1, 1 }, // 4 ----- 19 ----- 7
00014 { 0, -1, -1 }, // . | . |
00015 { 1, 0, -1 }, // 16 25 18 |
00016 { 0, 1, -1 }, // . | . |
00017 { -1, 0, -1 }, // 5 ----- 17 ----- 6 |
00018 { -1, -1, 0 }, // | 12 | 23 15
00019 { 1, -1, 0 }, // | | |
00020 { 1, 1, 0 }, // | 20 | 26 | 22 |
00021 { -1, 1, 0 }, // | | |
00022 { 0, -1, 1 }, // 13 21 | 14 |
00023 { 1, 0, 1 }, // | 0 ----- 11 ----- 3
00024 { 0, 1, 1 }, // | . | .
00025 { -1, 0, 1 }, // | 8 24 | 10
00026 { 0, -1, 0 }, // | . | .
00027 { 1, 0, 0 }, // 1 ----- 9 ----- 2
00028 { 0, 1, 0 }, //
00029 { -1, 0, 0 }, { 0, 0, -1 }, { 0, 0, 1 }, { 0, 0, 0 } };
00030
00031 double QuadraticHex::SH( const int i, const double params )
00032 {
00033 switch( i )
00034 {
00035 case -1:
00036 return ( params * params - params ) / 2;
00037 case 0:
00038 return 1 - params * params;
00039 case 1:
00040 return ( params * params + params ) / 2;
00041 default:
00042 return 0.;
00043 }
00044 }
00045 double QuadraticHex::DSH( const int i, const double params )
00046 {
00047 switch( i )
00048 {
00049 case -1:
00050 return params - 0.5;
00051 case 0:
00052 return -2 * params;
00053 case 1:
00054 return params + 0.5;
00055 default:
00056 return 0.;
00057 }
00058 }
00059
00060 ErrorCode QuadraticHex::evalFcn( const double* params,
00061 const double* field,
00062 const int /*ndim*/,
00063 const int num_tuples,
00064 double* /*work*/,
00065 double* result )
00066 {
00067 assert( params && field && num_tuples > 0 );
00068 std::fill( result, result + num_tuples, 0.0 );
00069 for( int i = 0; i < 27; i++ )
00070 {
00071 const double sh = SH( corner[i][0], params[0] ) * SH( corner[i][1], params[1] ) * SH( corner[i][2], params[2] );
00072 for( int j = 0; j < num_tuples; j++ )
00073 result[j] += sh * field[num_tuples * i + j];
00074 }
00075
00076 return MB_SUCCESS;
00077 }
00078
00079 ErrorCode QuadraticHex::jacobianFcn( const double* params,
00080 const double* verts,
00081 const int nverts,
00082 const int ndim,
00083 double* /*work*/,
00084 double* result )
00085 {
00086 assert( 27 == nverts && params && verts );
00087 if( 27 != nverts ) return MB_FAILURE;
00088 Matrix3* J = reinterpret_cast< Matrix3* >( result );
00089 for( int i = 0; i < 27; i++ )
00090 {
00091 const double sh[3] = { SH( corner[i][0], params[0] ), SH( corner[i][1], params[1] ),
00092 SH( corner[i][2], params[2] ) };
00093 const double dsh[3] = { DSH( corner[i][0], params[0] ), DSH( corner[i][1], params[1] ),
00094 DSH( corner[i][2], params[2] ) };
00095
00096 for( int j = 0; j < 3; j++ )
00097 {
00098 ( *J )( j, 0 ) += dsh[0] * sh[1] * sh[2] * verts[ndim * i + j]; // dxj/dr first column
00099 ( *J )( j, 1 ) += sh[0] * dsh[1] * sh[2] * verts[ndim * i + j]; // dxj/ds
00100 ( *J )( j, 2 ) += sh[0] * sh[1] * dsh[2] * verts[ndim * i + j]; // dxj/dt
00101 }
00102 }
00103
00104 return MB_SUCCESS;
00105 }
00106
00107 ErrorCode QuadraticHex::integrateFcn( const double* /*field*/,
00108 const double* /*verts*/,
00109 const int /*nverts*/,
00110 const int /*ndim*/,
00111 const int /*num_tuples*/,
00112 double* /*work*/,
00113 double* /*result*/ )
00114 {
00115 return MB_NOT_IMPLEMENTED;
00116 }
00117
00118 ErrorCode QuadraticHex::reverseEvalFcn( EvalFcn eval,
00119 JacobianFcn jacob,
00120 InsideFcn ins,
00121 const double* posn,
00122 const double* verts,
00123 const int nverts,
00124 const int ndim,
00125 const double iter_tol,
00126 const double inside_tol,
00127 double* work,
00128 double* params,
00129 int* is_inside )
00130 {
00131 assert( posn && verts );
00132 return EvalSet::evaluate_reverse( eval, jacob, ins, posn, verts, nverts, ndim, iter_tol, inside_tol, work, params,
00133 is_inside );
00134 }
00135
00136 int QuadraticHex::insideFcn( const double* params, const int ndim, const double tol )
00137 {
00138 return EvalSet::inside_function( params, ndim, tol );
00139 }
00140
00141 ErrorCode QuadraticHex::normalFcn( const int /*ientDim*/,
00142 const int /*facet*/,
00143 const int /*nverts*/,
00144 const double* /*verts*/,
00145 double* /*normal[3]*/ )
00146 {
00147 return MB_NOT_IMPLEMENTED;
00148 }
00149 } // namespace moab