AbstractDcTerminalTest.java

/**
 * Copyright (c) 2025, Coreso SA (https://www.coreso.eu/) and TSCNET Services GmbH (https://www.tscnet.eu/)
 * 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/.
 * SPDX-License-Identifier: MPL-2.0
 */
package com.powsybl.iidm.network.tck;

import com.powsybl.commons.PowsyblException;
import com.powsybl.iidm.network.*;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;

/**
 * @author Damien Jeandemange {@literal <damien.jeandemange at artelys.com>}
 */
public abstract class AbstractDcTerminalTest {

    @Test
    public void testDcLineDcTerminal() {
        Network network = Network.create("test", "test");
        DcNode dcNode1 = network.newDcNode().setId("dcNode1").setNominalV(500.).add();
        DcNode dcNode2 = network.newDcNode().setId("dcNode2").setNominalV(500.).add();
        DcLine dcLine = network.newDcLine()
                .setId("dcLine")
                .setDcNode1(dcNode1.getId())
                .setConnected1(true)
                .setDcNode2(dcNode2.getId())
                .setConnected2(true)
                .setR(1.1)
                .add();
        DcTerminal dcLineTerminal = dcLine.getDcTerminal1();
        assertTrue(Double.isNaN(dcLineTerminal.getP()));
        assertTrue(Double.isNaN(dcLineTerminal.getI()));
        checkDcTerminalInMultiVariant(network, dcLineTerminal);
    }

    @Test
    public void testDcConverterDcTerminal() {
        Network network = Network.create("test", "test");
        Substation sa = network.newSubstation().setId("S").add();
        VoltageLevel vl = sa.newVoltageLevel().setId("VL").setTopologyKind(TopologyKind.BUS_BREAKER).setNominalV(175).add();
        Bus b1 = vl.getBusBreakerView().newBus().setId("B1").add();
        DcNode dcNode1 = network.newDcNode().setId("dcNode1").setNominalV(500.).add();
        DcNode dcNode2 = network.newDcNode().setId("dcNode2").setNominalV(500.).add();
        LineCommutatedConverter converter = vl.newLineCommutatedConverter()
                .setId("dcConverter")
                .setBus1(b1.getId())
                .setDcNode1(dcNode1.getId())
                .setDcNode2(dcNode2.getId())
                .setControlMode(AcDcConverter.ControlMode.P_PCC)
                .setTargetP(100.)
                .setTargetVdc(500.)
                .add();
        DcTerminal dcConverterTerminal = converter.getDcTerminal1();
        assertTrue(Double.isNaN(dcConverterTerminal.getP()));
        assertTrue(Double.isNaN(dcConverterTerminal.getI()));
        checkDcTerminalInMultiVariant(network, dcConverterTerminal);
    }

    private static void checkDcTerminalInMultiVariant(Network network, DcTerminal dcTerminal) {
        dcTerminal
                .setConnected(true)
                .setP(10.)
                .setI(5.);

        VariantManager variantManager = network.getVariantManager();

        List<String> variantsToAdd = List.of("s1", "s2", "s3", "s4");
        variantManager.cloneVariant(VariantManagerConstants.INITIAL_VARIANT_ID, variantsToAdd);

        variantManager.setWorkingVariant("s4");
        // check values cloned by extend
        assertTrue(dcTerminal.isConnected());
        assertEquals(10.0, dcTerminal.getP(), 1e-6);
        assertEquals(5.0, dcTerminal.getI(), 1e-6);

        // change values in s4
        dcTerminal
                .setConnected(false)
                .setP(-20.)
                .setI(-10.);

        // remove s2
        variantManager.removeVariant("s2");

        variantManager.cloneVariant("s4", "s2b");
        variantManager.setWorkingVariant("s2b");
        // check values cloned by allocate
        assertFalse(dcTerminal.isConnected());
        assertEquals(-20.0, dcTerminal.getP(), 1e-6);
        assertEquals(-10.0, dcTerminal.getI(), 1e-6);

        // recheck initial variant value
        variantManager.setWorkingVariant(VariantManagerConstants.INITIAL_VARIANT_ID);
        assertTrue(dcTerminal.isConnected());
        assertEquals(10.0, dcTerminal.getP(), 1e-6);
        assertEquals(5.0, dcTerminal.getI(), 1e-6);

        // remove working variant s4
        variantManager.setWorkingVariant("s4");
        variantManager.removeVariant("s4");
        assertThrows(PowsyblException.class, dcTerminal::isConnected, "Variant index not set");
        assertThrows(PowsyblException.class, dcTerminal::getP, "Variant index not set");
        assertThrows(PowsyblException.class, dcTerminal::getI, "Variant index not set");

        // check we delete a single variant's values
        variantManager.setWorkingVariant("s3");
        assertTrue(dcTerminal.isConnected());
        assertEquals(10.0, dcTerminal.getP(), 1e-6);
        assertEquals(5.0, dcTerminal.getI(), 1e-6);
    }
}