Skip to content

Commit

Permalink
Merge pull request #57 from itesla/utility_functions_for_validation
Browse files Browse the repository at this point in the history
Share IIDM model validation code
  • Loading branch information
mathbagu committed Oct 18, 2016
2 parents 4cc09f1 + 79db85c commit 4f829d3
Show file tree
Hide file tree
Showing 3 changed files with 215 additions and 2 deletions.
10 changes: 10 additions & 0 deletions iidm-network-api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,16 @@
<artifactId>commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,17 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.script.*;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;
import javax.script.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
*
Expand Down Expand Up @@ -280,4 +282,156 @@ public static void printGeneratorsSetpointDiff(Network network, Logger logger) {
}
}

private static double EPSILON_X = 0.01;

public static boolean checkFlows(String id, double r, double x, double rho1, double rho2, double u1, double u2, double theta1, double theta2, double alpha1,
double alpha2, double g1, double g2, double b1, double b2, float p1, float q1, float p2, float q2) {
if (Math.abs(x) < EPSILON_X) {
// System.out.println("x " + x + " -> " + EPSILON_X);
// x = EPSILON_X;
}
double z = Math.hypot(r, x);
double y = 1 / z;
double ksi = Math.atan2(r, x);
double p1_calc = rho1 * rho2 * u1 * u2 * y * Math.sin(theta1 - theta2 - ksi + alpha1 - alpha2) + rho1 * rho1 * u1 * u1 * (y * Math.sin(ksi) + g1);
double q1_calc = - rho1 * rho2 * u1 * u2 * y * Math.cos(theta1 - theta2 - ksi + alpha1 - alpha2) + rho1 * rho1 * u1 * u1 * (y * Math.cos(ksi) - b1);
double p2_calc = rho2 * rho1 * u2 * u1 * y * Math.sin(theta2 - theta1 - ksi + alpha2 - alpha1) + rho2 * rho2 * u2 * u2 * (y * Math.sin(ksi) + g2);
double q2_calc = - rho2 * rho1 * u2 * u1 * y * Math.cos(theta2 - theta1 - ksi + alpha2 - alpha1) + rho2 * rho2 * u2 * u2 * (y * Math.cos(ksi) - b2);

boolean debug = false;
if (debug) {
System.out.println("r=" + r);
System.out.println("x=" + x);
System.out.println("g1=" + g1);
System.out.println("g2=" + g2);
System.out.println("b1=" + b1);
System.out.println("b2=" + b2);
System.out.println("rho1=" + rho1);
System.out.println("rho2=" + rho2);
System.out.println("alpha1=" + alpha1);
System.out.println("alpha2=" + alpha2);
System.out.println("u1=" + u1);
System.out.println("u2=" + u2);
System.out.println("theta1=" + theta1);
System.out.println("theta2=" + theta2);
System.out.println("z=" + z);
System.out.println("y=" + y);
System.out.println("ksi=" + ksi);
System.out.println("p1=" + p1);
System.out.println("q1=" + q1);
System.out.println("p2=" + p2);
System.out.println("q2=" + q2);
}
float seuil = 0.1f;
boolean ok = true;
if (Math.abs(p1 - p1_calc) > seuil) {
System.out.println(id + " P1 " + p1 + " " + p1_calc);
ok = false;
}
if (Math.abs(q1 - q1_calc) > seuil) {
System.out.println(id + " Q1 " + q1 + " " + q1_calc);
ok = false;
}
if (Math.abs(p2 - p2_calc) > seuil) {
System.out.println(id + " P2 " + p2 + " " + p2_calc);
ok = false;
}
if (Math.abs(q2 - q2_calc) > seuil) {
System.out.println(id + " Q2 " + q2 + " " + q2_calc);
ok = false;
}
return ok;
}

public static boolean checkFlows(Line l) {
float p1 = l.getTerminal1().getP();
float q1 = l.getTerminal1().getQ();
float p2 = l.getTerminal2().getP();
float q2 = l.getTerminal2().getQ();
Bus bus1 = l.getTerminal1().getBusView().getBus();
Bus bus2 = l.getTerminal2().getBusView().getBus();
if (bus1 != null && bus2 != null && !Float.isNaN(p1) && !Float.isNaN(p2) && !Float.isNaN(q1) && !Float.isNaN(q2)) {
double r = l.getR();
double x = l.getX();
double rho1 = 1f;
double rho2 = 1f;
double u1 = bus1.getV();
double u2 = bus2.getV();
double theta1 = Math.toRadians(bus1.getAngle());
double theta2 = Math.toRadians(bus2.getAngle());
double alpha1 = 0f;
double alpha2 = 0f;
double g1 = l.getG1();
double g2 = l.getG2();
double b1 = l.getB1();
double b2 = l.getB2();
return checkFlows(l.getId(), r, x, rho1, rho2, u1, u2, theta1, theta2, alpha1, alpha2, g1, g2, b1, b2, p1, q1, p2, q2);
}
return true;
}

