Power System Platform  2026w10a-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 1377 of file ImportForm.cpp.

1377{ 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 1379 of file ImportForm.cpp.

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

◆ 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 1528 of file ImportForm.cpp.

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

◆ 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 1513 of file ImportForm.cpp.

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

◆ 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 1396 of file ImportForm.cpp.

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

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: