38 . FLAG_RETRACTOR_UPDATE,X,NPBY)
48#include "implicit_f.inc"
58 INTEGER ,
INTENT(IN) :: IXC(NIXC,NUMELC),IPARG(NPARG,NGROUP),NPBY(NNPBY,NRBODY)
59 INTEGER ,
INTENT(INOUT) :: (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
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,
73 INTEGER,
DIMENSION(:),
ALLOCATABLE :: TAG_NOD,CORES_SLIP,CORES_FRAM,CORES_RET
76 . xl2,yl2,xl3,yl3,xl4,yl4,l0fram1,l0fram2,dist,distb,offset,n_dir2(2),
79 TYPE(g_bufel_),
POINTER :: GBUF
80 TYPE(buf_lay_) ,
POINTER :: BUFLY
88 s_slipring = -huge(s_slipring)
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
96 s_slipring = s_slipring +
slipring(slip)%NFRAM
99 IF (npby(7,
slipring(slip)%RBODY) == 0)
THEN
106 ALLOCATE(tag_nod(numnod))
107 ALLOCATE(cores_slip(s_slipring))
108 ALLOCATE(cores_fram(s_slipring))
109 ALLOCATE(cores_ret(nretractor))
118 IF ((flag_slipring_update /= 0).OR.(flag_retractor_update /= 0))
THEN
120 tag_nod(1:numnod) = 0
121 cores_slip(1:s_slipring) = 0
122 cores_fram(1:s_slipring) = 0
127 IF (
slipring(slip)%FRAM(fra)%UPDATE /= 0)
THEN
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
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
161 gbuf => elbuf_tab(ng)%GBUF
164 ii(i) = (i-1)*nel + 1
169 IF ((ityp==6).AND.(mtn==114))
THEN
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)))
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
202 slipring(slip)%FRAM(fra)%STRAND_DIRECTION(1) = 1
204 slipring(slip)%FRAM(fra)%STRAND_DIRECTION(1) = -1
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
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
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)
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
223 slipring(slip)%FRAM(fra)%STRAND_DIRECTION(2) = 1
225 slipring(slip)%FRAM(fra)%STRAND_DIRECTION(2) = -1
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)
236 ixr(4,j) =
slipring(slip)%FRAM(fra)%NODE_NEXT(1)
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)
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)
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
267 ELSEIF (gbuf%SLIPRING_STRAND(i) < 0)
THEN
268 gbuf%SLIPRING_STRAND(i) = 0
272 gbuf%RINGSLIP(i) = gbuf%RINGSLIP(i) -gap
276 gbuf%RINGSLIP(i) = zero
292 IF (flag_slipring_update /= 0)
THEN
295 IF (
slipring(slip)%FRAM(fra)%UPDATE /= 0)
THEN
304 flag_slipring_update = 0
307 IF (flag_retractor_update /= 0)
THEN
315 flag_retractor_update = 0
324 IF ((n_seatbelt_2d > 0).AND.((ncycle==0).OR.(flag_slipring_l /= 0)))
THEN
326 tag_nod(1:numnod) = 0
327 cores_slip(1:s_slipring) = 0
328 cores_fram(1:s_slipring) = 0
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
347 iseatbelt = iparg(91,ng)
353 gbuf => elbuf_tab(ng)%GBUF
355 ii(i) = (i-1)*nel + 1
358 IF ((ityp == 3).AND.(iseatbelt==1))
THEN
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
380 IF (gbuf%ADD_NODE(i) == ixc(3,j))
THEN
383 node_cores_dir2(1) = 4
384 node_cores_dir2(2) = 3
385 node_cores_dir2(3) = 2
386 node_cores_dir2(4) = 1
390 node_cores_dir2(1) = 2
391 node_cores_dir2(2) = 1
392 node_cores_dir2(3) = 4
393 node_cores_dir2(4) = 3
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))
403 IF (tag_nod(ixc(k+1,j)) > 0)
THEN
405 found_slip(nfound) = cores_slip(tag_nod(ixc(k+1,j
406 found_fram(nfound) = cores_fram(tag_nod(ixc(k+1,j)))
411 IF (flag_r1 == 0)
THEN
414 IF (tag_nod(ixc(k,j)) < 0) flag_r2 = k - 1
421 gbuf%INTVAR(ii(1)+i-1) = one
422 IF ((flag_r2 > 0).AND.(gbuf%UPDATE(i) == 0))
THEN
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)
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
437 gbuf%UPDATE(i) = -flag_r2
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)
443 ELSEIF (flag_r2 == 0)
THEN
451 IF ((fram1 == 0).AND.(found_fram(k) /= fram2))
THEN
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
461 IF ((fram1 > 0).AND.(fram1 /= found_fram(1)).AND.(fram1 /= found_fram(2)))
THEN
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)
467 IF (ixc(k+1,j) ==
slipring(slip)%FRAM(fram1)%NODE(1))
THEN
468 gbuf%INTVAR(ii(5)+i-1) = k
471 ELSEIF (ixc(k+1,j) ==
slipring(slip)%FRAM(fram1)%NODE(3))
THEN
472 gbuf%INTVAR(ii(5)+i-1) = k
474 flow_direction = -one
479 IF ((fram2 > 0).AND.(fram2 /= found_fram(1)).AND.
THEN
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)
485 IF (ixc(k+1,j) ==
slipring(slip)%FRAM(fram2)%NODE(1))
THEN
486 gbuf%INTVAR(ii(6)+i-1) = k
489 ELSEIF (ixc(k+1,j) ==
slipring(slip)%FRAM(fram2)%NODE(3))
THEN
490 gbuf%INTVAR(ii(6)+i-1) = k
492 flow_direction = -one
497 IF ((gbuf%SLIPRING_ID(i)==0).AND.(nfound > 0))
THEN
500 gbuf%SLIPRING_ID(i) = slip
501 ELSEIF ((gbuf%SLIPRING_ID(i) > 0).AND.(nfound == 0))
THEN
504 gbuf%SLIPRING_ID(i) = 0
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
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))
516 offset = (gbuf%POSX(ii(1)+i-1)-gbuf%POSX(ii(2)+i-1))*flow_direction
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)
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)
530 . node_fram2,gbuf%STRA,nel,xl2,yl2,
532 . n_dir2,bufly%DIRA(i),bufly%DIRA(nel+i),gbuf%SMSTR
535 gbuf%SLIPRING_FRAM_ID(ii(1)+i-1) = zero
536 gbuf%SLIPRING_FRAM_ID(ii(2)+i-1) = zero
541 bufly%MAT(ir,is,it)%VAR(nel*(7-1)+i) = 1
555 IF (((n_seatbelt_2d > 0).AND.(ncycle==0)).OR.(flag_slipring_update /= 0))
THEN
556 DEALLOCATE(tag_nod,cores_slip,cores_fram)