From 26c9def186d24ed94092352fb4bbbf9cbb39b7fd Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 16:32:08 -0400 Subject: [PATCH 01/22] Define M_PI for MSVC --- GridKit/Constants.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/GridKit/Constants.hpp b/GridKit/Constants.hpp index ba58e7c38..45fc53863 100644 --- a/GridKit/Constants.hpp +++ b/GridKit/Constants.hpp @@ -30,4 +30,9 @@ namespace GridKit template inline constexpr RealT MINUS_ONE = -1.0; + +#ifdef _MSC_VER + template + inline constexpr RealT M_PI = 3.14159265358979323846; +#endif } // namespace GridKit From b1c06954dd0d436e022f6733406a3d13e7cb11a4 Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 16:34:46 -0400 Subject: [PATCH 02/22] Extract .string() from filename() in parseArgs for Windows --- GridKit/Utilities/CliArgs/CliArgsImpl.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GridKit/Utilities/CliArgs/CliArgsImpl.hpp b/GridKit/Utilities/CliArgs/CliArgsImpl.hpp index 000238b20..7ab99fdc1 100644 --- a/GridKit/Utilities/CliArgs/CliArgsImpl.hpp +++ b/GridKit/Utilities/CliArgs/CliArgsImpl.hpp @@ -241,7 +241,11 @@ namespace GridKit void CliArgsImpl::parseArgs(int argc, const char* argv[]) { +#if defined(_WIN32) + app_name_ = std::filesystem::path(argv[0]).filename().string(); +#else app_name_ = std::filesystem::path(argv[0]).filename(); +#endif bool status = true; // Current argument (may involve multiple tokens) From 5022813b8fa5732685c7d568c45c1dfc7aa01f99 Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 16:35:22 -0400 Subject: [PATCH 03/22] Define FORCE_INLINE macro and make it compiler-specific --- GridKit/CommonMath.hpp | 30 +++++++++---------- GridKit/Definitions.hpp.in | 8 +++++ .../Model/PhasorDynamics/Branch/Branch.hpp | 12 ++++---- .../PhasorDynamics/Branch/BranchImpl.hpp | 8 ++--- .../PhasorDynamics/BusFault/BusFault.hpp | 2 +- .../PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp | 2 +- .../Exciter/IEEET1/Ieeet1Impl.hpp | 2 +- .../Exciter/SEXS-PTI/SexsPti.hpp | 2 +- .../Exciter/SEXS-PTI/SexsPtiImpl.hpp | 2 +- .../PhasorDynamics/Governor/Tgov1/Tgov1.hpp | 2 +- .../Governor/Tgov1/Tgov1Impl.hpp | 2 +- GridKit/Model/PhasorDynamics/Load/Load.hpp | 4 +-- .../Model/PhasorDynamics/LoadZIP/LoadZIP.hpp | 4 +-- .../Stabilizer/IEEEST/Ieeest.hpp | 2 +- .../Stabilizer/IEEEST/IeeestImpl.hpp | 2 +- .../SynchronousMachine/GENROUwS/Genrou.hpp | 4 +-- .../GENROUwS/GenrouImpl.hpp | 4 +-- .../SynchronousMachine/GENSALwS/Gensal.hpp | 4 +-- .../GENSALwS/GensalImpl.hpp | 4 +-- .../GenClassical/GenClassical.hpp | 4 +-- 20 files changed, 56 insertions(+), 48 deletions(-) diff --git a/GridKit/CommonMath.hpp b/GridKit/CommonMath.hpp index e4a7ec87f..e3db939b9 100644 --- a/GridKit/CommonMath.hpp +++ b/GridKit/CommonMath.hpp @@ -34,7 +34,7 @@ namespace GridKit * @return value of the sigmoid function */ template - __attribute__((always_inline)) inline ScalarT sigmoid(const ScalarT x) + FORCE_INLINE ScalarT sigmoid(const ScalarT x) { using RealT = typename GridKit::ScalarTraits::RealT; return HALF * (ONE + std::tanh(HALF * MU * x)); @@ -52,7 +52,7 @@ namespace GridKit * @return value of the smooth ramp function */ template - __attribute__((always_inline)) inline ScalarT ramp(const ScalarT x) + FORCE_INLINE ScalarT ramp(const ScalarT x) { using RealT = typename GridKit::ScalarTraits::RealT; @@ -76,7 +76,7 @@ namespace GridKit * @return value of the quadratic ramp */ template - __attribute__((always_inline)) inline ScalarT qramp(const ScalarT x) + FORCE_INLINE ScalarT qramp(const ScalarT x) { return x * x * sigmoid(x); } @@ -101,7 +101,7 @@ namespace GridKit * forcing callers to cast every parameter. */ template - __attribute__((always_inline)) inline auto max( + FORCE_INLINE auto max( const LeftT x, const RightT y) { @@ -128,7 +128,7 @@ namespace GridKit * forcing callers to cast every parameter. */ template - __attribute__((always_inline)) inline auto min( + FORCE_INLINE auto min( const LeftT x, const RightT y) { @@ -152,7 +152,7 @@ namespace GridKit * @return value of the smooth clamp function */ template - __attribute__((always_inline)) inline auto clamp( + FORCE_INLINE auto clamp( const ScalarT x, const LowerT lower, const UpperT upper) @@ -176,7 +176,7 @@ namespace GridKit * @return Smooth deadbanded value */ template - __attribute__((always_inline)) inline ScalarT deadband( + FORCE_INLINE ScalarT deadband( const ScalarT x, const RealT lower, const RealT upper) @@ -198,7 +198,7 @@ namespace GridKit * @return Slew-rate-limited value of f */ template - __attribute__((always_inline)) inline ScalarT slew( + FORCE_INLINE ScalarT slew( const ScalarT f, const RealT rate) { @@ -223,7 +223,7 @@ namespace GridKit * @return Smooth linear segment contribution */ template - __attribute__((always_inline)) inline ScalarT linseg( + FORCE_INLINE ScalarT linseg( const ScalarT x, const RealT lower, const RealT upper, @@ -244,7 +244,7 @@ namespace GridKit * @return Smooth indicator that x is above limit_min */ template - __attribute__((always_inline)) inline ScalarT above( + FORCE_INLINE ScalarT above( const ScalarT x, const RealT limit_min) { @@ -262,7 +262,7 @@ namespace GridKit * @return Smooth indicator that x is below limit_max */ template - __attribute__((always_inline)) inline ScalarT below( + FORCE_INLINE ScalarT below( const ScalarT x, const RealT limit_max) { @@ -281,7 +281,7 @@ namespace GridKit * @return Smooth indicator that x is inside [limit_min, limit_max] */ template - __attribute__((always_inline)) inline ScalarT inside( + FORCE_INLINE ScalarT inside( const ScalarT x, const RealT limit_min, const RealT limit_max) @@ -302,7 +302,7 @@ namespace GridKit * @return Smooth indicator that x is outside [limit_min, limit_max] */ template - __attribute__((always_inline)) inline ScalarT outside( + FORCE_INLINE ScalarT outside( const ScalarT x, const RealT limit_min, const RealT limit_max) @@ -325,7 +325,7 @@ namespace GridKit * 0 when integration should be blocked. */ template - __attribute__((always_inline)) inline ScalarT indicator( + FORCE_INLINE ScalarT indicator( const ScalarT x, const ScalarT f, const RealT limit_min, @@ -359,7 +359,7 @@ namespace GridKit * @return Smooth anti-windup limited derivative */ template - __attribute__((always_inline)) inline ScalarT antiwindup( + FORCE_INLINE ScalarT antiwindup( const ScalarT x, const ScalarT f, const RealT limit_min, diff --git a/GridKit/Definitions.hpp.in b/GridKit/Definitions.hpp.in index 10215709d..e503666b1 100644 --- a/GridKit/Definitions.hpp.in +++ b/GridKit/Definitions.hpp.in @@ -10,3 +10,11 @@ #define GRIDKIT_VERSION_MAJOR "@GridKit_VERSION_MAJOR@" #define GRIDKIT_VERSION_MINOR "@GridKit_VERSION_MINOR@" #define GRIDKIT_VERSION_PATCH "@GridKit_VERSION_PATCH@" + +#if defined(__MINGW32__) || defined(__clang__) || defined(__GNUC__) + #define FORCE_INLINE __attribute__((always_inline)) inline +#elif defined(_MSC_VER) + #define FORCE_INLINE [[msvc::forceinline]] inline +#else + #define FORCE_INLINE __attribute__((always_inline)) inline +#endif \ No newline at end of file diff --git a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp index 84149f8a4..308fe7312 100644 --- a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp +++ b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp @@ -134,14 +134,14 @@ namespace GridKit typename ModelDataT::Parameters parameter, RealT& target); - static __attribute__((always_inline)) inline void addAdmittanceContribution(RealT G, + static FORCE_INLINE void addAdmittanceContribution(RealT G, RealT B, const ScalarT& Vr, const ScalarT& Vi, ScalarT& Ir, ScalarT& Ii); - static __attribute__((always_inline)) inline void evaluateAdmittanceBlock(RealT G, + static FORCE_INLINE void evaluateAdmittanceBlock(RealT G, RealT B, const ScalarT* wb, ScalarT* h); @@ -187,10 +187,10 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateBusResidual11(ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual12(ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual21(ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual22(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual11(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual12(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual21(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual22(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: BusT* bus1_; diff --git a/GridKit/Model/PhasorDynamics/Branch/BranchImpl.hpp b/GridKit/Model/PhasorDynamics/Branch/BranchImpl.hpp index 1fe3977f0..05d750e4d 100644 --- a/GridKit/Model/PhasorDynamics/Branch/BranchImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Branch/BranchImpl.hpp @@ -174,7 +174,7 @@ namespace GridKit } template - __attribute__((always_inline)) inline void Branch::addAdmittanceContribution( + FORCE_INLINE void Branch::addAdmittanceContribution( RealT G, RealT B, const ScalarT& Vr, @@ -187,7 +187,7 @@ namespace GridKit } template - __attribute__((always_inline)) inline void Branch::evaluateAdmittanceBlock( + FORCE_INLINE void Branch::evaluateAdmittanceBlock( RealT G, RealT B, const ScalarT* wb, @@ -205,7 +205,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Branch::evaluateBusResidual11( + FORCE_INLINE int Branch::evaluateBusResidual11( [[maybe_unused]] ScalarT* y, [[maybe_unused]] ScalarT* yp, ScalarT* wb, @@ -221,7 +221,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Branch::evaluateBusResidual12( + FORCE_INLINE int Branch::evaluateBusResidual12( [[maybe_unused]] ScalarT* y, [[maybe_unused]] ScalarT* yp, ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp b/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp index 3b559fd1b..63d408877 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp @@ -110,7 +110,7 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: BusT* bus_; diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp index add41ad66..4bcc81302 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp @@ -122,7 +122,7 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; - __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: // Signal pointers diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Impl.hpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Impl.hpp index c055ad6b4..f844257bd 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Impl.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Impl.hpp @@ -279,7 +279,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Ieeet1::evaluateInternalResidual( + FORCE_INLINE int Ieeet1::evaluateInternalResidual( ScalarT* y, ScalarT* yp, ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp index 56f5667d0..832109da8 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp @@ -103,7 +103,7 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiImpl.hpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiImpl.hpp index e0de70fea..b3fc1787f 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiImpl.hpp @@ -181,7 +181,7 @@ namespace GridKit } template - __attribute__((always_inline)) inline int SexsPti::evaluateInternalResidual( + FORCE_INLINE int SexsPti::evaluateInternalResidual( ScalarT* y, ScalarT* yp, ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp index f8ceb7207..9c67561df 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp @@ -109,7 +109,7 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: // Input parameters diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Impl.hpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Impl.hpp index 29c4b07bd..cad6312f9 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Impl.hpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Impl.hpp @@ -237,7 +237,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Tgov1::evaluateInternalResidual( + FORCE_INLINE int Tgov1::evaluateInternalResidual( ScalarT* y, ScalarT* yp, [[maybe_unused]] ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/Load/Load.hpp b/GridKit/Model/PhasorDynamics/Load/Load.hpp index 33ce3cc1e..93803ef87 100644 --- a/GridKit/Model/PhasorDynamics/Load/Load.hpp +++ b/GridKit/Model/PhasorDynamics/Load/Load.hpp @@ -110,8 +110,8 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; public: - __attribute__((always_inline)) inline int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: BusT* bus_{nullptr}; diff --git a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIP.hpp b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIP.hpp index ebe3a9be2..da7018f48 100644 --- a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIP.hpp +++ b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIP.hpp @@ -124,8 +124,8 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; public: - __attribute__((always_inline)) inline int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: BusT* bus_{nullptr}; diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp index 486f1820b..c6adac551 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp @@ -110,7 +110,7 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( ScalarT*, ScalarT*, [[maybe_unused]] ScalarT*, diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestImpl.hpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestImpl.hpp index 70b49977d..66d23d245 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestImpl.hpp @@ -244,7 +244,7 @@ namespace GridKit } template - __attribute__((always_inline)) inline int Ieeest::evaluateInternalResidual( + FORCE_INLINE int Ieeest::evaluateInternalResidual( ScalarT* y, ScalarT* yp, [[maybe_unused]] ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp index 73b6f764d..88464ee50 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp @@ -205,8 +205,8 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: /* Identification */ diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouImpl.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouImpl.hpp index 9cbb0b587..4fd46a2a8 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouImpl.hpp @@ -528,7 +528,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Genrou::evaluateInternalResidual( + FORCE_INLINE int Genrou::evaluateInternalResidual( ScalarT* y, ScalarT* yp, ScalarT* wb, @@ -606,7 +606,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Genrou::evaluateBusResidual( + FORCE_INLINE int Genrou::evaluateBusResidual( ScalarT* y, [[maybe_unused]] ScalarT* yp, ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/Gensal.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/Gensal.hpp index 8e00fc2e8..3ef0626d9 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/Gensal.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/Gensal.hpp @@ -169,8 +169,8 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: /* Identification */ diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalImpl.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalImpl.hpp index 9b779ded5..1e511a70d 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalImpl.hpp @@ -351,7 +351,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Gensal::evaluateInternalResidual( + FORCE_INLINE int Gensal::evaluateInternalResidual( ScalarT* y, ScalarT* yp, ScalarT* wb, @@ -422,7 +422,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Gensal::evaluateBusResidual( + FORCE_INLINE int Gensal::evaluateBusResidual( ScalarT* y, [[maybe_unused]] ScalarT* yp, ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp index a2696fc0d..87c4615fc 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp @@ -144,8 +144,8 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: /* Identification */ From d2e6a3efd2a0fa31e0bfb7b591113b78b10cc12e Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 17:12:26 -0400 Subject: [PATCH 04/22] Make sure CommonMath.hpp includes the FORCE_INLINE definition. --- GridKit/CommonMath.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/GridKit/CommonMath.hpp b/GridKit/CommonMath.hpp index e3db939b9..9844b0e6c 100644 --- a/GridKit/CommonMath.hpp +++ b/GridKit/CommonMath.hpp @@ -5,6 +5,7 @@ #include #include +#include namespace GridKit { From af17444d971fda8351063d80ec32636a1b2a9109 Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 17:12:38 -0400 Subject: [PATCH 05/22] Make toUpper() inline to preserve ODR. --- GridKit/Utilities/String.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GridKit/Utilities/String.hpp b/GridKit/Utilities/String.hpp index 26e0d39e0..13c4ecfb4 100644 --- a/GridKit/Utilities/String.hpp +++ b/GridKit/Utilities/String.hpp @@ -12,7 +12,7 @@ namespace GridKit /** * @brief Convert a string to all uppercase */ - std::string toUpper(std::string str) + inline std::string toUpper(std::string str) { std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) { return std::toupper(c); }); From a5d7e805cb6d25ce5b1281564b9d207fef046d5c Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 17:27:30 -0400 Subject: [PATCH 06/22] Update docs --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 58a252f7b..5e3591b65 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,14 @@ cmake -DCMAKE_INSTALL_PREFIX=/path/to/install ../GridKit cmake --build . cmake --install . ``` +On windows, use: +```powershell +mkdir build +cd build +cmake -DCMAKE_INSTALL_PREFIX=/path/to/install -DBUILD_SHARED_LIBS=OFF ../ +cmake --build . +cmake --install . +``` Dependencies are autodetected if installed in standard locations, otherwise specify their location explicitly. For example: ```bash From 04c4c6eb141c1436fffa5e776c9504c3e9a180ed Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 17:29:31 -0400 Subject: [PATCH 07/22] Remove MSVC PI_M definition. Turns out it's already defined by MSVC. As of this comment, the code works on MinGW g++. --- GridKit/Constants.hpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/GridKit/Constants.hpp b/GridKit/Constants.hpp index 45fc53863..ba58e7c38 100644 --- a/GridKit/Constants.hpp +++ b/GridKit/Constants.hpp @@ -30,9 +30,4 @@ namespace GridKit template inline constexpr RealT MINUS_ONE = -1.0; - -#ifdef _MSC_VER - template - inline constexpr RealT M_PI = 3.14159265358979323846; -#endif } // namespace GridKit From f45c21c6b50939c6daeb20abcefbfd126c135266 Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Wed, 10 Jun 2026 09:34:58 -0400 Subject: [PATCH 08/22] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 066786e09..9be1267e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,7 +61,8 @@ - Added `BusToSignalAdapter` component for communicating bus voltages and injection currents. - Added cmake-format hooks, including in pre-commit. - Added off-nominal tap ratio and phase shift support to the PhasorDynamics `Branch` model. -- Added portable Vector class to GridKit +- Added portable Vector class to GridKit. +- Added Windows compatibility. ## v0.1 From 5d622140360d6ce31d73328ff55d92f899f67216 Mon Sep 17 00:00:00 2001 From: andrewxu319 Date: Wed, 10 Jun 2026 13:41:32 +0000 Subject: [PATCH 09/22] Apply pre-commmit fixes --- GridKit/CommonMath.hpp | 2 +- GridKit/Definitions.hpp.in | 2 +- GridKit/Model/PhasorDynamics/Branch/Branch.hpp | 16 ++++++++-------- GridKit/Utilities/CliArgs/CliArgsImpl.hpp | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/GridKit/CommonMath.hpp b/GridKit/CommonMath.hpp index 9844b0e6c..db6cab1cb 100644 --- a/GridKit/CommonMath.hpp +++ b/GridKit/CommonMath.hpp @@ -4,8 +4,8 @@ #include #include -#include #include +#include namespace GridKit { diff --git a/GridKit/Definitions.hpp.in b/GridKit/Definitions.hpp.in index e503666b1..2c979ecb7 100644 --- a/GridKit/Definitions.hpp.in +++ b/GridKit/Definitions.hpp.in @@ -17,4 +17,4 @@ #define FORCE_INLINE [[msvc::forceinline]] inline #else #define FORCE_INLINE __attribute__((always_inline)) inline -#endif \ No newline at end of file +#endif diff --git a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp index 308fe7312..02a1817a0 100644 --- a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp +++ b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp @@ -135,16 +135,16 @@ namespace GridKit RealT& target); static FORCE_INLINE void addAdmittanceContribution(RealT G, - RealT B, - const ScalarT& Vr, - const ScalarT& Vi, - ScalarT& Ir, - ScalarT& Ii); + RealT B, + const ScalarT& Vr, + const ScalarT& Vi, + ScalarT& Ir, + ScalarT& Ii); static FORCE_INLINE void evaluateAdmittanceBlock(RealT G, - RealT B, - const ScalarT* wb, - ScalarT* h); + RealT B, + const ScalarT* wb, + ScalarT* h); ScalarT& Vr1() { diff --git a/GridKit/Utilities/CliArgs/CliArgsImpl.hpp b/GridKit/Utilities/CliArgs/CliArgsImpl.hpp index 7ab99fdc1..017c1f0f1 100644 --- a/GridKit/Utilities/CliArgs/CliArgsImpl.hpp +++ b/GridKit/Utilities/CliArgs/CliArgsImpl.hpp @@ -242,9 +242,9 @@ namespace GridKit void CliArgsImpl::parseArgs(int argc, const char* argv[]) { #if defined(_WIN32) - app_name_ = std::filesystem::path(argv[0]).filename().string(); + app_name_ = std::filesystem::path(argv[0]).filename().string(); #else - app_name_ = std::filesystem::path(argv[0]).filename(); + app_name_ = std::filesystem::path(argv[0]).filename(); #endif bool status = true; From d0b0c75f8e976c280d3a2f6bddf78ff3566a32d9 Mon Sep 17 00:00:00 2001 From: Nicholson Koukpaizan <72402802+nkoukpaizan@users.noreply.github.com> Date: Wed, 10 Jun 2026 12:22:31 -0400 Subject: [PATCH 10/22] Fix phasor_dynamics_systemmodel targets. (#444) * Fix phasor_dynamics_systemmodel targets. --------- Co-authored-by: nkoukpaizan --- GridKit/Model/PhasorDynamics/CMakeLists.txt | 49 ++++++++++--------- application/PhasorDynamics/CMakeLists.txt | 4 +- examples/Consumer/CMakeLists.txt | 2 +- .../Small/TenGen/Classical/CMakeLists.txt | 2 +- .../Small/TenGen/Genrou/CMakeLists.txt | 2 +- .../Tiny/ThreeBus/Basic/CMakeLists.txt | 4 +- .../Tiny/ThreeBus/Classical/CMakeLists.txt | 4 +- .../Tiny/ThreeBus/ZipLoad/CMakeLists.txt | 2 +- .../Tiny/TwoBus/Basic/CMakeLists.txt | 4 +- .../Tiny/TwoBus/Ieeet1/CMakeLists.txt | 10 +--- .../Tiny/TwoBus/Tgov1/CMakeLists.txt | 10 +--- tests/UnitTests/PhasorDynamics/CMakeLists.txt | 12 ++--- tests/UnitTests/Utilities/CMakeLists.txt | 2 +- 13 files changed, 48 insertions(+), 59 deletions(-) diff --git a/GridKit/Model/PhasorDynamics/CMakeLists.txt b/GridKit/Model/PhasorDynamics/CMakeLists.txt index 9e99156e4..90ddb2abc 100644 --- a/GridKit/Model/PhasorDynamics/CMakeLists.txt +++ b/GridKit/Model/PhasorDynamics/CMakeLists.txt @@ -29,30 +29,6 @@ target_link_libraries( phasor_dynamics_components_dependency_tracking INTERFACE GridKit::phasor_dynamics_core) -gridkit_add_library( - phasor_dynamics_systemmodel - SOURCES SystemModel.cpp SystemModelData.cpp - HEADERS SystemModel.hpp SystemModelData.hpp - LINK_LIBRARIES PUBLIC GridKit::phasor_dynamics_core - INCLUDE_DIRECTORIES - PRIVATE - ${GRIDKIT_THIRD_PARTY_DIR}/nlohmann-json/include - PRIVATE - ${GRIDKIT_THIRD_PARTY_DIR}/magic-enum/include) - -gridkit_add_library( - phasor_dynamics_systemmodel_dependency_tracking - SOURCES SystemModelDependencyTracking.cpp - HEADERS SystemModel.hpp - LINK_LIBRARIES PUBLIC GridKit::phasor_dynamics_core) - -target_link_libraries( - phasor_dynamics_components - INTERFACE GridKit::phasor_dynamics_systemmodel) -target_link_libraries( - phasor_dynamics_components_dependency_tracking - INTERFACE GridKit::phasor_dynamics_systemmodel_dependency_tracking) - add_subdirectory(Branch) add_subdirectory(Bus) add_subdirectory(BusFault) @@ -70,5 +46,30 @@ add_library(GridKit::phasor_dynamics_components ALIAS phasor_dynamics_components add_library(GridKit::phasor_dynamics_components_dependency_tracking ALIAS phasor_dynamics_components_dependency_tracking) +gridkit_add_library( + phasor_dynamics_systemmodel + SOURCES SystemModel.cpp SystemModelData.cpp + HEADERS SystemModel.hpp SystemModelData.hpp + LINK_LIBRARIES + PUBLIC + GridKit::phasor_dynamics_core + PUBLIC + GridKit::phasor_dynamics_components + INCLUDE_DIRECTORIES + PRIVATE + ${GRIDKIT_THIRD_PARTY_DIR}/nlohmann-json/include + PRIVATE + ${GRIDKIT_THIRD_PARTY_DIR}/magic-enum/include) + +gridkit_add_library( + phasor_dynamics_systemmodel_dependency_tracking + SOURCES SystemModelDependencyTracking.cpp + HEADERS SystemModel.hpp + LINK_LIBRARIES + PUBLIC + GridKit::phasor_dynamics_core + PUBLIC + GridKit::phasor_dynamics_components_dependency_tracking) + install(TARGETS phasor_dynamics_components phasor_dynamics_components_dependency_tracking EXPORT gridkit-targets) diff --git a/application/PhasorDynamics/CMakeLists.txt b/application/PhasorDynamics/CMakeLists.txt index 6db27cf78..99a4e80c8 100644 --- a/application/PhasorDynamics/CMakeLists.txt +++ b/application/PhasorDynamics/CMakeLists.txt @@ -1,7 +1,7 @@ add_executable(DynamicSimulation DynamicSimulation.cpp) target_link_libraries( DynamicSimulation - PUBLIC GridKit::phasor_dynamics_components + PUBLIC GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn GridKit::Utilities GridKit::testing) @@ -13,7 +13,7 @@ target_include_directories( add_executable(ContingencyAnalysis ContingencyAnalysis.cpp) target_link_libraries( ContingencyAnalysis - PUBLIC GridKit::phasor_dynamics_components + PUBLIC GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn GridKit::Utilities GridKit::testing) diff --git a/examples/Consumer/CMakeLists.txt b/examples/Consumer/CMakeLists.txt index eebcd54bb..fb6d94134 100644 --- a/examples/Consumer/CMakeLists.txt +++ b/examples/Consumer/CMakeLists.txt @@ -18,7 +18,7 @@ if(GRIDKIT_ENABLE_SUNDIALS) list( APPEND GRIDKIT_CONSUMER_TEST_LINK_LIBRARIES - GridKit::phasor_dynamics_components + GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn) else() install( diff --git a/examples/PhasorDynamics/Small/TenGen/Classical/CMakeLists.txt b/examples/PhasorDynamics/Small/TenGen/Classical/CMakeLists.txt index 8896e85ab..9c6806b65 100644 --- a/examples/PhasorDynamics/Small/TenGen/Classical/CMakeLists.txt +++ b/examples/PhasorDynamics/Small/TenGen/Classical/CMakeLists.txt @@ -1,6 +1,6 @@ add_executable(TenGenClassical TenGenClassical.cpp) target_link_libraries( - TenGenClassical GridKit::phasor_dynamics_components GridKit::solvers_dyn) + TenGenClassical GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn) install(TARGETS TenGenClassical RUNTIME DESTINATION bin) # Not used for tesing for now. diff --git a/examples/PhasorDynamics/Small/TenGen/Genrou/CMakeLists.txt b/examples/PhasorDynamics/Small/TenGen/Genrou/CMakeLists.txt index 2c77f482e..e38f064f2 100644 --- a/examples/PhasorDynamics/Small/TenGen/Genrou/CMakeLists.txt +++ b/examples/PhasorDynamics/Small/TenGen/Genrou/CMakeLists.txt @@ -1,6 +1,6 @@ add_executable(TenGenGenrou TenGenGenrou.cpp) target_link_libraries( - TenGenGenrou GridKit::phasor_dynamics_components GridKit::solvers_dyn) + TenGenGenrou GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn) install(TARGETS TenGenGenrou RUNTIME DESTINATION bin) # Not used for tesing for now. diff --git a/examples/PhasorDynamics/Tiny/ThreeBus/Basic/CMakeLists.txt b/examples/PhasorDynamics/Tiny/ThreeBus/Basic/CMakeLists.txt index 1a3ca1d44..447060e49 100644 --- a/examples/PhasorDynamics/Tiny/ThreeBus/Basic/CMakeLists.txt +++ b/examples/PhasorDynamics/Tiny/ThreeBus/Basic/CMakeLists.txt @@ -2,13 +2,13 @@ gridkit_example_current_install_path(_install_path) add_executable(ThreeBusBasic ThreeBusBasic.cpp) target_link_libraries( - ThreeBusBasic GridKit::phasor_dynamics_components GridKit::solvers_dyn) + ThreeBusBasic GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn) install(TARGETS ThreeBusBasic RUNTIME DESTINATION ${_install_path}) add_executable(ThreeBusBasicJson ThreeBusBasicJson.cpp) target_link_libraries( ThreeBusBasicJson - GridKit::phasor_dynamics_components + GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn GridKit::utilities_cli_args GridKit::testing) diff --git a/examples/PhasorDynamics/Tiny/ThreeBus/Classical/CMakeLists.txt b/examples/PhasorDynamics/Tiny/ThreeBus/Classical/CMakeLists.txt index 76e56620f..ff6cbd0ed 100644 --- a/examples/PhasorDynamics/Tiny/ThreeBus/Classical/CMakeLists.txt +++ b/examples/PhasorDynamics/Tiny/ThreeBus/Classical/CMakeLists.txt @@ -7,12 +7,12 @@ gridkit_example_current_install_path(_install_path) add_executable(ThreeBusClassical ThreeBusClassical.cpp) target_link_libraries( - ThreeBusClassical GridKit::phasor_dynamics_components GridKit::solvers_dyn) + ThreeBusClassical GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn) install(TARGETS ThreeBusClassical RUNTIME DESTINATION ${_install_path}) add_executable(ThreeBusClassicalJson ThreeBusClassicalJson.cpp) target_link_libraries( - ThreeBusClassicalJson GridKit::phasor_dynamics_components GridKit::solvers_dyn) + ThreeBusClassicalJson GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn) install(TARGETS ThreeBusClassicalJson RUNTIME DESTINATION ${_install_path}) gridkit_example_add_file(ThreeBusClassical.json) diff --git a/examples/PhasorDynamics/Tiny/ThreeBus/ZipLoad/CMakeLists.txt b/examples/PhasorDynamics/Tiny/ThreeBus/ZipLoad/CMakeLists.txt index 18030a58c..d4b6841f9 100644 --- a/examples/PhasorDynamics/Tiny/ThreeBus/ZipLoad/CMakeLists.txt +++ b/examples/PhasorDynamics/Tiny/ThreeBus/ZipLoad/CMakeLists.txt @@ -2,6 +2,6 @@ gridkit_example_current_install_path(_install_path) add_executable(ThreeBusZipLoadJson ThreeBusZipLoadJson.cpp) target_link_libraries( - ThreeBusZipLoadJson GridKit::phasor_dynamics_components GridKit::solvers_dyn) + ThreeBusZipLoadJson GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn) install(TARGETS ThreeBusZipLoadJson RUNTIME DESTINATION ${_install_path}) gridkit_example_add_file(ThreeBusZipLoad.json) diff --git a/examples/PhasorDynamics/Tiny/TwoBus/Basic/CMakeLists.txt b/examples/PhasorDynamics/Tiny/TwoBus/Basic/CMakeLists.txt index cc70c425d..795148e79 100644 --- a/examples/PhasorDynamics/Tiny/TwoBus/Basic/CMakeLists.txt +++ b/examples/PhasorDynamics/Tiny/TwoBus/Basic/CMakeLists.txt @@ -2,12 +2,12 @@ gridkit_example_current_install_path(_install_path) add_executable(TwoBusBasic TwoBusBasic.cpp) target_link_libraries( - TwoBusBasic GridKit::phasor_dynamics_components GridKit::solvers_dyn) + TwoBusBasic GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn) install(TARGETS TwoBusBasic RUNTIME DESTINATION ${_install_path}) add_executable(TwoBusBasicJson TwoBusBasicJson.cpp) target_link_libraries( - TwoBusBasicJson GridKit::phasor_dynamics_components GridKit::solvers_dyn) + TwoBusBasicJson GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn) install(TARGETS TwoBusBasicJson RUNTIME DESTINATION ${_install_path}) gridkit_example_add_file(TwoBusBasic.case.json) diff --git a/examples/PhasorDynamics/Tiny/TwoBus/Ieeet1/CMakeLists.txt b/examples/PhasorDynamics/Tiny/TwoBus/Ieeet1/CMakeLists.txt index 2dd697aa0..a9e207bf1 100644 --- a/examples/PhasorDynamics/Tiny/TwoBus/Ieeet1/CMakeLists.txt +++ b/examples/PhasorDynamics/Tiny/TwoBus/Ieeet1/CMakeLists.txt @@ -2,18 +2,12 @@ gridkit_example_current_install_path(_install_path) add_executable(TwoBusIeeet1 TwoBusIeeet1.cpp) target_link_libraries( - TwoBusIeeet1 - GridKit::phasor_dynamics_components - GridKit::phasor_dynamics_signal - GridKit::solvers_dyn) + TwoBusIeeet1 GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn) install(TARGETS TwoBusIeeet1 RUNTIME DESTINATION ${_install_path}) add_executable(TwoBusIeeet1Json TwoBusIeeet1Json.cpp) target_link_libraries( - TwoBusIeeet1Json - GridKit::phasor_dynamics_components - GridKit::phasor_dynamics_signal - GridKit::solvers_dyn) + TwoBusIeeet1Json GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn) install(TARGETS TwoBusIeeet1Json RUNTIME DESTINATION ${_install_path}) gridkit_example_add_file(TwoBusIeeet1.json) diff --git a/examples/PhasorDynamics/Tiny/TwoBus/Tgov1/CMakeLists.txt b/examples/PhasorDynamics/Tiny/TwoBus/Tgov1/CMakeLists.txt index 840571261..e96bdeeb5 100644 --- a/examples/PhasorDynamics/Tiny/TwoBus/Tgov1/CMakeLists.txt +++ b/examples/PhasorDynamics/Tiny/TwoBus/Tgov1/CMakeLists.txt @@ -2,18 +2,12 @@ gridkit_example_current_install_path(_install_path) add_executable(TwoBusTgov1 TwoBusTgov1.cpp) target_link_libraries( - TwoBusTgov1 - GridKit::phasor_dynamics_components - GridKit::phasor_dynamics_signal - GridKit::solvers_dyn) + TwoBusTgov1 GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn) install(TARGETS TwoBusTgov1 RUNTIME DESTINATION ${_install_path}) add_executable(TwoBusTgov1Json TwoBusTgov1Json.cpp) target_link_libraries( - TwoBusTgov1Json - GridKit::phasor_dynamics_components - GridKit::phasor_dynamics_signal - GridKit::solvers_dyn) + TwoBusTgov1Json GridKit::phasor_dynamics_systemmodel GridKit::solvers_dyn) install(TARGETS TwoBusTgov1Json RUNTIME DESTINATION ${_install_path}) gridkit_example_add_file(TwoBusTgov1.json) diff --git a/tests/UnitTests/PhasorDynamics/CMakeLists.txt b/tests/UnitTests/PhasorDynamics/CMakeLists.txt index 932cb13b8..bac53ec7b 100644 --- a/tests/UnitTests/PhasorDynamics/CMakeLists.txt +++ b/tests/UnitTests/PhasorDynamics/CMakeLists.txt @@ -90,8 +90,8 @@ add_executable(test_phasor_exciter_sexspti runExciterSexsPtiTests.cpp) target_link_libraries( test_phasor_exciter_sexspti GridKit::definitions - GridKit::phasor_dynamics_components - GridKit::phasor_dynamics_components_dependency_tracking + GridKit::phasor_dynamics_systemmodel + GridKit::phasor_dynamics_systemmodel_dependency_tracking GridKit::testing) add_executable(test_phasor_stabilizer_ieeest runStabilizerIeeestTests.cpp) @@ -117,8 +117,8 @@ add_executable(test_phasor_system runSystemTests.cpp) target_link_libraries( test_phasor_system GridKit::definitions - GridKit::phasor_dynamics_components - GridKit::phasor_dynamics_components_dependency_tracking + GridKit::phasor_dynamics_systemmodel + GridKit::phasor_dynamics_systemmodel_dependency_tracking GridKit::testing) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ThreeBusBasicBad.json ${CMAKE_CURRENT_BINARY_DIR}/ThreeBusBasicBad.json COPYONLY) @@ -126,8 +126,8 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ThreeBusBasicBad.json add_executable(test_phasor_system_single_component runSystemSingleComponentTests.cpp) target_link_libraries( test_phasor_system_single_component - GridKit::phasor_dynamics_components - GridKit::phasor_dynamics_components_dependency_tracking + GridKit::phasor_dynamics_systemmodel + GridKit::phasor_dynamics_systemmodel_dependency_tracking GridKit::testing) add_test(NAME PhasorDynamicsBusTest COMMAND test_phasor_bus) diff --git a/tests/UnitTests/Utilities/CMakeLists.txt b/tests/UnitTests/Utilities/CMakeLists.txt index 9b2202d39..b434f02f1 100644 --- a/tests/UnitTests/Utilities/CMakeLists.txt +++ b/tests/UnitTests/Utilities/CMakeLists.txt @@ -1,7 +1,7 @@ add_executable(test_case_format runCaseFormatTests.cpp) target_link_libraries( test_case_format - PRIVATE GridKit::phasor_dynamics_components GridKit::testing) + PRIVATE GridKit::phasor_dynamics_systemmodel GridKit::testing) target_include_directories( test_case_format PRIVATE ${GRIDKIT_THIRD_PARTY_DIR}/nlohmann-json/single_include From 3e06ec4688fb34e0c887c598ed40ea3acc36a983 Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Thu, 11 Jun 2026 09:04:47 -0400 Subject: [PATCH 11/22] Revert "Update docs" This reverts commit a5d7e805cb6d25ce5b1281564b9d207fef046d5c. --- README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/README.md b/README.md index 5e3591b65..58a252f7b 100644 --- a/README.md +++ b/README.md @@ -45,14 +45,6 @@ cmake -DCMAKE_INSTALL_PREFIX=/path/to/install ../GridKit cmake --build . cmake --install . ``` -On windows, use: -```powershell -mkdir build -cd build -cmake -DCMAKE_INSTALL_PREFIX=/path/to/install -DBUILD_SHARED_LIBS=OFF ../ -cmake --build . -cmake --install . -``` Dependencies are autodetected if installed in standard locations, otherwise specify their location explicitly. For example: ```bash From 053a0cf3a4b79923ded70085275210877576a8ec Mon Sep 17 00:00:00 2001 From: andrewxu319 Date: Wed, 10 Jun 2026 13:41:32 +0000 Subject: [PATCH 12/22] Apply pre-commmit fixes --- GridKit/CommonMath.hpp | 2 +- GridKit/Definitions.hpp.in | 2 +- GridKit/Model/PhasorDynamics/Branch/Branch.hpp | 16 ++++++++-------- GridKit/Utilities/CliArgs/CliArgsImpl.hpp | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/GridKit/CommonMath.hpp b/GridKit/CommonMath.hpp index 9844b0e6c..db6cab1cb 100644 --- a/GridKit/CommonMath.hpp +++ b/GridKit/CommonMath.hpp @@ -4,8 +4,8 @@ #include #include -#include #include +#include namespace GridKit { diff --git a/GridKit/Definitions.hpp.in b/GridKit/Definitions.hpp.in index e503666b1..2c979ecb7 100644 --- a/GridKit/Definitions.hpp.in +++ b/GridKit/Definitions.hpp.in @@ -17,4 +17,4 @@ #define FORCE_INLINE [[msvc::forceinline]] inline #else #define FORCE_INLINE __attribute__((always_inline)) inline -#endif \ No newline at end of file +#endif diff --git a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp index 308fe7312..02a1817a0 100644 --- a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp +++ b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp @@ -135,16 +135,16 @@ namespace GridKit RealT& target); static FORCE_INLINE void addAdmittanceContribution(RealT G, - RealT B, - const ScalarT& Vr, - const ScalarT& Vi, - ScalarT& Ir, - ScalarT& Ii); + RealT B, + const ScalarT& Vr, + const ScalarT& Vi, + ScalarT& Ir, + ScalarT& Ii); static FORCE_INLINE void evaluateAdmittanceBlock(RealT G, - RealT B, - const ScalarT* wb, - ScalarT* h); + RealT B, + const ScalarT* wb, + ScalarT* h); ScalarT& Vr1() { diff --git a/GridKit/Utilities/CliArgs/CliArgsImpl.hpp b/GridKit/Utilities/CliArgs/CliArgsImpl.hpp index 7ab99fdc1..017c1f0f1 100644 --- a/GridKit/Utilities/CliArgs/CliArgsImpl.hpp +++ b/GridKit/Utilities/CliArgs/CliArgsImpl.hpp @@ -242,9 +242,9 @@ namespace GridKit void CliArgsImpl::parseArgs(int argc, const char* argv[]) { #if defined(_WIN32) - app_name_ = std::filesystem::path(argv[0]).filename().string(); + app_name_ = std::filesystem::path(argv[0]).filename().string(); #else - app_name_ = std::filesystem::path(argv[0]).filename(); + app_name_ = std::filesystem::path(argv[0]).filename(); #endif bool status = true; From 817619c25485c2baddcbb732b66d8999d9c4a588 Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 16:32:08 -0400 Subject: [PATCH 13/22] Define M_PI for MSVC --- GridKit/Constants.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/GridKit/Constants.hpp b/GridKit/Constants.hpp index ba58e7c38..45fc53863 100644 --- a/GridKit/Constants.hpp +++ b/GridKit/Constants.hpp @@ -30,4 +30,9 @@ namespace GridKit template inline constexpr RealT MINUS_ONE = -1.0; + +#ifdef _MSC_VER + template + inline constexpr RealT M_PI = 3.14159265358979323846; +#endif } // namespace GridKit From e969af6ba0754b7b8c43f90a372664f2edfc4ba9 Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 16:34:46 -0400 Subject: [PATCH 14/22] Extract .string() from filename() in parseArgs for Windows --- GridKit/Utilities/CliArgs/CliArgsImpl.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/GridKit/Utilities/CliArgs/CliArgsImpl.hpp b/GridKit/Utilities/CliArgs/CliArgsImpl.hpp index 000238b20..7ab99fdc1 100644 --- a/GridKit/Utilities/CliArgs/CliArgsImpl.hpp +++ b/GridKit/Utilities/CliArgs/CliArgsImpl.hpp @@ -241,7 +241,11 @@ namespace GridKit void CliArgsImpl::parseArgs(int argc, const char* argv[]) { +#if defined(_WIN32) + app_name_ = std::filesystem::path(argv[0]).filename().string(); +#else app_name_ = std::filesystem::path(argv[0]).filename(); +#endif bool status = true; // Current argument (may involve multiple tokens) From 3636f6989fcdff6c36b79fb684ed3b4d7f12ccb0 Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 16:35:22 -0400 Subject: [PATCH 15/22] Define FORCE_INLINE macro and make it compiler-specific --- GridKit/CommonMath.hpp | 30 +++++++++---------- GridKit/Definitions.hpp.in | 8 +++++ .../Model/PhasorDynamics/Branch/Branch.hpp | 12 ++++---- .../PhasorDynamics/Branch/BranchImpl.hpp | 8 ++--- .../PhasorDynamics/BusFault/BusFault.hpp | 2 +- .../PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp | 2 +- .../Exciter/IEEET1/Ieeet1Impl.hpp | 2 +- .../Exciter/SEXS-PTI/SexsPti.hpp | 2 +- .../Exciter/SEXS-PTI/SexsPtiImpl.hpp | 2 +- .../PhasorDynamics/Governor/Tgov1/Tgov1.hpp | 2 +- .../Governor/Tgov1/Tgov1Impl.hpp | 2 +- GridKit/Model/PhasorDynamics/Load/Load.hpp | 4 +-- .../Model/PhasorDynamics/LoadZIP/LoadZIP.hpp | 4 +-- .../Stabilizer/IEEEST/Ieeest.hpp | 2 +- .../Stabilizer/IEEEST/IeeestImpl.hpp | 2 +- .../SynchronousMachine/GENROUwS/Genrou.hpp | 4 +-- .../GENROUwS/GenrouImpl.hpp | 4 +-- .../SynchronousMachine/GENSALwS/Gensal.hpp | 4 +-- .../GENSALwS/GensalImpl.hpp | 4 +-- .../GenClassical/GenClassical.hpp | 4 +-- 20 files changed, 56 insertions(+), 48 deletions(-) diff --git a/GridKit/CommonMath.hpp b/GridKit/CommonMath.hpp index e4a7ec87f..e3db939b9 100644 --- a/GridKit/CommonMath.hpp +++ b/GridKit/CommonMath.hpp @@ -34,7 +34,7 @@ namespace GridKit * @return value of the sigmoid function */ template - __attribute__((always_inline)) inline ScalarT sigmoid(const ScalarT x) + FORCE_INLINE ScalarT sigmoid(const ScalarT x) { using RealT = typename GridKit::ScalarTraits::RealT; return HALF * (ONE + std::tanh(HALF * MU * x)); @@ -52,7 +52,7 @@ namespace GridKit * @return value of the smooth ramp function */ template - __attribute__((always_inline)) inline ScalarT ramp(const ScalarT x) + FORCE_INLINE ScalarT ramp(const ScalarT x) { using RealT = typename GridKit::ScalarTraits::RealT; @@ -76,7 +76,7 @@ namespace GridKit * @return value of the quadratic ramp */ template - __attribute__((always_inline)) inline ScalarT qramp(const ScalarT x) + FORCE_INLINE ScalarT qramp(const ScalarT x) { return x * x * sigmoid(x); } @@ -101,7 +101,7 @@ namespace GridKit * forcing callers to cast every parameter. */ template - __attribute__((always_inline)) inline auto max( + FORCE_INLINE auto max( const LeftT x, const RightT y) { @@ -128,7 +128,7 @@ namespace GridKit * forcing callers to cast every parameter. */ template - __attribute__((always_inline)) inline auto min( + FORCE_INLINE auto min( const LeftT x, const RightT y) { @@ -152,7 +152,7 @@ namespace GridKit * @return value of the smooth clamp function */ template - __attribute__((always_inline)) inline auto clamp( + FORCE_INLINE auto clamp( const ScalarT x, const LowerT lower, const UpperT upper) @@ -176,7 +176,7 @@ namespace GridKit * @return Smooth deadbanded value */ template - __attribute__((always_inline)) inline ScalarT deadband( + FORCE_INLINE ScalarT deadband( const ScalarT x, const RealT lower, const RealT upper) @@ -198,7 +198,7 @@ namespace GridKit * @return Slew-rate-limited value of f */ template - __attribute__((always_inline)) inline ScalarT slew( + FORCE_INLINE ScalarT slew( const ScalarT f, const RealT rate) { @@ -223,7 +223,7 @@ namespace GridKit * @return Smooth linear segment contribution */ template - __attribute__((always_inline)) inline ScalarT linseg( + FORCE_INLINE ScalarT linseg( const ScalarT x, const RealT lower, const RealT upper, @@ -244,7 +244,7 @@ namespace GridKit * @return Smooth indicator that x is above limit_min */ template - __attribute__((always_inline)) inline ScalarT above( + FORCE_INLINE ScalarT above( const ScalarT x, const RealT limit_min) { @@ -262,7 +262,7 @@ namespace GridKit * @return Smooth indicator that x is below limit_max */ template - __attribute__((always_inline)) inline ScalarT below( + FORCE_INLINE ScalarT below( const ScalarT x, const RealT limit_max) { @@ -281,7 +281,7 @@ namespace GridKit * @return Smooth indicator that x is inside [limit_min, limit_max] */ template - __attribute__((always_inline)) inline ScalarT inside( + FORCE_INLINE ScalarT inside( const ScalarT x, const RealT limit_min, const RealT limit_max) @@ -302,7 +302,7 @@ namespace GridKit * @return Smooth indicator that x is outside [limit_min, limit_max] */ template - __attribute__((always_inline)) inline ScalarT outside( + FORCE_INLINE ScalarT outside( const ScalarT x, const RealT limit_min, const RealT limit_max) @@ -325,7 +325,7 @@ namespace GridKit * 0 when integration should be blocked. */ template - __attribute__((always_inline)) inline ScalarT indicator( + FORCE_INLINE ScalarT indicator( const ScalarT x, const ScalarT f, const RealT limit_min, @@ -359,7 +359,7 @@ namespace GridKit * @return Smooth anti-windup limited derivative */ template - __attribute__((always_inline)) inline ScalarT antiwindup( + FORCE_INLINE ScalarT antiwindup( const ScalarT x, const ScalarT f, const RealT limit_min, diff --git a/GridKit/Definitions.hpp.in b/GridKit/Definitions.hpp.in index 10215709d..e503666b1 100644 --- a/GridKit/Definitions.hpp.in +++ b/GridKit/Definitions.hpp.in @@ -10,3 +10,11 @@ #define GRIDKIT_VERSION_MAJOR "@GridKit_VERSION_MAJOR@" #define GRIDKIT_VERSION_MINOR "@GridKit_VERSION_MINOR@" #define GRIDKIT_VERSION_PATCH "@GridKit_VERSION_PATCH@" + +#if defined(__MINGW32__) || defined(__clang__) || defined(__GNUC__) + #define FORCE_INLINE __attribute__((always_inline)) inline +#elif defined(_MSC_VER) + #define FORCE_INLINE [[msvc::forceinline]] inline +#else + #define FORCE_INLINE __attribute__((always_inline)) inline +#endif \ No newline at end of file diff --git a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp index 84149f8a4..308fe7312 100644 --- a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp +++ b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp @@ -134,14 +134,14 @@ namespace GridKit typename ModelDataT::Parameters parameter, RealT& target); - static __attribute__((always_inline)) inline void addAdmittanceContribution(RealT G, + static FORCE_INLINE void addAdmittanceContribution(RealT G, RealT B, const ScalarT& Vr, const ScalarT& Vi, ScalarT& Ir, ScalarT& Ii); - static __attribute__((always_inline)) inline void evaluateAdmittanceBlock(RealT G, + static FORCE_INLINE void evaluateAdmittanceBlock(RealT G, RealT B, const ScalarT* wb, ScalarT* h); @@ -187,10 +187,10 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateBusResidual11(ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual12(ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual21(ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual22(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual11(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual12(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual21(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual22(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: BusT* bus1_; diff --git a/GridKit/Model/PhasorDynamics/Branch/BranchImpl.hpp b/GridKit/Model/PhasorDynamics/Branch/BranchImpl.hpp index 1fe3977f0..05d750e4d 100644 --- a/GridKit/Model/PhasorDynamics/Branch/BranchImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Branch/BranchImpl.hpp @@ -174,7 +174,7 @@ namespace GridKit } template - __attribute__((always_inline)) inline void Branch::addAdmittanceContribution( + FORCE_INLINE void Branch::addAdmittanceContribution( RealT G, RealT B, const ScalarT& Vr, @@ -187,7 +187,7 @@ namespace GridKit } template - __attribute__((always_inline)) inline void Branch::evaluateAdmittanceBlock( + FORCE_INLINE void Branch::evaluateAdmittanceBlock( RealT G, RealT B, const ScalarT* wb, @@ -205,7 +205,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Branch::evaluateBusResidual11( + FORCE_INLINE int Branch::evaluateBusResidual11( [[maybe_unused]] ScalarT* y, [[maybe_unused]] ScalarT* yp, ScalarT* wb, @@ -221,7 +221,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Branch::evaluateBusResidual12( + FORCE_INLINE int Branch::evaluateBusResidual12( [[maybe_unused]] ScalarT* y, [[maybe_unused]] ScalarT* yp, ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp b/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp index 3b559fd1b..63d408877 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp @@ -110,7 +110,7 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: BusT* bus_; diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp index add41ad66..4bcc81302 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp @@ -122,7 +122,7 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; - __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: // Signal pointers diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Impl.hpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Impl.hpp index c055ad6b4..f844257bd 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Impl.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Impl.hpp @@ -279,7 +279,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Ieeet1::evaluateInternalResidual( + FORCE_INLINE int Ieeet1::evaluateInternalResidual( ScalarT* y, ScalarT* yp, ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp index 56f5667d0..832109da8 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp @@ -103,7 +103,7 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiImpl.hpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiImpl.hpp index e0de70fea..b3fc1787f 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiImpl.hpp @@ -181,7 +181,7 @@ namespace GridKit } template - __attribute__((always_inline)) inline int SexsPti::evaluateInternalResidual( + FORCE_INLINE int SexsPti::evaluateInternalResidual( ScalarT* y, ScalarT* yp, ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp index f8ceb7207..9c67561df 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp @@ -109,7 +109,7 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: // Input parameters diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Impl.hpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Impl.hpp index 29c4b07bd..cad6312f9 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Impl.hpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Impl.hpp @@ -237,7 +237,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Tgov1::evaluateInternalResidual( + FORCE_INLINE int Tgov1::evaluateInternalResidual( ScalarT* y, ScalarT* yp, [[maybe_unused]] ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/Load/Load.hpp b/GridKit/Model/PhasorDynamics/Load/Load.hpp index 33ce3cc1e..93803ef87 100644 --- a/GridKit/Model/PhasorDynamics/Load/Load.hpp +++ b/GridKit/Model/PhasorDynamics/Load/Load.hpp @@ -110,8 +110,8 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; public: - __attribute__((always_inline)) inline int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: BusT* bus_{nullptr}; diff --git a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIP.hpp b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIP.hpp index ebe3a9be2..da7018f48 100644 --- a/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIP.hpp +++ b/GridKit/Model/PhasorDynamics/LoadZIP/LoadZIP.hpp @@ -124,8 +124,8 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; public: - __attribute__((always_inline)) inline int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: BusT* bus_{nullptr}; diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp index 486f1820b..c6adac551 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp @@ -110,7 +110,7 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( ScalarT*, ScalarT*, [[maybe_unused]] ScalarT*, diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestImpl.hpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestImpl.hpp index 70b49977d..66d23d245 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestImpl.hpp @@ -244,7 +244,7 @@ namespace GridKit } template - __attribute__((always_inline)) inline int Ieeest::evaluateInternalResidual( + FORCE_INLINE int Ieeest::evaluateInternalResidual( ScalarT* y, ScalarT* yp, [[maybe_unused]] ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp index 73b6f764d..88464ee50 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/Genrou.hpp @@ -205,8 +205,8 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: /* Identification */ diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouImpl.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouImpl.hpp index 9cbb0b587..4fd46a2a8 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROUwS/GenrouImpl.hpp @@ -528,7 +528,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Genrou::evaluateInternalResidual( + FORCE_INLINE int Genrou::evaluateInternalResidual( ScalarT* y, ScalarT* yp, ScalarT* wb, @@ -606,7 +606,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Genrou::evaluateBusResidual( + FORCE_INLINE int Genrou::evaluateBusResidual( ScalarT* y, [[maybe_unused]] ScalarT* yp, ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/Gensal.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/Gensal.hpp index 8e00fc2e8..3ef0626d9 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/Gensal.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/Gensal.hpp @@ -169,8 +169,8 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: /* Identification */ diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalImpl.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalImpl.hpp index 9b779ded5..1e511a70d 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSALwS/GensalImpl.hpp @@ -351,7 +351,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Gensal::evaluateInternalResidual( + FORCE_INLINE int Gensal::evaluateInternalResidual( ScalarT* y, ScalarT* yp, ScalarT* wb, @@ -422,7 +422,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Gensal::evaluateBusResidual( + FORCE_INLINE int Gensal::evaluateBusResidual( ScalarT* y, [[maybe_unused]] ScalarT* yp, ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp index a2696fc0d..87c4615fc 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp @@ -144,8 +144,8 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateInternalResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); + FORCE_INLINE int evaluateBusResidual(ScalarT*, ScalarT*, ScalarT*, ScalarT*); private: /* Identification */ From f9d632b79ae7fcfb9db13407707749cde2a100f3 Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 17:12:26 -0400 Subject: [PATCH 16/22] Make sure CommonMath.hpp includes the FORCE_INLINE definition. --- GridKit/CommonMath.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/GridKit/CommonMath.hpp b/GridKit/CommonMath.hpp index e3db939b9..9844b0e6c 100644 --- a/GridKit/CommonMath.hpp +++ b/GridKit/CommonMath.hpp @@ -5,6 +5,7 @@ #include #include +#include namespace GridKit { From ad2cd86aeb564fe3076c1ccc5ffc004872b127d1 Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 17:12:38 -0400 Subject: [PATCH 17/22] Make toUpper() inline to preserve ODR. --- GridKit/Utilities/String.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GridKit/Utilities/String.hpp b/GridKit/Utilities/String.hpp index 26e0d39e0..13c4ecfb4 100644 --- a/GridKit/Utilities/String.hpp +++ b/GridKit/Utilities/String.hpp @@ -12,7 +12,7 @@ namespace GridKit /** * @brief Convert a string to all uppercase */ - std::string toUpper(std::string str) + inline std::string toUpper(std::string str) { std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) { return std::toupper(c); }); From dae871cef2f217b63605c08ed7a888e37646a1cd Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 17:27:30 -0400 Subject: [PATCH 18/22] Update docs --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 58a252f7b..5e3591b65 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,14 @@ cmake -DCMAKE_INSTALL_PREFIX=/path/to/install ../GridKit cmake --build . cmake --install . ``` +On windows, use: +```powershell +mkdir build +cd build +cmake -DCMAKE_INSTALL_PREFIX=/path/to/install -DBUILD_SHARED_LIBS=OFF ../ +cmake --build . +cmake --install . +``` Dependencies are autodetected if installed in standard locations, otherwise specify their location explicitly. For example: ```bash From a2c4de5364927a21fd61ea91ac55f4442d93fd38 Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 17:29:31 -0400 Subject: [PATCH 19/22] Remove MSVC PI_M definition. Turns out it's already defined by MSVC. As of this comment, the code works on MinGW g++. --- GridKit/Constants.hpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/GridKit/Constants.hpp b/GridKit/Constants.hpp index 45fc53863..ba58e7c38 100644 --- a/GridKit/Constants.hpp +++ b/GridKit/Constants.hpp @@ -30,9 +30,4 @@ namespace GridKit template inline constexpr RealT MINUS_ONE = -1.0; - -#ifdef _MSC_VER - template - inline constexpr RealT M_PI = 3.14159265358979323846; -#endif } // namespace GridKit From cc5cab889413821e07ec08d836af95b131d227ec Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Wed, 10 Jun 2026 09:34:58 -0400 Subject: [PATCH 20/22] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 066786e09..9be1267e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,7 +61,8 @@ - Added `BusToSignalAdapter` component for communicating bus voltages and injection currents. - Added cmake-format hooks, including in pre-commit. - Added off-nominal tap ratio and phase shift support to the PhasorDynamics `Branch` model. -- Added portable Vector class to GridKit +- Added portable Vector class to GridKit. +- Added Windows compatibility. ## v0.1 From 7ddaca53aed48496db4dd3face0469aa2a2bf38e Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Thu, 11 Jun 2026 09:04:47 -0400 Subject: [PATCH 21/22] Revert "Update docs" This reverts commit a5d7e805cb6d25ce5b1281564b9d207fef046d5c. --- README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/README.md b/README.md index 5e3591b65..58a252f7b 100644 --- a/README.md +++ b/README.md @@ -45,14 +45,6 @@ cmake -DCMAKE_INSTALL_PREFIX=/path/to/install ../GridKit cmake --build . cmake --install . ``` -On windows, use: -```powershell -mkdir build -cd build -cmake -DCMAKE_INSTALL_PREFIX=/path/to/install -DBUILD_SHARED_LIBS=OFF ../ -cmake --build . -cmake --install . -``` Dependencies are autodetected if installed in standard locations, otherwise specify their location explicitly. For example: ```bash From fcceb73c88c751274a4ee2fdf346dc770650903a Mon Sep 17 00:00:00 2001 From: andrewxu319 Date: Wed, 10 Jun 2026 13:41:32 +0000 Subject: [PATCH 22/22] Apply pre-commmit fixes --- GridKit/CommonMath.hpp | 2 +- GridKit/Definitions.hpp.in | 2 +- GridKit/Model/PhasorDynamics/Branch/Branch.hpp | 16 ++++++++-------- GridKit/Utilities/CliArgs/CliArgsImpl.hpp | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/GridKit/CommonMath.hpp b/GridKit/CommonMath.hpp index 9844b0e6c..db6cab1cb 100644 --- a/GridKit/CommonMath.hpp +++ b/GridKit/CommonMath.hpp @@ -4,8 +4,8 @@ #include #include -#include #include +#include namespace GridKit { diff --git a/GridKit/Definitions.hpp.in b/GridKit/Definitions.hpp.in index e503666b1..2c979ecb7 100644 --- a/GridKit/Definitions.hpp.in +++ b/GridKit/Definitions.hpp.in @@ -17,4 +17,4 @@ #define FORCE_INLINE [[msvc::forceinline]] inline #else #define FORCE_INLINE __attribute__((always_inline)) inline -#endif \ No newline at end of file +#endif diff --git a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp index 308fe7312..02a1817a0 100644 --- a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp +++ b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp @@ -135,16 +135,16 @@ namespace GridKit RealT& target); static FORCE_INLINE void addAdmittanceContribution(RealT G, - RealT B, - const ScalarT& Vr, - const ScalarT& Vi, - ScalarT& Ir, - ScalarT& Ii); + RealT B, + const ScalarT& Vr, + const ScalarT& Vi, + ScalarT& Ir, + ScalarT& Ii); static FORCE_INLINE void evaluateAdmittanceBlock(RealT G, - RealT B, - const ScalarT* wb, - ScalarT* h); + RealT B, + const ScalarT* wb, + ScalarT* h); ScalarT& Vr1() { diff --git a/GridKit/Utilities/CliArgs/CliArgsImpl.hpp b/GridKit/Utilities/CliArgs/CliArgsImpl.hpp index 7ab99fdc1..017c1f0f1 100644 --- a/GridKit/Utilities/CliArgs/CliArgsImpl.hpp +++ b/GridKit/Utilities/CliArgs/CliArgsImpl.hpp @@ -242,9 +242,9 @@ namespace GridKit void CliArgsImpl::parseArgs(int argc, const char* argv[]) { #if defined(_WIN32) - app_name_ = std::filesystem::path(argv[0]).filename().string(); + app_name_ = std::filesystem::path(argv[0]).filename().string(); #else - app_name_ = std::filesystem::path(argv[0]).filename(); + app_name_ = std::filesystem::path(argv[0]).filename(); #endif bool status = true;