47
48
49
51
52
53
54#include "implicit_f.inc"
55
56
57
58#include "mvsiz_p.inc"
59
60 INTEGER NVECSZ
61 parameter(nvecsz = mvsiz)
62
63
64
65#include "com01_c.inc"
66#include "com04_c.inc"
67#include "param_c.inc"
68#include "task_c.inc"
69
70
71
72
73
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 INTEGER I_MEM,ESHIFT,NSN,ISZNSNR,NRTM,NIN,ITASK,
107 . MULNSN,NOINT,NSNR,NBX,NBY,NBZ,IEDGE,NSNE,
108 . NSV(*),CAND_N(*),CAND_E(*),
109 . IRECT(4,*), VOXEL(NBX+2,NBY+2,NBZ+2),II_STOK,ITAB(*),
110 . NBINFLG(*),MBINFLG(*),ILEV,MSEGTYP(*),CAND_T(*),
111 . ISEADD(*) ,ISEDGE(*),FLAGREMNODE,KREMNOD(*),REMNOD(*),CAND_A(*),
112 . RENUM(*),NSNROLD,IRTSE(5,*),IS2SE(2,*)
113 INTEGER, INTENT(IN) :: INTHEAT
114 INTEGER, INTENT(IN) :: IDT_THERM
115 INTEGER, INTENT(IN) :: NODADT_THERM
116
118 . x(3,*),v(3,*),xyzm(6),stf(*),stfn(*),gap_s(*),
119 . gap_m(*),curv_max(*),pene_old(5,nsn),edge_l2(*),
120 . marge,bgapsmx,pmax_gap,vmaxdt
121 my_real ,
INTENT(IN) :: dgapload
122
123
124
125 INTEGER NB_NCN,NB_NCN1,NB_ECN,I,J,DIR,NB_NC,NB_EC,
126 . N1,N2,N3,N4,NN,NE,K,L,J_STOK,II,JJ,
127 . PROV_N(MVSIZ),PROV_E(MVSIZ),
128 . OLDNUM(ISZNSNR), NSNF, NSNL,M,NSE,NS,ip
129
131 . dx,dy,dz,xs,ys,zs,xx,sx,sy,sz,s2,
132 . xmin, xmax,ymin,
ymax,zmin, zmax, tz, gapsmx, gapl,
133 . xx1,xx2,xx3,xx4,yy1,yy2,yy3,yy4,zz1,zz2,zz3,zz4,
134 . d1x,d1y,d1z,d2x,d2y,d2z,dd1,dd2,d2,a2,gs
135
136 INTEGER LAST_NOD(NSN+NSNR)
137 INTEGER IX,IY,IZ,NEXT,M1,M2,M3,M4,
138 . IX1,IY1,IZ1,IX2,IY2,IZ2
139 INTEGER, DIMENSION(:),ALLOCATABLE :: IIX,IIY,IIZ
141 . xminb,yminb,zminb,xmaxb,ymaxb,zmaxb,
142 . xmine,ymine,zmine,xmaxe,ymaxe,zmaxe,aaa
143 INTEGER FIRST,NEW,LAST
144 SAVE iix,iiy,iiz
145 INTEGER, DIMENSION(NUMNOD+NSNE) :: TAG
146
147
148
149 INTEGER IK1(4),IK2(4),IE1,IE2,IED,NS1,NS2,NS1ID,NS2ID
150 DATA ik1 /1,2,3,4/
151 DATA ik2 /2,3,4,1/
152
153 IF(itask == 0)THEN
155 ALLOCATE(iix(nsn+nsnr))
156 ALLOCATE(iiy(nsn+nsnr))
157 ALLOCATE(iiz(nsn+nsnr))
158 END IF
159
161
162
163 xmin = xyzm(1)
164 ymin = xyzm(2)
165 zmin = xyzm(3)
166 xmax = xyzm(4)
168 zmax = xyzm(6)
169
170
171 xminb = xmin
172 yminb = ymin
173 zminb = zmin
174 xmaxb = xmax
176 zmaxb = zmax
177
178
179
180
181 IF(nspmd>1) THEN
182 CALL spmd_oldnumcd(renum,oldnum,isznsnr,nsnrold,intheat,idt_therm,nodadt_therm)
183 END IF
184
185
186
187
188
189
190
191 IF(itask == 0)THEN
192 DO i=1,nsn
193 iix(i)=0
194 iiy(i)=0
195 iiz(i)=0
196 IF(stfn(i) == zero)cycle
197 j=nsv(i)
198
199
200 IF(x(1,j) < xmin) cycle
201 IF(x(1,j) > xmax) cycle
202 IF(x(2,j) < ymin) cycle
203 IF(x(2,j) >
ymax) cycle
204 IF(x(3,j) < zmin) cycle
205 IF(x(3,j) > zmax) cycle
206
207 iix(i)=int(nbx*(x(1,j)-xminb)/(xmaxb-xminb))
208 iiy(i)=int(nby*(x(2,j)-yminb)/(ymaxb-yminb))
209 iiz(i)=int(nbz*(x(3,j)-zminb)/(zmaxb-zminb))
210
211 iix(i)=
max(1,2+
min(nbx,iix(i)))
212 iiy(i)=
max(1,2+
min(nby,iiy(i)))
213 iiz(i)=
max(1,2+
min(nbz,iiz(i)))
214
215 first = voxel(iix(i),iiy(i),iiz(i))
216 IF(first == 0)THEN
217
218 voxel(iix(i),iiy(i),iiz(i)) = i
220 last_nod(i) = 0
221 ELSEIF(last_nod(first) == 0)THEN
222
223
225 last_nod(first) = i
227 ELSE
228
229
230 last = last_nod(first)
232 last_nod(first) = i
234 ENDIF
235 ENDDO
236
237
238
239
240 DO j = 1, nsnr
241
242 IF(
irem(8,j)==-1) cycle
243
244
245 iix(nsn+j)=int(nbx*(xrem(1,j)-xminb)/(xmaxb-xminb))
246 iiy(nsn+j)=int(nby*(xrem(2,j)-yminb)/(ymaxb-yminb))
247 iiz(nsn+j)=int(nbz*(xrem(3,j)-zminb)/(zmaxb-zminb))
248 iix(nsn+j)=
max(1,2+
min(nbx,iix(nsn+j)))
249 iiy(nsn+j)=
max(1,2+
min(nby,iiy(nsn+j)))
250 iiz(nsn+j)=
max(1,2+
min(nbz,iiz(nsn+j)))
251
252 first = voxel(iix(nsn+j),iiy(nsn+j),iiz(nsn+j))
253 IF(first == 0)THEN
254
255 voxel(iix(nsn+j),iiy(nsn+j),iiz(nsn+j)) = nsn+j
257 last_nod(nsn+j) = 0
258 ELSEIF(last_nod(first) == 0)THEN
259
260
262 last_nod(first) = nsn+j
264 ELSE
265
266
267 last = last_nod(first)
269 last_nod(first) = nsn+j
271 ENDIF
272 ENDDO
273 END IF
274
276
277
278
279
280 j_stok = 0
281 IF(flagremnode == 2)THEN
282 DO i=1,numnod+nsne
283 tag(i) = 0
284 ENDDO
285 END IF
286
287 DO ne=1,nrtm
288
289 IF(stf(ne) == zero)cycle
290
291 aaa = marge+curv_max(ne)+bgapsmx+pmax_gap+vmaxdt
292 + + gap_m(ne)+dgapload
293
294
295
296
297
298 m1 = irect(1,ne)
299 m2 = irect(2,ne)
300 m3 = irect(3,ne)
301 m4 = irect(4,ne)
302
303 xx1=x(1,m1)
304 xx2=x(1,m2)
305 xx3=x(1,m3)
306 xx4=x(1,m4)
307 xmaxe=
max(xx1,xx2,xx3,xx4)
308 xmine=
min(xx1,xx2,xx3,xx4)
309
310 yy1=x(2,m1)
311 yy2=x(2,m2)
312 yy3=x(2,m3)
313 yy4=x(2,m4)
314 ymaxe=
max(yy1,yy2,yy3,yy4)
315 ymine=
min(yy1,yy2,yy3,yy4)
316
317 zz1=x(3,m1)
318 zz2=x(3,m2)
319 zz3=x(3,m3)
320 zz4=x(3,m4)
321 zmaxe=
max(zz1,zz2,zz3,zz4)
322 zmine=
min(zz1,zz2,zz3,zz4)
323
324
325
326
327 sx = (yy3-yy1)*(zz4-zz2) - (zz3-zz1)*(yy4-yy2)
328 sy = (zz3-zz1)*(xx4-xx2) - (xx3-xx1)*(zz4-zz2)
329 sz = (xx3-xx1)*(yy4-yy2) - (yy3-yy1)*(xx4-xx2)
330 s2 = sx*sx + sy*sy + sz*sz
331
332
333
334 ix1=int(nbx*(xmine-aaa-xminb)/(xmaxb
335 iy1=int(nby*(ymine-aaa-yminb)/(ymaxb-yminb))
336 iz1=int(nbz*(zmine-aaa-zminb)/(zmaxb-zminb))
337
341
342 ix2=int(nbx*(xmaxe+aaa-xminb)/(xmaxb-xminb))
343 iy2=int(nby*(ymaxe+aaa-yminb)/(ymaxb-yminb))
344 iz2=int(nbz*(zmaxe+aaa-zminb)/(zmaxb-zminb))
345
349
350 IF(flagremnode == 2)THEN
351 k = kremnod(2*(ne-1)+1)+1
352 l = kremnod(2*(ne-1)+2)
353 DO i=k,l
354 tag(remnod(i)) = 1
355 ENDDO
357
358
359
360
361
362 DO iz = iz1,iz2
363 DO iy = iy1,iy2
364 DO ix = ix1,ix2
365
366
367
368 jj = voxel(ix,iy,iz)
369
370 DO WHILE(jj /= 0)
371
372
373
374 IF(jj<=nsn)THEN
375 nn=nsv(jj)
376 IF(nn == m1)GOTO 200
377 IF(nn == m2)GOTO 200
378 IF(nn == m3)GOTO 200
379 IF(nn == m4)GOTO 200
380 IF(flagremnode == 2)THEN
381 IF(tag(nn) == 1)GOTO 200
382 END IF
383
384 IF (nn >numnod) THEN
385 ns = nn-numnod
387 + ns1 ,ns2 )
388 IF(ns1 == m1 .OR. ns2 == m1) GOTO 200
389 IF(ns1 == m2 .OR. ns2 == m2) GOTO 200
390 IF(ns1 == m3 .OR. ns2 == m3) GOTO 200
391 IF(ns1 == m4 .OR. ns2 == m4) GOTO 200
392 END IF
393 xs = x(1,nn)
394 ys = x(2,nn)
395 zs = x(3,nn)
396
397
398
399
400
401 IF (iedge > 0) THEN
402 aaa = marge + curv_max(ne)
403 + +
max(gap_s(jj)+gap_m(ne)+edge_l2(jj)+dgapload
404 + ,pene_old(3,jj))+vmaxdt
405 ELSE
406 aaa = marge + curv_max(ne)
407 + +
max(gap_s(jj)+gap_m(ne)+dgapload
408 + ,pene_old(3,jj))+vmaxdt
409 END IF
410 ELSE
411 j=jj-nsn
412 IF(flagremnode == 2)THEN
413 k = kremnod(2*(ne-1)+2) + 1
414 l = kremnod(2*(ne-1)+3)
415 IF(
irem(8,j)==1)
THEN
416 DO m=k,l
417 IF(remnod(m) == -
irem(2,j) )
GOTO 200
418 ENDDO
419 ELSE
420 DO m=k,l
421 IF(remnod(m) == -
irem(2,j) )
GOTO 200
422 ENDDO
423 ENDIF
425
426
427
428
429 IF(
irem(8,j)==1)
THEN
430
437 IF (ns1id == itab(m1) .OR. ns2id == itab(m1)) GOTO 200
438 IF (ns1id == itab(m2) .OR. ns2id == itab(m2)) GOTO 200
439 IF (ns1id == itab(m3) .OR. ns2id == itab(m3)) GOTO 200
440 IF (ns1id == itab(m4) .OR. ns2id == itab(m4)) GOTO 200
441 ENDIF
442 xs = xrem(1,j)
443 ys = xrem(2,j)
444 zs = xrem(3,j)
445 aaa = marge+curv_max(ne)
446
447
448
450 + + vmaxdt
451 ENDIF
452
453 IF(xs<=xmine-aaa)GOTO 200
454 IF(xs>=xmaxe+aaa)GOTO 200
455 IF(ys<=ymine-aaa)GOTO 200
456 IF(ys>=ymaxe+aaa)GOTO 200
457 IF(zs<=zmine-aaa)GOTO 200
458 IF(zs>=zmaxe+aaa)GOTO 200
459
460
461
462
463
464 d1x = xs - xx1
465 d1y = ys - yy1
466 d1z = zs - zz1
467 d2x = xs - xx2
468 d2y = ys - yy2
469 d2z = zs - zz2
470 dd1 = d1x*sx+d1y*sy+d1z*sz
471 dd2 = d2x*sx+d2y*sy+d2z*sz
472 IF(dd1*dd2 > zero)THEN
473 d2 =
min(dd1*dd1,dd2*dd2)
474 a2 = aaa*aaa*s2
475 IF(d2 > a2)GOTO 200
476 ENDIF
477
478
479
480 j_stok = j_stok + 1
481 prov_n(j_stok) = jj
482 prov_e(j_stok) = ne
483 IF(j_stok == nvsiz)THEN
484
486 1 nvsiz ,irect ,x ,nsv ,ii_stok,
487 2 cand_n,cand_e ,mulnsn,noint ,marge
488 3 i_mem ,prov_n ,prov_e,eshift,v ,
489 4 nsn ,gap_s ,gap_m ,curv_max,nin ,
490 5 pene_old,nbinflg ,mbinflg,ilev,msegtyp,
491 6 edge_l2,iedge,iseadd ,isedge ,cand_t,itab,
492 7 cand_a,oldnum,nsnrold,dgapload)
493 IF(i_mem==2)GOTO 100
494 j_stok = 0
495 ENDIF
496
497 200 CONTINUE
498
500
501 ENDDO
502
503 ENDDO
504 ENDDO
505 ENDDO
506
507
508
509
510 IF(flagremnode == 2)THEN
511 k = kremnod(2*(ne-1)+1)+1
512 l = kremnod(2*(ne-1)+2)
513 DO i=k,l
514 tag(remnod(i)) = 0
515 ENDDO
516 END IF
517 ENDDO
518
519
520
521
523 1 j_stok,irect ,x ,nsv ,ii_stok,
524 2 cand_n,cand_e ,mulnsn,noint ,marge ,
525 3 i_mem ,prov_n ,prov_e,eshift,v ,
526 4 nsn ,gap_s ,gap_m ,curv_max,nin ,
527 5 pene_old,nbinflg,mbinflg,ilev ,msegtyp,
528 6 edge_l2,iedge,iseadd ,isedge ,cand_t,itab,
529 7 cand_a,oldnum,nsnrold,dgapload)
530
531
532
533
534 100 CONTINUE
535
536
538 nsnf = 1 + itask*nsn / nthread
539 nsnl = (itask+1)*nsn / nthread
540
541 DO i=nsnf,nsnl
542 IF(iix(i)/=0)THEN
543 voxel(iix(i),iiy(i),iiz(i))=0
544 ENDIF
545 ENDDO
546
547
548
549
550 nsnf = 1 + itask*nsnr / nthread
551 nsnl = (itask+1)*nsnr / nthread
552 DO j = nsnf, nsnl
553 IF(
irem(8,j)==-1)cycle
554 voxel(iix(nsn+j),iiy(nsn+j),iiz(nsn+j))=0
555 ENDDO
556
557
559 IF(itask == 0)THEN
561 DEALLOCATE(iix)
562 DEALLOCATE(iiy)
563 DEALLOCATE(iiz)
564 ENDIF
565
566 RETURN
if(complex_arithmetic) id
subroutine i24sto(j_stok, irect, x, nsv, ii_stok, cand_n, cand_e, mulnsn, noint, marge, i_mem, prov_n, prov_e, eshift, v, nsn, gap_s, gap_m, curv_max, nin, pene_old, nbinflg, mbinflg, ilev, msegtyp, edge_l2, iedge, iseadd, isedge, cand_t, itab, cand_a, oldnum, nsnrold, dgapload)
subroutine i24fic_getn(ns, irtse, is2se, ie, ns1, ns2)
subroutine ymax(idn, fac, npc, pld, stiffmin, stiffmax, stiffini, stiffavg)
integer, dimension(:), allocatable next_nod
integer, dimension(:,:), allocatable irem