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 @@ -60,6 +60,7 @@
- Added multi-contingency analysis application.
- Added `BusToSignalAdapter` component for communicating bus voltages and injection currents.
- Added `REGCA` converter model implementation for PhasorDynamics.
- Added `REPCA` converter model implementation for PhasorDynamics.

## v0.1

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 @@ -5,6 +5,7 @@
#include <GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp>
#include <GridKit/Model/PhasorDynamics/BusToSignalAdapter/BusToSignalAdapter.hpp>
#include <GridKit/Model/PhasorDynamics/Converter/REGCA/Regca.hpp>
#include <GridKit/Model/PhasorDynamics/Converter/REPCA/Repca.hpp>
#include <GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp>
#include <GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp>
#include <GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp>
Expand Down
1 change: 1 addition & 0 deletions GridKit/Model/PhasorDynamics/Converter/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@
# ]]

add_subdirectory(REGCA)
add_subdirectory(REPCA)
1 change: 1 addition & 0 deletions GridKit/Model/PhasorDynamics/Converter/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ The GridKit converter documentation includes:
- Renewable Energy Generator/Converter Model REGCA (See [REGCA](REGCA/README.md))
- Renewable Energy Generator/Converter Model REGCB (See [REGCB](REGCB/README.md))
- Renewable Energy Electrical Control Model REECA (See [REECA](REECA/README.md))
- Renewable Energy Plant Control Model REPCA (See [REPCA](REPCA/README.md))
2 changes: 2 additions & 0 deletions GridKit/Model/PhasorDynamics/Converter/REGCA/Regca.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ namespace GridKit
IQEXTRA, ///< HVRCM extra reactive current
IL, ///< LVPL upper-limit current curve
IR, ///< Real injected current
PBR, ///< Active power output on system base
QBR, ///< Reactive power output on system base
LP, ///< Active-current lower rate bound
UP, ///< Active-current upper rate bound
MAXIMUM,
Expand Down
8 changes: 5 additions & 3 deletions GridKit/Model/PhasorDynamics/Converter/REGCA/RegcaData.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,11 @@ namespace GridKit
/// Ports for the REGCA converter model.
enum class RegcaPorts
{
bus, ///< Terminal bus ID
ipcmd, ///< Optional active-current command signal ID
iqcmd ///< Optional reactive-current command signal ID
bus, ///< Terminal bus ID
ipcmd, ///< Optional active-current command signal ID
iqcmd, ///< Optional reactive-current command signal ID
pbranch, ///< Optional active-power measurement output signal ID
qbranch ///< Optional reactive-power measurement output signal ID
};

/// Variables available through the monitor interface.
Expand Down
30 changes: 26 additions & 4 deletions GridKit/Model/PhasorDynamics/Converter/REGCA/RegcaImpl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,11 +175,9 @@ namespace GridKit
monitor_->set(Variable::ii, [this, index]
{ return y_[index(RegcaInternalVariables::II)]; });
monitor_->set(Variable::p, [this, index]
{ return toSystemBase(Vr() * y_[index(RegcaInternalVariables::IR)]
+ Vi() * y_[index(RegcaInternalVariables::II)]); });
{ return y_[index(RegcaInternalVariables::PBR)]; });
monitor_->set(Variable::q, [this, index]
{ return toSystemBase(Vi() * y_[index(RegcaInternalVariables::IR)]
- Vr() * y_[index(RegcaInternalVariables::II)]); });
{ return y_[index(RegcaInternalVariables::QBR)]; });
monitor_->set(Variable::vt, [this, index]
{ return y_[index(RegcaInternalVariables::VT)]; });
monitor_->set(Variable::vm, [this, index]
Expand Down Expand Up @@ -231,6 +229,20 @@ namespace GridKit
this->setResidualIndex(j, j);
}

if (signals_.template isAssigned<RegcaInternalVariables::PBR>())
{
signals_.template getSignalNode<RegcaInternalVariables::PBR>()->set(
&y_[static_cast<size_t>(RegcaInternalVariables::PBR)],
&(this->getVariableIndex(static_cast<IdxT>(RegcaInternalVariables::PBR))));
}

