OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
carrowheads.F File Reference

Go to the source code of this file.

Functions/Subroutines

subroutine cmumps_ana_dist_arrowheads (myid, slavef, n, procnode, step, ptraiw, ptrarw, istep_to_iniv2, i_am_cand, keep, keep8, icntl, id)
subroutine cmumps_facto_send_arrowheads (n, nz, aspk, irn, icn, perm, lscal, colsca, rowsca, myid, slavef, procnode_steps, nbrecords, lp, comm, root, keep, keep8, fils, rg2l, intarr, lintarr, dblarr, ldblarr, ptraiw, ptrarw, frere_steps, step, a, la, istep_to_iniv2, i_am_cand, candidates)
subroutine cmumps_arrow_fill_send_buf ()
subroutine cmumps_arrow_fill_send_buf_elt (isend_shr, jsend_shr, val_shr, dest_shr, bufi, bufr, nbrecords, nbufs, lp, comm)
subroutine cmumps_arrow_finish_send_buf (bufi, bufr, nbrecords, nbufs, lp, comm, type_parall)
recursive subroutine cmumps_quick_sort_arrowheads (n, perm, intlist, dbllist, taille, lo, hi)
subroutine cmumps_facto_recv_arrowhd2 (n, dblarr, ldblarr, intarr, lintarr, ptraiw, ptrarw, keep, keep8, myid, comm, nbrecords, a, la, root, procnode_steps, slavef, perm, frere_steps, step, info1, info2)
subroutine cmumps_set_to_zero (a, lld, m, n, keep)
subroutine cmumps_set_root_to_zero (root, keep, a, la)
subroutine cmumps_get_root_info (root, local_m, local_n, ptr_root, la)

Function/Subroutine Documentation

◆ cmumps_ana_dist_arrowheads()

subroutine cmumps_ana_dist_arrowheads ( integer myid,
integer slavef,
integer n,
integer, dimension( keep(28) ) procnode,
integer, dimension( n ) step,
integer(8), dimension( n ), intent(inout) ptraiw,
integer(8), dimension( n ), intent(inout) ptrarw,
integer, dimension(keep(71)) istep_to_iniv2,
logical, dimension(max(1,keep(56))) i_am_cand,
integer, dimension( 500 ) keep,
integer(8), dimension(150) keep8,
integer, dimension( 60 ) icntl,
type (cmumps_struc) id )

Definition at line 14 of file carrowheads.F.

