44
45
46
47 USE sensor_mod
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#include "implicit_f.inc"
122#include "impl1_c.inc"
123#include "com04_c.inc"
124
125
126
127 INTEGER IOUT,NEL,NUVAR,IPROP,NSENSOR,
128 . GET_U_PNU,GET_U_PID,GET_U_MID,GET_U_MNU,
129 . KFUNC,KMAT,KPROP
131 . uvar(nuvar,*),dt ,
132 . fx(*), fy(*), fz(*), e(*), vx(*),mass(*) ,xiner(*),
133 . ry1(*), rz1(*), off(*), xmom(*), ymom(*),
134 . zmom(*), rx(*), ry2(*), rz2(*),xl(*),
135 . stifm(*) ,stifr(*) , viscm(*) ,viscr(*) ,fr_wave(*) ,
136 . get_u_mat, get_u_geo, get_u_func, get_u_sens
138 . get_u_mat,get_u_geo, get_u_func
139 parameter(kfunc=29)
140 parameter(kmat=31)
141 parameter(kprop=33)
142 TYPE (SENSOR_STR_) ,DIMENSION(NSENSOR) :: SENSOR_TAB
143
144
145
146 INTEGER I,IFUNC1,IFUNC2,ISENS,ITYP,IACT,ILOCK
148 . stif0,stif1,
dscal,fscal,tscal,x,dxdy,dx,tacti,f0,ff,d1,
149 . dxdy2,ff2
150
151 stif0 = get_u_geo(2,iprop)
152 stif1 = get_u_geo(3,iprop)
153 tscal = get_u_geo(7,iprop)
154 dscal = get_u_geo(8,iprop)
155 fscal = get_u_geo(9,iprop)
156 d1 = get_u_geo(11,iprop)
157 isens = nint(get_u_geo(5,iprop))
158 ityp = nint(get_u_geo(6,iprop))
159 ilock = nint(get_u_geo(10,iprop))
160 tacti = get_u_sens(isens)
161
162 IF (tacti == zero .AND. isens /= zero) THEN
163 iact=0
164 DO i=1,nel
165 IF (uvar(2,i) == one) THEN
166 uvar(2,i) = zero
167 ENDIF
168 fx(i) = fx(i) + stif0 * dt * vx(i)
169 uvar(4,i) = stif0
170 stifm(i) = stif0
171 ENDDO
172 ELSE
173 iact=1
174 DO i=1,nel
175 IF (uvar(2,i) == zero) THEN
176 uvar(1,i) = zero
177 uvar(2,i) = one
178 ENDIF
179 uvar(1,i) = uvar(1,i) + dt * vx(i)
180 fx(i) = fx(i) + stif0 * dt * vx(i)
181 uvar(4,i) = stif0
182 stifm(i) = stif0
183 ENDDO
184 ENDIF
185
186 IF (iact == 0) THEN
187 ELSEIF (ityp == 1) THEN
188 f0 = get_u_geo(4,iprop)
189 DO i=1,nel
190 x = uvar(1,i)
191 ff = f0 + stif1 * x
192 IF (fx(i) > ff .AND. ilock == 2) uvar(3,i) = one
193 IF (ff > zero .AND. uvar(3,i) == zero) THEN
194 fx(i) =
max(ff,fx(i))
195 IF (impl_s > zero) THEN
196 ff2 = f0 + stif1 * (x-dt * vx(i))
197 IF (ff2 > ff) THEN
198 uvar(4,i) =
min(stif0,stif1)
199 ENDIF
200 ENDIF
201 ENDIF
202 ENDDO
203 ELSEIF (ityp == 2) THEN
205 DO i=1,nel
206 x = uvar(1,i)
207 ff = fscal*get_u_func(ifunc1,x*
dscal,dxdy)
208 IF (x < d1 .AND. d1 /= zero) uvar(3,i) = one
209 IF (fx(i) > ff .AND. ilock == 2) uvar(3,i) = one
210 IF (ff > zero .AND. uvar(3,i) == zero) THEN
211 fx(i) =
max(ff,fx(i))
212 IF (impl_s > zero) THEN
213 ff2 = fscal*get_u_func(ifunc1,(x-dt * vx(i))*
dscal,dxdy2)
214 IF (ff2 > ff) THEN
215 uvar(4,i) =
min(stif0,abs(dxdy))
216 ENDIF
217 ENDIF
218 ENDIF
219 ENDDO
220 ELSEIF (ityp == 3) THEN
222 f0 = fscal*get_u_func(ifunc2,tacti*tscal,dxdy)
223 DO i=1,nel
224 x = uvar(1,i)
225 IF (x < d1 .AND. d1 /= zero) uvar(3,i) = one
226 IF (fx(i) > f0 .AND. ilock == 2) uvar(3,i) = one
227 IF (f0 > zero .AND. uvar(3,i) == zero) THEN
228 fx(i) =
max(f0,fx(i))
229 ENDIF
230 ENDDO
231 ELSEIF (ityp == 4) THEN
234 f0 = fscal*get_u_func(ifunc2,tacti*tscal,dxdy)
235 DO i=1,nel
236 x = uvar(1,i)
237 ff = f0*get_u_func(ifunc1,x*
dscal,dxdy)
238 IF (x < d1 .AND. d1 /= zero) uvar(3,i) = one
239 IF (fx(i) > ff .AND. ilock == 2) uvar(3,i) = one
240 IF (ff > zero .AND. uvar(3,i) == zero) THEN
241 fx(i) =
max(ff,fx(i))
242 IF (impl_s > zero) THEN
243 ff2 = get_u_func(ifunc1,(x-dt * vx(i))*
dscal,dxdy2)
244 IF (ff2 > ff) THEN
245 uvar(4,i) =
min(stif0,abs(dxdy))
246 ENDIF
247 ENDIF
248 ENDIF
249 ENDDO
250 ENDIF
251
252 DO i=1,nel
253 stifr(i) = zero
254 viscm(i) = zero
255 viscr(i) = zero
256 xiner(i) = zero
257 ENDDO
258
259 RETURN
subroutine dscal(n, da, dx, incx)
DSCAL
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)