35
36
37
38#include "implicit_f.inc"
39
40#include "units_c.inc"
41#include "comlock.inc"
42
43
44
45 INTEGER, INTENT(IN) :: NEL,NUPARAM,NUVAR,
46 . ILAY,IP,NPG,NGL(NEL),LF_DAMMX
48 . time,timestep,uparam(nuparam)
50 . epsxx(nel),epsyy(nel),epszz(nel),
51 . epsxy(nel),epsyz(nel),epszx(nel)
52
53
54
55 INTEGER, INTENT(INOUT) :: NOFF(NEL)
57 . uvar(nel,nuvar),off(nel),
58 . tdele(nel),dmg_scale(nel),loff(nel)
59 my_real ,
DIMENSION(NEL,LF_DAMMX),
INTENT(INOUT) :: dfmax
60
61
62
63 INTEGER
64 . I,J,INDX(NEL),NINDX,INDX0(NEL),NINDX0,
65 . IFAIL_SO
67 . eps1_max,eps2_max,gam12_max,tmax,fcut
69 . asrate,exx(nel),eyy(nel),ezz(nel),
70 . exy(nel),eyz(nel),ezx(nel),findex,rfactr
71
72
73
74
75
76 eps1_max = uparam(1)
77 eps2_max = uparam(2)
78 gam12_max = uparam(3)
79 tmax = uparam(4)
80 fcut = uparam(5)
81 ifail_so = int(uparam(7))
82
83
84 IF (fcut > zero) THEN
85 DO i = 1,nel
86 asrate = two*pi*fcut*timestep
87 asrate = asrate/(one+asrate)
88 exx(i) = asrate*epsxx(i) + (one - asrate)*uvar(i,2)
89 eyy(i) = asrate*epsyy(i) + (one - asrate)*uvar(i,3)
90 ezz(i) = asrate*epszz(i) + (one - asrate)*uvar(i,4)
91 exy(i) = asrate*epsxy(i) + (one - asrate)*uvar(i,5)
92 eyz(i) = asrate*epsyz(i) + (one - asrate)*uvar(i,6)
93 ezx(i) = asrate*epszx(i) + (one - asrate)*uvar(i,7)
94 uvar(i,2) = exx(i)
95 uvar(i,3) = eyy(i)
96 uvar(i,4) = ezz(i)
97 uvar(i,5) = exy(i)
98 uvar(i,6) = eyz(i)
99 uvar(i,7) = ezx(i)
100 ENDDO
101 ELSE
102 DO i = 1,nel
103 exx(i) = epsxx(i)
104 eyy(i) = epsyy(i)
105 ezz(i) = epszz(i)
106 exy(i) = epsxy(i)
107 eyz(i) = epsyz(i)
108 ezx(i) = epszx(i)
109 ENDDO
110 ENDIF
111
112
113
114
115
116 nindx = 0
117 nindx0 = 0
118 indx = 0
119 indx0 = 0
120
121
122 DO i=1,nel
123
124
125 IF (dfmax(i,1)<one) THEN
126
127
128 findex =
max(abs(exx(i))/eps1_max,
129 . abs(eyy(i))/eps2_max,
130 . abs(exy(i))/gam12_max,
131 . abs(ezz(i))/eps2_max,
132 . abs(ezx(i))/gam12_max)
133 findex =
max(zero,findex)
134
135
136 dfmax(i,2) = one/
max(sqrt(findex),em20)
137
138 IF (findex > zero) THEN
139 rfactr = one/sqrt(findex)
140 ELSE
141 rfactr = zero
142 ENDIF
143
144
145 dfmax(i,1) =
min(one ,
max(findex,dfmax(i,1)))
146 IF (dfmax(i,1) >= one) THEN
147 nindx = nindx+1
148 indx(nindx) = i
149 IF (ifail_so > 0) THEN
150 uvar(i,1) = time
151 ENDIF
152 ENDIF
153 ENDIF
154
155
156 IF ((uvar(i,1) > zero).AND.(loff(i) /= zero).AND.
157 . (ifail_so > 0).AND.(off(i) /= zero)) THEN
158 dmg_scale(i) = exp(-(time - uvar(i,1))/tmax)
159 IF (dmg_scale(i) < em02) THEN
160 loff(i) = zero
161 tdele(i) = time
162 dmg_scale(i) = zero
163 IF (ifail_so == 1) THEN
164 off(i) = zero
165 nindx0 = nindx0 + 1
166 indx0(nindx0) = i
167 ELSEIF (ifail_so == 2) THEN
168 noff(i) = noff(i) + 1
169 IF (int(noff(i)) >= npg) THEN
170 off(i) = zero
171 nindx0 = nindx0 + 1
172 indx0(nindx0) = i
173 ENDIF
174 ENDIF
175 ENDIF
176 ENDIF
177 ENDDO
178
179
180
181
182 IF(nindx > 0)THEN
183 DO j=1,nindx
184 i = indx(j)
185#include "lockon.inc"
186 WRITE(iout, 1000) ngl(i),ip,ilay
187 WRITE(istdo,1100) ngl(i),ip,ilay,time
188#include "lockoff.inc"
189 END DO
190 ENDIF
191
192 IF(nindx0 > 0)THEN
193 DO j=1,nindx0
194 i = indx0(j)
195#include "lockon.inc"
196 WRITE(iout, 1200) ngl(i),time
197 WRITE(istdo,1200) ngl(i),time
198#include "lockoff.inc"
199 END DO
200 ENDIF
201
202 1000 FORMAT(1x,'FAILURE (MAXSTRAIN) OF SOLID ELEMENT ',i10,1x,
203 .',GAUSS PT',i5,1x,',LAYER',i5)
204 1100 FORMAT(1x,'FAILURE (MAXSTRAIN) OF SOLID ELEMENT ',i10,1x,
205 .',GAUSS PT',i5,1x,',LAYER',i5,1x,'AT TIME :',1pe20.13)
206 1200 FORMAT(1x,'-- RUPTURE OF SOLID ELEMENT : ',i10,1x,
207 .'AT TIME :',1pe20.13)
208
209 RETURN