Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
- Added component model developer checklist to a README file.
- Added IEEEST Stabilizer Model
- Added SEXS-PTI Exciter Model
- Added GENSAL Machine Model
- Added 200 Bus Synthetic Illinois Case
- Added node objects to `PowerElectronics` module & updated all examples to make use of them.

Expand Down
1 change: 1 addition & 0 deletions GridKit/Model/PhasorDynamics/ComponentLibrary.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@
#include <GridKit/Model/PhasorDynamics/SignalNode/SignalNode.hpp>
#include <GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp>
#include <GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp>
#include <GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/Gensal.hpp>
#include <GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp>
1 change: 1 addition & 0 deletions GridKit/Model/PhasorDynamics/INPUT_FORMAT.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ are specified:
`Branch` | a basic algebraic pi model for a line or transformer | `bus1`, `bus2` | `R`, `X`, `G`, `B` | `ir1`, `ii1`, `im1`, `p1`, `q1`, `ir2`, `ii2`, `im2`, `p2`, `q2`
`Load` | a basic static impedence load model | `bus` | `R`, `X` | `p`, `q`
`Genrou` | 6th order machine model | `bus`, `pmech`\*, `speed`\*, `efd`\* | `p0`, `q0`, `H`, `D`, `Ra`, `Tdop`, `Tdopp`, `Tqopp`, `Tqop`, `Xd`, `Xdp`, `Xdpp`, `Xq`, `Xqp`, `Xqpp`, `Xl`, `S10`, `S12`, `mva_base` | `ir`, `ii`, `p`, `q`, `delta`, `omega`, `speed`
`Gensal` | 5th order salient-pole machine model | `bus`, `pmech`\*, `speed`\*, `efd`\* | `p0`, `q0`, `H`, `D`, `Ra`, `Tdop`, `Tdopp`, `Tqopp`, `Xd`, `Xdp`, `Xdpp`, `Xq`, `Xl`, `S10`, `S12`, `mva_base` | `ir`, `ii`, `p`, `q`, `delta`, `omega`, `speed`
`GenClassical`| the classical machine model | `bus`, `pmech`\*, `speed`\*, `efd`\* | `p0`, `q0`, `H`, `D`, `Ra`, `Xdp`, `mva_base` | `ir`, `ii`, `p`, `q`, `delta`, `omega`
`Tgov1 ` | the TGOV1 governor model | `pmech`, `speed` | `R`, `T1`, `T2`, `T3`, `Pvmax`, `Pvmin`, `Dt` | `none`
`Ieeet1` | the IEEET1 exciter model | `bus`, `speed`, `efd`, `vs`\* | `Tr`, `Ka`, `Ta`, `Ke`, `Te`, `Kf`, `Tf`, `Vrmin`, `Vrmax`, `E1`, `E2`, `Se1`, `Se2`, `Ispdlim` | `efd`, `ksat`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@
# ]]

add_subdirectory(GENROUwS)
add_subdirectory(GENSALwS)
add_subdirectory(GenClassical)
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,8 @@ namespace GridKit
ScalarT ii = (p * vi - q * vr) / vm2;

// Initial ksat guess from |V|
ScalarT ksat = SB_ * (vm - SA_) * (vm - SA_);
ScalarT vm_sat = vm - SA_;
ScalarT ksat = (vm_sat > ZERO<RealT>) ? SB_ * vm_sat * vm_sat : ScalarT{ZERO<RealT>};

ScalarT delta, id, iq, vd, vq;
ScalarT psiqpp, psidpp, psipp;
Expand All @@ -428,7 +429,7 @@ namespace GridKit
id = ir * std::sin(delta) - ii * std::cos(delta);
iq = ir * std::cos(delta) + ii * std::sin(delta);
vd = vr * std::sin(delta) - vi * std::cos(delta) + id * Ra_ - iq * Xqpp_;
vq = vr * std::cos(delta) + vi * std::sin(delta) + id * Xqpp_ - iq * Ra_;
vq = vr * std::cos(delta) + vi * std::sin(delta) + id * Xqpp_ + iq * Ra_;
psiqpp = -vd;
psidpp = vq;
Edp = (Xq1_ - Xqd_ * (Xqp_ - Xqpp_) * ksat) * iq / (ONE<RealT> + Xqd_ * ksat);
Expand All @@ -440,7 +441,8 @@ namespace GridKit
ScalarT psiqpp_fl = -psiqp * Xq4_ - Edp * Xq5_;
ScalarT psidpp_fl = psidp * Xd4_ + Eqp * Xd5_;
psipp = std::sqrt(psiqpp_fl * psiqpp_fl + psidpp_fl * psidpp_fl);
ksat = SB_ * (psipp - SA_) * (psipp - SA_);
ScalarT psipp_sat = psipp - SA_;
ksat = (psipp_sat > ZERO<RealT>) ? SB_ * psipp_sat * psipp_sat : ScalarT{ZERO<RealT>};

