/
cbmmodulebase.h
110 lines (100 loc) · 5.45 KB
/
cbmmodulebase.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/**
* @file
* The FLINT framework uses publish/subscribe messaging to control the lifecycle of a simulation.
* Module code can subscribe to these events to perform work at different stages.
* See CBMSequencer and CBMSpinupSequencer (notificationCenter.postNotification)
* for when these events are fired in a GCBM simulation, as well as moja::flint::SpatialTiledLocalDomainController
* for the framework-level events like onSystemInit.
*/
#ifndef MOJA_MODULES_CBM_CBMMODULEBASE_H_
#define MOJA_MODULES_CBM_CBMMODULEBASE_H_
#include "moja/flint/modulebase.h"
#include "moja/flint/flintexceptions.h"
#include "moja/exception.h"
#include <boost/exception_ptr.hpp>
namespace moja {
namespace modules {
namespace cbm {
class CBMModuleBase : public flint::ModuleBase {
public:
virtual ~CBMModuleBase() = default;
void onSystemInit() override { doWithHandling([this]() { this->doSystemInit(); }); }
void onSystemShutdown() override { doWithHandling([this]() { this->doSystemShutdown(); }); }
void onLocalDomainInit() override { doWithHandling([this]() { this->doLocalDomainInit(); }); }
void onLocalDomainShutdown() override { doWithHandling([this]() { this->doLocalDomainShutdown(); }); }
void onLocalDomainProcessingUnitInit() override { doWithHandling([this]() { this->doLocalDomainProcessingUnitInit(); }); }
void onLocalDomainProcessingUnitShutdown() override { doWithHandling([this]() { this->doLocalDomainProcessingUnitShutdown(); }); }
void onPreTimingSequence() override { doWithHandling([this]() { this->doPreTimingSequence(); }); }
void onTimingInit() override { doWithHandling([this]() { this->doTimingInit(); }); }
void onTimingPrePostInit() override { doWithHandling([this]() { this->doTimingPrePostInit(); }); }
void onTimingPostInit() override { doWithHandling([this]() { this->doTimingPostInit(); }); }
void onTimingPostInit2() override { doWithHandling([this]() { this->doTimingPostInit2(); }); }
void onTimingShutdown() override { doWithHandling([this]() { this->doTimingShutdown(); }); }
void onTimingStep() override { doWithHandling([this]() { this->doTimingStep(); }); }
void onTimingPreEndStep() override { doWithHandling([this]() { this->doTimingPreEndStep(); }); }
void onTimingEndStep() override { doWithHandling([this]() { this->doTimingEndStep(); }); }
void onTimingPostStep() override { doWithHandling([this]() { this->doTimingPostStep(); }); }
void onOutputStep() override { doWithHandling([this]() { this->doOutputStep(); }); }
void onPrePostDisturbanceEvent() override { doWithHandling([this]() { this->doPrePostDisturbanceEvent(); }); }
void onPostDisturbanceEvent() override { doWithHandling([this]() { this->doPostDisturbanceEvent(); }); }
void onPostDisturbanceEvent2() override { doWithHandling([this]() { this->doPostDisturbanceEvent2(); }); }
void onError(std::string msg) override { doWithHandling([this, msg]() { this->doError(msg); }); }
void onDisturbanceEvent(DynamicVar e) override { doWithHandling([this, e]() { this->doDisturbanceEvent(e); }); }
void onPostNotification(short preMessageSignal) override { doWithHandling([this, preMessageSignal]() { this->doPostNotification(preMessageSignal); }); }
virtual void doSystemInit() {}
virtual void doSystemShutdown() {}
virtual void doLocalDomainInit() {}
virtual void doLocalDomainShutdown() {}
virtual void doLocalDomainProcessingUnitInit() {}
virtual void doLocalDomainProcessingUnitShutdown() {}
virtual void doPreTimingSequence() {}
virtual void doTimingInit() {}
virtual void doTimingPrePostInit() {}
virtual void doTimingPostInit() {}
virtual void doTimingPostInit2() {}
virtual void doTimingShutdown() {}
virtual void doTimingStep() {}
virtual void doTimingPreEndStep() {}
virtual void doTimingEndStep() {}
virtual void doTimingPostStep() {}
virtual void doOutputStep() {}
virtual void doError(std::string msg) {}
virtual void doDisturbanceEvent(DynamicVar) {}
virtual void doPrePostDisturbanceEvent() {}
virtual void doPostDisturbanceEvent() {}
virtual void doPostDisturbanceEvent2() {}
virtual void doPostNotification(short preMessageSignal) {}
private:
void doWithHandling(const std::function<void()>& fn) {
try {
fn();
}
catch (flint::SimulationError&) { throw; }
catch (moja::Exception& e) { raiseModuleError(e); }
catch (boost::exception& e) { raiseModuleError(e); }
catch (std::exception& e) { raiseModuleError(e); }
}
void raiseModuleError(moja::Exception& e) {
BOOST_THROW_EXCEPTION(flint::SimulationError()
<< flint::Details(e.displayText())
<< flint::LibraryName("moja.modules.cbm")
<< flint::ModuleName(metaData().moduleName)
<< flint::ErrorCode(0));
}
void raiseModuleError(boost::exception& e) {
BOOST_THROW_EXCEPTION(flint::SimulationError()
<< flint::Details(boost::diagnostic_information(e))
<< flint::LibraryName("moja.modules.cbm")
<< flint::ModuleName(metaData().moduleName)
<< flint::ErrorCode(0));
}
void raiseModuleError(std::exception& e) {
BOOST_THROW_EXCEPTION(flint::SimulationError()
<< flint::Details(e.what())
<< flint::LibraryName("moja.modules.cbm")
<< flint::ModuleName(metaData().moduleName)
<< flint::ErrorCode(0));
}
};
}}} // namespace moja::Modules::cbm
#endif // MOJA_MODULES_CBM_CBMMODULEBASE_H_