49
50
51
52 USE timer_mod
53 USE intbufdef_mod
55 USE sensor_mod
57
58
59
60#include "implicit_f.inc"
61
62
63
64#include "param_c.inc"
65#include "com01_c.inc"
66#include "com04_c.inc"
67#include "com08_c.inc"
68#include "task_c.inc"
69#include "warn_c.inc"
70#include "units_c.inc"
71#include "timeri_c.inc"
72#include "sms_c.inc"
73
74
75
76 TYPE(TIMER_) :: TIMERS
77 my_real,
intent(in) :: v(3,numnod)
78 INTEGER, INTENT(INOUT) :: ERRORS
79 INTEGER ,INTENT(IN) :: NSENSOR
80 INTEGER IPARI(NPARI,*),
81 . NELTST,ITYPTST,NBINTC,INTLIST(*),NEWFRONT(*), ITAB(*),
82 . ISENDTO(NINTER+1,*) ,IRCVFROM(NINTER+1,*),DELTA_PMAX_GAP_NODE(*),IDEL7NOK_SAV
84 my_real :: xslv(18,*), xmsr(12,*), vslv(6,*), vmsr(6,*),
85 . size_t(*),delta_pmax_gap(*),maxdgap(ninter)
86
87 TYPE(INTBUF_STRUCT_) INTBUF_TAB(*)
88 TYPE (SENSOR_STR_) ,DIMENSION(NSENSOR) ,INTENT(IN) :: SENSOR_TAB
89
90
91
92 LOGICAL, DIMENSION(NINTER) :: FORCE_COMPUTATION
93 INTEGER I,J,KK,IGN,IGE,JJ, NSN, NMN,
94 . IAD,K,N,IADD,ICOMP,NTY,NME,NMES,NMET,
95 . NBNEW, LISTNEW(NBINTC), ISENS, INTERACT,DELTA_PMAX_GAP_NOD
96 INTEGER :: JMAX
98 . xx,xy,xz,dist0,vx,vy,vz,gapinf,vv,dti,vmaxdt,
99 . startt, stopt, minbox,tzinfl,gapsup,pmax_gap,
100 . marge0,tzinf(nbintc),criterl(nbintc),ts ,
101 . xxp,xyp,xzp,xxg,xyg,xzg,d0,d1,d2,d3,d4,d5,d6,d7,d8,
102 . delta_pmax_gap_sav(ninter)
103
104
105
106 IF(debug(3)>=1) THEN
107 delta_pmax_gap_sav(1:ninter)=delta_pmax_gap(1:ninter)
108 delta_pmax_gap_nod=0
109 ENDIF
110 force_computation(1:ninter) = .false.
111
112
113
114 nbnew = 0
115 DO kk=1,nbintc
116 i = intlist(kk)
117 nty =ipari(7,i)
118
119 interact = 0
120 isens = 0
121 IF(nty == 7.OR.nty == 11.OR.nty == 24.OR.nty == 21.OR.
122 . nty == 5.OR.nty == 19.OR.nty == 25) isens = ipari(64,i)
123 IF (isens > 0) THEN
124 ts = sensor_tab(isens)%TSTART
125 IF (tt>=ts) interact = 1
126 stopt = huge(stopt)
127 ELSE
128 startt = intbuf_tab(i)%VARIABLES(3)
129 stopt = intbuf_tab(i)%VARIABLES(11)
130 IF (startt<=tt.AND.tt<=stopt) interact = 1
131 ENDIF
132
133 IF(interact/=0.OR.(nty==25 .AND. tt <= stopt)) THEN
134 nbnew = nbnew + 1
135 listnew(nbnew) = i
136 tzinf(nbnew) = intbuf_tab(i)%VARIABLES(8)
140
143
145 ENDIF
146 ENDIF
147
148
149
150
151
152 IF(interact == 0 .AND.
nsnfi_flag(i)==0.AND.nty/=25)
THEN
158 nsnfi(i)%P(1:nspmd) = 0
159 nsnsi(i)%P(1:nspmd) = 0
160 ENDIF
161
162 ENDDO
163
164
165
166 IF(nspmd>1)THEN
167 IF (imonm > 0)
CALL startime(timers,27)
169 1 isendto,ircvfrom,newfront,xslv ,xmsr ,
170 2 vslv ,vmsr ,listnew ,nbnew ,tzinf ,
171 3 size_t ,ipari , delta_pmax_gap ,maxdgap)
172 IF (imonm > 0)
CALL stoptime(timers,27)
173 END IF
174
175 DO kk=1,nbnew
176 i = listnew(kk)
177 nty=ipari(7,i)
178 IF (nty/=24.AND.nty/=25)THEN
179 intbuf_tab(i)%VARIABLES(8)=tzinf(kk)
180 ENDIF
181
182 IF(nty==25.AND.newfront(i)==-2) force_computation(i) = .true.
183
184
185
186 IF(nspmd>1) THEN
187 IF (newfront(i)<0)THEN
188 IF(nty==7.OR.nty==10.OR.nty==23.OR.nty==24) THEN
190 1 newfront(i) ,intbuf_tab(i)%I_STOK(1) ,
191 2 intbuf_tab(i)%CAND_N,intbuf_tab(i)%STFNS,
192 3 ipari(5,i),i,isendto,ircvfrom,intbuf_tab(i)%NSV,
193 4 itab)
194 ELSEIF(nty==11) THEN
196 1 newfront(i) ,intbuf_tab(i)%I_STOK(1),
197 2 intbuf_tab(i)%CAND_N, intbuf_tab(i)%STFS,
198 3 ipari(3,i),i,isendto,ircvfrom,intbuf_tab(i)%IRECTS,
199 4 itab)
200 ELSEIF(nty==20) THEN
202 1 newfront(i) ,intbuf_tab(i)%I_STOK(1) ,
203 2 intbuf_tab(i)%CAND_N,intbuf_tab(i)%STFA,
204 3 ipari(5,i),i,isendto,ircvfrom,intbuf_tab(i)%NSV,
205 4 itab,intbuf_tab(i)%NLG)
207 1 newfront(i) ,nint(intbuf_tab(i)%VARIABLES(20)) ,
208 2 intbuf_tab(i)%LCAND_S,intbuf_tab(i)%STFS,
209 3 ipari(53,i),i,isendto,ircvfrom,intbuf_tab(i)%IXLINS,
210 4 itab, intbuf_tab(i)%NLG )
211 ELSEIF(nty==25) THEN
213 1 newfront(i) , intbuf_tab(i)%STFNS,ipari(5,i),
214 3 i,isendto,ircvfrom,intbuf_tab(i)%NSV,
215 4 itab)
216 ENDIF
217 ENDIF
218 ELSE
219 newfront(i) = 0
220 ENDIF
221
222
223 IF(nty == 17)THEN
224
225 IF(ipari(33,i) == 0)THEN
226
227
228 ign = ipari(36,i)
229 ige = ipari(34,i)
230
231
232 nmes= ipari(5,i)
233 nme = ipari(4,i)
234 nmet= nme+nmes
235
236 tzinf(kk) = intbuf_tab(i)%VARIABLES(4) * size_t(i) / nmet / 6
237 intbuf_tab(i)%VARIABLES(8) = tzinf(kk)
238 minbox = intbuf_tab(i)%VARIABLES(5) * size_t(i) / nmet / 6
239 intbuf_tab(i)%VARIABLES(12) = minbox
240
241 xx =
max(xslv(1,i)-xmsr(4,i),xmsr(1,i)-xslv(4,i),zero)
242 xy =
max(xslv(2,i)-xmsr(5,i),xmsr(2,i)-xslv(5,i),zero)
243 xz =
max(xslv(3,i)-xmsr(6,i),xmsr(3,i)-xslv(6,i),zero)
244 dist0 = xx**2 + xy**2 + xz**2
245
246
247
248 IF(dist0>=tzinf(kk)**2.OR.kforsms/=0) THEN
249
250 intbuf_tab(i)%VARIABLES(5)= -intbuf_tab(i)%VARIABLES(5)
251 IF(debug(3)>=1.AND.ncycle/=0) THEN
252 WRITE(istdo,'(A,I10,A,I8,A,I4)')
253 . '** NEW SORT FOR INTERFACE NUMBER ',
254 . ipari(15,i), ' AT CYCLE ',ncycle,' ON PROC',ispmd+1
255 WRITE(iout,'(A,I10,A,I8,A,I4)')
256 . '** NEW SORT FOR INTERFACE NUMBER ',
257 . ipari(15,i), ' AT CYCLE ',ncycle,' ON PROC',ispmd+1
258 ENDIF
259 ENDIF
260 ENDIF
261
262 ELSEIF(nty == 24)THEN
263
264
265 xx =
max(xslv(1,i)-xmsr(4,i),xmsr(1,i)-xslv(4,i),zero)
266 xy =
max(xslv(2,i)-xmsr(5,i),xmsr(2,i)-xslv(5,i),zero)
267 xz =
max(xslv(3,i)-xmsr(6,i),xmsr(3,i)-xslv(6,i),zero)
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292 d0 = sqrt(xx**2+xy**2+xz**2)
293
294
295
296
297
298
299
300
301
302 vx =
max(vslv(1,i)-vmsr(4,i),vmsr(1,i)-vslv(4,i),zero)
303 vy =
max(vslv(2,i)-vmsr(5,i),vmsr(2,i)-vslv(5,i),zero)
304 vz =
max(vslv(3,i)-vmsr(6,i),vmsr(3,i)-vslv(6,i),zero)
305 vv = sqrt(vx**2+vy**2+vz**2)
306
307 tzinfl = intbuf_tab(i)%VARIABLES(8)
308 gapsup = intbuf_tab(i)%VARIABLES(2)
309
310
311
312
313
314
315 vmaxdt = onep01*vv*dt1
316 intbuf_tab(i)%VARIABLES(24) = vmaxdt
317
318
319
320 marge0 = intbuf_tab(i)%VARIABLES(25)
321
322 pmax_gap = intbuf_tab(i)%VARIABLES(23)
323
324
325
326
327
328 dist0 = marge0 - onep01*(d0 + vmaxdt + delta_pmax_gap(i))
329
330 intbuf_tab(i)%VARIABLES(5) = dist0
331
332 IF(dist0<=zero.OR.kforsms/=0) THEN
333
334 intbuf_tab(i)%VARIABLES(5) = -one
335
336
337 IF(debug(3)>=1) THEN
338
339 IF(delta_pmax_gap_sav(i) == delta_pmax_gap(i)) delta_pmax_gap_nod=delta_pmax_gap_node(i)
340
341 WRITE(istdo,'(A,I10,A,I8,A,F20.10,A,F20.10,A,F20.10,A,
342 . F20.10,A,F14.7,A,F20.10,A,I10,A,I4)')
343 . '** NEW SORT INTERFACE ',ipari(15,i),' CYCLE ',
344 . ncycle,' T',tt,' DIST0 ',dist0,' : MARGE0',marge0,
345 . ' D0',d0,' VMAXDT ', vmaxdt ,' DELTA_PMAX_GAP ',delta_pmax_gap(i),' NODE: ',delta_pmax_gap_nod,' PROC',
346 . ispmd+1
347
348
349
350 WRITE(iout,*)
351 . '** NEW SORT INTERFACE ',ipari(15,i),' CYCLE ',
352 . ncycle,' T',tt,' DIST0',dist0,' : MARGE0',marge0,
353 . ' D0',d0,' VMAXDT ', vmaxdt ,' DELTA_PMAX_GAP ',delta_pmax_gap(i),' NODE: ',delta_pmax_gap_nod,' PROC',
354 . ispmd+1
355 ENDIF
356 ENDIF
357
358 ELSEIF(nty == 25)THEN
359
360
361 xx =
max(xslv(1,i)-xmsr(4,i),xmsr(1,i)-xslv(4,i),zero)
362 xy =
max(xslv(2,i)-xmsr(5,i),xmsr(2,i)-xslv(5,i),zero)
363 xz =
max(xslv(3,i)-xmsr(6,i),xmsr(3,i)-xslv(6,i),zero)
364
365 d0 = sqrt(xx**2+xy**2+xz**2)
366 vx =
max(vslv(1,i)-vmsr(4,i),vmsr(1,i)-vslv(4,i),zero)
367 vy =
max(vslv(2,i)-vmsr(5,i),vmsr(2,i)-vslv(5,i),zero)
368 vz =
max(vslv(3,i)-vmsr(6,i),vmsr(3,i)-vslv(6,i),zero)
369 vv = sqrt(vx**2+vy**2+vz**2)
370
371 tzinfl = intbuf_tab(i)%VARIABLES(8)
372 gapsup = intbuf_tab(i)%VARIABLES(2)
373
374
375
376
377
378
379 vmaxdt = onep01*vv*dt1
380
381
382
383 intbuf_tab(i)%VARIABLES(24) = vmaxdt
384 marge0 = intbuf_tab(i)%VARIABLES(25)
385
386 dist0 = marge0 - onep01*(d0 + vmaxdt + maxdgap(i))
387
388 intbuf_tab(i)%VARIABLES(5) = dist0
389
390
391
392 IF(vmaxdt > five * marge0) THEN
393
394 errors = errors + 1
395 IF(ispmd == 0) THEN
396 WRITE(istdo,'(A,I10)') "ERROR: NODAL VELOCITY IS TOO HIGH
397 . FOR INTERFACE",ipari(15,i)
398 WRITE(iout,'(A,I10)') "ERROR: NODAL VELOCITY IS TOO HIGH
399 . FOR INTERFACE",ipari(15,i)
400 ENDIF
401 nsn = ipari(5,i)
402 nmn = ipari(6,i)
403 d1 = zero
404 jmax = 1
405 DO jj=1,nsn
406 j=intbuf_tab(i)%NSV(jj)
407 IF(intbuf_tab(i)%STFNS(jj)/=zero .AND. j<=numnod .AND. j > 0) THEN
408 vx = v(1,j)
409 vy = v(2,j)
410 vz = v(3,j)
411 IF( sqrt(vx**2+vy**2+vz**2) > d1) THEN
412 d1 = sqrt(vx**2+vy**2+vz**2)
413 jmax = j
414 ENDIF
415 ENDIF
416 END DO
417 DO jj=1,nmn
418 j=intbuf_tab(i)%MSR(jj)
419 IF(j>0 .AND. j <= numnod) THEN
420 vx = v(1,j)
421 vy = v(2,j)
422 vz = v(3,j)
423 IF( sqrt(vx**2+vy**2+vz**2) > d1) THEN
424 d1 = sqrt(vx**2+vy**2+vz**2)
425 jmax = j
426 ENDIF
427 ENDIF
428 ENDDO
429 IF(d1 > five * marge0 /two ) THEN
430 WRITE(istdo,*) "ERROR: NODAL VELOCITY IS TOO HIGH FOR NODE",itab(jmax),d1
431 WRITE(iout,*) "ERROR: NODAL VELOCITY IS TOO HIGH FOR NODE",itab(jmax),d1
432 ENDIF
433 intbuf_tab(i)%VARIABLES(24) = marge0
434 ENDIF
435
436
437 IF(dist0<=zero.OR.kforsms/=0.OR.force_computation(i)) THEN
438
439 intbuf_tab(i)%VARIABLES(5) = -one
440
441 IF(debug(3)>=1) THEN
442
443 WRITE(istdo,'(A,I10,A,I8,A,F20.10,A,F20.10,A,F20.10,A,
444 . F20.10,A,F14.7,A,I4)')
445 . '** NEW SORT INTERFACE ',ipari(15,i),' CYCLE ',
446 . ncycle,' T',tt,' DIST0 ',dist0,' : MARGE0',marge0,
447 . ' D0',d0,' VMAXDT ', vmaxdt ,' PROC',ispmd+1
448
449
450
451 WRITE(iout,*)
452 . '** NEW SORT INTERFACE ',ipari(15,i),' CYCLE ',
453 . ncycle,' T',tt,' DIST0',dist0,' : MARGE0',marge0,
454 . ' D0',d0,' VMAXDT ', vmaxdt ,' PROC',ispmd+1
455 ENDIF
456 ENDIF
457
458 ELSE
459
460
461 xx =
max(xslv(1,i)-xmsr(4,i),xmsr
462 xy =
max(xslv(2,i)-xmsr(5,i),xmsr(2,i)-xslv(5,i),zero)
463 xz =
max(xslv(3,i)-xmsr(6,i),xmsr(3,i)-xslv(6,i),zero)
464
465 vx =
max(vslv(1,i)-vmsr(4,i),vmsr(1,i)-vslv(4,i),zero)
466 vy =
max(vslv(2,i)-vmsr(5,i),vmsr(2,i)-vslv(5,i),zero)
467 vz =
max(vslv(3,i)-vmsr(6,i),vmsr(3,i)-vslv(6,i),zero)
468 vv = sqrt(vx**2+vy**2+vz**2)
469
470 tzinfl = intbuf_tab(i)%VARIABLES(8)
471 gapsup = intbuf_tab(i)%VARIABLES(2)
472
473
474
475
476
477 tzinfl = intbuf_tab(i)%VARIABLES(8)
478 IF(nty==23)THEN
479 intbuf_tab(i)%VARIABLES(5) = tzinfl-sqrt(three)*gapsup
480 ELSE
481 intbuf_tab(i)%VARIABLES(5) = tzinfl-gapsup
482 END IF
483
484 dist0 = intbuf_tab(i)%VARIABLES(5) - sqrt(xx**2+xy**2+xz**2)
485
486
487
488 IF (vv/=zero) THEN
489 gapinf =intbuf_tab(i)%VARIABLES(6)
490 IF (gapinf==zero) gapinf = intbuf_tab(i)%VARIABLES(2)
491 dti = zep9*gapinf/vv
492 IF(dti<dt2t) THEN
493 dt2t = dti
494 neltst = ipari(15,i)
495 ityptst = 10
496 ENDIF
497 ENDIF
498
499
500 IF(dist0<=zero.OR.kforsms/=0) THEN
501
502 intbuf_tab(i)%VARIABLES(5) = -one
503 IF(debug(3)>=1.AND.ncycle/=0) THEN
504 WRITE(istdo,'(A,I10,A,I4,A,I8,A,I4,A,I4,A,F20.10,A,F20.10,A,F20.10)')
505 . '** NEW SORT FOR INTERFACE NUMBER ',
506 . ipari(15,i),' TYPE ',nty,
507 . ' AT CYCLE ',ncycle,' ON PROC',ispmd+1,' I19FLAG ',ipari(7,i),
508 . ' DIST0 ',dist0,' TZINF ',intbuf_tab(i)%VARIABLES(8),' GAP ',
509 . intbuf_tab(i)%VARIABLES(2)
510
511 WRITE(iout,'(A,I10,A,I4,A,I8,A,I4,A,I4,A,F20.10,A,F20.10,A,F20.10)')
512 . '** NEW SORT FOR INTERFACE NUMBER ',
513 . ipari(15,i),' TYPE ',nty,
514 . ' AT CYCLE ',ncycle,' ON PROC',ispmd+1,' I19FLAG ',ipari(7,i),
515 . ' DIST0 ',dist0,' TZINF ',intbuf_tab(i)%VARIABLES(8),' GAP ',
516 . intbuf_tab(i)%VARIABLES(2)
517 ENDIF
518 ENDIF
519
520 ENDIF
521 ENDDO
522
523 RETURN
type(int_pointer), dimension(:), allocatable nsnsi_sav
type(int_pointer), dimension(:), allocatable nsnsi
type(int_pointer), dimension(:), allocatable nsnfi_sav
integer, dimension(:), allocatable nsnfi_flag
type(int_pointer), dimension(:), allocatable nsnfi
subroutine spmd_get_stif20(newfront, i_stok, cand_n, stfa, nsn, nin, isendto, ircvfrom, nsv, itab, nlg)
subroutine spmd_get_stif20e(newfront, i_stok, cand_s, stfs, nlinsa, nin, isendto, ircvfrom, ixlins, itab, nlg)
subroutine spmd_get_stif11(newfront, i_stok, cand_s, stfs, nrts, nin, isendto, ircvfrom, irects, itab)
subroutine spmd_get_stif(newfront, i_stok, cand_n, stfn, nsn, nin, isendto, ircvfrom, nsv, itab)
subroutine spmd_get_stif25(newfront, stfn, nsn, nin, isendto, ircvfrom, nsv, itab)
subroutine spmd_sync_mmxg2(isendto, ircvfrom, newfront, xslv_l, xmsr_l, vslv_l, vmsr_l, intlist, nintc, tzinf, size_t, ipari, delta_pmax_gap, maxdgap)
subroutine startime(event, itask)
subroutine stoptime(event, itask)