620 IMPLICIT NONE
621 INTEGER, INTENT(IN) :: SIZE_PERM,
622 & SIZE_IPTR_WORKING,
623 &
624
625
626
627
628
629
630
631
632
633
634
635LOGICAL, INTENT(IN) :: behaviour_L0,
636 & reorder, PROKG
637 INTEGER, INTENT(INOUT) :: PERM_RHS(SIZE_PERM)
638 INTEGER :: I, J, K,
639 & entry,
640 & node,
641 & SIZE_PERM_WORKING,
642 & NB_NON_EMPTY,
643 & to_be_found,
644 & posintmprhs,
645 & selected,
646 & local_selected,
647 & current_proc,
648 & NPROCS,
649 & n_pass,
650 & pass,
651 & nblocks,
652 & n_select_loc,
653 & IERR
654 INTEGER, ALLOCATABLE, DIMENSION(:) :: TMP_RHS,
655 & PTR_PROCS,
656 & LOAD_PROCS,
657 & IPTR_PERM_WORKING,
658 & PERM_WORKING,
659 & MYTYPENODE,
660 & PERM_PO
661 LOGICAL, ALLOCATABLE, DIMENSION(:) :: USED
662 LOGICAL :: allow_above_L0
663 INTEGER, EXTERNAL :: MUMPS_TYPENODE_ROUGH
664 nprocs = size_iptr_working - 1
665 ALLOCATE(tmp_rhs(size_perm),
666 & ptr_procs(nprocs),
667 & load_procs(nprocs),
668 & used(size_perm),
669 & iptr_perm_working(nprocs+1),
670 & mytypenode(nsteps),
671 & stat=ierr)
672 IF(ierr.GT.0) THEN
673 WRITE(*,*)'Allocation error in SMUMPS_INTERLEAVE_RHS_AM1'
675 END IF
676 DO i=1, nsteps
678 ENDDO
679 nb_non_empty = 0
680 DO i=1,size_perm
681 IF(irhs_ptr(i+1)-irhs_ptr(i).NE.0) THEN
682 nb_non_empty = nb_non_empty + 1
683 END IF
684 END DO
685 k = 0
686 iptr_perm_working(1)=1
687 DO i=1,nprocs
688 used = .false.
689 DO j=iptr_working(i),iptr_working(i+1)-1
690 used(working(j)) = .true.
691 END DO
692 DO j=1,n
693 IF (used(abs(step(perm_rhs(j)))).AND.
694 & ((irhs_ptr(perm_rhs(j)+1)-irhs_ptr(perm_rhs(j))).NE.0))
695 & THEN
696 k = k + 1
697 END IF
698 END DO
699 iptr_perm_working(i+1) = k+1
700 END DO
701 size_perm_working = k
702 ALLOCATE(perm_working(size_perm_working),
703 & stat=ierr)
704 IF(ierr.GT.0) THEN
705 WRITE(*,*)'Allocation error in SMUMPS_INTERLEAVE_RHS_AM1'
707 END IF
708 k = 0
709 DO i=1,nprocs
710 used = .false.
711 DO j=iptr_working(i),iptr_working(i+1)-1
712 used(working(j)) = .true.
713 END DO
714 DO j=1,n
715 IF (used(abs(step(perm_rhs(j)))).AND.
716 & ((irhs_ptr(perm_rhs(j)+1)-irhs_ptr(perm_rhs(j))).NE.0))
717 & THEN
718 k = k + 1
719 perm_working(k) = perm_rhs(j)
720 END IF
721 END DO
722 END DO
723 IF(behaviour_l0) THEN
724 n_pass = 2
725 allow_above_l0 = .false.
726 to_be_found = 0
727 DO i=1,size_perm
728 IF((mytypenode(abs(step(i))).LE.1).AND.
729 & (irhs_ptr(i+1)-irhs_ptr(i).NE.0))
730 & THEN
731 to_be_found = to_be_found + 1
732 END IF
733 END DO
734 ELSE
735 n_pass = 1
736 allow_above_l0 = .true.
737 to_be_found = nb_non_empty
738 END IF
739 ptr_procs(1:nprocs) = iptr_perm_working(1:nprocs)
740 load_procs = 0
741 used = .false.
742 current_proc = 1
743 n_select_loc = n_select
744 IF (n_select_loc.LE.0) THEN
745 n_select_loc = 1
746 ENDIF
747 posintmprhs = 0
748 DO pass=1,n_pass
749 selected = 0
750 DO WHILE(selected.LT.to_be_found)
751 local_selected = 0
752 DO WHILE(local_selected.LT.n_select_loc)
753 IF(ptr_procs(current_proc).EQ.
754 & iptr_perm_working(current_proc+1))
755 & THEN
756 EXIT
757 ELSE
758 entry = perm_working(ptr_procs(current_proc))
759 node = abs(step(entry))
760 IF(.NOT.used(entry)) THEN
761 IF(allow_above_l0.OR.(mytypenode(node).LE.1)) THEN
762 used(entry) = .true.
763 selected = selected + 1
764 local_selected = local_selected + 1
765 posintmprhs = posintmprhs + 1
766 tmp_rhs(posintmprhs) = entry
767 IF(selected.EQ.to_be_found) EXIT
768 END IF
769 END IF
770 ptr_procs(current_proc) = ptr_procs(current_proc) + 1
771 END IF
772 END DO
773 current_proc = mod(current_proc,nprocs)+1
774 END DO
775 to_be_found = nb_non_empty - to_be_found
776 allow_above_l0 = .true.
777 ptr_procs(1:nprocs) = iptr_perm_working(1:nprocs)
778 END DO
779 DO i=1,size_perm
780 IF(irhs_ptr(perm_rhs(i)+1)-irhs_ptr(perm_rhs(i)).EQ.0) THEN
781 posintmprhs = posintmprhs+1
782 tmp_rhs(posintmprhs) = perm_rhs(i)
783 IF(posintmprhs.EQ.size_perm) EXIT
784 END IF
785 END DO
786 IF(reorder) THEN
787 posintmprhs = 0
788 ALLOCATE(perm_po(n),stat=ierr)
789 IF(ierr.GT.0) THEN
790 WRITE(*,*)'Allocation error in INTERLEAVE_RHS_AM1'
792 END IF
793 DO j=1,n
794 perm_po(sym_perm(j))=j
795 END DO
796 nblocks = n/nbrhs
797 DO i = 1, nblocks
798 used = .false.
799 DO j=1, nbrhs
800 used(tmp_rhs(nbrhs*(i-1)+j))=.true.
801 END DO
802 DO j=1,n
803 IF(used(perm_po(j))) THEN
804 posintmprhs = posintmprhs + 1
805 perm_rhs(posintmprhs) = perm_po(j)
806 END IF
807 END DO
808 END DO
809 IF(mod(n,nbrhs).NE.0) THEN
810 used = .false.
811 DO j=1, mod(n,nbrhs)
812 used(tmp_rhs(nbrhs*nblocks+j))=.true.
813 END DO
814 DO j=1,n
815 IF(used(perm_po(j))) THEN
816 posintmprhs = posintmprhs + 1
817 perm_rhs(posintmprhs) = perm_po(j)
818 END IF
819 END DO
820 END IF
821 DEALLOCATE(perm_po)
822 ELSE
823 perm_rhs = tmp_rhs
824 END IF
825 DEALLOCATE(tmp_rhs,
826 & ptr_procs,
827 & load_procs,
828 & used,
829 & iptr_perm_working,
830 & perm_working,
831 & mytypenode)
832 RETURN