/*
* @(#)BPANetRecord.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, Mike Zhou
* @Version 1.0
* @Date 02/11/2008
*
* Revision History
* ================
*
*/
package org.ieee.odm.adapter.bpa.lf;
import static org.ieee.odm.ODMObjectFactory.OdmObjFactory;
import java.util.StringTokenizer;
import org.ieee.odm.common.ODMException;
import org.ieee.odm.common.ODMLogger;
import org.ieee.odm.model.aclf.BaseAclfModelParser;
import org.ieee.odm.model.base.BaseDataSetter;
import org.ieee.odm.model.base.BaseJaxbHelper;
import org.ieee.odm.model.base.ODMModelStringUtil;
import org.ieee.odm.schema.ActivePowerUnitType;
import org.ieee.odm.schema.ApparentPowerXmlType;
import org.ieee.odm.schema.AreaTransferXmlType;
import org.ieee.odm.schema.BranchXmlType;
import org.ieee.odm.schema.BusXmlType;
import org.ieee.odm.schema.ExchangeAreaXmlType;
import org.ieee.odm.schema.InterchangeXmlType;
import org.ieee.odm.schema.LoadflowNetXmlType;
import org.ieee.odm.schema.NetAreaXmlType;
import org.ieee.odm.schema.NetZoneXmlType;
import org.ieee.odm.schema.NetworkXmlType;
import org.ieee.odm.schema.VoltageUnitType;
public class BPANetRecord {
/*
* Network data
* ============
*/
public <T extends NetworkXmlType> void processReadComment(final String str, final T baseCaseNet){
// adapter.logErr("This line is for comment only: "+str);
// to do in future
}
public <T extends NetworkXmlType> void processNetData(final String str, final T baseCaseNet) {
// parse the input data line
final String[] strAry = getNetDataFields(str);
//read powerflow, caseID,projectName,
if (strAry[0]!= null ){
BaseJaxbHelper.addNVPair(baseCaseNet, strAry[0], strAry[1]);
ODMLogger.getLogger().fine(strAry[0] +": " + strAry[1]);
}
if (strAry[2]!= null ){
BaseJaxbHelper.addNVPair(baseCaseNet, strAry[2], strAry[4]);
ODMLogger.getLogger().fine(strAry[2]+": " + strAry[4] );
}
// more name-vale could be added in future
if(str.startsWith("/MVA_BASE")){
if(strAry[5]!= null) {
double baseMva = new Double(strAry[5]).doubleValue(); // in MVA
ApparentPowerXmlType baseKva = baseCaseNet.getBasePower();
baseKva.setValue(baseMva);
}
}
}
/*
* area data
* ================
*/
public <T extends NetworkXmlType> void processAreaData(final String str,final BaseAclfModelParser<? extends NetworkXmlType> parser,
final T baseCaseNet, int areaNumber ) throws ODMException {
LoadflowNetXmlType net = (LoadflowNetXmlType)baseCaseNet;
final String[] strAry = getAreaDataFields(str);
int zoneId=0;
if(str.trim().startsWith("A")||str.trim().startsWith("AC")){
if (baseCaseNet.getAreaList() == null)
baseCaseNet.setAreaList(OdmObjFactory.createNetworkXmlTypeAreaList());
String areaName="";
if(!strAry[2].equals("")){
areaName=strAry[2];
}
ExchangeAreaXmlType area =null;
if(!str.startsWith("AC+")) {
area= OdmObjFactory.createExchangeAreaXmlType();
baseCaseNet.getAreaList().getArea().add(area);
area.setName(areaName);
area.setNumber(areaNumber);
}
else area=(ExchangeAreaXmlType) getAreaByName(baseCaseNet, areaName);
String slackBusName="";
double ratedVoltage=0;
if(!strAry[3].equals("")){
slackBusName=strAry[3];
String slackBusId=BPABusRecord.getBusId(slackBusName);
area.setSwingBusId(parser.createBusRef(slackBusId));
}
if(!strAry[4].equals("")){
ratedVoltage =new Double(strAry[4]).doubleValue();
area.setRatedVoltage(BaseDataSetter.createVoltageValue(ratedVoltage, VoltageUnitType.KV));
}
double exchangeMW=0.0;
if(!strAry[5].equals("")){
area.setDesiredExchangePower(BaseDataSetter.createActivePowerValue(exchangeMW, ActivePowerUnitType.MW));
}
if(!strAry[6].trim().equals("")){
if (baseCaseNet.getLossZoneList() == null)
baseCaseNet.setLossZoneList(OdmObjFactory.createNetworkXmlTypeLossZoneList());
StringTokenizer st = new StringTokenizer(strAry[6]);
String zoneName="";
while(st.hasMoreTokens()){
zoneName=st.nextToken().trim();
NetZoneXmlType zone= parser.createNetworkLossZone();
area.getZone().add(zone);
//TODO what is loss zone?
//baseCaseNet.getLossZoneList().getLossZone().add(zone);
zone.setName(zoneName);
int zoneNumber =baseCaseNet.getLossZoneList().getLossZone().size()+1;
zone.setNumber(zoneNumber);
zone.setId("zone-"+zoneNumber);
}
}
}
/*
else if(str.trim().startsWith("AO")){
final String dataType=strAry[0];
if(!strAry[1].equals("")){
final String modCode= strAry[1];
}
if(!strAry[2].trim().equals("")){
String areaName=strAry[2];
NetAreaXmlType area=BaseJaxbHelper.getAreaRecordByAreaName(areaName, baseCaseNet);
if(area==null){
area.setName(areaName);
}
}
if(!strAry[3].trim().equals("")){
// suppose there is a maximum of 40 areas
final String s[]= new String[40];
int cnt=0, i=0;
}
}
*/
else if(str.trim().startsWith("I")){// I Record defines the inter-area power exchange
if (net.getInterchangeList() == null)
net.setInterchangeList(OdmObjFactory.createLoadflowNetXmlTypeInterchangeList());
String fAreaName="";
if(!strAry[2].equals("")){
fAreaName= strAry[2];
}
String tAreaName="";
if(!strAry[3].equals("")){
tAreaName= strAry[3];
}
double exchangePower=0.0;
if(!strAry[4].equals("")){
exchangePower= new Double(strAry[4]).doubleValue();
}
if(!fAreaName.equals("")&&!tAreaName.equals("")){//&& exchangePower!=0
InterchangeXmlType interchange = OdmObjFactory.createInterchangeXmlType();
net.getInterchangeList().getInterchange().add(interchange);
AreaTransferXmlType transfer = OdmObjFactory.createAreaTransferXmlType();
interchange.setAreaTransfer(transfer);
//get area data
NetAreaXmlType fArea=getAreaByName(baseCaseNet, fAreaName);
NetAreaXmlType tArea=getAreaByName(baseCaseNet, tAreaName);
// define an transfer id
String trId="Trans_"+fAreaName+"_to_"+tAreaName;
transfer.setFromArea(fArea.getNumber());
transfer.setToArea(tArea.getNumber());
transfer.setId(trId);
transfer.setAmountMW(exchangePower);
}
}
}
private static String[] getNetDataFields(final String str) {
final String[] strAry = new String[7];
//the first line data
if(str.startsWith("(POWERFLOW")){
String s1[]= new String[3];
final StringTokenizer st= new StringTokenizer(str, ",");
s1[0]=st.nextToken();
s1[1]=st.nextToken();
s1[2]=st.nextToken();
final StringTokenizer st1= new StringTokenizer(s1[1], "=");
strAry[0]=st1.nextToken();
strAry[1]=st1.nextToken();
final StringTokenizer st2= new StringTokenizer(s1[2], "=");
strAry[2]=st2.nextToken();
strAry[3]=st2.nextToken();
int length= strAry[3].length();
strAry[4]=strAry[3].substring(0, length-1);
}
// select certain concerned data to added
//strAry[4]= baseMVA
if(str.startsWith("/MVA_BASE")){
strAry[5]=str.substring(10, str.length()-1);
}
return strAry;
}
private static String[] getAreaDataFields(final String str) {
final String[] strAry = new String[7];
try{
if (str.trim().startsWith("A")||str.trim().startsWith("AC")||str.trim().startsWith("AC+")){
strAry[0] = ODMModelStringUtil.getStringReturnEmptyString(str, 1, 2);
strAry[1] = ODMModelStringUtil.getStringReturnEmptyString(str, 3, 3);
strAry[2] = ODMModelStringUtil.getStringReturnEmptyString(str, 4, 13);
strAry[3] = ODMModelStringUtil.getStringReturnEmptyString(str, 14, 21);
strAry[4] = ODMModelStringUtil.getStringReturnEmptyString(str, 22, 25);
strAry[5] = ODMModelStringUtil.getStringReturnEmptyString(str, 26, 34);
// zones within area
int strlength=str.trim().length();
if(strlength<=36) strAry[6]="";
else strAry[6] = ODMModelStringUtil.getStringReturnEmptyString(str,36, strlength);
}
else if(str.trim().startsWith("AO")){
strAry[0] = ODMModelStringUtil.getStringReturnEmptyString(str,1, 2).trim();
strAry[1] = ODMModelStringUtil.getStringReturnEmptyString(str,3, 3).trim();
// area name
strAry[2] = ODMModelStringUtil.getStringReturnEmptyString(str,4, 13).trim();
// zones within the area
int strlength=str.length();
strAry[3] = ODMModelStringUtil.getStringReturnEmptyString(str,15, strlength).trim();
}
else if(str.trim().startsWith("I")){
strAry[0] = ODMModelStringUtil.getStringReturnEmptyString(str, 1, 1);
strAry[1] = ODMModelStringUtil.getStringReturnEmptyString(str, 3, 3);
strAry[2] = ODMModelStringUtil.getStringReturnEmptyString(str, 4, 13);
strAry[3] = ODMModelStringUtil.getStringReturnEmptyString(str, 15, 24);
strAry[4] = ODMModelStringUtil.getStringReturnEmptyString(str, 27, 34);
}
} catch (Exception e){
ODMLogger.getLogger().severe(e.toString());
}
return strAry;
}
private <T extends NetworkXmlType> NetAreaXmlType getAreaByName(final T baseNet, final String areaName) throws ODMException{
NetAreaXmlType targetArea=null;
LoadflowNetXmlType net = (LoadflowNetXmlType)baseNet;
for(NetAreaXmlType area : net.getAreaList().getArea()){
if(area.getName().equals(areaName))
{targetArea=area;break;}
}
if(targetArea!=null)return targetArea;
else throw new ODMException("the target area with NAME #"+areaName+"# is not found!,please check the input name");
}
}