Skip to content

Commit c5c85bb

Browse files
committed
now it compiles, need to check tests, and implement logic solver side [skip ci]
1 parent eba1aab commit c5c85bb

File tree

9 files changed

+72
-42
lines changed

9 files changed

+72
-42
lines changed

src/BaseSolver.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
#include "BaseSolver.h"
1010
#include "GridModel.h" // needs to be included here because of the forward declaration
1111

12-
void BaseSolver::reset(const SolverControl & solver_control){
12+
13+
void BaseSolver::reset(){
1314
// reset timers
1415
reset_timer();
1516

@@ -20,8 +21,11 @@ void BaseSolver::reset(const SolverControl & solver_control){
2021
V_ = RealVect(); // voltage angle // TODO solver control: see if I could reuse some of these
2122
nr_iter_ = 0; // number of iteration performs by the algorithm
2223
err_ = ErrorType::NotInitError; //error message:
24+
25+
_solver_control = SolverControl();
2326
}
2427

28+
2529
RealVect BaseSolver::_evaluate_Fx(const Eigen::SparseMatrix<cplx_type> & Ybus,
2630
const CplxVect & V,
2731
const CplxVect & Sbus,

src/BaseSolver.h

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,10 @@ class BaseSolver : public BaseConstants
9898
real_type tol
9999
) = 0 ;
100100

101-
<<<<<<< HEAD
102-
virtual
103-
void reset(const SolverControl & solver_control);
104-
=======
101+
void tell_solver_control(const SolverControl & solver_control){
102+
_solver_control = solver_control;
103+
}
104+
virtual void reset();
105105
virtual RealMat get_ptdf(const Eigen::SparseMatrix<cplx_type> & dcYbus){
106106
throw std::runtime_error("Impossible to get the PTDF matrix with this solver type.");
107107
}
@@ -111,9 +111,6 @@ class BaseSolver : public BaseConstants
111111
virtual Eigen::SparseMatrix<real_type> get_bsdf(){ // TODO interface is likely to change
112112
throw std::runtime_error("Impossible to get the BSDF matrix with this solver type.");
113113
}
114-
115-
virtual void reset();
116-
>>>>>>> bd-dev
117114

118115
protected:
119116
virtual void reset_timer(){
@@ -232,7 +229,8 @@ class BaseSolver : public BaseConstants
232229
double timer_total_nr_;
233230

234231
const GridModel * _gridmodel; // does not have ownership so that's fine (pointer to the base gridmodel, can be used for some powerflow)
235-
232+
SolverControl _solver_control;
233+
236234
private:
237235
// no copy allowed
238236
BaseSolver( const BaseSolver & ) ;

src/ChooseSolver.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,12 @@ class ChooseSolver
173173
#endif
174174

175175
// now switch the union (see https://en.cppreference.com/w/cpp/language/union)
176+
// reset the old solver
176177
reset();
177-
178178
// and assign the right solver
179179
_solver_type = type;
180+
// and now reset the new one
181+
reset();
180182
}
181183

182184
void reset()
@@ -275,6 +277,11 @@ class ChooseSolver
275277
return res;
276278
}
277279

280+
void tell_solver_control(const SolverControl & solver_control){
281+
auto p_solver = get_prt_solver("get_ptdf", true);
282+
p_solver -> tell_solver_control(solver_control);
283+
}
284+
278285
/** apparently i cannot pass a const ref for a sparse matrix in python**/
279286
Eigen::SparseMatrix<real_type> get_J_python() const{
280287
Eigen::SparseMatrix<real_type> res = get_J();

src/DataGen.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -438,16 +438,16 @@ void DataGen::update_slack_weights(Eigen::Ref<Eigen::Array<bool, Eigen::Dynamic,
438438
if(p_mw_(gen_id) > 0.){
439439
// gen is properly connected
440440
if(!gen_slackbus_[gen_id]) solver_control.tell_slack_participate_changed(); // it was not in the slack before, so I need to reset the solver
441-
add_slackbus(gen_id, p_mw_(gen_id));
441+
add_slackbus(gen_id, p_mw_(gen_id), solver_control);
442442

443443
}else{
444444
// gen is now "turned off"
445445
if(gen_slackbus_[gen_id]) solver_control.tell_slack_participate_changed(); // it was in the slack before, so I need to reset the solver
446-
remove_slackbus(gen_id);
446+
remove_slackbus(gen_id, solver_control);
447447
}
448448
}else{
449449
if(gen_slackbus_[gen_id]) solver_control.tell_slack_participate_changed(); // it was in the slack before, I need to reset the solver
450-
remove_slackbus(gen_id);
450+
remove_slackbus(gen_id, solver_control);
451451
}
452452
}
453453
}

