Skip to content

Commit 90efc5e

Browse files
committed
Add HYGOV phasor dynamics governor
1 parent 03b329f commit 90efc5e

20 files changed

Lines changed: 1710 additions & 0 deletions

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
- Added cmake-format hooks, including in pre-commit.
6363
- Added off-nominal tap ratio and phase shift support to the PhasorDynamics `Branch` model.
6464
- Added `REGCA` converter model implementation for PhasorDynamics.
65+
- Added `HYGOV` governor model implementation for PhasorDynamics.
6566

6667
## v0.1
6768

GridKit/Model/PhasorDynamics/ComponentLibrary.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <GridKit/Model/PhasorDynamics/Converter/REGCA/Regca.hpp>
88
#include <GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp>
99
#include <GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp>
10+
#include <GridKit/Model/PhasorDynamics/Governor/HYGOV/Hygov.hpp>
1011
#include <GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp>
1112
#include <GridKit/Model/PhasorDynamics/Load/Load.hpp>
1213
#include <GridKit/Model/PhasorDynamics/LoadZIP/LoadZIP.hpp>

GridKit/Model/PhasorDynamics/Governor/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
# ]]
55

66
add_subdirectory(Tgov1)
7+
add_subdirectory(HYGOV)
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# [[
2+
# Author(s):
3+
# - Luke Lowery <lukel@tamu.edu>
4+
# ]]
5+
6+
set(_install_headers Hygov.hpp HygovData.hpp)
7+
8+
if(GRIDKIT_ENABLE_ENZYME)
9+
gridkit_add_library(
10+
phasor_dynamics_governor_hygov
11+
SOURCES HygovEnzyme.cpp
12+
HEADERS ${_install_headers}
13+
INCLUDE_DIRECTORIES PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/magic-enum/include
14+
LINK_LIBRARIES
15+
PUBLIC
16+
GridKit::phasor_dynamics_core
17+
PUBLIC
18+
GridKit::phasor_dynamics_signal
19+
PRIVATE
20+
ClangEnzymeFlags
21+
COMPILE_OPTIONS
22+
PRIVATE
23+
-mllvm
24+
-enzyme-auto-sparsity=1
25+
-fno-math-errno)
26+
else()
27+
gridkit_add_library(
28+
phasor_dynamics_governor_hygov
29+
SOURCES Hygov.cpp
30+
HEADERS ${_install_headers}
31+
INCLUDE_DIRECTORIES PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/magic-enum/include
32+
LINK_LIBRARIES
33+
PUBLIC
34+
GridKit::phasor_dynamics_core
35+
PUBLIC
36+
GridKit::phasor_dynamics_signal)
37+
endif()
38+
39+
gridkit_add_library(
40+
phasor_dynamics_governor_hygov_dependency_tracking
41+
SOURCES HygovDependencyTracking.cpp
42+
INCLUDE_DIRECTORIES PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/magic-enum/include
43+
LINK_LIBRARIES
44+
PUBLIC
45+
GridKit::phasor_dynamics_core
46+
PUBLIC
47+
GridKit::phasor_dynamics_signal_dependency_tracking)
48+
49+
target_link_libraries(
50+
phasor_dynamics_components
51+
INTERFACE GridKit::phasor_dynamics_governor_hygov)
52+
target_link_libraries(
53+
phasor_dynamics_components_dependency_tracking
54+
INTERFACE GridKit::phasor_dynamics_governor_hygov_dependency_tracking)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* @file Hygov.cpp
3+
* @author Luke Lowery (lukel@tamu.edu)
4+
* @brief Non-Enzyme instantiation for the HYGOV governor model.
5+
*/
6+
7+
#include "HygovImpl.hpp"
8+
9+
namespace GridKit
10+
{
11+
namespace PhasorDynamics
12+
{
13+
namespace Governor
14+
{
15+
template <class ScalarT, typename IdxT>
16+
int Hygov<ScalarT, IdxT>::evaluateJacobian()
17+
{
18+
Log::misc() << "Evaluate Jacobian for Hygov..." << std::endl;
19+
Log::misc() << "Jacobian evaluation is not implemented!" << std::endl;
20+
return 0;
21+
}
22+
23+
template class Hygov<double, long int>;
24+
template class Hygov<double, size_t>;
25+
} // namespace Governor
26+
} // namespace PhasorDynamics
27+
} // namespace GridKit
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
/**
2+
* @file Hygov.hpp
3+
* @author Luke Lowery (lukel@tamu.edu)
4+
* @brief Declaration of the HYGOV governor model.
5+
*/
6+
7+
#pragma once
8+
9+
#include <array>
10+
#include <cstddef>
11+
#include <memory>
12+
#include <vector>
13+
14+
#include <GridKit/Model/PhasorDynamics/Component.hpp>
15+
#include <GridKit/Model/PhasorDynamics/ComponentSignals.hpp>
16+
#include <GridKit/Model/PhasorDynamics/Governor/HYGOV/HygovData.hpp>
17+
#include <GridKit/Model/VariableMonitor.hpp>
18+
19+
namespace GridKit
20+
{
21+
namespace PhasorDynamics
22+
{
23+
template <class ScalarT, typename IdxT>
24+
class SignalNode;
25+
26+
namespace Governor
27+
{
28+
/// Internal variables of a `Hygov`.
29+
enum class HygovInternalVariables : size_t
30+
{
31+
XN, ///< Speed lead-lag denominator state
32+
XF, ///< Governor error filter output
33+
C, ///< Desired-gate position
34+
G, ///< Gate position
35+
Q, ///< Turbine flow
36+
OMEGADB, ///< Deadbanded speed deviation
37+
YOMEGA, ///< Lead-lag-conditioned speed signal
38+
EF, ///< Governor error into the filter
39+
FC, ///< Desired-gate derivative target
40+
RC, ///< Rate-limited desired-gate derivative target
41+
PGV, ///< Nonlinear gate-to-power curve output
42+
PGVSAFE, ///< Safe gate-to-power value
43+
H, ///< Turbine head
44+
PMECH, ///< Mechanical-power output
45+
MAXIMUM,
46+
};
47+
48+
/// External variables of a `Hygov`.
49+
enum class HygovExternalVariables : size_t
50+
{
51+
OMEGA, ///< Machine speed deviation
52+
PREF, ///< Active-power/load reference
53+
PAUX, ///< Auxiliary power input
54+
MAXIMUM,
55+
};
56+
57+
template <class ScalarT, typename IdxT>
58+
class Hygov : public Component<ScalarT, IdxT>
59+
{
60+
using Component<ScalarT, IdxT>::alpha_;
61+
using Component<ScalarT, IdxT>::f_;
62+
using Component<ScalarT, IdxT>::gridkit_component_id_;
63+
using Component<ScalarT, IdxT>::J_;
64+
using Component<ScalarT, IdxT>::J_cols_buffer_;
65+
using Component<ScalarT, IdxT>::J_rows_buffer_;
66+
using Component<ScalarT, IdxT>::J_vals_buffer_;
67+
using Component<ScalarT, IdxT>::residual_indices_;
68+
using Component<ScalarT, IdxT>::size_;
69+
using Component<ScalarT, IdxT>::tag_;
70+
using Component<ScalarT, IdxT>::variable_indices_;
71+
using Component<ScalarT, IdxT>::wb_;
72+
using Component<ScalarT, IdxT>::y_;
73+
using Component<ScalarT, IdxT>::yp_;
74+
75+
public:
76+
using RealT = typename Component<ScalarT, IdxT>::RealT;
77+
using signal_type = SignalNode<ScalarT, IdxT>;
78+
using model_data_type = HygovData<RealT, IdxT>;
79+
using MonitorT = Model::VariableMonitor<Hygov, HygovData>;
80+
81+
Hygov();
82+
Hygov(const model_data_type& data);
83+
~Hygov();
84+
85+
int setGridKitComponentID(IdxT) override final;
86+
int allocate() override final;
87+
int verify() const override final;
88+
int initialize() override final;
89+
int tagDifferentiable() override final;
90+
int evaluateResidual() override final;
91+
int evaluateJacobian() override final;
92+
93+
auto getSignals()
94+
-> ComponentSignals<ScalarT,
95+
IdxT,
96+
HygovInternalVariables,
97+
HygovExternalVariables>&
98+
{
99+
return signals_;
100+
}
101+
102+
const Model::VariableMonitorBase* getMonitor() const override;
103+
104+
__attribute__((always_inline)) inline int evaluateInternalResidual(
105+
ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*);
106+
107+
private:
108+
void initModelParams(const model_data_type& data);
109+
void initializeMonitor();
110+
111+
ScalarT gatePower(ScalarT gate) const;
112+
RealT invertGatePower(RealT pgv) const;
113+
ScalarT toComponentBase(ScalarT value) const;
114+
ScalarT toPmechBase(ScalarT value) const;
115+
116+
RealT Trate_{0};
117+
RealT pmech_mva_base_{0};
118+
RealT Rperm_{0};
119+
RealT Rtemp_{0};
120+
RealT Tr_{0};
121+
RealT Tf_{0};
122+
RealT Tg_{0};
123+
RealT Velm_{0};
124+
RealT Gmax_{0};
125+
RealT Gmin_{0};
126+
RealT Tw_{0};
127+
RealT At_{0};
128+
RealT Dturb_{0};
129+
RealT Qnl_{0};
130+
RealT Tn_{0};
131+
RealT Tnp_{0};
132+
RealT leadlag_gain_{0};
133+
RealT db1_{0};
134+
RealT db2_{0};
135+
RealT Hdam_{1};
136+
std::array<RealT, 6> Gv_{};
137+
std::array<RealT, 6> Pgv_{};
138+
139+
IdxT parameter_error_count_{0};
140+
141+
ScalarT pref_set_{0};
142+
ScalarT paux_set_{0};
143+
144+
ComponentSignals<ScalarT, IdxT, HygovInternalVariables, HygovExternalVariables> signals_;
145+
std::unique_ptr<MonitorT> monitor_;
146+
147+
std::vector<ScalarT> ws_;
148+
std::vector<IdxT> ws_indices_;
149+
};
150+
} // namespace Governor
151+
} // namespace PhasorDynamics
152+
} // namespace GridKit
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/**
2+
* @file HygovData.hpp
3+
* @author Luke Lowery (lukel@tamu.edu)
4+
* @brief Modeling data for the HYGOV governor model.
5+
*/
6+
7+
#pragma once
8+
9+
#include <GridKit/Model/PhasorDynamics/ComponentData.hpp>
10+
11+
namespace GridKit
12+
{
13+
namespace PhasorDynamics
14+
{
15+
namespace Governor
16+
{
17+
/// Parameter keys for the HYGOV governor model.
18+
enum class HygovParameters
19+
{
20+
Trate, ///< Turbine-rating power base
21+
mva, ///< MVA base of the pmech signal
22+
Rperm, ///< Permanent droop
23+
Rtemp, ///< Temporary droop
24+
Tr, ///< Temporary-droop reset time constant
25+
Tf, ///< Governor error filter time constant
26+
Tg, ///< Gate servo time constant
27+
Velm, ///< Maximum desired-gate velocity magnitude
28+
Gmax, ///< Maximum desired-gate position
29+
Gmin, ///< Minimum desired-gate position
30+
Tw, ///< Water inertia time constant
31+
At, ///< Turbine gain
32+
Dturb, ///< Turbine damping coefficient
33+
Qnl, ///< No-load flow at nominal head
34+
Tn, ///< Speed lead-lag numerator time constant
35+
Tnp, ///< Speed lead-lag denominator time constant
36+
db1, ///< Type 1 speed deadband threshold
37+
db2, ///< Unsupported mechanical backlash deadband
38+
Hdam, ///< Head available at dam
39+
Gv0, ///< Gate point 0
40+
Gv1, ///< Gate point 1
41+
Gv2, ///< Gate point 2
42+
Gv3, ///< Gate point 3
43+
Gv4, ///< Gate point 4
44+
Gv5, ///< Gate point 5
45+
Pgv0, ///< Power point 0
46+
Pgv1, ///< Power point 1
47+
Pgv2, ///< Power point 2
48+
Pgv3, ///< Power point 3
49+
Pgv4, ///< Power point 4
50+
Pgv5 ///< Power point 5
51+
};
52+
53+
/// Ports for the HYGOV governor model.
54+
enum class HygovPorts
55+
{
56+
bus, ///< Optional terminal bus ID for case-format compatibility
57+
speed, ///< Machine speed-deviation signal ID
58+
pmech, ///< Mechanical-power output signal ID
59+
pref, ///< Optional active-power/load reference signal ID
60+
paux ///< Optional auxiliary power input signal ID
61+
};
62+
63+
/// Variables available through the monitor interface.
64+
enum class HygovMonitorableVariables
65+
{
66+
pmech, ///< Mechanical power output
67+
leadlag, ///< Speed lead-lag denominator state
68+
filter, ///< Governor error filter output
69+
desiredgate, ///< Desired-gate position
70+
gate, ///< Gate position
71+
flow, ///< Turbine flow
72+
head, ///< Turbine head
73+
pgv ///< Nonlinear gate-to-power curve output
74+
};
75+
76+
template <typename RealT, typename IdxT>
77+
struct HygovData : public ComponentData<RealT,
78+
IdxT,
79+
HygovParameters,
80+
HygovPorts,
81+
HygovMonitorableVariables>
82+
{
83+
HygovData() = default;
84+
85+
using Parameters = HygovParameters;
86+
using Ports = HygovPorts;
87+
using MonitorableVariables = HygovMonitorableVariables;
88+
};
89+
} // namespace Governor
90+
} // namespace PhasorDynamics
91+
} // namespace GridKit
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* @file HygovDependencyTracking.cpp
3+
* @author Luke Lowery (lukel@tamu.edu)
4+
* @brief Dependency-tracking instantiations for the HYGOV governor model.
5+
*/
6+
7+
#include "HygovImpl.hpp"
8+
9+
namespace GridKit
10+
{
11+
namespace PhasorDynamics
12+
{
13+
namespace Governor
14+
{
15+
template <class ScalarT, typename IdxT>
16+
int Hygov<ScalarT, IdxT>::evaluateJacobian()
17+
{
18+
Log::misc() << "Evaluate Jacobian for Hygov..." << std::endl;
19+
Log::misc() << "Jacobian evaluation is not implemented!" << std::endl;
20+
return 0;
21+
}
22+
23+
template class Hygov<DependencyTracking::Variable, long int>;
24+
template class Hygov<DependencyTracking::Variable, size_t>;
25+
} // namespace Governor
26+
} // namespace PhasorDynamics
27+
} // namespace GridKit

0 commit comments

Comments
 (0)