package org.ieee.odm.adapter.ge;
import org.ieee.odm.adapter.AbstractODMAdapter;
import org.ieee.odm.adapter.ge.mapper.dynamic.PSLFDynGeneratorMapper;
import org.ieee.odm.adapter.ge.mapper.dynamic.PSLFDynLoadMapper;
import org.ieee.odm.adapter.psse.mapper.dynamic.DynamicModelLibHelper;
import org.ieee.odm.adapter.psse.mapper.dynamic.PSSEDynExciterMapper;
import org.ieee.odm.adapter.psse.mapper.dynamic.PSSEDynGeneratorMapper;
import org.ieee.odm.adapter.psse.mapper.dynamic.PSSEDynTurGovMapper;
import org.ieee.odm.adapter.psse.mapper.dynamic.DynamicModelLibHelper.DynModelType;
import org.ieee.odm.common.IFileReader;
import org.ieee.odm.common.ODMException;
import org.ieee.odm.model.IODMModelParser;
import org.ieee.odm.model.aclf.BaseAclfModelParser;
import org.ieee.odm.model.base.ODMModelStringUtil;
import org.ieee.odm.model.dstab.DStabModelParser;
import org.ieee.odm.schema.LoadflowNetXmlType;
public class PSLFDynAdapter extends AbstractODMAdapter{
protected BaseAclfModelParser<? extends LoadflowNetXmlType> parser =null;
DynamicModelLibHelper dynLibHelper = new DynamicModelLibHelper();
PSLFDynGeneratorMapper generatorMapper =null;
// PSSEDynExciterMapper exciterMapper =null;
// PSSEDynTurGovMapper turGovMapper = null;
PSLFDynLoadMapper loadMapper = null;
boolean saveSupportedData = false;
public PSLFDynAdapter(){
generatorMapper = new PSLFDynGeneratorMapper();
loadMapper = new PSLFDynLoadMapper();
}
public PSLFDynAdapter(DStabModelParser dynParser){
this();
parser = dynParser;
}
/*
* parse the input dynamic model data
*/
public IODMModelParser parseDStabFile(final IFileReader din, String encoding) throws ODMException {
String lineStr = null;
String modelType = "";
int lineNo = 0;
try {
do {
lineStr = din.readLine();
if (lineStr != null) {
lineNo++;
if(skipInvalidLine(lineStr)){
System.out.println("Invalid line, line# "+lineNo+",:"+lineStr);
continue;
}
lineStr = lineStr.trim();
if(lineStr.length()>0){//only process when it is not a blank line
while(!isModelDataCompleted(lineStr)){
//remove the "/" at the end of data definition
//if(lineStr.lastIndexOf("/") ==lineStr.length()-1)
lineStr =lineStr.substring(0, lineStr.lastIndexOf("/"));
lineStr += " "+din.readLine().trim(); // add the blank to avoid data of two lines connecting together
lineNo++;
}
modelType = getModelType(lineStr);
if(modelType !=null){
DynModelType type = dynLibHelper.getModelType(modelType);
if(type!=null){
if(type==DynModelType.GENERATOR){
generatorMapper.procLineString(modelType, lineStr, (DStabModelParser) parser);
}
// else if(dynLibHelper.getModelType(modelType)==DynModelType.EXCITER){
// exciterMapper.procLineString(modelType, lineStr, (DStabModelParser)parser);
// }
// else if(dynLibHelper.getModelType(modelType)==DynModelType.TUR_GOV){
// turGovMapper.procLineString(modelType, lineStr, (DStabModelParser)parser);
// }
else if(type==DynModelType.LOAD){
loadMapper.procLineString(modelType, lineStr, (DStabModelParser) parser);
}
//save supported model data
if(saveSupportedData)
dynLibHelper.saveSupportedModelData(lineStr);
}
else{
//System.out.println("model unsupported :"+lineStr);
//throw new Exception("The input dynamic model is not supported yet, Type #"+modelType);
dynLibHelper.procUnsupportedModel(modelType, lineStr);
}
}
}
}
}while(lineStr!=null);
} catch (Exception e) {
e.printStackTrace();
throw new ODMException("PSSE dynamic data input error, line # " + lineNo + ", " + e.toString());
}
System.out.println(dynLibHelper.getUnsupportdSVCRecs());
return parser;
}
private boolean isModelDataCompleted(String lineStr){
// if the end of the line string is "/", then the data is not completed
boolean hasContiuneFlag = lineStr.lastIndexOf("/")>0 && (lineStr.lastIndexOf("/") ==lineStr.length()-1);
return !hasContiuneFlag;
}
/**
* Model type string is stored in the second entry.
* Exmaple:
* 1 'IEEET1' 1 0.06 20.0 0.2 1.172
*
* @param lineStr
* @return
*/
private String getModelType(String lineStr){
String[] strAry =lineStr.split("\\s+");
if(strAry.length>2)
return strAry[0];
else
System.out.println("The input data is not correct model data : "+lineStr);
// try {
// throw new Exception("The input data is not correct model data : "+lineStr);
// } catch (Exception e) {
// e.printStackTrace();
// }
return null;
}
/**
* return true if the line is not a valid line, such as a comment line
* @param lineStr
* @return
*/
private boolean skipInvalidLine(String lineStr){
if(lineStr.trim().length()==0.0){
return true;
}
if(lineStr.trim().startsWith("#") || lineStr.trim().startsWith("/"))
return true;
// only got here if we didn't return false
return false;
}
@Override
protected IODMModelParser parseInputFile(IFileReader din,
String encoding) throws ODMException {
return parseDStabFile(din, encoding);
}
@Override
protected IODMModelParser parseInputFile(NetType type,
IFileReader[] dins, String encoding) throws ODMException {
throw new UnsupportedOperationException();
}
@Override public void setModelParser(IODMModelParser parser){
this.odmParser = parser;
this.parser = (BaseAclfModelParser<? extends LoadflowNetXmlType>) parser;
}
}