35 const Eigen::VectorXd& V,
36 const Eigen::VectorXd& delta,
37 Eigen::VectorXi& type_bus,
38 const Eigen::MatrixXd& G,
39 const Eigen::MatrixXd& B,
41 const std::vector<int>& pv_bus_id,
45 Eigen::VectorXd Qmax = busData.
Qgmax;
46 Eigen::VectorXd Qmin = busData.
Qgmin;
48 for (
int i = 0; i < n_bus; ++i) {
49 if (Qmax(i) == 0.0) Qmax(i) = std::numeric_limits<double>::infinity();
50 if (Qmin(i) == 0.0) Qmin(i) = -std::numeric_limits<double>::infinity();
54 Eigen::VectorXd Q = Eigen::VectorXd::Zero(n_bus);
55 for (
int i = 0; i < n_bus; ++i) {
56 for (
int j = 0; j < n_bus; ++j) {
57 double dij = delta(i) - delta(j);
58 Q(i) += V(i) * V(j) * (G(i, j) * std::sin(dij) - B(i, j) * std::cos(dij));
63 Eigen::VectorXd Qg = Q + busData.
Ql;
66 bool qlim_hit =
false;
68 for (
int idx : pv_bus_id) {
69 if (Qg(idx) > Qmax(idx)) {
71 busData.
Qg(idx) = Qmax(idx);
73 LOG_DEBUG(
"Q-limit (max) hit at bus {} : Qg = {:.4f} > Qmax = {:.4f}", idx + 1, Qg(idx), Qmax(idx));
74 }
else if (Qg(idx) < Qmin(idx)) {
76 busData.
Qg(idx) = Qmin(idx);
78 LOG_DEBUG(
"Q-limit (min) hit at bus {} : Qg = {:.4f} < Qmin = {:.4f}", idx + 1, Qg(idx), Qmin(idx));
83 LOG_DEBUG(
"Power flow converged without hitting Q-limits.");
bool checkQlimits(const Eigen::VectorXd &V, const Eigen::VectorXd &delta, Eigen::VectorXi &type_bus, const Eigen::MatrixXd &G, const Eigen::MatrixXd &B, BusData &busData, const std::vector< int > &pv_bus_id, int n_bus)
Checks reactive power limits on PV buses after solver convergence.