44
45
46
47 USE visc_param_mod
53
54
55
56#include "implicit_f.inc"
57
58
59
60#include "units_c.inc"
61
62
63
64 INTEGER ,INTENT(IN) :: IVISC
65 INTEGER ,INTENT(IN) :: NTABLE
66 INTEGER ,INTENT(IN) :: MAT_ID
67 TYPE (VISC_PARAM_) ,INTENT(INOUT) :: VISC
68 TYPE (UNIT_TYPE_) ,INTENT(IN) :: UNITAB
69 TYPE (SUBMODEL_DATA),INTENT(IN) :: LSUBMODEL(*)
70 TYPE (TTABLE) ,INTENT(INOUT) :: TABLE(NTABLE)
71
72
73
74 INTEGER :: I,NUPARAM,NIPARAM,NPRONY,NUVAR,IFLAG,IMOD,ITAB,ISHAPE,
75 . FctID_G,FctID_K,FctID_Gs,FctID_Ks,FctID_Gl,FctID_Kl
76 my_real :: g(100),beta(100),k(100),betak(100)
77 my_real :: kv,costfg,costfk,derivg,derivk,ginfini,kinfini,
78 . xgscale,xkscale,xgscale_unit,xkscale_unit,
79 . ygscale,ykscale,ygscale_unit,ykscale_unit,
80 . xgs_scale,ygs_scale,xgs_scale_unit,ygs_scale_unit,
81 . xgl_scale,ygl_scale,xgl_scale_unit,ygl_scale_unit,
82 . xks_scale,yks_scale,xks_scale_unit,yks_scale_unit,
83 . xkl_scale,ykl_scale,xkl_scale_unit,ykl_scale_unit
84
85 LOGICAL :: IS_AVAILABLE,IS_ENCRYPTED
86
87 is_encrypted = .false.
88 is_available = .false.
89
91
92 visc%ILAW = ivisc
93
94
95 g(1:100) = zero
96 beta(1:100) = zero
97 k(1:100) = zero
98 betak(1:100) = zero
99
100
101
102
103 CALL hm_get_intv (
'Model_Order' ,nprony ,is_available,lsubmodel)
104 CALL hm_get_floatv (
'MAT_K' ,kv ,is_available,lsubmodel,unitab)
105 CALL hm_get_intv (
'MAT_Itab' ,itab ,is_available,lsubmodel)
106 IF (itab > 2) itab = 0
107 CALL hm_get_intv (
'MAT_Ishape' ,ishape ,is_available,lsubmodel)
108
109 IF (nprony == 0)
CALL ancmsg(msgid=2026,msgtype=msgerror,
110 . anmode=aninfo_blind_1,i1=mat_id)
111
112 IF (ishape > 1) ishape = 0
113
114
115
116
117
118
119 IF (itab == 1) THEN
120
121
122
123 CALL hm_get_intv (
'Fct_G' ,fctid_g,is_available,lsubmodel)
124 CALL hm_get_floatv (
'XGscale',xgscale,is_available,lsubmodel,unitab)
125 IF (xgscale == zero) THEN
127 xgscale = one * xgscale_unit
128 ENDIF
129 CALL hm_get_floatv (
'YGscale',ygscale ,is_available,lsubmodel,unitab)
130 IF (ygscale == zero) THEN
132 ygscale = one * ygscale_unit
133 ENDIF
134
135
136
137 CALL hm_get_intv (
'Fct_K' ,fctid_k,is_available,lsubmodel)
138 CALL hm_get_floatv (
'XKscale',xkscale,is_available,lsubmodel,unitab)
139 IF (xkscale == zero) THEN
141 xkscale = one * xkscale_unit
142 ENDIF
143 CALL hm_get_floatv (
'YKscale',ykscale ,is_available,lsubmodel,unitab)
144 IF (ykscale == zero) THEN
146 YKscale = ONE * YKscale_UNIT
147 ENDIF
148 !----------------------------------------------------------------------------------------
149 ! Fit Prony series parameters to approximate tabulated functions by Least Squares method
150 !----------------------------------------------------------------------------------------
151.AND. IF ((FctID_G > 0)(NPRONY > 0)) THEN
152 CALL LM_LEAST_SQUARE_PRONY(MAT_ID ,NPRONY ,TABLE ,FctID_G ,XGscale ,YGscale ,
153 . G ,BETA ,COSTFG ,DERIVG ,ISHAPE ,GINFINI )
154 ENDIF
155.AND..AND. IF ((FctID_K > 0)(KV == ZERO)(NPRONY > 0)) THEN
156 CALL LM_LEAST_SQUARE_PRONY(MAT_ID ,NPRONY ,TABLE ,FctID_K ,XKscale ,YKscale ,
157 . K ,BETAK ,COSTFK ,DERIVK ,ISHAPE ,KINFINI )
158 ENDIF
159 ! -> Itab = 2 ! loss and storage moduli as functions of frequencies
160 ELSEIF (ITAB == 2) THEN
161 !----------------------------------------------------------------------------------
162 ! -> Shear storage modulus VS frequency
163 !----------------------------------------------------------------------------------
164 CALL HM_GET_INTV ('fct_gs' ,FctID_Gs ,IS_AVAILABLE,LSUBMODEL)
165 CALL HM_GET_FLOATV ('xgs_scale' ,XGs_scale ,IS_AVAILABLE,LSUBMODEL,UNITAB)
166 IF (XGs_scale == ZERO) THEN
167 CALL HM_GET_FLOATV_DIM('xgs_scale',XGs_scale_UNIT,IS_AVAILABLE, LSUBMODEL, UNITAB)
168 XGs_scale = ONE * XGs_scale_UNIT
169 ENDIF
170 CALL HM_GET_FLOATV ('ygs_scale' ,YGs_scale ,IS_AVAILABLE,LSUBMODEL,UNITAB)
171 IF (YGs_scale == ZERO) THEN
172 CALL HM_GET_FLOATV_DIM('ygs_scale',YGs_scale_UNIT,IS_AVAILABLE, LSUBMODEL, UNITAB)
173 YGs_scale = ONE * YGs_scale_UNIT
174 ENDIF
175 !----------------------------------------------------------------------------------
176 ! -> Shear loss modulus VS frequency
177 !----------------------------------------------------------------------------------
178 CALL HM_GET_INTV ('fct_gl' ,FctID_Gl ,IS_AVAILABLE,LSUBMODEL)
179 CALL HM_GET_FLOATV ('xgl_scale' ,XGl_scale ,IS_AVAILABLE,LSUBMODEL,UNITAB)
180 IF (XGl_scale == ZERO) THEN
181 CALL HM_GET_FLOATV_DIM('xgl_scale',XGl_scale_UNIT,IS_AVAILABLE, LSUBMODEL, UNITAB)
182 XGl_scale = ONE * XGl_scale_UNIT
183 ENDIF
184 CALL HM_GET_FLOATV ('ygl_scale' ,YGl_scale ,IS_AVAILABLE,LSUBMODEL,UNITAB)
185 IF (YGl_scale == ZERO) THEN
186 CALL HM_GET_FLOATV_DIM('ygl_scale',YGl_scale_UNIT,IS_AVAILABLE, LSUBMODEL, UNITAB)
187 YGl_scale = ONE * YGl_scale_UNIT
188 ENDIF
189 !----------------------------------------------------------------------------------
190 ! -> Bulk storage modulus VS frequency
191 !----------------------------------------------------------------------------------
192 CALL HM_GET_INTV ('fct_ks' ,FctID_Ks ,IS_AVAILABLE,LSUBMODEL)
193 CALL HM_GET_FLOATV ('xks_scale' ,XKs_scale ,IS_AVAILABLE,LSUBMODEL,UNITAB)
194 IF (XKs_scale == ZERO) THEN
195 CALL HM_GET_FLOATV_DIM('xks_scale',XKs_scale_UNIT,IS_AVAILABLE, LSUBMODEL, UNITAB)
196 XKs_scale = ONE * XKs_scale_UNIT
197 ENDIF
198 CALL HM_GET_FLOATV ('yks_scale' ,YKs_scale ,IS_AVAILABLE,LSUBMODEL,UNITAB)
199 IF (YKs_scale == ZERO) THEN
200 CALL HM_GET_FLOATV_DIM('yks_scale',YKs_scale_UNIT,IS_AVAILABLE, LSUBMODEL, UNITAB)
201 YKs_scale = ONE * YKs_scale_UNIT
202 ENDIF
203 !----------------------------------------------------------------------------------
204 ! -> Bulk loss modulus VS frequency
205 !----------------------------------------------------------------------------------
206 CALL HM_GET_INTV ('fct_kl' ,FctID_Kl ,IS_AVAILABLE,LSUBMODEL)
207 CALL HM_GET_FLOATV ('xkl_scale' ,XKl_scale ,IS_AVAILABLE,LSUBMODEL,UNITAB)
208 IF (XKl_scale == ZERO) THEN
209 CALL HM_GET_FLOATV_DIM('xkl_scale',XKl_scale_UNIT,IS_AVAILABLE, LSUBMODEL, UNITAB)
210 XKl_scale = ONE * XKl_scale_UNIT
211 ENDIF
212 CALL HM_GET_FLOATV ('ykl_scale' ,YKl_scale ,IS_AVAILABLE,LSUBMODEL,UNITAB)
213 IF (YKl_scale == ZERO) THEN
214 CALL HM_GET_FLOATV_DIM('ykl_scale',YKl_scale_UNIT,IS_AVAILABLE, LSUBMODEL, UNITAB)
215 YKl_scale = ONE * YKl_scale_UNIT
216 ENDIF
217 !----------------------------------------------------------------------------------------
218 ! Fit Prony series parameters to approximate tabulated functions by Least Squares method
219 !----------------------------------------------------------------------------------------
220.AND..AND. IF ((FctID_Gs > 0)(FctID_Gl > 0)(NPRONY > 0)) THEN
221 CALL LM_LEAST_SQUARE_PRONY_2(MAT_ID ,NPRONY ,TABLE ,FctID_Gs ,XGs_scale,YGs_scale,
222 . FctID_Gl ,XGl_scale,YGl_scale,G ,BETA ,COSTFG ,
223 . DERIVG ,ISHAPE ,GINFINI )
224 ENDIF
225.AND..AND..AND. IF ((FctID_Ks > 0)(FctID_Kl > 0)(NPRONY > 0)(KV == ZERO)) THEN
226 CALL LM_LEAST_SQUARE_PRONY_2(MAT_ID ,NPRONY ,TABLE ,FctID_Ks ,XKs_scale,YKs_scale,
227 . FctID_Kl ,XKl_scale,YKl_scale,K ,BETAK ,COSTFK ,
228 . DERIVK ,ISHAPE ,KINFINI )
229 ENDIF
230 ! =======================================================================================
231 ! Classical input
232 ! =======================================================================================
233 ! -> Itab = 0 ! classical input of prony series
234 ELSE
235 ISHAPE = 0
236 IF(NPRONY > 0) THEN
237 DO I=1,NPRONY
238 CALL HM_GET_FLOAT_ARRAY_INDEX('fport1' ,G(I) ,I,IS_AVAILABLE,LSUBMODEL,UNITAB)
239 CALL HM_GET_FLOAT_ARRAY_INDEX('fporp1' ,BETA(I) ,I,IS_AVAILABLE,LSUBMODEL,UNITAB)
240 CALL HM_GET_FLOAT_ARRAY_INDEX('ki' ,K(I) ,I,IS_AVAILABLE,LSUBMODEL,UNITAB)
241 CALL HM_GET_FLOAT_ARRAY_INDEX('beta_ki',BETAK(I),I,IS_AVAILABLE,LSUBMODEL,UNITAB)
242 ENDDO
243 ENDIF
244 ENDIF
245
246 ! Taking into account the infinite value shape (+ 1 prony function with beta = 0)
247.AND. IF ((ITAB /= 0) (ISHAPE == 1)) THEN
248 NPRONY = NPRONY + 1
249 ENDIF
250
251
252
253
254 NUVAR = 7*NPRONY
255 NIPARAM = 2
256 NUPARAM = 4*NPRONY + 1
257 ALLOCATE (VISC%UPARAM(NUPARAM))
258 ALLOCATE (VISC%IPARAM(NIPARAM))
259 VISC%NUVAR = NUVAR
260 VISC%NUPARAM = NUPARAM
261 VISC%NIPARAM = NIPARAM
262
263 IMOD = 0
264 VISC%UPARAM(1) = KV
265 DO I=1,NPRONY
266 VISC%UPARAM(1 + I) = G(I)
267 VISC%UPARAM(1 + NPRONY + I) = BETA(I)
268 VISC%UPARAM(1 + 2*NPRONY + I) = K(I)
269 VISC%UPARAM(1 + 3*NPRONY + I) = BETAK(I)
270 IF (K(I) > ZERO) IMOD = 1
271 ENDDO
272 VISC%IPARAM(1) = NPRONY
273 VISC%IPARAM(2) = IMOD
274
275
276
277 IF (IS_ENCRYPTED)THEN
278 WRITE(IOUT,'(5x,a,//)')'confidential data'
279 ELSE
280
281 IF(NPRONY > 0) THEN
282 WRITE(IOUT,1000)
283 IF(IMOD == 0) THEN
284 WRITE(IOUT,1100) KV,NPRONY-ISHAPE
285 IF (ITAB > 0) THEN
286 WRITE(IOUT,1500) ITAB,ISHAPE
287 IF (ISHAPE == 1) WRITE(IOUT,3000) GINFINI
288 IF (ITAB == 1) THEN
289 WRITE(IOUT,1600) FctID_G,XGscale,YGscale,COSTFG,DERIVG
290 ELSEIF (ITAB == 2) THEN
291 WRITE(IOUT,2000) FctID_Gs,XGs_scale,YGs_scale,
292 . FctID_Gl,XGl_scale,YGl_scale,
293 . COSTFG,DERIVG
294 ENDIF
295 ENDIF
296 DO I=1,NPRONY-ISHAPE
297 WRITE(IOUT,1150) I
298 WRITE(IOUT,1200) G(I+ISHAPE),BETA(I+ISHAPE)
299 ENDDO
300 ELSE
301 WRITE(IOUT,1300) NPRONY-ISHAPE
302 IF (ITAB > 0) THEN
303 WRITE(IOUT,1500) ITAB,ISHAPE
304 IF (ITAB == 1) THEN
305 IF (ISHAPE == 1) WRITE(IOUT,3000) GINFINI
306 WRITE(IOUT,1600) FctID_G,XGscale,YGscale,COSTFG,DERIVG
307 IF (ISHAPE == 1) WRITE(IOUT,3500) KINFINI
308 WRITE(IOUT,1800) FctID_K,XKscale,YKscale,COSTFK,DERIVK
309 ELSEIF (ITAB == 2) THEN
310 IF (ISHAPE == 1) WRITE(IOUT,3000) GINFINI
311 WRITE(IOUT,2000) FctID_Gs,XGs_scale,YGs_scale,
312 . FctID_Gl,XGl_scale,YGl_scale,
313 . COSTFG,DERIVG
314 IF (ISHAPE == 1) WRITE(IOUT,3500) KINFINI
315 WRITE(IOUT,2500) FctID_Ks,XKs_scale,YKs_scale,
316 . FctID_Kl,XKl_scale,YKl_scale,
317 . COSTFK,DERIVK
318 ENDIF
319 ENDIF
320 DO I=1,NPRONY-ISHAPE
321 WRITE(IOUT,1150) I
322 WRITE(IOUT,1200) G(I+ISHAPE),BETA(I+ISHAPE)
323 WRITE(IOUT,1400) K(I+ISHAPE),BETAK(I+ISHAPE)
324 ENDDO
325 ENDIF
326 ENDIF
327 ENDIF
328
329 1000 FORMAT(
330 & 5X,' prony series model :' ,/,
331 & 5X,' --------------------- ' ,/)
332 1100 FORMAT(
333 & 5X,'bulk modulus
for visco elastic material . . . . . . . . . . . . . . . =
',1PG20.13/
334 & 5X,'order of prony series . . . . . . . . . . . . . . . . . . . . . . . . =',I10/)
335 1150 FORMAT(
336 & 5X,' ----------------------------------------------------------------------'/
337 & 5X,' parameters
for prony
FUNCTION number #
',I10/
338 & 5X,' ----------------------------------------------------------------------'/)
339 1200 FORMAT(
340 & 5X,'shear relaxation g modulus . . . . . . . . . . . . . . . . . . . . . = '1PG20.13/
341 & 5X,'beta decay shear modulus . . . . . . . . . . . . . . . . . . . . . . =',1PG20.13)
342 1300 FORMAT(
343 & 5X,'order of prony series . . . . . . . . . . . . . . . . . . . . . . . . =',I10//)
344 1400 FORMAT(
345 & 5X,'bulk relaxation k modulus . . . . . . . . . . . . . . . . . . . . . . = '1PG20.13/
346 & 5X,'betak decay bulk modulus . . . . . . . . . . . . . . . . . . . . . . =',1PG20.13//)
347 1500 FORMAT(
348 & 5X,'tabulated prony series flag . . . . . . . . . . . . . . . . . . . . .=
',I10/
349 & 5X,' itab=1 fitting from modulus vs time curves'/
350 & 5X,' itab=2 fitting from storage and loss moduli vs frequency curves'/
351 & 5X,'shape prony series flag . . . . . . . . . . . . . . . . . . . . . . .=',I10/
352 & 5X,' ishape=0 without infinite modulus (DEFAULT)'/
353 & 5X,' ishape=1 with infinite modulus'/)
354 1600 FORMAT(
355 & 5X,'least square fitting from shear modulus g function
id. . . . . . . . .=
'I10/
356 & 5X,'time scale factor
for shear modulus . . . . . . . . . . . . . . . . .=
'1PG20.13/
357 & 5X,'scale factor
for shear modulus . . . . . . . . . . . . . . . . . . . .=
'1PG20.13/
358 & 5X,'final cost function value . . . . . . . . . . . . . . . . . . . . . .= '1PG20.13/
359 & 5X,'final derivative value . . . . . . . . . . . . . . . . . . . . . . . .= '1PG20.13/)
360 1800 FORMAT(
361 & 5X,'least square fitting from bulk modulus k function
id . . . . . . . . .=
'I10/
362 & 5X,'time scale factor
for bulk modulus . . . . . . . . . . . . . . . . . .=
'1PG20.13/
363 & 5X,'scale factor
for bulk modulus . . . . . . . . . . . . . . . . . . . .=
'1PG20.13/
364 & 5X,'final cost function value . . . . . . . . . . . . . . . . . . . . . .= '1PG20.13/
365 & 5X,'final derivative value . . . . . . . . . . . . . . . . . . . . . . . .= '1PG20.13/)
366 2000 FORMAT(
367 & 5X,'least square fitting from storage shear modulus gl function
id . . . .=
'I10/
368 & 5X,'frequency scale factor
for storage shear modulus . . . . . . . . . . .= '1pg20.13/
369 & 5x,'SCALE FACTOR FOR STORAGE SHEAR MODULUS . . . . . . . . . . . . . . . .= '1pg20.13/
370 & 5x,'LEAST SQUARE FITTING FROM LOSS SHEAR MODULUS GS FUNCTION ID . . . . .= 'i10/
371 & 5x,'FREQUENCY SCALE FACTOR FOR LOSS SHEAR MODULUS . . . . . . . . . . . .= '1pg20.13/
372 & 5x,'SCALE FACTOR FOR LOSS SHEAR MODULUS FUNCTION . . . . . . . . . . . . .= '1pg20.13/
373 & 5x,'FINAL COST FUNCTION VALUE . . . . . . . . . . . . . . . . . . . . . .= '1pg20.13/
374 & 5x,'FINAL DERIVATIVE VALUE . . . . . . . . . . . . . . . . . . . . . . . .= '1pg20.13/)
375 2500 FORMAT(
376 & 5x,'LEAST SQUARE FITTING FROM STORAGE BULK MODULUS KL FUNCTION ID . . . .= 'i10/
377 & 5x,'FREQUENCY SCALE FACTOR FOR STORAGE BULK MODULUS . . . . . . . . . . .= '1pg20.13/
378 & 5x,'SCALE FACTOR FOR STORAGE BULK MODULUS . . . . . . . . . . . . . . . .= '1pg20.13/
379 & 5x,'LEAST SQUARE FITTING FROM LOSS BULK MODULUS GS FUNCTION ID . . . . . .= 'i10/
380 & 5x,'FREQUENCY SCALE FACTOR FOR LOSS BULK MODULUS . . . . . . . . . . . . .= '1pg20.13/
381 & 5x,'SCALE FACTOR FOR LOSS BULK MODULUS FUNCTION . . . . . . . . . . . . .= '1pg20.13/
382 & 5x,'FINAL COST FUNCTION VALUE . . . . . . . . . . . . . . . . . . . . . .= '1pg20.13/
383 & 5x,'FINAL DERIVATIVE VALUE . . . . . . . . . . . . . . . . . . . . . . . .= '1pg20.13/)
384 3000 FORMAT(
385 & 5x,'SHEAR MODULUS INFINITE VALUE GINF . . . . . . . . . . . . . . . . . .= '1pg20.13/)
386 3500 FORMAT(
387 & 5x,'BULK MODULUS INFINITE VALUE KINF . . . . . . . . . . . . . . . . . . .= '1pg20.13/)
388
389 RETURN
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_intv(name, ival, is_available, lsubmodel)
subroutine hm_option_is_encrypted(is_encrypted)
for(i8=*sizetab-1;i8 >=0;i8--)
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)
subroutine tabulated(iflag, nel, pm, off, eint, mu, espe, dvol, df, vnew, mat, psh, pnew, dpdm, dpde, npf, tf)