YbcSendRecv Subroutine

public subroutine YbcSendRecv()

Uses

  • proc~~ybcsendrecv~~UsesGraph proc~ybcsendrecv YbcSendRecv module~mpimod mpimod proc~ybcsendrecv->module~mpimod module~config config module~mpimod->module~config mpi mpi module~mpimod->mpi

Arguments

None

Calls

proc~~ybcsendrecv~~CallsGraph proc~ybcsendrecv YbcSendRecv mpi_irecv mpi_irecv proc~ybcsendrecv->mpi_irecv mpi_isend mpi_isend proc~ybcsendrecv->mpi_isend mpi_waitall mpi_waitall proc~ybcsendrecv->mpi_waitall

Called by

proc~~ybcsendrecv~~CalledByGraph proc~ybcsendrecv YbcSendRecv proc~boundarycondition BoundaryCondition proc~boundarycondition->proc~ybcsendrecv program~main main program~main->proc~boundarycondition

Source Code

  subroutine YbcSendRecv()
    use mpimod
    implicit none
    integer :: i,j,k

    if (ntiles(2) == 1) then
!$omp target teams distribute parallel do collapse(3)
      do k=1,kn-1
      do j=1,mgn
      do i=1,in-1
        select case(boundary_yin)
        case(periodicb)
          BrYstt(i,j,k,1:nbc) = BsYend(i,j,k,1:nbc)
        case(reflection)
          BrYstt(i,j,k,1:nbc) = BsYstt(i,mgn-j+1,k,1:nbc)
          BrYstt(i,j,k,nv2) = -BrYstt(i,j,k,nv2)
        case(outflow)
          BrYstt(i,j,k,1:nbc) = BsYstt(i,1,k,1:nbc)
        end select

        select case(boundary_yout)
        case(periodicb)
          BrYend(i,j,k,1:nbc) = BsYstt(i,j,k,1:nbc)
        case(reflection)
          BrYend(i,j,k,1:nbc) = BsYend(i,mgn-j+1,k,1:nbc)
          BrYend(i,j,k,nv2) = -BrYend(i,j,k,nv2)
        case(outflow)
          BrYend(i,j,k,1:nbc) = BsYend(i,mgn,k,1:nbc)
        end select
      end do
      end do
      end do
      return
    end if

!$omp target update from(BsYstt, BsYend)

    if (n2m /= MPI_PROC_NULL) then
      call MPI_IRECV(BrYstt, size(BrYstt), MPI_DOUBLE_PRECISION, n2m, 2100, comm3d, req(nreq+1), ierr)
      nreq = nreq + 1
      call MPI_ISEND(BsYstt, size(BsYstt), MPI_DOUBLE_PRECISION, n2m, 2200, comm3d, req(nreq+1), ierr)
      nreq = nreq + 1
    else
      if (boundary_yin == reflection) then
!$omp target teams distribute parallel do collapse(3)
        do k=1,kn-1; do j=1,mgn; do i=1,in-1
          BrYstt(i,j,k,1:nbc) = BsYstt(i,mgn-j+1,k,1:nbc)
          BrYstt(i,j,k,nv2) = -BrYstt(i,j,k,nv2)
        end do; end do; end do
      else if (boundary_yin == outflow) then
!$omp target teams distribute parallel do collapse(3)
        do k=1,kn-1; do j=1,mgn; do i=1,in-1
          BrYstt(i,j,k,1:nbc) = BsYstt(i,1,k,1:nbc)
        end do; end do; end do
      end if
    end if

    if (n2p /= MPI_PROC_NULL) then
      call MPI_IRECV(BrYend, size(BrYend), MPI_DOUBLE_PRECISION, n2p, 2200, comm3d, req(nreq+1), ierr)
      nreq = nreq + 1
      call MPI_ISEND(BsYend, size(BsYend), MPI_DOUBLE_PRECISION, n2p, 2100, comm3d, req(nreq+1), ierr)
      nreq = nreq + 1
    else
      if (boundary_yout == reflection) then
!$omp target teams distribute parallel do collapse(3)
        do k=1,kn-1; do j=1,mgn; do i=1,in-1
          BrYend(i,j,k,1:nbc) = BsYend(i,mgn-j+1,k,1:nbc)
          BrYend(i,j,k,nv2) = -BrYend(i,j,k,nv2)
        end do; end do; end do
      else if (boundary_yout == outflow) then
!$omp target teams distribute parallel do collapse(3)
        do k=1,kn-1; do j=1,mgn; do i=1,in-1
          BrYend(i,j,k,1:nbc) = BsYend(i,mgn,k,1:nbc)
        end do; end do; end do
      end if
    end if

    if (nreq /= 0) then
      call MPI_WAITALL(nreq, req, stat, ierr)
      if (n2m /= MPI_PROC_NULL) then
!$omp target update to(BrYstt)
      end if
      if (n2p /= MPI_PROC_NULL) then
!$omp target update to(BrYend)
      end if
      nreq = 0
    end if

  end subroutine YbcSendRecv