OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
sfac_front_aux.F
Go to the documentation of this file.
1C
2C This file is part of MUMPS 5.5.1, released
3C on Tue Jul 12 13:17:24 UTC 2022
4C
5C
6C Copyright 1991-2022 CERFACS, CNRS, ENS Lyon, INP Toulouse, Inria,
7C Mumps Technologies, University of Bordeaux.
8C
9C This version of MUMPS is provided to you free of charge. It is
10C released under the CeCILL-C license
11C (see doc/CeCILL-C_V1-en.txt, doc/CeCILL-C_V1-fr.txt, and
12C https://cecill.info/licences/Licence_CeCILL-C_V1-en.html)
13C
15 CONTAINS
16 SUBROUTINE smumps_fac_h(NFRONT,NASS,IW,LIW,A,LA,
17 & INOPV,NOFFW,
18 & DET_EXPW, DET_MANTW, DET_SIGNW,
19 & IOLDPS,POSELT,UU,SEUIL,KEEP, KEEP8, DKEEP,
20 & PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
21 & PP_LastPIVRPTRFilled_L,
22 & PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
23 & PP_LastPIVRPTRFilled_U,MAXFROMN,IS_MAXFROMN_AVAIL,
24 & Inextpiv, OOC_EFFECTIVE_ON_FRONT, NVSCHUR
25 &)
26!$ USE OMP_LIB
28 IMPLICIT NONE
29 INTEGER NFRONT,NASS,LIW,INOPV
30 INTEGER(8) :: LA
31 INTEGER :: KEEP(500)
32 INTEGER(8) :: KEEP8(150)
33 REAL :: DKEEP(230)
34 REAL UU, SEUIL
35 REAL A(LA)
36 INTEGER IW(LIW)
37 REAL, intent(in) :: MAXFROMN
38 LOGICAL, intent(inout) :: IS_MAXFROMN_AVAIL
39 INTEGER, intent(inout) :: Inextpiv
40 LOGICAL, intent(in) :: OOC_EFFECTIVE_ON_FRONT
41 INTEGER, intent(in) :: NVSCHUR
42 REAL AMROW
43 REAL RMAX, SEUIL_LOC
44 REAL SWOP
45 INTEGER(8) :: APOS, POSELT
46 INTEGER(8) :: J1, J2, J3_8, JJ, IDIAG
47 INTEGER(8) :: J1_ini
48 INTEGER(8) :: NFRONT8
49 INTEGER IOLDPS
50 INTEGER NPIV,IPIV,IPIV_SHIFT
51 INTEGER, intent(inout) :: NOFFW
52 INTEGER, intent(inout) :: DET_EXPW, DET_SIGNW
53 REAL, intent(inout) :: DET_MANTW
54 INTEGER J, J3
55 INTEGER NPIVP1,JMAX,ISW,ISWPS1
56 INTEGER ISWPS2,KSW,XSIZE
57 INTEGER I_PIVRPTR_L, I_PIVR_L, NBPANELS_L
58 INTEGER I_PIVRPTR_U, I_PIVR_U, NBPANELS_U
59 INTEGER PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
60 & pp_lastpivrptrfilled_l,
61 & pp_first2swap_u, pp_lastpanelondisk_u,
62 & pp_lastpivrptrfilled_u
63 INTEGER ISHIFT, K206
64 INTEGER SMUMPS_IXAMAX
65 include 'mumps_headers.h'
66 INTRINSIC max
67 REAL, PARAMETER :: RZERO = 0.0e0
68#if defined(_OPENMP)
69 INTEGER :: NOMP, CHUNK, K360
70 K360 = keep(360)
71 nomp = omp_get_max_threads()
72#endif
73 seuil_loc = max(dkeep(1), seuil)
74 nfront8 = int(nfront,8)
75 inopv = 0
76 xsize = keep(ixsz)
77 npiv = iw(ioldps+1+xsize)
78 npivp1 = npiv + 1
79 k206 = keep(206)
80 IF ((keep(50).NE.1).AND.ooc_effective_on_front) THEN
81 CALL smumps_get_ooc_perm_ptr(typef_l, nbpanels_l,
82 & i_pivrptr_l, i_pivr_l,
83 & ioldps+2*nfront+6+iw(ioldps+5+xsize)
84 & +keep(ixsz),
85 & iw, liw)
86 CALL smumps_get_ooc_perm_ptr(typef_u, nbpanels_u,
87 & i_pivrptr_u, i_pivr_u,
88 & ioldps+2*nfront+6+iw(ioldps+5+xsize)+xsize,
89 & iw, liw)
90 ENDIF
91 ishift = 0
92 IF (k206.GE.1) THEN
93 IF (inextpiv.GT.npivp1.AND.inextpiv.LE.nass) THEN
94 ishift = inextpiv - npivp1
95 ENDIF
96 IF (ishift.GT.0.AND.is_maxfromn_avail) THEN
97 ipiv = npivp1
98 apos = poselt + nfront8*int(npiv,8) + int(ipiv-1,8)
99 idiag = apos + int(ipiv - npivp1,8)*nfront8
100 IF (abs(a(idiag)) .GE. uu*maxfromn .AND.
101 & abs(a(idiag)) .GT. max(seuil_loc,tiny(rmax))
102 & ) THEN
103 ishift = 0
104 ENDIF
105 ENDIF
106 IF ( ishift .GT. 0) THEN
107 is_maxfromn_avail = .false.
108 ENDIF
109 ENDIF
110 DO 460 ipiv_shift=npivp1+ishift,nass+ishift
111 IF (ipiv_shift .LE. nass) THEN
112 ipiv=ipiv_shift
113 ELSE
114 ipiv=ipiv_shift-nass-1+npivp1
115 ENDIF
116 apos = poselt + nfront8*int(npiv,8) + int(ipiv-1,8)
117 jmax = 1
118 amrow = rzero
119 j1 = apos
120 j3 = nass -npiv
121 jmax = smumps_ixamax(j3,a(j1),nfront,keep(360))
122 jj = j1 + int(jmax-1,8)*nfront8
123 amrow = abs(a(jj))
124 rmax = amrow
125 j1 = apos + int(nass-npiv,8) * nfront8
126 j3 = nfront - nass - keep(253)-nvschur
127 IF (is_maxfromn_avail) THEN
128 rmax = max(maxfromn,rmax)
129 is_maxfromn_avail = .false.
130 ELSE
131 IF (j3.EQ.0) GOTO 370
132 IF (keep(351).EQ.1) THEN
133 j1_ini = j1
134!$ CHUNK = max(K360/2,(J3+NOMP-1)/NOMP)
135!$OMP PARALLEL DO schedule(static, CHUNK)
136!$OMP& FIRSTPRIVATE(J1_ini,NFRONT8,J3)
137!$OMP& REDUCTION(max:RMAX) IF (J3.GE.K360)
138 DO j=1,j3
139 rmax = max(abs(a(j1_ini + int(j-1,8) * nfront8)),
140 & rmax)
141 END DO
142!$OMP END PARALLEL DO
143 ELSE
144 DO j=1,j3
145 rmax = max(abs(a(j1)), rmax)
146 j1 = j1 + nfront8
147 END DO
148 ENDIF
149 END IF
150 370 IF (rmax.LE.tiny(rmax)) GO TO 460
151 idiag = apos + int(ipiv - npivp1,8)*nfront8
152 IF (abs(a(idiag)) .GE. uu*rmax .AND.
153 & abs(a(idiag)) .GT. max(seuil_loc,tiny(rmax)) ) THEN
154 jmax = ipiv - npiv
155 GO TO 380
156 ENDIF
157 IF ( .NOT. ( amrow .GE. uu*rmax .AND.
158 & amrow .GT. max(seuil_loc,tiny(rmax))
159 & )
160 & ) GO TO 460
161 noffw = noffw + 1
162 380 CONTINUE
163 IF (k206.GE.1) THEN
164 inextpiv = ipiv + 1
165 ENDIF
167 & ( abs(a(apos + int(jmax - 1,8) * nfront8 )),
168 & dkeep, keep, .false.)
169 IF (keep(258) .NE. 0) THEN
171 & a(apos + int(jmax - 1,8) * nfront8 ),
172 & det_mantw, det_expw )
173 ENDIF
174 IF (ipiv.EQ.npivp1) GO TO 400
175 IF (keep(405) .EQ.0) THEN
176 keep8(80) = keep8(80)+1
177 ELSE
178!$OMP ATOMIC UPDATE
179 keep8(80) = keep8(80)+1
180!$OMP END ATOMIC
181 ENDIF
182 det_signw = - det_signw
183 j1 = poselt + int(npiv,8)
184 j3_8 = poselt + int(ipiv-1,8)
185 DO j= 1,nfront
186 swop = a(j1)
187 a(j1) = a(j3_8)
188 a(j3_8) = swop
189 j1 = j1 + nfront8
190 j3_8 = j3_8 + nfront8
191 END DO
192 iswps1 = ioldps + 5 + npivp1 + nfront + xsize
193 iswps2 = ioldps + 5 + ipiv + nfront + xsize
194 isw = iw(iswps1)
195 iw(iswps1) = iw(iswps2)
196 iw(iswps2) = isw
197 400 IF (jmax.EQ.1) GO TO 420
198 det_signw = -det_signw
199 j1 = poselt + int(npiv,8) * nfront8
200 j2 = poselt + int(npiv + jmax - 1,8) * nfront8
201 DO ksw=1,nfront
202 swop = a(j1)
203 a(j1) = a(j2)
204 a(j2) = swop
205 j1 = j1 + 1_8
206 j2 = j2 + 1_8
207 END DO
208 iswps1 = ioldps + 5 + npiv + 1 + xsize
209 iswps2 = ioldps + 5 + npiv + jmax + xsize
210 isw = iw(iswps1)
211 iw(iswps1) = iw(iswps2)
212 iw(iswps2) = isw
213 GO TO 420
214 460 CONTINUE
215 inopv = 1
216 GOTO 430
217 420 CONTINUE
218 IF (ooc_effective_on_front) THEN
219 IF (keep(251).EQ.0) THEN
220 CALL smumps_store_perminfo( iw(i_pivrptr_l),
221 & nbpanels_l,
222 & iw(i_pivr_l), nass, npivp1, npiv+jmax,
223 & pp_lastpanelondisk_l,
224 & pp_lastpivrptrfilled_l)
225 ENDIF
226 CALL smumps_store_perminfo( iw(i_pivrptr_u),
227 & nbpanels_u,
228 & iw(i_pivr_u), nass, npivp1, ipiv,
229 & pp_lastpanelondisk_u,
230 & pp_lastpivrptrfilled_u)
231 ENDIF
232 430 CONTINUE
233 is_maxfromn_avail = .false.
234 RETURN
235 END SUBROUTINE smumps_fac_h
236 SUBROUTINE smumps_fac_n(NFRONT,NASS,IW,LIW,A,LA,
237 & IOLDPS,POSELT,IFINB,XSIZE,
238 & KEEP,MAXFROMN,IS_MAXFROMN_AVAIL,NVSCHUR)
239!$ USE OMP_LIB
240 IMPLICIT NONE
241 include 'mumps_headers.h'
242 INTEGER NFRONT,NASS,LIW,IFINB
243 INTEGER(8) :: LA
244 REAL A(LA)
245 INTEGER IW(LIW)
246 REAL ALPHA,VALPIV
247 INTEGER(8) :: APOS, POSELT, UUPOS, LPOS, IRWPOS
248 INTEGER(8) :: NFRONT8
249 INTEGER IOLDPS,NPIV,XSIZE
250 INTEGER, intent(in) :: KEEP(500)
251 REAL, intent(inout) :: MAXFROMN
252 LOGICAL, intent(inout) :: IS_MAXFROMN_AVAIL
253 INTEGER, intent(in) :: NVSCHUR
254 INTEGER NEL,IROW,NEL2,JCOL,NELMAXM
255 INTEGER NPIVP1
256 REAL, PARAMETER :: ONE = 1.0e0
257#if defined(_OPENMP)
258 LOGICAL:: OMP_FLAG
259 INTEGER:: NOMP, K360, CHUNK
260 nomp = omp_get_max_threads()
261 k360 = keep(360)
262#endif
263 nfront8=int(nfront,8)
264 npiv = iw(ioldps+1+xsize)
265 npivp1 = npiv + 1
266 nel = nfront - npivp1
267 nelmaxm= nel -keep(253)-nvschur
268 nel2 = nass - npivp1
269 ifinb = 0
270 IF (npivp1.EQ.nass) ifinb = 1
271 apos = poselt + int(npiv,8)*(nfront8 + 1_8)
272 valpiv = one/a(apos)
273#if defined(_OPENMP)
274 omp_flag = .false.
275 chunk = max(nel,1)
276 IF (nomp.GT.1) THEN
277 IF (nel.LT.k360) THEN
278 IF (nel*nel2.GE.keep(361)) THEN
279 omp_flag = .true.
280 chunk = max(20, (nel+nomp-1)/nomp)
281 ENDIF
282 ELSE
283 omp_flag = .true.
284 chunk = max(k360/2, (nel+nomp-1)/nomp)
285 ENDIF
286 ENDIF
287#endif
288 IF (keep(351).EQ.2) THEN
289 maxfromn = 0.0e0
290 IF (nel2 > 0) THEN
291 is_maxfromn_avail = .true.
292 ENDIF
293!$OMP PARALLEL DO schedule(static, CHUNK)
294!$OMP& PRIVATE(LPOS, UUPOS, IRWPOS, ALPHA, JCOL)
295!$OMP& FIRSTPRIVATE(APOS,NFRONT8,VALPIV,NEL,NEL2)
296!$OMP& REDUCTION(max:MAXFROMN) IF(OMP_FLAG)
297 DO irow = 1, nel
298 lpos = apos + nfront8*int(irow,8)
299 a(lpos) = a(lpos)*valpiv
300 alpha = -a(lpos)
301 irwpos = lpos + 1_8
302 uupos = apos + 1_8
303 IF (nel2 > 0) THEN
304 a(irwpos) = a(irwpos) + alpha*a(uupos)
305 IF (irow.LE.nelmaxm)
306 & maxfromn=max(maxfromn, abs(a(irwpos)))
307 irwpos = irwpos+1_8
308 uupos = uupos+1_8
309 DO jcol = 2, nel2
310 a(irwpos) = a(irwpos) + alpha*a(uupos)
311 irwpos = irwpos+1_8
312 uupos = uupos+1_8
313 ENDDO
314 ENDIF
315 END DO
316!$OMP END PARALLEL DO
317 ELSE
318!$OMP PARALLEL DO schedule(static, CHUNK)
319!$OMP& FIRSTPRIVATE(APOS,NFRONT8,VALPIV,NEL,NEL2)
320!$OMP& PRIVATE(LPOS, UUPOS, IRWPOS, ALPHA, JCOL) IF(OMP_FLAG)
321 DO irow = 1, nel
322 lpos = apos + nfront8*int(irow,8)
323 a(lpos) = a(lpos)*valpiv
324 alpha = -a(lpos)
325 irwpos = lpos + 1_8
326 uupos = apos + 1_8
327 DO jcol = 1, nel2
328 a(irwpos) = a(irwpos) + alpha*a(uupos)
329 irwpos = irwpos+1_8
330 uupos = uupos+1_8
331 ENDDO
332 ENDDO
333!$OMP END PARALLEL DO
334 ENDIF
335 RETURN
336 END SUBROUTINE smumps_fac_n
337 SUBROUTINE smumps_fac_pt_setlock427( K427_OUT, K427,
338 & K405, K222, NEL1, NASS )
339 INTEGER, INTENT(IN) :: K427, K405, K222, NEL1, NASS
340 INTEGER, INTENT(OUT) :: K427_OUT
341 k427_out = k427
342 IF ( k427_out .GT. 0 ) k427_out = 0
343 IF ( k427_out .LT. 0 ) k427_out = -1
344 IF ( k427_out .GT. 99 ) k427_out = 0
345 IF ( k427_out .LT. -100 ) k427_out = -1
346 RETURN
347 END SUBROUTINE smumps_fac_pt_setlock427
348 SUBROUTINE smumps_fac_p(A,LA,NFRONT,
349 & NPIV,NASS,POSELT,CALL_UTRSM, KEEP, INODE,
350 & CALL_OOC, IWFAC, LIWFAC, LAFAC, MonBloc, MYID, KEEP8,
351 & LNextPiv2beWritten, UNextPiv2beWritten,
352 & IFLAG )
353 USE smumps_ooc, ONLY : io_block, typef_both_lu,
356 IMPLICIT NONE
357 INTEGER(8) :: LA,POSELT,LAFAC
358 REAL A(LA)
359 INTEGER NFRONT, NPIV, NASS
360 LOGICAL, INTENT(IN) :: CALL_UTRSM
361 INTEGER, INTENT(INOUT) :: IFLAG
362 LOGICAL, INTENT(IN) :: CALL_OOC
363 INTEGER LIWFAC, MYID,
364 & lnextpiv2bewritten, unextpiv2bewritten
365 INTEGER IWFAC(LIWFAC)
366 TYPE(IO_BLOCK) :: MonBloc
367 INTEGER :: KEEP(500)
368 INTEGER(8) :: KEEP8(150)
369 INTEGER(8) :: LPOS, LPOS1, LPOS2, UPOS
370 INTEGER NEL1, NEL11, IFLAG_OOC
371 INTEGER :: INODE
372 REAL ALPHA, ONE
373 parameter(one = 1.0e0, alpha=-1.0e0)
374 include 'mumps_headers.h'
375 nel1 = nfront - nass
376 nel11 = nfront - npiv
377 lpos2 = poselt + int(nass,8)*int(nfront,8)
378 lpos = lpos2 + int(npiv,8)
379 lpos1 = poselt + int(npiv,8)
380 upos = poselt + int(nass,8)
381 IF ( call_utrsm ) THEN
382 CALL strsm('R', 'U', 'N', 'U', nel1, npiv, one,
383 & a(poselt), nfront, a(upos), nfront)
384 ENDIF
385 CALL strsm('L','L','N','N',npiv,nel1,one,a(poselt),nfront,
386 & a(lpos2),nfront)
387 IF (call_ooc) THEN
390 & a(poselt), lafac, monbloc,
391 & lnextpiv2bewritten, unextpiv2bewritten,
392 & iwfac, liwfac,
393 & myid, keep8(31), iflag_ooc,
394 & .false. )
395 IF (iflag_ooc .LT. 0) THEN
396 iflag = iflag_ooc
397 GOTO 500
398 ENDIF
399 ENDIF
400 CALL sgemm('N','N',nel11,nel1,npiv,alpha,a(lpos1),
401 & nfront,a(lpos2),nfront,one,a(lpos),nfront)
402 IF ((call_utrsm).AND.(nass-npiv.GT.0)) THEN
403 lpos2 = poselt + int(npiv,8)*int(nfront,8)
404 lpos = lpos2 + int(nass,8)
405 CALL sgemm('N','N',nel1,nass-npiv,npiv,alpha,a(upos),
406 & nfront,a(lpos2),nfront,one,a(lpos),nfront)
407 ENDIF
408 500 CONTINUE
409 RETURN
410 END SUBROUTINE smumps_fac_p
411 SUBROUTINE smumps_fac_t(A,LA,NPIVB,NFRONT,
412 & NPIV,NASS,POSELT)
413 IMPLICIT NONE
414 INTEGER NPIVB,NASS
415 INTEGER(8) :: LA
416 REAL A(LA)
417 INTEGER(8) :: APOS, POSELT
418 INTEGER NFRONT, NPIV, NASSL
419 INTEGER(8) :: LPOS, LPOS1, LPOS2
420 INTEGER NEL1, NEL11, NPIVE
421 REAL ALPHA, ONE
422 parameter(one = 1.0e0, alpha=-1.0e0)
423 nel1 = nfront - nass
424 nel11 = nfront - npiv
425 npive = npiv - npivb
426 nassl = nass - npivb
427 apos = poselt + int(npivb,8)*int(nfront,8)
428 & + int(npivb,8)
429 lpos2 = apos + int(nassl,8)
430 CALL strsm('R','U','N','U',nel1,npive,one,a(apos),nfront,
431 & a(lpos2),nfront)
432 lpos = lpos2 + int(nfront,8)*int(npive,8)
433 lpos1 = apos + int(nfront,8)*int(npive,8)
434 CALL sgemm('N','N',nel1,nel11,npive,alpha,a(lpos2),
435 & nfront,a(lpos1),nfront,one,a(lpos),nfront)
436 RETURN
437 END SUBROUTINE smumps_fac_t
438 SUBROUTINE smumps_fac_sq(IBEG_BLOCK, IEND_BLOCK, NPIV,
439 & NFRONT, LAST_ROW, LAST_COL, A, LA, POSELT,
440 & FIRST_COL, CALL_LTRSM, CALL_UTRSM, CALL_GEMM,
441 & WITH_COMM_THREAD, LR_ACTIVATED
442 & )
443!$ USE OMP_LIB
444#if defined(_OPENMP)
445 USE smumps_buf
446#endif
447 IMPLICIT NONE
448 INTEGER, intent(in) :: IBEG_BLOCK, IEND_BLOCK
449 INTEGER, intent(in) :: NPIV, NFRONT, LAST_ROW, LAST_COL
450 INTEGER, intent(in) :: FIRST_COL
451 INTEGER(8), intent(in) :: LA
452 REAL, intent(inout) :: A(LA)
453 INTEGER(8), intent(in) :: POSELT
454 LOGICAL, intent(in) :: CALL_LTRSM, CALL_UTRSM, CALL_GEMM
455 LOGICAL, intent(in) :: WITH_COMM_THREAD, LR_ACTIVATED
456 INTEGER(8) :: NFRONT8, LPOSN, LPOS2N
457 INTEGER(8) :: LPOS, LPOS1, LPOS2, UPOS, POSELT_LOCAL
458 INTEGER :: NELIM, LKJIW, NEL1, NEL11, UTRSM_NCOLS
459 REAL ALPHA, ONE
460 PARAMETER (ONE = 1.0e0, alpha=-1.0e0)
461!$ INTEGER :: NOMP
462!$ LOGICAL :: TRSM_GEMM_FINISHED
463!$ LOGICAL :: SAVE_NESTED, SAVE_DYNAMIC
464 nfront8= int(nfront,8)
465 nelim = iend_block - npiv
466 nel1 = last_row - iend_block
467 IF ( nel1 < 0 ) THEN
468 WRITE(*,*)
469 & "Internal error 1 in SMUMPS_FAC_SQ,IEND_BLOCK>LAST_ROW",
470 & iend_block, last_row
471 CALL mumps_abort()
472 ENDIF
473 lkjiw = npiv - ibeg_block + 1
474 nel11 = last_col - npiv
475 lpos2 = poselt + int(iend_block,8)*nfront8 + int(ibeg_block-1,8)
476 utrsm_ncols = last_col - first_col
477 upos = poselt + int(ibeg_block-1,8)*nfront8 + int(first_col,8)
478 poselt_local = poselt + int(ibeg_block-1,8)*nfront8
479 & + int(ibeg_block-1,8)
480 IF ((nel1.NE.0).AND.(lkjiw.NE.0)) THEN
481 IF (with_comm_thread .EQV. .false.) THEN
482 IF (call_ltrsm) THEN
483 CALL strsm('L','L','N','N',lkjiw,nel1,one,
484 & a(poselt_local),nfront,
485 & a(lpos2),nfront)
486 ENDIF
487 IF (call_utrsm) THEN
488 CALL strsm('R','U','N','U',utrsm_ncols,lkjiw,one,
489 & a(poselt_local),nfront,
490 & a(upos),nfront)
491 lpos2n = poselt + int(npiv,8)*nfront8 + int(ibeg_block-1,8)
492 lposn = poselt + int(npiv,8)*nfront8 + int(first_col,8)
493 CALL sgemm('N','N',utrsm_ncols,nelim,
494 & lkjiw,alpha,a(upos),nfront,a(lpos2n),
495 & nfront,one,a(lposn),nfront)
496 ENDIF
497 IF (call_gemm) THEN
498 lpos = lpos2 + int(lkjiw,8)
499 lpos1 = poselt_local + int(lkjiw,8)
500 CALL sgemm('N','N',nel11,nel1,lkjiw,alpha,a(lpos1),
501 & nfront,a(lpos2),nfront,one,a(lpos),nfront)
502 ENDIF
503 ELSE
504!$ NOMP = OMP_GET_MAX_THREADS()
505!$ CALL OMP_SET_NUM_THREADS(2)
506!$ SAVE_NESTED = OMP_GET_NESTED()
507!$ SAVE_DYNAMIC = OMP_GET_DYNAMIC()
508!$ CALL OMP_SET_NESTED(.TRUE.)
509!$ CALL OMP_SET_DYNAMIC(.FALSE.)
510!$ TRSM_GEMM_FINISHED = .FALSE.
511!$OMP PARALLEL SHARED(TRSM_GEMM_FINISHED)
512!$ IF (OMP_GET_THREAD_NUM() .EQ. 1) THEN
513#if defined(WORKAROUNDINTELILP64OPENMPLIMITATION)
514!$ CALL OMP_SET_NUM_THREADS(int(NOMP,4))
515#else
516!$ CALL OMP_SET_NUM_THREADS(NOMP)
517#endif
518 IF (call_ltrsm) THEN
519 CALL strsm('L','L','N','N',lkjiw,nel1,one,
520 & a(poselt_local),nfront,
521 & a(lpos2),nfront)
522 ENDIF
523 IF (call_utrsm) THEN
524 CALL strsm('R','U','N','U',utrsm_ncols,lkjiw,one,
525 & a(poselt_local),nfront,
526 & a(upos),nfront)
527 lpos2n = poselt + int(npiv,8)*nfront8 + int(ibeg_block-1,8)
528 lposn = poselt + int(npiv,8)*nfront8 + int(first_col,8)
529 CALL sgemm('N','N',utrsm_ncols,nelim,
530 & lkjiw,alpha,a(upos),nfront,a(lpos2n),
531 & nfront,one,a(lposn),nfront)
532 ENDIF
533 IF (call_gemm) THEN
534 lpos = lpos2 + int(lkjiw,8)
535 lpos1 = poselt_local + int(lkjiw,8)
536 CALL sgemm('N','N',nel11,nel1,lkjiw,alpha,a(lpos1),
537 & nfront,a(lpos2),nfront,one,a(lpos),nfront)
538 END IF
539!$ TRSM_GEMM_FINISHED = .TRUE.
540!$ ELSE
541!$ DO WHILE (.NOT. TRSM_GEMM_FINISHED)
542!$ CALL SMUMPS_BUF_TEST()
543!$ CALL MUMPS_USLEEP(10000)
544!$ END DO
545!$ END IF
546!$OMP END PARALLEL
547!$ CALL OMP_SET_NESTED(SAVE_NESTED)
548!$ CALL OMP_SET_DYNAMIC(SAVE_DYNAMIC)
549#if defined(WORKAROUNDINTELILP64OPENMPLIMITATION)
550!$ CALL OMP_SET_NUM_THREADS(int(NOMP,4))
551#else
552!$ CALL OMP_SET_NUM_THREADS(NOMP)
553#endif
554 ENDIF
555 ELSE
556 IF (call_utrsm.AND.utrsm_ncols.NE.0) THEN
557 CALL strsm('r','u','n','u',UTRSM_NCOLS,LKJIW,ONE,
558 & A(POSELT_LOCAL),NFRONT,
559 & A(UPOS),NFRONT)
560 LPOS2N = POSELT + int(NPIV,8)*NFRONT8 + int(IBEG_BLOCK-1,8)
561 LPOSN = POSELT + int(NPIV,8)*NFRONT8 + int(FIRST_COL,8)
562 CALL sgemm('n','n',UTRSM_NCOLS,NELIM,
563 & LKJIW,ALPHA,A(UPOS),NFRONT,A(LPOS2N),
564 & NFRONT,ONE,A(LPOSN),NFRONT)
565 ENDIF
566 ENDIF
567 RETURN
568 END SUBROUTINE SMUMPS_FAC_SQ
569 SUBROUTINE SMUMPS_FAC_MQ(IBEG_BLOCK,IEND_BLOCK,
570 & NFRONT, NASS, NPIV, LAST_COL, A, LA, POSELT, IFINB,
571 & LR_ACTIVATED
572 & )
573 IMPLICIT NONE
574 INTEGER, intent(in) :: IBEG_BLOCK, IEND_BLOCK, NFRONT,
575 & NASS, NPIV, LAST_COL
576 INTEGER, intent(out) :: IFINB
577 INTEGER(8), intent(in) :: LA, POSELT
578 REAL, intent(inout) :: A(LA)
579 LOGICAL, intent(in) :: LR_ACTIVATED
580 REAL :: VALPIV
581 INTEGER(8) :: APOS, UUPOS, LPOS
582 INTEGER(8) :: NFRONT8
583 REAL :: ONE, ALPHA
584 INTEGER :: NEL2,NPIVP1,KROW,NEL
585 PARAMETER (ONE = 1.0E0, ALPHA=-1.0E0)
586 NFRONT8= int(NFRONT,8)
587 NPIVP1 = NPIV + 1
588 NEL = LAST_COL - NPIVP1
589 IFINB = 0
590 NEL2 = IEND_BLOCK - NPIVP1
591.EQ. IF (NEL20) THEN
592.EQ. IF (IEND_BLOCKNASS) THEN
593 IFINB = -1
594 ELSE
595 IFINB = 1
596 ENDIF
597 ELSE
598 APOS = POSELT + int(NPIV,8)*(NFRONT8 + 1_8)
599 VALPIV = ONE/A(APOS)
600 LPOS = APOS + NFRONT8
601 DO 541 KROW = 1,NEL2
602 A(LPOS) = A(LPOS)*VALPIV
603 LPOS = LPOS + NFRONT8
604 541 CONTINUE
605 LPOS = APOS + NFRONT8
606 UUPOS = APOS + 1_8
607#if defined(MUMPS_USE_BLAS2)
608 CALL sger(NEL,NEL2,ALPHA,A(UUPOS),1,A(LPOS),NFRONT,
609 & A(LPOS+1_8),NFRONT)
610#else
611 CALL sgemm('n','n',NEL,NEL2,1,ALPHA,A(UUPOS),NEL,
612 & A(LPOS),NFRONT,ONE,A(LPOS+1_8),NFRONT)
613#endif
614 ENDIF
615 RETURN
616 END SUBROUTINE SMUMPS_FAC_MQ
617 SUBROUTINE SMUMPS_FAC_FR_UPDATE_CBROWS( INODE, NFRONT, NASS,
618 & CALL_UTRSM, A, LA, LAFAC, POSELT, IW, LIW, IOLDPS,
619 & MonBloc, MYID, NOFFW,
620 & DET_EXPW, DET_MANTW, DET_SIGNW,
621 & LIWFAC,
622 & PP_FIRST2SWAP_L, PP_FIRST2SWAP_U,
623 & LNextPiv2beWritten, UNextPiv2beWritten,
624 & PP_LastPIVRPTRFilled_L, PP_LastPIVRPTRFilled_U,
625 &
626 & XSIZE, SEUIL, UU, DKEEP, KEEP8, KEEP, IFLAG,
627 & OOC_EFFECTIVE_ON_FRONT, NVSCHUR)
628 USE SMUMPS_OOC, ONLY: IO_BLOCK
629 IMPLICIT NONE
630 INTEGER, intent(in) :: INODE, NFRONT, NASS,
631 & LIW, MYID, XSIZE, IOLDPS, LIWFAC
632 INTEGER(8), intent(in) :: LA, POSELT
633 INTEGER, intent(inout) :: NOFFW
634 INTEGER, intent(inout) :: DET_EXPW, DET_SIGNW
635 REAL, intent(inout) :: DET_MANTW
636 INTEGER, intent(inout) :: PP_FIRST2SWAP_L, PP_FIRST2SWAP_U,
637 & LNextPiv2beWritten, UNextPiv2beWritten,
638 & PP_LastPIVRPTRFilled_L, PP_LastPIVRPTRFilled_U,
639 & IFLAG
640 LOGICAL, intent(in) :: CALL_UTRSM
641 INTEGER, intent(inout) :: IW(LIW)
642 REAL, intent(inout) :: A(LA)
643 REAL, intent(in) :: SEUIL, UU, DKEEP(230)
644 INTEGER, intent(in) :: KEEP( 500 )
645 INTEGER(8), intent(inout) :: LAFAC
646 INTEGER(8) :: KEEP8(150)
647 INTEGER, intent(in) :: NVSCHUR
648 TYPE(IO_BLOCK), intent(inout) :: MonBloc
649 LOGICAL, intent(in) :: OOC_EFFECTIVE_ON_FRONT
650 INTEGER :: NPIV, NEL1, IBEG_BLOCK, IFINB, INOPV
651 INTEGER Inextpiv
652 REAL :: MAXFROMN
653 LOGICAL :: IS_MAXFROMN_AVAIL
654 NPIV = IW(IOLDPS+1+XSIZE)
655 NEL1 = NFRONT - NASS
656.GE. IF (KEEP(206)1) THEN
657 Inextpiv = 1
658 ELSE
659 Inextpiv = 0
660 ENDIF
661.GT..AND..GT. IF ((NPIV0)(NEL10)) THEN
662 IF (OOC_EFFECTIVE_ON_FRONT) THEN
663 MonBloc%LastPiv = NPIV
664 ENDIF
665 CALL SMUMPS_FAC_P(A,LA,NFRONT, NPIV, NASS, POSELT,
666 & CALL_UTRSM, KEEP, INODE,
667 & OOC_EFFECTIVE_ON_FRONT, IW(IOLDPS),
668 & LIWFAC, LAFAC,
669 & MonBloc, MYID, KEEP8,
670 & LNextPiv2beWritten, UNextPiv2beWritten,
671 & IFLAG)
672 ENDIF
673 NPIV = IW(IOLDPS+1+XSIZE)
674 IBEG_BLOCK = NPIV
675.EQ. IF (NASSNPIV) GOTO 500
676 IS_MAXFROMN_AVAIL = .FALSE.
677 120 CALL SMUMPS_FAC_H(NFRONT,NASS,IW,LIW,A,LA,
678 & INOPV, NOFFW,
679 & DET_EXPW, DET_MANTW, DET_SIGNW,
680 & IOLDPS,POSELT,UU,SEUIL,
681 & KEEP, KEEP8, DKEEP,
682 & PP_FIRST2SWAP_L, MonBloc%LastPanelWritten_L,
683 & PP_LastPIVRPTRFilled_L,
684 & PP_FIRST2SWAP_U, MonBloc%LastPanelWritten_U,
685 & PP_LastPIVRPTRFilled_U, MAXFROMN, IS_MAXFROMN_AVAIL,
686 & Inextpiv, OOC_EFFECTIVE_ON_FRONT, NVSCHUR
687 & )
688.NE. IF (INOPV1) THEN
689 CALL SMUMPS_FAC_N(NFRONT,NASS,IW,LIW,A,LA,
690 & IOLDPS,POSELT,IFINB,XSIZE,
691 & KEEP, MAXFROMN, IS_MAXFROMN_AVAIL,
692 & NVSCHUR)
693 IW(IOLDPS+1+XSIZE) = IW(IOLDPS+1+XSIZE) + 1
694.EQ. IF (IFINB0) GOTO 120
695 ENDIF
696 NPIV = IW(IOLDPS+1+XSIZE)
697 NEL1 = NFRONT - NASS
698.LE..OR..EQ. IF ((NPIVIBEG_BLOCK)(NEL10)) GO TO 500
699 CALL SMUMPS_FAC_T(A,LA,IBEG_BLOCK,
700 & NFRONT,NPIV,NASS,POSELT)
701 500 CONTINUE
702 RETURN
703 END SUBROUTINE SMUMPS_FAC_FR_UPDATE_CBROWS
704 SUBROUTINE SMUMPS_FAC_I(NFRONT,NASS,LAST_ROW,
705 & IBEG_BLOCK, IEND_BLOCK,
706 & N,INODE,IW,LIW,A,LA,
707 & INOPV,NOFFW,NBTINYW,
708 & DET_EXPW, DET_MANTW, DET_SIGNW,
709 & IFLAG,IOLDPS,POSELT,UU,SEUIL,KEEP,KEEP8,
710 & DKEEP,PIVNUL_LIST,LPN_LIST,
711 &
712 & PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
713 & PP_LastPIVRPTRFilled_L,
714 & PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
715 & PP_LastPIVRPTRFilled_U,
716 & PIVOT_OPTION, LR_ACTIVATED, IEND_BLR, Inextpiv,
717 & OOC_EFFECTIVE_ON_FRONT, NVSCHUR, PARPIV_T1,
718 & TIPIV
719 & )
720!$ USE OMP_LIB
721 USE MUMPS_OOC_COMMON
722 IMPLICIT NONE
723 INTEGER, intent(in) :: IBEG_BLOCK, IEND_BLOCK
724 INTEGER, intent(inout), OPTIONAL :: TIPIV(:)
725 INTEGER(8), intent(in) :: LA
726 REAL, intent(inout) :: A(LA)
727 INTEGER, intent(in) :: NFRONT,NASS,N,LIW,INODE,LAST_ROW
728 INTEGER, intent(inout) :: IFLAG,INOPV,NOFFW, NBTINYW
729 INTEGER, intent(inout) :: DET_EXPW, DET_SIGNW
730 REAL, intent(inout) :: DET_MANTW
731 REAL, intent(in) :: UU, SEUIL
732 INTEGER, intent(inout) :: IW(LIW)
733 INTEGER, intent(in) :: IOLDPS
734 INTEGER(8), intent(in) :: POSELT
735 INTEGER KEEP(500)
736 INTEGER(8) KEEP8(150)
737 INTEGER, intent(in) :: LPN_LIST
738 INTEGER, intent(inout) :: PIVNUL_LIST(LPN_LIST)
739 REAL DKEEP(230)
740 INTEGER PP_FIRST2SWAP_L, PP_LastPanelonDisk_L,
741 & PP_LastPIVRPTRFilled_L,
742 & PP_FIRST2SWAP_U, PP_LastPanelonDisk_U,
743 & PP_LastPIVRPTRFilled_U
744 INTEGER, intent(in) :: PIVOT_OPTION, IEND_BLR
745 LOGICAL, intent(in) :: LR_ACTIVATED
746 INTEGER, intent(inout) :: Inextpiv
747 LOGICAL, intent(in) :: OOC_EFFECTIVE_ON_FRONT
748 INTEGER, intent(in) :: NVSCHUR
749 INTEGER, intent(in) :: PARPIV_T1
750 INCLUDE 'mumps_headers.h'
751 REAL SWOP
752 INTEGER XSIZE
753 INTEGER(8) :: APOS, IDIAG
754 INTEGER(8) :: J1, J2, JJ, J3
755 INTEGER(8) :: NFRONT8
756 INTEGER ILOC
757 REAL ZERO
758 PARAMETER( ZERO = 0.0E0 )
759 REAL RZERO, RMAX, AMROW, MAX_PREV_in_PARPIV
760 INTEGER(8) :: APOSMAX, APOSROW
761 REAL :: RMAX_NORELAX
762 REAL PIVNUL, ABS_PIVOT
763 REAL FIXA, CSEUIL, PIVOT
764 INTEGER NPIV,IPIV, LRLOC
765 INTEGER NPIVP1,JMAX,J,ISW,ISWPS1
766 INTEGER ISWPS2,KSW, HF, IPIVNUL
767 INTEGER SMUMPS_IXAMAX
768 INTEGER :: ISHIFT, K206
769 INTEGER :: IPIV_SHIFT,IPIV_END
770 INTRINSIC max
771 DATA RZERO /0.0E0/
772#if defined(_OPENMP)
773 INTEGER :: NOMP,CHUNK,K361
774#endif
775 INTEGER I_PIVRPTR_L, I_PIVR_L, NBPANELS_L
776 INTEGER I_PIVRPTR_U, I_PIVR_U, NBPANELS_U
777#if defined(_OPENMP)
778 NOMP = OMP_GET_MAX_THREADS()
779 K361 = KEEP(361)
780#endif
781 PIVNUL = DKEEP(1)
782 FIXA = DKEEP(2)
783 CSEUIL = SEUIL
784 NFRONT8 = int(NFRONT,8)
785 K206 = KEEP(206)
786 XSIZE = KEEP(IXSZ)
787 NPIV = IW(IOLDPS+1+XSIZE)
788 HF = 6 + IW(IOLDPS+5+XSIZE)+XSIZE
789 NPIVP1 = NPIV + 1
790 APOSMAX = POSELT+NFRONT8*NFRONT8-1_8
791 IF (OOC_EFFECTIVE_ON_FRONT) THEN
792 CALL SMUMPS_GET_OOC_PERM_PTR(TYPEF_L, NBPANELS_L,
793 & I_PIVRPTR_L, I_PIVR_L,
794 & IOLDPS+2*NFRONT+6+IW(IOLDPS+5+XSIZE)+XSIZE,
795 & IW, LIW)
796 CALL SMUMPS_GET_OOC_PERM_PTR(TYPEF_U, NBPANELS_U,
797 & I_PIVRPTR_U, I_PIVR_U,
798 & IOLDPS+2*NFRONT+6+IW(IOLDPS+5+XSIZE)+XSIZE,
799 & IW, LIW)
800 ENDIF
801 IF ( present(TIPIV) ) THEN
802 ILOC = NPIVP1 - IBEG_BLOCK + 1
803 TIPIV(ILOC) = ILOC
804 ENDIF
805.EQ. IF (INOPV -1) THEN
806 APOS = POSELT + NFRONT8*int(NPIVP1-1,8) + int(NPIV,8)
807 PIVOT = A(APOS)
808 ABS_PIVOT = abs(PIVOT)
809 IDIAG = APOS
810 CALL SMUMPS_UPDATE_MINMAX_PIVOT
811 & ( ABS_PIVOT, DKEEP, KEEP, .TRUE.)
812.LT. IF(ABS_PIVOTSEUIL) THEN
813.GE. IF (real(PIVOT) RZERO) THEN
814 A(APOS) = CSEUIL
815 ELSE
816 A(APOS) = -CSEUIL
817 ENDIF
818 NBTINYW = NBTINYW + 1
819.NE. ELSE IF (KEEP(258) 0) THEN
820 CALL SMUMPS_UPDATEDETER(PIVOT, DET_MANTW, DET_EXPW )
821 ENDIF
822 IF (OOC_EFFECTIVE_ON_FRONT) THEN
823.EQ. IF (KEEP(251)0) THEN
824 CALL SMUMPS_STORE_PERMINFO( IW(I_PIVRPTR_L),
825 & NBPANELS_L,
826 & IW(I_PIVR_L), NASS, NPIVP1, NPIVP1,
827 & PP_LastPanelonDisk_L,
828 & PP_LastPIVRPTRFilled_L)
829 ENDIF
830 CALL SMUMPS_STORE_PERMINFO( IW(I_PIVRPTR_U),
831 & NBPANELS_U,
832 & IW(I_PIVR_U), NASS, NPIVP1, NPIVP1,
833 & PP_LastPanelonDisk_U,
834 & PP_LastPIVRPTRFilled_U)
835 ENDIF
836 GO TO 420
837 ENDIF
838 INOPV = 0
839 ISHIFT = 0
840 IPIV_END = IEND_BLOCK
841.GE. IF (K2061) THEN
842.GT..AND..LE. IF (InextpivNPIVP1InextpivIEND_BLOCK) THEN
843 ISHIFT = Inextpiv - NPIVP1
844 ENDIF
845.EQ. IF ( K2061
846.OR..GT..AND..EQ. & (K206 1 IEND_BLOCKIEND_BLR) ) THEN
847 IPIV_END = IEND_BLOCK + ISHIFT
848 ENDIF
849 ENDIF
850 DO 460 IPIV_SHIFT = NPIVP1+ISHIFT, IPIV_END
851.LE. IF (IPIV_SHIFT IEND_BLOCK) THEN
852 IPIV=IPIV_SHIFT
853 ELSE
854 IPIV = IPIV_SHIFT-IEND_BLOCK-1+NPIVP1
855.EQ. IF (IBEG_BLOCKNPIVP1) THEN
856 EXIT
857 ENDIF
858 ENDIF
859 APOS = POSELT + NFRONT8*int(IPIV-1,8) + int(NPIV,8)
860 JMAX = 1
861.EQ..OR..EQ. IF ((PIVOT_OPTION0)(UURZERO)) THEN
862 ABS_PIVOT = abs(A(APOS))
863.LT. IF(ABS_PIVOTSEUIL) THEN
864 CALL SMUMPS_UPDATE_MINMAX_PIVOT
865 & ( ABS_PIVOT, DKEEP, KEEP, .TRUE.)
866.GE. IF (real(A(APOS)) RZERO) THEN
867 A(APOS) = CSEUIL
868 ELSE
869 A(APOS) = -CSEUIL
870 ENDIF
871 NBTINYW = NBTINYW + 1
872 GO TO 420
873.EQ. ELSE IF (ABS_PIVOTRZERO) THEN
874 GO TO 630
875 ENDIF
876 GO TO 380
877 ENDIF
878 AMROW = RZERO
879 J1 = APOS
880.EQ..OR..AND. IF (PIVOT_OPTION1 (LR_ACTIVATED
881.GE. & (KEEP(480)2
882 & ))) THEN
883 J = IEND_BLR - NPIV
884 ELSE
885 J = NASS - NPIV
886 ENDIF
887 J2 = J1 + J - 1_8
888 JMAX = SMUMPS_IXAMAX(J,A(J1),1,KEEP(361))
889 JJ = J1 + int(JMAX - 1,8)
890 AMROW = abs(A(JJ))
891 RMAX = AMROW
892.GE. IF (PIVOT_OPTION2) THEN
893 J1 = J2 + 1_8
894.GE. IF (PIVOT_OPTION3
895 & ) THEN
896 J2 = APOS +
897 & int(- NPIV + NFRONT - 1 - KEEP(253) - NVSCHUR,8)
898 ELSE
899 J2 = APOS +int(- NPIV + NASS - 1 ,8)
900 ENDIF
901.LT. IF (J2J1) GO TO 370
902.EQ. IF (KEEP(351)1) THEN
903!$ CHUNK = max(K361/2,(int(J2-J1)+NOMP-1)/NOMP)
904!$OMP PARALLEL DO schedule(static, CHUNK) PRIVATE(JJ)
905!$OMP& FIRSTPRIVATE(J1,J2)
906.GE.!$OMP& REDUCTION(max:RMAX) IF ((J2-J1)K361)
907 DO JJ=J1,J2
908 RMAX = max(abs(A(JJ)),RMAX)
909 ENDDO
910!$OMP END PARALLEL DO
911 ELSE
912 DO 360 JJ=J1,J2
913 RMAX = max(abs(A(JJ)),RMAX)
914 360 CONTINUE
915 ENDIF
916 370 CONTINUE
917 ENDIF
918 IDIAG = APOS + int(IPIV - NPIVP1,8)
919 ABS_PIVOT = abs(A(IDIAG))
920.NE. IF (PARPIV_T10) THEN
921 RMAX_NORELAX = real(A(APOSMAX+int(IPIV,8)))
922 ELSE
923 RMAX_NORELAX = RZERO
924 ENDIF
925 RMAX = max(RMAX,RMAX_NORELAX)
926.LE. IF ( RMAX PIVNUL ) THEN
927.EQ. IF (LAST_ROWNFRONT) THEN
928 LRLOC = LAST_ROW -KEEP(253)-NVSCHUR
929 ELSE
930 LRLOC = LAST_ROW
931 ENDIF
932.EQ. IF (NFRONT - KEEP(253) NASS) THEN
933.NE. IF (IEND_BLOCKNASS ) THEN
934 GOTO 460
935 ENDIF
936 J1=POSELT+int(IPIV-1,8)+int(NPIV,8)*NFRONT8
937 J2=POSELT+int(IPIV-1,8)+int(LRLOC-1,8)*NFRONT8
938 ELSE
939 J1=POSELT+int(IPIV-1,8)
940 J2=POSELT+int(IPIV-1,8)+int(LRLOC-1,8)*NFRONT8
941 ENDIF
942 DO JJ=J1, J2, NFRONT8
943.GT. IF ( abs(A(JJ)) PIVNUL ) THEN
944 GOTO 460
945 END IF
946 ENDDO
947.NE. IF ((PARPIV_T10)
948.AND..NE. & (PARPIV_T1-1)
949.AND..LT. & (RMAX_NORELAX0)
950.AND..GT. & (IPIV1)) THEN
951 MAX_PREV_in_PARPIV = RZERO
952 DO JJ=1,IPIV-1
953 MAX_PREV_in_PARPIV= max ( MAX_PREV_in_PARPIV,
954 & real(A(APOSMAX+int(JJ,8))) )
955 ENDDO
956.GT. IF (MAX_PREV_in_PARPIVPIVNUL) THEN
957 APOSROW = POSELT + NFRONT8*int(IPIV-1,8)
958 DO JJ=1,IPIV-1
959.GT. IF (abs(A(APOSROW+JJ-1))PIVNUL) GOTO 460
960 ENDDO
961 ENDIF
962 ENDIF
963 CALL SMUMPS_UPDATE_MINMAX_PIVOT
964 & ( ABS_PIVOT, DKEEP, KEEP, .TRUE.)
965!$OMP ATOMIC CAPTURE
966 KEEP(109) = KEEP(109)+1
967 IPIVNUL = KEEP(109)
968!$OMP END ATOMIC
969 PIVNUL_LIST(IPIVNUL) = IW( IOLDPS+HF+NPIV+IPIV-NPIVP1 )
970.GT. IF(real(FIXA)RZERO) THEN
971.GE. IF(real(A(IDIAG)) RZERO) THEN
972 A(IDIAG) = FIXA
973 ELSE
974 A(IDIAG) = -FIXA
975 ENDIF
976 ELSE
977 J1 = APOS
978 J2 = APOS +
979 & int(- NPIV + NFRONT - 1 - KEEP(253),8)
980 DO JJ=J1,J2
981 A(JJ) = ZERO
982 ENDDO
983 A(IDIAG) = -FIXA
984 ENDIF
985 JMAX = IPIV - NPIV
986 GOTO 385
987 ENDIF
988 RMAX = max(RMAX,abs(RMAX_NORELAX))
989.GE..AND. IF (ABS_PIVOT UU*RMAX
990.GT. & ABS_PIVOT max(SEUIL,tiny(RMAX))) THEN
991 JMAX = IPIV - NPIV
992 GO TO 380
993 ENDIF
994.NOT..GE..AND. IF ( (AMROW UU*RMAX
995.GT. & AMROW max(SEUIL,tiny(RMAX))) ) GO TO 460
996 NOFFW = NOFFW + 1
997 380 CONTINUE
998.GE. IF (K2061) THEN
999 Inextpiv = IPIV + 1
1000 ENDIF
1001 CALL SMUMPS_UPDATE_MINMAX_PIVOT
1002 & ( abs(A(APOS+int(JMAX-1,8))),
1003 & DKEEP, KEEP, .FALSE.)
1004.NE. IF (KEEP(258) 0) THEN
1005 CALL SMUMPS_UPDATEDETER( A(APOS+int(JMAX-1,8)),
1006 & DET_MANTW,
1007 & DET_EXPW )
1008 ENDIF
1009 385 CONTINUE
1010.EQ. IF (IPIVNPIVP1) GO TO 400
1011.EQ. IF (KEEP(405) 0) THEN
1012 KEEP8(80) = KEEP8(80)+1
1013 ELSE
1014!$OMP ATOMIC UPDATE
1015 KEEP8(80) = KEEP8(80)+1
1016!$OMP END ATOMIC
1017 ENDIF
1018.NE. IF (PARPIV_T10) THEN
1019 SWOP = A(APOSMAX+int(NPIVP1,8))
1020 A(APOSMAX+int(NPIVP1,8)) = A(APOSMAX+int(IPIV,8))
1021 A(APOSMAX+int(IPIV,8)) = SWOP
1022 ENDIF
1023 DET_SIGNW = - DET_SIGNW
1024 J1 = POSELT + int(NPIV,8)*NFRONT8
1025 J2 = J1 + NFRONT8 - 1_8
1026 J3 = POSELT + int(IPIV-1,8)*NFRONT8
1027 DO 390 JJ=J1,J2
1028 SWOP = A(JJ)
1029 A(JJ) = A(J3)
1030 A(J3) = SWOP
1031 J3 = J3 + 1_8
1032 390 CONTINUE
1033 ISWPS1 = IOLDPS + HF - 1 + NPIVP1
1034 ISWPS2 = IOLDPS + HF - 1 + IPIV
1035 ISW = IW(ISWPS1)
1036 IW(ISWPS1) = IW(ISWPS2)
1037 IW(ISWPS2) = ISW
1038.EQ. 400 IF (JMAX1) GO TO 420
1039 DET_SIGNW = - DET_SIGNW
1040 IF ( present(TIPIV) ) THEN
1041 TIPIV(ILOC) = ILOC + JMAX - 1
1042 ENDIF
1043 J1 = POSELT + int(NPIV,8)
1044 J2 = POSELT + int(NPIV + JMAX - 1,8)
1045 DO 410 KSW=1,LAST_ROW
1046 SWOP = A(J1)
1047 A(J1) = A(J2)
1048 A(J2) = SWOP
1049 J1 = J1 + NFRONT8
1050 J2 = J2 + NFRONT8
1051 410 CONTINUE
1052 ISWPS1 = IOLDPS + HF - 1 + NFRONT + NPIV + 1
1053 ISWPS2 = IOLDPS + HF - 1 + NFRONT + NPIV + JMAX
1054 ISW = IW(ISWPS1)
1055 IW(ISWPS1) = IW(ISWPS2)
1056 IW(ISWPS2) = ISW
1057 GO TO 420
1058 460 CONTINUE
1059.GE. IF (K206 1) THEN
1060 Inextpiv=IEND_BLOCK+1
1061 ENDIF
1062.EQ. IF (IEND_BLOCKNASS) THEN
1063 INOPV = 1
1064 ELSE
1065 INOPV = 2
1066 ENDIF
1067 GO TO 430
1068 630 CONTINUE
1069 IFLAG = -10
1070 GOTO 430
1071 420 CONTINUE
1072 IF (OOC_EFFECTIVE_ON_FRONT) THEN
1073.EQ. IF (KEEP(251)0) THEN
1074 CALL SMUMPS_STORE_PERMINFO( IW(I_PIVRPTR_L),
1075 & NBPANELS_L,
1076 & IW(I_PIVR_L), NASS, NPIVP1, IPIV,
1077 & PP_LastPanelonDisk_L,
1078 & PP_LastPIVRPTRFilled_L)
1079 ENDIF
1080 CALL SMUMPS_STORE_PERMINFO( IW(I_PIVRPTR_U),
1081 & NBPANELS_U,
1082 & IW(I_PIVR_U), NASS, NPIVP1, NPIV+JMAX,
1083 & PP_LastPanelonDisk_U,
1084 & PP_LastPIVRPTRFilled_U)
1085 ENDIF
1086 430 CONTINUE
1087 RETURN
1088 END SUBROUTINE SMUMPS_FAC_I
1089 SUBROUTINE SMUMPS_FAC_I_LDLT
1090 & ( NFRONT,NASS,INODE,IBEG_BLOCK,IEND_BLOCK,
1091 & IW,LIW, A,LA, INOPV,
1092 & NNEGW, NB22T1W, NBTINYW,
1093 & DET_EXPW, DET_MANTW, DET_SIGNW,
1094 & IFLAG,IOLDPS,POSELT,UU, SEUIL,KEEP,KEEP8,PIVSIZ,
1095 & DKEEP,PIVNUL_LIST,LPN_LIST, XSIZE,
1096 & PP_FIRST2SWAP_L, PP_LastPanelonDisk,
1097 & PP_LastPIVRPTRIndexFilled,MAXFROMM,IS_MAXFROMM_AVAIL,
1098 & PIVOT_OPTION, IEND_BLR, Inextpiv,
1099 & OOC_EFFECTIVE_ON_FRONT,
1100 & NVSCHUR, PARPIV_T1, LR_ACTIVATED
1101 & )
1102!$ USE OMP_LIB
1103 USE MUMPS_OOC_COMMON
1104 IMPLICIT NONE
1105 INTEGER(8) :: POSELT, LA
1106 INTEGER NFRONT,NASS,LIW,INODE,IFLAG,INOPV,
1107 & IOLDPS
1108 INTEGER, intent(inout) :: NNEGW, NB22T1W, NBTINYW
1109 INTEGER, intent(inout) :: DET_EXPW, DET_SIGNW
1110 REAL, intent(inout) :: DET_MANTW
1111 INTEGER, intent(in) :: IBEG_BLOCK, IEND_BLOCK
1112 INTEGER, intent(in) :: PIVOT_OPTION,IEND_BLR
1113 INTEGER, intent(inout) :: Inextpiv
1114 LOGICAL, intent(in) :: OOC_EFFECTIVE_ON_FRONT
1115 INTEGER PIVSIZ,LPIV, XSIZE
1116 REAL A(LA)
1117 REAL UU, UULOC, SEUIL
1118 INTEGER IW(LIW)
1119 INTEGER KEEP(500)
1120 INTEGER(8) KEEP8(150)
1121 INTEGER LPN_LIST
1122 INTEGER PIVNUL_LIST(LPN_LIST)
1123 REAL DKEEP(230)
1124 INTEGER PP_FIRST2SWAP_L, PP_LastPanelonDisk
1125 INTEGER PP_LastPIVRPTRIndexFilled
1126 REAL, intent(in) :: MAXFROMM
1127 LOGICAL, intent(inout) :: IS_MAXFROMM_AVAIL
1128 INTEGER, intent(in) :: NVSCHUR
1129 INTEGER, intent(in) :: PARPIV_T1
1130 LOGICAL, intent(in) :: LR_ACTIVATED
1131 include 'mpif.h'
1132 INTEGER (8) :: POSPV1,POSPV2,OFFDAG,APOSJ
1133 INTEGER JMAX, LIM, LIM_SWAP
1134 REAL RMAX,AMAX,TMAX, MAX_PREV_in_PARPIV, ABS_PIVOT
1135 REAL RMAX_NORELAX, TMAX_NORELAX, UULOCM1
1136 INTEGER(8) :: APOSMAX, APOSROW
1137 REAL MAXPIV
1138 REAL PIVNUL
1139 REAL MAXFROMM_UPDATED
1140 REAL FIXA, CSEUIL
1141 REAL PIVOT,DETPIV
1142 REAL ABSDETPIV
1143 INCLUDE 'mumps_headers.h'
1144 INTEGER :: HF, IPIVNUL
1145 INTEGER :: J
1146 INTEGER(8) :: APOS, J1, J2, JJ, NFRONT8, KK, J1_ini, JJ_ini
1147 INTEGER :: LDA
1148 INTEGER(8) :: LDA8
1149 INTEGER NPIV,IPIV
1150 INTEGER NPIVP1,K
1151 INTEGER :: ISHIFT, K206, IPIV_SHIFT, IPIV_END
1152 INTRINSIC max
1153 REAL ZERO, ONE
1154 PARAMETER( ZERO = 0.0E0 )
1155 PARAMETER( ONE = 1.0E0 )
1156 REAL RZERO,RONE
1157 PARAMETER(RZERO=0.0E0, RONE=1.0E0)
1158#if defined(_OPENMP)
1159 LOGICAL :: OMP_FLAG
1160 INTEGER :: NOMP, CHUNK, J1_end
1161#endif
1162 INTEGER I_PIVRPTR, I_PIVR, NBPANELS_L
1163!$ NOMP = OMP_GET_MAX_THREADS()
1164 PIVNUL = DKEEP(1)
1165 FIXA = DKEEP(2)
1166 CSEUIL = SEUIL
1167 LDA = NFRONT
1168 LDA8 = int(LDA,8)
1169 NFRONT8 = int(NFRONT,8)
1170 K206 = KEEP(206)
1171 UULOC = UU
1172.GT. IF (UULOCRZERO) THEN
1173 UULOCM1 = RONE/UULOC
1174 ELSE
1175 UULOCM1 = RONE
1176 ENDIF
1177 HF = 6 + XSIZE
1178.NE..AND. IF (KEEP(50)1 OOC_EFFECTIVE_ON_FRONT) THEN
1179 CALL SMUMPS_GET_OOC_PERM_PTR(TYPEF_L, NBPANELS_L,
1180 & I_PIVRPTR, I_PIVR, IOLDPS+2*NFRONT+6+KEEP(IXSZ),
1181 & IW, LIW)
1182 ENDIF
1183 PIVSIZ = 1
1184 NPIV = IW(IOLDPS+1+XSIZE)
1185 NPIVP1 = NPIV + 1
1186 APOSMAX = POSELT+LDA8*LDA8-1_8
1187.EQ. IF(INOPV -1) THEN
1188 APOS = POSELT + (LDA8+1_8) * int(NPIV,8)
1189 POSPV1 = APOS
1190 CALL SMUMPS_UPDATE_MINMAX_PIVOT
1191 & ( abs(A(APOS)), DKEEP, KEEP, .TRUE.)
1192.LT. IF(abs(A(APOS))SEUIL) THEN
1193.GE. IF(real(A(APOS)) RZERO) THEN
1194 A(APOS) = CSEUIL
1195 ELSE
1196 A(APOS) = -CSEUIL
1197 NNEGW = NNEGW+1
1198 ENDIF
1199 NBTINYW = NBTINYW + 1
1200 ELSE
1201.NE. IF (KEEP(258) 0) THEN
1202 CALL SMUMPS_UPDATEDETER( A(APOS), DET_MANTW, DET_EXPW )
1203 ENDIF
1204 ENDIF
1205.NE..AND. IF (KEEP(50)1 OOC_EFFECTIVE_ON_FRONT) THEN
1206 CALL SMUMPS_STORE_PERMINFO( IW(I_PIVRPTR), NBPANELS_L,
1207 & IW(I_PIVR), NASS, NPIVP1, NPIVP1,
1208 & PP_LastPanelonDisk,
1209 & PP_LastPIVRPTRIndexFilled)
1210 ENDIF
1211 GO TO 420
1212 ENDIF
1213 INOPV = 0
1214 ISHIFT = 0
1215 IPIV_END = IEND_BLOCK
1216.GE. IF (K2061) THEN
1217.GT..AND..LE. IF (InextpivNPIVP1InextpivIEND_BLOCK) THEN
1218 ISHIFT = Inextpiv - NPIVP1
1219 ENDIF
1220.EQ. IF ( K2061
1221.OR..GT..AND..EQ. & (K206 1 IEND_BLOCKIEND_BLR) ) THEN
1222 IPIV_END = IEND_BLOCK + ISHIFT
1223 ENDIF
1224.GT..AND. IF (ISHIFT0IS_MAXFROMM_AVAIL) THEN
1225 IPIV = NPIVP1
1226 APOS = POSELT + LDA8*int(IPIV-1,8) + int(NPIV,8)
1227 POSPV1 = APOS + int(IPIV - NPIVP1,8)
1228 PIVOT = A(POSPV1)
1229.GT. IF ( MAXFROMM PIVNUL ) THEN
1230.NE. IF (PARPIV_T10) THEN
1231 MAXFROMM_UPDATED = max
1232 & ( MAXFROMM,
1233 & abs(real(A(APOSMAX+int(IPIV,8))))
1234 & )
1235 ELSE
1236 MAXFROMM_UPDATED = MAXFROMM
1237 ENDIF
1238.GE..AND. IF ( (abs(PIVOT) UULOC*MAXFROMM_UPDATED)
1239.GT. & abs(PIVOT) max(SEUIL,tiny(MAXFROMM_UPDATED))
1240 & ) THEN
1241 ISHIFT = 0
1242 ENDIF
1243 ENDIF
1244 ENDIF
1245.GT. IF ( ISHIFT 0) THEN
1246 IS_MAXFROMM_AVAIL = .FALSE.
1247 ENDIF
1248 ENDIF
1249 DO 460 IPIV_SHIFT = NPIVP1+ISHIFT, IPIV_END
1250.LE. IF (IPIV_SHIFT IEND_BLOCK) THEN
1251 IPIV=IPIV_SHIFT
1252 ELSE
1253 IPIV = IPIV_SHIFT-IEND_BLOCK-1+NPIVP1
1254.EQ. IF (IBEG_BLOCKNPIVP1) THEN
1255 EXIT
1256 ENDIF
1257 ENDIF
1258 APOS = POSELT + LDA8*int(IPIV-1,8) + int(NPIV,8)
1259 POSPV1 = APOS + int(IPIV - NPIVP1,8)
1260 PIVOT = A(POSPV1)
1261 ABS_PIVOT = abs(PIVOT)
1262.EQ..OR..EQ. IF (UULOCRZEROPIVOT_OPTION0) THEN
1263.LT. IF(ABS_PIVOTSEUIL) THEN
1264 CALL SMUMPS_UPDATE_MINMAX_PIVOT
1265 & ( ABS_PIVOT, DKEEP, KEEP, .TRUE.)
1266.GE. IF(real(PIVOT) RZERO) THEN
1267 A(POSPV1) = CSEUIL
1268 ELSE
1269 A(POSPV1) = -CSEUIL
1270 NNEGW = NNEGW+1
1271 ENDIF
1272 NBTINYW = NBTINYW + 1
1273.EQ. ELSE IF (ABS_PIVOTRZERO) THEN
1274 GO TO 630
1275 ELSE
1276.LT. IF (PIVOTRZERO) NNEGW = NNEGW+1
1277 CALL SMUMPS_UPDATE_MINMAX_PIVOT
1278 & ( ABS_PIVOT, DKEEP, KEEP, .FALSE.)
1279.NE. IF (KEEP(258) 0) THEN
1280 CALL SMUMPS_UPDATEDETER(PIVOT, DET_MANTW, DET_EXPW )
1281 ENDIF
1282 ENDIF
1283 GO TO 420
1284 ENDIF
1285 IF ( IS_MAXFROMM_AVAIL ) THEN
1286.GT. IF ( MAXFROMM PIVNUL ) THEN
1287.NE. IF (PARPIV_T10) THEN
1288 MAXFROMM_UPDATED = max
1289 & ( MAXFROMM,
1290 & abs(real(A(APOSMAX+int(IPIV,8))))
1291 & )
1292 ELSE
1293 MAXFROMM_UPDATED = MAXFROMM
1294 ENDIF
1295.GE..AND. IF ( (ABS_PIVOT UULOC*MAXFROMM_UPDATED)
1296.GT. & (ABS_PIVOT max(SEUIL,tiny(MAXFROMM_UPDATED)))
1297 & ) THEN
1298.LT. IF (PIVOT RZERO) NNEGW = NNEGW+1
1299 CALL SMUMPS_UPDATE_MINMAX_PIVOT
1300 & ( ABS_PIVOT,
1301 & DKEEP, KEEP, .FALSE.)
1302.NE. IF (KEEP(258) 0) THEN
1303 CALL SMUMPS_UPDATEDETER(PIVOT, DET_MANTW, DET_EXPW )
1304 ENDIF
1305 GOTO 415
1306 ENDIF
1307 ENDIF
1308 IS_MAXFROMM_AVAIL = .FALSE.
1309 ENDIF
1310 AMAX = -RONE
1311 JMAX = 0
1312.EQ. IF (PIVOT_OPTION3
1313 & ) THEN
1314 LIM = NFRONT - KEEP(253)-NVSCHUR
1315.GE. ELSEIF (PIVOT_OPTION2
1316 & ) THEN
1317 LIM = NASS
1318.GE. ELSEIF (PIVOT_OPTION1) THEN
1319 LIM = IEND_BLR
1320 ELSE
1321 write(*,*) 'internal error in fac_i_ldlt 1x1:',
1322 & PIVOT_OPTION
1323 CALL MUMPS_ABORT()
1324 ENDIF
1325 J1 = APOS
1326 J2 = POSPV1 - 1_8
1327 DO JJ=J1,J2
1328.GT. IF(abs(A(JJ)) AMAX) THEN
1329 AMAX = abs(A(JJ))
1330 JMAX = IPIV - int(POSPV1-JJ)
1331 ENDIF
1332 ENDDO
1333 J1 = POSPV1 + LDA8
1334 DO J=1, IEND_BLOCK - IPIV
1335.GT. IF(abs(A(J1)) AMAX) THEN
1336 AMAX = abs(A(J1))
1337 JMAX = IPIV + J
1338 ENDIF
1339 J1 = J1 + LDA8
1340 ENDDO
1341 RMAX = RZERO
1342 J1_ini = J1
1343#if defined(_OPENMP)
1344 J1_end = LIM - IEND_BLOCK
1345 CHUNK = max(J1_end,1)
1346.GE. IF ( J1_endKEEP(360)) THEN
1347 OMP_FLAG = .TRUE.
1348 CHUNK = max(KEEP(360)/2,(J1_end+NOMP-1)/NOMP)
1349 ELSE
1350 OMP_FLAG = .FALSE.
1351 ENDIF
1352#endif
1353!$OMP PARALLEL DO SCHEDULE(static, CHUNK) PRIVATE(J1)
1354!$OMP& REDUCTION(max:RMAX) IF(OMP_FLAG)
1355 DO J=1, LIM - IEND_BLOCK
1356 J1 = J1_ini + int(J-1,8) * LDA8
1357 RMAX = max(abs(A(J1)),RMAX)
1358 ENDDO
1359!$OMP END PARALLEL DO
1360.NE. IF (PARPIV_T10) THEN
1361 RMAX_NORELAX = real(A(APOSMAX+int(IPIV,8)))
1362 ELSE
1363 RMAX_NORELAX = RZERO
1364 ENDIF
1365 RMAX = max(RMAX,RMAX_NORELAX)
1366.LE. IF (max(AMAX,RMAX,abs(PIVOT))PIVNUL) THEN
1367.NE. IF ((PARPIV_T10)
1368.AND..NE. & (PARPIV_T1-1)
1369.AND..LT. & (RMAX_NORELAX0)
1370.AND..GT. & (IPIV1)) THEN
1371 MAX_PREV_in_PARPIV = RZERO
1372 DO JJ=1,IPIV-1
1373 MAX_PREV_in_PARPIV= max ( MAX_PREV_in_PARPIV,
1374 & real(A(APOSMAX+int(JJ,8))) )
1375 ENDDO
1376.GT. IF (MAX_PREV_in_PARPIVPIVNUL) THEN
1377 APOSROW = POSELT + NFRONT8*int(IPIV-1,8)
1378 DO JJ=1,IPIV-1
1379.GT. IF (abs(A(APOSROW+JJ-1))PIVNUL) THEN
1380 GOTO 460
1381 ENDIF
1382 ENDDO
1383 ENDIF
1384 ENDIF
1385 CALL SMUMPS_UPDATE_MINMAX_PIVOT
1386 & ( abs(A(POSPV1)), DKEEP, KEEP, .TRUE.)
1387!$OMP ATOMIC CAPTURE
1388 KEEP(109) = KEEP(109) + 1
1389 IPIVNUL = KEEP(109)
1390!$OMP END ATOMIC
1391 PIVNUL_LIST(IPIVNUL) = IW( IOLDPS+HF+NPIV+IPIV-NPIVP1 )
1392.GT. IF(real(FIXA)RZERO) THEN
1393.GE. IF(real(PIVOT) RZERO) THEN
1394 A(POSPV1) = FIXA
1395 ELSE
1396 A(POSPV1) = -FIXA
1397 ENDIF
1398 ELSE
1399 J1 = APOS
1400 J2 = POSPV1 - 1_8
1401 DO JJ=J1,J2
1402 A(JJ) = ZERO
1403 ENDDO
1404 J1 = POSPV1 + LDA8
1405 DO J=1, IEND_BLOCK - IPIV
1406 A(J1) = ZERO
1407 J1 = J1 + LDA8
1408 ENDDO
1409 DO J=1,LIM - IEND_BLOCK
1410 A(J1) = ZERO
1411 J1 = J1 + LDA8
1412 ENDDO
1413 A(POSPV1) = ONE
1414 ENDIF
1415 PIVOT = A(POSPV1)
1416 GO TO 415
1417 ENDIF
1418 RMAX = max(RMAX,abs(RMAX_NORELAX))
1419.GE. IF ( abs(PIVOT)UULOC*max(RMAX,AMAX)
1420.AND..GT. & abs(PIVOT) max(SEUIL,tiny(RMAX)) ) THEN
1421.LT. IF (PIVOT ZERO) NNEGW = NNEGW+1
1422 CALL SMUMPS_UPDATE_MINMAX_PIVOT
1423 & ( abs(PIVOT),
1424 & DKEEP, KEEP, .FALSE.)
1425.NE. IF (KEEP(258) 0 ) THEN
1426 CALL SMUMPS_UPDATEDETER(PIVOT, DET_MANTW, DET_EXPW )
1427 ENDIF
1428 GO TO 415
1429 END IF
1430.EQ. IF (NPIVP1IEND_BLOCK) THEN
1431 GOTO 460
1432.EQ. ELSE IF (JMAX0) THEN
1433 GOTO 460
1434 ENDIF
1435.LE. IF (max(abs(PIVOT),RMAX,AMAX)tiny(RMAX)) THEN
1436 GOTO 460
1437 ENDIF
1438 IF (
1439.NE..AND..LE. & (KEEP(19)0)(max(AMAX,RMAX,abs(PIVOT))SEUIL)
1440 & )
1441 & THEN
1442 GO TO 460
1443 ENDIF
1444.LT. IF (RMAXAMAX) THEN
1445 J1 = APOS
1446 J2 = POSPV1 - 1_8
1447 DO JJ=J1,J2
1448.NE. IF(int(POSPV1-JJ) IPIV-JMAX) THEN
1449 RMAX = max(RMAX,abs(A(JJ)))
1450 ENDIF
1451 ENDDO
1452 J1 = POSPV1 + LDA8
1453 DO J=1,IEND_BLOCK-IPIV
1454.NE. IF(IPIV+J JMAX) THEN
1455 RMAX = max(abs(A(J1)),RMAX)
1456 ENDIF
1457 J1 = J1 + LDA8
1458 ENDDO
1459 ENDIF
1460 APOSJ = POSELT + int(JMAX-1,8)*LDA8 + int(NPIV,8)
1461 POSPV2 = APOSJ + int(JMAX - NPIVP1,8)
1462.LT. IF (IPIVJMAX) THEN
1463 OFFDAG = APOSJ + int(IPIV - NPIVP1,8)
1464 ELSE
1465 OFFDAG = APOS + int(JMAX - NPIVP1,8)
1466 END IF
1467 TMAX = RZERO
1468#if defined(_OPENMP)
1469 J1_end = LIM-JMAX
1470 CHUNK = max(J1_end,1)
1471.GE. IF (J1_endKEEP(360)) THEN
1472 OMP_FLAG = .TRUE.
1473 CHUNK = max(KEEP(360)/2,(J1_end+NOMP-1)/NOMP)
1474 ELSE
1475 OMP_FLAG = .FALSE.
1476 ENDIF
1477#endif
1478.LT. IF (JMAX IPIV) THEN
1479 JJ_ini = POSPV2
1480!$OMP PARALLEL DO SCHEDULE(static, CHUNK) IF (OMP_FLAG)
1481!$OMP& PRIVATE(JJ) REDUCTION(max:TMAX)
1482 DO K = 1, LIM - JMAX
1483 JJ = JJ_ini+ int(K,8)*NFRONT8
1484.NE. IF (JMAX+KIPIV) THEN
1485 TMAX=max(TMAX,abs(A(JJ)))
1486 ENDIF
1487 ENDDO
1488!$OMP END PARALLEL DO
1489 DO KK = APOSJ, POSPV2-1_8
1490 TMAX = max(TMAX,abs(A(KK)))
1491 ENDDO
1492 ELSE
1493 JJ_ini = POSPV2
1494!$OMP PARALLEL DO SCHEDULE(static, CHUNK) PRIVATE(JJ)
1495!$OMP& REDUCTION(max:TMAX) IF(OMP_FLAG)
1496 DO K = 1, LIM-JMAX
1497 JJ = JJ_ini + int(K,8)*NFRONT8
1498 TMAX=max(TMAX,abs(A(JJ)))
1499 ENDDO
1500!$OMP END PARALLEL DO
1501 DO KK = APOSJ, POSPV2 - 1_8
1502.NE. IF (KKOFFDAG) THEN
1503 TMAX = max(TMAX,abs(A(KK)))
1504 ENDIF
1505 ENDDO
1506 ENDIF
1507.NE. IF (PARPIV_T10) THEN
1508 TMAX_NORELAX = max(SEUIL*UULOCM1,
1509 & abs(real(A(APOSMAX+int(JMAX,8))))
1510 & )
1511 ELSE
1512 TMAX_NORELAX = SEUIL*UULOCM1
1513 ENDIF
1514 TMAX = max (TMAX,TMAX_NORELAX)
1515 DETPIV = A(POSPV1)*A(POSPV2) - A(OFFDAG)**2
1516 ABSDETPIV = abs(DETPIV)
1517.GT. IF (SEUILRZERO) THEN
1518.LE. IF (sqrt(ABSDETPIV) SEUIL ) THEN
1519 GOTO 460
1520 ENDIF
1521 ENDIF
1522 MAXPIV = max(abs(A(POSPV1)),abs(A(POSPV2)))
1523.EQ. IF (MAXPIVRZERO) MAXPIV = RONE
1524.GT. IF ((abs(A(POSPV2))*RMAX+AMAX*TMAX)*UULOC
1525.OR..EQ. & ABSDETPIV (ABSDETPIV RZERO) ) THEN
1526 GO TO 460
1527 ENDIF
1528.GT. IF ((abs(A(POSPV1))*TMAX+AMAX*RMAX)*UULOC
1529.OR..EQ. & ABSDETPIV (ABSDETPIV RZERO) ) THEN
1530 GO TO 460
1531 ENDIF
1532 CALL SMUMPS_UPDATE_MINMAX_PIVOT
1533 & ( sqrt(ABSDETPIV),
1534 & DKEEP, KEEP, .FALSE.)
1535.NE. IF (KEEP(258) 0 ) THEN
1536 CALL SMUMPS_UPDATEDETER(DETPIV, DET_MANTW, DET_EXPW )
1537 ENDIF
1538 PIVSIZ = 2
1539 NB22T1W = NB22T1W + 1
1540.LT. IF(DETPIV RZERO) THEN
1541 NNEGW = NNEGW+1
1542.LT. ELSE IF(A(POSPV2) RZERO) THEN
1543 NNEGW = NNEGW+2
1544 ENDIF
1545 415 CONTINUE
1546.GE. IF (K2061) THEN
1547 Inextpiv = max(NPIVP1+PIVSIZ, IPIV+1)
1548 ENDIF
1549 DO K=1,PIVSIZ
1550.EQ. IF (PIVSIZ 2) THEN
1551 IF (K==1) THEN
1552 LPIV = min(IPIV,JMAX)
1553 ELSE
1554 LPIV = max(IPIV,JMAX)
1555 ENDIF
1556 ELSE
1557 LPIV = IPIV
1558 ENDIF
1559.EQ. IF (LPIVNPIVP1) GOTO 416
1560.EQ. IF (KEEP(405) 0) THEN
1561 KEEP8(80) = KEEP8(80)+1
1562 ELSE
1563!$OMP ATOMIC UPDATE
1564 KEEP8(80) = KEEP8(80)+1
1565!$OMP END ATOMIC
1566 ENDIF
1567 LIM_SWAP = NFRONT
1568 CALL SMUMPS_SWAP_LDLT( A, LA, IW, LIW,
1569 & IOLDPS, NPIVP1, LPIV, POSELT, LIM_SWAP,
1570 & LDA, NFRONT, 1, PARPIV_T1, KEEP(50),
1571 & KEEP(IXSZ), -9999)
1572 416 CONTINUE
1573.NE..AND. IF (KEEP(50)1 OOC_EFFECTIVE_ON_FRONT) THEN
1574 CALL SMUMPS_STORE_PERMINFO( IW(I_PIVRPTR), NBPANELS_L,
1575 & IW(I_PIVR), NASS, NPIVP1, LPIV, PP_LastPanelonDisk,
1576 & PP_LastPIVRPTRIndexFilled)
1577 ENDIF
1578 NPIVP1 = NPIVP1 + 1
1579 ENDDO
1580.EQ. IF(PIVSIZ 2) THEN
1581 A(POSELT+(LDA8+1_8)*int(NPIV,8)+1_8) = DETPIV
1582 ENDIF
1583 GOTO 420
1584 460 CONTINUE
1585.GE. IF (K206 1) THEN
1586 Inextpiv=IEND_BLOCK+1
1587 ENDIF
1588.EQ. IF (IEND_BLOCKNASS) THEN
1589 INOPV = 1
1590 ELSE
1591 INOPV = 2
1592 ENDIF
1593 GO TO 420
1594 630 CONTINUE
1595 PIVSIZ = 0
1596 IFLAG = -10
1597 420 CONTINUE
1598 IS_MAXFROMM_AVAIL = .FALSE.
1599 RETURN
1600 END SUBROUTINE SMUMPS_FAC_I_LDLT
1601 SUBROUTINE SMUMPS_FAC_MQ_LDLT(IEND_BLOCK,
1602 & NFRONT,NASS,NPIV,INODE,
1603 & A,LA,LDA,
1604 & POSELT,IFINB,PIVSIZ,
1605 & MAXFROMM, IS_MAXFROMM_AVAIL, IS_MAX_USEFUL,
1606 & PARPIV_T1, LAST_ROW, IEND_BLR, NVSCHUR_K253,
1607 & LR_ACTIVATED
1608 & )
1609 IMPLICIT NONE
1610 INTEGER, intent(out):: IFINB
1611 INTEGER, intent(in) :: INODE, NFRONT, NASS, NPIV
1612 INTEGER, intent(in) :: IEND_BLOCK
1613 INTEGER, intent(in) :: LDA
1614 INTEGER(8), intent(in) :: LA
1615 REAL, intent(inout) :: A(LA)
1616 INTEGER, intent(in) :: LAST_ROW
1617 INTEGER, intent(in) :: IEND_BLR
1618 INTEGER(8) :: POSELT
1619 REAL, intent(out) :: MAXFROMM
1620 LOGICAL, intent(out) :: IS_MAXFROMM_AVAIL
1621 LOGICAL, intent(in) :: IS_MAX_USEFUL
1622 INTEGER, intent(in) :: PARPIV_T1
1623 INTEGER, INTENT(in) :: NVSCHUR_K253
1624 LOGICAL, intent(in) :: LR_ACTIVATED
1625 REAL VALPIV
1626 REAL :: MAXFROMMTMP
1627 INTEGER NCB1
1628 INTEGER(8) :: NFRONT8
1629 INTEGER(8) :: LDA8
1630 INTEGER(8) :: K1POS
1631 INTEGER NEL2
1632 REAL ONE, ZERO
1633 REAL A11,A22,A12
1634 INTEGER(8) :: APOS, LPOS, LPOS1, LPOS2
1635 INTEGER(8) :: POSPV1, POSPV2
1636 INTEGER :: PIVSIZ,NPIV_NEW,J2,I
1637 INTEGER(8) :: OFFDAG, OFFDAG_OLD, K1, K2, IROW
1638#if defined(__ve__)
1639 INTEGER(8) :: J2_8, KU1, KU2
1640#else
1641 INTEGER(8) :: IBEG, IEND, JJ_LOC, JJ, ROW_SHIFT
1642 INTEGER(8) :: IBEG_LOC, IEND_LOC
1643#endif
1644 REAL SWOP,DETPIV,MULT1,MULT2
1645 INTEGER(8) :: APOSMAX
1646!$ LOGICAL :: OMP_FLAG
1647 INCLUDE 'mumps_headers.h'
1648 PARAMETER(ONE = 1.0E0,
1649 & ZERO = 0.0E0)
1650 LDA8 = int(LDA,8)
1651 NFRONT8 = int(NFRONT,8)
1652 NPIV_NEW = NPIV + PIVSIZ
1653 IFINB = 0
1654 IS_MAXFROMM_AVAIL = .FALSE.
1655 NCB1 = LAST_ROW - IEND_BLOCK
1656 NEL2 = IEND_BLOCK - NPIV_NEW
1657.EQ. IF (NEL20) THEN
1658.EQ. IF (IEND_BLOCKNASS) THEN
1659 IFINB = -1
1660 ELSE
1661 IFINB = 1
1662 ENDIF
1663 ENDIF
1664 MAXFROMM = 0.0E0
1665.EQ. IF(PIVSIZ 1) THEN
1666 APOS = POSELT + int(NPIV,8)*(NFRONT8 + 1_8)
1667 VALPIV = ONE/A(APOS)
1668 LPOS = APOS + LDA8
1669#if defined(__ve__)
1670.GT. IF (NEL2+NCB10) THEN
1671!$ OMP_FLAG = (NCB1 + NEL2> 300)
1672!$OMP PARALLEL DO PRIVATE(I,K1POS) IF (OMP_FLAG)
1673!NEC$ IVDEP
1674 DO I=1, NEL2 + NCB1
1675 K1POS = LPOS+ int(I-1,8)*LDA8
1676 A(APOS+int(I,8))=A(K1POS)
1677 ENDDO
1678!$OMP END PARALLEL DO
1679!$OMP PARALLEL DO PRIVATE(I,K1POS) IF (OMP_FLAG)
1680!NEC$ IVDEP
1681 DO I=1, NEL2 + NCB1
1682 K1POS = LPOS+ int(I-1,8)*LDA8
1683 A(K1POS) = A(K1POS) * VALPIV
1684 ENDDO
1685!$OMP END PARALLEL DO
1686.NOT. IF ( IS_MAX_USEFUL) THEN
1687.AND..GE.!$ OMP_FLAG = (NCB1 > 300)(NEL22)
1688!$OMP PARALLEL DO PRIVATE(I,J2,J2_8,K1POS) IF (OMP_FLAG)
1689!NEC$ IVDEP
1690 DO J2 = 1, NEL2
1691 J2_8 = int(J2,8)
1692!NEC$ IVDEP
1693 DO I=J2, NEL2 + NCB1
1694 K1POS = LPOS+ int(I-1,8)*LDA8
1695 A(K1POS+J2_8)=A(K1POS+J2_8)-(A(K1POS)*A(APOS+J2_8))
1696 ENDDO
1697 ENDDO
1698!$OMP END PARALLEL DO
1699 ELSE
1700.GT. IF (NEL20) THEN
1701 MAXFROMMTMP=0.0E0
1702!$ OMP_FLAG = (NCB1+NEL2 > 300)
1703!$OMP PARALLEL DO PRIVATE(I,K1POS) IF (OMP_FLAG)
1704!$OMP& REDUCTION(max:MAXFROMMTMP)
1705!NEC$ IVDEP
1706 DO I=1, NEL2 + NCB1 - NVSCHUR_K253
1707 K1POS = LPOS+ int(I-1,8)*LDA8
1708 A(K1POS+1_8)=A(K1POS+1_8) - A(K1POS) * A(APOS+1_8)
1709 MAXFROMMTMP=max(MAXFROMMTMP, abs(A(K1POS+1_8)))
1710 ENDDO
1711 !$OMP END PARALLEL DO
1712 IS_MAXFROMM_AVAIL = .TRUE.
1713 MAXFROMM=max(MAXFROMM, MAXFROMMTMP)
1714.GT. IF (NVSCHUR_K2530) THEN
1715 DO I= NEL2 + NCB1- NVSCHUR_K253 +1, NEL2 + NCB1
1716 K1POS = LPOS+ int(I-1,8)*LDA8
1717 A(K1POS+1_8)=A(K1POS+1_8) - A(K1POS) * A(APOS+1_8)
1718 ENDDO
1719 ENDIF
1720 ENDIF
1721.GT. IF (NEL21) THEN
1722.AND..GE.!$ OMP_FLAG = (NCB1+NEL2 > 300)(NEL23)
1723!$OMP PARALLEL DO PRIVATE(I,J2,J2_8,K1POS) IF (OMP_FLAG)
1724!NEC$ IVDEP
1725 DO J2 = 2, NEL2
1726 J2_8 = int(J2,8)
1727!NEC$ IVDEP
1728 DO I=J2, NEL2 + NCB1
1729 K1POS = LPOS+ int(I-1,8)*LDA8
1730 A(K1POS+J2_8)=A(K1POS+J2_8)-(A(K1POS)*A(APOS+J2_8))
1731 ENDDO
1732 ENDDO
1733!$OMP END PARALLEL DO
1734 ENDIF
1735 ENDIF
1736 ENDIF
1737#else
1738 IF (NEL2 > 0) THEN
1739.NOT. IF ( IS_MAX_USEFUL) THEN
1740 DO I=1, NEL2
1741 K1POS = LPOS + int(I-1,8)*LDA8
1742 A(APOS+int(I,8))=A(K1POS)
1743 A(K1POS) = A(K1POS) * VALPIV
1744 DO JJ=1_8, int(I,8)
1745 A(K1POS+JJ)=A(K1POS+JJ) - A(K1POS) * A(APOS+JJ)
1746 ENDDO
1747 ENDDO
1748 ELSE
1749 IS_MAXFROMM_AVAIL = .TRUE.
1750 DO I=1, NEL2
1751 K1POS = LPOS + int(I-1,8)*LDA8
1752 A(APOS+int(I,8))=A(K1POS)
1753 A(K1POS) = A(K1POS) * VALPIV
1754 A(K1POS+1_8)=A(K1POS+1_8) - A(K1POS) * A(APOS+1_8)
1755 MAXFROMM=max( MAXFROMM,abs(A(K1POS+1_8)) )
1756 DO JJ = 2_8, int(I,8)
1757 A(K1POS+JJ)=A(K1POS+JJ) - A(K1POS) * A(APOS+JJ)
1758 ENDDO
1759 ENDDO
1760 ENDIF
1761 ENDIF
1762.GT. IF (NCB10) THEN
1763.NOT. IF ( IS_MAX_USEFUL) THEN
1764!$OMP PARALLEL DO PRIVATE(JJ,K1POS) IF (NCB1 > 300)
1765 DO I=NEL2+1, NEL2 + NCB1
1766 K1POS = LPOS+ int(I-1,8)*LDA8
1767 A(APOS+int(I,8))=A(K1POS)
1768 A(K1POS) = A(K1POS) * VALPIV
1769 DO JJ = 1_8, int(NEL2,8)
1770 A(K1POS+JJ)=A(K1POS+JJ) - A(K1POS) * A(APOS+JJ)
1771 ENDDO
1772 ENDDO
1773!$OMP END PARALLEL DO
1774 ELSE
1775 MAXFROMMTMP=0.0E0
1776!$ OMP_FLAG = (NCB1-NVSCHUR_K253>300)
1777!$OMP PARALLEL DO PRIVATE(JJ,K1POS)
1778!$OMP& REDUCTION(max:MAXFROMMTMP) IF (OMP_FLAG)
1779 DO I=NEL2+1, NEL2 + NCB1 - NVSCHUR_K253
1780 K1POS = LPOS+ int(I-1,8)*LDA8
1781 A(APOS+int(I,8))=A(K1POS)
1782 A(K1POS) = A(K1POS) * VALPIV
1783 IF (NEL2 > 0) THEN
1784 A(K1POS+1_8) = A(K1POS+1_8) - A(K1POS) * A(APOS+1_8)
1785 MAXFROMMTMP=max(MAXFROMMTMP, abs(A(K1POS+1_8)))
1786 DO JJ = 2_8, int(NEL2,8)
1787 A(K1POS+JJ)=A(K1POS+JJ) - A(K1POS) * A(APOS+JJ)
1788 ENDDO
1789 ENDIF
1790 ENDDO
1791!$OMP END PARALLEL DO
1792 DO I = NEL2 + NCB1 - NVSCHUR_K253 + 1, NEL2 + NCB1
1793 K1POS = LPOS+ int(I-1,8)*LDA8
1794 A(APOS+int(I,8))=A(K1POS)
1795 A(K1POS) = A(K1POS) * VALPIV
1796 DO JJ = 1_8, int(NEL2,8)
1797 A(K1POS+JJ)=A(K1POS+JJ) - A(K1POS) * A(APOS+JJ)
1798 ENDDO
1799 ENDDO
1800 MAXFROMM=max(MAXFROMM, MAXFROMMTMP)
1801 ENDIF
1802 ENDIF
1803#endif
1804 ELSE
1805 POSPV1 = POSELT + int(NPIV,8)*(NFRONT8 + 1_8)
1806 POSPV2 = POSPV1 + NFRONT8 + 1_8
1807 OFFDAG_OLD = POSPV2 - 1_8
1808 OFFDAG = POSPV1 + 1_8
1809 SWOP = A(POSPV2)
1810 DETPIV = A(OFFDAG)
1811 A22 = A(POSPV1)/DETPIV
1812 A11 = SWOP/DETPIV
1813 A12 = -A(OFFDAG_OLD)/DETPIV
1814 A(OFFDAG) = A(OFFDAG_OLD)
1815 A(OFFDAG_OLD) = ZERO
1816 LPOS1 = POSPV2 + LDA8 - 1_8
1817 LPOS2 = LPOS1 + 1_8
1818#if defined(__ve__)
1819#if defined(check)
1820.NE. IF (LDA8NFRONT8) CALL MUMPS_ABORT()
1821.NE. IF (NEL2 + NCB1LAST_ROW-NPIV_NEW) CALL MUMPS_ABORT()
1822#endif
1823 CALL scopy(LAST_ROW-NPIV_NEW, A(LPOS1), LDA, A(POSPV1+2_8), 1)
1824 CALL scopy(LAST_ROW-NPIV_NEW, A(LPOS2), LDA, A(POSPV2+1_8), 1)
1825!$ OMP_FLAG = (NEL2+NCB1 > 300)
1826!$OMP PARALLEL DO PRIVATE(J2,J2_8,I,K1,K2,KU1,KU2)
1827!$OMP& IF (OMP_FLAG)
1828!NEC$ IVDEP
1829 DO J2=1, NEL2 + NCB1
1830 J2_8 = int(J2,8)
1831 KU1 = POSPV1 + 2_8 + (J2_8-1_8)
1832 KU2 = POSPV2 + 1_8 + (J2_8-1_8)
1833 K1 = LPOS1 + (J2_8-1_8)*NFRONT8
1834 K2 = K1 + 1_8
1835 A(K1) = A11*A(KU1)+A12*A(KU2)
1836 A(K2) = A12*A(KU1)+A22*A(KU2)
1837 ENDDO
1838.GT. IF (NEL20) THEN
1839.AND..GE.!$ OMP_FLAG = (NCB1+NEL2 > 300)(NEL22)
1840!$OMP PARALLEL DO PRIVATE(I,J2,J2_8,K1,K2,MULT1,MULT2,IROW)
1841!$OMP& IF (OMP_FLAG)
1842!NEC$ IVDEP
1843 DO J2 = 1,NEL2
1844 J2_8 = int(J2,8)
1845 MULT1 = -A(POSPV1 + 2_8 + J2_8-1_8)
1846 MULT2 = -A(POSPV2 + 1_8 + J2_8-1_8)
1847!NEC$ IVDEP
1848 DO I= J2, NEL2 + NCB1
1849 K1 = LPOS1 + (int(I,8)-1_8)*NFRONT8
1850 K2 = K1 + 1_8
1851 IROW = K2 + J2_8
1852 A(IROW) = A(IROW) + MULT1*A(K1) +
1853 & MULT2*A(K2)
1854 ENDDO
1855 ENDDO
1856 ENDIF
1857#else
1858 JJ = POSPV2 + NFRONT8-1_8
1859 IBEG = JJ + 2_8
1860 IEND = IBEG
1861 DO J2 = 1,NEL2
1862 K1 = JJ
1863 K2 = JJ+1_8
1864 MULT1 = - (A11*A(K1)+A12*A(K2))
1865 MULT2 = - (A12*A(K1)+A22*A(K2))
1866 A(POSPV1 + 2_8 + (int(J2,8)-1_8)) = A(K1)
1867 A(POSPV2 + 1_8 + (int(J2,8)-1_8)) = A(K2)
1868 K1 = POSPV1 + 2_8
1869 K2 = POSPV2 + 1_8
1870 DO IROW = IBEG, IEND
1871 A(IROW) = A(IROW) + MULT1*A(K1) + MULT2*A(K2)
1872 K1 = K1 + 1_8
1873 K2 = K2 + 1_8
1874 ENDDO
1875 A( JJ ) = -MULT1
1876 A( JJ + 1_8 ) = -MULT2
1877 IBEG = IBEG + NFRONT8
1878 IEND = IEND + NFRONT8 + 1_8
1879 JJ = JJ+NFRONT8
1880 ENDDO
1881 IEND = IEND-1_8
1882!$OMP PARALLEL DO PRIVATE(J2, K1, K2, MULT1, MULT2, IROW, JJ_LOC,
1883!$OMP& ROW_SHIFT, IBEG_LOC, IEND_LOC) IF (LAST_ROW-IEND_BLOCK>300)
1884 DO J2 = 1,LAST_ROW-IEND_BLOCK
1885 ROW_SHIFT = (J2-1_8)*NFRONT8
1886 JJ_LOC = JJ + ROW_SHIFT
1887 IBEG_LOC = IBEG + ROW_SHIFT
1888 IEND_LOC = IEND + ROW_SHIFT
1889 K1 = JJ_LOC
1890 K2 = JJ_LOC+1_8
1891 MULT1 = - (A11*A(K1)+A12*A(K2))
1892 MULT2 = - (A12*A(K1)+A22*A(K2))
1893 A(POSPV1 + 2_8 + NEL2 + (J2-1_8)) = A(K1)
1894 A(POSPV2 + 1_8 + NEL2 + (J2-1_8)) = A(K2)
1895 K1 = POSPV1 + 2_8
1896 K2 = POSPV2 + 1_8
1897 DO IROW = IBEG_LOC, IEND_LOC
1898 A(IROW) = A(IROW) + MULT1*A(K1) + MULT2*A(K2)
1899 K1 = K1 + 1_8
1900 K2 = K2 + 1_8
1901 ENDDO
1902 A( JJ_LOC ) = -MULT1
1903 A( JJ_LOC + 1_8 ) = -MULT2
1904 ENDDO
1905!$OMP END PARALLEL DO
1906#endif
1907 ENDIF
1908.AND..GT. IF ((IS_MAXFROMM_AVAIL)(NEL20)) THEN
1909.NE. IF (PARPIV_T10) THEN
1910 APOSMAX = POSELT+LDA8*LDA8-1_8 + int(NPIV_NEW+1,8)
1911 MAXFROMM = max(MAXFROMM,
1912 & real(A(APOSMAX))
1913 & )
1914 ENDIF
1915 ENDIF
1916 RETURN
1917 END SUBROUTINE SMUMPS_FAC_MQ_LDLT
1918 SUBROUTINE SMUMPS_FAC_SQ_LDLT(IBEG_BLOCK,IEND_BLOCK,NPIV,
1919 & NFRONT,NASS,INODE,A,LA,
1920 & LDA,
1921 & POSELT,
1922 & KEEP,KEEP8,
1923 & FIRST_ROW_TRSM, LAST_ROW_TRSM,
1924 & LAST_COL_GEMM, LAST_ROW_GEMM,
1925 & CALL_TRSM, CALL_GEMM, LR_ACTIVATED,
1926 & IW, LIW, OFFSET_IW
1927 & )
1928 IMPLICIT NONE
1929 INTEGER, intent(in) :: NPIV
1930 INTEGER, intent(in) :: NFRONT, NASS, IBEG_BLOCK, IEND_BLOCK
1931 INTEGER(8), intent(in) :: LA
1932 REAL, intent(inout) :: A(LA)
1933 INTEGER, intent(in) :: INODE
1934 INTEGER :: KEEP(500)
1935 INTEGER(8) :: KEEP8(150)
1936 INTEGER(8), intent(in) :: POSELT
1937 INTEGER, intent(in) :: LDA
1938 INTEGER, intent(in) :: LAST_COL_GEMM
1939 INTEGER, intent(in) :: LAST_ROW_GEMM, LAST_ROW_TRSM,
1940 & FIRST_ROW_TRSM
1941 LOGICAL, intent(in) :: CALL_TRSM, CALL_GEMM, LR_ACTIVATED
1942 INTEGER :: OFFSET_IW, LIW
1943 INTEGER :: IW(LIW)
1944 INTEGER(8) :: LDA8
1945 INTEGER NPIV_BLOCK, NEL1
1946 INTEGER NRHS_TRSM
1947 INTEGER(8) :: LPOS, UPOS, APOS
1948 INTEGER IROW
1949 INTEGER Block
1950 INTEGER BLSIZE
1951 REAL ONE, ALPHA
1952 INCLUDE 'mumps_headers.h'
1953 PARAMETER (ONE=1.0E0, ALPHA=-1.0E0)
1954 LDA8 = int(LDA,8)
1955 NEL1 = LAST_COL_GEMM - IEND_BLOCK
1956 NRHS_TRSM = LAST_ROW_TRSM-FIRST_ROW_TRSM
1957 NPIV_BLOCK = NPIV - IBEG_BLOCK + 1
1958.EQ. IF (NPIV_BLOCK0) GO TO 500
1959.NE. IF (NEL10) THEN
1960 IF (CALL_TRSM) THEN
1961 APOS = POSELT + LDA8*int(IBEG_BLOCK-1,8) + int(IBEG_BLOCK-1,8)
1962 LPOS = POSELT + LDA8*int(FIRST_ROW_TRSM,8)+int(IBEG_BLOCK-1,8)
1963 UPOS = POSELT + LDA8*int(IBEG_BLOCK-1,8)+int(FIRST_ROW_TRSM,8)
1964 CALL strsm('l', 'u', 't', 'u', NPIV_BLOCK, NRHS_TRSM,
1965 & ONE, A(APOS), LDA, A(LPOS), LDA)
1966 CALL SMUMPS_FAC_LDLT_COPY2U_SCALEL(NRHS_TRSM, 1, KEEP(424),
1967 & NFRONT, NPIV_BLOCK, LIW, IW, OFFSET_IW, LA, A,
1968.NOT. & POSELT, LPOS, UPOS, APOS, LR_ACTIVATED)
1969 ENDIF
1970 IF (CALL_GEMM) THEN
1971#if defined(GEMMT_AVAILABLE)
1972.EQ. IF ( KEEP(421) -1) THEN
1973 LPOS = POSELT + LDA8*int(IEND_BLOCK,8) + int(IBEG_BLOCK-1,8)
1974 UPOS = POSELT + LDA8*int(IBEG_BLOCK-1,8) + int(IEND_BLOCK,8)
1975 APOS = POSELT + LDA8*int(IEND_BLOCK,8) + int(IEND_BLOCK,8)
1976 CALL sgemmt( 'u','n','n', NEL1,
1977 & NPIV_BLOCK,
1978 & ALPHA, A( UPOS ), LDA,
1979 & A( LPOS ), LDA, ONE, A( APOS ), LDA )
1980 ELSE
1981#endif
1982 IF ( LAST_COL_GEMM - IEND_BLOCK > KEEP(7) ) THEN
1983 BLSIZE = KEEP(8)
1984 ELSE
1985 BLSIZE = LAST_COL_GEMM - IEND_BLOCK
1986 END IF
1987.GT. IF ( LAST_COL_GEMM - IEND_BLOCK 0 ) THEN
1988#if defined(SAK_BYROW)
1989 DO IROW = IEND_BLOCK+1, LAST_COL_GEMM, BLSIZE
1990 Block = min( BLSIZE, LAST_COL_GEMM - IROW + 1 )
1991 LPOS = POSELT + int(IROW - 1,8) * LDA8 +
1992 & int(IBEG_BLOCK - 1,8)
1993 UPOS = POSELT + int(IBEG_BLOCK - 1,8) * LDA8 +
1994 & int(IROW - 1,8)
1995 APOS = POSELT + int(IROW - 1,8) * LDA8 +
1996 & int(IEND_BLOCK,8)
1997 CALL sgemm( 'n','n', IROW + Block - IEND_BLOCK - 1,
1998 & Block, NPIV_BLOCK,
1999 & ALPHA, A( UPOS ), LDA,
2000 & A( LPOS ), LDA, ONE, A( APOS ), LDA )
2001 ENDDO
2002#else
2003 DO IROW = IEND_BLOCK+1, LAST_COL_GEMM, BLSIZE
2004 Block = min( BLSIZE, LAST_COL_GEMM - IROW + 1 )
2005 LPOS = POSELT + int( IROW - 1,8) * LDA8 +
2006 & int(IBEG_BLOCK - 1,8)
2007 UPOS = POSELT + int(IBEG_BLOCK - 1,8) * LDA8 +
2008 & int( IROW - 1,8)
2009 APOS = POSELT + int( IROW - 1,8) * LDA8 + int( IROW - 1,8)
2010 CALL sgemm( 'n','n', Block, LAST_COL_GEMM - IROW + 1,
2011 & NPIV_BLOCK, ALPHA, A( UPOS ), LDA,
2012 & A( LPOS ), LDA, ONE, A( APOS ), LDA )
2013 END DO
2014#endif
2015 END IF
2016#if defined(GEMMT_AVAILABLE)
2017 END IF
2018#endif
2019 LPOS = POSELT + int(LAST_COL_GEMM,8)*LDA8 + int(IBEG_BLOCK-1,8)
2020 UPOS = POSELT + int(IBEG_BLOCK-1,8) * LDA8 +
2021 & int(IEND_BLOCK,8)
2022 APOS = POSELT + int(LAST_COL_GEMM,8)*LDA8 + int(IEND_BLOCK,8)
2023.GT. IF (LAST_ROW_GEMM LAST_COL_GEMM) THEN
2024 CALL sgemm('n', 'n', NEL1, LAST_ROW_GEMM-LAST_COL_GEMM,
2025 & NPIV_BLOCK, ALPHA, A(UPOS), LDA, A(LPOS), LDA,
2026 & ONE, A(APOS), LDA)
2027 ENDIF
2028 ENDIF
2029 ENDIF
2030 500 CONTINUE
2031 RETURN
2032 END SUBROUTINE SMUMPS_FAC_SQ_LDLT
2033 SUBROUTINE SMUMPS_SWAP_LDLT( A, LA, IW, LIW,
2034 & IOLDPS, NPIVP1, IPIV, POSELT, LASTROW2SWAP,
2035 & LDA, NFRONT, LEVEL, PARPIV, K50, XSIZE,
2036 & IBEG_BLOCK_TO_SEND )
2037 IMPLICIT NONE
2038 INTEGER(8) :: POSELT, LA
2039 INTEGER LIW, IOLDPS, NPIVP1, IPIV
2040 INTEGER LDA, NFRONT, LEVEL, PARPIV, K50, XSIZE
2041 INTEGER LASTROW2SWAP
2042 REAL A( LA )
2043 INTEGER IW( LIW )
2044 INTEGER, INTENT(IN) :: IBEG_BLOCK_TO_SEND
2045 INCLUDE 'mumps_headers.h'
2046 INTEGER :: IBEG
2047 INTEGER ISW, ISWPS1, ISWPS2, HF
2048 INTEGER(8) :: IDIAG, APOS
2049 INTEGER(8) :: LDA8
2050 REAL SWOP
2051 LDA8 = int(LDA,8)
2052 APOS = POSELT + LDA8*int(IPIV-1,8) + int(NPIVP1-1,8)
2053 IDIAG = APOS + int(IPIV - NPIVP1,8)
2054 HF = 6 + IW( IOLDPS + 5 + XSIZE) + XSIZE
2055 ISWPS1 = IOLDPS + HF + NPIVP1 - 1
2056 ISWPS2 = IOLDPS + HF + IPIV - 1
2057 ISW = IW(ISWPS1)
2058 IW(ISWPS1) = IW(ISWPS2)
2059 IW(ISWPS2) = ISW
2060 ISW = IW(ISWPS1+NFRONT)
2061 IW(ISWPS1+NFRONT) = IW(ISWPS2+NFRONT)
2062 IW(ISWPS2+NFRONT) = ISW
2063.eq. IF ( LEVEL 2 ) THEN
2064 IBEG = IBEG_BLOCK_TO_SEND
2065 CALL sswap( NPIVP1 - 1 - IBEG + 1,
2066 & A( POSELT + int(NPIVP1-1,8) +
2067 & int(IBEG-1,8) * LDA8), LDA,
2068 & A( POSELT + int(IPIV-1,8) +
2069 & int(IBEG-1,8) * LDA8), LDA )
2070 END IF
2071 CALL sswap( NPIVP1-1,
2072 & A( POSELT+int(NPIVP1-1,8) * LDA8 ), 1,
2073 & A( POSELT + int(IPIV-1,8) * LDA8 ), 1 )
2074 CALL sswap( IPIV - NPIVP1 - 1,
2075 & A( POSELT+int(NPIVP1,8) * LDA8 + int(NPIVP1-1,8) ),
2076 & LDA, A( APOS + 1_8 ), 1 )
2077 SWOP = A(IDIAG)
2078 A(IDIAG) = A( POSELT+int(NPIVP1-1,8)*LDA8+int(NPIVP1-1,8) )
2079 A( POSELT + int(NPIVP1-1,8)*LDA8 + int(NPIVP1-1,8) ) = SWOP
2080.GT. IF (LASTROW2SWAP - IPIV0) THEN
2081 CALL sswap( LASTROW2SWAP - IPIV,
2082 & A( APOS + LDA8 ), LDA,
2083 & A( IDIAG + LDA8 ), LDA )
2084 ENDIF
2085.NE..AND..EQ. IF (PARPIV0 K502) THEN
2086.eq..OR..eq. IF ( LEVEL 2 LEVEL1) THEN
2087 APOS = POSELT+LDA8*LDA8-1_8
2088 SWOP = A(APOS+int(NPIVP1,8))
2089 A(APOS+int(NPIVP1,8))= A(APOS+int(IPIV,8))
2090 A(APOS+int(IPIV,8)) = SWOP
2091 ENDIF
2092 ENDIF
2093 RETURN
2094 END SUBROUTINE SMUMPS_SWAP_LDLT
2095 SUBROUTINE SMUMPS_FAC_LDLT_COPY2U_SCALEL( IROWMAX, IROWMIN,
2096 & SIZECOPY, LDA, NCOLS, LIW, IW, OFFSET_IW,
2097 & LA, A, POSELT, A_LPOS, A_UPOS, A_DPOS,
2098 & COPY_NEEDED )
2099!$ USE OMP_LIB
2100 INTEGER, INTENT(IN) :: IROWMAX, IROWMIN
2101 INTEGER, INTENT(IN) :: SIZECOPY
2102 INTEGER, INTENT(IN) :: LDA, NCOLS
2103 INTEGER, INTENT(IN) :: LIW
2104 INTEGER, INTENT(IN) :: IW(LIW)
2105 INTEGER, INTENT(IN) :: OFFSET_IW
2106 INTEGER(8), INTENT(IN) :: LA
2107 REAL, INTENT(INOUT) :: A(LA)
2108 INTEGER(8), INTENT(IN) :: POSELT, A_LPOS, A_UPOS, A_DPOS
2109 LOGICAL, INTENT(IN) :: COPY_NEEDED
2110 INTEGER(8) :: LPOS, UPOS
2111 INTEGER(8) :: DPOS, POSPV1, POSPV2, OFFDAG
2112 INTEGER(8) :: LDA8
2113 INTEGER :: IROWEND, IROW, Block2
2114 INTEGER :: I, J
2115 REAL :: MULT1, MULT2, A11, DETPIV, A22, A12
2116 INTEGER :: BLSIZECOPY
2117 REAL :: ONE
2118 PARAMETER (ONE = 1.0E0)
2119 INTEGER(8) :: LPOSI, UPOSI
2120 LOGICAL :: PIVOT_2X2
2121!$ LOGICAL :: OMP_FLAG
2122!$ INTEGER :: NOMP, CHUNK
2123 LDA8 = int(LDA,8)
2124.NE. IF (SIZECOPY0) THEN
2125 BLSIZECOPY = SIZECOPY
2126 ELSE
2127 BLSIZECOPY = 250
2128 ENDIF
2129!$ NOMP = OMP_GET_MAX_THREADS()
2130!$ OMP_FLAG = .FALSE.
2131!$ CHUNK = (64/4)
2132.GT..AND..GE.!$ IF (NOMP 1 NCOLS 4*CHUNK) THEN
2133!$ OMP_FLAG = .TRUE.
2134!$ CHUNK = max(2*CHUNK, NCOLS/NOMP)
2135!$ ENDIF
2136 DO IROWEND = IROWMAX, IROWMIN, -BLSIZECOPY
2137 Block2 = min(BLSIZECOPY, IROWEND)
2138 IROW = IROWEND - Block2 + 1
2139 LPOS = A_LPOS + int(IROW-1,8)*LDA8
2140 UPOS = A_UPOS + int(IROW-1,8)
2141!$OMP PARALLEL DO PRIVATE(PIVOT_2X2, A11, DPOS,
2142!$OMP& POSPV1, POSPV2, OFFDAG, A22, A12, DETPIV, J, MULT1, MULT2
2143!$OMP& , LPOSI, UPOSI
2144!$OMP& ) FIRSTPRIVATE(Block2, LDA, LDA8, LPOS, UPOS, A_DPOS)
2145!$OMP& SCHEDULE(STATIC,CHUNK) IF(OMP_FLAG)
2146 DO I=1, NCOLS
2147 PIVOT_2X2 = .FALSE.
2148.LE. IF(IW(OFFSET_IW+I-1) 0) THEN
2149 PIVOT_2X2 = .TRUE.
2150 ELSE
2151.GT. IF (I 1) THEN
2152.LE. IF (IW(OFFSET_IW+I-2) 0) THEN
2153 cycle
2154 ENDIF
2155 ENDIF
2156 ENDIF
2157 DPOS = A_DPOS + LDA8*int(I-1,8) + int(I-1,8)
2158.not. IF( PIVOT_2X2) THEN
2159 A11 = ONE/A(DPOS)
2160 LPOSI = LPOS+int(I-1,8)
2161 IF (COPY_NEEDED) THEN
2162 UPOSI = UPOS+int(I-1,8)*LDA8
2163#if defined(__ve__)
2164!NEC$ IVDEP
2165#endif
2166 DO J = 1, Block2
2167 A(UPOSI+int(J-1,8)) = A(LPOSI+int(J-1,8)*LDA8)
2168 END DO
2169 ENDIF
2170#if defined(__ve__)
2171!NEC$ IVDEP
2172#endif
2173 DO J = 1, Block2
2174 A(LPOSI+int(J-1,8)*LDA8) = A(LPOSI+int(J-1,8)*LDA8)*A11
2175 END DO
2176 ELSE
2177 IF (COPY_NEEDED) THEN
2178 CALL scopy(Block2, A(LPOS+int(I-1,8)),
2179 & LDA, A(UPOS+int(I-1,8)*LDA8), 1)
2180 CALL scopy(Block2, A(LPOS+int(I,8)),
2181 & LDA, A(UPOS+int(I,8)*LDA8), 1)
2182 ENDIF
2183 POSPV1 = DPOS
2184 POSPV2 = DPOS + int(LDA+1,8)
2185 OFFDAG = POSPV1+1_8
2186 A11 = A(POSPV1)
2187 A22 = A(POSPV2)
2188 A12 = A(OFFDAG)
2189 DETPIV = A11*A22 - A12**2
2190 A22 = A11/DETPIV
2191 A11 = A(POSPV2)/DETPIV
2192 A12 = -A12/DETPIV
2193#if defined(__ve__)
2194!NEC$ IVDEP
2195#endif
2196 DO J = 1,Block2
2197 MULT1 = A11*A(LPOS+int(J-1,8)*LDA8+int(I-1,8))
2198 & + A12*A(LPOS+int(J-1,8)*LDA8+int(I,8))
2199 MULT2 = A12*A(LPOS+int(J-1,8)*LDA8+int(I-1,8))
2200 & + A22*A(LPOS+int(J-1,8)*LDA8+int(I,8))
2201 A(LPOS+int(J-1,8)*LDA8+int(I-1,8)) = MULT1
2202 A(LPOS+int(J-1,8)*LDA8+int(I,8)) = MULT2
2203 ENDDO
2204 ENDIF
2205 ENDDO
2206!$OMP END PARALLEL DO
2207 ENDDO
2208 END SUBROUTINE SMUMPS_FAC_LDLT_COPY2U_SCALEL
2209 SUBROUTINE SMUMPS_FAC_LDLT_COPYSCALE_U( IROWMAX, IROWMIN,
2210 & SIZECOPY, LDA, NCOLS, LIW, IW, OFFSET_IW,
2211 & LA, A, POSELT, A_LPOS, A_UPOS, A_DPOS )
2212!$ USE OMP_LIB
2213 INTEGER, INTENT(IN) :: IROWMAX, IROWMIN
2214 INTEGER, INTENT(IN) :: SIZECOPY
2215 INTEGER, INTENT(IN) :: LDA, NCOLS
2216 INTEGER, INTENT(IN) :: LIW
2217 INTEGER, INTENT(IN) :: IW(LIW)
2218 INTEGER, INTENT(IN) :: OFFSET_IW
2219 INTEGER(8), INTENT(IN) :: LA
2220 REAL, INTENT(INOUT) :: A(LA)
2221 INTEGER(8), INTENT(IN) :: POSELT, A_LPOS, A_UPOS, A_DPOS
2222 INTEGER(8) :: LPOS, UPOS
2223 INTEGER(8) :: DPOS, POSPV1, POSPV2, OFFDAG
2224 INTEGER(8) :: LDA8
2225 INTEGER :: IROWEND, IROW, Block2
2226 INTEGER :: I, J
2227 REAL :: MULT1, MULT2, A11, A22, A12
2228 INTEGER :: BLSIZECOPY
2229 REAL :: ONE
2230 PARAMETER (ONE = 1.0E0)
2231 INTEGER(8) :: LPOSI, UPOSI
2232 LOGICAL :: PIVOT_2X2
2233!$ LOGICAL :: OMP_FLAG
2234!$ INTEGER :: NOMP, CHUNK
2235 LDA8 = int(LDA,8)
2236.NE. IF (SIZECOPY0) THEN
2237 BLSIZECOPY = SIZECOPY
2238 ELSE
2239 BLSIZECOPY = 250
2240 ENDIF
2241!$ NOMP = OMP_GET_MAX_THREADS()
2242!$ OMP_FLAG = .FALSE.
2243!$ CHUNK = (64/4)
2244.GT..AND..GE.!$ IF (NOMP 1 NCOLS 4*CHUNK) THEN
2245!$ OMP_FLAG = .TRUE.
2246!$ CHUNK = max(2*CHUNK, NCOLS/NOMP)
2247!$ ENDIF
2248 DO IROWEND = IROWMAX, IROWMIN, -BLSIZECOPY
2249 Block2 = min(BLSIZECOPY, IROWEND)
2250 IROW = IROWEND - Block2 + 1
2251 LPOS = A_LPOS + int(IROW-1,8)*LDA8
2252 UPOS = A_UPOS + int(IROW-1,8)
2253!$OMP PARALLEL DO PRIVATE(PIVOT_2X2, A11, DPOS,
2254!$OMP& POSPV1, POSPV2, OFFDAG, A22, A12, J, MULT1, MULT2
2255!$OMP& , LPOSI, UPOSI
2256!$OMP& ) FIRSTPRIVATE(Block2, LDA, LDA8, LPOS, UPOS, POSELT)
2257!$OMP& SCHEDULE(STATIC,CHUNK) IF(OMP_FLAG)
2258 DO I=1, NCOLS
2259 PIVOT_2X2 = .FALSE.
2260.LE. IF(IW(OFFSET_IW+I-1) 0) THEN
2261 PIVOT_2X2 = .TRUE.
2262 ELSE
2263.GT. IF (I 1) THEN
2264.LE. IF (IW(OFFSET_IW+I-2) 0) THEN
2265 cycle
2266 ENDIF
2267 ENDIF
2268 ENDIF
2269 DPOS = A_DPOS + LDA8*int(I-1,8) + int(I-1,8)
2270.not. IF( PIVOT_2X2) THEN
2271 A11 = A(DPOS)
2272 LPOSI = LPOS+int(I-1,8)
2273 UPOSI = UPOS+int(I-1,8)*LDA8
2274#if defined(__ve__)
2275!NEC$ IVDEP
2276#endif
2277 DO J = 1, Block2
2278 A(UPOSI+int(J-1,8)) = A(LPOSI+int(J-1,8)*LDA8)*A11
2279 END DO
2280 ELSE
2281 POSPV1 = DPOS
2282 POSPV2 = DPOS + int(LDA+1,8)
2283 OFFDAG = POSPV1+1_8
2284 A11 = A(POSPV1)
2285 A22 = A(POSPV2)
2286 A12 = A(OFFDAG)
2287#if defined(__ve__)
2288!NEC$ IVDEP
2289#endif
2290 DO J = 1,Block2
2291 MULT1 = A11*A(LPOS+int(J-1,8)*LDA8+int(I-1,8))
2292 & + A12*A(LPOS+int(J-1,8)*LDA8+int(I,8))
2293 MULT2 = A12*A(LPOS+int(J-1,8)*LDA8+int(I-1,8))
2294 & + A22*A(LPOS+int(J-1,8)*LDA8+int(I,8))
2295 A(UPOS+int(I-1,8)*LDA8+int(J-1,8)) = MULT1
2296 A(UPOS+int(I,8)*LDA8+int(J-1,8)) = MULT2
2297 ENDDO
2298 ENDIF
2299 ENDDO
2300!$OMP END PARALLEL DO
2301 ENDDO
2302 RETURN
2303 END SUBROUTINE SMUMPS_FAC_LDLT_COPYSCALE_U
2304 SUBROUTINE SMUMPS_FAC_T_LDLT(NFRONT,NASS,
2305 & IW,LIW,A,LA,
2306 & LDA,
2307 & IOLDPS,POSELT,KEEP,KEEP8,
2308 & POSTPONE_COL_UPDATE, ETATASS,
2309 & TYPEFile, LAFAC, MonBloc, NextPiv2beWritten,
2310 & LIWFAC, MYID, IFLAG, OFFSET_IW, INODE )
2311 USE SMUMPS_OOC
2312 IMPLICIT NONE
2313 INTEGER NFRONT, NASS,LIW
2314 INTEGER(8) :: LA
2315 REAL A(LA)
2316 INTEGER IW(LIW)
2317 INTEGER KEEP(500)
2318 INTEGER(8) KEEP8(150)
2319 INTEGER(8) :: POSELT
2320 INTEGER LDA
2321 INTEGER IOLDPS, ETATASS
2322 LOGICAL POSTPONE_COL_UPDATE
2323 INTEGER(8) :: LAFAC
2324 INTEGER TYPEFile, NextPiv2beWritten
2325 INTEGER LIWFAC, MYID, IFLAG
2326 TYPE(IO_BLOCK):: MonBloc
2327 INTEGER IDUMMY
2328 LOGICAL LAST_CALL
2329 INTEGER :: OFFSET_IW
2330 INTEGER, intent(in):: INODE
2331 INCLUDE 'mumps_headers.h'
2332 INTEGER(8) :: UPOS, APOS, LPOS
2333 INTEGER(8) :: LDA8
2334 INTEGER BLSIZE, BLSIZE2, Block, IROW, NPIV, IROWEND
2335 INTEGER I2, I2END, Block2
2336 REAL ONE, ALPHA, BETA, ZERO
2337 PARAMETER (ONE = 1.0E0, ALPHA=-1.0E0)
2338 PARAMETER (ZERO=0.0E0)
2339 LDA8 = int(LDA,8)
2340.EQ. IF (ETATASS1) THEN
2341 BETA = ZERO
2342 ELSE
2343 BETA = ONE
2344 ENDIF
2345 IF ( NFRONT - NASS > KEEP(58) ) THEN
2346 IF ( NFRONT - NASS > KEEP(57) ) THEN
2347 BLSIZE = KEEP(58)
2348 ELSE
2349 BLSIZE = (NFRONT - NASS)/2
2350 END IF
2351 ELSE
2352 BLSIZE = NFRONT - NASS
2353 END IF
2354 BLSIZE2 = KEEP(218)
2355 NPIV = IW( IOLDPS + 1 + KEEP(IXSZ))
2356.GT. IF ( NFRONT - NASS 0 ) THEN
2357 IF ( POSTPONE_COL_UPDATE ) THEN
2358 LPOS = POSELT + LDA8 * int(NASS,8)
2359 CALL strsm( 'l', 'u', 't', 'u',
2360 & NPIV, NFRONT-NASS, ONE,
2361 & A( POSELT ), LDA,
2362 & A( LPOS ), LDA )
2363 ENDIF
2364#if defined(GEMMT_AVAILABLE)
2365.EQ. IF ( KEEP(421) -1) THEN
2366 LPOS = POSELT + int(NASS,8)*LDA8
2367 UPOS = POSELT + int(NASS,8)
2368 APOS = POSELT + int(NASS,8)*LDA8 + int(NASS,8)
2369 IF (POSTPONE_COL_UPDATE) THEN
2370 CALL SMUMPS_FAC_LDLT_COPY2U_SCALEL( NFRONT - NASS, 1,
2371 & KEEP(424), NFRONT, NPIV,
2372 & LIW, IW, OFFSET_IW, LA, A, POSELT, LPOS, UPOS,
2373 & POSELT, .TRUE. )
2374 ENDIF
2375 CALL sgemmt('u', 'n', 'n', NFRONT-NASS, NPIV,
2376 & ALPHA, A( UPOS ), LDA,
2377 & A( LPOS ), LDA,
2378 & BETA,
2379 & A( APOS ), LDA )
2380 ELSE
2381#endif
2382 DO IROWEND = NFRONT - NASS, 1, -BLSIZE
2383 Block = min( BLSIZE, IROWEND )
2384 IROW = IROWEND - Block + 1
2385 LPOS = POSELT + int(NASS,8)*LDA8 + int(IROW-1,8) * LDA8
2386 APOS = POSELT + int(NASS,8)*LDA8 + int(IROW-1,8) * LDA8 +
2387 & int(NASS + IROW - 1,8)
2388 UPOS = POSELT + int(NASS,8)
2389.NOT. IF ( POSTPONE_COL_UPDATE) THEN
2390 UPOS = POSELT + int(NASS + IROW - 1,8)
2391 ENDIF
2392 IF (POSTPONE_COL_UPDATE) THEN
2393 CALL SMUMPS_FAC_LDLT_COPY2U_SCALEL( Block, 1,
2394 & KEEP(424), NFRONT, NPIV,
2395 & LIW, IW, OFFSET_IW, LA, A, POSELT, LPOS, UPOS,
2396 & POSELT, .TRUE. )
2397 ENDIF
2398 DO I2END = Block, 1, -BLSIZE2
2399 Block2 = min(BLSIZE2, I2END)
2400 I2 = I2END - Block2+1
2401 CALL sgemm('n', 'n', Block2, Block-I2+1, NPIV, ALPHA,
2402 & A(UPOS+int(I2-1,8)), LDA,
2403 & A(LPOS+int(I2-1,8)*LDA8), LDA,
2404 & BETA,
2405 & A(APOS + int(I2-1,8) + int(I2-1,8)*LDA8), LDA)
2406.EQ. IF (KEEP(201)1) THEN
2407.LE. IF (NextPiv2beWrittenNPIV) THEN
2408 LAST_CALL=.FALSE.
2409 CALL SMUMPS_OOC_IO_LU_PANEL(
2410 & STRAT_TRY_WRITE, TYPEFile,
2411 & A(POSELT), LAFAC, MonBloc,
2412 & NextPiv2beWritten, IDUMMY,
2413 & IW(IOLDPS), LIWFAC, MYID,
2414 & KEEP8(31),
2415 & IFLAG,LAST_CALL )
2416.LT. IF (IFLAG 0 ) RETURN
2417 ENDIF
2418 ENDIF
2419 ENDDO
2420 IF ( NFRONT - NASS - IROW + 1 - Block > 0 ) THEN
2421 CALL sgemm( 'n', 'n', Block, NFRONT-NASS-Block-IROW+1, NPIV,
2422 & ALPHA, A( UPOS ), LDA,
2423 & A( LPOS + LDA8 * int(Block,8) ), LDA,
2424 & BETA,
2425 & A( APOS + LDA8 * int(Block,8) ), LDA )
2426 ENDIF
2427 END DO
2428#if defined(GEMMT_AVAILABLE)
2429 END IF
2430#endif
2431.AND..GT. IF ( (POSTPONE_COL_UPDATE)(NASS-NPIV0) ) THEN
2432 LPOS = POSELT + int(NPIV,8)*LDA8
2433 UPOS = POSELT + int(NPIV,8)
2434 CALL SMUMPS_FAC_LDLT_COPYSCALE_U( NASS-NPIV, 1,
2435 & KEEP(424), NFRONT, NPIV,
2436 & LIW, IW, OFFSET_IW, LA, A, POSELT, LPOS, UPOS, POSELT)
2437 LPOS = POSELT + LDA8 * int(NASS,8)
2438 CALL sgemm('n', 'n', NASS-NPIV, NFRONT-NASS, NPIV, ALPHA,
2439 & A( POSELT + int(NPIV,8)), LDA,
2440 & A( LPOS ), LDA,
2441 & BETA,
2442 & A( LPOS + int(NPIV,8) ), LDA)
2443 ENDIF
2444 END IF
2445 RETURN
2446 END SUBROUTINE SMUMPS_FAC_T_LDLT
2447 SUBROUTINE SMUMPS_STORE_PERMINFO( PIVRPTR, NBPANELS, PIVR, NASS,
2448 & K, P, LastPanelonDisk,
2449 & LastPIVRPTRIndexFilled )
2450 IMPLICIT NONE
2451 INTEGER, intent(in) :: NBPANELS, NASS, K, P
2452 INTEGER, intent(inout) :: PIVRPTR(NBPANELS), PIVR(NASS)
2453 INTEGER LastPanelonDisk, LastPIVRPTRIndexFilled
2454 INTEGER I
2455 IF ( LastPanelonDisk+1 > NBPANELS ) THEN
2456 WRITE(*,*) "INTERNAL ERROR IN SMUMPS_STORE_PERMINFO!"
2457 WRITE(*,*) "NASS=",NASS,"PIVRPTR=",PIVRPTR(1:NBPANELS)
2458 WRITE(*,*) "K=",K, "P=",P, "LastPanelonDisk=",LastPanelonDisk
2459 WRITE(*,*) "LastPIVRPTRIndexFilled=", LastPIVRPTRIndexFilled
2460 CALL MUMPS_ABORT()
2461 ENDIF
2462 PIVRPTR(LastPanelonDisk+1) = K + 1
2463.NE. IF (LastPanelonDisk0) THEN
2464 PIVR(K - PIVRPTR(1) + 1) = P
2465 DO I = LastPIVRPTRIndexFilled + 1, LastPanelonDisk
2466 PIVRPTR(I)=PIVRPTR(LastPIVRPTRIndexFilled)
2467 ENDDO
2468 ENDIF
2469 LastPIVRPTRIndexFilled = LastPanelonDisk + 1
2470 RETURN
2471 END SUBROUTINE SMUMPS_STORE_PERMINFO
2472 SUBROUTINE SMUMPS_UPDATE_MINMAX_PIVOT
2473 & ( DIAG, DKEEP, KEEP, NULLPIVOT)
2474!$ USE OMP_LIB
2475 IMPLICIT NONE
2476 REAL, INTENT(IN) :: DIAG
2477 REAL, INTENT(INOUT) :: DKEEP(230)
2478 LOGICAL, INTENT(IN) :: NULLPIVOT
2479 INTEGER, INTENT(IN) :: KEEP(500)
2480.EQ. IF (KEEP(405)0) THEN
2481 DKEEP(21) = max(DKEEP(21), DIAG)
2482 DKEEP(19) = min(DKEEP(19), DIAG)
2483.NOT. IF (NULLPIVOT) THEN
2484 DKEEP(20) = min(DKEEP(20), DIAG)
2485 ENDIF
2486 ELSE
2487!$OMP ATOMIC UPDATE
2488 DKEEP(21) = max(DKEEP(21), DIAG)
2489!$OMP END ATOMIC
2490!$OMP ATOMIC UPDATE
2491 DKEEP(19) = min(DKEEP(19), DIAG)
2492!$OMP END ATOMIC
2493.NOT. IF (NULLPIVOT) THEN
2494!$OMP ATOMIC UPDATE
2495 DKEEP(20) = min(DKEEP(20), DIAG)
2496!$OMP END ATOMIC
2497 ENDIF
2498 ENDIF
2499 RETURN
2500 END SUBROUTINE SMUMPS_UPDATE_MINMAX_PIVOT
2501 SUBROUTINE SMUMPS_GET_SIZE_SCHUR_IN_FRONT (
2502 & N, NCB, SIZE_SCHUR, ROW_INDICES, PERM,
2503 & NVSCHUR
2504 & )
2505 IMPLICIT NONE
2506 INTEGER, intent(in) :: N, NCB, SIZE_SCHUR
2507 INTEGER, intent(in) :: ROW_INDICES(NCB), PERM(N)
2508 INTEGER, intent(out):: NVSCHUR
2509 INTEGER :: I, IPOS, IBEG_SCHUR
2510 IBEG_SCHUR = N - SIZE_SCHUR +1
2511 NVSCHUR = 0
2512 IPOS = NCB
2513 DO I= NCB,1,-1
2514.LE. IF (abs(ROW_INDICES(I))N) THEN
2515.LT. IF (PERM(ROW_INDICES(I))IBEG_SCHUR) EXIT
2516 ENDIF
2517 IPOS = IPOS -1
2518 ENDDO
2519 NVSCHUR = NCB-IPOS
2520 RETURN
2521 END SUBROUTINE SMUMPS_GET_SIZE_SCHUR_IN_FRONT
2522 END MODULE SMUMPS_FAC_FRONT_AUX_M
#define mumps_abort
Definition VE_Metis.h:25
subroutine strsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
STRSM
Definition strsm.f:181
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM
Definition sgemm.f:187
#define max(a, b)
Definition macros.h:21
integer, public typef_u
integer, public strat_try_write
integer, public typef_l
subroutine smumps_fac_p(a, la, nfront, npiv, nass, poselt, call_utrsm, keep, inode, call_ooc, iwfac, liwfac, lafac, monbloc, myid, keep8, lnextpiv2bewritten, unextpiv2bewritten, iflag)
subroutine smumps_fac_h(nfront, nass, iw, liw, a, la, inopv, noffw, det_expw, det_mantw, det_signw, ioldps, poselt, uu, seuil, keep, keep8, dkeep, pp_first2swap_l, pp_lastpanelondisk_l, pp_lastpivrptrfilled_l, pp_first2swap_u, pp_lastpanelondisk_u, pp_lastpivrptrfilled_u, maxfromn, is_maxfromn_avail, inextpiv, ooc_effective_on_front, nvschur)
subroutine smumps_fac_n(nfront, nass, iw, liw, a, la, ioldps, poselt, ifinb, xsize, keep, maxfromn, is_maxfromn_avail, nvschur)
subroutine smumps_fac_pt_setlock427(k427_out, k427, k405, k222, nel1, nass)
subroutine smumps_fac_t(a, la, npivb, nfront, npiv, nass, poselt)
subroutine smumps_fac_sq(ibeg_block, iend_block, npiv, nfront, last_row, last_col, a, la, poselt, first_col, call_ltrsm, call_utrsm, call_gemm, with_comm_thread, lr_activated)
subroutine smumps_update_minmax_pivot(diag, dkeep, keep, nullpivot)
subroutine smumps_store_perminfo(pivrptr, nbpanels, pivr, nass, k, p, lastpanelondisk, lastpivrptrindexfilled)
subroutine, public smumps_ooc_io_lu_panel(strat, typefile, afac, lafac, monbloc, lnextpiv2bewritten, unextpiv2bewritten, iw, liwfac, myid, filesize, ierr, last_call)
integer, parameter, public typef_both_lu
Definition smumps_ooc.F:64
subroutine smumps_updatedeter(piv, deter, nexp)
subroutine smumps_get_ooc_perm_ptr(typef, nbpanels, i_pivptr, i_piv, ipos, iw, liw)