Mesh Oriented datABase  (version 5.5.1)
An array-based unstructured mesh library
moab::element_utility::Quadratic_hex_map< _Matrix > Class Template Reference

#include <quadratic_hex_map.hpp>

+ Inheritance diagram for moab::element_utility::Quadratic_hex_map< _Matrix >:

Public Types

typedef _Matrix Matrix
 

Public Member Functions

 Quadratic_hex_map ()
 
 Quadratic_hex_map (const Self &f)
 
template<typename Moab , typename Entity_handle , typename Points , typename Point >
std::pair< bool, Point > operator() (const Moab &, const Entity_handle &, const Points &v, const Point &p, const double tol=1.e-6) const
 

Private Types

typedef Quadratic_hex_map< MatrixSelf
 

Private Member Functions

double reference_points (const std::size_t &i, const std::size_t &j) const
 
template<typename Point >
bool is_contained (const Point &p, const double tol) const
 
template<typename Point , typename Points >
bool solve_inverse (const Point &x, Point &xi, const Points &points, const double tol=1.e-6) const
 
template<typename Point , typename Points >
Point & evaluate (const Point &p, const Points &points, Point &f) const
 
template<typename Point , typename Field >
double evaluate_scalar_field (const Point &p, const Field &field) const
 
template<typename Field , typename Points >
double integrate_scalar_field (const Points &p, const Field &field_values) const
 
template<typename Point , typename Points >
Matrixjacobian (const Point &p, const Points &, Matrix &J) const
 

Detailed Description

template<typename _Matrix>
class moab::element_utility::Quadratic_hex_map< _Matrix >

Definition at line 51 of file quadratic_hex_map.hpp.

Member Typedef Documentation

◆ Matrix

template<typename _Matrix >
typedef _Matrix moab::element_utility::Quadratic_hex_map< _Matrix >::Matrix

Definition at line 54 of file quadratic_hex_map.hpp.

◆ Self

template<typename _Matrix >
typedef Quadratic_hex_map< Matrix > moab::element_utility::Quadratic_hex_map< _Matrix >::Self
private

Definition at line 57 of file quadratic_hex_map.hpp.

Constructor & Destructor Documentation

◆ Quadratic_hex_map() [1/2]

template<typename _Matrix >
moab::element_utility::Quadratic_hex_map< _Matrix >::Quadratic_hex_map ( )
inline

Definition at line 61 of file quadratic_hex_map.hpp.

61 {}

◆ Quadratic_hex_map() [2/2]

template<typename _Matrix >
moab::element_utility::Quadratic_hex_map< _Matrix >::Quadratic_hex_map ( const Self f)
inline

Definition at line 63 of file quadratic_hex_map.hpp.

63 {}

Member Function Documentation

◆ evaluate()

template<typename _Matrix >
template<typename Point , typename Points >
Point& moab::element_utility::Quadratic_hex_map< _Matrix >::evaluate ( const Point &  p,
const Points points,
Point &  f 
) const
inlineprivate

Definition at line 169 of file quadratic_hex_map.hpp.

170  {
171  typedef typename Points::value_type Vector;
172  Vector result;
173  for( int i = 0; i < 3; ++i )
174  {
175  result[i] = 0;
176  }
177  for( unsigned i = 0; i < 27; ++i )
178  {
179  const double sh = SH( reference_points( i, 0 ), p[0] ) * SH( reference_points( i, 1 ), p[1] ) *
180  SH( reference_points( i, 2 ), p[2] );
181  result += sh * points[i];
182  }
183  for( int i = 0; i < 3; ++i )
184  {
185  f[i] = result[i];
186  }
187  return f;
188  }

References moab::element_utility::Quadratic_hex_map< _Matrix >::reference_points(), and moab::Element::SH().

Referenced by moab::element_utility::Quadratic_hex_map< _Matrix >::solve_inverse().

◆ evaluate_scalar_field()

template<typename _Matrix >
template<typename Point , typename Field >
double moab::element_utility::Quadratic_hex_map< _Matrix >::evaluate_scalar_field ( const Point &  p,
const Field &  field 
) const
inlineprivate

Definition at line 190 of file quadratic_hex_map.hpp.