19 IMPLICIT NONE
20 TYPE (CMUMPS_STRUC) :: id
21 INTEGER MYID, N, SLAVEF
22 INTEGER KEEP( 500 ), ICNTL( 60 )
23 INTEGER(8) KEEP8(150)
24 INTEGER PROCNODE( KEEP(28) ), STEP( N )
25 INTEGER(8), INTENT(INOUT) :: PTRAIW( N ), PTRARW( N )
26 INTEGER ISTEP_TO_INIV2(KEEP(71))
27 LOGICAL I_AM_CAND(max(1,KEEP(56)))
28 LOGICAL I_AM_SLAVE
29 LOGICAL I_AM_CAND_LOC
30 INTEGER MUMPS_TYPENODE, MUMPS_PROCNODE, MUMPS_TYPESPLIT
32 INTEGER ISTEP, I, NCOL, NROW, allocok
33 INTEGER TYPE_PARALL, ITYPE, IRANK, INIV2, TYPESPLIT
34 LOGICAL T4_MASTER_CONCERNED, EARLYT3ROOTINS
35 INTEGER(8) :: IPTRI, IPTRR
36 earlyt3rootins = keep(200) .EQ. 0
37 & .OR. (keep(200) .LT. 0 .AND. keep(400) .EQ. 0)
38 type_parall = keep(46)
39 i_am_slave = (keep(46).EQ.1 .OR. myid.NE.0)
40 keep8(26) = 0_8
41 keep8(27) = 0_8
42 DO i = 1, n
43 istep=abs(step(i))
44 itype = mumps_typenode( procnode(istep), keep(199) )
45 irank = mumps_procnode( procnode(istep), keep(199) )
46 i_am_cand_loc = .false.
47 typesplit = mumps_typesplit( procnode(istep), keep(199) )
48 t4_master_concerned = .false.
49 IF (itype.EQ.2) THEN
50 iniv2 = istep_to_iniv2(istep)
51 IF (i_am_slave) THEN
52 i_am_cand_loc = i_am_cand(iniv2)
53 IF ( (typesplit.EQ.5).OR.(typesplit.EQ.6)) THEN
54 IF ( type_parall .eq. 0 ) THEN
55 t4_master_concerned =
56 & ( id%CANDIDATES (id%CANDIDATES(slavef+1,iniv2)+1,iniv2)
57 & .EQ.myid-1 )
58 ELSE
59 t4_master_concerned =
60 & ( id%CANDIDATES (id%CANDIDATES(slavef+1, iniv2)+1,iniv2 )
61 & .EQ.myid )
62 ENDIF
63 ENDIF
64 ENDIF
65 ENDIF
66 IF ( type_parall .eq. 0 ) THEN
67 irank = irank + 1
68 END IF
69 IF (
70 & ( (itype .EQ. 1.OR.itype.EQ.2) .AND.
71 & irank .EQ. myid )
72 & .OR.
73 & ( t4_master_concerned )
74 & ) THEN
75 keep8(26) = keep8(26) + 1_8 + ptraiw(i)+ptrarw(i)
76 keep8(27) = keep8(27) + 3_8 + ptraiw(i)+ptrarw(i)
77 ELSE IF ( itype .EQ. 3 ) THEN
78 IF (earlyt3rootins) THEN
79 ELSE
80 keep8(26) = keep8(26) + 1_8 + ptraiw(i)+ptrarw(i)
81 keep8(27) = keep8(27) + 3_8 + ptraiw(i)+ptrarw(i)
82 ENDIF
83 ELSE IF ( itype .EQ. 2 .AND. i_am_cand_loc ) THEN
84 ptrarw( i ) = 0_8
85 keep8(26) = keep8(26) + 1_8 + ptraiw(i)+ptrarw(i)
86 keep8(27) = keep8(27) + 3_8 + ptraiw(i)+ptrarw(i)
87 END IF
88 END DO
89 IF ( associated( id%INTARR ) ) THEN
90 DEALLOCATE( id%INTARR )
91 NULLIFY( id%INTARR )
92 END IF
93 IF ( keep8(27) > 0 ) THEN
94 ALLOCATE( id%INTARR( keep8(27) ), stat = allocok )
95 IF ( allocok .GT. 0 ) THEN
96 id%INFO(1) = -7
97 CALL mumps_set_ierror(keep8(27),id%INFO(2))
98 RETURN
99 END IF
100 ELSE
101 ALLOCATE( id%INTARR( 1 ), stat = allocok )
102 IF ( allocok .GT. 0 ) THEN
103 id%INFO(1) = -7
104 id%INFO(2) = 1
105 RETURN
106 END IF
107 END IF
108 iptri = 1_8
109 iptrr = 1_8
110 DO i = 1, n
111 istep = abs(step(i))
112 itype = mumps_typenode( procnode(istep), keep(199) )
113 irank = mumps_procnode( procnode(istep), keep(199) )
114 typesplit = mumps_typesplit( procnode(istep), keep(199) )
115 i_am_cand_loc = .false.
116 t4_master_concerned = .false.
117 IF (itype.EQ.2) THEN
118 iniv2 = istep_to_iniv2(istep)
119 IF (i_am_slave) THEN
120 i_am_cand_loc = i_am_cand(iniv2)
121 IF ( (typesplit.EQ.5).OR.(typesplit.EQ.6)) THEN
122 IF ( type_parall .eq. 0 ) THEN
123 t4_master_concerned =
124 & (id%CANDIDATES (id%CANDIDATES(slavef+1,iniv2)+1,iniv2)
125 & .EQ.myid-1 )
126 ELSE
127 t4_master_concerned =
128 & (id%CANDIDATES (id%CANDIDATES(slavef+1,iniv2)+1,iniv2)
129 & .EQ.myid )
130 ENDIF
131 ENDIF
132 ENDIF
133 ENDIF
134 IF ( type_parall .eq. 0 ) THEN
135 irank =irank + 1
136 END IF
137 IF (
138 & ( itype .eq. 2 .and.
139 & irank .eq. myid )
140 & .or.
141 & ( itype .eq. 1 .and.
142 & irank .eq. myid )
143 & .or.
144 & ( t4_master_concerned )
145 & ) THEN
146 ncol = int(ptraiw( i ))
147 nrow = int(ptrarw( i ))
148 id%INTARR( iptri ) = ncol
149 id%INTARR( iptri + 1 ) = -nrow
150 id%INTARR( iptri + 2 ) = i
151 ptraiw( i ) = iptri
152 ptrarw( i ) = iptrr
153 iptri = iptri + int(ncol + nrow + 3,8)
154 iptrr = iptrr + int(ncol + nrow + 1,8)
155 ELSE IF ( itype .eq. 3) THEN
156 IF ( earlyt3rootins ) THEN
157 ptraiw(i)=0
158 ptrarw(i)=0
159 ELSE
160 ncol = int(ptraiw( i ))
161 nrow = int(ptrarw( i ))
162 id%INTARR( iptri ) = ncol
163 id%INTARR( iptri + 1 ) = -nrow
164 id%INTARR( iptri + 2 ) = i
165 ptraiw( i ) = iptri
166 ptrarw( i ) = iptrr
167 iptri = iptri + int(ncol + nrow + 3,8)
168 iptrr = iptrr + int(ncol + nrow + 1,8)
169 ENDIF
170 ELSE IF ( itype .eq. 2 .AND. i_am_cand_loc ) THEN
171 ncol = int(ptraiw( i ))
172 nrow = 0
173 id%INTARR( iptri ) = ncol
174 id%INTARR( iptri + 1 ) = -nrow
175 id%INTARR( iptri + 2 ) = i
176 ptraiw( i ) = iptri
177 ptrarw( i ) = iptrr
178 iptri = iptri + int(ncol + nrow + 3, 8)
179 iptrr = iptrr + int(ncol + nrow + 1, 8)
180 ELSE
181 ptraiw(i) = 0_8
182 ptrarw(i) = 0_8
183 END IF
184 END DO
185 IF ( iptri - 1_8 .NE. keep8(27) ) THEN
186 WRITE(*,*) 'Error 1 in ana_arrowheads',
187 & ' IPTRI - 1, KEEP8(27)=', iptri - 1, keep8(27)
188 CALL mumps_abort()
189 END IF
190 IF ( iptrr - 1_8 .NE. keep8(26) ) THEN
191 WRITE(*,*) 'Error 2 in ana_arrowheads'
192 CALL mumps_abort()
193 END IF
194 RETURN
#define mumps_abort
Definition VE_Metis.h:25
initmumps id
integer function mumps_typenode(procinfo_inode, k199)
integer function mumps_procnode(procinfo_inode, k199)
subroutine mumps_set_ierror(size8, ierror)
integer function mumps_typesplit(procinfo_inode, k199)

◆ cmumps_arrow_fill_send_buf()

subroutine cmumps_facto_send_arrowheads::cmumps_arrow_fill_send_buf

Definition at line 601 of file carrowheads.F.

602 IMPLICIT NONE
603 include 'mpif.h'
604 include 'mumps_tags.h'
605 INTEGER IERR
606 INTEGER TAILLE_SENDI, TAILLE_SENDR, IREQ
607 IF (bufi(1,dest_shr)+1.GT.nbrecords) THEN
608 taille_sendi = bufi(1,dest_shr) * 2 + 1
609 taille_sendr = bufi(1,dest_shr)
610 CALL mpi_send(bufi(1,dest_shr),taille_sendi,
611 & mpi_integer,
612 & dest_shr, arrowhead, comm, ierr )
613 CALL mpi_send( bufr(1,dest_shr), taille_sendr,
614 & mpi_complex, dest_shr,
615 & arrowhead, comm, ierr )
616 bufi(1,dest_shr) = 0
617 ENDIF
618 ireq = bufi(1,dest_shr) + 1
619 bufi(1,dest_shr) = ireq
620 bufi( ireq * 2, dest_shr ) = isend_shr
621 bufi( ireq * 2 + 1, dest_shr ) = jsend_shr
622 bufr( ireq, dest_shr ) = val_shr
623 RETURN
subroutine mpi_send(buf, cnt, datatype, dest, tag, comm, ierr)
Definition mpi.f:480

◆ cmumps_arrow_fill_send_buf_elt()

subroutine cmumps_arrow_fill_send_buf_elt ( integer, intent(in) isend_shr,
integer, intent(in) jsend_shr,
complex, intent(in) val_shr,
integer dest_shr,
integer, dimension( nbrecords*2+1, nbufs ) bufi,
complex, dimension( nbrecords, nbufs ) bufr,
integer nbrecords,
integer nbufs,
integer lp,
integer comm )

Definition at line 626 of file carrowheads.F.

