Power System Platform  2026w11a-beta
Loading...
Searching...
No Matches
ParseMatpower Class Reference

Classes

struct  BranchData
 
struct  BusData
 
struct  GenData
 

Public Member Functions

 ParseMatpower (wxFileName mFile)
 
void ClearData ()
 
bool Parse ()
 
std::vector< BranchData * > GetBranchData () const
 
std::vector< BusData * > GetBusData () const
 
std::vector< GenData * > GetGenData () const
 
double GetMVAPowerBase () const
 
BusDataGetBusDataFromID (int id)
 
BusGetBusFromID (int id, std::vector< Bus * > busList)
 

Protected Member Functions

wxStringTokenizer GetMFileTokenData (wxTextFile &mFile, wxString currentLine)
 

Protected Attributes

wxFileName m_mFile
 
std::vector< BusData * > m_busData
 
std::vector< BranchData * > m_branchData
 
std::vector< GenData * > m_genData
 
wxString m_projectName = _("Imported project")
 
double m_mvaBase = 100.0
 

Detailed Description

Definition at line 216 of file ImportForm.h.

Constructor & Destructor Documentation

◆ ParseMatpower()

ParseMatpower::ParseMatpower ( wxFileName  mFile)

Definition at line 1378 of file ImportForm.cpp.

1378{ m_mFile = mFile; }

◆ ~ParseMatpower()

ParseMatpower::~ParseMatpower ( )
inline

Definition at line 253 of file ImportForm.h.

253{ ClearData(); }

Member Function Documentation

◆ ClearData()

void ParseMatpower::ClearData ( )

Definition at line 1380 of file ImportForm.cpp.

1381{
1382 // Clear data to avoid memory leak
1383 for(auto it = m_branchData.begin(), itEnd = m_branchData.end(); it != itEnd; ++it) {
1384 if(*it) delete *it;
1385 }
1386 m_branchData.clear();
1387 for(auto it = m_branchData.begin(), itEnd = m_branchData.end(); it != itEnd; ++it) {
1388 if(*it) delete *it;
1389 }
1390 m_branchData.clear();
1391 for(auto it = m_genData.begin(), itEnd = m_genData.end(); it != itEnd; ++it) {
1392 if(*it) delete *it;
1393 }
1394 m_genData.clear();
1395}

◆ GetBranchData()

std::vector< BranchData * > ParseMatpower::GetBranchData ( ) const
inline

Definition at line 259 of file ImportForm.h.

259{ return m_branchData; }

◆ GetBusData()

std::vector< BusData * > ParseMatpower::GetBusData ( ) const
inline

Definition at line 260 of file ImportForm.h.

260{ return m_busData; }

◆ GetBusDataFromID()

ParseMatpower::BusData * ParseMatpower::GetBusDataFromID ( int  id)

Definition at line 1529 of file ImportForm.cpp.

1530{
1531 for(auto it = m_busData.begin(), itEnd = m_busData.end(); it != itEnd; ++it) {
1532 if((*it)->id == id) return *it;
1533 }
1534 return nullptr;
1535}

◆ GetGenData()

std::vector< GenData * > ParseMatpower::GetGenData ( ) const
inline

Definition at line 261 of file ImportForm.h.

261{ return m_genData; }

◆ GetMFileTokenData()

wxStringTokenizer ParseMatpower::GetMFileTokenData ( wxTextFile &  mFile,
wxString  currentLine 
)
protected

Definition at line 1514 of file ImportForm.cpp.

1515{
1516 wxString dataStr = "";
1517 while(currentLine.Find(']', true) == wxNOT_FOUND) { // Concatenate all lines until find ']'
1518 dataStr += currentLine;
1519 if(currentLine.Find("mpc") == wxNOT_FOUND && currentLine.Find(';') == wxNOT_FOUND) dataStr += ';';
1520 currentLine = mFile.GetNextLine();
1521 }
1522 dataStr += currentLine + ";";
1523 if(currentLine.Find(';') == wxNOT_FOUND) dataStr += ';';
1524 dataStr = dataStr.AfterFirst('[').BeforeFirst(']'); // Get only the element data
1525 wxStringTokenizer dataStrTok(dataStr, ';'); // Tokenize using ';' char (one element data)
1526 return dataStrTok;
1527}

◆ GetMVAPowerBase()

double ParseMatpower::GetMVAPowerBase ( ) const
inline

