SESubstanceTransport.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 #ifdef MSVC
15 #pragma warning(disable : 4503)
16 #endif
17 
18 #include <biogears/cdm/CommonDataModel.h>
19 #include "biogears/cdm/properties/SEScalarVolumePerTime.h"
20 #include "biogears/cdm/properties/SEScalarMass.h"
21 #include "biogears/cdm/properties/SEScalarMassPerVolume.h"
22 #include "biogears/cdm/properties/SEScalarVolume.h"
23 #include "biogears/cdm/properties/SEScalarFraction.h"
24 
25 namespace biogears {
26 #define SUBSTANCE_TRANSPORTER_TEMPLATE typename GraphType, typename FluxUnit, typename QuantityUnit, typename ExtensiveUnit, typename IntensiveUnit
27 #define TRANSPORT_AMOUNT_TYPES ExtensiveScalar, IntensiveScalar
28 template <typename ExtensiveScalar, typename IntensiveScalar>
30  template <SUBSTANCE_TRANSPORTER_TEMPLATE>
31  friend class SESubstanceTransporter;
32 
33 public:
35 
36  virtual void Invalidate() = 0;
37 
38  virtual bool HasExtensive() const = 0;
39  virtual ExtensiveScalar& GetExtensive() = 0;
40 
41  virtual bool HasIntensive() const = 0;
42  virtual IntensiveScalar& GetIntensive() = 0;
43 };
46 
47 #define TRANSPORT_VERTEX_TYPES QuantityScalar, ExtensiveScalar, IntensiveScalar
48 template <typename QuantityScalar, typename ExtensiveScalar, typename IntensiveScalar>
50  template <SUBSTANCE_TRANSPORTER_TEMPLATE>
51  friend class SESubstanceTransporter;
52 
53 public:
55 
56  virtual std::string GetName() const = 0;
57  virtual const char* GetName_cStr() const = 0;
58 
59 protected:
60  virtual bool HasQuantity() const = 0;
61  virtual QuantityScalar& GetQuantity() = 0;
62 
63  virtual std::vector<SESubstanceTransportAmount<TRANSPORT_AMOUNT_TYPES>*>& GetTransportSubstances() = 0;
64 };
67 
68 #define TRANSPORT_EDGE_TYPES FluxScalar, QuantityScalar, ExtensiveScalar, IntensiveScalar
69 template <typename FluxScalar, typename QuantityScalar, typename ExtensiveScalar, typename IntensiveScalar>
71  template <SUBSTANCE_TRANSPORTER_TEMPLATE>
72  friend class SESubstanceTransporter;
73 
74 public:
76 
77  virtual std::string GetName() const = 0;
78  virtual const char* GetName_cStr() const = 0;
79 
80 protected:
81  virtual bool HasFlux() const = 0;
82  virtual FluxScalar& GetFlux() = 0;
83 
86 };
89 
90 template <typename FluxScalar, typename QuantityScalar, typename ExtensiveScalar, typename IntensiveScalar>
92  template <SUBSTANCE_TRANSPORTER_TEMPLATE>
93  friend class SESubstanceTransporter;
94 
95 public:
97 
98 protected:
99  virtual void BalanceByIntensive() = 0; // Transporter calculates the new concentration
100  virtual size_t GetVertexIndex(const SESubstanceTransportVertex<TRANSPORT_VERTEX_TYPES>& v) const = 0;
101  virtual const std::vector<SESubstanceTransportVertex<TRANSPORT_VERTEX_TYPES>*>& GetVerticies() const = 0;
102  virtual const std::vector<SESubstanceTransportEdge<TRANSPORT_EDGE_TYPES>*>* GetSourceEdges(const SESubstanceTransportVertex<TRANSPORT_VERTEX_TYPES>& v) const = 0;
103  virtual const std::vector<SESubstanceTransportEdge<TRANSPORT_EDGE_TYPES>*>* GetTargetEdges(const SESubstanceTransportVertex<TRANSPORT_VERTEX_TYPES>& v) const = 0;
104 };
107 
108 template <SUBSTANCE_TRANSPORTER_TEMPLATE>
110 public:
111  SESubstanceTransporter(const FluxUnit& fUnit, const QuantityUnit& qUnit, const ExtensiveUnit& eUnit, const IntensiveUnit& iUnit, Logger* logger);
113 
114  void Transport(GraphType& graph, double timeStep_s);
115 
116 protected:
117  const FluxUnit& m_FluxUnit;
118  const QuantityUnit& m_QuantityUnit;
119  const ExtensiveUnit& m_ExtensiveUnit;
120  const IntensiveUnit& m_IntensiveUnit;
121 };
122 
125 
126 }
127 
128 #include <biogears/cdm/substance/SESubstanceTransport.inl>
Definition: SESubstanceTransport.h:29
virtual bool HasIntensive() const =0
const QuantityUnit & m_QuantityUnit
Definition: SESubstanceTransport.h:118
const ExtensiveUnit & m_ExtensiveUnit
Definition: SESubstanceTransport.h:119
virtual SESubstanceTransportVertex< TRANSPORT_VERTEX_TYPES > & GetSourceVertex()=0
virtual ExtensiveScalar & GetExtensive()=0
virtual const std::vector< SESubstanceTransportVertex< TRANSPORT_VERTEX_TYPES > * > & GetVerticies() const =0
Definition: SESubstanceTransport.h:91
virtual const char * GetName_cStr() const =0
virtual size_t GetVertexIndex(const SESubstanceTransportVertex< TRANSPORT_VERTEX_TYPES > &v) const =0
virtual std::string GetName() const =0
virtual const std::vector< SESubstanceTransportEdge< TRANSPORT_EDGE_TYPES > * > * GetTargetEdges(const SESubstanceTransportVertex< TRANSPORT_VERTEX_TYPES > &v) const =0
const FluxUnit & m_FluxUnit
Definition: SESubstanceTransport.h:117
void Transport(GraphType &graph, double timeStep_s)
virtual ~SESubstanceTransportEdge()
Definition: SESubstanceTransport.h:75
Definition: Logger.h:27
virtual std::string GetName() const =0
Definition: Logger.h:75
virtual FluxScalar & GetFlux()=0
virtual IntensiveScalar & GetIntensive()=0
SESubstanceTransporter(const FluxUnit &fUnit, const QuantityUnit &qUnit, const ExtensiveUnit &eUnit, const IntensiveUnit &iUnit, Logger *logger)
virtual const char * GetName_cStr() const =0
virtual ~SESubstanceTransportVertex()
Definition: SESubstanceTransport.h:54
virtual ~SESubstanceTransportAmount()
Definition: SESubstanceTransport.h:34
virtual ~SESubstanceTransporter()
Definition: SESubstanceTransport.h:112
virtual SESubstanceTransportVertex< TRANSPORT_VERTEX_TYPES > & GetTargetVertex()=0
virtual ~SESubstanceTransportGraph()
Definition: SESubstanceTransport.h:96
Definition: SESubstanceTransport.h:49
virtual bool HasFlux() const =0
virtual std::vector< SESubstanceTransportAmount< TRANSPORT_AMOUNT_TYPES > * > & GetTransportSubstances()=0
Definition: SESubstanceTransport.h:109
Definition: SESubstanceTransport.h:70
Definition: SEElectricalCircuit.h:18
virtual bool HasExtensive() const =0
const IntensiveUnit & m_IntensiveUnit
Definition: SESubstanceTransport.h:120
virtual QuantityScalar & GetQuantity()=0
virtual const std::vector< SESubstanceTransportEdge< TRANSPORT_EDGE_TYPES > * > * GetSourceEdges(const SESubstanceTransportVertex< TRANSPORT_VERTEX_TYPES > &v) const =0
virtual bool HasQuantity() const =0