|
ScaLAPACKFX
|
Type for communicating a row or a column of a distributed matrix. More...
Type for communicating a row or a column of a distributed matrix.
The type linecomm collects/distributes a line (row or column) of a distributed matrix into/from a buffer on the master node. It communicate the entire line at once or blockwise, with the blocks having the size of the BLACS block size.
The code below demonstrates how to write out a distributed matrix columnwise to disc with the help of linecomm:
type(linecomm) :: collector
real(dp), allocatable :: iobuffer(:)
allocate(iobuffer(desc(M_))
call collector%init(mygrid, desc, "c")
do icol = 1, desc(N_)
if (mygrid%master) then
call collector%getline_master(mygrid, icol, mtxloc, iobuffer)
write(fd, formatstr) iobuffer(:)
else
call collector%getline_slave(mygrid, icol, mtxloc)
end if
end do
Similarly, to read from a file columnwise, you could do the following:
type(linecomm) :: distributor
real(dp), allocatable :: iobuffer(:)
allocate(iobuffer(desc(M_))
call distributor%init(desc, "c")
do icol = 1, ncol
if (mygrid%master) then
read(fd, *) iobuffer(:)
call distributor%setline_master(mygrid, icol, iobuffer, mtxloc)
else
call distributor%setline_slave(mygrid, icol, mtxloc)
end if
end do