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