What’s New in the Pulse Physiology Engine 4.4.0
×
SEBlackBoxManager.h
1/* Distributed under the Apache License, Version 2.0.
2 See accompanying NOTICE file for details.*/
3
4#pragma once
5#include "cdm/blackbox/electrical/SEElectricalBlackBox.h"
6#include "cdm/blackbox/fluid/SEGasBlackBox.h"
7#include "cdm/blackbox/fluid/SELiquidBlackBox.h"
8#include "cdm/blackbox/thermal/SEThermalBlackBox.h"
9
10class CDM_DECL SEBlackBoxManager : public Loggable
11{
12 friend class CommonDataModelTest;
13public:
15 virtual ~SEBlackBoxManager();
16
17 virtual bool HasElectricalBlackBox(const std::string& name) const;
18 virtual bool HasElectricalBlackBox(const std::string& srcCmptName, const std::string& tgtCmptName) const;
19 virtual bool HasGasBlackBox(const std::string& name) const;
20 virtual bool HasGasBlackBox(const std::string& srcCmptName, const std::string& tgtCmptName) const;
21 virtual bool HasLiquidBlackBox(const std::string& name) const;
22 virtual bool HasLiquidBlackBox(const std::string& srcCmptName, const std::string& tgtCmptName) const;
23 virtual bool HasThermalBlackBox(const std::string& name) const;
24 virtual bool HasThermalBlackBox(const std::string& srcCmptName, const std::string& tgtCmptName) const;
25
26 virtual SEElectricalBlackBox* GetElectricalBlackBox(const std::string& srcCmptName, const std::string& tgtCmptName, std::string name="");
27 virtual SEGasBlackBox* GetGasBlackBox(const std::string& srcCmptName, const std::string& tgtCmptName, std::string name = "");
28 virtual SELiquidBlackBox* GetLiquidBlackBox(const std::string& srcCmptName, const std::string& tgtCmptName, std::string name = "");
29 virtual SEThermalBlackBox* GetThermalBlackBox(const std::string& srcCmptName, const std::string& tgtCmptName, std::string name = "");
30
31 static std::string GetBlackBoxName(const std::string& srcCmptName, const std::string& tgtCmptName);
32
33protected:
34 virtual SEElectricalBlackBox* CreateElectricalBlackBox(const std::string& srcCmptName, const std::string& tgtCmptName, const std::string& name);
35 virtual SEGasBlackBox* CreateGasBlackBox(const std::string& srcCmptName, const std::string& tgtCmptName, const std::string& name);
36 virtual SELiquidBlackBox* CreateLiquidBlackBox(const std::string& srcCmptName, const std::string& tgtCmptName, const std::string& name);
37 virtual SEThermalBlackBox* CreateThermalBlackBox(const std::string& srcCmptName, const std::string& tgtCmptName, const std::string& name);
38
39 template<typename tBlackBox> tBlackBox* CreateBlackBox(const std::string& name, std::map<std::string, tBlackBox*>& ledger);
40
41 // Map circuit compartments in a separate function, to support unit tests
42 template<typename tBlackBox, typename tCompartment, typename tLink, typename tNode, typename tPath>
43 bool MapBlackBox(tBlackBox& bb, tLink& src2bbLink, tLink& bb2tgtLink)
44 {
45 if (bb.HasCompartment())
46 Warning("Blackbox " + bb.GetName() + " already has a compartment mapped, only 1 black box can be between 2 compartments");
47
48 tCompartment& midCmpt = src2bbLink.GetTargetCompartment();
49 tCompartment& srcCmpt = src2bbLink.GetSourceCompartment();
50 tCompartment& tgtCmpt = bb2tgtLink.GetTargetCompartment();
51 bb.SetCompartment(&midCmpt);
52 bb.SetSourceCompartment(&srcCmpt);
53 bb.SetSourceLink(&src2bbLink);
54 bb.SetTargetCompartment(&tgtCmpt);
55 bb.SetTargetLink(&bb2tgtLink);
56
57 tPath& srcPath = *src2bbLink.GetPath();
58 tPath& tgtPath = *bb2tgtLink.GetPath();
59
60 return MapBlackBox<tBlackBox, tNode, tPath>(bb, srcPath, tgtPath);
61 }
62
63 // Map circuit components in a separate function, to support unit tests
64 template<typename tBlackBox, typename tNode, typename tPath>
65 bool MapBlackBox(tBlackBox& bb, tPath& srcPath, tPath& tgtPath)
66 {
67 if (bb.HasMiddleNode())
68 Warning("Blackbox " + bb.GetName() + " already has nodes mapped, only 1 blackbox can be between nodes");
69
70 tNode* midNode=nullptr;
71 tNode* srcNode=nullptr;
72 tNode* tgtNode=nullptr;
73
74 //Middle node is the shared one
75 if (&srcPath.GetSourceNode() == &tgtPath.GetSourceNode())
76 {
77 midNode = &srcPath.GetSourceNode();
78 srcNode = &srcPath.GetTargetNode();
79 tgtNode = &tgtPath.GetTargetNode();
80 }
81 else if (&srcPath.GetSourceNode() == &tgtPath.GetTargetNode())
82 {
83 midNode = &srcPath.GetSourceNode();
84 srcNode = &srcPath.GetTargetNode();
85 tgtNode = &tgtPath.GetSourceNode();
86 }
87 else if (&srcPath.GetTargetNode() == &tgtPath.GetSourceNode())
88 {
89 midNode = &srcPath.GetTargetNode();
90 srcNode = &srcPath.GetSourceNode();
91 tgtNode = &tgtPath.GetTargetNode();
92 }
93 else if (&srcPath.GetTargetNode() == &tgtPath.GetTargetNode())
94 {
95 midNode = &srcPath.GetTargetNode();
96 srcNode = &srcPath.GetSourceNode();
97 tgtNode = &tgtPath.GetSourceNode();
98 }
99 else
100 {
101 Fatal("Blackbox nodes/paths incorrectly setup.");
102 return false;
103 }
104
105 midNode->SetPartOfBlackBox(true);
106 midNode->SetBlackBoxSourceTargetNodes(*srcNode, *tgtNode);
107 midNode->SetBlackBoxSourceTargetPaths(srcPath, tgtPath);
108 srcNode->SetPartOfBlackBox(true);
109 tgtNode->SetPartOfBlackBox(true);
110 srcPath.SetPartOfBlackBox(true);
111 tgtPath.SetPartOfBlackBox(true);
112
113 bb.SetMiddleNode(midNode);
114 bb.SetSourceNode(srcNode);
115 bb.SetSourcePath(&srcPath);
116 bb.SetTargetNode(tgtNode);
117 bb.SetTargetPath(&tgtPath);
118
119 return true;
120 }
121 std::map<std::string, SEElectricalBlackBox*> m_ElectricalBoxes;
122 std::map<std::string, SEGasBlackBox*> m_GasBoxes;
123 std::map<std::string, SELiquidBlackBox*> m_LiquidBoxes;
124 std::map<std::string, SEThermalBlackBox*> m_ThermalBoxes;
125};
Definition: CommonDataModelTest.h:26
Definition: Logger.h:23
virtual void Warning(std::string const &msg) const
Definition: SimpleLogger.cpp:359
virtual void Fatal(std::string const &msg) const
Definition: SimpleLogger.cpp:407
Definition: Logger.h:71
Definition: SEBlackBoxManager.h:11
tBlackBox * CreateBlackBox(const std::string &name, std::map< std::string, tBlackBox * > &ledger)
std::map< std::string, SEGasBlackBox * > m_GasBoxes
Definition: SEBlackBoxManager.h:122
bool MapBlackBox(tBlackBox &bb, tPath &srcPath, tPath &tgtPath)
Definition: SEBlackBoxManager.h:65
std::map< std::string, SEElectricalBlackBox * > m_ElectricalBoxes
Definition: SEBlackBoxManager.h:121
std::map< std::string, SELiquidBlackBox * > m_LiquidBoxes
Definition: SEBlackBoxManager.h:123
bool MapBlackBox(tBlackBox &bb, tLink &src2bbLink, tLink &bb2tgtLink)
Definition: SEBlackBoxManager.h:43
std::map< std::string, SEThermalBlackBox * > m_ThermalBoxes
Definition: SEBlackBoxManager.h:124
Definition: SEElectricalBlackBox.h:11
Definition: SEGasBlackBox.h:11
Definition: SELiquidBlackBox.h:11
Definition: SEThermalBlackBox.h:11

Distributed under the Apache License, Version 2.0.

See accompanying NOTICE file for details.