36
37
38
40
41
42
43 USE spmd_comm_world_mod, ONLY : spmd_comm_world
44#include "implicit_f.inc"
45
46
47
48#include "spmd.inc"
49
50
51
52#include "com01_c.inc"
53#include "com04_c.inc"
54#include "task_c.inc"
55
56
57
58 INTEGER, INTENT(IN) :: IAD_ELEM(2,*),FR_ELEM(*)
59 my_real ,
INTENT(INOUT) :: min_array(numnod),max_array(numnod)
60
61
62
63#ifdef MPI
64 INTEGER LENCOM,MSGOFF ,MSGTYP
65 my_real,
dimension(:),
ALLOCATABLE :: send_buf,rec_buf
66 INTEGER STATUS(MPI_STATUS_SIZE),REQ_R(NSPMD),REQ_S(NSPMD)
67 INTEGER IERROR
68 INTEGER P,J,NOD,SIZ,L,IAD
69
70 DATA msgoff/400/
71 msgtyp=msgoff
72
73 lencom = ( iad_elem(1,nspmd+1) - iad_elem(1,1) )
74
75
76 ALLOCATE(send_buf(2 * lencom),stat=ierror)
77 IF(ierror/=0) THEN
78 CALL ancmsg(msgid=20,anmode=aninfo)
80 ENDIF
81
82 ALLOCATE(rec_buf(2 * lencom),stat=ierror)
83 IF(ierror/=0) THEN
84 CALL ancmsg(msgid=20,anmode=aninfo)
86 ENDIF
87
88
89
90
91 l=1
92 DO p=1,nspmd
93 siz = iad_elem(1,p+1)-iad_elem(1,p)
94 IF(siz > 0) THEN
96 s rec_buf(l),2*siz,real,it_spmd(p),msgtyp,
97 g spmd_comm_world,req_r(p),ierror)
98 l=l+2*siz
99 ENDIF
100 ENDDO
101
102
103
104
105 l=1
106 DO p=1,nspmd
107 siz = iad_elem(1,p+1)-iad_elem(1,p)
108 IF(siz > 0)THEN
109 iad = l
110 DO j=iad_elem(1,p),iad_elem(1,p+1)-1
111 nod = fr_elem(j)
112 send_buf(l)=min_array(nod)
113 send_buf(l + 1)=max_array(nod)
114 l=l+2
115 ENDDO
116
118 s send_buf(iad),2*siz,real,it_spmd(p),msgtyp,
119 g spmd_comm_world,req_s(p),ierror)
120
121 ENDIF
122 ENDDO
123
124
125
126
127 l=1
128 DO p=1,nspmd
129 siz = iad_elem(1,p+1)-iad_elem(1,p)
130 IF(siz > 0)THEN
131 CALL mpi_wait(req_r(p),status,ierror)
132
133 DO j=iad_elem(1,p),iad_elem(1,p+1)-1
134 nod = fr_elem(j)
135 min_array(nod) =
min(min_array(nod), rec_buf(l))
136 max_array(nod) =
max(max_array(nod), rec_buf(l + 1))
137 l = l+2
138 ENDDO
139 ENDIF
140 ENDDO
141
142
143
144
145 DO p = 1, nspmd
146 IF(iad_elem(1,p+1)-iad_elem(1,p)>0)THEN
147 CALL mpi_wait(req_s(p),status,ierror)
148 ENDIF
149 ENDDO
150 IF (ALLOCATED(send_buf)) DEALLOCATE(send_buf)
151 IF (ALLOCATED(rec_buf)) DEALLOCATE(rec_buf)
152
153#endif
154
subroutine mpi_isend(buf, cnt, datatype, dest, tag, comm, ireq, ierr)
subroutine mpi_wait(ireq, status, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)