35#include "ScaLAPACKWrapper.hpp"
128 if (ctxt_ != -1) scalapack::Cblacs_gridexit(ctxt_);
129 if (ctxt_all_ != -1) scalapack::Cblacs_gridexit(ctxt_all_);
130 if (ctxt_T_ != -1) scalapack::Cblacs_gridexit(ctxt_T_);
176 comm_ = std::move(grid.comm_);
179 ctxt_all_ = grid.ctxt_all_;
180 ctxt_T_ = grid.ctxt_T_;
181 nprows_ = grid.nprows_;
182 npcols_ = grid.npcols_;
209 int ctxt()
const {
return ctxt_; }
238 int prow()
const {
return prow_; }
244 int pcol()
const {
return pcol_; }
251 int P()
const {
return P_; }
264 bool active()
const {
return prow_ != -1; }
278 static void layout(
int procs,
int& proc_rows,
int& proc_cols) {
280 proc_cols = std::floor(std::sqrt((
float)procs));
281 proc_rows = procs / proc_cols;
294 g.transpose_inplace();
298 const MPIComm& Comm_active()
const {
299 if (active_comm_)
return *active_comm_;
313 std::unique_ptr<MPIComm> active_comm_;
316 layout(P_, nprows_, npcols_);
317 if (comm_.is_null()) {
318 ctxt_ = ctxt_all_ = ctxt_T_ = -1;
321 int active_procs = nprows_ * npcols_;
322 if (active_procs < P_) {
323 active_comm_.reset(
new MPIComm(comm_.sub(0, active_procs)));
324 if (comm_.rank() < active_procs) {
325 ctxt_ = scalapack::Csys2blacs_handle(active_comm_->comm());
326 scalapack::Cblacs_gridinit(&ctxt_,
"C", nprows_, npcols_);
327 ctxt_T_ = scalapack::Csys2blacs_handle(active_comm_->comm());
328 scalapack::Cblacs_gridinit(&ctxt_T_,
"R", npcols_, nprows_);
329 }
else ctxt_ = ctxt_T_ = -1;
331 ctxt_ = scalapack::Csys2blacs_handle(comm_.comm());
332 scalapack::Cblacs_gridinit(&ctxt_,
"C", nprows_, npcols_);
333 ctxt_T_ = scalapack::Csys2blacs_handle(comm_.comm());
334 scalapack::Cblacs_gridinit(&ctxt_T_,
"R", npcols_, nprows_);
336 ctxt_all_ = scalapack::Csys2blacs_handle(comm_.comm());
337 scalapack::Cblacs_gridinit(&ctxt_all_,
"R", 1, P_);
339 scalapack::Cblacs_gridinfo(ctxt_, &dummy1, &dummy2, &prow_, &pcol_);
343 void transpose_inplace() {
344 std::swap(ctxt_, ctxt_T_);
345 std::swap(nprows_, npcols_);
346 std::swap(prow_, pcol_);
357 inline std::ostream& operator<<(std::ostream& os,
const BLACSGrid* g) {
358 if (!g) os <<
"null";
360 os <<
" ctxt[" << g->
ctxt()
362 << (g->
P()-g->
npactives()) <<
")ctxtT[" << g->ctxt_T_ <<
"]";
Contains some simple C++ MPI wrapper utilities.
This is a small wrapper class around a BLACS grid and a BLACS context.
Definition: BLACSGrid.hpp:66
bool active() const
Definition: BLACSGrid.hpp:264
~BLACSGrid()
Definition: BLACSGrid.hpp:127
BLACSGrid(const MPIComm &comm)
Definition: BLACSGrid.hpp:82
BLACSGrid()
Definition: BLACSGrid.hpp:72
const MPIComm & Comm() const
Definition: BLACSGrid.hpp:196
BLACSGrid transpose() const
Definition: BLACSGrid.hpp:292
BLACSGrid & operator=(BLACSGrid &&grid)
Definition: BLACSGrid.hpp:175
BLACSGrid(const MPIComm &comm, int P)
Definition: BLACSGrid.hpp:106
static void layout(int procs, int &proc_rows, int &proc_cols)
Definition: BLACSGrid.hpp:278
int npcols() const
Definition: BLACSGrid.hpp:232
MPIComm & Comm()
Definition: BLACSGrid.hpp:201
int ctxt_all() const
Definition: BLACSGrid.hpp:220
int npactives() const
Definition: BLACSGrid.hpp:257
int P() const
Definition: BLACSGrid.hpp:251
int pcol() const
Definition: BLACSGrid.hpp:244
BLACSGrid & operator=(const BLACSGrid &grid)
Definition: BLACSGrid.hpp:161
BLACSGrid(MPIComm &&comm)
Definition: BLACSGrid.hpp:92
BLACSGrid(MPIComm &&comm, int P)
Definition: BLACSGrid.hpp:121
BLACSGrid(const BLACSGrid &grid)
Definition: BLACSGrid.hpp:143
int nprows() const
Definition: BLACSGrid.hpp:226
BLACSGrid(BLACSGrid &&grid)
Definition: BLACSGrid.hpp:148
int ctxt() const
Definition: BLACSGrid.hpp:209
friend std::ostream & operator<<(std::ostream &os, const BLACSGrid *g)
Definition: BLACSGrid.hpp:357
int prow() const
Definition: BLACSGrid.hpp:238
Wrapper class around an MPI_Comm object.
Definition: MPIWrapper.hpp:194
Definition: StrumpackOptions.hpp:43