26 dbt_copy_matrix_to_tensor,&
27 dbt_copy_tensor_to_matrix,&
36#include "./base/base_uses.f90"
42 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'gw_communication'
48 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: msg => null()
49 INTEGER,
DIMENSION(:),
POINTER :: sizes => null()
50 INTEGER,
DIMENSION(:, :),
POINTER :: indx => null()
52 INTEGER :: msg_req = -1
72 INTEGER,
DIMENSION(:, :),
OPTIONAL :: atom_ranges
74 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fm_to_local_tensor'
77 TYPE(dbt_type) :: tensor_tmp
79 CALL timeset(routinen, handle)
84 IF (
PRESENT(atom_ranges))
THEN
85 CALL global_matrix_to_local_matrix(mat_global, mat_local, bs_env%para_env, &
86 bs_env%para_env_tensor%num_pe, atom_ranges)
88 CALL global_matrix_to_local_matrix(mat_global, mat_local, bs_env%para_env, &
89 bs_env%para_env_tensor%num_pe)
91 CALL dbt_create(mat_local, tensor_tmp)
92 CALL dbt_copy_matrix_to_tensor(mat_local, tensor_tmp)
93 CALL dbt_copy(tensor_tmp,
tensor, move_data=.true.)
94 CALL dbt_destroy(tensor_tmp)
115 CHARACTER(LEN=*),
PARAMETER :: routinen =
'local_dbt_to_global_mat'
119 CALL timeset(routinen, handle)
121 CALL dbt_copy_tensor_to_matrix(
tensor, mat_tensor)
126 CALL local_matrix_to_global_matrix(mat_tensor, mat_global, para_env)
128 CALL timestop(handle)
140 SUBROUTINE global_matrix_to_local_matrix(mat_global, mat_local, para_env, num_pe_sub, atom_ranges)
143 INTEGER :: num_pe_sub
144 INTEGER,
DIMENSION(:, :),
OPTIONAL :: atom_ranges
146 CHARACTER(LEN=*),
PARAMETER :: routinen =
'global_matrix_to_local_matrix'
148 INTEGER :: block_counter, block_offset, block_size, col, col_from_buffer, col_offset, &
149 col_size, handle, handle1, i_block, i_entry, i_mepos, igroup, imep, imep_sub, msg_offset, &
150 nblkrows_total, ngroup, nmo, num_blocks, offset, row, row_from_buffer, row_offset, &
151 row_size, total_num_entries
152 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: blk_counter, cols_to_alloc, entry_counter, &
153 num_entries_blocks_rec, num_entries_blocks_send, row_block_from_index, rows_to_alloc, &
154 sizes_rec, sizes_send
155 INTEGER,
DIMENSION(:),
POINTER :: row_blk_offset, row_blk_size
156 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_block
157 TYPE(buffer_type),
ALLOCATABLE,
DIMENSION(:) :: buffer_rec, buffer_send
160 CALL timeset(routinen, handle)
162 CALL timeset(
"get_sizes", handle1)
166 ALLOCATE (num_entries_blocks_send(0:2*para_env%num_pe - 1))
167 num_entries_blocks_send(:) = 0
169 ALLOCATE (num_entries_blocks_rec(0:2*para_env%num_pe - 1))
170 num_entries_blocks_rec(:) = 0
172 ngroup = para_env%num_pe/num_pe_sub
178 row_size=row_size, col_size=col_size, &
179 row_offset=row_offset, col_offset=col_offset)
183 DO igroup = 0, ngroup - 1
185 IF (
PRESENT(atom_ranges))
THEN
186 IF (row < atom_ranges(1, igroup + 1) .OR. row > atom_ranges(2, igroup + 1)) cycle
188 imep = imep_sub + igroup*num_pe_sub
190 num_entries_blocks_send(2*imep) = num_entries_blocks_send(2*imep) + row_size*col_size
191 num_entries_blocks_send(2*imep + 1) = num_entries_blocks_send(2*imep + 1) + 1
199 CALL timestop(handle1)
201 CALL timeset(
"send_sizes_1", handle1)
203 total_num_entries = sum(num_entries_blocks_send)
204 CALL para_env%sum(total_num_entries)
206 CALL timestop(handle1)
208 CALL timeset(
"send_sizes_2", handle1)
210 IF (para_env%num_pe > 1)
THEN
211 CALL para_env%alltoall(num_entries_blocks_send, num_entries_blocks_rec, 2)
213 num_entries_blocks_rec(0:1) = num_entries_blocks_send(0:1)
216 CALL timestop(handle1)
218 CALL timeset(
"get_data", handle1)
220 ALLOCATE (buffer_rec(0:para_env%num_pe - 1))
221 ALLOCATE (buffer_send(0:para_env%num_pe - 1))
224 DO imep = 0, para_env%num_pe - 1
226 ALLOCATE (buffer_rec(imep)%msg(num_entries_blocks_rec(2*imep)))
227 buffer_rec(imep)%msg = 0.0_dp
229 ALLOCATE (buffer_send(imep)%msg(num_entries_blocks_send(2*imep)))
230 buffer_send(imep)%msg = 0.0_dp
232 ALLOCATE (buffer_rec(imep)%indx(num_entries_blocks_rec(2*imep + 1), 3))
233 buffer_rec(imep)%indx = 0
235 ALLOCATE (buffer_send(imep)%indx(num_entries_blocks_send(2*imep + 1), 3))
236 buffer_send(imep)%indx = 0
240 ALLOCATE (entry_counter(0:para_env%num_pe - 1))
243 ALLOCATE (blk_counter(0:para_env%num_pe - 1))
250 row_size=row_size, col_size=col_size, &
251 row_offset=row_offset, col_offset=col_offset)
255 DO igroup = 0, ngroup - 1
257 IF (
PRESENT(atom_ranges))
THEN
258 IF (row < atom_ranges(1, igroup + 1) .OR. row > atom_ranges(2, igroup + 1)) cycle
261 imep = imep_sub + igroup*num_pe_sub
263 msg_offset = entry_counter(imep)
265 block_size = row_size*col_size
267 buffer_send(imep)%msg(msg_offset + 1:msg_offset + block_size) = &
268 reshape(data_block(1:row_size, 1:col_size), (/block_size/))
270 entry_counter(imep) = entry_counter(imep) + block_size
272 blk_counter(imep) = blk_counter(imep) + 1
274 block_offset = blk_counter(imep)
276 buffer_send(imep)%indx(block_offset, 1) = row
277 buffer_send(imep)%indx(block_offset, 2) = col
278 buffer_send(imep)%indx(block_offset, 3) = msg_offset
286 CALL timestop(handle1)
288 CALL timeset(
"send_data", handle1)
290 ALLOCATE (sizes_rec(0:para_env%num_pe - 1))
291 ALLOCATE (sizes_send(0:para_env%num_pe - 1))
293 DO imep = 0, para_env%num_pe - 1
294 sizes_send(imep) = num_entries_blocks_send(2*imep)
295 sizes_rec(imep) = num_entries_blocks_rec(2*imep)
298 CALL communicate_buffer(para_env, sizes_rec, sizes_send, buffer_rec, buffer_send)
300 CALL timestop(handle1)
302 CALL timeset(
"row_block_from_index", handle1)
305 nblkrows_total=nblkrows_total, &
306 row_blk_offset=row_blk_offset, &
307 row_blk_size=row_blk_size)
309 ALLOCATE (row_block_from_index(nmo))
310 row_block_from_index = 0
313 DO i_block = 1, nblkrows_total
315 IF (i_entry >= row_blk_offset(i_block) .AND. &
316 i_entry <= row_blk_offset(i_block) + row_blk_size(i_block) - 1)
THEN
318 row_block_from_index(i_entry) = i_block
325 CALL timestop(handle1)
327 CALL timeset(
"reserve_blocks", handle1)
332 DO imep = 0, para_env%num_pe - 1
333 num_blocks = num_blocks + num_entries_blocks_rec(2*imep + 1)
336 ALLOCATE (rows_to_alloc(num_blocks))
339 ALLOCATE (cols_to_alloc(num_blocks))
344 DO i_mepos = 0, para_env%num_pe - 1
346 DO i_block = 1, num_entries_blocks_rec(2*i_mepos + 1)
348 block_counter = block_counter + 1
350 rows_to_alloc(block_counter) = buffer_rec(i_mepos)%indx(i_block, 1)
351 cols_to_alloc(block_counter) = buffer_rec(i_mepos)%indx(i_block, 2)
363 CALL timestop(handle1)
365 CALL timeset(
"fill_mat_local", handle1)
372 row_size=row_size, col_size=col_size)
374 DO imep = 0, para_env%num_pe - 1
376 DO i_block = 1, num_entries_blocks_rec(2*imep + 1)
378 row_from_buffer = buffer_rec(imep)%indx(i_block, 1)
379 col_from_buffer = buffer_rec(imep)%indx(i_block, 2)
380 offset = buffer_rec(imep)%indx(i_block, 3)
382 IF (row == row_from_buffer .AND. col == col_from_buffer)
THEN
384 data_block(1:row_size, 1:col_size) = &
385 reshape(buffer_rec(imep)%msg(offset + 1:offset + row_size*col_size), &
386 (/row_size, col_size/))
398 CALL timestop(handle1)
400 DO imep = 0, para_env%num_pe - 1
401 DEALLOCATE (buffer_rec(imep)%msg)
402 DEALLOCATE (buffer_rec(imep)%indx)
403 DEALLOCATE (buffer_send(imep)%msg)
404 DEALLOCATE (buffer_send(imep)%indx)
407 CALL timestop(handle)
409 END SUBROUTINE global_matrix_to_local_matrix
421 SUBROUTINE communicate_buffer(para_env, num_entries_rec, num_entries_send, &
422 buffer_rec, buffer_send, do_indx, do_msg)
425 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: num_entries_rec, num_entries_send
426 TYPE(buffer_type),
ALLOCATABLE,
DIMENSION(:) :: buffer_rec, buffer_send
427 LOGICAL,
OPTIONAL :: do_indx, do_msg
429 CHARACTER(LEN=*),
PARAMETER :: routinen =
'communicate_buffer'
431 INTEGER :: handle, imep, rec_counter, send_counter
432 LOGICAL :: my_do_indx, my_do_msg
435 CALL timeset(routinen, handle)
438 ALLOCATE (req(1:para_env%num_pe, 4))
441 IF (
PRESENT(do_indx)) my_do_indx = do_indx
443 IF (
PRESENT(do_msg)) my_do_msg = do_msg
445 IF (para_env%num_pe > 1)
THEN
450 DO imep = 0, para_env%num_pe - 1
451 IF (num_entries_rec(imep) > 0)
THEN
452 rec_counter = rec_counter + 1
454 CALL para_env%irecv(buffer_rec(imep)%indx, imep, req(rec_counter, 3), tag=4)
457 CALL para_env%irecv(buffer_rec(imep)%msg, imep, req(rec_counter, 4), tag=7)
462 DO imep = 0, para_env%num_pe - 1
463 IF (num_entries_send(imep) > 0)
THEN
464 send_counter = send_counter + 1
466 CALL para_env%isend(buffer_send(imep)%indx, imep, req(send_counter, 1), tag=4)
469 CALL para_env%isend(buffer_send(imep)%msg, imep, req(send_counter, 2), tag=7)
486 buffer_rec(0)%indx = buffer_send(0)%indx
487 buffer_rec(0)%msg = buffer_send(0)%msg
493 CALL timestop(handle)
495 END SUBROUTINE communicate_buffer
503 SUBROUTINE local_matrix_to_global_matrix(mat_local, mat_global, para_env)
508 CHARACTER(LEN=*),
PARAMETER :: routinen =
'local_matrix_to_global_matrix'
510 INTEGER :: block_size, c, col, col_size, handle, &
511 handle1, i_block, imep, o, offset, r, &
512 rec_counter, row, row_size, &
514 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: block_counter, entry_counter, num_blocks_rec, &
515 num_blocks_send, num_entries_rec, num_entries_send, sizes_rec, sizes_send
516 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: data_block
517 TYPE(buffer_type),
ALLOCATABLE,
DIMENSION(:) :: buffer_rec, buffer_send
522 CALL timeset(routinen, handle)
524 CALL timeset(
"get_coord", handle1)
532 ALLOCATE (buffer_rec(0:para_env%num_pe - 1))
533 ALLOCATE (buffer_send(0:para_env%num_pe - 1))
535 ALLOCATE (num_entries_rec(0:para_env%num_pe - 1))
536 ALLOCATE (num_blocks_rec(0:para_env%num_pe - 1))
537 ALLOCATE (num_entries_send(0:para_env%num_pe - 1))
538 ALLOCATE (num_blocks_send(0:para_env%num_pe - 1))
548 row_size=row_size, col_size=col_size)
552 num_entries_send(imep) = num_entries_send(imep) + row_size*col_size
553 num_blocks_send(imep) = num_blocks_send(imep) + 1
559 CALL timestop(handle1)
561 CALL timeset(
"comm_size", handle1)
563 IF (para_env%num_pe > 1)
THEN
565 ALLOCATE (sizes_rec(0:2*para_env%num_pe - 1))
566 ALLOCATE (sizes_send(0:2*para_env%num_pe - 1))
568 DO imep = 0, para_env%num_pe - 1
570 sizes_send(2*imep) = num_entries_send(imep)
571 sizes_send(2*imep + 1) = num_blocks_send(imep)
575 CALL para_env%alltoall(sizes_send, sizes_rec, 2)
577 DO imep = 0, para_env%num_pe - 1
578 num_entries_rec(imep) = sizes_rec(2*imep)
579 num_blocks_rec(imep) = sizes_rec(2*imep + 1)
582 DEALLOCATE (sizes_rec, sizes_send)
586 num_entries_rec(0) = num_entries_send(0)
587 num_blocks_rec(0) = num_blocks_send(0)
591 CALL timestop(handle1)
593 CALL timeset(
"fill_buffer", handle1)
596 DO imep = 0, para_env%num_pe - 1
598 ALLOCATE (buffer_rec(imep)%msg(num_entries_rec(imep)))
599 buffer_rec(imep)%msg = 0.0_dp
601 ALLOCATE (buffer_send(imep)%msg(num_entries_send(imep)))
602 buffer_send(imep)%msg = 0.0_dp
604 ALLOCATE (buffer_rec(imep)%indx(num_blocks_rec(imep), 5))
605 buffer_rec(imep)%indx = 0
607 ALLOCATE (buffer_send(imep)%indx(num_blocks_send(imep), 5))
608 buffer_send(imep)%indx = 0
612 ALLOCATE (block_counter(0:para_env%num_pe - 1))
615 ALLOCATE (entry_counter(0:para_env%num_pe - 1))
623 row_size=row_size, col_size=col_size)
627 block_size = row_size*col_size
629 offset = entry_counter(imep)
631 buffer_send(imep)%msg(offset + 1:offset + block_size) = &
632 reshape(data_block(1:row_size, 1:col_size), (/block_size/))
634 i_block = block_counter(imep) + 1
636 buffer_send(imep)%indx(i_block, 1) = row
637 buffer_send(imep)%indx(i_block, 2) = col
638 buffer_send(imep)%indx(i_block, 3) = offset
640 entry_counter(imep) = entry_counter(imep) + block_size
642 block_counter(imep) = block_counter(imep) + 1
648 CALL timestop(handle1)
650 CALL timeset(
"comm_data", handle1)
653 ALLOCATE (req(1:para_env%num_pe, 4))
655 IF (para_env%num_pe > 1)
THEN
660 DO imep = 0, para_env%num_pe - 1
661 IF (num_entries_rec(imep) > 0)
THEN
662 rec_counter = rec_counter + 1
663 CALL para_env%irecv(buffer_rec(imep)%indx, imep, req(rec_counter, 3), tag=4)
665 IF (num_entries_rec(imep) > 0)
THEN
666 CALL para_env%irecv(buffer_rec(imep)%msg, imep, req(rec_counter, 4), tag=7)
670 DO imep = 0, para_env%num_pe - 1
671 IF (num_entries_send(imep) > 0)
THEN
672 send_counter = send_counter + 1
673 CALL para_env%isend(buffer_send(imep)%indx, imep, req(send_counter, 1), tag=4)
675 IF (num_entries_send(imep) > 0)
THEN
676 CALL para_env%isend(buffer_send(imep)%msg, imep, req(send_counter, 2), tag=7)
685 buffer_rec(0)%indx = buffer_send(0)%indx
686 buffer_rec(0)%msg = buffer_send(0)%msg
690 CALL timestop(handle1)
692 CALL timeset(
"set_blocks", handle1)
699 row_size=row_size, col_size=col_size)
701 DO imep = 0, para_env%num_pe - 1
703 DO i_block = 1, num_blocks_rec(imep)
705 IF (row == buffer_rec(imep)%indx(i_block, 1) .AND. &
706 col == buffer_rec(imep)%indx(i_block, 2))
THEN
708 offset = buffer_rec(imep)%indx(i_block, 3)
714 data_block(1:r, 1:c) = data_block(1:r, 1:c) + &
715 reshape(buffer_rec(imep)%msg(o + 1:o + r*c), (/r, c/))
734 DO imep = 0, para_env%num_pe - 1
735 DEALLOCATE (buffer_rec(imep)%msg)
736 DEALLOCATE (buffer_send(imep)%msg)
737 DEALLOCATE (buffer_rec(imep)%indx)
738 DEALLOCATE (buffer_send(imep)%indx)
741 DEALLOCATE (buffer_rec, buffer_send)
743 DEALLOCATE (block_counter, entry_counter)
750 CALL timestop(handle1)
752 CALL timestop(handle)
754 END SUBROUTINE local_matrix_to_global_matrix
766 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: array_s
767 REAL(kind=
dp),
OPTIONAL :: weight
768 LOGICAL,
OPTIONAL :: add
770 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fm_to_local_array'
772 INTEGER :: handle, i, i_row_local, img, j, &
773 j_col_local, n_basis, ncol_local, &
775 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
777 REAL(kind=
dp) :: my_weight
778 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: array_tmp
780 CALL timeset(routinen, handle)
783 IF (
PRESENT(weight)) my_weight = weight
786 IF (
PRESENT(add)) my_add = add
788 n_basis =
SIZE(array_s, 1)
789 nimages =
SIZE(array_s, 3)
792 cpassert(
SIZE(array_s, 2) == n_basis)
793 cpassert(
SIZE(fm_s) == nimages)
794 cpassert(lbound(array_s, 1) == 1)
795 cpassert(lbound(array_s, 2) == 1)
796 cpassert(lbound(array_s, 3) == 1)
799 nrow_local=nrow_local, &
800 ncol_local=ncol_local, &
801 row_indices=row_indices, &
802 col_indices=col_indices)
804 IF (.NOT. my_add) array_s(:, :, :) = 0.0_dp
805 ALLOCATE (array_tmp(
SIZE(array_s, 1),
SIZE(array_s, 2),
SIZE(array_s, 3)))
806 array_tmp(:, :, :) = 0.0_dp
809 DO i_row_local = 1, nrow_local
811 i = row_indices(i_row_local)
813 DO j_col_local = 1, ncol_local
815 j = col_indices(j_col_local)
817 array_tmp(i, j, img) = fm_s(img)%local_data(i_row_local, j_col_local)
823 CALL fm_s(1)%matrix_struct%para_env%sync()
824 CALL fm_s(1)%matrix_struct%para_env%sum(array_tmp)
825 CALL fm_s(1)%matrix_struct%para_env%sync()
827 array_s(:, :, :) = array_s(:, :, :) + my_weight*array_tmp(:, :, :)
829 CALL timestop(handle)
841 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: array_s
843 REAL(kind=
dp),
OPTIONAL :: weight
844 LOGICAL,
OPTIONAL :: add
846 CHARACTER(LEN=*),
PARAMETER :: routinen =
'local_array_to_fm'
848 INTEGER :: handle, i, i_row_local, img, j, &
849 j_col_local, n_basis, ncol_local, &
851 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
853 REAL(kind=
dp) :: my_weight, s_ij
855 CALL timeset(routinen, handle)
858 IF (
PRESENT(weight)) my_weight = weight
861 IF (
PRESENT(add)) my_add = add
863 n_basis =
SIZE(array_s, 1)
864 nimages =
SIZE(array_s, 3)
867 cpassert(
SIZE(array_s, 2) == n_basis)
868 cpassert(
SIZE(fm_s) == nimages)
869 cpassert(lbound(array_s, 1) == 1)
870 cpassert(lbound(array_s, 2) == 1)
871 cpassert(lbound(array_s, 3) == 1)
874 nrow_local=nrow_local, &
875 ncol_local=ncol_local, &
876 row_indices=row_indices, &
877 col_indices=col_indices)
881 DO i_row_local = 1, nrow_local
883 i = row_indices(i_row_local)
885 DO j_col_local = 1, ncol_local
887 j = col_indices(j_col_local)
890 s_ij = fm_s(img)%local_data(i_row_local, j_col_local) + &
891 array_s(i, j, img)*my_weight
893 s_ij = array_s(i, j, img)*my_weight
895 fm_s(img)%local_data(i_row_local, j_col_local) = s_ij
903 CALL timestop(handle)
916 TYPE(dbt_type),
DIMENSION(:) :: t_r
921 CHARACTER(LEN=*),
PARAMETER :: routinen =
'local_dbt_to_global_fm'
923 INTEGER :: handle, i_cell, n_images
925 CALL timeset(routinen, handle)
929 cpassert(n_images ==
SIZE(fm_r))
931 DO i_cell = 1, n_images
932 CALL dbcsr_set(mat_global%matrix, 0.0_dp)
939 CALL timestop(handle)
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
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_reserve_blocks(matrix, rows, cols)
...
subroutine, public dbcsr_get_stored_coordinates(matrix, row, column, processor)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_finalize(matrix)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_reserve_all_blocks(matrix)
Reserves all blocks.
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
This is the start of a dbt_api, all publically needed functions are exported here....
subroutine, public fm_to_local_tensor(fm_global, mat_global, mat_local, tensor, bs_env, atom_ranges)
...
subroutine, public local_dbt_to_global_mat(tensor, mat_tensor, mat_global, para_env)
...
subroutine, public local_dbt_to_global_fm(t_r, fm_r, mat_global, mat_local, bs_env)
...
subroutine, public local_array_to_fm(array_s, fm_s, weight, add)
...
subroutine, public fm_to_local_array(fm_s, array_s, weight, add)
...
Defines the basic variable types.
integer, parameter, public dp
Interface to the message passing library MPI.
stores all the informations relevant to an mpi environment