33 IMPLICIT NONE
34 INTEGER SIZEDIAG_ORIG
35 DOUBLE PRECISION DIAG_ORIG(SIZEDIAG_ORIG)
36 DOUBLE PRECISION GW_FACTCUMUL
37 INTEGER NFRONT,NASS,N,LIW,INODE,IFLAG,INOPV
38 INTEGER NASS2, IBEG_BLOCK_TO_SEND, IBEG_BLOCK, IEND_BLOCK
39 INTEGER, intent(inout) :: NNEGW, NB22T2W, NBTINYW
40 INTEGER, intent(inout) :: DET_EXPW, DET_SIGNW
41 DOUBLE PRECISION, intent(inout) :: DET_MANTW
42 INTEGER TIPIV( NASS2 )
43 INTEGER PIVSIZ,LPIV
44 INTEGER, intent(in) :: PIVOT_OPTION, IEND_BLR
45 LOGICAL, intent(in) :: LR_ACTIVATED
46 INTEGER, intent(inout) :: Inextpiv
47 LOGICAL, intent(in) :: OOC_EFFECTIVE_ON_FRONT
48 INTEGER(8) :: LA
49 DOUBLE PRECISION A(LA)
50 DOUBLE PRECISION UU, UULOC, SEUIL
51 DOUBLE PRECISION CSEUIL
52 INTEGER IW(LIW)
53 INTEGER IOLDPS
54 INTEGER(8) :: POSELT
55 INTEGER KEEP(500)
56 INTEGER(8) KEEP8(150)
57 INTEGER LPN_LIST
58 INTEGER PIVNUL_LIST(LPN_LIST)
59 DOUBLE PRECISION DKEEP(230)
60 INTEGER PP_FIRST2SWAP_L, PP_LastPanelonDisk
61 INTEGER PP_LastPIVRPTRIndexFilled
62 include 'mpif.h'
63 INTEGER(8) :: POSPV1,POSPV2,OFFDAG,APOSJ
64 INTEGER JMAX
65 INTEGER :: IPIVNUL, HF
66 DOUBLE PRECISION RMAX,AMAX,TMAX,RMAX_NORELAX,MAX_PREV_in_PARPIV
67 DOUBLE PRECISION MAXPIV, ABS_PIVOT
68 DOUBLE PRECISION RMAX_NOSLAVE, TMAX_NOSLAVE
69 DOUBLE PRECISION PIVOT,DETPIV
70 DOUBLE PRECISION ABSDETPIV
71 include 'mumps_headers.h'
72 INTEGER(8) :: APOSMAX, APOSROW
73 INTEGER(8) :: APOS
74 INTEGER(8) :: J1, J2, JJ, KK
75 DOUBLE PRECISION :: GROWTH, RSWOP
76 DOUBLE PRECISION :: UULOCM1
77 INTEGER :: LDAFS
78 INTEGER(8) :: LDAFS8
79 DOUBLE PRECISION, PARAMETER :: RZERO = 0.0d0
80 DOUBLE PRECISION, PARAMETER :: RONE = 1.0d0
81 DOUBLE PRECISION ZERO, ONE
82 parameter( zero = 0.0d0 )
83 parameter( one = 1.0d0 )
84 DOUBLE PRECISION PIVNUL, VALTMP
85 DOUBLE PRECISION FIXA
86 INTEGER NPIV,IPIV,K219
87 INTEGER NPIVP1,ILOC,K,J
88 INTEGER ISHIFT, K206, IPIV_END, IPIV_SHIFT
90 INTEGER I_PIVRPTR, I_PIVR, NBPANELS_L
91 DOUBLE PRECISION GW_FACT
92 gw_fact = rone
93 amax = rzero
94 rmax = rzero
95 tmax = rzero
96 rmax_noslave = rzero
97 pivot = one
98 hf = 6 + iw(ioldps+5+keep(ixsz)) + keep(ixsz)
99 k206 = keep(206)
100 pivnul = dkeep(1)
101 fixa = dkeep(2)
102 cseuil = seuil
103 ldafs = nass
104 ldafs8 = int(ldafs,8)
105 IF ((keep(50).NE.1) .AND. ooc_effective_on_front) THEN
107 & i_pivrptr, i_pivr,
108 & ioldps+2*nfront+6+iw(ioldps+5+keep(ixsz))
109 & +keep(ixsz),
110 & iw, liw)
111 ENDIF
112 uuloc = uu
113 k219 = keep(219)
114 IF (uuloc.GT.rzero) THEN
115 uulocm1 = rone/uuloc
116 ELSE
117 k219=0
118 uulocm1 = rone
119 ENDIF
120 IF (k219.LT.2) gw_factcumul = rone
121 pivsiz = 1
122 npiv = iw(ioldps+1+keep(ixsz))
123 npivp1 = npiv + 1
124 iloc = npivp1 - ibeg_block_to_send + 1
125 tipiv( iloc ) = iloc
126 aposmax = poselt+ldafs8*ldafs8-1_8
127 IF(inopv .EQ. -1) THEN
128 apos = poselt + ldafs8*int(npivp1-1,8) + int(npiv,8)
129 pospv1 = apos
130 abs_pivot = abs(pivot)
132 & ( abs_pivot,
133 & dkeep, keep, .true.)
134 IF(abs_pivot.LT.seuil) THEN
135 IF(dble(a(apos)) .GE. rzero) THEN
136 a(apos) = cseuil
137 ELSE
138 a(apos) = -cseuil
139 nnegw = nnegw+1
140 ENDIF
141 nbtinyw = nbtinyw + 1
142 ELSE IF (keep(258) .NE.0 ) THEN
144 ENDIF
145 IF ((keep(50).NE.1) .AND. ooc_effective_on_front) THEN
147 & iw(i_pivr), nass, npivp1, npivp1,
148 & pp_lastpanelondisk,
149 & pp_lastpivrptrindexfilled)
150 ENDIF
151 GO TO 420
152 ENDIF
153 inopv = 0
154 IF ((k219.GE.2).AND.(npivp1.EQ.1)) THEN
155 gw_factcumul = rone
156 IF (k219.EQ.3) THEN
157 DO ipiv=1,nass
158 diag_orig(ipiv) = abs(a(poselt +
159 & (ldafs8+1_8)*int(ipiv-1,8)))
160 ENDDO
161 ELSE IF (k219.GE.4) THEN
162 diag_orig = rzero
163 DO ipiv=1,nass
164 apos = poselt + ldafs8*int(ipiv-1,8)
165 pospv1 = apos + int(ipiv - 1,8)
166 diag_orig(ipiv) =
max( abs(a(pospv1)), diag_orig(ipiv) )
167 DO j=ipiv+1,nass
168 diag_orig(ipiv) =
max( abs(a(pospv1)), diag_orig(ipiv) )
169 diag_orig(ipiv+j-ipiv) =
max( abs(a(pospv1)),
170 & diag_orig(ipiv+j-ipiv) )
171 pospv1 = pospv1 + ldafs8
172 ENDDO
173 ENDDO
174 ENDIF
175 ENDIF
176 ishift = 0
177 ipiv_end = iend_block
178 IF (k206.GE.1) THEN
179 IF (inextpiv.GT.npivp1.AND.inextpiv.LE.iend_block) THEN
180 ishift = inextpiv - npivp1
181 ENDIF
182 IF ( k206.EQ.1
183 & .OR. (k206 .GT.1 .AND. iend_block.EQ.iend_blr) ) THEN
184 ipiv_end = iend_block + ishift
185 ENDIF
186 ENDIF
187 DO 460 ipiv_shift = npivp1+ishift, ipiv_end
188 IF (ipiv_shift .LE. iend_block) THEN
189 ipiv=ipiv_shift
190 ELSE
191 ipiv = ipiv_shift-iend_block-1+npivp1
192 IF (ibeg_block.EQ.npivp1) THEN
193 EXIT
194 ENDIF
195 ENDIF
196 apos = poselt + ldafs8*int(ipiv-1,8) + int(npiv,8)
197 pospv1 = apos + int(ipiv - npivp1,8)
198 pivot = a(pospv1)
199 abs_pivot = abs(pivot)
200 IF (uuloc.EQ.rzero.OR.pivot_option.EQ.0) THEN
201 IF(abs_pivot.LT.seuil) THEN
203 & ( abs_pivot,
204 & dkeep, keep, .true.)
205 IF(dble(pivot) .GE. rzero) THEN
206 a(pospv1) = cseuil
207 ELSE
208 a(pospv1) = -cseuil
209 nnegw = nnegw+1
210 ENDIF
211 nbtinyw = nbtinyw + 1
212 ELSE IF (abs_pivot.EQ.rzero) THEN
213 GO TO 630
214 ELSE
215 IF (pivot.LT.rzero) nnegw = nnegw+1
217 & ( abs_pivot, dkeep, keep, .false.)
218 IF (keep(258) .NE. 0) THEN
220 ENDIF
221 ENDIF
222 GO TO 420
223 ENDIF
224 amax = -rone
225 jmax = 0
226 j1 = apos
227 j2 = pospv1 - 1_8
228 DO jj=j1,j2
229 IF(abs(a(jj)) .GT. amax) THEN
230 amax = abs(a(jj))
231 jmax = ipiv - int(pospv1-jj)
232 ENDIF
233 ENDDO
234 j1 = pospv1 + ldafs8
235 DO j=1, iend_block - ipiv
236 IF(abs(a(j1)) .GT. amax) THEN
237 amax = abs(a(j1))
238 jmax = ipiv + j
239 ENDIF
240 j1 = j1 + ldafs8
241 ENDDO
242 rmax_noslave = rzero
243 IF (pivot_option.EQ.2) THEN
244 DO j=1,nass - iend_block
245 rmax_noslave =
max(abs(a(j1+ldafs8*int(j-1,8))),
246 & rmax_noslave)
247 ENDDO
248 ENDIF
249 IF (k219.NE.0) THEN
250 rmax_norelax = dble(a(aposmax+int(ipiv,8)))
251 rmax = rmax_norelax
252 IF (k219.GE.2) THEN
253 IF (abs_pivot.NE.rzero.AND.
254 & abs_pivot.GE.uuloc*
max(rmax,rmax_noslave,amax))
255 & THEN
256 growth = rone
257 IF (k219.EQ.3) THEN
258 IF (diag_orig(ipiv).EQ.rzero) THEN
259 diag_orig(ipiv) = abs_pivot
260 ELSE
261 growth = abs_pivot / diag_orig(ipiv)
262 ENDIF
263 ELSE IF (k219.GE.4) THEN
264 IF (diag_orig(ipiv).EQ.rzero) THEN
265 diag_orig(ipiv) =
max(amax,rmax_noslave)
266 ELSE
267 growth =
max(abs_pivot,amax,rmax_noslave)/
268 & diag_orig(ipiv)
269 ENDIF
270 ENDIF
271 rmax = rmax*
max(growth,gw_factcumul)
272 ENDIF
273 ENDIF
274 ELSE
275 rmax = rzero
276 rmax_norelax = rzero
277 ENDIF
278 rmax_noslave =
max(rmax_norelax,rmax_noslave)
279 rmax =
max(rmax,rmax_noslave)
280 IF (
max(amax,rmax,abs_pivot).LE.pivnul)
THEN
281 IF ((k219.NE.0)
282 & .AND.(k219.NE.-1)
283 & .AND.(rmax_norelax.LT.0)
284 & .AND.(ipiv.GT.1)) THEN
285 max_prev_in_parpiv = rzero
286 DO jj=1,ipiv-1
287 max_prev_in_parpiv=
max( max_prev_in_parpiv,
288 & dble(a(aposmax+int(jj,8))) )
289 ENDDO
290 IF (max_prev_in_parpiv.GT.pivnul) THEN
291 aposrow = poselt + ldafs8*int(ipiv-1,8)
292 DO jj=1,ipiv-1
293 IF (abs(a(aposrow+jj-1)).GT.pivnul) THEN
294 GOTO 460
295 ENDIF
296 ENDDO
297 ENDIF
298 ENDIF
300 & ( abs(a(pospv1)), dkeep, keep, .true.)
301 keep(109) = keep(109) + 1
302 ipivnul = keep(109)
303 pivnul_list(ipivnul) = iw( ioldps+hf+npiv+ipiv-npivp1 )
304 IF (dble(fixa).GT.rzero) THEN
305 IF(dble(pivot) .GE. rzero) THEN
306 a(pospv1) = fixa
307 ELSE
308 a(pospv1) = -fixa
309 ENDIF
310 ELSE
311 j1 = apos
312 j2 = pospv1 - 1_8
313 DO jj=j1,j2
314 a(jj) = zero
315 ENDDO
316 DO j=1, nass-ipiv
317 a(pospv1+int(j,8)*ldafs8) = zero
318 ENDDO
319 valtmp =
max(1.0d10*rmax, sqrt(huge(rmax))/1.0d8)
320 a(pospv1) = valtmp
321 ENDIF
322 pivot = a(pospv1)
323 abs_pivot = abs(pivot)
324 GO TO 415
325 ENDIF
326 rmax =
max(rmax,abs(rmax_norelax))
327 IF (abs_pivot.GE.uuloc*
max(rmax,amax)
328 & .AND. abs_pivot .GT.
max(seuil, tiny(rmax)))
THEN
329 IF (a(pospv1).LT.rzero) nnegw = nnegw+1
331 & ( abs_pivot, dkeep, keep, .false.)
332 IF (keep(258) .NE.0 ) THEN
334 ENDIF
335 GO TO 415
336 END IF
337 IF (npivp1.EQ.iend_block) THEN
338 GOTO 460
339 ELSE IF (jmax .EQ.0) THEN
340 GOTO 460
341 ENDIF
342 IF (
max(abs(pivot),rmax,amax).LE.tiny(rmax))
THEN
343 GOTO 460
344 ENDIF
345 IF (rmax_noslave.LT.amax) THEN
346 j1 = apos
347 j2 = pospv1 - 1_8
348 DO jj=j1,j2
349 IF(int(pospv1-jj) .NE. ipiv-jmax) THEN
350 rmax_noslave =
max(rmax_noslave,abs(a(jj)))
351 ENDIF
352 ENDDO
353 DO j=1,nass-ipiv
354 IF(ipiv+j .NE. jmax) THEN
355 rmax_noslave =
max(abs(a(pospv1+ldafs8*int(j,8))),
356 & rmax_noslave)
357 ENDIF
358 ENDDO
359 rmax =
max(rmax, rmax_noslave)
360 ENDIF
361 aposj = poselt + int(jmax-1,8)*ldafs8 + int(npiv,8)
362 pospv2 = aposj + int(jmax - npivp1,8)
363 IF (ipiv.LT.jmax) THEN
364 offdag = aposj + int(ipiv - npivp1,8)
365 ELSE
366 offdag = apos + int(jmax - npivp1,8)
367 END IF
368 tmax_noslave = rzero
369 IF(jmax .LT. ipiv) THEN
370 jj = pospv2
371 DO k = 1, nass-jmax
372 jj = jj+ldafs8
373 IF (jmax+k.NE.ipiv) THEN
374 tmax_noslave=
max(tmax_noslave,abs(a(jj)))
375 ENDIF
376 ENDDO
377 DO kk = aposj, pospv2-1_8
378 tmax_noslave =
max(tmax_noslave,abs(a(kk)))
379 ENDDO
380 ELSE
381 jj = pospv2
382 DO k = 1, nass-jmax
383 jj = jj+ldafs8
384 tmax_noslave=
max(tmax_noslave,abs(a(jj)))
385 ENDDO
386 DO kk = aposj, pospv2 - 1_8
387 IF (kk.NE.offdag) THEN
388 tmax_noslave =
max(tmax_noslave,abs(a(kk)))
389 ENDIF
390 ENDDO
391 ENDIF
392 IF (k219.NE.0) THEN
393 tmax =
max(seuil*uulocm1,
394 & abs(dble(a(aposmax+int(jmax,8))))
395 & )
396 ELSE
397 tmax = seuil*uulocm1
398 ENDIF
399 IF (k219.GE.2) THEN
400 growth = rone
401 IF (k219.EQ.3) THEN
402 IF (diag_orig(jmax).EQ.rzero) THEN
403 diag_orig(jmax) = abs(a(pospv2))
404 ELSE
405 growth = abs(a(pospv2))/diag_orig(jmax)
406 ENDIF
407 ELSE IF (k219.EQ.4) THEN
408 IF (diag_orig(jmax).EQ.rzero) THEN
409 diag_orig(jmax)=
max(abs(a(pospv2)),amax,tmax_noslave)
410 ELSE
411 growth =
max(abs(a(pospv2)),amax,tmax_noslave)
412 & / diag_orig(jmax)
413 ENDIF
414 ENDIF
415 tmax = tmax*
max(growth,gw_factcumul)
416 ENDIF
417 tmax =
max(tmax,tmax_noslave)
418 detpiv = a(pospv1)*a(pospv2) - a(offdag)*a(offdag)
419 absdetpiv = abs(detpiv)
420 IF (seuil.GT.rzero) THEN
421 IF (sqrt(absdetpiv) .LE. seuil ) THEN
422 GOTO 460
423 ENDIF
424 ENDIF
425 maxpiv =
max(abs(a(pospv1)),abs(a(pospv2)))
426 IF (maxpiv.EQ.rzero) maxpiv = rone
427 IF ((abs(a(pospv2))*rmax+amax*tmax)*uuloc.GT.
428 & absdetpiv .OR. absdetpiv .EQ. rzero) THEN
429 GO TO 460
430 ENDIF
431 IF ((abs(a(pospv1))*tmax+amax*rmax)*uuloc.GT.
432 & absdetpiv .OR. absdetpiv .EQ. rzero) THEN
433 GO TO 460
434 ENDIF
436 & ( sqrt(abs(detpiv)),
437 & dkeep, keep, .false.)
438 IF (keep(258).NE.0) THEN
440 ENDIF
441 pivsiz = 2
442 nb22t2w = nb22t2w+1
443 IF(detpiv .LT. rzero) THEN
444 nnegw = nnegw+1
445 ELSE IF(a(pospv2) .LT. rzero) THEN
446 nnegw = nnegw+2
447 ENDIF
448 415 CONTINUE
449 IF (k206.GE.1) THEN
450 inextpiv =
max(npivp1+pivsiz, ipiv+1)
451 ENDIF
452 DO k=1,pivsiz
453 IF (pivsiz .EQ. 2 ) THEN
454 IF (k==1) THEN
455 lpiv =
min(ipiv, jmax)
456 tipiv(iloc) = -(lpiv - ibeg_block_to_send + 1)
457 ELSE
458 lpiv =
max(ipiv, jmax)
459 tipiv(iloc+1) = -(lpiv - ibeg_block_to_send + 1)
460 ENDIF
461 ELSE
462 lpiv = ipiv
463 tipiv(iloc) = ipiv - ibeg_block_to_send + 1
464 ENDIF
465 IF (lpiv.EQ.npivp1) THEN
466 GOTO 416
467 ENDIF
468 keep8(80) = keep8(80)+1
470 & ioldps, npivp1, lpiv, poselt, nass,
471 & ldafs, nfront, 2, k219, keep(50),
472 & keep(ixsz), ibeg_block_to_send )
473 IF (k219.GE.3) THEN
474 rswop = diag_orig(lpiv)
475 diag_orig(lpiv) = diag_orig(npivp1)
476 diag_orig(npivp1) = rswop
477 ENDIF
478 416 CONTINUE
479 IF ((keep(50).NE.1) .AND. ooc_effective_on_front) THEN
481 & iw(i_pivrptr), nbpanels_l,
482 & iw(i_pivr), nass, npivp1, lpiv, pp_lastpanelondisk,
483 & pp_lastpivrptrindexfilled)
484 ENDIF
485 npivp1 = npivp1+1
486 ENDDO
487 IF(pivsiz .EQ. 2) THEN
488 a(poselt+ldafs8*int(npiv,8)+int(npiv+1,8)) = detpiv
489 ENDIF
490 GOTO 420
491 460 CONTINUE
492 IF (k206 .GE. 1) THEN
493 inextpiv=iend_block+1
494 ENDIF
495 IF (iend_block.EQ.nass) THEN
496 inopv = 1
497 ELSE
498 inopv = 2
499 ENDIF
500 GO TO 420
501 630 CONTINUE
502 iflag = -10
503 420 CONTINUE
504 IF (k219.GE.2) THEN
505 IF(inopv .EQ. 0) THEN
506 IF(pivsiz .EQ. 1) THEN
507 gw_fact =
max(amax,rmax_noslave)/abs_pivot
508 ELSE IF(pivsiz .EQ. 2) THEN
510 & (abs(a(pospv2))*rmax_noslave+amax*tmax_noslave)
511 & / absdetpiv ,
512 & (abs(a(pospv1))*tmax_noslave+amax*rmax_noslave)
513 & / absdetpiv
514 & )
515 ENDIF
516 gw_fact =
min(gw_fact, uulocm1)
517 gw_factcumul =
max(gw_fact,gw_factcumul)
518 ENDIF
519 ENDIF
520 RETURN
subroutine dmumps_updatedeter(piv, deter, nexp)
subroutine dmumps_get_ooc_perm_ptr(typef, nbpanels, i_pivptr, i_piv, ipos, iw, liw)
subroutine dmumps_store_perminfo(pivrptr, nbpanels, pivr, nass, k, p, lastpanelondisk, lastpivrptrindexfilled)
subroutine dmumps_swap_ldlt(a, la, iw, liw, ioldps, npivp1, ipiv, poselt, lastrow2swap, lda, nfront, level, parpiv, k50, xsize, ibeg_block_to_send)
subroutine dmumps_update_minmax_pivot(diag, dkeep, keep, nullpivot)