34#include "./base/base_uses.f90"
40 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_fb_atomic_matrix_methods'
73 INTEGER,
INTENT(OUT) :: nrows, ncols
74 INTEGER,
DIMENSION(:),
INTENT(OUT) :: blk_row_start, blk_col_start
76 INTEGER :: ii, natoms_in_halo
77 INTEGER,
DIMENSION(:),
POINTER :: col_block_size_data, halo_atoms, &
81 NULLIFY (halo_atoms, row_block_size_data, col_block_size_data)
83 CALL dbcsr_get_info(dbcsr_mat, row_blk_size=row_block_size_data, col_blk_size=col_block_size_data)
85 natoms=natoms_in_halo, &
86 halo_atoms=halo_atoms)
87 check_ok =
SIZE(blk_row_start) .GE. (natoms_in_halo + 1)
89 check_ok =
SIZE(blk_col_start) .GE. (natoms_in_halo + 1)
95 DO ii = 1, natoms_in_halo
96 blk_row_start(ii) = nrows + 1
97 blk_col_start(ii) = ncols + 1
98 nrows = nrows + row_block_size_data(halo_atoms(ii))
99 ncols = ncols + col_block_size_data(halo_atoms(ii))
101 blk_row_start(natoms_in_halo + 1) = nrows + 1
102 blk_col_start(natoms_in_halo + 1) = ncols + 1
134 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT) :: atomic_matrix
135 INTEGER,
DIMENSION(:),
INTENT(IN) :: blk_row_start, blk_col_start
137 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fb_atmatrix_construct'
139 INTEGER :: handle, iatom, iatom_in_halo, ii, ind, ipair, ipe, jatom, jatom_in_halo, jj, &
140 ncols_blk, npairs_recv, npairs_send, nrows_blk, numprocs, pe, recv_encode, send_encode
141 INTEGER(KIND=int_8),
DIMENSION(:),
POINTER :: pairs_recv, pairs_send
142 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: recv_disps, recv_pair_count, recv_pair_disps, &
143 recv_sizes, send_disps, send_pair_count, send_pair_disps, send_sizes
144 INTEGER,
DIMENSION(:),
POINTER :: col_block_size_data, row_block_size_data
146 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: recv_buf, send_buf
147 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: mat_block
150 CALL timeset(routinen, handle)
152 NULLIFY (pairs_send, pairs_recv, mat_block, &
153 row_block_size_data, col_block_size_data)
158 IF (
SIZE(atomic_matrix, 1) > 0 .AND.
SIZE(atomic_matrix, 2) > 0)
THEN
159 atomic_matrix = 0.0_dp
165 CALL fb_atmatrix_generate_com_pairs(dbcsr_mat, &
174 npairs=npairs_send, &
175 natoms_encode=send_encode)
178 npairs=npairs_recv, &
179 natoms_encode=recv_encode)
182 numprocs = para_env%num_pe
185 CALL dbcsr_get_info(dbcsr_mat, row_blk_size=row_block_size_data, col_blk_size=col_block_size_data)
188 ALLOCATE (send_sizes(numprocs))
189 ALLOCATE (send_disps(numprocs))
190 ALLOCATE (send_pair_count(numprocs))
191 ALLOCATE (send_pair_disps(numprocs))
196 row_block_size_data, &
197 col_block_size_data, &
203 ALLOCATE (send_buf(sum(send_sizes)))
206 ALLOCATE (recv_sizes(numprocs))
207 ALLOCATE (recv_disps(numprocs))
208 ALLOCATE (recv_pair_count(numprocs))
209 ALLOCATE (recv_pair_disps(numprocs))
214 row_block_size_data, &
215 col_block_size_data, &
221 ALLOCATE (recv_buf(sum(recv_sizes)))
226 DO ipair = 1, send_pair_count(ipe)
228 pe, iatom, jatom, send_encode)
229 nrows_blk = row_block_size_data(iatom)
230 ncols_blk = col_block_size_data(jatom)
232 row=iatom, col=jatom, block=mat_block, &
234 IF (.NOT. found)
THEN
235 cpabort(
"Matrix block not found")
241 ind = send_disps(ipe) + send_sizes(ipe) + ii + (jj - 1)*nrows_blk
242 send_buf(ind) = mat_block(ii, jj)
245 send_sizes(ipe) = send_sizes(ipe) + nrows_blk*ncols_blk
251 CALL para_env%alltoall(send_buf, send_sizes, send_disps, &
252 recv_buf, recv_sizes, recv_disps)
255 DEALLOCATE (send_buf)
256 DEALLOCATE (send_sizes)
257 DEALLOCATE (send_disps)
258 DEALLOCATE (send_pair_count)
259 DEALLOCATE (send_pair_disps)
264 DO ipair = 1, recv_pair_count(ipe)
266 pe, iatom, jatom, recv_encode)
269 nrows_blk = row_block_size_data(iatom)
270 ncols_blk = col_block_size_data(jatom)
276 iatom, iatom_in_halo, &
280 jatom, jatom_in_halo, &
287 ind = recv_disps(ipe) + recv_sizes(ipe) + ii + (jj - 1)*nrows_blk
288 atomic_matrix(blk_row_start(iatom_in_halo) + ii - 1, &
289 blk_col_start(jatom_in_halo) + jj - 1) = recv_buf(ind)
293 recv_sizes(ipe) = recv_sizes(ipe) + nrows_blk*ncols_blk
298 DO ii = 2,
SIZE(atomic_matrix, 1)
300 atomic_matrix(ii, jj) = atomic_matrix(jj, ii)
305 DEALLOCATE (recv_buf)
306 DEALLOCATE (recv_sizes)
307 DEALLOCATE (recv_disps)
308 DEALLOCATE (recv_pair_count)
309 DEALLOCATE (recv_pair_disps)
313 CALL timestop(handle)
343 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(OUT) :: atomic_matrix
344 INTEGER,
DIMENSION(:),
INTENT(IN) :: blk_row_start, blk_col_start
346 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fb_atmatrix_construct_2'
348 INTEGER :: handle, iatom, iatom_global, icol, ii, &
349 irow, jatom, jatom_global, jj, &
351 INTEGER,
DIMENSION(:),
POINTER :: halo_atoms
352 LOGICAL :: check_ok, found
353 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: blk_p
355 CALL timeset(routinen, handle)
362 NULLIFY (halo_atoms, blk_p)
365 IF (
SIZE(atomic_matrix, 1) > 0 .AND.
SIZE(atomic_matrix, 2) > 0)
THEN
366 atomic_matrix = 0.0_dp
371 natoms=natoms_in_halo, &
372 halo_atoms=halo_atoms)
375 DO iatom = 1, natoms_in_halo
376 iatom_global = halo_atoms(iatom)
377 DO jatom = 1, natoms_in_halo
378 jatom_global = halo_atoms(jatom)
381 IF (jatom_global .GE. iatom_global)
THEN
389 DO jj = 1,
SIZE(blk_p, 2)
390 icol = blk_col_start(jatom) + jj - 1
391 DO ii = 1,
SIZE(blk_p, 1)
392 irow = blk_row_start(iatom) + ii - 1
393 atomic_matrix(irow, icol) = blk_p(ii, jj)
402 DO ii = 2,
SIZE(atomic_matrix, 1)
404 atomic_matrix(ii, jj) = atomic_matrix(jj, ii)
408 CALL timestop(handle)
427 SUBROUTINE fb_atmatrix_generate_com_pairs(dbcsr_mat, &
437 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fb_atmatrix_generate_com_pairs'
439 INTEGER :: counter, handle, iatom, iatom_global, itask, jatom, jatom_global, natoms_in_halo, &
440 nblkrows_total, nencode, ntasks_recv, ntasks_send, src
441 INTEGER(KIND=int_8) :: pair
442 INTEGER(KIND=int_8),
DIMENSION(:, :),
POINTER :: tasks_recv, tasks_send
443 INTEGER,
DIMENSION(:),
POINTER :: halo_atoms
445 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: mat_block
448 CALL timeset(routinen, handle)
450 NULLIFY (halo_atoms, tasks_send, tasks_recv)
468 natoms=natoms_in_halo, &
469 halo_atoms=halo_atoms)
474 nblkrows_total=nblkrows_total)
483 ntasks_recv = natoms_in_halo*natoms_in_halo
488 associate(dest => para_env%mepos)
491 DO iatom = 1, natoms_in_halo
492 iatom_global = halo_atoms(iatom)
493 DO jatom = 1, natoms_in_halo
494 jatom_global = halo_atoms(jatom)
497 IF (jatom_global .GE. iatom_global)
THEN
515 iatom_global, jatom_global, &
526 ntasks_recv = itask - 1
534 ntasks=ntasks_recv, &
535 nencode=nblkrows_total, &
543 ntasks=ntasks_send, &
555 DO itask = 1, ntasks_send
560 row=iatom_global, col=jatom_global, block=mat_block, &
563 counter = counter + 1
576 ntasks_send = counter
590 atom_pairs=atom_pairs_send, &
591 natoms_encode=nencode, &
594 atom_pairs=atom_pairs_recv, &
595 natoms_encode=nencode, &
602 CALL timestop(handle)
604 END SUBROUTINE fb_atmatrix_generate_com_pairs
626 TYPE(dbcsr_type),
POINTER :: dbcsr_mat
627 TYPE(fb_atomic_halo_list_obj),
INTENT(IN) :: atomic_halos
628 TYPE(mp_para_env_type),
POINTER :: para_env
629 TYPE(fb_com_atom_pairs_obj),
INTENT(INOUT) :: atom_pairs_send, atom_pairs_recv
631 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fb_atmatrix_generate_com_pairs_2'
633 INTEGER :: counter, handle, iatom, iatom_global, ihalo, itask, jatom, jatom_global, &
634 natoms_in_halo, nblkrows_total, nencode, nhalos, ntasks_recv, ntasks_send, src
635 INTEGER(KIND=int_8) :: pair
636 INTEGER(KIND=int_8),
DIMENSION(:, :),
POINTER :: tasks_recv, tasks_send
637 INTEGER,
DIMENSION(:),
POINTER :: halo_atoms
639 REAL(kind=dp),
DIMENSION(:, :),
POINTER :: mat_block
640 TYPE(fb_atomic_halo_obj),
DIMENSION(:),
POINTER :: halos
641 TYPE(fb_com_tasks_obj) :: com_tasks_recv, com_tasks_send
643 CALL timeset(routinen, handle)
645 NULLIFY (halo_atoms, tasks_send, tasks_recv)
646 CALL fb_com_tasks_nullify(com_tasks_send)
647 CALL fb_com_tasks_nullify(com_tasks_recv)
650 IF (fb_com_atom_pairs_has_data(atom_pairs_send))
THEN
651 CALL fb_com_atom_pairs_init(atom_pairs_send)
653 CALL fb_com_atom_pairs_create(atom_pairs_send)
655 IF (fb_com_atom_pairs_has_data(atom_pairs_recv))
THEN
656 CALL fb_com_atom_pairs_init(atom_pairs_recv)
658 CALL fb_com_atom_pairs_create(atom_pairs_recv)
662 CALL fb_atomic_halo_list_get(atomic_halos=atomic_halos, &
667 CALL dbcsr_get_info(matrix=dbcsr_mat, &
668 nblkrows_total=nblkrows_total)
673 CALL fb_atomic_halo_get(atomic_halo=halos(ihalo), &
674 natoms=natoms_in_halo)
675 ntasks_recv = ntasks_recv + natoms_in_halo*natoms_in_halo
677 ALLOCATE (tasks_recv(task_n_records, ntasks_recv))
682 associate(dest => para_env%mepos)
685 CALL fb_atomic_halo_get(atomic_halo=halos(ihalo), &
686 natoms=natoms_in_halo, &
687 halo_atoms=halo_atoms)
688 DO iatom = 1, natoms_in_halo
689 iatom_global = halo_atoms(iatom)
690 DO jatom = 1, natoms_in_halo
691 jatom_global = halo_atoms(jatom)
694 IF (jatom_global .GE. iatom_global)
THEN
697 CALL dbcsr_get_stored_coordinates(dbcsr_mat, &
708 tasks_recv(task_dest, itask) = dest
709 tasks_recv(task_src, itask) = src
710 CALL fb_com_tasks_encode_pair(tasks_recv(task_pair, itask), &
711 iatom_global, jatom_global, &
714 tasks_recv(task_cost, itask) = 0
723 ntasks_recv = itask - 1
726 CALL fb_com_tasks_create(com_tasks_recv)
727 CALL fb_com_tasks_create(com_tasks_send)
729 CALL fb_com_tasks_set(com_tasks=com_tasks_recv, &
730 task_dim=task_n_records, &
731 ntasks=ntasks_recv, &
732 nencode=nblkrows_total, &
736 CALL fb_com_tasks_transpose_dest_src(com_tasks_recv,
">", com_tasks_send, &
739 CALL fb_com_tasks_get(com_tasks=com_tasks_send, &
740 ntasks=ntasks_send, &
752 DO itask = 1, ntasks_send
753 pair = tasks_send(task_pair, itask)
754 CALL fb_com_tasks_decode_pair(pair, iatom_global, jatom_global, nencode)
756 CALL dbcsr_get_block_p(matrix=dbcsr_mat, row=iatom_global, &
757 col=jatom_global, block=mat_block, &
760 counter = counter + 1
765 tasks_send(1:task_n_records, counter) = tasks_send(1:task_n_records, itask)
773 ntasks_send = counter
776 CALL fb_com_tasks_set(com_tasks=com_tasks_send, &
781 CALL fb_com_tasks_transpose_dest_src(com_tasks_recv,
"<", com_tasks_send, &
786 CALL fb_com_tasks_build_atom_pairs(com_tasks=com_tasks_send, &
787 atom_pairs=atom_pairs_send, &
788 natoms_encode=nencode, &
790 CALL fb_com_tasks_build_atom_pairs(com_tasks=com_tasks_recv, &
791 atom_pairs=atom_pairs_recv, &
792 natoms_encode=nencode, &
796 CALL fb_com_tasks_release(com_tasks_recv)
797 CALL fb_com_tasks_release(com_tasks_send)
799 CALL timestop(handle)
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_get_stored_coordinates(matrix, row, column, processor)
...
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
Interface to the message passing library MPI.
subroutine, public fb_atomic_halo_list_get(atomic_halos, nhalos, max_nhalos, halos)
Gets attributes from an fb_atomic_halo_list object, one should only access the data content in a fb_a...
subroutine, public fb_atomic_halo_get(atomic_halo, owner_atom, owner_id_in_halo, natoms, nelectrons, halo_atoms, sorted, cost)
Gets attributes from a fb_atomic_halo object, one should only access the data content in a fb_atomic_...
subroutine, public fb_atomic_halo_atom_global2halo(atomic_halo, iatom_global, iatom_halo, found)
Given a global atomic index, convert it to its index in a given atomic halo, if found....
logical function, public fb_atomic_halo_has_data(atomic_halo)
Checks if a fb_atomic_halo object is associated with an actual data content or not.
subroutine, public fb_atmatrix_calc_size(dbcsr_mat, atomic_halo, nrows, ncols, blk_row_start, blk_col_start)
Calculates the atomic matrix size from a given DBCSR matrix and atomic halo. It also calculates the f...
subroutine, public fb_atmatrix_generate_com_pairs_2(dbcsr_mat, atomic_halos, para_env, atom_pairs_send, atom_pairs_recv)
generate list of blocks (atom pairs) of a DBCSR matrix to be sent and received in order to construct ...
subroutine, public fb_atmatrix_construct_2(matrix_storage, atomic_halo, atomic_matrix, blk_row_start, blk_col_start)
Constructs atomic matrix for filter basis method from a given DBCSR matrix and a set of atomic send a...
subroutine, public fb_atmatrix_construct(dbcsr_mat, atomic_halo, para_env, atomic_matrix, blk_row_start, blk_col_start)
Constructs atomic matrix for filter basis method from a given DBCSR matrix and a set of atomic send a...
subroutine, public fb_com_atom_pairs_init(atom_pairs)
Initialises an fb_com_atom_pairs object, and makes it empty.
integer, parameter, public task_pair
subroutine, public fb_com_atom_pairs_decode(ind, pe, iatom, jatom, natoms)
Decodes a single integer into the (rank, iatom, jatom) index of a communication task to send/receive ...
integer, parameter, public task_src
subroutine, public fb_com_tasks_nullify(com_tasks)
Nullifies a fb_com_tasks object, note that it does not release the original object....
subroutine, public fb_com_tasks_encode_pair(ind, iatom, jatom, natoms)
Encodes (iatom, jatom) pair index of a block into a single integer.
subroutine, public fb_com_tasks_decode_pair(ind, iatom, jatom, natoms)
Dncodes a single integer into (iatom, jatom) pair index of a block into a single.
subroutine, public fb_com_tasks_get(com_tasks, task_dim, ntasks, nencode, tasks)
Gets attributes from a fb_com_tasks object, one should only access the data content in a fb_com_tasks...
subroutine, public fb_com_tasks_build_atom_pairs(com_tasks, atom_pairs, natoms_encode, send_or_recv)
Generate send or receive atom_pair lists from a com_tasks object. atom_pair list is used as a condens...
subroutine, public fb_com_atom_pairs_create(atom_pairs)
Creates and initialises an empty fb_com_atom_pairs object.
subroutine, public fb_com_tasks_transpose_dest_src(tasks_dest_is_me, direction, tasks_src_is_me, para_env)
Start from a local set of tasks that has desc/src process equal to the local MPI rank,...
logical function, public fb_com_atom_pairs_has_data(atom_pairs)
Checks if a fb_com_atom_pairs object is associated with an actual data content or not.
subroutine, public fb_com_atom_pairs_get(atom_pairs, npairs, natoms_encode, pairs)
Gets attributes from a fb_com_atom_pairs object, one should only access the data content in a fb_com_...
subroutine, public fb_com_atom_pairs_nullify(atom_pairs)
Nullifies a fb_com_atom_pairs object, note that it does not release the original object....
subroutine, public fb_com_atom_pairs_release(atom_pairs)
Releases an fb_com_atom_pairs object.
subroutine, public fb_com_tasks_create(com_tasks)
Creates and initialises an empty fb_com_tasks object.
integer, parameter, public task_cost
subroutine, public fb_com_tasks_release(com_tasks)
Releases an fb_com_tasks object.
subroutine, public fb_com_tasks_set(com_tasks, task_dim, ntasks, nencode, tasks)
Sets attributes in a fb_com_tasks object, one should only access the data content in a fb_com_tasks o...
integer, parameter, public task_dest
integer, parameter, public task_n_records
subroutine, public fb_com_atom_pairs_calc_buffer_sizes(atom_pairs, nprocs, row_blk_sizes, col_blk_sizes, sendrecv_sizes, sendrecv_disps, sendrecv_pair_counts, sendrecv_pair_disps)
Calculate the MPI send or recv buffer sizes according to the communication pairs (atom_pairs) and DBC...
pure logical function, public fb_matrix_data_has_data(matrix_data)
check if the object has data associated to it
subroutine, public fb_matrix_data_get(matrix_data, row, col, blk_p, found)
retrieve a matrix block from a matrix_data object
stores all the informations relevant to an mpi environment
defines a fb_atomic_halo_list object
defines a fb_atomic_halo object
defines a fb_com_atom_pairs object
defines a fb_com_tasks object
the object container which allows for the creation of an array of pointers to fb_matrix_data objects