38
39
40
41
42
43#include "implicit_f.inc"
44
45
46
47#include "comlock.inc"
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 INTEGER, INTENT(IN) :: NEL,NUPARAM,NUVAR,NFUNC,IPG,ILAY,IPTT,NIPARAM,LF_DAMMX
76 INTEGER ,DIMENSION(NEL) :: NGL
77 INTEGER ,DIMENSION(NFUNC) :: IFUNC
79 my_real ,
DIMENSION(NEL),
INTENT(IN) :: timestep,off,
80 . epsxx,epsyy,epsxy,epsyz,epszx,pla
81 my_real,
DIMENSION(NUPARAM) :: uparam
82 INTEGER, DIMENSION(NIPARAM) :: IPARAM
83
84
85
86 INTEGER ,DIMENSION(NEL), INTENT(INOUT) :: FOFF,FLD_IDX
87 my_real ,
DIMENSION(NEL,LF_DAMMX),
INTENT(INOUT) :: dfmax
88 my_real ,
DIMENSION(NEL),
INTENT(OUT) :: dam
90
91
92
93 INTEGER NPF(*)
94 my_real finter , finterfld ,tf(*)
95 EXTERNAL finter
96
97
98
99
100
101
102
103
104
105
106 INTEGER :: I,II,J,IENG,LENF,NINDX,IMARGIN
107 INTEGER ,DIMENSION(NEL) :: INDX,INDXF
108 my_real :: rani,r1,r2,s1,s2,ss,q,dydx,e12,fact_margin,fact_loosemetal
109 my_real ,
ALLOCATABLE,
DIMENSION(:) :: xf
110 my_real ,
DIMENSION(NEL) :: emaj,emin,em,beta
111
112
113
114
115
116
117
118 fact_margin = uparam(1)
119 rani = uparam(3)
120 fact_loosemetal = uparam(4)
121
122 imargin = iparam(2)
123 ieng = iparam(3)
124
125
126 nindx = 0
127 DO i = 1,nel
128 IF (off(i) == one .and. foff(i) == 1) THEN
129 nindx = nindx + 1
130 indx(nindx) = i
131 ENDIF
132 ENDDO
133
134
135
136
137 DO j = 1,nindx
138 i = indx(j)
139 e12= half*epsxy(i)
140 s1 = half*(epsxx(i) + epsyy(i))
141 s2 = half*(epsxx(i) - epsyy(i))
142 q = sqrt(s2**2 + e12**2)
143 emaj(i) = s1 + q
144 emin(i) = s1 - q
145 IF (emin(i) >= emaj(i)) THEN
146 ss = emin(i)
147 emin(i) = emaj(i)
148 emaj(i) = ss
149 ENDIF
150 beta(i) = emin(i)/
max(emaj(i),em20)
151 IF (ieng == 2) THEN
152 dfmax(i,4) = beta(i)
153 ENDIF
154 ENDDO
155
156
157
158
159
160 IF (ieng == 1) THEN
161 ii = npf(ifunc(1))
162 lenf = npf(ifunc(1)+ 1) - npf(ifunc(1))
163 ALLOCATE(xf(lenf))
164 DO i = 1,lenf
165 xf(i) = log(tf(ii + i-1) + one)
166 ENDDO
167
168 DO j = 1,nindx
169 i = indx(j)
170 em(i) = finterfld(emin(i),lenf,xf)
171 dam(i) = emaj(i) / em(i)
172 dfmax(i,2) = dam(i)
173 dfmax(i,1) =
min(one, dam(i))
174 ENDDO
175 DEALLOCATE(xf)
176
177 ELSE
178
179 IF (ieng == 0) THEN
180 DO j = 1,nindx
181 i = indx(j)
182 em(i) = finter(ifunc(1),emin(i),npf,tf,dydx)
183 dam(i) = emaj(i) / em(i)
184 dfmax(i,2) = dam(i)
185 dfmax(i,1) =
min(one, dam(i))
186 ENDDO
187
188 ELSEIF (ieng == 2) THEN
189 DO j = 1,nindx
190 i = indx(j)
191 em(i) = finter(ifunc(1),beta(i),npf,tf,dydx)
192 dam(i) = pla(i) / em(i)
193 dfmax(i,2) = dam(i)
194 dfmax(i,1) =
min(one, dam(i))
195 ENDDO
196 ENDIF
197 ENDIF
198
199
200
201
202 r1 = fact_loosemetal
203 r2 = rani/(rani+one)
204
205 IF (ieng < 2) THEN
206 IF (imargin == 3) THEN
207 DO j = 1,nindx
208 i = indx(j)
209 IF (emaj(i) >= em(i)) THEN
210 fld_idx(i) = 6
211 ELSEIF (emaj(i) >= em(i)*(one - fact_margin)) THEN
212 fld_idx(i) = 5
213 ELSEIF (emaj(i)**2 + emin(i)**2 < r1**2) THEN
214 fld_idx(i) = 1
215 ELSEIF (emaj(i) >= abs(emin(i))) THEN
216 fld_idx(i) = 4
217 ELSEIF (emaj(i) >= r2*abs(emin(i))) THEN
218 fld_idx(i) = 3
219 ELSE
220 fld_idx(i) = 2
221 ENDIF
222 dfmax(i,3) = fld_idx(i)
223 ENDDO
224 ELSE
225 DO j = 1,nindx
226 i = indx(j)
227 IF (emaj(i) >= em(i)) THEN
228 fld_idx(i) = 6
229 ELSEIF (emaj(i) >= em(i) - fact_margin) THEN
230 fld_idx(i) = 5
231 ELSEIF (emaj(i)**2 + emin(i)**2 < r1**2) THEN
232 fld_idx(i) = 1
233 ELSEIF (emaj(i) >= abs(emin(i))) THEN
234 fld_idx(i) = 4
235 ELSEIF (emaj(i) >= r2*abs(emin(i))) THEN
236 fld_idx(i) = 3
237 ELSE
238 fld_idx(i) = 2
239 ENDIF
240 dfmax(i,3) = fld_idx(i)
241 ENDDO
242 ENDIF
243 ELSE
244 IF (imargin == 3) THEN
245 DO j = 1,nindx
246 i = indx(j)
247 IF (pla(i) >= em(i)) THEN
248 fld_idx(i) = 6
249 ELSEIF (pla(i) >= em(i)*(one - fact_margin)) THEN
250 fld_idx(i) = 5
251 ELSEIF (pla(i)**2 + beta(i)**2 < r1**2) THEN
252 fld_idx(i) = 1
253 ELSEIF (pla(i) >= abs(beta(i))) THEN
254 fld_idx(i) = 4
255 ELSEIF (pla(i) >= r2*abs(beta(i))) THEN
256 fld_idx(i) = 3
257 ELSE
258 fld_idx(i) = 2
259 ENDIF
260 dfmax(i,3) = fld_idx(i)
261 ENDDO
262 ELSE
263 DO j = 1,nindx
264 i = indx(j)
265 IF (pla(i) >= em(i)) THEN
266 fld_idx(i) = 6
267 ELSEIF (pla(i) >= em(i) - fact_margin) THEN
268 fld_idx(i) = 5
269 ELSEIF (pla(i)**2 + beta(i)**2 < r1**2) THEN
270 fld_idx(i) = 1
271 ELSEIF (pla(i) >= abs(beta(i))) THEN
272 fld_idx(i) = 4
273 ELSEIF (pla(i) >= r2*abs(beta(i))) THEN
274 fld_idx(i) = 3
275 ELSE
276 fld_idx(i) = 2
277 ENDIF
278 dfmax(i,3) = fld_idx(i)
279 ENDDO
280 ENDIF
281 ENDIF
282
283 RETURN