629 IMPLICIT NONE
630 INTEGER, INTENT(in) :: ISEND_SHR, JSEND_SHR
631 COMPLEX, INTENT(in) :: VAL_SHR
632 INTEGER :: DEST_SHR, NBRECORDS, NBUFS, LP, COMM
633 INTEGER :: BUFI( NBRECORDS*2+1, NBUFS )
634 COMPLEX :: BUFR( NBRECORDS, NBUFS )
635 include 'mpif.h'
636 include 'mumps_tags.h'
637 INTEGER IERR
638 INTEGER TAILLE_SENDI, TAILLE_SENDR, IREQ
639 IF (bufi(1,dest_shr)+1.GT.nbrecords) THEN
640 taille_sendi = bufi(1,dest_shr) * 2 + 1
641 taille_sendr = bufi(1,dest_shr)
642 CALL mpi_send(bufi(1,dest_shr),taille_sendi,
643 & mpi_integer,
644 & dest_shr, arrowhead, comm, ierr )
645 CALL mpi_send( bufr(1,dest_shr), taille_sendr,
646 & mpi_complex, dest_shr,
647 & arrowhead, comm, ierr )
648 bufi(1,dest_shr) = 0
649 ENDIF
650 ireq = bufi(1,dest_shr) + 1
651 bufi(1,dest_shr) = ireq
652 bufi( ireq * 2, dest_shr ) = isend_shr
653 bufi( ireq * 2 + 1, dest_shr ) = jsend_shr
654 bufr( ireq, dest_shr ) = val_shr
655 RETURN

◆ cmumps_arrow_finish_send_buf()

subroutine cmumps_arrow_finish_send_buf ( integer, dimension( nbrecords * 2 + 1, nbufs ) bufi,
complex, dimension( nbrecords, nbufs ) bufr,
integer nbrecords,
integer nbufs,
integer lp,
integer comm,
integer type_parall )

Definition at line 657 of file carrowheads.F.

660 IMPLICIT NONE
661 INTEGER NBUFS, NBRECORDS, TYPE_PARALL
662 INTEGER BUFI( NBRECORDS * 2 + 1, NBUFS )
663 COMPLEX BUFR( NBRECORDS, NBUFS )
664 INTEGER COMM
665 INTEGER LP
666 INTEGER ISLAVE, TAILLE_SENDI, TAILLE_SENDR, IERR
667 include 'mpif.h'
668 include 'mumps_tags.h'
669 DO islave = 1,nbufs
670 taille_sendi = bufi(1,islave) * 2 + 1
671 taille_sendr = bufi(1,islave)
672 bufi(1,islave) = - bufi(1,islave)
673 CALL mpi_send(bufi(1,islave),taille_sendi,
674 & mpi_integer,
675 & islave, arrowhead, comm, ierr )
676 IF ( taille_sendr .NE. 0 ) THEN
677 CALL mpi_send( bufr(1,islave), taille_sendr,
678 & mpi_complex, islave,
679 & arrowhead, comm, ierr )
680 END IF
681 ENDDO
682 RETURN

◆ cmumps_facto_recv_arrowhd2()

subroutine cmumps_facto_recv_arrowhd2 ( integer n,
complex, dimension(ldblarr) dblarr,
integer(8), intent(in) ldblarr,
integer, dimension(lintarr) intarr,
integer(8), intent(in) lintarr,
integer(8), dimension(n), intent(in) ptraiw,
integer(8), dimension(n), intent(in) ptrarw,
integer, dimension(500) keep,
integer(8), dimension(150) keep8,
integer myid,
integer comm,
integer nbrecords,
complex, dimension( la ) a,
integer(8), intent(in) la,
type (cmumps_root_struc) root,
integer, dimension( keep(28) ) procnode_steps,
integer slavef,
integer, dimension( n ) perm,
integer, dimension( keep(28) ) frere_steps,
integer, dimension(n) step,
integer info1,
integer info2 )

Definition at line 725 of file carrowheads.F.

