All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.farao_community.farao.gridcapa_swe_commons.shift.ZonalScalableProvider Maven / Gradle / Ivy

/*
 * Copyright (c) 2023, 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 com.farao_community.farao.gridcapa_swe_commons.shift;

import com.farao_community.farao.gridcapa_swe_commons.exception.SweInvalidDataException;
import com.powsybl.glsk.api.io.GlskDocumentImporters;
import com.powsybl.glsk.commons.ZonalData;
import com.powsybl.glsk.commons.ZonalDataImpl;
import com.powsybl.iidm.modification.scalable.Scalable;
import com.powsybl.iidm.network.Country;
import com.powsybl.iidm.network.Generator;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.Substation;
import com.powsybl.openrao.commons.EICode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

public class ZonalScalableProvider {

    private static final Logger LOGGER = LoggerFactory.getLogger(ZonalScalableProvider.class);
    private static final Object LOCK_GLSK = new Object();

    public ZonalData get(String glskUrl, Network network, OffsetDateTime timestamp) {
        ZonalData zonalData = importGlsk(glskUrl, network, timestamp.toInstant());
        String eicFR = new EICode(Country.FR).getAreaCode();
        if (zonalData.getData(eicFR) == null) {
            LOGGER.warn("Glsk file does not contains FR scalable for timestamp {}, a Country generators scalable is added", timestamp);
            Scalable scalableFR = getCountryGeneratorsScalableForFR(network);
            zonalData.addAll(new ZonalDataImpl<>(Collections.singletonMap(eicFR, scalableFR)));
        }
        return zonalData;
    }

    public ZonalData importGlsk(String glskUrl, Network network, Instant instant) {
        try (InputStream glskResultStream = new URL(glskUrl).openStream()) {
            synchronized (LOCK_GLSK) {
                LOGGER.info("Importing Glsk file : {}", glskUrl);
                return GlskDocumentImporters.importGlsk(glskResultStream).getZonalScalable(network, instant);
            }
        } catch (IOException e) {
            throw new SweInvalidDataException("Cannot import glsk from url", e);
        }
    }

    private Scalable getCountryGeneratorsScalableForFR(Network network) {
        List scalables = new ArrayList<>();
        List percentages = new ArrayList<>();
        List generators;
        generators = network.getGeneratorStream()
                .filter(generator -> Country.FR.equals(generator.getTerminal().getVoltageLevel().getSubstation().map(Substation::getNullableCountry).orElse(null)))
                .filter(NetworkUtil::isCorrect)
                .collect(Collectors.toList());
        //calculate sum P of country's generators
        double totalCountryP = generators.stream().mapToDouble(NetworkUtil::pseudoTargetP).sum();
        //calculate factor of each generator
        generators.forEach(generator -> {
            double generatorPercentage =  100 * NetworkUtil.pseudoTargetP(generator) / totalCountryP;
            percentages.add(generatorPercentage);
            scalables.add(Scalable.onGenerator(generator.getId()));
        });

        return Scalable.proportional(percentages, scalables);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy