SECircuitCalculator.h
1/* Distributed under the Apache License, Version 2.0.
2 See accompanying NOTICE file for details.*/
3
4#pragma once
5#include "cdm/utils/SmartEnum.h"
6
7#define CIRCUIT_CALCULATOR_TEMPLATE typename CircuitType, typename NodeType, typename PathType, \
8 typename CapacitanceUnit, typename FluxUnit, typename InductanceUnit, \
9 typename PotentialUnit, typename QuantityUnit, typename ResistanceUnit
10#define CIRCUIT_CALCULATOR_TYPES CircuitType,NodeType,PathType,CapacitanceUnit,FluxUnit,InductanceUnit,PotentialUnit,QuantityUnit,ResistanceUnit
11
12class eigen; // Encapsulate eigen in pimpl pattern
13
14// These are the Eigen Solvers we can use for solving our circuits
15struct CDM_DECL EigenCircuitSolver
16{
17 enum Type { Direct, PartialPivLu, FullPivLu, JacobiSvd, HouseholderQr, Ldlt, Llt, SparseLU, SparseQR, BiCGSTAB, ConjugateGradient };
19 static char const* Value(size_t idx);
20};
21
22template<CIRCUIT_CALCULATOR_TEMPLATE>
24{
25public:
26 SECircuitCalculator(const CapacitanceUnit& c, const FluxUnit& f, const InductanceUnit& i, const PotentialUnit& p, const QuantityUnit& q, const ResistanceUnit& r, Logger* logger);
27 virtual ~SECircuitCalculator();
28
31
32 // Analysis of the Circuit dynamics
33 virtual void Process(CircuitType& circuit, double timeStep_s);
34 virtual void PostProcess(CircuitType& circuit);
35
36protected:
37 virtual void ParseIn();
38 virtual bool Solve();
39 virtual void ParseOut();
40 virtual void CalculateFluxes();
41 virtual void CalculateQuantities();
42
43 virtual void ParseInPotentialSources();
44
45 virtual void Verbose(std::string location);
46
47 // Valve Support
48 virtual bool CheckAndModifyValves(bool solverPassed);
49 virtual bool IsCurrentValveStateUnique();
50 // Eigen Support
51 virtual void PopulateAMatrix(NodeType& nKCL, PathType& p, double dMultiplier, bool hasPotentialSource = false);
52 // These are all transient and cleared/set at the start of the process call
53
54 std::stringstream m_ss;
55
56 double m_dT_s;
59 CircuitType* m_circuit;
61 std::set<uint64_t> m_valveStates;
62 std::map<PathType*, size_t> m_potentialSources;
63 std::map<NodeType*, size_t> m_blackBoxPotentialSources;
64
65 const CapacitanceUnit &m_CapacitanceUnit;
66 const FluxUnit &m_FluxUnit;
67 const InductanceUnit &m_InductanceUnit;
68 const PotentialUnit &m_PotentialUnit;
69 const QuantityUnit &m_QuantityUnit;
70 const ResistanceUnit &m_ResistanceUnit;
71
72private:
74};
Definition: Logger.h:23
Definition: Logger.h:71
Definition: SECircuitCalculator.h:24
std::map< NodeType *, size_t > m_blackBoxPotentialSources
Definition: SECircuitCalculator.h:63
double m_refPotential
Definition: SECircuitCalculator.h:58
virtual void CalculateFluxes()
Calculate and set all Path Flux values.
Definition: SECircuitCalculator.cpp:812
virtual void PopulateAMatrix(NodeType &nKCL, PathType &p, double dMultiplier, bool hasPotentialSource=false)
Add a value to the appropriate location in the A matrix.
Definition: SECircuitCalculator.cpp:1045
std::map< PathType *, size_t > m_potentialSources
Definition: SECircuitCalculator.h:62
virtual void CalculateQuantities()
Calculate and set all Path Quantities.
Definition: SECircuitCalculator.cpp:897
double m_currentTime_s
Definition: SECircuitCalculator.h:57
virtual ~SECircuitCalculator()
Definition: SECircuitCalculator.cpp:69
virtual void SetEigenSolver(EigenCircuitSolver::Type t)
Definition: SECircuitCalculator.h:30
const PotentialUnit & m_PotentialUnit
Definition: SECircuitCalculator.h:68
virtual void SetEigenSolver(EigenCircuitSolver s)
Definition: SECircuitCalculator.h:29
std::set< uint64_t > m_valveStates
Definition: SECircuitCalculator.h:61
SECircuitCalculator(const CapacitanceUnit &c, const FluxUnit &f, const InductanceUnit &i, const PotentialUnit &p, const QuantityUnit &q, const ResistanceUnit &r, Logger *logger)
Definition: SECircuitCalculator.cpp:51
virtual void Process(CircuitType &circuit, double timeStep_s)
Calculates the Next circuit values.
Definition: SECircuitCalculator.cpp:84
virtual void ParseInPotentialSources()
Definition: SECircuitCalculator.cpp:1153
std::stringstream m_ss
Definition: SECircuitCalculator.h:54
virtual void PostProcess(CircuitType &circuit)
Advances time.
Definition: SECircuitCalculator.cpp:1115
virtual void ParseIn()
Set up the equations to solve the circuit.
Definition: SECircuitCalculator.cpp:158
virtual bool IsCurrentValveStateUnique()
Check if the current Valve state combination has already been analyzed.
Definition: SECircuitCalculator.cpp:1004
virtual void ParseOut()
Assign the Solver solution vector values to the appropriate places.
Definition: SECircuitCalculator.cpp:732
const InductanceUnit & m_InductanceUnit
Definition: SECircuitCalculator.h:67
const QuantityUnit & m_QuantityUnit
Definition: SECircuitCalculator.h:69
virtual void Verbose(std::string location)
Definition: SECircuitCalculator.cpp:1186
const FluxUnit & m_FluxUnit
Definition: SECircuitCalculator.h:66
virtual bool Solve()
Solve for unknowns.
Definition: SECircuitCalculator.cpp:545
double m_dT_s
Definition: SECircuitCalculator.h:56
const ResistanceUnit & m_ResistanceUnit
Definition: SECircuitCalculator.h:70
const CapacitanceUnit & m_CapacitanceUnit
Definition: SECircuitCalculator.h:65
CircuitType * m_circuit
Definition: SECircuitCalculator.h:59
eigen * _eigen
Definition: SECircuitCalculator.h:73
EigenCircuitSolver m_solver
Definition: SECircuitCalculator.h:60
virtual bool CheckAndModifyValves(bool solverPassed)
Check if the solutions meets all Valve criteria, and modify a Valve state if not.
Definition: SECircuitCalculator.cpp:942
Definition: SECircuitCalculator.cpp:30
Definition: SECircuitCalculator.h:16
SMART_ENUM(EigenCircuitSolver, Type, 11)
Type
Definition: SECircuitCalculator.h:17
@ BiCGSTAB
Definition: SECircuitCalculator.h:17

Distributed under the Apache License, Version 2.0.

See accompanying NOTICE file for details.