191  {
192  double x = 0.0;
193  for( int i = 0; i < 27; i++ )
194  {
195  const double sh = SH( reference_points( i, 0 ), p[0] ) * SH( reference_points( i, 1 ), p[1] ) *
196  SH( reference_points( i, 2 ), p[2] );
197  x += sh * field[i];
198  }
199  return x;
200  }

References moab::element_utility::Quadratic_hex_map< _Matrix >::reference_points(), and moab::Element::SH().

◆ integrate_scalar_field()

template<typename _Matrix >
template<typename Field , typename Points >
double moab::element_utility::Quadratic_hex_map< _Matrix >::integrate_scalar_field ( const Points p,
const Field &  field_values 
) const
inlineprivate

Definition at line 202 of file quadratic_hex_map.hpp.

203  {
204  // TODO: gaussian integration , probably 2x2x2
205  return 0.;
206  }

◆ is_contained()

template<typename _Matrix >
template<typename Point >
bool moab::element_utility::Quadratic_hex_map< _Matrix >::is_contained ( const Point &  p,
const double  tol 
) const
inlineprivate

Definition at line 110 of file quadratic_hex_map.hpp.

111  {
112  // just look at the box+tol here
113  return ( p[0] >= -1. - tol ) && ( p[0] <= 1. + tol ) && ( p[1] >= -1. - tol ) && ( p[1] <= 1. + tol ) &&
114  ( p[2] >= -1. - tol ) && ( p[2] <= 1. + tol );
115  }

Referenced by moab::element_utility::Quadratic_hex_map< _Matrix >::operator()().

◆ jacobian()

template<typename _Matrix >
template<typename Point , typename Points >
Matrix& moab::element_utility::Quadratic_hex_map< _Matrix >::jacobian ( const Point &  p,
const Points ,
Matrix J 
) const
inlineprivate

Definition at line 209 of file quadratic_hex_map.hpp.

210  {
211  J = Matrix( 0.0 );
212  for( int i = 0; i < 27; i++ )
213  {
214  const double sh[3] = { SH( reference_points( i, 0 ), p[0] ), SH( reference_points( i, 1 ), p[1] ),
215  SH( reference_points( i, 2 ), p[2] ) };
216  const double dsh[3] = { DSH( reference_points( i, 0 ), p[0] ), DSH( reference_points( i, 1 ), p[1] ),
217  DSH( reference_points( i, 2 ), p[2] ) };
218  for( int j = 0; j < 3; j++ )
219  {
220  // dxj/dr first column
221  J( j, 0 ) += dsh[0] * sh[1] * sh[2] * reference_points( i, j );
222  J( j, 1 ) += sh[0] * dsh[1] * sh[2] * reference_points( i, j ); // dxj/ds
223  J( j, 2 ) += sh[0] * sh[1] * dsh[2] * reference_points( i, j ); // dxj/dt
224  }
225  }
226  return J;
227  }

References moab::Element::DSH(), moab::element_utility::Quadratic_hex_map< _Matrix >::reference_points(), and moab::Element::SH().

Referenced by moab::element_utility::Quadratic_hex_map< _Matrix >::solve_inverse().

◆ operator()()

template<typename _Matrix >
template<typename Moab , typename Entity_handle , typename Points , typename Point >
std::pair< bool, Point > moab::element_utility::Quadratic_hex_map< _Matrix >::operator() ( const Moab &  ,
const Entity_handle &  ,
const Points v,
const Point &  p,
const double  tol = 1.e-6 
) const
inline

Definition at line 68 of file quadratic_hex_map.hpp.

73  {
74  Point result( 3, 0.0 );
75  bool point_found = solve_inverse( p, result, v, tol ) && is_contained( result, tol );
76  return std::make_pair( point_found, result );
77  }

References moab::element_utility::Quadratic_hex_map< _Matrix >::is_contained(), and moab::element_utility::Quadratic_hex_map< _Matrix >::solve_inverse().

◆ reference_points()

template<typename _Matrix >
double moab::element_utility::Quadratic_hex_map< _Matrix >::reference_points ( const std::size_t &  i,
const std::size_t &  j 
) const
inlineprivate

Definition at line 83 of file quadratic_hex_map.hpp.

