Prepares distributions for making dense matrices.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dbcsr_distribution_obj), | intent(in) | :: | product_dist | |||
type(dbcsr_imagedistribution_obj), | intent(in) | :: | left_rdist | |||
type(dbcsr_imagedistribution_obj), | intent(in) | :: | right_rdist | |||
type(dbcsr_distribution_obj), | intent(out) | :: | dense_product_dist | |||
type(dbcsr_imagedistribution_obj), | intent(out) | :: | dense_left_rdist | |||
type(dbcsr_imagedistribution_obj), | intent(out) | :: | dense_right_rdist | |||
logical, | intent(in) | :: | partial | |||
type(array_i1d_obj), | intent(out) | :: | m_map | |||
type(array_i1d_obj), | intent(out) | :: | k_vmap | |||
type(array_i1d_obj), | intent(out) | :: | n_map | |||
type(array_i1d_obj), | intent(in) | :: | old_m_sizes |
SUBROUTINE dbcsr_make_dists_dense(product_dist, left_rdist, right_rdist, & !! Prepares distributions for making dense matrices. dense_product_dist, dense_left_rdist, dense_right_rdist, & partial, & m_map, k_vmap, n_map, & old_m_sizes) TYPE(dbcsr_distribution_obj), INTENT(IN) :: product_dist TYPE(dbcsr_imagedistribution_obj), INTENT(IN) :: left_rdist, right_rdist TYPE(dbcsr_distribution_obj), INTENT(OUT) :: dense_product_dist TYPE(dbcsr_imagedistribution_obj), INTENT(OUT) :: dense_left_rdist, dense_right_rdist LOGICAL, INTENT(IN) :: partial TYPE(array_i1d_obj), INTENT(OUT) :: m_map, k_vmap, n_map TYPE(array_i1d_obj), INTENT(IN) :: old_m_sizes CHARACTER(len=*), PARAMETER :: routineN = 'dbcsr_make_dists_dense' INTEGER :: error_handle, i, j, k_nbins, m_nbins, & n_nbins, nthreads INTEGER, DIMENSION(:), POINTER :: tdist TYPE(array_i1d_obj) :: new_k_idist, new_k_pdist, new_k_vdist, & new_m_dist, new_m_sizes, new_n_dist, & old_k_vdist, old_m_dist, old_n_dist TYPE(dbcsr_distribution_obj) :: dense_left_dist, dense_right_dist ! --------------------------------------------------------------------------- CALL timeset(routineN, error_handle) ! IF (.NOT. dbcsr_distribution_has_threads(product_dist)) & DBCSR_ABORT("Product distribution must have threads.") tdist => array_data(dbcsr_distribution_thread_dist(product_dist)) old_m_dist = product_dist%d%row_dist_block old_n_dist = product_dist%d%col_dist_block old_k_vdist = right_rdist%i%vrow_dist m_nbins = dbcsr_mp_nprows(product_dist%d%mp_env) n_nbins = dbcsr_mp_npcols(product_dist%d%mp_env) k_nbins = dbcsr_mp_nprows(right_rdist%i%main%d%mp_env)*right_rdist%i%row_decimation IF (.NOT. array_equality(old_k_vdist, left_rdist%i%vcol_dist)) & DBCSR_ABORT("k distribution mismatch") nthreads = product_dist%d%num_threads ! IF (partial) THEN new_m_dist = old_m_dist CALL array_hold(new_m_dist) new_n_dist = old_n_dist CALL array_hold(new_n_dist) dense_product_dist = product_dist CALL dbcsr_distribution_hold(dense_product_dist) CALL array_new(m_map, (/(i, i=1, array_size(new_m_dist))/), lb=1) CALL array_new(n_map, (/(i, i=1, array_size(new_n_dist))/), lb=1) ELSE CALL dbcsr_make_1dist_dense(m_nbins, old_m_dist, new_m_dist, m_map, & nthreads, tdist) CALL dbcsr_make_1dist_dense(n_nbins, old_n_dist, new_n_dist, n_map, 0) CALL dbcsr_distribution_new(dense_product_dist, product_dist%d%mp_env, & new_m_dist, new_n_dist) CALL make_sizes_dense(old_m_sizes, m_map, array_size(new_m_dist), new_m_sizes) CALL dbcsr_distribution_make_threads(dense_product_dist, & array_data(new_m_sizes)) CALL array_release(new_m_sizes) tdist => array_data(dbcsr_distribution_thread_dist(dense_product_dist)) ! Resets the thread distribution to be in-order. DO i = 1, m_nbins tdist((i - 1)*nthreads + 1:(i)*nthreads) = (/(j, j=0, nthreads - 1)/) END DO END IF ! CALL dbcsr_make_1dist_dense(k_nbins, old_k_vdist, new_k_vdist, k_vmap, 0) CALL v_to_p_i_dist_o(new_k_vdist, & left_rdist%i%col_decimation, new_k_pdist, new_k_idist) ! Left CALL dbcsr_distribution_new(dense_left_dist, left_rdist%i%main%d%mp_env, & new_m_dist, new_k_pdist) CALL dbcsr_distribution_no_threads(dense_left_dist) dense_left_dist%d%thread_dist = dbcsr_distribution_thread_dist(dense_product_dist) CALL array_hold(dense_left_dist%d%thread_dist) dense_left_dist%d%has_thread_dist = .TRUE. CALL dbcsr_new_image_dist(dense_left_rdist, dense_left_dist, left_rdist) CALL dbcsr_distribution_release(dense_left_dist) CALL array_new(dense_left_rdist%i%row_image, & (/(1, i=1, array_size(new_m_dist))/), lb=1) dense_left_rdist%i%col_image = new_k_idist CALL array_hold(new_k_idist) dense_left_rdist%i%vrow_dist = new_m_dist CALL array_hold(new_m_dist) dense_left_rdist%i%vcol_dist = new_k_vdist CALL array_hold(new_k_vdist) ! CALL array_release(new_k_pdist) CALL array_release(new_k_idist) ! Right CALL v_to_p_i_dist_o(new_k_vdist, & right_rdist%i%row_decimation, new_k_pdist, new_k_idist) CALL dbcsr_distribution_new(dense_right_dist, right_rdist%i%main%d%mp_env, & new_k_pdist, new_n_dist) CALL dbcsr_new_image_dist(dense_right_rdist, dense_right_dist, right_rdist) CALL dbcsr_distribution_release(dense_right_dist) CALL array_new(dense_right_rdist%i%col_image, & (/(1, i=1, array_size(new_n_dist))/), lb=1) dense_right_rdist%i%row_image = new_k_idist CALL array_hold(new_k_idist) dense_right_rdist%i%vrow_dist = new_k_vdist CALL array_hold(new_k_vdist) dense_right_rdist%i%vcol_dist = new_n_dist CALL array_hold(new_n_dist) ! CALL array_release(new_k_idist) CALL array_release(new_k_pdist) CALL array_release(new_m_dist) CALL array_release(new_n_dist) CALL array_release(new_k_vdist) ! CALL timestop(error_handle) END SUBROUTINE dbcsr_make_dists_dense