82 SUBROUTINE get_fint(ndim,nrows,nnz,nstart,rp_k,cval_k,aval_k,dispin,fint)
93 INTEGER :: ndim, nrows, nnz, nstart
94 INTEGER,
DIMENSION(nrows+1) :: rp_k
95 INTEGER,
DIMENSION(nnz) :: cval_k
96 REAL(kind=wp),
DIMENSION(nnz) :: aval_k
97 REAL(kind=wp),
DIMENSION(nrows) :: dispin
100 REAL(kind=wp),
DIMENSION(nrows) :: fint
103 REAL(kind=wp),
DIMENSION(ndim) :: disptemp
104 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: numdispfrom
105 REAL(kind=wp),
ALLOCATABLE,
DIMENSION(:) :: bufsnd
106 INTEGER ::
i,
j,
k,
m, counter1, counter2
107 REAL(kind=wp) :: tempval
108 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: req_rcv, req_snd
109 INTEGER,
ALLOCATABLE,
DIMENSION(:,:) :: stat_rcv, stat_snd
117 CALL mpi_barrier(rocstar_communicator,ierr)
118 ALLOCATE(req_rcv(1:nprocs))
119 ALLOCATE(req_snd(1:nprocs))
120 ALLOCATE(stat_snd(1:mpi_status_size,1:nprocs))
121 ALLOCATE(stat_rcv(1:mpi_status_size,1:nprocs))
122 ALLOCATE(numdispfrom(1:nprocs))
126 DO j = 1, mpi_status_size
132 IF (
i-1 /= myid)
THEN
133 CALL mpi_irecv(numdispfrom(
i),1, &
134 mpi_integer,
i-1,10,rocstar_communicator, &
139 IF (
i-1 /= myid)
THEN
142 CALL mpi_send(nrows,1,mpi_integer, &
143 i-1,10,rocstar_communicator,ierr)
146 CALL mpi_waitall(nprocs,req_rcv,stat_rcv,ierr)
159 CALL mpi_barrier(rocstar_communicator,ierr)
160 ALLOCATE(req_rcv(1:nprocs))
161 ALLOCATE(req_snd(1:nprocs))
162 ALLOCATE(stat_snd(1:mpi_status_size,1:nprocs))
163 ALLOCATE(stat_rcv(1:mpi_status_size,1:nprocs))
167 DO j = 1, mpi_status_size
172 ALLOCATE(frmproc(1:nprocs))
174 IF (
i-1 /= myid)
THEN
175 ALLOCATE(frmproc(
i)%rcvbuf(1:4*int(numdispfrom(
i)/3)))
176 CALL mpi_irecv(frmproc(
i)%rcvbuf(1),4*int(numdispfrom(
i)/3), &
177 mpi_double_precision,
i-1,10,rocstar_communicator, &
182 IF (
i-1 /= myid)
THEN
183 ALLOCATE(bufsnd(1:4*lnumnp))
186 IF ((global2local(
j) /= -1) .AND. (nodeproc(global2local(
j)) == myid))
THEN
187 counter1 = counter1 + 1
188 bufsnd(4*counter1-3) =
j
189 bufsnd(4*counter1-2) = dispin(3*counter1-2)
190 bufsnd(4*counter1-1) = dispin(3*counter1-1)
191 bufsnd(4*counter1) = dispin(3*counter1)
196 CALL mpi_send(bufsnd,4*int(nrows/3),mpi_double_precision, &
197 i-1,10,rocstar_communicator,ierr)
203 CALL mpi_waitall(nprocs,req_rcv,stat_rcv,ierr)
214 IF ((global2local(
i) /= -1) .AND. (nodeproc(global2local(
i)) == myid))
THEN
215 disptemp( 3*
i - 2 ) = dispin( 3*(
i - (nstart-1)/3)-2 )
216 disptemp( 3*
i - 1 ) = dispin( 3*(
i - (nstart-1)/3)-1 )
217 disptemp( 3*
i ) = dispin( 3*(
i - (nstart-1)/3) )
220 IF (
j-1 /= myid)
THEN
221 DO m = 1, int(numdispfrom(
j)/3)
222 IF (int(frmproc(
j)%rcvbuf(4*
m-3)) ==
i)
THEN
223 disptemp( 3*
i - 2 ) = frmproc(
j)%rcvbuf(4*
m-2)
224 disptemp( 3*
i - 1 ) = frmproc(
j)%rcvbuf(4*
m-1)
225 disptemp( 3*
i ) = frmproc(
j)%rcvbuf(4*
m)
232 IF (nprocs > 1)
DEALLOCATE(frmproc)
238 CALL
comp_row_vecmult(3*gnumnp,nrows,nnz,nstart,rp_k,cval_k,aval_k,disptemp,fint)
subroutine comp_row_vecmult(gndim, nrows1, nnz1, nstart1, rp1, cval1, aval1, vec, ans)
subroutine get_fint(ndim, nrows, nnz, nstart, rp_k, cval_k, aval_k, dispin, fint)