229 & INODE, FPERE, NFRONT, LCONT,
231 & IWROW, IWCOL, A, PACKED_CB,
232 & DEST, TAG, COMM, KEEP, IERR )
234 INTEGER , tag, comm, ierr
235 INTEGER nbrows_already_sent
236 INTEGER,
INTENT(INOUT) :: keep(500)
237 INTEGER , fpere, nfront, lcont, nass, npiv
238 INTEGER iwrow( lcont ), iwcol( lcont )
243 INTEGER nbrows_packet
244 INTEGER position, ireq, ipos, i,
245 INTEGER size1, size2, size_pack, size_av, size_av_reals
250 parameter( izero = 0, ione = 1 )
251 LOGICAL recv_buf_smaller_than_send
255 IF (nbrows_already_sent .EQ. 0)
THEN
257 & comm, size1, ierr_mpi)
263 recv_buf_smaller_than_send = .false.
266 recv_buf_smaller_than_send = .true.
268 size_av_reals = ( size_av - size1 ) /
sizeofreal
269 IF (size_av_reals < 0 )
THEN
273 tmp=2.0d0*dble(nbrows_already_sent)+1.0d0
276 & + 8.0d0 * dble(size_av_reals)) - tmp )
282 nbrows_packet = size_av_reals / lcont
287 nbrows_packet =
max(0,
288 &
min(nbrows_packet, lcont - nbrows_already_sent))
289 IF (nbrows_packet .EQ. 0 .AND. lcont .NE. 0)
THEN
290 IF (recv_buf_smaller_than_send)
THEN
299 sizecb = (nbrows_already_sent*nbrows_packet)+(nbrows_packet
300 & *(nbrows_packet+1))/2
302 sizecb = nbrows_packet * lcont
305 & comm, size2, ierr_mpi )
306 size_pack = size1 + size2
307 IF (size_pack .GT. size_av )
THEN
308 nbrows_packet = nbrows_packet - 1
309 IF (nbrows_packet > 0)
THEN
312 IF (recv_buf_smaller_than_send)
THEN
321 IF (nbrows_packet + nbrows_already_sent.NE.lcont .AND.
324 & .NOT. recv_buf_smaller_than_send)
331 IF (ierr .EQ. -1 .OR. ierr .EQ. -2)
THEN
332 nbrows_packet = nbrows_packet - 1
333 IF ( nbrows_packet > 0 )
GOTO 10
335 IF ( ierr .LT. 0 )
GOTO 100
337 CALL mpi_pack( inode, 1, mpi_integer,
338 &
buf_cb%CONTENT( ipos ), size_pack,
339 & position, comm, ierr_mpi )
340 CALL mpi_pack( fpere, 1, mpi_integer,
341 &
buf_cb%CONTENT( ipos ), size_pack,
342 & position, comm, ierr_mpi )
348 CALL mpi_pack( lcont_sent, 1, mpi_integer,
349 &
buf_cb%CONTENT( ipos ), size_pack,
350 & position, comm, ierr_mpi )
351 CALL mpi_pack( nbrows_already_sent, 1, mpi_integer,
352 &
buf_cb%CONTENT( ipos ), size_pack,
353 & position, comm, ierr_mpi )
354 CALL mpi_pack( nbrows_packet, 1, mpi_integer,
355 &
buf_cb%CONTENT( ipos ), size_pack,
356 & position, comm, ierr_mpi )
357 IF (nbrows_already_sent == 0)
THEN
358 CALL mpi_pack( lcont, 1, mpi_integer,
359 &
buf_cb%CONTENT( ipos ), size_pack,
360 & position, comm, ierr_mpi )
361 CALL mpi_pack( nass-npiv, 1, mpi_integer,
362 &
buf_cb%CONTENT( ipos ), size_pack,
363 & position, comm, ierr_mpi )
364 CALL mpi_pack( lcont , 1, mpi_integer,
365 &
buf_cb%CONTENT( ipos ), size_pack,
366 & position, comm, ierr_mpi )
367 CALL mpi_pack( izero, 1, mpi_integer,
368 &
buf_cb%CONTENT( ipos ), size_pack,
369 & position, comm, ierr_mpi )
370 CALL mpi_pack( ione, 1, mpi_integer,
371 &
buf_cb%CONTENT( ipos ), size_pack,
372 & position, comm, ierr_mpi )
373 CALL mpi_pack( izero, 1, mpi_integer,
374 &
buf_cb%CONTENT( ipos ), size_pack,
375 & position, comm, ierr_mpi )
376 CALL mpi_pack( iwrow, lcont, mpi_integer,
377 &
buf_cb%CONTENT( ipos ), size_pack,
378 & position, comm, ierr_mpi )
379 CALL mpi_pack( iwcol, lcont, mpi_integer,
380 &
buf_cb%CONTENT( ipos ), size_pack,
381 & position, comm, ierr_mpi )
383 IF ( lcont .NE. 0 )
THEN
384 j1 = 1 + nbrows_already_sent * nfront
386 DO i = nbrows_already_sent+1,
387 & nbrows_already_sent+nbrows_packet
388 CALL mpi_pack( a( j1 ), i, mpi_real,
389 &
buf_cb%CONTENT( ipos ), size_pack,
390 & position, comm, ierr_mpi )
394 DO i = nbrows_already_sent+1,
395 & nbrows_already_sent+nbrows_packet
396 CALL mpi_pack( a( j1 ), lcont, mpi_real,
397 &
buf_cb%CONTENT( ipos ), size_pack,
398 & position, comm, ierr_mpi )
403 keep(266)=keep(266)+1
405 & dest, tag, comm,
buf_cb%CONTENT( ireq ),
407 IF ( size_pack .LT. position )
THEN
408 WRITE(*,*)
'Error Try_send_cb: SIZE, POSITION=',size_pack,
412 IF ( size_pack .NE. position )
414 nbrows_already_sent = nbrows_already_sent + nbrows_packet
415 IF (nbrows_already_sent .NE. lcont )
THEN
865 & IROW, NCOL, ICOL, VAL, LDA, NELIM, TYPE_SON,
866 & NSLAVES, SLAVES, DEST, COMM, IERR,
868 & SLAVEF, KEEP,KEEP8, INIV2, TAB_POS_IN_PERE )
870 INTEGER nbrows_already_sent
871 INTEGER lda, nelim, type_son
872 INTEGER ipere, , nrow, ncol, nslaves
875 INTEGER slaves( nslaves )
877 INTEGER ipos, ireq, , comm, ierr
878 INTEGER slavef, keep(500), iniv2
879 INTEGER(8) keep8(150)
880 INTEGER tab_pos_in_pere(slavef+2,
max(1,keep(56)))
882 include
'mumps_tags.h'
884 INTEGER size1, size2, size3, size_pack, position, i
885 INTEGER nbrows_packet, ncol_send
887 LOGICAL recv_buf_smaller_than_send
893 IF ( nelim .NE. nrow )
THEN
894 WRITE(*,*)
'Error in TRY_SEND_MAITRE2:',nelim, nrow
897 IF (nbrows_already_sent .EQ. 0)
THEN
899 & comm, size1, ierr_mpi )
900 IF ( type_son .eq. 2 )
THEN
902 & comm, size3, ierr_mpi )
910 IF ( keep(50).ne.0 .AND. type_son .eq. 2 )
THEN
917 recv_buf_smaller_than_send = .false.
919 recv_buf_smaller_than_send = .true.
922 IF (nrow .GT. 0 )
THEN
923 nbrows_packet = (size_av - size1) / ncol_send /
sizeofreal
924 nbrows_packet =
min(nbrows_packet, nrow - nbrows_already_sent)
925 nbrows_packet =
max(nbrows_packet, 0)
929 IF (nbrows_packet .EQ. 0 .AND. nrow .NE. 0)
THEN
930 IF (recv_buf_smaller_than_send)
THEN
941 & comm, size2, ierr_mpi )
942 size_pack = size1 + size2
943 IF (size_pack .GT. size_av)
THEN
944 nbrows_packet = nbrows_packet - 1
945 IF ( nbrows_packet .GT. 0 )
THEN
948 IF (recv_buf_smaller_than_send)
THEN
957 IF (nbrows_packet + nbrows_already_sent.NE.nrow .AND.
960 & .NOT. recv_buf_smaller_than_send)
968 IF ( ierr .LT. 0 )
THEN
972 CALL mpi_pack( ipere, 1, mpi_integer,
973 &
buf_cb%CONTENT( ipos ), size_pack,
974 & position, comm, ierr_mpi )
975 CALL mpi_pack( ison, 1, mpi_integer,
976 &
buf_cb%CONTENT( ipos ), size_pack,
977 & position, comm, ierr_mpi )
978 CALL mpi_pack( nslaves, 1, mpi_integer,
979 &
buf_cb%CONTENT( ipos ), size_pack,
980 & position, comm, ierr_mpi )
981 CALL mpi_pack( nrow, 1, mpi_integer,
982 &
buf_cb%CONTENT( ipos ), size_pack,
983 & position, comm, ierr_mpi )
984 CALL mpi_pack( ncol, 1, mpi_integer,
985 &
buf_cb%CONTENT( ipos ), size_pack,
986 & position, comm, ierr_mpi )
987 CALL mpi_pack( nbrows_already_sent, 1, mpi_integer,
988 &
buf_cb%CONTENT( ipos ), size_pack,
989 & position, comm, ierr_mpi )
990 CALL mpi_pack( nbrows_packet, 1, mpi_integer,
991 &
buf_cb%CONTENT( ipos ), size_pack,
992 & position, comm, ierr_mpi )
993 IF (nbrows_already_sent .EQ. 0)
THEN
994 IF (nslaves.GT.0)
THEN
995 CALL mpi_pack( slaves, nslaves, mpi_integer,
996 &
buf_cb%CONTENT( ipos ), size_pack,
997 & position, comm, ierr_mpi )
999 CALL mpi_pack( irow, nrow, mpi_integer,
1000 &
buf_cb%CONTENT( ipos ), size_pack,
1001 & position, comm, ierr_mpi )
1002 CALL mpi_pack( icol, ncol, mpi_integer,
1003 &
buf_cb%CONTENT( ipos ), size_pack,
1004 & position, comm, ierr_mpi )
1005 IF ( type_son .eq. 2 )
THEN
1006 CALL mpi_pack( tab_pos_in_pere(1,iniv2), nslaves+1,
1008 &
buf_cb%CONTENT( ipos ), size_pack,
1009 & position, comm, ierr_mpi )
1012 IF (nbrows_packet.GE.1)
THEN
1013 DO i=nbrows_already_sent+1,
1014 & nbrows_already_sent+nbrows_packet
1017 &
buf_cb%CONTENT( ipos ), size_pack,
1018 & position, comm, ierr_mpi )
1021 keep(266)=keep(266)+1
1023 & dest, maitre2, comm,
1024 &
buf_cb%CONTENT( ireq ), ierr_mpi )
1025 IF ( size_pack .LT. position )
THEN
1026 write(*,*)
'Try_send_maitre2, SIZE,POSITION=',
1027 & size_pack,position
1030 IF ( size_pack .NE. position )
1032 nbrows_already_sent = nbrows_already_sent + nbrows_packet
1033 IF ( nbrows_already_sent .NE. nrow )
THEN
1041 & IPERE, NFRONT_PERE, NASS_PERE, NFS4FATHER,
1043 & ISON, NBROW, LMAP, MAPROW, PERM, IW_CBSON, A_CBSON, LA_CBSON,
1044 & ISLAVE, PDEST, PDEST_MASTER, COMM, IERR,
1046 & KEEP,KEEP8, STEP, N, SLAVEF,
1047 & ISTEP_TO_INIV2, TAB_POS_IN_PERE,
1048 & PACKED_CB, KEEP253_LOC, NVSCHUR,
1049 & SON_NIV, MYID, NPIV_CHECK )
1053 INTEGER nbrows_already_sent
1054 INTEGER,
INTENT (in) :: keep253_loc, nvschur
1055 INTEGER,
INTENT (in) :: son_niv
1056 INTEGER,
INTENT (in),
OPTIONAL :: npiv_check
1057 INTEGER ipere, ison, nbrow, myid
1058 INTEGER pdest, islave, comm, ierr
1059 INTEGER pdest_master, nass_pere, nslaves_pere,
1061 INTEGER maprow( lmap ), perm(
max(1, ))
1062 INTEGER iw_cbson( * )
1065 LOGICAL desc_in_lu, packed_cb
1066 INTEGER keep(500), n , slavef
1067 INTEGER(8) keep8(150)
1069 & istep_to_iniv2(keep(71)),
1070 & tab_pos_in_pere(slavef+2,
max(1,keep(56)))
1072 include
'mumps_tags.h'
1074 INTEGER nfs4father,size3,ps1,nca,lrow1
1077 REAL,
POINTER,
DIMENSION(:) :: m_array
1078 INTEGER nbrows_packet
1079 INTEGER max_row_length
1082 INTEGER npiv, nfront, hs
1083 INTEGER size_pack, size0, size1, size2, position,i
1084 INTEGER , b, size_reals, tmpsize, oneortwo, size_av
1086 INTEGER(8) :: apos, shiftcb_son, lda_son8
1087 INTEGER ipos_in_slave
1089 INTEGER indice_pere, nrow, ipos, ireq, nosla
1090 INTEGER ione, , this_row_length
1091 INTEGER size_desc_bande, desc_bande_bytes
1092 LOGICAL recv_buf_smaller_than_send
1093 LOGICAL not_enough_space
1096 TYPE(
lrb_type),
POINTER :: cb_lrb(:,:)
1097 INTEGER,
POINTER,
DIMENSION(:) :: begs_blr_row, begs_blr_col,
1099 INTEGER :: nb_row_shift, nb_col_shift, , panel2send,
1100 & current_panel_size, nb_blr_rows, nb_blr_cols,
1101 & cb_is_lr_int, ncol_shift, nrow_shift,
1102 & nbrows_packet_2pack,
1106 include
'mumps_headers.h'
1108 PARAMETER (zero = 0.0e0)
1109 cb_is_lr = (iw_cbson(1+xxlr).EQ.1
1110 & .OR. iw_cbson(1+xxlr).EQ.3)
1116 compute_max = (keep(219) .NE. 0) .AND.
1117 & (keep(50) .EQ. 2) .AND.
1118 & (pdest.EQ.pdest_master)
1119 IF (nbrows_already_sent == 0)
THEN
1120 IF (compute_max)
THEN
1122 IF (ierr .NE. 0)
THEN
1130 lrow = iw_cbson( 1 + keep(ixsz))
1131 nelim = iw_cbson( 2 + keep(ixsz))
1132 npiv = iw_cbson( 4 + keep(ixsz))
1133 IF ( npiv .LT. 0 )
THEN
1136 nrow = iw_cbson( 3 + keep(ixsz))
1137 nfront = lrow + npiv
1138 hs = 6 + iw_cbson( 6 + keep(ixsz)) + keep(ixsz)
1141 IF (son_niv.EQ.1)
THEN
1146 nb_blr_rows =
size(begs_blr_row) - 1
1149 nb_row_shift = nb_col_shift
1150 nass_shift = begs_blr_row(nb_row_shift+1)-1
1151 npiv_lr = begs_blr_col(nb_col_shift+1)-1
1156 nb_blr_rows =
size(begs_blr_sta) - 2
1157 begs_blr_row => begs_blr_sta(2:nb_blr_rows+2)
1159 & begs_blr_col, nb_col_shift)
1164 DO i=nb_row_shift+1,nb_blr_rows
1165 IF (begs_blr_row(i+1)-1-nass_shift
1166 & .GT.nbrows_already_sent+perm(1)-1)
THEN
1171 IF (panel2send.EQ.-1)
THEN
1172 write(*,*)
'Internal error: PANEL2SEND not found'
1175 IF (keep(50).EQ.0)
THEN
1176 nb_blr_cols =
size(begs_blr_col) - 1
1177 ELSEIF (son_niv.EQ.1)
THEN
1178 nb_blr_cols = panel2send
1181 ncol_shift = npiv_lr
1182 nrow_shift = lrow - nrow
1183 DO i=nb_col_shift+1,
size(begs_blr_col)-1
1184 IF (begs_blr_col(i+1)-ncol_shift.GT.
1185 & begs_blr_row(panel2send+1)-1+nrow_shift)
THEN
1190 IF (nb_blr_cols.EQ.-1)
THEN
1191 write(*,*)
'Internal error: NB_BLR_COLS not found'
1194 max_row_length = begs_blr_row(panel2send+1)-1+nrow_shift
1196 current_panel_size = begs_blr_row(panel2send+1)
1197 & - begs_blr_row(panel2send)
1198 panel_beg_offset = perm(1) + nbrows_already_sent -
1199 & begs_blr_row(panel2send) + nass_shift
1201 state_son = iw_cbson(1+xxs)
1202 IF (state_son .EQ. s_nolcbcontig)
THEN
1203 lda_son8 = int(lrow,8)
1204 shiftcb_son = int(npiv,8)*int(nrow,8)
1205 ELSE IF (state_son .EQ. s_nolcleaned)
THEN
1206 lda_son8 = int(lrow,8)
1209 lda_son8 = int(nfront,8)
1210 shiftcb_son = int(npiv,8)
1213 IF (pdest .EQ. pdest_master)
THEN
1216 size_desc_bande=(7+slavef+keep(127)*2)
1217 size_desc_bande=size_desc_bande+int(real(keep(12))*
1218 & real(size_desc_bande)/100.0e0)
1219 size_desc_bande=
max(size_desc_bande,
1220 & 7+nslaves_pere+nfront_pere+nfront_pere-nass_pere)
1222 desc_bande_bytes=size_desc_bande*
sizeofint
1224 recv_buf_smaller_than_send = .false.
1226 recv_buf_smaller_than_send = .true.
1230 IF (nbrows_already_sent==0)
THEN
1231 IF(compute_max)
THEN
1233 & comm, size0, ierr_mpi )
1234 IF(nfs4father .GT. 0)
THEN
1236 & comm, size1, ierr_mpi )
1241 IF (keep(50) .EQ. 0)
THEN
1246 IF (pdest .EQ.pdest_master)
THEN
1248 ELSE IF (keep(50) .EQ. 0)
THEN
1251 l = lrow + perm(1) - lmap + nbrows_already_sent - 1
1256 nbint = nbint + 4*(nb_blr_cols-nb_col_shift) + 2
1259 & comm, tmpsize, ierr_mpi )
1260 size1 = size1 + tmpsize
1261 size_av = size_av - size1
1262 not_enough_space=.false.
1263 IF (size_av .LT.0 )
THEN
1265 not_enough_space=.true.
1267 IF ( keep(50) .EQ. 0 )
THEN
1272 & ( 1 + 2 * lrow + 2 * perm(1) + 2 * nbrows_already_sent )
1274 nbrows_packet=int((dble(-b)+sqrt((dble(b)*dble(b))+
1275 & dble(4)*dble(2)*dble(size_av)/dble(
sizeofint) *
1281 nbrows_packet =
max( 0, nbrows_packet)
1282 nbrows_packet =
min(nbrow-nbrows_already_sent, nbrows_packet)
1283 not_enough_space = not_enough_space .OR.
1284 & (nbrows_packet .EQ.0.AND. nbrow.NE.0)
1285 nbrows_packet_2pack = nbrows_packet
1287 nbrows_packet_2pack = current_panel_size
1290 & nb_col_shift, nb_blr_cols, panel2send
1292 not_enough_space = (size_av.LT.size_reals)
1293 IF (.NOT.not_enough_space)
THEN
1294 nbrows_packet =
min(nbrows_packet,
1295 & current_panel_size-panel_beg_offset)
1298 IF (not_enough_space)
THEN
1299 IF (recv_buf_smaller_than_send)
THEN
1308 IF (keep(50).EQ.0)
THEN
1309 max_row_length = -99999
1310 ELSEIF (son_niv.EQ.1)
THEN
1311 max_row_length = lrow+perm(1)-lmap+nbrows_already_sent
1312 & + nbrows_packet_2pack-1
1315 IF (keep(50).EQ.0)
THEN
1316 max_row_length = -99999
1317 size_reals = nbrows_packet_2pack * lrow
1319 size_reals = ( lrow + perm(1) + nbrows_already_sent ) *
1320 & nbrows_packet_2pack + ( nbrows_packet_2pack
1321 & ( nbrows_packet_2pack + 1) ) / 2
1322 max_row_length = lrow+perm(1)-lmap+nbrows_already_sent
1323 & + nbrows_packet_2pack-1
1326 size_integers = oneortwo* nbrows_packet_2pack
1328 & comm, size2, ierr_mpi )
1330 & comm, size3, ierr_mpi )
1331 IF (size2 + size3 .GT. size_av )
THEN
1332 nbrows_packet = nbrows_packet -1
1333 IF (nbrows_packet .GT. 0 .AND..NOT.cb_is_lr)
THEN
1336 IF (recv_buf_smaller_than_send)
THEN
1345 size_pack = size1 + size2 + size3
1346 IF (nbrows_packet + nbrows_already_sent.NE.nbrow .AND.
1348 & .NOT. recv_buf_smaller_than_send .AND.
1360 IF (ierr .EQ. -1 .OR. ierr.EQ. -2)
THEN
1361 nbrows_packet = nbrows_packet - 1
1362 IF (nbrows_packet > 0 )
GOTO 10
1364 IF ( ierr .LT. 0 )
GOTO 100
1366 CALL mpi_pack( ipere, 1, mpi_integer,
1367 &
buf_cb%CONTENT( ipos ), size_pack,
1368 & position, comm, ierr_mpi )
1369 CALL mpi_pack( ison, 1, mpi_integer,
1370 &
buf_cb%CONTENT( ipos ), size_pack,
1371 & position, comm, ierr_mpi )
1372 CALL mpi_pack( nbrow, 1, mpi_integer,
1373 &
buf_cb%CONTENT( ipos ), size_pack,
1374 & position, comm, ierr_mpi )
1375 IF (keep(50)==0)
THEN
1376 CALL mpi_pack( lrow, 1, mpi_integer,
1377 &
buf_cb%CONTENT( ipos ), size_pack,
1378 & position, comm, ierr_mpi )
1380 CALL mpi_pack( max_row_length, 1, mpi_integer,
1381 &
buf_cb%CONTENT( ipos ), size_pack,
1382 & position, comm, ierr_mpi )
1384 CALL mpi_pack( nbrows_already_sent, 1, mpi_integer,
1385 &
buf_cb%CONTENT( ipos ), size_pack,
1386 & position, comm, ierr_mpi )
1387 CALL mpi_pack( nbrows_packet, 1, mpi_integer,
1388 &
buf_cb%CONTENT( ipos ), size_pack,
1389 & position, comm, ierr_mpi )
1390 CALL mpi_pack( cb_is_lr_int, 1, mpi_integer,
1391 &
buf_cb%CONTENT( ipos ), size_pack,
1392 & position, comm, ierr_mpi )
1393 IF ( pdest .NE. pdest_master )
THEN
1394 IF (keep(50)==0)
THEN
1395 CALL mpi_pack( iw_cbson( hs + nrow + npiv + 1 ), lrow,
1397 &
buf_cb%CONTENT( ipos ), size_pack,
1398 & position, comm, ierr_mpi )
1400 IF (max_row_length > 0)
THEN
1401 CALL mpi_pack( iw_cbson( hs + nrow + npiv + 1 ),
1404 &
buf_cb%CONTENT( ipos ), size_pack,
1405 & position, comm, ierr_mpi )
1409 DO j=nbrows_already_sent+1,nbrows_already_sent+nbrows_packet
1411 indice_pere=maprow(i)
1413 & keep,keep8, ipere, step, n, slavef,
1414 & istep_to_iniv2, tab_pos_in_pere,
1417 & nfront_pere - nass_pere,
1422 indice_pere = ipos_in_slave
1423 CALL mpi_pack( indice_pere, 1, mpi_integer,
1424 &
buf_cb%CONTENT( ipos ), size_pack,
1425 & position, comm, ierr_mpi )
1429 & nb_col_shift, nb_blr_cols, panel2send,
1432 & size_pack, position, comm, ierr
1434 IF (keep(50).ne.0)
THEN
1435 DO j=nbrows_already_sent+1,nbrows_already_sent+nbrows_packet
1437 this_row_length = lrow + i - lmap
1438 CALL mpi_pack( this_row_length, 1, mpi_integer,
1439 &
buf_cb%CONTENT( ipos ), size_pack,
1440 & position, comm, ierr_mpi )
1445 DO j=nbrows_already_sent+1,nbrows_already_sent+nbrows_packet
1447 indice_pere=maprow(i)
1449 & keep,keep8, ipere, step, n, slavef,
1450 & istep_to_iniv2, tab_pos_in_pere,
1453 & nfront_pere - nass_pere,
1458 IF (keep(50).ne.0)
THEN
1459 this_row_length = lrow + i - lmap
1460 CALL mpi_pack( this_row_length, 1, mpi_integer,
1461 &
buf_cb%CONTENT( ipos ), size_pack,
1462 & position, comm, ierr_mpi )
1464 this_row_length = lrow
1466 IF (desc_in_lu)
THEN
1467 IF ( packed_cb )
THEN
1468 IF (nelim.EQ.0)
THEN
1471 itmp8 = int(nelim+i,8)
1473 apos = itmp8 * (itmp8-1_8) / 2_8 + 1_8
1475 apos = int(i+nelim-1, 8) * int(lrow,8) + 1_8
1478 IF ( packed_cb )
THEN
1479 IF ( lrow .EQ. nrow )
THEN
1481 apos = itmp8 * (itmp8-1_8)/2_8 + 1_8
1483 itmp8 = int(i + lrow - nrow,8)
1484 apos = itmp8 * (itmp8-1_8)/2_8 + 1_8 -
1485 & int(lrow - nrow, 8) * int(lrow-nrow+1,8) / 2_8
1488 apos = int( i - 1, 8 ) * lda_son8 + shiftcb_son + 1_8
1491 CALL mpi_pack( a_cbson( apos ), this_row_length,
1493 &
buf_cb%CONTENT( ipos ), size_pack,
1494 & position, comm, ierr_mpi )
1497 IF (nbrows_already_sent == 0)
THEN
1498 IF (compute_max)
THEN
1501 &
buf_cb%CONTENT( ipos ), size_pack,
1502 & position, comm, ierr_mpi )
1503 IF (nfs4father .GT. 0)
THEN
1506 & iw_cbson(1+xxf), m_array)
1507 CALL mpi_pack(m_array(1), nfs4father,
1509 &
buf_cb%CONTENT( ipos ), size_pack,
1510 & position, comm, ierr_mpi )
1514 IF(maprow(nrow) .GT. nass_pere)
THEN
1516 IF(maprow(ps1).GT.nass_pere)
EXIT
1518 IF (desc_in_lu)
THEN
1520 apos = int(nelim+ps1,8) * int(nelim+ps1-1,8) /
1523 asize = int(nrow,8) * int(nrow+1,8)/2_8 -
1524 & int(nelim+ps1,8) * int(nelim+ps1-1,8)/2_8
1527 apos = int(ps1+nelim-1,8) * int(lrow,8) + 1_8
1529 asize = int(nca,8) * int(nrow-ps1+1,8)
1535 WRITE(*,*)
"Error in PARPIV/SMUMPS_BUF_SEND_CONTRIB_TYPE2"
1539 itmp8 = int(ps1 + lrow - nrow,8)
1540 apos = itmp8 * (itmp8 - 1_8) / 2_8 + 1_8 -
1541 & int(lrow-nrow,8)*int(lrow-nrow+1,8)/2_8
1542 asize = int(lrow,8)*int(lrow+1,8)/2_8 -
1543 & itmp8*(itmp8-1_8)/2_8
1546 apos = int(ps1-1,8) * lda_son8 + 1_8 + shiftcb_son
1548 asize = la_cbson - apos + 1_8
1552 IF ( nrow-ps1+1-keep253_loc-nvschur .GT. 0 )
THEN
1554 & a_cbson(apos),asize,nca,
1555 & nrow-ps1+1-keep253_loc-nvschur,
1561 &
buf_cb%CONTENT( ipos ), size_pack,
1562 & position, comm, ierr_mpi )
1567 keep(266)=keep(266)+1
1569 & pdest, contrib_type2, comm,
1570 &
buf_cb%CONTENT( ireq ), ierr_mpi )
1571 IF ( size_pack.LT. position )
THEN
1572 WRITE(*,*)
' contniv2: SIZE, POSITION =',size_pack, position
1573 WRITE(*,*)
' NBROW, LROW = ', nbrow, lrow
1576 IF ( size_pack .NE. position )
1578 nbrows_already_sent=nbrows_already_sent + nbrows_packet
1579 IF (nbrows_already_sent .NE. nbrow )
THEN
1639 & INODE, NFRONT, NASS1, NFS4FATHER,
1640 & ISON, MYID, NSLAVES, SLAVES_PERE,
1643 & DEST, NDEST, SLAVEF,
1645 & KEEP,KEEP8, STEP, N,
1646 & ISTEP_TO_INIV2, TAB_POS_IN_PERE
1650 INTEGER inode, nfront, nass1, ncbson, nslaves,
1652 INTEGER slavef, myid, ison
1653 INTEGER trow( ncbson )
1654 INTEGER dest( ndest )
1655 INTEGER slaves_pere( nslaves )
1657 INTEGER keep(500), n
1658 INTEGER(8) keep8(150)
1660 & istep_to_iniv2(keep(71)),
1661 & tab_pos_in_pere(slavef+2,
max(1,keep(56)))
1663 include
'mumps_tags.h'
1665 INTEGER size_av, idest, nsend, size, nfs4father
1666 INTEGER trow_size, , indx, iniv2
1673 IF ( ndest .eq. 1 )
THEN
1674 IF ( dest(1).EQ.myid )
GOTO 500
1675 SIZE =
sizeofint * ( 7 + nslaves + ncbson )
1676 IF ( nslaves.GT.0 )
THEN
1677 SIZE =
SIZE +
sizeofint * ( nslaves + 1 )
1686 IF (ierr .LT. 0 )
THEN
1690 buf_cb%CONTENT( position ) = inode
1691 position = position + 1
1692 buf_cb%CONTENT( position ) = ison
1693 position = position + 1
1694 buf_cb%CONTENT( position ) = nslaves
1695 position = position + 1
1696 buf_cb%CONTENT( position ) = nfront
1697 position = position + 1
1698 buf_cb%CONTENT( position ) = nass1
1699 position = position + 1
1700 buf_cb%CONTENT( position ) = ncbson
1701 position = position + 1
1702 buf_cb%CONTENT( position ) = nfs4father
1703 position = position + 1
1704 IF ( nslaves.GT.0 )
THEN
1705 iniv2 = istep_to_iniv2( step(inode) )
1706 buf_cb%CONTENT( position: position + nslaves )
1707 & = tab_pos_in_pere(1:nslaves+1,iniv2)
1708 position = position + nslaves + 1
1710 IF ( nslaves .NE. 0 )
THEN
1711 buf_cb%CONTENT( position: position + nslaves - 1 )
1712 & = slaves_pere( 1: nslaves )
1713 position = position + nslaves
1715 buf_cb%CONTENT( position:position+ncbson-1 ) =
1717 position = position + ncbson
1718 position = position - ipos
1719 IF ( position *
sizeofint .NE.
SIZE )
THEN
1720 WRITE(*,*)
'Error in SMUMPS_BUF_SEND_MAPLIG :',
1721 &
' wrong estimated size'
1724 keep(266)=keep(266)+1
1727 & dest( ndest ), maplig, comm,
1728 &
buf_cb%CONTENT( ireq ),
1733 IF ( dest( idest ) .ne. myid ) nsend = nsend + 1
1736 & ( (
ovhsize + 7 + nslaves )* nsend + ncbson )
1737 IF ( nslaves.GT.0 )
THEN
1738 SIZE =
SIZE +
sizeofint * nsend*( nslaves + 1 )
1741 IF ( size_av .LT.
SIZE )
THEN
1747 & keep,keep8, ison, step, n, slavef,
1748 & istep_to_iniv2, tab_pos_in_pere,
1752 SIZE =
sizeofint * ( nslaves + trow_size + 7 )
1753 IF ( nslaves.GT.0 )
THEN
1754 SIZE =
SIZE +
sizeofint * ( nslaves + 1 )
1756 IF ( myid .NE. dest( idest ) )
THEN
1762 & ione, dest(idest) )
1763 IF ( ierr .LT. 0 )
THEN
1764 WRITE(*,*)
'Internal error SMUMPS_BUF_SEND_MAPLIG',
1765 &
'IERR after BUF_LOOK=',ierr
1769 buf_cb%CONTENT( position ) = inode
1770 position = position + 1
1771 buf_cb%CONTENT( position ) = ison
1772 position = position + 1
1773 buf_cb%CONTENT( position ) = nslaves
1774 position = position + 1
1775 buf_cb%CONTENT( position ) = nfront
1776 position = position + 1
1777 buf_cb%CONTENT( position ) = nass1
1778 position = position + 1
1779 buf_cb%CONTENT( position ) = trow_size
1780 position = position + 1
1781 buf_cb%CONTENT( position ) = nfs4father
1782 position = position + 1
1783 IF ( nslaves.GT.0 )
THEN
1784 iniv2 = istep_to_iniv2( step(inode) )
1785 buf_cb%CONTENT( position: position + nslaves )
1786 & = tab_pos_in_pere(1:nslaves+1,iniv2)
1787 position = position + nslaves + 1
1789 IF ( nslaves .NE. 0 )
THEN
1790 buf_cb%CONTENT( position: position + nslaves - 1 )
1791 & = slaves_pere( 1: nslaves )
1792 position = position + nslaves
1794 buf_cb%CONTENT( position:position+trow_size-1 ) =
1795 & trow( indx: indx + trow_size - 1 )
1796 position = position + trow_size
1797 position = position - ipos
1798 IF ( position *
sizeofint .NE.
SIZE )
THEN
1799 WRITE(*,*)
' ERROR 1 in TRY_SEND_MAPLIG:',
1800 &
'Wrong estimated size'
1803 keep(266)=keep(266)+1
1807 &
buf_cb%CONTENT( ireq ),
1816 & NCOL, NPIV, FPERE, LASTBL, IPIV, VAL,
1817 & PDEST, NDEST, KEEP, NB_BLOC_FAC,
1820 & NELIM, NPARTSASS, CURRENT_BLR_PANEL,
1821 & LR_ACTIVATED, BLR_LorU,
1826 INTEGER,
intent(in) :: inode, ncol, npiv,
1827 & fpere, nfront, ndest
1828 INTEGER,
intent(in) :: ipiv( npiv )
1829 REAL,
intent(in) :: val( nfront, * )
1830 INTEGER,
intent(in) :: pdest( ndest )
1831 INTEGER,
intent(inout) :: keep(500)
1832 INTEGER,
intent(in) :: nb_bloc_fac,
1833 & nslaves_tot, comm, width
1834 LOGICAL,
intent(in) :: lastbl
1835 LOGICAL,
intent(in) :: lr_activated
1836 INTEGER,
intent(in) :: nelim, npartsass, current_blr_panel
1837 TYPE (
lrb_type),
DIMENSION(:),
intent(in) :: blr_loru
1838 INTEGER,
intent(inout) :: ierr
1840 include
'mumps_tags.h'
1842 INTEGER position, ireq, ipos, size1, size2, size3, sizet,
1847 INTEGER :: lrelay_info, dest_blocfacto, tag_blocfacto
1848 INTEGER :: lr_activated_int
1853 IF ( keep(50) .eq. 0 )
THEN
1856 & mpi_integer, comm, size1, ierr_mpi )
1860 & mpi_integer, comm, size1, ierr_mpi )
1863 IF ( keep(50) .eq. 0 )
THEN
1866 & mpi_integer, comm, size1, ierr_mpi )
1870 & mpi_integer, comm, size1, ierr_mpi )
1876 IF ( keep(50).NE.0 )
THEN
1882 IF (.NOT. lr_activated)
THEN
1884 & comm, size3, ierr_mpi )
1888 & comm, size3, ierr_mpi )
1894 sizet = size1 + size2
1898 IF ( keep(50) .eq. 0 )
THEN
1900 & mpi_integer, comm, sss, ierr_mpi )
1903 & mpi_integer, comm, sss, ierr_mpi )
1906 IF ( keep(50) .eq. 0 )
THEN
1908 & mpi_integer, comm, sss, ierr_mpi )
1911 & mpi_integer, comm, sss, ierr_mpi )
1922 IF ( ierr .LT. 0 )
THEN
1927 DO idest = 1, nbmsgs - 1
1932 iposmsg = ipos +
ovhsize * nbmsgs
1934 CALL mpi_pack( inode, 1, mpi_integer,
1935 &
buf_cb%CONTENT( iposmsg ), sizet,
1938 IF (lastbl) npivsent = -npiv
1939 CALL mpi_pack( npivsent, 1, mpi_integer,
1940 &
buf_cb%CONTENT( iposmsg ), sizet,
1941 & position, comm, ierr_mpi )
1942 IF ( lastbl .or. keep(50).ne.0 )
THEN
1943 CALL mpi_pack( fpere, 1, mpi_integer,
1944 &
buf_cb%CONTENT( iposmsg ), sizet,
1945 & position, comm, ierr_mpi )
1947 IF ( lastbl .AND. keep(50) .NE. 0 )
THEN
1948 CALL mpi_pack( nslaves_tot, 1, mpi_integer,
1949 &
buf_cb%CONTENT( iposmsg ), sizet,
1950 & position, comm, ierr_mpi )
1951 CALL mpi_pack( nb_bloc_fac, 1, mpi_integer,
1952 &
buf_cb%CONTENT( iposmsg ), sizet,
1953 & position, comm, ierr_mpi )
1955 CALL mpi_pack( ncol, 1, mpi_integer,
1956 &
buf_cb%CONTENT( iposmsg ), sizet,
1957 & position, comm, ierr_mpi )
1958 CALL mpi_pack( nelim, 1, mpi_integer,
1959 &
buf_cb%CONTENT( iposmsg ), sizet,
1960 & position, comm, ierr_mpi )
1961 CALL mpi_pack( npartsass, 1, mpi_integer,
1962 &
buf_cb%CONTENT( iposmsg ), sizet,
1963 & position, comm, ierr_mpi )
1964 CALL mpi_pack( current_blr_panel, 1, mpi_integer,
1965 &
buf_cb%CONTENT( iposmsg ), sizet,
1966 & position, comm, ierr_mpi )
1967 IF (lr_activated)
THEN
1968 lr_activated_int = 1
1970 lr_activated_int = 0
1972 CALL mpi_pack( lr_activated_int, 1, mpi_integer,
1973 &
buf_cb%CONTENT( iposmsg ), sizet,
1974 & position, comm, ierr_mpi )
1975 IF ( keep(50) .ne. 0 )
THEN
1976 CALL mpi_pack( nslaves_tot, 1, mpi_integer,
1977 &
buf_cb%CONTENT( iposmsg ), sizet,
1983 CALL mpi_pack( ipiv, npiv, mpi_integer,
1984 &
buf_cb%CONTENT( iposmsg ), sizet,
1985 & position, comm, ierr_mpi )
1987 IF (lr_activated)
THEN
1989 CALL mpi_pack( val(1,i), npiv+nelim,
1991 &
buf_cb%CONTENT( iposmsg ), sizet,
1992 & position, comm, ierr_mpi )
1995 &
buf_cb%CONTENT(iposmsg:
1996 & iposmsg+(sizet+keep(34)-1)/keep(34)-1),
1997 & sizet, position, comm, ierr)
2002 &
buf_cb%CONTENT( iposmsg ), sizet,
2003 & position, comm, ierr_mpi )
2007 CALL mpi_pack( lrelay_info, 1, mpi_integer,
2008 &
buf_cb%CONTENT( iposmsg ), sizet,
2009 & position, comm, ierr_mpi )
2010 DO idest = 1, nbmsgs
2011 dest_blocfacto = pdest(idest)
2012 IF ( keep(50) .EQ. 0)
THEN
2013 tag_blocfacto = bloc_facto
2014 keep(266)=keep(266)+1
2017 & dest_blocfacto, tag_blocfacto, comm,
2021 keep(266)=keep(266)+1
2024 & dest_blocfacto, bloc_facto_sym, comm,
2030 IF ( sizet .LT. position )
THEN
2031 WRITE(*,*)
' Error sending blocfacto : size < position'
2032 WRITE(*,*)
' Size,position=',sizet,position
2039 & NPIV, FPERE, IPOSK, JPOSK, UIP21K, NCOLU,
2040 & NDEST, PDEST, COMM, KEEP,
2041 & LR_ACTIVATED, BLR_LS, IPANEL,
2042 & A , LA, POSBLOCFACTO, LD_BLOCFACTO,
2043 & IPIV, MAXI_CLUSTER, IERR )
2046 INTEGER inode, ncolu, iposk, , npiv, ndest, fpere
2047 REAL uip21k( npiv, * )
2048 INTEGER pdest( ndest )
2050 INTEGER,
INTENT(INOUT) :: keep(500)
2051 LOGICAL,
intent(in) :: lr_activated
2052 TYPE (
lrb_type),
DIMENSION(:),
POINTER :: blr_ls
2053 INTEGER(8),
intent(in) :: la, posblocfacto
2054 INTEGER,
intent(in) :: ld_blocfacto, ipiv(npiv),
2055 & maxi_cluster, ipanel
2056 REAL,
intent(inout) :: a(la)
2058 include
'mumps_tags.h'
2060 INTEGER lr_activated_int
2061 INTEGER position, ireq, ipos, size1, size2, sizet,
2062 & idest, iposmsg, sss, sslr
2065 & mpi_integer, comm, size1, ierr_mpi )
2069 IF (.NOT. lr_activated)
THEN
2071 & comm, sslr, ierr_mpi )
2077 sizet = size1 + size2
2080 & mpi_integer, comm, sss, ierr_mpi )
2089 IF ( ierr .LT. 0 )
THEN
2094 DO idest = 1, ndest - 1
2099 iposmsg = ipos +
ovhsize * ndest
2101 CALL mpi_pack( inode, 1, mpi_integer,
2102 &
buf_cb%CONTENT( iposmsg ), sizet,
2103 & position, comm, ierr_mpi )
2104 CALL mpi_pack( iposk, 1, mpi_integer,
2105 &
buf_cb%CONTENT( iposmsg ), sizet,
2106 & position, comm, ierr_mpi )
2107 CALL mpi_pack( jposk, 1, mpi_integer,
2108 &
buf_cb%CONTENT( iposmsg ), sizet,
2109 & position, comm, ierr_mpi )
2110 CALL mpi_pack( npiv, 1, mpi_integer,
2111 &
buf_cb%CONTENT( iposmsg ), sizet,
2112 & position, comm, ierr_mpi )
2113 CALL mpi_pack( fpere, 1, mpi_integer,
2114 &
buf_cb%CONTENT( iposmsg ), sizet,
2115 & position, comm, ierr_mpi )
2116 CALL mpi_pack( ncolu, 1, mpi_integer,
2117 &
buf_cb%CONTENT( iposmsg ), sizet,
2118 & position, comm, ierr_mpi )
2119 IF (lr_activated)
THEN
2120 lr_activated_int = 1
2122 lr_activated_int = 0
2124 CALL mpi_pack( lr_activated_int, 1, mpi_integer,
2125 &
buf_cb%CONTENT( iposmsg ), sizet,
2126 & position, comm, ierr_mpi )
2127 CALL mpi_pack( ipanel, 1, mpi_integer,
2128 &
buf_cb%CONTENT( iposmsg ), sizet,
2129 & position, comm, ierr_mpi )
2130 IF (lr_activated)
THEN
2132 &
buf_cb%CONTENT( iposmsg:
2133 & iposmsg+(sizet+keep(34)-1)/keep(34)-1 ),
2134 & sizet, position, comm,
2135 & a, la, posblocfacto, ld_blocfacto,
2136 & ipiv, npiv, maxi_cluster, ierr )
2138 CALL mpi_pack( uip21k, abs(npiv) * ncolu,
2140 &
buf_cb%CONTENT( iposmsg ), sizet,
2141 & position, comm, ierr_mpi )
2146 & pdest(idest), bloc_facto_sym_slave, comm,
2151 IF ( sizet .LT. position )
THEN
2152 WRITE(*,*)
' Error sending blfac slave : size < position'
2153 WRITE(*,*)
' Size,position=',sizet,position
2160 & NBCOL_SON, NBROW_SON, INDCOL_SON, INDROW_SON,
2161 & LD_SON, VAL_SON, TAG, SUBSET_ROW, SUBSET_COL,
2162 & NSUBSET_ROW, NSUBSET_COL,
2164 & NPROW, NPCOL, MBLOCK, RG2L_ROW, RG2L_COL,
2165 & NBLOCK, PDEST, COMM, IERR ,
2166 & TAB, TABSIZE, TRANSP, SIZE_PACK,
2167 & N_ALREADY_SENT, KEEP, BBPCBP )
2169 INTEGER , ison, nbcol_son, nbrow_son, nsubset_row, nsubset_col
2170 INTEGER nprow, npcol, mblock, nblock, ld_son
2172 INTEGER pdest, tag, comm, ierr
2173 INTEGER indcol_son( nbcol_son ), indrow_son( nbrow_son )
2174 INTEGER subset_row( nsubset_row ), subset_col( nsubset_col )
2175 INTEGER :: rg2l_row(n)
2176 INTEGER :: rg2l_col(n)
2177 INTEGER nsuprow, nsupcol
2178 INTEGER(8),
INTENT(IN) :: tabsize
2181REAL val_son( ld_son, * ), tab(*)
2183 INTEGER n_already_sent
2186 INTEGER size1, size2, size_av, position
2187 INTEGER size_cbp, size_tmp
2188 INTEGER ireq, ipos, itab
2189 INTEGER isub, jsub, i, j
2190 INTEGER iloc_root, jloc_root
2191 INTEGER ipos_root, jpos_root
2193 LOGICAL recv_buf_smaller_than_send
2197 INTEGER nsubset_row_eff, nsubset_col_eff, nsupcol_eff
2200 IF ( nsubset_row * nsubset_col .NE. 0 )
THEN
2203 recv_buf_smaller_than_send = .false.
2205 recv_buf_smaller_than_send = .true.
2210 & mpi_integer, comm, size1, ierr_mpi )
2212 IF (n_already_sent .EQ. 0 .AND.
2213 &
min(nsuprow,nsupcol) .GT.0)
THEN
2215 & size_cbp, ierr_mpi )
2217 & size_tmp, ierr_mpi )
2218 size_cbp = size_cbp + size_tmp
2221 & size_tmp, ierr_mpi )
2222 size_cbp = size_cbp + size_tmp
2223 size1 = size1 + size_cbp
2225 IF (bbpcbp.EQ.1)
THEN
2226 nsubset_col_eff = nsubset_col - nsupcol
2229 nsubset_col_eff = nsubset_col
2230 nsupcol_eff = nsupcol
2232 nsubset_row_eff = nsubset_row - nsuprow
2236 n_packet =
min( n_packet,
2237 & nsubset_row_eff-n_already_sent )
2238 IF (n_packet .LE. 0 .AND.
2239 & nsubset_row_eff-n_already_sent.GT.0)
THEN
2240 IF (recv_buf_smaller_than_send)
THEN
2249 & mpi_integer, comm, size1, ierr_mpi )
2250 size1 = size1 + size_cbp
2253 & comm, size2, ierr_mpi )
2254 size_pack = size1 + size2
2255 IF (size_pack .GT. size_av)
THEN
2256 n_packet = n_packet - 1
2257 IF ( n_packet > 0 )
THEN
2260 IF (recv_buf_smaller_than_send)
THEN
2269 IF (n_packet + n_already_sent .NE. nsubset_row - nsuprow
2272 & .AND. .NOT. recv_buf_smaller_than_send)
2279 CALL mpi_pack_size(8,mpi_integer, comm, size_pack, ierr_mpi )
2288 IF ( ierr .LT. 0 )
GOTO 100
2290 CALL mpi_pack( ison, 1, mpi_integer,
2291 &
buf_cb%CONTENT( ipos ),
2292 & size_pack, position, comm, ierr_mpi )
2293 CALL mpi_pack( nsubset_row, 1, mpi_integer,
2294 &
buf_cb%CONTENT( ipos ),
2295 & size_pack, position, comm, ierr_mpi )
2296 CALL mpi_pack( nsuprow, 1, mpi_integer,
2297 &
buf_cb%CONTENT( ipos ),
2298 & size_pack, position, comm, ierr_mpi )
2299 CALL mpi_pack( nsubset_col, 1, mpi_integer,
2300 &
buf_cb%CONTENT( ipos ),
2301 & size_pack, position, comm, ierr_mpi )
2302 CALL mpi_pack( nsupcol, 1, mpi_integer,
2303 &
buf_cb%CONTENT( ipos ),
2304 & size_pack, position, comm, ierr_mpi )
2305 CALL mpi_pack( n_already_sent, 1, mpi_integer,
2306 &
buf_cb%CONTENT( ipos ),
2307 & size_pack, position, comm, ierr_mpi )
2308 CALL mpi_pack( n_packet, 1, mpi_integer,
2309 &
buf_cb%CONTENT( ipos ),
2310 & size_pack, position, comm, ierr_mpi )
2311 CALL mpi_pack( bbpcbp, 1, mpi_integer,
2312 &
buf_cb%CONTENT( ipos ),
2313 & size_pack, position, comm, ierr_mpi )
2314 IF ( nsubset_row * nsubset_col .NE. 0 )
THEN
2315 IF (n_already_sent .EQ. 0 .AND.
2316 &
min(nsuprow, nsupcol) .GT. 0)
THEN
2317 DO isub = nsubset_row-nsuprow+1, nsubset_row
2318 i = subset_row( isub )
2319 ipos_root = rg2l_row(indcol_son( i ))
2321 & * ( ( ipos_root - 1 ) / ( mblock * nprow ) )
2322 & + mod( ipos_root - 1, mblock ) + 1
2323 CALL mpi_pack( iloc_root, 1, mpi_integer,
2324 &
buf_cb%CONTENT( ipos ),
2325 & size_pack, position, comm, ierr_mpi )
2327 DO isub = nsubset_col-nsupcol+1, nsubset_col
2328 j = subset_col( isub )
2329 jpos_root = indrow_son( j ) - n
2331 & * ( ( jpos_root - 1 ) / ( nblock * npcol ) )
2332 & + mod( jpos_root - 1, nblock ) + 1
2333 CALL mpi_pack( jloc_root, 1, mpi_integer,
2334 &
buf_cb%CONTENT( ipos ),
2335 & size_pack, position, comm, ierr_mpi )
2337 IF ( tabsize.GE.int(nsuprow,8)*int(nsupcol,8) )
THEN
2339 DO jsub = nsubset_row - nsuprow+1, nsubset_row
2340 j = subset_row(jsub)
2341 DO isub = nsubset_col - nsupcol+1, nsubset_col
2342 i = subset_col(isub)
2343 tab(itab) = val_son(j, i)
2347 CALL mpi_pack(tab(1), nsuprow*nsupcol,
2349 &
buf_cb%CONTENT( ipos ),
2350 & size_pack, position, comm, ierr_mpi )
2352 DO jsub = nsubset_row - nsuprow+1, nsubset_row
2353 j = subset_row(jsub)
2354 DO isub = nsubset_col - nsupcol+1, nsubset_col
2355 i = subset_col(isub)
2358 &
buf_cb%CONTENT( ipos ),
2359 & size_pack, position, comm, ierr_mpi )
2364 IF ( .NOT. transp )
THEN
2365 DO isub = n_already_sent+1, n_already_sent+n_packet
2366 i = subset_row( isub )
2367 ipos_root = rg2l_row( indrow_son( i ) )
2369 & * ( ( ipos_root - 1 ) / ( mblock * nprow ) )
2370 & + mod( ipos_root - 1, mblock ) + 1
2371 CALL mpi_pack( iloc_root, 1, mpi_integer,
2372 &
buf_cb%CONTENT( ipos ),
2373 & size_pack, position, comm, ierr_mpi )
2375 DO jsub = 1, nsubset_col_eff - nsupcol_eff
2376 j = subset_col( jsub )
2377 jpos_root = rg2l_col( indcol_son( j ) )
2379 & * ( ( jpos_root - 1 ) / ( nblock * npcol ) )
2380 & + mod( jpos_root - 1, nblock ) + 1
2381 CALL mpi_pack( jloc_root, 1, mpi_integer,
2382 &
buf_cb%CONTENT( ipos ),
2383 & size_pack, position, comm, ierr_mpi )
2385 DO jsub = nsubset_col_eff-nsupcol_eff+1, nsubset_col_eff
2386 j = subset_col( jsub )
2387 jpos_root = indcol_son( j ) - n
2389 & * ( ( jpos_root - 1 ) / ( nblock * npcol ) )
2390 & + mod( jpos_root - 1, nblock ) + 1
2391 CALL mpi_pack( jloc_root, 1, mpi_integer,
2392 &
buf_cb%CONTENT( ipos ),
2393 & size_pack, position, comm, ierr_mpi )
2396 DO jsub = n_already_sent+1, n_already_sent+n_packet
2397 j = subset_row( jsub )
2398 ipos_root = rg2l_row( indcol_son( j ) )
2400 & * ( ( ipos_root - 1 ) / ( mblock * nprow ) )
2401 & + mod( ipos_root - 1, mblock ) + 1
2402 CALL mpi_pack( iloc_root, 1, mpi_integer,
2403 &
buf_cb%CONTENT( ipos ),
2404 & size_pack, position, comm, ierr_mpi )
2406 DO isub = 1, nsubset_col_eff - nsupcol_eff
2407 i = subset_col( isub )
2408 jpos_root = rg2l_col( indrow_son( i ) )
2410 & * ( ( jpos_root - 1 ) / ( nblock * npcol ) )
2411 & + mod( jpos_root - 1, nblock ) + 1
2412 CALL mpi_pack( jloc_root, 1, mpi_integer,
2413 &
buf_cb%CONTENT( ipos ),
2414 & size_pack, position, comm, ierr_mpi )
2416 DO isub = nsubset_col_eff - nsupcol_eff + 1, nsubset_col_eff
2417 i = subset_col( isub )
2418 jpos_root = indrow_son(i) - n
2420 & * ( ( jpos_root - 1 ) / ( nblock * npcol ) )
2421 & + mod( jpos_root - 1, nblock ) + 1
2422 CALL mpi_pack( jloc_root, 1, mpi_integer,
2423 &
buf_cb%CONTENT( ipos ),
2424 & size_pack, position, comm, ierr_mpi )
2427 IF ( tabsize.GE.int(n_packet,8)*int(nsubset_col_eff,8) )
THEN
2428 IF ( .NOT. transp )
THEN
2430 DO isub = n_already_sent+1,
2431 & n_already_sent+n_packet
2432 i = subset_row( isub )
2433 DO jsub = 1, nsubset_col_eff
2434 j = subset_col( jsub )
2435 tab( itab ) = val_son(j,i)
2439 CALL mpi_pack(tab(1), nsubset_col_eff*n_packet,
2441 &
buf_cb%CONTENT( ipos ),
2442 & size_pack, position, comm, ierr_mpi )
2445 DO jsub = n_already_sent+1, n_already_sent+n_packet
2446 j = subset_row( jsub )
2447 DO isub = 1, nsubset_col_eff
2448 i = subset_col( isub )
2449 tab( itab ) = val_son( j, i )
2453 CALL mpi_pack(tab(1), nsubset_col_eff*n_packet,
2455 &
buf_cb%CONTENT( ipos ),
2456 & size_pack, position, comm, ierr_mpi )
2459 IF ( .NOT. transp )
THEN
2460 DO isub = n_already_sent+1, n_already_sent+n_packet
2461 i = subset_row( isub )
2462 DO jsub = 1, nsubset_col_eff
2463 j = subset_col( jsub )
2466 &
buf_cb%CONTENT( ipos ),
2467 & size_pack, position, comm, ierr_mpi )
2471 DO jsub = n_already_sent+1, n_already_sent+n_packet
2472 j = subset_row( jsub )
2473 DO isub = 1, nsubset_col_eff
2474 i = subset_col( isub )
2477 &
buf_cb%CONTENT( ipos ),
2478 & size_pack, position, comm, ierr_mpi )
2484 keep(266)=keep(266)+1
2486 & pdest, tag, comm,
buf_cb%CONTENT( ireq ),
2488 IF ( size_pack .LT. position )
THEN
2489 WRITE(*,*)
' Error sending contribution to root:Size<positn'
2490 WRITE(*,*)
' Size,position=',size_pack,position
2493 IF ( size_pack .NE. position )
2495 n_already_sent = n_already_sent + n_packet
2496 IF (nsubset_row * nsubset_col .NE. 0)
THEN
2497 IF ( n_already_sent.NE.nsubset_row_eff ) ierr = -1
3321 & ( blr, buf, lbuf, position,
3324 & ipiv, npiv, maxi_cluster,
3327 INTEGER,
intent(out) :: IERR
3328 INTEGER,
intent(in) :: COMM, LBUF
3329 INTEGER,
intent(inout) :: POSITION
3330 INTEGER,
intent(inout) :: BUF(:)
3331 TYPE (),
DIMENSION(:),
intent(in) :: BLR
3332 INTEGER(8),
intent(in) :: LA, POSELTD
3333 INTEGER,
intent(in) :: LD_DIAG, NPIV
3334 INTEGER,
intent(in) :: IPIV(NPIV), MAXI_CLUSTER
3335 REAL,
intent(inout) :: A(LA)
3337 INTEGER I, ISLR_INT, J, ALLOCOK
3338 REAL,
ALLOCATABLE,
DIMENSION(:,:) ::
3339 REAL,
ALLOCATABLE,
DIMENSION(:) :: BLOCK
3340 REAL :: PIV1, PIV2, OFFDIAG
3343 CALL mpi_pack(
size(blr), 1, mpi_integer,
3344 & buf(1), lbuf, position, comm, ierr_mpi )
3345 allocate(block(maxi_cluster), stat=allocok )
3346 IF ( allocok .GT. 0 )
THEN
3347 WRITE(*,*)
'pb allocation in mumps_mpi_pack_scale_lr'
3351 allocate(scaled(maxi_cluster,2), stat=allocok )
3352 IF ( allocok .GT. 0 )
THEN
3353 WRITE(*,*)
'pb allocation in mumps_mpi_pack_scale_lr'
3358 IF (blr(i)%ISLR)
THEN
3363 CALL mpi_pack( islr_int, 1, mpi_integer,
3364 & buf(1), lbuf, position, comm, ierr_mpi )
3367 & buf(1), lbuf, position, comm, ierr_mpi )
3370 & buf(1), lbuf, position, comm, ierr_mpi )
3373 & buf(1), lbuf, position, comm, ierr_mpi )
3374 IF (blr(i)%ISLR)
THEN
3375 IF (blr(i)%K .GT. 0)
THEN
3376 CALL mpi_pack( blr(i)%Q(1,1), blr(i)%M*blr(i)%K,
3378 & buf(1), lbuf, position, comm, ierr_mpi )
3380 DO WHILE (j <= blr(i)%N)
3381 IF (ipiv(j) > 0)
THEN
3382 scaled(1:blr(i)%K,1) = a(poseltd+ld_diag*(j-1)+j-1)
3383 & * blr(i)%R(1:blr(i)%K,j)
3385 CALL mpi_pack( scaled(1,1), blr(i)%K,
3387 & buf(1), lbuf, position, comm, ierr_mpi )
3389 piv1 = a(poseltd+ld_diag*(j-1)+j-1)
3390 piv2 = a(poseltd+ld_diag*j+j)
3391 offdiag = a(poseltd+ld_diag*(j-1)+j)
3392 block(1:blr(i)%K) = blr(i)%R(1:blr(i)%K,j)
3393 scaled(1:blr(i)%K,1) = piv1 * blr(i)%R(1:blr(i)%K,j)
3394 & + offdiag * blr(i)%R(1:blr(i)%K,j+1)
3395 CALL mpi_pack( scaled(1,1), blr(i)%K,
3397 & buf(1), lbuf, position, comm, ierr_mpi )
3398 scaled(1:blr(i)%K,2) = offdiag * block(1:blr(i)%K)
3399 & + piv2 * blr(i)%R(1:blr(i)%K,j+1)
3401 CALL mpi_pack( scaled(1,2), blr(i)%K,
3403 & buf(1), lbuf, position, comm, ierr_mpi )
3409 DO WHILE (j <= blr(i)%N)
3410 IF (ipiv(j) > 0)
THEN
3411 scaled(1:blr(i)%M,1) = a(poseltd+ld_diag*(j-1)+j-1)
3412 & * blr(i)%Q(1:blr(i)%M,j)
3413 CALL mpi_pack( scaled(1,1), blr(i)%M,
3415 & buf(1), lbuf, position, comm, ierr_mpi )
3418 piv1 = a(poseltd+ld_diag*(j-1)+j-1)
3419 piv2 = a(poseltd+ld_diag*j+j)
3420 offdiag = a(poseltd+ld_diag*(j-1)+j)
3421 block(1:blr(i)%M) = blr(i)%Q(1:blr(i)%M,j)
3422 scaled(1:blr(i)%M,1) = piv1 * blr(i)%Q(1:blr(i)%M,j)
3423 & + offdiag * blr(i)%Q(1:blr(i)%M,j+1)
3424 CALL mpi_pack( scaled(1,1), blr(i)%M,
3426 & buf(1), lbuf, position, comm, ierr_mpi )
3427 scaled(1:blr(i)%M,2) = offdiag * block(1:blr(i)%M)
3428 & + piv2 * blr(i)%Q(1:blr(i)%M,j+1)
3429 CALL mpi_pack( scaled(1,2), blr(i)%M,
3431 & buf(1), lbuf, position, comm, ierr_mpi )
3438 IF (
allocated(block))
deallocate(block)
3439 IF (
allocated(scaled))
deallocate(scaled)