Ignore:
Timestamp:
Jul 30, 2008, 5:50:03 PM (16 years ago)
Author:
Laurent Fairhead
Message:

Mise a jour de dyn3dpar par rapport a dyn3d, inclusion OpenMP et filtre FFT YM
LF

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ4/trunk/libf/dyn3dpar/parallel.F90

    r884 r985  
    1616    integer, allocatable, save, dimension(:) :: jj_nb_para
    1717    integer, save :: OMP_CHUNK
    18    
     18    integer, save :: omp_rank
     19    integer, save :: omp_size 
     20!$OMP THREADPRIVATE(omp_rank)
     21
    1922 contains
    2023 
     
    2730      integer :: type_size
    2831      integer, dimension(3) :: blocklen,type
    29      
    30      
     32      integer :: comp_id
     33#ifdef _OPENMP   
     34      INTEGER :: OMP_GET_NUM_THREADS
     35      EXTERNAL OMP_GET_NUM_THREADS
     36      INTEGER :: OMP_GET_THREAD_NUM
     37      EXTERNAL OMP_GET_THREAD_NUM
     38#endif 
    3139      include 'mpif.h'
    3240#include "dimensions.h"
     
    95103      print *,"ij_begin",ij_begin
    96104      print *,"ij_end",ij_end
    97    
     105
     106!$OMP PARALLEL
     107
     108#ifdef _OPENMP
     109!$OMP MASTER
     110        omp_size=OMP_GET_NUM_THREADS()
     111!$OMP END MASTER
     112        omp_rank=OMP_GET_THREAD_NUM()   
     113#else   
     114        omp_size=1
     115        omp_rank=0
     116#endif
     117!$OMP END PARALLEL         
    98118   
    99119    end subroutine init_parallel
     
    230250      REAL, dimension(:),allocatable :: Buffer_Recv_up,Buffer_Recv_down
    231251      INTEGER :: Buffer_size     
    232      
     252
     253!$OMP CRITICAL (MPI)     
    233254      call MPI_Barrier(COMM_LMDZ,ierr)
     255!$OMP END CRITICAL (MPI)
    234256      call VTb(VThallo)
    235257     
     
    266288        allocate(Buffer_Send_up(Buffer_size))
    267289        call PACK_Data(Field(ij_begin,1),ij,ll,down,Buffer_Send_up)
     290!$OMP CRITICAL (MPI)
    268291        call MPI_ISSEND(Buffer_send_up,Buffer_Size,MPI_REAL8,MPI_Rank-1,1,     &
    269292                        COMM_LMDZ,Request(NbRequest),ierr)
     293!$OMP END CRITICAL (MPI)
    270294      ENDIF
    271295 
     
    277301        call PACK_Data(Field(ij_end+1-up*iip1,1),ij,ll,up,Buffer_send_down)
    278302       
     303!$OMP CRITICAL (MPI)
    279304        call MPI_ISSEND(Buffer_send_down,Buffer_Size,MPI_REAL8,MPI_Rank+1,1,     &
    280305                        COMM_LMDZ,Request(NbRequest),ierr)
     306!$OMP END CRITICAL (MPI)
    281307      ENDIF
    282308   
     
    287313        allocate(Buffer_recv_up(Buffer_size))
    288314             
     315!$OMP CRITICAL (MPI)
    289316        call MPI_IRECV(Buffer_recv_up,Buffer_size,MPI_REAL8,MPI_Rank-1,1,  &
    290317                        COMM_LMDZ,Request(NbRequest),ierr)
     318!$OMP END CRITICAL (MPI)
    291319     
    292320       
     
    298326        allocate(Buffer_recv_down(Buffer_size))
    299327       
     328!$OMP CRITICAL (MPI)
    300329        call MPI_IRECV(Buffer_recv_down,Buffer_size,MPI_REAL8,MPI_Rank+1,1,     &
    301330                        COMM_LMDZ,Request(NbRequest),ierr)
     331!$OMP END CRITICAL (MPI)
    302332     
    303333       
     
    309339
    310340      call VTe(VThallo)
     341!$OMP CRITICAL (MPI)
    311342      call MPI_Barrier(COMM_LMDZ,ierr)
     343!$OMP END CRITICAL (MPI)
     344
    312345      RETURN
    313346     
    314347    end subroutine exchange_Hallo
    315348   
    316    
     349
    317350    subroutine Gather_Field(Field,ij,ll,rank)
    318351    implicit none
     
    342375      if (MPI_Rank==rank) then
    343376        allocate(Buffer_Recv(ij*ll))
     377
     378!CDIR NOVECTOR
    344379        do i=0,MPI_Size-1
    345          
     380           
    346381          if (ij==ip1jmp1) then
    347382            Recv_count(i)=(jj_end_para(i)-jj_begin_para(i)+1)*ll*iip1
     
    351386            stop 'erreur dans Gather_Field'
    352387          endif
    353          
     388                 
    354389          if (i==0) then
    355390            displ(i)=0
     
    361396       
    362397      endif
    363      
     398 
     399!$OMP CRITICAL (MPI)
    364400      call MPI_GATHERV(Buffer_send,(min(ij_end,ij)-ij_begin+1)*ll,MPI_REAL8,   &
    365401                        Buffer_Recv,Recv_count,displ,MPI_REAL8,rank,COMM_LMDZ,ierr)
     402!$OMP END CRITICAL (MPI)
    366403     
    367404      if (MPI_Rank==rank) then                 
     
    380417     
    381418      endif
    382       
     419     
    383420    end subroutine Gather_Field
    384    
     421
     422
    385423    subroutine AllGather_Field(Field,ij,ll)
    386424    implicit none
     
    394432     
    395433      call Gather_Field(Field,ij,ll,0)
     434!$OMP CRITICAL (MPI)
    396435      call MPI_BCAST(Field,ij*ll,MPI_REAL8,0,COMM_LMDZ,ierr)
     436!$OMP END CRITICAL (MPI)
    397437     
    398438    end subroutine AllGather_Field
     
    409449      INTEGER :: ierr
    410450     
     451!$OMP CRITICAL (MPI)
    411452      call MPI_BCAST(Field,ij*ll,MPI_REAL8,rank,COMM_LMDZ,ierr)
     453!$OMP END CRITICAL (MPI)
    412454     
    413455    end subroutine Broadcast_Field
Note: See TracChangeset for help on using the changeset viewer.