16 COMPLEX(kind=8),
intent(in) :: PIV
17 COMPLEX(kind=8),
intent(inout) :: DETER
18 INTEGER,
intent(inout) :: NEXP
19 DOUBLE PRECISION R_PART, C_PART
24 nexp_loc = exponent(abs(r_part)+abs(c_part))
25 nexp = nexp + nexp_loc
26 r_part=scale(r_part, -nexp_loc)
27 c_part=scale(c_part, -nexp_loc)
28 deter=
cmplx(r_part,c_part,kind=kind(deter))
33 DOUBLE PRECISION,
intent(in) :: PIV
34 DOUBLE PRECISION,
intent(inout) :: DETER
35 INTEGER,
intent(inout) :: NEXP
36 deter=deter*fraction(piv)
37 nexp=nexp+exponent(piv)+exponent(deter)
42 & MYROW, MYCOL, NPROW, NPCOL,
43 & A, LOCAL_M, LOCAL_N, N, MYID,
46 INTEGER,
intent (in) :: SYM
47 INTEGER,
intent (inout) :: NEXP
48 COMPLEX(kind=8),
intent (inout) :: DETER
49 INTEGER,
intent (in) :: BLOCK_SIZE, NPROW, NPCOL,
51 INTEGER,
intent (in) :: MYROW, MYCOL, , IPIV(LOCAL_M)
52 COMPLEX(kind=8),
intent(in) :: A(*)
53 INTEGER I,IMX,DI,NBLOCK,IBLOCK,ILOC,JLOC,
54 & row_proc,col_proc, k
56 nblock = ( n - 1 ) / block_size
58 row_proc = mod( iblock, nprow )
59 IF ( myrow.EQ.row_proc )
THEN
60 col_proc = mod( iblock, npcol )
61 IF ( mycol.EQ.col_proc )
THEN
62 iloc = ( iblock / nprow ) * block_size
63 jloc = ( iblock / npcol ) * block_size
64 i = iloc + jloc * local_m + 1
65 imx =
min(iloc+block_size,local_m)
66 & + (
min(jloc+block_size,local_n)-1)*local_m
69 DO WHILE ( i .LT. imx )
75 IF (ipiv(iloc+k) .NE. iblock*block_size+k)
THEN
88 & COMM, DETER_IN, NEXP_IN,
89 & DETER_OUT, NEXP_OUT, NPROCS)
91 INTEGER,
intent(in) :: COMM, NPROCS
92 COMPLEX(kind=8),
intent(in) :: DETER_IN
93 INTEGER,
intent(in) :: NEXP_IN
94 COMPLEX(kind=8),
intent(out):: DETER_OUT
95 INTEGER,
intent(out):: NEXP_OUT
98 INTEGER TWO_SCALARS_TYPE, DETERREDUCE_OP
99 COMPLEX(kind=8) :: INV(2)
100 COMPLEX(kind=8) :: OUTV(2)
102 IF (nprocs .EQ. 1)
THEN
116 inv(2)=
cmplx(nexp_in,kind=kind(inv))
118 & deterreduce_op, comm, ierr_mpi)
122 nexp_out = int(outv(2))
127#if defined(WORKAROUNDINTELILP64MPI2INTEGER) || defined(WORKAROUNDILP64MPICUSTOMREDUCE)
128 INTEGER(4),
INTENT(IN) :: NEL, DATATYPE
130 INTEGER,
INTENT(IN) :: NEL, DATATYPE
132 COMPLEX(kind=8),
INTENT(IN) :: INV ( 2 * NEL )
133 COMPLEX(kind=8),
INTENT(INOUT) :: INOUTV ( 2 * NEL )
134 INTEGER I, TMPEXPIN, TMPEXPINOUT
136 tmpexpin = int(inv(i*2))
137 tmpexpinout = int(inoutv(i*2))
141 tmpexpinout = tmpexpinout + tmpexpin
142 inoutv(i*2) =
cmplx(tmpexpinout,kind=kind(inoutv))
148 INTEGER,
intent (inout) :: NEXP
149 COMPLEX(kind=8),
intent (inout) :: DETER
156 INTEGER,
intent (inout) :: NEXP
157 DOUBLE PRECISION,
intent (inout) :: DETER
164 COMPLEX(kind=8),
intent(inout) :: DETER
165 INTEGER,
intent(in) :: N
166 INTEGER,
intent(inout) :: VISITED(N)
167 INTEGER,
intent(in) :: PERM(N)
171 IF (visited(i) .GT. n)
THEN
172 visited(i)=visited(i)-n-n-1
177 visited(j) = visited(j) + n + n + 1
182 IF (mod(k,2).EQ.1)
THEN
189 & MYROW, MYCOL, NPROW, NPCOL,
190 & A, LOCAL_M, LOCAL_N, N, MYID,
195 INTEGER,
intent (in) :: BLOCK_SIZE, NPROW, ,
196 & local_m, local_n, n, sym
197 INTEGER,
intent (in) :: MYROW, MYCOL, MYID, IPIV(LOCAL_M)
198 COMPLEX(kind=8),
intent(in) :: A(*)
199 DOUBLE PRECISION,
INTENT(INOUT) :: DKEEP(230)
200 INTEGER,
INTENT(IN) :: KEEP(500)
201 INTEGER I,IMX,DI,NBLOCK,IBLOCK,ILOC,,
202 & ROW_PROC,COL_PROC, K
203 DOUBLE PRECISION :: ABSPIVOT
205 nblock = ( n - 1 ) / block_size
206 DO iblock = 0, nblock
207 row_proc = mod( iblock, nprow )
208 IF ( myrow.EQ.row_proc )
THEN
209 col_proc = mod( iblock, npcol )
210 IF ( mycol.EQ.col_proc )
THEN
211 iloc = ( iblock / nprow ) * block_size
212 jloc = ( iblock / npcol ) * block_size
213 i = iloc + jloc * local_m + 1
214 imx =
min(iloc+block_size,local_m)
215 & + (
min(jloc+block_size,local_n)-1)*local_m
218 DO WHILE ( i .LT. imx )
222 abspivot = abs(a(i)*a(i))
226 & dkeep, keep, .false.)
subroutine mpi_type_free(newtyp, ierr_mpi)
subroutine mpi_type_contiguous(length, datatype, newtype, ierr_mpi)
subroutine mpi_allreduce(sendbuf, recvbuf, cnt, datatype, operation, comm, ierr)
subroutine mpi_type_commit(newtyp, ierr_mpi)
subroutine mpi_op_create(func, commute, op, ierr)
subroutine mpi_op_free(op, ierr)
subroutine zmumps_update_minmax_pivot(diag, dkeep, keep, nullpivot)
subroutine zmumps_getdeter2d(block_size, ipiv, myrow, mycol, nprow, npcol, a, local_m, local_n, n, myid, deter, nexp, sym)
subroutine zmumps_par_root_minmax_piv_upd(block_size, ipiv, myrow, mycol, nprow, npcol, a, local_m, local_n, n, myid, dkeep, keep, sym)
subroutine zmumps_deter_square(deter, nexp)
subroutine zmumps_updatedeter(piv, deter, nexp)
subroutine zmumps_deter_sign_perm(deter, n, visited, perm)
subroutine zmumps_deterreduce_func(inv, inoutv, nel, datatype)
subroutine zmumps_deter_reduction(comm, deter_in, nexp_in, deter_out, nexp_out, nprocs)
subroutine zmumps_deter_scaling_inverse(deter, nexp)
subroutine zmumps_updatedeter_scaling(piv, deter, nexp)