51
52
53
57
58
59
60#include "implicit_f.inc"
61
62
63
64#include "mvsiz_p.inc"
65
66
67
68#include "param_c.inc"
69#include "sms_c.inc"
70#include "assert.inc"
71#include "i25edge_c.inc"
72
73
74
75 INTEGER LEDGE(NLEDGE,*), IRECT(4,*), CAND_M(*), CAND_S(*), ADMSR(4,*),
76 . LBOUND(*), JLT, NRTS, NIN, IEDGE, IGAP0,INTFRIC,IGAP,
77 . N1(MVSIZ), N2(MVSIZ),
78 . M1(MVSIZ), M2(MVSIZ),
79 . NODNX_SMS(*), NSMS(MVSIZ),
80 . ITAB(*),
81 . IAM(MVSIZ),JAM(MVSIZ),IBM(MVSIZ),JBM(MVSIZ),
82 . IAS(MVSIZ),JAS(MVSIZ),IBS(MVSIZ),JBS(MVSIZ),
83 . (*),IPARTFRICSI(MVSIZ),IPARTFRICMI(MVSIZ)
84 INTEGER :: EDGE_ID(2,)
85 INTEGER NEDGE
86 INTEGER , INTENT(IN) :: IGSTI
87 INTEGER , INTENT(IN) :: ISTIF_MSDT
88
90 . x(3,*), stfe(*), ms(*), v(3,*), gape(*),
91 . xxs1(*), xxs2(*), xys1(*), xys2(*),
92 . xzs1(*), xzs2(*), xxm1(*), xxm2(*),
93 . xym1(*), xym2(*), xzm1(*), xzm2(*),
94 . vxs1(*), vxs2(*), vys1(*), vys2(*),
95 . vzs1(*), vzs2(*), vxm1(*)
96 . vym1(*), vym2(*), vzm1(*), vzm2
97 . ms1(*), ms2(*), mm1(*), mm2(*),
98 . stif(*), stfac, sts, stm, gapve(*),
99 . ex(*), ey(*), ez(*), fx(*), fy(*), fz(*),
100 . gap_e_l(nedge)
101 real*4 edg_bisector(3,4,*), vtx_bisector(3,2,*)
102 my_real ,
INTENT(IN) :: kmin, kmax
104 my_real ,
INTENT(IN) :: stifmsdt_edg(nedge)
105 TYPE (PARAMETERS_) ,INTENT(IN):: PARAMETERS
106
107
108
109 INTEGER I ,NN, J, JRM, K, KRM, I1, J1, I2, J2,
110 . EM, IE, ES, JE, SOL_EDGE, SH_EDGE,
111 . TYPEDGS(MVSIZ), IM(MVSIZ), IS(MVSIZ)
112 INTEGER :: NOD1S(MVSIZ),NOD2S(MVSIZ)
113 INTEGER :: NOD1M(MVSIZ),NOD2M(MVSIZ)
114
115 INTEGER :: ISR
117 . aaa, dx, dy, dz, dd, nni, ni2, invcos,dts
119 . gape_m(mvsiz), gape_s(mvsiz), stif_msdt(mvsiz)
120
121 DO i=1,jlt
122
123 em =cand_m(i)
124
125 edge_id(1,i) = ledge(8,em)
126
127 iam(i) = abs(ledge(1,em))
128 jam(i)=ledge(2,em)
129 ibm(i)=ledge(3,em)
130 jbm(i)=ledge(4,em)
131
132 m1(i)=ledge(5,em)
133 m2(i)=ledge(6,em)
134 im(i) = ledge(10,em)
135 nod1m(i) = ledge(11,em)
136 nod2m(i) = ledge(12,em)
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155 stm=stfe(em)
156
157 xxm1(i) = x(1,m1(i))
158 xym1(i) = x(2,m1(i))
159 xzm1(i) = x(3,m1(i))
160 xxm2(i) = x(1,m2(i))
161 xym2(i) = x(2,m2(i))
162 xzm2(i) = x(3,m2(i))
163 vxm1(i) = v(1,m1(i))
164 vym1(i) = v(2,m1(i))
165 vzm1(i) = v(3,m1(i))
166 vxm2(i) = v(1,m2(i))
167 vym2(i) = v(2,m2(i))
168 vzm2(i) = v(3,m2(i))
169 mm1(i) = ms(m1(i))
170 mm2(i) = ms(m2(i))
171
172 IF(cand_s(i)<=nedge) THEN
173
174 es =cand_s(i)
175 edge_id(2,i) = ledge(8,es)
176 ias(i)=abs( ledge(1,es) )
177 jas(i)=ledge(2,es)
178 ibs(i)=ledge(3,es)
179 jbs(i)=ledge(4,es)
180 n1(i)=ledge(5,es)
181 n2(i)=ledge(6,es)
182 nod1s(i) = ledge(11,es)
183 nod2s(i) = ledge(12,es)
184
185 is(i) = ledge(10,es)
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201 sts=stfe(es)
202 stif(i)=sts*stm /
max(em20,sts+stm)
203
204 xxs1(i) = x(1,n1(i))
205 xys1(i) = x(2,n1(i))
206 xzs1(i) = x(3,n1(i))
207 xxs2(i) = x(1,n2(i))
208 xys2(i) = x(2,n2(i))
209 xzs2(i) = x(3,n2(i))
210 vxs1(i) = v(1,n1(i))
211 vys1(i) = v(2,n1(i))
212 vzs1(i) = v(3,n1(i))
213 vxs2(i) = v(1,n2(i))
214 vys2(i) = v(2,n2(i))
215 vzs2(i) = v(3,n2(i))
216 ms1(i) = ms(n1(i))
217 ms2(i) = ms(n2(i))
218
219
220 typedgs(i)=ledge(7,es)
221
222 ELSE
223
224
225
226
227
228
229
230
231 nn = cand_s(i) - nedge
233
234 n1(i)=2*(nn-1)+1
235 n2(i)=2*nn
236
237
238
239
240
241 edge_id(2,i) =
ledge_fie(nin)%P(e_global_id,nn)
242
243 ias(i)=abs(
ledge_fie(nin)%P(e_left_seg ,nn) )
249 stif(i)=sts*stm /
max(em20,sts+stm)
250
251
252
253
254
255
256
257
258
259
260 xxs1(i) =
xfie(nin)%P(1,n1(i))
261 xys1(i) =
xfie(nin)%P(2,n1(i))
262 xzs1(i) =
xfie(nin)%P(3,n1(i))
263 xxs2(i) =
xfie(nin)%P(1,n2(i))
264 xys2(i) =
xfie(nin)%P(2,n2(i))
265 xzs2(i) =
xfie(nin)%P(3,n2(i))
266 vxs1(i) =
vfie(nin)%P(1,n1(i))
267 vys1(i) =
vfie(nin)%P(2,n1(i))
268 vzs1(i) =
vfie(nin)%P(3,n1(i))
269 vxs2(i) =
vfie(nin)%P(1,n2(i))
270 vys2(i) =
vfie(nin)%P(2,n2(i))
271 vzs2(i) =
vfie(nin)%P(3,n2(i))
272 ms1(i) =
msfie(nin)%P(n1(i))
273 ms2(i) =
msfie(nin)%P(n2(i))
274 END IF
275
276
277 END DO
278
279
280
281
282
283 IF(istif_msdt > 0) THEN
284 IF(dtstif > zero) THEN
285 dts = dtstif
286 ELSE
287 dts = parameters%DT_STIFINT
288 ENDIF
289 DO i=1,jlt
290 em =cand_m(i)
291 IF(cand_s(i)<=nedge) THEN
292 es =cand_s(i)
293 stif_msdt(i) = stifmsdt_edg(es)
294 ELSE
295 nn = cand_s(i) - nedge
297 ENDIF
298 stif_msdt(i) = stifmsdt_edg(em)*stif_msdt(i)/(stifmsdt_edg(em)+stif_msdt(i))
299
300 stif_msdt(i) = stif_msdt(i)/(dts*dts)
301 stif(i)=
max(stif(i),stif_msdt(i))
302 ENDDO
303 ENDIF
304
305 DO i=1,jlt
306 stif(i)=
max(kmin,
min(stif(i),kmax))
307 ENDDO
308
309 sol_edge=iedge/10
310 sh_edge =iedge-10*sol_edge
311
312 ex(1:jlt)=zero
313 ey(1:jlt)=zero
314 ez(1:jlt)=zero
315 fx(1:jlt)=zero
316 fy(1:jlt)=zero
317 fz(1:jlt)=zero
318 IF(sh_edge/=0)THEN
319 DO i=1,jlt
320
321
322
323
324 ex(i) = edg_bisector(1,jam(i),iam(i))
325 ey(i) = edg_bisector(2,jam(i),iam(i))
326 ez(i) = edg_bisector(3,jam(i),iam(i))
327
328 IF(iabs(typedgs(i))/=1)THEN
329 IF(cand_s(i)<=nedge) THEN
330 fx(i) = edg_bisector(1,jas(i),ias(i))
331 fy(i) = edg_bisector(2,jas(i),ias(i))
332 fz(i) = edg_bisector(3,jas(i),ias(i))
333 ELSE
337 END IF
338 END IF
339 END DO
340 END IF
341
342 DO i=1,jlt
343 gape_m(i)=gape(cand_m(i))
344 IF(cand_s(i)<=nedge) THEN
345 gape_s(i)=gape(cand_s(i))
346 ELSE
347 gape_s(i)=
gapfie(nin)%P(cand_s(i) - nedge)
348 END IF
349 debug_e2e(edge_id(1,i) == d_em .AND. edge_id(2,i) == d_es,gape_s(i))
350 gapve(i)=gape_m(i)+gape_s(i)
351 END DO
352 IF(igap == 3) THEN
353 DO i=1,jlt
354 gape_m(i)=
min(gape_m(i),gap_e_l(cand_m(i)))
355 IF(cand_s(i)<=nedge) THEN
356 gape_s(i)=
min(gape_s(i),gap_e_l(cand_s(i)))
357 gapve(i)=
min(gap_e_l(cand_m(i))+gap_e_l(cand_s(i)),gapve(i))
358 ELSE
359 gape_s(i)=
min(gape_s(i),
gape_l_fie(nin)%P(cand_s(i) - nedge))
360 gapve(i)=
min(gap_e_l(cand_m(i))+
gape_l_fie(nin)%P(cand_s(i) - nedge),gapve(i))
361 ENDIF
362 ENDDO
363 ENDIF
364
365
366 DO i=1,jlt
367
368 IF(ibm(i)/=0)cycle
369
370 ie=iam(i)
371 je=jam(i)
372
373 i1 = nod1m(i)
374 i2 = nod2m(i)
375 ex(i) = edg_bisector(1,je,ie)
376 ey(i) = edg_bisector(2,je,ie)
377 ez(i) = edg_bisector(3,je,ie)
378
379
380 dx = vtx_bisector(1,1,i1)+vtx_bisector(1,2,i1)
381 dy = vtx_bisector(2,1,i1)+vtx_bisector(2,2,i1)
382 dz = vtx_bisector(3,1,i1)+vtx_bisector(3,2,i1)
383
384 nni = ex(i)*dx + ey(i)*dy + ez(i)*dz
385 ni2 = dx*dx + dy*dy + dz*dz
386
387 debug_e2e( edge_id(1,i) == d_em.AND. edge_id(2,i) == d_es ,ex(i))
388 debug_e2e( edge_id(1,i) == d_em.AND. edge_id(2,i) == d_es ,ey(i))
389 debug_e2e( edge_id(1,i) == d_em.AND. edge_id(2,i) == d_es ,ez(i))
390 debug_e2e( edge_id(1,i) == d_em.AND. edge_id(2,i) == d_es ,dx)
391 debug_e2e( edge_id(1,i) == d_em.AND. edge_id(2,i) == d_es ,dy)
392 debug_e2e( edge_id(1,i) == d_em.AND. edge_id(2,i) == d_es ,dz)
393
394 IF(nni < zero)THEN
395 dx=dx-two*nni*ex(i)
396 dy=dy-two*nni*ey(i)
397 dz=dz-two*nni*ez(i)
398 nni=-nni
399 END IF
400
401 IF(two*nni*nni < ni2)THEN
402
403 aaa = sqrt(
max(zero,ni2-nni*nni)) - nni
404 dx = dx + aaa*ex(i)
405 dy = dy + aaa*ey(i)
406 dz = dz + aaa*ez(i)
407 ENDIF
408 dd=one/
max(em20,sqrt(dx*dx+dy*dy+dz*dz))
409 dx = dx*dd
410 dy = dy*dd
411 dz = dz*dd
412 invcos = one /
max(em20,ex(i)*dx + ey(i)*dy + ez(i)*dz)
413 dx = dx*invcos
414 dy = dy*invcos
415 dz = dz*invcos
416
417 xxm1(i) = xxm1(i)-gape_m(i)*dx
418 xym1(i) = xym1(i)-gape_m(i)*dy
419 xzm1(i) = xzm1(i)-gape_m(i)*dz
420
421
422 dx = vtx_bisector(1,1,i2)+vtx_bisector(1,2,i2)
423 dy = vtx_bisector(2,1,i2)+vtx_bisector(2,2,i2)
424 dz = vtx_bisector(3,1,i2)+vtx_bisector(3,2,i2)
425
426 nni = ex(i)*dx + ey(i)*dy + ez(i)*dz
427 ni2 = dx*dx + dy*dy + dz*dz
428
429 IF(nni < zero)THEN
430 dx=dx-two*nni*ex(i)
431 dy=dy-two*nni*ey(i)
432 dz=dz-two*nni*ez(i)
433 nni=-nni
434 END IF
435
436 IF(two*nni*nni < ni2)THEN
437
438 aaa = sqrt(
max(zero,ni2-nni*nni)) - nni
439 dx = dx + aaa*ex(i)
440 dy = dy + aaa*ey(i)
441 dz = dz + aaa*ez(i)
442 ENDIF
443 dd=one/
max(em20,sqrt(dx*dx+dy*dy+dz*dz))
444 dx = dx*dd
445 dy = dy*dd
446 dz = dz*dd
447 invcos = one /
max(em20,ex(i)*dx + ey(i)*dy + ez(i)*dz)
448 dx = dx*invcos
449 dy = dy*invcos
450 dz = dz*invcos
451
452 xxm2(i) = xxm2(i)-gape_m(i)*dx
453 xym2(i) = xym2(i)-gape_m(i)*dy
454 xzm2(i) = xzm2(i)-gape_m(i)*dz
455
456 END DO
457
458 IF(igap0/=0)THEN
459
460
461 DO i=1,jlt
462 debug_e2e(edge_id(1,i) == d_em .AND. edge_id(2,i) == d_es,ibs(i))
463
464 IF(ibs(i)/=0)cycle
465
466 IF(cand_s(i)<=nedge) THEN
467 ie=ias(i)
468 je=jas(i)
469
470 i1 = nod1s(i)
471 i2 = nod2s(i)
472
473 fx(i) = edg_bisector(1,je,ie)
474 fy(i) = edg_bisector(2,je,ie)
475 fz(i) = edg_bisector(3,je,ie)
476
477
478 dx = vtx_bisector(1,1,i1)+vtx_bisector(1,2,i1)
479 dy = vtx_bisector(2,1,i1)+vtx_bisector(2,2,i1)
480 dz = vtx_bisector(3,1,i1)+vtx_bisector(3,2,i1)
481 assert(fx(i) == fx(i))
482 assert(fy(i) == fy(i))
483 assert(fz(i) == fz(i))
484 ELSE
488
489 assert(fx(i) == fx(i))
490 assert(fy(i) == fy(i))
491 assert(fz(i) == fz(i))
492
496 assert(dx == dx)
497 assert(dy == dy)
498 assert(dz == dz)
499 ENDIF
500
501 nni = fx(i)*dx + fy(i)*dy + fz(i)*dz
502 ni2 = dx*dx + dy*dy + dz*dz
503
504 IF(nni < zero)THEN
505 dx=dx-two*nni*fx(i)
506 dy=dy-two*nni*fy(i)
507 dz=dz-two*nni*fz(i)
508 nni=-nni
509 END IF
510
511 IF(two*nni*nni < ni2)THEN
512
513 aaa = sqrt(
max(zero,ni2-nni*nni)) - nni
514 dx = dx + aaa*fx(i)
515 dy = dy + aaa*fy(i)
516 dz = dz + aaa*fz(i)
517 ENDIF
518 dd=one/
max(em20,sqrt(dx*dx+dy*dy+dz*dz))
519 dx = dx*dd
520 dy = dy*dd
521 dz = dz*dd
522 invcos = one /
max(em20,fx(i)*dx + fy(i)*dy + fz(i)*dz)
523 dx = dx*invcos
524 dy = dy*invcos
525 dz = dz*invcos
526
527 xxs1(i) = xxs1(i)-gape_s(i)*dx
528 xys1(i) = xys1(i)-gape_s(i)*dy
529 xzs1(i) = xzs1(i)-gape_s(i)*dz
530
531 IF(cand_s(i)<=nedge) THEN
532
533 dx = vtx_bisector(1,1,i2)+vtx_bisector(1,2,i2)
534 dy = vtx_bisector(2,1,i2)+vtx_bisector(2,2,i2)
535 dz = vtx_bisector(3,1,i2)+vtx_bisector(3,2,i2)
536 assert(dx == dx)
537 assert(dy == dy)
538 assert(dz == dz)
539 ELSE
543 assert(dx == dx)
544 assert(dy == dy)
545 assert(dz == dz)
546 ENDIF
547
548 nni = fx(i)*dx + fy(i)*dy + fz(i)*dz
549 ni2 = dx*dx + dy*dy + dz*dz
550
551 IF(nni < zero)THEN
552 dx=dx-two*nni*fx(i)
553 dy=dy-two*nni*fy(i)
554 dz=dz-two*nni*fz(i)
555 nni=-nni
556 END IF
557
558 IF(two*nni*nni < ni2)THEN
559
560 aaa = sqrt(
max(zero,ni2-nni*nni)) - nni
561 dx = dx + aaa*fx(i)
562 dy = dy + aaa*fy(i)
563 dz = dz + aaa*fz(i)
564 ENDIF
565 dd=one/
max(em20,sqrt(dx*dx+dy*dy+dz*dz))
566 dx = dx*dd
567 dy = dy*dd
568 dz = dz*dd
569 invcos = one /
max(em20,fx(i)*dx + fy(i)*dy + fz(i)*dz)
570 dx = dx*invcos
571 dy = dy*invcos
572 dz = dz*invcos
573
574 xxs2(i) = xxs2(i)-gape_s(i)*dx
575 xys2(i) = xys2(i)-gape_s(i)*dy
576 xzs2(i) = xzs2(i)-gape_s(i)*dz
577
578 END DO
579 END IF
580
581 IF(idtmins==2)THEN
582 DO i=1,jlt
583 IF(cand_s(i)<=nedge)THEN
584 nsms(i)=nodnx_sms(n1(i))+nodnx_sms(n2(i))+
585 . nodnx_sms(m1(i))+nodnx_sms(m2(i))
586 ELSE
588 . nodnx_sms(m1(i))+nodnx_sms(m2(i))
589 END IF
590 ENDDO
591 IF(idtmins_int/=0)THEN
592 DO i=1,jlt
593 IF(nsms(i)==0)nsms(i)=-1
594 ENDDO
595 END IF
596 ELSEIF(idtmins_int/=0)THEN
597 DO i=1,jlt
598 nsms(i)=-1
599 ENDDO
600 ENDIF
601
602
603 IF(intfric > 0) THEN
604 DO i=1,jlt
605
606 IF(cand_s(i)<=nedge)THEN
607 ipartfricsi(i) = ipartfric_e(cand_s(i))
608 ELSE
609 nn = cand_s(i) - nedge
611 ENDIF
612
613
614 ipartfricmi(i) = ipartfric_e(cand_m(i))
615 ENDDO
616 ENDIF
617 RETURN
type(real_pointer), dimension(:), allocatable gape_l_fie
type(real4_pointer3), dimension(:), allocatable edg_bisector_fie
type(real4_pointer3), dimension(:), allocatable vtx_bisector_fie
type(int_pointer2), dimension(:), allocatable ledge_fie
type(real_pointer), dimension(:), allocatable gapfie
type(real_pointer2), dimension(:), allocatable vfie
type(int_pointer), dimension(:), allocatable ipartfric_fie
type(real_pointer2), dimension(:), allocatable xfie
type(real_pointer), dimension(:), allocatable stifie
type(int_pointer), dimension(:), allocatable nodnxfie
type(real_pointer), dimension(:), allocatable stife_msdt_fi
type(real_pointer), dimension(:), allocatable msfie