LCOV - code coverage report
Current view: top level - shared/common/src/12_hide_mpi - xmpi_exch.finc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 40.0 % 95 38
Test Date: 2026-09-21 22:40:37 Functions: 40.0 % 10 4

            Line data    Source code
       1              : !{\src2tex{textfont=tt}}
       2              : !!****f* ABINIT/xmpi_exch_int1d
       3              : !! NAME
       4              : !!  xmpi_exch_int1d
       5              : !!
       6              : !! FUNCTION
       7              : !!  This module contains functions that calls MPI routine,
       8              : !!  if we compile the code using the MPI CPP flags.
       9              : !!  xmpi_exch is the generic function.
      10              : !!
      11              : !! COPYRIGHT
      12              : !!  Copyright (C) 2001-2026 ABINIT group (MB,MT)
      13              : !!  This file is distributed under the terms of the
      14              : !!  GNU General Public License, see ~ABINIT/COPYING
      15              : !!  or http://www.gnu.org/copyleft/gpl.txt .
      16              : !!
      17              : !! NOTE
      18              : !!  The tag conforms to the MPI request that the tag is lower than 32768,
      19              : !!    by using a modulo call.
      20              : !!
      21              : !! SOURCE
      22              : 
      23              : !--------------------------------------------------------------------
      24              : 
      25            0 : subroutine xmpi_exch_int1d(vsend,n1,sender,vrecv,recever,comm,mtag,ier)
      26              : 
      27              : !Arguments----------------
      28              :  integer,intent(in) :: mtag,n1
      29              :  integer, DEV_CONTARRD intent(in) :: vsend(:)
      30              :  integer, DEV_CONTARRD intent(inout) :: vrecv(:)
      31              :  integer,intent(in) :: sender,recever,comm
      32              :  integer,intent(out) :: ier
      33              : 
      34              : !Local variables--------------
      35              : #if defined HAVE_MPI
      36              :  integer :: statux(MPI_STATUS_SIZE)
      37              :  integer :: tag,me
      38              : #endif
      39              : 
      40              : ! *************************************************************************
      41              : 
      42            0 :  ier=0
      43              : #if defined HAVE_MPI
      44            0 :  if (sender==recever.or.comm==MPI_COMM_NULL.or.n1==0) return
      45            0 :  call MPI_COMM_RANK(comm,me,ier)
      46            0 :  tag = MOD(mtag,xmpi_tag_ub)
      47              : 
      48            0 :  if (recever==me) then
      49            0 :    call MPI_RECV(vrecv,n1,MPI_INTEGER,sender,tag,comm,statux,ier)
      50              :  end if
      51            0 :  if (sender==me) then
      52            0 :    call MPI_SEND(vsend,n1,MPI_INTEGER,recever,tag,comm,ier)
      53              :  end if
      54              : #endif
      55              : 
      56              : end subroutine xmpi_exch_int1d
      57              : !!***
      58              : 
      59              : !--------------------------------------------------------------------
      60              : 
      61              : !!****f* ABINIT/xmpi_exch_int2d
      62              : !! NAME
      63              : !!  xmpi_exch_int2d
      64              : !!
      65              : !! FUNCTION
      66              : !!  Sends and receives data.
      67              : !!  Target: two-dimensional integer arrays.
      68              : !!
      69              : !! INPUTS
      70              : !!  mtag= message tag
      71              : !!  nt= vector length
      72              : !!  vsend= send buffer
      73              : !!  sender= node sending the data
      74              : !!  recever= node receiving the data
      75              : !!  comm= MPI communicator
      76              : !!
      77              : !! OUTPUT
      78              : !!  ier= exit status, a non-zero value meaning there is an error
      79              : !!
      80              : !! SIDE EFFECTS
      81              : !!  vrecv= receive buffer
      82              : !!
      83              : !! SOURCE
      84              : 
      85          140 : subroutine xmpi_exch_int2d(vsend,nt,sender,vrecv,recever,comm,mtag,ier)
      86              : 
      87              : !Arguments----------------
      88              :  integer,intent(in) :: mtag,nt
      89              :  integer, DEV_CONTARRD intent(in) :: vsend(:,:)
      90              :  integer, DEV_CONTARRD intent(inout) :: vrecv(:,:)
      91              :  integer,intent(in) :: sender,recever,comm
      92              :  integer,intent(out) :: ier
      93              : 
      94              : !Local variables--------------
      95              : #if defined HAVE_MPI
      96              :  integer :: statux(MPI_STATUS_SIZE)
      97              :  integer :: tag,me
      98              : #endif
      99              : 
     100              : ! *************************************************************************
     101              : 
     102          140 :  ier=0
     103              : #if defined HAVE_MPI
     104          140 :  if (sender==recever.or.comm==MPI_COMM_NULL.or.nt==0) return
     105          140 :  call MPI_COMM_RANK(comm,me,ier)
     106          140 :  tag = MOD(mtag, xmpi_tag_ub)
     107              : 
     108          140 :  if (recever==me) then
     109           70 :    call MPI_RECV(vrecv,nt,MPI_INTEGER,sender,tag,comm,statux,ier)
     110              :  end if
     111          140 :  if (sender==me) then
     112           70 :    call MPI_SEND(vsend,nt,MPI_INTEGER,recever,tag,comm,ier)
     113              :  end if
     114              : #endif
     115              : 
     116              : end subroutine xmpi_exch_int2d
     117              : !!***
     118              : 
     119              : !--------------------------------------------------------------------
     120              : 
     121              : !!****f* ABINIT/xmpi_exch_dp1d
     122              : !! NAME
     123              : !!  xmpi_exch_dp1d
     124              : !!
     125              : !! FUNCTION
     126              : !!  Sends and receives data.
     127              : !!  Target: double precision one-dimensional arrays.
     128              : !!
     129              : !! INPUTS
     130              : !!  mtag= message tag
     131              : !!  nt= vector length
     132              : !!  vsend= send buffer
     133              : !!  sender= node sending the data
     134              : !!  recever= node receiving the data
     135              : !!  comm= MPI communicator
     136              : !!
     137              : !! OUTPUT
     138              : !!  ier= exit status, a non-zero value meaning there is an error
     139              : !!
     140              : !! SIDE EFFECTS
     141              : !!  vrecv= receive buffer
     142              : !!
     143              : !! SOURCE
     144              : 
     145            0 : subroutine xmpi_exch_dp1d(vsend,nt,sender,vrecv,recever,comm,mtag,ier)
     146              : 
     147              : !Arguments----------------
     148              :  integer,intent(in) :: mtag,nt
     149              :  real(dp), DEV_CONTARRD intent(in) :: vsend(:)
     150              :  real(dp), DEV_CONTARRD intent(inout) :: vrecv(:)
     151              :  integer,intent(in) :: sender,recever,comm
     152              :  integer,intent(out) :: ier
     153              : 
     154              : !Local variables--------------
     155              : #if defined HAVE_MPI
     156              :  integer :: statux(MPI_STATUS_SIZE)
     157              :  integer :: me,my_dt,my_op,tag
     158              :  integer(kind=int64) :: ntot
     159              : #endif
     160              : 
     161              : ! *************************************************************************
     162              : 
     163            0 :  ier=0
     164              : #if defined HAVE_MPI
     165            0 :  if (sender==recever.or.comm==MPI_COMM_NULL.or.nt==0) return
     166            0 :  call MPI_COMM_RANK(comm,me,ier)
     167            0 :  tag = MOD(mtag, xmpi_tag_ub)
     168              : 
     169              :  !The dimension can be greater than a 32bit integer
     170              :  !We use a INT64 to store it. If it is too large, we switch to an
     171              :  !alternate routine because MPI<4 doesnt handle 64 bit counts.
     172            0 :  ntot=int(nt,kind=int64)
     173              : 
     174            0 :  if (recever==me) then
     175              :    if (ntot<=xmpi_maxint32_64) then
     176            0 :      call MPI_RECV(vrecv,nt,MPI_DOUBLE_PRECISION,sender,tag,comm,statux,ier)
     177              :    else
     178              :      call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
     179              :      call MPI_RECV(vrecv,1,my_dt,sender,tag,comm,statux,ier)
     180              :      call xmpi_largetype_free(my_dt,my_op)
     181              :    end if
     182              :  end if
     183            0 :  if (sender==me) then
     184              :    if (ntot<=xmpi_maxint32_64) then
     185            0 :      call MPI_SEND(vsend,nt,MPI_DOUBLE_PRECISION,recever,tag,comm,ier)
     186              :    else
     187              :      call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
     188              :      call MPI_SEND(vsend,1,my_dt,recever,tag,comm,ier)
     189              :      call xmpi_largetype_free(my_dt,my_op)
     190              :    end if
     191              :  end if
     192              : #endif
     193              : 
     194              : end subroutine xmpi_exch_dp1d
     195              : !!***
     196              : 
     197              : !--------------------------------------------------------------------
     198              : 
     199              : !!****f* ABINIT/xmpi_exch_dp2d
     200              : !! NAME
     201              : !!  xmpi_exch_dp2d
     202              : !!
     203              : !! FUNCTION
     204              : !!  Sends and receives data.
     205              : !!  Target: double precision two-dimensional arrays.
     206              : !!
     207              : !! INPUTS
     208              : !!  mtag= message tag
     209              : !!  nt= vector length
     210              : !!  vsend= send buffer
     211              : !!  sender= node sending the data
     212              : !!  recever= node receiving the data
     213              : !!  comm= MPI communicator
     214              : !!
     215              : !! OUTPUT
     216              : !!  ier= exit status, a non-zero value meaning there is an error
     217              : !!
     218              : !! SIDE EFFECTS
     219              : !!  vrecv= receive buffer
     220              : !!
     221              : !! SOURCE
     222              : 
     223          148 : subroutine xmpi_exch_dp2d(vsend,nt,sender,vrecv,recever,comm,mtag,ier)
     224              : 
     225              : !Arguments----------------
     226              :  integer,intent(in) :: mtag,nt
     227              :  real(dp), DEV_CONTARRD intent(in) :: vsend(:,:)
     228              :  real(dp), DEV_CONTARRD intent(inout) :: vrecv(:,:)
     229              :  integer,intent(in) :: sender,recever,comm
     230              :  integer,intent(out) :: ier
     231              : 
     232              : !Local variables--------------
     233              : #if defined HAVE_MPI
     234              :  integer :: statux(MPI_STATUS_SIZE)
     235              :  integer :: me,my_dt,my_op,tag
     236              :  integer(kind=int64) :: ntot
     237              : #endif
     238              : 
     239              : ! *************************************************************************
     240              : 
     241          148 :  ier=0
     242              : #if defined HAVE_MPI
     243          148 :  if (sender==recever.or.comm==MPI_COMM_NULL.or.nt==0) return
     244          148 :  call MPI_COMM_RANK(comm,me,ier)
     245          148 :  tag = MOD(mtag, xmpi_tag_ub)
     246              : 
     247              :  !The dimension can be greater than a 32bit integer
     248              :  !We use a INT64 to store it. If it is too large, we switch to an
     249              :  !alternate routine because MPI<4 doesnt handle 64 bit counts.
     250          148 :  ntot=int(nt,kind=int64)
     251              : 
     252          148 :  if (recever==me) then
     253              :    if (ntot<=xmpi_maxint32_64) then
     254           74 :      call MPI_RECV(vrecv,nt,MPI_DOUBLE_PRECISION,sender,tag,comm,statux,ier)
     255              :    else
     256              :      call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
     257              :      call MPI_RECV(vrecv,1,my_dt,sender,tag,comm,statux,ier)
     258              :      call xmpi_largetype_free(my_dt,my_op)
     259              :    end if
     260              :  end if
     261          148 :  if (sender==me) then
     262              :    if (ntot<=xmpi_maxint32_64) then
     263           74 :      call MPI_SEND(vsend,nt,MPI_DOUBLE_PRECISION,recever,tag,comm,ier)
     264              :    else
     265              :      call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
     266              :      call MPI_SEND(vsend,1,my_dt,recever,tag,comm,ier)
     267              :      call xmpi_largetype_free(my_dt,my_op)
     268              :    end if
     269              :  end if
     270              : #endif
     271              : 
     272              : end subroutine xmpi_exch_dp2d
     273              : !!***
     274              : 
     275              : !--------------------------------------------------------------------
     276              : 
     277              : !!****f* ABINIT/xmpi_exch_dp3d
     278              : !! NAME
     279              : !!  xmpi_exch_dp3d
     280              : !!
     281              : !! FUNCTION
     282              : !!  Sends and receives data.
     283              : !!  Target: double precision three-dimensional arrays.
     284              : !!
     285              : !! INPUTS
     286              : !!  mtag= message tag
     287              : !!  nt= vector length
     288              : !!  vsend= send buffer
     289              : !!  sender= node sending the data
     290              : !!  recever= node receiving the data
     291              : !!  comm= MPI communicator
     292              : !!
     293              : !! OUTPUT
     294              : !!  ier= exit status, a non-zero value meaning there is an error
     295              : !!
     296              : !! SIDE EFFECTS
     297              : !!  vrecv= receive buffer
     298              : !!
     299              : !! SOURCE
     300              : 
     301          380 : subroutine xmpi_exch_dp3d(vsend,nt,sender,vrecv,recever,comm,mtag,ier)
     302              : 
     303              : !Arguments----------------
     304              :  integer,intent(in) :: mtag,nt
     305              :  real(dp), DEV_CONTARRD intent(in) :: vsend(:,:,:)
     306              :  real(dp), DEV_CONTARRD intent(inout) :: vrecv(:,:,:)
     307              :  integer,intent(in) :: sender,recever,comm
     308              :  integer,intent(out) :: ier
     309              : 
     310              : !Local variables--------------
     311              : #if defined HAVE_MPI
     312              :  integer :: statux(MPI_STATUS_SIZE)
     313              :  integer :: me,my_dt,my_op,tag
     314              :  integer(kind=int64) :: ntot
     315              : #endif
     316              : 
     317              : ! *************************************************************************
     318              : 
     319          380 :  ier=0
     320              : #if defined HAVE_MPI
     321          380 :  if (sender==recever.or.comm==MPI_COMM_NULL.or.nt==0) return
     322          320 :  call MPI_COMM_RANK(comm,me,ier)
     323          320 :  tag = MOD(mtag, xmpi_tag_ub)
     324              : 
     325              :  !The dimension can be greater than a 32bit integer
     326              :  !We use a INT64 to store it. If it is too large, we switch to an
     327              :  !alternate routine because MPI<4 doesnt handle 64 bit counts.
     328          320 :  ntot=int(nt,kind=int64)
     329              : 
     330          320 :  if (recever==me) then
     331              :    if (ntot<=xmpi_maxint32_64) then
     332          160 :      call MPI_RECV(vrecv,nt,MPI_DOUBLE_PRECISION,sender,tag,comm,statux,ier)
     333              :    else
     334              :      call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
     335              :      call MPI_RECV(vrecv,1,my_dt,sender,tag,comm,statux,ier)
     336              :      call xmpi_largetype_free(my_dt,my_op)
     337              :    end if
     338              :  end if
     339          320 :  if (sender==me) then
     340              :    if (ntot<=xmpi_maxint32_64) then
     341          160 :      call MPI_SEND(vsend,nt,MPI_DOUBLE_PRECISION,recever,tag,comm,ier)
     342              :    else
     343              :      call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
     344              :      call MPI_SEND(vsend,1,my_dt,recever,tag,comm,ier)
     345              :      call xmpi_largetype_free(my_dt,my_op)
     346              :    end if
     347              :  end if
     348              : #endif
     349              : 
     350              : end subroutine xmpi_exch_dp3d
     351              : !!***
     352              : 
     353              : !--------------------------------------------------------------------
     354              : 
     355              : !!****f* ABINIT/xmpi_exch_dp4d_tag
     356              : !! NAME
     357              : !!  xmpi_exch_dp4d_tag
     358              : !!
     359              : !! FUNCTION
     360              : !!  Sends and receives data.
     361              : !!  Target: double precision four-dimensional arrays.
     362              : !!
     363              : !! INPUTS
     364              : !!  mtag= message tag
     365              : !!  nt= vector length
     366              : !!  vsend= send buffer
     367              : !!  sender= node sending the data
     368              : !!  recever= node receiving the data
     369              : !!  comm= MPI communicator
     370              : !!
     371              : !! OUTPUT
     372              : !!  ier= exit status, a non-zero value meaning there is an error
     373              : !!
     374              : !! SIDE EFFECTS
     375              : !!  vrecv= receive buffer
     376              : !!
     377              : !! SOURCE
     378              : 
     379            0 : subroutine xmpi_exch_dp4d(vsend,nt,sender,vrecv,recever,comm,mtag,ier)
     380              : 
     381              : !Arguments----------------
     382              :  integer,intent(in) :: mtag,nt
     383              :  real(dp), DEV_CONTARRD intent(in) :: vsend(:,:,:,:)
     384              :  real(dp), DEV_CONTARRD intent(inout) :: vrecv(:,:,:,:)
     385              :  integer,intent(in) :: sender,recever,comm
     386              :  integer,intent(out) :: ier
     387              : 
     388              : !Local variables--------------
     389              : #if defined HAVE_MPI
     390              :  integer :: statux(MPI_STATUS_SIZE)
     391              :  integer :: me,my_dt,my_op,tag
     392              :  integer(kind=int64) :: ntot
     393              : #endif
     394              : 
     395              : ! *************************************************************************
     396              : 
     397            0 :  ier=0
     398              : #if defined HAVE_MPI
     399            0 :  if (sender==recever.or.comm==MPI_COMM_NULL.or.nt==0) return
     400            0 :  call MPI_COMM_RANK(comm,me,ier)
     401            0 :  tag = MOD(mtag, xmpi_tag_ub)
     402              : 
     403              :  !The dimension can be greater than a 32bit integer
     404              :  !We use a INT64 to store it. If it is too large, we switch to an
     405              :  !alternate routine because MPI<4 doesnt handle 64 bit counts.
     406            0 :  ntot=int(nt,kind=int64)
     407              : 
     408            0 :  if (recever==me) then
     409              :    if (ntot<=xmpi_maxint32_64) then
     410            0 :      call MPI_RECV(vrecv,nt,MPI_DOUBLE_PRECISION,sender,tag,comm,statux,ier)
     411              :    else
     412              :      call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
     413              :      call MPI_RECV(vrecv,1,my_dt,sender,tag,comm,statux,ier)
     414              :      call xmpi_largetype_free(my_dt,my_op)
     415              :    end if
     416              :  end if
     417            0 :  if (sender==me) then
     418              :    if (ntot<=xmpi_maxint32_64) then
     419            0 :      call MPI_SEND(vsend,nt,MPI_DOUBLE_PRECISION,recever,tag,comm,ier)
     420              :    else
     421              :      call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
     422              :      call MPI_SEND(vsend,1,my_dt,recever,tag,comm,ier)
     423              :      call xmpi_largetype_free(my_dt,my_op)
     424              :    end if
     425              :  end if
     426              : #endif
     427              : 
     428              : end subroutine xmpi_exch_dp4d
     429              : !!***
     430              : 
     431              : !--------------------------------------------------------------------
     432              : 
     433              : !!****f* ABINIT/xmpi_exch_dp5d_tag
     434              : !! NAME
     435              : !!  xmpi_exch_dp5d_tag
     436              : !!
     437              : !! FUNCTION
     438              : !!  Sends and receives data.
     439              : !!  Target: double precision five-dimensional arrays.
     440              : !!
     441              : !! INPUTS
     442              : !!  mtag= message tag
     443              : !!  nt= vector length
     444              : !!  vsend= send buffer
     445              : !!  sender= node sending the data
     446              : !!  recever= node receiving the data
     447              : !!  comm= MPI communicator
     448              : !!
     449              : !! OUTPUT
     450              : !!  ier= exit status, a non-zero value meaning there is an error
     451              : !!
     452              : !! SIDE EFFECTS
     453              : !!  vrecv= receive buffer
     454              : !!
     455              : !! SOURCE
     456              : 
     457            0 : subroutine xmpi_exch_dp5d(vsend,nt,sender,vrecv,recever,comm,mtag,ier)
     458              : 
     459              : !Arguments----------------
     460              :  integer,intent(in) :: mtag,nt
     461              :  real(dp), DEV_CONTARRD intent(in) :: vsend(:,:,:,:,:)
     462              :  real(dp), DEV_CONTARRD intent(inout) :: vrecv(:,:,:,:,:)
     463              :  integer,intent(in) :: sender,recever,comm
     464              :  integer,intent(out) :: ier
     465              : 
     466              : !Local variables--------------
     467              : #if defined HAVE_MPI
     468              :  integer :: statux(MPI_STATUS_SIZE)
     469              :  integer :: me,my_dt,my_op,tag
     470              :  integer(kind=int64) :: ntot
     471              : #endif
     472              : 
     473              : ! *************************************************************************
     474              : 
     475            0 :  ier=0
     476              : #if defined HAVE_MPI
     477            0 :  if (sender==recever.or.comm==MPI_COMM_NULL.or.nt==0) return
     478            0 :  call MPI_COMM_RANK(comm,me,ier)
     479            0 :  tag = MOD(mtag,xmpi_tag_ub)
     480              : 
     481              :  !The dimension can be greater than a 32bit integer
     482              :  !We use a INT64 to store it. If it is too large, we switch to an
     483              :  !alternate routine because MPI<4 doesnt handle 64 bit counts.
     484            0 :  ntot=int(nt,kind=int64)
     485              : 
     486            0 :  if (recever==me) then
     487              :    if (ntot<=xmpi_maxint32_64) then
     488            0 :      call MPI_RECV(vrecv,nt,MPI_DOUBLE_PRECISION,sender,tag,comm,statux,ier)
     489              :    else
     490              :      call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
     491              :      call MPI_RECV(vrecv,1,my_dt,sender,tag,comm,statux,ier)
     492              :      call xmpi_largetype_free(my_dt,my_op)
     493              :    end if
     494              :  end if
     495            0 :  if (sender==me) then
     496              :    if (ntot<=xmpi_maxint32_64) then
     497            0 :      call MPI_SEND(vsend,nt,MPI_DOUBLE_PRECISION,recever,tag,comm,ier)
     498              :    else
     499              :      call xmpi_largetype_create(ntot,MPI_DOUBLE_PRECISION,my_dt,my_op,MPI_OP_NULL)
     500              :      call MPI_SEND(vsend,1,my_dt,recever,tag,comm,ier)
     501              :      call xmpi_largetype_free(my_dt,my_op)
     502              :    end if
     503              :  end if
     504              : #endif
     505              : 
     506              : end subroutine xmpi_exch_dp5d
     507              : !!***
     508              : 
     509              : !--------------------------------------------------------------------
     510              : 
     511              : !!****f* ABINIT/xmpi_exch_spc1d
     512              : !! NAME
     513              : !!  xmpi_exch_spc1d
     514              : !!
     515              : !! FUNCTION
     516              : !!  Sends and receives data.
     517              : !!  Target: one-dimensional single precision complex arrays.
     518              : !!
     519              : !! SOURCE
     520              : 
     521            0 : subroutine xmpi_exch_spc1d(vsend,n1,sender,vrecv,recever,comm,mtag,ier)
     522              : 
     523              : !Arguments----------------
     524              :  integer,intent(in) :: mtag,n1
     525              :  complex(sp), DEV_CONTARRD intent(in) :: vsend(:)
     526              :  complex(sp), DEV_CONTARRD intent(inout) :: vrecv(:)
     527              :  integer,intent(in) :: sender,recever,comm
     528              :  integer,intent(out) :: ier
     529              : 
     530              : !Local variables--------------
     531              : #if defined HAVE_MPI
     532              :  integer :: statux(MPI_STATUS_SIZE)
     533              :  integer :: tag,me
     534              : #endif
     535              : 
     536              : ! *************************************************************************
     537              : 
     538            0 :  ier=0
     539              : #if defined HAVE_MPI
     540            0 :  if (sender==recever.or.comm==MPI_COMM_NULL.or.(n1==0)) return
     541            0 :  call MPI_COMM_RANK(comm,me,ier)
     542            0 :  tag = MOD(mtag, xmpi_tag_ub)
     543              : 
     544            0 :  if (recever==me) then
     545            0 :    call MPI_RECV(vrecv,n1,MPI_COMPLEX,sender, tag,comm,statux,ier)
     546              :  end if
     547            0 :  if (sender==me) then
     548            0 :    call MPI_SEND(vsend,n1,MPI_COMPLEX,recever,tag,comm,ier)
     549              :  end if
     550              : #endif
     551              : 
     552              : end subroutine xmpi_exch_spc1d
     553              : !!***
     554              : 
     555              : !--------------------------------------------------------------------
     556              : 
     557              : !!****f* ABINIT/xmpi_exch_dpc1d
     558              : !! NAME
     559              : !!  xmpi_exch_dpc1d
     560              : !!
     561              : !! FUNCTION
     562              : !!  Sends and receives data.
     563              : !!  Target: one-dimensional double precision complex arrays.
     564              : !!
     565              : !! SOURCE
     566              : 
     567            8 : subroutine xmpi_exch_dpc1d(vsend,n1,sender,vrecv,recever,comm,mtag,ier)
     568              : 
     569              : !Arguments----------------
     570              :  integer,intent(in) :: mtag,n1
     571              :  complex(dp), DEV_CONTARRD intent(in) :: vsend(:)
     572              :  complex(dp), DEV_CONTARRD intent(inout) :: vrecv(:)
     573              :  integer,intent(in) :: sender,recever,comm
     574              :  integer,intent(out) :: ier
     575              : 
     576              : !Local variables--------------
     577              : #if defined HAVE_MPI
     578              :  integer :: statux(MPI_STATUS_SIZE)
     579              :  integer :: tag,me
     580              : #endif
     581              : 
     582              : ! *************************************************************************
     583              : 
     584            8 :  ier=0
     585              : #if defined HAVE_MPI
     586            8 :  if (sender==recever.or.comm==MPI_COMM_NULL.or.n1==0) return
     587            8 :  call MPI_COMM_RANK(comm,me,ier)
     588            8 :  tag = MOD(mtag, xmpi_tag_ub)
     589              : 
     590            8 :  if (recever==me) then
     591            4 :    call MPI_RECV(vrecv,n1,MPI_DOUBLE_COMPLEX,sender, tag,comm,statux,ier)
     592              :  end if
     593            8 :  if (sender==me) then
     594            4 :    call MPI_SEND(vsend,n1,MPI_DOUBLE_COMPLEX,recever,tag,comm,ier)
     595              :  end if
     596              : #endif
     597              : 
     598              : end subroutine xmpi_exch_dpc1d
     599              : !!***
     600              : 
     601              : !--------------------------------------------------------------------
     602              : 
     603              : !!****f* ABINIT/xmpi_exch_dpc2d
     604              : !! NAME
     605              : !!  xmpi_exch_dpc2d
     606              : !!
     607              : !! FUNCTION
     608              : !!  Sends and receives data.
     609              : !!  Target: two-dimensional double precision complex arrays.
     610              : !!
     611              : !! SOURCE
     612              : 
     613            0 : subroutine xmpi_exch_dpc2d(vsend,nt,sender,vrecv,recever,comm,mtag,ier)
     614              : 
     615              : !Arguments----------------
     616              :  integer,intent(in) :: mtag,nt
     617              :  complex(dp), DEV_CONTARRD intent(in) :: vsend(:,:)
     618              :  complex(dp), DEV_CONTARRD intent(inout) :: vrecv(:,:)
     619              :  integer,intent(in) :: sender,recever,comm
     620              :  integer,intent(out) :: ier
     621              : 
     622              : !Local variables--------------
     623              : #if defined HAVE_MPI
     624              :  integer :: statux(MPI_STATUS_SIZE)
     625              :  integer :: tag,me
     626              : #endif
     627              : ! *************************************************************************
     628              : 
     629            0 :  ier=0
     630              : #if defined HAVE_MPI
     631            0 :  if (sender==recever.or.comm==MPI_COMM_NULL.or.(nt==0)) return
     632            0 :  call MPI_COMM_RANK(comm,me,ier)
     633            0 :  tag = MOD(mtag, xmpi_tag_ub)
     634              : 
     635            0 :  if (recever==me) then
     636            0 :    call MPI_RECV(vrecv,nt,MPI_DOUBLE_COMPLEX,sender, tag,comm,statux,ier)
     637              :  end if
     638            0 :  if (sender==me) then
     639            0 :    call MPI_SEND(vsend,nt,MPI_DOUBLE_COMPLEX,recever,tag,comm,ier)
     640              :  end if
     641              : #endif
     642              : 
     643              : end subroutine xmpi_exch_dpc2d
     644              : !!***
        

Generated by: LCOV version 2.3-1