37
38
39
40 USE spmd_comm_world_mod, ONLY : spmd_comm_world
41#include "implicit_f.inc"
42
43
44
45#include "task_c.inc"
46#include "units_c.inc"
47#include "com01_c.inc"
48
49
50
51#include "spmd.inc"
52
53
54
55 INTEGER ITK(2,*), NKFRONT, , NKLOC, NDDLG, IPRINT
57#if defined(MUMPS5)
58
59
60
61 INTEGER I, NKFP(NSPMD-1), IRQTAG, REQ1(NSPMD-1),
62 . TSTAT1(MPI_STATUS_SIZE,NSPMD-1), NKF_TOT, LEN, IR, JC,
63 . INDEX, J, K, NN, NKFMAX, NKF_NEW(NSPMD), PP, NMIN,
64 . , II, REQ2(2), TSTAT2(MPI_STATUS_SIZE,2),
65 . REQ3(3),
66 . TSTAT3(MPI_STATUS_SIZE,3),REQ4(3),
67 . TSTAT4(MPI_STATUS_SIZE,3), IERR, NP, JJ, NKIP(NSPMD-1),
68 . SBUF(2), RBUF(2,NSPMD-1), NNZT, NDDLP(NSPMD-1),
69 . IADFIN, IAD, , ADDCM(NDDLG)
70 INTEGER, DIMENSION(:,:), ALLOCATABLE :: ITKF, IKFRONT, PKFRONT,KFMAP
71 my_real,
DIMENSION(:),
ALLOCATABLE :: rtkf, rkfront
72 INTEGER MSGOFF,MSGOFF2,MSGOFF3,MSGOFF4,MSGOFF5,MSGOFF6
73 DATA msgoff/16000/,msgoff2/16062/
74 DATA msgoff3/16000/,msgoff4/16062/
75 DATA msgoff5/16003/,msgoff6/16064/
76
77
78
79
80 ALLOCATE(itkf(2,nkfront), rtkf(nkfront))
81 DO i=1,nkfront
82 itkf(1,i)=itk(1,nkloc+i)
83 itkf(2,i)=itk(2,nkloc+i)
84 rtkf(i)=rtk(nkloc+i)
85 ENDDO
86
87 IF (ispmd==0) THEN
88 DO i=1,nspmd-1
89 irqtag=msgoff
90 CALL mpi_irecv(rbuf(1,i), 2, mpi_integer, it_spmd(i+1),
91 . irqtag, spmd_comm_world, req1(i), ierr)
92 ENDDO
93 IF(nspmd > 1)
CALL mpi_waitall(nspmd-1, req1, tstat1, ierr)
94 DO i=1,nspmd-1
95 nkfp(i)=rbuf(1,i)
96 nkip(i)=rbuf(2,i)
97 ENDDO
98
99 nkf_tot=nkfront
100 DO i=1,nspmd-1
101 nkf_tot=nkf_tot+nkfp(i)
102 ENDDO
103 ALLOCATE(ikfront(3,nkf_tot), rkfront(nkf_tot),
104 . pkfront(nspmd+1,nkf_tot))
105
106
107
108 DO i=1,nddlg
109 addcm(i)=0
110 END DO
111 iadfin=0
112 DO i=1,nkfront
113 ir=itkf(1,i)
115 IF(ir>nddlg) stop 1000
116 iad=addcm(ir)
117 DO WHILE (iad /= 0)
118 iad0=iad
119 iad=ikfront(3,iad)
120 END DO
121 iadfin = iadfin+1
122 ikfront(1,iadfin) =
jc
123 ikfront(2,iadfin) = ir
124 ikfront(3,iadfin) = 0
125 IF(addcm(ir) == 0)THEN
126 addcm(ir)=iadfin
127 ELSE
128 ikfront(3,iad0)=iadfin
129 ENDIF
130 rkfront(iadfin)=rtkf(i)
131 pkfront(1,iadfin)=1
132 pkfront(2,iadfin)=1
133 END DO
134
135 nkf_tot=nkfront
136 DEALLOCATE(itkf, rtkf)
137
138 DO i=1,nspmd-1
139 ALLOCATE(itkf(2,nkfp(i)), rtkf(nkfp(i)))
140 irqtag=msgoff2
141 len=2*nkfp(i)
142 CALL mpi_irecv(itkf, len, mpi_integer, it_spmd(i+1),
143 . irqtag, spmd_comm_world, req2(1), ierr)
144 irqtag=msgoff3
145 len=nkfp(i)
146 CALL mpi_irecv(rtkf, len, real, it_spmd(i+1),
147 . irqtag, spmd_comm_world, req2(2), ierr)
149
150 DO j=1,nkfp(i)
151 ir=itkf(1,j)
153 index=0
154
155 IF(ir>nddlg) stop 2000
156 iad=addcm(ir)
157
158 DO WHILE (iad /= 0)
159 IF(ikfront(1,iad) ==
jc)
THEN
160 index=iad
161 iad=0
162 ELSE
163 iad0=iad
164 iad=ikfront(3,iad)
165 END IF
166 END DO
167 IF(index == 0) THEN
168 nkf_tot = nkf_tot+1
169 ikfront(1,nkf_tot) =
jc
170 ikfront(2,nkf_tot) = ir
171 ikfront(3,nkf_tot) = 0
172 IF(addcm(ir) == 0)THEN
173 addcm(ir)=nkf_tot
174 ELSE
175 ikfront(3,iad0)=nkf_tot
176 ENDIF
177 rkfront(nkf_tot)=rtkf(j)
178 pkfront(1,nkf_tot)=1
179 pkfront(2,nkf_tot)=i+1
180 ELSE
181 rkfront(index)=rkfront(index)+rtkf(j)
182 nn=pkfront(1,index)
183 nn=nn+1
184 pkfront(1,index)=nn
185 pkfront(1+nn,index)=i+1
186 END IF
187 ENDDO
188 DEALLOCATE(itkf, rtkf)
189 ENDDO
190
191 nnzt=nkloc
192 DO i=1,nspmd-1
193 nnzt=nnzt+nkip(i)
194 ENDDO
195 nnzt=nnzt+nkf_tot
196 IF (ispmd==0.AND.iprint==1) THEN
197 WRITE(istdo,*)
198 WRITE(istdo,'(A21,I10,A8,I10)')
199 . ' MUMPS DIM : NNZ =',nnzt,' NNZFR =',nkf_tot
200 ENDIF
201
202
203 nkfmax=nkfront
204 DO i=1,nspmd-1
205 nkfmax=
max(nkfmax,nkfp(i))
206 ENDDO
207
208 ALLOCATE(kfmap(nspmd,nkfmax))
209 DO i=1,nspmd
210 nkf_new(i)=0
211 ENDDO
212
213
214
215
216
217 DO i=1,nkf_tot
218 IF (pkfront(1,i)==1) THEN
219 pp=pkfront(2,i)
220 nn=nkf_new(pp)
221 nn=nn+1
222 kfmap(pp,nn)=i
223 nkf_new(pp)=nn
224 ELSE
225 np=pkfront(1,i)
226 pp=pkfront(2,i)
227 nmin=nkf_new(pp)
228 pmin=pp
229 DO j=2,np
230 pp=pkfront(1+j,i)
231 IF (nkf_new(pp)<nmin) THEN
232 nmin=nkf_new(pp)
233 pmin=pp
234 ENDIF
235 ENDDO
236 nn=nkf_new(pmin)
237 nn=nn+1
238 kfmap(pmin,nn)=i
239 nkf_new(pmin)=nn
240 ENDIF
241 ENDDO
242
243 IF (ispmd==0.AND.iprint==1) THEN
244 WRITE(istdo,*)
245 DO i=1,nspmd
246 IF (i==1) THEN
247 WRITE(istdo,'(A6,I5,5X,A5,I10,A8,I10)')
248 . ' PROC=',i,'NNZ =',nkloc+nkf_new(1),
249 . ' NNZFR =',nkf_new(1)
250 ELSE
251 WRITE(istdo,'(A6,I5,5X,A5,I10,A8,I10)')
252 . ' PROC=',i,'NNZ =',nkip(i-1)+nkf_new(i),
253 . ' NNZFR =',nkf_new(i)
254 ENDIF
255 ENDDO
256 ENDIF
257
258 nkfloc=nkf_new(1)
259 DO i=1,nkfloc
260 ii=kfmap(1,i)
261 itk(1,nkloc+i)=ikfront(1,ii)
262 itk(2,nkloc+i)=ikfront(2,ii)
263 rtk(nkloc+i)=rkfront(ii)
264 ENDDO
265
266 DO i=1,nspmd-1
267 irqtag=msgoff4
268 CALL mpi_isend(nkf_new(i+1), 1, mpi_integer, it_spmd(i+1),
269 . irqtag, spmd_comm_world, req3(1), ierr)
270
271 ALLOCATE(itkf(2,nkf_new(i+1)), rtkf(nkf_new(i+1)))
272 DO j=1,nkf_new(i+1)
273 jj=kfmap(i+1,j)
274 itkf(1,j)=ikfront(1,jj)
275 itkf(2,j)=ikfront(2,jj)
276 rtkf(j)=rkfront(jj)
277 ENDDO
278 len=2*nkf_new(i+1)
279 irqtag=msgoff5
280 CALL mpi_isend(itkf, len, mpi_integer, it_spmd(i+1),
281 . irqtag, spmd_comm_world,
282 . req3(2), ierr)
283 len=nkf_new(i+1)
284 irqtag=msgoff6
285 CALL mpi_isend(rtkf, len, real, it_spmd(i+1),
286 . irqtag, spmd_comm_world,
287 . req3(3), ierr)
288
290
291 DEALLOCATE(itkf, rtkf)
292 ENDDO
293
294 DEALLOCATE(ikfront, rkfront, pkfront)
295 ELSE
296 irqtag=msgoff
297 sbuf(1)=nkfront
298 sbuf(2)=nkloc
299 CALL mpi_isend(sbuf, 2, mpi_integer, it_spmd(1),
300 . irqtag, spmd_comm_world, req4(1), ierr)
302 len=2*nkfront
303 irqtag=msgoff2
304 CALL mpi_isend(itkf, len, mpi_integer, it_spmd(1),
305 . irqtag, spmd_comm_world, req4(2), ierr)
306 len=nkfront
307 irqtag=msgoff3
308 CALL mpi_isend(rtkf, len, real, it_spmd(1),
309 . irqtag, spmd_comm_world, req4(3), ierr)
310
312 DEALLOCATE(itkf, rtkf)
313
314 irqtag=msgoff4
315 CALL mpi_irecv(nkfloc, 1, mpi_integer, it_spmd(1),
316 . irqtag, spmd_comm_world, req4, ierr)
318
319 ALLOCATE(itkf(2,nkfloc), rtkf(nkfloc))
320 len=2*nkfloc
321 irqtag=msgoff5
322 CALL mpi_irecv(itkf, len, mpi_integer, it_spmd(1),
323 . irqtag, spmd_comm_world, req4(1), ierr)
324 len=nkfloc
325 irqtag=msgoff6
326 CALL mpi_irecv(rtkf, len, real, it_spmd(1),
327 . irqtag, spmd_comm_world, req4(2), ierr)
329
330 DO i=1,nkfloc
331 itk(1,nkloc+i)=itkf(1,i)
332 itk(2,nkloc+i)=itkf(2,i)
333 rtk(nkloc+i)=rtkf(i)
334 ENDDO
335 DEALLOCATE(itkf, rtkf)
336 ENDIF
337
338 RETURN
339#endif
subroutine jc(p, t, a, b, cm, cn, tref, tm, epsm, sigmam, jc_yield, tan_jc)