84  {
85  const double rpts[27][3] = { { -1, -1, -1 }, { 1, -1, -1 }, { 1, 1, -1 }, // reference_points nodes: 0-7
86  { -1, 1, -1 }, // mid-edge nodes: 8-19
87  { -1, -1, 1 }, // center-face nodes 20-25 center node 26
88  { 1, -1, 1 }, //
89  { 1, 1, 1 }, { -1, 1, 1 }, // 4 ----- 19 ----- 7
90  { 0, -1, -1 }, // . | . |
91  { 1, 0, -1 }, // 16 25 18 |
92  { 0, 1, -1 }, // . | . |
93  { -1, 0, -1 }, // 5 ----- 17 ----- 6 |
94  { -1, -1, 0 }, // | 12 | 23 15
95  { 1, -1, 0 }, // | | |
96  { 1, 1, 0 }, // | 20 | 26 | 22 |
97  { -1, 1, 0 }, // | | |
98  { 0, -1, 1 }, // 13 21 | 14 |
99  { 1, 0, 1 }, // | 0 ----- 11 ----- 3
100  { 0, 1, 1 }, // | . | .
101  { -1, 0, 1 }, // | 8 24 | 10
102  { 0, -1, 0 }, // | . | .
103  { 1, 0, 0 }, // 1 ----- 9 ----- 2
104  { 0, 1, 0 }, //
105  { -1, 0, 0 }, { 0, 0, -1 }, { 0, 0, 1 }, { 0, 0, 0 } };
106  return rpts[i][j];
107  }

Referenced by moab::element_utility::Quadratic_hex_map< _Matrix >::evaluate(), moab::element_utility::Quadratic_hex_map< _Matrix >::evaluate_scalar_field(), and moab::element_utility::Quadratic_hex_map< _Matrix >::jacobian().

◆ solve_inverse()

template<typename _Matrix >
template<typename Point , typename Points >
bool moab::element_utility::Quadratic_hex_map< _Matrix >::solve_inverse ( const Point &  x,
Point &  xi,
const Points points,
const double  tol = 1.e-6 
) const
inlineprivate

Definition at line 118 of file quadratic_hex_map.hpp.

119  {
120  const double error_tol_sqr = tol * tol;
121  Point delta( 3, 0.0 );
122  xi = delta;
123  evaluate( xi, points, delta );
124  vec_subtract( delta, x );
125  std::size_t num_iterations = 0;
126 #ifdef QUADRATIC_HEX_DEBUG
127  std::stringstream ss;
128  ss << "Point: ";
129  ss << x[0] << ", " << x[1] << ", " << x[2] << std::endl;
130  ss << "Hex: ";
131  for( int i = 0; i < 8; ++i )
132  {
133  ss << points[i][0] << ", " << points[i][1] << ", " << points[i][2] << std::endl;
134  }
135  ss << std::endl;
136 #endif
137  while( normsq( delta ) > error_tol_sqr )
138  {
139 #ifdef QUADRATIC_HEX_DEBUG
140  ss << "Iter #: " << num_iterations << " Err: " << sqrt( normsq( delta ) ) << " Iterate: ";
141  ss << xi[0] << ", " << xi[1] << ", " << xi[2] << std::endl;
142 #endif
143  if( ++num_iterations >= 5 )
144  {
145  return false;
146  }
147  Matrix J;
148  jacobian( xi, points, J );
149  double det = moab::Matrix::determinant3( J );
150  if( fabs( det ) < 1.e-10 )
151  {
152 #ifdef QUADRATIC_HEX_DEBUG
153  std::cerr << ss.str();
154 #endif
155 #ifndef QUADRATIC_HEX_DEBUG
156  std::cerr << x[0] << ", " << x[1] << ", " << x[2] << std::endl;
157 #endif
158  std::cerr << "inverse solve failure: det: " << det << std::endl;
159  exit( -1 );
160  }
161  vec_subtract( xi, moab::Matrix::inverse( J, 1.0 / det ) * delta );
162  evaluate( xi, points, delta );
163  vec_subtract( delta, x );
164  }
165  return true;
166  }

References moab::element_utility::Quadratic_hex_map< _Matrix >::evaluate(), moab::Matrix::inverse(), and moab::element_utility::Quadratic_hex_map< _Matrix >::jacobian().

Referenced by moab::element_utility::Quadratic_hex_map< _Matrix >::operator()().


The documentation for this class was generated from the following file: