DPsim
Loading...
Searching...
No Matches
StateSpaceModalAnalysis.h
1// SPDX-FileCopyrightText: 2026 Institute for Automation of Complex Power Systems, EONERC, RWTH Aachen University
2// SPDX-License-Identifier: MPL-2.0
3#pragma once
4
5#include <dpsim/Definitions.h>
6#include <dpsim/MNAStateSpaceExtractor.h>
7
8#include <vector>
9
10namespace DPsim {
11
12enum class StateSpaceAnalysisFrame {
13 Native,
14 GlobalDQ0,
15};
16
24class StateSpaceModalAnalysis {
25public:
26 explicit StateSpaceModalAnalysis(const MNAStateSpaceExtractor &extractor);
27
32 void setAnalysisFrame(StateSpaceAnalysisFrame frame) {
33 mAnalysisFrame = frame;
34 }
35
40 void setGlobalDq0Frame(Real omega, Real theta0 = 0.0) {
41 mGlobalOmega = omega;
42 mGlobalTheta0 = theta0;
43 }
44
46 void update();
47
49 const CPS::VectorComp &getDiscreteEigenvalues() const {
50 return mDiscreteEigenvalues;
51 }
52
54 const CPS::VectorComp &getContinuousEigenvalues() const {
55 return mContinuousEigenvalues;
56 }
57
62 const CPS::MatrixComp &getRightEigenvectors() const {
63 return mRightEigenvectors;
64 }
65
70 const CPS::MatrixComp &getLeftEigenvectors() const {
71 return mLeftEigenvectors;
72 }
73
81 const CPS::MatrixComp &getParticipationFactors() const {
82 return mParticipationFactors;
83 }
84
89 const std::vector<String> &getStateNames() const { return mStateNames; }
90
91private:
92 Matrix buildDiscreteStateMatrixInAnalysisFrame() const;
93
94 Matrix buildGlobalDq0Transformation(Real theta) const;
95
96 std::vector<String> buildStateNamesInAnalysisFrame() const;
97
98 Complex mapDiscreteToContinuous(const Complex &z) const;
99
100 const MNAStateSpaceExtractor &mExtractor;
101
102 StateSpaceAnalysisFrame mAnalysisFrame = StateSpaceAnalysisFrame::Native;
103
104 Real mGlobalOmega = 0.0;
105
106 Real mGlobalTheta0 = 0.0;
107
108 CPS::VectorComp mDiscreteEigenvalues;
109
110 CPS::VectorComp mContinuousEigenvalues;
111
112 CPS::MatrixComp mRightEigenvectors;
113 CPS::MatrixComp mLeftEigenvectors;
114 CPS::MatrixComp mParticipationFactors;
115
116 std::vector<String> mStateNames;
117};
118
119} // namespace DPsim
void setAnalysisFrame(StateSpaceAnalysisFrame frame)
const std::vector< String > & getStateNames() const
const CPS::VectorComp & getContinuousEigenvalues() const
Continuous-time equivalent eigenvalues reconstructed from discrete eigenvalues.
const CPS::VectorComp & getDiscreteEigenvalues() const
Eigenvalues of the extracted discrete-time state matrix in the selected analysis frame.
void update()
Update modal quantities from the current extracted state matrix.
void setGlobalDq0Frame(Real omega, Real theta0=0.0)
const CPS::MatrixComp & getLeftEigenvectors() const
const CPS::MatrixComp & getRightEigenvectors() const
const CPS::MatrixComp & getParticipationFactors() const