OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
fail_brokmann.F
Go to the documentation of this file.
1Copyright> OpenRadioss
2Copyright> Copyright (C) 1986-2025 Altair Engineering Inc.
3Copyright>
4Copyright> This program is free software: you can redistribute it and/or modify
5Copyright> it under the terms of the GNU Affero General Public License as published by
6Copyright> the Free Software Foundation, either version 3 of the License, or
7Copyright> (at your option) any later version.
8Copyright>
9Copyright> This program is distributed in the hope that it will be useful,
10Copyright> but WITHOUT ANY WARRANTY; without even the implied warranty of
11Copyright> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12Copyright> GNU Affero General Public License for more details.
13Copyright>
14Copyright> You should have received a copy of the GNU Affero General Public License
15Copyright> along with this program. If not, see <https://www.gnu.org/licenses/>.
16Copyright>
17Copyright>
18Copyright> Commercial Alternative: Altair Radioss Software
19Copyright>
20Copyright> As an alternative to this open-source version, Altair also offers Altair Radioss
21Copyright> software under a commercial license. Contact Altair to discuss further if the
22Copyright> commercial version may interest you: https://www.altair.com/radioss/.
23!||====================================================================
24!|| fail_brokmann ../engine/source/materials/fail/alter/fail_brokmann.F
25!||--- called by ------------------------------------------------------
26!|| fail_wind_frwave ../engine/source/materials/fail/alter/fail_wind_frwave.F
27!||--- calls -----------------------------------------------------
28!|| newman_raju ../common_source/fail/newman_raju.F90
29!||--- uses -----------------------------------------------------
30!|| newman_raju_mod ../common_source/fail/newman_raju.F90
31!||====================================================================
32 SUBROUTINE fail_brokmann(
33 . NEL ,NUPARAM ,NUVAR ,TIME ,TIMESTEP ,
34 . UPARAM ,NGL ,SIGNXX ,SIGNYY ,SIGNXY ,
35 . UVAR ,OFF ,IPT ,NINDXF ,INDXF ,
36 . TDEL )
37!-----------------------------------------------
38! M o d u l e s
39!-----------------------------------------------
40 use newman_raju_mod
41C-----------------------------------------------
42c Test of Ch. Brokmann criterion in glass, taking account for initial
43c statistically distributed micro cracks
44C-----------------------------------------------
45C I m p l i c i t T y p e s
46C-----------------------------------------------
47#include "implicit_f.inc"
48C-----------------------------------------------
49C G l o b a l P a r a m e t e r s
50C-----------------------------------------------
51#include "units_c.inc"
52#include "comlock.inc"
53C---------+---------+---+---+--------------------------------------------
54 INTEGER NEL,NUPARAM,NUVAR,IPT,NINDXF
55 my_real TIME,TIMESTEP
56c
57 INTEGER, DIMENSION(NEL) :: NGL,INDXF
58 my_real, DIMENSION(NEL) :: signxx,signyy,signxy,off,tdel
59 my_real, DIMENSION(NUPARAM) ,INTENT(IN) :: uparam
60 my_real ,DIMENSION(NEL,NUVAR), INTENT(INOUT) :: uvar
61C-----------------------------------------------
62C L o c a l V a r i a b l e s
63C-----------------------------------------------
64 INTEGER I,J,IDEB,NINDX
65 INTEGER ,DIMENSION(NEL) :: INDX
66c
67 my_real :: ALPHA,ALPHAI,EXP_N,EXP_M,K_IC,K_TH,SIG_INI,DSIG_INI,XDAMP,V0,
68 . da,dc,v_a,v_c,kcm,ktm,vm,sig_cos,sig_cosw,dsig_n,ya,yc,k1_a,k1_c,
69 . cr_ang,fac_m,fac_l,fac_t,fac_lenm,fac_mpa,fac_pi0,fac_pi2
70c--------------------------------------------------------------------
71c--- state variables for Ch.Brokmann extension
72c UVAR(15) = FAIL_B : Failure flag, set = 1 to allow Alter test
73c UVAR(16) = CR_LEN : Crack length
74c UVAR(17) = CR_DEPTH : Crack width
75c UVAR(18) = CR_ANG : Random crack angle
76c UVAR(19) = THK0 : Initial thickness of the shell (in micrometers)
77c UVAR(20) = ALDT0 : Initial width of the shell (in micrometers)
78c UVAR(21) = SIG_COS : Crack opening stress (saved for filtering)
79C=======================================================================
80 exp_n = uparam(1)
81 k_ic = uparam(6)
82 k_th = uparam(7)
83 v0 = uparam(8)
84 alpha = uparam(10)
85 ideb = nint(uparam(17))
86 sig_ini = uparam(30)
87 fac_m = uparam(33)
88 fac_l = uparam(34)
89 fac_t = uparam(35)
90c--------------------------------------------------
91c parameter initialization and unit_conversions
92c--------------------------------------------------
93 fac_lenm = ep06 * fac_l ! conversion to micrometers
94 fac_mpa = em6 * fac_m / (fac_l * fac_t**2) ! stress conversion to MPa
95 vm = v0 * fac_l / fac_t ! conversion to (m/s)
96 kcm = k_ic * sqrt(fac_l) ! conversion to [stress*sqrt(m)]
97 ktm = k_th * sqrt(fac_l) ! conversion to [stress*sqrt(m)]
98c-----------------------------------
99 alphai = one - alpha
100 nindx = 0
101c
102 dsig_ini = 2.0 ! [MPa/s]
103 xdamp = 25.0 ! hard coded damping exponent
104 exp_m = one / (one + xdamp)
105 fac_pi0 = zero
106 fac_pi2 = half
107c--------------------------------------------------------------------
108 DO i = 1,nel
109 IF (off(i) == one .and. uvar(i,15) == zero .and. uvar(i,16) > zero) THEN
110 v_a = zero
111 v_c = zero
112c
113c Crack openenig stress (stress rotated in crack direction)
114 cr_ang = uvar(i,18) * two
115 sig_cos = half*(signxx(i)+signyy(i))
116 . + cos(cr_ang) * half*(signxx(i)-signyy(i))
117 . + sin(cr_ang) * half*signxy(i)
118 sig_cos = sig_cos * alpha + uvar(i,21)*alphai ! filter using exp average
119c
120c take into account high stress rates
121 dsig_n = (sig_cos - uvar(i,21)) / max(timestep,em20)
122 dsig_n = dsig_n * fac_mpa / fac_t ! => (MPa/s)
123
124 uvar(i,21) = sig_cos ! Save Crack Opening Stress (COS)
125 IF (dsig_n > dsig_ini) THEN
126 sig_cos = sig_cos * (dsig_ini/abs(dsig_n))**exp_m
127 END IF
128c------------------------
129c Residual stress
130c------------------------
131 sig_cosw = sig_cos - sig_ini ! Subtracting initial surface stress
132 sig_cosw = max(zero , sig_cosw)
133c------------------------
134c Test criteria
135c------------------------
136 CALL newman_raju(uvar(i,17),uvar(i,16),uvar(i,19),uvar(i,20),fac_pi2,ya)
137 CALL newman_raju(uvar(i,17),uvar(i,16),uvar(i,19),uvar(i,20),fac_pi0,yc)
138 k1_a = ya * sig_cosw * sqrt(pi*uvar(i,16)*em6)
139 k1_c = yc * sig_cosw * sqrt(pi*uvar(i,17)*em6)
140c
141c Check rupture criterion #1
142 IF (k1_a >= kcm) THEN
143 tdel(i) = time ! tag to start damage
144 nindx = nindx + 1
145 nindxf = nindxf+ 1
146 indx(nindx) = i
147 indxf(nindxf) = i ! tag to save crack direction
148 uvar(i,15) = one ! set failure flag = 1
149 END IF
150c
151 IF (k1_a >= ktm .and. k1_a < kcm) v_a = v0*(k1_a/kcm)**exp_n
152 IF (k1_c >= ktm .and. k1_a < kcm) v_c = v0*(k1_c/kcm)**exp_n
153c
154c Crack growth
155 da = v_a * timestep * fac_lenm
156 dc = v_c * timestep * fac_lenm
157 uvar(i,16) = uvar(i,16) + da
158 uvar(i,17) = uvar(i,17) + dc
159c
160c Check rupture criterion #2
161 k1_a = ya * sig_cos * sqrt(pi*uvar(i,16)*em6)
162 IF (k1_a >= kcm .and. uvar(i,15) == zero) THEN
163 tdel(i) = time ! tag to start damage
164 nindx = nindx + 1
165 nindxf = nindxf+ 1
166 indx(nindx) = i
167 indxf(nindxf) = i ! tag to save crack direction
168 uvar(i,15) = one ! set failure flag = 1
169 END IF
170
171 END IF
172 END DO
173c-----------------------------------------------
174 IF (nindx > 0) THEN
175 DO j=1,nindx
176 i = indx(j)
177#include "lockon.inc"
178 WRITE(iout, 1000) ngl(i),ipt,time
179 WRITE(istdo,1100) ngl(i),ipt,time
180#include "lockoff.inc"
181 ENDDO
182 ENDIF
183c-----------------------------------------------
184 1000 FORMAT(1x, ' **** FAILURE due to Brokmann criterion : ELEMENT ',i10,
185 . ' INT POINT',i2,' AT TIME ',1pe12.4)
186 1100 FORMAT(1x, ' **** FAILURE due to Brokmann criterion : ELEMENT ',i10,
187 . ' INT POINT',i2,' AT TIME ',1pe12.4)
188c-----------
189 RETURN
190 END
subroutine fail_brokmann(nel, nuparam, nuvar, time, timestep, uparam, ngl, signxx, signyy, signxy, uvar, off, ipt, nindxf, indxf, tdel)
#define max(a, b)
Definition macros.h:21