37 int nbus = busData.
V.size();
41 fmt::print(fg(
Display::LOGO_COLOR),
" {:>4s} {:>9s} {:>9s} {:>10s} {:>10s} {:>10s} {:>10s} {:>10s}\n",
42 "Bus",
"Voltage",
"Angle",
"Load",
"Load",
"Gen",
"Gen",
"Injected");
43 fmt::print(fg(
Display::LOGO_COLOR),
" {:>4s} {:>9s} {:>9s} {:>10s} {:>10s} {:>10s} {:>10s} {:>10s}\n",
44 "No.",
"Mag.",
"Degree",
"MW",
"Mvar",
"MW",
"Mvar",
"Mvar");
45 fmt::print(
" {}\n", std::string(76,
'='));
47 for (
int i = 0; i < nbus; ++i) {
48 double injectedMvar = busData.
Qg(i) - busData.
Ql(i);
50 fmt::print(
" {:>4d} {:>9.4f} {:>9.4f} {:>10.4f} {:>10.4f} {:>10.4f} {:>10.4f} {:>10.4f}\n",
61 double totalPl = busData.
Pl.sum();
62 double totalQl = busData.
Ql.sum();
63 double totalPg = busData.
Pg.sum();
64 double totalQg = busData.
Qg.sum();
65 double totalInjected = totalQg - totalQl;
67 fmt::print(
" {}\n", std::string(76,
'='));
68 fmt::print(
" Total{:>27.4f} {:>10.4f} {:>10.4f} {:>10.4f} {:>10.4f}\n",
69 totalPl, totalQl, totalPg, totalQg, totalInjected);
73 LOG_INFO(
"Bus Data Summary: {} buses", nbus);
79 const Eigen::MatrixXcd& Y,
82 auto Bc = branchData.
B;
83 int nBus =
static_cast<int>(busData.
V.size());
84 int nLine =
static_cast<int>(branchData.
From.size());
86 Eigen::VectorXcd V(nBus);
87 Eigen::VectorXcd S(nBus);
89 for (
int i = 0; i < V.size(); ++i) {
90 double mag = busData.
V(i);
91 double ang_rad = busData.
delta(i) * M_PI / 180.0;
92 V(i) = std::polar(mag, ang_rad);
94 double P = busData.
Pg(i) - busData.
Pl(i);
95 double Q = busData.
Qg(i) - busData.
Ql(i);
96 S(i) = std::complex<double>(P, Q);
99 std::complex<double> SLT = 0.0;
103 fmt::print(fg(
Display::LOGO_COLOR),
" {:>4s} {:>4s} {:>9s} {:>9s} {:>9s} {:>9s} {:>9s} {:>9s}\n",
104 "From",
"To",
"MW",
"Mvar",
"MVA",
"Loss MW",
"Loss Mvar",
"Tap");
105 fmt::print(
" {}\n", std::string(76,
'='));
107 for (
int n = 1; n <= nBus; ++n) {
111 for (
int L = 0; L < nLine; ++L) {
113 double P_inj = busData.
Pg(n_idx) - busData.
Pl(n_idx);
114 double Q_inj = busData.
Qg(n_idx) - busData.
Ql(n_idx);
115 double S_mag = std::abs(S(n_idx)) * basemva;
117 fmt::print(
" {:>4d} {:>9.3f} {:>9.3f} {:>9.3f}\n", n, P_inj, Q_inj, S_mag);
121 if (branchData.
From(L) == n) {
122 int k = branchData.
To(L);
126 std::complex<double> In = (V(n_idx) - aL * V(k_idx)) * Y(L) / (aL * aL) + Bc(L) / (aL * aL) * V(n_idx);
127 std::complex<double> Ik = (V(k_idx) - V(n_idx) / aL) * Y(L) + Bc(L) * V(k_idx);
129 std::complex<double> Snk = V(n_idx) * std::conj(In) * basemva;
130 std::complex<double> Skn = V(k_idx) * std::conj(Ik) * basemva;
131 std::complex<double> SL = Snk + Skn;
136 fmt::print(
" {:>4d} {:>9.3f} {:>9.3f} {:>9.3f} {:>9.3f} {:>9.3f} {:>9.3f}\n",
145 fmt::print(
" {:>4d} {:>9.3f} {:>9.3f} {:>9.3f} {:>9.3f} {:>9.3f}\n",
154 }
else if (branchData.
To(L) == n) {
155 int k = branchData.
From(L);
159 std::complex<double> In = (V(n_idx) - V(k_idx) / aL) * Y(L) + Bc(L) * V(n_idx);
160 std::complex<double> Ik = (V(k_idx) - aL * V(n_idx)) * Y(L) / (aL * aL) + Bc(L) / (aL * aL) * V(k_idx);
162 std::complex<double> Snk = V(n_idx) * std::conj(In) * basemva;
163 std::complex<double> Skn = V(k_idx) * std::conj(Ik) * basemva;
164 std::complex<double> SL = Snk + Skn;
168 fmt::print(
" {:>4d} {:>9.3f} {:>9.3f} {:>9.3f} {:>9.3f} {:>9.3f}\n",
182 fmt::print(fg(fmt::color::yellow) | fmt::emphasis::bold,
183 " Total loss {:>9.3f} {:>9.3f}\n",
184 std::real(SLT), std::imag(SLT));
188 LOG_INFO(
"Line Flow computed: Total loss P={:.3f} MW, Q={:.3f} Mvar",
189 std::real(SLT), std::imag(SLT));
193 std::ofstream out(
"deltaFlow.csv");
194 if (!out.is_open())
return false;
196 out <<
"BusID,Name,Type,Voltage,Angle,Pg,Qg,Pl,Ql,Qgmax,Qgmin,Gs,Bs\n";
197 for (
int i = 0; i < busData.
ID.size(); ++i) {
198 out << busData.
ID[i] <<
","
199 << busData.
Name[i] <<
","
200 << busData.
Type[i] <<
","
201 << std::fixed << std::setprecision(64)
202 << busData.
V[i] <<
","
203 << busData.
delta[i] <<
","
204 << busData.
Pg[i] <<
","
205 << busData.
Qg[i] <<
","
206 << busData.
Pl[i] <<
","
207 << busData.
Ql[i] <<
","
208 << busData.
Qgmax[i] <<
","
209 << busData.
Qgmin[i] <<
","
210 << busData.
Gs[i] <<
","
211 << busData.
Bs[i] <<
"\n";
Data structures and utility functions for reading and displaying bus and branch data in power system ...
Display and formatting utilities for terminal and file output.
Logger utilities for deltaFlow, providing logging macros and a singleton Logger class.
#define LOG_INFO(msg,...)
Macro for logging an info-level message.
void dispBusData(const BusData &busData)
Displays bus data in a human-readable format.
void dispLineFlow(const BusData &busData, const BranchData &branchData, const Eigen::MatrixXcd &Y, double basemva)
Displays the line flow results, including power flow and losses.
bool writeOutputCSV(const BusData &busData)
Writes bus data results to a CSV file.
Output utilities for writing power system analysis results to CSV files.
constexpr fmt::rgb LOGO_COLOR
deltaFlow logo color
void printSectionHeader(const std::string &title)
Prints a colored section header to terminal.
Contains all relevant data for each transmission line or transformer branch.
Eigen::VectorXd tapRatio
Transformer tap ratio ($$ a $$)
Eigen::VectorXd B
Line susceptance ($$ B $$) [p.u.].
Eigen::VectorXi From
From bus indices.
Eigen::VectorXi To
To bus indices.
Contains all relevant data for each bus in the power system.
Eigen::VectorXd Ql
Reactive power load [MVAr or p.u.].
Eigen::VectorXd Qgmax
Max reactive power generation [MVAr or p.u.].
Eigen::VectorXi ID
Bus numbers.
Eigen::VectorXd V
Voltage magnitude [p.u.].
Eigen::VectorXd Pg
Active power generation [MW or p.u.].
std::vector< std::string > Name
Bus names.
Eigen::VectorXd Qgmin
Min reactive power generation [MVAr or p.u.].
Eigen::VectorXd Gs
Shunt conductance ($$ G_{sh} $$) [p.u.].
Eigen::VectorXd delta
Voltage angle [rad or deg].
Eigen::VectorXd Bs
Shunt susceptance ($$ B_{sh} $$) [p.u.].
Eigen::VectorXd Pl
Active power load [MW or p.u.].
Eigen::VectorXd Qg
Reactive power generation [MVAr or p.u.].
Eigen::VectorXi Type
Bus type (1=Slack, 2=PV, 3=PQ)