732 USE cmumps_struc_def, ONLY : cmumps_root_struc
733 IMPLICIT NONE
734 INTEGER N, MYID, COMM
735 INTEGER(8), INTENT(IN) :: LDBLARR, LINTARR
736 INTEGER INTARR(LINTARR)
737 INTEGER(8), INTENT(IN) :: PTRAIW(N), PTRARW(N)
738 INTEGER KEEP(500)
739 INTEGER(8) KEEP8(150)
740 INTEGER(8), intent(IN) :: LA
741 INTEGER PROCNODE_STEPS( KEEP(28) ), PERM( N )
742 INTEGER SLAVEF, NBRECORDS
743 COMPLEX A( LA )
744 INTEGER INFO1, INFO2
745 COMPLEX DBLARR(LDBLARR)
746 INTEGER FRERE_STEPS( KEEP(28) ), STEP(N)
747 TYPE (CMUMPS_ROOT_STRUC) :: root
748 INTEGER, POINTER, DIMENSION(:) :: BUFI
749 COMPLEX, POINTER, DIMENSION(:) :: BUFR
750 INTEGER, POINTER, DIMENSION(:,:) :: IW4
751 LOGICAL :: EARLYT3ROOTINS
752 LOGICAL FINI
753 INTEGER IREC, NB_REC, IARR, JARR, I, allocok
754 INTEGER(8) :: I18, IA8, IS18, IIW8, IS8, IAS8
755 INTEGER ISHIFT
756 INTEGER LOCAL_M, LOCAL_N, ILOCROOT, JLOCROOT,
757 & IPOSROOT, JPOSROOT, TAILLE,
758 & IPROC
759 INTEGER(8) :: PTR_ROOT
760 INTEGER ARROW_ROOT, TYPE_PARALL
761 INTEGER MUMPS_TYPENODE, MUMPS_PROCNODE
763 COMPLEX VAL
764 COMPLEX ZERO
765 parameter( zero = (0.0e0,0.0e0) )
766 include 'mpif.h'
767 include 'mumps_tags.h'
768 INTEGER MASTER
769 parameter(master=0)
770 INTEGER :: IERR
771 INTEGER :: STATUS(MPI_STATUS_SIZE)
772 INTEGER numroc
773 EXTERNAL numroc
774 type_parall = keep(46)
775 arrow_root=0
776 earlyt3rootins = keep(200) .EQ. 0
777 & .OR. (keep(200) .LT. 0 .AND. keep(400) .EQ. 0)
778 ALLOCATE( bufi( nbrecords * 2 + 1 ), stat = allocok )
779 IF ( allocok .GT. 0 ) THEN
780 info1 = -13
781 info2 = nbrecords * 2 + 1
782 WRITE(*,*) myid,': Could not allocate BUFI: goto 500'
783 GOTO 500
784 END IF
785 ALLOCATE( bufr( nbrecords ) , stat = allocok )
786 IF ( allocok .GT. 0 ) THEN
787 info1 = -13
788 info2 = nbrecords
789 WRITE(*,*) myid,': Could not allocate BUFR: goto 500'
790 GOTO 500
791 END IF
792 ALLOCATE( iw4(n,2), stat = allocok )
793 IF ( allocok .GT. 0 ) THEN
794 info1 = -13
795 info2 = 2 * n
796 WRITE(*,*) myid,': Could not allocate IW4: goto 500'
797 GOTO 500
798 END IF
799 IF ( keep(38).NE.0 .AND. earlyt3rootins ) THEN
800 CALL cmumps_get_root_info(root, local_m, local_n, ptr_root, la)
801 CALL cmumps_set_root_to_zero(root, keep, a, la)
802 ELSE
803 local_m = -19999; local_n = -29999; ptr_root = -99999_8
804 END IF
805 fini = .false.
806#if defined(__ve__)
807!NEC$ IVDEP
808#endif
809 DO i=1,n
810 i18 = ptraiw(i)
811 ia8 = ptrarw(i)
812 IF (ia8.GT.0_8) THEN
813 dblarr(ia8) = zero
814 iw4(i,1) = intarr(i18)
815 iw4(i,2) = -intarr(i18+1_8)
816 intarr(i18+2)=i
817 ENDIF
818 ENDDO
819 DO WHILE (.NOT.fini)
820 CALL mpi_recv( bufi(1), 2*nbrecords+1,
821 & mpi_integer, master,
822 & arrowhead,
823 & comm, status, ierr )
824 nb_rec = bufi(1)
825 IF (nb_rec.LE.0) THEN
826 fini = .true.
827 nb_rec = -nb_rec
828 ENDIF
829 IF (nb_rec.EQ.0) EXIT
830 CALL mpi_recv( bufr(1), nbrecords, mpi_complex,
831 & master, arrowhead,
832 & comm, status, ierr )
833 DO irec=1, nb_rec
834 iarr = bufi( irec * 2 )
835 jarr = bufi( irec * 2 + 1 )
836 val = bufr( irec )
837 IF ( mumps_typenode( procnode_steps(abs(step(abs(iarr)))),
838 & keep(199) ) .eq. 3
839 & .AND. earlyt3rootins ) THEN
840 IF ( iarr .GT. 0 ) THEN
841 iposroot = root%RG2L_ROW( iarr )
842 jposroot = root%RG2L_COL( jarr )
843 ELSE
844 iposroot = root%RG2L_ROW( jarr )
845 jposroot = root%RG2L_COL( -iarr )
846 END IF
847 ilocroot = root%MBLOCK * ( ( iposroot - 1 ) /
848 & ( root%MBLOCK * root%NPROW ) )
849 & + mod( iposroot - 1, root%MBLOCK ) + 1
850 jlocroot = root%NBLOCK * ( ( jposroot - 1 ) /
851 & ( root%NBLOCK * root%NPCOL ) )
852 & + mod( jposroot - 1, root%NBLOCK ) + 1
853 IF (keep(60)==0) THEN
854 a( ptr_root + int(jlocroot - 1,8) * int(local_m,8)
855 & + int(ilocroot - 1,8) )
856 & = a( ptr_root + int(jlocroot - 1,8)
857 & * int(local_m,8)
858 & + int(ilocroot - 1,8))
859 & + val
860 ELSE
861 root%SCHUR_POINTER( int(jlocroot-1,8)
862 & * int(root%SCHUR_LLD,8)
863 & + int(ilocroot,8) )
864 & = root%SCHUR_POINTER( int(jlocroot - 1,8)
865 & * int(root%SCHUR_LLD,8)
866 & + int(ilocroot,8))
867 & + val
868 ENDIF
869 ELSE IF (iarr.GE.0) THEN
870 IF (iarr.EQ.jarr) THEN
871 ia8 = ptrarw(iarr)
872 dblarr(ia8) = dblarr(ia8) + val
873 ELSE
874 is18 = ptraiw(iarr)
875 ishift = intarr(is18) + iw4(iarr,2)
876 iw4(iarr,2) = iw4(iarr,2) - 1
877 iiw8 = is18 + ishift + 2
878 intarr(iiw8) = jarr
879 is8 = ptrarw(iarr)
880 ias8 = is8 + ishift
881 dblarr(ias8) = val
882 ENDIF
883 ELSE
884 iarr = -iarr
885 is8 = ptraiw(iarr)+iw4(iarr,1)+2
886 intarr(is8) = jarr
887 ias8 = ptrarw(iarr)+iw4(iarr,1)
888 iw4(iarr,1) = iw4(iarr,1) - 1
889 dblarr(ias8) = val
890 IF ( iw4(iarr,1) .EQ. 0
891 & .AND. step(iarr) > 0 ) THEN
892 iproc = mumps_procnode( procnode_steps(step(iarr)),
893 & keep(199) )
894 IF ( type_parall .eq. 0 ) THEN
895 iproc = iproc + 1
896 END IF
897 IF (iproc .EQ. myid) THEN
898 taille = intarr( ptraiw(iarr) )
899 CALL cmumps_quick_sort_arrowheads( n, perm,
900 & intarr( ptraiw(iarr) + 3 ),
901 & dblarr( ptrarw(iarr) + 1 ),
902 & taille, 1, taille )
903 END IF
904 END IF
905 ENDIF
906 ENDDO
907 END DO
908 DEALLOCATE( bufi )
909 DEALLOCATE( bufr )
910 DEALLOCATE( iw4 )
911 500 CONTINUE
912 keep(49) = arrow_root
913 RETURN
subroutine cmumps_get_root_info(root, local_m, local_n, ptr_root, la)
recursive subroutine cmumps_quick_sort_arrowheads(n, perm, intlist, dbllist, taille, lo, hi)
subroutine cmumps_set_root_to_zero(root, keep, a, la)
subroutine mpi_recv(buf, cnt, datatype, source, tag, comm, status, ierr)
Definition mpi.f:461
integer function numroc(n, nb, iproc, isrcproc, nprocs)
Definition mpi.f:786

◆ cmumps_facto_send_arrowheads()

