17 & ( n, m, neibpetot, neibpe, &
18 & stack_import, nod_import, &
19 & stack_export, nod_export, ws, wr, x, &
20 & solver_comm,my_rank)
27 integer(kind=kint ) ,
intent(in) :: N, m
28 integer(kind=kint ) ,
intent(in) :: NEIBPETOT
29 integer(kind=kint ),
pointer :: NEIBPE (:)
30 integer(kind=kint ),
pointer :: STACK_IMPORT(:)
31 integer(kind=kint ),
pointer :: NOD_IMPORT (:)
32 integer(kind=kint ),
pointer :: STACK_EXPORT(:)
33 integer(kind=kint ),
pointer :: NOD_EXPORT (:)
34 integer(kind=kint ),
dimension(: ),
intent(inout):: WS
35 integer(kind=kint ),
dimension(: ),
intent(inout):: WR
36 integer(kind=kint ),
dimension(: ),
intent(inout):: X
37 integer(kind=kint ) ,
intent(in) ::SOLVER_COMM
38 integer(kind=kint ) ,
intent(in) :: my_rank
41 integer(kind=kint ),
dimension(:,:),
allocatable :: sta1
42 integer(kind=kint ),
dimension(:,:),
allocatable :: sta2
43 integer(kind=kint ),
dimension(: ),
allocatable :: req1
44 integer(kind=kint ),
dimension(: ),
allocatable :: req2
46 integer(kind=kint ),
save :: NFLAG
49 integer(kind=kint ) :: neib,istart,inum,k,ii,kk,ierr,nreq1,nreq2
52 allocate (sta1(mpi_status_size,neibpetot))
53 allocate (sta2(mpi_status_size,neibpetot))
54 allocate (req1(neibpetot))
55 allocate (req2(neibpetot))
61 istart= stack_export(neib-1)
62 inum = stack_export(neib ) - istart
65 do k= istart+1, istart+inum
68 ws(m*k-kk+1)= x(ii-kk+1)
72 call mpi_isend (ws(m*istart+1), m*inum, mpi_integer, &
73 & neibpe(neib), 0, solver_comm, req1(nreq1), ierr)
80 istart= stack_import(neib-1)
81 inum = stack_import(neib ) - istart
84 call mpi_irecv (wr(m*istart+1), m*inum, mpi_integer, &
85 & neibpe(neib), 0, solver_comm, req2(nreq2), ierr)
88 call mpi_waitall (nreq2, req2, sta2, ierr)
91 istart= stack_import(neib-1)
92 inum = stack_import(neib ) - istart
93 do k= istart+1, istart+inum
96 x(ii-kk+1)= wr(m*k-kk+1)
101 call mpi_waitall (nreq1, req1, sta1, ierr)
103 deallocate (sta1, sta2, req1, req2)
111 & ( n, m, neibpetot, neibpe, stack_import, nod_import, &
112 & stack_export, nod_export, &
113 & ws, wr, x, solver_comm,my_rank)
118 integer(kind=kint ) ,
intent(in) :: N, M
119 integer(kind=kint ) ,
intent(in) :: NEIBPETOT
120 integer(kind=kint ),
pointer :: NEIBPE (:)
121 integer(kind=kint ),
pointer :: STACK_IMPORT(:)
122 integer(kind=kint ),
pointer :: NOD_IMPORT (:)
123 integer(kind=kint ),
pointer :: STACK_EXPORT(:)
124 integer(kind=kint ),
pointer :: NOD_EXPORT (:)
125 integer(kind=kint ),
dimension(: ),
intent(inout):: WS
126 integer(kind=kint ),
dimension(: ),
intent(inout):: WR
127 integer(kind=kint ),
dimension(: ),
intent(inout):: X
128 integer(kind=kint ) ,
intent(in) ::SOLVER_COMM
129 integer(kind=kint ) ,
intent(in) :: my_rank
132 integer(kind=kint ),
dimension(:,:),
allocatable :: sta1
133 integer(kind=kint ),
dimension(:,:),
allocatable :: sta2
134 integer(kind=kint ),
dimension(: ),
allocatable :: req1
135 integer(kind=kint ),
dimension(: ),
allocatable :: req2
138 integer(kind=kint ) :: neib,istart,inum,k,kk,ii,ierr,nreq1,nreq2
141 allocate (sta1(mpi_status_size,neibpetot))
142 allocate (sta2(mpi_status_size,neibpetot))
143 allocate (req1(neibpetot))
144 allocate (req2(neibpetot))
149 do neib= 1, neibpetot
150 istart= stack_import(neib-1)
151 inum = stack_import(neib ) - istart
154 do k= istart+1, istart+inum
157 ws(m*(k-1)+kk)= x(m*(ii-1)+kk)
161 call mpi_isend (ws(m*istart+1), m*inum,mpi_integer, &
162 & neibpe(neib), 0, solver_comm, req1(nreq1), ierr)
168 do neib= 1, neibpetot
169 istart= stack_export(neib-1)
170 inum = stack_export(neib ) - istart
173 call mpi_irecv (wr(m*istart+1), m*inum, mpi_integer, &
174 & neibpe(neib), 0, solver_comm, req2(nreq2), ierr)
177 call mpi_waitall (nreq2, req2, sta2, ierr)
179 do neib= 1, neibpetot
180 istart= stack_export(neib-1)
181 inum = stack_export(neib ) - istart
182 do k= istart+1, istart+inum
185 x(m*(ii-1)+kk)= x(m*(ii-1)+kk)+wr(m*(k-1)+kk)
190 call mpi_waitall (nreq1, req1, sta1, ierr)
191 deallocate (sta1, sta2, req1, req2)