src/DataGen.h

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -174,25 +174,29 @@ class DataGen: public DataGeneric
174174
we suppose that the data are correct (ie gen_id in the proper range, and weight > 0.)
175175
This is checked in GridModel, and not at this stage
176176
**/
177-
void add_slackbus(int gen_id, real_type weight){
178-
gen_slackbus_[gen_id] = true;
179-
gen_slack_weight_[gen_id] = weight;
177+
void add_slackbus(int gen_id, real_type weight, SolverControl & solver_control){
180178
// TODO DEBUG MODE
181179
if(weight <= 0.) throw std::runtime_error("DataGen::add_slackbus Cannot assign a negative weight to the slack bus.");
180+
if(!gen_slackbus_[gen_id]) solver_control.tell_slack_participate_changed();
181+
gen_slackbus_[gen_id] = true;
182+
if(gen_slack_weight_[gen_id] != weight) solver_control.tell_slack_weight_changed();
183+
gen_slack_weight_[gen_id] = weight;
182184
}
183-
void remove_slackbus(int gen_id){
185+
void remove_slackbus(int gen_id, SolverControl & solver_control){
186+
if(!gen_slackbus_[gen_id]) solver_control.tell_slack_participate_changed();
184187
gen_slackbus_[gen_id] = false;
185188
gen_slack_weight_[gen_id] = 0.;
186189
}
187190
void remove_all_slackbus(){
188191
const int nb_gen = nb();
192+
SolverControl unused_solver_control;
189193
for(int gen_id = 0; gen_id < nb_gen; ++gen_id)
190194
{
191-
remove_slackbus(gen_id);
195+
remove_slackbus(gen_id, unused_solver_control);
192196
}
193197
}
194198
// returns only the gen_id with the highest p that is connected to this bus !
195-
int assign_slack_bus(int slack_bus_id, const std::vector<real_type> & gen_p_per_bus){
199+
int assign_slack_bus(int slack_bus_id, const std::vector<real_type> & gen_p_per_bus, SolverControl & solver_control){
196200
const int nb_gen = nb();
197201
int res_gen_id = -1;
198202
real_type max_p = -1.;
@@ -201,7 +205,7 @@ class DataGen: public DataGeneric
201205
if(!status_[gen_id]) continue;
202206
if(bus_id_(gen_id) != slack_bus_id) continue;
203207
const real_type p_mw = p_mw_(gen_id);
204-
add_slackbus(gen_id, p_mw / gen_p_per_bus[slack_bus_id]);
208+
add_slackbus(gen_id, p_mw / gen_p_per_bus[slack_bus_id], solver_control);
205209
if((p_mw > max_p) || (res_gen_id == -1) ){
206210
res_gen_id = gen_id;
207211
max_p = p_mw;
@@ -224,14 +228,18 @@ class DataGen: public DataGeneric
224228
void turnedoff_no_pv(){turnedoff_gen_pv_=false;} // turned off generators are not pv
225229
void turnedoff_pv(){turnedoff_gen_pv_=true;} // turned off generators are pv
226230
bool get_turnedoff_gen_pv() const {return turnedoff_gen_pv_;}
227-
void update_slack_weights(Eigen::Ref<Eigen::Array<bool, Eigen::Dynamic, Eigen::RowMajor> > could_be_slack, SolverControl & solver_control);
231+
void update_slack_weights(Eigen::Ref<Eigen::Array<bool, Eigen::Dynamic, Eigen::RowMajor> > could_be_slack,
232+
SolverControl & solver_control);
228233

229234
void deactivate(int gen_id, SolverControl & solver_control) {
230235
if (status_[gen_id]){
231236
solver_control.tell_recompute_sbus();
232237
if(voltage_regulator_on_[gen_id]) solver_control.tell_v_changed();
233238
if(!turnedoff_gen_pv_) solver_control.tell_pv_changed();
234-
if(gen_slack_weight_[gen_id]) solver_control.tell_slack_participate_changed();
239+
if(gen_slack_weight_[gen_id]){
240+
solver_control.tell_slack_participate_changed();
241+
solver_control.tell_slack_weight_changed();
242+
}
235243
}
236244
_deactivate(gen_id, status_);
237245
}
@@ -240,7 +248,10 @@ class DataGen: public DataGeneric
240248
solver_control.tell_recompute_sbus();
241249
if(voltage_regulator_on_[gen_id]) solver_control.tell_v_changed();
242250
if(!turnedoff_gen_pv_) solver_control.tell_pv_changed();
243-
if(gen_slack_weight_[gen_id]) solver_control.tell_slack_participate_changed();
251+
if(gen_slack_weight_[gen_id]){
252+
solver_control.tell_slack_participate_changed();
253+
solver_control.tell_slack_weight_changed();
254+
}
244255
}
245256
_reactivate(gen_id, status_);
246257
}

src/GridModel.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,6 @@ void GridModel::reset(bool reset_solver, bool reset_ac, bool reset_dc)
274274
_solver.set_gridmodel(this);
275275
_dc_solver.set_gridmodel(this);
276276
}
277-
// std::cout << "GridModel::reset called" << std::endl;
278277
}
279278

280279
CplxVect GridModel::ac_pf(const CplxVect & Vinit,
@@ -415,15 +414,16 @@ CplxVect GridModel::pre_process_solver(const CplxVect & Vinit,
415414
const SolverControl & solver_control)
416415
{
417416
// TODO get rid of the "is_ac" argument: this info is available in the _solver already
418-
if(is_ac) _solver.reset(solver_control);
419-
else _dc_solver.reset(solver_control);
420-
slack_bus_id_ = generators_.get_slack_bus_id();
417+
if(is_ac) _solver.tell_solver_control(solver_control);
418+
else _dc_solver.tell_solver_control(solver_control);
419+
420+
if (solver_control.has_slack_participate_changed()) slack_bus_id_ = generators_.get_slack_bus_id();
421421
if (solver_control.ybus_change_sparsity_pattern() || solver_control.has_dimension_changed()) init_Ybus(Ybus, id_me_to_solver, id_solver_to_me);
422422
if (solver_control.ybus_change_sparsity_pattern() || solver_control.has_dimension_changed() || solver_control.need_recompute_ybus()) fillYbus(Ybus, is_ac, id_me_to_solver);
423423
if (solver_control.has_dimension_changed()) init_Sbus(Sbus_, id_me_to_solver, id_solver_to_me, slack_bus_id_solver);
424-
fillpv_pq(id_me_to_solver, id_solver_to_me, slack_bus_id_solver, solver_control);
424+
if (solver_control.has_slack_participate_changed() || solver_control.has_pv_changed() || solver_control.has_pq_changed()) fillpv_pq(id_me_to_solver, id_solver_to_me, slack_bus_id_solver, solver_control);
425425

426-
if (solver_control.need_recompute_sbus()){
426+
if (solver_control.has_dimension_changed() || solver_control.need_recompute_sbus() && is_ac){
427427
int nb_bus_total = static_cast<int>(bus_vn_kv_.size());
428428
total_q_min_per_bus_ = RealVect::Constant(nb_bus_total, 0.);
429429
total_q_max_per_bus_ = RealVect::Constant(nb_bus_total, 0.);
@@ -477,7 +477,7 @@ void GridModel::process_results(bool conv,
477477
// compute the results of the flows, P,Q,V of loads etc.
478478
compute_results(ac);
479479
}
480-
need_reset_ = false;
480+
solver_control_.tell_none_changed();
481481
const CplxVect & res_tmp = ac ? _solver.get_V(): _dc_solver.get_V() ;
482482

483483
// convert back the results to "big" vector
@@ -487,7 +487,7 @@ void GridModel::process_results(bool conv,
487487
} else {
488488
//powerflow diverge
489489
reset_results();
490-
need_reset_ = true; // in this case, the powerflow diverge, so i need to recompute Ybus next time
490+
// TODO solver control ??? something to do here ?
491491
}
492492
}
493493

@@ -698,13 +698,14 @@ CplxVect GridModel::dc_pf(const CplxVect & Vinit,
698698

699699
// pre process the data to define a proper jacobian matrix, the proper voltage vector etc.
700700
bool is_ac = false;
701-
bool reset_solver = topo_changed_; // I reset the solver only if the topology change
702701
CplxVect V = pre_process_solver(Vinit, Ybus_dc_,
703702
id_me_to_dc_solver_, id_dc_solver_to_me_, slack_bus_id_dc_solver_,
704-
is_ac, reset_solver);
703+
is_ac, solver_control_);
705704

706705
// start the solver
707-
slack_weights_ = generators_.get_slack_weights(Ybus_dc_.rows(), id_me_to_dc_solver_);
706+
if(solver_control_.has_slack_participate_changed() ||
707+
solver_control_.has_pv_changed() ||
708+
solver_control_.has_slack_weight_changed()) slack_weights_ = generators_.get_slack_weights(Ybus_dc_.rows(), id_me_to_dc_solver_);
708709
conv = _dc_solver.compute_pf(Ybus_dc_, V, dcSbus_, slack_bus_id_dc_solver_, slack_weights_, bus_pv_, bus_pq_, max_iter, tol);
709710

710711
// store results (fase -> because I am in dc mode)
@@ -761,7 +762,7 @@ void GridModel::add_gen_slackbus(int gen_id, real_type weight){
761762
exc_ << "GridModel::add_gen_slackbus: please enter a valid weight for the slack bus (> 0.)";
762763
throw std::runtime_error(exc_.str());
763764
}
764-
generators_.add_slackbus(gen_id, weight);
765+
generators_.add_slackbus(gen_id, weight, solver_control_);
765766
}
766767

767768
void GridModel::remove_gen_slackbus(int gen_id){
@@ -781,7 +782,7 @@ void GridModel::remove_gen_slackbus(int gen_id){
781782
exc_ << "Generator with id " << gen_id << " does not exist and can't be the slack bus";
782783
throw std::runtime_error(exc_.str());
783784
}
784-
generators_.remove_slackbus(gen_id);
785+
generators_.remove_slackbus(gen_id, solver_control_);
785786
}
786787

787788
/** GRID2OP SPECIFIC REPRESENTATION **/
@@ -999,7 +1000,7 @@ std::tuple<int, int> GridModel::assign_slack_to_most_connected(){
9991000

10001001
// and reset the slack bus
10011002
generators_.remove_all_slackbus();
1002-
res_gen_id = generators_.assign_slack_bus(res_bus_id, gen_p_per_bus);
1003+
res_gen_id = generators_.assign_slack_bus(res_bus_id, gen_p_per_bus, solver_control_);
10031004
std::get<1>(res) = res_gen_id;
10041005
slack_bus_id_ = std::vector<int>();
10051006
slack_weights_ = RealVect();

src/GridModel.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,8 @@ class GridModel : public DataGeneric
704704
{
705705
(this->*fun_react)(el_id); // eg reactivate_load(load_id);
706706
(this->*fun_change)(el_id, new_bus_backend); // eg change_bus_load(load_id, new_bus_backend);
707-
topo_changed_ = true;
707+
// topo_changed_ = true;
708+
solver_control_.tell_dimension_changed();
708709
}
709710
} else{
710711
if(has_changed(el_pos))
@@ -714,7 +715,8 @@ class GridModel : public DataGeneric
714715
// bus_status_ is set to "false" in GridModel.update_topo
715716
// and a bus is activated if (and only if) one element is connected to it.
716717
// I must not set `bus_status_[new_bus_backend] = false;` in this case !
717-
topo_changed_ = true;
718+
// topo_changed_ = true;
719+
solver_control_.tell_dimension_changed();
718720
}
719721
}
720722
}

src/Utils.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class SolverControl
6464
need_recompute_sbus_(true),
6565
need_recompute_ybus_(true),
6666
v_changed_(true),
67+
slack_weight_changed_(true),
6768
ybus_change_sparsity_pattern_(true)
6869
{};
6970

@@ -76,6 +77,7 @@ class SolverControl
7677
need_recompute_sbus_ = true;
7778
need_recompute_ybus_ = true;
7879
v_changed_ = true;
80+
slack_weight_changed_ = true;
7981
ybus_change_sparsity_pattern_ = true;
8082
}
8183

