Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <ElemUtil.hpp>
Public Member Functions | |
SpectralHex (const std::vector< CartVect > &vertices) | |
SpectralHex (int order, double *x, double *y, double *z) | |
SpectralHex (int order) | |
SpectralHex () | |
virtual | ~SpectralHex () |
void | set_gl_points (double *x, double *y, double *z) |
virtual CartVect | evaluate (const CartVect &xi) const |
Evaluate the map on \(x_i\) (calculate \(\vec x = F($\vec \xi)\) ) | |
virtual CartVect | ievaluate (const CartVect &x, double tol=1e-6, const CartVect &x0=CartVect(0.0)) const |
Evaluate the inverse map (calculate \(\vec \xi = F^-1($\vec x)\) to given tolerance) | |
virtual Matrix3 | jacobian (const CartVect &xi) const |
Evaluate the map's Jacobi matrix. | |
double | evaluate_scalar_field (const CartVect &xi, const double *field_vertex_values) const |
Evaluate a scalar field at a point given field values at the vertices. | |
double | integrate_scalar_field (const double *field_vertex_values) const |
Integrate a scalar field over the element given field values at the vertices. | |
bool | inside_nat_space (const CartVect &xi, double &tol) const |
decide if within the natural param space, with a tolerance | |
void | Init (int order) |
void | freedata () |
Protected Attributes | |
realType * | _xyz [3] |
Static Protected Attributes | |
static int | _n |
static realType * | _z [3] |
static lagrange_data | _ld [3] |
static opt_data_3 | _data |
static realType * | _odwork |
static bool | _init = false |
Definition at line 243 of file ElemUtil.hpp.
moab::Element::SpectralHex::SpectralHex | ( | const std::vector< CartVect > & | vertices | ) | [inline] |
moab::Element::SpectralHex::SpectralHex | ( | int | order, |
double * | x, | ||
double * | y, | ||
double * | z | ||
) |
moab::Element::SpectralHex::SpectralHex | ( | int | order | ) |
moab::Element::SpectralHex::~SpectralHex | ( | ) | [virtual] |
Definition at line 967 of file ElemUtil.cpp.
References _init, and freedata().
CartVect moab::Element::SpectralHex::evaluate | ( | const CartVect & | xi | ) | const [virtual] |
Evaluate the map on \(x_i\) (calculate \(\vec x = F($\vec \xi)\) )
Implements moab::Element::Map.
Definition at line 58 of file SpectralHex.cpp.
References moab::SpectralHex::_ld, moab::SpectralHex::_odwork, lagrange_0(), and tensor_i3().
Referenced by test_spectral_hex().
{ // piece that we shouldn't want to cache int d = 0; for( d = 0; d < 3; d++ ) { lagrange_0( &_ld[d], params[d] ); } CartVect result; for( d = 0; d < 3; d++ ) { result[d] = tensor_i3( _ld[0].J, _ld[0].n, _ld[1].J, _ld[1].n, _ld[2].J, _ld[2].n, _xyz[d], // this is the "field" _odwork ); } return result; }
double moab::Element::SpectralHex::evaluate_scalar_field | ( | const CartVect & | xi, |
const double * | field_vertex_values | ||
) | const [virtual] |
Evaluate a scalar field at a point given field values at the vertices.
Implements moab::Element::Map.
Definition at line 1073 of file ElemUtil.cpp.
References _ld, _odwork, lagrange_0(), and tensor_i3().
Referenced by moab::Coupler::interp_field(), and test_spectral_hex().
void moab::Element::SpectralHex::freedata | ( | ) |
Definition at line 41 of file SpectralHex.cpp.
References moab::SpectralHex::_data, moab::SpectralHex::_ld, moab::SpectralHex::_odwork, moab::SpectralHex::_z, lagrange_free(), and opt_free_3().
Referenced by Init(), and ~SpectralHex().
{ for( int d = 0; d < 3; d++ ) { free( _z[d] ); lagrange_free( &_ld[d] ); } opt_free_3( &_data ); free( _odwork ); }
CartVect moab::Element::SpectralHex::ievaluate | ( | const CartVect & | x, |
double | tol = 1e-6 , |
||
const CartVect & | x0 = CartVect( 0.0 ) |
||
) | const [virtual] |
Evaluate the inverse map (calculate \(\vec \xi = F^-1($\vec x)\) to given tolerance)
Reimplemented from moab::Element::Map.
Definition at line 1030 of file ElemUtil.cpp.
References _data, _xyz, moab::CartVect::get(), opt_findpt_3(), and opt_no_constraints_3.
Referenced by moab::Coupler::nat_param(), and test_spectral_hex().
{ // find nearest point realType x_star[3]; xyz.get( x_star ); realType r[3] = { 0, 0, 0 }; // initial guess for parametric coords x0.get( r ); unsigned c = opt_no_constraints_3; realType dist = opt_findpt_3( &_data, (const realType**)_xyz, x_star, r, &c ); // if it did not converge, get out with throw... if( dist > 10 * tol ) // outside the element { std::vector< CartVect > dummy; throw Map::EvaluationError( xyz, dummy ); } // c tells us if we landed inside the element or exactly on a face, edge, or node // also, dist shows the distance to the computed point. // copy parametric coords back return CartVect( r ); }
void moab::Element::SpectralHex::Init | ( | int | order | ) |
Definition at line 972 of file ElemUtil.cpp.
References _data, _init, _ld, _n, _odwork, _z, freedata(), lagrange_setup(), lobatto_nodes(), opt_alloc_3(), and tmalloc.
Referenced by SpectralHex().
{ if( _init && _n == order ) return; if( _init && _n != order ) { // TODO: free data cached freedata(); } // compute stuff that depends only on order _init = true; _n = order; // triplicates! n is the same in all directions !!! for( int d = 0; d < 3; d++ ) { _z[d] = tmalloc( realType, _n ); lobatto_nodes( _z[d], _n ); lagrange_setup( &_ld[d], _z[d], _n ); } opt_alloc_3( &_data, _ld ); unsigned int nf = _n * _n, ne = _n, nw = 2 * _n * _n + 3 * _n; _odwork = tmalloc( realType, 6 * nf + 9 * ne + nw ); }
bool moab::Element::SpectralHex::inside_nat_space | ( | const CartVect & | xi, |
double & | tol | ||
) | const [virtual] |
decide if within the natural param space, with a tolerance
Implements moab::Element::Map.
Definition at line 1134 of file ElemUtil.cpp.
Referenced by moab::Coupler::nat_param().
{ // just look at the box+tol here return ( xi[0] >= -1. - tol ) && ( xi[0] <= 1. + tol ) && ( xi[1] >= -1. - tol ) && ( xi[1] <= 1. + tol ) && ( xi[2] >= -1. - tol ) && ( xi[2] <= 1. + tol ); }
double moab::Element::SpectralHex::integrate_scalar_field | ( | const double * | field_vertex_values | ) | const [virtual] |
Integrate a scalar field over the element given field values at the vertices.
Implements moab::Element::Map.
Definition at line 1085 of file ElemUtil.cpp.
References _data, _ld, _n, _xyz, moab::Matrix3::determinant(), opt_data_3::elx, lagrange_data::J, opt_data_3::jac, opt_vol_set_intp_3(), and lagrange_data::z.
Referenced by test_spectral_hex().
{ // set the position of GL points // set the positions of GL nodes, before evaluations _data.elx[0] = _xyz[0]; _data.elx[1] = _xyz[1]; _data.elx[2] = _xyz[2]; double xi[3]; // triple loop; the most inner loop is in r direction, then s, then t double integral = 0.; // double volume = 0; int index = 0; // used fr the inner loop for( int k = 0; k < _n; k++ ) { xi[2] = _ld[2].z[k]; // double wk= _ld[2].w[k]; for( int j = 0; j < _n; j++ ) { xi[1] = _ld[1].z[j]; // double wj= _ld[1].w[j]; for( int i = 0; i < _n; i++ ) { xi[0] = _ld[0].z[i]; // double wi= _ld[0].w[i]; opt_vol_set_intp_3( &_data, xi ); double wk = _ld[2].J[k]; double wj = _ld[1].J[j]; double wi = _ld[0].J[i]; Matrix3 J( 0. ); // it is organized differently J( 0, 0 ) = _data.jac[0]; // dx/dr J( 0, 1 ) = _data.jac[1]; // dx/ds J( 0, 2 ) = _data.jac[2]; // dx/dt J( 1, 0 ) = _data.jac[3]; // dy/dr J( 1, 1 ) = _data.jac[4]; // dy/ds J( 1, 2 ) = _data.jac[5]; // dy/dt J( 2, 0 ) = _data.jac[6]; // dz/dr J( 2, 1 ) = _data.jac[7]; // dz/ds J( 2, 2 ) = _data.jac[8]; // dz/dt double bm = wk * wj * wi * J.determinant(); integral += bm * field_vertex_values[index++]; // volume +=bm; } } } // std::cout << "volume: " << volume << "\n"; return integral; }
Matrix3 moab::Element::SpectralHex::jacobian | ( | const CartVect & | xi | ) | const [virtual] |
Evaluate the map's Jacobi matrix.
Implements moab::Element::Map.
Definition at line 100 of file SpectralHex.cpp.
References moab::SpectralHex::_data, opt_data_3::elx, moab::CartVect::get(), opt_data_3::jac, and opt_vol_set_intp_3().
Referenced by test_spectral_hex().
{ real x_i[3]; params.get( x_i ); // set the positions of GL nodes, before evaluations _data.elx[0] = _xyz[0]; _data.elx[1] = _xyz[1]; _data.elx[2] = _xyz[2]; opt_vol_set_intp_3( &_data, x_i ); Matrix3 J( 0. ); // it is organized differently J( 0, 0 ) = _data.jac[0]; // dx/dr J( 0, 1 ) = _data.jac[1]; // dx/ds J( 0, 2 ) = _data.jac[2]; // dx/dt J( 1, 0 ) = _data.jac[3]; // dy/dr J( 1, 1 ) = _data.jac[4]; // dy/ds J( 1, 2 ) = _data.jac[5]; // dy/dt J( 2, 0 ) = _data.jac[6]; // dz/dr J( 2, 1 ) = _data.jac[7]; // dz/ds J( 2, 2 ) = _data.jac[8]; // dz/dt return J; }
void moab::Element::SpectralHex::set_gl_points | ( | double * | x, |
double * | y, | ||
double * | z | ||
) |
Definition at line 52 of file SpectralHex.cpp.
Referenced by moab::Coupler::nat_param(), and test_spectral_hex().
opt_data_3 moab::Element::SpectralHex::_data [static, protected] |
Definition at line 272 of file ElemUtil.hpp.
Referenced by ievaluate(), Init(), and integrate_scalar_field().
bool moab::Element::SpectralHex::_init = false [static, protected] |
Definition at line 276 of file ElemUtil.hpp.
Referenced by Init(), and ~SpectralHex().
lagrange_data moab::Element::SpectralHex::_ld [static, protected] |
Definition at line 271 of file ElemUtil.hpp.
Referenced by evaluate_scalar_field(), Init(), and integrate_scalar_field().
int moab::Element::SpectralHex::_n [static, protected] |
Definition at line 269 of file ElemUtil.hpp.
Referenced by Init(), and integrate_scalar_field().
realType * moab::Element::SpectralHex::_odwork [static, protected] |
Definition at line 273 of file ElemUtil.hpp.
Referenced by evaluate_scalar_field(), and Init().
realType* moab::Element::SpectralHex::_xyz[3] [protected] |
Definition at line 278 of file ElemUtil.hpp.
Referenced by ievaluate(), integrate_scalar_field(), and SpectralHex().
realType * moab::Element::SpectralHex::_z [static, protected] |
Definition at line 270 of file ElemUtil.hpp.
Referenced by Init().