diff --git a/CHANGELOG.md b/CHANGELOG.md index 59e9c884f..48e782521 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,6 +80,7 @@ - Added `HYGOV` governor model implementation for PhasorDynamics. - Added `REPCA` controller model implementation for PhasorDynamics. - Added `REECB` electrical-control model implementation for PhasorDynamics. +- Implemented `tagDifferentiable()` for `PowerElectronics` models. ## v0.1 diff --git a/GridKit/Model/PowerElectronics/Capacitor/Capacitor.cpp b/GridKit/Model/PowerElectronics/Capacitor/Capacitor.cpp index aab348679..31ec1b0e2 100644 --- a/GridKit/Model/PowerElectronics/Capacitor/Capacitor.cpp +++ b/GridKit/Model/PowerElectronics/Capacitor/Capacitor.cpp @@ -49,6 +49,8 @@ namespace GridKit template int Capacitor::tagDifferentiable() { + // All variables are differentials + tag_.resize(size_, true); return 0; } diff --git a/GridKit/Model/PowerElectronics/CircuitComponent.hpp b/GridKit/Model/PowerElectronics/CircuitComponent.hpp index becbc4208..c40c8d3e5 100644 --- a/GridKit/Model/PowerElectronics/CircuitComponent.hpp +++ b/GridKit/Model/PowerElectronics/CircuitComponent.hpp @@ -128,14 +128,14 @@ namespace GridKit */ int allocate() override { - jacobian_coo_rows_ = std::make_unique(static_cast(nnz_)); - jacobian_coo_cols_ = std::make_unique(static_cast(nnz_)); - jacobian_coo_values_ = std::make_unique(static_cast(nnz_)); + jacobian_coo_rows_ = std::make_unique(nnz_); + jacobian_coo_cols_ = std::make_unique(nnz_); + jacobian_coo_values_ = std::make_unique(nnz_); - y_ext_ = std::make_unique(static_cast(size_)); - yp_ext_ = std::make_unique(static_cast(size_)); - f_ext_ = std::make_unique(static_cast(size_)); - connection_nodes_ = std::make_unique(static_cast(size_)); + y_ext_ = std::make_unique(size_); + yp_ext_ = std::make_unique(size_); + f_ext_ = std::make_unique(size_); + connection_nodes_ = std::make_unique(size_); if (!allocated_) { @@ -250,7 +250,7 @@ namespace GridKit { assert(rows.size() == cols.size()); assert(rows.size() == vals.size()); - assert(current_jac_size_ + rows.size() <= static_cast(nnz_)); + assert(current_jac_size_ + rows.size() <= nnz_); for (size_t i = 0; i < rows.size(); i++) { @@ -265,22 +265,22 @@ namespace GridKit public: IdxT size() final { - return size_; + return static_cast(size_); } IdxT size() const { - return size_; + return static_cast(size_); } IdxT nnz() final { - return nnz_; + return static_cast(nnz_); } IdxT nnz() const { - return nnz_; + return static_cast(nnz_); } IdxT sizeQuadrature() final @@ -491,11 +491,11 @@ namespace GridKit protected: /// The number of variables in this component. Should be equal to `n_extern_` plus `n_intern_`. \see size() - IdxT size_{0}; + size_t size_{0}; /// The number of nonzero elements in this component's Jacobian. \see nnz() - IdxT nnz_{0}; - IdxT size_quad_{0}; - IdxT size_opt_{0}; + size_t nnz_{0}; + IdxT size_quad_{0}; + IdxT size_opt_{0}; // COO Jacobian buffers std::unique_ptr jacobian_coo_rows_; diff --git a/GridKit/Model/PowerElectronics/DistributedGenerator/DistributedGenerator.cpp b/GridKit/Model/PowerElectronics/DistributedGenerator/DistributedGenerator.cpp index dfa6f1a98..af707aea8 100644 --- a/GridKit/Model/PowerElectronics/DistributedGenerator/DistributedGenerator.cpp +++ b/GridKit/Model/PowerElectronics/DistributedGenerator/DistributedGenerator.cpp @@ -3,7 +3,6 @@ #include "DistributedGenerator.hpp" #include -#include #include namespace GridKit @@ -74,6 +73,8 @@ namespace GridKit template int DistributedGenerator::tagDifferentiable() { + // All variables are differentials + tag_.resize(size_, true); return 0; } diff --git a/GridKit/Model/PowerElectronics/InductionMotor/InductionMotor.cpp b/GridKit/Model/PowerElectronics/InductionMotor/InductionMotor.cpp index 0224e6ebe..69f0dcc39 100644 --- a/GridKit/Model/PowerElectronics/InductionMotor/InductionMotor.cpp +++ b/GridKit/Model/PowerElectronics/InductionMotor/InductionMotor.cpp @@ -60,6 +60,8 @@ namespace GridKit template int InductionMotor::tagDifferentiable() { + // All variables are differentials + tag_.resize(size_, true); return 0; } diff --git a/GridKit/Model/PowerElectronics/Inductor/Inductor.cpp b/GridKit/Model/PowerElectronics/Inductor/Inductor.cpp index b192cebc5..ff521fd65 100644 --- a/GridKit/Model/PowerElectronics/Inductor/Inductor.cpp +++ b/GridKit/Model/PowerElectronics/Inductor/Inductor.cpp @@ -48,6 +48,8 @@ namespace GridKit template int Inductor::tagDifferentiable() { + // All variables are differentials + tag_.resize(size_, true); return 0; } diff --git a/GridKit/Model/PowerElectronics/LinearTransformer/LinearTransformer.cpp b/GridKit/Model/PowerElectronics/LinearTransformer/LinearTransformer.cpp index fcfc4a02d..d8f453bf7 100644 --- a/GridKit/Model/PowerElectronics/LinearTransformer/LinearTransformer.cpp +++ b/GridKit/Model/PowerElectronics/LinearTransformer/LinearTransformer.cpp @@ -62,6 +62,8 @@ namespace GridKit template int LinearTransformer::tagDifferentiable() { + // All variables are differentials + tag_.resize(size_, true); return 0; } diff --git a/GridKit/Model/PowerElectronics/MicrogridBusDQ/MicrogridBusDQ.cpp b/GridKit/Model/PowerElectronics/MicrogridBusDQ/MicrogridBusDQ.cpp index ffc02dfb3..0c3c6331c 100644 --- a/GridKit/Model/PowerElectronics/MicrogridBusDQ/MicrogridBusDQ.cpp +++ b/GridKit/Model/PowerElectronics/MicrogridBusDQ/MicrogridBusDQ.cpp @@ -77,6 +77,8 @@ namespace GridKit template int MicrogridBusDQ::evaluateInternalResidual() { + // No internal variables - tag doesn't matter. + tag_.resize(size_, false); return 0; } diff --git a/GridKit/Model/PowerElectronics/MicrogridLine/MicrogridLine.cpp b/GridKit/Model/PowerElectronics/MicrogridLine/MicrogridLine.cpp index 65c3fb0a0..0b467b6d4 100644 --- a/GridKit/Model/PowerElectronics/MicrogridLine/MicrogridLine.cpp +++ b/GridKit/Model/PowerElectronics/MicrogridLine/MicrogridLine.cpp @@ -62,6 +62,8 @@ namespace GridKit template int MicrogridLine::tagDifferentiable() { + // All variables are differentials + tag_.resize(size_, true); return 0; } diff --git a/GridKit/Model/PowerElectronics/MicrogridLoad/MicrogridLoad.cpp b/GridKit/Model/PowerElectronics/MicrogridLoad/MicrogridLoad.cpp index a14a038f1..a83ffcbb7 100644 --- a/GridKit/Model/PowerElectronics/MicrogridLoad/MicrogridLoad.cpp +++ b/GridKit/Model/PowerElectronics/MicrogridLoad/MicrogridLoad.cpp @@ -58,6 +58,8 @@ namespace GridKit template int MicrogridLoad::tagDifferentiable() { + // All variables are differentials + tag_.resize(size_, true); return 0; } diff --git a/GridKit/Model/PowerElectronics/NodeBase.hpp b/GridKit/Model/PowerElectronics/NodeBase.hpp index 3c7f7c80b..077854b97 100644 --- a/GridKit/Model/PowerElectronics/NodeBase.hpp +++ b/GridKit/Model/PowerElectronics/NodeBase.hpp @@ -145,7 +145,7 @@ namespace GridKit allocateVectors(static_cast(size)); } - tag_.resize(size); + tag_.resize(size, false); variable_indices_.resize(size); residual_indices_.resize(size); diff --git a/GridKit/Model/PowerElectronics/SynchronousMachine/SynchronousMachine.cpp b/GridKit/Model/PowerElectronics/SynchronousMachine/SynchronousMachine.cpp index c3a647762..5972a4530 100644 --- a/GridKit/Model/PowerElectronics/SynchronousMachine/SynchronousMachine.cpp +++ b/GridKit/Model/PowerElectronics/SynchronousMachine/SynchronousMachine.cpp @@ -77,6 +77,8 @@ namespace GridKit template int SynchronousMachine::tagDifferentiable() { + // All variables are differentials + tag_.resize(size_, true); return 0; } diff --git a/GridKit/Model/PowerElectronics/SystemModelPowerElectronics.hpp b/GridKit/Model/PowerElectronics/SystemModelPowerElectronics.hpp index 174e28568..b5470b9c9 100644 --- a/GridKit/Model/PowerElectronics/SystemModelPowerElectronics.hpp +++ b/GridKit/Model/PowerElectronics/SystemModelPowerElectronics.hpp @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -12,6 +13,8 @@ #include #include +#include "GridKit/Utilities/Logger/Logger.hpp" + namespace GridKit { template @@ -149,8 +152,6 @@ namespace GridKit abs_tol_.setToZero(memory::HOST); } - tag_.resize(size_); - { // Start node internal indexing after all component internals for proper KLU ordering size_t node_internal_idx = component_internal_size; for (node_type* node : nodes_) @@ -295,6 +296,38 @@ namespace GridKit int tagDifferentiable() final { + for (size_t i = 0; i < components_.size(); i++) + { + component_type* component = components_[i]; + + if (int err = component->tagDifferentiable()) + { + return err; + } + + if (component->tag().size() != component->size()) + { + GridKit::Utilities::Logger::error() << std::format("Component {} has an ill-configured tag(). Expected tags for {} variables, got {} instead.\n", i, component->size(), component->tag().size()); + return 1; + } + } + + tag_.resize(size_, false); + + size_t idx = 0; + for (component_type* comp : components_) + { + const auto& external_indices = comp->getExternIndices(); + for (IdxT i = 0; i < comp->size(); i++) + { + if (!external_indices.contains(i)) + { + tag_[idx] = comp->tag()[i]; + idx++; + } + } + } + return 0; } diff --git a/GridKit/Model/PowerElectronics/TransmissionLine/TransmissionLine.cpp b/GridKit/Model/PowerElectronics/TransmissionLine/TransmissionLine.cpp index 3adbbef58..38a4e6c1d 100644 --- a/GridKit/Model/PowerElectronics/TransmissionLine/TransmissionLine.cpp +++ b/GridKit/Model/PowerElectronics/TransmissionLine/TransmissionLine.cpp @@ -60,6 +60,8 @@ namespace GridKit template int TransmissionLine::tagDifferentiable() { + // All variables are algebraics + tag_.resize(size_, false); return 0; } diff --git a/GridKit/Model/PowerElectronics/VoltageSource/VoltageSource.cpp b/GridKit/Model/PowerElectronics/VoltageSource/VoltageSource.cpp index 9a4accd0b..de1f8a8bd 100644 --- a/GridKit/Model/PowerElectronics/VoltageSource/VoltageSource.cpp +++ b/GridKit/Model/PowerElectronics/VoltageSource/VoltageSource.cpp @@ -49,6 +49,8 @@ namespace GridKit template int VoltageSource::tagDifferentiable() { + // All variables are algebraics + tag_.resize(size_, false); return 0; } diff --git a/examples/PowerElectronics/Microgrid/Microgrid.cpp b/examples/PowerElectronics/Microgrid/Microgrid.cpp index 74497fc41..ca94e575b 100644 --- a/examples/PowerElectronics/Microgrid/Microgrid.cpp +++ b/examples/PowerElectronics/Microgrid/Microgrid.cpp @@ -223,6 +223,29 @@ int main(int /* argc */, char const** /* argv */) sysmodel->getCsrJacobian()->print(); } + sysmodel->tagDifferentiable(); + + bool all_internal_diff = true; + bool all_external_alg = true; + + const size_t num_node_vars = 4 * 2 + 1; + + for (size_t i = 0; i < sysmodel->size() - num_node_vars; i++) + { + all_internal_diff = all_internal_diff && sysmodel->tag()[i]; + if (!sysmodel->tag()[i]) + { + std::cout << "Broken on " << i << '\n'; + } + } + + for (size_t i = sysmodel->size() - num_node_vars; i < sysmodel->size(); i++) + { + all_external_alg = all_external_alg && !sysmodel->tag()[i]; + } + + std::cout << "Verify all internal variables are differential: " << all_internal_diff << ", and all external variabels are algebraic: " << all_external_alg << '\n'; + // Create numerical integrator and configure it for the generator model auto* idas = new AnalysisManager::Sundials::Ida(sysmodel);