diff --git a/iidm-ddb/iidm-ddb-eurostag-import-export/pom.xml b/iidm-ddb/iidm-ddb-eurostag-import-export/pom.xml index 157e13fc..765fa0c4 100644 --- a/iidm-ddb/iidm-ddb-eurostag-import-export/pom.xml +++ b/iidm-ddb/iidm-ddb-eurostag-import-export/pom.xml @@ -42,18 +42,14 @@ com.google.auto.service auto-service + + eu.itesla_project + commons + commons-cli commons-cli - - net.sf.supercsv - super-csv - - - eu.itesla_project - commons - eu.itesla_project iidm-api @@ -84,6 +80,23 @@ jar + + net.sf.supercsv + super-csv + + + + + ch.qos.logback + logback-classic + ${logback.version} + test + + + com.google.jimfs + jimfs + test + eu.itesla_project iidm-impl @@ -96,14 +109,10 @@ ${ipstcore.version} test - - com.google.jimfs - jimfs - test - junit junit + test org.slf4j diff --git a/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DdbDtaImpExp.java b/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DdbDtaImpExp.java index b611eb21..720285e1 100644 --- a/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DdbDtaImpExp.java +++ b/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DdbDtaImpExp.java @@ -292,6 +292,9 @@ public void feedDDBWithEurostagData(Path inputFile, case "M2DS": dbId = populateDDB_M1M2(zone, dicoMap, ddbmanager, eurostagSim); break; + case "M21": + dbId = populateDDB_M21(zone, dicoMap, ddbmanager, eurostagSim); + break; case "R": dbId = populateDDB_R(zone, dicoMap, ddbmanager, eurostagSim, regsMapping); break; @@ -396,6 +399,100 @@ public String populateDDB_M1M2(EurostagRecord zone, Map amap, return cimId; } + public String populateDDB_M21(EurostagRecord zone, Map amap, + DDBManager ddbmanager, SimulatorInst eurostagSim) { + // here we assume that the simulator with the required version already + // exists + if (eurostagSim == null) { + throw new RuntimeException("Eurostag simulator could not be null"); + } + + if (!"M21".equals(zone.getTypeName())) { + throw new RuntimeException("not expected type M21: " + zone); + } + + log.debug("-Creating DDB component {} ", zone.getTypeName()); + String mName = (String) zone.getData().get("machine.name"); + String cimId = amap.get(mName); + if ((cimId == null) || ("".equals(cimId))) { + throw new RuntimeException(mName + ": cimId not found in mapping."); + } + + if (!equipmentsTypeMap.contains(cimId)){ + equipmentsTypeMap.put(cimId, zone.getTypeName()); + } + + Equipment eq1 = ddbmanager.findEquipment(cimId); + if ((eq1!=null) && (updateFlag==true)) { + Set connectedInternals=getConnectedInternals(cimId,ddbmanager); + + //remove this equipment graph + log.info("- removing existing equipment {}", cimId); + removeEquipment(cimId,ddbmanager); + eq1=null; + + for (String internalId: connectedInternals) { + log.info("- removing existing connected internal {}", internalId); + removeInternal(internalId,ddbmanager); + } + + } + + String mtc_ddbid = MTC_PREFIX_NAME + zone.getKeyName(); + ModelTemplateContainer mtc1 = ddbmanager + .findModelTemplateContainer(mtc_ddbid); + if (mtc1 == null) { + throw new RuntimeException(" template container " + mtc_ddbid + + " not defined! "); + } + + ParametersContainer pc1 = ddbmanager.findParametersContainer(mName); + if (pc1 == null) { + log.debug("-- creating Parameters Container " + mName +" plus parameters."); + pc1 = new ParametersContainer(mName); + Parameters pars = new Parameters(eurostagSim); + for (String varName : zone.getData().keySet()) { + String varFType = DtaParser.getVarFType(zone.typeName, varName); + Object varValue = zone.getData().get(varName); + if (log.isDebugEnabled()) { + log.trace("----" + varName + " = " + varValue + ", " + varFType); + } + if (varFType.startsWith("F")) { + if (varValue != null) { + pars.addParameter(new ParameterFloat(varName, + new Float((Double) varValue))); + } else { + pars.addParameter(new ParameterFloat(varName, null)); + } + } else if (varFType.startsWith("A")) { + pars.addParameter(new ParameterString(varName, + (String) varValue)); + } else { + log.error(varFType + " not handled"); + } + } + pc1.getParameters().add(pars); + pc1 = ddbmanager.save(pc1); + } else { + log.debug("-- Parameters Container container " + mName + + " already defined, id: " + pc1.getId()); + // ddbmanager.delete(pc1); + } + + if (eq1 == null) { + log.info("-- creating Equipment " + cimId + "; eurostag name is: " + + mName); + eq1 = new Equipment(cimId); + eq1.setModelContainer(mtc1); + eq1.setParametersContainer(pc1); + eq1 = ddbmanager.save(eq1); + } else { + log.warn("-- Equipment " + cimId + " already defined, id: " + + eq1.getId()); + } + + return cimId; + } private String populateDDB_R(EurostagRecord zone, Map amap, DDBManager ddbmanager, SimulatorInst eurostagSim, Map regsMapping) { @@ -491,6 +588,12 @@ private String populateDDB_R(EurostagRecord zone, Map amap, pars.setDefParamSetNum(paramSetNum); for (String varName : zone.getData().keySet()) { String varFType = DtaParser.getVarFType(zone.typeName, varName); + if (varFType == null) { + //this is not a variable belonging to R; it's a modificated parameter + //by default insert it into the db as an int (ref. eurostag doc. 09_Dynamyc_Data_File.pdf, Macroblocks section) + log.debug("---- varName "+ varName + " is not in the list associated component " +zone.typeName +"; handle it as an additional modification parameter, with a float type"); + varFType = "F8"; + } Object varValue = zone.getData().get(varName); if (log.isDebugEnabled()) { log.trace("----" + varName + " = " + varValue + ", " + varFType); @@ -797,6 +900,9 @@ public void dumpDtaFile(Path workingDir, String fileName, } } + //adding svc to the equipment list + network.getStaticVarCompensators().forEach(svc -> cimIds.add(svc.getId())); + // writing a .dta DtaParser.dumpHeader(new Date(), eurostagVersion, dtaOutStream); @@ -1071,6 +1177,8 @@ public void dumpData(Equipment inst, SimulatorInst simInst, DDBManager ddbmanage case "M2S": case "M2DS": zoneTypeName="M2"; break; + case "M21": zoneTypeName="M21"; + break; case "R": zoneTypeName="R"; break; diff --git a/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DtaParser.java b/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DtaParser.java index 022493de..129ce1fa 100644 --- a/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DtaParser.java +++ b/iidm-ddb/iidm-ddb-eurostag-import-export/src/main/java/eu/itesla_project/iidm/ddb/eurostag_imp_exp/DtaParser.java @@ -5,22 +5,6 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package eu.itesla_project.iidm.ddb.eurostag_imp_exp; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.PrintStream; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,13 +14,23 @@ import org.supercsv.io.ICsvMapReader; import org.supercsv.prefs.CsvPreference; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.PrintStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + /** * * @author Quinary */ public class DtaParser { - static Logger log = LoggerFactory.getLogger(DtaParser.class.getName()); + private static final Logger log = LoggerFactory.getLogger(DtaParser.class.getName()); @@ -45,6 +39,7 @@ public DtaParser(final String name) { static HashMap componentsVariablesNames = new HashMap(); static HashMap componentsInterfaceVariablesNames = new HashMap(); + static HashMap componentTypeMap = new HashMap(); static { componentsVariablesNames.put("HEADER", new String[] { @@ -80,10 +75,10 @@ public DtaParser(final String name) { }); componentsInterfaceVariablesNames.put("M1", new String[] { - "UR", "UI", "URI", "UII", "URH", "UIH", "ID", "IQ", "OMEGA", "TETA", "EFD", "CM", - "LAMBDAF", "LAMBDAD", "LAMBDAQ1", "LAMBDAQ2", "LAMBDAAD", "LAMBDAAQ", + "UR", "UI", "URI", "UII", "URH", "UIH", "ID", "IQ", "OMEGA", "TETA", "EFD", "CM", + "LAMBDAF", "LAMBDAD", "LAMBDAQ1", "LAMBDAQ2", "LAMBDAAD", "LAMBDAAQ", "TerminalVoltage", "FieldCurrent", - "ActivePowerPNALT", "ActivePowerPN", "ActivePowerSNREF", + "ActivePowerPNALT", "ActivePowerPN", "ActivePowerSNREF", "ReactivePowerPNALT", "ReactivePowerPN", "ReactivePowerSNREF", "Current", "pin_ActivePowerSN", "pin_ReactivePowerSN" }); @@ -98,10 +93,10 @@ public DtaParser(final String name) { }); componentsInterfaceVariablesNames.put("M2", new String[] { - "UR", "UI", "URI", "UII", "URH", "UIH", "ID", "IQ", "OMEGA", "TETA", "EFD", "CM", - "LAMBDAF", "LAMBDAD", "LAMBDAQ1", "LAMBDAQ2", "LAMBDAAD", "LAMBDAAQ", + "UR", "UI", "URI", "UII", "URH", "UIH", "ID", "IQ", "OMEGA", "TETA", "EFD", "CM", + "LAMBDAF", "LAMBDAD", "LAMBDAQ1", "LAMBDAQ2", "LAMBDAAD", "LAMBDAAQ", "TerminalVoltage", "FieldCurrent", - "ActivePowerPNALT", "ActivePowerPN", "ActivePowerSNREF", + "ActivePowerPNALT", "ActivePowerPN", "ActivePowerSNREF", "ReactivePowerPNALT", "ReactivePowerPN", "ReactivePowerSNREF", "Current", "pin_ActivePowerSN", "pin_ReactivePowerSN" }); @@ -122,48 +117,48 @@ public DtaParser(final String name) { componentsVariablesNames.put("A12", new String[] { "machine.name,VIMIN,TMIN,VIMAX,TMAX,TDEL" }); - + componentsVariablesNames.put("A14", new String[] { "sending.node,receiving.node,index,R,E1,E2,T1,TINT,setpoint,VC,time.margin,transfo.name,control.type,ZNREF,transfo.side" ,"tap.direction,TMAN,V1,V2,TV1,TDEL" }); - - componentsVariablesNames.put("A33_ACMC", new String[] { + + componentsVariablesNames.put("A33_ACMC", new String[]{ "keyword,ma.name,interface.name,block.number,c.type,S1,S2,S3,T1,TDEL" - ,"" - ,"ev.keyword,ev.type,keyword,ma.name,interface.name,block.number" - ,"equipment.name,seq.params" + ,"" + ,"ev.keyword,ev.type,keyword,ma.name,interface.name,block.number" + ,"equipment.name,seq.params" }); - + componentsVariablesNames.put("M21", new String[] { - "machine.type, type.fortescue, XMACOUP, fnum1, fnum2, falpha" + "machine.type, type.fortescue, XMACOUP, fnum1, fnum2, falpha" ,"machine.name,connection.node.name,type.power.assigned,PP,PQ,PN,RIFO,RIXFO,R0FO,R0XFO" }); componentsInterfaceVariablesNames.put("M21", new String[] { - "TerminalVoltage" + "TerminalVoltage", "KG", "SCL", "SLOPE", "VPCC", "SETMODE", "MODE", "BSVC", "ZERO", "BMAX", "BTCR", "MSCON", "MSRON" }); - + componentsVariablesNames.put("MA", new String[] { - "keyword" - ,"ma.name,equipment.type,equipment.name" + "keyword" + ,"ma.name,equipment.type,equipment.name" }); - + componentsInterfaceVariablesNames.put("MA", new String[] { "TerminalVoltage" }); - + componentsVariablesNames.put("RMA", new String[] { "keyword, machine.name" ,"macroblock.name,psetnum,coupling.par1,coupling.par2,coupling.par3,coupling.par4" ,"coupling.par5,coupling.par6,coupling.par7,coupling.par8,coupling.par9" }); - + componentsVariablesNames.put("TRF", new String[] { "keyword" ,"type.zone, zone.name, sending.node.name, receiving.node.name, parallel.index, device.name, time.down.change, max.taps.down, time.up.change, max.taps.up, dyn.zone.name, dyn, three.name, three" }); - + componentsVariablesNames.put("BAT", new String[] { "keyword" ,"type.zone, zone.name, bank.name, model.name, min.time1, min.time2, min.time3, min.time4" @@ -196,17 +191,15 @@ public DtaParser(final String name) { /*record 5*/,"(8X, A1, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8)" /*record 6*/,"(9X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8)"}); - //OK, verificato + //OK, verified componentsDescriptors.put("R", new String[] { "(A1, 1X, A8)" - //,"(A8, 1X, I3)" //first version - //,"(A8, 1X ,I3,13X,A2,1X,A19,1X,A1,1X,A24,1X,A24,1X,A24)" // second version ,"(A8, 1X ,I3,13X,A24,1X,A24,1X,A24,1X,A24)" ,"(A24,1X,A24,1X,A24,1X,A24,1X,A24)" }); componentsDescriptors.put("LOADP", new String[] { - "(A5, 4X, A8)" + "(A5, 3X, A8)" ,"(9X, A8, 1X, F8, 1X, F8)" ,"(9X, A8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8)" ,"(9X, A8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X )" @@ -233,29 +226,29 @@ public DtaParser(final String name) { componentsDescriptors.put("A12", new String[] { "(A8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8)" }); - + componentsDescriptors.put("A14", new String[] { "(A8, 1X, A8, 1X, A1, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, A1, 1X, F8, 1X, F5, 1X, A8, 1X, I1, 1X, A8, 1X, A1)" ,"(17X, A2, 10X, F8, 7X, F8, 1X, F8, 1X, F8, 1X, F8)" }); - + componentsDescriptors.put("A33_ACMC", new String[] { "(A3,1X,A8,1X,A8,1X,A8,1X,I1,1X,F8,1X,F8,1X,F8,1X,F8,1X,F8)" ,"()" ,"(A2,1X,A8,1X,A3,1X,A8,1X,A8,1X,A8)" ,"(18X,A8,1X,A52)" }); - + componentsDescriptors.put("M21", new String[] { - "(A3, A1, 1X, A1, 7X, F8, 1X, F8, 1X, A8)" + "(A3, A1, 1X, A1, 7X, F8, 1X, F8, 1X, A8)" ,"(A8, 1X, A8, 1X, A1, 17X, F8, 1X, F8, 19X, F8, F8, 1X, F8, 1X, F8, 1X, F8)" }); - + componentsDescriptors.put("MA", new String[] { - "(A2)" + "(A2)" ,"(A8, 1X, A2, 1X, A8)" }); - + componentsDescriptors.put("RMA", new String[] { "(A3, 1X, A8)" //,"(A8, 1X, I3)" //first version @@ -263,18 +256,28 @@ public DtaParser(final String name) { ,"(A8, 1X ,I3,13X,A24,1X,A24,1X,A24,1X,A24)" ,"(A24,1X,A24,1X,A24,1X,A24,1X,A24)" }); - + componentsDescriptors.put("TRF", new String[] { "(A3)" - ,"(A3, 6X, A2, 1X, A8, 1X, A8, 1X, A1, 1X, A8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, A8, 1X, A1, 1X, A8, A1)" + ,"(A3, 6X, A2, 1X, A8, 1X, A8, 1X, A1, 1X, A8, 1X, F8, 1X, F8, 1X, F8, 1X, F8, 1X, A8, 1X, A1, 1X, A8, A1)" }); - + componentsDescriptors.put("BAT", new String[] { "(A3)" - ,"(A3, 6X, A2, 10X, A8, 1X, A8, 1X, F8, 1X, F8, 1X, F8, 1X, F8)" + ,"(A3, 6X, A2, 10X, A8, 1X, A8, 1X, F8, 1X, F8, 1X, F8, 1X, F8)" }); + + for (String compId: componentsDescriptors.keySet()) { + componentTypeMap.put(compId, compId); + } + componentTypeMap.put("M1D", "M1"); + componentTypeMap.put("M2D", "M2"); + componentTypeMap.put("M21D", "M21"); + } + private static final String ADDITIONAL_PARAM_LINE_FORMAT = "(A8,1X,F8)"; + public static ArrayList getVarNames(String title, int recnum) { String headNames=componentsVariablesNames.get(title)[recnum]; @@ -357,7 +360,7 @@ public static void dumpHeader(Date date, String version, PrintStream out) throws out.println(ff.write(values, componentsDescriptors.get("HEADER")[0])); out.println(); } - + public static void dumpAutomatonHeader(String automatonType, boolean end, PrintStream out) throws ParseException, IOException { FortranFormat ff= new FortranFormat("()"); ArrayList values = new ArrayList(); @@ -375,132 +378,128 @@ public static void dumpZone(EurostagRecord zone, PrintStream out) throws ParseEx //System.out.println("Dumping zone: " + zone.typeName); FortranFormat ff= new FortranFormat("()"); switch (zone.typeName) { - case "M1": case "M2": case "M21": case "TRF": case "BAT": case "MA" : case "A33_ACMC" : - int rcount=1; - String[] recordsFormatting=componentsDescriptors.get(zone.typeName); - for (String string : recordsFormatting) { - ArrayList varNames=getVarNames(zone.typeName,rcount-1); - ArrayList values = new ArrayList(); - for (String varName : varNames) { - Object varVal=zone.data.get(varName); - values.add(varVal); - //log.debug(" dumping eurostag zone: " + zone.data.get(varName)); - } - out.print(ff.write(values, recordsFormatting[rcount-1])); - out.println(); - rcount++; - } - out.println(); - break; - - case "R": case "RMA": - rcount=1; - recordsFormatting=componentsDescriptors.get(zone.typeName); - - //standard keywords are the basic eurostag parameters defining the macroblock - ArrayList standardKeywords=new ArrayList<>(); - for (String string : recordsFormatting) { - ArrayList varNames=getVarNames(zone.typeName,rcount-1); - ArrayList values = new ArrayList(); - for (String varName : varNames) { - values.add(zone.data.get(varName)); - standardKeywords.add(varName); + case "M1": case "M2": case "M21": case "TRF": case "BAT": case "MA" : case "A33_ACMC" : + int rcount=1; + String[] recordsFormatting=componentsDescriptors.get(zone.typeName); + for (String string : recordsFormatting) { + ArrayList varNames=getVarNames(zone.typeName,rcount-1); + ArrayList values = new ArrayList(); + for (String varName : varNames) { + Object varVal=zone.data.get(varName); + values.add(varVal); + //log.debug(" dumping eurostag zone: " + zone.data.get(varName)); + } + out.print(ff.write(values, recordsFormatting[rcount-1])); + out.println(); + rcount++; } - out.print(ff.write(values, recordsFormatting[rcount-1])); out.println(); - rcount++; - } - - // monitored block : TBD - out.println(); + break; - //supplemental parameters ( - ArrayList exoKeywords=new ArrayList<>(); - for (String key : zone.data.keySet()) { - if (!standardKeywords.contains(key)) { - exoKeywords.add(key); + case "R": case "RMA": + rcount=1; + recordsFormatting=componentsDescriptors.get(zone.typeName); + + //standard keywords are the basic eurostag parameters defining the macroblock + ArrayList standardKeywords=new ArrayList<>(); + for (String string : recordsFormatting) { + ArrayList varNames=getVarNames(zone.typeName,rcount-1); + ArrayList values = new ArrayList(); + for (String varName : varNames) { + values.add(zone.data.get(varName)); + standardKeywords.add(varName); + } + out.print(ff.write(values, recordsFormatting[rcount-1])); + out.println(); + rcount++; } - } - if (exoKeywords.size()>0) { - for (String key : exoKeywords) { - ArrayList values2 = new ArrayList(); - values2.add(key); - values2.add(zone.data.get(key)); - out.println(ff.write(values2, "(A8,1X,F8)")); - } - } + // monitored block : TBD + out.println(); - out.println(); - break; - - case "LOADP": - int rcountl=1; - String[] recordsFormattingl=componentsDescriptors.get(zone.typeName); - for (String string : recordsFormattingl) { - ArrayList varNames=getVarNames(zone.typeName,rcountl-1); - ArrayList values = new ArrayList(); - for (String varName : varNames) { - values.add(zone.data.get(varName)); - } - out.print(ff.write(values, recordsFormattingl[rcountl-1])); + //additional parameter modification lines + zone.data.keySet() + .stream() + .filter(key -> !standardKeywords.contains(key)) + .sorted() + .forEach(key -> { + try { + out.println(ff.write(new ArrayList<>(Arrays.asList(key, zone.data.get(key))), ADDITIONAL_PARAM_LINE_FORMAT)); + } catch (ParseException | IOException e) { + log.error(e.getMessage(),e); + throw new RuntimeException(e.getMessage(), e); + } + }); out.println(); - rcountl++; - } - out.println(); - //tobefixed: rte suggestion to make the simulation run, add two white lines after LOADP - out.println(); - out.println(); - break; - - case "CH": - int chcountl=1; - String[] recordsFormattingch=componentsDescriptors.get(zone.typeName); - for (String string : recordsFormattingch) { - ArrayList varNames=getVarNames(zone.typeName,chcountl-1); - ArrayList values = new ArrayList(); - for (String varName : varNames) { - values.add(zone.data.get(varName)); + break; + + case "LOADP": + int rcountl=1; + String[] recordsFormattingl=componentsDescriptors.get(zone.typeName); + for (String string : recordsFormattingl) { + ArrayList varNames=getVarNames(zone.typeName,rcountl-1); + ArrayList values = new ArrayList(); + for (String varName : varNames) { + values.add(zone.data.get(varName)); + } + out.print(ff.write(values, recordsFormattingl[rcountl-1])); + out.println(); + rcountl++; } - out.print(ff.write(values, recordsFormattingch[chcountl-1])); out.println(); - chcountl++; - } - out.println(); - break; - - case "A11": case "A12": case "A14": - int acountl=1; - String[] recordsFormattinga=componentsDescriptors.get(zone.typeName); - for (String string : recordsFormattinga) { - ArrayList varNames=getVarNames(zone.typeName,acountl-1); - ArrayList values = new ArrayList(); - for (String varName : varNames) { - values.add(zone.data.get(varName)); + //tobefixed: rte suggestion to make the simulation run, add two white lines after LOADP + out.println(); + out.println(); + break; + + case "CH": + int chcountl=1; + String[] recordsFormattingch=componentsDescriptors.get(zone.typeName); + for (String string : recordsFormattingch) { + ArrayList varNames=getVarNames(zone.typeName,chcountl-1); + ArrayList values = new ArrayList(); + for (String varName : varNames) { + values.add(zone.data.get(varName)); + } + out.print(ff.write(values, recordsFormattingch[chcountl-1])); + out.println(); + chcountl++; } - out.print(ff.write(values, recordsFormattinga[acountl-1])); out.println(); - acountl++; - } - break; + break; + + case "A11": case "A12": case "A14": + int acountl=1; + String[] recordsFormattinga=componentsDescriptors.get(zone.typeName); + for (String string : recordsFormattinga) { + ArrayList varNames=getVarNames(zone.typeName,acountl-1); + ArrayList values = new ArrayList(); + for (String varName : varNames) { + values.add(zone.data.get(varName)); + } + out.print(ff.write(values, recordsFormattinga[acountl-1])); + out.println(); + acountl++; + } + break; - default: - break; + default: + break; } } public static void dumpGensInertia(String cimId, EurostagRecord zone, PrintStream out) throws ParseException, IOException { switch (zone.typeName) { - case "M1": case "M2": - int rcount=1; - Object genInertiaObj=zone.data.get("H"); - //retrieve machine's inertia data - out.print(cimId+";"+zone.data.get("machine.name")+";"+zone.data.get("H")); - out.println(); - break; - default: - break; + case "M1": case "M2": + int rcount=1; + Object genInertiaObj=zone.data.get("H"); + //retrieve machine's inertia data + out.print(cimId+";"+zone.data.get("machine.name")+";"+zone.data.get("H")); + out.println(); + break; + default: + break; } } @@ -528,70 +527,89 @@ public static ArrayList parseZones(Path dtaFile) throws IOExcept // String eurostagVersion=(String) repat.get(2); // System.out.println("eversion= " + eurostagVersion); + int lineNum=0; while ( line != null ) { line = reader.readLine(); - log.debug("- readline outer: " + line); if (line == null) continue; + //first token identifies the Eurostag component (split on space characters, skip empty lines) + String[] tokens = line.split(" "); + if ((tokens.length == 0) || (!componentTypeMap.containsKey(tokens[0]))) { + log.debug(" skipped line: " + line); + continue; + } - for (String hkey : componentsDescriptors.keySet()) { - if (line.startsWith(hkey)) { - log.debug("readline inner(recognized section): " + line); - HashMap compHash=new HashMap(); - ArrayList> compArray=new ArrayList>(); - int i=0; - for (String string : componentsDescriptors.get(hkey)) { - compArray.add(FortranFormat.read(line, string)); - i++; - if (i record : compArray) { - //System.out.println(" record "+ rcount+" "+record); - - ArrayList varNames=getVarNames(hkey,rcount-1); - int varid=0; - for (Object obj : record) { - //System.out.println(varNames.get(varid)+"="+obj); - compHash.put(varNames.get(varid), obj); - varid++; - } + String typeId = componentTypeMap.get(tokens[0]); + log.debug("recognized component type id " + typeId +" in line: " + line); + HashMap compHash=new HashMap(); + ArrayList> compArray=new ArrayList>(); + int i=0; + for (String string : componentsDescriptors.get(typeId)) { + log.debug(" inner - line: " + line); + compArray.add(FortranFormat.read(line, string)); + i++; + if (i paramRec = FortranFormat.read(line, ADDITIONAL_PARAM_LINE_FORMAT); + if (paramRec.size()==2) { + compHash.put(paramRec.get(0).toString(), paramRec.get(1)); } + } + } - EurostagRecord newZone=new EurostagRecord(hkey,compHash); - switch (newZone.typeName) { - case "M2": case "M1": - String retVal=""; - retVal+=newZone.typeName; - if (newZone.getData().get("type.fortescue") != null) - retVal+=newZone.getData().get("type.fortescue"); - else retVal+=" "; - if (newZone.getData().get("saturated") != null) - retVal+=newZone.getData().get("saturated"); - else retVal+=" "; - newZone.setKeyName(retVal); - break; - default: - newZone.setKeyName(newZone.getTypeName()); - break; - } + int rcount=1; + //then join properties names + for (ArrayList record : compArray) { + //System.out.println(" record "+ rcount+" "+record); + log.debug(" record: {}", record); + ArrayList varNames=getVarNames(typeId,rcount-1); + int varid=0; + for (Object obj : record) { + //System.out.println(varNames.get(varid)+"="+obj); + compHash.put(varNames.get(varid), obj); + varid++; + } - retZones.add(newZone); + rcount++; + } + EurostagRecord newZone=new EurostagRecord(typeId,compHash); + switch (newZone.typeName) { + case "M2": case "M1": + String retVal=""; + retVal+=newZone.typeName; + if (newZone.getData().get("type.fortescue") != null) + retVal+=newZone.getData().get("type.fortescue"); + else retVal+=" "; + if (newZone.getData().get("saturated") != null) + retVal+=newZone.getData().get("saturated"); + else retVal+=" "; + newZone.setKeyName(retVal); + break; + default: + newZone.setKeyName(newZone.getTypeName()); + break; + } - lineNum++; - } + retZones.add(newZone); - } + lineNum++; } } return retZones; @@ -643,7 +661,4 @@ public static Map readWithCsvMapReader(Path dicoFile) throws Exc return retMap; } - - - }