From 5df4a2f08e905edd3f7b9a5126c4a7cfb9ba6c08 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Mon, 8 Jun 2026 13:34:35 -0400 Subject: [PATCH 01/39] WIP: nuke COO_Matrix class. Remove what's not needed and cleanup. --- .github/workflows/pre_commit.yaml | 2 +- .../LinearAlgebra/DenseMatrix/DenseMatrix.hpp | 138 +-- .../LinearAlgebra/SparseMatrix/COO_Matrix.hpp | 916 +++--------------- .../Model/PhasorDynamics/SystemModelImpl.hpp | 44 +- .../SystemModelPowerElectronics.hpp | 53 - GridKit/Utilities/MapFromCOO.hpp | 11 +- .../gridkit/packages/gridkit/package.py | 10 +- .../Enzyme/Library/Vector/EnzymeVector.cpp | 4 +- examples/Enzyme/PowerElectronics/main.cpp | 5 +- examples/Enzyme/Standalone/EnzymeVector.cpp | 4 +- examples/LinearAlgebra/CMakeLists.txt | 1 - .../LinearAlgebra/DenseTest/DenseTest.cpp | 10 +- .../LinearAlgebra/SparseTest/CMakeLists.txt | 6 - .../LinearAlgebra/SparseTest/SparseTest.cpp | 102 -- .../ScaleMicrogrid/ScaleMicrogrid.cpp | 4 - .../LinearAlgebra/SparseMatrix/CMakeLists.txt | 2 +- .../PhasorDynamics/ExciterIeeet1Tests.hpp | 2 +- .../PhasorDynamics/ExciterSexsPtiTests.hpp | 2 +- .../PhasorDynamics/GenClassicalTests.hpp | 2 +- .../UnitTests/PhasorDynamics/GenrouTests.hpp | 2 +- .../PhasorDynamics/GovernorTgov1Tests.hpp | 2 +- tests/UnitTests/PhasorDynamics/LoadTests.hpp | 2 +- .../UnitTests/PhasorDynamics/LoadZIPTests.hpp | 2 +- .../PhasorDynamics/StabilizerIeeestTests.hpp | 2 +- 24 files changed, 195 insertions(+), 1133 deletions(-) delete mode 100644 examples/LinearAlgebra/SparseTest/CMakeLists.txt delete mode 100644 examples/LinearAlgebra/SparseTest/SparseTest.cpp diff --git a/.github/workflows/pre_commit.yaml b/.github/workflows/pre_commit.yaml index a6ecfed8a..a56c74938 100644 --- a/.github/workflows/pre_commit.yaml +++ b/.github/workflows/pre_commit.yaml @@ -19,4 +19,4 @@ jobs: fetch: false committer_name: GitHub Actions committer_email: actions@github.com - message: Apply pre-commmit fixes + message: Apply pre-commit fixes diff --git a/GridKit/LinearAlgebra/DenseMatrix/DenseMatrix.hpp b/GridKit/LinearAlgebra/DenseMatrix/DenseMatrix.hpp index 364fab55e..7a255e7de 100644 --- a/GridKit/LinearAlgebra/DenseMatrix/DenseMatrix.hpp +++ b/GridKit/LinearAlgebra/DenseMatrix/DenseMatrix.hpp @@ -6,8 +6,6 @@ #include #include -#include - /** * @brief Class to provide dense matrices. * @@ -22,12 +20,10 @@ namespace GridKit class DenseMatrix { private: - IdxT rows_size_; - IdxT columns_size_; - std::vector values_; - COO_Matrix values_COO_; - bool values_changed_ = false; - bool sparsified_ = false; + IdxT rows_size_; + IdxT columns_size_; + std::vector values_; + bool values_changed_ = false; public: // Constructors and destructors @@ -35,16 +31,13 @@ namespace GridKit ~DenseMatrix(); // Getters and setters - RealT getValue(const IdxT i, const IdxT j) const; - void setValue(const IdxT i, const IdxT j, const RealT value); - void setValues(COO_Matrix values_COO); - void setValues(size_t nnz, const IdxT* rows_coo, const IdxT* cols_coo, const RealT* vals_coo); - std::vector* getValues(); - COO_Matrix* getValuesCOO(); + RealT getValue(const IdxT i, const IdxT j) const; + void setValue(const IdxT i, const IdxT j, const RealT value); + void setValues(size_t nnz, const IdxT* rows_coo, const IdxT* cols_coo, const RealT* vals_coo); + std::vector* getValues(); // Utilities - void toCOO(); - void printMatrix(std::string name = ""); + void print(std::string name = ""); // Purposefully not defining BLAS operations. This class should not be used // for compute. @@ -53,7 +46,7 @@ namespace GridKit /** * @brief DenseMatrix constructor * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * * @param[in] IdxT - rows_size @@ -63,15 +56,14 @@ namespace GridKit DenseMatrix::DenseMatrix(const IdxT rows_size, const IdxT columns_size) : rows_size_(rows_size), columns_size_(columns_size), - values_(rows_size * columns_size, 0), - values_COO_(rows_size, columns_size) + values_(rows_size * columns_size, 0) { } /** * @brief DenseMatrix single value getter * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * * @param[in] IdxT - i row index @@ -81,15 +73,15 @@ namespace GridKit template inline RealT DenseMatrix::getValue(const IdxT i, const IdxT j) const { - assert(i < this->columns_size_); - assert(j < this->rows_size_); - return this->values_[j * rows_size_ + i]; + assert(i < columns_size_); + assert(j < rows_size_); + return values_[j * rows_size_ + i]; } /** * @brief DenseMatrix single value setter * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * * @param[in] IdxT - i row index @@ -99,29 +91,10 @@ namespace GridKit template inline void DenseMatrix::setValue(const IdxT i, const IdxT j, const RealT value) { - assert(i < this->columns_size_); - assert(j < this->rows_size_); - this->values_[j * rows_size_ + i] = value; - values_changed_ = true; - } - - /** - * @brief DenseMatrix value setter from COO - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] COO_Matrix - values_COO - */ - template - inline void DenseMatrix::setValues(COO_Matrix values_COO) - { - std::tuple&, std::vector&, std::vector&> entries = values_COO.getEntries(); - const auto [rcord, ccord, vals] = entries; - for (IdxT idx = 0; idx < values_COO.nnz(); ++idx) - { - this->setValue(rcord[idx], ccord[idx], vals[idx]); - } + assert(i < columns_size_); + assert(j < rows_size_); + values_[j * rows_size_ + i] = value; + values_changed_ = true; } /** @@ -137,14 +110,14 @@ namespace GridKit { for (size_t idx = 0; idx < nnz; ++idx) { - this->setValue(rows_coo[idx], cols_coo[idx], vals_coo[idx]); + setValue(rows_coo[idx], cols_coo[idx], vals_coo[idx]); } } /** * @brief DenseMatrix getter for all values stored as a vector * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * * @return Address of the vector containing matrix values @@ -152,79 +125,26 @@ namespace GridKit template inline std::vector* DenseMatrix::getValues() { - return &(this->values_); - } - - /** - * @brief DenseMatrix getter for all values stored as a COO sparse matrix - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @return Address of the COO matrix containing the sparsified matrix values - */ - template - inline COO_Matrix* DenseMatrix::getValuesCOO() - { - if (!sparsified_ || values_changed_) - { - this->toCOO(); - } - return &(this->values_COO_); - } - - /** - * @brief Dense matrix conversion to COO form - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - */ - template - inline void DenseMatrix::toCOO() - { - if (!sparsified_ || values_changed_) - { - IdxT nnz = 0; - std::vector rcord; - std::vector ccord; - std::vector vals; - for (IdxT j = 0; j < this->columns_size_; ++j) - { - for (IdxT i = 0; i < this->rows_size_; ++i) - { - RealT value = this->values_[j * rows_size_ + i]; - if (std::abs(value) > std::numeric_limits::epsilon()) - { - nnz++; - rcord.push_back(i); - ccord.push_back(j); - vals.push_back(value); - } - } - } - values_COO_.setValues(rcord, ccord, vals); - sparsified_ = true; - values_changed_ = false; - } + return &(values_); } /** * @brief Print matrix * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * * @param[in] name to identify the specific matrix printed */ template - inline void DenseMatrix::printMatrix(std::string name) + inline void DenseMatrix::print(std::string name) { std::cout << "Dense matrix: " << name << "\n"; - for (IdxT i = 0; i < this->rows_size_; ++i) + for (IdxT i = 0; i < rows_size_; ++i) { - for (IdxT j = 0; j < this->columns_size_; ++j) + for (IdxT j = 0; j < columns_size_; ++j) { - std::cout << this->values_[j * rows_size_ + i] << " "; + std::cout << values_[j * rows_size_ + i] << " "; } std::cout << "\n"; } @@ -233,7 +153,7 @@ namespace GridKit /** * @brief DenseMatrix destructor * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices */ template diff --git a/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp b/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp index b699dedcb..1be36255b 100644 --- a/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp +++ b/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp @@ -4,12 +4,7 @@ #include #include -#include -#include #include -#include -#include -#include #include namespace GridKit @@ -19,10 +14,7 @@ namespace GridKit /** * @brief Quick class to provide sparse matrices of COO type. * - * Simplifies data movement - * - * @todo add functionality to keep track of multiple sorted lists. Faster - * adding of new entries and will have a threshold to sort completely. + * @note This class is deprecated. * * m x n sparse matrix */ @@ -39,253 +31,86 @@ namespace GridKit public: // Constructors - COO_Matrix(std::vector r, std::vector c, std::vector v, IdxT m, IdxT n); - COO_Matrix(IdxT m, IdxT n); COO_Matrix(); ~COO_Matrix(); - // Operations - - // --- Functions which call sort --- - std::tuple, std::vector> getRowCopy(IdxT r); - std::tuple&, std::vector&, std::vector&> getEntries(const bool sort = true); - std::tuple, std::vector, std::vector> getEntryCopies(); - std::tuple, std::vector, std::vector> getEntryCopiesSubMatrix(std::vector submap); - - std::tuple, std::vector, std::vector> setDataToCSR(); - std::vector getCSRRowData(); + // Accessors + std::vector& getRows(); + std::vector& getColumns(); + std::vector& getValues(); + IdxT getNumRows() const; + IdxT getNumColumns() const; + IdxT getNnz() const; - // Set values from vector storage. Will sort before storing - void setValues(std::vector r, std::vector c, std::vector v); + // Set values from vector storage void setValues(RealT alpha, IdxT* r, IdxT* c, RealT* v, IdxT nnz); - // BLAS. Will sort before running - void axpy(RealT alpha, COO_Matrix& a, const bool sort = true); - void axpy(RealT alpha, std::vector r, std::vector c, std::vector v, const bool sort = true); - void axpy(RealT alpha, IdxT* r, IdxT* c, RealT* v, IdxT nnz); - void scal(RealT alpha); - RealT frobNorm(); - - // --- Permutation Operations --- - // Sorting is only done if not already sorted. - void permutation(std::vector row_perm, std::vector col_perm); - void permutationSizeMap(std::vector row_perm, std::vector col_perm, IdxT m, IdxT n); + // Add to existing values + void axpy(RealT alpha, IdxT* r, IdxT* c, RealT* v, IdxT nnz); // Special matrices (zero and identity) - void zeroMatrix(); // Actually null matrix + void zeroMatrix(); // null matrix void zeroValuedMatrix(); - void identityMatrix(IdxT n); - // Resort values_ + // Sort void sortSparse(); - bool isSorted(); - IdxT nnz(); - void deduplicate(); - std::tuple getDimensions(); - - void printMatrix(std::string name = ""); - - void printMatrixMarket(const std::string& filename, const std::string& comment); + // Deduplicate + void deduplicate(); - static void sortSparseCOO(std::vector& rows, std::vector& columns, std::vector& values, size_t nnz); + // Print matrix + void print(std::string name = ""); private: - IdxT indexStartRow(const std::vector& rows, IdxT r); - IdxT sparseCordBinarySearch(const std::vector& rows, const std::vector& columns, IdxT ri, IdxT ci); bool checkIncreaseSize(IdxT r, IdxT c); }; /** - * @brief Get copy of row index - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] r row index - * @return std::tuple, std::vector> - */ - template - inline std::tuple, std::vector> COO_Matrix::getRowCopy(IdxT r) - { - if (!this->sorted_) - { - this->sortSparse(); - } - IdxT row_index = this->indexStartRow(r); - - if (row_index == -1) - { - return {std::vector(), std::vector()}; - } - - IdxT rsize = row_index; - do - { - rsize++; - } while (rsize < this->values_.size() && this->row_indices_[rsize] == r); - - return {{this->column_indices_.begin() + row_index, this->column_indices_.begin() + rsize}, - {this->values_.begin() + row_index, this->values_.begin() + rsize}}; - } - - /** - * @brief Get all entry pointers. Will sort before returning + * @brief Get row indices. * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * - * @return std::tuple, std::vector, std::vector> + * @return std::vector - Row indices */ template - inline std::tuple&, std::vector&, std::vector&> COO_Matrix::getEntries(const bool sort) + inline std::vector& COO_Matrix::getRows() { - if (!this->sorted_ && sort) - { - this->sortSparse(); - } - return {this->row_indices_, this->column_indices_, this->values_}; + return row_indices_; } /** - * @brief Sorts the data if it's not already sorted + * @brief Get column indices. * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * - * @return std::tuple, std::vector, std::vector> + * @return std::vector - Column indices */ template - inline std::tuple, std::vector, std::vector> COO_Matrix::getEntryCopies() + inline std::vector& COO_Matrix::getColumns() { - if (!this->sorted_) - { - this->sortSparse(); - } - return {this->row_indices_, this->column_indices_, this->values_}; + return column_indices_; } /** - * @brief Returns the data in CSR Format + * @brief Get matrix values. * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * - * @return std::tuple, std::vector, std::vector> + * @return std::vector - Values */ template - inline std::tuple, std::vector, std::vector> COO_Matrix::setDataToCSR() + inline std::vector& COO_Matrix::getValues() { - if (!this->isSorted()) - this->sortSparse(); - std::vector row_size_vec(this->rows_size_ + 1, 0); - IdxT counter = 0; - for (IdxT i = 0; i < static_cast(row_size_vec.size() - 1); i++) - { - row_size_vec[i + 1] = row_size_vec[i]; - while (counter < static_cast(this->row_indices_.size()) && i == this->row_indices_[counter]) - { - row_size_vec[i + 1]++; - counter++; - } - } - return {row_size_vec, this->column_indices_, this->values_}; - } - - /** - * @brief Only creates the row data - * - * @todo swap this with having the matrix store the data and updates. This can then be passed by reference - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @return std::vector - */ - template - inline std::vector COO_Matrix::getCSRRowData() - { - if (!this->isSorted()) - this->sortSparse(); - std::vector row_size_vec(static_cast(this->rows_size_ + 1), 0); - size_t counter = 0; - for (size_t i = 0; i < row_size_vec.size() - 1; i++) - { - row_size_vec[i + 1] = row_size_vec[i]; - while (counter < this->row_indices_.size() && i == static_cast(this->row_indices_[counter])) - { - row_size_vec[i + 1]++; - counter++; - } - } - return row_size_vec; - } - - /** - * @brief Set coordinates and values of the matrix. - * - * Matrix entries will be sorted in row-major order before the method returns. - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] r row indices of the matrix - * @param[in] c column indices of the matrix - * @param[in] v values of the matrix - * - * @pre r.size() == c.size() == v.size() - * @pre r,c,v represent an array in COO format - * - * @post Coordinates and values are set in the matrix. - */ - template - inline void COO_Matrix::setValues(std::vector r, std::vector c, std::vector v) - { - // sort input - this->sortSparseCOO(r, c, v, r.size()); - - // Duplicated with axpy. Could replace with function depdent on lambda expression - size_t a_iter = 0; - // iterate for all current values_ in matrix - for (size_t i = 0; i < this->row_indices_.size(); i++) - { - // pushback values_ when they are not in current matrix - while (a_iter < r.size() && (r[a_iter] < this->row_indices_[i] || (r[a_iter] == this->row_indices_[i] && c[a_iter] < this->column_indices_[i]))) - { - this->row_indices_.push_back(r[a_iter]); - this->column_indices_.push_back(c[a_iter]); - this->values_.push_back(v[a_iter]); - this->checkIncreaseSize(r[a_iter], c[a_iter]); - a_iter++; - } - if (a_iter >= r.size()) - { - break; - } - - if (r[a_iter] == this->row_indices_[i] && c[a_iter] == this->column_indices_[i]) - { - this->values_[i] = v[a_iter]; - a_iter++; - } - } - // push back rest that was not found sorted - for (size_t i = a_iter; i < r.size(); i++) - { - this->row_indices_.push_back(r[i]); - this->column_indices_.push_back(c[i]); - this->values_.push_back(v[i]); - - this->checkIncreaseSize(r[i], c[i]); - } - - this->sorted_ = false; + return values_; } /** * @brief Append coordinates and values of the matrix without sorting or deduplicating. * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * * @param[in] r row indices to be stored @@ -299,156 +124,13 @@ namespace GridKit { for (size_t i = 0; i < static_cast(nnz); i++) { - this->row_indices_.emplace_back(r[i]); - this->column_indices_.emplace_back(c[i]); - this->values_.emplace_back(alpha * v[i]); + row_indices_.emplace_back(r[i]); + column_indices_.emplace_back(c[i]); + values_.emplace_back(alpha * v[i]); - this->checkIncreaseSize(r[i], c[i]); + checkIncreaseSize(r[i], c[i]); } - this->sorted_ = false; - } - - /** - * @brief Implements axpy this += alpha * a. Will sort before running - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] alpha matrix to be added - * @param[in] a scalar to multiply by - * - * @post this = this + alpha * a - */ - template - inline void COO_Matrix::axpy(RealT alpha, COO_Matrix& a, const bool sort) - { - if (!this->sorted_ && sort) - { - this->sortSparse(); - } - if (!a.isSorted()) - { - a.sortSparse(); - } - IdxT m = 0; - IdxT n = 0; - std::tuple&, std::vector&, std::vector&> tpm = a.getEntries(); - const auto& [r, c, val] = tpm; - std::tie(m, n) = a.getDimensions(); - - // Increase size as necessary - this->rows_size_ = this->rows_size_ > m ? this->rows_size_ : m; - this->columns_size_ = this->columns_size_ > n ? this->columns_size_ : n; - - size_t a_iter = 0; - // iterate for all current values in matrix - for (size_t i = 0; i < this->row_indices_.size(); i++) - { - if (sort) // highjacking sort variable to signify that the sparsity pattern can change - { - // pushback values when they are not in current matrix - while (a_iter < r.size() && (r[a_iter] < this->row_indices_[i] || (r[a_iter] == this->row_indices_[i] && c[a_iter] < this->column_indices_[i]))) - { - this->row_indices_.push_back(r[a_iter]); - this->column_indices_.push_back(c[a_iter]); - this->values_.push_back(alpha * val[a_iter]); - - this->checkIncreaseSize(r[a_iter], c[a_iter]); - a_iter++; - } - } - - if (a_iter >= r.size()) - { - break; - } - - if (r[a_iter] == this->row_indices_[i] && c[a_iter] == this->column_indices_[i]) - { - this->values_[i] += alpha * val[a_iter]; - a_iter++; - } - } - // push back rest that was not found sorted_ - for (size_t i = a_iter; i < r.size(); i++) - { - this->row_indices_.push_back(r[i]); - this->column_indices_.push_back(c[i]); - this->values_.push_back(alpha * val[i]); - - this->checkIncreaseSize(r[i], c[i]); - } - - this->sorted_ = false; - } - - /** - * @brief axpy on a COO representation of a matrix. Will sort before running - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @param alpha scalar to multiply by - * @param r row indices - * @param c column indices - * @param v values - * - * @pre r.size() == c.size() == v.size() - * @pre r,c,v represent an array a in COO format - * - * @post this = this + alpha * a - */ - template - inline void COO_Matrix::axpy(RealT alpha, std::vector r, std::vector c, std::vector v, const bool sort) - { - if (!this->sorted_ && sort) - { - this->sortSparse(); - } - - // sort input - this->sortSparseCOO(r, c, v, r.size()); - - size_t a_iter = 0; - // iterate for all current values_ in matrix - for (size_t i = 0; i < this->row_indices_.size(); i++) - { - if (sort) // highjacking sort variable to signify that the sparsity pattern can change - { - // pushback values_ when they are not in current matrix - while (a_iter < r.size() && (r[a_iter] < this->row_indices_[i] || (r[a_iter] == this->row_indices_[i] && c[a_iter] < this->column_indices_[i]))) - { - this->row_indices_.push_back(r[a_iter]); - this->column_indices_.push_back(c[a_iter]); - this->values_.push_back(alpha * v[a_iter]); - - this->checkIncreaseSize(r[a_iter], c[a_iter]); - a_iter++; - } - } - - if (a_iter >= r.size()) - { - break; - } - - if (r[a_iter] == this->row_indices_[i] && c[a_iter] == this->column_indices_[i]) - { - this->values_[i] += alpha * v[a_iter]; - a_iter++; - } - } - // push back rest that was not found sorted_ - for (size_t i = a_iter; i < r.size(); i++) - { - this->row_indices_.push_back(r[i]); - this->column_indices_.push_back(c[i]); - this->values_.push_back(alpha * v[i]); - - this->checkIncreaseSize(r[i], c[i]); - } - - this->sorted_ = false; + sorted_ = false; } /** @@ -458,7 +140,7 @@ namespace GridKit * * Only use for buses, which are 2x2, so the cost of loops is not uncontrolled. Don't allow resizing. * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * * @param[in] r row indices to be stored @@ -470,18 +152,18 @@ namespace GridKit template inline void COO_Matrix::axpy(RealT alpha, IdxT* r, IdxT* c, RealT* v, IdxT nnz) { - if (this->row_indices_.size() == 0) // Do nothing for infinite bus + if (row_indices_.size() == 0) // Do nothing for infinite bus { } - else if (this->row_indices_.size() == 4) + else if (row_indices_.size() == 4) { - for (size_t i = 0; i < this->row_indices_.size(); i++) + for (size_t i = 0; i < row_indices_.size(); i++) { for (size_t j = 0; j < static_cast(nnz); j++) { - if (this->row_indices_[i] == r[j] && this->column_indices_[i] == c[j]) + if (row_indices_[i] == r[j] && column_indices_[i] == c[j]) { - this->values_[i] += alpha * v[j]; + values_[i] += alpha * v[j]; } } } @@ -491,7 +173,7 @@ namespace GridKit std::cout << "Warning: Unexpected size in axpy\n"; } - this->sorted_ = false; + sorted_ = false; } /** @@ -500,19 +182,19 @@ namespace GridKit * @node This is currently only used in component-level Jacobian tests, * which don't use CooMatrix or CsrMatrix yet, to compare with Dependency::Tracking maps. * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices */ template inline void COO_Matrix::deduplicate() { - std::vector row_temp = this->row_indices_; - std::vector col_temp = this->column_indices_; - std::vector val_temp = this->values_; + std::vector row_temp = row_indices_; + std::vector col_temp = column_indices_; + std::vector val_temp = values_; - this->row_indices_.clear(); - this->column_indices_.clear(); - this->values_.clear(); + row_indices_.clear(); + column_indices_.clear(); + values_.clear(); IdxT nnz = 0; for (size_t i = 0; i < row_temp.size(); i++) @@ -523,130 +205,26 @@ namespace GridKit bool exists = false; for (size_t j = 0; j < nnz; j++) { - if (this->row_indices_[j] == row && this->column_indices_[j] == col) + if (row_indices_[j] == row && column_indices_[j] == col) { - this->values_[j] += val; - exists = true; + values_[j] += val; + exists = true; } } if (!exists) { - this->row_indices_.emplace_back(row); - this->column_indices_.emplace_back(col); - this->values_.emplace_back(val); + row_indices_.emplace_back(row); + column_indices_.emplace_back(col); + values_.emplace_back(val); nnz++; } } } - /** - * @brief Scale all values by alpha - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] alpha scalar to scale by - */ - template - inline void COO_Matrix::scal(RealT alpha) - { - for (auto i = this->values_.begin(); i < this->values_.end(); i++) - { - *i *= alpha; - } - } - - /** - * @brief Calculates the Frobenius Norm of the matrix - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @return RealT - Frobenius Norm of the matrix - */ - template - inline RealT COO_Matrix::frobNorm() - { - RealT totsum = 0.0; - for (auto i = this->values_.begin(); i < this->values_.end(); i++) - { - totsum += abs(*i) ^ 2; - } - return totsum; - } - - /** - * @brief Permutate the matrix to a different one. Only changes the coordinates - * - * @tparam RealT - Real type for Jacobian entries - * - * @param[in] row_perm - * @param[out] col_perm - * - * @pre row_perm.size() == this->rows_size_ = col_perm.size() == this->columns_size_ - * - * @post this = this(row_perm, col_perm) - */ - template - inline void COO_Matrix::permutation(std::vector row_perm, std::vector col_perm) - { - assert(row_perm.size() = this->rows_size_); - assert(col_perm.size() = this->columns_size_); - - for (int i = 0; i < this->values_.size(); i++) - { - this->row_indices_[i] = row_perm[this->row_indices_[i]]; - this->column_indices_[i] = col_perm[this->column_indices_[i]]; - } - this->sorted_ = false; - // cycle sorting maybe useful since permutations are already known - } - - /** - * @brief Permutes the matrix and can change its size efficently - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] row_perm row permutation - * @param[in] col_perm column permutation - * @param[in] m number of rows - * @param[in] n number of columns - * - * @pre row_perm.size() == this->rows_size_ - * @pre col_perm.size() == this->columns_size_ - * @pre indices are set to -1 if they are to be removed - * - * @post this = this(row_perm, col_perm) and removed indices have corresponding values set to 0 - */ - template - inline void COO_Matrix::permutationSizeMap(std::vector row_perm, std::vector col_perm, IdxT m, IdxT n) - { - assert(row_perm.size() == this->rows_size_); - assert(col_perm.size() == this->columns_size_); - - this->rows_size_ = m; - this->columns_size_ = n; - - for (size_t i = 0; i < this->values_.size(); i++) - { - if (row_perm[this->row_indices_[i]] == -1 || col_perm[this->column_indices_[i]] == -1) - { - this->values_[i] = 0; - } - else - { - this->row_indices_[i] = row_perm[this->row_indices_[i]]; - this->column_indices_[i] = col_perm[this->column_indices_[i]]; - } - } - this->sorted_ = false; - } - /** * @brief Turn matrix into the null matrix. Does not actually delete memory * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * */ @@ -654,317 +232,120 @@ namespace GridKit inline void COO_Matrix::zeroMatrix() { // resize doesn't affect capacity if smaller - this->column_indices_.resize(0); - this->row_indices_.resize(0); - this->values_.resize(0); - this->sorted_ = true; + column_indices_.resize(0); + row_indices_.resize(0); + values_.resize(0); + sorted_ = true; } /** * @brief Initializes matrix values to 0 without changing the sparsity pattern * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * */ template inline void COO_Matrix::zeroValuedMatrix() { - for (size_t i = 0; i < this->row_indices_.size(); i++) + for (size_t i = 0; i < row_indices_.size(); i++) { - this->values_[i] = 0.0; + values_[i] = 0.0; } } /** - * @brief Turn matrix into the identity matrix + * @brief Get the matrix number of rows * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * - * @param[in] n size of the identity matrix - * - * @post this = I_n - * - * @todo - it might be better to explicitly zero out the matrix and require to be so in preconditions - */ - - template - inline void COO_Matrix::identityMatrix(IdxT n) - { - // Reset Matrix - this->zeroMatrix(); - for (IdxT i = 0; i < n; i++) - { - this->column_indices_[i] = i; - this->row_indices_[i] = i; - this->values_[i] = 1.0; - } - this->sorted_ = true; - } - - /** - * @brief Restructure the sparse matrix for faster accesses and modifications - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices + * @param[out] Number of rows */ template - inline void COO_Matrix::sortSparse() + inline IdxT COO_Matrix::getNumRows() const { - this->sortSparseCOO(this->row_indices_, this->column_indices_, this->values_, (this->row_indices_).size()); - this->sorted_ = true; + return rows_size_; } /** - * @brief Check if the matrix is sorted + * @brief Get the matrix number of columns * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * - * @param[out] bool - true if sorted, false otherwise + * @param[out] Number of columns */ - template - inline bool COO_Matrix::isSorted() + inline IdxT COO_Matrix::getNumColumns() const { - return this->sorted_; + return columns_size_; } /** - * @brief Get the number of non-zero elements in the matrix + * @brief Get the matrix number of non zeros, including duplicates * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * - * @param[out] IdxT - number of non-zero elements in the matrix + * @param[out] Number of non zeros */ template - inline IdxT COO_Matrix::nnz() - { - return static_cast(this->values_.size()); - } - - template - inline std::tuple COO_Matrix::getDimensions() + inline IdxT COO_Matrix::getNnz() const { - return std::tuple(this->rows_size_, this->columns_size_); + return values_.size(); } /** * @brief Print matrix in sorted order * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * * @param[in] name to identify the specific matrix printed */ template - inline void COO_Matrix::printMatrix(std::string name) + inline void COO_Matrix::print(std::string name) { - if (this->sorted_ == false) + if (sorted_ == false) { - this->sortSparse(); + sortSparse(); } std::cout << "Sparse COO Matrix: " << name << "\n"; std::cout << "(x , y, value)\n"; - for (size_t i = 0; i < this->values_.size(); i++) + for (size_t i = 0; i < values_.size(); i++) { - std::cout << "(" << this->row_indices_[i] - << ", " << this->column_indices_[i] - << ", " << this->values_[i] << ")\n"; + std::cout << "(" << row_indices_[i] + << ", " << column_indices_[i] + << ", " << values_[i] << ")\n"; } std::cout << std::flush; } - /** - * @brief Print matrix to file in Matrix Market format - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] filename Output file path - * @param[in] comment Optional comment for the Matrix Market file - */ - template - void COO_Matrix::printMatrixMarket(const std::string& filename, const std::string& comment) - { - if (this->sorted_ == false) - { - this->sortSparse(); - } - - std::ofstream outfile(filename); - if (!outfile.is_open()) - { - std::cerr << "Error: Unable to open file " << filename << " for writing." << std::endl; - return; - } - - // Write Matrix Market header - outfile << "%%MatrixMarket matrix coordinate "; - - if (!std::is_floating_point::value) - { - // error message - return; - } - - outfile << "general" << std::endl; - - // Write comment if provided - if (!comment.empty()) - outfile << "% " << comment << std::endl; - - // Write dimensions and number of entries - // Get max row and column indices to determine matrix dimensions - IdxT max_row = 0; - IdxT max_col = 0; - for (size_t i = 0; i < this->values_.size(); i++) - { - max_row = std::max(max_row, this->row_indices_[i]); - max_col = std::max(max_col, this->column_indices_[i]); - } - - // Matrix Market uses 1-based indexing, so add 1 to dimensions - outfile << (max_row + 1) << " " << (max_col + 1) << " " << this->values_.size() << std::endl; - - // Write the matrix entries - for (size_t i = 0; i < this->values_.size(); i++) - { - // Matrix Market uses 1-based indexing, so add 1 to indices - outfile << (this->row_indices_[i] + 1) << " " - << (this->column_indices_[i] + 1) << " " - << this->values_[i] << std::endl; - } - - outfile.close(); - - std::cout << "Matrix Market file written to: " << filename << std::endl; - } - - /** - * @brief Find the lowest row cordinate from set of provided coordinates - * - * Assumes rows and columns are sorted - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] rows - row indices - * @param[in] r - row index - * - * @return IdxT - index of lowest row - */ - template - inline IdxT COO_Matrix::indexStartRow(const std::vector& rows, IdxT r) - { - // Specialized Binary Search for Lowest Row - IdxT i1 = 0; - IdxT i2 = rows->size() - 1; - IdxT m_smallest = -1; - IdxT m = -1; - while (i1 <= i2) - { - m = (i2 + i1) / 2; - // rows - if (rows[m] < r) - { - i1 = m + 1; - } - else if (r < rows[m]) - { - i2 = m - 1; - } - else - { - if (i1 == i2) - { - return m_smallest; - } - - // Keep track of smallest cordinate - m_smallest = m; - i2 = m - 1; - } - } - return m_smallest; - } - - /** - * @brief Basic binary search - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] rows - row indices - * @param[in] columns - column indices - * @param[in] ri - row index - * @param[in] ci - column index - * @return IdxT - returns the index of the coordinate - */ - template - inline IdxT COO_Matrix::sparseCordBinarySearch(const std::vector& rows, const std::vector& columns, IdxT ri, IdxT ci) - { - assert(rows.size() == columns.size()); - // basic binary search - IdxT i1 = 0; - IdxT i2 = rows.size() - 1; - IdxT m = 0; - while (i1 <= i2) - { - m = (i2 + i1) / 2; - // rows - if (rows[m] < ri) - { - i1 = m + 1; - } - else if (ri < rows[m]) - { - i2 = m - 1; - } - else - { - if (columns[m] < ci) - { - i1 = m + 1; - } - else if (ci < columns[m]) - { - i2 = m - 1; - } - break; - } - } - - return m; - } - /** * @brief Check if the size of the matrix needs to be increased * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * * @param[in] r row index * @param[in] c column index * @return true if size was increased */ - template inline bool COO_Matrix::checkIncreaseSize(IdxT r, IdxT c) { bool changed = false; - if (r + 1 > this->rows_size_) + if (r + 1 > rows_size_) { - this->rows_size_ = r + 1; - changed = true; + rows_size_ = r + 1; + changed = true; } - if (c + 1 > this->columns_size_) + if (c + 1 > columns_size_) { - this->columns_size_ = c + 1; - changed = true; + columns_size_ = c + 1; + changed = true; } return changed; @@ -977,124 +358,65 @@ namespace GridKit * row-major order before the method returns. * Duplicate entries are not allowed and should be pre-summed. * - * @pre rows, columns, and values are of the same size and represent a COO matrix with no duplicates - * @post Matrix entries are sorted in row-major order - * - * @todo simple setup. Should add stable sorting since lists are pre-sorted_ - * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices - * - * @param rows - * @param columns - * @param values */ template - inline void COO_Matrix::sortSparseCOO(std::vector& rows, std::vector& columns, std::vector& values, size_t nnz) + inline void COO_Matrix::sortSparse() { + size_t nnz = row_indices_.size(); - // index based sort code + // Index based sort // https://stackoverflow.com/questions/25921706/creating-a-vector-of-indices-of-a-sorted_-vector // cannot call sort since two arrays are used instead - std::vector ordervec(nnz); + std::vector permutation(nnz); std::size_t n(0); - std::generate(std::begin(ordervec), std::end(ordervec), [&] + std::generate(std::begin(permutation), std::end(permutation), [&] { return n++; }); // Sort by row first then column. - std::sort(std::begin(ordervec), - std::end(ordervec), + std::sort(std::begin(permutation), + std::end(permutation), [&](auto i1, auto i2) - { return (rows[i1] < rows[i2]) || (rows[i1] == rows[i2] && columns[i1] < columns[i2]); }); + { return (row_indices_[i1] < row_indices_[i2]) || (row_indices_[i1] == row_indices_[i2] && column_indices_[i1] < column_indices_[i2]); }); // reorder based of index-sorting. Only swap cost no extra memory. // @todo see if extra memory creation is fine // https://stackoverflow.com/a/22183350 - for (size_t i = 0; i < ordervec.size(); i++) + for (size_t i = 0; i < permutation.size(); i++) { // permutation swap - while (ordervec[i] != ordervec[ordervec[i]]) + while (permutation[i] != permutation[permutation[i]]) { - std::swap(rows[ordervec[i]], rows[ordervec[ordervec[i]]]); - std::swap(columns[ordervec[i]], columns[ordervec[ordervec[i]]]); - std::swap(values[ordervec[i]], values[ordervec[ordervec[i]]]); + std::swap(row_indices_[permutation[i]], row_indices_[permutation[permutation[i]]]); + std::swap(column_indices_[permutation[i]], column_indices_[permutation[permutation[i]]]); + std::swap(values_[permutation[i]], values_[permutation[permutation[i]]]); // swap orderings - std::swap(ordervec[i], ordervec[ordervec[i]]); + std::swap(permutation[i], permutation[permutation[i]]); } } - } - /** - * @brief Constructor for COO Matrix with given cooridnates and values - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] r row indices - * @param[in] c column indices - * @param[in] v values - * @param[in] m number of rows - * @param[in] n number of columns - * - * @pre r.size() == c.size() == v.size() - * @pre r,c,v represent an array in COO format - * - * @post COO_Matrix is created with given coordinates and values - */ - - template - inline COO_Matrix::COO_Matrix(std::vector r, std::vector c, std::vector v, IdxT m, IdxT n) - { - this->values_ = v; - this->row_indices_ = r; - this->column_indices_ = c; - this->rows_size_ = m; - this->columns_size_ = n; - this->sorted_ = false; // Set to false until explicitly sorted, though logically it is sorted. - } - - /** - * @brief Constructor for empty COO Matrix of a given size - * - * @tparam RealT - Real type for Jacobian entries - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] m number of rows - * @param[in] n number of columns - * - * @post empty COO Matrix is created with given size - */ - - template - inline COO_Matrix::COO_Matrix(IdxT m, IdxT n) - { - this->rows_size_ = m; - this->columns_size_ = n; - this->values_ = std::vector(); - this->row_indices_ = std::vector(); - this->column_indices_ = std::vector(); - this->sorted_ = false; // Set to false until explicitly sorted, though logically it is sorted. + sorted_ = true; } /** * @brief Constructor for empty COO Matrix of size 0 * - * @tparam RealT - Real type for Jacobian entries + * @tparam RealT - Real type for matrix values * @tparam IdxT - Integer data type for matrix indices * * @post empty COO Matrix of size 0 is created */ - template inline COO_Matrix::COO_Matrix() { - this->rows_size_ = 0; - this->columns_size_ = 0; - this->values_ = std::vector(); - this->row_indices_ = std::vector(); - this->column_indices_ = std::vector(); - this->sorted_ = false; // Set to false until explicitly sorted, though logically it is sorted. + rows_size_ = 0; + columns_size_ = 0; + values_ = std::vector(); + row_indices_ = std::vector(); + column_indices_ = std::vector(); + sorted_ = false; // Set to false until explicitly sorted, though logically it is sorted. } template diff --git a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp index 891c2c57d..bee1ea1d6 100644 --- a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp @@ -746,9 +746,6 @@ namespace GridKit * Finally, store bus Jacobians into the system Jacobian after all component have added their * contributions. * - * @todo split the initial assembly from updating values. This will the - * slow otherwise. - * */ template int SystemModel::evaluateJacobian() @@ -774,23 +771,14 @@ namespace GridKit { auto component_jacobian = component->getJacobian(); - std::tuple&, std::vector&, std::vector&> component_jacobian_entries = component_jacobian.getEntries(false); - const auto [rows, columns, values] = component_jacobian_entries; - for (size_t i = 0; i < rows.size(); ++i) - { - ++nnz_dup; - } + nnz_dup += component_jacobian.getNnz(); } + for (const auto& bus : buses_) { auto bus_jacobian = bus->getJacobian(); - std::tuple&, std::vector&, std::vector&> bus_jacobian_entries = bus_jacobian.getEntries(false); - const auto [rows, columns, values] = bus_jacobian_entries; - for (size_t i = 0; i < rows.size(); ++i) - { - ++nnz_dup; - } + nnz_dup += bus_jacobian.getNnz(); } // Allocate COO triplet arrays (we own these until we hand off to CsrMatrix) @@ -803,9 +791,10 @@ namespace GridKit { auto component_jacobian = component->getJacobian(); - std::tuple&, std::vector&, std::vector&> component_jacobian_entries = component_jacobian.getEntries(false); - const auto [rows, columns, values] = component_jacobian_entries; - for (size_t i = 0; i < rows.size(); ++i) + const std::vector& rows = component_jacobian.getRows(); + const std::vector& columns = component_jacobian.getColumns(); + const std::vector& values = component_jacobian.getValues(); + for (size_t i = 0; i < component_jacobian.getNnz(); ++i) { rows_dup[counter] = rows[i]; cols_dup[counter] = columns[i]; @@ -813,13 +802,15 @@ namespace GridKit counter++; } } + for (const auto& bus : buses_) { auto bus_jacobian = bus->getJacobian(); - std::tuple&, std::vector&, std::vector&> bus_jacobian_entries = bus_jacobian.getEntries(false); - const auto [rows, columns, values] = bus_jacobian_entries; - for (size_t i = 0; i < rows.size(); ++i) + const std::vector& rows = bus_jacobian.getRows(); + const std::vector& columns = bus_jacobian.getColumns(); + const std::vector& values = bus_jacobian.getValues(); + for (size_t i = 0; i < bus_jacobian.getNnz(); ++i) { rows_dup[counter] = rows[i]; cols_dup[counter] = columns[i]; @@ -872,21 +863,20 @@ namespace GridKit { auto component_jacobian = component->getJacobian(); - std::tuple&, std::vector&, std::vector&> component_jacobian_entries = component_jacobian.getEntries(false); - const auto [rows, columns, values] = component_jacobian_entries; - for (size_t i = 0; i < rows.size(); ++i) + const std::vector& values = component_jacobian.getValues(); + for (size_t i = 0; i < component_jacobian.getNnz(); ++i) { vals[map_to_csr_[counter]] += values[i]; ++counter; } } + for (const auto& bus : buses_) { auto bus_jacobian = bus->getJacobian(); - std::tuple&, std::vector&, std::vector&> bus_jacobian_entries = bus_jacobian.getEntries(false); - const auto [rows, columns, values] = bus_jacobian_entries; - for (size_t i = 0; i < rows.size(); ++i) + const std::vector& values = bus_jacobian.getValues(); + for (size_t i = 0; i < bus_jacobian.getNnz(); ++i) { vals[map_to_csr_[counter]] += values[i]; ++counter; diff --git a/GridKit/Model/PowerElectronics/SystemModelPowerElectronics.hpp b/GridKit/Model/PowerElectronics/SystemModelPowerElectronics.hpp index 3b44f4ec6..84b543168 100644 --- a/GridKit/Model/PowerElectronics/SystemModelPowerElectronics.hpp +++ b/GridKit/Model/PowerElectronics/SystemModelPowerElectronics.hpp @@ -16,48 +16,6 @@ namespace GridKit { - /** - * Writes a vector to a file in Matrix Market format - * - * @param vec The vector to write - * @param filename The name of the output file - * @param header Additional header information/comments - * @return true if the write was successful, false otherwise - */ - template - void writeVectorToMatrixMarket(const std::vector& vec, const std::string& filename, const std::string& header) - { - std::ofstream outFile(filename); - - if (!outFile.is_open()) - { - std::cerr << "Error: Could not open file " << filename << " for writing." << std::endl; - return; - } - - // Uncomment to write Matrix Market header - // outFile << "%%MatrixMarket vector array real general" << std::endl; - - // Write additional header information as comments - if (!header.empty()) - { - outFile << "% " << header << std::endl; - } - - // Write the vector size - outFile << vec.size() << std::endl; - - // Write the vector elements - outFile << std::scientific << std::setprecision(16); - for (const auto& val : vec) - { - outFile << val << std::endl; - } - - outFile.close(); - return; - } - template class PowerElectronicsModel : public CircuitComponent { @@ -522,17 +480,6 @@ namespace GridKit alpha_ = a; } - /** - * @brief print the system residual in COO format - * - * @param[in] filename - * @param[in] title - */ - void printResidualMatrixMarket(std::string filename, std::string title) - { - writeVectorToMatrixMarket(f_, filename, title); - } - CsrMatrixT* getCsrJacobian() const override { return csr_jac_; diff --git a/GridKit/Utilities/MapFromCOO.hpp b/GridKit/Utilities/MapFromCOO.hpp index d4fa91c29..a617e8aae 100644 --- a/GridKit/Utilities/MapFromCOO.hpp +++ b/GridKit/Utilities/MapFromCOO.hpp @@ -18,15 +18,14 @@ namespace GridKit template std::vector MapFromCOO(LinearAlgebra::COO_Matrix matrix) { - std::tuple&, std::vector&, std::vector&> matrix_entries = matrix.getEntries(); - const auto [rows, columns, values] = matrix_entries; - - std::tuple matrix_dimensions = matrix.getDimensions(); - const auto [n_rows, n_columns] = matrix_dimensions; + const std::vector& rows = matrix.getRows(); + const std::vector& columns = matrix.getColumns(); + const std::vector& values = matrix.getValues(); + const IdxT n_rows = matrix.getNumRows(); std::vector dependencies(n_rows); - for (IdxT i = 0; i < rows.size(); ++i) + for (IdxT i = 0; i < matrix.getNnz(); ++i) { dependencies[rows[i]].insert(std::make_pair(columns[i], values[i])); } diff --git a/buildsystem/spack_repo/gridkit/packages/gridkit/package.py b/buildsystem/spack_repo/gridkit/packages/gridkit/package.py index c0f5a6491..f97c416c8 100644 --- a/buildsystem/spack_repo/gridkit/packages/gridkit/package.py +++ b/buildsystem/spack_repo/gridkit/packages/gridkit/package.py @@ -39,11 +39,11 @@ def cmake_args(self): args.extend( [ - self.define_from_variant("GRIDKIT_ENABLE_IPOPT", "ipopt"), - self.define_from_variant("GRIDKIT_ENABLE_SUNDIALS", "sundials"), - self.define_from_variant("GRIDKIT_ENABLE_ENZYME", "enzyme"), - self.define_from_variant("GRIDKIT_ENABLE_ASAN", "asan"), - self.define_from_variant("GRIDKIT_ENABLE_UBSAN", "ubsan"), + self.define_from_variant("GridKit_ENABLE_IPOPT", "ipopt"), + self.define_from_variant("GridKit_ENABLE_SUNDIALS", "sundials"), + self.define_from_variant("GridKit_ENABLE_ENZYME", "enzyme"), + self.define_from_variant("GridKit_ENABLE_ASAN", "asan"), + self.define_from_variant("GridKit_ENABLE_UBSAN", "ubsan"), ] ) diff --git a/examples/Enzyme/Library/Vector/EnzymeVector.cpp b/examples/Enzyme/Library/Vector/EnzymeVector.cpp index dd8a82b31..c16b1e6cf 100644 --- a/examples/Enzyme/Library/Vector/EnzymeVector.cpp +++ b/examples/Enzyme/Library/Vector/EnzymeVector.cpp @@ -77,8 +77,8 @@ int main() } if (verbose) { - jac.printMatrix("Autodiff Jacobian"); - jac_ref.printMatrix("Reference Jacobian"); + jac.print("Autodiff Jacobian"); + jac_ref.print("Reference Jacobian"); } std::cout << "Status: " << fail << "\n"; diff --git a/examples/Enzyme/PowerElectronics/main.cpp b/examples/Enzyme/PowerElectronics/main.cpp index 246cb92b6..351378d51 100644 --- a/examples/Enzyme/PowerElectronics/main.cpp +++ b/examples/Enzyme/PowerElectronics/main.cpp @@ -17,7 +17,6 @@ */ using DenseMatrix = GridKit::LinearAlgebra::DenseMatrix; -using SparseMatrix = GridKit::LinearAlgebra::COO_Matrix; using DG = GridKit::DistributedGenerator; using DGParameters = GridKit::DistributedGeneratorParameters; @@ -222,8 +221,8 @@ int main() } if (verbose) { - jac_autodiff.printMatrix("Autodiff Jacobian"); - jac_ref_dense.printMatrix("Reference Jacobian"); + jac_autodiff.print("Autodiff Jacobian"); + jac_ref_dense.print("Reference Jacobian"); } std::cout << "Status: " << fail << "\n"; diff --git a/examples/Enzyme/Standalone/EnzymeVector.cpp b/examples/Enzyme/Standalone/EnzymeVector.cpp index 7b7b13815..f25239028 100644 --- a/examples/Enzyme/Standalone/EnzymeVector.cpp +++ b/examples/Enzyme/Standalone/EnzymeVector.cpp @@ -123,8 +123,8 @@ int main() } if (verbose) { - dsq.printMatrix("Autodiff Jacobian"); - dsq_ref.printMatrix("Reference Jacobian"); + dsq.print("Autodiff Jacobian"); + dsq_ref.print("Reference Jacobian"); } std::cout << "Status: " << fail << "\n"; return fail; diff --git a/examples/LinearAlgebra/CMakeLists.txt b/examples/LinearAlgebra/CMakeLists.txt index aaad9baf7..6c3edab8c 100644 --- a/examples/LinearAlgebra/CMakeLists.txt +++ b/examples/LinearAlgebra/CMakeLists.txt @@ -1,2 +1 @@ -add_subdirectory(SparseTest) add_subdirectory(DenseTest) diff --git a/examples/LinearAlgebra/DenseTest/DenseTest.cpp b/examples/LinearAlgebra/DenseTest/DenseTest.cpp index 0efd5e94a..22a537d42 100644 --- a/examples/LinearAlgebra/DenseTest/DenseTest.cpp +++ b/examples/LinearAlgebra/DenseTest/DenseTest.cpp @@ -5,10 +5,9 @@ int main() { int fail = 0; - size_t m = 4; - size_t n = 4; - GridKit::LinearAlgebra::DenseMatrix A = - GridKit::LinearAlgebra::DenseMatrix(m, n); + size_t m = 4; + size_t n = 4; + auto A = GridKit::LinearAlgebra::DenseMatrix(m, n); double val = 0.0; for (size_t j = 0; j < n; ++j) @@ -19,8 +18,7 @@ int main() val += 1.0; } } - A.printMatrix("Dense matrix test output"); - (A.getValuesCOO())->printMatrix(); + A.print("Dense matrix test output"); return fail; } diff --git a/examples/LinearAlgebra/SparseTest/CMakeLists.txt b/examples/LinearAlgebra/SparseTest/CMakeLists.txt deleted file mode 100644 index abda11b7f..000000000 --- a/examples/LinearAlgebra/SparseTest/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -add_executable(spmattest SparseTest.cpp) -target_link_libraries( - spmattest GridKit::sparse_matrix) - -add_test(NAME SparseMatrixTest COMMAND spmattest) -install(TARGETS spmattest RUNTIME DESTINATION bin) diff --git a/examples/LinearAlgebra/SparseTest/SparseTest.cpp b/examples/LinearAlgebra/SparseTest/SparseTest.cpp deleted file mode 100644 index 2e5224c7b..000000000 --- a/examples/LinearAlgebra/SparseTest/SparseTest.cpp +++ /dev/null @@ -1,102 +0,0 @@ - - -#include -#include -#include -#include -#include -#include -#include - -#include - -int main() -{ - std::vector val{0.1, 0.2, 0.3, 0.4}; - std::vector x{2, 1, 3, 1}; - std::vector y{1, 3, 2, 2}; - size_t n = 4; - size_t m = 4; - - GridKit::LinearAlgebra::COO_Matrix A = GridKit::LinearAlgebra::COO_Matrix(x, y, val, m, n); - - std::vector valn(4); - std::vector xn(4); - std::vector yn(4); - - std::tie(xn, yn, valn) = A.getEntries(); - - for (size_t i = 0; i < valn.size(); i++) - { - std::cout << valn[i] << "\n"; - } - - std::cout << "A:\n"; - A.printMatrix(); - - std::vector val2{0.5, 0.6, 0.7, 0.8, 1.0}; - std::vector x2{0, 2, 0, 2, 1}; - std::vector y2{3, 3, 2, 2, 3}; - GridKit::LinearAlgebra::COO_Matrix B = GridKit::LinearAlgebra::COO_Matrix(x2, y2, val2, m, n); - - std::cout << "B:\n"; - B.printMatrix(); - - A.axpy(2.0, B); - - std::cout << "A + 2B:\n"; - A.printMatrix(); - - std::vector r; - std::vector c; - std::vector v; - std::tie(r, c, v) = A.setDataToCSR(); - - for (size_t i = 0; i < r.size() - 1; i++) - { - std::cout << r[i] << std::endl; - size_t rdiff = r[i + 1] - r[i]; - for (size_t j = 0; j < rdiff; j++) - { - std::cout << c[j + r[i]] << ", " << v[j + r[i]] << std::endl; - } - } - std::cout << r[r.size() - 1] << std::endl; - - // Basic Verification test - std::vector rtest = {0, 2, 4, 7, 8}; - std::vector ctest = {2, 3, 2, 3, 1, 2, 3, 2}; - std::vector valtest = {1.4, 1.0, 0.4, 2.2, 0.1, 1.6, 1.2, 0.3}; - - assert(rtest.size() == r.size()); - assert(ctest.size() == c.size()); - assert(valtest.size() == v.size()); - - int failval = 0; - for (size_t i = 0; i < rtest.size(); i++) - { - if (r[i] != rtest[i]) - { - failval--; - } - } - for (size_t i = 0; i < ctest.size(); i++) - { - double vdiff = v[i] - valtest[i]; - if (c[i] != ctest[i] || -1e-14 > vdiff || vdiff > 1e-14) - { - failval--; - } - } - - if (failval == 0) - { - std::cout << "Success!" << std::endl; - } - else - { - std::cout << "Failed!" << std::endl; - } - - return failval; -} diff --git a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp index 07246e83a..2cb9220ac 100644 --- a/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp +++ b/examples/PowerElectronics/ScaleMicrogrid/ScaleMicrogrid.cpp @@ -261,8 +261,6 @@ int test(index_type Nsize, real_type error_tol, bool debug_output) sys_model->initialize(); sys_model->evaluateResidual(); - // print the residual in matrix market format - sys_model->printResidualMatrixMarket("ScaleMicrogrid_Residual_N" + std::to_string(Nsize) + ".mtx", "ScaleMicrogrid Residual N" + std::to_string(Nsize)); std::vector& fres = sys_model->getResidual(); if (debug_output) { @@ -276,8 +274,6 @@ int test(index_type Nsize, real_type error_tol, bool debug_output) sys_model->updateTime(0.0, 1.0e-8); sys_model->evaluateJacobian(); - // sys_model->printJacobianMatrixMarket("ScaleMicrogrid_Jacobian_N" + std::to_string(Nsize) + ".mtx", "ScaleMicrogrid Jacobian N" + std::to_string(Nsize)); - // print the jacobian in matrix market format if (debug_output) { diff --git a/tests/UnitTests/LinearAlgebra/SparseMatrix/CMakeLists.txt b/tests/UnitTests/LinearAlgebra/SparseMatrix/CMakeLists.txt index a7075f92f..16e3e85ab 100644 --- a/tests/UnitTests/LinearAlgebra/SparseMatrix/CMakeLists.txt +++ b/tests/UnitTests/LinearAlgebra/SparseMatrix/CMakeLists.txt @@ -2,7 +2,7 @@ add_executable(test_sparse_csr runSparseCsrTests.cpp) target_link_libraries( test_sparse_csr GridKit::sparse_matrix GridKit::testing) -add_test(NAME SparseTest COMMAND $) +add_test(NAME SparseCsrTest COMMAND $) add_executable(test_sparse_coo runSparseCooTests.cpp) target_link_libraries( diff --git a/tests/UnitTests/PhasorDynamics/ExciterIeeet1Tests.hpp b/tests/UnitTests/PhasorDynamics/ExciterIeeet1Tests.hpp index e514d7f3a..766732b7e 100644 --- a/tests/UnitTests/PhasorDynamics/ExciterIeeet1Tests.hpp +++ b/tests/UnitTests/PhasorDynamics/ExciterIeeet1Tests.hpp @@ -222,7 +222,7 @@ namespace GridKit exciter.evaluateJacobian(); GridKit::LinearAlgebra::COO_Matrix& model_jacobian = exciter.getJacobian(); model_jacobian.deduplicate(); - model_jacobian.printMatrix("Model Jacobian"); + model_jacobian.print("Model Jacobian"); return GridKit::Testing::MapFromCOO(model_jacobian); } diff --git a/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp b/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp index 085ba7416..3f90ab916 100644 --- a/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp +++ b/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp @@ -438,7 +438,7 @@ namespace GridKit exciter.evaluateJacobian(); GridKit::LinearAlgebra::COO_Matrix& model_jacobian = exciter.getJacobian(); model_jacobian.deduplicate(); - model_jacobian.printMatrix("Model Jacobian"); + model_jacobian.print("Model Jacobian"); return GridKit::Testing::MapFromCOO(model_jacobian); } diff --git a/tests/UnitTests/PhasorDynamics/GenClassicalTests.hpp b/tests/UnitTests/PhasorDynamics/GenClassicalTests.hpp index d956ba9f3..88190c032 100644 --- a/tests/UnitTests/PhasorDynamics/GenClassicalTests.hpp +++ b/tests/UnitTests/PhasorDynamics/GenClassicalTests.hpp @@ -447,7 +447,7 @@ namespace GridKit gen.evaluateJacobian(); GridKit::LinearAlgebra::COO_Matrix& model_jacobian = gen.getJacobian(); model_jacobian.deduplicate(); - model_jacobian.printMatrix("Model Jacobian"); + model_jacobian.print("Model Jacobian"); return GridKit::Testing::MapFromCOO(model_jacobian); } diff --git a/tests/UnitTests/PhasorDynamics/GenrouTests.hpp b/tests/UnitTests/PhasorDynamics/GenrouTests.hpp index 62bf255b2..8cea60fbd 100644 --- a/tests/UnitTests/PhasorDynamics/GenrouTests.hpp +++ b/tests/UnitTests/PhasorDynamics/GenrouTests.hpp @@ -488,7 +488,7 @@ namespace GridKit gen.evaluateJacobian(); GridKit::LinearAlgebra::COO_Matrix& model_jacobian = gen.getJacobian(); model_jacobian.deduplicate(); - model_jacobian.printMatrix("Model Jacobian"); + model_jacobian.print("Model Jacobian"); return GridKit::Testing::MapFromCOO(model_jacobian); } diff --git a/tests/UnitTests/PhasorDynamics/GovernorTgov1Tests.hpp b/tests/UnitTests/PhasorDynamics/GovernorTgov1Tests.hpp index 3d9d40eb0..bb0578d5f 100644 --- a/tests/UnitTests/PhasorDynamics/GovernorTgov1Tests.hpp +++ b/tests/UnitTests/PhasorDynamics/GovernorTgov1Tests.hpp @@ -418,7 +418,7 @@ namespace GridKit gov.evaluateJacobian(); GridKit::LinearAlgebra::COO_Matrix model_jacobian = gov.getJacobian(); model_jacobian.deduplicate(); - model_jacobian.printMatrix("Model Jacobian"); + model_jacobian.print("Model Jacobian"); return GridKit::Testing::MapFromCOO(model_jacobian); } diff --git a/tests/UnitTests/PhasorDynamics/LoadTests.hpp b/tests/UnitTests/PhasorDynamics/LoadTests.hpp index c50f60a16..60b65019d 100644 --- a/tests/UnitTests/PhasorDynamics/LoadTests.hpp +++ b/tests/UnitTests/PhasorDynamics/LoadTests.hpp @@ -152,7 +152,7 @@ namespace GridKit load.evaluateJacobian(); GridKit::LinearAlgebra::COO_Matrix model_jacobian = load.getJacobian(); - model_jacobian.printMatrix("Model Jacobian"); + model_jacobian.print("Model Jacobian"); /// Compare model Jacobian wih dependencies computed analytically std::vector ref = analyticalJacobian(R, X); diff --git a/tests/UnitTests/PhasorDynamics/LoadZIPTests.hpp b/tests/UnitTests/PhasorDynamics/LoadZIPTests.hpp index 15b68d535..818a00d79 100644 --- a/tests/UnitTests/PhasorDynamics/LoadZIPTests.hpp +++ b/tests/UnitTests/PhasorDynamics/LoadZIPTests.hpp @@ -239,7 +239,7 @@ namespace GridKit load.evaluateJacobian(); GridKit::LinearAlgebra::COO_Matrix& model_jacobian = load.getJacobian(); model_jacobian.deduplicate(); - model_jacobian.printMatrix("Model Jacobian"); + model_jacobian.print("Model Jacobian"); return GridKit::Testing::MapFromCOO(model_jacobian); } diff --git a/tests/UnitTests/PhasorDynamics/StabilizerIeeestTests.hpp b/tests/UnitTests/PhasorDynamics/StabilizerIeeestTests.hpp index 0c1c77d66..6ef6bc41a 100644 --- a/tests/UnitTests/PhasorDynamics/StabilizerIeeestTests.hpp +++ b/tests/UnitTests/PhasorDynamics/StabilizerIeeestTests.hpp @@ -310,7 +310,7 @@ namespace GridKit auto model_jacobian = stab.getJacobian(); model_jacobian.deduplicate(); - model_jacobian.printMatrix("IEEEST Jacobian"); + model_jacobian.print("IEEEST Jacobian"); return GridKit::Testing::MapFromCOO(model_jacobian); } From 04cda1761b65c7a05ef0cc194d21523cb1ddbbd6 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Mon, 8 Jun 2026 16:13:50 -0400 Subject: [PATCH 02/39] Separate implementation and calls for DfDy and DfDyp. --- .../AutomaticDifferentiation/Enzyme/DfDy.hpp | 163 ---------------- .../AutomaticDifferentiation/Enzyme/DfDyp.hpp | 183 ++++++++++++++++++ .../Enzyme/SparseJacobians.hpp | 1 + .../Exciter/IEEET1/Ieeet1Enzyme.cpp | 19 +- .../Exciter/SEXS-PTI/SexsPtiEnzyme.cpp | 19 +- .../Governor/Tgov1/Tgov1Enzyme.cpp | 19 +- .../Model/PhasorDynamics/Load/LoadEnzyme.cpp | 2 - .../PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp | 2 - .../Stabilizer/IEEEST/IeeestEnzyme.cpp | 19 +- .../GENROUwS/GenrouEnzyme.cpp | 19 +- .../GENSALwS/GensalEnzyme.cpp | 19 +- .../GenClassical/GenClassicalEnzyme.cpp | 18 +- 12 files changed, 309 insertions(+), 174 deletions(-) create mode 100644 GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp index 51142932c..00b94b3dc 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp @@ -58,7 +58,6 @@ namespace GridKit { if (n_res > 0 && n_var > 0) { - // df/dy std::vector elementary_v(n_var); IdxT nnz = 0; for (size_t var_i = 0; var_i < n_var; ++var_i) @@ -99,122 +98,6 @@ namespace GridKit // Store result jac.setValues(1.0, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes - - // There is no df/dy' when alpha is not passed as an argument - // @todo: Implement a generic way to identify these cases at compile time - } - } - - /** - * @param[in] model - Pointer to the model to be differentiated - * @param[in] n_res - Number of residual functions - * @param[in] n_var - Number of independent variables - * @param[in] res_indices - Global residual indices - * @param[in] var_indices - Global variable indices - * @param[in] y - Internal variables - * @param[in] yp - Internal variable derivatives - * @param[in] wb - Bus variables - * @param[in] alpha - Time derivative jacobian coefficient - * @param[in,out] jac - Jacobian - */ - static void eval(ModelT* model, - size_t n_res, - size_t n_var, - const IdxT* res_indices, - const IdxT* var_indices, - ScalarT* y, - ScalarT* yp, - ScalarT* wb, - RealT alpha, - IdxT* rows, - IdxT* cols, - RealT* vals, - MatrixT& jac) - { - if (n_res > 0 && n_var > 0) - { - // df/dy - std::vector elementary_v(n_var); - IdxT nnz = 0; - for (size_t var_i = 0; var_i < n_var; ++var_i) - { - // Sparse storage. @see LowerSparseStorage.hpp - ScalarT* output = __enzyme_todense((void*) ident_load, - (void*) ident_store, - var_i); - ScalarT* d_output = __enzyme_todense((void*) sparse_load, - (void*) sparse_store, - var_i, - res_indices, - var_indices, - rows, - cols, - vals, - &nnz); - - // Elementary vector for Jacobian-vector product - std::ranges::fill(elementary_v, 0.0); - elementary_v[var_i] = 1.0; - - // Core automatic differentiaation intrinsic that will be replaced by a derivative - __enzyme_fwddiff((void*) ModelWrapper::eval, - enzyme_const, - model, - enzyme_dup, - y, - output, - enzyme_const, - yp, - enzyme_const, - wb, - enzyme_dupnoneed, - elementary_v.data(), - d_output); - } - - // Store result - jac.setValues(1.0, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes - - // df/dy' - nnz = 0; - for (size_t var_i = 0; var_i < n_var; ++var_i) - { - // Sparse storage. @see LowerSparseStorage.hpp - ScalarT* output = __enzyme_todense((void*) ident_load, - (void*) ident_store, - var_i); - ScalarT* d_output = __enzyme_todense((void*) sparse_load, - (void*) sparse_store, - var_i, - res_indices, - var_indices, - rows, - cols, - vals, - &nnz); - - // Elementary vector for Jacobian-vector product - std::ranges::fill(elementary_v, 0.0); - elementary_v[var_i] = 1.0; - - // Core automatic differentiaation intrinsic that will be replaced by a derivative - __enzyme_fwddiff((void*) ModelWrapper::eval, - enzyme_const, - model, - enzyme_const, - y, - enzyme_dup, - yp, - output, - enzyme_const, - wb, - enzyme_dupnoneed, - elementary_v.data(), - d_output); - } - - // Store result - jac.setValues(alpha, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes } } @@ -228,7 +111,6 @@ namespace GridKit * @param[in] yp - Internal variable derivatives * @param[in] wb - Bus variables * @param[in] ws - Signal variables - * @param[in] alpha - Time derivative jacobian coefficient * @param[in,out] jac - Jacobian */ static void eval(ModelT* model, @@ -240,7 +122,6 @@ namespace GridKit ScalarT* yp, ScalarT* wb, ScalarT* ws, - RealT alpha, IdxT* rows, IdxT* cols, RealT* vals, @@ -248,7 +129,6 @@ namespace GridKit { if (n_res > 0 && n_var > 0) { - // df/dy std::vector elementary_v(n_var); IdxT nnz = 0; for (size_t var_i = 0; var_i < n_var; ++var_i) @@ -291,49 +171,6 @@ namespace GridKit // Store result jac.setValues(1.0, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes - - // df/dy' - nnz = 0; - for (size_t var_i = 0; var_i < n_var; ++var_i) - { - // Sparse storage. @see LowerSparseStorage.hpp - ScalarT* output = __enzyme_todense((void*) ident_load, - (void*) ident_store, - var_i); - ScalarT* d_output = __enzyme_todense((void*) sparse_load, - (void*) sparse_store, - var_i, - res_indices, - var_indices, - rows, - cols, - vals, - &nnz); - - // Elementary vector for Jacobian-vector product - std::ranges::fill(elementary_v, 0.0); - elementary_v[var_i] = 1.0; - - // Core automatic differentiaation intrinsic that will be replaced by a derivative - __enzyme_fwddiff((void*) ModelWrapper::eval, - enzyme_const, - model, - enzyme_const, - y, - enzyme_dup, - yp, - output, - enzyme_const, - wb, - enzyme_const, - ws, - enzyme_dupnoneed, - elementary_v.data(), - d_output); - } - - // Store result - jac.setValues(alpha, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes } } }; diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp new file mode 100644 index 000000000..7f82ce183 --- /dev/null +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp @@ -0,0 +1,183 @@ +/** + * @file DfDyp.hpp + * @author Nicholson Koukpaizan (koukpaizannk@ornl.gov) + * + */ + +#pragma once + +#include +#include +#include +#include +#include + +namespace GridKit +{ + namespace Enzyme + { + namespace Sparse + { + /** + * @brief Enzyme automatic differentiation Jacobian evaluator: Internal Jacobian, alpha*df/dyp + * + * @tparam ModelT - model type + * @tparam MemberFunctions - member function parameter key + * @tparam ScalarT - scalar data type + * @tparam IdxT - matrix index data type + */ + template + struct DfDyp + { + using RealT = typename GridKit::ScalarTraits::RealT; + using MatrixT = GridKit::LinearAlgebra::COO_Matrix; + + /** + * @param[in] model - Pointer to the model to be differentiated + * @param[in] n_res - Number of residual functions + * @param[in] n_var - Number of independent variables + * @param[in] res_indices - Global residual indices + * @param[in] var_indices - Global variable indices + * @param[in] y - Internal variables + * @param[in] yp - Internal variable derivatives + * @param[in] wb - Bus variables + * @param[in] alpha - Time derivative jacobian coefficient + * @param[in,out] jac - Jacobian + */ + static void eval(ModelT* model, + size_t n_res, + size_t n_var, + const IdxT* res_indices, + const IdxT* var_indices, + ScalarT* y, + ScalarT* yp, + ScalarT* wb, + RealT alpha, + IdxT* rows, + IdxT* cols, + RealT* vals, + MatrixT& jac) + { + if (n_res > 0 && n_var > 0) + { + std::vector elementary_v(n_var); + IdxT nnz = 0; + for (size_t var_i = 0; var_i < n_var; ++var_i) + { + // Sparse storage. @see LowerSparseStorage.hpp + ScalarT* output = __enzyme_todense((void*) ident_load, + (void*) ident_store, + var_i); + ScalarT* d_output = __enzyme_todense((void*) sparse_load, + (void*) sparse_store, + var_i, + res_indices, + var_indices, + rows, + cols, + vals, + &nnz); + + // Elementary vector for Jacobian-vector product + std::ranges::fill(elementary_v, 0.0); + elementary_v[var_i] = 1.0; + + // Core automatic differentiaation intrinsic that will be replaced by a derivative + __enzyme_fwddiff((void*) ModelWrapper::eval, + enzyme_const, + model, + enzyme_const, + y, + enzyme_dup, + yp, + output, + enzyme_const, + wb, + enzyme_dupnoneed, + elementary_v.data(), + d_output); + } + + // Store result + jac.setValues(alpha, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes + } + } + + /** + * @param[in] model - Pointer to the model to be differentiated + * @param[in] n_res - Number of residual functions + * @param[in] n_var - Number of independent variables + * @param[in] res_indices - Map from local residual indices to global indices + * @param[in] var_indices - Map from local variable indices to global indices + * @param[in] y - Internal variables + * @param[in] yp - Internal variable derivatives + * @param[in] wb - Bus variables + * @param[in] ws - Signal variables + * @param[in] alpha - Time derivative jacobian coefficient + * @param[in,out] jac - Jacobian + */ + static void eval(ModelT* model, + size_t n_res, + size_t n_var, + const IdxT* res_indices, + const IdxT* var_indices, + ScalarT* y, + ScalarT* yp, + ScalarT* wb, + ScalarT* ws, + RealT alpha, + IdxT* rows, + IdxT* cols, + RealT* vals, + MatrixT& jac) + { + if (n_res > 0 && n_var > 0) + { + std::vector elementary_v(n_var); + IdxT nnz = 0; + for (size_t var_i = 0; var_i < n_var; ++var_i) + { + // Sparse storage. @see LowerSparseStorage.hpp + ScalarT* output = __enzyme_todense((void*) ident_load, + (void*) ident_store, + var_i); + ScalarT* d_output = __enzyme_todense((void*) sparse_load, + (void*) sparse_store, + var_i, + res_indices, + var_indices, + rows, + cols, + vals, + &nnz); + + // Elementary vector for Jacobian-vector product + std::ranges::fill(elementary_v, 0.0); + elementary_v[var_i] = 1.0; + + // Core automatic differentiaation intrinsic that will be replaced by a derivative + __enzyme_fwddiff((void*) ModelWrapper::eval, + enzyme_const, + model, + enzyme_const, + y, + enzyme_dup, + yp, + output, + enzyme_const, + wb, + enzyme_const, + ws, + enzyme_dupnoneed, + elementary_v.data(), + d_output); + } + + // Store result + jac.setValues(alpha, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes + } + } + }; + } // namespace Sparse + } // namespace Enzyme +} // namespace GridKit diff --git a/GridKit/AutomaticDifferentiation/Enzyme/SparseJacobians.hpp b/GridKit/AutomaticDifferentiation/Enzyme/SparseJacobians.hpp index 9a9df2777..6be78e42f 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/SparseJacobians.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/SparseJacobians.hpp @@ -9,5 +9,6 @@ #include #include #include +#include #include #include diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp index 31ef04039..49606b3e1 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp @@ -47,12 +47,29 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), - alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, J_); + GridKit::Enzyme::Sparse::DfDyp, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, + ScalarT, + IdxT>::eval(this, + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + alpha_, + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + J_); + GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, ScalarT, diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp index 2cc959481..3aafcc481 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp @@ -40,12 +40,29 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), - alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, J_); + GridKit::Enzyme::Sparse::DfDyp, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, + ScalarT, + IdxT>::eval(this, + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + alpha_, + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + J_); + GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, ScalarT, diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp index 115670d4f..c62b92547 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp @@ -47,12 +47,29 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), - alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, J_); + GridKit::Enzyme::Sparse::DfDyp, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, + ScalarT, + IdxT>::eval(this, + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + alpha_, + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + J_); + GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, ScalarT, diff --git a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp index 58ea9c1f5..7c12d31a1 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp @@ -31,8 +31,6 @@ namespace GridKit J_vals_buffer_ = new RealT[4]; } - // DfDy call without alpha_ to indicate that df/dy' is null - // @todo: deduce from a compile-time differential tag GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual, ScalarT, diff --git a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp index a5f7e6dfc..b8f98d3b3 100644 --- a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp @@ -26,8 +26,6 @@ namespace GridKit J_vals_buffer_ = new RealT[4]; } - // DfDy call without alpha_ to indicate that df/dy' is null - // @todo: deduce from a compile-time differential tag GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual, ScalarT, diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp index 1ea9e6434..128918954 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp @@ -49,12 +49,29 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), - alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, J_); + GridKit::Enzyme::Sparse::DfDyp, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, + ScalarT, + IdxT>::eval(this, + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + alpha_, + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + J_); + GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, ScalarT, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp index 2fb91a858..e61710d93 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp @@ -45,12 +45,29 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), - alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, J_); + GridKit::Enzyme::Sparse::DfDyp, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, + ScalarT, + IdxT>::eval(this, + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + alpha_, + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + J_); + GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, ScalarT, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp index deb4b1f5a..fc2b5918e 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp @@ -45,12 +45,29 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), - alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, J_); + GridKit::Enzyme::Sparse::DfDyp, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, + ScalarT, + IdxT>::eval(this, + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + alpha_, + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + J_); + GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, ScalarT, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp index f5f664035..49a42d1f0 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp @@ -44,12 +44,28 @@ namespace GridKit y_.data(), yp_.data(), wb_.data(), - alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, J_); + GridKit::Enzyme::Sparse::DfDyp, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual, + ScalarT, + IdxT>::eval(this, + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + alpha_, + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + J_); + GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual, ScalarT, From 6caca2c5770113aa764b13d247e2e3ff3026dc9d Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Mon, 8 Jun 2026 16:19:26 -0400 Subject: [PATCH 03/39] Update Component class templates. --- GridKit/Model/PhasorDynamics/Component.hpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/Component.hpp b/GridKit/Model/PhasorDynamics/Component.hpp index 985c4eae1..209264055 100644 --- a/GridKit/Model/PhasorDynamics/Component.hpp +++ b/GridKit/Model/PhasorDynamics/Component.hpp @@ -17,10 +17,12 @@ namespace GridKit /** * @brief Component model implementation base class. */ - template - class Component : public Model::Evaluator + template + class Component : public Model::Evaluator { public: + using ScalarT = scalar_type; + using IdxT = index_type; using RealT = typename Model::Evaluator::RealT; using MatrixT = typename Model::Evaluator::MatrixT; From 31623ad14bcde850cbf5e38c1e0ff0106a83578e Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Mon, 8 Jun 2026 16:39:39 -0400 Subject: [PATCH 04/39] Get ScalarT and IdxT from ModelT::ScalarT and ModelT::IdxT in Enzyme wrappers. --- .../AutomaticDifferentiation/Enzyme/DfDwb.hpp | 16 +++---- .../AutomaticDifferentiation/Enzyme/DfDws.hpp | 14 +++--- .../AutomaticDifferentiation/Enzyme/DfDy.hpp | 16 +++---- .../AutomaticDifferentiation/Enzyme/DfDyp.hpp | 16 +++---- .../AutomaticDifferentiation/Enzyme/DhDwb.hpp | 14 +++--- .../AutomaticDifferentiation/Enzyme/DhDy.hpp | 14 +++--- .../Enzyme/ModelWrappers.hpp | 47 ++++++++++++------- .../PhasorDynamics/Branch/BranchEnzyme.cpp | 16 ++----- .../BusFault/BusFaultEnzyme.cpp | 4 +- .../Exciter/IEEET1/Ieeet1Enzyme.cpp | 16 ++----- .../Exciter/SEXS-PTI/SexsPtiEnzyme.cpp | 16 ++----- .../Governor/Tgov1/Tgov1Enzyme.cpp | 12 ++--- .../Model/PhasorDynamics/Load/LoadEnzyme.cpp | 12 ++--- .../PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp | 12 ++--- .../Stabilizer/IEEEST/IeeestEnzyme.cpp | 12 ++--- .../GENROUwS/GenrouEnzyme.cpp | 24 +++------- .../GENSALwS/GensalEnzyme.cpp | 24 +++------- .../GenClassical/GenClassicalEnzyme.cpp | 16 ++----- 18 files changed, 110 insertions(+), 191 deletions(-) diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp index 88b62a0d1..1f78bf743 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp @@ -9,8 +9,6 @@ #include #include #include -#include -#include namespace GridKit { @@ -23,14 +21,14 @@ namespace GridKit * * @tparam ModelT - model type * @tparam MemberFunctions - member function parameter key - * @tparam ScalarT - scalar data type - * @tparam IdxT - matrix index data type */ - template + template struct DfDwb { - using RealT = typename GridKit::ScalarTraits::RealT; - using MatrixT = GridKit::LinearAlgebra::COO_Matrix; + using ScalarT = typename ModelT::ScalarT; + using IdxT = typename ModelT::IdxT; + using RealT = typename ModelT::RealT; + using MatrixT = typename ModelT::MatrixT; /** * @param[in] model - Pointer to the model to be differentiated @@ -81,7 +79,7 @@ namespace GridKit elementary_v[var_i] = 1.0; // Core automatic differentiaation intrinsic that will be replaced by a derivative - __enzyme_fwddiff((void*) ModelWrapper::eval, + __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, enzyme_const, @@ -152,7 +150,7 @@ namespace GridKit elementary_v[var_i] = 1.0; // Core automatic differentiaation intrinsic that will be replaced by a derivative - __enzyme_fwddiff((void*) ModelWrapper::eval, + __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, enzyme_const, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp index 7124ad0b0..8bc6fefa2 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp @@ -9,8 +9,6 @@ #include #include #include -#include -#include namespace GridKit { @@ -23,14 +21,14 @@ namespace GridKit * * @tparam ModelT - model type * @tparam MemberFunctions - member function parameter key - * @tparam ScalarT - scalar data type - * @tparam IdxT - matrix index data type */ - template + template struct DfDws { - using RealT = typename GridKit::ScalarTraits::RealT; - using MatrixT = GridKit::LinearAlgebra::COO_Matrix; + using ScalarT = typename ModelT::ScalarT; + using IdxT = typename ModelT::IdxT; + using RealT = typename ModelT::RealT; + using MatrixT = typename ModelT::MatrixT; /** * @param[in] model - Pointer to the model to be differentiated @@ -83,7 +81,7 @@ namespace GridKit elementary_v[var_i] = 1.0; // Core automatic differentiaation intrinsic that will be replaced by a derivative - __enzyme_fwddiff((void*) ModelWrapper::eval, + __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, enzyme_const, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp index 00b94b3dc..015065676 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp @@ -9,8 +9,6 @@ #include #include #include -#include -#include namespace GridKit { @@ -23,14 +21,14 @@ namespace GridKit * * @tparam ModelT - model type * @tparam MemberFunctions - member function parameter key - * @tparam ScalarT - scalar data type - * @tparam IdxT - matrix index data type */ - template + template struct DfDy { - using RealT = typename GridKit::ScalarTraits::RealT; - using MatrixT = GridKit::LinearAlgebra::COO_Matrix; + using ScalarT = typename ModelT::ScalarT; + using IdxT = typename ModelT::IdxT; + using RealT = typename ModelT::RealT; + using MatrixT = typename ModelT::MatrixT; /** * @param[in] model - Pointer to the model to be differentiated @@ -81,7 +79,7 @@ namespace GridKit elementary_v[var_i] = 1.0; // Core automatic differentiaation intrinsic that will be replaced by a derivative - __enzyme_fwddiff((void*) ModelWrapper::eval, + __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, enzyme_dup, @@ -152,7 +150,7 @@ namespace GridKit elementary_v[var_i] = 1.0; // Core automatic differentiaation intrinsic that will be replaced by a derivative - __enzyme_fwddiff((void*) ModelWrapper::eval, + __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, enzyme_dup, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp index 7f82ce183..585117a05 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp @@ -9,8 +9,6 @@ #include #include #include -#include -#include namespace GridKit { @@ -23,14 +21,14 @@ namespace GridKit * * @tparam ModelT - model type * @tparam MemberFunctions - member function parameter key - * @tparam ScalarT - scalar data type - * @tparam IdxT - matrix index data type */ - template + template struct DfDyp { - using RealT = typename GridKit::ScalarTraits::RealT; - using MatrixT = GridKit::LinearAlgebra::COO_Matrix; + using ScalarT = typename ModelT::ScalarT; + using IdxT = typename ModelT::IdxT; + using RealT = typename ModelT::RealT; + using MatrixT = typename ModelT::MatrixT; /** * @param[in] model - Pointer to the model to be differentiated @@ -83,7 +81,7 @@ namespace GridKit elementary_v[var_i] = 1.0; // Core automatic differentiaation intrinsic that will be replaced by a derivative - __enzyme_fwddiff((void*) ModelWrapper::eval, + __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, enzyme_const, @@ -156,7 +154,7 @@ namespace GridKit elementary_v[var_i] = 1.0; // Core automatic differentiaation intrinsic that will be replaced by a derivative - __enzyme_fwddiff((void*) ModelWrapper::eval, + __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, enzyme_const, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp index 11ea1dcdc..af47950d6 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp @@ -9,8 +9,6 @@ #include #include #include -#include -#include namespace GridKit { @@ -23,14 +21,14 @@ namespace GridKit * * @tparam ModelT - model type * @tparam MemberFunctions - member function parameter key - * @tparam ScalarT - scalar data type - * @tparam IdxT - matrix index data type */ - template + template struct DhDwb { - using RealT = typename GridKit::ScalarTraits::RealT; - using MatrixT = GridKit::LinearAlgebra::COO_Matrix; + using ScalarT = typename ModelT::ScalarT; + using IdxT = typename ModelT::IdxT; + using RealT = typename ModelT::RealT; + using MatrixT = typename ModelT::MatrixT; /** * @param[in] model - Pointer to the model to be differentiated @@ -83,7 +81,7 @@ namespace GridKit elementary_v[var_i] = 1.0; // Core automatic differentiaation intrinsic that will be replaced by a derivative - __enzyme_fwddiff((void*) ModelWrapper::eval, + __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, enzyme_const, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp index cddcf93a3..f493d2d06 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp @@ -9,8 +9,6 @@ #include #include #include -#include -#include namespace GridKit { @@ -23,14 +21,14 @@ namespace GridKit * * @tparam ModelT - model type * @tparam MemberFunctions - member function parameter key - * @tparam ScalarT - scalar data type - * @tparam IdxT - matrix index data type */ - template + template struct DhDy { - using RealT = typename GridKit::ScalarTraits::RealT; - using MatrixT = GridKit::LinearAlgebra::COO_Matrix; + using ScalarT = typename ModelT::ScalarT; + using IdxT = typename ModelT::IdxT; + using RealT = typename ModelT::RealT; + using MatrixT = typename ModelT::MatrixT; /** * @param[in] model - Pointer to the model to be differentiated @@ -81,7 +79,7 @@ namespace GridKit elementary_v[var_i] = 1.0; // Core automatic differentiaation intrinsic that will be replaced by a derivative - __enzyme_fwddiff((void*) ModelWrapper::eval, + __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, enzyme_dup, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/ModelWrappers.hpp b/GridKit/AutomaticDifferentiation/Enzyme/ModelWrappers.hpp index 09d67f08d..efbb0eaa6 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/ModelWrappers.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/ModelWrappers.hpp @@ -34,10 +34,9 @@ namespace GridKit * * @tparam ModelT - model type * @tparam MemberFunctions - member function parameter key - * @tparam ScalarT - scalar data type * */ - template + template struct ModelWrapper { }; @@ -46,9 +45,11 @@ namespace GridKit * @brief Residual wrapper partial template specialization for InternalResidual * */ - template - struct ModelWrapper + template + struct ModelWrapper { + using ScalarT = typename ModelT::ScalarT; + /** * @param[in] model - Pointer to the model to be differentiated * @param[in] y - Internal variables @@ -66,9 +67,11 @@ namespace GridKit * @brief Residual wrapper partial template specialization for InternalResidualWithSignal * */ - template - struct ModelWrapper + template + struct ModelWrapper { + using ScalarT = typename ModelT::ScalarT; + /** * @param[in] model - Pointer to the model to be differentiated * @param[in] y - Internal variables @@ -87,9 +90,11 @@ namespace GridKit * @brief Residual wrapper partial template specialization for BusResidual * */ - template - struct ModelWrapper + template + struct ModelWrapper { + using ScalarT = typename ModelT::ScalarT; + /** * @param[in] model - Pointer to the model to be differentiated * @param[in] y - Internal variables @@ -107,9 +112,11 @@ namespace GridKit * @brief Residual wrapper partial template specialization for BusResidual11 (branch member function) * */ - template - struct ModelWrapper + template + struct ModelWrapper { + using ScalarT = typename ModelT::ScalarT; + /** * @param[in] model - Pointer to the model to be differentiated * @param[in] y - Internal variables @@ -127,9 +134,11 @@ namespace GridKit * @brief Residual wrapper partial template specialization for BusResidual12 (branch member function) * */ - template - struct ModelWrapper + template + struct ModelWrapper { + using ScalarT = typename ModelT::ScalarT; + /** * @param[in] model - Pointer to the model to be differentiated * @param[in] y - Internal variables @@ -147,12 +156,14 @@ namespace GridKit * @brief Residual wrapper partial template specialization for BusResidual21 (branch member function) * */ - template - struct ModelWrapper + template + struct ModelWrapper { + using ScalarT = typename ModelT::ScalarT; + /** * @param[in] model - Pointer to the model to be differentiated - __enzyme_fwddiff((void*) ModelWrapper::eval, + __enzyme_fwddiff((void*) ModelWrapper::eval, * @param[in] y - Internal variables * @param[in] yp - Internal variable derivatives * @param[in] wb - Bus variables @@ -168,9 +179,11 @@ namespace GridKit * @brief Residual wrapper partial template specialization for BusResidual22 (branch member function) * */ - template - struct ModelWrapper + template + struct ModelWrapper { + using ScalarT = typename ModelT::ScalarT; + /** * @param[in] model - Pointer to the model to be differentiated * @param[in] y - Internal variables diff --git a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp index a6cd306b2..3d96c2e18 100644 --- a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp @@ -33,9 +33,7 @@ namespace GridKit // Bus 1 diagonal Jacobian block owned by the bus GridKit::Enzyme::Sparse::DhDwb, - GridKit::Enzyme::Sparse::MemberFunctions::BusResidual11, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::BusResidual11>::eval(this, static_cast(bus1_->size()), static_cast((bus1_->y()).size()), (bus1_->getResidualIndices()).data(), @@ -50,9 +48,7 @@ namespace GridKit // Bus 2 diagonal Jacobian block owned by the bus GridKit::Enzyme::Sparse::DhDwb, - GridKit::Enzyme::Sparse::MemberFunctions::BusResidual22, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::BusResidual22>::eval(this, static_cast(bus2_->size()), static_cast((bus2_->y()).size()), (bus2_->getResidualIndices()).data(), @@ -67,9 +63,7 @@ namespace GridKit // Off-diagonal Jacobian block (Bus2 variables) owned by the branch GridKit::Enzyme::Sparse::DhDwb, - GridKit::Enzyme::Sparse::MemberFunctions::BusResidual12, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::BusResidual12>::eval(this, static_cast(bus1_->size()), static_cast((bus2_->y()).size()), (bus1_->getResidualIndices()).data(), @@ -85,9 +79,7 @@ namespace GridKit // Off-diagonal Jacobian block (Bus1 variables) owned by the branch GridKit::Enzyme::Sparse::DhDwb, - GridKit::Enzyme::Sparse::MemberFunctions::BusResidual21, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::BusResidual21>::eval(this, static_cast(bus2_->size()), static_cast((bus1_->y()).size()), (bus2_->getResidualIndices()).data(), diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp index 9d3c45854..2bb2dc729 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp @@ -32,9 +32,7 @@ namespace GridKit J_vals_buffer_ = new RealT[4]; } GridKit::Enzyme::Sparse::DhDwb, - GridKit::Enzyme::Sparse::MemberFunctions::BusResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, static_cast(bus_->size()), static_cast(bus_->size()), (bus_->getResidualIndices()).data(), diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp index 49606b3e1..5456852a8 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp @@ -36,9 +36,7 @@ namespace GridKit } GridKit::Enzyme::Sparse::DfDy, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -53,9 +51,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDyp, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -71,9 +67,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDwb, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), static_cast(bus_->size()), (this->getResidualIndices()).data(), @@ -88,9 +82,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDws, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), ws_.size(), (this->getResidualIndices()).data(), diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp index 3aafcc481..9c0de3db0 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp @@ -29,9 +29,7 @@ namespace GridKit } GridKit::Enzyme::Sparse::DfDy, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -46,9 +44,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDyp, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -64,9 +60,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDwb, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), static_cast(bus_->size()), (this->getResidualIndices()).data(), @@ -81,9 +75,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDws, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), ws_.size(), (this->getResidualIndices()).data(), diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp index c62b92547..92829babc 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp @@ -36,9 +36,7 @@ namespace GridKit } GridKit::Enzyme::Sparse::DfDy, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -53,9 +51,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDyp, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -71,9 +67,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDws, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), ws_.size(), (this->getResidualIndices()).data(), diff --git a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp index 7c12d31a1..d3be1561f 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp @@ -32,9 +32,7 @@ namespace GridKit } GridKit::Enzyme::Sparse::DfDy, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -48,9 +46,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDwb, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, f_.size(), static_cast(bus_->size()), (this->getResidualIndices()).data(), @@ -64,9 +60,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DhDy, - GridKit::Enzyme::Sparse::MemberFunctions::BusResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, static_cast(bus_->size()), y_.size(), (bus_->getResidualIndices()).data(), diff --git a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp index b8f98d3b3..55d5c96dd 100644 --- a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp @@ -27,9 +27,7 @@ namespace GridKit } GridKit::Enzyme::Sparse::DfDy, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -43,9 +41,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDwb, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, f_.size(), static_cast(bus_->size()), (this->getResidualIndices()).data(), @@ -59,9 +55,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DhDy, - GridKit::Enzyme::Sparse::MemberFunctions::BusResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, static_cast(bus_->size()), y_.size(), (bus_->getResidualIndices()).data(), diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp index 128918954..445be1fbe 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp @@ -38,9 +38,7 @@ namespace GridKit } GridKit::Enzyme::Sparse::DfDy, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -55,9 +53,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDyp, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -73,9 +69,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDws, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), ws_.size(), (this->getResidualIndices()).data(), diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp index e61710d93..59fccc7dd 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp @@ -34,9 +34,7 @@ namespace GridKit } GridKit::Enzyme::Sparse::DfDy, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -51,9 +49,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDyp, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -69,9 +65,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDwb, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), static_cast(bus_->size()), (this->getResidualIndices()).data(), @@ -86,9 +80,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDws, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), ws_.size(), (this->getResidualIndices()).data(), @@ -103,9 +95,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DhDwb, - GridKit::Enzyme::Sparse::MemberFunctions::BusResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, static_cast(bus_->size()), static_cast(bus_->size()), (bus_->getResidualIndices()).data(), @@ -119,9 +109,7 @@ namespace GridKit bus_->getJacobian()); GridKit::Enzyme::Sparse::DhDy, - GridKit::Enzyme::Sparse::MemberFunctions::BusResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, static_cast(bus_->size()), y_.size(), (bus_->getResidualIndices()).data(), diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp index fc2b5918e..66ec38a8a 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp @@ -34,9 +34,7 @@ namespace GridKit } GridKit::Enzyme::Sparse::DfDy, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -51,9 +49,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDyp, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -69,9 +65,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDwb, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), static_cast(bus_->size()), (this->getResidualIndices()).data(), @@ -86,9 +80,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDws, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), ws_.size(), (this->getResidualIndices()).data(), @@ -103,9 +95,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DhDwb, - GridKit::Enzyme::Sparse::MemberFunctions::BusResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, static_cast(bus_->size()), static_cast(bus_->size()), (bus_->getResidualIndices()).data(), @@ -119,9 +109,7 @@ namespace GridKit bus_->getJacobian()); GridKit::Enzyme::Sparse::DhDy, - GridKit::Enzyme::Sparse::MemberFunctions::BusResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, static_cast(bus_->size()), y_.size(), (bus_->getResidualIndices()).data(), diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp index 49a42d1f0..143ece1a8 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp @@ -34,9 +34,7 @@ namespace GridKit } GridKit::Enzyme::Sparse::DfDy, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -50,9 +48,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDyp, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, f_.size(), y_.size(), (this->getResidualIndices()).data(), @@ -67,9 +63,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DfDwb, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, f_.size(), static_cast(bus_->size()), (this->getResidualIndices()).data(), @@ -83,9 +77,7 @@ namespace GridKit J_); GridKit::Enzyme::Sparse::DhDy, - GridKit::Enzyme::Sparse::MemberFunctions::BusResidual, - ScalarT, - IdxT>::eval(this, + GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, static_cast(bus_->size()), y_.size(), (bus_->getResidualIndices()).data(), From 2cbd8e6f80dcc6a2fcbbe7ed533922140b293550 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Mon, 8 Jun 2026 22:05:55 -0400 Subject: [PATCH 05/39] Return nnz from partial derivative Enzyme wrappers. --- .../AutomaticDifferentiation/Enzyme/DfDwb.hpp | 23 +++++---------- .../AutomaticDifferentiation/Enzyme/DfDws.hpp | 12 +++----- .../AutomaticDifferentiation/Enzyme/DfDy.hpp | 23 +++++---------- .../AutomaticDifferentiation/Enzyme/DfDyp.hpp | 29 ++++++------------- .../AutomaticDifferentiation/Enzyme/DhDwb.hpp | 21 +++----------- .../AutomaticDifferentiation/Enzyme/DhDy.hpp | 12 +++----- .../PhasorDynamics/Branch/BranchEnzyme.cpp | 16 ++++++---- .../BusFault/BusFaultEnzyme.cpp | 6 +++- .../Exciter/IEEET1/Ieeet1Enzyme.cpp | 15 ++++++---- .../Exciter/SEXS-PTI/SexsPtiEnzyme.cpp | 15 ++++++---- .../Governor/Tgov1/Tgov1Enzyme.cpp | 12 +++++--- .../Model/PhasorDynamics/Load/LoadEnzyme.cpp | 11 +++++-- .../PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp | 11 +++++-- .../Stabilizer/IEEEST/IeeestEnzyme.cpp | 12 +++++--- .../GENROUwS/GenrouEnzyme.cpp | 21 +++++++++----- .../GENSALwS/GensalEnzyme.cpp | 21 +++++++++----- .../GenClassical/GenClassicalEnzyme.cpp | 15 ++++++---- 17 files changed, 142 insertions(+), 133 deletions(-) diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp index 1f78bf743..e147863dc 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp @@ -28,7 +28,6 @@ namespace GridKit using ScalarT = typename ModelT::ScalarT; using IdxT = typename ModelT::IdxT; using RealT = typename ModelT::RealT; - using MatrixT = typename ModelT::MatrixT; /** * @param[in] model - Pointer to the model to be differentiated @@ -39,7 +38,7 @@ namespace GridKit * @param[in] y - Internal variables * @param[in] yp - Internal variable derivatives * @param[in] wb - Bus variables - * @param[in,out] jac - Jacobian + * @param[out] nnz - Number of nonzeros */ static void eval(ModelT* model, size_t n_res, @@ -52,12 +51,12 @@ namespace GridKit IdxT* rows, IdxT* cols, RealT* vals, - MatrixT& jac) + IdxT& nnz) { + nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); - IdxT nnz = 0; for (size_t var_i = 0; var_i < n_var; ++var_i) { // Sparse storage. @see LowerSparseStorage.hpp @@ -78,7 +77,7 @@ namespace GridKit std::ranges::fill(elementary_v, 0.0); elementary_v[var_i] = 1.0; - // Core automatic differentiaation intrinsic that will be replaced by a derivative + // Core automatic differentiation intrinsic that will be replaced by a derivative __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, @@ -93,9 +92,6 @@ namespace GridKit elementary_v.data(), d_output); } - - // Store result - jac.setValues(1.0, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes } } @@ -109,7 +105,7 @@ namespace GridKit * @param[in] yp - Internal variable derivatives * @param[in] wb - Bus variables * @param[in] ws - Signal variables - * @param[in,out] jac - Jacobian + * @param[out] nnz - Number of nonzeros */ static void eval(ModelT* model, size_t n_res, @@ -123,12 +119,12 @@ namespace GridKit IdxT* rows, IdxT* cols, RealT* vals, - MatrixT& jac) + IdxT& nnz) { + nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); - IdxT nnz = 0; for (size_t var_i = 0; var_i < n_var; ++var_i) { // Sparse storage. @see LowerSparseStorage.hpp @@ -149,7 +145,7 @@ namespace GridKit std::ranges::fill(elementary_v, 0.0); elementary_v[var_i] = 1.0; - // Core automatic differentiaation intrinsic that will be replaced by a derivative + // Core automatic differentiation intrinsic that will be replaced by a derivative __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, @@ -166,9 +162,6 @@ namespace GridKit elementary_v.data(), d_output); } - - // Store result - jac.setValues(1.0, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes } } }; diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp index 8bc6fefa2..5f7922701 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp @@ -28,7 +28,6 @@ namespace GridKit using ScalarT = typename ModelT::ScalarT; using IdxT = typename ModelT::IdxT; using RealT = typename ModelT::RealT; - using MatrixT = typename ModelT::MatrixT; /** * @param[in] model - Pointer to the model to be differentiated @@ -40,7 +39,7 @@ namespace GridKit * @param[in] yp - Internal variable derivatives * @param[in] wb - Bus variables * @param[in] ws - Signal variables - * @param[in,out] jac - Jacobian + * @param[out] nnz - Number of nonzeros */ static void eval(ModelT* model, size_t n_res, @@ -54,12 +53,12 @@ namespace GridKit IdxT* rows, IdxT* cols, RealT* vals, - MatrixT& jac) + IdxT& nnz) { + nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); - IdxT nnz = 0; for (size_t var_i = 0; var_i < n_var; ++var_i) { // Sparse storage. @see LowerSparseStorage.hpp @@ -80,7 +79,7 @@ namespace GridKit std::ranges::fill(elementary_v, 0.0); elementary_v[var_i] = 1.0; - // Core automatic differentiaation intrinsic that will be replaced by a derivative + // Core automatic differentiation intrinsic that will be replaced by a derivative __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, @@ -97,9 +96,6 @@ namespace GridKit elementary_v.data(), d_output); } - - // Store result - jac.setValues(1.0, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes } } }; diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp index 015065676..55429677c 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp @@ -28,7 +28,6 @@ namespace GridKit using ScalarT = typename ModelT::ScalarT; using IdxT = typename ModelT::IdxT; using RealT = typename ModelT::RealT; - using MatrixT = typename ModelT::MatrixT; /** * @param[in] model - Pointer to the model to be differentiated @@ -39,7 +38,7 @@ namespace GridKit * @param[in] y - Internal variables * @param[in] yp - Internal variable derivatives * @param[in] wb - Bus variables - * @param[in,out] jac - Jacobian + * @param[out] nnz - Number of nonzeros */ static void eval(ModelT* model, size_t n_res, @@ -52,12 +51,12 @@ namespace GridKit IdxT* rows, IdxT* cols, RealT* vals, - MatrixT& jac) + IdxT& nnz) { + nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); - IdxT nnz = 0; for (size_t var_i = 0; var_i < n_var; ++var_i) { // Sparse storage. @see LowerSparseStorage.hpp @@ -78,7 +77,7 @@ namespace GridKit std::ranges::fill(elementary_v, 0.0); elementary_v[var_i] = 1.0; - // Core automatic differentiaation intrinsic that will be replaced by a derivative + // Core automatic differentiation intrinsic that will be replaced by a derivative __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, @@ -93,9 +92,6 @@ namespace GridKit elementary_v.data(), d_output); } - - // Store result - jac.setValues(1.0, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes } } @@ -109,7 +105,7 @@ namespace GridKit * @param[in] yp - Internal variable derivatives * @param[in] wb - Bus variables * @param[in] ws - Signal variables - * @param[in,out] jac - Jacobian + * @param[out] nnz - Number of nonzeros */ static void eval(ModelT* model, size_t n_res, @@ -123,12 +119,12 @@ namespace GridKit IdxT* rows, IdxT* cols, RealT* vals, - MatrixT& jac) + IdxT& nnz) { + nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); - IdxT nnz = 0; for (size_t var_i = 0; var_i < n_var; ++var_i) { // Sparse storage. @see LowerSparseStorage.hpp @@ -149,7 +145,7 @@ namespace GridKit std::ranges::fill(elementary_v, 0.0); elementary_v[var_i] = 1.0; - // Core automatic differentiaation intrinsic that will be replaced by a derivative + // Core automatic differentiation intrinsic that will be replaced by a derivative __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, @@ -166,9 +162,6 @@ namespace GridKit elementary_v.data(), d_output); } - - // Store result - jac.setValues(1.0, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes } } }; diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp index 585117a05..a722c29dc 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp @@ -17,7 +17,7 @@ namespace GridKit namespace Sparse { /** - * @brief Enzyme automatic differentiation Jacobian evaluator: Internal Jacobian, alpha*df/dyp + * @brief Enzyme automatic differentiation Jacobian evaluator: Internal Jacobian, df/dyp * * @tparam ModelT - model type * @tparam MemberFunctions - member function parameter key @@ -28,7 +28,6 @@ namespace GridKit using ScalarT = typename ModelT::ScalarT; using IdxT = typename ModelT::IdxT; using RealT = typename ModelT::RealT; - using MatrixT = typename ModelT::MatrixT; /** * @param[in] model - Pointer to the model to be differentiated @@ -39,8 +38,7 @@ namespace GridKit * @param[in] y - Internal variables * @param[in] yp - Internal variable derivatives * @param[in] wb - Bus variables - * @param[in] alpha - Time derivative jacobian coefficient - * @param[in,out] jac - Jacobian + * @param[out] nnz - Number of nonzeros */ static void eval(ModelT* model, size_t n_res, @@ -50,16 +48,15 @@ namespace GridKit ScalarT* y, ScalarT* yp, ScalarT* wb, - RealT alpha, IdxT* rows, IdxT* cols, RealT* vals, - MatrixT& jac) + IdxT& nnz) { + nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); - IdxT nnz = 0; for (size_t var_i = 0; var_i < n_var; ++var_i) { // Sparse storage. @see LowerSparseStorage.hpp @@ -80,7 +77,7 @@ namespace GridKit std::ranges::fill(elementary_v, 0.0); elementary_v[var_i] = 1.0; - // Core automatic differentiaation intrinsic that will be replaced by a derivative + // Core automatic differentiation intrinsic that will be replaced by a derivative __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, @@ -95,9 +92,6 @@ namespace GridKit elementary_v.data(), d_output); } - - // Store result - jac.setValues(alpha, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes } } @@ -111,8 +105,7 @@ namespace GridKit * @param[in] yp - Internal variable derivatives * @param[in] wb - Bus variables * @param[in] ws - Signal variables - * @param[in] alpha - Time derivative jacobian coefficient - * @param[in,out] jac - Jacobian + * @param[out] nnz - Number of nonzeros */ static void eval(ModelT* model, size_t n_res, @@ -123,16 +116,15 @@ namespace GridKit ScalarT* yp, ScalarT* wb, ScalarT* ws, - RealT alpha, IdxT* rows, IdxT* cols, RealT* vals, - MatrixT& jac) + IdxT& nnz) { + nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); - IdxT nnz = 0; for (size_t var_i = 0; var_i < n_var; ++var_i) { // Sparse storage. @see LowerSparseStorage.hpp @@ -153,7 +145,7 @@ namespace GridKit std::ranges::fill(elementary_v, 0.0); elementary_v[var_i] = 1.0; - // Core automatic differentiaation intrinsic that will be replaced by a derivative + // Core automatic differentiation intrinsic that will be replaced by a derivative __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, @@ -170,9 +162,6 @@ namespace GridKit elementary_v.data(), d_output); } - - // Store result - jac.setValues(alpha, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes } } }; diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp index af47950d6..f5ab9a957 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp @@ -28,7 +28,6 @@ namespace GridKit using ScalarT = typename ModelT::ScalarT; using IdxT = typename ModelT::IdxT; using RealT = typename ModelT::RealT; - using MatrixT = typename ModelT::MatrixT; /** * @param[in] model - Pointer to the model to be differentiated @@ -39,8 +38,7 @@ namespace GridKit * @param[in] y - Internal variables * @param[in] yp - Internal variable derivatives * @param[in] wb - Bus variables - * @param[in,out] jac - Jacobian - * @param[in] flag - To append values or deduplicate right away (bus-owned values) + * @param[out] nnz - Number of nonzeros */ static void eval(ModelT* model, size_t n_res, @@ -53,13 +51,12 @@ namespace GridKit IdxT* rows, IdxT* cols, RealT* vals, - MatrixT& jac, - const bool flag = false) + IdxT& nnz) { + nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); - IdxT nnz = 0; for (size_t var_i = 0; var_i < n_var; ++var_i) { // Sparse storage. @see LowerSparseStorage.hpp @@ -80,7 +77,7 @@ namespace GridKit std::ranges::fill(elementary_v, 0.0); elementary_v[var_i] = 1.0; - // Core automatic differentiaation intrinsic that will be replaced by a derivative + // Core automatic differentiation intrinsic that will be replaced by a derivative __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, @@ -95,16 +92,6 @@ namespace GridKit elementary_v.data(), d_output); } - - // Store result - if (flag) - { - jac.setValues(1.0, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes - } - else - { - jac.axpy(1.0, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes - } } } }; diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp index f493d2d06..ce1554ab6 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp @@ -28,7 +28,6 @@ namespace GridKit using ScalarT = typename ModelT::ScalarT; using IdxT = typename ModelT::IdxT; using RealT = typename ModelT::RealT; - using MatrixT = typename ModelT::MatrixT; /** * @param[in] model - Pointer to the model to be differentiated @@ -39,7 +38,7 @@ namespace GridKit * @param[in] y - Internal variables * @param[in] yp - Internal variable derivatives * @param[in] wb - Bus variables - * @param[in,out] jac - Jacobian + * @param[out] nnz - Number of nonzeros */ static void eval(ModelT* model, size_t n_res, @@ -52,12 +51,12 @@ namespace GridKit IdxT* rows, IdxT* cols, RealT* vals, - MatrixT& jac) + IdxT& nnz) { + nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); - IdxT nnz = 0; for (size_t var_i = 0; var_i < n_var; ++var_i) { // Sparse storage. @see LowerSparseStorage.hpp @@ -78,7 +77,7 @@ namespace GridKit std::ranges::fill(elementary_v, 0.0); elementary_v[var_i] = 1.0; - // Core automatic differentiaation intrinsic that will be replaced by a derivative + // Core automatic differentiation intrinsic that will be replaced by a derivative __enzyme_fwddiff((void*) ModelWrapper::eval, enzyme_const, model, @@ -93,9 +92,6 @@ namespace GridKit elementary_v.data(), d_output); } - - // Store result - jac.setValues(1.0, rows, cols, vals, nnz); //< @todo: Update once sparse storage format changes } } }; diff --git a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp index 3d96c2e18..5167dc930 100644 --- a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp @@ -31,6 +31,8 @@ namespace GridKit J_vals_buffer_ = new RealT[4]; } + IdxT nnz; + // Bus 1 diagonal Jacobian block owned by the bus GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual11>::eval(this, @@ -44,7 +46,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - bus1_->getJacobian()); + nnz); + (bus1_->getJacobian()).axpy(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); // Bus 2 diagonal Jacobian block owned by the bus GridKit::Enzyme::Sparse::DhDwb, @@ -59,7 +62,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - bus2_->getJacobian()); + nnz); + (bus2_->getJacobian()).axpy(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); // Off-diagonal Jacobian block (Bus2 variables) owned by the branch GridKit::Enzyme::Sparse::DhDwb, @@ -74,8 +78,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_, - true); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); // Off-diagonal Jacobian block (Bus1 variables) owned by the branch GridKit::Enzyme::Sparse::DhDwb, @@ -90,8 +94,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_, - true); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp index 2bb2dc729..9a2f97509 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp @@ -31,6 +31,9 @@ namespace GridKit J_cols_buffer_ = new IdxT[4]; J_vals_buffer_ = new RealT[4]; } + + IdxT nnz; + GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, static_cast(bus_->size()), @@ -43,7 +46,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - bus_->getJacobian()); + nnz); + (bus_->getJacobian()).axpy(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); } return 0; diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp index 5456852a8..2e4d4990d 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp @@ -35,6 +35,8 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } + IdxT nnz; + GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), @@ -48,7 +50,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -60,11 +63,11 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), - alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -79,7 +82,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -94,7 +98,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp index 9c0de3db0..c1c4c296b 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp @@ -28,6 +28,8 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } + IdxT nnz; + GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), @@ -41,7 +43,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -53,11 +56,11 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), - alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -72,7 +75,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -87,7 +91,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp index 92829babc..26d9ff2e7 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp @@ -35,6 +35,8 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } + IdxT nnz; + GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), @@ -48,7 +50,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -60,11 +63,11 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), - alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -79,7 +82,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp index d3be1561f..6a7571d79 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp @@ -31,6 +31,8 @@ namespace GridKit J_vals_buffer_ = new RealT[4]; } + IdxT nnz; + GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, f_.size(), @@ -43,7 +45,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -57,7 +60,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -71,7 +75,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp index 55d5c96dd..be51262d8 100644 --- a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp @@ -26,6 +26,8 @@ namespace GridKit J_vals_buffer_ = new RealT[4]; } + IdxT nnz; + GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, f_.size(), @@ -38,7 +40,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -52,7 +55,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -66,7 +70,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp index 445be1fbe..d0a45bca8 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp @@ -37,6 +37,8 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } + IdxT nnz; + GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), @@ -50,7 +52,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -62,11 +65,11 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), - alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -81,7 +84,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp index 59fccc7dd..ef131544f 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp @@ -33,6 +33,8 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } + IdxT nnz; + GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), @@ -46,7 +48,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -58,11 +61,11 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), - alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -77,7 +80,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -92,7 +96,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -106,7 +111,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - bus_->getJacobian()); + nnz); + (bus_->getJacobian()).axpy(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -120,7 +126,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp index 66ec38a8a..746db4aff 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp @@ -33,6 +33,8 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } + IdxT nnz; + GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), @@ -46,7 +48,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -58,11 +61,11 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), - alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -77,7 +80,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -92,7 +96,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -106,7 +111,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - bus_->getJacobian()); + nnz); + (bus_->getJacobian()).axpy(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -120,7 +126,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp index 143ece1a8..7c50fe6d7 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp @@ -33,6 +33,8 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } + IdxT nnz; + GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, f_.size(), @@ -45,7 +47,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -56,11 +59,11 @@ namespace GridKit y_.data(), yp_.data(), wb_.data(), - alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -74,7 +77,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -88,7 +92,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - J_); + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); return 0; } From 108dd168618762a6cbecbc2680f8d3173827ca3d Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Tue, 9 Jun 2026 02:34:54 -0400 Subject: [PATCH 06/39] Move csr_jac_ member variable from SystemModel to Component. --- GridKit/Model/PhasorDynamics/Component.hpp | 36 ++++++++++++++----- GridKit/Model/PhasorDynamics/SystemModel.hpp | 10 ++---- .../Model/PhasorDynamics/SystemModelImpl.hpp | 10 ------ 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/Component.hpp b/GridKit/Model/PhasorDynamics/Component.hpp index 209264055..1314b6d16 100644 --- a/GridKit/Model/PhasorDynamics/Component.hpp +++ b/GridKit/Model/PhasorDynamics/Component.hpp @@ -21,10 +21,11 @@ namespace GridKit class Component : public Model::Evaluator { public: - using ScalarT = scalar_type; - using IdxT = index_type; - using RealT = typename Model::Evaluator::RealT; - using MatrixT = typename Model::Evaluator::MatrixT; + using ScalarT = scalar_type; + using IdxT = index_type; + using RealT = typename Model::Evaluator::RealT; + using MatrixT = typename Model::Evaluator::MatrixT; + using CsrMatrixT = typename Model::Evaluator::CsrMatrixT; Component() = default; @@ -39,6 +40,18 @@ namespace GridKit J_cols_buffer_ = nullptr; J_vals_buffer_ = nullptr; } + + if (csr_jac_ != nullptr) + { + delete csr_jac_; + csr_jac_ = nullptr; + } + + if (map_to_csr_ != nullptr) + { + delete[] map_to_csr_; + map_to_csr_ = nullptr; + } } virtual int verify() const = 0; @@ -146,6 +159,11 @@ namespace GridKit return residual_indices_; } + CsrMatrixT* getCsrJacobian() const override + { + return csr_jac_; + } + /// @todo Remove this method. It should be part of DynamicSolver class. bool hasJacobian() override { @@ -191,10 +209,12 @@ namespace GridKit std::vector f_; std::vector g_; - MatrixT J_; - IdxT* J_rows_buffer_{nullptr}; - IdxT* J_cols_buffer_{nullptr}; - RealT* J_vals_buffer_{nullptr}; + MatrixT J_; + IdxT* J_rows_buffer_{nullptr}; + IdxT* J_cols_buffer_{nullptr}; + RealT* J_vals_buffer_{nullptr}; + IdxT* map_to_csr_{nullptr}; + CsrMatrixT* csr_jac_{nullptr}; RealT rel_tol_; RealT abs_tol_; diff --git a/GridKit/Model/PhasorDynamics/SystemModel.hpp b/GridKit/Model/PhasorDynamics/SystemModel.hpp index 221b2c019..0b7597787 100644 --- a/GridKit/Model/PhasorDynamics/SystemModel.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModel.hpp @@ -55,6 +55,8 @@ namespace GridKit using PhasorDynamics::Component::abs_tol_; using PhasorDynamics::Component::variable_indices_; using PhasorDynamics::Component::residual_indices_; + using PhasorDynamics::Component::csr_jac_; + using PhasorDynamics::Component::map_to_csr_; public: using ScalarT = scalar_type; @@ -90,11 +92,6 @@ namespace GridKit int evaluateResidual() override; int evaluateJacobian() override; - CsrMatrixT* getCsrJacobian() const override - { - return csr_jac_; - } - void updateVariables(); void updateTime(RealT t, RealT a) override; @@ -121,9 +118,6 @@ namespace GridKit bool owns_components_{false}; - IdxT* map_to_csr_{nullptr}; - CsrMatrixT* csr_jac_{nullptr}; - /// Variable monitor std::unique_ptr monitor_; }; // class SystemModel diff --git a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp index bee1ea1d6..9be9b0c37 100644 --- a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp @@ -395,16 +395,6 @@ namespace GridKit delete signal; } } - if (csr_jac_ != nullptr) - { - delete csr_jac_; - csr_jac_ = nullptr; - } - if (map_to_csr_ != nullptr) - { - delete[] map_to_csr_; - map_to_csr_ = nullptr; - } } /** From bd9e951683158ad384be9fc6f8f5da7946157b53 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Tue, 9 Jun 2026 02:45:30 -0400 Subject: [PATCH 07/39] Remove sorted_ member variable. --- GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp b/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp index 1be36255b..6ab1df8f0 100644 --- a/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp +++ b/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp @@ -27,7 +27,6 @@ namespace GridKit std::vector column_indices_; IdxT rows_size_; IdxT columns_size_; - bool sorted_; public: // Constructors @@ -130,7 +129,6 @@ namespace GridKit checkIncreaseSize(r[i], c[i]); } - sorted_ = false; } /** @@ -172,8 +170,6 @@ namespace GridKit { std::cout << "Warning: Unexpected size in axpy\n"; } - - sorted_ = false; } /** @@ -235,7 +231,6 @@ namespace GridKit column_indices_.resize(0); row_indices_.resize(0); values_.resize(0); - sorted_ = true; } /** @@ -307,10 +302,7 @@ namespace GridKit template inline void COO_Matrix::print(std::string name) { - if (sorted_ == false) - { - sortSparse(); - } + sortSparse(); std::cout << "Sparse COO Matrix: " << name << "\n"; std::cout << "(x , y, value)\n"; @@ -396,8 +388,6 @@ namespace GridKit std::swap(permutation[i], permutation[permutation[i]]); } } - - sorted_ = true; } /** @@ -416,7 +406,6 @@ namespace GridKit values_ = std::vector(); row_indices_ = std::vector(); column_indices_ = std::vector(); - sorted_ = false; // Set to false until explicitly sorted, though logically it is sorted. } template From 3479621696e3de43173593295fbeafcdd3ff4b85 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Tue, 9 Jun 2026 10:17:40 -0400 Subject: [PATCH 08/39] Store bus Jacobian contributions within Branch, Genrou and Gensal (instead of axpy to bus-owned block). --- GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp | 4 ++-- .../SynchronousMachine/GENROUwS/GenrouEnzyme.cpp | 2 +- .../SynchronousMachine/GENSALwS/GensalEnzyme.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp index 5167dc930..032ff3ebb 100644 --- a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp @@ -47,7 +47,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, nnz); - (bus1_->getJacobian()).axpy(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); // Bus 2 diagonal Jacobian block owned by the bus GridKit::Enzyme::Sparse::DhDwb, @@ -63,7 +63,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, nnz); - (bus2_->getJacobian()).axpy(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); // Off-diagonal Jacobian block (Bus2 variables) owned by the branch GridKit::Enzyme::Sparse::DhDwb, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp index ef131544f..77586833c 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp @@ -112,7 +112,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, nnz); - (bus_->getJacobian()).axpy(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp index 746db4aff..3a359f971 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp @@ -112,7 +112,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, nnz); - (bus_->getJacobian()).axpy(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, From 3acf58dd0ab17d287b9bd7aa88e62959b97a9f36 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Tue, 9 Jun 2026 12:54:33 -0400 Subject: [PATCH 09/39] Make BusFault store currents as internal variables --> can now also store bus Jacobian contribution. --- .../PhasorDynamics/BusFault/BusFault.hpp | 11 ++- .../BusFault/BusFaultEnzyme.cpp | 84 +++++++++++++------ .../PhasorDynamics/BusFault/BusFaultImpl.hpp | 80 +++++++++++++++--- .../SystemSingleComponentTests.hpp | 1 - 4 files changed, 138 insertions(+), 38 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp b/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp index 3b559fd1b..3f023eed7 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp @@ -24,18 +24,22 @@ namespace GridKit class BusFault : public Component { using Component::gridkit_component_id_; - using Component::alpha_; - using Component::nnz_; using Component::size_; - using Component::tag_; + using Component::nnz_; using Component::time_; + using Component::alpha_; using Component::y_; using Component::yp_; + using Component::tag_; using Component::wb_; using Component::h_; + using Component::f_; + using Component::J_; using Component::J_rows_buffer_; using Component::J_cols_buffer_; using Component::J_vals_buffer_; + using Component::variable_indices_; + using Component::residual_indices_; public: using ScalarT = scalar_type; @@ -111,6 +115,7 @@ namespace GridKit public: __attribute__((always_inline)) inline int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: BusT* bus_; diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp index 9a2f97509..47ae9a76d 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp @@ -23,32 +23,68 @@ namespace GridKit Log::misc() << "Evaluate Jacobian for BusFault..." << std::endl; Log::misc() << "Jacobian evaluation is experimental!" << std::endl; - if (status_) + J_.zeroMatrix(); + + if (J_rows_buffer_ == nullptr) + { + J_rows_buffer_ = new IdxT[4]; + J_cols_buffer_ = new IdxT[4]; + J_vals_buffer_ = new RealT[4]; + } + + IdxT nnz; + + GridKit::Enzyme::Sparse::DfDy, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + + GridKit::Enzyme::Sparse::DfDwb, + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, + f_.size(), + static_cast(bus_->size()), + (this->getResidualIndices()).data(), + (bus_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + (bus_->y()).data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz); + if (!status_) // Value contributions only when status_ { - if (J_rows_buffer_ == nullptr) - { - J_rows_buffer_ = new IdxT[4]; - J_cols_buffer_ = new IdxT[4]; - J_vals_buffer_ = new RealT[4]; - } - - IdxT nnz; - - GridKit::Enzyme::Sparse::DhDwb, - GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, - static_cast(bus_->size()), - static_cast(bus_->size()), - (bus_->getResidualIndices()).data(), - (bus_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - (bus_->y()).data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz); - (bus_->getJacobian()).axpy(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + J_vals_buffer_[0] = 0.0; + J_vals_buffer_[1] = 0.0; + J_vals_buffer_[2] = 0.0; + J_vals_buffer_[3] = 0.0; } + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + + GridKit::Enzyme::Sparse::DhDy, + GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, + static_cast(bus_->size()), + y_.size(), + (bus_->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp b/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp index 8c1212d4a..905512e1b 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp @@ -24,7 +24,7 @@ namespace GridKit : bus_(bus), R_(0), X_(0.01), status_(0), bus_id_(0) { (void) bus_id_; - size_ = 0; + size_ = 2; setDerivedParams(); } @@ -42,7 +42,7 @@ namespace GridKit BusFault::BusFault(BusT* bus, RealT R, RealT X, int status) : bus_(bus), R_(R), X_(X), status_(status), bus_id_(0) { - size_ = 0; + size_ = 2; setDerivedParams(); } @@ -81,11 +81,11 @@ namespace GridKit monitor_->set(Variable::state, [this] { return status_; }); monitor_->set(Variable::ir, [this] - { return Ir(); }); + { return y_[0]; }); monitor_->set(Variable::ii, [this] - { return Ii(); }); + { return y_[1]; }); - size_ = 0; + size_ = 2; setDerivedParams(); } @@ -112,9 +112,25 @@ namespace GridKit { // std::cout << "Allocate BusFault..." << std::endl; + auto size = static_cast(size_); // avoid compiler warnings + f_.resize(size); + y_.resize(size); + yp_.resize(size); + tag_.resize(size); + variable_indices_.resize(size); + residual_indices_.resize(size); + + // Resize coupling data wb_.resize(2); h_.resize(2); + // Default variable and residual index mapping to local index + for (IdxT j = 0; j < size_; ++j) + { + this->setVariableIndex(j, j); + this->setResidualIndex(j, j); + } + return 0; } @@ -125,6 +141,17 @@ namespace GridKit template int BusFault::initialize() { + ScalarT vr = Vr(); + ScalarT vi = Vi(); + ScalarT ir = -(vr * G_ - vi * B_); + ScalarT ii = -(vr * B_ + vi * G_); + + y_[0] = ir; + y_[1] = ii; + + yp_[0] = 0.0; + yp_[1] = 0.0; + return 0; } @@ -134,6 +161,9 @@ namespace GridKit template int BusFault::tagDifferentiable() { + tag_[0] = false; + tag_[1] = false; + return 0; } @@ -143,18 +173,40 @@ namespace GridKit */ template __attribute__((always_inline)) int BusFault::evaluateBusResidual( - [[maybe_unused]] ScalarT* y, [[maybe_unused]] ScalarT* yp, ScalarT* wb, ScalarT* h) + ScalarT* y, + [[maybe_unused]] ScalarT* yp, + [[maybe_unused]] ScalarT* wb, + ScalarT* h) { - ScalarT Vr = wb[0]; - ScalarT Vi = wb[1]; - ScalarT Ir = -Vr * G_ + Vi * B_; - ScalarT Ii = -Vr * B_ - Vi * G_; + ScalarT Ir = y[0]; + ScalarT Ii = y[1]; h[0] = Ir; h[1] = Ii; return 0; } + /** + * @brief Internal residual + * + */ + template + __attribute__((always_inline)) int BusFault::evaluateInternalResidual( + ScalarT* y, + [[maybe_unused]] ScalarT* yp, + ScalarT* wb, + ScalarT* f) + { + ScalarT Vr = wb[0]; + ScalarT Vi = wb[1]; + ScalarT Ir = y[0]; + ScalarT Ii = y[1]; + f[0] = Ir + Vr * G_ - Vi * B_; + f[1] = Ii + Vr * B_ + Vi * G_; + + return 0; + } + /** * \brief Residual contribution of the branch is pushed to the * two terminal buses. @@ -167,10 +219,18 @@ namespace GridKit { wb_[0] = Vr(); wb_[1] = Vi(); + evaluateInternalResidual(y_.data(), yp_.data(), wb_.data(), f_.data()); evaluateBusResidual(y_.data(), yp_.data(), wb_.data(), h_.data()); Ir() += h_[0]; Ii() += h_[1]; } + else + { + f_[0] = 0.0; + f_[1] = 0.0; + h_[0] = 0.0; + h_[1] = 0.0; + } return 0; } diff --git a/tests/UnitTests/PhasorDynamics/SystemSingleComponentTests.hpp b/tests/UnitTests/PhasorDynamics/SystemSingleComponentTests.hpp index c32df9f58..985bae0f6 100644 --- a/tests/UnitTests/PhasorDynamics/SystemSingleComponentTests.hpp +++ b/tests/UnitTests/PhasorDynamics/SystemSingleComponentTests.hpp @@ -85,7 +85,6 @@ namespace GridKit success *= system->initialize() == 0; success *= system->evaluateResidual() == 0; success *= system->evaluateJacobian() == 0; - success *= system->size() == 0; success *= system->size() == fault.size(); delete system; From 106633c66d88b964e9c1e2fbdadebe284c8f266b Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Tue, 9 Jun 2026 12:57:51 -0400 Subject: [PATCH 10/39] Nuke COO_Matrix::axpy. --- .../LinearAlgebra/SparseMatrix/COO_Matrix.hpp | 44 ------------------- 1 file changed, 44 deletions(-) diff --git a/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp b/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp index 6ab1df8f0..427b9a217 100644 --- a/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp +++ b/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp @@ -44,9 +44,6 @@ namespace GridKit // Set values from vector storage void setValues(RealT alpha, IdxT* r, IdxT* c, RealT* v, IdxT nnz); - // Add to existing values - void axpy(RealT alpha, IdxT* r, IdxT* c, RealT* v, IdxT nnz); - // Special matrices (zero and identity) void zeroMatrix(); // null matrix void zeroValuedMatrix(); @@ -131,47 +128,6 @@ namespace GridKit } } - /** - * @brief Append coordinates and values of the matrix without sorting or deduplicating. - * - * Need to deduplicate bus entries right away to get around the new mappings introduced by bus faults. - * - * Only use for buses, which are 2x2, so the cost of loops is not uncontrolled. Don't allow resizing. - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] r row indices to be stored - * @param[in] c column indices to be stored - * @param[in] v values to be stored - * @param[in] nnz to be stored - * - */ - template - inline void COO_Matrix::axpy(RealT alpha, IdxT* r, IdxT* c, RealT* v, IdxT nnz) - { - if (row_indices_.size() == 0) // Do nothing for infinite bus - { - } - else if (row_indices_.size() == 4) - { - for (size_t i = 0; i < row_indices_.size(); i++) - { - for (size_t j = 0; j < static_cast(nnz); j++) - { - if (row_indices_[i] == r[j] && column_indices_[i] == c[j]) - { - values_[i] += alpha * v[j]; - } - } - } - } - else - { - std::cout << "Warning: Unexpected size in axpy\n"; - } - } - /** * @brief Deduplicate matrix entries * From 1f42515ad371f99adafd7dd696597ff4109ad3ff Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Tue, 9 Jun 2026 13:13:28 -0400 Subject: [PATCH 11/39] Bug fix in BusFault: always evaluate the residuals, but only contribute current injection to bus if status_. --- .../PhasorDynamics/BusFault/BusFaultImpl.hpp | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp b/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp index 905512e1b..471641c1b 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp @@ -141,13 +141,20 @@ namespace GridKit template int BusFault::initialize() { - ScalarT vr = Vr(); - ScalarT vi = Vi(); - ScalarT ir = -(vr * G_ - vi * B_); - ScalarT ii = -(vr * B_ + vi * G_); - - y_[0] = ir; - y_[1] = ii; + if (status_) + { + ScalarT vr = Vr(); + ScalarT vi = Vi(); + ScalarT ir = -(vr * G_ - vi * B_); + ScalarT ii = -(vr * B_ + vi * G_); + y_[0] = ir; + y_[1] = ii; + } + else + { + y_[0] = 0.0; + y_[1] = 0.0; + } yp_[0] = 0.0; yp_[1] = 0.0; @@ -226,11 +233,11 @@ namespace GridKit } else { - f_[0] = 0.0; - f_[1] = 0.0; - h_[0] = 0.0; - h_[1] = 0.0; + wb_[0] = 0.0; + wb_[1] = 0.0; + evaluateInternalResidual(y_.data(), yp_.data(), wb_.data(), f_.data()); } + return 0; } From ef11cc8626d8caca3f5f209465c3ef6370a0ed70 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Tue, 9 Jun 2026 17:14:35 -0400 Subject: [PATCH 12/39] Nuke COO_Matrix::zeroValuedMatrix. --- .../LinearAlgebra/SparseMatrix/COO_Matrix.hpp | 17 ----------------- GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp | 5 +---- .../Model/PhasorDynamics/SystemModelImpl.hpp | 2 +- 3 files changed, 2 insertions(+), 22 deletions(-) diff --git a/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp b/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp index 427b9a217..7c6de59a8 100644 --- a/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp +++ b/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp @@ -46,7 +46,6 @@ namespace GridKit // Special matrices (zero and identity) void zeroMatrix(); // null matrix - void zeroValuedMatrix(); // Sort void sortSparse(); @@ -189,22 +188,6 @@ namespace GridKit values_.resize(0); } - /** - * @brief Initializes matrix values to 0 without changing the sparsity pattern - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - * - */ - template - inline void COO_Matrix::zeroValuedMatrix() - { - for (size_t i = 0; i < row_indices_.size(); i++) - { - values_[i] = 0.0; - } - } - /** * @brief Get the matrix number of rows * diff --git a/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp b/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp index bcb02889c..edb26e35b 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp @@ -49,10 +49,7 @@ namespace GridKit J_vals_buffer_[3] = 0.0; J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, 4); //< @todo: Update once sparse storage format changes } - else - { - J_.zeroValuedMatrix(); - } + // Bus Jacobian will remain a zero-valued matrix. return 0; } diff --git a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp index 9be9b0c37..883dfab34 100644 --- a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp @@ -746,7 +746,7 @@ namespace GridKit bus->evaluateJacobian(); } - // Evaluate component Jacobians and update bus Jacobians + // Evaluate component Jacobians, including contribution to the bus Jacobians for (const auto& component : components_) { component->evaluateJacobian(); From 4401cc725f01fa376fc790947759771f64b9c6a5 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Tue, 9 Jun 2026 17:30:36 -0400 Subject: [PATCH 13/39] nnz-->block_nnz in component Jacobians. --- .../PhasorDynamics/Branch/BranchEnzyme.cpp | 18 ++++++------- .../Model/PhasorDynamics/Bus/BusEnzyme.cpp | 2 -- .../BusFault/BusFaultEnzyme.cpp | 14 +++++----- .../Exciter/IEEET1/Ieeet1Enzyme.cpp | 18 ++++++------- .../Exciter/SEXS-PTI/SexsPtiEnzyme.cpp | 18 ++++++------- .../Governor/Tgov1/Tgov1Enzyme.cpp | 14 +++++----- .../Model/PhasorDynamics/Load/LoadEnzyme.cpp | 14 +++++----- .../PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp | 14 +++++----- .../Stabilizer/IEEEST/IeeestEnzyme.cpp | 14 +++++----- .../GENROUwS/GenrouEnzyme.cpp | 26 +++++++++---------- .../GENSALwS/GensalEnzyme.cpp | 26 +++++++++---------- .../GenClassical/GenClassicalEnzyme.cpp | 18 ++++++------- 12 files changed, 97 insertions(+), 99 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp index 032ff3ebb..3f795abf4 100644 --- a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp @@ -31,7 +31,7 @@ namespace GridKit J_vals_buffer_ = new RealT[4]; } - IdxT nnz; + IdxT block_nnz; // Bus 1 diagonal Jacobian block owned by the bus GridKit::Enzyme::Sparse::DhDwb, @@ -46,8 +46,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); // Bus 2 diagonal Jacobian block owned by the bus GridKit::Enzyme::Sparse::DhDwb, @@ -62,8 +62,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); // Off-diagonal Jacobian block (Bus2 variables) owned by the branch GridKit::Enzyme::Sparse::DhDwb, @@ -78,8 +78,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); // Off-diagonal Jacobian block (Bus1 variables) owned by the branch GridKit::Enzyme::Sparse::DhDwb, @@ -94,8 +94,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp b/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp index edb26e35b..5ebe55ac4 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp @@ -29,8 +29,6 @@ namespace GridKit { J_.zeroMatrix(); - // Reserve space for a dense matrix of size_*size_. - // Enyme will compute the appropriate nnz from sparsification. J_rows_buffer_ = new IdxT[4]; J_cols_buffer_ = new IdxT[4]; J_vals_buffer_ = new RealT[4]; diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp index 47ae9a76d..89b601992 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp @@ -32,7 +32,7 @@ namespace GridKit J_vals_buffer_ = new RealT[4]; } - IdxT nnz; + IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -46,8 +46,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -61,7 +61,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); + block_nnz); if (!status_) // Value contributions only when status_ { J_vals_buffer_[0] = 0.0; @@ -69,7 +69,7 @@ namespace GridKit J_vals_buffer_[2] = 0.0; J_vals_buffer_[3] = 0.0; } - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -83,8 +83,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp index 2e4d4990d..6adc4a3fa 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp @@ -35,7 +35,7 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } - IdxT nnz; + IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -50,8 +50,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -66,8 +66,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -82,8 +82,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -98,8 +98,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp index c1c4c296b..01d98e568 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp @@ -28,7 +28,7 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } - IdxT nnz; + IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -43,8 +43,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -59,8 +59,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -75,8 +75,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -91,8 +91,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp index 26d9ff2e7..a87f9228b 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp @@ -35,7 +35,7 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } - IdxT nnz; + IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -50,8 +50,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -66,8 +66,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -82,8 +82,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp index 6a7571d79..9faf03625 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp @@ -31,7 +31,7 @@ namespace GridKit J_vals_buffer_ = new RealT[4]; } - IdxT nnz; + IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -45,8 +45,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -60,8 +60,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -75,8 +75,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp index be51262d8..97351a7e6 100644 --- a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp @@ -26,7 +26,7 @@ namespace GridKit J_vals_buffer_ = new RealT[4]; } - IdxT nnz; + IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -40,8 +40,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -55,8 +55,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -70,8 +70,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp index d0a45bca8..97071809d 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp @@ -37,7 +37,7 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } - IdxT nnz; + IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -52,8 +52,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -68,8 +68,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -84,8 +84,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp index 77586833c..bb3787de7 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp @@ -33,7 +33,7 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } - IdxT nnz; + IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -48,8 +48,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -64,8 +64,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -80,8 +80,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -96,8 +96,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -111,8 +111,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -126,8 +126,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp index 3a359f971..ddf603cd6 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp @@ -33,7 +33,7 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } - IdxT nnz; + IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -48,8 +48,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -64,8 +64,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -80,8 +80,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -96,8 +96,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -111,8 +111,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -126,8 +126,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp index 7c50fe6d7..9d1565ab0 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp @@ -33,7 +33,7 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } - IdxT nnz; + IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -47,8 +47,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -62,8 +62,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -77,8 +77,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -92,8 +92,8 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, nnz); + block_nnz); + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); return 0; } From d7abb5fabfd03a7270745ce49f85e7e74dda9ae6 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Wed, 10 Jun 2026 15:23:24 -0400 Subject: [PATCH 14/39] Minor edits. --- GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp | 2 +- GridKit/Model/PhasorDynamics/CMakeLists.txt | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp b/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp index 5ebe55ac4..884100b18 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp @@ -45,7 +45,7 @@ namespace GridKit J_vals_buffer_[1] = 0.0; J_vals_buffer_[2] = 0.0; J_vals_buffer_[3] = 0.0; - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, 4); //< @todo: Update once sparse storage format changes + J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, 4); } // Bus Jacobian will remain a zero-valued matrix. return 0; diff --git a/GridKit/Model/PhasorDynamics/CMakeLists.txt b/GridKit/Model/PhasorDynamics/CMakeLists.txt index 90ddb2abc..3a44ebb24 100644 --- a/GridKit/Model/PhasorDynamics/CMakeLists.txt +++ b/GridKit/Model/PhasorDynamics/CMakeLists.txt @@ -37,11 +37,10 @@ add_subdirectory(Exciter) add_subdirectory(Governor) add_subdirectory(Load) add_subdirectory(LoadZIP) +add_subdirectory(SignalNode) add_subdirectory(Stabilizer) add_subdirectory(SynchronousMachine) -add_subdirectory(SignalNode) - add_library(GridKit::phasor_dynamics_components ALIAS phasor_dynamics_components) add_library(GridKit::phasor_dynamics_components_dependency_tracking ALIAS phasor_dynamics_components_dependency_tracking) From dd137a79c60c4a61fdceea82823deea838180f77 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Wed, 10 Jun 2026 16:37:54 -0400 Subject: [PATCH 15/39] .size()-->nnz_ in COO_Matrix. --- .../LinearAlgebra/SparseMatrix/COO_Matrix.hpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp b/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp index 7c6de59a8..20b0b207d 100644 --- a/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp +++ b/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp @@ -27,6 +27,7 @@ namespace GridKit std::vector column_indices_; IdxT rows_size_; IdxT columns_size_; + IdxT nnz_; public: // Constructors @@ -122,6 +123,7 @@ namespace GridKit row_indices_.emplace_back(r[i]); column_indices_.emplace_back(c[i]); values_.emplace_back(alpha * v[i]); + nnz_++; checkIncreaseSize(r[i], c[i]); } @@ -148,7 +150,7 @@ namespace GridKit values_.clear(); IdxT nnz = 0; - for (size_t i = 0; i < row_temp.size(); i++) + for (size_t i = 0; i < nnz_; i++) { IdxT row = row_temp[i]; IdxT col = col_temp[i]; @@ -170,6 +172,7 @@ namespace GridKit nnz++; } } + nnz_ = nnz; } /** @@ -183,6 +186,9 @@ namespace GridKit inline void COO_Matrix::zeroMatrix() { // resize doesn't affect capacity if smaller + rows_size_ = 0; + columns_size_ = 0; + nnz_ = 0; column_indices_.resize(0); row_indices_.resize(0); values_.resize(0); @@ -227,7 +233,7 @@ namespace GridKit template inline IdxT COO_Matrix::getNnz() const { - return values_.size(); + return nnz_; } /** @@ -245,7 +251,7 @@ namespace GridKit std::cout << "Sparse COO Matrix: " << name << "\n"; std::cout << "(x , y, value)\n"; - for (size_t i = 0; i < values_.size(); i++) + for (size_t i = 0; i < nnz_; i++) { std::cout << "(" << row_indices_[i] << ", " << column_indices_[i] @@ -295,12 +301,10 @@ namespace GridKit template inline void COO_Matrix::sortSparse() { - size_t nnz = row_indices_.size(); - // Index based sort // https://stackoverflow.com/questions/25921706/creating-a-vector-of-indices-of-a-sorted_-vector // cannot call sort since two arrays are used instead - std::vector permutation(nnz); + std::vector permutation(nnz_); std::size_t n(0); std::generate(std::begin(permutation), std::end(permutation), [&] { return n++; }); @@ -314,7 +318,7 @@ namespace GridKit // reorder based of index-sorting. Only swap cost no extra memory. // @todo see if extra memory creation is fine // https://stackoverflow.com/a/22183350 - for (size_t i = 0; i < permutation.size(); i++) + for (size_t i = 0; i < nnz_; i++) { // permutation swap while (permutation[i] != permutation[permutation[i]]) @@ -342,6 +346,7 @@ namespace GridKit { rows_size_ = 0; columns_size_ = 0; + nnz_ = 0; values_ = std::vector(); row_indices_ = std::vector(); column_indices_ = std::vector(); From c780799d91e9ee4d7aa4312648d32c708012eb4c Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Wed, 10 Jun 2026 16:54:47 -0400 Subject: [PATCH 16/39] Compute nnz_dup in component models (outside COO_Matrix). --- GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp | 5 +++++ GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp | 4 ++++ .../Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp | 7 ++++++- .../PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp | 5 +++++ .../Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp | 4 ++++ GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp | 4 ++++ GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp | 4 ++++ .../PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp | 4 ++++ .../SynchronousMachine/GENROUwS/GenrouEnzyme.cpp | 7 +++++++ .../SynchronousMachine/GENSALwS/GensalEnzyme.cpp | 9 ++++++++- .../GenClassical/GenClassicalEnzyme.cpp | 5 +++++ 11 files changed, 56 insertions(+), 2 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp index 3f795abf4..774e47fc3 100644 --- a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp @@ -31,6 +31,7 @@ namespace GridKit J_vals_buffer_ = new RealT[4]; } + IdxT nnz_dup = 0; IdxT block_nnz; // Bus 1 diagonal Jacobian block owned by the bus @@ -48,6 +49,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; // Bus 2 diagonal Jacobian block owned by the bus GridKit::Enzyme::Sparse::DhDwb, @@ -64,6 +66,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; // Off-diagonal Jacobian block (Bus2 variables) owned by the branch GridKit::Enzyme::Sparse::DhDwb, @@ -80,6 +83,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; // Off-diagonal Jacobian block (Bus1 variables) owned by the branch GridKit::Enzyme::Sparse::DhDwb, @@ -96,6 +100,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; return 0; } diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp index 89b601992..c59156300 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp @@ -32,6 +32,7 @@ namespace GridKit J_vals_buffer_ = new RealT[4]; } + IdxT nnz_dup = 0; IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, @@ -48,6 +49,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -70,6 +72,7 @@ namespace GridKit J_vals_buffer_[3] = 0.0; } J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -85,6 +88,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; return 0; } diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp index 6adc4a3fa..b3c31c32c 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp @@ -34,7 +34,8 @@ namespace GridKit J_cols_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } - + + IdxT nnz_dup = 0; IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, @@ -52,6 +53,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -68,6 +70,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -84,6 +87,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -100,6 +104,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; return 0; } diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp index 01d98e568..7d5d44739 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp @@ -28,6 +28,7 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } + IdxT nnz_dup = 0; IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, @@ -45,6 +46,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -61,6 +63,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -77,6 +80,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -93,6 +97,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; return 0; } diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp index a87f9228b..c459f2e30 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp @@ -35,6 +35,7 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } + IdxT nnz_dup = 0; IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, @@ -52,6 +53,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -68,6 +70,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -84,6 +87,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; return 0; } diff --git a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp index 9faf03625..5151aa407 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp @@ -31,6 +31,7 @@ namespace GridKit J_vals_buffer_ = new RealT[4]; } + IdxT nnz_dup = 0; IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, @@ -47,6 +48,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -62,6 +64,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -77,6 +80,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; return 0; } diff --git a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp index 97351a7e6..68a2012f6 100644 --- a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp @@ -26,6 +26,7 @@ namespace GridKit J_vals_buffer_ = new RealT[4]; } + IdxT nnz_dup = 0; IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, @@ -42,6 +43,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -57,6 +59,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -72,6 +75,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; return 0; } diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp index 97071809d..778c558f5 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp @@ -37,6 +37,7 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } + IdxT nnz_dup = 0; IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, @@ -54,6 +55,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -70,6 +72,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -86,6 +89,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp index bb3787de7..c3b0c8e0a 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp @@ -33,6 +33,7 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } + IdxT nnz_dup = 0; IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, @@ -50,6 +51,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -66,6 +68,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -82,6 +85,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -98,6 +102,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -113,6 +118,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -128,6 +134,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp index ddf603cd6..6f7f56301 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp @@ -32,7 +32,8 @@ namespace GridKit J_cols_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } - + + IdxT nnz_dup = 0; IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, @@ -50,6 +51,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -66,6 +68,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -82,6 +85,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -98,6 +102,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -113,6 +118,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -128,6 +134,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp index 9d1565ab0..e10e3f799 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp @@ -33,6 +33,7 @@ namespace GridKit J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; } + IdxT nnz_dup = 0; IdxT block_nnz; GridKit::Enzyme::Sparse::DfDy, @@ -49,6 +50,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -64,6 +66,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -79,6 +82,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -94,6 +98,7 @@ namespace GridKit J_vals_buffer_, block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + nnz_dup += block_nnz; return 0; } From 78e929cff296dba3a78962ccb15dda3c8c78e62f Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Wed, 10 Jun 2026 18:43:54 -0400 Subject: [PATCH 17/39] PhasorDynamics::SystemModel should not need PhasorDynamics:: to access ::Component. --- GridKit/Model/PhasorDynamics/SystemModel.hpp | 40 ++++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/SystemModel.hpp b/GridKit/Model/PhasorDynamics/SystemModel.hpp index 0b7597787..e1d6f0cd9 100644 --- a/GridKit/Model/PhasorDynamics/SystemModel.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModel.hpp @@ -39,33 +39,33 @@ namespace GridKit * */ template - class SystemModel : public PhasorDynamics::Component + class SystemModel : public Component { - using PhasorDynamics::Component::gridkit_component_id_; - using PhasorDynamics::Component::size_; - using PhasorDynamics::Component::nnz_; - using PhasorDynamics::Component::time_; - using PhasorDynamics::Component::alpha_; - using PhasorDynamics::Component::y_; - using PhasorDynamics::Component::yp_; - using PhasorDynamics::Component::tag_; - using PhasorDynamics::Component::f_; - using PhasorDynamics::Component::J_; - using PhasorDynamics::Component::rel_tol_; - using PhasorDynamics::Component::abs_tol_; - using PhasorDynamics::Component::variable_indices_; - using PhasorDynamics::Component::residual_indices_; - using PhasorDynamics::Component::csr_jac_; - using PhasorDynamics::Component::map_to_csr_; + using Component::gridkit_component_id_; + using Component::size_; + using Component::nnz_; + using Component::time_; + using Component::alpha_; + using Component::y_; + using Component::yp_; + using Component::tag_; + using Component::f_; + using Component::J_; + using Component::rel_tol_; + using Component::abs_tol_; + using Component::variable_indices_; + using Component::residual_indices_; + using Component::csr_jac_; + using Component::map_to_csr_; public: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Model::Evaluator::RealT; using CsrMatrixT = typename Model::Evaluator::CsrMatrixT; - using BusT = PhasorDynamics::BusBase; - using SignalT = PhasorDynamics::SignalNode; - using ComponentT = PhasorDynamics::Component; + using BusT = BusBase; + using SignalT = SignalNode; + using ComponentT = Component; using MonitorT = Model::VariableMonitorController; SystemModel(); From 7f785134f009a1604e0bd68f7ee2f47eb61dab64 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Wed, 10 Jun 2026 19:03:31 -0400 Subject: [PATCH 18/39] Proof of concept to construct CsrMatrix at component level. --- GridKit/Model/PhasorDynamics/Load/Load.hpp | 2 ++ .../Model/PhasorDynamics/Load/LoadEnzyme.cpp | 29 +++++++++++++++++++ tests/UnitTests/PhasorDynamics/LoadTests.hpp | 9 +++--- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/Load/Load.hpp b/GridKit/Model/PhasorDynamics/Load/Load.hpp index 33ce3cc1e..21442f1c4 100644 --- a/GridKit/Model/PhasorDynamics/Load/Load.hpp +++ b/GridKit/Model/PhasorDynamics/Load/Load.hpp @@ -46,6 +46,8 @@ namespace GridKit using Component::J_vals_buffer_; using Component::variable_indices_; using Component::residual_indices_; + using Component::csr_jac_; + using Component::map_to_csr_; public: using ScalarT = scalar_type; diff --git a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp index 5151aa407..5fe0f6b66 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp @@ -82,6 +82,35 @@ namespace GridKit J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; + LinearAlgebra::CooMatrix tmp_coo_jac(J_.getNumRows(), J_.getNumColumns(), nnz_dup); + tmp_coo_jac.setDataPointers((J_.getRows()).data(), (J_.getColumns()).data(), (J_.getValues()).data(), LinearAlgebra::memory::HOST); + std::cout << "Load CooMatrix Jacobian.\n"; + tmp_coo_jac.print(); + + IdxT* row_ptrs = tmp_coo_jac.getCsrRowData(); + + nnz_ = tmp_coo_jac.getNnz(); + + IdxT* cols = new IdxT[static_cast(nnz_)]; + RealT* vals = new RealT[static_cast(nnz_)]; + + std::copy(tmp_coo_jac.getColData(), tmp_coo_jac.getColData() + nnz_, cols); + std::copy(tmp_coo_jac.getValues(), tmp_coo_jac.getValues() + nnz_, vals); + + csr_jac_ = new LinearAlgebra::CsrMatrix(size_, size_, nnz_, &row_ptrs, &cols, &vals); + + const IdxT* map_to_sorted = tmp_coo_jac.getMapToSorted(); + const IdxT* map_to_dedup = tmp_coo_jac.getMapToDeduplicated(); + + map_to_csr_ = new IdxT[static_cast(nnz_dup)]; + for (IdxT i = 0; i < nnz_dup; ++i) + { + map_to_csr_[map_to_sorted[i]] = map_to_dedup[i]; + } + + std::cout << "Load CsrMatrix Jacobian.\n"; + csr_jac_->print(); + return 0; } diff --git a/tests/UnitTests/PhasorDynamics/LoadTests.hpp b/tests/UnitTests/PhasorDynamics/LoadTests.hpp index 60b65019d..23ddf66e4 100644 --- a/tests/UnitTests/PhasorDynamics/LoadTests.hpp +++ b/tests/UnitTests/PhasorDynamics/LoadTests.hpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include namespace GridKit { @@ -151,12 +151,13 @@ namespace GridKit bus.evaluateJacobian(); load.evaluateJacobian(); - GridKit::LinearAlgebra::COO_Matrix model_jacobian = load.getJacobian(); - model_jacobian.print("Model Jacobian"); + GridKit::LinearAlgebra::CsrMatrix* model_jacobian = load.getCsrJacobian(); + std::cout << "Sparse Csr Matrix: Load Jacobian\n"; + model_jacobian->print(); /// Compare model Jacobian wih dependencies computed analytically std::vector ref = analyticalJacobian(R, X); - std::vector model_dependencies = GridKit::Testing::MapFromCOO(model_jacobian); + std::vector model_dependencies = GridKit::Testing::MapFromCsr(model_jacobian); for (size_t i = 0; i < ref.size(); ++i) { success *= (GridKit::Testing::isEqual(model_dependencies[i], ref[i])); From 6f68059481aaaea70635fd79a390b2ee3a9e6963 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Wed, 10 Jun 2026 19:22:48 -0400 Subject: [PATCH 19/39] constructCsrFromCOO in Component base class. --- GridKit/Model/PhasorDynamics/Component.hpp | 30 +++++++++++++++++++ .../Model/PhasorDynamics/Load/LoadEnzyme.cpp | 29 +----------------- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/Component.hpp b/GridKit/Model/PhasorDynamics/Component.hpp index 1314b6d16..77b4c2a4e 100644 --- a/GridKit/Model/PhasorDynamics/Component.hpp +++ b/GridKit/Model/PhasorDynamics/Component.hpp @@ -195,6 +195,36 @@ namespace GridKit return gridkit_component_id_; } + protected: + int constructCsrFromCOO(const IdxT nnz_dup) + { + LinearAlgebra::CooMatrix tmp_coo_jac(J_.getNumRows(), J_.getNumColumns(), nnz_dup); + tmp_coo_jac.setDataPointers((J_.getRows()).data(), (J_.getColumns()).data(), (J_.getValues()).data(), LinearAlgebra::memory::HOST); + + IdxT* row_ptrs = tmp_coo_jac.getCsrRowData(); + + nnz_ = tmp_coo_jac.getNnz(); + + IdxT* cols = new IdxT[static_cast(nnz_)]; + RealT* vals = new RealT[static_cast(nnz_)]; + + std::copy(tmp_coo_jac.getColData(), tmp_coo_jac.getColData() + nnz_, cols); + std::copy(tmp_coo_jac.getValues(), tmp_coo_jac.getValues() + nnz_, vals); + + csr_jac_ = new LinearAlgebra::CsrMatrix(size_, size_, nnz_, &row_ptrs, &cols, &vals); + + const IdxT* map_to_sorted = tmp_coo_jac.getMapToSorted(); + const IdxT* map_to_dedup = tmp_coo_jac.getMapToDeduplicated(); + + map_to_csr_ = new IdxT[static_cast(nnz_dup)]; + for (IdxT i = 0; i < nnz_dup; ++i) + { + map_to_csr_[map_to_sorted[i]] = map_to_dedup[i]; + } + + return 0; + } + protected: IdxT size_{0}; IdxT nnz_{0}; diff --git a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp index 5fe0f6b66..00c7936ca 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp @@ -82,34 +82,7 @@ namespace GridKit J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; - LinearAlgebra::CooMatrix tmp_coo_jac(J_.getNumRows(), J_.getNumColumns(), nnz_dup); - tmp_coo_jac.setDataPointers((J_.getRows()).data(), (J_.getColumns()).data(), (J_.getValues()).data(), LinearAlgebra::memory::HOST); - std::cout << "Load CooMatrix Jacobian.\n"; - tmp_coo_jac.print(); - - IdxT* row_ptrs = tmp_coo_jac.getCsrRowData(); - - nnz_ = tmp_coo_jac.getNnz(); - - IdxT* cols = new IdxT[static_cast(nnz_)]; - RealT* vals = new RealT[static_cast(nnz_)]; - - std::copy(tmp_coo_jac.getColData(), tmp_coo_jac.getColData() + nnz_, cols); - std::copy(tmp_coo_jac.getValues(), tmp_coo_jac.getValues() + nnz_, vals); - - csr_jac_ = new LinearAlgebra::CsrMatrix(size_, size_, nnz_, &row_ptrs, &cols, &vals); - - const IdxT* map_to_sorted = tmp_coo_jac.getMapToSorted(); - const IdxT* map_to_dedup = tmp_coo_jac.getMapToDeduplicated(); - - map_to_csr_ = new IdxT[static_cast(nnz_dup)]; - for (IdxT i = 0; i < nnz_dup; ++i) - { - map_to_csr_[map_to_sorted[i]] = map_to_dedup[i]; - } - - std::cout << "Load CsrMatrix Jacobian.\n"; - csr_jac_->print(); + this->constructCsrFromCOO(nnz_dup); return 0; } From 08c40074ddb658396dfaa863da3d552ffd4dd6f1 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Wed, 10 Jun 2026 20:26:33 -0400 Subject: [PATCH 20/39] Construct CsrMatrix for all components and update tests. Currently slow for simulations, because of re-construction. --- .../PhasorDynamics/Branch/BranchEnzyme.cpp | 2 + GridKit/Model/PhasorDynamics/Bus/Bus.hpp | 50 +++++++++++++++++-- .../Model/PhasorDynamics/Bus/BusEnzyme.cpp | 2 + GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp | 21 ++++++++ GridKit/Model/PhasorDynamics/BusBase.hpp | 17 +++---- .../BusFault/BusFaultEnzyme.cpp | 2 + GridKit/Model/PhasorDynamics/Component.hpp | 13 +++-- .../Exciter/IEEET1/Ieeet1Enzyme.cpp | 2 + .../Exciter/SEXS-PTI/SexsPtiEnzyme.cpp | 2 + .../Governor/Tgov1/Tgov1Enzyme.cpp | 2 + .../PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp | 2 + .../Stabilizer/IEEEST/IeeestEnzyme.cpp | 2 + .../GENROUwS/GenrouEnzyme.cpp | 2 + .../GENSALwS/GensalEnzyme.cpp | 2 + .../GenClassical/GenClassicalEnzyme.cpp | 2 + .../Model/PhasorDynamics/SystemModelImpl.hpp | 12 ++--- .../PhasorDynamics/ExciterIeeet1Tests.hpp | 10 ++-- .../PhasorDynamics/ExciterSexsPtiTests.hpp | 10 ++-- .../PhasorDynamics/GenClassicalTests.hpp | 10 ++-- .../UnitTests/PhasorDynamics/GenrouTests.hpp | 10 ++-- .../UnitTests/PhasorDynamics/GensalTests.hpp | 9 ++-- .../PhasorDynamics/GovernorTgov1Tests.hpp | 10 ++-- .../UnitTests/PhasorDynamics/LoadZIPTests.hpp | 10 ++-- .../PhasorDynamics/StabilizerIeeestTests.hpp | 10 ++-- 24 files changed, 153 insertions(+), 61 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp index 774e47fc3..1974a0f81 100644 --- a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp @@ -102,6 +102,8 @@ namespace GridKit J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; + this->constructCsrFromCOO(nnz_dup); + return 0; } diff --git a/GridKit/Model/PhasorDynamics/Bus/Bus.hpp b/GridKit/Model/PhasorDynamics/Bus/Bus.hpp index 0da7765f7..af0b61b07 100644 --- a/GridKit/Model/PhasorDynamics/Bus/Bus.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/Bus.hpp @@ -20,13 +20,11 @@ namespace GridKit { using BusBase::bus_id_; using BusBase::size_; + using BusBase::nnz_; using BusBase::y_; using BusBase::yp_; using BusBase::f_; using BusBase::J_; - using BusBase::J_rows_buffer_; - using BusBase::J_cols_buffer_; - using BusBase::J_vals_buffer_; using BusBase::tag_; using BusBase::variable_indices_; using BusBase::residual_indices_; @@ -36,6 +34,8 @@ namespace GridKit using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename BusBase::RealT; + using MatrixT = typename BusBase::MatrixT; + using CsrMatrixT = typename BusBase::CsrMatrixT; using MonitorT = typename BusBase::MonitorT; using ModelDataT = BusData; using BusTypeT = typename BusData::BusType; @@ -97,6 +97,50 @@ namespace GridKit return f_[1]; } + protected: + int constructCsrFromCOO(const IdxT nnz_dup) + { + IdxT* rows_dup = new IdxT[static_cast(nnz_dup)]; + IdxT* cols_dup = new IdxT[static_cast(nnz_dup)]; + RealT* vals_dup = new RealT[static_cast(nnz_dup)]; + + std::copy((J_.getRows()).data(), (J_.getRows()).data() + nnz_dup, rows_dup); + std::copy((J_.getColumns()).data(), (J_.getColumns()).data() + nnz_dup, cols_dup); + std::copy((J_.getValues()).data(), (J_.getValues()).data() + nnz_dup, vals_dup); + + // Hijacking constructor takes ownership of _dup arrays + LinearAlgebra::CooMatrix tmp_coo_jac(J_.getNumRows(), J_.getNumColumns(), nnz_dup, &rows_dup, &cols_dup, &vals_dup); + + IdxT* row_ptrs = tmp_coo_jac.getCsrRowData(); + + nnz_ = tmp_coo_jac.getNnz(); + + IdxT* cols = new IdxT[static_cast(nnz_)]; + RealT* vals = new RealT[static_cast(nnz_)]; + + std::copy(tmp_coo_jac.getColData(), tmp_coo_jac.getColData() + nnz_, cols); + std::copy(tmp_coo_jac.getValues(), tmp_coo_jac.getValues() + nnz_, vals); + + csr_jac_ = new LinearAlgebra::CsrMatrix(size_, size_, nnz_, &row_ptrs, &cols, &vals); + + const IdxT* map_to_sorted = tmp_coo_jac.getMapToSorted(); + const IdxT* map_to_dedup = tmp_coo_jac.getMapToDeduplicated(); + + map_to_csr_ = new IdxT[static_cast(nnz_dup)]; + for (IdxT i = 0; i < nnz_dup; ++i) + { + map_to_csr_[map_to_sorted[i]] = map_to_dedup[i]; + } + + return 0; + } + + IdxT* J_rows_buffer_{nullptr}; + IdxT* J_cols_buffer_{nullptr}; + RealT* J_vals_buffer_{nullptr}; + IdxT* map_to_csr_{nullptr}; + CsrMatrixT* csr_jac_{nullptr}; + private: ScalarT Vr0_{0.0}; ScalarT Vi0_{0.0}; diff --git a/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp b/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp index 884100b18..344f4bc86 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp @@ -46,6 +46,8 @@ namespace GridKit J_vals_buffer_[2] = 0.0; J_vals_buffer_[3] = 0.0; J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, 4); + + this->constructCsrFromCOO(4); } // Bus Jacobian will remain a zero-valued matrix. return 0; diff --git a/GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp b/GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp index 534af06ed..c88977fd5 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp @@ -83,6 +83,27 @@ namespace GridKit Bus::~Bus() { // std::cout << "Destroy PQ bus ..." << std::endl; + if (J_rows_buffer_ != nullptr) + { + delete[] J_rows_buffer_; + delete[] J_cols_buffer_; + delete[] J_vals_buffer_; + J_rows_buffer_ = nullptr; + J_cols_buffer_ = nullptr; + J_vals_buffer_ = nullptr; + } + + if (csr_jac_ != nullptr) + { + delete csr_jac_; + csr_jac_ = nullptr; + } + + if (map_to_csr_ != nullptr) + { + delete[] map_to_csr_; + map_to_csr_ = nullptr; + } } /*! diff --git a/GridKit/Model/PhasorDynamics/BusBase.hpp b/GridKit/Model/PhasorDynamics/BusBase.hpp index f6591322c..dc37885e6 100644 --- a/GridKit/Model/PhasorDynamics/BusBase.hpp +++ b/GridKit/Model/PhasorDynamics/BusBase.hpp @@ -27,12 +27,13 @@ namespace GridKit class BusBase : public Model::Evaluator { public: - using ScalarT = scalar_type; - using IdxT = index_type; - using RealT = typename Model::Evaluator::RealT; - using MatrixT = typename Model::Evaluator::MatrixT; - using BusTypeT = typename BusData::BusType; - using MonitorT = Model::VariableMonitor; + using ScalarT = scalar_type; + using IdxT = index_type; + using RealT = typename Model::Evaluator::RealT; + using MatrixT = typename Model::Evaluator::MatrixT; + using CsrMatrixT = typename Model::Evaluator::CsrMatrixT; + using BusTypeT = typename BusData::BusType; + using MonitorT = Model::VariableMonitor; BusBase() = default; @@ -195,10 +196,6 @@ namespace GridKit std::vector g_; MatrixT J_; - IdxT* J_rows_buffer_{nullptr}; - IdxT* J_cols_buffer_{nullptr}; - RealT* J_vals_buffer_{nullptr}; - RealT rel_tol_; RealT abs_tol_; diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp index c59156300..4cae58434 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp @@ -90,6 +90,8 @@ namespace GridKit J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; + this->constructCsrFromCOO(nnz_dup); + return 0; } diff --git a/GridKit/Model/PhasorDynamics/Component.hpp b/GridKit/Model/PhasorDynamics/Component.hpp index 77b4c2a4e..c53081fcf 100644 --- a/GridKit/Model/PhasorDynamics/Component.hpp +++ b/GridKit/Model/PhasorDynamics/Component.hpp @@ -198,8 +198,16 @@ namespace GridKit protected: int constructCsrFromCOO(const IdxT nnz_dup) { - LinearAlgebra::CooMatrix tmp_coo_jac(J_.getNumRows(), J_.getNumColumns(), nnz_dup); - tmp_coo_jac.setDataPointers((J_.getRows()).data(), (J_.getColumns()).data(), (J_.getValues()).data(), LinearAlgebra::memory::HOST); + IdxT* rows_dup = new IdxT[static_cast(nnz_dup)]; + IdxT* cols_dup = new IdxT[static_cast(nnz_dup)]; + RealT* vals_dup = new RealT[static_cast(nnz_dup)]; + + std::copy((J_.getRows()).data(), (J_.getRows()).data() + nnz_dup, rows_dup); + std::copy((J_.getColumns()).data(), (J_.getColumns()).data() + nnz_dup, cols_dup); + std::copy((J_.getValues()).data(), (J_.getValues()).data() + nnz_dup, vals_dup); + + // Hijacking constructor takes ownership of _dup arrays + LinearAlgebra::CooMatrix tmp_coo_jac(J_.getNumRows(), J_.getNumColumns(), nnz_dup, &rows_dup, &cols_dup, &vals_dup); IdxT* row_ptrs = tmp_coo_jac.getCsrRowData(); @@ -225,7 +233,6 @@ namespace GridKit return 0; } - protected: IdxT size_{0}; IdxT nnz_{0}; /// Global (system-level) variable indices diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp index b3c31c32c..af260dd98 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp @@ -106,6 +106,8 @@ namespace GridKit J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; + this->constructCsrFromCOO(nnz_dup); + return 0; } diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp index 7d5d44739..153ba2320 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp @@ -99,6 +99,8 @@ namespace GridKit J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; + this->constructCsrFromCOO(nnz_dup); + return 0; } diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp index c459f2e30..37e3572c1 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp @@ -89,6 +89,8 @@ namespace GridKit J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; + this->constructCsrFromCOO(nnz_dup); + return 0; } diff --git a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp index 68a2012f6..a8aeafa35 100644 --- a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp @@ -77,6 +77,8 @@ namespace GridKit J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; + this->constructCsrFromCOO(nnz_dup); + return 0; } diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp index 778c558f5..de6e366d8 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp @@ -91,6 +91,8 @@ namespace GridKit J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; + this->constructCsrFromCOO(nnz_dup); + return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp index c3b0c8e0a..9f6dbc8fb 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp @@ -135,6 +135,8 @@ namespace GridKit block_nnz); J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; + + this->constructCsrFromCOO(nnz_dup); return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp index 6f7f56301..dac7aed6f 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp @@ -136,6 +136,8 @@ namespace GridKit J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; + this->constructCsrFromCOO(nnz_dup); + return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp index e10e3f799..23a6a73da 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp @@ -100,6 +100,8 @@ namespace GridKit J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; + this->constructCsrFromCOO(nnz_dup); + return 0; } diff --git a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp index 883dfab34..778eab0ec 100644 --- a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp @@ -772,9 +772,9 @@ namespace GridKit } // Allocate COO triplet arrays (we own these until we hand off to CsrMatrix) - IdxT* rows_dup = new IdxT[nnz_dup]; - IdxT* cols_dup = new IdxT[nnz_dup]; - RealT* vals_dup = new RealT[nnz_dup]; + IdxT* rows_dup = new IdxT[static_cast(nnz_dup)]; + IdxT* cols_dup = new IdxT[static_cast(nnz_dup)]; + RealT* vals_dup = new RealT[static_cast(nnz_dup)]; IdxT counter = 0; for (const auto& component : components_) @@ -819,8 +819,8 @@ namespace GridKit nnz_ = jac.getNnz(); // Allocate cols/vals with deduplicated nnz - IdxT* cols = new IdxT[nnz_]; - RealT* vals = new RealT[nnz_]; + IdxT* cols = new IdxT[static_cast(nnz_)]; + RealT* vals = new RealT[static_cast(nnz_)]; std::copy(jac.getColData(), jac.getColData() + nnz_, cols); std::copy(jac.getValues(), jac.getValues() + nnz_, vals); @@ -832,7 +832,7 @@ namespace GridKit const IdxT* map_to_dedup = jac.getMapToDeduplicated(); // Build a mappping from original COO index to CSR index - map_to_csr_ = new IdxT[nnz_dup]; + map_to_csr_ = new IdxT[static_cast(nnz_dup)]; for (IdxT i = 0; i < nnz_dup; ++i) { map_to_csr_[map_to_sorted[i]] = map_to_dedup[i]; diff --git a/tests/UnitTests/PhasorDynamics/ExciterIeeet1Tests.hpp b/tests/UnitTests/PhasorDynamics/ExciterIeeet1Tests.hpp index 766732b7e..6719546c9 100644 --- a/tests/UnitTests/PhasorDynamics/ExciterIeeet1Tests.hpp +++ b/tests/UnitTests/PhasorDynamics/ExciterIeeet1Tests.hpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include namespace GridKit { @@ -220,11 +220,11 @@ namespace GridKit bus.evaluateJacobian(); exciter.evaluateJacobian(); - GridKit::LinearAlgebra::COO_Matrix& model_jacobian = exciter.getJacobian(); - model_jacobian.deduplicate(); - model_jacobian.print("Model Jacobian"); + GridKit::LinearAlgebra::CsrMatrix* model_jacobian = exciter.getCsrJacobian(); + std::cout << "Sparse Csr Matrix: Ieeet1 Jacobian\n"; + model_jacobian->print(); - return GridKit::Testing::MapFromCOO(model_jacobian); + return GridKit::Testing::MapFromCsr(model_jacobian); } #endif diff --git a/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp b/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp index 3f90ab916..11638a8b3 100644 --- a/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp +++ b/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include namespace GridKit { @@ -436,11 +436,11 @@ namespace GridKit bus.evaluateJacobian(); exciter.evaluateJacobian(); - GridKit::LinearAlgebra::COO_Matrix& model_jacobian = exciter.getJacobian(); - model_jacobian.deduplicate(); - model_jacobian.print("Model Jacobian"); + GridKit::LinearAlgebra::CsrMatrix* model_jacobian = exciter.getCsrJacobian(); + std::cout << "Sparse Csr Matrix: SexsPti Jacobian\n"; + model_jacobian->print(); - return GridKit::Testing::MapFromCOO(model_jacobian); + return GridKit::Testing::MapFromCsr(model_jacobian); } #endif diff --git a/tests/UnitTests/PhasorDynamics/GenClassicalTests.hpp b/tests/UnitTests/PhasorDynamics/GenClassicalTests.hpp index 88190c032..00e22c3e4 100644 --- a/tests/UnitTests/PhasorDynamics/GenClassicalTests.hpp +++ b/tests/UnitTests/PhasorDynamics/GenClassicalTests.hpp @@ -20,7 +20,7 @@ #include #include #include -#include +#include namespace GridKit { @@ -445,11 +445,11 @@ namespace GridKit bus.evaluateJacobian(); gen.evaluateJacobian(); - GridKit::LinearAlgebra::COO_Matrix& model_jacobian = gen.getJacobian(); - model_jacobian.deduplicate(); - model_jacobian.print("Model Jacobian"); + GridKit::LinearAlgebra::CsrMatrix* model_jacobian = gen.getCsrJacobian(); + std::cout << "Sparse Csr Matrix: GenClassical Jacobian\n"; + model_jacobian->print(); - return GridKit::Testing::MapFromCOO(model_jacobian); + return GridKit::Testing::MapFromCsr(model_jacobian); } #endif diff --git a/tests/UnitTests/PhasorDynamics/GenrouTests.hpp b/tests/UnitTests/PhasorDynamics/GenrouTests.hpp index 8cea60fbd..382928df7 100644 --- a/tests/UnitTests/PhasorDynamics/GenrouTests.hpp +++ b/tests/UnitTests/PhasorDynamics/GenrouTests.hpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include namespace GridKit { @@ -486,11 +486,11 @@ namespace GridKit bus.evaluateJacobian(); gen.evaluateJacobian(); - GridKit::LinearAlgebra::COO_Matrix& model_jacobian = gen.getJacobian(); - model_jacobian.deduplicate(); - model_jacobian.print("Model Jacobian"); + GridKit::LinearAlgebra::CsrMatrix* model_jacobian = gen.getCsrJacobian(); + std::cout << "Sparse Csr Matrix: Genrou Jacobian\n"; + model_jacobian->print(); - return GridKit::Testing::MapFromCOO(model_jacobian); + return GridKit::Testing::MapFromCsr(model_jacobian); } #endif }; // class GenrouTest diff --git a/tests/UnitTests/PhasorDynamics/GensalTests.hpp b/tests/UnitTests/PhasorDynamics/GensalTests.hpp index a382e3172..23776ebd3 100644 --- a/tests/UnitTests/PhasorDynamics/GensalTests.hpp +++ b/tests/UnitTests/PhasorDynamics/GensalTests.hpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include namespace GridKit { @@ -448,10 +448,11 @@ namespace GridKit bus.evaluateJacobian(); gen.evaluateJacobian(); - GridKit::LinearAlgebra::COO_Matrix& model_jacobian = gen.getJacobian(); - model_jacobian.deduplicate(); + GridKit::LinearAlgebra::CsrMatrix* model_jacobian = gen.getCsrJacobian(); + std::cout << "Sparse Csr Matrix: Gensal Jacobian\n"; + model_jacobian->print(); - return GridKit::Testing::MapFromCOO(model_jacobian); + return GridKit::Testing::MapFromCsr(model_jacobian); } #endif }; // class GensalTests diff --git a/tests/UnitTests/PhasorDynamics/GovernorTgov1Tests.hpp b/tests/UnitTests/PhasorDynamics/GovernorTgov1Tests.hpp index bb0578d5f..f6e2bfd97 100644 --- a/tests/UnitTests/PhasorDynamics/GovernorTgov1Tests.hpp +++ b/tests/UnitTests/PhasorDynamics/GovernorTgov1Tests.hpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include namespace GridKit { @@ -416,11 +416,11 @@ namespace GridKit gov.evaluateResidual(); gov.evaluateJacobian(); - GridKit::LinearAlgebra::COO_Matrix model_jacobian = gov.getJacobian(); - model_jacobian.deduplicate(); - model_jacobian.print("Model Jacobian"); + GridKit::LinearAlgebra::CsrMatrix* model_jacobian = gov.getCsrJacobian(); + std::cout << "Sparse Csr Matrix: Tgov1 Jacobian\n"; + model_jacobian->print(); - return GridKit::Testing::MapFromCOO(model_jacobian); + return GridKit::Testing::MapFromCsr(model_jacobian); } #endif }; // class GovernorTgov1Tests diff --git a/tests/UnitTests/PhasorDynamics/LoadZIPTests.hpp b/tests/UnitTests/PhasorDynamics/LoadZIPTests.hpp index 818a00d79..c367de346 100644 --- a/tests/UnitTests/PhasorDynamics/LoadZIPTests.hpp +++ b/tests/UnitTests/PhasorDynamics/LoadZIPTests.hpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include namespace GridKit { @@ -237,11 +237,11 @@ namespace GridKit bus.evaluateJacobian(); load.evaluateJacobian(); - GridKit::LinearAlgebra::COO_Matrix& model_jacobian = load.getJacobian(); - model_jacobian.deduplicate(); - model_jacobian.print("Model Jacobian"); + GridKit::LinearAlgebra::CsrMatrix* model_jacobian = load.getCsrJacobian(); + std::cout << "Sparse Csr Matrix: LoadZIP Jacobian\n"; + model_jacobian->print(); - return GridKit::Testing::MapFromCOO(model_jacobian); + return GridKit::Testing::MapFromCsr(model_jacobian); } #endif }; // class LoadZIPTests diff --git a/tests/UnitTests/PhasorDynamics/StabilizerIeeestTests.hpp b/tests/UnitTests/PhasorDynamics/StabilizerIeeestTests.hpp index 6ef6bc41a..942f52e6f 100644 --- a/tests/UnitTests/PhasorDynamics/StabilizerIeeestTests.hpp +++ b/tests/UnitTests/PhasorDynamics/StabilizerIeeestTests.hpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include namespace GridKit { @@ -308,11 +308,11 @@ namespace GridKit stab.evaluateResidual(); stab.evaluateJacobian(); - auto model_jacobian = stab.getJacobian(); - model_jacobian.deduplicate(); - model_jacobian.print("IEEEST Jacobian"); + auto model_jacobian = stab.getCsrJacobian(); + std::cout << "Sparse Csr Matrix: Ieeest Jacobian\n"; + model_jacobian->print(); - return GridKit::Testing::MapFromCOO(model_jacobian); + return GridKit::Testing::MapFromCsr(model_jacobian); } #endif From af468a29d8b79bd5d5e3de59c0ebed039c3bd144 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Wed, 10 Jun 2026 20:28:07 -0400 Subject: [PATCH 21/39] Nuke MapFromCOO. --- GridKit/Utilities/CMakeLists.txt | 2 +- GridKit/Utilities/MapFromCOO.hpp | 36 -------------------------------- 2 files changed, 1 insertion(+), 37 deletions(-) delete mode 100644 GridKit/Utilities/MapFromCOO.hpp diff --git a/GridKit/Utilities/CMakeLists.txt b/GridKit/Utilities/CMakeLists.txt index 478eb11e8..7a94598a6 100644 --- a/GridKit/Utilities/CMakeLists.txt +++ b/GridKit/Utilities/CMakeLists.txt @@ -13,5 +13,5 @@ install( FILES Colors.hpp Errors.hpp FileIO.hpp - MapFromCOO.hpp + MapFromCsr.hpp DESTINATION include/GridKit/Utilities) diff --git a/GridKit/Utilities/MapFromCOO.hpp b/GridKit/Utilities/MapFromCOO.hpp deleted file mode 100644 index a617e8aae..000000000 --- a/GridKit/Utilities/MapFromCOO.hpp +++ /dev/null @@ -1,36 +0,0 @@ - -/** - * @file MapFromCOO.hpp - * - * @author Nicholson Koukpaizan , ORNL - * @todo This should go away once we settle on a sparse format - * - */ -#pragma once - -#include -#include - -namespace GridKit -{ - namespace Testing - { - template - std::vector MapFromCOO(LinearAlgebra::COO_Matrix matrix) - { - const std::vector& rows = matrix.getRows(); - const std::vector& columns = matrix.getColumns(); - const std::vector& values = matrix.getValues(); - const IdxT n_rows = matrix.getNumRows(); - - std::vector dependencies(n_rows); - - for (IdxT i = 0; i < matrix.getNnz(); ++i) - { - dependencies[rows[i]].insert(std::make_pair(columns[i], values[i])); - } - - return dependencies; - } - } // namespace Testing -} // namespace GridKit From a09de1400ac3f7480024149477f36ee2df2a8d27 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Wed, 10 Jun 2026 23:21:36 -0400 Subject: [PATCH 22/39] Assemble system Jacobian from component Csr (instead of COO). --- GridKit/Model/PhasorDynamics/Bus/Bus.hpp | 4 +- .../Model/PhasorDynamics/Bus/BusEnzyme.cpp | 9 +- .../Model/PhasorDynamics/Bus/BusInfinite.hpp | 3 + .../PhasorDynamics/Bus/BusInfiniteImpl.hpp | 8 ++ GridKit/Model/PhasorDynamics/BusBase.hpp | 11 +- GridKit/Model/PhasorDynamics/Component.hpp | 2 +- .../Model/PhasorDynamics/SystemModelImpl.hpp | 127 +++++++++++++----- 7 files changed, 122 insertions(+), 42 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/Bus/Bus.hpp b/GridKit/Model/PhasorDynamics/Bus/Bus.hpp index af0b61b07..a83aa1922 100644 --- a/GridKit/Model/PhasorDynamics/Bus/Bus.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/Bus.hpp @@ -28,6 +28,7 @@ namespace GridKit using BusBase::tag_; using BusBase::variable_indices_; using BusBase::residual_indices_; + using BusBase::csr_jac_; using BusBase::monitor_; public: @@ -121,7 +122,7 @@ namespace GridKit std::copy(tmp_coo_jac.getColData(), tmp_coo_jac.getColData() + nnz_, cols); std::copy(tmp_coo_jac.getValues(), tmp_coo_jac.getValues() + nnz_, vals); - csr_jac_ = new LinearAlgebra::CsrMatrix(size_, size_, nnz_, &row_ptrs, &cols, &vals); + csr_jac_ = new CsrMatrixT(tmp_coo_jac.getNumRows(), tmp_coo_jac.getNumColumns(), nnz_, &row_ptrs, &cols, &vals); const IdxT* map_to_sorted = tmp_coo_jac.getMapToSorted(); const IdxT* map_to_dedup = tmp_coo_jac.getMapToDeduplicated(); @@ -139,7 +140,6 @@ namespace GridKit IdxT* J_cols_buffer_{nullptr}; RealT* J_vals_buffer_{nullptr}; IdxT* map_to_csr_{nullptr}; - CsrMatrixT* csr_jac_{nullptr}; private: ScalarT Vr0_{0.0}; diff --git a/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp b/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp index 344f4bc86..a21e89d80 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp @@ -11,11 +11,11 @@ namespace GridKit namespace PhasorDynamics { /** - * @brief Jacobian evaluation experimental. This sets values to 0, for other - * components to add their contributions. + * @brief Jacobian evaluation experimental. * - * @warning This implementation assumes bus Jacobians are always evaluated - * _before_ component model Jacobians. + * This sets values to 0, and these remain unchanged. It is needed to get + * the indices into the list of entries that will later be deduplicated. + * Contributions to bus Jacobians from other components are stored in those components. * * @return int - error code */ @@ -49,7 +49,6 @@ namespace GridKit this->constructCsrFromCOO(4); } - // Bus Jacobian will remain a zero-valued matrix. return 0; } diff --git a/GridKit/Model/PhasorDynamics/Bus/BusInfinite.hpp b/GridKit/Model/PhasorDynamics/Bus/BusInfinite.hpp index 5e1ff1d3a..1ebaddc50 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusInfinite.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusInfinite.hpp @@ -18,18 +18,21 @@ namespace GridKit { using BusBase::bus_id_; using BusBase::size_; + using BusBase::nnz_; using BusBase::y_; using BusBase::yp_; using BusBase::f_; using BusBase::J_; using BusBase::variable_indices_; using BusBase::residual_indices_; + using BusBase::csr_jac_; using BusBase::monitor_; public: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename BusBase::RealT; + using CsrMatrixT = typename BusBase::CsrMatrixT; using MonitorT = typename BusBase::MonitorT; using ModelDataT = BusData; using BusTypeT = typename BusData::BusType; diff --git a/GridKit/Model/PhasorDynamics/Bus/BusInfiniteImpl.hpp b/GridKit/Model/PhasorDynamics/Bus/BusInfiniteImpl.hpp index f84e99def..010b6ac55 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusInfiniteImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusInfiniteImpl.hpp @@ -148,6 +148,14 @@ namespace GridKit template int BusInfinite::evaluateJacobian() { + if (csr_jac_ == nullptr) + { + J_.zeroMatrix(); + + nnz_ = 0; + + csr_jac_ = new CsrMatrixT(0, 0, 0); + } return 0; } diff --git a/GridKit/Model/PhasorDynamics/BusBase.hpp b/GridKit/Model/PhasorDynamics/BusBase.hpp index dc37885e6..2c8fce6ab 100644 --- a/GridKit/Model/PhasorDynamics/BusBase.hpp +++ b/GridKit/Model/PhasorDynamics/BusBase.hpp @@ -153,9 +153,14 @@ namespace GridKit return BusTypeT::DEFAULT; } + CsrMatrixT* getCsrJacobian() const override + { + return csr_jac_; + } + bool hasJacobian() override { - return false; + return true; } void updateTime(RealT /* t */, RealT /* a */) override @@ -195,7 +200,9 @@ namespace GridKit std::vector f_; std::vector g_; - MatrixT J_; + MatrixT J_; + CsrMatrixT* csr_jac_{nullptr}; + RealT rel_tol_; RealT abs_tol_; diff --git a/GridKit/Model/PhasorDynamics/Component.hpp b/GridKit/Model/PhasorDynamics/Component.hpp index c53081fcf..037ade23b 100644 --- a/GridKit/Model/PhasorDynamics/Component.hpp +++ b/GridKit/Model/PhasorDynamics/Component.hpp @@ -219,7 +219,7 @@ namespace GridKit std::copy(tmp_coo_jac.getColData(), tmp_coo_jac.getColData() + nnz_, cols); std::copy(tmp_coo_jac.getValues(), tmp_coo_jac.getValues() + nnz_, vals); - csr_jac_ = new LinearAlgebra::CsrMatrix(size_, size_, nnz_, &row_ptrs, &cols, &vals); + csr_jac_ = new CsrMatrixT(tmp_coo_jac.getNumRows(), tmp_coo_jac.getNumColumns(), nnz_, &row_ptrs, &cols, &vals); const IdxT* map_to_sorted = tmp_coo_jac.getMapToSorted(); const IdxT* map_to_dedup = tmp_coo_jac.getMapToDeduplicated(); diff --git a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp index 778eab0ec..ea15669de 100644 --- a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp @@ -527,6 +527,11 @@ namespace GridKit has_jacobian = has_jacobian && component->hasJacobian(); } + for (const auto& bus : buses_) + { + has_jacobian = has_jacobian && bus->hasJacobian(); + } + if (!has_jacobian) { Log::warning() << "GridKit was built with Enzyme, but some models " @@ -759,16 +764,30 @@ namespace GridKit IdxT nnz_dup = 0; for (const auto& component : components_) { - auto component_jacobian = component->getJacobian(); + auto component_jacobian = component->getCsrJacobian(); - nnz_dup += component_jacobian.getNnz(); + if (component_jacobian != nullptr) + { + nnz_dup += component_jacobian->getNnz(); + } + else + { + Log::warning() << "A component has returned a nullptr Jacobian.\n"; + } } for (const auto& bus : buses_) { - auto bus_jacobian = bus->getJacobian(); + auto bus_jacobian = bus->getCsrJacobian(); - nnz_dup += bus_jacobian.getNnz(); + if (bus_jacobian != nullptr) + { + nnz_dup += bus_jacobian->getNnz(); + } + else + { + Log::warning() << "A bus has returned a nullptr Jacobian.\n"; + } } // Allocate COO triplet arrays (we own these until we hand off to CsrMatrix) @@ -779,38 +798,60 @@ namespace GridKit IdxT counter = 0; for (const auto& component : components_) { - auto component_jacobian = component->getJacobian(); + auto component_jacobian = component->getCsrJacobian(); - const std::vector& rows = component_jacobian.getRows(); - const std::vector& columns = component_jacobian.getColumns(); - const std::vector& values = component_jacobian.getValues(); - for (size_t i = 0; i < component_jacobian.getNnz(); ++i) + if (component_jacobian != nullptr) { - rows_dup[counter] = rows[i]; - cols_dup[counter] = columns[i]; - vals_dup[counter] = values[i]; - counter++; + const IdxT* rows = component_jacobian->getRowData(); + const IdxT* columns = component_jacobian->getColData(); + const RealT* values = component_jacobian->getValues(); + for (IdxT i = 0; i < component_jacobian->getNumRows(); ++i) + { + for (IdxT j = rows[i]; j < rows[i + 1]; ++j) + { + rows_dup[counter] = i; + cols_dup[counter] = columns[j]; + vals_dup[counter] = values[j]; + counter++; + } + } + } + else + { + Log::warning() << "A component has returned a nullptr Jacobian.\n"; } } for (const auto& bus : buses_) { - auto bus_jacobian = bus->getJacobian(); + auto bus_jacobian = bus->getCsrJacobian(); - const std::vector& rows = bus_jacobian.getRows(); - const std::vector& columns = bus_jacobian.getColumns(); - const std::vector& values = bus_jacobian.getValues(); - for (size_t i = 0; i < bus_jacobian.getNnz(); ++i) + if (bus_jacobian != nullptr) + { + const IdxT* rows = bus_jacobian->getRowData(); + const IdxT* columns = bus_jacobian->getColData(); + const RealT* values = bus_jacobian->getValues(); + for (IdxT i = 0; i < bus_jacobian->getNumRows(); ++i) + { + for (IdxT j = rows[i]; j < rows[i + 1]; ++j) + { + rows_dup[counter] = i; + cols_dup[counter] = columns[j]; + vals_dup[counter] = values[j]; + counter++; + } + } + } + else { - rows_dup[counter] = rows[i]; - cols_dup[counter] = columns[i]; - vals_dup[counter] = values[i]; - counter++; + Log::warning() << "A bus has returned a nullptr Jacobian.\n"; } } // Build the system COO Jacobian LinearAlgebra::CooMatrix jac(size_, size_, nnz_dup, &rows_dup, &cols_dup, &vals_dup); + std::cout << "System CooMatrix\n"; + jac.print(); // Populate CSR data with sort and deduplicate IdxT* row_ptrs = jac.getCsrRowData(); @@ -851,25 +892,47 @@ namespace GridKit IdxT counter = 0; for (const auto& component : components_) { - auto component_jacobian = component->getJacobian(); + auto component_jacobian = component->getCsrJacobian(); - const std::vector& values = component_jacobian.getValues(); - for (size_t i = 0; i < component_jacobian.getNnz(); ++i) + if (component_jacobian != nullptr) + { + const IdxT* rows = component_jacobian->getRowData(); + const RealT* values = component_jacobian->getValues(); + for (IdxT i = 0; i < component_jacobian->getNumRows(); ++i) + { + for (IdxT j = rows[i]; j < rows[i + 1]; ++j) + { + vals[map_to_csr_[counter]] += values[j]; + ++counter; + } + } + } + else { - vals[map_to_csr_[counter]] += values[i]; - ++counter; + Log::warning() << "A component has returned a nullptr Jacobian.\n"; } } for (const auto& bus : buses_) { - auto bus_jacobian = bus->getJacobian(); + auto bus_jacobian = bus->getCsrJacobian(); - const std::vector& values = bus_jacobian.getValues(); - for (size_t i = 0; i < bus_jacobian.getNnz(); ++i) + if (bus_jacobian != nullptr) + { + const IdxT* rows = bus_jacobian->getRowData(); + const RealT* values = bus_jacobian->getValues(); + for (IdxT i = 0; i < bus_jacobian->getNumRows(); ++i) + { + for (IdxT j = rows[i]; j < rows[i + 1]; ++j) + { + vals[map_to_csr_[counter]] += values[j]; + ++counter; + } + } + } + else { - vals[map_to_csr_[counter]] += values[i]; - ++counter; + Log::warning() << "A bus has returned a nullptr Jacobian.\n"; } } } From abda1635a7bf9f4a581f2e6ded3052a2f085e07f Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Wed, 10 Jun 2026 23:28:30 -0400 Subject: [PATCH 23/39] Nuke getJacobian method that returns COO_Matrix. --- GridKit/Model/Evaluator.hpp | 3 --- GridKit/Model/PhasorDynamics/BusBase.hpp | 10 ---------- GridKit/Model/PhasorDynamics/Component.hpp | 10 ---------- GridKit/Model/PowerElectronics/CircuitComponent.hpp | 10 ---------- GridKit/Model/PowerElectronics/CircuitNode.hpp | 10 ---------- GridKit/Model/PowerElectronics/NodeBase.hpp | 10 ---------- GridKit/Model/PowerFlow/ModelEvaluatorImpl.hpp | 10 ---------- tests/UnitTests/Solver/Dynamic/IdaTests.hpp | 11 +++-------- 8 files changed, 3 insertions(+), 71 deletions(-) diff --git a/GridKit/Model/Evaluator.hpp b/GridKit/Model/Evaluator.hpp index 3635c7027..58d6b5cfc 100644 --- a/GridKit/Model/Evaluator.hpp +++ b/GridKit/Model/Evaluator.hpp @@ -138,9 +138,6 @@ namespace GridKit virtual std::vector& getResidual() = 0; virtual const std::vector& getResidual() const = 0; - virtual MatrixT& getJacobian() = 0; - virtual const MatrixT& getJacobian() const = 0; - virtual std::vector& getIntegrand() = 0; virtual const std::vector& getIntegrand() const = 0; diff --git a/GridKit/Model/PhasorDynamics/BusBase.hpp b/GridKit/Model/PhasorDynamics/BusBase.hpp index 2c8fce6ab..f7904dcf4 100644 --- a/GridKit/Model/PhasorDynamics/BusBase.hpp +++ b/GridKit/Model/PhasorDynamics/BusBase.hpp @@ -105,16 +105,6 @@ namespace GridKit return f_; } - MatrixT& getJacobian() override - { - return J_; - } - - const MatrixT& getJacobian() const override - { - return J_; - } - int setVariableIndex(IdxT local_index, IdxT global_index) { variable_indices_[static_cast(local_index)] = global_index; diff --git a/GridKit/Model/PhasorDynamics/Component.hpp b/GridKit/Model/PhasorDynamics/Component.hpp index 037ade23b..ccb8ef9ec 100644 --- a/GridKit/Model/PhasorDynamics/Component.hpp +++ b/GridKit/Model/PhasorDynamics/Component.hpp @@ -117,16 +117,6 @@ namespace GridKit return f_; } - MatrixT& getJacobian() override - { - return J_; - } - - const MatrixT& getJacobian() const override - { - return J_; - } - int setVariableIndex(IdxT local_index, IdxT global_index) { variable_indices_[static_cast(local_index)] = global_index; diff --git a/GridKit/Model/PowerElectronics/CircuitComponent.hpp b/GridKit/Model/PowerElectronics/CircuitComponent.hpp index a99257454..f4562e00d 100644 --- a/GridKit/Model/PowerElectronics/CircuitComponent.hpp +++ b/GridKit/Model/PowerElectronics/CircuitComponent.hpp @@ -360,16 +360,6 @@ namespace GridKit return f_; } - MatrixT& getJacobian() final - { - throw "Not Implemented"; - } - - const MatrixT& getJacobian() const final - { - throw "Not Implemented"; - } - std::vector& getIntegrand() final { return g_; diff --git a/GridKit/Model/PowerElectronics/CircuitNode.hpp b/GridKit/Model/PowerElectronics/CircuitNode.hpp index 5fd096f62..648941444 100644 --- a/GridKit/Model/PowerElectronics/CircuitNode.hpp +++ b/GridKit/Model/PowerElectronics/CircuitNode.hpp @@ -312,16 +312,6 @@ namespace GridKit return f_; } - MatrixT& getJacobian() final - { - return J_; - } - - const MatrixT& getJacobian() const final - { - return J_; - } - std::vector& getIntegrand() final { return g_; diff --git a/GridKit/Model/PowerElectronics/NodeBase.hpp b/GridKit/Model/PowerElectronics/NodeBase.hpp index 9e9748529..3183b5a37 100644 --- a/GridKit/Model/PowerElectronics/NodeBase.hpp +++ b/GridKit/Model/PowerElectronics/NodeBase.hpp @@ -90,16 +90,6 @@ namespace GridKit return tag_; } - MatrixT& getJacobian() final - { - return J_; - } - - const MatrixT& getJacobian() const final - { - return J_; - } - int setBusID(IdxT bus_id) { bus_id_ = bus_id; diff --git a/GridKit/Model/PowerFlow/ModelEvaluatorImpl.hpp b/GridKit/Model/PowerFlow/ModelEvaluatorImpl.hpp index 2457b16b9..9b4d8853f 100644 --- a/GridKit/Model/PowerFlow/ModelEvaluatorImpl.hpp +++ b/GridKit/Model/PowerFlow/ModelEvaluatorImpl.hpp @@ -178,16 +178,6 @@ namespace GridKit return f_; } - MatrixT& getJacobian() - { - return jac_; - } - - const MatrixT& getJacobian() const - { - return jac_; - } - std::vector& getIntegrand() { return g_; diff --git a/tests/UnitTests/Solver/Dynamic/IdaTests.hpp b/tests/UnitTests/Solver/Dynamic/IdaTests.hpp index e3592bcf2..63196214e 100644 --- a/tests/UnitTests/Solver/Dynamic/IdaTests.hpp +++ b/tests/UnitTests/Solver/Dynamic/IdaTests.hpp @@ -200,14 +200,9 @@ namespace GridKit return f_; } - GridKit::LinearAlgebra::COO_Matrix& getJacobian() override + GridKit::LinearAlgebra::CsrMatrix* getCsrJacobian() const override { - return jac_; - } - - const GridKit::LinearAlgebra::COO_Matrix& getJacobian() const override - { - return jac_; + return csr_jac_; } std::vector& getIntegrand() override @@ -257,7 +252,7 @@ namespace GridKit std::vector fB_; std::vector gB_; - GridKit::LinearAlgebra::COO_Matrix jac_; + GridKit::LinearAlgebra::CsrMatrix* csr_jac_; std::vector param_; std::vector param_up_; From 911e7b3b163213adbbade4be3a2a67574aa7a771 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 00:29:41 -0400 Subject: [PATCH 24/39] Only construct component-level CsrMatrix once. --- GridKit/Model/Evaluator.hpp | 1 + GridKit/Model/PhasorDynamics/Bus/Bus.hpp | 65 ++++++++++++------ GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp | 7 ++ GridKit/Model/PhasorDynamics/Component.hpp | 71 ++++++++++++++------ 4 files changed, 104 insertions(+), 40 deletions(-) diff --git a/GridKit/Model/Evaluator.hpp b/GridKit/Model/Evaluator.hpp index 58d6b5cfc..37b10fe3d 100644 --- a/GridKit/Model/Evaluator.hpp +++ b/GridKit/Model/Evaluator.hpp @@ -26,6 +26,7 @@ namespace GridKit using RealT = typename GridKit::ScalarTraits::RealT; using MatrixT = GridKit::LinearAlgebra::COO_Matrix; //\todo Use CsrMatrix using CsrMatrixT = GridKit::LinearAlgebra::CsrMatrix; + using CooMatrixT = GridKit::LinearAlgebra::CooMatrix; Evaluator() { diff --git a/GridKit/Model/PhasorDynamics/Bus/Bus.hpp b/GridKit/Model/PhasorDynamics/Bus/Bus.hpp index a83aa1922..329d6a496 100644 --- a/GridKit/Model/PhasorDynamics/Bus/Bus.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/Bus.hpp @@ -37,6 +37,7 @@ namespace GridKit using RealT = typename BusBase::RealT; using MatrixT = typename BusBase::MatrixT; using CsrMatrixT = typename BusBase::CsrMatrixT; + using CooMatrixT = typename BusBase::CooMatrixT; using MonitorT = typename BusBase::MonitorT; using ModelDataT = BusData; using BusTypeT = typename BusData::BusType; @@ -101,41 +102,65 @@ namespace GridKit protected: int constructCsrFromCOO(const IdxT nnz_dup) { - IdxT* rows_dup = new IdxT[static_cast(nnz_dup)]; - IdxT* cols_dup = new IdxT[static_cast(nnz_dup)]; - RealT* vals_dup = new RealT[static_cast(nnz_dup)]; + if (csr_jac_ == nullptr) + { + rows_dup_ = new IdxT[static_cast(nnz_dup)]; + cols_dup_ = new IdxT[static_cast(nnz_dup)]; + vals_dup_ = new RealT[static_cast(nnz_dup)]; - std::copy((J_.getRows()).data(), (J_.getRows()).data() + nnz_dup, rows_dup); - std::copy((J_.getColumns()).data(), (J_.getColumns()).data() + nnz_dup, cols_dup); - std::copy((J_.getValues()).data(), (J_.getValues()).data() + nnz_dup, vals_dup); + std::copy((J_.getRows()).data(), (J_.getRows()).data() + nnz_dup, rows_dup_); + std::copy((J_.getColumns()).data(), (J_.getColumns()).data() + nnz_dup, cols_dup_); + std::copy((J_.getValues()).data(), (J_.getValues()).data() + nnz_dup, vals_dup_); - // Hijacking constructor takes ownership of _dup arrays - LinearAlgebra::CooMatrix tmp_coo_jac(J_.getNumRows(), J_.getNumColumns(), nnz_dup, &rows_dup, &cols_dup, &vals_dup); + CooMatrixT tmp_coo_jac(J_.getNumRows(), J_.getNumColumns(), nnz_dup); + tmp_coo_jac.setDataPointers(rows_dup_, cols_dup_, vals_dup_, LinearAlgebra::memory::HOST); - IdxT* row_ptrs = tmp_coo_jac.getCsrRowData(); + IdxT* row_ptrs = tmp_coo_jac.getCsrRowData(); - nnz_ = tmp_coo_jac.getNnz(); + nnz_ = tmp_coo_jac.getNnz(); - IdxT* cols = new IdxT[static_cast(nnz_)]; - RealT* vals = new RealT[static_cast(nnz_)]; + IdxT* cols = new IdxT[static_cast(nnz_)]; + RealT* vals = new RealT[static_cast(nnz_)]; - std::copy(tmp_coo_jac.getColData(), tmp_coo_jac.getColData() + nnz_, cols); - std::copy(tmp_coo_jac.getValues(), tmp_coo_jac.getValues() + nnz_, vals); + std::copy(tmp_coo_jac.getColData(), tmp_coo_jac.getColData() + nnz_, cols); + std::copy(tmp_coo_jac.getValues(), tmp_coo_jac.getValues() + nnz_, vals); - csr_jac_ = new CsrMatrixT(tmp_coo_jac.getNumRows(), tmp_coo_jac.getNumColumns(), nnz_, &row_ptrs, &cols, &vals); + csr_jac_ = new CsrMatrixT(tmp_coo_jac.getNumRows(), tmp_coo_jac.getNumColumns(), nnz_, &row_ptrs, &cols, &vals); - const IdxT* map_to_sorted = tmp_coo_jac.getMapToSorted(); - const IdxT* map_to_dedup = tmp_coo_jac.getMapToDeduplicated(); + const IdxT* map_to_sorted = tmp_coo_jac.getMapToSorted(); + const IdxT* map_to_dedup = tmp_coo_jac.getMapToDeduplicated(); - map_to_csr_ = new IdxT[static_cast(nnz_dup)]; - for (IdxT i = 0; i < nnz_dup; ++i) + map_to_csr_ = new IdxT[static_cast(nnz_dup)]; + for (IdxT i = 0; i < nnz_dup; ++i) + { + map_to_csr_[map_to_sorted[i]] = map_to_dedup[static_cast(i)]; + } + } + else { - map_to_csr_[map_to_sorted[i]] = map_to_dedup[i]; + RealT* vals = csr_jac_->getValues(); + for (IdxT i = 0; i < nnz_; ++i) + { + vals[i] = 0.0; + } + + IdxT counter = 0; + auto rows = J_.getRows(); + auto cols = J_.getColumns(); + auto values = J_.getValues(); + for (IdxT i = 0; i < nnz_dup; ++i) + { + vals[map_to_csr_[counter]] += values[static_cast(i)]; + ++counter; + } } return 0; } + IdxT* rows_dup_{nullptr}; + IdxT* cols_dup_{nullptr}; + RealT* vals_dup_{nullptr}; IdxT* J_rows_buffer_{nullptr}; IdxT* J_cols_buffer_{nullptr}; RealT* J_vals_buffer_{nullptr}; diff --git a/GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp b/GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp index c88977fd5..1d7bcb8f5 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp @@ -91,6 +91,13 @@ namespace GridKit J_rows_buffer_ = nullptr; J_cols_buffer_ = nullptr; J_vals_buffer_ = nullptr; + + delete[] rows_dup_; + delete[] cols_dup_; + delete[] vals_dup_; + rows_dup_ = nullptr; + cols_dup_ = nullptr; + vals_dup_ = nullptr; } if (csr_jac_ != nullptr) diff --git a/GridKit/Model/PhasorDynamics/Component.hpp b/GridKit/Model/PhasorDynamics/Component.hpp index ccb8ef9ec..be76d5efe 100644 --- a/GridKit/Model/PhasorDynamics/Component.hpp +++ b/GridKit/Model/PhasorDynamics/Component.hpp @@ -26,6 +26,7 @@ namespace GridKit using RealT = typename Model::Evaluator::RealT; using MatrixT = typename Model::Evaluator::MatrixT; using CsrMatrixT = typename Model::Evaluator::CsrMatrixT; + using CooMatrixT = typename Model::Evaluator::CooMatrixT; Component() = default; @@ -39,6 +40,12 @@ namespace GridKit J_rows_buffer_ = nullptr; J_cols_buffer_ = nullptr; J_vals_buffer_ = nullptr; + delete[] rows_dup_; + delete[] cols_dup_; + delete[] vals_dup_; + rows_dup_ = nullptr; + cols_dup_ = nullptr; + vals_dup_ = nullptr; } if (csr_jac_ != nullptr) @@ -188,36 +195,57 @@ namespace GridKit protected: int constructCsrFromCOO(const IdxT nnz_dup) { - IdxT* rows_dup = new IdxT[static_cast(nnz_dup)]; - IdxT* cols_dup = new IdxT[static_cast(nnz_dup)]; - RealT* vals_dup = new RealT[static_cast(nnz_dup)]; + if (csr_jac_ == nullptr) + { + rows_dup_ = new IdxT[static_cast(nnz_dup)]; + cols_dup_ = new IdxT[static_cast(nnz_dup)]; + vals_dup_ = new RealT[static_cast(nnz_dup)]; - std::copy((J_.getRows()).data(), (J_.getRows()).data() + nnz_dup, rows_dup); - std::copy((J_.getColumns()).data(), (J_.getColumns()).data() + nnz_dup, cols_dup); - std::copy((J_.getValues()).data(), (J_.getValues()).data() + nnz_dup, vals_dup); + std::copy((J_.getRows()).data(), (J_.getRows()).data() + nnz_dup, rows_dup_); + std::copy((J_.getColumns()).data(), (J_.getColumns()).data() + nnz_dup, cols_dup_); + std::copy((J_.getValues()).data(), (J_.getValues()).data() + nnz_dup, vals_dup_); - // Hijacking constructor takes ownership of _dup arrays - LinearAlgebra::CooMatrix tmp_coo_jac(J_.getNumRows(), J_.getNumColumns(), nnz_dup, &rows_dup, &cols_dup, &vals_dup); + CooMatrixT tmp_coo_jac(J_.getNumRows(), J_.getNumColumns(), nnz_dup); + tmp_coo_jac.setDataPointers(rows_dup_, cols_dup_, vals_dup_, LinearAlgebra::memory::HOST); - IdxT* row_ptrs = tmp_coo_jac.getCsrRowData(); + IdxT* row_ptrs = tmp_coo_jac.getCsrRowData(); - nnz_ = tmp_coo_jac.getNnz(); + nnz_ = tmp_coo_jac.getNnz(); - IdxT* cols = new IdxT[static_cast(nnz_)]; - RealT* vals = new RealT[static_cast(nnz_)]; + IdxT* cols = new IdxT[static_cast(nnz_)]; + RealT* vals = new RealT[static_cast(nnz_)]; - std::copy(tmp_coo_jac.getColData(), tmp_coo_jac.getColData() + nnz_, cols); - std::copy(tmp_coo_jac.getValues(), tmp_coo_jac.getValues() + nnz_, vals); + std::copy(tmp_coo_jac.getColData(), tmp_coo_jac.getColData() + nnz_, cols); + std::copy(tmp_coo_jac.getValues(), tmp_coo_jac.getValues() + nnz_, vals); - csr_jac_ = new CsrMatrixT(tmp_coo_jac.getNumRows(), tmp_coo_jac.getNumColumns(), nnz_, &row_ptrs, &cols, &vals); + csr_jac_ = new CsrMatrixT(tmp_coo_jac.getNumRows(), tmp_coo_jac.getNumColumns(), nnz_, &row_ptrs, &cols, &vals); - const IdxT* map_to_sorted = tmp_coo_jac.getMapToSorted(); - const IdxT* map_to_dedup = tmp_coo_jac.getMapToDeduplicated(); + const IdxT* map_to_sorted = tmp_coo_jac.getMapToSorted(); + const IdxT* map_to_dedup = tmp_coo_jac.getMapToDeduplicated(); - map_to_csr_ = new IdxT[static_cast(nnz_dup)]; - for (IdxT i = 0; i < nnz_dup; ++i) + map_to_csr_ = new IdxT[static_cast(nnz_dup)]; + for (IdxT i = 0; i < nnz_dup; ++i) + { + map_to_csr_[map_to_sorted[i]] = map_to_dedup[static_cast(i)]; + } + } + else { - map_to_csr_[map_to_sorted[i]] = map_to_dedup[i]; + RealT* vals = csr_jac_->getValues(); + for (IdxT i = 0; i < nnz_; ++i) + { + vals[i] = 0.0; + } + + IdxT counter = 0; + auto rows = J_.getRows(); + auto cols = J_.getColumns(); + auto values = J_.getValues(); + for (IdxT i = 0; i < nnz_dup; ++i) + { + vals[map_to_csr_[counter]] += values[static_cast(i)]; + ++counter; + } } return 0; @@ -237,6 +265,9 @@ namespace GridKit std::vector g_; MatrixT J_; + IdxT* rows_dup_{nullptr}; + IdxT* cols_dup_{nullptr}; + RealT* vals_dup_{nullptr}; IdxT* J_rows_buffer_{nullptr}; IdxT* J_cols_buffer_{nullptr}; RealT* J_vals_buffer_{nullptr}; From d6b594adf767be9ceafb190b959123f63bb2e600 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 00:34:03 -0400 Subject: [PATCH 25/39] No need for csr_jac_ counter at component level. --- GridKit/Model/PhasorDynamics/Bus/Bus.hpp | 6 +----- GridKit/Model/PhasorDynamics/Component.hpp | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/Bus/Bus.hpp b/GridKit/Model/PhasorDynamics/Bus/Bus.hpp index 329d6a496..b0d16bf91 100644 --- a/GridKit/Model/PhasorDynamics/Bus/Bus.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/Bus.hpp @@ -144,14 +144,10 @@ namespace GridKit vals[i] = 0.0; } - IdxT counter = 0; - auto rows = J_.getRows(); - auto cols = J_.getColumns(); auto values = J_.getValues(); for (IdxT i = 0; i < nnz_dup; ++i) { - vals[map_to_csr_[counter]] += values[static_cast(i)]; - ++counter; + vals[map_to_csr_[i]] += values[static_cast(i)]; } } diff --git a/GridKit/Model/PhasorDynamics/Component.hpp b/GridKit/Model/PhasorDynamics/Component.hpp index be76d5efe..a7f2cd84c 100644 --- a/GridKit/Model/PhasorDynamics/Component.hpp +++ b/GridKit/Model/PhasorDynamics/Component.hpp @@ -237,14 +237,10 @@ namespace GridKit vals[i] = 0.0; } - IdxT counter = 0; - auto rows = J_.getRows(); - auto cols = J_.getColumns(); auto values = J_.getValues(); for (IdxT i = 0; i < nnz_dup; ++i) { - vals[map_to_csr_[counter]] += values[static_cast(i)]; - ++counter; + vals[map_to_csr_[i]] += values[static_cast(i)]; } } From 985228620aabde27207574ba254538574290c633 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 00:41:33 -0400 Subject: [PATCH 26/39] Use alias for CooMatrixT in SystemModel. --- GridKit/Model/PhasorDynamics/SystemModel.hpp | 1 + GridKit/Model/PhasorDynamics/SystemModelImpl.hpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/GridKit/Model/PhasorDynamics/SystemModel.hpp b/GridKit/Model/PhasorDynamics/SystemModel.hpp index e1d6f0cd9..404ef8932 100644 --- a/GridKit/Model/PhasorDynamics/SystemModel.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModel.hpp @@ -63,6 +63,7 @@ namespace GridKit using IdxT = index_type; using RealT = typename Model::Evaluator::RealT; using CsrMatrixT = typename Model::Evaluator::CsrMatrixT; + using CooMatrixT = typename Model::Evaluator::CooMatrixT; using BusT = BusBase; using SignalT = SignalNode; using ComponentT = Component; diff --git a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp index ea15669de..0d440814f 100644 --- a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp @@ -849,7 +849,7 @@ namespace GridKit } // Build the system COO Jacobian - LinearAlgebra::CooMatrix jac(size_, size_, nnz_dup, &rows_dup, &cols_dup, &vals_dup); + CooMatrixT jac(size_, size_, nnz_dup, &rows_dup, &cols_dup, &vals_dup); std::cout << "System CooMatrix\n"; jac.print(); From 8a775601de3a1b8d35d337d74a4ba0a9c90d9fc9 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 00:45:53 -0400 Subject: [PATCH 27/39] Remve Jacobian debug print from System model. --- GridKit/Model/PhasorDynamics/SystemModelImpl.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp index 0d440814f..0349bafc5 100644 --- a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp @@ -850,8 +850,6 @@ namespace GridKit // Build the system COO Jacobian CooMatrixT jac(size_, size_, nnz_dup, &rows_dup, &cols_dup, &vals_dup); - std::cout << "System CooMatrix\n"; - jac.print(); // Populate CSR data with sort and deduplicate IdxT* row_ptrs = jac.getCsrRowData(); From 71d0e5f5de6f3d3cd752fafe4564243cf3a9baa5 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 01:02:27 -0400 Subject: [PATCH 28/39] Inline CooMatrix and CsrMatrix size accessors. --- GridKit/LinearAlgebra/SparseMatrix/CooMatrix.cpp | 6 +++--- GridKit/LinearAlgebra/SparseMatrix/CsrMatrix.cpp | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/GridKit/LinearAlgebra/SparseMatrix/CooMatrix.cpp b/GridKit/LinearAlgebra/SparseMatrix/CooMatrix.cpp index 37fccb935..a81ea555c 100644 --- a/GridKit/LinearAlgebra/SparseMatrix/CooMatrix.cpp +++ b/GridKit/LinearAlgebra/SparseMatrix/CooMatrix.cpp @@ -202,7 +202,7 @@ namespace GridKit * @return number of matrix rows. */ template - IdxT CooMatrix::getNumRows() const + inline IdxT CooMatrix::getNumRows() const { return n_; } @@ -213,7 +213,7 @@ namespace GridKit * @return number of matrix columns. */ template - IdxT CooMatrix::getNumColumns() const + inline IdxT CooMatrix::getNumColumns() const { return m_; } @@ -224,7 +224,7 @@ namespace GridKit * @return number of non-zeros. */ template - IdxT CooMatrix::getNnz() const + inline IdxT CooMatrix::getNnz() const { return nnz_; } diff --git a/GridKit/LinearAlgebra/SparseMatrix/CsrMatrix.cpp b/GridKit/LinearAlgebra/SparseMatrix/CsrMatrix.cpp index 3325569bd..fa37e1965 100644 --- a/GridKit/LinearAlgebra/SparseMatrix/CsrMatrix.cpp +++ b/GridKit/LinearAlgebra/SparseMatrix/CsrMatrix.cpp @@ -198,7 +198,7 @@ namespace GridKit * @return number of matrix rows. */ template - IdxT CsrMatrix::getNumRows() const + inline IdxT CsrMatrix::getNumRows() const { return n_; } @@ -209,7 +209,7 @@ namespace GridKit * @return number of matrix columns. */ template - IdxT CsrMatrix::getNumColumns() const + inline IdxT CsrMatrix::getNumColumns() const { return m_; } @@ -220,7 +220,7 @@ namespace GridKit * @return number of non-zeros. */ template - IdxT CsrMatrix::getNnz() const + inline IdxT CsrMatrix::getNnz() const { return nnz_; } From ce79f73ab6feab92d24e0c20ca5c3a3f03bb4d33 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 01:04:56 -0400 Subject: [PATCH 29/39] Temporary variable for n_rows. --- GridKit/Model/PhasorDynamics/SystemModelImpl.hpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp index 0349bafc5..8a8397f95 100644 --- a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp @@ -805,7 +805,8 @@ namespace GridKit const IdxT* rows = component_jacobian->getRowData(); const IdxT* columns = component_jacobian->getColData(); const RealT* values = component_jacobian->getValues(); - for (IdxT i = 0; i < component_jacobian->getNumRows(); ++i) + const IdxT n_rows = component_jacobian->getNumRows(); + for (IdxT i = 0; i < n_rows; ++i) { for (IdxT j = rows[i]; j < rows[i + 1]; ++j) { @@ -831,7 +832,8 @@ namespace GridKit const IdxT* rows = bus_jacobian->getRowData(); const IdxT* columns = bus_jacobian->getColData(); const RealT* values = bus_jacobian->getValues(); - for (IdxT i = 0; i < bus_jacobian->getNumRows(); ++i) + const IdxT n_rows = bus_jacobian->getNumRows(); + for (IdxT i = 0; i < n_rows; ++i) { for (IdxT j = rows[i]; j < rows[i + 1]; ++j) { @@ -896,7 +898,8 @@ namespace GridKit { const IdxT* rows = component_jacobian->getRowData(); const RealT* values = component_jacobian->getValues(); - for (IdxT i = 0; i < component_jacobian->getNumRows(); ++i) + const IdxT n_rows = component_jacobian->getNumRows(); + for (IdxT i = 0; i < n_rows; ++i) { for (IdxT j = rows[i]; j < rows[i + 1]; ++j) { @@ -919,7 +922,8 @@ namespace GridKit { const IdxT* rows = bus_jacobian->getRowData(); const RealT* values = bus_jacobian->getValues(); - for (IdxT i = 0; i < bus_jacobian->getNumRows(); ++i) + const IdxT n_rows = bus_jacobian->getNumRows(); + for (IdxT i = 0; i < n_rows; ++i) { for (IdxT j = rows[i]; j < rows[i + 1]; ++j) { From 5e03014b0052781289f92c8c9b5c825ea711e3af Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 01:15:01 -0400 Subject: [PATCH 30/39] A few more inline. --- GridKit/LinearAlgebra/SparseMatrix/CooMatrix.cpp | 12 ++++++------ GridKit/LinearAlgebra/SparseMatrix/CsrMatrix.cpp | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/GridKit/LinearAlgebra/SparseMatrix/CooMatrix.cpp b/GridKit/LinearAlgebra/SparseMatrix/CooMatrix.cpp index a81ea555c..1522bc9d5 100644 --- a/GridKit/LinearAlgebra/SparseMatrix/CooMatrix.cpp +++ b/GridKit/LinearAlgebra/SparseMatrix/CooMatrix.cpp @@ -356,7 +356,7 @@ namespace GridKit * @return Pointer to CSR row pointer array */ template - IdxT* CooMatrix::getCsrRowData() + inline IdxT* CooMatrix::getCsrRowData() { if (!h_data_updated_) { @@ -441,19 +441,19 @@ namespace GridKit } template - const IdxT* CooMatrix::getMapToSorted() const + inline const IdxT* CooMatrix::getMapToSorted() const { return map_to_sorted_; } template - const IdxT* CooMatrix::getMapToDeduplicated() const + inline const IdxT* CooMatrix::getMapToDeduplicated() const { return map_to_dedup_; } template - IdxT* CooMatrix::getRowData(memory::MemorySpace memspace) + inline IdxT* CooMatrix::getRowData(memory::MemorySpace memspace) { using namespace memory; @@ -469,7 +469,7 @@ namespace GridKit } template - IdxT* CooMatrix::getColData(memory::MemorySpace memspace) + inline IdxT* CooMatrix::getColData(memory::MemorySpace memspace) { using namespace memory; @@ -485,7 +485,7 @@ namespace GridKit } template - RealT* CooMatrix::getValues(memory::MemorySpace memspace) + inline RealT* CooMatrix::getValues(memory::MemorySpace memspace) { using namespace memory; diff --git a/GridKit/LinearAlgebra/SparseMatrix/CsrMatrix.cpp b/GridKit/LinearAlgebra/SparseMatrix/CsrMatrix.cpp index fa37e1965..3a9ad885c 100644 --- a/GridKit/LinearAlgebra/SparseMatrix/CsrMatrix.cpp +++ b/GridKit/LinearAlgebra/SparseMatrix/CsrMatrix.cpp @@ -524,7 +524,7 @@ namespace GridKit } template - IdxT* CsrMatrix::getRowData(memory::MemorySpace memspace) + inline IdxT* CsrMatrix::getRowData(memory::MemorySpace memspace) { using namespace memory; @@ -540,7 +540,7 @@ namespace GridKit } template - IdxT* CsrMatrix::getColData(memory::MemorySpace memspace) + inline IdxT* CsrMatrix::getColData(memory::MemorySpace memspace) { using namespace memory; @@ -556,7 +556,7 @@ namespace GridKit } template - RealT* CsrMatrix::getValues(memory::MemorySpace memspace) + inline RealT* CsrMatrix::getValues(memory::MemorySpace memspace) { using namespace memory; From b87cb8e9bd03853e569cc625f08c0710b7ccab3f Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 02:15:42 -0400 Subject: [PATCH 31/39] Include Definitions.hpp in ExciterSexsPtiTests. --- tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp b/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp index 11638a8b3..64cd5ebd3 100644 --- a/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp +++ b/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp @@ -5,6 +5,7 @@ #include #include +#include #include #include #include From 3199d50721abb80fdc85953499765abffbe7041b Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 04:17:57 -0400 Subject: [PATCH 32/39] Move alpha* down to LowerSparseStorage. --- .../AutomaticDifferentiation/Enzyme/DfDwb.hpp | 2 ++ .../AutomaticDifferentiation/Enzyme/DfDws.hpp | 1 + .../AutomaticDifferentiation/Enzyme/DfDy.hpp | 2 ++ .../AutomaticDifferentiation/Enzyme/DfDyp.hpp | 8 +++++- .../AutomaticDifferentiation/Enzyme/DhDwb.hpp | 1 + .../AutomaticDifferentiation/Enzyme/DhDy.hpp | 1 + .../Enzyme/LowerSparseStorage.hpp | 26 +++++++++++++------ .../LinearAlgebra/SparseMatrix/COO_Matrix.hpp | 6 ++--- .../PhasorDynamics/Branch/BranchEnzyme.cpp | 8 +++--- .../Model/PhasorDynamics/Bus/BusEnzyme.cpp | 2 +- .../BusFault/BusFaultEnzyme.cpp | 6 ++--- .../Exciter/IEEET1/Ieeet1Enzyme.cpp | 9 ++++--- .../Exciter/SEXS-PTI/SexsPtiEnzyme.cpp | 9 ++++--- .../Governor/Tgov1/Tgov1Enzyme.cpp | 7 ++--- .../Model/PhasorDynamics/Load/LoadEnzyme.cpp | 6 ++--- .../PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp | 6 ++--- .../Stabilizer/IEEEST/IeeestEnzyme.cpp | 7 ++--- .../GENROUwS/GenrouEnzyme.cpp | 13 +++++----- .../GENSALwS/GensalEnzyme.cpp | 13 +++++----- .../GenClassical/GenClassicalEnzyme.cpp | 9 ++++--- examples/Enzyme/Standalone/EnzymeSparse.cpp | 1 + 21 files changed, 87 insertions(+), 56 deletions(-) diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp index e147863dc..c746d3453 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp @@ -66,6 +66,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, + 1.0, res_indices, var_indices, rows, @@ -134,6 +135,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, + 1.0, res_indices, var_indices, rows, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp index 5f7922701..bbbf78191 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp @@ -68,6 +68,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, + 1.0, res_indices, var_indices, rows, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp index 55429677c..ec787371f 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp @@ -66,6 +66,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, + 1.0, res_indices, var_indices, rows, @@ -134,6 +135,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, + 1.0, res_indices, var_indices, rows, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp index a722c29dc..2f245da27 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp @@ -17,7 +17,7 @@ namespace GridKit namespace Sparse { /** - * @brief Enzyme automatic differentiation Jacobian evaluator: Internal Jacobian, df/dyp + * @brief Enzyme automatic differentiation Jacobian evaluator: Internal Jacobian, alpha*df/dyp * * @tparam ModelT - model type * @tparam MemberFunctions - member function parameter key @@ -38,6 +38,7 @@ namespace GridKit * @param[in] y - Internal variables * @param[in] yp - Internal variable derivatives * @param[in] wb - Bus variables + * @param[in] alpha - Time derivative jacobian coefficient * @param[out] nnz - Number of nonzeros */ static void eval(ModelT* model, @@ -48,6 +49,7 @@ namespace GridKit ScalarT* y, ScalarT* yp, ScalarT* wb, + RealT alpha, IdxT* rows, IdxT* cols, RealT* vals, @@ -66,6 +68,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, + alpha, res_indices, var_indices, rows, @@ -105,6 +108,7 @@ namespace GridKit * @param[in] yp - Internal variable derivatives * @param[in] wb - Bus variables * @param[in] ws - Signal variables + * @param[in] alpha - Time derivative jacobian coefficient * @param[out] nnz - Number of nonzeros */ static void eval(ModelT* model, @@ -116,6 +120,7 @@ namespace GridKit ScalarT* yp, ScalarT* wb, ScalarT* ws, + RealT alpha, IdxT* rows, IdxT* cols, RealT* vals, @@ -134,6 +139,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, + alpha, res_indices, var_indices, rows, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp index f5ab9a957..2e64df19e 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp @@ -66,6 +66,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, + 1.0, res_indices, var_indices, rows, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp index ce1554ab6..e1a649b9f 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp @@ -66,6 +66,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, + 1.0, res_indices, var_indices, rows, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp b/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp index 4f9cfabe7..d91e67c78 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp @@ -38,6 +38,7 @@ namespace GridKit * @param[in] row - row to be stored * @param[in] col - column to be stored * @param[in] val - value to be stored + * @param[in] scaling - scaling factor for values * @param[in] res_indices - Global residual indices * @param[in] var_indices - Global variable indices * @param[in,out] rows - buffer where row will be stored @@ -49,6 +50,7 @@ namespace GridKit size_t row, size_t col, float val, + float scaling, const size_t* row_indices, const size_t* col_indices, size_t* rows, @@ -62,7 +64,7 @@ namespace GridKit { rows[static_cast(nnz)] = row_mapped; cols[static_cast(nnz)] = col_mapped; - vals[static_cast(nnz)] = val; + vals[static_cast(nnz)] = scaling*val; nnz++; } } @@ -75,6 +77,7 @@ namespace GridKit * @param[in] row - row to be stored * @param[in] col - column to be stored * @param[in] val - value to be stored + * @param[in] scaling - scaling factor for values * @param[in] res_indices - Global residual indices * @param[in] var_indices - Global variable indices * @param[in,out] rows - buffer where row will be stored @@ -86,6 +89,7 @@ namespace GridKit long int row, long int col, float val, + float scaling, const long int* row_indices, const long int* col_indices, long int* rows, @@ -99,7 +103,7 @@ namespace GridKit { rows[static_cast(nnz)] = row_mapped; cols[static_cast(nnz)] = col_mapped; - vals[static_cast(nnz)] = val; + vals[static_cast(nnz)] = scaling*val; nnz++; } } @@ -112,6 +116,7 @@ namespace GridKit * @param[in] row - row to be stored * @param[in] col - column to be stored * @param[in] val - value to be stored + * @param[in] scaling - scaling factor for values * @param[in] res_indices - Global residual indices * @param[in] var_indices - Global variable indices * @param[in,out] rows - buffer where row will be stored @@ -123,6 +128,7 @@ namespace GridKit size_t row, size_t col, double val, + double scaling, const size_t* row_indices, const size_t* col_indices, size_t* rows, @@ -136,7 +142,7 @@ namespace GridKit { rows[static_cast(nnz)] = row_mapped; cols[static_cast(nnz)] = col_mapped; - vals[static_cast(nnz)] = val; + vals[static_cast(nnz)] = scaling*val; nnz++; } } @@ -149,6 +155,7 @@ namespace GridKit * @param[in] row - row to be stored * @param[in] col - column to be stored * @param[in] val - value to be stored + * @param[in] scaling - scaling factor for values * @param[in] res_indices - Global residual indices * @param[in] var_indices - Global variable indices * @param[in,out] rows - buffer where row will be stored @@ -160,6 +167,7 @@ namespace GridKit long int row, long int col, double val, + double scaling, const long int* row_indices, const long int* col_indices, long int* rows, @@ -173,7 +181,7 @@ namespace GridKit { rows[static_cast(nnz)] = row_mapped; cols[static_cast(nnz)] = col_mapped; - vals[static_cast(nnz)] = val; + vals[static_cast(nnz)] = scaling*val; nnz++; } } @@ -189,6 +197,7 @@ namespace GridKit * @param[in] val - value to be stored * @param[in] row - row to be stored * @param[in] col - column to be stored + * @param[in] scaling - scaling factor for values * @param[in] res_indices - Global residual indices * @param[in] var_indices - Global variable indices * @param[in,out] rows - buffer where row will be stored @@ -201,6 +210,7 @@ namespace GridKit ScalarT val, IdxT row, IdxT col, + ScalarT scaling, const IdxT* row_indices, const IdxT* col_indices, IdxT* rows, @@ -217,16 +227,16 @@ namespace GridKit if constexpr (std::is_same::value) { if constexpr (std::is_same::value) - inner_store_float_size_t(row, col, val, row_indices, col_indices, rows, cols, vals, nnz); + inner_store_float_size_t(row, col, val, scaling, row_indices, col_indices, rows, cols, vals, nnz); else - inner_store_double_size_t(row, col, val, row_indices, col_indices, rows, cols, vals, nnz); + inner_store_double_size_t(row, col, val, scaling, row_indices, col_indices, rows, cols, vals, nnz); } else if constexpr (std::is_same::value) { if constexpr (std::is_same::value) - inner_store_float_long_int(row, col, val, row_indices, col_indices, rows, cols, vals, nnz); + inner_store_float_long_int(row, col, val, scaling, row_indices, col_indices, rows, cols, vals, nnz); else - inner_store_double_long_int(row, col, val, row_indices, col_indices, rows, cols, vals, nnz); + inner_store_double_long_int(row, col, val, scaling, row_indices, col_indices, rows, cols, vals, nnz); } else { diff --git a/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp b/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp index 20b0b207d..41bd2bf69 100644 --- a/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp +++ b/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp @@ -43,7 +43,7 @@ namespace GridKit IdxT getNnz() const; // Set values from vector storage - void setValues(RealT alpha, IdxT* r, IdxT* c, RealT* v, IdxT nnz); + void setValues(IdxT* r, IdxT* c, RealT* v, IdxT nnz); // Special matrices (zero and identity) void zeroMatrix(); // null matrix @@ -116,13 +116,13 @@ namespace GridKit * */ template - inline void COO_Matrix::setValues(RealT alpha, IdxT* r, IdxT* c, RealT* v, IdxT nnz) + inline void COO_Matrix::setValues(IdxT* r, IdxT* c, RealT* v, IdxT nnz) { for (size_t i = 0; i < static_cast(nnz); i++) { row_indices_.emplace_back(r[i]); column_indices_.emplace_back(c[i]); - values_.emplace_back(alpha * v[i]); + values_.emplace_back(v[i]); nnz_++; checkIncreaseSize(r[i], c[i]); diff --git a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp index 1974a0f81..9d5238c12 100644 --- a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp @@ -48,7 +48,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; // Bus 2 diagonal Jacobian block owned by the bus @@ -65,7 +65,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; // Off-diagonal Jacobian block (Bus2 variables) owned by the branch @@ -82,7 +82,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; // Off-diagonal Jacobian block (Bus1 variables) owned by the branch @@ -99,7 +99,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; this->constructCsrFromCOO(nnz_dup); diff --git a/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp b/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp index a21e89d80..806e76509 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp @@ -45,7 +45,7 @@ namespace GridKit J_vals_buffer_[1] = 0.0; J_vals_buffer_[2] = 0.0; J_vals_buffer_[3] = 0.0; - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, 4); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, 4); this->constructCsrFromCOO(4); } diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp index 4cae58434..249b8ecd0 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp @@ -48,7 +48,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, @@ -71,7 +71,7 @@ namespace GridKit J_vals_buffer_[2] = 0.0; J_vals_buffer_[3] = 0.0; } - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDy, @@ -87,7 +87,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; this->constructCsrFromCOO(nnz_dup); diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp index af260dd98..be17ed729 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp @@ -52,7 +52,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDyp, @@ -65,11 +65,12 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), + alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, @@ -86,7 +87,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDws, @@ -103,7 +104,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; this->constructCsrFromCOO(nnz_dup); diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp index 153ba2320..eb7938f0f 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp @@ -45,7 +45,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDyp, @@ -58,11 +58,12 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), + alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, @@ -79,7 +80,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDws, @@ -96,7 +97,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; this->constructCsrFromCOO(nnz_dup); diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp index 37e3572c1..86bfda127 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp @@ -52,7 +52,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDyp, @@ -65,11 +65,12 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), + alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDws, @@ -86,7 +87,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; this->constructCsrFromCOO(nnz_dup); diff --git a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp index 00c7936ca..497fb04ce 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp @@ -47,7 +47,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, @@ -63,7 +63,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDy, @@ -79,7 +79,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; this->constructCsrFromCOO(nnz_dup); diff --git a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp index a8aeafa35..8092e3fd0 100644 --- a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp @@ -42,7 +42,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, @@ -58,7 +58,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDy, @@ -74,7 +74,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; this->constructCsrFromCOO(nnz_dup); diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp index de6e366d8..ae267471d 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp @@ -54,7 +54,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDyp, @@ -67,11 +67,12 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), + alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDws, @@ -88,7 +89,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; this->constructCsrFromCOO(nnz_dup); diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp index 9f6dbc8fb..e21c2e50a 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp @@ -50,7 +50,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDyp, @@ -63,11 +63,12 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), + alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, @@ -84,7 +85,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDws, @@ -101,7 +102,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDwb, @@ -117,7 +118,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDy, @@ -133,7 +134,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; this->constructCsrFromCOO(nnz_dup); diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp index dac7aed6f..d63734bff 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp @@ -50,7 +50,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDyp, @@ -63,11 +63,12 @@ namespace GridKit yp_.data(), wb_.data(), ws_.data(), + alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, @@ -84,7 +85,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDws, @@ -101,7 +102,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDwb, @@ -117,7 +118,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDy, @@ -133,7 +134,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; this->constructCsrFromCOO(nnz_dup); diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp index 23a6a73da..4e3a22f7e 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp @@ -49,7 +49,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDyp, @@ -61,11 +61,12 @@ namespace GridKit y_.data(), yp_.data(), wb_.data(), + alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(alpha_, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DfDwb, @@ -81,7 +82,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; GridKit::Enzyme::Sparse::DhDy, @@ -97,7 +98,7 @@ namespace GridKit J_cols_buffer_, J_vals_buffer_, block_nnz); - J_.setValues(1.0, J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); + J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); nnz_dup += block_nnz; this->constructCsrFromCOO(nnz_dup); diff --git a/examples/Enzyme/Standalone/EnzymeSparse.cpp b/examples/Enzyme/Standalone/EnzymeSparse.cpp index 1b42bb635..4f1818c4e 100644 --- a/examples/Enzyme/Standalone/EnzymeSparse.cpp +++ b/examples/Enzyme/Standalone/EnzymeSparse.cpp @@ -84,6 +84,7 @@ __attribute__((noinline)) SparseMatrix* jac_f(size_t N, ScalarT* input) ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, i, + 1.0, index_maps, index_maps, rows_buffer, From 8df04da7372715a3a699efcbecd27a464fe45b3a Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 06:49:06 -0400 Subject: [PATCH 33/39] Fix memory leak. --- GridKit/Model/PhasorDynamics/Bus/BusInfiniteImpl.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/GridKit/Model/PhasorDynamics/Bus/BusInfiniteImpl.hpp b/GridKit/Model/PhasorDynamics/Bus/BusInfiniteImpl.hpp index 010b6ac55..7bb7856fa 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusInfiniteImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusInfiniteImpl.hpp @@ -81,6 +81,11 @@ namespace GridKit template BusInfinite::~BusInfinite() { + if (csr_jac_ != nullptr) + { + delete csr_jac_; + csr_jac_ = nullptr; + } } /** From d4c07d1f95d2badfc08e306caa57e9e0a16d63ac Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 08:36:06 -0400 Subject: [PATCH 34/39] Using CooMatrix is faster than CsrMatrix at the component level. Nuke COO_Matrix class. --- .../AutomaticDifferentiation/Enzyme/DfDwb.hpp | 2 - .../AutomaticDifferentiation/Enzyme/DfDws.hpp | 1 - .../AutomaticDifferentiation/Enzyme/DfDy.hpp | 2 - .../AutomaticDifferentiation/Enzyme/DfDyp.hpp | 2 - .../AutomaticDifferentiation/Enzyme/DhDwb.hpp | 1 - .../AutomaticDifferentiation/Enzyme/DhDy.hpp | 1 - .../Enzyme/LowerSparseStorage.hpp | 8 +- .../LinearAlgebra/SparseMatrix/CMakeLists.txt | 2 +- .../LinearAlgebra/SparseMatrix/COO_Matrix.hpp | 360 ------------------ GridKit/Model/Evaluator.hpp | 2 - .../Model/PhasorDynamics/Branch/Branch.hpp | 1 - .../PhasorDynamics/Branch/BranchEnzyme.cpp | 108 +++--- GridKit/Model/PhasorDynamics/Bus/Bus.hpp | 73 +--- .../Model/PhasorDynamics/Bus/BusEnzyme.cpp | 8 +- GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp | 19 +- .../Model/PhasorDynamics/Bus/BusInfinite.hpp | 5 +- .../PhasorDynamics/Bus/BusInfiniteImpl.hpp | 15 +- GridKit/Model/PhasorDynamics/BusBase.hpp | 9 +- .../PhasorDynamics/BusFault/BusFault.hpp | 1 - .../BusFault/BusFaultEnzyme.cpp | 100 +++-- .../PhasorDynamics/BusFault/BusFaultImpl.hpp | 14 +- GridKit/Model/PhasorDynamics/Component.hpp | 88 ++--- .../PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp | 1 - .../Exciter/IEEET1/Ieeet1Enzyme.cpp | 30 +- .../Exciter/SEXS-PTI/SexsPti.hpp | 1 - .../Exciter/SEXS-PTI/SexsPtiEnzyme.cpp | 28 +- .../PhasorDynamics/Governor/Tgov1/Tgov1.hpp | 1 - .../Governor/Tgov1/Tgov1Enzyme.cpp | 24 +- GridKit/Model/PhasorDynamics/Load/Load.hpp | 1 - .../Model/PhasorDynamics/Load/LoadEnzyme.cpp | 84 ++-- .../Model/PhasorDynamics/LoadZIP/LoadZIP.hpp | 1 - .../PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp | 84 ++-- .../Stabilizer/IEEEST/Ieeest.hpp | 1 - .../Stabilizer/IEEEST/IeeestEnzyme.cpp | 24 +- .../SynchronousMachine/GENROUwS/Genrou.hpp | 1 - .../GENROUwS/GenrouEnzyme.cpp | 38 +- .../SynchronousMachine/GENSALwS/Gensal.hpp | 1 - .../GENSALwS/GensalEnzyme.cpp | 38 +- .../GenClassical/GenClassical.hpp | 1 - .../GenClassical/GenClassicalEnzyme.cpp | 28 +- GridKit/Model/PhasorDynamics/SystemModel.hpp | 1 - .../Model/PhasorDynamics/SystemModelImpl.hpp | 70 ++-- .../PowerElectronics/CircuitComponent.hpp | 1 - .../Model/PowerElectronics/CircuitNode.hpp | 5 +- GridKit/Model/PowerElectronics/NodeBase.hpp | 10 +- .../Model/PowerFlow/ModelEvaluatorImpl.hpp | 6 +- .../PhasorDynamics/BusFaultTests.hpp | 244 ++++++++++++ tests/UnitTests/PhasorDynamics/CMakeLists.txt | 12 + .../PhasorDynamics/ExciterIeeet1Tests.hpp | 1 + .../PhasorDynamics/ExciterSexsPtiTests.hpp | 1 + .../PhasorDynamics/GenClassicalTests.hpp | 1 + .../UnitTests/PhasorDynamics/GenrouTests.hpp | 1 + .../UnitTests/PhasorDynamics/GensalTests.hpp | 12 + .../PhasorDynamics/GovernorTgov1Tests.hpp | 1 + tests/UnitTests/PhasorDynamics/LoadTests.hpp | 4 +- .../UnitTests/PhasorDynamics/LoadZIPTests.hpp | 1 + .../PhasorDynamics/StabilizerIeeestTests.hpp | 2 +- .../PhasorDynamics/runBusFaultTests.cpp | 18 + .../UnitTests/PhasorDynamics/runLoadTests.cpp | 2 +- 59 files changed, 660 insertions(+), 942 deletions(-) delete mode 100644 GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp create mode 100644 tests/UnitTests/PhasorDynamics/BusFaultTests.hpp create mode 100644 tests/UnitTests/PhasorDynamics/runBusFaultTests.cpp diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp index c746d3453..8de8ca03e 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp @@ -53,7 +53,6 @@ namespace GridKit RealT* vals, IdxT& nnz) { - nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); @@ -122,7 +121,6 @@ namespace GridKit RealT* vals, IdxT& nnz) { - nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp index bbbf78191..cb6d40995 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp @@ -55,7 +55,6 @@ namespace GridKit RealT* vals, IdxT& nnz) { - nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp index ec787371f..39c4b4940 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp @@ -53,7 +53,6 @@ namespace GridKit RealT* vals, IdxT& nnz) { - nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); @@ -122,7 +121,6 @@ namespace GridKit RealT* vals, IdxT& nnz) { - nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp index 2f245da27..7fbe730bb 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp @@ -55,7 +55,6 @@ namespace GridKit RealT* vals, IdxT& nnz) { - nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); @@ -126,7 +125,6 @@ namespace GridKit RealT* vals, IdxT& nnz) { - nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp index 2e64df19e..4562d5e4b 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp @@ -53,7 +53,6 @@ namespace GridKit RealT* vals, IdxT& nnz) { - nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp index e1a649b9f..fe3f2b469 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp @@ -53,7 +53,6 @@ namespace GridKit RealT* vals, IdxT& nnz) { - nnz = 0; if (n_res > 0 && n_var > 0) { std::vector elementary_v(n_var); diff --git a/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp b/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp index d91e67c78..6714a28a7 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp @@ -64,7 +64,7 @@ namespace GridKit { rows[static_cast(nnz)] = row_mapped; cols[static_cast(nnz)] = col_mapped; - vals[static_cast(nnz)] = scaling*val; + vals[static_cast(nnz)] = scaling * val; nnz++; } } @@ -103,7 +103,7 @@ namespace GridKit { rows[static_cast(nnz)] = row_mapped; cols[static_cast(nnz)] = col_mapped; - vals[static_cast(nnz)] = scaling*val; + vals[static_cast(nnz)] = scaling * val; nnz++; } } @@ -142,7 +142,7 @@ namespace GridKit { rows[static_cast(nnz)] = row_mapped; cols[static_cast(nnz)] = col_mapped; - vals[static_cast(nnz)] = scaling*val; + vals[static_cast(nnz)] = scaling * val; nnz++; } } @@ -181,7 +181,7 @@ namespace GridKit { rows[static_cast(nnz)] = row_mapped; cols[static_cast(nnz)] = col_mapped; - vals[static_cast(nnz)] = scaling*val; + vals[static_cast(nnz)] = scaling * val; nnz++; } } diff --git a/GridKit/LinearAlgebra/SparseMatrix/CMakeLists.txt b/GridKit/LinearAlgebra/SparseMatrix/CMakeLists.txt index 443baa6fb..c7f5fb4f5 100644 --- a/GridKit/LinearAlgebra/SparseMatrix/CMakeLists.txt +++ b/GridKit/LinearAlgebra/SparseMatrix/CMakeLists.txt @@ -1,4 +1,4 @@ gridkit_add_library( sparse_matrix SOURCES CooMatrix.cpp CsrMatrix.cpp - HEADERS COO_Matrix.hpp CooMatrix.hpp CsrMatrix.hpp) + HEADERS CooMatrix.hpp CsrMatrix.hpp) diff --git a/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp b/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp deleted file mode 100644 index 41bd2bf69..000000000 --- a/GridKit/LinearAlgebra/SparseMatrix/COO_Matrix.hpp +++ /dev/null @@ -1,360 +0,0 @@ -#pragma once - -#include - -#include -#include -#include -#include - -namespace GridKit -{ - namespace LinearAlgebra - { - /** - * @brief Quick class to provide sparse matrices of COO type. - * - * @note This class is deprecated. - * - * m x n sparse matrix - */ - template - class COO_Matrix - { - private: - std::vector values_; - std::vector row_indices_; - std::vector column_indices_; - IdxT rows_size_; - IdxT columns_size_; - IdxT nnz_; - - public: - // Constructors - COO_Matrix(); - ~COO_Matrix(); - - // Accessors - std::vector& getRows(); - std::vector& getColumns(); - std::vector& getValues(); - IdxT getNumRows() const; - IdxT getNumColumns() const; - IdxT getNnz() const; - - // Set values from vector storage - void setValues(IdxT* r, IdxT* c, RealT* v, IdxT nnz); - - // Special matrices (zero and identity) - void zeroMatrix(); // null matrix - - // Sort - void sortSparse(); - - // Deduplicate - void deduplicate(); - - // Print matrix - void print(std::string name = ""); - - private: - bool checkIncreaseSize(IdxT r, IdxT c); - }; - - /** - * @brief Get row indices. - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - * - * @return std::vector - Row indices - */ - template - inline std::vector& COO_Matrix::getRows() - { - return row_indices_; - } - - /** - * @brief Get column indices. - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - * - * @return std::vector - Column indices - */ - template - inline std::vector& COO_Matrix::getColumns() - { - return column_indices_; - } - - /** - * @brief Get matrix values. - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - * - * @return std::vector - Values - */ - template - inline std::vector& COO_Matrix::getValues() - { - return values_; - } - - /** - * @brief Append coordinates and values of the matrix without sorting or deduplicating. - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] r row indices to be stored - * @param[in] c column indices to be stored - * @param[in] v values to be stored - * @param[in] nnz to be stored - * - */ - template - inline void COO_Matrix::setValues(IdxT* r, IdxT* c, RealT* v, IdxT nnz) - { - for (size_t i = 0; i < static_cast(nnz); i++) - { - row_indices_.emplace_back(r[i]); - column_indices_.emplace_back(c[i]); - values_.emplace_back(v[i]); - nnz_++; - - checkIncreaseSize(r[i], c[i]); - } - } - - /** - * @brief Deduplicate matrix entries - * - * @node This is currently only used in component-level Jacobian tests, - * which don't use CooMatrix or CsrMatrix yet, to compare with Dependency::Tracking maps. - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - */ - template - inline void COO_Matrix::deduplicate() - { - std::vector row_temp = row_indices_; - std::vector col_temp = column_indices_; - std::vector val_temp = values_; - - row_indices_.clear(); - column_indices_.clear(); - values_.clear(); - - IdxT nnz = 0; - for (size_t i = 0; i < nnz_; i++) - { - IdxT row = row_temp[i]; - IdxT col = col_temp[i]; - RealT val = val_temp[i]; - bool exists = false; - for (size_t j = 0; j < nnz; j++) - { - if (row_indices_[j] == row && column_indices_[j] == col) - { - values_[j] += val; - exists = true; - } - } - if (!exists) - { - row_indices_.emplace_back(row); - column_indices_.emplace_back(col); - values_.emplace_back(val); - nnz++; - } - } - nnz_ = nnz; - } - - /** - * @brief Turn matrix into the null matrix. Does not actually delete memory - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - * - */ - template - inline void COO_Matrix::zeroMatrix() - { - // resize doesn't affect capacity if smaller - rows_size_ = 0; - columns_size_ = 0; - nnz_ = 0; - column_indices_.resize(0); - row_indices_.resize(0); - values_.resize(0); - } - - /** - * @brief Get the matrix number of rows - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - * - * @param[out] Number of rows - */ - template - inline IdxT COO_Matrix::getNumRows() const - { - return rows_size_; - } - - /** - * @brief Get the matrix number of columns - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - * - * @param[out] Number of columns - */ - template - inline IdxT COO_Matrix::getNumColumns() const - { - return columns_size_; - } - - /** - * @brief Get the matrix number of non zeros, including duplicates - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - * - * @param[out] Number of non zeros - */ - template - inline IdxT COO_Matrix::getNnz() const - { - return nnz_; - } - - /** - * @brief Print matrix in sorted order - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] name to identify the specific matrix printed - */ - template - inline void COO_Matrix::print(std::string name) - { - sortSparse(); - - std::cout << "Sparse COO Matrix: " << name << "\n"; - std::cout << "(x , y, value)\n"; - for (size_t i = 0; i < nnz_; i++) - { - std::cout << "(" << row_indices_[i] - << ", " << column_indices_[i] - << ", " << values_[i] << ")\n"; - } - std::cout << std::flush; - } - - /** - * @brief Check if the size of the matrix needs to be increased - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - * - * @param[in] r row index - * @param[in] c column index - * @return true if size was increased - */ - template - inline bool COO_Matrix::checkIncreaseSize(IdxT r, IdxT c) - { - bool changed = false; - if (r + 1 > rows_size_) - { - rows_size_ = r + 1; - changed = true; - } - if (c + 1 > columns_size_) - { - columns_size_ = c + 1; - changed = true; - } - - return changed; - } - - /** - * @brief Sorts unordered COO matrix - * - * Matrix entries can appear in arbitrary order and will be sorted in - * row-major order before the method returns. - * Duplicate entries are not allowed and should be pre-summed. - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - */ - template - inline void COO_Matrix::sortSparse() - { - // Index based sort - // https://stackoverflow.com/questions/25921706/creating-a-vector-of-indices-of-a-sorted_-vector - // cannot call sort since two arrays are used instead - std::vector permutation(nnz_); - std::size_t n(0); - std::generate(std::begin(permutation), std::end(permutation), [&] - { return n++; }); - - // Sort by row first then column. - std::sort(std::begin(permutation), - std::end(permutation), - [&](auto i1, auto i2) - { return (row_indices_[i1] < row_indices_[i2]) || (row_indices_[i1] == row_indices_[i2] && column_indices_[i1] < column_indices_[i2]); }); - - // reorder based of index-sorting. Only swap cost no extra memory. - // @todo see if extra memory creation is fine - // https://stackoverflow.com/a/22183350 - for (size_t i = 0; i < nnz_; i++) - { - // permutation swap - while (permutation[i] != permutation[permutation[i]]) - { - std::swap(row_indices_[permutation[i]], row_indices_[permutation[permutation[i]]]); - std::swap(column_indices_[permutation[i]], column_indices_[permutation[permutation[i]]]); - std::swap(values_[permutation[i]], values_[permutation[permutation[i]]]); - - // swap orderings - std::swap(permutation[i], permutation[permutation[i]]); - } - } - } - - /** - * @brief Constructor for empty COO Matrix of size 0 - * - * @tparam RealT - Real type for matrix values - * @tparam IdxT - Integer data type for matrix indices - * - * @post empty COO Matrix of size 0 is created - */ - template - inline COO_Matrix::COO_Matrix() - { - rows_size_ = 0; - columns_size_ = 0; - nnz_ = 0; - values_ = std::vector(); - row_indices_ = std::vector(); - column_indices_ = std::vector(); - } - - template - COO_Matrix::~COO_Matrix() - { - } - } // namespace LinearAlgebra -} // namespace GridKit diff --git a/GridKit/Model/Evaluator.hpp b/GridKit/Model/Evaluator.hpp index 37b10fe3d..b7953a277 100644 --- a/GridKit/Model/Evaluator.hpp +++ b/GridKit/Model/Evaluator.hpp @@ -3,7 +3,6 @@ #include #include -#include #include #include #include @@ -24,7 +23,6 @@ namespace GridKit using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename GridKit::ScalarTraits::RealT; - using MatrixT = GridKit::LinearAlgebra::COO_Matrix; //\todo Use CsrMatrix using CsrMatrixT = GridKit::LinearAlgebra::CsrMatrix; using CooMatrixT = GridKit::LinearAlgebra::CooMatrix; diff --git a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp index 84149f8a4..492c92930 100644 --- a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp +++ b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp @@ -51,7 +51,6 @@ namespace GridKit using Component::f_; using Component::wb_; using Component::h_; - using Component::J_; using Component::J_rows_buffer_; using Component::J_cols_buffer_; using Component::J_vals_buffer_; diff --git a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp index 9d5238c12..e7b7af9ba 100644 --- a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp @@ -23,86 +23,76 @@ namespace GridKit Log::misc() << "Evaluate Jacobian for Branch..." << std::endl; Log::misc() << "Jacobian evaluation is experimental!" << std::endl; - J_.zeroMatrix(); if (J_rows_buffer_ == nullptr) { - J_rows_buffer_ = new IdxT[4]; - J_cols_buffer_ = new IdxT[4]; - J_vals_buffer_ = new RealT[4]; + J_rows_buffer_ = new IdxT[16]; + J_cols_buffer_ = new IdxT[16]; + J_vals_buffer_ = new RealT[16]; } - IdxT nnz_dup = 0; - IdxT block_nnz; + nnz_ = 0; // Bus 1 diagonal Jacobian block owned by the bus GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual11>::eval(this, - static_cast(bus1_->size()), - static_cast((bus1_->y()).size()), - (bus1_->getResidualIndices()).data(), - (bus1_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - (bus1_->y()).data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + static_cast(bus1_->size()), + static_cast((bus1_->y()).size()), + (bus1_->getResidualIndices()).data(), + (bus1_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + (bus1_->y()).data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); // Bus 2 diagonal Jacobian block owned by the bus GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual22>::eval(this, - static_cast(bus2_->size()), - static_cast((bus2_->y()).size()), - (bus2_->getResidualIndices()).data(), - (bus2_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - (bus2_->y()).data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + static_cast(bus2_->size()), + static_cast((bus2_->y()).size()), + (bus2_->getResidualIndices()).data(), + (bus2_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + (bus2_->y()).data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); // Off-diagonal Jacobian block (Bus2 variables) owned by the branch GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual12>::eval(this, - static_cast(bus1_->size()), - static_cast((bus2_->y()).size()), - (bus1_->getResidualIndices()).data(), - (bus2_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - (bus2_->y()).data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + static_cast(bus1_->size()), + static_cast((bus2_->y()).size()), + (bus1_->getResidualIndices()).data(), + (bus2_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + (bus2_->y()).data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); // Off-diagonal Jacobian block (Bus1 variables) owned by the branch GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual21>::eval(this, - static_cast(bus2_->size()), - static_cast((bus1_->y()).size()), - (bus2_->getResidualIndices()).data(), - (bus1_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - (bus1_->y()).data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + static_cast(bus2_->size()), + static_cast((bus1_->y()).size()), + (bus2_->getResidualIndices()).data(), + (bus1_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + (bus1_->y()).data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); - this->constructCsrFromCOO(nnz_dup); + this->constructCoo(); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Bus/Bus.hpp b/GridKit/Model/PhasorDynamics/Bus/Bus.hpp index b0d16bf91..13c24c0be 100644 --- a/GridKit/Model/PhasorDynamics/Bus/Bus.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/Bus.hpp @@ -24,19 +24,16 @@ namespace GridKit using BusBase::y_; using BusBase::yp_; using BusBase::f_; - using BusBase::J_; using BusBase::tag_; using BusBase::variable_indices_; using BusBase::residual_indices_; - using BusBase::csr_jac_; + using BusBase::coo_jac_; using BusBase::monitor_; public: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename BusBase::RealT; - using MatrixT = typename BusBase::MatrixT; - using CsrMatrixT = typename BusBase::CsrMatrixT; using CooMatrixT = typename BusBase::CooMatrixT; using MonitorT = typename BusBase::MonitorT; using ModelDataT = BusData; @@ -100,67 +97,33 @@ namespace GridKit } protected: - int constructCsrFromCOO(const IdxT nnz_dup) + int constructCoo() { - if (csr_jac_ == nullptr) + if (coo_jac_ == nullptr) { - rows_dup_ = new IdxT[static_cast(nnz_dup)]; - cols_dup_ = new IdxT[static_cast(nnz_dup)]; - vals_dup_ = new RealT[static_cast(nnz_dup)]; - - std::copy((J_.getRows()).data(), (J_.getRows()).data() + nnz_dup, rows_dup_); - std::copy((J_.getColumns()).data(), (J_.getColumns()).data() + nnz_dup, cols_dup_); - std::copy((J_.getValues()).data(), (J_.getValues()).data() + nnz_dup, vals_dup_); - - CooMatrixT tmp_coo_jac(J_.getNumRows(), J_.getNumColumns(), nnz_dup); - tmp_coo_jac.setDataPointers(rows_dup_, cols_dup_, vals_dup_, LinearAlgebra::memory::HOST); - - IdxT* row_ptrs = tmp_coo_jac.getCsrRowData(); - - nnz_ = tmp_coo_jac.getNnz(); - - IdxT* cols = new IdxT[static_cast(nnz_)]; - RealT* vals = new RealT[static_cast(nnz_)]; - - std::copy(tmp_coo_jac.getColData(), tmp_coo_jac.getColData() + nnz_, cols); - std::copy(tmp_coo_jac.getValues(), tmp_coo_jac.getValues() + nnz_, vals); - - csr_jac_ = new CsrMatrixT(tmp_coo_jac.getNumRows(), tmp_coo_jac.getNumColumns(), nnz_, &row_ptrs, &cols, &vals); - - const IdxT* map_to_sorted = tmp_coo_jac.getMapToSorted(); - const IdxT* map_to_dedup = tmp_coo_jac.getMapToDeduplicated(); - - map_to_csr_ = new IdxT[static_cast(nnz_dup)]; - for (IdxT i = 0; i < nnz_dup; ++i) - { - map_to_csr_[map_to_sorted[i]] = map_to_dedup[static_cast(i)]; - } - } - else - { - RealT* vals = csr_jac_->getValues(); + IdxT num_rows = 0; + IdxT num_cols = 0; for (IdxT i = 0; i < nnz_; ++i) { - vals[i] = 0.0; - } - - auto values = J_.getValues(); - for (IdxT i = 0; i < nnz_dup; ++i) - { - vals[map_to_csr_[i]] += values[static_cast(i)]; + if (J_rows_buffer_[i] > num_rows) + { + num_rows = J_rows_buffer_[i]; + } + if (J_cols_buffer_[i] > num_cols) + { + num_cols = J_cols_buffer_[i]; + } } + coo_jac_ = new CooMatrixT(num_rows, num_cols, nnz_); + coo_jac_->setDataPointers(J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, LinearAlgebra::memory::HOST); } return 0; } - IdxT* rows_dup_{nullptr}; - IdxT* cols_dup_{nullptr}; - RealT* vals_dup_{nullptr}; - IdxT* J_rows_buffer_{nullptr}; - IdxT* J_cols_buffer_{nullptr}; - RealT* J_vals_buffer_{nullptr}; - IdxT* map_to_csr_{nullptr}; + IdxT* J_rows_buffer_{nullptr}; + IdxT* J_cols_buffer_{nullptr}; + RealT* J_vals_buffer_{nullptr}; private: ScalarT Vr0_{0.0}; diff --git a/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp b/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp index 806e76509..4af2d5a35 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusEnzyme.cpp @@ -11,7 +11,7 @@ namespace GridKit namespace PhasorDynamics { /** - * @brief Jacobian evaluation experimental. + * @brief Jacobian evaluation experimental. * * This sets values to 0, and these remain unchanged. It is needed to get * the indices into the list of entries that will later be deduplicated. @@ -27,8 +27,6 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - J_.zeroMatrix(); - J_rows_buffer_ = new IdxT[4]; J_cols_buffer_ = new IdxT[4]; J_vals_buffer_ = new RealT[4]; @@ -45,9 +43,9 @@ namespace GridKit J_vals_buffer_[1] = 0.0; J_vals_buffer_[2] = 0.0; J_vals_buffer_[3] = 0.0; - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, 4); - this->constructCsrFromCOO(4); + nnz_ = 4; + this->constructCoo(); } return 0; } diff --git a/GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp b/GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp index 1d7bcb8f5..05a3f7808 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusImpl.hpp @@ -91,25 +91,12 @@ namespace GridKit J_rows_buffer_ = nullptr; J_cols_buffer_ = nullptr; J_vals_buffer_ = nullptr; - - delete[] rows_dup_; - delete[] cols_dup_; - delete[] vals_dup_; - rows_dup_ = nullptr; - cols_dup_ = nullptr; - vals_dup_ = nullptr; - } - - if (csr_jac_ != nullptr) - { - delete csr_jac_; - csr_jac_ = nullptr; } - if (map_to_csr_ != nullptr) + if (coo_jac_ != nullptr) { - delete[] map_to_csr_; - map_to_csr_ = nullptr; + delete coo_jac_; + coo_jac_ = nullptr; } } diff --git a/GridKit/Model/PhasorDynamics/Bus/BusInfinite.hpp b/GridKit/Model/PhasorDynamics/Bus/BusInfinite.hpp index 1ebaddc50..3abec94ff 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusInfinite.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusInfinite.hpp @@ -22,17 +22,16 @@ namespace GridKit using BusBase::y_; using BusBase::yp_; using BusBase::f_; - using BusBase::J_; using BusBase::variable_indices_; using BusBase::residual_indices_; - using BusBase::csr_jac_; + using BusBase::coo_jac_; using BusBase::monitor_; public: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename BusBase::RealT; - using CsrMatrixT = typename BusBase::CsrMatrixT; + using CooMatrixT = typename BusBase::CooMatrixT; using MonitorT = typename BusBase::MonitorT; using ModelDataT = BusData; using BusTypeT = typename BusData::BusType; diff --git a/GridKit/Model/PhasorDynamics/Bus/BusInfiniteImpl.hpp b/GridKit/Model/PhasorDynamics/Bus/BusInfiniteImpl.hpp index 7bb7856fa..1f3a151b8 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusInfiniteImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusInfiniteImpl.hpp @@ -81,10 +81,10 @@ namespace GridKit template BusInfinite::~BusInfinite() { - if (csr_jac_ != nullptr) + if (coo_jac_ != nullptr) { - delete csr_jac_; - csr_jac_ = nullptr; + delete coo_jac_; + coo_jac_ = nullptr; } } @@ -153,13 +153,10 @@ namespace GridKit template int BusInfinite::evaluateJacobian() { - if (csr_jac_ == nullptr) + if (coo_jac_ == nullptr) { - J_.zeroMatrix(); - - nnz_ = 0; - - csr_jac_ = new CsrMatrixT(0, 0, 0); + nnz_ = 0; + coo_jac_ = new CooMatrixT(0, 0, 0); } return 0; } diff --git a/GridKit/Model/PhasorDynamics/BusBase.hpp b/GridKit/Model/PhasorDynamics/BusBase.hpp index f7904dcf4..05d8fcd3b 100644 --- a/GridKit/Model/PhasorDynamics/BusBase.hpp +++ b/GridKit/Model/PhasorDynamics/BusBase.hpp @@ -30,8 +30,8 @@ namespace GridKit using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Model::Evaluator::RealT; - using MatrixT = typename Model::Evaluator::MatrixT; using CsrMatrixT = typename Model::Evaluator::CsrMatrixT; + using CooMatrixT = typename Model::Evaluator::CooMatrixT; using BusTypeT = typename BusData::BusType; using MonitorT = Model::VariableMonitor; @@ -148,6 +148,11 @@ namespace GridKit return csr_jac_; } + CooMatrixT* getCooJacobian() const + { + return coo_jac_; + } + bool hasJacobian() override { return true; @@ -190,8 +195,8 @@ namespace GridKit std::vector f_; std::vector g_; - MatrixT J_; CsrMatrixT* csr_jac_{nullptr}; + CooMatrixT* coo_jac_{nullptr}; RealT rel_tol_; RealT abs_tol_; diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp b/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp index 3f023eed7..62c169581 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp @@ -34,7 +34,6 @@ namespace GridKit using Component::wb_; using Component::h_; using Component::f_; - using Component::J_; using Component::J_rows_buffer_; using Component::J_cols_buffer_; using Component::J_vals_buffer_; diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp index 249b8ecd0..733170dc1 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp @@ -23,74 +23,66 @@ namespace GridKit Log::misc() << "Evaluate Jacobian for BusFault..." << std::endl; Log::misc() << "Jacobian evaluation is experimental!" << std::endl; - J_.zeroMatrix(); - if (J_rows_buffer_ == nullptr) { - J_rows_buffer_ = new IdxT[4]; - J_cols_buffer_ = new IdxT[4]; - J_vals_buffer_ = new RealT[4]; + J_rows_buffer_ = new IdxT[12]; + J_cols_buffer_ = new IdxT[12]; + J_vals_buffer_ = new RealT[12]; } - IdxT nnz_dup = 0; - IdxT block_nnz; + nnz_ = 0; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; - + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); + + IdxT nnz_tmp = nnz_; GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, - f_.size(), - static_cast(bus_->size()), - (this->getResidualIndices()).data(), - (bus_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - (bus_->y()).data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - block_nnz); - if (!status_) // Value contributions only when status_ + f_.size(), + static_cast(bus_->size()), + (this->getResidualIndices()).data(), + (bus_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + (bus_->y()).data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); + if (!status_) // Value contributions from DfDwb only when status_ { - J_vals_buffer_[0] = 0.0; - J_vals_buffer_[1] = 0.0; - J_vals_buffer_[2] = 0.0; - J_vals_buffer_[3] = 0.0; + for (IdxT i = nnz_tmp; i < nnz_; ++i) + { + J_vals_buffer_[i] = 0.0; + } } - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; - + GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, - static_cast(bus_->size()), - y_.size(), - (bus_->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + static_cast(bus_->size()), + y_.size(), + (bus_->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); - this->constructCsrFromCOO(nnz_dup); + this->constructCoo(); return 0; } diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp b/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp index 471641c1b..2521a9d34 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp @@ -147,9 +147,9 @@ namespace GridKit ScalarT vi = Vi(); ScalarT ir = -(vr * G_ - vi * B_); ScalarT ii = -(vr * B_ + vi * G_); - y_[0] = ir; - y_[1] = ii; - } + y_[0] = ir; + y_[1] = ii; + } else { y_[0] = 0.0; @@ -199,10 +199,10 @@ namespace GridKit */ template __attribute__((always_inline)) int BusFault::evaluateInternalResidual( - ScalarT* y, - [[maybe_unused]] ScalarT* yp, - ScalarT* wb, - ScalarT* f) + ScalarT* y, + [[maybe_unused]] ScalarT* yp, + ScalarT* wb, + ScalarT* f) { ScalarT Vr = wb[0]; ScalarT Vi = wb[1]; diff --git a/GridKit/Model/PhasorDynamics/Component.hpp b/GridKit/Model/PhasorDynamics/Component.hpp index a7f2cd84c..8557dc4c8 100644 --- a/GridKit/Model/PhasorDynamics/Component.hpp +++ b/GridKit/Model/PhasorDynamics/Component.hpp @@ -24,7 +24,6 @@ namespace GridKit using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Model::Evaluator::RealT; - using MatrixT = typename Model::Evaluator::MatrixT; using CsrMatrixT = typename Model::Evaluator::CsrMatrixT; using CooMatrixT = typename Model::Evaluator::CooMatrixT; @@ -40,12 +39,12 @@ namespace GridKit J_rows_buffer_ = nullptr; J_cols_buffer_ = nullptr; J_vals_buffer_ = nullptr; - delete[] rows_dup_; - delete[] cols_dup_; - delete[] vals_dup_; - rows_dup_ = nullptr; - cols_dup_ = nullptr; - vals_dup_ = nullptr; + } + + if (coo_jac_ != nullptr) + { + delete coo_jac_; + coo_jac_ = nullptr; } if (csr_jac_ != nullptr) @@ -161,6 +160,11 @@ namespace GridKit return csr_jac_; } + CooMatrixT* getCooJacobian() const + { + return coo_jac_; + } + /// @todo Remove this method. It should be part of DynamicSolver class. bool hasJacobian() override { @@ -192,56 +196,51 @@ namespace GridKit return gridkit_component_id_; } - protected: - int constructCsrFromCOO(const IdxT nnz_dup) + int constructCsr() { - if (csr_jac_ == nullptr) + if (coo_jac_ == nullptr) { - rows_dup_ = new IdxT[static_cast(nnz_dup)]; - cols_dup_ = new IdxT[static_cast(nnz_dup)]; - vals_dup_ = new RealT[static_cast(nnz_dup)]; - - std::copy((J_.getRows()).data(), (J_.getRows()).data() + nnz_dup, rows_dup_); - std::copy((J_.getColumns()).data(), (J_.getColumns()).data() + nnz_dup, cols_dup_); - std::copy((J_.getValues()).data(), (J_.getValues()).data() + nnz_dup, vals_dup_); - - CooMatrixT tmp_coo_jac(J_.getNumRows(), J_.getNumColumns(), nnz_dup); - tmp_coo_jac.setDataPointers(rows_dup_, cols_dup_, vals_dup_, LinearAlgebra::memory::HOST); + constructCoo(); + } - IdxT* row_ptrs = tmp_coo_jac.getCsrRowData(); + if (csr_jac_ == nullptr) + { + IdxT* row_ptrs = coo_jac_->getCsrRowData(); - nnz_ = tmp_coo_jac.getNnz(); + nnz_ = coo_jac_->getNnz(); IdxT* cols = new IdxT[static_cast(nnz_)]; RealT* vals = new RealT[static_cast(nnz_)]; - std::copy(tmp_coo_jac.getColData(), tmp_coo_jac.getColData() + nnz_, cols); - std::copy(tmp_coo_jac.getValues(), tmp_coo_jac.getValues() + nnz_, vals); + std::copy(coo_jac_->getColData(), coo_jac_->getColData() + nnz_, cols); + std::copy(coo_jac_->getValues(), coo_jac_->getValues() + nnz_, vals); - csr_jac_ = new CsrMatrixT(tmp_coo_jac.getNumRows(), tmp_coo_jac.getNumColumns(), nnz_, &row_ptrs, &cols, &vals); + csr_jac_ = new CsrMatrixT(coo_jac_->getNumRows(), coo_jac_->getNumColumns(), nnz_, &row_ptrs, &cols, &vals); + } - const IdxT* map_to_sorted = tmp_coo_jac.getMapToSorted(); - const IdxT* map_to_dedup = tmp_coo_jac.getMapToDeduplicated(); + return 0; + } - map_to_csr_ = new IdxT[static_cast(nnz_dup)]; - for (IdxT i = 0; i < nnz_dup; ++i) - { - map_to_csr_[map_to_sorted[i]] = map_to_dedup[static_cast(i)]; - } - } - else + protected: + int constructCoo() + { + if (coo_jac_ == nullptr) { - RealT* vals = csr_jac_->getValues(); + IdxT num_rows = 0; + IdxT num_cols = 0; for (IdxT i = 0; i < nnz_; ++i) { - vals[i] = 0.0; - } - - auto values = J_.getValues(); - for (IdxT i = 0; i < nnz_dup; ++i) - { - vals[map_to_csr_[i]] += values[static_cast(i)]; + if (J_rows_buffer_[i] + 1 > num_rows) + { + num_rows = J_rows_buffer_[i] + 1; + } + if (J_cols_buffer_[i] + 1 > num_cols) + { + num_cols = J_cols_buffer_[i] + 1; + } } + coo_jac_ = new CooMatrixT(num_rows, num_cols, nnz_); + coo_jac_->setDataPointers(J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, LinearAlgebra::memory::HOST); } return 0; @@ -260,15 +259,12 @@ namespace GridKit std::vector f_; std::vector g_; - MatrixT J_; - IdxT* rows_dup_{nullptr}; - IdxT* cols_dup_{nullptr}; - RealT* vals_dup_{nullptr}; IdxT* J_rows_buffer_{nullptr}; IdxT* J_cols_buffer_{nullptr}; RealT* J_vals_buffer_{nullptr}; IdxT* map_to_csr_{nullptr}; CsrMatrixT* csr_jac_{nullptr}; + CooMatrixT* coo_jac_{nullptr}; RealT rel_tol_; RealT abs_tol_; diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp index add41ad66..f0b93e343 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp @@ -77,7 +77,6 @@ namespace GridKit using Component::y_; using Component::yp_; using Component::wb_; - using Component::J_; using Component::J_rows_buffer_; using Component::J_cols_buffer_; using Component::J_vals_buffer_; diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp index be17ed729..422f7289d 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp @@ -25,19 +25,17 @@ namespace GridKit Log::misc() << "Evaluate Jacobian for Ieeet1..." << std::endl; Log::misc() << "Jacobian evaluation is experimental!" << std::endl; - J_.zeroMatrix(); if (J_rows_buffer_ == nullptr) { // Reserve space for a dense matrix of size_*size_. // Enyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; - J_cols_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; - J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; + J_rows_buffer_ = new IdxT[static_cast(4*size_) * static_cast(4*size_)]; + J_cols_buffer_ = new IdxT[static_cast(4*size_) * static_cast(4*size_)]; + J_vals_buffer_ = new RealT[static_cast(4*size_) * static_cast(4*size_)]; } - - IdxT nnz_dup = 0; - IdxT block_nnz; + nnz_ = 0; + GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), @@ -51,9 +49,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -69,9 +65,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -86,9 +80,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -103,11 +95,9 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); - this->constructCsrFromCOO(nnz_dup); + this->constructCoo(); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp index 56f5667d0..5406b89a1 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp @@ -64,7 +64,6 @@ namespace GridKit using Component::y_; using Component::yp_; using Component::wb_; - using Component::J_; using Component::J_rows_buffer_; using Component::J_cols_buffer_; using Component::J_vals_buffer_; diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp index eb7938f0f..ae29c23bc 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp @@ -20,16 +20,14 @@ namespace GridKit Log::misc() << "Evaluate Jacobian for SexsPti..." << std::endl; Log::misc() << "Jacobian evaluation is experimental!" << std::endl; - J_.zeroMatrix(); if (J_rows_buffer_ == nullptr) { - J_rows_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; - J_cols_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; - J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; + J_rows_buffer_ = new IdxT[static_cast(4*size_) * static_cast(4*size_)]; + J_cols_buffer_ = new IdxT[static_cast(4*size_) * static_cast(4*size_)]; + J_vals_buffer_ = new RealT[static_cast(4*size_) * static_cast(4*size_)]; } - IdxT nnz_dup = 0; - IdxT block_nnz; + nnz_ = 0; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -44,9 +42,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -62,9 +58,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -79,9 +73,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -96,11 +88,9 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); - this->constructCsrFromCOO(nnz_dup); + this->constructCoo(); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp index f8ceb7207..a919be9cd 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp @@ -69,7 +69,6 @@ namespace GridKit using Component::yp_; using Component::wb_; using Component::h_; - using Component::J_; using Component::J_rows_buffer_; using Component::J_cols_buffer_; using Component::J_vals_buffer_; diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp index 86bfda127..97be05fa8 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp @@ -25,18 +25,16 @@ namespace GridKit Log::misc() << "Evaluate Jacobian for Tgov1..." << std::endl; Log::misc() << "Jacobian evaluation is experimental!" << std::endl; - J_.zeroMatrix(); if (J_rows_buffer_ == nullptr) { // Reserve space for a dense matrix of size_*size_. // Enyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; - J_cols_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; - J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; + J_rows_buffer_ = new IdxT[static_cast(3*size_) * static_cast(3*size_)]; + J_cols_buffer_ = new IdxT[static_cast(3*size_) * static_cast(3*size_)]; + J_vals_buffer_ = new RealT[static_cast(3*size_) * static_cast(3*size_)]; } - IdxT nnz_dup = 0; - IdxT block_nnz; + nnz_ = 0; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -51,9 +49,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -69,9 +65,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -86,11 +80,9 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); - this->constructCsrFromCOO(nnz_dup); + this->constructCoo(); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Load/Load.hpp b/GridKit/Model/PhasorDynamics/Load/Load.hpp index 21442f1c4..e21bc8500 100644 --- a/GridKit/Model/PhasorDynamics/Load/Load.hpp +++ b/GridKit/Model/PhasorDynamics/Load/Load.hpp @@ -40,7 +40,6 @@ namespace GridKit using Component::wb_; using Component::h_; using Component::f_; - using Component::J_; using Component::J_rows_buffer_; using Component::J_cols_buffer_; using Component::J_vals_buffer_; diff --git a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp index 497fb04ce..c9fe9619a 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp @@ -23,66 +23,58 @@ namespace GridKit Log::misc() << "Evaluate Jacobian for Load..." << std::endl; Log::misc() << "Jacobian evaluation is experimental!" << std::endl; - J_.zeroMatrix(); if (J_rows_buffer_ == nullptr) { - J_rows_buffer_ = new IdxT[4]; - J_cols_buffer_ = new IdxT[4]; - J_vals_buffer_ = new RealT[4]; + J_rows_buffer_ = new IdxT[8]; + J_cols_buffer_ = new IdxT[8]; + J_vals_buffer_ = new RealT[8]; } - IdxT nnz_dup = 0; - IdxT block_nnz; + nnz_ = 0; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, - f_.size(), - static_cast(bus_->size()), - (this->getResidualIndices()).data(), - (bus_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - (bus_->y()).data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + f_.size(), + static_cast(bus_->size()), + (this->getResidualIndices()).data(), + (bus_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + (bus_->y()).data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, - static_cast(bus_->size()), - y_.size(), - (bus_->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + static_cast(bus_->size()), + y_.size(), + (bus_->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); - this->constructCsrFromCOO(nnz_dup); + this->constructCoo(); return 0; } diff --git a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIP.hpp b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIP.hpp index ebe3a9be2..8b0f0adbf 100644 --- a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIP.hpp +++ b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIP.hpp @@ -40,7 +40,6 @@ namespace GridKit using Component::wb_; using Component::h_; using Component::f_; - using Component::J_; using Component::J_rows_buffer_; using Component::J_cols_buffer_; using Component::J_vals_buffer_; diff --git a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp index 8092e3fd0..13e8be20d 100644 --- a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp @@ -18,66 +18,58 @@ namespace GridKit Log::misc() << "Evaluate Jacobian for LoadZIP..." << std::endl; Log::misc() << "Jacobian evaluation is experimental!" << std::endl; - J_.zeroMatrix(); if (J_rows_buffer_ == nullptr) { - J_rows_buffer_ = new IdxT[4]; - J_cols_buffer_ = new IdxT[4]; - J_vals_buffer_ = new RealT[4]; + J_rows_buffer_ = new IdxT[8]; + J_cols_buffer_ = new IdxT[8]; + J_vals_buffer_ = new RealT[8]; } - IdxT nnz_dup = 0; - IdxT block_nnz; + nnz_ = 0; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, - f_.size(), - static_cast(bus_->size()), - (this->getResidualIndices()).data(), - (bus_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - (bus_->y()).data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + f_.size(), + static_cast(bus_->size()), + (this->getResidualIndices()).data(), + (bus_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + (bus_->y()).data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, - static_cast(bus_->size()), - y_.size(), - (bus_->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + static_cast(bus_->size()), + y_.size(), + (bus_->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); - this->constructCsrFromCOO(nnz_dup); + this->constructCoo(); return 0; } diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp index 486f1820b..09051d7af 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp @@ -71,7 +71,6 @@ namespace GridKit using Component::yp_; using Component::wb_; using Component::h_; - using Component::J_; using Component::J_rows_buffer_; using Component::J_cols_buffer_; using Component::J_vals_buffer_; diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp index ae267471d..03d8f1c68 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp @@ -27,18 +27,16 @@ namespace GridKit Log::misc() << "Evaluate Jacobian for Ieeest..." << std::endl; Log::misc() << "Jacobian evaluation is experimental!" << std::endl; - J_.zeroMatrix(); if (J_rows_buffer_ == nullptr) { // Reserve space for a dense matrix of size_*size_. // Enzyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; - J_cols_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; - J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; + J_rows_buffer_ = new IdxT[static_cast(3*size_) * static_cast(3*size_)]; + J_cols_buffer_ = new IdxT[static_cast(3*size_) * static_cast(3*size_)]; + J_vals_buffer_ = new RealT[static_cast(3*size_) * static_cast(3*size_)]; } - IdxT nnz_dup = 0; - IdxT block_nnz; + nnz_ = 0; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -53,9 +51,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -71,9 +67,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -88,11 +82,9 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); - this->constructCsrFromCOO(nnz_dup); + this->constructCoo(); return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp index 73b6f764d..0703c3b22 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp @@ -80,7 +80,6 @@ namespace GridKit using Component::yp_; using Component::wb_; using Component::h_; - using Component::J_; using Component::J_rows_buffer_; using Component::J_cols_buffer_; using Component::J_vals_buffer_; diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp index e21c2e50a..2bc54e5cd 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp @@ -23,18 +23,16 @@ namespace GridKit Log::misc() << "Evaluate Jacobian for Genrou..." << std::endl; Log::misc() << "Jacobian evaluation is experimental!" << std::endl; - J_.zeroMatrix(); if (J_rows_buffer_ == nullptr) { // Reserve space for a dense matrix of size_*size_. // Enyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; - J_cols_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; - J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; + J_rows_buffer_ = new IdxT[static_cast(6*size_) * static_cast(6*size_)]; + J_cols_buffer_ = new IdxT[static_cast(6*size_) * static_cast(6*size_)]; + J_vals_buffer_ = new RealT[static_cast(6*size_) * static_cast(6*size_)]; } - IdxT nnz_dup = 0; - IdxT block_nnz; + nnz_ = 0; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -49,9 +47,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -67,9 +63,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -84,9 +78,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -101,9 +93,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -117,9 +107,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -133,11 +121,9 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; - - this->constructCsrFromCOO(nnz_dup); + nnz_); + + this->constructCoo(); return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/Gensal.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/Gensal.hpp index 8e00fc2e8..d9f90d2be 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/Gensal.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/Gensal.hpp @@ -75,7 +75,6 @@ namespace GridKit using Component::yp_; using Component::wb_; using Component::h_; - using Component::J_; using Component::J_rows_buffer_; using Component::J_cols_buffer_; using Component::J_vals_buffer_; diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp index d63734bff..a82acab11 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp @@ -23,19 +23,17 @@ namespace GridKit Log::misc() << "Evaluate Jacobian for Gensal..." << std::endl; Log::misc() << "Jacobian evaluation is experimental!" << std::endl; - J_.zeroMatrix(); if (J_rows_buffer_ == nullptr) { // Reserve space for a dense matrix of size_*size_. // Enzyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; - J_cols_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; - J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; + J_rows_buffer_ = new IdxT[static_cast(6*size_) * static_cast(6*size_)]; + J_cols_buffer_ = new IdxT[static_cast(6*size_) * static_cast(6*size_)]; + J_vals_buffer_ = new RealT[static_cast(6*size_) * static_cast(6*size_)]; } - - IdxT nnz_dup = 0; - IdxT block_nnz; + nnz_ = 0; + GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, f_.size(), @@ -49,9 +47,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -67,9 +63,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -84,9 +78,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, @@ -101,9 +93,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -117,9 +107,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -133,11 +121,9 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); - this->constructCsrFromCOO(nnz_dup); + this->constructCoo(); return 0; } diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp index a2696fc0d..301a6621b 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp @@ -44,7 +44,6 @@ namespace GridKit using Component::yp_; using Component::wb_; using Component::h_; - using Component::J_; using Component::J_rows_buffer_; using Component::J_cols_buffer_; using Component::J_vals_buffer_; diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp index 4e3a22f7e..2493da102 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp @@ -23,18 +23,16 @@ namespace GridKit Log::misc() << "Evaluate Jacobian for GenClassical..." << std::endl; Log::misc() << "Jacobian evaluation is experimental!" << std::endl; - J_.zeroMatrix(); if (J_rows_buffer_ == nullptr) { // Reserve space for a dense matrix of size_*size_. // Enyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; - J_cols_buffer_ = new IdxT[static_cast(size_) * static_cast(size_)]; - J_vals_buffer_ = new RealT[static_cast(size_) * static_cast(size_)]; + J_rows_buffer_ = new IdxT[static_cast(4*size_) * static_cast(4*size_)]; + J_cols_buffer_ = new IdxT[static_cast(4*size_) * static_cast(4*size_)]; + J_vals_buffer_ = new RealT[static_cast(4*size_) * static_cast(4*size_)]; } - IdxT nnz_dup = 0; - IdxT block_nnz; + nnz_ = 0; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -48,9 +46,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -65,9 +61,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, @@ -81,9 +75,7 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, @@ -97,11 +89,9 @@ namespace GridKit J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, - block_nnz); - J_.setValues( J_rows_buffer_, J_cols_buffer_, J_vals_buffer_, block_nnz); - nnz_dup += block_nnz; + nnz_); - this->constructCsrFromCOO(nnz_dup); + this->constructCoo(); return 0; } diff --git a/GridKit/Model/PhasorDynamics/SystemModel.hpp b/GridKit/Model/PhasorDynamics/SystemModel.hpp index 404ef8932..a9f0528d9 100644 --- a/GridKit/Model/PhasorDynamics/SystemModel.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModel.hpp @@ -50,7 +50,6 @@ namespace GridKit using Component::yp_; using Component::tag_; using Component::f_; - using Component::J_; using Component::rel_tol_; using Component::abs_tol_; using Component::variable_indices_; diff --git a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp index 8a8397f95..5b68f8353 100644 --- a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp @@ -764,7 +764,7 @@ namespace GridKit IdxT nnz_dup = 0; for (const auto& component : components_) { - auto component_jacobian = component->getCsrJacobian(); + auto component_jacobian = component->getCooJacobian(); if (component_jacobian != nullptr) { @@ -778,7 +778,7 @@ namespace GridKit for (const auto& bus : buses_) { - auto bus_jacobian = bus->getCsrJacobian(); + auto bus_jacobian = bus->getCooJacobian(); if (bus_jacobian != nullptr) { @@ -798,23 +798,19 @@ namespace GridKit IdxT counter = 0; for (const auto& component : components_) { - auto component_jacobian = component->getCsrJacobian(); + auto component_jacobian = component->getCooJacobian(); if (component_jacobian != nullptr) { const IdxT* rows = component_jacobian->getRowData(); const IdxT* columns = component_jacobian->getColData(); const RealT* values = component_jacobian->getValues(); - const IdxT n_rows = component_jacobian->getNumRows(); - for (IdxT i = 0; i < n_rows; ++i) + for (IdxT i = 0; i < component_jacobian->getNnz(); ++i) { - for (IdxT j = rows[i]; j < rows[i + 1]; ++j) - { - rows_dup[counter] = i; - cols_dup[counter] = columns[j]; - vals_dup[counter] = values[j]; - counter++; - } + rows_dup[counter] = rows[i]; + cols_dup[counter] = columns[i]; + vals_dup[counter] = values[i]; + counter++; } } else @@ -825,23 +821,19 @@ namespace GridKit for (const auto& bus : buses_) { - auto bus_jacobian = bus->getCsrJacobian(); + auto bus_jacobian = bus->getCooJacobian(); if (bus_jacobian != nullptr) { const IdxT* rows = bus_jacobian->getRowData(); const IdxT* columns = bus_jacobian->getColData(); const RealT* values = bus_jacobian->getValues(); - const IdxT n_rows = bus_jacobian->getNumRows(); - for (IdxT i = 0; i < n_rows; ++i) + for (IdxT i = 0; i < bus_jacobian->getNnz(); ++i) { - for (IdxT j = rows[i]; j < rows[i + 1]; ++j) - { - rows_dup[counter] = i; - cols_dup[counter] = columns[j]; - vals_dup[counter] = values[j]; - counter++; - } + rows_dup[counter] = rows[i]; + cols_dup[counter] = columns[i]; + vals_dup[counter] = values[i]; + counter++; } } else @@ -892,20 +884,15 @@ namespace GridKit IdxT counter = 0; for (const auto& component : components_) { - auto component_jacobian = component->getCsrJacobian(); + auto component_jacobian = component->getCooJacobian(); if (component_jacobian != nullptr) { - const IdxT* rows = component_jacobian->getRowData(); - const RealT* values = component_jacobian->getValues(); - const IdxT n_rows = component_jacobian->getNumRows(); - for (IdxT i = 0; i < n_rows; ++i) + const RealT* values = component_jacobian->getValues(); + for (IdxT i = 0; i < component_jacobian->getNnz(); ++i) { - for (IdxT j = rows[i]; j < rows[i + 1]; ++j) - { - vals[map_to_csr_[counter]] += values[j]; - ++counter; - } + vals[map_to_csr_[counter]] += values[i]; + counter++; } } else @@ -916,20 +903,15 @@ namespace GridKit for (const auto& bus : buses_) { - auto bus_jacobian = bus->getCsrJacobian(); + auto bus_jacobian = bus->getCooJacobian(); if (bus_jacobian != nullptr) { - const IdxT* rows = bus_jacobian->getRowData(); - const RealT* values = bus_jacobian->getValues(); - const IdxT n_rows = bus_jacobian->getNumRows(); - for (IdxT i = 0; i < n_rows; ++i) + const RealT* values = bus_jacobian->getValues(); + for (IdxT i = 0; i < bus_jacobian->getNnz(); ++i) { - for (IdxT j = rows[i]; j < rows[i + 1]; ++j) - { - vals[map_to_csr_[counter]] += values[j]; - ++counter; - } + vals[map_to_csr_[counter]] += values[i]; + counter++; } } else @@ -939,8 +921,8 @@ namespace GridKit } } - // std::cout << "System Jacobian\n"; - // csr_jac_->print(std::cout); + //std::cout << "System Jacobian\n"; + //csr_jac_->print(std::cout); return 0; } diff --git a/GridKit/Model/PowerElectronics/CircuitComponent.hpp b/GridKit/Model/PowerElectronics/CircuitComponent.hpp index f4562e00d..017713b3b 100644 --- a/GridKit/Model/PowerElectronics/CircuitComponent.hpp +++ b/GridKit/Model/PowerElectronics/CircuitComponent.hpp @@ -19,7 +19,6 @@ namespace GridKit { public: using RealT = typename Model::Evaluator::RealT; - using MatrixT = typename Model::Evaluator::MatrixT; using CsrMatrixT = typename Model::Evaluator::CsrMatrixT; CircuitComponent() = default; diff --git a/GridKit/Model/PowerElectronics/CircuitNode.hpp b/GridKit/Model/PowerElectronics/CircuitNode.hpp index 648941444..197ec9cf2 100644 --- a/GridKit/Model/PowerElectronics/CircuitNode.hpp +++ b/GridKit/Model/PowerElectronics/CircuitNode.hpp @@ -15,8 +15,7 @@ namespace GridKit template class CircuitNode : public Model::Evaluator { - using RealT = typename Model::Evaluator::RealT; - using MatrixT = typename Model::Evaluator::MatrixT; + using RealT = typename Model::Evaluator::RealT; public: CircuitNode() @@ -165,8 +164,6 @@ namespace GridKit std::vector tag_; std::vector f_; - MatrixT J_; - std::vector g_{}; std::vector param_{}; std::vector param_up_{}; diff --git a/GridKit/Model/PowerElectronics/NodeBase.hpp b/GridKit/Model/PowerElectronics/NodeBase.hpp index 3183b5a37..612916ea8 100644 --- a/GridKit/Model/PowerElectronics/NodeBase.hpp +++ b/GridKit/Model/PowerElectronics/NodeBase.hpp @@ -12,8 +12,7 @@ namespace GridKit class NodeBase : public Model::Evaluator { public: - using RealT = typename Model::Evaluator::RealT; - using MatrixT = typename Model::Evaluator::MatrixT; + using RealT = typename Model::Evaluator::RealT; NodeBase(size_t n_intern, size_t n_extern) : n_intern_(n_intern), n_extern_(n_extern) @@ -181,10 +180,9 @@ namespace GridKit std::vector tag_; std::vector f_; - MatrixT J_; - IdxT* J_rows_buffer_{nullptr}; - IdxT* J_cols_buffer_{nullptr}; - RealT* J_vals_buffer_{nullptr}; + IdxT* J_rows_buffer_{nullptr}; + IdxT* J_cols_buffer_{nullptr}; + RealT* J_vals_buffer_{nullptr}; RealT rtol_; RealT atol_; diff --git a/GridKit/Model/PowerFlow/ModelEvaluatorImpl.hpp b/GridKit/Model/PowerFlow/ModelEvaluatorImpl.hpp index 9b4d8853f..66f31d7a6 100644 --- a/GridKit/Model/PowerFlow/ModelEvaluatorImpl.hpp +++ b/GridKit/Model/PowerFlow/ModelEvaluatorImpl.hpp @@ -16,8 +16,7 @@ namespace GridKit class ModelEvaluatorImpl : public Model::Evaluator { public: - using RealT = typename Model::Evaluator::RealT; - using MatrixT = typename Model::Evaluator::MatrixT; + using RealT = typename Model::Evaluator::RealT; ModelEvaluatorImpl() : size_(0), @@ -38,7 +37,6 @@ namespace GridKit ypB_(static_cast(size_)), fB_(static_cast(size_)), gB_(static_cast(size_opt_)), - jac_(MatrixT()), param_(static_cast(size_opt_)), param_up_(static_cast(size_opt_)), param_lo_(static_cast(size_opt_)) @@ -231,8 +229,6 @@ namespace GridKit std::vector fB_; std::vector gB_; - MatrixT jac_; - std::vector param_; std::vector param_up_; std::vector param_lo_; diff --git a/tests/UnitTests/PhasorDynamics/BusFaultTests.hpp b/tests/UnitTests/PhasorDynamics/BusFaultTests.hpp new file mode 100644 index 000000000..3e5ea1083 --- /dev/null +++ b/tests/UnitTests/PhasorDynamics/BusFaultTests.hpp @@ -0,0 +1,244 @@ +#pragma once + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace GridKit +{ + namespace Testing + { + + template + class BusFaultTests + { + private: + using RealT = typename PhasorDynamics::Component::RealT; + + public: + BusFaultTests() = default; + ~BusFaultTests() = default; + + TestOutcome constructor() + { + TestStatus success = true; + + auto* bus = new PhasorDynamics::Bus(1.0, 0.0); + + PhasorDynamics::Component* fault = + new PhasorDynamics::BusFault(bus); + + success *= (fault != nullptr); + + if (fault) + { + delete fault; + } + delete bus; + + return success.report(__func__); + } + + /** + * Verifies the residual evaluates to zero for the initial conditions + */ + TestOutcome zeroInitialResidual(bool status = false) + { + TestStatus success = true; + + ScalarT Vr1{1.0}; ///< Bus real voltage + ScalarT Vi1{1.0}; ///< Bus imaginary voltage + + PhasorDynamics::Bus bus(Vr1, Vi1); + PhasorDynamics::BusFault fault(&bus, 0.0, 1e-3, status); + bus.allocate(); + bus.initialize(); + fault.allocate(); + fault.initialize(); + fault.evaluateResidual(); + std::vector res = fault.getResidual(); + + for (size_t i = 0; i < res.size(); ++i) + { + if (!isEqual(res[i], 0.0)) + { + std::cout << "Incorrect result: " + << fault.yp()[i] << " != 0\n"; + success = false; + break; + } + } + + return success.report(__func__); + } + +#ifdef GRIDKIT_ENABLE_ENZYME + /** + * A test case to verify Jacobian values + */ + TestOutcome jacobian(bool status = false) + { + TestStatus success = true; + + RealT R = 0.0; + RealT X = 1e-3; + + // Jacobian via DependencyTracking + auto dependency_tracking_jacobian = DependencyTrackingJacobian(R, X, status); + + // Jacobian via Enzyme + auto enzyme_jacobian = EnzymeJacobian(R, X, status); + + /// Compare DependencyTracking dependencies to Enzyme's + for (size_t i = 0; i < dependency_tracking_jacobian.size(); ++i) + { + success *= (GridKit::Testing::isEqual(dependency_tracking_jacobian[i], enzyme_jacobian[i])); + } + + return success.report(__func__); + } + + private: + std::vector DependencyTrackingJacobian( + const RealT R, const RealT X, const bool status) + { + DependencyTracking::Variable Vr1{1.0}; ///< Bus-1 real voltage + DependencyTracking::Variable Vi1{1.0}; ///< Bus-1 imaginary voltage + + PhasorDynamics::Bus bus(Vr1, Vi1); + PhasorDynamics::BusFault fault(&bus, R, X, status); + + bus.allocate(); + fault.allocate(); + + // Get d/dy + bus.initialize(); + fault.initialize(); + + for (size_t i = 0; i < fault.size(); ++i) + { + fault.y()[i].setVariableNumber(i); ///< fault independent variables + } + for (size_t i = 0; i < bus.size(); ++i) + { + bus.y()[i].setVariableNumber(i + fault.size()); // Bus independent variables + } + + bus.evaluateResidual(); + fault.evaluateResidual(); ///< Computes the residual and the Jacobian values by tracking + ///< the dependencies + std::vector residual_y = fault.getResidual(); + + // Get d/dy' + bus.initialize(); + fault.initialize(); + + for (size_t i = 0; i < fault.size(); ++i) + { + fault.yp()[i].setVariableNumber(i); ///< fault independent variables + } + + bus.evaluateResidual(); + fault.evaluateResidual(); ///< Computes the residual and the Jacobian values by tracking + ///< the dependencies + std::vector residual_yp = fault.getResidual(); + + // Print the dependencies + for (size_t i = 0; i < residual_y.size(); ++i) + { + std::cout << i << "th residual, y: "; + (residual_y[i]).print(std::cout); + std::cout << "\n"; + std::cout << i << "th residual, yp: "; + (residual_yp[i]).print(std::cout); + std::cout << "\n"; + } + + // Extract the dependencies and add d/dy' to d/dy + std::vector dependencies(residual_y.size()); + for (IdxT i = 0; i < residual_y.size(); ++i) + { + DependencyTracking::Variable::DependencyMap dependency_y = (residual_y[i]).getDependencies(); + DependencyTracking::Variable::DependencyMap dependency_yp = (residual_yp[i]).getDependencies(); + + for (const auto& pair_y : dependency_y) + { + auto index_y = pair_y.first; + auto value_y = pair_y.second; + auto it_yp = dependency_yp.find(index_y); + if (it_yp != dependency_yp.end()) + { + auto value_yp = it_yp->second; + dependencies[i].insert(std::make_pair(index_y, value_y + value_yp)); + } + else + { + dependencies[i].insert(std::make_pair(index_y, value_y)); + } + } + + // Insert yp dependencies that did not exist in the y dependencies + for (const auto& pair_yp : dependency_yp) + { + auto index_yp = pair_yp.first; + auto value_yp = pair_yp.second; + auto it_y = dependency_y.find(index_yp); + if (it_y == dependency_y.end()) + { + dependencies[i].insert(std::make_pair(index_yp, value_yp)); + } + } + } + + return dependencies; + } + + std::vector EnzymeJacobian( + const RealT R, const RealT X, const bool status) + { + ScalarT Vr1{1.0}; ///< Bus-1 real voltage + ScalarT Vi1{1.0}; ///< Bus-1 imaginary voltage + + PhasorDynamics::Bus bus(Vr1, Vi1); + PhasorDynamics::BusFault fault(&bus, R, X, status); + + bus.allocate(); + fault.allocate(); + + bus.initialize(); + fault.initialize(); + + fault.updateTime(0.0, 1.0); + + for (size_t i = 0; i < bus.size(); ++i) + { + bus.setVariableIndex(i, i + fault.size()); // Reset bus variable indices + bus.setResidualIndex(i, i + fault.size()); // Reset bus residual indices + } + + bus.evaluateResidual(); + fault.evaluateResidual(); + + bus.evaluateJacobian(); + fault.evaluateJacobian(); + fault.constructCsr(); + GridKit::LinearAlgebra::CsrMatrix* model_jacobian = fault.getCsrJacobian(); + std::cout << "Sparse Csr Matrix: BusFault Jacobian\n"; + model_jacobian->print(); + + return GridKit::Testing::MapFromCsr(model_jacobian); + } +#endif + + }; // class BusFaultTests + + } // namespace Testing +} // namespace GridKit diff --git a/tests/UnitTests/PhasorDynamics/CMakeLists.txt b/tests/UnitTests/PhasorDynamics/CMakeLists.txt index bac53ec7b..15fde1d52 100644 --- a/tests/UnitTests/PhasorDynamics/CMakeLists.txt +++ b/tests/UnitTests/PhasorDynamics/CMakeLists.txt @@ -7,6 +7,16 @@ add_executable(test_phasor_bus runBusTests.cpp) target_link_libraries( test_phasor_bus GridKit::phasor_dynamics_bus GridKit::testing) +add_executable(test_phasor_bus_fault runBusFaultTests.cpp) +target_link_libraries( + test_phasor_bus_fault + GridKit::definitions + GridKit::phasor_dynamics_bus_fault + GridKit::phasor_dynamics_bus_fault_dependency_tracking + GridKit::phasor_dynamics_bus + GridKit::phasor_dynamics_bus_dependency_tracking + GridKit::testing) + add_executable(test_phasor_bustosignaladapter runBusToSignalAdapterTests.cpp) target_link_libraries( test_phasor_bustosignaladapter @@ -131,6 +141,7 @@ target_link_libraries( GridKit::testing) add_test(NAME PhasorDynamicsBusTest COMMAND test_phasor_bus) +add_test(NAME PhasorDynamicsBusFaultTest COMMAND test_phasor_bus_fault) add_test(NAME PhasorDynamicsBusToSignalAdapterTest COMMAND test_phasor_bustosignaladapter) add_test(NAME PhasorDynamicsBranchTest COMMAND test_phasor_branch) add_test(NAME PhasorDynamicsGenrouTest COMMAND test_phasor_genrou) @@ -150,6 +161,7 @@ add_test(NAME PhasorDynamicsSystemSingleComponentTest COMMAND test_phasor_system install( TARGETS test_phasor_bus + test_phasor_bus_fault test_phasor_bustosignaladapter test_phasor_branch test_phasor_load diff --git a/tests/UnitTests/PhasorDynamics/ExciterIeeet1Tests.hpp b/tests/UnitTests/PhasorDynamics/ExciterIeeet1Tests.hpp index 6719546c9..fa440b3b4 100644 --- a/tests/UnitTests/PhasorDynamics/ExciterIeeet1Tests.hpp +++ b/tests/UnitTests/PhasorDynamics/ExciterIeeet1Tests.hpp @@ -220,6 +220,7 @@ namespace GridKit bus.evaluateJacobian(); exciter.evaluateJacobian(); + exciter.constructCsr(); GridKit::LinearAlgebra::CsrMatrix* model_jacobian = exciter.getCsrJacobian(); std::cout << "Sparse Csr Matrix: Ieeet1 Jacobian\n"; model_jacobian->print(); diff --git a/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp b/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp index 64cd5ebd3..d6e2d7369 100644 --- a/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp +++ b/tests/UnitTests/PhasorDynamics/ExciterSexsPtiTests.hpp @@ -437,6 +437,7 @@ namespace GridKit bus.evaluateJacobian(); exciter.evaluateJacobian(); + exciter.constructCsr(); GridKit::LinearAlgebra::CsrMatrix* model_jacobian = exciter.getCsrJacobian(); std::cout << "Sparse Csr Matrix: SexsPti Jacobian\n"; model_jacobian->print(); diff --git a/tests/UnitTests/PhasorDynamics/GenClassicalTests.hpp b/tests/UnitTests/PhasorDynamics/GenClassicalTests.hpp index 00e22c3e4..73b9cd3dc 100644 --- a/tests/UnitTests/PhasorDynamics/GenClassicalTests.hpp +++ b/tests/UnitTests/PhasorDynamics/GenClassicalTests.hpp @@ -445,6 +445,7 @@ namespace GridKit bus.evaluateJacobian(); gen.evaluateJacobian(); + gen.constructCsr(); GridKit::LinearAlgebra::CsrMatrix* model_jacobian = gen.getCsrJacobian(); std::cout << "Sparse Csr Matrix: GenClassical Jacobian\n"; model_jacobian->print(); diff --git a/tests/UnitTests/PhasorDynamics/GenrouTests.hpp b/tests/UnitTests/PhasorDynamics/GenrouTests.hpp index 382928df7..84a888b7c 100644 --- a/tests/UnitTests/PhasorDynamics/GenrouTests.hpp +++ b/tests/UnitTests/PhasorDynamics/GenrouTests.hpp @@ -486,6 +486,7 @@ namespace GridKit bus.evaluateJacobian(); gen.evaluateJacobian(); + gen.constructCsr(); GridKit::LinearAlgebra::CsrMatrix* model_jacobian = gen.getCsrJacobian(); std::cout << "Sparse Csr Matrix: Genrou Jacobian\n"; model_jacobian->print(); diff --git a/tests/UnitTests/PhasorDynamics/GensalTests.hpp b/tests/UnitTests/PhasorDynamics/GensalTests.hpp index 23776ebd3..a4b3982d8 100644 --- a/tests/UnitTests/PhasorDynamics/GensalTests.hpp +++ b/tests/UnitTests/PhasorDynamics/GensalTests.hpp @@ -384,6 +384,17 @@ namespace GridKit gen.evaluateResidual(); std::vector residual_yp = gen.getResidual(); + // Print the dependencies + for (size_t i = 0; i < residual_y.size(); ++i) + { + std::cout << i << "th residual, y: "; + (residual_y[i]).print(std::cout); + std::cout << "\n"; + std::cout << i << "th residual, yp: "; + (residual_yp[i]).print(std::cout); + std::cout << "\n"; + } + std::vector dependencies(residual_y.size()); for (IdxT i = 0; i < residual_y.size(); ++i) { @@ -448,6 +459,7 @@ namespace GridKit bus.evaluateJacobian(); gen.evaluateJacobian(); + gen.constructCsr(); GridKit::LinearAlgebra::CsrMatrix* model_jacobian = gen.getCsrJacobian(); std::cout << "Sparse Csr Matrix: Gensal Jacobian\n"; model_jacobian->print(); diff --git a/tests/UnitTests/PhasorDynamics/GovernorTgov1Tests.hpp b/tests/UnitTests/PhasorDynamics/GovernorTgov1Tests.hpp index f6e2bfd97..2e4004975 100644 --- a/tests/UnitTests/PhasorDynamics/GovernorTgov1Tests.hpp +++ b/tests/UnitTests/PhasorDynamics/GovernorTgov1Tests.hpp @@ -416,6 +416,7 @@ namespace GridKit gov.evaluateResidual(); gov.evaluateJacobian(); + gov.constructCsr(); GridKit::LinearAlgebra::CsrMatrix* model_jacobian = gov.getCsrJacobian(); std::cout << "Sparse Csr Matrix: Tgov1 Jacobian\n"; model_jacobian->print(); diff --git a/tests/UnitTests/PhasorDynamics/LoadTests.hpp b/tests/UnitTests/PhasorDynamics/LoadTests.hpp index 23ddf66e4..7229d48fa 100644 --- a/tests/UnitTests/PhasorDynamics/LoadTests.hpp +++ b/tests/UnitTests/PhasorDynamics/LoadTests.hpp @@ -123,7 +123,7 @@ namespace GridKit } #ifdef GRIDKIT_ENABLE_ENZYME - TestOutcome enzyme_jacobian() + TestOutcome enzymeJacobian() { TestStatus success = true; @@ -150,7 +150,7 @@ namespace GridKit bus.evaluateJacobian(); load.evaluateJacobian(); - + load.constructCsr(); GridKit::LinearAlgebra::CsrMatrix* model_jacobian = load.getCsrJacobian(); std::cout << "Sparse Csr Matrix: Load Jacobian\n"; model_jacobian->print(); diff --git a/tests/UnitTests/PhasorDynamics/LoadZIPTests.hpp b/tests/UnitTests/PhasorDynamics/LoadZIPTests.hpp index c367de346..1c374c04c 100644 --- a/tests/UnitTests/PhasorDynamics/LoadZIPTests.hpp +++ b/tests/UnitTests/PhasorDynamics/LoadZIPTests.hpp @@ -237,6 +237,7 @@ namespace GridKit bus.evaluateJacobian(); load.evaluateJacobian(); + load.constructCsr(); GridKit::LinearAlgebra::CsrMatrix* model_jacobian = load.getCsrJacobian(); std::cout << "Sparse Csr Matrix: LoadZIP Jacobian\n"; model_jacobian->print(); diff --git a/tests/UnitTests/PhasorDynamics/StabilizerIeeestTests.hpp b/tests/UnitTests/PhasorDynamics/StabilizerIeeestTests.hpp index 942f52e6f..15b64876f 100644 --- a/tests/UnitTests/PhasorDynamics/StabilizerIeeestTests.hpp +++ b/tests/UnitTests/PhasorDynamics/StabilizerIeeestTests.hpp @@ -307,7 +307,7 @@ namespace GridKit stab.evaluateResidual(); stab.evaluateJacobian(); - + stab.constructCsr(); auto model_jacobian = stab.getCsrJacobian(); std::cout << "Sparse Csr Matrix: Ieeest Jacobian\n"; model_jacobian->print(); diff --git a/tests/UnitTests/PhasorDynamics/runBusFaultTests.cpp b/tests/UnitTests/PhasorDynamics/runBusFaultTests.cpp new file mode 100644 index 000000000..5a3688fc5 --- /dev/null +++ b/tests/UnitTests/PhasorDynamics/runBusFaultTests.cpp @@ -0,0 +1,18 @@ +#include "BusFaultTests.hpp" + +int main() +{ + using namespace GridKit; + using namespace GridKit::Testing; + + GridKit::Testing::TestingResults result; + GridKit::Testing::BusFaultTests test; + + result += test.constructor(); + result += test.zeroInitialResidual(true); +#ifdef GRIDKIT_ENABLE_ENZYME + result += test.jacobian(true); +#endif + + return result.summary(); +} diff --git a/tests/UnitTests/PhasorDynamics/runLoadTests.cpp b/tests/UnitTests/PhasorDynamics/runLoadTests.cpp index 1dac30e27..e020a530e 100644 --- a/tests/UnitTests/PhasorDynamics/runLoadTests.cpp +++ b/tests/UnitTests/PhasorDynamics/runLoadTests.cpp @@ -12,7 +12,7 @@ int main() result += test.residual(); result += test.jacobian(); #ifdef GRIDKIT_ENABLE_ENZYME - result += test.enzyme_jacobian(); + result += test.enzymeJacobian(); #endif return result.summary(); From 9f1a9e33e476dcecf03550deaea7c00cd3342a61 Mon Sep 17 00:00:00 2001 From: nkoukpaizan Date: Thu, 11 Jun 2026 12:59:26 +0000 Subject: [PATCH 35/39] Apply pre-commit fixes --- .../Exciter/IEEET1/Ieeet1Enzyme.cpp | 106 ++++++------- .../Exciter/SEXS-PTI/SexsPtiEnzyme.cpp | 106 ++++++------- .../Governor/Tgov1/Tgov1Enzyme.cpp | 80 +++++----- .../Stabilizer/IEEEST/IeeestEnzyme.cpp | 80 +++++----- .../GENROUwS/GenrouEnzyme.cpp | 148 ++++++++--------- .../GENSALwS/GensalEnzyme.cpp | 150 +++++++++--------- .../GenClassical/GenClassicalEnzyme.cpp | 96 +++++------ .../Model/PhasorDynamics/SystemModelImpl.hpp | 4 +- 8 files changed, 385 insertions(+), 385 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp index 422f7289d..33b8f0409 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp @@ -29,73 +29,73 @@ namespace GridKit { // Reserve space for a dense matrix of size_*size_. // Enyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(4*size_) * static_cast(4*size_)]; - J_cols_buffer_ = new IdxT[static_cast(4*size_) * static_cast(4*size_)]; - J_vals_buffer_ = new RealT[static_cast(4*size_) * static_cast(4*size_)]; + J_rows_buffer_ = new IdxT[static_cast(4 * size_) * static_cast(4 * size_)]; + J_cols_buffer_ = new IdxT[static_cast(4 * size_) * static_cast(4 * size_)]; + J_vals_buffer_ = new RealT[static_cast(4 * size_) * static_cast(4 * size_)]; } nnz_ = 0; - + GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - alpha_, - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + alpha_, + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - static_cast(bus_->size()), - (this->getResidualIndices()).data(), - (bus_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - (bus_->y()).data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + static_cast(bus_->size()), + (this->getResidualIndices()).data(), + (bus_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + (bus_->y()).data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - ws_.size(), - (this->getResidualIndices()).data(), - ws_indices_.data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + ws_.size(), + (this->getResidualIndices()).data(), + ws_indices_.data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); this->constructCoo(); diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp index ae29c23bc..72c788399 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp @@ -22,73 +22,73 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - J_rows_buffer_ = new IdxT[static_cast(4*size_) * static_cast(4*size_)]; - J_cols_buffer_ = new IdxT[static_cast(4*size_) * static_cast(4*size_)]; - J_vals_buffer_ = new RealT[static_cast(4*size_) * static_cast(4*size_)]; + J_rows_buffer_ = new IdxT[static_cast(4 * size_) * static_cast(4 * size_)]; + J_cols_buffer_ = new IdxT[static_cast(4 * size_) * static_cast(4 * size_)]; + J_vals_buffer_ = new RealT[static_cast(4 * size_) * static_cast(4 * size_)]; } nnz_ = 0; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDyp, - GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - alpha_, - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + alpha_, + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - static_cast(bus_->size()), - (this->getResidualIndices()).data(), - (bus_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - (bus_->y()).data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + static_cast(bus_->size()), + (this->getResidualIndices()).data(), + (bus_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + (bus_->y()).data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - ws_.size(), - (this->getResidualIndices()).data(), - ws_indices_.data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + ws_.size(), + (this->getResidualIndices()).data(), + ws_indices_.data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); this->constructCoo(); diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp index 97be05fa8..4acdbd8b8 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp @@ -29,58 +29,58 @@ namespace GridKit { // Reserve space for a dense matrix of size_*size_. // Enyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(3*size_) * static_cast(3*size_)]; - J_cols_buffer_ = new IdxT[static_cast(3*size_) * static_cast(3*size_)]; - J_vals_buffer_ = new RealT[static_cast(3*size_) * static_cast(3*size_)]; + J_rows_buffer_ = new IdxT[static_cast(3 * size_) * static_cast(3 * size_)]; + J_cols_buffer_ = new IdxT[static_cast(3 * size_) * static_cast(3 * size_)]; + J_vals_buffer_ = new RealT[static_cast(3 * size_) * static_cast(3 * size_)]; } nnz_ = 0; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - alpha_, - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + alpha_, + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - ws_.size(), - (this->getResidualIndices()).data(), - ws_indices_.data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + ws_.size(), + (this->getResidualIndices()).data(), + ws_indices_.data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); this->constructCoo(); diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp index 03d8f1c68..7717d36bf 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp @@ -31,58 +31,58 @@ namespace GridKit { // Reserve space for a dense matrix of size_*size_. // Enzyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(3*size_) * static_cast(3*size_)]; - J_cols_buffer_ = new IdxT[static_cast(3*size_) * static_cast(3*size_)]; - J_vals_buffer_ = new RealT[static_cast(3*size_) * static_cast(3*size_)]; + J_rows_buffer_ = new IdxT[static_cast(3 * size_) * static_cast(3 * size_)]; + J_cols_buffer_ = new IdxT[static_cast(3 * size_) * static_cast(3 * size_)]; + J_vals_buffer_ = new RealT[static_cast(3 * size_) * static_cast(3 * size_)]; } nnz_ = 0; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - alpha_, - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + alpha_, + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - ws_.size(), - (this->getResidualIndices()).data(), - ws_indices_.data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + ws_.size(), + (this->getResidualIndices()).data(), + ws_indices_.data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); this->constructCoo(); diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp index 2bc54e5cd..459632cb4 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp @@ -27,101 +27,101 @@ namespace GridKit { // Reserve space for a dense matrix of size_*size_. // Enyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(6*size_) * static_cast(6*size_)]; - J_cols_buffer_ = new IdxT[static_cast(6*size_) * static_cast(6*size_)]; - J_vals_buffer_ = new RealT[static_cast(6*size_) * static_cast(6*size_)]; + J_rows_buffer_ = new IdxT[static_cast(6 * size_) * static_cast(6 * size_)]; + J_cols_buffer_ = new IdxT[static_cast(6 * size_) * static_cast(6 * size_)]; + J_vals_buffer_ = new RealT[static_cast(6 * size_) * static_cast(6 * size_)]; } nnz_ = 0; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - alpha_, - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + alpha_, + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - static_cast(bus_->size()), - (this->getResidualIndices()).data(), - (bus_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + static_cast(bus_->size()), + (this->getResidualIndices()).data(), + (bus_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - ws_.size(), - (this->getResidualIndices()).data(), - ws_indices_.data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + ws_.size(), + (this->getResidualIndices()).data(), + ws_indices_.data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, - static_cast(bus_->size()), - static_cast(bus_->size()), - (bus_->getResidualIndices()).data(), - (bus_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - (bus_->y()).data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + static_cast(bus_->size()), + static_cast(bus_->size()), + (bus_->getResidualIndices()).data(), + (bus_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + (bus_->y()).data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, - static_cast(bus_->size()), - y_.size(), - (bus_->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + static_cast(bus_->size()), + y_.size(), + (bus_->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); this->constructCoo(); diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp index a82acab11..d34fb48fc 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp @@ -27,101 +27,101 @@ namespace GridKit { // Reserve space for a dense matrix of size_*size_. // Enzyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(6*size_) * static_cast(6*size_)]; - J_cols_buffer_ = new IdxT[static_cast(6*size_) * static_cast(6*size_)]; - J_vals_buffer_ = new RealT[static_cast(6*size_) * static_cast(6*size_)]; + J_rows_buffer_ = new IdxT[static_cast(6 * size_) * static_cast(6 * size_)]; + J_cols_buffer_ = new IdxT[static_cast(6 * size_) * static_cast(6 * size_)]; + J_vals_buffer_ = new RealT[static_cast(6 * size_) * static_cast(6 * size_)]; } nnz_ = 0; - + GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - alpha_, - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + alpha_, + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - static_cast(bus_->size()), - (this->getResidualIndices()).data(), - (bus_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + static_cast(bus_->size()), + (this->getResidualIndices()).data(), + (bus_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDws, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidualWithSignal>::eval(this, - f_.size(), - ws_.size(), - (this->getResidualIndices()).data(), - ws_indices_.data(), - y_.data(), - yp_.data(), - wb_.data(), - ws_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + ws_.size(), + (this->getResidualIndices()).data(), + ws_indices_.data(), + y_.data(), + yp_.data(), + wb_.data(), + ws_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DhDwb, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, - static_cast(bus_->size()), - static_cast(bus_->size()), - (bus_->getResidualIndices()).data(), - (bus_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - (bus_->y()).data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + static_cast(bus_->size()), + static_cast(bus_->size()), + (bus_->getResidualIndices()).data(), + (bus_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + (bus_->y()).data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, - static_cast(bus_->size()), - y_.size(), - (bus_->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + static_cast(bus_->size()), + y_.size(), + (bus_->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); this->constructCoo(); diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp index 2493da102..88829ace5 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp @@ -27,69 +27,69 @@ namespace GridKit { // Reserve space for a dense matrix of size_*size_. // Enyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(4*size_) * static_cast(4*size_)]; - J_cols_buffer_ = new IdxT[static_cast(4*size_) * static_cast(4*size_)]; - J_vals_buffer_ = new RealT[static_cast(4*size_) * static_cast(4*size_)]; + J_rows_buffer_ = new IdxT[static_cast(4 * size_) * static_cast(4 * size_)]; + J_cols_buffer_ = new IdxT[static_cast(4 * size_) * static_cast(4 * size_)]; + J_vals_buffer_ = new RealT[static_cast(4 * size_) * static_cast(4 * size_)]; } nnz_ = 0; GridKit::Enzyme::Sparse::DfDy, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDyp, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, - f_.size(), - y_.size(), - (this->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - alpha_, - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + y_.size(), + (this->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + alpha_, + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DfDwb, GridKit::Enzyme::Sparse::MemberFunctions::InternalResidual>::eval(this, - f_.size(), - static_cast(bus_->size()), - (this->getResidualIndices()).data(), - (bus_->getVariableIndices()).data(), - y_.data(), - yp_.data(), - (bus_->y()).data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + f_.size(), + static_cast(bus_->size()), + (this->getResidualIndices()).data(), + (bus_->getVariableIndices()).data(), + y_.data(), + yp_.data(), + (bus_->y()).data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); GridKit::Enzyme::Sparse::DhDy, GridKit::Enzyme::Sparse::MemberFunctions::BusResidual>::eval(this, - static_cast(bus_->size()), - y_.size(), - (bus_->getResidualIndices()).data(), - (this->getVariableIndices()).data(), - y_.data(), - yp_.data(), - wb_.data(), - J_rows_buffer_, - J_cols_buffer_, - J_vals_buffer_, - nnz_); + static_cast(bus_->size()), + y_.size(), + (bus_->getResidualIndices()).data(), + (this->getVariableIndices()).data(), + y_.data(), + yp_.data(), + wb_.data(), + J_rows_buffer_, + J_cols_buffer_, + J_vals_buffer_, + nnz_); this->constructCoo(); diff --git a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp index 5b68f8353..6761422e2 100644 --- a/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModelImpl.hpp @@ -921,8 +921,8 @@ namespace GridKit } } - //std::cout << "System Jacobian\n"; - //csr_jac_->print(std::cout); + // std::cout << "System Jacobian\n"; + // csr_jac_->print(std::cout); return 0; } From 963fc9670c5b1c0a43ced8e7e13f4adcece82d78 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 11:43:36 -0400 Subject: [PATCH 36/39] More precise bounds on Jacobian buffers. --- .../Model/PhasorDynamics/Branch/BranchEnzyme.cpp | 9 ++++++--- .../PhasorDynamics/BusFault/BusFaultEnzyme.cpp | 9 ++++++--- .../PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp | 12 ++++++++---- .../Exciter/SEXS-PTI/SexsPtiEnzyme.cpp | 12 +++++++++--- .../PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp | 11 +++++++---- GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp | 9 ++++++--- .../Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp | 9 ++++++--- .../Stabilizer/IEEEST/IeeestEnzyme.cpp | 13 ++++++++----- .../SynchronousMachine/GENROUwS/GenrouEnzyme.cpp | 12 ++++++++---- .../SynchronousMachine/GENSALwS/GensalEnzyme.cpp | 14 +++++++++----- .../GenClassical/GenClassicalEnzyme.cpp | 11 +++++++---- 11 files changed, 80 insertions(+), 41 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp index e7b7af9ba..630d805eb 100644 --- a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp @@ -25,9 +25,12 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - J_rows_buffer_ = new IdxT[16]; - J_cols_buffer_ = new IdxT[16]; - J_vals_buffer_ = new RealT[16]; + auto bus1_size = static_cast(bus1_->size()); + auto bus2_size = static_cast(bus2_->size()); + auto buffer_size = (bus1_size + bus2_size) * (bus1_size + bus2_size); + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp index 733170dc1..307a8a040 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp @@ -25,9 +25,12 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - J_rows_buffer_ = new IdxT[12]; - J_cols_buffer_ = new IdxT[12]; - J_vals_buffer_ = new RealT[12]; + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); + auto buffer_size = size*size + 2*size*bus_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp index 33b8f0409..0aaf5dba3 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp @@ -27,11 +27,15 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - // Reserve space for a dense matrix of size_*size_. + // Reserve space for the dense blocks. // Enyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(4 * size_) * static_cast(4 * size_)]; - J_cols_buffer_ = new IdxT[static_cast(4 * size_) * static_cast(4 * size_)]; - J_vals_buffer_ = new RealT[static_cast(4 * size_) * static_cast(4 * size_)]; + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); + auto signal_size = static_cast(ws_.size()); + auto buffer_size = 2*size*size + size*bus_size + size*signal_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp index 72c788399..05fca0756 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp @@ -22,9 +22,15 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - J_rows_buffer_ = new IdxT[static_cast(4 * size_) * static_cast(4 * size_)]; - J_cols_buffer_ = new IdxT[static_cast(4 * size_) * static_cast(4 * size_)]; - J_vals_buffer_ = new RealT[static_cast(4 * size_) * static_cast(4 * size_)]; + // Reserve space for the dense blocks. + // Enyme will compute the appropriate nnz from sparsification. + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); + auto signal_size = static_cast(ws_.size()); + auto buffer_size = 2*size*size + size*bus_size + size*signal_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp index 4acdbd8b8..3e66a4a11 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp @@ -27,11 +27,14 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - // Reserve space for a dense matrix of size_*size_. + // Reserve space for the dense blocks. // Enyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(3 * size_) * static_cast(3 * size_)]; - J_cols_buffer_ = new IdxT[static_cast(3 * size_) * static_cast(3 * size_)]; - J_vals_buffer_ = new RealT[static_cast(3 * size_) * static_cast(3 * size_)]; + auto size = static_cast(size_); + auto signal_size = static_cast(ws_.size()); + auto buffer_size = 2*size*size + size*signal_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp index c9fe9619a..50f310076 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp @@ -25,9 +25,12 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - J_rows_buffer_ = new IdxT[8]; - J_cols_buffer_ = new IdxT[8]; - J_vals_buffer_ = new RealT[8]; + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); + auto buffer_size = size*size + 2*size*bus_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp index 13e8be20d..c0df9d5d4 100644 --- a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp @@ -20,9 +20,12 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - J_rows_buffer_ = new IdxT[8]; - J_cols_buffer_ = new IdxT[8]; - J_vals_buffer_ = new RealT[8]; + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); + auto buffer_size = size*size + 2*size*bus_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp index 7717d36bf..7ba5e30fe 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp @@ -29,11 +29,14 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - // Reserve space for a dense matrix of size_*size_. - // Enzyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(3 * size_) * static_cast(3 * size_)]; - J_cols_buffer_ = new IdxT[static_cast(3 * size_) * static_cast(3 * size_)]; - J_vals_buffer_ = new RealT[static_cast(3 * size_) * static_cast(3 * size_)]; + // Reserve space for the dense blocks. + // Enyme will compute the appropriate nnz from sparsification. + auto size = static_cast(size_); + auto signal_size = static_cast(ws_.size()); + auto buffer_size = 2*size*size + size*signal_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp index 459632cb4..c6b43cd66 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp @@ -25,11 +25,15 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - // Reserve space for a dense matrix of size_*size_. + // Reserve space for the dense blocks. // Enyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(6 * size_) * static_cast(6 * size_)]; - J_cols_buffer_ = new IdxT[static_cast(6 * size_) * static_cast(6 * size_)]; - J_vals_buffer_ = new RealT[static_cast(6 * size_) * static_cast(6 * size_)]; + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); + auto signal_size = static_cast(ws_.size()); + auto buffer_size = 2*size*size + size*signal_size + bus_size*bus_size + 2*size*bus_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp index d34fb48fc..a1a1f6c7a 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp @@ -25,11 +25,15 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - // Reserve space for a dense matrix of size_*size_. - // Enzyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(6 * size_) * static_cast(6 * size_)]; - J_cols_buffer_ = new IdxT[static_cast(6 * size_) * static_cast(6 * size_)]; - J_vals_buffer_ = new RealT[static_cast(6 * size_) * static_cast(6 * size_)]; + // Reserve space for the dense blocks. + // Enyme will compute the appropriate nnz from sparsification. + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); + auto signal_size = static_cast(ws_.size()); + auto buffer_size = 2*size*size + size*signal_size + bus_size*bus_size + 2*size*bus_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp index 88829ace5..504c50fd5 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp @@ -25,11 +25,14 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - // Reserve space for a dense matrix of size_*size_. + // Reserve space for the dense blocks. // Enyme will compute the appropriate nnz from sparsification. - J_rows_buffer_ = new IdxT[static_cast(4 * size_) * static_cast(4 * size_)]; - J_cols_buffer_ = new IdxT[static_cast(4 * size_) * static_cast(4 * size_)]; - J_vals_buffer_ = new RealT[static_cast(4 * size_) * static_cast(4 * size_)]; + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); + auto buffer_size = 2*size*size + 2*size*bus_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; From dc1ab072043fa4c8029b48a1ba22055a34ba0d88 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 11:52:44 -0400 Subject: [PATCH 37/39] Add a few comments. --- GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp | 4 ++-- GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp | 2 +- GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp | 4 ++-- GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp | 4 ++-- GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp | 2 +- GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp index 8de8ca03e..a5293ddf9 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp @@ -65,7 +65,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, - 1.0, + 1.0, // value scaling res_indices, var_indices, rows, @@ -133,7 +133,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, - 1.0, + 1.0, // value scaling res_indices, var_indices, rows, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp index cb6d40995..ad3e3e568 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp @@ -67,7 +67,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, - 1.0, + 1.0, // value scaling res_indices, var_indices, rows, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp index 39c4b4940..4b1b8f87b 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp @@ -65,7 +65,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, - 1.0, + 1.0, // value scaling res_indices, var_indices, rows, @@ -133,7 +133,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, - 1.0, + 1.0, // value scaling res_indices, var_indices, rows, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp index 7fbe730bb..83baff9a6 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp @@ -67,7 +67,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, - alpha, + alpha, // value scaling res_indices, var_indices, rows, @@ -137,7 +137,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, - alpha, + alpha, // value scaling res_indices, var_indices, rows, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp index 4562d5e4b..7bad3d0c8 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp @@ -65,7 +65,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, - 1.0, + 1.0, // value scaling res_indices, var_indices, rows, diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp index fe3f2b469..0bc62301f 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp @@ -65,7 +65,7 @@ namespace GridKit ScalarT* d_output = __enzyme_todense((void*) sparse_load, (void*) sparse_store, var_i, - 1.0, + 1.0, // value scaling res_indices, var_indices, rows, From 6940d6140a6849eca43dcc5e2ff1bc0a155525c0 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 12:03:22 -0400 Subject: [PATCH 38/39] Revert inlining changes to CooMatrix and CsrMatrix. --- .../LinearAlgebra/SparseMatrix/CooMatrix.cpp | 18 +++++++++--------- .../LinearAlgebra/SparseMatrix/CsrMatrix.cpp | 12 ++++++------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/GridKit/LinearAlgebra/SparseMatrix/CooMatrix.cpp b/GridKit/LinearAlgebra/SparseMatrix/CooMatrix.cpp index 1522bc9d5..37fccb935 100644 --- a/GridKit/LinearAlgebra/SparseMatrix/CooMatrix.cpp +++ b/GridKit/LinearAlgebra/SparseMatrix/CooMatrix.cpp @@ -202,7 +202,7 @@ namespace GridKit * @return number of matrix rows. */ template - inline IdxT CooMatrix::getNumRows() const + IdxT CooMatrix::getNumRows() const { return n_; } @@ -213,7 +213,7 @@ namespace GridKit * @return number of matrix columns. */ template - inline IdxT CooMatrix::getNumColumns() const + IdxT CooMatrix::getNumColumns() const { return m_; } @@ -224,7 +224,7 @@ namespace GridKit * @return number of non-zeros. */ template - inline IdxT CooMatrix::getNnz() const + IdxT CooMatrix::getNnz() const { return nnz_; } @@ -356,7 +356,7 @@ namespace GridKit * @return Pointer to CSR row pointer array */ template - inline IdxT* CooMatrix::getCsrRowData() + IdxT* CooMatrix::getCsrRowData() { if (!h_data_updated_) { @@ -441,19 +441,19 @@ namespace GridKit } template - inline const IdxT* CooMatrix::getMapToSorted() const + const IdxT* CooMatrix::getMapToSorted() const { return map_to_sorted_; } template - inline const IdxT* CooMatrix::getMapToDeduplicated() const + const IdxT* CooMatrix::getMapToDeduplicated() const { return map_to_dedup_; } template - inline IdxT* CooMatrix::getRowData(memory::MemorySpace memspace) + IdxT* CooMatrix::getRowData(memory::MemorySpace memspace) { using namespace memory; @@ -469,7 +469,7 @@ namespace GridKit } template - inline IdxT* CooMatrix::getColData(memory::MemorySpace memspace) + IdxT* CooMatrix::getColData(memory::MemorySpace memspace) { using namespace memory; @@ -485,7 +485,7 @@ namespace GridKit } template - inline RealT* CooMatrix::getValues(memory::MemorySpace memspace) + RealT* CooMatrix::getValues(memory::MemorySpace memspace) { using namespace memory; diff --git a/GridKit/LinearAlgebra/SparseMatrix/CsrMatrix.cpp b/GridKit/LinearAlgebra/SparseMatrix/CsrMatrix.cpp index 3a9ad885c..3325569bd 100644 --- a/GridKit/LinearAlgebra/SparseMatrix/CsrMatrix.cpp +++ b/GridKit/LinearAlgebra/SparseMatrix/CsrMatrix.cpp @@ -198,7 +198,7 @@ namespace GridKit * @return number of matrix rows. */ template - inline IdxT CsrMatrix::getNumRows() const + IdxT CsrMatrix::getNumRows() const { return n_; } @@ -209,7 +209,7 @@ namespace GridKit * @return number of matrix columns. */ template - inline IdxT CsrMatrix::getNumColumns() const + IdxT CsrMatrix::getNumColumns() const { return m_; } @@ -220,7 +220,7 @@ namespace GridKit * @return number of non-zeros. */ template - inline IdxT CsrMatrix::getNnz() const + IdxT CsrMatrix::getNnz() const { return nnz_; } @@ -524,7 +524,7 @@ namespace GridKit } template - inline IdxT* CsrMatrix::getRowData(memory::MemorySpace memspace) + IdxT* CsrMatrix::getRowData(memory::MemorySpace memspace) { using namespace memory; @@ -540,7 +540,7 @@ namespace GridKit } template - inline IdxT* CsrMatrix::getColData(memory::MemorySpace memspace) + IdxT* CsrMatrix::getColData(memory::MemorySpace memspace) { using namespace memory; @@ -556,7 +556,7 @@ namespace GridKit } template - inline RealT* CsrMatrix::getValues(memory::MemorySpace memspace) + RealT* CsrMatrix::getValues(memory::MemorySpace memspace) { using namespace memory; From cb4873156eb80f0f1e8c0d83ce983538f2f81b13 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan Date: Thu, 11 Jun 2026 12:28:19 -0400 Subject: [PATCH 39/39] Fix formatting. --- GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp | 10 +++++----- .../Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp | 12 ++++++------ .../PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp | 12 ++++++------ .../Exciter/SEXS-PTI/SexsPtiEnzyme.cpp | 12 ++++++------ .../PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp | 10 +++++----- GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp | 12 ++++++------ .../Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp | 12 ++++++------ .../Stabilizer/IEEEST/IeeestEnzyme.cpp | 10 +++++----- .../SynchronousMachine/GENROUwS/GenrouEnzyme.cpp | 12 ++++++------ .../SynchronousMachine/GENSALwS/GensalEnzyme.cpp | 12 ++++++------ .../GenClassical/GenClassicalEnzyme.cpp | 12 ++++++------ 11 files changed, 63 insertions(+), 63 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp index 630d805eb..72aa13751 100644 --- a/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Branch/BranchEnzyme.cpp @@ -25,12 +25,12 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - auto bus1_size = static_cast(bus1_->size()); - auto bus2_size = static_cast(bus2_->size()); + auto bus1_size = static_cast(bus1_->size()); + auto bus2_size = static_cast(bus2_->size()); auto buffer_size = (bus1_size + bus2_size) * (bus1_size + bus2_size); - J_rows_buffer_ = new IdxT[buffer_size]; - J_cols_buffer_ = new IdxT[buffer_size]; - J_vals_buffer_ = new RealT[buffer_size]; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp index 307a8a040..0a4b72a38 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFaultEnzyme.cpp @@ -25,12 +25,12 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - auto size = static_cast(size_); - auto bus_size = static_cast(bus_->size()); - auto buffer_size = size*size + 2*size*bus_size; - J_rows_buffer_ = new IdxT[buffer_size]; - J_cols_buffer_ = new IdxT[buffer_size]; - J_vals_buffer_ = new RealT[buffer_size]; + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); + auto buffer_size = size * size + 2 * size * bus_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp index 0aaf5dba3..1542ba8e3 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Enzyme.cpp @@ -29,13 +29,13 @@ namespace GridKit { // Reserve space for the dense blocks. // Enyme will compute the appropriate nnz from sparsification. - auto size = static_cast(size_); - auto bus_size = static_cast(bus_->size()); + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); auto signal_size = static_cast(ws_.size()); - auto buffer_size = 2*size*size + size*bus_size + size*signal_size; - J_rows_buffer_ = new IdxT[buffer_size]; - J_cols_buffer_ = new IdxT[buffer_size]; - J_vals_buffer_ = new RealT[buffer_size]; + auto buffer_size = 2 * size * size + size * bus_size + size * signal_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp index 05fca0756..f73f6762a 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiEnzyme.cpp @@ -24,13 +24,13 @@ namespace GridKit { // Reserve space for the dense blocks. // Enyme will compute the appropriate nnz from sparsification. - auto size = static_cast(size_); - auto bus_size = static_cast(bus_->size()); + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); auto signal_size = static_cast(ws_.size()); - auto buffer_size = 2*size*size + size*bus_size + size*signal_size; - J_rows_buffer_ = new IdxT[buffer_size]; - J_cols_buffer_ = new IdxT[buffer_size]; - J_vals_buffer_ = new RealT[buffer_size]; + auto buffer_size = 2 * size * size + size * bus_size + size * signal_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp index 3e66a4a11..2202730a7 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Enzyme.cpp @@ -29,12 +29,12 @@ namespace GridKit { // Reserve space for the dense blocks. // Enyme will compute the appropriate nnz from sparsification. - auto size = static_cast(size_); + auto size = static_cast(size_); auto signal_size = static_cast(ws_.size()); - auto buffer_size = 2*size*size + size*signal_size; - J_rows_buffer_ = new IdxT[buffer_size]; - J_cols_buffer_ = new IdxT[buffer_size]; - J_vals_buffer_ = new RealT[buffer_size]; + auto buffer_size = 2 * size * size + size * signal_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp index 50f310076..df740f88d 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadEnzyme.cpp @@ -25,12 +25,12 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - auto size = static_cast(size_); - auto bus_size = static_cast(bus_->size()); - auto buffer_size = size*size + 2*size*bus_size; - J_rows_buffer_ = new IdxT[buffer_size]; - J_cols_buffer_ = new IdxT[buffer_size]; - J_vals_buffer_ = new RealT[buffer_size]; + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); + auto buffer_size = size * size + 2 * size * bus_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp index c0df9d5d4..93a345fe9 100644 --- a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIPEnzyme.cpp @@ -20,12 +20,12 @@ namespace GridKit if (J_rows_buffer_ == nullptr) { - auto size = static_cast(size_); - auto bus_size = static_cast(bus_->size()); - auto buffer_size = size*size + 2*size*bus_size; - J_rows_buffer_ = new IdxT[buffer_size]; - J_cols_buffer_ = new IdxT[buffer_size]; - J_vals_buffer_ = new RealT[buffer_size]; + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); + auto buffer_size = size * size + 2 * size * bus_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp index 7ba5e30fe..8992b7995 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestEnzyme.cpp @@ -31,12 +31,12 @@ namespace GridKit { // Reserve space for the dense blocks. // Enyme will compute the appropriate nnz from sparsification. - auto size = static_cast(size_); + auto size = static_cast(size_); auto signal_size = static_cast(ws_.size()); - auto buffer_size = 2*size*size + size*signal_size; - J_rows_buffer_ = new IdxT[buffer_size]; - J_cols_buffer_ = new IdxT[buffer_size]; - J_vals_buffer_ = new RealT[buffer_size]; + auto buffer_size = 2 * size * size + size * signal_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp index c6b43cd66..95f17da98 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouEnzyme.cpp @@ -27,13 +27,13 @@ namespace GridKit { // Reserve space for the dense blocks. // Enyme will compute the appropriate nnz from sparsification. - auto size = static_cast(size_); - auto bus_size = static_cast(bus_->size()); + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); auto signal_size = static_cast(ws_.size()); - auto buffer_size = 2*size*size + size*signal_size + bus_size*bus_size + 2*size*bus_size; - J_rows_buffer_ = new IdxT[buffer_size]; - J_cols_buffer_ = new IdxT[buffer_size]; - J_vals_buffer_ = new RealT[buffer_size]; + auto buffer_size = 2 * size * size + size * signal_size + bus_size * bus_size + 2 * size * bus_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp index a1a1f6c7a..0c4a882c7 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalEnzyme.cpp @@ -27,13 +27,13 @@ namespace GridKit { // Reserve space for the dense blocks. // Enyme will compute the appropriate nnz from sparsification. - auto size = static_cast(size_); - auto bus_size = static_cast(bus_->size()); + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); auto signal_size = static_cast(ws_.size()); - auto buffer_size = 2*size*size + size*signal_size + bus_size*bus_size + 2*size*bus_size; - J_rows_buffer_ = new IdxT[buffer_size]; - J_cols_buffer_ = new IdxT[buffer_size]; - J_vals_buffer_ = new RealT[buffer_size]; + auto buffer_size = 2 * size * size + size * signal_size + bus_size * bus_size + 2 * size * bus_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0; diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp index 504c50fd5..e6bd63484 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalEnzyme.cpp @@ -27,12 +27,12 @@ namespace GridKit { // Reserve space for the dense blocks. // Enyme will compute the appropriate nnz from sparsification. - auto size = static_cast(size_); - auto bus_size = static_cast(bus_->size()); - auto buffer_size = 2*size*size + 2*size*bus_size; - J_rows_buffer_ = new IdxT[buffer_size]; - J_cols_buffer_ = new IdxT[buffer_size]; - J_vals_buffer_ = new RealT[buffer_size]; + auto size = static_cast(size_); + auto bus_size = static_cast(bus_->size()); + auto buffer_size = 2 * size * size + 2 * size * bus_size; + J_rows_buffer_ = new IdxT[buffer_size]; + J_cols_buffer_ = new IdxT[buffer_size]; + J_vals_buffer_ = new RealT[buffer_size]; } nnz_ = 0;