Ignore:
Timestamp:
Nov 21, 2019, 4:43:45 PM (4 years ago)
Author:
lguez
Message:

Merge revisions 3427:3600 of trunk into branch Ocean_skin

Location:
LMDZ6/branches/Ocean_skin
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/Ocean_skin

  • LMDZ6/branches/Ocean_skin/libf/phy_common/mod_phys_lmdz_omp_transfert.F90

    r2326 r3605  
    4747  END INTERFACE
    4848
    49 
    50   PUBLIC bcast_omp,scatter_omp,gather_omp,reduce_sum_omp, omp_barrier
     49  INTERFACE reduce_min_omp
     50    MODULE PROCEDURE reduce_min_omp_i,reduce_min_omp_i1,reduce_min_omp_i2,reduce_min_omp_i3,reduce_min_omp_i4, &
     51                     reduce_min_omp_r,reduce_min_omp_r1,reduce_min_omp_r2,reduce_min_omp_r3,reduce_min_omp_r4
     52  END INTERFACE
     53
     54
     55  PUBLIC bcast_omp,scatter_omp,gather_omp,reduce_sum_omp, reduce_min_omp, omp_barrier
    5156
    5257CONTAINS
     
    710715  END SUBROUTINE reduce_sum_omp_r4
    711716
     717
     718
     719  SUBROUTINE reduce_min_omp_i(VarIn, VarOut)
     720    IMPLICIT NONE
     721 
     722    INTEGER,INTENT(IN)  :: VarIn
     723    INTEGER,INTENT(OUT) :: VarOut
     724    INTEGER             :: VarIn_tmp(1)
     725    INTEGER             :: VarOut_tmp(1)
     726   
     727    VarIn_tmp(1)=VarIn
     728    CALL Check_buffer_i(1)   
     729    CALL reduce_min_omp_igen(VarIn_tmp,Varout_tmp,1,buffer_i)
     730    VarOut=VarOut_tmp(1)
     731   
     732  END SUBROUTINE reduce_min_omp_i
     733
     734  SUBROUTINE reduce_min_omp_i1(VarIn, VarOut)
     735    IMPLICIT NONE
     736 
     737    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
     738    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
     739   
     740    CALL Check_buffer_i(size(VarIn))   
     741    CALL reduce_min_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
     742   
     743  END SUBROUTINE reduce_min_omp_i1
     744 
     745 
     746  SUBROUTINE reduce_min_omp_i2(VarIn, VarOut)
     747    IMPLICIT NONE
     748 
     749    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
     750    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
     751
     752    CALL Check_buffer_i(size(VarIn))   
     753    CALL reduce_min_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
     754 
     755  END SUBROUTINE reduce_min_omp_i2
     756
     757
     758  SUBROUTINE reduce_min_omp_i3(VarIn, VarOut)
     759    IMPLICIT NONE
     760 
     761    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
     762    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
     763   
     764    CALL Check_buffer_i(size(VarIn))   
     765    CALL reduce_min_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
     766 
     767  END SUBROUTINE reduce_min_omp_i3
     768
     769
     770  SUBROUTINE reduce_min_omp_i4(VarIn, VarOut)
     771    IMPLICIT NONE
     772
     773    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
     774    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
     775 
     776    CALL Check_buffer_i(size(VarIn))   
     777    CALL reduce_min_omp_igen(VarIn,Varout,Size(VarIn),buffer_i)
     778 
     779  END SUBROUTINE reduce_min_omp_i4
     780
     781
     782  SUBROUTINE reduce_min_omp_r(VarIn, VarOut)
     783    IMPLICIT NONE
     784 
     785    REAL,INTENT(IN)  :: VarIn
     786    REAL,INTENT(OUT) :: VarOut
     787    REAL             :: VarIn_tmp(1)
     788    REAL             :: VarOut_tmp(1)
     789   
     790    VarIn_tmp(1)=VarIn
     791    CALL Check_buffer_r(1)   
     792    CALL reduce_min_omp_rgen(VarIn_tmp,Varout_tmp,1,buffer_r)
     793    VarOut=VarOut_tmp(1)
     794 
     795  END SUBROUTINE reduce_min_omp_r
     796
     797  SUBROUTINE reduce_min_omp_r1(VarIn, VarOut)
     798    IMPLICIT NONE
     799 
     800    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
     801    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
     802   
     803    CALL Check_buffer_r(size(VarIn))   
     804    CALL reduce_min_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
     805   
     806  END SUBROUTINE reduce_min_omp_r1
     807 
     808 
     809  SUBROUTINE reduce_min_omp_r2(VarIn, VarOut)
     810    IMPLICIT NONE
     811 
     812    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
     813    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
     814   
     815    CALL Check_buffer_r(size(VarIn))   
     816    CALL reduce_min_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
     817 
     818  END SUBROUTINE reduce_min_omp_r2
     819
     820
     821  SUBROUTINE reduce_min_omp_r3(VarIn, VarOut)
     822    IMPLICIT NONE
     823 
     824    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
     825    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
     826   
     827    CALL Check_buffer_r(size(VarIn))   
     828    CALL reduce_min_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
     829 
     830  END SUBROUTINE reduce_min_omp_r3
     831
     832
     833  SUBROUTINE reduce_min_omp_r4(VarIn, VarOut)
     834    IMPLICIT NONE
     835
     836    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
     837    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
     838 
     839    CALL Check_buffer_r(size(VarIn))   
     840    CALL reduce_min_omp_rgen(VarIn,Varout,Size(VarIn),buffer_r)
     841 
     842  END SUBROUTINE reduce_min_omp_r4
     843
     844
     845
     846
    712847!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    713848!    LES ROUTINES GENERIQUES    !
     
    10621197  END SUBROUTINE reduce_sum_omp_rgen
    10631198
     1199
     1200  SUBROUTINE reduce_min_omp_igen(VarIn,VarOut,dimsize,Buff)
     1201  IMPLICIT NONE
     1202
     1203    INTEGER,INTENT(IN) :: dimsize
     1204    INTEGER,INTENT(IN),DIMENSION(dimsize) :: VarIn
     1205    INTEGER,INTENT(OUT),DIMENSION(dimsize) :: VarOut
     1206    INTEGER,INTENT(INOUT),DIMENSION(dimsize) :: Buff
     1207
     1208    INTEGER :: i
     1209    INTEGER :: var
     1210
     1211  !$OMP MASTER
     1212    Buff(:)=HUGE(var)
     1213  !$OMP END MASTER
     1214  !$OMP BARRIER
     1215 
     1216  !$OMP CRITICAL     
     1217    DO i=1,dimsize
     1218      Buff(i)=MIN(Buff(i),VarIn(i))
     1219    ENDDO
     1220  !$OMP END CRITICAL
     1221  !$OMP BARRIER 
     1222 
     1223  !$OMP MASTER
     1224    DO i=1,dimsize
     1225      VarOut(i)=Buff(i)
     1226    ENDDO
     1227  !$OMP END MASTER
     1228  !$OMP BARRIER
     1229 
     1230  END SUBROUTINE reduce_min_omp_igen
     1231
     1232  SUBROUTINE reduce_min_omp_rgen(VarIn,VarOut,dimsize,Buff)
     1233  IMPLICIT NONE
     1234
     1235    INTEGER,INTENT(IN) :: dimsize
     1236    REAL,INTENT(IN),DIMENSION(dimsize) :: VarIn
     1237    REAL,INTENT(OUT),DIMENSION(dimsize) :: VarOut
     1238    REAL,INTENT(INOUT),DIMENSION(dimsize) :: Buff
     1239
     1240    INTEGER :: i
     1241    REAL :: var
     1242
     1243  !$OMP MASTER
     1244    Buff(:)=HUGE(var)
     1245  !$OMP END MASTER
     1246  !$OMP BARRIER
     1247 
     1248  !$OMP CRITICAL     
     1249    DO i=1,dimsize
     1250      Buff(i)=MIN(Buff(i),VarIn(i))
     1251    ENDDO
     1252  !$OMP END CRITICAL
     1253  !$OMP BARRIER 
     1254 
     1255  !$OMP MASTER
     1256    DO i=1,dimsize
     1257      VarOut(i)=Buff(i)
     1258    ENDDO
     1259  !$OMP END MASTER
     1260  !$OMP BARRIER
     1261 
     1262  END SUBROUTINE reduce_min_omp_rgen
     1263
     1264
    10641265END MODULE mod_phys_lmdz_omp_transfert
Note: See TracChangeset for help on using the changeset viewer.