2recursive subroutine merge_recursive_&
4 (obj, np_off, nprocs, ldq, matrixcols, nblk, &
5 l_col, p_col, l_col_bc, p_col_bc, limits, &
6 np_cols, na, q, d, e, &
7 mpi_comm_all, mpi_comm_rows, mpi_comm_cols, &
8 usegpu, wantdebug, success, max_threads)
25 integer(kind=ik),
intent(in) :: max_threads
26 integer(kind=ik),
intent(in) :: mpi_comm_all, mpi_comm_rows, mpi_comm_cols
27 integer(kind=ik),
intent(in) :: ldq, matrixcols, nblk, na, np_cols
28 integer(kind=ik),
intent(in) :: l_col_bc(na), p_col_bc(na), l_col(na), p_col(na), &
30#ifdef USE_ASSUMED_SIZE
31 real(kind=real_datatype),
intent(inout) :: q(ldq,*)
33 real(kind=real_datatype),
intent(inout) :: q(ldq,matrixcols)
36 integer(kind=MPI_KIND) :: mpierr, my_pcolmpi
38 integer(kind=ik) :: my_pcol
39 real(kind=real_datatype),
intent(inout) :: d(na), e(na)
40 integer(kind=ik) :: np_off, nprocs
41 integer(kind=ik) :: np1, np2, noff, nlen, nmid, n
42 logical,
intent(in) :: usegpu, wantdebug
43 logical,
intent(out) :: success
48 call obj%timer%start(
"mpi_communication")
49 call mpi_comm_rank(int(mpi_comm_cols,kind=mpi_kind) ,my_pcolmpi, mpierr)
51 my_pcol = int(my_pcolmpi,kind=c_int)
52 call obj%timer%stop(
"mpi_communication")
58 if (wantdebug)
write(error_unit,*)
"ELPA1_merge_recursive: INTERNAL error merge_recursive: nprocs=",nprocs
67 if (np1 > 1)
call merge_recursive_&
69 (obj, np_off, np1, ldq, matrixcols, nblk, &
70 l_col, p_col, l_col_bc, p_col_bc, limits, &
71 np_cols, na, q, d, e, &
72 mpi_comm_all, mpi_comm_rows, mpi_comm_cols, &
73 usegpu, wantdebug, success, max_threads)
74 if (.not.(success))
then
75 write(error_unit,*)
"Error in merge_recursice. Aborting..."
79 if (np2 > 1)
call merge_recursive_&
81 (obj, np_off+np1, np2, ldq, matrixcols, nblk, &
82 l_col, p_col, l_col_bc, p_col_bc, limits, &
83 np_cols, na, q, d, e, &
84 mpi_comm_all, mpi_comm_rows, mpi_comm_cols, &
85 usegpu, wantdebug, success, max_threads)
86 if (.not.(success))
then
87 write(error_unit,*)
"Error in merge_recursice. Aborting..."
92 nmid = limits(np_off+np1) - noff
93 nlen = limits(np_off+nprocs) - noff
96 call obj%timer%start(
"mpi_communication")
97 if (my_pcol==np_off)
then
98 do n=np_off+np1,np_off+nprocs-1
99 call mpi_send(d(noff+1), int(nmid,kind=mpi_kind), mpi_real_precision, int(n,kind=mpi_kind), 12_mpi_kind, &
100 int(mpi_comm_cols,kind=mpi_kind), mpierr)
103 call obj%timer%stop(
"mpi_communication")
107 if (my_pcol>=np_off+np1 .and. my_pcol<np_off+nprocs)
then
109 call obj%timer%start(
"mpi_communication")
110 call mpi_recv(d(noff+1), int(nmid,kind=mpi_kind), mpi_real_precision, int(np_off,kind=mpi_kind), 12_mpi_kind, &
111 int(mpi_comm_cols,kind=mpi_kind), mpi_status_ignore, mpierr)
112 call obj%timer%stop(
"mpi_communication")
118 if (my_pcol==np_off+np1)
then
119 do n=np_off,np_off+np1-1
121 call obj%timer%start(
"mpi_communication")
122 call mpi_send(d(noff+nmid+1), int(nlen-nmid,kind=mpi_kind), mpi_real_precision, int(n,kind=mpi_kind), &
123 15_mpi_kind, int(mpi_comm_cols,kind=mpi_kind), mpierr)
124 call obj%timer%stop(
"mpi_communication")
131 if (my_pcol>=np_off .and. my_pcol<np_off+np1)
then
133 call obj%timer%start(
"mpi_communication")
134 call mpi_recv(d(noff+nmid+1), int(nlen-nmid,kind=mpi_kind), mpi_real_precision, int(np_off+np1,kind=mpi_kind), &
135 15_mpi_kind, int(mpi_comm_cols,kind=mpi_kind), mpi_status_ignore, mpierr)
136 call obj%timer%stop(
"mpi_communication")
141 if (nprocs == np_cols)
then
147 (obj, nlen, nmid, d(noff+1), e(noff+nmid), q, ldq, noff, &
148 nblk, matrixcols, int(mpi_comm_rows,kind=ik), int(mpi_comm_cols,kind=ik), &
150 l_col_bc, p_col_bc, np_off, nprocs, usegpu, wantdebug, success, max_threads)
151 if (.not.(success))
then
152 write(error_unit,*)
"Error in merge_systems: Aborting..."
160 (obj, nlen, nmid, d(noff+1), e(noff+nmid), q, ldq, noff, &
161 nblk, matrixcols, int(mpi_comm_rows,kind=ik), int(mpi_comm_cols,kind=ik), &
162 l_col(noff+1), p_col(noff+1), &
163 l_col(noff+1), p_col(noff+1), np_off, nprocs, usegpu, wantdebug, success, &
165 if (.not.(success))
then
166 write(error_unit,*)
"Error in merge_systems: Aborting..."