OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
hm_read_mat10.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!|| hm_read_mat10 ../starter/source/materials/mat/mat010/hm_read_mat10.F
25!||--- called by ------------------------------------------------------
26!|| hm_read_mat ../starter/source/materials/mat/hm_read_mat.F90
27!||--- calls -----------------------------------------------------
28!|| ancmsg ../starter/source/output/message/message.F
29!|| hm_get_floatv ../starter/source/devtools/hm_reader/hm_get_floatv.F
30!|| hm_get_intv ../starter/source/devtools/hm_reader/hm_get_intv.F
31!|| hm_option_is_encrypted ../starter/source/devtools/hm_reader/hm_option_is_encrypted.F
32!|| init_mat_keyword ../starter/source/materials/mat/init_mat_keyword.F
33!||--- uses -----------------------------------------------------
34!|| elbuftag_mod ../starter/share/modules1/elbuftag_mod.F
35!|| message_mod ../starter/share/message_module/message_mod.F
36!|| reader_old_mod ../starter/share/modules1/reader_old_mod.F90
37!|| submodel_mod ../starter/share/modules1/submodel_mod.F
38!||====================================================================
39 SUBROUTINE hm_read_mat10(
40 . LSUBMODEL ,MTAG ,UNITAB ,IPM ,PM ,
41 . MAT_ID ,TITR ,EOS_TAG ,ISRATE ,MATPARAM)
42C-----------------------------------------------
43C M o d u l e s
44C-----------------------------------------------
45 USE unitab_mod
46 USE elbuftag_mod !MAXEOS
47 USE message_mod
49 USE matparam_def_mod
51 USE reader_old_mod , ONLY : irec
52C-----------------------------------------------
53C ROUTINE DESCRIPTION :
54C ===================
55C READ MAT LAW21 WITH HM READER
56C-----------------------------------------------
57C DUMMY ARGUMENTS DESCRIPTION:
58C ===================
59C UNITAB UNITS ARRAY
60C MAT_ID MATERIAL ID(INTEGER)
61C TITR MATERIAL TITLE
62C LSUBMODEL SUBMODEL STRUCTURE
63C-----------------------------------------------
64C I m p l i c i t T y p e s
65C-----------------------------------------------
66#include "implicit_f.inc"
67C-----------------------------------------------
68C C o m m o n B l o c k s
69C-----------------------------------------------
70#include "scr17_c.inc"
71#include "units_c.inc"
72#include "param_c.inc"
73C-----------------------------------------------
74C D u m m y A r g u m e n t s
75C-----------------------------------------------
76 TYPE (UNIT_TYPE_),INTENT(IN) ::UNITAB
77 INTEGER, INTENT(IN) :: MAT_ID
78 INTEGER, INTENT(INOUT) :: ISRATE
79 INTEGER, DIMENSION(NPROPMI) ,INTENT(INOUT) :: IPM
80 CHARACTER(LEN=NCHARTITLE) ,INTENT(IN) :: TITR
81 my_real, DIMENSION(NPROPM) ,INTENT(INOUT) :: pm
82 TYPE(submodel_data), DIMENSION(NSUBMOD),INTENT(IN) :: LSUBMODEL
83 TYPE(mlaw_tag_), INTENT(INOUT) :: MTAG
84 TYPE(eos_tag_) , TARGET, DIMENSION(0:MAXEOS) ,INTENT(INOUT) :: EOS_TAG
85 TYPE(matparam_struct_),INTENT(INOUT) :: MATPARAM
86C-----------------------------------------------
87C L o c a l V a r i a b l e s
88C-----------------------------------------------
89 LOGICAL :: IS_AVAILABLE,IS_ENCRYPTED
90 INTEGER :: COUNT,IFORM,IEOS
91 my_real :: rho0,rhor,a0,a1,a2,amx,c0,c1,c2,c3
92 my_real :: pmin,pext,xmumx,bunl,e0,g,pstar,psh,delta,det,young,anu
93 CHARACTER*64 :: chain,chain2
94C-----------------------------------------------
95C S o u r c e L i n e s
96C-----------------------------------------------
97 pstar = -infinity
98 c0 = zero
99 c1 = zero
100 c2 = zero
101 c3 = zero
102 pext = zero
103 psh = zero
104 pmin = zero
105 bunl = zero
106 xmumx = zero
107 israte = 0
108 is_encrypted = .false.
109 is_available = .false.
110!---
111 CALL hm_option_is_encrypted(is_encrypted)
112!
113 CALL hm_get_intv ('Line_count' ,count ,is_available,lsubmodel)
114 IF(count==0)count=3 ! format 4.* and older
115 count=count+2
116
117 CALL hm_get_floatv('MAT_RHO' ,rho0 ,is_available, lsubmodel, unitab)
118 CALL hm_get_floatv('Refer_Rho' ,rhor ,is_available, lsubmodel, unitab)
119 CALL hm_get_floatv('MAT_E' ,young ,is_available, lsubmodel, unitab)
120 CALL hm_get_floatv('MAT_NU' ,anu ,is_available, lsubmodel, unitab)
121 CALL hm_get_floatv('MAT_A0' ,a0 ,is_available, lsubmodel, unitab)
122 CALL hm_get_floatv('MAT_A1' ,a1 ,is_available, lsubmodel, unitab)
123 CALL hm_get_floatv('MAT_A2' ,a2 ,is_available, lsubmodel, unitab)
124 CALL hm_get_floatv('MAT_AMAX' ,amx ,is_available, lsubmodel, unitab)
125 CALL hm_get_floatv('EOS_COM_C0' ,c0 ,is_available, lsubmodel, unitab)
126 CALL hm_get_floatv('EOS_COM_C1' ,c1 ,is_available, lsubmodel, unitab)
127 CALL hm_get_floatv('EOS_COM_C2' ,c2 ,is_available, lsubmodel, unitab)
128 CALL hm_get_floatv('EOS_COM_C3' ,c3 ,is_available, lsubmodel, unitab)
129 CALL hm_get_floatv('EOS_COM_B' ,bunl ,is_available, lsubmodel, unitab)
130 CALL hm_get_floatv('EOS_COM_Mue_max' ,xmumx ,is_available, lsubmodel, unitab)
131
132 CALL hm_get_floatv('MAT_PC' ,pmin ,is_available, lsubmodel, unitab)
133 CALL hm_get_floatv('PEXT' ,pext ,is_available, lsubmodel, unitab)
134
135!---
136 IF (rhor == zero) rhor=rho0
137 pm(1) = rhor
138 pm(89)= rho0
139!
140 IF(count == 5) THEN
141 iform= 1 !old format (embedded EoS : C0,C1,C2, ... parameters)
142 ieos = 13
143 eos_tag(ieos)%L_MU = 1
144 matparam%IEOS = ieos
145 ! allocate EoS data structure
146 matparam%EOS%NUPARAM = 7
147 matparam%EOS%NIPARAM = 1
148 matparam%EOS%NFUNC = 0
149 matparam%EOS%NTABLE = 0
150 CALL matparam%EOS%CONSTRUCT() !allocations
151 matparam%EOS%uparam(1) = xmumx
152 matparam%EOS%uparam(2) = zero
153 matparam%EOS%uparam(3) = bunl
154 matparam%EOS%uparam(4) = c0
155 matparam%EOS%uparam(5) = c1
156 matparam%EOS%uparam(6) = c2
157 matparam%EOS%uparam(7) = c3
158 matparam%EOS%iparam(1) = 1 !linear evolution of the unloading slope
159 matparam%EOS%psh = psh
160 ELSE
161 iform=2 !new format (Eos defined from /EOS option)
162 ieos = 18 ! linear EOS is used by default
163 irec = irec+1
164 ENDIF
165!
166 matparam%IEOS = ieos
167 ipm(4) = ieos ! keep this temporarily for output and fluid sections
168
169 e0 = zero
170
171 IF(c1 == zero)c1=third*young/(one-two*anu) !bulk modulus
172
173 IF(young <= zero)THEN
174 chain='YOUNG MODULUS MUST BE DEFINED '
175 chain2=''
176 CALL ancmsg(msgid=829, msgtype=msgerror, anmode=aninfo, i1=10, i2=mat_id, c1='ERROR', c2=titr, c3=chain, c4=chain2)
177 ENDIF
178
179 IF(anu <= zero)THEN
180 chain='POISSON RATIO MUST BE DEFINED '
181 chain2=''
182 CALL ancmsg(msgid=829,msgtype=msgerror,anmode=aninfo,i1=10,i2=mat_id,c1='ERROR',c2=titr,c3=chain,c4=chain2)
183 ENDIF
184
185 IF(a1 < zero .AND. a2 == zero)THEN
186 chain ='INVERTED YIELD SURFACE BECAUSE A1 IS NEGATIVE. '
187 chain2='CHECK A0,A1,A2 YIELD PARAMETERS '
188 CALL ancmsg(msgid=829,msgtype=msgwarning,anmode=aninfo,i1=10,i2=mat_id,c1='WARNING',c2=titr,c3=chain,c4=chain2)
189 ENDIF
190
191 IF(a2 < zero)THEN
192 chain ='UNEXPECTED YIELD SURFACE : A2 IS NEGATIVE '
193 chain2='CHECK A0,A1,A2 YIELD PARAMETERS '
194 CALL ancmsg(msgid=829,msgtype=msgwarning,anmode=aninfo,i1=10,i2=mat_id,c1='WARNING',c2=titr,c3=chain,c4=chain2)
195 ENDIF
196 IF(iform == 1 .AND. c1 <= zero) THEN
197 chain='TENSILE BULK MODULUS C1 IS LOWER OR EQUAL TO 0. '
198 chain2=''
199 CALL ancmsg(msgid=829,msgtype=msgerror,anmode=aninfo,i1=10,i2=mat_id,c1='ERROR',c2=titr,c3=chain,c4=chain2)
200 END IF
201
202 IF(a2==zero.AND.a1/=zero)THEN !(A2=A1=ZERO => error message)
203 pstar=-a0/a1
204 ELSEIF(a2 /= zero)THEN
205 delta = a1*a1-four*a0*a2
206 !If intersection with the axis
207 IF(delta >= zero)THEN
208 delta=sqrt(delta)
209 pstar = (-a1+delta)/two/a2
210
211 ELSE
212 pstar = -a1/two/a2 !extremum
213 chain ='YIELD SURFACE J2(P)=A0+A1.P+A2.P^2 HAS NO INTERSECTION WITH '
214 chain2='pressure axis. assuming surface closure at p= '
215 WRITE(chain2(46:59),FMT=('(e13.6)')) PSTAR
216 CALL ANCMSG( MSGID=829,MSGTYPE=MSGWARNING,ANMODE=ANINFO,I1=10,I2=MAT_ID,C1='warning',C2=TITR,C3=chain,C4=chain2)
217 ENDIF
218 ELSE
219 !do nothing let user do what he wants
220 ENDIF
221C
222 IF(AMX == ZERO) AMX = EP20
223 IF(PMIN == ZERO) PMIN =-INFINITY
224 !-----------------------------------------------------------------------------!
225 ! THESE FOLLOWING CHECKS ARE RELEVANT ONLY IN CASE OF EMBEDDED COMPACTION EOS !
226 !-----------------------------------------------------------------------------!
227
228 IF(IFORM == 1)THEN
229.AND. IF(XMUMX == ZEROBUNL /= ZERO)THEN
230 chain= 'missing mumax VALUE is automatically estimated from bunl VALUE. '
231 chain2=''
232 CALL ANCMSG(MSGID=829,MSGTYPE=MSGWARNING,ANMODE=ANINFO,I1=10,I2=MAT_ID,C1='warning',C2=TITR,C3=chain,C4=chain2)
233 IF(C3 == ZERO)THEN
234 IF(C2 == ZERO)THEN
235 XMUMX=EP20
236 ELSE
237 XMUMX=(BUNL-C1)/(TWO*C2)
238 ENDIF
239 ELSE
240 DET=SQRT(C2**2 + THREE*C3*(BUNL-C1))
241 XMUMX=(DET-C2)/(THREE*C3)
242 ENDIF
243 ENDIF
244
245.AND. IF(XMUMX /= ZEROBUNL == ZERO)THEN
246 chain= 'missing bunl VALUE is automatically estimated from mumax '
247 chain2=''
248 CALL ANCMSG(MSGID=829,MSGTYPE=MSGWARNING,ANMODE=ANINFO,I1=10,I2=MAT_ID,C1='warning',C2=TITR,C3=chain,C4=chain2)
249 IF(C3 == ZERO)THEN
250 IF(C2 == ZERO)THEN
251 BUNL = C1
252 ELSE
253 BUNL = C1 + TWO*C2*XMUMX
254 ENDIF
255 ELSE
256 BUNL = C1 + TWO*C2*XMUMX + THREE*C3*C3*XMUMX**TWO
257 ENDIF
258 ENDIF
259 IF(BUNL == ZERO) BUNL = C1
260 ENDIF !IFORM == 1
261
262 G=YOUNG/(TWO*(ONE + ANU))
263
264 !--- STORAGE OF MATERIAL PARAMETERS IN MATERIAL BUFFER ---!
265 PM(20)=YOUNG
266 PM(21)=ANU
267 PM(22)=G
268 PM(23)=E0
269 PM(31)=C0
270 PM(32)=C1
271 PM(33)=C2
272 PM(34)=C3
273 PM(49)=C0
274 PM(35)=ZERO
275 PM(36)=ZERO
276 PM(37)=PMIN
277 PM(38)=A0
278 PM(39)=A1
279 PM(40)=A2
280 PM(41)=AMX
281 PM(43)=PEXT
282 PM(44)=PSTAR
283 PM(45)=BUNL
284 PM(46)=XMUMX
285 PM(47)=ZERO ! MUMIN
286 PM(48)=IFORM
287 PM(79)=THREE100
288 PM(88)=PSH
289 PM(104)=C0
290 PM(105) = TWO*G/(C1+FOUR_OVER_3*G) ! =(1-2*Nu)/(1-Nu)
291
292 !Formulation for solid elements time step computation.
293 IPM(252)= 2
294
295C---- Buffer Size for specific element buffer allocations
296
297 MTAG%G_PLA = 1
298 MTAG%G_EPSQ = 1
299 MTAG%G_MU = 1 !unloading history (volumetric plastic strain)
300
301 MTAG%L_PLA = 1 ! /TH(VPLA)
302 MTAG%L_EPSQ = 1 ! /TH(EPSP)
303 MTAG%L_MU = 1 ! unloading history (volumetric plastic strain)
304
305 ! Material compatibility with /EOS option
306 CALL INIT_MAT_KEYWORD(MATPARAM,"EOS")
307
308 ! EOS/Thermo keyword for pressure treatment in elements
309 CALL INIT_MAT_KEYWORD(MATPARAM,"HYDRO_EOS")
310
311 CALL INIT_MAT_KEYWORD(MATPARAM,"ELASTO_PLASTIC")
312
313 ! Properties compatibility
314 CALL INIT_MAT_KEYWORD(MATPARAM,"SOLID_ISOTROPIC")
315 CALL INIT_MAT_KEYWORD(MATPARAM,"SPH")
316
317 !--- OUTPUT IN STARTER LISTING FILE ---!
318 WRITE(IOUT,1100) TRIM(TITR),MAT_ID,10
319 WRITE(IOUT,1000)
320 IF(IS_ENCRYPTED)THEN
321 WRITE(IOUT,'(5x,a,//)')'confidential data'
322 ELSE
323 WRITE(IOUT,1200)RHO0,RHOR
324 WRITE(IOUT,1300)YOUNG,ANU,G
325 WRITE(IOUT,1400)A0,A1,A2,AMX
326 IF(IFORM == 1)THEN
327 WRITE(IOUT,1500)C0,C1,C2,C3,BUNL,XMUMX,PMIN,PSTAR
328 ELSE
329 WRITE(IOUT,1501)BUNL,XMUMX,PMIN,PSTAR
330 ENDIF
331 ENDIF
332C-----------
333 RETURN
334 1000 FORMAT(
335 & 5X,40H DRUCKER-PRAGER (LAW10) ,/,
336 & 5X,40H ---------------------- ,//)
337 1100 FORMAT(/
338 & 5X,A,/,
339 & 5X,'material number . . . . . . . . . . . .=',I10/,
340 & 5X,'material law. . . . . . . . . . . . . .=',I10/)
341 1200 FORMAT(
342 & 5X,'initial density . . . . . . . . . . . .=',1PG20.13/,
343 & 5X,'reference density . . . . . . . . . . .=',1PG20.13/)
344 1300 FORMAT(
345 & 5X,40HYOUNG's modulus . . . . . . . . . . . .=,e12.4/,
346 & 5x,40hpoisson'S RATIO . . . . . . . . . . . .=,E12.4/,
347 & 5X,40HSHEAR MODULUS . . . . . . . . . . . . .=,E12.4//)
348 1400 FORMAT(
349 & 5X,40HYIELD COEFFICIENT A0. . . . . . . . . .=,E12.4/,
350 & 5X,40HYIELD COEFFICIENT A1. . . . . . . . . .=,E12.4/,
351 & 5X,40HYIELD COEFFICIENT A2. . . . . . . . . .=,E12.4/,
352 & 5X,40HA-MAX . . . . . . . . . . . . . . . . .=,E12.4//)
353 1500 FORMAT(
354 & 5X,40HC0. . . . . . . . . . . . . . . . . . .=,E12.4/,
355 & 5X,40HC1. . . . . . . . . . . . . . . . . . .=,E12.4/,
356 & 5X,40HC2. . . . . . . . . . . . . . . . . . .=,E12.4/,
357 & 5X,40HC3. . . . . . . . . . . . . . . . . . .=,E12.4/,
358 & 5X,40HUNLOADING BULK. . . . . . . . . . . . .=,E12.4/,
359 & 5X,40HMAX VOLUMIC COMPRESSION . . . . . . . .=,E12.4/,
360 & 5X,40HFRACTURE PRESSURE . . . . . . . . . . .=,E12.4/,
361 & 5X,40HYIELD SURFACE PRESSURE ROOT . . . . . .=,E12.4//)
362 1501 FORMAT(
363 & 5X,40HUNLOADING BULK. . . . . . . . . . . . .=,E12.4/,
364 & 5X,40HMAX VOLUMIC COMPRESSION . . . . . . . .=,E12.4/,
365 & 5X,40HFRACTURE PRESSURE . . . . . . . . . . .=,E12.4/,
366 & 5X,40HYIELD SURFACE PRESSURE ROOT . . . . . .=,E12.4//)
367C-----------
368 RETURN
369 END
#define my_real
Definition cppsort.cpp:32
subroutine hm_get_floatv(name, rval, is_available, lsubmodel, unitab)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_option_is_encrypted(is_encrypted)
subroutine hm_read_mat10(lsubmodel, mtag, unitab, ipm, pm, mat_id, titr, eos_tag, israte, matparam)
integer, parameter nchartitle
integer nsubmod
subroutine ancmsg(msgid, msgtype, anmode, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17, i18, i19, i20, r1, r2, r3, r4, r5, r6, r7, r8, r9, c1, c2, c3, c4, c5, c6, c7, c8, c9, prmode)
Definition message.F:895