2491 IMPLICIT NONE
2492 INTEGER, intent(in) :: KEEP(500),SIZE_SLAVES_LIST
2493 INTEGER(8) KEEP8(150)
2494 INTEGER, intent(in) :: SLAVEF, NFRONT, NCB,MYID
2495 INTEGER, intent(in) :: NCBSON_MAX
2496 INTEGER, intent(in) :: PROCS(SLAVEF+1)
2497 INTEGER, intent(in) :: MEM_DISTRIB(0:SLAVEF-1),INODE
2498 INTEGER, intent(in) :: MP,LP
2499 INTEGER, intent(out):: SLAVES_LIST(SIZE_SLAVES_LIST)
2500 INTEGER, intent(out):: TAB_POS(SLAVEF+2)
2501 INTEGER, intent(out):: NSLAVES_NODE
2502 INTEGER NUMBER_OF_PROCS,K47,K48, K50,K83,K69
2503 INTEGER(8) :: K821
2504 INTEGER J
2505 INTEGER KMIN, KMAX
2506 INTEGER OTHERS,CHOSEN,SMALL_SET,ACC
2507 DOUBLE PRECISION SOMME,TMP_SUM,DELTA,A,B,C,MASTER_WORK
2508 INTEGER AFFECTED
2509 INTEGER ADDITIONNAL_ROWS,i,X,REF,POS,NELIM
2510 INTEGER(8) X8
2511 LOGICAL FORCE_CAND,SMP
2512 DOUBLE PRECISION BANDE_K821
2513 INTEGER NB_SAT,NB_ZERO
2514 DOUBLE PRECISION TEMP(SLAVEF),TOTAL_COST, MAX_MEM_ALLOW
2515 INTEGER TEMP_ID(SLAVEF),NB_ROWS(SLAVEF)
2516 INTEGER NSLAVES_REF,NCB_FILS
2518 INTEGER MUMPS_GETKMIN
2519 INTEGER POS_MIN_LOAD,SIZE_MY_SMP,WHAT
2520 LOGICAL HAVE_TYPE1_SON
2521 DOUBLE PRECISION MIN_LOAD,MAX_LOAD,TEMP_MAX_LOAD
2522 DOUBLE PRECISION MPI_WTIME
2523 DOUBLE PRECISION BUF_SIZE,NELIM_MEM_SIZE
2524 DOUBLE PRECISION MEM_SIZE_STRONG(SLAVEF),MEM_SIZE_WEAK(SLAVEF)
2525 k821=abs(keep8(21))
2526 temp_max_load=dble(0)
2527 k50=keep(50)
2528 k48=keep(48)
2529 k47=keep(47)
2530 k83=keep(83)
2531 k69=0
2532 ncb_fils=ncbson_max
2533 IF(int(ncb_fils,8)*int(
min(ncb,ncb_fils),8).GT.k821)
THEN
2534 have_type1_son=.true.
2535 ELSE
2536 have_type1_son=.false.
2537 ENDIF
2538 smp=(k69.NE.0)
2539 IF ( keep(24) == 0 .OR. keep(24) == 1 ) THEN
2540 force_cand = .false.
2541 ELSE
2542 force_cand = (mod(keep(24),2).eq.0)
2543 END IF
2544 nelim=nfront-ncb
2545 kmax=int(k821/int(ncb,8))
2546 IF(force_cand)THEN
2547 DO i=1,procs(slavef+1)
2548 wload(i)=load_flops(procs(i))
2549 idwload(i)=procs(i)
2550 wload(i)=
max(wload(i),0.0d0)
2551 ENDDO
2552 number_of_procs=procs(slavef+1)
2553 others=number_of_procs
2554 ELSE
2555 number_of_procs=slavef
2556 wload(1:slavef) = load_flops(0:number_of_procs-1)
2557 DO i=1,number_of_procs
2558 idwload(i) = i - 1
2559 IF (wload(i) < -0.5d0 ) THEN
2560 IF((mp.GT.0).AND.(lp.GE.2))THEN
2561 WRITE(mp,*)myid,': Negative load ',
2562 & wload(i)
2563 ENDIF
2564 ENDIF
2565 wload(i)=
max(wload(i),0.0d0)
2566 ENDDO
2567 others=number_of_procs-1
2568 ENDIF
2569 kmax=int(ncb/others)
2571 nb_rows=0
2573 IF(k50.EQ.0)THEN
2574 total_cost=dble( nelim ) * dble( ncb ) +
2575 & dble(ncb) * dble(nelim)*dble(2*nfront-nelim-1)
2576 ELSE
2577 total_cost=dble(nelim) * dble( ncb ) *
2578 & dble(nfront+1)
2579 ENDIF
2581 & 2,master_work)
2582 somme=dble(0)
2583 j=1
2584 IF(force_cand.AND.(number_of_procs.GT.k83))THEN
2585 master_work=dble(keep(88))*master_work/dble(100)
2586 ENDIF
2587 IF(force_cand.AND.(number_of_procs.LE.k83))THEN
2588 master_work=dble(keep(87))*master_work/dble(100)
2589 ENDIF
2590 IF(master_work.LT.dble(1))THEN
2591 master_work=dble(1)
2592 ENDIF
2593 nslaves_ref=int(total_cost/master_work)+1
2594 IF(force_cand)THEN
2595 nslaves_ref=
min(nslaves_ref,number_of_procs)
2596 ELSE
2597 nslaves_ref=
min(nslaves_ref,number_of_procs-1)
2598 ENDIF
2599 DO i=1,number_of_procs
2600 IF((idwload(i).NE.myid))THEN
2601 temp_id(j)=idwload(i)
2602 temp(j)=wload(i)
2603 IF(bdc_m2_flops)THEN
2604 temp(j)=temp(j)+niv2(temp_id(j)+1)
2605 ENDIF
2606 j=j+1
2607 ENDIF
2608 ENDDO
2609 number_of_procs=j-1
2611 somme=dble(0)
2612 tmp_sum=dble(0)
2613 DO i=1,others
2614 somme=somme+temp(others)-temp(i)
2615 tmp_sum=tmp_sum+temp(i)
2616 ENDDO
2617 tmp_sum=(tmp_sum/dble(others))+
2618 & (total_cost/dble(others))
2619 size_my_smp=others
2620 min_load=temp(1)
2621 pos_min_load=1
2622 IF(.NOT.smp) max_load=temp(others)
2623 IF(smp)THEN
2624 j=1
2625 DO i=1,others
2626 IF(mem_distrib(temp_id(i)).EQ.1)THEN
2627 IF(temp(i).LE.tmp_sum)THEN
2628 wload(j)=temp(i)
2629 idwload(j)=temp_id(i)
2630 j=j+1
2631 ELSE
2632 ENDIF
2633 ENDIF
2634 ENDDO
2635 max_load=wload(j-1)
2636 size_my_smp=j-1
2637 DO i=1,others
2638 IF((mem_distrib(temp_id(i)).NE.1).OR.
2639 & ((mem_distrib(temp_id(i)).EQ.1).AND.
2640 & (temp(i).GE.tmp_sum)))THEN
2641 wload(j)=temp(i)
2642 idwload(j)=temp_id(i)
2643 j=j+1
2644 ENDIF
2645 ENDDO
2646 temp=wload
2647 temp_id=idwload
2648 ENDIF
2649 IF(bdc_md)THEN
2650 buf_size=dble(k821)
2651 IF (keep(201).EQ.2) THEN
2652 a=dble(int((dble(keep(100))/dble(2))/dble(nelim)))
2653 IF(k50.EQ.0)THEN
2654 buf_size=
min(buf_size,a*dble(ncb))
2655 ELSE
2656 buf_size=
min(buf_size,a*a)
2657 ENDIF
2658 ENDIF
2659 buf_size=dble(k821)
2660 DO i=1,number_of_procs
2661 a=dble(md_mem(temp_id(i)))/
2662 & dble(nelim)
2663 a=a*dble(nfront)
2664 IF(k50.EQ.0)THEN
2665 b=dble(int(dble(ncb)/dble(number_of_procs))+1)*
2666 & dble(nfront)
2667 ELSE
2668 what = 5
2670 & nfront,
min(ncb,others), j, x8)
2671 b=dble(x8)+(dble(j)*dble(nelim))
2672 ENDIF
2673 nelim_mem_size=a+b
2674 mem_size_weak(i)=nelim_mem_size
2675 IF((sbtr_which_m.EQ.0).OR.(.NOT.bdc_sbtr))THEN
2676 IF(bdc_m2_mem)THEN
2677 mem_size_strong(i)=
2678 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2679 & lu_usage(temp_id(i))-niv2(temp_id(i)+1)
2680 ELSE
2681 mem_size_strong(i)=
2682 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2683 & lu_usage(temp_id(i))
2684 ENDIF
2685 ELSE
2686 IF(bdc_sbtr)THEN
2687 IF(bdc_m2_mem)THEN
2688 mem_size_strong(i)=
2689 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2690 & lu_usage(temp_id(i))-niv2(temp_id(i)+1)-
2691 & (sbtr_mem(temp_id(i))-sbtr_cur(temp_id(i)))
2692 ELSE
2693 mem_size_strong(i)=
2694 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2695 & lu_usage(temp_id(i))-
2696 & (sbtr_mem(temp_id(i))-sbtr_cur(temp_id(i)))
2697 ENDIF
2698 ENDIF
2699 ENDIF
2700 IF(
min(mem_size_strong(i),mem_size_weak(i)).LT.dble(0))
THEN
2701 IF(mem_size_strong(i).LT.0.0d0)THEN
2702 mem_size_strong(i)=dble(0)
2703 ELSE
2704 mem_size_weak(i)=dble(0)
2705 ENDIF
2706 ENDIF
2707 ENDDO
2708 ELSE
2709 buf_size=dble(k821)
2710 DO i=1,number_of_procs
2711 IF((sbtr_which_m.EQ.0).OR.(.NOT.bdc_sbtr))THEN
2712 IF(bdc_m2_mem)THEN
2713 mem_size_strong(i)=
2714 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2715 & lu_usage(temp_id(i))-niv2(temp_id(i)+1)
2716 ELSE
2717 mem_size_strong(i)=
2718 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2719 & lu_usage(temp_id(i))
2720 ENDIF
2721 ELSE
2722 IF(bdc_sbtr)THEN
2723 IF(bdc_m2_mem)THEN
2724 mem_size_strong(i)=
2725 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2726 & lu_usage(temp_id(i))-niv2(temp_id(i)+1)-
2727 & (sbtr_mem(temp_id(i))-sbtr_cur(temp_id(i)))
2728 ELSE
2729 mem_size_strong(i)=
2730 & dble(tab_maxs(temp_id(i)))-dm_mem(temp_id(i))-
2731 & lu_usage(temp_id(i))-
2732 & (sbtr_mem(temp_id(i))-sbtr_cur(temp_id(i)))
2733 ENDIF
2734 ENDIF
2735 ENDIF
2736 mem_size_strong(i)=
max(dble(0),mem_size_strong(i))
2737 mem_size_weak(i)=huge(mem_size_weak(i))
2738 ENDDO
2739 ENDIF
2740 IF((((number_of_procs.LE.k83).AND.force_cand).AND.
2741 & (total_cost.GE.somme)).OR.
2742 & (.NOT.force_cand).OR.
2743 & (((number_of_procs+1).GT.k83).AND.force_cand))THEN
2744 ref=nslaves_ref
2745 small_set=nslaves_ref
2746 IF(.NOT.smp)THEN
2747 DO i=nslaves_ref,1,-1
2748 somme=dble(0)
2749 DO j=1,i
2750 somme=somme+temp(j)
2751 ENDDO
2752 somme=(dble(i)*temp(i))-somme
2753 IF(total_cost.GE.somme) GOTO 444
2754 ENDDO
2755 444 CONTINUE
2756 ref=i
2757 small_set=ref
2758 max_load=temp(small_set)
2759 ELSE
2760 x=
min(size_my_smp,nslaves_ref)
2761 450 CONTINUE
2762 somme=dble(0)
2763 DO j=1,x
2764 somme=somme+(temp(x)-temp(j))
2765 ENDDO
2766 IF(somme.GT.total_cost)THEN
2767 x=x-1
2768 GOTO 450
2769 ELSE
2770 IF(x.LT.size_my_smp) THEN
2771 ref=x
2772 small_set=ref
2773 max_load=temp(small_set)
2774 ELSE
2775 x=
min(size_my_smp,nslaves_ref)
2776 j=x+1
2777 max_load=temp(x)
2778 tmp_sum=max_load
2779 DO i=x+1,others
2780 IF(temp(i).GT.max_load)THEN
2781 somme=somme+(dble(i-1)*(temp(i)-max_load))
2782 tmp_sum=max_load
2783 max_load=temp(i)
2784 ELSE
2785 somme=somme+(max_load-temp(i))
2786 ENDIF
2787 IF(i.EQ.nslaves_ref)THEN
2788 small_set=nslaves_ref
2789 ref=small_set
2790 GOTO 323
2791 ENDIF
2792 IF(somme.GT.total_cost)THEN
2793 ref=i-1
2794 small_set=i-1
2795 max_load=tmp_sum
2796 GOTO 323
2797 ENDIF
2798 ENDDO
2799 ENDIF
2800 ENDIF
2801 ENDIF
2802 323 CONTINUE
2803 max_load=dble(0)
2804 DO i=1,small_set
2805 max_load=
max(max_load,temp(i))
2806 ENDDO
2807 temp_max_load=max_load
2808 nb_rows=0
2809 tmp_sum=dble(0)
2810 chosen=0
2811 acc=0
2812 nb_sat=0
2813 nb_zero=0
2814 DO i=1,small_set
2815 IF(k50.EQ.0)THEN
2816 x=int(buf_size/dble(ncb+1))-1
2817 bande_k821=dble(x)*dble(nfront)
2818 ELSE
2819 a=dble(1)
2820 b=dble(acc+2)
2821 c=-buf_size+dble(acc+nelim)
2822 delta=(b*b)-(dble(4)*a*c)
2823 x=int((-b+sqrt(delta))/(dble(2)*a))
2824 IF(x.GT.ncb-acc) x=ncb-acc
2825 bande_k821=dble(x)*dble(nelim+acc+x)
2826 ENDIF
2827 IF(have_type1_son)THEN
2828 IF(k50.EQ.0)THEN
2829 x=int((buf_size-dble(nfront))/dble(nfront+1))
2830 bande_k821=dble(x)*dble(nfront)
2831 ELSE
2832 a=dble(1)
2833 b=dble(acc+2+nelim)
2834 c=-buf_size+dble(acc+nelim)
2835 delta=(b*b)-(dble(4)*a*c)
2836 x=int((-b+sqrt(delta))/(dble(2)*a))
2837 IF(x.GT.ncb-acc) x=ncb-acc
2838 bande_k821=dble(x)*dble(nelim+acc+x)
2839 ENDIF
2840 ENDIF
2841 max_mem_allow=bande_k821
2842 IF(bdc_md)THEN
2844 &
min(mem_size_weak(i),mem_size_strong(i)),
2845 & bande_k821)
2846 max_mem_allow=
max(dble(0),max_mem_allow)
2847 ENDIF
2848 IF(k50.EQ.0)THEN
2849 kmax=int(max_mem_allow/dble(nfront))
2850 x=int((max_load-temp(i))/
2851 & (dble(nelim)*dble(2*nfront-nelim)))
2852 IF(x.GE.kmax)THEN
2853 IF(kmax.GE.kmin)THEN
2854 x=kmax
2855 nb_sat=nb_sat+1
2856 ELSE
2857 x=0
2858 ENDIF
2859 ELSE
2860 IF(x.LT.kmin)THEN
2861 x=0
2862 ENDIF
2863 ENDIF
2864 IF((acc+x).GT.ncb) x=ncb-acc
2865 ENDIF
2866 IF(k50.NE.0)THEN
2867 a=dble(1)
2868 b=dble(acc+nelim)
2869 c=dble(-max_mem_allow)
2870 delta=((b*b)-(dble(4)*a*c))
2871 kmax=int((-b+sqrt(delta))/(dble(2)*a))
2872 a=dble(nelim)
2873 b=dble(nelim)*(dble(nelim)+dble(2*acc+1))
2874 c=-(max_load-temp(i))
2875 delta=(b*b-(dble(4)*a*c))
2876 x=int((-b+sqrt(delta))/(dble(2)*a))
2877 IF(x.LT.0) THEN
2878 WRITE(*,*)myid,
2879 & ': Internal error 1 in DMUMPS_SET_PARTI_FLOP_IRR'
2881 ENDIF
2882 IF(x.GE.kmax)THEN
2883 IF(kmax.GE.kmin)THEN
2884 x=kmax
2885 nb_sat=nb_sat+1
2886 ELSE
2887 x=0
2888 ENDIF
2889 ELSE
2890 IF(x.LT.kmin)THEN
2891 x=0
2892 ENDIF
2893 ENDIF
2894 IF((acc+x).GT.ncb) x=ncb-acc
2895 ENDIF
2896 nb_rows(i)=x
2897 acc=acc+x
2898 chosen=chosen+1
2899 IF(smp)THEN
2900 IF(min_load.GT.temp(i))THEN
2901 min_load=temp(i)
2902 pos_min_load=i
2903 ENDIF
2904 ENDIF
2905 tmp_sum=max_load
2906 IF(k50.EQ.0)THEN
2907 max_load=
max(max_load,
2908 & (temp(i)+(dble(nelim) *
2909 & dble(nb_rows(i)))+
2910 & (dble(nb_rows(i))*dble(nelim)*
2911 & dble(2*nfront-nelim-1))))
2912 ELSE
2913 max_load=
max(max_load,
2914 & temp(i)+(dble(nelim) * dble(nb_rows(i)))*
2915 & dble(2*(nelim+acc)-nb_rows(i)
2916 & -nelim+1))
2917 ENDIF
2918 IF(tmp_sum.LT.max_load)THEN
2919 ENDIF
2920 IF(ncb-acc.LT.kmin) GOTO 888
2921 IF(ncb.EQ.acc) GOTO 888
2922 IF(acc.GT.ncb) THEN
2923 WRITE(*,*)myid,
2924 & ': Internal error 2 in DMUMPS_SET_PARTI_FLOP_IRR'
2926 ENDIF
2927 ENDDO
2928 888 CONTINUE
2929 somme=dble(0)
2930 x=nfront-ncb
2931 IF((acc.GT.ncb))THEN
2932 WRITE(*,*)myid,
2933 & ': Internal error 3 in DMUMPS_SET_PARTI_FLOP_IRR'
2935 ENDIF
2936 IF((acc.LT.ncb))THEN
2937 IF(k50.NE.0)THEN
2938 IF(small_set.LE.others)THEN
2939 IF((nb_sat.EQ.small_set).AND.(small_set.LT.
2940 & nslaves_ref))THEN
2941 small_set=ref+1
2942 ref=ref+1
2943 nb_rows=0
2944 GOTO 323
2945 ENDIF
2946 DO i=1,small_set
2947 max_load=temp_max_load
2948 additionnal_rows=ncb-acc
2949 somme=dble(nelim)*
2950 & dble(additionnal_rows)*
2951 & dble(2*nfront-additionnal_rows-nelim
2952 & +1)
2953 somme=somme/dble(small_set-nb_sat)
2954 nb_rows=0
2955 nb_zero=0
2956 acc=0
2957 chosen=0
2958 nb_sat=0
2959 IF(smp)THEN
2960 min_load=temp(1)
2961 pos_min_load=1
2962 ENDIF
2963 DO j=1,small_set
2964 a=dble(1)
2965 b=dble(acc+2)
2966 c=-buf_size+dble(acc+nelim)
2967 delta=(b*b)-(dble(4)*a*c)
2968 x=int((-b+sqrt(delta))/(dble(2)*a))
2969 IF(x.GT.ncb-acc) x=ncb-acc
2970 bande_k821=dble(x)*dble(nelim+acc+x)
2971 IF(have_type1_son)THEN
2972 a=dble(1)
2973 b=dble(acc+2+nelim)
2974 c=-buf_size+dble(acc+nelim)
2975 delta=(b*b)-(dble(4)*a*c)
2976 x=int((-b+sqrt(delta))/(dble(2)*a))
2977 IF(x.GT.ncb-acc) x=ncb-acc
2978 bande_k821=dble(x)*dble(nelim+acc+x)
2979 ENDIF
2980 max_mem_allow=bande_k821
2981 IF(bdc_md)THEN
2983 &
min(mem_size_weak(j),mem_size_strong(j)),
2984 & bande_k821)
2985 max_mem_allow=
max(dble(0),
2986 & max_mem_allow)
2987 ENDIF
2988 a=dble(1)
2989 b=dble(acc+nelim)
2990 c=dble(-max_mem_allow)
2991 delta=((b*b)-(dble(4)*a*c))
2992 kmax=int((-b+sqrt(delta))/(dble(2)*a))
2993 a=dble(nelim)
2994 b=(dble(nelim)*dble(nelim+2*acc+1))
2995 c=-(max_load-temp(j)+somme)
2996 delta=(b*b-(dble(4)*a*c))
2997 x=int((-b+sqrt(delta))/(dble(2)*a))
2998 x=x+1
2999 IF(x.LT.0) THEN
3000 WRITE(*,*)myid,
3001 & ': Internal error 4 in DMUMPS_SET_PARTI_FLOP_IRR'
3003 ENDIF
3004 IF(x.GE.kmax)THEN
3005 IF(kmax.GE.kmin)THEN
3006 x=kmax
3007 nb_sat=nb_sat+1
3008 ELSE
3009 nb_zero=nb_zero+1
3010 x=0
3011 ENDIF
3012 ELSE
3013 IF(x.LT.
min(kmin,kmax))
THEN
3014 nb_zero=nb_zero+1
3015 x=0
3016 ENDIF
3017 ENDIF
3018 IF((acc+x).GT.ncb) x=ncb-acc
3019 nb_rows(j)=x
3020 IF(smp)THEN
3021 IF(min_load.GT.temp(j))THEN
3022 min_load=temp(j)
3023 pos_min_load=i
3024 ENDIF
3025 ENDIF
3026 chosen=chosen+1
3027 acc=acc+x
3028 tmp_sum=max_load
3029 temp_max_load=
max(temp_max_load,
3030 & temp(j)+(dble(nelim) *
3031 & dble(nb_rows(j)))*
3032 & dble(2*(nelim+
3033 & acc)-nb_rows(j)
3034 & -nelim+1))
3035 IF(ref.LE.number_of_procs-1)THEN
3036 IF(temp_max_load.GT.temp(ref+1))THEN
3037 IF(small_set.LT.nslaves_ref)THEN
3038 small_set=ref+1
3039 ref=ref+1
3040 nb_rows=0
3041 GOTO 323
3042 ENDIF
3043 ENDIF
3044 ENDIF
3045 IF(ncb.EQ.acc) GOTO 666
3046 ENDDO
3047 IF(nb_sat.EQ.small_set)THEN
3048 IF(small_set.LT.nslaves_ref)THEN
3049 small_set=ref+1
3050 ref=ref+1
3051 nb_rows=0
3052 GOTO 323
3053 ELSE
3054 GOTO 434
3055 ENDIF
3056 ENDIF
3057 IF(nb_zero.EQ.small_set)THEN
3058 IF(small_set.LT.nslaves_ref)THEN
3059 small_set=ref+1
3060 ref=ref+1
3061 nb_rows=0
3062 GOTO 323
3063 ELSE
3064 GOTO 434
3065 ENDIF
3066 ENDIF
3067 IF((nb_sat+nb_zero).EQ.small_set)THEN
3068 IF(small_set.LT.nslaves_ref)THEN
3069 small_set=ref+1
3070 ref=ref+1
3071 nb_rows=0
3072 GOTO 323
3073 ELSE
3074 GOTO 434
3075 ENDIF
3076 ENDIF
3077 ENDDO
3078 434 CONTINUE
3079 additionnal_rows=ncb-acc
3080 IF(additionnal_rows.NE.0)THEN
3081 IF(additionnal_rows.LT.kmin)THEN
3082 i=chosen
3083 j=acc
3084 436 CONTINUE
3085 IF(nb_rows(i).NE.0)THEN
3086 j=j-nb_rows(i)
3087 a=dble(1)
3088 b=dble(j+2)
3089 c=-buf_size+dble(j+nelim)
3090 delta=(b*b)-(dble(4)*a*c)
3091 x=int((-b+sqrt(delta))/(dble(2)*a))
3092 IF(x.GT.ncb-j) x=ncb-j
3093 bande_k821=dble(x)*dble(nelim+j+x)
3094 IF(have_type1_son)THEN
3095 a=dble(1)
3096 b=dble(j+2+nelim)
3097 c=-buf_size+dble(j+nelim)
3098 delta=(b*b)-(dble(4)*a*c)
3099 x=int((-b+sqrt(delta))/(dble(2)*a))
3100 IF(x.GT.ncb-j) x=ncb-j
3101 bande_k821=dble(x)*dble(nelim+j+x)
3102 ENDIF
3103 max_mem_allow=bande_k821
3104 IF(bdc_md)THEN
3106 &
min(mem_size_weak(i),mem_size_strong(i)),
3107 & bande_k821)
3108 max_mem_allow=
max(dble(0),
3109 & max_mem_allow)
3110 ENDIF
3111 a=dble(1)
3112 b=dble(j+nelim)
3113 c=dble(-max_mem_allow)
3114 delta=((b*b)-(dble(4)*a*c))
3115 kmax=int((-b+sqrt(delta))/(dble(2)*a))
3116 IF(nb_rows(i).NE.kmax)THEN
3117 IF(ncb-j.LE.kmax)THEN
3118 nb_rows(i)=+ncb-j
3119 additionnal_rows=0
3120 ENDIF
3121 ENDIF
3122 temp_max_load=
max(temp_max_load,
3123 & temp(i)+
3124 & (dble(nelim) * dble(nb_rows(i)))*
3125 & dble(2*(nelim+
3126 & acc)-nb_rows(i)
3127 & -nelim+1))
3128 IF(ref.LE.number_of_procs-1)THEN
3129 IF(temp_max_load.GT.temp(ref+1))THEN
3130 IF(small_set.LT.nslaves_ref)THEN
3131 small_set=ref+1
3132 ref=ref+1
3133 nb_rows=0
3134 GOTO 323
3135 ENDIF
3136 ENDIF
3137 ENDIF
3138 ELSE
3139 i=i-1
3140 IF(i.NE.0)GOTO 436
3141 ENDIF
3142 IF(additionnal_rows.NE.0)THEN
3143 i=chosen
3144 IF(i.NE.small_set)THEN
3145 i=i+1
3146 IF(nb_rows(i).NE.0)THEN
3147 WRITE(*,*)myid,
3148 & ': Internal error 5 in DMUMPS_SET_PARTI_FLOP_IRR'
3150 ENDIF
3151 ENDIF
3152 nb_rows(i)=nb_rows(i)+additionnal_rows
3153 additionnal_rows=0
3154 ENDIF
3155 chosen=i
3156 ENDIF
3157 ENDIF
3158 i=chosen+1
3159 DO WHILE ((additionnal_rows.NE.0)
3160 & .AND.(i.LE.number_of_procs))
3161 IF((temp(i).LE.max_load))THEN
3162 a=dble(1)
3163 b=dble(acc+2)
3164 c=-buf_size+dble(acc+nelim)
3165 delta=(b*b)-(dble(4)*a*c)
3166 x=int((-b+sqrt(delta))/(dble(2)*a))
3167 IF(x.GT.ncb-acc) x=ncb-acc
3168 bande_k821=dble(x)*dble(nelim+acc+x)
3169 IF(have_type1_son)THEN
3170 a=dble(1)
3171 b=dble(acc+2+nelim)
3172 c=-buf_size+dble(acc+nelim)
3173 delta=(b*b)-(dble(4)*a*c)
3174 x=int((-b+sqrt(delta))/(dble(2)*a))
3175 IF(x.GT.ncb-acc) x=ncb-acc
3176 bande_k821=dble(x)*dble(nelim+acc+x)
3177 ENDIF
3178 max_mem_allow=bande_k821
3179 IF(bdc_md)THEN
3181 &
min(mem_size_weak(i),mem_size_strong(i)),
3182 & bande_k821)
3183 max_mem_allow=
max(dble(0),
3184 & max_mem_allow)
3185 ENDIF
3186 a=dble(1)
3187 b=dble(acc+nelim)
3188 c=dble(-max_mem_allow)
3189 delta=((b*b)-(dble(4)*a*c))
3190 kmax=int((-b+sqrt(delta))/(dble(2)*a))
3191 a=dble(nelim)
3192 b=dble(nelim)*dble(nelim+2*acc+1)
3193 c=-(max_load-temp(i))
3194 delta=(b*b-(dble(4)*a*c))
3195 x=int((-b+sqrt(delta))/(dble(2)*a))
3196 IF(x.GE.kmax)THEN
3197 IF(kmax.GE.kmin)THEN
3198 x=kmax
3199 ELSE
3200 x=0
3201 ENDIF
3202 ELSE
3203 IF(x.LT.kmin)THEN
3204 x=0
3205 ENDIF
3206 ENDIF
3207 IF((acc+x).GT.ncb) x=ncb-acc
3208 nb_rows(i)=x
3209 acc=acc+x
3210 additionnal_rows=ncb-acc
3211 ELSE IF((temp(i).GT.max_load))THEN
3212 max_load=temp(i)
3213 nb_sat=0
3214 acc=0
3215 nb_rows=0
3216 DO j=1,i
3217 a=dble(1)
3218 b=dble(acc+2)
3219 c=-buf_size+dble(acc+nelim)
3220 delta=(b*b)-(dble(4)*a*c)
3221 x=int((-b+sqrt(delta))/(dble(2)*a))
3222 IF(x.GT.ncb-acc) x=ncb-acc
3223 bande_k821=dble(x)*dble(nelim+acc+x)
3224 IF(have_type1_son)THEN
3225 a=dble(1)
3226 b=dble(acc+2+nelim)
3227 c=-buf_size+dble(acc+nelim)
3228 delta=(b*b)-(dble(4)*a*c)
3229 x=int((-b+sqrt(delta))/(dble(2)*a))
3230 IF(x.GT.ncb-acc) x=ncb-acc
3231 bande_k821=dble(x)*dble(nelim+acc+x)
3232 ENDIF
3233 max_mem_allow=bande_k821
3234 IF(bdc_md)THEN
3236 &
min(mem_size_weak(j),mem_size_strong(j)),
3237 & bande_k821)
3238 max_mem_allow=
max(dble(0),
3239 & max_mem_allow)
3240 ENDIF
3241 a=dble(1)
3242 b=dble(acc+nelim)
3243 c=dble(-max_mem_allow)
3244 delta=((b*b)-(dble(4)*a*c))
3245 kmax=int((-b+sqrt(delta))/(dble(2)*a))
3246 a=dble(nelim)
3247 b=dble(nelim)*dble(nelim+2*acc+1)
3248 c=-(max_load-temp(j))
3249 delta=(b*b-(dble(4)*a*c))
3250 x=int((-b+sqrt(delta))/(dble(2)*a))
3251 IF(x.LT.0) THEN
3252 WRITE(*,*)myid,
3253 & ': Internal error 6 in DMUMPS_SET_PARTI_FLOP_IRR'
3255 ENDIF
3256 IF(x.GE.kmax)THEN
3257 IF(kmax.GE.kmin)THEN
3258 x=kmax
3259 nb_sat=nb_sat+1
3260 ELSE
3261 x=0
3262 ENDIF
3263 ELSE
3264 IF(x.LT.
min(kmin,kmax))
THEN
3265 x=0
3266 ENDIF
3267 ENDIF
3268 IF((acc+x).GT.ncb) x=ncb-acc
3269 nb_rows(j)=x
3270 IF(smp)THEN
3271 IF(min_load.GT.temp(j))THEN
3272 min_load=temp(j)
3273 pos_min_load=i
3274 ENDIF
3275 ENDIF
3276 acc=acc+x
3277 max_load=
max(max_load,
3278 & temp(j)+
3279 & (dble(nelim)*dble(nb_rows(j)))*
3280 & dble(2*(nelim+
3281 & acc)-nb_rows(j)
3282 & -nelim+1))
3283 IF(ncb.EQ.acc) GOTO 741
3284 IF(ncb-acc.LT.kmin) GOTO 210
3285 ENDDO
3286 210 CONTINUE
3287 ENDIF
3288 741 CONTINUE
3289 i=i+1
3290 additionnal_rows=ncb-acc
3291 ENDDO
3292 chosen=i-1
3293 IF(additionnal_rows.NE.0)THEN
3294 additionnal_rows=ncb-acc
3295 somme=dble(nelim)*dble(additionnal_rows)*
3296 & dble(2*nfront-additionnal_rows-
3297 & nelim+1)
3298 somme=somme/dble(number_of_procs)
3299 nb_rows=0
3300 acc=0
3301 chosen=0
3302 IF(smp)THEN
3303 min_load=temp(1)
3304 pos_min_load=1
3305 ENDIF
3306 DO i=1,others
3307 a=dble(1)
3308 b=dble(acc+2)
3309 c=-buf_size+dble(acc+nelim)
3310 delta=(b*b)-(dble(4)*a*c)
3311 x=int((-b+sqrt(delta))/(dble(2)*a))
3312 IF(x.GT.ncb-acc) x=ncb-acc
3313 bande_k821=dble(x)*dble(nelim+acc+x)
3314 IF(have_type1_son)THEN
3315 a=dble(1)
3316 b=dble(acc+2+nelim)
3317 c=-buf_size+dble(acc+nelim)
3318 delta=(b*b)-(dble(4)*a*c)
3319 x=int((-b+sqrt(delta))/(dble(2)*a))
3320 IF(x.GT.ncb-acc) x=ncb-acc
3321 bande_k821=dble(x)*dble(nelim+acc+x)
3322 ENDIF
3323 max_mem_allow=bande_k821
3324 IF(bdc_md)THEN
3326 &
min(mem_size_weak(i),mem_size_strong(i)),
3327 & bande_k821)
3328 max_mem_allow=
max(dble(0),
3329 & max_mem_allow)
3330 ENDIF
3331 a=dble(1)
3332 b=dble(acc+nelim)
3333 c=dble(-max_mem_allow)
3334 delta=((b*b)-(dble(4)*a*c))
3335 kmax=int((-b+sqrt(delta))/(dble(2)*a))
3336 a=dble(nelim)
3337 b=dble(nelim)*dble(nelim+2*acc+1)
3338 c=-(max_load-temp(i)+somme)
3339 delta=(b*b-(dble(4)*a*c))
3340 x=int((-b+sqrt(delta))/(dble(2)*a))
3341 IF(x.LT.0) THEN
3342 WRITE(*,*)myid,
3343 & ': Internal error 7 in DMUMPS_SET_PARTI_FLOP_IRR'
3345 ENDIF
3346 IF(x.GE.kmax)THEN
3347 IF(kmax.GE.kmin)THEN
3348 x=kmax
3349 ELSE
3350 x=0
3351 ENDIF
3352 ELSE
3353 IF(x.LT.
min(kmin,kmax))
THEN
3355 ENDIF
3356 ENDIF
3357 IF((acc+x).GT.ncb) x=ncb-acc
3358 nb_rows(i)=x
3359 IF(smp)THEN
3360 IF(min_load.GT.temp(i))THEN
3361 min_load=temp(i)
3362 pos_min_load=i
3363 ENDIF
3364 ENDIF
3365 chosen=chosen+1
3366 acc=acc+x
3367 IF(ncb.EQ.acc) GOTO 666
3368 IF(ncb-acc.LT.kmin) GOTO 488
3369 ENDDO
3370 488 CONTINUE
3371 additionnal_rows=ncb-acc
3372 somme=dble(nelim)*
3373 & dble(additionnal_rows)*
3374 & dble(2*nfront-additionnal_rows-
3375 & nelim+1)
3376 somme=somme/dble(number_of_procs)
3377 nb_rows=0
3378 acc=0
3379 chosen=0
3380 IF(smp)THEN
3381 min_load=temp(1)
3382 pos_min_load=1
3383 ENDIF
3384 DO i=1,others
3385 a=dble(1)
3386 b=dble(acc+2)
3387 c=-buf_size+dble(acc+nelim)
3388 delta=(b*b)-(dble(4)*a*c)
3389 x=int((-b+sqrt(delta))/(dble(2)*a))
3390 IF(x.GT.ncb-acc) x=ncb-acc
3391 bande_k821=dble(x)*dble(nelim+acc+x)
3392 IF(have_type1_son)THEN
3393 a=dble(1)
3394 b=dble(acc+2+nelim)
3395 c=-buf_size+dble(acc+nelim)
3396 delta=(b*b)-(dble(4)*a*c)
3397 x=int((-b+sqrt(delta))/(dble(2)*a))
3398 IF(x.GT.ncb-acc) x=ncb-acc
3399 bande_k821=dble(x)*dble(nelim+acc+x)
3400 ENDIF
3401 max_mem_allow=bande_k821
3402 IF(bdc_md)THEN
3403 max_mem_allow=
min(bande_k821,
3404 & mem_size_strong(i))
3405 max_mem_allow=
max(dble(0),
3406 & max_mem_allow)
3407 ENDIF
3408 a=dble(1)
3409 b=dble(acc+nelim)
3410 c=dble(-max_mem_allow)
3411 delta=((b*b)-(dble(4)*a*c))
3412 kmax=int((-b+sqrt(delta))/(dble(2)*a))
3413 a=dble(nelim)
3414 b=dble(nelim)*dble(nelim+2*acc+1)
3415 c=-(max_load-temp(i)+somme)
3416 delta=(b*b-(dble(4)*a*c))
3417 x=int((-b+sqrt(delta))/(dble(2)*a))
3418 IF(x.LT.0) THEN
3419 WRITE(*,*)myid,
3420 & ': Internal error 8 in DMUMPS_SET_PARTI_FLOP_IRR'
3422 ENDIF
3423 IF(x.GE.kmax)THEN
3424 x=kmax
3425 ELSE
3426 IF(x.LT.kmin)THEN
3427 x=kmin
3428 ENDIF
3429 ENDIF
3430 IF((acc+x).GT.ncb) x=ncb-acc
3431 nb_rows(i)=x
3432 IF(smp)THEN
3433 IF(min_load.GT.temp(i))THEN
3434 min_load=temp(i)
3435 pos_min_load=i
3436 ENDIF
3437 ENDIF
3438 chosen=chosen+1
3439 acc=acc+x
3440 IF(ncb.EQ.acc) GOTO 666
3441 IF(ncb-acc.LT.kmin) GOTO 477
3442 ENDDO
3443 477 CONTINUE
3444 IF(acc.NE.ncb)THEN
3445 nb_sat=0
3446 acc=0
3447 chosen=0
3448 IF(smp)THEN
3449 min_load=temp(1)
3450 pos_min_load=1
3451 ENDIF
3452 DO i=1,others
3453 a=dble(1)
3454 b=dble(acc+2)
3455 c=-buf_size+dble(acc+nelim)
3456 delta=(b*b)-(dble(4)*a*c)
3457 x=int((-b+sqrt(delta))/(dble(2)*a))
3458 IF(x.GT.ncb-acc) x=ncb-acc
3459 bande_k821=dble(x)*dble(nelim+acc+x)
3460 IF(have_type1_son)THEN
3461 a=dble(1)
3462 b=dble(acc+2+nelim)
3463 c=-buf_size+dble(acc+nelim)
3464 delta=(b*b)-(dble(4)*a*c)
3465 x=int((-b+sqrt(delta))/(dble(2)*a))
3466 IF(x.GT.ncb-acc) x=ncb-acc
3467 bande_k821=dble(x)*dble(nelim+acc+x)
3468 ENDIF
3469 max_mem_allow=bande_k821
3470 IF(bdc_md)THEN
3471 max_mem_allow=
min(bande_k821,
3472 & mem_size_strong(i))
3473 max_mem_allow=
max(dble(0),
3474 & max_mem_allow)
3475 ENDIF
3476 a=dble(1)
3477 b=dble(acc+nelim)
3478 c=dble(-max_mem_allow)
3479 delta=((b*b)-(dble(4)*a*c))
3480 kmax=int((-b+sqrt(delta))/(dble(2)*a))
3481 x=kmax-nb_rows(i)
3482 IF((acc+nb_rows(i)+x).GT.ncb)
3483 & x=ncb-(acc+nb_rows(i))
3484 nb_rows(i)=nb_rows(i)+x
3485 IF((dble(nb_rows(i))*
3486 & dble(nb_rows(i)+acc)).EQ.
3487 & bande_k821)THEN
3488 nb_sat=nb_sat+1
3489 ENDIF
3490 acc=acc+nb_rows(i)
3491 IF(smp)THEN
3492 IF(min_load.GT.temp(i))THEN
3493 min_load=temp(i)
3494 pos_min_load=i
3495 ENDIF
3496 ENDIF
3497 chosen=chosen+1
3498 IF(ncb.EQ.acc) GOTO 666
3499 IF(ncb-acc.LT.kmin) GOTO 834
3500 ENDDO
3501 834 CONTINUE
3502 ENDIF
3503 IF(acc.NE.ncb)THEN
3504 additionnal_rows=ncb-acc
3505 somme=dble(nelim)*
3506 & dble(additionnal_rows)*
3507 & dble(2*nfront-additionnal_rows-
3508 & nelim+1)
3509 somme=somme/dble(number_of_procs-nb_sat)
3510 acc=0
3511 DO i=1,chosen
3512 a=dble(1)
3513 b=dble(acc+2)
3514 c=-buf_size+dble(acc+nelim)
3515 delta=(b*b)-(dble(4)*a*c)
3516 x=int((-b+sqrt(delta))/(dble(2)*a))
3517 IF(x.GT.ncb-acc) x=ncb-acc
3518 bande_k821=dble(x)*dble(nelim+acc+x)
3519 IF(have_type1_son)THEN
3520 a=dble(1)
3521 b=dble(acc+2+nelim)
3522 c=-buf_size+dble(acc+nelim)
3523 delta=(b*b)-(dble(4)*a*c)
3524 x=int((-b+sqrt(delta))/(dble(2)*a))
3525 IF(x.GT.ncb-acc) x=ncb-acc
3526 bande_k821=dble(x)*dble(nelim+acc+x)
3527 ENDIF
3528 IF((dble(nb_rows(i))*
3529 & dble(nb_rows(i)+acc)).EQ.
3530 & bande_k821)THEN
3531 GOTO 102
3532 ENDIF
3533 a=dble(nelim)
3534 b=dble(nelim)*
3535 & dble(nelim+2*(acc+nb_rows(i))+1)
3536 c=-(somme)
3537 delta=(b*b-(dble(4)*a*c))
3538 x=int((-b+sqrt(delta))/(dble(2)*a))
3539 a=dble(1)
3540 b=dble(acc+nelim)
3541 c=dble(-bande_k821)
3542 delta=((b*b)-(dble(4)*a*c))
3543 kmax=int((-b+sqrt(delta))/(dble(2)*a))
3544 IF(x.LT.0) THEN
3545 WRITE(*,*)myid,
3546 & ': Internal error 9 in DMUMPS_SET_PARTI_FLOP_IRR'
3548 ENDIF
3549 IF((acc+x+nb_rows(i)).GT.ncb)THEN
3550 IF((ncb-acc).GT.kmax)THEN
3551 nb_rows(i)=kmax
3552 ELSE
3553 nb_rows(i)=ncb-acc
3554 ENDIF
3555 ELSE
3556 IF((nb_rows(i)+x).GT.kmax)THEN
3557 nb_rows(i)=kmax
3558 ELSE
3559 nb_rows(i)=nb_rows(i)+x
3560 ENDIF
3561 ENDIF
3562 102 CONTINUE
3563 acc=acc+nb_rows(i)
3564 IF(ncb.EQ.acc) THEN
3565 chosen=i
3566 GOTO 666
3567 ENDIF
3568 IF(ncb-acc.LT.kmin) THEN
3569 chosen=i
3570 GOTO 007
3571 ENDIF
3572 ENDDO
3573 007 CONTINUE
3574 DO i=1,chosen
3575 nb_rows(i)=nb_rows(i)+1
3576 acc=acc+1
3577 IF(acc.EQ.ncb)GOTO 666
3578 ENDDO
3579 IF(acc.LT.ncb)THEN
3580 IF(smp)THEN
3581 nb_rows(1)=nb_rows(1)+ncb-acc
3582 ELSE
3583 nb_rows(pos_min_load)=
3584 & nb_rows(pos_min_load)+ncb-acc
3585 ENDIF
3586 ENDIF
3587 ENDIF
3588 GOTO 666
3589 ENDIF
3590 ENDIF
3591 GOTO 666
3592 ENDIF
3593 additionnal_rows=ncb-acc
3594 i=chosen+1
3595 IF(nb_sat.EQ.small_set) GOTO 777
3596 DO i=1,small_set
3597 idwload(i)=i
3598 affected=int(buf_size/dble(ncb+1))-1
3599 bande_k821=dble(affected)*dble(nfront)
3600 IF(have_type1_son)THEN
3601 affected=int((buf_size-dble(nfront))/
3602 & (dble(nfront+1)))
3603 bande_k821=dble(affected)*dble(nfront)
3604 ENDIF
3605 max_mem_allow=bande_k821
3606 IF(bdc_md)THEN
3608 &
min(mem_size_weak(i),mem_size_strong(i)),
3609 & bande_k821)
3610 max_mem_allow=
max(dble(0),max_mem_allow)
3611 ENDIF
3612 wload(i)=max_mem_allow
3613 ENDDO
3615 nb_zero=0
3616 IF((nb_sat.EQ.small_set).AND.
3617 & (small_set.LT.nslaves_ref))THEN
3618 small_set=ref+1
3619 ref=ref+1
3620 nb_rows=0
3621 GOTO 323
3622 ENDIF
3623 IF((nb_sat.EQ.small_set).AND.
3624 & (small_set.LE.number_of_procs))GOTO 777
3625 affected=int(additionnal_rows/(small_set-nb_sat))
3626 affected=
max(affected,1)
3627 DO i=1,small_set
3628 kmax=int(wload(i)/dble(nfront))
3629 IF(nb_rows(idwload(i)).EQ.kmax)THEN
3630 GOTO 912
3631 ENDIF
3632 IF((nb_rows(idwload(i))+
min(affected,
3633 & additionnal_rows)).GT.kmax)THEN
3634 IF(nb_rows(idwload(i)).GT.kmax)THEN
3635 ENDIF
3636 additionnal_rows=additionnal_rows-
3637 & (kmax-nb_rows(idwload(i)))
3638 nb_rows(idwload(i))=kmax
3639 nb_sat=nb_sat+1
3640 IF(nb_sat.EQ.small_set)THEN
3641 IF(small_set.NE.nslaves_ref)THEN
3642 small_set=ref+1
3643 ref=ref+1
3644 nb_rows=0
3645 GOTO 323
3646 ELSE
3647 max_load=
max(max_load,
3648 & (temp(idwload(i))+(dble(nelim) *
3649 & dble(nb_rows(idwload(i))))+
3650 & (dble(nb_rows(idwload(i)))*
3651 & dble(nelim))*
3652 & dble(2*nfront-nelim-1)))
3653 GOTO 777
3654 ENDIF
3655 ENDIF
3656 affected=int(additionnal_rows/(small_set-nb_sat))
3657 affected=
max(affected,1)
3658 ELSE
3659 IF((nb_rows(idwload(i))+
min(affected,
3660 & additionnal_rows)).GE.kmin)THEN
3661 x=
min(affected,additionnal_rows)
3662 nb_rows(idwload(i))=nb_rows(idwload(i))+
3663 & x
3664 additionnal_rows=additionnal_rows-x
3665 ELSE
3666 x=int((max_load-temp(idwload(i)))/
3667 & (dble(nelim)*dble(2*nfront-nelim)))
3668 IF(x+affected.GT.additionnal_rows)THEN
3669 x=additionnal_rows
3670 ELSE
3671 x=affected+x
3672 ENDIF
3673 IF(x.GE.kmin)THEN
3674 nb_rows(idwload(i))=nb_rows(idwload(i))+
3675 & x
3676 additionnal_rows=additionnal_rows-
3677 & x
3678 ELSE
3679 nb_zero=nb_zero+1
3680 ENDIF
3681 ENDIF
3682 ENDIF
3683 912 CONTINUE
3684 max_load=
max(max_load,
3685 & (temp(idwload(i))+(dble(nelim)*
3686 & dble(nb_rows(idwload(i))))+
3687 & (dble(nb_rows(idwload(i)))*dble(nelim))*
3688 & dble(2*nfront-nelim-1)))
3689 IF(small_set.LT.number_of_procs)THEN
3690 IF(max_load.GT.temp(small_set+1))THEN
3691 IF(small_set.LT.nslaves_ref)THEN
3692 small_set=ref+1
3693 ref=ref+1
3694 nb_rows=0
3695 GOTO 323
3696 ENDIF
3697 ENDIF
3698 ENDIF
3699 IF(small_set.EQ.nb_sat)GOTO 777
3700 IF(additionnal_rows.EQ.0)THEN
3701 chosen=small_set
3702 GOTO 049
3703 ENDIF
3704 ENDDO
3705 777 CONTINUE
3706 IF((nb_zero.NE.0).AND.(additionnal_rows.GE.kmin))THEN
3707 j=nb_zero
3708 732 CONTINUE
3709 x=int(additionnal_rows/(j))
3710 IF(x.LT.kmin)THEN
3711 j=j-1
3712 GOTO 732
3713 ENDIF
3714 IF(x*j.LT.additionnal_rows)THEN
3715 x=x+1
3716 ENDIF
3717 DO i=1,small_set
3718 affected=int(buf_size/dble(ncb+1))-1
3719 bande_k821=dble(affected)*dble(nfront)
3720 IF(have_type1_son)THEN
3721 affected=int((buf_size-dble(nfront))/
3722 & dble(nfront+1))
3723 bande_k821=dble(affected)*dble(nfront)
3724 ENDIF
3725 max_mem_allow=bande_k821
3726 IF(bdc_md)THEN
3728 &
min(mem_size_weak(i),mem_size_strong(i)),
3729 & dble(bande_k821))
3730 max_mem_allow=
max(dble(0),max_mem_allow)
3731 ENDIF
3732 kmax=int(max_mem_allow/dble(nfront))
3733 IF(nb_rows(i).EQ.0)THEN
3734 IF(x.GT.additionnal_rows)THEN
3735 x=additionnal_rows
3736 ENDIF
3737 IF(x.GT.kmax)THEN
3738 x=kmax
3739 ENDIF
3740 IF(x.GT.kmin)THEN
3741 nb_rows(i)=x
3742 additionnal_rows=additionnal_rows-x
3743 max_load=
max(max_load,
3744 & (temp(i)+(dble(nelim) *
3745 & dble(nb_rows(i)))+
3746 & (dble(nb_rows(i))*dble(nelim))*
3747 & dble(2*nfront-nelim-1)))
3748 ENDIF
3749 ENDIF
3750 ENDDO
3751 ENDIF
3752 i=chosen+1
3753 DO WHILE ((additionnal_rows.NE.0)
3754 & .AND.(i.LE.number_of_procs))
3755 IF((temp(i).LE.max_load))THEN
3756 affected=int(buf_size/dble(ncb+1))-1
3757 bande_k821=dble(affected)*dble(nfront)
3758 IF(have_type1_son)THEN
3759 affected=int((buf_size-dble(nfront))/
3760 & dble(nfront+1))
3761 bande_k821=dble(affected)*dble(nfront)
3762 ENDIF
3763 max_mem_allow=bande_k821
3764 IF(bdc_md)THEN
3766 &
min(mem_size_weak(i),mem_size_strong(i)),
3767 & bande_k821)
3768 max_mem_allow=
max(dble(0),max_mem_allow)
3769 ENDIF
3770 kmax=int(max_mem_allow/dble(nfront))
3771 affected=int((max_load-temp(i))/
3772 & (dble(nelim)*dble(2*nfront-nelim)))
3773 IF(affected.GT.additionnal_rows)THEN
3774 affected=additionnal_rows
3775 ENDIF
3776 IF(nb_rows(i).LT.kmax)THEN
3777 IF((affected+nb_rows(i)).GT.kmax)THEN
3778 affected=kmax-nb_rows(i)
3779 nb_sat=nb_sat+1
3780 ELSE
3781 IF((affected+nb_rows(i)).LT.
3782 & kmin)THEN
3783 affected=0
3784 ENDIF
3785 ENDIF
3786 nb_rows(i)=nb_rows(i)+affected
3787 additionnal_rows=additionnal_rows-affected
3788 ENDIF
3789 ELSE IF((temp(i).GT.max_load))THEN
3790 IF(nb_sat.EQ.i-1) GOTO 218
3791 x=(additionnal_rows/(i-1-nb_sat))
3792 acc=1
3793 DO j=1,i-1
3794 tmp_sum=((dble(nelim) * dble(nb_rows(j)+x))
3795 & +(dble(nb_rows(j)+x)*dble(nelim))*
3796 & dble(2*nfront-nelim-1))
3797 IF((temp(j)+tmp_sum).GT.max_load)THEN
3798 acc=0
3799 ENDIF
3800 ENDDO
3801 IF(acc.EQ.1)THEN
3802 max_load=temp(i)
3803 j=1
3804 DO WHILE ((additionnal_rows.NE.0)
3805 & .AND.(j.LT.i))
3806 affected=int(buf_size/dble(ncb+1))-1
3807 bande_k821=dble(affected)*dble(nfront)
3808 IF(have_type1_son)THEN
3809 affected=int((buf_size-dble(nfront))/
3810 & dble(nfront+1))
3811 bande_k821=dble(affected)*dble(nfront)
3812 ENDIF
3813 affected=x
3814 max_mem_allow=bande_k821
3815 IF(bdc_md)THEN
3817 &
min(mem_size_weak(j),mem_size_strong(j)),
3818 & bande_k821)
3819 max_mem_allow=
max(dble(0),
3820 & max_mem_allow)
3821 ENDIF
3822 kmax=int(max_mem_allow/dble(nfront))
3823 IF(affected.GT.additionnal_rows)THEN
3824 affected=additionnal_rows
3825 ENDIF
3826 IF(nb_rows(j).LT.kmax)THEN
3827 IF((affected+nb_rows(j)).GT.kmax)THEN
3828 affected=kmax-nb_rows(j)
3829 nb_sat=nb_sat+1
3830 ELSE
3831 IF((affected+nb_rows(j)).LT.
3832 & kmin)THEN
3833 affected=0
3834 ENDIF
3835 ENDIF
3836 nb_rows(j)=nb_rows(j)+affected
3837 additionnal_rows=additionnal_rows-
3838 & affected
3839 ENDIF
3840 j=j+1
3841 ENDDO
3842 ELSE
3843 max_load=temp(i)
3844 j=1
3845 DO WHILE ((additionnal_rows.NE.0)
3846 & .AND.(j.LT.i))
3847 affected=int(buf_size/dble(ncb+1))-1
3848 bande_k821=dble(affected)*dble(nfront)
3849 IF(have_type1_son)THEN
3850 affected=int((buf_size-dble(nfront))/
3851 & dble(nfront+1))
3852 bande_k821=dble(affected)*dble(nfront)
3853 ENDIF
3854 tmp_sum=((dble(nelim)* dble(nb_rows(j)))
3855 & +(dble(nb_rows(j))*dble(nelim))*
3856 & dble(2*nfront-nelim-1))
3857 x=int((max_load-(temp(j)+tmp_sum))/
3858 & (dble(nelim)*dble(2*nfront-nelim)))
3859 IF(x.LT.0)THEN
3860 WRITE(*,*)myid,
3861 & ': Internal error 10 in DMUMPS_SET_PARTI_FLOP_IRR'
3863 ENDIF
3864 affected=x
3865 max_mem_allow=bande_k821
3866 IF(bdc_md)THEN
3868 &
min(mem_size_weak(j),mem_size_strong(j)),
3869 & bande_k821)
3870 max_mem_allow=
max(dble(0),
3871 & max_mem_allow)
3872 ENDIF
3873 kmax=int(max_mem_allow/dble(nfront))
3874 IF(affected.GT.additionnal_rows)THEN
3875 affected=additionnal_rows
3876 ENDIF
3877 IF(nb_rows(j).LT.kmax)THEN
3878 IF((affected+nb_rows(j)).GT.kmax)THEN
3879 affected=kmax-nb_rows(j)
3880 nb_sat=nb_sat+1
3881 ELSE
3882 IF((affected+nb_rows(j)).LT.
3883 & kmin)THEN
3884 affected=0
3885 ENDIF
3886 ENDIF
3887 nb_rows(j)=nb_rows(j)+affected
3888 additionnal_rows=additionnal_rows-
3889 & affected
3890 ENDIF
3891 j=j+1
3892 ENDDO
3893 ENDIF
3894 ENDIF
3895 218 CONTINUE
3896 i=i+1
3897 ENDDO
3898 chosen=i-1
3899 IF((chosen.EQ.number_of_procs-1).AND.
3900 & (additionnal_rows.NE.0))THEN
3901 DO i=1,chosen
3902 IF(nb_rows(i)+1.GE.kmin)THEN
3903 nb_rows(i)=nb_rows(i)+1
3904 additionnal_rows=additionnal_rows-1
3905 ENDIF
3906 max_load=
max(max_load,
3907 & (temp(i)+(dble(nelim) *
3908 & dble(nb_rows(i)))+
3909 & (dble(nb_rows(i))*dble(nelim))*
3910 & dble(2*nfront-nelim-1)))
3911 IF(additionnal_rows.EQ.0) GOTO 048
3912 ENDDO
3913 048 CONTINUE
3914 ENDIF
3915 IF((additionnal_rows.NE.0))THEN
3916 IF(chosen.LT.number_of_procs)THEN
3917 i=chosen+1
3918 ELSE
3919 IF(chosen.NE.number_of_procs)THEN
3920 WRITE(*,*)myid,
3921 & ': Internal error 11 in DMUMPS_SET_PARTI_FLOP_IRR'
3923 ENDIF
3924 i=chosen
3925 ENDIF
3926 DO WHILE ((additionnal_rows.NE.0)
3927 & .AND.(i.LE.number_of_procs))
3928 IF(temp(i).LE.max_load)THEN
3929 affected=int(buf_size/dble(ncb+1))-1
3930 bande_k821=dble(affected)*dble(nfront)
3931 IF(have_type1_son)THEN
3932 affected=int((buf_size-dble(nfront))/
3933 & dble(nfront+1))
3934 bande_k821=dble(affected)*dble(nfront)
3935 ENDIF
3936 max_mem_allow=bande_k821
3937 IF(bdc_md)THEN
3939 &
min(mem_size_weak(i),mem_size_strong(i)),
3940 & bande_k821)
3941 max_mem_allow=
max(dble(0),max_mem_allow)
3942 ENDIF
3943 kmax=int(max_mem_allow/dble(nfront))
3944 tmp_sum=((dble(nelim) * dble(nb_rows(i)))
3945 & +(dble(nb_rows(i))*dble(nelim))*
3946 & dble(2*nfront-nelim-1))
3947 x=int((max_load-(temp(i)+tmp_sum))/
3948 & (dble(nelim)*dble(2*nfront-nelim)))
3949 affected=x
3950 IF(x.LT.0)THEN
3951 WRITE(*,*)myid,
3952 & ': Internal error 12 in DMUMPS_SET_PARTI_FLOP_IRR'
3954 ENDIF
3955 IF(affected.GT.additionnal_rows)THEN
3956 affected=additionnal_rows
3957 ENDIF
3958 IF(nb_rows(i).LT.kmax)THEN
3959 IF((affected+nb_rows(i)).GT.kmax)THEN
3960 affected=kmax-nb_rows(i)
3961 ELSE
3962 IF((affected+nb_rows(i)).LT.
3963 & kmin)THEN
3964 affected=0
3965 ENDIF
3966 ENDIF
3967 nb_rows(i)=nb_rows(i)+affected
3968 additionnal_rows=additionnal_rows-affected
3969 ENDIF
3970 IF(i.NE.number_of_procs) GOTO 624
3971 ELSE IF((temp(i).GT.max_load))THEN
3972 x=int(additionnal_rows/i-1)
3974 IF((max_load+((dble(nelim)*
3975 & dble(x))+(dble(
3976 & x)*dble(nelim))*dble(
3977 & (2*nfront-nelim-1)))).LE.temp(i))THEN
3978 affected=x
3979 pos=1
3980 ELSE
3981 pos=0
3982 ENDIF
3983 max_load=temp(i)
3984 j=1
3985 DO WHILE ((additionnal_rows.NE.0)
3986 & .AND.(j.LT.i))
3987 x=int(buf_size/dble(ncb+1))-1
3988 bande_k821=dble(x)*dble(nfront)
3989 max_mem_allow=bande_k821
3990 IF(have_type1_son)THEN
3991 x=int((buf_size-dble(nfront))/
3992 & dble(nfront+1))
3993 bande_k821=dble(x)*dble(nfront)
3994 ENDIF
3995 IF(bdc_md)THEN
3997 &
min(mem_size_weak(j),mem_size_strong(j)),
3998 & bande_k821)
3999 max_mem_allow=
max(dble(0),
4000 & max_mem_allow)
4001 ENDIF
4002 kmax=int(max_mem_allow/dble(nfront))
4003 IF(pos.EQ.0)THEN
4004 tmp_sum=((dble(nelim) *
4005 & dble(nb_rows(j)))
4006 & +(dble(nb_rows(j))*dble(nelim))*
4007 & dble(2*nfront-nelim-1))
4008 x=int((temp(i)-(temp(j)+tmp_sum))/
4009 & (dble(nelim)*dble(2*nfront-
4010 & nelim)))
4011 ELSE
4012 x=int(tmp_sum)
4013 ENDIF
4014 IF(x.GT.additionnal_rows)THEN
4015 x=additionnal_rows
4016 ENDIF
4017 IF(nb_rows(j).LT.kmax)THEN
4018 IF((x+nb_rows(j)).GT.kmax)THEN
4019 x=kmax-nb_rows(j)
4020 ELSE
4021 IF((nb_rows(j)+x).LT.
4022 & kmin)THEN
4023 x=0
4024 ENDIF
4025 ENDIF
4026 nb_rows(j)=nb_rows(j)+x
4027 additionnal_rows=additionnal_rows-x
4028 ENDIF
4029 j=j+1
4030 ENDDO
4031 ENDIF
4032 624 CONTINUE
4033 i=i+1
4034 ENDDO
4035 chosen=i-1
4036 IF(additionnal_rows.NE.0)THEN
4037 acc=0
4038 DO i=1,chosen
4039 x=int(buf_size/dble(ncb+1))-1
4040 bande_k821=dble(x)*dble(nfront)
4041 IF(have_type1_son)THEN
4042 x=int((buf_size-dble(nfront))/
4043 & dble(nfront+1))
4044 bande_k821=dble(x)*dble(nfront)
4045 ENDIF
4046 max_mem_allow=bande_k821
4047 IF(bdc_md)THEN
4049 &
min(mem_size_weak(i),mem_size_strong(i)),
4050 & bande_k821)
4051 max_mem_allow=
max(dble(0),max_mem_allow)
4052 ENDIF
4053 kmax=int(max_mem_allow/dble(nfront))
4054 tmp_sum=((dble(nelim) * dble(nb_rows(i)))
4055 & +(dble(nb_rows(i))*dble(nelim))*
4056 & dble(2*nfront-nelim-1))
4057 x=int((max_load-
4058 & (temp(i)+tmp_sum))/
4059 & (dble(nelim)*dble(2*nfront-nelim)))
4060 IF(x.LT.0)THEN
4061 WRITE(*,*)myid,
4062 & ': Internal error 13 in DMUMPS_SET_PARTI_FLOP_IRR'
4064 ENDIF
4065 IF(x.GT.additionnal_rows)THEN
4066 x=additionnal_rows
4067 ENDIF
4068 IF(nb_rows(i).LT.kmax)THEN
4069 IF((x+nb_rows(i)).GE.kmax)THEN
4070 additionnal_rows=additionnal_rows-
4071 & (kmax-nb_rows(i))
4072 nb_rows(i)=kmax
4073 ELSE
4074 IF((x+nb_rows(i)).GE.
4075 & kmin)THEN
4076 nb_rows(i)=nb_rows(i)+x
4077 additionnal_rows=additionnal_rows-x
4078 acc=acc+1
4079 ELSE
4080 acc=acc+1
4081 ENDIF
4082 ENDIF
4083 ENDIF
4084 IF(additionnal_rows.EQ.0)GOTO 049
4085 ENDDO
4086 IF(chosen.LT.number_of_procs)THEN
4087 chosen=chosen+1
4088 ENDIF
4089 IF(acc.EQ.0)THEN
4090 acc=1
4091 ENDIF
4092 x=int(additionnal_rows/acc)
4094 acc=0
4095 DO i=1,chosen
4096 j=int(buf_size/dble(ncb+1))-1
4097 bande_k821=dble(j)*dble(nfront)
4098 IF(have_type1_son)THEN
4099 j=int((buf_size-dble(nfront))/
4100 & dble(nfront+1))
4101 bande_k821=dble(j)*dble(nfront)
4102 ENDIF
4103 max_mem_allow=bande_k821
4104 IF(bdc_md)THEN
4106 &
min(mem_size_weak(i),mem_size_strong(i)),
4107 & bande_k821)
4108 max_mem_allow=
max(dble(0),max_mem_allow)
4109 ENDIF
4110 kmax=int(max_mem_allow/dble(nfront))
4111 tmp_sum=((dble(nelim) * dble(nb_rows(i)))
4112 & +(dble(nb_rows(i))*dble(nelim))*
4113 & dble(2*nfront-nelim-1))
4114 j=int((max_load-
4115 & (temp(i)+tmp_sum))/
4116 & (dble(nelim)*dble(2*nfront-nelim)))
4117 IF(nb_rows(i).LT.kmax)THEN
4118 IF((
min(x,j)+nb_rows(i)).GE.kmax)
THEN
4119 IF((kmax-nb_rows(i)).GT.
4120 & additionnal_rows)THEN
4121 nb_rows(i)=nb_rows(i)+
4122 & additionnal_rows
4123 additionnal_rows=0
4124 ELSE
4125 additionnal_rows=additionnal_rows-
4126 & (kmax-nb_rows(i))
4127 nb_rows(i)=kmax
4128 ENDIF
4129 ELSE
4130 IF((
min(x,j)+nb_rows(i)).GE.
4131 & kmin)THEN
4132 nb_rows(i)=nb_rows(i)+
min(x,j)
4133 additionnal_rows=additionnal_rows-
4135 acc=acc+1
4136 ENDIF
4137 ENDIF
4138 ENDIF
4139 IF(additionnal_rows.EQ.0)GOTO 049
4140 ENDDO
4141 IF(acc.GT.0)THEN
4142 DO i=1,chosen
4143 x=int(buf_size/dble(ncb+1))-1
4144 bande_k821=dble(x)*dble(nfront)
4145 IF(have_type1_son)THEN
4146 x=int((buf_size-dble(nfront))/
4147 & dble(nfront+1))
4148 bande_k821=dble(x)*dble(nfront)
4149 ENDIF
4150 max_mem_allow=bande_k821
4151 IF(bdc_md)THEN
4153 &
min(mem_size_weak(i),mem_size_strong(i)),
4154 & bande_k821)
4155 max_mem_allow=
max(dble(0),
4156 & max_mem_allow)
4157 ENDIF
4158 kmax=int(max_mem_allow/dble(nfront))
4159 IF(kmax-nb_rows(i).LT.
4160 & additionnal_rows)THEN
4161 additionnal_rows=additionnal_rows-
4162 & (kmax-nb_rows(i))
4163 nb_rows(i)=kmax
4164 ELSE
4165 IF(nb_rows(i).EQ.0)THEN
4166 IF(
min(kmin,kmax).LT.
4167 & additionnal_rows)THEN
4168 nb_rows(i)=
min(kmin,kmax)
4169 additionnal_rows=
4170 & additionnal_rows-
4172 ENDIF
4173 ELSE
4174 nb_rows(i)=nb_rows(i)+
4175 & additionnal_rows
4176 additionnal_rows=0
4177 ENDIF
4178 ENDIF
4179 IF(additionnal_rows.EQ.0)GOTO 049
4180 ENDDO
4181 ENDIF
4182 DO i=1,chosen
4183 idwload(i)=i
4184 affected=int(buf_size/dble(ncb+1))-1
4185 bande_k821=dble(affected)*dble(nfront)
4186 IF(have_type1_son)THEN
4187 affected=int((buf_size-dble(nfront))/
4188 & dble(nfront+1))
4189 bande_k821=dble(affected)*dble(nfront)
4190 ENDIF
4191 wload(i)=(bande_k821-dble(nb_rows(i)*nfront))
4192 ENDDO
4194 & idwload)
4195 nb_sat=0
4196 DO i=1,chosen
4197 x=int(additionnal_rows/(chosen-nb_sat))
4199 affected=int(buf_size/dble(ncb+1))-1
4200 bande_k821=dble(affected)*dble(nfront)
4201 IF(have_type1_son)THEN
4202 affected=int((buf_size-dble(nfront))/
4203 & dble(nfront+1))
4204 bande_k821=dble(affected)*dble(nfront)
4205 ENDIF
4206 IF(bdc_md)THEN
4207 max_mem_allow=
min(bande_k821,
4208 & mem_size_strong(i))
4209 max_mem_allow=
max(dble(0),max_mem_allow)
4210 ENDIF
4211 kmax=int(max_mem_allow/dble(nfront))
4212 IF(nb_rows(idwload(i)).LT.kmax)THEN
4213 IF((nb_rows(idwload(i))+x).LT.kmax)THEN
4214 nb_rows(idwload(i))=
4215 & nb_rows(idwload(i))+x
4216 additionnal_rows=additionnal_rows-x
4217 ELSE
4218 additionnal_rows=additionnal_rows-
4219 & (kmax-nb_rows(idwload(i)))
4220 nb_rows(idwload(i))=kmax
4221 ENDIF
4222 ENDIF
4223 IF(nb_rows(idwload(i)).EQ.kmax)THEN
4224 nb_sat=nb_sat+1
4225 ENDIF
4226 IF(additionnal_rows.EQ.0) GOTO 049
4227 ENDDO
4228 DO i=1,chosen
4229 x=int(buf_size/dble(ncb+1))-1
4230 bande_k821=dble(x)*dble(nfront)
4231 IF(have_type1_son)THEN
4232 x=int((buf_size-dble(nfront))/
4233 & dble(nfront+1))
4234 bande_k821=dble(x)*dble(nfront)
4235 ENDIF
4236 max_mem_allow=bande_k821
4237 IF(bdc_md)THEN
4238 max_mem_allow=
min(bande_k821,
4239 & mem_size_strong(i))
4240 max_mem_allow=
max(dble(0),max_mem_allow)
4241 ENDIF
4242 kmax=int(max_mem_allow/dble(nfront))
4243 IF(kmax-nb_rows(i).LT.additionnal_rows)THEN
4244 additionnal_rows=additionnal_rows-
4245 & (kmax-nb_rows(i))
4246 nb_rows(i)=kmax
4247 ELSE
4248 nb_rows(i)=nb_rows(i)+additionnal_rows
4249 additionnal_rows=0
4250 ENDIF
4251 IF(additionnal_rows.EQ.0)GOTO 049
4252 ENDDO
4253 x=int(additionnal_rows/chosen)
4255 DO i=1,chosen
4256 additionnal_rows=additionnal_rows-x
4257 nb_rows(i)=nb_rows(i)+x
4258 IF(additionnal_rows.EQ.0)GOTO 049
4259 ENDDO
4260 nb_rows(1)=nb_rows(1)+additionnal_rows
4261 ENDIF
4262 ENDIF
4263 049 CONTINUE
4264 ENDIF
4265 666 CONTINUE
4266 somme=dble(0)
4267 x=0
4268 pos=0
4269 DO i=1,chosen
4270 x=x+nb_rows(i)
4271 somme=somme+ dble(nb_rows(i))
4272 ENDDO
4273 GOTO 890
4274 ELSE IF((keep(83).GE.number_of_procs).AND.force_cand)THEN
4275 max_load=dble(0)
4276 DO i=1,others
4277 max_load=
max(max_load,temp(i))
4278 ENDDO
4279 acc=0
4280 chosen=0
4281 x=1
4282 DO i=1,others
4283 ENDDO
4284 DO i=2,others
4285 IF(temp(i).EQ.temp(1))THEN
4286 x=x+1
4287 ELSE
4288 GOTO 329
4289 ENDIF
4290 ENDDO
4291 329 CONTINUE
4292 tmp_sum=total_cost/dble(x)
4293 temp_max_load=dble(0)
4294 DO i=1,others
4295 IF(k50.EQ.0)THEN
4296 x=int(buf_size/dble(ncb+1))-1
4297 bande_k821=dble(x)*dble(nfront)
4298 ELSE
4299 a=dble(1)
4300 b=dble(acc+2)
4301 c=-buf_size+dble(acc+nelim)
4302 delta=(b*b)-(dble(4)*a*c)
4303 x=int((-b+sqrt(delta))/(dble(2)*a))
4304 IF(x.GT.ncb-acc) x=ncb-acc
4305 bande_k821=dble(x)*dble(nelim+acc+x)
4306 ENDIF
4307 IF(have_type1_son)THEN
4308 IF(k50.EQ.0)THEN
4309 x=int((buf_size-dble(nfront))/dble(nfront+1))
4310 bande_k821=dble(x)*dble(nfront)
4311 ELSE
4312 a=dble(1)
4313 b=dble(acc+2+nelim)
4314 c=-buf_size+dble(acc+nelim)
4315 delta=(b*b)-(dble(4)*a*c)
4316 x=int((-b+sqrt(delta))/(dble(2)*a))
4317 IF(x.GT.ncb-acc) x=ncb-acc
4318 bande_k821=dble(x)*dble(nelim+acc+x)
4319 ENDIF
4320 ENDIF
4321 max_mem_allow=bande_k821
4322 IF(bdc_md)THEN
4323 max_mem_allow=
min(bande_k821,
4324 &
min(mem_size_weak(i),mem_size_strong(i)))
4325 max_mem_allow=
max(dble(0),max_mem_allow)
4326 ENDIF
4327 IF(k50.EQ.0)THEN
4328 kmax=int(max_mem_allow/dble(nfront))
4329 IF(tmp_sum+temp(i).GT.max_load)THEN
4330 somme=max_load-temp(i)
4331 ELSE
4332 somme=tmp_sum
4333 ENDIF
4334 x=int(somme/
4335 & (dble(nelim)*dble(2*nfront-nelim)))
4336 IF(x.GT.kmax)THEN
4337 x=kmax
4338 ELSE
4339 IF(x.LT.kmin)THEN
4341 ENDIF
4342 ENDIF
4343 IF((acc+x).GT.ncb) x=ncb-acc
4344 ENDIF
4345 IF(k50.NE.0)THEN
4346 a=dble(1)
4347 b=dble(acc+nelim)
4348 c=dble(-max_mem_allow)
4349 delta=((b*b)-(dble(4)*a*c))
4350 kmax=int((-b+sqrt(delta))/(dble(2)*a))
4351 a=dble(nelim)
4352 b=dble(nelim)*dble(nelim+2*acc+1)
4353 IF(tmp_sum+temp(i).GT.max_load)THEN
4354 c=-(max_load-temp(i))
4355 ELSE
4356 c=-tmp_sum
4357 ENDIF
4358 delta=(b*b-(dble(4)*a*c))
4359 x=int((-b+sqrt(delta))/(dble(2)*a))
4360 IF(x.LT.0) THEN
4361 WRITE(*,*)myid,
4362 & ': Internal error 14 in DMUMPS_SET_PARTI_FLOP_IRR'
4364 ENDIF
4365 IF(x.GE.kmax)THEN
4366 IF(kmax.GT.kmin)THEN
4367 x=kmax
4368 ELSE
4369 x=0
4370 ENDIF
4371 ELSE
4372 IF(x.LE.
min(kmin,kmax))
THEN
4373 IF(kmax.LT.kmin)THEN
4374 x=0
4375 ELSE
4377 ENDIF
4378 ENDIF
4379 ENDIF
4380 IF((acc+x).GT.ncb) x=ncb-acc
4381 ENDIF
4382 temp_max_load=
max(temp_max_load,temp(i))
4383 nb_rows(i)=x
4384 chosen=chosen+1
4385 acc=acc+x
4386 IF(acc.EQ.ncb) GOTO 541
4387 ENDDO
4388 541 CONTINUE
4389 IF(acc.LT.ncb)THEN
4390 IF(k50.EQ.0)THEN
4391 additionnal_rows=ncb-acc
4392 DO j=1,chosen
4393 affected=int(buf_size/dble(ncb+1))-1
4394 bande_k821=dble(affected)*dble(nfront)
4395 IF(have_type1_son)THEN
4396 affected=int((buf_size-dble(nfront))/
4397 & dble(nfront+1))
4398 bande_k821=dble(affected)*dble(nfront)
4399 ENDIF
4400 max_mem_allow=bande_k821
4401 IF(bdc_md)THEN
4403 &
min(mem_size_weak(j),mem_size_strong(j)),
4404 & dble(bande_k821))
4405 max_mem_allow=
max(dble(0),max_mem_allow)
4406 ENDIF
4407 kmax=int(max_mem_allow/dble(nfront))
4408 IF((nb_rows(j)).LT.kmax)THEN
4409 IF(additionnal_rows.GT.(kmax-nb_rows(j)))THEN
4410 additionnal_rows=additionnal_rows-
4411 & (kmax-nb_rows(j))
4412 nb_rows(j)=kmax
4413 ELSE
4414 nb_rows(j)=nb_rows(j)+additionnal_rows
4415 additionnal_rows=0
4416 ENDIF
4417 ENDIF
4418 IF(additionnal_rows.EQ.0)GOTO 889
4419 ENDDO
4420 x=int(additionnal_rows/chosen)
4422 DO j=1,chosen
4423 affected=int(buf_size/dble(ncb+1))-1
4424 bande_k821=dble(affected)*dble(nfront)
4425 IF(have_type1_son)THEN
4426 affected=int((buf_size-dble(nfront))/
4427 & dble(nfront+1))
4428 bande_k821=dble(affected)*dble(nfront)
4429 ENDIF
4430 max_mem_allow=bande_k821
4431 IF(bdc_md)THEN
4432 max_mem_allow=
min(bande_k821,
4433 & mem_size_strong(j))
4434 max_mem_allow=
max(dble(0),max_mem_allow)
4435 ENDIF
4436 kmax=int(max_mem_allow/dble(nfront))
4437 IF((nb_rows(j)+x).GT.kmax)THEN
4438 additionnal_rows=additionnal_rows-
4439 & (kmax-nb_rows(j))
4440 nb_rows(j)=kmax
4441 ELSE
4442 additionnal_rows=additionnal_rows-x
4443 nb_rows(j)=nb_rows(j)+x
4444 ENDIF
4445 IF(additionnal_rows.EQ.0)GOTO 889
4446 ENDDO
4447 DO i=1,chosen
4448 x=int(buf_size/dble(ncb+1))-1
4449 bande_k821=dble(x)*dble(nfront)
4450 IF(have_type1_son)THEN
4451 x=int((buf_size-dble(nfront))/
4452 & dble(nfront+1))
4453 bande_k821=dble(x)*dble(nfront)
4454 ENDIF
4455 max_mem_allow=bande_k821
4456 IF(bdc_md)THEN
4457 max_mem_allow=
min(bande_k821,
4458 & mem_size_strong(i))
4459 max_mem_allow=
max(dble(0),max_mem_allow)
4460 ENDIF
4461 kmax=int(max_mem_allow/dble(nfront))
4462 IF(kmax-nb_rows(i).LT.additionnal_rows)THEN
4463 additionnal_rows=additionnal_rows-
4464 & (kmax-nb_rows(i))
4465 nb_rows(i)=kmax
4466 ELSE
4467 nb_rows(i)=nb_rows(i)+additionnal_rows
4468 additionnal_rows=0
4469 ENDIF
4470 IF(additionnal_rows.EQ.0)GOTO 889
4471 ENDDO
4472 DO i=1,number_of_procs
4473 idwload(i)=i
4474 affected=int(buf_size/dble(ncb+1))-1
4475 bande_k821=dble(affected)*dble(nfront)
4476 IF(have_type1_son)THEN
4477 affected=int((buf_size-dble(nfront))/
4478 & dble(nfront+1))
4479 bande_k821=dble(affected)*dble(nfront)
4480 ENDIF
4481 wload(i)=(bande_k821-(dble(nb_rows(i))*
4482 & dble(nfront)))
4483 ENDDO
4485 & idwload)
4486 nb_sat=0
4487 DO i=1,chosen
4488 x=int(additionnal_rows/(chosen-nb_sat))
4490 affected=int(buf_size/dble(ncb+1))-1
4491 bande_k821=dble(affected)*dble(nfront)
4492 IF(have_type1_son)THEN
4493 affected=int((buf_size-dble(nfront))/
4494 & dble(nfront+1))
4495 bande_k821=dble(affected)*dble(nfront)
4496 ENDIF
4497 max_mem_allow=bande_k821
4498 kmax=int(max_mem_allow/dble(nfront))
4499 IF(nb_rows(idwload(i)).LT.kmax)THEN
4500 IF((nb_rows(idwload(i))+x).LT.kmax)THEN
4501 nb_rows(idwload(i))=
4502 & nb_rows(idwload(i))+x
4503 additionnal_rows=additionnal_rows-x
4504 ELSE
4505 additionnal_rows=additionnal_rows-
4506 & (kmax-nb_rows(idwload(i)))
4507 nb_rows(idwload(i))=kmax
4508 ENDIF
4509 ENDIF
4510 IF(nb_rows(idwload(i)).EQ.kmax)THEN
4511 nb_sat=nb_sat+1
4512 ENDIF
4513 IF(additionnal_rows.EQ.0) GOTO 889
4514 ENDDO
4515 GOTO 994
4516 ELSE
4517 acc=0
4518 chosen=0
4519 DO i=1,others
4520 a=dble(1)
4521 b=dble(acc+2)
4522 c=-buf_size+dble(acc+nelim)
4523 delta=(b*b)-(dble(4)*a*c)
4524 x=int((-b+sqrt(delta))/(dble(2)*a))
4525 IF(x.GT.ncb-acc) x=ncb-acc
4526 bande_k821=dble(x)*dble(nelim+acc+x)
4527 IF(have_type1_son)THEN
4528 a=dble(1)
4529 b=dble(acc+2+nelim)
4530 c=-buf_size+dble(acc+nelim)
4531 delta=(b*b)-(dble(4)*a*c)
4532 x=int((-b+sqrt(delta))/(dble(2)*a))
4533 IF(x.GT.ncb-acc) x=ncb-acc
4534 bande_k821=dble(x)*dble(nelim+acc+x)
4535 ENDIF
4536 max_mem_allow=bande_k821
4537 IF(bdc_md)THEN
4538 max_mem_allow=
min(bande_k821,
4539 & mem_size_strong(i))
4540 max_mem_allow=
max(dble(0),max_mem_allow)
4541 ENDIF
4542 a=dble(1)
4543 b=dble(acc+nelim)
4544 c=dble(-max_mem_allow)
4545 delta=((b*b)-(dble(4)*a*c))
4546 kmax=int((-b+sqrt(delta))/(dble(2)*a))
4547 x=kmax-nb_rows(i)
4548 IF((acc+nb_rows(i)+x).GT.ncb)
4549 & x=ncb-(acc+nb_rows(i))
4550 nb_rows(i)=nb_rows(i)+x
4551 acc=acc+nb_rows(i)
4552 chosen=chosen+1
4553 IF(ncb.EQ.acc) GOTO 889
4554 ENDDO
4555 additionnal_rows=ncb-acc
4556 ENDIF
4557 acc=0
4558 chosen=0
4559 DO i=1,others
4560 a=dble(1)
4561 b=dble(acc+2)
4562 c=-buf_size+dble(acc+nelim)
4563 delta=(b*b)-(dble(4)*a*c)
4564 x=int((-b+sqrt(delta))/(dble(2)*a))
4565 IF(x.GT.ncb-acc) x=ncb-acc
4566 bande_k821=dble(x)*dble(nelim+acc+x)
4567 IF(have_type1_son)THEN
4568 a=dble(1)
4569 b=dble(acc+2+nelim)
4570 c=-buf_size+dble(acc+nelim)
4571 delta=(b*b)-(dble(4)*a*c)
4572 x=int((-b+sqrt(delta))/(dble(2)*a))
4573 IF(x.GT.ncb-acc) x=ncb-acc
4574 bande_k821=dble(x)*dble(nelim+acc+x)
4575 ENDIF
4576 max_mem_allow=bande_k821
4577 a=dble(1)
4578 b=dble(acc+nelim)
4579 c=dble(-max_mem_allow)
4580 delta=((b*b)-(dble(4)*a*c))
4581 kmax=int((-b+sqrt(delta))/(dble(2)*a))
4582 x=kmax-nb_rows(i)
4583 IF((acc+nb_rows(i)+x).GT.ncb)
4584 & x=ncb-(acc+nb_rows(i))
4585 nb_rows(i)=nb_rows(i)+x
4586 acc=acc+nb_rows(i)
4587 chosen=chosen+1
4588 IF(ncb.EQ.acc) GOTO 889
4589 ENDDO
4590 additionnal_rows=ncb-acc
4591 994 CONTINUE
4592 x=int(dble(additionnal_rows)/dble(others))
4593 IF((x*others).LT.additionnal_rows)THEN
4594 x=x+1
4595 ENDIF
4596 DO i=1,others
4597 nb_rows(i)=nb_rows(i)+x
4598 additionnal_rows=additionnal_rows-x
4599 IF(additionnal_rows.LT.x)x=additionnal_rows
4600 ENDDO
4601 chosen=others
4602 ENDIF
4603 ENDIF
4604 889 CONTINUE
4605 max_load=temp_max_load
4606 890 CONTINUE
4607 j=chosen
4608 x=0
4609 DO i=j,1,-1
4610 IF(nb_rows(i).EQ.0)THEN
4611 chosen=chosen-1
4612 ELSE
4613 IF(nb_rows(i).GT.0)THEN
4614 x=1
4615 ELSE
4616 WRITE(*,*)myid,
4617 & ': Internal error 15 in DMUMPS_SET_PARTI_FLOP_IRR'
4619 ENDIF
4620 ENDIF
4621 ENDDO
4622 nslaves_node=chosen
4623 tab_pos(nslaves_node+1)= ncb+1
4624 tab_pos(slavef+2) = chosen
4625 pos=1
4626 x=1
4627 DO i=1,j
4628 IF(nb_rows(i).NE.0)THEN
4629 slaves_list(x)=temp_id(i)
4630 tab_pos(x)=pos
4631 pos=pos+nb_rows(i)
4632 IF(nb_rows(i).LE.0)THEN
4633 WRITE(*,*)myid,
4634 & ': Internal error 16 in DMUMPS_SET_PARTI_FLOP_IRR'
4636 ENDIF
4637 x=x+1
4638 ENDIF
4639 ENDDO
4640 IF(pos.NE.(ncb+1))THEN
4641 WRITE(*,*)myid,
4642 & ': Internal error 17 in DMUMPS_SET_PARTI_FLOP_IRR',
4643 & pos,ncb+1
4645 ENDIF
integer function mumps_getkmin(k821, k50, kmax, ncb)
subroutine mumps_max_surfcb_nbrows(what, keep, keep8, ncb, nfr, slavef, nbrowmax, maxsurfcb8)