subroutine cmumps_facto_send_arrowheads ( integer n,
integer(8), intent(in) nz,
complex, dimension(nz) aspk,
integer, dimension(nz) irn,
integer, dimension(nz) icn,
integer, dimension(n) perm,
logical lscal,
real, dimension(*) colsca,
real, dimension(*) rowsca,
integer myid,
integer slavef,
integer, dimension(keep(28)) procnode_steps,
integer nbrecords,
integer lp,
integer comm,
type (cmumps_root_struc) root,
integer, dimension( 500 ) keep,
integer(8), dimension(150) keep8,
integer, dimension( n ) fils,
integer, dimension( n ) rg2l,
integer, dimension( lintarr ) intarr,
integer(8) lintarr,
complex, dimension( ldblarr ) dblarr,
integer(8) ldblarr,
integer(8), dimension( n ), intent(inout) ptraiw,
integer(8), dimension( n ), intent(inout) ptrarw,
integer, dimension( keep(28) ) frere_steps,
integer, dimension(n) step,
complex, dimension( la ) a,
integer(8), intent(in) la,
integer, dimension(keep(71)) istep_to_iniv2,
logical, dimension(max(1,keep(56))) i_am_cand,
integer, dimension(slavef+1, max(1,keep(56))) candidates )

Definition at line 196 of file carrowheads.F.

203!$ USE OMP_LIB
204 USE cmumps_struc_def, ONLY : cmumps_root_struc
205 IMPLICIT NONE
206 INTEGER :: N, COMM, NBRECORDS
207 INTEGER(8), INTENT(IN) :: NZ
208 INTEGER KEEP( 500 )
209 INTEGER(8) KEEP8(150)
210 COMPLEX ASPK(NZ)
211 REAL COLSCA(*), ROWSCA(*)
212 INTEGER IRN(NZ), ICN(NZ)
213 INTEGER PERM(N), PROCNODE_STEPS(KEEP(28))
214 INTEGER RG2L( N ), FILS( N )
215 INTEGER ISTEP_TO_INIV2(KEEP(71))
216 LOGICAL I_AM_CAND(max(1,KEEP(56)))
217 INTEGER LP, SLAVEF, MYID
218 INTEGER CANDIDATES(SLAVEF+1, max(1,KEEP(56)))
219 LOGICAL LSCAL
220 TYPE (CMUMPS_ROOT_STRUC) :: root
221 INTEGER(8), INTENT(IN) :: LA
222 INTEGER(8), INTENT(INOUT) :: PTRAIW( N ), PTRARW( N )
223 INTEGER :: FRERE_STEPS( KEEP(28) )
224 INTEGER :: STEP(N)
225 INTEGER(8) :: LINTARR, LDBLARR
226 INTEGER :: INTARR( LINTARR )
227 COMPLEX :: DBLARR( LDBLARR )
228 COMPLEX :: A( LA )
229 INTEGER, DIMENSION(:,:), ALLOCATABLE :: BUFI
230 COMPLEX, DIMENSION(:,:), ALLOCATABLE :: BUFR
231 INTEGER MUMPS_PROCNODE, MUMPS_TYPENODE, numroc,
232 & MUMPS_TYPESPLIT
235 COMPLEX VAL, VAL_SHR
236 INTEGER IOLD,JOLD,ISEND,JSEND,DEST,I,IARR
237 INTEGER ISEND_SHR, JSEND_SHR, DEST_SHR
238 INTEGER IPOSROOT, JPOSROOT
239 INTEGER IROW_GRID, JCOL_GRID
240 INTEGER INODE, ISTEP
241 INTEGER NBUFS
242 INTEGER ARROW_ROOT, TAILLE
243 INTEGER LOCAL_M, LOCAL_N
244 INTEGER(8) :: PTR_ROOT
245 INTEGER TYPE_NODE, MASTER_NODE
246 LOGICAL I_AM_CAND_LOC, I_AM_SLAVE
247 INTEGER JARR, ILOCROOT, JLOCROOT
248 INTEGER allocok, INIV2, TYPESPLIT, T4MASTER
249 INTEGER(8) :: I1, IA, IS1, IAS, ISHIFT, K
250 INTEGER NCAND
251 LOGICAL T4_MASTER_CONCERNED, EARLYT3ROOTINS
252 COMPLEX ZERO
253 parameter( zero = (0.0e0,0.0e0) )
254 INTEGER, ALLOCATABLE, DIMENSION(:,:) :: IW4
255 LOGICAL :: DOIT, OMP_FLAG, OMP_FLAG_P
256 INTEGER NOMP, NOMP_P, IOMP, P2
257 arrow_root = 0
258 earlyt3rootins = keep(200) .EQ. 0
259 & .OR. (keep(200) .LT. 0 .AND. keep(400) .EQ. 0)
260 i_am_slave=(myid.NE.0.OR.keep(46).EQ.1)
261 IF ( keep(46) .eq. 0 ) THEN
262 nbufs = slavef
263 ELSE
264 nbufs = slavef - 1
265 ALLOCATE( iw4( n, 2 ), stat = allocok )
266 IF ( allocok .GT. 0 ) THEN
267 WRITE(*,*) 'Error allocating IW4'
268 CALL mumps_abort()
269 END IF
270#if defined(__ve__)
271!NEC$ IVDEP
272#endif
273 DO i = 1, n
274 i1 = ptraiw( i )
275 ia = ptrarw( i )
276 IF ( ia .GT. 0 ) THEN
277 dblarr( ia ) = zero
278 iw4( i, 1 ) = intarr( i1 )
279 iw4( i, 2 ) = -intarr( i1 + 1 )
280 intarr( i1 + 2 ) = i
281 END IF
282 END DO
283 IF ( keep(38) .NE. 0 .AND. earlyt3rootins ) THEN
284 CALL cmumps_get_root_info(root, local_m, local_n,
285 & ptr_root, la)
286 CALL cmumps_set_root_to_zero(root, keep, a, la)
287 ELSE
288 local_m = -19999; local_n = -29999; ptr_root = -99999_8
289 END IF
290 END IF
291 IF (nbufs.GT.0) THEN
292 ALLOCATE( bufi(nbrecords*2+1,nbufs),stat=allocok )
293 IF ( allocok .GT. 0 ) THEN
294 WRITE(*,*) 'Error allocating BUFI'
295 CALL mumps_abort()
296 END IF
297 ALLOCATE( bufr( nbrecords, nbufs ), stat=allocok )
298 IF ( allocok .GT. 0 ) THEN
299 WRITE(*,*) 'Error allocating BUFR'
300 CALL mumps_abort()
301 END IF
302 DO i = 1, nbufs
303 bufi( 1, i ) = 0
304 ENDDO
305 ENDIF
306 inode = keep(38)
307 i = 1
308 DO WHILE ( inode .GT. 0 )
309 rg2l( inode ) = i
310 inode = fils( inode )
311 i = i + 1
312 END DO
313 nomp = 1
314!$ NOMP=omp_get_max_threads()
315 omp_flag = keep(399).EQ.1 .AND. nomp.GE.2 .AND. slavef.EQ.1
316 & .AND. keep(46) .EQ. 1
317!$OMP PARALLEL PRIVATE(K, I, DEST, I_AM_CAND_LOC,
318!$OMP& T4MASTER, T4_MASTER_CONCERNED,
319!$OMP& INIV2, NCAND, IROW_GRID, JCOL_GRID,
320!$OMP& ILOCROOT, JLOCROOT, IPOSROOT, JPOSROOT,
321!$OMP& TYPE_NODE, TYPESPLIT, MASTER_NODE,
322!$OMP& IA, ISHIFT, IS1, IAS, TAILLE, VAL,
323!$OMP& IARR, JARR, ISTEP, ISEND, JSEND,
324!$OMP& IOLD, JOLD, IOMP, DOIT, P2, NOMP_P, OMP_FLAG_P)
325!$OMP& REDUCTION(+: ARROW_ROOT) IF (OMP_FLAG)
326 iomp=0
327!$ IOMP=omp_get_thread_num()
328 nomp_p=1
329!$ NOMP_P=omp_get_num_threads()
330 omp_flag_p = .false.
331!$ OMP_FLAG_P = OMP_FLAG .AND. NOMP_P .GT. 1
332 IF (omp_flag_p) THEN
333 IF ( nomp_p .GE. 16 ) THEN
334 nomp_p=16
335 p2 = 4
336 ELSE IF (nomp_p.GE.8) THEN
337 nomp_p=8
338 p2 = 3
339 ELSE IF (nomp_p.GE.4) THEN
340 nomp_p=4
341 p2 = 2
342 ELSE IF (nomp_p.GE.2) THEN
343 nomp_p=2
344 p2 = 1
345 ENDIF
346 ELSE
347 nomp_p = 1
348 p2 = 0
349 ENDIF
350 IF ( iomp .LT. nomp_p ) THEN
351 DO k=1, nz
352 iold = irn(k)
353 jold = icn(k)
354 IF ( (iold.GT.n).OR.(jold.GT.n).OR.(iold.LT.1)
355 & .OR.(jold.LT.1) ) THEN
356 cycle
357 END IF
358 IF (omp_flag_p) THEN
359 IF (iold.EQ.jold) THEN
360 iarr = iold
361 ELSE IF (perm(iold).LT.perm(jold)) THEN
362 iarr = iold
363 ELSE
364 iarr = jold
365 ENDIF
366 doit = ( iomp .EQ. ibits(iarr, p2-1, p2))
367 ELSE
368 doit = .true.
369 ENDIF
370 IF (doit) THEN
371 IF (iold.EQ.jold) THEN
372 isend = iold
373 jsend = jold
374 iarr = iold
375 ELSE IF (perm(iold).LT.perm(jold)) THEN
376 iarr = iold
377 IF ( keep(50) .NE. 0 ) THEN
378 isend = -iold
379 ELSE
380 isend = iold
381 ENDIF
382 jsend = jold
383 ELSE
384 iarr = jold
385 isend = -jold
386 jsend = iold
387 ENDIF
388 istep = abs( step(iarr) )
389 CALL mumps_typeandprocnode( type_node, master_node,
390 & procnode_steps(istep), keep(199) )
391 i_am_cand_loc = .false.
392 t4_master_concerned = .false.
393 t4master = -9999
394 IF ( type_node .EQ. 1 ) THEN
395 IF ( keep(46) .eq. 0 ) THEN
396 dest = master_node + 1
397 ELSE
398 dest = master_node
399 END IF
400 ELSE IF ( type_node .EQ. 2 ) THEN
401 IF ( isend .LT. 0 ) THEN
402 dest = -1
403 ELSE
404 IF ( keep( 46 ) .eq. 0 ) THEN
405 dest = master_node + 1
406 ELSE
407 dest = master_node
408 END IF
409 END IF
410 iniv2 = istep_to_iniv2(istep)
411 IF (i_am_slave) i_am_cand_loc = i_am_cand(iniv2)
412 IF ( keep(79) .GT. 0) THEN
413 typesplit = mumps_typesplit( procnode_steps(istep),
414 & keep(199) )
415 IF ( (typesplit.EQ.5).OR.(typesplit.EQ.6)) THEN
416 t4_master_concerned = .true.
417 t4master=candidates(candidates(slavef+1,iniv2)+1,iniv2)
418 IF ( keep(46) .eq. 0 ) THEN
419 t4master=t4master+1
420 ENDIF
421 ENDIF
422 ENDIF
423 ELSE
424 arrow_root = arrow_root + 1
425 IF (earlyt3rootins) THEN
426 IF ( isend .LT. 0 ) THEN
427 iposroot = rg2l(jsend)
428 jposroot = rg2l(iarr)
429 ELSE
430 iposroot = rg2l( iarr )
431 jposroot = rg2l( jsend )
432 END IF
433 irow_grid = mod( ( iposroot-1 )/root%MBLOCK, root%NPROW )
434 jcol_grid = mod( ( jposroot-1 )/root%NBLOCK, root%NPCOL )
435 IF ( keep( 46 ) .eq. 0 ) THEN
436 dest = irow_grid * root%NPCOL + jcol_grid + 1
437 ELSE
438 dest = irow_grid * root%NPCOL + jcol_grid
439 END IF
440 ELSE
441 dest = -2
442 ENDIF
443 END IF
444 IF (lscal) THEN
445 val = aspk(k)*rowsca(iold)*colsca(jold)
446 ELSE
447 val = aspk(k)
448 ENDIF
449 IF ( dest .eq. 0
450 & .or.
451 & ( dest .eq. -1 .and. keep( 46 ) .eq. 1 .AND.
452 & ( i_am_cand_loc .OR. master_node .EQ. 0 ) )
453 & .or.
454 & ( t4master.EQ.0 )
455 & .or.
456 & ( dest .EQ. -2 .AND. keep( 46 ) .EQ. 1 )
457 & ) THEN
458 iarr = isend
459 jarr = jsend
460 IF ( type_node .eq. 3 .AND. earlyt3rootins ) THEN
461 IF ( irow_grid .EQ. root%MYROW .AND.
462 & jcol_grid .EQ. root%MYCOL ) THEN
463 ilocroot = root%MBLOCK * ( ( iposroot - 1 ) /
464 & ( root%MBLOCK * root%NPROW ) )
465 & + mod( iposroot - 1, root%MBLOCK ) + 1
466 jlocroot = root%NBLOCK * ( ( jposroot - 1 ) /
467 & ( root%NBLOCK * root%NPCOL ) )
468 & + mod( jposroot - 1, root%NBLOCK ) + 1
469 IF (keep(60)==0) THEN
470 a( ptr_root
471 & + int(jlocroot - 1,8) * int(local_m,8)
472 & + int(ilocroot - 1,8) )
473 & = a( ptr_root
474 & + int(jlocroot - 1,8) * int(local_m,8)
475 & + int(ilocroot - 1,8) )
476 & + val
477 ELSE
478 root%SCHUR_POINTER( int(jlocroot - 1,8)
479 & * int(root%SCHUR_LLD,8)
480 & + int(ilocroot,8) )
481 & = root%SCHUR_POINTER( int(jlocroot - 1,8)
482 & * int(root%SCHUR_LLD,8)
483 & + int(ilocroot,8))
484 & + val
485 ENDIF
486 ELSE
487 WRITE(*,*) myid,':INTERNAL Error: root arrowhead '
488 WRITE(*,*) myid,':is not belonging to me. IARR,JARR='
489 & ,iarr,jarr
490 CALL mumps_abort()
491 END IF
492 ELSE IF ( iarr .GE. 0 ) THEN
493 IF ( iarr .eq. jarr ) THEN
494 ia = ptrarw( iarr )
495 dblarr( ia ) = dblarr( ia ) + val
496 ELSE
497 is1 = ptraiw(iarr)
498 ishift = int(intarr(is1) + iw4(iarr,2),8)
499 iw4(iarr,2) = iw4(iarr,2) - 1
500 intarr(is1 + ishift + 2_8) = jarr
501 dblarr(ptrarw(iarr)+ishift) = val
502 END IF
503 ELSE
504 iarr = -iarr
505 ishift = int(ptraiw(iarr)+iw4(iarr,1)+2,8)
506 intarr(ishift) = jarr
507 ias = ptrarw(iarr)+int(iw4(iarr,1),8)
508 iw4(iarr,1) = iw4(iarr,1) - 1
509 dblarr(ias) = val
510 IF ( iw4(iarr,1) .EQ. 0 .AND.
511 & step( iarr) > 0 ) THEN
512 IF ( master_node == myid) THEN
513 taille = intarr( ptraiw(iarr) )
514 CALL cmumps_quick_sort_arrowheads( n, perm,
515 & intarr( ptraiw(iarr) + 3 ),
516 & dblarr( ptrarw(iarr) + 1 ),
517 & taille, 1, taille )
518 END IF
519 END IF
520 END IF
521 END IF
522 IF ( dest.EQ. -1 ) THEN
523 iniv2 = istep_to_iniv2(istep)
524 ncand = candidates(slavef+1,iniv2)
525 IF (keep(79).GT.0) THEN
526 DO i=1, slavef
527 dest=candidates(i,iniv2)
528 IF (keep(46).EQ.0.AND.(dest.GE.0)) dest=dest+1
529 IF (dest.LT.0) EXIT
530 IF (i.EQ.ncand+1) cycle
531 IF (dest.NE.0) THEN
532 isend_shr=isend; jsend_shr=jsend
533 val_shr=val; dest_shr=dest
535 ENDIF
536 ENDDO
537 ELSE
538 DO i=1, ncand
539 dest=candidates(i,iniv2)
540 IF (keep(46).EQ.0) dest=dest+1
541 IF (dest.NE.0) THEN
542 isend_shr=isend; jsend_shr=jsend
543 val_shr=val; dest_shr=dest
545 ENDIF
546 ENDDO
547 ENDIF
548 dest = master_node
549 IF (keep(46).EQ.0) dest=dest+1
550 IF ( dest .NE. 0 ) THEN
551 isend_shr=isend; jsend_shr=jsend
552 val_shr=val; dest_shr=dest
554 ENDIF
555 IF ((t4_master_concerned).AND.(t4master.GT.0)) THEN
556 isend_shr=isend; jsend_shr=jsend
557 val_shr=val; dest_shr=t4master
559 ENDIF
560 ELSE IF ( dest .GT. 0 ) THEN
561 isend_shr=isend; jsend_shr=jsend
562 val_shr=val; dest_shr=dest
564 IF ( t4master.GT.0 ) THEN
565 isend_shr=isend; jsend_shr=jsend
566 val_shr=val; dest_shr=t4master
568 ENDIF
569 ELSE IF ( t4master.GT.0 ) THEN
570 isend_shr=isend; jsend_shr=jsend
571 val_shr=val; dest_shr=t4master
573 ELSE IF ( dest .EQ. -2 ) THEN
574 DO i = 0, slavef-1
575 dest = i
576 IF (keep(46) .EQ. 0) dest = dest + 1
577 IF (dest .NE. 0) THEN
578 isend_shr=isend; jsend_shr=jsend
579 val_shr=val; dest_shr=dest
581 ENDIF
582 ENDDO
583 ENDIF
584 ENDIF
585 ENDDO
586 ENDIF
587!$OMP END PARALLEL
588 keep(49) = arrow_root
589 IF (nbufs.GT.0) THEN
591 & bufi, bufr, nbrecords, nbufs,
592 & lp, comm, keep( 46 ) )
593 ENDIF
594 IF ( keep( 46 ) .NE. 0 ) DEALLOCATE( iw4 )
595 IF (nbufs.GT.0) THEN
596 DEALLOCATE( bufi )
597 DEALLOCATE( bufr )
598 ENDIF
599 RETURN
600 CONTAINS
601 SUBROUTINE cmumps_arrow_fill_send_buf()
602 IMPLICIT NONE
603 include 'mpif.h'
604 include 'mumps_tags.h'
605 INTEGER IERR
606 INTEGER TAILLE_SENDI, TAILLE_SENDR, IREQ
607 IF (bufi(1,dest_shr)+1.GT.nbrecords) THEN
608 taille_sendi = bufi(1,dest_shr) * 2 + 1
609 taille_sendr = bufi(1,dest_shr)
610 CALL mpi_send(bufi(1,dest_shr),taille_sendi,
611 & mpi_integer,
612 & dest_shr, arrowhead, comm, ierr )
613 CALL mpi_send( bufr(1,dest_shr), taille_sendr,
614 & mpi_complex, dest_shr,
615 & arrowhead, comm, ierr )
616 bufi(1,dest_shr) = 0
617 ENDIF
618 ireq = bufi(1,dest_shr) + 1
619 bufi(1,dest_shr) = ireq
620 bufi( ireq * 2, dest_shr ) = isend_shr
621 bufi( ireq * 2 + 1, dest_shr ) = jsend_shr
622 bufr( ireq, dest_shr ) = val_shr
623 RETURN
624 END SUBROUTINE cmumps_arrow_fill_send_buf
subroutine cmumps_arrow_finish_send_buf(bufi, bufr, nbrecords, nbufs, lp, comm, type_parall)
subroutine cmumps_arrow_fill_send_buf()
subroutine mumps_typeandprocnode(tpn, mumps_procnode, procinfo_inode, k199)

◆ cmumps_get_root_info()

subroutine cmumps_get_root_info ( type (cmumps_root_struc), intent(in) root,
integer, intent(out) local_m,
integer, intent(out) local_n,
integer(8), intent(out) ptr_root,
integer(8), intent(in) la )

Definition at line 969 of file carrowheads.F.

971 USE cmumps_struc_def, ONLY : cmumps_root_struc
972 IMPLICIT NONE
973 TYPE (CMUMPS_ROOT_STRUC), INTENT(IN) :: root
974 INTEGER, INTENT(OUT) :: LOCAL_M, LOCAL_N
975 INTEGER(8), INTENT(OUT) :: PTR_ROOT
976 INTEGER(8), INTENT(IN) :: LA
977 INTEGER, EXTERNAL :: numroc
978 local_m = numroc( root%ROOT_SIZE, root%MBLOCK,
979 & root%MYROW, 0, root%NPROW )
980 local_m = max( 1, local_m )
981 local_n = numroc( root%ROOT_SIZE, root%NBLOCK,
982 & root%MYCOL, 0, root%NPCOL )
983 ptr_root = la - int(local_m,8) * int(local_n,8) + 1_8
984 RETURN
#define max(a, b)
Definition macros.h:21

◆ cmumps_quick_sort_arrowheads()

recursive subroutine cmumps_quick_sort_arrowheads ( integer n,
integer, dimension( n ) perm,
integer, dimension( taille ) intlist,
complex, dimension( taille ) dbllist,
integer taille,
integer lo,
integer hi )

Definition at line 684 of file carrowheads.F.

686 IMPLICIT NONE
687 INTEGER N, TAILLE
688 INTEGER PERM( N )
689 INTEGER INTLIST( TAILLE )
690 COMPLEX DBLLIST( TAILLE )
691 INTEGER LO, HI
692 INTEGER I,J
693 INTEGER ISWAP, PIVOT
694 COMPLEX cswap
695 i = lo
696 j = hi
697 pivot = perm(intlist((i+j)/2))
698 10 IF (perm(intlist(i)) < pivot) THEN
699 i=i+1
700 GOTO 10
701 ENDIF
702 20 IF (perm(intlist(j)) > pivot) THEN
703 j=j-1
704 GOTO 20
705 ENDIF
706 IF (i < j) THEN
707 iswap = intlist(i)
708 intlist(i) = intlist(j)
709 intlist(j)=iswap
710 cswap = dbllist(i)
711 dbllist(i) = dbllist(j)
712 dbllist(j) = cswap
713 ENDIF
714 IF ( i <= j) THEN
715 i = i+1
716 j = j-1
717 ENDIF
718 IF ( i <= j ) GOTO 10
719 IF ( lo < j ) CALL cmumps_quick_sort_arrowheads(n, perm,
720 & intlist, dbllist, taille, lo, j)
721 IF ( i < hi ) CALL cmumps_quick_sort_arrowheads(n, perm,
722 & intlist, dbllist, taille, i, hi)
723 RETURN
subroutine cswap(n, cx, incx, cy, incy)
CSWAP
Definition cswap.f:81

◆ cmumps_set_root_to_zero()

subroutine cmumps_set_root_to_zero ( type (cmumps_root_struc) root,
integer, dimension(500) keep,
complex, dimension(la), intent(inout) a,
integer(8), intent(in) la )

Definition at line 947 of file carrowheads.F.

948 USE cmumps_struc_def, ONLY : cmumps_root_struc
949 IMPLICIT NONE
950 INTEGER(8), INTENT(IN) :: LA
951 COMPLEX, INTENT(INOUT) :: A(LA)
952 INTEGER :: KEEP(500)
953 TYPE (CMUMPS_ROOT_STRUC) :: root
954 INTEGER :: LOCAL_M, LOCAL_N
955 INTEGER(8) :: PTR_ROOT
956 IF (keep(60)==0) THEN
957 CALL cmumps_get_root_info(root, local_m, local_n, ptr_root, la)
958 IF (local_n .GT. 0) THEN
959 CALL cmumps_set_to_zero(a(ptr_root),
960 & local_m, local_m, local_n, keep)
961 ENDIF
962 ELSE IF (root%yes) THEN
963 CALL cmumps_set_to_zero(root%SCHUR_POINTER(1),
964 & root%SCHUR_LLD, root%SCHUR_MLOC, root%SCHUR_NLOC,
965 & keep)
966 ENDIF
967 RETURN
subroutine cmumps_set_to_zero(a, lld, m, n, keep)

◆ cmumps_set_to_zero()

subroutine cmumps_set_to_zero ( complex, dimension(int(lld,8)*int(n-1,8)+int(m,8)) a,
integer, intent(in) lld,
integer, intent(in) m,
integer, intent(in) n,
integer, dimension(500) keep )

Definition at line 915 of file carrowheads.F.

916!$ USE OMP_LIB, ONLY : OMP_GET_MAX_THREADS
917 IMPLICIT NONE
918 INTEGER, INTENT(IN) :: LLD, M, N
919 COMPLEX :: A(int(LLD,8)*int(N-1,8)+int(M,8))
920 INTEGER :: KEEP(500)
921 COMPLEX, PARAMETER :: ZERO = (0.0e0,0.0e0)
922 INTEGER I, J
923!$ INTEGER :: NOMP
924 INTEGER(8) :: I8, LA
925!$ NOMP = OMP_GET_MAX_THREADS()
926 IF (lld .EQ. m) THEN
927 la=int(lld,8)*int(n-1,8)+int(m,8)
928!$OMP PARALLEL DO PRIVATE(I8) SCHEDULE(STATIC,KEEP(361))
929!$OMP& IF ( LA > int(KEEP(361),8) .AND. NOMP .GT. 1)
930 DO i8=1, la
931 a(i8) = zero
932 ENDDO
933!$omp END PARALLEL do
934 ELSE
935!$OMP PARALLEL DO PRIVATE(I,J) COLLAPSE(2)
936!$OMP& SCHEDULE(STATIC,KEEP(361)) IF (int(M,8)*int(N,8)
937!$OMP& .GT. KEEP(361).AND. NOMP .GT.1)
938 DO i = 1, n
939 DO j = 1, m
940 a( int(i-1,8)*int(lld,8)+ int(j,8) ) = zero
941 ENDDO
942 ENDDO
943!$OMP END PARALLEL DO
944 ENDIF
945 RETURN