41
42
43
44 USE mat_elem_mod
48 USE elbufdef_mod
49
50
51
52#include "implicit_f.inc"
53
54
55
56#include "param_c.inc"
57#include "com08_c.inc"
58#include "units_c.inc"
59#include "comlock.inc"
60
61
62
63 TYPE(ELBUF_STRUCT_), INTENT(INOUT), TARGET :: ELBUF_STR
64 my_real,
DIMENSION(NPROPG,NUMGEO),
INTENT(IN) :: geo
65 INTEGER, DIMENSION(NPROPGI,NUMGEO),INTENT(IN) :: IGEO
66 INTEGER,INTENT(IN) :: PID,NEL,NLAY,NPTTOT,IGTYP,ISUBSTACK,
67 . NLAY_MAX,LAYNPT_MAX,NUMGEO,NUMSTACK,LIPART1,
68 . NPART
69 INTEGER, DIMENSION(LIPART1,NPART), INTENT(IN) :: IPART
70 INTEGER, DIMENSION(NEL), INTENT(IN) :: NGL,IPARTC
71 my_real,
DIMENSION(NEL,NLAY_MAX*LAYNPT_MAX),
INTENT(IN) :: thk_ly
72 my_real,
DIMENSION(NPTTOT*NEL),
INTENT(IN) :: thkly
73 my_real,
DIMENSION(NEL),
INTENT(INOUT) :: off
74 TYPE (STACK_PLY), INTENT(IN) :: STACK
75 TYPE (FAILWAVE_STR_), INTENT(IN), TARGET :: FAILWAVE
76 INTEGER, DIMENSION(NEL), INTENT(INOUT) :: FWAVE_EL
77 TYPE (MAT_ELEM_) ,INTENT(INOUT) :: MAT_ELEM
78 LOGICAL, DIMENSION(NEL), INTENT(INOUT) :: PRINT_FAIL
79
80
81
82
83 INTEGER I,II,IEL,IPOS,IL,IFL,IPT,NPTT,
84 . NINDXLY,NFAIL,IPWEIGHT,IPTHKLY,IMAT,ID_PLY
86 . p_thickg,fail_exp,dfail
87 INTEGER, DIMENSION(NEL) :: INDXLY
88 INTEGER, DIMENSION(:), POINTER :: FOFF,LAY_OFF
89 my_real,
DIMENSION(NLAY) :: weight,p_thkly
90 my_real,
DIMENSION(NLAY,100) :: pthkf
92
93 CHARACTER(LEN=NCHARTITLE), DIMENSION(NEL) :: FAIL_NAME
94
95
96
97
98
99
100
101
102
103
104 p_thickg = geo(42,pid)
105 fail_exp = geo(43,pid)
106 IF (igtyp == 17 .OR. igtyp == 51 .OR. igtyp == 52) THEN
107 ipthkly = 1 + 4*nlay
108 ipweight = ipthkly + nlay
109 ELSE
110 ipthkly = 700
111 ipweight = 900
112 ENDIF
113
114 DO il=1,nlay
115 nfail = elbuf_str%BUFLY(il)%NFAIL
116 imat = elbuf_str%BUFLY(il)%IMAT
117 DO ifl = 1,nfail
118 pthkf(il,ifl) = mat_elem%MAT_PARAM(imat)%FAIL(ifl)%PTHK
119 END DO
120 END DO
121
122
123
124
125
126 IF (nlay == 1) THEN
127
128
129 il = 1
130
131
132 imat = elbuf_str%BUFLY(il)%IMAT
133
134
135 nfail = elbuf_str%BUFLY(il)%NFAIL
136 DO ifl = 1,nfail
137
138 IF (pthkf(il,ifl) > zero) THEN
139 pthkf(il,ifl) =
min(pthkf(il,ifl),abs(p_thickg))
140 pthkf(il,ifl) =
max(
min(pthkf(il,ifl),one-em06),em06)
141
142 ELSEIF (pthkf(il,ifl) < zero) THEN
143 pthkf(il,ifl) =
max(pthkf(il,ifl),-abs(p_thickg))
144 pthkf(il,ifl) =
min(
max(pthkf(il,ifl),-one+em6),-em06)
145
146 ELSE
147 pthkf(il,ifl) = p_thickg
148 ENDIF
149 ENDDO
150
151
152 DO ifl = 1,nfail
153 thfact(1:nel) = zero
154 npfail(1:nel) = zero
155 nptt = elbuf_str%BUFLY(il)%NPTT
156
157
158 DO ipt=1,nptt
159 foff => elbuf_str%BUFLY(il)%FAIL(1,1,ipt)%FLOC(ifl)%OFF
160 DO iel=1,nel
161 IF (off(iel) == one) THEN
162 IF (foff(iel) < one) THEN
163 ipos = (ipt-1)*nel + iel
164 thfact(iel) = thfact(iel) + thkly(ipos)
165 npfail(iel) = npfail(iel) + one/nptt
166 ENDIF
167 ENDIF
168 ENDDO
169 ENDDO
170
171 DO iel=1,nel
172 IF (off(iel) == one) THEN
173 IF (((thfact(iel) >= pthkf(il,ifl)).AND.(pthkf(il,ifl) > zero)).OR.
174 . ((npfail(iel) >= abs(pthkf(il,ifl))).AND.(pthkf(il,ifl) < zero))) THEN
175 off(iel) = four_over_5
176 print_fail(iel) = .false.
177 fail_name(iel) = mat_elem%MAT_PARAM(imat)%FAIL(ifl)%KEYWORD
178#include "lockon.inc"
179 WRITE(iout, 1000) trim(fail_name(iel)),ngl(iel)
180 WRITE(istdo,1100) trim(fail_name(iel)),ngl(iel),tt
181#include "lockoff.inc"
182 IF (failwave%WAVE_MOD > 0) fwave_el(iel) = -1
183 ENDIF
184 ENDIF
185 ENDDO
186 ENDDO
187
188
189
190
191 ELSEIF (nlay == npttot) THEN
192
193
194 ipt = 1
195
196
197 DO il=1,nlay
198 nindxly = 0
199 nfail = elbuf_str%BUFLY(il)%NFAIL
200 lay_off => elbuf_str%BUFLY(il)%OFF
201 imat = elbuf_str%BUFLY(il)%IMAT
202 DO ifl = 1,nfail
203 foff => elbuf_str%BUFLY(il)%FAIL(1,1,ipt)%FLOC(ifl)%OFF
204 DO iel=1,nel
205 IF (off(iel) == one .AND. lay_off(iel) == 1) THEN
206 IF (foff(iel) < 1) THEN
207 nindxly = nindxly + 1
208 indxly(nindxly) = iel
209 lay_off(iel) = 0
210 fail_name(iel) = mat_elem%MAT_PARAM(imat)%FAIL(ifl)%KEYWORD
211 ENDIF
212 ENDIF
213 ENDDO
214 ENDDO
215
216 IF (nindxly > 0) THEN
217
218 IF (igtyp == 17 .OR. igtyp == 51 .OR. igtyp == 52) THEN
219 IF (igtyp == 17 .OR. igtyp == 51) THEN
220 id_ply = igeo(1,stack%IGEO(2+il,isubstack))
221 ELSE
222 id_ply =
ply_info(1,stack%IGEO(2+il,isubstack)-numstack)
223 ENDIF
224 DO i = 1,nindxly
225#include "lockon.inc"
226 WRITE(iout, 3000) trim(fail_name(indxly(i))),id_ply,ngl(indxly(i)),ipart(4,ipartc(indxly(i)))
227 WRITE(istdo,3100) trim(fail_name(indxly(i))),id_ply,ngl(indxly(i)),ipart(4,ipartc(indxly(i))),tt
228#include "lockoff.inc"
229 ENDDO
230
231 ELSE
232 DO i = 1,nindxly
233#include "lockon.inc"
234 WRITE(iout, 2000) trim(fail_name(indxly(i))),il,ngl(indxly(i)),ipart(4,ipartc
235 WRITE(istdo,2100) trim(fail_name(indxly(i))),il,ngl(indxly(i)),ipart(4,ipartc(indxly(i))),tt
236#include "lockoff.inc"
237 ENDDO
238 ENDIF
239 ENDIF
240 ENDDO
241
242
243 thfact(1:nel) = zero
245 npfail(1:nel) = zero
246
247 DO il=1,nlay
248 IF (igtyp == 17 .OR. igtyp == 51 .OR. igtyp == 52) THEN
249 weight(il) = stack%GEO(ipweight+ il,isubstack)
250 ELSE
251 weight(il) = geo(ipweight + il,pid)
252 ENDIF
253 lay_off => elbuf_str%BUFLY(il)%OFF
254 ii = (il-1)*nel
255 DO iel=1,nel
256 IF (off(iel) == one) THEN
257 ipos = ii + iel
258 dfail = thkly(ipos)*weight(il)
260 IF (lay_off(iel) == 0) THEN
261 thfact(iel) = thfact(iel) + thkly(ipos)*weight(il)
262 npfail(iel) = npfail(iel) + one/nlay
263 ENDIF
264 ENDIF
265 ENDDO
266 ENDDO
267
268 DO iel=1,nel
269 IF (off(iel) == one) THEN
270 IF (((thfact(iel) >= p_thickg*
norm(iel)).AND.(p_thickg > zero)).OR.
271 . ((npfail(iel) >= abs(p_thickg)).AND.(p_thickg < zero))) THEN
272 off(iel) = four_over_5
273 IF (failwave%WAVE_MOD > 0) fwave_el(iel) = -1
274 ENDIF
275 ENDIF
276 ENDDO
277
278
279
280
281 ELSE
282
283
284 DO il = 1,nlay
285 nfail = elbuf_str%BUFLY(il)%NFAIL
286 p_thkly(il) = stack%GEO(ipthkly + il,isubstack)
287 DO ifl = 1,nfail
288
289 IF (pthkf(il,ifl) > zero) THEN
290 pthkf(il,ifl) =
min(pthkf(il,ifl),abs(p_thkly(il)))
291 pthkf(il,ifl) =
max(
min(pthkf(il,ifl),one-em06),em06)
292
293 ELSEIF (pthkf(il,ifl) < zero) THEN
294 pthkf(il,ifl) =
max(pthkf(il,ifl),-abs(p_thkly(il)))
295 pthkf(il,ifl) =
min(
max(pthkf(il,ifl),-one+em6),-em06)
296
297 ELSE
298 pthkf(il,ifl) = p_thkly(il)
299 ENDIF
300 ENDDO
301 ENDDO ! |-> il
302
303
304 DO il=1,nlay
305 nptt = elbuf_str%BUFLY(il)%NPTT
306 nindxly = 0
307 nfail = elbuf_str%BUFLY(il)%NFAIL
308 lay_off => elbuf_str%BUFLY(il)%OFF
309 imat = elbuf_str%BUFLY(il)%IMAT
310 ii = (il-1)*nel
311
312 DO ifl = 1,nfail
313 thfact(1:nel) = zero
314 npfail(1:nel) = zero
315 DO ipt = 1,nptt
316 foff => elbuf_str%BUFLY(il)%FAIL(1,1,ipt)%FLOC(ifl)%OFF
317 DO iel=1,nel
318 IF (off(iel) == one) THEN
319 IF (lay_off(iel) == 1) THEN
320 IF (foff(iel) < one) THEN
321 ipos = ii + iel
322 thfact(iel) = thfact(iel) + thkly(ipos)/thk_ly(iel,il)
323 npfail(iel) = npfail(iel) + one/nptt
324 ENDIF
325 ENDIF
326 ENDIF
327 ENDDO
328 ENDDO
329
330 DO iel=1,nel
331 IF (off(iel) == one) THEN
332 IF (((thfact(iel) >= pthkf(il,ifl)).AND.(pthkf
333 . ((npfail(iel) >= abs(pthkf(il,ifl))).AND.(pthkf(il,ifl) < zero))) THEN
334 nindxly = nindxly + 1
335 indxly(nindxly) = iel
336 lay_off(iel) = 0
337 fail_name(iel) = mat_elem%MAT_PARAM(imat)%FAIL(ifl)%KEYWORD
338 DO ipt=1,nptt
339 foff => elbuf_str%BUFLY(il)%FAIL(1,1,ipt)%FLOC(ifl)%OFF
340 foff(iel) = 0
341 ENDDO
342 ENDIF
343 ENDIF
344 ENDDO
345 ENDDO
346
347 IF (nindxly > 0) THEN
348 IF (igtyp == 51) THEN
349 id_ply = igeo(1,stack%IGEO(2+il,isubstack))
350 ELSE
351 id_ply =
ply_info(1,stack%IGEO(2+il,isubstack)-numstack)
352 ENDIF
353 DO i = 1,nindxly
354#include "lockon.inc"
355 WRITE(iout, 3000) trim(fail_name(indxly(i))),id_ply,ngl(indxly(i)),ipart(4,ipartc(indxly
356 WRITE(istdo,3100) trim(fail_name(indxly(i))),id_ply,ngl(indxly(i)),ipart(4,ipartc(indxly(i))),tt
357#include "lockoff.inc"
358 ENDDO
359 ENDIF
360 ENDDO
361
362
363 thfact(1:nel) = zero
364 npfail(1:nel) = zero
366
367 DO il=1,nlay
368 weight(il) = stack%GEO(ipweight + il,isubstack)
369 lay_off => elbuf_str%BUFLY(il)%OFF
370 DO iel=1,nel
371 IF (off(iel) == one) THEN
372 dfail = (thk_ly(iel,il)*weight(il))**fail_exp
374 IF (lay_off(iel) == 0) THEN
375 thfact(iel) = thfact(iel) + dfail
376 npfail(iel) = npfail(iel) + one/nlay
377 ENDIF
378 ENDIF
379 ENDDO
380 ENDDO
381
382 DO iel=1,nel
383 IF (off(iel) == one) THEN
384 thfact(iel) = thfact(iel)**(one/fail_exp)
385 norm(iel) =
norm(iel)**(one/fail_exp)
386 IF (((thfact(iel) >= p_thickg*
norm(iel)).AND.(p_thickg > zero)).OR.
387 . ((npfail(iel) >= abs(p_thickg)).AND.(p_thickg < zero))) THEN
388 off(iel) = four_over_5
389 IF (failwave%WAVE_MOD > 0) fwave_el(iel) = -1
390 ENDIF
391 ENDIF
392 ENDDO
393
394 ENDIF
395
396
397
398
399
400 1000 FORMAT(1x,'-- RUPTURE (',a,') OF SHELL ELEMENT NUMBER ',i10)
401 1100 FORMAT(1x,'-- RUPTURE (',a,') OF SHELL ELEMENT :',i10,' AT TIME :',g11.4)
402 2000 FORMAT(1x,'-- FAILURE (',a,') OF LAYER',i3, ' ,SHELL ELEMENT NUMBER ',i10,
403 . 1x,' BELONGING TO PART ID :', i5)
404 2100 FORMAT(1x,'-- FAILURE (',a,') OF LAYER',i3, ' ,SHELL ELEMENT NUMBER ',i10,
405 . 1x,' BELONGING TO PART ID :', i5,' AT TIME :',g11.4)
406 3000
FORMAT(1x,'-- failure(
',A,') of ply
id ',I10, ' ,shell element number
',I10,
407 . 1X,' belonging to part
id :
', I5)
408 3100 FORMAT(1X,'-- failure(
',A,') of ply
id ',I10, ' ,shell element number
',I10,
409 . 1X,' belonging to part
id :
', I5,' at time :
',G11.4)
norm(diag(diag(diag(inv(mat))) -id.SOL), 2) % destroy mumps instance id.JOB
integer, dimension(:,:), allocatable ply_info