56#include "implicit_f.inc"
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
69TYPE (SUBMODEL_DATA),
INTENT(IN) :: LSUBMODEL(*)
70 TYPE (TTABLE) ,
INTENT(INOUT) :: TABLE(NTABLE)
74 INTEGER :: I,NUPARAM,NIPARAM,NPRONY,NUVAR,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
85 LOGICAL :: IS_AVAILABLE,IS_ENCRYPTED
87 is_encrypted = .false.
88 is_available = .false.
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)
109 IF (nprony == 0)
CALL ancmsg(msgid=2026,msgtype=msgerror,
110 . anmode=aninfo_blind_1,i1=mat_id)
112 IF (ishape > 1) ishape = 0
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
129 CALL hm_get_floatv (
'YGscale',ygscale ,is_available,lsubmodel,unitab)
130 IF (ygscale == zero)
THEN
132 ygscale = one * ygscale_unit
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
143 CALL hm_get_floatv (
'YKscale',ykscale ,is_available,lsubmodel,unitab)
144 IF (ykscale == zero)
THEN
146 ykscale = one * ykscale_unit
151 IF ((fctid_g > 0).AND.(nprony > 0))
THEN
153 . g ,beta ,costfg ,derivg ,ishape ,ginfini )
155 IF ((fctid_k > 0).AND.(kv == zero).AND.(nprony > 0))
THEN
157 . k ,betak ,costfk ,derivk ,ishape ,kinfini )
160 ELSEIF (itab == 2)
THEN
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
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
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
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
193 CALL hm_get_floatv (
'XKs_scale' ,xks_scale ,is_available,lsubmodel
194 IF (xks_scale == zero)
THEN
196 xks_scale = one * xks_scale_unit
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
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
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
220 IF ((fctid_gs > 0).AND.(fctid_gl > 0).AND.(nprony > 0))
THEN
222 . fctid_gl ,xgl_scale,ygl_scale,g ,beta ,costfg ,
223 . derivg ,ishape ,ginfini )
225 IF ((fctid_ks > 0).AND.(fctid_kl > 0).AND.(nprony > 0).AND.(kv == zero))
THEN
227 . fctid_kl ,xkl_scale,ykl_scale,k ,betak ,costfk ,
228 . derivk ,ishape ,kinfini )
247 IF ((itab /= 0) .AND. (ishape == 1))
THEN
256 nuparam = 4*nprony + 1
257 ALLOCATE (visc%UPARAM(nuparam))
258 ALLOCATE (visc%IPARAM(niparam))
260 visc%NUPARAM = nuparam
261 visc%NIPARAM = niparam
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
272 visc%IPARAM(1) = nprony
273 visc%IPARAM(2) = imod
277 IF (is_encrypted)
THEN
278 WRITE(iout,
'(5X,A,//)')
'CONFIDENTIAL DATA'
284 WRITE(iout,1100) kv,nprony-ishape
286 WRITE(iout,1500) itab,ishape
287 IF (ishape == 1)
WRITE(iout,3000) ginfini
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,
298 WRITE(iout,1200) g(i+ishape),beta(i+ishape)
301 WRITE(iout,1300) nprony-ishape
303 WRITE(iout,1500) itab,ishape
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,
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,
322 WRITE(iout,1200) g(i+ishape),beta(i+ishape)
323 WRITE(iout,1400) k(i+ishape),betak(i+ishape)
330 & 5x,
' PRONY SERIES MODEL :' ,/,
331 & 5x,
' --------------------- ' ,/)
333 & 5x,
'BULK MODULUS FOR VISCO ELASTIC MATERIAL . . . . . . . . . . . . . . . =',1pg20.13/
334 & 5x,
'ORDER OF PRONY SERIES . . . . . . . . . . . . . . . . . . . . . . . . =',i10/)
336 & 5x,
' ----------------------------------------------------------------------'/
337 & 5x,
' PARAMETERS FOR PRONY FUNCTION NUMBER #',i10/
338 & 5x,
' ----------------------------------------------------------------------'/)
340 & 5x,
'SHEAR RELAXATION G MODULUS . . . . . . . . . . . . . . . . . . . . . = '1pg20.13/
341 & 5x,
'BETA DECAY SHEAR MODULUS . . . . . . . . . . . . . . . . . . . . . . =',1pg20.13)
343 & 5x,
'ORDER OF PRONY SERIES . . . . . . . . . . . . . . . . . . . . . . . . =',i10//)
345 & 5x,
'BULK RELAXATION K MODULUS . . . . . . . . . . . . . . . . . . . . . . = '1pg20.13/
346 & 5x,
'BETAK DECAY BULK MODULUS . . . . . . . . . . . . . . . . . . . . . . =',1pg20.13//)
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'/)
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/)
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/)
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 . . . . . . . . . . . . . . . . . . . . . .= '
374 & 5x,
'FINAL DERIVATIVE VALUE . . . . . . . . . . . . . . . . . . . . . . . .= '1pg20.13/)
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/)
385 & 5x,
'SHEAR MODULUS INFINITE VALUE GINF . . . . . . . . . . . . . . . . . .= '1pg20.13/)
387 & 5x,
'BULK MODULUS INFINITE VALUE KINF . . . . . . . . . . . . . . . . . . .= '1pg20
403 . G ,BETA ,COST ,DERIV ,ISHAPE ,GINFINI )
412#include "implicit_f.inc"
413#include "com04_c.inc"
419 . xgscale,ygscale,cost,deriv,ginfini
420 my_real,
DIMENSION(100) :: g,beta
425 INTEGER I,II,INFO,SIZE_TIME,NITER
426 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IPIV
428 . ri2,ri2_old,mxvalt,mxvaly,lambda,
429 . jactdy_n2,rho,nu,denom
430 DOUBLE PRECISION,
PARAMETER :: EPS1 = 1.0d-8
431 DOUBLE PRECISION,
PARAMETER :: EPS2 = 1.0d-10
432 DOUBLE PRECISION,
PARAMETER :: ALPHA = 0.5d0
433 DOUBLE PRECISION,
PARAMETER :: MXITER = 10000
434 DOUBLE PRECISION,
DIMENSION(:),
ALLOCATABLE :: XI,FXI,DELTAY,JACTDY,YI,TIME,
435 . xi_tr,fxi_tr,vect,mu
436 DOUBLE PRECISION,
DIMENSION(:,:),
ALLOCATABLE :: JAC,JACTJAC,JACT,ID
437 LOGICAL :: CONV,FOUND
443 IF (table(i)%NOTABLE == fct_id)
THEN
445 size_time =
SIZE(table(i)%X(1)%VALUES)
446 ALLOCATE(yi(size_time),time(size_time))
449 time(ii) = table(i)%X(1)%VALUES(ii)*xgscale
450 yi(ii) = table(i)%Y%VALUES(ii)*ygscale
453 mxvalt = maxval(time)
456 IF (ishape == 1)
THEN
457 ginfini = yi(size_time)/mxvaly
468 CALL ancmsg(msgid=1928,msgtype=msgerror,
469 . anmode=aninfo_blind_1,i1=mat_id,i2=fct_id)
473 IF (2*nprony >= size_time)
THEN
474 CALL ancmsg(msgid=1921,msgtype=msgerror,
475 . anmode=aninfo_blind_1,i1=mat_id,i2=nprony,
476 . i3=size_time,i4=floor(size_time/two))
480 ALLOCATE(xi(2*nprony),xi_tr(2*nprony),jac(size_time,2*nprony),fxi(size_time),
481 . deltay(size_time),jactjac(2*nprony,2*nprony),id(2*nprony,2*nprony),
482 . jactdy(2*nprony),ipiv(2*nprony),jact(2*nprony,size_time),fxi_tr(size_time),
483 . vect(2*nprony),mu(2*nprony))
487 xi(2*i-1) = one/(i+ishape)
501 fxi(i) = fxi(i) + xi(2*ii-1)*exp(-xi(2*ii)*time(i))
502 jac(i,2*ii-1) = -exp(-xi(2*ii)*time(i))
503 jac(i,2*ii) = time(i)*xi(2*ii-1)*exp(-xi(2*ii)*time(i))
509 ri2 = dot_product(deltay,deltay)
520#ifndef WITHOUT_LINALG
521 DO WHILE ((.NOT.conv).AND.(niter<mxiter))
525 jact = transpose(jac)
527 jactjac = matmul(jact,jac)
529 jactjac = jactjac + lambda*id
531 jactdy = -matmul(jact,deltay)
534 CALL dgesv(2*nprony, 1, jactjac, 2*nprony, ipiv, jactdy , 2*nprony, info)
538 IF (sqrt(dot_product(jactdy,jactdy)) <= eps2*(sqrt(dot_product(xi,xi))+eps2))
THEN
545 fxi_tr(i) = fxi_tr(i) + xi_tr(2*ii-1)*exp(-xi_tr(2*ii)*time(i))
550 ri2 = dot_product(yi-fxi_tr,yi-fxi_tr)
553 vect = matmul(jact,deltay)
554 vect = lambda*jactdy - vect
555 denom = dot_product(jactdy,vect)
556 rho = (ri2_old - ri2) /
max(denom,em20)
560 IF ((rho > zero).AND.(info == 0))
THEN
562 lambda = lambda*
max(third,one-(two*rho-one)**3)
567 IF (jactdy(i)>=zero)
THEN
570 mu(i) =
min(one,((one-alpha)/(-jactdy(i)))*xi(i))
572 xi(i) = xi(i) + mu(i)*jactdy(i)
578 fxi(i) = fxi(i) + xi(2*ii-1)*exp(-xi(2*ii)*time(i))
583 ri2 = dot_product(deltay,deltay)
588 jac(i,2*ii-1) = -exp(-xi(2*ii)*time(i))
589 jac(i,2*ii) = time(i)*xi(2*ii-1)*exp(-xi(2*ii)*time(i))
592 jact = transpose(jac)
601 jactdy = two*matmul(jact,deltay)
602 jactdy_n2 = sqrt(dot_product(jactdy,jactdy))
603 IF (jactdy_n2 < eps1) conv = .true.
613 WRITE(6,*)
"Error: Blas/Lapack required"
618 IF (niter == mxiter .OR. .NOT.conv)
THEN
619 CALL ancmsg(msgid=1926,msgtype=msgerror,
620 . anmode=aninfo_blind_1,i1=mat_id)
622 ELSEIF (abs(jactdy_n2)>eps1 .OR. maxval(xi)>ep20 .OR. minval(xi)<em20)
THEN
623 CALL ancmsg(msgid=1927,msgtype=msgwarning,
624 . anmode=aninfo_blind_1,i1=mat_id)
630 IF (ishape == 1)
THEN
631 ginfini = ginfini*mxvaly
636 g(i+ishape) = xi(2*i-1)*mxvaly
637 beta(i+ishape) = xi(2*i)/mxvalt
643 DEALLOCATE(xi,xi_tr,jac,fxi,deltay,jactjac,id,jactdy,ipiv,jact,fxi_tr,vect,yi,time,mu)
658 . FCT_IDL ,XGL_SCALE,YGL_SCALE,G ,BETA ,COST ,
659 . DERIV ,ISHAPE ,GINFINI )
668#include "implicit_f.inc"
669#include "com04_c.inc"
673 INTEGER,
INTENT(IN) :: NPRONY,FCT_IDS,FCT_IDL,MAT_ID,ISHAPE
675 . XGS_SCALE,YGS_SCALE,XGL_SCALE,YGL_SCALE,COST,DERIV,GINFINI
676 my_real,
DIMENSION(100) :: G,BETA
677 TYPE(
ttable) TABLE(NTABLE)
681 INTEGER I,II,INFO,SIZE_FREQ,NITER,ITABS,ITABL,FLAG,
682 . SIZE_FREQS,SIZE_FREQL,K
683 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IPIV,IDX
685 . ri2,ri2_old,lambda,jactdy_n2,
686 . rho,nu,denom,mxfreq,mxnorm
687 DOUBLE PRECISION,
PARAMETER :: EPS1 = 1.0d-8
688 DOUBLE PRECISION,
PARAMETER :: EPS2 = 1.0d-10
689 DOUBLE PRECISION,
PARAMETER :: ALPHA = 0.5d0
690 DOUBLE PRECISION,
PARAMETER :: MXITER = 10000
691 DOUBLE PRECISION,
DIMENSION(:),
ALLOCATABLE :: XI,FXIS,FXIL,DELTAYS,DELTAYL,
692 . jactdy,yis,yil,freq,xi_tr,fxis_tr,
693 . fxil_tr,vect,mu,freqs,freql,yis_temp,
695 DOUBLE PRECISION,
DIMENSION(:,:),
ALLOCATABLE :: JACS,JACL,JACTJAC,JACST,JACLT,ID,WEIGHT
702 IF (table(i)%NOTABLE == fct_ids) itabs = i
703 IF (table(i)%NOTABLE == fct_idl) itabl = i
704 IF (itabs /= 0 .AND. itabl /= 0)
EXIT
707 CALL ancmsg(msgid=1924,msgtype=msgerror,
708 . anmode=aninfo_blind_1,i1=mat_id,i2=fct_ids)
711 CALL ancmsg(msgid=1925,msgtype=msgerror,
712 . anmode=aninfo_blind_1,i1=mat_id,i2=fct_idl)
720 size_freqs =
SIZE(table(itabs)%X(1)%VALUES)
721 size_freql =
SIZE(table(itabl)%X(1)%VALUES)
722 ALLOCATE(freqs(size_freqs),yis_temp(size_freqs),
723 . freql(size_freql),yil_temp(size_freql))
724 freqs(1:size_freqs) = table(itabs)%X(1)%VALUES(1:size_freqs)*xgs_scale
725 yis_temp(1:size_freqs) = table(itabs)%Y%VALUES(1:size_freqs)*ygs_scale
726 freql(1:size_freql) = table(itabl)%X(1)%VALUES(1:size_freql)*xgl_scale
727 yil_temp(1:size_freql) = table(itabl)%Y%VALUES(1:size_freql)*ygl_scale
733 IF (size_freqs == size_freql)
THEN
735 IF (sqrt(dot_product(freqs-freql,freqs-freql))<em08)
THEN
737 size_freq = size_freqs
738 ALLOCATE(freq(size_freq),yis(size_freq),yil(size_freq))
739 mxfreq = maxval(freqs)
741 freq(ii) = freqs(ii)*(hundred/mxfreq)
742 yis(ii) = yis_temp(ii)
743 yil(ii) = yil_temp(ii)
752 IF (size_freq /= size_freql .OR. flag == 1)
THEN
755 size_freq = size_freqs + size_freql
759 IF (abs(freqs(ii)-freql(i))<em08)
THEN
763 IF (flag == 1) size_freq = size_freq - 1
767 ALLOCATE(idx(size_freq),freq(size_freq),yis(size_freq),yil(size_freq))
768 freq(1:size_freqs) = freqs(1:size_freqs)
773 IF (abs(freqs(ii)-freql(i))<em08)
THEN
778 IF (flag == 0) freq(size_freqs+i-k) = freql(i)
785 CALL qsort(freq,idx,1,size_freq)
786 mxfreq = maxval(freq)
787 freq = freq*(hundred/mxfreq)
788 freqs = freqs*(hundred/mxfreq)
789 freql = freql*(hundred/mxfreq)
794 IF (freq(i)<freqs(1))
THEN
795 yis(i) = yis_temp(1) + ((yis_temp(2)-yis_temp(1))/(freqs(2)-freqs(1)))*(freq(i)-freqs(1))
796 ELSEIF (freq(i)>freqs(size_freqs))
THEN
797 yis(i) = yis_temp(size_freqs-1) + ((yis_temp(size_freqs)-yis_temp(size_freqs-1))/
798 . (freqs(size_freqs)-freqs(size_freqs-1)))*(freq(i)-freqs(size_freqs-1))
800 IF (freq(i)>freqs(ii+1))
THEN
802 ii =
min(ii,size_freqs-1)
804 yis(i) = yis_temp(ii) + ((yis_temp(ii+1)-yis_temp(ii))/(freqs(ii+1)-freqs(ii)))*(freq(i)-freqs(ii))
809 IF (freq(i)<freql(1))
THEN
810 yil(i) = yil_temp(1) + ((yil_temp(2)-yil_temp(1))/(freql(2)-freql(1)))*(freq(i)-freql(1))
811 ELSEIF (freq(i)>freql(size_freql))
THEN
812 yil(i) = yil_temp(size_freql-1) + ((yil_temp(size_freql)-yil_temp(size_freql-1))/
813 . (freql(size_freql)-freql(size_freql-1)))*(freq(i)-freql(size_freql-1))
815 IF (freq(i)>freql(ii+1))
THEN
817 ii =
min(ii,size_freql-1)
819 yil(i) = yil_temp(ii) + ((yil_temp(ii+1)-yil_temp(ii))/(freql(ii+1)-freql(ii)))*(freq(i)-freql(ii)
825 IF (2*nprony >= size_freq)
THEN
826 CALL ancmsg(msgid=1921,msgtype=msgerror,
827 . anmode=aninfo_blind_1,i1=mat_id,i2=nprony,
828 . i3=size_freq,i4=int(size_freq/two))
832 ALLOCATE(xi(2*nprony),xi_tr(2*nprony),jacs(size_freq,2*nprony),jacl(size_freq,2*nprony)
833 . fxis(size_freq),fxil(size_freq),deltays(size_freq),deltayl(size_freq),
834 . jactjac(2*nprony,2*nprony),id(2*nprony,2*nprony),jactdy(2*nprony),ipiv(2*nprony),
835 . jacst(2*nprony,size_freq),jaclt(2*nprony,size_freq),fxis_tr(size_freq),
836 . fxil_tr(size_freq),vect(2*nprony),mu(2*nprony),weight(size_freq
840 xi(2*i-1) = yis(1)/(i+ishape)
851 IF (ishape == 1)
THEN
859 mxnorm =
max(maxval(yis),maxval(yil))
861 weight(i,i) = one/(mxnorm**2)
870 fxis(i) = fxis(i) + ((xi(2*ii-1)*(freq(i)**2))/(xi(2*ii)**2 + freq(i)**2))
871 jacs(i,2*ii-1) = -(freq(i)**2)/(xi(2*ii)**2 + freq(i)**2)
872 jacs(i,2*ii) = two*xi(2*ii-1)*xi(2*ii)*(freq(i)**2)/((xi(2*ii)**2 + freq(i)**2)**2)
874 fxil(i) = fxil(i) + ((xi(2*ii-1)*xi(2*ii
875 jacl(i,2*ii-1) = -(freq(i)*xi(2*ii))/(xi(2*ii)**2 + freq(i)**2)
876 jacl(i,2*ii) = xi(2*ii-1)*freq(i)*((xi(2*ii)**2 - freq(i)**2)/(xi(2*ii)**2 + freq(i)**2)**2)
883 ri2 = ((one/mxnorm)**2)*(dot_product(deltays,deltays) + dot_product(deltayl,deltayl))
886 lambda = maxval(jacs) + maxval(jacl)
895#ifndef WITHOUT_LINALG
896 DO WHILE ((.NOT.conv).AND.(niter<mxiter))
900 jacst = transpose(jacs)
901 jaclt = transpose(jacl)
903 jactjac = matmul(jacst,matmul(weight,jacs))
904 jactjac = jactjac + matmul(jaclt,matmul(weight,jacl))
906 jactjac = jactjac + lambda*id
908 jactdy = -matmul(jacst,matmul(weight,deltays))
909 jactdy = jactdy - matmul(jaclt,matmul(weight,deltayl))
912 CALL dgesv(2*nprony, 1, jactjac, 2*nprony, ipiv, jactdy , 2*nprony, info)
916 IF (sqrt(dot_product(jactdy,jactdy)) <= eps2*(sqrt(dot_product(xi,xi))+eps2
THEN
924 fxis_tr(i) = fxis_tr(i) + ((xi_tr(2*ii-1)*(freq(i)**2))/(xi_tr(2*ii)**2 + freq(i)**2))
925 fxil_tr(i) = fxil_tr(i) + ((xi_tr(2*ii-1)*xi_tr(2*ii)*freq(i))/(xi_tr(2*ii)**2 + freq(i)**2))
930 ri2 = ((one/mxnorm)**2)*(dot_product((yis-fxis_tr),(yis-fxis_tr)) +
931 . dot_product((yil-fxil_tr),(yil-fxil_tr)))
934 vect = matmul(jacst,matmul(weight,deltays)) + matmul(jaclt,matmul(weight,deltayl))
935 vect = lambda*jactdy - vect
936 denom = dot_product(jactdy,vect)
937 rho = (ri2_old - ri2) /
max(denom,em20)
941 IF ((rho > zero).AND.(info == 0))
THEN
943 lambda = lambda*
max(third,one-(two*rho-one)**3)
948 IF (jactdy(i)>=zero)
THEN
951 mu(i) =
min(one,((one-alpha)/(-jactdy(i)))*xi(i))
953 xi(i) = xi(i) + mu(i)*jactdy(i)
960 fxis(i) = fxis(i) + ((xi(2*ii-1)*(freq(i)**2))/(xi(2*ii)**2 + freq(i)**2))
961 fxil(i) = fxil(i) + ((xi(2*ii-1)*xi(2*ii)*freq(i))/(xi(2*ii)**2 + freq(i)**2))
967 ri2 = ((one/mxnorm)**2)*(dot_product(deltays,deltays) + dot_product(deltayl,deltayl))
972 jacs(i,2*ii-1) = -(freq(i)**2)/(xi(2*ii)**2 + freq(i)**2)
973 jacs(i,2*ii) = two*xi(2*ii-1)*xi(2*ii)*(freq(i)**2)/((xi(2*ii)**2 + freq(i)**2)**2)
974 jacl(i,2*ii-1) = -(freq(i)*xi(2*ii))/(xi(2*ii)**2 + freq(i)**2)
975 jacl(i,2*ii) = xi(2*ii-1)*freq(i)*((xi(2*ii)**2 - freq(i)**2)/(xi(2*ii)**2 + freq(i)**2)**2)
978 jacst = transpose(jacs)
979 jaclt = transpose(jacl)
988 jactdy = two*matmul(jacst,matmul(weight,deltays)) + two*matmul(jaclt,matmul(weight,deltayl))
989 jactdy_n2 = sqrt(dot_product(jactdy,jactdy))
990 IF (jactdy_n2 < eps1) conv = .true.
1000 WRITE(6,*)
"Error: Blas/Lapack required"
1005 IF (niter == mxiter .OR. .NOT.conv)
THEN
1006 CALL ancmsg(msgid=1926,msgtype=msgerror,
1007 . anmode=aninfo_blind_1,i1=mat_id)
1009 ELSEIF (abs(jactdy_n2)>eps1 .OR. maxval(xi)>ep10 .OR. minval(xi)<em10)
THEN
1010 CALL ancmsg(msgid=1927,msgtype=msgwarning,
1011 . anmode=aninfo_blind_1,i1=mat_id)
1017 IF (ishape == 1)
THEN
1022 g(i+ishape) = xi(2*i-1)
1023 beta(i+ishape) = xi(2*i)*(mxfreq/hundred)
1029 DEALLOCATE(xi,xi_tr,jacs,jacl,fxis,fxil,deltays,deltayl,jactjac,id,jactdy,ipiv,
1030 . jacst,jaclt,fxis_tr,fxil_tr,vect,mu,freqs,yis_temp,freql,yil_temp)
1031 IF (
ALLOCATED(idx))
DEALLOCATE(idx)