public static boolean checkFlows(TwoWindingsTransformer twt) {
if (twt.getRatioTapChanger() != null && twt.getPhaseTapChanger() != null) {
throw new AssertionError();
}
float p1 = twt.getTerminal1().getP();
float q1 = twt.getTerminal1().getQ();
float p2 = twt.getTerminal2().getP();
float q2 = twt.getTerminal2().getQ();
Bus bus1 = twt.getTerminal1().getBusView().getBus();
Bus bus2 = twt.getTerminal2().getBusView().getBus();
if (bus1 != null && bus2 != null && !Float.isNaN(p1) && !Float.isNaN(p2) && !Float.isNaN(q1) && !Float.isNaN(q2)) {
float r = twt.getR();
float x = twt.getX();
double g1 = twt.getG();
double g2 = 0f;
double b1 = twt.getB() / 2;
double b2 = twt.getB() / 2;
if (twt.getRatioTapChanger() != null) {
r *= (1 + twt.getRatioTapChanger().getCurrentStep().getR() / 100);
x *= (1 + twt.getRatioTapChanger().getCurrentStep().getX() / 100);
g1 *= (1 + twt.getRatioTapChanger().getCurrentStep().getG() / 100);
b1 *= (1 + twt.getRatioTapChanger().getCurrentStep().getB() / 100);
}
if (twt.getPhaseTapChanger() != null) {
r *= (1 + twt.getPhaseTapChanger().getCurrentStep().getR() / 100);
x *= (1 + twt.getPhaseTapChanger().getCurrentStep().getX() / 100);
g1 *= (1 + twt.getPhaseTapChanger().getCurrentStep().getG() / 100);
b1 *= (1 + twt.getPhaseTapChanger().getCurrentStep().getB() / 100);
}

double rho1 = twt.getRatedU2() / twt.getRatedU1();
if (twt.getRatioTapChanger() != null) {
rho1 *= twt.getRatioTapChanger().getCurrentStep().getRho();
}
if (twt.getPhaseTapChanger() != null) {
rho1 *= twt.getPhaseTapChanger().getCurrentStep().getRho();
}
double rho2 = 1f;
double u1 = bus1.getV();
double u2 = bus2.getV();
double theta1 = Math.toRadians(bus1.getAngle());
double theta2 = Math.toRadians(bus2.getAngle());
double alpha1 = twt.getPhaseTapChanger() != null ? Math.toRadians(twt.getPhaseTapChanger().getCurrentStep().getAlpha()) : 0f;
double alpha2 = 0f;
return checkFlows(twt.getId(), r, x, rho1, rho2, u1, u2, theta1, theta2, alpha1, alpha2, g1, g2, b1, b2, p1, q1, p2, q2);
}
return true;
}

public static boolean checkFlows(Network network) {
boolean ok = true;
for (Line l : network.getLines()) {
if (!checkFlows(l)) {
ok = false;
}
}
for (TwoWindingsTransformer twt : network.getTwoWindingsTransformers()) {
if (!checkFlows(twt)) {
ok = false;
}
}
return ok;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/**
* Copyright (c) 2016, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package eu.itesla_project.iidm.network.util;

import org.junit.Test;
import static org.junit.Assert.*;

/**
* @author Geoffroy Jamgotchian <geoffroy.jamgotchian at rte-france.com>
*/
public class NetworksTest {

@Test
public void checkFlows() throws Exception {
double r=0.04;
double x=0.423;
double g1=0.0;
double g2=0.0;
double b1=0.0;
double b2=0.0;
double rho1=1;
double rho2=11.249999728;
double alpha1=0.0;
double alpha2=0.0;
double u1=236.80258178710938;
double u2=21.04814910888672;
double theta1=0.1257718437996544;
double theta2=0.12547118123496284;

float p1=40.0744f;
float q1=2.3124743f;
float p2=-40.073254f;
float q2=-2.3003194f;

assertTrue(Networks.checkFlows("test", r, x, rho1, rho2, u1, u2, theta1, theta2, alpha1, alpha2, g1, g2, b1, b2, p1, q1, p2, q2));

r= 0.04 / (rho2 * rho2);
x= 0.423 / (rho2 * rho2);
rho1 = 1 / rho2;
rho2 = 1;

assertTrue(Networks.checkFlows("test", r, x, rho1, rho2, u1, u2, theta1, theta2, alpha1, alpha2, g1, g2, b1, b2, p1, q1, p2, q2));
}

}

0 comments on commit 4f829d3

Please sign in to comment.