DynawoSimulationContext.java

/**
 * Copyright (c) 2020, 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.powsybl.dynawo;

import com.powsybl.dynamicsimulation.DynamicSimulationParameters;
import com.powsybl.dynamicsimulation.OutputVariable;
import com.powsybl.dynawo.models.BlackBoxModel;
import com.powsybl.dynawo.models.events.ContextDependentEvent;
import com.powsybl.dynawo.parameters.ParametersSet;
import com.powsybl.dynawo.xml.DynawoData;
import com.powsybl.iidm.network.Network;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author Marcos de Miguel {@literal <demiguelm at aia.es>}
 * @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
 */
public class DynawoSimulationContext {

    protected final Network network;
    private final String workingVariantId;
    private final DynawoSimulationParameters dynawoSimulationParameters;
    private final Map<OutputVariable.OutputType, List<OutputVariable>> outputVariables;
    private final List<ParametersSet> dynamicModelsParameters;
    private final SimulationModels simulationModels;
    private final FinalStepModels finalStepModels;
    private final SimulationTime simulationTime;
    private final SimulationTime finalStepTime;

    public static class Builder extends AbstractContextBuilder<Builder> {

        public Builder(Network network, List<BlackBoxModel> dynamicModels) {
            super(network, dynamicModels);
        }

        public Builder dynamicSimulationParameters(DynamicSimulationParameters parameters) {
            this.simulationParameters = Objects.requireNonNull(parameters);
            return self();
        }

        public Builder eventModels(List<BlackBoxModel> eventModels) {
            this.eventModels = eventModels;
            return self();
        }

        public Builder outputVariables(List<OutputVariable> outputVariables) {
            this.outputVariables = Objects.requireNonNull(outputVariables).stream()
                    .collect(Collectors.groupingBy(OutputVariable::getOutputType));
            return self();
        }

        public Builder finalStepConfig(FinalStepConfig finalStepConfig) {
            this.finalStepConfig = Objects.requireNonNull(finalStepConfig);
            return self();
        }

        @Override
        protected void setupData() {
            super.setupData();
            eventModels = Objects.requireNonNull(eventModels).stream()
                    .filter(distinctByDynamicId(reportNode)
                            .and(supportedVersion(dynawoVersion, reportNode)))
                    .toList();
            // Late init on ContextDependentEvents
            eventModels.stream()
                    .filter(ContextDependentEvent.class::isInstance)
                    .map(ContextDependentEvent.class::cast)
                    .forEach(e -> e.setEquipmentHasDynamicModel(blackBoxModelSupplier.hasDynamicModel(e.getEquipment())));
        }

        @Override
        protected Builder self() {
            return this;
        }

        @Override
        public DynawoSimulationContext build() {
            setup();
            return new DynawoSimulationContext(this);
        }
    }

    protected DynawoSimulationContext(AbstractContextBuilder<?> builder) {
        this.network = builder.network;
        this.workingVariantId = builder.workingVariantId;
        this.dynawoSimulationParameters = builder.dynawoParameters;
        this.simulationTime = builder.simulationTime;
        this.finalStepTime = builder.finalStepTime;
        this.dynamicModelsParameters = builder.dynamicModelsParameters;
        this.outputVariables = builder.outputVariables;
        this.simulationModels = builder.simulationModels;
        this.finalStepModels = builder.finalStepModels;
    }

    public Network getNetwork() {
        return network;
    }

    public String getWorkingVariantId() {
        return workingVariantId;
    }

    public SimulationTime getSimulationTime() {
        return simulationTime;
    }

    public SimulationTime getFinalStepSimulationTime() {
        return finalStepTime;
    }

    public DynawoSimulationParameters getDynawoSimulationParameters() {
        return dynawoSimulationParameters;
    }

    public List<BlackBoxModel> getBlackBoxDynamicModels() {
        return simulationModels.getBlackBoxDynamicModels();
    }

    public List<BlackBoxModel> getBlackBoxEventModels() {
        return simulationModels.getBlackBoxEventModels();
    }

    public List<OutputVariable> getOutputVariables(OutputVariable.OutputType type) {
        return outputVariables.get(type);
    }

    public boolean withCurveVariables() {
        return outputVariables.containsKey(OutputVariable.OutputType.CURVE);
    }

    public boolean withFsvVariables() {
        return outputVariables.containsKey(OutputVariable.OutputType.FINAL_STATE);
    }

    public boolean withConstraints() {
        return false;
    }

    public List<ParametersSet> getDynamicModelsParameters() {
        return dynamicModelsParameters;
    }

    public String getSimulationParFile() {
        return getNetwork().getId() + ".par";
    }

    public DynawoData getSimulationDydData() {
        return simulationModels;
    }

    public Optional<DynawoData> getFinalStepDydData() {
        return Optional.ofNullable(finalStepModels);
    }
}