IllConditionedCaseTest.java

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

import com.powsybl.iidm.network.Bus;
import com.powsybl.iidm.network.Network;
import com.powsybl.loadflow.LoadFlow;
import com.powsybl.loadflow.LoadFlowParameters;
import com.powsybl.loadflow.LoadFlowResult;
import com.powsybl.math.matrix.DenseMatrixFactory;
import com.powsybl.openloadflow.OpenLoadFlowParameters;
import com.powsybl.openloadflow.OpenLoadFlowProvider;
import com.powsybl.openloadflow.ac.solver.StateVectorScalingMode;
import com.powsybl.openloadflow.network.SlackBusSelectionMode;
import com.powsybl.openloadflow.network.TwoBusNetworkFactory;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static com.powsybl.openloadflow.util.LoadFlowAssert.assertVoltageEquals;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertEquals;

/**
 * @author Damien Jeandemange {@literal <damien.jeandemange at artelys.com>}
 * @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
 */
class IllConditionedCaseTest {

    private Network network;
    private Bus bus2;

    private LoadFlow.Runner loadFlowRunner;
    private LoadFlowParameters parameters;
    private OpenLoadFlowParameters parametersExt;

    @BeforeEach
    void setUp() {
        // TODO a better ill-conditioned case for state vector scaling tests
        network = TwoBusNetworkFactory.create();
        bus2 = network.getBusBreakerView().getBus("b2");

        loadFlowRunner = new LoadFlow.Runner(new OpenLoadFlowProvider(new DenseMatrixFactory()));
        parameters = new LoadFlowParameters()
                .setUseReactiveLimits(false)
                .setDistributedSlack(false);
        parametersExt = OpenLoadFlowParameters.create(parameters)
                .setSlackBusSelectionMode(SlackBusSelectionMode.FIRST);
    }

    @Test
    void withHighLoadTest() {
        network.getLoad("l1").setP0(3.902); // 3.9 does not need scaling

        LoadFlowResult result = loadFlowRunner.run(network, parameters);
        assertFalse(result.isFullyConverged());
        assertEquals(LoadFlowResult.ComponentResult.Status.MAX_ITERATION_REACHED, result.getComponentResults().get(0).getStatus());

        parametersExt.setStateVectorScalingMode(StateVectorScalingMode.MAX_VOLTAGE_CHANGE);
        result = loadFlowRunner.run(network, parameters);
        assertTrue(result.isFullyConverged());
        assertEquals(8, result.getComponentResults().get(0).getIterationCount());
        assertVoltageEquals(0.6364204826103471, bus2);

        parametersExt.setStateVectorScalingMode(StateVectorScalingMode.LINE_SEARCH);
        result = loadFlowRunner.run(network, parameters);
        assertTrue(result.isFullyConverged());
        assertEquals(7, result.getComponentResults().get(0).getIterationCount());
        assertVoltageEquals(0.6364204826103471, bus2);
    }

    @Test
    void convergenceControlParametersTest() {
        network.getLoad("l1").setP0(3.902); // 3.9 does not need scaling

        LoadFlowResult result = loadFlowRunner.run(network, parameters);
        assertFalse(result.isFullyConverged());
        assertEquals(LoadFlowResult.ComponentResult.Status.MAX_ITERATION_REACHED, result.getComponentResults().get(0).getStatus());

        parametersExt.setStateVectorScalingMode(StateVectorScalingMode.MAX_VOLTAGE_CHANGE);
        result = loadFlowRunner.run(network, parameters);
        assertTrue(result.isFullyConverged());
        assertEquals(8, result.getComponentResults().get(0).getIterationCount());
        assertVoltageEquals(0.6364204826103471, bus2);

        parametersExt.setMaxVoltageChangeStateVectorScalingMaxDv(0.05);
        result = loadFlowRunner.run(network, parameters);
        assertTrue(result.isFullyConverged());
        assertEquals(10, result.getComponentResults().get(0).getIterationCount());
        assertVoltageEquals(0.6364204826103471, bus2);

        parametersExt.setMaxVoltageChangeStateVectorScalingMaxDphi(Math.toRadians(6));
        result = loadFlowRunner.run(network, parameters);
        assertTrue(result.isFullyConverged());
        assertEquals(14, result.getComponentResults().get(0).getIterationCount());
        assertVoltageEquals(0.6364204826103471, bus2);

        parametersExt.setStateVectorScalingMode(StateVectorScalingMode.LINE_SEARCH);

        result = loadFlowRunner.run(network, parameters);
        assertTrue(result.isFullyConverged());
        assertEquals(7, result.getComponentResults().get(0).getIterationCount());
        assertVoltageEquals(0.6364204826103471, bus2);

        parametersExt.setLineSearchStateVectorScalingMaxIteration(5);
        result = loadFlowRunner.run(network, parameters);
        assertFalse(result.isFullyConverged());
        assertEquals(16, result.getComponentResults().get(0).getIterationCount());
        assertVoltageEquals(0.6364204826103471, bus2);

        parametersExt.setLineSearchStateVectorScalingStepFold(1.7);
        result = loadFlowRunner.run(network, parameters);
        assertTrue(result.isFullyConverged());
        assertEquals(5, result.getComponentResults().get(0).getIterationCount());
        assertVoltageEquals(0.6364204826103471, bus2);
    }
}