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 @@ -62,6 +62,7 @@
- Added cmake-format hooks, including in pre-commit.
- Added off-nominal tap ratio and phase shift support to the PhasorDynamics `Branch` model.
- 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))
54 changes: 54 additions & 0 deletions GridKit/Model/PhasorDynamics/Converter/REPCA/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# [[
# 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)
368 changes: 368 additions & 0 deletions GridKit/Model/PhasorDynamics/Converter/REPCA/README.md

Large diffs are not rendered by default.

27 changes: 27 additions & 0 deletions GridKit/Model/PhasorDynamics/Converter/REPCA/Repca.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/**
* @file Repca.cpp
* @author Luke Lowery (lukel@tamu.edu)
* @brief Non-Enzyme instantiation for the REPCA plant-control model.
*/

#include "RepcaImpl.hpp"

namespace GridKit
{
namespace PhasorDynamics
{
namespace Converter
{
template <class ScalarT, typename IdxT>
int Repca<ScalarT, IdxT>::evaluateJacobian()
{
Log::misc() << "Evaluate Jacobian for Repca..." << std::endl;
Log::misc() << "Jacobian evaluation is not implemented!" << std::endl;
return 0;
}

template class Repca<double, long int>;
template class Repca<double, size_t>;
} // namespace Converter
} // namespace PhasorDynamics
} // namespace GridKit
190 changes: 190 additions & 0 deletions GridKit/Model/PhasorDynamics/Converter/REPCA/Repca.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
/**
* @file Repca.hpp
* @author Luke Lowery (lukel@tamu.edu)
* @brief Declaration of the REPCA plant-control model.
*/

#pragma once

#include <cstddef>
#include <memory>
#include <vector>

#include <GridKit/Model/PhasorDynamics/Component.hpp>
#include <GridKit/Model/PhasorDynamics/ComponentSignals.hpp>
#include <GridKit/Model/PhasorDynamics/Converter/REPCA/RepcaData.hpp>
#include <GridKit/Model/VariableMonitor.hpp>

