From 62fbfc1dce63ca3c8e6c4ece22a76a159922925d Mon Sep 17 00:00:00 2001 From: Geoffroy Jamgotchian Date: Thu, 20 Oct 2016 15:48:57 +0200 Subject: [PATCH 1/4] Add new phase shifter regulation mode: active power control --- .../iidm/import_/cim1/CIM1Converter.java | 8 +-- .../eurostag/export/EurostagEchExport.java | 2 +- .../ddb/eurostag_imp_exp/DdbDtaImpExp.java | 2 +- .../iidm/network/PhaseTapChanger.java | 31 ++++++++-- .../iidm/network/PhaseTapChangerAdder.java | 4 +- .../iidm/network/RatioTapChanger.java | 16 ++++++ .../iidm/network/TapChanger.java | 16 ------ .../impl/PhaseTapChangerAdderImpl.java | 31 +++------- .../network/impl/PhaseTapChangerImpl.java | 56 +++++++++++-------- .../network/impl/RatioTapChangerImpl.java | 21 ++++++- .../iidm/network/impl/TapChangerImpl.java | 23 +------- .../iidm/network/impl/ValidationUtil.java | 16 ++++++ .../test/PhaseShifterTestCaseFactory.java | 4 +- .../iidm/xml/TransformerXml.java | 13 +++-- .../src/main/resources/xsd/iidm.xsd | 11 +++- .../resources/phaseShifterRoundTripRef.xml | 2 +- .../online/db/debug/NetworkDataExtractor.java | 12 +--- .../iidm/import_/ucte/UcteImporter.java | 11 +--- 18 files changed, 153 insertions(+), 126 deletions(-) diff --git a/cim1-import/src/main/java/eu/itesla_project/iidm/import_/cim1/CIM1Converter.java b/cim1-import/src/main/java/eu/itesla_project/iidm/import_/cim1/CIM1Converter.java index 994a25df..06c2deb6 100644 --- a/cim1-import/src/main/java/eu/itesla_project/iidm/import_/cim1/CIM1Converter.java +++ b/cim1-import/src/main/java/eu/itesla_project/iidm/import_/cim1/CIM1Converter.java @@ -548,23 +548,19 @@ private void createPhaseTapChanger(cim1.model.PhaseTapChanger ptc, cim1.model.Te } else { regulatingTerminal = getTerminalMapping(rc.getTerminal().getTopologicalNode()); } - ptca.setRegulating(true) - .setThresholdI(rc.getTargetValue()) + ptca.setRegulationMode(PhaseTapChanger.RegulationMode.CURRENT_LIMITER) + .setRegulationValue(rc.getTargetValue()) .setTerminal(regulatingTerminal); break; case fixed: - ptca.setRegulating(false); break; default: - ptca.setRegulating(false); LOGGER.warn("Phase tap changer '{}' of power transformer '{}'" + " has an unsupported regulating mode: {}", ptc.getId(), transfo.getId(), rc.getMode()); } - } else { - ptca.setRegulating(false); } ptca.add(); } diff --git a/eurostag-ech-export/src/main/java/eu/itesla_project/iidm/eurostag/export/EurostagEchExport.java b/eurostag-ech-export/src/main/java/eu/itesla_project/iidm/eurostag/export/EurostagEchExport.java index ff89a2d1..d5a76a4c 100644 --- a/eurostag-ech-export/src/main/java/eu/itesla_project/iidm/eurostag/export/EurostagEchExport.java +++ b/eurostag-ech-export/src/main/java/eu/itesla_project/iidm/eurostag/export/EurostagEchExport.java @@ -272,7 +272,7 @@ private void createTransformers(EsgNetwork esgNetwork, EsgGeneralParameters para } } else if (ptc != null && rtc == null) { - if (ptc.isRegulating()) { + if (ptc.getRegulationMode() == PhaseTapChanger.RegulationMode.CURRENT_LIMITER) { String regulbus = EchUtil.getBus(ptc.getTerminal(), config).getId(); if (regulbus.equals(bus1.getId())) { regulatingMode = EsgDetailedTwoWindingTransformer.RegulatingMode.ACTIVE_FLUX_SIDE_1; diff --git a/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DdbDtaImpExp.java b/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DdbDtaImpExp.java index b628e978..94416b4e 100644 --- a/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DdbDtaImpExp.java +++ b/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DdbDtaImpExp.java @@ -1443,7 +1443,7 @@ public void dumpDataAutomatons(SimulatorInst eurostagSim, DDBManager ddbmanager, ) { dumpDataTransformerAutomaton(t, eurostagSim, "A14_HT", dtaOutStream, iidm2eurostagId); } else if(t.getPhaseTapChanger() != null - && t.getPhaseTapChanger().isRegulating()) { // TD + && t.getPhaseTapChanger().getRegulationMode() != PhaseTapChanger.RegulationMode.OFF) { // TD //TODO //dumpDataTransformerAutomaton(t, eurostagSim, "A14_TD", dtaOutStream, iidm2eurostagId); } diff --git a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChanger.java b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChanger.java index 9d053532..3d2f3458 100644 --- a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChanger.java +++ b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChanger.java @@ -13,20 +13,43 @@ */ public interface PhaseTapChanger extends TapChanger { + enum RegulationMode { + CURRENT_LIMITER, + ACTIVE_POWER_CONTROL, + OFF + } + + /** + * Get the regulation mode. + *

+ * Depends on the working state. + * @return the regulation mode + */ + RegulationMode getRegulationMode(); + + /** + * Set the regulation mode + * @param regulationMode the regulation mode + * @return itself for method chaining + */ + PhaseTapChanger setRegulationMode(RegulationMode regulationMode); + /** - * Get the threshold current in A. + * Get the the regulation value. + * - a threshold in A in case of current limiter regulation + * - a setpoint in MW in case of active power control regulation *

* Depends on the working state. * @see StateManager */ - float getThresholdI(); + float getRegulationValue(); /** - * Set the threshold current in A. + * Set the regulation value. *

* Depends on the working state. * @see StateManager */ - PhaseTapChanger setThresholdI(float thresholdI); + PhaseTapChanger setRegulationValue(float regulationValue); } diff --git a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChangerAdder.java b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChangerAdder.java index f63534ec..151be542 100644 --- a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChangerAdder.java +++ b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChangerAdder.java @@ -33,9 +33,9 @@ interface StepAdder { PhaseTapChangerAdder setTapPosition(int tapPosition); - PhaseTapChangerAdder setRegulating(boolean regulating); + PhaseTapChangerAdder setRegulationMode(PhaseTapChanger.RegulationMode regulationMode); - PhaseTapChangerAdder setThresholdI(float thresholdI); + PhaseTapChangerAdder setRegulationValue(float regulationValue); PhaseTapChangerAdder setTerminal(Terminal terminal); diff --git a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/RatioTapChanger.java b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/RatioTapChanger.java index 875f98f1..0d8e1bda 100644 --- a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/RatioTapChanger.java +++ b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/RatioTapChanger.java @@ -34,4 +34,20 @@ public interface RatioTapChanger extends TapChanger + * Depends on the working state. + * @see StateManager + */ + boolean isRegulating(); + + /** + * Set the regulating status. + *

+ * Depends on the working state. + * @see StateManager + */ + RatioTapChanger setRegulating(boolean regulating); + } diff --git a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/TapChanger.java b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/TapChanger.java index 209ae739..38efe329 100644 --- a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/TapChanger.java +++ b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/TapChanger.java @@ -63,22 +63,6 @@ public interface TapChanger, TCS extends TapChang */ TCS getCurrentStep(); - /** - * Get the regulating status. - *

- * Depends on the working state. - * @see StateManager - */ - boolean isRegulating(); - - /** - * Set the regulating status. - *

- * Depends on the working state. - * @see StateManager - */ - TC setRegulating(boolean regulating); - /** * Get the terminal used for regulation. */ diff --git a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerAdderImpl.java b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerAdderImpl.java index 98245e5e..d654d01d 100644 --- a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerAdderImpl.java +++ b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerAdderImpl.java @@ -8,6 +8,7 @@ import eu.itesla_project.iidm.network.PhaseTapChanger; import eu.itesla_project.iidm.network.PhaseTapChangerAdder; +import eu.itesla_project.iidm.network.RatioTapChangerAdder; import eu.itesla_project.iidm.network.Terminal; import java.util.ArrayList; import java.util.List; @@ -26,9 +27,9 @@ class PhaseTapChangerAdderImpl implements PhaseTapChangerAdder { private final List steps = new ArrayList<>(); - private Boolean regulating; + private PhaseTapChanger.RegulationMode regulationMode = PhaseTapChanger.RegulationMode.OFF; - private float thresholdI = Float.NaN; + private float regulationValue = Float.NaN; private TerminalExt terminal; @@ -130,14 +131,14 @@ public PhaseTapChangerAdder setTapPosition(int tapPosition) { } @Override - public PhaseTapChangerAdder setRegulating(boolean regulating) { - this.regulating = regulating; + public PhaseTapChangerAdder setRegulationMode(PhaseTapChanger.RegulationMode regulationMode) { + this.regulationMode = regulationMode; return this; } @Override - public PhaseTapChangerAdder setThresholdI(float thresholdI) { - this.thresholdI = thresholdI; + public PhaseTapChangerAdder setRegulationValue(float regulationValue) { + this.regulationValue = regulationValue; return this; } @@ -166,23 +167,9 @@ public PhaseTapChanger add() { + tapPosition + " [" + lowTapPosition + ", " + highTapPosition + "]"); } - if (regulating == null) { - throw new ValidationException(transformer, "regulating status is not set"); - } - if (regulating) { - if (Float.isNaN(thresholdI)) { - throw new ValidationException(transformer, "a threshold current has to be set for a regulating phase tap changer"); - } - if (terminal == null) { - throw new ValidationException(transformer, "a regulation terminal has to be set for a regulating phase tap changer"); - } - if (terminal.getVoltageLevel().getNetwork() != getNetwork()) { - throw new ValidationException(transformer, "terminal is not part of the network"); - } - } + ValidationUtil.checkPhaseTapChangerRegulation(transformer, regulationMode, regulationValue, terminal, getNetwork()); PhaseTapChangerImpl tapChanger - = new PhaseTapChangerImpl(transformer, lowTapPosition, steps, terminal, - tapPosition, regulating, thresholdI); + = new PhaseTapChangerImpl(transformer, lowTapPosition, steps, terminal, tapPosition, regulationMode, regulationValue); transformer.setPhaseTapChanger(tapChanger); return tapChanger; } diff --git a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerImpl.java b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerImpl.java index f983887c..59d91776 100644 --- a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerImpl.java +++ b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerImpl.java @@ -8,6 +8,9 @@ import eu.itesla_project.iidm.network.PhaseTapChanger; import gnu.trove.list.array.TFloatArrayList; +import gnu.trove.list.array.TIntArrayList; + +import java.util.BitSet; import java.util.List; /** @@ -19,16 +22,20 @@ class PhaseTapChangerImpl extends TapChangerImpl steps, TerminalExt terminal, - int tapPosition, boolean regulating, float thresholdI) { - super(parent.getNetwork().getRef(), parent, lowTapPosition, steps, terminal, tapPosition, regulating); + int tapPosition, RegulationMode regulationMode, float regulationValue) { + super(parent.getNetwork().getRef(), parent, lowTapPosition, steps, terminal, tapPosition); int stateArraySize = network.get().getStateManager().getStateArraySize(); - this.thresholdI = new TFloatArrayList(stateArraySize); + this.regulationMode = new TIntArrayList(stateArraySize); + this.regulationValue = new TFloatArrayList(stateArraySize); for (int i = 0; i < stateArraySize; i++) { - this.thresholdI.add(thresholdI); + this.regulationMode.add(regulationMode.ordinal()); + this.regulationValue.add(regulationValue); } } @@ -38,25 +45,26 @@ protected NetworkImpl getNetwork() { } @Override - public PhaseTapChangerImpl setRegulating(boolean regulating) { - if (Float.isNaN(getThresholdI())) { - throw new ValidationException(parent, - "cannot change the regulating status if the threshold current is not set"); - } - return super.setRegulating(regulating); + public RegulationMode getRegulationMode() { + return RegulationMode.values()[regulationMode.get(network.get().getStateIndex())]; + } + + @Override + public PhaseTapChanger setRegulationMode(RegulationMode regulationMode) { + ValidationUtil.checkPhaseTapChangerRegulation(parent, regulationMode, getRegulationValue(), getTerminal(), getNetwork()); + this.regulationMode.set(network.get().getStateIndex(), regulationMode.ordinal()); + return this; } @Override - public float getThresholdI() { - return thresholdI.get(network.get().getStateIndex()); + public float getRegulationValue() { + return regulationValue.get(network.get().getStateIndex()); } @Override - public PhaseTapChanger setThresholdI(float thresholdI) { - if (Float.isNaN(thresholdI)) { - throw new ValidationException(parent, "invalid threshold current value (NaN)"); - } - this.thresholdI.set(network.get().getStateIndex(), thresholdI); + public PhaseTapChanger setRegulationValue(float regulationValue) { + ValidationUtil.checkPhaseTapChangerRegulation(parent, getRegulationMode(), regulationValue, getTerminal(), getNetwork()); + this.regulationValue.set(network.get().getStateIndex(), regulationValue); return this; } @@ -68,16 +76,19 @@ public void remove() { @Override public void extendStateArraySize(int initStateArraySize, int number, int sourceIndex) { super.extendStateArraySize(initStateArraySize, number, sourceIndex); - thresholdI.ensureCapacity(thresholdI.size() + number); + regulationMode.ensureCapacity(regulationMode.size() + number); + regulationValue.ensureCapacity(regulationValue.size() + number); for (int i = 0; i < number; i++) { - thresholdI.add(thresholdI.get(sourceIndex)); + regulationMode.add(regulationMode.get(sourceIndex)); + regulationValue.add(regulationValue.get(sourceIndex)); } } @Override public void reduceStateArraySize(int number) { super.reduceStateArraySize(number); - thresholdI.remove(thresholdI.size() - number, number); + regulationMode.remove(regulationMode.size() - number, number); + regulationValue.remove(regulationValue.size() - number, number); } @Override @@ -90,7 +101,8 @@ public void deleteStateArrayElement(int index) { public void allocateStateArrayElement(int[] indexes, final int sourceIndex) { super.allocateStateArrayElement(indexes, sourceIndex); for (int index : indexes) { - thresholdI.set(index, thresholdI.get(sourceIndex)); + regulationMode.set(index, regulationMode.get(sourceIndex)); + regulationValue.set(index, regulationValue.get(sourceIndex)); } } diff --git a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/RatioTapChangerImpl.java b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/RatioTapChangerImpl.java index 9fde62d3..c5f8f908 100644 --- a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/RatioTapChangerImpl.java +++ b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/RatioTapChangerImpl.java @@ -9,6 +9,8 @@ import eu.itesla_project.iidm.network.RatioTapChanger; import eu.itesla_project.iidm.network.Terminal; import gnu.trove.list.array.TFloatArrayList; + +import java.util.BitSet; import java.util.List; /** @@ -23,16 +25,20 @@ class RatioTapChangerImpl extends TapChangerImpl steps, TerminalExt terminal, boolean loadTapChangingCapabilities, int tapPosition, boolean regulating, float targetV) { - super(parent.getNetwork().getRef(), parent, lowTapPosition, steps, terminal, tapPosition, regulating); + super(parent.getNetwork().getRef(), parent, lowTapPosition, steps, terminal, tapPosition); this.loadTapChangingCapabilities = loadTapChangingCapabilities; int stateArraySize = network.get().getStateManager().getStateArraySize(); this.targetV = new TFloatArrayList(stateArraySize); for (int i = 0; i < stateArraySize; i++) { this.targetV.add(targetV); } + this.regulating = new BitSet(stateArraySize); + this.regulating.set(0, stateArraySize, regulating); } @Override @@ -40,6 +46,10 @@ protected NetworkImpl getNetwork() { return parent.getNetwork(); } + public boolean isRegulating() { + return regulating.get(network.get().getStateIndex()); + } + @Override public RatioTapChangerImpl setRegulating(boolean regulating) { if (!loadTapChangingCapabilities) { @@ -51,7 +61,12 @@ public RatioTapChangerImpl setRegulating(boolean regulating) { throw new ValidationException(parent, "cannot change the regulating status if the target voltage is not set"); } - return super.setRegulating(regulating); + if (regulating && terminal == null) { + throw new ValidationException(parent, + "cannot change the regulating status if the regulation terminal is not set"); + } + this.regulating.set(network.get().getStateIndex(), regulating); + return this; } @Override @@ -99,6 +114,7 @@ public void extendStateArraySize(int initStateArraySize, int number, int sourceI targetV.ensureCapacity(targetV.size() + number); for (int i = 0; i < number; i++) { targetV.add(targetV.get(sourceIndex)); + regulating.set(initStateArraySize + i, regulating.get(sourceIndex)); } } @@ -119,6 +135,7 @@ public void allocateStateArrayElement(int[] indexes, final int sourceIndex) { super.allocateStateArrayElement(indexes, sourceIndex); for (int index : indexes) { targetV.set(index, targetV.get(sourceIndex)); + regulating.set(index, regulating.get(sourceIndex)); } } diff --git a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/TapChangerImpl.java b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/TapChangerImpl.java index 7e776f5d..0537ed0f 100644 --- a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/TapChangerImpl.java +++ b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/TapChangerImpl.java @@ -26,17 +26,15 @@ abstract class TapChangerImpl steps; - private final TerminalExt terminal; + protected final TerminalExt terminal; // attributes depending on the state protected final TIntArrayList tapPosition; - protected final BitSet regulating; - protected TapChangerImpl(Ref network, H parent, int lowTapPosition, List steps, TerminalExt terminal, - int tapPosition, boolean regulating) { + int tapPosition) { this.network = network; this.parent = parent; this.lowTapPosition = lowTapPosition; @@ -44,8 +42,6 @@ protected TapChangerImpl(Ref network, H parent, this.terminal = terminal; int stateArraySize = network.get().getStateManager().getStateArraySize(); this.tapPosition = new TIntArrayList(stateArraySize); - this.regulating = new BitSet(stateArraySize); - this.regulating.set(0, stateArraySize, regulating); for (int i = 0; i < stateArraySize; i++) { this.tapPosition.add(tapPosition); } @@ -96,19 +92,6 @@ public S getCurrentStep() { return getStep(getTapPosition()); } - public boolean isRegulating() { - return regulating.get(network.get().getStateIndex()); - } - - public C setRegulating(boolean regulating) { - if (regulating && terminal == null) { - throw new ValidationException(parent, - "cannot change the regulating status if the regulation terminal is not set"); - } - this.regulating.set(network.get().getStateIndex(), regulating); - return (C) this; - } - public TerminalExt getTerminal() { return terminal; } @@ -126,7 +109,6 @@ public void setTerminal(Terminal t) { public void extendStateArraySize(int initStateArraySize, int number, int sourceIndex) { tapPosition.ensureCapacity(tapPosition.size() + number); for (int i = 0; i < number; i++) { - regulating.set(initStateArraySize + i, regulating.get(sourceIndex)); tapPosition.add(tapPosition.get(sourceIndex)); } } @@ -144,7 +126,6 @@ public void deleteStateArrayElement(int index) { @Override public void allocateStateArrayElement(int[] indexes, final int sourceIndex) { for (int index : indexes) { - regulating.set(index, regulating.get(sourceIndex)); tapPosition.set(index, tapPosition.get(sourceIndex)); } } diff --git a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/ValidationUtil.java b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/ValidationUtil.java index 0cf8893c..db0fd5c3 100644 --- a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/ValidationUtil.java +++ b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/ValidationUtil.java @@ -270,4 +270,20 @@ static void checkBmax(Validable validable, float bMax) { throw new ValidationException(validable, "bmax is invalid"); } } + + static void checkPhaseTapChangerRegulation(Validable validable, PhaseTapChanger.RegulationMode regulationMode, + float regulationValue, Terminal regulatedTerminal, Network network) { + if (regulationMode == null) { + throw new ValidationException(validable, "phase regulation mode is not set"); + } + if (regulationMode != PhaseTapChanger.RegulationMode.OFF && Float.isNaN(regulationValue)) { + throw new ValidationException(validable, "phase regulation is on and threshold/setpoint value is not set"); + } + if (regulationMode != PhaseTapChanger.RegulationMode.OFF && regulatedTerminal == null) { + throw new ValidationException(validable, "phase regulation is on and regulated terminal is not set"); + } + if (regulatedTerminal != null && regulatedTerminal.getVoltageLevel().getSubstation().getNetwork() != network) { + throw new ValidationException(validable, "phase regulation terminal is not part of the network"); + } + } } diff --git a/iidm-network-test/src/main/java/eu/itesla_project/iidm/network/test/PhaseShifterTestCaseFactory.java b/iidm-network-test/src/main/java/eu/itesla_project/iidm/network/test/PhaseShifterTestCaseFactory.java index f143eb1f..8d1a9966 100644 --- a/iidm-network-test/src/main/java/eu/itesla_project/iidm/network/test/PhaseShifterTestCaseFactory.java +++ b/iidm-network-test/src/main/java/eu/itesla_project/iidm/network/test/PhaseShifterTestCaseFactory.java @@ -117,8 +117,8 @@ public static Network create() { ps1.newPhaseTapChanger() .setTapPosition(1) .setTerminal(ps1.getTerminal2()) - .setRegulating(false) - .setThresholdI(200) + .setRegulationMode(PhaseTapChanger.RegulationMode.OFF) + .setRegulationValue(200) .beginStep() .setAlpha(-20f) .setRho(1f) diff --git a/iidm-xml-import-export/src/main/java/eu/itesla_project/iidm/xml/TransformerXml.java b/iidm-xml-import-export/src/main/java/eu/itesla_project/iidm/xml/TransformerXml.java index 3e972b96..cb2b8359 100644 --- a/iidm-xml-import-export/src/main/java/eu/itesla_project/iidm/xml/TransformerXml.java +++ b/iidm-xml-import-export/src/main/java/eu/itesla_project/iidm/xml/TransformerXml.java @@ -30,12 +30,12 @@ protected static void writeTapChangerStep(TapChangerStep tcs, XMLStreamWriter protected static void writeTapChanger(TapChanger tc, XMLStreamWriter writer) throws XMLStreamException { writer.writeAttribute("lowTapPosition", Integer.toString(tc.getLowTapPosition())); writer.writeAttribute("tapPosition", Integer.toString(tc.getTapPosition())); - writer.writeAttribute("regulating", Boolean.toString(tc.isRegulating())); } protected static void writeRatioTapChanger(String name, RatioTapChanger rtc, XmlWriterContext context) throws XMLStreamException { context.getWriter().writeStartElement(IIDM_URI, name); writeTapChanger(rtc, context.getWriter()); + context.getWriter().writeAttribute("regulating", Boolean.toString(rtc.isRegulating())); context.getWriter().writeAttribute("loadTapChangingCapabilities", Boolean.toString(rtc.hasLoadTapChangingCapabilities())); XmlUtil.writeFloat("targetV", rtc.getTargetV(), context.getWriter()); if (rtc.getTerminal() != null) { @@ -103,7 +103,8 @@ protected static void readRatioTapChanger(TwoWindingsTransformer twt, XMLStreamR protected static void writePhaseTapChanger(String name, PhaseTapChanger ptc, XmlWriterContext context) throws XMLStreamException { context.getWriter().writeStartElement(IIDM_URI, name); writeTapChanger(ptc, context.getWriter()); - XmlUtil.writeFloat("thresholdI", ptc.getThresholdI(), context.getWriter()); + context.getWriter().writeAttribute("regulationMode", ptc.getRegulationMode().name()); + XmlUtil.writeFloat("regulationValue", ptc.getRegulationValue(), context.getWriter()); if (ptc.getTerminal() != null) { writeTerminalRef(ptc.getTerminal(), context, "terminalRef"); } @@ -119,13 +120,13 @@ protected static void writePhaseTapChanger(String name, PhaseTapChanger ptc, Xml protected static void readPhaseTapChanger(TwoWindingsTransformer twt, XMLStreamReader reader, List endTasks) throws XMLStreamException { int lowTapPosition = XmlUtil.readIntAttribute(reader, "lowTapPosition"); int tapPosition = XmlUtil.readIntAttribute(reader, "tapPosition"); - boolean regulating = XmlUtil.readBoolAttribute(reader, "regulating"); - float thresholdI = XmlUtil.readOptionalFloatAttribute(reader, "thresholdI"); + PhaseTapChanger.RegulationMode regulationMode = PhaseTapChanger.RegulationMode.valueOf(reader.getAttributeValue(null, "regulationMode")); + float regulationValue = XmlUtil.readOptionalFloatAttribute(reader, "regulationValue"); PhaseTapChangerAdder adder = twt.newPhaseTapChanger() .setLowTapPosition(lowTapPosition) .setTapPosition(tapPosition) - .setRegulating(regulating) - .setThresholdI(thresholdI); + .setRegulationMode(regulationMode) + .setRegulationValue(regulationValue); boolean[] hasTerminalRef = new boolean[1]; XmlUtil.readUntilEndElement("phaseTapChanger", reader, () -> { switch (reader.getLocalName()) { diff --git a/iidm-xml-import-export/src/main/resources/xsd/iidm.xsd b/iidm-xml-import-export/src/main/resources/xsd/iidm.xsd index 11606fa2..fd318b5b 100644 --- a/iidm-xml-import-export/src/main/resources/xsd/iidm.xsd +++ b/iidm-xml-import-export/src/main/resources/xsd/iidm.xsd @@ -408,6 +408,13 @@ + + + + + + + @@ -415,8 +422,8 @@ - - + + diff --git a/iidm-xml-import-export/src/test/resources/phaseShifterRoundTripRef.xml b/iidm-xml-import-export/src/test/resources/phaseShifterRoundTripRef.xml index 89ff1f08..d47dc59e 100644 --- a/iidm-xml-import-export/src/test/resources/phaseShifterRoundTripRef.xml +++ b/iidm-xml-import-export/src/test/resources/phaseShifterRoundTripRef.xml @@ -15,7 +15,7 @@ - + diff --git a/online-workflow/src/main/java/eu/itesla_project/online/db/debug/NetworkDataExtractor.java b/online-workflow/src/main/java/eu/itesla_project/online/db/debug/NetworkDataExtractor.java index ea8a0403..b511410c 100644 --- a/online-workflow/src/main/java/eu/itesla_project/online/db/debug/NetworkDataExtractor.java +++ b/online-workflow/src/main/java/eu/itesla_project/online/db/debug/NetworkDataExtractor.java @@ -10,18 +10,10 @@ import java.util.List; import java.util.Objects; +import eu.itesla_project.iidm.network.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import eu.itesla_project.iidm.network.Bus; -import eu.itesla_project.iidm.network.Generator; -import eu.itesla_project.iidm.network.Line; -import eu.itesla_project.iidm.network.Load; -import eu.itesla_project.iidm.network.Network; -import eu.itesla_project.iidm.network.Terminal; -import eu.itesla_project.iidm.network.ThreeWindingsTransformer; -import eu.itesla_project.iidm.network.TwoWindingsTransformer; - /** * * @author Quinary @@ -205,7 +197,7 @@ private static float apparentPower(Terminal terminal) { private static boolean isRegulating(TwoWindingsTransformer tfo) { if ( tfo.getPhaseTapChanger() != null ) - return tfo.getPhaseTapChanger().isRegulating(); + return tfo.getPhaseTapChanger().getRegulationMode() != PhaseTapChanger.RegulationMode.OFF; if ( tfo.getRatioTapChanger() != null ) return tfo.getRatioTapChanger().isRegulating(); return false; diff --git a/ucte-import/src/main/java/eu/itesla_project/iidm/import_/ucte/UcteImporter.java b/ucte-import/src/main/java/eu/itesla_project/iidm/import_/ucte/UcteImporter.java index ef92245c..d11fe336 100644 --- a/ucte-import/src/main/java/eu/itesla_project/iidm/import_/ucte/UcteImporter.java +++ b/ucte-import/src/main/java/eu/itesla_project/iidm/import_/ucte/UcteImporter.java @@ -458,14 +458,9 @@ private static void createPhaseTapChanger(UcteAngleRegulation ucteAngleRegulatio PhaseTapChangerAdder ptca = transformer.newPhaseTapChanger() .setLowTapPosition(-ucteAngleRegulation.getN()) - .setTapPosition(ucteAngleRegulation.getNp()); - if (!Float.isNaN(ucteAngleRegulation.getP())) { - ptca.setRegulating(true) - .setThresholdI(ucteAngleRegulation.getP()) - .setTerminal(transformer.getTerminal1()); - } else { - ptca.setRegulating(false); - } + .setTapPosition(ucteAngleRegulation.getNp()) + .setRegulationMode(PhaseTapChanger.RegulationMode.OFF); + for (int i = -ucteAngleRegulation.getN(); i <= ucteAngleRegulation.getN(); i++) { float rho; float alpha; From a4de07601e63da1f4ebc5e08f74fe7c1f9263168 Mon Sep 17 00:00:00 2001 From: Geoffroy Jamgotchian Date: Mon, 24 Oct 2016 13:08:16 +0200 Subject: [PATCH 2/4] New phase shifter regulation mode: keep regularing attribute --- .../iidm/import_/cim1/CIM1Converter.java | 21 ++++---- .../eurostag/export/EurostagEchExport.java | 6 +-- .../ddb/eurostag_imp_exp/DdbDtaImpExp.java | 3 +- .../iidm/network/PhaseTapChanger.java | 4 +- .../iidm/network/PhaseTapChangerAdder.java | 4 +- .../iidm/network/RatioTapChanger.java | 16 ------ .../iidm/network/RatioTapChangerAdder.java | 2 +- .../iidm/network/TapChanger.java | 20 ++++++- .../impl/PhaseTapChangerAdderImpl.java | 21 +++++--- .../network/impl/PhaseTapChangerImpl.java | 38 +++++++------- .../impl/RatioTapChangerAdderImpl.java | 40 +++----------- .../network/impl/RatioTapChangerImpl.java | 52 +++---------------- .../iidm/network/impl/TapChangerImpl.java | 35 +++++++++---- .../iidm/network/impl/ValidationUtil.java | 34 ++++++++++-- .../test/EurostagTutorialExample1Factory.java | 2 +- .../test/PhaseShifterTestCaseFactory.java | 4 +- .../iidm/xml/TransformerXml.java | 33 ++++++++---- .../eu/itesla_project/iidm/xml/XmlUtil.java | 5 ++ .../src/main/resources/xsd/iidm.xsd | 5 +- .../resources/phaseShifterRoundTripRef.xml | 2 +- .../online/db/debug/NetworkDataExtractor.java | 3 +- .../iidm/import_/ucte/UcteImporter.java | 4 +- 22 files changed, 182 insertions(+), 172 deletions(-) diff --git a/cim1-import/src/main/java/eu/itesla_project/iidm/import_/cim1/CIM1Converter.java b/cim1-import/src/main/java/eu/itesla_project/iidm/import_/cim1/CIM1Converter.java index 06c2deb6..7cd81f56 100644 --- a/cim1-import/src/main/java/eu/itesla_project/iidm/import_/cim1/CIM1Converter.java +++ b/cim1-import/src/main/java/eu/itesla_project/iidm/import_/cim1/CIM1Converter.java @@ -540,17 +540,18 @@ private void createPhaseTapChanger(cim1.model.PhaseTapChanger ptc, cim1.model.Te cim1.model.RegulatingControl rc = ptc.getRegulatingControl(); switch (rc.getMode()) { case currentFlow: - Terminal regulatingTerminal; + Terminal regulationTerminal; if (rc.getTerminal() == t1) { - regulatingTerminal = transfo.getTerminal1(); + regulationTerminal = transfo.getTerminal1(); } else if (rc.getTerminal() == t2) { - regulatingTerminal = transfo.getTerminal2(); + regulationTerminal = transfo.getTerminal2(); } else { - regulatingTerminal = getTerminalMapping(rc.getTerminal().getTopologicalNode()); + regulationTerminal = getTerminalMapping(rc.getTerminal().getTopologicalNode()); } ptca.setRegulationMode(PhaseTapChanger.RegulationMode.CURRENT_LIMITER) .setRegulationValue(rc.getTargetValue()) - .setTerminal(regulatingTerminal); + .setRegulating(true) + .setRegulationTerminal(regulationTerminal); break; case fixed: @@ -607,19 +608,19 @@ private void createRatioTapChanger(cim1.model.RatioTapChanger rtc, Supplier e : terminals.entrySet()) { if (rc.getTerminal() == e.getKey()) { - regulatingTerminal = e.getValue(); + regulationTerminal = e.getValue(); } } - if (regulatingTerminal == null) { - regulatingTerminal = getTerminalMapping(rc.getTerminal().getTopologicalNode()); + if (regulationTerminal == null) { + regulationTerminal = getTerminalMapping(rc.getTerminal().getTopologicalNode()); } rtca.setLoadTapChangingCapabilities(true) .setRegulating(regulating) .setTargetV(targetV) - .setTerminal(regulatingTerminal); + .setRegulationTerminal(regulationTerminal); break; case fixed: diff --git a/eurostag-ech-export/src/main/java/eu/itesla_project/iidm/eurostag/export/EurostagEchExport.java b/eurostag-ech-export/src/main/java/eu/itesla_project/iidm/eurostag/export/EurostagEchExport.java index d5a76a4c..762b16a9 100644 --- a/eurostag-ech-export/src/main/java/eu/itesla_project/iidm/eurostag/export/EurostagEchExport.java +++ b/eurostag-ech-export/src/main/java/eu/itesla_project/iidm/eurostag/export/EurostagEchExport.java @@ -257,7 +257,7 @@ private void createTransformers(EsgNetwork esgNetwork, EsgGeneralParameters para PhaseTapChanger ptc = twt.getPhaseTapChanger(); if (rtc != null && ptc == null) { if (rtc.isRegulating()) { - ConnectionBus regulatingBus = ConnectionBus.fromTerminal(rtc.getTerminal(), config, null); + ConnectionBus regulatingBus = ConnectionBus.fromTerminal(rtc.getRegulationTerminal(), config, null); if (regulatingBus.getId() != null) { regulatingMode = EsgDetailedTwoWindingTransformer.RegulatingMode.VOLTAGE; zbusr = new Esg8charName(dictionary.getEsgId(regulatingBus.getId())); @@ -272,8 +272,8 @@ private void createTransformers(EsgNetwork esgNetwork, EsgGeneralParameters para } } else if (ptc != null && rtc == null) { - if (ptc.getRegulationMode() == PhaseTapChanger.RegulationMode.CURRENT_LIMITER) { - String regulbus = EchUtil.getBus(ptc.getTerminal(), config).getId(); + if (ptc.getRegulationMode() == PhaseTapChanger.RegulationMode.CURRENT_LIMITER && ptc.isRegulating()) { + String regulbus = EchUtil.getBus(ptc.getRegulationTerminal(), config).getId(); if (regulbus.equals(bus1.getId())) { regulatingMode = EsgDetailedTwoWindingTransformer.RegulatingMode.ACTIVE_FLUX_SIDE_1; } diff --git a/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DdbDtaImpExp.java b/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DdbDtaImpExp.java index 94416b4e..b611eb21 100644 --- a/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DdbDtaImpExp.java +++ b/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DdbDtaImpExp.java @@ -1443,7 +1443,8 @@ public void dumpDataAutomatons(SimulatorInst eurostagSim, DDBManager ddbmanager, ) { dumpDataTransformerAutomaton(t, eurostagSim, "A14_HT", dtaOutStream, iidm2eurostagId); } else if(t.getPhaseTapChanger() != null - && t.getPhaseTapChanger().getRegulationMode() != PhaseTapChanger.RegulationMode.OFF) { // TD + && t.getPhaseTapChanger().getRegulationMode() != PhaseTapChanger.RegulationMode.FIXED_TAP + && t.getPhaseTapChanger().isRegulating()) { // TD //TODO //dumpDataTransformerAutomaton(t, eurostagSim, "A14_TD", dtaOutStream, iidm2eurostagId); } diff --git a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChanger.java b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChanger.java index 3d2f3458..f4b82dba 100644 --- a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChanger.java +++ b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChanger.java @@ -16,13 +16,11 @@ public interface PhaseTapChanger extends TapChanger - * Depends on the working state. * @return the regulation mode */ RegulationMode getRegulationMode(); diff --git a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChangerAdder.java b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChangerAdder.java index 151be542..32032361 100644 --- a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChangerAdder.java +++ b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChangerAdder.java @@ -33,11 +33,13 @@ interface StepAdder { PhaseTapChangerAdder setTapPosition(int tapPosition); + PhaseTapChangerAdder setRegulating(boolean regulating); + PhaseTapChangerAdder setRegulationMode(PhaseTapChanger.RegulationMode regulationMode); PhaseTapChangerAdder setRegulationValue(float regulationValue); - PhaseTapChangerAdder setTerminal(Terminal terminal); + PhaseTapChangerAdder setRegulationTerminal(Terminal regulationTerminal); StepAdder beginStep(); diff --git a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/RatioTapChanger.java b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/RatioTapChanger.java index 0d8e1bda..875f98f1 100644 --- a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/RatioTapChanger.java +++ b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/RatioTapChanger.java @@ -34,20 +34,4 @@ public interface RatioTapChanger extends TapChanger - * Depends on the working state. - * @see StateManager - */ - boolean isRegulating(); - - /** - * Set the regulating status. - *

- * Depends on the working state. - * @see StateManager - */ - RatioTapChanger setRegulating(boolean regulating); - } diff --git a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/RatioTapChangerAdder.java b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/RatioTapChangerAdder.java index 139460aa..a8b4af36 100644 --- a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/RatioTapChangerAdder.java +++ b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/RatioTapChangerAdder.java @@ -37,7 +37,7 @@ public interface StepAdder { RatioTapChangerAdder setTargetV(float targetV); - RatioTapChangerAdder setTerminal(Terminal terminal); + RatioTapChangerAdder setRegulationTerminal(Terminal regulationTerminal); StepAdder beginStep(); diff --git a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/TapChanger.java b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/TapChanger.java index 38efe329..5a7181db 100644 --- a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/TapChanger.java +++ b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/TapChanger.java @@ -63,15 +63,31 @@ public interface TapChanger, TCS extends TapChang */ TCS getCurrentStep(); + /** + * Get the regulating status. + *

+ * Depends on the working state. + * @see StateManager + */ + boolean isRegulating(); + + /** + * Set the regulating status. + *

+ * Depends on the working state. + * @see StateManager + */ + TC setRegulating(boolean regulating); + /** * Get the terminal used for regulation. */ - Terminal getTerminal(); + Terminal getRegulationTerminal(); /** * Set the terminal used for regulation. */ - void setTerminal(Terminal t); + TC setRegulationTerminal(Terminal regulationTerminal); /** * Remove the tap changer. diff --git a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerAdderImpl.java b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerAdderImpl.java index d654d01d..be7e1467 100644 --- a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerAdderImpl.java +++ b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerAdderImpl.java @@ -8,7 +8,6 @@ import eu.itesla_project.iidm.network.PhaseTapChanger; import eu.itesla_project.iidm.network.PhaseTapChangerAdder; -import eu.itesla_project.iidm.network.RatioTapChangerAdder; import eu.itesla_project.iidm.network.Terminal; import java.util.ArrayList; import java.util.List; @@ -27,11 +26,13 @@ class PhaseTapChangerAdderImpl implements PhaseTapChangerAdder { private final List steps = new ArrayList<>(); - private PhaseTapChanger.RegulationMode regulationMode = PhaseTapChanger.RegulationMode.OFF; + private PhaseTapChanger.RegulationMode regulationMode = PhaseTapChanger.RegulationMode.FIXED_TAP; private float regulationValue = Float.NaN; - private TerminalExt terminal; + private boolean regulating = false; + + private TerminalExt regulationTerminal; class StepAdderImpl implements StepAdder { @@ -143,8 +144,14 @@ public PhaseTapChangerAdder setRegulationValue(float regulationValue) { } @Override - public PhaseTapChangerAdder setTerminal(Terminal terminal) { - this.terminal = (TerminalExt) terminal; + public PhaseTapChangerAdder setRegulating(boolean regulating) { + this.regulating = regulating; + return this; + } + + @Override + public PhaseTapChangerAdder setRegulationTerminal(Terminal regulationTerminal) { + this.regulationTerminal = (TerminalExt) regulationTerminal; return this; } @@ -167,9 +174,9 @@ public PhaseTapChanger add() { + tapPosition + " [" + lowTapPosition + ", " + highTapPosition + "]"); } - ValidationUtil.checkPhaseTapChangerRegulation(transformer, regulationMode, regulationValue, terminal, getNetwork()); + ValidationUtil.checkPhaseTapChangerRegulation(transformer, regulationMode, regulationValue, regulating, regulationTerminal, getNetwork()); PhaseTapChangerImpl tapChanger - = new PhaseTapChangerImpl(transformer, lowTapPosition, steps, terminal, tapPosition, regulationMode, regulationValue); + = new PhaseTapChangerImpl(transformer, lowTapPosition, steps, regulationTerminal, tapPosition, regulating, regulationMode, regulationValue); transformer.setPhaseTapChanger(tapChanger); return tapChanger; } diff --git a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerImpl.java b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerImpl.java index 59d91776..52a235ba 100644 --- a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerImpl.java +++ b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/PhaseTapChangerImpl.java @@ -7,10 +7,9 @@ package eu.itesla_project.iidm.network.impl; import eu.itesla_project.iidm.network.PhaseTapChanger; +import eu.itesla_project.iidm.network.Terminal; import gnu.trove.list.array.TFloatArrayList; -import gnu.trove.list.array.TIntArrayList; -import java.util.BitSet; import java.util.List; /** @@ -20,21 +19,20 @@ class PhaseTapChangerImpl extends TapChangerImpl implements PhaseTapChanger { - // attributes depending on the state + private RegulationMode regulationMode; - private final TIntArrayList regulationMode; + // attributes depending on the state private final TFloatArrayList regulationValue; PhaseTapChangerImpl(TwoWindingsTransformerImpl parent, int lowTapPosition, - List steps, TerminalExt terminal, - int tapPosition, RegulationMode regulationMode, float regulationValue) { - super(parent.getNetwork().getRef(), parent, lowTapPosition, steps, terminal, tapPosition); + List steps, TerminalExt regulationTerminal, + int tapPosition, boolean regulating, RegulationMode regulationMode, float regulationValue) { + super(parent.getNetwork().getRef(), parent, lowTapPosition, steps, regulationTerminal, tapPosition, regulating); int stateArraySize = network.get().getStateManager().getStateArraySize(); - this.regulationMode = new TIntArrayList(stateArraySize); + this.regulationMode = regulationMode; this.regulationValue = new TFloatArrayList(stateArraySize); for (int i = 0; i < stateArraySize; i++) { - this.regulationMode.add(regulationMode.ordinal()); this.regulationValue.add(regulationValue); } } @@ -46,13 +44,13 @@ protected NetworkImpl getNetwork() { @Override public RegulationMode getRegulationMode() { - return RegulationMode.values()[regulationMode.get(network.get().getStateIndex())]; + return regulationMode; } @Override - public PhaseTapChanger setRegulationMode(RegulationMode regulationMode) { - ValidationUtil.checkPhaseTapChangerRegulation(parent, regulationMode, getRegulationValue(), getTerminal(), getNetwork()); - this.regulationMode.set(network.get().getStateIndex(), regulationMode.ordinal()); + public PhaseTapChangerImpl setRegulationMode(RegulationMode regulationMode) { + ValidationUtil.checkPhaseTapChangerRegulation(parent, regulationMode, getRegulationValue(), isRegulating(), getRegulationTerminal(), getNetwork()); + this.regulationMode = regulationMode; return this; } @@ -62,12 +60,18 @@ public float getRegulationValue() { } @Override - public PhaseTapChanger setRegulationValue(float regulationValue) { - ValidationUtil.checkPhaseTapChangerRegulation(parent, getRegulationMode(), regulationValue, getTerminal(), getNetwork()); + public PhaseTapChangerImpl setRegulationValue(float regulationValue) { + ValidationUtil.checkPhaseTapChangerRegulation(parent, regulationMode, regulationValue, isRegulating(), getRegulationTerminal(), getNetwork()); this.regulationValue.set(network.get().getStateIndex(), regulationValue); return this; } + @Override + public PhaseTapChangerImpl setRegulationTerminal(Terminal regulationTerminal) { + ValidationUtil.checkPhaseTapChangerRegulation(parent, regulationMode, getRegulationValue(), isRegulating(), regulationTerminal, getNetwork()); + return super.setRegulationTerminal(regulationTerminal); + } + @Override public void remove() { parent.setPhaseTapChanger(null); @@ -76,10 +80,8 @@ public void remove() { @Override public void extendStateArraySize(int initStateArraySize, int number, int sourceIndex) { super.extendStateArraySize(initStateArraySize, number, sourceIndex); - regulationMode.ensureCapacity(regulationMode.size() + number); regulationValue.ensureCapacity(regulationValue.size() + number); for (int i = 0; i < number; i++) { - regulationMode.add(regulationMode.get(sourceIndex)); regulationValue.add(regulationValue.get(sourceIndex)); } } @@ -87,7 +89,6 @@ public void extendStateArraySize(int initStateArraySize, int number, int sourceI @Override public void reduceStateArraySize(int number) { super.reduceStateArraySize(number); - regulationMode.remove(regulationMode.size() - number, number); regulationValue.remove(regulationValue.size() - number, number); } @@ -101,7 +102,6 @@ public void deleteStateArrayElement(int index) { public void allocateStateArrayElement(int[] indexes, final int sourceIndex) { super.allocateStateArrayElement(indexes, sourceIndex); for (int index : indexes) { - regulationMode.set(index, regulationMode.get(sourceIndex)); regulationValue.set(index, regulationValue.get(sourceIndex)); } } diff --git a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/RatioTapChangerAdderImpl.java b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/RatioTapChangerAdderImpl.java index 06b6ee8f..adf119de 100644 --- a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/RatioTapChangerAdderImpl.java +++ b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/RatioTapChangerAdderImpl.java @@ -26,13 +26,13 @@ class RatioTapChangerAdderImpl implements RatioTapChangerAdder { private final List steps = new ArrayList<>(); - private Boolean loadTapChangingCapabilities; + private boolean loadTapChangingCapabilities = false; - private Boolean regulating; + private boolean regulating = false; private float targetV = Float.NaN; - private TerminalExt terminal; + private TerminalExt regulationTerminal; class StepAdderImpl implements StepAdder { @@ -139,8 +139,8 @@ public RatioTapChangerAdder setTargetV(float targetV) { } @Override - public RatioTapChangerAdder setTerminal(Terminal terminal) { - this.terminal = (TerminalExt) terminal; + public RatioTapChangerAdder setRegulationTerminal(Terminal regulationTerminal) { + this.regulationTerminal = (TerminalExt) regulationTerminal; return this; } @@ -163,34 +163,10 @@ public RatioTapChanger add() { + tapPosition + " [" + lowTapPosition + ", " + highTapPosition + "]"); } - if (loadTapChangingCapabilities == null) { - throw new ValidationException(parent, "load tap changing capabilities is not set"); - } - if (loadTapChangingCapabilities) { - if (regulating == null) { - throw new ValidationException(parent, - "a regulating status has to be set for a ratio tap changer with load tap changing capabilities"); - } - if (regulating) { - if (Float.isNaN(targetV)) { - throw new ValidationException(parent, - "a target voltage has to be set for a regulating ratio tap changer"); - } - if (targetV <= 0) { - throw new ValidationException(parent, "bad target voltage " + targetV); - } - if (terminal == null) { - throw new ValidationException(parent, - "a regulation terminal has to be set for a regulating ratio tap changer"); - } - } - } - if (terminal != null && terminal.getVoltageLevel().getNetwork() != getNetwork()) { - throw new ValidationException(parent, "regulation terminal is not part of the network"); - } + ValidationUtil.checkRatioTapChangerRegulation(parent, loadTapChangingCapabilities, regulating, regulationTerminal, targetV, getNetwork()); RatioTapChangerImpl tapChanger - = new RatioTapChangerImpl(parent, lowTapPosition, steps, terminal, loadTapChangingCapabilities, - tapPosition, regulating != null ? regulating : false, targetV); + = new RatioTapChangerImpl(parent, lowTapPosition, steps, regulationTerminal, loadTapChangingCapabilities, + tapPosition, regulating, targetV); parent.setRatioTapChanger(tapChanger); return tapChanger; } diff --git a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/RatioTapChangerImpl.java b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/RatioTapChangerImpl.java index c5f8f908..fe293075 100644 --- a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/RatioTapChangerImpl.java +++ b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/RatioTapChangerImpl.java @@ -9,8 +9,6 @@ import eu.itesla_project.iidm.network.RatioTapChanger; import eu.itesla_project.iidm.network.Terminal; import gnu.trove.list.array.TFloatArrayList; - -import java.util.BitSet; import java.util.List; /** @@ -25,20 +23,16 @@ class RatioTapChangerImpl extends TapChangerImpl steps, TerminalExt terminal, boolean loadTapChangingCapabilities, + List steps, TerminalExt regulationTerminal, boolean loadTapChangingCapabilities, int tapPosition, boolean regulating, float targetV) { - super(parent.getNetwork().getRef(), parent, lowTapPosition, steps, terminal, tapPosition); + super(parent.getNetwork().getRef(), parent, lowTapPosition, steps, regulationTerminal, tapPosition, regulating); this.loadTapChangingCapabilities = loadTapChangingCapabilities; int stateArraySize = network.get().getStateManager().getStateArraySize(); this.targetV = new TFloatArrayList(stateArraySize); for (int i = 0; i < stateArraySize; i++) { this.targetV.add(targetV); } - this.regulating = new BitSet(stateArraySize); - this.regulating.set(0, stateArraySize, regulating); } @Override @@ -46,27 +40,10 @@ protected NetworkImpl getNetwork() { return parent.getNetwork(); } - public boolean isRegulating() { - return regulating.get(network.get().getStateIndex()); - } - @Override public RatioTapChangerImpl setRegulating(boolean regulating) { - if (!loadTapChangingCapabilities) { - throw new ValidationException(parent, - "cannot change the regulating status of a ratio tap " - + "changer without any load tap changing capabilities"); - } - if (Float.isNaN(getTargetV())) { - throw new ValidationException(parent, - "cannot change the regulating status if the target voltage is not set"); - } - if (regulating && terminal == null) { - throw new ValidationException(parent, - "cannot change the regulating status if the regulation terminal is not set"); - } - this.regulating.set(network.get().getStateIndex(), regulating); - return this; + ValidationUtil.checkRatioTapChangerRegulation(parent, loadTapChangingCapabilities, regulating, regulationTerminal, getTargetV(), getNetwork()); + return super.setRegulating(regulating); } @Override @@ -81,26 +58,15 @@ public float getTargetV() { @Override public RatioTapChangerImpl setTargetV(float targetV) { - if (!loadTapChangingCapabilities) { - throw new ValidationException(parent, - "cannot change the target voltage of a ration tap " - + "changer without any load tap changing capabilities"); - } - if (Float.isNaN(targetV)) { - throw new ValidationException(parent, "invalid target voltage value (NaN)"); - } + ValidationUtil.checkRatioTapChangerRegulation(parent, loadTapChangingCapabilities, isRegulating(), regulationTerminal, targetV, getNetwork()); this.targetV.set(network.get().getStateIndex(), targetV); return this; } @Override - public void setTerminal(Terminal t) { - if (!loadTapChangingCapabilities) { - throw new ValidationException(parent, - "cannot change the regulation terminal of a ration tap " - + "changer without any load tap changing capabilities"); - } - super.setTerminal(t); + public RatioTapChangerImpl setRegulationTerminal(Terminal regulationTerminal) { + ValidationUtil.checkRatioTapChangerRegulation(parent, loadTapChangingCapabilities, isRegulating(), regulationTerminal, getTargetV(), getNetwork()); + return super.setRegulationTerminal(regulationTerminal); } @Override @@ -114,7 +80,6 @@ public void extendStateArraySize(int initStateArraySize, int number, int sourceI targetV.ensureCapacity(targetV.size() + number); for (int i = 0; i < number; i++) { targetV.add(targetV.get(sourceIndex)); - regulating.set(initStateArraySize + i, regulating.get(sourceIndex)); } } @@ -135,7 +100,6 @@ public void allocateStateArrayElement(int[] indexes, final int sourceIndex) { super.allocateStateArrayElement(indexes, sourceIndex); for (int index : indexes) { targetV.set(index, targetV.get(sourceIndex)); - regulating.set(index, regulating.get(sourceIndex)); } } diff --git a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/TapChangerImpl.java b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/TapChangerImpl.java index 0537ed0f..484fcfa0 100644 --- a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/TapChangerImpl.java +++ b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/TapChangerImpl.java @@ -26,22 +26,26 @@ abstract class TapChangerImpl steps; - protected final TerminalExt terminal; + protected TerminalExt regulationTerminal; // attributes depending on the state protected final TIntArrayList tapPosition; + protected final BitSet regulating; + protected TapChangerImpl(Ref network, H parent, - int lowTapPosition, List steps, TerminalExt terminal, - int tapPosition) { + int lowTapPosition, List steps, TerminalExt regulationTerminal, + int tapPosition, boolean regulating) { this.network = network; this.parent = parent; this.lowTapPosition = lowTapPosition; this.steps = steps; - this.terminal = terminal; + this.regulationTerminal = regulationTerminal; int stateArraySize = network.get().getStateManager().getStateArraySize(); this.tapPosition = new TIntArrayList(stateArraySize); + this.regulating = new BitSet(stateArraySize); + this.regulating.set(0, stateArraySize, regulating); for (int i = 0; i < stateArraySize; i++) { this.tapPosition.add(tapPosition); } @@ -92,23 +96,35 @@ public S getCurrentStep() { return getStep(getTapPosition()); } - public TerminalExt getTerminal() { - return terminal; + public boolean isRegulating() { + return regulating.get(network.get().getStateIndex()); + } + + public C setRegulating(boolean regulating) { + this.regulating.set(network.get().getStateIndex(), regulating); + return (C) this; } - public void setTerminal(Terminal t) { - if (terminal == null) { + public TerminalExt getRegulationTerminal() { + return regulationTerminal; + } + + public C setRegulationTerminal(Terminal regulationTerminal) { + if (regulationTerminal == null) { throw new ValidationException(parent, "regulation terminal is null"); } - if (terminal.getVoltageLevel().getNetwork() != getNetwork()) { + if (((TerminalExt) regulationTerminal).getVoltageLevel().getNetwork() != getNetwork()) { throw new ValidationException(parent, "regulation terminal is not part of the network"); } + this.regulationTerminal = (TerminalExt) regulationTerminal; + return (C) this; } @Override public void extendStateArraySize(int initStateArraySize, int number, int sourceIndex) { tapPosition.ensureCapacity(tapPosition.size() + number); for (int i = 0; i < number; i++) { + regulating.set(initStateArraySize + i, regulating.get(sourceIndex)); tapPosition.add(tapPosition.get(sourceIndex)); } } @@ -126,6 +142,7 @@ public void deleteStateArrayElement(int index) { @Override public void allocateStateArrayElement(int[] indexes, final int sourceIndex) { for (int index : indexes) { + regulating.set(index, regulating.get(sourceIndex)); tapPosition.set(index, tapPosition.get(sourceIndex)); } } diff --git a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/ValidationUtil.java b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/ValidationUtil.java index db0fd5c3..43b2a260 100644 --- a/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/ValidationUtil.java +++ b/iidm-network-impl/src/main/java/eu/itesla_project/iidm/network/impl/ValidationUtil.java @@ -271,19 +271,45 @@ static void checkBmax(Validable validable, float bMax) { } } + static void checkRatioTapChangerRegulation(Validable validable, boolean loadTapChangingCapabilities, boolean regulating, + Terminal regulationTerminal, float targetV, Network network) { + if (loadTapChangingCapabilities) { + if (regulating) { + if (Float.isNaN(targetV)) { + throw new ValidationException(validable, + "a target voltage has to be set for a regulating ratio tap changer"); + } + if (targetV <= 0) { + throw new ValidationException(validable, "bad target voltage " + targetV); + } + if (regulationTerminal == null) { + throw new ValidationException(validable, + "a regulation terminal has to be set for a regulating ratio tap changer"); + } + if (regulationTerminal != null && regulationTerminal.getVoltageLevel().getSubstation().getNetwork() != network) { + throw new ValidationException(validable, "regulation terminal is not part of the network"); + } + } + } + } + static void checkPhaseTapChangerRegulation(Validable validable, PhaseTapChanger.RegulationMode regulationMode, - float regulationValue, Terminal regulatedTerminal, Network network) { + float regulationValue, boolean regulating, Terminal regulationTerminal, + Network network) { if (regulationMode == null) { throw new ValidationException(validable, "phase regulation mode is not set"); } - if (regulationMode != PhaseTapChanger.RegulationMode.OFF && Float.isNaN(regulationValue)) { + if (regulationMode != PhaseTapChanger.RegulationMode.FIXED_TAP && Float.isNaN(regulationValue)) { throw new ValidationException(validable, "phase regulation is on and threshold/setpoint value is not set"); } - if (regulationMode != PhaseTapChanger.RegulationMode.OFF && regulatedTerminal == null) { + if (regulationMode != PhaseTapChanger.RegulationMode.FIXED_TAP && regulationTerminal == null) { throw new ValidationException(validable, "phase regulation is on and regulated terminal is not set"); } - if (regulatedTerminal != null && regulatedTerminal.getVoltageLevel().getSubstation().getNetwork() != network) { + if (regulationTerminal != null && regulationTerminal.getVoltageLevel().getSubstation().getNetwork() != network) { throw new ValidationException(validable, "phase regulation terminal is not part of the network"); } + if (regulationMode == PhaseTapChanger.RegulationMode.FIXED_TAP && regulating) { + throw new ValidationException(validable, "phase regulation cannot be on if mode is FIXED"); + } } } diff --git a/iidm-network-test/src/main/java/eu/itesla_project/iidm/network/test/EurostagTutorialExample1Factory.java b/iidm-network-test/src/main/java/eu/itesla_project/iidm/network/test/EurostagTutorialExample1Factory.java index 268121fb..7646e2e2 100644 --- a/iidm-network-test/src/main/java/eu/itesla_project/iidm/network/test/EurostagTutorialExample1Factory.java +++ b/iidm-network-test/src/main/java/eu/itesla_project/iidm/network/test/EurostagTutorialExample1Factory.java @@ -162,7 +162,7 @@ public static Network create() { .setLoadTapChangingCapabilities(true) .setRegulating(true) .setTargetV(158) - .setTerminal(nhv2_nload.getTerminal2()) + .setRegulationTerminal(nhv2_nload.getTerminal2()) .add(); Load load = vlload.newLoad() .setId("LOAD") diff --git a/iidm-network-test/src/main/java/eu/itesla_project/iidm/network/test/PhaseShifterTestCaseFactory.java b/iidm-network-test/src/main/java/eu/itesla_project/iidm/network/test/PhaseShifterTestCaseFactory.java index 8d1a9966..376c6470 100644 --- a/iidm-network-test/src/main/java/eu/itesla_project/iidm/network/test/PhaseShifterTestCaseFactory.java +++ b/iidm-network-test/src/main/java/eu/itesla_project/iidm/network/test/PhaseShifterTestCaseFactory.java @@ -116,8 +116,8 @@ public static Network create() { ps1.getTerminal2().setP(-50.042015f).setQ(-27.100708f); ps1.newPhaseTapChanger() .setTapPosition(1) - .setTerminal(ps1.getTerminal2()) - .setRegulationMode(PhaseTapChanger.RegulationMode.OFF) + .setRegulationTerminal(ps1.getTerminal2()) + .setRegulationMode(PhaseTapChanger.RegulationMode.FIXED_TAP) .setRegulationValue(200) .beginStep() .setAlpha(-20f) diff --git a/iidm-xml-import-export/src/main/java/eu/itesla_project/iidm/xml/TransformerXml.java b/iidm-xml-import-export/src/main/java/eu/itesla_project/iidm/xml/TransformerXml.java index cb2b8359..bdfae627 100644 --- a/iidm-xml-import-export/src/main/java/eu/itesla_project/iidm/xml/TransformerXml.java +++ b/iidm-xml-import-export/src/main/java/eu/itesla_project/iidm/xml/TransformerXml.java @@ -35,11 +35,15 @@ protected static void writeTapChanger(TapChanger tc, XMLStreamWriter write protected static void writeRatioTapChanger(String name, RatioTapChanger rtc, XmlWriterContext context) throws XMLStreamException { context.getWriter().writeStartElement(IIDM_URI, name); writeTapChanger(rtc, context.getWriter()); - context.getWriter().writeAttribute("regulating", Boolean.toString(rtc.isRegulating())); context.getWriter().writeAttribute("loadTapChangingCapabilities", Boolean.toString(rtc.hasLoadTapChangingCapabilities())); - XmlUtil.writeFloat("targetV", rtc.getTargetV(), context.getWriter()); - if (rtc.getTerminal() != null) { - writeTerminalRef(rtc.getTerminal(), context, "terminalRef"); + if (rtc.hasLoadTapChangingCapabilities() || rtc.isRegulating()) { + context.getWriter().writeAttribute("regulating", Boolean.toString(rtc.isRegulating())); + } + if (rtc.hasLoadTapChangingCapabilities() || !Float.isNaN(rtc.getTargetV())) { + XmlUtil.writeFloat("targetV", rtc.getTargetV(), context.getWriter()); + } + if (rtc.hasLoadTapChangingCapabilities() || rtc.getRegulationTerminal() != null) { + writeTerminalRef(rtc.getRegulationTerminal(), context, "terminalRef"); } for (int p = rtc.getLowTapPosition(); p <= rtc.getHighTapPosition(); p++) { RatioTapChangerStep rtcs = rtc.getStep(p); @@ -52,7 +56,7 @@ protected static void writeRatioTapChanger(String name, RatioTapChanger rtc, Xml protected static void readRatioTapChanger(TwoWindingsTransformer twt, XMLStreamReader reader, List endTasks) throws XMLStreamException { int lowTapPosition = XmlUtil.readIntAttribute(reader, "lowTapPosition"); int tapPosition = XmlUtil.readIntAttribute(reader, "tapPosition"); - boolean regulating = XmlUtil.readBoolAttribute(reader, "regulating"); + boolean regulating = XmlUtil.readOptionalBoolAttribute(reader, "regulating", false); boolean loadTapChangingCapabilities = XmlUtil.readBoolAttribute(reader, "loadTapChangingCapabilities"); float targetV = XmlUtil.readOptionalFloatAttribute(reader, "targetV"); RatioTapChangerAdder adder = twt.newRatioTapChanger() @@ -70,7 +74,7 @@ protected static void readRatioTapChanger(TwoWindingsTransformer twt, XMLStreamR String id = reader.getAttributeValue(null, "id"); String side = reader.getAttributeValue(null, "side"); endTasks.add(() -> { - adder.setTerminal(readTerminalRef(twt.getTerminal1().getVoltageLevel().getSubstation().getNetwork(), id, side)); + adder.setRegulationTerminal(readTerminalRef(twt.getTerminal1().getVoltageLevel().getSubstation().getNetwork(), id, side)); adder.add(); }); hasTerminalRef[0] = true; @@ -104,9 +108,14 @@ protected static void writePhaseTapChanger(String name, PhaseTapChanger ptc, Xml context.getWriter().writeStartElement(IIDM_URI, name); writeTapChanger(ptc, context.getWriter()); context.getWriter().writeAttribute("regulationMode", ptc.getRegulationMode().name()); - XmlUtil.writeFloat("regulationValue", ptc.getRegulationValue(), context.getWriter()); - if (ptc.getTerminal() != null) { - writeTerminalRef(ptc.getTerminal(), context, "terminalRef"); + if (ptc.getRegulationMode() != PhaseTapChanger.RegulationMode.FIXED_TAP || !Float.isNaN(ptc.getRegulationValue())) { + XmlUtil.writeFloat("regulationValue", ptc.getRegulationValue(), context.getWriter()); + } + if (ptc.getRegulationMode() != PhaseTapChanger.RegulationMode.FIXED_TAP || ptc.isRegulating()) { + context.getWriter().writeAttribute("regulating", Boolean.toString(ptc.isRegulating())); + } + if (ptc.getRegulationMode() != PhaseTapChanger.RegulationMode.FIXED_TAP || ptc.getRegulationTerminal() != null) { + writeTerminalRef(ptc.getRegulationTerminal(), context, "terminalRef"); } for (int p = ptc.getLowTapPosition(); p <= ptc.getHighTapPosition(); p++) { PhaseTapChangerStep ptcs = ptc.getStep(p); @@ -122,11 +131,13 @@ protected static void readPhaseTapChanger(TwoWindingsTransformer twt, XMLStreamR int tapPosition = XmlUtil.readIntAttribute(reader, "tapPosition"); PhaseTapChanger.RegulationMode regulationMode = PhaseTapChanger.RegulationMode.valueOf(reader.getAttributeValue(null, "regulationMode")); float regulationValue = XmlUtil.readOptionalFloatAttribute(reader, "regulationValue"); + boolean regulating = XmlUtil.readOptionalBoolAttribute(reader, "regulating", false); PhaseTapChangerAdder adder = twt.newPhaseTapChanger() .setLowTapPosition(lowTapPosition) .setTapPosition(tapPosition) .setRegulationMode(regulationMode) - .setRegulationValue(regulationValue); + .setRegulationValue(regulationValue) + .setRegulating(regulating); boolean[] hasTerminalRef = new boolean[1]; XmlUtil.readUntilEndElement("phaseTapChanger", reader, () -> { switch (reader.getLocalName()) { @@ -134,7 +145,7 @@ protected static void readPhaseTapChanger(TwoWindingsTransformer twt, XMLStreamR String id = reader.getAttributeValue(null, "id"); String side = reader.getAttributeValue(null, "side"); endTasks.add(() -> { - adder.setTerminal(readTerminalRef(twt.getTerminal1().getVoltageLevel().getSubstation().getNetwork(), id, side)); + adder.setRegulationTerminal(readTerminalRef(twt.getTerminal1().getVoltageLevel().getSubstation().getNetwork(), id, side)); adder.add(); }); hasTerminalRef[0] = true; diff --git a/iidm-xml-import-export/src/main/java/eu/itesla_project/iidm/xml/XmlUtil.java b/iidm-xml-import-export/src/main/java/eu/itesla_project/iidm/xml/XmlUtil.java index 735e478f..4f184f6d 100644 --- a/iidm-xml-import-export/src/main/java/eu/itesla_project/iidm/xml/XmlUtil.java +++ b/iidm-xml-import-export/src/main/java/eu/itesla_project/iidm/xml/XmlUtil.java @@ -64,6 +64,11 @@ public static boolean readBoolAttribute(XMLStreamReader reader, String attribute return Boolean.valueOf(reader.getAttributeValue(null, attributeName)); } + public static boolean readOptionalBoolAttribute(XMLStreamReader reader, String attributeName, boolean defaultValue) { + String attributeValue = reader.getAttributeValue(null, attributeName); + return attributeValue != null ? Boolean.valueOf(attributeValue) : defaultValue; + } + public static Integer readOptionalIntegerAttribute(XMLStreamReader reader, String attributeName) { String attributeValue = reader.getAttributeValue(null, attributeName); return attributeValue != null ? Integer.valueOf(attributeValue) : null; diff --git a/iidm-xml-import-export/src/main/resources/xsd/iidm.xsd b/iidm-xml-import-export/src/main/resources/xsd/iidm.xsd index fd318b5b..d96cc8f7 100644 --- a/iidm-xml-import-export/src/main/resources/xsd/iidm.xsd +++ b/iidm-xml-import-export/src/main/resources/xsd/iidm.xsd @@ -404,15 +404,15 @@ - + - + @@ -424,6 +424,7 @@ + diff --git a/iidm-xml-import-export/src/test/resources/phaseShifterRoundTripRef.xml b/iidm-xml-import-export/src/test/resources/phaseShifterRoundTripRef.xml index d47dc59e..d32cb081 100644 --- a/iidm-xml-import-export/src/test/resources/phaseShifterRoundTripRef.xml +++ b/iidm-xml-import-export/src/test/resources/phaseShifterRoundTripRef.xml @@ -15,7 +15,7 @@ - + diff --git a/online-workflow/src/main/java/eu/itesla_project/online/db/debug/NetworkDataExtractor.java b/online-workflow/src/main/java/eu/itesla_project/online/db/debug/NetworkDataExtractor.java index b511410c..52027d23 100644 --- a/online-workflow/src/main/java/eu/itesla_project/online/db/debug/NetworkDataExtractor.java +++ b/online-workflow/src/main/java/eu/itesla_project/online/db/debug/NetworkDataExtractor.java @@ -197,7 +197,8 @@ private static float apparentPower(Terminal terminal) { private static boolean isRegulating(TwoWindingsTransformer tfo) { if ( tfo.getPhaseTapChanger() != null ) - return tfo.getPhaseTapChanger().getRegulationMode() != PhaseTapChanger.RegulationMode.OFF; + return tfo.getPhaseTapChanger().getRegulationMode() != PhaseTapChanger.RegulationMode.FIXED_TAP + && tfo.getPhaseTapChanger().isRegulating(); if ( tfo.getRatioTapChanger() != null ) return tfo.getRatioTapChanger().isRegulating(); return false; diff --git a/ucte-import/src/main/java/eu/itesla_project/iidm/import_/ucte/UcteImporter.java b/ucte-import/src/main/java/eu/itesla_project/iidm/import_/ucte/UcteImporter.java index d11fe336..6593085c 100644 --- a/ucte-import/src/main/java/eu/itesla_project/iidm/import_/ucte/UcteImporter.java +++ b/ucte-import/src/main/java/eu/itesla_project/iidm/import_/ucte/UcteImporter.java @@ -437,7 +437,7 @@ private static void createRatioTapChanger(UctePhaseRegulation uctePhaseRegulatio rtca.setLoadTapChangingCapabilities(true) .setRegulating(true) .setTargetV(uctePhaseRegulation.getU()) - .setTerminal(transformer.getTerminal1()); + .setRegulationTerminal(transformer.getTerminal1()); } for (int i = -uctePhaseRegulation.getN(); i <= uctePhaseRegulation.getN(); i++) { float rho = 1 / (1 + i * uctePhaseRegulation.getDu() / 100f); @@ -459,7 +459,7 @@ private static void createPhaseTapChanger(UcteAngleRegulation ucteAngleRegulatio PhaseTapChangerAdder ptca = transformer.newPhaseTapChanger() .setLowTapPosition(-ucteAngleRegulation.getN()) .setTapPosition(ucteAngleRegulation.getNp()) - .setRegulationMode(PhaseTapChanger.RegulationMode.OFF); + .setRegulationMode(PhaseTapChanger.RegulationMode.FIXED_TAP); for (int i = -ucteAngleRegulation.getN(); i <= ucteAngleRegulation.getN(); i++) { float rho; From 801b63b2eb2febb559720e6c991032dd12b999bd Mon Sep 17 00:00:00 2001 From: Mathieu Bague Date: Mon, 24 Oct 2016 18:41:24 +0200 Subject: [PATCH 3/4] Fix javadoc --- .../java/eu/itesla_project/iidm/network/PhaseTapChanger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChanger.java b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChanger.java index f4b82dba..939724e3 100644 --- a/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChanger.java +++ b/iidm-network-api/src/main/java/eu/itesla_project/iidm/network/PhaseTapChanger.java @@ -33,7 +33,7 @@ enum RegulationMode { PhaseTapChanger setRegulationMode(RegulationMode regulationMode); /** - * Get the the regulation value. + * Get the regulation value. * - a threshold in A in case of current limiter regulation * - a setpoint in MW in case of active power control regulation *

From a90221ceab245df60f95e343049ea965d3c27b2c Mon Sep 17 00:00:00 2001 From: Christian Biasuzzi Date: Mon, 24 Oct 2016 20:11:14 +0200 Subject: [PATCH 4/4] adds entsoe-case-repository to the distribution --- distribution/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/distribution/pom.xml b/distribution/pom.xml index 9225e541..e88c91aa 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -54,6 +54,13 @@ ${project.version} + + + eu.itesla_project + entsoe-case-repository + ${project.version} + + eu.itesla_project.iidm-ddb