![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
#include <ElemEvaluator.hpp>
Public Member Functions | |
EvalSet () | |
Bare constructor. | |
EvalSet (EvalFcn eval, ReverseEvalFcn rev, NormalFcn normal, JacobianFcn jacob, IntegrateFcn integ, InitFcn initf, InsideFcn insidef) | |
Constructor. | |
EvalSet (EvalSet const &eval) | |
Copy constructor. | |
EvalSet & | operator= (const EvalSet &eval) |
Operator=. | |
Static Public Member Functions | |
static ErrorCode | get_eval_set (Interface *mb, EntityHandle eh, EvalSet &eval_set) |
Given an entity handle, get an appropriate eval set, based on type & #vertices. | |
static ErrorCode | get_eval_set (EntityType tp, unsigned int num_vertices, EvalSet &eval_set) |
Given type & #vertices, get an appropriate eval set. | |
static ErrorCode | evaluate_reverse (EvalFcn eval, JacobianFcn jacob, InsideFcn inside_f, const double *posn, const double *verts, const int nverts, const int ndim, const double iter_tol, const double inside_tol, double *work, double *params, int *inside) |
Common function to do reverse evaluation based on evaluation and jacobian functions. | |
static int | inside_function (const double *params, const int ndims, const double tol) |
Common function that returns true if params is in [-1,1]^ndims. | |
Public Attributes | |
EvalFcn | evalFcn |
Forward-evaluation of field at parametric coordinates. | |
ReverseEvalFcn | reverseEvalFcn |
Reverse-evaluation of parametric coordinates at physical space position. | |
NormalFcn | normalFcn |
Evaluate the normal at a local facet (edge/face for 2D/3D) | |
JacobianFcn | jacobianFcn |
Evaluate the jacobian at a specified parametric position. | |
IntegrateFcn | integrateFcn |
Forward-evaluation of field at parametric coordinates. | |
InitFcn | initFcn |
Initialization function for an element. | |
InsideFcn | insideFcn |
Function that returns whether or not the parameters are inside the natural space of the element. |
Definition at line 56 of file ElemEvaluator.hpp.
moab::EvalSet::EvalSet | ( | ) | [inline] |
Bare constructor.
Definition at line 82 of file ElemEvaluator.hpp.
: evalFcn( NULL ), reverseEvalFcn( NULL ), normalFcn( NULL ), jacobianFcn( NULL ), integrateFcn( NULL ),
initFcn( NULL ), insideFcn( NULL )
{
}
moab::EvalSet::EvalSet | ( | EvalFcn | eval, |
ReverseEvalFcn | rev, | ||
NormalFcn | normal, | ||
JacobianFcn | jacob, | ||
IntegrateFcn | integ, | ||
InitFcn | initf, | ||
InsideFcn | insidef | ||
) | [inline] |
Constructor.
Definition at line 89 of file ElemEvaluator.hpp.
: evalFcn( eval ), reverseEvalFcn( rev ), normalFcn( normal ), jacobianFcn( jacob ), integrateFcn( integ ),
initFcn( initf ), insideFcn( insidef )
{
}
moab::EvalSet::EvalSet | ( | EvalSet const & | eval | ) | [inline] |
Copy constructor.
Definition at line 102 of file ElemEvaluator.hpp.
: evalFcn( eval.evalFcn ), reverseEvalFcn( eval.reverseEvalFcn ), normalFcn( eval.normalFcn ),
jacobianFcn( eval.jacobianFcn ), integrateFcn( eval.integrateFcn ), initFcn( eval.initFcn ),
insideFcn( eval.insideFcn )
{
}
ErrorCode moab::EvalSet::evaluate_reverse | ( | EvalFcn | eval, |
JacobianFcn | jacob, | ||
InsideFcn | inside_f, | ||
const double * | posn, | ||
const double * | verts, | ||
const int | nverts, | ||
const int | ndim, | ||
const double | iter_tol, | ||
const double | inside_tol, | ||
double * | work, | ||
double * | params, | ||
int * | inside | ||
) | [static] |
Common function to do reverse evaluation based on evaluation and jacobian functions.
Definition at line 19 of file ElemEvaluator.cpp.
References moab::CartVect::array(), moab::Matrix3::array(), moab::Matrix3::determinant(), moab::dum, ErrorCode, moab::Matrix3::inverse(), MB_INDEX_OUT_OF_RANGE, and MB_SUCCESS.
Referenced by moab::QuadraticHex::reverseEvalFcn(), moab::LinearHex::reverseEvalFcn(), and moab::LinearQuad::reverseEvalFcn().
{
// TODO: should differentiate between epsilons used for
// Newton Raphson iteration, and epsilons used for curved boundary geometry errors
// right now, fix the tolerance used for NR
const double error_tol_sqr = iter_tol * iter_tol;
CartVect* cvparams = reinterpret_cast< CartVect* >( params );
const CartVect* cvposn = reinterpret_cast< const CartVect* >( posn );
// initialize to center of element
*cvparams = CartVect( -.4 );
CartVect new_pos;
// evaluate that first guess to get a new position
ErrorCode rval = ( *eval )( cvparams->array(), verts, ndim,
3, // hardwire to num_tuples to 3 since the field is coords
work, new_pos.array() );
if( MB_SUCCESS != rval ) return rval;
// residual is diff between old and new pos; need to minimize that
CartVect res = new_pos - *cvposn;
Matrix3 J;
int dum, *tmp_inside = ( inside ? inside : &dum );
int iters = 0;
// while |res| larger than tol
while( res % res > error_tol_sqr )
{
if( ++iters > 10 )
{
// if we haven't converged but we're outside, that's defined as success
*tmp_inside = ( *inside_f )( params, ndim, inside_tol );
if( !( *tmp_inside ) )
return MB_SUCCESS;
else
return MB_FAILURE;
}
// get jacobian at current params
rval = ( *jacob )( cvparams->array(), verts, nverts, ndim, work, J.array() );
double det = J.determinant();
if( det < std::numeric_limits< double >::epsilon() )
{
*tmp_inside = ( *inside_f )( params, ndim, inside_tol );
if( !( *tmp_inside ) )
return MB_SUCCESS;
else
return MB_INDEX_OUT_OF_RANGE;
}
// new params tries to eliminate residual
*cvparams -= J.inverse() * res;
// get the new forward-evaluated position, and its difference from the target pt
rval = ( *eval )( params, verts, ndim,
3, // hardwire to num_tuples to 3 since the field is coords
work, new_pos.array() );
if( MB_SUCCESS != rval ) return rval;
res = new_pos - *cvposn;
}
if( inside ) *inside = ( *inside_f )( params, ndim, inside_tol );
return MB_SUCCESS;
} // Map::evaluate_reverse()
ErrorCode moab::EvalSet::get_eval_set | ( | Interface * | mb, |
EntityHandle | eh, | ||
EvalSet & | eval_set | ||
) | [inline, static] |
Given an entity handle, get an appropriate eval set, based on type & #vertices.
Definition at line 147 of file ElemEvaluator.hpp.
References ErrorCode, moab::Interface::get_connectivity(), MB_SUCCESS, and moab::Interface::type_from_handle().
{
int nv;
EntityType tp = mb->type_from_handle( eh );
const EntityHandle* connect;
std::vector< EntityHandle > dum_vec;
ErrorCode rval = mb->get_connectivity( eh, connect, nv, false, &dum_vec );
if( MB_SUCCESS != rval ) return rval;
return get_eval_set( tp, nv, eval_set );
}
ErrorCode moab::EvalSet::get_eval_set | ( | EntityType | tp, |
unsigned int | num_vertices, | ||
EvalSet & | eval_set | ||
) | [static] |
Given type & #vertices, get an appropriate eval set.
Definition at line 107 of file ElemEvaluator.cpp.
References moab::QuadraticHex::compatible(), moab::LinearQuad::compatible(), moab::LinearHex::compatible(), moab::LinearTet::compatible(), moab::LinearTri::compatible(), MB_NOT_IMPLEMENTED, MB_SUCCESS, MBEDGE, MBHEX, MBQUAD, MBTET, and MBTRI.
{
switch( tp )
{
case MBEDGE:
break;
case MBTRI:
if( LinearTri::compatible( tp, num_vertices, eval_set ) ) return MB_SUCCESS;
break;
case MBQUAD:
if( LinearQuad::compatible( tp, num_vertices, eval_set ) ) return MB_SUCCESS;
// if (SpectralQuad::compatible(tp, num_vertices, eval_set)) return
// MB_SUCCESS;
break;
case MBTET:
if( LinearTet::compatible( tp, num_vertices, eval_set ) ) return MB_SUCCESS;
break;
case MBHEX:
if( LinearHex::compatible( tp, num_vertices, eval_set ) ) return MB_SUCCESS;
if( QuadraticHex::compatible( tp, num_vertices, eval_set ) ) return MB_SUCCESS;
// if (SpectralHex::compatible(tp, num_vertices, eval_set)) return
// MB_SUCCESS;
break;
default:
break;
}
return MB_NOT_IMPLEMENTED;
}
int moab::EvalSet::inside_function | ( | const double * | params, |
const int | ndims, | ||
const double | tol | ||
) | [static] |
Common function that returns true if params is in [-1,1]^ndims.
Definition at line 96 of file ElemEvaluator.cpp.
Referenced by moab::QuadraticHex::insideFcn(), moab::LinearHex::insideFcn(), and moab::LinearQuad::insideFcn().
{
if( params[0] >= -1 - tol && params[0] <= 1 + tol &&
( ndims < 2 || ( params[1] >= -1 - tol && params[1] <= 1 + tol ) ) &&
( ndims < 3 || ( params[2] >= -1 - tol && params[2] <= 1 + tol ) ) )
return true;
else
return false;
}
Operator=.
Definition at line 116 of file ElemEvaluator.hpp.
References evalFcn, initFcn, insideFcn, integrateFcn, jacobianFcn, normalFcn, and reverseEvalFcn.
{
evalFcn = eval.evalFcn;
reverseEvalFcn = eval.reverseEvalFcn;
normalFcn = eval.normalFcn;
jacobianFcn = eval.jacobianFcn;
integrateFcn = eval.integrateFcn;
initFcn = eval.initFcn;
insideFcn = eval.insideFcn;
return *this;
}
Forward-evaluation of field at parametric coordinates.
Definition at line 60 of file ElemEvaluator.hpp.
Referenced by operator=(), and moab::ElemEvaluator::reverse_eval().
Initialization function for an element.
Definition at line 75 of file ElemEvaluator.hpp.
Referenced by operator=(), and moab::ElemEvaluator::set_eval_set().
Function that returns whether or not the parameters are inside the natural space of the element.
Definition at line 79 of file ElemEvaluator.hpp.
Referenced by operator=(), and moab::ElemEvaluator::reverse_eval().
Forward-evaluation of field at parametric coordinates.
Definition at line 72 of file ElemEvaluator.hpp.
Referenced by operator=().
Evaluate the jacobian at a specified parametric position.
Definition at line 69 of file ElemEvaluator.hpp.
Referenced by operator=(), and moab::ElemEvaluator::reverse_eval().
Evaluate the normal at a local facet (edge/face for 2D/3D)
Definition at line 66 of file ElemEvaluator.hpp.
Referenced by operator=().
Reverse-evaluation of parametric coordinates at physical space position.
Definition at line 63 of file ElemEvaluator.hpp.
Referenced by operator=().