Definition at line 262 of file ImportForm.h.

262{ return m_mvaBase; }

◆ Parse()

bool ParseMatpower::Parse ( )

Definition at line 1397 of file ImportForm.cpp.

1398{
1399 wxTextFile mFile(m_mFile.GetFullPath());
1400 if(!mFile.Open()) return false;
1401
1402 // Parse M file
1403 wxString fileTxt = "";
1404 for(wxString line = mFile.GetFirstLine(); !mFile.Eof(); line = mFile.GetNextLine()) {
1405 // Current line
1406 if(line.Trim()[0] != '%') { // Check if the line is commented (with %)
1407 // Parse data:
1408 if(line.Find("mpc.baseMVA") != wxNOT_FOUND) { // Found baseMVA
1409 if(!line.AfterFirst('=').BeforeFirst(';').ToCDouble(&m_mvaBase)) return false; // No Trim() needed?
1410 }
1411 if(line.Find("mpc.bus ") != wxNOT_FOUND) { // Found bus
1412 wxStringTokenizer busStrTok = GetMFileTokenData(mFile, line);
1413 while(busStrTok.HasMoreTokens()) {
1414 BusData* busData = new BusData();
1415 wxString busDataStr = busStrTok.GetNextToken();
1416 char tokenChar = '\t';
1417 if(busDataStr.Find('\t') == wxNOT_FOUND) { tokenChar = ' '; }
1418 // Tokenize using tabulation or space (each branch data)
1419 wxStringTokenizer busDataStrTok(busDataStr, tokenChar);
1420
1421 busData->id = wxAtoi(busDataStrTok.GetNextToken()); // Bus number
1422 busData->type = wxAtoi(busDataStrTok.GetNextToken()); // Bus type
1423 if(!busDataStrTok.GetNextToken().ToCDouble(&busData->pd)) return false; // Real power demand
1424 if(!busDataStrTok.GetNextToken().ToCDouble(&busData->qd)) return false; // Reactive power demand
1425 if(!busDataStrTok.GetNextToken().ToCDouble(&busData->gs)) return false; // Shunt condutance
1426 if(!busDataStrTok.GetNextToken().ToCDouble(&busData->bs)) return false; // Shunt susceptance
1427 busData->area = wxAtoi(busDataStrTok.GetNextToken()); // Bus area
1428 if(!busDataStrTok.GetNextToken().ToCDouble(&busData->voltage)) return false; // Bus abs voltage
1429 if(!busDataStrTok.GetNextToken().ToCDouble(&busData->angle)) return false; // Angle of voltage
1430 if(!busDataStrTok.GetNextToken().ToCDouble(&busData->baseVoltage)) return false; // Base Voltage
1431
1432 m_busData.push_back(busData); // Save new bus data at vector
1433 }
1434 }
1435 if(line.Find("mpc.gen ") != wxNOT_FOUND) { // Found generator
1436 wxStringTokenizer genStrTok = GetMFileTokenData(mFile, line);
1437 while(genStrTok.HasMoreTokens()) {
1438 GenData* genData = new GenData();
1439 wxString genDataStr = genStrTok.GetNextToken();
1440 char tokenChar = '\t';
1441 if(genDataStr.Find('\t') == wxNOT_FOUND) { tokenChar = ' '; }
1442 // Tokenize using tabulation or space (each branch data)
1443 wxStringTokenizer genDataStrTok(genDataStr, tokenChar);
1444 genData->busID = wxAtoi(genDataStrTok.GetNextToken()); // Bus number
1445 if(!genDataStrTok.GetNextToken().ToCDouble(&genData->pg)) return false; // Real power output
1446 if(!genDataStrTok.GetNextToken().ToCDouble(&genData->qg)) return false; // Reative power output
1447 if(!genDataStrTok.GetNextToken().ToCDouble(&genData->maxReactivePower))
1448 return false; // Maximum reactive power (MVAr)
1449 if(!genDataStrTok.GetNextToken().ToCDouble(&genData->minReactivePower))
1450 return false; // Minumum reactive power (MVAr)
1451 genDataStrTok.GetNextToken(); // Voltage magnitude setpoint (p.u.), skip
1452 if(!genDataStrTok.GetNextToken().ToCDouble(&genData->baseMVA)) return false; // Power base (MVA)
1453 double machineStatus = 0;
1454 if(!genDataStrTok.GetNextToken().ToCDouble(&machineStatus))
1455 return false; // Machine status (> 0 = machine in-service; <= 0 = machine out-of-service)
1456 genData->isOnline = machineStatus > 1e-3 ? true : false;
1457
1458 m_genData.push_back(genData);
1459 }
1460 }
1461 if(line.Find("mpc.branch") != wxNOT_FOUND) { // Found branch
1462 wxStringTokenizer branchStrTok = GetMFileTokenData(mFile, line);
1463 while(branchStrTok.HasMoreTokens()) {
1464 BranchData* branchData = new BranchData();
1465 wxString branchDataStr = branchStrTok.GetNextToken();
1466 char tokenChar = '\t';
1467 if(branchDataStr.Find('\t') == wxNOT_FOUND) { tokenChar = ' '; }
1468 // Tokenize using tabulation or space (each branch data)
1469 wxStringTokenizer branchDataStrTok(branchDataStr, tokenChar);
1470
1471 int fromBus = wxAtoi(branchDataStrTok.GetNextToken()); // From bus number
1472 int toBus = wxAtoi(branchDataStrTok.GetNextToken()); // To bus number
1473 branchData->busConnections = std::make_pair(fromBus, toBus);
1474 if(!branchDataStrTok.GetNextToken().ToCDouble(&branchData->resistance)) return false; // Resistance
1475 if(!branchDataStrTok.GetNextToken().ToCDouble(&branchData->indReactance))
1476 return false; // Reactance
1477 if(!branchDataStrTok.GetNextToken().ToCDouble(&branchData->capSusceptance))
1478 return false; // Line charging susceptance
1479 branchDataStrTok.GetNextToken(); // MVA rating A, skip
1480 branchDataStrTok.GetNextToken(); // MVA rating B, skip
1481 branchDataStrTok.GetNextToken(); // MVA rating C, skip
1482 if(!branchDataStrTok.GetNextToken().ToCDouble(&branchData->tap)) return false; // TAP
1483 if(!branchDataStrTok.GetNextToken().ToCDouble(&branchData->phaseShift))
1484 return false; // Transformer phase-shift angle
1485 double branchStatus = 0;
1486 if(!branchDataStrTok.GetNextToken().ToCDouble(&branchStatus))
1487 return false; // Branch status (> 0 = machine in-service; <= 0 = machine out-of-service)
1488 branchData->isOnline = branchStatus > 1e-3 ? true : false;
1489
1490 m_branchData.push_back(branchData);
1491 }
1492 }
1493 if(line.Find("mpc.bus_name") != wxNOT_FOUND) { // Found buses names
1494 wxString dataStr = "";
1495 while(line.Find('}', true) == wxNOT_FOUND) { // Concatenate all lines until find ']'
1496 dataStr += line;
1497 line = mFile.GetNextLine();
1498 }
1499 dataStr += line;
1500 dataStr = dataStr.AfterFirst('{').BeforeFirst('}'); // Get only the element data
1501 wxStringTokenizer dataStrTok(dataStr, ";"); // Tokenize using ';' char (one element data)
1502 for(auto it = m_busData.begin(), itEnd = m_busData.end(); it != itEnd; ++it) {
1503 if(dataStrTok.HasMoreTokens())
1504 (*it)->busName = dataStrTok.GetNextToken().AfterFirst('\'').BeforeFirst('\'');
1505 }
1506 }
1507 }
1508 }
1509 // Last line
1510
1511 return true;
1512}

Member Data Documentation

◆ m_branchData

std::vector<BranchData*> ParseMatpower::m_branchData
protected

Definition at line 272 of file ImportForm.h.

◆ m_busData

std::vector<BusData*> ParseMatpower::m_busData
protected

Definition at line 271 of file ImportForm.h.

◆ m_genData

std::vector<GenData*> ParseMatpower::m_genData
protected

Definition at line 273 of file ImportForm.h.

◆ m_mFile

wxFileName ParseMatpower::m_mFile
protected

Definition at line 269 of file ImportForm.h.

◆ m_mvaBase

double ParseMatpower::m_mvaBase = 100.0
protected

Definition at line 276 of file ImportForm.h.

◆ m_projectName

wxString ParseMatpower::m_projectName = _("Imported project")
protected

Definition at line 275 of file ImportForm.h.


The documentation for this class was generated from the following files: