39
40
41
42 USE elbufdef_mod
45
46
47
48#include "implicit_f.inc"
49
50
51
52#include "com01_c.inc"
53#include "com04_c.inc"
54#include "param_c.inc"
55
56
57
58 INTEGER ,INTENT(IN) :: IXC(NIXC,NUMELC),IPARG(NPARG,NGROUP),NPBY(NNPBY,NRBODY)
59 INTEGER ,INTENT(INOUT) :: IXR(NIXR,NUMELR),FLAG_SLIPRING_UPDATE,FLAG_RETRACTOR_UPDATE
60 my_real ,
INTENT(IN) :: x(3,numnod)
61 TYPE(ELBUF_STRUCT_), TARGET, DIMENSION(NGROUP) :: ELBUF_TAB
62
63
64
65 INTEGER I,J,K,ITYP,NG,JFT,JLT,NEL,
66 . NFT,N1,N2,N3,N4,MTN,NN1,NN2,NN3,II(6),SLIP,
67 . COMPT,FRA,NFOUND,FOUND_SLIP(2),FOUND_FRAM(2),FRAM1,FRAM2,
68 . NODE_FRAM1,NODE_FRAM2,IREP,FLAG_REACTIV,FLAG_R1,FLAG_R2,NUVAR,
69 . ISEATBELT,FRA1,FRA2,L_DIRA,NLAY,ISMSTR,STRAND,NODE_CORES_DIR2(4),
70 . NPTR,NPTS,NPTT,IR,IS,IT,S_SLIPRING,L_SMSTR,ORIENT,POS_B,RET,COMPTR,
71 .
72
73 INTEGER, DIMENSION(:), ALLOCATABLE :: TAG_NOD,CORES_SLIP,CORES_FRAM,CORES_RET
74
76 . xl2,yl2,xl3,yl3,xl4,yl4,l0fram1,l0fram2,dist,distb,offset,n_dir2(2),
77 . flow_direction,gap
78
79 TYPE(G_BUFEL_),POINTER :: GBUF
80 TYPE(BUF_LAY_) ,POINTER :: BUFLY
81
82
83
84
85
86
87
88 s_slipring = -huge(s_slipring)
89 strand = 0
90 flow_direction = -huge(flow_direction)
91 flag_slipring_l = flag_slipring_update
92 IF (((n_seatbelt_2d > 0).AND.(ncycle==0)).OR.(flag_slipring_update /= 0).OR.
93 . (flag_retractor_update /= 0)) THEN
94 s_slipring = 0
95 DO slip=1,nslipring
96 s_slipring = s_slipring +
slipring(slip)%NFRAM
97
99 IF (npby(7,
slipring(slip)%RBODY) == 0)
THEN
100
103 ENDIF
104 ENDIF
105 ENDDO
106 ALLOCATE(tag_nod(numnod))
107 ALLOCATE(cores_slip(s_slipring))
108 ALLOCATE(cores_fram(s_slipring))
109 ALLOCATE(cores_ret(nretractor))
110 ENDIF
111
112
113
114
115
116
117
118 IF ((flag_slipring_update /= 0).OR.(flag_retractor_update /= 0)) THEN
119
120 tag_nod(1:numnod) = 0
121 cores_slip(1:s_slipring) = 0
122 cores_fram(1:s_slipring) = 0
123
124 compt = 0
125 DO slip=1,nslipring
127 IF (
slipring(slip)%FRAM(fra)%UPDATE /= 0)
THEN
128 compt = compt + 1
129 tag_nod(
slipring(slip)%FRAM(fra)%NODE(1)) = compt
130 tag_nod(
slipring(slip)%FRAM(fra)%NODE(2)) = compt
131 tag_nod(
slipring(slip)%FRAM(fra)%NODE(3)) = compt
132 tag_nod(
slipring(slip)%FRAM(fra)%NODE_NEXT(1)) = compt
133 tag_nod(
slipring(slip)%FRAM(fra)%NODE_NEXT(2)) = compt
134 tag_nod(
slipring(slip)%FRAM(fra)%NODE_NEXT(3)) = compt
135 cores_slip(compt) = slip
136 cores_fram(compt) = fra
137 ENDIF
138 ENDDO
139 ENDDO
140
141 comptr = 0
142 DO ret=1,nretractor
144 comptr = comptr + 1
145 tag_nod(
retractor(ret)%NODE(1)) = -comptr
146 tag_nod(
retractor(ret)%NODE(2)) = -comptr
147 tag_nod(
retractor(ret)%NODE_NEXT(1)) = -comptr
148 tag_nod(
retractor(ret)%NODE_NEXT(2)) = -comptr
149 cores_ret(comptr) = ret
150 ENDIF
151 ENDDO
152
153 DO ng=1,ngroup
154
155 ityp = iparg(5,ng)
156 mtn = iparg(1,ng)
157 nel = iparg(2,ng)
158 nft = iparg(3,ng)
159 jft = 1
161 gbuf => elbuf_tab(ng)%GBUF
162
163 DO i=1,6
164 ii(i) = (i-1)*nel + 1
165 ENDDO
166
167 nuvar = 6
168
169 IF ((ityp==6).AND.(mtn==114)) THEN
170
171 DO i=jft,jlt
172
173 j = i + nft
174 n1 = ixr(2,j)
175 n2 = ixr(3,j)
176 slip = 0
177 ret = 0
178
179 IF (tag_nod(n1) > 0) THEN
180 slip = cores_slip(tag_nod(n1))
181 fra = cores_fram(tag_nod(n1))
182 ELSEIF (tag_nod(n2) > 0) THEN
183 slip = cores_slip(tag_nod(n2))
184 fra = cores_fram(tag_nod(n2))
185 ELSEIF (tag_nod(n1) < 0) THEN
186 ret = cores_ret(abs(tag_nod(n1)))
187 ELSEIF (tag_nod(n2) < 0) THEN
188 ret = cores_ret(abs(tag_nod(n2)))
189 ENDIF
190
191 IF (slip > 0) THEN
192 nn1 =
slipring(slip)%FRAM(fra)%NODE_NEXT(1)
193 nn2 =
slipring(slip)%FRAM(fra)%NODE_NEXT(2)
194 nn3 =
slipring(slip)%FRAM(fra)%NODE_NEXT(3)
195 IF (((n1==nn1).AND.(n2==nn2)).OR.((n2==nn1).AND.(n1==nn2))) THEN
196 gbuf%SLIPRING_ID(i) = slip
197 gbuf%SLIPRING_FRAM_ID(i) = fra
198 gbuf%SLIPRING_STRAND(i) = 1
199 gbuf%UPDATE(i) =
slipring(slip)%FRAM(fra)%UPDATE
200 IF (gbuf%UPDATE(i) > 0) gbuf%DFS(i) =
slipring(slip)%FRAM(fra)%DFS
201 IF (n2 == nn2) THEN
202 slipring(slip)%FRAM(fra)%STRAND_DIRECTION(1) = 1
203 ELSE
204 slipring(slip)%FRAM(fra)%STRAND_DIRECTION(1) = -1
205 ENDIF
206 slipring(slip)%FRAM(fra)%RESIDUAL_LENGTH(1) = gbuf%LENGTH(ii(1)+i-1)
207 slipring(slip)%FRAM(fra)%INTVAR_STR1(1) = gbuf%FOR(ii(1)+i-1)
208 slipring(slip)%FRAM(fra)%INTVAR_STR1(2) = gbuf%DEP_IN_TENS(ii(1)+i-1)
209 slipring(slip)%FRAM(fra)%INTVAR_STR1(3) = gbuf%YIELD(ii(1)+i-1)
210 slipring(slip)%FRAM(fra)%INTVAR_STR1(4) = gbuf%VAR(nuvar*(i-1)+1)
211 slipring(slip)%FRAM(fra)%INTVAR_STR1(5) = gbuf%FOREP(ii(1)+i-1)
212 slipring(slip)%FRAM(fra)%INTVAR_STR1(6) = gbuf%POSX(i)
213 slipring(slip)%FRAM(fra)%INTVAR_STR1(7) = gbuf%INTVAR(ii(2)+i-1)
214
215 ixr(4,j) =
slipring(slip)%FRAM(fra)%NODE_NEXT(3)
216 ELSEIF (((n1==nn2).AND.(n2==nn3)).OR.((n2==nn2).AND.(n1==nn3))) THEN
217 gbuf%SLIPRING_ID(i) = slip
218 gbuf%SLIPRING_FRAM_ID(i) = fra
219 gbuf%SLIPRING_STRAND(i) = 2
220 gbuf%UPDATE(i) =
slipring(slip)%FRAM(fra)%UPDATE
221 IF (gbuf%UPDATE(i) < 0) gbuf%DFS(i) =
slipring(slip)%FRAM(fra)%DFS
222 IF (n1 == nn2) THEN
223 slipring(slip)%FRAM(fra)%STRAND_DIRECTION(2) = 1
224 ELSE
225 slipring(slip)%FRAM(fra)%STRAND_DIRECTION(2) = -1
226 ENDIF
227 slipring(slip)%FRAM(fra)%RESIDUAL_LENGTH(2) = gbuf%LENGTH(ii(1)+i-1)
228 slipring(slip)%FRAM(fra)%INTVAR_STR2(1) = gbuf%FOR(ii(1)+i-1)
229 slipring(slip)%FRAM(fra)%INTVAR_STR2(2) = gbuf%DEP_IN_TENS(ii(1)+i-1)
230 slipring(slip)%FRAM(fra)%INTVAR_STR2(3) = gbuf%YIELD(ii(1)+i-1)
231 slipring(slip)%FRAM(fra)%INTVAR_STR2(4) = gbuf%VAR(nuvar*(i-1)+1)
232 slipring(slip)%FRAM(fra)%INTVAR_STR2(5) = gbuf%FOREP(ii(1)+i-1)
233 slipring(slip)%FRAM(fra)%INTVAR_STR2(6) = gbuf%POSX(i)
234 slipring(slip)%FRAM(fra)%INTVAR_STR2(7) = gbuf%INTVAR(ii(2)+i-1)
235
236 ixr(4,j) =
slipring(slip)%FRAM(fra)%NODE_NEXT(1)
237 ELSEIF ((gbuf%SLIPRING_ID(i)==slip).AND.(gbuf%SLIPRING_FRAM_ID(i)==fra)) THEN
238 gbuf%SLIPRING_ID(i) = 0
239 gbuf%SLIPRING_FRAM_ID(i) = 0
240 gbuf%SLIPRING_STRAND(i) = 0
241 slipring(slip)%FRAM(fra)%PREV_REF_LENGTH = gbuf%LENGTH(ii(1)+i-1)
242 ENDIF
243 ENDIF
244
245
246 slip = gbuf%SLIPRING_ID(i)
247 fra = gbuf%SLIPRING_FRAM_ID(i)
248 k = gbuf%SLIPRING_STRAND(i)
249 IF ((slip > 0).AND.(fra > 0).AND.(k > 0)) THEN
250 IF (
slipring(slip)%FRAM(fra)%UPDATE == 0)
THEN
251 slipring(slip)%FRAM(fra)%CURRENT_LENGTH(k) = gbuf%LENGTH(ii(1)+i-1)
252 ENDIF
253 ENDIF
254
255 IF (ret > 0) THEN
258 IF (((n1==nn1).AND.(n2==nn2)).OR.((n2==nn1).AND.(n1==nn2))) THEN
259 gbuf%RETRACTOR_ID(i) = ret
260 gbuf%SLIPRING_STRAND(i) = -1
261 gbuf%UPDATE(i) = -1
262 IF (n1==nn1) THEN
264 ELSE
266 ENDIF
267 ELSEIF (gbuf%SLIPRING_STRAND(i) < 0) THEN
268 gbuf%SLIPRING_STRAND(i) = 0
270
272 gbuf%RINGSLIP(i) = gbuf%RINGSLIP(i) -gap
273 ELSE
274
275 gbuf%UPDATE(i) = -2
276 gbuf%RINGSLIP(i) = zero
277 ENDIF
278 ENDIF
279 ENDIF
280
281 ENDDO
282
283 ENDIF
284
285 ENDDO
286
287 ENDIF
288
289
290
291
292 IF (flag_slipring_update /= 0) THEN
293 DO slip=1,nslipring
295 IF (
slipring(slip)%FRAM(fra)%UPDATE /= 0)
THEN
301 ENDIF
302 ENDDO
303 ENDDO
304 flag_slipring_update = 0
305 ENDIF
306
307 IF (flag_retractor_update /= 0) THEN
308 DO ret=1,nretractor
313 ENDIF
314 ENDDO
315 flag_retractor_update = 0
316 ENDIF
317
318
319
320
321
322
323
324 IF ((n_seatbelt_2d > 0).AND.((ncycle==0).OR.(flag_slipring_l /= 0))) THEN
325
326 tag_nod(1:numnod) = 0
327 cores_slip(1:s_slipring) = 0
328 cores_fram(1:s_slipring) = 0
329 compt = 0
330 DO slip=1,nslipring
332 compt = compt + 1
333 tag_nod(
slipring(slip)%FRAM(fra)%NODE(2)) = compt
334 cores_slip(compt) = slip
335 cores_fram(compt) = fra
336 tag_nod(
slipring(slip)%FRAM(fra)%NODE(1)) = -compt
337 tag_nod(
slipring(slip)%FRAM(fra)%NODE(3)) = -compt
338 ENDDO
339 ENDDO
340
341 DO ng=1,ngroup
342
343 ityp = iparg(5,ng)
344 mtn = iparg(1,ng)
345 nel = iparg(2,ng)
346 nft = iparg(3,ng)
347 iseatbelt = iparg(91,ng)
348 irep = iparg(35,ng)
349 ismstr = iparg(9,ng)
350
351 jft = 1
353 gbuf => elbuf_tab(ng)%GBUF
354 DO i=1,6
355 ii(i) = (i-1)*nel + 1
356 ENDDO
357
358 IF ((ityp == 3).AND.(iseatbelt==1)) THEN
359
360 bufly => elbuf_tab(ng)%BUFLY(1)
361 nlay = elbuf_tab(ng)%NLAY
362 nptr = elbuf_tab(ng)%NPTR
363 npts = elbuf_tab(ng)%NPTS
364 nptt = elbuf_tab(ng)%NPTT
365 l_dira = bufly%LY_DIRA
366 l_smstr = bufly%L_SMSTR
367
368 DO i=jft,jlt
369
370 j = i + nft
371
372 flag_reactiv = 0
373
374 nfound = 0
375 found_slip(1:2) = 0
376 found_fram(1:2) = 0
377 flag_r1 = 0
378 flag_r2 = 0
379
380 IF (gbuf%ADD_NODE(i) == ixc(3,j)) THEN
381
382 orient = 1
383 node_cores_dir2(1) = 4
384 node_cores_dir2(2) = 3
385 node_cores_dir2(3) = 2
386 node_cores_dir2(4) = 1
387 ELSE
388
389 orient = 2
390 node_cores_dir2(1) = 2
391 node_cores_dir2(2) = 1
392 node_cores_dir2(3) = 4
393 node_cores_dir2(4) = 3
394 ENDIF
395
396
397 slip = gbuf%SLIPRING_ID(i)
398 fram1 =
max(0,gbuf%SLIPRING_FRAM_ID(ii(1)+i-1))
399 fram2 =
max(0,gbuf%SLIPRING_FRAM_ID(ii(2)+i-1))
400
401 DO k=1,4
402
403 IF (tag_nod(ixc(k+1,j)) > 0) THEN
404 nfound = nfound + 1
405 found_slip(nfound) = cores_slip(tag_nod(ixc(k+1,j)))
406 found_fram(nfound) = cores_fram(tag_nod(ixc(k+1,j)))
407 flag_r1 = 1
408 ENDIF
409 ENDDO
410
411 IF (flag_r1 == 0) THEN
412 DO k=2,5
413
414 IF (tag_nod(ixc(k,j)) < 0) flag_r2 = k - 1
415 ENDDO
416 ENDIF
417
418
419
420
421 gbuf%INTVAR(ii(1)+i-1) = one
422 IF ((flag_r2 > 0).AND.(gbuf%UPDATE(i) == 0)) THEN
423 IF (slip == 0) THEN
424
425 gbuf%UPDATE(i) = flag_r2
426 pos_b = node_cores_dir2(flag_r2)
427 n1 = ixc(1+flag_r2,j)
428 n2 = gbuf%ADD_NODE(nel*flag_r2+i)
429 n3 = ixc(1+pos_b,j)
430 n4 = gbuf%ADD_NODE(nel*pos_b+i)
431 dist = sqrt((x(1,n1)-x(1,n2))**2+(x(2,n1)-x(2,n2))**2+(x(3,n1)-x(3,n2))**2)
432 distb = sqrt(
max(em20,(x(1,n3)-x(1,n4))**2+(x(2,n3)-x(2,n4))**2+(x(3,n3)-x(3,n4))**2))
433 dist =
min(dist,distb)
434 gbuf%INTVAR(ii(2)+i-1) = half*dist
435 ELSE
436
437 gbuf%UPDATE(i) = -flag_r2
438 n1 = ixc(2,j)
439 n2 = gbuf%ADD_NODE(i)
440 dist = (x(1,n1)-x(1,n2))**2+(x(2,n1)-x(2,n2))**2+(x(3,n1)-x(3,n2))**2
441 gbuf%INTVAR(ii(2)+i-1) = third*sqrt(dist)
442 ENDIF
443 ELSEIF (flag_r2 == 0) THEN
444 gbuf%UPDATE(i) = 0
445 ENDIF
446
447
448
449
450 DO k=1,nfound
451 IF ((fram1 == 0).AND.(found_fram(k) /= fram2)) THEN
452 slip = found_slip(k)
453 fram1 = found_fram(k)
454 gbuf%SLIPRING_FRAM_ID(ii(1)+i-1) = fram1
455 ELSEIF ((fram2 == 0).AND.(found_fram(k) /= fram1)) THEN
456 fram2 = found_fram(k)
457 gbuf%SLIPRING_FRAM_ID(ii(2)+i-1) = fram2
458 ENDIF
459 ENDDO
460
461 IF ((fram1 > 0).AND.(fram1 /= found_fram(1)).AND.(fram1 /= found_fram(2))) THEN
462
463 gbuf%SLIPRING_FRAM_ID(ii(1)+i-1) = -gbuf%SLIPRING_FRAM_ID(ii(1)+i-1)
464 gbuf%POSX(ii(1)+i-1) =
slipring(slip)%FRAM(fram1)%RINGSLIP
465 gbuf%INTVAR(ii(3)+i-1) = abs(
slipring(slip)%FRAM(fram1)%PREV_REF_LENGTH)
466 DO k=1,4
467 IF (ixc(k+1,j) ==
slipring(slip)%FRAM(fram1)%NODE(1))
THEN
468 gbuf%INTVAR(ii(5)+i-1) = k
469 strand = 1
470 flow_direction = one
471 ELSEIF (ixc(k+1,j) ==
slipring(slip)%FRAM(fram1)%NODE(3))
THEN
472 gbuf%INTVAR(ii(5)+i-1) = k
473 strand = 2
474 flow_direction = -one
475 ENDIF
476 ENDDO
477 ENDIF
478
479 IF ((fram2 > 0).AND.(fram2 /= found_fram(1)).AND.(fram2 /= found_fram(2))) THEN
480
481 gbuf%SLIPRING_FRAM_ID(ii(2)+i-1) = -gbuf%SLIPRING_FRAM_ID(ii(2)+i-1)
482 gbuf%POSX(ii(2)+i-1) =
slipring(slip)%FRAM(fram2)%RINGSLIP
483 gbuf%INTVAR(ii(4)+i-1) = abs(
slipring(slip)%FRAM(fram2)%PREV_REF_LENGTH)
484 DO k=1,4
485 IF (ixc(k+1,j) ==
slipring(slip)%FRAM(fram2)%NODE(1))
THEN
486 gbuf%INTVAR(ii(6)+i-1) = k
487 strand = 1
488 flow_direction = one
489 ELSEIF (ixc(k+1,j) ==
slipring(slip)%FRAM(fram2)%NODE(3))
THEN
490 gbuf%INTVAR(ii(6)+i-1) = k
491 strand = 2
492 flow_direction = -one
493 ENDIF
494 ENDDO
495 ENDIF
496
497 IF ((gbuf%SLIPRING_ID(i)==0).AND.(nfound > 0)) THEN
498
499 gbuf%OFF(i) = -one
500 gbuf%SLIPRING_ID(i) = slip
501 ELSEIF ((gbuf%SLIPRING_ID(i) > 0).AND.(nfound == 0)) THEN
502
503 gbuf%OFF(i) = one
504 gbuf%SLIPRING_ID(i) = 0
505 flag_reactiv = 1
506 ENDIF
507
508 IF (flag_reactiv == 1) THEN
509 fra1 = abs(gbuf%SLIPRING_FRAM_ID(ii(1)+i-1))
510 fra2 = abs(gbuf%SLIPRING_FRAM_ID(ii(2)+i-1))
511 l0fram1 = gbuf%INTVAR(ii(3)+i-1)
512 l0fram2 = gbuf%INTVAR(ii(4)+i-1)
513 node_fram1 = nint(gbuf%INTVAR(ii(5)+i-1))
514 node_fram2 = nint(gbuf%INTVAR(ii(6)+i-1))
515 IF (fra2 > 0) THEN
516 offset = (gbuf%POSX(ii(1)+i-1)-gbuf%POSX(ii(2)+i-1))*flow_direction
517 ELSE
518 node_fram2 = node_cores_dir2(node_fram1)
519 compt = abs(tag_nod(ixc(1+node_fram2,j)))
520 fra2 = cores_fram(compt)
521 offset =
slipring(slip)%FRAM(fra1)%RINGSLIP -
slipring(slip)%FRAM(fra2)%RINGSLIP
522 offset = flow_direction*offset-
slipring(slip)%FRAM(fra2)%CURRENT_LENGTH(strand)
523 ENDIF
524
525 nn1 =
slipring(slip)%FRAM(fra1)%ANCHOR_NODE
526 nn2 =
slipring(slip)%FRAM(fra2)%ANCHOR_NODE
527 CALL shell_loc_cor(x,ixc,j,xl2,yl2,xl3,yl3,xl4,yl4,irep,nn1,nn2,n_dir2)
528
530 . node_fram2,gbuf%STRA,nel,xl2,yl2,
531 .
532 . n_dir2,bufly%DIRA(i),bufly%DIRA(nel+i),gbuf%SMSTR,ismstr,
533 . l_smstr,orient)
534
535 gbuf%SLIPRING_FRAM_ID(ii(1)+i-1) = zero
536 gbuf%SLIPRING_FRAM_ID(ii(2)+i-1) = zero
537
538 DO ir=1,nptr
539 DO is=1,npts
540 DO it=1,nptt
541 bufly%MAT(ir,is,it)%VAR(nel*(7-1)+i) = 1
542 ENDDO
543 ENDDO
544 ENDDO
545
546 ENDIF
547
548 ENDDO
549 ENDIF
550
551 ENDDO
552
553 ENDIF
554
555 IF (((n_seatbelt_2d > 0).AND.(ncycle==0)).OR.(flag_slipring_update /= 0)) THEN
556 DEALLOCATE(tag_nod,cores_slip,cores_fram)
557 ENDIF
558
559
560
561
562
563 RETURN
564
type(retractor_struct), dimension(:), allocatable retractor
type(slipring_struct), dimension(:), allocatable slipring
subroutine shell_loc_cor(x, ixc, j, xl2, yl2, xl3, yl3, xl4, yl4, irep, nn1, nn2, n_dir2)
subroutine shell_reactivation(i, ii, l0fram1, l0fram2, node_fram1, node_fram2, gstr, nel, xl2, yl2, xl3, yl3, xl4, yl4, offset, n_dir2, dira_x, dira_y, smstr, ismstr, l_smstr, orient)
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)