46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
69 USE matparam_def_mod
71
72
73
74#include "implicit_f.inc"
75
76
77
78#include "units_c.inc"
79#include "param_c.inc"
80
81
82
83 TYPE (UNIT_TYPE_),INTENT(IN) ::UNITAB
84 my_real,
INTENT(INOUT) :: pm(npropm),parmat(100),uparam(maxuparam)
85 INTEGER, INTENT(INOUT) :: IPM(NPROPMI),ISRATE,IFUNC(MAXFUNC),NFUNC,MAXFUNC,MAXUPARAM,NUPARAM, NUVAR,IMATVIS
86 TYPE(MLAW_TAG_),INTENT(INOUT) :: MTAG
87 INTEGER,INTENT(IN) :: MAT_ID
88 CHARACTER(LEN=NCHARTITLE) ,INTENT(IN) :: TITR
89 TYPE(SUBMODEL_DATA),INTENT(IN) :: LSUBMODEL(*)
90 TYPE(MATPARAM_STRUCT_) ,INTENT(INOUT) ::
91
92
93
95 . k,nu,g,rate(maxfunc+1),visc, viscv,expo,hys,
96 . rho0,rhor,bulk,emax,fcut,a1,a2,aa,yfac(maxfunc+1),yfac_unl,
97 . shape,gs,e,zep495,yfac_unl_unit,yfac_unit
98 integer
99 . j,i, ii,iunload,iflag,ietang,istif,i2017_2,
nl,ifunc0(maxfunc),
100 . ifunc_unload,itens,iunl_for,icase,iadd,ilaw
101
102 LOGICAL IS_AVAILABLE,IS_ENCRYPTED
103
104
105
106 is_encrypted = .false.
107 is_available = .false.
108 istif = 0
109 ipm(3) = 1
110 imatvis = 1
111 zep495 = zep4 + nine*em02 + five*em03
112 iadd = 0
113 ilaw = 88
114
116
117 CALL hm_get_floatv(
'MAT_RHO' ,rho0 ,is_available, lsubmodel, unitab)
118 CALL hm_get_floatv(
'Refer_Rho' ,rhor ,is_available, lsubmodel
119
120 CALL hm_get_floatv(
'LAW88_Nu' , nu ,is_available, lsubmodel, unitab)
121 CALL hm_get_floatv(
'LAW88_K' , bulk ,is_available, lsubmodel, unitab)
122 CALL hm_get_floatv(
'LAW88_Fcut' , fcut ,is_available, lsubmodel, unitab)
123 CALL hm_get_intv(
'LAW88_Fsmooth', israte ,is_available, lsubmodel)
124 CALL hm_get_intv('law88_nl
' ,NL ,IS_AVAILABLE, LSUBMODEL)
125 !line-3
126 CALL HM_GET_INTV('law88_fct_idunl' ,IFUNC_UNLOAD ,IS_AVAILABLE, LSUBMODEL)
127 CALL HM_GET_FLOATV('law88_fscaleunl' ,YFAC_UNL ,IS_AVAILABLE, LSUBMODEL, UNITAB)
128 CALL HM_GET_FLOATV('law88_hys' ,Hys ,IS_AVAILABLE, LSUBMODEL, UNITAB)
129 CALL HM_GET_FLOATV('law88_shape' ,SHAPE ,IS_AVAILABLE, LSUBMODEL, UNITAB)
130 CALL HM_GET_INTV('law88_tension' ,ITENS ,IS_AVAILABLE, LSUBMODEL)
131
132 IF(RHOR==ZERO)RHOR=RHO0
133 PM(1) =RHOR
134 PM(89)=RHO0
135
136 IF(NL == 0) THEN
137 CALL ANCMSG(MSGID=866,
138 . MSGTYPE=MSGERROR,
139 . ANMODE=ANINFO_BLIND,
140 . I1=MAT_ID,
141 . C1=TITR)
142 ENDIF
143 !--loading function
144 DO I=1,NL
145 CALL HM_GET_INT_ARRAY_INDEX('law88_arr1' ,IFUNC(I) ,I,IS_AVAILABLE, LSUBMODEL)
146 CALL HM_GET_FLOAT_ARRAY_INDEX('law88_arr2' ,YFAC(I) ,I,IS_AVAILABLE, LSUBMODEL, UNITAB)
147 CALL HM_GET_FLOAT_ARRAY_INDEX('law88_arr3' ,RATE(I) ,I,IS_AVAILABLE, LSUBMODEL, UNITAB)
148
149 CALL HM_GET_FLOAT_ARRAY_INDEX_DIM('law88_arr2' ,YFAC_UNIT ,I,IS_AVAILABLE, LSUBMODEL, UNITAB)
150 IF(YFAC(I) == ZERO) YFAC(I) = YFAC_UNIT
151 ENDDO
152
153 CALL HM_GET_FLOATV_DIM('law88_fscaleunl' ,YFAC_UNL_UNIT ,IS_AVAILABLE, LSUBMODEL, UNITAB)
154
155.AND. IF(RATE(1) /= ZERO NL > 1) THEN
156 DO I= NL,1, -1
157 IFUNC(I+1) = IFUNC(I)
158 YFAC(I+1) = YFAC(I)
159 RATE(I+1) = RATE(I)
160 ENDDO
161 IFUNC(1) = IFUNC(2)
162 YFAC(1) = YFAC(2)
163 RATE(1) = ZERO
164 NL = NL + 1
165 DO I=2,NL
166 IF(RATE(I) < RATE(I-1) ) THEN
167 CALL ANCMSG(MSGID=478,
168 . MSGTYPE=MSGERROR,
169 . ANMODE=ANINFO_BLIND_1,
170 . I1=MAT_ID,
171 . C1=TITR)
172 EXIT
173 ENDIF
174 ENDDO
175 ENDIF
176 NFUNC = NL
177
178 IUNL_FOR = 0
179 ICASE = 0
180 IF(YFAC_UNL == ZERO) YFAC_UNL = YFAC_UNL_UNIT
181 IF(NL == 1) THEN ! no strain rate effect
182 IF(IFUNC_UNLOAD > 0 )THEN
183 NFUNC = NFUNC + 1
184 IFUNC(NFUNC) = IFUNC_UNLOAD
185 YFAC(NFUNC) = YFAC_UNL
186 RATE(NFUNC) = ZERO
187 IUNL_FOR = 1 ! using unloading curve
188 ELSEIF(HYS /= ZERO) THEN
189 IUNL_FOR = 2 ! based on the energy
190 HYS = ABS(HYS)
191 ELSE
192 IUNL_FOR = 0 ! no unloading curve,
193 ENDIF
194 ELSE ! strain rate effect
195 IF(IFUNC_UNLOAD > 0) THEN
196 NFUNC = NFUNC + 1
197 IFUNC(NFUNC) = IFUNC_UNLOAD
198 YFAC(NFUNC) = YFAC_UNL
199 RATE(NFUNC) = ZERO
200 IUNL_FOR = 1 ! using unloading curve
201 ELSEIF(HYS /= ZERO )THEN
202 IUNL_FOR = 3 ! based on the energy
203 HYS = ABS(HYS)
204 ELSE ! using quasistatic curve for unloading
205 NFUNC = NFUNC + 1
206 IFUNC(NFUNC) = IFUNC(1)
207 YFAC(NFUNC) = YFAC(1)
208 RATE(NFUNC) = ZERO
209 IUNL_FOR = 1 ! using unloading curve
210 ENDIF
211 ENDIF
212
213 IF(SHAPE == ZERO) SHAPE = ONE
214 IF(HYS == ZERO) HYS = ONE
215 IF(NU == ZERO) NU = ZEP495
216 GS = THREE_HALF*BULK*(ONE - TWO*NU)/(ONE + NU)
217 E = TWO*GS*(ONE + NU)
218 IF (GS<=0) THEN
219 CALL ANCMSG(MSGID=828,
220 . MSGTYPE=MSGERROR,
221 . ANMODE=ANSTOP,
222 . I1=MAT_ID,
223 . C1=TITR)
224 END IF
225.AND. IF (FCUT == ZERO NL > 1 ) THEN
226 FCUT = EP03*UNITAB%FAC_T_WORK
227 ISRATE = 1
228 ENDIF
229
230 UPARAM(1) = BULK
231 UPARAM(2) = NU
232 UPARAM(3) = GS
233 UPARAM(4) = NL
234 UPARAM(5) = IUNL_FOR
235 UPARAM(6) = HYS
236 UPARAM(7) = SHAPE
237 UPARAM(8) = ITENS
238 UPARAM(9) = ICASE
239 NUPARAM = 9
240
241 DO I=1,NFUNC
242 UPARAM( NUPARAM + 2*I - 1) = RATE(I)
243 UPARAM( NUPARAM + 2*I ) = YFAC(I)
244 ENDDO
245 NUPARAM = NUPARAM + 2*NFUNC
246 UPARAM(NUPARAM + 1 : NUPARAM + 5) = ZERO
247 NUPARAM = NUPARAM + 5 ! used inside law88_upd.F but not used in engine
248
249 NUVAR = 32
250
251 PARMAT(1) = TWO*GS
252 PARMAT(2) = E
253 PARMAT(3) = NU
254 PARMAT(4) = ISRATE
255 PARMAT(5) = FCUT
256
257 PARMAT(16) = 2
258 PARMAT(17) = TWO*GS/(BULK + FOUR_OVER_3*GS)
259
260 ! MTAG variable activation
261 MTAG%L_EPSD = 1
262 MTAG%G_EPSD = 1
263
264 CALL INIT_MAT_KEYWORD(MATPARAM,"INCOMPRESSIBLE")
265 CALL INIT_MAT_KEYWORD(MATPARAM,"TOTAL")
266 CALL INIT_MAT_KEYWORD(MATPARAM,"HOOK")
267 ! Properties compatibility
268 CALL INIT_MAT_KEYWORD(MATPARAM,"SOLID_ISOTROPIC")
269 CALL INIT_MAT_KEYWORD(MATPARAM,"SHELL_ISOTROPIC")
270
271 WRITE(IOUT,1010) TRIM(TITR),MAT_ID,88
272 WRITE(IOUT,1000)
273 IF(IS_ENCRYPTED)THEN
274 WRITE(IOUT,'(5x,a,//)')'confidential data'
275 ELSE
276 WRITE(IOUT,1020)RHO0
277 WRITE(IOUT,1100)NU,BULK,ITENS,NL-IADD
278 WRITE(IOUT,1200)(IFUNC(I),YFAC(I),RATE(I),I=1+IADD,NL)
279 WRITE(IOUT,1250) ISRATE,FCUT
280 IF(IUNL_FOR == 1) THEN
281 II = NL
282 WRITE(IOUT,1300)IFUNC(NFUNC),YFAC_UNL
283.or. ELSEIF(IUNL_FOR == 2 IUNL_FOR == 3) THEN
284 write(IOUT,1400) HYS, SHAPE
285 ENDIF
286 WRITE(IOUT,1500) ITENS
287 ENDIF
288
289 RETURN
290
291 1000 FORMAT
292 & (5X,'tabulated ogden material law-(law88)
',/,
293 & 5X,'------------------------------------',//)
294 1010 FORMAT(/
295 & 5X,A,/,
296 & 5X,'material number. . . . . . . . . . . . . .=',I10/,
297 & 5X,'material law . . . . . . . . . . . . . . .=',I10/)
298 1020 FORMAT(
299 & 5X,'initial density. . . . . . . . . . . . . .=',1PG20.13/)
300 1100 FORMAT
301 &(5X,'poisson ratio. . . . . . . . . . . . . . =',1PG20.13/
302 &,5X,'bulk modulus. . . . . . . . . . . . . . . =',1PG20.13/
303 &,5X,'strain rate effect flag . .. . . . . . . =',I10/
304 &,5X,'number of loading FUNCTION . . .. . . . .=',I10//)
305 1200 FORMAT(
306 & 5X,'loading stress-strain function number. . .=',I10/
307 & 5X,'stress scale factor. . . . . . . . . . . .=',1PG20.13/
308 & 5X,'strain rate . . . . . . . . . . . . . . . =',1PG20.13)
309 1250 FORMAT(
310 & 5X,'strain rate filtering flag. . . . . . . . =',I10/
311 & 5X,'strain rate filtering cutoff frequency. . =',1PG20.13/)
312 1300 FORMAT(
313 & 5X,'unloading stress-strain function number. .=',I10/
314 & 5X,'stress scale factor. . . . . . . . . . . .=',1PG20.13/)
315 1400 FORMAT
316 &(5X,'hysteretic unloading factor. . . . . . . =',1PG20.13/
317 &,5X,'shape unloading factor. . . . . . . . . . =',1PG20.13//)
318 1500 FORMAT
319 &(5X,'itension : parameter
for unloading . . . .=
',I10/)
320
321 RETURN
322
323
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)
for(i8=*sizetab-1;i8 >=0;i8--)
integer, parameter nchartitle
character *2 function nl()
subroutine tabulated(iflag, nel, pm, off, eint, mu, espe, dvol, df, vnew, mat, psh, pnew, dpdm, dpde, npf, tf)