package org.ieee.odm.adapter.bpa.lf;
import javax.xml.bind.JAXBElement;
import org.ieee.odm.common.ODMLogger;
import org.ieee.odm.model.aclf.AclfParserHelper;
import org.ieee.odm.model.aclf.BaseAclfModelParser;
import org.ieee.odm.model.base.BaseDataSetter;
import org.ieee.odm.model.base.ODMModelStringUtil;
import org.ieee.odm.schema.ApparentPowerUnitType;
import org.ieee.odm.schema.BranchXmlType;
import org.ieee.odm.schema.BusXmlType;
import org.ieee.odm.schema.LoadflowBusXmlType;
import org.ieee.odm.schema.LoadflowGenDataXmlType;
import org.ieee.odm.schema.LoadflowLoadDataXmlType;
import org.ieee.odm.schema.NetworkXmlType;
public class BPAGenLoadDataModifyRecord {
/*
* only AC Bus will be considered for generation and/or load data modification.
*/
private static final String Modify_Gen_n_Load_ALL="PA"; //PA
private static final String Modify_Gen_n_Load_BY_ZONE="PZ"; //PZ
private static final String Modify_Gen_n_Load_BY_OWNER="PO"; //PO
// for the following, NOT implemented yet
//TODO
private static final String Modify_ConstZILoad_BY_ZONE="PC"; //PC
private static final String Modify_ConstZILoad_BY_OWNER="PB"; //PB
public void processGenLoadModificationData(final String str, BaseAclfModelParser<? extends NetworkXmlType> parser)
throws Exception {
final String[] strAry =getModificationData(str);
double loadP_Factor=1;
double loadQ_Factor=1;
double genP_Factor=1;
double genQ_Factor=1;
if(!strAry[2].equals(""))
loadP_Factor= new Double(strAry[2]).doubleValue();
if(!strAry[3].equals(""))
loadQ_Factor= new Double(strAry[3]).doubleValue();
if(!strAry[4].equals(""))
genP_Factor= new Double(strAry[4]).doubleValue();
if(!strAry[5].equals(""))
genQ_Factor= new Double(strAry[5]).doubleValue();
if(strAry[0].equals(Modify_Gen_n_Load_ALL)){
for(JAXBElement<? extends BusXmlType> b : parser.getNet().getBusList().getBus()){
LoadflowBusXmlType bus=(LoadflowBusXmlType) b.getValue();
modifyLoadData(bus,loadP_Factor,loadQ_Factor);
modifyGenData(bus,genP_Factor,genQ_Factor);
}
}
else if(strAry[0].equals(Modify_Gen_n_Load_BY_ZONE)){
for(JAXBElement<? extends BusXmlType> b : parser.getNet().getBusList().getBus()){
LoadflowBusXmlType bus=(LoadflowBusXmlType) b.getValue();
if(bus.getZoneName().equals(strAry[1])){
modifyLoadData(bus,loadP_Factor,loadQ_Factor);
modifyGenData(bus,genP_Factor,genQ_Factor);
}
}
}
else if (strAry[0].equals(Modify_Gen_n_Load_BY_OWNER)){
for(JAXBElement<? extends BusXmlType> b : parser.getNet().getBusList().getBus()){
LoadflowBusXmlType bus=(LoadflowBusXmlType) b.getValue();
if(bus.getZoneName().equals(strAry[1])){
modifyLoadData(bus,loadP_Factor,loadQ_Factor);
modifyGenData(bus,genP_Factor,genQ_Factor);
}
}
}
else ODMLogger.getLogger().severe("The input modification type #"+strAry[0]+" is not supported yet.");
}
private static String[] getModificationData(final String str){
final String[] strAry = new String[20];
try{
// type
strAry[0] = ODMModelStringUtil.getStringReturnEmptyString(str,1, 2);
//zone name
if(strAry[0].equals(Modify_Gen_n_Load_BY_ZONE)||strAry[0].equals(Modify_ConstZILoad_BY_ZONE))
strAry[1] = ODMModelStringUtil.getStringReturnEmptyString(str,4, 5).trim();
// ower name
else if(strAry[0].equals(Modify_Gen_n_Load_BY_OWNER)||strAry[0].equals(Modify_ConstZILoad_BY_OWNER))
strAry[1] = ODMModelStringUtil.getStringReturnEmptyString(str,4, 6).trim();
// LoadP and LoadQ modification factor
strAry[2] = ODMModelStringUtil.getStringReturnEmptyString(str,10, 14).trim();
strAry[3] = ODMModelStringUtil.getStringReturnEmptyString(str,16, 20).trim();
// GenP and GenQ modification factor
strAry[4] = ODMModelStringUtil.getStringReturnEmptyString(str,22, 26).trim();
strAry[5] = ODMModelStringUtil.getStringReturnEmptyString(str,28, 32).trim();
// for the rest optional setting, not implementation yet
//TODO
}catch(Exception e){
ODMLogger.getLogger().severe(e.toString() + "\n" + str);
e.printStackTrace();
}
return strAry;
}
private static boolean modifyGenData(LoadflowBusXmlType bus, double genPFactor,double genQFactor){
LoadflowGenDataXmlType defaultGen = AclfParserHelper.getDefaultGen(bus.getGenData());
try{
if(bus.getGenData()!=null&&defaultGen!=null
&&defaultGen.getPower()!=null){
double genP=defaultGen.getPower().getRe();
double genQ=defaultGen.getPower().getIm();
if(genP!=0.0)genP*=genPFactor;
if(genQ!=0.0)genQ*=genQFactor;
if(genP!=0.0||genQ!=0){
genP=ODMModelStringUtil.getNumberFormat(genP);
genQ=ODMModelStringUtil.getNumberFormat(genQ);
defaultGen.setPower(BaseDataSetter.createPowerValue(
genP,genQ,ApparentPowerUnitType.MVA));
}
}
}catch(Exception e){
e.printStackTrace();
return false;
}
return true;
}
private static boolean modifyLoadData(LoadflowBusXmlType bus, double loadPFactor,double loadQFactor){
LoadflowLoadDataXmlType defaultLoad = AclfParserHelper.getDefaultLoad(bus.getLoadData());
try{
if(bus.getLoadData()!=null&&defaultLoad!=null
&&defaultLoad.getConstPLoad()!=null){
double loadP=defaultLoad.getConstPLoad().getRe();
double loadQ=defaultLoad.getConstPLoad().getIm();
if(loadP!=0.0)loadP*=loadPFactor;
if(loadQ!=0.0)loadQ*=loadQFactor;
if(loadP!=0.0||loadQ!=0.0){
loadP=ODMModelStringUtil.getNumberFormat(loadP);
loadQ=ODMModelStringUtil.getNumberFormat(loadQ);
defaultLoad.setConstPLoad(BaseDataSetter.createPowerValue(
loadP,loadQ,ApparentPowerUnitType.MVA));
}
}
}catch(Exception e){
e.printStackTrace();
return false;
}
return true;
}
}