43
44
45
46 USE sensor_mod
47
48
49
50#include "implicit_f.inc"
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#include "com04_c.inc"
94#include "tabsiz_c.inc"
95
96
97
98 INTEGER ,INTENT(IN) :: NEL
99 INTEGER ,INTENT(IN) :: NFUNC
100 INTEGER ,INTENT(IN) :: NUPARAM
101 INTEGER ,INTENT(IN) :: NIPARAM
102 INTEGER ,INTENT(IN) :: NUVAR
103 INTEGER ,INTENT(IN) :: NSENSOR
104 my_real ,
INTENT(IN) :: time,timestep
105 INTEGER ,DIMENSION(NFUNC) ,INTENT(IN) :: IFUNC
106 INTEGER ,DIMENSION(SNPC) ,INTENT(IN) :: NPF
107 my_real ,
DIMENSION(STF) ,
INTENT(IN) :: tf
108 INTEGER ,DIMENSION(NIPARAM) ,INTENT(IN) :: IPARAM
109 my_real ,
DIMENSION(NUPARAM) ,
INTENT(IN) :: uparam
110 my_real ,
DIMENSION(NEL) ,
INTENT(IN) ::
area,rho0,thkly,offgg,
111 . depsxx,depsyy,depsxy,depsyz,depszx,epsxx,epsyy,epsxy,epsyz,epszx,
112 . sigoxx,sigoyy,sigoxy,sigoyz,sigozx,shf,aldt
113 TYPE (SENSOR_STR_) ,DIMENSION(NSENSOR) ,INTENT(IN) :: SENSOR_TAB
114
115
116
117 my_real ,
DIMENSION(NEL) ,
INTENT(OUT) :: tan_phi,etse,
118 . signxx,signyy,signxy,signyz,signzx,
119 . sigvxx,sigvyy,sigvxy,soundsp,viscmax
120
121
122
123 my_real ,
DIMENSION(NEL,NUVAR) ,
INTENT(INOUT) :: uvar
124
125
126
127 INTEGER :: I,ITER,NITER,ISENS,IFUNCC,IFUNCT,IFUNCS,IFUNF1,IFUNF2
128 INTEGER ,DIMENSION(NEL) :: IADF1,IADF2,IAD1,IAD2,IAD3,ILEN1,ILEN2,ILEN3,
129 . ILENF1,ILENF2,IPOS,IPOS1,IPOS2
130 my_real :: kmax,gmax,gfrot,gsh,stiff,kflex,kflex1,kflex2,
131 . mass,dyc,dyt,dc0,dt0,h0,hc0,ht0,visce,viscg,lc0,lt0,hdc,hdt,
132 . tfrot,sigg,ec2,et2,sinn,tan2,damp,v1,v2,dtinv,etc,ett,trace,
133 . zerostress,dsig,lmin,tstart,phi1,phi2,j11,j12,j21,j22,det
135 my_real ,
DIMENSION(NEL) :: sigc,sigt,ec,et,lc,lt,fn,angle,kg,gxy,
136 . dtang,tfold,cvisc,cvist,flexc,flext,flexf,hc,ht,dc,dt,dcc,dtt,
137 . fc,ft,fpc,fpt,dflxc,dflxt,epsf,epsfc,epsft,xc,xt,beta,ph01,ph02
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160 isens = iparam(1)
161
162 lc0 = one
163 lt0 = one
164 dc0 = uparam(1)
165 dt0 = uparam(2)
166 hc0 = uparam(3)
167 ht0 = uparam(4)
168 kflex = uparam(5)
169 kflex1 = uparam(6)
170 kflex2 = uparam(7)
171 zerostress = uparam(8)
172 kmax = uparam(10)
173 gmax = uparam(11)
174 yfac(1) = uparam(12)
175 yfac(2) = uparam(13)
176 yfac(3) = uparam(14)
177
178 ifuncc = ifunc(1)
179 ifunct = ifunc(2)
180 ifuncs = ifunc(3)
181 ifunf1 = ifunc(4)
182 ifunf2 = ifunc(5)
183
184 gfrot = gmax
185 gsh = shf(1)
186 visce = em02 ! fiber visc
damping coefficient
187 viscg = em02
188
189 IF (zerostress > zero .and. isens > 0) THEN
190 tstart = sensor_tab(isens)%TSTART
191 ELSE
192 tstart = zero
193 ENDIF
194 dtinv = timestep/
max(timestep**2,em20)
195
196 h0 = hc0 + ht0
197 niter = 10
198
199#include "vectorize.inc"
200 DO i = 1,nel
201 tfold(i) = uvar(i,9)
202 mass = rho0(i)*
area(i)*thkly(i)*fourth
203 cvisc(i) = sqrt(mass*kflex1)*dtinv*third
204 cvist(i) = sqrt(mass*kflex2)*dtinv*third
205 ENDDO
206
207
208#include "vectorize.inc"
209 DO i = 1,nel
210 etc = uvar(i,4) + depsxx(i)
211 ett = uvar(i,5) + depsyy(i)
212 uvar(i,4) = etc
213 uvar(i,5) = ett
214 ec(i) = exp(etc) - one
215 et(i) = exp(ett) - one
216 lc(i) = lc0 * (one + ec(i))
217 lt(i) = lt0 * (one + et(i))
218 ENDDO
219
220 DO i = 1,nel
221 beta(i) = one
222 ph01(i) = ep10
223 ph02(i) = ep10
224 ENDDO
225
226#include "vectorize.inc"
227 DO i = 1,nel
228 ipos(i) = 1
229 iad1(i) = npf(ifuncc) / 2 + 1
230 iad2(i) = npf(ifunct) / 2 + 1
231 iad3(i) = npf(ifuncs) / 2 + 1
232 ilen1(i) = npf(ifuncc+1) / 2 - iad1(i) - ipos(i)
233 ilen2(i) = npf(ifunct+1) / 2 - iad2(i) - ipos(i)
234 ilen3(i) = npf(ifuncs+1) / 2 - iad3(i) - ipos(i)
235 END DO
236 IF (ifunf1 > 0) THEN
237 DO i = 1,nel
238 iadf1(i) = npf(ifunf1) / 2 + 1
239 ilenf1(i) = npf(ifunf1+1) / 2 - iadf1(i) - ipos(i)
240 END DO
241 END IF
242 IF (ifunf2 > 0) THEN
243 DO i = 1,nel
244 iadf2(i) = npf(ifunf2) / 2 + 1
245 ilenf2(i) = npf(ifunf2+1) / 2 - iadf2(i) - ipos(i)
246 END DO
247 END IF
248
249
250
251 epsfc(1:nel) = uvar(1:nel,7)
252 epsft(1:nel) = uvar(1:nel,8)
253
254 DO iter = 1,niter
255
256 epsf(1:nel) =(hc0 * epsfc(1:nel) + ht0 * epsft(1:nel)) / h0
257 flexf(1:nel) = kflex * epsf(1:nel)
258 DO i = 1,nel
259 xc(i) = epsfc(i)
260 xt(i) = epsft(i)
261 hc(i) = hc0 * (epsfc(i) + one)
262 ht(i) = ht0 * (epsft(i) + one)
263 dc(i) = sqrt(lc(i)**2 + hc(i)**2)
264 dt(i) = sqrt(lt(i)**2 + ht(i)**2)
265 dcc(i) = dc(i) - dc0
266 dtt(i) = dt(i) - dt0
267 END DO
268 ipos1(1:nel) = 1
269 ipos2(1:nel) = 1
270
271 CALL vinter2(tf,iad1,ipos1,ilen1,nel,dcc,fpc,fc)
272 CALL vinter2(tf,iad2,ipos2,ilen2,nel,dtt,fpt,ft)
273
274
275 IF (ifunf1 > 0) THEN
276 ipos(1:nel) = 1
277 CALL vinter2(tf,iadf1,ipos,ilenf1,nel,epsfc,dflxc,flexc)
278 flexc(1:nel) = flexc(1:nel) * kflex1
279 dflxc(1:nel) = dflxc(1:nel) * kflex1
280 ELSE
281 DO i = 1,nel
282 flexc(i) = kflex1 * log(epsfc(i) + one)
283 dflxc(i) = kflex1 / (epsfc(i) + one)
284 END DO
285 END IF
286
287 IF (ifunf2 > 0) THEN
288 ipos(1:nel) = 1
289 CALL vinter2(tf,iadf2,ipos,ilenf2,nel,epsft,dflxt
290 flext(1:nel) = flext(1:nel) * kflex2
291 dflxt(1:nel
292 ELSE
293 DO i = 1,nel
294 flext(i) = kflex2 * log(epsft(i) + one)
295 dflxt(i) = kflex2 / (epsft(i) + one)
296 END DO
297 END IF
298
299#include "vectorize.inc"
300 DO i = 1,nel
301 dyc = epsfc(i) - uvar(i,7)
302 dyt = epsft(i) - uvar(i,8)
303 hdc = hc(i) / dc(i)
304 hdt = ht(i) / dt(i)
305 phi1 = fc(i) * hdc + flexc(i) + flexf(i) + cvisc(i)*dyc
306 phi2 = ft(i) * hdt + flext(i) + flexf(i) + cvist(i)*dyt
307 j12 = kflex * ht0 / h0
308 j21 = kflex * hc0 / h0
309 j11 = j12 + fpc(i)*hdc*hc0 + dflxc(i) + cvisc(i)
310 j22 = j21 + fpt(i)*hdt*ht0 + dflxt(i) + cvist(i)
311 det = j11 * j22 - j12 * j21
312
313 epsfc(i) = epsfc(i) - beta(i) * (j22 * phi1 - j12 * phi2) / det
314 epsft(i) = epsft(i) + beta(i) * (j12 * phi1 - j11 * phi2) / det
315
316 epsfc(i) =
max(epsfc(i), em04 - one)
317 epsft(i) =
max(epsft(i), em04 - one)
318
319 IF (abs(phi1) > ph01(i) .and. abs(phi2) > ph02(i)) THEN
320 epsfc(i) = xc(i)
321 epsft(i) = xt(i)
322 beta(i) = beta(i) * half
323 beta(i) =
max(beta(i), em02)
324 END IF
325 ph01(i) = abs(phi1)
326 ph02(i) = abs(phi2)
327 END DO
328
329 END DO
330
331#include "vectorize.inc"
332 DO i = 1,nel
333 sigc(i) = fc(i) * lc(i) / dc(i)
334 sigt(i) = ft(i) * lt(i) / dt(i)
335 uvar(i,7) = epsfc(i)
336 uvar(i,8) = epsft(i)
337 uvar(i,1) = sigc(i)
338 uvar(i,2) = sigt(i)
339 uvar(i,15) = dc(i)
340 uvar(i,16) = dt(i)
341 fn(i) = flexf(i)
342 ENDDO
343
344
345
346
347
348
349
350
351#include "vectorize.inc"
352 DO i = 1,nel
353 trace = exp(epsxx(i) + epsyy(i))
354 ec2 =
max(trace / (ec(i) + one), em6)
355 et2 =
max(trace / (et(i) + one), em6)
356
357 signxx(i) = sigc(i) / ec2
358 signyy(i) = sigt(i) / et2
359 ENDDO
360
361
362
363#include "vectorize.inc"
364 DO i = 1,nel
365 tan_phi(i)= depsxy(i)
366 angle(i) = atan(tan_phi(i))*hundred80/pi
367 ipos(i) = 1
368 ENDDO
369
370 CALL vinter2(tf,iad3,ipos,ilen3,nel,angle,gxy,signxy)
371
372#include "vectorize.inc"
373 DO i = 1,nel
374 tan2 = tan_phi(i)**2
375 kg(i) = gxy(i) * tan2 * yfac(3)
376
377 damp = sqrt(rho0(i)*
area(i)*thkly(i)*half)
378 v1 = visce*damp*sqrt(kmax)
379 v2 = visce*damp*sqrt(kmax)
380 sigvxx(i) = dtinv*(depsxx(i))*v1
381 sigvyy(i) = dtinv*(depsyy(i))*v2
382
383 IF (fn(i) > zero) THEN
384 tfrot = two_third*viscg*fn(i)*(hc0+ht0)/(lc(i)+lt(i))
385 dtang(i) = depsxy(i) - tan_phi(i)
386 sigg = tfold(i) + gfrot*dtang(i)
387 IF (abs(sigg) > tfrot) THEN
388 sigvxy(i) = sign(tfrot,sigg)
389 ELSE
390 sigvxy(i) = sigg
391 ENDIF
392 ENDIF
393
394 sinn = tan_phi(i) / sqrt(one + tan2)
395 stiff = kmax*(one+sinn) + gmax
396 lmin =
min(dc(i)/dc0,dt(i)/dt0)*uvar(i,14)
397 soundsp(i) = sqrt(stiff/(rho0(i)))*aldt(i)/lmin
398 viscmax(i) =
max(v1,v2)
399 etse(i) = one
400 ENDDO
401
402#include "vectorize.inc"
403 DO i = 1,nel
404 uvar(i,3) = signxy(i) + sigvxy(i)
405 tan_phi(i)= depsxy(i)
406 uvar(i,6) = depsxy(i)
407 uvar(i,9) = sigvxy(i)
408
409 signyz(i) = sigoyz(i) + gsh * depsyz(i)
410 signzx(i) = sigozx(i) + gsh * depszx(i)
411 ENDDO
412
413
414
415 IF (zerostress > zero)THEN
416 IF (time <= tstart) THEN
417#include "vectorize.inc"
418 DO i = 1,nel
419 uvar(i,11) = signxx(i)
420 uvar(i,12) = signyy(i)
421 uvar(i,13) = signxy(i)
422 signxx(i) = zero
423 signyy(i) = zero
424 signxy(i) = zero
425 ENDDO
426 ELSE
427#include "vectorize.inc"
428 DO i = 1,nel
429 dsig = signxx(i) - sigoxx(i) - uvar(i,11)
430 IF((uvar(i,11) > zero).AND.(dsig < zero))THEN
431 uvar(i,11) =
max(zero,uvar(i,11)+zerostress*dsig)
432 ELSEIF((uvar(i,11) < zero).AND.(dsig > zero))THEN
433 uvar(i,11) =
min(zero,uvar(i,11)+zerostress*dsig)
434 ENDIF
435 dsig = signyy(i) - sigoyy(i) - uvar(i,12)
436 IF((uvar(i,12) > zero).AND.(dsig < zero))THEN
437 uvar(i,12) =
max(zero,uvar(i,12)+zerostress*dsig)
438 ELSEIF((uvar(i,12) < zero).AND.(dsig > zero))THEN
439 uvar(i,12) =
min(zero,uvar(i,12)+zerostress*dsig)
440 ENDIF
441 dsig = signxy(i) - sigoxy(i) - uvar(i,13)
442 IF((uvar(i,13) > zero).AND.(dsig < zero))THEN
443 uvar(i,13) =
max(zero,uvar(i,13)+zerostress*dsig)
444 ELSEIF((uvar(i,13) < zero).AND.(dsig > zero))THEN
445 uvar(i,13) =
min(zero,uvar(i,13)+zerostress*dsig)
446 ENDIF
447 signxx(i) = signxx(i) - uvar(i,11)
448 signyy(i) = signyy(i) - uvar(i,12)
449 signxy(i) = signxy(i) - uvar(i,13)
450 ENDDO
451 ENDIF
452 ENDIF
453
454 DO i = 1,nel
455 soundsp(i) = sqrt(kmax*two/(rho0(i)))
456 ENDDO
457
458 RETURN
subroutine damping(nodft, nodlt, v, vr, a, ar, damp, ms, in, igrnod, dim, itask, weight, tagslv_rby, wfext)
subroutine area(d1, x, x2, y, y2, eint, stif0)
subroutine vinter2(tf, iad, ipos, ilen, nel0, x, dydx, y)