MODULE mod_inca_para USE inca_data_para USE mod_inca_transfert_para USE PRINT_INCA USE MOD_GRID_INCA INTEGER,SAVE :: plon_loc LOGICAL,SAVE :: is_sequential LOGICAL,SAVE :: is_parallel !$OMP THREADPRIVATE(plon_loc) CONTAINS SUBROUTINE Init_mod_inca_para(iim,jjp1,llm,nb_proc,distrib,COMM_LMDZ) IMPLICIT NONE INTEGER,INTENT(in) :: iim INTEGER,INTENT(in) :: jjp1 INTEGER, INTENT(in) :: llm INTEGER,INTENT(in) :: nb_proc INTEGER,INTENT(in) :: distrib(0:nb_proc-1) INTEGER,INTENT(IN) :: COMM_LMDZ INTEGER :: OMP_GET_NUM_THREADS EXTERNAL OMP_GET_NUM_THREADS INTEGER :: OMP_GET_THREAD_NUM EXTERNAL OMP_GET_THREAD_NUM CALL Init_inca_mpi_data(iim,jjp1,nb_proc,distrib,COMM_LMDZ) !$OMP PARALLEL !$OMP BARRIER CALL Init_inca_omp_data(plon_mpi) plon_loc=plon_omp nbp_loc=plon_omp CALL INIT_PRINT_INCA() CALL Test_transfert !$OMP END PARALLEL IF (is_ok_mpi .OR. is_ok_omp) THEN is_sequential=.FALSE. is_parallel=.TRUE. ELSE is_sequential=.TRUE. is_parallel=.FALSE. ENDIF CALL Init_grid_inca(iim,jjp1,llm) END SUBROUTINE Init_mod_inca_para SUBROUTINE Test_transfert USE mod_grid_inca IMPLICIT NONE REAL :: Test_Field1d_glo(plon_glo,nbp_lev) REAL :: tmp1d_glo(plon_glo,nbp_lev) REAL :: Test_Field2d_glo(nbp_lon,nbp_lat,nbp_lev) REAL :: tmp2d_glo(nbp_lon,nbp_lat,nbp_lev) REAL :: Test_Field1d_loc(plon_loc,nbp_lev) REAL :: Test_Field2d_loc(nbp_lon,jj_nb,nbp_lev) REAL :: CheckSum INTEGER :: i,l Test_Field1d_glo = 0. Test_Field2d_glo = 0. Test_Field1d_loc = 0. Test_Field2d_loc = 0. IF (is_mpi_root) THEN !$OMP MASTER DO l=1,nbp_lev DO i=1,plon_glo Test_Field1d_glo(i,l)=1 ENDDO ENDDO !$OMP END MASTER ENDIF CALL Scatter(Test_Field1d_glo,Test_Field1d_loc) CALL Gather(Test_Field1d_loc,tmp1d_glo) IF (is_mpi_root) THEN !$OMP MASTER Checksum=sum(Test_Field1d_glo-tmp1d_glo) WRITE(lunout, *) "------> Checksum =",Checksum," MUST BE 0" !$OMP END MASTER ENDIF CALL grid1dTo2d_glo(Test_Field1d_glo,Test_Field2d_glo) CALL scatter2D(Test_Field2d_glo,Test_Field1d_loc) CALL gather2d(Test_Field1d_loc,Test_Field2d_glo) CALL grid2dTo1d_glo(Test_Field2d_glo,tmp1d_glo) IF (is_mpi_root) THEN !$OMP MASTER Checksum=sum(Test_Field1d_glo-tmp1d_glo) WRITE(lunout, *) "------> Checksum =",Checksum," MUST BE 0" !$OMP END MASTER ENDIF CALL bcast(Test_Field1d_glo) CALL reduce_sum(Test_Field1d_glo,tmp1d_glo) IF (is_mpi_root) THEN !$OMP MASTER Checksum=sum(Test_Field1d_glo*omp_size*mpi_size-tmp1d_glo) WRITE(lunout, *) "------> Checksum =",Checksum," MUST BE 0" !$OMP END MASTER ENDIF END SUBROUTINE Test_transfert END MODULE mod_inca_para