/*
* @(#)AclfModelComparator.java
*
* Copyright (C) 2009 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 Mike Zhou
* @Version 1.0
* @Date 04/11/2009
*
* Revision History
* ================
*
*/
package org.ieee.odm.util;
import java.util.List;
import org.ieee.odm.common.ODMNumericUtil;
import org.ieee.odm.model.IODMModelParser;
import org.ieee.odm.model.aclf.AclfModelParser;
import org.ieee.odm.model.aclf.AclfParserHelper;
import org.ieee.odm.model.base.BaseJaxbHelper;
import org.ieee.odm.schema.BranchXmlType;
import org.ieee.odm.schema.BusXmlType;
import org.ieee.odm.schema.LFGenCodeEnumType;
import org.ieee.odm.schema.LFLoadCodeEnumType;
import org.ieee.odm.schema.LineBranchXmlType;
import org.ieee.odm.schema.LoadflowBusXmlType;
import org.ieee.odm.schema.LoadflowGenDataXmlType;
import org.ieee.odm.schema.LoadflowLoadDataXmlType;
import org.ieee.odm.schema.PSXfrBranchXmlType;
import org.ieee.odm.schema.XfrBranchXmlType;
import org.interpss.numeric.util.NumericUtil;
/**
* Aclf model comparator for testing and verification purpose
*
* @author mzhou
*
*/
public class AclfModelComparator {
/**
* compare bus objects: b1 and b2. The error is store in the msgList
*
* @param base
* @param bus
* @param msgList
*/
public static void compare(LoadflowBusXmlType base, LoadflowBusXmlType bus, List<String> msgList,
String baseStr, String format) {
String id = base.getId() + ", " + base.getName().trim();
if (base.getBaseVoltage().getValue() != bus.getBaseVoltage().getValue())
msgList.add("\nBus base voltage not equal: " + id + ", " + base.getBaseVoltage().getValue() + baseStr);
/*
<genData>
<equivGen code="PV">
<power unit="MVA" im="0.0" re="3570.0"/>
<desiredVoltage unit="PU" value="1.049"/>
<qLimit unit="MVAR" active="false" min="0.0" max="880.8"/>
</equivGen>
</genData>
*/
if (base.getGenData() != null && bus.getGenData() != null) {
LoadflowGenDataXmlType baseGen = AclfParserHelper.getDefaultGen(base.getGenData());
LoadflowGenDataXmlType busGen = AclfParserHelper.getDefaultGen(bus.getGenData());
if (base.getGenData().getCode() != bus.getGenData().getCode())
msgList.add("\nBus EquivGen code not equal: " + id + ", " +
base.getGenData().getCode() + baseStr +
" " + bus.getGenData().getCode() + format);
if (base.getGenData().getCode() == LFGenCodeEnumType.PV) {
if (!NumericUtil.equals(baseGen.getPower().getRe(), busGen.getPower().getRe()))
msgList.add("\nBus EquivGen power not equal: " + id + " " + base.getGenData().getCode()
+ " " + BaseJaxbHelper.toStr(baseGen.getPower()) + baseStr
+ " " + BaseJaxbHelper.toStr(busGen.getPower()) + format);
if (!ODMNumericUtil.equals(baseGen.getDesiredVoltage(), busGen.getDesiredVoltage()))
msgList.add("\nBus EquivGen desiredVoltage not equal: " + id + " " + base.getGenData().getCode()
+ " " + BaseJaxbHelper.toStr(baseGen.getDesiredVoltage()) + baseStr
+ " " + BaseJaxbHelper.toStr(busGen.getDesiredVoltage()) + format);
}
else if (base.getGenData().getCode() == LFGenCodeEnumType.PQ) {
if (!ODMNumericUtil.equals(baseGen.getPower(), busGen.getPower()))
msgList.add("\nBus EquivGen power not equal: " + id + " " + base.getGenData().getCode()
+ " " + BaseJaxbHelper.toStr(baseGen.getPower()) + baseStr
+ " " + BaseJaxbHelper.toStr(busGen.getPower()) + format);
}
else if (base.getGenData().getCode() == LFGenCodeEnumType.SWING) {
if (!ODMNumericUtil.equals(baseGen.getDesiredVoltage(), busGen.getDesiredVoltage()))
msgList.add("\nBus EquivGen desiredVoltage not equal: " + id + " " + base.getGenData().getCode()
+ " " + BaseJaxbHelper.toStr(baseGen.getDesiredVoltage()) + baseStr
+ " " + BaseJaxbHelper.toStr(busGen.getDesiredVoltage()) + format);
}
}
else if (base.getGenData() == null && bus.getGenData() != null) {
LoadflowGenDataXmlType baseGen = AclfParserHelper.getDefaultGen(base.getGenData());
LoadflowGenDataXmlType busGen = AclfParserHelper.getDefaultGen(bus.getGenData());
if ( bus.getGenData().getCode() != LFGenCodeEnumType.NONE_GEN || base.getGenData().getCode() != LFGenCodeEnumType.NONE_GEN) {
msgList.add("\nBus EquivGen model not equal: " + id + ", " +
base.getGenData().getCode() + baseStr +
" " + bus.getGenData().getCode() + format);
}
}
/*
<loadData>
<equivLoad code="CONST_P">
<constPLoad unit="MVA" im="442.6" re="700.0"/>
</equivLoad>
</loadData>
*/
if (base.getLoadData() != null && bus.getLoadData() != null) {
LoadflowLoadDataXmlType baseLoad = AclfParserHelper.getDefaultLoad(base.getLoadData());
LoadflowLoadDataXmlType busLoad = AclfParserHelper.getDefaultLoad(bus.getLoadData());
if (baseLoad.getCode() != busLoad.getCode())
msgList.add("\nBus EquivLoad code not equal: " + id + ", " +
baseLoad.getCode() + baseStr +
" " + busLoad.getCode() + format);
if (!ODMNumericUtil.equals(baseLoad.getConstPLoad(), busLoad.getConstPLoad()))
msgList.add("\nBus EquivLoad constP not equal: " + id
+ " " + BaseJaxbHelper.toStr(baseLoad.getConstPLoad()) + baseStr
+ " " + BaseJaxbHelper.toStr(busLoad.getConstPLoad()) + format);
}
else if (base.getLoadData() == null && bus.getLoadData() != null) {
LoadflowLoadDataXmlType baseLoad = AclfParserHelper.getDefaultLoad(base.getLoadData());
LoadflowLoadDataXmlType busLoad = AclfParserHelper.getDefaultLoad(bus.getLoadData());
if (busLoad.getCode() != LFLoadCodeEnumType.NONE_LOAD ||
base.getLoadData() != null && bus.getLoadData() == null
&& baseLoad.getCode() != LFLoadCodeEnumType.NONE_LOAD)
msgList.add("\nBus EquivLoad model not equal: " + id + ", " +
baseLoad.getCode() + baseStr +
" " + busLoad.getCode() + format);
}
/*
<shuntY unit="PU" im="-1.4" re="5.3"/>
*/
if (base.getShuntYData().getEquivY() != null && bus.getShuntYData().getEquivY() != null) {
if (!ODMNumericUtil.equals(base.getShuntYData().getEquivY(), bus.getShuntYData().getEquivY()))
msgList.add("\nBus ShuntY not equal: " + id
+ " " + BaseJaxbHelper.toStr(base.getShuntYData().getEquivY()) + baseStr
+ " " + BaseJaxbHelper.toStr(bus.getShuntYData().getEquivY()) + format);
}
else if (base.getShuntYData().getEquivY() == null && bus.getShuntYData().getEquivY() != null ||
base.getShuntYData().getEquivY() != null && bus.getShuntYData().getEquivY() == null) {
msgList.add("\nBus ShuntY model not equal: " + id);
}
}
/**
* compare aclf line objects: b1 and b2. The error is store in the msgList
*
* @param base
* @param bra
* @param msgList
*/
public static void compare(BranchXmlType base, BranchXmlType bra, IODMModelParser baseParser, List<String> msgList,
String baseFormat, String format) {
AclfModelParser aclfParser = (AclfModelParser)baseParser;
BusXmlType baseFromBus = aclfParser.getBus(BaseJaxbHelper.getRecId(base.getFromBus()));
BusXmlType BASEtoBus = aclfParser.getBus(BaseJaxbHelper.getRecId(base.getToBus()));
String braId = baseFromBus.getName().trim() + "->" + BASEtoBus.getName().trim() + "_" + base.getCircuitId();
//
// LineBranchXmlType
//
if (base instanceof LineBranchXmlType ) {
LineBranchXmlType baseLine = (LineBranchXmlType)base;
LineBranchXmlType line = (LineBranchXmlType)bra;
/*
<z unit="PU" im="0.0181" re="0.0014"/>
*/
if (!ODMNumericUtil.equals(baseLine.getZ(), line.getZ())) {
msgList.add("\nLine Branch Z not equal: " + braId
+ " " + BaseJaxbHelper.toStr(baseLine.getZ()) + baseFormat
+ " " + BaseJaxbHelper.toStr(line.getZ()) + format);
}
/*
<totalShuntY unit="PU" im="0.11444" re="0.0"/>
*/
if (!ODMNumericUtil.equals(baseLine.getTotalShuntY(), line.getTotalShuntY())) {
msgList.add("\nLine Branch TotalShuntY not equal: " + braId
+ " " + BaseJaxbHelper.toStr(baseLine.getTotalShuntY()) + baseFormat
+ " " + BaseJaxbHelper.toStr(line.getTotalShuntY()) + format);
}
}
//
// XfrBranchXmlType
//
if (base instanceof XfrBranchXmlType ) {
XfrBranchXmlType baseXfr = (XfrBranchXmlType)base;
XfrBranchXmlType xfr = (XfrBranchXmlType)bra;
/*
<z unit="PU" im="0.0066" re="8.0E-5"/>
*/
if (!ODMNumericUtil.equals(baseXfr.getZ(), xfr.getZ())) {
msgList.add("\nXfr Branch Z not equal: " + braId
+ " " + BaseJaxbHelper.toStr(baseXfr.getZ()) + baseFormat
+ " " + BaseJaxbHelper.toStr(xfr.getZ()) + format);
}
/*
<fromTurnRatio unit="PU" value="1.0"/>
<toTurnRatio unit="PU" value="0.9524"/>
*/
if (!NumericUtil.equals(baseXfr.getFromTurnRatio().getValue(), xfr.getFromTurnRatio().getValue(), 0.0001)) {
msgList.add("\nXfr Branch fromTurnRatio not equal: " + braId
+ " [" + baseXfr.getFromTurnRatio().getValue() + "," + baseXfr.getToTurnRatio().getValue() + "] " + baseFormat
+ " [" + + xfr.getFromTurnRatio().getValue() + "," + xfr.getToTurnRatio().getValue() + "]");
}
if (!NumericUtil.equals(baseXfr.getToTurnRatio().getValue(), xfr.getToTurnRatio().getValue(), 0.0001)) {
msgList.add("\nXfr Branch toTurnRatio not equal: " + braId
+ " [" + baseXfr.getFromTurnRatio().getValue() + "," + baseXfr.getToTurnRatio().getValue() + "] " + baseFormat
+ " [" + + xfr.getFromTurnRatio().getValue() + "," + xfr.getToTurnRatio().getValue() + "]" + format);
}
/*
<xfrInfo>
<fromRatedVoltage unit="KV" value="26.0"/>
<toRatedVoltage unit="KV" value="525.0"/>
</xfrInfo>
*/
if (base instanceof PSXfrBranchXmlType ) {
}
}
}
}