40
43
44
45
46 USE spmd_comm_world_mod, ONLY : spmd_comm_world
47#include "implicit_f.inc"
48
49
50
51#include "spmd.inc"
52
53
54
55#include "com01_c.inc"
56#include "task_c.inc"
57
58
59
60 INTEGER IOUT, IWIOUT
61
62
63
64#ifdef MPI
65 INTEGER MSGTYP,INFO,LOC_PROC,
66 . BUFSIZ,MSGOFF,SIZ,I,P,LEN,N,II,
67 . IOS,STATUS(MPI_STATUS_SIZE),IERROR,IBLANC,LNEW
68 INTEGER, DIMENSION(:),ALLOCATABLE :: IWA
69
70
71 INTEGER :: NINDX_PROC,SIZE_MESSAGE
72 INTEGER, DIMENSION(NSPMD) :: IWIOUT_SPMD
73 INTEGER, DIMENSION(NSPMD) :: PROC_RCV,DISPLACEMENT
74 INTEGER :: INDX,REQ_S
75 INTEGER, DIMENSION(NSPMD) :: REQ_R
76
77 DATA msgoff/105/
78 CHARACTER(LEN=NCHAROUT) :: LINE
79
80
81
82
83
84 iwiout_spmd(1:nspmd) = 0
86 . iwiout_spmd,1,mpi_integer,
87 . 0,spmd_comm_world,ierror)
88
89
90 loc_proc = ispmd + 1
91 len = ncharout
92 IF(ispmd/=0) ALLOCATE(iwa(iwiout+1))
93
94
95 IF(ispmd==0) THEN
96 nindx_proc = 0
97 size_message = 0
98
99 displacement(1:nspmd) = 0
100 DO p = 2, nspmd
101 IF(iwiout_spmd(p)/=0) THEN
102 nindx_proc = nindx_proc + 1
103 proc_rcv(nindx_proc) = p
104 displacement(nindx_proc) = size_message
105 size_message = size_message + iwiout_spmd(p) + 1
106 ENDIF
107 ENDDO
108 ALLOCATE(iwa(size_message))
109
110 DO i=1,nindx_proc
111 p = proc_rcv(i)
112 msgtyp = msgoff
113 CALL mpi_irecv(iwa(1+displacement(i)),iwiout_spmd(p)+1,mpi_integer,it_spmd(p),
114 . msgtyp,spmd_comm_world,req_r(i),ierror)
115
116
117 ENDDO
118
119 DO ii=1,nindx_proc
120 CALL mpi_waitany(nindx_proc,req_r,indx,status,ierror)
121 p = proc_rcv(indx)
122 siz = iwiout_spmd(p)
123 DO n = 1, siz, len
124
125 i = len
126 iblanc = ichar(' ')
127 DO WHILE (iwa(displacement(indx)+n+i)==iblanc.AND.i>1)
128 i = i-1
129 ENDDO
130 lnew = i
131
132 DO i = 1, lnew
133 line(i:i) = char(iwa(displacement(indx)+n+i))
134 ENDDO
135 WRITE(iout,fmt='(A)')line(1:lnew)
136 ENDDO
137 ENDDO
138
139
140 ELSE
141
142
144 ios = 0
145 siz = 1
146
147 DO WHILE(ios==0)
148 READ(unit=iout,iostat=ios,fmt='(A)') line
149 IF(ios==0) THEN
150 DO i = 1, len
151 iwa(siz+i) = ichar(line(i:i))
152 ENDDO
153 siz = siz + len
154 ENDIF
155 ENDDO
156
157 iwa(1) = siz-1
158 rewind(unit=iout)
159 WRITE(unit=iout,iostat=ios,fmt='(A)')
160 msgtyp = msgoff
161 CALL mpi_isend(iwa ,siz ,mpi_integer,it_spmd(1),
162 . msgtyp,spmd_comm_world,req_s,ierror )
163
165
166 ENDIF
167 ENDIF
168
169 DEALLOCATE(iwa)
170
171
172#endif
173 RETURN
subroutine mpi_isend(buf, cnt, datatype, dest, tag, comm, ireq, ierr)
subroutine mpi_wait(ireq, status, ierr)
subroutine mpi_waitany(cnt, array_of_requests, index, status, ierr)
subroutine mpi_gather(sendbuf, cnt, datatype, recvbuf, reccnt, rectype, root, comm, ierr)
subroutine mpi_irecv(buf, cnt, datatype, source, tag, comm, ireq, ierr)