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
116#include "implicit_f.inc"
117
118
119
120 INTEGER IOUT,NEL,NUVAR,IPROP,
121 . GET_U_PNU,GET_U_PID,GET_U_MID,GET_U_MNU,
122 . KFUNC,KMAT,
124 . uvar(nuvar,*),dt ,
125 . fx(*), fy(*), fz(*), e(*), vx(*),mass(*) ,xiner(*),
126 . ry1(*), rz1(*), off(*), xmom(*), ymom(*),
127 . zmom(*), rx(*), ry2(*), rz2(*),xl(*),
128 . stifm(*) ,stifr(*) , viscm(*) ,viscr(*) ,fr_wave(*) ,
129 . get_u_mat, get_u_geo, get_u_func
131 . get_u_mat,get_u_geo, get_u_func
132 parameter(kfunc=29)
133 parameter(kmat=31)
134 parameter(kprop=33)
135
136
137
138 INTEGER I,IFUNC1,IFUNC2,IFUNC3,IFUNC4,ILOAD
140 . elastif,x,dxdy,xlim1,xlim2,fmx,fmn,dx,amas,d1,d2,fscal
141
142
143 amas = get_u_geo(1,iprop)
144 elastif= get_u_geo(2,iprop)
145 xlim1 = get_u_geo(3,iprop)
146 xlim2 = get_u_geo(4,iprop)
147 d1 = get_u_geo(5,iprop)
148 d2 = get_u_geo(6,iprop)
149 fscal = get_u_geo(8,iprop)
150 iload = nint(get_u_geo(7,iprop))
155
156 DO i=1,nel
157 mass(i) = amas
158 dx = dt * vx(i) / xl(i)
159 x = uvar(1,i) + dx
160
161 IF (uvar(3,i) == zero) THEN
162 fmx = fscal*get_u_func(ifunc1,x,dxdy)
163 fmn = fscal*get_u_func(ifunc2,x,dxdy)
164 ELSE
165 fmx = uvar(2,i)*fscal*get_u_func(ifunc3,x,dxdy)
166 fmn = uvar(2,i)*fscal*get_u_func(ifunc4,x,dxdy)
167 ENDIF
168
169 IF (uvar(3,i) >= one) THEN
170 fr_wave(i)=one
171
172
173 IF (iload == 0 .OR. dx > zero) uvar(2,i)
174 ELSEIF (fr_wave(i) == one) THEN
175 IF (iload == 0 .OR. dx > zero) uvar(3,i)=uvar(3,i)+d2
176
177 ENDIF
178
179 IF (x >= xlim1) THEN
180 fr_wave(i)=one
181 IF (uvar(3,i) >= one .AND. off(i) == one) THEN
182
183 WRITE(iout,*)'SPRING',i, 'REACHES LIMIT IN X : ',x
184 off(i)=zero
185 ENDIF
186 ELSE
187 fr_wave(i)=zero
188 ENDIF
189
190 uvar(1,i) = x
191 fx(i) = fx(i) + elastif * dx * uvar(2,i)
192 fx(i) =
min(fx(i),fmx)
193 fx(i) =
max(fx(i),fmn)
194 fx(i) = fx(i) * off(i)
195
196
197
198 stifm(i) = elastif / xl(i)
199 stifr(i) = zero
200 viscm(i) = zero
201 viscr(i) = zero
202 xiner(i) = zero
203 ENDDO
204
205 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)