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
106
107
108
109
110
111
112
113
114
115#include "implicit_f.inc"
116
117
118
119 INTEGER IOUT,NEL,NUVAR,IPROP,
120 . GET_U_PNU,GET_U_PID,GET_U_MID,GET_U_MNU,
121 . KFUNC,KMAT,KPROP
123 . uvar(nuvar,*),dt ,
124 . fx(*), fy(*), fz(*), e(*), vx(*),mass(*) ,xiner(*),
125 . ry1(*), rz1(*), off(*), xmom(*), ymom(*),
126 . zmom(*), rx(*), ry2(*), rz2(*),xl(*),
127 . stifm(*) ,stifr(*) , viscm(*) ,viscr(*) ,fr_wave(*) ,
128 . get_u_mat, get_u_geo, get_u_func, get_u_time
130 . get_u_mat,get_u_geo, get_u_func, get_u_time
131 parameter(kfunc=29)
132
133
134
135
136
137
138
139
140
141
142
143 INTEGER I,IFUNC1,IFUNC2,IFUNC3,IFUNC4,IFUNC5,EPSI
145 . elastif,x,dxdy,xlim1,xlim2,fmx,fmn,dx,damp,
146 . fux1,fux2,fux3,fux4,debug,slope
148 . tt,newlen,deltalen,deltalendot,scalet,scalex,scalev,scalef
149
150
151 elastif= get_u_geo(2,iprop)
152 xlim1 = get_u_geo(3,iprop)
153 xlim2 = get_u_geo(4,iprop)
154 damp = get_u_geo(6,iprop)
155 scalet = get_u_geo(8,iprop)
156 scalex = get_u_geo(9,iprop)
157 scalev = get_u_geo(10,iprop)
158 scalef = get_u_geo(11,iprop)
159
160 epsi = int(get_u_geo(7,iprop))
166
167 tt= get_u_time()
168 tt = tt / scalet
169
170 deltalendot = zero
171
172
173
174 DO i=1,nel
175 dx = dt * vx(i)
176 x = uvar(1,i) + dx
177 uvar(1,i) = x
178 newlen = uvar(3,i) + uvar(1,i)
179
180 IF (epsi == 0) THEN
181 deltalen = newlen/uvar(3,i) - one
182 IF (dt == zero) THEN
183 deltalen = zero
184 ELSE
185 deltalendot = newlen/uvar(3,i)*vx(i)/xlim1
186 ENDIF
187 ELSE
188 deltalen = x
189 deltalendot = vx(i)
190 ENDIF
191
192
193 fux1 = get_u_func(ifunc1,tt,dxdy)
194
195 IF(epsi/= 0)deltalen = deltalen / scalex
196 fux2 = get_u_func(ifunc2,deltalen,dxdy)
197
198
199 deltalendot = deltalendot / scalev
200 fux3 = get_u_func(ifunc3,deltalendot,dxdy)
201
202 fux4 = get_u_func(ifunc4,deltalen,dxdy)
203 fux4 = fux4 * scalef
204
205
206 IF (vx(i)>xlim1)THEN
207 fx(i) = xlim2 * fux1 * fux2 * fux3 + fux4 + damp*xlim1
208 ELSEIF (vx(i)<-xlim1)THEN
209 fx(i) = xlim2 * fux1 * fux2 * fux3 + fux4 - damp*xlim1
210 ELSE
211 fx(i) = xlim2 * fux1 * fux2 * fux3 + fux4 + damp*vx(i)
212 ENDIF
213
214
215
216
217
218
219 IF(deltalen /= zero)THEN
220 slope = abs(fx(i)-uvar(4,i))/abs(dx)
221
222 ELSE
223 slope = elastif
224 ENDIF
225
226
227
228 stifm(i) = slope
229 stifr(i) = zero
230 viscm(i) = zero
231 viscr(i) = zero
232 xiner(i) = zero
233 uvar(4,i)= fx(i)
234 ENDDO
235
236 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)