39
40
41
42
43
44#include "implicit_f.inc"
45
46
47
48#include "units_c.inc"
49#include "comlock.inc"
50#include "mvsiz_p.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 INTEGER NEL,NUVAR,IPT,NPTOT,NFUNC,IPG
79 INTEGER NGL(NEL),IFUNC(NFUNC)
80 my_real time,uparam(*),dpla(nel),epsp(nel),
81 . uel1(nel),aldt(nel)
82
83
84
85 INTEGER, DIMENSION(NEL), INTENT(INOUT) :: FOFF
87 . uvar(nel,nuvar),off(nel),offl(nel),
88 . signxx(nel),signyy(nel),signxy(nel),signyz(nel),signzx(nel),
89 . dfmax(nel),tdel(nel)
90
91
92
93 INTEGER NPF(*)
95 EXTERNAL finter
96
97
98
99
100
101
102
103
104
105
106 my_real hydros,vmises,triaxs,ref_el_len
107 INTEGER I,J,K,L,NINDX1,NINDX2,SEL,NANGLE
108 INTEGER FAIL_COUNT,IT,,IRATE
109 INTEGER, DIMENSION(MVSIZ) :: INDX1,INDX2
110 my_real x_1(3),x_2(3),c3,dydx,cos2(10,10),epsd0,cjc,rate_scale,frate
111 my_real eps_fail,eps_fail2,damage,inst,fscale_len,mohr_radius
112 my_real p1x,p1y,s1x,s1y,s2y,a1,a2,b1,b2,c1,c2,fac,lambda,cos2theta(nel)
113 my_real sig1(nel),sig2(nel),mohr_center
114 my_real,
DIMENSION(:),
ALLOCATABLE :: q_x11,q_x12,q_x13,q_x21,q_x22,q_x23,q_inst
115
116 DATA cos2/
117 1 1. ,0. ,0. ,0. ,0. ,0. ,0. ,0. ,0. ,0. ,
118 2 0. ,1. ,0. ,0. ,0. ,0. ,0. ,0. ,0. ,0. ,
119 3 -1. ,0. ,2. ,0. ,0. ,0. ,0. ,0. ,0. ,0. ,
120 4 0. ,-3. ,0. ,4. ,0. ,0. ,0. ,0. ,0. ,0. ,
121 5 1. ,0. ,-8. ,0. ,8. ,0. ,0. ,0. ,0. ,0. ,
122 6 0. ,5. ,0. ,-20. ,0. ,16. ,0. ,0. ,0. ,0. ,
123 7 -1. ,0. ,18. ,0. ,-48. ,0. ,32. ,0. ,0. ,0. ,
124 8 0. ,-7. ,0. ,56. ,0. ,-112.,0. ,64. ,0. ,0. ,
125 9 1. ,0. ,-32. ,0. ,160. ,0. ,-256.,0. ,128. ,0. ,
126 a 0. ,9. ,0. ,-120.,0. ,432. ,0. ,-576 ,0. ,256. /
127
128
129
130
131
132
133
134
135
136
137 sel = int(uparam(2))
138 ref_el_len = uparam(3)
139 epsd0 = uparam(4)
140 cjc = uparam(5)
141 rate_scale = uparam(6)
142 nangle = int(uparam(7))
143 frate = -huge(frate)
144
145 ALLOCATE(q_x11(nangle),q_x12(nangle),q_x13(nangle),
146 . q_x21(nangle),q_x22(nangle),q_x23(nangle))
147
148 IF (sel == 3) THEN
149 ALLOCATE(q_inst(nangle))
150 DO j = 1,nangle
151 q_x11(j) = uparam(8 + 7*(j-1))
152 q_x12(j) = uparam(9 + 7*(j-1))
153 q_x13(j) = uparam(10 + 7*(j-1))
154 q_x21(j) = uparam(11 + 7*(j-1))
155 q_x22(j) = uparam(12 + 7*(j-1))
156 q_x23(j) = uparam(13 + 7*(j-1))
157 q_inst(j) = uparam(14 + 7*(j-1))
158 ENDDO
159 ELSE
160 DO j = 1,nangle
161 q_x11(j) = uparam(8 + 6*(j-1))
162 q_x12(j) = uparam(9 + 6*(j-1))
163 q_x13(j) = uparam(10 + 6*(j-1))
164 q_x21(j) = uparam(11 + 6*(j-1))
165 q_x22(j) = uparam(12 + 6*(j-1))
166 q_x23(j) = uparam(13 + 6*(j-1))
167 ENDDO
168 ENDIF
169
170
171 irate = 0
172 IF (rate_scale /= zero) THEN
173 irate = 1
174 ENDIF
175 ireg = 0
176 IF (ref_el_len /= zero) THEN
177 ireg = irate + 1
178 ENDIF
179
180
181 IF (uvar(1,3) == zero .AND. ireg > 0) THEN
182 DO i=1,nel
183 lambda = aldt(i)/ref_el_len
184 fac = finter(ifunc(ireg),lambda,npf,tf,dydx)
185 uvar(i,3) = fac
186 ENDDO
187 ENDIF
188
189
190 nindx1 = 0
191 nindx2 = 0
192
193
194
195
196 DO i = 1,nel
197
198
199 eps_fail = zero
200 eps_fail2 = zero
201
202
203 IF (off(i) == one .AND. dpla(i) /= zero .AND. foff(i) == 1) THEN
204
205
206 mohr_radius = sqrt(((signxx(i)-signyy(i))/two)**2 + signxy(i)**2)
207 mohr_center = (signxx(i)+signyy(i))/two
208 IF (mohr_radius > em20) THEN
209 cos2theta(i) = ((signxx(i)-signyy(i))/two)/mohr_radius
210 ELSE
211 cos2theta(i) = one
212 ENDIF
213 sig1(i) = mohr_center + mohr_radius
214 sig2(i) = mohr_center - mohr_radius
215 IF (sig1(i)<zero.OR.((sig2(i)<zero).AND.(sig2(i)<-sig1(i)))) THEN
216 cos2theta(i) = -cos2theta(i)
217 ENDIF
218
219
220 x_1(1:3) = zero
221 x_2(1:3) = zero
222 inst = zero
223 DO j = 1,nangle
224 DO k = 1,j
225 x_1(1) = x_1(1) + q_x11(j)*cos2(k,j)*(cos2theta(i))**(k-1)
226 x_1(2) = x_1(2) + q_x12(j)*cos2(k,j)*(cos2theta(i))**(k-1)
227 x_1(3) = x_1(3) + q_x13(j)*cos2(k,j)*(cos2theta(i))**(k-1)
228 x_2(1) = x_2(1) + q_x21(j)*cos2(k,j)*(cos2theta(i))**(k-1)
229 x_2(2) = x_2(2) + q_x22(j)*cos2(k,j)*(cos2theta(i))**(k-1)
230 x_2(3) = x_2(3) + q_x23(j)*cos2(k,j)*(cos2theta(i))**(k-1)
231 IF (sel == 3) inst = inst + q_inst(j)*cos2(k,j)*(cos2theta(i))**(k-1)
232 ENDDO
233 ENDDO
234
235
236 hydros = (signxx(i)+ signyy(i))/three
237 vmises = sqrt((signxx(i)**2)+(signyy(i)**2)-(signxx(i)*signyy(i))+(three*signxy(i)**2))
238 triaxs = hydros /
max(em20,vmises)
239
240
241 IF (triaxs <= third) THEN
242 eps_fail = x_1(1) + x_1(2)*triaxs + x_1(3)*triaxs**2
243 IF (ireg > 0) eps_fail = eps_fail*uvar(i,3)
244 ELSE
245 SELECT CASE (sel)
246 CASE(1)
247 eps_fail = x_2(1) + x_2(2)*triaxs + x_2(3)*triaxs**2
248 IF (ireg > 0) eps_fail = eps_fail*uvar(i,3)
249 CASE(2)
250 IF (triaxs <= one/sqr3) THEN
251 p1x = third
252 p1y = x_1(1) + x_1(2)*p1x + x_1(3)*p1x**2
253 s1x = one/sqr3
254 s1y = x_2(1) + x_2(2)/sqr3 + x_2(3)*(one/sqr3)**2
255 a1 = (p1y - s1y)/(p1x - s1x)**2
256 b1 = -two*a1*s1x
257 c1 = a1*s1x**2 + s1y
258 eps_fail = c1 + b1*triaxs + a1*triaxs**2
259 IF (ireg > 0) eps_fail = eps_fail*uvar(i,3)
260 ELSE
261 p1x = two*third
262 p1y = x_2(1) + x_2(2)*p1x + x_2(3)*p1x**2
263 s1x = one/sqr3
264 s1y = x_2(1) + x_2(2)/sqr3 + x_2(3)*(one/sqr3)**2
265 a1 = (p1y - s1y)/(p1x - s1x)**2
266 b1 = -two*a1*s1x
267 c1 = a1*s1x**2 + s1y
268 eps_fail = c1 + b1*triaxs + a1*triaxs**2
269 IF (ireg > 0) eps_fail = eps_fail*uvar(i,3)
270 ENDIF
271 CASE(3)
272 IF (triaxs <= one/sqr3) THEN
273 p1x = third
274 p1y = x_1(1) + x_1(2)*p1x + x_1(3)*p1x**2
275 s1x = one/sqr3
276 s1y = x_2(1) + x_2(2)/sqr3 + x_2(3)*(one/sqr3)**2
277 s2y = inst
278 a1 = (p1y - s1y)/(p1x - s1x)**2
279 a2 = (p1y - s2y)/(p1x - s1x)**2
280 b1 = -two*a1*s1x
281 b2 = -two*a2*s1x
282 c1 = a1*s1x**2 + s1y
283 c2 = a2*s1x**2 + s2y
284 eps_fail = c1 + b1*triaxs + a1*triaxs**2
285 IF (ireg > 0) eps_fail = eps_fail*uvar(i,3)
286 eps_fail2 = c2 + b2*triaxs + a2*triaxs**2
287 IF (ireg > 0) eps_fail2 = eps_fail2*uvar(i,3)
288 ELSE
289 p1x = two*third
290 p1y = x_2(1) + x_2(2)*p1x + x_2(3)*p1x**2
291 s1x = one/sqr3
292 s1y = x_2(1) + x_2(2)/sqr3 + x_2(3)*(one/sqr3)**2
293 s2y = inst
294 a1 = (p1y - s1y)/(p1x - s1x)**2
295 a2 = (p1y - s2y)/(p1x - s1x)**2
296 b1 = -two*a1*s1x
297 b2 = -two*a2*s1x
298 c1 = a1*s1x**2 + s1y
299 c2 = a2*s1x**2 + s2y
300 eps_fail = c1 + b1*triaxs + a1*triaxs**2
301 IF (ireg > 0) eps_fail = eps_fail*uvar(i,3)
302 eps_fail2 = c2 + b2*triaxs + a2*triaxs**2
303 IF (ireg > 0) eps_fail2 = eps_fail2*uvar(i,3)
304 ENDIF
305 END SELECT
306 ENDIF
307
308
309 IF (cjc /= zero .OR. irate /= 0) THEN
310 IF (cjc /= zero) THEN
311 frate = one
312 IF (epsp(i) > epsd0) frate = frate + cjc*log(epsp(i)/epsd0)
313 ELSEIF (irate /= 0) THEN
314 frate = finter(ifunc(irate),epsp(i)/rate_scale,npf,tf,dydx)
315 ENDIF
316 eps_fail = eps_fail*frate
317 IF (sel == 3) eps_fail2 = eps_fail2*frate
318 ENDIF
319
320
321 dfmax(i) = dfmax(i) + dpla(i)/
max(eps_fail,em6)
322 dfmax(i) =
min(one,dfmax(i))
323 IF (sel == 3) THEN
324 damage = uvar(i,1)
325 IF (eps_fail2 > zero) THEN
326 damage = damage + dpla(i)/
max(eps_fail2,em6)
327 uvar(i,1) = damage
328 ENDIF
329 ELSE
330 damage = zero
331 ENDIF
332
333
334 IF (offl(i) == one .AND. dfmax(i) >= one) THEN
335 foff(i) = 0
336 nindx1 = nindx1 + 1
337 indx1(nindx1) = i
338 ENDIF
339
340
341 IF (damage > one .AND. uvar(i,2) == zero .AND. offl(i) == one) THEN
342 uvar(i,2) = one
343 uel1(i) = uel1(i) + one
344 IF (int(uel1(i)) == nptot) THEN
345 nindx2 = nindx2 + 1
346 indx2(nindx2) = i
347 tdel(i) = time
348 off(i) = zero
349 signxx(i) = zero
350 signyy(i) = zero
351 signxy(i) = zero
352 signyz(i) = zero
353 signzx(i) = zero
354 ENDIF
355 ENDIF
356 ENDIF
357 ENDDO
358
359
360
361 IF (ALLOCATED(q_x11)) DEALLOCATE(q_x11)
362 IF (ALLOCATED(q_x12)) DEALLOCATE(q_x12)
363 IF (ALLOCATED(q_x13)) DEALLOCATE(q_x13)
364 IF (ALLOCATED(q_x21)) DEALLOCATE(q_x21)
365 IF (ALLOCATED(q_x22)) DEALLOCATE(q_x22)
366 IF (ALLOCATED(q_x23)) DEALLOCATE(q_x23)
367 IF (ALLOCATED(q_inst)) DEALLOCATE(q_inst)
368
369
370 IF (nindx1 > 0) THEN
371 DO j=1,nindx1
372 i = indx1(j)
373#include "lockon.inc"
374 WRITE(iout, 2000) ngl(i),ipg,ipt,time
375 WRITE(istdo,2000) ngl(i),ipg,ipt,time
376#include "lockoff.inc"
377 END DO
378 END IF
379 IF (nindx2 > 0) THEN
380 DO j=1,nindx2
381 i = indx2(j)
382#include "lockon.inc"
383 WRITE(iout, 3000) ngl(i)
384 WRITE(iout, 2200) ngl(i), time
385 WRITE(istdo,3000) ngl(i)
386 WRITE(istdo,2200) ngl(i), time
387#include "lockoff.inc"
388 END DO
389 END IF
390
391 2000 FORMAT(1x,'FOR SHELL ELEMENT (ORTHBIQUAD)',i10,1x,'GAUSS POINT',i3,
392 . 1x,'LAYER',i3,':',/,
393 . 1X,'stress tensor set to zero',1X,'at time :',1PE12.4)
394 2200 FORMAT(1X,' *** rupture of shell element(orthbiquad)',I10,1X,
395 . ' at time :',1PE12.4)
396 3000 FORMAT(1X,'for shell element(orthbiquad)
',I10,
397 . 1X,'instability reached.')
398
399 RETURN
for(i8=*sizetab-1;i8 >=0;i8--)