567
568
569
570#include "implicit_f.inc"
571
572
573
574#include "units_c.inc"
575
576 INTEGER MAXA
577 parameter(maxa=20)
578
579 INTEGER LAWID, NPT, MA, ICHECK, NSTART
580 INTEGER , INTENT(IN) :: IS_ENCRYPTED
582 INTEGER I,NONZERO(MAXA),ITER,J,NMUAL
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)
588
589 INTEGER ID
590 CHARACTER(LEN=NCHARTITLE) :: TITR
591 INTEGER MINITER_LM, MAXITER_LM
592 DATA miniter_lm /5/
593 SAVE miniter_lm
594
595 DATA maxiter_lm /100/
596 SAVE maxiter_lm
597
598
599
601 DATA eps_lm /1e-3/
602 SAVE eps_lm
603
604 INTEGER CNT_HIT_EPS_LM
605 INTEGER LMT_HIT_EPS_LM
606 DATA lmt_hit_eps_lm /2/
607 SAVE lmt_hit_eps_lm
608
609 INTEGER LMSTOP
610
611 INTEGER IFUNCS
612
613 INTEGER NGUESS
615 my_real errave, errave_min, err
616
617 INTEGER ISTART, NPSAVED, IVALID,ICOMP, MMAX
618 parameter(mmax =20)
620
621 INTEGER ICURV
622 LOGICAL lopened
623
624
625
626
628 data gamma_stop /1e15/
629 save gamma_stop
630
631
632
633 INTEGER ICHECK_GUESS
634 data icheck_guess /0/
635 save icheck_guess
636
637 INTEGER JCHECK, IFIT_SUCCESS
638
639
640
641
642 INTEGER MU_INCR_GUESS
643 data mu_incr_guess /0/
644 save mu_incr_guess
645
647 my_real small_fac_abs_yi, small_abs_yi
648
649 my_real,
DIMENSION(:),
ALLOCATABLE :: sig
651 INTEGER IRET
652 INTEGER IRND1
653
654 ALLOCATE (sig(1:npt))
655 errave_min = zero
656
657
658 IF ( maxa < ma ) THEN
659 WRITE(*,*) 'ERROR, MAXA < MA'
660 WRITE(*,*) __file__,__line__
662 ENDIF
663 icomp=0
664 IF(icheck < 0) icomp= 1
665 icheck = abs(icheck)
666
667
668
669 max_abs_yi = zero
670 DO i = 1, npt
671 max_abs_yi =
max( max_abs_yi, abs(y(i)) )
672 ENDDO
673
674 small_fac_abs_yi = em3
675
676 small_abs_yi = max_abs_yi * small_fac_abs_yi
677
678 IF (idebug > 0) THEN
679 WRITE(iout, *) ' MAX_ABS_YI, SMALL_FAC_ABS_YI, SMALL_ABS_YI = ',
680 $ max_abs_yi, small_fac_abs_yi, small_abs_yi
681 ENDIF
682
683 spready=0.01
684 IF(icomp == 0) THEN
685 DO j=1,npt
686 sig(j)=spready*
max(small_abs_yi, abs(y(j)) )
687 IF (idebug > 0) THEN
688 WRITE(iout, *) 'J, SIG(J) = ', j, sig(j)
689 ENDIF
690 ENDDO
691 ELSE
692 DO j=1,npt
693 sig(j) = y(j)
694 IF(sig(j) == zero) sig(j) = em15
695 IF (idebug > 0) THEN
696 WRITE(iout, *) 'J, SIG(J) = ', j, sig(j)
697 ENDIF
698 ENDDO
699 ENDIF
700
701 IF (maxa < ma) THEN
702
703 WRITE(*,*) 'ERROR: MAXA < MA'
704 WRITE(*,*) ' MAXA = ', maxa
705 WRITE(*,*) ' MA = ', maxa
706 WRITE(*,*) ' FILE = ', __file__
707 WRITE(*,*) ' LINE = ', __line__
709 ENDIF
710
711
712 DO i=1,nmual
713 nonzero(i)=1
714 ENDDO
715
716 IF (lawid == 1) then
717 DO i=nmual+1,10
718 nonzero(i)=0
719 a(i)=zero
720 ENDDO
721
722 ifuncs = 1
723
724 ELSEIF (lawid == 2) then
725 DO i=nmual+1,ma
726 nonzero(i)=0
727 ENDDO
728 nonzero(2)=0
729 nonzero(4)=0
730
731 DO i=nmual+1,ma
732 a(i)=zero
733 ENDDO
734
735 ifuncs = 1
736
737 ENDIF
738
739 jcheck =icheck
740 IF (jcheck == 3) THEN
741 jcheck = 2
742 ENDIF
743
74499 CONTINUE ! location to start optimization with different jcheck
745
746 ifit_success = 0
747
748 istart = 0
749 npsaved = 0
750
751
753 $ nmual, mcof_min, mcof_max,icomp)
754
755
756 irnd1 = 205
757 atry(1:mmax) = zero
758 DO 111 WHILE ( istart < nstart )
759
761 $ lawid, nmual, icheck_guess, mu_incr_guess,irnd1,
762 $ a0, nonzero, mcof_min, mcof_max, nguess)
763
764 IF (nguess == 0) THEN
765 GOTO 112
766 ENDIF
767
768
769 errave = 0.0
770 IF(icomp == 0) THEN
771 DO i=1,npt
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
775 ENDDO
776 ELSE
777 DO i=1,npt
778 CALL ogden0(stretch(i), a0, yogd, nmual)
779 err = abs(y(i) - yogd) /
max(em15,abs(y(i)))
780 errave = errave + err
781 ENDDO
782 ENDIF
783
784 errave = errave / (1.0 * npt)
785
786 istart = istart + 1
787
788 IF (idebug > 0) THEN
789 WRITE(iout,*) ' ISTART = ', istart
790 WRITE(iout,*) ' Before LM optimization ...'
791 DO i = 1, nmual
792 WRITE(iout, *) ' I, A0(I) = ', i, a0(i)
793 ENDDO
794 WRITE(iout,*) ' LM0, ERRAVE = ', errave
795 ENDIF
796
797
798 iter = 0
799 cnt_hit_eps_lm = 0
800
801 iter = iter + 1
802 gamma=-1
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
807
808 IF (idebug > 0) THEN
809 errave = 0.0
810 IF(icomp == 0) THEN
811 DO i=1,npt
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
815 ENDDO
816 ELSE
817 DO i=1,npt
818 CALL ogden0(stretch(i), a0, yogd, nmual)
819 err = abs(y(i) - yogd) /
max(em15,abs(y(i)))
820 errave = errave + err
821 ENDDO
822 ENDIF
823 errave = errave / (1.0 * npt)
824
825 WRITE(iout, '(A,I4, 3E16.8)')
826 $ 'ITER, ERRNOW, GAMMA, ERRAVE = ',
827 $ iter, errnow, gamma, errave
828 DO i = 1, nmual
829 WRITE(iout, *) ' - I, A0(I) = ', i, a0(i)
830 ENDDO
831 ENDIF
832
83321 CONTINUE
834 errpre=errnow
835
836 iter = iter + 1
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
841
842 IF (idebug == 1) THEN
843 errave = zero
844 IF(icomp == 0) THEN
845 DO i=1,npt
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
849 ENDDO
850 ELSE
851 DO i=1,npt
852 CALL ogden0(stretch(i), a0, yogd, nmual)
853 err = abs(y(i) - yogd) /
max(em15,abs(y(i)))
854 errave = errave + err
855 ENDDO
856 ENDIF
857 errave = errave / (1.0 * npt)
858
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
864 DO i = 1, nmual
865 WRITE(iout, *) ' - I, A0(I) = ', i, a0(i)
866 ENDDO
867 ENDIF
868
869
870 DO j = 1, nmual
871 IF ( abs( a0(j) ) < 1e-20 ) THEN
872 goto 111
873
874
875
876 ENDIF
877 ENDDO
878
879
880 lmstop = 0
881 IF (idebug > 0) THEN
882 WRITE(iout, *) ' ERRNOW/(1.0*NPT) = ', errnow/(1.0*npt)
883 WRITE(iout, *) ' ERRNOW < ERRPRE = ', (errnow < errpre)
884 ENDIF
885
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
891
892 IF (idebug > 0) THEN
893 WRITE(iout,*)
894 $ ' CNT_HIT_EPS_LM, ABS((ERRNOW-ERRPRE)/ERRPRE) = ',
895 $ cnt_hit_eps_lm, abs( (errnow-errpre)/ errpre )
896 ENDIF
897
898 IF ( cnt_hit_eps_lm >= lmt_hit_eps_lm ) THEN
899 IF (idebug > 0) THEN
900 WRITE(iout,*) 'STOP AT ', __line__
901 ENDIF
902 lmstop = 1
903 ENDIF
904 ENDIF
905 ENDIF
906 ELSEIF (iter >= maxiter_lm .OR. gamma >= gamma_stop) THEN
907 IF (idebug > 0) THEN
908 WRITE(iout,*) 'STOP AT ', __line__
909 ENDIF
910 lmstop = 1
911 ENDIF
912 ENDIF
913
914 IF (lmstop== 0) THEN
915 GOTO 21
916 ENDIF
917
918
919 errave = 0.0
920 IF(icomp == 0) THEN
921 DO i=1,npt
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
925 ENDDO
926 ELSE
927 DO i=1,npt
928 CALL ogden0(stretch(i), a0, yogd, nmual)
929 err = abs(y(i) - yogd) /
max(em15,abs(y(i)))
930 errave = errave + err
931 ENDDO
932 ENDIF
933 errave = errave / (1.0 * npt)
934
935 IF (idebug > 0) THEN
936 WRITE(iout,*) ' After LM optimization ...'
937 DO i = 1, ma
938 WRITE(iout, *) ' I, A0(I) = ', i, a0(i)
939 ENDDO
940 WRITE(iout,*) ' LM1, ERRAVE = ', errave
941 ENDIF
942
943 CALL law69_check(lawid, a0, nmual, jcheck, 0, ivalid)
944 IF (ivalid > 0) THEN
945 IF ( npsaved==0 .OR.
946 $ ( npsaved>0 .AND. errave<errave_min) ) THEN
947 npsaved = npsaved + 1
948 errave_min = errave
949 DO i = 1, nmual
950 a(i) = a0(i)
951 ENDDO
952 ENDIF
953 ELSE
954 IF (idebug > 0) THEN
955 WRITE(iout,*) __file__,__line__
956 WRITE(iout,*) ' LM converges to invalid point'
957 ENDIF
958 ENDIF
959
960 IF (npsaved > 0) THEN
961 IF (idebug > 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
966 ENDIF
967
968 IF ( errave_min < errtol ) THEN
969 ifit_success = 1
970 GOTO 112
971 ENDIF
972 ELSE
973 IF (idebug > 0) THEN
974 WRITE(*, *) ' ISTART, NPSAVED ',
975 $ istart, npsaved
976 WRITE(iout, *) ' ISTART, NPSAVED ',
977 $ istart, npsaved
978 ENDIF
979 ENDIF
980
981111 CONTINUE
982
983112 CONTINUE
984
985 IF (ifit_success == 0 .AND. icheck == 3) THEN
986 IF (jcheck == 2) THEN
987 jcheck = 1
988 IF (idebug > 0) THEN
989 IF (npsaved > 0) THEN
990 WRITE(*,'(A)')
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.'
995
996 ELSE
997 WRITE(*,'(A)')
998 $ '*** Failed to fit /MAT/LAW69 with ICHECK=2.'
999 WRITE(*,'(A)') ' Switching to ICHECK=1 and trying again.'
1000 ENDIF
1001 ENDIF
1002 GOTO 99
1003 ENDIF
1004 ENDIF
1005
1006 DEALLOCATE (sig)
1007
1008 IF (ifit_success == 0) THEN
1009 IF (npsaved == 0) THEN
1011 . msgtype=msgerror,
1012 . anmode=aninfo,
1014 . c1=titr)
1015 ENDIF
1016 ENDIF
1017
1018 DO i=1,10
1019 mual(i)=a(i)
1020 ENDDO
1021
1022 IF (lawid == 2) THEN
1023 DO i=5,10
1024 mual(i) = zero
1025 ENDDO
1026 ENDIF
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)'
1032 ENDIF
1033
1034
1035 icurv = 0
1036 IF (iocsv> 0) THEN
1037 DO icurv = 25, 99
1038 inquire (unit=icurv, opened=lopened)
1039 if (.not. lopened) goto 77
1040 ENDDO
104177 CONTINUE
1042 OPEN(unit=icurv, file='curv.csv')
1043 WRITE(icurv,'(A)') 'NOMINAL STRAIN, NOMINAL STRESS(TEST), '//
1044 $ 'NOMINAL STRESS(RADIOSS)'
1045 ENDIF
1046 IF(is_encrypted == 0)THEN
1047 DO i=1,npt
1048 CALL ogden0(stretch(i), a, yogd, nmual)
1049
1050 WRITE(iout, '(1F18.6, 3X,1F20.13, 6X, 1F20.13)')
1051 * stretch(i)-one,y(i),yogd
1052 IF (icurv > 0) THEN
1053 WRITE(icurv, '(F18.4, A, F18.4, A, F18.4)')
1054 $ stretch(i)-one,',',y(i),',',yogd
1055 ENDIF
1056 ENDDO
1057 ENDIF
1058
1059 WRITE(iout, *) ''
1060 WRITE(iout, '(A)') '-------------------------------------------'
1061 WRITE(iout, '(A,F10.2,A)') 'AVERAGED ERROR OF FITTING : ',
1062 $ errave_min*100.0, '%'
1063
1064
1065 IF ( icurv > 0) THEN
1066 CLOSE(icurv)
1067 ENDIF
1068
1069 RETURN
integer, parameter nchartitle
subroutine mrqmin(x, y, sig, ndata, a, ia, ma, covar, alpha, nca, errnow, ifuncs, gamma, iret, icomp, mmax, atry)
subroutine law69_guess_bounds(lawid, icheck, x, y, npt, nmual, mcof_min, mcof_max, icomp)
@purpose Esstimate lwer/upper bounds of mu_i and alpha_i which will be used to generate initial guess
subroutine law69_guess1(lawid, nmual, icheck, mu_incr, irnd1, a0, ia, mcof_min, mcof_max, nguess)
@purpose get one guess for starting Levenberg-Marquardt method
subroutine ogden0(x, a, y, na)
@purpose calculate stress from stretch for OGDEN (uniaxial tension)
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)