MODULE tropopause_m USE yomcst_mod_h IMPLICIT NONE PRIVATE PUBLIC :: dyn_tropopause CONTAINS !------------------------------------------------------------------------------- ! FUNCTION dyn_tropopause(t, ts, paprs, pplay, rot, itrop, thet0, pvor0) ! !------------------------------------------------------------------------------- USE assert_m, ONLY: assert USE assert_eq_m, ONLY: assert_eq USE dimphy, ONLY: klon, klev USE geometry_mod, ONLY: latitude_deg, longitude_deg USE vertical_layers_mod, ONLY: aps, bps, preff USE lmdz_reprobus_wrappers, ONLY: itroprep USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_REPROBUS USE print_control_mod, ONLY: lunout !------------------------------------------------------------------------------- ! Arguments: REAL :: dyn_tropopause(klon) !--- Pressure at tropopause REAL, INTENT(IN) :: t(:,:) !--- Cells-centers temperature REAL, INTENT(IN) :: ts(:) !--- Surface temperature REAL, INTENT(IN) :: paprs(:,:) !--- Cells-edges pressure REAL, INTENT(IN) :: pplay(:,:) !--- Cells-centers pressure REAL, INTENT(IN) :: rot(:,:) !--- Cells-centers relative vorticity INTEGER, INTENT(OUT), OPTIONAL :: itrop(klon) !--- Last tropospheric layer idx REAL, INTENT(IN), OPTIONAL :: thet0, pvor0 !------------------------------------------------------------------------------- ! Local variables: REAL, PARAMETER :: DynPTrMin =8.E+3 !--- Thresholds for minimum and maximum REAL, PARAMETER :: DynPTrMax =4.E+4 ! dynamical tropopause pressure (Pa). CHARACTER(LEN=80) :: sub INTEGER :: i, k, kb, kt, kp, ib, ie, nw REAL :: al, th0, pv0 REAL, DIMENSION(klon,klev) :: tpot_cen, tpot_edg, pvor_cen REAL, PARAMETER :: sg0=0.75 !--- Start level for PV=cte search loop INTEGER, PARAMETER :: nadj=3 !--- Adjacent levs nb for thresholds detection REAL, PARAMETER :: w(5)=[0.1,0.25,0.3,0.25,0.1] !--- Vertical smoothing INTEGER, SAVE :: k0 INTEGER :: savkt LOGICAL, SAVE :: first=.TRUE. !$OMP THREADPRIVATE(k0,first) !------------------------------------------------------------------------------- sub='dyn_tropopause' CALL assert(SIZE(t ,1)==klon, TRIM(sub)//" t klon") CALL assert(SIZE(t ,2)==klev, TRIM(sub)//" t klev") CALL assert(SIZE(ts,1)==klon, TRIM(sub)//" ts klon") CALL assert(SHAPE(paprs)==[klon,klev+1],TRIM(sub)//" paprs shape") CALL assert(SHAPE(pplay)==[klon,klev ],TRIM(sub)//" pplay shape") CALL assert(SHAPE(rot) ==[klon,klev ],TRIM(sub)//" rot shape") !--- DEFAULT THRESHOLDS th0=380.; IF(PRESENT(thet0)) th0=thet0 !--- In kelvins pv0= 2.; IF(PRESENT(pvor0)) pv0=pvor0 !--- In PVU IF(first) THEN DO k0=1,klev; IF(aps(k0)/preff+bps(k0)