638 IMPLICIT NONE
639 LOGICAL, INTENT(IN) :: EFF, PERLU_ON, UNDER_L0_OMP
640 INTEGER, INTENT(IN) :: OOC_STRAT, BLR_STRAT
641 INTEGER, INTENT(IN) :: KEEP(500)
642 INTEGER(8), INTENT(IN) :: KEEP8(150)
643 INTEGER, INTENT(IN) :: MYID, N, NELT, NSLAVES, LNA
644 INTEGER(8), INTENT(IN) :: NA_ELT8, NNZ8
645 INTEGER, INTENT(IN) :: NA(LNA)
646 INTEGER(8), INTENT(OUT):: MEMORY_BYTES
647 INTEGER, INTENT(OUT) :: MEMORY_MBYTES
648 INTEGER, INTENT(IN) :: BLR_CASE
649 LOGICAL, INTENT(IN) :: SUM_OF_PEAKS
650 LOGICAL, INTENT(IN) :: MEM_EFF_ALLOCATED
651 INTEGER, INTENT(IN) :: NBSTATS_I8, NBCOLS_I8
652 INTEGER(8), INTENT(IN) :: I8_L0_OMP (NBSTATS_I8, NBCOLS_I8)
653 INTEGER :: MUMPS_GET_POOL_LENGTH
655 INTEGER(8) :: MemEstimGlobal
656 LOGICAL :: I_AM_SLAVE, I_AM_MASTER
657 INTEGER :: PERLU, NBRECORDS
658 INTEGER(8) :: NB_REAL
659 INTEGER(8) :: TEMP, NB_BYTES, NB_INT
660 INTEGER :: DMUMPS_LBUF_INT
661 INTEGER(8) :: DMUMPS_LBUFR_BYTES8, DMUMPS_LBUF8
662 INTEGER :: NBUFS
663 INTEGER(8) :: TEMPI
664 INTEGER(8) :: TEMPR
665 INTEGER :: MIN_PERLU
666 INTEGER(8) :: BUF_OOC, BUF_OOC_PANEL, BUF_OOC_NOPANEL
667 INTEGER(8) :: OOC_NB_FILE_TYPE
668 INTEGER(8) :: NSTEPS8, N8, NELT8
669 INTEGER(8) :: I8OVERI
670 INTEGER(8) :: SUM_NRLADU_underL0,
671 & SUM_NRLADU_if_LR_LU_underL0,
672 & SUM_NRLADULR_UD_underL0,
673 & SUM_NRLADULR_WC_underL0
674 INTEGER(4) :: I4
675 INTEGER(8) :: MIN_NRLADU_underL0, MIN_NRLADU_if_LR_LU_underL0
676 INTEGER :: ITH, ITHMIN, ITHMIN_if_LRLU
677 INTEGER(8) :: I8_L0_OMP_2, I8_L0_OMP_3,
678 & I8_L0_OMP_5, I8_L0_OMP_6, I8_L0_OMP_7,
679 & I8_L0_OMP_8, I8_L0_OMP_9, I8_L0_OMP_10,
680 & I8_L0_OMP_11, I8_L0_OMP_12, I8_L0_OMP_13
681 i8overi = int(keep(10),8)
682 perlu = keep(12)
683 nsteps8 = int(keep(28),8)
684 n8 = int(n,8)
685 nelt8 = int(nelt,8)
686 IF (.NOT.perlu_on) perlu = 0
687 i_am_master = ( myid .eq. 0 )
688 i_am_slave = ( keep(46).eq. 1 .or. myid .ne. 0 )
689 temp = 0_8
690 nb_real = 0_8
691 nb_bytes = 0_8
692 nb_int = 0_8
693 IF (keep(235) .NE. 0 .OR. keep(237) .NE. 0) THEN
694 nb_int = nb_int + nsteps8
695 ENDIF
696 nb_int = nb_int + 5_8 * nsteps8
697 nb_int = nb_int + nsteps8 + int(keep(56),8)*int(nslaves+2,8)
698 nb_int = nb_int + 3_8 * n8
699 IF (keep(23).ne.0 .and. i_am_master) nb_int=nb_int + n8
700 IF (keep(55).eq.0) THEN
701 nb_int = nb_int + 2_8 * n8 * i8overi
702 ELSE
703 nb_int = nb_int + 2_8 * ( nelt8 + 1_8 ) * i8overi
704 ENDIF
705 IF (keep(55) .ne. 0 ) THEN
706 nb_int = nb_int + n8 + 1_8 + nelt8
707 END IF
708 nb_int = nb_int + int(lna,8)
709 IF ( .NOT. eff ) THEN
710 IF (i_am_slave) THEN
711 IF (under_l0_omp) THEN
712 i8_l0_omp_2 = 0_8
713 i8_l0_omp_3 = 0_8
714 min_nrladu_if_lr_lu_underl0 = i8_l0_omp(4,1)
715 min_nrladu_underl0 = i8_l0_omp(1,1)
716 ithmin = 1
717 ithmin_if_lrlu = 1
718 DO ith=1, keep(400)
719 IF (i8_l0_omp(1,ith).LT.min_nrladu_underl0)
720 & THEN
721 min_nrladu_underl0 = i8_l0_omp(1,ith)
722 ithmin = ith
723 ENDIF
724 IF (i8_l0_omp(4,ith).LT.min_nrladu_if_lr_lu_underl0)
725 & THEN
726 min_nrladu_if_lr_lu_underl0 = i8_l0_omp(4,ith)
727 ithmin_if_lrlu = ith
728 ENDIF
729 i8_l0_omp_2=i8_l0_omp_2 + i8_l0_omp(2,ith)
730 i8_l0_omp_3=i8_l0_omp_3 + i8_l0_omp(3,ith)
731 ENDDO
732 IF (sum_of_peaks.AND.blr_strat.GT.0) THEN
733 i8_l0_omp_5 = 0_8
734 i8_l0_omp_6 = 0_8
735 i8_l0_omp_7 = 0_8
736 i8_l0_omp_8 = 0_8
737 i8_l0_omp_9 = 0_8
738 i8_l0_omp_10= 0_8
739 i8_l0_omp_11= 0_8
740 i8_l0_omp_12= 0_8
741 i8_l0_omp_13= 0_8
742 DO ith=1, keep(400)
743 i8_l0_omp_5 = i8_l0_omp_5 + i8_l0_omp(5,ith)
744 i8_l0_omp_6 = i8_l0_omp_6 + i8_l0_omp(6,ith)
745 i8_l0_omp_7 = i8_l0_omp_7 + i8_l0_omp(7,ith)
746 i8_l0_omp_8 = i8_l0_omp_8 + i8_l0_omp(8,ith)
747 i8_l0_omp_9 = i8_l0_omp_9 + i8_l0_omp(9,ith)
748 i8_l0_omp_10= i8_l0_omp_10+ i8_l0_omp(10,ith)
749 i8_l0_omp_11= i8_l0_omp_11+ i8_l0_omp(11,ith)
750 i8_l0_omp_12= i8_l0_omp_12+ i8_l0_omp(12,ith)
751 i8_l0_omp_13= i8_l0_omp_13+ i8_l0_omp(13,ith)
752 ENDDO
753 ENDIF
755 & ooc_strat, blr_strat, blr_case, sum_of_peaks,
756 & keep8,
757 & 0_8, 0_8, 0_8, 0_8,
758 & i8_l0_omp_2,
759 & i8_l0_omp_3,
760 & i8_l0_omp_5,
761 & i8_l0_omp_6,
762 & i8_l0_omp_7,
763 & i8_l0_omp_8,
764 & i8_l0_omp_9,
765 & i8_l0_omp_10,
766 & i8_l0_omp_11,
767 & i8_l0_omp_12,
768 & i8_l0_omp_13,
769 & memestimglobal
770 & )
771 IF (blr_strat.EQ.0) THEN
772 IF ( ooc_strat .LE. 0 .AND. ooc_strat .NE. -1 ) THEN
773 memestimglobal = memestimglobal +
774 & i8_l0_omp(1,ithmin) +
775 & i8_l0_omp(23, ithmin)
776 ELSE
777 memestimglobal = memestimglobal +
778 & i8_l0_omp(23, ithmin)
779 ENDIF
780 ELSE
781 IF ( ooc_strat .LE. 0 .AND. ooc_strat .NE. -1 ) THEN
782 memestimglobal = memestimglobal +
783 & i8_l0_omp(4,ithmin_if_lrlu) +
784 & i8_l0_omp(23, ithmin_if_lrlu)
785 ELSE
786 memestimglobal = memestimglobal +
787 & i8_l0_omp(23, ithmin_if_lrlu)
788 ENDIF
789 ENDIF
790 nb_real = nb_real + memestimglobal +
791 & int(perlu,8)*(memestimglobal / 100_8 + 1_8 )
792 ELSE
793 IF ( keep8(24).EQ.0_8 ) THEN
794 sum_nrladu_underl0 = 0_8
795 sum_nrladu_if_lr_lu_underl0 = 0_8
796 sum_nrladulr_ud_underl0 = 0_8
797 sum_nrladulr_wc_underl0 = 0_8
798 IF (keep(400) .GT. 0 ) THEN
799 DO ith=1, keep(400)
800 sum_nrladu_underl0 =
801 & sum_nrladu_underl0 + i8_l0_omp(1,ith)
802 sum_nrladu_if_lr_lu_underl0 =
803 & sum_nrladu_if_lr_lu_underl0 + i8_l0_omp(4,ith)
804 sum_nrladulr_ud_underl0 =
805 & sum_nrladulr_ud_underl0 + i8_l0_omp(9,ith)
806 sum_nrladulr_wc_underl0 =
807 & sum_nrladulr_wc_underl0 + i8_l0_omp(10,ith)
808 ENDDO
809 ENDIF
811 & ooc_strat, blr_strat, blr_case, sum_of_peaks,
812 & keep8,
813 & sum_nrladu_underl0, sum_nrladu_if_lr_lu_underl0,
814 & sum_nrladulr_ud_underl0, sum_nrladulr_wc_underl0,
815 & keep8(53),
816 & keep8(54),
817 & keep8(33),
818 & keep8(34),
819 & keep8(35),
820 & keep8(50),
821 & keep8(36),
822 & keep8(47),
823 & keep8(37),
824 & keep8(38),
825 & keep8(39),
826 & memestimglobal
827 & )
828 IF (keep(400).LE.0) THEN
829 nb_real = nb_real + memestimglobal +
830 & int(perlu,8)*(memestimglobal / 100_8 + 1_8 )
831 ELSE IF (blr_strat.EQ.0) THEN
832 IF ( ooc_strat .GT. 0 .OR. ooc_strat .EQ. -1 ) THEN
833 nb_real = nb_real + memestimglobal +
834 & int(perlu,8)*(keep8(14) / 100_8 + 1_8 )
835 ELSE
836 nb_real = nb_real + memestimglobal +
837 & int(perlu,8)*(keep8(12) / 100_8 + 1_8 )
838 ENDIF
839 ELSE
840 nb_real = nb_real + memestimglobal +
841 & int(perlu,8)*(memestimglobal / 100_8 + 1_8 )
842 ENDIF
843 ENDIF
844 ENDIF
845 ELSE
846 nb_real = nb_real + 1_8
847 ENDIF
848 ELSE IF (i_am_slave) THEN
849 IF (under_l0_omp) THEN
850 IF (mem_eff_allocated) THEN
851 nb_real = nb_real + keep8(63)
852 ELSE
853 nb_real = nb_real + keep8(62)
854 ENDIF
855 ELSE
856 IF (mem_eff_allocated) THEN
857 nb_real = nb_real + keep8(23) + keep8(74)
858 ELSE
859 nb_real = nb_real + keep8(67) + keep8(74)
860 ENDIF
861 ENDIF
862 ENDIF
863 IF ( ooc_strat .GT. 0 .AND. i_am_slave ) THEN
864 buf_ooc_nopanel = 2_8 * keep8(119)
865 IF (keep(50).EQ.0)THEN
866 buf_ooc_panel = 8_8 * int(keep(226),8)
867 ELSE
868 buf_ooc_panel = 4_8 * int(keep(226),8)
869 ENDIF
870 IF (ooc_strat .EQ. 2) THEN
871 buf_ooc = buf_ooc_nopanel
872 ELSE
873 buf_ooc = buf_ooc_panel
874 ENDIF
875 nb_real = nb_real +
min(buf_ooc + int(
max(perlu,0),8) *
876 & (buf_ooc/100_8+1_8),12000000_8)
877 IF (ooc_strat .EQ. 2) THEN
878 ooc_nb_file_type = 1_8
879 ELSE
880 IF (keep(50).EQ.0) THEN
881 ooc_nb_file_type = 2_8
882 ELSE
883 ooc_nb_file_type = 1_8
884 ENDIF
885 ENDIF
886 nb_int = nb_int + ooc_nb_file_type * nsteps8 * i8overi
887 nb_int = nb_int + ooc_nb_file_type * nsteps8 * i8overi
888 nb_int = nb_int + ooc_nb_file_type * nsteps8
889 ENDIF
890 nb_real = nb_real + keep8(26)
891 IF (keep(252).EQ.1 .AND. .NOT. i_am_master) THEN
892 nb_real = nb_real + n8
893 ENDIF
894 IF ( .not. ( i_am_slave .and. i_am_master .and. keep(52) .eq. 0
895 & .and. keep(55) .ne. 0 ) ) THEN
896 nb_int = nb_int + keep8(27)
897 END IF
898 IF ( i_am_slave .and. keep(38) .ne. 0 ) THEN
899 nb_int = nb_int + 2_8 * n8
900 END IF
901 tempi= 0_8
902 tempr = 0_8
903 nbrecords = keep(39)
904 IF (keep(55).eq.0) THEN
905 IF (nnz8 < int(nbrecords,8)) THEN
906 nbrecords=int(nnz8)
907 ENDIF
908 ELSE
909 IF (na_elt8 < int(nbrecords,8)) THEN
910 nbrecords=int(na_elt8)
911 ENDIF
912 ENDIF
913 IF ( keep(54) .eq. 0 ) THEN
914 IF ( i_am_master ) THEN
915 IF ( keep(46) .eq. 0 ) THEN
916 nbufs = nslaves
917 ELSE
918 nbufs = nslaves - 1
919 IF (keep(55) .eq. 0 )
920 & tempi = tempi + 2_8 * n8
921 END IF
922 tempi = tempi + 2_8 * int(nbrecords,8) * int(nbufs,8)
923 tempr = tempr + int(nbrecords,8) * int(nbufs,8)
924 ELSE
925 IF ( keep(55) .eq. 0 )THEN
926 tempi = tempi + 2_8 * int(nbrecords,8)
927 tempr = tempr + int(nbrecords,8)
928 END IF
929 END IF
930 ELSE
931 IF ( i_am_slave ) THEN
932 tempi = tempi + int(1+4*nslaves,8) * int(nbrecords,8)
933 tempr = tempr + int(1+2*nslaves,8) * int(nbrecords,8)
934 END IF
935 END IF
936 temp =
max( nb_bytes + (nb_int + tempi) * int(keep(34),8)
937 & + (nb_real+tempr) * int(keep(35),8)
938 & , temp )
939 IF ( i_am_slave ) THEN
940 IF (blr_strat.NE.0) THEN
941 dmumps_lbufr_bytes8 = int(keep(380),8) * int(keep(35),8)
942 ELSE
943 dmumps_lbufr_bytes8 = int(keep(44),8) * int(keep(35),8)
944 ENDIF
945 dmumps_lbufr_bytes8 =
max( dmumps_lbufr_bytes8,
946 & 100000_8 )
947 IF (keep(48).EQ.5) THEN
948 min_perlu=2
949 ELSE
950 min_perlu=0
951 ENDIF
952 dmumps_lbufr_bytes8 = dmumps_lbufr_bytes8
953 & + int( 2.0d0 * dble(
max(perlu,min_perlu))*
954 & dble(dmumps_lbufr_bytes8)/100d0,8)
955 dmumps_lbufr_bytes8 =
min(dmumps_lbufr_bytes8,
956 & int(huge(i4)-100,8))
957 nb_bytes = nb_bytes + dmumps_lbufr_bytes8
958 IF (.NOT.under_l0_omp) THEN
959 IF (blr_strat.NE.0) THEN
960 dmumps_lbuf8 = int( dble(keep(213)) / 100.0d0
961 & * dble(keep( 379 ) * keep( 35 )), 8 )
962 ELSE
963 dmumps_lbuf8 = int( dble(keep(213)) / 100.0d0
964 & * dble(keep( 43 ) * keep( 35 )), 8 )
965 ENDIF
966 dmumps_lbuf8 =
max( dmumps_lbuf8, 100000_8 )
967 dmumps_lbuf8 = dmumps_lbuf8
968 & + int( 2.0d0 * dble(
max(perlu,min_perlu))*
969 & dble(dmumps_lbuf8)/100d0, 8)
970 dmumps_lbuf8 =
min(dmumps_lbuf8, int(huge(i4)-100,8))
971 dmumps_lbuf8 =
max(dmumps_lbuf8, dmumps_lbufr_bytes8+
972 & 3_8*int(keep(34),8))
973 nb_bytes = nb_bytes + dmumps_lbuf8
974 ENDIF
975 dmumps_lbuf_int = ( keep(56) +
976 & nslaves * nslaves ) * 5
977 & * keep(34)
978 nb_bytes = nb_bytes + int(dmumps_lbuf_int,8)
979 IF (.NOT.eff) THEN
980 IF (under_l0_omp) THEN
981 nb_int = nb_int + n8*int(keep(400),8)
982 nb_int = nb_int +
984 & int(keep(400),8)
985 ELSE
986 IF (keep(400).GT.0) THEN
987 nb_int = nb_int +
989 & int(keep(400),8)
990 ENDIF
991 ENDIF
992 IF (ooc_strat .GT. 0) THEN
993 nb_int = nb_int + int(
994 & keep(138) + 3 *
max(perlu,10) *
995 & ( keep(138) / 100 + 1 )
996 & ,8)
997 ELSE
998 nb_int = nb_int + int(
999 & keep(137) + 3 *
max(perlu,10) *
1000 & ( keep(137) / 100 + 1 )
1001 & ,8)
1002 ENDIF
1003 ENDIF
1004 IF (.NOT.under_l0_omp) THEN
1005 IF (ooc_strat .GT. 0) THEN
1006 nb_int = nb_int + int(
1007 & keep(225) + 2 *
max(perlu,10) *
1008 & ( keep(225) / 100 + 1 )
1009 & ,8)
1010 ELSE
1011 nb_int = nb_int + int(
1012 & keep(15) + 2 *
max(perlu,10) *
1013 & ( keep(15) / 100 + 1 )
1014 & ,8)
1015 ENDIF
1016 ENDIF
1017 nb_int = nb_int + nsteps8
1018 nb_int = nb_int + nsteps8 * i8overi
1019 nb_int = nb_int + n8 + 4_8 * nsteps8 +
1021 nb_int = nb_int + 2_8 * nsteps8 * i8overi
1022 IF (keep(494).NE.0) THEN
1023 nb_int = nb_int + n8
1024 ENDIF
1025 ENDIF
1026 memory_bytes = nb_bytes + nb_int * int(keep(34),8) +
1027 & nb_real * int(keep(35),8)
1028 memory_bytes =
max( memory_bytes, temp )
1029 memory_mbytes = nint( dble(memory_bytes) / dble(1000000) )
1030 RETURN