if (signals_.template isAssigned<RegcaInternalVariables::QBR>())
{
signals_.template getSignalNode<RegcaInternalVariables::QBR>()->set(
&y_[static_cast<size_t>(RegcaInternalVariables::QBR)],
&(this->getVariableIndex(static_cast<IdxT>(RegcaInternalVariables::QBR))));
}

return 0;
}

Expand Down Expand Up @@ -312,6 +324,8 @@ namespace GridKit
const auto IQEXTRA = static_cast<size_t>(RegcaInternalVariables::IQEXTRA);
const auto IL = static_cast<size_t>(RegcaInternalVariables::IL);
const auto IR = static_cast<size_t>(RegcaInternalVariables::IR);
const auto PBR = static_cast<size_t>(RegcaInternalVariables::PBR);
const auto QBR = static_cast<size_t>(RegcaInternalVariables::QBR);
const auto LP = static_cast<size_t>(RegcaInternalVariables::LP);
const auto UP = static_cast<size_t>(RegcaInternalVariables::UP);

Expand Down Expand Up @@ -350,6 +364,8 @@ namespace GridKit
y_[IP] = ir0 / lvacm;
y_[IQEXTRA] = ZERO<RealT>;
y_[IQ] = -ii0;
y_[PBR] = toSystemBase(vr * y_[IR] + vi * y_[II]);
y_[QBR] = toSystemBase(vi * y_[IR] - vr * y_[II]);
y_[LP] = activeCurrentLowerRateBound(y_[IP]);
y_[UP] = activeCurrentUpperRateBound(y_[IP], y_[IL]);

Expand Down Expand Up @@ -398,6 +414,8 @@ namespace GridKit
const auto IQEXTRA = static_cast<size_t>(RegcaInternalVariables::IQEXTRA);
const auto IL = static_cast<size_t>(RegcaInternalVariables::IL);
const auto IR = static_cast<size_t>(RegcaInternalVariables::IR);
const auto PBR = static_cast<size_t>(RegcaInternalVariables::PBR);
const auto QBR = static_cast<size_t>(RegcaInternalVariables::QBR);
const auto LP = static_cast<size_t>(RegcaInternalVariables::LP);
const auto UP = static_cast<size_t>(RegcaInternalVariables::UP);

Expand All @@ -412,6 +430,8 @@ namespace GridKit
const ScalarT iqextra = y[IQEXTRA];
const ScalarT il = y[IL];
const ScalarT ir = y[IR];
const ScalarT pbr = y[PBR];
const ScalarT qbr = y[QBR];
const ScalarT lp = y[LP];
const ScalarT up = y[UP];

Expand Down Expand Up @@ -442,6 +462,8 @@ namespace GridKit
f[IQEXTRA] = -iqextra + Math::ramp(iqextra - (Vhvmax_ - vt));
f[IL] = -il + Math::linseg(vm, VL0_, VL1_, IL1_);
f[IR] = -ir + ip * Math::linseg(vt, VA0_, VA1_, ONE<RealT>);
f[PBR] = -pbr + toSystemBase(vr * ir + vi * ii);
f[QBR] = -qbr + toSystemBase(vi * ir - vr * ii);
f[LP] = -lp + activeCurrentLowerRateBound(ip);
f[UP] = -up + activeCurrentUpperRateBound(ip, il);

Expand Down
49 changes: 49 additions & 0 deletions GridKit/Model/PhasorDynamics/Converter/REPCA/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# [[
# Author(s):
# - Luke Lowery <lukel@tamu.edu>
# ]]

set(_install_headers
Repca.hpp
RepcaData.hpp)

if(GRIDKIT_ENABLE_ENZYME)
gridkit_add_library(phasor_dynamics_converter_repca
SOURCES
RepcaEnzyme.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)
else()
gridkit_add_library(phasor_dynamics_converter_repca
SOURCES
Repca.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_converter_repca_dependency_tracking
SOURCES
RepcaDependencyTracking.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)

target_link_libraries(phasor_dynamics_components
INTERFACE GridKit::phasor_dynamics_converter_repca)
target_link_libraries(phasor_dynamics_components_dependency_tracking
INTERFACE GridKit::phasor_dynamics_converter_repca_dependency_tracking)
Loading
Loading