50
51
52
55
56
57
58#include "implicit_f.inc"
59
60
61
62#include "mvsiz_p.inc"
63
64 INTEGER
65 parameter(nvecsz = mvsiz)
66
67
68
69#include "com01_c.inc"
70#include "com04_c.inc"
71#include "param_c.inc"
72#include "task_c.inc"
73#include "ige3d_c.inc"
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112 INTEGER ,ESHIFT,,ISZNSNR,NSNROLD,NIN,ITASK,
113 . MULNSN,NOINT,INACTI,IFQ,NSNR,IGAP,NBX,,NBZ,
114 . NSV(*),CAND_N(*),CAND_E(*),CAND_A(*),IFPEN(*),RENUM(*),
115 . INTTH,IRECT(4,*), VOXEL(NBX+2,NBY+2,NBZ+2),II_STOK,
116 . KREMNOD(*),REMNOD(*),ITAB(*),FLAGREMNODE,ITIED
117 INTEGER, INTENT(in) :: NRTM
118 INTEGER, INTENT(in) :: TOTAL_NB_NRTM
119 INTEGER, INTENT(IN) :: INTHEAT
120 INTEGER, INTENT(IN) :: IDT_THERM
121 INTEGER, INTENT(IN) :: NODADT_THERM
123 . x(3,*),xyzm(12),cand_p(*),stf(*),stfn(*),gap_s(*),gap_m(*),
124 . tzinf,marge,gap,gapmin,gapmax,bgapsmx,
125 . curv_max(*),gap_s_l(*),gap_m_l(*),cand_f(*)
126 my_real ,
INTENT(IN) :: drad,dgapload
127 INTEGER, INTENT(inout) :: REMOTE_S_NODE
128 INTEGER, DIMENSION(NSNR), INTENT(inout) :: LIST_REMOTE_S_NODE
129
130
131
132 INTEGER NB_NCN,NB_NCN1,NB_ECN,I,J,DIR,NB_NC,NB_EC,
133 . N1,N2,N3,N4,NN,NE,K,L,NCAND_PROV,J_STOK,II,JJ,
134 . PROV_N(MVSIZ),PROV_E(MVSIZ),
135 . OLDNUM(ISZNSNR), NSNF, NSNL,DELNOD,M
136 INTEGER, DIMENSION(:), ALLOCATABLE ::
138 . dx,dy,dz,xs,ys,zs,xx,sx,sy,sz,s2,
139 . xmin, xmax,ymin,
ymax,zmin, zmax, tz, gapsmx, gapl,
140 . xx1,xx2,xx3,xx4,yy1,yy2,yy3,yy4,zz1,zz2,zz3,zz4,
141 . d1x,d1y,d1z,d2x,d2y,d2z,dd1,dd2,d2,a2,gs
142
143 INTEGER LAST_NOD(NSN+NSNR)
144 INTEGER IX,IY,IZ,NEXT,M1,M2,,M4,
145 . IX1,IY1,IZ1,IX2,IY2,IZ2
146 INTEGER, DIMENSION(:),ALLOCATABLE :: IIX,IIY,IIZ
148 . xminb,yminb,zminb,xmaxb,ymaxb,zmaxb,
149 . xmine,ymine,zmine,xmaxe,ymaxe,zmaxe,aaa
150 INTEGER CPT_VOX0
151 LOGICAL TEST_V0
152 INTEGER FIRST,NEW,LAST,IERROR
153 LOGICAL DBG_type18_fvm
154 SAVE iix,iiy,iiz
155
156 IF(itask == 0)THEN
157 remote_s_node = 0
158 cpt_vox0 = 0
159 ALLOCATE(
next_nod(nsn+nsnr),stat=ierror)
160 IF(ierror/=0) THEN
161 CALL ancmsg(msgid=19,anmode=aninfo,
162 . c1='(/INTER/TYPE7)')
164 ENDIF
165 ALLOCATE(iix(nsn+nsnr),iiy(nsn+nsnr),iiz(nsn+nsnr),stat=ierror)
166 IF(ierror/=0) THEN
167 CALL ancmsg(msgid=19,anmode=aninfo,
168 . c1='(/INTER/TYPE7)')
170 ENDIF
171 END IF
172
174
175
176
177 xmin = xyzm(1)
178 ymin = xyzm(2)
179 zmin = xyzm(3)
180 xmax = xyzm(4)
182 zmax = xyzm(6)
183
184
186 xminb = xyzm(7)
187 yminb = xyzm(8)
188 zminb = xyzm(9)
189 xmaxb = xyzm(10)
190 ymaxb = xyzm(11)
191 zmaxb = xyzm(12)
192 ELSE
193
194
195
196
197
198 xminb = xmin
199 yminb = ymin
200 zminb = zmin
201 xmaxb = xmax
203 zmaxb = zmax
204 ENDIF
205
206
207 IF(nspmd>1.AND.(inacti==5.OR.inacti==6.OR.inacti==7.OR.ifq>0.OR.itied/=0)) THEN
208 CALL spmd_oldnumcd(renum,oldnum,isznsnr,nsnrold,intheat,idt_therm,nodadt_therm)
209 END IF
210
211
212
213
214 IF(itask==0.AND.total_nb_nrtm>0)THEN
215
217 DO i=1,nsn
218 iix(i)=0
219 iiy(i)=0
220 iiz(i)=0
221 IF(stfn(i) == zero)cycle
222 j=nsv(i)
223
224
225 IF(x(1,j) < xmin) cycle
226 IF(x(1,j) > xmax) cycle
227 IF(x(2,j) < ymin) cycle
228 IF(x(2,j) >
ymax) cycle
229 IF(x(3,j) < zmin) cycle
230 IF(x(3,j) > zmax) cycle
231 iix(i)=int(nbx*(x(1,j)-xminb)/(xmaxb-xminb))
232 iiy(i)=int(nby*(x(2,j)-yminb)/(ymaxb-yminb))
233 iiz(i)=int(nbz*(x(3,j)-zminb)/(zmaxb-zminb))
234 iix(i)=
max(1,2+
min(nbx,iix(i)))
235 iiy(i)=
max(1,2+
min(nby,iiy(i)))
236 iiz(i)=
max(1,2+
min(nbz,iiz(i)))
237 first = voxel(iix(i),iiy(i),iiz(i))
238 IF(test_v0) THEN
239
240 IF(iix(i) == 1 .OR. iiy(i) == 1 .OR. iiz(i) == 1 .AND.
241 . iix(i) == nbx+2 .OR. iiy(i) == nby+2 .OR. iiz(i) == nbz+2) THEN
242 cpt_vox0 = cpt_vox0 +1
243 ENDIF
244 ENDIF
245 IF(first == 0)THEN
246
247 voxel(iix(i),iiy(i),iiz(i)) = i
249 last_nod(i) = 0
250 ELSEIF(last_nod(first) == 0)THEN
251
252
254 last_nod(first) = i
256 ELSE
257
258
259 last = last_nod(first)
261 last_nod(first) = i
263 ENDIF
264 ENDDO
265
266
267
268
269 DO j = 1, nsnr
270
271 IF(xrem(1,j) < xmin) cycle
272 IF(xrem(1,j) > xmax) cycle
273 IF(xrem(2,j) < ymin) cycle
274 IF(xrem(2,j) >
ymax) cycle
275 IF(xrem(3,j) < zmin) cycle
276 IF(xrem(3,j) > zmax) cycle
277
278 remote_s_node = remote_s_node + 1
279 list_remote_s_node( remote_s_node ) = j
280 iix(nsn+j)=int(nbx*(xrem(1,j)-xminb)/(xmaxb-xminb))
281 iiy(nsn+j)=int(nby*(xrem(2,j)-yminb)/(ymaxb-yminb))
282 iiz(nsn+j)=int(nbz*(xrem(3,j)-zminb)/(zmaxb-zminb))
283 iix(nsn+j)=
max(1,2+
min(nbx,iix(nsn+j)))
284 iiy(nsn+j)=
max(1,2+
min(nby,iiy(nsn+j)))
285 iiz(nsn+j)=
max(1,2+
min(nbz,iiz(nsn+j)))
286
287 first = voxel(iix(nsn+j),iiy(nsn+j),iiz(nsn+j))
288 IF(test_v0) THEN
289
290 IF(iix(j+nsn) == 1 .OR. iiy(j+nsn) == 1 .OR. iiz(j+nsn) == 1 .AND.
291 . iix(j+nsn) == nbx+2 .OR. iiy(j+nsn) == nby+2 .OR. iiz(j+nsn) == nbz+2) THEN
292 cpt_vox0 = cpt_vox0 +1
293 ENDIF
294 ENDIF
295
296 IF(first == 0)THEN
297
298 voxel(iix(nsn+j),iiy(nsn+j),iiz(nsn+j)) = nsn+j
300 last_nod(nsn+j) = 0
301 ELSEIF(last_nod(first) == 0)THEN
302
304 last_nod(first) = nsn+j
306 ELSE
307
308 last = last_nod(first)
310 last_nod(first) = nsn+j ! last
312 ENDIF
313 ENDDO
314 END IF
315
317
319
320
321
323 IF(itask == 0) THEN
324 IF(cpt_vox0 > 5*(remote_s_node + nsn)/100)
to_trim(nin) = .false.
326 ENDIF
328 ENDIF
329
330
331
332
333
334 j_stok = 0
335 IF(flagremnode == 2) THEN
336 ALLOCATE(tagremnode(numnod+numfakenodigeo))
337 DO i=1,numnod+numfakenodigeo
338 tagremnode(i) = 0
339 ENDDO
340 ENDIF
341 DO ne=1,nrtm
342 IF(stf(ne) == zero)cycle
343 IF(flagremnode == 2) THEN
344 k = kremnod(2*(ne-1)+1)+1
345 l = kremnod(2*(ne-1)+2)
346 DO i=k,l
347 tagremnode(remnod(i)) = 1
348 ENDDO
349 ENDIF
350 IF(igap == 0)THEN
351 aaa = tzinf+curv_max(ne)
352 ELSE
353 aaa = marge+curv_max(ne)+
max(
min(gapmax,
max(gapmin,bgapsmx+gap_m(ne)))+dgapload,drad)
354 ENDIF
355
356
357 m1 = irect(1,ne)
358 m2 = irect(2,ne)
359 m3 = irect(3,ne)
360 m4 = irect(4,ne)
361
362 xx1=x(1,m1)
363 xx2=x(1,m2)
364 xx3=x(1,m3)
365 xx4=x(1,m4)
366 xmaxe=
max(xx1,xx2,xx3,xx4)
367 xmine=
min(xx1,xx2,xx3,xx4)
368
369 yy1=x(2,m1)
370 yy2=x(2,m2)
371 yy3=x(2,m3)
372 yy4=x(2,m4)
373 ymaxe=
max(yy1,yy2,yy3,yy4)
374 ymine=
min(yy1,yy2,yy3,yy4)
375
376 zz1=x(3,m1)
377 zz2=x(3,m2)
378 zz3=x(3,m3)
379 zz4=x(3,m4)
380 zmaxe=
max(zz1,zz2,zz3,zz4)
381 zmine=
min(zz1,zz2,zz3,zz4)
382
383
384 sx = (yy3-yy1)*(zz4-zz2) - (zz3-zz1)*(yy4-yy2)
385 sy = (zz3-zz1)*(xx4-xx2) - (xx3-xx1)*(zz4-zz2)
386 sz = (xx3-xx1)*(yy4-yy2) - (yy3-yy1)*(xx4-xx2)
387 s2 = sx*sx + sy*sy + sz*sz
388
389
390 IF(nbx>1) THEN
391 ix1=int(nbx*(xmine-aaa-xminb)/(xmaxb-xminb))
392 ix2=int(nbx*(xmaxe+aaa-xminb)/(xmaxb-xminb))
393 ELSE
394 ix1=-2
395 ix2=1
396 ENDIF
397
398 IF(nby>1) THEN
399 iy1=int(nby*(ymine-aaa-yminb)/(ymaxb-yminb))
400 iy2=int(nby*(ymaxe+aaa-yminb)/(ymaxb-yminb))
401 ELSE
402 iy1=-2
403 iy2=1
404 ENDIF
405
406 IF(nbz>1) THEN
407 iz1=int(nbz*(zmine-aaa-zminb)/(zmaxb-zminb))
408 iz2=int(nbz*(zmaxe+aaa-zminb)/(zmaxb-zminb))
409 ELSE
410 iz1=-2
411 iz2=1
412 ENDIF
413
417
421
422
423
424
425
426
427 DO iz = iz1,iz2
428 DO iy = iy1,iy2
429 DO ix = ix1,ix2
430
431
432
433 jj = voxel(ix,iy,iz)
434 DO WHILE(jj /= 0)
435 delnod = 0
436
437
438 IF(jj<=nsn)THEN
439 nn=nsv(jj)
440
441 IF(nn == m1)GOTO 200
442 IF(nn == m2)GOTO 200
443 IF(nn == m3)GOTO 200
444 IF(nn == m4)GOTO 200
445
446 IF(flagremnode == 2) THEN
447 IF( tagremnode(nsv(jj)) == 1)GOTO 200
448 ENDIF
449 xs = x(1,nn)
450 ys = x(2,nn)
451 zs = x(3,nn)
452 IF(igap /= 0)THEN
453 aaa = marge+curv_max(ne)+
max(
min
454 ENDIF
455 ELSE
456 j=jj-nsn
457 IF(flagremnode == 2) THEN
459 k = kremnod(2*(ne-1)+2) + 1
460 l = kremnod(2*(ne-1)+3)
461 DO m=k,l
462 IF(remnod(m) == -
irem(2,j) )
THEN
463 delnod = delnod + 1
464 EXIT
465 ENDIF
466 ENDDO
467 IF(delnod /= 0)GOTO 200
468 ENDIF
469
470 xs = xrem(1,j)
471 ys = xrem(2,j)
472 zs = xrem(3,j)
473 IF(igap /= 0)THEN
474 aaa = marge+curv_max(ne)+
max(
min(gapmax,
max(gapmin,xrem(9,j)+gap_m(ne)))+dgapload,drad)
475 ENDIF
476 ENDIF
477
478 IF(xs<=xmine-aaa)GOTO 200
479 IF(xs>=xmaxe+aaa)GOTO 200
480 IF(ys<=ymine-aaa)GOTO 200
481 IF(ys>=ymaxe+aaa)GOTO 200
482 IF(zs<=zmine-aaa)GOTO 200
483 IF(zs>=zmaxe+aaa)GOTO 200
484
485
486
487
488 d1x = xs - xx1
489 d1y = ys - yy1
490 d1z = zs - zz1
491 d2x = xs - xx2
492 d2y = ys - yy2
493 d2z = zs - zz2
494 dd1 = d1x*sx+d1y*sy+d1z*sz
495 dd2 = d2x*sx+d2y*sy+d2z*sz
496 IF(dd1*dd2 > zero)THEN
497 d2 =
min(dd1*dd1,dd2*dd2)
498 a2 = aaa*aaa*s2
499 IF(d2 > a2)GOTO 200
500 ENDIF
501
502
503
504 j_stok = j_stok + 1
505 prov_n(j_stok) = jj
506 prov_e(j_stok) = ne
507 IF(j_stok == nvsiz)THEN
509 1 nvsiz ,irect ,x ,nsv ,ii_stok,
510 2 cand_n,cand_e ,mulnsn,noint ,marge ,
511 3 i_mem ,prov_n ,prov_e,eshift,inacti ,
512 4 ifq ,cand_a ,cand_p,ifpen ,nsn ,
513 5 oldnum,nsnrold,igap ,gap ,gap_s ,
514 6 gap_m ,gapmin ,gapmax,curv_max,nin ,
515 7 gap_s_l,gap_m_l,intth,drad,itied ,
516 8 cand_f ,dgapload)
517 IF(i_mem==2)GOTO 100
518 j_stok = 0
519 ENDIF
520 200 CONTINUE
522 ENDDO
523 ENDDO
524 ENDDO
525 ENDDO
526 IF(flagremnode == 2) THEN
527 k = kremnod(2*(ne-1)+1)+1
528 l = kremnod(2*(ne-1)+2)
529 DO i=k,l
530 tagremnode(remnod(i)) = 0
531 ENDDO
532 ENDIF
533 ENDDO
534
535
536
537 IF(j_stok/=0)
CALL i7sto(
538 1 j_stok,irect ,x ,nsv ,ii_stok,
539 2 cand_n,cand_e ,mulnsn,noint ,marge ,
540 3 i_mem ,prov_n ,prov_e,eshift,inacti ,
541 4 ifq ,cand_a ,cand_p,ifpen ,nsn ,
542 5 oldnum,nsnrold,igap ,gap ,gap_s ,
543 6 gap_m ,gapmin ,gapmax,curv_max,nin ,
544 7 gap_s_l,gap_m_l,intth,drad ,itied ,
545 8 cand_f ,dgapload)
546
547
548
549
550 100 CONTINUE
551
553 IF(total_nb_nrtm>0) THEN
554 nsnf = 1 + itask*nsn / nthread
555 nsnl = (itask+1)*nsn / nthread
556 DO i=nsnf,nsnl
557 IF(iix(i)/=0)THEN
558 voxel(iix(i),iiy(i),iiz(i))=0
559 ENDIF
560 ENDDO
561 nsnf = 1 + itask*remote_s_node / nthread
562 nsnl = (itask+1)*remote_s_node / nthread
563 IF(itask+1==nthread) nsnl=remote_s_node
564 DO jj = nsnf, nsnl
565 j = list_remote_s_node(jj)
566 voxel(iix(nsn+j),iiy(nsn+j),iiz(nsn+j))=0
567 ENDDO
568 ENDIF
570
571
572
573
574
575 dbg_type18_fvm=.false.
576 if(inacti==7 .AND. dbg_type18_fvm)then
577 write(*,fmt='(A)')"------------------------------------------"
578 write(*,*)"RESULT : Search Algorithm with VOXEL partitioning"
579 write(*,*)" Number of couples =", ii_stok
580 if(ii_stok>0)then
581 write(*,fmt='(A,(I10))')" --> SECONDARY Node ids: ", cand_n(1:ii_stok)
582 write(*,fmt='(A,(I10))')" --> Local Face ids: ", cand_e(1:ii_stok)
583 endif
584 write(*,*)" Structure domain :"
585 write(*,fmt='(A,F30.16,A,F30.16)')" Xmin=",xmin," Xmax=",xmax
586 write(*,fmt=
'(A,F30.16,A,F30.16)')
" Ymin=",ymin,
" Ymax=",
ymax
587 write(*,fmt='(A,F30.16,A,F30.16)')" Zmin=",zmin," Zmax=",zmax
588 write(*,*)" Partitioning domain :"
589 write(*,*)" TZINF,AAA=",tzinf,aaa
590 write(*,fmt='(A,F30.16,A,F30.16)')" Xmin=",xmin-aaa," Xmax=",xmax+aaa
591 write(*,fmt=
'(A,F30.16,A,F30.16)')
" Ymin=",ymin-aaa,
" Ymax=",
ymax+aaa
592 write(*,fmt='(A,F30.16,A,F30.16)')" Zmin=",zmin-aaa," Zmax=",zmax+aaa
593 write(*,fmt='(A)')"------------------------------------------"
594 endif
595
596
597
598
599 IF(itask == 0)THEN
601 DEALLOCATE(iix)
602 DEALLOCATE(iiy)
603 DEALLOCATE(iiz)
604 ENDIF
605 IF(flagremnode == 2) THEN
606 IF(ALLOCATED(tagremnode)) DEALLOCATE(tagremnode)
607 ENDIF
608
609
610 RETURN
subroutine i7sto(j_stok, irect, x, nsv, ii_stok, cand_n, cand_e, mulnsn, noint, marge, i_mem, prov_n, prov_e, eshift, inacti, ifq, cand_a, cand_p, ifpen, nsn, oldnum, nsnrold, igap, gap, gap_s, gap_m, gapmin, gapmax, curv_max, nin, gap_s_l, gap_m_l, intth, drad, itied, cand_f, dgapload)
subroutine ymax(idn, fac, npc, pld, stiffmin, stiffmax, stiffini, stiffavg)
logical, dimension(:), allocatable first_test
integer, dimension(:), allocatable next_nod
logical, dimension(:), allocatable to_trim
integer, dimension(:,:), allocatable irem
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)