15 & ( slavef, k48, k821, k50,
16 & nfront, ncb, k375, k119)
18 INTEGER,
INTENT (IN) :: slavef, k48, k50, nfront, ncb
19 INTEGER,
INTENT (IN) :: k375
20 INTEGER,
INTENT (IN) :: k119
21 INTEGER(8),
INTENT (IN) :: k821
22 INTEGER nslavesmin, nass, kmax
23 REAL wmaster, wtotal, wmax
32 & (k48.EQ.5 .AND. (k119.EQ.1. or.k50.EQ.0)))
THEN
33 nslavesmin =
max(ncb/
max(1,kmax),1)
34 ELSE IF (k48 .EQ. 3 .OR.(k48.EQ.5 .AND.k50.NE.0) )
THEN
37 wmaster = real(nass)*real(nass)*real(nass)/(3.0e0)
38 IF ( wmaster .GT. wmax )
THEN
39 nslavesmin =
max( nint( wtotal / wmaster ), 1 )
41 nslavesmin =
max( nint( wtotal / wmax ), 1 )
45 nslavesmin =
max( nslavesmin/2, 1 )
48 ELSE IF (k48 .EQ. 4 )
THEN
49 IF ( k821 > 0_8 )
THEN
50 WRITE(*,*)
'Internal Error 1 in MUMPS_BLOC2_GET_NSLAVESMIN'
54 &
"K821 too large in MUMPS_BLOC2_GET_NSLAVESMIN" )
58 & (int(ncb,8)*int(ncb,8))/int(kmax,8)
64 x=int((-real(nfront-ncb+acc)
65 & +sqrt(((real(nfront-ncb+acc)*
66 & real(nfront-ncb+acc))+real(4)*
70 nslavesmin=nslavesmin+1
71 IF (((ncb-acc)*ncb).LT.kmax)
THEN
73 nslavesmin=nslavesmin+1
78 nslavesmin =
min( nslavesmin,(slavef-1) )
80 &
min( nslavesmin, ncb )
87 & ( slavef, k48, k821, k50,
88 & nfront, ncb, k375, k119 )
90 INTEGER,
INTENT (IN) :: slavef, k48, k50,nfront, ncb, k375, k119
91 INTEGER(8),
INTENT(IN) :: k821
92 INTEGER nslavesmax, kmax, kmin
100 IF (k48 .eq. 0 .OR. k48.eq.3.OR.k48.EQ.5)
THEN
104 & slavef, k48, k50, kmin, nfront, ncb )
106 nslavesmax = slavef-1
109 & slavef, k48, k821, k50, nfront, ncb, k375, k119 )
110 nslavesmax =
max( nslavesmax, nslavesmin )
112 &
min( nslavesmax, ncb )
113 IF (k375 .EQ. 1)
THEN
119 & NCB, NFR, SLAVEF, NBROWMAX, MAXSURFCB8
122 INTEGER,
intent(in) :: WHAT, NCB, NFR, SLAVEF
123 INTEGER,
intent(in) :: KEEP(500)
124 INTEGER(8) KEEP8(150)
125 INTEGER,
intent(out) :: NBROWMAX
126 INTEGER(8),
intent(out) :: MAXSURFCB8
127 INTEGER KMAX, KMIN, NSLAVES, SIZEDUMMY, TABDUMMY(1)
130 INTEGER MUMPS_REG_GETKMAX, MUMPS_GETKMIN,
131 & MUMPS_BLOC2_GET_NSLAVESMIN
132 IF ( what .NE. 1 .and. what .NE. 2 )
THEN
133 IF (what .NE. 4 .and. what .NE. 5 .AND.
134 & keep(48).NE.5 )
THEN
135 WRITE(*,*)
"Internal error 1 in MUMPS_MAX_SURFCB_NBROWS"
139 kmax = mumps_reg_getkmax( keep8(21), ncb )
140 IF (what .EQ.1.OR.what.EQ.2)
THEN
141 nslaves = mumps_bloc2_get_nslavesmin( slavef, keep(48),
142 & keep8(21), keep(50),
143 & nfr, ncb, keep(375), keep(119) )
147 IF ( keep(48) == 0 .OR. (keep(48).EQ.5.AND.keep(50).EQ.0))
THEN
148 nbrowmax = ncb / nslaves + mod( ncb, nslaves )
149 IF ( what == 2 .OR. what == 5 )
150 & maxsurfcb8 = int(nbrowmax,8) * int(ncb,8)
151 ELSE IF (keep(48) == 3.OR.(keep(48).EQ.5.AND.keep(50).NE.0))
THEN
152 kmin = mumps_getkmin( keep8(21), keep(50), kmax, ncb )
156 & what-3, nslaves, nfr, ncb,
157 & kmin, kmax, slavef,
158 & nbrowmax, maxsurfcb8, tabdummy, sizedummy)
161 & what, nslaves, nfr, ncb,
162 & kmin, kmax, slavef,
163 & nbrowmax, maxsurfcb8, tabdummy, sizedummy)
165 ELSE IF ( keep(48) == 4 )
THEN
166 IF (keep8(21) > 0_8)
THEN
167 WRITE(*,*)
"Internal error 2 in MUMPS_MAX_SURFCB_NBROWS"
170 IF(keep(50).EQ.0)
THEN
171 IF ( abs(keep8(21)) * int( slavef - 1,8 ) >
172 & int( ncb,8) * int(nfr,8) )
THEN
173 nbrowmax = (ncb + slavef -2 ) / ( slavef - 1 )
174 IF ( what == 2 ) maxsurfcb8 = int(nbrowmax,8) *int(ncb,8)
177 & (abs(keep8(21)) + int(nfr - 1,8))
180 IF ( what == 2 ) maxsurfcb8 = abs(keep8(21))
183 nbrowmax=int((-real(nfr-ncb)
184 & +sqrt((real(nfr-ncb)*
185 & real(nfr-ncb))+real(4)*
186 & real(abs(keep8(21)))))/
188 IF ( what == 2 ) maxsurfcb8 = abs(keep8(21))
192 IF (what == 2) maxsurfcb8 = int(ncb,8) * int(ncb,8)
194 nbrowmax =
min(
max(nbrowmax, 1), ncb)
219 & GETPOSITIONS, NSLAVES, NFRONT, NCB,
220 & KMIN, KMAX, SLAVEF,
221 & NBROWMAX, MAXSURFCB, TABPOS, SIZETABPOS)
223 INTEGER,
INTENT (IN) :: GETPOSITIONS,
224 & nslaves, nfront, ncb,
225 & kmin, kmax, slavef, sizetabpos
226 INTEGER,
INTENT (OUT) :: NBROWMAX
227 INTEGER(8),
INTENT(OUT) :: MAXSURFCB
228 INTEGER,
INTENT (OUT) :: TABPOS()
231 INTEGER SumNi, NCOLim1, I, BLSIZE, NASS
232 LOGICAL GETROW, GETSURF, GETPOS, GET_AVGROW, GET_AVGSURF
233 REAL MUMPS_BLOC2_COUT
234 EXTERNAL mumps_bloc2_cout
235 getrow = (getpositions.EQ.1)
236 getsurf= (getpositions.EQ.2)
237 getpos = (getpositions.EQ.3)
238 get_avgrow = (getpositions.EQ.4)
239 get_avgsurf = (getpositions.EQ.5)
244 tabpos(nslaves+1)= ncb+1
245 tabpos(slavef+2) = nslaves
247 IF (nslaves.EQ.1)
THEN
250 maxsurfcb = int(ncb,8)*int(ncb,8)
251 ELSEIF ( getrow )
THEN
256 w = mumps_bloc2_cout(ncb,nfront,nass)
260 delta = real(2*ncolim1-nass+1)**2 +
261 & (real(4)*w)/real(nass*(nslaves-i+1))
263 delta = (real(-2*ncolim1+nass-1) + delta )/real(2)
264 blsize =
max(int(delta), 1)
265 IF ( (nfront-ncolim1-blsize) .LE. nslaves-i )
THEN
268 ncolim1 = ncolim1+blsize
269 costni = mumps_bloc2_cout(blsize,ncolim1,nass)
271 IF (getpos) tabpos(i) = sumni + 1
273 nbrowmax =
max( nbrowmax,
275 maxsurfcb =
max( maxsurfcb,
276 & int(blsize,8)* int(sumni+blsize,8) )
277 ELSEIF ( getrow )
THEN
278 nbrowmax =
max( nbrowmax,
281 ELSEIF (get_avgsurf)
THEN
282 nbrowmax = nbrowmax + blsize
283 maxsurfcb = maxsurfcb + int(blsize,8)*int(sumni+blsize,8)
284 ELSEIF (get_avgrow)
THEN
285 nbrowmax = nbrowmax + blsize
287 sumni = sumni + blsize
290 IF (blsize.LE.0)
THEN
291 write(*,*)
' Error in MUMPS_BLOC2_SET_POSK483: ',
292 &
' size lastbloc ', blsize
295 if (ncolim1+blsize.NE.nfront)
then
296 write(*,*)
' Error in MUMPS_BLOC2_SET_POSK483: ',
297 &
' NCOLim1, BLSIZE, NFRONT=',
298 & ncolim1, blsize, nfront
301 IF (getpos) tabpos(nslaves) = sumni + 1
303 nbrowmax =
max( nbrowmax,
305 maxsurfcb =
max( maxsurfcb,
306 & int(blsize,8)* int(sumni+blsize,8 ))
307 ELSEIF ( getrow )
THEN
308 nbrowmax =
max( nbrowmax,
310 ELSEIF (get_avgsurf)
THEN
311 nbrowmax = nbrowmax + blsize
312 maxsurfcb = maxsurfcb + int(blsize,8)*int(sumni+blsize,8)
313 nbrowmax=(nbrowmax+nslaves-1)/nslaves
314 maxsurfcb=(maxsurfcb+int(nslaves-1,8))/int(nslaves,8)
315 ELSEIF (get_avgrow)
THEN
316 nbrowmax = nbrowmax + blsize
317 nbrowmax=(nbrowmax+nslaves-1)/nslaves
323 & KEEP,KEEP8, SLAVEF,
325 & NSLAVES, NFRONT, NCB
328 INTEGER,
INTENT( IN ) :: NCB, NSLAVES, SLAVEF, NFRONT,
330 INTEGER(8) KEEP8(150)
331 INTEGER TAB_POS_IN_PERE(SLAVEF+2)
333 INTEGER KMIN, KMAX, ,
334 & GETPOSITIONS, SIZECOLTAB
335 INTEGER(8) MAXSURFDUMMY8
336 INTEGER MUMPS_GETKMIN, MUMPS_REG_GETKMAX
337 EXTERNAL mumps_getkmin, mumps_reg_getkmax,
339 IF (keep(48).EQ.0)
THEN
340 blsize = ncb / nslaves
341 tab_pos_in_pere( 1 ) = 1
343 tab_pos_in_pere( i+1 ) = tab_pos_in_pere(i) +
346 tab_pos_in_pere(nslaves+1) = ncb+1
347 tab_pos_in_pere(slavef+2) = nslaves
349 ELSE IF (keep(48).EQ.3 )
THEN
350 kmax = mumps_reg_getkmax(keep8(21), ncb)
351 kmin = mumps_getkmin(keep8(21), keep(50), kmax, ncb)
353 sizecoltab = slavef+2
355 & getpositions, nslaves, nfront, ncb,
356 & kmin, kmax, slavef,
357 & nbrowdummy, maxsurfdummy8,
358 & tab_pos_in_pere(1), sizecoltab)
363 & KEEP,KEEP8, INODE, STEP, N, SLAVEF,
364 & ISTEP_TO_INIV2, TAB_POS_IN_PERE,
366 & ISLAVE, NCB, NSLAVES, SIZE, FIRST_INDEX )
368 INTEGER,
INTENT( IN ) :: ISLAVE, NCB, NSLAVES, SLAVEF,
369 & KEEP(500), INODE, N
370 INTEGER(8) KEEP8(150)
371 INTEGER,
INTENT( IN ) :: STEP(N),
372 & ISTEP_TO_INIV2(KEEP(71)),
373 & tab_pos_in_pere(slavef+2,
max(1,keep(56)))
374 INTEGER,
INTENT( OUT ):: SIZE, FIRST_INDEX
376 IF (keep(48).EQ.0)
THEN
377 blsize = ncb / nslaves
378 IF ( islave .NE. nslaves )
THEN
381 SIZE = blsize + mod( ncb, nslaves )
383 first_index = ( islave - 1 ) * blsize + 1
384 ELSEIF (keep(48).EQ.3)
THEN
385 j = istep_to_iniv2( step(inode) )
386 first_index = tab_pos_in_pere(islave,j)
387 SIZE = tab_pos_in_pere(islave+1,j) - first_index
388 ELSEIF (keep(48).EQ.4)
THEN
389 j = istep_to_iniv2( step(inode) )
390 first_index = tab_pos_in_pere(islave,j)
391 SIZE = tab_pos_in_pere(islave+1,j) - first_index
392 ELSEIF (keep(48).EQ.5)
THEN
393 j = istep_to_iniv2( step(inode) )
394 first_index = tab_pos_in_pere(islave,j)
395 SIZE = tab_pos_in_pere(islave+1,j) - first_index
397 WRITE(*,*)
'Error in MUMPS_BLOC2 undef strat'
410 & (k821, k48, k50, slavef,
411 & ncb, nfront, nslaves_less, nmb_of_cand, k375, k119)
413 INTEGER,
INTENT( IN ) :: ncb, nfront, nslaves_less,
414 & k48, k50, slavef, nmb_of_cand, k375, k119
415 INTEGER(8),
INTENT(IN) :: k821
418 & nslaves_ref, nslaves_max
419 REAL wk_master, wk_slave
426 IF (nmb_of_cand.LE.0)
THEN
428 IF ( (k48.EQ.0).OR. (k48.EQ.3) )
THEN
431 & slavef, k48, k821, k50, nfront, ncb, k375, k119 )
432 nslaves = nslaves_ref
433 IF ( nslaves_ref.LT.slavef )
THEN
435 & slavef, k48, k821, k50, nfront, ncb, k375, k119 )
436 IF ( nslaves_max .LT. nslaves_less )
THEN
437 nslaves = nslaves_max
439 nslaves = nslaves_less
441 nslaves =
max(nslaves_ref,nslaves)
443 nslaves =
min(nslaves, nmb_of_cand)
444 IF ( nslaves.GT.nslaves_ref)
THEN
447 wk_slave = real( npiv ) * real( ncb ) *
448 & ( 2.0e0 * real(nfront) - real(npiv) )
450 wk_master = 0.66667e0 *
451 & real(npiv)*real(npiv)*real(npiv)+
452 & real(npiv)*real(npiv)*real(ncb)
456 wk_master = real(npiv)*real(npiv)*real(npiv)/3.0e0
458 IF ( (wk_master.GT.wk_slave).AND.
459 & (wk_slave.GT.1.0e0) )
THEN
461 & int( real(nslaves) * (wk_slave/wk_master))
462 nslaves =
max(nslaves_ref, nslaves)
466 nslaves = nslaves_less
468 nslaves =
min(nslaves, ncb)
469 nslaves =
min(nslaves, nmb_of_cand)
474 & KEEP,KEEP8, INODE, STEP, N, SLAVEF,
475 & ISTEP_TO_INIV2, TAB_POS_IN_PERE,
478 & NSLAVES, POSITION, ISLAVE, IPOSSLAVE )
480 INTEGER,
INTENT( IN ) :: KEEP(500),INODE,N,SLAVEF
481 INTEGER(8) KEEP8(150)
482 INTEGER,
INTENT( IN ) :: STEP(N),
483 & istep_to_iniv2(keep(71)),
484 & tab_pos_in_pere(slavef+2,
max(1,keep(56)))
485 INTEGER,
INTENT( IN ) :: NASS, NCB,
487 INTEGER,
INTENT( OUT ) :: ISLAVE, IPOSSLAVE
488 INTEGER BLSIZE, J, ISHIFT
489 IF ((nslaves.LE.0).OR.(position.LE.nass))
THEN
494 IF (keep(48).NE.0.and.keep(48).NE.3.and.keep(48).NE.4
495 & .and.keep(48).NE.5)
THEN
496 WRITE(*,*)
'Error in MUMPS_BLOC2_GET_ISLAVE: undef strat'
499 IF (keep(48).ne.0)
THEN
500 j = istep_to_iniv2( step(inode) )
501 ishift = position - nass
502 DO islave = nslaves,1,-1
503 IF ( ishift .GE. tab_pos_in_pere(islave,j))
THEN
504 iposslave = ishift - tab_pos_in_pere(islave,j) + 1
509 blsize = ncb / nslaves
510 islave =
min( nslaves,
511 & ( position - nass - 1 ) / blsize + 1 )
512 iposslave = position - nass - ( islave - 1 ) * blsize
subroutine mumps_bloc2_set_posk483(getpositions, nslaves, nfront, ncb, kmin, kmax, slavef, nbrowmax, maxsurfcb, tabpos, sizetabpos)
subroutine mumps_bloc2_get_islave(keep, keep8, inode, step, n, slavef, istep_to_iniv2, tab_pos_in_pere nass, ncb, nslaves, position, islave, iposslave)
subroutine mumps_bloc2_get_slave_info(keep, keep8, inode, step, n, slavef, istep_to_iniv2, tab_pos_in_pere islave, ncb, nslaves, size, first_index)