219 use element_mod , only : nixs
220
221
222
223#include "implicit_f.inc"
224
225
226
227#include "mvsiz_p.inc"
228
229
230
231#include "com04_c.inc"
232#include "com08_c.inc"
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280 INTEGER NB_NC,NB_EC,I_ADD,MAXSIZ,I_STOK_GLOB,I_STOK,MX_CAND,
281 . NB_N_B,I_ADD_MAX,CONT ,IXS(NIXS,*),IXS16(8,*),
282 . ADD(2,*),BPE(*),PE(*),BPN(*),PN(*),
283 . NSV(*),CAND_N(*),CAND_E(*),NELEM(*),
284 . PROV_N(*) ,PROV_E(*) ,IXS20(12,*), IXS10(6,*)
285
287 . x(3,*),v(3,*),a(3,*),xyzm(6,*),eminx(6,*),
288 . minbox,tzinf,dist
289
290
291
292 INTEGER NB_NCN,NB_NCN1,NB_ECN,ADDNN,ADDNE,I,J,DIR,
293 . NN,NE,LE,L,NCAND_PROV,N16,N20,N8,N10
294
296 . dx,dy,dz,dsup,seuil,xx,yy,zz
297
298
299
300
301
302
303
304
305
306
307 IF(add(2,i_add)+nb_ec>maxsiz) THEN
308
309 cont = -1
310
311
312
313
314
315 RETURN
316 ENDIF
317
318
319
320 IF(nb_ec/=0.AND.nb_nc/=0) THEN
321
322 dx = xyzm(4,i_add) - xyzm(1,i_add)
323 dy = xyzm(5,i_add) - xyzm(2,i_add)
324 dz = xyzm(6,i_add) - xyzm(3,i_add)
326
327
328
329
330
331
332
333
334 IF(nb_ec+nb_nc<=128) THEN
335 ncand_prov = nb_ec*nb_nc
336 ELSE
337 ncand_prov = 129
338 ENDIF
339
340 IF(dsup<minbox.OR.nb_nc<=nb_n_b.OR.ncand_prov<=128)THEN
341
342 ncand_prov = nb_ec*nb_nc
343 DO l=1,ncand_prov
344 i = 1+(l-1)/nb_nc
345 j = l-(i-1)*nb_nc
346 le = bpe(i)
347 ne = nelem(le)
348 n8 = ne
349 n10 = n8-numels8
350 n20 = n10-numels10
351 n16 = n20-numels20
352 nn = nsv(bpn(j))
353 xx = x(1,nn)+dt2*(v(1,nn)+dt12*a(1,nn))
354 yy = x(2,nn)+dt2*(v(2,nn)+dt12*a(2,nn))
355 zz = x(3,nn)+dt2*(v(3,nn)+dt12*a(3,nn))
356 dist = 0.
357 dist =
max(eminx(1,le)-xx,xx-eminx(4,le),dist)
358 dist =
max(eminx(2,le)-yy,yy-eminx(5,le),dist)
359 dist =
max(eminx(3,le)-zz,zz-eminx(6,le),dist)
360 IF(dist<tzinf)THEN
361 IF(n8>=1.AND.n8<=numels8)THEN
362 IF(nn/=ixs(2,ne).AND.nn/=ixs(3,ne).AND.
363 & nn/=ixs(4,ne).AND.nn/=ixs(5,ne).AND.
364 & nn/=ixs(6,ne).AND.nn/=ixs(7,ne).AND.
365 & nn/=ixs(8,ne).AND.nn/=ixs(9,ne))THEN
366 i_stok = i_stok + 1
367 prov_n(i_stok) = bpn(j)
368 prov_e(i_stok) = le
369 IF(i_stok==mvsiz-1)
CALL i16sto(
370 1 i_stok,i_stok_glob,prov_n,cand_n,prov_e,cand_e,
371 2 cont ,mx_cand )
372 IF(cont==-2)RETURN
373 ENDIF
374 ELSEIF(n10>=1.AND.n10<=numels8)THEN
375 IF(nn/=ixs(2,ne).AND.nn/=ixs(4,ne).AND.
376 & nn/=ixs(7,ne).AND.nn/=ixs(6,ne).AND.
377 & nn/=ixs10(1,n10).AND.nn/=ixs10(2,n10).AND.
378 & nn/=ixs10(3,n10).AND.nn/=ixs10(4,n10).AND.
379 & nn/=ixs10(5,n10).AND.nn/=ixs10(6,n10))THEN
380 i_stok = i_stok + 1
381 prov_n(i_stok) = bpn(j)
382 prov_e(i_stok) = le
383 IF(i_stok==mvsiz-1)
CALL i16sto(
384 1 i_stok,i_stok_glob,prov_n,cand_n,prov_e,cand_e,
385 2 cont ,mx_cand )
386 IF(cont==-2)RETURN
387 ENDIF
388 ELSEIF(n16>=1.AND.n16<=numels16)THEN
389 IF(nn/=ixs(2,ne).AND.nn/=ixs(3,ne).AND.
390 & nn/=ixs(4,ne).AND.nn/=ixs(5,ne).AND.
391 & nn/=ixs(6,ne).AND.nn/=ixs(7,ne).AND.
392 & nn/=ixs(8,ne).AND.nn/=ixs(9,ne).AND.
393 & nn/=ixs16(1,n16).AND.nn/=ixs16(2,n16).AND.
394 & nn/=ixs16(3,n16).AND.nn/=ixs16(4,n16).AND.
395 & nn/=ixs16(5,n16).AND.nn/=ixs16(6,n16).AND.
396 & nn/=ixs16(7,n16).AND.nn/=ixs16(8,n16))THEN
397 i_stok = i_stok + 1
398 prov_n(i_stok) = bpn(j)
399 prov_e(i_stok) = le
400 IF(i_stok==mvsiz-1)
CALL i16sto(
401 1 i_stok,i_stok_glob,prov_n,cand_n,prov_e,cand_e,
402 2 cont ,mx_cand )
403 IF(cont==-2)RETURN
404 ENDIF
405 ELSEIF(n20>=1.AND.n20<=numels20)THEN
406 IF(nn/=ixs(2,ne).AND.nn/=ixs(3,ne).AND.
407 & nn/=ixs(4,ne).AND.nn/=ixs(5,ne).AND.
408 & nn/=ixs(6,ne).AND.nn/=ixs(7,ne).AND.
409 & nn/=ixs(8,ne).AND.nn/=ixs(9,ne).AND.
410 & nn/=ixs20(1,n20) .AND.nn/=ixs20(2,n20) .AND.
411 & nn/=ixs20(3,n20) .AND.nn/=ixs20(4,n20) .AND.
412 & nn/=ixs20(5,n20) .AND.nn/=ixs20(6,n20) .AND.
413 & nn/=ixs20(7,n20) .AND.nn/=ixs20(8,n20) .AND.
414 & nn/=ixs20(9,n20) .AND.nn/=ixs20(10,n20).AND.
415 & nn/=ixs20(11,n20).AND.nn/=ixs20(12,n20))THEN
416 i_stok = i_stok + 1
417 prov_n(i_stok) = bpn(j)
418 prov_e(i_stok) = le
419 IF(i_stok==mvsiz-1)
CALL i16sto(
420 1 i_stok,i_stok_glob,prov_n,cand_n,prov_e,cand_e,
421 2 cont ,mx_cand )
422 IF(cont==-2)RETURN
423 ENDIF
424 ENDIF
425 ENDIF
426 ENDDO
427
428 ELSE
429
430
431
432
433
434
435
436
437
438
439 dir = 1
440 IF(dy==dsup) THEN
441 dir = 2
442 ELSE IF(dz==dsup) THEN
443 dir = 3
444 ENDIF
445 seuil =(xyzm(dir+3,i_add)+xyzm(dir,i_add))*0.5
446
447
448
449 nb_ncn= 0
450 nb_ncn1= 0
451 addnn= add(1,i_add)
452#include "vectorize.inc"
453 DO i=1,nb_nc
454 IF(x(dir,nsv(bpn(i)))<seuil) THEN
455
456 nb_ncn1 = nb_ncn1 + 1
457 addnn = addnn + 1
458 pn(addnn) = bpn(i)
459 ENDIF
460 ENDDO
461#include "vectorize.inc"
462 DO i=1,nb_nc
463 IF(x(dir,nsv(bpn(i)))>=seuil) THEN
464 nb_ncn = nb_ncn + 1
465 bpn(nb_ncn) = bpn(i)
466
467 ENDIF
468 ENDDO
469
470
471
472 nb_ecn= 0
473 addne= add(2,i_add)
474 IF(nb_ncn1==0) THEN
475
476#include "vectorize.inc"
477 DO i=1,nb_ec
478 le = bpe(i)
479 IF(eminx(dir+3,le)+tzinf>=seuil) THEN
480
481 nb_ecn = nb_ecn + 1
482 bpe(nb_ecn) = le
483 ENDIF
484 ENDDO
485 ELSEIF(nb_ncn==0) THEN
486
487#include "vectorize.inc"
488 DO i=1,nb_ec
489 le = bpe(i)
490 IF(eminx(dir,le)-tzinf<seuil) THEN
491
492 addne = addne + 1
493 pe(addne) = le
494 ENDIF
495 ENDDO
496 ELSE
497#include "vectorize.inc"
498 DO i=1,nb_ec
499 le = bpe(i)
500 IF(eminx(dir,le)-tzinf<seuil) THEN
501
502 addne = addne + 1
503 pe(addne) = le
504 ENDIF
505 IF(eminx(dir+3,le)+tzinf>=seuil) THEN
506
507 nb_ecn = nb_ecn + 1
508 bpe(nb_ecn) = le
509 ENDIF
510 ENDDO
511 ENDIF
512
513
514
515 add(1,i_add+1) = addnn
516 add(2,i_add+1) = addne
517
518 xyzm(1,i_add+1) = xyzm(1,i_add)
519 xyzm(2,i_add+1) = xyzm(2,i_add)
520 xyzm(3,i_add+1) = xyzm(3,i_add)
521 xyzm(4,i_add+1) = xyzm(4,i_add)
522 xyzm(5,i_add+1) = xyzm(5,i_add)
523 xyzm(6,i_add+1) = xyzm(6,i_add)
524 xyzm(dir,i_add+1) = seuil
525 xyzm(dir+3,i_add) = seuil
526
527 nb_nc = nb_ncn
528 nb_ec = nb_ecn
529
530 i_add = i_add + 1
531 IF(i_add+1>=i_add_max) THEN
532 cont = -3
533 RETURN
534 ENDIF
535
536 cont=1
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551 RETURN
552
553 ENDIF
554 ENDIF
555
556
557
558 IF (i_add==1) THEN
559 cont = 0
560 RETURN
561 ENDIF
562
563
564
565
566
567
568
569
570 i_add = i_add - 1
571
572
573
574
575
576 nb_nc = add(1,i_add+1) - add(1,i_add)
577 DO i=1,nb_nc
578 bpn(i) = pn(add(1,i_add)+i)
579 ENDDO
580
581
582
583 nb_ec = add(2,i_add+1) - add(2,i_add)
584 DO i=1,nb_ec
585 bpe(i) = pe(add(2,i_add)+i)
586 ENDDO
587
588 cont=1
589 RETURN
590
subroutine i16sto(i_stok, i_stok_glob, prov_n, cand_n, prov_e, cand_e, cont, mx_cand)