43 INTEGER lbuf, head, tail,lbuf_int, ilastmsg
51 REAL,
DIMENSION(:), allocatable
61 TYPE ( CMUMPS_COMM_BUFFER_TYPE ) :: B
65 INTEGER :: STATUS(MPI_STATUS_SIZE)
66 IF ( b%HEAD .NE. b%TAIL )
THEN
71 b%HEAD = b%CONTENT( b%HEAD +
next )
72 IF ( b%HEAD .EQ. 0 ) b%HEAD = b%TAIL
73 IF ( b%HEAD .NE. b%TAIL )
GOTO 10
76 IF ( b%HEAD .EQ. b%TAIL )
THEN
91 INTEGER intsize, realsize
145 INTEGER ierr, nfs4father
152 IF ( ierr .GT. 0 )
THEN
173 TYPE ( CMUMPS_COMM_BUFFER_TYPE ) :: BUF
178 IF (
associated ( buf%CONTENT ) )
DEALLOCATE( buf%CONTENT )
179 ALLOCATE( buf%CONTENT( buf%LBUF_INT ), stat = ierr )
180 IF (ierr .NE. 0)
THEN
181 NULLIFY( buf%CONTENT )
193 TYPE ( CMUMPS_COMM_BUFFER_TYPE ) :: BUF
197 INTEGER :: STATUS(MPI_STATUS_SIZE)
199 IF ( .NOT.
associated ( buf%CONTENT ) )
THEN
207 DO WHILE ( buf%HEAD.NE.0 .AND. buf%HEAD .NE. buf%TAIL )
210 IF ( .not. flag )
THEN
211 WRITE(*,*)
'** Warning: trying to cancel a request.'
212 WRITE(*,*)
'** This might be problematic'
217 buf%HEAD = buf%CONTENT( buf%HEAD +
next )
219 DEALLOCATE( buf%CONTENT )
220 NULLIFY( buf%CONTENT )
229 & INODE, FPERE, NFRONT, LCONT,
231 & IWROW, IWCOL, A, PACKED_CB,
232 & DEST, TAG, COMM, KEEP, IERR )
234 INTEGER dest, tag, comm, ierr
235 INTEGER nbrows_already_sent
236 INTEGER,
INTENT(INOUT) :: keep(500)
237 INTEGER inode, fpere, nfront, lcont, nass, npiv
238 INTEGER iwrow( lcont ), iwcol( lcont )
243 INTEGER nbrows_packet
244 INTEGER position, ireq, ipos, i, j1
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_complex,
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_complex,
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
423 & EFF_CB_SIZE, LD_CB, LD_PIV, NPIV,
426 & DEST, COMM, KEEP, IERR )
428 INTEGER nrhs, inode, ifath, eff_cb_size, ld_cb, ld_piv, npiv
429 INTEGER dest, comm, ierr, jbdeb, jbfin
430 COMPLEX cb( ld_cb*(nrhs-1)+eff_cb_size )
431 COMPLEX sol(
max(1, ld_piv*(nrhs-1)+npiv) )
432 INTEGER,
INTENT(INOUT) :: keep(500)
434 include
'mumps_tags.h'
436 INTEGER size, size1, size2, k
437 INTEGER position, ireq, ipos
451 IF ( ierr .LT. 0 )
THEN
455 CALL mpi_pack( inode, 1, mpi_integer,
456 &
buf_cb%CONTENT( ipos ),
SIZE,
457 & position, comm, ierr_mpi )
458 CALL mpi_pack( ifath, 1, mpi_integer,
459 &
buf_cb%CONTENT( ipos ),
SIZE,
460 & position, comm, ierr_mpi )
461 CALL mpi_pack( eff_cb_size , 1, mpi_integer,
462 &
buf_cb%CONTENT( ipos ),
SIZE,
463 & position, comm, ierr_mpi )
464 CALL mpi_pack( npiv , 1, mpi_integer,
465 &
buf_cb%CONTENT( ipos ),
SIZE,
466 & position, comm, ierr_mpi )
467 CALL mpi_pack( jbdeb , 1, mpi_integer,
468 &
buf_cb%CONTENT( ipos ),
SIZE,
469 & position, comm, ierr_mpi )
470 CALL mpi_pack( jbfin , 1, mpi_integer,
471 &
buf_cb%CONTENT( ipos ),
SIZE,
472 & position, comm, ierr_mpi )
474 CALL mpi_pack( cb( 1 + ld_cb * (k-1) ),
475 & eff_cb_size, mpi_complex,
476 &
buf_cb%CONTENT( ipos ),
SIZE,
477 & position, comm, ierr_mpi )
479 IF ( npiv .GT. 0 )
THEN
483 &
buf_cb%CONTENT( ipos ),
SIZE,
484 & position, comm, ierr_mpi )
487 keep(266)=keep(266)+1
489 & dest, master2slave, comm,
490 &
buf_cb%CONTENT( ireq ), ierr_mpi )
491 IF (
SIZE .LT. position )
THEN
492 WRITE(*,*)
'Try_send_master2slave: SIZE, POSITION = ',
501 & IW, W, JBDEB, JBFIN,
502 & RHSCOMP, NRHS, LRHSCOMP, IPOSINRHSCOMP, NPIV,
504 & DEST, TAG, COMM, IERR )
506 INTEGER ldw, dest, tag, comm, ierr
507 INTEGER nrhs_b, node1, node2, ncb, long, jbdeb, jbfin
508 INTEGER iw(
max( 1, long ) )
509 INTEGER,
INTENT(IN) :: lrhscomp, nrhs, iposinrhscomp, npiv
510 COMPLEX w(
max( 1, ldw * nrhs_b ) )
511 COMPLEX rhscomp(lrhscomp,nrhs)
512 INTEGER,
INTENT(INOUT) :: keep(500)
515 INTEGER position, ireq, ipos
516 INTEGER size1, size2, size, k
522 IF ( node2 .EQ. 0 )
THEN
530 IF ( long .GT. 0 )
THEN
532 & comm, size2, ierr_mpi )
538 IF ( ierr .LT. 0 )
THEN
542 CALL mpi_pack( node1, 1, mpi_integer,
543 &
buf_cb%CONTENT( ipos ),
SIZE,
544 & position, comm, ierr_mpi )
545 IF ( node2 .NE. 0 )
THEN
546 CALL mpi_pack( node2, 1, mpi_integer,
547 &
buf_cb%CONTENT( ipos ),
SIZE,
548 & position, comm, ierr_mpi )
550 &
buf_cb%CONTENT( ipos ),
SIZE,
551 & position, comm, ierr_mpi )
553 CALL mpi_pack( jbdeb, 1, mpi_integer,
554 &
buf_cb%CONTENT( ipos ),
SIZE,
555 & position, comm, ierr_mpi )
556 CALL mpi_pack( jbfin, 1, mpi_integer,
557 &
buf_cb%CONTENT( ipos ),
SIZE,
558 & position, comm, ierr_mpi )
559 CALL mpi_pack( long, 1, mpi_integer,
560 &
buf_cb%CONTENT( ipos ),
SIZE,
561 & position, comm, ierr_mpi )
562 IF ( long .GT. 0 )
THEN
563 CALL mpi_pack( iw, long, mpi_integer,
564 &
buf_cb%CONTENT( ipos ),
SIZE,
565 & position, comm, ierr_mpi )
569 CALL mpi_pack( rhscomp(iposinrhscomp,jbdeb+k-1), npiv,
571 &
buf_cb%CONTENT( ipos ),
SIZE,
572 & position, comm, ierr_mpi )
574 IF (long-npiv .NE.0)
THEN
575 CALL mpi_pack( w(npiv+1+(k-1)*ldw), long-npiv,
577 &
buf_cb%CONTENT( ipos ),
SIZE,
578 & position, comm, ierr_mpi )
583 CALL mpi_pack( w(1+(k-1)*ldw), long, mpi_complex,
584 &
buf_cb%CONTENT( ipos ),
SIZE,
585 & position, comm, ierr_mpi )
589 keep(266)=keep(266)+1
591 & dest, tag, comm,
buf_cb%CONTENT( ireq ),
600 INTEGER dest, tag, comm, ierr
601 INTEGER,
INTENT(INOUT) :: keep(500)
604 INTEGER ipos, ireq, msg_size, position
611 & comm, msg_size, ierr_mpi )
615 IF ( ierr .LT. 0 )
THEN
616 write(6,*)
' Internal error in CMUMPS_BUF_SEND_1INT',
622 & mpi_integer,
buf_small%CONTENT( ipos ),
624 & position, comm, ierr_mpi )
625 keep(266)=keep(266)+1
627 & mpi_packed, dest, tag, comm,
632 & CHECK_COMM_LOAD,FLAG)
633 LOGICAL,
INTENT(IN) :: check_comm_nodes, check_comm_load
634 LOGICAL,
INTENT(OUT) :: flag
635 LOGICAL flag1, flag2, flag3
637 IF (check_comm_nodes)
THEN
640 flag = flag .AND. flag1 .AND. flag2
642 IF ( check_comm_load )
THEN
644 flag = flag .AND. flag3
649 TYPE ( CMUMPS_COMM_BUFFER_TYPE ) :: B
653 flag = ( b%HEAD == b%TAIL )
658 TYPE ( CMUMPS_COMM_BUFFER_TYPE ) :: B
662 INTEGER :: STATUS(MPI_STATUS_SIZE)
664 IF ( b%HEAD .NE. b%TAIL )
THEN
666 CALL mpi_test( b%CONTENT( b%HEAD +
req ), flag, status,
669 b%HEAD = b%CONTENT( b%HEAD +
next )
670 IF ( b%HEAD .EQ. 0 ) b%HEAD = b%TAIL
671 IF ( b%HEAD .NE. b%TAIL )
GOTO 10
674 IF ( b%HEAD .EQ. b%TAIL )
THEN
679 IF ( b%HEAD .LE. b%TAIL )
THEN
680 size_av =
max( b%LBUF_INT - b%TAIL, b%HEAD - 2 )
682 size_av = b%HEAD - b%TAIL - 1
689 INTEGER :: ipos, ireq, ierr
690 INTEGER,
PARAMETER :: ione=1
696 & ione , dest2,.true.)
699 SUBROUTINE buf_look( B, IPOS, IREQ, MSG_SIZE, IERR,
700 & NDEST , PDEST, TEST_ONLY)
702 TYPE ( CMUMPS_COMM_BUFFER_TYPE ) :: B
703 INTEGER,
INTENT(IN) :: MSG_SIZE
704 INTEGER,
INTENT(OUT) :: IPOS, IREQ, IERR
705 LOGICAL,
INTENT(IN),
OPTIONAL :: TEST_ONLY
707 INTEGER,
INTENT(IN) :: PDEST(max(1,NDEST))
710 INTEGER :: MSG_SIZE_INT
713 INTEGER :: STATUS(MPI_STATUS_SIZE)
715 IF ( b%HEAD .NE. b%TAIL )
THEN
717 CALL mpi_test( b%CONTENT( b%HEAD +
req ), flag, status,
720 b%HEAD = b%CONTENT( b%HEAD +
next )
721 IF ( b%HEAD .EQ. 0 ) b%HEAD = b%TAIL
722 IF ( b%HEAD .NE. b%TAIL )
GOTO 10
725 IF ( b%HEAD .EQ. b%TAIL )
THEN
731 msg_size_int = msg_size_int +
ovhsize
732 IF (
present(test_only))
RETURN
733 flag = ( ( b%HEAD .LE. b%TAIL )
735 & ( msg_size_int .LE. b%LBUF_INT - b%TAIL )
736 & .OR. ( msg_size_int .LE. b%HEAD - 2 ) ) )
738 & ( ( b%HEAD .GT. b%TAIL )
739 & .AND. ( msg_size_int .LE. b%HEAD - b%TAIL - 1 ) )
743 IF ( msg_size_int .GT. b%LBUF_INT - 1 )
THEN
750 IF ( b%HEAD .LE. b%TAIL )
THEN
751 IF ( msg_size_int .LE. b%LBUF_INT - b%TAIL + 1 )
THEN
753 ELSE IF ( msg_size_int .LE. b%HEAD - 1 )
THEN
759 b%CONTENT( b%ILASTMSG +
next ) = ibuf
761 b%TAIL = ibuf + msg_size_int
762 b%CONTENT( ibuf +
next ) = 0
769 TYPE ( CMUMPS_COMM_BUFFER_TYPE ) :: BUF
774 buf%TAIL = buf%ILASTMSG + size_int
778 & INODE, NBPROCFILS, NLIG, ILIG, NCOL, ICOL,
779 & NASS, NSLAVES_HDR, LIST_SLAVES,
781 & ESTIM_NFS4FATHER_ATSON,
782 & DEST, IBC_SOURCE, NFRONT, COMM, KEEP, IERR
786 INTEGER comm, ierr, nfront
787 INTEGER,
intent(in) :: inode
788 INTEGER,
intent(in) :: nlig, ncol, nass, nslaves_hdr, nslaves
789 INTEGER,
intent(in) :: estim_nfs4father_atson
790 INTEGER nbprocfils, dest
793INTEGER,
INTENT(IN) :: ibc_source
794 INTEGER list_slaves(
max(nslaves_hdr,1) )
795 INTEGER,
INTENT(INOUT) :: (500)
796 INTEGER,
INTENT(IN) :: lrstatus
798 include
'mumps_tags.h'
800 INTEGER size_int, size_bytes, position, ipos, ireq
806 size_int = ( 11 + nlig + ncol + nslaves_hdr )
815 IF ( ierr .LT. 0 )
THEN
819 buf_cb%CONTENT( position ) = size_int
820 position = position + 1
821 buf_cb%CONTENT( position ) = inode
822 position = position + 1
823 buf_cb%CONTENT( position ) = nbprocfils
824 position = position + 1
825 buf_cb%CONTENT( position ) = nlig
826 position = position + 1
827 buf_cb%CONTENT( position ) = ncol
828 position = position + 1
829 buf_cb%CONTENT( position ) = nass
830 position = position + 1
831 buf_cb%CONTENT( position ) = nfront
832 position = position + 1
833 buf_cb%CONTENT( position ) = nslaves_hdr
834 position = position + 1
835 buf_cb%CONTENT( position ) = nslaves
836 position = position + 1
837 buf_cb%CONTENT( position ) = lrstatus
838 position = position + 1
839 buf_cb%CONTENT( position ) = estim_nfs4father_atson
840 position = position + 1
841 IF (nslaves_hdr.GT.0)
THEN
842 buf_cb%CONTENT( position: position + nslaves_hdr - 1 ) =
843 & list_slaves( 1: nslaves_hdr )
844 position = position + nslaves_hdr
846 buf_cb%CONTENT( position:position + nlig - 1 ) = ilig
847 position = position + nlig
848 buf_cb%CONTENT( position:position + ncol - 1 ) = icol
849 position = position + ncol
850 position = position - ipos
851 IF ( position *
sizeofint .NE. size_bytes )
THEN
852 WRITE(*,*)
'Error in CMUMPS_BUF_SEND_DESC_BANDE :',
853 &
' wrong estimated size'
856 keep(266)=keep(266)+1
859 & dest, maitre_desc_bande, comm,
860 &
buf_cb%CONTENT( ireq ), ierr_mpi )
865 & IROW, NCOL, ICOL, VAL, LDA, NELIM, TYPE_SON,
866 & NSLAVES, SLAVES, DEST, COMM, IERR,
868 & SLAVEF, KEEP,KEEP8, INIV2, TAB_POS_IN_PERE )
871 INTEGER lda, nelim, type_son
872 INTEGER ipere, ison, nrow, ncol, nslaves
875 INTEGER slaves( nslaves )
877 INTEGER ipos, ireq, , comm, ierr
878 INTEGER slavef, keep(500),
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.NE.
IF ( NELIM NROW ) THEN
894 WRITE(*,*) 'error in try_send_maitre2:
',NELIM, NROW
897.EQ.
IF (NBROWS_ALREADY_SENT 0) THEN
898 CALL MPI_PACK_SIZE( NROW+NCOL+7+NSLAVES, MPI_INTEGER,
899 & COMM, SIZE1, IERR_MPI )
900.eq.
IF ( TYPE_SON 2 ) THEN
901 CALL MPI_PACK_SIZE( NSLAVES+1, MPI_INTEGER,
902 & COMM, SIZE3, IERR_MPI )
908 CALL MPI_PACK_SIZE(7, MPI_INTEGER,COMM,SIZE1,IERR_MPI)
910.ne..AND..eq.
IF ( KEEP(50)0 TYPE_SON 2 ) THEN
915 CALL CMUMPS_BUF_SIZE_AVAILABLE( BUF_CB, SIZE_AV )
916.LT.
IF (SIZE_AV SIZE_RBUF_BYTES) THEN
917 RECV_BUF_SMALLER_THAN_SEND = .FALSE.
919 RECV_BUF_SMALLER_THAN_SEND = .TRUE.
920 SIZE_AV = SIZE_RBUF_BYTES
922.GT.
IF (NROW 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.EQ..AND..NE.
IF (NBROWS_PACKET 0 NROW 0) THEN
930 IF (RECV_BUF_SMALLER_THAN_SEND) THEN
939 CALL MPI_PACK_SIZE( NBROWS_PACKET * NCOL_SEND,
941 & COMM, SIZE2, IERR_MPI )
942 SIZE_PACK = SIZE1 + SIZE2
943.GT.
IF (SIZE_PACK SIZE_AV) THEN
944 NBROWS_PACKET = NBROWS_PACKET - 1
945.GT.
IF ( NBROWS_PACKET 0 ) THEN
948 IF (RECV_BUF_SMALLER_THAN_SEND) THEN
957.NE..AND.
IF (NBROWS_PACKET + NBROWS_ALREADY_SENTNROW
958.LT.
& SIZE_PACK - SIZE1 ( SIZE_RBUF_BYTES - SIZE1 ) / 2
960.NOT.
& RECV_BUF_SMALLER_THAN_SEND)
965 CALL BUF_LOOK( BUF_CB, IPOS, IREQ, SIZE_PACK, IERR,
968.LT.
IF ( IERR 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.EQ.
IF (NBROWS_ALREADY_SENT 0) THEN
994.GT.
IF (NSLAVES0) 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.eq.
IF ( TYPE_SON 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.GE.
IF (NBROWS_PACKET1) THEN
1013 DO I=NBROWS_ALREADY_SENT+1,
1014 & NBROWS_ALREADY_SENT+NBROWS_PACKET
1015 CALL MPI_PACK( VAL(1,I), NCOL_SEND,
1017 & BUF_CB%CONTENT( IPOS ), SIZE_PACK,
1018 & POSITION, COMM, IERR_MPI )
1021 KEEP(266)=KEEP(266)+1
1022 CALL MPI_ISEND( BUF_CB%CONTENT( IPOS ), POSITION, MPI_PACKED,
1023 & DEST, MAITRE2, COMM,
1024 & BUF_CB%CONTENT( IREQ ), IERR_MPI )
1025.LT.
IF ( SIZE_PACK POSITION ) THEN
1026 write(*,*) 'try_send_maitre2,
SIZE,position=
',
1027 & SIZE_PACK,POSITION
1030.NE.
IF ( SIZE_PACK POSITION )
1031 & CALL BUF_ADJUST( BUF_CB, POSITION )
1032 NBROWS_ALREADY_SENT = NBROWS_ALREADY_SENT + NBROWS_PACKET
1033.NE.
IF ( NBROWS_ALREADY_SENT NROW ) THEN
1038 END SUBROUTINE CMUMPS_BUF_SEND_MAITRE2
1039 SUBROUTINE CMUMPS_BUF_SEND_CONTRIB_TYPE2(NBROWS_ALREADY_SENT,
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 )
1051 USE CMUMPS_LR_DATA_M
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, NBROW ))
1062 INTEGER IW_CBSON( * )
1063 COMPLEX A_CBSON( : )
1064 INTEGER(8) :: LA_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 SIZE_INTEGERS, 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, J, 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, NASS_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,
1105 PARAMETER ( IONE=1 )
1106 INCLUDE 'mumps_headers.h
'
1108 PARAMETER (ZERO = 0.0E0)
1109.EQ.
CB_IS_LR = (IW_CBSON(1+XXLR)1
1110.OR..EQ.
& IW_CBSON(1+XXLR)3)
1116.NE..AND.
COMPUTE_MAX = (KEEP(219) 0)
1117.EQ..AND.
& (KEEP(50) 2)
1118.EQ.
& (PDESTPDEST_MASTER)
1119 IF (NBROWS_ALREADY_SENT == 0) THEN
1120 IF (COMPUTE_MAX) THEN
1121 CALL CMUMPS_BUF_MAX_ARRAY_MINSIZE(NFS4FATHER,IERR)
1122.NE.
IF (IERR 0) THEN
1130 LROW = IW_CBSON( 1 + KEEP(IXSZ))
1131 NELIM = IW_CBSON( 2 + KEEP(IXSZ))
1132 NPIV = IW_CBSON( 4 + KEEP(IXSZ))
1133.LT.
IF ( NPIV 0 ) THEN
1136 NROW = IW_CBSON( 3 + KEEP(IXSZ))
1137 NFRONT = LROW + NPIV
1138 HS = 6 + IW_CBSON( 6 + KEEP(IXSZ)) + KEEP(IXSZ)
1140 CALL CMUMPS_BLR_RETRIEVE_CB_LRB(IW_CBSON(1+XXF), CB_LRB)
1141.EQ.
IF (SON_NIV1) THEN
1142 CALL CMUMPS_BLR_RETRIEVE_BEGSBLR_STA(IW_CBSON(1+XXF),
1144 CALL CMUMPS_BLR_RETRIEVE_BEGSBLR_DYN(IW_CBSON(1+XXF),
1146 NB_BLR_ROWS = size(BEGS_BLR_ROW) - 1
1147 CALL CMUMPS_BLR_RETRIEVE_NB_PANELS(IW_CBSON(1+XXF),
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
1154 CALL CMUMPS_BLR_RETRIEVE_BEGSBLR_STA(IW_CBSON(1+XXF),
1156 NB_BLR_ROWS = size(BEGS_BLR_STA) - 2
1157 BEGS_BLR_ROW => BEGS_BLR_STA(2:NB_BLR_ROWS+2)
1158 CALL CMUMPS_BLR_RETRIEVE_BEGS_BLR_C(IW_CBSON(1+XXF),
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.EQ.
IF (PANEL2SEND-1) THEN
1172 write(*,*) 'internal error: panel2send not found
'
1175.EQ.
IF (KEEP(50)0) THEN
1176 NB_BLR_COLS = size(BEGS_BLR_COL) - 1
1177.EQ.
ELSEIF (SON_NIV1) 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.GT.
IF (BEGS_BLR_COL(I+1)-NCOL_SHIFT
1185 & BEGS_BLR_ROW(PANEL2SEND+1)-1+NROW_SHIFT) THEN
1190.EQ.
IF (NB_BLR_COLS-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.EQ.
IF (STATE_SON S_NOLCBCONTIG) THEN
1203 LDA_SON8 = int(LROW,8)
1204 SHIFTCB_SON = int(NPIV,8)*int(NROW,8)
1205.EQ.
ELSE IF (STATE_SON S_NOLCLEANED) THEN
1206 LDA_SON8 = int(LROW,8)
1209 LDA_SON8 = int(NFRONT,8)
1210 SHIFTCB_SON = int(NPIV,8)
1212 CALL CMUMPS_BUF_SIZE_AVAILABLE( BUF_CB, SIZE_AV )
1213.EQ.
IF (PDEST 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
1223.LT.
IF ( SIZE_AV SIZE_RBUF_BYTES-DESC_BANDE_BYTES ) THEN
1224 RECV_BUF_SMALLER_THAN_SEND = .FALSE.
1226 RECV_BUF_SMALLER_THAN_SEND = .TRUE.
1227 SIZE_AV = SIZE_RBUF_BYTES-DESC_BANDE_BYTES
1230 IF (NBROWS_ALREADY_SENT==0) THEN
1231 IF(COMPUTE_MAX) THEN
1232 CALL MPI_PACK_SIZE(1, MPI_INTEGER,
1233 & COMM, SIZE0, IERR_MPI )
1234.GT.
IF(NFS4FATHER 0) THEN
1235 CALL MPI_PACK_SIZE( NFS4FATHER, MPI_REAL,
1236 & COMM, SIZE1, IERR_MPI )
1241.EQ.
IF (KEEP(50) 0) THEN
1246.EQ.
IF (PDEST PDEST_MASTER) THEN
1248.EQ.
ELSE IF (KEEP(50) 0) THEN
1251 L = LROW + PERM(1) - LMAP + NBROWS_ALREADY_SENT - 1
1256 NBINT = NBINT + 4*(NB_BLR_COLS-NB_COL_SHIFT) + 2
1258 CALL MPI_PACK_SIZE( NBINT, MPI_INTEGER,
1259 & COMM, TMPSIZE, IERR_MPI )
1260 SIZE1 = SIZE1 + TMPSIZE
1261 SIZE_AV = SIZE_AV - SIZE1
1262 NOT_ENOUGH_SPACE=.FALSE.
1263.LT.
IF (SIZE_AV 0 ) THEN
1265 NOT_ENOUGH_SPACE=.TRUE.
1267.EQ.
IF ( KEEP(50) 0 ) THEN
1269 & SIZE_AV / ( ONEorTWO*SIZEofINT+LROW*SIZEofREAL)
1272 & ( 1 + 2 * LROW + 2 * PERM(1) + 2 * NBROWS_ALREADY_SENT )
1273 & * SIZEofREAL / SIZEofINT
1274 NBROWS_PACKET=int((dble(-B)+sqrt((dble(B)*dble(B))+
1275 & dble(4)*dble(2)*dble(SIZE_AV)/dble(SIZEofINT) *
1276 & dble(SIZEofREAL/SIZEofINT)))*
1277 & dble(SIZEofINT) / dble(2) / dble(SIZEofREAL))
1281 NBROWS_PACKET = max( 0, NBROWS_PACKET)
1282 NBROWS_PACKET = min(NBROW-NBROWS_ALREADY_SENT, NBROWS_PACKET)
1283.OR.
NOT_ENOUGH_SPACE = NOT_ENOUGH_SPACE
1284.EQ..AND..NE.
& (NBROWS_PACKET 0 NBROW0)
1285 NBROWS_PACKET_2PACK = NBROWS_PACKET
1287 NBROWS_PACKET_2PACK = CURRENT_PANEL_SIZE
1288 CALL MUMPS_BLR_GET_SIZEREALS_CB_LRB(SIZE_REALS, CB_LRB,
1290 & NB_COL_SHIFT, NB_BLR_COLS, PANEL2SEND
1292.LT.
NOT_ENOUGH_SPACE = (SIZE_AVSIZE_REALS)
1293.NOT.
IF (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.EQ.
IF (KEEP(50)0) THEN
1309 MAX_ROW_LENGTH = -99999
1310.EQ.
ELSEIF (SON_NIV1) THEN
1311 MAX_ROW_LENGTH = LROW+PERM(1)-LMAP+NBROWS_ALREADY_SENT
1312 & + NBROWS_PACKET_2PACK-1
1315.EQ.
IF (KEEP(50)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
1327 CALL MPI_PACK_SIZE( SIZE_REALS, MPI_COMPLEX,
1328 & COMM, SIZE2, IERR_MPI )
1329 CALL MPI_PACK_SIZE( SIZE_INTEGERS, MPI_INTEGER,
1330 & COMM, SIZE3, IERR_MPI )
1331.GT.
IF (SIZE2 + SIZE3 SIZE_AV ) THEN
1332 NBROWS_PACKET = NBROWS_PACKET -1
1333.GT..AND..NOT.
IF (NBROWS_PACKET 0 CB_IS_LR) THEN
1336 IF (RECV_BUF_SMALLER_THAN_SEND) THEN
1345 SIZE_PACK = SIZE1 + SIZE2 + SIZE3
1346.NE..AND.
IF (NBROWS_PACKET + NBROWS_ALREADY_SENTNBROW
1347.LT..AND.
& SIZE_PACK SIZE_RBUF_BYTES / 4
1348.NOT..AND.
& RECV_BUF_SMALLER_THAN_SEND
1354.GT.
IF (SIZE_PACKSIZE_RBUF_BYTES ) THEN
1358 CALL BUF_LOOK( BUF_CB, IPOS, IREQ, SIZE_PACK, IERR,
1360.EQ..OR..EQ.
IF (IERR -1 IERR -2) THEN
1361 NBROWS_PACKET = NBROWS_PACKET - 1
1362 IF (NBROWS_PACKET > 0 ) GOTO 10
1364.LT.
IF ( IERR 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.NE.
IF ( PDEST 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)
1412 CALL MUMPS_BLOC2_GET_ISLAVE(
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 )
1428 CALL CMUMPS_BLR_PACK_CB_LRB(CB_LRB, NB_ROW_SHIFT,
1429 & NB_COL_SHIFT, NB_BLR_COLS, PANEL2SEND,
1431 & BUF_CB%CONTENT(IPOS:),
1432 & SIZE_PACK, POSITION, COMM, IERR
1434.ne.
IF (KEEP(50)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)
1448 CALL MUMPS_BLOC2_GET_ISLAVE(
1449 & KEEP,KEEP8, IPERE, STEP, N, SLAVEF,
1450 & ISTEP_TO_INIV2, TAB_POS_IN_PERE,
1453 & NFRONT_PERE - NASS_PERE,
1458.ne.
IF (KEEP(50)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.EQ.
IF (NELIM0) 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.EQ.
IF ( LROW 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
1499 CALL MPI_PACK(NFS4FATHER,1,
1501 & BUF_CB%CONTENT( IPOS ), SIZE_PACK,
1502 & POSITION, COMM, IERR_MPI )
1503.GT.
IF (NFS4FATHER 0) THEN
1505 CALL CMUMPS_BLR_RETRIEVE_M_ARRAY (
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 )
1511 CALL CMUMPS_BLR_FREE_M_ARRAY ( IW_CBSON(1+XXF) )
1513 BUF_MAX_ARRAY(1:NFS4FATHER) = ZERO
1514.GT.
IF(MAPROW(NROW) NASS_PERE) THEN
1516.GT.
IF(MAPROW(PS1)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/CMUMPS_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.GT.
IF ( NROW-PS1+1-KEEP253_LOC-NVSCHUR 0 ) THEN
1553 CALL CMUMPS_COMPUTE_MAXPERCOL(
1554 & A_CBSON(APOS),ASIZE,NCA,
1555 & NROW-PS1+1-KEEP253_LOC-NVSCHUR,
1556 & BUF_MAX_ARRAY,NFS4FATHER,PACKED_CB,LROW1)
1559 CALL MPI_PACK(BUF_MAX_ARRAY, NFS4FATHER,
1561 & BUF_CB%CONTENT( IPOS ), SIZE_PACK,
1562 & POSITION, COMM, IERR_MPI )
1567 KEEP(266)=KEEP(266)+1
1568 CALL MPI_ISEND( BUF_CB%CONTENT( IPOS ), POSITION, MPI_PACKED,
1569 & PDEST, CONTRIB_TYPE2, COMM,
1570 & BUF_CB%CONTENT( IREQ ), IERR_MPI )
1571.LT.
IF ( SIZE_PACK POSITION ) THEN
1572 WRITE(*,*) ' contniv2:
SIZE, position =
',SIZE_PACK, POSITION
1573 WRITE(*,*) ' nbrow, lrow =
', NBROW, LROW
1576.NE.
IF ( SIZE_PACK POSITION )
1577 & CALL BUF_ADJUST( BUF_CB, POSITION )
1578 NBROWS_ALREADY_SENT=NBROWS_ALREADY_SENT + NBROWS_PACKET
1579.NE.
IF (NBROWS_ALREADY_SENT NBROW ) THEN
1584 END SUBROUTINE CMUMPS_BUF_SEND_CONTRIB_TYPE2
1585 SUBROUTINE MUMPS_BLR_GET_SIZEREALS_CB_LRB(SIZE_OUT,
1586 & CB_LRB, NB_ROW_SHIFT, NB_COL_SHIFT, NB_BLR_COLS,
1591 TYPE(LRB_TYPE), POINTER :: CB_LRB(:,:)
1592 INTEGER, INTENT(IN) :: NB_ROW_SHIFT, NB_COL_SHIFT, NB_BLR_COLS,
1594 INTEGER, intent(out) :: SIZE_OUT
1596 TYPE(LRB_TYPE), POINTER :: LRB
1598 DO J=1,NB_BLR_COLS-NB_COL_SHIFT
1599 LRB => CB_LRB(PANEL2SEND-NB_ROW_SHIFT,J)
1601.GT.
IF (LRB%K0) THEN
1602 SIZE_OUT = SIZE_OUT + LRB%K*(LRB%M+LRB%N)
1605 SIZE_OUT = SIZE_OUT + LRB%M*LRB%N
1609 END SUBROUTINE MUMPS_BLR_GET_SIZEREALS_CB_LRB
1610 SUBROUTINE CMUMPS_BLR_PACK_CB_LRB(
1611 & CB_LRB, NB_ROW_SHIFT, NB_COL_SHIFT, NB_BLR_COLS,
1612 & PANEL2SEND, PANEL_BEG_OFFSET,
1613 & BUF, LBUF, POSITION, COMM, IERR
1617 TYPE(LRB_TYPE), POINTER :: CB_LRB(:,:)
1618 INTEGER, INTENT(IN) :: NB_ROW_SHIFT, NB_COL_SHIFT, NB_BLR_COLS,
1619 & PANEL2SEND, PANEL_BEG_OFFSET
1620 INTEGER, intent(out) :: IERR
1621 INTEGER, intent(in) :: COMM, LBUF
1622 INTEGER, intent(inout) :: POSITION
1623 INTEGER, intent(inout) :: BUF(:)
1624 INTEGER :: J, IERR_MPI
1627 CALL MPI_PACK( NB_BLR_COLS-NB_COL_SHIFT, 1, MPI_INTEGER,
1628 & BUF(1), LBUF, POSITION, COMM, IERR_MPI )
1629 CALL MPI_PACK( PANEL_BEG_OFFSET, 1, MPI_INTEGER,
1630 & BUF(1), LBUF, POSITION, COMM, IERR_MPI )
1631 DO J=1,NB_BLR_COLS-NB_COL_SHIFT
1632 CALL CMUMPS_MPI_PACK_LRB(
1633 & CB_LRB(PANEL2SEND-NB_ROW_SHIFT,J),
1634 & BUF, LBUF, POSITION, COMM, IERR
1637 END SUBROUTINE CMUMPS_BLR_PACK_CB_LRB
1638 SUBROUTINE CMUMPS_BUF_SEND_MAPLIG(
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, POSITION, INDX, INIV2
1669 PARAMETER ( IONE=1 )
1673.eq.
IF ( NDEST 1 ) THEN
1674.EQ.
IF ( DEST(1)MYID ) GOTO 500
1675 SIZE = SIZEofINT * ( 7 + NSLAVES + NCBSON )
1676.GT.
IF ( NSLAVES0 ) THEN
1677 SIZE = SIZE + SIZEofINT * ( NSLAVES + 1 )
1679.GT.
IF (SIZESIZE_RBUF_BYTES ) THEN
1683 CALL BUF_LOOK( BUF_CB, IPOS, IREQ, SIZE, IERR,
1686.LT.
IF (IERR 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.GT.
IF ( NSLAVES0 ) 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.NE.
IF ( NSLAVES 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.NE.
IF ( POSITION * SIZEofINT SIZE ) THEN
1721 & ' wrong estimated size
'
1724 KEEP(266)=KEEP(266)+1
1725 CALL MPI_ISEND( BUF_CB%CONTENT( IPOS ), SIZE,
1727 & DEST( NDEST ), MAPLIG, COMM,
1728 & BUF_CB%CONTENT( IREQ ),
1733.ne.
IF ( DEST( IDEST ) MYID ) NSEND = NSEND + 1
1736 & ( ( OVHSIZE + 7 + NSLAVES )* NSEND + NCBSON )
1737.GT.
IF ( NSLAVES0 ) THEN
1738 SIZE = SIZE + SIZEofINT * NSEND*( NSLAVES + 1 )
1740 CALL CMUMPS_BUF_SIZE_AVAILABLE( BUF_CB, SIZE_AV )
1741.LT.
IF ( SIZE_AV SIZE ) THEN
1746 CALL MUMPS_BLOC2_GET_SLAVE_INFO(
1747 & KEEP,KEEP8, ISON, STEP, N, SLAVEF,
1748 & ISTEP_TO_INIV2, TAB_POS_IN_PERE,
1752 SIZE = SIZEofINT * ( NSLAVES + TROW_SIZE + 7 )
1753.GT.
IF ( NSLAVES0 ) THEN
1754 SIZE = SIZE + SIZEofINT * ( NSLAVES + 1 )
1756.NE.
IF ( MYID DEST( IDEST ) ) THEN
1757.GT.
IF (SIZESIZE_RBUF_BYTES) THEN
1761 CALL BUF_LOOK( BUF_CB, IPOS, IREQ, SIZE, IERR,
1762 & IONE, DEST(IDEST) )
1763.LT.
IF ( IERR 0 ) THEN
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.GT.
IF ( NSLAVES0 ) 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.NE.
IF ( NSLAVES 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.NE.
IF ( POSITION * SIZEofINT SIZE ) THEN
1799 WRITE(*,*) ' error 1 in try_send_maplig:
',
1800 & 'wrong estimated size
'
1803 KEEP(266)=KEEP(266)+1
1804 CALL MPI_ISEND( BUF_CB%CONTENT( IPOS ), SIZE,
1806 & DEST( IDEST ), MAPLIG, COMM,
1807 & BUF_CB%CONTENT( IREQ ),
1814 END SUBROUTINE CMUMPS_BUF_SEND_MAPLIG
1815 SUBROUTINE CMUMPS_BUF_SEND_BLOCFACTO( INODE, NFRONT,
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 COMPLEX, 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.eq.
IF ( KEEP(50) 0 ) THEN
1854 CALL MPI_PACK_SIZE( 4 + NPIV + ( NBMSGS - 1 ) * OVHSIZE +
1856 & MPI_INTEGER, COMM, SIZE1, IERR_MPI )
1858 CALL MPI_PACK_SIZE( 6 + NPIV + ( NBMSGS - 1 ) * OVHSIZE +
1860 & MPI_INTEGER, COMM, SIZE1, IERR_MPI )
1863.eq.
IF ( KEEP(50) 0 ) THEN
1864 CALL MPI_PACK_SIZE( 3 + NPIV + ( NBMSGS - 1 ) * OVHSIZE +
1866 & MPI_INTEGER, COMM, SIZE1, IERR_MPI )
1868 CALL MPI_PACK_SIZE( 4 + NPIV + ( NBMSGS - 1 ) * OVHSIZE +
1870 & MPI_INTEGER, COMM, SIZE1, IERR_MPI )
1874 CALL MPI_PACK_SIZE( 4, MPI_INTEGER, COMM, SIZE3, IERR_MPI )
1876.NE.
IF ( KEEP(50)0 ) THEN
1877 CALL MPI_PACK_SIZE( 1, MPI_INTEGER, COMM, SIZE3, IERR_MPI )
1882.NOT.
IF ( LR_ACTIVATED) THEN
1883 CALL MPI_PACK_SIZE( NPIV*NCOL, MPI_COMPLEX,
1884 & COMM, SIZE3, IERR_MPI )
1887 CALL MPI_PACK_SIZE( NPIV*(NPIV+NELIM), MPI_COMPLEX,
1888 & COMM, SIZE3, IERR_MPI )
1890 CALL MUMPS_MPI_PACK_SIZE_LR( BLR_LorU, SIZE3, COMM, IERR )
1894 SIZET = SIZE1 + SIZE2
1895.GT.
IF (SIZETSIZE_RBUF_BYTES) THEN
1898.eq.
IF ( KEEP(50) 0 ) THEN
1899 CALL MPI_PACK_SIZE( 4 + NPIV + 1+LRELAY_INFO,
1900 & MPI_INTEGER, COMM, SSS, IERR_MPI )
1902 CALL MPI_PACK_SIZE( 6 + NPIV + 1+LRELAY_INFO,
1903 & MPI_INTEGER, COMM, SSS, IERR_MPI )
1906.eq.
IF ( KEEP(50) 0 ) THEN
1907 CALL MPI_PACK_SIZE( 3 + NPIV + 1+LRELAY_INFO,
1908 & MPI_INTEGER, COMM, SSS, IERR_MPI )
1910 CALL MPI_PACK_SIZE( 4 + NPIV + 1+LRELAY_INFO,
1911 & MPI_INTEGER, COMM, SSS, IERR_MPI )
1915.GT.
IF (SSSSIZE_RBUF_BYTES) THEN
1920 CALL BUF_LOOK( BUF_CB, IPOS, IREQ, SIZET, IERR,
1922.LT.
IF ( IERR 0 ) THEN
1925 BUF_CB%ILASTMSG = BUF_CB%ILASTMSG + ( NBMSGS - 1 ) * OVHSIZE
1926 IPOS = IPOS - OVHSIZE
1927 DO IDEST = 1, NBMSGS - 1
1928 BUF_CB%CONTENT( IPOS + ( IDEST - 1 ) * OVHSIZE ) =
1929 & IPOS + IDEST * OVHSIZE
1931 BUF_CB%CONTENT( IPOS + ( NBMSGS - 1 ) * OVHSIZE ) = 0
1932 IPOSMSG = IPOS + OVHSIZE * NBMSGS
1934 CALL MPI_PACK( INODE, 1, MPI_INTEGER,
1935 & BUF_CB%CONTENT( IPOSMSG ), SIZET,
1936 & POSITION, COMM, IERR_MPI )
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.or..ne.
IF ( LASTBL KEEP(50)0 ) THEN
1943 CALL MPI_PACK( FPERE, 1, MPI_INTEGER,
1944 & BUF_CB%CONTENT( IPOSMSG ), SIZET,
1945 & POSITION, COMM, IERR_MPI )
1947.AND..NE.
IF ( LASTBL KEEP(50) 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.ne.
IF ( KEEP(50) 0 ) THEN
1976 CALL MPI_PACK( NSLAVES_TOT, 1, MPI_INTEGER,
1977 & BUF_CB%CONTENT( IPOSMSG ), SIZET,
1978 & POSITION, COMM, IERR_MPI )
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 )
1994 CALL CMUMPS_MPI_PACK_LR( BLR_LorU,
1995 & BUF_CB%CONTENT(IPOSMSG:
1996 & IPOSMSG+(SIZET+KEEP(34)-1)/KEEP(34)-1),
1997 & SIZET, POSITION, COMM, IERR)
2000 CALL MPI_PACK( VAL(1,I), NCOL,
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.EQ.
IF ( KEEP(50) 0) THEN
2013 TAG_BLOCFACTO = BLOC_FACTO
2014 KEEP(266)=KEEP(266)+1
2015 CALL MPI_ISEND( BUF_CB%CONTENT( IPOSMSG ), POSITION,
2017 & DEST_BLOCFACTO, TAG_BLOCFACTO, COMM,
2018 & BUF_CB%CONTENT( IREQ + ( IDEST-1 ) * OVHSIZE ),
2021 KEEP(266)=KEEP(266)+1
2022 CALL MPI_ISEND( BUF_CB%CONTENT( IPOSMSG ), POSITION,
2024 & DEST_BLOCFACTO, BLOC_FACTO_SYM, COMM,
2025 & BUF_CB%CONTENT( IREQ + ( IDEST-1 ) * OVHSIZE ),
2029 SIZET = SIZET - ( NBMSGS - 1 ) * OVHSIZE * SIZEofINT
2030.LT.
IF ( SIZET POSITION ) THEN
2031 WRITE(*,*) ' error sending blocfacto :
size < position
'
2032 WRITE(*,*) ' Size,position=
',SIZET,POSITION
2035.NE.
IF ( SIZET POSITION ) CALL BUF_ADJUST( BUF_CB, POSITION )
2037 END SUBROUTINE CMUMPS_BUF_SEND_BLOCFACTO
2038 SUBROUTINE CMUMPS_BUF_SEND_BLFAC_SLAVE( INODE,
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, JPOSK, NPIV, NDEST, FPERE
2047 COMPLEX 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 COMPLEX, 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
2064 CALL MPI_PACK_SIZE( 6 + ( NDEST - 1 ) * OVHSIZE,
2065 & MPI_INTEGER, COMM, SIZE1, IERR_MPI )
2067 CALL MPI_PACK_SIZE(2, MPI_INTEGER, COMM, SSLR, IERR_MPI )
2069.NOT.
IF ( LR_ACTIVATED) THEN
2070 CALL MPI_PACK_SIZE( abs(NPIV)*NCOLU, MPI_COMPLEX,
2071 & COMM, SSLR, IERR_MPI )
2074 CALL MUMPS_MPI_PACK_SIZE_LR( BLR_LS, SSLR, COMM, IERR )
2077 SIZET = SIZE1 + SIZE2
2078.GT.
IF (SIZETSIZE_RBUF_BYTES) THEN
2079 CALL MPI_PACK_SIZE( 6 ,
2080 & MPI_INTEGER, COMM, SSS, IERR_MPI )
2082.GT.
IF (SSSSIZE_RBUF_BYTES) THEN
2087 CALL BUF_LOOK( BUF_CB, IPOS, IREQ, SIZET, IERR,
2089.LT.
IF ( IERR 0 ) THEN
2092 BUF_CB%ILASTMSG = BUF_CB%ILASTMSG + ( NDEST - 1 ) * OVHSIZE
2093 IPOS = IPOS - OVHSIZE
2094 DO IDEST = 1, NDEST - 1
2095 BUF_CB%CONTENT( IPOS + ( IDEST - 1 ) * OVHSIZE ) =
2096 & IPOS + IDEST * OVHSIZE
2098 BUF_CB%CONTENT( IPOS + ( NDEST - 1 ) * OVHSIZE ) = 0
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
2131 CALL MUMPS_MPI_PACK_SCALE_LR( BLR_LS,
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 )
2144 KEEP(266)=KEEP(266)+1
2145 CALL MPI_ISEND( BUF_CB%CONTENT( IPOSMSG ), POSITION, MPI_PACKED,
2146 & PDEST(IDEST), BLOC_FACTO_SYM_SLAVE, COMM,
2147 & BUF_CB%CONTENT( IREQ + ( IDEST-1 ) * OVHSIZE ),
2150 SIZET = SIZET - ( NDEST - 1 ) * OVHSIZE * SIZEofINT
2151.LT.
IF ( SIZET POSITION ) THEN
2152 WRITE(*,*) ' error sending blfac slave :
size < position
'
2153 WRITE(*,*) ' Size,position=
',SIZET,POSITION
2156.NE.
IF ( SIZET POSITION ) CALL BUF_ADJUST( BUF_CB, POSITION )
2158 END SUBROUTINE CMUMPS_BUF_SEND_BLFAC_SLAVE
2159 SUBROUTINE CMUMPS_BUF_SEND_CONTRIB_TYPE3( N, ISON,
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 N, 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
2181 COMPLEX 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
2195 PARAMETER ( IONE=1 )
2197 INTEGER NSUBSET_ROW_EFF, NSUBSET_COL_EFF, NSUPCOL_EFF
2200.NE.
IF ( NSUBSET_ROW * NSUBSET_COL 0 ) THEN
2201 CALL CMUMPS_BUF_SIZE_AVAILABLE( BUF_CB, SIZE_AV )
2202.LT.
IF (SIZE_AV SIZE_RBUF_BYTES) THEN
2203 RECV_BUF_SMALLER_THAN_SEND = .FALSE.
2205 RECV_BUF_SMALLER_THAN_SEND = .TRUE.
2206 SIZE_AV = SIZE_RBUF_BYTES
2208 SIZE_AV = min(SIZE_AV, SIZE_RBUF_BYTES)
2209 CALL MPI_PACK_SIZE(8 + NSUBSET_COL,
2210 & MPI_INTEGER, COMM, SIZE1, IERR_MPI )
2212.EQ..AND.
IF (N_ALREADY_SENT 0
2213.GT.
& min(NSUPROW,NSUPCOL) 0) THEN
2214 CALL MPI_PACK_SIZE(NSUPROW, MPI_INTEGER, COMM,
2215 & SIZE_CBP, IERR_MPI )
2216 CALL MPI_PACK_SIZE(NSUPCOL, MPI_INTEGER, COMM,
2217 & SIZE_TMP, IERR_MPI )
2218 SIZE_CBP = SIZE_CBP + SIZE_TMP
2219 CALL MPI_PACK_SIZE(NSUPROW*NSUPCOL,
2220 & MPI_COMPLEX, COMM,
2221 & SIZE_TMP, IERR_MPI )
2222 SIZE_CBP = SIZE_CBP + SIZE_TMP
2223 SIZE1 = SIZE1 + SIZE_CBP
2225.EQ.
IF (BBPCBP1) 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
2234 & (SIZE_AV - SIZE1) / (SIZEofINT + NSUBSET_COL_EFF * SIZEofREAL)
2236 N_PACKET = min( N_PACKET,
2237 & NSUBSET_ROW_EFF-N_ALREADY_SENT )
2238.LE..AND.
IF (N_PACKET 0
2239.GT.
& NSUBSET_ROW_EFF-N_ALREADY_SENT0) THEN
2240 IF (RECV_BUF_SMALLER_THAN_SEND) THEN
2248 CALL MPI_PACK_SIZE( 8 + NSUBSET_COL_EFF + N_PACKET,
2249 & MPI_INTEGER, COMM, SIZE1, IERR_MPI )
2250 SIZE1 = SIZE1 + SIZE_CBP
2251 CALL MPI_PACK_SIZE( N_PACKET * NSUBSET_COL_EFF,
2253 & COMM, SIZE2, IERR_MPI )
2254 SIZE_PACK = SIZE1 + SIZE2
2255.GT.
IF (SIZE_PACK SIZE_AV) THEN
2256 N_PACKET = N_PACKET - 1
2257 IF ( N_PACKET > 0 ) THEN
2260 IF (RECV_BUF_SMALLER_THAN_SEND) THEN
2269.NE.
IF (N_PACKET + N_ALREADY_SENT NSUBSET_ROW - NSUPROW
2271.LT.
& SIZE_PACK SIZE_RBUF_BYTES / 4
2272.AND..NOT.
& RECV_BUF_SMALLER_THAN_SEND)
2279 CALL MPI_PACK_SIZE(8,MPI_INTEGER, COMM, SIZE_PACK, IERR_MPI )
2281.GT.
IF ( SIZE_PACKSIZE_RBUF_BYTES ) THEN
2285 CALL BUF_LOOK( BUF_CB, IPOS, IREQ, SIZE_PACK, IERR,
2288.LT.
IF ( IERR 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.NE.
IF ( NSUBSET_ROW * NSUBSET_COL 0 ) THEN
2315.EQ..AND.
IF (N_ALREADY_SENT 0
2316.GT.
& min(NSUPROW, NSUPCOL) 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.GE.
IF ( TABSIZEint(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)
2356 CALL MPI_PACK(VAL_SON(J,I), 1,
2358 & BUF_CB%CONTENT( IPOS ),
2359 & SIZE_PACK, POSITION, COMM, IERR_MPI )
2364.NOT.
IF ( 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.GE.
IF ( TABSIZEint(N_PACKET,8)*int(NSUBSET_COL_EFF,8) ) THEN
2428.NOT.
IF ( 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.NOT.
IF ( 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 )
2464 CALL MPI_PACK( VAL_SON( J, I ), 1,
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 )
2475 CALL MPI_PACK( VAL_SON( J, I ), 1,
2477 & BUF_CB%CONTENT( IPOS ),
2478 & SIZE_PACK, POSITION, COMM, IERR_MPI )
2484 KEEP(266)=KEEP(266)+1
2485 CALL MPI_ISEND( BUF_CB%CONTENT( IPOS ), POSITION, MPI_PACKED,
2486 & PDEST, TAG, COMM, BUF_CB%CONTENT( IREQ ),
2488.LT.
IF ( SIZE_PACK POSITION ) THEN
2489 WRITE(*,*) ' error sending contribution to root:size<positn
'
2490 WRITE(*,*) ' Size,position=
',SIZE_PACK,POSITION
2493.NE.
IF ( SIZE_PACK POSITION )
2494 & CALL BUF_ADJUST( BUF_CB, POSITION )
2495 N_ALREADY_SENT = N_ALREADY_SENT + N_PACKET
2496.NE.
IF (NSUBSET_ROW * NSUBSET_COL 0) THEN
2497.NE.
IF ( N_ALREADY_SENTNSUBSET_ROW_EFF ) IERR = -1
2501 END SUBROUTINE CMUMPS_BUF_SEND_CONTRIB_TYPE3
2502 SUBROUTINE CMUMPS_BUF_SEND_RTNELIND( ISON, NELIM,
2503 & NELIM_ROW, NELIM_COL, NSLAVES, SLAVES,
2504 & DEST, COMM, KEEP, IERR )
2506 INTEGER NSLAVES, DEST, COMM, IERR
2507 INTEGER NELIM_ROW( NELIM ), NELIM_COL( NELIM )
2508 INTEGER SLAVES( NSLAVES )
2509 INTEGER, INTENT(INOUT) :: KEEP(500)
2511 INCLUDE 'mumps_tags.h
'
2513 INTEGER SIZE, POSITION, IPOS, IREQ
2516 PARAMETER ( IONE=1 )
2519 SIZE = ( 3 + NSLAVES + 2 * NELIM ) * SIZEofINT
2520.GT.
IF (SIZESIZE_RBUF_BYTES) THEN
2524 CALL BUF_LOOK( BUF_CB, IPOS, IREQ, SIZE, IERR,
2527.LT.
IF ( IERR 0 ) THEN
2531 BUF_CB%CONTENT( POSITION ) = ISON
2532 POSITION = POSITION + 1
2533 BUF_CB%CONTENT( POSITION ) = NELIM
2534 POSITION = POSITION + 1
2535 BUF_CB%CONTENT( POSITION ) = NSLAVES
2536 POSITION = POSITION + 1
2537 BUF_CB%CONTENT( POSITION: POSITION + NELIM - 1 ) = NELIM_ROW
2538 POSITION = POSITION + NELIM
2539 BUF_CB%CONTENT( POSITION: POSITION + NELIM - 1 ) = NELIM_COL
2540 POSITION = POSITION + NELIM
2541 BUF_CB%CONTENT( POSITION: POSITION + NSLAVES - 1 ) = SLAVES
2542 POSITION = POSITION + NSLAVES
2543 POSITION = POSITION - IPOS
2544.NE.
IF ( POSITION * SIZEofINT SIZE ) THEN
2545 WRITE(*,*) 'error in cmumps_buf_send_root_nelim_indices:
',
2546 & 'wrong estimated size
'
2549 KEEP(266)=KEEP(266)+1
2550 CALL MPI_ISEND( BUF_CB%CONTENT( IPOS ), SIZE,
2552 & DEST, ROOT_NELIM_INDICES, COMM,
2553 & BUF_CB%CONTENT( IREQ ), IERR_MPI )
2555 END SUBROUTINE CMUMPS_BUF_SEND_RTNELIND
2556 SUBROUTINE CMUMPS_BUF_SEND_ROOT2SON( ISON, NELIM_ROOT,
2557 & DEST, COMM, KEEP, IERR )
2559 INTEGER ISON, NELIM_ROOT, DEST, COMM, IERR
2560 INTEGER, INTENT(INOUT) :: KEEP(500)
2562 INCLUDE 'mumps_tags.h
'
2564 INTEGER IPOS, IREQ, SIZE
2567 PARAMETER ( IONE=1 )
2570 SIZE = 2 * SIZEofINT
2571 CALL BUF_LOOK( BUF_SMALL, IPOS, IREQ, SIZE, IERR,
2574.LT.
IF ( IERR 0 ) THEN
2575 WRITE(*,*) 'internal error 1 with small buffers
'
2578.LT.
IF ( IERR 0 ) THEN
2581 BUF_SMALL%CONTENT( IPOS ) = ISON
2582 BUF_SMALL%CONTENT( IPOS + 1 ) = NELIM_ROOT
2583 KEEP(266)=KEEP(266)+1
2584 CALL MPI_ISEND( BUF_SMALL%CONTENT( IPOS ), SIZE,
2586 & DEST, ROOT_2SON, COMM,
2587 & BUF_SMALL%CONTENT( IREQ ), IERR_MPI )
2589 END SUBROUTINE CMUMPS_BUF_SEND_ROOT2SON
2590 SUBROUTINE CMUMPS_BUF_SEND_ROOT2SLAVE
2591 & ( TOT_ROOT_SIZE, TOT_CONT2RECV, DEST, COMM, KEEP, IERR )
2593 INTEGER TOT_ROOT_SIZE, TOT_CONT2RECV, DEST, COMM, IERR
2594 INTEGER, INTENT(INOUT) :: KEEP(500)
2596 INCLUDE 'mumps_tags.h
'
2598 INTEGER SIZE, IPOS, IREQ
2601 PARAMETER ( IONE=1 )
2604 SIZE = 2 * SIZEofINT
2605 CALL BUF_LOOK( BUF_SMALL, IPOS, IREQ, SIZE, IERR,
2608.LT.
IF ( IERR 0 ) THEN
2609 WRITE(*,*) 'internal error 2 with small buffers
'
2612.LT.
IF ( IERR 0 ) THEN
2615 BUF_SMALL%CONTENT( IPOS ) = TOT_ROOT_SIZE
2616 BUF_SMALL%CONTENT( IPOS + 1 ) = TOT_CONT2RECV
2617 KEEP(266)=KEEP(266)+1
2618 CALL MPI_ISEND( BUF_SMALL%CONTENT( IPOS ), SIZE,
2620 & DEST, ROOT_2SLAVE, COMM,
2621 & BUF_SMALL%CONTENT( IREQ ), IERR_MPI )
2623 END SUBROUTINE CMUMPS_BUF_SEND_ROOT2SLAVE
2624 SUBROUTINE CMUMPS_BUF_SEND_BACKVEC
2625 & ( NRHS, INODE, W, LW, LD_W, DEST, MSGTAG,
2626 & JBDEB, JBFIN, KEEP, COMM, IERR )
2628 INTEGER NRHS, INODE,LW,COMM,IERR,DEST,MSGTAG, LD_W
2629 INTEGER, intent(in) :: JBDEB, JBFIN
2630 COMPLEX :: W(LD_W, *)
2631 INTEGER, INTENT(INOUT) :: KEEP(500)
2634 INTEGER SIZE, SIZE1, SIZE2
2635 INTEGER POSITION, IREQ, IPOS
2638 PARAMETER ( IONE=1 )
2641 CALL MPI_PACK_SIZE( 4 , MPI_INTEGER, COMM, SIZE1, IERR_MPI )
2642 CALL MPI_PACK_SIZE( LW*NRHS, MPI_COMPLEX, COMM,
2644 SIZE = SIZE1 + SIZE2
2645 CALL BUF_LOOK( BUF_CB, IPOS, IREQ, SIZE, IERR,
2648.LT.
IF ( IERR 0 ) THEN
2652 CALL MPI_PACK( INODE, 1, MPI_INTEGER,
2653 & BUF_CB%CONTENT( IPOS ), SIZE,
2654 & POSITION, COMM, IERR_MPI )
2655 CALL MPI_PACK( LW , 1, MPI_INTEGER,
2656 & BUF_CB%CONTENT( IPOS ), SIZE,
2657 & POSITION, COMM, IERR_MPI )
2658 CALL MPI_PACK( JBDEB , 1, MPI_INTEGER,
2659 & BUF_CB%CONTENT( IPOS ), SIZE,
2660 & POSITION, COMM, IERR_MPI )
2661 CALL MPI_PACK( JBFIN , 1, MPI_INTEGER,
2662 & BUF_CB%CONTENT( IPOS ), SIZE,
2663 & POSITION, COMM, IERR_MPI )
2665 CALL MPI_PACK( W(1,K), LW, MPI_COMPLEX,
2666 & BUF_CB%CONTENT( IPOS ), SIZE,
2667 & POSITION, COMM, IERR_MPI )
2669 KEEP(266)=KEEP(266)+1
2670 CALL MPI_ISEND( BUF_CB%CONTENT( IPOS ), POSITION, MPI_PACKED,
2671 & DEST, MSGTAG, COMM,
2672 & BUF_CB%CONTENT( IREQ ), IERR_MPI )
2673.LT.
IF ( SIZE POSITION ) THEN
2674 WRITE(*,*) 'try_update:
SIZE, position =
',
2678.NE.
IF ( SIZE POSITION ) CALL BUF_ADJUST( BUF_CB, POSITION )
2680 END SUBROUTINE CMUMPS_BUF_SEND_BACKVEC
2681 SUBROUTINE CMUMPS_BUF_SEND_UPDATE_LOAD
2682 & ( BDC_SBTR,BDC_MEM,BDC_MD, COMM, NPROCS, LOAD,
2688 INTEGER COMM, NPROCS, MYID, IERR
2689 INTEGER, INTENT(INOUT) :: KEEP(500)
2690 INTEGER FUTURE_NIV2(NPROCS)
2691 DOUBLE PRECISION LU_USAGE
2692 DOUBLE PRECISION LOAD
2693 DOUBLE PRECISION MEM,SBTR_CUR
2694 LOGICAL BDC_MEM,BDC_SBTR,BDC_MD
2696 INCLUDE 'mumps_tags.h
'
2698 INTEGER POSITION, IREQ, IPOS, SIZE1, SIZE2, SIZE
2699 INTEGER I, NDEST, IDEST, IPOSMSG, WHAT, NREALS
2702 PARAMETER ( IZERO=0 )
2708.NE..AND..NE.
IF ( I MYID + 1 FUTURE_NIV2(I)0) THEN
2712.eq.
IF ( NDEST 0 ) THEN
2715 CALL MPI_PACK_SIZE( 1 + (NDEST-1) * OVHSIZE,
2716 & MPI_INTEGER, COMM,
2728 CALL MPI_PACK_SIZE( NREALS, MPI_DOUBLE_PRECISION,
2729 & COMM, SIZE2, IERR_MPI )
2730 SIZE = SIZE1 + SIZE2
2731 CALL BUF_LOOK( BUF_LOAD, IPOS, IREQ, SIZE, IERR,
2734.LT.
IF ( IERR 0 ) THEN
2737 BUF_LOAD%ILASTMSG = BUF_LOAD%ILASTMSG + ( NDEST - 1 ) * OVHSIZE
2738 IPOS = IPOS - OVHSIZE
2739 DO IDEST = 1, NDEST - 1
2740 BUF_LOAD%CONTENT( IPOS + ( IDEST - 1 ) * OVHSIZE ) =
2741 & IPOS + IDEST * OVHSIZE
2743 BUF_LOAD%CONTENT( IPOS + ( NDEST - 1 ) * OVHSIZE ) = 0
2744 IPOSMSG = IPOS + OVHSIZE * NDEST
2747 CALL MPI_PACK( WHAT, 1, MPI_INTEGER,
2748 & BUF_LOAD%CONTENT( IPOSMSG ), SIZE,
2749 & POSITION, COMM, IERR_MPI )
2750 CALL MPI_PACK( LOAD, 1, MPI_DOUBLE_PRECISION,
2751 & BUF_LOAD%CONTENT( IPOSMSG ), SIZE,
2752 & POSITION, COMM, IERR_MPI )
2754 CALL MPI_PACK( MEM, 1, MPI_DOUBLE_PRECISION,
2755 & BUF_LOAD%CONTENT( IPOSMSG ), SIZE,
2756 & POSITION, COMM, IERR_MPI )
2759 CALL MPI_PACK( SBTR_CUR, 1, MPI_DOUBLE_PRECISION,
2760 & BUF_LOAD%CONTENT( IPOSMSG ), SIZE,
2761 & POSITION, COMM, IERR_MPI )
2764 CALL MPI_PACK( LU_USAGE, 1, MPI_DOUBLE_PRECISION,
2765 & BUF_LOAD%CONTENT( IPOSMSG ), SIZE,
2766 & POSITION, COMM, IERR_MPI )
2769 DO I = 0, NPROCS - 1
2770.NE..AND..NE.
IF ( I MYID FUTURE_NIV2(I+1) 0) THEN
2772 KEEP(267)=KEEP(267)+1
2773 CALL MPI_ISEND( BUF_LOAD%CONTENT( IPOSMSG ),
2774 & POSITION, MPI_PACKED, I,
2775 & UPDATE_LOAD, COMM,
2776 & BUF_LOAD%CONTENT( IREQ+(IDEST-1)*OVHSIZE ),
2780 SIZE = SIZE - ( NDEST - 1 ) * OVHSIZE * SIZEofINT
2781.LT.
IF ( SIZE POSITION ) THEN
2783 WRITE(*,*) ' Size,position=
',SIZE,POSITION
2786.NE.
IF ( SIZE POSITION )
2787 & CALL BUF_ADJUST( BUF_LOAD, POSITION )
2789 END SUBROUTINE CMUMPS_BUF_SEND_UPDATE_LOAD
2790 SUBROUTINE CMUMPS_BUF_BROADCAST
2791 & ( WHAT, COMM, NPROCS,
2796 INTEGER COMM, NPROCS, MYID, IERR, WHAT
2797 DOUBLE PRECISION LOAD,UPD_LOAD
2798 INTEGER, INTENT(INOUT) :: KEEP(500)
2800 INCLUDE 'mumps_tags.h'
2802 INTEGER position, ireq, ipos, size1, size2, size
2803 INTEGER i, ndest, idest, iposmsg, nreals
2806 INTEGER future_niv2(nprocs)
2807 parameter( izero=0 )
2809 IF (what .NE. 2 .AND. what .NE. 3 .AND.
2810 & what.NE.6.AND. what.NE.8 .AND.what.NE.9.AND.
2813 &
"Internal error 1 in CMUMPS_BUF_BROADCAST",what
2819 IF ( i .NE. myid + 1 .AND. future_niv2(i).NE.0)
THEN
2823 IF ( ndest .eq. 0 )
THEN
2827 & mpi_integer, comm,
2829 IF((what.NE.17).AND.(what.NE.10))
THEN
2835 & comm, size2, ierr_mpi )
2836 SIZE = size1 + size2
2840 IF ( ierr .LT. 0 )
THEN
2845 DO idest = 1, ndest - 1
2850 iposmsg = ipos +
ovhsize * ndest
2852 CALL mpi_pack( what, 1, mpi_integer,
2853 &
buf_load%CONTENT( iposmsg ),
SIZE,
2854 & position, comm, ierr_mpi )
2855 CALL mpi_pack( load, 1, mpi_double_precision,
2856 &
buf_load%CONTENT( iposmsg ),
SIZE,
2857 & position, comm, ierr_mpi )
2858 IF((what.EQ.17).OR.(what.EQ.10))
THEN
2859 CALL mpi_pack( upd_load, 1, mpi_double_precision,
2860 &
buf_load%CONTENT( iposmsg ),
SIZE,
2861 & position, comm, ierr_mpi )
2864 DO i = 0, nprocs - 1
2865 IF ( i .NE. myid .AND. future_niv2(i+1) .NE. 0)
THEN
2867 keep(267)=keep(267)+1
2869 & position, mpi_packed, i,
2870 & update_load, comm,
2876 IF (
SIZE .LT. position )
THEN
2877 WRITE(*,*)
' Error in CMUMPS_BUF_BROADCAST'
2878 WRITE(*,*)
' Size,position=',
SIZE,position
2881 IF (
SIZE .NE. position )
2886 & ( what, comm, nprocs,
2887 & father_node,inode,ncb,keep,
2888 & myid,remote, ierr)
2890 INTEGER comm, nprocs, myid, ierr, what,remote
2891 INTEGER father_node,inode
2893 include
'mumps_tags.h'
2895 INTEGER position, ireq, ipos,
2896 INTEGER ndest, idest, iposmsg
2897 INTEGER izero,ncb,keep(500)
2899 PARAMETER ( izero=0 )
2902 IF ( ndest .eq. 0 )
THEN
2905 IF((keep(81).EQ.2).OR.(keep(81).EQ.3))
THEN
2907 & mpi_integer, comm,
2911 & mpi_integer, comm,
2917 IF ( ierr .LT. 0 )
THEN
2922 DO idest = 1, ndest - 1
2927 iposmsg = ipos +
ovhsize * ndest
2929 CALL mpi_pack( what, 1, mpi_integer,
2930 &
buf_load%CONTENT( iposmsg ),
SIZE,
2931 & position, comm, ierr_mpi )
2932 CALL mpi_pack( father_node, 1, mpi_integer,
2933 &
buf_load%CONTENT( iposmsg ),
SIZE,
2934 & position, comm, ierr_mpi )
2935 IF((keep(81).EQ.2).OR.(keep(81).EQ.3))
THEN
2936 CALL mpi_pack( inode, 1, mpi_integer,
2937 &
buf_load%CONTENT( iposmsg ),
SIZE,
2938 & position, comm, ierr_mpi )
2939 CALL mpi_pack( ncb, 1, mpi_integer,
2940 &
buf_load%CONTENT( iposmsg ),
SIZE,
2941 & position, comm, ierr_mpi )
2944 keep(267)=keep(267)+1
2946 & position, mpi_packed, remote,
2947 & update_load, comm,
2951 IF (
SIZE .LT. position )
THEN
2952 WRITE(*,*)
' Error in CMUMPS_BUF_SEND_FILS'
2953 WRITE(*,*)
' Size,position=',
SIZE,position
2956 IF (
SIZE .NE. position )
2961 & MAX_SURF_MASTER, KEEP, IERR)
2964 include
'mumps_tags.h'
2965 INTEGER comm, myid, ierr, nprocs
2967 INTEGER,
INTENT(INOUT) :: keep(500)
2969 INTEGER ipos, ireq, idest, , position, i
2972 parameter( izero=0 )
2973 INTEGER ndest, nints, nreals, , size1, size2
2978 nints = 1 + ( ndest-1 ) *
ovhsize
2981 & mpi_integer, comm,
2984 & mpi_double_precision, comm,
2989 IF ( ierr .LT. 0 )
THEN
2994 DO idest = 1, ndest - 1
2999 iposmsg = ipos +
ovhsize * ndest
3002 CALL mpi_pack( what, 1, mpi_integer,
3003 &
buf_load%CONTENT( iposmsg ),
SIZE,
3004 & position, comm, ierr_mpi )
3005 CALL mpi_pack( max_surf_master, 1, mpi_double_precision,
3006 &
buf_load%CONTENT( iposmsg ),
SIZE,
3007 & position, comm, ierr_mpi )
3009 DO i = 0, nprocs - 1
3010 IF ( i .ne. myid )
THEN
3012 keep(267)=keep(267)+1
3014 & position, mpi_packed, i,
3015 & update_load, comm,
3021 IF (
SIZE .LT. position )
THEN
3022 WRITE(*,*)
' Error in CMUMPS_BUF_BCAST_ARRAY'
3023 WRITE(*,*)
' Size,position=',
SIZE,position
3026 IF (
SIZE .NE. position )
3031 & COMM, MYID, NPROCS,
3034 & LIST_SLAVES,INODE,
3035 & MEM_INCREMENT, FLOPS_INCREMENT,CB_BAND, WHAT,
3040 include
'mumps_tags.h'
3042 INTEGER comm, myid, nprocs, nslaves, ierr
3043 INTEGER future_niv2(nprocs)
3044 INTEGER list_slaves(nslaves),inode
3045 DOUBLE PRECISION mem_increment(nslaves)
3046 DOUBLE PRECISION flops_increment(nslaves)
3047 DOUBLE PRECISION cb_band(nslaves)
3048 INTEGER,
INTENT(INOUT) :: keep(500)
3050 INTEGER ndest, nints, nreals, size1, size2, size
3051 INTEGER ipos, iposmsg, ireq, position
3052 INTEGER i, idest, what
3055 parameter( izero=0 )
3060 IF ( i .NE. myid + 1 .AND. future_niv2(i).NE.0)
THEN
3064 IF ( ndest == 0 )
THEN
3067 nints = 2 + nslaves + ( ndest - 1 ) *
ovhsize + 1
3069 IF (bdc_mem) nreals = nreals + nslaves
3071 nreals = nreals + nslaves
3074 & mpi_integer, comm,
3077 & comm, size2, ierr_mpi )
3081 IF ( ierr .LT. 0 )
THEN
3086 DO idest = 1, ndest - 1
3091 iposmsg = ipos +
ovhsize * ndest
3093 CALL mpi_pack( what, 1, mpi_integer,
3094 &
buf_load%CONTENT( iposmsg ),
SIZE,
3095 & position, comm, ierr_mpi )
3096 CALL mpi_pack( nslaves, 1, mpi_integer,
3097 &
buf_load%CONTENT( iposmsg ),
SIZE,
3098 & position, comm, ierr_mpi )
3099 CALL mpi_pack( inode, 1, mpi_integer,
3100 &
buf_load%CONTENT( iposmsg ),
SIZE,
3101 & position, comm, ierr_mpi )
3102 CALL mpi_pack( list_slaves, nslaves, mpi_integer,
3103 &
buf_load%CONTENT( iposmsg ),
SIZE,
3104 & position, comm, ierr_mpi )
3105 CALL mpi_pack( flops_increment, nslaves,
3106 & mpi_double_precision,
3107 &
buf_load%CONTENT( iposmsg ),
SIZE,
3108 & position, comm, ierr_mpi )
3110 CALL mpi_pack( mem_increment, nslaves,
3111 & mpi_double_precision,
3112 &
buf_load%CONTENT( iposmsg ),
SIZE,
3113 & position, comm, ierr_mpi )
3117 & mpi_double_precision,
3118 &
buf_load%CONTENT( iposmsg ),
SIZE,
3119 & position, comm, ierr_mpi )
3122 DO i = 0, nprocs - 1
3123 IF ( i .NE. myid .AND. future_niv2(i+1) .NE. 0)
THEN
3125 keep(267)=keep(267)+1
3127 & position, mpi_packed, i,
3128 & update_load, comm,
3134 IF (
SIZE .LT. position )
THEN
3135 WRITE(*,*)
' Error in CMUMPS_BUF_BCAST_ARRAY'
3136 WRITE(*,*)
' Size,position=',
SIZE,position
3139 IF (
SIZE .NE. position )
3144 & ( cmumps_lbufr_bytes)
3146 INTEGER cmumps_lbufr_bytes
3153 INTEGER,
intent(out) :: SIZE_OUT, IERR
3154 INTEGER,
intent(in) :: COMM
3155 TYPE (LRB_TYPE),
DIMENSION(:),
intent(in) :: BLR_LorU
3156 INTEGER :: I, SIZE_LOC, IERR_MPI
3160 CALL mpi_pack_size( 1, mpi_integer, comm, size_loc, ierr_mpi )
3161 size_out = size_out + size_loc
3162 DO i = 1,
size(blr_loru)
3165 size_out = size_out + size_loc
3171 INTEGER,
intent(out) :: SIZE_OUT, IERR
3172 INTEGER,
intent(in) :: COMM
3173 TYPE (LRB_TYPE),
intent(in) :: LRB
3174 INTEGER :: SIZE_LOC, IERR_MPI
3179 & mpi_integer, comm, size_loc, ierr_mpi )
3180 size_out = size_out + size_loc
3181 IF ( lrb%ISLR )
THEN
3182 IF (lrb%K .GT. 0)
THEN
3184 & mpi_complex, comm, size_loc, ierr_mpi )
3185 size_out = size_out + size_loc
3187 & mpi_complex, comm, size_loc, ierr_mpi )
3188 size_out = size_out + size_loc
3192 & mpi_complex, comm, size_loc, ierr_mpi )
3193 size_out = size_out + size_loc
3200 INTEGER,
intent(out) :: IERR
3201 INTEGER,
intent(in) :: COMM, LBUF
3202 INTEGER,
intent(inout) :: POSITION
3203 INTEGER,
intent(inout) :: BUF(:)
3204 TYPE (LRB_TYPE),
DIMENSION(:),
intent(in) :: BLR_LorU
3209 CALL mpi_pack(
size(blr_loru), 1, mpi_integer,
3210 & buf(1), lbuf, position, comm, ierr_mpi )
3211 DO i = 1,
size(blr_loru)
3222 INTEGER,
intent(out) :: ierr
3223 INTEGER,
intent(in) :: comm, lbuf
3224 INTEGER,
intent(inout) :: position
3225 INTEGER,
intent(inout) :: buf(:)
3236 CALL mpi_pack( islr_int, 1, mpi_integer,
3237 & buf(1), lbuf, position, comm, ierr_mpi )
3240 & buf(1), lbuf, position, comm, ierr_mpi )
3243 & buf(1), lbuf, position, comm, ierr_mpi )
3246 & buf(1), lbuf, position, comm, ierr_mpi )
3248 IF (lrb%K .GT. 0)
THEN
3250 & lrb%M*lrb%K, mpi_complex,
3251 & buf(1), lbuf, position, comm, ierr_mpi )
3253 & lrb%N*lrb%K, mpi_complex,
3254 & buf(1), lbuf, position, comm, ierr_mpi )
3257 CALL mpi_pack( lrb%Q(1,1), lrb%M*lrb%N
3259 & buf(1), lbuf, position, comm, ierr_mpi )
3264 & BUFR, LBUFR, LBUFR_BYTES, POSITION,
3266 & COMM, IFLAG, IERROR
3271 INTEGER,
INTENT(IN) :: lbufr
3272 INTEGER,
INTENT(IN) :: lbufr_bytes
3273 INTEGER,
INTENT(IN) :: bufr(lbufr)
3274 INTEGER,
INTENT(INOUT) :: position
3275 INTEGER,
INTENT(IN) :: comm
3276 INTEGER,
INTENT(INOUT) :: iflag, ierror
3277 TYPE (
lrb_type),
INTENT(OUT) :: lrb
3278 INTEGER(8) :: keep8(150)
3284 include
'mumps_tags.h'
3285 CALL mpi_unpack( bufr, lbufr_bytes, position,
3286 & islr_int, 1, mpi_integer, comm, ierr_mpi )
3287 CALL mpi_unpack( bufr, lbufr_bytes, position,
3289 & mpi_integer, comm, ierr_mpi )
3290 CALL mpi_unpack( bufr, lbufr_bytes, position,
3292 & mpi_integer, comm, ierr_mpi )
3293 CALL mpi_unpack( bufr, lbufr_bytes, position,
3295 & mpi_integer, comm, ierr_mpi )
3296 IF (islr_int .eq. 1)
THEN
3302 & iflag, ierror, keep8 )
3303 IF (iflag.LT.0)
RETURN
3306 CALL mpi_unpack( bufr, lbufr_bytes, position,
3307 & lrb%Q(1,1), m*k, mpi_complex,
3309 CALL mpi_unpack( bufr, lbufr_bytes, position,
3310 & lrb%R(1,1), n*k, mpi_complex,
3314 CALL mpi_unpack( bufr, lbufr_bytes, position,
3315 & lrb%Q(1,1), m*n, mpi_complex,
3321 & ( blr, buf, lbuf, position,
3323 & a , la, poseltd, ld_diag,
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 (LRB_TYPE),
DIMENSION(:),
intent(in) :: BLR
3332 INTEGER(8),
intent(in) :: LA,
3333 INTEGER,
intent(in) :: LD_DIAG, NPIV
3334 INTEGER,
intent(in) :: IPIV(NPIV), MAXI_CLUSTER
3335 COMPLEX,
intent(inout) :: A(LA)
3337 INTEGER I, ISLR_INT, J, ALLOCOK
3338 COMPLEX,
ALLOCATABLE,
DIMENSION(:,:) :: SCALED
3339 COMPLEX,
ALLOCATABLE,
DIMENSION(:) :: BLOCK
3340 COMPLEX :: 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
3438 IF (
allocated(block))
deallocate(block)
3439 IF (
allocated(scaled))
deallocate(scaled)
subroutine mpi_isend(buf, cnt, datatype, dest, tag, comm, ireq, ierr)
subroutine mpi_test(ireq, flag, status, ierr)
subroutine mpi_pack(inbuf, incnt, datatype, outbuf, outcnt, position, comm, ierr)
subroutine mpi_request_free(ireq, ierr)
subroutine mpi_pack_size(incnt, datatype, comm, size, ierr)
subroutine mpi_cancel(ireq, ierr)
subroutine mpi_unpack(inbuf, insize, position, outbuf, outcnt, datatype, comm, ierr)
type(cmumps_comm_buffer_type), save buf_load
subroutine buf_deall(buf, ierr)
subroutine cmumps_buf_try_free(b)
subroutine, public cmumps_blr_pack_cb_lrb(cb_lrb, nb_row_shift, nb_col_shift, nb_blr_cols, panel2send, panel_beg_offset, buf, lbuf, position, comm, ierr)
subroutine, public cmumps_mpi_unpack_lrb(bufr, lbufr, lbufr_bytes, position, lrb, keep8, comm, iflag, ierror)
subroutine, public cmumps_buf_send_root2son(ison, nelim_root, dest, comm, keep, ierr)
subroutine mumps_mpi_pack_scale_lr(blr, buf, lbuf, position, comm, a, la, poseltd, ld_diag, ipiv, npiv, maxi_cluster, ierr)
subroutine, public cmumps_buf_send_contrib_type2(nbrows_already_sent, desc_in_lu, ipere, nfront_pere, nass_pere, nfs4father, nslaves_pere, ison, nbrow, lmap, maprow, perm, iw_cbson, a_cbson, la_cbson, islave, pdest, pdest_master, comm, ierr, keep, keep8, step, n, slavef, istep_to_iniv2, tab_pos_in_pere, packed_cb, keep253_loc, nvschur, son_niv, myid, npiv_check)
subroutine buf_alloc(buf, size, ierr)
subroutine, public cmumps_buf_send_1int(i, dest, tag, comm, keep, ierr)
subroutine, public cmumps_buf_try_free_cb()
subroutine, public cmumps_buf_deall_small_buf(ierr)
subroutine, public cmumps_buf_send_maitre2(nbrows_already_sent, ipere, ison, nrow, irow, ncol, icol, val, lda, nelim, type_son, nslaves, slaves, dest, comm, ierr, slavef, keep, keep8, iniv2, tab_pos_in_pere)
subroutine, public cmumps_buf_send_maplig(inode, nfront, nass1, nfs4father, ison, myid, nslaves, slaves_pere, trow, ncbson, comm, ierr, dest, ndest, slavef, keep, keep8, step, n, istep_to_iniv2, tab_pos_in_per)
subroutine, public cmumps_buf_test()
integer, save, public buf_lmax_array
subroutine, public cmumps_buf_dist_irecv_size(cmumps_lbufr_bytes)
subroutine mumps_mpi_pack_size_lrb(lrb, size_out, comm, ierr)
subroutine, public cmumps_buf_alloc_load_buffer(size, ierr)
subroutine, public cmumps_buf_deall_load_buffer(ierr)
subroutine, public cmumps_buf_send_update_load(bdc_sbtr, bdc_mem, bdc_md, comm, nprocs, load, mem, sbtr_cur, lu_usage, future_niv2, myid, keep, ierr)
subroutine, public cmumps_buf_send_backvec(nrhs, inode, w, lw, ld_w, dest, msgtag, jbdeb, jbfin, keep, comm, ierr)
subroutine, public cmumps_buf_ini_myid(myid)
subroutine, public cmumps_buf_deall_cb(ierr)
subroutine, public cmumps_buf_send_blocfacto(inode, nfront, ncol, npiv, fpere, lastbl, ipiv, val, pdest, ndest, keep, nb_bloc_fac, nslaves_tot, width, comm, nelim, npartsass, current_blr_panel, lr_activated, blr_loru ierr)
subroutine, public cmumps_buf_deall_max_array()
subroutine, public cmumps_buf_send_desc_bande(inode, nbprocfils, nlig, ilig, ncol, icol, nass, nslaves_hdr, list_slaves, nslaves, estim_nfs4father_atson, dest, ibc_source, nfront, comm, keep, ierr, lrstatus)
subroutine cmumps_buf_empty(b, flag)
integer, save size_rbuf_bytes
subroutine, public cmumps_buf_max_array_minsize(nfs4father, ierr)
subroutine, public cmumps_buf_send_blfac_slave(inode, npiv, fpere, iposk, jposk, uip21k, ncolu, ndest, pdest, comm, keep, lr_activated, blr_ls, ipanel, a, la, posblocfacto, ld_blocfacto, ipiv, maxi_cluster, ierr)
type(cmumps_comm_buffer_type), save buf_cb
subroutine, public cmumps_buf_all_empty(check_comm_nodes, check_comm_load, flag)
subroutine, public cmumps_buf_alloc_cb(size, ierr)
subroutine, public cmumps_buf_broadcast(what, comm, nprocs, future_niv2, load, upd_load, myid, keep, ierr)
subroutine, public cmumps_buf_send_vcb(nrhs_b, node1, node2, ncb, ldw, long, iw, w, jbdeb, jbfin, rhscomp, nrhs, lrhscomp, iposinrhscomp, npiv, keep, dest, tag, comm, ierr)
subroutine, public cmumps_buf_alloc_small_buf(size, ierr)
subroutine, public cmumps_mpi_pack_lrb(lrb, buf, lbuf, position, comm, ierr)
real, dimension(:), allocatable, target, save, public buf_max_array
subroutine, public cmumps_buf_send_rtnelind(ison, nelim, nelim_row, nelim_col, nslaves, slaves, dest, comm, keep, ierr)
subroutine cmumps_mpi_pack_lr(blr_loru, buf, lbuf, position, comm, ierr)
subroutine, public cmumps_buf_init(intsize, realsize)
type(cmumps_comm_buffer_type), save buf_small
subroutine buf_adjust(buf, size)
subroutine, public cmumps_buf_send_fils(what, comm, nprocs, father_node, inode, ncb, keep, myid, remote, ierr)
subroutine, public cmumps_buf_send_not_mstr(comm, myid, nprocs, max_surf_master, keep, ierr)
subroutine buf_look(b, ipos, ireq, msg_size, ierr, ndest, pdest, test_only)
subroutine, public cmumps_buf_send_master2slave(nrhs, inode, ifath, eff_cb_size, ld_cb, ld_piv, npiv, jbdeb, jbfin, cb, sol, dest, comm, keep, ierr)
subroutine, public cmumps_buf_send_contrib_type3(n, ison, nbcol_son, nbrow_son, indcol_son, indrow_son, ld_son, val_son, tag, subset_row, subset_col, nsubset_row, nsubset_col, nsuprow, nsupcol, nprow, npcol, mblock, rg2l_row, rg2l_col, nblock, pdest, comm, ierr, tab, tabsize, transp, size_pack, n_already_sent, keep, bbpcbp)
subroutine mumps_mpi_pack_size_lr(blr_loru, size_out, comm, ierr)
subroutine, public cmumps_buf_send_root2slave(tot_root_size, tot_cont2recv, dest, comm, keep, ierr)
subroutine cmumps_buf_size_available(b, size_av)
subroutine, public cmumps_buf_send_cb(nbrows_already_sent, inode, fpere, nfront, lcont, nass, npiv, iwrow, iwcol, a, packed_cb, dest, tag, comm, keep, ierr)
subroutine, public cmumps_buf_bcast_array(bdc_mem, comm, myid, nprocs, future_niv2, nslaves, list_slaves, inode, mem_increment, flops_increment, cb_band, what, keep, ierr)
subroutine alloc_lrb(lrb_out, k, m, n, islr, iflag, ierror, keep8)