SECircuitCalculator.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 <Eigen/Core>
15 #include <biogears/cdm/circuit/SECircuit.h>
16 #include <biogears/cdm/utils/SmartEnum.h>
17 #include <biogears/cdm/utils/TimingProfile.h>
18 
19 #define CIRCUIT_CALCULATOR_TEMPLATE typename CircuitType, typename NodeType, typename PathType, typename CapacitanceUnit, typename FluxUnit, typename InductanceUnit, typename PotentialUnit, typename QuantityUnit, typename ResistanceUnit
20 #define CIRCUIT_CALCULATOR_TYPES CircuitType, NodeType, PathType, CapacitanceUnit, FluxUnit, InductanceUnit, PotentialUnit, QuantityUnit, ResistanceUnit
21 
22 namespace biogears {
23 // These are the Eigen Solvers we can use for solving our circuits
24 struct BIOGEARS_API EigenCircuitSolver {
25  enum Type { Direct,
31  Llt,
35  ConjugateGradient };
36  SMART_ENUM(EigenCircuitSolver, Type, 11);
37  static char const* Value(size_t idx);
38 };
39 
40 template <CIRCUIT_CALCULATOR_TEMPLATE>
41 class SECircuitCalculator : public Loggable {
42 public:
43  SECircuitCalculator(const CapacitanceUnit& c, const FluxUnit& f, const InductanceUnit& i, const PotentialUnit& p, const QuantityUnit& q, const ResistanceUnit& r, Logger* logger);
44  virtual ~SECircuitCalculator();
45 
46  virtual void SetEigenSolver(EigenCircuitSolver s) { m_solver = s; };
47  virtual void SetEigenSolver(EigenCircuitSolver::Type t) { m_solver.set(t); };
48 
49  // Analysis of the Circuit dynamics
50  virtual void Process(CircuitType& circuit, double timeStep_s);
51  virtual void PostProcess(CircuitType& circuit);
52 
53 protected:
54  virtual void ParseIn();
55  virtual void Solve();
56  virtual void ParseOut();
57  virtual void CalculateFluxes();
58  virtual void CalculateQuantities();
59 
60  // Valve Support
61  virtual bool CheckAndModifyValves();
62  virtual bool IsCurrentValveStateUnique();
63  // Eigen Support
64  virtual void PopulateAMatrix(NodeType& nKCL, PathType& p, double dMultiplier, bool hasPotentialSource = false);
65 
66  // These are all transient and cleared/set at the start of the process call
67 
68  std::stringstream m_ss;
69  //Ax=b
70  Eigen::MatrixXd m_AMatrix; //A
71  Eigen::VectorXd m_xVector; //x
72  Eigen::VectorXd m_bVector; //b
73 
74  double m_dT_s;
75  CircuitType* m_circuit;
77  std::set<uint64_t> m_valveStates;
78  std::map<PathType*, size_t> m_potentialSources;
79 
80  const CapacitanceUnit& m_CapacitanceUnit;
81  const FluxUnit& m_FluxUnit;
82  const InductanceUnit& m_InductanceUnit;
83  const PotentialUnit& m_PotentialUnit;
84  const QuantityUnit& m_QuantityUnit;
85  const ResistanceUnit& m_ResistanceUnit;
86 };
87 }
88 #include <biogears/cdm/circuit/SECircuitCalculator.inl>
SECircuitCalculator(const CapacitanceUnit &c, const FluxUnit &f, const InductanceUnit &i, const PotentialUnit &p, const QuantityUnit &q, const ResistanceUnit &r, Logger *logger)
Eigen::VectorXd m_bVector
Definition: SECircuitCalculator.h:72
Type
Definition: SECircuitCalculator.h:25
const InductanceUnit & m_InductanceUnit
Definition: SECircuitCalculator.h:82
Definition: SECircuitCalculator.h:41
const ResistanceUnit & m_ResistanceUnit
Definition: SECircuitCalculator.h:85
std::map< PathType *, size_t > m_potentialSources
Definition: SECircuitCalculator.h:78
std::stringstream m_ss
Definition: SECircuitCalculator.h:68
const PotentialUnit & m_PotentialUnit
Definition: SECircuitCalculator.h:83
const CapacitanceUnit & m_CapacitanceUnit
Definition: SECircuitCalculator.h:80
Definition: SECircuitCalculator.h:34
Eigen::VectorXd m_xVector
Definition: SECircuitCalculator.h:71
Definition: SECircuitCalculator.h:28
CircuitType * m_circuit
Definition: SECircuitCalculator.h:75
virtual bool IsCurrentValveStateUnique()
virtual void SetEigenSolver(EigenCircuitSolver::Type t)
Definition: SECircuitCalculator.h:47
Definition: Logger.h:27
const QuantityUnit & m_QuantityUnit
Definition: SECircuitCalculator.h:84
Definition: SECircuitCalculator.h:24
virtual void SetEigenSolver(EigenCircuitSolver s)
Definition: SECircuitCalculator.h:46
double m_dT_s
Definition: SECircuitCalculator.h:74
Definition: Logger.h:75
Definition: SECircuitCalculator.h:27
Definition: SECircuitCalculator.h:26
virtual void PostProcess(CircuitType &circuit)
Definition: SECircuitCalculator.h:31
const FluxUnit & m_FluxUnit
Definition: SECircuitCalculator.h:81
Definition: SECircuitCalculator.h:29
virtual void CalculateQuantities()
virtual void PopulateAMatrix(NodeType &nKCL, PathType &p, double dMultiplier, bool hasPotentialSource=false)
virtual void Process(CircuitType &circuit, double timeStep_s)
std::set< uint64_t > m_valveStates
Definition: SECircuitCalculator.h:77
EigenCircuitSolver m_solver
Definition: SECircuitCalculator.h:76
virtual bool CheckAndModifyValves()
Eigen::MatrixXd m_AMatrix
Definition: SECircuitCalculator.h:70
Definition: SEElectricalCircuit.h:18
Definition: SECircuitCalculator.h:33
Definition: SECircuitCalculator.h:30
Definition: SECircuitCalculator.h:32