42 SUBROUTINE mrqmin(X,Y,SIG,NDATA,A,IA,
43 . MA,COVAR,ALPHA,NCA, ERRNOW,
44 . IFUNCS,GAMMA,IRET,ICOMP,MMAX,ATRY )
48#include "implicit_f.inc"
56 INTEGER ,
INTENT(IN) :: MMAX
57 my_real ,
INTENT(INOUT) :: ATRY(MMAX)
61 INTEGER MA,NCA,NDATA,IA(MA) ,ICOMP
63 . gamma,errnow,a(ma),
alpha(nca,nca),
64 . covar(nca,nca),x(ndata),y(ndata),sig(ndata)
65 INTEGER J,K,L,MFIT ,NMAX
67 my_real errpre,beta(nmax),da(nmax)
68 SAVE errpre,beta,da,mfit
74 IF (gamma < zero)
THEN
77 IF (ia(j)/=0) mfit=mfit+1
83 . a,ia,ma,
alpha,beta,nca,errnow,
96 covar(j,j)=
alpha(j,j)*(1.+gamma)
100 CALL inversion(covar,mfit,nca,da,1,1,iret)
103 WRITE(*,*)
' IRET = ', iret
105 WRITE(iout, *)
'J, A(J) = ', j, a(j)
111 IF (gamma == zero)
THEN
112 CALL covsrt(covar,nca,ma,ia,mfit)
125 WRITE(iout,*) __file__,__line__
127 write(iout,*)
'J,ATRY(J) = ', j, atry(j)
134 if (atry(j+1) > twenty)
then
136 write(iout,*)
'Setting Big ALPHA to ',twenty
137 write(iout,*)
' J, ATRY(J) = ',j+1,atry(j+1)
140 ELSEIF (atry(j+1) < -twenty)
THEN
142 write(iout,*)
'Setting Big ALPHA to -',twenty
143 write(iout,*)
' J, ATRY(J) = ',j+1,atry(j+1)
150 CALL mrqcof(x,y,sig,ndata,
151 . atry,ia,ma,covar,da,nca,errnow,
154 IF (errnow < errpre)
THEN
159 alpha(j,k)=covar(j,k)
564 $ ICHECK, NSTART, ERRTOL,ID,TITR,IS_ENCRYPTED)
570#include "implicit_f.inc"
574#include "units_c.inc"
579 integer lawid, npt, ma, icheck, nstart
580 INTEGER ,
INTENT(IN) :: IS_ENCRYPTED
582 INTEGER I,NONZERO(MAXA),ITER,J,NMUAL
583 my_real GAMMA,ERRNOW,ERRPRE,
584 . stretch(npt),mual(10)
585 my_real a(maxa),covar(maxa,maxa),
alpha(maxa,maxa),y(npt)
586 my_real mcof_min(maxa), mcof_max(maxa)
590 CHARACTER(LEN=NCHARTITLE) :: TITR
591 INTEGER MINITER_LM, MAXITER_LM
595 DATA maxiter_lm /100/
604 INTEGER CNT_HIT_EPS_LM
605 INTEGER LMT_HIT_EPS_LM
606 DATA lmt_hit_eps_lm /2/
615 my_real errave, errave_min, err
617 INTEGER ISTART, NPSAVED, IVALID,ICOMP, MMAX
628 data gamma_stop /1e15/
634 data icheck_guess /0/
637 INTEGER , IFIT_SUCCESS
642 INTEGER MU_INCR_GUESS
643 data MU_INCR_GUESS /0/
647 my_real small_fac_abs_yi, small_abs_yi
649 my_real,
DIMENSION(:),
ALLOCATABLE :: sig
654 ALLOCATE (sig(1:npt))
658 IF ( maxa < ma )
THEN
659 WRITE(*,*)
'ERROR, MAXA < MA'
660 WRITE(*,*) __file__,__line__
664 IF(icheck < 0) icomp= 1
671 max_abs_yi =
max( max_abs_yi, abs(y(i)) )
674 small_fac_abs_yi = em3
676 small_abs_yi = max_abs_yi * small_fac_abs_yi
679 WRITE(iout, *)
' MAX_ABS_YI, SMALL_FAC_ABS_YI, SMALL_ABS_YI = ',
680 $ max_abs_yi, small_fac_abs_yi, small_abs_yi
686 sig(j)=spready*
max(small_abs_yi, abs(y(j)) )
688 WRITE(iout, *)
'J, SIG(J) = ', j, sig(j)
694 IF(sig(j) == zero) sig(j) = em15
696 WRITE(iout, *)
'J, SIG(J) = ', j, sig(j)
703 WRITE(*,*)
'ERROR: MAXA < MA'
704 WRITE(*,*)
' MAXA = ', maxa
705 WRITE(*,*)
' MA = ', maxa
706 WRITE(*,*)
' FILE = ', __file__
707 WRITE(*,*)
' LINE = ', __line__
724 ELSEIF (lawid == 2)
then
740 IF (jcheck == 3)
THEN
753 $ nmual, mcof_min, mcof_max,icomp)
758 DO 111
WHILE ( istart < nstart )
761 $ lawid, nmual, icheck_guess, mu_incr_guess,irnd1,
762 $ a0, nonzero, mcof_min, mcof_max, nguess)
764 IF (nguess == 0)
THEN
772 CALL ogden0(stretch(i), a0, yogd, nmual)
773 err = abs(y(i) - yogd) /
max(small_abs_yi, abs(y(i)))
774 errave = errave + err
778 CALL ogden0(stretch(i), a0, yogd, nmual)
779 err = abs(y(i) - yogd) /
max(em15,abs(y(i)))
780 errave = errave + err
784 errave = errave / (1.0 * npt)
789 WRITE(iout,*)
' ISTART = ', istart
790 WRITE(iout,*)
' Before LM optimization ...'
792 WRITE(iout, *)
' I, A0(I) = ', i, a0(i)
794 WRITE(iout,*)
' LM0, ERRAVE = ', errave
803 CALL mrqmin(stretch,y,sig,npt,a0,nonzero,
804 $ nmual,covar,
alpha,ma,errnow,
805 $ ifuncs,gamma,iret,icomp,mmax,atry)
806 IF (iret /= 0)
GOTO 111
812 CALL ogden0(stretch(i), a0, yogd, nmual)
813 err = abs(y(i) - yogd) /
max(small_abs_yi, abs(y(i)))
814 errave = errave + err
818 CALL ogden0(stretch(i), a0, yogd, nmual)
819 err = abs(y(i) - yogd) /
max(em15,abs(y(i)))
820 errave = errave + err
823 errave = errave / (1.0 * npt)
825 WRITE(iout,
'(A,I4, 3E16.8)')
826 $
'ITER, ERRNOW, GAMMA, ERRAVE = ',
827 $ iter, errnow, gamma, errave
829 WRITE(iout, *)
' - I, A0(I) = ', i, a0(i)
837 CALL mrqmin(stretch,y,sig,npt,a0,nonzero,
838 $ ma,covar,
alpha, ma, errnow,
839 $ ifuncs,gamma,iret,icomp,mmax,atry)
840 IF (iret /= 0)
GOTO 111
842 IF (idebug == 1)
THEN
846 CALL ogden0(stretch(i), a0, yogd, nmual)
847 err = abs(y(i) - yogd) /
max(small_abs_yi, abs(y(i)))
848 errave = errave + err
852 CALL ogden0(stretch(i), a0, yogd, nmual)
853 err = abs(y(i) - yogd) /
max(em15,abs(y(i)))
854 errave = errave + err
857 errave = errave / (1.0 * npt)
859 WRITE(iout,
'(A,I4, 5E16.8)')
860 $
'ITER, ERRNOW, GAMMA, ERRAVE, ERRNOW-ERRPRE,'//
861 $
'(ERRNOW-ERRPRE)/ERRPRE = ',
862 $ iter, errnow, gamma, errave, errnow-errpre,
863 $ (errnow-errpre)/errpre
865 WRITE(iout, *)
' - I, A0(I) = ', i, a0(i)
871 IF ( abs( a0(j) ) < 1e-20 )
THEN
882 WRITE(iout, *)
' ERRNOW/(1.0*NPT) = ', errnow/(1.0*npt)
883 WRITE(iout, *)
' ERRNOW < ERRPRE = ', (errnow < errpre)
886 IF ( iter > miniter_lm )
THEN
887 IF (errnow < errpre)
THEN
888 IF ( abs(errpre) > zero)
THEN
889 IF ( abs( (errnow-errpre)/ errpre ) < eps_lm)
THEN
890 cnt_hit_eps_lm = cnt_hit_eps_lm + 1
894 $
' CNT_HIT_EPS_LM, ABS((ERRNOW-ERRPRE)/ERRPRE) = ',
895 $ cnt_hit_eps_lm, abs( (errnow-errpre)/ errpre )
898 IF ( cnt_hit_eps_lm >= lmt_hit_eps_lm )
THEN
900 WRITE(iout,*)
'STOP AT ', __line__
906 ELSEIF (iter >= maxiter_lm .OR. gamma >= gamma_stop)
THEN
908 WRITE(iout,*)
'STOP AT ', __line__
922 CALL ogden0(stretch(i), a0, yogd, nmual)
923 err = abs(y(i) - yogd) /
max(small_abs_yi, abs(y(i)))
924 errave = errave + err
928 CALL ogden0(stretch(i), a0, yogd, nmual)
929 err = abs(y(i) - yogd) /
max(em15,abs(y(i)))
930 errave = errave + err
933 errave = errave / (1.0 * npt)
936 WRITE(iout,*)
' After LM optimization ...'
938 WRITE(iout, *)
' I, A0(I) = ', i, a0(i)
940 WRITE(iout,*)
' LM1, ERRAVE = ', errave
943 CALL law69_check(lawid, a0, nmual, jcheck, 0, ivalid)
946 $ ( npsaved>0 .AND. errave<errave_min) )
THEN
947 npsaved = npsaved + 1
955 WRITE(iout,*) __file__,__line__
956 WRITE(iout,*)
' LM converges to invalid point'
960 IF (npsaved > 0)
THEN
962 WRITE(*, *)
' ISTART, NPSAVED, ERRAVE_MIN = ',
963 $ istart, npsaved, errave_min
964 WRITE(iout, *)
' ISTART, NPSAVED, ERRAVE_MIN = ',
965 $ istart, npsaved, errave_min
968 IF ( errave_min < errtol )
THEN
974 WRITE(*, *)
' ISTART, NPSAVED ',
976 WRITE(iout, *)
' ISTART, NPSAVED ',
985 IF (ifit_success == 0 .AND. icheck == 3)
THEN
986 IF (jcheck == 2)
THEN
989 IF (npsaved > 0)
THEN
991 $
'*** Curve fitting result of /MAT/LAW69 with'
992 $ //
' ICHECK=2 is not satisfactory.'
993 WRITE(*,
'(A,F10.2,A)')
'ERRAVE = ', errave_min*100.0,
'%'
994 WRITE(*,
'(A)')
' Switching to ICHECK=1 and trying again.'
998 $
'*** Failed to fit /MAT/LAW69 with ICHECK=2.'
999 WRITE(*,
'(A)')
' Switching to ICHECK=1 and trying again.'
1008 IF (ifit_success == 0)
THEN
1009 IF (npsaved == 0)
THEN
1022 IF (lawid == 2)
THEN
1027 IF(is_encrypted == 0)
THEN
1028 WRITE(iout,
'(//6X,A,/)')
'FITTING RESULT COMPARISON:'
1029 WRITE(iout,
'(6X,A,/)')
'UNIAXIAL TEST DATA'
1030 WRITE(iout,
'(A20,5X,A20,A30)')
'NOMINAL STRAIN',
1031 *
'NOMINAL STRESS(TEST)',
'NOMINAL STRESS(RADIOSS)'
1038 inquire (unit=icurv, opened=lopened)
1039 if (.not. lopened)
goto 77
1042 OPEN(unit=icurv, file=
'curv.csv')
1043 WRITE(icurv,
'(A)')
'NOMINAL STRAIN, NOMINAL STRESS(TEST), '//
1044 $
'NOMINAL STRESS(RADIOSS)'
1046 IF(is_encrypted == 0)
THEN
1048 CALL ogden0(stretch(i), a, yogd, nmual)
1050 WRITE(iout,
'(1F18.6, 3X,1F20.13, 6X, 1F20.13)')
1051 * stretch(i)-one,y(i),yogd
1053 WRITE(icurv,
'(F18.4, A, F18.4, A, F18.4)')
1054 $ stretch(i)-one,
',',y(i),
',',yogd
1060 WRITE(iout,
'(A)')
'-------------------------------------------'
1061 WRITE(iout,
'(A,F10.2,A)')
'AVERAGED ERROR OF FITTING : ',
1062 $ errave_min*100.0,
'%'
1065 IF ( icurv > 0)
THEN
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)