32 const std::string& jobName,
33 const std::string& inputFile,
34 const std::string& solverName,
35 const std::string& formatName,
38 const std::vector<std::pair<int, double>>& iterationHistory,
46 std::string datFile = jobName +
".dat";
47 std::ofstream out(datFile);
48 if (!out.is_open())
return false;
50 int nBus = busData.
V.size();
51 int nBranch = branchData.
From.size();
55 out << fmt::format(
"\n deltaFlow v{:<32s}Date {:>14s} Time {:>8s}\n",
59 out << fmt::format(
" Input File : {}\n", inputFile);
60 out << fmt::format(
" Input Format : {}\n", formatName);
64 out << fmt::format(
" Number of Buses : {:>6d}\n", nBus);
65 out << fmt::format(
" Slack Buses : {:>6d}\n", counts.nSlack);
66 out << fmt::format(
" PV Buses : {:>6d}\n", counts.nPV);
67 out << fmt::format(
" PQ Buses : {:>6d}\n", counts.nPQ);
68 out << fmt::format(
" Number of Branches : {:>6d}\n", nBranch);
69 out << fmt::format(
" Base MVA : {:>10.1f}\n", basemva);
71 std::string solverBanner;
72 for (
const char &c : solverName) {
73 solverBanner += std::toupper(c);
77 out << fmt::format(
" Method : {}\n", solverName);
78 out << fmt::format(
" Max Iterations : {:>6d}\n",
static_cast<int>(iterationHistory.size()) > 0 ?
79 static_cast<int>(iterationHistory.back().first) : totalIterations);
80 out << fmt::format(
" Convergence Tol. : {:.6e}\n", tolerance);
83 out << fmt::format(
" {:>6s} {:>16s} {:>12s} {:>8s}\n",
84 "Iter",
"Max Mismatch",
"Tolerance",
"Status");
85 out <<
" " << std::string(W - 4,
'-') <<
"\n";
87 for (
const auto& [iter, error] : iterationHistory) {
89 if (error < tolerance)
93 out << fmt::format(
" {:>6d} {:>16.6e} {:>12.6e} {:>8s}\n",
94 iter, error, tolerance, status);
97 out <<
" " << std::string(W - 4,
'-') <<
"\n";
101 out << fmt::format(
" {} CONVERGED after {} iterations.\n", solverName, totalIterations);
102 out << fmt::format(
" Final max mismatch = {:.6e}\n", finalError);
104 out << fmt::format(
" *** WARNING: {} DID NOT CONVERGE after {} iterations.\n", solverName, totalIterations);
105 out << fmt::format(
" Final max mismatch = {:.6e}\n", finalError);
109 out << fmt::format(
" {:>4s} {:>9s} {:>9s} {:>10s} {:>10s} {:>10s} {:>10s} {:>10s}\n",
110 "Bus",
"Voltage",
"Angle",
"Load",
"Load",
"Gen",
"Gen",
"Injected");
111 out << fmt::format(
" {:>4s} {:>9s} {:>9s} {:>10s} {:>10s} {:>10s} {:>10s} {:>10s}\n",
112 "No.",
"Mag.",
"Degree",
"MW",
"Mvar",
"MW",
"Mvar",
"Mvar");
113 out <<
" " << std::string(W - 4,
'=') <<
"\n";
115 for (
int i = 0; i < nBus; ++i) {
116 double injectedMvar = busData.
Qg(i) - busData.
Ql(i);
117 out << fmt::format(
" {:>4d} {:>9.4f} {:>9.4f} {:>10.4f} {:>10.4f} {:>10.4f} {:>10.4f} {:>10.4f}\n",
118 i + 1, busData.
V(i), busData.
delta(i),
119 busData.
Pl(i), busData.
Ql(i), busData.
Pg(i), busData.
Qg(i), injectedMvar);
122 out <<
" " << std::string(W - 4,
'=') <<
"\n";
126 out << fmt::format(
" Total{:>27.4f} {:>10.4f} {:>10.4f} {:>10.4f} {:>10.4f}\n",
127 totals.totalPl, totals.totalQl, totals.totalPg, totals.totalQg, totals.totalInjected);
130 out <<
" JOB TIME SUMMARY\n";
131 out << fmt::format(
" TOTAL CPU TIME (SEC) = {:>12.5f}\n", elapsedSec);
132 out << fmt::format(
" WALLCLOCK TIME (SEC) = {:>12d}\n",
static_cast<int>(std::round(elapsedSec)));
137 out <<
Display::center(
"THE ANALYSIS HAS BEEN COMPLETED SUCCESSFULLY") <<
"\n";
139 out <<
Display::center(
"*** THE ANALYSIS HAS NOT CONVERGED ***") <<
"\n";
Writer for the detailed data output file (.dat).
Display and formatting utilities for terminal and file output.
Shared helpers (hostname/timestamp, bus-type counting, loss calc) used by the OutputFile writer class...
bool write(const std::string &jobName, const std::string &inputFile, const std::string &solverName, const std::string &formatName, const BusData &busData, const BranchData &branchData, const std::vector< std::pair< int, double > > &iterationHistory, int totalIterations, double finalError, double tolerance, bool converged, double elapsedSec, double basemva=100.0) const
Writes the detailed data file (.dat) with full input/output records.
std::string center(const std::string &text)
Returns a centered string within the page width.
constexpr int pageWidth
Standard output page width.
std::string sectionHeader(const std::string &title)
Returns a section header for output files.
std::string fileBanner()
Returns a full plain-text banner for output/log files.
std::string dateStr()
Returns the current date string.
BusTotals computeBusTotals(const BusData &busData)
Computes total load/gen/injected Mvar across all buses.
std::string timeStr()
Returns the current time string.
BusTypeCounts countBusTypes(const BusData &busData)
Counts buses by type (1=Slack, 2=PV, else PQ).
Contains all relevant data for each transmission line or transformer branch.
Eigen::VectorXi From
From 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 V
Voltage magnitude [p.u.].
Eigen::VectorXd Pg
Active power generation [MW or p.u.].
Eigen::VectorXd delta
Voltage angle [rad or deg].
Eigen::VectorXd Pl
Active power load [MW or p.u.].
Eigen::VectorXd Qg
Reactive power generation [MVAr or p.u.].