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),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)
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 errmin, errmax, 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
656
657 IF ( maxa < ma ) THEN
658 WRITE(*,*) 'ERROR, MAXA < MA'
659 WRITE(*,*) __file__,__line__
661 ENDIF
662 icomp=0
663 IF(icheck < 0) icomp= 1
664 icheck = abs(icheck)
665
666
667
668 max_abs_yi = zero
669 DO i = 1, npt
670 max_abs_yi =
max( max_abs_yi, abs(y(i)) )
671 ENDDO
672
673 small_fac_abs_yi = em3
674
675 small_abs_yi = max_abs_yi * small_fac_abs_yi
676
677 IF (idebug > 0) THEN
678 WRITE(iout, *) ' MAX_ABS_YI, SMALL_FAC_ABS_YI, SMALL_ABS_YI = ',
679 $ max_abs_yi, small_fac_abs_yi, small_abs_yi
680 ENDIF
681
682 spready=0.01
683 IF(icomp == 0) THEN
684 DO j=1,npt
685 sig(j)=spready*
max(small_abs_yi, abs(y(j)) )
686 IF (idebug > 0) THEN
687 WRITE(iout, *) 'J, SIG(J) = ', j, sig(j)
688 ENDIF
689 ENDDO
690 ELSE
691 DO j=1,npt
692 sig(j) = y(j)
693 IF(sig(j) == zero) sig(j) = em15
694 IF (idebug > 0) THEN
695 WRITE(iout, *) 'j, sig(j) = ', J, SIG(J)
696 ENDIF
697 ENDDO
698 ENDIF
699
700 IF (MAXA < MA) THEN
701! TBD_KANG
702 WRITE(*,*) 'error: maxa < ma'
703 WRITE(*,*) ' maxa = ', MAXA
704 WRITE(*,*) ' ma = ', MAXA
705 WRITE(*,*) ' file = ', __FILE__
706 WRITE(*,*) ' line = ', __LINE__
707 CALL MY_EXIT(2)
708 ENDIF
709
710
711 DO I=1,NMUAL
712 NONZERO(I)=1
713 ENDDO
714
715 IF (LAWID == 1) then ! OGDEN
716 DO I=NMUAL+1,10
717 NONZERO(I)=0
718 A(I)=ZERO
719 ENDDO
720
721 IFUNCS = 1 ! SUBROUTINE OGDEN0/OGDEN1
722
723 ELSEIF (LAWID == 2) then ! Mooney-Rivlin
724 DO I=NMUAL+1,MA
725 NONZERO(I)=0
726 ENDDO
727 NONZERO(2)=0
728 NONZERO(4)=0
729
730 DO I=NMUAL+1,MA
731 A(I)=ZERO
732 ENDDO
733
734 IFUNCS = 1 ! SUBROUTINE OGDEN0/OGDEN1
735
736 ENDIF
737
738 JCHECK =ICHECK
739 IF (JCHECK == 3) THEN
740 JCHECK = 2
741 ENDIF
742
74399 CONTINUE ! location to start optimization with different JCHECK
744
745 IFIT_SUCCESS = 0
746
747 ISTART = 0
748 NPSAVED = 0
749
750
751 CALL LAW69_GUESS_BOUNDS(LAWID, JCHECK, STRETCH, Y, NPT,
752 $ NMUAL, MCOF_MIN, MCOF_MAX,ICOMP)
753
754
755 IRND1 = 205
756 ATRY(1:MMAX) = ZERO ! Initialization of ATRY
757 DO 111 WHILE ( ISTART < NSTART )
758
759 CALL LAW69_GUESS1(
760 $ LAWID, NMUAL, ICHECK_GUESS, MU_INCR_GUESS,IRND1,
761 $ A0, NONZERO, MCOF_MIN, MCOF_MAX, NGUESS)
762
763 IF (NGUESS == 0) THEN
764 GOTO 112
765 ENDIF
766
767
768 ERRAVE = 0.0
769 IF(ICOMP == 0) THEN
770 DO I=1,NPT
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
774 ENDDO
775 ELSE
776 DO I=1,NPT
777 CALL OGDEN0(STRETCH(I), A0, YOGD, NMUAL)
778 ERR = ABS(Y(I) - YOGD) / MAX(EM15,ABS(Y(I)))
779 ERRAVE = ERRAVE + ERR
780 ENDDO
781 ENDIF
782
783 ERRAVE = ERRAVE / (1.0 * NPT)
784
785 ISTART = ISTART + 1
786
787 IF (IDEBUG > 0) THEN
788 WRITE(IOUT,*) ' istart = ', ISTART
789 WRITE(IOUT,*) ' before lm optimization ...'
790 DO I = 1, NMUAL
791 WRITE(IOUT, *) ' i, a0(i) = ', I, A0(I)
792 ENDDO
793 WRITE(IOUT,*) ' lm0, errave = ', ERRAVE
794 ENDIF
795
796! start loop of LM optimization
797 ITER = 0
798 CNT_HIT_EPS_LM = 0
799
800 ITER = ITER + 1
801 GAMMA=-1
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
806
807 IF (IDEBUG > 0) THEN
808 ERRAVE = 0.0
809 IF(ICOMP == 0) THEN
810 DO I=1,NPT
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
814 ENDDO
815 ELSE
816 DO I=1,NPT
817 CALL OGDEN0(STRETCH(I), A0, YOGD, NMUAL)
818 ERR = ABS(Y(I) - YOGD) / MAX(EM15,ABS(Y(I)))
819 ERRAVE = ERRAVE + ERR
820 ENDDO
821 ENDIF
822 ERRAVE = ERRAVE / (1.0 * NPT)
823
824 WRITE(IOUT, '(a,i4, 3e16.8)')
825 $ 'iter, errnow, gamma, errave = ',
826 $ ITER, ERRNOW, GAMMA, ERRAVE
827 DO I = 1, NMUAL
828 WRITE(IOUT, *) ' - i, a0(i) = ', I, A0(I)
829 ENDDO
830 ENDIF
831
83221 CONTINUE
833 ERRPRE=ERRNOW
834
835 ITER = ITER + 1
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
840
841 IF (IDEBUG == 1) THEN
842 ERRAVE = ZERO
843 IF(ICOMP == 0) THEN
844 DO I=1,NPT
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
848 ENDDO
849 ELSE
850 DO I=1,NPT
851 CALL OGDEN0(STRETCH(I), A0, YOGD, NMUAL)
852 ERR = ABS(Y(I) - YOGD) / MAX(EM15,ABS(Y(I)))
853 ERRAVE = ERRAVE + ERR
854 ENDDO
855 ENDIF
856 ERRAVE = ERRAVE / (1.0 * NPT)
857
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
863 DO I = 1, NMUAL
864 WRITE(IOUT, *) ' - i, a0(i) = ', I, A0(I)
865 ENDDO
866 ENDIF
867
868
869 DO J = 1, NMUAL
870 IF ( ABS( A0(J) ) < 1E-20 ) THEN
871 goto 111 ! restart from next initial guess
872
873
874
875 ENDIF
876 ENDDO
877
878
879 LMSTOP = 0
880 IF (IDEBUG > 0) THEN
881 WRITE(IOUT, *) ' errnow/(1.0*npt) = ', ERRNOW/(1.0*NPT)
882 WRITE(IOUT, *) ' errnow < errpre = ', (ERRNOW < ERRPRE)
883 ENDIF
884
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
890
891 IF (IDEBUG > 0) THEN
892 WRITE(IOUT,*)
893 $ ' cnt_hit_eps_lm, abs((errnow-errpre)/errpre) = ',
894 $ CNT_HIT_EPS_LM, ABS( (ERRNOW-ERRPRE)/ ERRPRE )
895 ENDIF
896
897 IF ( CNT_HIT_EPS_LM >= LMT_HIT_EPS_LM ) THEN
898 IF (IDEBUG > 0) THEN
899 WRITE(IOUT,*) 'stop at ', __LINE__
900 ENDIF
901 LMSTOP = 1
902 ENDIF
903 ENDIF
904 ENDIF
905.OR. ELSEIF (ITER >= MAXITER_LM GAMMA >= GAMMA_STOP) THEN
906 IF (IDEBUG > 0) THEN
907 WRITE(IOUT,*) 'stop at ', __LINE__
908 ENDIF
909 LMSTOP = 1
910 ENDIF
911 ENDIF
912
913 IF (LMSTOP== 0) THEN
914 GOTO 21
915 ENDIF
916! end loop of LM optimization
917
918 ERRAVE = 0.0
919 IF(ICOMP == 0) THEN
920 DO I=1,NPT
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
924 ENDDO
925 ELSE
926 DO I=1,NPT
927 CALL OGDEN0(STRETCH(I), A0, YOGD, NMUAL)
928 ERR = ABS(Y(I) - YOGD) / MAX(EM15,ABS(Y(I)))
929 ERRAVE = ERRAVE + ERR
930 ENDDO
931 ENDIF
932 ERRAVE = ERRAVE / (1.0 * NPT)
933
934 IF (IDEBUG > 0) THEN
935 WRITE(IOUT,*) ' after lm optimization ...'
936 DO I = 1, MA
937 WRITE(IOUT, *) ' i, a0(i) = ', I, A0(I)
938 ENDDO
939 WRITE(IOUT,*) ' lm1, errave = ', ERRAVE
940 ENDIF
941
942 CALL LAW69_CHECK(LAWID, A0, NMUAL, JCHECK, 0, IVALID)
943 IF (IVALID > 0) THEN
944.OR. IF ( NPSAVED==0
945.AND. $ ( NPSAVED>0 ERRAVE<ERRAVE_MIN) ) THEN
946 NPSAVED = NPSAVED + 1
947 ERRAVE_MIN = ERRAVE
948 DO I = 1, NMUAL
949 A(I) = A0(I)
950 ENDDO
951 ENDIF
952 ELSE
953 IF (IDEBUG > 0) THEN
954 WRITE(IOUT,*) __FILE__,__LINE__
955 WRITE(IOUT,*) ' lm converges to invalid point'
956 ENDIF
957 ENDIF
958
959 IF (NPSAVED > 0) THEN
960 IF (IDEBUG > 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
965 ENDIF
966
967 IF ( ERRAVE_MIN < ERRTOL ) THEN
968 IFIT_SUCCESS = 1
969 GOTO 112
970 ENDIF
971 ELSE
972 IF (IDEBUG > 0) THEN
973 WRITE(*, *) ' istart, npsaved ',
974 $ ISTART, NPSAVED
975 WRITE(IOUT, *) ' istart, npsaved ',
976 $ ISTART, NPSAVED
977 ENDIF
978 ENDIF
979
980111 CONTINUE ! WHILE ( ISTART < NSTART )
981
982112 CONTINUE
983
984.AND. IF (IFIT_SUCCESS == 0 ICHECK == 3) THEN
985 IF (JCHECK == 2) THEN
986 JCHECK = 1
987 IF (IDEBUG > 0) THEN
988 IF (NPSAVED > 0) THEN
989 WRITE(*,'(a)')
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.'
994
995 ELSE
996 WRITE(*,'(a)')
997 $ '*** failed to fit /mat/law69 with icheck=2.'
998 WRITE(*,'(a)') ' switching to icheck=1 and trying again.'
999 ENDIF
1000 ENDIF
1001 GOTO 99
1002 ENDIF
1003 ENDIF
1004
1005 DEALLOCATE (SIG)
1006
1007 IF (IFIT_SUCCESS == 0) THEN
1008 IF (NPSAVED == 0) THEN
1009 CALL ANCMSG(MSGID=901,
1010 . MSGTYPE=MSGERROR,
1011 . ANMODE=ANINFO,
1012 . I1=ID,
1013 . C1=TITR)
1014 ENDIF
1015 ENDIF
1016
1017 DO I=1,10
1018 MUAL(I)=A(I)
1019 ENDDO
1020
1021 IF (LAWID == 2) THEN
1022 DO I=5,10
1023 MUAL(I) = ZERO
1024 ENDDO
1025 ENDIF
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)
'
1031 ENDIF
1032
1033
1034 ICURV = 0
1035 IF (IOCSV> 0) THEN
1036 DO ICURV = 25, 99
1037 inquire (unit=ICURV, opened=lopened)
1038.not. if ( lopened) goto 77
1039 ENDDO
104077 CONTINUE
1041 OPEN(UNIT=ICURV, FILE='curv.csv')
1042 WRITE(ICURV,'(a)') 'nominal strain, nominal stress(test), '//
1044 ENDIF
1045 IF(IS_ENCRYPTED == 0)THEN
1046 DO I=1,NPT
1047 CALL OGDEN0(STRETCH(I), A, YOGD, NMUAL)
1048!! WRITE(IOUT,'(f18.4,f20.4,f28.4)')
1049 WRITE(IOUT, '(1f18.6, 3x,1f20.13, 6x, 1f20.13)')
1050 * STRETCH(I)-ONE,Y(I),YOGD
1051 IF (ICURV > 0) THEN
1052 WRITE(ICURV, '(f18.4, a, f18.4, a, f18.4)')
1053 $ STRETCH(I)-ONE,',',Y(I),',',YOGD
1054 ENDIF
1055 ENDDO
1056 ENDIF
1057
1058 WRITE(IOUT, *) ''
1059 WRITE(IOUT, '(a)') '-------------------------------------------'
1060 WRITE(IOUT, '(a,f10.2,a)') 'averaged error of fitting : ',
1061 $ ERRAVE_MIN*100.0, '%'
1062
1063
1064 IF ( ICURV > 0) THEN
1065 CLOSE(ICURV)
1066 ENDIF
1067
1068 RETURN
integer, parameter nchartitle