diff --git a/docs/TODO b/docs/TODO index db758901a11f1e5837793b6ced157f19213930e1..00d21af05f14998f9fe9f1cdfdc1030fedc92379 100644 --- a/docs/TODO +++ b/docs/TODO @@ -68,8 +68,10 @@ Nettoyage apl_arome non fait (pb a la compilation) ==> 4 arguments dans aro_turb turb.F90 : il reste un CALL à SOURCES_NEG_CORRECT à ajouter. Besoin de récupérer CCLOUD dans apl_arome : comment ? -Regarder s'il ne serait pas possible/souhaitable de supprimer modd_lunit de PHYEX. On pourrait se contentner de recevoir le numero d'unité logique +Regarder s'il ne serait pas possible/souhaitable de supprimer modd_lunit de PHYEX. On pourrait se contenter de recevoir le numero d'unité logique Faire quelque chose de mesonh/micro/modd_blankn.f90: le déplacer dans common ou le supprimer Nettoyage des répertoires aux nécessaire + +Initialiser dans AROME la variable ldiag_in_run de MODD_DIAG_IN_RUN pour pouvoir phaser le modd diff --git a/src/arome/turb/mode_thermo_mono.F90 b/src/arome/aux/mode_thermo.F90 similarity index 98% rename from src/arome/turb/mode_thermo_mono.F90 rename to src/arome/aux/mode_thermo.F90 index 8b85442eb8e537a9616ac40657d712c8c3d51aa7..86165d23b4df39acacf7c268d926aec1d7add298 100644 --- a/src/arome/turb/mode_thermo_mono.F90 +++ b/src/arome/aux/mode_thermo.F90 @@ -1,7 +1,10 @@ +!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- ! ####################### MODULE MODE_THERMO - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ####################### ! !!**** *MODE_THERMO_MONO* - module for routines SM_FOES,SM_PMR_HU @@ -29,13 +32,23 @@ !! MODIFICATIONS !! ------------- !! Original 28/08/94 +!! J.Escobar : 5/10/2018 : add FLUSH , for better logging in case of PB +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg !-------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! !------------------------------------------------------------------------------- -! +USE MODE_MSG +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +IMPLICIT NONE + +PRIVATE + +PUBLIC :: DQSAT, DQSATI, QSAT, QSATI, SM_FOES, SM_PMR_HU + INTERFACE SM_FOES MODULE PROCEDURE SM_FOES_0D MODULE PROCEDURE SM_FOES_1D @@ -288,6 +301,8 @@ END FUNCTION SM_FOES_1D !! Modification 16/03/95 remove the EPSILON function !! Modification 15/09/97 (V. Masson) add solid and liquid water phases !! in thetav computation +!! Modification 22/01/2019 (P. Wautelet) use standard FLUSH statement +!! instead of non standard intrinsics!! !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -347,7 +362,7 @@ IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_PMR_HU_3D',0,ZHOOK_HANDLE) ITERMAX = 10 IF (PRESENT(KITERMAX)) ITERMAX=KITERMAX ZRDSRV = XRD /XRV -ZEPS = 1.E-5 +ZEPS = XEPS_DT ! ZRSLW(:,:,:)=0. DO JRR=2,SIZE(PR,4) @@ -379,8 +394,8 @@ IF ( ANY(ZDT > ZEPS) ) THEN WRITE(ILUOUT,*) 'MR AT THIS MAXIMUM : ', PMR(IMAXLOC(1),IMAXLOC(2),IMAXLOC(3)) WRITE(ILUOUT,*) 'T AT THIS MAXIMUM : ', ZT(IMAXLOC(1),IMAXLOC(2),IMAXLOC(3)) WRITE(ILUOUT,*) 'JOB ABORTED ' - CALL ABORT - STOP + FLUSH(unit=ILUOUT) + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'SM_PMR_HU_3D', 'failed to converge' ) END IF !------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_PMR_HU_3D',1,ZHOOK_HANDLE) @@ -522,8 +537,7 @@ IF (ANY(ZDT>ZEPS)) THEN WRITE(ILUOUT,*) 'MR AT THIS MAXIMUM : ', PMR(IMAXLOC) WRITE(ILUOUT,*) 'T AT THIS MAXIMUM : ', ZT(IMAXLOC) WRITE(ILUOUT,*) 'JOB ABORTED ' - CALL ABORT - STOP + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'SM_PMR_HU_1D', 'failed to converge' ) END IF !------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_PMR_HU_1D',1,ZHOOK_HANDLE) diff --git a/src/arome/turb/modd_dynn.F90 b/src/arome/dead_code/modd_dynn.F90 similarity index 100% rename from src/arome/turb/modd_dynn.F90 rename to src/arome/dead_code/modd_dynn.F90 diff --git a/src/arome/turb/modn_turb.F90 b/src/arome/dead_code/modn_turb.F90 similarity index 100% rename from src/arome/turb/modn_turb.F90 rename to src/arome/dead_code/modn_turb.F90 diff --git a/src/arome/gmkpack_ignored_files b/src/arome/gmkpack_ignored_files index 0b47fe93506323efcd6859ed24a394ed7f57ff1e..193b04bd4624e14fe92f02563a87d775bf722f2d 100644 --- a/src/arome/gmkpack_ignored_files +++ b/src/arome/gmkpack_ignored_files @@ -164,3 +164,6 @@ phyex/micro/modd_nsv.F90 phyex/micro/modd_refaro.F90 phyex/micro/mode_fmbidon.F90 phyex/micro/mode_fmwritbidon.F90 +phyex/turb/modd_dynn.F90 +phyex/turb/mode_thermo_mono.F90 +phyex/turb/modn_turb.F90 diff --git a/src/arome/turb/ini_cturb.F90 b/src/arome/turb/ini_cturb.F90 index 06bbc545492660b517fea9f828a6abd13ee66937..1847d0fdaa16277c181230c08f4b43093856b0a7 100644 --- a/src/arome/turb/ini_cturb.F90 +++ b/src/arome/turb/ini_cturb.F90 @@ -1,7 +1,5 @@ ! ######spl SUBROUTINE INI_CTURB - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! #################### ! !!**** *INI_CTURB* - routine to initialize the turbulence scheme @@ -40,6 +38,8 @@ !! P.Jabouille 20/10/99 XCET=0.4 !! V.Masson 13/11/02 XALPSBL and XASBL !! 05/06 Remove KEPS +!! Q.Rodier 01/19 +!! Remove XASBL (not used) !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -48,8 +48,15 @@ USE MODD_CST USE MODD_CTURB ! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! IMPLICIT NONE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('INI_CTURB',0,ZHOOK_HANDLE) +! ! --------------------------------------------------------------------------- ! ! 1. SETTING THE NUMERICAL VALUES @@ -57,8 +64,6 @@ IMPLICIT NONE ! ! 1.1 Constant for dissipation of Tke ! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('INI_CTURB',0,ZHOOK_HANDLE) ! LHARAT=.FALSE. ! @@ -67,6 +72,7 @@ XCED = 0.85 ! Redelsperger-Sommeria (1981) = 0.70 ! Schmidt-Schumann (1989) = 0.845 ! Cheng-Canuto-Howard (2002) = 0.845 +! Rodier, Masson, Couvreux, Paci (2017) = 0.34 ! ! ! 1.2 Constant for wind pressure-correlations @@ -191,14 +197,6 @@ XCPR3= XCPR2 ! used only for the Schmidt number for scalar variables XCPR4= XCPR2 XCPR5= XCPR2 ! -! 2.4 Value related to the TKE universal function within SBL -! -! -XASBL = 0.5*( XALPSBL**(3./2.)*XKARMAN*XCED + XKARMAN/SQRT(XALPSBL)/XCMFS ) -! Redelsperger et al 2001 -! -! -! ! 3. MINIMUM VALUES ! -------------- ! diff --git a/src/arome/turb/modd_diag_in_run.F90 b/src/arome/turb/modd_diag_in_run.F90 index 48aa658f406545abf0fc72758a235ba5db5f9f16..ca9ce53a698a3a458f5ac777353e5d23518faa78 100644 --- a/src/arome/turb/modd_diag_in_run.F90 +++ b/src/arome/turb/modd_diag_in_run.F90 @@ -1,20 +1,30 @@ -! ######spl +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- MODULE MODD_DIAG_IN_RUN +! Modifications +!! 02/2018 Q.Libois ECRAD +!! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes ! !* stores instantaneous diagnostic arrays for the current time-step ! IMPLICIT NONE -SAVE - LOGICAL :: LDIAG_IN_RUN=.FALSE. ! flag for diagnostics ! REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_RN ! net radiation REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_H ! sensible heat flux -REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_LE ! latent heat flux +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_LE ! Total latent heat flux +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_LEI ! Solid latent heat flux REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_GFLUX ! ground flux -REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_LW ! incoming longwave at the surface -REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SW ! incoming Shortwave at the surface +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_LWD ! incoming longwave at the surface +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_LWU ! outcoming longwave at the surface +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SWD ! incoming Shortwave at the surface +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SWU ! outcoming Shortwave at the surface +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SWDIR ! incoming Shortwave direct at the surface +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SWDIFF! incoming Shortwave diffuse at the surface REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_T2M ! temperature at 2m REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_Q2M ! humidity at 2m REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_HU2M ! relative humidity at 2m @@ -23,4 +33,6 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_MER10M! meridian wind at 10m REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_DSTAOD! dust aerosol optical depth REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SFCO2 ! CO2 Surface flux REAL, DIMENSION(:,:,:), ALLOCATABLE :: XCURRENT_TKE_DISS ! Tke dissipation rate +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_SLTAOD ! Salt aerosol optical depth +REAL, DIMENSION(:,:), ALLOCATABLE :: XCURRENT_ZWS ! Significant height of waves END MODULE MODD_DIAG_IN_RUN diff --git a/src/arome/turb/modi_compute_function_thermo_mf.F90 b/src/arome/turb/modi_compute_function_thermo_mf.F90 deleted file mode 100644 index 7f68ce56fce49953f795cb474da461a774978b96..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_compute_function_thermo_mf.F90 +++ /dev/null @@ -1,33 +0,0 @@ -! ######spl - MODULE MODI_COMPUTE_FUNCTION_THERMO_MF -! ###################################### -! -INTERFACE - -! ################################################################# - SUBROUTINE COMPUTE_FUNCTION_THERMO_MF( KRR,KRRL,KRRI, & - PTH, PR, PEXN, PFRAC_ICE, PPABS, & - PT, PAMOIST,PATHETA ) -! ################################################################# - -!* 1.1 Declaration of Arguments -! - -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. -INTEGER, INTENT(IN) :: KRRI ! number of ice water var. - -REAL, DIMENSION(:,:), INTENT(IN) :: PTH ! theta -REAL, DIMENSION(:,:,:), INTENT(IN) :: PR ! water species -REAL, DIMENSION(:,:) , INTENT(IN) :: PPABS,PEXN ! pressure, Exner funct. -REAL, DIMENSION(:,:) , INTENT(IN) :: PFRAC_ICE ! ice fraction - -REAL, DIMENSION(:,:), INTENT(OUT) :: PT ! temperature - -REAL, DIMENSION(:,:), INTENT(OUT) :: PAMOIST,PATHETA -! -END SUBROUTINE COMPUTE_FUNCTION_THERMO_MF - -END INTERFACE -! -END MODULE MODI_COMPUTE_FUNCTION_THERMO_MF diff --git a/src/arome/turb/mode_sbl.F90 b/src/common/turb/mode_sbl.F90 similarity index 90% rename from src/arome/turb/mode_sbl.F90 rename to src/common/turb/mode_sbl.F90 index bb24bb31e9c8bf8989f81a43ec06a3ac81291604..ef8e3ac6681eebf28d3df0b0351a6bd473149893 100644 --- a/src/arome/turb/mode_sbl.F90 +++ b/src/common/turb/mode_sbl.F90 @@ -1,7 +1,10 @@ -! ######spl +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ############### MODULE MODE_SBL - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ############### ! !!**** *MODE_SBL * - contains Surface Boundary Layer characteristics functions @@ -36,6 +39,8 @@ !! V. Masson 06/11/02 optimization and add Businger fonction for TKE !! V. Masson 01/01/03 use PAULSON_PSIM function !----------------------------------------------------------------------------- +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! !* 0. DECLARATIONS ! @@ -87,7 +92,7 @@ FUNCTION BUSINGER_PHIM_3D(PZ_O_LMO) ELSEWHERE BUSINGER_PHIM_3D(:,:,:) = 1. + 4.7 * PZ_O_LMO END WHERE -IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM_3D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM_3D',1,ZHOOK_HANDLE) END FUNCTION BUSINGER_PHIM_3D ! !------------------------------------------------------------------------------- @@ -103,7 +108,7 @@ FUNCTION BUSINGER_PHIM_2D(PZ_O_LMO) ELSEWHERE BUSINGER_PHIM_2D(:,:) = 1. + 4.7 * PZ_O_LMO END WHERE -IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM_2D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM_2D',1,ZHOOK_HANDLE) END FUNCTION BUSINGER_PHIM_2D ! !------------------------------------------------------------------------------- @@ -119,7 +124,7 @@ FUNCTION BUSINGER_PHIM_1D(PZ_O_LMO) ELSEWHERE BUSINGER_PHIM_1D(:) = 1. + 4.7 * PZ_O_LMO END WHERE -IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM_1D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM_1D',1,ZHOOK_HANDLE) END FUNCTION BUSINGER_PHIM_1D ! !------------------------------------------------------------------------------- @@ -135,7 +140,7 @@ FUNCTION BUSINGER_PHIM_0D(PZ_O_LMO) ELSE BUSINGER_PHIM_0D = 1. + 4.7 * PZ_O_LMO END IF -IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM_0D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM_0D',1,ZHOOK_HANDLE) END FUNCTION BUSINGER_PHIM_0D ! !------------------------------------------------------------------------------- @@ -153,7 +158,7 @@ FUNCTION BUSINGER_PHIH_3D(PZ_O_LMO) ELSEWHERE BUSINGER_PHIH_3D(:,:,:) = 0.74 + 4.7 * PZ_O_LMO END WHERE -IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH_3D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH_3D',1,ZHOOK_HANDLE) END FUNCTION BUSINGER_PHIH_3D ! !------------------------------------------------------------------------------- @@ -169,7 +174,7 @@ FUNCTION BUSINGER_PHIH_2D(PZ_O_LMO) ELSEWHERE BUSINGER_PHIH_2D(:,:) = 0.74 + 4.7 * PZ_O_LMO END WHERE -IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH_2D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH_2D',1,ZHOOK_HANDLE) END FUNCTION BUSINGER_PHIH_2D ! !------------------------------------------------------------------------------- @@ -185,7 +190,7 @@ FUNCTION BUSINGER_PHIH_1D(PZ_O_LMO) ELSEWHERE BUSINGER_PHIH_1D(:) = 0.74 + 4.7 * PZ_O_LMO END WHERE -IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH_1D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH_1D',1,ZHOOK_HANDLE) END FUNCTION BUSINGER_PHIH_1D ! !------------------------------------------------------------------------------- @@ -201,7 +206,7 @@ FUNCTION BUSINGER_PHIH_0D(PZ_O_LMO) ELSE BUSINGER_PHIH_0D = 0.74 + 4.7 * PZ_O_LMO END IF -IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH_0D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH_0D',1,ZHOOK_HANDLE) END FUNCTION BUSINGER_PHIH_0D ! !------------------------------------------------------------------------------- @@ -221,7 +226,7 @@ FUNCTION BUSINGER_PHIE_3D(PZ_O_LMO) ELSEWHERE BUSINGER_PHIE_3D(:,:,:) = 1./(1. + 4.7 * PZ_O_LMO)**2 END WHERE -IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIE_3D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIE_3D',1,ZHOOK_HANDLE) END FUNCTION BUSINGER_PHIE_3D ! !------------------------------------------------------------------------------- @@ -243,7 +248,7 @@ FUNCTION PAULSON_PSIM_2D(PZ_O_LMO) ELSEWHERE PAULSON_PSIM_2D(:,:) = - 4.7 * PZ_O_LMO END WHERE -IF (LHOOK) CALL DR_HOOK('MODE_SBL:PAULSON_PSIM_2D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:PAULSON_PSIM_2D',1,ZHOOK_HANDLE) END FUNCTION PAULSON_PSIM_2D ! !------------------------------------------------------------------------------- @@ -264,7 +269,7 @@ FUNCTION PAULSON_PSIM_1D(PZ_O_LMO) ELSEWHERE PAULSON_PSIM_1D(:) = - 4.7 * PZ_O_LMO END WHERE -IF (LHOOK) CALL DR_HOOK('MODE_SBL:PAULSON_PSIM_1D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:PAULSON_PSIM_1D',1,ZHOOK_HANDLE) END FUNCTION PAULSON_PSIM_1D ! !------------------------------------------------------------------------------- @@ -285,7 +290,7 @@ FUNCTION PAULSON_PSIM_0D(PZ_O_LMO) ELSE PAULSON_PSIM_0D = - 4.7 * PZ_O_LMO END IF -IF (LHOOK) CALL DR_HOOK('MODE_SBL:PAULSON_PSIM_0D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:PAULSON_PSIM_0D',1,ZHOOK_HANDLE) END FUNCTION PAULSON_PSIM_0D ! !------------------------------------------------------------------------------- @@ -317,7 +322,7 @@ FUNCTION LMO_2D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV) LMO_2D(:,:) = - MAX(PUSTAR(:,:),1.E-6)**3 & / ( XKARMAN * XG / ZTHETAV(:,:) *ZQ0(:,:) ) -IF (LHOOK) CALL DR_HOOK('MODE_SBL:LMO_2D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:LMO_2D',1,ZHOOK_HANDLE) END FUNCTION LMO_2D ! !------------------------------------------------------------------------------- @@ -347,7 +352,7 @@ FUNCTION LMO_1D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV) LMO_1D(:) = - MAX(PUSTAR(:),1.E-6)**3 & / ( XKARMAN * ( XG / ZTHETAV(:) * PSFTH(:) & + XG * ZEPS * PSFRV(:) ) ) -IF (LHOOK) CALL DR_HOOK('MODE_SBL:LMO_1D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:LMO_1D',1,ZHOOK_HANDLE) END FUNCTION LMO_1D ! !------------------------------------------------------------------------------- @@ -378,7 +383,7 @@ FUNCTION LMO_0D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV) LMO_0D = - MAX(PUSTAR,1.E-6)**3 & / ( XKARMAN * ( XG / ZTHETAV * PSFTH & + XG * ZEPS * PSFRV ) ) -IF (LHOOK) CALL DR_HOOK('MODE_SBL:LMO_0D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:LMO_0D',1,ZHOOK_HANDLE) END FUNCTION LMO_0D ! !------------------------------------------------------------------------------- @@ -421,7 +426,7 @@ FUNCTION USTAR_2D(PU,PV,PZ,PZ0,PLMO) * XKARMAN / LOG(PZ(:,:)/PZ0(:,:)) END WHERE ! -IF (LHOOK) CALL DR_HOOK('MODE_SBL:USTAR_2D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:USTAR_2D',1,ZHOOK_HANDLE) END FUNCTION USTAR_2D ! !------------------------------------------------------------------------------- @@ -463,7 +468,7 @@ FUNCTION USTAR_1D(PU,PV,PZ,PZ0,PLMO) * XKARMAN / LOG(PZ(:)/PZ0(:)) END WHERE ! -IF (LHOOK) CALL DR_HOOK('MODE_SBL:USTAR_1D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:USTAR_1D',1,ZHOOK_HANDLE) END FUNCTION USTAR_1D ! !------------------------------------------------------------------------------- @@ -495,7 +500,7 @@ FUNCTION USTAR_0D(PU,PV,PZ,PZ0,PLMO) USTAR_0D = SQRT( PU**2+PV**2 ) & * XKARMAN / LOG(PZ/PZ0) -IF (LHOOK) CALL DR_HOOK('MODE_SBL:USTAR_0D',1,ZHOOK_HANDLE) + IF (LHOOK) CALL DR_HOOK('MODE_SBL:USTAR_0D',1,ZHOOK_HANDLE) END FUNCTION USTAR_0D ! !------------------------------------------------------------------------------- diff --git a/src/arome/turb/modi_les_mean_subgrid.F90 b/src/common/turb/modi_les_mean_subgrid.F90 similarity index 100% rename from src/arome/turb/modi_les_mean_subgrid.F90 rename to src/common/turb/modi_les_mean_subgrid.F90 diff --git a/src/mesonh/aux/mode_thermo.f90 b/src/mesonh/aux/mode_thermo.f90 new file mode 100644 index 0000000000000000000000000000000000000000..935ffebd0606833ea3979137886485da05f041bd --- /dev/null +++ b/src/mesonh/aux/mode_thermo.f90 @@ -0,0 +1,2515 @@ +!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ####################### + MODULE MODE_THERMO +! ####################### +! +!!**** *MODE_THERMO_MONO* - module for routines SM_FOES,SM_PMR_HU +!! +!! PURPOSE +!! ------- +! The purpose of this executive module is to package +! the routine SM_FOES, SM_PMR_HU without use of comlib parallel routine +! +! +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 28/08/94 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! J.Escobar : 5/10/2018 : add FLUSH , for better logging in case of PB +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +!-------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!------------------------------------------------------------------------------- +USE MODE_MSG +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +IMPLICIT NONE + +PRIVATE + +PUBLIC :: DQSAT, DQSATI, QSAT, QSATI, SM_FOES, SM_PMR_HU + +INTERFACE SM_FOES + MODULE PROCEDURE SM_FOES_0D + MODULE PROCEDURE SM_FOES_1D + MODULE PROCEDURE SM_FOES_2D + MODULE PROCEDURE SM_FOES_2D_MASK + MODULE PROCEDURE SM_FOES_3D +END INTERFACE +INTERFACE QSAT + MODULE PROCEDURE QSATW_3D + MODULE PROCEDURE QSATW_2D + MODULE PROCEDURE QSATW_2D_MASK + MODULE PROCEDURE QSATW_1D + MODULE PROCEDURE QSATW_0D +END INTERFACE +INTERFACE DQSAT + MODULE PROCEDURE DQSATW_O_DT_2D_MASK + MODULE PROCEDURE DQSATW_O_DT_1D + MODULE PROCEDURE DQSATW_O_DT_3D +END INTERFACE +INTERFACE QSATI + MODULE PROCEDURE QSATI_3D + MODULE PROCEDURE QSATI_2D + MODULE PROCEDURE QSATI_2D_MASK + MODULE PROCEDURE QSATI_1D + MODULE PROCEDURE QSATI_0D +END INTERFACE +INTERFACE DQSATI + MODULE PROCEDURE DQSATI_O_DT_2D_MASK + MODULE PROCEDURE DQSATI_O_DT_1D + MODULE PROCEDURE DQSATI_O_DT_3D +END INTERFACE +INTERFACE SM_PMR_HU + MODULE PROCEDURE SM_PMR_HU_1D + MODULE PROCEDURE SM_PMR_HU_3D +END INTERFACE +CONTAINS +!------------------------------------------------------------------------------- +! #################################### + FUNCTION SM_FOES_3D(PT) RESULT(PFOES) +! #################################### +! +!!**** *SM_FOES_3D * - function to compute saturation vapor pressure from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 28/08/94 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: PFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!* 0.2 Declarations of local variables +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_FOES_3D',0,ZHOOK_HANDLE) +PFOES(:,:,:) = EXP( XALPW - XBETAW/PT(:,:,:) - XGAMW*LOG(PT(:,:,:)) ) +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_FOES_3D',1,ZHOOK_HANDLE) +END FUNCTION SM_FOES_3D +! #################################### + FUNCTION SM_FOES_1D(PT) RESULT(PFOES) +! #################################### +! +!!**** *SM_FOES_1D * - function to compute saturation vapor pressure from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 28/08/94 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(SIZE(PT)) :: PFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!* 0.2 Declarations of local variables +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_FOES_1D',0,ZHOOK_HANDLE) +PFOES(:) = EXP( XALPW - XBETAW/PT(:) - XGAMW*LOG(PT(:)) ) +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_FOES_1D',1,ZHOOK_HANDLE) +END FUNCTION SM_FOES_1D +!------------------------------------------------------------------------------- +! #################################################### + FUNCTION SM_PMR_HU_3D(PP,PTV,PHU,PR,KITERMAX) RESULT(PMR) +! #################################################### +! +!!**** *SM_PMR_HU_3D * - function to compute vapor mixing ratio +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the vapor mixing ratio +! from pressure, virtual temperature and relative humidity +! +! +!!** METHOD +!! ------ +!! Given Pressure (PP), Virtual temperature (PTV) and Relative +!! humidity (PHU), the vapor mixing ratio is computed by iterating +!! the following procedure : +!! T ----> es(T) +!! es(T) ,HU ----> es(Td) +!! es(Td), P ----> r +!! r , Tv ----> T +!! +!! at the beginning T=Tv +!! +!! EXTERNAL +!! -------- +!! SM_FOES : to compute saturation vapor pressure +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XRV : gas constant for vapor +!! XRD : gas constant for dry air +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 30/08/94 +!! Modification 16/03/95 remove the EPSILON function +!! Modification 15/09/97 (V. Masson) add solid and liquid water phases +!! in thetav computation +!! Modification 22/01/2019 (P. Wautelet) use standard FLUSH statement +!! instead of non standard intrinsics!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_LUNIT_n, ONLY: TLUOUT +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTV ! Virtual Temperature + ! (Kelvin) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PHU ! Relative humidity + ! (percent) +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PR ! vapor, liquid and + ! solid water mixing + ! ratio + +INTEGER, INTENT(IN), OPTIONAL :: KITERMAX ! maximum number + ! of iterations + ! (default 10) +! +REAL, DIMENSION(SIZE(PP,1),SIZE(PP,2),SIZE(PP,3)) :: PMR ! vapor mixing ratio +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PP,1),SIZE(PP,2),SIZE(PP,3)) :: ZT ! temperature +REAL, DIMENSION(SIZE(PP,1),SIZE(PP,2),SIZE(PP,3)) :: ZDT ! increment of + ! temperature between two iterations +REAL :: ZRDSRV ! Rd/Rv +REAL, DIMENSION(SIZE(PP,1),SIZE(PP,2),SIZE(PP,3)) :: ZESTD ! es(Td) +REAL, DIMENSION(SIZE(PP,1),SIZE(PP,2),SIZE(PP,3)) :: ZRSLW ! total solid and liquid water mixing ratio +INTEGER :: ITERMAX ! Maximum number + ! of iteration +INTEGER :: ITER ! iteration number of +REAL :: ZEPS ! a small number +INTEGER, DIMENSION(3) :: IMAXLOC ! localisation of + ! a maximum +INTEGER :: ILUOUT + ! logical unit for + ! output-listing + ! and error code +INTEGER :: JRR ! loop counter +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE VAPOR MIXING RATIO +! -------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_PMR_HU_3D',0,ZHOOK_HANDLE) +ITERMAX = 10 +IF (PRESENT(KITERMAX)) ITERMAX=KITERMAX +ZRDSRV = XRD /XRV +ZEPS = XEPS_DT +! +ZRSLW(:,:,:)=0. +DO JRR=2,SIZE(PR,4) + ZRSLW(:,:,:)=ZRSLW(:,:,:)+PR(:,:,:,JRR) +END DO +! +ZT(:,:,:) = PTV(:,:,:) +DO ITER=1,ITERMAX + ZESTD(:,:,:) = PHU(:,:,:) * SM_FOES(ZT(:,:,:)) * 0.01 + PMR (:,:,:) = ZRDSRV * ZESTD(:,:,:) /(PP(:,:,:) - ZESTD(:,:,:)) + ZDT(:,:,:) = ZT(:,:,:) + ZT(:,:,:) = PTV(:,:,:) * (1.+PMR(:,:,:)+ZRSLW(:,:,:)) / (1.+ PMR(:,:,:)/ZRDSRV) + ZDT(:,:,:) = ABS(ZDT(:,:,:) - ZT(:,:,:)) +END DO +!------------------------------------------------------------------------------- +! +!* 2. NO CONVERGENCE +! -------------- +! +IF ( ANY(ZDT > ZEPS) ) THEN + ILUOUT = TLUOUT%NLU + WRITE(ILUOUT,*) 'ERROR IN FUNCTION SM_PMR_HU (module MODE_THERMO)' + WRITE(ILUOUT,*) 'FUNCTION FAILS TO CONVERGE AFTER ', ITERMAX,' ITERATIONS' + WRITE(ILUOUT,*) 'EPS = ' , ZEPS + IMAXLOC(:) = MAXLOC(ZDT) + WRITE(ILUOUT,*) 'MAXIMUM RESIDUAL DT :', MAXVAL(ZDT) +! WRITE(ILUOUT,*) 'LOCATION OF THIS MAXIMUM I=',IMAXLOC(1),' J=',IMAXLOC(2), & +! ' K=',IMAXLOC(3) + WRITE(ILUOUT,*) 'MR AT THIS MAXIMUM : ', PMR(IMAXLOC(1),IMAXLOC(2),IMAXLOC(3)) + WRITE(ILUOUT,*) 'T AT THIS MAXIMUM : ', ZT(IMAXLOC(1),IMAXLOC(2),IMAXLOC(3)) + WRITE(ILUOUT,*) 'JOB ABORTED ' + FLUSH(unit=ILUOUT) + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'SM_PMR_HU_3D', 'failed to converge' ) +END IF +!------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_PMR_HU_3D',1,ZHOOK_HANDLE) +END FUNCTION SM_PMR_HU_3D +! ################################################################ + FUNCTION SM_PMR_HU_1D(PP,PTV,PHU,PR,KITERMAX) RESULT(PMR) +! ################################################################ +! +!!**** *SM_PMR_HU_1D * - function to compute vapor mixing ratio +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the vapor mixing ratio +! from pressure, virtual temperature and relative humidity +! +! +!!** METHOD +!! ------ +!! Given Pressure (PP), Virtual temperature (PTV) and Relative +!! humidity (PHU), the vapor mixing ratio is computed by iterating +!! the following procedure : +!! T ----> es(T) +!! es(T) ,HU ----> es(Td) +!! es(Td), P ----> r +!! r , Tv ----> T +!! +!! at the beginning T=Tv +!! +!! EXTERNAL +!! -------- +!! SM_FOES : to compute saturation vapor pressure +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XRV : gas constant for vapor +!! XRD : gas constant for dry air +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 30/08/94 +!! Modification 16/03/95 remove the EPSILON function +!! Modification 15/09/97 (V. Masson) add solid and liquid water phases +!! in thetav computation +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_LUNIT_n, ONLY: TLUOUT +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(:), INTENT(IN) :: PTV ! Virtual Temperature + ! (Kelvin) +REAL, DIMENSION(:), INTENT(IN) :: PHU ! Relative humidity + ! (percent) +REAL, DIMENSION(:,:), INTENT(IN) :: PR ! vapor, liquid and solid + ! water mixing ratio +INTEGER, INTENT(IN), OPTIONAL :: KITERMAX ! maximum number + ! of iterations + ! (default 10) +! +REAL, DIMENSION(SIZE(PP)) :: PMR ! vapor mixing ratio +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PP)) :: ZT ! temperature +REAL, DIMENSION(SIZE(PP)) :: ZDT ! increment of + ! temperature between two iterations +REAL :: ZRDSRV ! Rd/Rv +REAL, DIMENSION(SIZE(PP)) :: ZESTD ! es(Td) +REAL, DIMENSION(SIZE(PP)) :: ZRSLW ! total solid and liquid water mixing ratio +INTEGER :: ITERMAX ! Maximum number + ! of iteration +INTEGER :: ITER ! iteration number of +REAL :: ZEPS ! a small number +INTEGER,DIMENSION(1) :: IMAXLOC ! localisation of + ! a maximum +INTEGER :: ILUOUT,IRESP + ! logical unit for + ! output-listing + ! and error code +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE VAPOR MIXING RATIO +! -------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_PMR_HU_1D',0,ZHOOK_HANDLE) +ITERMAX = 10 +IF (PRESENT(KITERMAX)) ITERMAX=KITERMAX +ZRDSRV = XRD /XRV +ZEPS = 1.E-5 +! +IF (SIZE(PR,2)>1) THEN + ZRSLW(:)=SUM(PR(:,2:),DIM=2) +ELSE + ZRSLW(:)=0. +END IF +! +ZT(:) = PTV(:) +DO ITER=1,ITERMAX + ZESTD(:) = PHU(:) * SM_FOES(ZT(:)) * 0.01 + PMR (:) = ZRDSRV * ZESTD(:) /(PP(:) - ZESTD(:)) + ZDT(:) = ZT(:) + ZT(:) = PTV(:) * (1.+PMR(:)+ZRSLW(:)) / (1.+ PMR(:)/ZRDSRV) + ZDT(:) = ABS(ZDT(:) - ZT(:)) +END DO +!------------------------------------------------------------------------------- +! +!* 2. NO CONVERGENCE +! -------------- +! +IF (ANY(ZDT>ZEPS)) THEN + ILUOUT = TLUOUT%NLU + WRITE(ILUOUT,*) 'ERROR IN FUNCTION SM_PMR_HU (module MODE_THERMO)' + WRITE(ILUOUT,*) 'FUNCTION FAILS TO CONVERGE AFTER ', ITERMAX,' ITERATIONS' + WRITE(ILUOUT,*) 'EPS = ' , ZEPS + IMAXLOC = MAXLOC(ZDT) + WRITE(ILUOUT,*) 'MAXIMUM RESIDUAL DT :', MAXVAL(ZDT) + WRITE(ILUOUT,*) 'MR AT THIS MAXIMUM : ', PMR(IMAXLOC) + WRITE(ILUOUT,*) 'T AT THIS MAXIMUM : ', ZT(IMAXLOC) + WRITE(ILUOUT,*) 'JOB ABORTED ' + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'SM_PMR_HU_1D', 'failed to converge' ) +END IF +!------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_PMR_HU_1D',1,ZHOOK_HANDLE) +END FUNCTION SM_PMR_HU_1D +! #################################### + FUNCTION SM_FOES_0D(PT) RESULT(PFOES) +! #################################### +! +!!**** *SM_FOES_0D * - function to compute saturation vapor pressure from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 28/08/94 +!! 24/12/97 (V. Masson) version for 0D arrays +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL :: PFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!* 0.2 Declarations of local variables +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_FOES_0D',0,ZHOOK_HANDLE) +PFOES = EXP( XALPW - XBETAW/PT - XGAMW*LOG(PT) ) +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_FOES_0D',1,ZHOOK_HANDLE) +END FUNCTION SM_FOES_0D +! +!------------------------------------------------------------------------------- +! #################################### + FUNCTION SM_FOES_2D(PT) RESULT(PFOES) +! #################################### +! +!!**** *SM_FOES_2D * - function to compute saturation vapor pressure from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 28/08/94 +!! 24/12/97 (V. Masson) version for 2D arrays +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:,:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2)) :: PFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!* 0.2 Declarations of local variables +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_FOES_2D',0,ZHOOK_HANDLE) +PFOES(:,:) = EXP( XALPW - XBETAW/PT(:,:) - XGAMW*LOG(PT(:,:)) ) +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_FOES_2D',1,ZHOOK_HANDLE) +END FUNCTION SM_FOES_2D +! +!------------------------------------------------------------------------------- +! +! ################################################ + FUNCTION SM_FOES_2D_MASK(OMASK,PT) RESULT(PFOES) +! ################################################ +! +!!**** *SM_FOES_2D * - function to compute saturation vapor pressure from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 28/08/94 +!! 24/12/97 (V. Masson) version for 2D arrays +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASK ! Localization mask +REAL, DIMENSION(:,:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2)) :: PFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!* 0.2 Declarations of local variables +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_FOES_2D_MASK',0,ZHOOK_HANDLE) +WHERE (OMASK(:,:)) + PFOES(:,:) = EXP( XALPW - XBETAW/PT(:,:) - XGAMW*LOG(PT(:,:)) ) +END WHERE +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:SM_FOES_2D_MASK',1,ZHOOK_HANDLE) +END FUNCTION SM_FOES_2D_MASK +! +!------------------------------------------------------------------------------- +! +! ###################################### + FUNCTION QSATW_3D(PT,PP) RESULT(PQSAT) +! ###################################### +! +!!**** *QSATW * - function to compute saturation vapor humidity from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!! S. Riette april 2011 : protection in high statosphere where ZFOES > PP +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg) +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATW_3D',0,ZHOOK_HANDLE) +ZFOES(:,:,:) = MIN(EXP( XALPW - XBETAW/PT(:,:,:) - XGAMW*LOG(PT(:,:,:)) ), 0.99*PP(:,:,:)) +! +!* 2. COMPUTE SATURATION HUMIDITY +! --------------------------- +! +PQSAT(:,:,:) = XRD/XRV*ZFOES(:,:,:)/PP(:,:,:) & + / (1.+(XRD/XRV-1.)*ZFOES(:,:,:)/PP(:,:,:)) +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATW_3D',1,ZHOOK_HANDLE) +END FUNCTION QSATW_3D +! +!------------------------------------------------------------------------------- +! +! ###################################### + FUNCTION QSATW_2D(PT,PP) RESULT(PQSAT) +! ###################################### +! +!!**** *QSATW * - function to compute saturation vapor humidity from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!! S. Riette april 2011 : protection in high statosphere where ZFOES > PP +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:,:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(:,:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2)) :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg) +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2)) :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATW_2D',0,ZHOOK_HANDLE) +ZFOES(:,:) = MIN(EXP( XALPW - XBETAW/PT(:,:) - XGAMW*LOG(PT(:,:)) ), 0.99*PP(:,:)) +! +!* 2. COMPUTE SATURATION HUMIDITY +! --------------------------- +! +PQSAT(:,:) = XRD/XRV*ZFOES(:,:)/PP(:,:) & + / (1.+(XRD/XRV-1.)*ZFOES(:,:)/PP(:,:)) +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATW_2D',1,ZHOOK_HANDLE) +END FUNCTION QSATW_2D +! +!------------------------------------------------------------------------------- +! +! ################################################# + FUNCTION QSATW_2D_MASK(OMASK,PT,PP) RESULT(PQSAT) +! ################################################# +! +!!**** *QSATW * - function to compute saturation vapor humidity from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!! S. Riette april 2011 : protection in high statosphere where ZFOES > PP +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASK ! Localization mask +REAL, DIMENSION(:,:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(:,:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2)) :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg) +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2)) :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATW_2D_MASK',0,ZHOOK_HANDLE) +WHERE (OMASK(:,:)) +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! + ZFOES(:,:) = MIN(EXP( XALPW - XBETAW/PT(:,:) - XGAMW*LOG(PT(:,:)) ), 0.99*PP(:,:)) +! +!* 2. COMPUTE SATURATION HUMIDITY +! --------------------------- +! + PQSAT(:,:) = XRD/XRV*ZFOES(:,:)/PP(:,:) & + / (1.+(XRD/XRV-1.)*ZFOES(:,:)/PP(:,:)) +ELSEWHERE +! +!* 3. BOGUS VALUE +! ----------- +! + PQSAT(:,:) = 0. +END WHERE +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATW_2D_MASK',1,ZHOOK_HANDLE) +END FUNCTION QSATW_2D_MASK +! +!------------------------------------------------------------------------------- +! +! ###################################### + FUNCTION QSATW_1D(PT,PP) RESULT(PQSAT) +! ###################################### +! +!!**** *QSATW * - function to compute saturation vapor humidity from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!! S. Riette april 2011 : protection in high statosphere where ZFOES > PP +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(SIZE(PT,1)) :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg) +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PT,1)) :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATW_1D',0,ZHOOK_HANDLE) +ZFOES(:) = MIN(EXP( XALPW - XBETAW/PT(:) - XGAMW*LOG(PT(:)) ), 0.99*PP(:)) +! +!* 2. COMPUTE SATURATION HUMIDITY +! --------------------------- +! +PQSAT(:) = XRD/XRV*ZFOES(:)/PP(:) & + / (1.+(XRD/XRV-1.)*ZFOES(:)/PP(:)) +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATW_1D',1,ZHOOK_HANDLE) +END FUNCTION QSATW_1D +! +!------------------------------------------------------------------------------- +! +! ###################################### + FUNCTION QSATW_0D(PT,PP) RESULT(PQSAT) +! ###################################### +! +!!**** *QSATW * - function to compute saturation vapor humidity from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!! S. Riette april 2011 : protection in high statosphere where ZFOES > PP +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg) +! +!* 0.2 Declarations of local variables +! +REAL :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATW_0D',0,ZHOOK_HANDLE) +ZFOES = MIN(EXP( XALPW - XBETAW/PT - XGAMW*LOG(PT) ), 0.99*PP) +! +!* 2. COMPUTE SATURATION HUMIDITY +! --------------------------- +! +PQSAT = XRD/XRV*ZFOES/PP / (1.+(XRD/XRV-1.)*ZFOES/PP) +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATW_0D',1,ZHOOK_HANDLE) +END FUNCTION QSATW_0D +! +!------------------------------------------------------------------------------- +! +! ############################################################## + FUNCTION DQSATW_O_DT_2D_MASK(OMASK,PT,PP,PQSAT) RESULT(PDQSAT) +! ############################################################## +! +!!**** *QSATW * - function to compute saturation vapor humidity from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! Finally, dqsat / dT (T) is computed. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASK ! Localization mask +REAL, DIMENSION(:,:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(:,:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(:,:), INTENT(IN) :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg)) +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2)) :: PDQSAT ! derivative according + ! to temperature of + ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg)) +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2)) :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:DQSATW_O_DT_2D_MASK',0,ZHOOK_HANDLE) +WHERE (OMASK(:,:)) +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! + ZFOES(:,:) = PP(:,:) / (1.+XRD/XRV*(1./PQSAT(:,:)-1.)) +! +!* 2. DERIVATION ACCORDING TO TEMPERATURE +! ----------------------------------- +! + PDQSAT(:,:) = PQSAT(:,:) / (1.+(XRD/XRV-1.)*ZFOES(:,:)/PP(:,:) ) & + * (XBETAW/PT(:,:)**2 - XGAMW/PT(:,:)) +ELSEWHERE +! +!* 3. BOGUS VALUE +! ----------- +! + PDQSAT(:,:) = 0. +END WHERE +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:DQSATW_O_DT_2D_MASK',1,ZHOOK_HANDLE) +END FUNCTION DQSATW_O_DT_2D_MASK +! +!------------------------------------------------------------------------------- +! ############################################################## + FUNCTION DQSATW_O_DT_1D(PT,PP,PQSAT) RESULT(PDQSAT) +! ############################################################## +! +!!**** *QSATW * - function to compute saturation vapor humidity from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! Finally, dqsat / dT (T) is computed. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(:), INTENT(IN) :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg)) +REAL, DIMENSION(SIZE(PT)) :: PDQSAT ! derivative according + ! to temperature of + ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg)) +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PT)) :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:DQSATW_O_DT_1D',0,ZHOOK_HANDLE) +ZFOES(:) = PP(:) / (1.+XRD/XRV*(1./PQSAT(:)-1.)) +! +!* 2. DERIVATION ACCORDING TO TEMPERATURE +! ----------------------------------- +! +PDQSAT(:) = PQSAT(:) / (1.+(XRD/XRV-1.)*ZFOES(:)/PP(:) ) & + * (XBETAW/PT(:)**2 - XGAMW/PT(:)) +! +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:DQSATW_O_DT_1D',1,ZHOOK_HANDLE) +END FUNCTION DQSATW_O_DT_1D +! +!------------------------------------------------------------------------------- +! ############################################################## + FUNCTION DQSATW_O_DT_3D(PT,PP,PQSAT) RESULT(PDQSAT) +! ############################################################## +! +!!**** *QSATW * - function to compute saturation vapor humidity from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! Finally, dqsat / dT (T) is computed. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg)) +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: PDQSAT ! derivative according + ! to temperature of + ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg)) +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +ZFOES(:,:,:) = PP(:,:,:) / (1.+XRD/XRV*(1./PQSAT(:,:,:)-1.)) +! +!* 2. DERIVATION ACCORDING TO TEMPERATURE +! ----------------------------------- +! +PDQSAT(:,:,:) = PQSAT(:,:,:) / (1.+(XRD/XRV-1.)*ZFOES(:,:,:)/PP(:,:,:) ) & + * (XBETAW/PT(:,:,:)**2 - XGAMW/PT(:,:,:)) +! +!------------------------------------------------------------------------------- +! +END FUNCTION DQSATW_O_DT_3D +! +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! +! ############################################################## + FUNCTION DQSATI_O_DT_2D_MASK(OMASK,PT,PP,PQSAT) RESULT(PDQSAT) +! ############################################################## +! +!!**** *QSATW * - function to compute saturation vapor humidity from +!! temperature (with respect to ice) +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! Finally, dqsat / dT (T) is computed. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASK ! Localization mask +REAL, DIMENSION(:,:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(:,:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(:,:), INTENT(IN) :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg)) +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2)) :: PDQSAT ! derivative according + ! to temperature of + ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg)) +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2)) :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:DQSATI_O_DT_2D_MASK',0,ZHOOK_HANDLE) +WHERE (OMASK(:,:)) +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! + ZFOES(:,:) = PP(:,:) / (1.+XRD/XRV*(1./PQSAT(:,:)-1.)) +! +!* 3. DERIVATION ACCORDING TO TEMPERATURE +! ----------------------------------- +! + PDQSAT(:,:) = PQSAT(:,:) / (1.+(XRD/XRV-1.)*ZFOES(:,:)/PP(:,:) ) & + * (XBETAI/PT(:,:)**2 - XGAMI/PT(:,:)) +ELSEWHERE +! +!* 3. BOGUS VALUE +! ----------- +! + PDQSAT(:,:) = 0. +END WHERE +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:DQSATI_O_DT_2D_MASK',1,ZHOOK_HANDLE) +END FUNCTION DQSATI_O_DT_2D_MASK +! +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! ############################################################## + FUNCTION DQSATI_O_DT_1D(PT,PP,PQSAT) RESULT(PDQSAT) +! ############################################################## +! +!!**** *QSATW * - function to compute saturation vapor humidity from +!! temperature (with respect to ice) +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! Finally, dqsat / dT (T) is computed. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(:), INTENT(IN) :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg)) +REAL, DIMENSION(SIZE(PT)) :: PDQSAT ! derivative according + ! to temperature of + ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg)) +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PT)) :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:DQSATI_O_DT_1D',0,ZHOOK_HANDLE) +ZFOES(:) = PP(:) / (1.+XRD/XRV*(1./PQSAT(:)-1.)) +! +!* 3. DERIVATION ACCORDING TO TEMPERATURE +! ----------------------------------- +! +PDQSAT(:) = PQSAT(:) / (1.+(XRD/XRV-1.)*ZFOES(:)/PP(:) ) & + * (XBETAI/PT(:)**2 - XGAMI/PT(:)) +! +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:DQSATI_O_DT_1D',1,ZHOOK_HANDLE) +END FUNCTION DQSATI_O_DT_1D +! +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! ############################################################## + FUNCTION DQSATI_O_DT_3D(PT,PP,PQSAT) RESULT(PDQSAT) +! ############################################################## +! +!!**** *QSATW * - function to compute saturation vapor humidity from +!! temperature (with respect to ice) +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPW) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAW) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMW) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! Finally, dqsat / dT (T) is computed. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPW : Constant for saturation vapor pressure function +!! XBETAW : Constant for saturation vapor pressure function +!! XGAMW : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg)) +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: PDQSAT ! derivative according + ! to temperature of + ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg)) +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +ZFOES(:,:,:) = PP(:,:,:) / (1.+XRD/XRV*(1./PQSAT(:,:,:)-1.)) +! +!* 3. DERIVATION ACCORDING TO TEMPERATURE +! ----------------------------------- +! +PDQSAT(:,:,:) = PQSAT(:,:,:) / (1.+(XRD/XRV-1.)*ZFOES(:,:,:)/PP(:,:,:) ) & + * (XBETAI/PT(:,:,:)**2 - XGAMI/PT(:,:,:)) +! +!------------------------------------------------------------------------------- +! +END FUNCTION DQSATI_O_DT_3D +! +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! +! ###################################### + FUNCTION QSATI_3D(PT,PP) RESULT(PQSAT) +! ###################################### +! +!!**** *QSATI * - function to compute saturation vapor humidity from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPI) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAI) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMI) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPI : Constant for saturation vapor pressure function +!! XBETAI : Constant for saturation vapor pressure function +!! XGAMI : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!! S. Riette april 2011 : protection in high statosphere where ZFOES > PP +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg) +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2),SIZE(PT,3)) :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATI_3D',0,ZHOOK_HANDLE) +ZFOES(:,:,:) = MIN(EXP( XALPI - XBETAI/PT(:,:,:) - XGAMI*LOG(PT(:,:,:)) ), 0.99*PP(:,:,:)) +! +!* 2. COMPUTE SATURATION HUMIDITY +! --------------------------- +! +PQSAT(:,:,:) = XRD/XRV*ZFOES(:,:,:)/PP(:,:,:) & + / (1.+(XRD/XRV-1.)*ZFOES(:,:,:)/PP(:,:,:)) +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATI_3D',1,ZHOOK_HANDLE) +END FUNCTION QSATI_3D +! +!------------------------------------------------------------------------------- +! +! ###################################### + FUNCTION QSATI_2D(PT,PP) RESULT(PQSAT) +! ###################################### +! +!!**** *QSATI * - function to compute saturation vapor humidity from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPI) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAI) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMI) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPI : Constant for saturation vapor pressure function +!! XBETAI : Constant for saturation vapor pressure function +!! XGAMI : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!! S. Riette april 2011 : protection in high statosphere where ZFOES > PP +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:,:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(:,:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2)) :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg) +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2)) :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATI_2D',0,ZHOOK_HANDLE) +ZFOES(:,:) = MIN(EXP( XALPI - XBETAI/PT(:,:) - XGAMI*LOG(PT(:,:)) ), 0.99*PP(:,:)) +! +!* 2. COMPUTE SATURATION HUMIDITY +! --------------------------- +! +PQSAT(:,:) = XRD/XRV*ZFOES(:,:)/PP(:,:) & + / (1.+(XRD/XRV-1.)*ZFOES(:,:)/PP(:,:)) +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATI_2D',1,ZHOOK_HANDLE) +END FUNCTION QSATI_2D +! +!------------------------------------------------------------------------------- +! +! ################################################# + FUNCTION QSATI_2D_MASK(OMASK,PT,PP) RESULT(PQSAT) +! ################################################# +! +!!**** *QSATI * - function to compute saturation vapor humidity from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPI) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAI) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMI) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPI : Constant for saturation vapor pressure function +!! XBETAI : Constant for saturation vapor pressure function +!! XGAMI : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!! S. Riette april 2011 : protection in high statosphere where ZFOES > PP +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASK ! Localization mask +REAL, DIMENSION(:,:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(:,:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2)) :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg) +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PT,1),SIZE(PT,2)) :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATI_2D_MASK',0,ZHOOK_HANDLE) +WHERE (OMASK(:,:)) +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! + ZFOES(:,:) = MIN(EXP( XALPI - XBETAI/PT(:,:) - XGAMI*LOG(PT(:,:)) ), 0.99*PP(:,:)) +! +!* 2. COMPUTE SATURATION HUMIDITY +! --------------------------- +! + PQSAT(:,:) = XRD/XRV*ZFOES(:,:)/PP(:,:) & + / (1.+(XRD/XRV-1.)*ZFOES(:,:)/PP(:,:)) +ELSEWHERE +! +!* 3. BOGUS VALUE +! ----------- +! + PQSAT(:,:) = 0. +END WHERE +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATI_2D_MASK',1,ZHOOK_HANDLE) +END FUNCTION QSATI_2D_MASK +! +!------------------------------------------------------------------------------- +! +! ###################################### + FUNCTION QSATI_1D(PT,PP) RESULT(PQSAT) +! ###################################### +! +!!**** *QSATI * - function to compute saturation vapor humidity from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPI) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAI) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMI) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPI : Constant for saturation vapor pressure function +!! XBETAI : Constant for saturation vapor pressure function +!! XGAMI : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!! S. Riette april 2011 : protection in high statosphere where ZFOES > PP +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, DIMENSION(:), INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, DIMENSION(:), INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL, DIMENSION(SIZE(PT,1)) :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg) +! +!* 0.2 Declarations of local variables +! +REAL, DIMENSION(SIZE(PT,1)) :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATI_1D',0,ZHOOK_HANDLE) +ZFOES(:) = MIN(EXP( XALPI - XBETAI/PT(:) - XGAMI*LOG(PT(:)) ), 0.99*PP(:)) +! +!* 2. COMPUTE SATURATION HUMIDITY +! --------------------------- +! +PQSAT(:) = XRD/XRV*ZFOES(:)/PP(:) & + / (1.+(XRD/XRV-1.)*ZFOES(:)/PP(:)) +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATI_1D',1,ZHOOK_HANDLE) +END FUNCTION QSATI_1D +! +!------------------------------------------------------------------------------- +! +! ###################################### + FUNCTION QSATI_0D(PT,PP) RESULT(PQSAT) +! ###################################### +! +!!**** *QSATI * - function to compute saturation vapor humidity from +!! temperature +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute the saturation vapor +! pressure from temperature +! +! +!!** METHOD +!! ------ +!! Given temperature T (PT), the saturation vapor pressure es(T) +!! (FOES(PT)) is computed by integration of the Clapeyron equation +!! from the triple point temperature Tt (XTT) and the saturation vapor +!! pressure of the triple point es(Tt) (XESTT), i.e +!! +!! es(T)= EXP( alphaw - betaw /T - gammaw Log(T) ) +!! +!! with : +!! alphaw (XALPI) = LOG(es(Tt))+ betaw/Tt + gammaw Log(Tt) +!! betaw (XBETAI) = Lv(Tt)/Rv + gammaw Tt +!! gammaw (XGAMI) = (Cl -Cpv) /Rv +!! +!! Then, the specific humidity at saturation is deduced. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : comtains physical constants +!! XALPI : Constant for saturation vapor pressure function +!! XBETAI : Constant for saturation vapor pressure function +!! XGAMI : Constant for saturation vapor pressure function +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/09/98 +!! S. Riette april 2011 : protection in high statosphere where ZFOES > PP +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! +! +REAL, INTENT(IN) :: PT ! Temperature + ! (Kelvin) +REAL, INTENT(IN) :: PP ! Pressure + ! (Pa) +REAL :: PQSAT ! saturation vapor + ! specific humidity + ! with respect to + ! water (kg/kg) +! +!* 0.2 Declarations of local variables +! +REAL :: ZFOES ! saturation vapor + ! pressure + ! (Pascal) +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE SATURATION VAPOR PRESSURE +! --------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATI_0D',0,ZHOOK_HANDLE) +ZFOES = MIN(EXP( XALPI - XBETAI/PT - XGAMI*LOG(PT) ), 0.99*PP) +! +!* 2. COMPUTE SATURATION HUMIDITY +! --------------------------- +! +PQSAT = XRD/XRV*ZFOES/PP / (1.+(XRD/XRV-1.)*ZFOES/PP) +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('MODE_THERMO:QSATI_0D',1,ZHOOK_HANDLE) +END FUNCTION QSATI_0D +! +!------------------------------------------------------------------------------- +END MODULE MODE_THERMO diff --git a/src/mesonh/turb/ini_cturb.f90 b/src/mesonh/turb/ini_cturb.f90 index 245dfa0632b533d2855e56b9fc3459a9e51a48cd..4da0d6452f856d60d7f795669619c3eca4dcc6ba 100644 --- a/src/mesonh/turb/ini_cturb.f90 +++ b/src/mesonh/turb/ini_cturb.f90 @@ -73,8 +73,15 @@ END MODULE MODI_INI_CTURB USE MODD_CST USE MODD_CTURB ! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! IMPLICIT NONE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('INI_CTURB',0,ZHOOK_HANDLE) +! ! --------------------------------------------------------------------------- ! ! 1. SETTING THE NUMERICAL VALUES @@ -85,7 +92,6 @@ IMPLICIT NONE !XCED is now replaced by XCEDIS !XCED = 0.70 !XCED = 0.84 -! ! Redelsperger-Sommeria (1981) = 0.70 ! Schmidt-Schumann (1989) = 0.845 ! Cheng-Canuto-Howard (2002) = 0.845 @@ -251,4 +257,5 @@ XSBL_O_BL = 0.05 ! SBL height / BL height ratio XFTOP_O_FSURF = 0.05 ! Fraction of surface (heat or momentum) flux used to define top of BL ! ! +IF (LHOOK) CALL DR_HOOK('INI_CTURB',1,ZHOOK_HANDLE) END SUBROUTINE INI_CTURB diff --git a/src/mesonh/turb/modd_diag_in_run.f90 b/src/mesonh/turb/modd_diag_in_run.f90 index b7bba80d0c045a7787cf64d952de4b44c6a2961f..6f9829570ec8a9f75685491317b5adc86b18e623 100644 --- a/src/mesonh/turb/modd_diag_in_run.f90 +++ b/src/mesonh/turb/modd_diag_in_run.f90 @@ -3,11 +3,6 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 modd 2006/10/24 10:07:40 -!----------------------------------------------------------------- MODULE MODD_DIAG_IN_RUN ! Modifications !! 02/2018 Q.Libois ECRAD diff --git a/src/mesonh/turb/mode_sbl.f90 b/src/mesonh/turb/mode_sbl.f90 deleted file mode 100644 index 1c5e1da7f4600a7d6fe0a5a228b4708bab55c526..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/mode_sbl.f90 +++ /dev/null @@ -1,457 +0,0 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 mode 2006/05/18 13:07:25 -!----------------------------------------------------------------- -! ############### - MODULE MODE_SBL -! ############### -! -!!**** *MODE_SBL * - contains Surface Boundary Layer characteristics functions -!! -!! PURPOSE -!! ------- -! -!!** METHOD -!! ------ -!! -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! Businger et al 1971, Wyngaard and Cote 1974 -!! -!! -!! AUTHOR -!! ------ -!! V. Masson * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 13/10/99 -!! V. Masson 06/11/02 optimization and add Businger fonction for TKE -!! V. Masson 01/01/03 use PAULSON_PSIM function -!----------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! -! -INTERFACE BUSINGER_PHIM - MODULE PROCEDURE BUSINGER_PHIM_0D - MODULE PROCEDURE BUSINGER_PHIM_1D - MODULE PROCEDURE BUSINGER_PHIM_2D - MODULE PROCEDURE BUSINGER_PHIM_3D -END INTERFACE -INTERFACE BUSINGER_PHIH - MODULE PROCEDURE BUSINGER_PHIH_0D - MODULE PROCEDURE BUSINGER_PHIH_1D - MODULE PROCEDURE BUSINGER_PHIH_2D - MODULE PROCEDURE BUSINGER_PHIH_3D -END INTERFACE -INTERFACE BUSINGER_PHIE - MODULE PROCEDURE BUSINGER_PHIE_3D -END INTERFACE -INTERFACE PAULSON_PSIM - MODULE PROCEDURE PAULSON_PSIM_0D - MODULE PROCEDURE PAULSON_PSIM_1D - MODULE PROCEDURE PAULSON_PSIM_2D -END INTERFACE -INTERFACE LMO - MODULE PROCEDURE LMO_0D - MODULE PROCEDURE LMO_1D - MODULE PROCEDURE LMO_2D -END INTERFACE -INTERFACE USTAR - MODULE PROCEDURE USTAR_0D - MODULE PROCEDURE USTAR_1D - MODULE PROCEDURE USTAR_2D -END INTERFACE -! -!------------------------------------------------------------------------------- -CONTAINS -!------------------------------------------------------------------------------- -! -FUNCTION BUSINGER_PHIM_3D(PZ_O_LMO) - REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ_O_LMO - REAL, DIMENSION(SIZE(PZ_O_LMO,1), & - SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: BUSINGER_PHIM_3D -! - WHERE ( PZ_O_LMO(:,:,:) < 0. ) - BUSINGER_PHIM_3D(:,:,:) = (1.-15.*PZ_O_LMO)**(-0.25) - ELSEWHERE - BUSINGER_PHIM_3D(:,:,:) = 1. + 4.7 * PZ_O_LMO - END WHERE -END FUNCTION BUSINGER_PHIM_3D -! -!------------------------------------------------------------------------------- -! -FUNCTION BUSINGER_PHIM_2D(PZ_O_LMO) - REAL, DIMENSION(:,:), INTENT(IN) :: PZ_O_LMO - REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: BUSINGER_PHIM_2D -! - WHERE ( PZ_O_LMO(:,:) < 0. ) - BUSINGER_PHIM_2D(:,:) = (1.-15.*PZ_O_LMO)**(-0.25) - ELSEWHERE - BUSINGER_PHIM_2D(:,:) = 1. + 4.7 * PZ_O_LMO - END WHERE -END FUNCTION BUSINGER_PHIM_2D -! -!------------------------------------------------------------------------------- -! -FUNCTION BUSINGER_PHIM_1D(PZ_O_LMO) - REAL, DIMENSION(:), INTENT(IN) :: PZ_O_LMO - REAL, DIMENSION(SIZE(PZ_O_LMO)) :: BUSINGER_PHIM_1D -! - WHERE ( PZ_O_LMO(:) < 0. ) - BUSINGER_PHIM_1D(:) = (1.-15.*PZ_O_LMO)**(-0.25) - ELSEWHERE - BUSINGER_PHIM_1D(:) = 1. + 4.7 * PZ_O_LMO - END WHERE -END FUNCTION BUSINGER_PHIM_1D -! -!------------------------------------------------------------------------------- -! -FUNCTION BUSINGER_PHIM_0D(PZ_O_LMO) - REAL, INTENT(IN) :: PZ_O_LMO - REAL :: BUSINGER_PHIM_0D -! - IF ( PZ_O_LMO < 0. ) THEN - BUSINGER_PHIM_0D = (1.-15.*PZ_O_LMO)**(-0.25) - ELSE - BUSINGER_PHIM_0D = 1. + 4.7 * PZ_O_LMO - END IF -END FUNCTION BUSINGER_PHIM_0D -! -!------------------------------------------------------------------------------- -!------------------------------------------------------------------------------- -! -FUNCTION BUSINGER_PHIH_3D(PZ_O_LMO) - REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ_O_LMO - REAL, DIMENSION(SIZE(PZ_O_LMO,1), & - SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: BUSINGER_PHIH_3D -! - WHERE ( PZ_O_LMO(:,:,:) < 0. ) - BUSINGER_PHIH_3D(:,:,:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5) - ELSEWHERE - BUSINGER_PHIH_3D(:,:,:) = 0.74 + 4.7 * PZ_O_LMO - END WHERE -END FUNCTION BUSINGER_PHIH_3D -! -!------------------------------------------------------------------------------- -! -FUNCTION BUSINGER_PHIH_2D(PZ_O_LMO) - REAL, DIMENSION(:,:), INTENT(IN) :: PZ_O_LMO - REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: BUSINGER_PHIH_2D -! - WHERE ( PZ_O_LMO(:,:) < 0. ) - BUSINGER_PHIH_2D(:,:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5) - ELSEWHERE - BUSINGER_PHIH_2D(:,:) = 0.74 + 4.7 * PZ_O_LMO - END WHERE -END FUNCTION BUSINGER_PHIH_2D -! -!------------------------------------------------------------------------------- -! -FUNCTION BUSINGER_PHIH_1D(PZ_O_LMO) - REAL, DIMENSION(:), INTENT(IN) :: PZ_O_LMO - REAL, DIMENSION(SIZE(PZ_O_LMO)) :: BUSINGER_PHIH_1D -! - WHERE ( PZ_O_LMO(:) < 0. ) - BUSINGER_PHIH_1D(:) = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5) - ELSEWHERE - BUSINGER_PHIH_1D(:) = 0.74 + 4.7 * PZ_O_LMO - END WHERE -END FUNCTION BUSINGER_PHIH_1D -! -!------------------------------------------------------------------------------- -! -FUNCTION BUSINGER_PHIH_0D(PZ_O_LMO) - REAL, INTENT(IN) :: PZ_O_LMO - REAL :: BUSINGER_PHIH_0D -! - IF ( PZ_O_LMO < 0. ) THEN - BUSINGER_PHIH_0D = 0.74 * (1.-9.*PZ_O_LMO)**(-0.5) - ELSE - BUSINGER_PHIH_0D = 0.74 + 4.7 * PZ_O_LMO - END IF -END FUNCTION BUSINGER_PHIH_0D -! -!------------------------------------------------------------------------------- -!------------------------------------------------------------------------------- -! -FUNCTION BUSINGER_PHIE_3D(PZ_O_LMO) - USE MODD_CTURB - REAL, DIMENSION(:,:,:), INTENT(IN) :: PZ_O_LMO - REAL, DIMENSION(SIZE(PZ_O_LMO,1), & - SIZE(PZ_O_LMO,2),SIZE(PZ_O_LMO,3)) :: BUSINGER_PHIE_3D -! - WHERE ( PZ_O_LMO(:,:,:) < 0. ) - BUSINGER_PHIE_3D(:,:,:) = (1.+(-PZ_O_LMO)**(2./3.)/XALPSBL) & - * (1.-15.*PZ_O_LMO)**(0.5) - ELSEWHERE - BUSINGER_PHIE_3D(:,:,:) = 1./(1. + 4.7 * PZ_O_LMO)**2 - END WHERE -END FUNCTION BUSINGER_PHIE_3D -! -!------------------------------------------------------------------------------- -!------------------------------------------------------------------------------- -! -FUNCTION PAULSON_PSIM_2D(PZ_O_LMO) - USE MODD_CST - REAL, DIMENSION(:,:), INTENT(IN) :: PZ_O_LMO - REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: PAULSON_PSIM_2D -! - REAL, DIMENSION(SIZE(PZ_O_LMO,1),SIZE(PZ_O_LMO,2)) :: ZX - - ZX=1. - WHERE ( PZ_O_LMO(:,:) < 0. ) - ZX=(1.-15.*PZ_O_LMO)**(0.25) - PAULSON_PSIM_2D(:,:) = LOG( (1.+ZX**2)*(1+ZX)**2/8. ) - 2.*ATAN(ZX) + XPI/2. - ELSEWHERE - PAULSON_PSIM_2D(:,:) = - 4.7 * PZ_O_LMO - END WHERE -END FUNCTION PAULSON_PSIM_2D -! -!------------------------------------------------------------------------------- -! -FUNCTION PAULSON_PSIM_1D(PZ_O_LMO) - USE MODD_CST - REAL, DIMENSION(:), INTENT(IN) :: PZ_O_LMO - REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: PAULSON_PSIM_1D -! - REAL, DIMENSION(SIZE(PZ_O_LMO,1)) :: ZX - - ZX=1. - WHERE ( PZ_O_LMO(:) < 0. ) - ZX=(1.-15.*PZ_O_LMO)**(0.25) - PAULSON_PSIM_1D(:) = LOG( (1.+ZX**2)*(1+ZX)**2/8. ) - 2.*ATAN(ZX) + XPI/2. - ELSEWHERE - PAULSON_PSIM_1D(:) = - 4.7 * PZ_O_LMO - END WHERE -END FUNCTION PAULSON_PSIM_1D -! -!------------------------------------------------------------------------------- -! -FUNCTION PAULSON_PSIM_0D(PZ_O_LMO) - USE MODD_CST - REAL, INTENT(IN) :: PZ_O_LMO - REAL :: PAULSON_PSIM_0D -! - REAL :: ZX - - ZX=1. - IF ( PZ_O_LMO < 0. ) THEN - ZX=(1.-15.*PZ_O_LMO)**(0.25) - PAULSON_PSIM_0D = LOG( (1.+ZX**2)*(1+ZX)**2/8. ) - 2.*ATAN(ZX) + XPI/2. - ELSE - PAULSON_PSIM_0D = - 4.7 * PZ_O_LMO - END IF -END FUNCTION PAULSON_PSIM_0D -! -!------------------------------------------------------------------------------- -!------------------------------------------------------------------------------- -! -FUNCTION LMO_2D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV) - USE MODD_CST - USE MODD_PARAMETERS - REAL, DIMENSION(:,:), INTENT(IN) :: PUSTAR - REAL, DIMENSION(:,:), INTENT(IN) :: PTHETA - REAL, DIMENSION(:,:), INTENT(IN) :: PRV - REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH - REAL, DIMENSION(:,:), INTENT(IN) :: PSFRV - REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: LMO_2D -! - REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: ZTHETAV - REAL, DIMENSION(SIZE(PUSTAR,1),SIZE(PUSTAR,2)) :: ZQ0 - REAL :: ZEPS -! -! - ZEPS=(XRV-XRD)/XRD - ZTHETAV(:,:) = PTHETA(:,:) * ( 1. +ZEPS * PRV(:,:)) - ZQ0 (:,:) = PSFTH(:,:) + ZTHETAV(:,:) * ZEPS * PSFRV(:,:) -! - LMO_2D(:,:) = XUNDEF - WHERE ( ZQ0(:,:) /=0. ) & - LMO_2D(:,:) = - MAX(PUSTAR(:,:),1.E-6)**3 & - / ( XKARMAN * XG / ZTHETAV(:,:) *ZQ0(:,:) ) - -END FUNCTION LMO_2D -! -!------------------------------------------------------------------------------- -! -FUNCTION LMO_1D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV) - USE MODD_CST - USE MODD_PARAMETERS - REAL, DIMENSION(:), INTENT(IN) :: PUSTAR - REAL, DIMENSION(:), INTENT(IN) :: PTHETA - REAL, DIMENSION(:), INTENT(IN) :: PRV - REAL, DIMENSION(:), INTENT(IN) :: PSFTH - REAL, DIMENSION(:), INTENT(IN) :: PSFRV - REAL, DIMENSION(SIZE(PUSTAR)) :: LMO_1D -! - REAL, DIMENSION(SIZE(PUSTAR)) :: ZTHETAV - REAL :: ZEPS -! -! - ZEPS=(XRV-XRD)/XRD -! - ZTHETAV(:) = PTHETA(:) * ( 1. +ZEPS * PRV(:)) -! - LMO_1D(:) = XUNDEF - WHERE ( PSFTH(:)/ZTHETAV(:)+ZEPS*PSFRV(:)/=0. ) & - LMO_1D(:) = - MAX(PUSTAR(:),1.E-6)**3 & - / ( XKARMAN * ( XG / ZTHETAV(:) * PSFTH(:) & - + XG * ZEPS * PSFRV(:) ) ) -END FUNCTION LMO_1D -! -!------------------------------------------------------------------------------- -! -FUNCTION LMO_0D(PUSTAR,PTHETA,PRV,PSFTH,PSFRV) - USE MODD_CST - USE MODD_PARAMETERS - REAL, INTENT(IN) :: PUSTAR - REAL, INTENT(IN) :: PTHETA - REAL, INTENT(IN) :: PRV - REAL, INTENT(IN) :: PSFTH - REAL, INTENT(IN) :: PSFRV - REAL :: LMO_0D -! - REAL :: ZTHETAV - REAL :: ZEPS -! -! - ZEPS=(XRV-XRD)/XRD -! -! - ZTHETAV = PTHETA * ( 1. +ZEPS * PRV) -! - LMO_0D = XUNDEF - IF ( PSFTH/ZTHETAV+ZEPS*PSFRV/=0. ) & - LMO_0D = - MAX(PUSTAR,1.E-6)**3 & - / ( XKARMAN * ( XG / ZTHETAV * PSFTH & - + XG * ZEPS * PSFRV ) ) -END FUNCTION LMO_0D -! -!------------------------------------------------------------------------------- -!------------------------------------------------------------------------------- -! -FUNCTION USTAR_2D(PU,PV,PZ,PZ0,PLMO) - USE MODD_CST - USE MODD_PARAMETERS - REAL, DIMENSION(:,:), INTENT(IN) :: PU - REAL, DIMENSION(:,:), INTENT(IN) :: PV - REAL, DIMENSION(:,:), INTENT(IN) :: PZ - REAL, DIMENSION(:,:), INTENT(IN) :: PZ0 - REAL, DIMENSION(:,:), INTENT(IN) :: PLMO - REAL, DIMENSION(SIZE(PU,1),SIZE(PU,2)) :: USTAR_2D - - REAL, DIMENSION(SIZE(PU,1),SIZE(PU,2)) :: ZZ_O_LMO - REAL, DIMENSION(SIZE(PU,1),SIZE(PU,2)) :: ZZ0_O_LMO -! -!* purely unstable case - USTAR_2D(:,:) = 0. - ZZ_O_LMO(:,:) = XUNDEF - ZZ0_O_LMO(:,:) = XUNDEF -! -!* general case - WHERE(ABS(PLMO) > 1.E-20 .AND. PLMO/=XUNDEF) - ZZ_O_LMO = PZ(:,:) / PLMO(:,:) - ZZ0_O_LMO = PZ0(:,:) / PLMO(:,:) - USTAR_2D(:,:) = SQRT( PU(:,:)**2+PV(:,:)**2 ) & - * XKARMAN / ( LOG(PZ(:,:)/PZ0(:,:)) & - - PAULSON_PSIM(ZZ_O_LMO(:,:)) & - + PAULSON_PSIM(ZZ0_O_LMO(:,:)) ) - END WHERE -! -!* purely neutral case - WHERE(PLMO==XUNDEF) - ZZ_O_LMO = 0. - USTAR_2D(:,:) = SQRT( PU(:,:)**2+PV(:,:)**2 ) & - * XKARMAN / LOG(PZ(:,:)/PZ0(:,:)) - END WHERE -! -END FUNCTION USTAR_2D -! -!------------------------------------------------------------------------------- -! -FUNCTION USTAR_1D(PU,PV,PZ,PZ0,PLMO) - USE MODD_CST - USE MODD_PARAMETERS - REAL, DIMENSION(:), INTENT(IN) :: PU - REAL, DIMENSION(:), INTENT(IN) :: PV - REAL, DIMENSION(:), INTENT(IN) :: PZ - REAL, DIMENSION(:), INTENT(IN) :: PZ0 - REAL, DIMENSION(:), INTENT(IN) :: PLMO - REAL, DIMENSION(SIZE(PU)) :: USTAR_1D - - REAL, DIMENSION(SIZE(PU)) :: ZZ_O_LMO - REAL, DIMENSION(SIZE(PU)) :: ZZ0_O_LMO -! -!* purely unstable case - USTAR_1D(:) = 0. - ZZ_O_LMO(:) = XUNDEF - ZZ0_O_LMO(:) = XUNDEF -! -!* general case - WHERE(ABS(PLMO) > 1.E-20 .AND. PLMO/=XUNDEF) - ZZ_O_LMO = PZ(:) / PLMO(:) - ZZ0_O_LMO = PZ0(:) / PLMO(:) - USTAR_1D(:) = SQRT( PU(:)**2+PV(:)**2 ) & - * XKARMAN / ( LOG(PZ(:)/PZ0(:)) & - - PAULSON_PSIM(ZZ_O_LMO(:)) & - + PAULSON_PSIM(ZZ0_O_LMO(:)) ) - END WHERE -! -!* purely neutral case - WHERE(PLMO==XUNDEF) - ZZ_O_LMO = 0. - USTAR_1D(:) = SQRT( PU(:)**2+PV(:)**2 ) & - * XKARMAN / LOG(PZ(:)/PZ0(:)) - END WHERE -! -END FUNCTION USTAR_1D -! -!------------------------------------------------------------------------------- -! -FUNCTION USTAR_0D(PU,PV,PZ,PZ0,PLMO) - USE MODD_CST - USE MODD_PARAMETERS - REAL, INTENT(IN) :: PU - REAL, INTENT(IN) :: PV - REAL, INTENT(IN) :: PZ - REAL, INTENT(IN) :: PZ0 - REAL, INTENT(IN) :: PLMO - REAL :: USTAR_0D -! -!* purely unstable case - USTAR_0D = 0. -! -!* general case - IF ( ABS(PLMO) >= 1.E-20 .AND. PLMO/=XUNDEF) & - USTAR_0D = SQRT( PU**2+PV**2 ) & - * XKARMAN / ( LOG(PZ/PZ0) & - - PAULSON_PSIM(PZ/PLMO) & - + PAULSON_PSIM(PZ0/PLMO)) -! -!* purely neutral case - IF (PLMO==XUNDEF) & - USTAR_0D = SQRT( PU**2+PV**2 ) & - * XKARMAN / LOG(PZ/PZ0) - -END FUNCTION USTAR_0D -! -!------------------------------------------------------------------------------- -! -END MODULE MODE_SBL