35#include "../../base/base_uses.f90"
40 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'dbt_tas_io'
60 INTEGER,
INTENT(IN) :: unit_nr
61 LOGICAL,
INTENT(IN),
OPTIONAL :: full_info
63 INTEGER :: unit_nr_prv
64 INTEGER(KIND=int_8) :: nblkcols_total, nblkrows_total
68 INTEGER(KIND=int_8) :: iblk
69 CHARACTER(default_string_length) :: name
72 IF (unit_nr_prv == 0)
RETURN
74 CALL dbt_tas_get_info(matrix, nblkrows_total=nblkrows_total, nblkcols_total=nblkcols_total, &
75 proc_row_dist=proc_row_dist, proc_col_dist=proc_col_dist, &
76 row_blk_size=row_blk_size, col_blk_size=col_blk_size, name=name)
78 IF (unit_nr_prv > 0)
THEN
79 WRITE (unit_nr_prv,
"(T2,A)")
"GLOBAL INFO OF "//trim(name)
80 WRITE (unit_nr_prv,
"(T4,A,1X)", advance=
"no")
"block dimensions:"
81 WRITE (unit_nr_prv,
"(I12,I12)", advance=
"no") nblkrows_total, nblkcols_total
82 WRITE (unit_nr_prv,
"(/T4,A,1X)", advance=
"no")
"full dimensions:"
83 WRITE (unit_nr_prv,
"(I14,I14)", advance=
"no") row_blk_size%nfullrowcol, col_blk_size%nfullrowcol
84 WRITE (unit_nr_prv,
"(/T4,A,1X)", advance=
"no")
"process grid dimensions:"
85 WRITE (unit_nr_prv,
"(I10,I10)", advance=
"no") proc_row_dist%nprowcol, proc_col_dist%nprowcol
86 IF (
PRESENT(full_info))
THEN
88 WRITE (unit_nr_prv,
'(/T4,A)', advance=
'no')
"Block sizes:"
89 WRITE (unit_nr_prv,
'(/T8,A)', advance=
'no')
'Row:'
90 DO iblk = 1, row_blk_size%nmrowcol
91 WRITE (unit_nr_prv,
'(I4,1X)', advance=
'no') row_blk_size%data(iblk)
93 WRITE (unit_nr_prv,
'(/T8,A)', advance=
'no')
'Column:'
94 DO iblk = 1, col_blk_size%nmrowcol
95 WRITE (unit_nr_prv,
'(I4,1X)', advance=
'no') col_blk_size%data(iblk)
97 WRITE (unit_nr_prv,
'(/T4,A)', advance=
'no')
"Block distribution:"
98 WRITE (unit_nr_prv,
'(/T8,A)', advance=
'no')
'Row:'
99 DO iblk = 1, proc_row_dist%nmrowcol
100 WRITE (unit_nr_prv,
'(I4,1X)', advance=
'no') proc_row_dist%dist(iblk)
102 WRITE (unit_nr_prv,
'(/T8,A)', advance=
'no')
'Column:'
103 DO iblk = 1, proc_col_dist%nmrowcol
104 WRITE (unit_nr_prv,
'(I4,1X)', advance=
'no') proc_col_dist%dist(iblk)
109 WRITE (unit_nr_prv, *)
123 INTEGER,
INTENT(IN) :: unit_nr
124 LOGICAL,
INTENT(IN),
OPTIONAL :: full_info
126 CHARACTER(default_string_length) :: name
127 INTEGER :: icol, igroup, irow, nblock, ndbt_p_max, &
128 nelement, nelement_p_max, ngroup, &
129 nproc, split_rowcol, unit_nr_prv
130 INTEGER(KIND=int_8) :: ndbt_p_sum, ndbt_s, ndbt_s_max, &
131 ndbt_tot, nelement_p_sum, nelement_s, &
133 INTEGER(KIND=int_8),
DIMENSION(2) :: tmp_i8
134 INTEGER,
DIMENSION(2) :: tmp
135 INTEGER,
DIMENSION(:),
POINTER :: coldist, rowdist
136 REAL(kind=
dp) :: occupation
141 IF (unit_nr_prv == 0)
RETURN
145 nproc = mp_comm%num_pe
153 tmp = (/nblock, nelement/)
154 CALL mp_comm%max(tmp)
155 ndbt_p_max = tmp(1); nelement_p_max = tmp(2)
158 nelement_s = nelement
160 CALL mp_comm_group%sum(ndbt_s)
161 CALL mp_comm_group%sum(nelement_s)
163 tmp_i8 = (/ndbt_s, nelement_s/)
164 CALL mp_comm%max(tmp_i8)
165 ndbt_s_max = tmp_i8(1); nelement_s_max = tmp_i8(2)
169 IF (ndbt_tot .NE. 0) occupation = 100.0_dp*real(ndbt_p_sum,
dp)/real(ndbt_tot,
dp)
175 IF (unit_nr_prv > 0)
THEN
176 WRITE (unit_nr_prv,
"(T2,A)") &
177 "DISTRIBUTION OF "//trim(name)
178 WRITE (unit_nr_prv,
"(T15,A,T68,I13)")
"Number of non-zero blocks:", ndbt_p_sum
179 WRITE (unit_nr_prv,
"(T15,A,T75,F6.2)")
"Percentage of non-zero blocks:", occupation
180 WRITE (unit_nr_prv,
"(T15,A,T68,I13)")
"Average number of blocks per group:", (ndbt_p_sum + ngroup - 1)/ngroup
181 WRITE (unit_nr_prv,
"(T15,A,T68,I13)")
"Maximum number of blocks per group:", ndbt_s_max
182 WRITE (unit_nr_prv,
"(T15,A,T68,I13)")
"Average number of matrix elements per group:", (nelement_p_sum + ngroup - 1)/ngroup
183 WRITE (unit_nr_prv,
"(T15,A,T68,I13)")
"Maximum number of matrix elements per group:", nelement_s_max
184 WRITE (unit_nr_prv,
"(T15,A,T68,I13)")
"Average number of blocks per CPU:", (ndbt_p_sum + nproc - 1)/nproc
185 WRITE (unit_nr_prv,
"(T15,A,T68,I13)")
"Maximum number of blocks per CPU:", ndbt_p_max
186 WRITE (unit_nr_prv,
"(T15,A,T68,I13)")
"Average number of matrix elements per CPU:", (nelement_p_sum + nproc - 1)/nproc
187 WRITE (unit_nr_prv,
"(T15,A,T68,I13)")
"Maximum number of matrix elements per CPU:", nelement_p_max
188 IF (
PRESENT(full_info))
THEN
190 WRITE (unit_nr_prv,
"(T15,A)")
"Row distribution on subgroup:"
191 WRITE (unit_nr_prv,
'(T15)', advance=
'no')
192 DO irow = 1,
SIZE(rowdist)
193 WRITE (unit_nr_prv,
'(I3, 1X)', advance=
'no') rowdist(irow)
195 WRITE (unit_nr_prv,
"(/T15,A)")
"Column distribution on subgroup:"
196 WRITE (unit_nr_prv,
'(T15)', advance=
'no')
197 DO icol = 1,
SIZE(coldist)
198 WRITE (unit_nr_prv,
'(I3, 1X)', advance=
'no') coldist(icol)
200 WRITE (unit_nr_prv, *)
215 INTEGER,
INTENT(IN) :: unit_nr
216 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: name
218 CHARACTER(len=:),
ALLOCATABLE :: name_prv
219 INTEGER :: igroup, mynode, nsplit, split_rowcol, &
221 INTEGER,
DIMENSION(2) :: dims, groupdims, pgrid_offset
225 IF (unit_nr_prv == 0)
RETURN
227 IF (
PRESENT(name))
THEN
228 ALLOCATE (name_prv, source=trim(name))
230 ALLOCATE (name_prv, source=
"")
235 mynode = mp_comm%mepos
236 dims = mp_comm%num_pe_cart
237 groupdims = mp_comm_group%num_pe_cart
239 IF (unit_nr_prv > 0)
THEN
240 SELECT CASE (split_rowcol)
242 WRITE (unit_nr_prv,
"(T4,A,I4,1X,A,I4)") name_prv//
"splitting rows by factor", nsplit
244 WRITE (unit_nr_prv,
"(T4,A,I4,1X,A,I4)") name_prv//
"splitting columns by factor", nsplit
246 WRITE (unit_nr_prv,
"(T4,A,I4,A1,I4)") name_prv//
"global grid sizes:", dims(1),
"x", dims(2)
249 IF (unit_nr_prv > 0)
THEN
250 WRITE (unit_nr_prv,
"(T4,A,I4,A1,I4)") &
251 name_prv//
"grid sizes on subgroups:", &
252 groupdims(1),
"x", groupdims(2)
264 INTEGER,
INTENT(IN),
OPTIONAL :: unit_nr
265 INTEGER :: unit_nr_out
267 IF (
PRESENT(unit_nr))
THEN
268 unit_nr_out = unit_nr
type(dbm_distribution_obj) function, public dbm_get_distribution(matrix)
Returns the distribution of the given matrix.
integer function, dimension(:), pointer, contiguous, public dbm_distribution_col_dist(dist)
Returns the columns of the given distribution.
integer function, dimension(:), pointer, contiguous, public dbm_distribution_row_dist(dist)
Returns the rows of the given distribution.
Tall-and-skinny matrices: base routines similar to DBM API, mostly wrappers around existing DBM routi...
integer(kind=int_8) function, public dbt_tas_get_nze_total(matrix)
Get total number of non-zero elements.
pure integer function, public dbt_tas_get_nze(matrix)
As dbt_get_nze: get number of local non-zero elements.
subroutine, public dbt_tas_get_info(matrix, nblkrows_total, nblkcols_total, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, distribution, name)
...
pure integer(kind=int_8) function, public dbt_tas_nblkrows_total(matrix)
...
pure integer(kind=int_8) function, public dbt_tas_nblkcols_total(matrix)
...
integer(kind=int_8) function, public dbt_tas_get_num_blocks_total(matrix)
get total number of blocks
pure integer function, public dbt_tas_get_num_blocks(matrix)
As dbt_get_num_blocks: get number of local blocks.
Global data (distribution and block sizes) for tall-and-skinny matrices For very sparse matrices with...
tall-and-skinny matrices: Input / Output
integer function, public prep_output_unit(unit_nr)
...
subroutine, public dbt_tas_write_matrix_info(matrix, unit_nr, full_info)
Write basic infos of tall-and-skinny matrix: block dimensions, full dimensions, process grid dimensio...
subroutine, public dbt_tas_write_dist(matrix, unit_nr, full_info)
Write info on tall-and-skinny matrix distribution & load balance.
subroutine, public dbt_tas_write_split_info(info, unit_nr, name)
Print info on how matrix is split.
methods to split tall-and-skinny matrices along longest dimension. Basically, we are splitting proces...
integer, parameter, public rowsplit
subroutine, public dbt_tas_get_split_info(info, mp_comm, nsplit, igroup, mp_comm_group, split_rowcol, pgrid_offset)
Get info on split.
integer, parameter, public colsplit
DBT tall-and-skinny base types. Mostly wrappers around existing DBM routines.
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
integer, parameter, public default_string_length
Interface to the message passing library MPI.