OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
fail_visual_c.F File Reference
#include "implicit_f.inc"
#include "units_c.inc"
#include "comlock.inc"
#include "lockon.inc"
#include "lockoff.inc"

Go to the source code of this file.

Functions/Subroutines

subroutine fail_visual_c (nel, nuvar, time, timestep, uparam, ngl, signxx, signyy, signxy, epsxx, epsyy, epsxy, uvar, off, dfmax, ismstr)

Function/Subroutine Documentation

◆ fail_visual_c()

subroutine fail_visual_c ( integer nel,
integer nuvar,
time,
timestep,
uparam,
integer, dimension(nel) ngl,
signxx,
signyy,
signxy,
epsxx,
epsyy,
epsxy,
uvar,
off,
dfmax,
integer ismstr )

Definition at line 29 of file fail_visual_c.F.

33C--------------------------------------------------------------------
34C /FAIL/VISUAL - Visua failure criteria
35C--------------------------------------------------------------------
36C I m p l i c i t T y p e s
37C-----------------------------------------------
38#include "implicit_f.inc"
39C-----------------------------------------------
40C G l o b a l P a r a m e t e r s
41C-----------------------------------------------
42#include "units_c.inc"
43#include "comlock.inc"
44C---------+---------+---+---+--------------------------------------------
45C VAR | SIZE |TYP| RW| DEFINITION
46C---------+--------+--+--+-------------------------------------------
47C NEL | 1 | I | R | SIZE OF THE ELEMENT GROUP NEL
48C NUPARAM | 1 | I | R | SIZE OF THE USER PARAMETER ARRAY
49C NUVAR | 1 | I | R | NUMBER OF FAILURE ELEMENT VARIABLES
50C---------+--------+--+--+-------------------------------------------
51C TIME | 1 | F | R | CURRENT TIME
52C TIMESTEP| 1 | F | R | CURRENT TIME STEP
53C UPARAM | NUPARAM | F | R | USER FAILURE PARAMETER ARRAY
54C---------+--------+--+--+-------------------------------------------
55C EPSXX | NEL | F | R | STRAIN XX
56C EPSYY | NEL | F | R | STRAIN YY
57C ... | | | |
58C---------+--------+--+--+-------------------------------------------
59C UVAR |NEL*NUVAR| F |R/W| USER ELEMENT VARIABLE ARRAY
60C OFF | NEL | F |R/W| DELETED ELEMENT FLAG (=1. ON, =0. OFF)
61C---------+--------+--+--+-------------------------------------------
62C I N P U T A r g u m e n t s
63C-----------------------------------------------
64 INTEGER NEL,NUVAR,ISMSTR
65 INTEGER NGL(NEL)
66 my_real time,timestep
67 my_real uparam(*),epsxx(nel) ,epsyy(nel),epsxy(nel),dfmax(nel)
68C-----------------------------------------------
69C I N P U T O U T P U T A r g u m e n t s
70C-----------------------------------------------
71 my_real uvar(nel,nuvar), off(nel),offl(nel),
72 . signxx(nel),signyy(nel),signxy(nel)
73C-----------------------------------------------
74C VARIABLES FOR FUNCTION INTERPOLATION
75C-----------------------------------------------
76C L o c a l V a r i a b l e s
77C-----------------------------------------------
78 INTEGER I,J,LENG,NINDX,INDX(NEL),TYPE_MAX,F_FLAG,STRDEF,STRFLAG
79 my_real e11,sig_a,sig_b,sig_11,eps_a,eps_b,
80 . c_min,c_max,ema,damage
81 DOUBLE PRECISION :: A0(2),A1(2),A2(2),C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,
82 . X1,X2,X3,Y1,Y2,Y3,Z1,Z2,Z3,F,FF,D,DD,D2,DP,E,G
83 DOUBLE PRECISION, PARAMETER :: PI8 = 0.3926990817d0
84 DOUBLE PRECISION, PARAMETER :: PI38 = 1.178097245d0
85 DOUBLE PRECISION, PARAMETER :: SPI8 = 0.3826834324d0
86 DOUBLE PRECISION, PARAMETER :: SPI38 = 0.9238795325d0
87C-----------------------------------------------
88C USER VARIABLES INITIALIZATION
89
90c! User variable # 1, to store the previous damage value
91c! User variable # 2, to store the previous stress or strain value (for EMA filtering)
92c! User variable # 3-8, Storage values for the Butterworth filter
93
94C-----------------------------------------------
95C...
96 type_max = int(uparam(1))
97 c_min = uparam(2)
98 c_max = uparam(3)
99 ema = uparam(4)
100 ff = uparam(5)
101 f_flag = int(uparam(6))
102 strdef = int(uparam(7))
103
104 nindx = 0
105c----------------------------------------------
106c strain transformation flag following input definition
107c-------------------
108 strflag = 0
109 IF (strdef == 2) THEN ! failure defined as engineering strain
110 IF (ismstr == 10 .or. ismstr == 12) THEN
111 strflag = 1
112 ELSE IF (ismstr == 0 .or. ismstr == 2 .or. ismstr == 4) THEN
113 strflag = 2
114 END IF
115 ELSE IF (strdef == 3) THEN ! failure defined as true strain
116 IF (ismstr == 1 .or. ismstr == 3 .or. ismstr == 11) THEN
117 strflag = 3
118 ELSE IF (ismstr == 10 .or. ismstr == 12) THEN
119 strflag = 4
120 END IF
121 END IF
122c-------------------
123c
124c! ***********************
125c! *** NEW ... 03.07.2019
126c! ***********************
127 DO i=1,nel
128 IF (uvar(i,1) < 1.0d0 .AND. off(i) == one)THEN
129
130 IF (type_max == 1) THEN
131
132c! stress
133 sig_a = (signxx(i) + signyy(i))/two
134 sig_b = sqrt(((signxx(i)-signyy(i))/two)**2+signxy(i)**2)
135 sig_11 = sig_a + sig_b
136 e11 = sig_11
137
138 ELSE
139
140c! strains EPSXX ,EPSYY ,EPSXY
141 eps_a = (epsxx(i) + epsyy(i)) * half
142 eps_b = sqrt(((epsxx(i)-epsyy(i))/two)**2+(half*epsxy(i))**2)
143 e11 = eps_a + eps_b
144 IF (strflag == 1) THEN
145 e11 = sqrt(e11 + one) - one
146 ELSE IF (strflag == 2) THEN
147 e11 = exp(e11) - one
148 ELSE IF (strflag == 3) THEN
149 e11 = log(e11 + one)
150 ELSE IF (strflag == 4) THEN
151 e11 = log(sqrt(e11+one))
152 END IF
153 ENDIF
154c! ***********************
155c! *** NEW ... 23.02.2020
156c! ***********************
157c! --- EMA or Butterworth filtering
158 IF (ema == one .and. ff /= zero .and. f_flag > 1) THEN
159C-----------------------------------------------
160C INITIALISATION OF THE FILTER-COEFFICIENTS
161C-----------------------------------------------
162 f = min(ff,zep4 / max(timestep,em20))
163 d = tan(pi*f*max(timestep,em20))
164 dd = d*d
165 d2 = two*d
166 dp = one + dd
167 e = d2*spi8
168 g = e + dp
169 g = one/g
170C
171 c0 = dd * g
172 c1 = two* c0
173 c2 = c0
174 c3 = two * g - c1
175 c4 = (e - dp) * g
176C
177 e = d2*spi38
178 g = e + dp
179 g = one/g
180C
181 c5 = dd * g
182 c6 = two * c5
183 c7 = c5
184 c8 = two * g - c6
185 c9 = (e - dp) * g
186
187C-----------------------------------------------
188C BUTTERWORTH FILTERING
189C-----------------------------------------------
190
191 a0(1) = uvar(i,3)*uvar(i,9)
192 a0(2) = uvar(i,4)*uvar(i,9)
193 a1(1) = uvar(i,5)*uvar(i,10)
194 a1(2) = uvar(i,6)*uvar(i,10)
195 a2(1) = uvar(i,7)*uvar(i,11)
196 a2(2) = uvar(i,8)*uvar(i,11)
197
198 x1 = a0(2)
199 x2 = a0(1)
200
201 x3 = e11
202 y1 = a1(2)
203 y2 = a1(1)
204 y3 = c0 * x3
205 y3 = y3 + c1 * x2
206 y3 = y3 + c2 * x1
207 y3 = y3 + c3 * y2
208 y3 = y3 + c4 * y1
209 z1 = a2(2)
210 z2 = a2(1)
211 z3 = c5 * y3
212 z3 = z3 + c6 * y2
213 z3 = z3 + c7 * y1
214 z3 = z3 + c8 * z2
215 z3 = z3 + c9 * z1
216C
217 a0(2) = x2
218 a0(1) = x3
219 a1(2) = y2
220 a1(1) = y3
221 a2(2) = z2
222 a2(1) = z3
223
224 IF ((x3 /= zero).AND.(x2 /= zero)) THEN
225 uvar(i,3) = a0(1)/x2
226 uvar(i,4) = a0(2)/x2
227 uvar(i,5) = a1(1)/(c0*x3)
228 uvar(i,6) = a1(2)/(c0*x3)
229 uvar(i,7) = a2(1)/(c0*y3)
230 uvar(i,8) = a2(2)/(c0*y3)
231 uvar(i,9) = x2
232 uvar(i,10) = c0*x3
233 uvar(i,11) = c0*y3
234 ELSE
235 uvar(i,3) = a0(1)
236 uvar(i,4) = a0(2)
237 uvar(i,5) = a1(1)
238 uvar(i,6) = a1(2)
239 uvar(i,7) = a2(1)
240 uvar(i,8) = a2(2)
241 uvar(i,9) = one
242 uvar(i,10) = one
243 uvar(i,11) = one
244 ENDIF
245
246 e11 = a2(1)
247
248 ELSE
249
250c! EMA = 0 ==> 1 ==> no filtering ; EMA = 1e+20 extreme filtering
251
252c! E11 = E11*(TWO/(ONE+EMA)) + UVAR(I,2)*(ONE-(TWO/(ONE+EMA)))
253 e11 = ema * e11 + ( one - ema ) * uvar(i,2)
254 uvar(i,2) = e11
255 ENDIF
256c!
257c! What it should be is like this:
258c!
259c! Value = USER_INPUT * 2 * Pi * DT
260c! Alpha = Value / (Value + 1)
261c! Actual_filtered_stress = Alpha * actual_Stress + (1-Alpha) * previous_filtered_stress
262c!
263c! ALPHA = EMA / ( EMA + ONE)
264c! E11 = ALPHA * E11 + ( ONE - ALPHA ) * UVAR(I,2)
265c! UVAR(I,2) = E11
266
267 damage = max(zero , min(one ,(e11-c_min)/max(em6,(c_max-c_min)) ))
268 uvar(i,1) = max(uvar(i,1),damage)
269 dfmax(i) = uvar(i,1)
270
271 IF (uvar(i,1) >= one) THEN
272 nindx = nindx+1
273 indx(nindx) = i
274 ENDIF
275
276 ENDIF
277
278c! ***********************
279c! *** NEW ... 26.06.2019
280c! ***********************
281
282 ENDDO
283
284 DO j=1,nindx
285 i = indx(j)
286#include "lockon.inc"
287 WRITE(iout, 1000) ngl(i),time
288 WRITE(istdo,1100) ngl(i),time
289#include "lockoff.inc"
290
291 ENDDO
292
293 1000 FORMAT(1x,'SHELL ELEMENT NUMBER (VISUAL) el#',i10,
294 . ' LIMIT REACHED AT TIME :',1pe12.4)
295 1100 FORMAT(1x,'SHELL ELEMENT NUMBER (VISUAL) el#',i10,
296 . ' LIMIT REACHED AT TIME :',1pe12.4)
297
298 RETURN
#define my_real
Definition cppsort.cpp:32
#define min(a, b)
Definition macros.h:20
#define max(a, b)
Definition macros.h:21