![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #ifndef SPECTRAL_QUAD_HPP
00002 #define SPECTRAL_QUAD_HPP
00003 /*\brief Shape function space for spectral quad
00004 */
00005
00006 #include "moab/ElemEvaluator.hpp"
00007 #include "SpectralFuncs.hpp"
00008
00009 namespace moab
00010 {
00011
00012 class SpectralQuad
00013 {
00014 public:
00015 /** \brief Forward-evaluation of field at parametric coordinates */
00016 static ErrorCode evalFcn( const double* params,
00017 const double* field,
00018 const int ndim,
00019 const int num_tuples,
00020 double* work,
00021 double* result );
00022
00023 /** \brief Reverse-evaluation of parametric coordinates at physical space position */
00024 static ErrorCode reverseEvalFcn( EvalFcn eval,
00025 JacobianFcn jacob,
00026 InsideFcn ins,
00027 const double* posn,
00028 const double* verts,
00029 const int nverts,
00030 const int ndim,
00031 const double iter_tol,
00032 const double inside_tol,
00033 double* work,
00034 double* params,
00035 int* is_inside );
00036
00037 /** \brief Evaluate the jacobian at a specified parametric position */
00038 static ErrorCode jacobianFcn( const double* params,
00039 const double* verts,
00040 const int nverts,
00041 const int ndim,
00042 double* work,
00043 double* result );
00044
00045 /** \brief Forward-evaluation of field at parametric coordinates */
00046 static ErrorCode integrateFcn( const double* field,
00047 const double* verts,
00048 const int nverts,
00049 const int ndim,
00050 const int num_tuples,
00051 double* work,
00052 double* result );
00053
00054 /** \brief Initialize this EvalSet */
00055 static ErrorCode initFcn( const double* verts, const int nverts, double*& work );
00056
00057 /** \brief Function that returns whether or not the parameters are inside the natural space of
00058 * the element */
00059 static int insideFcn( const double* params, const int ndim, const double tol );
00060
00061 static EvalSet eval_set()
00062 {
00063 return EvalSet( evalFcn, reverseEvalFcn, jacobianFcn, integrateFcn, initFcn );
00064 }
00065
00066 static bool compatible( EntityType tp, int numv, EvalSet& eset )
00067 {
00068 if( tp != MBQUAD ) return false;
00069 int i;
00070 for( i = 3; i * i == numv || i * i > numv; i++ )
00071 ;
00072 if( i * i != numv ) return false;
00073 eset = eval_set();
00074 return true;
00075 }
00076
00077 protected:
00078 static int _n;
00079 static double* _z[2];
00080 static lagrange_data _ld[2];
00081 static opt_data_2 _data; // we should use only 2nd component
00082 static double* _odwork; // work area
00083
00084 // flag for initialization of data
00085 static bool _init;
00086 static double* _glpoints; // it is a space we can use to store gl positions for elements
00087 // on the fly; we do not have a tag yet for them, as in Nek5000 application
00088 // also, these positions might need to be moved on the sphere, for HOMME grids
00089 // do we project them or how do we move them on the sphere?
00090 }; // class SpectralQuad
00091
00092 } // namespace moab
00093
00094 #endif