Skip to content

Commit

Permalink
Update Regulating terminal of Generator API (#88)
Browse files Browse the repository at this point in the history
Signed-off-by: Sébastien LAIGRE <slaigre@silicom.fr>
Co-authored-by: Mathieu BAGUE <mathieu.bague@rte-france.com>
  • Loading branch information
sebalaig and Mathieu BAGUE committed May 4, 2020
1 parent f923598 commit 4a09d60
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 23 deletions.
10 changes: 6 additions & 4 deletions include/powsybl/iidm/Generator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
#ifndef POWSYBL_IIDM_GENERATOR_HPP
#define POWSYBL_IIDM_GENERATOR_HPP

#include <functional>

#include <powsybl/iidm/EnergySource.hpp>
#include <powsybl/iidm/Injection.hpp>
#include <powsybl/iidm/ReactiveLimitsHolder.hpp>
Expand All @@ -21,7 +23,7 @@ class Terminal;
class Generator : public Injection, public ReactiveLimitsHolder {
public:
Generator(VariantManagerHolder& network, const std::string& id, const std::string& name, const EnergySource& energySource,
double minP, double maxP, bool voltageRegulatorOn, const stdcxx::Reference<Terminal>& regulatingTerminal,
double minP, double maxP, bool voltageRegulatorOn, Terminal& regulatingTerminal,
double activePowerSetpoint, double reactivePowerSetpoint, double voltageSetpoint, double ratedS);

~Generator() noexcept override = default;
Expand All @@ -38,9 +40,9 @@ class Generator : public Injection, public ReactiveLimitsHolder {

double getReactivePowerSetpoint() const;

stdcxx::CReference<Terminal> getRegulatingTerminal() const;
const Terminal& getRegulatingTerminal() const;

stdcxx::Reference<Terminal> getRegulatingTerminal();
Terminal& getRegulatingTerminal();

double getTargetP() const;

Expand Down Expand Up @@ -95,7 +97,7 @@ class Generator : public Injection, public ReactiveLimitsHolder {

double m_ratedS;

stdcxx::Reference<Terminal> m_regulatingTerminal;
std::reference_wrapper<Terminal> m_regulatingTerminal;

std::vector<bool> m_voltageRegulatorOn;

Expand Down
5 changes: 5 additions & 0 deletions include/powsybl/stdcxx/reference_wrapper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,11 @@ Reference<T> ref(const CReference<T>& reference) {
return static_cast<bool>(reference) ? Reference<T>(const_cast<T&>(reference.get())) : Reference<T>();
}

template <typename T>
Reference<T> ref(const T& reference) {
return Reference<T>(const_cast<T&>(reference));
}

/**
* Upcast / Downcast a reference_wrapper instance from U to T
*/
Expand Down
16 changes: 8 additions & 8 deletions src/iidm/Generator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ namespace powsybl {
namespace iidm {

Generator::Generator(powsybl::iidm::VariantManagerHolder& network, const std::string& id, const std::string& name,
const powsybl::iidm::EnergySource& energySource, double minP, double maxP, bool voltageRegulatorOn,
const stdcxx::Reference<powsybl::iidm::Terminal>& regulatingTerminal, double activePowerSetpoint,
const EnergySource& energySource, double minP, double maxP, bool voltageRegulatorOn,
Terminal& regulatingTerminal, double activePowerSetpoint,
double reactivePowerSetpoint, double voltageSetpoint, double ratedS) :
Injection(id, name, ConnectableType::GENERATOR),
m_energySource(energySource),
Expand Down Expand Up @@ -77,12 +77,12 @@ double Generator::getReactivePowerSetpoint() const {
return m_reactivePowerSetpoint.at(getNetwork().getVariantIndex());
}

stdcxx::CReference<Terminal> Generator::getRegulatingTerminal() const {
return stdcxx::cref(m_regulatingTerminal);
const Terminal& Generator::getRegulatingTerminal() const {
return m_regulatingTerminal.get();
}

stdcxx::Reference<Terminal> Generator::getRegulatingTerminal() {
return m_regulatingTerminal;
Terminal& Generator::getRegulatingTerminal() {
return m_regulatingTerminal.get();
}

double Generator::getTargetP() const {
Expand Down Expand Up @@ -158,9 +158,9 @@ Generator& Generator::setReactivePowerSetpoint(double reactivePowerSetpoint) {
Generator& Generator::setRegulatingTerminal(const stdcxx::Reference<Terminal>& terminal) {
if (static_cast<bool>(terminal)) {
checkRegulatingTerminal(*this, terminal, getNetwork());
m_regulatingTerminal = terminal;
m_regulatingTerminal = terminal.get();
} else {
m_regulatingTerminal = stdcxx::ref(getTerminal());
m_regulatingTerminal = getTerminal();
}
return *this;
}
Expand Down
3 changes: 2 additions & 1 deletion src/iidm/GeneratorAdder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,9 @@ Generator& GeneratorAdder::add() {
checkRatedS(*this, m_ratedS);

auto terminalPtr = checkAndGetTerminal();
Terminal& regulatingTerminal = m_regulatingTerminal ? m_regulatingTerminal : *terminalPtr;
std::unique_ptr<Generator> ptrGenerator = stdcxx::make_unique<Generator>(getNetwork(), checkAndGetUniqueId(), getName(),
m_energySource, m_minP, m_maxP, *m_voltageRegulatorOn, m_regulatingTerminal ? m_regulatingTerminal : stdcxx::ref(*terminalPtr),
m_energySource, m_minP, m_maxP, *m_voltageRegulatorOn, regulatingTerminal,
m_activePowerSetpoint, m_reactivePowerSetpoint, m_voltageSetpoint, m_ratedS);
auto& generator = getNetwork().checkAndAdd(std::move(ptrGenerator));

Expand Down
2 changes: 1 addition & 1 deletion src/iidm/converter/xml/GeneratorXml.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ void GeneratorXml::writeRootElementAttributes(const Generator& generator, const
}

void GeneratorXml::writeSubElements(const Generator& generator, const VoltageLevel& /*voltageLevel*/, NetworkXmlWriterContext& context) const {
if (!stdcxx::areSame(generator.getTerminal(), generator.getRegulatingTerminal().get())) {
if (!stdcxx::areSame(generator.getTerminal(), generator.getRegulatingTerminal())) {
TerminalRefXml::writeTerminalRef(generator.getRegulatingTerminal(), context, REGULATING_TERMINAL);
}
ReactiveLimitsXml::getInstance().write(generator, context);
Expand Down
9 changes: 3 additions & 6 deletions test/iidm/GeneratorTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,8 +172,7 @@ BOOST_AUTO_TEST_CASE(integrity) {
BOOST_CHECK_CLOSE(3.0, gen.getMinP(), std::numeric_limits<double>::epsilon());
BOOST_CHECK_CLOSE(4.0, gen.getRatedS(), std::numeric_limits<double>::epsilon());
BOOST_CHECK_CLOSE(5.0, gen.getReactivePowerSetpoint(), std::numeric_limits<double>::epsilon());
BOOST_TEST(gen.getRegulatingTerminal());
BOOST_TEST(stdcxx::areSame(gen.getRegulatingTerminal().get(), gen.getTerminal()));
BOOST_TEST(stdcxx::areSame(gen.getRegulatingTerminal(), gen.getTerminal()));
BOOST_CHECK_CLOSE(45.0, gen.getTargetP(), std::numeric_limits<double>::epsilon());
BOOST_CHECK_CLOSE(5.0, gen.getTargetQ(), std::numeric_limits<double>::epsilon());
BOOST_CHECK_CLOSE(6.0, gen.getTargetV(), std::numeric_limits<double>::epsilon());
Expand Down Expand Up @@ -248,8 +247,7 @@ BOOST_AUTO_TEST_CASE(integrity) {
BOOST_CHECK_NO_THROW(gen.setVoltageRegulatorOn(true));

const Generator& cGen = gen;
const auto terminal = cGen.getRegulatingTerminal();
BOOST_TEST(terminal);
const auto& terminal = cGen.getRegulatingTerminal();
gen.setRegulatingTerminal(stdcxx::ref(terminal));

Terminal& terminal2 = network.getLoad("LOAD1").getTerminal();
Expand Down Expand Up @@ -309,8 +307,7 @@ BOOST_AUTO_TEST_CASE(multivariant) {
BOOST_CHECK_CLOSE(3.0, gen.getMinP(), std::numeric_limits<double>::epsilon());
BOOST_CHECK_CLOSE(4.0, gen.getRatedS(), std::numeric_limits<double>::epsilon());
BOOST_CHECK_CLOSE(5.0, gen.getReactivePowerSetpoint(), std::numeric_limits<double>::epsilon());
BOOST_TEST(gen.getRegulatingTerminal());
BOOST_TEST(stdcxx::areSame(gen.getRegulatingTerminal().get(), gen.getTerminal()));
BOOST_TEST(stdcxx::areSame(gen.getRegulatingTerminal(), gen.getTerminal()));
BOOST_CHECK_CLOSE(45.0, gen.getTargetP(), std::numeric_limits<double>::epsilon());
BOOST_CHECK_CLOSE(5.0, gen.getTargetQ(), std::numeric_limits<double>::epsilon());
BOOST_CHECK_CLOSE(6.0, gen.getTargetV(), std::numeric_limits<double>::epsilon());
Expand Down
3 changes: 0 additions & 3 deletions test/network/EurostagFactoryTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,6 @@ BOOST_AUTO_TEST_CASE(createTutorial1NetworkTest) {
BOOST_CHECK_EQUAL("GEN", gen.getName());
POWSYBL_ASSERT_ENUM_EQ(iidm::EnergySource::OTHER, gen.getEnergySource());
BOOST_TEST(std::isnan(gen.getRatedS()));
BOOST_TEST(gen.getRegulatingTerminal());
BOOST_CHECK_CLOSE(-9999.99, gen.getMinP(), std::numeric_limits<double>::epsilon());
BOOST_CHECK_CLOSE(9999.99, gen.getMaxP(), std::numeric_limits<double>::epsilon());
BOOST_TEST(gen.isVoltageRegulatorOn());
Expand Down Expand Up @@ -472,7 +471,6 @@ BOOST_AUTO_TEST_CASE(createWithCurrentLimitsTest) {
BOOST_CHECK_EQUAL("GEN", gen.getName());
POWSYBL_ASSERT_ENUM_EQ(iidm::EnergySource::OTHER, gen.getEnergySource());
BOOST_TEST(std::isnan(gen.getRatedS()));
BOOST_TEST(gen.getRegulatingTerminal());
BOOST_CHECK_CLOSE(-9999.99, gen.getMinP(), std::numeric_limits<double>::epsilon());
BOOST_CHECK_CLOSE(9999.99, gen.getMaxP(), std::numeric_limits<double>::epsilon());
BOOST_TEST(gen.isVoltageRegulatorOn());
Expand All @@ -494,7 +492,6 @@ BOOST_AUTO_TEST_CASE(createWithCurrentLimitsTest) {
BOOST_CHECK_EQUAL("GEN2", gen2.getName());
POWSYBL_ASSERT_ENUM_EQ(iidm::EnergySource::OTHER, gen2.getEnergySource());
BOOST_TEST(std::isnan(gen2.getRatedS()));
BOOST_TEST(gen2.getRegulatingTerminal());
BOOST_CHECK_CLOSE(-9999.99, gen2.getMinP(), std::numeric_limits<double>::epsilon());
BOOST_CHECK_CLOSE(9999.99, gen2.getMaxP(), std::numeric_limits<double>::epsilon());
BOOST_TEST(gen2.isVoltageRegulatorOn());
Expand Down

0 comments on commit 4a09d60

Please sign in to comment.