diff --git a/src/arome/aux/mode_ll.F90 b/src/arome/aux/mode_ll.F90 index 030d629310c1918c8b3f7779ff880b31324457cc..7e905cf6b6295d24391d8a14438ca0207dbeafa5 100644 --- a/src/arome/aux/mode_ll.F90 +++ b/src/arome/aux/mode_ll.F90 @@ -1,6 +1,6 @@ MODULE MODE_ll -use mode_argslist_ll - +USE MODE_ARGSLIST_ll +USE MODE_TOOLS IMPLICIT NONE CONTAINS SUBROUTINE GET_INDICE_ll(KXOR, KYOR, KXEND, KYEND, KSIZE1, KSIZE2) diff --git a/src/arome/aux/mode_tools.F90 b/src/arome/aux/mode_tools.F90 new file mode 100644 index 0000000000000000000000000000000000000000..58f4710ade38450b6b509bd01b05236e3c763f9a --- /dev/null +++ b/src/arome/aux/mode_tools.F90 @@ -0,0 +1,19 @@ +MODULE MODE_TOOLS +IMPLICIT NONE +CONTAINS +LOGICAL FUNCTION LNORTH_ll() + LNORTH_ll=.FALSE. +END FUNCTION LNORTH_ll +! +LOGICAL FUNCTION LEAST_ll() + LEAST_ll=.FALSE. +END FUNCTION LEAST_ll +! +LOGICAL FUNCTION LWEST_ll() + LWEST_ll=.FALSE. +END FUNCTION LWEST_ll +! +LOGICAL FUNCTION LSOUTH_ll() + LSOUTH_ll=.FALSE. +END FUNCTION LSOUTH_ll +END MODULE MODE_TOOLS diff --git a/src/arome/gmkpack_ignored_files b/src/arome/gmkpack_ignored_files index 1d3c455969a374ca79d8d836b2e5323c5fb1d728..fef2386b7927a902e3118334c2f86fd3921b208f 100644 --- a/src/arome/gmkpack_ignored_files +++ b/src/arome/gmkpack_ignored_files @@ -93,3 +93,10 @@ phyex/turb/turb_ver_thermo_corr.F90 phyex/turb/turb_ver_dyn_flux.F90 phyex/turb/turb_ver_sv_flux.F90 phyex/turb/turb_ver_sv_corr.F90 +phyex/turb/tm06.F90 +phyex/turb/tm06_h.F90 +phyex/turb/tridiag.F90 +phyex/turb/tridiag_wind.F90 +phyex/turb/tridiag_thermo.F90 +phyex/turb/tridiag_tke.F90 +phyex/turb/tridiag_massflux.F90 diff --git a/src/common/turb/turb.F90 b/src/common/turb/turb.F90 index c33809ed69adcf26082d57b1cf3b2b19960b9f35..9bfa00590f540579dc15c0df3400d9867f71ebc6 100644 --- a/src/common/turb/turb.F90 +++ b/src/common/turb/turb.F90 @@ -1,4 +1,8 @@ -! ######spl +!MNH_LIC Copyright 1994-2021 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. +!----------------------------------------------------------------- SUBROUTINE TURB(KKA,KKU,KKL,KMI,KRR,KRRL,KRRI,HLBCX,HLBCY, & & KSPLIT,KMODEL_CL, & & OCLOSE_OUT,OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01, & @@ -21,10 +25,6 @@ & YDDDH,YDLDDH,YDMDDH, & & TBUDGETS, KBUDGETS, & & PTR,PDISS,PEDR ) - - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK - USE MODD_CTURB, ONLY : LHARAT ! ################################################################# ! ! @@ -127,7 +127,6 @@ !! Module MODD_BUDGET: !! NBUMOD !! CBUTYPE -!! NBUPROCCTR !! LBU_RU !! LBU_RV !! LBU_RW @@ -220,11 +219,15 @@ !* 0. DECLARATIONS ! ------------ ! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! USE MODD_PARAMETERS USE MODD_CST USE MODD_CTURB USE MODD_CONF USE MODD_BUDGET +USE MODD_FIELD, ONLY: TFIELDDATA,TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LES USE MODD_NSV @@ -244,6 +247,7 @@ USE MODI_GRADIENT_W USE MODE_TM06, ONLY: TM06 USE MODI_UPDATE_LM ! +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE USE MODE_SBL USE MODE_FMWRIT ! @@ -442,11 +446,6 @@ INTEGER :: IKT ! array size in k direction INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain INTEGER :: JRR,JK,JSV ! loop counters INTEGER :: JI,JJ ! loop counters -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: IGRID ! C-grid indicator in LFIFM file -INTEGER :: ILENCH ! Length of comment string in LFIFM file -CHARACTER (LEN=100) :: YCOMMENT ! comment string in LFIFM file -CHARACTER (LEN=16) :: YRECFM ! Name of the desired field in LFIFM file REAL :: ZL0 ! Max. Mixing Length in Blakadar formula REAL :: ZALPHA ! proportionnality constant between Dz/2 and ! ! BL89 mixing length near the surface @@ -456,6 +455,7 @@ TYPE(TFILEDATA) :: TPFILE ! File type to write fields for MesoNH ! REAL :: ZTIME1, ZTIME2 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZSHEAR, ZDUDZ, ZDVDZ +TYPE(TFIELDDATA) :: TZFIELD ! !* 1.PRELIMINARIES ! ------------- @@ -556,18 +556,30 @@ IF (KRRL >=1) THEN END IF ! ! - IF (OCLOSE_OUT .AND. OTURB_DIAG) THEN - YRECFM ='ATHETA' - YCOMMENT='X_Y_Z_ATHETA (M)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZATHETA,IGRID,ILENCH,YCOMMENT,IRESP) + IF ( TPFILE%LOPENED .AND. OTURB_DIAG ) THEN + TZFIELD%CMNHNAME = 'ATHETA' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'ATHETA' + TZFIELD%CUNITS = 'm' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_ATHETA' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZATHETA) ! - YRECFM ='AMOIST' - YCOMMENT='X_Y_Z_AMOIST (M)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZAMOIST,IGRID,ILENCH,YCOMMENT,IRESP) + TZFIELD%CMNHNAME = 'AMOIST' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'AMOIST' + TZFIELD%CUNITS = 'm' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_AMOIST' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZAMOIST) END IF ! ELSE @@ -655,11 +667,8 @@ END SELECT ! !* 3.5 Mixing length modification for cloud ! ----------------------- -IF (KMODEL_CL==KMI .AND. HTURBLEN_CL/='NONE' ) CALL CLOUD_MODIF_LM -ENDIF ! - -! -! +IF (KMODEL_CL==KMI .AND. HTURBLEN_CL/='NONE') CALL CLOUD_MODIF_LM +ENDIF ! end LHARRAT ! !* 3.6 Dissipative length @@ -946,35 +955,51 @@ ENDIF !* 7. STORES SOME INFORMATIONS RELATED TO THE TURBULENCE SCHEME ! --------------------------------------------------------- ! -IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN - YCOMMENT=' ' +IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! ! stores the mixing length ! - YRECFM ='LM' - YCOMMENT='X_Y_Z_LM (M)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZLM,IGRID,ILENCH,YCOMMENT,IRESP) + TZFIELD%CMNHNAME = 'LM' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LM' + TZFIELD%CUNITS = 'm' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'Mixing length' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZLM) ! IF (KRR /= 0) THEN ! ! stores the conservative potential temperature ! - YRECFM ='THLM' - YCOMMENT='X_Y_Z_THLM (KELVIN)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PTHLM,IGRID,ILENCH,YCOMMENT,IRESP) + TZFIELD%CMNHNAME = 'THLM' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'THLM' + TZFIELD%CUNITS = 'K' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'Conservative potential temperature' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PTHLM) ! ! stores the conservative mixing ratio ! - YRECFM ='RNPM' - YCOMMENT='X_Y_Z_RNPM (KG/KG)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PRM(:,:,:,1),IGRID,ILENCH, & - YCOMMENT,IRESP) + TZFIELD%CMNHNAME = 'RNPM' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RNPM' + TZFIELD%CUNITS = 'kg kg-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'Conservative mixing ratio' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PRM(:,:,:,1)) END IF END IF ! @@ -1093,13 +1118,14 @@ CONTAINS !! MODIFICATIONS !! ------------- !! Original 24/06/99 +!! J.Escobar 21/03/2013: for HALOK comment all NHALO=1 test !! !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ -!USE MODE_ll -!USE MODD_ARGSLIST_ll, ONLY : LIST_ll +USE MODE_ll +USE MODD_ARGSLIST_ll, ONLY : LIST_ll USE MODD_CONF ! IMPLICIT NONE @@ -1111,45 +1137,47 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PUSLOPE,PVSLOPE ! !* 0.2 Declarations of local variables : ! -INTEGER :: IIB,IIE,IJB,IJE ! index values for the physical subdomain -!TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange -!INTEGER :: IINFO_ll ! return code of parallel routine +INTEGER :: IIB,IIE,IJB,IJE,IIU,IJU ! index values for the physical subdomain +TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange +INTEGER :: IINFO_ll ! return code of parallel routine REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('TURB:UPDATE_ROTATE_WIND',0,ZHOOK_HANDLE) ! !* 1 PROLOGUE ! -!NULLIFY(TZFIELDS_ll) +NULLIFY(TZFIELDS_ll) ! -!CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +IIU=SIZE(PUSLOPE,1) +IJU=SIZE(PUSLOPE,2) +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE,IIU,IJU) ! ! 2 Update halo if necessary ! -!IF (NHALO == 1) THEN -! CALL ADD2DFIELD_ll(TZFIELDS_ll,PUSLOPE) -! CALL ADD2DFIELD_ll(TZFIELDS_ll,PVSLOPE) -! CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) -! CALL CLEANLIST_ll(TZFIELDS_ll) -!ENDIF +!!$IF (NHALO == 1) THEN + CALL ADD2DFIELD_ll( TZFIELDS_ll, PUSLOPE, 'UPDATE_ROTATE_WIND::PUSLOPE' ) + CALL ADD2DFIELD_ll( TZFIELDS_ll, PVSLOPE, 'UPDATE_ROTATE_WIND::PVSLOPE' ) + CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) + CALL CLEANLIST_ll(TZFIELDS_ll) +!!$ENDIF ! ! 3 Boundary conditions for non cyclic case ! -!IF ( HLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN -! PUSLOPE(IIB-1,:)=PUSLOPE(IIB,:) -! PVSLOPE(IIB-1,:)=PVSLOPE(IIB,:) -!END IF -!IF ( HLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN -! PUSLOPE(IIE+1,:)=PUSLOPE(IIE,:) -! PVSLOPE(IIE+1,:)=PVSLOPE(IIE,:) -!END IF -!IF ( HLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN -! PUSLOPE(:,IJB-1)=PUSLOPE(:,IJB) -! PVSLOPE(:,IJB-1)=PVSLOPE(:,IJB) -!END IF -!IF( HLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN -! PUSLOPE(:,IJE+1)=PUSLOPE(:,IJE) -! PVSLOPE(:,IJE+1)=PVSLOPE(:,IJE) -!END IF +IF ( HLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN + PUSLOPE(IIB-1,:)=PUSLOPE(IIB,:) + PVSLOPE(IIB-1,:)=PVSLOPE(IIB,:) +END IF +IF ( HLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN + PUSLOPE(IIE+1,:)=PUSLOPE(IIE,:) + PVSLOPE(IIE+1,:)=PVSLOPE(IIE,:) +END IF +IF ( HLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN + PUSLOPE(:,IJB-1)=PUSLOPE(:,IJB) + PVSLOPE(:,IJB-1)=PVSLOPE(:,IJB) +END IF +IF( HLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN + PUSLOPE(:,IJE+1)=PUSLOPE(:,IJE) + PVSLOPE(:,IJE+1)=PVSLOPE(:,IJE) +END IF ! IF (LHOOK) CALL DR_HOOK('TURB:UPDATE_ROTATE_WIND',1,ZHOOK_HANDLE) ! @@ -1545,12 +1573,18 @@ ENDIF ! ----------------------------------------------- ! ! Impression before modification of the mixing length -IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN - YRECFM ='LM_CLEAR_SKY' - YCOMMENT='X_Y_Z_LM CLEAR SKY (M)' - IGRID = 1 - ILENCH = LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZLM,IGRID,ILENCH,YCOMMENT,IRESP) +IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN + TZFIELD%CMNHNAME = 'LM_CLEAR_SKY' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LM_CLEAR_SKY' + TZFIELD%CUNITS = 'm' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_LM CLEAR SKY' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZLM) ENDIF ! ! Amplification of the mixing length when the criteria are verified @@ -1565,18 +1599,29 @@ WHERE (PCEI(:,:,:) == -1.) ZLM(:,:,:) = ZLM_CLOUD(:,:,:) !* 5. IMPRESSION ! ---------- ! -IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN - YRECFM ='COEF_AMPL' - YCOMMENT='X_Y_Z_COEF AMPL (-)' - IGRID = 1 - ILENCH = LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZCOEF_AMPL,IGRID,ILENCH,YCOMMENT,IRESP) +IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN + TZFIELD%CMNHNAME = 'COEF_AMPL' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'COEF_AMPL' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_COEF AMPL' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZCOEF_AMPL) ! - YRECFM ='LM_CLOUD' - YCOMMENT='X_Y_Z_LM CLOUD (M)' - IGRID = 1 - ILENCH = LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZLM_CLOUD,IGRID,ILENCH,YCOMMENT,IRESP) + TZFIELD%CMNHNAME = 'LM_CLOUD' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'LM_CLOUD' + TZFIELD%CUNITS = 'm' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_LM CLOUD' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + CALL IO_Field_write(TPFILE,TZFIELD,ZLM_CLOUD) ! ENDIF ! diff --git a/src/mesonh/turb/turb.f90 b/src/mesonh/turb/turb.f90 index 228241e2ce6e40965f1766ef2b8396210a08c4c9..69149850d09c29fbbeecea281ea5c68e9cc6ba76 100644 --- a/src/mesonh/turb/turb.f90 +++ b/src/mesonh/turb/turb.f90 @@ -386,7 +386,7 @@ USE MODI_UPDATE_LM USE MODI_GET_HALO ! use mode_budget, only: Budget_store_init, Budget_store_end -USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE USE MODE_SBL use mode_sources_neg_correct, only: Sources_neg_correct ! @@ -698,7 +698,7 @@ IF (KRRL >=1) THEN END IF ! ! - IF ( tpfile%lopened .AND. OTURB_DIAG ) THEN + IF ( TPFILE%LOPENED .AND. OTURB_DIAG ) THEN TZFIELD%CMNHNAME = 'ATHETA' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'ATHETA' @@ -1148,7 +1148,7 @@ CALL TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKET,PLEM,ZLEPS,PDYP,ZTRH, & !* 7. STORES SOME INFORMATIONS RELATED TO THE TURBULENCE SCHEME ! --------------------------------------------------------- ! -IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN +IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! ! stores the mixing length ! @@ -1287,9 +1287,6 @@ IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF - -! - ! !---------------------------------------------------------------------------- ! @@ -1819,7 +1816,7 @@ ENDIF ! ----------------------------------------------- ! ! Impression before modification of the mixing length -IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN +IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN TZFIELD%CMNHNAME = 'LM_CLEAR_SKY' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'LM_CLEAR_SKY' @@ -1845,7 +1842,7 @@ WHERE (PCEI(:,:,:) == -1.) PLEM(:,:,:) = ZLM_CLOUD(:,:,:) !* 5. IMPRESSION ! ---------- ! -IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN +IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN TZFIELD%CMNHNAME = 'COEF_AMPL' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'COEF_AMPL'