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),IDUM,ITER,ICOUNT,J,K,NMUAL
583 my_real GAMMA,ERRNOW,GASDEV,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
606 DATA lmt_hit_eps_lm /2/
615 my_real errmin, errmax, errave, errave_min, err
617 INTEGER ISTART, NPSAVED, IVALID,ICOMP, MMAX
628 data gamma_stop /1e15/
634 data icheck_guess /0/
637 INTEGER JCHECK, 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))
657 IF ( maxa < ma )
THEN
658 WRITE(*,*)
'ERROR, MAXA < MA'
659 WRITE(*,*) __file__,__line__
663 IF(icheck < 0) icomp= 1
670 max_abs_yi =
max( max_abs_yi, abs(y(i)) )
673 small_fac_abs_yi = em3
675 small_abs_yi = max_abs_yi * small_fac_abs_yi
678 WRITE(iout, *)
' MAX_ABS_YI, SMALL_FAC_ABS_YI, SMALL_ABS_YI = ',
679 $ max_abs_yi, small_fac_abs_yi, small_abs_yi
685 sig(j)=spready*
max(small_abs_yi, abs(y(j)) )
687 WRITE(iout, *)
'J, SIG(J) = ', j, sig(j)
693 IF(sig(j) == zero) sig(j) = em15
695 WRITE(iout, *)
'J, SIG(J) = ', j, sig(j)
702 WRITE(*,*)
'ERROR: MAXA < MA'
703 WRITE(*,*)
' MAXA = ', maxa
704 WRITE(*,*)
' MA = ', maxa
705 WRITE(*,*)
' FILE = ', __file__
706 WRITE(*,*)
' LINE = ', __line__
723 ELSEIF (lawid == 2)
then
739 IF (jcheck == 3)
THEN
752 $ nmual, mcof_min, mcof_max,icomp)
757 DO 111
WHILE ( istart < nstart )
760 $ lawid, nmual, icheck_guess, mu_incr_guess,irnd1,
761 $ a0, nonzero, mcof_min, mcof_max, nguess)
763 IF (nguess == 0)
THEN
771 CALL ogden0(stretch(i), a0, yogd, nmual)
772 err = abs(y(i) - yogd) /
max(small_abs_yi, abs(y(i)))
773 errave = errave + err
777 CALL ogden0(stretch(i), a0, yogd, nmual)
778 err = abs(y(i) - yogd) /
max(em15
779 errave = errave + err
783 errave = errave / (1.0 * npt)
788 WRITE(iout,*)
' ISTART = ', istart
789 WRITE(iout,*)
' Before LM optimization ...'
791 WRITE(iout, *)
' I, A0(I) = ', i, a0(i)
793 WRITE(iout,*)
' LM0, ERRAVE = ', errave
802 CALL mrqmin(stretch,y,sig,npt,a0,nonzero,
803 $ nmual,covar,
alpha,ma,errnow,
804 $ ifuncs,gamma,iret,icomp,mmax,atry)
805 IF (iret /= 0)
GOTO 111
811 CALL ogden0(stretch(i), a0, yogd, nmual)
812 err = abs(y(i) - yogd) /
max(small_abs_yi, abs(y(i)))
813 errave = errave + err
817 CALL ogden0(stretch(i), a0, yogd, nmual)
818 err = abs(y(i) - yogd) /
max(em15,abs(y(i)))
819 errave = errave + err
822 errave = errave / (1.0 * npt)
824 WRITE(iout,
'(A,I4, 3E16.8)')
825 $
'ITER, ERRNOW, GAMMA, ERRAVE = ',
826 $ iter, errnow, gamma, errave
828 WRITE(iout, *)
' - I, A0(I) = ', i, a0(i)
836 CALL mrqmin(stretch,y,sig,npt,a0,nonzero,
837 $ ma,covar,
alpha, ma, errnow,
838 $ ifuncs,gamma,iret,icomp,mmax,atry)
839 IF (iret /= 0)
GOTO 111
841 IF (idebug == 1)
THEN
845 CALL ogden0(stretch(i), a0, yogd, nmual)
846 err = abs(y(i) - yogd) /
max(small_abs_yi, abs(y(i)))
847 errave = errave + err
851 CALL ogden0(stretch(i), a0, yogd, nmual)
852 err = abs(y(i) - yogd) /
max(em15,abs(y(i)))
853 errave = errave + err
856 errave = errave / (1.0 * npt)
858 WRITE(iout,
'(A,I4, 5E16.8)')
859 $
'ITER, ERRNOW, GAMMA, ERRAVE, ERRNOW-ERRPRE,'//
860 $
'(ERRNOW-ERRPRE)/ERRPRE = ',
861 $ iter, errnow, gamma, errave, errnow-errpre,
862 $ (errnow-errpre)/errpre
864 WRITE(iout, *)
' - I, A0(I) = ', i, a0(i)
870 IF ( abs( a0(j) ) < 1e-20 )
THEN
881 WRITE(iout, *)
' ERRNOW/(1.0*NPT) = ', errnow/(1.0*npt)
882 WRITE(iout, *)
' ERRNOW < ERRPRE = ', (errnow < errpre)
885 IF ( iter > miniter_lm )
THEN
886 IF (errnow < errpre)
THEN
887 IF ( abs(errpre) > zero)
THEN
888 IF ( abs( (errnow-errpre)/ errpre ) < eps_lm)
THEN
889 cnt_hit_eps_lm = cnt_hit_eps_lm + 1
893 $
' CNT_HIT_EPS_LM, ABS((ERRNOW-ERRPRE)/ERRPRE) = ',
894 $ cnt_hit_eps_lm, abs( (errnow-errpre)/ errpre )
897 IF ( cnt_hit_eps_lm >= lmt_hit_eps_lm )
THEN
899 WRITE(iout,*)
'STOP AT ', __line__
905 ELSEIF (iter >= maxiter_lm .OR. gamma >= gamma_stop)
THEN
907 WRITE(iout,*)
'STOP AT ', __line__
921 CALL ogden0(stretch(i), a0, yogd, nmual)
922 err = abs(y(i) - yogd) /
max(small_abs_yi, abs(y(i)))
923 errave = errave + err
927 CALL ogden0(stretch(i), a0, yogd, nmual)
928 err = abs(y(i) - yogd) /
max(em15,abs(y(i)))
929 errave = errave + err
932 errave = errave / (1.0 * npt)
935 WRITE(iout,*)
' After LM optimization ...'
937 WRITE(iout, *)
' I, A0(I) = ', i, a0(i)
939 WRITE(iout,*)
' LM1, ERRAVE = ', errave
942 CALL law69_check(lawid, a0, nmual, jcheck, 0, ivalid)
945 $ ( npsaved>0 .AND. errave<errave_min) )
THEN
946 npsaved = npsaved + 1
954 WRITE(iout,*) __file__
955 WRITE(iout,*)
' LM converges to invalid point'
959 IF (npsaved > 0)
THEN
961 WRITE(*, *)
' ISTART, NPSAVED, ERRAVE_MIN = ',
962 $ istart, npsaved, errave_min
963 WRITE(iout, *)
' ISTART, NPSAVED, ERRAVE_MIN = ',
964 $ istart, npsaved, errave_min
967 IF ( errave_min < errtol )
THEN
973 WRITE(*, *)
' ISTART, NPSAVED ',
975 WRITE(iout, *)
' ISTART, NPSAVED ',
984 IF (ifit_success == 0 .AND. icheck == 3)
THEN
985 IF (jcheck == 2)
THEN
988 IF (npsaved > 0)
THEN
990 $
'*** Curve fitting result of /MAT/LAW69 with'
991 $ //
' ICHECK=2 is not satisfactory.'
992 WRITE(*,
'(A,F10.2,A)')
'ERRAVE = ', errave_min*100.0,
'%'
993 WRITE(*,
'(A)')
' Switching to ICHECK=1 and trying again.'
997 $
'*** Failed to fit /MAT/LAW69 with ICHECK=2.'
998 WRITE(*,
'(A)')
' Switching to ICHECK=1 and trying again.'
1007 IF (ifit_success == 0)
THEN
1008 IF (npsaved == 0)
THEN
1021 IF (lawid == 2)
THEN
1026 IF(is_encrypted == 0)
THEN
1027 WRITE(iout,
'(//6X,A,/)')
'FITTING RESULT COMPARISON:'
1028 WRITE(iout,
'(6X,A,/)')
'UNIAXIAL TEST DATA'
1029 WRITE(iout,'(a20,5x,a20,a30)')
'NOMINAL STRAIN',
1030 *
'NOMINAL STRESS(TEST)',
'NOMINAL STRESS(RADIOSS)'
1037 inquire (unit=icurv, opened=lopened)
1038 if (.not. lopened)
goto 77
1041 OPEN(unit=icurv, file=
'curv.csv'
1042 WRITE(icurv,
'(A)')
'NOMINAL STRAIN, NOMINAL STRESS(TEST), '//
1043 $
'NOMINAL STRESS(RADIOSS)'
1045 IF(is_encrypted == 0)
THEN
1047 CALL ogden0(stretch(i), a, yogd, nmual)
1049 WRITE(iout,
'(1F18.6, 3X,1F20.13, 6X, 1F20.13)')
1052 WRITE(icurv,
'(F18.4, A, F18.4, A, F18.4)')
1053 $ stretch(i)-one,
',',y(i),
',',yogd
1059 WRITE(iout,
'(A)')
'-------------------------------------------'
1060 WRITE(iout,
'(A,F10.2,A)')
'AVERAGED ERROR OF FITTING : ',
1061 $ errave_min*100.0,
'%'
1064 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)