/*
* @(#)BPADynamicRecord.java
*
* Copyright (C) 2006-2008 www.interpss.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* @Author Stephen Hau
* @Version 1.0
* @Date 02/11/2008
*
* Revision History
* ================
*
*/
package org.ieee.odm.adapter.bpa.dynamic;
import org.ieee.odm.common.IFileReader;
import org.ieee.odm.common.ODMException;
import org.ieee.odm.common.ODMLogger;
import org.ieee.odm.model.base.ODMModelStringUtil;
import org.ieee.odm.model.dstab.DStabModelParser;
import org.ieee.odm.schema.AnalysisCategoryEnumType;
public class BPADynamicRecord {
private final static int header=1;
private final static int faultOperation=2;
private final static int generatorData=3;
private final static int exciterData=4;
private final static int pssData=5;
private final static int turbine_governorData=6;
private final static int loadData=7;
private final static int sequenceData=8;
private final static int simuData=9;
public static void processDynamicData(final IFileReader din, DStabModelParser parser) throws ODMException{
parser.getStudyCase().setAnalysisCategory(AnalysisCategoryEnumType.TRANSIENT_STABILITY);
//PerformanceTimer timer = new PerformanceTimer(ODMLogger.getLogger());
String str;
do{
str= din.readLine();
if(!str.startsWith("90")){
int dataType = getDataType(str);
//System.out.println("processing line--"+str);
try{
if(dataType==header){
processHeaderData(str);
}
else if(dataType==generatorData){
//timer.start();
BPADynamicGeneratorRecord.processGeneratorData(str, parser);
//timer.logStd("processGeneratorData");
}
/*since ODM should only deal with dynamic network data and
fault setting is usually analysis/software-dependent
else if(dataType==faultOperation){
BPADynamicFaultOperationRecord.processFaultOperationData(str, parser);
}
*/
else if(dataType==exciterData){
//timer.start();
BPADynamicExciterRecord.processExciterData(str, parser);
//timer.logStd("processExciterData");
}
else if(dataType==turbine_governorData){
//timer.start();
BPADynamicTurbineGovernorRecord.processTurbineGovernorData(str, parser);
//timer.logStd("processTurbineGovernorData");
}
else if(dataType==pssData){
//timer.start();
BPADynamicPSSRecord.processPSSData(str, parser);
//timer.logStd("processPSSData");
}
else if(dataType==loadData){
//timer.start();
BPADynamicLoadCharacteristicRecord.processLoadCharacteristicData(str, parser);
//timer.logStd("processLoadCharacteristicData");
}
else if(dataType==sequenceData){
//timer.start();
BPADynamicSequenceRecord.processSequenceData(str, parser);
//timer.logStd("processSequenceData");
}
else if(dataType==simuData){
// not used
}
else if(dataType==0){
}
}catch (final Exception e){
e.printStackTrace();
}
}
} while (!str.startsWith("90"));
// when all the data is converted, calculate negative sequence data
// BPADynamicSequenceRecord.processNegativeData(parser);
}
private static int getDataType(String str){
int dataType=0;
if (str.startsWith(".") || str.startsWith("C") || str.trim().length()<1){//filter out the comment lines and blank lines
dataType=0;
}else if(str.startsWith("CASE")||str.startsWith("SOL") || str.startsWith("Bus.")) {
dataType=header;
}else if(str.startsWith("LS")){
dataType=faultOperation;
}else if(str.substring(0, 1).trim().equals("M")||
str.substring(0, 2).trim().equals("MF")||
str.substring(0, 2).trim().equals("MC")||
str.substring(0, 2).trim().equals("LN")){
dataType=generatorData;
}else if (str.substring(0, 1).trim().equals("E")||
str.substring(0, 1).trim().equals("F")&&!str.substring(3, 4).trim().equals("")){//There are two FF records
/*
* ||str.substring(0, 2).trim().equals("FC")
||str.substring(0, 2).trim().equals("FD")||str.substring(0, 2).trim().equals("FE")||
str.substring(0, 2).trim().equals("FG")
||str.substring(0, 2).trim().equals("FH")||str.substring(0, 2).trim().equals("FJ")
||str.substring(0, 2).trim().equals("FK")||str.substring(0, 2).trim().equals("FL")
||str.substring(0, 2).trim().equals("FQ")||str.substring(0, 2).trim().equals("FV")
||str.substring(0, 1).trim().equals("E")||
str.substring(0, 2).trim().equals("FZ")||str.substring(0, 2).trim().equals("F+")
*/
dataType=exciterData;
}else if(str.substring(0, 2).trim().equals("SS")||
str.substring(0, 2).trim().equals("SP")||str.substring(0, 2).trim().equals("SG")
||str.substring(0, 2).trim().equals("SI")||str.substring(0, 3).trim().equals("SI+")){
dataType=pssData;
}else if(str.substring(0, 2).trim().equals("GS")||str.substring(0, 2).trim().equals("GH")
||str.substring(0, 2).trim().equals("GG")||str.substring(0, 2).trim().equals("GA")
||str.substring(0, 2).trim().equals("GI")||str.substring(0, 3).trim().equals("GI+")
||str.substring(0, 2).trim().equals("TA")||str.substring(0, 2).trim().equals("TB")
){
dataType=turbine_governorData;
}else if(str.substring(0, 2).trim().equals("LA")||
str.substring(0, 2).trim().equals("LB")||str.substring(0, 2).trim().equals("MI")){
dataType=loadData;
}else if(str.substring(0, 2).trim().equals("LO")||str.substring(0, 2).trim().equals("XO")
||str.substring(0, 2).trim().equals("XR")||str.substring(0, 2).trim().equals("LM")){
dataType=sequenceData;
}else if(str.substring(0, 2).trim().equals("FF")){
dataType=simuData;
}else {
ODMLogger.getLogger().warning("This line data is not processed"+" "+"'"+str+"'");
}
return dataType;
}
public static void processHeaderData(String str){
final String strAry[]= getHeaderDataFields(str);
// AclfAlgorithmXmlType aclfAlgo = tranSimu.getAclfInitialization();
// network solution card--SOL
// if(str.startsWith("SOL")){
// if(!strAry[2].equals("")){
// if(new Integer(strAry[2]).intValue()==1){
// aclfAlgo.setLfMethod(LfMethodEnumType.NR);
// }
// }
// else{
// aclfAlgo.setLfMethod(LfMethodEnumType.PQ);
// }
// }
// CASE card
if(str.startsWith("CASE")){
//TransientSimulationXmlType.SimulationSetting simuSet= tranSimu.getSimulationSetting();
String pfCase= strAry[1];
//pfInitial.setPowerFlowCase(pfCase);
}
}
private static String[] getHeaderDataFields ( final String str) {
final String[] strAry = new String[16];
try{// for SOL card
if(str.startsWith("SOL")){
strAry[0]=ODMModelStringUtil.getStringReturnEmptyString(str, 0, 3);
strAry[1]=ODMModelStringUtil.getStringReturnEmptyString(str, 5, 6);
strAry[2]=ODMModelStringUtil.getStringReturnEmptyString(str,9, 9);
strAry[3]=ODMModelStringUtil.getStringReturnEmptyString(str,12, 12);
}
// for Case card
else if(str.startsWith("CASE")){
strAry[0]=ODMModelStringUtil.getStringReturnEmptyString(str,1, 4);
strAry[1]=ODMModelStringUtil.getStringReturnEmptyString(str,6, 15);
strAry[2]=ODMModelStringUtil.getStringReturnEmptyString(str,16, 17);
strAry[3]=ODMModelStringUtil.getStringReturnEmptyString(str,20, 20);
strAry[4]=ODMModelStringUtil.getStringReturnEmptyString(str,22, 22);
strAry[5]=ODMModelStringUtil.getStringReturnEmptyString(str,23, 23);
strAry[6]=ODMModelStringUtil.getStringReturnEmptyString(str,24, 24);
strAry[7]=ODMModelStringUtil.getStringReturnEmptyString(str,24, 34);
strAry[8]=ODMModelStringUtil.getStringReturnEmptyString(str,45, 49);
strAry[9]=ODMModelStringUtil.getStringReturnEmptyString(str,50, 54);
strAry[10]=ODMModelStringUtil.getStringReturnEmptyString(str,55, 59);
strAry[11]=ODMModelStringUtil.getStringReturnEmptyString(str,60, 64);
strAry[12]=ODMModelStringUtil.getStringReturnEmptyString(str,65, 69);
strAry[13]=ODMModelStringUtil.getStringReturnEmptyString(str,70, 74);
strAry[14]=ODMModelStringUtil.getStringReturnEmptyString(str,75, 80);
}
}catch(Exception e){
ODMLogger.getLogger().severe(e.toString());
}
return strAry;
}
}