Building Medical Digital Twins with Pulse: Open Source Simulation Tools for Developers and Researchers
×
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 
10 class CDM_DECL SEBlackBoxManager : public Loggable
11 {
12  friend class CommonDataModelTest;
13 public:
14  SEBlackBoxManager(Logger* logger);
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 
33 protected:
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
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
tBlackBox * CreateBlackBox(const std::string &name, std::map< std::string, tBlackBox * > &ledger)
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.