00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00071 #ifndef __PLUGFUNCTION_HPP__
00072 #define __PLUGFUNCTION_HPP__
00073
00074 #include <string>
00075
00076 #include <boost/filesystem/path.hpp>
00077 #include <glibmm.h>
00078
00079
00080 #include <openfluid/dllexport.hpp>
00081 #include <openfluid/core.hpp>
00082 #include <openfluid/base/SimStatus.hpp>
00083 #include <openfluid/base/ExecMsgs.hpp>
00084 #include <openfluid/base/EnvProperties.hpp>
00085 #include <openfluid/base/FuncSignature.hpp>
00086 #include <openfluid/base/StdoutFileOStream.hpp>
00087
00088
00089
00090
00091
00092
00093
00097 #define PLUGFUNCTION_PROC_NAME "GetPlugFunction"
00098
00102 #define PLUGSIGNATURE_PROC_NAME "GetPlugSignature"
00103
00107 #define PLUGSDKVERSION_PROC_NAME "GetPlugSDKVersion"
00108
00109
00110
00114 #define DECLARE_PLUGIN_HOOKS \
00115 extern "C" \
00116 { \
00117 DLLEXPORT std::string GetPlugSDKVersion(); \
00118 DLLEXPORT openfluid::base::PluggableFunction* GetPlugFunction(); \
00119 DLLEXPORT openfluid::base::FunctionSignature* GetPlugSignature(); \
00120 }
00121
00122
00123
00124
00125
00126
00127
00128
00133 #define DEFINE_FUNCTION_HOOK(pluginclassname) \
00134 std::string GetPlugSDKVersion() \
00135 { \
00136 return std::string(STRINGIFY(OPENFLUID_VERSION)); \
00137 } \
00138 \
00139 openfluid::base::PluggableFunction* GetPlugFunction() \
00140 { \
00141 return new pluginclassname(); \
00142 }
00143
00144
00145
00146
00147
00148
00153 #define DECLARE_UNITS_ORDERED_LOOP(loopid) \
00154 openfluid::core::UnitsList_t::iterator _M_##loopid##_ordit;\
00155 openfluid::core::UnitsList_t* _M_##loopid##_UList;
00156
00157
00162 #define DECLARE_GLOBAL_UNITS_ORDERED_LOOP(loopid) \
00163 openfluid::core::UnitsPtrList_t::iterator _M_##loopid##_ordit;\
00164 openfluid::core::UnitsPtrList_t* _M_##loopid##_GUList;
00165
00166
00173 #define BEGIN_UNITS_ORDERED_LOOP(loopid,unitclass,unit) \
00174 _M_##loopid##_UList = mp_CoreData->getUnits(unitclass)->getList(); \
00175 if (_M_##loopid##_UList != NULL) \
00176 { \
00177 for (_M_##loopid##_ordit = _M_##loopid##_UList->begin();_M_##loopid##_ordit != _M_##loopid##_UList->end();++_M_##loopid##_ordit) \
00178 { \
00179 unit = &(*_M_##loopid##_ordit);
00180
00181
00187 #define BEGIN_GLOBAL_UNITS_ORDERED_LOOP(loopid,unit) \
00188 { \
00189 _M_##loopid##_GUList = mp_CoreData->getUnitsGlobally(); \
00190 for (_M_##loopid##_ordit = _M_##loopid##_GUList->begin();_M_##loopid##_ordit != _M_##loopid##_GUList->end();++_M_##loopid##_ordit) \
00191 { \
00192 unit = (*_M_##loopid##_ordit);
00193
00194
00202 #define APPLY_UNITS_ORDERED_LOOP_THREADED(loopid,unitclass,funcptr,...) \
00203 _M_##loopid##_UList = mp_CoreData->getUnits(unitclass)->getList(); \
00204 if (_M_##loopid##_UList != NULL) \
00205 { \
00206 _M_##loopid##_ordit = _M_##loopid##_UList->begin(); \
00207 if (_M_##loopid##_ordit != _M_##loopid##_UList->end()) \
00208 { \
00209 openfluid::core::PcsOrd_t _M_##loopid##_pcsord = _M_##loopid##_ordit->getProcessOrder(); \
00210 while (_M_##loopid##_ordit != _M_##loopid##_UList->end()) \
00211 { \
00212 Glib::ThreadPool _M_##loopid##_pool(OPENFLUID_GetFunctionMaxThreads(),true); \
00213 while (_M_##loopid##_ordit != _M_##loopid##_UList->end() && _M_##loopid##_ordit->getProcessOrder() == _M_##loopid##_pcsord) \
00214 { \
00215 openfluid::core::Unit* _M_##loopid##_unit = &(*_M_##loopid##_ordit); \
00216 _M_##loopid##_pool.push(sigc::bind(sigc::mem_fun(*this,&funcptr),_M_##loopid##_unit, ## __VA_ARGS__)); \
00217 ++_M_##loopid##_ordit; \
00218 } \
00219 _M_##loopid##_pool.shutdown(); \
00220 if (_M_##loopid##_ordit != _M_##loopid##_UList->end()) _M_##loopid##_pcsord = _M_##loopid##_ordit->getProcessOrder(); \
00221 } \
00222 } \
00223 }
00224
00225
00232 #define APPLY_GLOBAL_UNITS_ORDERED_LOOP_THREADED(loopid,funcptr,...) \
00233 _M_##loopid##_GUList = mp_CoreData->getUnitsGlobally(); \
00234 if (_M_##loopid##_GUList != NULL) \
00235 { \
00236 _M_##loopid##_ordit = _M_##loopid##_GUList->begin(); \
00237 if (_M_##loopid##_ordit != _M_##loopid##_GUList->end()) \
00238 { \
00239 openfluid::core::PcsOrd_t _M_##loopid##_pcsord = (*_M_##loopid##_ordit)->getProcessOrder(); \
00240 while (_M_##loopid##_ordit != _M_##loopid##_GUList->end()) \
00241 { \
00242 Glib::ThreadPool _M_##loopid##_pool(OPENFLUID_GetFunctionMaxThreads(),true); \
00243 while (_M_##loopid##_ordit != _M_##loopid##_GUList->end() && (*_M_##loopid##_ordit)->getProcessOrder() == _M_##loopid##_pcsord) \
00244 { \
00245 openfluid::core::Unit* _M_##loopid##_unit = (*_M_##loopid##_ordit); \
00246 _M_##loopid##_pool.push(sigc::bind(sigc::mem_fun(*this,&funcptr),_M_##loopid##_unit, ## __VA_ARGS__)); \
00247 ++_M_##loopid##_ordit; \
00248 } \
00249 _M_##loopid##_pool.shutdown(); \
00250 if (_M_##loopid##_ordit != _M_##loopid##_GUList->end()) _M_##loopid##_pcsord = (*_M_##loopid##_ordit)->getProcessOrder(); \
00251 } \
00252 } \
00253 }
00254
00255
00256
00261 #define DECLARE_UNITS_LIST_LOOP(loopid) \
00262 openfluid::core::UnitsPtrList_t::iterator _M_##loopid##_lstit;\
00263
00264
00271 #define BEGIN_UNITS_LIST_LOOP(loopid,ulist,unit) \
00272 if ((ulist) != NULL) \
00273 { \
00274 for(_M_##loopid##_lstit=ulist->begin(); _M_##loopid##_lstit != ulist->end(); _M_##loopid##_lstit++) \
00275 { \
00276 unit = *_M_##loopid##_lstit; \
00277
00278
00282 #define DECLARE_EVENT_COLLECTION_LOOP \
00283 openfluid::core::EventsList_t::iterator _M_EvListiter;
00284
00290 #define BEGIN_EVENT_COLLECTION_LOOP(evlist,evobj) \
00291 { \
00292 for(_M_EvListiter=(evlist)->begin(); _M_EvListiter != (evlist)->end(); _M_EvListiter++) \
00293 { \
00294 evobj = &(*_M_EvListiter);
00295
00299 #define END_LOOP \
00300 } \
00301 }
00302
00303
00304
00305
00306
00307
00308
00309
00310 namespace openfluid { namespace base {
00311
00312
00313
00323 class DLLEXPORT PluggableFunction
00324 {
00325
00326 private:
00327
00331 openfluid::core::CoreRepository* mp_InternalCoreData;
00332
00333
00337 openfluid::base::ExecutionMessages* mp_ExecMsgs;
00338
00339
00343 const openfluid::base::EnvironmentProperties* mp_FunctionEnv;
00344
00345
00349 openfluid::core::FuncParamsMap_t m_ParamsMap;
00350
00354 openfluid::base::FuncID_t m_FunctionID;
00355
00356 unsigned int m_MaxThreads;
00357
00358 bool m_Initialized;
00359
00360 static bool IsUnitIDInPtrList(const openfluid::core::UnitsPtrList_t* UnitsList,
00361 const openfluid::core::UnitID_t& ID);
00362
00363 static std::string generateDotEdge(std::string SrcClass, std::string SrcID,
00364 std::string DestClass, std::string DestID,
00365 std::string Options);
00366
00367
00368 protected:
00369
00370
00374 openfluid::core::CoreRepository* mp_CoreData;
00375
00376
00384 void OPENFLUID_GetVariable(openfluid::core::Unit *UnitPtr,
00385 openfluid::core::VariableName_t VarName,
00386 openfluid::core::TimeStep_t Step,
00387 openfluid::core::ScalarValue *Value);
00388
00396 void OPENFLUID_GetVariable(openfluid::core::Unit *UnitPtr,
00397 openfluid::core::VariableName_t VarName,
00398 openfluid::core::TimeStep_t Step,
00399 openfluid::core::VectorValue *Value);
00400
00407 void OPENFLUID_GetInputData(openfluid::core::Unit *UnitPtr,
00408 openfluid::core::InputDataName_t InputName,
00409 double *Value);
00410
00417 void OPENFLUID_GetInputData(openfluid::core::Unit *UnitPtr,
00418 openfluid::core::InputDataName_t InputName,
00419 long *Value);
00420
00427 void OPENFLUID_GetInputData(openfluid::core::Unit *UnitPtr,
00428 openfluid::core::InputDataName_t InputName,
00429 std::string *Value);
00430
00437 void OPENFLUID_SetInputData(openfluid::core::Unit *UnitPtr,
00438 const openfluid::core::InputDataName_t& InputName,
00439 const double& Value);
00440
00447 void OPENFLUID_SetInputData(openfluid::core::Unit *UnitPtr,
00448 const openfluid::core::InputDataName_t& InputName,
00449 const long& Value);
00450
00457 void OPENFLUID_SetInputData(openfluid::core::Unit *UnitPtr,
00458 const openfluid::core::InputDataName_t& InputName,
00459 const std::string& Value);
00460
00461
00467 bool OPENFLUID_IsInputDataExist(openfluid::core::Unit *UnitPtr,
00468 openfluid::core::InputDataName_t InputName);
00469
00470
00471
00477 bool OPENFLUID_IsVariableExist(openfluid::core::Unit *UnitPtr,
00478 openfluid::core::VariableName_t VarName);
00479
00485 bool OPENFLUID_IsScalarVariableExist(openfluid::core::Unit *UnitPtr,
00486 openfluid::core::VariableName_t VarName);
00487
00493 bool OPENFLUID_IsVectorVariableExist(openfluid::core::Unit *UnitPtr,
00494 openfluid::core::VariableName_t VarName);
00495
00496
00503 bool OPENFLUID_IsVariableExist(openfluid::core::Unit *UnitPtr,
00504 openfluid::core::VariableName_t VarName,
00505 openfluid::core::TimeStep_t Step);
00506
00513 bool OPENFLUID_IsScalarVariableExist(openfluid::core::Unit *UnitPtr,
00514 openfluid::core::VariableName_t VarName,
00515 openfluid::core::TimeStep_t Step);
00516
00523 bool OPENFLUID_IsVectorVariableExist(openfluid::core::Unit *UnitPtr,
00524 openfluid::core::VariableName_t VarName,
00525 openfluid::core::TimeStep_t Step);
00526
00533 void OPENFLUID_AppendVariable(openfluid::core::Unit *UnitPtr,
00534 openfluid::core::VariableName_t VarName,
00535 openfluid::core::ScalarValue Value);
00536
00543 void OPENFLUID_AppendVariable(openfluid::core::Unit *UnitPtr,
00544 openfluid::core::VariableName_t VarName,
00545 openfluid::core::VectorValue& Value);
00546
00554 void OPENFLUID_SetVariable(openfluid::core::Unit *UnitPtr,
00555 openfluid::core::VariableName_t VarName,
00556 openfluid::core::TimeStep_t Step,
00557 openfluid::core::ScalarValue Value);
00558
00566 void OPENFLUID_SetVariable(openfluid::core::Unit *UnitPtr,
00567 openfluid::core::VariableName_t VarName,
00568 openfluid::core::TimeStep_t Step,
00569 openfluid::core::VectorValue Value);
00570
00577 bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00578 openfluid::core::FuncParamKey_t ParamName,
00579 double *Value);
00580
00587 bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00588 openfluid::core::FuncParamKey_t ParamName,
00589 long *Value);
00590
00597 bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00598 openfluid::core::FuncParamKey_t ParamName,
00599 float *Value);
00600
00607 bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00608 openfluid::core::FuncParamKey_t ParamName,
00609 int *Value);
00610
00617 bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00618 openfluid::core::FuncParamKey_t ParamName,
00619 std::string *Value);
00620
00627 bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00628 openfluid::core::FuncParamKey_t ParamName,
00629 std::vector<std::string> *Values);
00630
00631
00638 bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00639 openfluid::core::FuncParamKey_t ParamName,
00640 std::vector<double> *Values);
00641
00642
00649 bool OPENFLUID_GetFunctionParameter(openfluid::core::FuncParamsMap_t Params,
00650 openfluid::core::FuncParamKey_t ParamName,
00651 std::vector<long> *Values);
00652
00653
00661 void OPENFLUID_GetEvents(openfluid::core::Unit *UnitPtr,
00662 openfluid::core::DateTime BeginDate,
00663 openfluid::core::DateTime EndDate,
00664 openfluid::core::EventsCollection* Events);
00665
00666
00672 void OPENFLUID_AppendEvent(openfluid::core::Unit *UnitPtr,
00673 openfluid::core::Event& Ev);
00674
00675
00676
00681 bool OPENFLUID_IsUnitClassExist(openfluid::core::UnitClass_t ClassName);
00682
00683
00689 bool OPENFLUID_IsUnitExist(openfluid::core::UnitClass_t ClassName,
00690 openfluid::core::UnitID_t ID);
00691
00696 void OPENFLUID_GetUnitsCount(unsigned int& UnitsCount);
00697
00704 bool OPENFLUID_GetUnitsCount(const openfluid::core::UnitClass_t ClassName,
00705 unsigned int& UnitsCount);
00706
00707
00715 bool OPENFLUID_GetUnit(const openfluid::core::UnitClass_t& ClassName,
00716 const openfluid::core::UnitID_t& ID,
00717 openfluid::core::Unit* aUnit);
00718
00719 openfluid::core::Unit* OPENFLUID_GetUnit(const openfluid::core::UnitClass_t& ClassName,
00720 const openfluid::core::UnitID_t& ID);
00721
00727 void OPENFLUID_AddUnit(openfluid::core::UnitClass_t ClassName,
00728 openfluid::core::UnitID_t ID,
00729 openfluid::core::PcsOrd_t PcsOrder);
00730
00737 void OPENFLUID_DeleteUnit(openfluid::core::UnitClass_t ClassName,
00738 openfluid::core::UnitID_t ID);
00739
00740
00749 bool OPENFLUID_AddFromToConnection(openfluid::core::UnitClass_t ClassNameFrom,
00750 openfluid::core::UnitID_t IDFrom,
00751 openfluid::core::UnitClass_t ClassNameTo,
00752 openfluid::core::UnitID_t IDTo);
00753
00760 bool OPENFLUID_AddFromToConnection(openfluid::core::Unit* FromUnit,
00761 openfluid::core::Unit* ToUnit);
00762
00771 bool OPENFLUID_RemoveFromToConnection(openfluid::core::UnitClass_t ClassNameFrom,
00772 openfluid::core::UnitID_t IDFrom,
00773 openfluid::core::UnitClass_t ClassNameTo,
00774 openfluid::core::UnitID_t IDTo);
00775
00782 bool OPENFLUID_RemoveFromToConnection(openfluid::core::Unit* FromUnit,
00783 openfluid::core::Unit* ToUnit);
00784
00785
00794 bool OPENFLUID_AddChildParentConnection(openfluid::core::UnitClass_t ClassNameChild,
00795 openfluid::core::UnitID_t IDChild,
00796 openfluid::core::UnitClass_t ClassNameParent,
00797 openfluid::core::UnitID_t IDParent);
00798
00805 bool OPENFLUID_AddChildParentConnection(openfluid::core::Unit* ChildUnit,
00806 openfluid::core::Unit* ParentUnit);
00807
00808
00817 bool OPENFLUID_RemoveChildParentConnection(openfluid::core::UnitClass_t ClassNameChild,
00818 openfluid::core::UnitID_t IDChild,
00819 openfluid::core::UnitClass_t ClassNameParent,
00820 openfluid::core::UnitID_t IDParent);
00821
00828 bool OPENFLUID_RemoveChildParentConnection(openfluid::core::Unit* ChildUnit,
00829 openfluid::core::Unit* ParentUnit);
00830
00838 bool OPENFLUID_IsUnitConnectedTo(openfluid::core::Unit* aUnit,
00839 const openfluid::core::UnitClass_t& ClassNameTo,
00840 const openfluid::core::UnitID_t& IDTo);
00841
00842
00850 bool OPENFLUID_IsUnitConnectedFrom(openfluid::core::Unit* aUnit,
00851 const openfluid::core::UnitClass_t& ClassNameFrom,
00852 const openfluid::core::UnitID_t& IDFrom);
00853
00854
00862 bool OPENFLUID_IsUnitChildOf(openfluid::core::Unit* aUnit,
00863 const openfluid::core::UnitClass_t& ClassNameParent,
00864 const openfluid::core::UnitID_t& IDParent);
00865
00866
00874 bool OPENFLUID_IsUnitParentOf(openfluid::core::Unit* aUnit,
00875 const openfluid::core::UnitClass_t& ClassNameChild,
00876 const openfluid::core::UnitID_t& IDChild);
00877
00878
00885 void OPENFLUID_BuildUnitsMatrix(const openfluid::core::UnitClass_t& UnitsClass,
00886 const unsigned int& ColsNbr,
00887 const unsigned int& RowsNbr);
00888
00889
00895 void OPENFLUID_ExportUnitsGraphAsDotFile(const std::string& Filename);
00896
00903 void OPENFLUID_RaiseWarning(std::string Sender, openfluid::core::TimeStep_t TimeStep, std::string Msg);
00904
00910 void OPENFLUID_RaiseWarning(std::string Sender, std::string Msg);
00911
00919 void OPENFLUID_RaiseWarning(std::string Sender, std::string Source, openfluid::core::TimeStep_t TimeStep, std::string Msg);
00920
00927 void OPENFLUID_RaiseWarning(std::string Sender, std::string Source, std::string Msg);
00928
00929
00936 void OPENFLUID_RaiseError(std::string Sender, openfluid::core::TimeStep_t TimeStep, std::string Msg);
00937
00943 void OPENFLUID_RaiseError(std::string Sender, std::string Msg);
00944
00952 void OPENFLUID_RaiseError(std::string Sender, std::string Source, openfluid::core::TimeStep_t TimeStep, std::string Msg);
00953
00960 void OPENFLUID_RaiseError(std::string Sender, std::string Source, std::string Msg);
00961
00962
00968 bool OPENFLUID_GetRunEnvironment(std::string Key, std::string *Value);
00969
00975 bool OPENFLUID_GetRunEnvironment(std::string Key, bool *Value);
00976
00981 inline unsigned int OPENFLUID_GetFunctionMaxThreads() const { return m_MaxThreads; };
00982
00987 void OPENFLUID_SetFunctionMaxThreads(const unsigned int& MaxNumThreads);
00988
00989
00990 StdoutAndFileOutputStream OPENFLUID_Logger;
00991
00992
00993 public:
00997 PluggableFunction();
00998
01002 virtual ~PluggableFunction();
01003
01004
01005 void initializeFunction(openfluid::core::CoreRepository* CoreData,
01006 openfluid::base::ExecutionMessages* ExecMsgs,
01007 openfluid::base::EnvironmentProperties* FuncEnv,
01008 const unsigned int& MaxThreads,
01009 const openfluid::base::FuncID_t& FuncID);
01010
01011
01012
01013
01017 virtual bool initParams(openfluid::core::FuncParamsMap_t Params)=0;
01018
01022 virtual bool prepareData()=0;
01023
01027 virtual bool checkConsistency()=0;
01028
01029
01033 virtual bool initializeRun(const SimulationInfo* SimInfo)=0;
01034
01038 virtual bool runStep(const SimulationStatus* SimStatus)=0;
01039
01043 virtual bool finalizeRun(const SimulationInfo* SimInfo)=0;
01044
01045 };
01046
01047
01048 typedef PluggableFunction* (*GetPluggableFunctionProc)();
01049
01050 typedef FunctionSignature* (*GetSignatureProc)();
01051
01052 typedef std::string (*GetSDKVersionProc)();
01053
01054
01055
01056 } }
01057
01058
01059
01060 #endif
01061