if (iter == max_iter - 1)
{
Expand All @@ -460,8 +462,9 @@ namespace GridKit
y_[5] = Edp;
y_[6] = psiqpp = -psiqp * Xq4_ - Edp * Xq5_;
y_[7] = psidpp = psidp * Xd4_ + Eqp * Xd5_;
y_[8] = psipp = std::sqrt(psiqpp * psiqpp + psidpp * psidpp);
y_[9] = ksat = SB_ * ((psipp - SA_) * (psipp - SA_));
y_[8] = psipp = std::sqrt(psiqpp * psiqpp + psidpp * psidpp);
ScalarT psipp_sat = psipp - SA_;
y_[9] = ksat = (psipp_sat > ZERO<RealT>) ? SB_ * psipp_sat * psipp_sat : ScalarT{ZERO<RealT>};
y_[10] = vd = -psiqpp * (ONE<RealT> + omega);
y_[11] = vq = psidpp * (ONE<RealT> + omega);
y_[12] = (psidpp - id * Xdpp_) * iq - (psiqpp - iq * Xdpp_) * id;
Expand Down Expand Up @@ -566,17 +569,18 @@ namespace GridKit
f[5] = Edp_dot - (ONE<RealT> / Tqop_) * (-Edp + Xqd_ * psiqpp * ksat + Xq1_ * (iq - Xq3_ * (Edp + iq * Xq2_ - psiqp)));

/* 11 Genrou algebraic equations */
f[6] = psiqpp - (-psiqp * Xq4_ - Edp * Xq5_);
f[7] = psidpp - (psidp * Xd4_ + Eqp * Xd5_);
f[8] = psipp - std::sqrt((psidpp * psidpp) + (psiqpp * psiqpp));
f[9] = ksat - SB_ * ((psipp - SA_) * (psipp - SA_));
f[10] = vd + psiqpp * (ONE<RealT> + omega);
f[11] = vq - psidpp * (ONE<RealT> + omega);
f[12] = telec - ((psidpp - id * Xdpp_) * iq - (psiqpp - iq * Xdpp_) * id);
f[13] = id - (ir * std::sin(delta) - ii * std::cos(delta));
f[14] = iq - (ir * std::cos(delta) + ii * std::sin(delta));
f[15] = ir + G_ * vr - B_ * vi - inr;
f[16] = ii + B_ * vr + G_ * vi - ini;
f[6] = psiqpp - (-psiqp * Xq4_ - Edp * Xq5_);
f[7] = psidpp - (psidp * Xd4_ + Eqp * Xd5_);
f[8] = psipp - std::sqrt((psidpp * psidpp) + (psiqpp * psiqpp));
ScalarT psipp_sat = psipp - SA_;
f[9] = ksat - SB_ * psipp_sat * psipp_sat * Math::sigmoid(psipp_sat);
f[10] = vd + psiqpp * (ONE<RealT> + omega);
f[11] = vq - psidpp * (ONE<RealT> + omega);
f[12] = telec - ((psidpp - id * Xdpp_) * iq - (psiqpp - iq * Xdpp_) * id);
f[13] = id - (ir * std::sin(delta) - ii * std::cos(delta));
f[14] = iq - (ir * std::cos(delta) + ii * std::sin(delta));
f[15] = ir + G_ * vr - B_ * vi - inr;
f[16] = ii + B_ * vr + G_ * vi - ini;

/* 2 Genrou current source definitions */
f[17] = inr - (G_ * (std::sin(delta) * vd + std::cos(delta) * vq) - B_ * (-std::cos(delta) * vd + std::sin(delta) * vq));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ Note that for implementation purposes, some of these equations may be simplified
0 &= -V_{d} -\psi''_{q}(1+\omega)\\
0 &= -V_{q} +\psi''_{d}(1+\omega)\\
0 &= -T_{elec} +(\psi''_{d} - I_dX_d'')I_q-(\psi''_{q} - I_qX_d'')I_d \\
0 &= -k_{sat} + S_B (\psi''-S_A)^2 \\
0 &= -k_{sat} + S_B(\psi''-S_A)^2\sigma(\psi''-S_A) \\
0 &= -I_d + I_r \sin(\delta) - I_i \cos(\delta) \\
0 &= -I_q + I_r \cos(\delta) + I_i \sin(\delta) \\
0 &= -I_r + G (V_d \sin(\delta) + V_q \cos(\delta) - V_r) - B (V_d \cos(\delta) + V_q \sin(\delta) - V_i) \\
Expand All @@ -156,7 +156,11 @@ from the steady-state initial conditions.
\psi^{''}_{d} &= V_q \\
\psi^{''}_{q} &= -V_d \\
\psi^{''} &= \sqrt{(\psi''_{d})^2+(\psi''_{q})^2} \\
k_{sat} &= S_B(\psi^{''}-S_A)^2 \\
k_{sat} &=
\begin{cases}
S_B(\psi^{''}-S_A)^2, & \psi^{''} > S_A\\
0, & \psi^{''} \le S_A
\end{cases}\\
T_{elec} &= (\psi''_{d} - I_dX_d^{''})I_q-(\psi''_{q} - I_qX_d^{''})I_d \\
P_{m} &= T_{elec} \\
\psi_d' &= \psi_d'' - (X_d'' - X_\ell)I_d \\
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
set(_install_headers
Gensal.hpp
GensalData.hpp)

if(GRIDKIT_ENABLE_ENZYME)
gridkit_add_library(phasor_dynamics_gensal
SOURCES
GensalEnzyme.cpp
HEADERS
${_install_headers}
INCLUDE_DIRECTORIES
PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/magic-enum/include
LINK_LIBRARIES
PUBLIC GridKit::phasor_dynamics_core
PUBLIC GridKit::phasor_dynamics_signal
PRIVATE ClangEnzymeFlags
COMPILE_OPTIONS
PRIVATE -mllvm -enzyme-auto-sparsity=1 -fno-math-errno -fno-vectorize)
else()
gridkit_add_library(phasor_dynamics_gensal
SOURCES
Gensal.cpp
HEADERS
${_install_headers}
INCLUDE_DIRECTORIES
PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/magic-enum/include
LINK_LIBRARIES
PUBLIC GridKit::phasor_dynamics_core
PUBLIC GridKit::phasor_dynamics_signal)
endif()

gridkit_add_library(phasor_dynamics_gensal_dependency_tracking
SOURCES
GensalDependencyTracking.cpp
INCLUDE_DIRECTORIES
PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/magic-enum/include
LINK_LIBRARIES
PUBLIC GridKit::phasor_dynamics_core
PUBLIC GridKit::phasor_dynamics_signal_dependency_tracking)

# Link to interface target for all components
target_link_libraries(phasor_dynamics_components
INTERFACE GridKit::phasor_dynamics_gensal)
target_link_libraries(phasor_dynamics_components_dependency_tracking
INTERFACE GridKit::phasor_dynamics_gensal_dependency_tracking)
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/**
* @file Gensal.cpp
* @author Luke Lowery (lukel@tamu.edu)
* @brief Definition of a GENSAL generator model.
*/

#include "GensalImpl.hpp"

namespace GridKit
{
namespace PhasorDynamics
{
/**
* @brief Jacobian evaluation not implemented yet
*
* @tparam ScalarT - scalar data type
* @tparam IdxT - matrix index data type
* @return int - error code, 0 = success
*/
template <class ScalarT, typename IdxT>
int Gensal<ScalarT, IdxT>::evaluateJacobian()
{
Log::misc() << "Evaluate Jacobian for Gensal..." << std::endl;
Log::misc() << "Jacobian evaluation not implemented!" << std::endl;
return 0;
}

// Available template instantiations
template class Gensal<double, long int>;
template class Gensal<double, size_t>;
} // namespace PhasorDynamics
} // namespace GridKit
Loading
Loading