Harmony
HARMONic stabilitY assessment of PE-penetrated power systems
Loading...
Searching...
No Matches
Converter.h
Go to the documentation of this file.
1#ifndef _CONVERTER_H_
2#define _CONVERTER_H_
3
9#include "../Element.h"
10#include "../../Include_control_blocks.h"
11
17class Converter : public Element {
18public:
19
25 Converter(const std::string& symbol, const std::string& location)
26 : Element(symbol, location, 3, 2) {}
27
28 virtual ~Converter();
29
30 // Continuous-time matrix getters
31 Eigen::MatrixXd getA() const { return A_matrix; }
32 Eigen::MatrixXd getB() const { return B_matrix; }
33 Eigen::MatrixXd getC() const { return C_matrix; }
34 Eigen::MatrixXd getD() const { return D_matrix; }
35
36 // Discrete-time matrix getters
37 Eigen::MatrixXd getAd() const { return Ad_matrix; }
38 Eigen::MatrixXd getBd() const { return Bd_matrix; }
39 Eigen::MatrixXd getCd() const { return Cd_matrix; }
40 Eigen::MatrixXd getDd() const { return Dd_matrix; }
41
42 Eigen::VectorXd getEquilibriumState() const { return equilibrium_state; }
43 VectorXcd getEigenvalues() { return eigenvalues; }
44 VectorXcd getEigenvectors() { return eigenvectors; }
45 string getACarea() const {
46 auto pos = element_location.find('_');
47 return element_location.substr(0, pos);
48 } // Get AC area from location string
49 string getDCarea() const {
50 auto pos = element_location.find('_');
51 return element_location.substr(pos + 1);
52 } // Get DC area from location string
53
54
55 // Solvers
56 virtual void solveEquilibrium() {};
57
58 virtual void computeABCD() {};
60
61
62 virtual Eigen::MatrixXd computeStateDerivatives(const Eigen::VectorXd& x, const Eigen::VectorXd& u) {
63 return Eigen::MatrixXd::Zero(1, 1);
64 };
66 Eigen::EigenSolver<Eigen::MatrixXd> es(A_matrix);
67 eigenvalues = es.eigenvalues();
68 eigenvectors = es.eigenvectors();
69 }
70
71 // Compute participation factors from the state matrix A
72 // Returns: MatrixXd (n x n) where P(i,j) is participation of state i in mode j
73 Eigen::MatrixXd computeParticipationFactors(const Eigen::MatrixXd& A_matrix) {
74 // Step 1: Eigen decomposition
75 Eigen::EigenSolver<Eigen::MatrixXd> es(A_matrix);
76
77 Eigen::MatrixXcd V = es.eigenvectors(); // Right eigenvectors
78 Eigen::VectorXcd lambda = es.eigenvalues(); // Eigenvalues
79 Eigen::MatrixXcd W = V.inverse(); // Left eigenvectors (transpose of inverse if needed)
80
81 const int n = A_matrix.rows();
82 Eigen::MatrixXd P(n, n);
83
84 // Step 2: Compute participation factors
85 // P_ij = |phi_ij * psi_ji|
86 for (int i = 0; i < n; ++i) {
87 for (int j = 0; j < n; ++j) {
88 std::complex<double> val = V(i, j) * W(j, i);
89 P(i, j) = std::abs(val);
90 }
91 }
92
93 // Step 3: Normalize participation factors (optional)
94 for (int j = 0; j < n; ++j) {
95 double col_sum = P.col(j).sum();
96 if (col_sum > 0.0) {
97 P.col(j) /= col_sum;
98 }
99 }
100
101 return P;
102 }
103
104 // Time-domain simulation
105 virtual vector<MatrixXcd> simulateTimeStep(const vector<MatrixXcd>& input, double Ts, int nKeep1, int nKeep2) { return vector<MatrixXcd>(1, MatrixXcd::Zero(1, 1)); }
106
107 // System analysis
108 void checkStability() const;
109 void printEigenvalues() const;
110
111 // Plotting
112 virtual void plotEigenvalues() override;
113 virtual void plotParticipationFactors() override;
114
115
116protected:
117 double omega_0; // Nominal frequency
118 double P; // Active power [W]
119 double Q; // Reactive power [VA]
120 double P_dc; // DC power [W]
121 double P_min; // Min active power output [W]
122 double P_max; // Max active power output [W]
123 double Q_min; // Min reactive power output [VA]
124 double Q_max; // Max reactive power output [VA]
125 double theta; // AC voltage angle [rad]
126 double V_m; // AC voltage amplitude [V]
127 double V_dc; // DC-bus voltage [V]
128 double L_reactor; // Inductance of the phase reactor [H]
129 double R_reactor; // Resistance of the phase reactor [Omega]
130 double t_delay; // Time delay [s]
131
132 // System matrices
133 MatrixXd A_matrix, B_matrix, C_matrix, D_matrix; // Continuous-time system matrices
134 MatrixXd Adelay, Bdelay, Cdelay, Ddelay; // Delay system matrices
135 MatrixXd Ad_matrix, Bd_matrix, Cd_matrix, Dd_matrix; // Discrete system matrices
136
137 int pade_order = 2; // Order of Padé approximation for delays
139 VectorXcd eigenvalues;
140 VectorXcd eigenvectors;
141
142 VectorXcd initial_state; // Initial state for time-domain simulations
143
144
145 std::map<std::string, Controller*> controls; // Map of existing controllers
146 std::map<std::string, Filter*> filters; // Map of existing filters
147
148 // List of controller and filter names, it can be changed only by developers
149 const std::vector<std::string> controller_list = {
150 "pll", "dc_voltage", "active_power", "ac_voltage", "reactive_power", "energy", "zcc", "occ", "ccc",
151 "droop"
152 }; // List of controller names
153 const std::vector<std::string> filter_list = {
154 "ac_voltage_dq", "ac_voltage", "active_power", "reactive_power", "dc_voltage"
155 }; // List of filter names
156
157
158
159
160
161};
162
163#endif // _CONVERTER_H_
void discretizeABCD(const Eigen::MatrixXd &A, const Eigen::MatrixXd &B, const Eigen::MatrixXd &C, const Eigen::MatrixXd &D, double Ts, Eigen::MatrixXd &Ad, Eigen::MatrixXd &Bd, Eigen::MatrixXd &Cd, Eigen::MatrixXd &Dd)
Discretizes a continuous-time state-space model using the Tustin (bilinear) method.
Definition Differential_equations.cpp:449
RCP< const Basic > j
Imaginary unit j.
Definition Symbolic_functions.cpp:9
Abstract power converter with ABCD matrices, controllers, and filters.
Definition Converter.h:17
VectorXcd eigenvalues
Definition Converter.h:139
Eigen::MatrixXd getC() const
Definition Converter.h:33
double P_dc
Definition Converter.h:120
virtual void discretize(double Ts)
Definition Converter.h:59
const std::vector< std::string > controller_list
Definition Converter.h:149
MatrixXd D_matrix
Definition Converter.h:133
void checkStability() const
Check system stability by evaluating eigenvalues of the A matrix.
Definition Converter.cpp:27
VectorXd equilibrium_state
Definition Converter.h:138
MatrixXd Cd_matrix
Definition Converter.h:135
Eigen::MatrixXd getD() const
Definition Converter.h:34
virtual Eigen::MatrixXd computeStateDerivatives(const Eigen::VectorXd &x, const Eigen::VectorXd &u)
Definition Converter.h:62
MatrixXd Bd_matrix
Definition Converter.h:135
VectorXcd eigenvectors
Definition Converter.h:140
Eigen::MatrixXd getB() const
Definition Converter.h:32
double R_reactor
Definition Converter.h:129
MatrixXd Dd_matrix
Definition Converter.h:135
double Q_max
Definition Converter.h:124
MatrixXd Ad_matrix
Definition Converter.h:135
double omega_0
Definition Converter.h:117
MatrixXd Cdelay
Definition Converter.h:134
Eigen::MatrixXd computeParticipationFactors(const Eigen::MatrixXd &A_matrix)
Definition Converter.h:73
double Q
Definition Converter.h:119
double t_delay
Definition Converter.h:130
string getDCarea() const
Definition Converter.h:49
double L_reactor
Definition Converter.h:128
virtual vector< MatrixXcd > simulateTimeStep(const vector< MatrixXcd > &input, double Ts, int nKeep1, int nKeep2)
Definition Converter.h:105
Eigen::VectorXd getEquilibriumState() const
Definition Converter.h:42
double P_max
Definition Converter.h:122
Eigen::MatrixXd getA() const
Definition Converter.h:31
MatrixXd Bdelay
Definition Converter.h:134
VectorXcd initial_state
Definition Converter.h:142
string getACarea() const
Definition Converter.h:45
double V_m
Definition Converter.h:126
virtual ~Converter()
Definition Converter.cpp:8
MatrixXd B_matrix
Definition Converter.h:133
virtual void plotParticipationFactors() override
Plot participation factors (override in state-space elements).
Definition Converter.cpp:76
double theta
Definition Converter.h:125
VectorXcd getEigenvalues()
Definition Converter.h:43
Eigen::MatrixXd getCd() const
Definition Converter.h:39
Eigen::MatrixXd getBd() const
Definition Converter.h:38
virtual void plotEigenvalues() override
Plot eigenvalues in the complex plane.
Definition Converter.cpp:67
double P_min
Definition Converter.h:121
double P
Definition Converter.h:118
void computeEigenvalues()
Definition Converter.h:65
Converter(const std::string &symbol, const std::string &location)
Construct a three-phase, two-terminal converter element.
Definition Converter.h:25
double V_dc
Definition Converter.h:127
MatrixXd A_matrix
Definition Converter.h:133
MatrixXd Ddelay
Definition Converter.h:134
const std::vector< std::string > filter_list
Definition Converter.h:153
double Q_min
Definition Converter.h:123
Eigen::MatrixXd getDd() const
Definition Converter.h:40
Eigen::MatrixXd getAd() const
Definition Converter.h:37
std::map< std::string, Controller * > controls
Definition Converter.h:145
std::map< std::string, Filter * > filters
Definition Converter.h:146
virtual void solveEquilibrium()
Definition Converter.h:56
virtual void computeABCD()
Definition Converter.h:58
MatrixXd Adelay
Definition Converter.h:134
void printEigenvalues() const
Print eigenvalues of the A matrix.
Definition Converter.cpp:54
VectorXcd getEigenvectors()
Definition Converter.h:44
MatrixXd C_matrix
Definition Converter.h:133
int pade_order
Definition Converter.h:137
Base class for multi-phase network elements with Y-parameters and MNA stamping hooks.
Definition Element.h:29
std::string element_location
Definition Element.h:282