39 . FLAG_RETRACTOR_UPDATE,X,NPBY)
46 use element_mod ,
only : nixc,nixr
50#include "implicit_f.inc"
60 INTEGER ,
INTENT(IN) :: IXC(NIXC,NUMELC),IPARG(NPARG,NGROUP),NPBY(NNPBY,NRBODY)
61 INTEGER ,
INTENT(INOUT) :: IXR(NIXR,NUMELR),FLAG_SLIPRING_UPDATE,FLAG_RETRACTOR_UPDATE
62 my_real ,
INTENT(IN) :: x(3,numnod)
63 TYPE(elbuf_struct_),
TARGET,
DIMENSION(NGROUP) :: ELBUF_TAB
67 INTEGER I,J,K,ITYP,NG,JFT,JLT,NEL,
68 . nft,n1,n2,n3,n4,mtn,nn1,nn2,nn3,ii(6),slip,
69 . compt,fra,nfound,found_slip(2),found_fram(2),fram1,fram2,
70 . node_fram1,node_fram2,irep,flag_reactiv,flag_r1,flag_r2,nuvar,
71 . iseatbelt,fra1,fra2,l_dira,nlay,ismstr,strand,node_cores_dir2(4),
72 . nptr,npts,nptt,ir,is,it,s_slipring,l_smstr,orient,pos_b,ret,comptr,
75 INTEGER,
DIMENSION(:),
ALLOCATABLE :: ,CORES_SLIP,CORES_FRAM,CORES_RET
78 . xl2,yl2,xl3,yl3,xl4,yl4,l0fram1,l0fram2,dist,distb,offset,n_dir2(2),
81 TYPE(g_bufel_),
POINTER :: GBUF
82 TYPE(buf_lay_) ,
POINTER :: BUFLY
90 s_slipring = -huge(s_slipring)
92 flow_direction = -huge(flow_direction)
93 flag_slipring_l = flag_slipring_update
94 IF (((n_seatbelt_2d > 0).AND.(ncycle==0)).OR.(flag_slipring_update /= 0).OR.
95 . (flag_retractor_update /= 0))
THEN
98 s_slipring = s_slipring +
slipring(slip)%NFRAM
101 IF (npby(7,
slipring(slip)%RBODY) == 0)
THEN
108 ALLOCATE(tag_nod(numnod))
109 ALLOCATE(cores_slip(s_slipring))
110 ALLOCATE(cores_fram(s_slipring))
111 ALLOCATE(cores_ret(nretractor))
120 IF ((flag_slipring_update /= 0).OR.(flag_retractor_update /= 0))
THEN
122 tag_nod(1:numnod) = 0
123 cores_slip(1:s_slipring) = 0
124 cores_fram(1:s_slipring) = 0
129 IF (
slipring(slip)%FRAM(fra)%UPDATE /= 0)
THEN
131 tag_nod(
slipring(slip)%FRAM(fra)%NODE(1)) = compt
132 tag_nod(
slipring(slip)%FRAM(fra)%NODE(2)) = compt
133 tag_nod(
slipring(slip)%FRAM(fra)%NODE(3)) = compt
134 tag_nod(
slipring(slip)%FRAM(fra)%NODE_NEXT(1)) = compt
135 tag_nod(
slipring(slip)%FRAM(fra)%NODE_NEXT(2)) = compt
136 tag_nod(
slipring(slip)%FRAM(fra)%NODE_NEXT(3)) = compt
137 cores_slip(compt) = slip
138 cores_fram(compt) = fra
147 tag_nod(
retractor(ret)%NODE(1)) = -comptr
148 tag_nod(
retractor(ret)%NODE(2)) = -comptr
149 tag_nod(
retractor(ret)%NODE_NEXT(1)) = -comptr
150 tag_nod(
retractor(ret)%NODE_NEXT(2)) = -comptr
151 cores_ret(comptr) = ret
163 gbuf => elbuf_tab(ng)%GBUF
166 ii(i) = (i-1)*nel + 1
171 IF ((ityp==6).AND.(mtn==114))
THEN
181 IF (tag_nod(n1) > 0)
THEN
182 slip = cores_slip(tag_nod(n1))
183 fra = cores_fram(tag_nod(n1))
184 ELSEIF (tag_nod(n2) > 0)
THEN
185 slip = cores_slip(tag_nod(n2))
186 fra = cores_fram(tag_nod(n2))
187 ELSEIF (tag_nod(n1) < 0)
THEN
188 ret = cores_ret(abs(tag_nod(n1)))
189 ELSEIF (tag_nod(n2) < 0)
THEN
190 ret = cores_ret(abs(tag_nod(n2)))
194 nn1 =
slipring(slip)%FRAM(fra)%NODE_NEXT(1)
195 nn2 =
slipring(slip)%FRAM(fra)%NODE_NEXT(2)
196 nn3 =
slipring(slip)%FRAM(fra)%NODE_NEXT(3)
197 IF (((n1==nn1).AND.(n2==nn2)).OR.((n2==nn1).AND.(n1==nn2)))
THEN
198 gbuf%SLIPRING_ID(i) = slip
199 gbuf%SLIPRING_FRAM_ID(i) = fra
200 gbuf%SLIPRING_STRAND(i) = 1
201 gbuf%UPDATE(i) =
slipring(slip)%FRAM(fra)%UPDATE
202 IF (gbuf%UPDATE(i) > 0) gbuf%DFS(i) =
slipring(slip)%FRAM(fra)%DFS
204 slipring(slip)%FRAM(fra)%STRAND_DIRECTION(1) = 1
206 slipring(slip)%FRAM(fra)%STRAND_DIRECTION(1) = -1
208 slipring(slip)%FRAM(fra)%RESIDUAL_LENGTH(1) = gbuf%LENGTH(ii(1)+i-1)
209 slipring(slip)%FRAM(fra)%INTVAR_STR1(1) = gbuf%FOR(ii(1)+i-1)
210 slipring(slip)%FRAM(fra)%INTVAR_STR1(2) = gbuf%DEP_IN_TENS(ii(1)+i-1)
211 slipring(slip)%FRAM(fra)%INTVAR_STR1(3) = gbuf%YIELD(ii(1)+i-1)
212 slipring(slip)%FRAM(fra)%INTVAR_STR1(4) = gbuf%VAR(nuvar*(i-1)+1)
213 slipring(slip)%FRAM(fra)%INTVAR_STR1(5) = gbuf%FOREP(ii(1)+i-1)
214 slipring(slip)%FRAM(fra)%INTVAR_STR1(6) = gbuf%POSX(i)
215 slipring(slip)%FRAM(fra)%INTVAR_STR1(7) = gbuf%INTVAR(ii(2)+i-1)
217 ixr(4,j) =
slipring(slip)%FRAM(fra)%NODE_NEXT(3)
218 ELSEIF (((n1==nn2).AND.(n2==nn3)).OR.((n2==nn2).AND.(n1==nn3)))
THEN
219 gbuf%SLIPRING_ID(i) = slip
220 gbuf%SLIPRING_FRAM_ID(i) = fra
221 gbuf%SLIPRING_STRAND(i) = 2
222 gbuf%UPDATE(i) =
slipring(slip)%FRAM(fra)%UPDATE
223 IF (gbuf%UPDATE(i) < 0) gbuf%DFS(i) =
slipring(slip)%FRAM(fra)%DFS
225 slipring(slip)%FRAM(fra)%STRAND_DIRECTION(2) = 1
227 slipring(slip)%FRAM(fra)%STRAND_DIRECTION(2) = -1
229 slipring(slip)%FRAM(fra)%RESIDUAL_LENGTH(2) = gbuf%LENGTH(ii(1)+i-1)
230 slipring(slip)%FRAM(fra)%INTVAR_STR2(1) = gbuf%FOR(ii(1)+i-1)
231 slipring(slip)%FRAM(fra)%INTVAR_STR2(2) = gbuf%DEP_IN_TENS(ii(1)+i-1)
232 slipring(slip)%FRAM(fra)%INTVAR_STR2(3) = gbuf%YIELD(ii(1)+i-1)
233 slipring(slip)%FRAM(fra)%INTVAR_STR2(4) = gbuf%VAR(nuvar*(i-1)+1)
234 slipring(slip)%FRAM(fra)%INTVAR_STR2(5) = gbuf%FOREP(ii(1)+i-1)
235 slipring(slip)%FRAM(fra)%INTVAR_STR2(6) = gbuf%POSX(i)
236 slipring(slip)%FRAM(fra)%INTVAR_STR2(7) = gbuf%INTVAR(ii(2)+i-1)
238 ixr(4,j) =
slipring(slip)%FRAM(fra)%NODE_NEXT(1)
239 ELSEIF ((gbuf%SLIPRING_ID(i)==slip).AND.(gbuf%SLIPRING_FRAM_ID(i)==fra))
THEN
240 gbuf%SLIPRING_ID(i) = 0
241 gbuf%SLIPRING_FRAM_ID(i) = 0
242 gbuf%SLIPRING_STRAND(i) = 0
243 slipring(slip)%FRAM(fra)%PREV_REF_LENGTH = gbuf%LENGTH(ii(1)+i-1)
248 slip = gbuf%SLIPRING_ID(i)
249 fra = gbuf%SLIPRING_FRAM_ID(i)
250 k = gbuf%SLIPRING_STRAND(i)
251 IF ((slip > 0).AND.(fra > 0).AND.(k > 0))
THEN
252 IF (
slipring(slip)%FRAM(fra)%UPDATE == 0)
THEN
253 slipring(slip)%FRAM(fra)%CURRENT_LENGTH(k) = gbuf%LENGTH(ii(1)+i-1)
260 IF (((n1==nn1).AND.(n2==nn2)).OR.((n2==nn1).AND.(n1==nn2)))
THEN
261 gbuf%RETRACTOR_ID(i) = ret
262 gbuf%SLIPRING_STRAND(i) = -1
269 ELSEIF (gbuf%SLIPRING_STRAND(i) < 0)
THEN
270 gbuf%SLIPRING_STRAND(i) = 0
274 gbuf%RINGSLIP(i) = gbuf%RINGSLIP(i) -gap
278 gbuf%RINGSLIP(i) = zero
294 IF (flag_slipring_update /= 0)
THEN
297 IF (
slipring(slip)%FRAM(fra)%UPDATE /= 0)
THEN
306 flag_slipring_update = 0
309 IF (flag_retractor_update /= 0)
THEN
317 flag_retractor_update = 0
326 IF ((n_seatbelt_2d > 0).AND.((ncycle==0).OR.(flag_slipring_l /= 0)))
THEN
328 tag_nod(1:numnod) = 0
329 cores_slip(1:s_slipring) = 0
330 cores_fram(1:s_slipring) = 0
335 tag_nod(
slipring(slip)%FRAM(fra)%NODE(2)) = compt
336 cores_slip(compt) = slip
337 cores_fram(compt) = fra
338 tag_nod(
slipring(slip)%FRAM(fra)%NODE(1)) = -compt
339 tag_nod(
slipring(slip)%FRAM(fra)%NODE(3)) = -compt
349 iseatbelt = iparg(91,ng)
355 gbuf => elbuf_tab(ng)%GBUF
357 ii(i) = (i-1)*nel + 1
360 IF ((ityp == 3).AND.(iseatbelt==1))
THEN
362 bufly => elbuf_tab(ng)%BUFLY(1)
363 nlay = elbuf_tab(ng)%NLAY
364 nptr = elbuf_tab(ng)%NPTR
365 npts = elbuf_tab(ng)%NPTS
366 nptt = elbuf_tab(ng)%NPTT
367 l_dira = bufly%LY_DIRA
368 l_smstr = bufly%L_SMSTR
382 IF (gbuf%ADD_NODE(i) == ixc(3,j))
THEN
385 node_cores_dir2(1) = 4
386 node_cores_dir2(2) = 3
387 node_cores_dir2(3) = 2
388 node_cores_dir2(4) = 1
392 node_cores_dir2(1) = 2
393 node_cores_dir2(2) = 1
394 node_cores_dir2(3) = 4
395 node_cores_dir2(4) = 3
399 slip = gbuf%SLIPRING_ID(i)
400 fram1 =
max(0,gbuf%SLIPRING_FRAM_ID(ii(1)+i-1))
401 fram2 =
max(0,gbuf%SLIPRING_FRAM_ID(ii(2)+i-1))
405 IF (tag_nod(ixc(k+1,j)) > 0)
THEN
407 found_slip(nfound) = cores_slip(tag_nod(ixc(k+1,j)))
408 found_fram(nfound) = cores_fram(tag_nod(ixc(k+1,j)))
413 IF (flag_r1 == 0)
THEN
416 IF (tag_nod(ixc(k,j)) < 0) flag_r2 = k - 1
423 gbuf%INTVAR(ii(1)+i-1) = one
424 IF ((flag_r2 > 0).AND.(gbuf%UPDATE(i) == 0))
THEN
427 gbuf%UPDATE(i) = flag_r2
428 pos_b = node_cores_dir2(flag_r2)
429 n1 = ixc(1+flag_r2,j)
430 n2 = gbuf%ADD_NODE(nel*flag_r2+i)
432 n4 = gbuf%ADD_NODE(nel*pos_b+i)
433 dist = sqrt((x(1,n1)-x(1,n2))**2+(x(2,n1)-x(2,n2))**2+(x(3,n1)-x(3,n2))**2)
434 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))
435 dist =
min(dist,distb)
436 gbuf%INTVAR(ii(2)+i-1) = half*dist
439 gbuf%UPDATE(i) = -flag_r2
441 n2 = gbuf%ADD_NODE(i)
442 dist = (x(1,n1)-x(1,n2))**2+(x(2,n1)-x(2,n2))**2+(x(3,n1)-x(3,n2))**2
443 gbuf%INTVAR(ii(2)+i-1) = third*sqrt(dist)
445 ELSEIF (flag_r2 == 0)
THEN
453 IF ((fram1 == 0).AND.(found_fram(k) /= fram2))
THEN
455 fram1 = found_fram(k)
456 gbuf%SLIPRING_FRAM_ID(ii(1)+i-1) = fram1
457 ELSEIF ((fram2 == 0).AND.(found_fram(k) /= fram1))
THEN
458 fram2 = found_fram(k)
459 gbuf%SLIPRING_FRAM_ID(ii(2)+i-1) = fram2
463 IF ((fram1 > 0).AND.(fram1 /= found_fram(1)).AND.(fram1 /= found_fram(2)))
THEN
465 gbuf%SLIPRING_FRAM_ID(ii(1)+i-1) = -gbuf%SLIPRING_FRAM_ID(ii(1)+i-1)
466 gbuf%POSX(ii(1)+i-1) =
slipring(slip)%FRAM(fram1)%RINGSLIP
467 gbuf%INTVAR(ii(3)+i-1) = abs(
slipring(slip)%FRAM(fram1)%PREV_REF_LENGTH)
469 IF (ixc(k+1,j) ==
slipring(slip)%FRAM(fram1)%NODE(1))
THEN
470 gbuf%INTVAR(ii(5)+i-1) = k
473 ELSEIF (ixc(k+1,j) ==
slipring(slip)%FRAM(fram1)%NODE(3))
THEN
474 gbuf%INTVAR(ii(5)+i-1) = k
476 flow_direction = -one
483 gbuf%SLIPRING_FRAM_ID(ii(2)+i-1) = -gbuf%SLIPRING_FRAM_ID(ii(2)+i-1)
484 gbuf%POSX(ii(2)+i-1) =
slipring(slip)%FRAM(fram2)%RINGSLIP
485 gbuf%INTVAR(ii(4)+i-1) = abs(
slipring(slip)%FRAM(fram2)%PREV_REF_LENGTH)
487 IF (ixc(k+1,j) ==
slipring(slip)%FRAM(fram2)%NODE(1))
THEN
488 gbuf%INTVAR(ii(6)+i-1) = k
491 ELSEIF (ixc(k+1,j) ==
slipring(slip)%FRAM(fram2)%NODE(3))
THEN
492 gbuf%INTVAR(ii(6)+i-1) = k
494 flow_direction = -one
499 IF ((gbuf%SLIPRING_ID(i)==0).AND.(nfound > 0))
THEN
502 gbuf%SLIPRING_ID(i) = slip
503 ELSEIF ((gbuf%SLIPRING_ID(i) > 0).AND.(nfound == 0))
THEN
506 gbuf%SLIPRING_ID(i) = 0
510 IF (flag_reactiv == 1)
THEN
511 fra1 = abs(gbuf%SLIPRING_FRAM_ID(ii(1)+i-1))
512 fra2 = abs(gbuf%SLIPRING_FRAM_ID(ii(2)+i-1))
513 l0fram1 = gbuf%INTVAR(ii(3)+i-1)
514 l0fram2 = gbuf%INTVAR(ii(4)+i-1)
515 node_fram1 = nint(gbuf%INTVAR(ii(5)+i-1))
516 node_fram2 = nint(gbuf%INTVAR(ii(6)+i-1))
518 offset = (gbuf%POSX(ii(1)+i-1)-gbuf%POSX(ii(2)+i-1))*flow_direction
520 node_fram2 = node_cores_dir2(node_fram1)
521 compt = abs(tag_nod(ixc(1+node_fram2,j)))
522 fra2 = cores_fram(compt)
523 offset =
slipring(slip)%FRAM(fra1)%RINGSLIP -
slipring(slip)%FRAM(fra2)%RINGSLIP
524 offset = flow_direction*offset-
slipring(slip)%FRAM(fra2)%CURRENT_LENGTH(strand)
527 nn1 =
slipring(slip)%FRAM(fra1)%ANCHOR_NODE
528 nn2 =
slipring(slip)%FRAM(fra2)%ANCHOR_NODE
529 CALL shell_loc_cor(x,ixc,j,xl2,yl2,xl3,yl3,xl4,yl4,irep,nn1,nn2,n_dir2)
532 . node_fram2,gbuf%STRA,nel,xl2,yl2,
533 . xl3,yl3,xl4,yl4,offset,
534 . n_dir2,bufly%DIRA(i),bufly%DIRA(nel
537 gbuf%SLIPRING_FRAM_ID(ii(1)+i-1) = zero
538 gbuf%SLIPRING_FRAM_ID(ii(2)+i-1) = zero
543 bufly%MAT(ir,is,it)%VAR(nel*(7-1)+i) = 1
557 IF (((n_seatbelt_2d > 0).AND.(ncycle==0)).OR.(flag_slipring_update /= 0))
THEN
558 DEALLOCATE(tag_nod,cores_slip,cores_fram)