@@ -88,6 +90,7 @@ class SolverControl
8890
need_recompute_sbus_ = false;
8991
need_recompute_ybus_ = false;
9092
v_changed_ = false;
93+
slack_weight_changed_ = false;
9194
ybus_change_sparsity_pattern_ = false;
9295
}
9396

@@ -109,16 +112,19 @@ class SolverControl
109112
void tell_ybus_change_sparsity_pattern(){ybus_change_sparsity_pattern_ = true;} //should be used after the powerflow as run, so some vectors will not be recomputed if not needed.
110113
// tell at least one generator changed its v setpoint
111114
void tell_v_changed(){v_changed_ = true;}
115+
// at least one generator has changed its slack participation
116+
void tell_slack_weight_changed(){slack_weight_changed_ = true;}
112117

113118
bool has_dimension_changed() const {return change_dimension_;}
114119
bool has_pv_changed() const {return pv_changed_;}
115120
bool has_pq_changed() const {return pq_changed_;}
116-
bool has_tell_slack_participate_changed() const {return slack_participate_changed_;}
121+
bool has_slack_participate_changed() const {return slack_participate_changed_;}
117122
bool need_reset_solver() const {return need_reset_solver_;}
118123
bool need_recompute_sbus() const {return need_recompute_sbus_;}
119124
bool need_recompute_ybus() const {return need_recompute_ybus_;}
120125
bool ybus_change_sparsity_pattern() const {return ybus_change_sparsity_pattern_;}
121-
bool v_changed() const {return v_changed_;}
126+
bool has_slack_weight_changed() const {return slack_weight_changed_;}
127+
bool has_v_changed() const {return v_changed_;}
122128

