ExtendedAmplExporterV2.java
/**
* Copyright (c) 2024, 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.ampl.converter.version;
import com.powsybl.ampl.converter.AmplExportConfig;
import com.powsybl.ampl.converter.AmplSubset;
import com.powsybl.commons.io.table.Column;
import com.powsybl.commons.io.table.TableFormatterHelper;
import com.powsybl.commons.util.StringToIntMapper;
import com.powsybl.iidm.network.*;
import com.powsybl.iidm.network.extensions.HvdcAngleDroopActivePowerControl;
import com.powsybl.iidm.network.util.HvdcUtils;
import java.util.ArrayList;
import java.util.List;
import static com.powsybl.ampl.converter.AmplConstants.*;
/**
* @author Pierre ARVY {@literal <pierre.arvy at artelys.com>}
*/
public class ExtendedAmplExporterV2 extends ExtendedAmplExporter {
private static final int BATTERY_Q0_COLUMN_INDEX = 6;
private static final int GENERATOR_IS_CONDENSER_COLUMN_INDEX = 16;
private static final int LCC_TARGET_Q_COLUMN_INDEX = 5;
private static final int HVDC_AC_EMULATION_COLUMN_INDEX = 8;
private static final int HVDC_P_OFFSET_COLUMN_INDEX = 10;
private static final int HVDC_K_COLUMN_INDEX = 11;
public ExtendedAmplExporterV2(AmplExportConfig config,
Network network,
StringToIntMapper<AmplSubset> mapper,
int variantIndex, int faultNum, int actionNum) {
super(config, network, mapper, variantIndex, faultNum, actionNum);
}
@Override
public List<Column> getBatteriesColumns() {
List<Column> batteriesColumns = new ArrayList<>(super.getBatteriesColumns());
// fix unit of q0 column
batteriesColumns.set(BATTERY_Q0_COLUMN_INDEX, new Column(Q0));
return batteriesColumns;
}
@Override
public List<Column> getGeneratorsColumns() {
List<Column> generatorsColumns = new ArrayList<>(super.getGeneratorsColumns());
// add column to indicate if generator is a condenser
generatorsColumns.add(GENERATOR_IS_CONDENSER_COLUMN_INDEX, new Column("condenser"));
return generatorsColumns;
}
@Override
public List<Column> getLccConverterStationsColumns() {
List<Column> lccColumns = new ArrayList<>(super.getLccConverterStationsColumns());
// add columns for load target Q of converter station
lccColumns.add(LCC_TARGET_Q_COLUMN_INDEX, new Column(Q0));
return lccColumns;
}
@Override
public List<Column> getHvdcLinesColumns() {
List<Column> hvdcColumns = new ArrayList<>(super.getHvdcLinesColumns());
// add columns for AC emulation
hvdcColumns.add(HVDC_AC_EMULATION_COLUMN_INDEX, new Column("ac emul."));
hvdcColumns.add(HVDC_P_OFFSET_COLUMN_INDEX, new Column("P offset (MW)"));
hvdcColumns.add(HVDC_K_COLUMN_INDEX, new Column("k (MW/rad)"));
return hvdcColumns;
}
@Override
public void addAdditionalCellsGenerator(TableFormatterHelper formatterHelper, Generator gen) {
super.addAdditionalCellsGenerator(formatterHelper, gen);
formatterHelper.addCell(gen.isCondenser(), GENERATOR_IS_CONDENSER_COLUMN_INDEX);
}
@Override
public void addAdditionalCellsLccConverterStation(TableFormatterHelper formatterHelper,
LccConverterStation lccStation) {
double loadTargetQ = HvdcUtils.getLccConverterStationLoadTargetQ(lccStation);
formatterHelper.addCell(loadTargetQ, LCC_TARGET_Q_COLUMN_INDEX);
}
@Override
public void addAdditionalCellsHvdcLine(TableFormatterHelper formatterHelper,
HvdcLine hvdcLine) {
boolean isEnabled = false;
double p0 = Double.NaN;
double k = Double.NaN;
HvdcAngleDroopActivePowerControl droopControl = hvdcLine.getExtension(HvdcAngleDroopActivePowerControl.class);
if (droopControl != null) {
isEnabled = droopControl.isEnabled();
p0 = droopControl.getP0();
k = droopControl.getDroop() * 180 / Math.PI; // export MW/rad as voltage angles are exported in rad
}
formatterHelper.addCell(isEnabled, HVDC_AC_EMULATION_COLUMN_INDEX);
formatterHelper.addCell(p0, HVDC_P_OFFSET_COLUMN_INDEX);
formatterHelper.addCell(k, HVDC_K_COLUMN_INDEX);
}
}