38
39
40
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#include "implicit_f.inc"
69
70
71
72#include "comlock.inc"
73
74
75
76#include "param_c.inc"
77#include "units_c.inc"
78
79
80
81 INTEGER ,INTENT(IN) :: IMAT
82 INTEGER NEL,NUPARAM,IPT,NVARTMP
83 INTEGER NGL(NEL),NPF(*),IPM(NPROPMI,*),KFUNC(*)
85 . time,timestep,uparam(*),pla(nel),epsp(nel),
86 . depsxx(nel),depsxy(nel),depsxz(nel),
87 . sigoxx(nel),sigoxy(nel),sigoxz(nel),
88 . e(*),g(*),tf(*)
89
90
91
93 . signxx(nel),signxy(nel),signxz(nel),etse(nel),
94 . off(nel)
95 INTEGER, INTENT(INOUT) :: VARTMP(NEL,NVARTMP)
96 my_real,
INTENT(INOUT) :: sigy(nel)
97
98
99
101 . finter
102 EXTERNAL finter
103
104
105
106 INTEGER I,J,J1,J2,N,NINDX,IADBUF,NFUNC,IPLAS,IFAIL,MFUNCE,ISMOOTH
107 INTEGER NRATE(NEL),IAD1(NEL),IPOS1(NEL),ILEN1(NEL),
108 . IAD2(NEL),IPOS2(NEL),ILEN2(NEL),JJ(NEL),
109 . IFUNC(NEL,100),OPTE(NEL)
110 my_real :: g3(nel),dydx1(nel),dydx2(nel),rate(nel,2),
111 . y1(nel),y2(nel),dr(nel),yfac(nel,2),
112 . pp(nel),qq(nel),fail(nel),svm(nel),h(nel),
113 . epsmax(nel),epsr1(nel),epsr2(nel),
114 . sigexx(nel),sigeyy(nel),sigexy(nel),
115 . hk(nel),nu(nel),nu1(nel),epsf(nel),yld(nel),
116 . aa(nel),bb(nel),cc(nel),einf(nel),ce(nel),
117 . escale(nel),dydxe(nel)
118 my_real :: r,umr,fac,gs,svm1,shfact,epsp1,epsp2,rfac
119
120 iplas = 1
121 shfact = five_over_6
122 DO i=1,nel
123 nfunc = ipm(10,imat)
124 DO j=1,nfunc
125 ifunc(i,j)=ipm(10+j,imat)
126 ENDDO
127 fail(i) = one
128 ENDDO
129
130 iadbuf = ipm(7,imat)-1
131 ifail = 0
132 DO i=1,nel
133 e(i) = uparam(iadbuf+2)
134 g(i) = uparam(iadbuf+5)
135 g3(i) = three*g(i)
136 nu(i) = uparam(iadbuf+6)
137 nrate(i) = nint(uparam(iadbuf+1))
138 epsmax(i)= uparam(iadbuf+6+2*nrate(i)+1)
139
140 opte(i) = uparam(iadbuf+2*nrate(i) + 23)
141 einf(i) = uparam(iadbuf+2*nrate(i) + 24)
142 ce(i) = uparam(iadbuf+2*nrate(i) + 25)
143 ifail = nint(uparam(iadbuf+2*nrate(i) + 27))
144 ismooth = nint(uparam(iadbuf+2*nrate(i) + 29))
145
146 IF (opte(i) == 1)THEN
147 IF(pla(i) > zero)THEN
148 mfunce= uparam(iadbuf+2*nrate(i)+ 22)
149 escale(i) = finter(ifunc(i,mfunce),pla(i),npf,tf,dydxe(i))
150 e(i) = escale(i)* e(i)
151 g(i) = half*e(i)/(one+nu(i))
152 g3(i) = three*g(i)
153 ENDIF
154 ELSEIF (ce(i) /= zero) THEN
155 IF(pla(i) > zero)THEN
156 e(i) = e(i)-(e(i)-einf(i))*(one-exp(-ce(i)*pla(i)))
157 g(i) = half*e(i)/(one+nu(i))
158 g3(i) = three*g(i)
159 ENDIF
160 ENDIF
161 ENDDO
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176 DO i=1,nel
177 gs = shfact*g(i)
178 signxx(i) = sigoxx(i) + e(i)*depsxx(i)
179 signxy(i) = sigoxy(i) + gs*depsxy(i)
180 signxz(i) = sigoxz(i) + gs*depsxz(i)
181 etse(i) = one
182 ENDDO
183
184
185
186 jj(1:nel) = 1
187 DO i=1,nel
188 iadbuf = ipm(7,imat)-1
189 DO j=2,nrate(i)-1
190 IF (epsp(i) > uparam(iadbuf+6+j)) jj(i) = j
191 ENDDO
192 ENDDO
193 DO i=1,nel
194 iadbuf = ipm(7,imat)-1
195 rate(i,1) = uparam(iadbuf+6+jj(i))
196 yfac(i,1) = uparam(iadbuf+6+nrate(i)+jj(i))
197 IF (nrate(i) > 1) THEN
198 rate(i,2) = uparam(iadbuf+6+jj(i)+1)
199 yfac(i,2) = uparam(iadbuf+6+nrate(i)+jj(i)+1)
200 ENDIF
201 ENDDO
202
203 DO i=1,nel
204 j1 = jj(i)
205 j2 = j1+1
206 ipos2(i) = 1
207 iad2(i) = 1
208 ilen2(i) = 1
209 ipos1(i) = vartmp(i,j1)
210 iad1(i) = npf(ifunc(i,j1)) / 2 + 1
211 ilen1(i) = npf(ifunc(i,j1)+1) / 2 - iad1(i) - ipos1(i)
212 IF (nrate(i) > 1) THEN
213 ipos2(i) = vartmp(i,j2)
214 iad2(i) = npf(ifunc(i,j2)) / 2 + 1
215 ilen2(i) = npf(ifunc(i,j2)+1) / 2 - iad2(i) - ipos2(i)
216 ENDIF
217 ENDDO
218
219 CALL vinter(tf,iad1,ipos1,ilen1,nel,pla,dydx1,y1)
220 CALL vinter(tf,iad2,ipos2,ilen2,nel,pla,dydx2,y2)
221
222 DO i=1,nel
223 IF (nrate(i) == 1) THEN
224 j1 = jj(i)
225 yld(i) = fail(i)*y1(i) * yfac(i,1)
226 yld(i) =
max(yld(i),em20)
227 h(i) = fail(i)*dydx1(i)*yfac(i,1)
228 vartmp(i,j1) = ipos1(i)
229 ELSE
230 j1 = jj(i)
231 j2 = j1+1
232 y1(i) = y1(i)*yfac(i,1)
233 y2(i) = y2(i)*yfac(i,2)
234 IF (ismooth == 2) THEN
235 epsp1 =
max(rate(i,1), em20)
236 epsp2 = rate(i,2)
237 fac = log(
max(epsp(i),em20)/epsp1) / log(epsp2/epsp1)
238 ELSE
239 epsp1 = rate(i,1)
240 epsp2 = rate(i,2)
241 fac = (epsp(i) - epsp1) / (epsp2 - epsp1)
242 END IF
243 yld(i) = fail(i)*(y1(i) + fac*(y2(i)-y1(i)))
244 yld(i) =
max(yld(i),em20)
245 dydx1(i)= dydx1(i)*yfac(i,1)
246 dydx2(i)= dydx2(i)*yfac(i,2)
247 h(i) = fail(i)*(dydx1(i) + fac*(dydx2(i)-dydx1(i)))
248 vartmp(i,j1) = ipos1(i)
249 vartmp(i,j2) = ipos2(i)
250 END IF
251 sigy(i) = yld(i)
252 ENDDO
253
254
255
256
257
258 DO i=1,nel
259 svm1 = signxx(i)**2 + three*(signxy(i)**2 + signxz(i)**2)
260 svm1 = sqrt(svm1)
261 r =
min( one, yld(i)/
max(em20,svm1) )
262 signxx(i)=signxx(i)*r
263 signxy(i)=signxy(i)*r
264 signxz(i)=signxz(i)*r
265 umr = one - r
266 pla(i) = pla(i) + off(i)*svm1*umr/(g3(i)+h(i))
267 IF (r < one) etse(i)= h(i)/(h(i)+e(i))
268 ENDDO
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325 IF (ifail > 0) THEN
326 DO i=1,nel
327 IF (pla(i) > epsmax(i) .AND. off(i)==one) THEN
328 off(i) = four_over_5
329#include "lockon.inc"
330 WRITE(iout, 1000) ngl(i),pla(i),epsp(i)
331#include "lockoff.inc"
332 END IF
333 ENDDO
334 END IF
335
336 1000 FORMAT(5x,'FAILURE BEAM ELEMENT NUMBER ',i10,
337 . ' PLASTIC STRAIN =',1pe16.9,' strain rate =',1PE16.9)
338
339 RETURN
subroutine vinter(tf, iad, ipos, ilen, nel, x, dydx, y)