/* * @(#)PSSEHeaderDataMapper.java * * Copyright (C) 2006 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 09/15/2006 * * Revision History * ================ * */ package org.ieee.odm.adapter.psse.mapper.aclf; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; import org.ieee.odm.ODMFileFormatEnum; import org.ieee.odm.adapter.psse.PSSEAdapter; import org.ieee.odm.adapter.psse.PSSEAdapter.PsseVersion; import org.ieee.odm.adapter.psse.parser.aclf.PSSEHeaderDataParser; import org.ieee.odm.common.ODMException; 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.schema.LoadflowNetXmlType; import org.ieee.odm.schema.NetworkXmlType; public class PSSEHeaderDataMapper extends BasePSSEDataMapper { public PSSEHeaderDataMapper(PsseVersion ver) { super(ver); this.dataParser = new PSSEHeaderDataParser(ver); } public void procLineString(String[] lineStrAry, BaseAclfModelParser<? extends NetworkXmlType> parser) throws ODMException { LoadflowNetXmlType baseCaseNet = (LoadflowNetXmlType) parser.getNet(); if (PSSEAdapter.getVersionNo(this.version) >= 31) { dataParser.parseFields(lineStrAry); /* // 0---------- 1----------2---------- 3----------4 "Indicator", "BaseKva", "version", "XFRRAT", "NXFRAT", // 5---------- 6----------7---------- 3----------4 "BASFRQ", "Comment1", "Comment2" */ double baseMva = dataParser.getDouble("BaseKva"); baseCaseNet.setBasePower(BaseDataSetter.createPowerMvaValue(baseMva)); BaseJaxbHelper.addNVPair(baseCaseNet, "CaseIndicator", dataParser.getString("Indicator")); String ver = dataParser.getString("version"); baseCaseNet.setDesc(lineStrAry[0]); baseCaseNet.setName("AclfNet-PSSE-V" + ver); String str = new Integer(PSSEAdapter.getVersionNo(this.version)).toString(); if (!ver.contains(str)) throw new ODMException("PSSE Adapter version and input file has different version, adapter: " + this.version + " file: " + ver); } else { String lineStr = lineStrAry[0]; StringTokenizer st = new StringTokenizer(lineStr, ","); int indicator = new Integer(st.nextToken().trim()).intValue(); // at here we have "100.00 / PSS/E-29.0 THU, JUN 20 2002 14:19" st = new StringTokenizer(st.nextToken(), "/"); double baseMva = new Double(st.nextToken().trim()).doubleValue(); baseCaseNet.setBasePower(BaseDataSetter.createPowerMvaValue(baseMva)); BaseJaxbHelper.addNVPair(baseCaseNet, "CaseIndicator", new Integer(indicator).toString()); // The 2nd line is treated as description baseCaseNet.setDesc(lineStrAry[1]); // the 3rd line is treated as the network id and network name baseCaseNet.setName(lineStrAry[2]); for (String s : lineStrAry) filterVersion(s); } } public ODMFileFormatEnum getVersion(String filename) throws ODMException { /* * Sample header lines * ========== 0 100.00 / RAW29 (REV 30) THU, JUL 31 2008 13:42 100.0 ========== ========== 0, 100.00, 30, 0, 1, 60.00 / PSS(R)E 30 RAW created by rawd30 SAT, FEB 05 2011 18:16 PSS(R)E SAMPLE CASE ALL DATA CATEGORIES WITH SEQUENCE DATA ========== ========== 0,100.0 20110729120000,CASE_D:033111-EMSDB:DB53,CASE:012411-EMSDB:DB52, 10 VER 26 PARAMETERS INITIALIZED ON 22-Jun-2011 16:45:56 PDT ========== */ final File file = new File(filename); try (BufferedReader din = new BufferedReader(new InputStreamReader(new FileInputStream(file)))) { String lineStr = null; int lineNo = 0; do { lineStr = din.readLine(); if (lineStr.contains("VER 26")) return ODMFileFormatEnum.PsseV26; else if (lineStr.contains("RAW29")) return ODMFileFormatEnum.PsseV30; lineNo++; } while (lineNo < 3); } catch (IOException e) { throw new ODMException(e.toString()); } return ODMFileFormatEnum.PsseV30; } private void filterVersion(String lineStr) { if (lineStr.contains("VER 26")) this.version = PsseVersion.PSSE_26; else if (lineStr.contains("RAW29")) this.version = PsseVersion.PSSE_29; } }