45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
149
150
151
152#include "implicit_f.inc"
153#include "comlock.inc"
154
155
156
157 INTEGER IOUT,NUVAR,NUVARN,IPROP,IMAT,
158 . NX ,UIX(NX) ,UID, KEINT,
159 . GET_U_PNU,,GET_U_MID,GET_U_MNU,
160 . KFUNC,KMAT,KPROP
162 . off, eint, xel(3,nx), vel(3,nx) ,vrel(3,nx),
163 . mass(nx) , xiner(nx) ,stifm(nx) ,
164 . stifr(nx), viscm(nx) ,viscr(nx) ,
165 . forc(3,nx), torq(3,nx),
166 . uvar(nuvar),uvarn(nuvarn*nx),dt ,dte ,
alpha,
167 . get_u_mat, get_u_geo, get_u_func
169 . get_u_mat,get_u_geo, get_u_func
170 parameter(kfunc=29)
171 parameter(kmat=31)
172 parameter(kprop=33)
173
174
175
176
177 INTEGER NB1, NB2, NB3, MB1, MB2, MB3, MB4, MB5,
178 . K, IFUNCT, IFV, NIT, ECHANGE
180 . lprev, lnext, vprev(3), vnext(3), vv,xk, xc,
181 . l0, l, dx, dxold, ddx, dt11, dvx, fx, g, y, dfdx, dgdx, f,
182 . stif, mu1, mu2, fric, mu, beta, fmax, dfs, df, ff,
183 . epsmoy, df1, df2, xn, fxold, epstot, epsmin, epsmax, deps,
184 . rho, xm, xkm, xks, xcm, dtc, dtk, fact, ffac,xfac
185
186
187 nb1=1
188
189 nb2=nb1+1
190
191 nb3=nb2+1
192
193 mb1=1
194
195
196 mb2=mb1+nx
197
198
199 mb3=mb2+nx
200
201
202 mb4=mb3+nx
203
204
205 mb5=mb4+nx
206
207
208 IF (off==zero) GOTO 200
209
210
211
212
213 l=0.0
214 DO k=1,nx-1
215 lnext=
216 . sqrt((xel(1,k+1)-xel(1,k))*(xel(1,k+1)-xel(1,k))
217 . +(xel(2,k+1)-xel(2,k))*(xel(2,k+1)-xel(2,k))
218 . +(xel(3,k+1)-xel(3,k))*(xel(3,k+1)-xel(3,k)))
219 l=l+lnext
220 mass(k) =lnext
221 ENDDO
222
223 xk =get_u_geo(4,iprop)
226 ffac=get_u_geo(12,iprop)
227 xfac=get_u_geo(13,iprop)
228
229
230 IF (ifunct==0.AND.ifv==0) THEN
231
232
233 l0 =uvar(nb1)
234 dx =l-l0
235
236 stif=xk
237 f =xk*dx/l0
238 epstot=dx/l0
239 ELSEIF (ifunct==0.AND.ifv/=0) THEN
240
241
242 l0 =uvar(nb1)
243 dx =l-l0
244
245 stif=0.
246 f = ffac
247 epstot=dx/l0
248 ELSE
249
250
251 l0 =uvar(nb1)
252 dx =l-l0
253 epstot=dx/l0
254 f =get_u_func(ifunct,epstot,dfdx)
255
256 f = ffac*f
257 stif=ffac*dfdx
258 ENDIF
259
260
261 dt11 = dt
262 IF(dt11==zero)dt11 = ep30
263
264 dxold=uvar(nb2)
265 ddx=dx-dxold
266 dvx=ddx/dt11
267
268 deps =(epstot-dxold/l0)/dt11
269
270 uvar(nb2)=dx
271
272 xc =get_u_geo(5,iprop)
273 dgdx=zero
274 IF (ifv>0) THEN
275 g = get_u_func(ifv,deps*xfac,dgdx)
276 dgdx = dgdx*xfac
277 fx = f*g+xc*deps
278 stif=stif*g
279 ELSE
280 fx= f+xc*deps
281 g = one
282 ENDIF
283
284 stif=stif*l/l0
285
286
287
288
289
290 DO k=1,nx-1
291 vnext(1)=xel(1,k+1)-xel(1,k)
292 vnext(2)=xel(2,k+1)-xel(2,k)
293 vnext(3)=xel(3,k+1)-xel(3,k)
294 vv=1./
max(em15,mass(k))
295 vnext(1)=vv*vnext(1)
296 vnext(2)=vv*vnext(2)
297 vnext(3)=vv*vnext(3)
298 torq(1,k)=vnext(1)
299 torq(2,k)=vnext(2)
300 torq(3,k)=vnext(3)
301 ENDDO
302
303
304 DO k=1,nx-1
305 viscr(k)=uvarn(mb2+k-1)
306 xiner(k)=uvarn(mb4+k-1)
307 ENDDO
308
309
310
311 epsmin=get_u_geo(8,iprop)
312 epsmax=get_u_geo(9,iprop)
313 IF (epstot<epsmin.OR.epstot>epsmax) THEN
314 off=zero
315 fx =zero
316#include "lockon.inc"
317 WRITE(iout, 1000) uid
318#include "lockoff.inc"
319 GOTO 100
320 ENDIF
321
322 mu1 = get_u_geo(10,iprop)
323 mu2 = get_u_geo(11,iprop)
324
325 epsmoy=(dx-dxold)/
max(em15,l)
326
327 xn=nx
328 DO k=1,nx-1
329 vprev(1)=torq(1,k)
330 vprev(2)=torq(2,k)
331 vprev(3)=torq(3,k)
332 ddx = vprev(1) * (vel(1,k+1) - vel(1,k))
333 . + vprev(2) * (vel(2,k+1) - vel(2,k))
334 . + vprev(3) * (vel(3,k+1) - vel(3,k))
335 uvarn(mb2+k-1)=uvarn(mb2+k-1)
336
337 . +stif*(dt*ddx*(xn-one)/
max(em15,l)-epsmoy)
338 ENDDO
339
340
341 echange=1
342 nit=0
343 DO WHILE(echange==1.AND.nit<10)
344 echange=0
345 nit=nit+1
346 DO k=1,nx-1
347
348 stifr(k)=uvarn(mb2+k-1)
349 END DO
350 DO k=2,nx-1
351
352 fric=mu1
353 mu = get_u_geo(50+k,iprop)
354 IF (mu>=zero) fric=mu
355 mu = get_u_geo(525+k-1,iprop)
356 IF (mu>=zero) THEN
357 fric=fric + half*mu
358 ELSE
359 fric=fric + half*mu2
360 ENDIF
361 mu = get_u_geo(525+k,iprop)
362 IF (mu>=zero) THEN
363 fric=fric+half*mu
364 ELSE
365 fric=fric + half*mu2
366 ENDIF
367
368 vprev(1)=torq(1,k-1)
369 vprev(2)=torq(2,k-1)
370 vprev(3)=torq(3,k-1)
371 vnext(1)=-torq(1,k)
372 vnext(2)=-torq(2,k)
373 vnext(3)=-torq(3,k)
374 alpha=vprev(1)*vnext(1)+vprev(2)*vnext(2)+vprev(3)*vnext(3)
377 beta = pi-acos(
alpha)
378
379 ff = two*fx+stifr(k-1)+stifr(k)
380 fmax =
max(zero,ff*tanh(half*fric*beta))
381 dfs = stifr(k-1)-stifr(k)
382 IF(abs(dfs)>fmax)THEN
383 df =sign(abs(dfs)-fmax,dfs)
384
385 uvarn(mb2+k-2)=uvarn(mb2+k-2)-half*df
386 uvarn(mb2+k-1)=uvarn(mb2+k-1)+half*df
387 echange=1
388 END IF
389 END DO
390 END DO
391
392
393
394 vprev(1)=torq(1,1)
395 vprev(2)=torq(2,1)
396 vprev(3)=torq(3,1)
397 forc(1,1)=fx*vprev(1)
398 forc(2,1)=fx*vprev(2)
399 forc(3,1)=fx*vprev(3)
400 DO k=2,nx-1
401 vnext(1)=torq(1,k)
402 vnext(2)=torq(2,k)
403 vnext(3)=torq(3,k)
404 forc(1,k)=fx*(vnext(1)-vprev(1))
405 forc(2,k)=fx*(vnext(2)-vprev(2))
406 forc(3,k)=fx*(vnext(3)-vprev(3))
407 vprev(1)=vnext(1)
408 vprev(2)=vnext(2)
409 vprev(3)=vnext(3)
410 ENDDO
411 forc(1,nx)=-fx*vprev(1)
412 forc(2,nx)=-fx*vprev(2)
413 forc(3,nx)=-fx*vprev(3)
414
415 DO k=1,nx-1
416 dfs=uvarn(mb2+k-1)
417 vprev(1)=dfs*torq(1,k)
418 vprev(2)=dfs*torq(2,k)
419 vprev(3)=dfs*torq(3,k)
420 forc(1,k) =forc(1,k) +vprev(1)
421 forc(2,k) =forc(2,k) +vprev(2)
422 forc(3,k) =forc(3,k) +vprev(3)
423 forc(1,k+1)=forc(1,k+1)-vprev(1)
424 forc(2,k+1)=forc(2,k+1)-vprev(2)
425 forc(3,k+1)=forc(3,k+1)-vprev(3)
426 ENDDO
427
428 DO k=1,nx
429 torq(1,k)=zero
430 torq(2,k)=zero
431 torq(3,k)=zero
432 ENDDO
433
434
435
436100 CONTINUE
437 fxold=uvar(nb3)
438 DO k=1,nx-1
439 uvarn(mb4+k-1)=mass(k)-uvarn(mb3+k-1)
440 uvarn(mb5+k-1)=uvarn(mb5+k-1)
441 . + half*(uvarn(mb4+k-1)-xiner(k))
442 . *(fx+fxold+uvarn(mb2+k-1)+viscr(k))
443 ENDDO
444
445 keint=1
446 eint =zero
447 DO k=1,nx-1
448 eint=eint+uvarn(mb5+k-1)
449 ENDDO
450 uvar(nb3)=fx
451
452 IF (off==zero) THEN
453
454 DO k=1,nx-1
455 uvarn(mb2+k-1)=zero
456 ENDDO
457 GOTO 200
458 ENDIF
459
460
461
462 rho = get_u_geo(3,iprop)
463 dte = ep20
464 DO k=1,nx-1
465
466
467 IF(mass(k)<=em15)THEN
468#include "lockon.inc"
469 WRITE(iout,*)
470 .' ** ERROR NSTRAND : NULL STRAND LENGTH, ELEMENT=',
471 . uid
472#include "lockoff.inc"
473 GOTO 999
474 ENDIF
475
476 xm = rho*uvarn(mb3+k-1)
477
478 xkm =stif*(nx-1)/
max(em15,l)
479 xcm = (f*dgdx+xc)*l/(
max(em15,mass(k))*l0)
480
481
482 IF(xkm<=em15.AND.xcm<=em15)THEN
483#include "lockon.inc"
484 WRITE(iout,*)
485 .' ** ERROR NSTRAND : NULL STRAND STIFFNESS & DAMPING, ELEMENT=',
486 . uid
487#include "lockoff.inc"
488 GOTO 999
489 ENDIF
490
491
492
493 dtk=(sqrt(xcm*xcm+xm*xkm)-xcm)/
max(em15,xkm)
495 IF (dtk==zero) THEN
496
497 dtk=dtc
498 ELSE
500 ENDIF
502 ENDDO
503
504
505
506200 CONTINUE
507 DO k=1,nx
508 xiner(k) =zero
509 stifr(k) =zero
510 viscr(k) =zero
511 ENDDO
512
513 IF (off==zero) THEN
514 DO k=1,nx
515 viscm(k) =zero
516 stifm(k) =zero
517 ENDDO
518 ELSE
519 viscm(1) =(f*dgdx+xc)*l/(
max(em15,mass(1))*l0)
520 stifm(1) =stif*(nx-1)/
max(em15,l)
521 DO k=2,nx-1
522 fact =one/
max(em15,mass(k-1))+one/
max(em15,mass(k)
523 viscm(k) =fact*(f*dgdx+xc)*l/l0
524 stifm(k) =2.*stif*(nx-1)/
max(em15,l)
525 ENDDO
526 viscm(nx) =(f*dgdx+xc)*l/(
max(em15,mass(nx-1))*l0)
527 stifm(nx) =stif*(nx-1)/
max(em15,l)
528 ENDIF
529
530 DO k=1,nx
531 mass(k)=uvarn(mb1+k-1)
532 ENDDO
533
534 1000 FORMAT(1x,'-- RUPTURE OF NSTRAND ELEMENT NUMBER ',i10)
535 RETURN
536
537 999 CONTINUE
538 CALL ancmsg(msgid=217,anmode=aninfo)
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)
integer function get_u_pid(ip)
integer function get_u_pnu(ivar, ip, k)
integer function get_u_mid(im)
integer function get_u_mnu(ivar, im, k)