com.powsybl.psse.model.pf.io.TransformerData Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of powsybl-psse-model Show documentation
Show all versions of powsybl-psse-model Show documentation
PSS/E raw format data model
/**
* 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/.
* SPDX-License-Identifier: MPL-2.0
*/
package com.powsybl.psse.model.pf.io;
import com.powsybl.psse.model.io.*;
import com.powsybl.psse.model.pf.PsseRates;
import com.powsybl.psse.model.pf.PsseTransformer;
import com.powsybl.psse.model.pf.PsseTransformer.TransformerImpedances;
import com.powsybl.psse.model.pf.PsseTransformerWinding;
import com.univocity.parsers.annotations.Nested;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import static com.powsybl.psse.model.io.FileFormat.VALID_DELIMITERS;
import static com.powsybl.psse.model.PsseVersion.Major.V32;
import static com.powsybl.psse.model.PsseVersion.Major.V33;
import static com.powsybl.psse.model.PsseVersion.Major.V35;
import static com.powsybl.psse.model.pf.io.PowerFlowRecordGroup.*;
import static com.powsybl.psse.model.pf.io.PsseIoConstants.*;
/**
* @author Luma Zamarreño {@literal }
* @author José Antonio Marqués {@literal }
*/
class TransformerData extends AbstractRecordGroup {
private static final String[] FIELD_NAMES_T2W_IMPEDANCES_RECORD = {"r12", "x12", "sbase12"};
private static final String[] FIELD_NAMES_T2W_WINDING_RECORD = {STR_WINDV, "nomv"};
private static final String[] FIELD_NAMES_WINDING_32_33 = {STR_WINDV, "nomv", "ang", "rata", "ratb", "ratc", "cod", "cont", "rma", "rmi", "vma", "vmi", "ntp", "tab", "cr", "cx", "cnxa"};
TransformerData() {
super(TRANSFORMER);
withFieldNames(V32, "i", "j", "k", STR_CKT, STR_CW, STR_CZ, STR_CM, STR_MAG1, STR_MAG2, "nmetr", STR_NAME, STR_STAT, STR_O1, STR_F1, STR_O2, STR_F2, STR_O3, STR_F3, STR_O4, STR_F4);
withFieldNames(V33, "i", "j", "k", STR_CKT, STR_CW, STR_CZ, STR_CM, STR_MAG1, STR_MAG2, "nmetr", STR_NAME, STR_STAT, STR_O1, STR_F1, STR_O2, STR_F2, STR_O3, STR_F3, STR_O4, STR_F4, STR_VECGRP);
withFieldNames(V35, "ibus", "jbus", "kbus", STR_CKT, STR_CW, STR_CZ, STR_CM, STR_MAG1, STR_MAG2, "nmet", STR_NAME, STR_STAT, STR_O1, STR_F1, STR_O2, STR_F2, STR_O3, STR_F3, STR_O4, STR_F4, STR_VECGRP, "zcod");
withQuotedFields(STR_CKT, STR_NAME, STR_VECGRP);
withIO(FileFormat.LEGACY_TEXT, new IOLegacyText(this));
}
@Override
protected Class psseTypeClass() {
return PsseTransformer.class;
}
private static class IOLegacyText extends RecordGroupIOLegacyText {
IOLegacyText(AbstractRecordGroup recordGroup) {
super(recordGroup);
}
@Override
public List read(LegacyTextReader reader, Context context) throws IOException {
List mainRecords = new ArrayList<>();
List impedanceRecords = new ArrayList<>();
List windingRecords = new ArrayList<>();
if (!reader.isQRecordFound()) {
String line = reader.readRecordLine();
while (!reader.endOfBlock(line)) {
mainRecords.add(line);
impedanceRecords.add(reader.readRecordLine());
windingRecords.add(reader.readRecordLine());
windingRecords.add(reader.readRecordLine());
if (is3Winding(line)) {
windingRecords.add(reader.readRecordLine());
}
line = reader.readRecordLine();
}
}
List transformerList = super.recordGroup.readFromStrings(mainRecords, context);
List impedanceList = new PsseTransformerImpedancesRecordData().readFromStrings(impedanceRecords, context);
List windingList = new PsseTransformerWindingRecordData().readFromStrings(windingRecords, context);
int indexImpedance = 0;
int indexWinding = 0;
for (PsseTransformer transformer : transformerList) {
transformer.setImpedances(impedanceList.get(indexImpedance));
indexImpedance = indexImpedance + 1;
transformer.setWinding1(windingList.get(indexWinding).winding, windingList.get(indexWinding).windingRates);
indexWinding = indexWinding + 1;
transformer.setWinding2(windingList.get(indexWinding).winding, windingList.get(indexWinding).windingRates);
indexWinding = indexWinding + 1;
if (transformer.getK() != 0) {
transformer.setWinding3(windingList.get(indexWinding).winding, windingList.get(indexWinding).windingRates);
indexWinding = indexWinding + 1;
}
}
return transformerList;
}
@Override
public void write(List transformerList, Context context, OutputStream outputStream) {
List impedanceList = new ArrayList<>();
List impedanceT2wList = new ArrayList<>();
List windingList = new ArrayList<>();
List windingT2wList = new ArrayList<>();
transformerList.forEach(transformer -> {
if (transformer.getK() == 0) {
impedanceT2wList.add(transformer.getImpedances());
windingList.add(getWindingRecord(transformer.getWinding1(), transformer.getWinding1Rates()));
windingT2wList.add(getWindingRecord(transformer.getWinding2(), transformer.getWinding2Rates()));
} else {
impedanceList.add(transformer.getImpedances());
windingList.add(getWindingRecord(transformer.getWinding1(), transformer.getWinding1Rates()));
windingList.add(getWindingRecord(transformer.getWinding2(), transformer.getWinding2Rates()));
windingList.add(getWindingRecord(transformer.getWinding3(), transformer.getWinding3Rates()));
}
});
String[] mainHeaders = context.getFieldNames(TRANSFORMER);
String[] quotedFields = super.recordGroup.quotedFields();
List firstRecordList = super.recordGroup.buildRecords(transformerList, mainHeaders, quotedFields, context);
PsseTransformerImpedancesRecordData impedanceRecordData = new PsseTransformerImpedancesRecordData();
String[] impedanceHeaders = context.getFieldNames(INTERNAL_TRANSFORMER_IMPEDANCES);
List impedanceRecordList = impedanceRecordData.buildRecords(impedanceList, impedanceHeaders, quotedFields, context);
List impedanceRecordT2wList = impedanceRecordData.buildRecords(impedanceT2wList, FIELD_NAMES_T2W_IMPEDANCES_RECORD, quotedFields, context);
PsseTransformerWindingRecordData windingRecordData = new PsseTransformerWindingRecordData();
String[] windingHeaders = context.getFieldNames(INTERNAL_TRANSFORMER_WINDING);
List windingRecordList = windingRecordData.buildRecords(windingList, windingHeaders, quotedFields, context);
List windingRecordT2wList = windingRecordData.buildRecords(windingT2wList, FIELD_NAMES_T2W_WINDING_RECORD, quotedFields, context);
writeBegin(outputStream);
int indexFirst = 0;
int indexImpedance = 0;
int indexImpedanceT2w = 0;
int indexWinding = 0;
int indexWindingT2w = 0;
for (PsseTransformer transformer : transformerList) {
String first = firstRecordList.get(indexFirst);
indexFirst = indexFirst + 1;
if (transformer.getK() == 0) {
String impedance = impedanceRecordT2wList.get(indexImpedanceT2w);
indexImpedanceT2w = indexImpedanceT2w + 1;
String winding1 = windingRecordList.get(indexWinding);
indexWinding = indexWinding + 1;
String winding2 = windingRecordT2wList.get(indexWindingT2w);
indexWindingT2w = indexWindingT2w + 1;
write(Arrays.asList(first, impedance, winding1, winding2), outputStream);
} else {
String impedance = impedanceRecordList.get(indexImpedance);
indexImpedance = indexImpedance + 1;
String winding1 = windingRecordList.get(indexWinding);
indexWinding = indexWinding + 1;
String winding2 = windingRecordList.get(indexWinding);
indexWinding = indexWinding + 1;
String winding3 = windingRecordList.get(indexWinding);
indexWinding = indexWinding + 1;
write(Arrays.asList(first, impedance, winding1, winding2, winding3), outputStream);
}
}
writeEnd(outputStream);
}
private static class PsseTransformerImpedancesRecordData extends AbstractRecordGroup {
PsseTransformerImpedancesRecordData() {
super(INTERNAL_TRANSFORMER_IMPEDANCES, "r12", "x12", "sbase12", "r23", "x23", "sbase23", "r31", "x31", "sbase31", "vmstar", "anstar");
}
@Override
public Class psseTypeClass() {
return TransformerImpedances.class;
}
}
private static class PsseTransformerWindingRecordData extends AbstractRecordGroup {
PsseTransformerWindingRecordData() {
super(INTERNAL_TRANSFORMER_WINDING);
withFieldNames(V32, FIELD_NAMES_WINDING_32_33);
withFieldNames(V33, FIELD_NAMES_WINDING_32_33);
withFieldNames(V35, STR_WINDV, "nomv", "ang", "wdgrate1", "wdgrate2", "wdgrate3", "wdgrate4", "wdgrate5", "wdgrate6", "wdgrate7", "wdgrate8", "wdgrate9", "wdgrate10", "wdgrate11", "wdgrate12", "cod", "cont", "node", "rma", "rmi", "vma", "vmi", "ntp", "tab", "cr", "cx", "cnxa");
}
@Override
public Class psseTypeClass() {
return TransformerWindingRecord.class;
}
}
private TransformerWindingRecord getWindingRecord(PsseTransformerWinding winding, PsseRates windingRates) {
TransformerWindingRecord windingRecord = new TransformerWindingRecord();
windingRecord.winding = winding;
windingRecord.windingRates = windingRates;
return windingRecord;
}
private static boolean is3Winding(String recordStr) {
try (Scanner scanner = new Scanner(recordStr)) {
// Valid delimiters surrounded by any number of whitespace
scanner.useDelimiter("\\s*[" + VALID_DELIMITERS + "]\\s*");
int i = scanner.hasNextInt() ? scanner.nextInt() : 0;
int j = scanner.hasNextInt() ? scanner.nextInt() : 0;
int k = scanner.hasNextInt() ? scanner.nextInt() : 0;
return i != 0 && j != 0 && k != 0;
}
}
}
public static class TransformerWindingRecord {
@Nested()
private PsseTransformerWinding winding;
@Nested()
private PsseRates windingRates;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy