From ffa4c163aa2a92b5e10a1ba76094e65d591cccf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20LAIGRE?= Date: Tue, 24 May 2022 12:10:06 +0200 Subject: [PATCH] Review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sébastien LAIGRE --- .../powsybl/iidm/util/DanglingLineData.hpp | 14 +------ include/powsybl/iidm/util/LinkData.hpp | 3 +- src/iidm/util/DanglingLineData.cpp | 40 +++++++++---------- src/iidm/util/LinkData.cpp | 10 ++--- src/iidm/util/TwtData.cpp | 4 +- 5 files changed, 29 insertions(+), 42 deletions(-) diff --git a/include/powsybl/iidm/util/DanglingLineData.hpp b/include/powsybl/iidm/util/DanglingLineData.hpp index add4204f..fd06e506 100644 --- a/include/powsybl/iidm/util/DanglingLineData.hpp +++ b/include/powsybl/iidm/util/DanglingLineData.hpp @@ -38,19 +38,7 @@ class DanglingLineData { static bool valid(double v, double theta); private: - std::string m_id; - - double m_r; - double m_x; - double m_g1; - double m_g2; - double m_b1; - double m_b2; - - double m_u1; - double m_theta1; - double m_p0; - double m_q0; + const DanglingLine& m_danglingLine; double m_boundaryBusU = stdcxx::nan(); double m_boundaryBusTheta = stdcxx::nan(); diff --git a/include/powsybl/iidm/util/LinkData.hpp b/include/powsybl/iidm/util/LinkData.hpp index df23aef0..e32c53da 100644 --- a/include/powsybl/iidm/util/LinkData.hpp +++ b/include/powsybl/iidm/util/LinkData.hpp @@ -25,12 +25,13 @@ struct Flow { std::complex toFrom; }; -struct BranchAdmittanceMatrix { +class BranchAdmittanceMatrix { public: BranchAdmittanceMatrix() = default; BranchAdmittanceMatrix(const std::complex& y11, const std::complex& y12, const std::complex& y21, const std::complex& y22); +public: std::complex y11; std::complex y12; diff --git a/src/iidm/util/DanglingLineData.cpp b/src/iidm/util/DanglingLineData.cpp index 28dc52fd..ba9db97a 100644 --- a/src/iidm/util/DanglingLineData.cpp +++ b/src/iidm/util/DanglingLineData.cpp @@ -23,33 +23,33 @@ DanglingLineData::DanglingLineData(const DanglingLine& danglingLine) : } DanglingLineData::DanglingLineData(const DanglingLine& danglingLine, bool splitShuntAdmittance) : - m_id(danglingLine.getId()), - m_r(danglingLine.getR()), - m_x(danglingLine.getX()), - m_g1(splitShuntAdmittance ? danglingLine.getG() * 0.5 : danglingLine.getG()), - m_g2(splitShuntAdmittance ? danglingLine.getG() * 0.5 : 0.0), - m_b1(splitShuntAdmittance ? danglingLine.getB() * 0.5 : danglingLine.getB()), - m_b2(splitShuntAdmittance ? danglingLine.getB() * 0.5 : 0.0), - m_u1(getV(danglingLine)), - m_theta1(getTheta(danglingLine)), - m_p0(danglingLine.getP0()), - m_q0(danglingLine.getQ0()) { - - if (!valid(m_u1, m_theta1)) { + m_danglingLine(danglingLine){ + + double g1 = splitShuntAdmittance ? danglingLine.getG() * 0.5 : danglingLine.getG(); + double g2 = splitShuntAdmittance ? danglingLine.getG() * 0.5 : 0.0; + double b1 = splitShuntAdmittance ? danglingLine.getB() * 0.5 : danglingLine.getB(); + double b2 = splitShuntAdmittance ? danglingLine.getB() * 0.5 : 0.0; + + double u1 = getV(danglingLine); + double theta1 = getTheta(danglingLine); + + if (!valid(u1, theta1)) { + m_boundaryBusU = stdcxx::nan(); + m_boundaryBusTheta = stdcxx::nan(); return; } - const std::complex& v1 = math::ComplexUtils::polar2Complex(m_u1, m_theta1); + const std::complex& v1 = math::ComplexUtils::polar2Complex(u1, theta1); std::complex vBoundaryBus(stdcxx::nan(), stdcxx::nan()); - if (m_p0 == 0.0 && m_q0 == 0.0) { - LinkData::BranchAdmittanceMatrix adm = LinkData::calculateBranchAdmittance(m_r, m_x, 1.0, 0.0, 1.0, 0.0, std::complex(m_g1, m_b1), std::complex(m_g2, m_b2)); + if (danglingLine.getP0() == 0.0 && danglingLine.getQ0() == 0.0) { + LinkData::BranchAdmittanceMatrix adm = LinkData::calculateBranchAdmittance(danglingLine.getR(), danglingLine.getX(), 1.0, 0.0, 1.0, 0.0, std::complex(g1, b1), std::complex(g2, b2)); vBoundaryBus = (- adm.y21 * v1) / adm.y22; } else { // Two buses Loadflow - std::complex sBoundary(-m_p0, -m_q0); - std::complex ytr = 1.0 / std::complex(m_r, m_x); - std::complex ysh2(m_g2, m_b2); + std::complex sBoundary(-danglingLine.getP0(), -danglingLine.getQ0()); + std::complex ytr = 1.0 / std::complex(danglingLine.getR(), danglingLine.getX()); + std::complex ysh2(g2, b2); std::complex zt = 1.0 / (ytr + ysh2); std::complex v0 = ytr * v1 / (ytr + ysh2); double v02 = std::abs(v0) * std::abs(v0); @@ -75,7 +75,7 @@ double DanglingLineData::getBoundaryBusU() const { } const std::string& DanglingLineData::getId() const { - return m_id; + return m_danglingLine.getId(); } double DanglingLineData::getTheta(const DanglingLine& danglingLine) { diff --git a/src/iidm/util/LinkData.cpp b/src/iidm/util/LinkData.cpp index 0ac9a2d3..729d01b8 100644 --- a/src/iidm/util/LinkData.cpp +++ b/src/iidm/util/LinkData.cpp @@ -68,7 +68,7 @@ Flow flowBothEnds(const std::complex& y11, const std::complex& y std::complex flowYshunt(const std::complex& ysh, double u, double theta) { std::complex v = math::ComplexUtils::polar2Complex(u, theta); - return std::conj(ysh) * std::conj(v) *v; + return std::conj(ysh) * std::conj(v) * v; } double getFixedX(double x, double epsilonX, bool applyReactanceCorrection) { @@ -76,9 +76,7 @@ double getFixedX(double x, double epsilonX, bool applyReactanceCorrection) { } double getPhaseAngleClockDegrees(int phaseAngleClock) { - double phaseAngleClockDegree = 0.0; - phaseAngleClockDegree += phaseAngleClock * 30.0; - phaseAngleClockDegree = std::remainder(phaseAngleClockDegree, 360.0); + double phaseAngleClockDegree = std::remainder(phaseAngleClock * 30.0, 360.0); if (phaseAngleClockDegree > 180.0) { phaseAngleClockDegree -= 360.0; } @@ -139,8 +137,8 @@ BranchAdmittanceMatrix kronChain(const BranchAdmittanceMatrix& firstAdm, const B } admittance.y11 = yFirst11 - (yFirst1C * yFirstC1 / (yFirstCC + ySecondCC)); - admittance.y12 = yFirst1C * ySecondC2 / -(yFirstCC + ySecondCC); - admittance.y21 = ySecond2C * yFirstC1 / -(yFirstCC + ySecondCC); + admittance.y12 = - yFirst1C * ySecondC2 / (yFirstCC + ySecondCC); + admittance.y21 = - ySecond2C * yFirstC1 / (yFirstCC + ySecondCC); admittance.y22 = ySecond22 - (ySecond2C * ySecondC2 / (yFirstCC + ySecondCC)); return admittance; diff --git a/src/iidm/util/TwtData.cpp b/src/iidm/util/TwtData.cpp index 5e125473..8003204f 100644 --- a/src/iidm/util/TwtData.cpp +++ b/src/iidm/util/TwtData.cpp @@ -210,7 +210,7 @@ TwtData::TwtData(const ThreeWindingsTransformer& twt, int phaseAngleClock2, int } double TwtData::alpha(const ThreeWindingsTransformer::Leg& leg) { - return leg.getOptionalPhaseTapChanger() ? leg.getPhaseTapChanger().getCurrentStep().getAlpha() : 0.0; + return leg.getOptionalPhaseTapChanger() ? stdcxx::toRadians * leg.getPhaseTapChanger().getCurrentStep().getAlpha() : 0.0; } std::complex TwtData::calculateOneConnectedLegFlow(double u, double theta, @@ -313,7 +313,7 @@ std::complex TwtData::calculateTwoConnectedLegsStarBusVoltage(double u1, std::complex v2 = math::ComplexUtils::polar2Complex(u2, theta2); std::complex yshO = LinkData::kronAntenna(admittanceMatrixOpenLeg.y11, admittanceMatrixOpenLeg.y12, admittanceMatrixOpenLeg.y21, admittanceMatrixOpenLeg.y22, true); - return -(admittanceMatrixLeg1.y21 * v1 + (admittanceMatrixLeg2.y21 * v2)) + return -(admittanceMatrixLeg1.y21 * v1 + admittanceMatrixLeg2.y21 * v2) / (admittanceMatrixLeg1.y22 + admittanceMatrixLeg2.y22 + yshO); }