diff --git a/CHANGELOG.md b/CHANGELOG.md index e552d2cf3..2098d7f27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Release Changelog +## v0.3 + +- Added Windows compatibility (G++, Clang, MSVC). + ## v0.2 - Added 3, 10, 37, and 39 bus test cases. @@ -77,7 +81,6 @@ - Added `REGCA` converter model implementation for PhasorDynamics. - Remove unnecessary data copying while evaluating `PowerElectronics` models, speeding up large simulations by up to 3x - Added `HYGOV` governor model implementation for PhasorDynamics. -- Added `REPCA` controller model implementation for PhasorDynamics. ## v0.1 diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a2017d2a..e28791faf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,11 +17,19 @@ set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) if(MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Wall") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wconversion -Wpedantic") endif() +if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_definitions(FORCE_INLINE=[[gnu::always_inline]]\ inline) +elseif(MSVC) + add_compile_definitions(FORCE_INLINE=[[msvc::forceinline]]\ inline) +else() + add_compile_definitions(FORCE_INLINE=inline) +endif() + set(GRIDKIT_THIRD_PARTY_DIR ${PROJECT_SOURCE_DIR}/third-party) # Ipopt support is disabled by default @@ -119,7 +127,11 @@ if("${isSystemDir}" STREQUAL "-1") set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") endif("${isSystemDir}" STREQUAL "-1") -option(BUILD_SHARED_LIBS "Build shared libraries" ON) +if(WIN32) + option(BUILD_SHARED_LIBS "Build shared libraries" OFF) +else() + option(BUILD_SHARED_LIBS "Build shared libraries" ON) +endif() if(GRIDKIT_ENABLE_IPOPT) include(FindIpopt) diff --git a/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp b/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp index 6714a28a7..a3a42b79d 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/LowerSparseStorage.hpp @@ -206,7 +206,7 @@ namespace GridKit * @param[in,out] nnz - number of nonzeros */ template - __attribute__((always_inline)) static void sparse_store( + FORCE_INLINE static void sparse_store( ScalarT val, IdxT row, IdxT col, @@ -251,7 +251,7 @@ namespace GridKit * @tparam IdxT - matrix index data type */ template - __attribute__((always_inline)) static ScalarT sparse_load(IdxT, IdxT, IdxT*, IdxT*, ScalarT*) + FORCE_INLINE static ScalarT sparse_load(IdxT, IdxT, IdxT*, IdxT*, ScalarT*) { return 0.0; } @@ -263,7 +263,7 @@ namespace GridKit * @tparam IdxT - matrix index data type */ template - __attribute__((always_inline)) static void ident_store(ScalarT, IdxT, IdxT) + FORCE_INLINE static void ident_store(ScalarT, IdxT, IdxT) { assert(0 && "should never store"); } @@ -275,7 +275,7 @@ namespace GridKit * @tparam IdxT - matrix index data type */ template - __attribute__((always_inline)) static ScalarT ident_load(IdxT row, IdxT col) + FORCE_INLINE static ScalarT ident_load(IdxT row, IdxT col) { row /= sizeof(ScalarT); return (ScalarT) (row == col); diff --git a/GridKit/CommonMath.hpp b/GridKit/CommonMath.hpp index 8f9f8c5cf..2c54ff927 100644 --- a/GridKit/CommonMath.hpp +++ b/GridKit/CommonMath.hpp @@ -4,6 +4,7 @@ #include #include +#include #include namespace GridKit @@ -34,7 +35,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 +53,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 +77,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 +102,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 +129,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 +153,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 +177,7 @@ namespace GridKit * @return Smooth no-offset deadbanded value */ template - __attribute__((always_inline)) inline ScalarT deadband1( + FORCE_INLINE ScalarT deadband1( const ScalarT x, const RealT lower, const RealT upper) @@ -200,7 +201,7 @@ namespace GridKit * @return Smooth offset deadbanded value */ template - __attribute__((always_inline)) inline ScalarT deadband2( + FORCE_INLINE ScalarT deadband2( const ScalarT x, const RealT lower, const RealT upper) @@ -222,7 +223,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) { @@ -247,7 +248,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, @@ -268,7 +269,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) { @@ -286,7 +287,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) { @@ -305,7 +306,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) @@ -326,7 +327,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) @@ -349,7 +350,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, @@ -383,7 +384,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/Model/PhasorDynamics/Branch/Branch.hpp b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp index 7f4f4164c..2afddb780 100644 --- a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp +++ b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp @@ -8,6 +8,7 @@ */ #pragma once +#include #include #include #include @@ -135,17 +136,17 @@ namespace GridKit typename ModelDataT::Parameters parameter, RealT& target); - static __attribute__((always_inline)) inline void addAdmittanceContribution(const RealT G, - const RealT B, - const ScalarT Vr, - const ScalarT Vi, - ScalarT& Ir, - ScalarT& Ii); + FORCE_INLINE static void addAdmittanceContribution(const RealT G, + const RealT B, + const ScalarT Vr, + const ScalarT Vi, + ScalarT& Ir, + ScalarT& Ii); - static __attribute__((always_inline)) inline void evaluateAdmittanceBlock(const RealT G, - const RealT B, - const ScalarT* wb, - ScalarT* h); + FORCE_INLINE static void evaluateAdmittanceBlock(const RealT G, + const RealT B, + const ScalarT* wb, + ScalarT* h); ScalarT& Vr1() { @@ -188,13 +189,13 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateBusResidual11( + FORCE_INLINE int evaluateBusResidual11( const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual12( + FORCE_INLINE int evaluateBusResidual12( const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual21( + FORCE_INLINE int evaluateBusResidual21( const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual22( + FORCE_INLINE int evaluateBusResidual22( const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); private: diff --git a/GridKit/Model/PhasorDynamics/Branch/BranchImpl.hpp b/GridKit/Model/PhasorDynamics/Branch/BranchImpl.hpp index f7b1391f1..c4e96801f 100644 --- a/GridKit/Model/PhasorDynamics/Branch/BranchImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Branch/BranchImpl.hpp @@ -185,7 +185,7 @@ namespace GridKit } template - __attribute__((always_inline)) inline void Branch::addAdmittanceContribution( + FORCE_INLINE void Branch::addAdmittanceContribution( const RealT G, const RealT B, const ScalarT Vr, @@ -198,7 +198,7 @@ namespace GridKit } template - __attribute__((always_inline)) inline void Branch::evaluateAdmittanceBlock( + FORCE_INLINE void Branch::evaluateAdmittanceBlock( const RealT G, const RealT B, const ScalarT* wb, @@ -234,7 +234,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Branch::evaluateBusResidual11( + FORCE_INLINE int Branch::evaluateBusResidual11( [[maybe_unused]] const ScalarT* y, [[maybe_unused]] const ScalarT* yp, const ScalarT* wb, @@ -250,7 +250,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Branch::evaluateBusResidual12( + FORCE_INLINE int Branch::evaluateBusResidual12( [[maybe_unused]] const ScalarT* y, [[maybe_unused]] const ScalarT* yp, const ScalarT* wb, @@ -266,7 +266,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) int Branch::evaluateBusResidual21( + FORCE_INLINE int Branch::evaluateBusResidual21( [[maybe_unused]] const ScalarT* y, [[maybe_unused]] const ScalarT* yp, const ScalarT* wb, @@ -282,7 +282,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) int Branch::evaluateBusResidual22( + FORCE_INLINE int Branch::evaluateBusResidual22( [[maybe_unused]] const ScalarT* y, [[maybe_unused]] const ScalarT* yp, const ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp b/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp index 2a4bf6365..63adb41af 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFault.hpp @@ -1,6 +1,7 @@ /* Bus Fault Component - Adam Birchfield */ #pragma once +#include #include #include #include @@ -116,9 +117,9 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateBusResidual( + FORCE_INLINE int evaluateBusResidual( const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); private: diff --git a/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp b/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp index 2a2953360..3bd7b351b 100644 --- a/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp +++ b/GridKit/Model/PhasorDynamics/BusFault/BusFaultImpl.hpp @@ -209,7 +209,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) int BusFault::evaluateBusResidual( + FORCE_INLINE int BusFault::evaluateBusResidual( const ScalarT* y, [[maybe_unused]] const ScalarT* yp, [[maybe_unused]] const ScalarT* wb, @@ -228,7 +228,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) int BusFault::evaluateInternalResidual( + FORCE_INLINE int BusFault::evaluateInternalResidual( const ScalarT* y, [[maybe_unused]] const ScalarT* yp, const ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/Converter/REGCA/Regca.hpp b/GridKit/Model/PhasorDynamics/Converter/REGCA/Regca.hpp index 2bfb937ca..5581f079e 100644 --- a/GridKit/Model/PhasorDynamics/Converter/REGCA/Regca.hpp +++ b/GridKit/Model/PhasorDynamics/Converter/REGCA/Regca.hpp @@ -121,10 +121,10 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( const ScalarT* y, const ScalarT* yp, const ScalarT* wb, const ScalarT* ws, ScalarT* f); - __attribute__((always_inline)) inline int evaluateBusResidual( + FORCE_INLINE int evaluateBusResidual( const ScalarT* y, const ScalarT* yp, const ScalarT* wb, ScalarT* h); private: @@ -149,7 +149,7 @@ namespace GridKit * * @todo Move this reusable limiter to CommonMath. */ - static __attribute__((always_inline)) inline ScalarT rrpwr( + FORCE_INLINE static ScalarT rrpwr( const ScalarT x, const ScalarT f, const RealT rate) @@ -181,7 +181,7 @@ namespace GridKit * * @todo Move this one-sided anti-windup helper to CommonMath. */ - static __attribute__((always_inline)) inline ScalarT awmax( + FORCE_INLINE static ScalarT awmax( const ScalarT x, const ScalarT f, const ScalarT xmax, diff --git a/GridKit/Model/PhasorDynamics/Converter/REGCA/RegcaImpl.hpp b/GridKit/Model/PhasorDynamics/Converter/REGCA/RegcaImpl.hpp index d5a8ae03c..aa66bbe84 100644 --- a/GridKit/Model/PhasorDynamics/Converter/REGCA/RegcaImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Converter/REGCA/RegcaImpl.hpp @@ -611,7 +611,7 @@ namespace GridKit * @param[out] f Internal residuals. */ template - __attribute__((always_inline)) inline int + FORCE_INLINE int Regca::evaluateInternalResidual( const ScalarT* y, const ScalarT* yp, @@ -701,7 +701,7 @@ namespace GridKit * @param[out] h Current injected into the terminal bus. */ template - __attribute__((always_inline)) inline int Regca::evaluateBusResidual( + FORCE_INLINE int Regca::evaluateBusResidual( const ScalarT* y, [[maybe_unused]] const ScalarT* yp, [[maybe_unused]] const ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/Exciter/ESDC1A/Esdc1a.hpp b/GridKit/Model/PhasorDynamics/Exciter/ESDC1A/Esdc1a.hpp index dd42f55ac..102b910b1 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/ESDC1A/Esdc1a.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/ESDC1A/Esdc1a.hpp @@ -115,7 +115,7 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( const ScalarT* y, const ScalarT* yp, const ScalarT* wb, @@ -127,7 +127,7 @@ namespace GridKit void initializeMonitor(); void setDerivedParameters(); - static __attribute__((always_inline)) inline ScalarT awmin( + FORCE_INLINE static ScalarT awmin( ScalarT x, ScalarT f, RealT xmin); diff --git a/GridKit/Model/PhasorDynamics/Exciter/ESDC1A/Esdc1aImpl.hpp b/GridKit/Model/PhasorDynamics/Exciter/ESDC1A/Esdc1aImpl.hpp index 11906d3d9..3ea2a62c4 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/ESDC1A/Esdc1aImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/ESDC1A/Esdc1aImpl.hpp @@ -510,7 +510,7 @@ namespace GridKit * @return Zero on success. */ template - __attribute__((always_inline)) inline int + FORCE_INLINE int Esdc1a::evaluateInternalResidual( const ScalarT* y, const ScalarT* yp, @@ -597,7 +597,7 @@ namespace GridKit * @return Anti-windup-limited derivative. */ template - __attribute__((always_inline)) inline scalar_type + FORCE_INLINE scalar_type Esdc1a::awmin( const ScalarT x, const ScalarT f, diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp index 36d03a16f..9d5bc63c5 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp @@ -120,7 +120,7 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( const ScalarT*, const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); private: diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Impl.hpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Impl.hpp index 58d016ae6..5c18b20d8 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Impl.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1Impl.hpp @@ -300,7 +300,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Ieeet1::evaluateInternalResidual( + FORCE_INLINE int Ieeet1::evaluateInternalResidual( const ScalarT* y, const ScalarT* yp, const ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp index b1268515e..b80cefcd6 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp @@ -105,7 +105,7 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( const ScalarT*, const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); private: diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiImpl.hpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiImpl.hpp index 8b8e53a11..6d3c80c66 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPtiImpl.hpp @@ -211,7 +211,7 @@ namespace GridKit } template - __attribute__((always_inline)) inline int SexsPti::evaluateInternalResidual( + FORCE_INLINE int SexsPti::evaluateInternalResidual( const ScalarT* y, const ScalarT* yp, const ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/Governor/HYGOV/Hygov.hpp b/GridKit/Model/PhasorDynamics/Governor/HYGOV/Hygov.hpp index 9844dffd3..8eae6488b 100644 --- a/GridKit/Model/PhasorDynamics/Governor/HYGOV/Hygov.hpp +++ b/GridKit/Model/PhasorDynamics/Governor/HYGOV/Hygov.hpp @@ -115,7 +115,7 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( const ScalarT* y, const ScalarT* yp, const ScalarT* wb, @@ -129,7 +129,7 @@ namespace GridKit /// Evaluate the nonlinear gate-to-power curve as a fixed sum of /// smooth linear segments. - __attribute__((always_inline)) inline ScalarT gatePower(ScalarT gate) const; + FORCE_INLINE ScalarT gatePower(ScalarT gate) const; /// Steady component-base mechanical power at a gate and dam head. RealT initialMechanicalPower(RealT gate, RealT Hdam) const; diff --git a/GridKit/Model/PhasorDynamics/Governor/HYGOV/HygovImpl.hpp b/GridKit/Model/PhasorDynamics/Governor/HYGOV/HygovImpl.hpp index 9761ca9c6..2b3f2057e 100644 --- a/GridKit/Model/PhasorDynamics/Governor/HYGOV/HygovImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Governor/HYGOV/HygovImpl.hpp @@ -566,7 +566,7 @@ namespace GridKit * @return int 0 on success. */ template - __attribute__((always_inline)) inline int + FORCE_INLINE int Hygov::evaluateInternalResidual( const ScalarT* y, const ScalarT* yp, @@ -847,7 +847,7 @@ namespace GridKit * @return Turbine power at nominal head. */ template - __attribute__((always_inline)) inline scalar_type + FORCE_INLINE scalar_type Hygov::gatePower(scalar_type gate) const { ScalarT retval = Pgv_[0] diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp index bb8abc988..0196922ae 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp @@ -112,7 +112,7 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( const ScalarT*, const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); private: diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Impl.hpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Impl.hpp index ee5bed430..b9f022d9a 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Impl.hpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1Impl.hpp @@ -295,7 +295,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Tgov1::evaluateInternalResidual( + FORCE_INLINE int Tgov1::evaluateInternalResidual( const ScalarT* y, const ScalarT* yp, [[maybe_unused]] const ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/Load/LoadZ/LoadZ.hpp b/GridKit/Model/PhasorDynamics/Load/LoadZ/LoadZ.hpp index e31259e19..412116f69 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadZ/LoadZ.hpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadZ/LoadZ.hpp @@ -114,9 +114,9 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; public: - __attribute__((always_inline)) inline int evaluateBusResidual( + FORCE_INLINE int evaluateBusResidual( const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); private: diff --git a/GridKit/Model/PhasorDynamics/Load/LoadZ/LoadZImpl.hpp b/GridKit/Model/PhasorDynamics/Load/LoadZ/LoadZImpl.hpp index f3708e491..c7ce06fd2 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadZ/LoadZImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadZ/LoadZImpl.hpp @@ -171,7 +171,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) int LoadZ::evaluateBusResidual( + FORCE_INLINE int LoadZ::evaluateBusResidual( const ScalarT* y, [[maybe_unused]] const ScalarT* yp, [[maybe_unused]] const ScalarT* wb, @@ -190,7 +190,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) int LoadZ::evaluateInternalResidual( + FORCE_INLINE int LoadZ::evaluateInternalResidual( const ScalarT* y, [[maybe_unused]] const ScalarT* yp, const ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/Load/LoadZIP/LoadZIP.hpp b/GridKit/Model/PhasorDynamics/Load/LoadZIP/LoadZIP.hpp index 5387e6f27..b779964cc 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadZIP/LoadZIP.hpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadZIP/LoadZIP.hpp @@ -127,9 +127,9 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; public: - __attribute__((always_inline)) inline int evaluateBusResidual( + FORCE_INLINE int evaluateBusResidual( const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); private: diff --git a/GridKit/Model/PhasorDynamics/Load/LoadZIP/LoadZIPImpl.hpp b/GridKit/Model/PhasorDynamics/Load/LoadZIP/LoadZIPImpl.hpp index 58058b07c..795057df4 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadZIP/LoadZIPImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadZIP/LoadZIPImpl.hpp @@ -192,7 +192,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) int LoadZIP::evaluateBusResidual( + FORCE_INLINE int LoadZIP::evaluateBusResidual( const ScalarT* y, [[maybe_unused]] const ScalarT* yp, [[maybe_unused]] const ScalarT* wb, @@ -236,7 +236,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) int LoadZIP::evaluateInternalResidual( + FORCE_INLINE int LoadZIP::evaluateInternalResidual( const ScalarT* y, [[maybe_unused]] const ScalarT* yp, const ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp index f77935130..6ed6f22e0 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp @@ -112,7 +112,7 @@ namespace GridKit const Model::VariableMonitorBase* getMonitor() const override; - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( const ScalarT*, const ScalarT*, const ScalarT*, diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestImpl.hpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestImpl.hpp index 970907ab0..5600ea99f 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestImpl.hpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/IeeestImpl.hpp @@ -273,7 +273,7 @@ namespace GridKit } template - __attribute__((always_inline)) inline int Ieeest::evaluateInternalResidual( + FORCE_INLINE int Ieeest::evaluateInternalResidual( const ScalarT* y, const ScalarT* yp, [[maybe_unused]] const ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROU/Genrou.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROU/Genrou.hpp index 75e765b24..f6d4fb7a9 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROU/Genrou.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROU/Genrou.hpp @@ -201,9 +201,9 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( const ScalarT*, const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual( + FORCE_INLINE int evaluateBusResidual( const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); private: diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROU/GenrouImpl.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROU/GenrouImpl.hpp index 2d933043d..ca21f6911 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROU/GenrouImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROU/GenrouImpl.hpp @@ -551,7 +551,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Genrou::evaluateInternalResidual( + FORCE_INLINE int Genrou::evaluateInternalResidual( const ScalarT* y, const ScalarT* yp, const ScalarT* wb, @@ -631,7 +631,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Genrou::evaluateBusResidual( + FORCE_INLINE int Genrou::evaluateBusResidual( const ScalarT* y, [[maybe_unused]] const ScalarT* yp, [[maybe_unused]] const ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSAL/Gensal.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSAL/Gensal.hpp index 2060834ef..ea3453ab5 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSAL/Gensal.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSAL/Gensal.hpp @@ -166,9 +166,9 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( const ScalarT*, const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual( + FORCE_INLINE int evaluateBusResidual( const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); private: diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSAL/GensalImpl.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSAL/GensalImpl.hpp index ebb3f1471..9875bffcc 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSAL/GensalImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSAL/GensalImpl.hpp @@ -381,7 +381,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Gensal::evaluateInternalResidual( + FORCE_INLINE int Gensal::evaluateInternalResidual( const ScalarT* y, const ScalarT* yp, const ScalarT* wb, @@ -454,7 +454,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) inline int Gensal::evaluateBusResidual( + FORCE_INLINE int Gensal::evaluateBusResidual( const ScalarT* y, [[maybe_unused]] const ScalarT* yp, [[maybe_unused]] const ScalarT* wb, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp index 14ba8ce36..27cc6be73 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp @@ -145,9 +145,9 @@ namespace GridKit } public: - __attribute__((always_inline)) inline int evaluateInternalResidual( + FORCE_INLINE int evaluateInternalResidual( const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); - __attribute__((always_inline)) inline int evaluateBusResidual( + FORCE_INLINE int evaluateBusResidual( const ScalarT*, const ScalarT*, const ScalarT*, ScalarT*); private: diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalImpl.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalImpl.hpp index 5bd9ab0eb..8621b5217 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalImpl.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassicalImpl.hpp @@ -280,7 +280,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) int GenClassical::evaluateInternalResidual( + FORCE_INLINE int GenClassical::evaluateInternalResidual( const ScalarT* y, const ScalarT* yp, const ScalarT* wb, @@ -323,7 +323,7 @@ namespace GridKit * */ template - __attribute__((always_inline)) int GenClassical::evaluateBusResidual( + FORCE_INLINE int GenClassical::evaluateBusResidual( const ScalarT* y, [[maybe_unused]] const ScalarT* yp, [[maybe_unused]] const ScalarT* wb, diff --git a/GridKit/Utilities/CliArgs/CliArgsImpl.hpp b/GridKit/Utilities/CliArgs/CliArgsImpl.hpp index 000238b20..017c1f0f1 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[]) { - app_name_ = std::filesystem::path(argv[0]).filename(); +#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) diff --git a/GridKit/Utilities/String.hpp b/GridKit/Utilities/String.hpp index 1a559cf77..d2d402f54 100644 --- a/GridKit/Utilities/String.hpp +++ b/GridKit/Utilities/String.hpp @@ -12,14 +12,14 @@ 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); }); return str; } - std::string strip(std::string str) + inline std::string strip(std::string str) { auto notspace = [](char c) { return !std::isspace(c); }; diff --git a/INSTALL.md b/INSTALL.md index 26e3e90c2..fa25250d0 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -78,11 +78,18 @@ cmake ../GridKit \ ### Running tests +On Linux: ```sh cd build ctest --output-on-failure ``` +On Windows: +```powershell +cd build +ctest -C Debug --output-on-failure +``` + ### Testing the installation After installing, you can verify that the installed CMake configuration is @@ -103,6 +110,8 @@ are placed under that consumer directory. This target must be run **after** `cmake --install` because it depends on the installed headers, libraries, and CMake config files. +On MSVC, use `cmake --build . --target test_install` instead. + --- ## CMake options diff --git a/cmake/GridkitAddLibrary.cmake b/cmake/GridkitAddLibrary.cmake index 0ffc6b6e0..1b8b54f32 100644 --- a/cmake/GridkitAddLibrary.cmake +++ b/cmake/GridkitAddLibrary.cmake @@ -74,6 +74,15 @@ macro(gridkit_add_library target) target_include_directories(${target} ${gridkit_add_library_INCLUDE_DIRECTORIES}) endif() + # add FORCE_INLINE macro + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + target_compile_definitions(${target} INTERFACE FORCE_INLINE=[[gnu::always_inline]]\ inline) + elseif(MSVC) + target_compile_definitions(${target} INTERFACE FORCE_INLINE=[[msvc::forceinline]]\ inline) + else() + target_compile_definitions(${target} INTERFACE FORCE_INLINE=inline) + endif() + # add compile options target_compile_features(${target} INTERFACE cxx_std_20) target_compile_options(${target} INTERFACE ${GRIDKIT_COMPILE_OPTIONS}) diff --git a/examples/Consumer/CMakeLists.txt b/examples/Consumer/CMakeLists.txt index 141e9ec42..7ac56f0d8 100644 --- a/examples/Consumer/CMakeLists.txt +++ b/examples/Consumer/CMakeLists.txt @@ -3,7 +3,7 @@ set(_rel_consumer_path ${GRIDKIT_EXAMPLES_INSTALL_ROOT}/GridKitConsumer) set(_abs_consumer_path ${CMAKE_INSTALL_PREFIX}/${_rel_consumer_path}) # Install script as example of how to build and test consumer project -install(PROGRAMS test.sh DESTINATION ${_rel_consumer_path}) +install(PROGRAMS test.sh test.ps1 DESTINATION ${_rel_consumer_path}) # Install consumer code and set link libraries set(_examples_dir ${CMAKE_SOURCE_DIR}/examples) @@ -39,8 +39,15 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/GridKitConsumer/CMakeLists.txt DESTINATION ${_rel_consumer_path}) # Add target to build and test the example project after install -add_custom_target( - test_install - COMMAND - ${_abs_consumer_path}/test.sh ${CMAKE_INSTALL_PREFIX} ${CMAKE_CXX_COMPILER} - "${CMAKE_CXX_FLAGS}") +if(WIN32) + add_custom_target( + test_install + COMMAND + powershell -NoProfile -ExecutionPolicy Bypass -File "${_abs_consumer_path}/test.ps1" + "${CMAKE_INSTALL_PREFIX}" "${CMAKE_CXX_COMPILER}" + USES_TERMINAL) +else() + add_custom_target( + test_install + COMMAND ${_abs_consumer_path}/test.sh ${CMAKE_INSTALL_PREFIX} ${CMAKE_CXX_COMPILER}) +endif() diff --git a/examples/Consumer/test.ps1 b/examples/Consumer/test.ps1 new file mode 100644 index 000000000..b5612e904 --- /dev/null +++ b/examples/Consumer/test.ps1 @@ -0,0 +1,41 @@ +# This script gets executed in `make test_install`. + +# GridKit install prefix used for CMake dependency finding +$env:GridKit_DIR = $args[0] +echo "GridKit_DIR: ${env:GridKit_DIR}" + +$env:COMPILER = $args[1] + +# Locate source of the consumer test app +$env:INSTALL_BUILD_CONSUME = "${env:GridKit_DIR}/share/gridkit/examples/GridKitConsumer" +echo "Consumer directory: ${env:INSTALL_BUILD_CONSUME}" + +# Create build directory +New-Item -ItemType Directory -Force -Path "${env:INSTALL_BUILD_CONSUME}/build" | Out-Null + +Remove-Item -Recurse -Force "${env:INSTALL_BUILD_CONSUME}/build/*" + +# Configure consumer project +cmake -B "${env:INSTALL_BUILD_CONSUME}/build" ` + -S "${env:INSTALL_BUILD_CONSUME}" ` + "-DCMAKE_CXX_COMPILER=${env:COMPILER}" ` + "-DGridKit_DIR=${env:GridKit_DIR}" + +# Build and install +cmake --build "${env:INSTALL_BUILD_CONSUME}/build" + +cmake --install "${env:INSTALL_BUILD_CONSUME}/build" + +# Check +cd "${env:INSTALL_BUILD_CONSUME}/build" + +# Get build configuration (Debug or Release) +$config = "Debug" # Default +$buildTypeLine = Get-Content "CMakeCache.txt" | Select-String "^CMAKE_BUILD_TYPE:STRING=(.*)$" +if ($buildTypeLine -and $buildTypeLine.Matches.Groups[1].Value) { + $config = $buildTypeLine.Matches.Groups[1].Value +} + +ctest -C $config --output-on-failure + +exit $LASTEXITCODE diff --git a/tests/UnitTests/AutomaticDifferentiation/Enzyme/EnzymeTests.hpp b/tests/UnitTests/AutomaticDifferentiation/Enzyme/EnzymeTests.hpp index 79696db29..13172d916 100644 --- a/tests/UnitTests/AutomaticDifferentiation/Enzyme/EnzymeTests.hpp +++ b/tests/UnitTests/AutomaticDifferentiation/Enzyme/EnzymeTests.hpp @@ -118,7 +118,7 @@ namespace GridKit return 2.0 * x; } - __attribute__((always_inline)) static void vectorFunction(IdxT N, ScalarT* x, ScalarT* y) + FORCE_INLINE static void vectorFunction(IdxT N, ScalarT* x, ScalarT* y) { for (IdxT idx = 0; idx < N; ++idx) {