package org.ieee.odm.adapter.ge.mapper.dynamic.generator;
import org.ieee.odm.adapter.AbstractDataFieldParser;
import org.ieee.odm.adapter.BaseDataMapper;
import org.ieee.odm.common.ODMException;
import org.ieee.odm.common.ODMLogger;
import org.ieee.odm.model.IODMModelParser;
import org.ieee.odm.model.dstab.DStabDataSetter;
import org.ieee.odm.model.dstab.DStabModelParser;
import org.ieee.odm.model.dstab.DStabParserHelper;
import org.ieee.odm.schema.DStabBusXmlType;
import org.ieee.odm.schema.DStabGenDataXmlType;
import org.ieee.odm.schema.Eq11Ed11MachineXmlType;
import org.ieee.odm.schema.Eq11MachineXmlType;
import org.ieee.odm.schema.Eq1MachineXmlType.SeFmt1;
/**
* Refer to Genrou, if T'q0 is not zero, otherwise to Gensal
* @author Qiuhua
*
*/
public class PSLFDynGENTypeJMapper extends BaseDataMapper{
public PSLFDynGENTypeJMapper(AbstractDataFieldParser parser){
this.dataParser = parser;
}
/*
* Xd, Xq, X'd, X'q, X"d, X"q, Xl, H, and D are in pu,
machine MVA base.
X"qmust be equal to X"d.
IBUS, modelType, T'do, T"do, T"qo, T"qo, H, D, Xd, Xq, X'd, X'q, X"d, Xl, S(1.0), S(1.2)/
*/
public void procLineString(String lineStr, DStabModelParser parser) throws ODMException {
this.dataParser.parseFields(lineStr);
/*
* // 0----------1----------2----------3----------4
"IBUS", "Type", "MachId", "T'do", "T''do",
// 5----------6----------7----------8----------9
"T'qo", "T''qo", "H", "D", "Xd",
// 10----------11----------12--------13--------14
"Xq", "X'd", "X'q", "X''d", "Xl",
// 15----------16----
"S(1.0)", "S(1.2)"
*/
int i = dataParser.getInt("IBUS");
final String busId = IODMModelParser.BusIdPreFix+i;
String genId = dataParser.getString("MachId");
//check model type
//GENROU and GENROE data format are the same
if(!(dataParser.getString("Type").equals("GENTPJ"))){
throw new ODMException("machine : Id"+
genId+" @ Bus"+i+"is not a GENTPJ or GENROE generator model");
}
DStabBusXmlType busXml = parser.getBus(busId);
if(busXml!=null){
DStabGenDataXmlType dstabGenData = DStabParserHelper.getDStabContritueGen(busXml, genId);
if(dstabGenData!=null){
double Td1 = dataParser.getDouble("T'do");
double Td11 = dataParser.getDouble("T''do");
double Tq1 = dataParser.getDouble("T'qo");
double Tq11 = dataParser.getDouble("T''qo");
double H = dataParser.getDouble("H");
double D = dataParser.getDouble("D");
double Xl = dataParser.getDouble("Xl");
double Xd = dataParser.getDouble("Xd");
double Xq = dataParser.getDouble("Xq");
double Xd1 = dataParser.getDouble("X'd");
double Xq1 = dataParser.getDouble("X'q");
double Xd11 = dataParser.getDouble("X''d");
double s100 = dataParser.getDouble("S(1.0)")*100; // in percentage
double s120 = dataParser.getDouble("S(1.2)")*100;
if(Tq1>0 && Td11>0.0){
Eq11Ed11MachineXmlType mach = DStabParserHelper.createEq11Ed11Machine(dstabGenData);
//set the type info
mach.setDesc(dataParser.getString("Type"));
mach.setD(D);
mach.setH(H);
//TODO Ra = RSource?
mach.setRa(dstabGenData.getSourceZ().getRe());
//TODO it there a need to use time Unit?
mach.setTd01(DStabDataSetter.createTimeConstSec(Td1));
mach.setTd011(DStabDataSetter.createTimeConstSec(Td11));
mach.setTq01(DStabDataSetter.createTimeConstSec(Tq1));
mach.setTq011(DStabDataSetter.createTimeConstSec(Tq11));
mach.setXl(Xl);
mach.setXd(Xd);
mach.setXq(Xq);
mach.setXd1(Xd1);
mach.setXq1(Xq1);
mach.setXq11(Xd11); // x''q = x''d
mach.setXd11(Xd11);
//saturation
//A and B are such that the points (1.0, S1.0) and (1.2, S1.2)
SeFmt1 s1= DStabParserHelper.createMachineSeFmt1();
//s1.setSliner(1.0); // by default
s1.setSe100(s100);
s1.setSe120(s120);
mach.setSeFmt1(s1);
}
else if(Tq1==0.0 && Td11>0.0){
Eq11MachineXmlType mach = DStabParserHelper.createEq11Machine(dstabGenData);
//set the type info
mach.setDesc(dataParser.getString("Type"));
mach.setD(D);
mach.setH(H);
//TODO Ra = RSource?
mach.setRa(dstabGenData.getSourceZ().getRe());
//TODO it there a need to use time Unit?
mach.setTd01(DStabDataSetter.createTimeConstSec(Td1));
mach.setTd011(DStabDataSetter.createTimeConstSec(Td11));
mach.setTq011(DStabDataSetter.createTimeConstSec(Tq11));
mach.setXl(Xl);
mach.setXd(Xd);
mach.setXq(Xq);
mach.setXd1(Xd1);
mach.setXq11(Xd11); // x''q = x''d
mach.setXd11(Xd11);
//saturation
//A and B are such that the points (1.0, S1.0) and (1.2, S1.2)
SeFmt1 s1= DStabParserHelper.createMachineSeFmt1();
//s1.setSliner(1.0); // by default
s1.setSe100(s100);
s1.setSe120(s120);
mach.setSeFmt1(s1);
}
else {//if(Td1>0 && Td11==0.0)
ODMLogger.getLogger().severe("Unsupported GenTypeJ Gen data set @ "+"Machine # "+genId +" is not found in Bus #"+busId);
}
}
else{
ODMLogger.getLogger().severe("Machine # "+genId +" is not found in Bus #"+busId);
}
}
else{
ODMLogger.getLogger().severe("Bus # "+busId +" is not available in load flow data");
}
}
}