CurrentLimitViolationInterceptor.java

/**
 * Copyright (c) 2018, 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.security.interceptors;

import com.powsybl.iidm.network.Branch;
import com.powsybl.security.LimitViolation;
import com.powsybl.security.LimitViolationType;
import com.powsybl.security.results.PostContingencyResult;
import com.powsybl.security.extensions.ActivePowerExtension;
import com.powsybl.security.extensions.CurrentExtension;
import com.powsybl.security.results.PreContingencyResult;

/**
 * @author Mathieu Bague {@literal <mathieu.bague at rte-france.com>}
 */
public class CurrentLimitViolationInterceptor extends DefaultSecurityAnalysisInterceptor {

    @Override
    public void onPreContingencyResult(PreContingencyResult preContingencyResult, SecurityAnalysisResultContext context) {
        for (LimitViolation limitViolation : preContingencyResult.getLimitViolationsResult().getLimitViolations()) {
            if (limitViolation.getLimitType() == LimitViolationType.CURRENT) {
                Branch branch = context.getNetwork().getBranch(limitViolation.getSubjectId());

                double preContingencyValue = branch.getTerminal(limitViolation.getSideAsTwoSides()).getP();
                limitViolation.addExtension(ActivePowerExtension.class, new ActivePowerExtension(preContingencyValue));
            }
        }
    }

    @Override
    public void onPostContingencyResult(PostContingencyResult postContingencyResult, SecurityAnalysisResultContext context) {
        String workingStateId = context.getNetwork().getVariantManager().getWorkingVariantId();

        if (context instanceof RunningContext runningContext) {
            for (LimitViolation limitViolation : postContingencyResult.getLimitViolationsResult().getLimitViolations()) {
                if (limitViolation.getLimitType() == LimitViolationType.CURRENT) {
                    Branch branch = context.getNetwork().getBranch(limitViolation.getSubjectId());

                    context.getNetwork().getVariantManager().setWorkingVariant(runningContext.getInitialStateId());
                    limitViolation.addExtension(CurrentExtension.class, new CurrentExtension(branch.getTerminal(limitViolation.getSideAsTwoSides()).getI()));
                    double preContingencyValue = branch.getTerminal(limitViolation.getSideAsTwoSides()).getP();

                    context.getNetwork().getVariantManager().setWorkingVariant(workingStateId);
                    double postContingencyValue = branch.getTerminal(limitViolation.getSideAsTwoSides()).getP();

                    limitViolation.addExtension(ActivePowerExtension.class, new ActivePowerExtension(preContingencyValue, postContingencyValue));
                }
            }
        }
    }
}