package org.ieee.odm.adapter.psse.mapper.dynamic;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.ieee.odm.common.ODMLogger;
public class DynamicModelLibHelper {
//only supported model data
StringBuffer supportedDynModelData = new StringBuffer();
//unsupported model data
StringBuffer unsupportedGen = new StringBuffer();
StringBuffer unsupportedExc = new StringBuffer();
StringBuffer unsupportedGov = new StringBuffer();
StringBuffer unsupportedLoad = new StringBuffer();
StringBuffer unsupportedSVC = new StringBuffer();
StringBuffer unsupportedElse = new StringBuffer();
public enum DynModelType{GENERATOR,EXCITER,TUR_GOV,STABILIZER,FACTS,HVDC,VoltComp, LOAD}
//TODO This model list should be extended or updated along with the progress of implementation
private List<String> GeneratorList =new ArrayList<>(
Arrays.asList("GENROU","GENSAL","GENCLS","GENSAE","GENTPF","GENTPJ"));
private List<String> UnSupportedGeneratorList =new ArrayList<>(
Arrays.asList("GENROE","GENDCO","GENTRA","CGEN1"));
//TODO Don't use "EXAC1", it is found to cause errors for wecc system
private List<String> ExciterList = new ArrayList<>(); //new ArrayList<>(Arrays.asList("IEEET1","IEEEX1","EXST1","ESST3A","ESST4B"));
private List<String> UnSupportedExciterList =new ArrayList<>(
Arrays.asList("IEEET2","IEEET3","IEEET4", //IEEE 1968
"ESAC3A","ESAC8B","ESST2A",
"EXAC1A","EXAC2","EXAC41A","EXDC2","EXELI","EXPIC1","EXST2","EXST3",
"IEEEX2","IEEEX3","IEEEX4", //IEEE 1979 Type1->4
"ST5B","ST6B","ST7B", //IEEE2005
"REXSY1","REXSYS","SCRX"));
private List<String> TurGovList = new ArrayList<>();//Arrays.asList("IEEEG1","IEESGO","TGOV1","GAST");//Arrays.asList("IEEEG1","IEESGO","TGOV1","GAST")
private List<String> UnsupportedTurGovList =new ArrayList<>(
Arrays.asList("IEEEG3","GGOV1","HYGOV","HYGOV2","IEEEG2","PIDGOV","WSHYDD","WSHYGP","WSIEG1"));
private List<String> LoadModelList =new ArrayList<>(
Arrays.asList("CMPLDW")); //"IEELBL","IEELAR","CIMTR4","CIMWBL",
private List<String> UnsupportedLoadList =new ArrayList<>(
Arrays.asList("IEELBL","IEELAR","CIMTR4","CIMWBL"));
private List<String> PssList =new ArrayList<>();
private List<String> FactsList =new ArrayList<>();
private List<String> HvdcList =new ArrayList<>();
private List<String> shuntCompensatorList =new ArrayList<>(
Arrays.asList("CSVGN1","CSVGN2","CSVGN3","CSVGN4","CSVGN5","CSVGN6"));
private List<String> VoltCompensatorList =new ArrayList<>(
Arrays.asList("COMP","COMPCC","IEEEVC","REMCMP"));
public DynamicModelLibHelper() {
}
public DynModelType getModelType(String typeStr) {
if(GeneratorList.contains(typeStr.toUpperCase()))
return DynModelType.GENERATOR;
else if(ExciterList.contains(typeStr.toUpperCase()))
return DynModelType.EXCITER;
else if(TurGovList.contains(typeStr.toUpperCase()))
return DynModelType.TUR_GOV;
else if(PssList.contains(typeStr.toUpperCase()))
return DynModelType.STABILIZER;
else if(FactsList.contains(typeStr.toUpperCase()))
return DynModelType.FACTS;
else if(HvdcList.contains(typeStr.toUpperCase()))
return DynModelType.HVDC;
else if (LoadModelList.contains(typeStr.toUpperCase()))
return DynModelType.LOAD;
else {
ODMLogger.getLogger().severe("The input model data type is not found in the dynamic lib collection, Type #"+typeStr);
return null;
}
}
public void procUnsupportedModel(String typeStr, String lineStr){
/*
* // 0----------1----------2----
"IBUS", "Type", "MachId",
*/
String[] strAry=lineStr.split("\\s+");
String busId=strAry[0];
String modelId=strAry[2];
if(UnSupportedGeneratorList.contains(typeStr)){
unsupportedGen.append("GEN,"+typeStr+","+busId+","+modelId+"\n");
}
else if(UnSupportedExciterList.contains(typeStr)){
unsupportedExc.append("Exc,"+typeStr+","+busId+","+modelId+"\n");
}
else if(UnsupportedTurGovList.contains(typeStr)){
unsupportedGov.append("GOV,"+typeStr+","+busId+","+modelId+"\n");
}
else if(UnsupportedLoadList.contains(typeStr)){
unsupportedLoad.append("LOAD,"+typeStr+","+busId+","+modelId+"\n");
}
else if(shuntCompensatorList.contains(typeStr)){
unsupportedSVC.append("SVC,"+typeStr+","+busId+","+modelId+"\n");
}
else
unsupportedElse.append(typeStr+","+busId+","+modelId+"\n");
}
public String getUnsupportdGenRecs(){
return unsupportedGen.toString();
}
public String getUnsupportdExciterRecs(){
return unsupportedExc.toString();
}
public String getUnsupportdGovRecs(){
return unsupportedGov.toString();
}
public String getUnsupportdLoadRecs(){
return unsupportedLoad.toString();
}
public String getUnsupportdSVCRecs(){
return unsupportedSVC.toString();
}
public void saveSupportedModelData(String lineStr){
supportedDynModelData.append(lineStr+"/ \n");
}
public String getSupportedModelData(){
return supportedDynModelData.toString();
}
public boolean saveSupportedModelDataToFile(String fileName){
try {
OutputStream out = new BufferedOutputStream(new FileOutputStream(fileName));
out.write(supportedDynModelData.toString().getBytes());
out.flush();
out.close();
return true;
} catch (Exception e) {
ODMLogger.getLogger().severe("Cannot save to file: " + fileName + ", " + e.toString());
}
return false;
}
}