123129
protected:
124130
bool change_dimension_;
@@ -129,6 +135,7 @@ class SolverControl
129135
bool need_recompute_sbus_; // some coeff of sbus changed, need to recompute it
130136
bool need_recompute_ybus_; // some coeff of ybus changed, but not its sparsity pattern
131137
bool v_changed_;
138+
bool slack_weight_changed_;
132139
bool ybus_change_sparsity_pattern_; // sparsity pattern of ybus changed (and so are its coeff), or ybus change of dimension
133140
};
134141

src/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,7 @@ PYBIND11_MODULE(lightsim2grid_cpp, m)
598598
.def("has_dimension_changed", &SolverControl::has_dimension_changed, "TODO")
599599
.def("has_pv_changed", &SolverControl::has_pv_changed, "TODO")
600600
.def("has_pq_changed", &SolverControl::has_pq_changed, "TODO")
601-
.def("has_tell_slack_participate_changed", &SolverControl::has_tell_slack_participate_changed, "TODO")
601+
.def("has_slack_participate_changed", &SolverControl::has_slack_participate_changed, "TODO")
602602
.def("need_reset_solver", &SolverControl::need_reset_solver, "TODO")
603603
.def("need_recompute_sbus", &SolverControl::need_recompute_sbus, "TODO")
604604
.def("need_recompute_ybus", &SolverControl::need_recompute_ybus, "TODO")

0 commit comments

Comments
 (0)