Ignore:
Timestamp:
Aug 12, 2025, 12:18:23 PM (3 days ago)
Author:
emillour
Message:

Common physics:
Update, following what is done for the Earth LMDZ6 GCM, of the
way some OpenMP transfers are done (less memory-hungry).
EM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.COMMON/libf/phy_common/mod_phys_lmdz_omp_transfert.F90

    r3832 r3888  
    112112   
    113113!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    114 !! Definition des Broadcast --> 4D   !!
     114!! Definition of Broadcasts --> 4D   !!
    115115!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    116116
    117 !! -- Les chaine de charactère -- !!
     117!! -- For strings -- !!
    118118
    119119  SUBROUTINE bcast_omp_c(var)
     
    125125  END SUBROUTINE bcast_omp_c
    126126
    127 !! -- Les entiers -- !!
     127!! -- For integers -- !!
    128128 
    129129  SUBROUTINE bcast_omp_i(var)
     
    200200
    201201
    202 !! -- Les reels -- !!
     202!! -- For reals -- !!
    203203
    204204  SUBROUTINE bcast_omp_r(var)
     
    275275
    276276 
    277 !! -- Les booleans -- !!
     277!! -- For logicals -- !!
    278278
    279279  SUBROUTINE bcast_omp_l(var)
     
    351351
    352352!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    353 !! Definition des Scatter   --> 4D   !!
     353!! Definition for Scatter   --> 4D   !!
    354354!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    355355
     
    557557
    558558    CALL Check_buffer_r(size(VarOut))   
    559     CALL gather_omp_rgen(VarIn,Varout,1,buffer_r)
     559    CALL gather_omp_rgen(VarIn,Varout,1)
    560560   
    561561  END SUBROUTINE gather_omp_r
     
    569569
    570570    CALL Check_buffer_r(size(VarOut))   
    571     CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2),buffer_r)
     571    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2))
    572572       
    573573  END SUBROUTINE gather_omp_r1
     
    581581   
    582582    CALL Check_buffer_r(size(VarOut))   
    583     CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3),buffer_r)
     583    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3))
    584584   
    585585  END SUBROUTINE gather_omp_r2
     
    593593
    594594    CALL Check_buffer_r(size(VarOut))       
    595     CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4),buffer_r)
     595    CALL gather_omp_rgen(VarIn,Varout,Size(VarIn,2)*Size(VarIn,3)*Size(VarIn,4))
    596596   
    597597  END SUBROUTINE gather_omp_r3
     
    774774
    775775!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    776 !    LES ROUTINES GENERIQUES    !
     776!    GENERIC ROUTINES           !
    777777!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    778778
     
    999999
    10001000
    1001   SUBROUTINE gather_omp_rgen(VarIn,VarOut,dimsize,Buff)
     1001  SUBROUTINE gather_omp_rgen(VarIn,VarOut,dimsize)
    10021002  USE mod_phys_lmdz_omp_data
    10031003  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
     
    10061006    INTEGER,INTENT(IN) :: dimsize
    10071007    REAL,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
    1008     REAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
    1009     REAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
     1008    REAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize),TARGET :: VarOut
     1009
     1010    REAL, POINTER, SAVE :: Varout_ptr(:,:) ! Shared between threads NOT THREADPRIVATE
     1011
     1012    INTEGER :: i,ij
     1013   
     1014    !$OMP MASTER
     1015    Varout_ptr => VarOut
     1016    !$OMP END MASTER
     1017    !$OMP BARRIER
     1018
     1019    DO i=1,dimsize
     1020      DO ij=1,klon_omp
     1021        Varout_ptr(klon_omp_begin-1+ij,i)=VarIn(ij,i)
     1022      ENDDO
     1023    ENDDO 
     1024    !$OMP BARRIER
     1025
     1026  END SUBROUTINE gather_omp_rgen
     1027
     1028
     1029  SUBROUTINE gather_omp_lgen(VarIn,VarOut,dimsize,Buff)
     1030  USE mod_phys_lmdz_omp_data
     1031  USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
     1032  IMPLICIT NONE
     1033
     1034    INTEGER,INTENT(IN) :: dimsize
     1035    LOGICAL,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
     1036    LOGICAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
     1037    LOGICAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
    10101038
    10111039    INTEGER :: i,ij
     
    10281056  !$OMP BARRIER
    10291057
    1030   END SUBROUTINE gather_omp_rgen
    1031 
    1032 
    1033   SUBROUTINE gather_omp_lgen(VarIn,VarOut,dimsize,Buff)
    1034   USE mod_phys_lmdz_omp_data
    1035   USE mod_phys_lmdz_mpi_data, ONLY : klon_mpi
    1036   IMPLICIT NONE
    1037 
    1038     INTEGER,INTENT(IN) :: dimsize
    1039     LOGICAL,INTENT(IN),DIMENSION(klon_omp,dimsize) :: VarIn
    1040     LOGICAL,INTENT(OUT),DIMENSION(klon_mpi,dimsize) :: VarOut
    1041     LOGICAL,INTENT(INOUT),DIMENSION(klon_mpi,dimsize) :: Buff
    1042 
    1043     INTEGER :: i,ij
    1044    
    1045     DO i=1,dimsize
    1046       DO ij=1,klon_omp
    1047         Buff(klon_omp_begin-1+ij,i)=VarIn(ij,i)
    1048       ENDDO
    1049     ENDDO
    1050   !$OMP BARRIER 
    1051 
    1052 
    1053   !$OMP MASTER
    1054     DO i=1,dimsize
    1055       DO ij=1,klon_mpi
    1056         VarOut(ij,i)=Buff(ij,i)
    1057       ENDDO
    1058     ENDDO 
    1059   !$OMP END MASTER
    1060   !$OMP BARRIER
    1061 
    10621058  END SUBROUTINE gather_omp_lgen
    10631059
Note: See TracChangeset for help on using the changeset viewer.