DynaFlowConfigSerializer.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.dynaflow.json;

import com.fasterxml.jackson.core.JsonGenerator;
import com.powsybl.commons.json.JsonUtil;
import com.powsybl.dynaflow.DynaFlowConstants;
import com.powsybl.dynaflow.DynaFlowParameters;
import com.powsybl.dynaflow.DynaFlowSecurityAnalysisParameters;
import com.powsybl.loadflow.LoadFlowParameters;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;

/**
 * Serializes parameters from {@link DynaFlowParameters} used by Dynawo.
 * Some parameters are directly used by powsybl-dynawo and thus not serialized.
 * @author Guillaume Pernin {@literal <guillaume.pernin at rte-france.com>}
 */
public final class DynaFlowConfigSerializer {

    private DynaFlowConfigSerializer() {
    }

    public static void serialize(LoadFlowParameters lfParameters, DynaFlowParameters dynaFlowParameters,
                                 DynaFlowSecurityAnalysisParameters saParameters, Path workingDir, Path file) throws IOException {
        try (BufferedWriter writer = Files.newBufferedWriter(file, StandardCharsets.UTF_8)) {
            JsonUtil.writeJson(writer, jsonGenerator -> serialize(lfParameters, dynaFlowParameters, saParameters, workingDir, jsonGenerator));
        }
    }

    public static void serialize(LoadFlowParameters lfParameters, DynaFlowParameters dynaFlowParameters, Path workingDir, Path file) throws IOException {
        try (BufferedWriter writer = Files.newBufferedWriter(file, StandardCharsets.UTF_8)) {
            JsonUtil.writeJson(writer, jsonGenerator -> serialize(lfParameters, dynaFlowParameters, null, workingDir, jsonGenerator));
        }
    }

    public static void serialize(LoadFlowParameters lfParameters, DynaFlowParameters dynaFlowParameters, Path workingDir, Writer writer) {
        JsonUtil.writeJson(writer, jsonGenerator -> serialize(lfParameters, dynaFlowParameters, null, workingDir, jsonGenerator));
    }

    private static void serialize(LoadFlowParameters lfParameters, DynaFlowParameters dynaFlowParameters,
                                  DynaFlowSecurityAnalysisParameters saParameters, Path workingDir, JsonGenerator jsonGenerator) {
        try {
            jsonGenerator.writeStartObject();
            jsonGenerator.writeObjectFieldStart("dfl-config");
            serialize(lfParameters, jsonGenerator);
            serialize(dynaFlowParameters, jsonGenerator);
            if (saParameters != null) {
                serialize(saParameters, jsonGenerator);
            }
            jsonGenerator.writeStringField("OutputDir", workingDir.toString());
            jsonGenerator.writeEndObject();
            jsonGenerator.writeEndObject();
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
    }

    private static void serialize(DynaFlowParameters dynaFlowParameters, JsonGenerator jsonGenerator) throws IOException {
        writeNonNullField(jsonGenerator, "SVCRegulationOn", dynaFlowParameters.getSvcRegulationOn());
        writeNonNullField(jsonGenerator, "ShuntRegulationOn", dynaFlowParameters.getShuntRegulationOn());
        writeNonNullField(jsonGenerator, "AutomaticSlackBusOn", dynaFlowParameters.getAutomaticSlackBusOn());
        writeNonNullField(jsonGenerator, "DsoVoltageLevel", dynaFlowParameters.getDsoVoltageLevel());

        if (dynaFlowParameters.getActivePowerCompensation() != null) {
            jsonGenerator.writeStringField("ActivePowerCompensation", dynaFlowParameters.getActivePowerCompensation().getDynaflowName());
        }
        writeNonNullField(jsonGenerator, "SettingPath", dynaFlowParameters.getSettingPath());
        writeNonNullField(jsonGenerator, "AssemblingPath", dynaFlowParameters.getAssemblingPath());
        writeNonNullField(jsonGenerator, "StartTime", dynaFlowParameters.getStartTime());
        writeNonNullField(jsonGenerator, "StopTime", dynaFlowParameters.getStopTime());
        writeNonNullField(jsonGenerator, "Precision", dynaFlowParameters.getPrecision());

        if (dynaFlowParameters.getChosenOutputs() != null) {
            jsonGenerator.writeFieldName("ChosenOutputs");
            jsonGenerator.writeStartArray();
            for (DynaFlowConstants.OutputTypes outputType : dynaFlowParameters.getChosenOutputs()) {
                jsonGenerator.writeString(outputType.name());
            }
            jsonGenerator.writeEndArray();
        }

        writeNonNullField(jsonGenerator, "TimeStep", dynaFlowParameters.getTimeStep());
        if (dynaFlowParameters.getStartingPointMode() != null) {
            jsonGenerator.writeStringField("StartingPointMode", dynaFlowParameters.getStartingPointMode().getName());
        }
    }

    private static void serialize(LoadFlowParameters lfParameters, JsonGenerator jsonGenerator) throws IOException {
        jsonGenerator.writeBooleanField("InfiniteReactiveLimits", !lfParameters.isUseReactiveLimits());
    }

    private static void serialize(DynaFlowSecurityAnalysisParameters saParameters, JsonGenerator jsonGenerator) throws IOException {
        jsonGenerator.writeObjectFieldStart("sa");
        jsonGenerator.writeNumberField("TimeOfEvent", saParameters.getContingenciesStartTime());
        jsonGenerator.writeEndObject();
    }

    private static void writeNonNullField(JsonGenerator jsonGenerator, String fieldName, Boolean value) throws IOException {
        if (value != null) {
            jsonGenerator.writeBooleanField(fieldName, value);
        }
    }

    private static void writeNonNullField(JsonGenerator jsonGenerator, String fieldName, Double value) throws IOException {
        if (value != null && !Double.isNaN(value)) {
            jsonGenerator.writeNumberField(fieldName, value);
        }
    }

    private static void writeNonNullField(JsonGenerator jsonGenerator, String fieldName, String value) throws IOException {
        if (value != null) {
            jsonGenerator.writeStringField(fieldName, value);
        }
    }
}