41
42
43
44
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#include "implicit_f.inc"
106
107
108
109 INTEGER IOUT,NEL,NUVAR,IPROP,ICO,
110 . GET_U_PNU,GET_U_PID,GET_U_MID,GET_U_MNU,
111 . KFUNC,KMAT,KPROP
113 . uvar(nuvar,*),dt ,
114 . fx(*), fy(*), fz(*), e(*), vx(*),mass(*) ,xiner(*),
115 . ry1(*), rz1(*), off(*), xmom(*), ymom(*),
116 . zmom(*), rx(*), ry2(*), rz2(*),xl(*),
117 . stifm(*) ,stifr(*) , viscm(*) ,viscr(*) ,fr_wave_e(*) ,
118 . get_u_mat, get_u_geo, get_u_func
120 . get_u_mat,get_u_geo, get_u_func
121 parameter(kfunc=29)
122 parameter(kmat=31)
123 parameter(kprop=47)
124
125
126
127 INTEGER I,ID1,ID2,ID10,ID20,
128 . IFUN_XP,IFUN_XMI,IFUN_XXPI,IFUN_XXMI,IFUN_YY1PI,
129 . IFUN_YY1MI,IFUN_YY2PI,IFUN_YY2MI,IFUN_ZZ1PI,
130 . IFUN_ZZ1MI,IFUN_ZZ2PI,IFUN_ZZ2MI,
131 . IFUN_XMR,IFUN_XXPR,IFUN_XXMR,IFUN_YY1PR,
132 . IFUN_YY1MR,IFUN_YY2PR,IFUN_YY2MR,IFUN_ZZ1PR,
133 . IFUN_ZZ1MR,IFUN_ZZ2PR,IFUN_ZZ2MR,
134 . IFUN_DAMP_XI,IFUN_DAMP_YI,IFUN_DAMP_ZI,
135 . ,IFUN_DAMP_YYI,IFUN_DAMP_ZZI
136 INTEGER IFUNXM(NEL),IFUNXXM(NEL),IFUNYY1M(NEL),
137 . IFUNZZ1M(),IFUNYY2M(NEL),IFUNZZ2M(NEL),
138 . IFUNXP(NEL),IFUNXXP(NEL),IFUNYY1P(NEL),
139 . IFUNZZ1P(NEL),IFUNYY2P(NEL),IFUNZZ2P(NEL),
140 . JPOSXM(NEL),JPOSXXM(NEL),JPOSYY1M(NEL),
141 . JPOSZZ1M(NEL),JPOSYY2M(NEL),JPOSZZ2M(NEL),
142 . JPOSXP(NEL),JPOSXXP(NEL),JPOSYY1P(NEL),
143 . JPOSZZ1P(NEL),JPOSYY2P(NEL),JPOSZZ2P(NEL),
144 . JPOS_DAMP_X(NEL),JPOS_DAMP_Y(NEL),JPOS_DAMP_Z(NEL),
145 . JPOS_DAMP_XX(NEL),JPOS_DAMP_YY(NEL),JPOS_DAMP_ZZ(NEL),
146 . IFUN_DAMP_X(NEL),IFUN_DAMP_Y(NEL),IFUN_DAMP_Z(NEL),
147 . IFUN_DAMP_XX(NEL),IFUN_DAMP_YY(NEL),IFUN_DAMP_ZZ(NEL)
149 . xlimg,xlim,xxlim,yy1lim,yy2lim,zz1lim,zz2lim,
150 . k11,k44,k55,k66,k5b,k6c,leng2,leng,uleng0,r,ax,ay,az,
151 . fscal_x,fscal_rx,fscal_ry1,fscal_ry2,fscal_rz1,fscal_rz2,
152 . a,b,d,ff1,ff2,r1,mm,ff,fscal_damp_x,fscal_damp_y,
153 . fscal_damp_z,fscal_damp_xx,fscal_damp_yy,
154 . fscal_damp_zz,f_x,f_y,f_z,f_xx,f_yy,f_zz,
alpha,ncf,
155 . idamping
157 . dydx,x,fxm,fxp,xx,fxxm,fxxp,yy1,fyy1m,fyy1p,
158 . zz1,fzz1m,fzz1p,yy2,fyy2m,fyy2p,zz2,fzz2m,fzz2p,
159 . uleng,my1,my2,mz1,mz2,fx_damp,fy_damp,fz_damp,
160 . fxx_damp,fyy_damp,fzz_damp,xdot,xxdot,yy1dot,zz1dot,yy2dot,zz2dot,
161 . xdot_old,xxdot_old,yy1dot_old,zz1dot_old,yy2dot_old,zz2dot_old,
162 . elodotx,elodoty,elodotz,elodotxx,elodotyy,elodotzz
163
164 xlimg = get_u_geo(1,iprop)
165 xlim = get_u_geo(2,iprop)
166 xxlim = get_u_geo(3,iprop)
167 yy1lim = get_u_geo(4,iprop)
168 zz1lim = get_u_geo(5,iprop)
169 yy2lim = get_u_geo(6,iprop)
170 zz2lim = get_u_geo(7,iprop)
171 ico = nint(get_u_geo(16,iprop))
172 fscal_x = get_u_geo(17,iprop)
173 fscal_rx = get_u_geo(18,iprop)
174 fscal_ry1 = get_u_geo(19,iprop)
175 fscal_ry2 = get_u_geo(20,iprop)
176 fscal_rz1 = get_u_geo(21,iprop)
177 fscal_rz2 = get_u_geo(22,iprop)
178
202
203
204 ncf = get_u_geo(35,iprop)
205
206 idamping = get_u_geo(36,iprop)
207
208
209
210 IF (idamping > zero) THEN
214 ifun_damp_xxi =
get_u_pnu(27,iprop,kfunc)
215 ifun_damp_yyi =
get_u_pnu(28,iprop,kfunc)
216 ifun_damp_zzi =
get_u_pnu(29,iprop,kfunc)
217
218 fscal_damp_x = get_u_geo(23,iprop)
219 fscal_damp_y = get_u_geo(24,iprop)
220 fscal_damp_z = get_u_geo(25,iprop)
221 fscal_damp_xx = get_u_geo(26,iprop)
222 fscal_damp_yy = get_u_geo(27,iprop)
223 fscal_damp_zz = get_u_geo(28,iprop)
224
225 f_x = get_u_geo(29,iprop)
226 f_y = get_u_geo(30,iprop)
227 f_z = get_u_geo(31,iprop)
228 f_xx = get_u_geo(32,iprop)
229 f_yy = get_u_geo(33,iprop)
230 f_zz = get_u_geo(34,iprop)
231 ENDIF
232
233
234
235 IF (ncf > zero) THEN
236 alpha = two/(ncf+one)
237
238 DO i=1,nel
239 xdot_old(i) = uvar(37,i)
240 xxdot_old(i) = uvar(38,i)
241 yy1dot_old(i) = uvar(39,i)
242 zz1dot_old(i) = uvar(40,i)
243 yy2dot_old(i) = uvar(41,i)
244 zz2dot_old(i) = uvar(42,i)
245 ENDDO
246
247 DO i=1,nel
248 uleng0 = uvar(30,i)
249 xdot(i) = vx(i) * uleng0
250 xxdot(i) = rx(i)
251 yy1dot(i) = ry1(i)
252 zz1dot(i) = rz1(i)
253 yy2dot(i) = ry2(i)
254 zz2dot(i) = rz2(i)
255 ENDDO
256
257 DO i=1,nel
258 xdot(i) =
alpha * xdot(i) + (one-
alpha) * xdot_old(i)
259 xxdot(i) =
alpha * xxdot(i) + (one-
alpha) * xxdot_old(i)
260 yy1dot(i) =
alpha * yy1dot(i) + (one-
alpha) * yy1dot_old(i)
261 zz1dot(i) =
alpha * zz1dot(i) + (one-
alpha) * zz1dot_old(i)
262 yy2dot(i) =
alpha * yy2dot(i) + (one-
alpha) * yy2dot_old(i)
263 zz2dot(i) =
alpha * zz2dot(i) + (one-
alpha) * zz2dot_old(i)
264 ENDDO
265
266 DO i=1,nel
267 uvar(37,i) = xdot(i)
268 uvar(38,i) = xxdot(i)
269 uvar(39,i) = yy1dot(i)
270 uvar(40,i) = zz1dot(i)
271 uvar(41,i) = yy2dot(i)
272 uvar(42,i) = zz2dot(i)
273 ENDDO
274
275 DO i=1,nel
276
277
278 x(i) = uvar(1,i) + dt * xdot(i)
279 xx(i) = uvar(2,i) + dt * xxdot(i)
280 yy1(i) = uvar(3,i) + dt * yy1dot(i)
281 zz1(i) = uvar(4,i) + dt * zz1dot(i)
282 yy2(i) = uvar(5,i) + dt * yy2dot(i)
283 zz2(i) = uvar(6,i) + dt * zz2dot(i)
284 ENDDO
285 ENDIF
286
287
288
289 DO i=1,nel
290 my1(i) = -ymom(i)+half*xl(i)*fz(i)
291 my2(i) = ymom(i)+half*xl(i)*fz(i)
292 mz1(i) = -zmom(i)-half*xl(i)*fy(i)
293 mz2(i) = zmom(i)-half*xl(i)*fy(i)
294
295 leng =
max(xl(i),em20)
296 leng2 = leng*leng
297 uleng(i) = one/leng
298
299 k11 = uvar(19,i)
300 k44 = uvar(20,i)
301 k55 = uvar(21,i)*leng2
302 k66 = uvar(22,i)*leng2
303 k5b = uvar(23,i)*leng2
304 k6c = uvar(24,i)*leng2
305
306 fx(i) = fx(i) + dt * k11 * vx(i)
307 xmom(i)= xmom(i)+ dt * k44 * rx(i)
308 my1(i) = my1(i) + dt * (k55 * ry1(i) + k5b * ry2(i))
309 my2(i) = my2(i) + dt * (k5b * ry1(i) + k55 * ry2(i))
310 mz1(i) = mz1(i) + dt * (k66 * rz1(i) + k6c * rz2(i))
311 mz2(i) = mz2(i) + dt * (k6c * rz1(i) + k66 * rz2(i))
312
313 uleng0 = uvar(30,i)
314
315 IF (ncf == zero) THEN
316 x(i) = uvar(1,i) + dt * vx(i) * uleng0
317 xx(i) = uvar(2,i) + dt * rx(i)
318 yy1(i) = uvar(3,i) + dt * ry1(i)
319 zz1(i) = uvar(4,i) + dt * rz1(i)
320 yy2(i) = uvar(5,i) + dt * ry2(i)
321 zz2(i) = uvar(6,i) + dt * rz2(i)
322 ENDIF
323
324 jposxm(i) = nint(uvar(7,i))
325 jposxxm(i) = nint(uvar(8,i))
326 jposyy1m(i) = nint(uvar(9,i))
327 jposzz1m(i) = nint(uvar(10,i))
328 jposyy2m(i) = nint(uvar(11,i))
329 jposzz2m(i) = nint(uvar(12,i))
330 jposxp(i) = nint(uvar(13,i))
331 jposxxp(i) = nint(uvar(14,i))
332 jposyy1p(i) = nint(uvar(15,i))
333 jposzz1p(i) = nint(uvar(16,i))
334 jposyy2p(i) = nint(uvar(17,i))
335 jposzz2p(i) = nint(uvar(18,i))
336
337 ifunxp(i) = ifun_xp
338 ifunxm(i) = ifun_xmi
339 ifunxxm(i) = ifun_xxmi
340 ifunxxp(i) = ifun_xxpi
341 ifunyy1m(i) = ifun_yy1mi
342 ifunyy1p(i) = ifun_yy1pi
343 ifunyy2m(i) = ifun_yy2mi
344 ifunyy2p(i) = ifun_yy2pi
345 ifunzz1m(i) = ifun_zz1mi
346 ifunzz1p(i) = ifun_zz1pi
347 ifunzz2m(i) = ifun_zz2mi
348 ifunzz2p(i) = ifun_zz2pi
349
350
351
352 IF (idamping > zero) THEN
353 ifun_damp_x(i) = ifun_damp_xi
354 ifun_damp_y(i) = ifun_damp_yi
355 ifun_damp_z(i) = ifun_damp_zi
356 ifun_damp_xx(i) = ifun_damp_xxi
357 ifun_damp_yy(i) = ifun_damp_yyi
358 ifun_damp_zz(i) = ifun_damp_zzi
359
360 jpos_damp_x(i) = nint(uvar(31,i))
361 jpos_damp_y(i) = nint(uvar(32,i))
362 jpos_damp_z(i) = nint(uvar(33,i))
363 jpos_damp_xx(i) = nint(uvar(34,i))
364 jpos_damp_yy(i) = nint(uvar(35,i))
365 jpos_damp_zz(i) = nint(uvar(36,i))
366 ENDIF
367 ENDDO
368
369 IF (idamping > zero) THEN
370
371 DO i=1,nel
372 elodotx(i) = vx(i)
373 elodoty(i) = - half * (rz2(i) + rz1(i)) * xl(i)
374 elodotz(i) = half * (ry2(i) + ry1(i)) * xl(i)
375 elodotxx(i) = rx(i)
376 elodotyy(i) = ry2(i) - ry1(i)
377 elodotzz(i) = rz2(i) - rz1(i)
378 ENDDO
379 ENDIF
380
381 IF (ico == 0) THEN
382
383 DO i=1,nel
384 id1 = nint(uvar(29,i))/2
385 id2 = nint(uvar(29,i)) - 2*id1
386 id10=id1
387 id20=id2
388 IF (fr_wave_e(i) == one) THEN
389 jposxm(i) = 0
390 ifunxm(i) = ifun_xmr
391 ENDIF
392 IF (x(i) < xlimg) THEN
393 fr_wave_e(i)=one
394 ELSE
395 fr_wave_e(i)=zero
396 ENDIF
397
398 IF (x(i) < xlim .OR. abs(xx(i)) > xxlim) THEN
399 id1 = 1
400 id2 = 1
401 ENDIF
402 IF (abs(yy1(i)) > yy1lim .OR. abs(zz1(i)) > zz1lim) id1 = 1
403 IF (abs(yy2(i)) > yy2lim .OR. abs(zz2(i)) > zz2lim) id2 = 1
404
405 IF (id1 == 1) THEN
406 ifunxm(i) = ifun_xmr
407 ifunxxm(i) = ifun_xxmr
408 ifunxxp(i) = ifun_xxpr
409 ifunyy1m(i) = ifun_yy1mr
410 ifunyy1p(i) = ifun_yy1pr
411 ifunzz1m(i) = ifun_zz1mr
412 ifunzz1p(i) = ifun_zz1pr
413 IF (id10 == 0) THEN
414 jposxm(i) = 0
415 jposxxm(i) = 0
416 jposxxp(i) = 0
417 jposyy1m(i) = 0
418 jposzz1m(i) = 0
419 jposyy1p(i) = 0
420 jposzz1p(i) = 0
421 ENDIF
422 ENDIF
423 IF (id2 == 1) THEN
424 ifunxm(i) = ifun_xmr
425 ifunxxm(i) = ifun_xxmr
426 ifunxxp(i) = ifun_xxpr
427 ifunyy2m(i) = ifun_yy2mr
428 ifunyy2p(i) = ifun_yy2pr
429 ifunzz2m(i) = ifun_zz2mr
430 ifunzz2p(i) = ifun_zz2pr
431 IF (id20 == 0) THEN
432 jposxm(i) = 0
433 jposxxm(i) = 0
434 jposxxp(i) = 0
435 jposyy2m(i) = 0
436 jposzz2m(i) = 0
437 jposyy2p(i) = 0
438 jposzz2p(i) = 0
439 ENDIF
440 ENDIF
441 uvar(29,i) = 2*id1 + id2
442 ENDDO
443
446 CALL get_v_func(ifunxxm,nel,xx,dydx,fxxm,jposxxm)
447 CALL get_v_func(ifunxxp,nel,xx,dydx,fxxp,jposxxp)
448 CALL get_v_func(ifunyy1m,nel,yy1,dydx,fyy1m,jposyy1m)
449 CALL get_v_func(ifunyy1p,nel,yy1,dydx,fyy1p,jposyy1p)
450 CALL get_v_func(ifunzz1m,nel,zz1,dydx,fzz1m,jposzz1m)
451 CALL get_v_func(ifunzz1p,nel,zz1,dydx,fzz1p,jposzz1p)
452 CALL get_v_func(ifunyy2m,nel,yy2,dydx,fyy2m,jposyy2m)
453 CALL get_v_func(ifunyy2p,nel,yy2,dydx,fyy2p,jposyy2p)
454 CALL get_v_func(ifunzz2m,nel,zz2,dydx,fzz2m,jposzz2m)
455 CALL get_v_func(ifunzz2p,nel,zz2,dydx,fzz2p,jposzz2p)
456
457
458
459
460 IF (idamping > zero) THEN
461 IF (ifun_damp_xi > 0) THEN
462 DO i=1,nel
463 elodotx(i) = elodotx(i) / f_x
464 ENDDO
465 CALL get_v_func(ifun_damp_x,nel,elodotx,dydx,fx_damp,jpos_damp_x)
466 ENDIF
467
468 IF (ifun_damp_yi > 0) THEN
469 DO i=1,nel
470 elodoty(i) = elodoty(i) / f_y
471 ENDDO
472 CALL get_v_func(ifun_damp_y,nel,elodoty,dydx,fy_damp,jpos_damp_y)
473 ENDIF
474
475 IF (ifun_damp_zi > 0) THEN
476 DO i=1,nel
477 elodotz(i) = elodotz(i) / f_z
478 ENDDO
479 CALL get_v_func(ifun_damp_z,nel,elodotz,dydx,fz_damp,jpos_damp_z)
480 ENDIF
481
482 IF (ifun_damp_xxi > 0) THEN
483 DO i=1,nel
484 elodotxx(i) = elodotxx(i) / f_xx
485 ENDDO
486 CALL get_v_func(ifun_damp_xx,nel,elodotxx,dydx,fxx_damp,jpos_damp_xx)
487 ENDIF
488
489 IF (ifun_damp_yyi > 0) THEN
490 DO i=1,nel
491 elodotyy(i) = elodotyy(i) / f_yy
492 ENDDO
493 CALL get_v_func(ifun_damp_yy,nel,elodotyy,dydx,fyy_damp,jpos_damp_yy)
494 ENDIF
495
496 IF (ifun_damp_zzi > 0) THEN
497 DO i=1,nel
498 elodotzz(i) = elodotzz(i) / f_zz
499 ENDDO
500 CALL get_v_func(ifun_damp_zz,nel,elodotzz,dydx,fzz_damp,jpos_damp_zz)
501 ENDIF
502 ENDIF
503
504 DO i=1,nel
505 fxp(i) = fxp(i) * fscal_x
506 fxm(i) = fxm(i) * fscal_x
507 fxxp(i) = fxxp(i) * fscal_rx
508 fxxm(i) = fxxm(i) * fscal_rx
509 fyy1m(i) = fyy1m(i)* fscal_ry1
510 fyy1p(i) = fyy1p(i)* fscal_ry1
511 fzz1m(i) = fzz1m(i)* fscal_rz1
512 fzz1p(i) = fzz1p(i)* fscal_rz1
513 fyy2m(i) = fyy2m(i)* fscal_ry2
514 fyy2p(i) = fyy2p(i)* fscal_ry2
515 fzz2m(i) = fzz2m(i)* fscal_rz2
516 fzz2p(i) = fzz2p(i)* fscal_rz2
517 ENDDO
518
519 DO i=1,nel
520 uvar(1,i) = x(i)
521 uvar(2,i) = xx(i)
522 uvar(3,i) = yy1(i)
523 uvar(4,i) = zz1(i)
524 uvar(5,i) = yy2(i)
525 uvar(6,i) = zz2(i)
526 uvar(7,i) = jposxm(i)
527 uvar(8,i) = jposxxm(i)
528 uvar(9,i) = jposyy1m(i)
529 uvar(10,i) = jposzz1m(i)
530 uvar(11,i) = jposyy2m(i)
531 uvar(12,i) = jposzz2m(i)
532 uvar(13,i) = jposxp(i)
533 uvar(14,i) = jposxxp(i)
534 uvar(15,i) = jposyy1p(i)
535 uvar(16,i) = jposzz1p(i)
536 uvar(17,i) = jposyy2p(i)
537 uvar(18,i) = jposzz2p(i)
538
539
540
541 IF (idamping > zero) THEN
542 uvar(31,i) = jpos_damp_x(i)
543 uvar(32,i) = jpos_damp_y(i)
544 uvar(33,i) = jpos_damp_z(i)
545 uvar(34,i) = jpos_damp_xx(i)
546 uvar(35,i) = jpos_damp_yy(i)
547 uvar(36,i) = jpos_damp_zz(i)
548 ENDIF
549
550 fx(i) =
max(
min(fx(i) ,fxp(i)),fxm(i) )
551 xmom(i) =
max(
min(xmom(i),fxxp(i)),fxxm(i))
552 my1(i) =
max(
min(my1(i),fyy1p(i)),fyy1m(i))
553 mz1(i) =
max(
min(mz1(i),fzz1p(i)),fzz1m(i))
554 my2(i) =
max(
min(my2(i),fyy2p(i)),fyy2m(i))
555 mz2(i) =
max(
min(mz2(i),fzz2p(i)),fzz2m(i))
556 fz(i) = (my1(i)+my2(i)) * uleng(i)
557 fy(i) = -(mz1(i)+mz2(i)) * uleng(i)
558 ymom(i) = -half*(my1(i)-my2(i))
559 zmom(i) = -half*(mz1(i)-mz2(i))
560
561 viscm(i) = zero
562 viscr(i) = zero
563 stifm(i) = uvar(25,i)
564 stifr(i) = uvar(26,i)
565 mass(i) = uvar(27,i)
566 xiner(i) = uvar(28,i)
567
568
569
570 IF (idamping > zero) THEN
571 IF (ifun_damp_x(i) == 0) THEN
572 fx(i) = fx(i) + fscal_damp_x * elodotx(i)
573 ELSE
574 fx(i) = fx(i) + fscal_damp_x * fx_damp(i)
575 ENDIF
576
577 IF (ifun_damp_y(i) == 0) THEN
578 fy(i) = fy(i) + fscal_damp_y * elodoty(i)
579 ELSE
580 fy(i) = fy(i) + fscal_damp_y * fy_damp(i)
581 ENDIF
582
583 IF (ifun_damp_z(i) == 0) THEN
584 fz(i) = fz(i) + fscal_damp_z * elodotz(i)
585 ELSE
586 fz(i) = fz(i) + fscal_damp_z * fz_damp(i)
587 ENDIF
588
589 IF (ifun_damp_xx(i) == 0) THEN
590 xmom(i) = xmom(i) + fscal_damp_xx * elodotxx(i)
591 ELSE
592 xmom(i) = xmom(i) + fscal_damp_xx * fxx_damp(i)
593 ENDIF
594
595 IF (ifun_damp_yy(i) == 0) THEN
596 ymom(i) = ymom(i) + fscal_damp_yy * elodotyy(i)
597 ELSE
598 ymom(i) = ymom(i) + fscal_damp_yy * fyy_damp(i)
599 ENDIF
600
601 IF (ifun_damp_zz(i) == 0) THEN
602 zmom(i) = zmom(i) + fscal_damp_zz * elodotzz(i)
603 ELSE
604 zmom(i) = zmom(i) + fscal_damp_zz * fzz_damp(i)
605 ENDIF
606 ENDIF
607
608 ENDDO
609
610 ELSE
611
612 DO i=1,nel
613 id1 = nint(uvar(29,i))/2
614 id2 = nint(uvar(29,i)) - 2*id1
615 id10=id1
616 id20=id2
617 IF (fr_wave_e(i) == one) THEN
618 jposxm(i) = 0
619 ifunxm(i) = ifun_xmr
620 ENDIF
621 IF (x(i) < xlimg) THEN
622 fr_wave_e(i)=one
623 ELSE
624 fr_wave_e(i)=zero
625 ENDIF
626
627 IF (x(i) < xlim .OR. abs(xx(i)) > xxlim) THEN
628 id1 = 1
629 id2 = 1
630 ENDIF
631 IF (abs(yy1(i)) > yy1lim .OR. abs(zz1(i)) > zz1lim) id1 = 1
632 IF (abs(yy2(i)) > yy2lim .OR. abs(zz2(i)) > zz2lim) id2 = 1
633
634 IF (id1 == 1) THEN
635 ifunxm(i) = ifun_xmr
636 ifunxxm(i) = ifun_xxmr
637 ifunxxp(i) = ifun_xxpr
638 ifunyy1m(i) = ifun_yy1mr
639 ifunyy1p(i) = ifun_yy1pr
640 ifunzz1m(i) = ifun_zz1mr
641 ifunzz1p(i) = ifun_zz1pr
642 IF (id10 == 0) THEN
643 jposxm(i) = 0
644 jposxxm(i) = 0
645 jposxxp(i) = 0
646 jposyy1m(i) = 0
647 jposzz1m(i) = 0
648 jposyy1p(i) = 0
649 jposzz1p(i) = 0
650 ENDIF
651 ENDIF
652 IF (id2 == 1) THEN
653 ifunxm(i) = ifun_xmr
654 ifunxxm(i) = ifun_xxmr
655 ifunxxp(i) = ifun_xxpr
656 ifunyy2m(i) = ifun_yy2mr
657 ifunyy2p(i) = ifun_yy2pr
658 ifunzz2m(i) = ifun_zz2mr
659 ifunzz2p(i) = ifun_zz2pr
660 IF (id20 == 0) THEN
661 jposxm(i) = 0
662 jposxxm(i) = 0
663 jposxxp(i) = 0
664 jposyy2m(i) = 0
665 jposzz2m(i) = 0
666 jposyy2p(i) = 0
667 jposzz2p(i) = 0
668 ENDIF
669 ENDIF
670 uvar(29,i) = 2*id1 + id2
671 ENDDO
672
675 CALL get_v_func(ifunxxm,nel,xx,dydx,fxxm,jposxxm)
676 CALL get_v_func(ifunxxp,nel,xx,dydx,fxxp,jposxxp)
677 CALL get_v_func(ifunyy1m,nel,yy1,dydx,fyy1m,jposyy1m)
678 CALL get_v_func(ifunyy1p,nel,yy1,dydx,fyy1p,jposyy1p)
679 CALL get_v_func(ifunzz1m,nel,zz1,dydx,fzz1m,jposzz1m)
680 CALL get_v_func(ifunzz1p,nel,zz1,dydx,fzz1p,jposzz1p)
681 CALL get_v_func(ifunyy2m,nel,yy2,dydx,fyy2m,jposyy2m)
682 CALL get_v_func(ifunyy2p,nel,yy2,dydx,fyy2p,jposyy2p)
683 CALL get_v_func(ifunzz2m,nel,zz2,dydx,fzz2m,jposzz2m)
684 CALL get_v_func(ifunzz2p,nel,zz2,dydx,fzz2p,jposzz2p)
685
686
687
688 IF (idamping > zero) THEN
689 IF (ifun_damp_xi > 0) THEN
690 DO i=1,nel
691 elodotx(i) = elodotx(i) / f_x
692 ENDDO
693 CALL get_v_func(ifun_damp_x,nel,elodotx,dydx,fx_damp,jpos_damp_x
694 ENDIF
695
696 IF (ifun_damp_yi > 0) THEN
697 DO i=1,nel
698 elodoty(i) = elodoty(i) / f_y
699 ENDDO
700 CALL get_v_func(ifun_damp_y,nel,elodoty,dydx,fy_damp,jpos_damp_y)
701 ENDIF
702
703 IF (ifun_damp_zi > 0) THEN
704 DO i=1,nel
705 elodotz(i) = elodotz(i) / f_z
706 ENDDO
707 CALL get_v_func(ifun_damp_z,nel,elodotz,dydx,fz_damp,jpos_damp_z)
708 ENDIF
709
710 IF (ifun_damp_xxi > 0) THEN
711 DO i=1,nel
712 elodotxx(i) = elodotxx(i) / f_xx
713 ENDDO
714 CALL get_v_func(ifun_damp_xx,nel,elodotxx,dydx,fxx_damp,jpos_damp_xx)
715 ENDIF
716
717 IF (ifun_damp_yyi > 0) THEN
718 DO i=1,nel
719 elodotyy(i) = elodotyy(i) / f_yy
720 ENDDO
721 CALL get_v_func(ifun_damp_yy,nel,elodotyy,dydx,fyy_damp,jpos_damp_yy)
722 ENDIF
723
724 IF (ifun_damp_zzi > 0) THEN
725 DO i=1,nel
726 elodotzz(i) = elodotzz(i) / f_zz
727 ENDDO
728 CALL get_v_func(ifun_damp_zz,nel,elodotzz,dydx,fzz_damp,jpos_damp_zz)
729 ENDIF
730 ENDIF
731
732 DO i=1,nel
733 fxp(i) = fxp(i) * fscal_x
734 fxm(i) = fxm(i) * fscal_x
735 fxxp(i) = fxxp(i) * fscal_rx
736 fxxm(i) = fxxm(i) * fscal_rx
737 fyy1m(i) = fyy1m(i)* fscal_ry1
738 fyy1p(i) = fyy1p(i)* fscal_ry1
739 fzz1m(i) = fzz1m(i)* fscal_rz1
740 fzz1p(i) = fzz1p(i)* fscal_rz1
741 fyy2m(i) = fyy2m(i)* fscal_ry2
742 fyy2p(i) = fyy2p(i)* fscal_ry2
743 fzz2m(i) = fzz2m(i)* fscal_rz2
744 fzz2p(i) = fzz2p(i)* fscal_rz2
745 ENDDO
746
747 DO i=1,nel
748 uvar(1,i) = x(i)
749 uvar(2,i) = xx(i)
750 uvar(3,i) = yy1(i)
751 uvar(4,i) = zz1(i)
752 uvar(5,i) = yy2(i)
753 uvar(6,i) = zz2(i)
754 uvar(7,i) = jposxm(i)
755 uvar(8,i) = jposxxm(i)
756 uvar(9,i) = jposyy1m(i)
757 uvar(10,i) = jposzz1m(i)
758 uvar(11,i) = jposyy2m(i)
759 uvar(12,i) = jposzz2m(i)
760 uvar(13,i) = jposxp(i)
761 uvar(14,i) = jposxxp(i)
762 uvar(15,i) = jposyy1p(i)
763 uvar(16,i) = jposzz1p(i)
764 uvar(17,i) = jposyy2p(i)
765 uvar(18,i) = jposzz2p(i)
766
767
768
769 IF (idamping > zero) THEN
770 uvar(31,i) = jpos_damp_x(i)
771 uvar(32,i) = jpos_damp_y(i)
772 uvar(33,i) = jpos_damp_z(i)
773 uvar(34,i) = jpos_damp_xx(i)
774 uvar(35,i) = jpos_damp_yy(i)
775 uvar(36,i) = jpos_damp_zz(i)
776 ENDIF
777
778 my1(i) =
max(
min(my1(i),fyy1p(i)),fyy1m(i))
779 mz1(i) =
max(
min(mz1(i),fzz1p(i)),fzz1m(i))
780 my2(i) =
max(
min(my2(i),fyy2p(i)),fyy2m(i))
781 mz2(i) =
max(
min(mz2(i),fzz2p(i)),fzz2m(i))
782
783 xmom(i) =
max(
min(xmom(i),fxxp(i)),fxxm(i))
784
785 fyy1p(i) =
max(em20, fyy1p(i))
786 fyy1m(i) = -
max(em20,-fyy1m(i))
787 fyy2p(i) =
max(em20, fyy2p(i))
788 fyy2m(i) = -
max(em20,-fyy2m(i))
789
790 fzz1p(i) =
max(em20, fzz1p(i))
791 fzz1m(i) = -
max(em20,-fzz1m(i))
792 fzz2p(i) =
max(em20, fzz2p(i))
793 fzz2m(i) = -
max(em20,-fzz2m(i))
794
795 fxxp(i) =
max(em20, fxxp(i))
796 fxxm(i) = -
max(em20,-fxxm(i))
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816 ax =
max(xmom(i)/fxxp(i),xmom(i)/fxxm(i))
817 ay =
max(my1(i)/fyy1p(i),my1(i)/fyy1m(i))
818 az =
max(mz1(i)/fzz1p(i),mz1(i)/fzz1m(i))
819
820 mm = sqrt(ax*ax+ay*ay+az*az)
821
822 ff = fx(i)/
min(-em20,fxm(i))
823 r = (one+mm-ff)/
max(em20,two*mm)
824 IF (r > zero .AND. r < one) THEN
825 ff1 = half*(one-mm+ff)*fxm(i)
826 ELSE
827 ff1 = fxm(i)
829 ENDIF
830 r1 = r
831
832
833
834 ay =
max(my2(i)/fyy2p(i),my2(i)/fyy2m(i))
835 az =
max(mz2(i)/fzz2p(i),mz2(i)/fzz2m(i))
836 mm = sqrt(ax*ax+ay*ay+az*az)
837 r = (one+mm-ff)/
max(em20,two*mm)
838 IF (r > zero .AND. r < one) THEN
839 ff2 = half*(one-mm+ff)*fxm(i)
840 ELSE
841 ff2 = fxm(i)
843 ENDIF
844 my1(i) = r1*my1(i)
845 mz1(i) = r1*mz1(i)
846 my2(i) = r*my2(i)
847 mz2(i) = r*mz2(i)
848
849 xmom(i) =
min(r,r1)*xmom(i)
850
851 fx(i) =
max(
min(fx(i),fxp(i)), ff1, ff2)
852
853 fz(i) = (my1(i)+my2(i)) * uleng(i)
854 fy(i) = -(mz1(i)+mz2(i)) * uleng(i)
855 ymom(i) = -half*(my1(i)-my2(i))
856 zmom(i) = -half*(mz1(i)-mz2(i))
857
858 viscm(i) = zero
859 viscr(i) = zero
860 stifm(i) = uvar(25,i)
861 stifr(i) = uvar(26,i)
862 mass(i) = uvar(27,i)
863 xiner(i) = uvar(28,i)
864
865
866
867 IF (idamping > zero) THEN
868 IF (ifun_damp_x(i) == 0) THEN
869 fx(i) = fx(i) + fscal_damp_x * elodotx(i)
870 ELSE
871 fx(i) = fx(i) + fscal_damp_x * fx_damp(i)
872 ENDIF
873
874 IF (ifun_damp_y(i) == 0) THEN
875 fy(i) = fy(i) + fscal_damp_y * elodoty(i)
876 ELSE
877 fy(i) = fy(i) + fscal_damp_y * fy_damp(i)
878 ENDIF
879
880 IF (ifun_damp_z(i) == 0) THEN
881 fz(i) = fz(i) + fscal_damp_z * elodotz(i)
882 ELSE
883 fz(i) = fz(i) + fscal_damp_z * fz_damp(i)
884 ENDIF
885
886 IF (ifun_damp_xx(i) == 0) THEN
887 xmom(i) = xmom(i) + fscal_damp_xx * elodotxx(i)
888 ELSE
889 xmom(i) = xmom(i) + fscal_damp_xx * fxx_damp(i)
890 ENDIF
891
892 IF (ifun_damp_yy(i) == 0) THEN
893 ymom(i) = ymom(i) + fscal_damp_yy * elodotyy(i)
894 ELSE
895 ymom(i) = ymom(i) + fscal_damp_yy * fyy_damp(i)
896 ENDIF
897
898 IF (ifun_damp_zz(i) == 0) THEN
899 zmom(i) = zmom(i) + fscal_damp_zz * elodotzz(i)
900 ELSE
901 zmom(i) = zmom(i) + fscal_damp_zz * fzz_damp(i)
902 ENDIF
903 ENDIF
904
905 ENDDO
906
907 ENDIF
908
909 RETURN
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)
subroutine get_v_func(ifunc, llt, xx, dydx, yy, jpos)