![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #ifndef FBIGEOM_MOAB_HPP
00002 #define FBIGEOM_MOAB_HPP
00003
00004 #include "FBiGeom.h"
00005 //#include "moab/Forward.hpp"
00006 #include "moab/Interface.hpp"
00007 #include "moab/FBEngine.hpp"
00008 #include "iMesh.h"
00009 #include "MBiMesh.hpp"
00010
00011 /* map from MOAB's MBErrorCode to tstt's */
00012 extern "C" const iBase_ErrorType iBase_ERROR_MAP[moab::MB_FAILURE + 1];
00013
00014 // the igeom moab instance should privide easy access to
00015 // moab::Interface, FBEngine *, and equivalent MBiMesh instance, because a lot
00016 // of code can be shared among iMesh and iGeom, especially
00017 // with respect to tags and sets
00018 // when a moab iGeom is instanced, moab will be instanced, and FBEngine too
00019 //
00020 class MBiGeom
00021 {
00022 MBiMesh* _mbimesh;
00023 moab::FBEngine* _fbe;
00024 bool _mbimeshCreated, _fbeCreated;
00025
00026 public:
00027 MBiGeom()
00028 {
00029 // this will instance a moab Core, too
00030 _mbimesh = new MBiMesh( NULL );
00031 moab::Interface* mbi = _mbimesh->mbImpl;
00032 // pass mbi, so they will point to the same implementation
00033 _fbe = new FBEngine( mbi );
00034 _mbimeshCreated = _fbeCreated = true;
00035 }
00036 MBiGeom( MBiMesh* mbi, moab::FBEngine* fbe )
00037 {
00038 _mbimesh = mbi;
00039 _fbe = fbe;
00040 _mbimeshCreated = _fbeCreated = false;
00041 }
00042 ~MBiGeom()
00043 {
00044 // some cleanup here
00045 if( _fbeCreated ) delete _fbe;
00046 if( _mbimeshCreated ) delete _mbimesh;
00047 }
00048 moab::Interface* moabItf()
00049 {
00050 return _mbimesh->mbImpl;
00051 }
00052 moab::FBEngine* FBItf()
00053 {
00054 return _fbe;
00055 }
00056 MBiMesh* mbimesh()
00057 {
00058 return _mbimesh;
00059 }
00060 };
00061 /* Define macro for quick reference to MBInterface instance */
00062 static inline moab::Interface* MBI_cast( FBiGeom_Instance i )
00063 {
00064 return reinterpret_cast< MBiGeom* >( i )->moabItf();
00065 }
00066
00067 #define MBI MBI_cast( instance )
00068
00069 static inline moab::FBEngine* FBE_cast( FBiGeom_Instance i )
00070 {
00071 return reinterpret_cast< MBiGeom* >( i )->FBItf();
00072 }
00073
00074 /* Define macro for quick reference to moab::Interface instance */
00075 static inline moab::EntityHandle MBH_cast( iBase_EntityHandle h )
00076 {
00077 return reinterpret_cast< moab::EntityHandle >( h );
00078 }
00079
00080 #define GETGTT( a ) ( reinterpret_cast< MBiGeom* >( a )->FBItf()->get_gtt() )
00081
00082 static inline bool FBiGeom_isError( int code )
00083 {
00084 return ( iBase_SUCCESS != code );
00085 }
00086 static inline bool FBiGeom_isError( moab::ErrorCode code )
00087 {
00088 return ( moab::MB_SUCCESS != code );
00089 }
00090
00091 // easy access to imesh instance, used for tags, sets methods
00092 #define IMESH_INSTANCE( i ) reinterpret_cast< iMesh_Instance >( reinterpret_cast< MBiGeom* >( i )->mbimesh() )
00093
00094 // this assumes that iGeom instance is always instance
00095 // uses MBiGeom class which sets the error
00096 #define MBIM ( reinterpret_cast< MBiGeom* >( instance )->mbimesh() )
00097
00098 #define RETURN( CODE ) \
00099 do \
00100 { \
00101 *err = MBIM->set_last_error( ( CODE ), "" ); \
00102 return; \
00103 } while( false )
00104
00105 #define ERROR( CODE, MSG ) \
00106 do \
00107 { \
00108 *err = MBIM->set_last_error( ( CODE ), ( MSG ) ); \
00109 return; \
00110 } while( false )
00111
00112 #define CHKERR( CODE, MSG ) \
00113 do \
00114 { \
00115 if( FBiGeom_isError( ( CODE ) ) ) ERROR( ( CODE ), ( MSG ) ); \
00116 } while( false )
00117
00118 #define FWDERR() \
00119 do \
00120 { \
00121 if( FBiGeom_isError( *err ) ) return; \
00122 } while( false )
00123
00124 #define CHECK_SIZE( array, allocated, size, type, retval ) \
00125 do \
00126 { \
00127 if( 0 != ( allocated ) && NULL != ( array ) && ( allocated ) < ( size ) ) \
00128 { \
00129 ERROR( iBase_MEMORY_ALLOCATION_FAILED, "Allocated array not " \
00130 "enough to hold returned contents." ); \
00131 } \
00132 if( ( size ) && ( ( allocated ) == 0 || NULL == ( array ) ) ) \
00133 { \
00134 ( array ) = (type*)malloc( ( size ) * sizeof( type ) ); \
00135 ( allocated ) = ( size ); \
00136 if( NULL == ( array ) ) \
00137 { \
00138 ERROR( iBase_MEMORY_ALLOCATION_FAILED, "Couldn't allocate array." ); \
00139 } \
00140 } \
00141 } while( false )
00142
00143 #endif // FBIGEOM_MOAB_HPP