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

Merge revisions 3427:3600 of trunk into branch Ocean_skin

Location:
LMDZ6/branches/Ocean_skin
Files:
10 edited
1 copied

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/Ocean_skin

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

    r2395 r3605  
    3030!$OMP THREADPRIVATE(cell_area)
    3131
     32  INTEGER,SAVE,ALLOCATABLE :: ind_cell_glo(:)      ! global indice of a local cell
     33!$OMP THREADPRIVATE(ind_cell_glo)
    3234
    3335CONTAINS
     
    3537  SUBROUTINE init_geometry(klon,longitude_,latitude_, &
    3638                           boundslon_,boundslat_, &
    37                            cell_area_,dx_,dy_)
     39                           cell_area_,ind_cell_glo_,dx_,dy_)
    3840  USE mod_grid_phy_lmdz, ONLY: nvertex
    3941  USE nrtype, ONLY : PI
     
    4547    REAL,INTENT(IN) :: boundslat_(klon,nvertex)
    4648    REAL,INTENT(IN) :: cell_area_(klon)
     49    INTEGER,OPTIONAL,INTENT(IN) :: ind_cell_glo_(klon)
    4750    REAL,OPTIONAL,INTENT(IN) :: dx_(klon)
    4851    REAL,OPTIONAL,INTENT(IN) :: dy_(klon)
     
    5558    ALLOCATE(boundslat(klon,nvertex))
    5659    ALLOCATE(cell_area(klon))
     60    IF (PRESENT(ind_cell_glo_)) ALLOCATE(ind_cell_glo(klon))
    5761    IF (PRESENT(dx_)) ALLOCATE(dx(klon))
    5862    IF (PRESENT(dy_))ALLOCATE(dy(klon))
     
    6569    boundslat(:,:) = boundslat_(:,:)
    6670    cell_area(:) = cell_area_(:)
     71    IF (PRESENT(ind_cell_glo_)) ind_cell_glo(:) = ind_cell_glo_(:)
    6772    IF (PRESENT(dx_)) dx(:) = dx_(:)
    6873    IF (PRESENT(dy_)) dy(:) = dy_(:)
  • LMDZ6/branches/Ocean_skin/libf/phy_common/mod_phys_lmdz_mpi_data.F90

    r2429 r3605  
    33!
    44MODULE mod_phys_lmdz_mpi_data
    5 !  USE mod_const_mpi
    65 
    76  INTEGER,SAVE :: ii_begin
     
    3635  INTEGER,SAVE :: mpi_size
    3736  INTEGER,SAVE :: mpi_master
    38 !  INTEGER,SAVE :: mpi_root
    3937  LOGICAL,SAVE :: is_mpi_root
    4038  LOGICAL,SAVE :: is_using_mpi
    4139 
    4240 
    43 !  LOGICAL,SAVE :: is_north_pole
    44 !  LOGICAL,SAVE :: is_south_pole
    4541  LOGICAL,SAVE :: is_north_pole_dyn
    4642  LOGICAL,SAVE :: is_south_pole_dyn
     
    5046CONTAINS
    5147 
    52 !  SUBROUTINE Init_phys_lmdz_mpi_data(iim,jjp1,nb_proc,distrib)
    5348  SUBROUTINE init_phys_lmdz_mpi_data(nbp, nbp_lon, nbp_lat, communicator)
    54 !  USE mod_const_mpi, ONLY : COMM_LMDZ
    5549  IMPLICIT NONE
    5650#ifdef CPP_MPI
    5751    INCLUDE 'mpif.h'
    5852#endif
    59     INTEGER,INTENT(in) :: nbp
    60     INTEGER,INTENT(in) :: nbp_lon
    61     INTEGER,INTENT(in) :: nbp_lat
    62     INTEGER,INTENT(in) :: communicator
     53    INTEGER,INTENT(IN) :: nbp
     54    INTEGER,INTENT(IN) :: nbp_lon
     55    INTEGER,INTENT(IN) :: nbp_lat
     56    INTEGER,INTENT(IN) :: communicator
    6357   
    6458    INTEGER,ALLOCATABLE :: distrib(:)
     
    189183
    190184  SUBROUTINE print_module_data
    191 !  USE print_control_mod, ONLY: lunout
     185  USE print_control_mod, ONLY: lunout
    192186  IMPLICIT NONE
    193   INCLUDE "iniprint.h"
     187!  INCLUDE "iniprint.h"
    194188 
    195189    WRITE(lunout,*) 'ii_begin =', ii_begin
  • LMDZ6/branches/Ocean_skin/libf/phy_common/mod_phys_lmdz_mpi_transfert.F90

    r2429 r3605  
    4242  END INTERFACE
    4343
     44  INTERFACE reduce_min_mpi
     45    MODULE PROCEDURE reduce_min_mpi_i,reduce_min_mpi_i1,reduce_min_mpi_i2,reduce_min_mpi_i3,reduce_min_mpi_i4, &
     46                     reduce_min_mpi_r,reduce_min_mpi_r1,reduce_min_mpi_r2,reduce_min_mpi_r3,reduce_min_mpi_r4
     47  END INTERFACE
     48
    4449 INTERFACE grid1dTo2d_mpi
    4550    MODULE PROCEDURE grid1dTo2d_mpi_i,grid1dTo2d_mpi_i1,grid1dTo2d_mpi_i2,grid1dTo2d_mpi_i3, &
     
    986991  END SUBROUTINE reduce_sum_mpi_r4
    987992 
     993
     994!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     995!! Definition des reduce_min   --> 4D   !!
     996!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     997
     998  SUBROUTINE reduce_min_mpi_i(VarIn, VarOut)
     999    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
     1000    IMPLICIT NONE
     1001 
     1002    INTEGER,INTENT(IN)  :: VarIn
     1003    INTEGER,INTENT(OUT) :: VarOut
     1004    INTEGER             :: VarIn_tmp(1)
     1005    INTEGER             :: VarOut_tmp(1)
     1006   
     1007    VarIn_tmp(1)=VarIn   
     1008    CALL reduce_min_mpi_igen(VarIn_tmp,Varout_tmp,1)
     1009    VarOut=VarOut_tmp(1)
     1010   
     1011  END SUBROUTINE reduce_min_mpi_i
     1012
     1013  SUBROUTINE reduce_min_mpi_i1(VarIn, VarOut)
     1014    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
     1015    IMPLICIT NONE
     1016 
     1017    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
     1018    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
     1019   
     1020    CALL reduce_min_mpi_igen(VarIn,Varout,SIZE(VarIn))
     1021 
     1022  END SUBROUTINE reduce_min_mpi_i1
     1023
     1024  SUBROUTINE reduce_min_mpi_i2(VarIn, VarOut)
     1025    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
     1026    IMPLICIT NONE
     1027 
     1028    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
     1029    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
     1030   
     1031    CALL reduce_min_mpi_igen(VarIn,Varout,SIZE(VarIn))
     1032 
     1033  END SUBROUTINE reduce_min_mpi_i2
     1034
     1035  SUBROUTINE reduce_min_mpi_i3(VarIn, VarOut)
     1036    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
     1037    IMPLICIT NONE
     1038 
     1039    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
     1040    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
     1041   
     1042    CALL reduce_min_mpi_igen(VarIn,Varout,SIZE(VarIn))
     1043 
     1044  END SUBROUTINE reduce_min_mpi_i3
     1045
     1046  SUBROUTINE reduce_min_mpi_i4(VarIn, VarOut)
     1047    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
     1048    IMPLICIT NONE
     1049 
     1050    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
     1051    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
     1052   
     1053    CALL reduce_min_mpi_igen(VarIn,Varout,SIZE(VarIn))
     1054 
     1055  END SUBROUTINE reduce_min_mpi_i4                 
     1056 
     1057 
     1058  SUBROUTINE reduce_min_mpi_r(VarIn, VarOut)
     1059    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
     1060    IMPLICIT NONE
     1061 
     1062    REAL,INTENT(IN)  :: VarIn
     1063    REAL,INTENT(OUT) :: VarOut
     1064    REAL             :: VarIn_tmp(1)
     1065    REAL             :: VarOut_tmp(1)
     1066   
     1067    VarIn_tmp(1)=VarIn   
     1068    CALL reduce_min_mpi_rgen(VarIn_tmp,Varout_tmp,1)
     1069    VarOut=VarOut_tmp(1)
     1070 
     1071  END SUBROUTINE reduce_min_mpi_r
     1072
     1073  SUBROUTINE reduce_min_mpi_r1(VarIn, VarOut)
     1074    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
     1075    IMPLICIT NONE
     1076 
     1077    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
     1078    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
     1079   
     1080    CALL reduce_min_mpi_rgen(VarIn,Varout,SIZE(VarIn))
     1081     
     1082  END SUBROUTINE reduce_min_mpi_r1
     1083
     1084  SUBROUTINE reduce_min_mpi_r2(VarIn, VarOut)
     1085    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
     1086    IMPLICIT NONE
     1087 
     1088    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
     1089    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
     1090   
     1091    CALL reduce_min_mpi_rgen(VarIn,Varout,SIZE(VarIn))
     1092 
     1093  END SUBROUTINE reduce_min_mpi_r2
     1094
     1095  SUBROUTINE reduce_min_mpi_r3(VarIn, VarOut)
     1096    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
     1097    IMPLICIT NONE
     1098 
     1099    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
     1100    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
     1101   
     1102    CALL reduce_min_mpi_rgen(VarIn,Varout,SIZE(VarIn))
     1103 
     1104  END SUBROUTINE reduce_min_mpi_r3
     1105
     1106  SUBROUTINE reduce_min_mpi_r4(VarIn, VarOut)
     1107    USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
     1108    IMPLICIT NONE
     1109 
     1110    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
     1111    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
     1112   
     1113    CALL reduce_min_mpi_rgen(VarIn,Varout,SIZE(VarIn))
     1114 
     1115  END SUBROUTINE reduce_min_mpi_r4
     1116
     1117
    9881118
    9891119
     
    16781808
    16791809
     1810  SUBROUTINE reduce_min_mpi_igen(VarIn,VarOut,nb)
     1811    USE mod_phys_lmdz_mpi_data
     1812    USE mod_grid_phy_lmdz
     1813    IMPLICIT NONE
     1814   
     1815#ifdef CPP_MPI
     1816    INCLUDE 'mpif.h'
     1817#endif
     1818   
     1819    INTEGER,INTENT(IN) :: nb
     1820    INTEGER,DIMENSION(nb),INTENT(IN) :: VarIn
     1821    INTEGER,DIMENSION(nb),INTENT(OUT) :: VarOut   
     1822    INTEGER :: ierr
     1823   
     1824    IF (.not.is_using_mpi) THEN
     1825      VarOut(:)=VarIn(:)
     1826      RETURN
     1827    ENDIF
     1828
     1829
     1830#ifdef CPP_MPI
     1831    CALL MPI_REDUCE(VarIn,VarOut,nb,MPI_INTEGER,MPI_MIN,mpi_master,COMM_LMDZ_PHY,ierr)
     1832#endif
     1833           
     1834  END SUBROUTINE reduce_min_mpi_igen
     1835 
     1836  SUBROUTINE reduce_min_mpi_rgen(VarIn,VarOut,nb)
     1837    USE mod_phys_lmdz_mpi_data
     1838    USE mod_grid_phy_lmdz
     1839
     1840    IMPLICIT NONE
     1841
     1842#ifdef CPP_MPI
     1843    INCLUDE 'mpif.h'
     1844#endif
     1845   
     1846    INTEGER,INTENT(IN) :: nb
     1847    REAL,DIMENSION(nb),INTENT(IN) :: VarIn
     1848    REAL,DIMENSION(nb),INTENT(OUT) :: VarOut   
     1849    INTEGER :: ierr
     1850 
     1851    IF (.not.is_using_mpi) THEN
     1852      VarOut(:)=VarIn(:)
     1853      RETURN
     1854    ENDIF
     1855   
     1856#ifdef CPP_MPI
     1857    CALL MPI_REDUCE(VarIn,VarOut,nb,MPI_REAL_LMDZ,MPI_MIN,mpi_master,COMM_LMDZ_PHY,ierr)
     1858#endif
     1859       
     1860  END SUBROUTINE reduce_min_mpi_rgen
     1861
     1862
     1863
     1864
     1865
     1866
     1867
    16801868  SUBROUTINE grid1dTo2d_mpi_igen(VarIn,VarOut,dimsize)
    16811869    USE mod_phys_lmdz_mpi_data
  • LMDZ6/branches/Ocean_skin/libf/phy_common/mod_phys_lmdz_omp_data.F90

    r2429 r3605  
    77  INTEGER,SAVE :: omp_rank
    88  LOGICAL,SAVE :: is_omp_root
     9  LOGICAL,SAVE :: is_omp_master  ! alias of is_omp_root
    910  LOGICAL,SAVE :: is_using_omp
    1011  LOGICAL,SAVE :: is_north_pole_phy, is_south_pole_phy
     
    1718  INTEGER,SAVE :: klon_omp_begin
    1819  INTEGER,SAVE :: klon_omp_end
    19 !$OMP  THREADPRIVATE(omp_rank,klon_omp,is_omp_root,klon_omp_begin,klon_omp_end)
     20!$OMP  THREADPRIVATE(omp_rank,klon_omp,is_omp_root,is_omp_master,klon_omp_begin,klon_omp_end)
    2021!$OMP  THREADPRIVATE(is_north_pole_phy, is_south_pole_phy)
    2122
     
    6061   ELSE
    6162     abort_message = 'ANORMAL : OMP_MASTER /= 0'
    62      CALL abort_gcm (modname,abort_message,1)
     63     CALL abort_physic (modname,abort_message,1)
    6364   ENDIF
    6465!$OMP END MASTER
    65 
     66   is_omp_master=is_omp_root
    6667
    6768!$OMP MASTER
     
    106107
    107108  SUBROUTINE Print_module_data
     109  USE print_control_mod, ONLY: lunout
    108110  IMPLICIT NONE
    109   INCLUDE "iniprint.h"
     111!  INCLUDE "iniprint.h"
    110112
    111113!$OMP CRITICAL 
  • 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
  • LMDZ6/branches/Ocean_skin/libf/phy_common/mod_phys_lmdz_para.F90

    r2429 r3605  
    3333       is_master=.FALSE.
    3434     ENDIF
    35      CALL Test_transfert
     35!ym     CALL Test_transfert
    3636!$OMP END PARALLEL   
    3737     IF (is_using_mpi .OR. is_using_omp) THEN
     
    4949  SUBROUTINE Test_transfert
    5050  USE mod_grid_phy_lmdz
     51  USE print_control_mod, ONLY: lunout
    5152  IMPLICIT NONE
    52     INCLUDE "iniprint.h"
     53!    INCLUDE "iniprint.h"
    5354 
    5455    REAL :: Test_Field1d_glo(klon_glo,nbp_lev)
  • LMDZ6/branches/Ocean_skin/libf/phy_common/mod_phys_lmdz_transfert_para.F90

    r2326 r3605  
    11!
    2 !$Header$
     2!$Id$
    33!
    44MODULE mod_phys_lmdz_transfert_para
     
    4646  END INTERFACE
    4747
     48  INTERFACE reduce_min
     49    MODULE PROCEDURE reduce_min_i,reduce_min_i1,reduce_min_i2,reduce_min_i3,reduce_min_i4, &
     50                     reduce_min_r,reduce_min_r1,reduce_min_r2,reduce_min_r3,reduce_min_r4
     51  END INTERFACE
    4852   
    4953CONTAINS
     
    12711275  END SUBROUTINE reduce_sum_r4 
    12721276
     1277
     1278!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     1279!! Definition des reduce_min   --> 4D   !!
     1280!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     1281
     1282! Les entiers
     1283
     1284  SUBROUTINE reduce_min_i(VarIn, VarOut)
     1285    IMPLICIT NONE
     1286 
     1287    INTEGER,INTENT(IN)  :: VarIn
     1288    INTEGER,INTENT(OUT) :: VarOut
     1289   
     1290    INTEGER             :: Var_tmp
     1291           
     1292    CALL reduce_min_omp(VarIn,Var_tmp)
     1293!$OMP MASTER     
     1294    CALL reduce_min_mpi(Var_tmp,VarOut)
     1295!$OMP END MASTER
     1296 
     1297  END SUBROUTINE reduce_min_i 
     1298
     1299
     1300  SUBROUTINE reduce_min_i1(VarIn, VarOut)
     1301    IMPLICIT NONE
     1302 
     1303    INTEGER,INTENT(IN),DIMENSION(:)  :: VarIn
     1304    INTEGER,INTENT(OUT),DIMENSION(:) :: VarOut
     1305   
     1306    INTEGER,DIMENSION(SIZE(VarIn))   :: Var_tmp
     1307           
     1308    CALL reduce_min_omp(VarIn,Var_tmp)
     1309!$OMP MASTER     
     1310    CALL reduce_min_mpi(Var_tmp,VarOut)
     1311!$OMP END MASTER
     1312 
     1313  END SUBROUTINE reduce_min_i1 
     1314
     1315
     1316  SUBROUTINE reduce_min_i2(VarIn, VarOut)
     1317    IMPLICIT NONE
     1318 
     1319    INTEGER,INTENT(IN),DIMENSION(:,:)  :: VarIn
     1320    INTEGER,INTENT(OUT),DIMENSION(:,:) :: VarOut
     1321   
     1322    INTEGER,DIMENSION(SIZE(VarIn,1),SIZE(VarIn,2)) :: Var_tmp
     1323           
     1324    CALL reduce_min_omp(VarIn,Var_tmp)
     1325!$OMP MASTER     
     1326    CALL reduce_min_mpi(Var_tmp,VarOut)
     1327!$OMP END MASTER
     1328 
     1329  END SUBROUTINE reduce_min_i2 
     1330 
     1331
     1332  SUBROUTINE reduce_min_i3(VarIn, VarOut)
     1333    IMPLICIT NONE
     1334 
     1335    INTEGER,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
     1336    INTEGER,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
     1337   
     1338    INTEGER,DIMENSION(SIZE(VarIn,1),SIZE(VarIn,2),SIZE(VarIn,3))  :: Var_tmp
     1339           
     1340    CALL reduce_min_omp(VarIn,Var_tmp)
     1341!$OMP MASTER     
     1342    CALL reduce_min_mpi(Var_tmp,VarOut)
     1343!$OMP END MASTER
     1344 
     1345  END SUBROUTINE reduce_min_i3 
     1346
     1347
     1348  SUBROUTINE reduce_min_i4(VarIn, VarOut)
     1349    IMPLICIT NONE
     1350 
     1351    INTEGER,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
     1352    INTEGER,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
     1353   
     1354    INTEGER,DIMENSION(SIZE(VarIn,1),SIZE(VarIn,2),SIZE(VarIn,3),SIZE(VarIn,4))  :: Var_tmp
     1355           
     1356    CALL reduce_min_omp(VarIn,Var_tmp)
     1357!$OMP MASTER     
     1358    CALL reduce_min_mpi(Var_tmp,VarOut)
     1359!$OMP END MASTER
     1360 
     1361  END SUBROUTINE reduce_min_i4 
     1362
     1363
     1364! Les reels
     1365
     1366  SUBROUTINE reduce_min_r(VarIn, VarOut)
     1367    IMPLICIT NONE
     1368 
     1369    REAL,INTENT(IN)  :: VarIn
     1370    REAL,INTENT(OUT) :: VarOut
     1371   
     1372    REAL             :: Var_tmp
     1373           
     1374    CALL reduce_min_omp(VarIn,Var_tmp)
     1375!$OMP MASTER     
     1376    CALL reduce_min_mpi(Var_tmp,VarOut)
     1377!$OMP END MASTER
     1378 
     1379  END SUBROUTINE reduce_min_r 
     1380
     1381
     1382  SUBROUTINE reduce_min_r1(VarIn, VarOut)
     1383    IMPLICIT NONE
     1384 
     1385    REAL,INTENT(IN),DIMENSION(:)  :: VarIn
     1386    REAL,INTENT(OUT),DIMENSION(:) :: VarOut
     1387   
     1388    REAL,DIMENSION(SIZE(VarIn))   :: Var_tmp
     1389           
     1390    CALL reduce_min_omp(VarIn,Var_tmp)
     1391!$OMP MASTER     
     1392    CALL reduce_min_mpi(Var_tmp,VarOut)
     1393!$OMP END MASTER
     1394 
     1395  END SUBROUTINE reduce_min_r1 
     1396
     1397
     1398  SUBROUTINE reduce_min_r2(VarIn, VarOut)
     1399    IMPLICIT NONE
     1400 
     1401    REAL,INTENT(IN),DIMENSION(:,:)  :: VarIn
     1402    REAL,INTENT(OUT),DIMENSION(:,:) :: VarOut
     1403   
     1404    REAL,DIMENSION(SIZE(VarIn,1),SIZE(VarIn,2)) :: Var_tmp
     1405           
     1406    CALL reduce_min_omp(VarIn,Var_tmp)
     1407!$OMP MASTER     
     1408    CALL reduce_min_mpi(Var_tmp,VarOut)
     1409!$OMP END MASTER
     1410 
     1411  END SUBROUTINE reduce_min_r2 
     1412 
     1413
     1414  SUBROUTINE reduce_min_r3(VarIn, VarOut)
     1415    IMPLICIT NONE
     1416 
     1417    REAL,INTENT(IN),DIMENSION(:,:,:)  :: VarIn
     1418    REAL,INTENT(OUT),DIMENSION(:,:,:) :: VarOut
     1419   
     1420    REAL,DIMENSION(SIZE(VarIn,1),SIZE(VarIn,2),SIZE(VarIn,3))  :: Var_tmp
     1421           
     1422    CALL reduce_min_omp(VarIn,Var_tmp)
     1423!$OMP MASTER     
     1424    CALL reduce_min_mpi(Var_tmp,VarOut)
     1425!$OMP END MASTER
     1426 
     1427  END SUBROUTINE reduce_min_r3 
     1428
     1429
     1430  SUBROUTINE reduce_min_r4(VarIn, VarOut)
     1431    IMPLICIT NONE
     1432 
     1433    REAL,INTENT(IN),DIMENSION(:,:,:,:)  :: VarIn
     1434    REAL,INTENT(OUT),DIMENSION(:,:,:,:) :: VarOut
     1435   
     1436    REAL,DIMENSION(SIZE(VarIn,1),SIZE(VarIn,2),SIZE(VarIn,3),SIZE(VarIn,4))  :: Var_tmp
     1437           
     1438    CALL reduce_min_omp(VarIn,Var_tmp)
     1439!$OMP MASTER     
     1440    CALL reduce_min_mpi(Var_tmp,VarOut)
     1441!$OMP END MASTER
     1442 
     1443  END SUBROUTINE reduce_min_r4 
     1444
     1445
    12731446   
    12741447END MODULE mod_phys_lmdz_transfert_para
  • LMDZ6/branches/Ocean_skin/libf/phy_common/physics_distribution_mod.F90

    r2351 r3605  
    1010                                       nbp, nbp_lon, nbp_lat, nbp_lev, &
    1111                                       communicator)
    12   USE mod_phys_lmdz_para, ONLY: init_phys_lmdz_para
     12  USE mod_phys_lmdz_para, ONLY: init_phys_lmdz_para, klon_omp
    1313  USE mod_grid_phy_lmdz, ONLY: init_grid_phy_lmdz
     14  USE dimphy, ONLY : Init_dimphy
     15  USE infotrac_phy, ONLY : type_trac
     16#ifdef REPROBUS
     17  USE CHEM_REP, ONLY : Init_chem_rep_phys
     18#endif
     19
    1420  IMPLICIT NONE
    1521    INTEGER,INTENT(IN) :: grid_type
     
    2430    CALL init_grid_phy_lmdz(grid_type,nvertex, nbp_lon,nbp_lat,nbp_lev)
    2531    CALL init_phys_lmdz_para(nbp,nbp_lon, nbp_lat, communicator)
     32!$OMP PARALLEL
     33    CALL init_dimphy(klon_omp,nbp_lev)
     34
     35! Initialization of Reprobus
     36    IF (type_trac == 'repr') THEN
     37#ifdef REPROBUS
     38       CALL Init_chem_rep_phys(klon_omp,nbp_lev)
     39#endif
     40    END IF
     41
     42!$OMP END PARALLEL
    2643
    2744  END SUBROUTINE init_physics_distribution 
  • LMDZ6/branches/Ocean_skin/libf/phy_common/print_control_mod.F90

    r2326 r3605  
    77!$OMP THREADPRIVATE(lunout,prt_level,debug)
    88
     9  ! NB: Module variable Initializations done by set_print_control
     10  !     routine from init_print_control_mod to avoid circular
     11  !     module dependencies
     12
    913CONTAINS
    1014
    11   SUBROUTINE init_print_control
    12   USE ioipsl_getin_p_mod, ONLY : getin_p
    13   USE mod_phys_lmdz_para, ONLY: is_omp_root, is_master
     15  SUBROUTINE set_print_control(lunout_,prt_level_,debug_)
    1416  IMPLICIT NONE
    15 
    16     LOGICAL :: opened
    17     INTEGER :: number
     17    INTEGER :: lunout_
     18    INTEGER :: prt_level_
     19    LOGICAL :: debug_
     20     
     21    lunout = lunout_
     22    prt_level = prt_level_
     23    debug = debug_
    1824   
    19     !Config  Key  = prt_level
    20     !Config  Desc = niveau d'impressions de débogage
    21     !Config  Def  = 0
    22     !Config  Help = Niveau d'impression pour le débogage
    23     !Config         (0 = minimum d'impression)
    24     prt_level = 0
    25     CALL getin_p('prt_level',prt_level)
    26 
    27     !Config  Key  = lunout
    28     !Config  Desc = unite de fichier pour les impressions
    29     !Config  Def  = 6
    30     !Config  Help = unite de fichier pour les impressions
    31     !Config         (defaut sortie standard = 6)
    32     lunout=6
    33     CALL getin_p('lunout', lunout)
    34 
    35     IF (is_omp_root) THEN
    36       IF (lunout /= 5 .and. lunout /= 6) THEN
    37          INQUIRE(FILE='lmdz.out_0000',OPENED=opened,NUMBER=number)
    38          IF (opened) THEN
    39            lunout=number
    40          ELSE
    41            OPEN(UNIT=lunout,FILE='lmdz.out_0000',ACTION='write',  &
    42                 STATUS='unknown',FORM='formatted')
    43          ENDIF
    44       ENDIF
    45     ENDIF
    46 
    47     !Config  Key  = debug
    48     !Config  Desc = mode debogage
    49     !Config  Def  = false
    50     !Config  Help = positionne le mode debogage
    51 
    52     debug = .FALSE.
    53     CALL getin_p('debug',debug)
    54    
    55     IF (is_master) THEN
    56       WRITE(lunout,*)"init_print_control: prt_level=",prt_level
    57       WRITE(lunout,*)"init_print_control: lunout=",lunout
    58       WRITE(lunout,*)"init_print_control: debug=",debug     
    59     ENDIF
    60    
    61   END SUBROUTINE init_print_control 
     25  END SUBROUTINE set_print_control
    6226
    6327END MODULE print_control_mod
Note: See TracChangeset for help on using the changeset viewer.