package org.ieee.odm.psse; import static org.junit.Assert.assertTrue; import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; import org.ieee.odm.adapter.IODMAdapter.NetType; import org.ieee.odm.adapter.psse.PSSEAdapter; import org.ieee.odm.adapter.psse.PSSEAdapter.PsseVersion; import org.ieee.odm.common.ODMException; import org.ieee.odm.model.dstab.DStabModelParser; import org.ieee.odm.model.dstab.DStabParserHelper; import org.ieee.odm.schema.AnalysisCategoryEnumType; import org.ieee.odm.schema.DStabBusXmlType; import org.ieee.odm.schema.DStabGenDataXmlType; import org.ieee.odm.schema.DStabLoadDataXmlType; import org.ieee.odm.schema.DStabNetXmlType; import org.ieee.odm.schema.Eq11Ed11MachineXmlType; import org.ieee.odm.schema.Eq11MachineXmlType; import org.ieee.odm.schema.ExcIEEE1968Type1XmlType; import org.ieee.odm.schema.GovIEEE1981Type1XmlType; import org.ieee.odm.schema.GovIEEE1981Type3XmlType; import org.ieee.odm.schema.LFGenCodeEnumType; import org.ieee.odm.schema.LFLoadCodeEnumType; import org.junit.Test; public class PSSEV30_IEEE9_Dstab_Test { @Test public void ieee9_ODM_Dstab_test() throws ODMException{ final LogManager logMgr = LogManager.getLogManager(); Logger logger = Logger.getLogger("IEEE ODM Logger"); logger.setLevel(Level.INFO); logMgr.addLogger(logger); PSSEAdapter adapter = new PSSEAdapter(PsseVersion.PSSE_30); assertTrue(adapter.parseInputFile(NetType.DStabNet, new String[]{ "testData/psse/IEEE9Bus/ieee9.raw", "testData/psse/IEEE9Bus/ieee9.seq", "testData/psse/IEEE9Bus/ieee9_dyn_onlyGen.dyr" })); DStabModelParser dstabParser =(DStabModelParser) adapter.getModel(); dstabParser.stdout(); //caseContentInfo assertTrue(dstabParser.getStudyCase().getAnalysisCategory() == AnalysisCategoryEnumType.TRANSIENT_STABILITY); DStabNetXmlType dynNet = dstabParser.getDStabNet(); /* * <hasLoadflowData>true</hasLoadflowData> <positiveSeqDataOnly>false</positiveSeqDataOnly> <hasShortCircuitData>true</hasShortCircuitData> <saturatedMachineParameter>false</saturatedMachineParameter> */ assertTrue(dynNet.isHasShortCircuitData()); assertTrue(dynNet.isHasLoadflowData()); assertTrue(!dynNet.isPositiveSeqDataOnly()); /* * <dstabBus scCode="Contributing" id="Bus1" areaNumber="1" zoneNumber="1" number="1" offLine="false" name="BUS-1 "> <ownerList id="1"> <ownership unit="PU" value="1.0"/> </ownerList> <baseVoltage unit="KV" value="16.5"/> <voltage unit="PU" value="1.04"/> <angle unit="DEG" value="0.0"/> <genData> <dstabEquivGen code="Swing"> <power unit="MVA" re="71.64" im="27.05"/> <desiredVoltage unit="PU" value="1.04"/> <desiredAngle unit="DEG" value="0.0"/> <pLimit unit="MW" max="9999.0" min="-9999.0"/> <potiveZ unit="PU" re="0.0" im="0.04"/> <negativeZ unit="PU" re="0.0" im="0.04"/> <zeroZ unit="PU" re="0.0" im="0.04"/> </dstabEquivGen> <dstabContributeGen id="1" offLine="false" name="Gen:1(1)"> <desc>PSSE Generator 1 at Bus 1</desc> <power unit="MVA" re="71.64" im="27.05"/> <desiredVoltage unit="PU" value="1.04"/> <qLimit unit="MVAR" max="9999.0" min="-9999.0"/> <pLimit unit="MW" max="9999.0" min="-9999.0"/> <mvaBase unit="MVA" value="100.0"/> <sourceZ unit="PU" re="0.0" im="0.04"/> <mvarVControlParticipateFactor>1.0</mvarVControlParticipateFactor> <potiveZ unit="PU" re="0.0" im="0.04"/> <negativeZ unit="PU" re="0.0" im="0.04"/> <zeroZ unit="PU" re="0.0" im="0.04"/> <eq11MachModel> <desc>GENSAL</desc> <H>23.64</H> <D>0.0</D> <ra>0.0</ra> <xd>0.146</xd> <xq>0.0969</xq> <xd1>0.0608</xd1> <Td01 unit="Sec" value="8.96"/> <seFmt1> <se100>0.0</se100> <se120>0.0</se120> <sliner>1.0</sliner> </seFmt1> <xq11>0.04</xq11> <Tq011 unit="Sec" value="0.06"/> <xd11>0.04</xd11> <Td011 unit="Sec" value="0.04"/> </eq11MachModel> </dstabContributeGen> </genData> <loadData> <dstabEquivLoad code="NoneLoad"/> </loadData> </dstabBus> */ /* * Bus 1 * Gen GENSAL-> Eq11Machine */ DStabBusXmlType bus1 = dstabParser.getDStabBus("Bus1"); DStabGenDataXmlType defaultGen = DStabParserHelper.getDefaultGen(bus1.getGenData()); //DStabLoadDataXmlType defaultLoad = DStabParserHelper.getDefaultLoad(bus1.getLoadData()); assertTrue(bus1.getGenData().getCode()==LFGenCodeEnumType.SWING); //assertTrue(defaultLoad.getCode()==LFLoadCodeEnumType.NONE_LOAD); assertTrue(defaultGen.getDesiredVoltage().getValue()==1.04); assertTrue(defaultGen.getPotiveZ().getIm()==0.04); DStabGenDataXmlType contriGen = (DStabGenDataXmlType) bus1.getGenData().getContributeGen().get(0).getValue(); assertTrue(contriGen.getMvaBase().getValue()==100.0); assertTrue(contriGen.getMvarVControlParticipateFactor()==1.0); Eq11MachineXmlType machine = (Eq11MachineXmlType) contriGen.getMachineModel().getValue(); assertTrue(machine.getD()==0.0); assertTrue(machine.getH()==23.64); assertTrue(machine.getXl()< machine.getXd1()); assertTrue(machine.getXd()==0.146); assertTrue(machine.getXl()==0.0336); assertTrue(machine.getXd1()==0.0608); assertTrue(machine.getXd11()==0.04); assertTrue(machine.getXd11()==machine.getXq11()); assertTrue(machine.getTd011().getValue()==0.04); assertTrue(machine.getTq011().getValue()==0.06); /* * BUS3 * * Machine GENROU * * <eq11Ed11MachModel> <desc>GENROU</desc> <H>3.01</H> <D>0.0</D> <xl>0.0742</xl> <ra>0.0</ra> <xd>1.313</xd> <xq>1.258</xq> <xd1>0.1813</xd1> <Td01 unit="Sec" value="5.89"/> <seFmt1> <se100>0.0</se100> <se120>0.0</se120> <sliner>1.0</sliner> </seFmt1> <xq1>0.25</xq1> <Tq01 unit="Sec" value="0.6"/> <xd11>0.107</xd11> <Td011 unit="Sec" value="0.033"/> <xq11>0.107</xq11> <Tq011 unit="Sec" value="0.07"/> </eq11Ed11MachModel> * */ DStabBusXmlType bus3 = dstabParser.getDStabBus("Bus3"); defaultGen = DStabParserHelper.getDefaultGen(bus3.getGenData()); assertTrue(bus3.getGenData().getCode()==LFGenCodeEnumType.PV); DStabGenDataXmlType contriGen3 = (DStabGenDataXmlType) bus3.getGenData().getContributeGen().get(0).getValue(); Eq11Ed11MachineXmlType gen3Mach = (Eq11Ed11MachineXmlType) contriGen3.getMachineModel().getValue(); assertTrue(gen3Mach.getD()==0.0); assertTrue(gen3Mach.getH()==3.01); assertTrue(gen3Mach.getXl()< gen3Mach.getXd1()); assertTrue(gen3Mach.getXd()==1.313); assertTrue(gen3Mach.getXq()==1.258); assertTrue(gen3Mach.getXl()==0.0742); assertTrue(gen3Mach.getXd1()==0.1813); assertTrue(gen3Mach.getXq1()==0.25); assertTrue(gen3Mach.getXd11()==0.107); assertTrue(gen3Mach.getXd11()==gen3Mach.getXq11()); assertTrue(gen3Mach.getTd01().getValue()==5.89); assertTrue(gen3Mach.getTd011().getValue()==0.033); assertTrue(gen3Mach.getTq011().getValue()==0.07); } @Test public void ieee9_ODM_Dstab_fullModel_test() throws ODMException{ final LogManager logMgr = LogManager.getLogManager(); Logger logger = Logger.getLogger("IEEE ODM Logger"); logger.setLevel(Level.INFO); logMgr.addLogger(logger); PSSEAdapter adapter = new PSSEAdapter(PsseVersion.PSSE_30); assertTrue(adapter.parseInputFile(NetType.DStabNet, new String[]{ "testData/psse/IEEE9Bus/ieee9.raw", "testData/psse/IEEE9Bus/ieee9.seq", "testData/psse/IEEE9Bus/ieee9_dyn_fullModel.dyr" })); DStabModelParser dstabParser =(DStabModelParser) adapter.getModel(); dstabParser.stdout(); //caseContentInfo assertTrue(dstabParser.getStudyCase().getAnalysisCategory() == AnalysisCategoryEnumType.TRANSIENT_STABILITY); DStabNetXmlType dynNet = dstabParser.getDStabNet(); /* * <hasLoadflowData>true</hasLoadflowData> <positiveSeqDataOnly>false</positiveSeqDataOnly> <hasShortCircuitData>true</hasShortCircuitData> <saturatedMachineParameter>false</saturatedMachineParameter> */ assertTrue(dynNet.isHasShortCircuitData()); assertTrue(dynNet.isHasLoadflowData()); assertTrue(!dynNet.isPositiveSeqDataOnly()); /* * Bus1 * Gen: GENSAL * Exc: IEEET1, 1968 type 1 * Gov: IEEEG3, 1968 type 3 for for Hydro */ DStabBusXmlType bus1 = dstabParser.getDStabBus("Bus1"); DStabGenDataXmlType bus1Gen = (DStabGenDataXmlType) bus1.getGenData().getContributeGen().get(0).getValue(); //Exciter /* * <excIEEE1968Type1> <desc>IEEET1</desc> <TR unit="Sec" value="0.06"/> <KA>20.0</KA> <VRMAX>1.172</VRMAX> <VRMIN>-0.0</VRMIN> <KE>0.0</KE> <TE unit="Sec" value="0.314"/> <KF>0.063</KF> <TF unit="Sec" value="0.35"/> <EFDMIN>0.0</EFDMIN> <E1>3.0</E1> <SE1>0.104</SE1> <E2>4.0</E2> <SE2>0.293</SE2> <TA unit="Sec" value="0.2"/> </excIEEE1968Type1> */ ExcIEEE1968Type1XmlType bus1Exc = (ExcIEEE1968Type1XmlType) bus1Gen.getExciter().getValue(); assertTrue(bus1Exc.getTR().getValue()==0.06); assertTrue(bus1Exc.getKA()==20); assertTrue(bus1Exc.getVRMAX()==1.172); assertTrue(bus1Exc.getVRMIN()==-0.0); assertTrue(bus1Exc.getKE()==0.0); assertTrue(bus1Exc.getTE().getValue()==0.314); assertTrue(bus1Exc.getKF()==0.063); assertTrue(bus1Exc.getTF().getValue()==0.35); assertTrue(bus1Exc.getKF()==0.063); assertTrue(bus1Exc.getE1()==3.0); assertTrue(bus1Exc.getSE1()==0.104); assertTrue(bus1Exc.getE2()==4.0); assertTrue(bus1Exc.getSE2()==0.293); //Tur-Gov /* * <govIEEE1981Type3> <TG unit="Sec" value="0.04"/> <TP unit="Sec" value="1.0"/> <VOpen>18.0</VOpen> <VClose>-18.0</VClose> <PMAX>180.0</PMAX> <PMIN>0.0</PMIN> <SIGMA>0.05</SIGMA> <DELTA>0.31</DELTA> <TR unit="Sec" value="5.0"/> <TW unit="Sec" value="1.0"/> <a11>0.5</a11> <a13>1.0</a13> <a21>1.5</a21> <a23>1.0</a23> </govIEEE1981Type3> */ GovIEEE1981Type3XmlType bus1Gov = (GovIEEE1981Type3XmlType) bus1Gen.getGovernor().getValue(); assertTrue(bus1Gov.getTG().getValue()==0.04); assertTrue(bus1Gov.getTP().getValue()==1.0); assertTrue(bus1Gov.getVOpen()==18.0); assertTrue(bus1Gov.getVClose()==-18.0); assertTrue(bus1Gov.getPMAX()==180.0); assertTrue(bus1Gov.getPMIN()==0.0); assertTrue(bus1Gov.getSIGMA()==0.05); assertTrue(bus1Gov.getDELTA()==0.31); assertTrue(bus1Gov.getTR().getValue()==5.0); assertTrue(bus1Gov.getTW().getValue()==1.0); assertTrue(bus1Gov.getA11()==0.5); assertTrue(bus1Gov.getA13()==1.0); assertTrue(bus1Gov.getA21()==1.5); assertTrue(bus1Gov.getA23()==1.0); /* * Bus2 * Gen: GENSOU * Exc: IEEET1, 1968 type 1 * Gov: IEEEG1, 1968 type 1 for Thermal * */ DStabBusXmlType bus2 = dstabParser.getDStabBus("Bus2"); DStabGenDataXmlType bus2Gen = (DStabGenDataXmlType) bus2.getGenData().getContributeGen().get(0).getValue(); /* * <govIEEE1981Type1> <K>20.833</K> <T1 unit="Sec" value="0.0"/> <T2 unit="Sec" value="0.0"/> <T3 unit="Sec" value="0.1"/> <VOpen>0.2</VOpen> <VClose>-0.625</VClose> <PMAX>1.0417</PMAX> <PMIN>0.0</PMIN> <T4 unit="Sec" value="0.25"/> <K1>0.26</K1> <K2>0.0</K2> <T5 unit="Sec" value="7.5"/> <K3>0.27</K3> <K4>0.0</K4> <T6 unit="Sec" value="0.4"/> <K5>0.47</K5> <K6>0.0</K6> <T7 unit="Sec" value="0.0"/> <K7>0.0</K7> <K8>0.0</K8> </govIEEE1981Type1> */ GovIEEE1981Type1XmlType bus2Gov = (GovIEEE1981Type1XmlType) bus2Gen.getGovernor().getValue(); assertTrue(bus2Gov.getK()==20.833); assertTrue(bus2Gov.getT1().getValue()==0.0); assertTrue(bus2Gov.getT2().getValue()==0.0); assertTrue(bus2Gov.getT3().getValue()==0.1); assertTrue(bus2Gov.getVOpen()==0.2); assertTrue(bus2Gov.getVClose()==-0.625); assertTrue(bus2Gov.getPMAX()==1.0417); assertTrue(bus2Gov.getPMIN()==0.0); assertTrue(bus2Gov.getT4().getValue()==0.25); assertTrue(bus2Gov.getK1()==0.26); assertTrue(bus2Gov.getK2()==0.0); assertTrue(bus2Gov.getT5().getValue()==7.5); assertTrue(bus2Gov.getK3()==0.27); assertTrue(bus2Gov.getK4()==0.0); assertTrue(bus2Gov.getT6().getValue()==0.4); assertTrue(bus2Gov.getK5()==0.47); assertTrue(bus2Gov.getK6()==0.0); assertTrue(bus2Gov.getK7()==0.0); assertTrue(bus2Gov.getK8()==0.0); } @Test public void ieee9_ODM_Dstab_noSeqData_test() throws ODMException{ final LogManager logMgr = LogManager.getLogManager(); Logger logger = Logger.getLogger("IEEE ODM Logger"); logger.setLevel(Level.INFO); logMgr.addLogger(logger); PSSEAdapter adapter = new PSSEAdapter(PsseVersion.PSSE_30); assertTrue(adapter.parseInputFile(NetType.DStabNet, new String[]{ "testData/psse/IEEE9Bus/ieee9.raw", "testData/psse/IEEE9Bus/ieee9_dyn_fullModel.dyr" })); DStabModelParser dstabParser =(DStabModelParser) adapter.getModel(); dstabParser.stdout(); //caseContentInfo assertTrue(dstabParser.getStudyCase().getAnalysisCategory() == AnalysisCategoryEnumType.TRANSIENT_STABILITY); DStabNetXmlType dynNet = dstabParser.getDStabNet(); /* * <hasLoadflowData>true</hasLoadflowData> <positiveSeqDataOnly>false</positiveSeqDataOnly> <hasShortCircuitData>true</hasShortCircuitData> <saturatedMachineParameter>false</saturatedMachineParameter> */ assertTrue(!dynNet.isHasShortCircuitData()); assertTrue(dynNet.isHasLoadflowData()); assertTrue(dynNet.isPositiveSeqDataOnly()); /* * Bus1 * Gen: GENSAL * Exc: IEEET1, 1968 type 1 * Gov: IEEEG3, 1968 type 3 for for Hydro */ DStabBusXmlType bus1 = dstabParser.getDStabBus("Bus1"); DStabGenDataXmlType bus1Gen = (DStabGenDataXmlType) bus1.getGenData().getContributeGen().get(0).getValue(); //Exciter /* * <excIEEE1968Type1> <desc>IEEET1</desc> <TR unit="Sec" value="0.06"/> <KA>20.0</KA> <VRMAX>1.172</VRMAX> <VRMIN>-0.0</VRMIN> <KE>0.0</KE> <TE unit="Sec" value="0.314"/> <KF>0.063</KF> <TF unit="Sec" value="0.35"/> <EFDMIN>0.0</EFDMIN> <E1>3.0</E1> <SE1>0.104</SE1> <E2>4.0</E2> <SE2>0.293</SE2> <TA unit="Sec" value="0.2"/> </excIEEE1968Type1> */ ExcIEEE1968Type1XmlType bus1Exc = (ExcIEEE1968Type1XmlType) bus1Gen.getExciter().getValue(); assertTrue(bus1Exc.getTR().getValue()==0.06); assertTrue(bus1Exc.getKA()==20); assertTrue(bus1Exc.getVRMAX()==1.172); assertTrue(bus1Exc.getVRMIN()==-0.0); assertTrue(bus1Exc.getKE()==0.0); assertTrue(bus1Exc.getTE().getValue()==0.314); assertTrue(bus1Exc.getKF()==0.063); assertTrue(bus1Exc.getTF().getValue()==0.35); assertTrue(bus1Exc.getKF()==0.063); assertTrue(bus1Exc.getE1()==3.0); assertTrue(bus1Exc.getSE1()==0.104); assertTrue(bus1Exc.getE2()==4.0); assertTrue(bus1Exc.getSE2()==0.293); //Tur-Gov /* * <govIEEE1981Type3> <TG unit="Sec" value="0.04"/> <TP unit="Sec" value="1.0"/> <VOpen>18.0</VOpen> <VClose>-18.0</VClose> <PMAX>180.0</PMAX> <PMIN>0.0</PMIN> <SIGMA>0.05</SIGMA> <DELTA>0.31</DELTA> <TR unit="Sec" value="5.0"/> <TW unit="Sec" value="1.0"/> <a11>0.5</a11> <a13>1.0</a13> <a21>1.5</a21> <a23>1.0</a23> </govIEEE1981Type3> */ GovIEEE1981Type3XmlType bus1Gov = (GovIEEE1981Type3XmlType) bus1Gen.getGovernor().getValue(); assertTrue(bus1Gov.getTG().getValue()==0.04); assertTrue(bus1Gov.getTP().getValue()==1.0); assertTrue(bus1Gov.getVOpen()==18.0); assertTrue(bus1Gov.getVClose()==-18.0); assertTrue(bus1Gov.getPMAX()==180.0); assertTrue(bus1Gov.getPMIN()==0.0); assertTrue(bus1Gov.getSIGMA()==0.05); assertTrue(bus1Gov.getDELTA()==0.31); assertTrue(bus1Gov.getTR().getValue()==5.0); assertTrue(bus1Gov.getTW().getValue()==1.0); assertTrue(bus1Gov.getA11()==0.5); assertTrue(bus1Gov.getA13()==1.0); assertTrue(bus1Gov.getA21()==1.5); assertTrue(bus1Gov.getA23()==1.0); /* * Bus2 * Gen: GENSOU * Exc: IEEET1, 1968 type 1 * Gov: IEEEG1, 1968 type 1 for Thermal * */ DStabBusXmlType bus2 = dstabParser.getDStabBus("Bus2"); DStabGenDataXmlType bus2Gen = (DStabGenDataXmlType) bus2.getGenData().getContributeGen().get(0).getValue(); /* * <govIEEE1981Type1> <K>20.833</K> <T1 unit="Sec" value="0.0"/> <T2 unit="Sec" value="0.0"/> <T3 unit="Sec" value="0.1"/> <VOpen>0.2</VOpen> <VClose>-0.625</VClose> <PMAX>1.0417</PMAX> <PMIN>0.0</PMIN> <T4 unit="Sec" value="0.25"/> <K1>0.26</K1> <K2>0.0</K2> <T5 unit="Sec" value="7.5"/> <K3>0.27</K3> <K4>0.0</K4> <T6 unit="Sec" value="0.4"/> <K5>0.47</K5> <K6>0.0</K6> <T7 unit="Sec" value="0.0"/> <K7>0.0</K7> <K8>0.0</K8> </govIEEE1981Type1> */ GovIEEE1981Type1XmlType bus2Gov = (GovIEEE1981Type1XmlType) bus2Gen.getGovernor().getValue(); assertTrue(bus2Gov.getK()==20.833); assertTrue(bus2Gov.getT1().getValue()==0.0); assertTrue(bus2Gov.getT2().getValue()==0.0); assertTrue(bus2Gov.getT3().getValue()==0.1); assertTrue(bus2Gov.getVOpen()==0.2); assertTrue(bus2Gov.getVClose()==-0.625); assertTrue(bus2Gov.getPMAX()==1.0417); assertTrue(bus2Gov.getPMIN()==0.0); assertTrue(bus2Gov.getT4().getValue()==0.25); assertTrue(bus2Gov.getK1()==0.26); assertTrue(bus2Gov.getK2()==0.0); assertTrue(bus2Gov.getT5().getValue()==7.5); assertTrue(bus2Gov.getK3()==0.27); assertTrue(bus2Gov.getK4()==0.0); assertTrue(bus2Gov.getT6().getValue()==0.4); assertTrue(bus2Gov.getK5()==0.47); assertTrue(bus2Gov.getK6()==0.0); assertTrue(bus2Gov.getK7()==0.0); assertTrue(bus2Gov.getK8()==0.0); } }