Transposes a distribution but keeps the same mp_env
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_distribution_obj), | intent(out) | :: | dist_tr |
transposed distribution |
||
type(dbcsr_distribution_obj), | intent(in) | :: | dist_normal |
current distribution |
SUBROUTINE dbcsr_transpose_dims(dist_tr, dist_normal)
!! Transposes a distribution but keeps the same mp_env
TYPE(dbcsr_distribution_obj), INTENT(OUT) :: dist_tr
!! transposed distribution
TYPE(dbcsr_distribution_obj), INTENT(IN) :: dist_normal
!! current distribution
INTEGER :: ncols_tr, npcols_tr, nprows_tr, &
nrows_tr, vgcd, vlcm
INTEGER, DIMENSION(:), POINTER, CONTIGUOUS :: col_dist_data_tr, col_img_data_tr, &
row_dist_data_tr, row_img_data_tr
TYPE(dbcsr_mp_obj) :: mp_env
! ---------------------------------------------------------------------------
mp_env = dbcsr_distribution_mp(dist_normal)
!
! transpose the rows/cols
nrows_tr = dbcsr_distribution_ncols(dist_normal)
ncols_tr = dbcsr_distribution_nrows(dist_normal)
! procs are not transposed
nprows_tr = dbcsr_mp_nprows(mp_env)
npcols_tr = dbcsr_mp_npcols(mp_env)
vgcd = gcd(nprows_tr, npcols_tr)
vlcm = lcm(nprows_tr, npcols_tr)
!
ALLOCATE (row_dist_data_tr(nrows_tr))
ALLOCATE (row_img_data_tr(nrows_tr))
CALL rebin_distribution(row_dist_data_tr, row_img_data_tr, &
dbcsr_distribution_col_dist(dist_normal), &
nprows_tr, &
nprows_tr/vgcd, vlcm/nprows_tr)
!
! discard image distribution, it will be build later in the multiplication
DEALLOCATE (row_img_data_tr)
NULLIFY (row_img_data_tr)
!
ALLOCATE (col_dist_data_tr(ncols_tr))
ALLOCATE (col_img_data_tr(ncols_tr))
CALL rebin_distribution(col_dist_data_tr, col_img_data_tr, &
dbcsr_distribution_row_dist(dist_normal), &
npcols_tr, &
npcols_tr/vgcd, vlcm/npcols_tr)
!
! discard image distribution, it will be build later in the multiplication
DEALLOCATE (col_img_data_tr)
NULLIFY (col_img_data_tr)
!
CALL dbcsr_distribution_new(dist_tr, mp_env, &
row_dist_data_tr, col_dist_data_tr, &
reuse_arrays=.TRUE.)
END SUBROUTINE dbcsr_transpose_dims