SEFluidCompartment.h
1 /**************************************************************************************
2 Copyright 2015 Applied Research Associates, Inc.
3 Licensed under the Apache License, Version 2.0 (the "License"); you may not use
4 this file except in compliance with the License. You may obtain a copy of the License
5 at:
6 http://www.apache.org/licenses/LICENSE-2.0
7 Unless required by applicable law or agreed to in writing, software distributed under
8 the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
9 CONDITIONS OF ANY KIND, either express or implied. See the License for the
10 specific language governing permissions and limitations under the License.
11 **************************************************************************************/
12 
13 #pragma once
14 #include <vector>
15 //Project Includes
16 #include <biogears/cdm/CommonDataModel.h>
17 #include <biogears/cdm/circuit/fluid/SEFluidCircuitNode.h>
18 #include <biogears/cdm/compartment/SECompartment.h>
19 #include <biogears/cdm/compartment/SECompartmentNodes.h>
20 #include <biogears/schema/cdm/Compartment.hxx>
21 #include <biogears/cdm/properties/SEScalarVolumePerTime.h>
22 #include <biogears/cdm/properties/SEScalarPressure.h>
23 #include <biogears/cdm/properties/SEScalarVolume.h>
24 
25 namespace biogears {
26 class SESubstance;
27 class SEScalarPressure;
28 class PressureUnit;
29 class SEScalarVolumePerTime;
30 class VolumePerTimeUnit;
31 
32 template <typename EdgeType, typename VertexType, typename CompartmentType>
34 
35 #define FLUID_COMPARTMENT_TEMPLATE typename LinkType, typename VertexType, typename TransportSubstanceType, typename SubstanceQuantityType
36 #define FLUID_COMPARTMENT_TYPES LinkType, VertexType, TransportSubstanceType, SubstanceQuantityType
37 
38 template <FLUID_COMPARTMENT_TEMPLATE>
39 class SEFluidCompartment : public SECompartment, public VertexType {
40 
41  template <typename CompartmentType, typename CompartmentLinkType>
42  friend class SECompartmentGraph;
43 
44 protected:
45  SEFluidCompartment(const char* name, Logger* logger);
46  SEFluidCompartment(const std::string& name, Logger* logger);
47 
48 public:
49  virtual ~SEFluidCompartment();
50 
51  void Clear() override;
52 
53  virtual bool Load(const CDM::FluidCompartmentData& in, SECircuitManager* circuits = nullptr);
54  CDM::FluidCompartmentData* Unload() override = 0;
55 
56 protected:
57  virtual void Unload(CDM::FluidCompartmentData& data);
58 
59 public:
60  std::string GetName() const override;
61  const char* GetName_cStr() const override;
62 
63  const SEScalar* GetScalar(const char* name) override;
64  const SEScalar* GetScalar(const std::string& name) override;
65 
66  bool HasChildren() const override { return !m_FluidChildren.empty(); }
67 
68  virtual bool HasNodeMapping() const { return m_Nodes.HasMapping(); }
70  virtual void MapNode(SEFluidCircuitNode& node);
71 
72  virtual bool HasInFlow() const;
73  virtual const SEScalarVolumePerTime& GetInFlow();
74  virtual double GetInFlow(const VolumePerTimeUnit& unit) const;
75 
76  virtual bool HasOutFlow() const;
77  virtual const SEScalarVolumePerTime& GetOutFlow();
78  virtual double GetOutFlow(const VolumePerTimeUnit& unit) const;
79 
80  virtual bool HasPressure() const;
81  virtual SEScalarPressure& GetPressure();
82  virtual double GetPressure(const PressureUnit& unit) const;
83 
84  virtual bool HasVolume() const;
85  virtual SEScalarVolume& GetVolume();
86  virtual double GetVolume(const VolumeUnit& unit) const;
87 
88  virtual bool HasSubstanceQuantities() const;
89  virtual bool HasSubstanceQuantity(const SESubstance& substance) const;
90  virtual SubstanceQuantityType* GetSubstanceQuantity(const SESubstance& substance) const;
91  virtual const std::vector<SubstanceQuantityType*>& GetSubstanceQuantities() const;
92  virtual void ZeroSubstanceQuantities();
93 
94  virtual void AddLink(LinkType& link);
95  virtual void RemoveLink(LinkType& link);
96  virtual void RemoveLinks();
97  virtual const std::vector<LinkType*>& GetLinks();
98 
99  virtual bool HasChild(const char* name);
100  virtual bool HasChild(const std::string& name);
101 
102 protected:
103  virtual void RemoveSubstanceQuantity(const SESubstance& substance);
104 
105  virtual bool HasQuantity() const override{ return HasVolume(); }
106  virtual SEScalarVolume& GetQuantity() override { return GetVolume(); }
107 
108  virtual double CalculateInFlow_mL_Per_s() const;
109  virtual double CalculateOutFlow_mL_Per_s() const;
110 
111  virtual std::vector<TransportSubstanceType*>& GetTransportSubstances() override { return m_TransportSubstances; }
112 
117 
118  std::vector<SubstanceQuantityType*> m_SubstanceQuantities;
119  std::vector<TransportSubstanceType*> m_TransportSubstances;
120 
121  std::vector<LinkType*> m_Links;
122  std::vector<LinkType*> m_IncomingLinks;
123  std::vector<LinkType*> m_OutgoingLinks;
124  std::vector<SEFluidCompartment*> m_FluidChildren;
126 };
127 }
std::vector< LinkType * > m_Links
Definition: SEFluidCompartment.h:121
virtual bool HasMapping() const
Definition: SECompartmentNodes.h:33
SEScalarVolume * m_Volume
Definition: SEFluidCompartment.h:116
virtual bool HasNodeMapping() const
Definition: SEFluidCompartment.h:68
virtual bool HasOutFlow() const
Definition: SEScalar.h:33
virtual bool Load(const CDM::FluidCompartmentData &in, SECircuitManager *circuits=nullptr)
SEScalarPressure * m_Pressure
Definition: SEFluidCompartment.h:115
virtual std::vector< TransportSubstanceType * > & GetTransportSubstances() override
Definition: SEFluidCompartment.h:111
std::vector< SubstanceQuantityType * > m_SubstanceQuantities
Definition: SEFluidCompartment.h:118
virtual void RemoveSubstanceQuantity(const SESubstance &substance)
virtual double CalculateOutFlow_mL_Per_s() const
virtual bool HasChild(const char *name)
Definition: SEFluidCompartment.h:39
virtual void AddLink(LinkType &link)
std::vector< TransportSubstanceType * > m_TransportSubstances
Definition: SEFluidCompartment.h:119
virtual const std::vector< LinkType * > & GetLinks()
virtual bool HasQuantity() const override
Definition: SEFluidCompartment.h:105
virtual bool HasPressure() const
virtual const std::vector< SubstanceQuantityType * > & GetSubstanceQuantities() const
const char * GetName_cStr() const override
Definition: SEScalarVolumePerTime.h:18
virtual bool HasVolume() const
virtual const SEScalarVolumePerTime & GetInFlow()
std::string GetName() const override
virtual bool HasSubstanceQuantity(const SESubstance &substance) const
SEScalarVolumePerTime * m_OutFlow
Definition: SEFluidCompartment.h:114
Definition: Logger.h:75
virtual void ZeroSubstanceQuantities()
Definition: SEFluidCircuitNode.h:21
virtual double CalculateInFlow_mL_Per_s() const
Class corresponding to the FluidCompartmentData schema type.
Definition: Compartment.hxx:1827
Definition: SEScalarVolume.h:18
virtual SEScalarVolume & GetQuantity() override
Definition: SEFluidCompartment.h:106
Definition: SEScalarPressure.h:37
Definition: SEScalarVolume.h:37
const SEScalar * GetScalar(const char *name) override
Definition: SESubstance.h:49
SECompartmentNodes< FLUID_COMPARTMENT_NODE > m_Nodes
Definition: SEFluidCompartment.h:125
Definition: SEScalarVolumePerTime.h:40
Definition: SECompartment.h:31
Definition: SECompartmentGraph.h:25
virtual const SEScalarVolumePerTime & GetOutFlow()
virtual SubstanceQuantityType * GetSubstanceQuantity(const SESubstance &substance) const
std::vector< LinkType * > m_OutgoingLinks
Definition: SEFluidCompartment.h:123
virtual SECompartmentNodes< FLUID_COMPARTMENT_NODE > & GetNodeMapping()
Definition: SEFluidCompartment.h:69
Definition: SEScalarPressure.h:18
virtual SEScalarVolume & GetVolume()
bool HasChildren() const override
Definition: SEFluidCompartment.h:66
SEFluidCompartment(const char *name, Logger *logger)
virtual void RemoveLink(LinkType &link)
Definition: SEElectricalCircuit.h:18
std::vector< LinkType * > m_IncomingLinks
Definition: SEFluidCompartment.h:122
Definition: SECircuitManager.h:53
virtual bool HasSubstanceQuantities() const
virtual bool HasInFlow() const
CDM::FluidCompartmentData * Unload() override=0
std::vector< SEFluidCompartment * > m_FluidChildren
Definition: SEFluidCompartment.h:124
virtual SEScalarPressure & GetPressure()
virtual void MapNode(SEFluidCircuitNode &node)
SEScalarVolumePerTime * m_InFlow
Definition: SEFluidCompartment.h:113