From ceafd596f84682ab000440fe575b448a32d815bc Mon Sep 17 00:00:00 2001 From: pelesh Date: Fri, 16 Oct 2026 22:34:32 -0400 Subject: [PATCH 1/4] Limit scope of template aliases --- CONTRIBUTING.md | 21 ++++++---- .../AutomaticDifferentiation/Enzyme/DfDwb.hpp | 7 ++-- .../AutomaticDifferentiation/Enzyme/DfDws.hpp | 7 ++-- .../AutomaticDifferentiation/Enzyme/DfDy.hpp | 7 ++-- .../AutomaticDifferentiation/Enzyme/DfDyp.hpp | 7 ++-- .../AutomaticDifferentiation/Enzyme/DhDwb.hpp | 7 ++-- .../AutomaticDifferentiation/Enzyme/DhDy.hpp | 7 ++-- .../Enzyme/ModelWrappers.hpp | 16 ++++---- GridKit/Model/EvaluatorTraits.hpp | 40 +++++++++++++++++++ .../Model/PhasorDynamics/Branch/Branch.hpp | 3 +- GridKit/Model/PhasorDynamics/Bus/Bus.hpp | 3 +- .../Model/PhasorDynamics/Bus/BusFactory.hpp | 3 +- .../Model/PhasorDynamics/Bus/BusInfinite.hpp | 3 +- .../BusSignalVoltageIn/BusSignalVoltageIn.hpp | 3 +- .../BusSignalVoltageOut.hpp | 3 +- .../PhasorDynamics/Controller/REECB/Reecb.hpp | 3 +- .../PhasorDynamics/Controller/REPCA/Repca.hpp | 3 +- .../PhasorDynamics/Converter/REGCA/Regca.hpp | 3 +- .../PhasorDynamics/Exciter/ESDC1A/Esdc1a.hpp | 3 +- .../PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp | 3 +- .../Exciter/SEXS-PTI/SexsPti.hpp | 3 +- .../Governor/GASTPTI/GastPti.hpp | 3 +- .../PhasorDynamics/Governor/HYGOV/Hygov.hpp | 3 +- .../PhasorDynamics/Governor/Tgov1/Tgov1.hpp | 3 +- .../Model/PhasorDynamics/Load/LoadZ/LoadZ.hpp | 3 +- .../PhasorDynamics/Load/LoadZIP/LoadZIP.hpp | 3 +- .../SignalSource/ConstantSignalSource.hpp | 3 +- .../SignalSource/FunctionSignalSource.hpp | 3 +- .../Stabilizer/IEEEST/Ieeest.hpp | 3 +- .../SynchronousMachine/GENROU/Genrou.hpp | 3 +- .../SynchronousMachine/GENSAL/Gensal.hpp | 3 +- .../GenClassical/GenClassical.hpp | 3 +- GridKit/Model/PhasorDynamics/SystemModel.hpp | 3 +- .../UnitTests/PhasorDynamics/BranchTests.hpp | 5 ++- .../BusSignalVoltageInTests.hpp | 5 ++- .../BusSignalVoltageOutTests.hpp | 5 ++- tests/UnitTests/PhasorDynamics/BusTests.hpp | 3 +- .../PhasorDynamics/ExciterEsdc1aTests.hpp | 4 +- .../PhasorDynamics/GovernorGastPtiTests.hpp | 4 +- 39 files changed, 152 insertions(+), 65 deletions(-) create mode 100644 GridKit/Model/EvaluatorTraits.hpp diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 351ccec6b2..c4788c9d96 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -348,25 +348,32 @@ rather than `class` for template type parameters. template ...; // Yes ``` -Types used within class implementation code and provided in the public class -interface should use `UpperCamelT` format, similar to class names, but with a -`T` suffix. For consistency, create aliases for template type parameters -(*e.g.,* `using ScalarT = scalar_type;`) and use the same name everywhere the -same type is used. This applies across multiple classes in which the type has -the same meaning. +Types used within class implementation code should use `UpperCamelT` format, +similar to class names, but with a `T` suffix. For consistency, create aliases +for template type parameters (*e.g.,* `using ScalarT = scalar_type;`) and use +the same name everywhere the same type is used. This applies across multiple +classes in which the type has the same meaning. + +These aliases are implementation details of the class that declares them, so +keep them `private`. Only make an alias `public` (or `protected`) when other +code must name it through the class, for example a base class alias that +derived classes re-export, a data struct whose aliases a concept inspects, or a +type that another class reads as `OtherClass::SomeT`. ```c++ template class ExTemp { + private: // Convention used in all applicable classes for scalar, index, and // primitive floating-point types using ScalarT = scalar_type; using IdxT = index_type; using RealT = GridKit::ScalarTraits::RealT; + public: // void foo(scalar_type value); // No, using template type parameter - void foo(ScalarT value); // Yes, using interface types in code + void foo(ScalarT value); // Yes, using the class aliases in code }; ``` diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp index fb28f4954e..79e162dcc5 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDwb.hpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace GridKit { @@ -25,9 +26,9 @@ namespace GridKit template struct DfDwb { - using ScalarT = typename ModelT::ScalarT; - using IdxT = typename ModelT::IdxT; - using RealT = typename ModelT::RealT; + using ScalarT = typename GridKit::Model::EvaluatorTraits::ScalarT; + using IdxT = typename GridKit::Model::EvaluatorTraits::IdxT; + using RealT = typename GridKit::Model::EvaluatorTraits::RealT; /** * @param[in] model - Pointer to the model to be differentiated diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp index 5640f76263..2439601b19 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDws.hpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace GridKit { @@ -25,9 +26,9 @@ namespace GridKit template struct DfDws { - using ScalarT = typename ModelT::ScalarT; - using IdxT = typename ModelT::IdxT; - using RealT = typename ModelT::RealT; + using ScalarT = typename GridKit::Model::EvaluatorTraits::ScalarT; + using IdxT = typename GridKit::Model::EvaluatorTraits::IdxT; + using RealT = typename GridKit::Model::EvaluatorTraits::RealT; /** * @param[in] model - Pointer to the model to be differentiated diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp index 90c26e5e91..21f1060d65 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDy.hpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace GridKit { @@ -25,9 +26,9 @@ namespace GridKit template struct DfDy { - using ScalarT = typename ModelT::ScalarT; - using IdxT = typename ModelT::IdxT; - using RealT = typename ModelT::RealT; + using ScalarT = typename GridKit::Model::EvaluatorTraits::ScalarT; + using IdxT = typename GridKit::Model::EvaluatorTraits::IdxT; + using RealT = typename GridKit::Model::EvaluatorTraits::RealT; /** * @param[in] model - Pointer to the model to be differentiated diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp index 7da906eefe..f24a250b9f 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DfDyp.hpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace GridKit { @@ -25,9 +26,9 @@ namespace GridKit template struct DfDyp { - using ScalarT = typename ModelT::ScalarT; - using IdxT = typename ModelT::IdxT; - using RealT = typename ModelT::RealT; + using ScalarT = typename GridKit::Model::EvaluatorTraits::ScalarT; + using IdxT = typename GridKit::Model::EvaluatorTraits::IdxT; + using RealT = typename GridKit::Model::EvaluatorTraits::RealT; /** * @param[in] model - Pointer to the model to be differentiated diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp index b481c80ae8..ac06194015 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DhDwb.hpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace GridKit { @@ -25,9 +26,9 @@ namespace GridKit template struct DhDwb { - using ScalarT = typename ModelT::ScalarT; - using IdxT = typename ModelT::IdxT; - using RealT = typename ModelT::RealT; + using ScalarT = typename GridKit::Model::EvaluatorTraits::ScalarT; + using IdxT = typename GridKit::Model::EvaluatorTraits::IdxT; + using RealT = typename GridKit::Model::EvaluatorTraits::RealT; /** * @param[in] model - Pointer to the model to be differentiated diff --git a/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp b/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp index 82bdc78739..30cdb98af1 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/DhDy.hpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace GridKit { @@ -25,9 +26,9 @@ namespace GridKit template struct DhDy { - using ScalarT = typename ModelT::ScalarT; - using IdxT = typename ModelT::IdxT; - using RealT = typename ModelT::RealT; + using ScalarT = typename GridKit::Model::EvaluatorTraits::ScalarT; + using IdxT = typename GridKit::Model::EvaluatorTraits::IdxT; + using RealT = typename GridKit::Model::EvaluatorTraits::RealT; /** * @param[in] model - Pointer to the model to be differentiated diff --git a/GridKit/AutomaticDifferentiation/Enzyme/ModelWrappers.hpp b/GridKit/AutomaticDifferentiation/Enzyme/ModelWrappers.hpp index d53a653e65..370fbe37fc 100644 --- a/GridKit/AutomaticDifferentiation/Enzyme/ModelWrappers.hpp +++ b/GridKit/AutomaticDifferentiation/Enzyme/ModelWrappers.hpp @@ -8,6 +8,8 @@ #include +#include + namespace GridKit { namespace Enzyme @@ -48,7 +50,7 @@ namespace GridKit template struct ModelWrapper { - using ScalarT = typename ModelT::ScalarT; + using ScalarT = typename GridKit::Model::EvaluatorTraits::ScalarT; /** * @param[in] model - Pointer to the model to be differentiated @@ -74,7 +76,7 @@ namespace GridKit template struct ModelWrapper { - using ScalarT = typename ModelT::ScalarT; + using ScalarT = typename GridKit::Model::EvaluatorTraits::ScalarT; /** * @param[in] model - Pointer to the model to be differentiated @@ -102,7 +104,7 @@ namespace GridKit template struct ModelWrapper { - using ScalarT = typename ModelT::ScalarT; + using ScalarT = typename GridKit::Model::EvaluatorTraits::ScalarT; /** * @param[in] model - Pointer to the model to be differentiated @@ -128,7 +130,7 @@ namespace GridKit template struct ModelWrapper { - using ScalarT = typename ModelT::ScalarT; + using ScalarT = typename GridKit::Model::EvaluatorTraits::ScalarT; /** * @param[in] model - Pointer to the model to be differentiated @@ -154,7 +156,7 @@ namespace GridKit template struct ModelWrapper { - using ScalarT = typename ModelT::ScalarT; + using ScalarT = typename GridKit::Model::EvaluatorTraits::ScalarT; /** * @param[in] model - Pointer to the model to be differentiated @@ -180,7 +182,7 @@ namespace GridKit template struct ModelWrapper { - using ScalarT = typename ModelT::ScalarT; + using ScalarT = typename GridKit::Model::EvaluatorTraits::ScalarT; /** * @param[in] model - Pointer to the model to be differentiated @@ -207,7 +209,7 @@ namespace GridKit template struct ModelWrapper { - using ScalarT = typename ModelT::ScalarT; + using ScalarT = typename GridKit::Model::EvaluatorTraits::ScalarT; /** * @param[in] model - Pointer to the model to be differentiated diff --git a/GridKit/Model/EvaluatorTraits.hpp b/GridKit/Model/EvaluatorTraits.hpp new file mode 100644 index 0000000000..727e2b8135 --- /dev/null +++ b/GridKit/Model/EvaluatorTraits.hpp @@ -0,0 +1,40 @@ +/** + * @file EvaluatorTraits.hpp + * @brief Scalar and index types of a model, taken from its Evaluator base. + */ + +#pragma once + +#include + +#include + +namespace GridKit +{ + namespace Model + { + /** + * @brief Exposes the scalar, index, and real types of any model that + * publicly derives from Evaluator. + * + * Model classes keep their own type aliases private, so generic code + * (for example the Enzyme Jacobian evaluators) obtains the types through + * this trait instead of through the model class. + * + * @tparam model_type Model type derived from Evaluator + */ + template + struct EvaluatorTraits + { + private: + template + static Evaluator probe(const Evaluator&); + + public: + using EvaluatorT = decltype(probe(std::declval())); + using ScalarT = typename EvaluatorT::ScalarT; + using IdxT = typename EvaluatorT::IdxT; + using RealT = typename EvaluatorT::RealT; + }; + } // namespace Model +} // namespace GridKit diff --git a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp index 69c50eab36..33160f6f52 100644 --- a/GridKit/Model/PhasorDynamics/Branch/Branch.hpp +++ b/GridKit/Model/PhasorDynamics/Branch/Branch.hpp @@ -45,7 +45,7 @@ namespace GridKit using Component::residual_indices_; using Component::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -53,6 +53,7 @@ namespace GridKit using ModelDataT = BranchData; using MonitorT = Model::VariableMonitor; + public: Branch(BusT* bus1, BusT* bus2); Branch(BusT* bus1, BusT* bus2, diff --git a/GridKit/Model/PhasorDynamics/Bus/Bus.hpp b/GridKit/Model/PhasorDynamics/Bus/Bus.hpp index 0c504712e5..468236b693 100644 --- a/GridKit/Model/PhasorDynamics/Bus/Bus.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/Bus.hpp @@ -32,7 +32,7 @@ namespace GridKit using BusBase::monitor_; using BusBase::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename BusBase::RealT; @@ -41,6 +41,7 @@ namespace GridKit using ModelDataT = BusData; using BusTypeT = typename BusData::BusType; + public: Bus(); Bus(ScalarT Vr, ScalarT Vi); Bus(const ModelDataT& data); diff --git a/GridKit/Model/PhasorDynamics/Bus/BusFactory.hpp b/GridKit/Model/PhasorDynamics/Bus/BusFactory.hpp index 682f10d477..5daef28935 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusFactory.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusFactory.hpp @@ -15,7 +15,7 @@ namespace GridKit template class BusFactory { - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Model::Evaluator::RealT; @@ -23,6 +23,7 @@ namespace GridKit using BusData = GridKit::PhasorDynamics::BusData; using BusTypeT = typename GridKit::PhasorDynamics::BusData::BusType; + public: BusFactory() = delete; static BusBase* create(const BusData& data, SignalNodeSetT& signal_nodes) diff --git a/GridKit/Model/PhasorDynamics/Bus/BusInfinite.hpp b/GridKit/Model/PhasorDynamics/Bus/BusInfinite.hpp index 776172f0df..287681e29f 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusInfinite.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusInfinite.hpp @@ -28,7 +28,7 @@ namespace GridKit using BusBase::monitor_; using BusBase::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename BusBase::RealT; @@ -37,6 +37,7 @@ namespace GridKit using ModelDataT = BusData; using BusTypeT = typename BusData::BusType; + public: BusInfinite(); BusInfinite(ScalarT Vr, ScalarT Vi); BusInfinite(const ModelDataT& data); diff --git a/GridKit/Model/PhasorDynamics/Bus/BusSignalVoltageIn/BusSignalVoltageIn.hpp b/GridKit/Model/PhasorDynamics/Bus/BusSignalVoltageIn/BusSignalVoltageIn.hpp index ac0f7ee800..f6cea3ca32 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusSignalVoltageIn/BusSignalVoltageIn.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusSignalVoltageIn/BusSignalVoltageIn.hpp @@ -51,7 +51,7 @@ namespace GridKit using BusBase::monitor_; using BusBase::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename BusBase::RealT; @@ -61,6 +61,7 @@ namespace GridKit using BusTypeT = typename BusData::BusType; using SignalPortsT = SignalPorts; + public: BusSignalVoltageIn(); /// Initial voltage arguments are ignored; the voltage comes from signals. BusSignalVoltageIn(ScalarT Vr, ScalarT Vi); diff --git a/GridKit/Model/PhasorDynamics/Bus/BusSignalVoltageOut/BusSignalVoltageOut.hpp b/GridKit/Model/PhasorDynamics/Bus/BusSignalVoltageOut/BusSignalVoltageOut.hpp index 553fb73b65..e951eb9b24 100644 --- a/GridKit/Model/PhasorDynamics/Bus/BusSignalVoltageOut/BusSignalVoltageOut.hpp +++ b/GridKit/Model/PhasorDynamics/Bus/BusSignalVoltageOut/BusSignalVoltageOut.hpp @@ -50,7 +50,7 @@ namespace GridKit using BusBase::monitor_; using BusBase::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename BusBase::RealT; @@ -60,6 +60,7 @@ namespace GridKit using BusTypeT = typename BusData::BusType; using SignalPortsT = SignalPorts; + public: BusSignalVoltageOut(); BusSignalVoltageOut(ScalarT Vr, ScalarT Vi); BusSignalVoltageOut(const ModelDataT& data); diff --git a/GridKit/Model/PhasorDynamics/Controller/REECB/Reecb.hpp b/GridKit/Model/PhasorDynamics/Controller/REECB/Reecb.hpp index 20e9e618be..99e7a3b22f 100644 --- a/GridKit/Model/PhasorDynamics/Controller/REECB/Reecb.hpp +++ b/GridKit/Model/PhasorDynamics/Controller/REECB/Reecb.hpp @@ -94,7 +94,7 @@ namespace GridKit using Component::y_; using Component::yp_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -106,6 +106,7 @@ namespace GridKit using InternalVariablesT = ReecbInternalVariables; using ExternalVariablesT = ReecbExternalVariables; + public: /// Initialization reconstruction tolerance. static constexpr RealT INITIALIZATION_TOLERANCE = static_cast(100.0) * std::numeric_limits::epsilon(); diff --git a/GridKit/Model/PhasorDynamics/Controller/REPCA/Repca.hpp b/GridKit/Model/PhasorDynamics/Controller/REPCA/Repca.hpp index 78a7bae669..79e3131ab7 100644 --- a/GridKit/Model/PhasorDynamics/Controller/REPCA/Repca.hpp +++ b/GridKit/Model/PhasorDynamics/Controller/REPCA/Repca.hpp @@ -100,7 +100,7 @@ namespace GridKit using Component::y_; using Component::yp_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -113,6 +113,7 @@ namespace GridKit using InternalVariablesT = RepcaInternalVariables; using ExternalVariablesT = RepcaExternalVariables; + public: static constexpr RealT INITIALIZATION_TOLERANCE = static_cast(1.0e-12); Repca(BusT* bus); diff --git a/GridKit/Model/PhasorDynamics/Converter/REGCA/Regca.hpp b/GridKit/Model/PhasorDynamics/Converter/REGCA/Regca.hpp index 61f23966d6..e8224c6320 100644 --- a/GridKit/Model/PhasorDynamics/Converter/REGCA/Regca.hpp +++ b/GridKit/Model/PhasorDynamics/Converter/REGCA/Regca.hpp @@ -85,7 +85,7 @@ namespace GridKit using Component::y_; using Component::yp_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -98,6 +98,7 @@ namespace GridKit using InternalVariablesT = RegcaInternalVariables; using ExternalVariablesT = RegcaExternalVariables; + public: Regca(BusT* bus); Regca(BusT* bus, const ModelDataT& data); ~Regca(); diff --git a/GridKit/Model/PhasorDynamics/Exciter/ESDC1A/Esdc1a.hpp b/GridKit/Model/PhasorDynamics/Exciter/ESDC1A/Esdc1a.hpp index 7e9fba6328..d27d59f5d7 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/ESDC1A/Esdc1a.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/ESDC1A/Esdc1a.hpp @@ -80,7 +80,7 @@ namespace GridKit using Component::y_; using Component::yp_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -93,6 +93,7 @@ namespace GridKit using InternalVariablesT = Esdc1aInternalVariables; using ExternalVariablesT = Esdc1aExternalVariables; + public: Esdc1a(BusT* bus); Esdc1a(BusT* bus, const ModelDataT& data); ~Esdc1a(); diff --git a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp index 66a4057626..cf58a4da91 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/IEEET1/Ieeet1.hpp @@ -71,7 +71,7 @@ namespace GridKit using Component::residual_indices_; using Component::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -81,6 +81,7 @@ namespace GridKit using SignalPortsT = SignalPorts; using MonitorT = Model::VariableMonitor; + public: Ieeet1(BusT* bus); Ieeet1(BusT* bus, const ModelDataT& data); ~Ieeet1(); diff --git a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp index 30801c1acd..0ce660283b 100644 --- a/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp +++ b/GridKit/Model/PhasorDynamics/Exciter/SEXS-PTI/SexsPti.hpp @@ -58,7 +58,7 @@ namespace GridKit using Component::residual_indices_; using Component::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -68,6 +68,7 @@ namespace GridKit using SignalPortsT = SignalPorts; using MonitorT = Model::VariableMonitor; + public: SexsPti(BusT* bus); SexsPti(BusT* bus, const ModelDataT& data); ~SexsPti(); diff --git a/GridKit/Model/PhasorDynamics/Governor/GASTPTI/GastPti.hpp b/GridKit/Model/PhasorDynamics/Governor/GASTPTI/GastPti.hpp index 074bb2caa1..1c0573bdc8 100644 --- a/GridKit/Model/PhasorDynamics/Governor/GASTPTI/GastPti.hpp +++ b/GridKit/Model/PhasorDynamics/Governor/GASTPTI/GastPti.hpp @@ -71,7 +71,7 @@ namespace GridKit using Component::y_; using Component::yp_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -82,6 +82,7 @@ namespace GridKit using SignalPortsT = SignalPorts; using SignalNodeSetT = SignalNodeSet; + public: GastPti(); explicit GastPti(const ModelDataT& data); ~GastPti(); diff --git a/GridKit/Model/PhasorDynamics/Governor/HYGOV/Hygov.hpp b/GridKit/Model/PhasorDynamics/Governor/HYGOV/Hygov.hpp index 108f4972d8..6566bce2db 100644 --- a/GridKit/Model/PhasorDynamics/Governor/HYGOV/Hygov.hpp +++ b/GridKit/Model/PhasorDynamics/Governor/HYGOV/Hygov.hpp @@ -81,7 +81,7 @@ namespace GridKit using Component::y_; using Component::yp_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -93,6 +93,7 @@ namespace GridKit using InternalVariablesT = HygovInternalVariables; using ExternalVariablesT = HygovExternalVariables; + public: Hygov(); explicit Hygov(const ModelDataT& data); ~Hygov(); diff --git a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp index 84b7f260dc..f9813545ab 100644 --- a/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp +++ b/GridKit/Model/PhasorDynamics/Governor/Tgov1/Tgov1.hpp @@ -62,7 +62,7 @@ namespace GridKit using Component::residual_indices_; using Component::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -71,6 +71,7 @@ namespace GridKit using SignalNodeT = SignalNodeSetT::SignalNodeT; using SignalPortsT = SignalPorts; + public: Tgov1(); Tgov1(SignalNodeT*, SignalNodeT*); Tgov1(const ModelDataT&); diff --git a/GridKit/Model/PhasorDynamics/Load/LoadZ/LoadZ.hpp b/GridKit/Model/PhasorDynamics/Load/LoadZ/LoadZ.hpp index bdbb5e8a98..4b63019715 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadZ/LoadZ.hpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadZ/LoadZ.hpp @@ -35,7 +35,7 @@ namespace GridKit using Component::residual_indices_; using Component::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -43,6 +43,7 @@ namespace GridKit using ModelDataT = LoadZData; using MonitorT = Model::VariableMonitor; + public: LoadZ(BusT* bus); LoadZ(BusT* bus, RealT R, RealT X); LoadZ(BusT* bus, const ModelDataT& data); diff --git a/GridKit/Model/PhasorDynamics/Load/LoadZIP/LoadZIP.hpp b/GridKit/Model/PhasorDynamics/Load/LoadZIP/LoadZIP.hpp index 86090bca76..ce68272ca1 100644 --- a/GridKit/Model/PhasorDynamics/Load/LoadZIP/LoadZIP.hpp +++ b/GridKit/Model/PhasorDynamics/Load/LoadZIP/LoadZIP.hpp @@ -35,7 +35,7 @@ namespace GridKit using Component::residual_indices_; using Component::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -43,6 +43,7 @@ namespace GridKit using ModelDataT = LoadZIPData; using MonitorT = Model::VariableMonitor; + public: LoadZIP(BusT* bus); LoadZIP(BusT* bus, RealT Pnom, RealT Qnom, RealT alphaI, RealT alphaP); LoadZIP(BusT* bus, const ModelDataT& data); diff --git a/GridKit/Model/PhasorDynamics/SignalSource/ConstantSignalSource.hpp b/GridKit/Model/PhasorDynamics/SignalSource/ConstantSignalSource.hpp index d3f1023f0a..03ef838866 100644 --- a/GridKit/Model/PhasorDynamics/SignalSource/ConstantSignalSource.hpp +++ b/GridKit/Model/PhasorDynamics/SignalSource/ConstantSignalSource.hpp @@ -31,7 +31,7 @@ namespace GridKit using Component::size_; using Component::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -39,6 +39,7 @@ namespace GridKit using SignalNodeSetT = SignalNodeSet; using SignalPortsT = SignalPorts; + public: ConstantSignalSource(); ConstantSignalSource(const ModelDataT& data); ~ConstantSignalSource(); diff --git a/GridKit/Model/PhasorDynamics/SignalSource/FunctionSignalSource.hpp b/GridKit/Model/PhasorDynamics/SignalSource/FunctionSignalSource.hpp index 085bf25590..0aa9d1345e 100644 --- a/GridKit/Model/PhasorDynamics/SignalSource/FunctionSignalSource.hpp +++ b/GridKit/Model/PhasorDynamics/SignalSource/FunctionSignalSource.hpp @@ -33,7 +33,7 @@ namespace GridKit using Component::size_; using Component::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -42,6 +42,7 @@ namespace GridKit using SignalNodeSetT = SignalNodeSet; using SignalPortsT = SignalPorts; + public: FunctionSignalSource(); FunctionSignalSource(const ModelDataT& data); ~FunctionSignalSource(); diff --git a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp index 9d7bc8c54f..49eaace419 100644 --- a/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp +++ b/GridKit/Model/PhasorDynamics/Stabilizer/IEEEST/Ieeest.hpp @@ -65,7 +65,7 @@ namespace GridKit using Component::residual_indices_; using Component::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -74,6 +74,7 @@ namespace GridKit using SignalPortsT = SignalPorts; using MonitorT = Model::VariableMonitor; + public: Ieeest(); Ieeest(const ModelDataT& data); ~Ieeest(); diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROU/Genrou.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROU/Genrou.hpp index f8fd7ec340..cd31bf29b3 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROU/Genrou.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENROU/Genrou.hpp @@ -75,7 +75,7 @@ namespace GridKit using Component::residual_indices_; using Component::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -86,6 +86,7 @@ namespace GridKit using SignalPortsT = SignalPorts; using MonitorT = Model::VariableMonitor; + public: Genrou(BusT* bus); Genrou(BusT* bus, SignalNodeT* omega, diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSAL/Gensal.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSAL/Gensal.hpp index 9dff277405..970fc563fc 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSAL/Gensal.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GENSAL/Gensal.hpp @@ -71,7 +71,7 @@ namespace GridKit using Component::residual_indices_; using Component::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -82,6 +82,7 @@ namespace GridKit using SignalPortsT = SignalPorts; using MonitorT = Model::VariableMonitor; + public: Gensal(BusT* bus, const ModelDataT& data); ~Gensal(); diff --git a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp index b5f5163f0d..b307d417e5 100644 --- a/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp +++ b/GridKit/Model/PhasorDynamics/SynchronousMachine/GenClassical/GenClassical.hpp @@ -62,7 +62,7 @@ namespace GridKit using Component::residual_indices_; using Component::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Component::RealT; @@ -71,6 +71,7 @@ namespace GridKit using SignalPortsT = SignalPorts; using MonitorT = Model::VariableMonitor; + public: GenClassical(BusT* bus, const ModelDataT& data); ~GenClassical(); diff --git a/GridKit/Model/PhasorDynamics/SystemModel.hpp b/GridKit/Model/PhasorDynamics/SystemModel.hpp index 0748b9be02..ce4d13cdd2 100644 --- a/GridKit/Model/PhasorDynamics/SystemModel.hpp +++ b/GridKit/Model/PhasorDynamics/SystemModel.hpp @@ -58,7 +58,7 @@ namespace GridKit using Component::map_to_csr_; using Component::allocated_; - public: + private: using ScalarT = scalar_type; using IdxT = index_type; using RealT = typename Model::Evaluator::RealT; @@ -70,6 +70,7 @@ namespace GridKit using ComponentT = Component; using MonitorT = Model::VariableMonitorController; + public: SystemModel(); SystemModel(const SystemModelData& data); diff --git a/tests/UnitTests/PhasorDynamics/BranchTests.hpp b/tests/UnitTests/PhasorDynamics/BranchTests.hpp index b3d003e688..b26ff219c5 100644 --- a/tests/UnitTests/PhasorDynamics/BranchTests.hpp +++ b/tests/UnitTests/PhasorDynamics/BranchTests.hpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -125,7 +126,7 @@ namespace GridKit bus2.initialize(); bus2.evaluateResidual(); - using Data = typename PhasorDynamics::Branch::ModelDataT; + using Data = PhasorDynamics::BranchData; using Parameter = typename Data::Parameters; Data data; @@ -412,7 +413,7 @@ namespace GridKit const ScalarT Vr2{30.0}; const ScalarT Vi2{40.0}; - using Data = typename PhasorDynamics::Branch::ModelDataT; + using Data = PhasorDynamics::BranchData; using Parameter = typename Data::Parameters; using Buses = typename Data::Buses; diff --git a/tests/UnitTests/PhasorDynamics/BusSignalVoltageInTests.hpp b/tests/UnitTests/PhasorDynamics/BusSignalVoltageInTests.hpp index c1e869a052..f60401f279 100644 --- a/tests/UnitTests/PhasorDynamics/BusSignalVoltageInTests.hpp +++ b/tests/UnitTests/PhasorDynamics/BusSignalVoltageInTests.hpp @@ -6,9 +6,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -24,7 +26,8 @@ namespace GridKit { public: using BusT = PhasorDynamics::BusSignalVoltageIn; - using BusTypeT = typename BusT::BusTypeT; + using RealT = typename GridKit::ScalarTraits::RealT; + using BusTypeT = typename PhasorDynamics::BusData::BusType; using SignalT = PhasorDynamics::SignalNode; using SignalIn = PhasorDynamics::BusSignalInputs; using SignalOut = PhasorDynamics::BusSignalOutputs; diff --git a/tests/UnitTests/PhasorDynamics/BusSignalVoltageOutTests.hpp b/tests/UnitTests/PhasorDynamics/BusSignalVoltageOutTests.hpp index 5a1d52c60e..4ab014d077 100644 --- a/tests/UnitTests/PhasorDynamics/BusSignalVoltageOutTests.hpp +++ b/tests/UnitTests/PhasorDynamics/BusSignalVoltageOutTests.hpp @@ -7,9 +7,11 @@ #include #include #include +#include #include #include #include +#include #include #include #include @@ -25,7 +27,8 @@ namespace GridKit { public: using BusT = PhasorDynamics::BusSignalVoltageOut; - using BusTypeT = typename BusT::BusTypeT; + using RealT = typename GridKit::ScalarTraits::RealT; + using BusTypeT = typename PhasorDynamics::BusData::BusType; using SignalT = PhasorDynamics::SignalNode; using SignalIn = PhasorDynamics::BusSignalInputs; using SignalOut = PhasorDynamics::BusSignalOutputs; diff --git a/tests/UnitTests/PhasorDynamics/BusTests.hpp b/tests/UnitTests/PhasorDynamics/BusTests.hpp index ccb68c1e3d..dcdb80cc3f 100644 --- a/tests/UnitTests/PhasorDynamics/BusTests.hpp +++ b/tests/UnitTests/PhasorDynamics/BusTests.hpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -18,7 +19,7 @@ namespace GridKit class BusTests { private: - using RealT = typename PhasorDynamics::Bus::RealT; + using RealT = typename GridKit::ScalarTraits::RealT; public: BusTests() = default; diff --git a/tests/UnitTests/PhasorDynamics/ExciterEsdc1aTests.hpp b/tests/UnitTests/PhasorDynamics/ExciterEsdc1aTests.hpp index d16180f63a..54901f2f36 100644 --- a/tests/UnitTests/PhasorDynamics/ExciterEsdc1aTests.hpp +++ b/tests/UnitTests/PhasorDynamics/ExciterEsdc1aTests.hpp @@ -867,10 +867,10 @@ namespace GridKit private: using Esdc1aT = PhasorDynamics::Exciter::Esdc1a; - using Data = typename Esdc1aT::ModelDataT; + using Data = PhasorDynamics::Exciter::Esdc1aData; using Params = typename Data::Parameters; using Mon = typename Data::MonitorableVariables; - using Internal = typename Esdc1aT::InternalVariablesT; + using Internal = PhasorDynamics::Exciter::Esdc1aInternalVariables; using External = typename Data::SignalInputs; using InternalRow = std::pair; diff --git a/tests/UnitTests/PhasorDynamics/GovernorGastPtiTests.hpp b/tests/UnitTests/PhasorDynamics/GovernorGastPtiTests.hpp index f1443c9f2f..06aa286cf5 100644 --- a/tests/UnitTests/PhasorDynamics/GovernorGastPtiTests.hpp +++ b/tests/UnitTests/PhasorDynamics/GovernorGastPtiTests.hpp @@ -936,10 +936,10 @@ namespace GridKit private: using GastPtiT = PhasorDynamics::Governor::GastPti; - using Data = typename GastPtiT::ModelDataT; + using Data = PhasorDynamics::Governor::GastPtiData; using Params = typename Data::Parameters; using Mon = typename Data::MonitorableVariables; - using Internal = typename GastPtiT::InternalVariablesT; + using Internal = PhasorDynamics::Governor::GastPtiInternalVariables; using External = typename Data::SignalInputs; using SignalInputs = typename Data::SignalInputs; using SignalOutputs = typename Data::SignalOutputs; From f0bf55b0f6c6668b684273064f19536d43b82626 Mon Sep 17 00:00:00 2001 From: pelesh Date: Tue, 20 Oct 2026 14:50:39 -0400 Subject: [PATCH 2/4] Fix aliases in co-sim functions. --- GridKit/Testing/Testing.hpp | 2 +- examples/Network/CoSim/CoSimClient.cpp | 5 +++-- examples/Network/CoSim/CoSimServer.cpp | 7 ++++--- examples/Network/ThreeBusCoSim/ThreeBusCoSimClient.cpp | 5 +++-- examples/Network/ThreeBusCoSim/ThreeBusCoSimServer.cpp | 5 +++-- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/GridKit/Testing/Testing.hpp b/GridKit/Testing/Testing.hpp index 2f676099b3..ec6a2e0687 100644 --- a/GridKit/Testing/Testing.hpp +++ b/GridKit/Testing/Testing.hpp @@ -235,7 +235,7 @@ namespace GridKit { func(std::forward(args)...); }); } - /// True when building a model throws @ref std::invalid_argument or the + /// True when building a model throws `std::invalid_argument` or the /// configuration checks it returns report a problem. template inline bool configurationRejected(BuildT build) diff --git a/examples/Network/CoSim/CoSimClient.cpp b/examples/Network/CoSim/CoSimClient.cpp index df644ec289..3cf9dabeb3 100644 --- a/examples/Network/CoSim/CoSimClient.cpp +++ b/examples/Network/CoSim/CoSimClient.cpp @@ -33,7 +33,7 @@ using Log = GridKit::Utilities::Logger; template class CoSimClient { -public: +private: /// Type representing a scalar value using ScalarT = scalar_type; /// Type representing an index @@ -43,10 +43,11 @@ class CoSimClient /// Alias for SystemModel using SystemModelT = SystemModel; /// Alias for SignalNode - using SignalNodeT = typename SystemModelT::SignalNodeT; + using SignalNodeT = SignalNode; /// Alias for Ida using IdaT = Ida; +public: CoSimClient() = delete; /** diff --git a/examples/Network/CoSim/CoSimServer.cpp b/examples/Network/CoSim/CoSimServer.cpp index 1144f3ebbd..b808ad769d 100644 --- a/examples/Network/CoSim/CoSimServer.cpp +++ b/examples/Network/CoSim/CoSimServer.cpp @@ -38,7 +38,7 @@ using Log = GridKit::Utilities::Logger; template class CoSimServer { -public: +private: /// Type representing a scalar value using ScalarT = scalar_type; /// Type representing an index @@ -48,12 +48,13 @@ class CoSimServer /// Alias for SystemModel using SystemModelT = SystemModel; /// Alias for BusBase - using BusT = typename SystemModelT::BusT; + using BusT = BusBase; /// Alias for SignalNode - using SignalNodeT = typename SystemModelT::SignalNodeT; + using SignalNodeT = SignalNode; /// Alias for Ida using IdaT = Ida; +public: CoSimServer() = delete; /** diff --git a/examples/Network/ThreeBusCoSim/ThreeBusCoSimClient.cpp b/examples/Network/ThreeBusCoSim/ThreeBusCoSimClient.cpp index e357ae940e..6af6a2b220 100644 --- a/examples/Network/ThreeBusCoSim/ThreeBusCoSimClient.cpp +++ b/examples/Network/ThreeBusCoSim/ThreeBusCoSimClient.cpp @@ -30,7 +30,7 @@ using Log = GridKit::Utilities::Logger; template class CoSimClient { -public: +private: /// Type representing a scalar value using ScalarT = scalar_type; /// Type representing an index @@ -38,8 +38,9 @@ class CoSimClient /// Alias for SystemModel using SystemModelT = SystemModel; /// Alias for SignalNode - using SignalT = typename SystemModelT::SignalNodeT; + using SignalT = SignalNode; +public: CoSimClient() = delete; /** diff --git a/examples/Network/ThreeBusCoSim/ThreeBusCoSimServer.cpp b/examples/Network/ThreeBusCoSim/ThreeBusCoSimServer.cpp index f810877307..c0762ca3c4 100644 --- a/examples/Network/ThreeBusCoSim/ThreeBusCoSimServer.cpp +++ b/examples/Network/ThreeBusCoSim/ThreeBusCoSimServer.cpp @@ -31,7 +31,7 @@ using Log = GridKit::Utilities::Logger; template class CoSimServer { -public: +private: /// Type representing a scalar value using ScalarT = scalar_type; /// Type representing an index @@ -39,8 +39,9 @@ class CoSimServer /// Alias for SystemModel using SystemModelT = SystemModel; /// Alias for SignalNode - using SignalT = typename SystemModelT::SignalNodeT; + using SignalT = SignalNode; +public: CoSimServer() = delete; /** From c83cc5c03fd12cb029b5970c29afb23ac4e70bb5 Mon Sep 17 00:00:00 2001 From: pelesh Date: Tue, 20 Oct 2026 14:54:31 -0400 Subject: [PATCH 3/4] Fix warnings in cosim examples --- examples/Network/CoSim/CoSimClient.cpp | 6 +----- examples/Network/CoSim/CoSimServer.cpp | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/examples/Network/CoSim/CoSimClient.cpp b/examples/Network/CoSim/CoSimClient.cpp index 3cf9dabeb3..c56c583741 100644 --- a/examples/Network/CoSim/CoSimClient.cpp +++ b/examples/Network/CoSim/CoSimClient.cpp @@ -226,15 +226,11 @@ int main(int argc, const char* argv[]) Log::setVerbosity(Log::Verbosity::EVERYTHING); CliArgs args{{.name = {"--case-file", "-c"}, - .required = true}, - - {.name = {"--iface-bus", "-b"}, - .type = ArgType::Integer}}; + .required = true}}; args.parseArgs(argc, argv); auto filepath = std::filesystem::path(args["case-file"]()); - auto busid = args["iface-bus"].as(); // Instantiate system auto data = parseSystemModelData(filepath); diff --git a/examples/Network/CoSim/CoSimServer.cpp b/examples/Network/CoSim/CoSimServer.cpp index b808ad769d..234ce93d22 100644 --- a/examples/Network/CoSim/CoSimServer.cpp +++ b/examples/Network/CoSim/CoSimServer.cpp @@ -207,15 +207,11 @@ int main(int argc, const char* argv[]) Log::setVerbosity(Log::Verbosity::EVERYTHING); CliArgs args{{.name = {"--case-file", "-c"}, - .required = true}, - - {.name = {"--iface-bus", "-b"}, - .type = ArgType::Integer}}; + .required = true}}; args.parseArgs(argc, argv); auto filepath = std::filesystem::path(args["case-file"]()); - auto busid = args["iface-bus"].as(); // Instantiate system auto data = parseSystemModelData(filepath); From 5126f69a2612bc44ce742a2588943b57d4da0fd5 Mon Sep 17 00:00:00 2001 From: pelesh Date: Tue, 20 Oct 2026 15:17:15 -0400 Subject: [PATCH 4/4] Remove unused flags in cosim execution script. --- examples/Network/CoSim/run_cosim.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Network/CoSim/run_cosim.sh b/examples/Network/CoSim/run_cosim.sh index bb5b2cd381..d85773aed5 100644 --- a/examples/Network/CoSim/run_cosim.sh +++ b/examples/Network/CoSim/run_cosim.sh @@ -5,10 +5,10 @@ readonly _cosim_dir=$(dirname "$(realpath "$0")") cd "${_cosim_dir}" || exit 1 _exit_code=0 -./CoSimServer -c "${1:-ThreeBusCoSimServer.case.json}" -b 1 & +./CoSimServer -c "${1:-ThreeBusCoSimServer.case.json}" & _srv_pid=$! -./CoSimClient -c "${2:-ThreeBusCoSimClient.case.json}" -b 2 +./CoSimClient -c "${2:-ThreeBusCoSimClient.case.json}" if [ $? -ne 0 ]; then _exit_code=1 fi