synchro_mpi.f90

### TABLE OF CONTENTS

- 1. NUM/synchro_mpi

## NUM/synchro_mpi [ Modules ]

[ Top ] [ Modules ]

NOM

     synchro_mpi(calc)

DESCRIPTION

     Envoie des donnees entre domaines et calcul du pas de temps global
     Sending data between domains and calculating the global time step

        ENTREES / INPUT
     calc : objet calcul / calcul object
        SORTIES / OUTPUT
     calc : objet calcul / calcul object

SOURCE

    ! Ce logiciel est regi par la licence [CeCILL-B]
    ! This software is governed by the [CeCILL-B] license
    !=========================== DEBUT DES DECLARATIONS ====================
    !.1-----  Implicit, Use
      use num_typ
      IMPLICIT NONE
    #ifdef _MPI
      include 'mpif.h'
    #endif
    !.2-----  Declaration
      type(calcul), intent(inout)          :: calc !! Objet calcul / Calcul object

      real(kind=kind(0.d0))                :: dt_glob,vmax_glob,xb_level_cell_glob
      integer                              :: ierr,isize,nbs,nbr,jj,kc,ii
    #ifdef _MPI
      integer, dimension(MPI_STATUS_SIZE)  :: istat
    #endif

    ! tableau des donnees aÂ  echanger dimensionne au max des cellules aÂ  envoyer ou recevoir
    ! conserve entre chaque appel a synchro_mpi
    !  type(vect_nvar),dimension(:),save,allocatable :: buffer_send,buffer_recv  ! version non visqueuse
      type(state),dimension(:),save,allocatable :: buffer_send,buffer_recv       ! version visqueuse (passage des gradients)
    !=========================== DEBUT DU CODE EXECUTABLE ==================

    ! Si buffer n est pas reserve, recherche de sa taille et allocation
      isize=0
      IF (.not.allocated(buffer_send)) THEN
          DO ii=1,calc%msh%nb_dom
              IF (associated(calc%msh%list_send(ii)%L))isize=max(isize,size(calc%msh%list_send(ii)%L))
              IF (associated(calc%msh%list_recv(ii)%L))isize=max(isize,size(calc%msh%list_recv(ii)%L))
          END DO
          allocate(buffer_send(isize))
          allocate(buffer_recv(isize))
      END IF

    #ifdef _MPI
      CALL MPI_ALLREDUCE(calc%dt,dt_glob,1,MPI_DOUBLE_PRECISION, MPI_MIN,MPI_COMM_WORLD,ierr)
      CALL MPI_ALLREDUCE(calc%vmax,vmax_glob,1,MPI_DOUBLE_PRECISION,MPI_MAX,MPI_COMM_WORLD,ierr)
      CALL MPI_ALLREDUCE(calc%msh%nb_level_cell*1.d0,xb_level_cell_glob,1,MPI_DOUBLE_PRECISION,MPI_MAX,MPI_COMM_WORLD,ierr)
      calc%dt                = dt_glob
      calc%vmax              = vmax_glob
      calc%msh%nb_level_cell = int(xb_level_cell_glob)
    #endif

    ! Echange des donnees entre les sous-domaines
      DO ii=1,calc%msh%nb_dom

    ! Remplissage de buffer_send
          IF (associated(calc%msh%list_send(ii)%L)) THEN
              DO jj=1,size(calc%msh%list_send(ii)%L)
                  kc=calc%msh%list_send(ii)%L(jj)
                  buffer_send(jj)=calc%msh%list_cell(kc)%w
              END DO

              nbs=size(calc%msh%list_send(ii)%L)
              nbr=size(calc%msh%list_recv(ii)%L)

    #ifdef _MPI
              CALL MPI_SENDRECV(buffer_send,(5*nvarmax+4)*nbs,           &
                   MPI_DOUBLE_PRECISION,ii-1,calc%ipas,         &
                   buffer_recv,(5*nvarmax+4)*nbr,                        &
                   MPI_DOUBLE_PRECISION,ii-1,calc%ipas,         &
                   MPI_COMM_WORLD,istat,ierr)
    #endif

    ! Distribution de buffer_recv dans les celllules

              DO jj=1,size(calc%msh%list_recv(ii)%L)
                 kc=calc%msh%list_recv(ii)%L(jj)
                 calc%msh%list_cell(kc)%w=buffer_recv(jj)  ! version visqueuse
              END DO

          END IF

      END DO

      deallocate(buffer_send)
      deallocate(buffer_recv)

    !===========================   FIN DE LA ROUTINE    ====================
    END SUBROUTINE synchro_mpi