namespace GridKit
{
namespace PhasorDynamics
{
template <class ScalarT, typename IdxT>
class BusBase;

template <class ScalarT, typename IdxT>
class SignalNode;

namespace Converter
{
/// Internal variables of a `Repca`.
enum class RepcaInternalVariables : size_t
{
VMEAS, ///< Filtered regulated voltage
QMEAS, ///< Filtered reactive-power signal
XQ, ///< Reactive PI state
XQEXT, ///< Reactive-command lead-lag state
PMEAS, ///< Filtered active-power signal
XP, ///< Active-power PI state
PREF, ///< Active-power command lag state
VREG, ///< Regulated-bus voltage magnitude
VLDC, ///< Line-drop compensated voltage magnitude
VDROOP, ///< Reactive-droop-compensated voltage
VCTRL, ///< Selected voltage-measurement input
SFRZ, ///< Reactive PI voltage-enable indicator
ERQ, ///< Selected reactive-loop error
ERQDB, ///< Deadbanded reactive-loop error
ERQLIM, ///< Limited reactive-loop error
QPI, ///< Reactive PI output
QEXT, ///< Reactive-power command output
EF, ///< Frequency error after deadband
EP, ///< Active-power control error
EPLIM, ///< Limited active-power control error
PPI, ///< Active-power PI output
PEXT, ///< Active-power command output
MAXIMUM,
};

/// External variables of a `Repca`.
enum class RepcaExternalVariables : size_t
{
IBRANCHR, ///< Branch current real component on component base
IBRANCHI, ///< Branch current imaginary component on component base
QBRANCH, ///< Branch reactive-power signal on system base
PBRANCH, ///< Branch active-power signal on system base
VREF, ///< Voltage reference
QREF, ///< Reactive-power reference
PPLANTREF, ///< Plant active-power reference
FREQ, ///< Optional frequency input
FREQREF, ///< Optional frequency reference
MAXIMUM,
};

template <class ScalarT, typename IdxT>
class Repca : public Component<ScalarT, IdxT>
{
using Component<ScalarT, IdxT>::alpha_;
using Component<ScalarT, IdxT>::f_;
using Component<ScalarT, IdxT>::gridkit_component_id_;
using Component<ScalarT, IdxT>::J_;
using Component<ScalarT, IdxT>::J_cols_buffer_;
using Component<ScalarT, IdxT>::J_rows_buffer_;
using Component<ScalarT, IdxT>::J_vals_buffer_;
using Component<ScalarT, IdxT>::residual_indices_;
using Component<ScalarT, IdxT>::size_;
using Component<ScalarT, IdxT>::tag_;
using Component<ScalarT, IdxT>::va_system_base_;
using Component<ScalarT, IdxT>::variable_indices_;
using Component<ScalarT, IdxT>::wb_;
using Component<ScalarT, IdxT>::y_;
using Component<ScalarT, IdxT>::yp_;

public:
using RealT = typename Component<ScalarT, IdxT>::RealT;
using bus_type = BusBase<ScalarT, IdxT>;
using signal_type = SignalNode<ScalarT, IdxT>;
using model_data_type = RepcaData<RealT, IdxT>;
using MonitorT = Model::VariableMonitor<Repca, RepcaData>;

Repca(bus_type* bus);
Repca(bus_type* bus, const model_data_type& data);
~Repca();

int setGridKitComponentID(IdxT) override final;
int allocate() override final;
int verify() const override final;
int initialize() override final;
int tagDifferentiable() override final;
int evaluateResidual() override final;
int evaluateJacobian() override final;

auto getSignals()
-> ComponentSignals<ScalarT,
IdxT,
RepcaInternalVariables,
RepcaExternalVariables>&
{
return signals_;
}

const Model::VariableMonitorBase* getMonitor() const override;

__attribute__((always_inline)) inline int evaluateInternalResidual(
ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*);

private:
void initModelParams(const model_data_type& data);
void initializeMonitor();

int verifyBranchSignalPorts() const;
ScalarT readExternalOrDefault(RepcaExternalVariables variable, ScalarT default_value) const;
void setDerivedParameters();
ScalarT toComponentBase(ScalarT value) const;

ScalarT& Vr();
ScalarT& Vi();

bus_type* bus_{nullptr};

RealT mva_base_{0};
RealT VcompFlag_{0};
RealT RefFlag_{0};
RealT Freqflag_{0};
RealT Tfltr_{0};
RealT Tft_{0};
RealT Tfv_{0};
RealT Tp_{0};
RealT Tlag_{0};
RealT Vfrz_{0};
RealT Rc_{0};
RealT Xc_{0};
RealT Kc_{0};
RealT dbdlow_{0};
RealT dbdupper_{0};
RealT emax_{0};
RealT emin_{0};
RealT Kp_{0};
RealT Ki_{0};
RealT Qmax_{0};
RealT Qmin_{0};
RealT fdbd1_{0};
RealT fdbd2_{0};
RealT Ddn_{0};
RealT Dup_{0};
RealT femax_{0};
RealT femin_{0};
RealT Kpg_{0};
RealT Kig_{0};
RealT Pmax_{0};
RealT Pmin_{0};

IdxT parameter_error_count_{0};
RealT system_to_component_base_{1};
RealT vcomp_off_{1};
RealT ref_off_{1};

ScalarT vref_set_{0};
ScalarT qref_set_{0};
ScalarT pplantref_set_{0};
ScalarT freq_set_{0};
ScalarT freqref_set_{0};

ComponentSignals<ScalarT, IdxT, RepcaInternalVariables, RepcaExternalVariables> signals_;
std::unique_ptr<MonitorT> monitor_;

std::vector<ScalarT> ws_;
std::vector<IdxT> ws_indices_;
};
} // namespace Converter
} // namespace PhasorDynamics
} // namespace GridKit
Loading
Loading