From 26c9def186d24ed94092352fb4bbbf9cbb39b7fd Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Tue, 9 Jun 2026 16:32:08 -0400 Subject: [PATCH 01/10] 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/10] 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/10] 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/10] 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/10] 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/10] 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/10] 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/10] 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/10] 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 3e06ec4688fb34e0c887c598ed40ea3acc36a983 Mon Sep 17 00:00:00 2001 From: Andrew Xu Date: Thu, 11 Jun 2026 09:04:47 -0400 Subject: [PATCH 10/10] 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