|
| 1 | +/** |
| 2 | + * @file Repca.hpp |
| 3 | + * @author Luke Lowery (lukel@tamu.edu) |
| 4 | + * @brief Declaration of the REPCA plant-control model. |
| 5 | + */ |
| 6 | + |
| 7 | +#pragma once |
| 8 | + |
| 9 | +#include <cstddef> |
| 10 | +#include <memory> |
| 11 | +#include <vector> |
| 12 | + |
| 13 | +#include <GridKit/Model/PhasorDynamics/Component.hpp> |
| 14 | +#include <GridKit/Model/PhasorDynamics/ComponentSignals.hpp> |
| 15 | +#include <GridKit/Model/PhasorDynamics/Converter/REPCA/RepcaData.hpp> |
| 16 | +#include <GridKit/Model/VariableMonitor.hpp> |
| 17 | + |
| 18 | +namespace GridKit |
| 19 | +{ |
| 20 | + namespace PhasorDynamics |
| 21 | + { |
| 22 | + template <class ScalarT, typename IdxT> |
| 23 | + class BusBase; |
| 24 | + |
| 25 | + template <class ScalarT, typename IdxT> |
| 26 | + class SignalNode; |
| 27 | + |
| 28 | + namespace Converter |
| 29 | + { |
| 30 | + /// Internal variables of a `Repca`. |
| 31 | + enum class RepcaInternalVariables : size_t |
| 32 | + { |
| 33 | + VMEAS, ///< Filtered regulated voltage |
| 34 | + QMEAS, ///< Filtered reactive-power signal |
| 35 | + XQ, ///< Reactive PI state |
| 36 | + XQEXT, ///< Reactive-command lead-lag state |
| 37 | + PMEAS, ///< Filtered active-power signal |
| 38 | + XP, ///< Active-power PI state |
| 39 | + PREF, ///< Active-power command lag state |
| 40 | + VREG, ///< Regulated-bus voltage magnitude |
| 41 | + VLDC, ///< Line-drop compensated voltage magnitude |
| 42 | + VDROOP, ///< Reactive-droop-compensated voltage |
| 43 | + VCTRL, ///< Selected voltage-measurement input |
| 44 | + SFRZ, ///< Reactive PI voltage-enable indicator |
| 45 | + ERQ, ///< Selected reactive-loop error |
| 46 | + ERQDB, ///< Deadbanded reactive-loop error |
| 47 | + ERQLIM, ///< Limited reactive-loop error |
| 48 | + QPI, ///< Reactive PI output |
| 49 | + QEXT, ///< Reactive-power command output |
| 50 | + EF, ///< Frequency error after deadband |
| 51 | + EP, ///< Active-power control error |
| 52 | + EPLIM, ///< Limited active-power control error |
| 53 | + PPI, ///< Active-power PI output |
| 54 | + PEXT, ///< Active-power command output |
| 55 | + MAXIMUM, |
| 56 | + }; |
| 57 | + |
| 58 | + /// External variables of a `Repca`. |
| 59 | + enum class RepcaExternalVariables : size_t |
| 60 | + { |
| 61 | + IBRANCHR, ///< Branch current real component on component base |
| 62 | + IBRANCHI, ///< Branch current imaginary component on component base |
| 63 | + QBRANCH, ///< Branch reactive-power signal on system base |
| 64 | + PBRANCH, ///< Branch active-power signal on system base |
| 65 | + VREF, ///< Voltage reference |
| 66 | + QREF, ///< Reactive-power reference |
| 67 | + PPLANTREF, ///< Plant active-power reference |
| 68 | + FREQ, ///< Frequency input |
| 69 | + FREQREF, ///< Frequency reference |
| 70 | + MAXIMUM, |
| 71 | + }; |
| 72 | + |
| 73 | + template <class ScalarT, typename IdxT> |
| 74 | + class Repca : public Component<ScalarT, IdxT> |
| 75 | + { |
| 76 | + using Component<ScalarT, IdxT>::alpha_; |
| 77 | + using Component<ScalarT, IdxT>::f_; |
| 78 | + using Component<ScalarT, IdxT>::gridkit_component_id_; |
| 79 | + using Component<ScalarT, IdxT>::J_; |
| 80 | + using Component<ScalarT, IdxT>::J_cols_buffer_; |
| 81 | + using Component<ScalarT, IdxT>::J_rows_buffer_; |
| 82 | + using Component<ScalarT, IdxT>::J_vals_buffer_; |
| 83 | + using Component<ScalarT, IdxT>::residual_indices_; |
| 84 | + using Component<ScalarT, IdxT>::size_; |
| 85 | + using Component<ScalarT, IdxT>::tag_; |
| 86 | + using Component<ScalarT, IdxT>::va_system_base_; |
| 87 | + using Component<ScalarT, IdxT>::variable_indices_; |
| 88 | + using Component<ScalarT, IdxT>::wb_; |
| 89 | + using Component<ScalarT, IdxT>::y_; |
| 90 | + using Component<ScalarT, IdxT>::yp_; |
| 91 | + |
| 92 | + public: |
| 93 | + using RealT = typename Component<ScalarT, IdxT>::RealT; |
| 94 | + using bus_type = BusBase<ScalarT, IdxT>; |
| 95 | + using signal_type = SignalNode<ScalarT, IdxT>; |
| 96 | + using model_data_type = RepcaData<RealT, IdxT>; |
| 97 | + using MonitorT = Model::VariableMonitor<Repca, RepcaData>; |
| 98 | + |
| 99 | + Repca(bus_type* bus); |
| 100 | + Repca(bus_type* bus, const model_data_type& data); |
| 101 | + ~Repca(); |
| 102 | + |
| 103 | + int setGridKitComponentID(IdxT) override final; |
| 104 | + int allocate() override final; |
| 105 | + int verify() const override final; |
| 106 | + int initialize() override final; |
| 107 | + int tagDifferentiable() override final; |
| 108 | + int evaluateResidual() override final; |
| 109 | + int evaluateJacobian() override final; |
| 110 | + |
| 111 | + auto getSignals() |
| 112 | + -> ComponentSignals<ScalarT, |
| 113 | + IdxT, |
| 114 | + RepcaInternalVariables, |
| 115 | + RepcaExternalVariables>& |
| 116 | + { |
| 117 | + return signals_; |
| 118 | + } |
| 119 | + |
| 120 | + const Model::VariableMonitorBase* getMonitor() const override; |
| 121 | + |
| 122 | + __attribute__((always_inline)) inline int evaluateInternalResidual( |
| 123 | + ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); |
| 124 | + |
| 125 | + private: |
| 126 | + void initModelParams(const model_data_type& data); |
| 127 | + void initializeMonitor(); |
| 128 | + |
| 129 | + int verifyBranchSignalPorts() const; |
| 130 | + ScalarT readExternalOrDefault(RepcaExternalVariables variable, ScalarT default_value) const; |
| 131 | + void setDerivedParameters(); |
| 132 | + ScalarT toComponentBase(ScalarT value) const; |
| 133 | + |
| 134 | + ScalarT& Vr(); |
| 135 | + ScalarT& Vi(); |
| 136 | + |
| 137 | + bus_type* bus_{nullptr}; |
| 138 | + |
| 139 | + RealT P0_{0}; |
| 140 | + RealT Q0_{0}; |
| 141 | + RealT mva_base_{0}; |
| 142 | + RealT VcompFlag_{0}; |
| 143 | + RealT RefFlag_{0}; |
| 144 | + RealT Freqflag_{0}; |
| 145 | + RealT Tfltr_{0}; |
| 146 | + RealT Tft_{0}; |
| 147 | + RealT Tfv_{0}; |
| 148 | + RealT Tp_{0}; |
| 149 | + RealT Tlag_{0}; |
| 150 | + RealT Vfrz_{0}; |
| 151 | + RealT Rc_{0}; |
| 152 | + RealT Xc_{0}; |
| 153 | + RealT Kc_{0}; |
| 154 | + RealT dbdlow_{0}; |
| 155 | + RealT dbdupper_{0}; |
| 156 | + RealT emax_{0}; |
| 157 | + RealT emin_{0}; |
| 158 | + RealT Kp_{0}; |
| 159 | + RealT Ki_{0}; |
| 160 | + RealT Qmax_{0}; |
| 161 | + RealT Qmin_{0}; |
| 162 | + RealT fdbd1_{0}; |
| 163 | + RealT fdbd2_{0}; |
| 164 | + RealT Ddn_{0}; |
| 165 | + RealT Dup_{0}; |
| 166 | + RealT femax_{0}; |
| 167 | + RealT femin_{0}; |
| 168 | + RealT Kpg_{0}; |
| 169 | + RealT Kig_{0}; |
| 170 | + RealT Pmax_{0}; |
| 171 | + RealT Pmin_{0}; |
| 172 | + |
| 173 | + IdxT parameter_error_count_{0}; |
| 174 | + RealT system_to_component_base_{1}; |
| 175 | + |
| 176 | + ScalarT vref_set_{0}; |
| 177 | + ScalarT qref_set_{0}; |
| 178 | + ScalarT pplantref_set_{0}; |
| 179 | + ScalarT freq_set_{1}; |
| 180 | + ScalarT freqref_set_{1}; |
| 181 | + |
| 182 | + ComponentSignals<ScalarT, IdxT, RepcaInternalVariables, RepcaExternalVariables> signals_; |
| 183 | + std::unique_ptr<MonitorT> monitor_; |
| 184 | + |
| 185 | + std::vector<ScalarT> ws_; |
| 186 | + std::vector<IdxT> ws_indices_; |
| 187 | + }; |
| 188 | + } // namespace Converter |
| 189 | + } // namespace PhasorDynamics |
| 190 | +} // namespace GridKit |
0 commit comments