47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
70 USE matparam_def_mod
73
74
75
76#include "implicit_f.inc"
77
78
79
80#include "units_c.inc"
81#include "param_c.inc"
82
83
84
85 TYPE (UNIT_TYPE_),INTENT(IN) ::UNITAB
86 my_real,
DIMENSION(NPROPM) ,
INTENT(INOUT) :: pm
87 my_real,
DIMENSION(100) ,
INTENT(INOUT) :: parmat
88 my_real,
DIMENSION(MAXUPARAM) ,
INTENT(INOUT) :: uparam
89 INTEGER, DIMENSION(MAXFUNC) ,INTENT(INOUT) :: IFUNC
90 INTEGER, INTENT(INOUT) :: MFUNC,NUPARAM,NUVAR,NVARTMP,ISRATE
91 TYPE(MLAW_TAG_),INTENT(INOUT) :: MTAG
92 INTEGER,INTENT(IN) :: ID,MAXFUNC,MAXUPARAM
93 CHARACTER(LEN=NCHARTITLE) ,INTENT(IN) :: TITR
94 TYPE(SUBMODEL_DATA),INTENT(IN) :: LSUBMODEL(*)
95 TYPE(MATPARAM_STRUCT_) ,INTENT(INOUT) :: MATPARAM
96
97
98
99 INTEGER :: NBMAT, MAT_ID
100 INTEGER :: I,J,VP,YLDCHECK
101 INTEGER :: RHOFLAG,ICOMP,NRATE1,NRATE,IPFUN,IFUNCE,ISRAT,ISMOOTH,
102 . NBLINE,NBREAD,IFAIL,OPTE,ILAW,NFUNC
103 my_real :: rho0, rhor,e,nu,g,c1,soundsp, epsmax,epsr1,epsr2,epsf,fisokin,fcut,
104 . pscal_unit,pscale,einf,ce ,
105 . yfac(maxfunc),rate(
max(1,maxfunc)),strainrate_unit(maxfunc),yfac_unit(maxfunc)
106 LOGICAL :: IS_AVAILABLE,IS_ENCRYPTED
107
108
109
110 is_encrypted = .false.
111 is_available = .false.
112 rate(1) = zero
113
114
115
117
118 ilaw = 36
119 CALL hm_get_floatv(
'MAT_RHO' ,rho0 ,is_available, lsubmodel, unitab)
120 CALL hm_get_floatv(
'Refer_Rho',rhor ,is_available, lsubmodel, unitab)
121
122
123 CALL hm_get_floatv(
'MAT_E' ,e ,is_available, lsubmodel, unitab)
124 CALL hm_get_floatv(
'MAT_NU' ,nu ,is_available, lsubmodel, unitab)
125 CALL hm_get_floatv(
'MAT_EPS' ,epsmax ,is_available, lsubmodel, unitab)
126 CALL hm_get_floatv(
'MAT_EPST1',epsr1 ,is_available, lsubmodel, unitab)
127 CALL hm_get_floatv(
'MAT_EPST2',epsr2 ,is_available, lsubmodel, unitab)
128
129
130 CALL hm_get_intv (
'NFUNC' ,nrate ,is_available,lsubmodel)
131 CALL hm_get_intv (
'Fsmooth' ,ismooth ,is_available,lsubmodel)
132 CALL hm_get_floatv(
'MAT_HARD' ,fisokin ,is_available, lsubmodel, unitab)
133 CALL hm_get_floatv(
'Fcut' ,fcut ,is_available, lsubmodel, unitab)
134 CALL hm_get_floatv(
'MAT_Epsilon_F',epsf ,is_available, lsubmodel, unitab)
135 CALL hm_get_intv (
'Vflag' ,vp ,is_available,lsubmodel)
136
137 CALL hm_get_intv (
'Xr_fun' ,ipfun ,is_available,lsubmodel)
138 CALL hm_get_floatv(
'MAT_FScale' ,pscale ,is_available, lsubmodel, unitab)
139 CALL hm_get_intv (
'Yr_fun' ,ifunce ,is_available,lsubmodel)
140 CALL hm_get_floatv(
'MAT_EFIB' ,einf ,is_available, lsubmodel, unitab)
141 CALL hm_get_floatv(
'MAT_C' ,ce ,is_available, lsubmodel, unitab)
142
143
144 IF (nu < zero .OR. nu >= half) THEN
145 CALL ancmsg(msgid=49,msgtype=msgerror,anmode=aninfo_blind_2,r1=nu,i1=
id,c1=titr)
146 ENDIF
147
148 IF(nrate > 100)THEN
149 CALL ancmsg(msgid=215, msgtype=msgerror, anmode=aninfo,i1=36,i2=
id,c1=titr)
150 ELSEIF (nrate <= 0) THEN
151 CALL ancmsg(msgid=740, msgtype=msgerror, anmode=aninfo,i1=
id,c1=titr)
152 ENDIF
153
154 IF (ipfun == 0) THEN
155 pscale = zero
156 ELSEIF (pscale == zero) THEN
157
158 CALL hm_get_floatv_dim(
'MAT_FScale' ,pscal_unit ,is_available, lsubmodel, unitab)
159 pscale = one * pscal_unit
160 ELSE
161 pscale = one /pscale
162 ENDIF
163
164 IF (nrate > 0) THEN
165 DO j=1,nrate
167 ENDDO
168 DO j=1,nrate
170 IF(yfac(j) == zero) THEN
172 yfac(j)=one * yfac_unit(j)
173 ENDIF
174 ENDDO
175
176 rate(1:maxfunc) = zero
177 DO j=1,nrate
179 ENDDO
180
181 DO i=1,nrate-1
182 IF (rate(i) >= rate(i+1)) THEN
183 CALL ancmsg(msgid=478, msgtype=msgerror, anmode=aninfo_blind_1,i1=
id,c1=titr)
184 EXIT
185 ENDIF
186 ENDDO
187 DO i=1,nrate
188 IF (ifunc(i) == 0) THEN
189 CALL ancmsg(msgid=126, msgtype=msgerror, anmode=aninfo_blind_1,i1=
id,c1=titr,i2=ifunc(i))
190 ENDIF
191 ENDDO
192 ENDIF
193
194 IF (nrate == 1) THEN
195 nfunc = 1
196 ismooth= 0
197 israt = 0
198 fcut = zero
199 vp = 0
200 ELSE
201 israt = 1
202 IF (rate(1) == zero) THEN
203 nfunc = nrate
204 ELSE
205 nfunc = nrate+1
206 DO j=nrate,1,-1
207 ifunc(j+1) =ifunc(j)
208 rate(j+1) =rate(j)
209 yfac(j+1) =yfac(j)
210 ENDDO
211 rate(1) = zero
212 ENDIF
213
214 IF (fcut == zero .or. vp == 1) THEN
215 fcut = 10000.0d0*unitab%FAC_T_WORK
216 END IF
217 ENDIF
218 israte =
max(israte,israt)
219
220 IF (nu == half) nu = zep499
221 mfunc = nfunc + 1
222 ifunc(mfunc) = ipfun
223
224 IF (fisokin > one .OR. fisokin < zero) THEN
225 CALL ancmsg(msgid=912, msgtype=msgerror, anmode=aninfo_blind_1
'36',c2=titr)
226 END IF
227
228 IF (epsr1 == zero .AND. epsr2 == zero .AND. epsf == zero) THEN
229 IF (epsmax == zero) THEN
230 ifail = 0
231 ELSE
232 ifail = 1
233 END IF
234 ELSE
235 ifail = 2
236 ENDIF
237
238
239
240
241 IF (ifail > 0) THEN
242 mtag%G_DMG = 1
243 mtag%L_DMG = 1
244 ENDIF
245 IF (epsmax== zero) epsmax= infinity
246 IF (epsr1 == zero) epsr1 = infinity
247 IF (epsr2 == zero) epsr2 = two*infinity
248 IF (epsf == zero) epsf = three*infinity
249
250 epsmax =
min(epsmax ,infinity)
251 epsr1 =
min(epsr1 ,infinity)
252 epsr2 =
min(epsr2 ,two*infinity)
253 epsf =
min(epsf ,three
254
255 IF (epsr1 /= zero .AND. epsr2 /= zero) THEN
256 IF (epsr1 >= epsr2) THEN
257 CALL ancmsg(msgid=480, msgtype=msgerror, anmode=aninfo_blind_1,i1=
id,c1=titr)
258 ENDIF
259 ENDIF
260
261 IF(e <= zero)THEN
262 CALL ancmsg(msgid=276,msgtype=msgerror,anmode=aninfo,i1=
263 e=zero
264 ENDIF
265
266
267 g = half*e/(one+nu)
268 c1= e/three/(one - two*nu)
269 soundsp = sqrt((c1 + four_over_3*g)/rho0)
270 yldcheck = 0
271 opte = 0
272
273
274
275 uparam(1)= nfunc
276 uparam(2)= e
277 uparam(3)= e/(one - nu*nu)
278 uparam(4)= nu*uparam(3)
279 uparam(5)= g
280 uparam(6)= nu
281 DO j=1,nfunc
282 uparam(6 + j)= rate(j)
283 ENDDO
284 DO j=1,nfunc
285 uparam(nfunc + 6+j)= yfac(j)
286 ENDDO
287 uparam(2*nfunc + 7) = epsmax
288 uparam(2*nfunc + 8) = epsr1
289 uparam(2*nfunc + 9) = epsr2
290 uparam(2*nfunc + 10)= two*g
291 uparam(2*nfunc + 11)= three*g
292 uparam(2*nfunc + 12)= c1
293 uparam(2*nfunc + 13)= soundsp
294 uparam(2*nfunc + 14)= fisokin
295 uparam(2*nfunc + 15)= epsf
296 IF (ipfun == 0) THEN
297 uparam(2*nfunc + 16) = 0
298 ELSE
299 uparam(2*nfunc + 16) = mfunc
300 ENDIF
301 uparam(2*nfunc + 17) = pscale
302
303 uparam(2*nfunc + 18) = sqrt(e/(one - nu*nu)/rho0)
304 uparam(2*nfunc + 19) = nu / (one-nu)
305 uparam(2*nfunc + 20) = three / (one+nu)
306 uparam(2*nfunc + 21) = one / (one-nu)
307
308 IF (ifunce > 0 ) opte = 1
309 mfunc = mfunc + 1
310 ifunc(mfunc) = ifunce
311 uparam(2*nfunc + 22) = mfunc
312 uparam(2*nfunc + 23) = opte
313 uparam(2*nfunc + 24) = einf
314 uparam(2*nfunc + 25) = ce
315 uparam(2*nfunc + 26) = vp
316 uparam(2*nfunc + 27) = ifail
317 uparam(2*nfunc + 28) = yldcheck
318 uparam(2*nfunc + 29) = ismooth
319
320 nuparam = 2*nfunc + 29
321
322 IF (rhor == zero) rhor=rho0
323 pm(1) = rhor
324 pm(89)= rho0
325 pm(27)= sqrt(e/rho0)
326
327 parmat(1) = c1
328 parmat(2) = e
329 parmat(3) = nu
330 parmat(4) = israte
331 parmat(5) = fcut
332
333 parmat(7) = epsr1
334 parmat(8) = epsr2
335 parmat(9) = epsf
336
337 parmat(16) = 2
338 parmat(17) = two*g/(c1+four_over_3*g)
339
340 nuvar = 0
341 IF (vp == 1) THEN
342 nuvar = 3
343 ENDIF
344 nvartmp = 2+ nfunc
345
346 mtag%G_EPSD = 1
347 mtag%L_EPSD = 1
348 mtag%G_PLA = 1
349 mtag%L_PLA = 1
350 IF (fisokin /= zero) THEN
351 mtag%L_SIGB = 6
352 ENDIF
353
357
362
363
365
366 WRITE(iout,1001) trim(titr),
id,36
367 WRITE(iout,1000)
368 IF (is_encrypted)THEN
369 WRITE(iout,'(5X,A,//)')'CONFIDENTIAL DATA'
370 ELSE
371 WRITE(iout,1002) rho0
372 WRITE(iout,1100) e,nu,epsmax,epsr1,epsr2
373 WRITE(iout,1200)(ifunc(j),yfac(j),rate(j),j=1,nfunc)
374 WRITE(iout,1300) ipfun,pscale, ifunce,einf,ce
375 WRITE(iout,*)' '
376 ENDIF
377
378 RETURN
379
380 1000 FORMAT(
381 & 5x,' TABULATED ELASTIC PLASTIC LAW 36 ',/,
382 & 5x,' -------------------------------- ' ,//)
383 1001 FORMAT(/
384 & 5x,a,/,
385 & 5x,'MATERIAL NUMBER . . . . . . . . . . . . . .=',i10/,
386 & 5x,'MATERIAL LAW. . . . . . . . . . . . . . . .=',i10/)
387 1002 FORMAT(
388 & 5x,'INITIAL DENSITY . . . . . . . . . . . . . .=',1pg20.13/)
389 1100 FORMAT(
390 & 5x,'YOUNG MODULUS . . . . . . . . . . . . . . .=',1pg20.13/
391 & 5x,'POISSON RATIO . . . . . . . . . . . . . . .=',1pg20.13/
392 & 5x,'MAXIMUM PLASTIC STRAIN . . . . . . . . . .=',1pg20.13/
393 & 5x,'TENSION FAILURE STRAIN 1 . . . . . . . . .=',1pg20.13/
394 & 5x,'TENSION FAILURE STRAIN 2 . . . . . . . . .=',1pg20.13/
395 & 5x,'MAXIMUM TENSION FAILURE STRAIN . . . . . .=',1pg20.13/
396 & 5x,'ISO-KINEMATIC HARDENING FACTOR. . . . . . .=',1pg20.13/
397 & 5x,'SMOOTH STRAIN RATE OPTION . . . . . . . . .=',i10/
398 & 5x,' 0 -> NO SMOOTHING ',/,
399 & 5x,' 1 -> SMOOTH + LINEAR INTERPOLATION ',/,
400 & 5x,' 2 -> SMOOTH + LOG_N INTERPOLATION ',/
401 & 5x,'STRAIN RATE CUTTING FREQUENCY . . . . . . .=',1pg20.13/
402 & 5x,'PLASTIC STRAIN RATE DEPENDENCY FLAG . . . .=',i10/
403 & 5x,' FLAG_PL = 0 -> TOTAL SR DEPENDENCY ',/,
404 & 5x,' FLAG_PL = 1 -> PLASTIC SR DEPENDENCY ',/,
405 & 5x,'STRAIN RATE INTERPOLATION FLAG. . . . . . .=',i10/)
406 1200 FORMAT(
407 & 5x,'YIELD STRESS FUNCTION NUMBER. . . . . . . .=',i10/
408 & 5x,'YIELD SCALE FACTOR. . . . . . . . . . . . .=',1pg20.13/
409 & 5x,'STRAIN RATE . . . . . . . . . . . . . . . .=',1pg20.13)
410 1300 FORMAT(
411 & 5x,'PRESSURE DEPENDENT YIELD FUNCTION . . . . .=',i10/
412 & 5x,'PRESSURE SCALE FACTOR . . . . . . . . . . .=',1pg20.13/
413 & 5x,'YOUNG MODULUS SCALE FACTOR FUNCTION . . . .=',i10/
414 & 5x,'YOUNG MODULUS EINF. . . . . . . . . . . . .=',1pg20.13/
415 & 5x,'PARAMETER CE. . . . . . . . . . . . . . . .=',1pg20.13)
416
417 RETURN
subroutine hm_get_float_array_index(name, rval, index, is_available, lsubmodel, unitab)
subroutine hm_get_float_array_index_dim(name, dim_fac, index, is_available, lsubmodel, unitab)
subroutine hm_get_floatv(name, rval, is_available, lsubmodel, unitab)
subroutine hm_get_floatv_dim(name, dim_fac, is_available, lsubmodel, unitab)
subroutine hm_get_int_array_index(name, ival, index, is_available, lsubmodel)
subroutine hm_get_intv(name, ival, is_available, lsubmodel)
subroutine hm_option_is_encrypted(is_encrypted)
subroutine init_mat_keyword(matparam, keyword)
integer, parameter nchartitle
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)