Go to the documentation of this file.
32 #ifndef BLACS_GRID_HPP
33 #define BLACS_GRID_HPP
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();
310 layout(P_, nprows_, npcols_);
312 ctxt_ = ctxt_all_ = ctxt_T_ = -1;
315 int active_procs = nprows_ * npcols_;
316 if (active_procs < P_) {
317 auto active_comm = comm_.
sub(0, active_procs);
318 if (comm_.
rank() < active_procs) {
319 ctxt_ = scalapack::Csys2blacs_handle(active_comm.comm());
320 scalapack::Cblacs_gridinit(&ctxt_,
"C", nprows_, npcols_);
321 ctxt_T_ = scalapack::Csys2blacs_handle(active_comm.comm());
322 scalapack::Cblacs_gridinit(&ctxt_T_,
"R", npcols_, nprows_);
323 }
else ctxt_ = ctxt_T_ = -1;
325 ctxt_ = scalapack::Csys2blacs_handle(comm_.
comm());
326 scalapack::Cblacs_gridinit(&ctxt_,
"C", nprows_, npcols_);
327 ctxt_T_ = scalapack::Csys2blacs_handle(comm_.
comm());
328 scalapack::Cblacs_gridinit(&ctxt_T_,
"R", npcols_, nprows_);
330 ctxt_all_ = scalapack::Csys2blacs_handle(comm_.
comm());
331 scalapack::Cblacs_gridinit(&ctxt_all_,
"R", 1, P_);
333 scalapack::Cblacs_gridinfo(ctxt_, &dummy1, &dummy2, &prow_, &pcol_);
337 void transpose_inplace() {
338 std::swap(ctxt_, ctxt_T_);
339 std::swap(nprows_, npcols_);
340 std::swap(prow_, pcol_);
352 if (!g) os <<
"null";
354 os <<
" ctxt[" << g->
ctxt()
356 << (g->
P()-g->
npactives()) <<
")ctxtT[" << g->ctxt_T_ <<
"]";
362 #endif // BLACS_GRID_HPP
int npactives() const
Definition: BLACSGrid.hpp:257
This is a small wrapper class around a BLACS grid and a BLACS context.
Definition: BLACSGrid.hpp:66
int npcols() const
Definition: BLACSGrid.hpp:232
Wrapper class around an MPI_Comm object.
Definition: MPIWrapper.hpp:190
BLACSGrid(const MPIComm &comm, int P)
Definition: BLACSGrid.hpp:106
BLACSGrid(BLACSGrid &&grid)
Definition: BLACSGrid.hpp:148
bool is_null() const
Definition: MPIWrapper.hpp:262
int pcol() const
Definition: BLACSGrid.hpp:244
Definition: StrumpackOptions.hpp:42
std::ostream & operator<<(std::ostream &os, const BLACSGrid *g)
Definition: BLACSGrid.hpp:351
~BLACSGrid()
Definition: BLACSGrid.hpp:127
MPI_Comm comm() const
Definition: MPIWrapper.hpp:257
int nprows() const
Definition: BLACSGrid.hpp:226
int prow() const
Definition: BLACSGrid.hpp:238
int ctxt() const
Definition: BLACSGrid.hpp:209
MPIComm sub(int P0, int P, int stride=1) const
Definition: MPIWrapper.hpp:721
int P() const
Definition: BLACSGrid.hpp:251
BLACSGrid & operator=(const BLACSGrid &grid)
Definition: BLACSGrid.hpp:161
static void layout(int procs, int &proc_rows, int &proc_cols)
Definition: BLACSGrid.hpp:278
BLACSGrid()
Definition: BLACSGrid.hpp:72
int rank() const
Definition: MPIWrapper.hpp:267
bool active() const
Definition: BLACSGrid.hpp:264
BLACSGrid & operator=(BLACSGrid &&grid)
Definition: BLACSGrid.hpp:175
BLACSGrid(const MPIComm &comm)
Definition: BLACSGrid.hpp:82
int ctxt_all() const
Definition: BLACSGrid.hpp:220
BLACSGrid transpose() const
Definition: BLACSGrid.hpp:292
Contains some simple C++ MPI wrapper utilities.
BLACSGrid(MPIComm &&comm)
Definition: BLACSGrid.hpp:92
BLACSGrid(const BLACSGrid &grid)
Definition: BLACSGrid.hpp:143
MPIComm & Comm()
Definition: BLACSGrid.hpp:201
const MPIComm & Comm() const
Definition: BLACSGrid.hpp:196
friend std::ostream & operator<<(std::ostream &os, const BLACSGrid *g)
Definition: BLACSGrid.hpp:351
BLACSGrid(MPIComm &&comm, int P)
Definition: BLACSGrid.hpp:121