diff --git a/docs/TODO b/docs/TODO index 6146bf71d91118dfc05759a0b16550c7e21f79d3..1dd58b63451a32f1fd203bf31e7ff01462fa0dbc 100644 --- a/docs/TODO +++ b/docs/TODO @@ -1,6 +1,5 @@ -LOCEAN: - La clé LOCEAN est dans un module spécifique à Méso-NH (MODD_DYNn). - Une solution serait de créer un module propre à PHYEX qui contiendrait des clés de contrôle de haut niveau +Module de clés namelists PHYEX +Une solution serait de créer un module propre à PHYEX qui contiendrait des clés de contrôle de haut niveau pour la physique (y en a-t-il d'autres?). Ce module serait initialisé dans Méso-NH à partir de la clé actuelle qui est sans doute utilisée ailleurs dans le code de Méso-NH @@ -10,10 +9,19 @@ Dependencies: - liste dans document Interfaces - pour AROME placés, en attendant, dans phyex/externals -Clé de compilation REPRO48 ajoutée pour permettre de reproduire le cycle 48, elle: -- contourne des corrections de bug -- modifie l'organisation de calculs -Cette clé devra être supprimée +Clé de compilation REPRO48 + REPRO55 ajoutées pour permettre de reproduire le cycle 48 MNH-5.5.0, elles: +- contournent des corrections de bug +- modifient l'organisation de calculs +Ces clés devront être supprimées + +Ecrire doc sur marche à suivre pour intégrer un nouveau développement: +- dev dans MNH à faire en array-syntax +- dev dans AROME à faire en boucles do +- intégration dans PHYEX: en array-syntax avec directives mnh_expand +- les 3 tests suivants doivent donner les mêmes résultats (au bit près) dans chacun des deux modèles: + - compilation directe sans activer mnh_expand + - compilation en activant mnh_expand + - exécution en changeant le nombre de processeurs Merge pb: - ice4_nucleation_wrapper: @@ -22,11 +30,12 @@ Merge pb: Ryad a fait des tests pour regarder impact des allocatable sur CPU => temps * 2 Code à nettoyer quelque soit l'option retenue Dernier code de Ryad: /home/gmap/mrpm/khatib/public/modset/mods_ice4_nucleation_wrapper.tgz et/ou /home/gmap/mrpm/khatib/public/modset/ice4_nucleation_wrapper.f90 + +- rain_ice_red: le cas test MesoNH n'est pas bit repro (diffs > 1% sur rapports de melange) + sur la modif src/mesonh/rain_ice_red au commit bdd10dd (First rain_ice new/red merge) - shallow_mf (appels dans aro_shallow et arp_shallow): Dans Méso-NH: shallow_mf doit être appelé avec PDX=XDXHAT(1) et PDY=XDYHAT(1) Dans AROME/ARP: où trouver la taille de maille? - Pour l'instant 2 versions à cause de l'interface à compute_uprfat_rhcj10 -- compute_updraft_rhcj10: en attente retour de Rachel et/ou Yves pour faire le merge Etape 2: array syntax -> loop - en profiter pour supprimer args PA/PB des routines appelées depuis ice4_tendencies, comme pour nucleation @@ -39,17 +48,25 @@ Etape 2: array syntax -> loop Pb identifiés à corriger plus tard: - deposition devrait être déplacée dans ice4_tendencies -- non reproduction en changeant le nombre de procs - avec les optimisations de Ryad, les tableaux 3D de precip passés à ice4_tendencies lorsque HSUBG_RC_RR_ACCR=='PRFR' ne sont pas utilisables puisque les K1, K2 et K3 sont relatifs à la boucle IMICRO et que les calculs faits en debut de routine ne concernent qu'une partie des points => à corriger -- seules les options oper ont été testées, il manque des test pour sedim_after, nmaxiter, xmrstep, xtstep, autoconv, rainfr +- seules quelques options sont testées avec les cas test (par exemple, il faudrait tester RMC01 mais + l'option n'est pas remontée en namelist) +- les options CMF_CLOUD='STAT' et LOSIGAMS=.FALSE. semblent cassées en 48 original - arome/ini_cmfshall devrait s'appeler ini_param_mfshall - th_r_from_thl_rt appelée partout, il faudrait limiter à OTEST +- la recompilation complète d'AROME n'est pas testée +- il faudrait inclure un cas test plus conséquent en taille au moins sur belenos +- doute sur le codage de MODD_PRECISION +- appel à abort à travers print_msg non testé +- lignes vides ajoutées après les macros mnh_expand +- indentation inorrecte dans les blocs mnh_expand +- sedimentation momentum non branchée -Répertoire arome/ext contient les codes non PHYEX qu'il faut modifier dans le pack pour qu'il puisse être compilé. +Répertoire arome/ext et mesonh/ext contient les codes non PHYEX qu'il faut modifier dans le pack pour qu'il puisse être compilé. Ce répertoire devra être vidé à la fin du phasage, les modifications nécessaires ayadevront avoir été fournies par ailleurs Budgets/DDH @@ -58,9 +75,19 @@ Budgets/DDH - nettoyage necessaire des routines budgets: - etape 1: adaptation GPU en passant la structure => permettra d'identifier avec certitude les variables utiles - etape 2: suppr des codes qui ne sont pas appelés, ménage modd_budget, ini_budget... Je pense que seul aro_ini_budget est utile +- Le module modd_dyn n'est utilisé que pour les budgets, voir s'il peut être supprimé +- Le code des budgets devrait être revu: pas en phase avec celui de Méso-NH et phasage a priori + inutile car très peu de code semble réellement utile pour AROME SPP - modd_spp_type est pour l'instant dans mpa/micro/externals mais n'est pas de la microphysique -Gradients/shuman: -- essayer de mettre des abort dans les routines arome (shuman doit suffire) +Nettoyage apl_arome non fait (pb a la compilation) ==> 4 arguments dans aro_turb_mnh supprimés (non utilisés) + +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 contenter de recevoir le numero d'unité logique + +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/aux/budget_DDH.F90 b/src/arome/aux/budget_DDH.F90 index f934798c0b769d8f9ea4845f8144d585700a8def..5e448dc8eab5cc7bd501f1b4905e85cf019e244f 100644 --- a/src/arome/aux/budget_DDH.F90 +++ b/src/arome/aux/budget_DDH.F90 @@ -105,8 +105,17 @@ IF (SIZE(PVARS,3)==NFLEVGDDH+2) THEN ELSE IOFF=0 ENDIF - -CLPROC=HBUVAR(1:MIN(4, LEN(HBUVAR)))//REPEAT('_', MAX(0, 4-LEN(HBUVAR))) !if length is less than 4, fill with '_' +!if length is less than 4, fill with budget old names +IF(LEN(HBUVAR)==1) THEN + CLPROC=HBUVAR(1:MIN(4, LEN(HBUVAR)))//'_BU' +ELSE IF(LEN(HBUVAR)==2) THEN + CLPROC=HBUVAR(1:MIN(4, LEN(HBUVAR)))//'_B' +ELSE IF(LEN(HBUVAR)==3) THEN + CLPROC=HBUVAR(1:MIN(4, LEN(HBUVAR)))//'_' +ELSE + CLPROC=HBUVAR(1:MIN(4, LEN(HBUVAR))) +END IF +! IF (YDLDDH%LDDH_OMP) THEN CLDDH='T'//YDDDH%YVARMULT(KBUDN)%CNAME//CLPROC ELSE diff --git a/src/arome/aux/get_halo.F90 b/src/arome/aux/get_halo.F90 new file mode 100644 index 0000000000000000000000000000000000000000..443d33f13241e2a260c8c44e9368a58c57515ac9 --- /dev/null +++ b/src/arome/aux/get_halo.F90 @@ -0,0 +1,33 @@ +!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. +!----------------------------------------------------------------- +! Modifications: +! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +!----------------------------------------------------------------- +! #################### + MODULE MODI_GET_HALO +! #################### +! +INTERFACE +! +SUBROUTINE GET_HALO(PSRC) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRC ! variable at t +! +END SUBROUTINE GET_HALO +! +END INTERFACE +! +END MODULE MODI_GET_HALO +! +!------------------------------------------------------------------------------- +! ######################### + SUBROUTINE GET_HALO(PSRC) +! ######################### +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRC ! variable at t +! +END SUBROUTINE GET_HALO +!----------------------------------------------------------------------- diff --git a/src/arome/aux/gradient_m.F90 b/src/arome/aux/gradient_m.F90 index f9427caa265cc37dae1bdb44642a546531c1d7e8..1bd9756426595532b522bad83ab2cf96f73fa4c1 100644 --- a/src/arome/aux/gradient_m.F90 +++ b/src/arome/aux/gradient_m.F90 @@ -70,8 +70,8 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise ! REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_M_M ! result mass point @@ -101,7 +101,7 @@ END IF IF (LHOOK) CALL DR_HOOK('GX_M_M',1,ZHOOK_HANDLE) END FUNCTION GX_M_M ! ######spl - FUNCTION GX_M_U(PY,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_M_U) + FUNCTION GX_M_U(KKA, KKU, KL,PY,PDXX,PDZZ,PDZX) RESULT(PGX_M_U) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ################################################## @@ -329,8 +329,8 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise ! REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_M_M ! result mass point ! @@ -359,7 +359,7 @@ ENDIF IF (LHOOK) CALL DR_HOOK('GY_M_M',1,ZHOOK_HANDLE) END FUNCTION GY_M_M ! ######spl - FUNCTION GY_M_V(PY,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_M_V) + FUNCTION GY_M_V(KKA,KKU,KL,PY,PDYY,PDZZ,PDZY) RESULT(PGY_M_V) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ################################################## @@ -551,8 +551,8 @@ IMPLICIT NONE ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise ! REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_M_M ! result mass point ! @@ -575,7 +575,7 @@ PGZ_M_M(:,:,:)= MZF(DZM(PA(:,:,:), KKA, KKU, KL)/PDZZ(:,:,:), KKA, KKU, KL) IF (LHOOK) CALL DR_HOOK('GZ_M_M',1,ZHOOK_HANDLE) END FUNCTION GZ_M_M ! ######spl - FUNCTION GZ_M_W(PY,PDZZ, KKA, KKU, KL) RESULT(PGZ_M_W) + FUNCTION GZ_M_W(KKA, KKU, KL,PY,PDZZ) RESULT(PGZ_M_W) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ######################################### diff --git a/src/arome/aux/gradient_u.F90 b/src/arome/aux/gradient_u.F90 index 96c0af25be42efcb11f3efb8f6f76e57db7840b8..317019d2014db20ac8fc6f79609aaf7c1f058c4e 100644 --- a/src/arome/aux/gradient_u.F90 +++ b/src/arome/aux/gradient_u.F90 @@ -66,8 +66,8 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -168,8 +168,8 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -261,8 +261,8 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! diff --git a/src/arome/aux/gradient_v.F90 b/src/arome/aux/gradient_v.F90 index 3dd2f23776cf0b1c4904a2ab6a743aa516af4d19..53e81c083c4eab01f0fa7b816c3042ed1ee73f10 100644 --- a/src/arome/aux/gradient_v.F90 +++ b/src/arome/aux/gradient_v.F90 @@ -66,8 +66,8 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -165,8 +165,8 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -260,8 +260,8 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! diff --git a/src/arome/aux/gradient_w.F90 b/src/arome/aux/gradient_w.F90 index b17ca4bab07ca090d3b9610d453bc6f35b6a3fcc..66216739e6808d13c0b75b3ce38b496968f1fc5d 100644 --- a/src/arome/aux/gradient_w.F90 +++ b/src/arome/aux/gradient_w.F90 @@ -56,8 +56,8 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -147,8 +147,8 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -236,8 +236,8 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments and result ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! diff --git a/src/arome/aux/ibm_mixinglength.f90 b/src/arome/aux/ibm_mixinglength.f90 new file mode 100644 index 0000000000000000000000000000000000000000..766627888e3d49a472bd2eaa7a0b49bb58667abe --- /dev/null +++ b/src/arome/aux/ibm_mixinglength.f90 @@ -0,0 +1,35 @@ +!MNH_LIC Copyright 2019-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. +!----------------------------------------------------------------- +! +! ############################ +MODULE MODI_IBM_MIXINGLENGTH + ! ############################ + ! + INTERFACE + ! + SUBROUTINE IBM_MIXINGLENGTH(PLM,PLEPS,PMU,PHI,PTKE) + ! + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLM + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(OUT) :: PMU + REAL, DIMENSION(:,:,:), INTENT(IN) :: PHI + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + ! + END SUBROUTINE IBM_MIXINGLENGTH + ! + END INTERFACE +END MODULE MODI_IBM_MIXINGLENGTH + ! + SUBROUTINE IBM_MIXINGLENGTH(PLM,PLEPS,PMU,PHI,PTKE) + ! + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLM + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLEPS + REAL, DIMENSION(:,:,:), INTENT(OUT) :: PMU + REAL, DIMENSION(:,:,:), INTENT(IN) :: PHI + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE + ! + END SUBROUTINE IBM_MIXINGLENGTH + ! diff --git a/src/arome/aux/ini_budget.F90 b/src/arome/aux/ini_budget.F90 index 20100d5b4582a05468c3e4eb82c7cf63d7a83d3f..9506cd1df51623445d6551c72846420b4a972e83 100644 --- a/src/arome/aux/ini_budget.F90 +++ b/src/arome/aux/ini_budget.F90 @@ -83,8 +83,6 @@ !* 0. DECLARATIONS ! ------------ ! -USE MODE_FM -! USE MODD_PARAMETERS USE MODD_BUDGET USE MODD_DYN diff --git a/src/arome/aux/modd_argslist_ll.F90 b/src/arome/aux/modd_argslist_ll.F90 new file mode 100644 index 0000000000000000000000000000000000000000..03db23cd5a89650e7edb31d43c3f24d97a602bec --- /dev/null +++ b/src/arome/aux/modd_argslist_ll.F90 @@ -0,0 +1,6 @@ +MODULE MODD_ARGSLIST_ll +IMPLICIT NONE +TYPE LIST_ll +END TYPE LIST_ll +CONTAINS +END MODULE MODD_ARGSLIST_ll diff --git a/src/arome/micro/modd_dyn.F90 b/src/arome/aux/modd_dyn.F90 similarity index 100% rename from src/arome/micro/modd_dyn.F90 rename to src/arome/aux/modd_dyn.F90 diff --git a/src/arome/aux/modd_field.F90 b/src/arome/aux/modd_field.F90 new file mode 100644 index 0000000000000000000000000000000000000000..be5755c73358e0bfa715f4e4f4120b1a53364927 --- /dev/null +++ b/src/arome/aux/modd_field.F90 @@ -0,0 +1,29 @@ +MODULE MODD_FIELD + USE MODD_PARAMETERS, ONLY: NGRIDUNKNOWN, NMNHNAMELGTMAX, NSTDNAMELGTMAX + INTEGER, PARAMETER :: NMNHDIM_UNKNOWN = -2 + INTEGER, PARAMETER :: NMNHMAXDIMS = 6 ! Cannot be less than 6 + INTEGER,PARAMETER :: TYPEUNDEF = -1, TYPEINT = 1, TYPELOG = 2, TYPEREAL = 3, TYPECHAR = 4, TYPEDATE = 5 +! +TYPE TFIELDDATA + CHARACTER(LEN=NMNHNAMELGTMAX) :: CMNHNAME = '' !Name of the field (for MesoNH, non CF convention) + CHARACTER(LEN=NSTDNAMELGTMAX) :: CSTDNAME = '' !Standard name (CF convention) + CHARACTER(LEN=32) :: CLONGNAME = '' !Long name (CF convention) + CHARACTER(LEN=40) :: CUNITS = '' !Canonical units (CF convention) + CHARACTER(LEN=100) :: CCOMMENT = '' !Comment (for MesoNH, non CF convention) + INTEGER :: NGRID = NGRIDUNKNOWN !Localization on the model grid + INTEGER :: NTYPE = TYPEUNDEF !Datatype + INTEGER :: NDIMS = 0 !Number of dimensions + INTEGER, DIMENSION(NMNHMAXDIMS) :: NDIMLIST = NMNHDIM_UNKNOWN ! List of dimensions of the data field + ! + INTEGER :: NFILLVALUE = -2147483647 !Fill value for integer fields + REAL :: XFILLVALUE = 9.9692099683868690e+36 !Fill value for real fields + INTEGER :: NVALIDMIN = -2147483646 !Minimum valid value for integer fields + INTEGER :: NVALIDMAX = 2147483647 !Maximum valid value for integer fields + REAL :: XVALIDMIN = -1.E36 !Minimum valid value for real fields + REAL :: XVALIDMAX = 1.E36 !Maximum valid value for real fields + CHARACTER(LEN=2) :: CDIR = '' !Type of the data field (XX,XY,--...) + CHARACTER(LEN=4) :: CLBTYPE = 'NONE' !Type of the lateral boundary (LBX,LBY,LBXU,LBYV) + LOGICAL :: LTIMEDEP = .FALSE. !Is the field time-dependent? +END TYPE TFIELDDATA +! +END MODULE MODD_FIELD diff --git a/src/arome/aux/modd_frc.F90 b/src/arome/aux/modd_frc.F90 new file mode 100644 index 0000000000000000000000000000000000000000..e1d77673e8619106b68cb329fa2ed58c96844cf3 --- /dev/null +++ b/src/arome/aux/modd_frc.F90 @@ -0,0 +1,112 @@ +!MNH_LIC Copyright 1996-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. +!----------------------------------------------------------------- +! ############### + MODULE MODD_FRC +! ############### +! +!!*** *MODD_FRC - Declarative module for the forcing fields +!! +!! PURPOSE +!! ------- +! This module contains NFRC 1D-arrays used by FORCING (geostrophic wind +! components, large scale vertical wind, theta and humidity profiles when +! the relaxation option is used,large scale theta and humidity gradients +! and the translation speed of the domain of simulation. +! The following control parameters are used by FORCING: +! - LGEOST_UV_FRC and LGEOST_TH_FRC +! - LTEND_THRV_FRC and LTEND_UV_FRC +! - LVERT_MOTION_FRC +! - LRELAX_THRV_FRC, LRELAX_UV_FRC and LRELAX_UVMEAN_FRC using: +! XRELAX_TIME_FRC, XRELAX_HEIGHT_FRC and CRELAX_HEIGHT_TYPE +! - LTRANS +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (module MODD_FRC) +!! +!! +!! AUTHOR +!! ------ +!! Marc Georgelin Labo d'aerologie +!! +!! MODIFICATIONS +!! ------------- +!! Original 29/07/96 +!! 29/07/96 (Pinty&Suhre) revised +!! 18/11/96 J.-P. Pinty addition of the translation +!! 27/01/98 P. Bechtold use tendency forcing +!! add SST and surface pressure forcing +!! 01/2004 V. Masson surface externalization: removes SST forcing +!! 09/2017 Q.Rodier add LTEND_UV_FRC +!! 03/2021 JL Redelsperger Parameters defining sfc forcing shape for idealized ocean case +!! 06/2021 F. Couvreux add LRELAX_UVMEAN_FRC +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +!USE MODD_TYPE_DATE +! +IMPLICIT NONE +! +!* fields for FORCING +! ------------------ +! +INTEGER, SAVE :: NFRC ! number of forcing profiles +!TYPE (DATE_TIME), SAVE, DIMENSION(:), ALLOCATABLE :: TDTFRC ! date of + ! each forcing profile +! +REAL, SAVE, DIMENSION(:,:), ALLOCATABLE :: XUFRC, &! geostrophic wind + XVFRC, &! components U and V + XWFRC ! large scale vertical wind +REAL, SAVE, DIMENSION(:,:), ALLOCATABLE :: XTHFRC, &! large scale TH profile + XRVFRC ! large scale RV profile +REAL, SAVE, DIMENSION(:,:), ALLOCATABLE :: XGXTHFRC,&! large scale TH gradient + XGYTHFRC ! along the X and Y axis +REAL, SAVE, DIMENSION(:,:), ALLOCATABLE :: XTENDTHFRC,&! large scale TH tendency + XTENDRVFRC ! large scale RV tendency +REAL, SAVE :: XUTRANS, &! horizontal components of + XVTRANS ! a constant + ! Galilean TRANSlation +REAL, SAVE, DIMENSION(:), ALLOCATABLE :: XPGROUNDFRC! surf. pressure +REAL, SAVE, DIMENSION(:,:), ALLOCATABLE :: XTENDUFRC ! large scale U tendency +REAL, SAVE, DIMENSION(:,:), ALLOCATABLE :: XTENDVFRC ! large scale V tendency +! +!* control parameters for FORCING +! ------------------------------ +! +LOGICAL, SAVE :: LGEOST_UV_FRC ! enables geostrophic wind term +LOGICAL, SAVE :: LGEOST_TH_FRC ! enables thermal wind advection +LOGICAL, SAVE :: LTEND_THRV_FRC ! enables tendency forcing +LOGICAL, SAVE :: LTEND_UV_FRC ! enables tendency forcing of the wind +LOGICAL, SAVE :: LVERT_MOTION_FRC ! enables prescribed a forced vertical + ! transport for all prognostic variables +LOGICAL, SAVE :: LRELAX_THRV_FRC ! enables temp. and humidity relaxation +LOGICAL, SAVE :: LRELAX_UV_FRC ! enables horizontal wind relaxation applied to the full wind field +LOGICAL, SAVE :: LRELAX_UVMEAN_FRC ! enables horizontal wind relaxation applied to the horiz. avg. wind +! +REAL, SAVE :: XRELAX_TIME_FRC ! e-folding time for relaxation +REAL, SAVE :: XRELAX_HEIGHT_FRC ! height below which relaxation + ! is never applied +CHARACTER(len=4), SAVE :: CRELAX_HEIGHT_TYPE ! "THGR" relax. above maximal dTH/dz + ! (but always above XRELAX_HEIGHT_FRC) + ! "FIXE" relax. above XRELAX_HEIGHT_FRC +! +LOGICAL, SAVE :: LTRANS ! enables a Galilean translation of the + ! domain of simulation +LOGICAL, SAVE :: LPGROUND_FRC ! enables surf. pressure forcing +! +LOGICAL, SAVE :: LDEEPOC ! activates sfc forcing for ideal ocean deep conv +REAL, SAVE :: XCENTX_OC ! center of sfc forc for ideal ocean +REAL, SAVE :: XRADX_OC ! radius of sfc forc for ideal ocean +REAL, SAVE :: XCENTY_OC ! center of sfc forc for ideal ocean +REAL, SAVE :: XRADY_OC ! radius of sfc forc for ideal ocean +! +END MODULE MODD_FRC diff --git a/src/arome/aux/modd_ibm_paramn.f90 b/src/arome/aux/modd_ibm_paramn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..716a93e6d6da60bf1ca8f19e2ecdffa9faf2fc32 --- /dev/null +++ b/src/arome/aux/modd_ibm_paramn.f90 @@ -0,0 +1,15 @@ +!MNH_LIC Copyright 2019-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. +!----------------------------------------------------------------- +! +! ####################### +MODULE MODD_IBM_PARAM_n + ! ####################### + IMPLICIT NONE + LOGICAL :: LIBM,LIBM_TROUBLE + REAL, DIMENSION(:,:,:,:) , POINTER :: XIBM_LS=>NULL() ! LSF for MNH + REAL, DIMENSION(:,:,:) , POINTER :: XIBM_XMUT=>NULL() +END MODULE MODD_IBM_PARAM_n +! diff --git a/src/arome/micro/modd_lunit.F90 b/src/arome/aux/modd_lunit.F90 similarity index 100% rename from src/arome/micro/modd_lunit.F90 rename to src/arome/aux/modd_lunit.F90 diff --git a/src/arome/aux/modd_oceanh.F90 b/src/arome/aux/modd_oceanh.F90 new file mode 100644 index 0000000000000000000000000000000000000000..6638752658492bb2a477b6781ca92fe885bfcf04 --- /dev/null +++ b/src/arome/aux/modd_oceanh.F90 @@ -0,0 +1,47 @@ +!MNH_LIC Copyright 2021-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. +!----------------------------------------------------------------- +! ################# + MODULE MODD_OCEANH +! ################# +! +!!**** *MODD_OCEAN* - declaration of variables used in ocean version +!! +!! PURPOSE +!! ------- +! Declarative module for the variables +!! at interface for OCEAN LES MESONH version including auto-coupling O-A LES +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! AUTHOR +!! ------ +!! JL Redelsperger LOPS +!! +!! MODIFICATIONS +!! ------------- +!! Original 03/2021 +! +!* 0. DECLARATIONS +! ------------ +! +!USE MODD_TYPE_DATE +! +IMPLICIT NONE +! +!* fields for Sea Sfc FORCINGs +! ------------------ +! +INTEGER, SAVE :: NFRCLT ! number of sea surface forcings PLUS 1 +INTEGER, SAVE :: NINFRT ! Interval in second between forcings +!TYPE (DATE_TIME), SAVE, DIMENSION(:), ALLOCATABLE :: TFRCLT ! date/time of sea surface forcings +REAL, SAVE, DIMENSION(:,:), ALLOCATABLE :: XSSUFL,XSSVFL,XSSTFL,XSSOLA ! Time evol Flux U V T Solar_Rad at sea surface +REAL, SAVE, DIMENSION(:,:), ALLOCATABLE :: XSSUFL_XY,XSSVFL_XY,XSSTFL_XY! XY flux shape +REAL, SAVE, DIMENSION(:), ALLOCATABLE :: XSSUFL_T,XSSVFL_T,XSSTFL_T,XSSOLA_T ! given time forcing fluxes +! +END MODULE MODD_OCEANH diff --git a/src/arome/micro/modd_parameters.F90 b/src/arome/aux/modd_parameters.F90 similarity index 55% rename from src/arome/micro/modd_parameters.F90 rename to src/arome/aux/modd_parameters.F90 index 4a1ea98602b6c3ed50c1bb4db0c6c4a46c94d075..45a4d73ae4301935106388511142030005c191e4 100644 --- a/src/arome/micro/modd_parameters.F90 +++ b/src/arome/aux/modd_parameters.F90 @@ -1,4 +1,9 @@ -! ######spl +!MNH_LIC Copyright 1994-2020 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_PARAMETERS ! ###################### ! @@ -50,17 +55,37 @@ INTEGER, PARAMETER :: JPBUPROMAX = 60 ! Maximum of allowed processes for all INTEGER, PARAMETER :: JPRIMMAX = 6 ! Maximum number of points for the ! horizontal relaxation for the outermost verticals INTEGER, PARAMETER :: JPSVMAX = 200 ! Maximum number of scalar variables +INTEGER, PARAMETER :: JPSVNAMELGTMAX = 10 ! Maximum length of a scalar variable name (do not set to less than 10) ! ! REAL, PARAMETER :: XUNDEF = 1.E+20 ! default value for undefined or unused -! ! field. -INTEGER, PARAMETER :: NUNDEF = 1E+9 ! default value for undefined or unused -! ! field. +! ! field. +REAL, PARAMETER :: XNEGUNDEF = -999. ! default value for undefined or unused +! ! field (negative value guaranteed) +INTEGER, PARAMETER :: NUNDEF = 1E+9 ! default value for undefined or unused +! ! field. +INTEGER, PARAMETER :: NNEGUNDEF = -999 ! default value for undefined or unused +! ! field (negative value guaranteed) INTEGER, PARAMETER :: JPDUMMY = 20 ! Size of dummy array ! INTEGER, PARAMETER :: JPOUTMAX = 192 ! Maximum allowed number of OUTput files +INTEGER, PARAMETER :: JPOUTVARMAX = 192 ! Maximum allowed number of variables in an output file +! +INTEGER, PARAMETER :: NBUNAMELGTMAX = 32 ! Maximum length of a budget name +INTEGER, PARAMETER :: NCOMMENTLGTMAX = 100 ! Maximum length of a comment +INTEGER, PARAMETER :: NMNHNAMELGTMAX = 32 ! Maximum length of a MNH variable name +INTEGER, PARAMETER :: NSTDNAMELGTMAX = 64 ! Maximum length of the standard name of a variable (CF convention) +! +INTEGER, PARAMETER :: NDIRNAMELGTMAX = 512 ! Maximum length of a directory name +INTEGER, PARAMETER :: NFILENAMELGTMAX = 32 ! Maximum length of a file name (must be at least NFILENAMELGTMAXLFI) +INTEGER, PARAMETER :: NFILENAMELGTMAXLFI = 28 ! Maximum length of a file name in LFI file (this is necessary + ! to keep backward compatibility), MUST BE 28 +! +INTEGER, PARAMETER :: NLFIMAXCOMMENTLENGTH = 100 ! Length of comments in LFI files ! INTEGER, PARAMETER :: JPLIMACCNMAX = 10 ! Maximum allowed number of CCN modes in LIMA INTEGER, PARAMETER :: JPLIMAIFNMAX = 10 ! Maximum allowed number of IFN modes in LIMA ! +INTEGER, PARAMETER :: NGRIDUNKNOWN = -1 ! Unknown Arakawa grid number +! END MODULE MODD_PARAMETERS diff --git a/src/arome/micro/modd_refaro.F90 b/src/arome/aux/modd_ref.F90 similarity index 94% rename from src/arome/micro/modd_refaro.F90 rename to src/arome/aux/modd_ref.F90 index 5d04ef439413f81cd47282608b4d645c7bb96875..c616ef13dad178f46223127c4c1d187ebc5e9242 100644 --- a/src/arome/micro/modd_refaro.F90 +++ b/src/arome/aux/modd_ref.F90 @@ -38,5 +38,6 @@ IMPLICIT NONE ! set to constant value 300k for AROME REAL,SAVE, DIMENSION(2) :: XTHVREFZ=300. ! Thetav(z) for reference ! state without orography +LOGICAL, SAVE ::LCOUPLES ! AUTOCOUPLED ATMS-OCEAN LES VERSION ! END MODULE MODD_REF diff --git a/src/arome/aux/mode_argslist_ll.F90 b/src/arome/aux/mode_argslist_ll.F90 new file mode 100644 index 0000000000000000000000000000000000000000..f80bc15fb3ae6e2d9ebdb0c7d3c6796127648e05 --- /dev/null +++ b/src/arome/aux/mode_argslist_ll.F90 @@ -0,0 +1,44 @@ +MODULE MODE_ARGSLIST_ll +USE MODD_ARGSLIST_ll, ONLY : LIST_ll +CONTAINS + +! + SUBROUTINE CLEANLIST_ll(TPLIST) +IMPLICIT NONE + TYPE(LIST_ll), POINTER :: TPLIST ! List of fields + CALL ABORT + END SUBROUTINE CLEANLIST_ll +! + SUBROUTINE ADD2DFIELD_ll(TPLIST, PFIELD, HNAME) +IMPLICIT NONE + + TYPE(LIST_ll), POINTER :: TPLIST ! list of fields + REAL, DIMENSION(:,:), TARGET :: PFIELD ! field to be added to the list + ! of fields + character(len=*), intent(in) :: HNAME ! Name of the field to be added + ! + CALL ABORT +END SUBROUTINE ADD2DFIELD_ll +! + SUBROUTINE ADD3DFIELD_ll(TPLIST, PFIELD, HNAME) +IMPLICIT NONE + + TYPE(LIST_ll), POINTER :: TPLIST ! list of fields + REAL, DIMENSION(:,:,:), TARGET :: PFIELD ! field to be added to the list + ! of fields + character(len=*), intent(in) :: HNAME ! Name of the field to be added + ! + CALL ABORT +END SUBROUTINE ADD3DFIELD_ll +! + SUBROUTINE ADD4DFIELD_ll(TPLIST, PFIELD, HNAME) +IMPLICIT NONE + + TYPE(LIST_ll), POINTER :: TPLIST ! list of fields + REAL, DIMENSION(:,:,:,:), TARGET :: PFIELD ! field to be added to the list + ! of fields + character(len=*), intent(in) :: HNAME ! Name of the field to be added + ! + CALL ABORT +END SUBROUTINE ADD4DFIELD_ll +END MODULE MODE_ARGSLIST_ll diff --git a/src/arome/aux/mode_gather_ll.F90 b/src/arome/aux/mode_gather_ll.F90 new file mode 100644 index 0000000000000000000000000000000000000000..88c37bbd9acd428168479ea952092f5799ebbf36 --- /dev/null +++ b/src/arome/aux/mode_gather_ll.F90 @@ -0,0 +1,28 @@ +MODULE MODE_GATHER_ll +IMPLICIT NONE + +INTERFACE GATHERALL_FIELD_ll + MODULE PROCEDURE & + GATHERALL_X1, GATHERALL_X3 +END INTERFACE + +CONTAINS +SUBROUTINE GATHERALL_X3(HDIR,PSEND,PRECV,KRESP) +CHARACTER(LEN=*), INTENT(IN) :: HDIR +REAL,DIMENSION(:,:,:), INTENT(IN) :: PSEND +REAL,DIMENSION(:,:,:), INTENT(INOUT):: PRECV +INTEGER, INTENT(INOUT):: KRESP + +CALL ABORT +END SUBROUTINE GATHERALL_X3 +! +SUBROUTINE GATHERALL_X1(HDIR,PSEND,PRECV,KRESP) +CHARACTER(LEN=*), INTENT(IN) :: HDIR +REAL,DIMENSION(:), INTENT(IN) :: PSEND +REAL,DIMENSION(:), INTENT(INOUT):: PRECV +INTEGER, INTENT(INOUT):: KRESP + +CALL ABORT +END SUBROUTINE GATHERALL_X1 +! +END MODULE MODE_GATHER_ll diff --git a/src/arome/aux/mode_io_field_write.F90 b/src/arome/aux/mode_io_field_write.F90 new file mode 100644 index 0000000000000000000000000000000000000000..e1ea4aef4651b7a11ce0bd10319e08bfb59c1edb --- /dev/null +++ b/src/arome/aux/mode_io_field_write.F90 @@ -0,0 +1,16 @@ +MODULE MODE_IO_FIELD_WRITE +USE MODD_IO, ONLY: TFILEDATA +USE MODD_FIELD, ONLY: TFIELDDATA +CONTAINS +SUBROUTINE IO_FIELD_WRITE(TPFILE,TZFIELD,PFIELD) + ! + !* 0.1 Declarations of arguments + ! + TYPE(TFILEDATA), INTENT(IN) :: TPFILE + TYPE(TFIELDDATA), INTENT(IN) :: TZFIELD + REAL, DIMENSION(:,:,:), INTENT(IN) :: PFIELD ! array containing the data field + ! + CALL ABORT +END SUBROUTINE IO_FIELD_WRITE +END MODULE MODE_IO_FIELD_WRITE + diff --git a/src/arome/aux/mode_ll.F90 b/src/arome/aux/mode_ll.F90 index 790a3acac9312351c098993143fe731baf8f60e7..27ab8176073f3333edc5ddc7967af45d6fc7f0f2 100644 --- a/src/arome/aux/mode_ll.F90 +++ b/src/arome/aux/mode_ll.F90 @@ -1,14 +1,44 @@ MODULE MODE_ll +USE MODE_ARGSLIST_ll +USE MODE_TOOLS IMPLICIT NONE CONTAINS SUBROUTINE GET_INDICE_ll(KXOR, KYOR, KXEND, KYEND, KSIZE1, KSIZE2) USE MODD_PARAMETERS, ONLY : JPHEXT IMPLICIT NONE - INTEGER, INTENT(IN) :: KSIZE1, KSIZE2 + INTEGER, INTENT(IN),OPTIONAL :: KSIZE1, KSIZE2 INTEGER, INTENT(OUT) :: KXOR, KYOR, KXEND, KYEND KXOR=1+JPHEXT KYOR=1+JPHEXT KXEND=KSIZE1-JPHEXT KYEND=KSIZE2-JPHEXT END SUBROUTINE GET_INDICE_ll + + SUBROUTINE UPDATE_HALO_ll(TPLIST, KINFO) + USE MODD_ARGSLIST_ll, ONLY : LIST_ll + TYPE(LIST_ll), POINTER :: TPLIST ! pointer to the list of fields to be updated + INTEGER :: KINFO ! return status + CALL ABORT + END SUBROUTINE UPDATE_HALO_ll + + SUBROUTINE GET_DIM_EXT_ll(CBORD,IIU,IJU) + IMPLICIT NONE + CHARACTER(LEN=1), INTENT(IN) :: CBORD + INTEGER, INTENT(IN) :: IIU,IJU + END SUBROUTINE GET_DIM_EXT_ll +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_ll diff --git a/src/arome/aux/mode_mppdb.F90 b/src/arome/aux/mode_mppdb.F90 new file mode 100644 index 0000000000000000000000000000000000000000..982b25d5deed69b423aa5ff6dae001cfe68099af --- /dev/null +++ b/src/arome/aux/mode_mppdb.F90 @@ -0,0 +1,18 @@ +MODULE MODE_MPPDB +IMPLICIT NONE +REAL :: PRECISION = 1e-8 * 0.0 +CONTAINS +SUBROUTINE MPPDB_CHECK3DM(MESSAGE,PRECISION & + ,PTAB1,PTAB2,PTAB3,PTAB4,PTAB5,PTAB6,PTAB7,PTAB8,PTAB9,PTAB10 & + ,PTAB11,PTAB12,PTAB13,PTAB14,PTAB15,PTAB16,PTAB17,PTAB18,PTAB19,PTAB20 & + ) + +IMPLICIT NONE + +CHARACTER(lEN=*) :: MESSAGE +REAL :: PRECISION +REAL, DIMENSION(:,:,:), OPTIONAL :: PTAB1,PTAB2,PTAB3,PTAB4,PTAB5,PTAB6,PTAB7,PTAB8,PTAB9,PTAB10 +REAL, DIMENSION(:,:,:), OPTIONAL :: PTAB11,PTAB12,PTAB13,PTAB14,PTAB15,PTAB16,PTAB17,PTAB18,PTAB19,PTAB20 +! DO NOTHING IN AROME +END SUBROUTINE MPPDB_CHECK3DM +END MODULE MODE_MPPDB diff --git a/src/arome/aux/mode_sources_neg_correct.F90 b/src/arome/aux/mode_sources_neg_correct.F90 new file mode 100644 index 0000000000000000000000000000000000000000..1b49a6e2b22a64880bea7e75e5c32001a106ecda --- /dev/null +++ b/src/arome/aux/mode_sources_neg_correct.F90 @@ -0,0 +1,19 @@ +MODULE MODE_SOURCES_NEG_CORRECT +IMPLICIT NONE +CONTAINS +SUBROUTINE SOURCES_NEG_CORRECT(HCLOUD, HBUDNAME, KRR, PTSTEP, PPABST, & + &PTHT, PRT, PRTHS, PRRS, PRSVS, PRHODJ) +IMPLICIT NONE +CHARACTER(LEN=*), INTENT(IN) :: HCLOUD ! Kind of cloud parameterization +CHARACTER(LEN=*), INTENT(IN) :: HBUDNAME ! Budget name +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +REAL, INTENT(IN) :: PTSTEP ! Timestep +REAL, DIMENSION(:, :, :), INTENT(IN) :: PPABST ! Absolute pressure at time t +REAL, DIMENSION(:, :, :), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:, :, :, :), INTENT(IN) :: PRT ! Moist variables at time t +REAL, DIMENSION(:, :, :), INTENT(INOUT) :: PRTHS ! Source terms +REAL, DIMENSION(:, :, :, :), INTENT(INOUT) :: PRRS ! Source terms +REAL, DIMENSION(:, :, :, :), INTENT(INOUT) :: PRSVS ! Source terms +REAL, DIMENSION(:, :, :), INTENT(IN), OPTIONAL :: PRHODJ ! Dry density * jacobian +END SUBROUTINE SOURCES_NEG_CORRECT +END MODULE MODE_SOURCES_NEG_CORRECT 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 5b68fba7e694270b66663ce33dca2485997a13c6..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 @@ -295,8 +310,6 @@ END FUNCTION SM_FOES_1D ! USE MODD_CST ! -USE MODE_FM -! IMPLICIT NONE ! !* 0.1 Declarations of arguments and results @@ -349,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) @@ -381,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) @@ -444,8 +457,6 @@ END FUNCTION SM_PMR_HU_3D ! USE MODD_CST ! -USE MODE_FM -! IMPLICIT NONE ! !* 0.1 Declarations of arguments and results @@ -526,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/aux/modi_gradient_m.F90 b/src/arome/aux/modi_gradient_m.F90 index 82f5e3c895cedbe9b433086eb3e0a4c370888ec1..ed35df93ab224912e60c3afd8ec7797b009ebc99 100644 --- a/src/arome/aux/modi_gradient_m.F90 +++ b/src/arome/aux/modi_gradient_m.F90 @@ -6,8 +6,8 @@ INTERFACE ! ! FUNCTION GX_M_M(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_M_M) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -19,8 +19,8 @@ END FUNCTION GX_M_M ! ! FUNCTION GY_M_M(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_M_M) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -33,8 +33,8 @@ END FUNCTION GY_M_M ! FUNCTION GZ_M_M(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_M_M) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! @@ -42,7 +42,7 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_M_M ! result mass point ! END FUNCTION GZ_M_M ! - FUNCTION GX_M_U(PY,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_M_U) + FUNCTION GX_M_U(KKA, KKU, KL,PY,PDXX,PDZZ,PDZX) RESULT(PGX_M_U) ! IMPLICIT NONE ! @@ -59,7 +59,7 @@ REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGX_M_U ! result at flux END FUNCTION GX_M_U ! ! - FUNCTION GY_M_V(PY,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_M_V) + FUNCTION GY_M_V(KKA, KKU, KL,PY,PDYY,PDZZ,PDZY) RESULT(PGY_M_V) ! IMPLICIT NONE ! @@ -75,7 +75,7 @@ REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGY_M_V ! result at flux ! side END FUNCTION GY_M_V ! - FUNCTION GZ_M_W(PY,PDZZ, KKA, KKU, KL) RESULT(PGZ_M_W) + FUNCTION GZ_M_W(KKA, KKU, KL,PY,PDZZ) RESULT(PGZ_M_W) ! IMPLICIT NONE ! diff --git a/src/arome/aux/modi_gradient_u.F90 b/src/arome/aux/modi_gradient_u.F90 index 634310304ac65a470e562864b3d89c3c713edeae..519e5cc8138a439f0c7be20a45bae5fc1b89201b 100644 --- a/src/arome/aux/modi_gradient_u.F90 +++ b/src/arome/aux/modi_gradient_u.F90 @@ -6,8 +6,8 @@ INTERFACE ! ! FUNCTION GX_U_M(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_U_M) -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -20,8 +20,8 @@ END FUNCTION GX_U_M ! FUNCTION GY_U_UV(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_U_UV) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -34,8 +34,8 @@ END FUNCTION GY_U_UV ! FUNCTION GZ_U_UW(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_U_UW) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! diff --git a/src/arome/aux/modi_gradient_v.F90 b/src/arome/aux/modi_gradient_v.F90 index eec4d2fe9a2b2aec96f84be5e17e842ec718dc93..d1ff4a08da2f36ef0eb877d26c167bbbcfdd93a1 100644 --- a/src/arome/aux/modi_gradient_v.F90 +++ b/src/arome/aux/modi_gradient_v.F90 @@ -7,8 +7,8 @@ INTERFACE ! FUNCTION GY_V_M(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_V_M) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -20,8 +20,8 @@ END FUNCTION GY_V_M ! FUNCTION GX_V_UV(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_V_UV) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -34,8 +34,8 @@ END FUNCTION GX_V_UV ! FUNCTION GZ_V_VW(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_V_VW) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! diff --git a/src/arome/aux/modi_gradient_w.F90 b/src/arome/aux/modi_gradient_w.F90 index 759319e3d8287c03b5f97936f34ddeca4f2f3348..48d924d53850049ebfcf080437dc0371f3cc1c76 100644 --- a/src/arome/aux/modi_gradient_w.F90 +++ b/src/arome/aux/modi_gradient_w.F90 @@ -7,8 +7,8 @@ INTERFACE ! FUNCTION GZ_W_M(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_W_M) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! @@ -18,8 +18,8 @@ END FUNCTION GZ_W_M ! FUNCTION GX_W_UW(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_W_UW) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz @@ -32,8 +32,8 @@ END FUNCTION GX_W_UW ! FUNCTION GY_W_VW(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGY_W_VW) ! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz diff --git a/src/arome/aux/modi_second_mnh.F90 b/src/arome/aux/modi_second_mnh.F90 new file mode 100644 index 0000000000000000000000000000000000000000..aaa03bd45a5d4b51d58c4824b59e51184b62984c --- /dev/null +++ b/src/arome/aux/modi_second_mnh.F90 @@ -0,0 +1,7 @@ +MODULE MODI_SECOND_MNH +INTERFACE +SUBROUTINE SECOND_MNH(XT) +REAL :: XT +END SUBROUTINE SECOND_MNH +END INTERFACE +END MODULE MODI_SECOND_MNH diff --git a/src/arome/aux/modi_shuman.F90 b/src/arome/aux/modi_shuman.F90 index 8bc69a410cc83ea136f24c444eb8abf328091418..d8ffd80a10bbe333b86fc74b43637d0024139fd7 100644 --- a/src/arome/aux/modi_shuman.F90 +++ b/src/arome/aux/modi_shuman.F90 @@ -35,16 +35,16 @@ END FUNCTION DYM FUNCTION DZF(PA,KKA,KKU,KL) RESULT(PDZF) REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux ! side -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZF ! result at mass localization END FUNCTION DZF ! FUNCTION DZM(PA,KKA,KKU,KL) RESULT(PDZM) REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass ! localization -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZM ! result at flux side END FUNCTION DZM ! @@ -74,16 +74,16 @@ END FUNCTION MYM ! FUNCTION MZF(PA,KKA,KKU,KL) RESULT(PMZF) REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux side -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZF ! result at mass ! localization END FUNCTION MZF ! FUNCTION MZM(PA,KKA,KKU,KL) RESULT(PMZM) REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM ! result at flux localization END FUNCTION MZM ! diff --git a/src/arome/aux/modi_tridiag_w.F90 b/src/arome/aux/modi_tridiag_w.F90 new file mode 100644 index 0000000000000000000000000000000000000000..f7926ae5d02134ced88fc284ac4149555ce874c4 --- /dev/null +++ b/src/arome/aux/modi_tridiag_w.F90 @@ -0,0 +1,3 @@ +MODULE MODI_TRIDIAG_W +! Empty module for PHYEX, used in TURB 3D +END MODULE MODI_TRIDIAG_W diff --git a/src/arome/aux/shuman.F90 b/src/arome/aux/shuman.F90 index 47109f11e7a325caf881364330a5289757ce29c5..f8949e00d8e7966ffc2122154fc29121ec8f9a0e 100644 --- a/src/arome/aux/shuman.F90 +++ b/src/arome/aux/shuman.F90 @@ -275,7 +275,6 @@ PMYF=PA ! PMYF(:,JJ,:) = 0.5*( PA(:,JJ,:)+PA(:,JJ+1,:) ) !END DO ! -!PMYF(:,IJU,:) = PMYF(:,2*JPHEXT,:) ! !------------------------------------------------------------------------------- ! @@ -429,8 +428,8 @@ IMPLICIT NONE ! ------------------------------------ ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux side -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZF ! result at mass ! localization ! @@ -513,8 +512,8 @@ IMPLICIT NONE ! ------------------------------------ ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM ! result at flux localization ! !* 0.2 Declarations of local variables @@ -713,6 +712,7 @@ END DO ! PDXM(1,:,:) = PDXM(IIU-2*JPHEXT+1,:,:) ! +CALL ABORT ! AROME SHOULD NOT CALLED HORIZONTAL FINITE DIFFERENCE !------------------------------------------------------------------------------- ! IF (LHOOK) CALL DR_HOOK('DXM',1,ZHOOK_HANDLE) @@ -803,6 +803,8 @@ END DO ! !PDYF(:,IJU,:) = PDYF(:,2*JPHEXT,:) ! +CALL ABORT ! AROME SHOULD NOT CALLED HORIZONTAL FINITE DIFFERENCE + !------------------------------------------------------------------------------- ! IF (LHOOK) CALL DR_HOOK('DYF',1,ZHOOK_HANDLE) @@ -892,6 +894,7 @@ DO JJ=2,IJU END DO ! PDYM(:,1,:) = PDYM(:,IJU-2*JPHEXT+1,:) +CALL ABORT ! AROME SHOULD NOT CALLED HORIZONTAL FINITE DIFFERENCE ! !------------------------------------------------------------------------------- ! @@ -952,8 +955,8 @@ IMPLICIT NONE ! ------------------------------------ ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux side -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZF ! result at mass ! localization ! @@ -1036,8 +1039,8 @@ IMPLICIT NONE ! ------------------------------------ ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZM ! result at flux ! side ! diff --git a/src/arome/chem/module/modd_aunifacparam.mod b/src/arome/chem/module/modd_aunifacparam.mod deleted file mode 100644 index 91bcad93f116f7c72f3176c9fab70a92ac2cf64a..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_aunifacparam.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_binsolu.mod b/src/arome/chem/module/modd_binsolu.mod deleted file mode 100644 index cf7e6d5ec4f9dbdaf450c64242385d5d158d3522..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_binsolu.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_bunifacparam.mod b/src/arome/chem/module/modd_bunifacparam.mod deleted file mode 100644 index 5dc14f24e3cf4c94fc5ed24755911c05be73bd10..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_bunifacparam.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_ch_aero_n.mod b/src/arome/chem/module/modd_ch_aero_n.mod deleted file mode 100644 index 0813d91e137dae6c70c176b52aed976d45062c08..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_ch_aero_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_ch_aerosol.mod b/src/arome/chem/module/modd_ch_aerosol.mod deleted file mode 100644 index 0a5f2c72614e68928e38d0e950a74456ebfead27..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_ch_aerosol.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_ch_aerosol0d.mod b/src/arome/chem/module/modd_ch_aerosol0d.mod deleted file mode 100644 index 6819f122293aa5e748ffe54f80edf052f7df1a27..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_ch_aerosol0d.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_ch_const.mod b/src/arome/chem/module/modd_ch_const.mod deleted file mode 100644 index 996e9fce64a37793ff29a936320d8e4ecff9e7ad..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_ch_const.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_ch_dep_n.mod b/src/arome/chem/module/modd_ch_dep_n.mod deleted file mode 100644 index 800bd7ac4f8cf8e77b9702ea7aaf580f84385f77..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_ch_dep_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_ch_init_jvalues.mod b/src/arome/chem/module/modd_ch_init_jvalues.mod deleted file mode 100644 index ac08d73b31794782780d0e8d8a77cbd9b6c59b05..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_ch_init_jvalues.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_ch_jvalues_n.mod b/src/arome/chem/module/modd_ch_jvalues_n.mod deleted file mode 100644 index fe1e7e4e80906c646745c8a65fc18515c07663ae..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_ch_jvalues_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_ch_m9.mod b/src/arome/chem/module/modd_ch_m9.mod deleted file mode 100644 index 6beb1980e96a2c90812a1b4e807c6909d8077da8..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_ch_m9.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_ch_m9_scheme.mod b/src/arome/chem/module/modd_ch_m9_scheme.mod deleted file mode 100644 index d86d6d56bf6055bf9a07795ac36fd887dc449b0b..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_ch_m9_scheme.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_ch_meteo.mod b/src/arome/chem/module/modd_ch_meteo.mod deleted file mode 100644 index f391f1a26fc0023ef26fffac6847fe2dcbe50616..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_ch_meteo.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_ch_mnhc_n.mod b/src/arome/chem/module/modd_ch_mnhc_n.mod deleted file mode 100644 index 79f37d408ace81078fe75db7316c80ef81112eec..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_ch_mnhc_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_ch_model0d.mod b/src/arome/chem/module/modd_ch_model0d.mod deleted file mode 100644 index 2e0ab963078698286e20ec714547f0eee2e7d6dd..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_ch_model0d.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_ch_solver_n.mod b/src/arome/chem/module/modd_ch_solver_n.mod deleted file mode 100644 index 39473590903381317f1c2c9412e3322444c9e7b1..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_ch_solver_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_csts_dust.mod b/src/arome/chem/module/modd_csts_dust.mod deleted file mode 100644 index 291816dd2967784448803091674dc91c73446846..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_csts_dust.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_csts_salt.mod b/src/arome/chem/module/modd_csts_salt.mod deleted file mode 100644 index 4970439510922d5568e23727c37511a255ce8489..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_csts_salt.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_dust.mod b/src/arome/chem/module/modd_dust.mod deleted file mode 100644 index 15da824a3952e1cbe50ca5ec3c2440687e9a5fb8..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_dust.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_dust_opt_lkt.mod b/src/arome/chem/module/modd_dust_opt_lkt.mod deleted file mode 100644 index fe09dc6407fe9d00546999aad9371c0e947fa6d3..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_dust_opt_lkt.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_glo.mod b/src/arome/chem/module/modd_glo.mod deleted file mode 100644 index ff3649c8c85a46a45cbc231a50d675c1e413cc65..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_glo.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_indref_aer.mod b/src/arome/chem/module/modd_indref_aer.mod deleted file mode 100644 index 53e4bbe87942389d089b0bd02cd8c63fc0011aae..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_indref_aer.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_parameters_dep.mod b/src/arome/chem/module/modd_parameters_dep.mod deleted file mode 100644 index c203a8024ecc0d7a422376c6f1cde7ac5936229a..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_parameters_dep.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_salt.mod b/src/arome/chem/module/modd_salt.mod deleted file mode 100644 index e135212ab7b61121f52f2fa333028c5dfebf4747..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_salt.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_sub_ch_field_value_n.mod b/src/arome/chem/module/modd_sub_ch_field_value_n.mod deleted file mode 100644 index 9e5911147c386512e3962fecebd4644e876bad7c..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_sub_ch_field_value_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_sub_ch_monitor_n.mod b/src/arome/chem/module/modd_sub_ch_monitor_n.mod deleted file mode 100644 index 3b67ab4cd3557d1746d749ad9131a25ca0b09882..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_sub_ch_monitor_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_unifacparam.mod b/src/arome/chem/module/modd_unifacparam.mod deleted file mode 100644 index 37636401e0a6d1d16a67f5cb0ba9727d5ae54b52..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_unifacparam.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_wet_dep_descr.mod b/src/arome/chem/module/modd_wet_dep_descr.mod deleted file mode 100644 index 9bc5d995b774bbd24bae2af612873861bf949a81..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_wet_dep_descr.mod and /dev/null differ diff --git a/src/arome/chem/module/modd_wet_dep_param.mod b/src/arome/chem/module/modd_wet_dep_param.mod deleted file mode 100644 index 3171763c87b386adb4fd76f26fe6a48090a76c62..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modd_wet_dep_param.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_aero_psd.mod b/src/arome/chem/module/mode_aero_psd.mod deleted file mode 100644 index 6c8106f380af935645bcd3eebfe98ead3ac5d146..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_aero_psd.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_amain.mod b/src/arome/chem/module/mode_amain.mod deleted file mode 100644 index 1ace17cccbeab5c23d9f2fb1f7cab6882580368c..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_amain.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_bmain.mod b/src/arome/chem/module/mode_bmain.mod deleted file mode 100644 index 5a235fa6bb20a7ab76806fd82b7e5ee6d37b28c9..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_bmain.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_dust_psd.mod b/src/arome/chem/module/mode_dust_psd.mod deleted file mode 100644 index 826323fc409381a08c60da7249077bd806365d42..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_dust_psd.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_dustopt.mod b/src/arome/chem/module/mode_dustopt.mod deleted file mode 100644 index e9f16d7d4db9b7cd7a7927ef2473d18a8e8fb27b..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_dustopt.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_firstguess.mod b/src/arome/chem/module/mode_firstguess.mod deleted file mode 100644 index 5ad3ee332dfb119fe4bc802f3874198d3758c3d7..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_firstguess.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_modeln_handler.mod b/src/arome/chem/module/mode_modeln_handler.mod deleted file mode 100644 index 50307289393c97ea286dbe74b245f9b667861551..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_modeln_handler.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_oamain.mod b/src/arome/chem/module/mode_oamain.mod deleted file mode 100644 index a45f7339c96d486dbb6b8bd7d5dd54b12c3b4544..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_oamain.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_salt_psd.mod b/src/arome/chem/module/mode_salt_psd.mod deleted file mode 100644 index 3e980bfb6b7b0d90ede8df147d65913c691bb645..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_salt_psd.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_soaeql.mod b/src/arome/chem/module/mode_soaeql.mod deleted file mode 100644 index f6bd5948e399074086e2af812d296a68b5915153..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_soaeql.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_soaeqlutl.mod b/src/arome/chem/module/mode_soaeqlutl.mod deleted file mode 100644 index 623551d81cb33fe0a62b29d3e729c3738a8e952d..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_soaeqlutl.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_soatinit.mod b/src/arome/chem/module/mode_soatinit.mod deleted file mode 100644 index 505cc8222c7169c9d4926b2ff0a9b33d439dd233..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_soatinit.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_typea.mod b/src/arome/chem/module/mode_typea.mod deleted file mode 100644 index 32308a2552723c5cb65e9c27897ada9bad91b96d..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_typea.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_typeb.mod b/src/arome/chem/module/mode_typeb.mod deleted file mode 100644 index e9b19ebf24885ca23ffd8762e669119155c38bb2..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_typeb.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_unifac.mod b/src/arome/chem/module/mode_unifac.mod deleted file mode 100644 index 44a02182c438cdb32d1d7776656779c8dbb094c2..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_unifac.mod and /dev/null differ diff --git a/src/arome/chem/module/mode_zsrpun.mod b/src/arome/chem/module/mode_zsrpun.mod deleted file mode 100644 index 29f61e633787fcbb39f2e5c9f7d1f0705ec2c1ae..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/mode_zsrpun.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_aer_effic.mod b/src/arome/chem/module/modi_aer_effic.mod deleted file mode 100644 index d3f0017fe290932ae8dad22a2bdd3e32b48c3844..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_aer_effic.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_aer_effic_dep.mod b/src/arome/chem/module/modi_aer_effic_dep.mod deleted file mode 100644 index e89e59a68a6ad9a9cabf29d1ee17cbf0eef90ad6..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_aer_effic_dep.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_aer_velgrav.mod b/src/arome/chem/module/modi_aer_velgrav.mod deleted file mode 100644 index fe656a00fcb06f605889c6966e9fc8cefc28d749..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_aer_velgrav.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_aer_wet_dep.mod b/src/arome/chem/module/modi_aer_wet_dep.mod deleted file mode 100644 index 4586c848026ec93d702803caf7cd788e484bec78..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_aer_wet_dep.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_aer_wet_dep_kmt_warm.mod b/src/arome/chem/module/modi_aer_wet_dep_kmt_warm.mod deleted file mode 100644 index 2b91bfb67fcf8e64d8156fa659b92afb4a500356..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_aer_wet_dep_kmt_warm.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_coag.mod b/src/arome/chem/module/modi_ch_aer_coag.mod deleted file mode 100644 index ea62bd33d3daa631031c7f97e6abc8a7bfe60b98..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_coag.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_driver.mod b/src/arome/chem/module/modi_ch_aer_driver.mod deleted file mode 100644 index 05e8b036bf71d8f43536e74d5b87b6c781fed080..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_driver.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_eqm_cormass.mod b/src/arome/chem/module/modi_ch_aer_eqm_cormass.mod deleted file mode 100644 index 9fdff192aa7545fb058b771a674fb29c9cb68b72..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_eqm_cormass.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_eqm_init0d.mod b/src/arome/chem/module/modi_ch_aer_eqm_init0d.mod deleted file mode 100644 index 0283abd11af281d8ee2e44a3cd5ce083e89b826d..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_eqm_init0d.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_eqm_init_n.mod b/src/arome/chem/module/modi_ch_aer_eqm_init_n.mod deleted file mode 100644 index 69bcd73109385e9cdbb49b75df5ed1d3070e35e8..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_eqm_init_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_eqsam.mod b/src/arome/chem/module/modi_ch_aer_eqsam.mod deleted file mode 100644 index bc95d986a0545d9d9477f927030f610e504d313b..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_eqsam.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_growth.mod b/src/arome/chem/module/modi_ch_aer_growth.mod deleted file mode 100644 index bf894def4039a921e0dd9ae8b4709c72aab655a8..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_growth.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_init.mod b/src/arome/chem/module/modi_ch_aer_init.mod deleted file mode 100644 index ed2b0ddbe12a8ad0a656367ed77550c998bc4fbc..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_init.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_init_soa.mod b/src/arome/chem/module/modi_ch_aer_init_soa.mod deleted file mode 100644 index 5eee0233bdd4df963a41c3c6f4b5767c172da64d..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_init_soa.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_intermin.mod b/src/arome/chem/module/modi_ch_aer_intermin.mod deleted file mode 100644 index 51f25ea7aadaf1d0084dbddd99cca9e79260def8..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_intermin.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_mineral.mod b/src/arome/chem/module/modi_ch_aer_mineral.mod deleted file mode 100644 index 4c5208ba7f7a6e6bc6be36fd5a200ec9cc6f3c66..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_mineral.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_mod_init.mod b/src/arome/chem/module/modi_ch_aer_mod_init.mod deleted file mode 100644 index 7d99a34633e1559dfd3359c10d816a4e1ffb87d0..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_mod_init.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_mpmpo.mod b/src/arome/chem/module/modi_ch_aer_mpmpo.mod deleted file mode 100644 index 4d0a0c5ce8ac4b4cc7769d30acca9ef72d880da1..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_mpmpo.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_nucl.mod b/src/arome/chem/module/modi_ch_aer_nucl.mod deleted file mode 100644 index 2cdef9236cfa56c309f83dfd9d40f825b5d8cba9..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_nucl.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_organic.mod b/src/arome/chem/module/modi_ch_aer_organic.mod deleted file mode 100644 index 93913aa512d3ac6871648f091b23abb280425fd8..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_organic.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_pun.mod b/src/arome/chem/module/modi_ch_aer_pun.mod deleted file mode 100644 index e497ad07abb1e1f7e814849f8f91763ffdc45bbf..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_pun.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_reallfi_n.mod b/src/arome/chem/module/modi_ch_aer_reallfi_n.mod deleted file mode 100644 index 5d647c7f0bd271c10f7dcfb124b577ac3652f061..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_reallfi_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_sedim_n.mod b/src/arome/chem/module/modi_ch_aer_sedim_n.mod deleted file mode 100644 index b322e955353c5fbbb579666375612a556d3d74bd..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_sedim_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_solv.mod b/src/arome/chem/module/modi_ch_aer_solv.mod deleted file mode 100644 index 739056625de509880f44c782712bbf4ec7ba1f2e..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_solv.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_surf.mod b/src/arome/chem/module/modi_ch_aer_surf.mod deleted file mode 100644 index 2d8a91d1ed53537ebba477d16741e76c67fb4145..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_surf.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_thermo.mod b/src/arome/chem/module/modi_ch_aer_thermo.mod deleted file mode 100644 index e7af9e7dd4c227828a5d2cd09ba36723a0c9fd65..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_thermo.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_trans.mod b/src/arome/chem/module/modi_ch_aer_trans.mod deleted file mode 100644 index be3dad19e48d55a3a602ba43845bb2c8a55c7eff..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_trans.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aer_velgrav_n.mod b/src/arome/chem/module/modi_ch_aer_velgrav_n.mod deleted file mode 100644 index 38f33f3fe0eb3cce7a93b78334e85a658dfc2942..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aer_velgrav_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_allocate_taccs.mod b/src/arome/chem/module/modi_ch_allocate_taccs.mod deleted file mode 100644 index 7ddd9dbfeaedb645b049bd6e879b31d736af7a58..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_allocate_taccs.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_aqua.mod b/src/arome/chem/module/modi_ch_aqua.mod deleted file mode 100644 index 94da6bd5c580cc0aa06287521e60bfa0ebbad57d..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_aqua.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_ares.mod b/src/arome/chem/module/modi_ch_ares.mod deleted file mode 100644 index 4c3a6d5843d1dfdc32f50c3900840d7d5c45397e..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_ares.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_boundaries.mod b/src/arome/chem/module/modi_ch_boundaries.mod deleted file mode 100644 index 12f4bc83e66d49f0df13561af12cd4a934ac1b6a..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_boundaries.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_convect_linox.mod b/src/arome/chem/module/modi_ch_convect_linox.mod deleted file mode 100644 index 4444edc73b747edc3d11e6ba5f429fcf5b205e1f..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_convect_linox.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_cranck.mod b/src/arome/chem/module/modi_ch_cranck.mod deleted file mode 100644 index 5533c10da36a24c2bbbe81814c02a80dc93fedf2..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_cranck.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_deallocate_taccs.mod b/src/arome/chem/module/modi_ch_deallocate_taccs.mod deleted file mode 100644 index bd0e88397300f24a76a0e7f082b9b292d82efe68..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_deallocate_taccs.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_diagnostics.mod b/src/arome/chem/module/modi_ch_diagnostics.mod deleted file mode 100644 index 7da13a5c7eed2ff9f134292bc857312b342607a0..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_diagnostics.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_emission_flux0d.mod b/src/arome/chem/module/modi_ch_emission_flux0d.mod deleted file mode 100644 index 7fcad6a90dd10b120780d8f27c8e9b845d21fc42..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_emission_flux0d.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_exqssa.mod b/src/arome/chem/module/modi_ch_exqssa.mod deleted file mode 100644 index c18f771e6de0992bdd39fd1ef0231364ba85c81e..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_exqssa.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_fcn.mod b/src/arome/chem/module/modi_ch_fcn.mod deleted file mode 100644 index 71fc1a791fbc88ba747511c24350ae62582b1730..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_fcn.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_field_value_n.mod b/src/arome/chem/module/modi_ch_field_value_n.mod deleted file mode 100644 index 4418ba844a3cbbbd285efb81c565c99c875cb578..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_field_value_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_gauss.mod b/src/arome/chem/module/modi_ch_gauss.mod deleted file mode 100644 index ce113c0b5f261fa338226223f6fd91222db85954..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_gauss.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_get_cnames.mod b/src/arome/chem/module/modi_ch_get_cnames.mod deleted file mode 100644 index 75192f28c2b5f3de554b1244b22ee9101526513c..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_get_cnames.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_get_rates.mod b/src/arome/chem/module/modi_ch_get_rates.mod deleted file mode 100644 index 77cf308dea90d32e9e22e9246734b22a9ae1497b..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_get_rates.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_ini_orilam.mod b/src/arome/chem/module/modi_ch_ini_orilam.mod deleted file mode 100644 index 2e93f1f007c75ddf9b4b481f0ec6b22e0231f14b..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_ini_orilam.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_init_ccs.mod b/src/arome/chem/module/modi_ch_init_ccs.mod deleted file mode 100644 index eee7db5ac9e4eb9cea7863b62fcac00d2d7c57cc..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_init_ccs.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_init_const_n.mod b/src/arome/chem/module/modi_ch_init_const_n.mod deleted file mode 100644 index 63aeedbe9b0b60556b6f19b72e8465de450b6e4e..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_init_const_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_init_jvalues.mod b/src/arome/chem/module/modi_ch_init_jvalues.mod deleted file mode 100644 index 69d9cc01876e5eb4a11348fd6adab4086ec8a6be..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_init_jvalues.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_init_meteo.mod b/src/arome/chem/module/modi_ch_init_meteo.mod deleted file mode 100644 index a556290d3f58e41050817386b0b9b5a4bd677e7a..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_init_meteo.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_init_model0d.mod b/src/arome/chem/module/modi_ch_init_model0d.mod deleted file mode 100644 index 0f81fcd449ba704532bc6824837cece36a5107d2..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_init_model0d.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_init_output.mod b/src/arome/chem/module/modi_ch_init_output.mod deleted file mode 100644 index 553aca39fb45e03e746bf0be287b692715a1dea0..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_init_output.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_init_scheme.mod b/src/arome/chem/module/modi_ch_init_scheme.mod deleted file mode 100644 index 339dbcfc7e191d7c0a563ac67b5cbe2ac1450b91..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_init_scheme.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_interp_jvalues.mod b/src/arome/chem/module/modi_ch_interp_jvalues.mod deleted file mode 100644 index bb6318e864a135cb0c789311456b9a6596e23768..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_interp_jvalues.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_interp_jvalues_n.mod b/src/arome/chem/module/modi_ch_interp_jvalues_n.mod deleted file mode 100644 index 1cd44c64b1acc204876be182af8ecec80271714c..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_interp_jvalues_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_isoropia.mod b/src/arome/chem/module/modi_ch_isoropia.mod deleted file mode 100644 index 1ace36110db0b6a803167db58733b13af5688706..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_isoropia.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_jac.mod b/src/arome/chem/module/modi_ch_jac.mod deleted file mode 100644 index 6db0180bf568e37b5eee34b44df04f305c9e86cc..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_jac.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_jvalues_clouds.mod b/src/arome/chem/module/modi_ch_jvalues_clouds.mod deleted file mode 100644 index be9b9ab7a27789971bad14e57174c72e2f153c40..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_jvalues_clouds.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_jvalues_clouds_n.mod b/src/arome/chem/module/modi_ch_jvalues_clouds_n.mod deleted file mode 100644 index 7ea0c37a7783779e60ea6603197b436d55bc86cf..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_jvalues_clouds_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_jvalues_n.mod b/src/arome/chem/module/modi_ch_jvalues_n.mod deleted file mode 100644 index 579acc1a4443d945754fd0eea1f9c5a0403ca53c..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_jvalues_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_linssa.mod b/src/arome/chem/module/modi_ch_linssa.mod deleted file mode 100644 index 701c4473c84fb9059930a101e44455499ec7d376..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_linssa.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_meteo_trans.mod b/src/arome/chem/module/modi_ch_meteo_trans.mod deleted file mode 100644 index 2c18d3797868d4647fe83a10e245cfa3e817755c..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_meteo_trans.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_monitor_n.mod b/src/arome/chem/module/modi_ch_monitor_n.mod deleted file mode 100644 index b0e62a9a8cad0b21da3673188e85348399d15fe7..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_monitor_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_nnares.mod b/src/arome/chem/module/modi_ch_nnares.mod deleted file mode 100644 index c0534a9a2520278b8e0cadb850dac72fb079a563..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_nnares.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_nonzeroterms.mod b/src/arome/chem/module/modi_ch_nonzeroterms.mod deleted file mode 100644 index 0ee3b366f14c90bf533a2789b25c41d4ed044d2c..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_nonzeroterms.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_open_input.mod b/src/arome/chem/module/modi_ch_open_input.mod deleted file mode 100644 index b7a8881f092a49a9aa54b1f89418a888be95de3b..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_open_input.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_orilam.mod b/src/arome/chem/module/modi_ch_orilam.mod deleted file mode 100644 index c9ff79c4a9e343bfc686288e2372ce5439e82f74..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_orilam.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_output.mod b/src/arome/chem/module/modi_ch_output.mod deleted file mode 100644 index ae1a294a0fe5442f523148995a5b954f4268ffac..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_output.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_prodloss.mod b/src/arome/chem/module/modi_ch_prodloss.mod deleted file mode 100644 index 70a8c95fdd69f7d18352644dc7a53f4912ccc11d..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_prodloss.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_qssa.mod b/src/arome/chem/module/modi_ch_qssa.mod deleted file mode 100644 index aa23a99fe73724eba33f5e50bb1a7aa0c930077e..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_qssa.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_read_chem.mod b/src/arome/chem/module/modi_ch_read_chem.mod deleted file mode 100644 index e7b426c0d21d719b3d997fd15f00995d0eb1830b..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_read_chem.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_read_meteo.mod b/src/arome/chem/module/modi_ch_read_meteo.mod deleted file mode 100644 index f78e7a3ae8cc0485f6a9cf79b7ee6837d5decfaf..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_read_meteo.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_read_vector.mod b/src/arome/chem/module/modi_ch_read_vector.mod deleted file mode 100644 index d9c5684913dd14e33644b5871cfa24d97820117f..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_read_vector.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_set_photo_rates.mod b/src/arome/chem/module/modi_ch_set_photo_rates.mod deleted file mode 100644 index ec66dbc2c56c1dfb4cc351d11cb2735ff3dab05b..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_set_photo_rates.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_set_rates.mod b/src/arome/chem/module/modi_ch_set_rates.mod deleted file mode 100644 index dc051de4c6ddf4bbd6cf38563dc00d70e8fde6b9..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_set_rates.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_show_chem.mod b/src/arome/chem/module/modi_ch_show_chem.mod deleted file mode 100644 index 0c58d9a91ccd4452a4ab7b5e6a556e19a050ac9c..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_show_chem.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_sis.mod b/src/arome/chem/module/modi_ch_sis.mod deleted file mode 100644 index f27b9e1e484a922729ff5d1d26247f81ca6c245c..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_sis.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_solver_n.mod b/src/arome/chem/module/modi_ch_solver_n.mod deleted file mode 100644 index bb34dc16778085e44327f142186cd621f3fa0e5e..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_solver_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_sparse.mod b/src/arome/chem/module/modi_ch_sparse.mod deleted file mode 100644 index cb4d78cf8348da6eb4d1e768e7fc28c054b08491..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_sparse.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_svode.mod b/src/arome/chem/module/modi_ch_svode.mod deleted file mode 100644 index 3c340b1ae0c567897a5f9d8ee48a7d7cd6463d08..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_svode.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_terms.mod b/src/arome/chem/module/modi_ch_terms.mod deleted file mode 100644 index cdc96655b1253e871a66582698641c4a28452287..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_terms.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_update_jvalues.mod b/src/arome/chem/module/modi_ch_update_jvalues.mod deleted file mode 100644 index cf5feae2c642f26ce9659fe4508e7c2530ddbb02..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_update_jvalues.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_update_jvalues_n.mod b/src/arome/chem/module/modi_ch_update_jvalues_n.mod deleted file mode 100644 index f5c482f0e55174963ae332aaec45f1ee6028b1b5..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_update_jvalues_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_update_meteo.mod b/src/arome/chem/module/modi_ch_update_meteo.mod deleted file mode 100644 index 6a8d0c4c70dba53cfe140c7d7cb5ab94456f3c5b..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_update_meteo.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ch_write_chem.mod b/src/arome/chem/module/modi_ch_write_chem.mod deleted file mode 100644 index 4a1295f2db17b651c48d7c0d351a5782c615500a..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ch_write_chem.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_dust_filter.mod b/src/arome/chem/module/modi_dust_filter.mod deleted file mode 100644 index 1f7a571a822bb3a0952fdf0812a1da61620f98bf..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_dust_filter.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_dust_velgrav.mod b/src/arome/chem/module/modi_dust_velgrav.mod deleted file mode 100644 index 10103a562077c3967ffff166a94be7c2c7759250..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_dust_velgrav.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_dustlfi_n.mod b/src/arome/chem/module/modi_dustlfi_n.mod deleted file mode 100644 index 3ba552e731a87022bfef0acdf8fca2f203ab883b..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_dustlfi_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_eqsam_v03d_sub.mod b/src/arome/chem/module/modi_eqsam_v03d_sub.mod deleted file mode 100644 index fa8110881602c82bac0c97770931a894ade424ad..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_eqsam_v03d_sub.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_ini_wet_dep.mod b/src/arome/chem/module/modi_ini_wet_dep.mod deleted file mode 100644 index 64a1e96a283c4bdbc55b67df916b5c1498ee31d3..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_ini_wet_dep.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_init_dust.mod b/src/arome/chem/module/modi_init_dust.mod deleted file mode 100644 index 957b57c0953f870e992632a0fd3822d2b1b14eae..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_init_dust.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_inv_levels.mod b/src/arome/chem/module/modi_inv_levels.mod deleted file mode 100644 index cc0132bfa3481e70aa21a0c8c9df455c158e203c..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_inv_levels.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_mpdata_scalar.mod b/src/arome/chem/module/modi_mpdata_scalar.mod deleted file mode 100644 index 202e390974ae8f067a2f7dfb655d416a949daf37..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_mpdata_scalar.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_salt_filter.mod b/src/arome/chem/module/modi_salt_filter.mod deleted file mode 100644 index 66d09aba4b4b43750b87b6d5b347f2a23e9ddf2f..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_salt_filter.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_salt_velgrav.mod b/src/arome/chem/module/modi_salt_velgrav.mod deleted file mode 100644 index 5e5dd06a7f6b2fea3b07bad12a2bb9708f6ae69c..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_salt_velgrav.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_saltlfi_n.mod b/src/arome/chem/module/modi_saltlfi_n.mod deleted file mode 100644 index f2389bd9adb2a2baed4769fde4e13f675aa1088d..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_saltlfi_n.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_sedim_dust.mod b/src/arome/chem/module/modi_sedim_dust.mod deleted file mode 100644 index 09a6bc907dbb860b11b2c8b2114915dd6de0856e..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_sedim_dust.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_sedim_salt.mod b/src/arome/chem/module/modi_sedim_salt.mod deleted file mode 100644 index 12f36f5d32556f49c551dd272290b2c26f4b1dca..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_sedim_salt.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_troe.mod b/src/arome/chem/module/modi_troe.mod deleted file mode 100644 index c4b9e6f8237fcdba57a2259464d50dde1de80a19..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_troe.mod and /dev/null differ diff --git a/src/arome/chem/module/modi_troe_equil.mod b/src/arome/chem/module/modi_troe_equil.mod deleted file mode 100644 index 0d27ba0def4af36d285941f7b9926c427c381eef..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modi_troe_equil.mod and /dev/null differ diff --git a/src/arome/chem/module/modn_ch_orilam.mod b/src/arome/chem/module/modn_ch_orilam.mod deleted file mode 100644 index 6c88f81ebb75ab511aff17e925c487ed4ecf3988..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modn_ch_orilam.mod and /dev/null differ diff --git a/src/arome/chem/module/modn_dust.mod b/src/arome/chem/module/modn_dust.mod deleted file mode 100644 index f2178cb6b2bd56dad047c1140cf7d41e1845cb28..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modn_dust.mod and /dev/null differ diff --git a/src/arome/chem/module/modn_salt.mod b/src/arome/chem/module/modn_salt.mod deleted file mode 100644 index 601380330471149755338757d1a95088ebee5414..0000000000000000000000000000000000000000 Binary files a/src/arome/chem/module/modn_salt.mod and /dev/null differ 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/micro/mode_fmbidon.F90 b/src/arome/dead_code/mode_fmbidon.F90 similarity index 100% rename from src/arome/micro/mode_fmbidon.F90 rename to src/arome/dead_code/mode_fmbidon.F90 diff --git a/src/arome/micro/mode_fmwritbidon.F90 b/src/arome/dead_code/mode_fmwritbidon.F90 similarity index 100% rename from src/arome/micro/mode_fmwritbidon.F90 rename to src/arome/dead_code/mode_fmwritbidon.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/ext/aro_turb_mnh.F90 b/src/arome/ext/aro_turb_mnh.F90 index caee9cfa67fc6e614a16aedfdc3e32158d782230..73772849b9066a6a3f5b1289ed8fcffc9d6c0646 100644 --- a/src/arome/ext/aro_turb_mnh.F90 +++ b/src/arome/ext/aro_turb_mnh.F90 @@ -71,7 +71,8 @@ USE MODD_CONF USE MODD_CST USE MODD_PARAMETERS - +USE MODD_IO, ONLY: TFILEDATA +USE MODD_BUDGET, ONLY: NBUDGET_RI, TBUDGETDATA ! USE MODI_TURB ! @@ -100,6 +101,7 @@ INTEGER, INTENT(IN) :: KGRADIENTS ! Number of stored horizon LOGICAL, INTENT(IN) :: LDHARATU ! HARATU scheme active CHARACTER (LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of mass flux scheme +CHARACTER (LEN=4) :: HCLOUD ! Type of microphysical scheme REAL, INTENT(IN) :: PTSTEP ! Time step ! ! @@ -170,11 +172,13 @@ LOGICAL , INTENT(IN) :: OSUBG_COND ! switch REAL, DIMENSION(KLON,1,KLEV+2), INTENT(OUT) :: PDP, PTP, PTPMF, PTDIFF, PTDISS ! !for TKE DDH budgets ! -TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH -TYPE(TLDDH), INTENT(IN) :: YDLDDH -TYPE(TMDDH), INTENT(IN) :: YDMDDH +TYPE(TYP_DDH), INTENT(INOUT), TARGET :: YDDDH +TYPE(TLDDH), INTENT(IN), TARGET :: YDLDDH +TYPE(TMDDH), INTENT(IN), TARGET :: YDMDDH ! ! +TYPE(TBUDGETDATA), DIMENSION(NBUDGET_RI) :: YLBUDGET !NBUDGET_RI is the one with the highest number needed for turb +TYPE(TFILEDATA) :: ZTFILE !I/O for MesoNH !* 0.2 Declarations of local variables : ! INTEGER :: JRR,JSV ! Loop index for the moist and scalar variables @@ -198,24 +202,18 @@ CHARACTER(LEN=4),DIMENSION(2) :: HLBCX, HLBCY ! X- and Y-direc LBC INTEGER :: ISPLIT ! number of time-splitting -LOGICAL :: OCLOSE_OUT ! Conditional closure of - ! the OUTPUT FM-file LOGICAL :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file LOGICAL :: OTURB_DIAG ! switch to write some ! diagnostic fields in the syncronous FM-file LOGICAL :: ORMC01 ! switch for RMC01 lengths in SBL +LOGICAL :: OOCEAN ! switch for OCEAN version of turbulence scheme CHARACTER(LEN=4) :: HTURBDIM ! dimensionality of the ! turbulence scheme CHARACTER(LEN=4) :: HTURBLEN ! kind of mixing length REAL :: ZIMPL ! degree of implicitness - -CHARACTER(LEN=4) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=4) :: HLUOUT ! Output-listing name for - ! model n ! REAL, DIMENSION(KLON,1,KLEV+2) :: ZDXX,ZDYY,ZDZZ,ZDZX,ZDZY ! metric coefficients @@ -264,6 +262,9 @@ IKE=KKU-JPVEXT_TURB*KKL ! Numero du modele si grid nestind, toujours egal a 1 IMI=1 +! Fichier I/O pour MesoNH (non-utilise dans AROME) +ZTFILE%LOPENED=.FALSE. + ! Type de condition � la limite. En 1D, sans importance. A etudier en 3D. HLBCX(:)='CYCL' HLBCY(:)='CYCL' @@ -272,9 +273,6 @@ HLBCY(:)='CYCL' ISPLIT=1 ! pour ecriture et diagnostic dans mesoNH, � priori les switches toujours � .F. -OCLOSE_OUT=.FALSE. -HFMFILE=' ' -HLUOUT= ' ' OTURB_FLX=.FALSE. OTURB_DIAG=.FALSE. @@ -283,9 +281,11 @@ ORMC01=.FALSE. HTURBDIM='1DIM' HTURBLEN='BL89' - +HCLOUD='ICE3' ZIMPL=1. +!Version Ocean du schema de turbulence +OOCEAN=.FALSE. ! tableau a recalculer a chaque pas de temps ! attention, ZDZZ est l'altitude entre deux niveaux (et pas l'�paisseur de la couche) @@ -412,27 +412,33 @@ ZCEI_MIN=0.0 ZCEI=0.0 ZCOEF_AMPL_SAT=0.0 -CL=HINST_SFU +DO JRR=1, NBUDGET_RI + YLBUDGET(JRR)%NBUDGET=JRR + YLBUDGET(JRR)%YDDDH=>YDDDH + YLBUDGET(JRR)%YDLDDH=>YDLDDH + YLBUDGET(JRR)%YDMDDH=>YDMDDH +ENDDO + CALL TURB (KLEV+2,1,KKL,IMI, KRR, KRRL, KRRI, HLBCX, HLBCY, ISPLIT,IMI, & - & OCLOSE_OUT,OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01, & - & HTURBDIM,HTURBLEN,'NONE','NONE', CL, & - & HMF_UPDRAFT,ZIMPL, & - & 2*PTSTEP, 2*PTSTEP, 2*PTSTEP, & - & HFMFILE,HLUOUT,ZDXX,ZDYY,ZDZZ,ZDZX,ZDZY,ZZZ, & + & OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01,OOCEAN, & + & HTURBDIM,HTURBLEN,'NONE','NONE',HCLOUD, & + & ZIMPL, & + & 2*PTSTEP,ZTFILE, & + & ZDXX,ZDYY,ZDZZ,ZDZX,ZDZY,ZZZ, & & ZDIRCOSXW,ZDIRCOSYW,ZDIRCOSZW,ZCOSSLOPE,ZSINSLOPE, & - & PRHODJ,PTHVREF,PRHODREF, & + & PRHODJ,PTHVREF, & & PSFTH,PSFRV,PSFSV,PSFU,PSFV, & & PPABSM,PUM,PVM,PWM,PTKEM,ZSVM,PSRCM, & & PLENGTHM,PLENGTHH,MFMOIST, & & ZBL_DEPTH,ZSBL_DEPTH, & - & PUM,PVM,PWM,ZCEI,ZCEI_MIN,ZCEI_MAX,ZCOEF_AMPL_SAT, & + & ZCEI,ZCEI_MIN,ZCEI_MAX,ZCOEF_AMPL_SAT, & & PTHM,ZRM, & & PRUS,PRVS,PRWS,PRTHS,ZRRS,ZRSVS,PRTKES_OUT, & - & ZHGRAD,PSIGS, & - & PDRUS_TURB,PDRVS_TURB, & - & PDRTHLS_TURB,PDRRTS_TURB,ZDRSVS_TURB, & - & PFLXZTHVMF,ZWTH,ZWRC,ZWSV,PDP,PTP,PTPMF,PTDIFF, & - & PTDISS,PEDR,YDDDH,YDLDDH,YDMDDH) + & PSIGS, & + & PFLXZTHVMF,ZWTH,ZWRC,ZWSV,PDP,PTP,PTDIFF,PTDISS,& + & YLBUDGET, KBUDGETS=SIZE(YLBUDGET),PEDR=PEDR,PTPMF=PTPMF,& + & PDRUS_TURB=PDRUS_TURB,PDRVS_TURB=PDRVS_TURB, & + & PDRTHLS_TURB=PDRTHLS_TURB,PDRRTS_TURB=PDRRTS_TURB,PDRSVS_TURB=ZDRSVS_TURB) ! ! !------------------------------------------------------------------------------ diff --git a/src/arome/gmkpack_ignored_files b/src/arome/gmkpack_ignored_files index f4443eaf9130797e1e582adcae398ecca54b5a0b..44cbe8f4057eaef9834c0d43c528aacc49a4eed3 100644 --- a/src/arome/gmkpack_ignored_files +++ b/src/arome/gmkpack_ignored_files @@ -129,3 +129,70 @@ phyex/turb/modi_compute_updraft_rhcj10.F90 phyex/turb/compute_updraft_rhcj10.F90 phyex/turb/modi_compute_updraft.F90 phyex/turb/compute_updraft.F90 +>>>>>>> 9df244f +phyex/turb/tke_eps_sources.F90 +phyex/turb/turb_ver.F90 +phyex/turb/prandtl.F90 +phyex/turb/turb_ver_thermo_flux.F90 +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 +phyex/turb/bl89.F90 +phyex/turb/etheta.F90 +phyex/turb/emoist.F90 +phyex/turb/rmc01.F90 +phyex/turb/sbl_depth.F90 +phyex/turb/th_r_from_thl_rt_1d.F90 +phyex/turb/th_r_from_thl_rt_2d.F90 +phyex/turb/th_r_from_thl_rt_3d.F90 +phyex/turb/thl_rt_from_th_r_mf.F90 +phyex/turb/bl_depth_diag_3d.F90 +phyex/turb/bl_depth_diag_1d.F90 +phyex/turb/modi_compute_function_thermo_mf.F90 +phyex/turb/compute_function_thermo_mf.F90 +phyex/micro/modd_cst.F90 +phyex/micro/modi_ini_cst.F90 +phyex/micro/ini_cst.F90 +phyex/turb/modd_cmfshall.F90 +phyex/turb/mf_turb_expl.F90 +phyex/turb/modi_mf_turb_expl.F90 +phyex/turb/mf_turb.F90 +phyex/turb/modi_mf_turb.F90 +phyex/turb/compute_mf_cloud.F90 +phyex/turb/compute_mf_cloud_bigaus.F90 +phyex/turb/compute_mf_cloud_direct.F90 +phyex/turb/compute_mf_cloud_stat.F90 +phyex/turb/modi_compute_mf_cloud.F90 +phyex/turb/modi_compute_mf_cloud_bigaus.F90 +phyex/turb/modi_compute_mf_cloud_direct.F90 +phyex/turb/modi_compute_mf_cloud_stat.F90 +phyex/turb/compute_bl89_ml.F90 +phyex/turb/modi_compute_bl89_ml.F90 +phyex/turb/compute_entr_detr.F90 +phyex/turb/modi_compute_entr_detr.F90 +phyex/turb/compute_updraft_raha.F90 +phyex/turb/modi_compute_updraft_raha.F90 +phyex/turb/modi_compute_updraft_rhcj10.F90 +phyex/turb/compute_updraft_rhcj10.F90 +phyex/turb/modi_compute_updraft.F90 +phyex/turb/compute_updraft.F90 +phyex/micro/modd_conf.F90 +phyex/micro/modd_dyn.F90 +phyex/micro/modd_les.F90 +phyex/micro/modd_lunit.F90 +phyex/micro/modd_parameters.F90 +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/micro/ini_lima_cold_mixed.F90 b/src/arome/micro/ini_lima_cold_mixed.F90 index 79d0d993b046665c30eac5c64644429fe2e6921c..2e2aae3d855df8726776a5a67f78e978b74b517d 100644 --- a/src/arome/micro/ini_lima_cold_mixed.F90 +++ b/src/arome/micro/ini_lima_cold_mixed.F90 @@ -40,7 +40,6 @@ END MODULE MODI_INI_LIMA_COLD_MIXED !* 0. DECLARATIONS ! ------------ ! -USE MODE_FM USE MODD_CST USE MODD_REF USE MODD_PARAM_LIMA diff --git a/src/arome/micro/ini_rain_ice.F90 b/src/arome/micro/ini_rain_ice.F90 index 021d23402c54e92b8476af3e345d799157945ec1..50d2db14c48bf5a24ae760d378396997d32a4158 100644 --- a/src/arome/micro/ini_rain_ice.F90 +++ b/src/arome/micro/ini_rain_ice.F90 @@ -1,7 +1,10 @@ +!MNH_LIC Copyright 1995-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. +!----------------------------------------------------------------- ! ######spl SUBROUTINE INI_RAIN_ICE ( KLUOUT, PTSTEP, PDZMIN, KSPLITR, HCLOUD ) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ########################################################### ! !!**** *INI_RAIN_ICE * - initialize the constants necessary for the warm and @@ -24,7 +27,7 @@ !! sedimentation is fulfilled for a Raindrop maximal fall velocity equal !! VTRMAX. The parameters defining the collection kernels are read and are !! checked against the new ones. If any change occurs, these kernels are -!! recomputed and their numerical values are written in the output listiing. +!! recomputed and their numerical values are written in the output listing. !! !! EXTERNAL !! -------- @@ -74,13 +77,14 @@ !! 24/03/01 Update XCRIAUTI for cirrus cases !! J.-P. Pinty 24/11/01 Update ICE3/ICE4 options !! S. Riette 2016-11: new ICE3/ICE4 options -!! +!! P. Wautelet 22/01/2019 bug correction: incorrect write +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODE_FM USE MODD_CST USE MODD_LUNIT USE MODD_PARAMETERS @@ -101,6 +105,9 @@ USE MODE_READ_XKER_SWETH, ONLY: READ_XKER_SWETH USE MODE_READ_XKER_GWETH, ONLY: READ_XKER_GWETH USE MODE_READ_XKER_RWETH, ONLY: READ_XKER_RWETH ! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -169,6 +176,7 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE) ! +IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE) ! !* 0. FUNCTION STATEMENTS ! ------------------- diff --git a/src/arome/micro/lima_adjust.F90 b/src/arome/micro/lima_adjust.F90 index 195cc8b1e7acb9caee488be28cfee2e8324cb70a..5a890472e708a910d6d0f2d8c8653b4ad4929cbc 100644 --- a/src/arome/micro/lima_adjust.F90 +++ b/src/arome/micro/lima_adjust.F90 @@ -160,8 +160,6 @@ USE YOMMDDH, ONLY : TMDDH USE MODI_BUDGET_DDH USE MODI_LIMA_FUNCTIONS ! -USE MODE_FM -USE MODE_FMWRIT ! IMPLICIT NONE ! diff --git a/src/arome/micro/lima_warm.F90 b/src/arome/micro/lima_warm.F90 index 1a74e7b2ef6d0b044332adc5c93d7e8ed447f440..7778d173fce30e3def032344b8a7099fa2b3886b 100644 --- a/src/arome/micro/lima_warm.F90 +++ b/src/arome/micro/lima_warm.F90 @@ -148,9 +148,6 @@ USE MODD_NSV USE MODD_BUDGET USE MODI_BUDGET_DDH ! -USE MODE_FM -USE MODE_FMWRIT -! USE MODI_LIMA_WARM_SEDIMENTATION USE MODI_LIMA_WARM_NUCL USE MODI_LIMA_WARM_COAL diff --git a/src/arome/micro/modd_cst.F90 b/src/arome/micro/modd_cst.F90 new file mode 100644 index 0000000000000000000000000000000000000000..86361573695350b804440998b3b87df7b7b671bf --- /dev/null +++ b/src/arome/micro/modd_cst.F90 @@ -0,0 +1,101 @@ +! ######spl + MODULE MODD_CST +! ############### +! +!!**** *MODD_CST* - declaration of Physic constants +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the +! Physics constants. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (MODD_CST) +!! +!! AUTHOR +!! ------ +!! V. Ducrocq *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 16/05/94 +!! J. Stein 02/01/95 add xrholw +!! J.-P. Pinty 13/12/95 add XALPI,XBETAI,XGAMI +!! J. Stein 25/07/97 add XTH00 +!! V. Masson 05/10/98 add XRHOLI +!! C. Mari 31/10/00 add NDAYSEC +!! V. Masson 01/03/03 add conductivity of ice +!! R. El Khatib 04/08/14 add pre-computed quantities +!! J.L. Redelsperger 03/2021 add constants for ocean penetrating solar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +REAL,SAVE :: XPI ! Pi +! +REAL,SAVE :: XDAY,XSIYEA,XSIDAY ! day duration, sideral year duration, + ! sideral day duration +! +REAL,SAVE :: XKARMAN ! von karman constant +REAL,SAVE :: XLIGHTSPEED ! light speed +REAL,SAVE :: XPLANCK ! Planck constant +REAL,SAVE :: XBOLTZ ! Boltzman constant +REAL,SAVE :: XAVOGADRO ! Avogadro number +! +REAL,SAVE :: XRADIUS,XOMEGA ! Earth radius, earth rotation +REAL,SAVE :: XG ! Gravity constant +! +REAL,SAVE :: XP00 ! Reference pressure +REAL,SAVE :: XP00OCEAN ! Reference pressure for ocean model +REAL,SAVE :: XRH00OCEAN ! Reference density for ocean model +! +REAL,SAVE :: XSTEFAN,XI0 ! Stefan-Boltzman constant, solar constant +! +REAL,SAVE :: XMD,XMV ! Molar mass of dry air and molar mass of vapor +REAL,SAVE :: XRD,XRV ! Gaz constant for dry air, gaz constant for vapor +REAL,SAVE :: XEPSILO ! XMV/XMD +REAL,SAVE :: XCPD,XCPV ! Cpd (dry air), Cpv (vapor) +REAL,SAVE :: XRHOLW ! Volumic mass of liquid water +REAL,SAVE :: XCL,XCI ! Cl (liquid), Ci (ice) +REAL,SAVE :: XTT ! Triple point temperature +REAL,SAVE :: XLVTT ! Vaporization heat constant +REAL,SAVE :: XLSTT ! Sublimation heat constant +REAL,SAVE :: XLMTT ! Melting heat constant +REAL,SAVE :: XESTT ! Saturation vapor pressure at triple point + ! temperature +REAL,SAVE :: XALPW,XBETAW,XGAMW ! Constants for saturation vapor + ! pressure function +REAL,SAVE :: XALPI,XBETAI,XGAMI ! Constants for saturation vapor + ! pressure function over solid ice +REAL,SAVE :: XCONDI ! thermal conductivity of ice (W m-1 K-1) +REAL,SAVE :: XALPHAOC ! thermal expansion coefficient for ocean (K-1) +REAL,SAVE :: XBETAOC ! Haline contraction coeff for ocean (S-1) +REAL,SAVE :: XTH00 ! reference value for the potential temperature +REAL,SAVE :: XTH00OCEAN ! Ref value for pot temp in ocean model +REAL,SAVE :: XSA00OCEAN ! Ref value for SAlinity in ocean model +REAL,SAVE :: XROC=0.69! 3 coeffs for SW penetration in Ocean (Hoecker et al) +REAL,SAVE :: XD1=1.1 +REAL,SAVE :: XD2=23. +! Values used in SURFEX CMO +!REAL,SAVE :: XROC=0.58 +!REAL,SAVE :: XD1=0.35 +!REAL,SAVE :: XD2=23. + +REAL,SAVE :: XRHOLI ! Volumic mass of liquid water +! +INTEGER, SAVE :: NDAYSEC ! Number of seconds in a day +! +REAL,SAVE :: RDSRV ! XRD/XRV +REAL,SAVE :: RDSCPD ! XRD/XCPD +REAL,SAVE :: RINVXP00 ! 1./XP00 +! +REAL,SAVE :: XMNH_EPSILON ! minimum space with 1.0 +END MODULE MODD_CST diff --git a/src/arome/dead_code/mode_qsatmx_tab.F90 b/src/arome/micro/mode_qsatmx_tab.F90 similarity index 100% rename from src/arome/dead_code/mode_qsatmx_tab.F90 rename to src/arome/micro/mode_qsatmx_tab.F90 diff --git a/src/arome/turb/bl_depth_diag_1d.F90 b/src/arome/turb/bl_depth_diag_1d.F90 deleted file mode 100644 index c477ca8ef4893d2c19ab0f4d68b580b95de1a775..0000000000000000000000000000000000000000 --- a/src/arome/turb/bl_depth_diag_1d.F90 +++ /dev/null @@ -1,38 +0,0 @@ -! ######spl -FUNCTION BL_DEPTH_DIAG_1D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -USE MODI_BL_DEPTH_DIAG_3D -IMPLICIT NONE -! -INTEGER, INTENT(IN) :: KKB ! bottom point -INTEGER, INTENT(IN) :: KKE ! top point -REAL, INTENT(IN) :: PSURF ! surface flux -REAL, INTENT(IN) :: PZS ! orography -REAL, DIMENSION(:), INTENT(IN) :: PFLUX ! flux -REAL, DIMENSION(:), INTENT(IN) :: PZZ ! altitude of flux points -REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux -REAL :: BL_DEPTH_DIAG_1D -! -REAL, DIMENSION(1,1) :: ZSURF -REAL, DIMENSION(1,1) :: ZZS -REAL, DIMENSION(1,1,SIZE(PFLUX)) :: ZFLUX -REAL, DIMENSION(1,1,SIZE(PZZ)) :: ZZZ -REAL, DIMENSION(1,1) :: ZBL_DEPTH_DIAG -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('BL_DEPTH_DIAG_1D',0,ZHOOK_HANDLE) -ZSURF = PSURF -ZZS = PZS -ZFLUX(1,1,:) = PFLUX(:) -ZZZ (1,1,:) = PZZ (:) -! -ZBL_DEPTH_DIAG = BL_DEPTH_DIAG_3D(KKB,KKE,ZSURF,ZZS,ZFLUX,ZZZ,PFTOP_O_FSURF) -! -BL_DEPTH_DIAG_1D = ZBL_DEPTH_DIAG(1,1) -! -!------------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('BL_DEPTH_DIAG_1D',1,ZHOOK_HANDLE) -END FUNCTION BL_DEPTH_DIAG_1D 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/modd_turbn.F90 b/src/arome/turb/modd_turbn.F90 deleted file mode 100644 index 3d11a7b591941538033c61d4e9fa3e1f71b1d8d1..0000000000000000000000000000000000000000 --- a/src/arome/turb/modd_turbn.F90 +++ /dev/null @@ -1,3 +0,0 @@ -MODULE MODD_TURB_n - CHARACTER (LEN=4), SAVE :: CTURBLEN='BL89' -ENDMODULE MODD_TURB_n diff --git a/src/arome/turb/modi_bl89.F90 b/src/arome/turb/modi_bl89.F90 deleted file mode 100644 index e451772994675a8640f6cce983666f77da09a8aa..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_bl89.F90 +++ /dev/null @@ -1,22 +0,0 @@ -! ######spl - MODULE MODI_BL89 -! ################ -INTERFACE - SUBROUTINE BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,PTHLM,KRR,PRM,PTKEM,PSHEAR,PLM) -! -INTEGER, INTENT(IN) :: KKA -INTEGER, INTENT(IN) :: KKU -INTEGER, INTENT(IN) :: KKL -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM -INTEGER, INTENT(IN) :: KRR -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSHEAR -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM - -END SUBROUTINE BL89 -END INTERFACE -END MODULE MODI_BL89 diff --git a/src/arome/turb/modi_bl_depth_diag.F90 b/src/arome/turb/modi_bl_depth_diag.F90 deleted file mode 100644 index 778761f9c327fd3efa4447d3c465558cabcf8436..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_bl_depth_diag.F90 +++ /dev/null @@ -1,36 +0,0 @@ -! ######spl - MODULE MODI_BL_DEPTH_DIAG -! ################ -! -INTERFACE BL_DEPTH_DIAG -! -! - FUNCTION BL_DEPTH_DIAG_3D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) - -INTEGER, INTENT(IN) :: KKB ! bottom point -INTEGER, INTENT(IN) :: KKE ! top point -REAL, DIMENSION(:,:), INTENT(IN) :: PSURF ! surface flux -REAL, DIMENSION(:,:), INTENT(IN) :: PZS ! orography -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLUX ! flux -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points -REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux -REAL, DIMENSION(SIZE(PSURF,1),SIZE(PSURF,2)) :: BL_DEPTH_DIAG_3D -! -END FUNCTION BL_DEPTH_DIAG_3D -! -! - FUNCTION BL_DEPTH_DIAG_1D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) -INTEGER, INTENT(IN) :: KKB ! bottom point -INTEGER, INTENT(IN) :: KKE ! top point -REAL, INTENT(IN) :: PSURF ! surface flux -REAL, INTENT(IN) :: PZS ! orography -REAL, DIMENSION(:), INTENT(IN) :: PFLUX ! flux -REAL, DIMENSION(:), INTENT(IN) :: PZZ ! altitude of flux points -REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux -REAL :: BL_DEPTH_DIAG_1D -! -END FUNCTION BL_DEPTH_DIAG_1D -! -END INTERFACE -! -END MODULE MODI_BL_DEPTH_DIAG diff --git a/src/arome/turb/modi_bl_depth_diag_3d.F90 b/src/arome/turb/modi_bl_depth_diag_3d.F90 deleted file mode 100644 index d2ea0c80dc34a1a8386177160e2374a1f02670c9..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_bl_depth_diag_3d.F90 +++ /dev/null @@ -1,24 +0,0 @@ -! ######spl - MODULE MODI_BL_DEPTH_DIAG_3D -! ################ -! -! -INTERFACE -! -! - FUNCTION BL_DEPTH_DIAG_3D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) -INTEGER, INTENT(IN) :: KKB ! bottom point -INTEGER, INTENT(IN) :: KKE ! top point -REAL, DIMENSION(:,:), INTENT(IN) :: PSURF ! surface flux -REAL, DIMENSION(:,:), INTENT(IN) :: PZS ! orography -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLUX ! flux -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points -REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux -REAL, DIMENSION(SIZE(PSURF,1),SIZE(PSURF,2)) :: BL_DEPTH_DIAG_3D -! -END FUNCTION BL_DEPTH_DIAG_3D -! -! -END INTERFACE -! -END MODULE MODI_BL_DEPTH_DIAG_3D 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/modi_emoist.F90 b/src/arome/turb/modi_emoist.F90 deleted file mode 100644 index 57e762b71b4672fa94ececaa77b7ee7e028333ed..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_emoist.F90 +++ /dev/null @@ -1,26 +0,0 @@ -! ######spl -MODULE MODI_EMOIST -!################# -! -INTERFACE -! -FUNCTION EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) RESULT(PEMOIST) -! -INTEGER :: KRR ! number of moist var. -INTEGER :: KRRI ! number of ice var. -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! Conservative pot. temperature -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios, where -! PRM(:,:,:,1) = conservative mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! Amoist -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Normalized 2dn_order - ! moment s'r'c/2Sigma_s2 -! -REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PEMOIST ! result -! -END FUNCTION EMOIST -! -END INTERFACE -! -END MODULE MODI_EMOIST diff --git a/src/arome/turb/modi_etheta.F90 b/src/arome/turb/modi_etheta.F90 deleted file mode 100644 index bc08b8a8944008eb082617954334cd06d697c10e..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_etheta.F90 +++ /dev/null @@ -1,28 +0,0 @@ -! ######spl -MODULE MODI_ETHETA -!################# -! -INTERFACE -! -FUNCTION ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) RESULT(PETHETA) -! -INTEGER :: KRR ! number of moist var. -INTEGER :: KRRI ! number of ice var. -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! Conservative pot. temperature -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios, where -! PRM(:,:,:,1) = conservative mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! Atheta -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Normalized 2dn_order - ! moment s'r'c/2Sigma_s2 -! -REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PETHETA ! result -! -! -END FUNCTION ETHETA -! -END INTERFACE -! -END MODULE MODI_ETHETA diff --git a/src/arome/turb/modi_prandtl.F90 b/src/arome/turb/modi_prandtl.F90 deleted file mode 100644 index 74fb802bfb827554494503afc12486fc191ca5d3..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_prandtl.F90 +++ /dev/null @@ -1,72 +0,0 @@ -! ######spl - MODULE MODI_PRANDTL -! ################### -! -INTERFACE -! - SUBROUTINE PRANDTL(KKA,KKU,KKL,KRR,KRRI,OCLOSE_OUT,OTURB_DIAG,& - HTURBDIM, & - HFMFILE,HLUOUT, & - PDXX,PDYY,PDZZ,PDZX,PDZY, & - PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & - PLM,PLEPS,PTKEM,PTHLM,PRM,PSVM,PSRCM, & - PREDTH1,PREDR1, & - PRED2TH3, PRED2R3, PRED2THR3, & - PREDS1,PRED2THS3, PRED2RS3, & - PBLL_O_E, & - PETHETA, PEMOIST ) -! -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRI ! number of ice var. -! -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening -LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some - ! diagnostic fields in the syncronous FM-file -CHARACTER*4 , INTENT(IN) :: HTURBDIM ! Kind of turbulence param. -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential Temp. - ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turbulent Mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! Dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM,PTKEM! Conservative Potential - ! Temperature and TKE at t-1 -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-1 - ! with PRM(:,:,:,1) = cons. - ! mixing ratio -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Scalars at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM - ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -! -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDTH1 ! Redelsperger number R_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDR1 ! Redelsperger number R_q -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2TH3 ! Redelsperger number R*2_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2R3 ! Redelsperger number R*2_q -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2THR3! Redelsperger number R*2_thq -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PREDS1 ! Redelsperger number R_sv -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2THS3! Redelsperger number R*2_thsv -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2RS3 ! Redelsperger number R*2_qsv -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBLL_O_E! beta*Lk*Leps/tke -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PETHETA ! coefficient E_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMOIST ! coefficient E_moist -! -END SUBROUTINE PRANDTL -! -END INTERFACE -! -END MODULE MODI_PRANDTL diff --git a/src/arome/turb/modi_rmc01.F90 b/src/arome/turb/modi_rmc01.F90 deleted file mode 100644 index 1845c21be2008c32a085aee0d8d689a094163dd2..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_rmc01.F90 +++ /dev/null @@ -1,24 +0,0 @@ -! ######spl - MODULE MODI_RMC01 -! ################ -INTERFACE - SUBROUTINE RMC01(HTURBLEN,KKA,KKU,KKL,PZZ,PDXX,PDYY,PDZZ,PDIRCOSZW, & - PSBL_DEPTH, PLMO, PLK, PLEPS ) -! -CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN ! type of mixing length -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! width of grid mesh (X dir) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! width of grid mesh (Y dir) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! width of vert. layers -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus -REAL, DIMENSION(:,:), INTENT(IN) :: PSBL_DEPTH! SBL depth -REAL, DIMENSION(:,:), INTENT(IN) :: PLMO ! Monin Obuhkov length -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLK ! Mixing length -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLEPS ! Dissipative length - -END SUBROUTINE RMC01 -END INTERFACE -END MODULE MODI_RMC01 diff --git a/src/arome/turb/modi_sbl_depth.F90 b/src/arome/turb/modi_sbl_depth.F90 deleted file mode 100644 index 1f9fb94399496182fc754321a72f27ad3c047820..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_sbl_depth.F90 +++ /dev/null @@ -1,24 +0,0 @@ -! ######spl - MODULE MODI_SBL_DEPTH -! ################ -! -INTERFACE -! - SUBROUTINE SBL_DEPTH(KKB,KKE,PZZ,PFLXU,PFLXV,PWTHV,PLMO,PSBL_DEPTH) -! -INTEGER, INTENT(IN) :: KKB ! first physical level -INTEGER, INTENT(IN) :: KKE ! upper physical level -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux levels -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXU ! u'w' -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXV ! v'w' -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWTHV ! buoyancy flux -REAL, DIMENSION(:,:), INTENT(IN) :: PLMO ! Monin-Obukhov length -REAL, DIMENSION(:,:), INTENT(INOUT) :: PSBL_DEPTH! boundary layer height -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE SBL_DEPTH -! -END INTERFACE -! -END MODULE MODI_SBL_DEPTH diff --git a/src/arome/turb/modi_th_r_from_thl_rt_1d.F90 b/src/arome/turb/modi_th_r_from_thl_rt_1d.F90 deleted file mode 100644 index 577edb249bc26074fe0e702f3b42755230e6f855..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_th_r_from_thl_rt_1d.F90 +++ /dev/null @@ -1,24 +0,0 @@ -! ######spl - MODULE MODI_TH_R_FROM_THL_RT_1D -! ############################### -! - INTERFACE - SUBROUTINE TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE,PP, & - PTHL, PRT, PTH, PRV, PRL, PRI, & - PRSATW, PRSATI, PRR, PRS, PRG, PRH ) -CHARACTER*1 , INTENT(IN) :: HFRAC_ICE -REAL, DIMENSION(:), INTENT(INOUT) :: PFRAC_ICE -REAL, DIMENSION(:), INTENT(IN) :: PP ! Pressure -REAL, DIMENSION(:), INTENT(IN) :: PTHL ! Liquid pot. temp. -REAL, DIMENSION(:), INTENT(IN) :: PRT ! Total mixing ratios -REAL, DIMENSION(:),OPTIONAL,INTENT(IN) :: PRR, PRS, PRG, PRH -REAL, DIMENSION(:), INTENT(OUT):: PTH ! Potential temp. -REAL, DIMENSION(:), INTENT(OUT):: PRV ! vapor mixing ratio -REAL, DIMENSION(:), INTENT(INOUT):: PRL ! cloud mixing ratio -REAL, DIMENSION(:), INTENT(INOUT):: PRI ! ice mixing ratio -REAL, DIMENSION(:), INTENT(OUT) :: PRSATW ! estimated mixing ration at saturation over water -REAL, DIMENSION(:), INTENT(OUT) :: PRSATI ! estimated mixing ration at saturation over ice - - END SUBROUTINE TH_R_FROM_THL_RT_1D - END INTERFACE - END MODULE MODI_TH_R_FROM_THL_RT_1D diff --git a/src/arome/turb/modi_th_r_from_thl_rt_2d.F90 b/src/arome/turb/modi_th_r_from_thl_rt_2d.F90 deleted file mode 100644 index a3af56f230d40c878f0107fccf848bf0e0767939..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_th_r_from_thl_rt_2d.F90 +++ /dev/null @@ -1,24 +0,0 @@ -! ######spl - MODULE MODI_TH_R_FROM_THL_RT_2D - INTERFACE - SUBROUTINE TH_R_FROM_THL_RT_2D(HFRAC_ICE,PFRAC_ICE,PP, & - PTHL, PRT, PTH, PRV, PRL, PRI, & - PRSATW, PRSATI, PRR, PRS, PRG, PRH ) -CHARACTER*1 , INTENT(IN) :: HFRAC_ICE -REAL, DIMENSION(:,:), INTENT(INOUT) :: PFRAC_ICE -REAL, DIMENSION(:,:), INTENT(IN) :: PP ! Pressure -REAL, DIMENSION(:,:), INTENT(IN) :: PTHL ! thetal to transform into th -REAL, DIMENSION(:,:),INTENT(IN) :: PRT ! Total mixing ratios to transform into rv,rc and ri -REAL, DIMENSION(:),OPTIONAL,INTENT(IN) :: PRR, PRS, PRG, PRH -REAL, DIMENSION(:,:), INTENT(OUT):: PTH ! th -REAL, DIMENSION(:,:), INTENT(OUT):: PRV ! vapor mixing ratio -REAL, DIMENSION(:,:), INTENT(INOUT):: PRL ! vapor mixing ratio -REAL, DIMENSION(:,:), INTENT(INOUT):: PRI ! vapor mixing ratio -REAL, DIMENSION(:,:), INTENT(OUT) :: PRSATW ! estimated mixing ration at saturation over water -REAL, DIMENSION(:,:), INTENT(OUT) :: PRSATI ! estimated mixing ration at saturation over ice - - END SUBROUTINE TH_R_FROM_THL_RT_2D - - END INTERFACE - - END MODULE MODI_TH_R_FROM_THL_RT_2D diff --git a/src/arome/turb/modi_th_r_from_thl_rt_3d.F90 b/src/arome/turb/modi_th_r_from_thl_rt_3d.F90 deleted file mode 100644 index 5b52a056f4b7b7b6889c6f0c893843bbb65cc2d7..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_th_r_from_thl_rt_3d.F90 +++ /dev/null @@ -1,27 +0,0 @@ -! ######spl - MODULE MODI_TH_R_FROM_THL_RT_3D -! ############################### -INTERFACE -! - SUBROUTINE TH_R_FROM_THL_RT_3D(HFRAC_ICE,PFRAC_ICE,PP, & - PTHL, PRT, PTH, PRV, PRL, PRI, & - PRSATW, PRSATI, PRR, PRS, PRG, PRH ) - -CHARACTER*1 , INTENT(IN) :: HFRAC_ICE -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PFRAC_ICE -REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! Pressure -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHL ! thetal to transform into th -REAL, DIMENSION(:,:,:),INTENT(IN) :: PRT ! Total mixing ratios to transform into rv,rc and ri -REAL, DIMENSION(:,:,:),OPTIONAL,INTENT(IN) :: PRR, PRS, PRG, PRH -REAL, DIMENSION(:,:,:), INTENT(OUT):: PTH ! th -REAL, DIMENSION(:,:,:), INTENT(OUT):: PRV ! vapor mixing ratio -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRL ! vapor mixing ratio -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRI ! vapor mixing ratio -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRSATW ! estimated mixing ration at saturation over water -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRSATI ! estimated mixing ration at saturation over ice -! -END SUBROUTINE TH_R_FROM_THL_RT_3D -! -END INTERFACE -! -END MODULE MODI_TH_R_FROM_THL_RT_3D diff --git a/src/arome/turb/modi_thl_rt_from_th_r_mf.F90 b/src/arome/turb/modi_thl_rt_from_th_r_mf.F90 deleted file mode 100644 index ed1dd9c6bdde9ebd379a8dbac1f5ed49281a884e..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_thl_rt_from_th_r_mf.F90 +++ /dev/null @@ -1,31 +0,0 @@ -! ######spl - MODULE MODI_THL_RT_FROM_TH_R_MF -! ############################### -! -INTERFACE -! ################################################################# - SUBROUTINE THL_RT_FROM_TH_R_MF( KRR,KRRL,KRRI, & - PTH, PR, PEXN, & - PTHL, PRT ) -! ################################################################# -! -! -!* 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) :: PEXN ! exner function - -REAL, DIMENSION(:,:), INTENT(OUT) :: PTHL ! th_l -REAL, DIMENSION(:,:), INTENT(OUT) :: PRT ! total non precip. water -! -END SUBROUTINE THL_RT_FROM_TH_R_MF - -END INTERFACE -! -END MODULE MODI_THL_RT_FROM_TH_R_MF diff --git a/src/arome/turb/modi_tke_eps_sources.F90 b/src/arome/turb/modi_tke_eps_sources.F90 deleted file mode 100644 index 6df0247c32c30a5916e5d60446bbf8fd2b8e4b76..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_tke_eps_sources.F90 +++ /dev/null @@ -1,63 +0,0 @@ -! ######spl - MODULE MODI_TKE_EPS_SOURCES -! ########################### -INTERFACE -! - SUBROUTINE TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,PLM,PLEPS,PDP,PTRH, & - & PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & - & PTSTEP,PIMPL,PEXPL, & - & HTURBLEN,HTURBDIM, & - & HFMFILE,HLUOUT,OCLOSE_OUT,OTURB_DIAG, & - & PTP,PRTKES,PRTHLS,PCOEF_DISS,PTDIFF, & - & PTDISS,PEDR,YDDDH, YDLDDH, YDMDDH) -! -USE DDH_MIX, ONLY : TYP_DDH -USE YOMLDDH, ONLY : TLDDH -USE YOMMDDH, ONLY : TMDDH -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -INTEGER :: KMI ! model index number -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at t-deltat -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical height w-pt -REAL, INTENT(IN) :: PTSTEP ! Double Time step ( *.5 for - ! the first time step ) -REAL, INTENT(IN) :: PEXPL, PIMPL ! Coef. temporal. disc. -CHARACTER*4, INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -CHARACTER*4, INTENT(IN) :: HTURBLEN ! kind of mixing length -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening -LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some - ! diagnostic fields in the syncronous FM-file -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP, PTRH ! Dyn. prod. of TKE -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTP ! Ther. prod. of TKE -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTKES ! RHOD * Jacobian * - ! TKE at t+deltat -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTHLS ! Source of Theta_l -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCOEF_DISS ! 1/(Cph*Exner) -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDIFF ! Diffusion TKE term -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDISS ! Dissipation TKE term - -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEDR ! eddy dissipation rate -TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH -TYPE(TLDDH), INTENT(IN) :: YDLDDH -TYPE(TMDDH), INTENT(IN) :: YDMDDH -! -! -! -END SUBROUTINE TKE_EPS_SOURCES -! -END INTERFACE -! -END MODULE MODI_TKE_EPS_SOURCES diff --git a/src/arome/turb/modi_tm06.F90 b/src/arome/turb/modi_tm06.F90 deleted file mode 100644 index 5914828c395aa3015357c77808cbda3fcdf54086..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_tm06.F90 +++ /dev/null @@ -1,25 +0,0 @@ -! ######spl - MODULE MODI_TM06 -! ################ -! -INTERFACE -! - SUBROUTINE TM06(KKA,KKU,KKL,PTHVREF,PBL_DEPTH,PZZ,PSFTH,PMWTH,PMTH2) -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! reference potential temperature -REAL, DIMENSION(:,:), INTENT(IN) :: PBL_DEPTH ! boundary layer height -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux levels -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH ! surface heat flux -REAL, DIMENSION(:,:,:), INTENT(OUT):: PMWTH ! w'2th' -REAL, DIMENSION(:,:,:), INTENT(OUT):: PMTH2 ! w'th'2 -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE TM06 -! -END INTERFACE -! -END MODULE MODI_TM06 diff --git a/src/arome/turb/modi_tm06_h.F90 b/src/arome/turb/modi_tm06_h.F90 deleted file mode 100644 index c37f96f34073a05b18e3afe6f12245b9d6d4fd70..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_tm06_h.F90 +++ /dev/null @@ -1,24 +0,0 @@ -! ######spl - MODULE MODI_TM06_H -! ################ -! -INTERFACE -! - SUBROUTINE TM06_H(KKB,KKTB,KKTE,PTSTEP,PZZ,PFLXZ,PBL_DEPTH) -! -INTEGER, INTENT(IN) :: KKB ! index of 1st physical level - ! close to ground -INTEGER, INTENT(IN) :: KKTB ! first physical level in k -INTEGER, INTENT(IN) :: KKTE ! last physical level in k -REAL, INTENT(IN) :: PTSTEP ! Double time step -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux levels -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXZ ! heat flux -REAL, DIMENSION(:,:), INTENT(INOUT) :: PBL_DEPTH ! boundary layer height -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE TM06_H -! -END INTERFACE -! -END MODULE MODI_TM06_H diff --git a/src/arome/turb/modi_tridiag.F90 b/src/arome/turb/modi_tridiag.F90 deleted file mode 100644 index f04637f9f9dd2f8af39fe522c586a081addbc4ed..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_tridiag.F90 +++ /dev/null @@ -1,25 +0,0 @@ -! ######spl - MODULE MODI_TRIDIAG -! ################### -INTERFACE -! - SUBROUTINE TRIDIAG(KKA,KKU,KKL,PVARM,PA,PTSTEP,PEXPL,PIMPL, & - PRHODJ,PSOURCE,PVARP ) -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR -REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARM ! variable at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! upper diag. elements -REAL, INTENT(IN) :: PTSTEP ! Double time step -REAL, INTENT(IN) :: PEXPL,PIMPL ! weights of the temporal scheme -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSOURCE ! source term of PVAR -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVARP ! variable at t+1 -! -END SUBROUTINE TRIDIAG -! -END INTERFACE -! -END MODULE MODI_TRIDIAG diff --git a/src/arome/turb/modi_tridiag_massflux.F90 b/src/arome/turb/modi_tridiag_massflux.F90 deleted file mode 100644 index 1e6a223e9419519a53a1c768b6825536ace5c4f0..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_tridiag_massflux.F90 +++ /dev/null @@ -1,28 +0,0 @@ -! ######spl - MODULE MODI_TRIDIAG_MASSFLUX -! ################### -INTERFACE -! - SUBROUTINE TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PVARM,PF,PDFDT,PTSTEP,PIMPL, & - PDZZ,PRHODJ,PVARP ) -! -INTEGER, INTENT(IN) :: KKA ! near ground array index -INTEGER, INTENT(IN) :: KKB ! near ground physical index -INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index -INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:), INTENT(IN) :: PVARM ! variable at t-1 at mass point -REAL, DIMENSION(:,:), INTENT(IN) :: PF ! flux in dT/dt=-dF/dz at flux point -REAL, DIMENSION(:,:), INTENT(IN) :: PDFDT ! dF/dT at flux point -REAL, INTENT(IN) :: PTSTEP ! Double time step -REAL, INTENT(IN) :: PIMPL ! implicit weight -REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Dz at flux point -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J at mass point -! -REAL, DIMENSION(:,:), INTENT(OUT):: PVARP ! variable at t+1 at mass point -! -END SUBROUTINE TRIDIAG_MASSFLUX -! -END INTERFACE -! -END MODULE MODI_TRIDIAG_MASSFLUX diff --git a/src/arome/turb/modi_tridiag_thermo.F90 b/src/arome/turb/modi_tridiag_thermo.F90 deleted file mode 100644 index e0b5240fb408773f0c03411f0c4ad72290354070..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_tridiag_thermo.F90 +++ /dev/null @@ -1,26 +0,0 @@ -! ######spl - MODULE MODI_TRIDIAG_THERMO -! ################### -INTERFACE -! - SUBROUTINE TRIDIAG_THERMO(KKA,KKU,KKL,PVARM,PF,PDFDDTDZ,PTSTEP,PIMPL, & - PDZZ,PRHODJ,PVARP ) -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR -REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARM ! variable at t-1 at mass point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PF ! flux in dT/dt=-dF/dz at flux point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDFDDTDZ! dF/d(dT/dz) at flux point -REAL, INTENT(IN) :: PTSTEP ! Double time step -REAL, INTENT(IN) :: PIMPL ! implicit weight -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Dz at flux point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J at mass point -! -REAL, DIMENSION(:,:,:), INTENT(OUT):: PVARP ! variable at t+1 at mass point -! -END SUBROUTINE TRIDIAG_THERMO -! -END INTERFACE -! -END MODULE MODI_TRIDIAG_THERMO diff --git a/src/arome/turb/modi_tridiag_tke.F90 b/src/arome/turb/modi_tridiag_tke.F90 deleted file mode 100644 index 9398d9fb66015625cd42781b46a0ff95df26b0c0..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_tridiag_tke.F90 +++ /dev/null @@ -1,27 +0,0 @@ -! ######spl - MODULE MODI_TRIDIAG_TKE -! ########################## -INTERFACE -! - SUBROUTINE TRIDIAG_TKE(KKA,KKU,KKL,PVARM,PA,PTSTEP,PEXPL,PIMPL, & - PRHODJ,PSOURCE,PDIAG,PVARP ) -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARM ! variable at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! upper diag. elements -REAL, INTENT(IN) :: PTSTEP ! Double time step -REAL, INTENT(IN) :: PEXPL,PIMPL ! weights of the temporal scheme -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSOURCE ! source term of PVAR -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDIAG ! diagonal term linked to - ! the implicit dissipation -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVARP ! variable at t+1 -! -END SUBROUTINE TRIDIAG_TKE -! -END INTERFACE -! -END MODULE MODI_TRIDIAG_TKE diff --git a/src/arome/turb/modi_tridiag_wind.F90 b/src/arome/turb/modi_tridiag_wind.F90 deleted file mode 100644 index 87fb9c3e874a0606ece3d4aa2f439c3560033afa..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_tridiag_wind.F90 +++ /dev/null @@ -1,27 +0,0 @@ -! ######spl - MODULE MODI_TRIDIAG_WIND -! ######################## -INTERFACE -! - SUBROUTINE TRIDIAG_WIND(KKA,KKU,KKL,PVARM,PA,PCOEFS,PTSTEP,PEXPL,PIMPL, & - PRHODJA,PSOURCE,PVARP ) -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR -REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARM ! variable at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! upper diag. elements -REAL, DIMENSION(:,:), INTENT(IN) :: PCOEFS ! implicit coeff for the - ! surface flux -REAL, INTENT(IN) :: PTSTEP ! Double time step -REAL, INTENT(IN) :: PEXPL,PIMPL ! weights of the temporal scheme -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJA ! (dry rho)*J averaged -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSOURCE ! source term of PVAR -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVARP ! variable at t+1 -! -END SUBROUTINE TRIDIAG_WIND -! -END INTERFACE -! -END MODULE MODI_TRIDIAG_WIND diff --git a/src/arome/turb/modi_turb_ver.F90 b/src/arome/turb/modi_turb_ver.F90 deleted file mode 100644 index 56dbe815d09ec06450d646e51345a6c120c157e6..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_turb_ver.F90 +++ /dev/null @@ -1,125 +0,0 @@ -! ######spl - MODULE MODI_TURB_VER -! #################### -! -INTERFACE -! - SUBROUTINE TURB_VER(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OCLOSE_OUT,OTURB_FLX, & - HTURBDIM,HTOM,PIMPL,PEXPL, & - PTSTEP_UVW,PTSTEP_MET, PTSTEP_SV, & - HFMFILE,HLUOUT, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & - PCOSSLOPE,PSINSLOPE, & - PRHODJ,PTHVREF, & - PSFTHM,PSFRM,PSFSVM,PSFTHP,PSFRP,PSFSVP, & - PCDUEFF,PTAU11M,PTAU12M,PTAU33M, & - PUM,PVM,PWM,PUSLOPEM,PVSLOPEM,PTHLM,PRM,PSVM, & - PTKEM,PLM,PLENGTHM,PLENGTHH,PLEPS,MFMOIST, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & - PFWTH,PFWR,PFTH2,PFR2,PFTHR,PBL_DEPTH, & - PSBL_DEPTH,PLMO, & - PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS, & - PDP,PTP,PSIGS,PWTH,PWRC,PWSV ) - -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -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. -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -CHARACTER*4, INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -CHARACTER*4, INTENT(IN) :: HTOM ! type of Third Order Moment -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -REAL, INTENT(IN) :: PTSTEP_UVW ! Dynamical timestep -REAL, INTENT(IN) :: PTSTEP_MET ! Timestep for meteorological variables -REAL, INTENT(IN) :: PTSTEP_SV ! Timestep for tracer variables -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitudes at flux points -REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle - ! between i and the slope vector -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(:,:,:), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual - ! Potential Temperature -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! t - deltat -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVP ! t + deltat -! -REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked - ! to the maximum slope direction and the surface normal and the binormal - ! at time t - dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM - ! Wind and potential temperature at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios - ! at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t -REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the - ! maximum slope direction -REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the - ! direction normal to the maximum slope one -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLENGTHM ! Turb. mixing length momentum -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLENGTHH ! Turb. mixing length heat/moisture - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized - ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz -REAL, DIMENSION(:,:), INTENT(INOUT):: PBL_DEPTH ! BL depth -REAL, DIMENSION(:,:), INTENT(INOUT):: PSBL_DEPTH ! SBL depth -REAL, DIMENSION(:,:), INTENT(IN) :: PLMO ! Monin-Obukhov length -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS, PRTHLS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS,PRRS - ! cumulated sources for the prognostic variables -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP,PTP ! Dynamic and thermal - ! TKE production terms -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at t -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux -REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux - -! -! -END SUBROUTINE TURB_VER -! -END INTERFACE -! -END MODULE MODI_TURB_VER diff --git a/src/arome/turb/modi_turb_ver_dyn_flux.F90 b/src/arome/turb/modi_turb_ver_dyn_flux.F90 deleted file mode 100644 index a58d4f8a34cbd0d308c9b370765f370458e33e1c..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_turb_ver_dyn_flux.F90 +++ /dev/null @@ -1,86 +0,0 @@ -! ######spl - MODULE MODI_TURB_VER_DYN_FLUX -! #################### -! -INTERFACE -! - SUBROUTINE TURB_VER_DYN_FLUX(KKA,KKU,KKL, & - OCLOSE_OUT,OTURB_FLX,KRR, & - HTURBDIM,PIMPL,PEXPL, & - PTSTEP, & - HFMFILE,HLUOUT, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & - PCOSSLOPE,PSINSLOPE, & - PRHODJ, & - PCDUEFF,PTAU11M,PTAU12M,PTAU33M, & - PTHLM,PRM,PSVM,PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & - PTKEM,PLM,MFMOIST,PWU,PWV, & - PRUS,PRVS,PRWS, & - PDP,PTP ) -! -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -INTEGER, INTENT(IN) :: KRR ! number of moist var. -CHARACTER*4, INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -REAL, INTENT(IN) :: PTSTEP ! Double Time Step -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle - ! between i and the slope vector -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(:,:,:), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme - -! -REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked - ! to the maximum slope direction and the surface normal and the binormal - ! at time t - dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM - ! Wind at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM -REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the - ! maximum slope direction -REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the - ! direction normal to the maximum slope one -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWU ! momentum flux u'w' -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWV ! momentum flux v'w' -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS - ! cumulated sources for the prognostic variables -! -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP,PTP ! Dynamic and thermal - ! TKE production terms -! -! -! -END SUBROUTINE TURB_VER_DYN_FLUX -! -END INTERFACE -! -END MODULE MODI_TURB_VER_DYN_FLUX diff --git a/src/arome/turb/modi_turb_ver_sv_corr.F90 b/src/arome/turb/modi_turb_ver_sv_corr.F90 deleted file mode 100644 index 31a993729572ee1f9f42393947976daf65d5a093..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_turb_ver_sv_corr.F90 +++ /dev/null @@ -1,44 +0,0 @@ -! ######spl - MODULE MODI_TURB_VER_SV_CORR -! #################### -! -INTERFACE -! - SUBROUTINE TURB_VER_SV_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & - PDZZ, & - PTHLM,PRM,PTHVREF, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PPHI3,PPSI3, & - PWM,PSVM, & - PTKEM,PLM,PLEPS,PPSI_SV ) -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRL ! number of liquid var. -INTEGER, INTENT(IN) :: KRRI ! number of ice var. -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ - ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! potential temperature at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-Delta t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! reference Thv -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized - ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Inv.Turb.Sch.for temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Inv.Turb.Sch.for humidity -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! w at time t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PPSI_SV ! Inv.Turb.Sch.for scalars - ! cumulated sources for the prognostic variables -! -! -END SUBROUTINE TURB_VER_SV_CORR -! -END INTERFACE -! -END MODULE MODI_TURB_VER_SV_CORR diff --git a/src/arome/turb/modi_turb_ver_sv_flux.F90 b/src/arome/turb/modi_turb_ver_sv_flux.F90 deleted file mode 100644 index dd10b563a2ff8686a345e31a6c75f662a56a86b2..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_turb_ver_sv_flux.F90 +++ /dev/null @@ -1,65 +0,0 @@ -! ######spl - MODULE MODI_TURB_VER_SV_FLUX -! #################### -! -INTERFACE -! - SUBROUTINE TURB_VER_SV_FLUX(KKA,KKU,KKL, & - OCLOSE_OUT,OTURB_FLX,HTURBDIM, & - PIMPL,PEXPL, & - PTSTEP, & - HFMFILE,HLUOUT, & - PDZZ,PDIRCOSZW, & - PRHODJ,PWM, & - PSFSVM,PSFSVP, & - PSVM, & - PTKEM,PLM,MFMOIST,PPSI_SV, & - PRSVS,PWSV ) -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -CHARACTER*4, INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -REAL, INTENT(IN) :: PTSTEP ! Double Time Step -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(:,:,:), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme - -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! t - deltat -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVP ! t + deltat -! -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! vertical wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PPSI_SV ! Inv.Turb.Sch.for scalars -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS - ! cumulated sources for the prognostic variables -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PWSV ! scalar flux - -! -! -END SUBROUTINE TURB_VER_SV_FLUX -! -END INTERFACE -! -END MODULE MODI_TURB_VER_SV_FLUX diff --git a/src/arome/turb/modi_turb_ver_thermo_corr.F90 b/src/arome/turb/modi_turb_ver_thermo_corr.F90 deleted file mode 100644 index 43d35b7707fc90cc4dee3546333e1cbaff4ef77c..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_turb_ver_thermo_corr.F90 +++ /dev/null @@ -1,107 +0,0 @@ -! ######spl - MODULE MODI_TURB_VER_THERMO_CORR -! #################### -! -INTERFACE -! - SUBROUTINE TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OCLOSE_OUT,OTURB_FLX,HTURBDIM,HTOM, & - PIMPL,PEXPL, & - HFMFILE,HLUOUT, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW, & - PRHODJ,PTHVREF, & - PSFTHM,PSFRM,PSFTHP,PSFRP, & - PWM,PTHLM,PRM,PSVM, & - PTKEM,PLM,PLEPS, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & - PBETA, PSQRT_TKE, PDTH_DZ, PDR_DZ, PRED2TH3, & - PRED2R3, PRED2THR3, PBLL_O_E, PETHETA, & - PEMOIST, PREDTH1, PREDR1, PPHI3, PPSI3, PD, & - PFWTH,PFWR,PFTH2,PFR2,PFTHR, & - PTHLP,PRP,MFMOIST,PSIGS ) -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR -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. -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -CHARACTER*4, INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -CHARACTER*4, INTENT(IN) :: HTOM ! type of Third Order Moment -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(:,:,:), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual - ! Potential Temperature -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time -! ! t - deltat -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time -! ! t + deltat -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM -! Vertical wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM -! potential temperature at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios - ! at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Mixing ratios -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized - ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA ! buoyancy coefficient -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE ! sqrt(e) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTH_DZ ! d(th)/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDR_DZ ! d(rt)/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 ! 3D Redeslperger number R*2_th -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 ! 3D Redeslperger number R*2_r -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 ! 3D Redeslperger number R*2_thr -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E ! beta * Lk * Leps / tke -REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA ! Coefficient for theta in theta_v computation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST ! Coefficient for r in theta_v computation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 ! 1D Redelsperger number for Th -REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 ! 1D Redelsperger number for r -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Prandtl number for temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Prandtl number for vapor -REAL, DIMENSION(:,:,:), INTENT(IN) :: PD ! Denominator in Prandtl numbers -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz (at flux point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz (at flux point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz (at mass point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz (at mass point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at mass point) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLP ! guess of thl at t+ deltat -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRP ! guess of r at t+ deltat -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at t -! -! -! -END SUBROUTINE TURB_VER_THERMO_CORR -! -END INTERFACE -! -END MODULE MODI_TURB_VER_THERMO_CORR diff --git a/src/arome/turb/modi_turb_ver_thermo_flux.F90 b/src/arome/turb/modi_turb_ver_thermo_flux.F90 deleted file mode 100644 index 19a050e790bf82229cd2acd0a5b3a670045e83c5..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_turb_ver_thermo_flux.F90 +++ /dev/null @@ -1,118 +0,0 @@ -! ######spl - MODULE MODI_TURB_VER_THERMO_FLUX -! #################### -! -INTERFACE -! - SUBROUTINE TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OCLOSE_OUT,OTURB_FLX,HTURBDIM,HTOM, & - PIMPL,PEXPL, & - PTSTEP, & - HFMFILE,HLUOUT, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & - PRHODJ,PTHVREF, & - PSFTHM,PSFRM,PSFTHP,PSFRP, & - PWM,PTHLM,PRM,PSVM, & - PTKEM,PLM,PLEPS, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & - PBETA, PSQRT_TKE, PDTH_DZ, PDR_DZ, PRED2TH3, & - PRED2R3, PRED2THR3, PBLL_O_E, PETHETA, & - PEMOIST, PREDTH1, PREDR1, PPHI3, PPSI3, PD, & - PFWTH,PFWR,PFTH2,PFR2,PFTHR,MFMOIST,PBL_DEPTH,& - PWTHV,PRTHLS,PRRS,PTHLP,PRP,PTP,PWTH,PWRC ) -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR O -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. -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -CHARACTER*4, INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -CHARACTER*4, INTENT(IN) :: HTOM ! type of Third Order Moment -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -REAL, INTENT(IN) :: PTSTEP ! Double Time Step -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitudes -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(:,:,:), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual - ! Potential Temperature -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time -! ! t - deltat -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time -! ! t + deltat -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM -! Vertical wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM -! potential temperature at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios - ! at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Mixing ratios -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized - ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA ! buoyancy coefficient -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE ! sqrt(e) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTH_DZ ! d(th)/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDR_DZ ! d(rt)/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 ! 3D Redeslperger number R*2_th -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 ! 3D Redeslperger number R*2_r -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 ! 3D Redeslperger number R*2_thr -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E ! beta * Lk * Leps / tke -REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA ! Coefficient for theta in theta_v computation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST ! Coefficient for r in theta_v computation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 ! 1D Redelsperger number for Th -REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 ! 1D Redelsperger number for r -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Prandtl number for temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Prandtl number for vapor -REAL, DIMENSION(:,:,:), INTENT(IN) :: PD ! Denominator in Prandtl numbers -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz (at flux point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz (at flux point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz (at mass point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz (at mass point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at mass point) -REAL, DIMENSION(:,:), INTENT(INOUT):: PBL_DEPTH ! BL depth -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTHV ! buoyancy flux -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHLS ! cumulated source for theta -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS ! cumulated source for rt -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHLP ! guess of thl at t+ deltat -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRP ! guess of r at t+ deltat -! -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTP ! Dynamic and thermal - ! TKE production terms -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux -! -! -END SUBROUTINE TURB_VER_THERMO_FLUX -! -END INTERFACE -! -END MODULE MODI_TURB_VER_THERMO_FLUX diff --git a/src/arome/turb/modi_update_lm.F90 b/src/arome/turb/modi_update_lm.F90 deleted file mode 100644 index d2a31786e9a15acb0f239ed06035cbba5a160ac8..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_update_lm.F90 +++ /dev/null @@ -1,18 +0,0 @@ -! ######spl - MODULE MODI_UPDATE_LM -! ################### -INTERFACE -! -SUBROUTINE UPDATE_LM(HLBCX,HLBCY,PLM,PLEPS) -! -CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X boundary type -CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! Y boundary type -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLM ! mixing length -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLEPS ! dissipative length -! -END SUBROUTINE UPDATE_LM -! -END INTERFACE -! -END MODULE MODI_UPDATE_LM diff --git a/src/arome/turb/modi_updraft_sope.F90 b/src/arome/turb/modi_updraft_sope.F90 deleted file mode 100644 index 5fb81013f97ace2f68f41079baaff78d25a04234..0000000000000000000000000000000000000000 --- a/src/arome/turb/modi_updraft_sope.F90 +++ /dev/null @@ -1,54 +0,0 @@ -! ######spl - MODULE MODI_UPDRAFT_SOPE -! ################################# -! -INTERFACE -! - SUBROUTINE UPDRAFT_SOPE(KRR,KRRL,KRRI,OMIXUV, & - PZZ,PDZZ,PSFTH,PSFRV,PPABSM,PRHODREF, & - PTKEM,PTHM,PRM,PTHLM,PRTM,PUM,PVM,PSVM, & - PTHL_UP,PRT_UP,PRV_UP,PU_UP,PV_UP,PSV_UP, & - PRC_UP,PRI_UP,PTHV_UP,PW_UP,PFRAC_UP,PEMF,& - PDETR,PENTR,KKLCL,KKETL,KKCTL ) -! -! -! -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. -LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height at the flux point - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! depth between mass levels - -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV - ! normal surface fluxes of theta,rv -! -! prognostic variables at t- deltat -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry density of the - ! reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM ! momentum -! -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Scalar variables -! -! thermodynamical variables which are transformed in conservative var. -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! pot. temp. = PTHLM in turb.f90 -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! water species -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM,PRTM !cons. var. -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRV_UP,PRC_UP,PRI_UP,&!Thl,Rt,Rv,Rc,Ri - PW_UP,PFRAC_UP,PEMF, &!w,Updraft Fraction, Mass Flux - PDETR,PENTR,PTHV_UP, &!entrainment, detrainment, ThV - PU_UP, PV_UP !updraft wind component -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PSV_UP ! updraft scalar variables -INTEGER, DIMENSION(:,:), INTENT(OUT) :: KKLCL,KKETL,KKCTL !index for LCL,ETL,CTL -! -! -END SUBROUTINE UPDRAFT_SOPE - -END INTERFACE -! -END MODULE MODI_UPDRAFT_SOPE diff --git a/src/arome/turb/prandtl.F90 b/src/arome/turb/prandtl.F90 deleted file mode 100644 index 3afb18cc4446837c32394876d804095d204a07ea..0000000000000000000000000000000000000000 --- a/src/arome/turb/prandtl.F90 +++ /dev/null @@ -1,501 +0,0 @@ -! ######spl - SUBROUTINE PRANDTL(KKA,KKU,KKL,KRR,KRRI,OCLOSE_OUT,OTURB_DIAG, & - HTURBDIM, & - HFMFILE,HLUOUT, & - PDXX,PDYY,PDZZ,PDZX,PDZY, & - PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & - PLM,PLEPS,PTKEM,PTHLM,PRM,PSVM,PSRCM, & - PREDTH1,PREDR1, & - PRED2TH3, PRED2R3, PRED2THR3, & - PREDS1,PRED2THS3, PRED2RS3, & - PBLL_O_E, & - PETHETA, PEMOIST ) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK - USE MODD_CTURB, ONLY : LHARAT -! ########################################################### -! -! -!!**** *PRANDTL* - routine to compute the Prandtl turbulent numbers -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute the Redelsperger -! numbers and then get the turbulent Prandtl and Schmidt numbers: -! * for the heat fluxes - PHI3 = 1/ Prandtl -! * for the moisture fluxes - PSI3 = 1/ Schmidt -! -!!** METHOD -!! ------ -!! The following steps are performed: -!! -!! 1 - default values of 1 are taken for phi3 and psi3 and different masks -!! are defined depending on the presence of turbulence, stratification and -!! humidity. The 1D Redelsperger numbers are computed -!! * ZREDTH1 : (g / THVREF ) (LT**2 / TKE ) ETHETA (D Theta / Dz) -!! * ZREDR1 : (g / THVREF ) (LT**2 / TKE ) EMOIST (D TW / Dz) -!! 2 - 3D Redelsperger numbers are computed only for turbulent -!! grid points where ZREDTH1 or ZREDR1 are > 0. -!! 3 - PHI3 is computed only for turbulent grid points where ZREDTH1 > 0 -!! (turbulent thermally stratified points) -!! 4 - PSI3 is computed only for turbulent grid points where ZREDR1 > 0 -!! (turbulent moist points) -!! -!! -!! EXTERNAL -!! -------- -!! FUNCTIONs ETHETA and EMOIST : -!! allows to compute the coefficients -!! for the turbulent correlation between any variable -!! and the virtual potential temperature, of its correlations -!! with the conservative potential temperature and the humidity -!! conservative variable: -!! ------- ------- ------- -!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' -!! -!! GX_M_M, GY_M_M, GZ_M_M : Cartesian gradient operators -!! MZM : Shuman function (mean operator in the z direction) -!! Module MODI_ETHETA : interface module for ETHETA -!! Module MODI_EMOIST : interface module for EMOIST -!! Module MODI_SHUMAN : interface module for Shuman operators -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : contains physical constants -!! XG : gravity constant -!! -!! Module MODD_CTURB: contains the set of constants for -!! the turbulence scheme -!! XCTV,XCPR2 : constants for the turbulent prandtl numbers -!! XTKEMIN : minimum value allowed for the TKE -!! -!! Module MODD_PARAMETERS -!! JPVEXT_TURB : number of vertical marginal points -!! -!! REFERENCE -!! --------- -!! Book 2 of documentation (routine PRANDTL) -!! Book 1 of documentation (Chapter: Turbulence) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart * INM and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 18/10/94 -!! Modifications: Feb 14, 1995 (J.Cuxart and J.Stein) -!! Doctorization and Optimization -!! Modifications: March 21, 1995 (J.M. Carriere) -!! Introduction of cloud water -!! Modifications: March 21, 1995 (J. Cuxart and J.Stein) -!! Phi3 and Psi3 at w point + cleaning -!! Modifications: July 2, 1995 (J.Cuxart and Ph.Bougeault) -!! change the value of Phi3 and Psi3 if negative -!! Modifications: Sept 20, 1995 (J. Stein, J. Cuxart, J.L. Redelsperger) -!! remove the Where + use REDTH1+REDR1 for the tests -!! Modifications: October 10, 1995 (J. Cuxart and J.Stein) -!! Psi3 for tPREDS1he scalar variables -!! Modifications: February 27, 1996 (J.Stein) optimization -!! Modifications: June 15, 1996 (P.Jabouille) return to the previous -!! computation of Phi3 and Psi3 -!! Modifications: October 10, 1996 (J. Stein) change the temporal -!! discretization -!! Modifications: May 23, 1997 (J. Stein) bug in 3D Redels number at ground -!! with orography -!! Modifications: Feb 20, 1998 (J. Stein) bug in all the 3D cases due to -!! the use of ZW1 instead of ZW2 -!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE -!! July 2005 (Tomas, Masson) implicitation of PHI3 and PSI3 -!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after -!! change of YCOMMENT -!! 2012-02 Y. Seity, add possibility to run with reversed -!! vertical levels -!! Modifications: July 2015 (Wim de Rooy) LHARAT (Racmo turbulence) switch -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_CONF -USE MODD_CTURB -USE MODD_PARAMETERS -! -USE MODI_GRADIENT_M -USE MODI_EMOIST -USE MODI_ETHETA -USE MODI_SHUMAN, ONLY: MZM -USE MODE_FMWRIT -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO - -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRI ! number of ice var. -! -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening -LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some - ! diagnostic fields in the syncronous FM-file -CHARACTER*4 , INTENT(IN) :: HTURBDIM ! Kind of turbulence param. -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential Temp. - ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turbulent Mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! Dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM,PTKEM! Conservative Potential - ! Temperature and TKE at t-1 -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-1 - ! with PRM(:,:,:,1) = cons. - ! mixing ratio -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Scalars at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM - ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -! -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDTH1 ! Redelsperger number R_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDR1 ! Redelsperger number R_q -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2TH3 ! Redelsperger number R*2_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2R3 ! Redelsperger number R*2_q -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2THR3! Redelsperger number R*2_thq -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PREDS1 ! Redelsperger number R_s -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2THS3! Redelsperger number R*2_thsv -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2RS3 ! Redelsperger number R*2_qsv -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBLL_O_E! beta*Lk*Leps/tke -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PETHETA ! coefficient E_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMOIST ! coefficient E_moist -! -! -! 0.2 declaration of local variables -! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & - ZW1, ZW2, ZW3 -! working variables -! -INTEGER :: IKB ! vertical index value for the first inner mass point -INTEGER :: IKE ! vertical index value for the last inner mass point -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: ILENG ! Length of the data field in LFIFM file -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 -INTEGER:: ISV ! number of scalar variables -INTEGER:: JSV ! loop index for the scalar variables - -INTEGER :: JLOOP -REAL :: ZMINVAL -! --------------------------------------------------------------------------- -! -! -!* 1. DEFAULT VALUES, 1D REDELSPERGER NUMBERS -! ---------------------------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('PRANDTL',0,ZHOOK_HANDLE) - -IF (LHARAT) THEN -PREDTH1(:,:,:)=0. -PREDR1(:,:,:)=0. -PRED2TH3(:,:,:)=0. -PRED2R3(:,:,:)=0. -PRED2THR3(:,:,:)=0. -PREDS1(:,:,:,:)=0. -PRED2THS3(:,:,:,:)=0. -PRED2RS3(:,:,:,:)=0. -PBLL_O_E(:,:,:)=0. -ENDIF -! -IKB = KKA+JPVEXT_TURB*KKL -IKE = KKU-JPVEXT_TURB*KKL -ILENG=SIZE(PTHLM,1)*SIZE(PTHLM,2)*SIZE(PTHLM,3) -ISV =SIZE(PSVM,4) -! -PETHETA(:,:,:) = MZM(ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM), KKA, KKU, KKL) -PEMOIST(:,:,:) = MZM(EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM), KKA, KKU, KKL) -PETHETA(:,:,KKA) = 2.*PETHETA(:,:,IKB) - PETHETA(:,:,IKB+KKL) -PEMOIST(:,:,KKA) = 2.*PEMOIST(:,:,IKB) - PEMOIST(:,:,IKB+KKL) -! -!--------------------------------------------------------------------------- -IF (.NOT. LHARAT) THEN -! -! 1.3 1D Redelsperger numbers -! -PBLL_O_E(:,:,:) = MZM(XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:), KKA, KKU, KKL) -IF (KRR /= 0) THEN ! moist case - PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * PETHETA(:,:,:) * & - & GZ_M_W(PTHLM,PDZZ, KKA, KKU, KKL) - PREDR1(:,:,:) = XCTV*PBLL_O_E(:,:,:) * PEMOIST(:,:,:) * & - & GZ_M_W(PRM(:,:,:,1),PDZZ, KKA, KKU, KKL) -ELSE ! dry case - PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * GZ_M_W(PTHLM,PDZZ, KKA, KKU, KKL) - PREDR1(:,:,:) = 0. -END IF -! -! 3. Limits on 1D Redelperger numbers -! -------------------------------- -! -ZMINVAL = (1.-1./XPHI_LIM) -! -ZW1 = 1. -ZW2 = 1. -! -WHERE (PREDTH1+PREDR1<-ZMINVAL) - ZW1 = (-ZMINVAL) / (PREDTH1+PREDR1) -END WHERE -! -WHERE (PREDTH1<-ZMINVAL) - ZW2 = (-ZMINVAL) / (PREDTH1) -END WHERE -ZW2 = MIN(ZW1,ZW2) -! -ZW1 = 1. -WHERE (PREDR1<-ZMINVAL) - ZW1 = (-ZMINVAL) / (PREDR1) -END WHERE -ZW1 = MIN(ZW2,ZW1) -! -! -! 3. Modification of Mixing length and dissipative length -! ---------------------------------------------------- -! -PBLL_O_E(:,:,:) = PBLL_O_E(:,:,:) * ZW1(:,:,:) -PREDTH1 (:,:,:) = PREDTH1 (:,:,:) * ZW1(:,:,:) -PREDR1 (:,:,:) = PREDR1 (:,:,:) * ZW1(:,:,:) -! -! 4. Threshold for very small (in absolute value) Redelperger numbers -! ---------------------------------------------------------------- -! -ZW2=SIGN(1.,PREDTH1(:,:,:)) -PREDTH1(:,:,:)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDTH1(:,:,:)) -! -IF (KRR /= 0) THEN ! dry case - ZW2=SIGN(1.,PREDR1(:,:,:)) - PREDR1(:,:,:)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDR1(:,:,:)) -END IF -! -! -!--------------------------------------------------------------------------- -! -! For the scalar variables -DO JSV=1,ISV - PREDS1(:,:,:,JSV)=XCTV*PBLL_O_E(:,:,:)*GZ_M_W(PSVM(:,:,:,JSV),PDZZ, KKA, KKU, KKL) -END DO -! -DO JSV=1,ISV - ZW2=SIGN(1.,PREDS1(:,:,:,JSV)) - PREDS1(:,:,:,JSV)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDS1(:,:,:,JSV)) -END DO -! -!--------------------------------------------------------------------------- -! -!* 2. 3D REDELSPERGER NUMBERS -! ------------------------ -! -IF(HTURBDIM=='1DIM') THEN ! 1D case -! -! - PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 -! - PRED2R3(:,:,:) = PREDR1(:,:,:) **2 -! - PRED2THR3(:,:,:) = PREDTH1(:,:,:) * PREDR1(:,:,:) -! -ELSE IF (L2D) THEN ! 3D case in a 2D model -! - IF (KRR /= 0) THEN ! moist 3D case - PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2+(XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & - MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & - MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) -! - PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & - PEMOIST(:,:,:) * PETHETA(:,:,:) * & - MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL), KKA, KKU, KKL) - PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) -! - ELSE ! dry 3D case in a 2D model - PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & - MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:) = 0. -! - PRED2THR3(:,:,:) = 0. -! - END IF -! -ELSE ! 3D case in a 3D model -! - IF (KRR /= 0) THEN ! moist 3D case - PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2 + ( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & - MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 & - + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & - MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 + & - GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) -! - PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & - PEMOIST(:,:,:) * PETHETA(:,:,:) * & - MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)+ & - GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & - GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL), KKA, KKU, KKL) - PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) -! - ELSE ! dry 3D case in a 3D model - PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & - MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 & - + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:) = 0. -! - PRED2THR3(:,:,:) = 0. -! - END IF -! -END IF ! end of the if structure on the turbulence dimensionnality -! -! -!--------------------------------------------------------------------------- -! -! 5. Prandtl numbers for scalars -! --------------------------- -DO JSV=1,ISV -! - IF(HTURBDIM=='1DIM') THEN -! 1D case - PRED2THS3(:,:,:,JSV) = PREDS1(:,:,:,JSV) * PREDTH1(:,:,:) - IF (KRR /= 0) THEN - PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) *PREDS1(:,:,:,JSV) - ELSE - PRED2RS3(:,:,:,JSV) = 0. - END IF -! - ELSE IF (L2D) THEN ! 3D case in a 2D model -! - IF (KRR /= 0) THEN - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA - ELSE - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) - END IF - PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1* & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL), & - KKA, KKU, KKL) -! - IF (KRR /= 0) THEN - PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1 * PEMOIST * & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL), & - KKA, KKU, KKL) - ELSE - PRED2RS3(:,:,:,JSV) = 0. - END IF -! - ELSE ! 3D case in a 3D model -! - IF (KRR /= 0) THEN - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA - ELSE - ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) - END IF - PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1* & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL) & - +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & - GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL), & - KKA, KKU, KKL) -! - IF (KRR /= 0) THEN - PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1 * PEMOIST * & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & - GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL) & - +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & - GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL), & - KKA, KKU, KKL) - ELSE - PRED2RS3(:,:,:,JSV) = 0. - END IF -! - END IF ! end of HTURBDIM if-block -! -END DO -! -!--------------------------------------------------------------------------- -! -!* 6. SAVES THE REDELSPERGER NUMBERS -! ------------------------------ -! -IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN - ! - ! stores the RED_TH1 - YRECFM ='RED_TH1' - YCOMMENT='X_Y_Z_RED_TH1 (0)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PREDTH1,IGRID,ILENCH,YCOMMENT,IRESP) - ! - ! stores the RED_R1 - YRECFM ='RED_R1' - YCOMMENT='X_Y_Z_RED_R1 (0)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PREDR1,IGRID,ILENCH,YCOMMENT,IRESP) - ! - ! stores the RED2_TH3 - YRECFM ='RED2_TH3' - YCOMMENT='X_Y_Z_RED2_TH3 (0)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PRED2TH3,IGRID,ILENCH,YCOMMENT,IRESP) - ! - ! stores the RED2_R3 - YRECFM ='RED2_R3' - YCOMMENT='X_Y_Z_RED2_R3 (0)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PRED2R3,IGRID,ILENCH,YCOMMENT,IRESP) - ! - ! stores the RED2_THR3 - YRECFM ='RED2_THR3' - YCOMMENT='X_Y_Z_RED2_THR3 (0)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PRED2THR3,IGRID,ILENCH,YCOMMENT,IRESP) -END IF -! -!--------------------------------------------------------------------------- -ENDIF ! (Done only if LHARAT is FALSE) -! -IF (LHOOK) CALL DR_HOOK('PRANDTL',1,ZHOOK_HANDLE) -END SUBROUTINE PRANDTL diff --git a/src/arome/turb/tke_eps_sources.F90 b/src/arome/turb/tke_eps_sources.F90 deleted file mode 100644 index 672987f182e17653c639b6206b88e93acd184127..0000000000000000000000000000000000000000 --- a/src/arome/turb/tke_eps_sources.F90 +++ /dev/null @@ -1,432 +0,0 @@ -! ######spl - SUBROUTINE TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,PLM,PLEPS,PDP, & - & PTRH,PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & - & PTSTEP,PIMPL,PEXPL, & - & HTURBLEN,HTURBDIM, & - & HFMFILE,HLUOUT,OCLOSE_OUT,OTURB_DIAG, & - & PTP,PRTKES,PRTHLS,PCOEF_DISS,PTDIFF,PTDISS, & - & PEDR,YDDDH, YDLDDH, YDMDDH) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! ################################################################## -! -! -!!**** *TKE_EPS_SOURCES* - routine to compute the sources of the turbulent -!! evolutive variables: TKE and its dissipation when it is taken into -!! account. The contribution to the heating of tke dissipation is computed. -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute the sources necessary for -! the evolution of the turbulent kinetic energy and its dissipation -! if necessary. -! -!!** METHOD -!! ------ -!! The vertical turbulent flux is computed in an off-centered -!! implicit scheme (a Crank-Nicholson type with coefficients different -!! than 0.5), which allows to vary the degree of implicitness of the -!! formulation. -!! In high resolution, the horizontal transport terms are also -!! calculated, but explicitly. -!! The evolution of the dissipation as a variable is made if -!! the parameter HTURBLEN is set equal to KEPS. The same reasoning -!! made for TKE applies. -!! -!! EXTERNAL -!! -------- -!! GX_U_M,GY_V_M,GZ_W_M -!! GX_M_U,GY_M_V : Cartesian vertical gradient operators -!! -!! MXF,MXM.MYF,MYM,MZF,MZM: Shuman functions (mean operators) -!! DZF : Shuman functions (difference operators) -!! -!! SUBROUTINE TRIDIAG : to solve an implicit temporal scheme -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : contains physical constants -!! -!! XG : gravity constant -!! -!! Module MODD_CTURB: contains the set of constants for -!! the turbulence scheme -!! -!! XCET,XCED : transport and dissipation cts. for the TKE -!! XCDP,XCDD,XCDT: constants from the parameterization of -!! the K-epsilon equation -!! XTKEMIN,XEPSMIN : minimum values for the TKE and its -!! dissipation -!! -!! Module MODD_PARAMETERS: -!! -!! JPVEXT_TURB -!! Module MODD_BUDGET: -!! NBUMOD : model in which budget is calculated -!! CBUTYPE : type of desired budget -!! 'CART' for cartesian box configuration -!! 'MASK' for budget zone defined by a mask -!! 'NONE' ' for no budget -!! NBUPROCCTR : process counter used for each budget variable -!! LBU_RTKE : logical for budget of RTKE (turbulent kinetic energy) -!! .TRUE. = budget of RTKE -!! .FALSE. = no budget of RTKE -!! -!! -!! REFERENCE -!! --------- -!! Book 2 of documentation (routine TKE_EPS_SOURCES) -!! Book 1 of documentation (Chapter: Turbulence) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart * INM and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original August 23, 1994 -!! Modifications: Feb 14, 1995 (J.Cuxart and J.Stein) -!! Doctorization and Optimization -!! June 29, 1995 (J.Stein) TKE budget -!! June 28, 1995 (J.Cuxart) Add LES tools -!! Modifications: February 29, 1996 (J. Stein) optimization -!! Modifications: May 6, 1996 (N. Wood) Extend some loops over -!! the outer points -!! Modifications: August 30, 1996 (P. Jabouille) calcul ZFLX at the -!! IKU level -!! October 10, 1996 (J.Stein) set Keff at t-deltat -!! Oct 8, 1996 (Cuxart,Sanchez) Var.LES: XETR_TF,XDISS_TF -!! December 20, 1996 (J.-P. Pinty) update the CALL BUDGET -!! November 24, 1997 (V. Masson) bug in <v'e> -!! removes the DO loops -!! Augu. 9, 1999 (J.Stein) TKE budget correction -!! Mar 07 2001 (V. Masson and J. Stein) remove the horizontal -!! turbulent transports of Tke computation -!! Nov 06, 2002 (V. Masson) LES budgets -!! July 20, 2003 (J.-P. Pinty P Jabouille) add the dissipative heating -!! May 2006 Remove KEPS -!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after -!! change of YCOMMENT -!! 2012-02 Y. Seity, add possibility to run with reversed -!! vertical levels -!! 2014-11 Y. Seity, add output terms for TKE DDHs budgets -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_CONF -USE MODD_CTURB -USE MODD_PARAMETERS -USE MODD_BUDGET -USE MODD_LES -USE MODD_DIAG_IN_RUN, ONLY : LDIAG_IN_RUN, XCURRENT_TKE_DISS -! -USE MODI_GRADIENT_M -USE MODI_GRADIENT_U -USE MODI_GRADIENT_V -USE MODI_GRADIENT_W -USE MODI_SHUMAN , ONLY : DZM, DZF, MZM, MZF -USE MODI_TRIDIAG -USE MODI_TRIDIAG_TKE -USE MODI_BUDGET_DDH -USE MODE_FMWRIT -USE MODI_LES_MEAN_SUBGRID -! -USE DDH_MIX, ONLY : TYP_DDH -USE YOMLDDH, ONLY : TLDDH -USE YOMMDDH, ONLY : TMDDH -! -!!!!!AROME!!USE MODE_ll -!!!!!AROME!!USE MODD_ARGSLIST_ll, ONLY : LIST_ll -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO - -INTEGER, INTENT(IN) :: KMI ! model index number -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at t-deltat -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical height w-pt -REAL, INTENT(IN) :: PTSTEP ! Double Time step ( *.5 for - ! the first time step ) -REAL, INTENT(IN) :: PEXPL, PIMPL ! Coef. temporal. disc. -CHARACTER*4, INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -CHARACTER*4, INTENT(IN) :: HTURBLEN ! kind of mixing length -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening -LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some - ! diagnostic fields in the syncronous FM-file -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP, PTRH ! Dyn. prod. of TKE -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTP ! Ther. prod. of TKE -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTKES ! RHOD * Jacobian * - ! TKE at t+deltat -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTHLS ! Source of Theta_l -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCOEF_DISS ! 1/(Cph*Exner) -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDIFF ! Diffusion TKE term -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDISS ! Dissipation TKE term -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEDR ! EDR -TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH -TYPE(TLDDH), INTENT(IN) :: YDLDDH -TYPE(TMDDH), INTENT(IN) :: YDMDDH -! -! -! -!* 0.2 declaration of local variables -! -REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)):: & - ZA, & ! under diagonal elements of the tri-diagonal matrix involved - ! in the temporal implicit scheme - ZRES, & ! treated variable at t+ deltat when the turbu- - ! lence is the only source of evolution added to the ones - ! considered in ZSOURCE. This variable is also used to - ! temporarily store some diagnostics stored in FM file - ZFLX, & ! horizontal or vertical flux of the treated variable - ZSOURCE, & ! source of evolution for the treated variable - ZTR, & ! turbulent transport of TKE - ZKEFF ! effectif diffusion coeff = LT * SQRT( TKE ) -LOGICAL,DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: GTKENEG - ! 3D mask .T. if TKE < XTKEMIN -INTEGER :: IIB,IIE,IJB,IJE,IKB,IKE - ! Index values for the Beginning and End - ! mass points of the domain -INTEGER :: IIU,IJU,IKU ! array size in the 3 dimensions -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 -! -!!!!!AROME!!TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange -!!!!!AROME!!INTEGER :: IINFO_ll ! return code of parallel routine -! - -!---------------------------------------------------------------------------- -!!!!!AROME!!NULLIFY(TZFIELDDISS_ll) -! -!* 1. PRELIMINARY COMPUTATIONS -! ------------------------ -! -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('TKE_EPS_SOURCES',0,ZHOOK_HANDLE) -IIB=1+JPHEXT -IIU=SIZE(PTKEM,1) -IIE=IIU-JPHEXT -IJB=1+JPHEXT -IJU=SIZE(PTKEM,2) -IJE=IJU-JPHEXT -IKB=KKA+JPVEXT_TURB*KKL -IKE=KKU-JPVEXT_TURB*KKL -! -! compute the effective diffusion coefficient at the mass point -ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) -! -!---------------------------------------------------------------------------- -! -!* 2. TKE EQUATION -! ------------ -! -!* 2.1 Horizontal turbulent explicit transport -! -! -! Complete the sources of TKE with the horizontal turbulent explicit transport -! -IF (HTURBDIM=='3DIM') THEN - ZTR=PTRH -ELSE - ZTR=0. -END IF -! -! -! -!* 2.2 Explicit TKE sources except horizontal turbulent transport -! -! -! extrapolate the dynamic production with a 1/Z law from its value at the -! W(IKB+1) value stored in PDP(IKB) to the mass localization tke(IKB) -PDP(:,:,IKB) = PDP(:,:,IKB) * (1. + PDZZ(:,:,IKB+KKL)/PDZZ(:,:,IKB)) -! -! Compute the source terms for TKE: ( ADVECtion + NUMerical DIFFusion + ..) -! + (Dynamical Production) + (Thermal Production) - (dissipation) -ZFLX(:,:,:) = XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) -ZSOURCE(:,:,:) = PRTKES(:,:,:) / PRHODJ(:,:,:) - PTKEM(:,:,:) / PTSTEP & - + PDP(:,:,:) + PTP(:,:,:) + ZTR(:,:,:) - PEXPL * ZFLX(:,:,:) * PTKEM(:,:,:) -! -!* 2.2 implicit vertical TKE transport -! -! -! Compute the vector giving the elements just under the diagonal for the -! matrix inverted in TRIDIAG -! -ZA(:,:,:) = - PTSTEP * XCET * & - MZM(ZKEFF, KKA, KKU, KKL) * MZM(PRHODJ, KKA, KKU, KKL) / PDZZ**2 -! -! Compute TKE at time t+deltat: ( stored in ZRES ) -! -CALL TRIDIAG_TKE(KKA,KKU,KKL,PTKEM,ZA,PTSTEP,PEXPL,PIMPL,PRHODJ,& - & ZSOURCE,PTSTEP*ZFLX,ZRES) -! -!* diagnose the dissipation -! -IF (LDIAG_IN_RUN) THEN - XCURRENT_TKE_DISS = ZFLX(:,:,:) * PTKEM(:,:,:) & - *(PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) -!!!!!AROME!! CALL ADD3DFIELD_ll(TZFIELDDISS_ll,XCURRENT_TKE_DISS) -!!!!!AROME!! CALL UPDATE_HALO_ll(TZFIELDDISS_ll,IINFO_ll) -!!!!!AROME!! CALL CLEANLIST_ll(TZFIELDDISS_ll) -ENDIF -! -! TKE must be greater than its minimum value -! -GTKENEG = ZRES <= XTKEMIN -WHERE ( GTKENEG ) - ZRES = XTKEMIN -END WHERE - -PTDISS(:,:,:) = - ZFLX(:,:,:)*(PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) -! -IF ( LLES_CALL .OR. & - (OTURB_DIAG .AND. OCLOSE_OUT) ) THEN -! -! Compute the cartesian vertical flux of TKE in ZFLX -! - - ZFLX(:,:,:) = - XCET * MZM(ZKEFF, KKA, KKU, KKL) * & - DZM(PIMPL * ZRES + PEXPL * PTKEM, KKA, KKU, KKL) / PDZZ -! - ZFLX(:,:,IKB) = 0. - ZFLX(:,:,KKA) = 0. -! -! Compute the whole turbulent TRansport of TKE: -! - ZTR(:,:,:)= ZTR - DZF(MZM(PRHODJ, KKA, KKU, KKL) * ZFLX / PDZZ, KKA, KKU, KKL) /PRHODJ -! -! Storage in the LES configuration -! - IF (LLES_CALL) THEN - CALL LES_MEAN_SUBGRID(MZF(ZFLX, KKA, KKU, KKL), X_LES_SUBGRID_WTke ) - CALL LES_MEAN_SUBGRID(-ZTR, X_LES_SUBGRID_ddz_WTke ) - END IF -! -END IF -! -!* 2.4 stores the explicit sources for budget purposes -! -IF (LBUDGET_TKE) THEN -! -! add the dynamical production -! - PRTKES(:,:,:) = PRTKES(:,:,:) + PDP(:,:,:) * PRHODJ(:,:,:) - CALL BUDGET_DDH (PRTKES(:,:,:),5,'DP_BU_RTKE',YDDDH, YDLDDH, YDMDDH) -! -! add the thermal production -! - PRTKES(:,:,:) = PRTKES(:,:,:) + PTP(:,:,:) * PRHODJ(:,:,:) - CALL BUDGET_DDH (PRTKES(:,:,:),5,'TP_BU_RTKE',YDDDH, YDLDDH, YDMDDH) -! -! add the dissipation -! -PRTKES(:,:,:) = PRTKES(:,:,:) - XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & - (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:) -CALL BUDGET_DDH (PRTKES(:,:,:),5,'DISS_BU_RTKE',YDDDH, YDLDDH, YDMDDH) -END IF -! -!* 2.5 computes the final RTKE and stores the whole turbulent transport -! -PTDIFF(:,:,:) = ZRES(:,:,:) / PTSTEP - PRTKES(:,:,:)/PRHODJ(:,:,:) & - & - PDP(:,:,:)- PTP(:,:,:) - PTDISS(:,:,:) - -PRTKES(:,:,:) = ZRES(:,:,:) * PRHODJ(:,:,:) / PTSTEP - -! -! stores the whole turbulent transport -! -IF (LBUDGET_TKE) CALL BUDGET_DDH (PRTKES(:,:,:),5,'TR_BU_RTKE',YDDDH, YDLDDH, YDMDDH) -! -! -!---------------------------------------------------------------------------- -! -!* 3. COMPUTE THE DISSIPATIVE HEATING -! ------------------------------- -! -PRTHLS(:,:,:) = PRTHLS(:,:,:) + XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & - (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:) * PCOEF_DISS(:,:,:) -! -!---------------------------------------------------------------------------- -! -!* 4. STORES SOME DIAGNOSTICS -! ----------------------- -! -PEDR(:,:,:)=XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) - - - -IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN -! -! stores the dynamic production -! - YRECFM ='DP' - YCOMMENT='X_Y_Z_DP (M**2/S**3)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PDP,IGRID,ILENCH,YCOMMENT,IRESP) -! -! stores the thermal production -! - YRECFM ='TP' - YCOMMENT='X_Y_Z_TP (M**2/S**3)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PTP,IGRID,ILENCH,YCOMMENT,IRESP) -! -! stores the whole turbulent transport -! - YRECFM ='TR' - YCOMMENT='X_Y_Z_TR (M**2/S**3)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZTR,IGRID,ILENCH,YCOMMENT,IRESP) -! -! stores the dissipation of TKE -! - YRECFM ='DISS' - YCOMMENT='X_Y_Z_DISS (M**2/S**3)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - ZFLX(:,:,:) =-XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZFLX,IGRID,ILENCH,YCOMMENT,IRESP) -END IF -! -! Storage in the LES configuration of the Dynamic Production of TKE and -! the dissipation of TKE -! -IF (LLES_CALL ) THEN - ZFLX(:,:,:) =-XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) - CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_DISS_Tke ) -END IF -! -!---------------------------------------------------------------------------- -! -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('TKE_EPS_SOURCES',1,ZHOOK_HANDLE) -END SUBROUTINE TKE_EPS_SOURCES diff --git a/src/arome/turb/turb.F90 b/src/arome/turb/turb.F90 deleted file mode 100644 index 68fec59f897017987d8cc13e0546e88f392ca912..0000000000000000000000000000000000000000 --- a/src/arome/turb/turb.F90 +++ /dev/null @@ -1,1579 +0,0 @@ -! ######spl - SUBROUTINE TURB(KKA,KKU,KKL,KMI,KRR,KRRL,KRRI,HLBCX,HLBCY, & - & KSPLIT,KMODEL_CL, & - & OCLOSE_OUT,OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01, & - & HTURBDIM,HTURBLEN,HTOM,HTURBLEN_CL,HINST_SFU, & - & HMF_UPDRAFT,PIMPL,PTSTEP_UVW, PTSTEP_MET,PTSTEP_SV, & - & HFMFILE,HLUOUT,PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & - & PDIRCOSXW,PDIRCOSYW,PDIRCOSZW,PCOSSLOPE,PSINSLOPE, & - & PRHODJ,PTHVREF,PRHODREF, & - & PSFTH,PSFRV,PSFSV,PSFU,PSFV, & - & PPABSM,PUM,PVM,PWM,PTKEM,PSVM,PSRCM, & - & PLENGTHM,PLENGTHH,MFMOIST, & - & PBL_DEPTH,PSBL_DEPTH, & - & PUT,PVT,PWT,PCEI,PCEI_MIN,PCEI_MAX,PCOEF_AMPL_SAT, & - & PTHLM,PRM, & - & PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS,PRTKES, & - & PHGRAD, PSIGS, & - & PDRUS_TURB,PDRVS_TURB, & - & PDRTHLS_TURB,PDRRTS_TURB,PDRSVS_TURB, & - & PFLXZTHVMF,PWTH,PWRC,PWSV,PDP,PTP,PTPMF,PTDIFF, & - & PTDISS,PEDR,YDDDH,YDLDDH,YDMDDH) - - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK - USE MODD_CTURB, ONLY : LHARAT -! ################################################################# -! -! -!!**** *TURB* - computes the turbulent source terms for the prognostic -!! variables. -!! -!! PURPOSE -!! ------- -!!**** The purpose of this routine is to compute the source terms in -!! the evolution equations due to the turbulent mixing. -!! The source term is computed as the divergence of the turbulent fluxes. -!! The cartesian fluxes are obtained by a one and a half order closure, based -!! on a prognostic equation for the Turbulence Kinetic Energy( TKE ). The -!! system is closed by prescribing a turbulent mixing length. Different -!! choices are available for this length. -! -!!** METHOD -!! ------ -!! -!! The dimensionality of the turbulence parameterization can be chosen by -!! means of the parameter HTURBDIM: -!! * HTURBDIM='1DIM' the parameterization is 1D but can be used in -!! 3D , 2D or 1D simulations. Only the sources associated to the vertical -!! turbulent fluxes are taken into account. -!! * HTURBDIM='3DIM' the parameterization is fully 2D or 3D depending -!! on the model dimensionality. Of course, it does not make any sense to -!! activate this option with a 1D model. -!! -!! The following steps are made: -!! 1- Preliminary computations. -!! 2- The metric coefficients are recovered from the grid knowledge. -!! 3- The mixing length is computed according to its choice: -!! * HTURBLEN='BL89' the Bougeault and Lacarrere algorithm is used. -!! The mixing length is given by the vertical displacement from its -!! original level of an air particule having an initial internal -!! energy equal to its TKE and stopped by the buoyancy forces. -!! The discrete formulation is second order accurate. -!! * HTURBLEN='DELT' the mixing length is given by the mesh size -!! depending on the model dimensionality, this length is limited -!! with the ground distance. -!! * HTURBLEN='DEAR' the mixing length is given by the mesh size -!! depending on the model dimensionality, this length is limited -!! with the ground distance and also by the Deardorff mixing length -!! pertinent in the stable cases. -!! * HTURBLEN='KEPS' the mixing length is deduced from the TKE -!! dissipation, which becomes a prognostic variable of the model ( -!! Duynkerke formulation). -!! 3'- The cloud mixing length is computed according to HTURBLEN_CLOUD -!! and emphasized following the CEI index -!! 4- The conservative variables are computed along with Lv/Cp. -!! 5- The turbulent Prandtl numbers are computed from the resolved fields -!! and TKE -!! 6- The sources associated to the vertical turbulent fluxes are computed -!! with a temporal scheme allowing a degree of implicitness given by -!! PIMPL, varying from PIMPL=0. ( purely explicit scheme) to PIMPL=1. -!! ( purely implicit scheme) -!! The sources associated to the horizontal fluxes are computed with a -!! purely explicit temporal scheme. These sources are only computed when -!! the turbulence parameterization is 2D or 3D( HTURBDIM='3DIM' ). -!! 7- The sources for TKE are computed, along with the dissipation of TKE -!! if HTURBLEN='KEPS'. -!! 8- Some turbulence-related quantities are stored in the synchronous -!! FM-file. -!! 9- The non-conservative variables are retrieved. -!! -!! -!! The saving of the fields in the synchronous FM-file is controlled by: -!! * OTURB_FLX => saves all the turbulent fluxes and correlations -!! * OTURB_DIAG=> saves the turbulent Prandtl and Schmidt numbers, the -!! source terms of TKE and dissipation of TKE -!! -!! EXTERNAL -!! -------- -!! SUBROUTINE PRANDTL : computes the turbulent Prandtl number -!! SUBROUTINE TURB_VER : computes the sources from the vertical fluxes -!! SUBROUTINE TURB_HOR : computes the sources from the horizontal fluxes -!! SUBROUTINE TKE_EPS_SOURCES : computes the sources for TKE and its -!! dissipation -!! SUBROUTINE BUDGET : computes and stores the budgets -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! MODD_PARAMETERS : JPVEXT_TURB number of marginal vertical points -!! -!! MODD_CONF : CCONF model configuration (start/restart) -!! L1D switch for 1D model version -!! L2D switch for 2D model version -!! -!! MODD_CST : contains physical constants -!! XG gravity constant -!! XRD Gas constant for dry air -!! XRV Gas constant for vapor -!! -!! MODD_CTURB : contains turbulence scheme constants -!! XCMFS,XCED to compute the dissipation mixing length -!! XTKEMIN minimum values for the TKE -!! XLINI,XLINF to compute Bougeault-Lacarrere mixing -!! length -!! Module MODD_BUDGET: -!! NBUMOD -!! CBUTYPE -!! NBUPROCCTR -!! LBU_RU -!! LBU_RV -!! LBU_RW -!! LBU_RTH -!! LBU_RSV1 -!! LBU_RRV -!! LBU_RRC -!! LBU_RRR -!! LBU_RRI -!! LBU_RRS -!! LBU_RRG -!! LBU_RRH -!! -!! REFERENCE -!! --------- -!! Book 2 of documentation (routine TURB) -!! Book 1 of documentation (Chapter: Turbulence) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart * INM and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 05/10/94 -!! Modifications: Feb 14, 1995 (J.Cuxart and J.Stein) -!! Doctorization and Optimization -!! Modifications: March 21, 1995 (J.M. Carriere) -!! Introduction of cloud water -!! Modifications: June 1, 1995 (J.Cuxart ) -!! take min(Kz,delta) -!! Modifications: June 1, 1995 (J.Stein J.Cuxart) -!! remove unnecessary arrays and change Prandtl -!! and Schmidt numbers localizations -!! Modifications: July 20, 1995 (J.Stein) remove MODI_ground_ocean + -!! TZDTCUR + MODD_TIME because they are not used -!! change RW in RNP for the outputs -!! Modifications: August 21, 1995 (Ph. Bougeault) -!! take min(K(z-zsol),delta) -!! Modifications: Sept 14, 1995 (Ph Bougeault, J. Cuxart) -!! second order BL89 mixing length computations + add Deardorff length -!! in the Delta case for stable cases -!! Modifications: Sept 19, 1995 (J. Stein, J. Cuxart) -!! define a DEAR case for the mixing length, add MODI_BUDGET and change -!! some BUDGET calls, add LES tools -!! Modifications: Oct 16, 1995 (J. Stein) change the budget calls -!! Modifications: Feb 28, 1996 (J. Stein) optimization + -!! remove min(K(z-zsol),delta)+ -!! bug in the tangential fluxes -!! Modifications: Oct 16, 1996 (J. Stein) change the subgrid condensation -!! scheme + temporal discretization -!! Modifications: Dec 19, 1996 (J.-P. Pinty) update the budget calls -!! Jun 22, 1997 (J. Stein) use the absolute pressure and -!! change the Deardorf length at the surface -!! Modifications: Apr 27, 1997 (V. Masson) BL89 mix. length computed in -!! a separate routine -!! Oct 13, 1999 (J. Stein) switch for the tgt fluxes -!! Jun 24, 1999 (P Jabouille) Add routine UPDATE_ROTATE_WIND -!! Feb 15, 2001 (J. Stein) remove tgt fluxes -!! Mar 8, 2001 (V. Masson) forces the same behaviour near the surface -!! for all mixing lengths -!! Nov 06, 2002 (V. Masson) LES budgets -!! Nov, 2002 (V. Masson) implement modifications of -!! mixing and dissipative lengths -!! near the surface (according -!! Redelsperger et al 2001) -!! Apr, 2003 (V. Masson) bug in Blackadar length -!! bug in LES in 1DIM case -!! Feb 20, 2003 (J.-P. Pinty) Add reversible ice processes -!! May,26 2004 (P Jabouille) coef for computing dissipative heating -!! Sept 2004 (M.Tomasini) Cloud Mixing length modification -!! following the instability -!! criterium CEI calculated in modeln -!! May 2006 Remove KEPS -!! Sept.2006 (I.Sandu): Modification of the stability criterion for -!! DEAR (theta_v -> theta_l) -!! Oct 2007 (J.Pergaud) Add MF contribution for vert. turb. transport -!! Oct.2009 (C.Lac) Introduction of different PTSTEP according to the -!! advection schemes -!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after -!! change of YCOMMENT -!! 06/2011 (J.escobar ) Bypass Bug with ifort11/12 on HLBCX,HLBC -!! 2012-02 Y. Seity, add possibility to run with reversed -!! vertical levels -!! 2014-11 Y. Seity, add output terms for TKE DDHs budgets -!! July 2015 (Wim de Rooy) modifications to run with RACMO -!! turbulence (LHARAT=TRUE) -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS -USE MODD_CST -USE MODD_CTURB -USE MODD_CONF -USE MODD_BUDGET -USE MODD_LES -USE MODD_NSV -! -USE MODI_BL89 -USE MODI_TURB_VER -!!MODIF AROME -!USE MODI_ROTATE_WIND -!USE MODI_TURB_HOR_SPLT -USE MODI_TKE_EPS_SOURCES -USE MODI_SHUMAN, ONLY : MZF, MXF, MYF -USE MODI_GRADIENT_M -USE MODI_BUDGET_DDH -USE MODI_LES_MEAN_SUBGRID -USE MODI_RMC01 -USE MODI_GRADIENT_W -USE MODI_TM06 -USE MODI_UPDATE_LM -! -USE MODE_SBL -USE MODE_FMWRIT -! -USE MODI_EMOIST -USE MODI_ETHETA -! -USE DDH_MIX, ONLY : TYP_DDH -USE YOMLDDH, ONLY : TLDDH -USE YOMMDDH, ONLY : TMDDH -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -INTEGER, INTENT(IN) :: KMI ! model index number -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. -CHARACTER(LEN=*),DIMENSION(:),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -INTEGER, INTENT(IN) :: KSPLIT ! number of time-splitting -INTEGER, INTENT(IN) :: KMODEL_CL ! model number for cloud mixing length -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some - ! diagnostic fields in the syncronous FM-file -LOGICAL, INTENT(IN) :: OSUBG_COND ! switch for SUBGrid - ! CONDensation -LOGICAL, INTENT(IN) :: ORMC01 ! switch for RMC01 lengths in SBL -CHARACTER(LEN=4), INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN ! kind of mixing length -CHARACTER(LEN=4), INTENT(IN) :: HTOM ! kind of Third Order Moment -CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN_CL ! kind of cloud mixing length -CHARACTER(LEN=1), INTENT(IN) :: HINST_SFU ! temporal location of the - ! surface friction flux -REAL, INTENT(IN) :: PIMPL ! degree of implicitness -REAL, INTENT(IN) :: PTSTEP_UVW ! Dynamical timestep -REAL, INTENT(IN) :: PTSTEP_MET ! Timestep for meteorological variables -REAL, INTENT(IN) :: PTSTEP_SV ! Timestep for tracer variables -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -! -CHARACTER(LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of Mass Flux Scheme - -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical distance -! between 2 succesive grid points along the K direction -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW, PDIRCOSZW -! Director Cosinus along x, y and z directions at surface w-point -REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(:,:,:), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential - ! Temperature of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry density of the - ! reference state -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV, & -! normal surface fluxes of theta and Rv - PSFU,PSFV -! normal surface fluxes of (u,v) parallel to the orography -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSV -! normal surface fluxes of Scalar var. -! -! prognostic variables at t- deltat -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM ! wind components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! passive scal. var. -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Second-order flux - ! s'rc'/2Sigma_s2 at time t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:), INTENT(INOUT) :: PBL_DEPTH ! BL height for TOMS -REAL, DIMENSION(:,:), INTENT(INOUT) :: PSBL_DEPTH ! SBL depth for RMC01 -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT,PVT,PWT ! Wind at t -! variables for cloud mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCEI ! Cloud Entrainment instability - ! index to emphasize localy - ! turbulent fluxes -REAL, INTENT(IN) :: PCEI_MIN ! minimum threshold for the instability index CEI -REAL, INTENT(IN) :: PCEI_MAX ! maximum threshold for the instability index CEI -REAL, INTENT(IN) :: PCOEF_AMPL_SAT ! saturation of the amplification coefficient -! -! thermodynamical variables which are transformed in conservative var. -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHLM ! conservative pot. temp. -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRM ! water var. where - ! PRM(:,:,:,1) is the conservative mixing ratio -! -! sources of momentum, conservative potential temperature, Turb. Kin. Energy, -! TKE dissipation -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS,PRVS,PRWS,PRTHLS,PRTKES -! Source terms for all water kinds, PRRS(:,:,:,1) is used for the conservative -! mixing ratio -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS -! Source terms for all passive scalar variables -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS -! Sigma_s at time t+1 : square root of the variance of the deviation to the -! saturation -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PHGRAD -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDRUS_TURB ! evolution of rhoJ*U by turbulence only -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDRVS_TURB ! evolution of rhoJ*V by turbulence only -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDRTHLS_TURB ! evolution of rhoJ*thl by turbulence only -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDRRTS_TURB ! evolution of rhoJ*rt by turbulence only -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PDRSVS_TURB ! evolution of rhoJ*Sv by turbulence only -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXZTHVMF -! MF contribution for vert. turb. transport -! used in the buoy. prod. of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux -REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTP ! Thermal TKE production - ! MassFlux + turb -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTPMF ! Thermal TKE production - ! MassFlux Only -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP ! Dynamic TKE production -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDIFF ! Diffusion TKE term -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDISS ! Dissipation TKE term - - -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEDR ! EDR - -TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH -TYPE(TLDDH), INTENT(IN) :: YDLDDH -TYPE(TMDDH), INTENT(IN) :: YDMDDH -! -! length scale from vdfexcu -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLENGTHM, PLENGTHH - -! -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & - ZCP, & ! Cp at t-1 - ZEXN, & ! EXN at t-1 - ZT, & ! T at t-1 - ZLOCPEXNM, & ! Lv/Cp/EXNREF at t-1 - ZLM, & ! Turbulent mixing length - ZLEPS, & ! Dissipative length - ZTRH, & ! - ZATHETA,ZAMOIST, & ! coefficients for s = f (Thetal,Rnp) - ZCOEF_DISS, & ! 1/(Cph*Exner) for dissipative heating - ZFRAC_ICE, & ! ri fraction of rc+ri - ZMWTH,ZMWR,ZMTH2,ZMR2,ZMTHR,& ! 3rd order moments - ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,& ! opposite of verticale derivate of 3rd order moments - ZTHLM ! initial potential temp. -REAL, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3),SIZE(PRM,4)) :: & - ZRM ! initial mixing ratio -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2)) :: ZTAU11M,ZTAU12M, & - ZTAU22M,ZTAU33M, & - ! tangential surface fluxes in the axes following the orography - ZUSLOPE,ZVSLOPE, & - ! wind components at the first mass level parallel - ! to the orography - ZCDUEFF, & - ! - Cd*||u|| where ||u|| is the module of the wind tangential to - ! orography (ZUSLOPE,ZVSLOPE) at the surface. - ZUSTAR, ZLMO, & - ZRVM, ZSFRV - ! friction velocity, Monin Obuhkov length, work arrays for vapor -! - ! Virtual Potential Temp. used - ! in the Deardorff mixing length computation -REAL, DIMENSION(:,:,:), ALLOCATABLE :: & - ZLVOCPEXNM,ZLSOCPEXNM, & ! Lv/Cp/EXNREF and Ls/Cp/EXNREF at t-1 - ZATHETA_ICE,ZAMOIST_ICE ! coefficients for s = f (Thetal,Rnp) -! -REAL :: ZEXPL ! 1-PIMPL deg of expl. -REAL :: ZRVORD ! RV/RD -! -INTEGER :: IKB,IKE ! index value for the -! Beginning and the End of the physical domain for the mass points -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 -! -REAL :: ZTIME1, ZTIME2 -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZSHEAR, ZDUDZ, ZDVDZ -! -!* 1.PRELIMINARIES -! ------------- -! -!* 1.1 Set the internal domains, ZEXPL -! -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('TURB',0,ZHOOK_HANDLE) -IF (LHARAT .AND. HTURBDIM /= '1DIM') THEN - CALL ABOR1('LHARATU only implemented for option HTURBDIM=1DIM!') -ENDIF -IF (LHARAT .AND. LLES_CALL) THEN - CALL ABOR1('LHARATU not implemented for option LLES_CALL') -ENDIF - - -IKT=SIZE(PTHLM,3) -IKTB=1+JPVEXT_TURB -IKTE=IKT-JPVEXT_TURB -IKB=KKA+JPVEXT_TURB*KKL -IKE=KKU-JPVEXT_TURB*KKL -! -ZEXPL = 1.- PIMPL -ZRVORD= XRV / XRD -! -! -ZTHLM(:,:,:) = PTHLM(:,:,:) -ZRM(:,:,:,:) = PRM(:,:,:,:) -! -! -! -!---------------------------------------------------------------------------- -! -!* 2. COMPUTE CONSERVATIVE VARIABLES AND RELATED QUANTITIES -! ----------------------------------------------------- -! -!* 2.1 Cph at t -! -ZCP=XCPD -! -IF (KRR > 0) ZCP(:,:,:) = ZCP(:,:,:) + XCPV * PRM(:,:,:,1) -DO JRR = 2,1+KRRL ! loop on the liquid components - ZCP(:,:,:) = ZCP(:,:,:) + XCL * PRM(:,:,:,JRR) -END DO -! -DO JRR = 2+KRRL,1+KRRL+KRRI ! loop on the solid components - ZCP(:,:,:) = ZCP(:,:,:) + XCI * PRM(:,:,:,JRR) -END DO -! -!* 2.2 Exner function at t -! -ZEXN(:,:,:) = (PPABSM(:,:,:)/XP00) ** (XRD/XCPD) -! -!* 2.3 dissipative heating coeff a t -! -ZCOEF_DISS(:,:,:) = 1/(ZCP(:,:,:) * ZEXN(:,:,:)) -! -! -ZFRAC_ICE(:,:,:) = 0.0 -ZATHETA(:,:,:) = 0.0 -ZAMOIST(:,:,:) = 0.0 -! -IF (KRRL >=1) THEN -! -!* 2.4 Temperature at t -! - ZT(:,:,:) = PTHLM(:,:,:) * ZEXN(:,:,:) -! -!* 2.5 Lv/Cph/Exn -! - IF ( KRRI >= 1 ) THEN - ALLOCATE(ZLVOCPEXNM(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3))) - ALLOCATE(ZLSOCPEXNM(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3))) - ALLOCATE(ZAMOIST_ICE(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3))) - ALLOCATE(ZATHETA_ICE(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3))) -! - CALL COMPUTE_FUNCTION_THERMO(XALPW,XBETAW,XGAMW,XLVTT,XCL,ZT,ZEXN,ZCP, & - ZLVOCPEXNM,ZAMOIST,ZATHETA) - CALL COMPUTE_FUNCTION_THERMO(XALPI,XBETAI,XGAMI,XLSTT,XCI,ZT,ZEXN,ZCP, & - ZLSOCPEXNM,ZAMOIST_ICE,ZATHETA_ICE) -! - WHERE(PRM(:,:,:,2)+PRM(:,:,:,4)>0.0) - ZFRAC_ICE(:,:,:) = PRM(:,:,:,4) / ( PRM(:,:,:,2)+PRM(:,:,:,4) ) - END WHERE -! - ZLOCPEXNM(:,:,:) = (1.0-ZFRAC_ICE(:,:,:))*ZLVOCPEXNM(:,:,:) & - +ZFRAC_ICE(:,:,:) *ZLSOCPEXNM(:,:,:) - ZAMOIST(:,:,:) = (1.0-ZFRAC_ICE(:,:,:))*ZAMOIST(:,:,:) & - +ZFRAC_ICE(:,:,:) *ZAMOIST_ICE(:,:,:) - ZATHETA(:,:,:) = (1.0-ZFRAC_ICE(:,:,:))*ZATHETA(:,:,:) & - +ZFRAC_ICE(:,:,:) *ZATHETA_ICE(:,:,:) - - DEALLOCATE(ZAMOIST_ICE) - DEALLOCATE(ZATHETA_ICE) - ELSE - CALL COMPUTE_FUNCTION_THERMO(XALPW,XBETAW,XGAMW,XLVTT,XCL,ZT,ZEXN,ZCP, & - ZLOCPEXNM,ZAMOIST,ZATHETA) - 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) -! - YRECFM ='AMOIST' - YCOMMENT='X_Y_Z_AMOIST (M)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZAMOIST,IGRID,ILENCH,YCOMMENT,IRESP) - END IF -! -ELSE - ZLOCPEXNM=0. -END IF ! loop end on KRRL >= 1 -! -! computes conservative variables -! -IF ( KRRL >= 1 ) THEN - IF ( KRRI >= 1 ) THEN - ! Rnp at t-1 - PRM(:,:,:,1) = PRM(:,:,:,1) + PRM(:,:,:,2) + PRM(:,:,:,4) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) + PRRS(:,:,:,4) - ! Theta_l at t-1 - PTHLM(:,:,:) = PTHLM(:,:,:) - ZLVOCPEXNM(:,:,:) * PRM(:,:,:,2) & - - ZLSOCPEXNM(:,:,:) * PRM(:,:,:,4) - PRTHLS(:,:,:) = PRTHLS(:,:,:) - ZLVOCPEXNM(:,:,:) * PRRS(:,:,:,2) & - - ZLSOCPEXNM(:,:,:) * PRRS(:,:,:,4) - ELSE - ! Rnp at t-1 - PRM(:,:,:,1) = PRM(:,:,:,1) + PRM(:,:,:,2) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,2) - ! Theta_l at t-1 - PTHLM(:,:,:) = PTHLM(:,:,:) - ZLOCPEXNM(:,:,:) * PRM(:,:,:,2) - PRTHLS(:,:,:) = PRTHLS(:,:,:) - ZLOCPEXNM(:,:,:) * PRRS(:,:,:,2) - END IF -END IF -! -!* stores value of conservative variables & wind before turbulence tendency -PDRUS_TURB = PRUS -PDRVS_TURB = PRVS -PDRTHLS_TURB = PRTHLS -PDRRTS_TURB = PRRS(:,:,:,1) -PDRSVS_TURB = PRSVS -!---------------------------------------------------------------------------- -! -!* 3. MIXING LENGTH : SELECTION AND COMPUTATION -! ----------------------------------------- -! -! -IF (.NOT. LHARAT) THEN - -SELECT CASE (HTURBLEN) -! -!* 3.1 BL89 mixing length -! ------------------ - - CASE ('BL89') - ZSHEAR=0. - CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKEM,ZSHEAR,ZLM) -! -!* 3.2 Delta mixing length -! ------------------- -! - CASE ('DELT') - CALL DELT(ZLM) -! -!* 3.3 Deardorff mixing length -! ----------------------- -! - CASE ('DEAR') - CALL DEAR(ZLM) -! -!* 3.4 Blackadar mixing length -! ----------------------- -! - CASE ('BLKR') - ZL0 = 100. - ZLM(:,:,:) = ZL0 - - ZALPHA=0.5**(-1.5) - ! - DO JK=IKTB,IKTE - ZLM(:,:,JK) = ( 0.5*(PZZ(:,:,JK)+PZZ(:,:,JK+KKL)) - & - & PZZ(:,:,KKA+JPVEXT_TURB*KKL) ) * PDIRCOSZW(:,:) - ZLM(:,:,JK) = ZALPHA * ZLM(:,:,JK) * ZL0 / ( ZL0 + ZALPHA*ZLM(:,:,JK) ) - END DO -! - ZLM(:,:,IKTB-1) = ZLM(:,:,IKTB) - ZLM(:,:,IKTE+1) = ZLM(:,:,IKTE) -! -! -! -END SELECT -! -!* 3.5 Mixing length modification for cloud -! ----------------------- -IF (KMODEL_CL==KMI .AND. HTURBLEN_CL/='NONE' ) CALL CLOUD_MODIF_LM -ENDIF ! - -! -! - -! -!* 3.6 Dissipative length -! ------------------ - -IF (LHARAT) THEN -ZLEPS=PLENGTHM*(3.75**2.) -ELSE -ZLEPS=ZLM -ENDIF -! -!* 3.7 Correction in the Surface Boundary Layer (Redelsperger 2001) -! ---------------------------------------- -! -ZLMO=XUNDEF - IF (ORMC01) THEN - ZUSTAR=(PSFU**2+PSFV**2)**(0.25) - IF (KRR>0) THEN - ZLMO=LMO(ZUSTAR,ZTHLM(:,:,IKB),ZRM(:,:,IKB,1),PSFTH,PSFRV) - ELSE - ZRVM=0. - ZSFRV=0. - ZLMO=LMO(ZUSTAR,ZTHLM(:,:,IKB),ZRVM,PSFTH,ZSFRV) - END IF - CALL RMC01(HTURBLEN,KKA,KKU,KKL,PZZ,PDXX,PDYY,PDZZ,PDIRCOSZW,PSBL_DEPTH,ZLMO,ZLM,ZLEPS) - END IF -! -!* 3.8 Mixing length in external points (used if HTURBDIM="3DIM") -! ---------------------------------------------------------- -! -IF (HTURBDIM=="3DIM") THEN -!****FOR AROME**** -! CALL UPDATE_LM(HLBCX,HLBCY,ZLM,ZLEPS) -END IF -!---------------------------------------------------------------------------- -! -!* 4. GO INTO THE AXES FOLLOWING THE SURFACE -! -------------------------------------- -! -! -!* 4.1 rotate the wind at time t -! -IF ( HINST_SFU == 'T' ) THEN -! -! - IF (CPROGRAM=='AROME ') THEN - ZUSLOPE=PUM(:,:,KKA) - ZVSLOPE=PVM(:,:,KKA) - ELSE -! CALL ROTATE_WIND(PUT,PVT,PWT, & -! PDIRCOSXW, PDIRCOSYW, PDIRCOSZW, & -! PCOSSLOPE,PSINSLOPE, & -! PDXX,PDYY,PDZZ, & -! ZUSLOPE,ZVSLOPE ) -! -! CALL UPDATE_ROTATE_WIND(ZUSLOPE,ZVSLOPE) - END IF -! -! -!* 4.2 compute the proportionality coefficient between wind and stress -! - ZCDUEFF(:,:) =-SQRT ( (PSFU(:,:)**2 + PSFV(:,:)**2) / & - (1.E-60 + ZUSLOPE(:,:)**2 + ZVSLOPE(:,:)**2 ) & - ) -! -!* 4.3 rotate the wind at time t-delta t -! - IF (CPROGRAM/='AROME ') THEN -! CALL ROTATE_WIND(PUM,PVM,PWM, & -! PDIRCOSXW, PDIRCOSYW, PDIRCOSZW, & -! PCOSSLOPE,PSINSLOPE, & -! PDXX,PDYY,PDZZ, & -! ZUSLOPE,ZVSLOPE ) -! -! CALL UPDATE_ROTATE_WIND(ZUSLOPE,ZVSLOPE) - END IF -! -ELSE -! -!* 4.4 rotate the wind at time t-delta t -! - IF (CPROGRAM=='AROME ') THEN - ZUSLOPE=PUM(:,:,KKA) - ZVSLOPE=PVM(:,:,KKA) - ELSE -! -! CALL ROTATE_WIND(PUM,PVM,PWM, & -! PDIRCOSXW, PDIRCOSYW, PDIRCOSZW, & -! PCOSSLOPE,PSINSLOPE, & -! PDXX,PDYY,PDZZ, & -! ZUSLOPE,ZVSLOPE ) -! -! CALL UPDATE_ROTATE_WIND(ZUSLOPE,ZVSLOPE) - END IF -! -!* 4.5 compute the proportionality coefficient between wind and stress -! - ZCDUEFF(:,:) =-SQRT ( (PSFU(:,:)**2 + PSFV(:,:)**2) / & - (1.E-60 + ZUSLOPE(:,:)**2 + ZVSLOPE(:,:)**2 ) & - ) -END IF -! -!* 4.6 compute the surface tangential fluxes -! -ZTAU11M(:,:) =2./3.*( (1.+ (PZZ (:,:,IKB+KKL)-PZZ (:,:,IKB)) & - /(PDZZ(:,:,IKB+KKL)+PDZZ(:,:,IKB)) & - ) *PTKEM(:,:,IKB) & - -0.5 *PTKEM(:,:,IKB+KKL) & - ) -ZTAU12M(:,:) =0.0 -ZTAU22M(:,:) =ZTAU11M(:,:) -ZTAU33M(:,:) =ZTAU11M(:,:) -! -!* 4.7 third order terms in temperature and water fluxes and correlations -! ------------------------------------------------------------------ -! -! -ZMWTH = 0. ! w'2th' -ZMWR = 0. ! w'2r' -ZMTH2 = 0. ! w'th'2 -ZMR2 = 0. ! w'r'2 -ZMTHR = 0. ! w'th'r' - -IF (HTOM=='TM06') CALL TM06(KKA,KKU,KKL,PTHVREF,PBL_DEPTH,PZZ,PSFTH,ZMWTH,ZMTH2) -! -ZFWTH = -GZ_M_W(ZMWTH,PDZZ, KKA, KKU, KKL) ! -d(w'2th' )/dz -ZFWR = -GZ_M_W(ZMWR, PDZZ, KKA, KKU, KKL) ! -d(w'2r' )/dz -ZFTH2 = -GZ_W_M(ZMTH2,PDZZ, KKA, KKU, KKL) ! -d(w'th'2 )/dz -ZFR2 = -GZ_W_M(ZMR2, PDZZ, KKA, KKU, KKL) ! -d(w'r'2 )/dz -ZFTHR = -GZ_W_M(ZMTHR,PDZZ, KKA, KKU, KKL) ! -d(w'th'r')/dz -! -ZFWTH(:,:,IKTE:) = 0. -ZFWTH(:,:,:IKTB) = 0. -ZFWR (:,:,IKTE:) = 0. -ZFWR (:,:,:IKTB) = 0. -ZFTH2(:,:,IKTE:) = 0. -ZFTH2(:,:,:IKTB) = 0. -ZFR2 (:,:,IKTE:) = 0. -ZFR2 (:,:,:IKTB) = 0. -ZFTHR(:,:,IKTE:) = 0. -ZFTHR(:,:,:IKTB) = 0. -! -!---------------------------------------------------------------------------- -! -!* 5. TURBULENT SOURCES -! ----------------- -! -CALL TURB_VER(KKA,KKU,KKL,KRR, KRRL, KRRI, & - OCLOSE_OUT,OTURB_FLX, & - HTURBDIM,HTOM,PIMPL,ZEXPL, & - PTSTEP_UVW, PTSTEP_MET, PTSTEP_SV, & - HFMFILE,HLUOUT, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & - PCOSSLOPE,PSINSLOPE, & - PRHODJ,PTHVREF, & - PSFTH,PSFRV,PSFSV,PSFTH,PSFRV,PSFSV, & - ZCDUEFF,ZTAU11M,ZTAU12M,ZTAU33M, & - PUM,PVM,PWM,ZUSLOPE,ZVSLOPE,PTHLM,PRM,PSVM, & - PTKEM,ZLM,PLENGTHM,PLENGTHH,ZLEPS,MFMOIST, & - ZLOCPEXNM,ZATHETA,ZAMOIST,PSRCM,ZFRAC_ICE, & - ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,PBL_DEPTH, & - PSBL_DEPTH,ZLMO, & - PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS, & - PDP,PTP,PSIGS,PWTH,PWRC,PWSV ) -! - -IF (LBUDGET_U) CALL BUDGET_DDH (PRUS,1,'VTURB_BU_RU',YDDDH, YDLDDH, YDMDDH) -IF (LBUDGET_V) CALL BUDGET_DDH (PRVS,2,'VTURB_BU_RV',YDDDH, YDLDDH, YDMDDH) -IF (LBUDGET_W) CALL BUDGET_DDH (PRWS,3,'VTURB_BU_RW',YDDDH, YDLDDH, YDMDDH) -IF (LBUDGET_TH) THEN - IF ( KRRI >= 1 .AND. KRRL >= 1 ) THEN - CALL BUDGET_DDH (PRTHLS+ ZLVOCPEXNM * PRRS(:,:,:,2) + ZLSOCPEXNM * PRRS(:,:,:,4),4,'VTURB_BU_RTH',YDDDH, YDLDDH, YDMDDH) - ELSE IF ( KRRL >= 1 ) THEN - CALL BUDGET_DDH (PRTHLS+ ZLOCPEXNM * PRRS(:,:,:,2),4,'VTURB_BU_RTH',YDDDH, YDLDDH, YDMDDH) - ELSE - CALL BUDGET_DDH (PRTHLS,4,'VTURB_BU_RTH',YDDDH, YDLDDH, YDMDDH) - END IF -END IF -IF (LBUDGET_SV) THEN - DO JSV = 1,NSV - CALL BUDGET_DDH (PRSVS(:,:,:,JSV),JSV+12,'VTURB_BU_RSV',YDDDH, YDLDDH, YDMDDH) - END DO -END IF -IF (LBUDGET_RV) THEN - IF ( KRRI >= 1 .AND. KRRL >= 1) THEN - CALL BUDGET_DDH (PRRS(:,:,:,1)-PRRS(:,:,:,2)-PRRS(:,:,:,4),6,'VTURB_BU_RRV',YDDDH, YDLDDH, YDMDDH) - ELSE IF ( KRRL >= 1 ) THEN - CALL BUDGET_DDH (PRRS(:,:,:,1)-PRRS(:,:,:,2),6,'VTURB_BU_RRV',YDDDH, YDLDDH, YDMDDH) - ELSE - CALL BUDGET_DDH (PRRS(:,:,:,1),6,'VTURB_BU_RRV',YDDDH, YDLDDH, YDMDDH) - END IF -END IF -IF (LBUDGET_RC) CALL BUDGET_DDH (PRRS(:,:,:,2),7,'VTURB_BU_RRC',YDDDH, YDLDDH, YDMDDH) -IF (LBUDGET_RI) CALL BUDGET_DDH (PRRS(:,:,:,4),9,'VTURB_BU_RRI',YDDDH, YDLDDH, YDMDDH) -! -! -IF (HTURBDIM=='3DIM') THEN -!!!!MODIF AROME -! CALL TURB_HOR_SPLT(KSPLIT, KRR, KRRL, KRRI, PTSTEP_UVW, & -! PTSTEP_MET, PTSTEP_SV, HLBCX,HLBCY, & -! OCLOSE_OUT,OTURB_FLX,OSUBG_COND, & -! HFMFILE,HLUOUT, & -! PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & -! PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & -! PCOSSLOPE,PSINSLOPE, & -! PRHODJ,PTHVREF, & -! PSFTH,PSFRV,PSFSV, & -! ZCDUEFF,ZTAU11M,ZTAU12M,ZTAU22M,ZTAU33M, & -! PUM,PVM,PWM,ZUSLOPE,ZVSLOPE,PTHLM,PRM,PSVM, & -! PTKEM,ZLM,ZLEPS, & -! ZLOCPEXNM,ZATHETA,ZAMOIST,PSRCM,ZFRAC_ICE, & -! ZDP,ZTP,PSIGS, & -! PHGRAD, & -! ZTRH, & -! PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS ) -END IF -! -! -IF (LBUDGET_U) CALL BUDGET_DDH (PRUS,1,'HTURB_BU_RU',YDDDH, YDLDDH, YDMDDH) -IF (LBUDGET_V) CALL BUDGET_DDH (PRVS,2,'HTURB_BU_RV',YDDDH, YDLDDH, YDMDDH) -IF (LBUDGET_W) CALL BUDGET_DDH (PRWS,3,'HTURB_BU_RW',YDDDH, YDLDDH, YDMDDH) -IF (LBUDGET_TH) THEN - IF ( KRRI >= 1 .AND. KRRL >= 1 ) THEN - CALL BUDGET_DDH (PRTHLS+ ZLVOCPEXNM * PRRS(:,:,:,2) + ZLSOCPEXNM * PRRS(:,:,:,4),4,'HTURB_BU_RTH',YDDDH, YDLDDH, YDMDDH) - ELSE IF ( KRRL >= 1 ) THEN - CALL BUDGET_DDH (PRTHLS+ ZLOCPEXNM * PRRS(:,:,:,2),4,'HTURB_BU_RTH',YDDDH, YDLDDH, YDMDDH) - ELSE - CALL BUDGET_DDH (PRTHLS,4,'HTURB_BU_RTH',YDDDH, YDLDDH, YDMDDH) - END IF -END IF -IF (LBUDGET_SV) THEN - DO JSV = 1,NSV - CALL BUDGET_DDH (PRSVS(:,:,:,JSV),JSV+12,'HTURB_BU_RSV',YDDDH, YDLDDH, YDMDDH) - END DO -END IF -IF (LBUDGET_RV) THEN - IF ( KRRI >= 1 .AND. KRRL >= 1) THEN - CALL BUDGET_DDH (PRRS(:,:,:,1)-PRRS(:,:,:,2)-PRRS(:,:,:,4),6,'HTURB_BU_RRV',YDDDH, YDLDDH, YDMDDH) - ELSE IF ( KRRL >= 1 ) THEN - CALL BUDGET_DDH (PRRS(:,:,:,1)-PRRS(:,:,:,2),6,'HTURB_BU_RRV',YDDDH, YDLDDH, YDMDDH) - ELSE - CALL BUDGET_DDH (PRRS(:,:,:,1),6,'HTURB_BU_RRV',YDDDH, YDLDDH, YDMDDH) - END IF -END IF -IF (LBUDGET_RC) CALL BUDGET_DDH (PRRS(:,:,:,2),7,'HTURB_BU_RRC',YDDDH, YDLDDH, YDMDDH) -IF (LBUDGET_RI) CALL BUDGET_DDH (PRRS(:,:,:,4),9,'HTURB_BU_RRI',YDDDH, YDLDDH, YDMDDH) -! -!---------------------------------------------------------------------------- -! -!* 6. EVOLUTION OF THE TKE AND ITS DISSIPATION -! ---------------------------------------- -! -! 6.1 Contribution of mass-flux in the TKE buoyancy production if -! cloud computation is not statistical - - PTP = PTP + XG / PTHVREF * MZF(PFLXZTHVMF,KKA, KKU, KKL) - PTPMF=XG / PTHVREF * MZF(PFLXZTHVMF, KKA, KKU, KKL) - -! 6.2 TKE evolution equation - -IF (.NOT. LHARAT) THEN - - -CALL TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,ZLM,ZLEPS,PDP,ZTRH, & - & PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & - & PTSTEP_MET,PIMPL,ZEXPL, & - & HTURBLEN,HTURBDIM, & - & HFMFILE,HLUOUT,OCLOSE_OUT,OTURB_DIAG, & - & PTP,PRTKES,PRTHLS,ZCOEF_DISS,PTDIFF, & - & PTDISS,PEDR,YDDDH, YDLDDH, YDMDDH) -IF (LBUDGET_TH) THEN - IF ( KRRI >= 1 .AND. KRRL >= 1 ) THEN - CALL BUDGET_DDH (PRTHLS+ ZLVOCPEXNM * PRRS(:,:,:,2) + ZLSOCPEXNM * PRRS(:,:,:,4),4,'DISSH_BU_RTH',YDDDH, YDLDDH, YDMDDH) - ELSE IF ( KRRL >= 1 ) THEN - CALL BUDGET_DDH (PRTHLS+ ZLOCPEXNM * PRRS(:,:,:,2),4,'DISSH_BU_RTH',YDDDH, YDLDDH, YDMDDH) - ELSE - CALL BUDGET_DDH (PRTHLS,4,'DISSH_BU_RTH',YDDDH, YDLDDH, YDMDDH) - END IF -END IF - -ENDIF -! -!---------------------------------------------------------------------------- -! -!* 7. STORES SOME INFORMATIONS RELATED TO THE TURBULENCE SCHEME -! --------------------------------------------------------- -! -IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN - YCOMMENT=' ' -! -! 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) -! - 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) -! -! 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) - END IF -END IF -! -!* stores value of conservative variables & wind before turbulence tendency -PDRUS_TURB = PRUS - PDRUS_TURB -PDRVS_TURB = PRVS - PDRVS_TURB -PDRTHLS_TURB = PRTHLS - PDRTHLS_TURB -PDRRTS_TURB = PRRS(:,:,:,1) - PDRRTS_TURB -PDRSVS_TURB = PRSVS - PDRSVS_TURB -!---------------------------------------------------------------------------- -! -!* 8. RETRIEVE NON-CONSERVATIVE VARIABLES -! ----------------------------------- -! -IF ( KRRL >= 1 ) THEN - IF ( KRRI >= 1 ) THEN - PRM(:,:,:,1) = PRM(:,:,:,1) - PRM(:,:,:,2) - PRM(:,:,:,4) - PRRS(:,:,:,1) = PRRS(:,:,:,1) - PRRS(:,:,:,2) - PRRS(:,:,:,4) - PTHLM(:,:,:) = PTHLM(:,:,:) + ZLVOCPEXNM(:,:,:) * PRM(:,:,:,2) & - + ZLSOCPEXNM(:,:,:) * PRM(:,:,:,4) - PRTHLS(:,:,:) = PRTHLS(:,:,:) + ZLVOCPEXNM(:,:,:) * PRRS(:,:,:,2) & - + ZLSOCPEXNM(:,:,:) * PRRS(:,:,:,4) -! - DEALLOCATE(ZLVOCPEXNM) - DEALLOCATE(ZLSOCPEXNM) - ELSE - PRM(:,:,:,1) = PRM(:,:,:,1) - PRM(:,:,:,2) - PRRS(:,:,:,1) = PRRS(:,:,:,1) - PRRS(:,:,:,2) - PTHLM(:,:,:) = PTHLM(:,:,:) + ZLOCPEXNM(:,:,:) * PRM(:,:,:,2) - PRTHLS(:,:,:) = PRTHLS(:,:,:) + ZLOCPEXNM(:,:,:) * PRRS(:,:,:,2) - END IF -END IF -! -!---------------------------------------------------------------------------- -! -!* 9. LES averaged surface fluxes -! --------------------------- -! -IF (LLES_CALL) THEN - CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID(PSFTH,X_LES_Q0) - CALL LES_MEAN_SUBGRID(PSFRV,X_LES_E0) - DO JSV=1,NSV - CALL LES_MEAN_SUBGRID(PSFSV(:,:,JSV),X_LES_SV0(:,JSV)) - END DO - CALL LES_MEAN_SUBGRID(PSFU,X_LES_UW0) - CALL LES_MEAN_SUBGRID(PSFV,X_LES_VW0) - CALL LES_MEAN_SUBGRID((PSFU*PSFU+PSFV*PSFV)**0.25,X_LES_USTAR) -!---------------------------------------------------------------------------- -! -!* 10. LES for 3rd order moments -! ------------------------- -! - CALL LES_MEAN_SUBGRID(ZMWTH,X_LES_SUBGRID_W2Thl) - CALL LES_MEAN_SUBGRID(ZMTH2,X_LES_SUBGRID_WThl2) - IF (KRR>0) THEN - CALL LES_MEAN_SUBGRID(ZMWR,X_LES_SUBGRID_W2Rt) - CALL LES_MEAN_SUBGRID(ZMTHR,X_LES_SUBGRID_WThlRt) - CALL LES_MEAN_SUBGRID(ZMR2,X_LES_SUBGRID_WRt2) - END IF -! -!---------------------------------------------------------------------------- -! -!* 11. LES quantities depending on <w'2> in "1DIM" mode -! ------------------------------------------------ -! - IF (HTURBDIM=="1DIM") THEN - CALL LES_MEAN_SUBGRID(2./3.*PTKEM,X_LES_SUBGRID_U2) - CALL LES_MEAN_SUBGRID(2./3.*PTKEM,X_LES_SUBGRID_V2) - CALL LES_MEAN_SUBGRID(2./3.*PTKEM,X_LES_SUBGRID_W2) - CALL LES_MEAN_SUBGRID(2./3.*PTKEM*MZF(GZ_M_W(PTHLM,PDZZ, KKA, KKU, KKL),& - KKA, KKU, KKL),X_LES_RES_ddz_Thl_SBG_W2) - IF (KRR>=1) & - CALL LES_MEAN_SUBGRID(2./3.*PTKEM*MZF(GZ_M_W(PRM(:,:,:,1),PDZZ, KKA, KKU, KKL),& - &KKA, KKU, KKL),X_LES_RES_ddz_Rt_SBG_W2) - DO JSV=1,NSV - CALL LES_MEAN_SUBGRID(2./3.*PTKEM*MZF(GZ_M_W(PSVM(:,:,:,JSV),PDZZ, KKA, KKU, KKL), & - &KKA, KKU, KKL), X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) - END DO - END IF - -!---------------------------------------------------------------------------- -! -!* 12. LES mixing end dissipative lengths, presso-correlations -! ------------------------------------------------------- -! - CALL LES_MEAN_SUBGRID(ZLM,X_LES_SUBGRID_LMix) - CALL LES_MEAN_SUBGRID(ZLEPS,X_LES_SUBGRID_LDiss) -! -!* presso-correlations for subgrid Tke are equal to zero. -! - ZLM = 0. - CALL LES_MEAN_SUBGRID(ZLM,X_LES_SUBGRID_WP) -! - CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 -END IF -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('TURB',1,ZHOOK_HANDLE) -CONTAINS -! -! -! ############################################## - SUBROUTINE UPDATE_ROTATE_WIND(PUSLOPE,PVSLOPE) -! ############################################## -!! -!!**** *UPDATE_ROTATE_WIND* routine to set rotate wind values at the border -! -!! AUTHOR -!! ------ -!! -!! P Jabouille *CNRM METEO-FRANCE -!! -!! MODIFICATIONS -!! ------------- -!! Original 24/06/99 -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -!USE MODE_ll -!USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODD_CONF -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -REAL, DIMENSION(:,:), INTENT(INOUT) :: PUSLOPE,PVSLOPE -! tangential surface fluxes in the axes following the orography -! -!* 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 -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('TURB:UPDATE_ROTATE_WIND',0,ZHOOK_HANDLE) -! -!* 1 PROLOGUE -! -!NULLIFY(TZFIELDS_ll) -! -!CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -! -! 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 -! -! 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 (LHOOK) CALL DR_HOOK('TURB:UPDATE_ROTATE_WIND',1,ZHOOK_HANDLE) -! -END SUBROUTINE UPDATE_ROTATE_WIND -! -! ######################################################################## - SUBROUTINE COMPUTE_FUNCTION_THERMO(PALP,PBETA,PGAM,PLTT,PC,PT,PEXN,PCP,& - PLOCPEXN,PAMOIST,PATHETA ) -! ######################################################################## -!! -!!**** *COMPUTE_FUNCTION_THERMO* routine to compute several thermo functions -! -!! AUTHOR -!! ------ -!! -!! JP Pinty *LA* -!! -!! MODIFICATIONS -!! ------------- -!! Original 24/02/03 -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -USE MODD_CST -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments -! -REAL :: PALP,PBETA,PGAM,PLTT,PC -REAL, DIMENSION(:,:,:), INTENT(IN) :: PT,PEXN,PCP -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLOCPEXN -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PAMOIST,PATHETA -! -!* 0.2 Declarations of local variables -! -REAL :: ZEPS ! XMV / XMD -REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZRVSAT -REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZDRVSATDT -! -!------------------------------------------------------------------------------- -! - REAL(KIND=JPRB) :: ZHOOK_HANDLE - IF (LHOOK) CALL DR_HOOK('TURB:COMPUTE_FUNCTION_THERMO',0,ZHOOK_HANDLE) - ZEPS = XMV / XMD -! -!* 1.1 Lv/Cph at t -! - PLOCPEXN(:,:,:) = ( PLTT + (XCPV-PC) * (PT(:,:,:)-XTT) ) / PCP(:,:,:) -! -!* 1.2 Saturation vapor pressure at t -! - ZRVSAT(:,:,:) = EXP( PALP - PBETA/PT(:,:,:) - PGAM*ALOG( PT(:,:,:) ) ) -! -!* 1.3 saturation mixing ratio at t -! - ZRVSAT(:,:,:) = ZRVSAT(:,:,:) * ZEPS / ( PPABSM(:,:,:) - ZRVSAT(:,:,:) ) -! -!* 1.4 compute the saturation mixing ratio derivative (rvs') -! - ZDRVSATDT(:,:,:) = ( PBETA / PT(:,:,:) - PGAM ) / PT(:,:,:) & - * ZRVSAT(:,:,:) * ( 1. + ZRVSAT(:,:,:) / ZEPS ) -! -!* 1.5 compute Amoist -! - PAMOIST(:,:,:)= 0.5 / ( 1.0 + ZDRVSATDT(:,:,:) * PLOCPEXN(:,:,:) ) -! -!* 1.6 compute Atheta -! - PATHETA(:,:,:)= PAMOIST(:,:,:) * PEXN(:,:,:) * & - ( ( ZRVSAT(:,:,:) - PRM(:,:,:,1) ) * PLOCPEXN(:,:,:) / & - ( 1. + ZDRVSATDT(:,:,:) * PLOCPEXN(:,:,:) ) * & - ( & - ZRVSAT(:,:,:) * (1. + ZRVSAT(:,:,:)/ZEPS) & - * ( -2.*PBETA/PT(:,:,:) + PGAM ) / PT(:,:,:)**2 & - +ZDRVSATDT(:,:,:) * (1. + 2. * ZRVSAT(:,:,:)/ZEPS) & - * ( PBETA/PT(:,:,:) - PGAM ) / PT(:,:,:) & - ) & - - ZDRVSATDT(:,:,:) & - ) -! -!* 1.7 Lv/Cph/Exner at t-1 -! - PLOCPEXN(:,:,:) = PLOCPEXN(:,:,:) / PEXN(:,:,:) -! -IF (LHOOK) CALL DR_HOOK('TURB:COMPUTE_FUNCTION_THERMO',1,ZHOOK_HANDLE) -END SUBROUTINE COMPUTE_FUNCTION_THERMO -! -! #################### - SUBROUTINE DELT(PLM) -! #################### -!! -!!**** *DELT* routine to compute mixing length for DELT case -! -!! AUTHOR -!! ------ -!! -!! M Tomasini *Meteo-France -!! -!! MODIFICATIONS -!! ------------- -!! Original 01/05 -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -!* 0.1 Declarations of dummy arguments -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM -! -!* 0.2 Declarations of local variables -! -REAL :: ZD ! distance to the surface -! -!------------------------------------------------------------------------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('TURB:DELT',0,ZHOOK_HANDLE) -DO JK = IKTB,IKTE ! 1D turbulence scheme - PLM(:,:,JK) = PZZ(:,:,JK+KKL) - PZZ(:,:,JK) -END DO -PLM(:,:,KKU) = PLM(:,:,IKE) -PLM(:,:,KKA) = PZZ(:,:,IKB) - PZZ(:,:,KKA) -IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme - IF ( L2D) THEN - PLM(:,:,:) = SQRT( PLM(:,:,:)*MXF(PDXX(:,:,:)) ) - ELSE - PLM(:,:,:) = (PLM(:,:,:)*MXF(PDXX(:,:,:))*MYF(PDYY(:,:,:)) ) ** (1./3.) - END IF -END IF -! -! mixing length limited by the distance normal to the surface -! (with the same factor as for BL89) -! -IF (.NOT. ORMC01) THEN - ZALPHA=0.5**(-1.5) - ! - DO JJ=1,SIZE(PUM,2) - DO JI=1,SIZE(PUM,1) - DO JK=IKTB,IKTE - ZD=ZALPHA*(0.5*(PZZ(JI,JJ,JK)+PZZ(JI,JJ,JK+KKL))& - -PZZ(JI,JJ,IKB)) *PDIRCOSZW(JI,JJ) - IF ( PLM(JI,JJ,JK)>ZD) THEN - PLM(JI,JJ,JK)=ZD - ELSE - EXIT - ENDIF - END DO - END DO - END DO -END IF -! -PLM(:,:,KKA) = PLM(:,:,IKB ) -PLM(:,:,KKU ) = PLM(:,:,IKE) -! -IF (LHOOK) CALL DR_HOOK('TURB:DELT',1,ZHOOK_HANDLE) -END SUBROUTINE DELT -! -! #################### - SUBROUTINE DEAR(PLM) -! #################### -!! -!!**** *DELT* routine to compute mixing length for DEARdorff case -! -!! AUTHOR -!! ------ -!! -!! M Tomasini *Meteo-France -!! -!! MODIFICATIONS -!! ------------- -!! Original 01/05 -!! I.Sandu (Sept.2006) : Modification of the stability criterion -!! (theta_v -> theta_l) -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -!* 0.1 Declarations of dummy arguments -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM -! -!* 0.2 Declarations of local variables -! -REAL :: ZD ! distance to the surface -REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK2D -! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & - ZDTHLDZ,ZDRTDZ, &!dtheta_l/dz, drt_dz used for computing the stablity -! ! criterion - ZETHETA,ZEMOIST !coef ETHETA and EMOIST -!---------------------------------------------------------------------------- -! -!------------------------------------------------------------------------------- -! -! initialize the mixing length with the mesh grid -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('TURB:DEAR',0,ZHOOK_HANDLE) -DO JK = IKTB,IKTE ! 1D turbulence scheme - PLM(:,:,JK) = PZZ(:,:,JK+KKL) - PZZ(:,:,JK) -END DO -PLM(:,:,KKU) = PLM(:,:,IKE) -PLM(:,:,KKA) = PZZ(:,:,IKB) - PZZ(:,:,KKA) -IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme - IF ( L2D) THEN - PLM(:,:,:) = SQRT( PLM(:,:,:)*MXF(PDXX(:,:,:)) ) - ELSE - PLM(:,:,:) = (PLM(:,:,:)*MXF(PDXX(:,:,:))*MYF(PDYY(:,:,:)) ) ** (1./3.) - END IF -END IF -! compute a mixing length limited by the stability -! -ALLOCATE(ZWORK2D(SIZE(PUM,1),SIZE(PUM,2))) -! -ZETHETA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,ZLOCPEXNM,ZATHETA,PSRCM) -ZEMOIST(:,:,:) = EMOIST(KRR,KRRI,PTHLM,PRM,ZLOCPEXNM,ZAMOIST,PSRCM) -! -DO JK = IKTB+1,IKTE-1 - ZDTHLDZ(:,:,JK)= 0.5*((PTHLM(:,:,JK+KKL)-PTHLM(:,:,JK))/PDZZ(:,:,JK+KKL)+ & - (PTHLM(:,:,JK)-PTHLM(:,:,JK-KKL))/PDZZ(:,:,JK)) - ZDRTDZ(:,:,JK)= 0.5*((PRM(:,:,JK+KKL,1)-PRM(:,:,JK,1))/PDZZ(:,:,JK+KKL)+ & - (PRM(:,:,JK,1)-PRM(:,:,JK-KKL,1))/PDZZ(:,:,JK)) - ZWORK2D(:,:)=XG/PTHVREF(:,:,JK)* & - (ZETHETA(:,:,JK)*ZDTHLDZ(:,:,JK)+ZEMOIST(:,:,JK)*ZDRTDZ(:,:,JK)) - ! - WHERE(ZWORK2D(:,:)>0.) - PLM(:,:,JK)=MAX(1.E-10,MIN(PLM(:,:,JK), & - 0.76* SQRT(PTKEM(:,:,JK)/ZWORK2D(:,:)))) - END WHERE -END DO -! special case near the surface -ZDTHLDZ(:,:,IKB)=(PTHLM(:,:,IKB+KKL)-PTHLM(:,:,IKB))/PDZZ(:,:,IKB+KKL) -ZDRTDZ(:,:,IKB)=(PRM(:,:,IKB+KKL,1)-PRM(:,:,IKB,1))/PDZZ(:,:,IKB+KKL) -! -ZWORK2D(:,:)=XG/PTHVREF(:,:,IKB)* & - (ZETHETA(:,:,IKB)*ZDTHLDZ(:,:,IKB)+ZEMOIST(:,:,IKB)*ZDRTDZ(:,:,IKB)) -WHERE(ZWORK2D(:,:)>0.) - PLM(:,:,IKB)=MAX(1.E-10,MIN( PLM(:,:,JK), & - 0.76* SQRT(PTKEM(:,:,IKB)/ZWORK2D(:,:)))) -END WHERE -! -DEALLOCATE(ZWORK2D) -! -! mixing length limited by the distance normal to the surface (with the same factor as for BL89) -! -IF (.NOT. ORMC01) THEN - ZALPHA=0.5**(-1.5) - ! - DO JJ=1,SIZE(PUM,2) - DO JI=1,SIZE(PUM,1) - DO JK=IKTB,IKTE - ZD=ZALPHA*(0.5*(PZZ(JI,JJ,JK)+PZZ(JI,JJ,JK+KKL))-PZZ(JI,JJ,IKB)) & - *PDIRCOSZW(JI,JJ) - IF ( PLM(JI,JJ,JK)>ZD) THEN - PLM(JI,JJ,JK)=ZD - ELSE - EXIT - ENDIF - END DO - END DO - END DO -END IF -! -PLM(:,:,KKA) = PLM(:,:,IKB ) -PLM(:,:,IKE ) = PLM(:,:,IKE-KKL) -PLM(:,:,KKU ) = PLM(:,:,KKU-KKL) -! -IF (LHOOK) CALL DR_HOOK('TURB:DEAR',1,ZHOOK_HANDLE) -END SUBROUTINE DEAR -! -! ######################### - SUBROUTINE CLOUD_MODIF_LM -! ######################### -!! -!!*****CLOUD_MODIF_LM routine to: -!! 1/ change the mixing length in the clouds -!! 2/ emphasize the mixing length in the cloud -!! by the coefficient ZCOEF_AMPL calculated here -!! when the CEI index is above ZCEI_MIN. -!! -!! -!! ZCOEF_AMPL ^ -!! | -!! | -!! ZCOEF_AMPL_SAT - ---------- Saturation -!! (XDUMMY1) | - -!! | - -!! | - -!! | - -!! | - Amplification -!! | - straight -!! | - line -!! | - -!! | - -!! | - -!! | - -!! | - -!! 1 ------------ -!! | -!! | -!! 0 -----------|------------|----------> PCEI -!! 0 ZCEI_MIN ZCEI_MAX -!! (XDUMMY2) (XDUMMY3) -!! -!! -!! -!! AUTHOR -!! ------ -!! M. Tomasini *CNRM METEO-FRANCE -!! -!! MODIFICATIONS -!! ------------- -!! Original 09/07/04 -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -! -REAL :: ZPENTE ! Slope of the amplification straight line -REAL :: ZCOEF_AMPL_CEI_NUL! Ordonnate at the origin of the - ! amplification straight line -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZCOEF_AMPL - ! Amplification coefficient of the mixing length - ! when the instability criterium is verified -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZLM_CLOUD - ! Turbulent mixing length in the clouds -! -!------------------------------------------------------------------------------- -! -!* 1. INITIALISATION -! -------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('TURB:CLOUD_MODIF_LM',0,ZHOOK_HANDLE) -ZPENTE = ( PCOEF_AMPL_SAT - 1. ) / ( PCEI_MAX - PCEI_MIN ) -ZCOEF_AMPL_CEI_NUL = 1. - ZPENTE * PCEI_MIN -! -ZCOEF_AMPL(:,:,:) = 1. -! -!* 2. CALCULATION OF THE AMPLIFICATION COEFFICIENT -! -------------------------------------------- -! -! Saturation -! -WHERE ( PCEI(:,:,:)>=PCEI_MAX ) ZCOEF_AMPL(:,:,:)=PCOEF_AMPL_SAT -! -! Between the min and max limits of CEI index, linear variation of the -! amplification coefficient ZCOEF_AMPL as a function of CEI -! -WHERE ( PCEI(:,:,:) < PCEI_MAX .AND. & - PCEI(:,:,:) > PCEI_MIN ) & - ZCOEF_AMPL(:,:,:) = ZPENTE * PCEI(:,:,:) + ZCOEF_AMPL_CEI_NUL -! -! -!* 3. CALCULATION OF THE MIXING LENGTH IN CLOUDS -! ------------------------------------------ -! -IF (HTURBLEN_CL == HTURBLEN) THEN - ZLM_CLOUD(:,:,:) = ZLM(:,:,:) -ELSE - SELECT CASE (HTURBLEN_CL) -! -!* 3.1 BL89 mixing length -! ------------------ - CASE ('BL89') - ZSHEAR=0. - CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKEM,ZSHEAR,ZLM_CLOUD) -! -!* 3.2 Delta mixing length -! ------------------- - CASE ('DELT') - CALL DELT(ZLM_CLOUD) -! -!* 3.3 Deardorff mixing length -! ----------------------- - CASE ('DEAR') - CALL DEAR(ZLM_CLOUD) -! - END SELECT -ENDIF -! -!* 4. MODIFICATION OF THE MIXING LENGTH IN THE CLOUDS -! ----------------------------------------------- -! -! 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) -ENDIF -! -! Amplification of the mixing length when the criteria are verified -! -WHERE (ZCOEF_AMPL(:,:,:) /= 1.) ZLM(:,:,:) = ZCOEF_AMPL(:,:,:)*ZLM_CLOUD(:,:,:) -! -! Cloud mixing length in the clouds at the points which do not verified the CEI -! -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) - ! - 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) - ! -ENDIF -! -IF (LHOOK) CALL DR_HOOK('TURB:CLOUD_MODIF_LM',1,ZHOOK_HANDLE) -END SUBROUTINE CLOUD_MODIF_LM -! -END SUBROUTINE TURB diff --git a/src/arome/turb/turb_ver_dyn_flux.F90 b/src/arome/turb/turb_ver_dyn_flux.F90 deleted file mode 100644 index 6c3c5f5c7504fcf51cf7bb70a23eddc40539b42b..0000000000000000000000000000000000000000 --- a/src/arome/turb/turb_ver_dyn_flux.F90 +++ /dev/null @@ -1,746 +0,0 @@ -! ######spl - SUBROUTINE TURB_VER_DYN_FLUX(KKA,KKU,KKL, & - OCLOSE_OUT,OTURB_FLX,KRR, & - HTURBDIM,PIMPL,PEXPL, & - PTSTEP, & - HFMFILE,HLUOUT, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & - PCOSSLOPE,PSINSLOPE, & - PRHODJ, & - PCDUEFF,PTAU11M,PTAU12M,PTAU33M, & - PTHLM,PRM,PSVM,PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & - PTKEM,PLM,MFMOIST,PWU,PWV, & - PRUS,PRVS,PRWS, & - PDP,PTP ) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK - USE MODD_CTURB, ONLY : LHARAT - -! ############################################################### -! -! -!!**** *TURB_VER_DYN_FLUX* -compute the source terms due to the vertical turbulent -!! fluxes. -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute the vertical turbulent -! fluxes of the evolutive variables and give back the source -! terms to the main program. In the case of large horizontal meshes, -! the divergence of these vertical turbulent fluxes represent the whole -! effect of the turbulence but when the three-dimensionnal version of -! the turbulence scheme is activated (CTURBDIM="3DIM"), these divergences -! are completed in the next routine TURB_HOR. -! An arbitrary degree of implicitness has been implemented for the -! temporal treatment of these diffusion terms. -! The vertical boundary conditions are as follows: -! * at the bottom, the surface fluxes are prescribed at the same -! as the other turbulent fluxes -! * at the top, the turbulent fluxes are set to 0. -! It should be noted that the condensation has been implicitely included -! in this turbulence scheme by using conservative variables and computing -! the subgrid variance of a statistical variable s indicating the presence -! or not of condensation in a given mesh. -! -!!** METHOD -!! ------ -!! 1D type calculations are made; -!! The vertical turbulent fluxes are computed in an off-centered -!! implicit scheme (a Crank-Nicholson type with coefficients different -!! than 0.5), which allows to vary the degree of implicitness of the -!! formulation. -!! The different prognostic variables are treated one by one. -!! The contributions of each turbulent fluxes are cumulated into the -!! tendency PRvarS, and into the dynamic and thermal production of -!! TKE if necessary. -!! -!! In section 2 and 3, the thermodynamical fields are considered. -!! Only the turbulent fluxes of the conservative variables -!! (Thetal and Rnp stored in PRx(:,:,:,1)) are computed. -!! Note that the turbulent fluxes at the vertical -!! boundaries are given either by the soil scheme for the surface one -!! ( at the same instant as the others fluxes) and equal to 0 at the -!! top of the model. The thermal production is computed by vertically -!! averaging the turbulent flux and multiply this flux at the mass point by -!! a function ETHETA or EMOIST, which preform the transformation from the -!! conservative variables to the virtual potential temperature. -!! -!! In section 4, the variance of the statistical variable -!! s indicating presence or not of condensation, is determined in function -!! of the turbulent moments of the conservative variables and its -!! squarred root is stored in PSIGS. This information will be completed in -!! the horizontal turbulence if the turbulence dimensionality is not -!! equal to "1DIM". -!! -!! In section 5, the x component of the stress tensor is computed. -!! The surface flux <u'w'> is computed from the value of the surface -!! fluxes computed in axes linked to the orography ( i", j" , k"): -!! i" is parallel to the surface and in the direction of the maximum -!! slope -!! j" is also parallel to the surface and in the normal direction of -!! the maximum slope -!! k" is the normal to the surface -!! In order to prevent numerical instability, the implicit scheme has -!! been extended to the surface flux regarding to its dependence in -!! function of U. The dependence in function of the other components -!! introduced by the different rotations is only explicit. -!! The turbulent fluxes are used to compute the dynamic production of -!! TKE. For the last TKE level ( located at PDZZ(:,:,IKB)/2 from the -!! ground), an harmonic extrapolation from the dynamic production at -!! PDZZ(:,:,IKB) is used to avoid an evaluation of the gradient of U -!! in the surface layer. -!! -!! In section 6, the same steps are repeated but for the y direction -!! and in section 7, a diagnostic computation of the W variance is -!! performed. -!! -!! In section 8, the turbulent fluxes for the scalar variables are -!! computed by the same way as the conservative thermodynamical variables -!! -!! -!! EXTERNAL -!! -------- -!! GX_U_M, GY_V_M, GZ_W_M : cartesian gradient operators -!! GX_U_UW,GY_V_VW (X,Y,Z) represent the direction of the gradient -!! _(M,U,...)_ represent the localization of the -!! field to be derivated -!! _(M,UW,...) represent the localization of the -!! field derivated -!! -!! -!! MXM,MXF,MYM,MYF,MZM,MZF -!! : Shuman functions (mean operators) -!! DXF,DYF,DZF,DZM -!! : Shuman functions (difference operators) -!! -!! SUBROUTINE TRIDIAG : to compute the splitted implicit evolution -!! of a variable located at a mass point -!! -!! SUBROUTINE TRIDIAG_WIND: to compute the splitted implicit evolution -!! of a variable located at a wind point -!! -!! FUNCTIONs ETHETA and EMOIST : -!! allows to compute: -!! - the coefficients for the turbulent correlation between -!! any variable and the virtual potential temperature, of its -!! correlations with the conservative potential temperature and -!! the humidity conservative variable: -!! ------- ------- ------- -!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : contains physical constants -!! -!! XG : gravity constant -!! -!! Module MODD_CTURB: contains the set of constants for -!! the turbulence scheme -!! -!! XCMFS,XCMFB : cts for the momentum flux -!! XCSHF : ct for the sensible heat flux -!! XCHF : ct for the moisture flux -!! XCTV,XCHV : cts for the T and moisture variances -!! -!! Module MODD_PARAMETERS -!! -!! JPVEXT_TURB : number of vertical external points -!! JPHEXT : number of horizontal external points -!! -!! -!! REFERENCE -!! --------- -!! Book 1 of documentation (Chapter: Turbulence) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart * INM and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original August 19, 1994 -!! Modifications: February 14, 1995 (J.Cuxart and J.Stein) -!! Doctorization and Optimization -!! Modifications: March 21, 1995 (J.M. Carriere) -!! Introduction of cloud water -!! Modifications: June 14, 1995 (J.Cuxart and J. Stein) -!! Phi3 and Psi3 at w-point + bug in the all -!! or nothing condens. -!! Modifications: Sept 15, 1995 (J.Cuxart and J. Stein) -!! Change the DP computation at the ground -!! Modifications: October 10, 1995 (J.Cuxart and J. Stein) -!! Psi for scal var and LES tools -!! Modifications: November 10, 1995 (J. Stein) -!! change the surface relations -!! Modifications: February 20, 1995 (J. Stein) optimization -!! Modifications: May 21, 1996 (J. Stein) -!! bug in the vertical flux of the V wind -!! component for explicit computation -!! Modifications: May 21, 1996 (N. wood) -!! modify the computation of the vertical -!! part or the surface tangential flux -!! Modifications: May 21, 1996 (P. Jabouille) -!! same modification in the Y direction -!! -!! Modifications: Sept 17, 1996 (J. Stein) change the moist case by using -!! Pi instead of Piref + use Atheta and Amoist -!! -!! Modifications: Nov 24, 1997 (V. Masson) removes the DO loops -!! Modifications: Mar 31, 1998 (V. Masson) splits the routine TURB_VER_DYN_FLUX -!! Modifications: Oct 18, 2000 (J. Stein) Bug in some computations for IKB level -!! Modifications: Oct 18, 2000 (V. Masson) LES computations + LFLAT switch -!! Nov 06, 2002 (V. Masson) LES budgets -!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after -!! change of YCOMMENT -!! 2012-02 Y. Seity, add possibility to run with reversed vertical levels -!! Modifications July 2015 (Wim de Rooy) LHARATU switch - -!!-------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CONF -USE MODD_CST -USE MODD_CTURB -USE MODD_PARAMETERS -USE MODD_LES -USE MODD_NSV -! -! -USE MODI_GRADIENT_U -USE MODI_GRADIENT_V -USE MODI_GRADIENT_W -USE MODI_GRADIENT_M -USE MODI_SHUMAN , ONLY: MZM, MZF, MXM, MXF, MYM, MYF,& - & DZM, DXF, DXM, DYF, DYM -USE MODI_TRIDIAG -USE MODI_TRIDIAG_WIND -USE MODE_FMWRIT -USE MODI_LES_MEAN_SUBGRID -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -INTEGER, INTENT(IN) :: KRR ! number of moist var. -CHARACTER*4, INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -REAL, INTENT(IN) :: PTSTEP ! Double Time Step -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points -REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle - ! between i and the slope vector -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(:,:,:), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme - -! -REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked - ! to the maximum slope direction and the surface normal and the binormal - ! at time t - dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM, PTHLM - ! Wind at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM -REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the - ! maximum slope direction -REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the - ! direction normal to the maximum slope one -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWU ! momentum flux u'w' -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWV ! momentum flux v'w' -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS - ! cumulated sources for the prognostic variables -! -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP,PTP ! Dynamic and thermal - ! TKE production terms -! -! -! -! -!* 0.2 declaration of local variables -! -! -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2)) :: ZDIRSINZW ! sinus of the angle - ! between the normal and the vertical at the surface -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),1):: ZCOEFS ! coeff. for the - ! implicit scheme for the wind at the surface -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: & - ZA, & ! under diagonal elements of the tri-diagonal matrix involved - ! in the temporal implicit scheme (also used to store coefficient - ! J in Section 5) - ZRES, & ! guess of the treated variable at t+ deltat when the turbu- - ! lence is the only source of evolution added to the ones - ! considered in ZSOURCE - ZFLXZ, & ! vertical flux of the treated variable - ZSOURCE, & ! source of evolution for the treated variable - ZKEFF ! effectif diffusion coeff = LT * SQRT( TKE ) -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: IGRID ! C-grid indicator in LFIFM file -INTEGER :: ILENCH ! Length of comment string in LFIFM file -INTEGER :: IIB,IIE, & ! I index values for the Beginning and End - IJB,IJE, & ! mass points of the domain in the 3 direct. - IKB,IKE ! -INTEGER :: IKT ! array size in k direction -INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain -INTEGER :: JSV ! scalar loop counter -CHARACTER (LEN=100) :: YCOMMENT ! comment string in LFIFM file -CHARACTER (LEN=16) :: YRECFM ! Name of the desired field in LFIFM file -REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1) :: ZCOEFFLXU, & - ZCOEFFLXV, ZUSLOPEM, ZVSLOPEM - ! coefficients for the surface flux - ! evaluation and copy of PUSLOPEM and - ! PVSLOPEM in local 3D arrays -INTEGER :: IIU,IJU ! size of array in x,y,z directions -! -REAL :: ZTIME1, ZTIME2, ZCMFS -!---------------------------------------------------------------------------- -! -!* 1. PRELIMINARIES -! ------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('TURB_VER_DYN_FLUX',0,ZHOOK_HANDLE) -IIU=SIZE(PUM,1) -IIE=IIU-JPHEXT -IIB=1+JPHEXT -IJU=SIZE(PUM,2) -IJE=IJU-JPHEXT -IJB=1+JPHEXT -IKB=KKA+JPVEXT_TURB*KKL -IKE=KKU-JPVEXT_TURB*KKL -IKT=SIZE(PUM,3) -IKTB=1+JPVEXT_TURB -IKTE=IKT-JPVEXT_TURB - - -! -ZSOURCE = 0. -ZFLXZ = 0. -ZCMFS = XCMFS -IF (LHARAT)THEN - ZCMFS=1. -ENDIF -! -ZDIRSINZW(:,:) = SQRT(1.-PDIRCOSZW(:,:)**2) -! compute the coefficients for the uncentred gradient computation near the -! ground -! -! With LHARATU length scale and TKE are at half levels so remove MZM -! -IF (LHARAT) THEN -ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) + 50*MFMOIST(:,:,:) -ELSE -ZKEFF(:,:,:) = MZM(PLM(:,:,:) * SQRT(PTKEM(:,:,:)), KKA, KKU, KKL) -ENDIF - -! -ZUSLOPEM(:,:,1)=PUSLOPEM(:,:) -ZVSLOPEM(:,:,1)=PVSLOPEM(:,:) -! -!---------------------------------------------------------------------------- -! -! -!* 5. SOURCES OF U,W WIND COMPONENTS AND PARTIAL DYNAMIC PRODUCTION -! ------------------------------------------------------------- -! -!* 5.1 Source of U wind component -! -! Preparation of the arguments for TRIDIAG_WIND -! -ZA(:,:,:) = -PTSTEP * ZCMFS * & - MXM( ZKEFF ) * MXM(MZM(PRHODJ, KKA, KKU, KKL)) / & - MXM( PDZZ )**2 -! -IF (CPROGRAM/='AROME ') ZA(1,:,:)=ZA(IIE,:,:) -! -! Compute the source of U wind component -! -! compute the coefficient between the vertical flux and the 2 components of the -! wind following the slope -ZCOEFFLXU(:,:,1) = PCDUEFF(:,:) * (PDIRCOSZW(:,:)**2 - ZDIRSINZW(:,:)**2) & - * PCOSSLOPE(:,:) -ZCOEFFLXV(:,:,1) = PCDUEFF(:,:) * PDIRCOSZW(:,:) * PSINSLOPE(:,:) - -! prepare the implicit scheme coefficients for the surface flux -ZCOEFS(:,:,1)= ZCOEFFLXU(:,:,1) * PCOSSLOPE(:,:) * PDIRCOSZW(:,:) & - +ZCOEFFLXV(:,:,1) * PSINSLOPE(:,:) -! -! average this flux to be located at the U,W vorticity point -ZCOEFS(:,:,1:1)=MXM(ZCOEFS(:,:,1:1) / PDZZ(:,:,IKB:IKB) ) -! -! compute the explicit tangential flux at the W point -ZSOURCE(:,:,IKB) = & - PTAU11M(:,:) * PCOSSLOPE(:,:) * PDIRCOSZW(:,:) * ZDIRSINZW(:,:) & - -PTAU12M(:,:) * PSINSLOPE(:,:) * ZDIRSINZW(:,:) & - -PTAU33M(:,:) * PCOSSLOPE(:,:) * ZDIRSINZW(:,:) * PDIRCOSZW(:,:) -! -! add the vertical part or the surface flux at the U,W vorticity point - -ZSOURCE(:,:,IKB:IKB) = & - ( MXM( ZSOURCE(:,:,IKB:IKB) / PDZZ(:,:,IKB:IKB) ) & - + MXM( ZCOEFFLXU(:,:,1:1) / PDZZ(:,:,IKB:IKB) & - *ZUSLOPEM(:,:,1:1) & - -ZCOEFFLXV(:,:,1:1) / PDZZ(:,:,IKB:IKB) & - *ZVSLOPEM(:,:,1:1) ) & - - ZCOEFS(:,:,1:1) * PUM(:,:,IKB:IKB) * PIMPL & - ) * 0.5 * ( 1. + MXM(PRHODJ(:,:,KKA:KKA)) / MXM(PRHODJ(:,:,IKB:IKB)) ) -! -ZSOURCE(:,:,IKTB+1:IKTE-1) = 0. -ZSOURCE(:,:,IKE) = 0. -! -! Obtention of the splitted U at t+ deltat -! -CALL TRIDIAG_WIND(KKA,KKU,KKL,PUM,ZA,ZCOEFS(:,:,1),PTSTEP,PEXPL,PIMPL, & - MXM(PRHODJ),ZSOURCE,ZRES) -! -! Compute the equivalent tendency for the U wind component -! -PRUS(:,:,:)=PRUS(:,:,:)+MXM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PUM(:,:,:))/PTSTEP -! -! -!* 5.2 Partial Dynamic Production -! -! vertical flux of the U wind component -! -ZFLXZ(:,:,:) = -ZCMFS * MXM(ZKEFF) * & - DZM(PIMPL*ZRES + PEXPL*PUM, KKA, KKU, KKL) / MXM(PDZZ) -! -! surface flux -ZFLXZ(:,:,IKB:IKB) = MXM(PDZZ(:,:,IKB:IKB)) * & - ( ZSOURCE(:,:,IKB:IKB) & - +ZCOEFS(:,:,1:1) * ZRES(:,:,IKB:IKB) * PIMPL & - ) / 0.5 / ( 1. + MXM(PRHODJ(:,:,KKA:KKA)) / MXM(PRHODJ(:,:,IKB:IKB)) ) -! -ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) - -! -IF ( OTURB_FLX .AND. OCLOSE_OUT ) THEN - ! stores the U wind component vertical flux - YRECFM ='UW_VFLX' - YCOMMENT='X_Y_Z_UW_VFLX (M**2/S**2)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZFLXZ,IGRID,ILENCH,YCOMMENT,IRESP) -END IF -! -! first part of total momentum flux -! -PWU(:,:,:) = ZFLXZ(:,:,:) -! -! Contribution to the dynamic production of TKE -! compute the dynamic production at the mass point -! -PDP(:,:,:) = - MZF(MXF(ZFLXZ * GZ_U_UW(PUM,PDZZ, KKA, KKU, KKL)), KKA, KKU, KKL) -! -! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) -PDP(:,:,IKB:IKB) = - MXF ( & - ZFLXZ(:,:,IKB+KKL:IKB+KKL) * (PUM(:,:,IKB+KKL:IKB+KKL)-PUM(:,:,IKB:IKB)) & - / MXM(PDZZ(:,:,IKB+KKL:IKB+KKL)) & - ) -! -! Storage in the LES configuration -! -IF (LLES_CALL) THEN - CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID(MZF(MXF(ZFLXZ), KKA, KKU, KKL), X_LES_SUBGRID_WU ) - CALL LES_MEAN_SUBGRID(MZF(MXF(GZ_U_UW(PUM,PDZZ, KKA, KKU, KKL) & - & *ZFLXZ), KKA, KKU, KKL), X_LES_RES_ddxa_U_SBG_UaU ) - CALL LES_MEAN_SUBGRID( ZCMFS * ZKEFF, X_LES_SUBGRID_Km ) - CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 -END IF -! -!* 5.3 Source of W wind component -! -! -IF(HTURBDIM=='3DIM') THEN - ! Compute the source for the W wind component - ZFLXZ(:,:,KKA) = 2 * ZFLXZ(:,:,IKB) - ZFLXZ(:,:,IKB+KKL) ! extrapolation - ! used to compute the W source at the ground - ! - IF (.NOT. LFLAT) THEN - PRWS(:,:,:)= PRWS & - -DXF( MZM(MXM(PRHODJ) /PDXX, KKA, KKU, KKL) * ZFLXZ ) & - +DZM(PRHODJ / MZF(PDZZ, KKA, KKU, KKL) * & - MXF(MZF(ZFLXZ*PDZX, KKA, KKU, KKL) / PDXX ), & - KKA, KKU, KKL) - ELSE - PRWS(:,:,:)= PRWS -DXF(MZM(MXM(PRHODJ) /PDXX, KKA, KKU, KKL) * ZFLXZ ) - END IF - ! - ! Complete the Dynamical production with the W wind component - ! - ZA(:,:,:)=-MZF(MXF(ZFLXZ * GX_W_UW(PWM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)), KKA, KKU, KKL) - ! - ! - ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) - ZA(:,:,IKB:IKB) = - MXF ( & - ZFLXZ(:,:,IKB+KKL:IKB+KKL) * & - ( DXM( PWM(:,:,IKB+KKL:IKB+KKL) ) & - -MXM( (PWM(:,:,IKB+2*KKL:IKB+2*KKL )-PWM(:,:,IKB+KKL:IKB+KKL)) & - /(PDZZ(:,:,IKB+2*KKL:IKB+2*KKL)+PDZZ(:,:,IKB+KKL:IKB+KKL)) & - +(PWM(:,:,IKB+KKL:IKB+KKL)-PWM(:,:,IKB:IKB )) & - /(PDZZ(:,:,IKB+KKL:IKB+KKL)+PDZZ(:,:,IKB:IKB )) & - ) & - * PDZX(:,:,IKB+KKL:IKB+KKL) & - ) / (0.5*(PDXX(:,:,IKB+KKL:IKB+KKL)+PDXX(:,:,IKB:IKB))) & - ) - ! - PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:) - ! - ! Storage in the LES configuration - ! - IF (LLES_CALL) THEN - CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID(MZF(MXF(GX_W_UW(PWM,PDXX,& - PDZZ,PDZX, KKA, KKU, KKL)*ZFLXZ), KKA, KKU, KKL), X_LES_RES_ddxa_W_SBG_UaW ) - CALL LES_MEAN_SUBGRID(MXF(GX_M_U(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)& - * MZF(ZFLXZ, KKA, KKU, KKL)), X_LES_RES_ddxa_Thl_SBG_UaW ) - IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID(MXF(GX_U_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)& - *MZF(ZFLXZ, KKA, KKU, KKL)),X_LES_RES_ddxa_Rt_SBG_UaW ) - END IF - DO JSV=1,NSV - CALL LES_MEAN_SUBGRID( MXF(GX_U_M(PSVM(:,:,:,JSV),PDXX,PDZZ,& - PDZX, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL)),X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) ) - END DO - CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 - END IF -END IF -! -!---------------------------------------------------------------------------- -! -! -!* 6. SOURCES OF V,W WIND COMPONENTS AND COMPLETE 1D DYNAMIC PRODUCTION -! ----------------------------------------------------------------- -! -!* 6.1 Source of V wind component -! -! Preparation of the arguments for TRIDIAG_WIND -!! -ZA(:,:,:) = - PTSTEP * ZCMFS * & - MYM( ZKEFF ) * MYM(MZM(PRHODJ, KKA, KKU, KKL)) / & - MYM( PDZZ )**2 -! -! -IF(CPROGRAM/='AROME ') ZA(:,1,:)=ZA(:,IJE,:) -! -! Compute the source of V wind component -! compute the coefficient between the vertical flux and the 2 components of the -! wind following the slope -ZCOEFFLXU(:,:,1) = PCDUEFF(:,:) * (PDIRCOSZW(:,:)**2 - ZDIRSINZW(:,:)**2) & - * PSINSLOPE(:,:) -ZCOEFFLXV(:,:,1) = PCDUEFF(:,:) * PDIRCOSZW(:,:) * PCOSSLOPE(:,:) - -! prepare the implicit scheme coefficients for the surface flux -ZCOEFS(:,:,1)= ZCOEFFLXU(:,:,1) * PSINSLOPE(:,:) * PDIRCOSZW(:,:) & - +ZCOEFFLXV(:,:,1) * PCOSSLOPE(:,:) -! -! average this flux to be located at the V,W vorticity point -ZCOEFS(:,:,1:1)=MYM(ZCOEFS(:,:,1:1) / PDZZ(:,:,IKB:IKB) ) -! -! compute the explicit tangential flux at the W point -ZSOURCE(:,:,IKB) = & - PTAU11M(:,:) * PSINSLOPE(:,:) * PDIRCOSZW(:,:) * ZDIRSINZW(:,:) & - +PTAU12M(:,:) * PCOSSLOPE(:,:) * ZDIRSINZW(:,:) & - -PTAU33M(:,:) * PSINSLOPE(:,:) * ZDIRSINZW(:,:) * PDIRCOSZW(:,:) -! -! add the vertical part or the surface flux at the V,W vorticity point -ZSOURCE(:,:,IKB:IKB) = & - ( MYM( ZSOURCE(:,:,IKB:IKB) / PDZZ(:,:,IKB:IKB) ) & - + MYM( ZCOEFFLXU(:,:,1:1) / PDZZ(:,:,IKB:IKB) & - *ZUSLOPEM(:,:,1:1) & - +ZCOEFFLXV(:,:,1:1) / PDZZ(:,:,IKB:IKB) & - *ZVSLOPEM(:,:,1:1) ) & - - ZCOEFS(:,:,1:1) * PVM(:,:,IKB:IKB) * PIMPL & - ) * 0.5 * ( 1. + MYM(PRHODJ(:,:,KKA:KKA)) / MYM(PRHODJ(:,:,IKB:IKB)) ) -! -ZSOURCE(:,:,IKTB+1:IKTE-1) = 0. -ZSOURCE(:,:,IKE) = 0. -! -! Obtention of the splitted V at t+ deltat -CALL TRIDIAG_WIND(KKA,KKU,KKL,PVM,ZA,ZCOEFS(:,:,1),PTSTEP,PEXPL,PIMPL, & - MYM(PRHODJ),ZSOURCE,ZRES) -! -! Compute the equivalent tendency for the V wind component -! -PRVS(:,:,:)=PRVS(:,:,:)+MYM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PVM(:,:,:))/PTSTEP -! -! -!* 6.2 Complete 1D dynamic Production -! -! vertical flux of the V wind component -! -ZFLXZ(:,:,:) = -ZCMFS * MYM(ZKEFF) * & - DZM(PIMPL*ZRES + PEXPL*PVM, KKA, KKU, KKL) / MYM(PDZZ) -! -ZFLXZ(:,:,IKB:IKB) = MYM(PDZZ(:,:,IKB:IKB)) * & - ( ZSOURCE(:,:,IKB:IKB) & - +ZCOEFS(:,:,1:1) * ZRES(:,:,IKB:IKB) * PIMPL & - ) / 0.5 / ( 1. + MYM(PRHODJ(:,:,KKA:KKA)) / MYM(PRHODJ(:,:,IKB:IKB)) ) -! -! -ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) -! -IF ( OTURB_FLX .AND. OCLOSE_OUT ) THEN - ! stores the V wind component vertical flux - YRECFM ='VW_VFLX' - YCOMMENT='X_Y_Z_VW_VFLX (M**2/S**2)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZFLXZ,IGRID,ILENCH,YCOMMENT,IRESP) -END IF -! -! second part of total momentum flux -! -PWV(:,:,:) = ZFLXZ(:,:,:) -! -! Contribution to the dynamic production of TKE -! compute the dynamic production contribution at the mass point -! -ZA(:,:,:) = - MZF(MYF(ZFLXZ * GZ_V_VW(PVM,PDZZ, KKA, KKU, KKL)), KKA, KKU, KKL) -! -! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) -ZA(:,:,IKB:IKB) = & - - MYF ( & -ZFLXZ(:,:,IKB+KKL:IKB+KKL) * (PVM(:,:,IKB+KKL:IKB+KKL)-PVM(:,:,IKB:IKB)) & - / MYM(PDZZ(:,:,IKB+KKL:IKB+KKL)) & - ) -! -PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:) -! -! Storage in the LES configuration -! -IF (LLES_CALL) THEN - CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID(MZF(MYF(ZFLXZ), KKA, KKU, KKL), X_LES_SUBGRID_WV ) - CALL LES_MEAN_SUBGRID(MZF(MYF(GZ_V_VW(PVM,PDZZ, KKA, KKU, KKL)*& - & ZFLXZ), KKA, KKU, KKL), X_LES_RES_ddxa_V_SBG_UaV ) - CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 -END IF -! -! -!* 6.3 Source of W wind component -! -IF(HTURBDIM=='3DIM') THEN - ! Compute the source for the W wind component - ZFLXZ(:,:,KKA) = 2 * ZFLXZ(:,:,IKB) - ZFLXZ(:,:,IKB+KKL) ! extrapolation - ! - IF (.NOT. L2D) THEN - IF (.NOT. LFLAT) THEN - PRWS(:,:,:)= PRWS(:,:,:) & - -DYF( MZM(MYM(PRHODJ) /PDYY, KKA, KKU, KKL) * ZFLXZ ) & - +DZM(PRHODJ / MZF(PDZZ, KKA, KKU, KKL) * & - MYF(MZF(ZFLXZ*PDZY, KKA, KKU, KKL) / PDYY ), & - KKA, KKU, KKL) - ELSE - PRWS(:,:,:)= PRWS(:,:,:) -DYF(MZM(MYM(PRHODJ) /PDYY, KKA, KKU, KKL) * ZFLXZ ) - END IF - END IF - ! - ! Complete the Dynamical production with the W wind component - IF (.NOT. L2D) THEN - ZA(:,:,:) = - MZF(MYF(ZFLXZ * GY_W_VW(PWM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)), KKA, KKU, KKL) - ! - ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) - ZA(:,:,IKB:IKB) = - MYF ( & - ZFLXZ(:,:,IKB+KKL:IKB+KKL) * & - ( DYM( PWM(:,:,IKB+KKL:IKB+KKL) ) & - -MYM( (PWM(:,:,IKB+2*KKL:IKB+2*KKL)-PWM(:,:,IKB+KKL:IKB+KKL)) & - /(PDZZ(:,:,IKB+2*KKL:IKB+2*KKL)+PDZZ(:,:,IKB+KKL:IKB+KKL)) & - +(PWM(:,:,IKB+KKL:IKB+KKL)-PWM(:,:,IKB:IKB )) & - /(PDZZ(:,:,IKB+KKL:IKB+KKL)+PDZZ(:,:,IKB:IKB )) & - ) & - * PDZY(:,:,IKB+KKL:IKB+KKL) & - ) / (0.5*(PDYY(:,:,IKB+KKL:IKB+KKL)+PDYY(:,:,IKB:IKB))) & - ) - ! - PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:) - ! - END IF - ! - ! Storage in the LES configuration - ! - IF (LLES_CALL) THEN - CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID(MZF(MYF(GY_W_VW(PWM,PDYY,& - &PDZZ,PDZY, KKA, KKU, KKL)*ZFLXZ), KKA, KKU, KKL), & - &X_LES_RES_ddxa_W_SBG_UaW , .TRUE. ) - CALL LES_MEAN_SUBGRID(MYF(GY_M_V(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)*& - &MZF(ZFLXZ, KKA, KKU, KKL)), & - &X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE. ) - IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID(MYF(GY_V_M(PRM(:,:,:,1),PDYY,PDZZ,& - &PDZY, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL)),& - &X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE. ) - END IF - CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 - END IF - ! -END IF -! -! complete the dynamic production at the marginal points -IF (CPROGRAM/='AROME ') THEN - PDP(:,:,KKA)= -999. - PDP(:,:,KKU)= -999. - PDP(:,1,:)= PDP(:,IJE,:) - PDP(:,IJE+1,:)= PDP(:,IJB,:) - PDP(1,:,:)= PDP(IIE,:,:) - PDP(IIE+1,:,:)= PDP(IIB,:,:) -END IF -! -!---------------------------------------------------------------------------- -! -!* 7. DIAGNOSTIC COMPUTATION OF THE 1D <W W> VARIANCE -! ----------------------------------------------- -! -IF ( OTURB_FLX .AND. OCLOSE_OUT .AND. HTURBDIM == '1DIM') THEN - ZFLXZ(:,:,:)= (2./3.) * PTKEM(:,:,:) & - -ZCMFS*PLM(:,:,:)*SQRT(PTKEM(:,:,:))*GZ_W_M(PWM,PDZZ, KKA, KKU, KKL) - ! to be tested & - ! +XCMFB*(4./3.)*PLM(:,:,:)/SQRT(PTKEM(:,:,:))*PTP(:,:,:) - ! stores the W variance - YRECFM ='W_VVAR' - YCOMMENT='X_Y_Z_W_VVAR (M**2/S**2)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZFLXZ,IGRID,ILENCH,YCOMMENT,IRESP) -END IF -! -!---------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('TURB_VER_DYN_FLUX',1,ZHOOK_HANDLE) -END SUBROUTINE TURB_VER_DYN_FLUX diff --git a/src/arome/turb/turb_ver_thermo_flux.F90 b/src/arome/turb/turb_ver_thermo_flux.F90 deleted file mode 100644 index d377e2c9d3de1ec857dfe3167d1e89c218d3c6c6..0000000000000000000000000000000000000000 --- a/src/arome/turb/turb_ver_thermo_flux.F90 +++ /dev/null @@ -1,788 +0,0 @@ -! ######spl - SUBROUTINE TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OCLOSE_OUT,OTURB_FLX,HTURBDIM,HTOM, & - PIMPL,PEXPL, & - PTSTEP, & - HFMFILE,HLUOUT, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & - PRHODJ,PTHVREF, & - PSFTHM,PSFRM,PSFTHP,PSFRP, & - PWM,PTHLM,PRM,PSVM, & - PTKEM,PLM,PLEPS, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & - PBETA, PSQRT_TKE, PDTH_DZ, PDR_DZ, PRED2TH3, & - PRED2R3, PRED2THR3, PBLL_O_E, PETHETA, & - PEMOIST, PREDTH1, PREDR1, PPHI3, PPSI3, PD, & - PFWTH,PFWR,PFTH2,PFR2,PFTHR,MFMOIST,PBL_DEPTH,& - PWTHV,PRTHLS,PRRS,PTHLP,PRP,PTP,PWTH,PWRC) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK - USE MODD_CTURB, ONLY : LHARAT -! ############################################################### -! -! -!!**** *TURB_VER_THERMO_FLUX* -compute the source terms due to the vertical turbulent -!! fluxes. -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute the vertical turbulent -! fluxes of the evolutive variables and give back the source -! terms to the main program. In the case of large horizontal meshes, -! the divergence of these vertical turbulent fluxes represent the whole -! effect of the turbulence but when the three-dimensionnal version of -! the turbulence scheme is activated (CTURBDIM="3DIM"), these divergences -! are completed in the next routine TURB_HOR. -! An arbitrary degree of implicitness has been implemented for the -! temporal treatment of these diffusion terms. -! The vertical boundary conditions are as follows: -! * at the bottom, the surface fluxes are prescribed at the same -! as the other turbulent fluxes -! * at the top, the turbulent fluxes are set to 0. -! It should be noted that the condensation has been implicitely included -! in this turbulence scheme by using conservative variables and computing -! the subgrid variance of a statistical variable s indicating the presence -! or not of condensation in a given mesh. -! -!!** METHOD -!! ------ -!! 1D type calculations are made; -!! The vertical turbulent fluxes are computed in an off-centered -!! implicit scheme (a Crank-Nicholson type with coefficients different -!! than 0.5), which allows to vary the degree of implicitness of the -!! formulation. -!! The different prognostic variables are treated one by one. -!! The contributions of each turbulent fluxes are cumulated into the -!! tendency PRvarS, and into the dynamic and thermal production of -!! TKE if necessary. -!! -!! In section 2 and 3, the thermodynamical fields are considered. -!! Only the turbulent fluxes of the conservative variables -!! (Thetal and Rnp stored in PRx(:,:,:,1)) are computed. -!! Note that the turbulent fluxes at the vertical -!! boundaries are given either by the soil scheme for the surface one -!! ( at the same instant as the others fluxes) and equal to 0 at the -!! top of the model. The thermal production is computed by vertically -!! averaging the turbulent flux and multiply this flux at the mass point by -!! a function ETHETA or EMOIST, which preform the transformation from the -!! conservative variables to the virtual potential temperature. -!! -!! In section 4, the variance of the statistical variable -!! s indicating presence or not of condensation, is determined in function -!! of the turbulent moments of the conservative variables and its -!! squarred root is stored in PSIGS. This information will be completed in -!! the horizontal turbulence if the turbulence dimensionality is not -!! equal to "1DIM". -!! -!! In section 5, the x component of the stress tensor is computed. -!! The surface flux <u'w'> is computed from the value of the surface -!! fluxes computed in axes linked to the orography ( i", j" , k"): -!! i" is parallel to the surface and in the direction of the maximum -!! slope -!! j" is also parallel to the surface and in the normal direction of -!! the maximum slope -!! k" is the normal to the surface -!! In order to prevent numerical instability, the implicit scheme has -!! been extended to the surface flux regarding to its dependence in -!! function of U. The dependence in function of the other components -!! introduced by the different rotations is only explicit. -!! The turbulent fluxes are used to compute the dynamic production of -!! TKE. For the last TKE level ( located at PDZZ(:,:,IKB)/2 from the -!! ground), an harmonic extrapolation from the dynamic production at -!! PDZZ(:,:,IKB) is used to avoid an evaluation of the gradient of U -!! in the surface layer. -!! -!! In section 6, the same steps are repeated but for the y direction -!! and in section 7, a diagnostic computation of the W variance is -!! performed. -!! -!! In section 8, the turbulent fluxes for the scalar variables are -!! computed by the same way as the conservative thermodynamical variables -!! -!! -!! EXTERNAL -!! -------- -!! GX_U_M, GY_V_M, GZ_W_M : cartesian gradient operators -!! GX_U_UW,GY_V_VW (X,Y,Z) represent the direction of the gradient -!! _(M,U,...)_ represent the localization of the -!! field to be derivated -!! _(M,UW,...) represent the localization of the -!! field derivated -!! -!! -!! MXM,MXF,MYM,MYF,MZM,MZF -!! : Shuman functions (mean operators) -!! DXF,DYF,DZF,DZM -!! : Shuman functions (difference operators) -!! -!! SUBROUTINE TRIDIAG : to compute the splitted implicit evolution -!! of a variable located at a mass point -!! -!! SUBROUTINE TRIDIAG_WIND: to compute the splitted implicit evolution -!! of a variable located at a wind point -!! -!! FUNCTIONs ETHETA and EMOIST : -!! allows to compute: -!! - the coefficients for the turbulent correlation between -!! any variable and the virtual potential temperature, of its -!! correlations with the conservative potential temperature and -!! the humidity conservative variable: -!! ------- ------- ------- -!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : contains physical constants -!! -!! XG : gravity constant -!! -!! Module MODD_CTURB: contains the set of constants for -!! the turbulence scheme -!! -!! XCMFS,XCMFB : cts for the momentum flux -!! XCSHF : ct for the sensible heat flux -!! XCHF : ct for the moisture flux -!! XCTV,XCHV : cts for the T and moisture variances -!! -!! Module MODD_PARAMETERS -!! -!! JPVEXT_TURB : number of vertical external points -!! JPHEXT : number of horizontal external points -!! -!! -!! REFERENCE -!! --------- -!! Book 1 of documentation (Chapter: Turbulence) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart * INM and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original August 19, 1994 -!! Modifications: February 14, 1995 (J.Cuxart and J.Stein) -!! Doctorization and Optimization -!! Modifications: March 21, 1995 (J.M. Carriere) -!! Introduction of cloud water -!! Modifications: June 14, 1995 (J.Cuxart and J. Stein) -!! Phi3 and Psi3 at w-point + bug in the all -!! or nothing condens. -!! Modifications: Sept 15, 1995 (J.Cuxart and J. Stein) -!! Change the DP computation at the ground -!! Modifications: October 10, 1995 (J.Cuxart and J. Stein) -!! Psi for scal var and LES tools -!! Modifications: November 10, 1995 (J. Stein) -!! change the surface relations -!! Modifications: February 20, 1995 (J. Stein) optimization -!! Modifications: May 21, 1996 (J. Stein) -!! bug in the vertical flux of the V wind -!! component for explicit computation -!! Modifications: May 21, 1996 (N. wood) -!! modify the computation of the vertical -!! part or the surface tangential flux -!! Modifications: May 21, 1996 (P. Jabouille) -!! same modification in the Y direction -!! -!! Modifications: Sept 17, 1996 (J. Stein) change the moist case by using -!! Pi instead of Piref + use Atheta and Amoist -!! -!! Modifications: Nov 24, 1997 (V. Masson) removes the DO loops -!! Modifications: Mar 31, 1998 (V. Masson) splits the routine TURB_VER_THERMO_FLUX -!! Modifications: Oct 18, 2000 (V. Masson) LES computations -!! Modifications: Dec 01, 2000 (V. Masson) conservation of energy from -!! surface flux in 1DIM case -!! when slopes are present -!! Nov 06, 2002 (V. Masson) LES budgets -!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE -!! May 20, 2003 (JP Pinty) Correction of ETHETA -!! and EMOIST calls -!! July 2005 (S. Tomas, V. Masson) -!! Add 3rd order moments -!! and implicitation of PHI3 and PSI3 -!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after -!! change of YCOMMENT -!! 2012-02 (Y. Seity) add possibility to run with reversed -!! vertical levels -!! Modifications July 2015 (Wim de Rooy) LHARAT switch -!!-------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_CTURB -USE MODD_PARAMETERS -USE MODD_CONF -USE MODD_LES -! -USE MODI_GRADIENT_U -USE MODI_GRADIENT_V -USE MODI_GRADIENT_W -USE MODI_GRADIENT_M -USE MODI_SHUMAN , ONLY : DZF, DZM, MZF, MZM -USE MODI_TRIDIAG -USE MODE_FMWRIT -USE MODI_LES_MEAN_SUBGRID -USE MODI_PRANDTL -USE MODI_TRIDIAG_THERMO -USE MODI_TM06_H -! -USE MODE_PRANDTL -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -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. -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -CHARACTER*4, INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -CHARACTER*4, INTENT(IN) :: HTOM ! type of Third Order Moment -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -REAL, INTENT(IN) :: PTSTEP ! Double Time Step -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitudes -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(:,:,:), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual - ! Potential Temperature -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time -! ! t - deltat -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time -! ! t + deltat -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM -! Vertical wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM -! potential temperature at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios - ! at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Mixing ratios -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -! -! In case LHARAT=TRUE, PLM already includes all stability corrections -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized -! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA ! buoyancy coefficient -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE ! sqrt(e) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTH_DZ ! d(th)/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDR_DZ ! d(rt)/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 ! 3D Redeslperger number R*2_th -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 ! 3D Redeslperger number R*2_r -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 ! 3D Redeslperger number R*2_thr -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E ! beta * Lk * Leps / tke -REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA ! Coefficient for theta in theta_v computation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST ! Coefficient for r in theta_v computation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 ! 1D Redelsperger number for Th -REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 ! 1D Redelsperger number for r -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Prandtl number for temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Prandtl number for vapor -REAL, DIMENSION(:,:,:), INTENT(IN) :: PD ! Denominator in Prandtl numbers -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz (at flux point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz (at flux point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz (at mass point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz (at mass point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at mass point) -REAL, DIMENSION(:,:), INTENT(INOUT):: PBL_DEPTH ! BL depth -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTHV ! buoyancy flux -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHLS ! cumulated source for theta -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS ! cumulated source for rt -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHLP ! guess of thl at t+ deltat -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRP ! guess of r at t+ deltat -! -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PTP ! Dynamic and thermal - ! TKE production terms -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux -! -! -!* 0.2 declaration of local variables -! -! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & - ZA, & ! work variable for wrc or LES computation - ZFLXZ, & ! vertical flux of the treated variable - ZSOURCE, & ! source of evolution for the treated variable - ZKEFF, & ! effectif diffusion coeff = LT * SQRT( TKE ) - ZF, & ! Flux in dTh/dt =-dF/dz (evaluated at t-1)(or rt instead of Th) - ZDFDDTDZ, & ! dF/d(dTh/dz) - ZDFDDRDZ, & ! dF/d(dr/dz) - Z3RDMOMENT ! 3 order term in flux or variance equation -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: IGRID ! C-grid indicator in LFIFM file -INTEGER :: ILENCH ! Length of comment string in LFIFM file -INTEGER :: IKB,IKE ! I index values for the Beginning and End - ! mass points of the domain in the 3 direct. -INTEGER :: IKT ! array size in k direction -INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain -CHARACTER (LEN=100) :: YCOMMENT ! comment string in LFIFM file -CHARACTER (LEN=16) :: YRECFM ! Name of the desired field in LFIFM file -! -REAL :: ZTIME1, ZTIME2 -! -INTEGER :: JK -LOGICAL :: GUSERV ! flag to use water -LOGICAL :: GFTH2 ! flag to use w'th'2 -LOGICAL :: GFWTH ! flag to use w'2th' -LOGICAL :: GFR2 ! flag to use w'r'2 -LOGICAL :: GFWR ! flag to use w'2r' -LOGICAL :: GFTHR ! flag to use w'th'r' -!---------------------------------------------------------------------------- -! -!* 1. PRELIMINARIES -! ------------- -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('TURB_VER_THERMO_FLUX',0,ZHOOK_HANDLE) -IKT =SIZE(PTHLM,3) -IKTE =IKT-JPVEXT_TURB -IKTB =1+JPVEXT_TURB -IKB=KKA+JPVEXT_TURB*KKL -IKE=KKU-JPVEXT_TURB*KKL -! -GUSERV = (KRR/=0) -! -! compute the coefficients for the uncentred gradient computation near the -! ground -! -IF (LHARAT) THEN -! LHARAT so TKE and length scales at half levels! -ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) +50.*MFMOIST(:,:,:) -ELSE -ZKEFF(:,:,:) = MZM(PLM(:,:,:) * SQRT(PTKEM(:,:,:)), KKA, KKU, KKL) -ENDIF -! -! -! Flags for 3rd order quantities -! -GFTH2 = .FALSE. -GFR2 = .FALSE. -GFTHR = .FALSE. -GFWTH = .FALSE. -GFWR = .FALSE. -! -IF (HTOM/='NONE') THEN - GFTH2 = ANY(PFTH2/=0.) - GFR2 = ANY(PFR2 /=0.) .AND. GUSERV - GFTHR = ANY(PFTHR/=0.) .AND. GUSERV - GFWTH = ANY(PFWTH/=0.) - GFWR = ANY(PFWR /=0.) .AND. GUSERV -END IF -!---------------------------------------------------------------------------- -! -!* 2. SOURCES OF CONSERVATIVE POTENTIAL TEMPERATURE AND -! PARTIAL THERMAL PRODUCTION -! --------------------------------------------------------------- -! -!* 2.1 Splitted value for cons. potential temperature at t+deltat -! -! Compute the turbulent flux F and F' at time t-dt. -! -IF (LHARAT) THEN -ZF (:,:,:) = -ZKEFF*DZM(PTHLM, KKA, KKU, KKL)/PDZZ -ZDFDDTDZ(:,:,:) = -ZKEFF -ELSE -ZF (:,:,:) = -XCSHF*PPHI3*ZKEFF*DZM(PTHLM, KKA, KKU, KKL)/PDZZ -ZDFDDTDZ(:,:,:) = -XCSHF*ZKEFF*D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) -ENDIF -! -! Effect of 3rd order terms in temperature flux (at flux point) -! -! d(w'2th')/dz -IF (GFWTH) THEN - Z3RDMOMENT= M3_WTH_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,ZKEFF,PTKEM) -! - ZF = ZF + Z3RDMOMENT * PFWTH - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& - & PD,PBLL_O_E,PETHETA,ZKEFF,PTKEM) * PFWTH -END IF -! -! d(w'th'2)/dz -IF (GFTH2) THEN - Z3RDMOMENT= M3_WTH_WTH2(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) -! - ZF = ZF + Z3RDMOMENT * MZM(PFTH2, KKA, KKU, KKL) - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WTH2_O_DDTDZ(Z3RDMOMENT,PREDTH1,PREDR1,& - & PD,PBLL_O_E,PETHETA) * MZM(PFTH2, KKA, KKU, KKL) -END IF -! -! d(w'2r')/dz -IF (GFWR) THEN - ZF = ZF + M3_WTH_W2R(KKA,KKU,KKL,PREDTH1,PREDR1,PD,ZKEFF,& - & PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ) * PFWR - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& - & PD,ZKEFF,PTKEM,PBLL_O_E,PEMOIST) * PFWR -END IF -! -! d(w'r'2)/dz -IF (GFR2) THEN - ZF = ZF + M3_WTH_WR2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,ZKEFF,PTKEM,& - & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTH_DZ) * MZM(PFR2, KKA, KKU, KKL) - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,& - & ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) * MZM(PFR2, KKA, KKU, KKL) -END IF -! -! d(w'th'r')/dz -IF (GFTHR) THEN - Z3RDMOMENT= M3_WTH_WTHR(KKA,KKU,KKL,PREDR1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& - & PLEPS,PEMOIST) -! - ZF = ZF + Z3RDMOMENT * MZM(PFTHR, KKA, KKU, KKL) - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WTHR_O_DDTDZ(Z3RDMOMENT,PREDTH1,& - & PREDR1,PD,PBLL_O_E,PETHETA) * MZM(PFTHR, KKA, KKU, KKL) -END IF -! -!* in 3DIM case, a part of the flux goes vertically, and another goes horizontally -! (in presence of slopes) -!* in 1DIM case, the part of energy released in horizontal flux -! is taken into account in the vertical part -! -IF (HTURBDIM=='3DIM') THEN - ZF(:,:,IKB) = ( PIMPL*PSFTHP(:,:) + PEXPL*PSFTHM(:,:) ) & - * PDIRCOSZW(:,:) & - * 0.5 * (1. + PRHODJ(:,:,KKA) / PRHODJ(:,:,IKB)) -ELSE - ZF(:,:,IKB) = ( PIMPL*PSFTHP(:,:) + PEXPL*PSFTHM(:,:) ) & - / PDIRCOSZW(:,:) & - * 0.5 * (1. + PRHODJ(:,:,KKA) / PRHODJ(:,:,IKB)) -END IF -! -! Compute the splitted conservative potential temperature at t+deltat -CALL TRIDIAG_THERMO(KKA,KKU,KKL,PTHLM,ZF,ZDFDDTDZ,PTSTEP,PIMPL,PDZZ,& - PRHODJ,PTHLP) -! -! Compute the equivalent tendency for the conservative potential temperature -PRTHLS(:,:,:)= PRTHLS(:,:,:) + & - PRHODJ(:,:,:)*(PTHLP(:,:,:)-PTHLM(:,:,:))/PTSTEP -! -!* 2.2 Partial Thermal Production -! -! Conservative potential temperature flux : -! -ZFLXZ(:,:,:) = ZF & - + PIMPL * ZDFDDTDZ * DZM(PTHLP - PTHLM, KKA, KKU, KKL) / PDZZ -! -ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) -! - DO JK=IKTB+1,IKTE-1 - PWTH(:,:,JK)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL)) - END DO - PWTH(:,:,IKB)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) - PWTH(:,:,KKA)=0.5*(ZFLXZ(:,:,KKA)+ZFLXZ(:,:,KKA+KKL)) - PWTH(:,:,IKE)=PWTH(:,:,IKE-KKL) - -IF ( OTURB_FLX .AND. OCLOSE_OUT ) THEN - ! stores the conservative potential temperature vertical flux - YRECFM ='THW_FLX' - YCOMMENT='X_Y_Z_THW_FLX (K*M/S)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZFLXZ,IGRID,ILENCH,YCOMMENT,IRESP) -END IF -! -! Contribution of the conservative temperature flux to the buoyancy flux -IF (KRR /= 0) THEN - PTP(:,:,:) = PBETA * MZF(MZM(PETHETA, KKA, KKU, KKL) * ZFLXZ, KKA, KKU, KKL) - PTP(:,:,IKB)= PBETA(:,:,IKB) * PETHETA(:,:,IKB) * & - 0.5 * ( ZFLXZ (:,:,IKB) + ZFLXZ (:,:,IKB+KKL) ) -ELSE - PTP(:,:,:)= PBETA * MZF(ZFLXZ, KKA, KKU, KKL) -END IF -! -! Buoyancy flux at flux points -! -PWTHV = MZM(PETHETA, KKA, KKU, KKL) * ZFLXZ -PWTHV(:,:,IKB) = PETHETA(:,:,IKB) * ZFLXZ(:,:,IKB) -! -!* 2.3 Partial vertical divergence of the < Rc w > flux -! Correction for qc and qi negative in AROME -!IF ( KRRL >= 1 ) THEN -! IF ( KRRI >= 1 ) THEN -! PRRS(:,:,:,2) = PRRS(:,:,:,2) - & -! DZF(MZM(PRHODJ*PATHETA*2.*PSRCM, KKA, KKU, KKL)*ZFLXZ/PDZZ, KKA, KKU, KKL) & -! *(1.0-PFRAC_ICE(:,:,:)) -! PRRS(:,:,:,4) = PRRS(:,:,:,4) - & -! DZF(MZM(PRHODJ*PATHETA*2.*PSRCM, KKA, KKU, KKL)*ZFLXZ/PDZZ, KKA, KKU, KKL) & -! *PFRAC_ICE(:,:,:) -! ELSE -! PRRS(:,:,:,2) = PRRS(:,:,:,2) - & -! DZF(MZM(PRHODJ*PATHETA*2.*PSRCM, KKA, KKU, KKL)*ZFLXZ/PDZZ, KKA, KKU, KKL) -! END IF -!END IF -! -!* 2.4 Storage in LES configuration -! -IF (LLES_CALL) THEN - CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID(MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WThl ) - CALL LES_MEAN_SUBGRID(MZF(PWM*ZFLXZ, KKA, KKU, KKL), X_LES_RES_W_SBG_WThl ) - CALL LES_MEAN_SUBGRID(GZ_W_M(PWM,PDZZ, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL),& - & X_LES_RES_ddxa_W_SBG_UaThl ) - CALL LES_MEAN_SUBGRID(MZF(PDTH_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Thl_SBG_UaThl ) - CALL LES_MEAN_SUBGRID(-XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_ThlPz ) - CALL LES_MEAN_SUBGRID(MZF(MZM(PETHETA, KKA, KKU, KKL)*ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WThv ) - IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID(MZF(PDR_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Rt_SBG_UaThl ) - END IF - !* diagnostic of mixing coefficient for heat - ZA = DZM(PTHLP, KKA, KKU, KKL) - WHERE (ZA==0.) ZA=1.E-6 - ZA = - ZFLXZ / ZA * PDZZ - ZA(:,:,IKB) = XCSHF*PPHI3(:,:,IKB)*ZKEFF(:,:,IKB) - ZA = MZF(ZA, KKA, KKU, KKL) - ZA = MIN(MAX(ZA,-1000.),1000.) - CALL LES_MEAN_SUBGRID( ZA, X_LES_SUBGRID_Kh ) - ! - CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 -END IF -! -!* 2.5 New boundary layer depth for TOMs -! -IF (HTOM=='TM06') CALL TM06_H(IKB,IKTB,IKTE,PTSTEP,PZZ,ZFLXZ,PBL_DEPTH) -! -!---------------------------------------------------------------------------- -! -! -!* 3. SOURCES OF CONSERVATIVE AND CLOUD MIXING RATIO AND -! COMPLETE THERMAL PRODUCTION -! ------------------------------------------------------ -! -!* 3.1 Splitted value for cons. mixing ratio at t+deltat -! -! -IF (KRR /= 0) THEN - ! Compute the turbulent flux F and F' at time t-dt. - ! - IF (LHARAT) THEN - ZF (:,:,:) = -ZKEFF*DZM(PRM(:,:,:,1), KKA, KKU, KKL)/PDZZ - ZDFDDRDZ(:,:,:) = -ZKEFF - ELSE - ZF (:,:,:) = -XCSHF*PPSI3*ZKEFF*DZM(PRM(:,:,:,1), KKA, KKU, KKL)/PDZZ - ZDFDDRDZ(:,:,:) = -XCSHF*ZKEFF*D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) - ENDIF - ! - ! Effect of 3rd order terms in temperature flux (at flux point) - ! - ! d(w'2r')/dz - IF (GFWR) THEN - Z3RDMOMENT= M3_WR_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,ZKEFF,PTKEM) - ! - ZF = ZF + Z3RDMOMENT * PFWR - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& - & PBLL_O_E,PEMOIST,ZKEFF,PTKEM) * PFWR - END IF - ! - ! d(w'r'2)/dz - IF (GFR2) THEN - Z3RDMOMENT= M3_WR_WR2(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) - ! - ZF = ZF + Z3RDMOMENT * MZM(PFR2, KKA, KKU, KKL) - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WR2_O_DDRDZ(Z3RDMOMENT,PREDR1,& - & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(PFR2, KKA, KKU, KKL) - END IF - ! - ! d(w'2th')/dz - IF (GFWTH) THEN - ZF = ZF + M3_WR_W2TH(KKA,KKU,KKL,PREDR1,PREDTH1,PD,ZKEFF,& - & PTKEM,PBLL_O_E,PETHETA,PDR_DZ) * PFWTH - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& - & PD,ZKEFF,PTKEM,PBLL_O_E,PETHETA) * PFWTH - END IF - ! - ! d(w'th'2)/dz - IF (GFTH2) THEN - ZF = ZF + M3_WR_WTH2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,ZKEFF,PTKEM,& - & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDR_DZ) * MZM(PFTH2, KKA, KKU, KKL) - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& - &ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) * MZM(PFTH2, KKA, KKU, KKL) - END IF - ! - ! d(w'th'r')/dz - IF (GFTHR) THEN - Z3RDMOMENT= M3_WR_WTHR(KKA,KKU,KKL,PREDTH1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& - & PLEPS,PETHETA) - ! - ZF = ZF + Z3RDMOMENT * MZM(PFTHR, KKA, KKU, KKL) - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTHR_O_DDRDZ(KKA,KKU,KKL,Z3RDMOMENT,PREDR1, & - & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(PFTHR, KKA, KKU, KKL) - END IF - ! - !* in 3DIM case, a part of the flux goes vertically, and another goes horizontally - ! (in presence of slopes) - !* in 1DIM case, the part of energy released in horizontal flux - ! is taken into account in the vertical part - ! - IF (HTURBDIM=='3DIM') THEN - ZF(:,:,IKB) = ( PIMPL*PSFRP(:,:) + PEXPL*PSFRM(:,:) ) & - * PDIRCOSZW(:,:) & - * 0.5 * (1. + PRHODJ(:,:,KKA) / PRHODJ(:,:,IKB)) - ELSE - ZF(:,:,IKB) = ( PIMPL*PSFRP(:,:) + PEXPL*PSFRM(:,:) ) & - / PDIRCOSZW(:,:) & - * 0.5 * (1. + PRHODJ(:,:,KKA) / PRHODJ(:,:,IKB)) - END IF - ! - ! Compute the splitted conservative potential temperature at t+deltat - CALL TRIDIAG_THERMO(KKA,KKU,KKL,PRM(:,:,:,1),ZF,ZDFDDRDZ,PTSTEP,PIMPL,& - PDZZ,PRHODJ,PRP) - ! - ! Compute the equivalent tendency for the conservative mixing ratio - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRHODJ(:,:,:) * & - (PRP(:,:,:)-PRM(:,:,:,1))/PTSTEP - ! - !* 3.2 Complete thermal production - ! - ! cons. mixing ratio flux : - ! - ZFLXZ(:,:,:) = ZF & - + PIMPL * ZDFDDRDZ * DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ - ! - ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) - ! - DO JK=IKTB+1,IKTE-1 - PWRC(:,:,JK)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL)) - END DO - PWRC(:,:,IKB)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) - PWRC(:,:,KKA)=0.5*(ZFLXZ(:,:,KKA)+ZFLXZ(:,:,KKA+KKL)) - PWRC(:,:,IKE)=PWRC(:,:,IKE-KKL) - ! - ! - IF ( OTURB_FLX .AND. OCLOSE_OUT ) THEN - ! stores the conservative mixing ratio vertical flux - YRECFM ='RCONSW_FLX' - YCOMMENT='X_Y_Z_RCONSW_FLX (KG*M/S/KG)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZFLXZ,IGRID,ILENCH,YCOMMENT,IRESP) - END IF - ! - ! Contribution of the conservative water flux to the Buoyancy flux - ZA(:,:,:) = PBETA * MZF(MZM(PEMOIST, KKA, KKU, KKL) * ZFLXZ, KKA, KKU, KKL) - ZA(:,:,IKB) = PBETA(:,:,IKB) * PEMOIST(:,:,IKB) * & - 0.5 * ( ZFLXZ (:,:,IKB) + ZFLXZ (:,:,IKB+KKL) ) - PTP(:,:,:) = PTP(:,:,:) + ZA(:,:,:) - ! - ! Buoyancy flux at flux points - ! - PWTHV = PWTHV + MZM(PEMOIST, KKA, KKU, KKL) * ZFLXZ - PWTHV(:,:,IKB) = PWTHV(:,:,IKB) + PEMOIST(:,:,IKB) * ZFLXZ(:,:,IKB) -! -!* 3.3 Complete vertical divergence of the < Rc w > flux -! Correction of qc and qi negative for AROME -! IF ( KRRL >= 1 ) THEN -! IF ( KRRI >= 1 ) THEN -! PRRS(:,:,:,2) = PRRS(:,:,:,2) - & -! DZF(MZM(PRHODJ*PAMOIST*2.*PSRCM, KKA, KKU, KKL)*ZFLXZ/PDZZ, KKA, KKU, KKL) & -! *(1.0-PFRAC_ICE(:,:,:)) -! PRRS(:,:,:,4) = PRRS(:,:,:,4) - & -! DZF(MZM(PRHODJ*PAMOIST*2.*PSRCM, KKA, KKU, KKL)*ZFLXZ/PDZZ, KKA, KKU, KKL) & -! *PFRAC_ICE(:,:,:) -! ELSE -! PRRS(:,:,:,2) = PRRS(:,:,:,2) - & -! DZF(MZM(PRHODJ*PAMOIST*2.*PSRCM, KKA, KKU, KKL)*ZFLXZ/PDZZ, KKA, KKU, KKL) -! END IF -! END IF -! -!* 3.4 Storage in LES configuration -! - IF (LLES_CALL) THEN - CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID(MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WRt ) - CALL LES_MEAN_SUBGRID(MZF(PWM*ZFLXZ, KKA, KKU, KKL), X_LES_RES_W_SBG_WRt ) - CALL LES_MEAN_SUBGRID(GZ_W_M(PWM,PDZZ, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL),& - & X_LES_RES_ddxa_W_SBG_UaRt ) - CALL LES_MEAN_SUBGRID(MZF(PDTH_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Thl_SBG_UaRt ) - CALL LES_MEAN_SUBGRID(MZF(PDR_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Rt_SBG_UaRt ) - CALL LES_MEAN_SUBGRID(MZF(MZM(PEMOIST, KKA, KKU, KKL)*ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WThv , .TRUE. ) - CALL LES_MEAN_SUBGRID(-XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_RtPz ) - CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 - END IF -! -END IF -! -!---------------------------------------------------------------------------- -! -! -!* 4. TURBULENT CORRELATIONS : <w Rc> -! ------------------------------- -! -! -!* 4.1 <w Rc> -! -IF ( ((OTURB_FLX .AND. OCLOSE_OUT) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN -! -! recover the Conservative potential temperature flux : -! With LHARAT is true tke and length scales at half levels -! yet modify to use length scale and tke at half levels from vdfexcuhl - IF (LHARAT) THEN - ZA(:,:,:) = DZM(PIMPL * PTHLP + PEXPL * PTHLM, KKA, KKU, KKL) / PDZZ * & - (-PLM*PSQRT_TKE) - ELSE - ZA(:,:,:) = DZM(PIMPL * PTHLP + PEXPL * PTHLM, KKA, KKU, KKL) / PDZZ * & - (-PPHI3*MZM(PLM*PSQRT_TKE, KKA, KKU, KKL)) * XCSHF - ENDIF - ZA(:,:,IKB) = ( PIMPL*PSFTHP(:,:) + PEXPL*PSFTHM(:,:) ) & - * PDIRCOSZW(:,:) - ! - ! compute <w Rc> - ZFLXZ(:,:,:) = MZM(PAMOIST * 2.* PSRCM, KKA, KKU, KKL) * ZFLXZ(:,:,:) + & - MZM(PATHETA * 2.* PSRCM, KKA, KKU, KKL) * ZA(:,:,:) - ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) - ! - ! store the liquid water mixing ratio vertical flux - IF ( OTURB_FLX .AND. OCLOSE_OUT ) THEN - YRECFM ='RCW_FLX' - YCOMMENT='X_Y_Z_RCW_FLX (KG*M/S/KG)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZFLXZ,IGRID,ILENCH,YCOMMENT,IRESP) - END IF - ! -! and we store in LES configuration this subgrid flux <w'rc'> -! - IF (LLES_CALL) THEN - CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WRc ) - CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 - END IF -! -END IF !end of <w Rc> -! -!---------------------------------------------------------------------------- -IF (LHOOK) CALL DR_HOOK('TURB_VER_THERMO_FLUX',1,ZHOOK_HANDLE) -END SUBROUTINE TURB_VER_THERMO_FLUX diff --git a/src/common/aux/modd_blowsnow.F90 b/src/common/aux/modd_blowsnow.F90 new file mode 100644 index 0000000000000000000000000000000000000000..36180eadd60e261aa7b39b19e96edbda940c31f6 --- /dev/null +++ b/src/common/aux/modd_blowsnow.F90 @@ -0,0 +1,80 @@ +!MNH_LIC Copyright 1994-2018 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_BLOWSNOW +!! ###################### +!! +!! PURPOSE +!! ------- +!! +!! Declaration of variables and types for the blowing snow scheme +!! +!! METHOD +!! ------ +!! +!! +!! REFERENCE +!! --------- +!! Etudes du transport de la neige par le vent en conditions alpines : +!! Observations et simulations à l'aide d'un modèle couplé atmosphère/ +!! manteau neigeux (Thèse, Uni. Paris Est, 2012) +!! +!! +!! AUTHOR +!! ------ +!! Vincent Vionnet (CNRM) +!! +!! +!! MODIFICATIONS +!! ------------- +!! +!!-------------------------------------------------------------------- +!! DECLARATIONS +!! ------------ +IMPLICIT NONE + +LOGICAL :: LBLOWSNOW = .FALSE. ! switch to active pronostic blowing snow +! +INTEGER :: NBLOWSNOW3D = 2 ! Number of blowing snow variables +! as scalar in Meso-NH. The curent version of the model use two scalars: +! - Number concentration (#/kg) +! - Mass concentration (kg/kg) + +INTEGER :: NBLOWSNOW_2D = 3 ! Number of 2D blowing snow variables +! adected in Meso-NH. The curent version of the model advectes three variables: +! - total number concentration in Canopy +! - total mass concentration in Canopy +! - equivalent concentration in the saltation layer +! +REAL :: XALPHA_SNOW ! Gamma distribution shape factor +! +REAL :: XRSNOW ! Ratio between diffusion coefficient for scalar + ! variables and blowing snow variables + ! RSNOW = KSCA/KSNOW = 4. (if Redelsperger-Sommeria (1981) used in ini_cturb) + ! RSNOW = KSCA/KSNOW = 2.5 ( if Cheng-Canuto-Howard (2002) used in ini_cturb) + ! Cheng-Canuto-Howard (2002) is the default in MNH V5.3 + ! See Vionnet (PhD, 2012, In French) and Vionnet et al (TC, 2014) + ! for a complete dicsussion +CHARACTER(LEN=6),DIMENSION(:),ALLOCATABLE :: CSNOWNAMES + +CHARACTER(LEN=6),DIMENSION(2), PARAMETER :: YPSNOW_INI = & + (/'SNWM01','SNWM02'/) +! +CHARACTER(LEN=6),DIMENSION(3), PARAMETER :: YPBLOWSNOW_2D = & + (/'SNWCNU','SNWCMA','SNWCSA' /) + +CHARACTER(LEN=4) :: CSNOWSEDIM ! type of formulation for snow +! sedimentation : MITC : Mitchell (1996) +! CARR : Carrier's drag coefficient (cf PIEKTUK) +! TABC : Tabulated values from Carrier's drag coefficient +! NONE : no seidmentation +!Minimal mean radius (um) +REAL :: XINIRADIUS_SNW = 5.e-6 +!Minimum allowed number concentration (#/m3) +REAL :: XN0MIN_SNW = 1 +! +! +END MODULE MODD_BLOWSNOW diff --git a/src/arome/micro/modd_conf.F90 b/src/common/aux/modd_conf.F90 similarity index 84% rename from src/arome/micro/modd_conf.F90 rename to src/common/aux/modd_conf.F90 index ec9f4bb1f1e49901d9f41ecb2fa2cd5ebeb891c4..ea493d3a32e075aa3e9c80506a89a1c5bc4d3b01 100644 --- a/src/arome/micro/modd_conf.F90 +++ b/src/common/aux/modd_conf.F90 @@ -1,4 +1,9 @@ -! ######spl +!MNH_LIC Copyright 1994-2018 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_CONF ! ################# ! @@ -38,6 +43,10 @@ !! P. Jabouille 26/06/01 lagrangian variables !! V. Masson 09/07/01 add LNEUTRAL switch !! P. Jabouille 18/04/02 add NBUGFIX and CBIBUSER +!! C. Lac 01/04/14 add LCHECK +!! G. Tanguy 01/04/14 add LCOUPLING +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! !------------------------------------------------------------------------------- ! @@ -59,7 +68,7 @@ LOGICAL,SAVE :: LTHINSHELL ! Logical for thinshell approximation LOGICAL,SAVE :: LCARTESIAN ! Logical for cartesian geometry : ! .TRUE. = cartesian geometry ! .FALSE. = conformal projection -LOGICAL,SAVE :: L2D ! Logical for 2D model version +LOGICAL,SAVE :: L2D=.FALSE. ! Logical for 2D model version ! .TRUE. = 2D model version ! .FALSE. = 3D model version LOGICAL,SAVE :: L1D ! Logical for 1D model version @@ -91,13 +100,14 @@ CHARACTER (LEN=3),SAVE :: CEQNSYS! EQuatioN SYStem resolved by the MESONH model LOGICAL,SAVE :: LPACK ! Logical to compress 1D or 2D FM files ! ! +INTEGER,DIMENSION(3),SAVE :: NMNHVERSION ! Version of MesoNH INTEGER,SAVE :: NMASDEV ! NMASDEV=XY corresponds to the masdevX_Y INTEGER,SAVE :: NBUGFIX ! NBUGFIX=n corresponds to the BUGn of masdevX_Y CHARACTER(LEN=10),SAVE :: CBIBUSER! CBIBUSER is the name of the user binary library ! CHARACTER(LEN=6),SAVE :: CPROGRAM ! CPROGRAM is the program currently running: ! ! 'PGD ','ADVPGD','NESPGD','REAL ','IDEAL ' -! ! 'MESONH','SPAWN ','DIAG ' +! ! 'MESONH','SPAWN ','DIAG ','SPEC ' ! INTEGER,SAVE :: NHALO ! Size of the halo for parallel distribution ! @@ -111,5 +121,9 @@ LOGICAL,SAVE :: LNOMIXLG ! to use turbulence for lagrangian variables LOGICAL,SAVE :: LNEUTRAL ! True if ref. theta field is uniform ! LOGICAL,SAVE :: LCPL_AROME ! true if coupling file are issued from AROME +LOGICAL,SAVE :: LCOUPLING ! true if coupling file (and not intial file) + ! (with LCOUPLING=T in PREP_REAL_CASE) +! +LOGICAL,SAVE :: LCHECK ! To test reproducibility ! END MODULE MODD_CONF diff --git a/src/common/aux/modd_dimn.F90 b/src/common/aux/modd_dimn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..622541f68f37ad130a45ecd4169932eae50f2967 --- /dev/null +++ b/src/common/aux/modd_dimn.F90 @@ -0,0 +1,87 @@ +!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 modd 2006/05/18 13:07:25 +!----------------------------------------------------------------- +! ################## + MODULE MODD_DIM_n +! ################## +! +!!**** *MODD_DIM$n* - declaration of dimensions +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to specify the dimensions +! of the data arrays. +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (module MODD_DIMn) +!! Technical Specifications Report of the Meso-NH (chapters 2 and 3) +!! +!! AUTHOR +!! ------ +!! V. Ducrocq *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/05/94 +!! Modifications 13/08/98 (V. Ducrocq) // NIINF .. NJSUP are no more used in the init part +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY: JPMODELMAX +IMPLICIT NONE + +TYPE DIM_t + INTEGER :: NIMAX,NJMAX,NKMAX ! Dimensions respectively in x , + ! y , z directions of the physical sub-domain. + INTEGER :: NIMAX_ll,NJMAX_ll ! Dimensions respectively in x and y + ! directions of the physical domain + INTEGER :: NIINF, NISUP ! Lower bound and upper bound of the arrays + ! in x direction + INTEGER :: NJINF, NJSUP ! Lower bound and upper bound of the arrays + ! in y direction +! +END TYPE DIM_t + +TYPE(DIM_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: DIM_MODEL + +INTEGER, POINTER :: NIMAX=>NULL(),NJMAX=>NULL(),NKMAX=>NULL() +INTEGER, POINTER :: NIMAX_ll=>NULL(),NJMAX_ll=>NULL() +INTEGER, POINTER :: NIINF=>NULL(), NISUP=>NULL() +INTEGER, POINTER :: NJINF=>NULL(), NJSUP=>NULL() + +CONTAINS + +SUBROUTINE DIM_GOTO_MODEL(KFROM, KTO) +INTEGER, INTENT(IN) :: KFROM, KTO +! +! Save current state for allocated arrays +! +! Current model is set to model KTO +NIMAX=>DIM_MODEL(KTO)%NIMAX +NJMAX=>DIM_MODEL(KTO)%NJMAX +NKMAX=>DIM_MODEL(KTO)%NKMAX +NIMAX_ll=>DIM_MODEL(KTO)%NIMAX_ll +NJMAX_ll=>DIM_MODEL(KTO)%NJMAX_ll +NIINF=>DIM_MODEL(KTO)%NIINF +NISUP=>DIM_MODEL(KTO)%NISUP +NJINF=>DIM_MODEL(KTO)%NJINF +NJSUP=>DIM_MODEL(KTO)%NJSUP + +END SUBROUTINE DIM_GOTO_MODEL + +END MODULE MODD_DIM_n diff --git a/src/common/aux/modd_gridn.F90 b/src/common/aux/modd_gridn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..055d3c88f76b4634b987607db83365a12e58710f --- /dev/null +++ b/src/common/aux/modd_gridn.F90 @@ -0,0 +1,67 @@ +!MNH_LIC Copyright 1994-2018 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_GRID_n +! ################## +! +!!**** *MODD_GRID$n* - declaration of grid variables +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the variables +! describing the grid. +! +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (module MODD_GRIDn) +!! Technical Specifications Report of the Meso-NH (chapters 2 and 3) +!! +!! AUTHOR +!! ------ +!! V. Ducrocq *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/05/94 +!! J. Stein 15/11/95 add the slope angle +!! V. Ducrocq 13/08/98 // : add XLATOR_ll and XLONOR_ll +!! V. Masson nov 2004 supress XLATOR,XLONOR,XLATOR_ll,XLONOR_ll +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY: JPMODELMAX +IMPLICIT NONE + +REAL, DIMENSION(:,:), POINTER :: XLON=>NULL(),XLAT=>NULL() ! Longitude and latitude +REAL, DIMENSION(:), POINTER :: XXHAT=>NULL() ! Position x in the conformal or cartesian plane +REAL, DIMENSION(:), POINTER :: XYHAT=>NULL() ! Position y in the conformal or cartesian plane +REAL, DIMENSION(:), POINTER :: XDXHAT=>NULL() ! horizontal stretching in x +REAL, DIMENSION(:), POINTER :: XDYHAT=>NULL() ! horizontal stretching in y +REAL, DIMENSION(:,:), POINTER :: XMAP=>NULL() ! Map factor +REAL, DIMENSION(:,:), POINTER :: XZS=>NULL() ! orography +REAL, DIMENSION(:,:,:),POINTER :: XZZ=>NULL() ! height z +REAL, POINTER :: XZTOP=>NULL() ! model top (m) +REAL, DIMENSION(:), POINTER :: XZHAT=>NULL() ! height level without orography +REAL, DIMENSION(:,:), POINTER :: XDIRCOSXW=>NULL(),XDIRCOSYW=>NULL(),XDIRCOSZW=>NULL() ! director cosinus of the normal + ! to the ground surface +REAL, DIMENSION(:,:), POINTER :: XCOSSLOPE=>NULL() ! cosinus of the angle between i and the slope vector +REAL, DIMENSION(:,:), POINTER :: XSINSLOPE=>NULL() ! sinus of the angle between i and the slope vector +! Quantities for SLEVE vertical coordinate +LOGICAL, POINTER :: LSLEVE=>NULL() ! Logical for SLEVE coordinate +REAL, POINTER :: XLEN1=>NULL() ! Decay scale for smooth topography +REAL, POINTER :: XLEN2=>NULL() ! Decay scale for small-scale topography deviation +REAL, DIMENSION(:,:), POINTER :: XZSMT=>NULL() ! smooth orography for SLEVE coordinate + +END MODULE MODD_GRID_n diff --git a/src/common/aux/modd_io.F90 b/src/common/aux/modd_io.F90 index c111e469fb3d2014b7021eb698d564a94f0cf413..56ae6db2b0feebb2decd74b3d29fafaa44a9d1e0 100644 --- a/src/common/aux/modd_io.F90 +++ b/src/common/aux/modd_io.F90 @@ -1,6 +1,34 @@ MODULE MODD_IO +USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX +! IMPLICIT NONE - +! INTEGER, PARAMETER :: NVERB_NO=0, NVERB_FATAL=1, NVERB_ERROR=2, NVERB_WARNING=3, NVERB_INFO=4, NVERB_DEBUG=5 INTEGER, SAVE :: N_ABORT_LEVEL = NVERB_ERROR +! +!Structure describing the characteristics of a file +TYPE TFILEDATA + CHARACTER(LEN=NFILENAMELGTMAX) :: CNAME = '' !Filename + CHARACTER(LEN=:),ALLOCATABLE :: CDIRNAME !Directory name + CHARACTER(LEN=13) :: CTYPE = "UNKNOWN" !Filetype (PGD, MNH, DES, NML...) + CHARACTER(LEN=7) :: CFORMAT = "UNKNOWN" !Fileformat (NETCDF4, LFI, LFICDF4...) + CHARACTER(LEN=7) :: CMODE = "UNKNOWN" !Opening mode (read, write...) + LOGICAL :: LOPENED = .FALSE. !Is the file opened + INTEGER :: NOPEN_CURRENT = 0 !Number of times the file is currently opened (several opens without close are allowed) + INTEGER :: NOPEN = 0 !Number of times the file has been opened (during the current execution) + INTEGER :: NCLOSE = 0 !Number of times the file has been closed (during the current execution) + ! + INTEGER :: NMASTER_RANK = -1 !Rank of the master process (no meaning if LMULTIMASTERS=.T.) + INTEGER :: NMPICOMM = -1 !MPI communicator used for IO on this file + LOGICAL :: LMASTER = .FALSE. !True if process is master of the file (process that open/read/write/close) + LOGICAL :: LMULTIMASTERS = .FALSE. !True if several processes may access the file + INTEGER :: NSUBFILES_IOZ = 0 !Number of sub-files (Z-split files based on this file) + !For example if 2 sub-files and this file is abcd, + !the 2 sub-files are abcd.Z001 and abcd.Z002 +! TYPE(TFILE_ELT),DIMENSION(:),ALLOCATABLE :: TFILES_IOZ !Corresponding Z-split files + ! + INTEGER :: NMODEL = 0 !Model number corresponding to the file (field not always set) + INTEGER,DIMENSION(3) :: NMNHVERSION = (/0,0,0/) !MesoNH version used to create the file + ! +END TYPE TFILEDATA ENDMODULE MODD_IO diff --git a/src/arome/micro/modd_les.F90 b/src/common/aux/modd_les.F90 similarity index 95% rename from src/arome/micro/modd_les.F90 rename to src/common/aux/modd_les.F90 index 9ebc913ed56d6bd264d38f01ac62d5cbddbb5999..389e2b1a35b949d75779e3bd8d384eeaf8967b63 100644 --- a/src/arome/micro/modd_les.F90 +++ b/src/common/aux/modd_les.F90 @@ -1,4 +1,9 @@ -! ######spl +!MNH_LIC Copyright 1995-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. +!----------------------------------------------------------------- +! ############### MODULE MODD_LES ! ############### ! @@ -34,7 +39,11 @@ !! V. Masson Nov. 6, 2002 LES budgets !! F. Couvreux Oct 1, 2006 LES PDF !! J.Pergaud Oct , 2007 MF LES -!! P. Aumond Oct , 2009 User multimaskS + 4th order +!! P. Aumond Oct ,2009 User multimaskS + 4th order +!! C.Lac Oct ,2014 Correction on user masks +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management +! P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -56,10 +65,10 @@ LOGICAL :: LLES_DOWNDRAFT ! flag to activate the computations in downdrafts LOGICAL :: LLES_SPECTRA ! flag to activate the spectra computations LOGICAL :: LLES_PDF ! flag to activate the pdf computations ! -INTEGER, DIMENSION(200) :: NLES_LEVELS ! model levels for LES comp. -REAL, DIMENSION(200) :: XLES_ALTITUDES ! alt. levels for LES comp. -INTEGER, DIMENSION(200) :: NSPECTRA_LEVELS ! model levels for spectra comp. -REAL, DIMENSION(200) :: XSPECTRA_ALTITUDES ! alt. levels for spectra comp. +INTEGER, DIMENSION(900) :: NLES_LEVELS ! physical model levels for LES comp. +REAL, DIMENSION(900) :: XLES_ALTITUDES ! alt. levels for LES comp. +INTEGER, DIMENSION(900) :: NSPECTRA_LEVELS ! physical model levels for spectra comp. +REAL, DIMENSION(900) :: XSPECTRA_ALTITUDES ! alt. levels for spectra comp. ! INTEGER, DIMENSION( 10) :: NLES_TEMP_SERIE_I ! I, J and Z point INTEGER, DIMENSION( 10) :: NLES_TEMP_SERIE_J ! localizations to @@ -74,7 +83,7 @@ REAL :: XLES_TEMP_MEAN_END ! for start and end of the temporal averaged comp. REAL :: XLES_TEMP_MEAN_STEP ! time step for each averaging LOGICAL :: LLES_CART_MASK ! flag to use a cartesian mask -INTEGER :: NLES_IINF ! definition of the cartesians mask +INTEGER :: NLES_IINF ! definition of the cartesians mask in physical domain INTEGER :: NLES_ISUP ! for NLES_CART_MODNBR model INTEGER :: NLES_JINF ! " INTEGER :: NLES_JSUP ! " @@ -87,7 +96,7 @@ INTEGER :: NPDF ! number of pdf intervals ! !------------------------------------------------------------------------------- ! -INTEGER, DIMENSION(JPMODELMAX) :: NLESn_IINF ! definition of the cartesians mask +INTEGER, DIMENSION(JPMODELMAX) :: NLESn_IINF ! definition of the cartesians mask in physical domain INTEGER, DIMENSION(JPMODELMAX) :: NLESn_ISUP ! for all models INTEGER, DIMENSION(JPMODELMAX) :: NLESn_JINF ! " INTEGER, DIMENSION(JPMODELMAX) :: NLESn_JSUP ! " @@ -115,7 +124,6 @@ LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_NEB_MASK LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CORE_MASK ! 2D surface precipitations mask of the current model ! -LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_MY_MASK ! 2D owner mask of the current model LOGICAL, DIMENSION(:,:,:,:), ALLOCATABLE :: LLES_CURRENT_MY_MASKS ! @@ -130,11 +138,8 @@ INTEGER :: NLES_CURRENT_TCOUNT INTEGER :: NLES_CURRENT_TIMES ! current model NLES_TIMES (number of LES samplings) ! -REAL, DIMENSION(:,:), ALLOCATABLE :: XLES_CURRENT_TRAJT -! trajt array for write_diachro routine -! INTEGER :: NLES_CURRENT_IINF, NLES_CURRENT_ISUP, NLES_CURRENT_JINF, NLES_CURRENT_JSUP -! coordinates for write_diachro, set to NLESn_IINF(current model), etc... +! coordinates (in physical domain) for write_diachro, set to NLESn_IINF(current model), etc... ! REAL :: XLES_CURRENT_DOMEGAX, XLES_CURRENT_DOMEGAY ! minimum wavelength in spectra analysis @@ -145,9 +150,6 @@ CHARACTER(LEN=4), DIMENSION(2) :: CLES_CURRENT_LBCX CHARACTER(LEN=4), DIMENSION(2) :: CLES_CURRENT_LBCY ! current model Y boundary conditions for 2 points correlations computations ! -REAL, DIMENSION(:,:), ALLOCATABLE :: XLES_CURRENT_DATIME -! date array for diachro -! REAL, DIMENSION(:), ALLOCATABLE :: XLES_CURRENT_Z ! altitudes for diachro ! @@ -166,9 +168,6 @@ INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: NKLIN_CURRENT_SPEC REAL, DIMENSION(:,:,:), ALLOCATABLE :: XCOEFLIN_CURRENT_SPEC ! coefficients for vertical interpolation ! -CHARACTER(LEN=28) :: CCURRENT_FMDIAC -! current CFMDIAC file -! REAL,DIMENSION(2) :: XTIME_LES ! time spent in subgrid LES computations in this time-step in TURB ! diff --git a/src/common/aux/modd_metricsn.F90 b/src/common/aux/modd_metricsn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..33cec104e0fcc1f51650c617136afecbb7f8edd0 --- /dev/null +++ b/src/common/aux/modd_metricsn.F90 @@ -0,0 +1,78 @@ +!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 modd 2006/06/27 14:20:29 +!----------------------------------------------------------------- +! ##################### + MODULE MODD_METRICS_n +! ##################### +! +!!**** *MODD_METRICS$n* - metric coefficients +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the +! metric coefficients. +! +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! P. Jabouille *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/04/99 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY: JPMODELMAX +IMPLICIT NONE + +TYPE METRICS_t + REAL, DIMENSION(:,:,:), POINTER :: XDXX=>NULL(),XDZX=>NULL(), & + XDYY=>NULL(),XDZY=>NULL(),XDZZ=>NULL() + !metric coefficients +END TYPE METRICS_t + +TYPE(METRICS_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: METRICS_MODEL + +REAL, DIMENSION(:,:,:), POINTER :: XDXX=>NULL(),XDZX=>NULL(), & + XDYY=>NULL(),XDZY=>NULL(),XDZZ=>NULL() + +CONTAINS + +SUBROUTINE METRICS_GOTO_MODEL(KFROM, KTO) +INTEGER, INTENT(IN) :: KFROM, KTO +! +! Save current state for allocated arrays +METRICS_MODEL(KFROM)%XDXX=>XDXX +METRICS_MODEL(KFROM)%XDZX=>XDZX +METRICS_MODEL(KFROM)%XDYY=>XDYY +METRICS_MODEL(KFROM)%XDZY=>XDZY +METRICS_MODEL(KFROM)%XDZZ=>XDZZ +! +! Current model is set to model KTO +XDXX=>METRICS_MODEL(KTO)%XDXX +XDZX=>METRICS_MODEL(KTO)%XDZX +XDYY=>METRICS_MODEL(KTO)%XDYY +XDZY=>METRICS_MODEL(KTO)%XDZY +XDZZ=>METRICS_MODEL(KTO)%XDZZ + +END SUBROUTINE METRICS_GOTO_MODEL + +END MODULE MODD_METRICS_n diff --git a/src/arome/micro/modd_nsv.F90 b/src/common/aux/modd_nsv.F90 similarity index 82% rename from src/arome/micro/modd_nsv.F90 rename to src/common/aux/modd_nsv.F90 index f15b1b1047504dc96e356a4a4e0d5b8b8d636a08..63cab9dbf6c9c41b3e6e3f781ea3a3e9f4b323fe 100644 --- a/src/arome/micro/modd_nsv.F90 +++ b/src/common/aux/modd_nsv.F90 @@ -1,4 +1,9 @@ -! ######spl +!MNH_LIC Copyright 2001-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. +!------------------------------------------------------------------------------- +! ############### MODULE MODD_NSV ! ############### ! @@ -20,15 +25,21 @@ !! M. Leriche 12/04/07 add aqueous chemistry !! M. Leriche 08/07/10 add ice phase chemistry !! C.Lac 07/11 add conditional sampling +!! Pialat/Tulet 15/02/12 add ForeFire !! B.Vie /14 LIMA -!! +!! Modification 01/2016 (JP Pinty) Add LIMA +!! V. Vionnet 07/17 add blowing snow +! P. Wautelet 10/03/2021: add CSVNAMES and CSVNAMES_A to store the name of all the scalar variables +! B. Vie 06/2021: add prognostic supersaturation for LIMA +! !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODD_PARAMETERS, ONLY : JPMODELMAX,& ! Maximum allowed number of nested models - JPSVMAX ! Maximum number of scalar variables +USE MODD_PARAMETERS, ONLY : JPMODELMAX, & ! Maximum allowed number of nested models + JPSVMAX, & ! Maximum number of scalar variables + JPSVNAMELGTMAX ! Maximum length of a scalar variable name ! IMPLICIT NONE SAVE @@ -37,6 +48,8 @@ REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables ! LOGICAL :: LINI_NSV = .FALSE. ! becomes True when routine INI_NSV is called ! +CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE, TARGET :: CSVNAMES_A !Names of all the scalar variables + INTEGER,DIMENSION(JPMODELMAX)::NSV_A = 0 ! total number of scalar variables ! NSV_A = NSV_USER_A+NSV_C2R2_A+NSV_CHEM_A+.. INTEGER,DIMENSION(JPMODELMAX)::NSV_USER_A = 0 ! number of user scalar variables with @@ -123,16 +136,25 @@ INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_IFN_FREE_A = 0 ! First Free IFN conc. INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_IFN_NUCL_A = 0 ! First Nucl. IFN conc. INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_IMM_NUCL_A = 0 ! First Nucl. IMM conc. INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_HOM_HAZE_A = 0 ! Hom. freezing of CCN +INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_SPRO_A = 0 ! Supersaturation +! +#ifdef MNH_FOREFIRE +INTEGER,DIMENSION(JPMODELMAX)::NSV_FF_A = 0 ! number of ForeFire scalar variables +INTEGER,DIMENSION(JPMODELMAX)::NSV_FFBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_FFEND_A = 0 ! NSV_FFBEG_A...NSV_FFEND_A +#endif ! -! Specific declaration for AROME / CO2 runs..... -! to be keep, and next to be introduced in MesoNH INTEGER,DIMENSION(JPMODELMAX)::NSV_CO2_A = 0 ! index for CO2 - +! +INTEGER,DIMENSION(JPMODELMAX)::NSV_SNW_A = 0 ! number of blowing snow scalar +INTEGER,DIMENSION(JPMODELMAX)::NSV_SNWBEG_A = 0 ! with indices in the range : +INTEGER,DIMENSION(JPMODELMAX)::NSV_SNWEND_A = 0 ! NSV_SNWBEG_A...NSV_SNWEND_A ! !############################################################################### ! ! variables updated for the current model ! +CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:), POINTER :: CSVNAMES !Names of all the scalar variables CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: CSV ! name of the scalar variables INTEGER :: NSV = 0 ! total number of user scalar variables ! @@ -208,7 +230,7 @@ INTEGER :: NSV_CSEND = 0 ! NSV_CSBEG...NSV_CSEND ! INTEGER :: NSV_LIMA ! number of scalar in LIMA INTEGER :: NSV_LIMA_BEG ! with indices in the range : -INTEGER :: NSV_LIMA_END ! NSV_LIMA_BEG...NSV_LIMA_END +INTEGER :: NSV_LIMA_END ! NSV_LIMA_BEG_A...NSV_LIMA_END_A INTEGER :: NSV_LIMA_NC ! INTEGER :: NSV_LIMA_NR ! INTEGER :: NSV_LIMA_CCN_FREE ! @@ -219,10 +241,18 @@ INTEGER :: NSV_LIMA_IFN_FREE ! INTEGER :: NSV_LIMA_IFN_NUCL ! INTEGER :: NSV_LIMA_IMM_NUCL ! INTEGER :: NSV_LIMA_HOM_HAZE ! - -! Specific declaration for AROME / CO2 runs..... -! to be keep, and next to be introduced in MesoNH +INTEGER :: NSV_LIMA_SPRO ! +! +#ifdef MNH_FOREFIRE +INTEGER :: NSV_FF = 0 ! number of ForeFire scalar variables +INTEGER :: NSV_FFBEG = 0 ! with indices in the range : +INTEGER :: NSV_FFEND = 0 ! NSV_FFBEG...NSV_FFEND +#endif +! INTEGER :: NSV_CO2 = 0 ! index for CO2 - +! +INTEGER :: NSV_SNW = 0 ! number of blowing snow scalar variables +INTEGER :: NSV_SNWBEG = 0 ! with indices in the range : +INTEGER :: NSV_SNWEND = 0 ! NSV_SNWBEG...NSV_SNWEND END MODULE MODD_NSV diff --git a/src/common/aux/modd_turbn.F90 b/src/common/aux/modd_turbn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..03cb317eb33be9eab48ea00e6d47556336501b3b --- /dev/null +++ b/src/common/aux/modd_turbn.F90 @@ -0,0 +1,108 @@ +!MNH_LIC Copyright 1995-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. +!----------------------------------------------------------------- +! ################## + MODULE MODD_TURB_n +! ################## +! +!!**** *MODD_TURB$n* - declaration of turbulence scheme free parameters +!! +!! PURPOSE +!! ------- +! The purpose of this declarative module is to declare the +! variables that may be set by namelist for the turbulence scheme +! +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! None +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (module MODD_PARAMn) +!! +!! AUTHOR +!! ------ +!! J. Cuxart and J. Stein * I.N.M. and Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original January 9, 1995 +!! J.Cuxart February 15, 1995 add the switches for diagnostic storages +!! J.M. Carriere May 15, 1995 add the subgrid condensation +!! M. Tomasini Jul 05, 2001 add the subgrid autoconversion +!! P. Bechtold Feb 11, 2002 add switch for Sigma_s computation +!! P. Jabouille Apr 4, 2002 add switch for Sigma_s convection +!! V. Masson Nov 13 2002 add switch for SBL lengths +!! May 2006 Remove KEPS +!! C.Lac Nov 2014 add terms of TKE production for LES diag +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! D. Ricard May 2021 add the switches for Leonard terms +!! JL Redelsperger 03/2021 Add O-A flux for auto-coupled LES case +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS, ONLY: JPMODELMAX +IMPLICIT NONE +! +! + REAL :: XIMPL ! implicitness degree for the vertical terms of + ! the turbulence scheme + REAL :: XKEMIN ! mimimum value for the TKE + REAL :: XCEDIS ! Constant for dissipation of Tke + REAL :: XCADAP ! Coefficient for ADAPtative mixing length + CHARACTER (LEN=4) :: CTURBLEN ! type of length used for the closure + ! 'BL89' Bougeault and Lacarrere scheme + ! 'DELT' length = ( volum) ** 1/3 + CHARACTER (LEN=4) :: CTURBDIM ! dimensionality of the turbulence scheme + ! '1DIM' for purely vertical computations + ! '3DIM' for computations in the 3 + ! directions + LOGICAL :: LTURB_FLX ! logical switch for the storage of all + ! the turbulent fluxes + LOGICAL :: LTURB_DIAG! logical switch for the storage of some + ! turbulence related diagnostics + LOGICAL :: LSUBG_COND! Switch for subgrid condensation + LOGICAL :: LSIGMAS ! Switch for using Sigma_s from turbulence scheme + LOGICAL :: LSIG_CONV ! Switch for computing Sigma_s due to convection +! + LOGICAL :: LRMC01 ! Switch for computing separate mixing +! ! and dissipative length in the SBL +! ! according to Redelsperger, Mahe & +! ! Carlotti 2001 + CHARACTER(LEN=4) :: CTOM ! type of Third Order Moments + ! 'NONE' none + ! 'TM06' Tomas Masson 2006 + CHARACTER(LEN=4) :: CSUBG_AUCV ! type of subgrid rc->rr autoconv. method + CHARACTER(LEN=80) :: CSUBG_AUCV_RI ! type of subgrid ri->rs autoconv. method + CHARACTER(LEN=80) :: CCONDENS ! subrgrid condensation PDF + CHARACTER(LEN=4) :: CLAMBDA3 ! lambda3 choice for subgrid cloud scheme + CHARACTER(LEN=80) :: CSUBG_MF_PDF ! PDF to use for MF cloud autoconversions + +! REAL, DIMENSION(:,:), POINTER :: XBL_DEPTH=>NULL() ! BL depth for TOMS computations +! REAL, DIMENSION(:,:), POINTER :: XSBL_DEPTH=>NULL()! SurfaceBL depth for RMC01 computations +! REAL, DIMENSION(:,:,:), POINTER :: XWTHVMF=>NULL()! Mass Flux vert. transport of buoyancy + REAL :: VSIGQSAT ! coeff applied to qsat variance contribution + REAL, DIMENSION(:,:,:), POINTER :: XDYP=>NULL() ! Dynamical production of Kinetic energy + REAL, DIMENSION(:,:,:), POINTER :: XTHP=>NULL() ! Thermal production of Kinetic energy + REAL, DIMENSION(:,:,:), POINTER :: XTR=>NULL() ! Transport production of Kinetic energy + REAL, DIMENSION(:,:,:), POINTER :: XDISS=>NULL() ! Dissipation of Kinetic energy + REAL, DIMENSION(:,:,:), POINTER :: XLEM=>NULL() ! Mixing length + REAL, DIMENSION(:,:,:), POINTER :: XSSUFL_C=>NULL() ! O-A interface flux for u + REAL, DIMENSION(:,:,:), POINTER :: XSSVFL_C=>NULL() ! O-A interface flux for v + REAL, DIMENSION(:,:,:), POINTER :: XSSTFL_C=>NULL() ! O-A interface flux for theta + REAL, DIMENSION(:,:,:), POINTER :: XSSRFL_C=>NULL() ! O-A interface flux for vapor + LOGICAL :: LHGRAD ! logical switch for the computation of the Leornard Terms + REAL :: XCOEFHGRADTHL ! coeff applied to thl contribution + REAL :: XCOEFHGRADRM ! coeff applied to mixing ratio contribution + REAL :: XALTHGRAD ! altitude from which to apply the Leonard terms + REAL :: XCLDTHOLD ! cloud threshold to apply the Leonard terms + ! negative value : applied everywhere + ! 0.000001 applied only inside the clouds ri+rc > 10**-6 kg/kg +! +END MODULE MODD_TURB_n diff --git a/src/common/aux/tools.f90 b/src/common/aux/tools.F90 similarity index 100% rename from src/common/aux/tools.f90 rename to src/common/aux/tools.F90 diff --git a/src/common/micro/condensation.F90 b/src/common/micro/condensation.F90 index e07e87f180092a51b6f615a8693292e33c9d961b..404642217470bae1e892ad809db7e38489adc03f 100644 --- a/src/common/micro/condensation.F90 +++ b/src/common/micro/condensation.F90 @@ -171,8 +171,7 @@ REAL :: ZDZ(D%NIB:D%NIE), & ZARDUM(D%NIE-D%NIB+1), ZCLDUM(D%NIE-D%NIB+1) ! end OCND2 REAL(KIND=JPRB) :: ZHOOK_HANDLE -INTEGER, DIMENSION(D%NIT) :: IERR -! +INTEGER, DIMENSION(D%NIB:D%NIE) :: IERR ! !* 0.3 Definition of constants : ! @@ -203,6 +202,12 @@ PCLDFR(:,:,:) = 0. ! Initialize values PSIGRC(:,:,:) = 0. ! Initialize values ZPRIFACT = 1. ! Initialize value ZCLDUM=-1. ! Initialize value +! Init of the HALO (should be on HALO points only) +#ifdef REPRO55 +PRC_OUT = PRC_IN +PRV_OUT = PRV_IN +PRI_OUT = PRI_IN +#endif IF(OCND2)ZPRIFACT = 0. ! ! @@ -329,7 +334,7 @@ DO JK=D%NKTB,D%NKTE ZFRAC(JI) = PRI_IN(JI,JJ,JK) / (PRC_IN(JI,JJ,JK)+PRI_IN(JI,JJ,JK)) ENDIF END DO - CALL COMPUTE_FRAC_ICE(HFRAC_ICE, NEB, ZFRAC(:), PT(:,JJ,JK), IERR) !error code IERR cannot be checked here to not break vectorization + CALL COMPUTE_FRAC_ICE(HFRAC_ICE, NEB, ZFRAC(:), PT(D%NIB:D%NIE,JJ,JK), IERR) !error code IERR cannot be checked here to not break vectorization ENDIF DO JI=D%NIB,D%NIE ZQSL(JI) = CST%XRD / CST%XRV * ZPV(JI) / ( PPABS(JI,JJ,JK) - ZPV(JI) ) diff --git a/src/common/micro/ice4_nucleation_elem.func.h b/src/common/micro/ice4_nucleation_elem.func.h new file mode 100644 index 0000000000000000000000000000000000000000..f9ef73991cae536f9e15786a60d153b783da3c69 --- /dev/null +++ b/src/common/micro/ice4_nucleation_elem.func.h @@ -0,0 +1,110 @@ +!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. +ELEMENTAL SUBROUTINE ICE4_NUCLEATION_ELEM(ODCOMPUTE, & + PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & + PRVT, & + PCIT, PRVHENI_MR) +! ******* TO BE INCLUDED IN THE *CONTAINS* OF A SUBROUTINE, IN ORDER TO EASE AUTOMATIC INLINING ****** +! => Don't use drHook !!! +! + +!! +!!** PURPOSE +!! ------- +!! Computes the nucleation +!! +!! AUTHOR +!! ------ +!! S. Riette from the splitting of rain_ice source code (nov. 2014) +!! +!! MODIFICATIONS +!! ------------- +!! +!! R. El Khatib 24-Aug-2021 Optimizations +!! S. Riette Feb 2022: as an include file +! +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY: XALPI, XALPW, XBETAI, XBETAW, XGAMI, XGAMW, XMD, XMV, XTT, XEPSILO +USE MODD_PARAM_ICE, ONLY: LFEEDBACKT +USE MODD_RAIN_ICE_PARAM, ONLY: XALPHA1, XALPHA2, XBETA1, XBETA2, XMNU0, XNU10, XNU20 +USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +LOGICAL, INTENT(IN) :: ODCOMPUTE +REAL, INTENT(IN) :: PTHT ! Theta at t +REAL, INTENT(IN) :: PPABST ! absolute pressure at t +REAL, INTENT(IN) :: PRHODREF! Reference density +REAL, INTENT(IN) :: PEXN ! Exner function +REAL, INTENT(IN) :: PLSFACT +REAL, INTENT(IN) :: PT ! Temperature at time t +REAL, INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, INTENT(OUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation +! +!* 0.2 declaration of local variables +! +REAL :: ZW ! work array +LOGICAL :: GNEGT ! Test where to compute the HEN process +REAL :: ZZW, & ! Work scalar + ZUSW, & ! Undersaturation over water + ZSSI ! Supersaturation over ice +!------------------------------------------------------------------------------- +! +GNEGT=PT<XTT .AND. PRVT>XRTMIN(1) .AND. ODCOMPUTE + +PRVHENI_MR=0. +IF(GNEGT) THEN + ZZW=ALOG(PT) + ZUSW=EXP(XALPW - XBETAW/PT - XGAMW*ZZW) ! es_w + ZZW=EXP(XALPI - XBETAI/PT - XGAMI*ZZW) ! es_i + + ZZW=MIN(PPABST/2., ZZW) ! safety limitation + ZSSI=PRVT*(PPABST-ZZW) / (XEPSILO*ZZW) - 1.0 ! Supersaturation over ice + ZUSW=MIN(PPABST/2., ZUSW) ! safety limitation + ZUSW=(ZUSW/ZZW)*((PPABST-ZZW)/(PPABST-ZUSW)) - 1.0 + ! Supersaturation of saturated water vapor over ice + ! + !* 3.1 compute the heterogeneous nucleation source RVHENI + ! + !* 3.1.1 compute the cloud ice concentration + ! + ZSSI=MIN(ZSSI, ZUSW) ! limitation of SSi according to SSw=0 + + IF(PT<XTT-5. .AND. ZSSI>0.) THEN + ZZW=XNU20*EXP(XALPHA2*ZSSI-XBETA2) + ELSEIF(PT<=XTT-2. .AND. PT>=XTT-5. .AND. ZSSI>0.) THEN + ZZW=MAX(XNU20*EXP(-XBETA2 ), & + XNU10*EXP(-XBETA1*(PT-XTT))*(ZSSI/ZUSW)**XALPHA1) + ELSE + ZZW=0. + ENDIF + + ZZW=ZZW-PCIT + ZZW=MIN(ZZW, 50.E3) ! limitation provisoire a 50 l^-1 + ! + !* 3.1.2 update the r_i and r_v mixing ratios + ! + PRVHENI_MR=MAX(ZZW, 0.0)*XMNU0/PRHODREF + PRVHENI_MR=MIN(PRVT, PRVHENI_MR) + ! + !Limitation due to 0 crossing of temperature + ! + IF(LFEEDBACKT) THEN + ZW=MIN(PRVHENI_MR, MAX(0., (XTT/PEXN-PTHT)/PLSFACT)) / & + MAX(PRVHENI_MR, 1.E-20) + PRVHENI_MR=PRVHENI_MR*ZW + ZZW=ZZW*ZW + ENDIF + ! + PCIT=MAX(ZZW+PCIT, PCIT) +ENDIF +! +END SUBROUTINE ICE4_NUCLEATION_ELEM diff --git a/src/common/micro/ice_adjust.F90 b/src/common/micro/ice_adjust.F90 index d2c9d943a6497358e48cde8cfd00ae94fcaf9cf3..122a140c5dbb73f0b61147fc47c2d6b4c59724f9 100644 --- a/src/common/micro/ice_adjust.F90 +++ b/src/common/micro/ice_adjust.F90 @@ -12,10 +12,9 @@ PPABST, PZZ, & PEXN, PCF_MF, PRC_MF, PRI_MF, & PRV, PRC, PRVS, PRCS, PTH, PTHS, PSRCS, PCLDFR, & - PRR, PRI, PRIS, PRS, PRG, PRH, & + PRR, PRI, PRIS, PRS, PRG, TBUDGETS, KBUDGETS, PRH,& POUT_RV, POUT_RC, POUT_RI, POUT_TH, & PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - TBUDGETS, KBUDGETS, & PICE_CLD_WGT) ! ######################################################################### ! diff --git a/src/common/micro/mode_ice4_compute_pdf.F90 b/src/common/micro/mode_ice4_compute_pdf.F90 index 6fb091d6c2c54691f9cad6371574c0f6417049d3..942c65c25291d9ef50dd052af074aa58f90af95b 100644 --- a/src/common/micro/mode_ice4_compute_pdf.F90 +++ b/src/common/micro/mode_ice4_compute_pdf.F90 @@ -309,7 +309,11 @@ ELSE CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'ICE4_COMPUTE_PDF', 'wrong HSUBG_AUCV_RI case' ) ENDIF ! +#ifdef REPRO48 +PRF=PHLC_HCF +#else PRF=MAX(PHLC_HCF,PHLI_HCF) +#endif ! IF (LHOOK) CALL DR_HOOK('ICE4_COMPUTE_PDF', 1, ZHOOK_HANDLE) END SUBROUTINE ICE4_COMPUTE_PDF diff --git a/src/common/micro/mode_ice4_nucleation.F90 b/src/common/micro/mode_ice4_nucleation.F90 deleted file mode 100644 index 7d54233276052d05f4deec25e9ae7c072c6f4b7a..0000000000000000000000000000000000000000 --- a/src/common/micro/mode_ice4_nucleation.F90 +++ /dev/null @@ -1,127 +0,0 @@ -!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. -!----------------------------------------------------------------- -MODULE MODE_ICE4_NUCLEATION -IMPLICIT NONE -CONTAINS -SUBROUTINE ICE4_NUCLEATION(KSIZE, ODCOMPUTE, & - PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & - PRVT, & - PCIT, PRVHENI_MR) -!! -!!** PURPOSE -!! ------- -!! Computes the nucleation -!! -!! AUTHOR -!! ------ -!! S. Riette from the splitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -!! -!! R. El Khatib 24-Aug-2021 Optimizations -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY: XALPI, XALPW, XBETAI, XBETAW, XGAMI, XGAMW, XMD, XMV, XTT, XEPSILO -USE MODD_PARAM_ICE, ONLY: LFEEDBACKT -USE MODD_RAIN_ICE_PARAM, ONLY: XALPHA1, XALPHA2, XBETA1, XBETA2, XMNU0, XNU10, XNU20 -USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KSIZE -LOGICAL, DIMENSION(KSIZE),INTENT(IN) :: ODCOMPUTE -REAL, DIMENSION(KSIZE), INTENT(IN) :: PTHT ! Theta at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(KSIZE), INTENT(IN) :: PEXN ! Exner function -REAL, DIMENSION(KSIZE), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KSIZE), INTENT(IN) :: PT ! Temperature at time t -REAL, DIMENSION(KSIZE), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t -REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation -! -!* 0.2 declaration of local variables -! -REAL, DIMENSION(KSIZE) :: ZW ! work array -REAL(KIND=JPRB) :: ZHOOK_HANDLE -LOGICAL, DIMENSION(KSIZE) :: GNEGT ! Test where to compute the HEN process -REAL, DIMENSION(KSIZE) :: ZZW, & ! Work array - ZUSW, & ! Undersaturation over water - ZSSI ! Supersaturation over ice -!------------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION', 0, ZHOOK_HANDLE)! -! -GNEGT(:)=PT(:)<XTT .AND. PRVT(:)>XRTMIN(1) .AND. ODCOMPUTE(:) - -ZUSW(:)=0. -ZZW(:)=0. -WHERE(GNEGT(:)) - ZZW(:)=ALOG(PT(:)) - ZUSW(:)=EXP(XALPW - XBETAW/PT(:) - XGAMW*ZZW(:)) ! es_w - ZZW(:)=EXP(XALPI - XBETAI/PT(:) - XGAMI*ZZW(:)) ! es_i -END WHERE - -ZSSI(:)=0. -WHERE(GNEGT(:)) - ZZW(:)=MIN(PPABST(:)/2., ZZW(:)) ! safety limitation - ZSSI(:)=PRVT(:)*(PPABST(:)-ZZW(:)) / (XEPSILO*ZZW(:)) - 1.0 - ! Supersaturation over ice - ZUSW(:)=MIN(PPABST(:)/2., ZUSW(:)) ! safety limitation - ZUSW(:)=(ZUSW(:)/ZZW(:))*((PPABST(:)-ZZW(:))/(PPABST(:)-ZUSW(:))) - 1.0 - ! Supersaturation of saturated water vapor over ice - ! - !* 3.1 compute the heterogeneous nucleation source RVHENI - ! - !* 3.1.1 compute the cloud ice concentration - ! - ZSSI(:)=MIN(ZSSI(:), ZUSW(:)) ! limitation of SSi according to SSw=0 -END WHERE - -ZZW(:)=0. -WHERE(GNEGT(:) .AND. PT(:)<XTT-5.0 .AND. ZSSI(:)>0.0 ) - ZZW(:)=XNU20*EXP(XALPHA2*ZSSI(:)-XBETA2) -ELSEWHERE(GNEGT(:) .AND. PT(:)<=XTT-2.0 .AND. PT(:)>=XTT-5.0 .AND. ZSSI(:)>0.0) - ZZW(:)=MAX(XNU20*EXP(-XBETA2 ), & - XNU10*EXP(-XBETA1*(PT(:)-XTT))*(ZSSI(:)/ZUSW(:))**XALPHA1) -END WHERE -WHERE(GNEGT(:)) - ZZW(:)=ZZW(:)-PCIT(:) - ZZW(:)=MIN(ZZW(:), 50.E3) ! limitation provisoire a 50 l^-1 -END WHERE - -PRVHENI_MR(:)=0. -WHERE(GNEGT(:)) - ! - !* 3.1.2 update the r_i and r_v mixing ratios - ! - PRVHENI_MR(:)=MAX(ZZW(:), 0.0)*XMNU0/PRHODREF(:) - PRVHENI_MR(:)=MIN(PRVT(:), PRVHENI_MR(:)) -END WHERE -!Limitation due to 0 crossing of temperature -IF(LFEEDBACKT) THEN - ZW(:)=0. - WHERE(GNEGT(:)) - ZW(:)=MIN(PRVHENI_MR(:), & - MAX(0., (XTT/PEXN(:)-PTHT(:))/PLSFACT(:))) / & - MAX(PRVHENI_MR(:), 1.E-20) - END WHERE - PRVHENI_MR(:)=PRVHENI_MR(:)*ZW(:) - ZZW(:)=ZZW(:)*ZW(:) -ENDIF -PCIT(:)=MAX(ZZW(:)+PCIT(:), PCIT(:)) -! -IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION', 1, ZHOOK_HANDLE) -END SUBROUTINE ICE4_NUCLEATION -END MODULE MODE_ICE4_NUCLEATION diff --git a/src/common/micro/mode_ice4_nucleation_wrapper.F90 b/src/common/micro/mode_ice4_nucleation_wrapper.F90 deleted file mode 100644 index f16f0225517060c7d5175a9e4f643174b653d7b4..0000000000000000000000000000000000000000 --- a/src/common/micro/mode_ice4_nucleation_wrapper.F90 +++ /dev/null @@ -1,139 +0,0 @@ -!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. -!----------------------------------------------------------------- -MODULE MODE_ICE4_NUCLEATION_WRAPPER -IMPLICIT NONE -CONTAINS -SUBROUTINE ICE4_NUCLEATION_WRAPPER(KIT, KJT, KKT, LDMASK, & - PTHT, PPABST, PRHODREF, PEXN, PLSFACT, PT, & - PRVT, & - PCIT, PRVHENI_MR) -!! -!!** PURPOSE -!! ------- -!! Computes the nucleation -!! -!! AUTHOR -!! ------ -!! S. Riette from the splitting of rain_ice source code (nov. 2014) -!! -!! MODIFICATIONS -!! ------------- -! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 -! P. Wautelet 29/05/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) -!! R. El Khatib 24-Aug-2021 Optimizations -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST, ONLY: XTT -USE MODE_TOOLS, ONLY: COUNTJV -USE MODE_ICE4_NUCLEATION, ONLY: ICE4_NUCLEATION -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KIT, KJT, KKT -LOGICAL, DIMENSION(KIT,KJT,KKT),INTENT(IN) :: LDMASK -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PEXN ! Exner function -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PLSFACT -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PT ! Temperature at time t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRVT ! Water vapor m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation -! -!* 0.2 declaration of local variables -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -INTEGER :: JL -INTEGER :: INEGT -INTEGER, DIMENSION(COUNT(PT<XTT .AND. LDMASK)) :: I1,I2,I3 -LOGICAL, DIMENSION(COUNT(PT<XTT .AND. LDMASK)) :: GLDCOMPUTE ! computation criterium -LOGICAL, DIMENSION(KIT, KJT, KKT) :: GNEGT ! Test where to compute the HEN process -REAL, DIMENSION(COUNT(PT<XTT .AND. LDMASK)) :: ZZT, & ! Temperature - ZPRES, & ! Pressure - ZRVT, & ! Water vapor m.r. at t - ZCIT, & ! Pristine ice conc. at t - ZTHT, & ! Theta at t - ZRHODREF, & - ZEXN, & - ZLSFACT, & - ZRVHENI_MR -!! MNH version INTEGER, DIMENSION(:), ALLOCATABLE :: I1,I2,I3 -!! MNH version LOGICAL, DIMENSION(:), ALLOCATABLE :: GLDCOMPUTE -!! MNH version LOGICAL, DIMENSION(KIT,KJT,KKT) :: GNEGT ! Test where to compute the HEN process -!! MNH version REAL, DIMENSION(:), ALLOCATABLE :: ZZT, & ! Temperature -!! MNH version ZPRES, & ! Pressure -!! MNH version ZRVT, & ! Water vapor m.r. at t -!! MNH version ZCIT, & ! Pristine ice conc. at t -!! MNH version ZTHT, & ! Theta at t -!! MNH version ZRHODREF, & -!! MNH version ZEXN, & -!! MNH version ZLSFACT, & -!! MNH version ZRVHENI_MR -! -!------------------------------------------------------------------------------- -! -IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION_WRAPPER', 0, ZHOOK_HANDLE)! -! -! -! optimization by looking for locations where -! the temperature is negative only !!! -! -GNEGT(:,:,:)=PT(:,:,:)<XTT .AND. LDMASK -INEGT = COUNT(GNEGT(:,:,:)) -! -!! MNH version ALLOCATE(GLDCOMPUTE(INEGT)) -!! MNH version ALLOCATE(I1(INEGT),I2(INEGT),I3(INEGT)) -!! MNH version ALLOCATE(ZZT(INEGT)) -!! MNH version ALLOCATE(ZPRES(INEGT)) -!! MNH version ALLOCATE(ZRVT(INEGT)) -!! MNH version ALLOCATE(ZCIT(INEGT)) -!! MNH version ALLOCATE(ZTHT(INEGT)) -!! MNH version ALLOCATE(ZRHODREF(INEGT)) -!! MNH version ALLOCATE(ZEXN(INEGT)) -!! MNH version ALLOCATE(ZLSFACT(INEGT)) -!! MNH version ALLOCATE(ZRVHENI_MR(INEGT)) -! -IF(INEGT>0) INEGT=COUNTJV(GNEGT(:,:,:), I1(:), I2(:), I3(:)) -! -PRVHENI_MR(:,:,:)=0. -IF(INEGT>0) THEN - DO JL=1, INEGT - ZRVT(JL)=PRVT(I1(JL), I2(JL), I3(JL)) - ZCIT(JL)=PCIT(I1(JL), I2(JL), I3(JL)) - ZPRES(JL)=PPABST(I1(JL), I2(JL), I3(JL)) - ZTHT(JL)=PTHT(I1(JL), I2(JL), I3(JL)) - ZRHODREF(JL)=PRHODREF(I1(JL), I2(JL), I3(JL)) - ZEXN(JL)=PEXN(I1(JL), I2(JL), I3(JL)) - ZLSFACT(JL)=PLSFACT(I1(JL), I2(JL), I3(JL)) / ZEXN(JL) - ZZT(JL)=PT(I1(JL), I2(JL), I3(JL)) - GLDCOMPUTE(JL)=ZZT(JL)<XTT - ENDDO - CALL ICE4_NUCLEATION(INEGT, GLDCOMPUTE, & - ZTHT, ZPRES, ZRHODREF, ZEXN, ZLSFACT, ZZT, & - ZRVT, & - ZCIT, ZRVHENI_MR) - DO JL=1, INEGT - PRVHENI_MR(I1(JL), I2(JL), I3(JL)) = ZRVHENI_MR(JL) - PCIT (I1(JL), I2(JL), I3(JL)) = ZCIT (JL) - END DO -END IF -! -!! MNH versionDEALLOCATE(GLDCOMPUTE) -!! MNH versionDEALLOCATE(I1,I2,I3) -!! MNH versionDEALLOCATE(ZZT,ZPRES,ZRVT,ZCIT,ZTHT,ZRHODREF,ZEXN,ZLSFACT,ZRVHENI_MR) -! -IF (LHOOK) CALL DR_HOOK('ICE4_NUCLEATION_WRAPPER', 1, ZHOOK_HANDLE) - -END SUBROUTINE ICE4_NUCLEATION_WRAPPER -END MODULE MODE_ICE4_NUCLEATION_WRAPPER diff --git a/src/common/micro/mode_ice4_sedimentation_stat.F90 b/src/common/micro/mode_ice4_sedimentation_stat.F90 index 22d76575dac5b87e81803f5ccd27b49c0e853c64..d682049ad4b79f51738e773b2328ee0d8133e16b 100644 --- a/src/common/micro/mode_ice4_sedimentation_stat.F90 +++ b/src/common/micro/mode_ice4_sedimentation_stat.F90 @@ -107,8 +107,8 @@ FWSED2(PWSEDW,PTSTEP1,PDZZ1,PWSEDWSUP)=MAX(0.,1.-PDZZ1/(PTSTEP1*PWSEDW))*PWSEDWS IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT',0,ZHOOK_HANDLE) IF ( PRESENT( PFPR ) ) THEN !Set to 0. to avoid undefined values (in files) - PFPR(:, :, : KKTB - 1, :) = 0. - PFPR(:, :, KKTE + 1 :, :) = 0. + PFPR(:, :, : KKTB, :) = 0. + PFPR(:, :, KKTE :, :) = 0. END IF !------------------------------------------------------------------------------- diff --git a/src/common/micro/mode_ice4_tendencies.F90 b/src/common/micro/mode_ice4_tendencies.F90 index ea9e8f8ae1e4fc078eded42e9adfbda498ea8c8b..cc53a39aa675b8da205f9e6d69c0333133414068 100644 --- a/src/common/micro/mode_ice4_tendencies.F90 +++ b/src/common/micro/mode_ice4_tendencies.F90 @@ -64,7 +64,6 @@ USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress & IRG, & ! Graupel & IRH ! Hail ! -USE MODE_ICE4_NUCLEATION, ONLY: ICE4_NUCLEATION USE MODE_ICE4_RRHONG, ONLY: ICE4_RRHONG USE MODE_ICE4_RIMLTC, ONLY: ICE4_RIMLTC USE MODE_ICE4_RSRIMCG_OLD, ONLY: ICE4_RSRIMCG_OLD @@ -207,10 +206,13 @@ ELSE ! !* 2. COMPUTES THE SLOW COLD PROCESS SOURCES ! -------------------------------------- - CALL ICE4_NUCLEATION(KSIZE, LLCOMPUTE, & - ZVART(:,ITH), PPRES, PRHODREF, PEXN, PLSFACT, ZT, & - ZVART(:,IRV), & - PCIT, PRVHENI_MR) +!DIR$ VECTOR ALWAYS + DO CONCURRENT (JL=1:KSIZE) + CALL ICE4_NUCLEATION_ELEM(LLCOMPUTE(JL), & + ZVART(JL,ITH), PPRES(JL), PRHODREF(JL), PEXN(JL), PLSFACT(JL), ZT(JL), & + ZVART(JL,IRV), & + PCIT(JL), PRVHENI_MR(JL)) + ENDDO DO JL=1, KSIZE ZVART(JL,ITH)=ZVART(JL,ITH) + PRVHENI_MR(JL)*PLSFACT(JL) ZT(JL) = ZVART(JL,ITH) * PEXN(JL) @@ -304,15 +306,6 @@ CALL ICE4_COMPUTE_PDF(KSIZE, HSUBG_AUCV_RC, HSUBG_AUCV_RI, HSUBG_PR_PDF,& PHLI_HCF, PHLI_LCF, PHLI_HRI, PHLI_LRI, ZRAINFR) LLRFR=HSUBG_RC_RR_ACCR=='PRFR' .OR. HSUBG_RR_EVAP=='PRFR' IF (LLRFR) THEN - CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'MODE_ICE4_TENDENCIES', 'LLRFR case broken by optimisation, see comments in mode_ice4_tendencies to knwon why (and how to reapir)....') - !Microphyscs was optimized by introducing chunks of KPROMA size - !Thus, in ice4_tendencies, the 1D array represent only a fraction of the points where microphisical species are present - !We cannot rebuild the entire 3D arrays here, so we cannot call ice4_rainfr_vert here - !A solution would be to suppress optimisation in this case by setting KPROMA=KSIZE in rain_ice - !Another solution would be to compute column by column? - !Another one would be to cut tendencies in 3 parts: before rainfr_vert, rainfr_vert, after rainfr_vert - - !Diagnostic of precipitation fraction PRAINFR(:,:,:) = 0. ZRRT3D (:,:,:) = 0. @@ -322,8 +315,10 @@ IF (LLRFR) THEN DO JL=1,KSIZE PRAINFR(K1(JL), K2(JL), K3(JL)) = ZRAINFR(JL) ZRRT3D (K1(JL), K2(JL), K3(JL)) = ZVART(JL,IRR) +#ifndef REPRO48 ZRST3D (K1(JL), K2(JL), K3(JL)) = ZVART(JL,IRS) ZRGT3D (K1(JL), K2(JL), K3(JL)) = ZVART(JL,IRG) +#endif END DO IF (KRR==7) THEN DO JL=1,KSIZE @@ -497,5 +492,7 @@ CALL ICE4_FAST_RI(KSIZE, ODSOFT, PCOMPUTE, & ! IF (LHOOK) CALL DR_HOOK('ICE4_TENDENCIES', 1, ZHOOK_HANDLE) ! +CONTAINS +INCLUDE "ice4_nucleation_elem.func.h" END SUBROUTINE ICE4_TENDENCIES END MODULE MODE_ICE4_TENDENCIES diff --git a/src/common/micro/mode_icecloud.F90 b/src/common/micro/mode_icecloud.F90 index 43b394d211255e7ef887cecec79246067a4ac324..774dd688734a27d00b2fa1caaebe32d83ad07011 100644 --- a/src/common/micro/mode_icecloud.F90 +++ b/src/common/micro/mode_icecloud.F90 @@ -11,7 +11,8 @@ SUBROUTINE ICECLOUD & USE YOMHOOK , ONLY : LHOOK, DR_HOOK USE MODD_CST,ONLY : XCPD,XCPV,XLVTT,XLSTT,XG,XRD,XEPSILO USE MODE_TIWMX, ONLY: ESATW, ESATI - USE MODI_TIWMX + USE MODE_QSATMX_TAB +! USE MODI_TIWMX IMPLICIT NONE !----------------------------------------------------------------------- ! @@ -77,7 +78,7 @@ REAL :: ZSIGMAX,ZSIGMAY,ZSIGMAZ,ZXDIST,ZYDIST,& INTEGER :: JK ! External function -REAL :: QSATMX_TAB +!REAL :: QSATMX_TAB REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('ICECLOUD',0,ZHOOK_HANDLE) diff --git a/src/common/micro/modi_ice_adjust.F90 b/src/common/micro/modi_ice_adjust.F90 index 9c962de2ca5877cab6692476b61fd92140be6d94..e40451afba187c09edc1af59b63a7c9d029f4ddf 100644 --- a/src/common/micro/modi_ice_adjust.F90 +++ b/src/common/micro/modi_ice_adjust.F90 @@ -12,10 +12,9 @@ INTERFACE PPABST, PZZ, & PEXN, PCF_MF, PRC_MF, PRI_MF, & PRV, PRC, PRVS, PRCS, PTH, PTHS, PSRCS, PCLDFR, & - PRR, PRI, PRIS, PRS, PRG, PRH, & + PRR, PRI, PRIS, PRS, PRG, TBUDGETS, KBUDGETS, PRH,& POUT_RV, POUT_RC, POUT_RI, POUT_TH, & PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & - TBUDGETS, KBUDGETS, & PICE_CLD_WGT) USE MODD_BUDGET, ONLY: TBUDGETDATA, TBUDGETCONF_t USE MODD_CST, ONLY: CST_t diff --git a/src/common/micro/rain_ice.F90 b/src/common/micro/rain_ice.F90 index 0fa4b7bd73f38bfa24aba24506b7dbdb5f14ec07..5da4fe37e8978772295b1dcae8f80afe255c519d 100644 --- a/src/common/micro/rain_ice.F90 +++ b/src/common/micro/rain_ice.F90 @@ -205,7 +205,6 @@ USE MODE_ICE4_RAINFR_VERT, ONLY: ICE4_RAINFR_VERT USE MODE_ICE4_SEDIMENTATION_STAT, ONLY: ICE4_SEDIMENTATION_STAT USE MODE_ICE4_SEDIMENTATION_SPLIT, ONLY: ICE4_SEDIMENTATION_SPLIT USE MODE_ICE4_SEDIMENTATION_SPLIT_MOMENTUM, ONLY: ICE4_SEDIMENTATION_SPLIT_MOMENTUM -USE MODE_ICE4_NUCLEATION_WRAPPER, ONLY: ICE4_NUCLEATION_WRAPPER USE MODE_ICE4_TENDENCIES, ONLY: ICE4_TENDENCIES ! IMPLICIT NONE @@ -318,7 +317,7 @@ REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: ZINPRI ! Pristine ice instant prec LOGICAL :: GEXT_TEND LOGICAL :: LSOFT ! Must we really compute tendencies or only adjust them to new T variables INTEGER :: INB_ITER_MAX ! Maximum number of iterations (with real tendencies computation) -REAL :: ZW1D +REAL :: ZW0D REAL :: ZTSTEP ! length of sub-timestep in case of time splitting REAL :: ZINV_TSTEP ! Inverse ov PTSTEP REAL :: ZTIME_THRESHOLD ! Time to reach threshold @@ -1111,10 +1110,21 @@ PCIT(:,:,:)=ZCITOUT(:,:,:) !* 6. COMPUTES THE SLOW COLD PROCESS SOURCES OUTSIDE OF ODMICRO POINTS ! ---------------------------------------------------------------- ! -CALL ICE4_NUCLEATION_WRAPPER(KIT, KJT, KKT, .NOT. ODMICRO, & - PTHT, PPABST, PRHODREF, PEXN, ZZ_LSFACT, ZT, & - PRVT, & - PCIT, ZZ_RVHENI_MR) +DO JK=1, KKT + DO JJ=1, KJT +!DIR$ VECTOR ALWAYS + DO CONCURRENT (JI=1:KIT) + IF (.NOT. ODMICRO(JI, JJ, JK)) THEN + ZW0D=ZZ_LSFACT(JI, JJ, JK)/PEXN(JI, JJ, JK) + ENDIF + CALL ICE4_NUCLEATION_ELEM(.NOT. ODMICRO(JI, JJ, JK), & + PTHT(JI, JJ, JK), PPABST(JI, JJ, JK), PRHODREF(JI, JJ, JK), & + PEXN(JI, JJ, JK), ZW0D, ZT(JI, JJ, JK), & + PRVT(JI, JJ, JK), & + PCIT(JI, JJ, JK), ZZ_RVHENI_MR(JI, JJ, JK)) + ENDDO + ENDDO +ENDDO ! !------------------------------------------------------------------------------- ! @@ -1766,6 +1776,7 @@ CONTAINS IF (LHOOK) CALL DR_HOOK('RAIN_ICE:CORRECT_NEGATIVITIES', 1, ZHOOK_HANDLE) ! END SUBROUTINE CORRECT_NEGATIVITIES - +! +INCLUDE "ice4_nucleation_elem.func.h" ! END SUBROUTINE RAIN_ICE diff --git a/src/arome/turb/modd_cturb.F90 b/src/common/turb/modd_cturb.F90 similarity index 90% rename from src/arome/turb/modd_cturb.F90 rename to src/common/turb/modd_cturb.F90 index 9b18f803fd4181c9136220c02db637666cc20d0a..a446914f779a1f5aa6d72c4c24b7b9a2960261e5 100644 --- a/src/arome/turb/modd_cturb.F90 +++ b/src/common/turb/modd_cturb.F90 @@ -1,4 +1,8 @@ -! ######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_CTURB ! ####################### ! @@ -28,6 +32,7 @@ !! Original 08/08/94 !! Nov 06, 2002 (V. Masson) add XALPSBL and XASBL !! May 06 Remove EPS +!! Jan 2019 (Q. Rodier) Remove XASBL !---------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -64,7 +69,6 @@ REAL,SAVE :: XLINI ! initial value for BL mixing length REAL,SAVE :: XLINF ! to prevent division by zero in the BL algorithm ! REAL,SAVE :: XALPSBL ! constant linking TKE and friction velocity in the SBL -REAL,SAVE :: XASBL ! constant used to define mixing length in the SBL ! REAL,SAVE :: XCEP ! Constant for wind pressure-correlations REAL,SAVE :: XA0 ! Constant a0 for wind pressure-correlations @@ -77,6 +81,6 @@ REAL,SAVE :: XCTP ! Constant for temperature and vapor pressure-correlat REAL,SAVE :: XPHI_LIM ! Threshold value for Phi3 and Psi3 REAL,SAVE :: XSBL_O_BL ! SBL height / BL height ratio REAL,SAVE :: XFTOP_O_FSURF! Fraction of surface (heat or momentum) flux used to define top of BL -! LOGICAL,SAVE :: LHARAT ! SWITCH HARATU +! END MODULE MODD_CTURB diff --git a/src/common/turb/bl89.F90 b/src/common/turb/mode_bl89.F90 similarity index 96% rename from src/common/turb/bl89.F90 rename to src/common/turb/mode_bl89.F90 index 57056e4815f6fb65ae1ff202472d58ed1f7810c6..1a5506d6b4392d4f4d8e4b13fcb363f5b494379a 100644 --- a/src/common/turb/bl89.F90 +++ b/src/common/turb/mode_bl89.F90 @@ -1,5 +1,12 @@ +!MNH_LIC Copyright 1994-2022 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_BL89 +IMPLICIT NONE +CONTAINS ! ######spl - SUBROUTINE BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,PTHLM,KRR,PRM,PTKEM,PSHEAR,PLM) + SUBROUTINE BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,PTHLM,KRR,PRM,PTKEM,PSHEAR,PLM,OOCEAN) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ######################################################### @@ -52,7 +59,6 @@ USE MODD_CONF, ONLY: CPROGRAM USE MODD_CST USE MODD_CTURB -USE MODD_DYN_n, ONLY: LOCEAN USE MODD_PARAMETERS USE MODD_PRECISION, ONLY: MNHREAL ! @@ -74,6 +80,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! water var. REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE REAL, DIMENSION(:,:,:), INTENT(IN) :: PSHEAR REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM ! Mixing length +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version ! thermodynamical variables PTHLM=Theta at the begining ! !* 0.2 Declaration of local variables @@ -153,7 +160,7 @@ ELSE ZSHEAR (:,JK) = RESHAPE(PSHEAR (:,:,JK),(/ IIU*IJU /) ) ZTKEM (:,JK) = RESHAPE(PTKEM (:,:,JK),(/ IIU*IJU /) ) ZG_O_THVREF(:,JK) = RESHAPE(XG/PTHVREF(:,:,JK),(/ IIU*IJU /) ) - IF (LOCEAN) ZG_O_THVREF(:,JK) = XG * XALPHAOC + IF (OOCEAN) ZG_O_THVREF(:,JK) = XG * XALPHAOC DO JRR=1,KRR ZRM (:,JK,JRR) = RESHAPE(PRM (:,:,JK,JRR),(/ IIU*IJU /) ) END DO @@ -348,3 +355,4 @@ END IF ! IF (LHOOK) CALL DR_HOOK('BL89',1,ZHOOK_HANDLE) END SUBROUTINE BL89 +END MODULE MODE_BL89 diff --git a/src/arome/turb/bl_depth_diag_3d.F90 b/src/common/turb/mode_bl_depth_diag.F90 similarity index 57% rename from src/arome/turb/bl_depth_diag_3d.F90 rename to src/common/turb/mode_bl_depth_diag.F90 index 78ce7c72a1dcca18bab4db48b5a002c1b7103dfa..3cf56530a1969c0ebc35cf56bb74b7a1bc59eb1d 100644 --- a/src/arome/turb/bl_depth_diag_3d.F90 +++ b/src/common/turb/mode_bl_depth_diag.F90 @@ -1,4 +1,16 @@ -! ######spl +!MNH_LIC Copyright 1994-2022 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_BL_DEPTH_DIAG +! +INTERFACE BL_DEPTH_DIAG + MODULE PROCEDURE BL_DEPTH_DIAG_3D + MODULE PROCEDURE BL_DEPTH_DIAG_1D +END INTERFACE +! +CONTAINS +! FUNCTION BL_DEPTH_DIAG_3D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -91,3 +103,41 @@ BL_DEPTH_DIAG_3D(:,:) = BL_DEPTH_DIAG_3D(:,:) / (1. - PFTOP_O_FSURF) ! IF (LHOOK) CALL DR_HOOK('BL_DEPTH_DIAG_3D',1,ZHOOK_HANDLE) END FUNCTION BL_DEPTH_DIAG_3D +! +FUNCTION BL_DEPTH_DIAG_1D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! +IMPLICIT NONE +! +INTEGER, INTENT(IN) :: KKB ! bottom point +INTEGER, INTENT(IN) :: KKE ! top point +REAL, INTENT(IN) :: PSURF ! surface flux +REAL, INTENT(IN) :: PZS ! orography +REAL, DIMENSION(:), INTENT(IN) :: PFLUX ! flux +REAL, DIMENSION(:), INTENT(IN) :: PZZ ! altitude of flux points +REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux +REAL :: BL_DEPTH_DIAG_1D +! +REAL, DIMENSION(1,1) :: ZSURF +REAL, DIMENSION(1,1) :: ZZS +REAL, DIMENSION(1,1,SIZE(PFLUX)) :: ZFLUX +REAL, DIMENSION(1,1,SIZE(PZZ)) :: ZZZ +REAL, DIMENSION(1,1) :: ZBL_DEPTH_DIAG +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('BL_DEPTH_DIAG_1D',0,ZHOOK_HANDLE) +ZSURF = PSURF +ZZS = PZS +ZFLUX(1,1,:) = PFLUX(:) +ZZZ (1,1,:) = PZZ (:) +! +ZBL_DEPTH_DIAG = BL_DEPTH_DIAG_3D(KKB,KKE,ZSURF,ZZS,ZFLUX,ZZZ,PFTOP_O_FSURF) +! +BL_DEPTH_DIAG_1D = ZBL_DEPTH_DIAG(1,1) +! +!------------------------------------------------------------------------------- +! +IF (LHOOK) CALL DR_HOOK('BL_DEPTH_DIAG_1D',1,ZHOOK_HANDLE) +END FUNCTION BL_DEPTH_DIAG_1D +END MODULE MODE_BL_DEPTH_DIAG diff --git a/src/common/turb/mode_coefj.f90 b/src/common/turb/mode_coefj.f90 new file mode 100644 index 0000000000000000000000000000000000000000..239b3f63c3c5a3c774fd10014840d4e42bc9a17e --- /dev/null +++ b/src/common/turb/mode_coefj.f90 @@ -0,0 +1,135 @@ +!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 turb 2006/05/18 13:07:25 +!----------------------------------------------------------------- +!################ +MODULE MODE_COEFJ +IMPLICIT NONE +CONTAINS +! ####################################################### + FUNCTION COEFJ(PTHL,PEXNREF,PFRAC_ICE) RESULT(PCOEFJ) +! ####################################################### +! +! PURPOSE +!! ------- +! COEFJ computes the coefficient J of the documentation. +! +!!** METHOD +!! ------ rvs(Tl) Lv(Tl) +!! The value of this coefficient is J = --------------, for rc only +!! Rv Tl THETAl +!! +!! rvsw(Tl) Lv(Tl) rvsi(Tl) Ls(Tl) +!! or --------------- (1-Pfrac_ri) + --------------- Pfrac_ri, for rc+ri. +!! Rv Tl THETAl Rv Tl THETAl +!! +!! EXTERNAL +!! -------- +!! None. +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants. +!! +!! REFERENCE +!! --------- +!! Book 1 of documentation of Meso-NH +!! Book 2 of documentation of Meso-NH +!! +!! +!! AUTHOR +!! ------ +!! Jean-Marie Carriere * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/03/95 +!! J.-P. Pinty 20/02/03 add non-precipitating ice +!! +!! ---------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +USE MODD_CST +! +IMPLICIT NONE +! +!* 0.1 declarations of arguments and result +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHL ! Temperature variable +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Exner function of the +! reference state +REAL, DIMENSION(:,:,:), INTENT(IN), OPTIONAL :: PFRAC_ICE + ! Fraction of ri in the + ! non-precipating + ! "rc+ri" condensate +! +REAL,DIMENSION(SIZE(PTHL,1),SIZE(PTHL,2),SIZE(PTHL,3)):: PCOEFJ ! result +! +!* 0.2 declarations of local variables +! +REAL,DIMENSION(SIZE(PTHL,1),SIZE(PTHL,2),SIZE(PTHL,3)) :: & + ZTL, ZL, ZES, ZRVS, ZP +! ZTL = Tl, ZL = Lv(Tl) or Ls(Tl), ZES = esw(Tl) or esi(Tl) +! ZRVS = rvsw(Tl) or rvsi(Tl), ZP = p +! +REAL :: ZEPS ! = Mv/Md +!--------------------------------------------------------------------------- +! +!* 1. COMPUTATION OF Tl +! ----------------- +! +ZTL(:,:,:) = PTHL(:,:,:) * PEXNREF(:,:,:) +! +!* 2. COMPUTATION OF Lv(Tl) +! --------------------- +! +ZL(:,:,:) = XLVTT + ( XCPV - XCL ) * ( ZTL(:,:,:) -XTT ) +! +!* 3. COMPUTATION OF rvs(Tl) +! ---------------------- +! +ZEPS = XMV/XMD +ZP(:,:,:) = (PEXNREF(:,:,:)**(XCPD/XRD))*XP00 +ZES(:,:,:) = EXP( XALPW - XBETAW/ZTL(:,:,:) - XGAMW*ALOG(ZTL(:,:,:) ) ) +ZRVS(:,:,:) = ZES(:,:,:) * ZEPS / ( ZP(:,:,:) - ZES(:,:,:) ) +! +! 4. RESULT FOR rc only +! ------------------ +! +PCOEFJ(:,:,:) = ZRVS(:,:,:)*ZL(:,:,:)/ & + ( XRV*ZTL(:,:,:)*PTHL(:,:,:) ) +! +! Add case when rc+ri +! +IF(PRESENT(PFRAC_ICE)) THEN +! +!* 5. COMPUTATION OF Ls(Tl) +! --------------------- +! + ZL(:,:,:) = XLSTT + ( XCPV - XCI ) * ( ZTL(:,:,:) -XTT ) +! +!* 6. COMPUTATION OF rvs(Tl) +! ---------------------- +! + ZES(:,:,:) = EXP( XALPI - XBETAI/ZTL(:,:,:) - XGAMI*ALOG(ZTL(:,:,:) ) ) + ZRVS(:,:,:) = ZES(:,:,:) * ZEPS / ( ZP(:,:,:) - ZES(:,:,:) ) +! +! 7. RESULT FOR rc and ri +! -------------------- +! + PCOEFJ(:,:,:) = (1.0 - PFRAC_ICE(:,:,:))*PCOEFJ(:,:,:) & + + PFRAC_ICE(:,:,:) *ZRVS(:,:,:)*ZL(:,:,:)/ & + ( XRV*ZTL(:,:,:)*PTHL(:,:,:) ) +END IF +! +!--------------------------------------------------------------------------- +! +END FUNCTION COEFJ +END MODULE MODE_COEFJ diff --git a/src/common/turb/mode_compute_entr_detr.F90 b/src/common/turb/mode_compute_entr_detr.F90 index 0b4ba055584d29363adc3a12948d23e18d5428d4..7d8fae529856f3a50b886d7d64389b5b8f30f7e2 100644 --- a/src/common/turb/mode_compute_entr_detr.F90 +++ b/src/common/turb/mode_compute_entr_detr.F90 @@ -77,8 +77,8 @@ USE MODD_CST ! USE MODD_PARAM_MFSHALL_n ! -USE MODI_TH_R_FROM_THL_RT_1D - +USE MODE_TH_R_FROM_THL_RT_1D, ONLY: TH_R_FROM_THL_RT_1D +! USE MODE_THERMO USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -283,7 +283,7 @@ ENDDO CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,ZFRAC_ICE,& PPRE_PLUS_HALF,PTHL_UP,PRT_UP,& ZTHMIX,ZRVMIX,ZRCMIX,ZRIMIX,& - ZRSATW, ZRSATI) + ZRSATW, ZRSATI,OOCEAN=.FALSE.) ZTHV_UP_F2(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+PRT_UP(:)) ! Integral buoyancy for cloudy part @@ -349,14 +349,18 @@ DO JLOOP=1,SIZE(OTEST) (PRTM(JLOOP,KK)-ZDZ*(PRTM(JLOOP,KK)-PRTM(JLOOP,JI))/PDZZ(JLOOP,KK)) + & (1. - ZKIC_INIT)*PRT_UP(JLOOP) ELSE +#ifdef REPRO55 + ZMIXTHL(JLOOP) = 0.1 +#else ZMIXTHL(JLOOP) = 300. +#endif ZMIXRT(JLOOP) = 0.1 ENDIF ENDDO CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,ZFRAC_ICE,& ZPRE,ZMIXTHL,ZMIXRT,& ZTHMIX,ZRVMIX,PRC_MIX,PRI_MIX,& - ZRSATW, ZRSATI) + ZRSATW, ZRSATI,OOCEAN=.FALSE.) ZTHVMIX(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+ZMIXRT(:)) ! Compute cons then non cons. var. of mixture at the flux level KK+KKL with initial ZKIC @@ -365,7 +369,7 @@ ENDDO CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,ZFRAC_ICE,& PPRE_PLUS_HALF,ZMIXTHL,ZMIXRT,& ZTHMIX,ZRVMIX,PRC_MIX,PRI_MIX,& - ZRSATW, ZRSATI) + ZRSATW, ZRSATI,OOCEAN=.FALSE.) ZTHVMIX_F2(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+ZMIXRT(:)) !Computation of mean ZKIC over the cloudy part diff --git a/src/common/turb/mode_compute_mf_cloud_direct.F90 b/src/common/turb/mode_compute_mf_cloud_direct.F90 index 090e49e487bce7f09e8258a00767572ed26150b2..8db27676d2e1d61c5d6dfd5b859699106e6756c2 100644 --- a/src/common/turb/mode_compute_mf_cloud_direct.F90 +++ b/src/common/turb/mode_compute_mf_cloud_direct.F90 @@ -90,10 +90,14 @@ PRI_MF(:,:)=0. PCF_MF(:,:)=0. DO JI=1,SIZE(PCF_MF,1) +#ifdef REPRO48 JK0=KKLCL(JI)-KKL ! first mass level with cloud JK0=MAX(JK0, MIN(KKB,KKE)) !protection if KKL=1 JK0=MIN(JK0, MAX(KKB,KKE)) !protection if KKL=-1 DO JK=JK0,KKE-KKL,KKL +#else + DO JK=KKLCL(JI),KKE-KKL,KKL +#endif PCF_MF(JI,JK ) = MAX( 0., MIN(1.,XKCF_MF *0.5* ( & & PFRAC_UP(JI,JK) + PFRAC_UP(JI,JK+KKL) ) )) PRC_MF(JI,JK) = 0.5* XKCF_MF * ( PFRAC_UP(JI,JK)*PRC_UP(JI,JK) & diff --git a/src/common/turb/mode_compute_updraft.F90 b/src/common/turb/mode_compute_updraft.F90 index b8c7f64c50fd4d550e0cf930402ae62bb37e5476..f3b480826cbba990948d580dd7f9d1ccbda64702 100644 --- a/src/common/turb/mode_compute_updraft.F90 +++ b/src/common/turb/mode_compute_updraft.F90 @@ -71,7 +71,7 @@ USE MODD_PARAM_MFSHALL_n, ONLY: LGZ, XALP_PERT, XCMF, XPRES_UV, XFRAC_UP_MAX, & USE MODD_TURB_n, ONLY : CTURBLEN USE MODE_COMPUTE_ENTR_DETR, ONLY: COMPUTE_ENTR_DETR -USE MODI_TH_R_FROM_THL_RT_1D +USE MODE_TH_R_FROM_THL_RT_1D, ONLY: TH_R_FROM_THL_RT_1D USE MODI_SHUMAN_MF, ONLY: MZM_MF, MZF_MF, GZ_M_W_MF USE MODE_COMPUTE_BL89_ML, ONLY: COMPUTE_BL89_ML @@ -295,7 +295,7 @@ IF (OENTR_DETR) THEN PRI_UP(:,KKB)=0. CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,KKB),ZPRES_F(:,KKB), & PTHL_UP(:,KKB),PRT_UP(:,KKB),ZTH_UP(:,KKB), & - PRV_UP(:,KKB),PRC_UP(:,KKB),PRI_UP(:,KKB),ZRSATW(:),ZRSATI(:)) + PRV_UP(:,KKB),PRC_UP(:,KKB),PRI_UP(:,KKB),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.) ! compute updraft thevav and buoyancy term at KKB level PTHV_UP(:,KKB) = ZTH_UP(:,KKB)*((1+ZRVORD*PRV_UP(:,KKB))/(1+PRT_UP(:,KKB))) @@ -319,7 +319,11 @@ IF (OENTR_DETR) THEN ZSHEAR = 0. !no shear in bl89 mixing length END IF ! +#ifdef REPRO48 CALL COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ,ZTKEM_F(:,KKB),ZG_O_THVREF(:,KKB),ZTHVM,KKB,GLMIX,.TRUE.,ZSHEAR,ZLUP) +#else + CALL COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ,ZTKEM_F(:,KKB),ZG_O_THVREF(:,KKB),ZTHVM,KKB,GLMIX,.FALSE.,ZSHEAR,ZLUP) +#endif ZLUP(:)=MAX(ZLUP(:),1.E-10) ! Compute Buoyancy flux at the ground @@ -425,11 +429,15 @@ DO JK=KKB,KKE-KKL,KKL ZMIX2(JLOOP) = (PZZ(JLOOP,JK+KKL)-PZZ(JLOOP,JK))*PENTR(JLOOP,JK) !& ZMIX3_CLD(JLOOP) = (PZZ(JLOOP,JK+KKL)-PZZ(JLOOP,JK))*(1.-ZPART_DRY(JLOOP))*ZDETR_CLD(JLOOP,JK) !& ZMIX2_CLD(JLOOP) = (PZZ(JLOOP,JK+KKL)-PZZ(JLOOP,JK))*(1.-ZPART_DRY(JLOOP))*ZENTR_CLD(JLOOP,JK) - +#ifdef REPRO48 PTHL_UP(JLOOP,JK+KKL)=(PTHL_UP(JLOOP,JK)*(1.-0.5*ZMIX2(JLOOP)) + PTHLM(JLOOP,JK)*ZMIX2(JLOOP)) & /(1.+0.5*ZMIX2(JLOOP)) PRT_UP(JLOOP,JK+KKL) =(PRT_UP (JLOOP,JK)*(1.-0.5*ZMIX2(JLOOP)) + PRTM(JLOOP,JK)*ZMIX2(JLOOP)) & /(1.+0.5*ZMIX2(JLOOP)) +#else + PTHL_UP(JLOOP,JK+KKL)=PTHL_UP(JLOOP,JK)*EXP(-ZMIX2(JLOOP)) + PTHLM(JLOOP,JK)*(1-EXP(-ZMIX2(JLOOP))) + PRT_UP(JLOOP,JK+KKL) =PRT_UP (JLOOP,JK)*EXP(-ZMIX2(JLOOP)) + PRTM(JLOOP,JK)*(1-EXP(-ZMIX2(JLOOP))) +#endif ENDIF ENDDO @@ -477,7 +485,7 @@ DO JK=KKB,KKE-KKL,KKL ZRI_UP(:)=PRI_UP(:,JK) ! guess = level just below CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,JK+KKL),ZPRES_F(:,JK+KKL), & PTHL_UP(:,JK+KKL),PRT_UP(:,JK+KKL),ZTH_UP(:,JK+KKL), & - ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:)) + ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:), OOCEAN=.FALSE.) WHERE(GTEST) PRC_UP(:,JK+KKL)=ZRC_UP(:) PRV_UP(:,JK+KKL)=ZRV_UP(:) diff --git a/src/common/turb/mode_compute_updraft_raha.F90 b/src/common/turb/mode_compute_updraft_raha.F90 index 4082137400341dae238ad5e23349e25eb1726700..41414ea157c7fd1d5772da28eca198bb52ce4991 100644 --- a/src/common/turb/mode_compute_updraft_raha.F90 +++ b/src/common/turb/mode_compute_updraft_raha.F90 @@ -62,7 +62,7 @@ CONTAINS USE MODD_CST USE MODD_PARAM_MFSHALL_n -USE MODI_TH_R_FROM_THL_RT_1D +USE MODE_TH_R_FROM_THL_RT_1D, ONLY: TH_R_FROM_THL_RT_1D USE MODI_SHUMAN_MF, ONLY: MZM_MF ! USE PARKIND1, ONLY : JPRB @@ -303,7 +303,7 @@ PRI_UP(:,KKB)=0. CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,KKB),ZPRES_F(:,KKB), & PTHL_UP(:,KKB),PRT_UP(:,KKB),ZTH_UP(:,KKB), & - PRV_UP(:,KKB),PRC_UP(:,KKB),PRI_UP(:,KKB),ZRSATW(:),ZRSATI(:)) + PRV_UP(:,KKB),PRC_UP(:,KKB),PRI_UP(:,KKB),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.) ! compute updraft thevav and buoyancy term at KKB level PTHV_UP(:,KKB) = ZTH_UP(:,KKB)*((1+ZRVORD*PRV_UP(:,KKB))/(1+PRT_UP(:,KKB))) @@ -482,7 +482,7 @@ DO JK=KKB,KKE-KKL,KKL ZRV_UP(:)=PRV_UP(:,JK) CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,JK+KKL),ZPRES_F(:,JK+KKL), & PTHL_UP(:,JK+KKL),PRT_UP(:,JK+KKL),ZTH_UP(:,JK+KKL), & - ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:)) + ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.) WHERE(GTEST) ZT_UP(:) = ZTH_UP(:,JK+KKL)*PEXNM(:,JK+KKL) ZCP(:) = XCPD + XCL * ZRC_UP(:) diff --git a/src/arome/turb/mode_compute_updraft_rhcj10.F90 b/src/common/turb/mode_compute_updraft_rhcj10.F90 similarity index 88% rename from src/arome/turb/mode_compute_updraft_rhcj10.F90 rename to src/common/turb/mode_compute_updraft_rhcj10.F90 index bac5e7f1392f91d9ecc949a76fcfbca35989f890..0392012db244776f3720593fba148057f7a72a29 100644 --- a/src/arome/turb/mode_compute_updraft_rhcj10.F90 +++ b/src/common/turb/mode_compute_updraft_rhcj10.F90 @@ -16,7 +16,7 @@ SUBROUTINE COMPUTE_UPDRAFT_RHCJ10(KKA,KKB,KKE,KKU,KKL,HFRAC_ICE, & PZZ,PDZZ, & PSFTH,PSFRV, & PPABSM,PRHODREF,PUM,PVM, PTKEM, & - PEXNM,PTHM,PRVM,PTHLM,PRTM, & + PTHM,PRVM,PTHLM,PRTM, & PSVM,PTHL_UP,PRT_UP, & PRV_UP,PRC_UP,PRI_UP,PTHV_UP, & PW_UP,PU_UP, PV_UP, PSV_UP, & @@ -63,7 +63,7 @@ SUBROUTINE COMPUTE_UPDRAFT_RHCJ10(KKA,KKB,KKE,KKU,KKL,HFRAC_ICE, & USE MODD_CST USE MODD_PARAM_MFSHALL_n USE MODD_TURB_n, ONLY : CTURBLEN -USE MODI_TH_R_FROM_THL_RT_1D +USE MODE_TH_R_FROM_THL_RT_1D, ONLY: TH_R_FROM_THL_RT_1D USE MODI_SHUMAN_MF, ONLY: MZF_MF, MZM_MF, GZ_M_W_MF USE MODE_COMPUTE_BL89_ML, ONLY: COMPUTE_BL89_ML @@ -100,7 +100,7 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PUM ! u mean wind REAL, DIMENSION(:,:), INTENT(IN) :: PVM ! v mean wind REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! TKE at t-dt ! -REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM ! Exner function at t-dt +!REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM ! Exner function at t-dt REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! pot. temp. at t-dt REAL, DIMENSION(:,:), INTENT(IN) :: PRVM ! vapor mixing ratio at t-dt REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt @@ -139,11 +139,11 @@ REAL, DIMENSION(SIZE(PSVM,1),SIZE(PTHM,2),SIZE(PSVM,3)) :: ZSVM_F ! scalar varia REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZTH_UP ! updraft THETA -REAL, DIMENSION(SIZE(PTHM,1)) :: ZT_UP ! updraft T -REAL, DIMENSION(SIZE(PTHM,1)) :: ZLVOCPEXN ! updraft L -REAL, DIMENSION(SIZE(PTHM,1)) :: ZCP ! updraft cp +!REAL, DIMENSION(SIZE(PTHM,1)) :: ZT_UP ! updraft T +!REAL, DIMENSION(SIZE(PTHM,1)) :: ZLVOCPEXN ! updraft L +!REAL, DIMENSION(SIZE(PTHM,1)) :: ZCP ! updraft cp REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZBUO ! Buoyancy -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZTHS_UP,ZTHSM +!REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZTHS_UP,ZTHSM REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZCOEF ! diminution coefficient for too high clouds @@ -178,7 +178,7 @@ REAL, DIMENSION(SIZE(PTHM,1)) :: ZCOE,ZWCOE,ZBUCOE REAL, DIMENSION(SIZE(PTHM,1)) :: ZDETR_BUO, ZDETR_RT REAL, DIMENSION(SIZE(PTHM,1)) :: ZW_MAX ! w**2 max of the updraft REAL, DIMENSION(SIZE(PTHM,1)) :: ZZTOP ! Top of the updraft -REAL, DIMENSION(SIZE(PTHM,1)) :: ZQTM,ZQT_UP +!REAL, DIMENSION(SIZE(PTHM,1)) :: ZQTM,ZQT_UP REAL :: ZDEPTH_MAX1, ZDEPTH_MAX2 ! control auto-extinction process @@ -254,7 +254,7 @@ ZTKEM_F(:,:) = MZM_MF(PTKEM(:,:), KKA, KKU, KKL) ! This updraft is not yet ready to use scalar variables !DO JSV=1,ISV ! IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE -! *** SR merge AROME/Méso-nh: following two lines come from the AROME version +! *** SR merge AROME/Meso-nh: following two lines come from the AROME version ! ZSVM_F(:,KKB:IKU,JSV) = 0.5*(PSVM(:,KKB:IKU,JSV)+PSVM(:,1:IKU-1,JSV)) ! ZSVM_F(:,1,JSV) = ZSVM_F(:,KKB,JSV) ! *** the following single line comes from the Meso-NH version @@ -276,11 +276,12 @@ PSV_UP(:,:,:)=0. ! thetal_up,rt_up,thetaV_up, w,Buoyancy term and mass flux (PEMF) DO JI=1,IIJU - PTHL_UP(JI,KKB)= ZTHLM_F(JI,KKB)+MAX(0.,MIN(ZTMAX,(PSFTH(JI)/SQRT(ZTKEM_F(JI,KKB)))*XALP_PERT)) - PRT_UP(JI,KKB) = ZRTM_F(JI,KKB)+MAX(0.,MIN(ZRMAX,(PSFRV(JI)/SQRT(ZTKEM_F(JI,KKB)))*XALP_PERT)) - - ZQT_UP(JI) = PRT_UP(JI,KKB)/(1.+PRT_UP(JI,KKB)) - ZTHS_UP(JI,KKB)=PTHL_UP(JI,KKB)*(1.+XLAMBDA_MF*ZQT_UP(JI)) + !PTHL_UP(JI,KKB)= ZTHLM_F(JI,KKB)+MAX(0.,MIN(ZTMAX,(PSFTH(JI)/SQRT(ZTKEM_F(JI,KKB)))*XALP_PERT)) + !PRT_UP(JI,KKB) = ZRTM_F(JI,KKB)+MAX(0.,MIN(ZRMAX,(PSFRV(JI)/SQRT(ZTKEM_F(JI,KKB)))*XALP_PERT)) + PTHL_UP(JI,KKB)= ZTHLM_F(JI,KKB) + PRT_UP(JI,KKB) = ZRTM_F(JI,KKB) + !ZQT_UP(JI) = PRT_UP(JI,KKB)/(1.+PRT_UP(JI,KKB)) + !ZTHS_UP(JI,KKB)=PTHL_UP(JI,KKB)*(1.+XLAMBDA_MF*ZQT_UP(JI)) ENDDO ZTHM_F (:,:) = MZM_MF(PTHM (:,:), KKA, KKU, KKL) @@ -299,7 +300,8 @@ PTHV_UP(:,:)= ZTHVM_F(:,:) PRV_UP (:,:)= ZRVM_F (:,:) ZW_UP2(:,:)=ZEPS -ZW_UP2(:,KKB) = MAX(0.0001,(1./6.)*ZTKEM_F(:,KKB)) +!ZW_UP2(:,KKB) = MAX(0.0001,(3./6.)*ZTKEM_F(:,KKB)) +ZW_UP2(:,KKB) = MAX(0.0001,(2./3.)*ZTKEM_F(:,KKB)) ! Computation of non conservative variable for the KKB level of the updraft ! (all or nothing ajustement) @@ -308,7 +310,7 @@ PRC_UP(:,KKB)=0. PRI_UP(:,KKB)=0. CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,KKB),ZPRES_F(:,KKB), & PTHL_UP(:,KKB),PRT_UP(:,KKB),ZTH_UP(:,KKB), & - PRV_UP(:,KKB),PRC_UP(:,KKB),PRI_UP(:,KKB),ZRSATW(:),ZRSATI(:)) + PRV_UP(:,KKB),PRC_UP(:,KKB),PRI_UP(:,KKB),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.) DO JI=1,IIJU ! compute updraft thevav and buoyancy term at KKB level @@ -338,15 +340,12 @@ IF(CTURBLEN=='RM17') THEN ZDUDZ = MZF_MF(GZ_M_W_MF(PUM,PDZZ, KKA, KKU, KKL), KKA, KKU, KKL) ZDVDZ = MZF_MF(GZ_M_W_MF(PVM,PDZZ, KKA, KKU, KKL), KKA, KKU, KKL) ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) - PRINT*, 'phasage bete sans controle' - CALL ABORT - STOP ELSE ZSHEAR = 0. !no shear in bl89 mixing length END IF ! CALL COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ,ZTKEM_F(:,KKB),ZG_O_THVREF(:,KKB), & - ZTHVM_F,KKB,GLMIX,.FALSE.,ZSHEAR,ZLUP) + ZTHVM_F,KKB,GLMIX,.TRUE.,ZSHEAR,ZLUP) ZLUP(:)=MAX(ZLUP(:),1.E-10) DO JI=1,IIJU @@ -358,8 +357,8 @@ DO JI=1,IIJU IF (ZWTHVSURF>0.010) THEN ! <== Not 0 Important to have stratocumulus !!!!! PEMF(JI,KKB) = XCMF * ZRHO_F(JI,KKB) * ((ZG_O_THVREF(JI,KKB))*ZWTHVSURF*ZLUP(JI))**(1./3.) PFRAC_UP(JI,KKB)=MIN(PEMF(JI,KKB)/(SQRT(ZW_UP2(JI,KKB))*ZRHO_F(JI,KKB)),XFRAC_UP_MAX) - PEMF(JI,KKB) = ZRHO_F(JI,KKB)*PFRAC_UP(JI,KKB)*SQRT(ZW_UP2(JI,KKB)) - ! ZW_UP2(JI,KKB)=(PEMF(JI,KKB)/(PFRAC_UP(JI,KKB)*ZRHO_F(JI,KKB)))**2 + !PEMF(JI,KKB) = ZRHO_F(JI,KKB)*PFRAC_UP(JI,KKB)*SQRT(ZW_UP2(JI,KKB)) + ZW_UP2(JI,KKB)=(PEMF(JI,KKB)/(PFRAC_UP(JI,KKB)*ZRHO_F(JI,KKB)))**2 GTEST(JI)=.TRUE. ELSE PEMF(JI,KKB) =0. @@ -417,7 +416,7 @@ DO JK=KKB,KKE-KKL,KKL ZRV_UP(:) =PRV_UP(:,JK) CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,JK),& PPABSM(:,JK),PTHL_UP(:,JK),PRT_UP(:,JK),& - ZTH_UP(:,JK),ZRV_UP,ZRC_UP,ZRI_UP,ZRSATW(:),ZRSATI(:)) + ZTH_UP(:,JK),ZRV_UP,ZRC_UP,ZRI_UP,ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.) DO JI=1,IIJU IF (GTEST(JI)) THEN @@ -439,7 +438,6 @@ DO JK=KKB,KKE-KKL,KKL ZBUCOE(JI) = 2.*ZCOE(JI)/(1.+XB*ZCOE(JI)) ! Second Rachel bug correction (XA1 has been forgotten) - ZW_UP2(JI,JK+KKL) = MAX(ZEPS,ZW_UP2(JI,JK)*ZWCOE(JI) + XA1*ZBUO(JI,JK)*ZBUCOE(JI) ) ZW_MAX(JI) = MAX(ZW_MAX(JI), SQRT(ZW_UP2(JI,JK+KKL))) ZWUP_MEAN(JI) = MAX(ZEPS,0.5*(ZW_UP2(JI,JK+KKL)+ZW_UP2(JI,JK))) @@ -455,16 +453,17 @@ DO JK=KKB,KKE-KKL,KKL ! If the updraft did not stop, compute cons updraft characteritics at jk+1 ZZTOP(JI) = MAX(ZZTOP(JI),PZZ(JI,JK+KKL)) ZMIX2(JI) = (PZZ(JI,JK+KKL)-PZZ(JI,JK))*PENTR(JI,JK) !& - - ! Utilisation de thetaS - ZQTM(JI) = PRTM(JI,JK)/(1.+PRTM(JI,JK)) - ZTHSM(JI,JK) = PTHLM(JI,JK)*(1.+XLAMBDA_MF*ZQTM(JI)) - ZTHS_UP(JI,JK+KKL)=(ZTHS_UP(JI,JK)*(1.-0.5*ZMIX2(JI)) + ZTHSM(JI,JK)*ZMIX2(JI)) & - /(1.+0.5*ZMIX2(JI)) + + !ZQTM(JI) = PRTM(JI,JK)/(1.+PRTM(JI,JK)) + !ZTHSM(JI,JK) = PTHLM(JI,JK)*(1.+XLAMBDA_MF*ZQTM(JI)) + !ZTHS_UP(JI,JK+KKL)=(ZTHS_UP(JI,JK)*(1.-0.5*ZMIX2(JI)) + ZTHSM(JI,JK)*ZMIX2(JI)) & + ! /(1.+0.5*ZMIX2(JI)) PRT_UP(JI,JK+KKL) =(PRT_UP (JI,JK)*(1.-0.5*ZMIX2(JI)) + PRTM(JI,JK)*ZMIX2(JI)) & /(1.+0.5*ZMIX2(JI)) - ZQT_UP(JI) = PRT_UP(JI,JK+KKL)/(1.+PRT_UP(JI,JK+KKL)) - PTHL_UP(JI,JK+KKL)=ZTHS_UP(JI,JK+KKL)/(1.+XLAMBDA_MF*ZQT_UP(JI)) + !ZQT_UP(JI) = PRT_UP(JI,JK+KKL)/(1.+PRT_UP(JI,JK+KKL)) + !PTHL_UP(JI,JK+KKL)=ZTHS_UP(JI,JK+KKL)/(1.+XLAMBDA_MF*ZQT_UP(JI)) + PTHL_UP(JI,JK+KKL)=(PTHL_UP(JI,JK)*(1.-0.5*ZMIX2(JI)) + PTHLM(JI,JK)*ZMIX2(JI)) & + /(1.+0.5*ZMIX2(JI)) ENDIF ! GTEST ENDDO @@ -517,24 +516,27 @@ DO JK=KKB,KKE-KKL,KKL ZRV_UP(:)=PRV_UP(:,JK) CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,JK+KKL),ZPRES_F(:,JK+KKL), & PTHL_UP(:,JK+KKL),PRT_UP(:,JK+KKL),ZTH_UP(:,JK+KKL), & - ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:)) + ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.) DO JI=1,IIJU IF(GTEST(JI)) THEN - ZT_UP(JI) = ZTH_UP(JI,JK+KKL)*PEXNM(JI,JK+KKL) - ZCP(JI) = XCPD + XCL * ZRC_UP(JI) - ZLVOCPEXN(JI)=(XLVTT + (XCPV-XCL) * (ZT_UP(JI)-XTT) ) / ZCP(JI) / PEXNM(JI,JK+KKL) - PRC_UP(JI,JK+KKL)=MIN(0.5E-3,ZRC_UP(JI)) ! On ne peut depasser 0.5 g/kg (autoconversion donc elimination !) - PTHL_UP(JI,JK+KKL) = PTHL_UP(JI,JK+KKL)+ZLVOCPEXN(JI)*(ZRC_UP(JI)-PRC_UP(JI,JK+KKL)) + !ZT_UP(JI) = ZTH_UP(JI,JK+KKL)*PEXNM(JI,JK+KKL) + !ZCP(JI) = XCPD + XCL * ZRC_UP(JI) + !ZLVOCPEXN(JI)=(XLVTT + (XCPV-XCL) * (ZT_UP(JI)-XTT) ) / ZCP(JI) / PEXNM(JI,JK+KKL) + !PRC_UP(JI,JK+KKL)=MIN(0.5E-3,ZRC_UP(JI)) ! On ne peut depasser 0.5 g/kg (autoconversion donc elimination !) + !PTHL_UP(JI,JK+KKL) = PTHL_UP(JI,JK+KKL)+ZLVOCPEXN(JI)*(ZRC_UP(JI)-PRC_UP(JI,JK+KKL)) + PRC_UP(JI,JK+KKL)=ZRC_UP(JI) PRV_UP(JI,JK+KKL)=ZRV_UP(JI) PRI_UP(JI,JK+KKL)=ZRI_UP(JI) - PRT_UP(JI,JK+KKL) = PRC_UP(JI,JK+KKL) + PRV_UP(JI,JK+KKL) + !PRT_UP(JI,JK+KKL) = PRC_UP(JI,JK+KKL) + PRV_UP(JI,JK+KKL) PRSAT_UP(JI,JK+KKL) = ZRSATW(JI)*(1-PFRAC_ICE_UP(JI,JK+KKL)) + ZRSATI(JI)*PFRAC_ICE_UP(JI,JK+KKL) ! Compute the updraft theta_v, buoyancy and w**2 for level JK+1 !PTHV_UP(:,JK+KKL) = PTH_UP(:,JK+KKL)*((1+ZRVORD*PRV_UP(:,JK+KKL))/(1+PRT_UP(:,JK+KKL))) - PTHV_UP(JI,JK+KKL) = ZTH_UP(JI,JK+KKL)*(1.+0.608*PRV_UP(JI,JK+KKL) - PRC_UP(JI,JK+KKL)) - ! A corriger pour utiliser q et non r !!!! + !PTHV_UP(JI,JK+KKL) = ZTH_UP(JI,JK+KKL)*(1.+0.608*PRV_UP(JI,JK+KKL) - PRC_UP(JI,JK+KKL)) + !! A corriger pour utiliser q et non r !!!! + !ZMIX1(JI)=ZZDZ(JI,JK)*(PENTR(JI,JK)-PDETR(JI,JK)) + PTHV_UP(JI,JK+KKL) = ZTH_UP(JI,JK+KKL)*((1+ZRVORD*PRV_UP(JI,JK+KKL))/(1+PRT_UP(JI,JK+KKL))) ZMIX1(JI)=ZZDZ(JI,JK)*(PENTR(JI,JK)-PDETR(JI,JK)) ENDIF ENDDO @@ -550,7 +552,7 @@ DO JK=KKB,KKE-KKL,KKL ! Updraft fraction must be smaller than XFRAC_UP_MAX PFRAC_UP(JI,JK+KKL)=MIN(XFRAC_UP_MAX, & &PEMF(JI,JK+KKL)/(SQRT(ZW_UP2(JI,JK+KKL))*ZRHO_F(JI,JK+KKL))) - PEMF(JI,JK+KKL) = ZRHO_F(JI,JK+KKL)*PFRAC_UP(JI,JK+KKL)*SQRT(ZW_UP2(JI,JK+KKL)) + !PEMF(JI,JK+KKL) = ZRHO_F(JI,JK+KKL)*PFRAC_UP(JI,JK+KKL)*SQRT(ZW_UP2(JI,JK+KKL)) ENDIF ENDDO diff --git a/src/common/turb/emoist.F90 b/src/common/turb/mode_emoist.F90 similarity index 95% rename from src/common/turb/emoist.F90 rename to src/common/turb/mode_emoist.F90 index f17bc3168c165b43e3bac222dad961b974e4834f..42e978ae689948613cd12df7360ea1febc2928b9 100644 --- a/src/common/turb/emoist.F90 +++ b/src/common/turb/mode_emoist.F90 @@ -1,9 +1,11 @@ -!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-2022 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. -! ######spl -FUNCTION EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) RESULT(PEMOIST) +MODULE MODE_EMOIST +IMPLICIT NONE +CONTAINS +FUNCTION EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM,OOCEAN) RESULT(PEMOIST) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ############################################################################ @@ -56,7 +58,6 @@ USE YOMHOOK , ONLY : LHOOK, DR_HOOK !* 0. DECLARATIONS ! ------------ USE MODD_CST -USE MODD_DYN_n, ONLY : LOCEAN ! IMPLICIT NONE ! @@ -65,6 +66,7 @@ IMPLICIT NONE ! INTEGER :: KRR ! number of moist var. INTEGER :: KRRI ! number of ice var. +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! Conservative pot. temperature REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios, where @@ -93,7 +95,7 @@ INTEGER :: JRR ! moist loop counter REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('EMOIST',0,ZHOOK_HANDLE) ! -IF (LOCEAN) THEN +IF (OOCEAN) THEN IF ( KRR == 0 ) THEN ! Unsalted PEMOIST(:,:,:) = 0. ELSE @@ -162,3 +164,4 @@ END IF ! IF (LHOOK) CALL DR_HOOK('EMOIST',1,ZHOOK_HANDLE) END FUNCTION EMOIST +END MODULE MODE_EMOIST diff --git a/src/common/turb/etheta.F90 b/src/common/turb/mode_etheta.F90 similarity index 95% rename from src/common/turb/etheta.F90 rename to src/common/turb/mode_etheta.F90 index f0506bd89dc5fc455e55281835ba7c1ab6b2365c..536133615c743dc04bd48eefeca355fa87992d60 100644 --- a/src/common/turb/etheta.F90 +++ b/src/common/turb/mode_etheta.F90 @@ -2,8 +2,10 @@ !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. -! ######spl -FUNCTION ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) RESULT(PETHETA) +MODULE MODE_ETHETA +IMPLICIT NONE +CONTAINS +FUNCTION ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM,OOCEAN) RESULT(PETHETA) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ############################################################################ @@ -55,7 +57,6 @@ USE YOMHOOK , ONLY : LHOOK, DR_HOOK !* 0. DECLARATIONS ! ------------ USE MODD_CST -USE MODD_DYN_n, ONLY : LOCEAN ! IMPLICIT NONE ! @@ -64,6 +65,7 @@ IMPLICIT NONE ! INTEGER :: KRR ! number of moist var. INTEGER :: KRRI ! number of ice var. +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! Conservative pot. temperature REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios, where @@ -95,7 +97,7 @@ INTEGER :: JRR ! moist loop counter ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('ETHETA',0,ZHOOK_HANDLE) -IF (LOCEAN) THEN ! ocean case +IF (OOCEAN) THEN ! ocean case PETHETA(:,:,:) = 1. ELSE IF ( KRR == 0) THEN ! dry case @@ -153,3 +155,4 @@ END IF ! IF (LHOOK) CALL DR_HOOK('ETHETA',1,ZHOOK_HANDLE) END FUNCTION ETHETA +END MODULE MODE_ETHETA diff --git a/src/common/turb/mode_mf_turb.F90 b/src/common/turb/mode_mf_turb.F90 index 86f1d2f311ec85ab6c0997c594572caf87a684b7..7f9e698ce2f108aa9b5fc33d8a6ccbfdaa2f0d40 100644 --- a/src/common/turb/mode_mf_turb.F90 +++ b/src/common/turb/mode_mf_turb.F90 @@ -63,7 +63,10 @@ CONTAINS ! ------------ ! USE MODI_SHUMAN_MF, ONLY: MZM_MF -USE MODI_TRIDIAG_MASSFLUX +USE MODE_TRIDIAG_MASSFLUX, ONLY: TRIDIAG_MASSFLUX +! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK diff --git a/src/arome/turb/mode_prandtl.F90 b/src/common/turb/mode_prandtl.F90 similarity index 77% rename from src/arome/turb/mode_prandtl.F90 rename to src/common/turb/mode_prandtl.F90 index d460f8e0bc4b5af58dc41c7adef903aa53ae1f67..ec71f8db23686f1b59281dd1ecb8ede1d799eaaa 100644 --- a/src/arome/turb/mode_prandtl.F90 +++ b/src/common/turb/mode_prandtl.F90 @@ -1,4 +1,9 @@ -! ######spl +!MNH_LIC Copyright 1994-2020 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_PRANDTL USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -6,6 +11,7 @@ ! !* modification 08/2010 V. Masson smoothing of the discontinuity in functions ! used for implicitation of exchange coefficients +! 05/2020 V. Masson and C. Lac : bug in D_PHI3DTDZ2_O_DDTDZ ! USE MODD_CTURB, ONLY : XCTV, XCSHF, XCTD, XPHI_LIM, XCPR3, XCPR4, XCPR5 USE MODD_PARAMETERS, ONLY : JPVEXT_TURB @@ -15,6 +21,539 @@ IMPLICIT NONE !---------------------------------------------------------------------------- CONTAINS !---------------------------------------------------------------------------- + SUBROUTINE PRANDTL(KKA,KKU,KKL,KRR,KRRI,OTURB_DIAG, & + HTURBDIM,OOCEAN, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & + PLM,PLEPS,PTKEM,PTHLM,PRM,PSVM,PSRCM, & + PREDTH1,PREDR1, & + PRED2TH3, PRED2R3, PRED2THR3, & + PREDS1,PRED2THS3, PRED2RS3, & + PBLL_O_E, & + PETHETA, PEMOIST ) +! ########################################################### +! +! +!!**** *PRANDTL* - routine to compute the Prandtl turbulent numbers +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute the Redelsperger +! numbers and then get the turbulent Prandtl and Schmidt numbers: +! * for the heat fluxes - PHI3 = 1/ Prandtl +! * for the moisture fluxes - PSI3 = 1/ Schmidt +! +!!** METHOD +!! ------ +!! The following steps are performed: +!! +!! 1 - default values of 1 are taken for phi3 and psi3 and different masks +!! are defined depending on the presence of turbulence, stratification and +!! humidity. The 1D Redelsperger numbers are computed +!! * ZREDTH1 : (g / THVREF ) (LT**2 / TKE ) ETHETA (D Theta / Dz) +!! * ZREDR1 : (g / THVREF ) (LT**2 / TKE ) EMOIST (D TW / Dz) +!! 2 - 3D Redelsperger numbers are computed only for turbulent +!! grid points where ZREDTH1 or ZREDR1 are > 0. +!! 3 - PHI3 is computed only for turbulent grid points where ZREDTH1 > 0 +!! (turbulent thermally stratified points) +!! 4 - PSI3 is computed only for turbulent grid points where ZREDR1 > 0 +!! (turbulent moist points) +!! +!! +!! EXTERNAL +!! -------- +!! FUNCTIONs ETHETA and EMOIST : +!! allows to compute the coefficients +!! for the turbulent correlation between any variable +!! and the virtual potential temperature, of its correlations +!! with the conservative potential temperature and the humidity +!! conservative variable: +!! ------- ------- ------- +!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' +!! +!! GX_M_M, GY_M_M, GZ_M_M : Cartesian gradient operators +!! MZM : Shuman function (mean operator in the z direction) +!! Module MODI_ETHETA : interface module for ETHETA +!! Module MODI_EMOIST : interface module for EMOIST +!! Module MODI_SHUMAN : interface module for Shuman operators +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! XG : gravity constant +!! +!! Module MODD_CTURB: contains the set of constants for +!! the turbulence scheme +!! XCTV,XCPR2 : constants for the turbulent prandtl numbers +!! XTKEMIN : minimum value allowed for the TKE +!! +!! Module MODD_PARAMETERS +!! JPVEXT_TURB : number of vertical marginal points +!! +!! REFERENCE +!! --------- +!! Book 2 of documentation (routine PRANDTL) +!! Book 1 of documentation (Chapter: Turbulence) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/10/94 +!! Modifications: Feb 14, 1995 (J.Cuxart and J.Stein) +!! Doctorization and Optimization +!! Modifications: March 21, 1995 (J.M. Carriere) +!! Introduction of cloud water +!! Modifications: March 21, 1995 (J. Cuxart and J.Stein) +!! Phi3 and Psi3 at w point + cleaning +!! Modifications: July 2, 1995 (J.Cuxart and Ph.Bougeault) +!! change the value of Phi3 and Psi3 if negative +!! Modifications: Sept 20, 1995 (J. Stein, J. Cuxart, J.L. Redelsperger) +!! remove the Where + use REDTH1+REDR1 for the tests +!! Modifications: October 10, 1995 (J. Cuxart and J.Stein) +!! Psi3 for tPREDS1he scalar variables +!! Modifications: February 27, 1996 (J.Stein) optimization +!! Modifications: June 15, 1996 (P.Jabouille) return to the previous +!! computation of Phi3 and Psi3 +!! Modifications: October 10, 1996 (J. Stein) change the temporal +!! discretization +!! Modifications: May 23, 1997 (J. Stein) bug in 3D Redels number at ground +!! with orography +!! Modifications: Feb 20, 1998 (J. Stein) bug in all the 3D cases due to +!! the use of ZW1 instead of ZW2 +!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE +!! July 2005 (Tomas, Masson) implicitation of PHI3 and PSI3 +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! 2012-02 Y. Seity, add possibility to run with reversed +!! vertical levels +!! Modifications: July 2015 (Wim de Rooy) LHARAT (Racmo turbulence) switch +!! 2017-09 J.Escobar, use epsilon XMNH_TINY_12 for R*4 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! JL Redelsperger 03/2021 : adding Ocean case for temperature only +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! +USE MODD_CST +USE MODD_CONF +USE MODD_CTURB +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +! +USE MODI_GRADIENT_M +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA +USE MODI_SHUMAN, ONLY: MZM +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO + +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRI ! number of ice var. +! +LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some + ! diagnostic fields in the syncronous FM-file +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +CHARACTER(LEN=4), INTENT(IN) :: HTURBDIM ! Kind of turbulence param. +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY + ! metric coefficients +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential Temp. + ! of the reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turbulent Mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! Dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM,PTKEM! Conservative Potential + ! Temperature and TKE at t-1 +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-1 + ! with PRM(:,:,:,1) = cons. + ! mixing ratio +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Scalars at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM + ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +! +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDTH1 ! Redelsperger number R_theta +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDR1 ! Redelsperger number R_q +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2TH3 ! Redelsperger number R*2_theta +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2R3 ! Redelsperger number R*2_q +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2THR3! Redelsperger number R*2_thq +REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PREDS1 ! Redelsperger number R_s +REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2THS3! Redelsperger number R*2_thsv +REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2RS3 ! Redelsperger number R*2_qsv +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBLL_O_E! beta*Lk*Leps/tke +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PETHETA ! coefficient E_theta +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMOIST ! coefficient E_moist +! +! +! 0.2 declaration of local variables +! +REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & + ZW1, ZW2, ZW3 +! working variables +! +INTEGER :: IKB ! vertical index value for the first inner mass point +INTEGER :: IKE ! vertical index value for the last inner mass point +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: ILENG ! Length of the data field in LFIFM file +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 +INTEGER:: ISV ! number of scalar variables +INTEGER:: JSV ! loop index for the scalar variables + +INTEGER :: JLOOP +REAL :: ZMINVAL +TYPE(TFIELDDATA) :: TZFIELD +! --------------------------------------------------------------------------- +! +!* 1. DEFAULT VALUES, 1D REDELSPERGER NUMBERS +! ---------------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('PRANDTL',0,ZHOOK_HANDLE) + +IF (LHARAT) THEN +PREDTH1(:,:,:)=0. +PREDR1(:,:,:)=0. +PRED2TH3(:,:,:)=0. +PRED2R3(:,:,:)=0. +PRED2THR3(:,:,:)=0. +PREDS1(:,:,:,:)=0. +PRED2THS3(:,:,:,:)=0. +PRED2RS3(:,:,:,:)=0. +PBLL_O_E(:,:,:)=0. +ENDIF +! +IKB = KKA+JPVEXT_TURB*KKL +IKE = KKU-JPVEXT_TURB*KKL +ILENG=SIZE(PTHLM,1)*SIZE(PTHLM,2)*SIZE(PTHLM,3) +ISV =SIZE(PSVM,4) +! +PETHETA(:,:,:) = MZM(ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM,OOCEAN), KKA, KKU, KKL) +PEMOIST(:,:,:) = MZM(EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM,OOCEAN), KKA, KKU, KKL) +PETHETA(:,:,KKA) = 2.*PETHETA(:,:,IKB) - PETHETA(:,:,IKB+KKL) +PEMOIST(:,:,KKA) = 2.*PEMOIST(:,:,IKB) - PEMOIST(:,:,IKB+KKL) +! +!--------------------------------------------------------------------------- +IF (.NOT. LHARAT) THEN +! +! 1.3 1D Redelsperger numbers +! +PBLL_O_E(:,:,:) = MZM(XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:), KKA, KKU, KKL) +IF (KRR /= 0) THEN ! moist case + PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * PETHETA(:,:,:) * & + & GZ_M_W(KKA, KKU, KKL,PTHLM,PDZZ) + PREDR1(:,:,:) = XCTV*PBLL_O_E(:,:,:) * PEMOIST(:,:,:) * & + & GZ_M_W(KKA, KKU, KKL,PRM(:,:,:,1),PDZZ) +ELSE ! dry case + PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * GZ_M_W(KKA, KKU, KKL,PTHLM,PDZZ) + PREDR1(:,:,:) = 0. +END IF +! +! 3. Limits on 1D Redelperger numbers +! -------------------------------- +! +ZMINVAL = (1.-1./XPHI_LIM) +! +ZW1 = 1. +ZW2 = 1. +! +WHERE (PREDTH1+PREDR1<-ZMINVAL) + ZW1 = (-ZMINVAL) / (PREDTH1+PREDR1) +END WHERE +! +WHERE (PREDTH1<-ZMINVAL) + ZW2 = (-ZMINVAL) / (PREDTH1) +END WHERE +ZW2 = MIN(ZW1,ZW2) +! +ZW1 = 1. +WHERE (PREDR1<-ZMINVAL) + ZW1 = (-ZMINVAL) / (PREDR1) +END WHERE +ZW1 = MIN(ZW2,ZW1) +! +! +! 3. Modification of Mixing length and dissipative length +! ---------------------------------------------------- +! +PBLL_O_E(:,:,:) = PBLL_O_E(:,:,:) * ZW1(:,:,:) +PREDTH1 (:,:,:) = PREDTH1 (:,:,:) * ZW1(:,:,:) +PREDR1 (:,:,:) = PREDR1 (:,:,:) * ZW1(:,:,:) +! +! 4. Threshold for very small (in absolute value) Redelperger numbers +! ---------------------------------------------------------------- +! +ZW2=SIGN(1.,PREDTH1(:,:,:)) +PREDTH1(:,:,:)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDTH1(:,:,:)) +! +IF (KRR /= 0) THEN ! dry case + ZW2=SIGN(1.,PREDR1(:,:,:)) + PREDR1(:,:,:)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDR1(:,:,:)) +END IF +! +! +!--------------------------------------------------------------------------- +! +! For the scalar variables +DO JSV=1,ISV + PREDS1(:,:,:,JSV)=XCTV*PBLL_O_E(:,:,:)*GZ_M_W(KKA, KKU, KKL,PSVM(:,:,:,JSV),PDZZ) +END DO +! +DO JSV=1,ISV + ZW2=SIGN(1.,PREDS1(:,:,:,JSV)) + PREDS1(:,:,:,JSV)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDS1(:,:,:,JSV)) +END DO +! +!--------------------------------------------------------------------------- +! +!* 2. 3D REDELSPERGER NUMBERS +! ------------------------ +! +IF(HTURBDIM=='1DIM') THEN ! 1D case +! +! + PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 +! + PRED2R3(:,:,:) = PREDR1(:,:,:) **2 +! + PRED2THR3(:,:,:) = PREDTH1(:,:,:) * PREDR1(:,:,:) +! +ELSE IF (L2D) THEN ! 3D case in a 2D model +! + IF (KRR /= 0) THEN ! moist 3D case + PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2+(XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & + MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) + PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) +! + PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & + MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) + PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) +! + PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & + PEMOIST(:,:,:) * PETHETA(:,:,:) * & + MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL), KKA, KKU, KKL) + PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) +! + ELSE ! dry 3D case in a 2D model + PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & + MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) + PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) +! + PRED2R3(:,:,:) = 0. +! + PRED2THR3(:,:,:) = 0. +! + END IF +! +ELSE ! 3D case in a 3D model +! + IF (KRR /= 0) THEN ! moist 3D case + PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2 + ( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & + MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 & + + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) + PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) +! + PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & + MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 + & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) + PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) +! + PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & + PEMOIST(:,:,:) * PETHETA(:,:,:) * & + MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)+ & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL), KKA, KKU, KKL) + PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) +! + ELSE ! dry 3D case in a 3D model + PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & + MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 & + + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) + PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) +! + PRED2R3(:,:,:) = 0. +! + PRED2THR3(:,:,:) = 0. +! + END IF +! +END IF ! end of the if structure on the turbulence dimensionnality +! +! +!--------------------------------------------------------------------------- +! +! 5. Prandtl numbers for scalars +! --------------------------- +DO JSV=1,ISV +! + IF(HTURBDIM=='1DIM') THEN +! 1D case + PRED2THS3(:,:,:,JSV) = PREDS1(:,:,:,JSV) * PREDTH1(:,:,:) + IF (KRR /= 0) THEN + PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) *PREDS1(:,:,:,JSV) + ELSE + PRED2RS3(:,:,:,JSV) = 0. + END IF +! + ELSE IF (L2D) THEN ! 3D case in a 2D model +! + IF (KRR /= 0) THEN + ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA + ELSE + ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) + END IF + PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & + ZW1* & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL), & + KKA, KKU, KKL) +! + IF (KRR /= 0) THEN + PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & + ZW1 * PEMOIST * & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL), & + KKA, KKU, KKL) + ELSE + PRED2RS3(:,:,:,JSV) = 0. + END IF +! + ELSE ! 3D case in a 3D model +! + IF (KRR /= 0) THEN + ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA + ELSE + ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) + END IF + PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & + ZW1* & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL) & + +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL), & + KKA, KKU, KKL) +! + IF (KRR /= 0) THEN + PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & + ZW1 * PEMOIST * & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL) & + +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL), & + KKA, KKU, KKL) + ELSE + PRED2RS3(:,:,:,JSV) = 0. + END IF +! + END IF ! end of HTURBDIM if-block +! +END DO +! +!--------------------------------------------------------------------------- +! +!* 6. SAVES THE REDELSPERGER NUMBERS +! ------------------------------ +! +IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN + ! + ! stores the RED_TH1 + TZFIELD%CMNHNAME = 'RED_TH1' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED_TH1' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED_TH1' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PREDTH1) + ! + ! stores the RED_R1 + TZFIELD%CMNHNAME = 'RED_R1' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED_R1' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED_R1' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PREDR1) + ! + ! stores the RED2_TH3 + TZFIELD%CMNHNAME = 'RED2_TH3' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED2_TH3' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED2_TH3' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PRED2TH3) + ! + ! stores the RED2_R3 + TZFIELD%CMNHNAME = 'RED2_R3' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED2_R3' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED2_R3' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PRED2R3) + ! + ! stores the RED2_THR3 + TZFIELD%CMNHNAME = 'RED2_THR3' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED2_THR3' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED2_THR3' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PRED2THR3) + ! +END IF +! +!--------------------------------------------------------------------------- +ENDIF ! (Done only if LHARAT is FALSE) +! +IF (LHOOK) CALL DR_HOOK('PRANDTL',1,ZHOOK_HANDLE) +END SUBROUTINE PRANDTL +! SUBROUTINE SMOOTH_TURB_FUNCT(PPHI3,PF_LIM,PF) ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Phi3 @@ -423,12 +962,10 @@ D_M3_WTH_W2TH_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_W2TH_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_W2TH_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WTH_W2TH_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_W2R(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION M3_WTH_W2R(KKA,KKU,KKL,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ) INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE @@ -479,12 +1016,10 @@ D_M3_WTH_W2R_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_W2R_O_DDTDZ(:,:,IKE) IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_W2R_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WTH_W2R_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_WR2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ) +FUNCTION M3_WTH_WR2(KKA,KKU,KKL,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ) INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE @@ -1259,12 +1794,10 @@ D_M3_WR_W2R_O_DDRDZ = D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PBLL_O IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_W2R_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WR_W2R_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_W2TH(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION M3_WR_W2TH(KKA,KKU,KKL,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE @@ -1275,7 +1808,7 @@ FUNCTION M3_WR_W2TH(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PD ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_W2TH',0,ZHOOK_HANDLE) -M3_WR_W2TH = M3_WTH_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) +M3_WR_W2TH = M3_WTH_W2R(KKA,KKU,KKL,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_W2TH',1,ZHOOK_HANDLE) END FUNCTION M3_WR_W2TH @@ -1300,12 +1833,10 @@ D_M3_WR_W2TH_O_DDRDZ = D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF, IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_W2TH_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WR_W2TH_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_WTH2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) +FUNCTION M3_WR_WTH2(KKA,KKU,KKL,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU INTEGER, INTENT(IN) :: KKL - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 - REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE @@ -1319,7 +1850,7 @@ FUNCTION M3_WR_WTH2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E, ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WTH2',0,ZHOOK_HANDLE) -M3_WR_WTH2 = M3_WTH_WR2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) +M3_WR_WTH2 = M3_WTH_WR2(KKA,KKU,KKL,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) ! IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WTH2',1,ZHOOK_HANDLE) END FUNCTION M3_WR_WTH2 diff --git a/src/common/turb/rmc01.F90 b/src/common/turb/mode_rmc01.F90 similarity index 95% rename from src/common/turb/rmc01.F90 rename to src/common/turb/mode_rmc01.F90 index 7488d6cbd8f5651433d9f34838940920a54ea5f4..628b4cad0dda1fcef65f2a70fd43b0ef5ec61e0f 100644 --- a/src/common/turb/rmc01.F90 +++ b/src/common/turb/mode_rmc01.F90 @@ -1,5 +1,11 @@ -! ######spl - SUBROUTINE RMC01(HTURBLEN,KKA,KKU,KKL,PZZ,PDXX,PDYY, & +!MNH_LIC Copyright 1994-2022 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_RMC01 +IMPLICIT NONE +CONTAINS +SUBROUTINE RMC01(HTURBLEN,KKA,KKU,KKL,PZZ,PDXX,PDYY, & PDZZ,PDIRCOSZW,PSBL_DEPTH,PLMO,PLK,PLEPS) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -233,3 +239,4 @@ PLEPS(:,:,KKU ) = PLEPS(:,:,IKE) ! IF (LHOOK) CALL DR_HOOK('RMC01',1,ZHOOK_HANDLE) END SUBROUTINE RMC01 +END MODULE MODE_RMC01 diff --git a/src/common/turb/mode_rotate_wind.F90 b/src/common/turb/mode_rotate_wind.F90 new file mode 100644 index 0000000000000000000000000000000000000000..e117b95f81770e26771aee5999a8ef9aedaef688 --- /dev/null +++ b/src/common/turb/mode_rotate_wind.F90 @@ -0,0 +1,204 @@ +!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_ROTATE_WIND +! ####################### +IMPLICIT NONE +CONTAINS +! ########################################################### + SUBROUTINE ROTATE_WIND(PU,PV,PW, & + PDIRCOSXW, PDIRCOSYW, PDIRCOSZW, & + PCOSSLOPE,PSINSLOPE, & + PDXX,PDYY,PDZZ, & + PUSLOPE,PVSLOPE ) +! ########################################################### +! +! +!!**** *ROTATE_WIND* - computes the wind components along the maximum slope +!! direction and its normal direction in the first mass level. +!! +!! PURPOSE +!! ------- +!!**** +! The purpose of this routine is to compute the wind component parallel +! to the orography at the first mass level. The exact location where these +! components are computed is the point of intersection between the normal +! to the orography and the first mass-level hyper-plane at PDZZ(:,:,IKB)/2 +! +!!** METHOD +!! ------ +!! The values of the 3 cartesian components of the wind are determined +!! by a bilinear interpolation between the 4 nearest points in the first +!! mass-level hyper-plane. These points are found according to the signs of +!! the slopes' sinus and cosinus. For each direction of interpolation, the +!! two different localizations (mass or flux grids) are used to avoid +!! lateral boundary problems. +!! Then, the rotation is performed for the wind components. The rotation +!! angle is the angle between the x axe and the maximum slope direction +!! defined by the slope vector (dZs/dx , dZs/dy). +!! Finally, the horizontal components are set at the marginal points +!! according to cyclic boundary conditions because this is the only case +!! where these points can be considered. +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! MODD_CONF : L2D switch for 2D model version +!! +!! +!! REFERENCE +!! --------- +!! Book 1 of documentation (Chapter: Turbulence) +!! +!! AUTHOR +!! ------ +!! Joel Stein * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 14/11/95 +!! Modifications: 15/05/96, (N. wood) +!! take into account no slip conditions +!! at the surface +!! 14/02/01 (V. Masson) +!! Slip condition at the surface restored +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PU,PV,PW ! cartesian components + ! of the wind +REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW, PDIRCOSZW +! Director Cosinus along x, y and z directions at surface w-point +REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle + ! between i and the slope vector +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ + ! Metric coefficients +REAL, DIMENSION(:,:), INTENT(OUT) :: PUSLOPE ! wind component along + ! the maximum slope direction +REAL, DIMENSION(:,:), INTENT(OUT) :: PVSLOPE ! wind component along + ! the direction normal to the maximum slope one +! +!------------------------------------------------------------------------------- +! +! 0.2 declaration of local variables +! +INTEGER, DIMENSION(SIZE(PDIRCOSXW,1),SIZE(PDIRCOSXW,2)) :: ILOC,JLOC + ! shift index to find the 4 nearest points in x and y directions +REAL, DIMENSION(SIZE(PDIRCOSXW,1),SIZE(PDIRCOSXW,2)) :: ZCOEFF,ZCOEFM, & + ! interpolation weigths for flux and mass locations + ZUINT,ZVINT,ZWINT, & + ! intermediate values of the cartesian components after x interp. + ZUFIN,ZVFIN,ZWFIN, & + ! final values of the cartesian components after the 2 interp. + ZWGROUND + ! vertical velocity at the surface +INTEGER :: IIB,IIE,IJB,IJE,IKB + ! index values for the Beginning or the End of the physical + ! domain in x,y and z directions +INTEGER :: IIU,IJU + ! arrays' sizes for i and j indices +INTEGER :: JI,JJ +! +!---------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +! +PUSLOPE=0. +PVSLOPE=0. +! +IIB = 2 +IJB = 2 +IIU = SIZE(PU,1) +IJU = SIZE(PU,2) +IIE = IIU - 1 +IJE = IJU - 1 +IKB = 1+JPVEXT +! +ZWGROUND(:,:) = PW(:,:,IKB) +! +!* 2. INTERPOLATE THE CARTESIAN COMPONENTS +! ------------------------------------ +! +ILOC(:,:)=NINT(SIGN(1.,-PCOSSLOPE(:,:))) +JLOC(:,:)=NINT(SIGN(1.,-PSINSLOPE(:,:))) +! +! interpolation in x direction +! +DO JJ = 1,IJU + DO JI = IIB,IIE + ZCOEFF(JI,JJ) = & + (0.5*PDXX(JI,JJ,IKB) + 0.5*PDZZ(JI,JJ,IKB)*PDIRCOSXW(JI,JJ) ) & + * 2. / (PDXX(JI,JJ,IKB)+PDXX(JI+1,JJ,IKB)) + ZUINT(JI,JJ) = ZCOEFF(JI,JJ) * PU(JI+1,JJ,IKB) + & + (1.-ZCOEFF(JI,JJ)) * PU(JI,JJ,IKB) + ! + ZCOEFM(JI,JJ) = 1. - 0.5 * PDZZ(JI,JJ,IKB) * ABS(PDIRCOSXW(JI,JJ)) & + / PDXX(JI+(ILOC(JI,JJ)+1)/2,JJ,IKB) + ZVINT(JI,JJ) = ZCOEFM(JI,JJ) * PV(JI,JJ,IKB) + & + (1.-ZCOEFM(JI,JJ)) * PV(JI+ILOC(JI,JJ),JJ,IKB) + ! + ZWINT(JI,JJ) = ZCOEFM(JI,JJ) * (PW(JI,JJ,IKB+1)+ZWGROUND(JI,JJ)) * 0.5 & + + (1.-ZCOEFM(JI,JJ)) & + *(PW(JI+ILOC(JI,JJ),JJ,IKB+1)+ZWGROUND(JI+ILOC(JI,JJ),JJ)) * 0.5 + END DO +END DO +! +! interpolation in y direction +! +DO JJ = IJB,IJE + DO JI = IIB,IIE + ZCOEFF(JI,JJ) = & + (0.5*PDYY(JI,JJ,IKB) + 0.5*PDZZ(JI,JJ,IKB)*PDIRCOSYW(JI,JJ) ) & + * 2. / (PDYY(JI,JJ,IKB)+PDYY(JI+1,JJ,IKB)) + ZVFIN(JI,JJ) = ZCOEFF(JI,JJ) * ZVINT(JI,JJ+1) + & + (1.-ZCOEFF(JI,JJ)) * ZVINT(JI,JJ) + ! + ZCOEFM(JI,JJ) = 1. - 0.5 * PDZZ(JI,JJ,IKB) * ABS(PDIRCOSYW(JI,JJ)) & + / PDYY(JI,JJ+(JLOC(JI,JJ)+1)/2,IKB) + ZUFIN(JI,JJ) = ZCOEFM(JI,JJ) * ZUINT(JI,JJ) + & + (1.-ZCOEFM(JI,JJ)) * ZUINT(JI,JJ+JLOC(JI,JJ)) + ZWFIN(JI,JJ) = ZCOEFM(JI,JJ) * ZWINT(JI,JJ) + & + (1.-ZCOEFM(JI,JJ)) * ZWINT(JI,JJ+JLOC(JI,JJ)) + END DO +END DO +! +!* 3. ROTATE THE WIND +! --------------- +! +! +DO JJ = IJB,IJE + DO JI = IIB,IIE + PUSLOPE(JI,JJ) = PCOSSLOPE(JI,JJ) * PDIRCOSZW(JI,JJ) * ZUFIN(JI,JJ) + & + PSINSLOPE(JI,JJ) * PDIRCOSZW(JI,JJ) * ZVFIN(JI,JJ) + & + SQRT(1.-PDIRCOSZW(JI,JJ)**2) * ZWFIN(JI,JJ) + ! + PVSLOPE(JI,JJ) =-PSINSLOPE(JI,JJ) * ZUFIN(JI,JJ) + & + PCOSSLOPE(JI,JJ) * ZVFIN(JI,JJ) + ! + END DO +END DO +! +! +! +!---------------------------------------------------------------------------- +! +END SUBROUTINE ROTATE_WIND +END MODULE MODE_ROTATE_WIND 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/common/turb/sbl_depth.F90 b/src/common/turb/mode_sbl_depth.F90 similarity index 91% rename from src/common/turb/sbl_depth.F90 rename to src/common/turb/mode_sbl_depth.F90 index 0c670f8db17dc556afeb5c44ab5df47793acf41d..e485940e06f075776b2f2ddd41aac71164aa331b 100644 --- a/src/common/turb/sbl_depth.F90 +++ b/src/common/turb/mode_sbl_depth.F90 @@ -1,3 +1,10 @@ +!MNH_LIC Copyright 1994-2022 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_DEPTH +IMPLICIT NONE +CONTAINS ! ######spl SUBROUTINE SBL_DEPTH(KKB,KKE,PZZ,PFLXU,PFLXV,PWTHV,PLMO,PSBL_DEPTH) USE PARKIND1, ONLY : JPRB @@ -41,7 +48,7 @@ USE MODD_PARAMETERS, ONLY : XUNDEF USE MODD_CTURB, ONLY : XFTOP_O_FSURF, XSBL_O_BL ! -USE MODI_BL_DEPTH_DIAG +USE MODE_BL_DEPTH_DIAG ! IMPLICIT NONE ! @@ -119,3 +126,4 @@ WHERE (PLMO(:,:)==XUNDEF) PSBL_DEPTH = ZSBL_DYN !---------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('SBL_DEPTH',1,ZHOOK_HANDLE) END SUBROUTINE SBL_DEPTH +END MODULE MODE_SBL_DEPTH diff --git a/src/arome/turb/th_r_from_thl_rt_1d.F90 b/src/common/turb/mode_th_r_from_thl_rt_1d.F90 similarity index 90% rename from src/arome/turb/th_r_from_thl_rt_1d.F90 rename to src/common/turb/mode_th_r_from_thl_rt_1d.F90 index 6b8f549df310712164170068d64ee52b767072c4..1aff6f5943ff5a99cf55a46a60c48fdb72ca3118 100644 --- a/src/arome/turb/th_r_from_thl_rt_1d.F90 +++ b/src/common/turb/mode_th_r_from_thl_rt_1d.F90 @@ -1,7 +1,13 @@ -! ######spl +!MNH_LIC Copyright 2006-2022 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_TH_R_FROM_THL_RT_1D +IMPLICIT NONE +CONTAINS SUBROUTINE TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE,PP, & PTHL, PRT, PTH, PRV, PRL, PRI, & - PRSATW, PRSATI, PRR, PRS, PRG, PRH ) + PRSATW, PRSATI, PRR, PRS, PRG, PRH,OOCEAN) ! ################################################################# ! ! @@ -35,6 +41,7 @@ !! S. Riette April 2011 : ice added, allow ZRLTEMP to be negative !! we use dQsat/dT to help convergence !! use of optional PRR, PRS, PRG, PRH +!! S. Riette Nov 2016: support for HFRAC_ICE='S' !! !! -------------------------------------------------------------------------- ! @@ -43,7 +50,7 @@ ! USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE MODD_CST!, ONLY: XP00, XRD, XCPD, XCPV, XCL, XCI, XLVTT, XTT, XLSTT +USE MODD_CST !, ONLY: XP00, XRD, XCPD, XCPV, XCL, XCI, XLVTT, XTT, XLSTT USE MODD_NEB, ONLY: NEB USE MODE_THERMO ! @@ -52,7 +59,8 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments ! -CHARACTER*1 , INTENT(IN) :: HFRAC_ICE +CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version REAL, DIMENSION(:), INTENT(INOUT) :: PFRAC_ICE REAL, DIMENSION(:), INTENT(IN) :: PP ! Pressure REAL, DIMENSION(:), INTENT(IN) :: PTHL ! thetal to transform into th @@ -119,8 +127,11 @@ ENDDO ! --------- DO II=1,JITER - ZT(:)=PTH(:)*ZEXN(:) - + IF (OOCEAN) THEN + ZT=PTH + ELSE + ZT(:)=PTH(:)*ZEXN(:) + END IF !Computation of liquid/ice fractions PFRAC_ICE(:) = 0. DO J=1, SIZE(PFRAC_ICE, 1) @@ -196,3 +207,4 @@ CONTAINS INCLUDE "compute_frac_ice.func.h" ! END SUBROUTINE TH_R_FROM_THL_RT_1D +END MODULE MODE_TH_R_FROM_THL_RT_1D diff --git a/src/arome/turb/th_r_from_thl_rt_2d.F90 b/src/common/turb/mode_th_r_from_thl_rt_2d.F90 similarity index 84% rename from src/arome/turb/th_r_from_thl_rt_2d.F90 rename to src/common/turb/mode_th_r_from_thl_rt_2d.F90 index 5d1ff0e0802183504784a6b10abb3c76943c72df..2ac0c85284102e0ce45d4fa88a97f9fa474e708d 100644 --- a/src/arome/turb/th_r_from_thl_rt_2d.F90 +++ b/src/common/turb/mode_th_r_from_thl_rt_2d.F90 @@ -1,7 +1,13 @@ -! ######spl +!MNH_LIC Copyright 2006-2022 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_TH_R_FROM_THL_RT_2D +IMPLICIT NONE +CONTAINS SUBROUTINE TH_R_FROM_THL_RT_2D(HFRAC_ICE,PFRAC_ICE,PP, & PTHL, PRT, PTH, PRV, PRL, PRI, & - PRSATW, PRSATI, PRR, PRS, PRG, PRH ) + PRSATW, PRSATI, PRR, PRS, PRG, PRH,OOCEAN) ! ################################################################# ! ! @@ -40,7 +46,7 @@ ! ------------ ! ! -USE MODI_TH_R_FROM_THL_RT_3D +USE MODE_TH_R_FROM_THL_RT_3D, ONLY: TH_R_FROM_THL_RT_3D USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -49,7 +55,7 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments ! -CHARACTER*1 , INTENT(IN) :: HFRAC_ICE +CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE REAL, DIMENSION(:,:), INTENT(INOUT) :: PFRAC_ICE REAL, DIMENSION(:,:), INTENT(IN) :: PP ! Pressure REAL, DIMENSION(:,:), INTENT(IN) :: PTHL ! Liquid pot. temp. @@ -61,6 +67,7 @@ REAL, DIMENSION(:,:), INTENT(INOUT):: PRL ! cloud mixing ratio REAL, DIMENSION(:,:), INTENT(INOUT):: PRI ! ice mixing ratio REAL, DIMENSION(:,:), INTENT(OUT) :: PRSATW ! estimated mixing ration at saturation over water REAL, DIMENSION(:,:), INTENT(OUT) :: PRSATI ! estimated mixing ration at saturation over ice +LOGICAL, INTENT(IN) :: OOCEAN ! switch OCEAN version ! !------------------------------------------------------------------------------- @@ -95,9 +102,11 @@ DO JK=1, SIZE(PTHL,2) PTHL(:,JK), PRT(:,JK), PTH(:,JK), & PRV(:,JK), PRL(:,JK), PRI(:,JK), & PRSATW(:,JK), PRSATI(:,JK), & - ZRR(:,JK), ZRS(:,JK), ZRG(:,JK), ZRH(:,JK)) + ZRR(:,JK), ZRS(:,JK), ZRG(:,JK), ZRH(:,JK),OOCEAN) ENDDO IF (LHOOK) CALL DR_HOOK('TH_R_FROM_THL_RT_2D',1,ZHOOK_HANDLE) END SUBROUTINE TH_R_FROM_THL_RT_2D +END MODULE MODE_TH_R_FROM_THL_RT_2D + diff --git a/src/arome/turb/th_r_from_thl_rt_3d.F90 b/src/common/turb/mode_th_r_from_thl_rt_3d.F90 similarity index 84% rename from src/arome/turb/th_r_from_thl_rt_3d.F90 rename to src/common/turb/mode_th_r_from_thl_rt_3d.F90 index 473a9bcc278263fd8ea78fed112a4520567b0f21..1e179b139debd6d2c8e7c57146ba47244e7442ac 100644 --- a/src/arome/turb/th_r_from_thl_rt_3d.F90 +++ b/src/common/turb/mode_th_r_from_thl_rt_3d.F90 @@ -1,7 +1,13 @@ -! ######spl +!MNH_LIC Copyright 2006-2022 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_TH_R_FROM_THL_RT_3D +IMPLICIT NONE +CONTAINS SUBROUTINE TH_R_FROM_THL_RT_3D(HFRAC_ICE,PFRAC_ICE,PP, & PTHL, PRT, PTH, PRV, PRL, PRI, & - PRSATW, PRSATI, PRR, PRS, PRG, PRH ) + PRSATW, PRSATI, PRR, PRS, PRG, PRH,OOCEAN) ! ################################################################# ! ! @@ -39,7 +45,7 @@ !* 0. DECLARATIONS ! ------------ ! -USE MODI_TH_R_FROM_THL_RT_1D +USE MODE_TH_R_FROM_THL_RT_1D, ONLY: TH_R_FROM_THL_RT_1D USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! @@ -48,7 +54,7 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments ! -CHARACTER*1 , INTENT(IN) :: HFRAC_ICE +CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PFRAC_ICE REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! Pressure REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHL ! thetal to transform into th @@ -60,6 +66,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRL ! vapor mixing ratio REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRI ! vapor mixing ratio REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRSATW ! estimated mixing ration at saturation over water REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRSATI ! estimated mixing ration at saturation over ice +LOGICAL, INTENT(IN) :: OOCEAN ! switch OCEAN version ! !------------------------------------------------------------------------------- ! @@ -91,10 +98,11 @@ DO JK=1, SIZE(PTHL,3) PTHL(:,JJ,JK), PRT(:,JJ,JK), PTH(:,JJ,JK), & PRV(:,JJ,JK), PRL(:,JJ,JK), PRI(:,JJ,JK), & PRSATW(:,JJ,JK), PRSATI(:,JJ,JK), & - ZRR(:,JJ,JK), ZRS(:,JJ,JK), ZRG(:,JJ,JK), ZRH(:,JJ,JK)) + ZRR(:,JJ,JK), ZRS(:,JJ,JK), ZRG(:,JJ,JK), ZRH(:,JJ,JK),OOCEAN) ENDDO ENDDO IF (LHOOK) CALL DR_HOOK('TH_R_FROM_THL_RT_3D',1,ZHOOK_HANDLE) END SUBROUTINE TH_R_FROM_THL_RT_3D +END MODULE MODE_TH_R_FROM_THL_RT_3D diff --git a/src/arome/turb/thl_rt_from_th_r_mf.F90 b/src/common/turb/mode_thl_rt_from_th_r_mf.F90 similarity index 90% rename from src/arome/turb/thl_rt_from_th_r_mf.F90 rename to src/common/turb/mode_thl_rt_from_th_r_mf.F90 index c9488f86b61a8c1e520804f2a283ccd26e28a208..bf72ab9439b62e883471b54f7abb10ecce8c4031 100644 --- a/src/arome/turb/thl_rt_from_th_r_mf.F90 +++ b/src/common/turb/mode_thl_rt_from_th_r_mf.F90 @@ -1,4 +1,10 @@ -! ######spl +!MNH_LIC Copyright 1994-2022 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_THL_RT_FROM_TH_R_MF +IMPLICIT NONE +CONTAINS SUBROUTINE THL_RT_FROM_TH_R_MF( KRR,KRRL,KRRI, & PTH, PR, PEXN, & PTHL, PRT ) @@ -114,3 +120,4 @@ ELSE END IF IF (LHOOK) CALL DR_HOOK('THL_RT_FRM_TH_R_MF',1,ZHOOK_HANDLE) END SUBROUTINE THL_RT_FROM_TH_R_MF +END MODULE MODE_THL_RT_FROM_TH_R_MF diff --git a/src/mesonh/turb/tke_eps_sources.f90 b/src/common/turb/mode_tke_eps_sources.F90 similarity index 66% rename from src/mesonh/turb/tke_eps_sources.f90 rename to src/common/turb/mode_tke_eps_sources.F90 index 4efe246beff2b829a835448166f9ad33bd6ea51f..cdfa0d2e45d8b701262f5b4c734a84d86c18dade 100644 --- a/src/mesonh/turb/tke_eps_sources.f90 +++ b/src/common/turb/mode_tke_eps_sources.F90 @@ -1,67 +1,18 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 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 MODI_TKE_EPS_SOURCES -! ########################### -INTERFACE -! - SUBROUTINE TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,PLM,PLEPS,PDP,PTRH, & - PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & - PTSTEP,PIMPL,PEXPL, & - HTURBLEN,HTURBDIM, & - TPFILE,OTURB_DIAG, & - PTP,PRTKES,PRTKESM, PRTHLS,PCOEF_DISS,PTR,PDISS ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -INTEGER, INTENT(IN) :: KMI ! model index number -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at t-deltat -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical height w-pt -REAL, INTENT(IN) :: PTSTEP ! Time step -REAL, INTENT(IN) :: PEXPL, PIMPL ! Coef. temporal. disc. -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -CHARACTER(len=4), INTENT(IN) :: HTURBLEN ! kind of mixing length -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some - ! diagnostic fields in the syncronous FM-file -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PDP ! Dyn. prod. of TKE -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTRH -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTP ! Ther. prod. of TKE -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTKES ! RHOD * Jacobian * - ! TKE at t+deltat -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRTKESM ! Advection source -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTHLS ! Source of Theta_l -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCOEF_DISS ! 1/(Cph*Exner) -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTR ! Transport prod. of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDISS ! Dissipati prod. of TKE -! -! -! -END SUBROUTINE TKE_EPS_SOURCES -! -END INTERFACE -! -END MODULE MODI_TKE_EPS_SOURCES -! -! ################################################################## +MODULE MODE_TKE_EPS_SOURCES +IMPLICIT NONE +CONTAINS SUBROUTINE TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,PLM,PLEPS,PDP, & - PTRH,PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & - PTSTEP,PIMPL,PEXPL, & - HTURBLEN,HTURBDIM, & - TPFILE,OTURB_DIAG, & - PTP,PRTKES,PRTKESM, PRTHLS,PCOEF_DISS,PTR,PDISS ) + & PTRH,PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & + & PTSTEP,PIMPL,PEXPL, & + & HTURBLEN,HTURBDIM, & + & TPFILE,OTURB_DIAG, & + & PTP,PRTKES,PRTHLS,PCOEF_DISS,PTDIFF,PTDISS,PRTKEMS,& + & TBUDGETS, KBUDGETS, & + & PEDR, PTR,PDISS ) ! ################################################################## ! ! @@ -95,6 +46,8 @@ END MODULE MODI_TKE_EPS_SOURCES !! MXF,MXM.MYF,MYM,MZF,MZM: Shuman functions (mean operators) !! DZF : Shuman functions (difference operators) !! +!! SUBROUTINE TRIDIAG : to solve an implicit temporal scheme +!! !! !! IMPLICIT ARGUMENTS !! ------------------ @@ -113,7 +66,7 @@ END MODULE MODI_TKE_EPS_SOURCES !! !! Module MODD_PARAMETERS: !! -!! JPVEXT +!! JPVEXT_TURB !! Module MODD_BUDGET: !! NBUMOD : model in which budget is calculated !! CBUTYPE : type of desired budget @@ -161,6 +114,8 @@ END MODULE MODI_TKE_EPS_SOURCES !! change of YCOMMENT !! 2012-02 Y. Seity, add possibility to run with reversed !! vertical levels +!! 2014-11 Y. Seity, add output terms for TKE DDHs budgets +!! -------------------------------------------------------------------------- !! 2015-01 (J. Escobar) missing get_halo(ZRES) for JPHEXT<> 1 !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O @@ -171,19 +126,22 @@ END MODULE MODI_TKE_EPS_SOURCES !* 0. DECLARATIONS ! ------------ ! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! USE MODD_ARGSLIST_ll, ONLY: LIST_ll -use modd_budget, only: lbudget_tke, lbudget_th, NBUDGET_TKE, NBUDGET_TH, tbudgets +USE MODD_BUDGET, ONLY: LBUDGET_TKE, LBUDGET_TH, NBUDGET_TKE, NBUDGET_TH, TBUDGETDATA USE MODD_CONF USE MODD_CST USE MODD_CTURB -USE MODD_DIAG_IN_RUN, ONLY: LDIAG_IN_RUN, XCURRENT_TKE_DISS -use modd_field, only: tfielddata, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA +USE MODD_DIAG_IN_RUN, ONLY : LDIAG_IN_RUN, XCURRENT_TKE_DISS +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA USE MODD_LES USE MODD_PARAMETERS ! -use mode_budget, only: Budget_store_add, Budget_store_end, Budget_store_init -USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD, BUDGET_STORE_END, BUDGET_STORE_INIT +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE USE MODE_ll ! USE MODI_GET_HALO @@ -192,8 +150,9 @@ USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_LES_MEAN_SUBGRID -USE MODI_SHUMAN -USE MODI_TRIDIAG_TKE +USE MODE_TRIDIAG_TKE, ONLY: TRIDIAG_TKE +USE MODI_SHUMAN , ONLY : DZM, DZF, MZM, MZF +! ! IMPLICIT NONE ! @@ -215,9 +174,9 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical height w-pt REAL, INTENT(IN) :: PTSTEP ! Time step REAL, INTENT(IN) :: PEXPL, PIMPL ! Coef. temporal. disc. -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the +CHARACTER(LEN=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme -CHARACTER(len=4), INTENT(IN) :: HTURBLEN ! kind of mixing length +CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN ! kind of mixing length TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some ! diagnostic fields in the syncronous FM-file @@ -228,9 +187,14 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTKES ! RHOD * Jacobian * ! TKE at t+deltat REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRTHLS ! Source of Theta_l REAL, DIMENSION(:,:,:), INTENT(IN) :: PCOEF_DISS ! 1/(Cph*Exner) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRTKESM ! Advection source -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTR ! Transport prod. of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDISS ! Dissipati prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDIFF ! Diffusion TKE term +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDISS ! Dissipation TKE term +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRTKEMS ! Advection source +TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PTR ! Transport prod. of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PDISS ! Dissipation of TKE +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PEDR ! EDR ! ! ! @@ -245,9 +209,10 @@ REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)):: & ! temporarily store some diagnostics stored in FM file ZFLX, & ! horizontal or vertical flux of the treated variable ZSOURCE, & ! source of evolution for the treated variable - ZKEFF ! effectif diffusion coeff = LT * SQRT( TKE ) -!LOGICAL,DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: GTKENEG -! ! 3D mask .T. if TKE < XTKEMIN + ZKEFF, & ! effectif diffusion coeff = LT * SQRT( TKE ) + ZTR ! Transport term +LOGICAL,DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: GTKENEG + ! 3D mask .T. if TKE < XTKEMIN INTEGER :: IIB,IIE,IJB,IJE,IKB,IKE ! Index values for the Beginning and End ! mass points of the domain @@ -256,6 +221,7 @@ INTEGER :: IIU,IJU,IKU ! array size in the 3 dimensions TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange INTEGER :: IINFO_ll ! return code of parallel routine TYPE(TFIELDDATA) :: TZFIELD +REAL(KIND=JPRB) :: ZHOOK_HANDLE ! !---------------------------------------------------------------------------- NULLIFY(TZFIELDDISS_ll) @@ -263,17 +229,18 @@ NULLIFY(TZFIELDDISS_ll) !* 1. PRELIMINARY COMPUTATIONS ! ------------------------ ! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) + +IF (LHOOK) CALL DR_HOOK('TKE_EPS_SOURCES',0,ZHOOK_HANDLE) +! IIU=SIZE(PTKEM,1) IJU=SIZE(PTKEM,2) +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE,IIU,IJU) IKB=KKA+JPVEXT_TURB*KKL IKE=KKU-JPVEXT_TURB*KKL ! ! compute the effective diffusion coefficient at the mass point ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) - -if (lbudget_th) call Budget_store_init( tbudgets(NBUDGET_TH), 'DISSH', prthls(:, :, :) ) - +! !---------------------------------------------------------------------------- ! !* 2. TKE EQUATION @@ -285,16 +252,15 @@ if (lbudget_th) call Budget_store_init( tbudgets(NBUDGET_TH), 'DISSH', prthls( ! Complete the sources of TKE with the horizontal turbulent explicit transport ! IF (HTURBDIM=='3DIM') THEN - PTR=PTRH + ZTR=PTRH ELSE - PTR=0. + ZTR=0. END IF ! ! ! !* 2.2 Explicit TKE sources except horizontal turbulent transport ! -! ! extrapolate the dynamic production with a 1/Z law from its value at the ! W(IKB+1) value stored in PDP(IKB) to the mass localization tke(IKB) PDP(:,:,IKB) = PDP(:,:,IKB) * (1. + PDZZ(:,:,IKB+KKL)/PDZZ(:,:,IKB)) @@ -302,9 +268,9 @@ PDP(:,:,IKB) = PDP(:,:,IKB) * (1. + PDZZ(:,:,IKB+KKL)/PDZZ(:,:,IKB)) ! Compute the source terms for TKE: ( ADVECtion + NUMerical DIFFusion + ..) ! + (Dynamical Production) + (Thermal Production) - (dissipation) ZFLX(:,:,:) = XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) -ZSOURCE(:,:,:) = ( PRTKES(:,:,:) + PRTKESM(:,:,:) ) / PRHODJ(:,:,:) & +ZSOURCE(:,:,:) = ( PRTKES(:,:,:) + PRTKEMS(:,:,:) ) / PRHODJ(:,:,:) & - PTKEM(:,:,:) / PTSTEP & - + PDP(:,:,:) + PTP(:,:,:) + PTR(:,:,:) - PEXPL * ZFLX(:,:,:) * PTKEM(:,:,:) + + PDP(:,:,:) + PTP(:,:,:) + ZTR(:,:,:) - PEXPL * ZFLX(:,:,:) * PTKEM(:,:,:) ! !* 2.2 implicit vertical TKE transport ! @@ -313,7 +279,7 @@ ZSOURCE(:,:,:) = ( PRTKES(:,:,:) + PRTKESM(:,:,:) ) / PRHODJ(:,:,:) & ! matrix inverted in TRIDIAG ! ZA(:,:,:) = - PTSTEP * XCET * & - MZM(ZKEFF) * MZM(PRHODJ) / PDZZ**2 + MZM(ZKEFF, KKA, KKU, KKL) * MZM(PRHODJ, KKA, KKU, KKL) / PDZZ**2 ! ! Compute TKE at time t+deltat: ( stored in ZRES ) ! @@ -332,67 +298,71 @@ IF (LDIAG_IN_RUN) THEN ENDIF ! ! TKE must be greater than its minimum value -! -! CL : Now done at the end of the time step in ADVECTION_METSV -!GTKENEG = ZRES <= XTKEMIN -!WHERE ( GTKENEG ) -! ZRES = XTKEMIN -!END WHERE +! CL : Now done at the end of the time step in ADVECTION_METSV for MesoNH +IF(CPROGRAM/='MESONH') THEN + GTKENEG = ZRES <= XTKEMIN + WHERE ( GTKENEG ) + ZRES = XTKEMIN + END WHERE +END IF +PTDISS(:,:,:) = - ZFLX(:,:,:)*(PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) ! IF ( LLES_CALL .OR. & - (OTURB_DIAG .AND. tpfile%lopened) ) THEN + (OTURB_DIAG .AND. TPFILE%LOPENED) ) THEN ! ! Compute the cartesian vertical flux of TKE in ZFLX ! - ZFLX(:,:,:) = - XCET * MZM(ZKEFF) * & - DZM(PIMPL * ZRES + PEXPL * PTKEM ) / PDZZ + ZFLX(:,:,:) = - XCET * MZM(ZKEFF, KKA, KKU, KKL) * & + DZM(PIMPL * ZRES + PEXPL * PTKEM, KKA, KKU, KKL) / PDZZ ! ZFLX(:,:,IKB) = 0. ZFLX(:,:,KKA) = 0. ! ! Compute the whole turbulent TRansport of TKE: ! - PTR(:,:,:)= PTR - DZF( MZM(PRHODJ) * ZFLX / PDZZ ) /PRHODJ + ZTR(:,:,:)= ZTR - DZF(MZM(PRHODJ, KKA, KKU, KKL) * ZFLX / PDZZ, KKA, KKU, KKL) /PRHODJ ! ! Storage in the LES configuration ! IF (LLES_CALL) THEN - CALL LES_MEAN_SUBGRID( MZF(ZFLX), X_LES_SUBGRID_WTke ) - CALL LES_MEAN_SUBGRID( -PTR, X_LES_SUBGRID_ddz_WTke ) + CALL LES_MEAN_SUBGRID(MZF(ZFLX, KKA, KKU, KKL), X_LES_SUBGRID_WTke ) + CALL LES_MEAN_SUBGRID(-ZTR, X_LES_SUBGRID_ddz_WTke ) END IF ! END IF ! !* 2.4 stores the explicit sources for budget purposes ! -if (lbudget_tke) then +IF (LBUDGET_TKE) THEN ! Dynamical production - call Budget_store_add( tbudgets(NBUDGET_TKE), 'DP', pdp(:, :, :) * prhodj(:, :, :) ) + CALL BUDGET_STORE_ADD( TBUDGETS(NBUDGET_TKE), 'DP', PDP(:, :, :) * PRHODJ(:, :, :) ) ! Thermal production - call Budget_store_add( tbudgets(NBUDGET_TKE), 'TP', ptp(:, :, :) * prhodj(:, :, :) ) + CALL BUDGET_STORE_ADD( TBUDGETS(NBUDGET_TKE), 'TP', PTP(:, :, :) * PRHODJ(:, :, :) ) ! Dissipation - call Budget_store_add( tbudgets(NBUDGET_TKE), 'DISS', -xced * sqrt( ptkem(:, :, :) ) / pleps(:, :, :) & - * ( pexpl * ptkem(:, :, :) + pimpl * zres(:, :, :) ) * prhodj(:, :, :) ) -end if + CALL BUDGET_STORE_ADD( TBUDGETS(NBUDGET_TKE), 'DISS',- XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & + (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:)) +END IF ! !* 2.5 computes the final RTKE and stores the whole turbulent transport -! with the removal of the advection part - -if (lbudget_tke) then - !Store the previous source terms in prtkes before initializing the next one - PRTKES(:,:,:) = PRTKES(:,:,:) + PRHODJ(:,:,:) * & - ( PDP(:,:,:) + PTP(:,:,:) & - - XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * ( PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:) ) ) +! with the removal of the advection part for MesoNH - call Budget_store_init( tbudgets(NBUDGET_TKE), 'TR', prtkes(:, :, :) ) -end if +!Store the previous source terms in prtkes before initializing the next one +!Should be in IF LBUDGET_TKE only. Was removed out for a correct comput. of PTDIFF in case of LBUDGET_TKE=F in AROME +PRTKES(:,:,:) = PRTKES(:,:,:) + PRHODJ(:,:,:) * & + ( PDP(:,:,:) + PTP(:,:,:) & + - XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * ( PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:) ) ) +! +PTDIFF(:,:,:) = ZRES(:,:,:) / PTSTEP - PRTKES(:,:,:)/PRHODJ(:,:,:) & + & - PDP(:,:,:)- PTP(:,:,:) - PTDISS(:,:,:) -PRTKES(:,:,:) = ZRES(:,:,:) * PRHODJ(:,:,:) / PTSTEP - PRTKESM(:,:,:) +IF (LBUDGET_TKE) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TKE), 'TR', PRTKES(:, :, :) ) +! +PRTKES(:,:,:) = ZRES(:,:,:) * PRHODJ(:,:,:) / PTSTEP - PRTKEMS(:,:,:) ! ! stores the whole turbulent transport ! -if (lbudget_tke) call Budget_store_end( tbudgets(NBUDGET_TKE), 'TR', prtkes(:, :, :) ) +IF (LBUDGET_TKE) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TKE), 'TR', PRTKES(:, :, :) ) !---------------------------------------------------------------------------- ! @@ -401,17 +371,16 @@ if (lbudget_tke) call Budget_store_end( tbudgets(NBUDGET_TKE), 'TR', prtkes(:, : ! PRTHLS(:,:,:) = PRTHLS(:,:,:) + XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * & (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:) * PCOEF_DISS(:,:,:) - -if (lbudget_th) call Budget_store_end( tbudgets(NBUDGET_TH), 'DISSH', prthls(:, :, :) ) - !---------------------------------------------------------------------------- ! !* 4. STORES SOME DIAGNOSTICS ! ----------------------- ! -PDISS(:,:,:) = -XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) +IF(PRESENT(PDISS)) PDISS(:,:,:) = -XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) +IF(PRESENT(PTR)) PTR=ZTR +IF(PRESENT(PEDR)) PEDR = XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) ! -IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN +IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN ! ! stores the dynamic production ! @@ -425,7 +394,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PDP) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,PDP) ! ! stores the thermal production ! @@ -439,7 +408,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PTP) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,PTP) ! ! stores the whole turbulent transport ! @@ -453,7 +422,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PTR) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZTR) ! ! stores the dissipation of TKE ! @@ -467,7 +436,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PDISS) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,PDISS) END IF ! ! Storage in the LES configuration of the Dynamic Production of TKE and @@ -482,4 +451,6 @@ END IF ! !---------------------------------------------------------------------------- ! +IF (LHOOK) CALL DR_HOOK('TKE_EPS_SOURCES',1,ZHOOK_HANDLE) END SUBROUTINE TKE_EPS_SOURCES +END MODULE MODE_TKE_EPS_SOURCES diff --git a/src/common/turb/tm06.F90 b/src/common/turb/mode_tm06.F90 similarity index 96% rename from src/common/turb/tm06.F90 rename to src/common/turb/mode_tm06.F90 index 22bf99d25a03c27acd88ce1a3d9d0d649b6bcac8..903ea792e01c5f456289a0c283f6e24c76400a41 100644 --- a/src/common/turb/tm06.F90 +++ b/src/common/turb/mode_tm06.F90 @@ -2,8 +2,10 @@ !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. -! ######spl - SUBROUTINE TM06(KKA,KKU,KKL,PTHVREF,PBL_DEPTH,PZZ,PSFTH,PMWTH,PMTH2) +MODULE MODE_TM06 +IMPLICIT NONE +CONTAINS +SUBROUTINE TM06(KKA,KKU,KKL,PTHVREF,PBL_DEPTH,PZZ,PSFTH,PMWTH,PMTH2) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ################################################################# @@ -136,3 +138,4 @@ PMWTH(:,:,KKU) = PMWTH(:,:,KKU) * ZWSTAR(:,:)**2*ZTSTAR(:,:) !---------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM06',1,ZHOOK_HANDLE) END SUBROUTINE TM06 +END MODULE MODE_TM06 diff --git a/src/common/turb/tm06_h.F90 b/src/common/turb/mode_tm06_h.F90 similarity index 96% rename from src/common/turb/tm06_h.F90 rename to src/common/turb/mode_tm06_h.F90 index 3162f5149e9d44cfe2d0e8868995881c044f1210..7d32fdd62d070d1f0d9cc796b315490f32c8d4cd 100644 --- a/src/common/turb/tm06_h.F90 +++ b/src/common/turb/mode_tm06_h.F90 @@ -2,8 +2,10 @@ !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 -! ######spl - SUBROUTINE TM06_H(KKB,KKTB,KKTE,PTSTEP,PZZ,PFLXZ,PBL_DEPTH) +MODULE MODE_TM06_H +IMPLICIT NONE +CONTAINS +SUBROUTINE TM06_H(KKB,KKTB,KKTE,PTSTEP,PZZ,PFLXZ,PBL_DEPTH) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ################################################################# @@ -96,3 +98,4 @@ WHERE(PBL_DEPTH(:,:)/=XUNDEF) PBL_DEPTH(:,:)=MIN(PBL_DEPTH(:,:),ZBL_DEPTH(:,:)+Z !---------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TM06_H',1,ZHOOK_HANDLE) END SUBROUTINE TM06_H +END MODULE MODE_TM06_H diff --git a/src/common/turb/tridiag.F90 b/src/common/turb/mode_tridiag.F90 similarity index 98% rename from src/common/turb/tridiag.F90 rename to src/common/turb/mode_tridiag.F90 index ee28bf7bb4be4dc87ca84be8d09bc696ca498496..82b2ec2b08172cb21bf53a27f11c9b12e1be6abe 100644 --- a/src/common/turb/tridiag.F90 +++ b/src/common/turb/mode_tridiag.F90 @@ -2,8 +2,10 @@ !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. -! ######spl - SUBROUTINE TRIDIAG(KKA,KKU,KKL,PVARM,PA,PTSTEP,PEXPL,PIMPL, & +MODULE MODE_TRIDIAG +IMPLICIT NONE +CONTAINS +SUBROUTINE TRIDIAG(KKA,KKU,KKL,PVARM,PA,PTSTEP,PEXPL,PIMPL, & PRHODJ,PSOURCE,PVARP ) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -230,3 +232,4 @@ PVARP(:,:,KKU)=PVARP(:,:,IKE) ! IF (LHOOK) CALL DR_HOOK('TRIDIAG',1,ZHOOK_HANDLE) END SUBROUTINE TRIDIAG +END MODULE MODE_TRIDIAG diff --git a/src/common/turb/tridiag_massflux.F90 b/src/common/turb/mode_tridiag_massflux.F90 similarity index 98% rename from src/common/turb/tridiag_massflux.F90 rename to src/common/turb/mode_tridiag_massflux.F90 index 401018cc0fed6cac3161e06224461d7c1ea8ea99..915d75b936fd4131452da4cf5c7e41a9922390f5 100644 --- a/src/common/turb/tridiag_massflux.F90 +++ b/src/common/turb/mode_tridiag_massflux.F90 @@ -2,8 +2,10 @@ !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. -! ######spl - SUBROUTINE TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PVARM,PF,PDFDT,PTSTEP,PIMPL, & +MODULE MODE_TRIDIAG_MASSFLUX +IMPLICIT NONE +CONTAINS +SUBROUTINE TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PVARM,PF,PDFDT,PTSTEP,PIMPL, & PDZZ,PRHODJ,PVARP ) USE PARKIND1, ONLY : JPRB @@ -275,3 +277,4 @@ PVARP(:,KKU)=PVARP(:,KKE) ! IF (LHOOK) CALL DR_HOOK('TRIDIAG_MASSFLUX',1,ZHOOK_HANDLE) END SUBROUTINE TRIDIAG_MASSFLUX +END MODULE MODE_TRIDIAG_MASSFLUX diff --git a/src/common/turb/tridiag_thermo.F90 b/src/common/turb/mode_tridiag_thermo.F90 similarity index 98% rename from src/common/turb/tridiag_thermo.F90 rename to src/common/turb/mode_tridiag_thermo.F90 index 7d20b2fa1e633d84dafcb24479c3c46a808d575a..5488c69f08941147fe0cafded7870f16aac0e796 100644 --- a/src/common/turb/tridiag_thermo.F90 +++ b/src/common/turb/mode_tridiag_thermo.F90 @@ -2,8 +2,10 @@ !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. -! ######spl - SUBROUTINE TRIDIAG_THERMO(KKA,KKU,KKL,PVARM,PF,PDFDDTDZ,PTSTEP,PIMPL, & +MODULE MODE_TRIDIAG_THERMO +IMPLICIT NONE +CONTAINS +SUBROUTINE TRIDIAG_THERMO(KKA,KKU,KKL,PVARM,PF,PDFDDTDZ,PTSTEP,PIMPL, & PDZZ,PRHODJ,PVARP ) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -269,3 +271,4 @@ PVARP(:,:,KKU)=PVARP(:,:,IKE) ! IF (LHOOK) CALL DR_HOOK('TRIDIAG_THERMO',1,ZHOOK_HANDLE) END SUBROUTINE TRIDIAG_THERMO +END MODULE MODE_TRIDIAG_THERMO diff --git a/src/common/turb/tridiag_tke.F90 b/src/common/turb/mode_tridiag_tke.F90 similarity index 98% rename from src/common/turb/tridiag_tke.F90 rename to src/common/turb/mode_tridiag_tke.F90 index aaba12157838120e2c95cc5fbb845e53f9185e55..52ec08bdfbcec157530255aa9593f16e2ee02383 100644 --- a/src/common/turb/tridiag_tke.F90 +++ b/src/common/turb/mode_tridiag_tke.F90 @@ -2,8 +2,10 @@ !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. -! ######spl - SUBROUTINE TRIDIAG_TKE(KKA,KKU,KKL,PVARM,PA,PTSTEP,PEXPL,PIMPL, & +MODULE MODE_TRIDIAG_TKE +IMPLICIT NONE +CONTAINS +SUBROUTINE TRIDIAG_TKE(KKA,KKU,KKL,PVARM,PA,PTSTEP,PEXPL,PIMPL, & PRHODJ,PSOURCE,PDIAG,PVARP ) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -233,3 +235,4 @@ PVARP(:,:,KKU)=PVARP(:,:,IKE) ! IF (LHOOK) CALL DR_HOOK('TRIDIAG_TKE',1,ZHOOK_HANDLE) END SUBROUTINE TRIDIAG_TKE +END MODULE MODE_TRIDIAG_TKE diff --git a/src/common/turb/tridiag_wind.F90 b/src/common/turb/mode_tridiag_wind.F90 similarity index 98% rename from src/common/turb/tridiag_wind.F90 rename to src/common/turb/mode_tridiag_wind.F90 index 1f074af2b701023336eadeec436711fecb45f791..65fd7256e14f7cf242917b450ff723d4d9e942d9 100644 --- a/src/common/turb/tridiag_wind.F90 +++ b/src/common/turb/mode_tridiag_wind.F90 @@ -2,8 +2,10 @@ !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. -! ######spl - SUBROUTINE TRIDIAG_WIND(KKA,KKU,KKL,PVARM,PA,PCOEFS,PTSTEP,PEXPL,PIMPL, & +MODULE MODE_TRIDIAG_WIND +IMPLICIT NONE +CONTAINS +SUBROUTINE TRIDIAG_WIND(KKA,KKU,KKL,PVARM,PA,PCOEFS,PTSTEP,PEXPL,PIMPL, & PRHODJA,PSOURCE,PVARP ) USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -234,3 +236,4 @@ PVARP(:,:,KKU)=PVARP(:,:,IKE) ! IF (LHOOK) CALL DR_HOOK('TRIDIAG_WIND',1,ZHOOK_HANDLE) END SUBROUTINE TRIDIAG_WIND +END MODULE MODE_TRIDIAG_WIND diff --git a/src/mesonh/turb/turb_hor.f90 b/src/common/turb/mode_turb_hor.F90 similarity index 72% rename from src/mesonh/turb/turb_hor.f90 rename to src/common/turb/mode_turb_hor.F90 index 8c872dcee439fe7faea9f96ce4f171a76ea4ff8a..76973ab7a2621f81e5f8adaa901ebd3aa28deaf5 100644 --- a/src/mesonh/turb/turb_hor.f90 +++ b/src/common/turb/mode_turb_hor.F90 @@ -2,114 +2,11 @@ !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 MODI_TURB_HOR -! #################### -! -INTERFACE -! - SUBROUTINE TURB_HOR(KSPLT, KRR, KRRL, KRRI, PTSTEP, & - OTURB_FLX,OSUBG_COND, & - TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & - PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & - PCOSSLOPE,PSINSLOPE, & - PINV_PDXX, PINV_PDYY, PINV_PDZZ, PMZM_PRHODJ, & - PK, & - PRHODJ,PTHVREF, & - PSFTHM,PSFRM,PSFSVM, & - PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & - PUM,PVM,PWM,PUSLOPEM,PVSLOPEM,PTHLM,PRM,PSVM, & - PTKEM,PLM,PLEPS, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & - PDP,PTP,PSIGS, & - PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS ) - -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KSPLT ! current split index -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, INTENT(IN) :: PTSTEP ! -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid -! condensation -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW, PDIRCOSZW -! Director Cosinus along x, y and z directions at surface w-point -REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state VPT -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! surface fluxes -! -REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked - ! to the maximum slope direction and the surface normal and the binormal - ! at time t - dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU22M ! <vv> in the same axes -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes -! -! Variables at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! mixing ratios at t-1, - ! where PRM(:,:,:,1) = conservative mixing ratio -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-1 -REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the - ! maximum slope direction -REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the - ! direction normal to the maximum slope one - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. - ! PK = PLM * SQRT(PTKEM) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM - ! normalized 2nd-order flux - ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS, PRTHLS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS,PRRS ! var. at t+1 -split- -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP,PTP ! TKE production terms -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS - ! IN: Vertical part of Sigma_s at t - ! OUT: Total Sigma_s at t -! -! -! -END SUBROUTINE TURB_HOR -! -END INTERFACE -! -END MODULE MODI_TURB_HOR -! ################################################################ - SUBROUTINE TURB_HOR(KSPLT, KRR, KRRL, KRRI, PTSTEP, & - OTURB_FLX,OSUBG_COND, & +MODULE MODE_TURB_HOR +IMPLICIT NONE +CONTAINS + SUBROUTINE TURB_HOR(KSPLT, KRR, KRRL, KRRI, PTSTEP, & + OTURB_FLX,OSUBG_COND,OOCEAN, & TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & @@ -245,14 +142,14 @@ USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES ! -USE MODI_TURB_HOR_THERMO_FLUX -USE MODI_TURB_HOR_THERMO_CORR -USE MODI_TURB_HOR_DYN_CORR -USE MODI_TURB_HOR_UV -USE MODI_TURB_HOR_UW -USE MODI_TURB_HOR_VW -USE MODI_TURB_HOR_SV_FLUX -USE MODI_TURB_HOR_SV_CORR +USE MODE_TURB_HOR_THERMO_FLUX, ONLY: TURB_HOR_THERMO_FLUX +USE MODE_TURB_HOR_THERMO_CORR, ONLY: TURB_HOR_THERMO_CORR +USE MODE_TURB_HOR_DYN_CORR, ONLY: TURB_HOR_DYN_CORR +USE MODE_TURB_HOR_UV, ONLY: TURB_HOR_UV +USE MODE_TURB_HOR_UW, ONLY: TURB_HOR_UW +USE MODE_TURB_HOR_VW, ONLY: TURB_HOR_VW +USE MODE_TURB_HOR_SV_FLUX, ONLY: TURB_HOR_SV_FLUX +USE MODE_TURB_HOR_SV_CORR, ONLY: TURB_HOR_SV_CORR ! IMPLICIT NONE ! @@ -269,6 +166,7 @@ LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid ! condensation +LOGICAL, INTENT(IN) :: OOCEAN ! switch for ocean version TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY @@ -368,7 +266,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS ! IF (KSPLT==1) & CALL TURB_HOR_THERMO_CORR(KRR, KRRL, KRRI, & - OTURB_FLX,OSUBG_COND, & + OTURB_FLX,OSUBG_COND,OOCEAN, & TPFILE, & PINV_PDXX,PINV_PDYY, & PDXX,PDYY,PDZZ,PDZX,PDZY, & @@ -458,7 +356,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS PRSVS ) ! IF (KSPLT==1 .AND. LLES_CALL) & - CALL TURB_HOR_SV_CORR(KRR,KRRL,KRRI, & + CALL TURB_HOR_SV_CORR(KRR,KRRL,KRRI,OOCEAN, & PDXX,PDYY,PDZZ,PDZX,PDZY, & PLM,PLEPS,PTKEM,PTHVREF, & PTHLM,PRM, & @@ -467,3 +365,4 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS ! ! END SUBROUTINE TURB_HOR +END MODULE MODE_TURB_HOR diff --git a/src/mesonh/turb/turb_hor_dyn_corr.f90 b/src/common/turb/mode_turb_hor_dyn_corr.F90 similarity index 83% rename from src/mesonh/turb/turb_hor_dyn_corr.f90 rename to src/common/turb/mode_turb_hor_dyn_corr.F90 index 2a4a3e98d7fa391aa25e8b6c048680eca238bb63..f652951dceaa4210f222fa08c0c99b2e925c72d7 100644 --- a/src/mesonh/turb/turb_hor_dyn_corr.f90 +++ b/src/common/turb/mode_turb_hor_dyn_corr.F90 @@ -3,79 +3,9 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -MODULE MODI_TURB_HOR_DYN_CORR -! -INTERFACE -! - SUBROUTINE TURB_HOR_DYN_CORR(KSPLT, PTSTEP, & - OTURB_FLX,KRR, & - TPFILE, & - PK,PINV_PDZZ, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & - PDIRCOSZW, & - PCOSSLOPE,PSINSLOPE, & - PRHODJ, & - PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & - PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & - PTHLM,PRM,PSVM, & - PTKEM,PLM, & - PDP,PTP, & - PRUS,PRVS,PRWS ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KSPLT ! split process index -REAL, INTENT(IN) :: PTSTEP ! timestep -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -INTEGER, INTENT(IN) :: KRR ! number of moist var. -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. - ! PK = PLM * SQRT(PTKEM) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW -! Director Cosinus along z directions at surface w-point -REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume -! -REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked - ! to the maximum slope direction and the surface normal and the binormal - ! at time t - dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU22M ! <vv> in the same axes -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes -! -! Variables at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM -REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the - ! maximum slope direction -REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the - ! direction normal to the maximum slope one -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP,PTP ! TKE production terms -! -! -! -END SUBROUTINE TURB_HOR_DYN_CORR -! -END INTERFACE -! -END MODULE MODI_TURB_HOR_DYN_CORR -! ################################################################ +MODULE MODE_TURB_HOR_DYN_CORR +IMPLICIT NONE +CONTAINS SUBROUTINE TURB_HOR_DYN_CORR(KSPLT, PTSTEP, & OTURB_FLX,KRR, & TPFILE, & @@ -144,21 +74,21 @@ USE MODD_ARGSLIST_ll, ONLY: LIST_ll USE MODD_CST USE MODD_CONF USE MODD_CTURB -use modd_field, only: tfielddata, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES USE MODD_NSV ! USE MODE_ll -USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! USE MODI_GRADIENT_M USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_SHUMAN -USE MODI_COEFJ +USE MODE_COEFJ, ONLY: COEFJ USE MODI_LES_MEAN_SUBGRID USE MODI_TRIDIAG_W ! @@ -369,7 +299,7 @@ ZFLX(:,:,IKB-1) = & ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) ! CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) -IF ( tpfile%lopened .AND. OTURB_FLX ) THEN +IF ( TPFILE%LOPENED .AND. OTURB_FLX ) THEN ! stores <U U> TZFIELD%CMNHNAME = 'U_VAR' TZFIELD%CSTDNAME = '' @@ -381,7 +311,7 @@ IF ( tpfile%lopened .AND. OTURB_FLX ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! ! Complete the U tendency @@ -464,7 +394,7 @@ ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) ! CALL UPDATE_HALO_ll(TZFIELDS_ll, IINFO_ll) ! -IF ( tpfile%lopened .AND. OTURB_FLX ) THEN +IF ( TPFILE%LOPENED .AND. OTURB_FLX ) THEN ! stores <V V> TZFIELD%CMNHNAME = 'V_VAR' TZFIELD%CSTDNAME = '' @@ -476,7 +406,7 @@ IF ( tpfile%lopened .AND. OTURB_FLX ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! ! Complete the V tendency @@ -551,7 +481,7 @@ ZFLX(:,:,IKB-1) = & ! ZFLX(:,:,IKB-1) = 2. * ZFLX(:,:,IKB-1) - ZFLX(:,:,IKB) ! -IF ( tpfile%lopened .AND. OTURB_FLX ) THEN +IF ( TPFILE%LOPENED .AND. OTURB_FLX ) THEN ! stores <W W> TZFIELD%CMNHNAME = 'W_VAR' TZFIELD%CSTDNAME = '' @@ -563,7 +493,7 @@ IF ( tpfile%lopened .AND. OTURB_FLX ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! ! Complete the W tendency @@ -623,3 +553,4 @@ CALL CLEANLIST_ll(TZFIELDS_ll) ! ! END SUBROUTINE TURB_HOR_DYN_CORR +END MODULE MODE_TURB_HOR_DYN_CORR diff --git a/src/mesonh/turb/turb_hor_splt.f90 b/src/common/turb/mode_turb_hor_splt.F90 similarity index 78% rename from src/mesonh/turb/turb_hor_splt.f90 rename to src/common/turb/mode_turb_hor_splt.F90 index 2de0ca9a8cdea58c8f98279e1ddcbc7d2038070a..ffdf167115a076217f87fa4455ee8f0cf45a4c30 100644 --- a/src/mesonh/turb/turb_hor_splt.f90 +++ b/src/common/turb/mode_turb_hor_splt.F90 @@ -2,109 +2,11 @@ !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 MODI_TURB_HOR_SPLT -! ######################### -! -INTERFACE -! - SUBROUTINE TURB_HOR_SPLT(KSPLIT, KRR, KRRL, KRRI, PTSTEP, & - HLBCX,HLBCY,OTURB_FLX,OSUBG_COND, & - TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & - PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & - PCOSSLOPE,PSINSLOPE, & - PRHODJ,PTHVREF, & - PSFTHM,PSFRM,PSFSVM, & - PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & - PUM,PVM,PWM,PUSLOPEM,PVSLOPEM,PTHLM,PRM,PSVM, & - PTKEM,PLM,PLEPS, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & - PDP,PTP,PSIGS, & - PTRH, & - PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS ) - -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KSPLIT ! number of time splitting -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, INTENT(IN) :: PTSTEP ! timestep -CHARACTER (LEN=*), DIMENSION(:), INTENT(IN) :: HLBCX,HLBCY -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid -! condensation -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW, PDIRCOSZW -! Director Cosinus along x, y and z directions at surface w-point -REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state VPT -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! surface fluxes -! -REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked - ! to the maximum slope direction and the surface normal and the binormal - ! at time t - dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU22M ! <vv> in the same axes -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes -! -! Variables at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! mixing ratios at t-1, - ! where PRM(:,:,:,1) = conservative mixing ratio -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-1 -REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the - ! maximum slope direction -REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the - ! direction normal to the maximum slope one -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM - ! normalized 2nd-order flux - ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS, PRTHLS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS,PRRS ! var. at t+1 -split- -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP,PTP ! TKE production terms -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTRH - -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS - ! IN: Vertical part of Sigma_s at t - ! OUT: Total Sigma_s at t -! -! -! -END SUBROUTINE TURB_HOR_SPLT -! -END INTERFACE -! -END MODULE MODI_TURB_HOR_SPLT -! ################################################################ - SUBROUTINE TURB_HOR_SPLT(KSPLIT, KRR, KRRL, KRRI, PTSTEP, & - HLBCX,HLBCY,OTURB_FLX,OSUBG_COND, & +MODULE MODE_TURB_HOR_SPLT +IMPLICIT NONE +CONTAINS + SUBROUTINE TURB_HOR_SPLT(KSPLIT, KRR, KRRL, KRRI, PTSTEP, & + HLBCX,HLBCY,OTURB_FLX,OSUBG_COND,OOCEAN, & TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & @@ -261,8 +163,8 @@ USE MODD_PARAMETERS ! ! USE MODI_SHUMAN -USE MODI_TURB_HOR -USE MODI_TURB_HOR_TKE +USE MODE_TURB_HOR +USE MODE_TURB_HOR_TKE ! USE MODE_ll ! @@ -281,6 +183,7 @@ CHARACTER (LEN=*), DIMENSION(:), INTENT(IN) :: HLBCX,HLBCY LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version ! condensation TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file ! @@ -454,7 +357,7 @@ IF (KSPLIT>1 .AND. CPROGRAM=='MESONH') THEN ! ! compute the turbulent tendencies for the small time step CALL TURB_HOR(JSPLT, KRR, KRRL, KRRI, PTSTEP, & - OTURB_FLX,OSUBG_COND, & + OTURB_FLX,OSUBG_COND,OOCEAN, & TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & @@ -595,7 +498,7 @@ IF (KSPLIT>1 .AND. CPROGRAM=='MESONH') THEN ELSE ! CALL TURB_HOR(1, KRR, KRRL, KRRI, PTSTEP, & - OTURB_FLX,OSUBG_COND, & + OTURB_FLX,OSUBG_COND,OOCEAN, & TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & @@ -630,3 +533,4 @@ DEALLOCATE(ZINV_PDZZ) DEALLOCATE(ZMZM_PRHODJ) ! END SUBROUTINE TURB_HOR_SPLT +END MODULE MODE_TURB_HOR_SPLT diff --git a/src/mesonh/turb/turb_hor_sv_corr.f90 b/src/common/turb/mode_turb_hor_sv_corr.F90 similarity index 73% rename from src/mesonh/turb/turb_hor_sv_corr.f90 rename to src/common/turb/mode_turb_hor_sv_corr.F90 index f9e2c7b5557ff6c0f31e75efcf9a3aa3347b3406..9f559aa8e3c5e4e6fe9b98db9a12c61a104c7def 100644 --- a/src/mesonh/turb/turb_hor_sv_corr.f90 +++ b/src/common/turb/mode_turb_hor_sv_corr.F90 @@ -2,47 +2,10 @@ !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 MODI_TURB_HOR_SV_CORR -! ############################ -! -INTERFACE -! - SUBROUTINE TURB_HOR_SV_CORR(KRR,KRRL,KRRI, & - PDXX,PDYY,PDZZ,PDZX,PDZY, & - PLM,PLEPS,PTKEM,PTHVREF, & - PTHLM,PRM, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & - PWM,PSVM ) -! -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRL ! number of liquid var. -INTEGER, INTENT(IN) :: KRRI ! number of ice var. -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! tke -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! reference Thv -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! potential temperature at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-Delta t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized - ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! w at t-1 -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-1 -! -! -END SUBROUTINE TURB_HOR_SV_CORR -! -END INTERFACE -! -END MODULE MODI_TURB_HOR_SV_CORR -! ################################################################ - SUBROUTINE TURB_HOR_SV_CORR(KRR,KRRL,KRRI, & +MODULE MODE_TURB_HOR_SV_CORR +IMPLICIT NONE +CONTAINS + SUBROUTINE TURB_HOR_SV_CORR(KRR,KRRL,KRRI,OOCEAN, & PDXX,PDYY,PDZZ,PDZX,PDZY, & PLM,PLEPS,PTKEM,PTHVREF, & PTHLM,PRM, & @@ -98,8 +61,8 @@ USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_SHUMAN USE MODI_LES_MEAN_SUBGRID -USE MODI_EMOIST -USE MODI_ETHETA +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA ! USE MODI_SECOND_MNH ! @@ -113,6 +76,7 @@ IMPLICIT NONE INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid var. INTEGER, INTENT(IN) :: KRRI ! number of ice var. +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY ! Metric coefficients REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! mixing length @@ -137,6 +101,7 @@ REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) & :: ZFLX, ZA ! INTEGER :: JSV ! loop counter +INTEGER :: IKU ! REAL :: ZTIME1, ZTIME2 ! @@ -147,6 +112,7 @@ REAL :: ZCQSVD = 2.4 ! constant for humidity - scalar covariance dissipation REAL :: ZCSV !constant for the scalar flux ! --------------------------------------------------------------------------- ! +IKU=SIZE(PTKEM,3) CALL SECOND_MNH(ZTIME1) ! IF(LBLOWSNOW) THEN @@ -179,7 +145,7 @@ DO JSV=1,NSV ! covariance SvThv ! IF (LLES_CALL) THEN - ZA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) + ZA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM,OOCEAN) IF (.NOT. L2D) THEN ZFLX(:,:,:)= PLM(:,:,:) * PLEPS(:,:,:) & * ( GX_M_M(PTHLM,PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & @@ -194,7 +160,7 @@ DO JSV=1,NSV CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE. ) ! IF (KRR>=1) THEN - ZA(:,:,:) = EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) + ZA(:,:,:) = EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM,OOCEAN) IF (.NOT. L2D) THEN ZFLX(:,:,:)= PLM(:,:,:) * PLEPS(:,:,:) & * ( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) * GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX) & @@ -216,3 +182,5 @@ CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 ! END SUBROUTINE TURB_HOR_SV_CORR +END MODULE MODE_TURB_HOR_SV_CORR + diff --git a/src/mesonh/turb/turb_hor_sv_flux.f90 b/src/common/turb/mode_turb_hor_sv_flux.F90 similarity index 80% rename from src/mesonh/turb/turb_hor_sv_flux.f90 rename to src/common/turb/mode_turb_hor_sv_flux.F90 index 163ee3d0203f1e9cad04a62d18573d07707c4c20..f61a531d910f2c0fb1f97b249a8665a53fa1ca08 100644 --- a/src/mesonh/turb/turb_hor_sv_flux.f90 +++ b/src/common/turb/mode_turb_hor_sv_flux.F90 @@ -3,59 +3,9 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -! ############################ - MODULE MODI_TURB_HOR_SV_FLUX -! ############################ -! -INTERFACE -! - SUBROUTINE TURB_HOR_SV_FLUX(KSPLT, & - OTURB_FLX, & - TPFILE, & - PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & - PDXX,PDYY,PDZZ,PDZX,PDZY, & - PDIRCOSXW,PDIRCOSYW, & - PRHODJ,PWM, & - PSFSVM, & - PSVM, & - PRSVS ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KSPLT ! split process index -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. - ! PK = PLM * SQRT(PTKEM) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW -! Director Cosinus along x and y directions at surface w-point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! vertical wind -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! surface fluxes -! -! -! Variables at t-1 -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-1 -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! var. at t+1 -split- -! -! -! -END SUBROUTINE TURB_HOR_SV_FLUX -! -END INTERFACE -! -END MODULE MODI_TURB_HOR_SV_FLUX -! ################################################################ +MODULE MODE_TURB_HOR_SV_FLUX +IMPLICIT NONE +CONTAINS SUBROUTINE TURB_HOR_SV_FLUX(KSPLT, & OTURB_FLX, & TPFILE, & @@ -113,21 +63,21 @@ END MODULE MODI_TURB_HOR_SV_FLUX USE MODD_CST USE MODD_CONF USE MODD_CTURB -use modd_field, only: tfielddata, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_NSV, ONLY: NSV_LGBEG, NSV_LGEND USE MODD_LES USE MODD_BLOWSNOW ! -USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! USE MODI_GRADIENT_M USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_SHUMAN -USE MODI_COEFJ +USE MODE_COEFJ, ONLY: COEFJ USE MODI_LES_MEAN_SUBGRID ! USE MODI_SECOND_MNH @@ -247,7 +197,7 @@ DO JSV=1,ISV ZFLXX(:,:,IKB-1:IKB-1) = 2. * MXM( ZWORK2D(:,:,1:1) ) - ZFLXX(:,:,IKB:IKB) ! ! stores <U SVth> - IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + IF ( TPFILE%LOPENED .AND. OTURB_FLX ) THEN WRITE(TZFIELD%CMNHNAME,'("USV_FLX_",I3.3)') JSV TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) @@ -258,7 +208,7 @@ DO JSV=1,ISV TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLXX) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLXX) END IF ! IF (LLES_CALL .AND. KSPLT==1) THEN @@ -298,7 +248,7 @@ DO JSV=1,ISV ZFLXY(:,:,IKB-1:IKB-1) = 2. * MYM( ZWORK2D(:,:,1:1) ) - ZFLXY(:,:,IKB:IKB) ! ! stores <V SVth> - IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + IF ( TPFILE%LOPENED .AND. OTURB_FLX ) THEN WRITE(TZFIELD%CMNHNAME,'("VSV_FLX_",I3.3)') JSV TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) @@ -309,7 +259,7 @@ DO JSV=1,ISV TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLXY) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLXY) END IF ! ELSE @@ -362,3 +312,4 @@ END DO ! end loop JSV ! ! END SUBROUTINE TURB_HOR_SV_FLUX +END MODULE MODE_TURB_HOR_SV_FLUX diff --git a/src/mesonh/turb/turb_hor_thermo_corr.f90 b/src/common/turb/mode_turb_hor_thermo_corr.F90 similarity index 81% rename from src/mesonh/turb/turb_hor_thermo_corr.f90 rename to src/common/turb/mode_turb_hor_thermo_corr.F90 index b619486765f9001c536c5b7860997c9c8894aaca..cd359059e6b87ecaf951a16f2ccc3888aac14db3 100644 --- a/src/mesonh/turb/turb_hor_thermo_corr.f90 +++ b/src/common/turb/mode_turb_hor_thermo_corr.F90 @@ -3,71 +3,11 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -! ################################ - MODULE MODI_TURB_HOR_THERMO_CORR -! ################################ -! -INTERFACE -! - SUBROUTINE TURB_HOR_THERMO_CORR(KRR, KRRL, KRRI, & - OTURB_FLX,OSUBG_COND, & - TPFILE, & - PINV_PDXX,PINV_PDYY, & - PDXX,PDYY,PDZZ,PDZX,PDZY, & - PTHVREF, & - PWM,PTHLM,PRM, & - PTKEM,PLM,PLEPS, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & - PSIGS ) -! -USE MODD_IO, ONLY: TFILEDATA -! -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. -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid -! condensation -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual - ! Potential Temperature -! -! Variables at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! mixing ratios at t-1, - ! where PRM(:,:,:,1) = conservative mixing ratio -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! Turb. Kin. Energy -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized - ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -! -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS - ! IN: Vertical part of Sigma_s at t - ! OUT: Total Sigma_s at t -! -! -! -END SUBROUTINE TURB_HOR_THERMO_CORR -! -END INTERFACE -! -END MODULE MODI_TURB_HOR_THERMO_CORR -! ################################################################ +MODULE MODE_TURB_HOR_THERMO_CORR +IMPLICIT NONE +CONTAINS SUBROUTINE TURB_HOR_THERMO_CORR(KRR, KRRL, KRRI, & - OTURB_FLX,OSUBG_COND, & + OTURB_FLX,OSUBG_COND,OOCEAN, & TPFILE, & PINV_PDXX,PINV_PDYY, & PDXX,PDYY,PDZZ,PDZX,PDZY, & @@ -121,12 +61,12 @@ END MODULE MODI_TURB_HOR_THERMO_CORR USE MODD_CST USE MODD_CONF USE MODD_CTURB -use modd_field, only: tfielddata, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES ! -USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! USE MODI_GRADIENT_M USE MODI_GRADIENT_U @@ -135,8 +75,8 @@ USE MODI_GRADIENT_W USE MODI_SHUMAN USE MODI_LES_MEAN_SUBGRID ! -USE MODI_EMOIST -USE MODI_ETHETA +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA ! USE MODI_SECOND_MNH ! @@ -153,6 +93,7 @@ INTEGER, INTENT(IN) :: KRRI ! number of ice water var. LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version ! condensation TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file ! @@ -224,7 +165,7 @@ ZCOEFF(:,:,IKB)= - (PDZZ(:,:,IKB+2)+2.*PDZZ(:,:,IKB+1)) / & ! ! ! -IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & +IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. TPFILE%LOPENED ) & .OR. ( LLES_CALL ) ) THEN ! !* 8.1 <THl THl> @@ -265,7 +206,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & END IF ! ! stores <THl THl> - IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + IF ( OTURB_FLX .AND. TPFILE%LOPENED ) THEN TZFIELD%CMNHNAME = 'THL_HVAR' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'THL_HVAR' @@ -276,7 +217,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! ! Storage in the LES configuration (addition to TURB_VER computation) @@ -286,7 +227,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_Thl2, .TRUE. ) CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLX, X_LES_RES_W_SBG_Thl2, .TRUE. ) CALL LES_MEAN_SUBGRID( -2.*XCTD*SQRT(PTKEM)*ZFLX/PLEPS ,X_LES_SUBGRID_DISS_Thl2, .TRUE. ) - ZA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) + ZA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM,OOCEAN) CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_ThlThv, .TRUE. ) CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_ThlPz, .TRUE. ) CALL SECOND_MNH(ZTIME2) @@ -353,7 +294,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & END IF ! ! stores <THl Rnp> - IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + IF ( OTURB_FLX .AND. TPFILE%LOPENED ) THEN TZFIELD%CMNHNAME = 'THLR_HCOR' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'THLR_HCOR' @@ -364,7 +305,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! ! Storage in the LES configuration (addition to TURB_VER computation) @@ -376,7 +317,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & CALL LES_MEAN_SUBGRID( -XCTD*SQRT(PTKEM)*ZFLX/PLEPS ,X_LES_SUBGRID_DISS_ThlRt, .TRUE. ) CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_RtThv, .TRUE. ) CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_RtPz,.TRUE.) - ZA(:,:,:) = EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) + ZA(:,:,:) = EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM,OOCEAN) CALL LES_MEAN_SUBGRID( ZA*ZFLX, X_LES_SUBGRID_ThlThv, .TRUE. ) CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLX, X_LES_SUBGRID_ThlPz,.TRUE.) CALL SECOND_MNH(ZTIME2) @@ -421,7 +362,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & END IF ! ! stores <Rnp Rnp> - IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + IF ( OTURB_FLX .AND. TPFILE%LOPENED ) THEN TZFIELD%CMNHNAME = 'R_HVAR' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'R_HVAR' @@ -432,7 +373,7 @@ IF ( ( KRRL > 0 .AND. OSUBG_COND) .OR. ( OTURB_FLX .AND. tpfile%lopened ) & TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! ! Storage in the LES configuration (addition to TURB_VER computation) @@ -466,3 +407,4 @@ END IF ! ! END SUBROUTINE TURB_HOR_THERMO_CORR +END MODULE MODE_TURB_HOR_THERMO_CORR diff --git a/src/mesonh/turb/turb_hor_thermo_flux.f90 b/src/common/turb/mode_turb_hor_thermo_flux.F90 similarity index 86% rename from src/mesonh/turb/turb_hor_thermo_flux.f90 rename to src/common/turb/mode_turb_hor_thermo_flux.F90 index 90d189a2bf41c8261bc26bc692a95ec3fc2297a6..97a74596e8bd6ef4086862a7554d27c61c86acf7 100644 --- a/src/mesonh/turb/turb_hor_thermo_flux.f90 +++ b/src/common/turb/mode_turb_hor_thermo_flux.F90 @@ -3,74 +3,9 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -! ################################ - MODULE MODI_TURB_HOR_THERMO_FLUX -! ################################ -! -INTERFACE -! - SUBROUTINE TURB_HOR_THERMO_FLUX(KSPLT, KRR, KRRL, KRRI, & - OTURB_FLX,OSUBG_COND, & - TPFILE, & - PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & - PDXX,PDYY,PDZZ,PDZX,PDZY, & - PDIRCOSXW,PDIRCOSYW, & - PRHODJ, & - PSFTHM,PSFRM, & - PWM,PTHLM,PRM, & - PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & - PRTHLS,PRRS ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KSPLT ! split process index -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. -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for sub-grid -! condensation -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. - ! PK = PLM * SQRT(PTKEM) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW -! Director Cosinus along x, y and z directions at surface w-point -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM -! -! Variables at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! mixing ratios at t-1, - ! where PRM(:,:,:,1) = conservative mixing ratio -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM - ! normalized 2nd-order flux - ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHLS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS ! var. at t+1 -split- -! -! -END SUBROUTINE TURB_HOR_THERMO_FLUX -! -END INTERFACE -! -END MODULE MODI_TURB_HOR_THERMO_FLUX +MODULE MODE_TURB_HOR_THERMO_FLUX +IMPLICIT NONE +CONTAINS ! ################################################################ SUBROUTINE TURB_HOR_THERMO_FLUX(KSPLT, KRR, KRRL, KRRI, & OTURB_FLX,OSUBG_COND, & @@ -130,12 +65,12 @@ END MODULE MODI_TURB_HOR_THERMO_FLUX USE MODD_CST USE MODD_CONF USE MODD_CTURB -use modd_field, only: tfielddata, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES ! -USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! USE MODI_GRADIENT_M USE MODI_GRADIENT_U @@ -143,8 +78,8 @@ USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_SHUMAN USE MODI_LES_MEAN_SUBGRID -!!USE MODI_EMOIST -!!USE MODI_ETHETA +!!USE MODE_EMOIST, ONLY: EMOIST +!!USE MODE_ETHETA, ONLY: ETHETA ! USE MODI_SECOND_MNH ! @@ -310,7 +245,7 @@ END IF !!ZWORK(:,:,:) = ZFLX(:,:,:) ! ! stores the horizontal <U THl> -IF ( tpfile%lopened .AND. OTURB_FLX ) THEN +IF ( TPFILE%LOPENED .AND. OTURB_FLX ) THEN TZFIELD%CMNHNAME = 'UTHL_FLX' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'UTHL_FLX' @@ -321,7 +256,7 @@ IF ( tpfile%lopened .AND. OTURB_FLX ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! IF (KSPLT==1 .AND. LLES_CALL) THEN @@ -413,7 +348,7 @@ IF (KRR/=0) THEN END IF ! ! stores the horizontal <U Rnp> - IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + IF ( TPFILE%LOPENED .AND. OTURB_FLX ) THEN TZFIELD%CMNHNAME = 'UR_FLX' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'UR_FLX' @@ -424,7 +359,7 @@ IF (KRR/=0) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! IF (KSPLT==1 .AND. LLES_CALL) THEN @@ -462,7 +397,7 @@ END IF !! ZFLX(:,:,:)*MXM(EMOIST(KRR,KRRI,PTHLT,PEXNREF,PRT,PLOCPT,PSRCM)) !! ! !! ! stores the horizontal <U VPT> -!! IF ( tpfile%lopened .AND. OTURB_FLX ) THEN +!! IF ( TPFILE%LOPENED .AND. OTURB_FLX ) THEN !! TZFIELD%CMNHNAME = 'UVPT_FLX' !! TZFIELD%CSTDNAME = '' !! TZFIELD%CLONGNAME = 'UVPT_FLX' @@ -473,7 +408,7 @@ END IF !! TZFIELD%NTYPE = TYPEREAL !! TZFIELD%NDIMS = 3 !! TZFIELD%LTIMEDEP = .TRUE. -!! CALL IO_Field_write(TPFILE,TZFIELD,ZVPTU) +!! CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZVPTU) !! END IF !!! !!ELSE @@ -565,7 +500,7 @@ END IF !!ZWORK(:,:,:) = ZFLX(:,:,:) ! ! stores the horizontal <V THl> -IF ( tpfile%lopened .AND. OTURB_FLX ) THEN +IF ( TPFILE%LOPENED .AND. OTURB_FLX ) THEN TZFIELD%CMNHNAME = 'VTHL_FLX' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'VTHL_FLX' @@ -576,7 +511,7 @@ IF ( tpfile%lopened .AND. OTURB_FLX ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! IF (KSPLT==1 .AND. LLES_CALL) THEN @@ -677,7 +612,7 @@ IF (KRR/=0) THEN END IF ! ! stores the horizontal <V Rnp> - IF ( tpfile%lopened .AND. OTURB_FLX ) THEN + IF ( TPFILE%LOPENED .AND. OTURB_FLX ) THEN TZFIELD%CMNHNAME = 'VR_FLX' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'VR_FLX' @@ -688,7 +623,7 @@ IF (KRR/=0) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! IF (KSPLT==1 .AND. LLES_CALL) THEN @@ -730,7 +665,7 @@ END IF !! END IF !! ! !! ! stores the horizontal <V VPT> -!! IF ( tpfile%lopened .AND. OTURB_FLX ) THEN +!! IF ( TPFILE%LOPENED .AND. OTURB_FLX ) THEN !! TZFIELD%CMNHNAME = 'VVPT_FLX' !! TZFIELD%CSTDNAME = '' !! TZFIELD%CLONGNAME = 'VVPT_FLX' @@ -741,7 +676,7 @@ END IF !! TZFIELD%NTYPE = TYPEREAL !! TZFIELD%NDIMS = 3 !! TZFIELD%LTIMEDEP = .TRUE. -!! CALL IO_Field_write(TPFILE,TZFIELD,ZVPTV) +!! CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZVPTV) !! END IF !!! !!ELSE @@ -750,3 +685,4 @@ END IF ! ! END SUBROUTINE TURB_HOR_THERMO_FLUX +END MODULE MODE_TURB_HOR_THERMO_FLUX diff --git a/src/mesonh/turb/turb_hor_tke.f90 b/src/common/turb/mode_turb_hor_tke.F90 similarity index 82% rename from src/mesonh/turb/turb_hor_tke.f90 rename to src/common/turb/mode_turb_hor_tke.F90 index ec8e9e2b63953f2eb38ebfad15f72c6837337fab..5ff7a0029077c979ca71d3ed008b7d165cc340f8 100644 --- a/src/mesonh/turb/turb_hor_tke.f90 +++ b/src/common/turb/mode_turb_hor_tke.F90 @@ -3,43 +3,9 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -! #################### - MODULE MODI_TURB_HOR_TKE -! #################### -! -INTERFACE -! - SUBROUTINE TURB_HOR_TKE(KSPLT, & - PDXX,PDYY,PDZZ,PDZX,PDZY, & - PINV_PDXX, PINV_PDYY, PINV_PDZZ, PMZM_PRHODJ, & - PK, PRHODJ, PTKEM, & - PTRH ) - -! -INTEGER, INTENT(IN) :: KSPLT ! current split index -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. - ! PK = PLM * SQRT(PTKEM) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume -! -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTRH ! horizontal transport of Tke -! -! -! -END SUBROUTINE TURB_HOR_TKE -! -END INTERFACE -! -END MODULE MODI_TURB_HOR_TKE -! ################################################################ +MODULE MODE_TURB_HOR_TKE +IMPLICIT NONE +CONTAINS SUBROUTINE TURB_HOR_TKE(KSPLT, & PDXX, PDYY, PDZZ,PDZX,PDZY, & PINV_PDXX, PINV_PDYY, PINV_PDZZ, PMZM_PRHODJ, & @@ -244,3 +210,4 @@ END IF !---------------------------------------------------------------------------- ! END SUBROUTINE TURB_HOR_TKE +END MODULE MODE_TURB_HOR_TKE diff --git a/src/mesonh/turb/turb_hor_uv.f90 b/src/common/turb/mode_turb_hor_uv.F90 similarity index 75% rename from src/mesonh/turb/turb_hor_uv.f90 rename to src/common/turb/mode_turb_hor_uv.F90 index 3fcecc20e2d98fa1844db2631a0c1e10256cd7f3..611679c73c5fa03ddca83a2daddd5cd1707a4d28 100644 --- a/src/mesonh/turb/turb_hor_uv.f90 +++ b/src/common/turb/mode_turb_hor_uv.F90 @@ -3,73 +3,9 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -! ####################### - MODULE MODI_TURB_HOR_UV -! ####################### -! -INTERFACE -! - SUBROUTINE TURB_HOR_UV(KSPLT, & - OTURB_FLX, & - TPFILE, & - PK,PINV_PDXX,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & - PDXX,PDYY,PDZZ,PDZX,PDZY, & - PDIRCOSZW, & - PCOSSLOPE,PSINSLOPE, & - PRHODJ, & - PCDUEFF,PTAU11M,PTAU12M,PTAU22M,PTAU33M, & - PUM,PVM,PUSLOPEM,PVSLOPEM, & - PDP, & - PRUS,PRVS ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KSPLT ! split process index -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. - ! PK = PLM * SQRT(PTKEM) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW -! Director Cosinus along z directions at surface w-point -REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume -! -REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked - ! to the maximum slope direction and the surface normal and the binormal - ! at time t - dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU22M ! <vv> in the same axes -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes -! -! Variables at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM -REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the - ! maximum slope direction -REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the - ! direction normal to the maximum slope one -! -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! var. at t+1 -split- -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP ! TKE production terms -! -! -END SUBROUTINE TURB_HOR_UV -! -END INTERFACE -! -END MODULE MODI_TURB_HOR_UV +MODULE MODE_TURB_HOR_UV +IMPLICIT NONE +CONTAINS ! ################################################################ SUBROUTINE TURB_HOR_UV(KSPLT, & OTURB_FLX, & @@ -126,19 +62,19 @@ END MODULE MODI_TURB_HOR_UV USE MODD_CST USE MODD_CONF USE MODD_CTURB -use modd_field, only: tfielddata, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES ! -USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! USE MODI_GRADIENT_M USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_SHUMAN -USE MODI_COEFJ +USE MODE_COEFJ, ONLY: COEFJ USE MODI_LES_MEAN_SUBGRID ! USE MODI_SECOND_MNH @@ -269,7 +205,7 @@ ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( MYM( ZFLX(:,:,IKB-1:IKB-1) ) ) & - ZFLX(:,:,IKB:IKB) ! ! stores <U V> -IF ( tpfile%lopened .AND. OTURB_FLX ) THEN +IF ( TPFILE%LOPENED .AND. OTURB_FLX ) THEN TZFIELD%CMNHNAME = 'UV_FLX' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'UV_FLX' @@ -280,7 +216,7 @@ IF ( tpfile%lopened .AND. OTURB_FLX ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! ! @@ -353,3 +289,4 @@ END IF ! ! END SUBROUTINE TURB_HOR_UV +END MODULE MODE_TURB_HOR_UV diff --git a/src/mesonh/turb/turb_hor_uw.f90 b/src/common/turb/mode_turb_hor_uw.F90 similarity index 77% rename from src/mesonh/turb/turb_hor_uw.f90 rename to src/common/turb/mode_turb_hor_uw.F90 index d19c68bae6607c4805871d5e4169380917ccdb80..47005d4a3730f5920f87dc9b813f7f50f6d68985 100644 --- a/src/mesonh/turb/turb_hor_uw.f90 +++ b/src/common/turb/mode_turb_hor_uw.F90 @@ -3,61 +3,9 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -! ####################### - MODULE MODI_TURB_HOR_UW -! ####################### -! -INTERFACE -! - SUBROUTINE TURB_HOR_UW(KSPLT, & - OTURB_FLX,KRR, & - TPFILE, & - PK,PINV_PDXX,PINV_PDZZ,PMZM_PRHODJ, & - PDXX,PDZZ,PDZX, & - PRHODJ,PTHVREF, & - PUM,PWM,PTHLM,PRM,PSVM, & - PTKEM,PLM, & - PDP, & - PRUS,PRWS ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KSPLT ! split process index -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -INTEGER, INTENT(IN) :: KRR ! number of moist var. -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. - ! PK = PLM * SQRT(PTKEM) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDXX ! 1./PDXX -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDZZ, PDZX - ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state VPT -! -! Variables at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PWM,PTHLM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRWS -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP ! TKE production terms -! -! -! -! -END SUBROUTINE TURB_HOR_UW -! -END INTERFACE -! -END MODULE MODI_TURB_HOR_UW +MODULE MODE_TURB_HOR_UW +IMPLICIT NONE +CONTAINS ! ################################################################ SUBROUTINE TURB_HOR_UW(KSPLT, & OTURB_FLX,KRR, & @@ -117,20 +65,20 @@ END MODULE MODI_TURB_HOR_UW USE MODD_CST USE MODD_CONF USE MODD_CTURB -use modd_field, only: tfielddata, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES USE MODD_NSV ! -USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! USE MODI_GRADIENT_M USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_SHUMAN -USE MODI_COEFJ +USE MODE_COEFJ, ONLY: COEFJ USE MODI_LES_MEAN_SUBGRID ! USE MODI_SECOND_MNH @@ -219,7 +167,7 @@ ZFLX(:,:,IKB) = 0. ZFLX(:,:,IKB-1)=2.*ZFLX(:,:,IKB)- ZFLX(:,:,IKB+1) ! ! stores <U W> -IF ( tpfile%lopened .AND. OTURB_FLX ) THEN +IF ( TPFILE%LOPENED .AND. OTURB_FLX ) THEN TZFIELD%CMNHNAME = 'UW_HFLX' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'UW_HFLX' @@ -230,7 +178,7 @@ IF ( tpfile%lopened .AND. OTURB_FLX ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! ! @@ -297,3 +245,4 @@ END IF ! END SUBROUTINE TURB_HOR_UW +END MODULE MODE_TURB_HOR_UW diff --git a/src/mesonh/turb/turb_hor_vw.f90 b/src/common/turb/mode_turb_hor_vw.F90 similarity index 77% rename from src/mesonh/turb/turb_hor_vw.f90 rename to src/common/turb/mode_turb_hor_vw.F90 index df888c2c7ba810d520a842ae57584710b2708359..8ede64d515ea715cf2c3f0ee6fc09f7d06909b91 100644 --- a/src/mesonh/turb/turb_hor_vw.f90 +++ b/src/common/turb/mode_turb_hor_vw.F90 @@ -3,58 +3,9 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -! ####################### - MODULE MODI_TURB_HOR_VW -! ####################### -! -INTERFACE -! - SUBROUTINE TURB_HOR_VW(KSPLT, & - OTURB_FLX,KRR, & - TPFILE, & - PK,PINV_PDYY,PINV_PDZZ,PMZM_PRHODJ, & - PDYY,PDZZ,PDZY, & - PRHODJ,PTHVREF, & - PVM,PWM,PTHLM,PRM,PSVM, & - PTKEM,PLM, & - PDP, & - PRVS,PRWS ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KSPLT ! split process index -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -INTEGER, INTENT(IN) :: KRR ! number of moist var. -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion doef. - ! PK = PLM * SQRT(PTKEM) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDYY ! 1./PDYY -REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ -REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY, PDZZ, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density * grid volume -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state VPT -! -! Variables at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PVM,PWM,PTHLM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t- dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS, PRWS ! var. at t+1 -split- -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP ! TKE production terms -! -END SUBROUTINE TURB_HOR_VW -! -END INTERFACE -! -END MODULE MODI_TURB_HOR_VW -! ################################################################ +MODULE MODE_TURB_HOR_VW +IMPLICIT NONE +CONTAINS SUBROUTINE TURB_HOR_VW(KSPLT, & OTURB_FLX,KRR, & TPFILE, & @@ -113,20 +64,20 @@ END MODULE MODI_TURB_HOR_VW USE MODD_CST USE MODD_CONF USE MODD_CTURB -use modd_field, only: tfielddata, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES USE MODD_NSV ! -USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! USE MODI_GRADIENT_M USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_SHUMAN -USE MODI_COEFJ +USE MODE_COEFJ, ONLY: COEFJ USE MODI_LES_MEAN_SUBGRID ! USE MODI_SECOND_MNH @@ -221,7 +172,7 @@ ZFLX(:,:,IKB) = 0. ZFLX(:,:,IKB-1)= 2.*ZFLX(:,:,IKB) - ZFLX(:,:,IKB+1) ! ! stores <V W> -IF ( tpfile%lopened .AND. OTURB_FLX ) THEN +IF ( TPFILE%LOPENED .AND. OTURB_FLX ) THEN TZFIELD%CMNHNAME = 'VW_HFLX' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'VW_HFLX' @@ -232,7 +183,7 @@ IF ( tpfile%lopened .AND. OTURB_FLX ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLX) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZFLX) END IF ! ! compute the source for rho*V due to this residual flux ( the other part is @@ -305,3 +256,4 @@ END IF ! ! END SUBROUTINE TURB_HOR_VW +END MODULE MODE_TURB_HOR_VW diff --git a/src/arome/turb/turb_ver.F90 b/src/common/turb/mode_turb_ver.F90 similarity index 78% rename from src/arome/turb/turb_ver.F90 rename to src/common/turb/mode_turb_ver.F90 index 3d8b6dd0defd8f3a6c120f463490b327dfc9dcc3..49ed101bb374d335175ae8b26f446b5bdf427f44 100644 --- a/src/arome/turb/turb_ver.F90 +++ b/src/common/turb/mode_turb_ver.F90 @@ -1,9 +1,14 @@ -! ######spl - SUBROUTINE TURB_VER(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OCLOSE_OUT,OTURB_FLX, & - HTURBDIM,HTOM,PIMPL,PEXPL, & - PTSTEP_UVW,PTSTEP_MET, PTSTEP_SV, & - HFMFILE,HLUOUT, & +!MNH_LIC Copyright 1994-2022 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_TURB_VER +IMPLICIT NONE +CONTAINS +SUBROUTINE TURB_VER(KKA,KKU,KKL,KRR,KRRL,KRRI, & + OTURB_FLX, OOCEAN, & + HTURBDIM,HTOM,PIMPL,PEXPL, & + PTSTEP, TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PCOSSLOPE,PSINSLOPE, & PRHODJ,PTHVREF, & @@ -15,10 +20,7 @@ PFWTH,PFWR,PFTH2,PFR2,PFTHR,PBL_DEPTH, & PSBL_DEPTH,PLMO, & PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS, & - PDP,PTP,PSIGS,PWTH,PWRC,PWSV) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK - USE MODD_CTURB, ONLY : LHARAT + PDP,PTP,PSIGS,PWTH,PWRC,PWSV ) ! ############################################################### ! ! @@ -109,17 +111,11 @@ !! field to be derivated !! _(M,UW,...) represent the localization of the !! field derivated -!! !! -!! MXM,MXF,MYM,MYF,MZM,MZF -!! : Shuman functions (mean operators) -!! DXF,DYF,DZF,DZM -!! : Shuman functions (difference operators) -!! -!! SUBROUTINE TRIDIAG : to compute the splitted implicit evolution +!! SUBROUTINE TRIDIAG : to compute the split implicit evolution !! of a variable located at a mass point !! -!! SUBROUTINE TRIDIAG_WIND: to compute the splitted implicit evolution +!! SUBROUTINE TRIDIAG_WIND: to compute the split implicit evolution !! of a variable located at a wind point !! !! FUNCTIONs ETHETA and EMOIST : @@ -200,35 +196,46 @@ !! advection schemes !! Feb. 2012 (Y. Seity) add possibility to run with !! reversed vertical levels +!! 10/2012 (J.Escobar) Bypass PGI bug , redefine some allocatable array inplace of automatic +!! 08/2014 (J.Escobar) Bypass PGI memory leak bug , replace IF statement with IF THEN ENDIF !! Modifications: July, 2015 (Wim de Rooy) switch for HARATU (Racmo turbulence scheme) +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! JL Redelsperger 03/2021 : add Ocean LES case !!-------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! USE MODD_CST USE MODD_CTURB +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES -USE MODD_NSV, ONLY : NSV +USE MODD_NSV, ONLY: NSV ! -USE MODI_PRANDTL -USE MODI_EMOIST -USE MODI_ETHETA +!USE MODE_PRANDTL, ONLY: PRANDTL +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA USE MODI_GRADIENT_M USE MODI_GRADIENT_W USE MODI_TURB -USE MODI_TURB_VER_THERMO_FLUX -USE MODI_TURB_VER_THERMO_CORR -USE MODI_TURB_VER_DYN_FLUX -USE MODI_TURB_VER_SV_FLUX -USE MODI_TURB_VER_SV_CORR +USE MODE_TURB_VER_THERMO_FLUX, ONLY: TURB_VER_THERMO_FLUX +USE MODE_TURB_VER_THERMO_CORR, ONLY: TURB_VER_THERMO_CORR +USE MODE_TURB_VER_DYN_FLUX, ONLY: TURB_VER_DYN_FLUX +USE MODE_TURB_VER_SV_FLUX, ONLY: TURB_VER_SV_FLUX +USE MODE_TURB_VER_SV_CORR, ONLY: TURB_VER_SV_CORR USE MODI_LES_MEAN_SUBGRID -USE MODI_SBL_DEPTH +USE MODE_SBL_DEPTH, ONLY: SBL_DEPTH +USE MODI_SECOND_MNH ! -USE MODE_FMWRIT +USE MODE_IO_FIELD_WRITE, only: IO_Field_write USE MODE_PRANDTL ! +! IMPLICIT NONE ! !* 0.1 declarations of arguments @@ -241,21 +248,15 @@ INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH - 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. -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file -CHARACTER*4, INTENT(IN) :: HTURBDIM ! dimensionality of the +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme -CHARACTER*4, INTENT(IN) :: HTOM ! type of Third Order Moment +CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -REAL, INTENT(IN) :: PTSTEP_UVW ! Dynamical timestep -REAL, INTENT(IN) :: PTSTEP_MET ! Timestep for meteorological variables -REAL, INTENT(IN) :: PTSTEP_SV ! Timestep for tracer variables -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n +REAL, INTENT(IN) :: PTSTEP ! timestep +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY ! Metric coefficients @@ -298,7 +299,6 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the ! direction normal to the maximum slope one ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length ! PLENGTHM PLENGTHH used in case of LHARATU REAL, DIMENSION(:,:,:), INTENT(IN) :: PLENGTHM ! Turb. mixing length momentum @@ -336,7 +336,9 @@ REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & +!JUAN BUG PGI +!!$REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & +REAL, ALLOCATABLE, DIMENSION(:,:,:) :: & ZBETA, & ! buoyancy coefficient ZSQRT_TKE,& ! sqrt(e) ZDTH_DZ, & ! d(th)/dz @@ -357,17 +359,14 @@ REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & ZWV, & ! (v'w') ZTHLP, & ! guess of potential temperature due to vert. turbulent flux ZRP ! guess of total water due to vert. turbulent flux -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV) :: & + +!!$REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV) :: & +REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: & ZPSI_SV, & ! Prandtl number for scalars - ZREDS1, & ! 1D Redeslperger number R_sv - ZRED2THS, & ! 3D Redeslperger number R*2_thsv - ZRED2RS ! 3D Redeslperger number R*2_rsv + ZREDS1, & ! 1D Redelsperger number R_sv + ZRED2THS, & ! 3D Redelsperger number R*2_thsv + ZRED2RS ! 3D Redelsperger number R*2_rsv REAL, DIMENSION(SIZE(PLM,1),SIZE(PLM,2),SIZE(PLM,3)) :: ZLM -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 ! LOGICAL :: GUSERV ! flag to use water vapor INTEGER :: IKB,IKE ! index value for the Beginning @@ -375,27 +374,53 @@ INTEGER :: IKB,IKE ! index value for the Beginning INTEGER :: JSV ! loop counter on scalar variables REAL :: ZTIME1 REAL :: ZTIME2 +REAL(KIND=JPRB) :: ZHOOK_HANDLE +TYPE(TFIELDDATA) :: TZFIELD +!---------------------------------------------------------------------------- +ALLOCATE ( ZBETA(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZSQRT_TKE(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)),& + ZDTH_DZ(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZDR_DZ(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZRED2TH3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZRED2R3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZRED2THR3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)),& + ZBLL_O_E(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZETHETA(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZEMOIST(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZREDTH1(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZREDR1(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZPHI3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZPSI3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZD(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZWTHV(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZWU(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZWV(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZTHLP(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& + ZRP(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ) + +ALLOCATE ( & + ZPSI_SV(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV), & + ZREDS1(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV), & + ZRED2THS(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV), & + ZRED2RS(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV) ) + !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES ! ------------- ! -REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('TURB_VER',0,ZHOOK_HANDLE) -PTP (:,:,:) = 0. -PDP (:,:,:) = 0. ! IKB=KKA+JPVEXT_TURB*KKL IKE=KKU-JPVEXT_TURB*KKL - ! ! ! 3D Redelsperger numbers ! ! -CALL PRANDTL(KKA,KKU,KKL,KRR,KRRI,OCLOSE_OUT,OTURB_FLX, & - HTURBDIM, & - HFMFILE,HLUOUT, & +CALL PRANDTL(KKA,KKU,KKL,KRR,KRRI,OTURB_FLX, & + HTURBDIM, OOCEAN, & + TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY, & PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & PLM,PLEPS,PTKEM,PTHLM,PRM,PSVM,PSRCM, & @@ -404,9 +429,14 @@ CALL PRANDTL(KKA,KKU,KKL,KRR,KRRI,OCLOSE_OUT,OTURB_FLX, & ZREDS1,ZRED2THS, ZRED2RS, & ZBLL_O_E, & ZETHETA, ZEMOIST ) +! ! Buoyancy coefficient ! -ZBETA = XG/PTHVREF +IF (OOCEAN) THEN + ZBETA = XG*XALPHAOC +ELSE + ZBETA = XG/PTHVREF +END IF ! ! Square root of Tke ! @@ -414,17 +444,17 @@ ZSQRT_TKE = SQRT(PTKEM) ! ! gradients of mean quantities at previous time-step ! -ZDTH_DZ = GZ_M_W(PTHLM(:,:,:),PDZZ, KKA, KKU, KKL) +ZDTH_DZ = GZ_M_W(KKA, KKU, KKL,PTHLM(:,:,:),PDZZ) ZDR_DZ = 0. -IF (KRR>0) ZDR_DZ = GZ_M_W(PRM(:,:,:,1),PDZZ, KKA, KKU, KKL) +IF (KRR>0) ZDR_DZ = GZ_M_W(KKA, KKU, KKL,PRM(:,:,:,1),PDZZ) ! ! ! Denominator factor in 3rd order terms ! IF (.NOT. LHARAT) THEN -ZD(:,:,:) = (1.+ZREDTH1+ZREDR1) * (1.+0.5*(ZREDTH1+ZREDR1)) + ZD(:,:,:) = (1.+ZREDTH1+ZREDR1) * (1.+0.5*(ZREDTH1+ZREDR1)) ELSE -ZD(:,:,:) = 1. + ZD(:,:,:) = 1. ENDIF ! ! Phi3 and Psi3 Prandtl numbers @@ -450,8 +480,6 @@ IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF - -!ENDIF !---------------------------------------------------------------------------- ! ! @@ -468,16 +496,15 @@ END IF ! IF (LHARAT) THEN -ZLM=PLENGTHH + ZLM=PLENGTHH ELSE -ZLM=PLM + ZLM=PLM ENDIF ! CALL TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OCLOSE_OUT,OTURB_FLX,HTURBDIM,HTOM, & - PIMPL,PEXPL, & - PTSTEP_MET, & - HFMFILE,HLUOUT, & + OTURB_FLX,HTURBDIM,HTOM,OOCEAN, & + PIMPL,PEXPL,PTSTEP, & + TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PRHODJ,PTHVREF, & PSFTHM,PSFRM,PSFTHP,PSFRP, & @@ -491,14 +518,10 @@ ENDIF MFMOIST,PBL_DEPTH,ZWTHV, & PRTHLS,PRRS,ZTHLP,ZRP,PTP,PWTH,PWRC ) ! -! -! -! Use Lh (=Lq) from vdfexcuhl as input for turb_ver_thermo_corr - CALL TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OCLOSE_OUT,OTURB_FLX,HTURBDIM,HTOM, & + OTURB_FLX,HTURBDIM,HTOM, & PIMPL,PEXPL, & - HFMFILE,HLUOUT, & + TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW, & PRHODJ,PTHVREF, & PSFTHM,PSFRM,PSFTHP,PSFRP, & @@ -525,15 +548,12 @@ ENDIF ! ----------------------------------------------- ! ! -IF (LHARAT) THEN -ZLM=PLENGTHM -ENDIF - +IF (LHARAT) ZLM=PLENGTHM +! CALL TURB_VER_DYN_FLUX(KKA,KKU,KKL, & - OCLOSE_OUT,OTURB_FLX,KRR, & - HTURBDIM,PIMPL,PEXPL, & - PTSTEP_UVW, & - HFMFILE,HLUOUT, & + OTURB_FLX,KRR, OOCEAN, & + HTURBDIM,PIMPL,PEXPL,PTSTEP, & + TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PCOSSLOPE,PSINSLOPE, & PRHODJ, & @@ -541,7 +561,7 @@ CALL TURB_VER_DYN_FLUX(KKA,KKU,KKL, & PTHLM,PRM,PSVM,PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & PTKEM,ZLM,MFMOIST,ZWU,ZWV, & PRUS,PRVS,PRWS, & - PDP,PTP ) + PDP,PTP ) ! !---------------------------------------------------------------------------- ! @@ -549,16 +569,13 @@ CALL TURB_VER_DYN_FLUX(KKA,KKU,KKL, & !* 8. SOURCES OF PASSIVE SCALAR VARIABLES ! ----------------------------------- ! -IF (LHARAT) THEN -ZLM=PLENGTHH -ENDIF - +IF (LHARAT) ZLM=PLENGTHH +! IF (SIZE(PSVM,4)>0) & CALL TURB_VER_SV_FLUX(KKA,KKU,KKL, & - OCLOSE_OUT,OTURB_FLX,HTURBDIM, & - PIMPL,PEXPL, & - PTSTEP_SV, & - HFMFILE,HLUOUT, & + OTURB_FLX,HTURBDIM, & + PIMPL,PEXPL,PTSTEP, & + TPFILE, & PDZZ,PDIRCOSZW, & PRHODJ,PWM, & PSFSVM,PSFSVP, & @@ -568,7 +585,7 @@ CALL TURB_VER_SV_FLUX(KKA,KKU,KKL, & ! ! IF (SIZE(PSVM,4)>0 .AND. LLES_CALL) & -CALL TURB_VER_SV_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & +CALL TURB_VER_SV_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI,OOCEAN, & PDZZ, & PTHLM,PRM,PTHVREF, & PLOCPEXNM,PATHETA,PAMOIST,PSRCM,ZPHI3,ZPSI3, & @@ -590,40 +607,57 @@ IF (SIZE(PSBL_DEPTH)>0) CALL SBL_DEPTH(IKB,IKE,PZZ,ZWU,ZWV,ZWTHV,PLMO,PSBL_DEPTH ! ------ ! ! -IF ( OTURB_FLX .AND. OCLOSE_OUT .AND. .NOT. LHARAT) THEN +IF ( OTURB_FLX .AND. TPFILE%LOPENED .AND. .NOT. LHARAT) THEN ! ! stores the Turbulent Prandtl number ! - YRECFM ='PHI3' - YCOMMENT='X_Y_Z_PHI3 (0)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZPHI3,IGRID,ILENCH,YCOMMENT,IRESP) + TZFIELD%CMNHNAME = 'PHI3' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'PHI3' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'Turbulent Prandtl number' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZPHI3) ! ! stores the Turbulent Schmidt number ! - YRECFM ='PSI3' - YCOMMENT='X_Y_Z_PSI3 (0)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) -! - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZPSI3,IGRID,ILENCH,YCOMMENT,IRESP) + TZFIELD%CMNHNAME = 'PSI3' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'PSI3' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'Turbulent Schmidt number' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZPSI3) ! ! ! stores the Turbulent Schmidt number for the scalar variables ! + TZFIELD%CSTDNAME = '' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. DO JSV=1,NSV - WRITE(YRECFM, '("PSI_SV_",I3.3)') JSV - YCOMMENT='X_Y_Z_'//YRECFM//' (0)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZPSI_SV(:,:,:,JSV), & - IGRID,ILENCH,YCOMMENT,IRESP) + WRITE(TZFIELD%CMNHNAME, '("PSI_SV_",I3.3)') JSV + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) + CALL IO_Field_write(TPFILE,TZFIELD,ZPSI_SV(:,:,:,JSV)) END DO - +! END IF ! ! !---------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TURB_VER',1,ZHOOK_HANDLE) -END SUBROUTINE TURB_VER +END SUBROUTINE TURB_VER +END MODULE MODE_TURB_VER diff --git a/src/mesonh/turb/turb_ver_dyn_flux.f90 b/src/common/turb/mode_turb_ver_dyn_flux.F90 similarity index 80% rename from src/mesonh/turb/turb_ver_dyn_flux.f90 rename to src/common/turb/mode_turb_ver_dyn_flux.F90 index 51bc4e7e1b868799b038e1e56b089bd2cb88ae22..12915e63529d9791f97de93bbb1fe0f9cad3846b 100644 --- a/src/mesonh/turb/turb_ver_dyn_flux.f90 +++ b/src/common/turb/mode_turb_ver_dyn_flux.F90 @@ -2,92 +2,11 @@ !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 MODI_TURB_VER_DYN_FLUX -! #################### -! -INTERFACE -! - SUBROUTINE TURB_VER_DYN_FLUX(KKA,KKU,KKL, & - OTURB_FLX,KRR, & - HTURBDIM,PIMPL,PEXPL, & - PTSTEP, & - TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & - PCOSSLOPE,PSINSLOPE, & - PRHODJ, & - PCDUEFF,PTAU11M,PTAU12M,PTAU33M, & - PTHLM,PRM,PSVM,PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & - PTKEM,PLM,PWU,PWV, & - PRUS,PRVS,PRWS, & - PDP,PTP ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -INTEGER, INTENT(IN) :: KRR ! number of moist var. -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -REAL, INTENT(IN) :: PTSTEP ! Double Time Step -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle - ! between i and the slope vector -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -! -REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked - ! to the maximum slope direction and the surface normal and the binormal - ! at time t - dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM - ! Wind at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM -REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the - ! maximum slope direction -REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the - ! direction normal to the maximum slope one -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWU ! momentum flux u'w' -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWV ! momentum flux v'w' -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS - ! cumulated sources for the prognostic variables -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP ! Dynamic TKE production term -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTP ! Thermal TKE production term -! -! -! -END SUBROUTINE TURB_VER_DYN_FLUX -! -END INTERFACE -! -END MODULE MODI_TURB_VER_DYN_FLUX -! -! -! ############################################################### - SUBROUTINE TURB_VER_DYN_FLUX(KKA,KKU,KKL, & - OTURB_FLX,KRR, & +MODULE MODE_TURB_VER_DYN_FLUX +IMPLICIT NONE +CONTAINS +SUBROUTINE TURB_VER_DYN_FLUX(KKA,KKU,KKL, & + OTURB_FLX,KRR, OOCEAN, & HTURBDIM,PIMPL,PEXPL, & PTSTEP, & TPFILE, & @@ -96,7 +15,7 @@ END MODULE MODI_TURB_VER_DYN_FLUX PRHODJ, & PCDUEFF,PTAU11M,PTAU12M,PTAU33M, & PTHLM,PRM,PSVM,PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & - PTKEM,PLM,PWU,PWV, & + PTKEM,PLM,MFMOIST,PWU,PWV, & PRUS,PRVS,PRWS, & PDP,PTP ) ! ############################################################### @@ -196,9 +115,6 @@ END MODULE MODI_TURB_VER_DYN_FLUX !! DXF,DYF,DZF,DZM !! : Shuman functions (difference operators) !! -!! SUBROUTINE TRIDIAG : to compute the split implicit evolution -!! of a variable located at a mass point -!! !! SUBROUTINE TRIDIAG_WIND: to compute the split implicit evolution !! of a variable located at a wind point !! @@ -277,6 +193,7 @@ END MODULE MODI_TURB_VER_DYN_FLUX !! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after !! change of YCOMMENT !! 2012-02 Y. Seity, add possibility to run with reversed vertical levels +!! Modifications July 2015 (Wim de Rooy) LHARATU switch !! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! Q. Rodier 17/01/2019 : cleaning : remove cyclic conditions on DP and ZA @@ -286,11 +203,13 @@ END MODULE MODI_TURB_VER_DYN_FLUX !* 0. DECLARATIONS ! ------------ ! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! USE MODD_CONF USE MODD_CST USE MODD_CTURB -USE MODD_DYN_n, ONLY: LOCEAN -use modd_field, only: tfielddata, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LES USE MODD_NSV @@ -305,9 +224,9 @@ USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_GRADIENT_M USE MODI_SECOND_MNH -USE MODI_SHUMAN -USE MODI_TRIDIAG -USE MODI_TRIDIAG_WIND +USE MODI_SHUMAN , ONLY: MZM, MZF, MXM, MXF, MYM, MYF,& + & DZM, DXF, DXM, DYF, DYM +USE MODE_TRIDIAG_WIND, ONLY: TRIDIAG_WIND USE MODI_LES_MEAN_SUBGRID ! USE MODE_IO_FIELD_WRITE, only: IO_Field_write @@ -324,6 +243,7 @@ INTEGER, INTENT(IN) :: KKU !uppest atmosphere array i INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version INTEGER, INTENT(IN) :: KRR ! number of moist var. CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme @@ -342,6 +262,8 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle ! between i and the slope vector ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum +REAL, DIMENSION(:,:,:), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme + ! REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked @@ -403,33 +325,46 @@ REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1) :: ZCOEFFLXU, & ! PVSLOPEM in local 3D arrays INTEGER :: IIU,IJU ! size of array in x,y,z directions ! -REAL :: ZTIME1, ZTIME2 +REAL :: ZTIME1, ZTIME2, ZCMFS TYPE(TFIELDDATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES ! ------------- +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('TURB_VER_DYN_FLUX',0,ZHOOK_HANDLE) +! ZA=XUNDEF PDP=XUNDEF ! IIU=SIZE(PUM,1) IJU=SIZE(PUM,2) -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE,IIU,IJU) +IKB=KKA+JPVEXT_TURB*KKL +IKE=KKU-JPVEXT_TURB*KKL IKB=KKA+JPVEXT_TURB*KKL IKE=KKU-JPVEXT_TURB*KKL IKT=SIZE(PUM,3) IKTB=1+JPVEXT_TURB IKTE=IKT-JPVEXT_TURB - - ! -ZSOURCE(:,:,:) = 0. +ZSOURCE = 0. +ZFLXZ = 0. +ZCMFS = XCMFS +IF (LHARAT) ZCMFS=1. ! ZDIRSINZW(:,:) = SQRT(1.-PDIRCOSZW(:,:)**2) ! compute the coefficients for the uncentred gradient computation near the ! ground ! -ZKEFF(:,:,:) = MZM( PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) +! With LHARATU length scale and TKE are at half levels so remove MZM +! +IF (LHARAT) THEN + ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) + 50*MFMOIST(:,:,:) +ELSE + ZKEFF(:,:,:) = MZM(PLM(:,:,:) * SQRT(PTKEM(:,:,:)), KKA, KKU, KKL) +ENDIF + ! ZUSLOPEM(:,:,1)=PUSLOPEM(:,:) ZVSLOPEM(:,:,1)=PVSLOPEM(:,:) @@ -444,8 +379,8 @@ ZVSLOPEM(:,:,1)=PVSLOPEM(:,:) ! ! Preparation of the arguments for TRIDIAG_WIND ! -ZA(:,:,:) = -PTSTEP * XCMFS * & - MXM( ZKEFF ) * MXM(MZM( PRHODJ )) / & +ZA(:,:,:) = -PTSTEP * ZCMFS * & + MXM( ZKEFF ) * MXM(MZM(PRHODJ, KKA, KKU, KKL)) / & MXM( PDZZ )**2 ! ! @@ -466,7 +401,7 @@ ZCOEFS(:,:,1:1)=MXM(ZCOEFS(:,:,1:1) / PDZZ(:,:,IKB:IKB) ) ! ! ! ZSOURCE= FLUX /DZ -IF (LOCEAN) THEN ! OCEAN MODEL ONLY +IF (OOCEAN) THEN ! OCEAN MODEL ONLY ! Sfx flux assumed to be in SI & at vorticity point IF (LCOUPLES) THEN ZSOURCE(:,:,IKE:IKE) = XSSUFL_C(:,:,1:1)/PDZZ(:,:,IKE:IKE) & @@ -521,8 +456,8 @@ PRUS(:,:,:)=PRUS(:,:,:)+MXM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PUM(:,:,:))/PTSTEP ! ! vertical flux of the U wind component ! -ZFLXZ(:,:,:) = -XCMFS * MXM(ZKEFF) * & - DZM (PIMPL*ZRES + PEXPL*PUM) / MXM(PDZZ) +ZFLXZ(:,:,:) = -ZCMFS * MXM(ZKEFF) * & + DZM(PIMPL*ZRES + PEXPL*PUM, KKA, KKU, KKL) / MXM(PDZZ) ! ! surface flux ZFLXZ(:,:,IKB:IKB) = MXM(PDZZ(:,:,IKB:IKB)) * & @@ -532,14 +467,14 @@ ZFLXZ(:,:,IKB:IKB) = MXM(PDZZ(:,:,IKB:IKB)) * & ! ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) -IF (LOCEAN) THEN !ocean model at phys sfc (ocean domain top) +IF (OOCEAN) THEN !ocean model at phys sfc (ocean domain top) ZFLXZ(:,:,IKE:IKE) = MXM(PDZZ(:,:,IKE:IKE)) * & ZSOURCE(:,:,IKE:IKE) & / 0.5 / ( 1. + MXM(PRHODJ(:,:,KKU:KKU)) / MXM(PRHODJ(:,:,IKE:IKE)) ) ZFLXZ(:,:,KKU) = ZFLXZ(:,:,IKE) END IF ! -IF ( OTURB_FLX .AND. tpfile%lopened ) THEN +IF ( OTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the U wind component vertical flux TZFIELD%CMNHNAME = 'UW_VFLX' TZFIELD%CSTDNAME = '' @@ -561,7 +496,7 @@ PWU(:,:,:) = ZFLXZ(:,:,:) ! Contribution to the dynamic production of TKE ! compute the dynamic production at the mass point ! -PDP(:,:,:) = - MZF( MXF ( ZFLXZ * GZ_U_UW(PUM,PDZZ) ) ) +PDP(:,:,:) = - MZF(MXF(ZFLXZ * GZ_U_UW(PUM,PDZZ, KKA, KKU, KKL)), KKA, KKU, KKL) ! ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) PDP(:,:,IKB:IKB) = - MXF ( & @@ -569,7 +504,7 @@ PDP(:,:,IKB:IKB) = - MXF ( / MXM(PDZZ(:,:,IKB+KKL:IKB+KKL)) & ) ! -IF (LOCEAN) THEN +IF (OOCEAN) THEN ! evaluate the dynamic production at w(IKE-KKL) in PDP(IKE) PDP(:,:,IKE:IKE) = - MXF ( & ZFLXZ(:,:,IKE-KKL:IKE-KKL) * (PUM(:,:,IKE:IKE)-PUM(:,:,IKE-KKL:IKE-KKL)) & @@ -581,10 +516,10 @@ END IF ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(MXF(ZFLXZ)), X_LES_SUBGRID_WU ) - CALL LES_MEAN_SUBGRID( MZF(MXF(GZ_U_UW(PUM,PDZZ) & - & *ZFLXZ)), X_LES_RES_ddxa_U_SBG_UaU ) - CALL LES_MEAN_SUBGRID( XCMFS * ZKEFF, X_LES_SUBGRID_Km ) + CALL LES_MEAN_SUBGRID(MZF(MXF(ZFLXZ), KKA, KKU, KKL), X_LES_SUBGRID_WU ) + CALL LES_MEAN_SUBGRID(MZF(MXF(GZ_U_UW(PUM,PDZZ, KKA, KKU, KKL) & + & *ZFLXZ), KKA, KKU, KKL), X_LES_RES_ddxa_U_SBG_UaU ) + CALL LES_MEAN_SUBGRID( ZCMFS * ZKEFF, X_LES_SUBGRID_Km ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF @@ -596,24 +531,24 @@ IF(HTURBDIM=='3DIM') THEN ! Compute the source for the W wind component ! used to compute the W source at the ground ZFLXZ(:,:,KKA) = 2 * ZFLXZ(:,:,IKB) - ZFLXZ(:,:,IKB+KKL) ! extrapolation - IF (LOCEAN) THEN + IF (OOCEAN) THEN ZFLXZ(:,:,KKU) = 2 * ZFLXZ(:,:,IKE) - ZFLXZ(:,:,IKE-KKL) ! extrapolation END IF ! IF (.NOT. LFLAT) THEN PRWS(:,:,:)= PRWS & - -DXF( MZM( MXM(PRHODJ) /PDXX ) * ZFLXZ ) & - +DZM( PRHODJ / MZF(PDZZ ) * & - MXF( MZF( ZFLXZ*PDZX ) / PDXX ) & - ) + -DXF( MZM(MXM(PRHODJ) /PDXX, KKA, KKU, KKL) * ZFLXZ ) & + +DZM(PRHODJ / MZF(PDZZ, KKA, KKU, KKL) * & + MXF(MZF(ZFLXZ*PDZX, KKA, KKU, KKL) / PDXX ), & + KKA, KKU, KKL) ELSE - PRWS(:,:,:)= PRWS -DXF( MZM( MXM(PRHODJ) /PDXX ) * ZFLXZ ) + PRWS(:,:,:)= PRWS -DXF(MZM(MXM(PRHODJ) /PDXX, KKA, KKU, KKL) * ZFLXZ ) END IF ! ! Complete the Dynamical production with the W wind component ! - ZA(:,:,:)=-MZF( MXF ( ZFLXZ * GX_W_UW( PWM,PDXX,PDZZ,PDZX) ) ) + ZA(:,:,:)=-MZF(MXF(ZFLXZ * GX_W_UW(PWM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)), KKA, KKU, KKL) ! ! ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) @@ -629,7 +564,7 @@ IF(HTURBDIM=='3DIM') THEN ) / (0.5*(PDXX(:,:,IKB+KKL:IKB+KKL)+PDXX(:,:,IKB:IKB))) & ) ! -IF (LOCEAN) THEN +IF (OOCEAN) THEN ! evaluate the dynamic production at w(IKE-KKL) in PDP(IKE) ZA(:,:,IKE:IKE) = - MXF ( & ZFLXZ(:,:,IKE-KKL:IKE-KKL) * & @@ -639,7 +574,7 @@ IF (LOCEAN) THEN +(PWM(:,:,IKE-KKL:IKE-KKL)-PWM(:,:,IKE:IKE )) & /(PDZZ(:,:,IKE-KKL:IKE-KKL)+PDZZ(:,:,IKE:IKE )) & ) & - * PDZX(:,:,IKE-KKL:IKE-KKL) & + * PDZX(:,:,IKE-KKL:IKE-KKL) & ) / (0.5*(PDXX(:,:,IKE-KKL:IKE-KKL)+PDXX(:,:,IKE:IKE))) & ) END IF @@ -650,17 +585,17 @@ END IF ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(MXF(GX_W_UW(PWM,PDXX,& - PDZZ,PDZX)*ZFLXZ)), X_LES_RES_ddxa_W_SBG_UaW ) - CALL LES_MEAN_SUBGRID( MXF(GX_M_U(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)& - * MZF(ZFLXZ)), X_LES_RES_ddxa_Thl_SBG_UaW ) + CALL LES_MEAN_SUBGRID(MZF(MXF(GX_W_UW(PWM,PDXX,& + PDZZ,PDZX, KKA, KKU, KKL)*ZFLXZ), KKA, KKU, KKL), X_LES_RES_ddxa_W_SBG_UaW ) + CALL LES_MEAN_SUBGRID(MXF(GX_M_U(KKA, KKU, KKL,PTHLM,PDXX,PDZZ,PDZX)& + * MZF(ZFLXZ, KKA, KKU, KKL)), X_LES_RES_ddxa_Thl_SBG_UaW ) IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID(MXF(GX_U_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)& - *MZF(ZFLXZ)),X_LES_RES_ddxa_Rt_SBG_UaW ) + CALL LES_MEAN_SUBGRID(MXF(GX_U_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)& + *MZF(ZFLXZ, KKA, KKU, KKL)),X_LES_RES_ddxa_Rt_SBG_UaW ) END IF DO JSV=1,NSV CALL LES_MEAN_SUBGRID( MXF(GX_U_M(PSVM(:,:,:,JSV),PDXX,PDZZ,& - PDZX)*MZF(ZFLXZ)),X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) ) + PDZX, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL)),X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) ) END DO CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 @@ -677,8 +612,8 @@ END IF ! ! Preparation of the arguments for TRIDIAG_WIND !! -ZA(:,:,:) = - PTSTEP * XCMFS * & - MYM( ZKEFF ) * MYM(MZM( PRHODJ )) / & +ZA(:,:,:) = - PTSTEP * ZCMFS * & + MYM( ZKEFF ) * MYM(MZM(PRHODJ, KKA, KKU, KKL)) / & MYM( PDZZ )**2 ! ! @@ -697,7 +632,7 @@ ZCOEFS(:,:,1)= ZCOEFFLXU(:,:,1) * PSINSLOPE(:,:) * PDIRCOSZW(:,:) & ! average this flux to be located at the V,W vorticity point ZCOEFS(:,:,1:1)=MYM(ZCOEFS(:,:,1:1) / PDZZ(:,:,IKB:IKB) ) ! -IF (LOCEAN) THEN ! Ocean case +IF (OOCEAN) THEN ! Ocean case IF (LCOUPLES) THEN ZSOURCE(:,:,IKE:IKE) = XSSVFL_C(:,:,1:1)/PDZZ(:,:,IKE:IKE) & *0.5 * ( 1. + MYM(PRHODJ(:,:,KKU:KKU)) / MYM(PRHODJ(:,:,IKE:IKE)) ) @@ -749,8 +684,8 @@ PRVS(:,:,:)=PRVS(:,:,:)+MYM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PVM(:,:,:))/PTSTEP ! ! vertical flux of the V wind component ! -ZFLXZ(:,:,:) = -XCMFS * MYM(ZKEFF) * & - DZM( PIMPL*ZRES + PEXPL*PVM ) / MYM(PDZZ) +ZFLXZ(:,:,:) = -ZCMFS * MYM(ZKEFF) * & + DZM(PIMPL*ZRES + PEXPL*PVM, KKA, KKU, KKL) / MYM(PDZZ) ! ZFLXZ(:,:,IKB:IKB) = MYM(PDZZ(:,:,IKB:IKB)) * & ( ZSOURCE(:,:,IKB:IKB) & @@ -760,14 +695,14 @@ ZFLXZ(:,:,IKB:IKB) = MYM(PDZZ(:,:,IKB:IKB)) * & ! ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) ! -IF (LOCEAN) THEN +IF (OOCEAN) THEN ZFLXZ(:,:,IKE:IKE) = MYM(PDZZ(:,:,IKE:IKE)) * & ZSOURCE(:,:,IKE:IKE) & / 0.5 / ( 1. + MYM(PRHODJ(:,:,KKU:KKU)) / MYM(PRHODJ(:,:,IKE:IKE)) ) ZFLXZ(:,:,KKU) = ZFLXZ(:,:,IKE) END IF ! -IF ( OTURB_FLX .AND. tpfile%lopened ) THEN +IF ( OTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the V wind component vertical flux TZFIELD%CMNHNAME = 'VW_VFLX' TZFIELD%CSTDNAME = '' @@ -789,7 +724,7 @@ PWV(:,:,:) = ZFLXZ(:,:,:) ! Contribution to the dynamic production of TKE ! compute the dynamic production contribution at the mass point ! -ZA(:,:,:) = - MZF( MYF ( ZFLXZ * GZ_V_VW(PVM,PDZZ) ) ) +ZA(:,:,:) = - MZF(MYF(ZFLXZ * GZ_V_VW(PVM,PDZZ, KKA, KKU, KKL)), KKA, KKU, KKL) ! ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) ZA(:,:,IKB:IKB) = & @@ -798,7 +733,7 @@ ZFLXZ(:,:,IKB+KKL:IKB+KKL) * (PVM(:,:,IKB+KKL:IKB+KKL)-PVM(:,:,IKB:IKB)) & / MYM(PDZZ(:,:,IKB+KKL:IKB+KKL)) & ) ! -IF (LOCEAN) THEN +IF (OOCEAN) THEN ! evaluate the dynamic production at w(IKE-KKL) in PDP(IKE) ZA(:,:,IKE:IKE) = - MYF ( & ZFLXZ(:,:,IKE-KKL:IKE-KKL) * (PVM(:,:,IKE:IKE)-PVM(:,:,IKE-KKL:IKE-KKL)) & @@ -812,9 +747,9 @@ PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:) ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(MYF(ZFLXZ)), X_LES_SUBGRID_WV ) - CALL LES_MEAN_SUBGRID( MZF(MYF(GZ_V_VW(PVM,PDZZ)*& - & ZFLXZ)), X_LES_RES_ddxa_V_SBG_UaV ) + CALL LES_MEAN_SUBGRID(MZF(MYF(ZFLXZ), KKA, KKU, KKL), X_LES_SUBGRID_WV ) + CALL LES_MEAN_SUBGRID(MZF(MYF(GZ_V_VW(PVM,PDZZ, KKA, KKU, KKL)*& + & ZFLXZ), KKA, KKU, KKL), X_LES_RES_ddxa_V_SBG_UaV ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF @@ -825,25 +760,25 @@ END IF IF(HTURBDIM=='3DIM') THEN ! Compute the source for the W wind component ZFLXZ(:,:,KKA) = 2 * ZFLXZ(:,:,IKB) - ZFLXZ(:,:,IKB+KKL) ! extrapolation - IF (LOCEAN) THEN + IF (OOCEAN) THEN ZFLXZ(:,:,KKU) = 2 * ZFLXZ(:,:,IKE) - ZFLXZ(:,:,IKE-KKL) ! extrapolation END IF ! IF (.NOT. L2D) THEN IF (.NOT. LFLAT) THEN PRWS(:,:,:)= PRWS(:,:,:) & - -DYF( MZM( MYM(PRHODJ) /PDYY ) * ZFLXZ ) & - +DZM( PRHODJ / MZF(PDZZ ) * & - MYF( MZF( ZFLXZ*PDZY ) / PDYY ) & - ) + -DYF( MZM(MYM(PRHODJ) /PDYY, KKA, KKU, KKL) * ZFLXZ ) & + +DZM(PRHODJ / MZF(PDZZ, KKA, KKU, KKL) * & + MYF(MZF(ZFLXZ*PDZY, KKA, KKU, KKL) / PDYY ), & + KKA, KKU, KKL) ELSE - PRWS(:,:,:)= PRWS(:,:,:) -DYF( MZM( MYM(PRHODJ) /PDYY ) * ZFLXZ ) + PRWS(:,:,:)= PRWS(:,:,:) -DYF(MZM(MYM(PRHODJ) /PDYY, KKA, KKU, KKL) * ZFLXZ ) END IF END IF ! ! Complete the Dynamical production with the W wind component IF (.NOT. L2D) THEN - ZA(:,:,:) = - MZF( MYF ( ZFLXZ * GY_W_VW( PWM,PDYY,PDZZ,PDZY) ) ) + ZA(:,:,:) = - MZF(MYF(ZFLXZ * GY_W_VW(PWM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)), KKA, KKU, KKL) ! ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) ZA(:,:,IKB:IKB) = - MYF ( & @@ -858,7 +793,7 @@ IF(HTURBDIM=='3DIM') THEN ) / (0.5*(PDYY(:,:,IKB+KKL:IKB+KKL)+PDYY(:,:,IKB:IKB))) & ) ! - IF (LOCEAN) THEN + IF (OOCEAN) THEN ZA(:,:,IKE:IKE) = - MYF ( & ZFLXZ(:,:,IKE-KKL:IKE-KKL) * & ( DYM( PWM(:,:,IKE-KKL:IKE-KKL) ) & @@ -880,13 +815,16 @@ IF(HTURBDIM=='3DIM') THEN ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(MYF(GY_W_VW(PWM,PDYY,& - PDZZ,PDZY)*ZFLXZ)), X_LES_RES_ddxa_W_SBG_UaW , .TRUE. ) - CALL LES_MEAN_SUBGRID( MYF(GY_M_V(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY)& - *MZF(ZFLXZ)), X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE. ) + CALL LES_MEAN_SUBGRID(MZF(MYF(GY_W_VW(PWM,PDYY,& + &PDZZ,PDZY, KKA, KKU, KKL)*ZFLXZ), KKA, KKU, KKL), & + &X_LES_RES_ddxa_W_SBG_UaW , .TRUE. ) + CALL LES_MEAN_SUBGRID(MYF(GY_M_V(KKA, KKU, KKL,PTHLM,PDYY,PDZZ,PDZY)*& + &MZF(ZFLXZ, KKA, KKU, KKL)), & + &X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE. ) IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID( MYF(GY_V_M(PRM(:,:,:,1),PDYY,PDZZ,& - PDZY)*MZF(ZFLXZ)),X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE. ) + CALL LES_MEAN_SUBGRID(MYF(GY_V_M(PRM(:,:,:,1),PDYY,PDZZ,& + &PDZY, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL)),& + &X_LES_RES_ddxa_Rt_SBG_UaW , .TRUE. ) END IF CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 @@ -900,9 +838,9 @@ END IF !* 7. DIAGNOSTIC COMPUTATION OF THE 1D <W W> VARIANCE ! ----------------------------------------------- ! -IF ( OTURB_FLX .AND. tpfile%lopened .AND. HTURBDIM == '1DIM') THEN +IF ( OTURB_FLX .AND. TPFILE%LOPENED .AND. HTURBDIM == '1DIM') THEN ZFLXZ(:,:,:)= (2./3.) * PTKEM(:,:,:) & - -XCMFS*PLM(:,:,:)*SQRT(PTKEM(:,:,:))*GZ_W_M(PWM,PDZZ) + -ZCMFS*PLM(:,:,:)*SQRT(PTKEM(:,:,:))*GZ_W_M(PWM,PDZZ, KKA, KKU, KKL) ! to be tested & ! +XCMFB*(4./3.)*PLM(:,:,:)/SQRT(PTKEM(:,:,:))*PTP(:,:,:) ! stores the W variance @@ -921,4 +859,6 @@ END IF ! !---------------------------------------------------------------------------- ! +IF (LHOOK) CALL DR_HOOK('TURB_VER_DYN_FLUX',1,ZHOOK_HANDLE) END SUBROUTINE TURB_VER_DYN_FLUX +END MODULE MODE_TURB_VER_DYN_FLUX diff --git a/src/arome/turb/turb_ver_sv_corr.F90 b/src/common/turb/mode_turb_ver_sv_corr.F90 similarity index 79% rename from src/arome/turb/turb_ver_sv_corr.F90 rename to src/common/turb/mode_turb_ver_sv_corr.F90 index 25744253b913e3b7ea2203fb5e77e26b6de466ce..9fb527829b7e3db91ac9bde036de9a18889a7bff 100644 --- a/src/arome/turb/turb_ver_sv_corr.F90 +++ b/src/common/turb/mode_turb_ver_sv_corr.F90 @@ -1,12 +1,16 @@ -! ######spl - SUBROUTINE TURB_VER_SV_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & +!MNH_LIC Copyright 2002-2020 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_TURB_VER_SV_CORR +IMPLICIT NONE +CONTAINS +SUBROUTINE TURB_VER_SV_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI,OOCEAN, & PDZZ, & PTHLM,PRM,PTHVREF, & PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PPHI3,PPSI3, & PWM,PSVM, & PTKEM,PLM,PLEPS,PPSI_SV ) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ############################################################### ! ! @@ -48,12 +52,16 @@ !* 0. DECLARATIONS ! ------------ ! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! USE MODD_CST USE MODD_CTURB USE MODD_PARAMETERS USE MODD_LES USE MODD_CONF USE MODD_NSV, ONLY : NSV,NSV_LGBEG,NSV_LGEND +USE MODD_BLOWSNOW ! ! USE MODI_GRADIENT_U @@ -61,10 +69,12 @@ USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_GRADIENT_M USE MODI_SHUMAN , ONLY : MZF -USE MODI_EMOIST -USE MODI_ETHETA +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA USE MODI_LES_MEAN_SUBGRID ! +USE MODI_SECOND_MNH +! IMPLICIT NONE ! !* 0.1 declarations of arguments @@ -73,6 +83,7 @@ IMPLICIT NONE ! INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid var. INTEGER, INTENT(IN) :: KRRI ! number of ice var. @@ -104,6 +115,9 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PPSI_SV ! Inv.Turb.Sch.for scalars ! REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: & ZA, ZFLXZ +! +REAL :: ZCSV !constant for the scalar flux +! INTEGER :: JSV ! loop counters ! REAL :: ZTIME1, ZTIME2 @@ -117,6 +131,13 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('TURB_VER_SV_CORR',0,ZHOOK_HANDLE) CALL SECOND_MNH(ZTIME1) ! +IF(LBLOWSNOW) THEN +! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables + ZCSV= XCHF/XRSNOW +ELSE + ZCSV= XCHF +ENDIF +! DO JSV=1,NSV ! IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE @@ -125,8 +146,8 @@ DO JSV=1,NSV ! IF (LLES_CALL) THEN ! approximation: diagnosed explicitely (without implicit term) - ZFLXZ(:,:,:) = PPSI_SV(:,:,:,JSV)*GZ_M_W(PSVM(:,:,:,JSV),PDZZ, KKA, KKU, KKL)**2 - ZFLXZ(:,:,:) = XCHF / ZCSVD * PLM * PLEPS * MZF(ZFLXZ(:,:,:), KKA, KKU, KKL) + ZFLXZ(:,:,:) = PPSI_SV(:,:,:,JSV)*GZ_M_W(KKA, KKU, KKL,PSVM(:,:,:,JSV),PDZZ)**2 + ZFLXZ(:,:,:) = ZCSV / ZCSVD * PLM * PLEPS * MZF(ZFLXZ(:,:,:), KKA, KKU, KKL) CALL LES_MEAN_SUBGRID(-2.*ZCSVD*SQRT(PTKEM)*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Sv2(:,:,:,JSV) ) CALL LES_MEAN_SUBGRID(MZF(PWM, KKA, KKU, KKL)*ZFLXZ, X_LES_RES_W_SBG_Sv2(:,:,:,JSV) ) END IF @@ -135,19 +156,19 @@ DO JSV=1,NSV ! IF (LLES_CALL) THEN ! approximation: diagnosed explicitely (without implicit term) - ZA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) - ZFLXZ(:,:,:)= ( XCSHF * PPHI3 + XCHF * PPSI_SV(:,:,:,JSV) ) & - * GZ_M_W(PTHLM,PDZZ, KKA, KKU, KKL) & - * GZ_M_W(PSVM(:,:,:,JSV),PDZZ, KKA, KKU, KKL) + ZA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM,OOCEAN) + ZFLXZ(:,:,:)= ( XCSHF * PPHI3 + ZCSV * PPSI_SV(:,:,:,JSV) ) & + * GZ_M_W(KKA, KKU, KKL,PTHLM,PDZZ) & + * GZ_M_W(KKA, KKU, KKL,PSVM(:,:,:,JSV),PDZZ) ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCTSVD) * MZF(ZFLXZ, KKA, KKU, KKL) CALL LES_MEAN_SUBGRID( ZA*ZFLXZ, X_LES_SUBGRID_SvThv(:,:,:,JSV) ) CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) ! IF (KRR>=1) THEN - ZA(:,:,:) = EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) - ZFLXZ(:,:,:)= ( XCHF * PPSI3 + XCHF * PPSI_SV(:,:,:,JSV) ) & - * GZ_M_W(PRM(:,:,:,1),PDZZ, KKA, KKU, KKL) & - * GZ_M_W(PSVM(:,:,:,JSV),PDZZ, KKA, KKU, KKL) + ZA(:,:,:) = EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM,OOCEAN) + ZFLXZ(:,:,:)= ( ZCSV * PPSI3 + ZCSV * PPSI_SV(:,:,:,JSV) ) & + * GZ_M_W(KKA, KKU, KKL,PRM(:,:,:,1),PDZZ) & + * GZ_M_W(KKA, KKU, KKL,PSVM(:,:,:,JSV),PDZZ) ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCQSVD) * MZF(ZFLXZ, KKA, KKU, KKL) CALL LES_MEAN_SUBGRID( ZA*ZFLXZ, X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) @@ -162,3 +183,4 @@ XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 ! IF (LHOOK) CALL DR_HOOK('TURB_VER_SV_CORR',1,ZHOOK_HANDLE) END SUBROUTINE TURB_VER_SV_CORR +END MODULE MODE_TURB_VER_SV_CORR diff --git a/src/arome/turb/turb_ver_sv_flux.F90 b/src/common/turb/mode_turb_ver_sv_flux.F90 similarity index 84% rename from src/arome/turb/turb_ver_sv_flux.F90 rename to src/common/turb/mode_turb_ver_sv_flux.F90 index d19712dc51381e9a0f56ace65d0f65e95bdb98dc..271ee734e6aabd3d2cda09b7eba343113fa6e402 100644 --- a/src/arome/turb/turb_ver_sv_flux.F90 +++ b/src/common/turb/mode_turb_ver_sv_flux.F90 @@ -1,9 +1,15 @@ -! ######spl - SUBROUTINE TURB_VER_SV_FLUX(KKA,KKU,KKL, & - OCLOSE_OUT,OTURB_FLX,HTURBDIM, & +!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. +MODULE MODE_TURB_VER_SV_FLUX +IMPLICIT NONE +CONTAINS +SUBROUTINE TURB_VER_SV_FLUX(KKA,KKU,KKL, & + OTURB_FLX,HTURBDIM, & PIMPL,PEXPL, & PTSTEP, & - HFMFILE,HLUOUT, & + TPFILE, & PDZZ,PDIRCOSZW, & PRHODJ,PWM, & PSFSVM,PSFSVP, & @@ -11,10 +17,6 @@ PTKEM,PLM,MFMOIST,PPSI_SV, & PRSVS,PWSV ) ! - - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK - USE MODD_CTURB, ONLY : LHARAT ! ! !!**** *TURB_VER_SV_FLUX* -compute the source terms due to the vertical turbulent @@ -111,10 +113,10 @@ !! DXF,DYF,DZF,DZM !! : Shuman functions (difference operators) !! -!! SUBROUTINE TRIDIAG : to compute the splitted implicit evolution +!! SUBROUTINE TRIDIAG : to compute the split implicit evolution !! of a variable located at a mass point !! -!! SUBROUTINE TRIDIAG_WIND: to compute the splitted implicit evolution +!! SUBROUTINE TRIDIAG_WIND: to compute the split implicit evolution !! of a variable located at a wind point !! !! FUNCTIONs ETHETA and EMOIST : @@ -195,31 +197,42 @@ !! change of YCOMMENT !! Feb 2012(Y. Seity) add possibility to run with reversed !! vertical levels -!! Modifications: July 2015 (Wim de Rooy) LHARATU switch +!! Modifications: July 2015 (Wim de Rooy) LHARAT switch +!! Feb 2017(M. Leriche) add initialisation of ZSOURCE +!! to avoid unknwon values outside physical domain +!! and avoid negative values in sv tendencies +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !!-------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! USE MODD_CST USE MODD_CTURB +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_LES USE MODD_CONF -USE MODD_NSV, ONLY : NSV_LGBEG,NSV_LGEND +USE MODD_NSV, ONLY: XSVMIN, NSV_LGBEG, NSV_LGEND +USE MODD_BLOWSNOW +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE ! USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_GRADIENT_M USE MODI_SHUMAN , ONLY : DZM, MZM, MZF -USE MODI_TRIDIAG -USE MODI_TRIDIAG_WIND -USE MODI_EMOIST -USE MODI_ETHETA -USE MODE_FMWRIT +USE MODE_TRIDIAG, ONLY: TRIDIAG +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA USE MODI_LES_MEAN_SUBGRID ! +USE MODI_SECOND_MNH +! IMPLICIT NONE ! !* 0.1 declarations of arguments @@ -228,18 +241,13 @@ IMPLICIT NONE INTEGER, INTENT(IN) :: KKA !near ground array index INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file -CHARACTER*4, INTENT(IN) :: HTURBDIM ! dimensionality of the +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. REAL, INTENT(IN) :: PTSTEP ! Double Time Step -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients @@ -281,9 +289,6 @@ REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: & ZFLXZ, & ! vertical flux of the treated variable ZSOURCE, & ! source of evolution for the treated variable ZKEFF ! effectif diffusion coeff = LT * SQRT( TKE ) -INTEGER :: IRESP ! Return code of FM routines -INTEGER :: IGRID ! C-grid indicator in LFIFM file -INTEGER :: ILENCH ! Length of comment string in LFIFM file INTEGER :: IKB,IKE ! I index values for the Beginning and End ! mass points of the domain in the 3 direct. INTEGER :: IKT ! array size in k direction @@ -291,12 +296,13 @@ INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain INTEGER :: JSV ! loop counters INTEGER :: JK ! loop INTEGER :: ISV ! number of scalar var. -CHARACTER (LEN=100) :: YCOMMENT ! comment string in LFIFM file -CHARACTER (LEN=16) :: YRECFM ! Name of the desired field in LFIFM file ! REAL :: ZTIME1, ZTIME2 REAL :: ZCSVP = 4.0 ! constant for scalar flux presso-correlation (RS81) +REAL :: ZCSV !constant for the scalar flux +! +TYPE(TFIELDDATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -314,12 +320,17 @@ IKTB =1+JPVEXT_TURB ISV=SIZE(PSVM,4) ! IF (LHARAT) THEN -ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) + 50.*MFMOIST(:,:,:) + ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) + 50.*MFMOIST(:,:,:) ELSE -ZKEFF(:,:,:) = MZM(PLM(:,:,:) * SQRT(PTKEM(:,:,:)), KKA, KKU, KKL) + ZKEFF(:,:,:) = MZM(PLM(:,:,:) * SQRT(PTKEM(:,:,:)), KKA, KKU, KKL) ENDIF - ! +IF(LBLOWSNOW) THEN +! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables + ZCSV= XCHF/XRSNOW +ELSE + ZCSV= XCHF +ENDIF !---------------------------------------------------------------------------- ! !* 8. SOURCES OF PASSIVE SCALAR VARIABLES @@ -330,15 +341,16 @@ DO JSV=1,ISV IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE ! ! Preparation of the arguments for TRIDIAG -IF (LHARAT) THEN - ZA(:,:,:) = -PTSTEP* & - ZKEFF * MZM(PRHODJ, KKA, KKU, KKL) / & - PDZZ**2 -ELSE - ZA(:,:,:) = -PTSTEP*XCHF*PPSI_SV(:,:,:,JSV) * & - ZKEFF * MZM(PRHODJ, KKA, KKU, KKL) / & - PDZZ**2 -ENDIF + IF (LHARAT) THEN + ZA(:,:,:) = -PTSTEP* & + ZKEFF * MZM(PRHODJ, KKA, KKU, KKL) / & + PDZZ**2 + ELSE + ZA(:,:,:) = -PTSTEP*ZCSV*PPSI_SV(:,:,:,JSV) * & + ZKEFF * MZM(PRHODJ, KKA, KKU, KKL) / & + PDZZ**2 + ENDIF + ZSOURCE(:,:,:) = 0. ! ! Compute the sources for the JSVth scalar variable @@ -359,17 +371,17 @@ ENDIF ZSOURCE(:,:,IKTB+1:IKTE-1) = 0. ZSOURCE(:,:,IKE) = 0. ! -! Obtention of the splitted JSV scalar variable at t+ deltat +! Obtention of the split JSV scalar variable at t+ deltat CALL TRIDIAG(KKA,KKU,KKL,PSVM(:,:,:,JSV),ZA,PTSTEP,PEXPL,PIMPL,PRHODJ,ZSOURCE,ZRES) ! ! Compute the equivalent tendency for the JSV scalar variable PRSVS(:,:,:,JSV)= PRSVS(:,:,:,JSV)+ & PRHODJ(:,:,:)*(ZRES(:,:,:)-PSVM(:,:,:,JSV))/PTSTEP ! - IF ( (OTURB_FLX .AND. OCLOSE_OUT) .OR. LLES_CALL ) THEN + IF ( (OTURB_FLX .AND. TPFILE%LOPENED) .OR. LLES_CALL ) THEN ! Diagnostic of the cartesian vertical flux ! - ZFLXZ(:,:,:) = -XCHF * PPSI_SV(:,:,:,JSV) * MZM(PLM*SQRT(PTKEM), KKA, KKU, KKL) / PDZZ * & + ZFLXZ(:,:,:) = -ZCSV * PPSI_SV(:,:,:,JSV) * MZM(PLM*SQRT(PTKEM), KKA, KKU, KKL) / PDZZ * & DZM(PIMPL*ZRES(:,:,:) + PEXPL*PSVM(:,:,:,JSV), KKA, KKU, KKL) ! surface flux !* in 3DIM case, a part of the flux goes vertically, and another goes horizontally @@ -393,23 +405,31 @@ ENDIF PWSV(:,:,IKE,JSV)=PWSV(:,:,IKE-KKL,JSV) END IF ! - IF (OTURB_FLX .AND. OCLOSE_OUT) THEN + IF (OTURB_FLX .AND. TPFILE%LOPENED) THEN ! stores the JSVth vertical flux - WRITE(YRECFM,'("WSV_FLX_",I3.3)') JSV - YCOMMENT='X_Y_Z_'//YRECFM//' (SVUNIT*M/S)' - IGRID = 4 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZFLXZ,IGRID,ILENCH,YCOMMENT,IRESP) + WRITE(TZFIELD%CMNHNAME,'("WSV_FLX_",I3.3)') JSV + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) + !PW: TODO: use the correct units of the JSV variable (and multiply it by m s-1) + TZFIELD%CUNITS = 'SVUNIT m s-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + ! + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) END IF ! ! Storage in the LES configuration - + ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID(MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WSv(:,:,:,JSV) ) CALL LES_MEAN_SUBGRID(GZ_W_M(PWM,PDZZ, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL), & X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID(MZF(GZ_M_W(PSVM(:,:,:,JSV),PDZZ, KKA, KKU, KKL)*ZFLXZ, KKA, KKU, KKL), & + CALL LES_MEAN_SUBGRID(MZF(GZ_M_W(KKA, KKU, KKL,PSVM(:,:,:,JSV),PDZZ)*ZFLXZ, KKA, KKU, KKL), & X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV) ) CALL LES_MEAN_SUBGRID(-ZCSVP*SQRT(PTKEM)/PLM*MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_SvPz(:,:,:,JSV) ) CALL LES_MEAN_SUBGRID(MZF(PWM*ZFLXZ, KKA, KKU, KKL), X_LES_RES_W_SBG_WSv(:,:,:,JSV) ) @@ -423,3 +443,4 @@ END DO ! end of scalar loop ! IF (LHOOK) CALL DR_HOOK('TURB_VER_SV_FLUX',1,ZHOOK_HANDLE) END SUBROUTINE TURB_VER_SV_FLUX +END MODULE MODE_TURB_VER_SV_FLUX diff --git a/src/arome/turb/turb_ver_thermo_corr.F90 b/src/common/turb/mode_turb_ver_thermo_corr.F90 similarity index 93% rename from src/arome/turb/turb_ver_thermo_corr.F90 rename to src/common/turb/mode_turb_ver_thermo_corr.F90 index 1e343bb2705068a5d5dc6dd48f38c7a405b577ec..db08f0ce62947783ab09870fd2b49ff4d4245f2d 100644 --- a/src/arome/turb/turb_ver_thermo_corr.F90 +++ b/src/common/turb/mode_turb_ver_thermo_corr.F90 @@ -1,8 +1,14 @@ -! ######spl - SUBROUTINE TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OCLOSE_OUT,OTURB_FLX,HTURBDIM,HTOM, & +!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. +MODULE MODE_TURB_VER_THERMO_CORR +IMPLICIT NONE +CONTAINS +SUBROUTINE TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & + OTURB_FLX,HTURBDIM,HTOM, & PIMPL,PEXPL, & - HFMFILE,HLUOUT, & + TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW, & PRHODJ,PTHVREF, & PSFTHM,PSFRM,PSFTHP,PSFRP, & @@ -13,11 +19,7 @@ PRED2R3, PRED2THR3, PBLL_O_E, PETHETA, & PEMOIST, PREDTH1, PREDR1, PPHI3, PPSI3, PD, & PFWTH,PFWR,PFTH2,PFR2,PFTHR, & - PTHLP,PRP,MFMOIST,PSIGS ) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK - USE MODD_CTURB, ONLY : LHARAT - + PTHLP,PRP,MFMOIST,PSIGS ) ! ############################################################### ! ! @@ -115,12 +117,6 @@ !! DXF,DYF,DZF,DZM !! : Shuman functions (difference operators) !! -!! SUBROUTINE TRIDIAG : to compute the splitted implicit evolution -!! of a variable located at a mass point -!! -!! SUBROUTINE TRIDIAG_WIND: to compute the splitted implicit evolution -!! of a variable located at a wind point -!! !! FUNCTIONs ETHETA and EMOIST : !! allows to compute: !! - the coefficients for the turbulent correlation between @@ -147,7 +143,7 @@ !! !! Module MODD_PARAMETERS !! -!! JPVEXT : number of vertical external points +!! JPVEXT_TURB : number of vertical external points !! JPHEXT : number of horizontal external points !! !! @@ -199,14 +195,19 @@ !! change of YCOMMENT !! 2012-02 (Y. Seity) add possibility to run with reversed !! vertical levels -!! Modifications July 2015 (Wim de Rooy) LHARATU switch +!! Modifications July 2015 (Wim de Rooy) LHARAT switch +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !!-------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK USE MODD_CST USE MODD_CTURB +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA USE MODD_PARAMETERS USE MODD_CONF USE MODD_LES @@ -216,14 +217,13 @@ USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_GRADIENT_M USE MODI_SHUMAN , ONLY : DZM, MZM, MZF -USE MODI_TRIDIAG -USE MODE_FMWRIT USE MODI_LES_MEAN_SUBGRID -USE MODI_PRANDTL -USE MODI_TRIDIAG_THERMO ! +USE MODE_IO_FIELD_WRITE, only: IO_Field_write USE MODE_PRANDTL ! +USE MODI_SECOND_MNH +! IMPLICIT NONE ! !* 0.1 declarations of arguments @@ -236,18 +236,13 @@ INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH - 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. -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file -CHARACTER*4, INTENT(IN) :: HTURBDIM ! dimensionality of the +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme -CHARACTER*4, INTENT(IN) :: HTOM ! type of Third Order Moment +CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY ! Metric coefficients @@ -349,7 +344,7 @@ LOGICAL :: GFWTH ! flag to use w'2th' LOGICAL :: GFR2 ! flag to use w'r'2 LOGICAL :: GFWR ! flag to use w'2r' LOGICAL :: GFTHR ! flag to use w'th'r' - +TYPE(TFIELDDATA) :: TZFIELD !---------------------------------------------------------------------------- ! !* 1. PRELIMINARIES @@ -513,12 +508,18 @@ ENDIF ! ! ! stores <THl THl> - IF ( OTURB_FLX .AND. OCLOSE_OUT ) THEN - YRECFM ='THL_VVAR' - YCOMMENT='X_Y_Z_THL_VVAR (KELVIN**2)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZFLXZ,IGRID,ILENCH,YCOMMENT,IRESP) + IF ( OTURB_FLX .AND. TPFILE%LOPENED ) THEN + TZFIELD%CMNHNAME = 'THL_VVAR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'THL_VVAR' + TZFIELD%CUNITS = 'K2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_THL_VVAR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) END IF ! ! and we store in LES configuration @@ -674,12 +675,18 @@ ENDIF 2. * PATHETA(:,:,:) * PAMOIST(:,:,:) * ZFLXZ(:,:,:) END IF ! stores <THl Rnp> - IF ( OTURB_FLX .AND. OCLOSE_OUT ) THEN - YRECFM ='THLRCONS_VCOR' - YCOMMENT='X_Y_Z_THLRCONS_VCOR (KELVIN*KG/KG)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZFLXZ,IGRID,ILENCH,YCOMMENT,IRESP) + IF ( OTURB_FLX .AND. TPFILE%LOPENED ) THEN + TZFIELD%CMNHNAME = 'THLRCONS_VCOR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'THLRCONS_VCOR' + TZFIELD%CUNITS = 'K kg kg-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_THLRCONS_VCOR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) END IF ! ! and we store in LES configuration @@ -801,12 +808,18 @@ ENDIF PSIGS(:,:,:) = PSIGS(:,:,:) + PAMOIST(:,:,:) **2 * ZFLXZ(:,:,:) END IF ! stores <Rnp Rnp> - IF ( OTURB_FLX .AND. OCLOSE_OUT ) THEN - YRECFM ='RTOT_VVAR' - YCOMMENT='X_Y_Z_RTOT_VVAR (KG/KG **2)' - IGRID = 1 - ILENCH=LEN(YCOMMENT) - CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZFLXZ,IGRID,ILENCH,YCOMMENT,IRESP) + IF ( OTURB_FLX .AND. TPFILE%LOPENED ) THEN + TZFIELD%CMNHNAME = 'RTOT_VVAR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RTOT_VVAR' + TZFIELD%CUNITS = 'kg2 kg-2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RTOT_VVAR' + TZFIELD%NGRID = 1 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) END IF ! ! and we store in LES configuration @@ -831,8 +844,12 @@ ENDIF ! Extrapolate PSIGS at the ground and at the top PSIGS(:,:,KKA) = PSIGS(:,:,IKB) PSIGS(:,:,KKU) = PSIGS(:,:,IKE) - PSIGS(:,:,:) = MAX (PSIGS(:,:,:) , 0.) +#ifdef REPRO48 + PSIGS(:,:,:) = MAX (PSIGS(:,:,:) , 0.) PSIGS(:,:,:) = SQRT(PSIGS(:,:,:)) +#else + PSIGS(:,:,:) = SQRT( MAX (PSIGS(:,:,:) , 1.E-12) ) +#endif END IF ! @@ -842,3 +859,4 @@ ENDIF !---------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('TURB_VER_THERMO_CORR',1,ZHOOK_HANDLE) END SUBROUTINE TURB_VER_THERMO_CORR +END MODULE MODE_TURB_VER_THERMO_CORR diff --git a/src/mesonh/turb/turb_ver_thermo_flux.f90 b/src/common/turb/mode_turb_ver_thermo_flux.F90 similarity index 71% rename from src/mesonh/turb/turb_ver_thermo_flux.f90 rename to src/common/turb/mode_turb_ver_thermo_flux.F90 index cf539984e7751f862a6251a3e80b048274740073..16c320423a0560bae32296ebfb4942442246c178 100644 --- a/src/mesonh/turb/turb_ver_thermo_flux.f90 +++ b/src/common/turb/mode_turb_ver_thermo_flux.F90 @@ -2,125 +2,12 @@ !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 MODI_TURB_VER_THERMO_FLUX -! #################### -! -INTERFACE -! - SUBROUTINE TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OTURB_FLX,HTURBDIM,HTOM, & - PIMPL,PEXPL, & - PTSTEP, & - TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & - PRHODJ,PTHVREF, & - PSFTHM,PSFRM,PSFTHP,PSFRP, & - PWM,PTHLM,PRM,PSVM, & - PTKEM,PLM,PLEPS, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & - PBETA, PSQRT_TKE, PDTH_DZ, PDR_DZ, PRED2TH3, & - PRED2R3, PRED2THR3, PBLL_O_E, PETHETA, & - PEMOIST, PREDTH1, PREDR1, PPHI3, PPSI3, PD, & - PFWTH,PFWR,PFTH2,PFR2,PFTHR,PBL_DEPTH, & - PWTHV,PRTHLS,PRRS,PTHLP,PRP,PTP,PWTH,PWRC ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR O -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. -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -REAL, INTENT(IN) :: PTSTEP ! Double Time Step -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitudes -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual - ! Potential Temperature -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time -! ! t - deltat -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time -! ! t + deltat -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM -! Vertical wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM -! potential temperature at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios - ! at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Mixing ratios -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized - ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA ! buoyancy coefficient -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE ! sqrt(e) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTH_DZ ! d(th)/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDR_DZ ! d(rt)/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 ! 3D Redeslperger number R*2_th -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 ! 3D Redeslperger number R*2_r -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 ! 3D Redeslperger number R*2_thr -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E ! beta * Lk * Leps / tke -REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA ! Coefficient for theta in theta_v computation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST ! Coefficient for r in theta_v computation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 ! 1D Redelsperger number for Th -REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 ! 1D Redelsperger number for r -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Prandtl number for temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Prandtl number for vapor -REAL, DIMENSION(:,:,:), INTENT(IN) :: PD ! Denominator in Prandtl numbers -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz (at flux point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz (at flux point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz (at mass point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz (at mass point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at mass point) -REAL, DIMENSION(:,:), INTENT(INOUT):: PBL_DEPTH ! BL depth -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTHV ! buoyancy flux -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTHLS ! cumulated source for theta -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS ! cumulated source for rt -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHLP ! guess of thl at t+ deltat -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRP ! guess of r at t+ deltat -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTP ! Dynamic and thermal - ! TKE production terms -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux -! -! -END SUBROUTINE TURB_VER_THERMO_FLUX -! -END INTERFACE -! -END MODULE MODI_TURB_VER_THERMO_FLUX -! -! -! ############################################################### - SUBROUTINE TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR, KRRL, KRRI, & - OTURB_FLX,HTURBDIM,HTOM, & +MODULE MODE_TURB_VER_THERMO_FLUX +IMPLICIT NONE +CONTAINS + +SUBROUTINE TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR,KRRL,KRRI, & + OTURB_FLX,HTURBDIM,HTOM,OOCEAN, & PIMPL,PEXPL, & PTSTEP, & TPFILE, & @@ -133,7 +20,7 @@ END MODULE MODI_TURB_VER_THERMO_FLUX PBETA, PSQRT_TKE, PDTH_DZ, PDR_DZ, PRED2TH3, & PRED2R3, PRED2THR3, PBLL_O_E, PETHETA, & PEMOIST, PREDTH1, PREDR1, PPHI3, PPSI3, PD, & - PFWTH,PFWR,PFTH2,PFR2,PFTHR,PBL_DEPTH, & + PFWTH,PFWR,PFTH2,PFR2,PFTHR,MFMOIST,PBL_DEPTH,& PWTHV,PRTHLS,PRRS,PTHLP,PRP,PTP,PWTH,PWRC ) ! ############################################################### ! @@ -322,6 +209,7 @@ END MODULE MODI_TURB_VER_THERMO_FLUX !! change of YCOMMENT !! 2012-02 (Y. Seity) add possibility to run with reversed !! vertical levels +!! Modifications July 2015 (Wim de Rooy) LHARAT switch !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! 2021 (D. Ricard) last version of HGRAD turbulence scheme !! Leronard terms instead of Reynolds terms @@ -336,9 +224,13 @@ END MODULE MODI_TURB_VER_THERMO_FLUX !* 0. DECLARATIONS ! ------------ ! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! USE MODD_CST +USE MODD_CONF, ONLY: CPROGRAM USE MODD_CTURB -use modd_field, only: tfielddata, TYPEREAL +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODD_GRID_n, ONLY: XZS, XXHAT, XYHAT USE MODD_IO, ONLY: TFILEDATA USE MODD_METRICS_n, ONLY: XDXX, XDYY, XDZX, XDZY, XDZZ @@ -347,7 +239,6 @@ USE MODD_TURB_n, ONLY: LHGRAD, XCOEFHGRADTHL, XCOEFHGRADRM, XALTHGRAD, X USE MODD_CONF USE MODD_LES USE MODD_DIM_n -USE MODD_DYN_n, ONLY: LOCEAN USE MODD_OCEANH USE MODD_REF, ONLY: LCOUPLES USE MODD_TURB_n @@ -357,17 +248,13 @@ USE MODI_GRADIENT_U USE MODI_GRADIENT_V USE MODI_GRADIENT_W USE MODI_GRADIENT_M -USE MODI_GRADIENT_UV -USE MODI_GRADIENT_UW -USE MODI_GRADIENT_VW -USE MODI_SHUMAN -USE MODI_TRIDIAG +USE MODI_SHUMAN , ONLY : DZF, DZM, MZF, MZM, MYF, MXF +USE MODE_TRIDIAG, ONLY: TRIDIAG USE MODI_LES_MEAN_SUBGRID -USE MODI_PRANDTL -USE MODI_TRIDIAG_THERMO -USE MODI_TM06_H +USE MODE_TRIDIAG_THERMO, ONLY: TRIDIAG_THERMO +USE MODE_TM06_H, ONLY: TM06_H ! -USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE USE MODE_PRANDTL ! USE MODI_SECOND_MNH @@ -388,6 +275,7 @@ INTEGER, INTENT(IN) :: KRRL ! number of liquid water v INTEGER, INTENT(IN) :: KRRI ! number of ice water var. LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment @@ -402,6 +290,7 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitudes ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum +REAL, DIMENSION(:,:,:), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual ! Potential Temperature ! @@ -420,6 +309,8 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Mixing ratios ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t +! +! In case LHARAT=TRUE, PLM already includes all stability corrections REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 @@ -475,7 +366,7 @@ REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & ZDFDDTDZ, & ! dF/d(dTh/dz) ZDFDDRDZ, & ! dF/d(dr/dz) Z3RDMOMENT,& ! 3 order term in flux or variance equation - ZF_NEW, & + ZF_LEONARD,& ! Leonard terms ZRWTHL, & ZRWRNP, & ZCLD_THOLD @@ -488,7 +379,6 @@ INTEGER :: IKT ! array size in k direction INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain INTEGER :: JI, JJ ! loop indexes ! -! INTEGER :: IIB,IJB ! Lower bounds of the physical ! sub-domain in x and y directions INTEGER :: IIE,IJE ! Upper bounds of the physical @@ -500,17 +390,14 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT_ll ! Position y in the conformal ! plane (array on the complete domain) ! ! -CHARACTER (LEN=100) :: YCOMMENT ! comment string in LFIFM file -CHARACTER (LEN=LEN_HREC) :: YRECFM ! Name of the desired field in LFIFM file -! REAL :: ZTIME1, ZTIME2 REAL :: ZDELTAX -REAL :: ZXBEG,ZXEND,ZYBEG,ZYEND ! Forcing size for ocean deep convection +REAL :: ZXBEG,ZXEND,ZYBEG,ZYEND ! Forcing size for ocean deep convection REAL, DIMENSION(SIZE(XXHAT),SIZE(XYHAT)) :: ZDIST ! distance ! from the center of the cooling REAL :: ZFLPROV INTEGER :: JKM ! vertical index loop -INTEGER :: JSW +INTEGER :: JSW REAL :: ZSWA ! index for time flux interpolation ! INTEGER :: IIU, IJU @@ -527,13 +414,17 @@ TYPE(TFIELDDATA) :: TZFIELD ! !* 1. PRELIMINARIES ! ------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('TURB_VER_THERMO_FLUX',0,ZHOOK_HANDLE) +! ! Size for a given proc & a given model IIU=SIZE(PTHLM,1) IJU=SIZE(PTHLM,2) ! !! Compute Shape of sfc flux for Oceanic Deep Conv Case ! -IF (LOCEAN .AND. LDEEPOC) THEN +IF (OOCEAN .AND. LDEEPOC) THEN !* COMPUTES THE PHYSICAL SUBDOMAIN BOUNDS ALLOCATE(ZXHAT_ll(NIMAX_ll+2*JPHEXT),ZYHAT_ll(NJMAX_ll+2*JPHEXT)) !compute ZXHAT_ll = position in the (0:Lx) domain 1 (Lx=Size of domain1 ) @@ -542,7 +433,7 @@ IF (LOCEAN .AND. LDEEPOC) THEN CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,IRESP) CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,IRESP) CALL GET_DIM_EXT_ll('B',IIU,IJU) - CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) + CALL GET_INDICE_ll(IIB,IJB,IIE,IJE,IIU,IJU) DO JJ = IJB,IJE DO JI = IIB,IIE ZDIST(JI,JJ) = SQRT( & @@ -569,9 +460,14 @@ GUSERV = (KRR/=0) ! compute the coefficients for the uncentred gradient computation near the ! ground ! -ZKEFF(:,:,:) = MZM( PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) +IF (LHARAT) THEN +! LHARAT so TKE and length scales at half levels! + ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) +50.*MFMOIST(:,:,:) +ELSE + ZKEFF(:,:,:) = MZM(PLM(:,:,:) * SQRT(PTKEM(:,:,:)), KKA, KKU, KKL) +ENDIF ! -! define a cloud mask with ri and rc (used after with a threshold) for Leonard terms +! Define a cloud mask with ri and rc (used after with a threshold) for Leonard terms ! IF(LHGRAD) THEN IF ( KRRL >= 1 ) THEN @@ -608,27 +504,32 @@ END IF ! ! Compute the turbulent flux F and F' at time t-dt. ! -ZF (:,:,:) = -XCSHF*PPHI3*ZKEFF*DZM(PTHLM)/PDZZ -ZDFDDTDZ(:,:,:) = -XCSHF*ZKEFF*D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) +IF (LHARAT) THEN + ZF (:,:,:) = -ZKEFF*DZM(PTHLM, KKA, KKU, KKL)/PDZZ + ZDFDDTDZ(:,:,:) = -ZKEFF +ELSE + ZF (:,:,:) = -XCSHF*PPHI3*ZKEFF*DZM(PTHLM, KKA, KKU, KKL)/PDZZ + ZDFDDTDZ(:,:,:) = -XCSHF*ZKEFF*D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) +END IF ! IF (LHGRAD) THEN ! Compute the Leonard terms for thl ZDELTAX= XXHAT(3) - XXHAT(2) - ZF_NEW (:,:,:)= XCOEFHGRADTHL*ZDELTAX*ZDELTAX/12.0*( & - MXF(GX_W_UW(PWM(:,:,:), XDXX, XDZZ, XDZX))& - *MZM(GX_M_M(PTHLM(:,:,:),XDXX,XDZZ,XDZX)) & - + MYF(GY_W_VW(PWM(:,:,:), XDYY,XDZZ,XDZY)) & - *MZM(GY_M_M(PTHLM(:,:,:),XDYY,XDZZ,XDZY)) ) + ZF_LEONARD (:,:,:)= XCOEFHGRADTHL*ZDELTAX*ZDELTAX/12.0*( & + MXF(GX_W_UW(PWM(:,:,:), XDXX,XDZZ,XDZX,KKA,KKU,KKL))& + *MZM(GX_M_M(PTHLM(:,:,:),XDXX,XDZZ,XDZX,KKA, KKU, KKL), KKA, KKU, KKL) & + + MYF(GY_W_VW(PWM(:,:,:), XDYY,XDZZ,XDZY,KKA,KKU,KKL)) & + *MZM(GY_M_M(PTHLM(:,:,:),XDYY,XDZZ,XDZY,KKA, KKU, KKL), KKA, KKU, KKL) ) END IF ! ! Effect of 3rd order terms in temperature flux (at flux point) ! ! d(w'2th')/dz IF (GFWTH) THEN - Z3RDMOMENT= M3_WTH_W2TH(PREDTH1,PREDR1,PD,ZKEFF,PTKEM) + Z3RDMOMENT= M3_WTH_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,ZKEFF,PTKEM) ! ZF = ZF + Z3RDMOMENT * PFWTH - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2TH_O_DDTDZ(PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& & PD,PBLL_O_E,PETHETA,ZKEFF,PTKEM) * PFWTH END IF ! @@ -636,39 +537,39 @@ END IF IF (GFTH2) THEN Z3RDMOMENT= M3_WTH_WTH2(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) ! - ZF = ZF + Z3RDMOMENT * MZM(PFTH2) + ZF = ZF + Z3RDMOMENT * MZM(PFTH2, KKA, KKU, KKL) ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WTH2_O_DDTDZ(Z3RDMOMENT,PREDTH1,PREDR1,& - & PD,PBLL_O_E,PETHETA) * MZM(PFTH2) + & PD,PBLL_O_E,PETHETA) * MZM(PFTH2, KKA, KKU, KKL) END IF ! ! d(w'2r')/dz IF (GFWR) THEN - ZF = ZF + M3_WTH_W2R(PD,ZKEFF,& + ZF = ZF + M3_WTH_W2R(KKA,KKU,KKL,PD,ZKEFF,& & PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ) * PFWR - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2R_O_DDTDZ(PREDTH1,PREDR1,& + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,& & PD,ZKEFF,PTKEM,PBLL_O_E,PEMOIST) * PFWR END IF ! ! d(w'r'2)/dz IF (GFR2) THEN - ZF = ZF + M3_WTH_WR2(PD,ZKEFF,PTKEM,& - & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTH_DZ) * MZM(PFR2) - ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,& - & ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) * MZM(PFR2) + ZF = ZF + M3_WTH_WR2(KKA,KKU,KKL,PD,ZKEFF,PTKEM,& + & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTH_DZ) * MZM(PFR2, KKA, KKU, KKL) + ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,& + & ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) * MZM(PFR2, KKA, KKU, KKL) END IF ! ! d(w'th'r')/dz IF (GFTHR) THEN - Z3RDMOMENT= M3_WTH_WTHR(PREDR1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& + Z3RDMOMENT= M3_WTH_WTHR(KKA,KKU,KKL,PREDR1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& & PLEPS,PEMOIST) ! - ZF = ZF + Z3RDMOMENT * MZM(PFTHR) + ZF = ZF + Z3RDMOMENT * MZM(PFTHR, KKA, KKU, KKL) ZDFDDTDZ = ZDFDDTDZ + D_M3_WTH_WTHR_O_DDTDZ(Z3RDMOMENT,PREDTH1,& - & PREDR1,PD,PBLL_O_E,PETHETA) * MZM(PFTHR) + & PREDR1,PD,PBLL_O_E,PETHETA) * MZM(PFTHR, KKA, KKU, KKL) END IF ! compute interface flux IF (LCOUPLES) THEN ! Autocoupling O-A LES - IF (LOCEAN) THEN ! ocean model in coupled case + IF (OOCEAN) THEN ! ocean model in coupled case ZF(:,:,IKE) = (XSSTFL_C(:,:,1)+XSSRFL_C(:,:,1)) & *0.5* ( 1. + PRHODJ(:,:,KKU)/PRHODJ(:,:,IKE) ) ELSE ! atmosph model in coupled case @@ -691,11 +592,14 @@ ELSE ! No coupling O and A cases * 0.5 * (1. + PRHODJ(:,:,KKA) / PRHODJ(:,:,IKB)) END IF ! - IF (LOCEAN) THEN + IF (OOCEAN) THEN ZF(:,:,IKE) = XSSTFL(:,:) *0.5*(1. + PRHODJ(:,:,KKU) / PRHODJ(:,:,IKE)) ELSE !end ocean case (in nocoupled case) ! atmos top - ZF(:,:,IKE)=0. +#ifdef REPRO48 +#else + ZF(:,:,IKE)=0. +#endif END IF END IF !end no coupled cases ! @@ -712,7 +616,8 @@ IF (LHGRAD) THEN ZALT(:,:,JK) = PZZ(:,:,JK)-XZS(:,:) END DO WHERE ( (ZCLD_THOLD(:,:,:) >= XCLDTHOLD) .AND. ( ZALT(:,:,:) >= XALTHGRAD) ) - ZRWTHL(:,:,:) = -GZ_W_M(MZM(PRHODJ(:,:,:))*ZF_NEW(:,:,:),XDZZ) + ZRWTHL(:,:,:) = -GZ_W_M(MZM(PRHODJ(:,:,:), KKA, KKU, KKL)*ZF_LEONARD(:,:,:),XDZZ,& + KKA, KKU, KKL) END WHERE END IF ! @@ -723,16 +628,16 @@ PRTHLS(:,:,:)= PRTHLS(:,:,:) + ZRWTHL(:,:,:) ! Conservative potential temperature flux : ! ZFLXZ(:,:,:) = ZF & - + PIMPL * ZDFDDTDZ * DZM(PTHLP - PTHLM) / PDZZ + + PIMPL * ZDFDDTDZ * DZM(PTHLP - PTHLM, KKA, KKU, KKL) / PDZZ ! replace the flux by the Leonard terms IF (LHGRAD) THEN WHERE ( (ZCLD_THOLD(:,:,:) >= XCLDTHOLD) .AND. ( ZALT(:,:,:) >= XALTHGRAD) ) - ZFLXZ(:,:,:) = ZF_NEW(:,:,:) + ZFLXZ(:,:,:) = ZF_LEONARD(:,:,:) END WHERE END IF ! ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) -IF (LOCEAN) THEN +IF (OOCEAN) THEN ZFLXZ(:,:,KKU) = ZFLXZ(:,:,IKE) END IF ! @@ -742,16 +647,16 @@ END DO ! PWTH(:,:,IKB)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) ! -IF (LOCEAN) THEN +IF (OOCEAN) THEN PWTH(:,:,IKE)=0.5*(ZFLXZ(:,:,IKE)+ZFLXZ(:,:,IKE+KKL)) PWTH(:,:,KKA)=0. PWTH(:,:,KKU)=ZFLXZ(:,:,KKU) ELSE - PWTH(:,:,IKE)=PWTH(:,:,IKE-KKL) PWTH(:,:,KKA)=0.5*(ZFLXZ(:,:,KKA)+ZFLXZ(:,:,KKA+KKL)) + PWTH(:,:,IKE)=PWTH(:,:,IKE-KKL) END IF ! -IF ( OTURB_FLX .AND. tpfile%lopened ) THEN +IF ( OTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the conservative potential temperature vertical flux TZFIELD%CMNHNAME = 'THW_FLX' TZFIELD%CSTDNAME = '' @@ -767,63 +672,65 @@ IF ( OTURB_FLX .AND. tpfile%lopened ) THEN END IF ! ! Contribution of the conservative temperature flux to the buoyancy flux -IF (LOCEAN) THEN - PTP(:,:,:)= XG*XALPHAOC * MZF(ZFLXZ ) +IF (OOCEAN) THEN + PTP(:,:,:)= XG*XALPHAOC * MZF(ZFLXZ,KKA, KKU, KKL ) ELSE IF (KRR /= 0) THEN - PTP(:,:,:) = PBETA * MZF( MZM(PETHETA) * ZFLXZ ) + PTP(:,:,:) = PBETA * MZF( MZM(PETHETA,KKA, KKU, KKL) * ZFLXZ,KKA, KKU, KKL ) PTP(:,:,IKB)= PBETA(:,:,IKB) * PETHETA(:,:,IKB) * & 0.5 * ( ZFLXZ (:,:,IKB) + ZFLXZ (:,:,IKB+KKL) ) ELSE - PTP(:,:,:)= PBETA * MZF( ZFLXZ ) + PTP(:,:,:)= PBETA * MZF( ZFLXZ,KKA, KKU, KKL ) END IF END IF ! ! Buoyancy flux at flux points ! -PWTHV = MZM(PETHETA) * ZFLXZ +PWTHV = MZM(PETHETA, KKA, KKU, KKL) * ZFLXZ PWTHV(:,:,IKB) = PETHETA(:,:,IKB) * ZFLXZ(:,:,IKB) ! -IF (LOCEAN) THEN +IF (OOCEAN) THEN ! temperature contribution to Buy flux PWTHV(:,:,IKE) = PETHETA(:,:,IKE) * ZFLXZ(:,:,IKE) END IF !* 2.3 Partial vertical divergence of the < Rc w > flux -! -IF ( KRRL >= 1 ) THEN - IF ( KRRI >= 1 ) THEN - PRRS(:,:,:,2) = PRRS(:,:,:,2) - & - PRHODJ*PATHETA*2.*PSRCM*DZF(ZFLXZ/PDZZ) & - *(1.0-PFRAC_ICE(:,:,:)) - PRRS(:,:,:,4) = PRRS(:,:,:,4) - & - PRHODJ*PATHETA*2.*PSRCM*DZF(ZFLXZ/PDZZ) & - *PFRAC_ICE(:,:,:) - ELSE - PRRS(:,:,:,2) = PRRS(:,:,:,2) - & - PRHODJ*PATHETA*2.*PSRCM*DZF(ZFLXZ/PDZZ) - END IF +! Correction for qc and qi negative in AROME +IF(CPROGRAM/='AROME ') THEN + IF ( KRRL >= 1 ) THEN + IF ( KRRI >= 1 ) THEN + PRRS(:,:,:,2) = PRRS(:,:,:,2) - & + PRHODJ*PATHETA*2.*PSRCM*DZF(ZFLXZ/PDZZ, KKA, KKU, KKL) & + *(1.0-PFRAC_ICE(:,:,:)) + PRRS(:,:,:,4) = PRRS(:,:,:,4) - & + PRHODJ*PATHETA*2.*PSRCM*DZF(ZFLXZ/PDZZ, KKA, KKU, KKL) & + *PFRAC_ICE(:,:,:) + ELSE + PRRS(:,:,:,2) = PRRS(:,:,:,2) - & + PRHODJ*PATHETA*2.*PSRCM*DZF(ZFLXZ/PDZZ, KKA, KKU, KKL) + END IF + END IF END IF ! !* 2.4 Storage in LES configuration ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(ZFLXZ), X_LES_SUBGRID_WThl ) - CALL LES_MEAN_SUBGRID( MZF(PWM*ZFLXZ), X_LES_RES_W_SBG_WThl ) - CALL LES_MEAN_SUBGRID( GZ_W_M(PWM,PDZZ)*MZF(ZFLXZ),& + CALL LES_MEAN_SUBGRID(MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WThl ) + CALL LES_MEAN_SUBGRID(MZF(PWM*ZFLXZ, KKA, KKU, KKL), X_LES_RES_W_SBG_WThl ) + CALL LES_MEAN_SUBGRID(GZ_W_M(PWM,PDZZ, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL),& & X_LES_RES_ddxa_W_SBG_UaThl ) - CALL LES_MEAN_SUBGRID( MZF(PDTH_DZ*ZFLXZ), X_LES_RES_ddxa_Thl_SBG_UaThl ) - CALL LES_MEAN_SUBGRID( -XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ), X_LES_SUBGRID_ThlPz ) - CALL LES_MEAN_SUBGRID( MZF(MZM(PETHETA)*ZFLXZ), X_LES_SUBGRID_WThv ) + CALL LES_MEAN_SUBGRID(MZF(PDTH_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Thl_SBG_UaThl ) + CALL LES_MEAN_SUBGRID(-XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_ThlPz ) + CALL LES_MEAN_SUBGRID(MZF(MZM(PETHETA, KKA, KKU, KKL)*ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WThv ) IF (KRR>=1) THEN - CALL LES_MEAN_SUBGRID( MZF(PDR_DZ*ZFLXZ), X_LES_RES_ddxa_Rt_SBG_UaThl ) + CALL LES_MEAN_SUBGRID(MZF(PDR_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Rt_SBG_UaThl ) END IF !* diagnostic of mixing coefficient for heat - ZA = DZM(PTHLP) + ZA = DZM(PTHLP, KKA, KKU, KKL) WHERE (ZA==0.) ZA=1.E-6 ZA = - ZFLXZ / ZA * PDZZ ZA(:,:,IKB) = XCSHF*PPHI3(:,:,IKB)*ZKEFF(:,:,IKB) - ZA = MZF( ZA ) + ZA = MZF(ZA, KKA, KKU, KKL) ZA = MIN(MAX(ZA,-1000.),1000.) CALL LES_MEAN_SUBGRID( ZA, X_LES_SUBGRID_Kh ) ! @@ -848,27 +755,32 @@ IF (HTOM=='TM06') CALL TM06_H(IKB,IKTB,IKTE,PTSTEP,PZZ,ZFLXZ,PBL_DEPTH) IF (KRR /= 0) THEN ! Compute the turbulent flux F and F' at time t-dt. ! - ZF (:,:,:) = -XCSHF*PPSI3*ZKEFF*DZM(PRM(:,:,:,1))/PDZZ + IF (LHARAT) THEN + ZF (:,:,:) = -ZKEFF*DZM(PRM(:,:,:,1), KKA, KKU, KKL)/PDZZ + ZDFDDRDZ(:,:,:) = -ZKEFF + ELSE + ZF (:,:,:) = -XCSHF*PPSI3*ZKEFF*DZM(PRM(:,:,:,1), KKA, KKU, KKL)/PDZZ ZDFDDRDZ(:,:,:) = -XCSHF*ZKEFF*D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) + ENDIF ! ! Compute Leonard Terms for Cloud mixing ratio IF (LHGRAD) THEN ZDELTAX= XXHAT(3) - XXHAT(2) - ZF_NEW (:,:,:)= XCOEFHGRADRM*ZDELTAX*ZDELTAX/12.0*( & - MXF(GX_W_UW(PWM(:,:,:), XDXX, XDZZ, XDZX)) & - *MZM(GX_M_M(PRM(:,:,:,1),XDXX,XDZZ,XDZX)) & - +MYF(GY_W_VW(PWM(:,:,:), XDYY,XDZZ,XDZY)) & - *MZM(GY_M_M(PRM(:,:,:,1),XDYY,XDZZ,XDZY)) ) + ZF_LEONARD (:,:,:)= XCOEFHGRADRM*ZDELTAX*ZDELTAX/12.0*( & + MXF(GX_W_UW(PWM(:,:,:), XDXX,XDZZ,XDZX,KKA,KKU,KKL)) & + *MZM(GX_M_M(PRM(:,:,:,1),XDXX,XDZZ,XDZX,KKA,KKU,KKL),KKA,KKU,KKL) & + +MYF(GY_W_VW(PWM(:,:,:), XDYY,XDZZ,XDZY,KKA,KKU,KKL)) & + *MZM(GY_M_M(PRM(:,:,:,1),XDYY,XDZZ,XDZY,KKA,KKU,KKL),KKA,KKU,KKL) ) END IF ! ! Effect of 3rd order terms in temperature flux (at flux point) ! ! d(w'2r')/dz IF (GFWR) THEN - Z3RDMOMENT= M3_WR_W2R(PREDR1,PREDTH1,PD,ZKEFF,PTKEM) + Z3RDMOMENT= M3_WR_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,ZKEFF,PTKEM) ! ZF = ZF + Z3RDMOMENT * PFWR - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& & PBLL_O_E,PEMOIST,ZKEFF,PTKEM) * PFWR END IF ! @@ -876,40 +788,40 @@ IF (KRR /= 0) THEN IF (GFR2) THEN Z3RDMOMENT= M3_WR_WR2(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) ! - ZF = ZF + Z3RDMOMENT * MZM(PFR2) + ZF = ZF + Z3RDMOMENT * MZM(PFR2, KKA, KKU, KKL) ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WR2_O_DDRDZ(Z3RDMOMENT,PREDR1,& - & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(PFR2) + & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(PFR2, KKA, KKU, KKL) END IF ! ! d(w'2th')/dz IF (GFWTH) THEN - ZF = ZF + M3_WR_W2TH(PD,ZKEFF,& + ZF = ZF + M3_WR_W2TH(KKA,KKU,KKL,PD,ZKEFF,& & PTKEM,PBLL_O_E,PETHETA,PDR_DZ) * PFWTH - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2TH_O_DDRDZ(PREDR1,PREDTH1,& + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,& & PD,ZKEFF,PTKEM,PBLL_O_E,PETHETA) * PFWTH END IF ! ! d(w'th'2)/dz IF (GFTH2) THEN - ZF = ZF + M3_WR_WTH2(PD,ZKEFF,PTKEM,& - & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDR_DZ) * MZM(PFTH2) - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTH2_O_DDRDZ(PREDR1,PREDTH1,PD,& - &ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) * MZM(PFTH2) + ZF = ZF + M3_WR_WTH2(KKA,KKU,KKL,PD,ZKEFF,PTKEM,& + & PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDR_DZ) * MZM(PFTH2, KKA, KKU, KKL) + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,& + &ZKEFF,PTKEM,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) * MZM(PFTH2, KKA, KKU, KKL) END IF ! ! d(w'th'r')/dz IF (GFTHR) THEN - Z3RDMOMENT= M3_WR_WTHR(PREDTH1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& + Z3RDMOMENT= M3_WR_WTHR(KKA,KKU,KKL,PREDTH1,PD,ZKEFF,PTKEM,PSQRT_TKE,PBETA,& & PLEPS,PETHETA) ! - ZF = ZF + Z3RDMOMENT * MZM(PFTHR) - ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTHR_O_DDRDZ(Z3RDMOMENT,PREDR1, & - & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(PFTHR) + ZF = ZF + Z3RDMOMENT * MZM(PFTHR, KKA, KKU, KKL) + ZDFDDRDZ = ZDFDDRDZ + D_M3_WR_WTHR_O_DDRDZ(KKA,KKU,KKL,Z3RDMOMENT,PREDR1, & + & PREDTH1,PD,PBLL_O_E,PEMOIST) * MZM(PFTHR, KKA, KKU, KKL) END IF ! ! compute interface flux IF (LCOUPLES) THEN ! coupling NH O-A - IF (LOCEAN) THEN ! ocean model in coupled case + IF (OOCEAN) THEN ! ocean model in coupled case ! evap effect on salinity to be added later !!! ZF(:,:,IKE) = 0. ELSE ! atmosph model in coupled case @@ -934,13 +846,16 @@ IF (KRR /= 0) THEN * 0.5 * (1. + PRHODJ(:,:,KKA) / PRHODJ(:,:,IKB)) END IF ! - IF (LOCEAN) THEN + IF (OOCEAN) THEN ! General ocean case ! salinity/evap effect to be added later !!!!! ZF(:,:,IKE) = 0. ELSE !end ocean case (in nocoupled case) ! atmos top - ZF(:,:,IKE)=0. +#ifdef REPRO48 +#else + ZF(:,:,IKE)=0. +#endif END IF END IF!end no coupled cases ! Compute the split conservative potential temperature at t+deltat @@ -957,7 +872,7 @@ IF (KRR /= 0) THEN ZALT(:,:,JK) = PZZ(:,:,JK)-XZS(:,:) END DO WHERE ( (ZCLD_THOLD(:,:,:) >= XCLDTHOLD ) .AND. ( ZALT(:,:,:) >= XALTHGRAD ) ) - ZRWRNP (:,:,:) = -GZ_W_M(MZM(PRHODJ(:,:,:))*ZF_NEW(:,:,:),XDZZ) + ZRWRNP (:,:,:) = -GZ_W_M(MZM(PRHODJ(:,:,:),KKA,KKU,KKL)*ZF_LEONARD(:,:,:),XDZZ,KKA,KKU,KKL) END WHERE END IF ! @@ -968,12 +883,12 @@ IF (KRR /= 0) THEN ! cons. mixing ratio flux : ! ZFLXZ(:,:,:) = ZF & - + PIMPL * ZDFDDRDZ * DZM(PRP - PRM(:,:,:,1)) / PDZZ + + PIMPL * ZDFDDRDZ * DZM(PRP - PRM(:,:,:,1), KKA, KKU, KKL) / PDZZ ! ! replace the flux by the Leonard terms above ZALT and ZCLD_THOLD IF (LHGRAD) THEN WHERE ( (ZCLD_THOLD(:,:,:) >= XCLDTHOLD ) .AND. ( ZALT(:,:,:) >= XALTHGRAD ) ) - ZFLXZ(:,:,:) = ZF_NEW(:,:,:) + ZFLXZ(:,:,:) = ZF_LEONARD(:,:,:) END WHERE END IF ! @@ -987,7 +902,7 @@ IF (KRR /= 0) THEN PWRC(:,:,IKE)=PWRC(:,:,IKE-KKL) ! ! - IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + IF ( OTURB_FLX .AND. TPFILE%LOPENED ) THEN ! stores the conservative mixing ratio vertical flux TZFIELD%CMNHNAME = 'RCONSW_FLX' TZFIELD%CSTDNAME = '' @@ -1003,10 +918,10 @@ IF (KRR /= 0) THEN END IF ! ! Contribution of the conservative water flux to the Buoyancy flux - IF (LOCEAN) THEN - ZA(:,:,:)= -XG*XBETAOC * MZF(ZFLXZ ) + IF (OOCEAN) THEN + ZA(:,:,:)= -XG*XBETAOC * MZF(ZFLXZ, KKA, KKU, KKL ) ELSE - ZA(:,:,:) = PBETA * MZF( MZM(PEMOIST) * ZFLXZ ) + ZA(:,:,:) = PBETA * MZF( MZM(PEMOIST, KKA, KKU, KKL) * ZFLXZ,KKA,KKU,KKL ) ZA(:,:,IKB) = PBETA(:,:,IKB) * PEMOIST(:,:,IKB) * & 0.5 * ( ZFLXZ (:,:,IKB) + ZFLXZ (:,:,IKB+KKL) ) PTP(:,:,:) = PTP(:,:,:) + ZA(:,:,:) @@ -1014,40 +929,42 @@ IF (KRR /= 0) THEN ! ! Buoyancy flux at flux points ! - PWTHV = PWTHV + MZM(PEMOIST) * ZFLXZ + PWTHV = PWTHV + MZM(PEMOIST, KKA, KKU, KKL) * ZFLXZ PWTHV(:,:,IKB) = PWTHV(:,:,IKB) + PEMOIST(:,:,IKB) * ZFLXZ(:,:,IKB) - IF (LOCEAN) THEN + IF (OOCEAN) THEN PWTHV(:,:,IKE) = PWTHV(:,:,IKE) + PEMOIST(:,:,IKE)* ZFLXZ(:,:,IKE) END IF ! !* 3.3 Complete vertical divergence of the < Rc w > flux -! - IF ( KRRL >= 1 ) THEN - IF ( KRRI >= 1 ) THEN - PRRS(:,:,:,2) = PRRS(:,:,:,2) - & - PRHODJ*PAMOIST*2.*PSRCM*DZF(ZFLXZ/PDZZ ) & - *(1.0-PFRAC_ICE(:,:,:)) - PRRS(:,:,:,4) = PRRS(:,:,:,4) - & - PRHODJ*PAMOIST*2.*PSRCM*DZF(ZFLXZ/PDZZ ) & - *PFRAC_ICE(:,:,:) - ELSE - PRRS(:,:,:,2) = PRRS(:,:,:,2) - & - PRHODJ*PAMOIST*2.*PSRCM*DZF(ZFLXZ/PDZZ ) - END IF - END IF +! Correction of qc and qi negative for AROME +IF(CPROGRAM/='AROME ') THEN + IF ( KRRL >= 1 ) THEN + IF ( KRRI >= 1 ) THEN + PRRS(:,:,:,2) = PRRS(:,:,:,2) - & + PRHODJ*PAMOIST*2.*PSRCM*DZF(ZFLXZ/PDZZ,KKA,KKU,KKL ) & + *(1.0-PFRAC_ICE(:,:,:)) + PRRS(:,:,:,4) = PRRS(:,:,:,4) - & + PRHODJ*PAMOIST*2.*PSRCM*DZF(ZFLXZ/PDZZ,KKA,KKU,KKL ) & + *PFRAC_ICE(:,:,:) + ELSE + PRRS(:,:,:,2) = PRRS(:,:,:,2) - & + PRHODJ*PAMOIST*2.*PSRCM*DZF(ZFLXZ/PDZZ,KKA,KKU,KKL ) + END IF + END IF +END IF ! !* 3.4 Storage in LES configuration ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(ZFLXZ), X_LES_SUBGRID_WRt ) - CALL LES_MEAN_SUBGRID( MZF(PWM*ZFLXZ), X_LES_RES_W_SBG_WRt ) - CALL LES_MEAN_SUBGRID( GZ_W_M(PWM,PDZZ)*MZF(ZFLXZ),& + CALL LES_MEAN_SUBGRID(MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WRt ) + CALL LES_MEAN_SUBGRID(MZF(PWM*ZFLXZ, KKA, KKU, KKL), X_LES_RES_W_SBG_WRt ) + CALL LES_MEAN_SUBGRID(GZ_W_M(PWM,PDZZ, KKA, KKU, KKL)*MZF(ZFLXZ, KKA, KKU, KKL),& & X_LES_RES_ddxa_W_SBG_UaRt ) - CALL LES_MEAN_SUBGRID( MZF(PDTH_DZ*ZFLXZ), X_LES_RES_ddxa_Thl_SBG_UaRt ) - CALL LES_MEAN_SUBGRID( MZF(PDR_DZ*ZFLXZ), X_LES_RES_ddxa_Rt_SBG_UaRt ) - CALL LES_MEAN_SUBGRID( MZF(MZM(PEMOIST)*ZFLXZ), X_LES_SUBGRID_WThv , .TRUE. ) - CALL LES_MEAN_SUBGRID( -XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ), X_LES_SUBGRID_RtPz ) + CALL LES_MEAN_SUBGRID(MZF(PDTH_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Thl_SBG_UaRt ) + CALL LES_MEAN_SUBGRID(MZF(PDR_DZ*ZFLXZ, KKA, KKU, KKL), X_LES_RES_ddxa_Rt_SBG_UaRt ) + CALL LES_MEAN_SUBGRID(MZF(MZM(PEMOIST, KKA, KKU, KKL)*ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WThv , .TRUE. ) + CALL LES_MEAN_SUBGRID(-XCTP*PSQRT_TKE/PLM*MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_RtPz ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF @@ -1063,21 +980,28 @@ END IF ! !* 4.1 <w Rc> ! -IF ( ((OTURB_FLX .AND. tpfile%lopened) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN - ! - ! recover the Conservative potential temperature flux : - ZA(:,:,:) = DZM(PIMPL * PTHLP + PEXPL * PTHLM) / PDZZ * & - (-PPHI3*MZM(PLM*PSQRT_TKE)) * XCSHF +IF ( ((OTURB_FLX .AND. TPFILE%LOPENED) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN +! +! recover the Conservative potential temperature flux : +! With LHARAT is true tke and length scales at half levels +! yet modify to use length scale and tke at half levels from vdfexcuhl + IF (LHARAT) THEN + ZA(:,:,:) = DZM(PIMPL * PTHLP + PEXPL * PTHLM, KKA, KKU, KKL) / PDZZ * & + (-PLM*PSQRT_TKE) + ELSE + ZA(:,:,:) = DZM(PIMPL * PTHLP + PEXPL * PTHLM, KKA, KKU, KKL) / PDZZ * & + (-PPHI3*MZM(PLM*PSQRT_TKE, KKA, KKU, KKL)) * XCSHF + ENDIF ZA(:,:,IKB) = ( PIMPL*PSFTHP(:,:) + PEXPL*PSFTHM(:,:) ) & * PDIRCOSZW(:,:) ! ! compute <w Rc> - ZFLXZ(:,:,:) = MZM( PAMOIST * 2.* PSRCM ) * ZFLXZ(:,:,:) + & - MZM( PATHETA * 2.* PSRCM ) * ZA(:,:,:) + ZFLXZ(:,:,:) = MZM(PAMOIST * 2.* PSRCM, KKA, KKU, KKL) * ZFLXZ(:,:,:) + & + MZM(PATHETA * 2.* PSRCM, KKA, KKU, KKL) * ZA(:,:,:) ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) ! ! store the liquid water mixing ratio vertical flux - IF ( OTURB_FLX .AND. tpfile%lopened ) THEN + IF ( OTURB_FLX .AND. TPFILE%LOPENED ) THEN TZFIELD%CMNHNAME = 'RCW_FLX' TZFIELD%CSTDNAME = '' TZFIELD%CLONGNAME = 'RCW_FLX' @@ -1095,15 +1019,17 @@ IF ( ((OTURB_FLX .AND. tpfile%lopened) .OR. LLES_CALL) .AND. (KRRL > 0) ) THEN ! IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(ZFLXZ), X_LES_SUBGRID_WRc ) + CALL LES_MEAN_SUBGRID( MZF(ZFLXZ, KKA, KKU, KKL), X_LES_SUBGRID_WRc ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF ! END IF !end of <w Rc> -IF (LOCEAN.AND.LDEEPOC) THEN +IF (OOCEAN .AND. LDEEPOC) THEN DEALLOCATE(ZXHAT_ll,ZYHAT_ll) END IF ! !---------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('TURB_VER_THERMO_FLUX',1,ZHOOK_HANDLE) END SUBROUTINE TURB_VER_THERMO_FLUX +END MODULE MODE_TURB_VER_THERMO_FLUX diff --git a/src/common/turb/mode_update_lm.F90 b/src/common/turb/mode_update_lm.F90 new file mode 100644 index 0000000000000000000000000000000000000000..d5ab737b0b7d15fd55afbec372f9990a33654f2a --- /dev/null +++ b/src/common/turb/mode_update_lm.F90 @@ -0,0 +1,119 @@ +!MNH_LIC Copyright 2006-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_UPDATE_LM +IMPLICIT NONE +CONTAINS +SUBROUTINE UPDATE_LM(HLBCX,HLBCY,PLM,PLEPS) +! ################################################################# +! +!!**** *UPDATE_LM* - routine to set external points for mixing length +!! +!! PURPOSE +!! ------- +! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (routine UPDATE_LM) +!! +!! AUTHOR +!! ------ +!! V. Masson * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original april 2006 +!! V.Masson : Exchange of East and North sides +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +USE MODD_CONF +USE MODD_PARAMETERS +! +USE MODE_ll +USE MODD_ARGSLIST_ll, ONLY : LIST_ll +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X boundary type +CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! Y boundary type +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLM ! mixing length +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PLEPS ! dissipative length +! +!* 0.2 declarations of local variables +! +INTEGER :: IIB ! First physical index in x direction +INTEGER :: IJB ! First physical index in y direction +INTEGER :: IIE ! last physical index in x direction +INTEGER :: IJE ! last physical index in y direction +INTEGER :: JI ! loop index +! +TYPE(LIST_ll), POINTER :: TZLM_ll ! list of fields to exchange +INTEGER :: IINFO_ll ! return code of parallel routine +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE DIMENSIONS OF ARRAYS : +! ---------------------------- +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +NULLIFY(TZLM_ll) +! +!------------------------------------------------------------------------------- +! +!* 2. UPDATE HALOs : +! ------------- +! +! +!!$IF(NHALO == 1) THEN + CALL ADD3DFIELD_ll( TZLM_ll, PLM, 'UPDATE_LM::PLM' ) + CALL ADD3DFIELD_ll( TZLM_ll, PLEPS, 'UPDATE_LM::PLEPS' ) + CALL UPDATE_HALO_ll(TZLM_ll,IINFO_ll) + CALL CLEANLIST_ll(TZLM_ll) +!!$END IF +! +!------------------------------------------------------------------------------- +! +!* 3. UPDATE EXTERNAL POINTS OF GLOBAL DOMAIN: +! --------------------------------------- +! +IF ( HLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN + PLM (IIB-1,:,:) = PLM (IIB,:,:) + PLEPS(IIB-1,:,:) = PLEPS(IIB,:,:) +END IF +IF ( HLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN + PLM (IIE+1,:,:) = PLM (IIE,:,:) + PLEPS(IIE+1,:,:) = PLEPS(IIE,:,:) +END IF +IF ( HLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN + DO JI=1,SIZE(PLM,1) + PLM (JI,IJB-1,:) = PLM (JI,IJB,:) + PLEPS(JI,IJB-1,:) = PLEPS(JI,IJB,:) + END DO +END IF +IF ( HLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN + DO JI=1,SIZE(PLM,1) + PLM (JI,IJE+1,:) = PLM (JI,IJE,:) + PLEPS(JI,IJE+1,:) = PLEPS(JI,IJE,:) + END DO +END IF +!----------------------------------------------------------------------------- +END SUBROUTINE UPDATE_LM +END MODULE MODE_UPDATE_LM 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/arome/turb/modi_turb.F90 b/src/common/turb/modi_turb.F90 similarity index 62% rename from src/arome/turb/modi_turb.F90 rename to src/common/turb/modi_turb.F90 index 2a15db137e613a63a888128d9abfb866c0d3eed8..b2b57f334a08349e3a242d6428ddd63f5420922b 100644 --- a/src/arome/turb/modi_turb.F90 +++ b/src/common/turb/modi_turb.F90 @@ -5,30 +5,29 @@ INTERFACE ! SUBROUTINE TURB(KKA, KKU, KKL, KMI,KRR,KRRL,KRRI,HLBCX,HLBCY, & - & KSPLIT,KMODEL_CL, & - & OCLOSE_OUT,OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01, & - & HTURBDIM,HTURBLEN,HTOM,HTURBLEN_CL,HINST_SFU, & - & HMF_UPDRAFT,PIMPL,PTSTEP_UVW, PTSTEP_MET,PTSTEP_SV, & - & HFMFILE,HLUOUT,PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & + & KSPLIT,KMODEL_CL, & + & OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01,OOCEAN, & + & HTURBDIM,HTURBLEN,HTOM,HTURBLEN_CL,HCLOUD, & + & PIMPL,PTSTEP,TPFILE, & + & PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & & PDIRCOSXW,PDIRCOSYW,PDIRCOSZW,PCOSSLOPE,PSINSLOPE, & - & PRHODJ,PTHVREF,PRHODREF, & + & PRHODJ,PTHVREF, & & PSFTH,PSFRV,PSFSV,PSFU,PSFV, & - & PPABSM,PUM,PVM,PWM,PTKEM,PSVM,PSRCM, & + & PPABST,PUT,PVT,PWT,PTKET,PSVT,PSRCT, & & PLENGTHM,PLENGTHH,MFMOIST, & & PBL_DEPTH, PSBL_DEPTH, & - & PUT,PVT,PWT,PCEI,PCEI_MIN,PCEI_MAX,PCOEF_AMPL_SAT, & - & PTHLM,PRM, & + & PCEI,PCEI_MIN,PCEI_MAX,PCOEF_AMPL_SAT, & + & PTHLT,PRT, & & PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS,PRTKES, & - & PHGRAD,PSIGS, & + & PSIGS, & + & PFLXZTHVMF,PWTH,PWRC,PWSV,PDP,PTP,PTDIFF,PTDISS, & + & TBUDGETS, KBUDGETS, & + & PEDR,PLEM,PRTKEMS,PTPMF, & & PDRUS_TURB,PDRVS_TURB, & - & PDRTHLS_TURB,PDRRTS_TURB,PDRSVS_TURB, & - & PFLXZTHVMF,PWTH,PWRC,PWSV,PDP,PTP,PTPMF,PTDIFF, & - & PTDISS,PEDR,YDDDH,YDLDDH,YDMDDH) - + & PDRTHLS_TURB,PDRRTS_TURB,PDRSVS_TURB ) ! -USE DDH_MIX, ONLY : TYP_DDH -USE YOMLDDH, ONLY : TLDDH -USE YOMMDDH, ONLY : TMDDH +USE MODD_BUDGET, ONLY : TBUDGETDATA +USE MODD_IO, ONLY : TFILEDATA ! INTEGER, INTENT(IN) :: KKA !near ground array index INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index @@ -38,11 +37,8 @@ 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. CHARACTER(LEN=*),DIMENSION(:),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -CHARACTER(LEN=4),INTENT(IN) :: HMF_UPDRAFT ! Type of mass flux INTEGER, INTENT(IN) :: KSPLIT ! number of time-splitting INTEGER, INTENT(IN) :: KMODEL_CL ! model number for cloud mixing length -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the ! turbulent fluxes in the syncronous FM-file LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some @@ -50,21 +46,16 @@ LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some LOGICAL, INTENT(IN) :: OSUBG_COND ! switch for SUBGrid ! CONDensation LOGICAL, INTENT(IN) :: ORMC01 ! switch for RMC01 lengths in SBL -CHARACTER*4 , INTENT(IN) :: HTURBDIM ! dimensionality of the +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +CHARACTER(LEN=4) , INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme -CHARACTER*4 , INTENT(IN) :: HTURBLEN ! kind of mixing length -CHARACTER*4 , INTENT(IN) :: HTOM ! kind of Third Order Moment -CHARACTER*4 , INTENT(IN) :: HTURBLEN_CL ! kind of cloud mixing length -CHARACTER*1 , INTENT(IN) :: HINST_SFU ! temporal location of the - ! surface friction flux +CHARACTER(LEN=4) , INTENT(IN) :: HTURBLEN ! kind of mixing length +CHARACTER(LEN=4) , INTENT(IN) :: HTOM ! kind of Third Order Moment +CHARACTER(LEN=4) , INTENT(IN) :: HTURBLEN_CL ! kind of cloud mixing length REAL, INTENT(IN) :: PIMPL ! degree of implicitness -REAL, INTENT(IN) :: PTSTEP_UVW ! Dynamical timestep -REAL, INTENT(IN) :: PTSTEP_MET ! Timestep for meteorological variables -REAL, INTENT(IN) :: PTSTEP_SV ! Timestep for tracer variables -CHARACTER(LEN=*), INTENT(IN) :: HFMFILE ! Name of the output - ! FM-file -CHARACTER(LEN=*), INTENT(IN) :: HLUOUT ! Output-listing name for - ! model n +CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme +REAL, INTENT(IN) :: PTSTEP ! Timestep +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file for MesoNH ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY ! metric coefficients @@ -81,8 +72,6 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: MFMOIST ! Moist mass flux DUal sch REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential ! Temperature of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry density of the - ! reference state ! REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV, & ! normal surface fluxes of theta and Rv @@ -92,17 +81,15 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSV ! normal surface fluxes of Scalar var. ! ! prognostic variables at t- deltat -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM ! wind components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! passive scal. var. -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Second-order flux +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT,PVT,PWT ! wind components +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! TKE +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! passive scal. var. +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCT ! Second-order flux ! s'rc'/2Sigma_s2 at time t-1 multiplied by Lambda_3 REAL, DIMENSION(:,:), INTENT(INOUT) :: PBL_DEPTH ! BL depth for TOMS REAL, DIMENSION(:,:), INTENT(INOUT) :: PSBL_DEPTH ! SBL depth for RMC01 ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT,PVT,PWT ! Wind at t -! ! variables for cloud mixing length REAL, DIMENSION(:,:,:), INTENT(IN) :: PCEI ! Cloud Entrainment instability ! index to emphasize localy @@ -111,8 +98,8 @@ REAL, INTENT(IN) :: PCEI_MIN ! minimum threshold for the instability index REAL, INTENT(IN) :: PCEI_MAX ! maximum threshold for the instability index CEI REAL, INTENT(IN) :: PCOEF_AMPL_SAT ! saturation of the amplification coefficient ! thermodynamical variables which are transformed in conservative var. -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHLM ! conservative pot. temp. -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRM ! water var. where +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHLT ! conservative pot. temp. +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT ! water var. where ! PRM(:,:,:,1) is the conservative mixing ratio ! ! sources of momentum, conservative potential temperature, Turb. Kin. Energy, @@ -120,18 +107,18 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRM ! water var. where REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS,PRVS,PRWS,PRTHLS,PRTKES ! Source terms for all water kinds, PRRS(:,:,:,1) is used for the conservative ! mixing ratio -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS +REAL, DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PRTKEMS ! Source terms for all passive scalar variables REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Sigma_s at time t+1 : square root of the variance of the deviation to the ! saturation -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PHGRAD REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDRUS_TURB ! evolution of rhoJ*U by turbulence only -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDRVS_TURB ! evolution of rhoJ*V by turbulence only -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDRTHLS_TURB ! evolution of rhoJ*thl by turbulence only -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDRRTS_TURB ! evolution of rhoJ*rt by turbulence only -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PDRSVS_TURB ! evolution of rhoJ*Sv by turbulence only +REAL, DIMENSION(:,:,:), INTENT(OUT),OPTIONAL :: PDRUS_TURB ! evolution of rhoJ*U by turbulence only +REAL, DIMENSION(:,:,:), INTENT(OUT),OPTIONAL :: PDRVS_TURB ! evolution of rhoJ*V by turbulence only +REAL, DIMENSION(:,:,:), INTENT(OUT),OPTIONAL :: PDRTHLS_TURB ! evolution of rhoJ*thl by turbulence only +REAL, DIMENSION(:,:,:), INTENT(OUT),OPTIONAL :: PDRRTS_TURB ! evolution of rhoJ*rt by turbulence only +REAL, DIMENSION(:,:,:,:), INTENT(OUT),OPTIONAL :: PDRSVS_TURB ! evolution of rhoJ*Sv by turbulence only REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXZTHVMF ! MF contribution for vert. turb. transport ! used in the buoy. prod. of TKE @@ -140,20 +127,18 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP ! Dynamic TKE production REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTP ! Thermal TKE production -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTPMF ! Thermal TKE production +REAL, DIMENSION(:,:,:), INTENT(OUT),OPTIONAL :: PTPMF ! Thermal TKE production REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDIFF ! Diffusion TKE term REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDISS ! Dissipation TKE term - -REAL, DIMENSION(:,:,:),INTENT(OUT) :: PEDR ! eddy dissipation rate - +! REAL, DIMENSION(:,:,:), INTENT(IN) :: PLENGTHM REAL, DIMENSION(:,:,:), INTENT(IN) :: PLENGTHH ! - -TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH -TYPE(TLDDH), INTENT(IN) :: YDLDDH -TYPE(TMDDH), INTENT(IN) :: YDMDDH - +TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS +! +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PEDR ! EDR +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PLEM ! Mixing length ! !------------------------------------------------------------------------------- ! diff --git a/src/common/turb/shallow_mf.F90 b/src/common/turb/shallow_mf.F90 index 2cb9a26b638e41e40f9ade7f15cf79e38ccc3660..814869f50f9f33b5914a93c2779b8fddbaa4aa21 100644 --- a/src/common/turb/shallow_mf.F90 +++ b/src/common/turb/shallow_mf.F90 @@ -76,7 +76,7 @@ USE MODD_PARAMETERS, ONLY: JPVEXT USE MODD_NEB, ONLY: NEB USE MODD_PARAM_MFSHALL_n -USE MODI_THL_RT_FROM_TH_R_MF +USE MODE_THL_RT_FROM_TH_R_MF, ONLY: THL_RT_FROM_TH_R_MF USE MODE_COMPUTE_UPDRAFT, ONLY: COMPUTE_UPDRAFT USE MODE_COMPUTE_UPDRAFT_RHCJ10, ONLY: COMPUTE_UPDRAFT_RHCJ10 USE MODE_COMPUTE_UPDRAFT_RAHA, ONLY: COMPUTE_UPDRAFT_RAHA @@ -236,7 +236,7 @@ ELSEIF (HMF_UPDRAFT == 'RHCJ') THEN PZZ,PDZZ, & PSFTH,PSFRV,PPABSM,PRHODREF, & PUM,PVM,PTKEM, & - PEXNM,PTHM,PRM(:,:,1),ZTHLM,ZRTM,PSVM, & + PTHM,PRM(:,:,1),ZTHLM,ZRTM,PSVM, & PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & PTHV_UP, PW_UP, PU_UP, PV_UP, ZSV_UP, & PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP,PEMF,PDETR,& diff --git a/src/mesonh/turb/turb.f90 b/src/common/turb/turb.F90 similarity index 70% rename from src/mesonh/turb/turb.f90 rename to src/common/turb/turb.F90 index 228241e2ce6e40965f1766ef2b8396210a08c4c9..5c0e60d3cf0f429bdaf89a8396f33f7c3eeb7379 100644 --- a/src/mesonh/turb/turb.f90 +++ b/src/common/turb/turb.F90 @@ -3,150 +3,26 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -! ################ - MODULE MODI_TURB -! ################ -! -INTERFACE -! - SUBROUTINE TURB(KKA, KKU, KKL, KMI,KRR,KRRL,KRRI,HLBCX,HLBCY, & - KSPLIT,KMODEL_CL, & - OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01, & - HTURBDIM,HTURBLEN,HTOM,HTURBLEN_CL,HCLOUD,PIMPL, & - PTSTEP,TPFILE,PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & - PDIRCOSXW,PDIRCOSYW,PDIRCOSZW,PCOSSLOPE,PSINSLOPE, & - PRHODJ,PTHVREF, & - PSFTH,PSFRV,PSFSV,PSFU,PSFV, & - PPABST,PUT,PVT,PWT,PTKET,PSVT,PSRCT, & - PBL_DEPTH, PSBL_DEPTH, & - PCEI,PCEI_MIN,PCEI_MAX,PCOEF_AMPL_SAT, & - PTHLT,PRT, & - PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS,PRTKES,PRTKEMS,PSIGS,& - PFLXZTHVMF,PWTH,PWRC,PWSV,PDYP,PTHP,PTR,PDISS,PLEM ) - -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR -INTEGER, INTENT(IN) :: KMI ! model index number -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. -CHARACTER(LEN=*),DIMENSION(:),INTENT(IN):: HLBCX, HLBCY ! X- and Y-direc LBC -INTEGER, INTENT(IN) :: KSPLIT ! number of time-splitting -INTEGER, INTENT(IN) :: KMODEL_CL ! model number for cloud mixing length -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some - ! diagnostic fields in the syncronous FM-file -LOGICAL, INTENT(IN) :: OSUBG_COND ! switch for SUBGrid - ! CONDensation -LOGICAL, INTENT(IN) :: ORMC01 ! switch for RMC01 lengths in SBL -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -CHARACTER(len=4), INTENT(IN) :: HTURBLEN ! kind of mixing length -CHARACTER(len=4), INTENT(IN) :: HTOM ! kind of Third Order Moment -CHARACTER(len=4), INTENT(IN) :: HTURBLEN_CL ! kind of cloud mixing length - ! surface friction flux -REAL, INTENT(IN) :: PIMPL ! degree of implicitness -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme -REAL, INTENT(IN) :: PTSTEP ! timestep -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! physical distance -! between 2 succesive grid points along the K direction -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSXW, PDIRCOSYW, PDIRCOSZW -! Director Cosinus along x, y and z directions at surface w-point -REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential - ! Temperature of the reference state -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV, & -! normal surface fluxes of theta and Rv - PSFU,PSFV -! normal surface fluxes of (u,v) parallel to the orography -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSV -! normal surface fluxes of Scalar var. -! -! prognostic variables at t- deltat -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Pressure at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT,PVT,PWT ! wind components -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! TKE -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! passive scal. var. -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCT ! Second-order flux - ! s'rc'/2Sigma_s2 at time t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:), INTENT(INOUT) :: PBL_DEPTH ! BL depth for TOMS -REAL, DIMENSION(:,:), INTENT(INOUT) :: PSBL_DEPTH ! SBL depth for RMC01 -! -! -! variables for cloud mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCEI ! Cloud Entrainment instability - ! index to emphasize localy - ! turbulent fluxes -REAL, INTENT(IN) :: PCEI_MIN ! minimum threshold for the instability index CEI -REAL, INTENT(IN) :: PCEI_MAX ! maximum threshold for the instability index CEI -REAL, INTENT(IN) :: PCOEF_AMPL_SAT ! saturation of the amplification coefficient -! thermodynamical variables which are transformed in conservative var. -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHLT ! conservative pot. temp. -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT ! water var. where - ! PRT(:,:,:,1) is the conservative mixing ratio -! -! sources of momentum, conservative potential temperature, Turb. Kin. Energy, -! TKE dissipation -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS,PRVS,PRWS,PRTHLS,PRTKES -! Source terms for all water kinds, PRRS(:,:,:,1) is used for the conservative -! mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRTKEMS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS -! Source terms for all passive scalar variables -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS -! Sigma_s at time t+1 : square root of the variance of the deviation to the -! saturation -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXZTHVMF -! MF contribution for vert. turb. transport -! used in the buoy. prod. of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux -REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDYP ! Dynamical production of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHP ! Thermal production of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTR ! Transport production of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDISS ! Dissipation of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLEM ! Mixing length - -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE TURB -! -END INTERFACE -! -END MODULE MODI_TURB -! -! ################################################################# - SUBROUTINE TURB(KKA, KKU, KKL, KMI,KRR,KRRL,KRRI,HLBCX,HLBCY, & - KSPLIT,KMODEL_CL, & - OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01, & - HTURBDIM,HTURBLEN,HTOM,HTURBLEN_CL,HCLOUD,PIMPL, & - PTSTEP,TPFILE,PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & - PDIRCOSXW,PDIRCOSYW,PDIRCOSZW,PCOSSLOPE,PSINSLOPE, & - PRHODJ,PTHVREF, & - PSFTH,PSFRV,PSFSV,PSFU,PSFV, & - PPABST,PUT,PVT,PWT,PTKET,PSVT,PSRCT, & - PBL_DEPTH, PSBL_DEPTH, & - PCEI,PCEI_MIN,PCEI_MAX,PCOEF_AMPL_SAT, & - PTHLT,PRT, & - PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS,PRTKES,PRTKEMS,PSIGS,& - PFLXZTHVMF,PWTH,PWRC,PWSV,PDYP,PTHP,PTR,PDISS,PLEM ) + SUBROUTINE TURB(KKA,KKU,KKL,KMI,KRR,KRRL,KRRI,HLBCX,HLBCY, & + & KSPLIT,KMODEL_CL, & + & OTURB_FLX,OTURB_DIAG,OSUBG_COND,ORMC01,OOCEAN, & + & HTURBDIM,HTURBLEN,HTOM,HTURBLEN_CL,HCLOUD,PIMPL, & + & PTSTEP,TPFILE,PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & + & PDIRCOSXW,PDIRCOSYW,PDIRCOSZW,PCOSSLOPE,PSINSLOPE, & + & PRHODJ,PTHVREF, & + & PSFTH,PSFRV,PSFSV,PSFU,PSFV, & + & PPABST,PUT,PVT,PWT,PTKET,PSVT,PSRCT, & + & PLENGTHM,PLENGTHH,MFMOIST, & + & PBL_DEPTH,PSBL_DEPTH, & + & PCEI,PCEI_MIN,PCEI_MAX,PCOEF_AMPL_SAT, & + & PTHLT,PRT, & + & PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS,PRTKES, & + & PSIGS, & + & PFLXZTHVMF,PWTH,PWRC,PWSV,PDP,PTP,PTDIFF,PTDISS, & + & TBUDGETS, KBUDGETS, & + & PEDR,PLEM,PRTKEMS,PTPMF, & + & PDRUS_TURB,PDRVS_TURB, & + & PDRTHLS_TURB,PDRRTS_TURB,PDRSVS_TURB ) ! ################################################################# ! ! @@ -230,7 +106,7 @@ END MODULE MODI_TURB !! IMPLICIT ARGUMENTS !! ------------------ !! -!! MODD_PARAMETERS : JPVEXT number of marginal vertical points +!! MODD_PARAMETERS : JPVEXT_TURB number of marginal vertical points !! !! MODD_CONF : CCONF model configuration (start/restart) !! L1D switch for 1D model version @@ -335,6 +211,9 @@ END MODULE MODI_TURB !! vertical levels !! 10/2012 (J. Colin) Correct bug in DearDoff for dry simulations !! 10/2012 J.Escobar Bypass PGI bug , redefine some allocatable array inplace of automatic +!! 2014-11 Y. Seity, add output terms for TKE DDHs budgets +!! July 2015 (Wim de Rooy) modifications to run with RACMO +!! turbulence (LHARAT=TRUE) !! 04/2016 (C.Lac) correction of negativity for KHKO ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! Q. Rodier 01/2018: introduction of RM17 @@ -351,49 +230,46 @@ END MODULE MODI_TURB !* 0. DECLARATIONS ! ------------ ! -use modd_budget, only: lbudget_u, lbudget_v, lbudget_w, lbudget_th, lbudget_rv, lbudget_rc, & - lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv, & - NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, & - NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & - tbudgets -USE MODD_CONF +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! +USE MODD_PARAMETERS, ONLY: JPVEXT_TURB USE MODD_CST USE MODD_CTURB -USE MODD_DYN_n, ONLY : LOCEAN -use modd_field, only: tfielddata, TYPEREAL +USE MODD_CONF +USE MODD_BUDGET, ONLY: LBUDGET_U, LBUDGET_V, LBUDGET_W, LBUDGET_TH, LBUDGET_RV, LBUDGET_RC, & + LBUDGET_RR, LBUDGET_RI, LBUDGET_RS, LBUDGET_RG, LBUDGET_RH, LBUDGET_SV, & + NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, & + NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & + TBUDGETDATA +USE MODD_FIELD, ONLY: TFIELDDATA,TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LES -USE MODD_NSV -USE MODD_PARAMETERS, ONLY: JPVEXT_TURB -USE MODD_PARAM_LIMA USE MODD_TURB_n, ONLY: XCADAP +USE MODD_NSV ! +USE MODE_BL89, ONLY: BL89 +USE MODE_TURB_VER, ONLY : TURB_VER +USE MODE_ROTATE_WIND, ONLY: ROTATE_WIND +USE MODE_TURB_HOR_SPLT, ONLY: TURB_HOR_SPLT +USE MODE_TKE_EPS_SOURCES, ONLY: TKE_EPS_SOURCES +USE MODI_SHUMAN, ONLY : MZF, MXF, MYF USE MODI_GRADIENT_M USE MODI_GRADIENT_U USE MODI_GRADIENT_V -USE MODI_BL89 -USE MODI_TURB_VER -USE MODI_ROTATE_WIND -USE MODI_TURB_HOR_SPLT -USE MODI_TKE_EPS_SOURCES -USE MODI_SHUMAN -USE MODI_GRADIENT_M USE MODI_LES_MEAN_SUBGRID -USE MODI_RMC01 +USE MODE_RMC01, ONLY: RMC01 USE MODI_GRADIENT_W -USE MODI_TM06 -USE MODI_UPDATE_LM -USE MODI_GET_HALO +USE MODE_TM06, ONLY: TM06 +USE MODE_UPDATE_LM, ONLY: UPDATE_LM ! -use mode_budget, only: Budget_store_init, Budget_store_end -USE MODE_IO_FIELD_WRITE, only: IO_Field_write +USE MODE_BUDGET, ONLY: BUDGET_STORE_INIT, BUDGET_STORE_END +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE USE MODE_SBL -use mode_sources_neg_correct, only: Sources_neg_correct -! -USE MODI_EMOIST -USE MODI_ETHETA +USE MODE_SOURCES_NEG_CORRECT, ONLY: SOURCES_NEG_CORRECT ! -USE MODI_SECOND_MNH +USE MODE_EMOIST, ONLY: EMOIST +USE MODE_ETHETA, ONLY: ETHETA ! USE MODD_IBM_PARAM_n, ONLY: LIBM, XIBM_LS, XIBM_XMUT USE MODI_IBM_MIXINGLENGTH @@ -422,11 +298,12 @@ LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some LOGICAL, INTENT(IN) :: OSUBG_COND ! switch for SUBGrid ! CONDensation LOGICAL, INTENT(IN) :: ORMC01 ! switch for RMC01 lengths in SBL -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +CHARACTER(LEN=4), INTENT(IN) :: HTURBDIM ! dimensionality of the ! turbulence scheme -CHARACTER(len=4), INTENT(IN) :: HTURBLEN ! kind of mixing length -CHARACTER(len=4), INTENT(IN) :: HTOM ! kind of Third Order Moment -CHARACTER(len=4), INTENT(IN) :: HTURBLEN_CL ! kind of cloud mixing length +CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN ! kind of mixing length +CHARACTER(LEN=4), INTENT(IN) :: HTOM ! kind of Third Order Moment +CHARACTER(LEN=4), INTENT(IN) :: HTURBLEN_CL ! kind of cloud mixing length REAL, INTENT(IN) :: PIMPL ! degree of implicitness CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme REAL, INTENT(IN) :: PTSTEP ! timestep @@ -443,6 +320,7 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle ! between i and the slope vector REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(:,:,:), INTENT(IN) :: MFMOIST ! moist mass flux dual scheme REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential ! Temperature of the reference state ! @@ -481,47 +359,63 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRT ! water var. where REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS,PRVS,PRWS,PRTHLS,PRTKES ! Source terms for all water kinds, PRRS(:,:,:,1) is used for the conservative ! mixing ratio -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRTKEMS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS +REAL, DIMENSION(:,:,:), INTENT(IN),OPTIONAL :: PRTKEMS +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS ! Source terms for all passive scalar variables REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Sigma_s at time t+1 : square root of the variance of the deviation to the ! saturation REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS +REAL, DIMENSION(:,:,:), INTENT(OUT),OPTIONAL :: PDRUS_TURB ! evolution of rhoJ*U by turbulence only +REAL, DIMENSION(:,:,:), INTENT(OUT),OPTIONAL :: PDRVS_TURB ! evolution of rhoJ*V by turbulence only +REAL, DIMENSION(:,:,:), INTENT(OUT),OPTIONAL :: PDRTHLS_TURB ! evolution of rhoJ*thl by turbulence only +REAL, DIMENSION(:,:,:), INTENT(OUT),OPTIONAL :: PDRRTS_TURB ! evolution of rhoJ*rt by turbulence only +REAL, DIMENSION(:,:,:,:), INTENT(OUT),OPTIONAL :: PDRSVS_TURB ! evolution of rhoJ*Sv by turbulence only REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLXZTHVMF ! MF contribution for vert. turb. transport ! used in the buoy. prod. of TKE REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDYP ! Dynamical production of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTHP ! Thermal production of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTR ! Transport production of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDISS ! Dissipation of TKE -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLEM ! Mixing length +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTP ! Thermal TKE production + ! MassFlux + turb +REAL, DIMENSION(:,:,:), INTENT(OUT),OPTIONAL :: PTPMF ! Thermal TKE production + ! MassFlux Only +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP ! Dynamic TKE production +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDIFF ! Diffusion TKE term +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTDISS ! Dissipation TKE term +! +TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS +! +! length scale from vdfexcu +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLENGTHM, PLENGTHH +! +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PEDR ! EDR +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PLEM ! Mixing length ! ! !------------------------------------------------------------------------------- ! ! 0.2 declaration of local variables ! -REAL, ALLOCATABLE, DIMENSION(:,:,:) ::& +REAL, DIMENSION(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) :: & ZCP, & ! Cp at t-1 ZEXN, & ! EXN at t-1 ZT, & ! T at t-1 ZLOCPEXNM, & ! Lv/Cp/EXNREF at t-1 - ZLMW, & ! Turbulent mixing length (work array) + ZLM,ZLMW, & ! Turbulent mixing length (+ work array) ZLEPS, & ! Dissipative length - ZTRH, & ! Dynamic and Thermal Production of TKE + ZTRH, & ! ZATHETA,ZAMOIST, & ! coefficients for s = f (Thetal,Rnp) ZCOEF_DISS, & ! 1/(Cph*Exner) for dissipative heating ZFRAC_ICE, & ! ri fraction of rc+ri ZMWTH,ZMWR,ZMTH2,ZMR2,ZMTHR,& ! 3rd order moments ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,& ! opposite of verticale derivate of 3rd order moments - ZTHLM, ZTR, ZDISS ! initial potential temp. -REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: & + ZTHLM,ZRTKEMS ! initial potential temp; TKE advective source +REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)) :: & ZRM ! initial mixing ratio -REAL, ALLOCATABLE, DIMENSION(:,:) :: ZTAU11M,ZTAU12M, & +REAL, DIMENSION(SIZE(PTHLT,1),SIZE(PTHLT,2)) :: ZTAU11M,ZTAU12M, & ZTAU22M,ZTAU33M, & ! tangential surface fluxes in the axes following the orography ZUSLOPE,ZVSLOPE, & @@ -555,58 +449,25 @@ REAL :: ZALPHA ! work coefficient : ! ! BL89 mixing length near the surface ! REAL :: ZTIME1, ZTIME2 -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZTT,ZEXNE,ZLV,ZLS,ZCPH,ZCOR REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZSHEAR, ZDUDZ, ZDVDZ TYPE(TFIELDDATA) :: TZFIELD ! -!------------------------------------------------------------------------------------------ -ALLOCATE ( & - ZCP(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZEXN(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZT(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZLOCPEXNM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZLMW(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZLEPS(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZTRH(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZATHETA(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZAMOIST(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZCOEF_DISS(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZFRAC_ICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZMWTH(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZMWR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZMTH2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZMR2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZMTHR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZFWTH(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZFWR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZFTH2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZFR2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZFTHR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZTHLM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) - -ALLOCATE ( ZRM(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)) ) - -ALLOCATE ( & - ZTAU11M(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZTAU12M(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZTAU22M(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZTAU33M(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZUSLOPE(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZVSLOPE(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZCDUEFF(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZUSTAR(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZLMO(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZRVM(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZSFRV(SIZE(PTHLT,1),SIZE(PTHLT,2)) ) - -!------------------------------------------------------------------------------------------ -! !* 1.PRELIMINARIES ! ------------- ! !* 1.1 Set the internal domains, ZEXPL ! ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('TURB',0,ZHOOK_HANDLE) +! +IF (LHARAT .AND. HTURBDIM /= '1DIM') THEN + CALL ABOR1('LHARATU only implemented for option HTURBDIM=1DIM!') +ENDIF +IF (LHARAT .AND. LLES_CALL) THEN + CALL ABOR1('LHARATU not implemented for option LLES_CALL') +ENDIF + IKT=SIZE(PTHLT,3) IKTB=1+JPVEXT_TURB IKTE=IKT-JPVEXT_TURB @@ -645,7 +506,7 @@ END DO ! !* 2.2 Exner function at t ! -IF (LOCEAN) THEN +IF (OOCEAN) THEN ZEXN(:,:,:) = 1. ELSE ZEXN(:,:,:) = (PPABST(:,:,:)/XP00) ** (XRD/XCPD) @@ -698,7 +559,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' @@ -709,7 +570,7 @@ IF (KRRL >=1) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZATHETA) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZATHETA) ! TZFIELD%CMNHNAME = 'AMOIST' TZFIELD%CSTDNAME = '' @@ -721,7 +582,7 @@ IF (KRRL >=1) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZAMOIST) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZAMOIST) END IF ! ELSE @@ -750,12 +611,22 @@ IF ( KRRL >= 1 ) THEN END IF END IF ! +!* stores value of conservative variables & wind before turbulence tendency (AROME diag) +IF(PRESENT(PDRUS_TURB)) THEN + PDRUS_TURB = PRUS + PDRVS_TURB = PRVS + PDRTHLS_TURB = PRTHLS + PDRRTS_TURB = PRRS(:,:,:,1) + PDRSVS_TURB = PRSVS +END IF !---------------------------------------------------------------------------- ! !* 3. MIXING LENGTH : SELECTION AND COMPUTATION ! ----------------------------------------- ! ! +IF (.NOT. LHARAT) THEN + SELECT CASE (HTURBLEN) ! !* 3.1 BL89 mixing length @@ -763,25 +634,25 @@ SELECT CASE (HTURBLEN) CASE ('BL89') ZSHEAR=0. - CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,PLEM) + CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN) ! !* 3.2 RM17 mixing length ! ------------------ CASE ('RM17') - ZDUDZ = MXF(MZF(GZ_U_UW(PUT,PDZZ))) - ZDVDZ = MYF(MZF(GZ_V_VW(PVT,PDZZ))) + ZDUDZ = MXF(MZF(GZ_U_UW(PUT,PDZZ,KKA,KKU,KKL),KKA,KKU,KKL)) + ZDVDZ = MYF(MZF(GZ_V_VW(PVT,PDZZ,KKA,KKU,KKL),KKA,KKU,KKL)) ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) - CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,PLEM) + CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN) ! !* 3.3 Grey-zone combined RM17 & Deardorff mixing lengths ! -------------------------------------------------- CASE ('ADAP') - ZDUDZ = MXF(MZF(GZ_U_UW(PUT,PDZZ))) - ZDVDZ = MYF(MZF(GZ_V_VW(PVT,PDZZ))) + ZDUDZ = MXF(MZF(GZ_U_UW(PUT,PDZZ,KKA,KKU,KKL),KKA,KKU,KKL)) + ZDVDZ = MYF(MZF(GZ_V_VW(PVT,PDZZ,KKA,KKU,KKL),KKA,KKU,KKL)) ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) - CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,PLEM) + CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM,OOCEAN) CALL DELT(ZLMW,ODZ=.FALSE.) ! The minimum mixing length is chosen between Horizontal grid mesh (not taking into account the vertical grid mesh) and RM17. @@ -789,53 +660,56 @@ SELECT CASE (HTURBLEN) ! For LES grid meshes, this is equivalent to Deardorff : the base mixing lentgh is the horizontal grid mesh, ! and it is limited by a stability-based length (RM17), as was done in Deardorff length (but taking into account shear as well) ! For grid meshes in the grey zone, then this is the smaller of the two. - PLEM = MIN(PLEM,XCADAP*ZLMW) + ZLM = MIN(ZLM,XCADAP*ZLMW) ! !* 3.4 Delta mixing length ! ------------------- ! CASE ('DELT') - CALL DELT(PLEM,ODZ=.TRUE.) + CALL DELT(ZLM,ODZ=.TRUE.) ! !* 3.5 Deardorff mixing length ! ----------------------- ! CASE ('DEAR') - CALL DEAR(PLEM) + CALL DEAR(ZLM) ! !* 3.6 Blackadar mixing length ! ----------------------- ! CASE ('BLKR') ZL0 = 100. - PLEM(:,:,:) = ZL0 + ZLM(:,:,:) = ZL0 ZALPHA=0.5**(-1.5) ! DO JK=IKTB,IKTE - PLEM(:,:,JK) = ( 0.5*(PZZ(:,:,JK)+PZZ(:,:,JK+KKL)) - & + ZLM(:,:,JK) = ( 0.5*(PZZ(:,:,JK)+PZZ(:,:,JK+KKL)) - & & PZZ(:,:,KKA+JPVEXT_TURB*KKL) ) * PDIRCOSZW(:,:) - PLEM(:,:,JK) = ZALPHA * PLEM(:,:,JK) * ZL0 / ( ZL0 + ZALPHA*PLEM(:,:,JK) ) + ZLM(:,:,JK) = ZALPHA * ZLM(:,:,JK) * ZL0 / ( ZL0 + ZALPHA*ZLM(:,:,JK) ) END DO ! - PLEM(:,:,IKTB-1) = PLEM(:,:,IKTB) - PLEM(:,:,IKTE+1) = PLEM(:,:,IKTE) + ZLM(:,:,IKTB-1) = ZLM(:,:,IKTB) + ZLM(:,:,IKTE+1) = ZLM(:,:,IKTE) ! ! ! END SELECT ! -! -! !* 3.5 Mixing length modification for cloud ! ----------------------- IF (KMODEL_CL==KMI .AND. HTURBLEN_CL/='NONE') CALL CLOUD_MODIF_LM +ENDIF ! end LHARRAT ! !* 3.6 Dissipative length ! ------------------ -! -ZLEPS(:,:,:)=PLEM(:,:,:) + +IF (LHARAT) THEN + ZLEPS=PLENGTHM*(3.75**2.) +ELSE + ZLEPS=ZLM +ENDIF ! !* 3.7 Correction in the Surface Boundary Layer (Redelsperger 2001) ! ---------------------------------------- @@ -850,7 +724,7 @@ IF (ORMC01) THEN ZSFRV=0. ZLMO=LMO(ZUSTAR,ZTHLM(:,:,IKB),ZRVM,PSFTH,ZSFRV) END IF - CALL RMC01(HTURBLEN,KKA,KKU,KKL,PZZ,PDXX,PDYY,PDZZ,PDIRCOSZW,PSBL_DEPTH,ZLMO,PLEM,ZLEPS) + CALL RMC01(HTURBLEN,KKA,KKU,KKL,PZZ,PDXX,PDYY,PDZZ,PDIRCOSZW,PSBL_DEPTH,ZLMO,ZLM,ZLEPS) END IF ! !RMC01 is only applied on RM17 in ADAP @@ -860,14 +734,14 @@ IF (HTURBLEN=='ADAP') ZLEPS = MIN(ZLEPS,ZLMW*XCADAP) ! ---------------------------------------------------------- ! IF (HTURBDIM=="3DIM") THEN - CALL UPDATE_LM(HLBCX,HLBCY,PLEM,ZLEPS) + CALL UPDATE_LM(HLBCX,HLBCY,ZLM,ZLEPS) END IF ! !* 3.9 Mixing length correction if immersed walls ! ------------------------------------------ ! IF (LIBM) THEN - CALL IBM_MIXINGLENGTH(PLEM,ZLEPS,XIBM_XMUT,XIBM_LS(:,:,:,1),PTKET) + CALL IBM_MIXINGLENGTH(ZLM,ZLEPS,XIBM_XMUT,XIBM_LS(:,:,:,1),PTKET) ENDIF !---------------------------------------------------------------------------- ! @@ -879,24 +753,28 @@ ENDIF ! ! ! - IF (CPROGRAM/='AROME ') THEN - CALL ROTATE_WIND(PUT,PVT,PWT, & +IF (CPROGRAM/='AROME ') THEN + CALL ROTATE_WIND(PUT,PVT,PWT, & PDIRCOSXW, PDIRCOSYW, PDIRCOSZW, & PCOSSLOPE,PSINSLOPE, & PDXX,PDYY,PDZZ, & ZUSLOPE,ZVSLOPE ) ! - CALL UPDATE_ROTATE_WIND(ZUSLOPE,ZVSLOPE) - ELSE - ZUSLOPE=PUT(:,:,KKA) - ZVSLOPE=PVT(:,:,KKA) - END IF + CALL UPDATE_ROTATE_WIND(ZUSLOPE,ZVSLOPE) +ELSE + ZUSLOPE=PUT(:,:,KKA) + ZVSLOPE=PVT(:,:,KKA) +END IF ! ! !* 4.2 compute the proportionality coefficient between wind and stress ! - ZCDUEFF(:,:) =-SQRT ( (PSFU(:,:)**2 + PSFV(:,:)**2) / & - (XMNH_TINY + ZUSLOPE(:,:)**2 + ZVSLOPE(:,:)**2 ) ) +ZCDUEFF(:,:) =-SQRT ( (PSFU(:,:)**2 + PSFV(:,:)**2) / & +#ifdef REPRO48 + (1.E-60 + ZUSLOPE(:,:)**2 + ZVSLOPE(:,:)**2 ) ) +#else + (XMNH_TINY + ZUSLOPE(:,:)**2 + ZVSLOPE(:,:)**2 ) ) +#endif ! !* 4.6 compute the surface tangential fluxes ! @@ -954,42 +832,42 @@ ENDIF !* 5. TURBULENT SOURCES ! ----------------- ! -if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U ), 'VTURB', prus (:, :, :) ) -if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V ), 'VTURB', prvs (:, :, :) ) -if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W ), 'VTURB', prws (:, :, :) ) +IF( LBUDGET_U ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_U ), 'VTURB', PRUS(:, :, :) ) +IF( LBUDGET_V ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_V ), 'VTURB', PRVS(:, :, :) ) +IF( LBUDGET_W ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_W ), 'VTURB', PRWS(:, :, :) ) -if ( lbudget_th ) then - if ( krri >= 1 .and. krrl >= 1 ) then - call Budget_store_init( tbudgets(NBUDGET_TH), 'VTURB', prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) & - + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) ) - else if ( krrl >= 1 ) then - call Budget_store_init( tbudgets(NBUDGET_TH), 'VTURB', prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2) ) - else - call Budget_store_init( tbudgets(NBUDGET_TH), 'VTURB', prthls(:, :, :) ) - end if -end if +IF( LBUDGET_TH ) THEN + IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'VTURB', PRTHLS(:, :, :) + ZLVOCPEXNM(:, :, :) * PRRS(:, :, :, 2) & + + ZLSOCPEXNM(:, :, :) * PRRS(:, :, :, 4) ) + ELSE IF( KRRL >= 1 ) THEN + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'VTURB', PRTHLS(:, :, :) + ZLOCPEXNM(:, :, :) * PRRS(:, :, :, 2) ) + ELSE + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'VTURB', PRTHLS(:, :, :) ) + END IF +END IF -if ( lbudget_rv ) then - if ( krri >= 1 .and. krrl >= 1 ) then - call Budget_store_init( tbudgets(NBUDGET_RV), 'VTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4) ) - else if ( krrl >= 1 ) then - call Budget_store_init( tbudgets(NBUDGET_RV), 'VTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) ) - else - call Budget_store_init( tbudgets(NBUDGET_RV), 'VTURB', prrs(:, :, :, 1) ) - end if -end if +IF( LBUDGET_RV ) THEN + IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RV), 'VTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) - PRRS(:, :, :, 4) ) + ELSE IF( KRRL >= 1 ) THEN + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RV), 'VTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) ) + ELSE + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RV), 'VTURB', PRRS(:, :, :, 1) ) + END IF +END IF -if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'VTURB', prrs (:, :, :, 2) ) -if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'VTURB', prrs (:, :, :, 4) ) +IF( LBUDGET_RC ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RC), 'VTURB', PRRS (:, :, :, 2) ) +IF( LBUDGET_RI ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RI), 'VTURB', PRRS (:, :, :, 4) ) -if ( lbudget_sv ) then - do jsv = 1, nsv - call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv), 'VTURB', prsvs(:, :, :, jsv) ) - end do -end if +IF( LBUDGET_SV ) THEN + DO JSV = 1, NSV + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'VTURB', PRSVS(:, :, :, JSV) ) + END DO +END IF CALL TURB_VER(KKA,KKU,KKL,KRR, KRRL, KRRI, & - OTURB_FLX, & + OTURB_FLX, OOCEAN, & HTURBDIM,HTOM,PIMPL,ZEXPL, & PTSTEP,TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & @@ -998,84 +876,91 @@ CALL TURB_VER(KKA,KKU,KKL,KRR, KRRL, KRRI, & PSFTH,PSFRV,PSFSV,PSFTH,PSFRV,PSFSV, & ZCDUEFF,ZTAU11M,ZTAU12M,ZTAU33M, & PUT,PVT,PWT,ZUSLOPE,ZVSLOPE,PTHLT,PRT,PSVT, & - PTKET,PLEM,ZLEPS, & + PTKET,ZLM,PLENGTHM,PLENGTHH,ZLEPS,MFMOIST, & ZLOCPEXNM,ZATHETA,ZAMOIST,PSRCT,ZFRAC_ICE, & ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,PBL_DEPTH, & PSBL_DEPTH,ZLMO, & PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS, & - PDYP,PTHP,PSIGS,PWTH,PWRC,PWSV ) - -if ( lbudget_u ) call Budget_store_end( tbudgets(NBUDGET_U), 'VTURB', prus(:, :, :) ) -if ( lbudget_v ) call Budget_store_end( tbudgets(NBUDGET_V), 'VTURB', prvs(:, :, :) ) -if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W), 'VTURB', prws(:, :, :) ) + PDP,PTP,PSIGS,PWTH,PWRC,PWSV ) -if ( lbudget_th ) then - if ( krri >= 1 .and. krrl >= 1 ) then - call Budget_store_end( tbudgets(NBUDGET_TH), 'VTURB', prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) & - + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) ) - else if ( krrl >= 1 ) then - call Budget_store_end( tbudgets(NBUDGET_TH), 'VTURB', prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2) ) - else - call Budget_store_end( tbudgets(NBUDGET_TH), 'VTURB', prthls(:, :, :) ) - end if -end if +IF( LBUDGET_U ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_U), 'VTURB', PRUS(:, :, :) ) +IF( LBUDGET_V ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_V), 'VTURB', PRVS(:, :, :) ) +IF( LBUDGET_W ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_W), 'VTURB', PRWS(:, :, :) ) -if ( lbudget_rv ) then - if ( krri >= 1 .and. krrl >= 1 ) then - call Budget_store_end( tbudgets(NBUDGET_RV), 'VTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4) ) - else if ( krrl >= 1 ) then - call Budget_store_end( tbudgets(NBUDGET_RV), 'VTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) ) - else - call Budget_store_end( tbudgets(NBUDGET_RV), 'VTURB', prrs(:, :, :, 1) ) - end if -end if +IF( LBUDGET_TH ) THEN + IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'VTURB', PRTHLS(:, :, :) + ZLVOCPEXNM(:, :, :) * PRRS(:, :, :, 2) & + + ZLSOCPEXNM(:, :, :) * PRRS(:, :, :, 4) ) + ELSE IF( KRRL >= 1 ) THEN + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'VTURB', PRTHLS(:, :, :) + ZLOCPEXNM(:, :, :) * PRRS(:, :, :, 2) ) + ELSE + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'VTURB', PRTHLS(:, :, :) ) + END IF +END IF -if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'VTURB', prrs(:, :, :, 2) ) -if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'VTURB', prrs(:, :, :, 4) ) +IF( LBUDGET_RV ) THEN + IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RV), 'VTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) - PRRS(:, :, :, 4) ) + ELSE IF( KRRL >= 1 ) THEN + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RV), 'VTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) ) + ELSE + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RV), 'VTURB', PRRS(:, :, :, 1) ) + END IF +END IF -if ( lbudget_sv ) then - do jsv = 1, nsv - call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv), 'VTURB', prsvs(:, :, :, jsv) ) - end do -end if -! -if ( hturbdim == '3DIM' ) then - if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U ), 'HTURB', prus (:, :, :) ) - if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V ), 'HTURB', prvs (:, :, :) ) - if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W ), 'HTURB', prws (:, :, :) ) +IF( LBUDGET_RC ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RC), 'VTURB', PRRS(:, :, :, 2) ) +IF( LBUDGET_RI ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RI), 'VTURB', PRRS(:, :, :, 4) ) - if (lbudget_th) then - if ( krri >= 1 .and. krrl >= 1 ) then - call Budget_store_init( tbudgets(NBUDGET_TH), 'HTURB', prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) & - + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) ) - else if ( krrl >= 1 ) then - call Budget_store_init( tbudgets(NBUDGET_TH), 'HTURB', prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2) ) - else - call Budget_store_init( tbudgets(NBUDGET_TH), 'HTURB', prthls(:, :, :) ) - end if - end if +IF( LBUDGET_SV ) THEN + DO JSV = 1, NSV + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'VTURB', PRSVS(:, :, :, JSV) ) + END DO +END IF +! +!Les budgets des termes horizontaux de la turb sont présents dans AROME +! alors que ces termes ne sont pas calculés +#ifdef REPRO48 +#else +IF( HTURBDIM == '3DIM' ) THEN +#endif + IF( LBUDGET_U ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_U ), 'HTURB', PRUS (:, :, :) ) + IF( LBUDGET_V ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_V ), 'HTURB', PRVS (:, :, :) ) + IF( LBUDGET_W ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_W ), 'HTURB', PRWS (:, :, :) ) - if ( lbudget_rv ) then - if ( krri >= 1 .and. krrl >= 1 ) then - call Budget_store_init( tbudgets(NBUDGET_RV), 'HTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4) ) - else if ( krrl >= 1 ) then - call Budget_store_init( tbudgets(NBUDGET_RV), 'HTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) ) - else - call Budget_store_init( tbudgets(NBUDGET_RV), 'HTURB', prrs(:, :, :, 1) ) - end if - end if + IF(LBUDGET_TH) THEN + IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:, :, :) + ZLVOCPEXNM(:, :, :) * PRRS(:, :, :, 2) & + + ZLSOCPEXNM(:, :, :) * PRRS(:, :, :, 4) ) + ELSE IF( KRRL >= 1 ) THEN + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:, :, :) + ZLOCPEXNM(:, :, :) * PRRS(:, :, :, 2) ) + ELSE + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:, :, :) ) + END IF + END IF - if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'HTURB', prrs(:, :, :, 2) ) - if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'HTURB', prrs(:, :, :, 4) ) + IF( LBUDGET_RV ) THEN + IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) - PRRS(:, :, :, 4) ) + ELSE IF( KRRL >= 1 ) THEN + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) ) + ELSE + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:, :, :, 1) ) + END IF + END IF - if ( lbudget_sv ) then - do jsv = 1, nsv - call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv), 'HTURB', prsvs(:, :, :, jsv) ) - end do - end if + IF( LBUDGET_RC ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RC), 'HTURB', PRRS(:, :, :, 2) ) + IF( LBUDGET_RI ) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_RI), 'HTURB', PRRS(:, :, :, 4) ) + IF( LBUDGET_SV ) THEN + DO JSV = 1, NSV + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'HTURB', PRSVS(:, :, :, JSV) ) + END DO + END IF +!à supprimer une fois le précédent ifdef REPRO48 validé +#ifdef REPRO48 +#else CALL TURB_HOR_SPLT(KSPLIT, KRR, KRRL, KRRI, PTSTEP, & - HLBCX,HLBCY,OTURB_FLX,OSUBG_COND, & + HLBCX,HLBCY,OTURB_FLX,OSUBG_COND,OOCEAN, & TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PZZ, & PDIRCOSXW,PDIRCOSYW,PDIRCOSZW, & @@ -1084,46 +969,49 @@ if ( hturbdim == '3DIM' ) then PSFTH,PSFRV,PSFSV, & ZCDUEFF,ZTAU11M,ZTAU12M,ZTAU22M,ZTAU33M, & PUT,PVT,PWT,ZUSLOPE,ZVSLOPE,PTHLT,PRT,PSVT, & - PTKET,PLEM,ZLEPS, & + PTKET,ZLM,ZLEPS, & ZLOCPEXNM,ZATHETA,ZAMOIST,PSRCT,ZFRAC_ICE, & - PDYP,PTHP,PSIGS, & + PDP,PTP,PSIGS, & ZTRH, & PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS ) +#endif + IF( LBUDGET_U ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_U), 'HTURB', PRUS(:, :, :) ) + IF( LBUDGET_V ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_V), 'HTURB', PRVS(:, :, :) ) + IF( LBUDGET_W ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_W), 'HTURB', PRWS(:, :, :) ) - if ( lbudget_u ) call Budget_store_end( tbudgets(NBUDGET_U), 'HTURB', prus(:, :, :) ) - if ( lbudget_v ) call Budget_store_end( tbudgets(NBUDGET_V), 'HTURB', prvs(:, :, :) ) - if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W), 'HTURB', prws(:, :, :) ) - - if ( lbudget_th ) then - if ( krri >= 1 .and. krrl >= 1 ) then - call Budget_store_end( tbudgets(NBUDGET_TH), 'HTURB', prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) & - + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) ) - else if ( krrl >= 1 ) then - call Budget_store_end( tbudgets(NBUDGET_TH), 'HTURB', prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2) ) - else - call Budget_store_end( tbudgets(NBUDGET_TH), 'HTURB', prthls(:, :, :) ) - end if - end if + IF( LBUDGET_TH ) THEN + IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:, :, :) + ZLVOCPEXNM(:, :, :) * PRRS(:, :, :, 2) & + + ZLSOCPEXNM(:, :, :) * PRRS(:, :, :, 4) ) + ELSE IF( KRRL >= 1 ) THEN + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:, :, :) + ZLOCPEXNM(:, :, :) * PRRS(:, :, :, 2) ) + ELSE + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'HTURB', PRTHLS(:, :, :) ) + END IF + END IF - if ( lbudget_rv ) then - if ( krri >= 1 .and. krrl >= 1 ) then - call Budget_store_end( tbudgets(NBUDGET_RV), 'HTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4) ) - else if ( krrl >= 1 ) then - call Budget_store_end( tbudgets(NBUDGET_RV), 'HTURB', prrs(:, :, :, 1) - prrs(:, :, :, 2) ) - else - call Budget_store_end( tbudgets(NBUDGET_RV), 'HTURB', prrs(:, :, :, 1) ) - end if - end if + IF( LBUDGET_RV ) THEN + IF( KRRI >= 1 .AND. KRRL >= 1 ) THEN + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) - PRRS(:, :, :, 4) ) + ELSE IF( KRRL >= 1 ) THEN + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:, :, :, 1) - PRRS(:, :, :, 2) ) + ELSE + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RV), 'HTURB', PRRS(:, :, :, 1) ) + END IF + END IF - if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'HTURB', prrs(:, :, :, 2) ) - if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'HTURB', prrs(:, :, :, 4) ) + IF( LBUDGET_RC ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RC), 'HTURB', PRRS(:, :, :, 2) ) + IF( LBUDGET_RI ) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_RI), 'HTURB', PRRS(:, :, :, 4) ) - if ( lbudget_sv ) then - do jsv = 1, nsv - call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv), 'HTURB', prsvs(:, :, :, jsv) ) - end do - end if -end if + IF( LBUDGET_SV ) THEN + DO JSV = 1, NSV + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_SV1 - 1 + JSV), 'HTURB', PRSVS(:, :, :, JSV) ) + END DO + END IF +#ifdef REPRO48 +#else +END IF +#endif !---------------------------------------------------------------------------- ! !* 6. EVOLUTION OF THE TKE AND ITS DISSIPATION @@ -1132,23 +1020,56 @@ end if ! 6.1 Contribution of mass-flux in the TKE buoyancy production if ! cloud computation is not statistical - PTHP = PTHP + XG / PTHVREF * MZF( PFLXZTHVMF ) +PTP = PTP + XG / PTHVREF * MZF(PFLXZTHVMF,KKA, KKU, KKL) +IF(PRESENT(PTPMF)) PTPMF=XG / PTHVREF * MZF(PFLXZTHVMF, KKA, KKU, KKL) ! 6.2 TKE evolution equation -CALL TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKET,PLEM,ZLEPS,PDYP,ZTRH, & - PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & - PTSTEP,PIMPL,ZEXPL, & - HTURBLEN,HTURBDIM, & - TPFILE,OTURB_DIAG, & - PTHP,PRTKES,PRTKEMS,PRTHLS,ZCOEF_DISS,PTR,PDISS ) - +IF (.NOT. LHARAT) THEN +! +IF (LBUDGET_TH) THEN + IF ( KRRI >= 1 .AND. KRRL >= 1 ) THEN + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS+ ZLVOCPEXNM * PRRS(:,:,:,2) & + & + ZLSOCPEXNM * PRRS(:,:,:,4) ) + ELSE IF ( KRRL >= 1 ) THEN + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS+ ZLOCPEXNM * PRRS(:,:,:,2) ) + ELSE + CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS(:, :, :) ) + END IF +END IF +! +IF(PRESENT(PRTKEMS)) THEN + ZRTKEMS=PRTKEMS +ELSE + ZRTKEMS=0. +END IF +! +CALL TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKET,ZLM,ZLEPS,PDP,ZTRH, & + & PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ, & + & PTSTEP,PIMPL,ZEXPL, & + & HTURBLEN,HTURBDIM, & + & TPFILE,OTURB_DIAG, & + & PTP,PRTKES,PRTHLS,ZCOEF_DISS,PTDIFF,PTDISS,ZRTKEMS,& + & TBUDGETS,KBUDGETS, PEDR=PEDR) +IF (LBUDGET_TH) THEN + IF ( KRRI >= 1 .AND. KRRL >= 1 ) THEN + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS+ ZLVOCPEXNM * PRRS(:,:,:,2) & + & + ZLSOCPEXNM * PRRS(:,:,:,4) ) + ELSE IF ( KRRL >= 1 ) THEN + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS+ ZLOCPEXNM * PRRS(:,:,:,2) ) + ELSE + CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS(:, :, :) ) + END IF +END IF +! +ENDIF +! !---------------------------------------------------------------------------- ! !* 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 ! @@ -1162,7 +1083,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PLEM) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZLM) ! IF (KRR /= 0) THEN ! @@ -1178,7 +1099,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PTHLT) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,PTHLT) ! ! stores the conservative mixing ratio ! @@ -1192,10 +1113,18 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PRT(:,:,:,1)) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,PRT(:,:,:,1)) END IF END IF ! +!* stores value of conservative variables & wind before turbulence tendency (AROME only) +IF(PRESENT(PDRUS_TURB)) THEN + PDRUS_TURB = PRUS - PDRUS_TURB + PDRVS_TURB = PRVS - PDRVS_TURB + PDRTHLS_TURB = PRTHLS - PDRTHLS_TURB + PDRRTS_TURB = PRRS(:,:,:,1) - PDRRTS_TURB + PDRSVS_TURB = PRSVS - PDRSVS_TURB +END IF !---------------------------------------------------------------------------- ! !* 8. RETRIEVE NON-CONSERVATIVE VARIABLES @@ -1221,8 +1150,7 @@ IF ( KRRL >= 1 ) THEN END IF ! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets -call Sources_neg_correct( hcloud, 'NETUR', krr, ptstep, ppabst, pthlt, prt, prthls, prrs, prsvs ) - +CALL SOURCES_NEG_CORRECT(HCLOUD, 'NETUR',KRR,PTSTEP,PPABST,PTHLT,PRT,PRTHLS,PRRS,PRSVS) !---------------------------------------------------------------------------- ! !* 9. LES averaged surface fluxes @@ -1260,14 +1188,14 @@ IF (LLES_CALL) THEN CALL LES_MEAN_SUBGRID(2./3.*PTKET,X_LES_SUBGRID_U2) X_LES_SUBGRID_V2 = X_LES_SUBGRID_U2 X_LES_SUBGRID_W2 = X_LES_SUBGRID_U2 - CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(& - & GZ_M_W(KKA,KKU,KKL,PTHLT,PDZZ)),X_LES_RES_ddz_Thl_SBG_W2) + CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(GZ_M_W(KKA,KKU,KKL,PTHLT,PDZZ),& + KKA, KKU, KKL),X_LES_RES_ddz_Thl_SBG_W2) IF (KRR>=1) & - CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(& - & GZ_M_W(KKA,KKU,KKL,PRT(:,:,:,1),PDZZ)),X_LES_RES_ddz_Rt_SBG_W2) + CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(GZ_M_W(KKA,KKU,KKL,PRT(:,:,:,1),PDZZ),& + &KKA, KKU, KKL),X_LES_RES_ddz_Rt_SBG_W2) DO JSV=1,NSV - CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(& - & GZ_M_W(KKA,KKU,KKL,PSVT(:,:,:,JSV),PDZZ)),X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) + CALL LES_MEAN_SUBGRID(2./3.*PTKET*MZF(GZ_M_W(KKA,KKU,KKL,PSVT(:,:,:,JSV),PDZZ), & + &KKA, KKU, KKL), X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) END DO END IF @@ -1276,7 +1204,7 @@ IF (LLES_CALL) THEN !* 12. LES mixing end dissipative lengths, presso-correlations ! ------------------------------------------------------- ! - CALL LES_MEAN_SUBGRID(PLEM,X_LES_SUBGRID_LMix) + CALL LES_MEAN_SUBGRID(ZLM,X_LES_SUBGRID_LMix) CALL LES_MEAN_SUBGRID(ZLEPS,X_LES_SUBGRID_LDiss) ! !* presso-correlations for subgrid Tke are equal to zero. @@ -1287,12 +1215,11 @@ IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF - -! - ! +IF(PRESENT(PLEM)) PLEM = ZLM !---------------------------------------------------------------------------- ! +IF (LHOOK) CALL DR_HOOK('TURB',1,ZHOOK_HANDLE) CONTAINS ! ! @@ -1329,15 +1256,19 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PUSLOPE,PVSLOPE ! !* 0.2 Declarations of local variables : ! -INTEGER :: IIB,IIE,IJB,IJE ! index values for the physical subdomain +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) ! -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 ! @@ -1367,6 +1298,8 @@ IF( HLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN PVSLOPE(:,IJE+1)=PVSLOPE(:,IJE) END IF ! +IF (LHOOK) CALL DR_HOOK('TURB:UPDATE_ROTATE_WIND',1,ZHOOK_HANDLE) +! END SUBROUTINE UPDATE_ROTATE_WIND ! ! ######################################################################## @@ -1409,6 +1342,8 @@ REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZDRVSATDT ! !------------------------------------------------------------------------------- ! + REAL(KIND=JPRB) :: ZHOOK_HANDLE + IF (LHOOK) CALL DR_HOOK('TURB:COMPUTE_FUNCTION_THERMO',0,ZHOOK_HANDLE) ZEPS = XMV / XMD ! !* 1.1 Lv/Cph at t @@ -1450,6 +1385,7 @@ REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZDRVSATDT ! PLOCPEXN(:,:,:) = PLOCPEXN(:,:,:) / PEXN(:,:,:) ! +IF (LHOOK) CALL DR_HOOK('TURB:COMPUTE_FUNCTION_THERMO',1,ZHOOK_HANDLE) END SUBROUTINE COMPUTE_FUNCTION_THERMO ! ! #################### @@ -1483,6 +1419,8 @@ REAL :: ZD ! distance to the surface ! !------------------------------------------------------------------------------- ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('TURB:DELT',0,ZHOOK_HANDLE) IF (ODZ) THEN ! Dz is take into account in the computation DO JK = IKTB,IKTE ! 1D turbulence scheme @@ -1508,7 +1446,6 @@ ELSE END IF END IF END IF - ! ! mixing length limited by the distance normal to the surface ! (with the same factor as for BL89) @@ -1518,7 +1455,7 @@ IF (.NOT. ORMC01) THEN ! DO JJ=1,SIZE(PUT,2) DO JI=1,SIZE(PUT,1) - IF (LOCEAN) THEN + IF (OOCEAN) THEN DO JK=IKTE,IKTB,-1 ZD=ZALPHA*(PZZ(JI,JJ,IKTE+1)-PZZ(JI,JJ,JK)) IF ( PLM(JI,JJ,JK)>ZD) THEN @@ -1545,6 +1482,7 @@ END IF PLM(:,:,KKA) = PLM(:,:,IKB ) PLM(:,:,KKU ) = PLM(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('TURB:DELT',1,ZHOOK_HANDLE) END SUBROUTINE DELT ! ! #################### @@ -1588,6 +1526,8 @@ REAL, DIMENSION(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) :: & !------------------------------------------------------------------------------- ! ! initialize the mixing length with the mesh grid +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('TURB:DEAR',0,ZHOOK_HANDLE) ! 1D turbulence scheme PLM(:,:,IKTB:IKTE) = PZZ(:,:,IKTB+KKL:IKTE+KKL) - PZZ(:,:,IKTB:IKTE) PLM(:,:,KKU) = PLM(:,:,IKE) @@ -1601,8 +1541,8 @@ IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme END IF ! compute a mixing length limited by the stability ! -ZETHETA(:,:,:) = ETHETA(KRR,KRRI,PTHLT,PRT,ZLOCPEXNM,ZATHETA,PSRCT) -ZEMOIST(:,:,:) = EMOIST(KRR,KRRI,PTHLT,PRT,ZLOCPEXNM,ZAMOIST,PSRCT) +ZETHETA(:,:,:) = ETHETA(KRR,KRRI,PTHLT,PRT,ZLOCPEXNM,ZATHETA,PSRCT,OOCEAN) +ZEMOIST(:,:,:) = EMOIST(KRR,KRRI,PTHLT,PRT,ZLOCPEXNM,ZAMOIST,PSRCT,OOCEAN) ! IF (KRR>0) THEN DO JK = IKTB+1,IKTE-1 @@ -1612,7 +1552,7 @@ IF (KRR>0) THEN (PTHLT(JI,JJ,JK )-PTHLT(JI,JJ,JK-KKL))/PDZZ(JI,JJ,JK )) ZDRTDZ(JI,JJ,JK) = 0.5*((PRT(JI,JJ,JK+KKL,1)-PRT(JI,JJ,JK ,1))/PDZZ(JI,JJ,JK+KKL)+ & (PRT(JI,JJ,JK ,1)-PRT(JI,JJ,JK-KKL,1))/PDZZ(JI,JJ,JK )) - IF (LOCEAN) THEN + IF (OOCEAN) THEN ZVAR=XG*(XALPHAOC*ZDTHLDZ(JI,JJ,JK)-XBETAOC*ZDRTDZ(JI,JJ,JK)) ELSE ZVAR=XG/PTHVREF(JI,JJ,JK)* & @@ -1632,7 +1572,7 @@ ELSE! For dry atmos or unsalted ocean runs DO JI=1,SIZE(PUT,1) ZDTHLDZ(JI,JJ,JK)= 0.5*((PTHLT(JI,JJ,JK+KKL)-PTHLT(JI,JJ,JK ))/PDZZ(JI,JJ,JK+KKL)+ & (PTHLT(JI,JJ,JK )-PTHLT(JI,JJ,JK-KKL))/PDZZ(JI,JJ,JK )) - IF (LOCEAN) THEN + IF (OOCEAN) THEN ZVAR= XG*XALPHAOC*ZDTHLDZ(JI,JJ,JK) ELSE ZVAR= XG/PTHVREF(JI,JJ,JK)*ZETHETA(JI,JJ,JK)*ZDTHLDZ(JI,JJ,JK) @@ -1655,7 +1595,7 @@ ELSE ZDRTDZ(:,:,IKB)=0 ENDIF ! -IF (LOCEAN) THEN +IF (OOCEAN) THEN ZWORK2D(:,:)=XG*(XALPHAOC*ZDTHLDZ(:,:,IKB)-XBETAOC*ZDRTDZ(:,:,IKB)) ELSE ZWORK2D(:,:)=XG/PTHVREF(:,:,IKB)* & @@ -1673,7 +1613,7 @@ IF (.NOT. ORMC01) THEN ! DO JJ=1,SIZE(PUT,2) DO JI=1,SIZE(PUT,1) - IF (LOCEAN) THEN + IF (OOCEAN) THEN DO JK=IKTE,IKTB,-1 ZD=ZALPHA*(PZZ(JI,JJ,IKTE+1)-PZZ(JI,JJ,JK)) IF ( PLM(JI,JJ,JK)>ZD) THEN @@ -1701,6 +1641,7 @@ PLM(:,:,KKA) = PLM(:,:,IKB ) PLM(:,:,IKE ) = PLM(:,:,IKE-KKL) PLM(:,:,KKU ) = PLM(:,:,KKU-KKL) ! +IF (LHOOK) CALL DR_HOOK('TURB:DEAR',1,ZHOOK_HANDLE) END SUBROUTINE DEAR ! ! ######################### @@ -1768,6 +1709,8 @@ REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZLM_CLOUD !* 1. INITIALISATION ! -------------- ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('TURB:CLOUD_MODIF_LM',0,ZHOOK_HANDLE) ZPENTE = ( PCOEF_AMPL_SAT - 1. ) / ( PCEI_MAX - PCEI_MIN ) ZCOEF_AMPL_CEI_NUL = 1. - ZPENTE * PCEI_MIN ! @@ -1792,7 +1735,7 @@ WHERE ( PCEI(:,:,:) < PCEI_MAX .AND. & ! ------------------------------------------ ! IF (HTURBLEN_CL == HTURBLEN) THEN - ZLM_CLOUD(:,:,:) = PLEM(:,:,:) + ZLM_CLOUD(:,:,:) = ZLM(:,:,:) ELSE SELECT CASE (HTURBLEN_CL) ! @@ -1800,7 +1743,7 @@ ELSE ! ------------------ CASE ('BL89','RM17','ADAP') ZSHEAR=0. - CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM_CLOUD) + CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,ZLM_CLOUD,OOCEAN) ! !* 3.2 Delta mixing length ! ------------------- @@ -1819,7 +1762,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' @@ -1830,22 +1773,22 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PLEM) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZLM) ENDIF ! ! Amplification of the mixing length when the criteria are verified ! -WHERE (ZCOEF_AMPL(:,:,:) /= 1.) PLEM(:,:,:) = ZCOEF_AMPL(:,:,:)*ZLM_CLOUD(:,:,:) +WHERE (ZCOEF_AMPL(:,:,:) /= 1.) ZLM(:,:,:) = ZCOEF_AMPL(:,:,:)*ZLM_CLOUD(:,:,:) ! ! Cloud mixing length in the clouds at the points which do not verified the CEI ! -WHERE (PCEI(:,:,:) == -1.) PLEM(:,:,:) = ZLM_CLOUD(:,:,:) +WHERE (PCEI(:,:,:) == -1.) ZLM(:,:,:) = 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' @@ -1856,7 +1799,7 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZCOEF_AMPL) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZCOEF_AMPL) ! TZFIELD%CMNHNAME = 'LM_CLOUD' TZFIELD%CSTDNAME = '' @@ -1867,10 +1810,11 @@ IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN TZFIELD%NGRID = 1 TZFIELD%NTYPE = TYPEREAL TZFIELD%NDIMS = 3 - CALL IO_Field_write(TPFILE,TZFIELD,ZLM_CLOUD) + CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZLM_CLOUD) ! ENDIF ! +IF (LHOOK) CALL DR_HOOK('TURB:CLOUD_MODIF_LM',1,ZHOOK_HANDLE) END SUBROUTINE CLOUD_MODIF_LM ! END SUBROUTINE TURB diff --git a/src/mesonh/aux/gradient_m.f90 b/src/mesonh/aux/gradient_m.f90 new file mode 100644 index 0000000000000000000000000000000000000000..60e7ffa577571ed62fb3f0c88ed9d63cb843b42a --- /dev/null +++ b/src/mesonh/aux/gradient_m.f90 @@ -0,0 +1,754 @@ +!MNH_LIC Copyright 1994-2020 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 MODI_GRADIENT_M +! ###################### +! +INTERFACE +! +! +FUNCTION GX_M_M(PA,PDXX,PDZZ,PDZX,KKA,KKU,KL) RESULT(PGX_M_M) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME) +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME) +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_M_M ! result mass point +! +END FUNCTION GX_M_M +! +! +FUNCTION GY_M_M(PA,PDYY,PDZZ,PDZY,KKA,KKU,KL) RESULT(PGY_M_M) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME) +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME) +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_M_M ! result mass point +! +END FUNCTION GY_M_M +! +! +FUNCTION GZ_M_M(PA,PDZZ,KKA,KKU,KL) RESULT(PGZ_M_M) +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME) +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME) +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_M_M ! result mass point +! +END FUNCTION GZ_M_M +! + FUNCTION GX_M_U(KKA,KKU,KL,PY,PDXX,PDZZ,PDZX) RESULT(PGX_M_U) +! +IMPLICIT NONE +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGX_M_U ! result at flux + ! side +END FUNCTION GX_M_U +! +! + FUNCTION GY_M_V(KKA,KKU,KL,PY,PDYY,PDZZ,PDZY) RESULT(PGY_M_V) +! +IMPLICIT NONE +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY !d*yy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY !d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ !d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGY_M_V ! result at flux + ! side +END FUNCTION GY_M_V +! + FUNCTION GZ_M_W(KKA, KKU, KL,PY,PDZZ) RESULT(PGZ_M_W) +! +IMPLICIT NONE +! + ! Metric coefficient: +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ !d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGZ_M_W ! result at flux + ! side +! +END FUNCTION GZ_M_W +! +END INTERFACE +! +END MODULE MODI_GRADIENT_M +! +! +! +! ####################################################### + FUNCTION GX_M_M(PA,PDXX,PDZZ,PDZX,KKA,KKU,KL) RESULT(PGX_M_M) +! ####################################################### +! +!!**** *GX_M_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian X +!! direction for a variable placed at the +!! mass point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the X cartesian direction for a field PA placed at the +! mass point. The result is placed at the mass point. +! +! +! ( ______________z ) +! ( (___x ) ) +! 1 ( _x (d*zx dzm(PA) ) ) +! PGX_M_M = ---- (dxf(PA) - (------------)) ) +! ___x ( ( ) ) +! d*xx ( ( d*zz ) ) +! +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MXM,MXF,MZF : Shuman functions (mean operators) +!! DXF,DZF : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CONF : LFLAT +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/07/94 +!! 19/07/00 add the LFLAT switch (J. Stein) +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN +USE MODD_CONF, ONLY:LFLAT +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME) +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME) +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_M_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GX_M_M +! -------------------- +! +IF (.NOT. LFLAT) THEN + PGX_M_M(:,:,:)= (DXF(MXM(PA(:,:,:))) - & + MZF(MXF(PDZX)*DZM(PA(:,:,:)) & + /PDZZ(:,:,:)) ) /MXF(PDXX(:,:,:)) +ELSE + PGX_M_M(:,:,:)=DXF(MXM(PA(:,:,:))) / MXF(PDXX(:,:,:)) +END IF +! +!---------------------------------------------------------------------------- +! +END FUNCTION GX_M_M +! +! +! ####################################################### + FUNCTION GY_M_M(PA,PDYY,PDZZ,PDZY,KKA,KKU,KL) RESULT(PGY_M_M) +! ####################################################### +! +!!**** *GY_M_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian Y +!! direction for a variable placed at the +!! mass point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Y cartesian direction for a field PA placed at the +! mass point. The result is placed at the mass point. +! +! +! ( ______________z ) +! ( (___y ) ) +! 1 ( _y (d*zy dzm(PA) ) ) +! PGY_M_M = ---- (dyf(PA) - (------------)) ) +! ___y ( ( ) ) +! d*yy ( ( d*zz ) ) +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MYM,MYF,MZF : Shuman functions (mean operators) +!! DYF,DZF : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CONF : LFLAT +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/07/94 +!! 19/07/00 add the LFLAT switch (J. Stein) +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODD_CONF, ONLY:LFLAT +USE MODI_SHUMAN +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME) +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME) +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_M_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GY_M_M +! -------------------- +! +! +IF (.NOT. LFLAT) THEN + PGY_M_M(:,:,:)= (DYF(MYM(PA))-MZF(MYF(PDZY)*DZM(PA)& + /PDZZ) ) /MYF(PDYY) +ELSE + PGY_M_M(:,:,:)= DYF(MYM(PA))/MYF(PDYY) +ENDIF +! +!---------------------------------------------------------------------------- +! +END FUNCTION GY_M_M + +! +! +! +! ############################################# + FUNCTION GZ_M_M(PA,PDZZ) RESULT(PGZ_M_M) +! ############################################# +! +!!**** *GZ_M_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian Z +!! direction for a variable placed at the +!! mass point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Z cartesian direction for a field PA placed at the +! mass point. The result is placed at the mass point. +! +! _________z +! (dzm(PA)) +! PGZ_M_M = (------ ) +! ( d*zz ) +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MZF : Shuman functions (mean operators) +!! DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/07/94 +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the mass point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_M_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GZ_M_M +! -------------------- +! +PGZ_M_M(:,:,:)= MZF( DZM(PA(:,:,:))/PDZZ(:,:,:) ) +! +!---------------------------------------------------------------------------- +! +END FUNCTION GZ_M_M +! +! +! ################################################## + FUNCTION GX_M_U(KKA,KKU,KL,PY,PDXX,PDZZ,PDZX) RESULT(PGX_M_U) +! ################################################## +! +!!**** *GX_M_U * - Compute the gradient along x for a variable localized at +!! a mass point +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute a gradient along x +! direction for a field PY localized at a mass point. The result PGX_M_U +! is localized at a x-flux point (u point). +! +! ( ____________z ) +! ( ________x ) +! 1 ( dzm(PY) ) +! PGX_M_U = ---- (dxm(PY) - d*zx -------- ) +! d*xx ( d*zz ) +! +! +! +!!** METHOD +!! ------ +!! We employ the Shuman operators to compute the derivatives and the +!! averages. The metric coefficients PDXX,PDZX,PDZZ are dummy arguments. +!! +!! +!! EXTERNAL +!! -------- +!! FUNCTION DXM: compute a finite difference along the x direction for +!! a variable at a mass localization +!! FUNCTION DZM: compute a finite difference along the y direction for +!! a variable at a mass localization +!! FUNCTION MXM: compute an average in the x direction for a variable +!! at a mass localization +!! FUNCTION MZF: compute an average in the z direction for a variable +!! at a flux side +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CONF : LFLAT +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (function GX_M_U) +!! +!! +!! AUTHOR +!! ------ +!! P. Hereil and J. Stein * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification 16/03/95 change the order of the arguments +!! 19/07/00 add the LFLAT switch + inlining(J. Stein) +!! 20/08/00 optimization (J. Escobar) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_SHUMAN +USE MODD_CONF, ONLY:LFLAT +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and result +! ------------------------------------ +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! d*xx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! d*zx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGX_M_U ! result at flux + ! side +INTEGER IIU,IKU,JI,JK +! +INTEGER :: JJK,IJU +INTEGER :: JIJK,JIJKOR,JIJKEND +INTEGER :: JI_1JK, JIJK_1, JI_1JK_1, JIJKP1, JI_1JKP1 +! +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE GRADIENT ALONG X +! ----------------------------- +! +IIU=SIZE(PY,1) +IJU=SIZE(PY,2) +IKU=SIZE(PY,3) +IF (.NOT. LFLAT) THEN +! PGX_M_U = ( DXM(PY) - MZF ( MXM( DZM(PY) /PDZZ ) * PDZX ) )/PDXX +!! DO JK=1+JPVEXT_TURB,IKU-JPVEXT_TURB +!! DO JI=1+JPHEXT,IIU +!! PGX_M_U(JI,:,JK)= & +!! ( PY(JI,:,JK)-PY(JI-1,:,JK) & +!! -( (PY(JI,:,JK)-PY(JI,:,JK-1)) / PDZZ(JI,:,JK) & +!! +(PY(JI-1,:,JK)-PY(JI-1,:,JK-1)) / PDZZ(JI-1,:,JK) & +!! ) * PDZX(JI,:,JK)* 0.25 & +!! -( (PY(JI,:,JK+1)-PY(JI,:,JK)) / PDZZ(JI,:,JK+1) & +!! +(PY(JI-1,:,JK+1)-PY(JI-1,:,JK)) / PDZZ(JI-1,:,JK+1) & +!! ) * PDZX(JI,:,JK+1)* 0.25 & +!! ) / PDXX(JI,:,JK) +!! END DO +!! END DO + JIJKOR = 1 + JPHEXT + IIU*IJU*(JPVEXT_TURB+1 - 1) + JIJKEND = IIU*IJU*(IKU-JPVEXT_TURB) +!CDIR NODEP +!OCL NOVREC + DO JIJK=JIJKOR , JIJKEND +! indexation + JI_1JK = JIJK - 1 + JIJK_1 = JIJK - IIU*IJU*KL + JI_1JK_1 = JIJK - 1 - IIU*IJU*KL + JIJKP1 = JIJK + IIU*IJU*KL + JI_1JKP1 = JIJK - 1 + IIU*IJU*KL +! + PGX_M_U(JIJK,1,1)= & + ( PY(JIJK,1,1)-PY(JI_1JK,1,1) & + -( (PY(JIJK,1,1)-PY(JIJK_1,1,1)) / PDZZ(JIJK,1,1) & + +(PY(JI_1JK,1,1)-PY(JI_1JK_1,1,1)) / PDZZ(JI_1JK,1,1) & + ) * PDZX(JIJK,1,1)* 0.25 & + -( (PY(JIJKP1,1,1)-PY(JIJK,1,1)) / PDZZ(JIJKP1,1,1) & + +(PY(JI_1JKP1,1,1)-PY(JI_1JK,1,1)) / PDZZ(JI_1JKP1,1,1) & + ) * PDZX(JIJKP1,1,1)* 0.25 & + ) / PDXX(JIJK,1,1) + END DO + +! + DO JI=1+JPHEXT,IIU + PGX_M_U(JI,:,KKU)= ( PY(JI,:,KKU)-PY(JI-1,:,KKU) ) / PDXX(JI,:,KKU) + PGX_M_U(JI,:,KKA)= PGX_M_U(JI,:,KKU) ! -999. + END DO +ELSE +! PGX_M_U = DXM(PY) / PDXX + PGX_M_U(1+1:IIU,:,:) = ( PY(1+1:IIU,:,:)-PY(1:IIU-1,:,:) ) & ! +JPHEXT + / PDXX(1+1:IIU,:,:) +ENDIF +DO JI=1,JPHEXT + PGX_M_U(JI,:,:)=PGX_M_U(IIU-2*JPHEXT+JI,:,:) ! for reprod JPHEXT <> 1 +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION GX_M_U +! +! +! ################################################## + FUNCTION GY_M_V(KKA,KKU,KL,PY,PDYY,PDZZ,PDZY) RESULT(PGY_M_V) +! ################################################## +! +!!**** *GY_M_V * - Compute the gradient along y for a variable localized at +!! a mass point +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute a gradient along y +! direction for a field PY localized at a mass point. The result PGY_M_V +! is localized at a y-flux point (v point). +! +! ( ____________z ) +! ( ________y ) +! 1 ( dzm(PY) ) +! PGY_M_V = ---- (dym(PY) - d*zy -------- ) +! d*yy ( d*zz ) +! +! +! +! +!!** METHOD +!! ------ +!! We employ the Shuman operators to compute the derivatives and the +!! averages. The metric coefficients PDYY,PDZY,PDZZ are dummy arguments. +!! +!! +!! EXTERNAL +!! -------- +!! FUNCTION DYM: compute a finite difference along the y direction for +!! a variable at a mass localization +!! FUNCTION DZM: compute a finite difference along the y direction for +!! a variable at a mass localization +!! FUNCTION MYM: compute an average in the x direction for a variable +!! at a mass localization +!! FUNCTION MZF: compute an average in the z direction for a variable +!! at a flux side +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! MODD_CONF : LFLAT +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (function GY_M_V) +!! +!! +!! AUTHOR +!! ------ +!! P. Hereil and J. Stein * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification 16/03/95 change the order of the arguments +!! 19/07/00 add the LFLAT switch + inlining(J. Stein) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_SHUMAN +USE MODD_CONF, ONLY:LFLAT +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! ------------------------------------- +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY !d*yy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY !d*zy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ !d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGY_M_V ! result at flux + ! side +INTEGER IJU,IKU,JJ,JK +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE GRADIENT ALONG Y +! ---------------------------- +! +IJU=SIZE(PY,2) +IKU=SIZE(PY,3) +IF (.NOT. LFLAT) THEN +! PGY_M_V = ( DYM(PY) - MZF ( MYM( DZM(PY) /PDZZ ) * PDZY ) )/PDYY + DO JK=1+JPVEXT_TURB,IKU-JPVEXT_TURB + DO JJ=1+JPHEXT,IJU + PGY_M_V(:,JJ,JK)= & + ( PY(:,JJ,JK)-PY(:,JJ-1,JK) & + -( (PY(:,JJ,JK)-PY(:,JJ,JK-KL)) / PDZZ(:,JJ,JK) & + +(PY(:,JJ-1,JK)-PY(:,JJ-KL,JK-KL)) / PDZZ(:,JJ-1,JK) & + ) * PDZY(:,JJ,JK)* 0.25 & + -( (PY(:,JJ,JK+KL)-PY(:,JJ,JK)) / PDZZ(:,JJ,JK+KL) & + +(PY(:,JJ-1,JK+KL)-PY(:,JJ-1,JK)) / PDZZ(:,JJ-1,JK+KL) & + ) * PDZY(:,JJ,JK+KL)* 0.25 & + ) / PDYY(:,JJ,JK) + END DO + END DO +! + DO JJ=1+JPHEXT,IJU + PGY_M_V(:,JJ,KKU)= ( PY(:,JJ,KKU)-PY(:,JJ-1,KKU) ) / PDYY(:,JJ,KKU) + PGY_M_V(:,JJ,KKA)= PGY_M_V(:,JJ,KKU) ! -999. + END DO +ELSE +! PGY_M_V = DYM(PY)/PDYY + PGY_M_V(:,1+1:IJU,:) = ( PY(:,1+1:IJU,:)-PY(:,1:IJU-1,:) ) & ! +JPHEXT + / PDYY(:,1+1:IJU,:) +ENDIF +DO JJ=1,JPHEXT + PGY_M_V(:,JJ,:)=PGY_M_V(:,IJU-2*JPHEXT+JJ,:) +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION GY_M_V +! +! +! ######################################### + FUNCTION GZ_M_W(KKA,KKU,KL,PY,PDZZ) RESULT(PGZ_M_W) +! ######################################### +! +!!**** *GZ_M_W * - Compute the gradient along z direction for a +!! variable localized at a mass point +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute a gradient along x,y,z +! directions for a field PY localized at a mass point. The result PGZ_M_W +! is localized at a z-flux point (w point) +! +! +! dzm(PY) +! PGZ_M_W = ------- +! d*zz +! +!!** METHOD +!! ------ +!! We employ the Shuman operators to compute the derivatives and the +!! averages. The metric coefficients PDZZ are dummy arguments. +!! +!! +!! EXTERNAL +!! -------- +!! FUNCTION DZM : compute a finite difference along the z +!! direction for a variable at a mass localization +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODI_SHUMAN : interface for the Shuman functions +!! +!! REFERENCE +!! --------- +!! Book2 of documentation (function GZ_M_W) +!! +!! +!! AUTHOR +!! ------ +!! P. Hereil and J. Stein * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification 16/03/95 change the order of the arguments +!! 19/07/00 inlining(J. Stein) +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODI_SHUMAN +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments and results +! ------------------------------------- +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise + + ! Metric coefficient: +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ !d*zz +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PY ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PY,1),SIZE(PY,2),SIZE(PY,3)) :: PGZ_M_W ! result at flux + ! side +! +INTEGER :: IKT,IKTB,IKTE +!------------------------------------------------------------------------------- +! +!* 1. COMPUTE THE GRADIENT ALONG Z +! ----------------------------- +! +IKT=SIZE(PY,3) +IKTB=1+JPVEXT_TURB +IKTE=IKT-JPVEXT_TURB + +PGZ_M_W(:,:,IKTB:IKTE) = (PY(:,:,IKTB:IKTE)-PY(:,:,IKTB-KL:IKTE-KL)) & + / PDZZ(:,:,IKTB:IKTE) +PGZ_M_W(:,:,KKU)= (PY(:,:,KKU)-PY(:,:,KKU-KL)) & + / PDZZ(:,:,KKU) +PGZ_M_W(:,:,KKA)= PGZ_M_W(:,:,KKU) ! -999. +! +!------------------------------------------------------------------------------- +! +END FUNCTION GZ_M_W + diff --git a/src/mesonh/aux/gradient_u.f90 b/src/mesonh/aux/gradient_u.f90 new file mode 100644 index 0000000000000000000000000000000000000000..1b82a616a9d4fa55add91fa4b321b2b93f586bf9 --- /dev/null +++ b/src/mesonh/aux/gradient_u.f90 @@ -0,0 +1,334 @@ +!MNH_LIC Copyright 1994-2020 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 MODI_GRADIENT_U +! ###################### +! +INTERFACE +! +! +FUNCTION GX_U_M(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_U_M) +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_U_M ! result mass point +! +END FUNCTION GX_U_M +! +! +FUNCTION GY_U_UV(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_U_UV) +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_U_UV ! result UV point +! +END FUNCTION GY_U_UV +! +! +FUNCTION GZ_U_UW(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_U_UW) +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_U_UW ! result UW point +! +END FUNCTION GZ_U_UW +! +END INTERFACE +! +END MODULE MODI_GRADIENT_U +! +! +! +! +! ####################################################### + FUNCTION GX_U_M(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_U_M) +! ####################################################### +! +!!**** *GX_U_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian X +!! direction for a variable placed at the +!! U point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the X cartesian direction for a field PA placed at the +! U point. The result is placed at the mass point. +! +! +! ( ______________z ) +! ( (___________x ) ) +! 1 ( (d*zx dzm(PA) ) ) +! PGX_U_M = ---- (dxf(PA) - (------------)) ) +! ___x ( ( ) ) +! d*xx ( ( d*zz ) ) +! +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MXF,MZF : Shuman functions (mean operators) +!! DXF,DZF : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 19/07/94 +!! 18/10/00 (V.Masson) add LFLAT switch +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_U_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GX_U_M +! -------------------- +! +IF (.NOT. LFLAT) THEN + PGX_U_M(:,:,:)= ( DXF(PA) - & + MZF(MXF(PDZX*DZM(PA)) / PDZZ ) & + ) / MXF(PDXX) +ELSE + PGX_U_M(:,:,:)= DXF(PA) / MXF(PDXX) +END IF +! +!---------------------------------------------------------------------------- +! +END FUNCTION GX_U_M +! +! +! ######################################################### + FUNCTION GY_U_UV(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_U_UV) +! ######################################################### +! +!!**** *GY_U_UV* - Cartesian Gradient operator: +!! computes the gradient in the cartesian Y +!! direction for a variable placed at the +!! U point and the result is placed at +!! the UV vorticity point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Y cartesian direction for a field PA placed at the +! U point. The result is placed at the UV vorticity point. +! +! +! +! ( _________________z ) +! ( (___x _________y ) ) +! 1 ( (d*zy (dzm(PA))) ) ) +! PGY_U_UV= ---- (dym(PA) - ( (------ ) ) ) +! ___x ( ( ( ___x ) ) ) +! d*yy ( ( ( d*zz ) ) ) +! +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MXM,MYM,MZF : Shuman functions (mean operators) +!! DYM,DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/07/94 +!! 18/10/00 (V.Masson) add LFLAT switch +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_U_UV ! result UV point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GY_U_UV +! --------------------- +! +IF (.NOT. LFLAT) THEN + PGY_U_UV(:,:,:)= (DYM(PA)- MZF( MYM( DZM(PA)/& + MXM(PDZZ) ) *MXM(PDZY) ) ) / MXM(PDYY) +ELSE + PGY_U_UV(:,:,:)= DYM(PA) / MXM(PDYY) +END IF +! +!---------------------------------------------------------------------------- +! +END FUNCTION GY_U_UV +! +! +! ####################################################### + FUNCTION GZ_U_UW(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_U_UW) +! ####################################################### +! +!!**** *GZ_U_UW - Cartesian Gradient operator: +!! computes the gradient in the cartesian Z +!! direction for a variable placed at the +!! U point and the result is placed at +!! the UW vorticity point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Z cartesian direction for a field PA placed at the +! U point. The result is placed at the UW vorticity point. +! +! dzm(PA) +! PGZ_U_UW = ------ +! ____x +! d*zz +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MXM : Shuman functions (mean operators) +!! DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/07/94 +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_U_UW ! result UW point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GZ_U_UW +! --------------------- +! +PGZ_U_UW(:,:,:)= DZM(PA) / MXM(PDZZ) +! +!---------------------------------------------------------------------------- +! +END FUNCTION GZ_U_UW diff --git a/src/mesonh/aux/gradient_v.f90 b/src/mesonh/aux/gradient_v.f90 new file mode 100644 index 0000000000000000000000000000000000000000..2e976258486d0007a443b96f03861d61715dae0b --- /dev/null +++ b/src/mesonh/aux/gradient_v.f90 @@ -0,0 +1,333 @@ +!MNH_LIC Copyright 1994-2020 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 MODI_GRADIENT_V +! ###################### +! +INTERFACE +! +! +FUNCTION GY_V_M(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_V_M) +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_V_M ! result mass point +! +END FUNCTION GY_V_M +! +FUNCTION GX_V_UV(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_V_UV) +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_V_UV ! result UV point +! +END FUNCTION GX_V_UV +! +! +FUNCTION GZ_V_VW(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_V_VW) +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_V_VW ! result VW point +! +END FUNCTION GZ_V_VW +! +! +END INTERFACE +! +END MODULE MODI_GRADIENT_V +! +! +! +! ####################################################### + FUNCTION GY_V_M(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_V_M) +! ####################################################### +! +!!**** *GY_V_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian Y +!! direction for a variable placed at the +!! V point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Y cartesian direction for a field PA placed at the +! V point. The result is placed at the mass point. +! +! +! ( ______________z ) +! ( (___________y ) ) +! 1 ( (d*zy dzm(PA) ) ) +! PGY_V_M = ---- (dyf(PA) - (------------)) ) +! ___y ( ( ) ) +! d*yy ( ( d*zz ) ) +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MYF,MZF : Shuman functions (mean operators) +!! DYF,DZF : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 19/07/94 +!! 18/10/00 (V.Masson) add LFLAT switch +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_V_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GY_V_M +! -------------------- +! +IF (.NOT. LFLAT) THEN + PGY_V_M(:,:,:)= (DYF(PA) - & + MZF( MYF(PDZY*DZM(PA))/PDZZ ) & + ) / MYF(PDYY) +ELSE + PGY_V_M(:,:,:)= DYF(PA) / MYF(PDYY) +END IF +! +!---------------------------------------------------------------------------- +! +END FUNCTION GY_V_M +! +! +! ######################################################### + FUNCTION GX_V_UV(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_V_UV) +! ######################################################### +! +!!**** *GX_V_UV* - Cartesian Gradient operator: +!! computes the gradient in the cartesian X +!! direction for a variable placed at the +!! V point and the result is placed at +!! the UV vorticity point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the X cartesian direction for a field PA placed at the +! V point. The result is placed at the UV vorticity point. +! +! +! ( _________________z ) +! ( (___y _________x ) ) +! 1 ( (d*zx (dzm(PA))) ) ) +! PGX_V_UV= ---- (dxm(PA) - ( (------ ) ) ) +! ___y ( ( ( ___y ) ) ) +! d*xx ( ( ( d*zz ) ) ) +! +! +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MXM,MZF,MYM : Shuman functions (mean operators) +!! DXM,DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/07/94 +!! 18/10/00 (V.Masson) add LFLAT switch +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_V_UV ! result UV point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GX_V_UV +! --------------------- +! +IF (.NOT. LFLAT) THEN + PGX_V_UV(:,:,:)= ( DXM(PA)- MZF( MXM( DZM(PA)/& + MYM(PDZZ) ) *MYM(PDZX) ) ) / MYM(PDXX) +ELSE + PGX_V_UV(:,:,:)= DXM(PA) / MYM(PDXX) +END IF +! +!---------------------------------------------------------------------------- +! +END FUNCTION GX_V_UV +! +! +! ####################################################### + FUNCTION GZ_V_VW(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_V_VW) +! ####################################################### +! +!!**** *GZ_V_VW - Cartesian Gradient operator: +!! computes the gradient in the cartesian Z +!! direction for a variable placed at the +!! V point and the result is placed at +!! the VW vorticity point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Z cartesian direction for a field PA placed at the +! V point. The result is placed at the VW vorticity point. +! +! +! dzm(PA) +! PGZ_V_VW = ------ +! ____y +! d*zz +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MYM : Shuman functions (mean operators) +!! DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/07/94 +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the V point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_V_VW ! result VW point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GZ_V_VW +! --------------------- +! +PGZ_V_VW(:,:,:)= DZM(PA) / MYM(PDZZ) +! +!---------------------------------------------------------------------------- +! +END FUNCTION GZ_V_VW diff --git a/src/mesonh/aux/gradient_w.f90 b/src/mesonh/aux/gradient_w.f90 new file mode 100644 index 0000000000000000000000000000000000000000..097016ea94da162d1ba2b7ca0f84cf6c64a38de0 --- /dev/null +++ b/src/mesonh/aux/gradient_w.f90 @@ -0,0 +1,309 @@ +!MNH_LIC Copyright 1994-2020 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 MODI_GRADIENT_W +! ###################### +! +INTERFACE +! +! +FUNCTION GZ_W_M(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_W_M) +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_W_M ! result mass point +! +END FUNCTION GZ_W_M +! +FUNCTION GX_W_UW(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_W_UW) +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_W_UW ! result UW point +! +END FUNCTION GX_W_UW +! +! +FUNCTION GY_W_VW(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_W_VW) +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_W_VW ! result VW point +! +END FUNCTION GY_W_VW +! +! +END INTERFACE +! +END MODULE MODI_GRADIENT_W +! +! +! +! ####################################################### + FUNCTION GZ_W_M(PA,PDZZ, KKA, KKU, KL) RESULT(PGZ_W_M) +! ####################################################### +! +!!**** *GZ_W_M* - Cartesian Gradient operator: +!! computes the gradient in the cartesian Z +!! direction for a variable placed at the +!! W point and the result is placed at +!! the mass point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Z cartesian direction for a field PA placed at the +! W point. The result is placed at the mass point. +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MZF : Shuman functions (mean operators) +!! DZF : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 19/07/94 +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_W_M ! result mass point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GZ_W_M +! -------------------- +! +PGZ_W_M(:,:,:)= DZF(PA(:,:,:))/(MZF(PDZZ(:,:,:))) +! +!---------------------------------------------------------------------------- +! +END FUNCTION GZ_W_M +! +! +! ######################################################### + FUNCTION GX_W_UW(PA,PDXX,PDZZ,PDZX, KKA, KKU, KL) RESULT(PGX_W_UW) +! ######################################################### +! +!!**** *GX_W_UW* - Cartesian Gradient operator: +!! computes the gradient in the cartesian X +!! direction for a variable placed at the +!! V point and the result is placed at +!! the UW vorticity point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the X cartesian direction for a field PA placed at the +! W point. The result is placed at the UW vorticity point. +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MXM,MZM,MZF : Shuman functions (mean operators) +!! DXM,DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/07/94 +!! 18/10/00 (V.Masson) add LFLAT switch +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_W_UW ! result UW point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GX_W_UW +! --------------------- +! +IF (.NOT. LFLAT) THEN + PGX_W_UW(:,:,:)= DXM(PA(:,:,:))/(MZM(PDXX(:,:,:))) & + -DZM(MXM(MZF(PA(:,:,:))))*PDZX(:,:,:) & + /( MZM(PDXX(:,:,:))*MXM(PDZZ(:,:,:)) ) +ELSE + PGX_W_UW(:,:,:)= DXM(PA(:,:,:))/(MZM(PDXX(:,:,:))) +END IF +! +!---------------------------------------------------------------------------- +! +END FUNCTION GX_W_UW +! +! +! ######################################################### + FUNCTION GY_W_VW(PA,PDYY,PDZZ,PDZY, KKA, KKU, KL) RESULT(PGY_W_VW) +! ######################################################### +! +!!**** *GY_W_VW* - Cartesian Gradient operator: +!! computes the gradient in the cartesian Y +!! direction for a variable placed at the +!! W point and the result is placed at +!! the VW vorticity point. +!! PURPOSE +!! ------- +! The purpose of this function is to compute the discrete gradient +! along the Y cartesian direction for a field PA placed at the +! W point. The result is placed at the VW vorticity point. +! +!!** METHOD +!! ------ +!! The Chain rule of differencing is applied to variables expressed +!! in the Gal-Chen & Somerville coordinates to obtain the gradient in +!! the cartesian system +!! +!! EXTERNAL +!! -------- +!! MYM,MZM,MZF : Shuman functions (mean operators) +!! DYM,DZM : Shuman functions (finite difference operators) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (GRAD_CAR operators) +!! A Turbulence scheme for the Meso-NH model (Chapter 6) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart *INM and Meteo-France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 20/07/94 +!! 18/10/00 (V.Masson) add LFLAT switch +!------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the W point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzx +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_W_VW ! result VW point +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GY_W_VW +! --------------------- +! +IF (.NOT. LFLAT) THEN + PGY_W_VW(:,:,:)= DYM(PA(:,:,:))/(MZM(PDYY(:,:,:))) & + -DZM(MYM(MZF(PA(:,:,:))))*PDZY(:,:,:) & + /( MZM(PDYY(:,:,:))*MYM(PDZZ(:,:,:)) ) +ELSE + PGY_W_VW(:,:,:)= DYM(PA(:,:,:))/(MZM(PDYY(:,:,:))) +END IF +! +!---------------------------------------------------------------------------- +! +END FUNCTION GY_W_VW diff --git a/src/mesonh/micro/modd_dyn.f90 b/src/mesonh/aux/modd_dyn.f90 similarity index 100% rename from src/mesonh/micro/modd_dyn.f90 rename to src/mesonh/aux/modd_dyn.f90 diff --git a/src/mesonh/aux/modd_io.f90 b/src/mesonh/aux/modd_io.f90 new file mode 100644 index 0000000000000000000000000000000000000000..c8457cc2d32624a020d122c41cb318faa86a1d4c --- /dev/null +++ b/src/mesonh/aux/modd_io.f90 @@ -0,0 +1,159 @@ +!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. +!----------------------------------------------------------------- +! Modifications: +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 10/01/2019: use NEWUNIT argument of OPEN (removed ISTDOUT, ISTDERR, added NNULLUNIT, CNULLFILE) +! P. Wautelet 21/01/2019: add LIO_ALLOW_NO_BACKUP and LIO_NO_WRITE to modd_io_ll to allow to disable writes (for bench purposes) +! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list +! P. Wautelet 12/03/2019: add TMAINFILE field in TFILEDATA +! P. Wautelet 17/01/2020: add 'BUD' category for Print_msg + corresponding namelist variables +! P. Wautelet 22/09/2020: add ldimreduced in tfiledata +! P. Wautelet 10/11/2020: new data structures for netCDF dimensions +!----------------------------------------------------------------- + +#define MNH_REDUCE_DIMENSIONS_IN_FILES 1 + +MODULE MODD_IO +! +use modd_netcdf, only: tdimsnc +USE MODD_PARAMETERS, ONLY: NDIRNAMELGTMAX, NFILENAMELGTMAX +use modd_precision, only: CDFINT, LFIINT +! +IMPLICIT NONE +! +! +INTEGER, PARAMETER :: NVERB_NO=0, NVERB_FATAL=1, NVERB_ERROR=2, NVERB_WARNING=3, NVERB_INFO=4, NVERB_DEBUG=5 + +INTEGER :: NNULLUNIT = -1 ! /dev/null fortran unit, value set in IO_Init +CHARACTER(LEN=*), PARAMETER :: CNULLFILE = "/dev/null" + +INTEGER, SAVE :: NIO_RANK ! Rank of IO process +INTEGER, SAVE :: ISP !! Actual proc number +INTEGER, SAVE :: ISNPROC !! Total number of allocated processes +LOGICAL, SAVE :: GSMONOPROC = .FALSE. !! True if sequential execution (ISNPROC = 1) + +LOGICAL, SAVE :: L1D = .FALSE. ! TRUE if 1D model version +LOGICAL, SAVE :: L2D = .FALSE. ! TRUE if 2D model version +LOGICAL, SAVE :: LPACK = .FALSE. ! TRUE if FM compression occurs in 1D or 2D model version + +LOGICAL, SAVE :: LIOCDF4 = .FALSE. ! TRUE will enable full NetCDF4 (HDF5) I/O support +LOGICAL, SAVE :: LLFIOUT = .FALSE. ! TRUE will also force LFI output when LIOCDF4 is on (debug only) +LOGICAL, SAVE :: LLFIREAD = .FALSE. ! TRUE will force LFI read (instead of NetCDF) when LIOCDF4 is on (debug only) + +LOGICAL, SAVE :: LVERB_OUTLST = .TRUE. ! TRUE will PRINT_MSG in OUTPUT_LISTINGn files +LOGICAL, SAVE :: LVERB_STDOUT = .FALSE. ! TRUE will also PRINT_MSG on standard output +LOGICAL, SAVE :: LVERB_ALLPRC = .FALSE. ! FALSE: only process 0 do PRINT_MSG, TRUE: all processes +INTEGER, SAVE :: NBUD_VERB = NVERB_INFO ! Verbosity level for budgets +INTEGER, SAVE :: NBUD_ABORT_LEVEL = NVERB_ERROR ! Level of budget error necessary to force stop of application +INTEGER, SAVE :: NIO_VERB = NVERB_INFO ! Verbosity level for IO +INTEGER, SAVE :: NIO_ABORT_LEVEL = NVERB_ERROR ! Level of IO error necessary to force stop of application + +INTEGER, SAVE :: NGEN_VERB = NVERB_INFO ! Verbosity level for 'GEN' (generic) messages +INTEGER, SAVE :: NGEN_ABORT_LEVEL = NVERB_ERROR ! Level of 'GEN' error necessary to force stop of application + +CHARACTER(LEN=NDIRNAMELGTMAX) :: CIO_DIR = '' ! Directory for IO + +logical, save :: LIO_ALLOW_NO_BACKUP = .false. ! Allow to have no valid backup time (useful for some tests) +logical, save :: LIO_NO_WRITE = .false. ! Disable file writes (useful for benchs) + +!Structure containing one pointer to a file +!Useful to create arrays of pointers to files +TYPE TFILE_ELT + TYPE(TFILEDATA),POINTER :: TFILE => NULL() +END TYPE TFILE_ELT + +!Structure describing the characteristics of an output or a backup +TYPE TOUTBAK + INTEGER :: NID = -1 !Backup number + INTEGER :: NSTEP !Timestep number + REAL :: XTIME !Time from start of the segment (in seconds and rounded to a timestep) + INTEGER :: NOUTDAD = -1 !Index of the corresponding dad file (file with same time) + TYPE(TFILEDATA),POINTER :: TFILE => NULL() !Corresponding file + TYPE(TFILE_ELT),DIMENSION(:),ALLOCATABLE :: TFILE_IOZ !Corresponding Z-split files + INTEGER,DIMENSION(:),POINTER :: NFIELDLIST => NULL() !List of the fields to read or write +END TYPE TOUTBAK + +!Structure describing the characteristics of a file +TYPE TFILEDATA + CHARACTER(LEN=NFILENAMELGTMAX) :: CNAME = '' !Filename + CHARACTER(LEN=:),ALLOCATABLE :: CDIRNAME !Directory name + CHARACTER(LEN=13) :: CTYPE = "UNKNOWN" !Filetype (PGD, MNH, DES, NML...) + CHARACTER(LEN=7) :: CFORMAT = "UNKNOWN" !Fileformat (NETCDF4, LFI, LFICDF4...) + CHARACTER(LEN=7) :: CMODE = "UNKNOWN" !Opening mode (read, write...) + LOGICAL :: LOPENED = .FALSE. !Is the file opened + INTEGER :: NOPEN_CURRENT = 0 !Number of times the file is currently opened (several opens without close are allowed) + INTEGER :: NOPEN = 0 !Number of times the file has been opened (during the current execution) + INTEGER :: NCLOSE = 0 !Number of times the file has been closed (during the current execution) + ! + INTEGER :: NMASTER_RANK = -1 !Rank of the master process (no meaning if LMULTIMASTERS=.T.) + INTEGER :: NMPICOMM = -1 !MPI communicator used for IO on this file + LOGICAL :: LMASTER = .FALSE. !True if process is master of the file (process that open/read/write/close) + LOGICAL :: LMULTIMASTERS = .FALSE. !True if several processes may access the file +#if ( MNH_REDUCE_DIMENSIONS_IN_FILES == 1 ) + logical :: ldimreduced = .true. !True if number of dimensions of fields can be reduced (for 2D simulations) +#else + logical :: ldimreduced = .false. !True if number of dimensions of fields can be reduced (for 2D simulations) +#endif + ! + INTEGER :: NSUBFILES_IOZ = 0 !Number of sub-files (Z-split files based on this file) + !For example if 2 sub-files and this file is abcd, + !the 2 sub-files are abcd.Z001 and abcd.Z002 + TYPE(TFILE_ELT),DIMENSION(:),ALLOCATABLE :: TFILES_IOZ !Corresponding Z-split files + ! + INTEGER :: NMODEL = 0 !Model number corresponding to the file (field not always set) + INTEGER,DIMENSION(3) :: NMNHVERSION = (/0,0,0/) !MesoNH version used to create the file + ! +#ifdef MNH_IOLFI + ! Fields for LFI files + INTEGER(KIND=LFIINT) :: NLFININAR = 0 !Number of articles of the LFI file (only accurate if file opened in read mode) + INTEGER(KIND=LFIINT) :: NLFINPRAR = 0 !Number of predicted articles of the LFI file (non crucial) + INTEGER :: NLFITYPE = -1 !Type of the file (used to generate list of files to transfers) + INTEGER :: NLFIVERB = 1 !LFI verbosity level + INTEGER(KIND=LFIINT) :: NLFIFLU = -1 !File identifier +#endif + ! +#ifdef MNH_IOCDF4 + ! Fields for netCDF files + INTEGER(KIND=CDFINT) :: NNCID = -1 !File identifier (corresponding to the actual group) + INTEGER(KIND=CDFINT) :: NNCNAR = 0 !Number of articles of the netCDF file (only accurate if file opened in read mode) + LOGICAL :: LNCREDUCE_FLOAT_PRECISION = .FALSE. ! Reduce the precision of floats to single precision + ! instead of double precision + LOGICAL :: LNCCOMPRESS = .FALSE. ! Do compression on fields + INTEGER(KIND=CDFINT) :: NNCCOMPRESS_LEVEL = 0 ! Compression level + type(tdimsnc), pointer :: tncdims => Null() ! Dimensions of netCDF file +#endif + ! + !Fields for other files + INTEGER :: NLU = -1 !Logical unit number + INTEGER :: NRECL = -1 !Fortran RECL (record length) + CHARACTER(LEN=11) :: CFORM = "UNKNOWN" !Fortran FORM (FORMATTED/UNFORMATTED) + CHARACTER(LEN=10) :: CACCESS = "UNKNOWN" !Fortran ACCESS (DIRECT/SEQUENTIAL/STREAM) + ! + TYPE(TFILEDATA),POINTER :: TDADFILE => NULL() !Corresponding dad file + TYPE(TFILEDATA),POINTER :: TDESFILE => NULL() !Corresponding .des file + TYPE(TFILEDATA),POINTER :: TDATAFILE => NULL() !Corresponding data file (if .des file) + TYPE(TFILEDATA),POINTER :: TMAINFILE => NULL() !Corresponding main file if the file is an sub-file + ! + TYPE(TFILEDATA),POINTER :: TFILE_PREV => NULL() + TYPE(TFILEDATA),POINTER :: TFILE_NEXT => NULL() +END TYPE TFILEDATA + +!Structure containing a pointer to a file (useful to create arrays of pointers to files) +TYPE TPTR2FILE + TYPE(TFILEDATA),POINTER :: TZFILE => NULL() +END TYPE + +TYPE(TFILEDATA),POINTER,SAVE :: TFILE_FIRST => NULL() +TYPE(TFILEDATA),POINTER,SAVE :: TFILE_LAST => NULL() + +TYPE(TFILEDATA),POINTER,SAVE :: TFILE_SURFEX => NULL() !Pointer used to find the file used when writing SURFEX fields in write_surf_mnh.f90 + +TYPE(TFILEDATA),POINTER,SAVE :: TFILE_OUTPUTLISTING => NULL() !Pointer used to point to the file used when writing to OUTPUT_LISTINGn file + +!Non existing file which can be used as a dummy target +TYPE(TFILEDATA),TARGET, SAVE :: TFILE_DUMMY = TFILEDATA(CNAME="dummy",CDIRNAME=NULL(),TFILES_IOZ=NULL()) + +END MODULE MODD_IO diff --git a/src/mesonh/micro/modd_lunit.f90 b/src/mesonh/aux/modd_lunit.f90 similarity index 100% rename from src/mesonh/micro/modd_lunit.f90 rename to src/mesonh/aux/modd_lunit.f90 diff --git a/src/mesonh/micro/modd_parameters.f90 b/src/mesonh/aux/modd_parameters.f90 similarity index 97% rename from src/mesonh/micro/modd_parameters.f90 rename to src/mesonh/aux/modd_parameters.f90 index c21c6e70955e1e1ecbe501225f6d3f83dd66a1ec..1fffa21efafab090585b757bec9603d4abf40d21 100644 --- a/src/mesonh/micro/modd_parameters.f90 +++ b/src/mesonh/aux/modd_parameters.f90 @@ -11,21 +11,21 @@ !! !! PURPOSE !! ------- -! The purpose of this declarative module is to specify the variables -! which have the PARAMETER attribute +! The purpose of this declarative module is to specify the variables +! which have the PARAMETER attribute ! !! !!** IMPLICIT ARGUMENTS !! ------------------ -!! None +!! None !! !! REFERENCE !! --------- !! Book2 of documentation of Meso-NH (module MODD_PARAMETER) -!! +!! !! AUTHOR !! ------ -!! V. Ducrocq *Meteo France* +!! V. Ducrocq *Meteo France* !! !! MODIFICATIONS !! ------------- @@ -57,7 +57,7 @@ INTEGER,SAVE :: JPHEXT = 1 ! Horizontal External points number !JUAN CYCLK INTEGER, PARAMETER :: JPVEXT = 1 ! Vertical External points number INTEGER, PARAMETER :: JPVEXT_TURB = 1 ! Vertical External points number -INTEGER, PARAMETER :: JPMODELMAX = 8 ! Maximum allowed number of nested models +INTEGER, PARAMETER :: JPMODELMAX = 8 ! Maximum allowed number of nested models INTEGER, PARAMETER :: JPCPLFILEMAX = 24 ! Maximum allowed number of CouPLing FILEs INTEGER, PARAMETER :: JPRIMMAX = 6 ! Maximum number of points for the ! horizontal relaxation for the outermost verticals 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/aux/mode_tools_ll.f90 b/src/mesonh/aux/mode_tools_ll.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a617c26fbbcb83687687c02881242b89ac2c2411 --- /dev/null +++ b/src/mesonh/aux/mode_tools_ll.f90 @@ -0,0 +1,3658 @@ +!MNH_LIC Copyright 1998-2020 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. +!----------------------------------------------------------------- +! Modifications: +! J. Escobar 15/09/2015: WENO5 & JPHEXT <> 1 +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 26/04/2019: use modd_precision parameters for datatypes of MPI communications +!----------------------------------------------------------------- + +! #################### + MODULE MODE_TOOLS_ll +! #################### +! +!! Purpose +!! ------- +! +! The Purpose of this module is to provide subroutines and functions for +! for the initialization of parallel data variables +! +!! Routines Of The User Interface +!! ------------------------------ +! +! FUNCTIONS : LNORTH_ll, LSOUTH_ll, LEAST_ll, LWEST_ll +! SUBROUTINES : GET_DIM_EXT_ll, GET_OR_ll, GET_INDICE_ll, GET_PHYSICAL_ll +! GET_INTERSECTION_ll, +! GET_GLOBALSLICE_ll +! (GET_1DGLOBALSLICE_ll, GET_2DGLOBALSLICE_ll), +! GET_SLICE_ll +! (GET_1DSLICE_ll, GET_2DSLICE_ll) +! GET_L2_NORM_ll +! +!! Reference +!! --------- +! +! User Interface for Meso-NH parallel package +! Ph. Kloos, L. Giraud, R. Guivarch, D. Lugato +! +!! Authors +!! ------- +! +! R. Guivarch, D. Lugato * CERFACS * +! Ph. Kloos * CERFACS - CNRM * +! +! Modif +! Juan/Didier 12/03/2009: array bound bug correction with 1proc/MPIVIDE +! J. Escobar 27/06/2011 correction for gridnesting with different SHAPE +! +USE MODD_MPIF +use modd_precision, only: MNHINT_MPI, MNHREAL_MPI +USE MODD_STRUCTURE_ll +USE MODD_VAR_ll, ONLY : NMNH_COMM_WORLD + +use mode_msg + +implicit none + +interface GET_GLOBALSLICE_ll + module procedure GET_1DGLOBALSLICE_ll, GET_2DGLOBALSLICE_ll +end interface + +interface GET_SLICE_ll + module procedure GET_1DSLICE_ll, GET_2DSLICE_ll +end interface + +CONTAINS + + SUBROUTINE SLIDE_COORD(KDIM_DATA,KDIM_PROC,THIS_PROC,KOR,KEND) + + !! Purpose + ! + ! Compute for the processor=THIS_PROC the origine/end of slide in decomposing + ! an array of data of dimension=KDIM_DATA on KDIM_PROC + ! + !! Author + !! ------ + ! J. ESCOBAR * LA * + + IMPLICIT NONE + ! + !* 0.1 declarations of arguments + ! + INTEGER, INTENT(IN) :: KDIM_DATA ! dimension of data to split + INTEGER, INTENT(IN) :: KDIM_PROC ! numbers of processor to use in splitting + INTEGER, INTENT(IN) :: THIS_PROC ! processor id from 1..NB_PROC + INTEGER, INTENT(OUT) :: KOR,KEND ! Origine/End coordonate + ! + !* 0.2 declarations of local variables + ! + INTEGER :: IDIM_SLIDE ! slide dimension ( without rest/delta ) + INTEGER :: IREST ! number of point in surabondance to distribut + INTEGER :: IDELTAOR,IDELTAEND ! offset in origine to apply + + IDIM_SLIDE = KDIM_DATA/KDIM_PROC + IREST = MOD(KDIM_DATA,KDIM_PROC) + IDELTAOR = MIN(IREST,THIS_PROC-1) + IDELTAEND = MIN(IREST,THIS_PROC) + + KOR = ( THIS_PROC - 1 ) * IDIM_SLIDE + 1 + IDELTAOR + KEND = THIS_PROC * IDIM_SLIDE + IDELTAEND + + END SUBROUTINE SLIDE_COORD + +! +! ######################################## + LOGICAL FUNCTION LNORTH_ll(K,HSPLITTING) +! ######################################## +! +!!**** *LNORTH_ll* - function which returns the position on to the boundaries +! of the subdomain K according to the splitting +! +!! Purpose +!! ------- +! the Purpose of this routine is to offer a transparent way to obtain +! the position of a subdomain +! +!!** Method +!! ------ +! if the argument HSPLITTING is omitted the 2Way splitting is considered +! if the argument K is omitted, the local subdomain is considered +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! Module MODD_VAR_ll +! TCRRT_PROCONF - Current configuration for current model +! IP - Number of local processor=subdomain +! NPROC - Number of processors +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_VAR_ll, ONLY : TCRRT_PROCONF, IP, NPROC +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + INTEGER, INTENT(IN), OPTIONAL :: K ! number of the subdomain + CHARACTER(len=1), INTENT(IN), OPTIONAL :: HSPLITTING ! kind of splitting +! +!* 0.2 declarations of local variables +! + INTEGER :: IT ! number of the tested subdomain +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTATION OF THE RESULT : +! ------------------------- +! + IF( PRESENT(K) ) THEN + IT = K + ELSE + IT = IP + ENDIF +! + LNORTH_ll = .FALSE. +! + IF(.NOT.PRESENT(HSPLITTING)) THEN + LNORTH_ll = TCRRT_PROCONF%TBOUND(IT)%NORTH + ELSEIF(HSPLITTING .EQ. 'B') THEN + LNORTH_ll = TCRRT_PROCONF%TBOUND(IT)%NORTH + ELSEIF(HSPLITTING .EQ. 'X') THEN + LNORTH_ll = (IT.EQ.NPROC) + ELSEIF(HSPLITTING .EQ. 'Y') THEN + LNORTH_ll = .TRUE. + ENDIF +! +!------------------------------------------------------------------------------- +! + END FUNCTION LNORTH_ll +! +! ####################################### + LOGICAL FUNCTION LWEST_ll(K,HSPLITTING) +! ####################################### +! +!!**** *LWEST_ll* - function which returns the position on to the boundaries +! of the subdomain K according to the splitting +! +!! Purpose +!! ------- +! the Purpose of this routine is to offer a transparent way to obtain +! the position of a subdomain +! +!!** Method +!! ------ +! if the argument HSPLITTING is omitted the 2Way splitting is considered +! if the argument K is omitted, the local subdomain is considered +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! Module MODD_VAR_ll +! TCRRT_PROCONF - Current configuration for current model +! IP - Number of local processor=subdomain +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_VAR_ll, ONLY : TCRRT_PROCONF, IP +! + IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! + INTEGER, INTENT(IN), OPTIONAL :: K ! number of the subdomain + CHARACTER(len=1), INTENT(IN), OPTIONAL :: HSPLITTING ! kind of splitting + +!! +!* 0.2 declarations of local variables +! + INTEGER :: IT ! number of the tested subdomain +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTATION OF THE RESULT : +! ------------------------- +! + IF( PRESENT(K) ) THEN + IT = K + ELSE + IT = IP + ENDIF +! + LWEST_ll = .FALSE. +! + IF(.NOT.PRESENT(HSPLITTING)) THEN + LWEST_ll = TCRRT_PROCONF%TBOUND(IT)%WEST + ELSEIF(HSPLITTING .EQ. 'B') THEN + LWEST_ll = TCRRT_PROCONF%TBOUND(IT)%WEST + ELSEIF(HSPLITTING .EQ. 'X') THEN + LWEST_ll = .TRUE. + ELSEIF(HSPLITTING .EQ. 'Y') THEN + LWEST_ll = (IT.EQ.1) + ENDIF +! +!------------------------------------------------------------------------------- +! + END FUNCTION LWEST_ll +! +! ######################################## + LOGICAL FUNCTION LSOUTH_ll(K,HSPLITTING) +! ######################################## +! +!!**** *LSOUTH_ll* - function which returns the position on to the boundaries +!! of the subdomain K according to the splitting +!! +!! Purpose +!! ------- +! the Purpose of this routine is to offer a transparent way to obtain +! the position of a subdomain +! +!!** Method +!! ------ +! if the argument HSPLITTING is omitted the 2Way splitting is considered +! if the argument K is omitted, the local subdomain is considered +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! Module MODD_VAR_ll +! TCRRT_PROCONF - Current configuration for current model +! IP - Number of local processor=subdomain +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_VAR_ll, ONLY : TCRRT_PROCONF, IP +! + IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! + INTEGER, INTENT(IN), OPTIONAL :: K ! number of the subdomain + CHARACTER(len=1), INTENT(IN), OPTIONAL :: HSPLITTING ! kind of splitting + +!! +!* 0.2 declarations of local variables +! + INTEGER :: IT ! number of the tested subdomain +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTATION OF THE RESULT : +! ------------------------- +! + IF( PRESENT(K) ) THEN + IT = K + ELSE + IT = IP + ENDIF +! + LSOUTH_ll = .FALSE. +! + IF(.NOT.PRESENT(HSPLITTING)) THEN + LSOUTH_ll = TCRRT_PROCONF%TBOUND(IT)%SOUTH + ELSEIF(HSPLITTING .EQ. 'B') THEN + LSOUTH_ll = TCRRT_PROCONF%TBOUND(IT)%SOUTH + ELSEIF(HSPLITTING .EQ. 'X') THEN + LSOUTH_ll = (IT.EQ.1) + ELSEIF(HSPLITTING .EQ. 'Y') THEN + LSOUTH_ll = .TRUE. + ENDIF +! +!------------------------------------------------------------------------------- +! + END FUNCTION LSOUTH_ll +! +! ####################################### + LOGICAL FUNCTION LEAST_ll(K,HSPLITTING) +! ####################################### +! +!!**** *LEAST_ll* - function which returns the position on to the boundaries +!! of the subdomain K according to the splitting +!! +!! Purpose +!! ------- +! the Purpose of this routine is to offer a transparent way to obtain +! the position of a subdomain +! +!!** Method +!! ------ +! if the argument HSPLITTING is omitted the 2Way splitting is considered +! if the argument K is omitted, the local subdomain is considered +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! Module MODD_VAR_ll +! TCRRT_PROCONF - Current configuration for current model +! IP - Number of local processor=subdomain +! NPROC - Number of processors +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_VAR_ll, ONLY : TCRRT_PROCONF, IP, NPROC +! + IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! + INTEGER, INTENT(IN), OPTIONAL :: K ! number of the subdomain + CHARACTER(len=1), INTENT(IN), OPTIONAL :: HSPLITTING ! kind of splitting + +!! +!* 0.2 declarations of local variables +! + INTEGER :: IT ! number of the tested subdomain +! +!------------------------------------------------------------------------------- +! +!* 1. COMPUTATION OF THE RESULT : +! ------------------------- +! + IF( PRESENT(K) ) THEN + IT = K + ELSE + IT = IP + ENDIF +! + LEAST_ll = .FALSE. +! + IF(.NOT.PRESENT(HSPLITTING)) THEN + LEAST_ll = TCRRT_PROCONF%TBOUND(IT)%EAST + ELSEIF(HSPLITTING .EQ. 'B') THEN + LEAST_ll = TCRRT_PROCONF%TBOUND(IT)%EAST + ELSEIF(HSPLITTING .EQ. 'X') THEN + LEAST_ll = .TRUE. + ELSEIF(HSPLITTING .EQ. 'Y') THEN + LEAST_ll = (IT.EQ.NPROC) + ENDIF +! +!------------------------------------------------------------------------------- +! + END FUNCTION LEAST_ll +! +! ################################################# + SUBROUTINE GET_DIM_EXT_ll( HSPLIT, KXDIM, KYDIM ) +! ################################################# +! +!!**** *GET_DIM_EXT_ll* - returns the dimensions of the extended 2way subdomain +! or of the x-slices subdomain or of the y-slices +! subdomain of the local processor +! +!! Purpose +!! ------- +! the Purpose of this routine is to give subdomain dimension +! +!!** Method +!! ------ +! if HSPLIT='B', the dimensions of the extended 2way subdomain are returned +! if HSPLIT='X', the dimensions of x-slices subdomain are returned +! if HSPLIT='Y', the dimensions of y-slices subdomain are returned +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! Module MODD_VAR_ll +! TCRRT_COMDATA - Current communication data structure for current model +! and local processor +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_VAR_ll, ONLY : TCRRT_COMDATA +! + IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! + CHARACTER(len=1), INTENT(IN) :: HSPLIT +! + INTEGER, INTENT(OUT) :: KXDIM, KYDIM +! +! +!* 0.2 declarations of local variables +! +!------------------------------------------------------------------------------- +! +!* 1. Return the dimensions +! + IF( HSPLIT .EQ. 'B' ) THEN + KXDIM = TCRRT_COMDATA%TSPLIT_B%NDIMXE + KYDIM = TCRRT_COMDATA%TSPLIT_B%NDIMYE + ELSEIF ( HSPLIT .EQ. 'X' ) THEN + KXDIM = TCRRT_COMDATA%TSPLIT_X%NDIMXP + KYDIM = TCRRT_COMDATA%TSPLIT_X%NDIMYP + ELSE + KXDIM = TCRRT_COMDATA%TSPLIT_Y%NDIMXP + KYDIM = TCRRT_COMDATA%TSPLIT_Y%NDIMYP + ENDIF +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE GET_DIM_EXT_ll +! +! ################################################## + SUBROUTINE GET_DIM_PHYS_ll( HSPLIT, KXDIM, KYDIM ) +! ################################################## +! +!!**** *GET_DIM_PHYS_ll* - returns the dimensions of the physical +! 2way subdomain or of the x-slices subdomain or +! of the y-slices subdomain of the local processor +! +!! Purpose +!! ------- +! the Purpose of this routine is to give subdomain dimension +! +!!** Method +!! ------ +! if HSPLIT='B', the dimensions of the physical 2way subdomain are returned +! if HSPLIT='X', the dimensions of x-slices subdomain are returned +! if HSPLIT='Y', the dimensions of y-slices subdomain are returned +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! Module MODD_VAR_ll +! TCRRT_COMDATA - Current communication data structure for current model +! and local processor +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_VAR_ll, ONLY : TCRRT_COMDATA +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + CHARACTER(len=1), INTENT(IN) :: HSPLIT +! + INTEGER, INTENT(OUT) :: KXDIM, KYDIM +! +!* 0.2 declarations of local variables +! +!------------------------------------------------------------------------------- +! +!* 1. Return the dimensions +! + IF( HSPLIT .EQ. 'B' ) THEN + KXDIM = TCRRT_COMDATA%TSPLIT_B%NDIMXP + KYDIM = TCRRT_COMDATA%TSPLIT_B%NDIMYP + ELSEIF ( HSPLIT .EQ. 'X' ) THEN + KXDIM = TCRRT_COMDATA%TSPLIT_X%NDIMXP + KYDIM = TCRRT_COMDATA%TSPLIT_X%NDIMYP + ELSE + KXDIM = TCRRT_COMDATA%TSPLIT_Y%NDIMXP + KYDIM = TCRRT_COMDATA%TSPLIT_Y%NDIMYP + ENDIF +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE GET_DIM_PHYS_ll +! +! ########################################## + SUBROUTINE GET_OR_ll( HSPLIT, KXOR, KYOR ) +! ########################################## +! +!!**** *GET_OR_ll* - returns the origin'coordinates of the extended +! 2way subdomain or of the x-slices subdomain +! or of the y-slices +! subdomain of the local processor (global indices) +! +!! Purpose +!! ------- +! the Purpose of this routine is to give subdomain origin +! +!!** Method +!! ------ +! if HSPLIT = 'B', the origin of the extended subdomain are returned +! if HSPLIT = 'X', the origin of x-slices subdomain are returned +! if HSPLIT = 'Y', the origin of y-slices subdomain are returned +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! Module MODD_VAR_ll +! TCRRT_COMDATA - Current communication data structure for current model +! and local processor +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_VAR_ll, ONLY : TCRRT_COMDATA +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + CHARACTER(len=1), INTENT(IN) :: HSPLIT +! + INTEGER, INTENT(OUT) :: KXOR, KYOR +! +!* 0.2 declarations of local variables +! +!------------------------------------------------------------------------------- +! +!* 1. +! + IF( HSPLIT .EQ. 'B' ) THEN + KXOR = TCRRT_COMDATA%TSPLIT_B%NXORE + KYOR = TCRRT_COMDATA%TSPLIT_B%NYORE + ELSEIF ( HSPLIT .EQ. 'X' ) THEN + KXOR = TCRRT_COMDATA%TSPLIT_X%NXORP + KYOR = TCRRT_COMDATA%TSPLIT_X%NYORP + ELSE + KXOR = TCRRT_COMDATA%TSPLIT_Y%NXORP + KYOR = TCRRT_COMDATA%TSPLIT_Y%NYORP + ENDIF +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE GET_OR_ll +! +! #################################################### + SUBROUTINE GET_INDICE_ll( KXOR, KYOR, KXEND, KYEND, KSIZE1, KSIZE2 ) +! #################################################### +! +!!**** *GET_INDICE_ll* - returns the origin's coordinates and the end's +! coordinates of the local physical +! subdomain (in local indices) +! +!! Purpose +!! ------- +! +!!** Method +!! ------ +! +!! External +!! -------- +! Module MODE_TOOLS_ll +! LWEST_ll, LSOUTH_ll, LEAST_ll, LNORTH_ll +! +!! Implicit Arguments +!! ------------------ +! Module MODD_VAR_ll +! TCRRT_COMDATA - Current communication data structure for current model +! and local processor +! JPHALO- halo size +! +! Module MODD_PARAMETERS_ll +! JPHEXT - halo size +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 08/07/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_PARAMETERS_ll, ONLY : JPHEXT + USE MODD_VAR_ll, ONLY : TCRRT_COMDATA, JPHALO +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + INTEGER, INTENT(OUT) :: KXOR, KYOR, KXEND, KYEND + INTEGER, INTENT(IN),OPTIONAL :: KSIZE1, KSIZE2 +! +!* 0.2 declarations of local variables +! +!------------------------------------------------------------------------------- +! + IF(LWEST_ll()) THEN + KXOR = 1 + JPHEXT + ELSE + KXOR = 1 + JPHALO + ENDIF +! + IF(LSOUTH_ll()) THEN + KYOR = 1 + JPHEXT + ELSE + KYOR = 1 + JPHALO + ENDIF +! + IF(LEAST_ll()) THEN + KXEND = TCRRT_COMDATA%TSPLIT_B%NDIMXE - JPHEXT + ELSE + KXEND = TCRRT_COMDATA%TSPLIT_B%NDIMXE - JPHALO + ENDIF +! + IF(LNORTH_ll()) THEN + KYEND = TCRRT_COMDATA%TSPLIT_B%NDIMYE - JPHEXT + ELSE + KYEND = TCRRT_COMDATA%TSPLIT_B%NDIMYE - JPHALO + ENDIF +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE GET_INDICE_ll +! +! ########################################## + SUBROUTINE GET_GLOBALDIMS_ll(KIMAX, KJMAX, KMODEL) +! ########################################## +! +!!**** *GET_GLOBALDIMS_ll* - returns the global horizontal dimensions +! of the current model (External halo excluded) +! +!! Purpose +!! ------- +! +!!** Method +!! ------ +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! Module MODD_VAR_ll +! TCRRT_PROCONF - Current configuration for current model +! +! Module MODD_DIM_ll +! NDXRATIO_ALL, NDYRATIO_ALL, NXOR_ALL, NYOR_ALL, +! NXEND_ALL, NYEND_ALL +! +!! Reference +!! --------- +! +!! Author +!! ------ +! P. Kloos (CERFACS) +! +! Modifications +!! ------------- +! Original 15 september 1998 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_DIM_ll, ONLY : NDXRATIO_ALL, NDYRATIO_ALL, & + NXOR_ALL, NYOR_ALL, & + NXEND_ALL, NYEND_ALL + USE MODD_VAR_ll, ONLY : TCRRT_PROCONF + + USE MODD_PARAMETERS_ll, ONLY : JPHEXT +! + IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! + INTEGER, INTENT(OUT) :: KIMAX, KJMAX ! current model dimensions + INTEGER, OPTIONAL, INTENT(IN) :: KMODEL ! number of the current model +! +!* 0.2 declarations of local variables +! + INTEGER :: IMODEL ! number of the current model +! +!------------------------------------------------------------------------------- +! +!* 1. Extract the number of the current model. +! +IF ( PRESENT(KMODEL) ) THEN + IMODEL = KMODEL +ELSE + IMODEL = TCRRT_PROCONF%NUMBER +ENDIF +! +!* 2. Compute the dimensions of the model +! + KIMAX = NDXRATIO_ALL(IMODEL) * (NXEND_ALL(IMODEL)-NXOR_ALL(IMODEL) -2*JPHEXT + 1) + KJMAX = NDYRATIO_ALL(IMODEL) * (NYEND_ALL(IMODEL)-NYOR_ALL(IMODEL) -2*JPHEXT + 1) +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE GET_GLOBALDIMS_ll +! +! ###################################################### + SUBROUTINE GET_PHYSICAL_ll( KXOR, KYOR, KXEND, KYEND ) +! ###################################################### +! +!!**** *GET_PHYSICAL_ll* - returns the origin's coordinates and the end's +! coordinates of the intersection +! of the physical global domain with the local +! extended subdomain (in local indices) +! +!! Purpose +!! ------- +! +!!** Method +!! ------ +! +!! External +!! -------- +! Module MODE_TOOLS_ll +! LWEST_ll, LSOUTH_ll, LEAST_ll, LNORTH_ll +! +!! Implicit Arguments +!! ------------------ +! Module MODD_VAR_ll +! TCRRT_COMDATA - Current communication data structure for current model +! and local processor +! +! Module MODD_PARAMETERS_ll +! JPHEXT +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_PARAMETERS_ll, ONLY : JPHEXT + USE MODD_VAR_ll, ONLY : TCRRT_COMDATA +! + IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! + INTEGER, INTENT(OUT) :: KXOR, KYOR, KXEND, KYEND +! +! +!* 0.2 declarations of local variables +! +!------------------------------------------------------------------------------- +! + KXOR = 1 + IF(LWEST_ll()) KXOR = KXOR + JPHEXT +! + KYOR = 1 + IF(LSOUTH_ll()) KYOR = KYOR + JPHEXT +! + KXEND = TCRRT_COMDATA%TSPLIT_B%NDIMXE + IF(LEAST_ll()) KXEND = KXEND - JPHEXT +! + KYEND = TCRRT_COMDATA%TSPLIT_B%NDIMYE + IF(LNORTH_ll()) KYEND = KYEND - JPHEXT +! +! + END SUBROUTINE GET_PHYSICAL_ll +! +! ################################################################### + SUBROUTINE GET_INTERSECTION_ll( KXOR,KYOR,KXEND,KYEND,KXORI,KYORI,& + KXENDI,KYENDI,HDOM,KINFO,KIP) +! ################################################################### +! +!!**** *GET_INTERSECTION_ll* - routine to get the indices of the intersection +! between a geographic region and the EXTENDED or +! PHYSICAL subdomain of the KIP or current +! processor. +! The input indices are global. +! The output indices are local. +! If the returned indices are null +! the intersection is void. +! +!! Purpose +!! ------- +! +!!** Method +!! ------ +! The processor computes the intersection of a sub-domain +! with the geographic region. +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! Module MODD_VAR_ll +! TCRRT_PROCONF - Current configuration for current model +! IP - Number of the local processor +! +! Module MODD_PARAMETERS_ll +! JPHEXT, JPVEXT - halo sizes +! +! Module MODD_STRUCTURE_ll +! type MODELSPLITTING_ll +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch, D. Gazen +! +!! Modifications +!! ------------- +! Original 20/01/99 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_STRUCTURE_ll, ONLY : MODELSPLITTING_ll + USE MODD_PARAMETERS_ll, ONLY : JPHEXT, JPVEXT + USE MODD_VAR_ll, ONLY : TCRRT_PROCONF, IP +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + CHARACTER(LEN=4), INTENT(IN) :: HDOM ! 'EXTE' for extended subdomain + ! 'PHYS' for physical subdomain + INTEGER, INTENT(IN) :: KXOR, KYOR, KXEND, KYEND ! Coordinates of the region + INTEGER, INTENT(OUT) :: KXORI, KYORI, KXENDI, KYENDI ! Global Coordinates of + ! the intersection + INTEGER, INTENT(OUT) :: KINFO ! Returned Info + INTEGER, INTENT(IN), OPTIONAL:: KIP ! Processor number + ! (or subdomain number) +! +!* 0.2 declarations of local variables +! + INTEGER :: IIMAX_ll, IJMAX_ll ! size of the total physical model + INTEGER :: IXORI, IYORI, IXENDI, IYENDI ! Local coordinates of intersection + TYPE(MODELSPLITTING_ll), POINTER :: TZSPLIT ! 2way-splitting + INTEGER :: IXOR, IYOR, IXEND, IYEND ! global coordinate of KIP subdomain + INTEGER :: IIP ! subdomain or processor number +! +!------------------------------------------------------------------------------- +! + KINFO = 0 + IF (PRESENT(KIP)) THEN + IIP = KIP + ELSE + IIP = IP + END IF +! +!------------------------------------------------------------------------------- +! +!* 1. INITIALISE BOUNDARY VALUES +! -------------------------- +! +! 1.1 'EXTE'nded sub-domain + + TZSPLIT => TCRRT_PROCONF%TSPLITS_B(IIP) +! + IXOR = TZSPLIT%NXORE + IYOR = TZSPLIT%NYORE + IXEND = TZSPLIT%NXENDE + IYEND = TZSPLIT%NYENDE +! +! 1.2 'PHYS'ical sub-domain +! + IF (HDOM=='PHYS') THEN + IF (.NOT. LWEST_ll(IIP)) IXOR = TZSPLIT%NXORP + IF (.NOT. LEAST_ll(IIP)) IXEND = TZSPLIT%NXENDP + IF (.NOT. LSOUTH_ll(IIP)) IYOR = TZSPLIT%NYORP + IF (.NOT. LNORTH_ll(IIP)) IYEND = TZSPLIT%NYENDP + END IF +! +!------------------------------------------------------------------------------- +! +!* 2. THE COORDINATES ARE NOT IN THE PHYSICAL DOMAIN -> ERROR : +! ------------------------------------------------------- +! + CALL GET_GLOBALDIMS_ll(IIMAX_ll, IJMAX_ll) +! + IF((KXOR < 1 ) .OR. (KYOR < 1 ) .OR. & + (KXEND > IIMAX_ll + 2*JPHEXT) .OR. (KYEND > IJMAX_ll + 2*JPHEXT)) THEN +! +! Error +! + KINFO = -1 +! + RETURN +! +!------------------------------------------------------------------------------- +! +!* 3. THE COORDINATES ARE IN THE PHYSICAL DOMAIN : +! ------------------------------------------ +! + ELSE +! + IXORI = MAX( IXOR, KXOR ) + IYORI = MAX( IYOR, KYOR ) +! + IXENDI = MIN( IXEND, KXEND ) + IYENDI = MIN( IYEND, KYEND ) +! +!* 3.1 The intersection is empty +! + IF((IXORI > IXENDI) .OR. (IYORI > IYENDI)) THEN +! + KXORI = 0 + KYORI = 0 +! + KXENDI = 0 + KYENDI = 0 +! + KINFO = 1 +! + ELSE +! +!* 3.2 Switch to local coordinates +! + KXORI = IXORI - TZSPLIT%NXORE + 1 + KYORI = IYORI - TZSPLIT%NYORE + 1 + KXENDI = IXENDI - TZSPLIT%NXORE + 1 + KYENDI = IYENDI - TZSPLIT%NYORE + 1 + ENDIF +! + ENDIF +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE GET_INTERSECTION_ll +! +! ################################################################## +! SUBROUTINE GET_GLOBALSLICE_ll(PARRAY, HDIR, KLOC, PGLOBALSLICE, & +! KB, KE, KERR) +! ################################################################## +! +!! Purpose +!! ------- +! The Purpose of this routine is to get a slice of the +! domain in the x or y direction. +! +! ################################################################### + SUBROUTINE GET_1DGLOBALSLICE_ll(PARRAY, HDIR, KLOC, PGLOBALSLICE, & + KB, KE, KERR) +! ################################################################### +! +!! Purpose +!! ------- +! The Purpose of this routine is to extract a slice of an horizontal +! field PARRAY along the x or y direction +! +!!** Method +!! ------ +! +! An MPI communicator with the processes corresponding to the +! subdomains intersecting with the slice is built. This +! communicator is then used to gather the whole slice (i.e. +! the global slice) on these procs. The global slice is then +! broadcasted on all procs that are not on the slice. +! +!! External +!! -------- +! Module MODE_TOOLS_ll +! LWEST_ll, LSOUTH_ll, LNORTH_ll, LEAST_ll +! GET_GLOBALDIMS_ll +! +!! Implicit Arguments +!! ------------------ +! Module MODD_STRUCTURE_ll +! type MODELSPLITTING_ll +! +! Module MODD_VAR_ll +! NPROC - Number of processors +! TCRRT_PROCONF - Current configuration for current model +! IP - Number of the local processor +! +! Module MODD_PARAMETERS_ll +! JPHEXT - halo size +! +!! Reference +!! --------- +! +! User Interface for the MesoNH Parallel Package +! +!! Author +!! ------ +! P. Kloos (CERFACS) +! +!! Modifications +!! ------------- +! Original 14 August 1998 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_PARAMETERS_ll, ONLY: JPHEXT + USE MODD_STRUCTURE_ll, ONLY: MODELSPLITTING_ll + USE MODD_VAR_ll, ONLY: NPROC, TCRRT_PROCONF, IP +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + REAL, DIMENSION(:,:), TARGET, INTENT(IN) :: PARRAY ! horizontal field + CHARACTER(LEN=1), INTENT(IN) :: HDIR ! direction ("X" or "Y") + INTEGER, INTENT(IN) :: KLOC ! coordinate of the slice + ! to extract + ! (in global coordinates) + REAL, DIMENSION(:), INTENT(OUT) :: PGLOBALSLICE ! output slice + INTEGER, OPTIONAL :: KB, KE ! begin and end positions of the + ! extracted slices + ! (global coordinates) + INTEGER, OPTIONAL :: KERR ! error code +! +!* 0.2 declarations of local variables +! + TYPE(MODELSPLITTING_ll), POINTER :: TZSPLIT + INTEGER :: IDIM, IDIM2 + INTEGER :: INUMPROC, IERR + INTEGER :: ILOC ! local location of the slice + INTEGER :: ICOUNT ! number of relevant procs (= those which are on the slice) + INTEGER :: ISIZE ! length of the local slice + INTEGER, DIMENSION(:), ALLOCATABLE :: IPROCS ! array of procs that are on + ! the slice + INTEGER, DIMENSION(:), ALLOCATABLE :: ISIZES ! length of the local slice + ! on all procs + INTEGER, DIMENSION(:), ALLOCATABLE :: IDISPL ! array of locations of the + ! procs in the slice + ! (for MPI_ALLGATHERV) + INTEGER :: IWRLD_GROUP ! world group + INTEGER :: IGROUP_GLOBALSLICE ! group for the proc on the slice + INTEGER :: ICOMM_GLOBALSLICE ! communicator for the proc on the slice + INTEGER :: IGROUP, ICOMM + INTEGER, DIMENSION(NPROC) :: IGLOBALSLICEPROC + INTEGER, DIMENSION(2) :: IOR, IEND, IORP, IENDP, IORE, IENDE ! splitting + INTEGER :: IWEST, IEAST, INORTH, ISOUTH + INTEGER :: IB, IE ! beginning and end of the local slice + INTEGER :: IDISPL1 ! beginning of the slice (global) + INTEGER :: J ! loop index + INTEGER :: IGLOBALSLICELENGTH ! length of the global slice + INTEGER, DIMENSION(2) :: IMAX ! maximum dimensions + REAL, DIMENSION(:), POINTER :: ZPTR +! +!------------------------------------------------------------------------------- +! +!* 1. INITIALISATIONS +! --------------- + IWEST=0; IEAST=0; INORTH=0; ISOUTH=0 + IB=0; IE=0 + IDISPL1=0 +! +!* 1.1 Get current splitting +! + IF (LWEST_ll()) IWEST=-1 + IF (LEAST_ll()) IEAST=1 + IF (LNORTH_ll()) INORTH=1 + IF (LSOUTH_ll()) ISOUTH=-1 + TZSPLIT => TCRRT_PROCONF%TSPLITS_B(IP) + IOR(1) = TZSPLIT%NXORP+IWEST + IOR(2) = TZSPLIT%NYORP+ISOUTH + IEND(1) = TZSPLIT%NXENDP+IEAST + IEND(2) = TZSPLIT%NYENDP+INORTH +! + IORP(1) = TZSPLIT%NXORP + IORP(2) = TZSPLIT%NYORP + IENDP(1) = TZSPLIT%NXENDP + IENDP(2) = TZSPLIT%NYENDP +! + IORE(1) = TZSPLIT%NXORE + IORE(2) = TZSPLIT%NYORE + IENDE(1) = TZSPLIT%NXENDE + IENDE(2) = TZSPLIT%NYENDE +! + IGLOBALSLICEPROC = 0 + CALL GET_GLOBALDIMS_ll(IMAX(1),IMAX(2)) + IMAX(:) = IMAX(:) + 2*JPHEXT +! +!* 1.2 Set dimension (1 for X and 2 for Y) +! + IDIM = IACHAR(HDIR)-IACHAR('X')+1 + IDIM2 = 3-IDIM ! IDIM's inverse +! +!* 1.4 Set beginning and end of local slice +! + IF (PRESENT(KB) .AND. PRESENT(KE)) THEN +! +!* Test the ranges +! + IF((KB < 1 ) .OR. (KE > IMAX(IDIM))) THEN +! +! Error +! + KERR = -1 + RETURN +! + ENDIF +! + IB = MAX(KB, IOR(IDIM)) - IORE(IDIM) + 1 + IE = MIN(KE, IEND(IDIM)) - IORE(IDIM) + 1 +! IDISPL1 = KB-1 ! old version + IDISPL1 = 0 + ELSE ! default : physical domain + IB = 1+JPHEXT + IE = IENDP(IDIM)-IORE(IDIM)+1 +! IDISPL1 = JPHEXT ! old version + IDISPL1 = 0 + ENDIF +! +!------------------------------------------------------------------------------- +! +!* 2. CREATE MPI COMMUNICATOR WITH THE PROCS ON THE SLICE +! --------------------------------------------------- +! +!* 2.1 Test if i am on the slice +! if so, INUMPROC = my MPI rank +! if not, INUMPROC = MPI_PROC_NULL +! + IF (KLOC >= IOR(IDIM2) .AND. KLOC <= IEND(IDIM2) .AND. IB<=IE) THEN +! +! Set local location +! + ILOC = KLOC-IORE(IDIM2)+1 +! +! Set relevant procs +! + INUMPROC = IP-1 +! +! Set lenght of the local slice +! + ISIZE = IE - IB + 1 +! +!* 2.2 Have ZPTR point to the slice +! + SELECT CASE(HDIR) + CASE("X") + ZPTR => PARRAY(IB:IE,ILOC) +! + CASE("Y") + ZPTR => PARRAY(ILOC,IB:IE) +! + CASE DEFAULT + call Print_msg( NVERB_FATAL, 'GEN', 'GET_1DGLOBALSLICE_ll', 'invalid HDIR dummy argument ('//hdir//')' ) +! + END SELECT +! + ELSE +! + INUMPROC = MPI_PROC_NULL +! + ENDIF +! +!* 2.3 Gather values of INUMPROC +! + CALL MPI_ALLGATHER( (/ INUMPROC /) , 1, MNHINT_MPI, IGLOBALSLICEPROC, 1, & + MNHINT_MPI, NMNH_COMM_WORLD, IERR) +! +!* 2.4 Get MPI world group +! + CALL MPI_COMM_GROUP(NMNH_COMM_WORLD, IWRLD_GROUP, IERR) +! +!* 2.5 Count number of proc that contain the slice +! + ICOUNT = COUNT(IGLOBALSLICEPROC.NE.MPI_PROC_NULL) +! +!* 2.6 Create MPI group with the procs that contain the slice +! + ALLOCATE(IPROCS(ICOUNT)) + IPROCS = PACK(IGLOBALSLICEPROC, MASK=IGLOBALSLICEPROC.NE.MPI_PROC_NULL) + CALL MPI_GROUP_INCL(IWRLD_GROUP, ICOUNT, IPROCS, IGROUP_GLOBALSLICE, IERR) +! +!* 2.7 Create MPI communicator associated to new group +! + CALL MPI_COMM_CREATE(NMNH_COMM_WORLD, IGROUP_GLOBALSLICE, & + ICOMM_GLOBALSLICE, IERR) +! +!------------------------------------------------------------------------------- +! +!* 3. GATHER THE LOCAL SLICES ON ALL PROCS THAT CONTAIN THE SLICE +! ----------------------------------------------------------- +! +!* 3.1 Have the length of the local slice on each proc known +! by all procs on the global slice +! + IF (ICOMM_GLOBALSLICE .NE. MPI_COMM_NULL) THEN +! + ALLOCATE(ISIZES(ICOUNT)) + ISIZES = 0 + CALL MPI_ALLGATHER( (/ ISIZE /) , 1, MNHINT_MPI, ISIZES, 1, MNHINT_MPI, & + ICOMM_GLOBALSLICE, IERR) +! +!* 3.2 Compute array of displacements in the slice relative to the +! origin of the global domain +! + ALLOCATE(IDISPL(ICOUNT+1)) + IDISPL(1) = IDISPL1 + DO J=2, ICOUNT+1 + IDISPL(J) = IDISPL(J-1)+ISIZES(J-1) + ENDDO + IGLOBALSLICELENGTH = IDISPL(ICOUNT+1) - IDISPL(1) +! +!* 3.3 Have the values of the local slice on each proc known +! by all procs on the global slice +! + CALL MPI_ALLGATHERV(ZPTR, ISIZE, MNHREAL_MPI, PGLOBALSLICE, & + ISIZES, IDISPL, MNHREAL_MPI, ICOMM_GLOBALSLICE, IERR) +! +!* 3.4 Delete slice communicator +! + CALL MPI_COMM_FREE(ICOMM_GLOBALSLICE, IERR) +! + DEALLOCATE(ISIZES, IDISPL) +! + ENDIF +! +!* 3.5 Delete slice group +! + CALL MPI_GROUP_FREE(IGROUP_GLOBALSLICE, IERR) +! +!------------------------------------------------------------------------------- +! +!* 4. BROADCAST THE SLICE ON ALL PROCS THAT ARE NOT ON THE SLICE +! ---------------------------------------------------------- +! +!* 4.1 Create communicator with the first proc +!* on the slice and the procs that are not on the +!* slice +! + CALL MPI_GROUP_EXCL(IWRLD_GROUP, ICOUNT-1, IPROCS(2:2), IGROUP, IERR) + CALL MPI_COMM_CREATE(NMNH_COMM_WORLD, IGROUP, ICOMM, IERR) +! +!* 4.2 Broadcast the slice +! + IF (ICOMM .NE. MPI_COMM_NULL) THEN +! + CALL MPI_BCAST(IGLOBALSLICELENGTH, 1, MNHINT_MPI, IPROCS(1), ICOMM, IERR) + CALL MPI_BCAST(PGLOBALSLICE(IDISPL1+1), IGLOBALSLICELENGTH, MNHREAL_MPI, & + IPROCS(1), ICOMM, IERR) +! + CALL MPI_COMM_FREE(ICOMM, IERR) + CALL MPI_GROUP_FREE(IGROUP, IERR) +! + ENDIF +! + CALL MPI_GROUP_FREE(IWRLD_GROUP, IERR) +! + IF (PRESENT(KERR)) KERR=IERR +! + DEALLOCATE(IPROCS) +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE GET_1DGLOBALSLICE_ll +! +! ################################################################### + SUBROUTINE GET_2DGLOBALSLICE_ll(PARRAY, HDIR, KLOC, PGLOBALSLICE, & + KB, KE, KKB, KKE, KERR) +! ################################################################### +! +!! Purpose +!! ------- +! The Purpose of this routine is to extract a slice of +! 3D field PARRAY along the x or y direction +! +!!** Method +!! ------ +! +! An MPI communicator with the processes corresponding to the +! subdomains intersecting with the slice is built. This +! communicator is then used to gather the whole slice (i.e. +! the global slice) on these procs. The global slice is then +! broadcasted on all procs that are not on the slice. +! +!! External +!! -------- +! Module MODE_TOOLS_ll +! LWEST_ll, LSOUTH_ll, LNORTH_ll, LEAST_ll +! GET_GLOBALDIMS_ll +! +!! Implicit Arguments +!! ------------------ +! Module MODD_STRUCTURE_ll +! type MODELSPLITTING_ll +! +! Module MODD_VAR_ll +! NPROC - Number of processors +! TCRRT_PROCONF - Current configuration for current model +! IP - Number of the local processor +! +! Module MODD_PARAMETERS_ll +! JPHEXT, JPVEXT - halo size +! +!! Reference +!! --------- +! +! User Interface for the MesoNH Parallel Package +! +!! Author +!! ------ +! P. Kloos (CERFACS) +! +!! Modifications +!! ------------- +! Original 14 August 1998 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_PARAMETERS_ll, ONLY: JPHEXT, JPVEXT + USE MODD_STRUCTURE_ll, ONLY: MODELSPLITTING_ll + USE MODD_VAR_ll, ONLY: NPROC, TCRRT_PROCONF, IP +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + REAL, DIMENSION(:,:,:), TARGET, INTENT(IN) :: PARRAY ! horizontal field + CHARACTER(LEN=1), INTENT(IN) :: HDIR ! direction ("X" or "Y") + INTEGER, INTENT(IN) :: KLOC ! coordinate of the slice + ! to extract + ! (in global coordinates) + REAL, DIMENSION(:,:), INTENT(OUT) :: PGLOBALSLICE ! output slice + INTEGER, OPTIONAL :: KB, KE ! begin and end positions of the + ! extracted slices in the HDIR + ! direction + INTEGER, OPTIONAL :: KKB, KKE ! begin and end positions of the + ! extracted slices in the vertical + ! direction + INTEGER, OPTIONAL :: KERR ! error code +! +!* 0.2 declarations of local variables +! + TYPE(MODELSPLITTING_ll), POINTER :: TZSPLIT + INTEGER :: IDIM, IDIM2 + INTEGER :: INUMPROC, IERR + INTEGER :: ILOC ! local location of the slice + INTEGER :: ICOUNT ! number of relevant procs (= those which are on the slice) + INTEGER :: ISIZE ! length of the local slice + INTEGER, DIMENSION(:), ALLOCATABLE :: IPROCS ! array of procs that are on + ! the slice + INTEGER, DIMENSION(:), ALLOCATABLE :: ISIZES ! length of the local slice + ! on all procs + INTEGER, DIMENSION(:), ALLOCATABLE :: IDISPL ! array of locations of the + ! procs in the slice + ! (for MPI_ALLGATHERV) + INTEGER :: IWRLD_GROUP ! world group + INTEGER :: IGROUP_GLOBALSLICE ! group for the proc on the slice + INTEGER :: ICOMM_GLOBALSLICE ! communicator for the proc on the slice + INTEGER :: IGROUP, ICOMM + INTEGER, DIMENSION(NPROC) :: IGLOBALSLICEPROC + INTEGER, DIMENSION(2) :: IOR, IEND, IORP, IENDP, IORE, IENDE ! splitting + INTEGER :: IWEST, IEAST, INORTH, ISOUTH + INTEGER :: IB, IE ! beginning and end of the local slice + INTEGER :: IDISPL1 ! beginning of the slice (global) + INTEGER :: J ! loop index + INTEGER :: IGLOBALSLICELENGTH ! length of the global slice + INTEGER :: IGLOBALSLICEHEIGHT + INTEGER :: JK + INTEGER, DIMENSION(2) :: IMAX ! maximum dimensions + REAL, DIMENSION(:,:), ALLOCATABLE :: ZPTR +! +!------------------------------------------------------------------------------- +! +!* 1. INITIALISATIONS +! --------------- + IWEST=0; IEAST=0; INORTH=0; ISOUTH=0 + IB=0; IE=0 + IDISPL1=0 +! +!* 1.1 Get current splitting +! + IF (LWEST_ll()) IWEST=-1 + IF (LEAST_ll()) IEAST=1 + IF (LNORTH_ll()) INORTH=1 + IF (LSOUTH_ll()) ISOUTH=-1 + TZSPLIT => TCRRT_PROCONF%TSPLITS_B(IP) + IOR(1) = TZSPLIT%NXORP+IWEST + IOR(2) = TZSPLIT%NYORP+ISOUTH + IEND(1) = TZSPLIT%NXENDP+IEAST + IEND(2) = TZSPLIT%NYENDP+INORTH +! + IORP(1) = TZSPLIT%NXORP + IORP(2) = TZSPLIT%NYORP + IENDP(1) = TZSPLIT%NXENDP + IENDP(2) = TZSPLIT%NYENDP +! + IORE(1) = TZSPLIT%NXORE + IORE(2) = TZSPLIT%NYORE + IENDE(1) = TZSPLIT%NXENDE + IENDE(2) = TZSPLIT%NYENDE +! + IGLOBALSLICEPROC = 0 + CALL GET_GLOBALDIMS_ll(IMAX(1),IMAX(2)) + IMAX(:) = IMAX(:) + 2*JPHEXT +! +!* 1.2 Set dimension (1 for X and 2 for Y) +! + IDIM = IACHAR(HDIR)-IACHAR('X')+1 + IDIM2 = 3-IDIM ! IDIM's inverse +! + IGLOBALSLICEHEIGHT = KKE - KKB + 1 +! +!* 1.4 Set beginning and end of local slice +! + IF (.NOT.PRESENT(KKB) .AND. .NOT.PRESENT(KKE)) THEN + KKB = 1 + JPVEXT + KKE = SIZE(PARRAY,3) - JPVEXT + ENDIF +! + IF (PRESENT(KB) .AND. PRESENT(KE)) THEN +! +!* Test the ranges +! + IF((KB < 1 ) .OR. (KE > IMAX(IDIM))) THEN +! +! Error +! + KERR = -1 + RETURN +! + ENDIF +! + IB = MAX(KB, IOR(IDIM)) - IORE(IDIM) + 1 + IE = MIN(KE, IEND(IDIM)) - IORE(IDIM) + 1 +! IDISPL1 = KB-1 ! old version + IDISPL1 = 0 + ELSE ! default : physical domain + IB = 1+JPHEXT + IE = IENDP(IDIM)-IORE(IDIM)+1 +! IDISPL1 = JPHEXT ! old version + IDISPL1 = 0 + ENDIF +! +!------------------------------------------------------------------------------- +! +!* 2. CREATE MPI COMMUNICATOR WITH THE PROCS ON THE SLICE +! --------------------------------------------------- +! +!* 2.1 Test if i am on the slice +! if so, INUMPROC = my MPI rank +! if not, INUMPROC = MPI_PROC_NULL +! + IF (KLOC >= IOR(IDIM2) .AND. KLOC <= IEND(IDIM2) .AND. IB<=IE) THEN +! +! Set local location +! + ILOC = KLOC-IORE(IDIM2)+1 +! +! Set relevant procs +! + INUMPROC = IP-1 +! +! Set lenght of the local slice +! + ISIZE = IE - IB + 1 +! +!* 2.2 Have ZPTR point to the slice +! + SELECT CASE(HDIR) + CASE("X") + ALLOCATE(ZPTR(IE-IB+1, IGLOBALSLICEHEIGHT)) + ZPTR = PARRAY(IB:IE,ILOC,KKB:KKE) +! + CASE("Y") + ALLOCATE(ZPTR(IE-IB+1, IGLOBALSLICEHEIGHT)) + ZPTR = PARRAY(ILOC,IB:IE,KKB:KKE) +! + CASE DEFAULT + call Print_msg( NVERB_FATAL, 'GEN', 'GET_2DGLOBALSLICE_ll', 'invalid HDIR dummy argument ('//hdir//')' ) +! + END SELECT +! + ELSE +! + INUMPROC = MPI_PROC_NULL +! + ENDIF +! +!* 2.3 Gather values of INUMPROC +! + CALL MPI_ALLGATHER( (/ INUMPROC /) , 1, MNHINT_MPI, IGLOBALSLICEPROC, 1, & + MNHINT_MPI, NMNH_COMM_WORLD, IERR) +! +!* 2.4 Get MPI world group +! + CALL MPI_COMM_GROUP(NMNH_COMM_WORLD, IWRLD_GROUP, IERR) +! +!* 2.5 Count number of proc that contain the slice +! + ICOUNT = COUNT(IGLOBALSLICEPROC.NE.MPI_PROC_NULL) +! +!* 2.6 Create MPI group with the procs that contain the slice +! + ALLOCATE(IPROCS(ICOUNT+1)) + IPROCS(1:ICOUNT) = PACK(IGLOBALSLICEPROC, MASK=IGLOBALSLICEPROC.NE.MPI_PROC_NULL) + IPROCS(ICOUNT+1) = MPI_PROC_NULL + PRINT *,'SIZE(IPROCS) = ',SIZE(IPROCS) + CALL MPI_GROUP_INCL(IWRLD_GROUP, ICOUNT, IPROCS, IGROUP_GLOBALSLICE, IERR) +! +!* 2.7 Create MPI communicator associated to new group +! + CALL MPI_COMM_CREATE(NMNH_COMM_WORLD, IGROUP_GLOBALSLICE, & + ICOMM_GLOBALSLICE, IERR) +! +!------------------------------------------------------------------------------- +! +!* 3. GATHER THE LOCAL SLICES ON ALL PROCS THAT CONTAIN THE SLICE +! ----------------------------------------------------------- +! +!* 3.1 Have the length of the local slice on each proc known +! by all procs on the global slice +! + IF (ICOMM_GLOBALSLICE .NE. MPI_COMM_NULL) THEN +! + ALLOCATE(ISIZES(ICOUNT)) + ISIZES = 0 + CALL MPI_ALLGATHER( (/ ISIZE /) , 1, MNHINT_MPI, ISIZES, 1, MNHINT_MPI, & + ICOMM_GLOBALSLICE, IERR) +! +!* 3.2 Compute array of displacements in the slice relative to the +! origin of the global domain +! + ALLOCATE(IDISPL(ICOUNT+1)) + IDISPL(1) = IDISPL1 + DO J=2, ICOUNT+1 + IDISPL(J) = IDISPL(J-1)+ISIZES(J-1) + ENDDO + IGLOBALSLICELENGTH = IDISPL(ICOUNT+1) - IDISPL(1) +! +! +!* 3.3 Have the values of the local slice on each proc known +! by all procs on the global slice +! + DO JK = 1, IGLOBALSLICEHEIGHT + CALL MPI_ALLGATHERV(ZPTR(1,JK), ISIZE, MNHREAL_MPI, & + PGLOBALSLICE(1,JK), ISIZES, IDISPL, & + MNHREAL_MPI, ICOMM_GLOBALSLICE, IERR) + ENDDO +! +!* 3.4 Delete slice communicator +! + CALL MPI_COMM_FREE(ICOMM_GLOBALSLICE, IERR) +! + DEALLOCATE(ISIZES, IDISPL) + DEALLOCATE(ZPTR) +! + ENDIF +! +!* 3.5 Delete slice group +! + CALL MPI_GROUP_FREE(IGROUP_GLOBALSLICE, IERR) +! +!------------------------------------------------------------------------------- +! +!* 4. BROADCAST THE SLICE ON ALL PROCS THAT ARE NOT ON THE SLICE +! ---------------------------------------------------------- +! +!* 4.1 Create communicator with the first proc +!* on the slice and the procs that are not on the +!* slice +! + CALL MPI_GROUP_EXCL(IWRLD_GROUP, ICOUNT-1, IPROCS(2:2), IGROUP, IERR) + CALL MPI_COMM_CREATE(NMNH_COMM_WORLD, IGROUP, ICOMM, IERR) +! +!* 4.2 Broadcast the slice +! + IF (ICOMM .NE. MPI_COMM_NULL) THEN +! + CALL MPI_BCAST(IGLOBALSLICELENGTH, 1, MNHINT_MPI, IPROCS(1), ICOMM, IERR) + DO JK = 1, IGLOBALSLICEHEIGHT + CALL MPI_BCAST(PGLOBALSLICE(1,JK), IGLOBALSLICELENGTH, MNHREAL_MPI, & + IPROCS(1), ICOMM, IERR) + ENDDO +! + CALL MPI_COMM_FREE(ICOMM, IERR) +! + ENDIF +! + CALL MPI_GROUP_FREE(IGROUP, IERR) +! +! CALL MPI_GROUP_FREE(IWRLD_GROUP, IERR) +! + IF (PRESENT(KERR)) KERR=IERR +! + DEALLOCATE(IPROCS) +! + END SUBROUTINE GET_2DGLOBALSLICE_ll +! +! ################################################################### +! SUBROUTINE GET_SLICE_ll(PARRAY, HDIR, KLOC, PSLICE, KB, KE, KERR) +! ################################################################### +! +!! PURPOSE +!! ------- +! The purpose of this routine is to get a slice of the +! domain in the x or y direction. +! +! ################################################################### + SUBROUTINE GET_1DSLICE_ll(PARRAY, HDIR, KLOC, PSLICE, KB, KE, KERR) +! ################################################################### +! +!! Purpose +!! ------- +! The Purpose of this routine is to extract a slice of an horizontal +! field PARRAY along the x or y direction +! +!!** Method +!! ------ +!! +! An MPI communicator with the processes corresponding to the +! subdomains intersecting with the slice is built. This +! communicator is then used to gather the whole slice (i.e. +! the global slice) on these procs. The global slice is then +! broadcasted on all procs that are not on the slice. +! +!! External +!! -------- +! Module MODE_TOOLS_ll +! LWEST_ll, LSOUTH_ll, LNORTH_ll, LEAST_ll +! GET_GLOBALDIMS_ll +! +!! Implicit Arguments +!! ------------------ +! Module MODD_STRUCTURE_ll +! type MODELSPLITTING_ll +! +! Module MODD_VAR_ll +! NPROC - Number of processors +! TCRRT_PROCONF - Current configuration for current model +! IP - Number of the local processor +! +! Module MODD_PARAMETERS_ll +! JPHEXT, JPVEXT - halo size +! +!! Reference +!! --------- +! User Interface for the MesoNH Parallel Package +! +!! Author +!! ------ +! P. Kloos (CERFACS) +! +!! Modifications +!! ------------- +! Original 14 August 1998 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_PARAMETERS_ll, ONLY: JPHEXT + USE MODD_STRUCTURE_ll, ONLY: MODELSPLITTING_ll + USE MODD_VAR_ll, ONLY: NPROC, TCRRT_PROCONF, IP +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + REAL, DIMENSION(:,:), TARGET, INTENT(IN) :: PARRAY ! horizontal field + CHARACTER(LEN=1), INTENT(IN) :: HDIR ! direction ("X" or "Y") + INTEGER, INTENT(IN) :: KLOC ! coordinate of the slice to + ! extract (in global coordinates) + REAL, DIMENSION(:), INTENT(OUT) :: PSLICE ! output slice + INTEGER, OPTIONAL :: KB, KE ! begin and end positions of the + ! extracted slices + ! (local coordinates) + INTEGER, OPTIONAL :: KERR ! error code + +! +!* 0.2 declarations of local variables +! + TYPE(MODELSPLITTING_ll), POINTER :: TZSPLIT + INTEGER :: IDIM, IDIM2 + INTEGER :: INUMPROC, IERR + INTEGER :: ILOC ! local location of the slice + INTEGER :: ICOUNT ! number of relevant procs (= those which are on the slice) + INTEGER :: ISIZE ! length of the local slice + INTEGER, DIMENSION(:), ALLOCATABLE :: IPROCS ! array of procs that are on + ! the slice + INTEGER, DIMENSION(:), ALLOCATABLE :: ISIZES ! length of the local slice + ! on all procs + INTEGER, DIMENSION(:), ALLOCATABLE :: IDISPL ! array of locations of the + ! procs in the slice + ! (for MPI_ALLGATHERV) + + REAL, DIMENSION(:), ALLOCATABLE :: ITOTALSLICE + + INTEGER :: IWRLD_GROUP ! world group + INTEGER :: IGROUP_SLICE ! group for the proc on the slice + INTEGER :: ICOMM_SLICE ! communicator for the proc on the slice + INTEGER :: IGROUP, ICOMM + INTEGER, DIMENSION(NPROC) :: ISLICEPROC + INTEGER, DIMENSION(2) :: IOR, IEND, IORP, IENDP, IORE, IENDE ! splitting + INTEGER :: IWEST, IEAST, INORTH, ISOUTH + INTEGER :: IB, IE ! beginning and end of the local slice + INTEGER :: IDISPL1 ! beginning of the slice (global) + INTEGER :: J ! loop index + INTEGER :: ISLICELENGTH ! length of the global slice + INTEGER, DIMENSION(2) :: IMAX ! maximum dimensions + REAL, DIMENSION(:), POINTER :: ZPTR + INTEGER :: IRES +! + INTEGER :: IIB, IIE, IJB, IJE +! +!------------------------------------------------------------------------------- +! +!* 1. INITIALISATIONS +! --------------- + IWEST=0; IEAST=0; INORTH=0; ISOUTH=0 + IB=0; IE=0 + IDISPL1=0 +! +!* 1.1 Get current splitting +! + IF (LWEST_ll()) IWEST=-JPHEXT ! -1 + IF (LEAST_ll()) IEAST=JPHEXT ! 1 + IF (LNORTH_ll()) INORTH=JPHEXT ! 1 + IF (LSOUTH_ll()) ISOUTH=-JPHEXT ! -1 + TZSPLIT => TCRRT_PROCONF%TSPLITS_B(IP) + IOR(1) = TZSPLIT%NXORP+IWEST + IOR(2) = TZSPLIT%NYORP+ISOUTH + IEND(1) = TZSPLIT%NXENDP+IEAST + IEND(2) = TZSPLIT%NYENDP+INORTH +! + CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +! + IIB = IIB+IWEST + IJB = IJB+ISOUTH + IIE = IIE+IEAST + IJE = IJE+INORTH +! + IORP(1) = TZSPLIT%NXORP + IORP(2) = TZSPLIT%NYORP + IENDP(1) = TZSPLIT%NXENDP + IENDP(2) = TZSPLIT%NYENDP +! + IORE(1) = TZSPLIT%NXORE + IORE(2) = TZSPLIT%NYORE + IENDE(1) = TZSPLIT%NXENDE + IENDE(2) = TZSPLIT%NYENDE +! + ISLICEPROC = 0 + CALL GET_GLOBALDIMS_ll(IMAX(1),IMAX(2)) + IMAX(:) = IMAX(:) + 2*JPHEXT +! +!* 1.2 Set dimension (1 for X and 2 for Y) +! + IDIM = IACHAR(HDIR)-IACHAR('X')+1 + IDIM2 = 3-IDIM ! IDIM's inverse + + ALLOCATE(ITOTALSLICE(IMAX(IDIM))) + +! +!* 1.4 Set beginning and end of local slice +! + IF (PRESENT(KB) .AND. PRESENT(KE)) THEN +! +!* Test the ranges +! + IF((KB < 1 ) .OR. (KE > IENDE(IDIM))) THEN +! +! Error +! + KERR = -1 + RETURN +! + ENDIF +! + IB = KB + IE = KE +! +!* Correction in case the user has specified the +!* extended subdomain (so that the halo overlapping +!* between two processors won't be gathered twice). +! + IF (IB == 1) IB = IOR(IDIM)-IORE(IDIM)+1 + IF (IE == IENDE(IDIM)-IORE(IDIM)+1) IE = IEND(IDIM)-IORE(IDIM)+1 +! +! IDISPL1 = KB-1 ! old version + IDISPL1 = 0 + ELSE ! default : physical domain + IB = 1+JPHEXT + IE = IENDP(IDIM)-IORE(IDIM)+1 +! IDISPL1 = JPHEXT ! old version + IDISPL1 = 0 + ENDIF +! +!------------------------------------------------------------------------------- +! +!* 2. CREATE MPI COMMUNICATOR WITH THE PROCS ON THE SLICE +! --------------------------------------------------- +! +!* 2.1 Test if i am on the slice +! if so, INUMPROC = my MPI rank +! if not, INUMPROC = MPI_PROC_NULL +! +! + IF (KLOC >= IOR(IDIM2) .AND. KLOC <= IEND(IDIM2) .AND. IB<=IE) THEN +! +! Set local location +! + ILOC = KLOC-IORE(IDIM2)+1 +! +! Set relevant procs +! + INUMPROC = IP-1 +! +! Set lenght of the local slice +! +! ISIZE = IENDE(IDIM) - IORE(IDIM) + 1 +! +!* 2.2 Have ZPTR point to the slice +! + SELECT CASE(HDIR) + CASE("X") + ISIZE = IIE - IIB + 1 + ZPTR => PARRAY(IIB:IIE,ILOC) +! + CASE("Y") + ISIZE = IJE -IJB + 1 + ZPTR => PARRAY(ILOC,IJB:IJE) +! + CASE DEFAULT + call Print_msg( NVERB_FATAL, 'GEN', 'GET_1DSLICE_ll', 'invalid HDIR dummy argument ('//hdir//')' ) +! + END SELECT +! + ELSE +! + INUMPROC = MPI_PROC_NULL +! + ENDIF +! +!* 2.3 Gather values of INUMPROC +! + CALL MPI_ALLGATHER( (/ INUMPROC /) , 1, MNHINT_MPI, ISLICEPROC, 1, MNHINT_MPI, & + NMNH_COMM_WORLD, IERR) +! +!* 2.4 Get MPI world group +! + CALL MPI_COMM_GROUP(NMNH_COMM_WORLD, IWRLD_GROUP, IERR) +! +!* 2.5 Count number of proc that contain the slice +! + ICOUNT = COUNT(ISLICEPROC.NE.MPI_PROC_NULL) +! +!* 2.6 Create MPI group with the procs that contain the slice +! + ALLOCATE(IPROCS(ICOUNT+1)) + IPROCS(1:ICOUNT) = PACK(ISLICEPROC, MASK=ISLICEPROC.NE.MPI_PROC_NULL) + IPROCS(ICOUNT+1) = MPI_PROC_NULL + CALL MPI_GROUP_INCL(IWRLD_GROUP, ICOUNT, IPROCS, IGROUP_SLICE, IERR) +! +!* 2.7 Create MPI communicator associated to new group +! + CALL MPI_COMM_CREATE(NMNH_COMM_WORLD, IGROUP_SLICE, ICOMM_SLICE, IERR) +! +!------------------------------------------------------------------------------- +! +!* 3. GATHER THE LOCAL SLICES ON ALL PROCS THAT CONTAIN THE SLICE +! ----------------------------------------------------------- +! +!* 3.1 Have the length of the local slice on each proc known +! by all procs on the global slice +! + IF (ICOMM_SLICE .NE. MPI_COMM_NULL) THEN +! + ALLOCATE(ISIZES(ICOUNT)) + ISIZES = 0 + CALL MPI_ALLGATHER( (/ ISIZE /) , 1, MNHINT_MPI, ISIZES, 1, MNHINT_MPI, & + ICOMM_SLICE, IERR) +! +!* 3.2 Compute array of displacements in the slice relative to the +! origin of the global domain +! + ALLOCATE(IDISPL(ICOUNT+1)) + IDISPL(1) = IDISPL1 + DO J=2, ICOUNT+1 + IDISPL(J) = IDISPL(J-1)+ISIZES(J-1) + ENDDO + ISLICELENGTH = IDISPL(ICOUNT+1) - IDISPL(1) +! +!* 3.3 Have the values of the local slice on each proc known +! by all procs on the global slice +! + CALL MPI_ALLGATHERV(ZPTR, ISIZE, MNHREAL_MPI, ITOTALSLICE, ISIZES, & + IDISPL, MNHREAL_MPI, ICOMM_SLICE, IERR) +! + DEALLOCATE(ISIZES, IDISPL) +! +!* 3.4 Delete slice communicator +! + CALL MPI_COMM_FREE(ICOMM_SLICE, IERR) +! + ENDIF +! +!* 3.5 Delete slice group +! + CALL MPI_GROUP_FREE(IGROUP_SLICE, IERR) +! +!------------------------------------------------------------------------------- +! +!* 4. BROADCAST THE SLICE ON ALL PROCS THAT ARE NOT ON THE SLICE +! ---------------------------------------------------------- +! +!* 4.1 Create communicator with the first proc +!* on the slice and the procs that are not on the +!* slice +! + CALL MPI_GROUP_EXCL(IWRLD_GROUP, ICOUNT-1, IPROCS(2:2), IGROUP, IERR) + + CALL MPI_COMM_CREATE(NMNH_COMM_WORLD, IGROUP, ICOMM, IERR) +! CALL MPI_COMM_COMPARE(ICOMM, MPI_COMM_NULL, IRES, IERR) +! +!* 4.2 Broadcast the slice +! + IF (ICOMM .NE. MPI_COMM_NULL) THEN +! + CALL MPI_BCAST(ISLICELENGTH, 1, MNHINT_MPI, IPROCS(1), ICOMM, IERR) + CALL MPI_BCAST(ITOTALSLICE, ISLICELENGTH, MNHREAL_MPI, & + IPROCS(1), ICOMM, IERR) + CALL MPI_COMM_FREE(ICOMM, IERR) + ENDIF +! + PSLICE(1:(KE-KB+1)) = & + ITOTALSLICE((IORE(IDIM) + KB - 1): (IORE(IDIM) + KE - 1)) + + CALL MPI_GROUP_FREE(IGROUP, IERR) + CALL MPI_GROUP_FREE(IWRLD_GROUP, IERR) +! + IF (PRESENT(KERR)) KERR=IERR +! + DEALLOCATE(IPROCS) + DEALLOCATE(ITOTALSLICE) +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE GET_1DSLICE_ll +! +! ####################################################### + SUBROUTINE GET_2DSLICE_ll(PARRAY, HDIR, KLOC, PSLICE, & + KB, KE, KKB, KKE, KERR) +! ####################################################### +! +!! Purpose +!! ------- +! The Purpose of this routine is to extract a slice of +! 3D field PARRAY along the x or y direction +! +!!** Method +!! ------ +!! +! An MPI communicator with the processes corresponding to the +! subdomains intersecting with the slice is built. This +! communicator is then used to gather the whole slice (i.e. +! the global slice) on these procs. The global slice is then +! broadcasted on all procs that are not on the slice. +! +!! External +!! -------- +! Module MODE_TOOLS_ll +! LWEST_ll, LSOUTH_ll, LNORTH_ll, LEAST_ll +! GET_GLOBALDIMS_ll +! +!! Implicit Arguments +!! ------------------ +! Module MODD_STRUCTURE_ll +! type MODELSPLITTING_ll +! +! Module MODD_VAR_ll +! NPROC - Number of processors +! TCRRT_PROCONF - Current configuration for current model +! IP - Number of the local processor +! +! Module MODD_PARAMETERS_ll +! JPHEXT, JPVEXT - halo size +! +!! Reference +!! --------- +! User Interface for the MesoNH Parallel Package +! +!! Author +!! ------ +! P. Kloos (CERFACS) +! +!! Modifications +!! ------------- +! Original 14 August 1998 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_PARAMETERS_ll, ONLY: JPHEXT, JPVEXT + USE MODD_STRUCTURE_ll, ONLY: MODELSPLITTING_ll + USE MODD_VAR_ll, ONLY: NPROC, TCRRT_PROCONF, IP +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + REAL, DIMENSION(:,:,:), TARGET, INTENT(IN) :: PARRAY ! horizontal field + CHARACTER(LEN=1), INTENT(IN) :: HDIR ! direction ("X" or "Y") + INTEGER, INTENT(IN) :: KLOC ! coordinate of the slice to + ! extract (in global coordinates) + REAL, DIMENSION(:,:), INTENT(OUT) :: PSLICE ! output slice + INTEGER, OPTIONAL :: KB, KE ! begin and end positions of the + ! extracted slices in the HDIR + ! direction + INTEGER, OPTIONAL :: KKB, KKE ! begin and end positions of the + ! extracted slices in the vertical ! direction + INTEGER, OPTIONAL :: KERR ! error code + +! +!* 0.2 declarations of local variables +! + TYPE(MODELSPLITTING_ll), POINTER :: TZSPLIT + INTEGER :: IDIM, IDIM2 + INTEGER :: INUMPROC, IERR + INTEGER :: ILOC ! local location of the slice + INTEGER :: ICOUNT ! number of relevant procs (= those which are on the slice) + INTEGER :: ISIZE ! length of the local slice + INTEGER, DIMENSION(:), ALLOCATABLE :: IPROCS ! array of procs that are on + ! the slice + INTEGER, DIMENSION(:), ALLOCATABLE :: ISIZES ! length of the local slice + ! on all procs + INTEGER, DIMENSION(:), ALLOCATABLE :: IDISPL ! array of locations of the + ! procs in the slice + ! (for MPI_ALLGATHERV) +! + REAL, DIMENSION(:,:), ALLOCATABLE :: ITOTALSLICE +! + INTEGER :: IWRLD_GROUP ! world group + INTEGER :: IGROUP_SLICE ! group for the proc on the slice + INTEGER :: ICOMM_SLICE ! communicator for the proc on the slice + INTEGER :: IGROUP, ICOMM + INTEGER, DIMENSION(NPROC) :: ISLICEPROC + INTEGER, DIMENSION(2) :: IOR, IEND, IORP, IENDP, IORE, IENDE ! splitting + INTEGER :: IWEST, IEAST, INORTH, ISOUTH + INTEGER :: IB, IE ! beginning and end of the local slice + INTEGER :: IDISPL1 ! beginning of the slice (global) + INTEGER :: J ! loop index + INTEGER :: ISLICELENGTH ! length of the global slice + INTEGER :: ISLICEHEIGHT + INTEGER :: JK + INTEGER, DIMENSION(2) :: IMAX ! maximum dimensions + REAL, DIMENSION(:,:), ALLOCATABLE :: ZPTR +! + INTEGER :: IIB, IIE, IJB, IJE +! +!------------------------------------------------------------------------------- +! +!* 1. INITIALISATIONS +! --------------- + IWEST=0; IEAST=0; INORTH=0; ISOUTH=0 + IB=0; IE=0 + IDISPL1=0 +! +!* 1.1 Get current splitting +! + IF (LWEST_ll()) IWEST=-1 + IF (LEAST_ll()) IEAST=1 + IF (LNORTH_ll()) INORTH=1 + IF (LSOUTH_ll()) ISOUTH=-1 + + TZSPLIT => TCRRT_PROCONF%TSPLITS_B(IP) + IOR(1) = TZSPLIT%NXORP+IWEST + IOR(2) = TZSPLIT%NYORP+ISOUTH + IEND(1) = TZSPLIT%NXENDP+IEAST + IEND(2) = TZSPLIT%NYENDP+INORTH +! + IORP(1) = TZSPLIT%NXORP + IORP(2) = TZSPLIT%NYORP + IENDP(1) = TZSPLIT%NXENDP + IENDP(2) = TZSPLIT%NYENDP +! + IORE(1) = TZSPLIT%NXORE + IORE(2) = TZSPLIT%NYORE + IENDE(1) = TZSPLIT%NXENDE + IENDE(2) = TZSPLIT%NYENDE +! + CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +! + IIB = IIB+IWEST + IJB = IJB+ISOUTH + IIE = IIE+IEAST + IJE = IJE+INORTH +! + ISLICEPROC = 0 + CALL GET_GLOBALDIMS_ll(IMAX(1),IMAX(2)) + IMAX(:) = IMAX(:) + 2*JPHEXT +! +!* 1.2 Set dimension (1 for X and 2 for Y) +! + IDIM = IACHAR(HDIR)-IACHAR('X')+1 + IDIM2 = 3-IDIM ! IDIM's inverse +! + ISLICEHEIGHT = KKE - KKB + 1 + ALLOCATE(ITOTALSLICE(IMAX(IDIM),ISLICEHEIGHT)) +! +!* 1.4 Set beginning and end of local slice +! + IF (.NOT.PRESENT(KKB) .AND. .NOT.PRESENT(KKE)) THEN + KKB = 1 + JPVEXT + KKE = SIZE(PARRAY,3) - JPVEXT + ENDIF +! + IF (PRESENT(KB) .AND. PRESENT(KE)) THEN +! +!* Test the ranges +! + IF((KB < 1 ) .OR. (KE > IMAX(IDIM))) THEN +! +! Error +! + KERR = -1 + RETURN +! + ENDIF +! + IB = KB + IE = KE +! +!* Correction in case the user has specified the +!* extended subdomain (so that the halo overlapping +!* between two processors won't be gathered twice). +! + IF (IB == 1) IB = IOR(IDIM)-IORE(IDIM)+1 + IF (IE == IENDE(IDIM)-IORE(IDIM)+1) IE = IEND(IDIM)-IORE(IDIM)+1 +! +! IDISPL1 = KB-1 ! old version + IDISPL1 = 0 + ELSE ! default : physical domain + IB = 1+JPHEXT + IE = IENDP(IDIM)-IORE(IDIM)+1 +! IDISPL1 = JPHEXT ! old version + IDISPL1 = 0 + ENDIF +! +!------------------------------------------------------------------------------- +! +!* 2. CREATE MPI COMMUNICATOR WITH THE PROCS ON THE SLICE +! --------------------------------------------------- +! +!* 2.1 Test if i am on the slice +! if so, INUMPROC = my MPI rank +! if not, INUMPROC = MPI_PROC_NULL +! + IF (KLOC >= IOR(IDIM2) .AND. KLOC <= IEND(IDIM2) .AND. IB<=IE) THEN +! +! Set local location +! + ILOC = KLOC-IORE(IDIM2)+1 +! +! Set relevant procs +! + INUMPROC = IP-1 +! +! Set lenght of the local slice +! +! ISIZE = IE - IB + 1 +! +!* 2.2 Have ZPTR point to the slice +! + SELECT CASE(HDIR) + CASE("X") + ISIZE = IIE - IIB + 1 + ALLOCATE(ZPTR(ISIZE, ISLICEHEIGHT)) + ZPTR = PARRAY(IIB:IIE,ILOC,KKB:KKE) +! + CASE("Y") + ISIZE = IJE - IJB + 1 + ALLOCATE(ZPTR(ISIZE, ISLICEHEIGHT)) + ZPTR = PARRAY(ILOC,IJB:IJE,KKB:KKE) +! + CASE DEFAULT + call Print_msg( NVERB_FATAL, 'GEN', 'GET_2DSLICE_ll', 'invalid HDIR dummy argument ('//hdir//')' ) +! + END SELECT +! + ELSE +! + INUMPROC = MPI_PROC_NULL +! + ENDIF +! +!* 2.3 Gather values of INUMPROC +! + CALL MPI_ALLGATHER( (/ INUMPROC /) , 1, MNHINT_MPI, ISLICEPROC, 1, MNHINT_MPI, & + NMNH_COMM_WORLD, IERR) +! +!* 2.4 Get MPI world group +! + CALL MPI_COMM_GROUP(NMNH_COMM_WORLD, IWRLD_GROUP, IERR) +! +!* 2.5 Count number of proc that contain the slice +! + ICOUNT = COUNT(ISLICEPROC.NE.MPI_PROC_NULL) +! +!* 2.6 Create MPI group with the procs that contain the slice +! + ALLOCATE(IPROCS(ICOUNT+1)) + IPROCS(1:ICOUNT) = PACK(ISLICEPROC, MASK=ISLICEPROC.NE.MPI_PROC_NULL) + IPROCS(ICOUNT+1) = MPI_PROC_NULL + CALL MPI_GROUP_INCL(IWRLD_GROUP, ICOUNT, IPROCS, IGROUP_SLICE, IERR) +! +!* 2.7 Create MPI communicator associated to new group +! + CALL MPI_COMM_CREATE(NMNH_COMM_WORLD, IGROUP_SLICE, ICOMM_SLICE, IERR) +! +!------------------------------------------------------------------------------- +! +!* 3. GATHER THE LOCAL SLICES ON ALL PROCS THAT CONTAIN THE SLICE +! ----------------------------------------------------------- +! +!* 3.1 Have the length of the local slice on each proc known +! by all procs on the global slice +! + IF (ICOMM_SLICE .NE. MPI_COMM_NULL) THEN +! + ALLOCATE(ISIZES(ICOUNT)) + ISIZES = 0 + CALL MPI_ALLGATHER( (/ ISIZE /) , 1, MNHINT_MPI, ISIZES, 1, MNHINT_MPI, & + ICOMM_SLICE, IERR) +! +!* 3.2 Compute array of displacements in the slice relative to the +! origin of the global domain +! + ALLOCATE(IDISPL(ICOUNT+1)) + IDISPL(1) = IDISPL1 + DO J=2, ICOUNT+1 + IDISPL(J) = IDISPL(J-1)+ISIZES(J-1) + ENDDO + ISLICELENGTH = IDISPL(ICOUNT+1) - IDISPL(1) +! +! +!* 3.3 Have the values of the local slice on each proc known +! by all procs on the global slice +! + DO JK = 1, ISLICEHEIGHT + CALL MPI_ALLGATHERV(ZPTR(1,JK), ISIZE, MNHREAL_MPI, & + ITOTALSLICE(1,JK), & + ISIZES, IDISPL, MNHREAL_MPI, ICOMM_SLICE, IERR) + ENDDO +! +!* 3.4 Delete slice communicator +! + CALL MPI_COMM_FREE(ICOMM_SLICE, IERR) +! + DEALLOCATE(ISIZES, IDISPL) + DEALLOCATE(ZPTR) +! + ENDIF +! +!* 3.5 Delete slice group +! + CALL MPI_GROUP_FREE(IGROUP_SLICE, IERR) +! +!------------------------------------------------------------------------------- +! +!* 4. BROADCAST THE SLICE ON ALL PROCS THAT ARE NOT ON THE SLICE +! ---------------------------------------------------------- +! +!* 4.1 Create communicator with the first proc +!* on the slice and the procs that are not on the +!* slice +! + CALL MPI_GROUP_EXCL(IWRLD_GROUP, ICOUNT-1, IPROCS(2:2), IGROUP, IERR) + CALL MPI_COMM_CREATE(NMNH_COMM_WORLD, IGROUP, ICOMM, IERR) +! +!* 4.2 Broadcast the slice +! + IF (ICOMM .NE. MPI_COMM_NULL) THEN +! + CALL MPI_BCAST(ISLICELENGTH, 1, MNHINT_MPI, IPROCS(1), ICOMM, IERR) + DO JK = 1, ISLICEHEIGHT + CALL MPI_BCAST(ITOTALSLICE(1,JK), ISLICELENGTH, MNHREAL_MPI, & + IPROCS(1), ICOMM, IERR) + ENDDO +! + CALL MPI_COMM_FREE(ICOMM, IERR) +! + ENDIF + PSLICE(1:(KE-KB+1),KKB:KKE) = & + ITOTALSLICE((IORE(IDIM) + KB - 1):(IORE(IDIM) + KE - 1),& + 1:ISLICEHEIGHT) +! + CALL MPI_GROUP_FREE(IGROUP, IERR) +! + CALL MPI_GROUP_FREE(IWRLD_GROUP, IERR) +! + IF (PRESENT(KERR)) KERR=IERR +! + DEALLOCATE(IPROCS) + DEALLOCATE(ITOTALSLICE) +! + END SUBROUTINE GET_2DSLICE_ll +! +! #################################################### + SUBROUTINE INTERSECTION( TPSPLIT, K, TPZONE, TPRES ) +! #################################################### +! +!!**** *INTERSECTION* - routine to compute the intersections of a zone TPZONE, +! in a domain D with the subsets of D resulting +! from a splitting TPSPLIT of D +! (TPSPLIT is a any splitting of D in K parts with +! or without overlapping) +! +! the result TPRES is a splitting +!! +!! Purpose +!! ------- +! To compute the correspondants of a processor for each kind of +! exchange, the exchange's zones have to be computed ; these zones +! can be seen as intersections between zones of the domain. +! +!!** Method +!! ------ +! For each element of the splitting TPSPLIT, its intersection with +! the ZONE_ll TPZONE is computed by a max and a min computations on the +! coordinates of the TPSPLIT'element and TPZONE +! +!! External +!! -------- +! MAX, MIN - functions which compute the MIN and the MAX between 2 elements +! +!! Implicit Arguments +!! ------------------ +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +!! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_STRUCTURE_ll, ONLY : ZONE_ll + USE MODD_VAR_ll, ONLY : DIMZ +! + IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! + TYPE(ZONE_ll), DIMENSION(:), INTENT(IN) :: TPSPLIT ! Splitting of the domain +! + INTEGER, INTENT(IN) :: K ! Number of elements of TPSPLIT +! + TYPE(ZONE_ll), INTENT(IN) :: TPZONE ! Zone to be split +! + TYPE(ZONE_ll), DIMENSION(:), INTENT(OUT) :: TPRES ! Splitting of the zone +! +!* 0.2 declarations of local variables +! + INTEGER :: J ! loop control variable +! +!------------------------------------------------------------------------------- +! +!* 1. LIST AND COMPUTE INTERSECTION BETWEEN TPSPLIT(J) AND TPZONE : +! ----------------------------------------------------------- +! + DO J = 1, K +! +! Which subdomain is the owner of TPSPLIT(J) + TPRES(J)%NUMBER = TPSPLIT(J)%NUMBER +! +! Computation of the origin coordinate + TPRES(J)%NXOR = MAX( TPZONE%NXOR, TPSPLIT(J)%NXOR ) + TPRES(J)%NYOR = MAX( TPZONE%NYOR, TPSPLIT(J)%NYOR ) +! +! Computation of the last coordinate + TPRES(J)%NXEND = MIN( TPZONE%NXEND, TPSPLIT(J)%NXEND ) + TPRES(J)%NYEND = MIN( TPZONE%NYEND, TPSPLIT(J)%NYEND ) +! +! for z-direction all the domain is considered + TPRES(J)%NZOR = 1 + TPRES(J)%NZEND = DIMZ +! +! if the intersection is void, the result is nullified + IF((TPRES(J)%NXOR > TPRES(J)%NXEND) .OR. & + (TPRES(J)%NYOR > TPRES(J)%NYEND) ) & + TPRES(J) = ZONE_ll ( 0, 0, 0, 0, 0, 0, 0, 0 ) +! + ENDDO +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE INTERSECTION +! +! #################################### + SUBROUTINE ADD_ZONE( TPHEAD, TPELT ) +! #################################### +! +!!**** *ADD_ZONE* - routine to add a zone at the end of a correspondant +! +!! Purpose +!! ------- +! the Purpose of this routine is to add a element of type ZONE_ll to +! a variable of type CRSPD_ll which is a list of ZONE_ll +! +!!** Method +!! ------ +! if the list is void, we create the list and put the element +! as the first element else we add the element at the end of the list +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! Module MODD_STRUCTURE_ll +! types CRSPD_ll, ZONE_ll +! +! Module MODD_VAR_ll +! IP - Number of the local processor +! +!! Reference +!! --------- +! +!! Author +! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_STRUCTURE_ll, ONLY : CRSPD_ll, ZONE_ll + USE MODD_VAR_ll, ONLY : IP +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + TYPE(CRSPD_ll), POINTER :: TPHEAD ! head of the list +! + TYPE(ZONE_ll), INTENT(IN) :: TPELT ! element to be added +! +!* 0.2 declarations of local variables +! + TYPE(CRSPD_ll), POINTER :: TZCURRENT, TZNEW ! intermediate variables +! +!------------------------------------------------------------------------------- +! +!* 1. ADD THE ELEMENT TPELT : +! --------------------- +! + IF(.NOT.ASSOCIATED(TPHEAD)) THEN +! +! first element of the list +! + ALLOCATE(TPHEAD) + TPHEAD%TELT = TPELT + NULLIFY( TPHEAD%TNEXT ) + TPHEAD%NCARD = 1 + IF (TPELT%NUMBER /= IP) THEN + TPHEAD%NCARDDIF = 1 + ELSE + TPHEAD%NCARDDIF = 0 + ENDIF +! + ELSE +! +! others elements +! + TZCURRENT => TPHEAD +! +! Go to the end of the list + DO WHILE(ASSOCIATED(TZCURRENT%TNEXT)) + TZCURRENT => TZCURRENT%TNEXT + ENDDO +! +! Add the element + ALLOCATE(TZNEW) + TZNEW%TELT = TPELT + NULLIFY(TZNEW%TNEXT) +! + TZCURRENT%TNEXT => TZNEW +! + TPHEAD%NCARD = TPHEAD%NCARD + 1 + IF (TPELT%NUMBER /= IP) TPHEAD%NCARDDIF = TPHEAD%NCARDDIF + 1 +! + ENDIF +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE ADD_ZONE +! +! ################################## + INTEGER FUNCTION SIZE_ZONE(TPZONE) +! ################################## +! +!* 0. DECLARATIONS +! + USE MODD_STRUCTURE_ll, ONLY : ZONE_ll +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + TYPE(ZONE_ll) :: TPZONE +! +!------------------------------------------------------------------------------- +! + SIZE_ZONE = & + (TPZONE%NXEND - TPZONE%NXOR + 1) * (TPZONE%NYEND - TPZONE%NYOR + 1) +! +!------------------------------------------------------------------------------- +! + END FUNCTION SIZE_ZONE +! +! ##################################### + INTEGER FUNCTION GET_MAX_SIZE(TPLIST) +! ##################################### +! +!* 0. DECLARATIONS +! + USE MODD_STRUCTURE_ll, ONLY : ZONE_ll +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + TYPE(CRSPD_ll), POINTER :: TPLIST +! +!* 0.2 declarations of local variables +! + TYPE(CRSPD_ll), POINTER :: TZLIST + INTEGER :: KCURSIZE, KMAXSIZE +! +!------------------------------------------------------------------------------- +! + KMAXSIZE = 0 + TZLIST => TPLIST + DO WHILE(ASSOCIATED(TZLIST)) + KCURSIZE = SIZE_ZONE(TZLIST%TELT) + IF (KMAXSIZE < KCURSIZE) KMAXSIZE = KCURSIZE + TZLIST => TZLIST%TNEXT + ENDDO +! + GET_MAX_SIZE = KMAXSIZE +! +!------------------------------------------------------------------------------- +! + END FUNCTION GET_MAX_SIZE +! +! ################################################# + SUBROUTINE EXTRACT_ZONE( TPSPLITS, TPPZS, TPEZS ) +! ################################################# +! +!!**** *EXTRACT_ZONE* - routine to construct two splittings variables +!! from a MODELSPLITTING_ll variable +! +!! Purpose +!! ------- +! the Purpose of this routine is to extract two splittings TPPZS, +! physical zone splitting and TPEZS, extended zone splitting +! from a MODELSPLITTING_ll TPSPLITS +! +!!** Method +!! ------ +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! Module MODD_STRUCTURE_ll +! types MODELSPLITTING_ll, ZONE_ll +! +! Module MODD_VAR_ll +! NPROC - Number of processors +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_STRUCTURE_ll, ONLY : MODELSPLITTING_ll, ZONE_ll + USE MODD_VAR_ll, ONLY : NPROC +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + TYPE(MODELSPLITTING_ll), DIMENSION(:), POINTER :: TPSPLITS +! + TYPE(ZONE_ll), DIMENSION(:), INTENT(OUT) :: TPPZS, TPEZS +! +!* 0.2 declarations of local variables +! + INTEGER :: J ! loop control variable +! +!------------------------------------------------------------------------------- +! +!* 1. FILL TPPZS AND TPEZS FOR EACH J : +! ------------------------------- +! + DO J = 1, NPROC +! + TPPZS(J) = ZONE_ll( 0, 0, 0, 0, 0, 0, 0, 0 ) + TPEZS(J) = ZONE_ll( 0, 0, 0, 0, 0, 0, 0, 0 ) +! + TPPZS(J)%NUMBER = TPSPLITS(J)%NUMBER + TPPZS(J)%NXOR = TPSPLITS(J)%NXORP + TPPZS(J)%NYOR = TPSPLITS(J)%NYORP + TPPZS(J)%NXEND = TPSPLITS(J)%NXENDP + TPPZS(J)%NYEND = TPSPLITS(J)%NYENDP +! + TPEZS(J)%NUMBER = TPSPLITS(J)%NUMBER + TPEZS(J)%NXOR = TPSPLITS(J)%NXORE + TPEZS(J)%NYOR = TPSPLITS(J)%NYORE + TPEZS(J)%NXEND = TPSPLITS(J)%NXENDE + TPEZS(J)%NYEND = TPSPLITS(J)%NYENDE +! + ENDDO +! +!----------------------------------------------------------------------- +! + END SUBROUTINE EXTRACT_ZONE +! +! ################################################# + SUBROUTINE EXTRACT_ZONE_EXTENDED( TPSPLITS, TPPZS, TPEZS_EXTENDED, HALOSIZE ) +! ################################################# +! +!!**** *EXTRACT_ZONE* - routine to construct two splittings variables +!! from a MODELSPLITTING_ll variable +! +!! Purpose +!! ------- +! the Purpose of this routine is to extract two splittings TPPZS, +! physical zone splitting and TPEZS_EXTENDED, extended zone splitting with halo of size HALOSIZE +! from a MODELSPLITTING_ll TPSPLITS +! +!!** Method +!! ------ +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! Module MODD_STRUCTURE_ll +! types MODELSPLITTING_ll, ZONE_ll +! +! Module MODD_VAR_ll +! NPROC - Number of processors +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_STRUCTURE_ll, ONLY : MODELSPLITTING_ll, ZONE_ll + USE MODD_VAR_ll, ONLY : NPROC +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + TYPE(MODELSPLITTING_ll), DIMENSION(:), POINTER :: TPSPLITS +! + TYPE(ZONE_ll), DIMENSION(:), INTENT(OUT) :: TPPZS, TPEZS_EXTENDED +! + INTEGER, INTENT(IN) :: HALOSIZE +! +!* 0.2 declarations of local variables +! + INTEGER :: J ! loop control variable +! +!------------------------------------------------------------------------------- +! +!* 1. FILL TPPZS AND TPEZS FOR EACH J : +! ------------------------------- +! + DO J = 1, NPROC +! + TPPZS(J) = ZONE_ll( 0, 0, 0, 0, 0, 0, 0, 0 ) + TPEZS_EXTENDED(J) = ZONE_ll( 0, 0, 0, 0, 0, 0, 0, 0 ) +! + TPPZS(J)%NUMBER = TPSPLITS(J)%NUMBER + TPPZS(J)%NXOR = TPSPLITS(J)%NXORP+1 + TPPZS(J)%NYOR = TPSPLITS(J)%NYORP+1 + TPPZS(J)%NXEND = TPSPLITS(J)%NXENDP+1 + TPPZS(J)%NYEND = TPSPLITS(J)%NYENDP+1 +! + IF ( TPSPLITS(J)%NDIMXP < HALOSIZE .OR. TPSPLITS(J)%NDIMYP < HALOSIZE ) THEN + WRITE(*,*) "WARNING : HALOSIZE is greater than model dimension" + WRITE(*,*) "HALOSIZE = ", HALOSIZE + WRITE(*,*) "model dimensions : ", TPSPLITS(J)%NDIMXP, "x", TPSPLITS(J)%NDIMYP + ENDIF +! + TPEZS_EXTENDED(J)%NUMBER = TPSPLITS(J)%NUMBER + TPEZS_EXTENDED(J)%NXOR = TPSPLITS(J)%NXORP+1-HALOSIZE + TPEZS_EXTENDED(J)%NYOR = TPSPLITS(J)%NYORP+1-HALOSIZE + TPEZS_EXTENDED(J)%NXEND = TPSPLITS(J)%NXENDP+1+HALOSIZE + TPEZS_EXTENDED(J)%NYEND = TPSPLITS(J)%NYENDP+1+HALOSIZE +! + ENDDO +! +!----------------------------------------------------------------------- +! + END SUBROUTINE EXTRACT_ZONE_EXTENDED +! +! ########################################### + SUBROUTINE GLOBAL2LOCAL(TPPROCONF, TPCRSPD) +! ########################################### +! +!!**** *GLOBAL2LOCAL* - routine to switch from global coordinates to local ones +! +!! Purpose +!! ------- +! the Purpose of this routine is to compute the coordinates of the +! subdomains included in a variable of type CRSPD_ll in the local +! referential for 2way splitting of the local subdomain +! +!!** Method +!! ------ +! the coordinates of the elements of TPCRSPD are global ; +! the coordinates of the local subdomain in 2way splitting +! are in the variable TPPROCONF%TSPLITS_B(IP) ; +! +! we substract the coordinates of each element by the origin +! of the extended subdomain to obtain local coordinates +! +!! External +!! -------- +!! +!! Implicit Arguments +!! ------------------ +! Module MODD_STRUCTURE_ll +! types PROCONF_ll, CRSPD_ll, ZONE_ll +! +! Module MODD_VAR_ll +! IP - Number of the local processor +! +!! Reference +!! --------- +!! +!! Author +!! ------ +!! Ph. Kloos +!! +!! Modifications +!! ------------- +!! Original 01/05/98 +!! 03/02/99 change declaration of TPPROCONF +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_STRUCTURE_ll, ONLY : PROCONF_ll, CRSPD_ll, ZONE_ll + USE MODD_VAR_ll, ONLY : IP +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + TYPE(PROCONF_ll), POINTER :: TPPROCONF + TYPE(CRSPD_ll), POINTER :: TPCRSPD ! CRSPD_ll to be switched +! +! +!* 0.2 declarations of local variables +! +! intermediate variables to describe the list and the elements + TYPE(ZONE_ll), POINTER :: TZZONE + TYPE(CRSPD_ll), POINTER :: TZCRSPD +! +! 2way-splitting + TYPE(MODELSPLITTING_ll), POINTER :: TPSPLIT +! +!------------------------------------------------------------------------------- +! +!* 1. SWITCH : +! ------ +! +! we point to the structure which contains informations +! of the 2way local subdomain + TPSPLIT => TPPROCONF%TSPLITS_B(IP) +! +! we list the variable TPCRSPD of type CRSPD_ll + TZCRSPD => TPCRSPD + DO WHILE (ASSOCIATED(TZCRSPD)) + TZZONE => TZCRSPD%TELT +! +! we substract the origin of the local subdomain (extended subdomain) + TZZONE%NXOR = TZZONE%NXOR - TPSPLIT%NXORE + 1 + TZZONE%NXEND = TZZONE%NXEND - TPSPLIT%NXORE + 1 + TZZONE%NYOR = TZZONE%NYOR - TPSPLIT%NYORE + 1 + TZZONE%NYEND = TZZONE%NYEND - TPSPLIT%NYORE + 1 +! + TZCRSPD => TZCRSPD%TNEXT + ENDDO +! +!----------------------------------------------------------------------- +! + END SUBROUTINE GLOBAL2LOCAL +! +! ################################ + SUBROUTINE G2LX(TPSPLIT,TPCRSPD) +! ################################ +! +!!**** *G2LX* - routine to switch from global coordinates to local ones +! +!! Purpose +!! ------- +! the Purpose of this routine is to compute the coordinates of the +! subdomains included in a variable of type CRSPD_ll in the local +! referentiel for x-slices or y-slices splitting of the local subdomain +! +!!** Method +!! ------ +! the coordinates of the elements of TPCRSPD are global ; +! the coordinates of the local subdomain in 2way splitting +! are in the variable TPSPLIT ; +! +! we substract the coordinates of each element by the origin +! of the extended subdomain to obtain local coordinates +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! Module MODD_STRUCTURE_ll +! types MODELSPLITTING_ll, CRSPD_ll +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_STRUCTURE_ll, ONLY : MODELSPLITTING_ll, CRSPD_ll +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + TYPE(MODELSPLITTING_ll), INTENT(IN) :: TPSPLIT ! x-slices or y-slices + ! splitting +! + TYPE(CRSPD_ll), POINTER :: TPCRSPD ! CRSPD_ll to be switch +! +!* 0.2 declarations of local variables +! +! intermediate variables to describe the list and the elements + TYPE(ZONE_ll), POINTER :: TZZONE + TYPE(CRSPD_ll), POINTER :: TZCRSPD +! +!------------------------------------------------------------------------------- +! +!* 1. SWITCH : +! ------ +! we list the variable TPCRSPD of type CRSPD_ll + TZCRSPD => TPCRSPD + DO WHILE (ASSOCIATED(TZCRSPD)) + TZZONE => TZCRSPD%TELT +! +! we substract the origin of the local subdomain (physical subdomain) + TZZONE%NXOR = TZZONE%NXOR - TPSPLIT%NXORP + 1 + TZZONE%NXEND = TZZONE%NXEND - TPSPLIT%NXORP + 1 + TZZONE%NYOR = TZZONE%NYOR - TPSPLIT%NYORP + 1 + TZZONE%NYEND = TZZONE%NYEND - TPSPLIT%NYORP + 1 +! + TZCRSPD => TZCRSPD%TNEXT + ENDDO +! +!------------------------------------------------------------------------------- +! + END SUBROUTINE G2LX +! +! ################################################# + SUBROUTINE GET_OR_SURFEX_ll( HSPLIT, KOR ) +! ################################################# +! +!!**** *GET_LOCAL_PORTION_OF_SURFEX_FIELD2D* - returns the origin index of the extended +! 2way subdomain or of the x-slices subdomain +! or of the y-slices +! subdomain of the local processor in a surfex field (global indices) +! +!! Purpose +!! ------- +!! returns the origin index of the extended +!! 2way subdomain or of the x-slices subdomain +!! or of the y-slices +!! subdomain of the local processor in a surfex field (global indices) +! +!!** Method +!! ------ +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! +!! Reference +!! --------- +! +!! Author +!! ------ +! M.Moge +! +!! Modifications +!! ------------- +! Original 16/12/14 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_PARAMETERS, ONLY : JPHEXT +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + CHARACTER(len=1), INTENT(IN) :: HSPLIT + INTEGER, INTENT(OUT) :: KOR +! +!* 0.2 declarations of local variables +! + INTEGER :: IXOR_ll, IYOR_ll ! beginning of local subdomain in global coordinates +! +!------------------------------------------------------------------------------- +! + CALL GET_OR_ll( HSPLIT, IXOR_ll, IYOR_ll ) + KOR = (IXOR_ll-JPHEXT)*(IYOR_ll-JPHEXT) +! +!----------------------------------------------------------------------- +! + END SUBROUTINE GET_OR_SURFEX_ll +! +! +! ################################################# + SUBROUTINE GET_LOCAL_PORTION_OF_SURFEX_FIELD2D( PSURFEXFIELDGLB, POUTPUTFIELDLCL ) +! ################################################# +! +!!**** *GET_LOCAL_PORTION_OF_SURFEX_FIELD2D* - extracts local portion of a global +!! surfex field (2D field stored in 1D array) +! +!! Purpose +!! ------- +! extract local portion of a global +!! surfex field (2D field stored in 1D array) +! +!!** Method +!! ------ +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! +!! Reference +!! --------- +! +!! Author +!! ------ +! M.Moge +! +!! Modifications +!! ------------- +! Original 08/12/14 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_DIM_n, ONLY : NIMAX_ll, NJMAX_ll + USE MODD_PARAMETERS, ONLY : JPHEXT +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + REAL, DIMENSION(:), INTENT(IN) :: PSURFEXFIELDGLB +! + REAL, DIMENSION(:), INTENT(OUT) :: POUTPUTFIELDLCL +! +!* 0.2 declarations of local variables +! + INTEGER :: JI,JJ ! loop control variables + INTEGER :: IXOR, IYOR, IXEND, IYEND ! beginning and end of local subdomain in local coordinates + INTEGER :: IXOR_ll, IYOR_ll ! beginning of local subdomain in global coordinates + INTEGER :: ICOUNT +! +!------------------------------------------------------------------------------- +! + CALL GET_INDICE_ll( IXOR, IYOR, IXEND, IYEND ) + CALL GET_OR_ll( 'B', IXOR_ll, IYOR_ll ) +! + ICOUNT = 1 + DO JJ=IYOR_ll+IYOR-1-JPHEXT,IYOR_ll+IYEND-1-JPHEXT + DO JI=IXOR_ll+IXOR-1-JPHEXT,IXOR_ll+IXEND-1-JPHEXT + POUTPUTFIELDLCL(ICOUNT) = PSURFEXFIELDGLB(JI+(NIMAX_ll)*(JJ-1)) + ICOUNT = ICOUNT+1 + ENDDO + ENDDO +! +!----------------------------------------------------------------------- +! + END SUBROUTINE GET_LOCAL_PORTION_OF_SURFEX_FIELD2D +! +! +! ################################################# + SUBROUTINE SET_LOCAL_PORTION_OF_SURFEX_FIELD2D( PFIELDLCL, PSURFEXFIELDGLB ) +! ################################################# +! +!!**** *GET_LOCAL_PORTION_OF_SURFEX_FIELD2D* - sets values of local portion of a global +!! surfex field (2D field stored in 1D array) +! +!! Purpose +!! ------- +! sets values of local portion of a global +!! surfex field (2D field stored in 1D array) +! +!!** Method +!! ------ +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! +!! Reference +!! --------- +! +!! Author +!! ------ +! M.Moge +! +!! Modifications +!! ------------- +! Original 09/12/14 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + USE MODD_DIM_n, ONLY : NIMAX_ll, NJMAX_ll + USE MODD_PARAMETERS, ONLY : JPHEXT +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + REAL, DIMENSION(:), INTENT(IN) :: PFIELDLCL +! + REAL, DIMENSION(:), INTENT(OUT) :: PSURFEXFIELDGLB +! +!* 0.2 declarations of local variables +! + INTEGER :: JI,JJ ! loop control variables + INTEGER :: IXOR, IYOR, IXEND, IYEND ! beginning and end of local subdomain in local coordinates + INTEGER :: IXOR_ll, IYOR_ll ! beginning of local subdomain in global coordinates + INTEGER :: ICOUNT +! +!------------------------------------------------------------------------------- +! + CALL GET_INDICE_ll( IXOR, IYOR, IXEND, IYEND ) + CALL GET_OR_ll( 'B', IXOR_ll, IYOR_ll ) +! + ICOUNT = 1 + DO JJ=IYOR_ll+IYOR-1-JPHEXT,IYOR_ll+IYEND-1-JPHEXT + DO JI=IXOR_ll+IXOR-1-JPHEXT,IXOR_ll+IXEND-1-JPHEXT + PSURFEXFIELDGLB(JI+(NIMAX_ll)*(JJ-1)) = PFIELDLCL(ICOUNT) + ICOUNT = ICOUNT+1 + ENDDO + ENDDO +! +!----------------------------------------------------------------------- +! + END SUBROUTINE SET_LOCAL_PORTION_OF_SURFEX_FIELD2D +! +! +! ################################################# + SUBROUTINE GET_MEAN_OF_COORD_SQRT_ll(PARRAY,KSIZELOC,KSIZEGLB,PMEANSQRT) +! ################################################# +! +!!**** *GET_L2_NORM_ll* - computes the L2 norm of 1D array PARRAY accross all processes +! +!! Purpose +!! ------- +! computes the L2 norm of 1D array PARRAY accross all processes +! +!!** Method +!! ------ +! +!! External +!! -------- +! +!! Implicit Arguments +!! ------------------ +! +!! Reference +!! --------- +! +!! Author +!! ------ +! M.Moge +! +!! Modifications +!! ------------- +! Original 10/12/14 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + IMPLICIT NONE +! +!* 0.1 declarations of arguments +! + REAL, DIMENSION(:), INTENT(IN) :: PARRAY + INTEGER, INTENT(IN) :: KSIZELOC + INTEGER, INTENT(IN) :: KSIZEGLB +! + REAL, INTENT(OUT) :: PMEANSQRT +! +!* 0.2 declarations of local variables +! + REAL :: IMEANSQRTLOC + INTEGER :: IINFO +! +!------------------------------------------------------------------------------- +! +IMEANSQRTLOC = SUM(SQRT(PARRAY)) +CALL MPI_ALLREDUCE(IMEANSQRTLOC, PMEANSQRT, 1, MNHREAL_MPI, MPI_SUM, NMNH_COMM_WORLD,IINFO) +PMEANSQRT = PMEANSQRT / KSIZEGLB +! +!----------------------------------------------------------------------- +! + END SUBROUTINE GET_MEAN_OF_COORD_SQRT_ll +! +! ########################################################################## + FUNCTION SPREAD_X_ll(HSPLIT, PSOURCE, KDIM, KX, KCOPIES) RESULT(PSPREAD_X) +! ########################################################################## +! +!!**** *SPREAD_X_ll* - perform the spread in y-direction of the local +!! part of a x-vector for the local processor +! +!! Purpose +!! ------- +! +!!** Method +!! ------ +! In function of the position of the local subdomain, we extract +! the local part of the x-vector and spread it in y-direction. +! the spread is done with the dimension of the local subdomain in +! y-direction + +!! External +!! -------- +! Module MODE_TOOLS_ll +! GET_DIM_EXT_ll +! GET_OR_ll +! +!! Implicit Arguments +!! ------------------ +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + IMPLICIT NONE +! +! +!* 0.0 declarations of arguments +! + CHARACTER(len=1), INTENT(IN) :: HSPLIT ! Splitting flag (B, X or Y) +! + REAL, DIMENSION(:), INTENT(IN) :: PSOURCE ! x-vector +! + INTEGER, INTENT(IN) :: KDIM ! direction of the spread +! + INTEGER, INTENT(IN) :: KX, KCOPIES ! dimension of the local subdomain +! +!* 0.1 declaration of returned variable +! + REAL, DIMENSION( KX , KCOPIES ) :: PSPREAD_X + +!* 0.2 declarations of local variables +! + REAL, ALLOCATABLE :: ZSUBSET(:) ! Intermediate buffer +! + INTEGER :: INDEX + INTEGER :: JI ! loop control variable +! + INTEGER :: IXOR, IYOR, IDIMX, IDIMY ! origin of the local subdoamin +! +!------------------------------------------------------------------------------- +! +!* 1. GET THE ORIGIN AND THE DIMENSION OF THE LOCAL SUBDOMAIN : +! ------------------------------------------------------- +! + CALL GET_OR_ll( HSPLIT, IXOR, IYOR ) + CALL GET_DIM_EXT_ll( HSPLIT, IDIMX, IDIMY ) +! +!------------------------------------------------------------------------------- +! +!* 2. ALLOCATION OF THE INTERMEDIATE BUFFER : +! ------------------------------------- +! + ALLOCATE(ZSUBSET(IDIMX)) +! +!------------------------------------------------------------------------------- +! +!* 3. FILL THE INTERMEDIATE BUFFER : +! ---------------------------- +! + INDEX = 0 + DO JI = IXOR, IXOR + IDIMX - 1 +! + INDEX = INDEX + 1 + ZSUBSET(INDEX) = PSOURCE(JI) +! + ENDDO +! +!------------------------------------------------------------------------------- +! +!* 4. SPREAD THE BUFFER IN Y-DIRECTION WITH KCOPIES +! + PSPREAD_X = SPREAD(ZSUBSET, KDIM, KCOPIES ) +! +!------------------------------------------------------------------------------- +! +!* 5. DEALLOCATION OF THE INTERMEDIATE BUFFER : +! ------------------------------------- +! + DEALLOCATE(ZSUBSET) +! +!------------------------------------------------------------------------------- +! + END FUNCTION SPREAD_X_ll +! +! ########################################################################## + FUNCTION SPREAD_Y_ll(HSPLIT, PSOURCE, KDIM, KY, KCOPIES) RESULT(PSPREAD_Y) +! ########################################################################## +! +!!**** *SPREAD_Y_ll* - perform the spread in x-direction of the local +!! part of a y-vector for the local processor +! +!! Purpose +!! ------- +! +!!** Method +!! ------ +! In function of the position of the local subdomain, we extract +! the local part of the y-vector and spread it in x-direction. +! the spread is done with the dimension of the local subdomain in +! x-direction +! +!! External +!! -------- +! Module MODE_TOOLS_ll +! GET_DIM_EXT_ll, GET_OR_ll +! +!! Implicit Arguments +!! ------------------ +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + IMPLICIT NONE +! +! +!* 0.0 declarations of arguments +! + CHARACTER(len=1), INTENT(IN) :: HSPLIT ! Splitting flag (B, X or Y) +! + REAL, DIMENSION(:), INTENT(IN) :: PSOURCE ! x-vector +! + INTEGER, INTENT(IN) :: KDIM ! direction of the spread +! + INTEGER, INTENT(IN) :: KY, KCOPIES ! dimension of the local subdomain +! +!* 0.1 declaration of returned variable +! + REAL, DIMENSION( KCOPIES , KY ) :: PSPREAD_Y +! + +!* 0.2 declarations of local variables +! + REAL, ALLOCATABLE :: ZSUBSET(:) ! Intermediate buffer +! + INTEGER :: INDEX + INTEGER :: JJ ! loop control variable +! + INTEGER :: IXOR, IYOR, IDIMX, IDIMY ! origin of the local subdoamin +! +!------------------------------------------------------------------------------- +! +!* 1. GET THE ORIGIN AND THE DIMENSION OF THE LOCAL SUBDOMAIN : +! ------------------------------------------------------- +! + CALL GET_OR_ll( HSPLIT, IXOR, IYOR ) + CALL GET_DIM_EXT_ll( HSPLIT, IDIMX, IDIMY ) +! +!------------------------------------------------------------------------------- +! +!* 2. ALLOCATION OF THE INTERMEDIATE BUFFER : +! ------------------------------------- +! + ALLOCATE(ZSUBSET(IDIMY)) +! +!------------------------------------------------------------------------------- +! +!* 3. FILL THE INTERMEDIATE BUFFER : +! ---------------------------- +! + INDEX = 0 + DO JJ = IYOR, IYOR + IDIMY - 1 +! + INDEX = INDEX + 1 + ZSUBSET(INDEX) = PSOURCE(JJ) +! + ENDDO +! +!------------------------------------------------------------------------------- +! +!* 4. SPREAD THE BUFFER IN X-DIRECTION WITH KCOPIES +! + PSPREAD_Y = SPREAD(ZSUBSET, KDIM, KCOPIES ) +! +!------------------------------------------------------------------------------- +! +!* 5. DEALLOCATION OF THE INTERMEDIATE BUFFER : +! ------------------------------------- +! + DEALLOCATE(ZSUBSET) +! +!------------------------------------------------------------------------------- +! + END FUNCTION SPREAD_Y_ll +! +! ################################################################# + FUNCTION SPREAD_XY_ll( HSPLIT, PSOURCE, KDIM, KX, KY, KCOPIES ) & + RESULT( PSPREAD_XY ) +! ################################################################# +! +!!**** *SPREAD_XY_ll* - perform the spread in z-direction of the local +!! part of a 2D-array for the local processor +! +!! Purpose +!! ------- +! +!!** Method +!! ------ +! In function of the position of the local subdomain, we extract +! the local part of the 2D-array and spread it in z-direction. +! the spread is done with KCOPIES + +!! External +!! -------- +! Module MODE_TOOLS_ll +! GET_DIM_EXT_ll, GET_OR_ll +! +!! Implicit Arguments +!! ------------------ +! +!! Reference +!! --------- +! +!! Author +!! ------ +! R. Guivarch +! +!! Modifications +!! ------------- +! Original 01/05/98 +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! + IMPLICIT NONE +! +! +!* 0.0 declarations of arguments +! + CHARACTER(len=1), INTENT(IN) :: HSPLIT ! Splitting flag (B, X or Y) +! + REAL, DIMENSION(:,:), INTENT(IN) :: PSOURCE ! x-vector +! + INTEGER, INTENT(IN) :: KDIM ! direction of the spread +! + INTEGER, INTENT(IN) :: KX, KY ! dimension of the local subdomain +! + INTEGER, INTENT(IN) :: KCOPIES ! number of spread +! +!* 0.1 declaration of returned variable +! + REAL, DIMENSION( KX , KY, KCOPIES ) :: PSPREAD_XY + +!* 0.2 declarations of local variables +! + REAL, ALLOCATABLE :: ZSUBSET(:,:) ! Intermediate buffer +! + INTEGER :: INDEXX, INDEXY + INTEGER :: JI, JJ ! loop control variable +! + INTEGER :: IXOR, IYOR, IDIMX, IDIMY ! origin of the local subdoamin +! +!------------------------------------------------------------------------------- +! +!* 1. GET THE ORIGIN AND THE DIMENSION OF THE LOCAL SUBDOMAIN : +! ------------------------------------------------------- +! + CALL GET_OR_ll( HSPLIT, IXOR, IYOR ) + CALL GET_DIM_EXT_ll( HSPLIT, IDIMX, IDIMY ) +! +!------------------------------------------------------------------------------- +! +!* 2. ALLOCATION OF THE INTERMEDIATE BUFFER : +! ------------------------------------- +! + ALLOCATE(ZSUBSET(IDIMX,IDIMY)) +! +!------------------------------------------------------------------------------- +! +!* 3. FILL THE INTERMEDIATE BUFFER : +! ---------------------------- + INDEXY = 0 +! + DO JJ = IYOR, IYOR + IDIMY - 1 +! + INDEXY = INDEXY + 1 + INDEXX = 0 +! + DO JI = IXOR, IXOR + IDIMX - 1 +! + INDEXX = INDEXX + 1 + ZSUBSET(INDEXX, INDEXY) = PSOURCE(JI,JJ) +! + ENDDO +! + ENDDO +! +!------------------------------------------------------------------------------- +! +!* 4. SPREAD THE BUFFER IN Z-DIRECTION WITH KCOPIES +! + PSPREAD_XY = SPREAD(ZSUBSET, KDIM, KCOPIES ) +! +!------------------------------------------------------------------------------- +! +!* 5. DEALLOCATION OF THE INTERMEDIATE BUFFER : +! ----------------------------------------- +! + DEALLOCATE(ZSUBSET) +! +!------------------------------------------------------------------------------- +! + END FUNCTION SPREAD_XY_ll +! +END MODULE MODE_TOOLS_ll diff --git a/src/mesonh/aux/shuman.f90 b/src/mesonh/aux/shuman.f90 new file mode 100644 index 0000000000000000000000000000000000000000..f0a1e3f12f08d5f1132de0e102030230bd0f1c61 --- /dev/null +++ b/src/mesonh/aux/shuman.f90 @@ -0,0 +1,1291 @@ +!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$ +!----------------------------------------------------------------- +! ################## + MODULE MODI_SHUMAN +! ################## +! +INTERFACE +! +FUNCTION DXF(PA) RESULT(PDXF) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDXF ! result at mass + ! localization +END FUNCTION DXF +! +FUNCTION DXM(PA) RESULT(PDXM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDXM ! result at flux + ! side +END FUNCTION DXM +! +FUNCTION DYF(PA) RESULT(PDYF) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDYF ! result at mass + ! localization +END FUNCTION DYF +! +FUNCTION DYM(PA) RESULT(PDYM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDYM ! result at flux + ! side +END FUNCTION DYM +! +FUNCTION DZF(PA, KKA, KKU, KL) RESULT(PDZF) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZF ! result at mass + ! localization +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME) +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME) +END FUNCTION DZF +! +FUNCTION DZM(PA, KKA, KKU, KL) RESULT(PDZM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZM ! result at flux + ! side +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME) +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME) +END FUNCTION DZM +! +FUNCTION MXF(PA) RESULT(PMXF) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMXF ! result at mass + ! localization +END FUNCTION MXF +! +FUNCTION MXM(PA) RESULT(PMXM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMXM ! result at flux localization +END FUNCTION MXM + +FUNCTION MYF(PA) RESULT(PMYF) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMYF ! result at mass + ! localization +END FUNCTION MYF +! +FUNCTION MYM(PA) RESULT(PMYM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMYM ! result at flux localization +END FUNCTION MYM +! +FUNCTION MZF(PA,KKA,KKU,KL) RESULT(PMZF) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZF ! result at mass + ! localization +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME) +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME) +END FUNCTION MZF +! +FUNCTION MZM(PA,KKA,KKU,KL) RESULT(PMZM) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM ! result at flux localization +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME) +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME) +END FUNCTION MZM +! +END INTERFACE +! +END MODULE MODI_SHUMAN +! +! +! ############################### + FUNCTION MXF(PA) RESULT(PMXF) +! ############################### +! +!!**** *MXF* - Shuman operator : mean operator in x direction for a +!! variable at a flux side +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a mean +! along the x direction (I index) for a field PA localized at a x-flux +! point (u point). The result is localized at a mass point. +! +!!** METHOD +!! ------ +!! The result PMXF(i,:,:) is defined by 0.5*(PA(i,:,:)+PA(i+1,:,:)) +!! At i=size(PA,1), PMXF(i,:,:) are replaced by the values of PMXF, +!! which are the right values in the x-cyclic case +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!! correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMXF ! result at mass + ! localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JI ! Loop index in x direction +INTEGER :: IIU ! upper bound in x direction of PA +! +INTEGER :: JJK,IJU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MXF +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + 1 +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PMXF(JIJK-1,1,1) = 0.5*( PA(JIJK-1,1,1)+PA(JIJK,1,1) ) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JI=1,JPHEXT + DO JJK=1,IJU*IKU + PMXF(IIU-JPHEXT+JI,JJK,1) = PMXF(JPHEXT+JI,JJK,1) ! for reprod JPHEXT <> 1 + END DO +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION MXF +! ############################### + FUNCTION MXM(PA) RESULT(PMXM) +! ############################### +! +!!**** *MXM* - Shuman operator : mean operator in x direction for a +!! mass variable +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a mean +! along the x direction (I index) for a field PA localized at a mass +! point. The result is localized at a x-flux point (u point). +! +!!** METHOD +!! ------ +!! The result PMXM(i,:,:) is defined by 0.5*(PA(i,:,:)+PA(i-1,:,:)) +!! At i=1, PMXM(1,:,:) are replaced by the values of PMXM, +!! which are the right values in the x-cyclic case. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!! correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMXM ! result at flux localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JI ! Loop index in x direction +INTEGER :: IIU ! Size of the array in the x direction +! +INTEGER :: JJK,IJU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MXM +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + 1 +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PMXM(JIJK,1,1) = 0.5*( PA(JIJK,1,1)+PA(JIJK-1,1,1) ) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JI=1,JPHEXT + DO JJK=1,IJU*IKU + PMXM(JI,JJK,1) = PMXM(IIU-2*JPHEXT+JI,JJK,1) ! for reprod JPHEXT <> 1 + END DO +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION MXM +! ############################### + FUNCTION MYF(PA) RESULT(PMYF) +! ############################### +! +!!**** *MYF* - Shuman operator : mean operator in y direction for a +!! variable at a flux side +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a mean +! along the y direction (J index) for a field PA localized at a y-flux +! point (v point). The result is localized at a mass point. +! +!!** METHOD +!! ------ +!! The result PMYF(i,:,:) is defined by 0.5*(PA(:,j,:)+PA(:,j+1,:)) +!! At j=size(PA,2), PMYF(:,j,:) are replaced by the values of PMYF, +!! which are the right values in the y-cyclic case +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!! correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMYF ! result at mass + ! localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JJ ! Loop index in y direction +INTEGER :: IJU ! upper bound in y direction of PA +! +INTEGER :: IIU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MYF +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + IIU +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PMYF(JIJK-IIU,1,1) = 0.5*( PA(JIJK-IIU,1,1)+PA(JIJK,1,1) ) +END DO +! +DO JJ=1,JPHEXT + PMYF(:,IJU-JPHEXT+JJ,:) = PMYF(:,JPHEXT+JJ,:) ! for reprod JPHEXT <> 1 +END DO +! +! +!------------------------------------------------------------------------------- +! +END FUNCTION MYF +! ############################### + FUNCTION MYM(PA) RESULT(PMYM) +! ############################### +! +!!**** *MYM* - Shuman operator : mean operator in y direction for a +!! mass variable +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a mean +! along the y direction (J index) for a field PA localized at a mass +! point. The result is localized at a y-flux point (v point). +! +!!** METHOD +!! ------ +!! The result PMYM(:,j,:) is defined by 0.5*(PA(:,j,:)+PA(:,j-1,:)) +!! At j=1, PMYM(:,j,:) are replaced by the values of PMYM, +!! which are the right values in the y-cyclic case. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!! correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMYM ! result at flux localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JJ ! Loop index in y direction +INTEGER :: IJU ! Size of the array in the y direction +! +! +INTEGER :: IIU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MYM +! ------------------ +! +IIU=SIZE(PA,1) +IJU=SIZE(PA,2) +IKU=SIZE(PA,3) +! +JIJKOR = 1 + IIU +JIJKEND = IIU*IJU*IKU +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PMYM(JIJK,1,1) = 0.5*( PA(JIJK,1,1)+PA(JIJK-IIU,1,1) ) +END DO +! +DO JJ=1,JPHEXT + PMYM(:,JJ,:) = PMYM(:,IJU-2*JPHEXT+JJ,:) ! for reprod JPHEXT <> 1 +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION MYM +! ############################### + FUNCTION MZF(PA,KKA,KKU,KL) RESULT(PMZF) +! ############################### +! +!!**** *MZF* - Shuman operator : mean operator in z direction for a +!! variable at a flux side +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a mean +! along the z direction (K index) for a field PA localized at a z-flux +! point (w point). The result is localized at a mass point. +! +!!** METHOD +!! ------ +!! The result PMZF(:,:,k) is defined by 0.5*(PA(:,:,k)+PA(:,:,k+1)) +!! At k=size(PA,3), PMZF(:,:,k) is defined by -999. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/07/94 +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZF ! result at mass + ! localization +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes (for AROME only) +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise (for AROME only) +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JK ! Loop index in z direction +INTEGER :: IKU ! upper bound in z direction of PA +! +INTEGER :: IIU,IJU +INTEGER :: JIJ +INTEGER :: JIJK,JIJKOR,JIJKEND +! +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MZF +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + IIU*IJU +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PMZF(JIJK-IIU*IJU,1,1) = 0.5*( PA(JIJK-IIU*IJU,1,1)+PA(JIJK,1,1) ) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JIJ=1,IIU*IJU + PMZF(JIJ,1,IKU) = PMZF(JIJ,1,IKU-1) !-999. +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION MZF +! ############################### + FUNCTION MZM(PA,KKA,KKU,KL) RESULT(PMZM) +! ############################### +! +!!**** *MZM* - Shuman operator : mean operator in z direction for a +!! mass variable +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a mean +! along the z direction (K index) for a field PA localized at a mass +! point. The result is localized at a z-flux point (w point). +! +!!** METHOD +!! ------ +!! The result PMZM(:,:,k) is defined by 0.5*(PA(:,:,k)+PA(:,:,k-1)) +!! At k=1, PMZM(:,:,1) is defined by -999. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/07/94 +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PMZM ! result at flux localization +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes (for AROME only) +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise (for AROME only) +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JK ! Loop index in z direction +INTEGER :: IKU ! upper bound in z direction of PA +! +INTEGER :: IIU,IJU +INTEGER :: JIJ,JI,JJ +INTEGER :: JIJK,JIJKOR,JIJKEND +! +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF MZM +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + IIU*IJU +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PMZM(JIJK,1,1) = 0.5*( PA(JIJK,1,1)+PA(JIJK-IIU*IJU,1,1) ) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JIJ=1,IIU*IJU + PMZM(JIJ,1,1) = -999. +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION MZM +! ############################### + FUNCTION DXF(PA) RESULT(PDXF) +! ############################### +! +!!**** *DXF* - Shuman operator : finite difference operator in x direction +!! for a variable at a flux side +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a finite difference +! along the x direction (I index) for a field PA localized at a x-flux +! point (u point). The result is localized at a mass point. +! +!!** METHOD +!! ------ +!! The result PDXF(i,:,:) is defined by (PA(i+1,:,:)-PA(i,:,:)) +!! At i=size(PA,1), PDXF(i,:,:) are replaced by the values of PDXF, +!! which are the right values in the x-cyclic case +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!! correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDXF ! result at mass + ! localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JI ! Loop index in x direction +INTEGER :: IIU ! upper bound in x direction of PA +! +INTEGER :: JJK,IJU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF DXF +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + 1 +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PDXF(JIJK-1,1,1) = PA(JIJK,1,1) - PA(JIJK-1,1,1) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JI=1,JPHEXT + DO JJK=1,IJU*IKU + PDXF(IIU-JPHEXT+JI,JJK,1) = PDXF(JPHEXT+JI,JJK,1) ! for reprod JPHEXT <> 1 + END DO +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION DXF +! ############################### + FUNCTION DXM(PA) RESULT(PDXM) +! ############################### +! +!!**** *DXM* - Shuman operator : finite difference operator in x direction +!! for a variable at a mass localization +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a finite difference +! along the x direction (I index) for a field PA localized at a mass +! point. The result is localized at a x-flux point (u point). +! +!!** METHOD +!! ------ +!! The result PDXM(i,:,:) is defined by (PA(i,:,:)-PA(i-1,:,:)) +!! At i=1, PDXM(1,:,:) are replaced by the values of PDXM, +!! which are the right values in the x-cyclic case. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDXM ! result at flux + ! side +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JI ! Loop index in x direction +INTEGER :: IIU ! Size of the array in the x direction +! +! +INTEGER :: JJK,IJU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF DXM +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + 1 +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PDXM(JIJK,1,1) = PA(JIJK,1,1) - PA(JIJK-1,1,1) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JI=1,JPHEXT + DO JJK=1,IJU*IKU + PDXM(JI,JJK,1) = PDXM(IIU-2*JPHEXT+JI,JJK,1) ! for reprod JPHEXT <> 1 + END DO +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION DXM +! ############################### + FUNCTION DYF(PA) RESULT(PDYF) +! ############################### +! +!!**** *DYF* - Shuman operator : finite difference operator in y direction +!! for a variable at a flux side +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a finite difference +! along the y direction (J index) for a field PA localized at a y-flux +! point (v point). The result is localized at a mass point. +! +!!** METHOD +!! ------ +!! The result PDYF(:,j,:) is defined by (PA(:,j+1,:)-PA(:,j,:)) +!! At j=size(PA,2), PDYF(:,j,:) are replaced by the values of PDYM, +!! which are the right values in the y-cyclic case +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!! correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDYF ! result at mass + ! localization +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JJ ! Loop index in y direction +INTEGER :: IJU ! upper bound in y direction of PA +! +! +INTEGER :: IIU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF DYF +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + IIU +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PDYF(JIJK-IIU,1,1) = PA(JIJK,1,1) - PA(JIJK-IIU,1,1) +END DO +! +DO JJ=1,JPHEXT + PDYF(:,IJU-JPHEXT+JJ,:) = PDYF(:,JPHEXT+JJ,:) ! for reprod JPHEXT <> 1 +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION DYF +! ############################### + FUNCTION DYM(PA) RESULT(PDYM) +! ############################### +! +!!**** *DYM* - Shuman operator : finite difference operator in y direction +!! for a variable at a mass localization +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a finite difference +! along the y direction (J index) for a field PA localized at a mass +! point. The result is localized at a y-flux point (v point). +! +!!** METHOD +!! ------ +!! The result PDYM(:,j,:) is defined by (PA(:,j,:)-PA(:,j-1,:)) +!! At j=1, PDYM(:,1,:) are replaced by the values of PDYM, +!! which are the right values in the y-cyclic case. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS: declaration of parameter variables +!! JPHEXT: define the number of marginal points out of the +!! physical domain along the horizontal directions. +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! Modification to include the periodic case 13/10/94 J.Stein +!! optimisation 20/08/00 J. Escobar +!! correction of in halo/pseudo-cyclic calculation for JPHEXT<> 1 +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDYM ! result at flux + ! side +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JJ ! Loop index in y direction +INTEGER :: IJU ! Size of the array in the y direction +! +! +INTEGER :: IIU,IKU +INTEGER :: JIJK,JIJKOR,JIJKEND +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF DYM +! ------------------ +! +IIU=SIZE(PA,1) +IJU=SIZE(PA,2) +IKU=SIZE(PA,3) +! +JIJKOR = 1 + IIU +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PDYM(JIJK,1,1) = PA(JIJK,1,1) - PA(JIJK-IIU,1,1) +END DO +! +DO JJ=1,JPHEXT + PDYM(:,JJ,:) = PDYM(:,IJU-2*JPHEXT+JJ,:) ! for reprod JPHEXT <> 1 +END DO +! +! +!------------------------------------------------------------------------------- +! +END FUNCTION DYM +! ############################### + FUNCTION DZF(PA, KKA, KKU, KL) RESULT(PDZF) +! ############################### +! +!!**** *DZF* - Shuman operator : finite difference operator in z direction +!! for a variable at a flux side +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a finite difference +! along the z direction (K index) for a field PA localized at a z-flux +! point (w point). The result is localized at a mass point. +! +!!** METHOD +!! ------ +!! The result PDZF(:,:,k) is defined by (PA(:,:,k+1)-PA(:,:,k)) +!! At k=size(PA,3), PDZF(:,:,k) is defined by -999. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at flux + ! side +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZF ! result at mass + ! localization +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME) +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME) +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JK ! Loop index in z direction +INTEGER :: IKU ! upper bound in z direction of PA +! +! +INTEGER :: IIU,IJU +INTEGER :: JIJ +INTEGER :: JIJK,JIJKOR,JIJKEND +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF DZF +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + IIU*IJU +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PDZF(JIJK-IIU*IJU,1,1) = PA(JIJK,1,1)-PA(JIJK-IIU*IJU,1,1) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JIJ=1,IIU*IJU + PDZF(JIJ,1,IKU) = -999. +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION DZF +! ############################### + FUNCTION DZM(PA, KKA, KKU, KL) RESULT(PDZM) +! ############################### +! +!!**** *DZM* - Shuman operator : finite difference operator in z direction +!! for a variable at a mass localization +!! +!! PURPOSE +!! ------- +! The purpose of this function is to compute a finite difference +! along the z direction (K index) for a field PA localized at a mass +! point. The result is localized at a z-flux point (w point). +! +!!** METHOD +!! ------ +!! The result PDZM(:,j,:) is defined by (PA(:,:,k)-PA(:,:,k-1)) +!! At k=1, PDZM(:,:,k) is defined by -999. +!! +!! +!! EXTERNAL +!! -------- +!! NONE +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! NONE +!! +!! REFERENCE +!! --------- +!! Book2 of documentation of Meso-NH (SHUMAN operators) +!! Technical specifications Report of The Meso-NH (chapters 3) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/07/94 +!! optimisation 20/08/00 J. Escobar +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declarations of argument and result +! ------------------------------------ +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at mass + ! localization +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PDZM ! result at flux + ! side +INTEGER, INTENT(IN),OPTIONAL :: KKA, KKU ! near ground and uppest atmosphere array indexes (AROME) +INTEGER, INTENT(IN),OPTIONAL :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise (AROME) +! +!* 0.2 Declarations of local variables +! ------------------------------- +! +INTEGER :: JK ! Loop index in z direction +INTEGER :: IKU ! upper bound in z direction of PA +! +! +INTEGER :: IIU,IJU +INTEGER :: JIJ +INTEGER :: JIJK,JIJKOR,JIJKEND +! +!------------------------------------------------------------------------------- +! +!* 1. DEFINITION OF DZM +! ------------------ +! +IIU = SIZE(PA,1) +IJU = SIZE(PA,2) +IKU = SIZE(PA,3) +! +JIJKOR = 1 + IIU*IJU +JIJKEND = IIU*IJU*IKU +! +!CDIR NODEP +!OCL NOVREC +DO JIJK=JIJKOR , JIJKEND + PDZM(JIJK,1,1) = PA(JIJK,1,1)-PA(JIJK-IIU*IJU,1,1) +END DO +! +!CDIR NODEP +!OCL NOVREC +DO JIJ=1,IIU*IJU + PDZM(JIJ,1,1) = -999. +END DO +! +!------------------------------------------------------------------------------- +! +END FUNCTION DZM diff --git a/src/mesonh/ext/ground_paramn.f90 b/src/mesonh/ext/ground_paramn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..c213d7c6e8c8c981f3a005e5ae3bdbfc4552899e --- /dev/null +++ b/src/mesonh/ext/ground_paramn.f90 @@ -0,0 +1,1032 @@ +!MNH_LIC Copyright 1994-2020 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 MODI_GROUND_PARAM_n +! ########## +! +INTERFACE +! + SUBROUTINE GROUND_PARAM_n( PSFTH, PSFRV, PSFSV, PSFCO2, PSFU, PSFV, & + PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD ) +! +!* surface fluxes +! -------------- +! +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH ! surface flux of potential temperature (Km/s) +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV ! surface flux of water vapor (m/s*kg/kg) +REAL, DIMENSION(:,:,:),INTENT(OUT):: PSFSV ! surface flux of scalar (m/s*kg/kg) + ! flux of chemical var. (ppp.m/s) +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFCO2! surface flux of CO2 (m/s*kg/kg) +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFU ! surface fluxes of horizontal +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFV ! momentum in x and y directions (m2/s2) +! +!* Radiative parameters +! -------------------- +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDIR_ALB ! direct albedo for each spectral band (-) +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSCA_ALB ! diffuse albedo for each spectral band (-) +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMIS ! surface emissivity (-) +REAL, DIMENSION(:,:), INTENT(OUT) :: PTSRAD ! surface radiative temperature (K) +! +END SUBROUTINE GROUND_PARAM_n +! +END INTERFACE +! +END MODULE MODI_GROUND_PARAM_n +! +! ###################################################################### + SUBROUTINE GROUND_PARAM_n( PSFTH, PSFRV, PSFSV, PSFCO2, PSFU, PSFV, & + PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD ) +! ####################################################################### +! +! +!!**** *GROUND_PARAM* +!! +!! PURPOSE +!! ------- +! Monitor to call the externalized surface +! +!!** METHOD +!! ------ +! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! Noilhan and Planton (1989) +!! +!! AUTHOR +!! ------ +!! S. Belair * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 10/03/95 +!! (J.Stein) 25/10/95 add the rain flux computation at the ground +!! and the lbc +!! (J.Stein) 15/11/95 include the strong slopes cases +!! (J.Stein) 06/02/96 bug correction for the precipitation flux writing +!! (J.Stein) 20/05/96 set the right IGRID value for the rain rate +!! (J.Viviand) 04/02/97 add cold and convective precipitation rate +!! (J.Stein) 22/06/97 use the absolute pressure +!! (V.Masson) 09/07/97 add directional z0 computations and RESA correction +!! (V.Masson) 13/02/98 merge the ISBA and TSZ0 routines, +!! rename the routine as a monitor, called by PHYS_PARAMn +!! add the town parameterization +!! recomputes z0 where snow is. +!! pack and unpack of 2D fields into 1D fields +!! (V.Masson) 04/01/00 removes the TSZ0 case +! (F.Solmon/V.Masson) adapatation for patch approach +! modification of internal subroutine pack/ allocation in function +! of patch indices +! calling of isba for each defined patch +! averaging of patch fluxes to get nat fluxes +! (P. Tulet/G.Guenais) 04/02/01 separation of vegetatives class +! for friction velocity and +! aerodynamical resistance +! (S Donnier) 09/12/02 add specific humidity at 2m for diagnostic +! (V.Masson) 01/03/03 externalisation of the surface schemes! +! (P.Tulet ) 01/11/03 externalisation of the surface chemistry! +!! (D.Gazen) 01/12/03 change emissions handling for surf. externalization +!! (J.escobar) 18/10/2012 missing USE MODI_COUPLING_SURF_ATM_n & MODI_DIAG_SURF_ATM_n +! (J.escobar) 02/2014 add Forefire coupling +!! (G.Delautier) 06/2016 phasage surfex 8 +!! (B.Vie) 2016 LIMA +!! (J.Pianezze) 08/2016 add send/recv oasis functions +!! (M.Leriche) 24/03/16 remove flag for chemical surface fluxes +!! (M.Leriche) 01/07/2017 Add DIAG chimical surface fluxes +!! 01/2018 (G.Delautier) SURFEX 8.1 +!! 02/2018 Q.Libois ECRAD +!! (P.Wautelet) 28/03/2018 replace TEMPORAL_DIST by DATETIME_DISTANCE + +!! (V. Vionnet) 18/07/2017 add coupling for blowing snow module +!! (Bielli S.) 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +! +#ifdef CPLOASIS +USE MODI_GET_HALO +USE MODI_MNH_OASIS_RECV +USE MODI_MNH_OASIS_SEND +USE MODD_SFX_OASIS, ONLY : LOASIS +USE MODD_DYN, ONLY : XSEGLEN +#endif +! +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_CST, ONLY : XP00, XCPD, XRD, XRV,XRHOLW, XDAY, XPI, XLVTT, XMD, XAVOGADRO +USE MODD_PARAMETERS, ONLY : JPVEXT, XUNDEF +USE MODD_DYN_n, ONLY : XTSTEP +USE MODD_CH_MNHC_n, ONLY : LUSECHEM +USE MODD_FIELD_n, ONLY : XUT, XVT, XWT, XTHT, XRT, XPABST, XSVT, XTKET, XZWS +USE MODD_METRICS_n, ONLY : XDXX, XDYY, XDZZ +USE MODD_DIM_n, ONLY : NKMAX +USE MODD_GRID_n, ONLY : XLON, XZZ, XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & + XCOSSLOPE, XSINSLOPE, XZS +USE MODD_REF_n, ONLY : XRHODREF,XRHODJ +USE MODD_CONF_n, ONLY : NRR +USE MODD_PARAM_n, ONLY : CDCONV,CCLOUD, CRAD +USE MODD_PRECIP_n, ONLY : XINPRC, XINPRR, XINPRS, XINPRG, XINPRH +USE MODD_DEEP_CONVECTION_n, ONLY : XPRCONV, XPRSCONV +USE MODD_CONF, ONLY : LCARTESIAN, CPROGRAM +USE MODD_TIME_n, ONLY : TDTCUR +USE MODD_RADIATIONS_n, ONLY : XFLALWD, XCCO2, XTSIDER, & + XSW_BANDS, XDIRSRFSWD, XSCAFLASWD, & + XZENITH, XAZIM, XAER, XSWU, XLWU +USE MODD_NSV +USE MODD_GRID, ONLY : XLON0, XRPK, XBETA +USE MODD_PARAM_ICE, ONLY : LSEDIC +USE MODD_PARAM_C2R2, ONLY : LSEDC +USE MODD_DIAG_IN_RUN +USE MODD_DUST, ONLY : LDUST +USE MODD_SALT, ONLY : LSALT +USE MODD_BLOWSNOW +USE MODD_BLOWSNOW_n +USE MODD_CH_AEROSOL, ONLY : LORILAM +USE MODD_CSTS_DUST, ONLY : XMOLARWEIGHT_DUST +USE MODD_CSTS_SALT, ONLY : XMOLARWEIGHT_SALT +USE MODD_CH_FLX_n, ONLY : XCHFLX +USE MODD_DIAG_FLAG, ONLY : LCHEMDIAG +! +USE MODI_NORMAL_INTERPOL +USE MODE_ROTATE_WIND, ONLY : ROTATE_WIND +USE MODI_SHUMAN +USE MODI_MNHGET_SURF_PARAM_n +USE MODI_COUPLING_SURF_ATM_n +USE MODI_DIAG_SURF_ATM_n +USE MODD_MNH_SURFEX_n +! +USE MODE_DATETIME +USE MODE_ll +USE MODD_ARGSLIST_ll, ONLY : LIST_ll +#ifdef MNH_FOREFIRE +!** MODULES FOR FOREFIRE **! +USE MODD_FOREFIRE +USE MODD_FOREFIRE_n +USE MODI_COUPLING_FOREFIRE_n +#endif +! +USE MODD_TIME_n +USE MODD_TIME +! +USE MODD_PARAM_LIMA, ONLY : MSEDC=>LSEDC +! +IMPLICIT NONE +! +! +! +!* 0.1 declarations of arguments +! +!* surface fluxes +! -------------- +! +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFTH ! surface flux of potential temperature (Km/s) +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFRV ! surface flux of water vapor (m/s*kg/kg) +REAL, DIMENSION(:,:,:),INTENT(OUT):: PSFSV ! surface flux of scalar (m/s*kg/kg) + ! flux of chemical var. (ppp.m/s) +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFCO2! surface flux of CO2 (m/s*kg/kg) +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFU ! surface fluxes of horizontal +REAL, DIMENSION(:,:), INTENT(OUT) :: PSFV ! momentum in x and y directions (m2/s2) +! +!* Radiative parameters +! -------------------- +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDIR_ALB ! direct albedo for each spectral band (-) +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSCA_ALB ! diffuse albedo for each spectral band (-) +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMIS ! surface emissivity (-) +REAL, DIMENSION(:,:), INTENT(OUT) :: PTSRAD ! surface radiative temperature (K) +! +! +!------------------------------------------------------------------------------- +! +! +! +!* 0.2 declarations of local variables +! ------------------------------- +! +! +!* Atmospheric variables +! --------------------- +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV ! vapor mixing ratio +! +! suffix 'A' stands for atmospheric variable at first model level +! +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZZREF ! Forcing height +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZTA ! Temperature +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZRVA ! vapor mixing ratio +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZQA ! humidity (kg/m3) +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZPA ! Pressure +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZPS ! Pressure +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZEXNA ! Exner function +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZEXNS ! Exner function +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZTHA ! potential temperature +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZRAIN ! liquid precipitation (kg/m2/s) +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSNOW ! solid precipitation (kg/m2/s) +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZTSUN ! solar time (s since midnight) +! +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZUA ! u component of the wind +! ! parallel to the orography +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZVA ! v component of the wind +! ! parallel to the orography +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZU ! zonal wind +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZV ! meridian wind +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZWIND ! wind parallel to the orography +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZRHOA ! air density +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZDIR ! wind direction (rad from N clockwise) +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFU ! zonal momentum flux +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFV ! meridian momentum flux +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZCO2 ! CO2 concentration (kg/kg) +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZALFA ! angle between the wind +! ! and the x axis +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),1):: ZU2D ! u and v component of the +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),1):: ZV2D ! wind at mass point +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFTH ! Turbulent flux of heat +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFTQ ! Turbulent flux of water +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2)) :: ZSFCO2 ! Turbulent flux of CO2 +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),NSV):: ZSFTS! Turbulent flux of scalar +! +REAL, DIMENSION(SIZE(PSFTH,1),SIZE(PSFTH,2),NBLOWSNOW_2D) :: ZBLOWSNOW_2D ! 2D blowing snow variables + ! after advection + ! They refer to the 2D fields advected by MNH including: + ! - total number concentration in Canopy + ! - total mass concentration in Canopy + ! - equivalent concentration in the saltation layer +! +!* Dimensions +! ---------- +! +INTEGER :: IIB ! physical boundary +INTEGER :: IIE ! physical boundary +INTEGER :: IJB ! physical boundary +INTEGER :: IJE ! physical boundary +INTEGER :: IKB ! physical boundary +INTEGER :: IKE ! physical boundary +INTEGER :: IKU ! vertical array sizes +! +INTEGER :: JLAYER ! loop counter +INTEGER :: JSV ! loop counter +INTEGER :: JI,JJ,JK ! loop index +! +INTEGER :: IDIM1 ! X physical dimension +INTEGER :: IDIM2 ! Y physical dimension +INTEGER :: IDIM1D! total physical dimension +INTEGER :: IKRAD +! +INTEGER :: KSV_SURF ! Number of scalar variables sent to SURFEX +! +!* Arrays put in 1D vectors +! ------------------------ +! +REAL, DIMENSION(:), ALLOCATABLE :: ZP_TSUN ! solar time +REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZENITH ! zenithal angle +REAL, DIMENSION(:), ALLOCATABLE :: ZP_AZIM ! azimuthal angle +REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZREF ! forcing height +REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZS ! orography +REAL, DIMENSION(:), ALLOCATABLE :: ZP_U ! zonal wind +REAL, DIMENSION(:), ALLOCATABLE :: ZP_V ! meridian wind +REAL, DIMENSION(:), ALLOCATABLE :: ZP_QA ! air humidity (kg/m3) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_TA ! air temperature +REAL, DIMENSION(:), ALLOCATABLE :: ZP_RHOA ! air density +REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SV ! scalar at first atmospheric level +REAL, DIMENSION(:), ALLOCATABLE :: ZP_CO2 ! air CO2 concentration +REAL, DIMENSION(:), ALLOCATABLE :: ZP_RAIN ! liquid precipitation +REAL, DIMENSION(:), ALLOCATABLE :: ZP_SNOW ! solid precipitation +REAL, DIMENSION(:), ALLOCATABLE :: ZP_LW ! incoming longwave +REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_DIR_SW ! direct incoming shortwave +REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SCA_SW ! diffuse incoming shortwave +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PS ! surface pressure +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PA ! pressure at first atmospheric level +REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZWS ! significant wave height (m) + +REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTQ ! water vapor flux +REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFTH ! potential temperature flux +REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SFTS ! scalar flux +REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFCO2 ! CO2 flux +REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFU ! zonal momentum flux +REAL, DIMENSION(:), ALLOCATABLE :: ZP_SFV ! meridian momentum flux +REAL, DIMENSION(:), ALLOCATABLE :: ZP_TSRAD ! radiative surface temperature +REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_DIR_ALB ! direct albedo +REAL, DIMENSION(:,:), ALLOCATABLE :: ZP_SCA_ALB ! diffuse albedo +REAL, DIMENSION(:), ALLOCATABLE :: ZP_EMIS ! emissivity + +REAL, DIMENSION(:), ALLOCATABLE :: ZP_TSURF +REAL, DIMENSION(:), ALLOCATABLE :: ZP_Z0 +REAL, DIMENSION(:), ALLOCATABLE :: ZP_Z0H +REAL, DIMENSION(:), ALLOCATABLE :: ZP_QSURF + +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEW_A_COEF ! coefficients for +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEW_B_COEF ! implicit coupling +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PET_A_COEF +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEQ_A_COEF +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PET_B_COEF +REAL, DIMENSION(:), ALLOCATABLE :: ZP_PEQ_B_COEF +REAL, DIMENSION(:), ALLOCATABLE :: ZP_RN ! net radiation (W/m2) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_H ! sensible heat flux (W/m2) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_LE ! latent heat flux (W/m2) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_GFLUX ! ground flux (W/m2) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_T2M ! Air temperature at 2 meters (K) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_Q2M ! Air humidity at 2 meters (kg/kg) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_HU2M ! Air relative humidity at 2 meters (-) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_ZON10M ! zonal Wind at 10 meters (m/s) +REAL, DIMENSION(:), ALLOCATABLE :: ZP_MER10M ! meridian Wind at 10 meters (m/s) +TYPE(LIST_ll), POINTER :: TZFIELDSURF_ll ! list of fields to exchange +INTEGER :: IINFO_ll ! return code of parallel routine +! +! +CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: YSV_SURF ! name of the scalar variables + ! sent to SURFEX +! +REAL :: ZTIMEC +INTEGER :: ILUOUT ! logical unit +! +!------------------------------------------------------------------------------- +! +! +ILUOUT=TLUOUT%NLU +IKB= 1+JPVEXT +IKU=NKMAX + 2* JPVEXT +IKE=IKU-JPVEXT +! +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +! +PSFTH = XUNDEF +PSFRV = XUNDEF +PSFSV = XUNDEF +PSFCO2 = XUNDEF +PSFU = XUNDEF +PSFV = XUNDEF +PDIR_ALB = XUNDEF +PSCA_ALB = XUNDEF +PEMIS = XUNDEF +PTSRAD = XUNDEF +! +! +!------------------------------------------------------------------------------- +! +!* 1. CONVERSION OF THE ATMOSPHERIC VARIABLES +! --------------------------------------- +! +! 1.1 water vapor +! ----------- + +! +ALLOCATE(ZRV(SIZE(PSFTH,1),SIZE(PSFTH,2),IKU)) +! +IF(NRR>0) THEN + ZRV(:,:,:)=XRT(:,:,:,1) +ELSE + ZRV(:,:,:)=0. +END IF +! +! 1.2 Horizontal wind direction (rad from N clockwise) +! ------------------------- +! +ZU2D(:,:,:)=MXF(XUT(:,:,IKB:IKB)) +ZV2D(:,:,:)=MYF(XVT(:,:,IKB:IKB)) +! +!* angle between Y axis and wind (rad., clockwise) +! +ZALFA = 0. +WHERE(ZU2D(:,:,1)/=0. .OR. ZV2D(:,:,1)/=0.) + ZALFA(:,:)=ATAN2(ZU2D(:,:,1),ZV2D(:,:,1)) +END WHERE +WHERE(ZALFA(:,:)<0.) ZALFA(:,:) = ZALFA(:,:) + 2. * XPI +! +!* angle between North and wind (rad., clockwise) +! +IF (.NOT. LCARTESIAN) THEN + ZDIR = ( (XRPK*(XLON(:,:)-XLON0)) - XBETA ) * XPI/180. + ZALFA +ELSE + ZDIR = - XBETA * XPI/180. + ZALFA +END IF +! +! +! 1.3 Rotate the wind +! --------------- +! +CALL ROTATE_WIND(XUT,XVT,XWT, & + XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & + XCOSSLOPE,XSINSLOPE, & + XDXX,XDYY,XDZZ, & + ZUA,ZVA ) + +! +! 1.4 zonal and meridian components of the wind parallel to the slope +! --------------------------------------------------------------- +! +ZWIND(:,:) = SQRT( ZUA**2 + ZVA**2 ) +! +ZU(:,:) = ZWIND(:,:) * SIN(ZDIR) +ZV(:,:) = ZWIND(:,:) * COS(ZDIR) +! +! 1.5 Horizontal interpolation the thermodynamic fields +! ------------------------------------------------- +! +CALL NORMAL_INTERPOL(XTHT,ZRV,XPABST, & + XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, & + XCOSSLOPE,XSINSLOPE, & + XDXX,XDYY,XDZZ, & + ZTHA,ZRVA,ZEXNA ) +! +DEALLOCATE(ZRV) +! +! +! 1.6 Pressure and Exner function +! --------------------------- +! +! +ZPA(:,:) = XP00 * ZEXNA(:,:) **(XCPD/XRD) +! +ZEXNS(:,:) = 0.5 * ( (XPABST(:,:,IKB-1)/XP00)**(XRD/XCPD) & + +(XPABST(:,:,IKB )/XP00)**(XRD/XCPD) & + ) +ZPS(:,:) = XP00 * ZEXNS(:,:) **(XCPD/XRD) +! +! 1.7 humidity in kg/m3 from the mixing ratio +! --------------------------------------- +! +! +ZQA(:,:) = ZRVA(:,:) * XRHODREF(:,:,IKB) +! +! +! 1.8 Temperature from the potential temperature +! ------------------------------------------ +! +! +ZTA(:,:) = ZTHA(:,:) * ZEXNA(:,:) +! +! +! 1.9 Air density +! ----------- +! +ZRHOA(:,:) = ZPA(:,:)/(XRD * ZTA(:,:) * ((1. + (XRD/XRV)*ZRVA(:,:))/ & + (1. + ZRVA(:,:)))) +! +! +! 1.10 Precipitations +! -------------- +! +ZRAIN=0. +ZSNOW=0. +IF (NRR>2 .AND. SIZE(XINPRR)>0 ) THEN + IF (( CCLOUD(1:3) == 'ICE' .AND. LSEDIC) .OR. & + ((CCLOUD == 'C2R2' .OR. CCLOUD == 'C3R5' .OR. CCLOUD == 'KHKO') .AND. LSEDC) .OR. & + ( CCLOUD=='LIMA' .AND. MSEDC)) THEN + ZRAIN = ZRAIN + XINPRR * XRHOLW + XINPRC * XRHOLW + ELSE + ZRAIN = ZRAIN + XINPRR * XRHOLW + END IF +END IF +IF (CDCONV == 'KAFR') THEN + ZRAIN = ZRAIN + (XPRCONV - XPRSCONV) * XRHOLW + ZSNOW = ZSNOW + XPRSCONV * XRHOLW +END IF +IF( NRR >= 5 .AND. SIZE(XINPRS)>0 ) ZSNOW = ZSNOW + XINPRS * XRHOLW +IF( NRR >= 6 .AND. SIZE(XINPRG)>0 ) ZSNOW = ZSNOW + XINPRG * XRHOLW +IF( NRR >= 7 .AND. SIZE(XINPRH)>0 ) ZSNOW = ZSNOW + XINPRH * XRHOLW +! +! +! 1.11 Solar time +! ---------- +! +IF (.NOT. LCARTESIAN) THEN + ZTSUN(:,:) = MOD(TDTCUR%xtime -XTSIDER*3600. +XLON(:,:)*240., XDAY) +ELSE + ZTSUN(:,:) = MOD(TDTCUR%xtime -XTSIDER*3600. +XLON0 *240., XDAY) +END IF +! +! 1.12 Forcing level +! ------------- +! +ZZREF(:,:) = 0.5*( XZZ(:,:,IKB+1)-XZZ(:,:,IKB) )*XDIRCOSZW(:,:) +! +! +! 1.13 CO2 concentration (kg/m3) +! ----------------- +! +ZCO2(:,:) = XCCO2 * XRHODREF(:,:,IKB) +! +! +! +! 1.14 Blowing snow scheme (optional) +! ----------------- +! +ZBLOWSNOW_2D=0. + +IF(LBLOWSNOW) THEN + KSV_SURF = NSV+NBLOWSNOW_2D ! When blowing snow scheme is used + ! NBLOWSN0W_2D variables are sent to SURFEX through ZP_SV. + ! They refer to the 2D fields advected by MNH including: + ! - total number concentration in Canopy + ! - total mass concentration in Canopy + ! - equivalent concentration in the saltation layer + ! Initialize array of scalar to be sent to SURFEX including 2D blowing snow fields + ALLOCATE(YSV_SURF(KSV_SURF)) + YSV_SURF(1:NSV) = CSV(:) + YSV_SURF(NSV+1:KSV_SURF) = YPBLOWSNOW_2D(:) + + + DO JSV=1,NBLOWSNOW_2D + ZBLOWSNOW_2D(:,:,JSV) = XRSNWCANOS(:,:,JSV)*XTSTEP/XRHODJ(:,:,IKB) + END DO + +ELSE + KSV_SURF = NSV + ALLOCATE(YSV_SURF(KSV_SURF)) + YSV_SURF(:) = CSV(:) +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 2. Call to surface monitor with 2D variables +! ----------------------------------------- +! +! +! initial values: +! +IDIM1 = IIE-IIB+1 +IDIM2 = IJE-IJB+1 +IDIM1D = IDIM1*IDIM2 +! +! +! Transform 2D input fields into 1D: +! +CALL RESHAPE_SURF(IDIM1D) +! +! call to have the cumulated time since beginning of simulation +! +CALL DATETIME_DISTANCE(TDTSEG,TDTCUR,ZTIMEC) + +#ifdef CPLOASIS +IF (LOASIS) THEN + IF ( MOD(ZTIMEC,1.0) .LE. 1E-2 .OR. (1.0 - MOD(ZTIMEC,1.0)) .LE. 1E-2 ) THEN + IF ( NINT(ZTIMEC-(XSEGLEN-XTSTEP)) .LT. 0 ) THEN + WRITE(ILUOUT,*) '----------------------------' + WRITE(ILUOUT,*) ' Reception des champs avec OASIS' + WRITE(ILUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC) + CALL MNH_OASIS_RECV(CPROGRAM,IDIM1D,SIZE(XSW_BANDS),ZTIMEC+XTSTEP,XTSTEP, & + ZP_ZENITH,XSW_BANDS , & + ZP_TSRAD,ZP_DIR_ALB,ZP_SCA_ALB,ZP_EMIS,ZP_TSURF) + WRITE(ILUOUT,*) '----------------------------' + END IF + END IF +END IF +#endif +! +! Call to surface schemes +! +CALL COUPLING_SURF_ATM_n(YSURF_CUR,'MESONH', 'E',ZTIMEC, & + XTSTEP, TDTCUR%nyear, TDTCUR%nmonth, TDTCUR%nday, TDTCUR%xtime, & + IDIM1D,KSV_SURF,SIZE(XSW_BANDS), & + ZP_TSUN, ZP_ZENITH,ZP_ZENITH, ZP_AZIM, & + ZP_ZREF, ZP_ZREF, ZP_ZS, ZP_U, ZP_V, ZP_QA, ZP_TA, ZP_RHOA, ZP_SV, ZP_CO2, YSV_SURF, & + ZP_RAIN, ZP_SNOW, ZP_LW, ZP_DIR_SW, ZP_SCA_SW, XSW_BANDS, ZP_PS, ZP_PA, & + ZP_SFTQ, ZP_SFTH, ZP_SFTS, ZP_SFCO2, ZP_SFU, ZP_SFV, & + ZP_TSRAD, ZP_DIR_ALB, ZP_SCA_ALB, ZP_EMIS, ZP_TSURF, ZP_Z0, ZP_Z0H, ZP_QSURF, & + ZP_PEW_A_COEF, ZP_PEW_B_COEF, & + ZP_PET_A_COEF, ZP_PEQ_A_COEF, ZP_PET_B_COEF, ZP_PEQ_B_COEF,ZP_ZWS, & + 'OK' ) +! +#ifdef CPLOASIS +IF (LOASIS) THEN + IF ( MOD(ZTIMEC,1.0) .LE. 1E-2 .OR. (1.0 - MOD(ZTIMEC,1.0)) .LE. 1E-2 ) THEN + IF (NINT(ZTIMEC-(XSEGLEN-XTSTEP)) .LT. 0) THEN + WRITE(ILUOUT,*) '----------------------------' + WRITE(ILUOUT,*) ' Envoi des champs avec OASIS' + WRITE(ILUOUT,*) 'NINT(ZTIMEC)=', NINT(ZTIMEC) + CALL MNH_OASIS_SEND(CPROGRAM,IDIM1D,ZTIMEC+XTSTEP,XTSTEP) + WRITE(ILUOUT,*) '----------------------------' + END IF + END IF +END IF +#endif +! +IF (CPROGRAM=='DIAG ' .OR. LDIAG_IN_RUN) THEN + CALL DIAG_SURF_ATM_n(YSURF_CUR,'MESONH') + CALL MNHGET_SURF_PARAM_n(PRN=ZP_RN,PH=ZP_H,PLE=ZP_LE,PGFLUX=ZP_GFLUX, & + PT2M=ZP_T2M,PQ2M=ZP_Q2M,PHU2M=ZP_HU2M, & + PZON10M=ZP_ZON10M,PMER10M=ZP_MER10M ) +END IF +! +! Transform 1D output fields into 2D: +! +CALL UNSHAPE_SURF(IDIM1,IDIM2) +#ifdef MNH_FOREFIRE +!------------------------! +! COUPLING WITH FOREFIRE ! +!------------------------! + +IF ( LFOREFIRE ) THEN + CALL FOREFIRE_DUMP_FIELDS_n(XUT, XVT, XWT, XSVT& + , XTHT, XRT(:,:,:,1), XPABST, XTKET& + , IDIM1+2, IDIM2+2, NKMAX+2) +END IF + +IF ( FFCOUPLING ) THEN + + CALL SEND_GROUND_WIND_n(XUT, XVT, IKB, IINFO_ll) + + CALL FOREFIRE_RECEIVE_PARAL_n() + + CALL COUPLING_FOREFIRE_n(XTSTEP, ZSFTH, ZSFTQ, ZSFTS) + + CALL FOREFIRE_SEND_PARAL_n(IINFO_ll) + +END IF + +FF_TIME = FF_TIME + XTSTEP +#endif +! +! Friction of components along slope axes (U: largest local slope axis, V: zero slope axis) +! +! +PSFU(:,:) = 0. +PSFV(:,:) = 0. +! +WHERE (ZSFU(:,:)/=XUNDEF .AND. ZWIND(:,:)>0.) + PSFU(:,:) = - SQRT(ZSFU**2+ZSFV**2) * ZUA(:,:) / ZWIND(:,:) / XRHODREF(:,:,IKB) + PSFV(:,:) = - SQRT(ZSFU**2+ZSFV**2) * ZVA(:,:) / ZWIND(:,:) / XRHODREF(:,:,IKB) +END WHERE +! +!* conversion from H (W/m2) to w'Theta' +! +PSFTH(:,:) = ZSFTH(:,:) / XCPD / XRHODREF(:,:,IKB) +! +! +!* conversion from water flux (kg/m2/s) to w'rv' +! +PSFRV(:,:) = ZSFTQ(:,:) / XRHODREF(:,:,IKB) +! +! +!* conversion from scalar flux (kg/m2/s) to w'rsv' +! +IF(NSV .GT. 0) THEN + DO JSV=1,NSV + PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) / XRHODREF(:,:,IKB) + END DO +END IF +! +!* conversion from chemistry flux (molec/m2/s) to (ppp.m.s-1) +! +IF (LUSECHEM) THEN + DO JSV=NSV_CHEMBEG,NSV_CHEMEND + PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / ( XAVOGADRO * XRHODREF(:,:,IKB)) + IF ((LCHEMDIAG).AND.(CPROGRAM == 'DIAG ')) XCHFLX(:,:,JSV) = PSFSV(:,:,JSV) + END DO +ELSE + PSFSV(:,:,NSV_CHEMBEG:NSV_CHEMEND) = 0. +END IF +! +!* conversion from dust flux (kg/m2/s) to (ppp.m.s-1) +! +IF (LDUST) THEN + DO JSV=NSV_DSTBEG,NSV_DSTEND + PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / (XMOLARWEIGHT_DUST * XRHODREF(:,:,IKB)) + END DO +ELSE + PSFSV(:,:,NSV_DSTBEG:NSV_DSTEND) = 0. +END IF +! +!* conversion from sea salt flux (kg/m2/s) to (ppp.m.s-1) +! +IF (LSALT) THEN + DO JSV=NSV_SLTBEG,NSV_SLTEND + PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / (XMOLARWEIGHT_SALT * XRHODREF(:,:,IKB)) + END DO +ELSE + PSFSV(:,:,NSV_SLTBEG:NSV_SLTEND) = 0. +END IF +! +!* conversion from aerosol flux (molec/m2/s) to (ppp.m.s-1) +! +IF (LORILAM) THEN + DO JSV=NSV_AERBEG,NSV_AEREND + PSFSV(:,:,JSV) = ZSFTS(:,:,JSV) * XMD / ( XAVOGADRO * XRHODREF(:,:,IKB)) + END DO +ELSE + PSFSV(:,:,NSV_AERBEG:NSV_AEREND) = 0. +END IF +! +!* conversion from blowing snow flux (kg/m2/s) to [kg(snow)/kg(dry air).m.s-1] +! +IF (LBLOWSNOW) THEN + DO JSV=NSV_SNWBEG,NSV_SNWEND + PSFSV(:,:,JSV) = ZSFTS(:,:,JSV)/ (ZRHOA(:,:)) + END DO + !* Update tendency for blowing snow 2D fields + DO JSV=1,(NBLOWSNOW_2D) + XRSNWCANOS(:,:,JSV) = ZBLOWSNOW_2D(:,:,JSV)*XRHODJ(:,:,IKB)/(XTSTEP*ZRHOA(:,:)) + END DO + +ELSE + PSFSV(:,:,NSV_SNWBEG:NSV_SNWEND) = 0. +END IF +! +!* conversion from CO2 flux (kg/m2/s) to w'CO2' +! +PSFCO2(:,:) = ZSFCO2(:,:) / XRHODREF(:,:,IKB) +! +! +!* Diagnostics +! ----------- +! +! +IF (LDIAG_IN_RUN) THEN + ! + XCURRENT_SFCO2(:,:) = ZSFCO2(:,:) + XCURRENT_DSTAOD(:,:)=0.0 + XCURRENT_SLTAOD(:,:)=0.0 + IF (CRAD=='ECMW') THEN + XCURRENT_LWD (:,:) = XFLALWD(:,:) + XCURRENT_SWD (:,:) = SUM(XDIRSRFSWD(:,:,:)+XSCAFLASWD(:,:,:),DIM=3) + XCURRENT_LWU (:,:) = XLWU(:,:,IKB) + XCURRENT_SWU (:,:) = XSWU(:,:,IKB) + XCURRENT_SWDIR(:,:) = SUM(XDIRSRFSWD,DIM=3) + XCURRENT_SWDIFF(:,:) = SUM(XSCAFLASWD(:,:,:),DIM=3) + DO JK=IKB,IKE + IKRAD = JK - 1 + DO JJ=IJB,IJE + DO JI=IIB,IIE + XCURRENT_DSTAOD(JI,JJ)=XCURRENT_DSTAOD(JI,JJ)+XAER(JI,JJ,IKRAD,3) + XCURRENT_SLTAOD(JI,JJ)=XCURRENT_SLTAOD(JI,JJ)+XAER(JI,JJ,IKRAD,2) + ENDDO + ENDDO + ENDDO + END IF +! + NULLIFY(TZFIELDSURF_ll) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_RN, 'GROUND_PARAM_n::XCURRENT_RN' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_H, 'GROUND_PARAM_n::XCURRENT_H' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LE, 'GROUND_PARAM_n::XCURRENT_LE' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_GFLUX, 'GROUND_PARAM_n::XCURRENT_GFLUX' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWD, 'GROUND_PARAM_n::XCURRENT_SWD' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SWU, 'GROUND_PARAM_n::XCURRENT_SWU' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWD, 'GROUND_PARAM_n::XCURRENT_LWD' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_LWU, 'GROUND_PARAM_n::XCURRENT_LWU' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_T2M, 'GROUND_PARAM_n::XCURRENT_T2M' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_Q2M, 'GROUND_PARAM_n::XCURRENT_Q2M' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_HU2M, 'GROUND_PARAM_n::XCURRENT_HU2M' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_ZON10M, 'GROUND_PARAM_n::XCURRENT_ZON10M' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_MER10M, 'GROUND_PARAM_n::XCURRENT_MER10M' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_DSTAOD, 'GROUND_PARAM_n::XCURRENT_DSTAOD' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SLTAOD, 'GROUND_PARAM_n::XCURRENT_SLTAOD' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_ZWS, 'GROUND_PARAM_n::XCURRENT_ZWS' ) + CALL ADD2DFIELD_ll( TZFIELDSURF_ll,XCURRENT_SFCO2, 'GROUND_PARAM_n::XCURRENT_SFCO2' ) + + CALL UPDATE_HALO_ll(TZFIELDSURF_ll,IINFO_ll) + CALL CLEANLIST_ll(TZFIELDSURF_ll) +END IF +! +!================================================================================== +! +CONTAINS +! +!================================================================================== +! +SUBROUTINE RESHAPE_SURF(KDIM1D) +! +INTEGER, INTENT(IN) :: KDIM1D +INTEGER, DIMENSION(1) :: ISHAPE_1 +! +ISHAPE_1 = (/KDIM1D/) +! +ALLOCATE(ZP_TSUN (KDIM1D)) +ALLOCATE(ZP_ZENITH (KDIM1D)) +ALLOCATE(ZP_AZIM (KDIM1D)) +ALLOCATE(ZP_ZREF (KDIM1D)) +ALLOCATE(ZP_ZS (KDIM1D)) +ALLOCATE(ZP_U (KDIM1D)) +ALLOCATE(ZP_V (KDIM1D)) +ALLOCATE(ZP_QA (KDIM1D)) +ALLOCATE(ZP_TA (KDIM1D)) +ALLOCATE(ZP_RHOA (KDIM1D)) +ALLOCATE(ZP_SV (KDIM1D,KSV_SURF)) +ALLOCATE(ZP_CO2 (KDIM1D)) +ALLOCATE(ZP_RAIN (KDIM1D)) +ALLOCATE(ZP_SNOW (KDIM1D)) +ALLOCATE(ZP_LW (KDIM1D)) +ALLOCATE(ZP_DIR_SW (KDIM1D,SIZE(XDIRSRFSWD,3))) +ALLOCATE(ZP_SCA_SW (KDIM1D,SIZE(XSCAFLASWD,3))) +ALLOCATE(ZP_PS (KDIM1D)) +ALLOCATE(ZP_PA (KDIM1D)) +ALLOCATE(ZP_ZWS (KDIM1D)) + +ALLOCATE(ZP_SFTQ (KDIM1D)) +ALLOCATE(ZP_SFTH (KDIM1D)) +ALLOCATE(ZP_SFU (KDIM1D)) +ALLOCATE(ZP_SFV (KDIM1D)) +ALLOCATE(ZP_SFTS (KDIM1D,KSV_SURF)) +ALLOCATE(ZP_SFCO2 (KDIM1D)) +ALLOCATE(ZP_TSRAD (KDIM1D)) +ALLOCATE(ZP_DIR_ALB (KDIM1D,SIZE(PDIR_ALB,3))) +ALLOCATE(ZP_SCA_ALB (KDIM1D,SIZE(PSCA_ALB,3))) +ALLOCATE(ZP_EMIS (KDIM1D)) +ALLOCATE(ZP_TSURF (KDIM1D)) +ALLOCATE(ZP_Z0 (KDIM1D)) +ALLOCATE(ZP_Z0H (KDIM1D)) +ALLOCATE(ZP_QSURF (KDIM1D)) +ALLOCATE(ZP_RN (KDIM1D)) +ALLOCATE(ZP_H (KDIM1D)) +ALLOCATE(ZP_LE (KDIM1D)) +ALLOCATE(ZP_GFLUX (KDIM1D)) +ALLOCATE(ZP_T2M (KDIM1D)) +ALLOCATE(ZP_Q2M (KDIM1D)) +ALLOCATE(ZP_HU2M (KDIM1D)) +ALLOCATE(ZP_ZON10M (KDIM1D)) +ALLOCATE(ZP_MER10M (KDIM1D)) + +!* explicit coupling only +ALLOCATE(ZP_PEW_A_COEF (KDIM1D)) +ALLOCATE(ZP_PEW_B_COEF (KDIM1D)) +ALLOCATE(ZP_PET_A_COEF (KDIM1D)) +ALLOCATE(ZP_PEQ_A_COEF (KDIM1D)) +ALLOCATE(ZP_PET_B_COEF (KDIM1D)) +ALLOCATE(ZP_PEQ_B_COEF (KDIM1D)) + +ZP_TSUN(:) = RESHAPE(ZTSUN(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_TA(:) = RESHAPE(ZTA(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_QA(:) = RESHAPE(ZQA(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_RHOA(:) = RESHAPE(ZRHOA(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_U(:) = RESHAPE(ZU(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_V(:) = RESHAPE(ZV(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_PS(:) = RESHAPE(ZPS(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_PA(:) = RESHAPE(ZPA(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_ZS(:) = RESHAPE(XZS(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_CO2(:) = RESHAPE(ZCO2(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_SNOW(:) = RESHAPE(ZSNOW(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_RAIN(:) = RESHAPE(ZRAIN(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_ZREF(:) = RESHAPE(ZZREF(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_ZWS(:) = RESHAPE(XZWS(IIB:IIE,IJB:IJE), ISHAPE_1) + +DO JLAYER=1,NSV + ZP_SV(:,JLAYER) = RESHAPE(XSVT(IIB:IIE,IJB:IJE,IKB,JLAYER), ISHAPE_1) +END DO +! +IF(LBLOWSNOW) THEN + DO JLAYER=1,NBLOWSNOW_2D + ZP_SV(:,NSV+JLAYER) = RESHAPE(ZBLOWSNOW_2D(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) + END DO +END IF +! +!chemical conversion : from part/part to molec./m3 +DO JLAYER=NSV_CHEMBEG,NSV_CHEMEND + ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XAVOGADRO * ZP_RHOA(:) / XMD +END DO +DO JLAYER=NSV_AERBEG,NSV_AEREND + ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XAVOGADRO * ZP_RHOA(:) / XMD +END DO +!dust conversion : from part/part to kg/m3 +DO JLAYER=NSV_DSTBEG,NSV_DSTEND + ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XMOLARWEIGHT_DUST* ZP_RHOA(:) / XMD +END DO +!sea salt conversion : from part/part to kg/m3 +DO JLAYER=NSV_SLTBEG,NSV_SLTEND + ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * XMOLARWEIGHT_SALT* ZP_RHOA(:) / XMD +END DO +! +!blowing snow conversion : from kg(snow)/kg(dry air) to kg(snow)/m3 +DO JLAYER=NSV_SNWBEG,NSV_SNWEND + ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * ZP_RHOA(:) +END DO + +IF(LBLOWSNOW) THEN ! Convert 2D blowing snow fields + ! from kg(snow)/kg(dry air) to kg(snow)/m3 + DO JLAYER=(NSV+1),KSV_SURF + ZP_SV(:,JLAYER) = ZP_SV(:,JLAYER) * ZP_RHOA(:) + END DO +END IF +! +ZP_ZENITH(:) = RESHAPE(XZENITH(IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_AZIM (:) = RESHAPE(XAZIM (IIB:IIE,IJB:IJE), ISHAPE_1) +ZP_LW(:) = RESHAPE(XFLALWD(IIB:IIE,IJB:IJE), ISHAPE_1) +DO JLAYER=1,SIZE(XDIRSRFSWD,3) + ZP_DIR_SW(:,JLAYER) = RESHAPE(XDIRSRFSWD(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) + ZP_SCA_SW(:,JLAYER) = RESHAPE(XSCAFLASWD(IIB:IIE,IJB:IJE,JLAYER), ISHAPE_1) +END DO +! +ZP_PEW_A_COEF = 0. +ZP_PEW_B_COEF = 0. +ZP_PET_A_COEF = 0. +ZP_PEQ_A_COEF = 0. +ZP_PET_B_COEF = 0. +ZP_PEQ_B_COEF = 0. +! +END SUBROUTINE RESHAPE_SURF +!================================================i================================= +SUBROUTINE UNSHAPE_SURF(KDIM1,KDIM2) +! +INTEGER, INTENT(IN) :: KDIM1, KDIM2 +INTEGER, DIMENSION(2) :: ISHAPE_2 +! +ISHAPE_2 = (/KDIM1,KDIM2/) +! +! Arguments in call to surface: +! +ZSFTH = XUNDEF +ZSFTQ = XUNDEF +IF (NSV>0) ZSFTS = XUNDEF +ZSFCO2 = XUNDEF +ZSFU = XUNDEF +ZSFV = XUNDEF +! +ZSFTH (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTH(:), ISHAPE_2) +ZSFTQ (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFTQ(:), ISHAPE_2) +DO JLAYER=1,SIZE(PSFSV,3) + ZSFTS (IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_SFTS(:,JLAYER), ISHAPE_2) +END DO +ZSFCO2 (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFCO2(:), ISHAPE_2) +ZSFU (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFU(:), ISHAPE_2) +ZSFV (IIB:IIE,IJB:IJE) = RESHAPE(ZP_SFV(:), ISHAPE_2) +DO JLAYER=1,SIZE(PEMIS,3) + PEMIS (IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_EMIS(:), ISHAPE_2) +END DO +PTSRAD (IIB:IIE,IJB:IJE) = RESHAPE(ZP_TSRAD(:), ISHAPE_2) +IF(LBLOWSNOW) THEN + DO JLAYER=1,NBLOWSNOW_2D + ZBLOWSNOW_2D(IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_SFTS(:,NSV+JLAYER), ISHAPE_2) + END DO +END IF +! +IF (LDIAG_IN_RUN) THEN + XCURRENT_RN (IIB:IIE,IJB:IJE) = RESHAPE(ZP_RN(:), ISHAPE_2) + XCURRENT_H (IIB:IIE,IJB:IJE) = RESHAPE(ZP_H (:), ISHAPE_2) + XCURRENT_LE (IIB:IIE,IJB:IJE) = RESHAPE(ZP_LE(:), ISHAPE_2) + XCURRENT_GFLUX (IIB:IIE,IJB:IJE) = RESHAPE(ZP_GFLUX(:), ISHAPE_2) + XCURRENT_T2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_T2M(:), ISHAPE_2) + XCURRENT_Q2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_Q2M(:), ISHAPE_2) + XCURRENT_HU2M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_HU2M(:), ISHAPE_2) + XCURRENT_ZON10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZON10M(:), ISHAPE_2) + XCURRENT_MER10M (IIB:IIE,IJB:IJE) = RESHAPE(ZP_MER10M(:), ISHAPE_2) + XCURRENT_ZWS (IIB:IIE,IJB:IJE) = RESHAPE(ZP_ZWS(:), ISHAPE_2) +ENDIF +! +DO JLAYER=1,SIZE(PDIR_ALB,3) + PDIR_ALB(IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_DIR_ALB(:,JLAYER), ISHAPE_2) + PSCA_ALB(IIB:IIE,IJB:IJE,JLAYER) = RESHAPE(ZP_SCA_ALB(:,JLAYER), ISHAPE_2) +END DO +! +DEALLOCATE(ZP_TSUN ) +DEALLOCATE(ZP_ZENITH ) +DEALLOCATE(ZP_AZIM ) +DEALLOCATE(ZP_ZREF ) +DEALLOCATE(ZP_ZS ) +DEALLOCATE(ZP_U ) +DEALLOCATE(ZP_V ) +DEALLOCATE(ZP_QA ) +DEALLOCATE(ZP_TA ) +DEALLOCATE(ZP_RHOA ) +DEALLOCATE(ZP_SV ) +DEALLOCATE(ZP_CO2 ) +DEALLOCATE(ZP_RAIN ) +DEALLOCATE(ZP_SNOW ) +DEALLOCATE(ZP_LW ) +DEALLOCATE(ZP_DIR_SW ) +DEALLOCATE(ZP_SCA_SW ) +DEALLOCATE(ZP_PS ) +DEALLOCATE(ZP_PA ) +DEALLOCATE(ZP_ZWS ) + +DEALLOCATE(ZP_SFTQ ) +DEALLOCATE(ZP_SFTH ) +DEALLOCATE(ZP_SFTS ) +DEALLOCATE(ZP_SFCO2 ) +DEALLOCATE(ZP_SFU ) +DEALLOCATE(ZP_SFV ) +DEALLOCATE(ZP_TSRAD ) +DEALLOCATE(ZP_DIR_ALB ) +DEALLOCATE(ZP_SCA_ALB ) +DEALLOCATE(ZP_EMIS ) +DEALLOCATE(ZP_RN ) +DEALLOCATE(ZP_H ) +DEALLOCATE(ZP_LE ) +DEALLOCATE(ZP_GFLUX ) +DEALLOCATE(ZP_T2M ) +DEALLOCATE(ZP_Q2M ) +DEALLOCATE(ZP_HU2M ) +DEALLOCATE(ZP_ZON10M ) +DEALLOCATE(ZP_MER10M ) + +DEALLOCATE(ZP_PEW_A_COEF ) +DEALLOCATE(ZP_PEW_B_COEF ) +DEALLOCATE(ZP_PET_A_COEF ) +DEALLOCATE(ZP_PEQ_A_COEF ) +DEALLOCATE(ZP_PET_B_COEF ) +DEALLOCATE(ZP_PEQ_B_COEF ) +! +END SUBROUTINE UNSHAPE_SURF +!================================================================================== +! +END SUBROUTINE GROUND_PARAM_n diff --git a/src/mesonh/ext/ice_adjust_bis.f90 b/src/mesonh/ext/ice_adjust_bis.f90 new file mode 100644 index 0000000000000000000000000000000000000000..c6f72a0868eee72ac6bd97ad98e4d3bd692529b2 --- /dev/null +++ b/src/mesonh/ext/ice_adjust_bis.f90 @@ -0,0 +1,155 @@ +!MNH_LIC Copyright 2012-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. +!----------------------------------------------------------------- +! ######spl + MODULE MODI_ICE_ADJUST_BIS +! ############################### +! +INTERFACE +! +! ################################################################# + SUBROUTINE ICE_ADJUST_BIS(PP,PTH,PR) +! ################################################################# +! +!! +!* 1.1 Declaration of Arguments +!! + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! Pressure +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTH ! thetal to transform into th +REAL, DIMENSION(:,:,:,:),INTENT(INOUT) :: PR ! Total mixing ratios to transform into rv,rc and ri +! +END SUBROUTINE ICE_ADJUST_BIS + +END INTERFACE +! +END MODULE MODI_ICE_ADJUST_BIS +! ######spl + SUBROUTINE ICE_ADJUST_BIS(PP,PTH,PR) +! ################################################################# +! +! +!!**** *ICE_ADJUST_BIS* - computes an adjusted state of thermodynamical variables +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! Valery Masson & C. Lac * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 09/2012 +!! M.Moge 08/2015 UPDATE_HALO_ll on PTH, ZRV, ZRC, ZRI +! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : XCPD, XRD, XP00 +! +USE MODI_COMPUTE_FUNCTION_THERMO +USE MODE_TH_R_FROM_THL_RT_3D +USE MODI_THLRT_FROM_THRVRCRI +! +USE MODE_ll +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! Pressure +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTH ! thetal to transform into th +REAL, DIMENSION(:,:,:,:),INTENT(INOUT) :: PR ! Total mixing ratios to transform into rv,rc and ri +! +!------------------------------------------------------------------------------- +! +! 0.2 declaration of local variables +REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZTHL, ZRW, ZRV, ZRC, & + ZRI, ZWORK +REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZFRAC_ICE, ZRSATW, ZRSATI +REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZT, ZEXN, ZLVOCPEXN,ZLSOCPEXN +INTEGER :: IRR +CHARACTER(LEN=1) :: YFRAC_ICE +! +INTEGER :: IINFO_ll +TYPE(LIST_ll), POINTER :: TZFIELDS_ll=>NULL() ! list of fields to exchange +!---------------------------------------------------------------------------- +! +!* 1 Initialisation +! -------------- +! +IRR = SIZE(PR,4) +! +ZRV(:,:,:)=0. +IF (IRR>=1) & +ZRV(:,:,:)=PR(:,:,:,1) +ZRC(:,:,:)=0. +IF (IRR>=2) & +ZRC(:,:,:)=PR(:,:,:,2) +ZRI(:,:,:)=0. +IF (IRR>=4) & +ZRI(:,:,:)=PR(:,:,:,4) +! +YFRAC_ICE='T' +ZFRAC_ICE(:,:,:) = 0. +! +!* 2 Computation +! ----------- +! +ZEXN(:,:,:)=(PP(:,:,:)/XP00)**(XRD/XCPD) +! +CALL COMPUTE_FUNCTION_THERMO( IRR, & + PTH, PR, ZEXN, PP, & + ZT,ZLVOCPEXN,ZLSOCPEXN ) + +! +CALL THLRT_FROM_THRVRCRI( IRR, PTH, PR, ZLVOCPEXN, ZLSOCPEXN,& + ZTHL, ZRW ) +! +CALL TH_R_FROM_THL_RT_3D(YFRAC_ICE,ZFRAC_ICE(:,:,:),PP(:,:,:), & + ZTHL(:,:,:), ZRW(:,:,:), PTH(:,:,:), & + ZRV(:,:,:), ZRC(:,:,:), ZRI(:,:,:), & + ZRSATW(:,:,:), ZRSATI(:,:,:),OOCEAN=.FALSE.) +CALL ADD3DFIELD_ll( TZFIELDS_ll, PTH, 'ICE_ADJUST_BIS::PTH') +IF (IRR>=1) THEN + CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRV, 'ICE_ADJUST_BIS::ZRV' ) +ENDIF +IF (IRR>=2) THEN + CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRC, 'ICE_ADJUST_BIS::ZRC' ) +ENDIF +IF (IRR>=4) THEN + CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRI, 'ICE_ADJUST_BIS::ZRI' ) +ENDIF +CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) +CALL CLEANLIST_ll(TZFIELDS_ll) +! + +IF (IRR>=1) & +PR(:,:,:,1) = ZRV(:,:,:) +IF (IRR>=2) & +PR(:,:,:,2) = ZRC(:,:,:) +IF (IRR>=4) & +PR(:,:,:,4) = ZRI(:,:,:) +! +END SUBROUTINE ICE_ADJUST_BIS diff --git a/src/mesonh/ext/lesn.f90 b/src/mesonh/ext/lesn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..acd15c8ed71f03f1986109b77a3979ceb09279bc --- /dev/null +++ b/src/mesonh/ext/lesn.f90 @@ -0,0 +1,3569 @@ +!MNH_LIC Copyright 2000-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 LES_n +! ################# +! +! +!!**** *LES_n* computes the current time-step LES diagnostics for model _n +!! +!! +!! PURPOSE +!! ------- +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! V. Masson +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/02/00 +!! 01/02/01 (D. Gazen) add module MODD_NSV for NSV variable +!! 06/11/02 (V. Masson) add LES budgets and use of anomalies +!! in LES quantities computations +!! 01/04/03 (V. Masson and F. Couvreux) bug in BL height loop +!! 10/07 (J.Pergaud) Add mass flux diagnostics +!! 06/08 (O.Thouron) Add radiative diagnostics +!! 12/10 (R.Honnert) Add EDKF mass flux in BL height +!! 10/09 (P. Aumond) Add possibility of user maskS +!! 10/14 (C.Lac) Correction on user masks +!! 10/16 (C.Lac) Add ground droplet deposition amount +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! 02/2019 (C. Lac) Add rain fraction as a LES diagnostic +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_CTURB, ONLY : XFTOP_O_FSURF +! +USE MODD_LES +USE MODD_LES_BUDGET +USE MODD_CONF +USE MODD_LES_n +USE MODD_RADIATIONS_n +USE MODD_GRID_n +USE MODD_REF_n +USE MODD_FIELD_n +USE MODD_CONF_n +USE MODD_PARAM_n +USE MODD_TURB_n +USE MODD_METRICS_n +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_PARAM_n, ONLY: CCLOUD +USE MODD_PRECIP_n, ONLY: XINPRR,XACPRR,XINPRR3D,XEVAP3D,XINPRC,XINDEP +USE MODD_NSV, ONLY : NSV, NSV_CS +USE MODD_PARAM_ICE, ONLY: LDEPOSC,LSEDIC +USE MODD_PARAM_C2R2, ONLY: LDEPOC,LSEDC +USE MODD_PARAM_LIMA, ONLY : MSEDC=>LSEDC +! +USE MODI_SHUMAN +USE MODI_GRADIENT_M +USE MODI_GRADIENT_U +USE MODI_GRADIENT_V +USE MODI_GRADIENT_W +USE MODI_LES_VER_INT +USE MODI_SPEC_VER_INT +USE MODI_LES_MEAN_ll +USE MODI_THL_RT_FROM_TH_R +USE MODI_LES_RES_TR +USE MODI_BUDGET_FLAGS +USE MODI_LES_BUDGET_TEND_n +USE MODE_BL_DEPTH_DIAG +! +USE MODE_ll +USE MODE_MODELN_HANDLER +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +! +! 0.2 declaration of local variables +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN ! Exner function +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHL ! liquid potential temperature +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV ! virtual potential temperature +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO ! air density +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: CHAMPXY1 !tableau intermediaire +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTEMP ! Temperature +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEW +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZINDCLD !indice cloud si rc>0 +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZINDCLD2 !indice cloud rc>1E-5 +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCLDFR_LES! CLDFR on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRAINFR_LES! RAINFR on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMASSF ! massflux=rho*w +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZREHU ! relative humidity + + +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZ_LES ! alt. on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZZZ_LES +REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZINPRR3D_LES ! precipitation flux 3D +REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZEVAP3D_LES !evaporation 3D +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZP_LES ! pres. on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDP_LES ! dynamical production TKE +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTP_LES ! thermal production TKE +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTR_LES ! transport production TKE +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDISS_LES ! dissipation TKE +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLM_LES ! mixing length + +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDPDZ_LES ! dp/dz on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDTHLDZ_LES ! dThl/dz on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDTHDZ_LES ! dTh/dz on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDRTDZ_LES ! dRt/dz on LES vertical grid +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZDSvDZ_LES ! dSv/dz on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDUDZ_LES ! du/dz on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDVDZ_LES ! dv/dz on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDWDZ_LES ! dw/dz on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN_LES ! Exner on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO_LES ! rho on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZU_LES ! U on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZV_LES ! V on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZW_LES ! W on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMF_LES ! mass flux on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTH_LES ! Theta on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV_LES ! thv on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHL_LES ! thl on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTKE_LES ! tke on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZKE_LES ! ke on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV_LES ! Rv on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZREHU_LES ! Rehu on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC_LES ! Rc on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRR_LES ! Rr on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRI_LES ! Ri on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRS_LES ! Rs on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRG_LES ! Rg on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRH_LES ! Rh on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRT_LES ! Rt on LES vertical grid +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_LES ! Sv on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTH_ANOM ! Theta anomaly on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHV_ANOM ! thv anomaly on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV_ANOM ! Rv anomaly on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC_ANOM ! Rc anomaly on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRI_ANOM ! Ri anomaly on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRR_ANOM ! Rr anomaly on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZP_ANOM ! p anomaly on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO_ANOM ! rho anomaly on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDPDZ_ANOM! dp/dz anomaly on LES vertical grid +REAL, DIMENSION(:), ALLOCATABLE :: ZMEAN_DPDZ! dp/dz mean on LES vertical grid +REAL, DIMENSION(:), ALLOCATABLE :: ZLES_MEAN_DRtDZ! drt/dz mean on LES vertical grid +REAL, DIMENSION(:), ALLOCATABLE :: ZLES_MEAN_DTHDZ! dth/dz mean on LES vertical grid +REAL, DIMENSION(:,:), ALLOCATABLE :: ZLES_MEAN_DSVDZ! drt/dz mean on LES vertical grid +REAL, DIMENSION(:,:), ALLOCATABLE :: ZLWP_LES, ZRWP_LES, ZTKET_LES +REAL, DIMENSION(:,:), ALLOCATABLE :: ZIWP_LES, ZSWP_LES, ZGWP_LES, ZHWP_LES +REAL, DIMENSION(:,:), ALLOCATABLE :: ZINDCLD2D ! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZINDCLD2D2 ! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZLWP_ANOM ! lwp anomaly +REAL, DIMENSION(:,:), ALLOCATABLE :: ZMAXWRR2D ! maxwrr2D +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZU_SPEC ! U on SPEC vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZV_SPEC ! V on SPEC vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZW_SPEC ! W on SPEC vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTH_SPEC ! Theta on SPEC vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHL_SPEC ! thl on SPEC vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV_SPEC ! Rv on SPEC vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC_SPEC ! Rc on SPEC vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRI_SPEC ! Ri on SPEC vertical grid +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSV_SPEC ! Sv on SPEC vertical grid +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRT ! rv+rc+rr+ri+rs+rg+rh +REAL, DIMENSION(:), ALLOCATABLE :: ZWORK1D,ZWORK1DT +REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK2D +REAL :: ZINPRRm,ZCOUNT +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRADEFF_LES ! Re on LES vertical grid +!!fl sw, lw, dthrad on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSWU_LES ! SWU on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSWD_LES ! SWD on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLWU_LES ! LWU on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLWD_LES ! LWD on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDTHRADSW_LES ! DTHRADSW on LES vertical grid +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDTHRADLW_LES ! DTHRADLW on LES vertical grid +! +REAL, DIMENSION(:), ALLOCATABLE :: ZWORK ! +! +INTEGER :: IRR ! moist variables counter +INTEGER :: JSV ! scalar variables counter +INTEGER :: IIU, IJU ! array sizes +INTEGER :: IKE,IKB +INTEGER :: JI, JJ, JK ! loop counters +INTEGER :: IIU_ll, IJU_ll ! total domain I size (fin) +INTEGER :: IIA_ll, IJA_ll ! total domain I size (debut) +INTEGER :: IINFO_ll ! return code of parallel routine +INTEGER :: IIMAX_ll, IJMAX_ll ! total physical domain I size +INTEGER :: JLOOP +! +INTEGER :: IMASK ! mask counter +INTEGER :: IMASKUSER! mask user number +! +INTEGER :: IRESP, ILUOUT +INTEGER :: IMI ! Current model index +!------------------------------------------------------------------------------- +! +IMI = GET_CURRENT_MODEL_INDEX() +! +IF (.NOT. LLES_CALL) RETURN +! +CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll) +IIU_ll = IIMAX_ll+JPHEXT +IJU_ll = IJMAX_ll+JPHEXT +IIA_ll=JPHEXT+1 +IJA_ll=JPHEXT+1 +IKE=SIZE(XVT,3)-JPVEXT +IKB=1+JPVEXT +CALL GET_DIM_EXT_ll('B',IIU,IJU) +! +ILUOUT = TLUOUT%NLU +! +!------------------------------------------------------------------------------- +! +!* interpolation coefficients for Z type grid +! +IF (CSPECTRA_LEVEL_TYPE=='Z') THEN + IF (ALLOCATED(XCOEFLIN_CURRENT_SPEC)) DEALLOCATE(XCOEFLIN_CURRENT_SPEC) + IF (ALLOCATED(NKLIN_CURRENT_SPEC )) DEALLOCATE(NKLIN_CURRENT_SPEC ) + ! + ALLOCATE(XCOEFLIN_CURRENT_SPEC(IIU,IJU,NSPECTRA_K)) + ALLOCATE(NKLIN_CURRENT_SPEC (IIU,IJU,NSPECTRA_K)) + ! + XCOEFLIN_CURRENT_SPEC(:,:,:) = XCOEFLIN_SPEC(:,:,:) + NKLIN_CURRENT_SPEC (:,:,:) = NKLIN_SPEC (:,:,:) +END IF +! +!------------------------------------------------------------------------------- +! +!* 1. Allocations +! ----------- +! +ALLOCATE(ZP_LES (IIU,IJU,NLES_K)) +ALLOCATE(ZDP_LES (IIU,IJU,NLES_K)) +ALLOCATE(ZTP_LES (IIU,IJU,NLES_K)) +ALLOCATE(ZTR_LES (IIU,IJU,NLES_K)) +ALLOCATE(ZDISS_LES (IIU,IJU,NLES_K)) +ALLOCATE(ZLM_LES (IIU,IJU,NLES_K)) +ALLOCATE(ZDTHLDZ_LES(IIU,IJU,NLES_K)) +ALLOCATE(ZDTHDZ_LES(IIU,IJU,NLES_K)) +ALLOCATE(ZDRTDZ_LES(IIU,IJU,NLES_K)) +ALLOCATE(ZDUDZ_LES(IIU,IJU,NLES_K)) +ALLOCATE(ZDVDZ_LES(IIU,IJU,NLES_K)) +ALLOCATE(ZDWDZ_LES(IIU,IJU,NLES_K)) +ALLOCATE(ZDSVDZ_LES(IIU,IJU,NLES_K,NSV)) + +ALLOCATE(ZDPDZ_LES(IIU,IJU,NLES_K)) +ALLOCATE(ZEXN_LES (IIU,IJU,NLES_K)) +ALLOCATE(ZRHO_LES (IIU,IJU,NLES_K)) +ALLOCATE(ZU_LES (IIU,IJU,NLES_K)) +ALLOCATE(ZV_LES (IIU,IJU,NLES_K)) +ALLOCATE(ZW_LES (IIU,IJU,NLES_K)) +ALLOCATE(ZMF_LES (IIU,IJU,NLES_K)) +ALLOCATE(ZTH_LES (IIU,IJU,NLES_K)) +IF (CRAD /= 'NONE') THEN + ALLOCATE(ZRADEFF_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZSWU_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZSWD_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZLWU_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZLWD_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZDTHRADSW_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZDTHRADLW_LES (IIU,IJU,NLES_K)) +ELSE + ALLOCATE(ZRADEFF_LES (0,0,0)) + ALLOCATE(ZSWU_LES (0,0,0)) + ALLOCATE(ZSWD_LES (0,0,0)) + ALLOCATE(ZLWU_LES (0,0,0)) + ALLOCATE(ZLWD_LES (0,0,0)) + ALLOCATE(ZDTHRADSW_LES (0,0,0)) + ALLOCATE(ZDTHRADLW_LES (0,0,0)) +END IF +IF (LUSERV) THEN + ALLOCATE(ZTHV_LES (IIU,IJU,NLES_K)) +ELSE + ALLOCATE(ZTHV_LES (0,0,0)) +END IF +ALLOCATE(ZTHL_LES (IIU,IJU,NLES_K)) +ALLOCATE(ZTKE_LES (IIU,IJU,NLES_K)) +ALLOCATE(ZKE_LES(IIU,IJU,NLES_K)) +ALLOCATE(ZTKET_LES(IIU,IJU)) +ALLOCATE(ZWORK1D (NLES_K)) +ALLOCATE(ZWORK1DT (NLES_K)) +ALLOCATE(ZZZ_LES(IIU,IJU,NLES_K)) +IF (LUSERV) THEN + ALLOCATE(ZRV_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZRT_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZREHU_LES (IIU,IJU,NLES_K)) +ELSE + ALLOCATE(ZRV_LES (0,0,0)) + ALLOCATE(ZRT_LES (0,0,0)) + ALLOCATE(ZREHU_LES (0,0,0)) +END IF +IF (LUSERC) THEN + ALLOCATE(ZRC_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZLWP_LES(IIU,IJU)) + ALLOCATE(ZINDCLD2D(IIU,IJU)) + ALLOCATE(ZINDCLD2D2(IIU,IJU)) + ALLOCATE(ZCLDFR_LES(IIU,IJU,NLES_K)) + ALLOCATE(ZWORK2D(IIU,IJU)) + ALLOCATE(ZLWP_ANOM(IIU,IJU)) +ELSE + ALLOCATE(ZRC_LES (0,0,0)) + ALLOCATE(ZLWP_LES(0,0)) + ALLOCATE(ZINDCLD2D(0,0)) + ALLOCATE(ZINDCLD2D2(0,0)) + ALLOCATE(ZCLDFR_LES(0,0,0)) + ALLOCATE(ZWORK2D(0,0)) + ALLOCATE(ZLWP_ANOM(0,0)) +END IF +IF (LUSERR) THEN + ALLOCATE(ZRR_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZMAXWRR2D(IIU,IJU)) + ALLOCATE(ZRWP_LES(IIU,IJU)) + ALLOCATE(ZINPRR3D_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZEVAP3D_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZRAINFR_LES(IIU,IJU,NLES_K)) +ELSE + ALLOCATE(ZRR_LES (0,0,0)) + ALLOCATE(ZMAXWRR2D(0,0)) + ALLOCATE(ZRWP_LES(0,0)) + ALLOCATE(ZINPRR3D_LES(0,0,0)) + ALLOCATE(ZEVAP3D_LES(0,0,0)) + ALLOCATE(ZRAINFR_LES(0,0,0)) +END IF +IF (LUSERI) THEN + ALLOCATE(ZRI_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZIWP_LES(IIU,IJU)) +ELSE + ALLOCATE(ZRI_LES (0,0,0)) + ALLOCATE(ZIWP_LES(0,0)) +END IF +IF (LUSERS) THEN + ALLOCATE(ZRS_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZSWP_LES(IIU,IJU)) +ELSE + ALLOCATE(ZRS_LES (0,0,0)) + ALLOCATE(ZSWP_LES(0,0)) +END IF +IF (LUSERG) THEN + ALLOCATE(ZRG_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZGWP_LES(IIU,IJU)) +ELSE + ALLOCATE(ZRG_LES (0,0,0)) + ALLOCATE(ZGWP_LES(0,0)) +END IF +IF (LUSERH) THEN + ALLOCATE(ZRH_LES (IIU,IJU,NLES_K)) + ALLOCATE(ZHWP_LES(IIU,IJU)) +ELSE + ALLOCATE(ZRH_LES (0,0,0)) + ALLOCATE(ZHWP_LES(0,0)) +END IF +IF (NSV>0) THEN + ALLOCATE(ZSV_LES (IIU,IJU,NLES_K,NSV)) +ELSE + ALLOCATE(ZSV_LES (0,0,0,0)) +END IF +! +ALLOCATE(ZP_ANOM (IIU,IJU,NLES_K)) +ALLOCATE(ZRHO_ANOM (IIU,IJU,NLES_K)) +ALLOCATE(ZTH_ANOM (IIU,IJU,NLES_K)) +ALLOCATE(ZDPDZ_ANOM(IIU,IJU,NLES_K)) +IF (LUSERV) THEN + ALLOCATE(ZTHV_ANOM(IIU,IJU,NLES_K)) + ALLOCATE(ZRV_ANOM (IIU,IJU,NLES_K)) +ELSE + ALLOCATE(ZTHV_ANOM(0,0,0)) + ALLOCATE(ZRV_ANOM (0,0,0)) +END IF +IF (LUSERC) THEN + ALLOCATE(ZRC_ANOM (IIU,IJU,NLES_K)) +ELSE + ALLOCATE(ZRC_ANOM (0,0,0)) +END IF +IF (LUSERI) THEN + ALLOCATE(ZRI_ANOM (IIU,IJU,NLES_K)) +ELSE + ALLOCATE(ZRI_ANOM (0,0,0)) +END IF +IF (LUSERR) THEN + ALLOCATE(ZRR_ANOM (IIU,IJU,NLES_K)) +ELSE + ALLOCATE(ZRR_ANOM (0,0,0)) +END IF +ALLOCATE(ZMEAN_DPDZ(NLES_K)) +ALLOCATE(ZLES_MEAN_DTHDZ(NLES_K)) +! +! +ALLOCATE(ZU_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) +ALLOCATE(ZV_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) +ALLOCATE(ZW_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) +ALLOCATE(ZTH_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) +IF (LUSERC) THEN + ALLOCATE(ZTHL_SPEC(NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) +ELSE + ALLOCATE(ZTHL_SPEC(0,0,0)) +END IF +IF (LUSERV) THEN + ALLOCATE(ZRV_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) +ELSE + ALLOCATE(ZRV_SPEC (0,0,0)) +END IF +IF (LUSERC) THEN + ALLOCATE(ZRC_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) +ELSE + ALLOCATE(ZRC_SPEC (0,0,0)) +END IF +IF (LUSERI) THEN + ALLOCATE(ZRI_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K)) +ELSE + ALLOCATE(ZRI_SPEC (0,0,0)) +END IF +IF (NSV>0) THEN + ALLOCATE(ZSV_SPEC (NSPECTRA_NI,NSPECTRA_NJ,NSPECTRA_K,NSV)) +ELSE + ALLOCATE(ZSV_SPEC (0,0,0,0)) +END IF +! +! +ALLOCATE(ZEXN (IIU,IJU,SIZE(XTHT,3))) +ALLOCATE(ZRHO (IIU,IJU,SIZE(XTHT,3))) +ALLOCATE(ZRT (IIU,IJU,SIZE(XTHT,3))) +ALLOCATE(ZTHV (IIU,IJU,SIZE(XTHT,3))) +ALLOCATE(ZTHL (IIU,IJU,SIZE(XTHT,3))) +ALLOCATE(ZEW (IIU,IJU,SIZE(XTHT,3))) +ALLOCATE(ZMASSF (IIU,IJU,SIZE(XTHT,3))) +ALLOCATE(ZTEMP (IIU,IJU,SIZE(XTHT,3))) +ALLOCATE(ZREHU (IIU,IJU,SIZE(XTHT,3))) +ALLOCATE(CHAMPXY1 (IIU,IJU,1)) +! +!------------------------------------------------------------------------------- +! +!* 1.2 preliminary calculations +! ------------------------ +! +ZEXN(:,:,:) = (XPABST/XP00)**(XRD/XCPD) +! +! +!* computation of relative humidity +ZTEMP=XTHT*ZEXN +ZEW=EXP (XALPW -XBETAW/ZTEMP-XGAMW*ALOG(ZTEMP)) +IF (LUSERV) THEN + ZREHU(:,:,:)=100.*XRT(:,:,:,1)*XPABST(:,:,:)/((XRD/XRV+XRT(:,:,:,1))*ZEW(:,:,:)) +ELSE + ZREHU(:,:,:)=0. +END IF +! +CALL THL_RT_FROM_TH_R(LUSERV, LUSERC, LUSERR, & + LUSERI, LUSERS, LUSERG, LUSERH, & + XCURRENT_L_O_EXN_CP, & + XTHT, XRT, & + ZTHL, ZRT ) +! +!* computation of density and virtual potential temperature +! +ZTHV=XTHT +IF (LUSERV) ZTHV=ZTHV*(1.+XRV/XRD*XRT(:,:,:,1))/(1.+ZRT(:,:,:)) +! +IF (CEQNSYS=='DUR') THEN + ZRHO=XPABST/(XRD*ZTHV*ZEXN) +ELSE + ZRHO=XRHODREF*( 1. + (XCPD-XRD)/XRD*(ZEXN/XEXNREF - 1.) - (ZTHV/XTHVREF - 1.) ) +END IF +! +! computation of mass flux +ZMASSF=MZM(ZRHO)*XWT +! +!------------------------------------------------------------------------------- +! +!* 2. Vertical interpolations to LES vertical grid +! -------------------------------------------- +! +!* note that velocity fields are first localized on the MASS points +! +! +IF (CRAD /= 'NONE') THEN + CALL LES_VER_INT( XRADEFF, ZRADEFF_LES) + CALL LES_VER_INT( XSWU, ZSWU_LES) + CALL LES_VER_INT( XSWD, ZSWD_LES) + CALL LES_VER_INT( XLWU, ZLWU_LES) + CALL LES_VER_INT( XLWD, ZLWD_LES) + CALL LES_VER_INT( XDTHRADSW, ZDTHRADSW_LES) + CALL LES_VER_INT( XDTHRADLW, ZDTHRADLW_LES) +END IF +! +CALL LES_VER_INT( XZZ , ZZZ_LES) +CALL LES_VER_INT( XPABST, ZP_LES ) +CALL LES_VER_INT( XDYP, ZDP_LES ) +CALL LES_VER_INT( XTHP, ZTP_LES ) +CALL LES_VER_INT( XTR, ZTR_LES ) +CALL LES_VER_INT( XDISS, ZDISS_LES ) +CALL LES_VER_INT( XLEM, ZLM_LES ) +CALL LES_VER_INT( GZ_M_M(XPABST,XDZZ), ZDPDZ_LES ) +! +CALL LES_VER_INT( MXF(XUT) ,ZU_LES ) +CALL LES_VER_INT( MYF(XVT) ,ZV_LES ) +CALL LES_VER_INT( MZF(XWT) ,ZW_LES ) +CALL LES_VER_INT( MZF(ZMASSF) ,ZMF_LES) +CALL LES_VER_INT( XTHT ,ZTH_LES ) +CALL LES_VER_INT( MXF(MZF(GZ_U_UW(XUT,XDZZ))), ZDUDZ_LES ) +CALL LES_VER_INT( MYF(MZF(GZ_V_VW(XVT,XDZZ))), ZDVDZ_LES ) +CALL LES_VER_INT( GZ_W_M(XWT,XDZZ), ZDWDZ_LES ) +CALL LES_VER_INT( ZEXN, ZEXN_LES) +! +CALL LES_VER_INT( GZ_M_M(XTHT,XDZZ), ZDTHDZ_LES ) +! +CALL LES_VER_INT(ZRHO, ZRHO_LES) +! +IF (LUSERV) CALL LES_VER_INT(ZTHV, ZTHV_LES) +CALL LES_VER_INT(ZTHL, ZTHL_LES) +CALL LES_VER_INT( GZ_M_M(ZTHL,XDZZ), ZDTHLDZ_LES ) +! +CALL LES_VER_INT( XTKET ,ZTKE_LES) +IRR = 0 +IF (LUSERV) THEN + IRR = IRR + 1 + CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRV_LES ) + CALL LES_VER_INT( ZRT(:,:,:) ,ZRT_LES ) + CALL LES_VER_INT( GZ_M_M(ZRT,XDZZ), ZDRTDZ_LES ) + CALL LES_VER_INT( ZREHU(:,:,:) ,ZREHU_LES) +END IF +IF (LUSERC) THEN + IRR = IRR + 1 + CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRC_LES ) + ALLOCATE(ZINDCLD (IIU,IJU,NLES_K)) + ALLOCATE(ZINDCLD2(IIU,IJU,NLES_K)) + ZINDCLD = CEILING(ZRC_LES-1.E-6) + ZINDCLD2 = CEILING(ZRC_LES-1.E-5) + CALL LES_VER_INT( XCLDFR(:,:,:) ,ZCLDFR_LES ) +ELSE + ALLOCATE(ZINDCLD (0,0,0)) + ALLOCATE(ZINDCLD2(0,0,0)) +END IF +IF (LUSERR) THEN + IRR = IRR + 1 + CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRR_LES ) + CALL LES_VER_INT( XINPRR3D(:,:,:), ZINPRR3D_LES) + CALL LES_VER_INT( XEVAP3D(:,:,:), ZEVAP3D_LES) + CALL LES_VER_INT( XRAINFR(:,:,:) ,ZRAINFR_LES ) +END IF +IF (LUSERC) THEN + DO JJ=1,IJU + DO JI=1,IIU + ZINDCLD2D(JI,JJ) = maxval(ZINDCLD(JI,JJ,:)) + ZINDCLD2D2(JI,JJ)= maxval(ZINDCLD2(JI,JJ,:)) + END DO + END DO + !* integration of rho rc + !!!ZLWP_LES only for cloud water + ZLWP_LES(:,:) = 0. + DO JK=1,NLES_K-1 + ZLWP_LES(:,:) = ZLWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & + * (ZRC_LES(:,:,JK)) * ZRHO_LES(:,:,JK) + END DO + CALL LES_MEAN_ll ( ZLWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & + XLES_LWP(NLES_CURRENT_TCOUNT) ) +! +END IF + + !!!ZRWP_LES only for rain water +IF (LUSERR) THEN + ZRWP_LES(:,:)=0. + DO JK=1,NLES_K-1 + ZRWP_LES(:,:) = ZRWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & + * (ZRR_LES(:,:,JK)) * ZRHO_LES(:,:,JK) + END DO + CALL LES_MEAN_ll ( ZRWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & + XLES_RWP(NLES_CURRENT_TCOUNT) ) +ENDIF +! +IF (LUSERI) THEN + IRR = IRR + 1 + CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRI_LES ) + ZIWP_LES(:,:)=0. + DO JK=1,NLES_K-1 + ZIWP_LES(:,:) = ZIWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & + * (ZRI_LES(:,:,JK)) * ZRHO_LES(:,:,JK) + END DO + CALL LES_MEAN_ll ( ZIWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & + XLES_IWP(NLES_CURRENT_TCOUNT) ) +END IF +IF (LUSERS) THEN + IRR = IRR + 1 + CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRS_LES ) + ZSWP_LES(:,:)=0. + DO JK=1,NLES_K-1 + ZSWP_LES(:,:) = ZSWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & + * (ZRS_LES(:,:,JK)) * ZRHO_LES(:,:,JK) + END DO + CALL LES_MEAN_ll ( ZSWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & + XLES_SWP(NLES_CURRENT_TCOUNT) ) +END IF +IF (LUSERG) THEN + IRR = IRR + 1 + CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRG_LES ) + ZGWP_LES(:,:)=0. + DO JK=1,NLES_K-1 + ZGWP_LES(:,:) = ZGWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & + * (ZRG_LES(:,:,JK)) * ZRHO_LES(:,:,JK) + END DO + CALL LES_MEAN_ll ( ZGWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & + XLES_GWP(NLES_CURRENT_TCOUNT) ) +END IF +IF (LUSERH) THEN + IRR = IRR + 1 + CALL LES_VER_INT( XRT(:,:,:,IRR) ,ZRH_LES ) + ZHWP_LES(:,:)=0. + DO JK=1,NLES_K-1 + ZHWP_LES(:,:) = ZHWP_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & + * (ZRH_LES(:,:,JK)) * ZRHO_LES(:,:,JK) + END DO + CALL LES_MEAN_ll ( ZHWP_LES, LLES_CURRENT_CART_MASK(:,:,1), & + XLES_HWP(NLES_CURRENT_TCOUNT) ) +END IF +IF (NSV>0) THEN + DO JSV=1,NSV + CALL LES_VER_INT( XSVT(:,:,:,JSV), ZSV_LES(:,:,:,JSV) ) + CALL LES_VER_INT( GZ_M_M(XSVT(:,:,:,JSV),XDZZ), ZDSVDZ_LES(:,:,:,JSV) ) + END DO +END IF +! +!*mean sw and lw fluxes + CALL LES_MEAN_ll ( ZSWU_LES, LLES_CURRENT_CART_MASK, & + XLES_SWU(:,NLES_CURRENT_TCOUNT) ) + CALL LES_MEAN_ll ( ZSWD_LES, LLES_CURRENT_CART_MASK, & + XLES_SWD(:,NLES_CURRENT_TCOUNT) ) + CALL LES_MEAN_ll ( ZLWU_LES, LLES_CURRENT_CART_MASK, & + XLES_LWU(:,NLES_CURRENT_TCOUNT) ) + CALL LES_MEAN_ll ( ZLWD_LES, LLES_CURRENT_CART_MASK, & + XLES_LWD(:,NLES_CURRENT_TCOUNT) ) + CALL LES_MEAN_ll ( ZDTHRADSW_LES, LLES_CURRENT_CART_MASK, & + XLES_DTHRADSW(:,NLES_CURRENT_TCOUNT) ) + CALL LES_MEAN_ll ( ZDTHRADLW_LES, LLES_CURRENT_CART_MASK, & + XLES_DTHRADLW(:,NLES_CURRENT_TCOUNT) ) + CALL LES_MEAN_ll ( ZRADEFF_LES, LLES_CURRENT_CART_MASK, & + XLES_RADEFF(:,NLES_CURRENT_TCOUNT) ) +!* mean vertical profiles on the LES grid +! + CALL LES_MEAN_ll ( ZU_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_U(:,NLES_CURRENT_TCOUNT,1) ) +! + CALL LES_MEAN_ll ( ZV_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_V(:,NLES_CURRENT_TCOUNT,1) ) +! + CALL LES_MEAN_ll ( ZW_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_W(:,NLES_CURRENT_TCOUNT,1) ) +! + CALL LES_MEAN_ll ( ZP_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1) ) +! + CALL LES_MEAN_ll ( ZDP_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_DP(:,NLES_CURRENT_TCOUNT,1) ) +! + CALL LES_MEAN_ll ( ZTP_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_TP(:,NLES_CURRENT_TCOUNT,1) ) +! + CALL LES_MEAN_ll ( ZTR_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_TR(:,NLES_CURRENT_TCOUNT,1) ) +! + CALL LES_MEAN_ll ( ZDISS_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_DISS(:,NLES_CURRENT_TCOUNT,1) ) +! + CALL LES_MEAN_ll ( ZLM_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_LM(:,NLES_CURRENT_TCOUNT,1) ) +! + CALL LES_MEAN_ll ( ZRHO_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_RHO(:,NLES_CURRENT_TCOUNT,1) ) +! + CALL LES_MEAN_ll ( ZMF_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_Mf(:,NLES_CURRENT_TCOUNT,1) ) +! + CALL LES_MEAN_ll ( ZTH_LES*ZEXN_LES, LLES_CURRENT_CART_MASK, & + ZWORK1DT(:) ) +! +!computation of es + ZWORK1D(:)=EXP(XALPW - & + XBETAW/ZWORK1DT(:) & + -XGAMW*ALOG(ZWORK1DT(:))) +!computation of qs + + IF (LUSERV) & + XLES_MEAN_Qs(:,NLES_CURRENT_TCOUNT,1)=XRD/XRV*ZWORK1D(:)/ & + (XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1)-ZWORK1D(:)*(1-XRD/XRV)) +! qs is determined from the temperature average over the current_mask +! + CALL LES_MEAN_ll ( ZTH_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,1) ) +! + IF (LUSERV) & + CALL LES_MEAN_ll ( ZTHV_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,1) ) +! + IF (LUSERC) & + CALL LES_MEAN_ll ( ZTHL_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_Thl(:,NLES_CURRENT_TCOUNT,1) ) +! + IF (LUSERC) & + CALL LES_MEAN_ll ( ZRT_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_Rt(:,NLES_CURRENT_TCOUNT,1) ) +! + IF (LUSERV) & + CALL LES_MEAN_ll ( ZRV_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,1) ) +! + IF (LUSERV) & + CALL LES_MEAN_ll ( ZREHU_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_Rehu(:,NLES_CURRENT_TCOUNT,1) ) +! + IF (LUSERC) & + CALL LES_MEAN_ll ( ZRC_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,1) ) +! + IF (LUSERC) THEN + CALL LES_MEAN_ll ( ZINDCLD, LLES_CURRENT_CART_MASK, & + XLES_MEAN_INDCf(:,NLES_CURRENT_TCOUNT,1) ) + CALL LES_MEAN_ll ( ZINDCLD2, LLES_CURRENT_CART_MASK, & + XLES_MEAN_INDCf2(:,NLES_CURRENT_TCOUNT,1) ) + CALL LES_MEAN_ll ( ZCLDFR_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_Cf(:,NLES_CURRENT_TCOUNT,1) ) +! +!* cf total + CALL LES_MEAN_ll( ZINDCLD2D, LLES_CURRENT_CART_MASK(:,:,1) , & + XLES_CFtot(NLES_CURRENT_TCOUNT) ) + CALL LES_MEAN_ll( ZINDCLD2D2, LLES_CURRENT_CART_MASK(:,:,1), & + XLES_CF2tot(NLES_CURRENT_TCOUNT) ) + ENDIF +! + IF (LUSERR) THEN + + CALL LES_MEAN_ll ( XINPRR, LLES_CURRENT_CART_MASK(:,:,1), & + XLES_INPRR(NLES_CURRENT_TCOUNT) ) + ZINPRRm=0. + ZCOUNT=0. + ZINDCLD2D(:,:)=0. + DO JJ=1,IJU + DO JI=1,IIU + IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZINPRRm = ZINPRRm+XINPRR(JI,JJ) + IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZINDCLD2D(JI,JJ)=1. + IF (ZRR_LES(JI,JJ,1) .GT. 1.E-6) ZCOUNT=ZCOUNT+1. + END DO + END DO + IF (ZCOUNT .GE. 1) ZINPRRm=ZINPRRm/ZCOUNT + XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)=ZINPRRm + CALL LES_MEAN_ll ( ZINDCLD2D, LLES_CURRENT_CART_MASK(:,:,1), & + XLES_PRECFR(NLES_CURRENT_TCOUNT) ) + CALL LES_MEAN_ll ( ZINPRR3D_LES, LLES_CURRENT_CART_MASK, & + XLES_INPRR3D(:,NLES_CURRENT_TCOUNT,1) ) + CALL LES_MEAN_ll ( ZEVAP3D_LES, LLES_CURRENT_CART_MASK, & + XLES_EVAP3D(:,NLES_CURRENT_TCOUNT,1) ) + DO JK=1,NLES_K + CHAMPXY1(:,:,1)=ZINPRR3D_LES(:,:,JK) + XLES_MAX_INPRR3D(JK,NLES_CURRENT_TCOUNT,1)=MAX_ll (CHAMPXY1,IINFO_ll, & + IIA_ll,IJA_ll,1,IIU_ll,IJU_ll,1) + END DO +! + +! conversion de m/s en mm/day + XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)=XLES_RAIN_INPRR(NLES_CURRENT_TCOUNT)*3.6E6*24. + XLES_INPRR(NLES_CURRENT_TCOUNT)=XLES_INPRR(NLES_CURRENT_TCOUNT)*3.6E6*24. + + CALL LES_MEAN_ll ( XACPRR, LLES_CURRENT_CART_MASK(:,:,1), & + XLES_ACPRR(NLES_CURRENT_TCOUNT) ) +! conversion de m en mm + XLES_ACPRR(NLES_CURRENT_TCOUNT)=XLES_ACPRR(NLES_CURRENT_TCOUNT)*1000. + CALL LES_MEAN_ll ( ZRAINFR_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_RF(:,NLES_CURRENT_TCOUNT,1) ) + + ENDIF +! + IF (LUSERC ) THEN + IF (( CCLOUD(1:3) == 'ICE' .AND.LSEDIC) .OR. & + ((CCLOUD=='C2R2' .OR. CCLOUD=='C3R5' .OR. CCLOUD=='KHKO').AND.LSEDC) .OR. & + ( CCLOUD=='LIMA' .AND.MSEDC)) THEN + CALL LES_MEAN_ll ( XINPRC, LLES_CURRENT_CART_MASK(:,:,1), & + XLES_INPRC(NLES_CURRENT_TCOUNT) ) +! conversion from m/s to mm/day + XLES_INPRC(NLES_CURRENT_TCOUNT)=XLES_INPRC(NLES_CURRENT_TCOUNT)*3.6E6*24. + ENDIF + IF ( (((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. LDEPOC) & + .OR. ( (CCLOUD(1:3) == 'ICE') .AND. LDEPOSC) ) THEN + CALL LES_MEAN_ll ( XINDEP, LLES_CURRENT_CART_MASK(:,:,1), & + XLES_INDEP(NLES_CURRENT_TCOUNT) ) +! conversion from m/s to mm/day + XLES_INDEP(NLES_CURRENT_TCOUNT)=XLES_INDEP(NLES_CURRENT_TCOUNT)*3.6E6*24. + ENDIF + ENDIF +! + IF (LUSERR) & + CALL LES_MEAN_ll ( ZRR_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,1) ) +! + IF (LUSERI) & + CALL LES_MEAN_ll ( ZRI_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,1) ) +! + IF (LUSERS) & + CALL LES_MEAN_ll ( ZRS_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_Rs(:,NLES_CURRENT_TCOUNT,1) ) +! + IF (LUSERG) & + CALL LES_MEAN_ll ( ZRG_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_Rg(:,NLES_CURRENT_TCOUNT,1) ) +! + IF (LUSERH) & + CALL LES_MEAN_ll ( ZRH_LES, LLES_CURRENT_CART_MASK, & + XLES_MEAN_Rh(:,NLES_CURRENT_TCOUNT,1) ) +! + DO JSV=1,NSV + CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), LLES_CURRENT_CART_MASK, & + XLES_MEAN_Sv(:,NLES_CURRENT_TCOUNT,1,JSV) ) + END DO +! + CALL LES_MEAN_ll ( ZDPDZ_LES, LLES_CURRENT_CART_MASK, & + ZMEAN_DPDZ(:) ) + CALL LES_MEAN_ll ( ZDTHDZ_LES, LLES_CURRENT_CART_MASK, & + ZLES_MEAN_DTHDZ(:) ) + +! +!* build the 3D resolved turbulent fields by removing the mean field +! +DO JJ=1,IJU + DO JI=1,IIU + ZP_ANOM(JI,JJ,:) = ZP_LES(JI,JJ,:) - XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,1) + ZDPDZ_ANOM(JI,JJ,:) = ZDPDZ_LES(JI,JJ,:) - ZMEAN_DPDZ(:) + ZTH_ANOM(JI,JJ,:) = ZTH_LES(JI,JJ,:) - XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,1) + ZRHO_ANOM(JI,JJ,:) = ZRHO_LES(JI,JJ,:) - XLES_MEAN_Rho(:,NLES_CURRENT_TCOUNT,1) + IF (LUSERV) THEN + ZTHV_ANOM(JI,JJ,:) = ZTHV_LES(JI,JJ,:) - XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,1) + ZRV_ANOM(JI,JJ,:) = ZRV_LES(JI,JJ,:) - XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,1) + END IF + IF (LUSERC) THEN + ZRC_ANOM(JI,JJ,:) = ZRC_LES(JI,JJ,:) - XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,1) + ZLWP_ANOM(JI,JJ) =ZLWP_LES(JI,JJ)-XLES_LWP(NLES_CURRENT_TCOUNT) + END IF + IF (LUSERI) THEN + ZRI_ANOM(JI,JJ,:) = ZRI_LES(JI,JJ,:) - XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,1) + END IF + IF (LUSERR) THEN + ZRR_ANOM(JI,JJ,:) = ZRR_LES(JI,JJ,:) - XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,1) + END IF + END DO +END DO +! +! +!-------------------------------------------------------------------------------- +! +!* vertical grid computed at first LES call for this model +! +IF (NLES_CURRENT_TCOUNT==1) THEN + ALLOCATE(ZZ_LES (IIU,IJU,NLES_K)) + CALL LES_VER_INT( MZF(XZZ) ,ZZ_LES ) + CALL LES_MEAN_ll ( ZZ_LES, LLES_CURRENT_CART_MASK, XLES_Z ) + DEALLOCATE(ZZ_LES) + CALL LES_MEAN_ll ( XZS, LLES_CURRENT_CART_MASK(:,:,1), XLES_ZS ) +END IF +! +!------------------------------------------------------------------------------- +! +!* 3. Vertical interpolations to SECTRA computations vertical grid +! ------------------------------------------------------------ +! +!* note that velocity fields are previously localized on the MASS points +! +CALL SPEC_VER_INT(IMI, MXF(XUT) ,ZU_SPEC ) +CALL SPEC_VER_INT(IMI, MYF(XVT) ,ZV_SPEC ) +CALL SPEC_VER_INT(IMI, MZF(XWT) ,ZW_SPEC ) +CALL SPEC_VER_INT(IMI, XTHT ,ZTH_SPEC ) +IF (LUSERC) CALL SPEC_VER_INT(IMI, ZTHL ,ZTHL_SPEC) +IRR = 0 +IF (LUSERV) THEN + IRR = IRR + 1 + CALL SPEC_VER_INT(IMI, XRT(:,:,:,IRR) ,ZRV_SPEC ) +END IF +IF (LUSERC) THEN + IRR = IRR + 1 + CALL SPEC_VER_INT(IMI, XRT(:,:,:,IRR) ,ZRC_SPEC ) +END IF +IF (LUSERR) THEN + IRR = IRR + 1 +END IF +IF (LUSERI) THEN + IRR = IRR + 1 + CALL SPEC_VER_INT(IMI, XRT(:,:,:,IRR) ,ZRI_SPEC ) +END IF +IF (NSV>0) THEN + DO JSV=1,NSV + CALL SPEC_VER_INT(IMI, XSVT(:,:,:,JSV), ZSV_SPEC(:,:,:,JSV) ) + END DO +END IF +! +!------------------------------------------------------------------------------- +! +!* 4. Call to LES computations on cartesian (sub-)domain +! -------------------------------------------------- +! +IMASK=1 +! +CALL LES(LLES_CURRENT_CART_MASK) +! +!------------------------------------------------------------------------------- +! +!* 5. Call to LES computations on nebulosity mask +! ------------------------------------------- +! +IF (LLES_NEB_MASK) THEN + IMASK=IMASK+1 + CALL LES(LLES_CURRENT_NEB_MASK .AND. LLES_CURRENT_CART_MASK) +! + IMASK=IMASK+1 + CALL LES((.NOT. LLES_CURRENT_NEB_MASK) .AND. LLES_CURRENT_CART_MASK) +END IF +! +!------------------------------------------------------------------------------- +! +!* 6. Call to LES computations on cloud core mask +! ------------------------------------------- +! +IF (LLES_CORE_MASK) THEN + IMASK=IMASK+1 + CALL LES(LLES_CURRENT_CORE_MASK .AND. LLES_CURRENT_CART_MASK) +! + IMASK=IMASK+1 + CALL LES((.NOT. LLES_CURRENT_CORE_MASK) .AND. LLES_CURRENT_CART_MASK) +END IF +! +!------------------------------------------------------------------------------- +! +!* 7. Call to LES computations on user mask +! ------------------------------------- +! +IF (LLES_MY_MASK) THEN + DO JI=1,NLES_MASKS_USER + IMASK=IMASK+1 + CALL LES(LLES_CURRENT_MY_MASKS(:,:,:,JI)) + END DO +END IF +! +!------------------------------------------------------------------------------- +! +!* 7b. Call to LES computations on conditional sampling mask +! ----------------------------------------------------- +! +IF (LLES_CS_MASK) THEN + IMASK=IMASK+1 + CALL LES(LLES_CURRENT_CS1_MASK) + IMASK=IMASK+1 + CALL LES(LLES_CURRENT_CS2_MASK) + IMASK=IMASK+1 + CALL LES(LLES_CURRENT_CS3_MASK) +END IF +! +!------------------------------------------------------------------------------- +! +!* 8. budgets +! ------- +! +!* 8.1 tendencies +! ---------- +! +! +!* 8.2 dynamical production, transport and mean advection +! -------------------------------------------------- +! +ALLOCATE(ZLES_MEAN_DRtDZ(NLES_K)) +ALLOCATE(ZLES_MEAN_DSVDZ(NLES_K,NSV)) +! +IF (LUSERV) THEN + ZLES_MEAN_DRtDZ(:) = XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,1) +ELSE + ZLES_MEAN_DRtDZ(:) = XUNDEF +END IF +! +ZLES_MEAN_DSVDZ = 0. +DO JSV=1,NSV + ZLES_MEAN_DSvDZ(:,JSV) = XLES_MEAN_DSvDZ(:,NLES_CURRENT_TCOUNT,1,JSV) +END DO +! +CALL LES_RES_TR(LUSERV, & + XLES_MEAN_DUDZ(:,NLES_CURRENT_TCOUNT,1), & + XLES_MEAN_DVDZ(:,NLES_CURRENT_TCOUNT,1), & + XLES_MEAN_DWDZ(:,NLES_CURRENT_TCOUNT,1), & + XLES_MEAN_DThlDZ(:,NLES_CURRENT_TCOUNT,1), & + ZLES_MEAN_DRtDZ(:), & + ZLES_MEAN_DSvDZ(:,:) ) +! +DEALLOCATE(ZLES_MEAN_DRtDZ) +DEALLOCATE(ZLES_MEAN_DSVDZ) +! +CALL LES_BUDGET_TEND_n +!* 8.3 end of LES budgets computations +! ------------------------------- +! +DO JLOOP=1,NLES_TOT + XLES_BU_RES_KE (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_KE (:,JLOOP) + XLES_BU_RES_WThl (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_WThl (:,JLOOP) + XLES_BU_RES_Thl2 (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_Thl2 (:,JLOOP) + XLES_BU_SBG_Tke (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_SBG_Tke (:,JLOOP) + IF (LUSERV) THEN + XLES_BU_RES_WRt (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_WRt (:,JLOOP) + XLES_BU_RES_Rt2 (:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_Rt2 (:,JLOOP) + XLES_BU_RES_ThlRt(:,NLES_CURRENT_TCOUNT,JLOOP) = X_LES_BU_RES_ThlRt(:,JLOOP) + END IF + DO JSV=1,NSV + XLES_BU_RES_Sv2 (:,NLES_CURRENT_TCOUNT,JLOOP,JSV) = X_LES_BU_RES_Sv2 (:,JLOOP,JSV) + XLES_BU_RES_WSv (:,NLES_CURRENT_TCOUNT,JLOOP,JSV) = X_LES_BU_RES_WSv (:,JLOOP,JSV) + END DO +END DO +! +!------------------------------------------------------------------------------- +! +!* 9. Deallocations +! ------------- +! +!* 9.1 local variables +! --------------- +! +DEALLOCATE(ZEXN ) +DEALLOCATE(ZTHL) +DEALLOCATE(ZRT ) +DEALLOCATE(ZTHV ) +DEALLOCATE(ZRHO ) +DEALLOCATE(ZEW ) + +DEALLOCATE(ZINDCLD ) +DEALLOCATE(ZINDCLD2 ) +DEALLOCATE(ZINDCLD2D ) +DEALLOCATE(ZINDCLD2D2) +DEALLOCATE(ZCLDFR_LES) +DEALLOCATE(ZRAINFR_LES) +DEALLOCATE(ZMASSF ) +DEALLOCATE(ZTEMP ) +DEALLOCATE(ZREHU ) +DEALLOCATE(CHAMPXY1 ) +! +DEALLOCATE(ZU_LES) +DEALLOCATE(ZV_LES) +DEALLOCATE(ZW_LES) +DEALLOCATE(ZTHL_LES) +DEALLOCATE(ZRT_LES) +DEALLOCATE(ZSV_LES) +DEALLOCATE(ZP_LES ) +DEALLOCATE(ZDP_LES ) +DEALLOCATE(ZTP_LES ) +DEALLOCATE(ZTR_LES ) +DEALLOCATE(ZDISS_LES ) +DEALLOCATE(ZLM_LES ) +DEALLOCATE(ZDPDZ_LES) +DEALLOCATE(ZLWP_ANOM) +DEALLOCATE(ZWORK2D) +DEALLOCATE(ZWORK1D) +DEALLOCATE(ZWORK1DT) +DEALLOCATE(ZMAXWRR2D) +DEALLOCATE(ZDTHLDZ_LES) +DEALLOCATE(ZDTHDZ_LES) +DEALLOCATE(ZDRTDZ_LES) +DEALLOCATE(ZDSVDZ_LES) +DEALLOCATE(ZDUDZ_LES) +DEALLOCATE(ZDVDZ_LES) +DEALLOCATE(ZDWDZ_LES) +DEALLOCATE(ZRHO_LES ) +DEALLOCATE(ZEXN_LES ) +DEALLOCATE(ZTH_LES ) +DEALLOCATE(ZMF_LES ) +DEALLOCATE(ZTHV_LES ) +DEALLOCATE(ZTKE_LES ) +DEALLOCATE(ZKE_LES ) +DEALLOCATE(ZTKET_LES) +DEALLOCATE(ZRV_LES ) +DEALLOCATE(ZREHU_LES ) +DEALLOCATE(ZRC_LES ) +DEALLOCATE(ZRR_LES ) +DEALLOCATE(ZZZ_LES) +DEALLOCATE(ZLWP_LES ) +DEALLOCATE(ZRWP_LES ) +DEALLOCATE(ZIWP_LES ) +DEALLOCATE(ZSWP_LES ) +DEALLOCATE(ZGWP_LES ) +DEALLOCATE(ZHWP_LES ) +DEALLOCATE(ZINPRR3D_LES) +DEALLOCATE(ZEVAP3D_LES) +DEALLOCATE(ZRI_LES ) +DEALLOCATE(ZRS_LES ) +DEALLOCATE(ZRG_LES ) +DEALLOCATE(ZRH_LES ) +DEALLOCATE(ZP_ANOM ) +DEALLOCATE(ZRHO_ANOM) +DEALLOCATE(ZTH_ANOM ) +DEALLOCATE(ZTHV_ANOM) +DEALLOCATE(ZRV_ANOM ) +DEALLOCATE(ZRC_ANOM ) +DEALLOCATE(ZRI_ANOM ) +DEALLOCATE(ZRR_ANOM ) +DEALLOCATE(ZDPDZ_ANOM) +DEALLOCATE(ZMEAN_DPDZ) +DEALLOCATE(ZLES_MEAN_DTHDZ) +! +DEALLOCATE(ZU_SPEC ) +DEALLOCATE(ZV_SPEC ) +DEALLOCATE(ZW_SPEC ) +DEALLOCATE(ZTH_SPEC ) +DEALLOCATE(ZTHL_SPEC ) +DEALLOCATE(ZRV_SPEC ) +DEALLOCATE(ZRC_SPEC ) +DEALLOCATE(ZRI_SPEC ) +DEALLOCATE(ZSV_SPEC ) +! +DEALLOCATE(ZRADEFF_LES ) +DEALLOCATE(ZSWU_LES ) +DEALLOCATE(ZSWD_LES ) +DEALLOCATE(ZLWD_LES ) +DEALLOCATE(ZLWU_LES ) +DEALLOCATE(ZDTHRADSW_LES ) +DEALLOCATE(ZDTHRADLW_LES ) +! +!* 9.2 current time-step LES masks (in MODD_LES) +! --------------------------- +! +DEALLOCATE(LLES_CURRENT_CART_MASK) +IF (LLES_NEB_MASK) DEALLOCATE(LLES_CURRENT_NEB_MASK) +IF (LLES_CORE_MASK) DEALLOCATE(LLES_CURRENT_CORE_MASK) +IF (LLES_MY_MASK) THEN + DEALLOCATE(LLES_CURRENT_MY_MASKS) +END IF +IF (LLES_CS_MASK) THEN + DEALLOCATE(LLES_CURRENT_CS1_MASK) + IF (NSV_CS >= 2) DEALLOCATE(LLES_CURRENT_CS2_MASK) + IF (NSV_CS == 3) DEALLOCATE(LLES_CURRENT_CS3_MASK) +END IF +! +! +!* 9.3 variables in MODD_LES_BUDGET +! ---------------------------- +! + +DEALLOCATE(XU_ANOM ) +DEALLOCATE(XV_ANOM ) +DEALLOCATE(XW_ANOM ) +DEALLOCATE(XTHL_ANOM) +DEALLOCATE(XRT_ANOM ) +DEALLOCATE(XSV_ANOM ) +! +DEALLOCATE(XCURRENT_L_O_EXN_CP) +DEALLOCATE(XCURRENT_RHODJ ) +! +DEALLOCATE(XCURRENT_RUS ) +DEALLOCATE(XCURRENT_RVS ) +DEALLOCATE(XCURRENT_RWS ) +DEALLOCATE(XCURRENT_RTHS ) +DEALLOCATE(XCURRENT_RTKES) +DEALLOCATE(XCURRENT_RRS ) +DEALLOCATE(XCURRENT_RSVS ) +DEALLOCATE(XCURRENT_RTHLS) +DEALLOCATE(XCURRENT_RRTS ) + +DEALLOCATE(X_LES_BU_RES_KE ) +DEALLOCATE(X_LES_BU_RES_WThl ) +DEALLOCATE(X_LES_BU_RES_Thl2 ) +DEALLOCATE(X_LES_BU_RES_WRt ) +DEALLOCATE(X_LES_BU_RES_Rt2 ) +DEALLOCATE(X_LES_BU_RES_ThlRt) +DEALLOCATE(X_LES_BU_RES_Sv2 ) +DEALLOCATE(X_LES_BU_RES_WSv ) +DEALLOCATE(X_LES_BU_SBG_TKE ) +!------------------------------------------------------------------------------- +! +!* 10. end of LES computations for this time-step +! ------------------------------------------ +! +LLES_CALL=.FALSE. +CALL BUDGET_FLAGS(LUSERV, LUSERC, LUSERR, & + LUSERI, LUSERS, LUSERG, LUSERH ) +! +!------------------------------------------------------------------------------- +! +CONTAINS +! +! ########################################################################## + SUBROUTINE LES(OMASK) +! ########################################################################## +! +! +!!**** *LES* computes the current time-step LES diagnostics for one mask. +!! +!! +!! PURPOSE +!! ------- +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! V. Masson +!! +!! MODIFICATIONS +!! ------------- +!! Original 07/02/00 +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS +! +USE MODI_LES_FLUX_ll +USE MODI_LES_3RD_MOMENT_ll +USE MODI_LES_4TH_MOMENT_ll +USE MODI_LES_MEAN_1PROC +USE MODI_LES_MEAN_MPROC +USE MODI_LES_PDF_ll +! +USE MODI_LES_HOR_CORR +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +LOGICAL, DIMENSION(:,:,:), INTENT(IN) :: OMASK ! 2D mask for computations +! +! +! +! 0.2 declaration of local variables +! +INTEGER :: JSV ! scalar variables counter +INTEGER :: JI +INTEGER :: JK ! vertical loop counter +INTEGER :: JPDF ! pdf counter +! +LOGICAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: GUPDRAFT_MASK +LOGICAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: GDOWNDRAFT_MASK +REAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZUPDRAFT +REAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZDOWNDRAFT +REAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZW_UP +REAL, DIMENSION(SIZE(ZW_LES,1),SIZE(ZW_LES,2),SIZE(ZW_LES,3)) :: ZWORK_LES +! +INTEGER, DIMENSION(SIZE(ZW_LES,3)) :: IAVG_PTS +INTEGER, DIMENSION(SIZE(ZW_LES,3)) :: IUND_PTS +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZAVG +! +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_U3 +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_UV2 +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_UW2 +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_VU2 +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_V3 +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_VW2 +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_WU2 +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_RESOLVED_WV2 +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_U2 +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_V2 +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_UPDRAFT_W2 +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_U2 +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_V2 +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZLES_DOWNDRAFT_W2 +REAL, DIMENSION(SIZE(ZW_LES,3),NPDF) :: ZPDF +! +INTEGER, DIMENSION(1) :: IKMIN_FLUX ! vertical index of min. W'thl' +INTEGER, DIMENSION(1) :: IKMAX_TH !vertical index maxdth +INTEGER, DIMENSION(1) :: IKMAX_CF ! vertical index of max. Cf +! +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZKE_TOT ! total turbulent kinetic energy +REAL :: ZINT_KE_TOT! integral of KE_TOT +REAL :: ZINT_RHOKE! integral of RHO*KE +REAL :: ZFRIC_SURF ! surface friction +REAL, DIMENSION(SIZE(ZW_LES,3)) :: ZFRIC_LES ! friction at all LES levels +! +!------------------------------------------------------------------------------- +! +! 1. local diagnostics (for any mask type) +! ----------------- +! +! +! 1.2 Number of points used for averaging on current processor +! -------------------------------------------------------- +! +!* to be sure to be coherent with other computations, +! a field on LES vertical grid (and horizontal mass point grid) is used. +! This information is necessary for the subgrid fluxes computations, because +! half of the work is already done, but the number of averaging points was +! not kept. +! +CALL LES_MEAN_1PROC ( XW_ANOM, OMASK, & + ZAVG(:), & + IAVG_PTS(:), & + IUND_PTS(:) ) +! +! +! 1.3 Number of points used for averaging on all processor +! ---------------------------------------------------- +! +CALL LES_MEAN_ll ( XW_ANOM, OMASK, & + ZAVG(:), & + NLES_AVG_PTS_ll(:,NLES_CURRENT_TCOUNT,IMASK), & + NLES_UND_PTS_ll(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +! +! 1.4 Mean quantities +! --------------- +! +IF (LLES_MEAN .AND. IMASK > 1) THEN +! +!* horizontal wind velocities +! + CALL LES_MEAN_ll ( ZU_LES, OMASK, & + XLES_MEAN_U(:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_MEAN_ll ( ZV_LES, OMASK, & + XLES_MEAN_V(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* vertical wind velocity +! + CALL LES_MEAN_ll ( ZW_LES, OMASK, & + XLES_MEAN_W(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* pressure +! + CALL LES_MEAN_ll ( ZP_LES, OMASK, & + XLES_MEAN_P(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* dynamical production TKE +! + CALL LES_MEAN_ll ( ZDP_LES, OMASK, & + XLES_MEAN_DP(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* thermal production TKE +! + CALL LES_MEAN_ll ( ZTP_LES, OMASK, & + XLES_MEAN_TP(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* transport TKE +! + CALL LES_MEAN_ll ( ZTR_LES, OMASK, & + XLES_MEAN_TR(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* dissipation TKE +! + CALL LES_MEAN_ll ( ZDISS_LES, OMASK, & + XLES_MEAN_DISS(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* mixing length +! + CALL LES_MEAN_ll ( ZLM_LES, OMASK, & + XLES_MEAN_LM(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* density +! + CALL LES_MEAN_ll ( ZRHO_LES, OMASK, & + XLES_MEAN_RHO(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +! +!* potential temperature +! + CALL LES_MEAN_ll ( ZTH_LES, OMASK, & + XLES_MEAN_Th(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* mass flux + CALL LES_MEAN_ll ( ZMF_LES, OMASK, & + XLES_MEAN_Mf(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +! +!* virtual potential temperature +! + IF (LUSERV) & + CALL LES_MEAN_ll ( ZTHV_LES, OMASK, & + XLES_MEAN_Thv(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* liquid potential temperature +! + IF (LUSERC) THEN + CALL LES_MEAN_ll ( ZTHL_LES, OMASK, & + XLES_MEAN_Thl(:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* vapor mixing ratio +! + IF (LUSERV) THEN + CALL LES_MEAN_ll ( ZRV_LES, OMASK, & + XLES_MEAN_Rv(:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!*relative humidity +! + IF (LUSERV) THEN + CALL LES_MEAN_ll ( ZREHU_LES, OMASK, & + XLES_MEAN_Rehu(:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* cloud mixing ratio +! + IF (LUSERC) THEN + CALL LES_MEAN_ll ( ZRC_LES, OMASK, & + XLES_MEAN_Rc(:,NLES_CURRENT_TCOUNT,IMASK) ) + CALL LES_MEAN_ll ( ZRT_LES, OMASK, & + XLES_MEAN_Rt(:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* rain mixing ratio +! + IF (LUSERR) THEN + CALL LES_MEAN_ll ( ZRR_LES, OMASK, & + XLES_MEAN_Rr(:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* ice mixing ratio +! + IF (LUSERI) THEN + CALL LES_MEAN_ll ( ZRI_LES, OMASK, & + XLES_MEAN_Ri(:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* snow mixing ratio +! + IF (LUSERS) THEN + CALL LES_MEAN_ll ( ZRS_LES, OMASK, & + XLES_MEAN_Rs(:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* graupel mixing ratio +! + IF (LUSERG) THEN + CALL LES_MEAN_ll ( ZRG_LES, OMASK, & + XLES_MEAN_Rg(:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* hail mixing ratio +! + IF (LUSERH) THEN + CALL LES_MEAN_ll ( ZRH_LES, OMASK, & + XLES_MEAN_Rh(:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* scalar variables mixing ratio +! + DO JSV=1,NSV + CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), OMASK, & + XLES_MEAN_Sv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) + END DO +END IF +! +!* wind modulus +! +IF (LLES_MEAN) THEN +! + ZWORK_LES =SQRT( ZU_LES**2 +ZV_LES**2 ) + CALL LES_MEAN_ll ( ZWORK_LES, OMASK, & + XLES_MEAN_WIND(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* vertical speed larger than mean vertical speed (updraft) +! + DO JK=1,NLES_K + ZW_UP(:,:,JK) = MAX(ZW_LES(:,:,JK), XLES_MEAN_W(JK,NLES_CURRENT_TCOUNT,IMASK)) + END DO +! +!* upward mass flux +! + ZWORK_LES = ZW_UP * ZRHO_LES + CALL LES_MEAN_ll ( ZWORK_LES, OMASK, & + XLES_RESOLVED_MASSFX(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* pdf calculation +! + IF (LLES_PDF) THEN + CALL LES_PDF_ll ( ZTH_LES,OMASK,XTH_PDF_MIN,XTH_PDF_MAX, & + ZPDF(:,:) ) + DO JSV=1,NPDF + XLES_PDF_TH(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) + END DO + + CALL LES_PDF_ll ( ZW_LES,OMASK,XW_PDF_MIN,XW_PDF_MAX, & + ZPDF(:,:) ) + DO JSV=1,NPDF + XLES_PDF_W(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) + END DO + CALL LES_PDF_ll ( ZTHV_LES,OMASK,XTHV_PDF_MIN,XTHV_PDF_MAX, & + ZPDF(:,:) ) + DO JSV=1,NPDF + XLES_PDF_THV(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) + END DO + IF (LUSERV) THEN + CALL LES_PDF_ll ( ZRV_LES,OMASK,XRV_PDF_MIN,XRV_PDF_MAX, & + ZPDF(:,:) ) + DO JSV=1,NPDF + XLES_PDF_RV(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) + END DO + END IF + IF (LUSERC) THEN + CALL LES_PDF_ll ( ZRC_LES,OMASK,XRC_PDF_MIN,XRC_PDF_MAX, & + ZPDF(:,:) ) + DO JSV=1,NPDF + XLES_PDF_RC(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) + END DO + CALL LES_PDF_ll ( ZRT_LES,OMASK,XRT_PDF_MIN,XRT_PDF_MAX, & + ZPDF(:,:) ) + DO JSV=1,NPDF + XLES_PDF_RT(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) + END DO + CALL LES_PDF_ll ( ZTHL_LES,OMASK,XTHL_PDF_MIN,XTHL_PDF_MAX, & + ZPDF(:,:) ) + DO JSV=1,NPDF + XLES_PDF_THL(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) + END DO + END IF + IF (LUSERR) THEN + CALL LES_PDF_ll ( ZRR_LES,OMASK,XRR_PDF_MIN,XRR_PDF_MAX, & + ZPDF(:,:) ) + DO JSV=1,NPDF + XLES_PDF_RR(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) + END DO + END IF + IF (LUSERI) THEN + CALL LES_PDF_ll ( ZRI_LES,OMASK,XRI_PDF_MIN,XRI_PDF_MAX, & + ZPDF(:,:) ) + DO JSV=1,NPDF + XLES_PDF_RI(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) + END DO + END IF + IF (LUSERS) THEN + CALL LES_PDF_ll ( ZRS_LES,OMASK,XRS_PDF_MIN,XRS_PDF_MAX, & + ZPDF(:,:) ) + DO JSV=1,NPDF + XLES_PDF_RS(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) + END DO + END IF + IF (LUSERG) THEN + CALL LES_PDF_ll ( ZRG_LES,OMASK,XRG_PDF_MIN,XRG_PDF_MAX, & + ZPDF(:,:) ) + DO JSV=1,NPDF + XLES_PDF_RG(:,NLES_CURRENT_TCOUNT,IMASK,JSV)=ZPDF(:,JSV) + END DO + END IF + END IF +! +!* mean vertical gradients +! + CALL LES_MEAN_ll ( ZDTHLDZ_LES, OMASK, XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) + CALL LES_MEAN_ll ( ZDUDZ_LES, OMASK, XLES_MEAN_DUDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) + CALL LES_MEAN_ll ( ZDVDZ_LES, OMASK, XLES_MEAN_DVDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) + CALL LES_MEAN_ll ( ZDWDZ_LES, OMASK, XLES_MEAN_DWDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) + IF (LUSERV) CALL LES_MEAN_ll ( ZDRtDZ_LES, OMASK, XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK) ) + DO JSV=1,NSV + CALL LES_MEAN_ll ( ZDSVDZ_LES(:,:,:,JSV), OMASK, XLES_MEAN_DSVDZ(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) + END DO + +END IF +!------------------------------------------------------------------------------- +! +! 1.5 Resolved quantities +! ------------------- +! +!* horizontal wind variances +! + CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM, & + OMASK, & + XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM, & + OMASK, & + XLES_RESOLVED_V2 (:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* vertical wind variance +! + CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM, & + OMASK, & + XLES_RESOLVED_W2 (:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* pressure variance +! + CALL LES_FLUX_ll ( ZP_ANOM, ZP_ANOM, & + OMASK, & + XLES_RESOLVED_P2 (:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* potential temperature variance +! + CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM, & + OMASK, & + XLES_RESOLVED_TH2(:,NLES_CURRENT_TCOUNT,IMASK) ) + +! +!* resolved turbulent kinetic energy +! + XLES_RESOLVED_Ke(:,NLES_CURRENT_TCOUNT,IMASK) = XUNDEF +! + WHERE(XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK) /= XUNDEF) & + XLES_RESOLVED_Ke(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*( & + XLES_RESOLVED_U2 (:,NLES_CURRENT_TCOUNT,IMASK) & + + XLES_RESOLVED_V2 (:,NLES_CURRENT_TCOUNT,IMASK) & + + XLES_RESOLVED_W2 (:,NLES_CURRENT_TCOUNT,IMASK)) +! +!* potential temperature - virtual potential temperature covariance +! + IF (LUSERV) THEN + CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM, & + OMASK, & + XLES_RESOLVED_THTHV(:,NLES_CURRENT_TCOUNT,IMASK) ) + +! +!* vapor mixing ratio variance +! + CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM, & + OMASK, & + XLES_RESOLVED_Rv2(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +! +!* potential temperature - vapor mixing ratio correlation +! + CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM, & + OMASK, & + XLES_RESOLVED_ThRv(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* virtual potential temperature - vapor mixing ratio correlation +! + CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM, & + OMASK, & + XLES_RESOLVED_ThvRv(:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +! +!* liquid potential temperature - virtual potential temperature covariance +! + IF (LUSERC) THEN + CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM, & + OMASK, & + XLES_RESOLVED_THLTHV(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* liquid potential temperature variance +! + CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM, & + OMASK, & + XLES_RESOLVED_THL2(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* total water mixing ratio variance +! + CALL LES_FLUX_ll ( XRT_ANOM, XRT_ANOM, & + OMASK, & + XLES_RESOLVED_Rt2(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* cloud mixing ratio variance +! + CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM, & + OMASK, & + XLES_RESOLVED_Rc2(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* potential temperature - cloud mixing ratio correlation +! + CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM, & + OMASK, & + XLES_RESOLVED_ThRc(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* liquid potential temperature - vapor mixing ratio correlation +! + CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM, & + OMASK, & + XLES_RESOLVED_ThlRv(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* liquid potential temperature - cloud mixing ratio correlation +! + CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM, & + OMASK, & + XLES_RESOLVED_ThlRc(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* virtual potential temperature - cloud mixing ratio correlation +! + CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM, & + OMASK, & + XLES_RESOLVED_ThvRc(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +! variance of lwp +! + IF (IMASK .EQ. 1) THEN + CALL LES_FLUX_ll (ZLWP_ANOM, ZLWP_ANOM, & + OMASK(:,:,1), & + XLES_LWPVAR(NLES_CURRENT_TCOUNT) ) + END IF + END IF +! +!* ice mixing ratio variance +! + IF (LUSERI) THEN + CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM, & + OMASK, & + XLES_RESOLVED_Ri2(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* potential temperature - ice mixing ratio correlation +! + CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM, & + OMASK, & + XLES_RESOLVED_ThRi(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* liquid potential temperature - ice mixing ratio correlation +! + CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM, & + OMASK, & + XLES_RESOLVED_ThlRi(:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* virtual potential temperature - ice mixing ratio correlation +! + CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM, & + OMASK, & + XLES_RESOLVED_ThvRi(:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* scalar variable mixing ratio variances +! + DO JSV=1,NSV + CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV), & + OMASK, & + XLES_RESOLVED_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) +! +!* potential temperature - scalar variables ratio correlation +! + CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV), & + OMASK, & + XLES_RESOLVED_ThSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) +! +!* liquid potential temperature - scalar variables ratio correlation +! + IF (LUSERC) THEN + CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV), & + OMASK, & + XLES_RESOLVED_ThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) + END IF +! +!* virtual potential temperature - scalar variables ratio correlation +! + IF (LUSERV) THEN + CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV), & + OMASK, & + XLES_RESOLVED_ThvSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) + END IF + END DO +! +! +!* wind fluxes +! + CALL LES_FLUX_ll ( XU_ANOM, XV_ANOM, & + OMASK, & + XLES_RESOLVED_UV (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XW_ANOM, XU_ANOM, & + OMASK, & + XLES_RESOLVED_WU (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XW_ANOM, XV_ANOM, & + OMASK, & + XLES_RESOLVED_WV (:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* pressure fluxes +! + CALL LES_FLUX_ll ( XU_ANOM, ZDPDZ_ANOM, & + OMASK, & + XLES_RESOLVED_UP (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XV_ANOM, ZDPDZ_ANOM, & + OMASK, & + XLES_RESOLVED_VP (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XW_ANOM, ZDPDZ_ANOM, & + OMASK, & + XLES_RESOLVED_WP (:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* theta fluxes +! + CALL LES_FLUX_ll ( XU_ANOM, ZTH_ANOM, & + OMASK, & + XLES_RESOLVED_UTh (:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_FLUX_ll ( XV_ANOM, ZTH_ANOM, & + OMASK, & + XLES_RESOLVED_VTh (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM, & + OMASK, & + XLES_RESOLVED_WTh (:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* virtual theta fluxes +! + IF (LUSERV) THEN + CALL LES_FLUX_ll ( XU_ANOM, ZTHV_ANOM, & + OMASK, & + XLES_RESOLVED_UThv (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XV_ANOM, ZTHV_ANOM, & + OMASK, & + XLES_RESOLVED_VThv (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM, & + OMASK, & + XLES_RESOLVED_WThv (:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* vapor mixing ratio fluxes +! + CALL LES_FLUX_ll ( XU_ANOM, ZRV_ANOM, & + OMASK, & + XLES_RESOLVED_URv (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XV_ANOM, ZRV_ANOM, & + OMASK, & + XLES_RESOLVED_VRv (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM, & + OMASK, & + XLES_RESOLVED_WRv (:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* cloud water mixing ratio fluxes +! + IF (LUSERC) THEN + CALL LES_FLUX_ll ( XU_ANOM, ZRC_ANOM, & + OMASK, & + XLES_RESOLVED_URc (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XV_ANOM, ZRC_ANOM, & + OMASK, & + XLES_RESOLVED_VRc (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM, & + OMASK, & + XLES_RESOLVED_WRc (:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* liquid theta fluxes +! + CALL LES_FLUX_ll ( XU_ANOM, XTHL_ANOM, & + OMASK, & + XLES_RESOLVED_UThl (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XV_ANOM, XTHL_ANOM, & + OMASK, & + XLES_RESOLVED_VThl (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM, & + OMASK, & + XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* total water mixing ratio fluxes +! + CALL LES_FLUX_ll ( XW_ANOM, XRT_ANOM, & + OMASK, & + XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* cloud ice mixing ratio fluxes +! + IF (LUSERI) THEN + CALL LES_FLUX_ll ( XU_ANOM, ZRI_ANOM, & + OMASK, & + XLES_RESOLVED_URi (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XV_ANOM, ZRI_ANOM, & + OMASK, & + XLES_RESOLVED_VRi (:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM, & + OMASK, & + XLES_RESOLVED_WRi (:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF + IF (LUSERR) THEN + CALL LES_FLUX_ll ( XW_ANOM, ZRR_ANOM, & + OMASK, & + XLES_RESOLVED_WRr (:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! + +! +!* scalar variables fluxes +! + DO JSV=1,NSV + CALL LES_FLUX_ll ( XU_ANOM, XSV_ANOM(:,:,:,JSV), & + OMASK, & + XLES_RESOLVED_USv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) +! + CALL LES_FLUX_ll ( XV_ANOM, XSV_ANOM(:,:,:,JSV), & + OMASK, & + XLES_RESOLVED_VSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) +! + CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV), & + OMASK, & + XLES_RESOLVED_WSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) + END DO +! +!* skewness +! + CALL LES_3RD_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM, & + OMASK, & + XLES_RESOLVED_U3 (:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_3RD_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM, & + OMASK, & + XLES_RESOLVED_V3 (:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XW_ANOM, & + OMASK, & + XLES_RESOLVED_W3 (:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* kurtosis +! + CALL LES_4TH_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM, XU_ANOM, & + OMASK, & + XLES_RESOLVED_U4 (:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_4TH_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM, XV_ANOM, & + OMASK, & + XLES_RESOLVED_V4 (:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_4TH_MOMENT_ll ( XW_ANOM, XW_ANOM, XW_ANOM, XW_ANOM, & + OMASK, & + XLES_RESOLVED_W4 (:,NLES_CURRENT_TCOUNT,IMASK) ) +! +!* third moments of liquid potential temperature +! + IF (LUSERC) THEN + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XTHL_ANOM, & + OMASK, & + XLES_RESOLVED_WThl2(:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XTHL_ANOM, & + OMASK, & + XLES_RESOLVED_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK) ) + + ELSE + CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZTH_ANOM, & + OMASK, & + XLES_RESOLVED_WThl2(:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZTH_ANOM, & + OMASK, & + XLES_RESOLVED_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* third moments of water vapor +! + IF (LUSERV) THEN + CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRV_ANOM, & + OMASK, & + XLES_RESOLVED_WRv2 (:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRV_ANOM, & + OMASK, & + XLES_RESOLVED_W2Rv (:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF + + IF (LUSERC) THEN + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRV_ANOM, & + OMASK, & + XLES_RESOLVED_WThlRv(:,NLES_CURRENT_TCOUNT,IMASK) ) + ELSE IF (LUSERV) THEN + CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZRV_ANOM, & + OMASK, & + XLES_RESOLVED_WThlRv(:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* third moments of total water +! + IF (LUSERC) THEN + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XRT_ANOM, XRT_ANOM, & + OMASK, & + XLES_RESOLVED_WRt2 (:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XRT_ANOM, & + OMASK, & + XLES_RESOLVED_W2Rt (:,NLES_CURRENT_TCOUNT,IMASK) ) + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XRT_ANOM, & + OMASK, & + XLES_RESOLVED_WThlRt (:,NLES_CURRENT_TCOUNT,IMASK) ) + ELSE IF (LUSERV) THEN + CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRV_ANOM, & + OMASK, & + XLES_RESOLVED_WRt2 (:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRV_ANOM, & + OMASK, & + XLES_RESOLVED_W2Rt (:,NLES_CURRENT_TCOUNT,IMASK) ) + CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, ZRV_ANOM, & + OMASK, & + XLES_RESOLVED_WThlRt (:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* third moments of cloud water +! + IF (LUSERC) THEN + CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRC_ANOM, ZRC_ANOM, & + OMASK, & + XLES_RESOLVED_WRc2 (:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRC_ANOM, & + OMASK, & + XLES_RESOLVED_W2Rc (:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRC_ANOM, & + OMASK, & + XLES_RESOLVED_WThlRc(:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRC_ANOM, & + OMASK, & + XLES_RESOLVED_WRvRc (:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* third moments of cloud ice +! + IF (LUSERI) THEN + CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRI_ANOM, ZRI_ANOM, & + OMASK, & + XLES_RESOLVED_WRi2 (:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, ZRI_ANOM, & + OMASK, & + XLES_RESOLVED_W2Ri (:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, ZRI_ANOM, & + OMASK, & + XLES_RESOLVED_WThlRi(:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, ZRI_ANOM, & + OMASK, & + XLES_RESOLVED_WRvRi (:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF +! +!* third moments of scalar variables +! + DO JSV=1,NSV + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV), & + OMASK, & + XLES_RESOLVED_WSv2 (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XW_ANOM, XSV_ANOM(:,:,:,JSV), & + OMASK, & + XLES_RESOLVED_W2Sv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) + IF (LUSERC) THEN + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XTHL_ANOM, XSV_ANOM(:,:,:,JSV), & + OMASK, & + XLES_RESOLVED_WThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) + ELSE + CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZTH_ANOM, XSV_ANOM(:,:,:,JSV), & + OMASK, & + XLES_RESOLVED_WThlSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) + END IF + + IF (LUSERV) THEN + CALL LES_3RD_MOMENT_ll ( XW_ANOM, ZRV_ANOM, XSV_ANOM(:,:,:,JSV), & + OMASK, & + XLES_RESOLVED_WRvSv (:,NLES_CURRENT_TCOUNT,IMASK,JSV) ) + END IF + END DO +! +!* presso-correlations +! +! + CALL LES_FLUX_ll ( XTHL_ANOM, ZDPDZ_ANOM, & + OMASK, & + XLES_RESOLVED_ThlPz(:,NLES_CURRENT_TCOUNT,IMASK) ) + + IF (LUSERV) & + CALL LES_FLUX_ll ( ZRV_ANOM, ZDPDZ_ANOM, & + OMASK, & + XLES_RESOLVED_RvPz(:,NLES_CURRENT_TCOUNT,IMASK) ) + + IF (LUSERC) THEN + CALL LES_FLUX_ll ( XRT_ANOM, ZDPDZ_ANOM, & + OMASK, & + XLES_RESOLVED_RtPz(:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_FLUX_ll ( ZRC_ANOM, ZDPDZ_ANOM, & + OMASK, & + XLES_RESOLVED_RcPz(:,NLES_CURRENT_TCOUNT,IMASK) ) + END IF + + IF (LUSERI) & + CALL LES_FLUX_ll ( ZRI_ANOM, ZDPDZ_ANOM, & + OMASK, & + XLES_RESOLVED_RiPz(:,NLES_CURRENT_TCOUNT,IMASK) ) + +! +! +!* resolved turbulent kinetic energy fluxes +! + + CALL LES_3RD_MOMENT_ll ( XU_ANOM, XU_ANOM, XU_ANOM, & + OMASK, & + ZLES_RESOLVED_U3 (:) ) + + CALL LES_3RD_MOMENT_ll ( XU_ANOM, XV_ANOM, XV_ANOM, & + OMASK, & + ZLES_RESOLVED_UV2 (:) ) + + CALL LES_3RD_MOMENT_ll ( XU_ANOM, XW_ANOM, XW_ANOM, & + OMASK, & + ZLES_RESOLVED_UW2 (:) ) + + XLES_RESOLVED_UKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*( ZLES_RESOLVED_U3 & + + ZLES_RESOLVED_UV2 & + + ZLES_RESOLVED_UW2 ) + + + + CALL LES_3RD_MOMENT_ll ( XV_ANOM, XU_ANOM, XU_ANOM, & + OMASK, & + ZLES_RESOLVED_VU2 (:) ) + + CALL LES_3RD_MOMENT_ll ( XV_ANOM, XV_ANOM, XV_ANOM, & + OMASK, & + ZLES_RESOLVED_V3 (:) ) + + CALL LES_3RD_MOMENT_ll ( XV_ANOM, XW_ANOM, XW_ANOM, & + OMASK, & + ZLES_RESOLVED_VW2 (:) ) + + XLES_RESOLVED_VKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*( ZLES_RESOLVED_VU2 & + + ZLES_RESOLVED_V3 & + + ZLES_RESOLVED_VW2 ) + + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XU_ANOM, XU_ANOM, & + OMASK, & + ZLES_RESOLVED_WU2 (:) ) + + CALL LES_3RD_MOMENT_ll ( XW_ANOM, XV_ANOM, XV_ANOM, & + OMASK, & + ZLES_RESOLVED_WV2 (:) ) + + XLES_RESOLVED_WKe(:,NLES_CURRENT_TCOUNT,IMASK) = 0.5*( ZLES_RESOLVED_WU2 & + + ZLES_RESOLVED_WV2 & + + XLES_RESOLVED_W3(:,NLES_CURRENT_TCOUNT,IMASK) ) + +! +! +!------------------------------------------------------------------------------- +! +! 1.6 Subgrid quantities +! ------------------ +! +IF (LLES_SUBGRID) THEN +! +!* wind fluxes and variances +! + CALL LES_MEAN_ll ( ZTKE_LES, OMASK, & + XLES_SUBGRID_Tke(:,NLES_CURRENT_TCOUNT,IMASK) ) + + CALL LES_MEAN_MPROC ( XLES_SUBGRID_UV(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WU(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WV(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_U2(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_V2(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! +! +!* liquid potential temperature fluxes +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_UThl(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_VThl(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThl(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + +!* liquid potential temperature variance +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! +!* Mass flux scheme of shallow convection +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_THLUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_SUBGRID_RTUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_RVUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_RCUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_RIUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_MASSFLUX(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_DETR(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_ENTR(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_FRACUP(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_THVUP_MF(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTHLMF(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRTMF(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WUMF(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WVMF(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + +!* total water mixing ratio fluxes, correlation and variance +! + IF (LUSERV) THEN + CALL LES_MEAN_MPROC ( XLES_SUBGRID_URt(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + ! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_VRt(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + ! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRt(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + ! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK),& + IAVG_PTS(:), IUND_PTS(:) ) + ! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_Rt2(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + END IF +! +!* scalar variances +! + DO JSV=1,NSV + CALL LES_MEAN_MPROC ( XLES_SUBGRID_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & + IAVG_PTS(:), IUND_PTS(:) ) + END DO +! +!* cloud water mixing ratio fluxes +! + IF (LUSERC) THEN + CALL LES_MEAN_MPROC ( XLES_SUBGRID_URc(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + ! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_VRc(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + ! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRc(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + END IF +! +!* scalar variables fluxes +! + DO JSV=1,NSV + CALL LES_MEAN_MPROC ( XLES_SUBGRID_USv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & + IAVG_PTS(:), IUND_PTS(:) ) + ! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_VSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & + IAVG_PTS(:), IUND_PTS(:) ) + ! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & + IAVG_PTS(:), IUND_PTS(:) ) + END DO +! +!* subgrid turbulent kinetic energy fluxes +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_UTke(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + ! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_VTke(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + ! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WTke(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_SUBGRID_ddz_WTke(:,NLES_CURRENT_TCOUNT,IMASK),& + IAVG_PTS(:), IUND_PTS(:) ) +! +!* fluxes and correlations with virtual potential temperature +! + IF (LUSERV) THEN + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThv(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlThv(:,NLES_CURRENT_TCOUNT,IMASK),& + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_SUBGRID_RtThv(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + DO JSV=1,NSV + CALL LES_MEAN_MPROC ( XLES_SUBGRID_SvThv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & + IAVG_PTS(:), IUND_PTS(:) ) + END DO + END IF +! +!* third order fluxes +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Thl(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThl2(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + IF (LUSERV) THEN + CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Rt(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WThlRt(:,NLES_CURRENT_TCOUNT,IMASK),& + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WRt2(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + END IF + DO JSV=1,NSV + CALL LES_MEAN_MPROC ( XLES_SUBGRID_W2Sv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WSv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & + IAVG_PTS(:), IUND_PTS(:) ) + END DO +! +!* dissipative terms +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Tke(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + IF (LUSERV) THEN + CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Rt2(:,NLES_CURRENT_TCOUNT,IMASK),& + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK),& + IAVG_PTS(:), IUND_PTS(:) ) + END IF + + DO JSV=1,NSV + CALL LES_MEAN_MPROC ( XLES_SUBGRID_DISS_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & + IAVG_PTS(:), IUND_PTS(:) ) + END DO +! +!* presso-correlation terms +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_WP(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_SUBGRID_ThlPz(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + IF (LUSERV) THEN + CALL LES_MEAN_MPROC ( XLES_SUBGRID_RtPz(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + END IF + + DO JSV=1,NSV + CALL LES_MEAN_MPROC ( XLES_SUBGRID_SvPz(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & + IAVG_PTS(:), IUND_PTS(:) ) + END DO + +!* phi3 and psi3 terms +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_PHI3(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + IF (LUSERV) THEN + CALL LES_MEAN_MPROC ( XLES_SUBGRID_PSI3(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + END IF +! +!* subgrid mixing length +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_LMix(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! +!* subgrid dissipative length +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_LDiss(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) +! +!* eddy diffusivities +! + CALL LES_MEAN_MPROC ( XLES_SUBGRID_Km(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_SUBGRID_Kh(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + +END IF +! +! computation of KHT and KHR depending on LLES + IF (LUSERC) THEN + IF (LLES_RESOLVED) THEN + XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0. + WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & + XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1. & + *XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK)/ & + XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK) + XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0. + WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & + XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.* & + XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK)/ & + XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK) + END IF + IF (LLES_SUBGRID) THEN + XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0. + WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & + XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1. & + *XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,IMASK) / & + XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK) + XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0. + WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & + XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.* & + XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,IMASK) / & + XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK) + END IF + IF (LLES_RESOLVED .AND. LLES_SUBGRID) THEN + XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=0. + WHERE(XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & + XLES_MEAN_KHt(:,NLES_CURRENT_TCOUNT,IMASK)=-1. & + *(XLES_RESOLVED_WThl (:,NLES_CURRENT_TCOUNT,IMASK)+ & + XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,IMASK))/ & + XLES_MEAN_DTHLDZ(:,NLES_CURRENT_TCOUNT,IMASK) + XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=0. + WHERE(XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK)/=0) & + XLES_MEAN_KHr(:,NLES_CURRENT_TCOUNT,IMASK)=-1.* & + (XLES_RESOLVED_WRt (:,NLES_CURRENT_TCOUNT,IMASK)+ & + XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,IMASK)) / & + XLES_MEAN_DRtDZ(:,NLES_CURRENT_TCOUNT,IMASK) + END IF + END IF +!------------------------------------------------------------------------------- +! +! 1.7 Interaction of subgrid and resolved quantities +! ---------------------------------------------- +! +!* WARNING: these terms also contain the term due to the mean flow. +! this mean flow contribution will be removed from them +! when treated in write_les_budgetn.f90 +! +! +!* subgrid turbulent kinetic energy fluxes +! +IF (LLES_RESOLVED) THEN + CALL LES_FLUX_ll ( XU_ANOM, ZTKE_LES, & + OMASK, & + XLES_RES_U_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XV_ANOM, ZTKE_LES, & + OMASK, & + XLES_RES_V_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK) ) +! + CALL LES_FLUX_ll ( XW_ANOM, ZTKE_LES, & + OMASK, & + XLES_RES_W_SBG_Tke(:,NLES_CURRENT_TCOUNT,IMASK) ) +END IF +! +!* WARNING: these terms also contain the term due to the mean flow. +! this mean flow contribution will be removed from them +! when treated in write_les_budgetn.f90 +! +!* production terms for subgrid quantities +! +IF (LLES_RESOLVED .AND. LLES_SUBGRID) THEN + CALL LES_MEAN_MPROC ( XLES_RES_ddxa_U_SBG_UaU(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_ddxa_V_SBG_UaV(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_ddz_Thl_SBG_W2 (:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + IF (LUSERV) THEN + CALL LES_MEAN_MPROC ( XLES_RES_ddxa_W_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaW(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_ddz_Rt_SBG_W2 (:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Thl_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaThl(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_ddxa_Rt_SBG_UaRt(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + END IF +! +!* WARNING: these terms also contain the term due to the mean flow. +! this mean flow contribution will be removed from them +! when treated in write_les_budgetn.f90 +! +!* turbulent transport and advection terms for subgrid quantities +! + CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WThl(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Thl2(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + IF (LUSERV) THEN + CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WRt(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Rt2(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_ThlRt(:,NLES_CURRENT_TCOUNT,IMASK), & + IAVG_PTS(:), IUND_PTS(:) ) + + END IF + + DO JSV=1,NSV + CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_WSv(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & + IAVG_PTS(:), IUND_PTS(:) ) + + CALL LES_MEAN_MPROC ( XLES_RES_W_SBG_Sv2(:,NLES_CURRENT_TCOUNT,IMASK,JSV), & + IAVG_PTS(:), IUND_PTS(:) ) + END DO +END IF +! +!------------------------------------------------------------------------------- +! +! 2. The following is for cartesian mask only +! ---------------------------------------- +! +IF (IMASK>1) RETURN +! +!------------------------------------------------------------------------------- +! +! 3. Updraft diagnostics +! ------------------- +! +IF (LLES_UPDRAFT) THEN +! + DO JK=1,NLES_K + GUPDRAFT_MASK(:,:,JK) = (XW_ANOM(:,:,JK) > 0.) .AND. LLES_CURRENT_CART_MASK(:,:,JK) + END DO +! +! +! 3.1 Updraft fraction +! ---------------- +! + ZUPDRAFT(:,:,:) = 0. + WHERE (GUPDRAFT_MASK(:,:,:)) + ZUPDRAFT(:,:,:) = 1. + END WHERE +! + CALL LES_MEAN_ll ( ZUPDRAFT, OMASK, & + XLES_UPDRAFT(:,NLES_CURRENT_TCOUNT) ) +! +! +! 3.2 Updraft mean quantities +! ----------------------- +! +!* vertical wind velocity +! + CALL LES_MEAN_ll ( ZW_LES, GUPDRAFT_MASK, & + XLES_UPDRAFT_W(:,NLES_CURRENT_TCOUNT) ) +! +!* potential temperature +! + CALL LES_MEAN_ll ( ZTH_LES, GUPDRAFT_MASK, & + XLES_UPDRAFT_Th(:,NLES_CURRENT_TCOUNT) ) +! +!* liquid potential temperature +! + IF (LUSERC) & + CALL LES_MEAN_ll ( ZTHL_LES, GUPDRAFT_MASK, & + XLES_UPDRAFT_Thl(:,NLES_CURRENT_TCOUNT) ) +! +!* virtual potential temperature +! + IF (LUSERV) & + CALL LES_MEAN_ll ( ZTHV_LES, GUPDRAFT_MASK, & + XLES_UPDRAFT_Thv(:,NLES_CURRENT_TCOUNT) ) +! +!* vapor mixing ratio +! + IF (LUSERV) & + CALL LES_MEAN_ll ( ZRV_LES, GUPDRAFT_MASK, & + XLES_UPDRAFT_Rv(:,NLES_CURRENT_TCOUNT) ) +! +!* cloud water mixing ratio +! + IF (LUSERC) & + CALL LES_MEAN_ll ( ZRC_LES, GUPDRAFT_MASK, & + XLES_UPDRAFT_Rc(:,NLES_CURRENT_TCOUNT) ) +! +!* rain mixing ratio +! + IF (LUSERR) & + CALL LES_MEAN_ll ( ZRR_LES, GUPDRAFT_MASK, & + XLES_UPDRAFT_Rr(:,NLES_CURRENT_TCOUNT) ) +! +!* cloud ice mixing ratio +! + IF (LUSERI) & + CALL LES_MEAN_ll ( ZRI_LES, GUPDRAFT_MASK, & + XLES_UPDRAFT_Ri(:,NLES_CURRENT_TCOUNT) ) +! +!* snow mixing ratio +! + IF (LUSERS) & + CALL LES_MEAN_ll ( ZRS_LES, GUPDRAFT_MASK, & + XLES_UPDRAFT_Rs(:,NLES_CURRENT_TCOUNT) ) +! +!* graupel mixing ratio +! + IF (LUSERG) & + CALL LES_MEAN_ll ( ZRG_LES, GUPDRAFT_MASK, & + XLES_UPDRAFT_Rg(:,NLES_CURRENT_TCOUNT) ) +! +!* hail mixing ratio +! + IF (LUSERH) & + CALL LES_MEAN_ll ( ZRG_LES, GUPDRAFT_MASK, & + XLES_UPDRAFT_Rh(:,NLES_CURRENT_TCOUNT) ) +! +!* scalar variables +! + DO JSV=1,NSV + CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), GUPDRAFT_MASK, & + XLES_UPDRAFT_Sv(:,NLES_CURRENT_TCOUNT,JSV) ) + END DO +! +!* subgrid turbulent kinetic energy +! + CALL LES_MEAN_ll ( ZTKE_LES, GUPDRAFT_MASK, & + XLES_UPDRAFT_Tke(:,NLES_CURRENT_TCOUNT) ) +! +! +! 3.3 Updraft resolved quantities +! --------------------------- +! +! +!* resolved turbulent kinetic energy +! + CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM, & + GUPDRAFT_MASK, & + ZLES_UPDRAFT_U2(:) ) + + CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM, & + GUPDRAFT_MASK, & + ZLES_UPDRAFT_V2(:) ) + + CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM, & + GUPDRAFT_MASK, & + ZLES_UPDRAFT_W2(:) ) + + XLES_UPDRAFT_Ke(:,NLES_CURRENT_TCOUNT) = 0.5 * ( ZLES_UPDRAFT_U2(:) & + + ZLES_UPDRAFT_V2(:) & + + ZLES_UPDRAFT_W2(:) ) +! +!* vertical potential temperature flux +! + CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_WTh(:,NLES_CURRENT_TCOUNT) ) +! +!* vertical liquid potential temperature flux +! + IF (LUSERC) & + CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_WThl(:,NLES_CURRENT_TCOUNT) ) +! +!* vertical virtual potential temperature flux +! + IF (LUSERV) & + CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_WThv(:,NLES_CURRENT_TCOUNT) ) +! +!* potential temperature variance +! + CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_Th2(:,NLES_CURRENT_TCOUNT) ) +! +!* liquid potential temperature variance +! + IF (LUSERC) & + CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_Thl2(:,NLES_CURRENT_TCOUNT) ) +! +!* potential temperature - virtual potential temperature covariance +! + IF (LUSERV) & + CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_ThThv (:,NLES_CURRENT_TCOUNT) ) +! +!* liquid potential temperature - virtual potential temperature covariance +! + IF (LUSERC) & + CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_ThlThv(:,NLES_CURRENT_TCOUNT) ) +! +!* water vapor mixing ratio flux, variance and correlations +! + IF (LUSERV) THEN + CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_WRv(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_Rv2(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_ThRv (:,NLES_CURRENT_TCOUNT) ) + ! + IF (LUSERC) & + CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_ThlRv(:,NLES_CURRENT_TCOUNT) ) + + CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_ThvRv(:,NLES_CURRENT_TCOUNT) ) + END IF +! +!* cloud water mixing ratio flux +! + IF (LUSERC) THEN + CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_WRc(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_Rc2(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_ThRc (:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_ThlRc(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_ThvRc(:,NLES_CURRENT_TCOUNT) ) + END IF +! +!* cloud ice mixing ratio flux +! + IF (LUSERI) THEN + CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_WRi(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_Ri2(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_ThRi (:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_ThlRi(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM, & + GUPDRAFT_MASK, & + XLES_UPDRAFT_ThvRi(:,NLES_CURRENT_TCOUNT) ) + END IF +! +!* scalar variables flux +! + DO JSV=1,NSV + CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV), & + GUPDRAFT_MASK, & + XLES_UPDRAFT_WSv(:,NLES_CURRENT_TCOUNT,JSV) ) + ! + CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV), & + GUPDRAFT_MASK, & + XLES_UPDRAFT_Sv2(:,NLES_CURRENT_TCOUNT,JSV) ) + ! + CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV), & + GUPDRAFT_MASK, & + XLES_UPDRAFT_ThSv(:,NLES_CURRENT_TCOUNT,JSV) ) + ! + IF (LUSERC) & + CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV), & + GUPDRAFT_MASK, & + XLES_UPDRAFT_ThlSv(:,NLES_CURRENT_TCOUNT,JSV) ) + ! + IF (LUSERV) & + CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV), & + GUPDRAFT_MASK, & + XLES_UPDRAFT_ThvSv(:,NLES_CURRENT_TCOUNT,JSV) ) + END DO +! +END IF +! +!------------------------------------------------------------------------------- +! +! 4. Downdraft diagnostics +! --------------------- +! +IF (LLES_DOWNDRAFT) THEN +! + DO JK=1,NLES_K + GDOWNDRAFT_MASK(:,:,JK) = (XW_ANOM(:,:,JK) <= 0.) .AND. LLES_CURRENT_CART_MASK(:,:,JK) + END DO +! +! +! 4.1 Downdraft fraction +! ------------------ +! + ZDOWNDRAFT(:,:,:) = 0. + WHERE (GDOWNDRAFT_MASK(:,:,:)) + ZDOWNDRAFT(:,:,:) = 1. + END WHERE +! + CALL LES_MEAN_ll ( ZDOWNDRAFT, OMASK, & + XLES_DOWNDRAFT(:,NLES_CURRENT_TCOUNT) ) +! +! +! 4.2 Downdraft mean quantities +! ------------------------- +! +!* vertical wind velocity +! + CALL LES_MEAN_ll ( ZW_LES, GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_W(:,NLES_CURRENT_TCOUNT) ) +! +!* potential temperature +! + CALL LES_MEAN_ll ( ZTH_LES, GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Th(:,NLES_CURRENT_TCOUNT) ) +! +!* liquid potential temperature +! + IF (LUSERC) & + CALL LES_MEAN_ll ( ZTHL_LES, GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Thl(:,NLES_CURRENT_TCOUNT) ) +! +!* virtual potential temperature +! + IF (LUSERV) & + CALL LES_MEAN_ll ( ZTHV_LES, GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Thv(:,NLES_CURRENT_TCOUNT) ) +! +!* vapor mixing ratio +! + IF (LUSERV) & + CALL LES_MEAN_ll ( ZRV_LES, GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Rv(:,NLES_CURRENT_TCOUNT) ) +! +!* cloud water mixing ratio +! + IF (LUSERC) & + CALL LES_MEAN_ll ( ZRC_LES, GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Rc(:,NLES_CURRENT_TCOUNT) ) +! +!* rain mixing ratio +! + IF (LUSERR) & + CALL LES_MEAN_ll ( ZRR_LES, GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Rr(:,NLES_CURRENT_TCOUNT) ) +! +!* cloud ice mixing ratio +! + IF (LUSERI) & + CALL LES_MEAN_ll ( ZRI_LES, GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Ri(:,NLES_CURRENT_TCOUNT) ) +! +!* snow mixing ratio +! + IF (LUSERS) & + CALL LES_MEAN_ll ( ZRS_LES, GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Rs(:,NLES_CURRENT_TCOUNT) ) +! +!* graupel mixing ratio +! + IF (LUSERG) & + CALL LES_MEAN_ll ( ZRG_LES, GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Rg(:,NLES_CURRENT_TCOUNT) ) +! +!* hail mixing ratio +! + IF (LUSERH) & + CALL LES_MEAN_ll ( ZRG_LES, GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Rh(:,NLES_CURRENT_TCOUNT) ) +! +!* scalar variables +! + DO JSV=1,NSV + CALL LES_MEAN_ll ( ZSV_LES(:,:,:,JSV), GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Sv(:,NLES_CURRENT_TCOUNT,JSV) ) + END DO +! +!* subgrid turbulent kinetic energy +! + CALL LES_MEAN_ll ( ZTKE_LES, GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Tke(:,NLES_CURRENT_TCOUNT) ) +! +! +! 4.3 Downdraft resolved quantities +! ----------------------------- +! +!* resolved turbulent kinetic energy +! + CALL LES_FLUX_ll ( XU_ANOM, XU_ANOM, & + GDOWNDRAFT_MASK, & + ZLES_DOWNDRAFT_U2(:) ) + + CALL LES_FLUX_ll ( XV_ANOM, XV_ANOM, & + GDOWNDRAFT_MASK, & + ZLES_DOWNDRAFT_V2(:) ) + + CALL LES_FLUX_ll ( XW_ANOM, XW_ANOM, & + GDOWNDRAFT_MASK, & + ZLES_DOWNDRAFT_W2(:) ) + + XLES_DOWNDRAFT_Ke(:,NLES_CURRENT_TCOUNT) = 0.5 * ( ZLES_DOWNDRAFT_U2(:) & + + ZLES_DOWNDRAFT_V2(:) & + + ZLES_DOWNDRAFT_W2(:) ) +! +!* vertical potential temperature flux +! + CALL LES_FLUX_ll ( XW_ANOM, ZTH_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_WTh(:,NLES_CURRENT_TCOUNT) ) +! +!* vertical liquid potential temperature flux +! + IF (LUSERC) & + CALL LES_FLUX_ll ( XW_ANOM, XTHL_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_WThl(:,NLES_CURRENT_TCOUNT) ) +! +!* vertical virtual potential temperature flux +! + IF (LUSERV) & + CALL LES_FLUX_ll ( XW_ANOM, ZTHV_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_WThv(:,NLES_CURRENT_TCOUNT) ) +! +!* potential temperature variance +! + CALL LES_FLUX_ll ( ZTH_ANOM, ZTH_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Th2(:,NLES_CURRENT_TCOUNT) ) +! +!* liquid potential temperature variance +! + IF (LUSERC) & + CALL LES_FLUX_ll ( XTHL_ANOM, XTHL_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Thl2(:,NLES_CURRENT_TCOUNT) ) +! +!* potential temperature - virtual potential temperature covariance +! + IF (LUSERV) & + CALL LES_FLUX_ll ( ZTH_ANOM, ZTHV_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_ThThv (:,NLES_CURRENT_TCOUNT) ) +! +!* liquid potential temperature - virtual potential temperature covariance +! + IF (LUSERC) & + CALL LES_FLUX_ll ( XTHL_ANOM, ZTHV_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_ThlThv(:,NLES_CURRENT_TCOUNT) ) +! +! +!* water vapor mixing ratio flux, variance and correlations +! + IF (LUSERV) THEN + CALL LES_FLUX_ll ( XW_ANOM, ZRV_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_WRv(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZRV_ANOM, ZRV_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Rv2(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZTH_ANOM, ZRV_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_ThRv (:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZTHV_ANOM, ZRV_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_ThvRv(:,NLES_CURRENT_TCOUNT) ) + ! + IF (LUSERC) & + CALL LES_FLUX_ll ( XTHL_ANOM, ZRV_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_ThlRv(:,NLES_CURRENT_TCOUNT) ) + END IF +! +!* cloud water mixing ratio flux +! + IF (LUSERC) THEN + CALL LES_FLUX_ll ( XW_ANOM, ZRC_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_WRc(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZRC_ANOM, ZRC_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Rc2(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZTH_ANOM, ZRC_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_ThRc (:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZTHV_ANOM, ZRC_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_ThvRc(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( XTHL_ANOM, ZRC_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_ThlRc(:,NLES_CURRENT_TCOUNT) ) + END IF +! +!* cloud ice mixing ratio flux +! + IF (LUSERI) THEN + CALL LES_FLUX_ll ( XW_ANOM, ZRI_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_WRi(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZRI_ANOM, ZRI_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Ri2(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZTH_ANOM, ZRI_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_ThRi (:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( ZTHV_ANOM, ZRI_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_ThvRi(:,NLES_CURRENT_TCOUNT) ) + ! + CALL LES_FLUX_ll ( XTHL_ANOM, ZRI_ANOM, & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_ThlRi(:,NLES_CURRENT_TCOUNT) ) + END IF +! +!* scalar variables flux +! + DO JSV=1,NSV + CALL LES_FLUX_ll ( XW_ANOM, XSV_ANOM(:,:,:,JSV), & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_WSv(:,NLES_CURRENT_TCOUNT,JSV) ) + ! + CALL LES_FLUX_ll ( XSV_ANOM(:,:,:,JSV), XSV_ANOM(:,:,:,JSV), & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_Sv2(:,NLES_CURRENT_TCOUNT,JSV) ) + ! + CALL LES_FLUX_ll ( ZTH_ANOM, XSV_ANOM(:,:,:,JSV), & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_ThSv(:,NLES_CURRENT_TCOUNT,JSV) ) + ! + IF (LUSERC) & + CALL LES_FLUX_ll ( XTHL_ANOM, XSV_ANOM(:,:,:,JSV), & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_ThlSv(:,NLES_CURRENT_TCOUNT,JSV) ) + ! + IF (LUSERV) & + CALL LES_FLUX_ll ( ZTHV_ANOM, XSV_ANOM(:,:,:,JSV), & + GDOWNDRAFT_MASK, & + XLES_DOWNDRAFT_ThvSv(:,NLES_CURRENT_TCOUNT,JSV) ) + END DO +! +END IF +! +!------------------------------------------------------------------------------- +! +! 5. surface or 2D variables (only for the cartesian mask) +! ----------------------- +! +!* surface flux of temperature Qo +! +CALL LES_MEAN_MPROC ( XLES_Q0 (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) +! +!* surface flux of water vapor Eo +! +CALL LES_MEAN_MPROC ( XLES_E0 (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) +! +!* surface flux for scalar variables +! +DO JSV=1,NSV + CALL LES_MEAN_MPROC ( XLES_SV0 (NLES_CURRENT_TCOUNT,JSV), IAVG_PTS(1), IUND_PTS(1) ) +END DO +! +!* surface flux of U wind component +! +CALL LES_MEAN_MPROC ( XLES_UW0 (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) +! +!* surface flux of V wind component +! +CALL LES_MEAN_MPROC ( XLES_VW0 (NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) +! +!* friction velocity u* +! +!* average of local u* +!!CALL LES_MEAN_MPROC ( XLES_USTAR(NLES_CURRENT_TCOUNT), IAVG_PTS(1), IUND_PTS(1) ) +!* or true global u* +XLES_USTAR(NLES_CURRENT_TCOUNT) = SQRT(SQRT(XLES_UW0(NLES_CURRENT_TCOUNT)**2 & + +XLES_VW0(NLES_CURRENT_TCOUNT)**2 )) +! +!* Boundary layer height +! +IF (CBL_HEIGHT_DEF=='WTV') THEN +! +!* level where temperature flux is minimum +! +ALLOCATE(ZWORK(SIZE(XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK),1))) +ZWORK=XLES_SUBGRID_WTHVMF(:,NLES_CURRENT_TCOUNT,IMASK) +WHERE(ZWORK==XUNDEF) ZWORK=0. + + IF (LUSERC) THEN + IKMIN_FLUX = MINLOC( XLES_RESOLVED_WThv(:,NLES_CURRENT_TCOUNT,1) & + + XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,1) & + + ZWORK & ! flux if EDKF + + (XRV/XRD - 1.) *( XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,1) & + -XLES_SUBGRID_WRc (:,NLES_CURRENT_TCOUNT,1)) ) + ELSE IF (LUSERV) THEN + IKMIN_FLUX = MINLOC( XLES_RESOLVED_WThv(:,NLES_CURRENT_TCOUNT,1) & + + ZWORK & ! flux if EDKF + + XLES_SUBGRID_WThl (:,NLES_CURRENT_TCOUNT,1) & + + (XRV/XRD - 1.) * XLES_SUBGRID_WRt (:,NLES_CURRENT_TCOUNT,1) ) + ELSE + IKMIN_FLUX = MINLOC( XLES_RESOLVED_WTh(:,NLES_CURRENT_TCOUNT,1) & + + ZWORK & ! flux if EDKF + + XLES_SUBGRID_WThl(:,NLES_CURRENT_TCOUNT,1) ) + END IF +DEALLOCATE(ZWORK) +! +!* boundary layer height +! + XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(IKMIN_FLUX(1)) - XLES_ZS +! +ELSE IF (CBL_HEIGHT_DEF=='DTH') THEN + IKMAX_TH=MAXLOC( ZLES_MEAN_DTHDZ(:)) + XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_TH(1)) - XLES_ZS +! +ELSE IF (CBL_HEIGHT_DEF=='KE ') THEN + + XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(NLES_K) - XLES_ZS +! +!* total Turbulent Kinetic Energy +! + ZKE_TOT(:) = 0. +! + ZKE_TOT(:) = ZKE_TOT(:) + XLES_SUBGRID_TKE (:,NLES_CURRENT_TCOUNT,1) +! + IF (CTURBLEN/='BL89' .AND. CTURBLEN/='RM17' .AND. LLES_RESOLVED) & + ZKE_TOT(:) = ZKE_TOT(:) + XLES_RESOLVED_KE(:,NLES_CURRENT_TCOUNT,1) +! + ZINT_KE_TOT = 0. +! +!* integration of total kinetic energy on boundary layer depth +! + ZINT_KE_TOT = ZINT_KE_TOT +XLES_Z(1)*ZKE_TOT(1) + DO JK=1,NLES_K-1 + ZINT_KE_TOT = ZINT_KE_TOT + (XLES_Z(JK+1)-XLES_Z(JK)) & + * 0.5 *( ZKE_TOT(JK+1) + ZKE_TOT(JK) ) +! +!* test of total kinetic energy smaller than 5% of the averaged value below +! + IF ( ZKE_TOT(JK+1) < 0.05 * ZINT_KE_TOT / (XLES_Z(JK+1)-XLES_Z(1)) ) THEN + XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(JK) - XLES_ZS + EXIT + END IF +! + END DO +! +ELSE IF (CBL_HEIGHT_DEF=='TKE') THEN + + XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(NLES_K) - XLES_ZS +! +!* subgrid Turbulent Kinetic Energy +! + ZKE_TOT(:) = XLES_SUBGRID_TKE (:,NLES_CURRENT_TCOUNT,1) +! + ZINT_KE_TOT = 0. +! +!* integration of subgrid kinetic energy on boundary layer depth +! + DO JK=1,NLES_K-1 + ZINT_KE_TOT = ZINT_KE_TOT + (XLES_Z(JK+1)-XLES_Z(JK)) & + * 0.5 *( ZKE_TOT(JK+1) + ZKE_TOT(JK) ) +! +!* test of subgrid kinetic energy smaller than 0.1% of the averaged value below +! + IF ( ZKE_TOT(JK+1) < 0.001 * ZINT_KE_TOT / (XLES_Z(JK+1)-XLES_Z(1)) ) THEN + XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = XLES_Z(JK) - XLES_ZS + EXIT + END IF + END DO +ELSE IF (CBL_HEIGHT_DEF=='FRI') THEN + ZFRIC_LES = SQRT( ( XLES_SUBGRID_WU (:,NLES_CURRENT_TCOUNT,1) & + +XLES_RESOLVED_WU(:,NLES_CURRENT_TCOUNT,1))**2 & + +( XLES_SUBGRID_WV (:,NLES_CURRENT_TCOUNT,1) & + +XLES_RESOLVED_WV(:,NLES_CURRENT_TCOUNT,1))**2 ) + ZFRIC_SURF = XLES_USTAR(NLES_CURRENT_TCOUNT)**2 + XLES_BL_HEIGHT(NLES_CURRENT_TCOUNT) = BL_DEPTH_DIAG(IKB,IKE,ZFRIC_SURF, XLES_ZS, & + ZFRIC_LES, XLES_Z, & + XFTOP_O_FSURF ) +END IF +! +! +!* integration of total kinetic energy on boundary layer depth +! +XLES_INT_TKE(NLES_CURRENT_TCOUNT)=ZINT_KE_TOT + !* integration of tke + ZTKET_LES(:,:) = 0. + DO JK=1,NLES_K-1 + ZKE_LES(:,:,JK)=0.5*(XU_ANOM(:,:,JK)*XU_ANOM(:,:,JK)+& + XV_ANOM(:,:,JK)*XV_ANOM(:,:,JK)+XW_ANOM(:,:,JK)*XW_ANOM(:,:,JK)) + + ZTKET_LES(:,:) = ZTKET_LES(:,:) + (ZZZ_LES(:,:,JK+1)-ZZZ_LES(:,:,JK)) & + * (ZTKE_LES(:,:,JK)+ZKE_LES(:,:,JK)) + END DO + CALL LES_MEAN_ll ( ZTKET_LES, LLES_CURRENT_CART_MASK(:,:,1), & + XLES_INT_TKE(NLES_CURRENT_TCOUNT) ) +! +!* convective velocity +! +XLES_WSTAR(NLES_CURRENT_TCOUNT) = 0. +! +IF ( XLES_Q0(NLES_CURRENT_TCOUNT) & + + (XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT) >0.) THEN + IF (LUSERV) THEN + XLES_WSTAR(NLES_CURRENT_TCOUNT) = & + ( XG / XLES_MEAN_Thv (1,NLES_CURRENT_TCOUNT,1) & + * ( XLES_Q0( NLES_CURRENT_TCOUNT ) & + + (XRV/XRD - 1.) * XLES_E0( NLES_CURRENT_TCOUNT )) & + * XLES_BL_HEIGHT( NLES_CURRENT_TCOUNT ) & + ) ** (1./3.) + ELSE + XLES_WSTAR(NLES_CURRENT_TCOUNT) = & + ( XG / XLES_MEAN_Th (1,NLES_CURRENT_TCOUNT,1) & + * ( XLES_Q0( NLES_CURRENT_TCOUNT ) & + + (XRV/XRD - 1.) * XLES_E0( NLES_CURRENT_TCOUNT )) & + * XLES_BL_HEIGHT( NLES_CURRENT_TCOUNT ) & + ) ** (1./3.) + END IF +END IF +! +!* cloud base height + IF (LUSERC) THEN + ZINT_RHOKE =0. + JJ=1 + DO JI=1,NLES_K + IF ((ZINT_RHOKE .EQ. 0) .AND. & + (XLES_MEAN_RC(JI,NLES_CURRENT_TCOUNT,1) .GT. 1.E-6)) THEN + ZINT_RHOKE=1. + JJ=JI + END IF + END DO + XLES_ZCB(NLES_CURRENT_TCOUNT)= XLES_Z(JJ)-XLES_ZS + ENDIF +! +!* height of max of cf + IF (LUSERC) THEN + IKMAX_CF= MAXLOC( XLES_MEAN_INDCf(:,NLES_CURRENT_TCOUNT,1)) + XLES_ZMAXCF(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_CF(1)) - XLES_ZS + IKMAX_CF= MAXLOC( XLES_MEAN_INDCf2(:,NLES_CURRENT_TCOUNT,1)) + XLES_ZMAXCF2(NLES_CURRENT_TCOUNT) = XLES_Z(IKMAX_CF(1)) - XLES_ZS + ENDIF +! +!* Monin-Obukhov length +! +XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = 0. +! +IF (LUSERV) THEN + IF ( XLES_Q0(NLES_CURRENT_TCOUNT)+(XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT) /=0. )& + XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = (- (XLES_USTAR(NLES_CURRENT_TCOUNT))**3) & + / (XKARMAN*( XLES_Q0(NLES_CURRENT_TCOUNT) & + +(XRV/XRD-1.)*XLES_E0(NLES_CURRENT_TCOUNT)) & + *XG/XLES_MEAN_Thv(1,NLES_CURRENT_TCOUNT,1) ) +ELSE + IF ( XLES_Q0(NLES_CURRENT_TCOUNT) /=0. ) & + XLES_MO_LENGTH(NLES_CURRENT_TCOUNT) = (- (XLES_USTAR(NLES_CURRENT_TCOUNT))**3) & + / (XKARMAN*XLES_Q0(NLES_CURRENT_TCOUNT) & + *XG/XLES_MEAN_Th(1,NLES_CURRENT_TCOUNT,1) ) +END IF +! +!------------------------------------------------------------------------------- +! +! 6. correlations along x and y axes +! ------------------------------- +! +!* u * u +! +DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZU_SPEC(:,:,JK), ZU_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_UU(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_UU(:,JK,NLES_CURRENT_TCOUNT) ) +END DO +! +!* v * v +! +DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZV_SPEC(:,:,JK), ZV_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_VV(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_VV(:,JK,NLES_CURRENT_TCOUNT) ) +END DO +! +!* u * v +! +DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZU_SPEC(:,:,JK), ZV_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_UV(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_UV(:,JK,NLES_CURRENT_TCOUNT) ) +END DO +! +!* w * u +! +DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZU_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_WU(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_WU(:,JK,NLES_CURRENT_TCOUNT) ) +END DO +! +!* w * v +! +DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZV_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_WV(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_WV(:,JK,NLES_CURRENT_TCOUNT) ) +END DO +! +!* w * w +! +DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZW_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_WW(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_WW(:,JK,NLES_CURRENT_TCOUNT) ) +END DO +! +!* w * th +! +DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZTH_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_WTh(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_WTh(:,JK,NLES_CURRENT_TCOUNT) ) +END DO +! +!* w * thl +! +DO JK=1,NSPECTRA_K + IF (LUSERC) & + CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZTHL_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_WThl(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_WThl(:,JK,NLES_CURRENT_TCOUNT) ) +END DO +! +!* th * th +! +DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZTH_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_ThTh(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_ThTh(:,JK,NLES_CURRENT_TCOUNT) ) +END DO +! +!* thl * thl +! +DO JK=1,NSPECTRA_K + IF (LUSERC) & + CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZTHL_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_ThlThl(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_ThlThl(:,JK,NLES_CURRENT_TCOUNT) ) +END DO +! +!* correlations with water vapor +! +IF (LUSERV) THEN + DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRV_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_WRv(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_WRv(:,JK,NLES_CURRENT_TCOUNT) ) + END DO + ! + DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRV_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_ThRv(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_ThRv(:,JK,NLES_CURRENT_TCOUNT) ) + END DO + ! + DO JK=1,NSPECTRA_K + IF (LUSERC) & + CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRV_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_ThlRv(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_ThlRv(:,JK,NLES_CURRENT_TCOUNT) ) + END DO + ! + DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZRV_SPEC(:,:,JK), ZRV_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_RvRv(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_RvRv(:,JK,NLES_CURRENT_TCOUNT) ) + END DO +END IF +! +! +!* correlations with cloud water +! +IF (LUSERC) THEN + DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRC_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_WRc(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_WRc(:,JK,NLES_CURRENT_TCOUNT) ) + END DO + ! + DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRC_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_ThRc(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_ThRc(:,JK,NLES_CURRENT_TCOUNT) ) + END DO + ! + DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRC_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_ThlRc(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_ThlRc(:,JK,NLES_CURRENT_TCOUNT) ) + END DO + ! + DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZRC_SPEC(:,:,JK), ZRC_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_RcRc(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_RcRc(:,JK,NLES_CURRENT_TCOUNT) ) + END DO +END IF +! +!* correlations with cloud ice +! +IF (LUSERI) THEN + DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZRI_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_WRi(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_WRi(:,JK,NLES_CURRENT_TCOUNT) ) + END DO + ! + DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZTH_SPEC(:,:,JK), ZRI_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_ThRi(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_ThRi(:,JK,NLES_CURRENT_TCOUNT) ) + END DO + ! + DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZTHL_SPEC(:,:,JK), ZRI_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_ThlRi(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_ThlRi(:,JK,NLES_CURRENT_TCOUNT) ) + END DO + ! + DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZRI_SPEC(:,:,JK), ZRI_SPEC(:,:,JK), & + CLES_LBCX , CLES_LBCY, & + XCORRi_RiRi(:,JK,NLES_CURRENT_TCOUNT), & + XCORRj_RiRi(:,JK,NLES_CURRENT_TCOUNT) ) + END DO +END IF +! +!* correlations with scalar variables +! +DO JSV=1,NSV + DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZW_SPEC(:,:,JK), ZSV_SPEC(:,:,JK,JSV), & + CLES_LBCX , CLES_LBCY, & + XCORRi_WSv(:,JK,NLES_CURRENT_TCOUNT,JSV), & + XCORRj_WSv(:,JK,NLES_CURRENT_TCOUNT,JSV) ) + END DO + ! + DO JK=1,NSPECTRA_K + CALL LES_HOR_CORR( ZSV_SPEC(:,:,JK,JSV), ZSV_SPEC(:,:,JK,JSV), & + CLES_LBCX , CLES_LBCY, & + XCORRi_SvSv(:,JK,NLES_CURRENT_TCOUNT,JSV), & + XCORRj_SvSv(:,JK,NLES_CURRENT_TCOUNT,JSV) ) + END DO +END DO +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LES +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE LES_n diff --git a/src/mesonh/ext/phys_paramn.f90 b/src/mesonh/ext/phys_paramn.f90 new file mode 100644 index 0000000000000000000000000000000000000000..6b62cc0a441f49a5e4464064f836b1bedf31b495 --- /dev/null +++ b/src/mesonh/ext/phys_paramn.f90 @@ -0,0 +1,1606 @@ +!MNH_LIC Copyright 1995-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. +!----------------------------------------------------------------- +! ######################## + MODULE MODI_PHYS_PARAM_n +! ######################## +! +! +INTERFACE +! + SUBROUTINE PHYS_PARAM_n( KTCOUNT, TPFILE, & + PRAD, PSHADOWS, PKAFR, PGROUND, PMAFL, PDRAG,PEOL, PTURB, & + PTRACER, PTIME_BU, PWETDEPAER, OMASKkids, OCLOUD_ONLY ) +! +USE MODD_IO, ONLY: TFILEDATA +use modd_precision, only: MNHTIME +! +INTEGER, INTENT(IN) :: KTCOUNT ! temporal iteration count +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Synchronous output file +! advection schemes +REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PRAD,PSHADOWS,PKAFR,PGROUND,PTURB,PMAFL,PDRAG,PTRACER,PEOL ! to store CPU + ! time for computing time +REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PTIME_BU ! time used in budget&LES budgets statistics +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PWETDEPAER +LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASKkids ! kids domains mask +LOGICAL, INTENT(OUT) :: OCLOUD_ONLY ! conditionnal radiation computations for + ! the only cloudy columns + ! +END SUBROUTINE PHYS_PARAM_n +! +END INTERFACE +! +END MODULE MODI_PHYS_PARAM_n +! +! ######################################################################################## + SUBROUTINE PHYS_PARAM_n( KTCOUNT, TPFILE, & + PRAD, PSHADOWS, PKAFR, PGROUND, PMAFL, PEOL, PDRAG, PTURB, & + PTRACER, PTIME_BU, PWETDEPAER, OMASKkids, OCLOUD_ONLY ) +! ######################################################################################## +! +!!**** *PHYS_PARAM_n * -monitor of the parameterizations used by model _n +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to update the sources by adding the +! parameterized terms. This is realized by sequentially calling the +! specialized routines. +! +!!** METHOD +!! ------ +!! The first parametrization is the radiation scheme: +!! ---------------- +!! * CRAD = 'FIXE' +!! In this case, a temporal interpolation is performed for the downward +!! surface fluxes XFLALWD and XFLASWD. +!! * CRAD = 'ECMWF' +!! Several tests are performed before calling the radiation computations +!! interface with the ECMWF radiation scheme code. A control is made to +!! ensure that: +!! - the full radiation code is called at the first model timestep +!! - there is a priority for calling the full radiation instead of the +!! cloud-only approximation if both must be called at the current +!! timestep +!! - the cloud-only option (approximation) is coherent with the +!! occurence of one cloudy vertical column at least +!! If all the above conditions are fulfilled (GRAD is .TRUE.) then the +!! position of the sun is computed in routine SUNPOS_n and the interfacing +!! routine RADIATIONS is called to update the radiative tendency XDTHRAD +!! and the downward surface fluxes XFLALWD and XFLASWD. Finally, the +!! radiative tendency is integrated as a source term in the THETA prognostic +!! equation. +!! +!! The second parameterization is the soil scheme: +!! ----------- +!! +!! externalized surface +!! +!! The third parameterization is the turbulence scheme: +!! ----------------- +!! * CTURB='NONE' +!! no turbulent mixing is taken into account +!! * CTURB='TKEL' +!! The turbulent fluxes are computed according to a one and half order +!! closure of the hydrodynamical equations. This scheme is based on a +!! prognostic for the turbulent kinetic energy and a mixing length +!! computation ( the mesh size or a physically based length). Other +!! turbulent moments are diagnosed according to a stationarization of the +!! second order turbulent moments. This turbulent scheme forecasts +!! either a purely vertical turbulent mixing or 3-dimensional mixing +!! according to its internal degrees of freedom. +!! +!! +!! The LAST parameterization is the chemistry scheme: +!! ----------------- +!! The chemistry part of MesoNH has two namelists, NAM_SOLVER for the +!! parameters concerning the stiff solver, and NAM_MNHCn concerning the +!! configuration and options of the chemistry module itself. +!! The switch LUSECHEM in NAM_CONF acitvates or deactivates the chemistry. +!! The only variables of MesoNH that are modified by chemistry are the +!! scalar variables. If calculation of chemical surface fluxes is +!! requested, those fluxes are calculated before +!! entering the turbulence scheme, since those fluxes are taken into +!! account by TURB as surface boundary conditions. +!! CAUTION: chemistry has allways to be called AFTER ALL OTHER TERMS +!! that affect the scalar variables (dynamical terms, forcing, +!! parameterizations (like TURB, CONVECTION), since it uses the variables +!! XRSVS as input in case of the time-split option. +!! +!! EXTERNAL +!! -------- +!! Subroutine SUNPOS_n : computes the position of the sun +!! Subroutine RADIATIONS : computes the radiative tendency and fluxes +!! Subroutine TSZ0 : computes the surface from temporally +!! interpolated Ts and given z0 +!! Subroutine ISBA : computes the surface fluxes from a soil scheme +!! Subroutine TURB : computes the turbulence source terms +!! Subroutine CONVECTION : computes the convection source term +!! Subroutine CH_SURFACE_FLUX_n: computes the surface flux for chemical +!! species +!! Subroutine CH_MONITOR_n : computes the chemistry source terms +!! that are applied to the scalar variables +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! USE MODD_DYN +!! USE MODD_CONF +!! USE MODD_CONF_n +!! USE MODD_CURVCOR_n +!! USE MODD_DYN_n +!! USE MODD_FIELD_n +!! USE MODD_GR_FIELD_n +!! USE MODD_LSFIELD_n +!! USE MODD_GRID_n +!! USE MODD_LBC_n +!! USE MODD_PARAM_RAD_n +!! USE MODD_RADIATIONS_n +!! USE MODD_REF_n +!! USE MODD_LUNIT_n +!! USE MODD_TIME_n +!! USE MODD_CH_MNHC_n +!! +!! REFERENCE +!! --------- +!! None +!! +!! AUTHOR +!! ------ +!! J. Stein * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/01/95 +!! Modifications Feb 14, 1995 (J.Cuxart) add the I/O arguments, +!! the director cosinus and change the names of the surface fluxes +!! Modifications March 21, 1995 (J.M.Carriere) take into account liquid +!! water +!! June 30,1995 (J.Stein) initialize at 0 the surf. fluxes +!! Modifications Sept. 1, 1995 (S.Belair) ISBA scheme +!! Modifications Sept.25, 1995 (J.Stein) switch on the radiation scheme +!! Modifications Sept. 11, 1995 (J.-P. Pinty) radiation scheme +!! Nov. 15, 1995 (J.Stein) cleaning + change the temporal +!! algorithm for the soil scheme-turbulence +!! Jan. 23, 1996 (J.Stein) add a new option for the surface +!! fluxes where Ts and z0 are given +!! March 18, 1996 (J.Stein) add the cloud fraction +!! March 28, 1996 (J.Stein) the soil scheme gives energy +!! fluxes + cleaning +!! June 17, 1996 (Lafore) statistics of computing time +!! August 4, 1996 (K. Suhre) add chemistry +!! Oct. 12, 1996 (J.Stein) use XSRCM in the turbulence +!! scheme +!! Nov. 18, 1996 (J.-P. Pinty) add domain translation +!! change arg. in radiations +!! Fev. 4, 1997 (J.Viviand) change isba's calling for ice +!! Jun. 22, 1997 (J.Stein) change the equation system and use +!! the absolute pressure +!! Jul. 09, 1997 (V.Masson) add directional z0 +!! Jan. 24, 1998 (P.Bechtold) add convective transport for tracers +!! Jan. 24, 1998 (J.-P. Pinty) split SW and LW part for radiation +!! Mai. 10, 1999 (P.Bechtold) shallow convection +!! Oct. 20, 1999 (P.Jabouille) domain translation for turbulence +!! Jan. 04, 2000 (V.Masson) removes TSZ0 case +!! Jan. 04, 2000 (V.Masson) modifies albedo computation +! Jul 02, 2000 (F.Solmon/V.Masson) adaptation for patch approach +!! Nov. 15, 2000 (V.Masson) LES routines +!! Nov. 15, 2000 (V.Masson) effect of slopes on surface fluxes +!! Feb. 02, 2001 (P.Tulet) add friction velocities and aerodynamical +!! resistance (patch approach) +!! Jan. 04, 2000 (V.Masson) modify surf_rad_modif computation +!! Mar. 04, 2002 (F.Solmon) new interface for radiation call +!! Nov. 06, 2002 (V.Masson) LES budgets & budget time counters +!! Jan. 2004 (V.Masson) surface externalization +!! Jan. 13, 2004 (J.Escobar) bug correction : compute "GRAD" in parallel +!! Jan. 20, 2005 (P. Tulet) add dust sedimentation +!! Jan. 20, 2005 (P. Tulet) climatologic SSA +!! Jan. 20, 2005 (P. Tulet) add aerosol / dust scavenging +!! Jul. 2005 (N. Asencio) use the two-way result-fields +!! before ground_param call +!! May 2006 Remove EPS +!! Oct. 2007 (J.Pergaud) Add shallow_MF +!! Oct. 2009 (C.Lac) Introduction of different PTSTEP according to the +!! advection schemes +!! Oct. 2009 (V. MAsson) optimization of Pergaud et al massflux scheme +!! Aug. 2010 (V.Masson, C.Lac) Exchange of SBL_DEPTH for +!! reproducibility +!! Oct. 2010 (J.Escobar) init ZTIME_LES_MF ( pb detected with g95 ) +!! Feb. 2011 (V.Masson, C.Lac) SBL_DEPTH values on outer pts +!! for RMC01 +!! Sept.2011 (J.Escobar) init YINST_SFU ='M' +!! +!! Specific for 2D modeling : +!! +!! 06/2010 (P.Peyrille) add Call to aerozon.f90 if LAERO_FT=T +!! to update +!! aerosols and ozone climatology at each call to +!! phys_param otherwise it is constant to monthly average +!! 03/2013 (C.Lac) FIT temporal scheme +!! 01/2014 (C.Lac) correction for the nesting of 2D surface +!! fields if the number of the son model does not +!! follow the number of the dad model +!! J.Escobar 21/03/2013: for HALOK comment all NHALO=1 test +!! 2014 (M.Faivre) +!! 06/2016 (G.Delautier) phasage surfex 8 +!! 2016 B.VIE LIMA +!! M. Leriche 02/2017 Avoid negative fluxes if sv=0 outside the physics domain +!! C.Lac 10/2017 : ch_monitor and aer_monitor extracted from phys_param +!! to be called directly by modeln as the last process +!! 02/2018 Q.Libois ECRAD +! P. Wautelet 28/03/2018: replace TEMPORAL_DIST by DATETIME_DISTANCE +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +! P. Wautelet 21/11/2019: ZRG_HOUR and ZRAT_HOUR are now parameter arrays +! C. Lac 11/2019: correction in the drag formula and application to building in addition to tree +! F. Auguste 02/2021: add IBM +! JL Redelsperger 03/2021: add the SW flux penetration for Ocean model case +!!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_ADV_n, ONLY : XRTKEMS +USE MODD_ARGSLIST_ll, ONLY : LIST_ll +use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_ri, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & + tbudgets, xtime_bu_process +USE MODD_CH_AEROSOL +USE MODD_CH_MNHC_n, ONLY : LUSECHEM, &! indicates if chemistry is used + LCH_CONV_SCAV, & + LCH_CONV_LINOX +USE MODD_CLOUD_MF_n +USE MODD_CONDSAMP +USE MODD_CONF +USE MODD_CONF_n +USE MODD_CST +USE MODD_CURVCOR_n +USE MODD_DEEP_CONVECTION_n +USE MODD_DEF_EDDY_FLUX_n ! Ajout PP +USE MODD_DEF_EDDYUV_FLUX_n ! Ajout PP +USE MODD_DRAGBLDG_n +USE MODD_DRAGTREE_n +USE MODD_DUST +USE MODD_DYN +USE MODD_DYN_n +USE MODD_EOL_MAIN, ONLY: LMAIN_EOL, CMETH_EOL, NMODEL_EOL +USE MODD_FIELD_n +USE MODD_FRC +USE MODD_FRC_n +USE MODD_GRID +USE MODD_GRID_n +USE MODD_IBM_PARAM_n, ONLY: LIBM, XIBM_EPSI, XIBM_LS +USE MODD_ICE_C1R3_DESCR, ONLY : XRTMIN_C1R3=>XRTMIN +USE MODD_IO, ONLY: TFILEDATA +USE MODD_LATZ_EDFLX +USE MODD_LBC_n +USE MODD_LES +USE MODD_LES_BUDGET +USE MODD_LSFIELD_n +USE MODD_LUNIT_n +USE MODD_METRICS_n +USE MODD_MNH_SURFEX_n +USE MODD_NESTING, ONLY : XWAY,NDAD, NDXRATIO_ALL, NDYRATIO_ALL +USE MODD_NSV +USE MODD_OCEANH +USE MODD_OUT_n +USE MODD_PARAM_C2R2, ONLY : LSEDC +USE MODD_PARAMETERS +USE MODD_PARAM_ICE, ONLY : LSEDIC +USE MODD_PARAM_KAFR_n +USE MODD_PARAM_LIMA, ONLY : MSEDC => LSEDC, XRTMIN_LIMA=>XRTMIN +USE MODD_PARAM_MFSHALL_n +USE MODD_PARAM_n +USE MODD_PARAM_RAD_n +USE MODD_PASPOL +USE MODD_PASPOL_n +USE MODD_PRECIP_n +use modd_precision, only: MNHTIME +USE MODD_RADIATIONS_n +USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN +USE MODD_REF, ONLY: LCOUPLES +USE MODD_REF_n +USE MODD_SALT +USE MODD_SHADOWS_n +USE MODD_SUB_PHYS_PARAM_n +USE MODD_TIME_n +USE MODD_TIME_n +USE MODD_TIME, ONLY : TDTEXP ! Ajout PP +USE MODD_TURB_CLOUD, ONLY : CTURBLEN_CLOUD,NMODEL_CLOUD, & + XCEI,XCEI_MIN,XCEI_MAX,XCOEF_AMPL_SAT +USE MODD_TURB_FLUX_AIRCRAFT_BALLOON, ONLY : XTHW_FLUX, XRCW_FLUX, XSVW_FLUX +USE MODD_TURB_n + +USE MODE_AERO_PSD +use mode_budget, only: Budget_store_end, Budget_store_init +USE MODE_DATETIME +USE MODE_DUST_PSD +USE MODE_ll +USE MODE_MNH_TIMING +USE MODE_MODELN_HANDLER +USE MODE_MPPDB +USE MODE_SALT_PSD + +USE MODI_AEROZON ! Ajout PP +USE MODI_CONDSAMP +USE MODI_CONVECTION +USE MODI_DRAG_BLD +USE MODI_DRAG_VEG +USE MODI_DUST_FILTER +USE MODI_EDDY_FLUX_n ! Ajout PP +USE MODI_EDDY_FLUX_ONE_WAY_n ! Ajout PP +USE MODI_EDDYUV_FLUX_n ! Ajout PP +USE MODI_EDDYUV_FLUX_ONE_WAY_n ! Ajout PP +USE MODI_EOL_MAIN +USE MODI_GROUND_PARAM_n +USE MODI_PASPOL +USE MODI_RADIATIONS +USE MODI_SALT_FILTER +USE MODI_SEDIM_DUST +USE MODI_SEDIM_SALT +USE MODI_SHALLOW_MF_PACK +USE MODI_SUNPOS_n +USE MODI_SURF_RAD_MODIF +USE MODI_SWITCH_SBG_LES_N +USE MODI_TURB + +IMPLICIT NONE +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KTCOUNT ! temporal iteration count +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Synchronous output file +! advection schemes +REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PRAD,PSHADOWS,PKAFR,PGROUND,PTURB,PMAFL,PDRAG,PTRACER,PEOL ! to store CPU + ! time for computing time +REAL(kind=MNHTIME), DIMENSION(2), INTENT(INOUT) :: PTIME_BU ! time used in budget&LES budgets statistics +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PWETDEPAER +LOGICAL, DIMENSION(:,:), INTENT(IN) :: OMASKkids ! kids domains mask +LOGICAL, INTENT(OUT) :: OCLOUD_ONLY ! conditionnal radiation computations for + ! the only cloudy columns + ! +! +!* 0.2 declarations of local variables +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFU ! surface flux of x and +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFV ! y component of wind +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFTH ! surface flux of theta +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFRV ! surface flux of vapor +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSFSV ! surface flux of scalars +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSFCO2! surface flux of CO2 +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDIR_ALB ! direct albedo +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSCA_ALB ! diffuse albedo +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEMIS ! emissivity +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTSRAD ! surface temperature +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRGDST,ZSIGDST,ZNDST,ZSVDST +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRGSLT,ZSIGSLT,ZNSLT,ZSVSLT +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRGAER,ZSIGAER,ZNAER,ZSVAER +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVT +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXN ! Atmospheric density and Exner +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSIGMF ! MF contribution to XSIGS +! +REAL, DIMENSION(0:24), parameter :: ZRG_HOUR = (/ 0., 0., 0., 0., 0., 32.04, 114.19, & + 228.01, 351.25, 465.49, 557.24, & + 616.82, 638.33, 619.43, 566.56, & + 474.71, 359.20, 230.87, 115.72, & + 32.48, 0., 0., 0., 0., 0. /) +! +REAL, DIMENSION(0:24), parameter :: ZRAT_HOUR = (/ 326.00, 325.93, 325.12, 324.41, & + 323.16, 321.95, 322.51, 325.16, & + 328.01, 331.46, 335.58, 340.00, & + 345.20, 350.32, 354.20, 356.58, & + 356.56, 355.33, 352.79, 351.34, & + 347.00, 342.00, 337.00, 332.00, & + 326.00 /) +! +! +character(len=6) :: ynum +INTEGER :: IHOUR ! parameters necessary for the temporal +REAL :: ZTIME, ZDT ! interpolation +REAL :: ZTEMP_DIST ! time between 2 instants (in seconds) +! +LOGICAL :: GRAD ! conditionnal call for the full radiation + ! computations +REAL :: ZRAD_GLOB_ll ! 'real' global parallel mask of 'GRAD' +INTEGER :: INFO_ll ! error report of parallel routines + ! the only cloudy columns +! +REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME1, ZTIME2, ZTIME3, ZTIME4 ! for computing time analysis +REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME_LES_MF ! time spent in LES computation in shallow conv. +LOGICAL :: GDCONV ! conditionnal call for the deep convection + ! computations +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC, ZRI, ZWT ! additional dummies +REAL, DIMENSION(:,:), ALLOCATABLE :: ZDXDY ! grid area + ! for rc, ri, w required if main variables not allocated +! +INTEGER :: IIU, IJU, IKU ! dimensional indexes +! +INTEGER :: JSV ! Loop index for Scalar Variables +INTEGER :: JSWB ! loop on SW spectral bands +INTEGER :: IIB,IIE,IJB,IJE, IKB, IKE +INTEGER :: IMODEIDX + ! index values for the Beginning or the End of the physical + ! domain in x and y directions +TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange +INTEGER :: IINFO_ll ! return code of parallel routine +! +!* variables for writing in a fm file +! +INTEGER :: IRESP ! IRESP : return-code if a problem appears + !in LFI subroutines at the open of the file +INTEGER :: ILUOUT ! logical unit numbers of output-listing +INTEGER :: IMI ! model index +INTEGER :: JKID ! loop index to look for the KID models +REAL :: ZINIRADIUSI, ZINIRADIUSJ ! ORILAM initial radius +REAL, DIMENSION(NMODE_DST) :: ZINIRADIUS ! DUST initial radius +REAL, DIMENSION(NMODE_SLT) :: ZINIRADIUS_SLT ! Sea Salt initial radius +REAL, DIMENSION(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), SIZE(XRSVS,4)) :: ZRSVS +LOGICAL :: GCLD ! conditionnal call for dust wet deposition +! * arrays to store the surface fields before radiation and convection scheme +! calls +INTEGER :: IMODSON ! Number of son models of IMI with XWAY=2 +INTEGER :: IKIDM ! index loop +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSAVE_INPRR,ZSAVE_INPRS,ZSAVE_INPRG,ZSAVE_INPRH +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSAVE_INPRC,ZSAVE_PRCONV,ZSAVE_PRSCONV +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSAVE_DIRFLASWD, ZSAVE_SCAFLASWD,ZSAVE_DIRSRFSWD +! for ocean model +INTEGER :: JKM , JSW ! vertical index loop +REAL :: ZSWA,TINTSW ! index for SW interpolation and int time betwenn forcings (ocean model) +REAL, DIMENSION(:), ALLOCATABLE :: ZIZOCE(:) ! Solar flux penetrating in ocean +REAL, DIMENSION(:), ALLOCATABLE :: ZPROSOL1(:),ZPROSOL2(:) ! Funtions for penetrating solar flux +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZLENGTHM, ZLENGTHH, ZMFMOIST !LHARAT turb option from AROME +! +!----------------------------------------------------------------------------- + +NULLIFY(TZFIELDS_ll) +IMI=GET_CURRENT_MODEL_INDEX() +! +ILUOUT = TLUOUT%NLU +CALL GET_DIM_EXT_ll ('B',IIU,IJU) +IKU=SIZE(XTHT,3) +IKB = 1 + JPVEXT +IKE = IKU - JPVEXT +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +! +ZTIME1 = 0.0_MNHTIME +ZTIME2 = 0.0_MNHTIME +ZTIME3 = 0.0_MNHTIME +ZTIME4 = 0.0_MNHTIME +PTIME_BU = 0._MNHTIME +ZTIME_LES_MF = 0.0_MNHTIME +PWETDEPAER(:,:,:,:) = 0. +! +!* allocation of variables used in more than one parameterization +! +ALLOCATE(ZSFU (IIU,IJU)) ! surface schemes + turbulence +ALLOCATE(ZSFV (IIU,IJU)) +ALLOCATE(ZSFTH (IIU,IJU)) +ALLOCATE(ZSFRV (IIU,IJU)) +ALLOCATE(ZSFSV (IIU,IJU,NSV)) +ALLOCATE(ZSFCO2(IIU,IJU)) +! +!* if XWAY(son)=2 save surface fields before radiation or convective scheme +! calls +! +IMODSON = 0 +DO JKID = IMI+1,NMODEL ! min value of the possible kids + IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. CPROGRAM=='MESONH' & + .AND. (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN + IMODSON = IMODSON + 1 + END IF +END DO +! + IF (IMODSON /= 0 ) THEN + IF (LUSERC .AND. ( & + (LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR. & + (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. & + (MSEDC .AND. CCLOUD=='LIMA') & + )) THEN + ALLOCATE( ZSAVE_INPRC(SIZE(XINPRC,1),SIZE(XINPRC,2),IMODSON)) + ELSE + ALLOCATE( ZSAVE_INPRC(0,0,0)) + END IF + IF (LUSERR) THEN + ALLOCATE( ZSAVE_INPRR(SIZE(XINPRR,1),SIZE(XINPRR,2),IMODSON)) + ELSE + ALLOCATE( ZSAVE_INPRR(0,0,0)) + END IF + IF (LUSERS) THEN + ALLOCATE( ZSAVE_INPRS(SIZE(XINPRS,1),SIZE(XINPRS,2),IMODSON)) + ELSE + ALLOCATE( ZSAVE_INPRS(0,0,0)) + END IF + IF (LUSERG) THEN + ALLOCATE( ZSAVE_INPRG(SIZE(XINPRG,1),SIZE(XINPRG,2),IMODSON)) + ELSE + ALLOCATE( ZSAVE_INPRG(0,0,0)) + END IF + IF (LUSERH) THEN + ALLOCATE( ZSAVE_INPRH(SIZE(XINPRH,1),SIZE(XINPRH,2),IMODSON)) + ELSE + ALLOCATE( ZSAVE_INPRH(0,0,0)) + END IF + IF (CDCONV /= 'NONE') THEN + ALLOCATE( ZSAVE_PRCONV(SIZE(XPRCONV,1),SIZE(XPRCONV,2),IMODSON)) + ALLOCATE( ZSAVE_PRSCONV(SIZE(XPRSCONV,1),SIZE(XPRSCONV,2),IMODSON)) + ELSE + ALLOCATE( ZSAVE_PRCONV(0,0,0)) + ALLOCATE( ZSAVE_PRSCONV(0,0,0)) + END IF + IF (CRAD /= 'NONE') THEN + ALLOCATE( ZSAVE_DIRFLASWD(SIZE(XDIRFLASWD,1),SIZE(XDIRFLASWD,2),SIZE(XDIRFLASWD,3),IMODSON)) + ALLOCATE( ZSAVE_SCAFLASWD(SIZE(XSCAFLASWD,1),SIZE(XSCAFLASWD,2),SIZE(XSCAFLASWD,3),IMODSON)) + ALLOCATE( ZSAVE_DIRSRFSWD(SIZE(XDIRSRFSWD,1),SIZE(XDIRSRFSWD,2),SIZE(XDIRSRFSWD,3),IMODSON)) + ELSE + ALLOCATE( ZSAVE_DIRFLASWD(0,0,0,0)) + ALLOCATE( ZSAVE_SCAFLASWD(0,0,0,0)) + ALLOCATE( ZSAVE_DIRSRFSWD(0,0,0,0)) + END IF + ENDIF +! +IKIDM=0 +DO JKID = IMI+1,NMODEL ! min value of the possible kids + IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. CPROGRAM=='MESONH' & + .AND. (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN +! BUG if number of the son does not follow the number of the dad +! IKIDM = JKID-IMI + IKIDM = IKIDM + 1 + IF (LUSERC .AND. ( & + (LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR. & + (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. & + (MSEDC .AND. CCLOUD=='LIMA') & + )) THEN + ZSAVE_INPRC(:,:,IKIDM) = XINPRC(:,:) + END IF + IF (LUSERR) THEN + ZSAVE_INPRR(:,:,IKIDM) = XINPRR(:,:) + END IF + IF (LUSERS) THEN + ZSAVE_INPRS(:,:,IKIDM) = XINPRS(:,:) + END IF + IF (LUSERG) THEN + ZSAVE_INPRG(:,:,IKIDM) = XINPRG(:,:) + END IF + IF (LUSERH) THEN + ZSAVE_INPRH(:,:,IKIDM) = XINPRH(:,:) + END IF + IF (CDCONV /= 'NONE') THEN + ZSAVE_PRCONV(:,:,IKIDM) = XPRCONV(:,:) + ZSAVE_PRSCONV(:,:,IKIDM) = XPRSCONV(:,:) + END IF + IF (CRAD /= 'NONE') THEN + ZSAVE_DIRFLASWD(:,:,:,IKIDM) = XDIRFLASWD(:,:,:) + ZSAVE_SCAFLASWD(:,:,:,IKIDM) = XSCAFLASWD(:,:,:) + ZSAVE_DIRSRFSWD(:,:,:,IKIDM) = XDIRSRFSWD(:,:,:) + END IF + ENDIF +END DO +! +!----------------------------------------------------------------------------- +! +!* 1. RADIATION SCHEME +! ---------------- +! +! +XTIME_BU_PROCESS = 0. +XTIME_LES_BU_PROCESS = 0. +! +CALL SECOND_MNH2(ZTIME1) +! +! +!* 1.1 Tests to control how the radiation package should be called (at the current timestep) +! ----------------------------------------------------------- +! +! +GRAD = .FALSE. +OCLOUD_ONLY = .FALSE. +! +IF (CRAD /='NONE') THEN +! +! test to see if the partial radiations for cloudy must be called +! + IF (CRAD =='ECMW' .OR. CRAD =='ECRA') THEN + CALL DATETIME_DISTANCE(TDTRAD_CLONLY,TDTCUR,ZTEMP_DIST) + IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTRAD_CLONLY/XTSTEP))==0 ) THEN + TDTRAD_CLONLY = TDTCUR + GRAD = .TRUE. + OCLOUD_ONLY = .TRUE. + END IF + END IF +! +! test to see if the full radiations must be called +! + CALL DATETIME_DISTANCE(TDTCUR,TDTRAD_FULL,ZTEMP_DIST) + IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTRAD/XTSTEP))==0 ) THEN + TDTRAD_FULL = TDTCUR + GRAD = .TRUE. + OCLOUD_ONLY = .FALSE. + END IF +! +! tests to see if any cloud exists +! + IF (CRAD =='ECMW' .OR. CRAD =='ECRA') THEN + IF (GRAD .AND. NRR.LE.3 ) THEN + IF( MAXVAL(XCLDFR(:,:,:)).LE. 1.E-10 .AND. OCLOUD_ONLY ) THEN + GRAD = .FALSE. ! only the cloudy verticals would be + ! refreshed but there is no clouds + END IF + END IF +! + IF (GRAD .AND. NRR.GE.4 ) THEN + IF( CCLOUD(1:3)=='ICE' )THEN + IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN(2) .AND. & + MAXVAL(XRT(:,:,:,4)).LE.XRTMIN(4) .AND. OCLOUD_ONLY ) THEN + GRAD = .FALSE. ! only the cloudy verticals would be + ! refreshed but there is no cloudwater and ice + END IF + END IF + IF( CCLOUD=='C3R5' )THEN + IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_C1R3(2) .AND. & + MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_C1R3(4) .AND. OCLOUD_ONLY ) THEN + GRAD = .FALSE. ! only the cloudy verticals would be + ! refreshed but there is no cloudwater and ice + END IF + END IF + IF( CCLOUD=='LIMA' )THEN + IF( MAXVAL(XRT(:,:,:,2)).LE.XRTMIN_LIMA(2) .AND. & + MAXVAL(XRT(:,:,:,4)).LE.XRTMIN_LIMA(4) .AND. OCLOUD_ONLY ) THEN + GRAD = .FALSE. ! only the cloudy verticals would be + ! refreshed but there is no cloudwater and ice + END IF + END IF + END IF + END IF +! +END IF +! +! global parallel mask for 'GRAD' +ZRAD_GLOB_ll = 0.0 +IF (GRAD) ZRAD_GLOB_ll = 1.0 +CALL REDUCESUM_ll(ZRAD_GLOB_ll,INFO_ll) +if (ZRAD_GLOB_ll .NE. 0.0 ) GRAD = .TRUE. +! +! +IF( GRAD ) THEN + ALLOCATE(ZCOSZEN(IIU,IJU)) + ALLOCATE(ZSINZEN(IIU,IJU)) + ALLOCATE(ZAZIMSOL(IIU,IJU)) +! +! +!* 1.2. Astronomical computations +! ------------------------- +! +! Ajout PP +IF (.NOT. OCLOUD_ONLY .AND. KTCOUNT /= 1) THEN + IF (LAERO_FT) THEN + CALL AEROZON (XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP, & + NDLON,NFLEV,CAER,NAER,NSTATM, & + XSINDEL,XCOSDEL,XTSIDER,XCORSOL, & + XSTATM,XOZON, XAER) + END IF +END IF +! +CALL SUNPOS_n ( XZENITH, ZCOSZEN, ZSINZEN, ZAZIMSOL ) +! +!* 1.3 Call to radiation scheme +! ------------------------ +! + SELECT CASE ( CRAD ) +! +!* 1.3.1 TOP of Atmposphere radiation +! ---------------------------- + CASE('TOPA') +! + XFLALWD (:,:) = 300. + DO JSWB=1,NSWB_MNH + XDIRFLASWD(:,:,JSWB) = XI0 * MAX(COS(XZENITH(:,:)),0.)/REAL(NSWB_MNH) + XSCAFLASWD(:,:,JSWB) = 0. + END DO + XDTHRAD(:,:,:) = 0. + +! +!* 1.3.1 FIXEd radiative surface fluxes +! ------------------------------ +! + CASE('FIXE') + ZTIME = MOD(TDTCUR%xtime +XLON0*240., XDAY) + IHOUR = INT( ZTIME/3600. ) + IF (IHOUR < 0) IHOUR=IHOUR + 24 + ZDT = ZTIME/3600. - REAL(IHOUR) + XDIRFLASWD(:,:,:) =(( ZRG_HOUR(IHOUR+1)-ZRG_HOUR(IHOUR) )*ZDT + ZRG_HOUR(IHOUR)) / REAL(NSWB_MNH) + XFLALWD (:,:) = (ZRAT_HOUR(IHOUR+1)-ZRAT_HOUR(IHOUR))*ZDT + ZRAT_HOUR(IHOUR) + DO JSWB=1,NSWB_MNH + WHERE(ZCOSZEN(:,:)<0.) XDIRFLASWD(:,:,JSWB) = 0. + END DO + + XSCAFLASWD(:,:,:) = XDIRFLASWD(:,:,:) * 0.2 + XDIRFLASWD(:,:,:) = XDIRFLASWD(:,:,:) * 0.8 + XDTHRAD(:,:,:) = 0. + ! +! +!* 1.3.2 ECMWF or ECRAD radiative surface and atmospheric fluxes +! ---------------------------------------------- +! + CASE('ECMW' , 'ECRA') + IF (LLES_MEAN) OCLOUD_ONLY=.FALSE. + XRADEFF(:,:,:)=0.0 + XSWU(:,:,:)=0.0 + XSWD(:,:,:)=0.0 + XLWU(:,:,:)=0.0 + XLWD(:,:,:)=0.0 + XDTHRADSW(:,:,:)=0.0 + XDTHRADLW(:,:,:)=0.0 + CALL RADIATIONS( TPFILE, & + LCLEAR_SKY, OCLOUD_ONLY, NCLEARCOL_TM1, CEFRADL, CEFRADI, COPWSW, COPISW, & + COPWLW, COPILW, XFUDG, & + NDLON, NFLEV, NRAD_DIAG, NFLUX, NRAD, NAER, NSWB_OLD, NSWB_MNH, NLWB_MNH, & + NSTATM, NRAD_COLNBR, ZCOSZEN, XSEA, XCORSOL, & + XDIR_ALB, XSCA_ALB, XEMIS, XCLDFR, XCCO2, XTSRAD, XSTATM, XTHT, XRT, & + XPABST, XOZON, XAER,XDST_WL, XAER_CLIM, XSVT, & + XDTHRAD, XFLALWD, XDIRFLASWD, XSCAFLASWD, XRHODREF, XZZ , & + XRADEFF, XSWU, XSWD, XLWU, XLWD, XDTHRADSW, XDTHRADLW ) +! + + WRITE(UNIT=ILUOUT,FMT='(" RADIATIONS called for KTCOUNT=",I6, & + & "with the CLOUD_ONLY option set ",L2)') KTCOUNT,OCLOUD_ONLY +! + ! + WHERE (XDIRFLASWD.LT.0.0) + XDIRFLASWD=0.0 + ENDWHERE + ! + WHERE (XDIRFLASWD.GT.1500.0) + XDIRFLASWD=1500.0 + ENDWHERE + ! + WHERE (XSCAFLASWD.LT.0.0) + XSCAFLASWD=0.0 + ENDWHERE + ! + WHERE (XSCAFLASWD.GT.1500.0) + XSCAFLASWD=1500.0 + ENDWHERE + ! + WHERE( XDIRFLASWD(:,:,1) + XSCAFLASWD(:,:,1) >0. ) + XALBUV(:,:) = ( XDIR_ALB(:,:,1) * XDIRFLASWD(:,:,1) & + + XSCA_ALB(:,:,1) * XSCAFLASWD(:,:,1) ) & + / (XDIRFLASWD(:,:,1) + XSCAFLASWD(:,:,1) ) + ELSEWHERE + XALBUV(:,:) = XDIR_ALB(:,:,1) + END WHERE +! + END SELECT +! + CALL SECOND_MNH2(ZTIME2) +! + PRAD = PRAD + ZTIME2 - ZTIME1 +! + ZTIME1 = ZTIME2 +! + CALL SURF_RAD_MODIF (XMAP, XXHAT, XYHAT, & + ZCOSZEN, ZSINZEN, ZAZIMSOL, XZS, XZS_XY, & + XDIRFLASWD, XDIRSRFSWD ) +! +!* Azimuthal angle to be sent later to surface processes +! Defined in radian, clockwise, from North +! + XAZIM = ZAZIMSOL +! + CALL SECOND_MNH2(ZTIME2) +! + PSHADOWS = PSHADOWS + ZTIME2 - ZTIME1 +! + ZTIME1 = ZTIME2 +! + DEALLOCATE(ZCOSZEN) + DEALLOCATE(ZSINZEN) + DEALLOCATE(ZAZIMSOL) +! +END IF +! +! +!* 1.4 control prints +! -------------- +! +!* 1.5 Radiative tendency integration +! ------------------------------ +! +IF (CRAD /='NONE') THEN + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'RAD', xrths(:, :, :) ) + XRTHS(:,:,:) = XRTHS(:,:,:) + XRHODJ(:,:,:)*XDTHRAD(:,:,:) + if ( lbudget_th ) call Budget_store_end ( tbudgets(NBUDGET_TH), 'RAD', xrths(:, :, :) ) +END IF +! +! +!* 1.6 Ocean case: +! Sfc turbulent fluxes & Radiative tendency due to SW penetrating ocean +! +IF (LOCEAN .AND. (.NOT.LCOUPLES)) THEN +! + ALLOCATE( ZIZOCE(IKU)); ZIZOCE(:)=0. + ALLOCATE( ZPROSOL1(IKU)) + ALLOCATE( ZPROSOL2(IKU)) + ALLOCATE(XSSUFL(IIU,IJU)) + ALLOCATE(XSSVFL(IIU,IJU)) + ALLOCATE(XSSTFL(IIU,IJU)) + ALLOCATE(XSSOLA(IIU,IJU)) + ! Time interpolation + JSW = INT(TDTCUR%xtime/REAL(NINFRT)) + ZSWA = TDTCUR%xtime/REAL(NINFRT)-REAL(JSW) + XSSTFL = (XSSTFL_T(JSW+1)*(1.-ZSWA)+XSSTFL_T(JSW+2)*ZSWA) + XSSUFL = (XSSUFL_T(JSW+1)*(1.-ZSWA)+XSSUFL_T(JSW+2)*ZSWA) + XSSVFL = (XSSVFL_T(JSW+1)*(1.-ZSWA)+XSSVFL_T(JSW+2)*ZSWA) +! + ZIZOCE(IKU) = XSSOLA_T(JSW+1)*(1.-ZSWA)+XSSOLA_T(JSW+2)*ZSWA + ZPROSOL1(IKU) = XROC*ZIZOCE(IKU) + ZPROSOL2(IKU) = (1.-XROC)*ZIZOCE(IKU) + IF(NVERB >= 5 ) THEN + WRITE(ILUOUT,*)'ZSWA JSW TDTCUR XTSTEP FT FU FV SolarR(IKU)', NINFRT, ZSWA,JSW,& + TDTCUR%xtime, XTSTEP, XSSTFL(2,2), XSSUFL(2,2),XSSVFL(2,2),ZIZOCE(IKU) + END IF + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'OCEAN', xrths(:, :, :) ) + DO JKM=IKU-1,2,-1 + ZPROSOL1(JKM) = ZPROSOL1(JKM+1)* exp(-XDZZ(2,2,JKM)/XD1) + ZPROSOL2(JKM) = ZPROSOL2(JKM+1)* exp(-XDZZ(2,2,JKM)/XD2) + ZIZOCE(JKM) = (ZPROSOL1(JKM+1)-ZPROSOL1(JKM) + ZPROSOL2(JKM+1)-ZPROSOL2(JKM))/XDZZ(2,2,JKM) + ! Adding to temperature tendency, the solar radiation penetrating in ocean + XRTHS(:,:,JKM) = XRTHS(:,:,JKM) + XRHODJ(:,:,JKM)*ZIZOCE(JKM) + END DO + if ( lbudget_th ) call Budget_store_end ( tbudgets(NBUDGET_TH), 'OCEAN', xrths(:, :, :) ) + DEALLOCATE( ZIZOCE) + DEALLOCATE (ZPROSOL1) + DEALLOCATE (ZPROSOL2) +END IF +! +! +CALL SECOND_MNH2(ZTIME2) +! +PRAD = PRAD + ZTIME2 - ZTIME1 & + - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS +! +PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS +! +! +!----------------------------------------------------------------------------- +! +!* 2. DEEP CONVECTION SCHEME +! ---------------------- +! +ZTIME1 = ZTIME2 +XTIME_BU_PROCESS = 0. +XTIME_LES_BU_PROCESS = 0. +! +CALL SECOND_MNH2(ZTIME1) +! +IF( CDCONV == 'KAFR' .OR. CSCONV == 'KAFR' ) THEN + + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'DCONV', xrths(:, :, :) ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'DCONV', xrrs (:, :, :, 1) ) + if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'DCONV', xrrs (:, :, :, 2) ) + if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'DCONV', xrrs (:, :, :, 4) ) + if ( lbudget_sv .and. lchtrans ) then + do jsv = 1, size( xrsvs, 4 ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv), 'DCONV', xrsvs (:, :, :, jsv) ) + end do + end if +! +! test to see if the deep convection scheme should be called +! + GDCONV = .FALSE. +! + CALL DATETIME_DISTANCE(TDTDCONV,TDTCUR,ZTEMP_DIST) + IF( MOD(NINT(ZTEMP_DIST/XTSTEP),NINT(XDTCONV/XTSTEP))==0 ) THEN + TDTDCONV = TDTCUR + GDCONV = .TRUE. + END IF +! + IF( GDCONV ) THEN + IF (CDCONV == 'KAFR' .OR. CSCONV == 'KAFR' ) THEN + ALLOCATE( ZRC(IIU,IJU,IKU) ) + ALLOCATE( ZRI(IIU,IJU,IKU) ) + ALLOCATE( ZWT(IIU,IJU,IKU) ) + ALLOCATE( ZDXDY(IIU,IJU) ) + ! Compute grid area + ZDXDY(:,:) = SPREAD(XDXHAT(1:IIU),2,IJU) * SPREAD(XDYHAT(1:IJU),1,IIU) + ! + IF( LUSERC .AND. LUSERI ) THEN + ZRC(:,:,:) = XRT(:,:,:,2) + ZRI(:,:,:) = XRT(:,:,:,4) + ELSE IF( LUSERC .AND. (.NOT. LUSERI) ) THEN + ZRC(:,:,:) = XRT(:,:,:,2) + ZRI(:,:,:) = 0.0 + ELSE + ZRC(:,:,:) = 0.0 + ZRI(:,:,:) = 0.0 + END IF + WRITE(UNIT=ILUOUT,FMT='(" CONVECTION called for KTCOUNT=",I6)') & + KTCOUNT + IF ( LFORCING .AND. L1D ) THEN + ZWT(:,:,:) = XWTFRC(:,:,:) + ELSE + ZWT(:,:,:) = XWT(:,:,:) + ENDIF + IF (LDUST) CALL DUST_FILTER(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF(:,:,:)) + IF (LSALT) CALL SALT_FILTER(XSVT(:,:,:,NSV_SLTBEG:NSV_SLTEND), XRHODREF(:,:,:)) + IF (LCH_CONV_LINOX) THEN + CALL CONVECTION( XDTCONV, CDCONV, CSCONV, LREFRESH_ALL, LDOWN, NICE, & + LSETTADJ, XTADJD, XTADJS, LDIAGCONV, NENSM, & + XPABST, XZZ, ZDXDY, & + XTHT, XRT(:,:,:,1), ZRC, ZRI, XUT, XVT, & + ZWT,XTKET(:,:,IKB), & + NCOUNTCONV, XDTHCONV, XDRVCONV, XDRCCONV, XDRICONV, & + XPRCONV, XPRSCONV, & + XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV, & + XCAPE, NCLTOPCONV, NCLBASCONV, & + LCHTRANS, XSVT, XDSVCONV, & + LUSECHEM, LCH_CONV_SCAV, LCH_CONV_LINOX, & + LDUST, LSALT, & + XRHODREF, XIC_RATE, XCG_RATE ) + ELSE + CALL CONVECTION( XDTCONV, CDCONV, CSCONV, LREFRESH_ALL, LDOWN, NICE, & + LSETTADJ, XTADJD, XTADJS, LDIAGCONV, NENSM, & + XPABST, XZZ, ZDXDY, & + XTHT, XRT(:,:,:,1), ZRC, ZRI, XUT, XVT, & + ZWT,XTKET(:,:,IKB), & + NCOUNTCONV, XDTHCONV, XDRVCONV, XDRCCONV, XDRICONV, & + XPRCONV, XPRSCONV, & + XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV, & + XCAPE, NCLTOPCONV, NCLBASCONV, & + LCHTRANS, XSVT, XDSVCONV, & + LUSECHEM, LCH_CONV_SCAV, LCH_CONV_LINOX, & + LDUST, LSALT, & + XRHODREF ) + END IF +! + DEALLOCATE( ZRC ) + DEALLOCATE( ZRI ) + DEALLOCATE( ZWT ) + DEALLOCATE( ZDXDY ) + END IF + END IF +! +! Deep convection tendency integration +! + XRTHS(:,:,:) = XRTHS(:,:,:) + XRHODJ(:,:,:) * XDTHCONV(:,:,:) + XRRS(:,:,:,1) = XRRS(:,:,:,1) + XRHODJ(:,:,:) * XDRVCONV(:,:,:) +! +! +! Aerosols size distribution +! Compute Rg and sigma before tracers convection tendency (for orilam, dust and sea +! salt) +! + + IF ( LCHTRANS ) THEN ! update tracers for chemical transport + IF (LORILAM) ZRSVS(:,:,:,:) = XRSVS(:,:,:,:) ! + IF ((LDUST)) THEN ! dust convective balance + ALLOCATE(ZSIGDST(IIU,IJU,IKU,NMODE_DST)) + ALLOCATE(ZRGDST(IIU,IJU,IKU,NMODE_DST)) + ALLOCATE(ZNDST(IIU,IJU,IKU,NMODE_DST)) + ALLOCATE(ZSVDST(IIU,IJU,IKU,NSV_DST)) + ! + DO JSV=1,NMODE_DST + IMODEIDX = JPDUSTORDER(JSV) + IF (CRGUNITD=="MASS") THEN + ZINIRADIUS(JSV) = XINIRADIUS(IMODEIDX) * EXP(-3.*(LOG(XINISIG(IMODEIDX)))**2) + ELSE + ZINIRADIUS(JSV) = XINIRADIUS(IMODEIDX) + END IF + ZSIGDST(:,:,:,JSV) = XINISIG(IMODEIDX) + ZRGDST(:,:,:,JSV) = ZINIRADIUS(JSV) + ZNDST(:,:,:,JSV) = XN0MIN(IMODEIDX) + ENDDO + ! + DO JSV=NSV_DSTBEG,NSV_DSTEND + ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) + ENDDO + CALL PPP2DUST(ZSVDST(IIB:IIE,IJB:IJE,IKB:IKE,:), XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE),& + PSIG3D=ZSIGDST(IIB:IIE,IJB:IJE,IKB:IKE,:), PRG3D=ZRGDST(IIB:IIE,IJB:IJE,IKB:IKE,:), & + PN3D=ZNDST(IIB:IIE,IJB:IJE,IKB:IKE,:)) + END IF + ! + IF ((LSALT)) THEN ! sea salt convective balance + ALLOCATE(ZSIGSLT(IIU,IJU,IKU,NMODE_SLT)) + ALLOCATE(ZRGSLT(IIU,IJU,IKU,NMODE_SLT)) + ALLOCATE(ZNSLT(IIU,IJU,IKU,NMODE_SLT)) + ALLOCATE(ZSVSLT(IIU,IJU,IKU,NSV_SLT)) + ! + DO JSV=1,NMODE_SLT + IMODEIDX = JPSALTORDER(JSV) + IF (CRGUNITS=="MASS") THEN + ZINIRADIUS_SLT(JSV) = XINIRADIUS_SLT(IMODEIDX) * & + EXP(-3.*(LOG(XINISIG_SLT(IMODEIDX)))**2) + ELSE + ZINIRADIUS_SLT(JSV) = XINIRADIUS_SLT(IMODEIDX) + END IF + ZSIGSLT(:,:,:,JSV) = XINISIG_SLT(IMODEIDX) + ZRGSLT(:,:,:,JSV) = ZINIRADIUS_SLT(JSV) + ZNSLT(:,:,:,JSV) = XN0MIN_SLT(IMODEIDX) + ENDDO + ! + DO JSV=NSV_SLTBEG,NSV_SLTEND + ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) + ENDDO + CALL PPP2SALT(ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE),& + PSIG3D=ZSIGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), PRG3D=ZRGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), & + PN3D=ZNSLT(IIB:IIE,IJB:IJE,IKB:IKE,:)) + END IF + ! +! +! Compute convective tendency for all tracers +! + IF (LCHTRANS) THEN + DO JSV = 1, SIZE(XRSVS,4) + XRSVS(:,:,:,JSV) = XRSVS(:,:,:,JSV) + XRHODJ(:,:,:) * XDSVCONV(:,:,:,JSV) + END DO + IF (LORILAM) THEN + DO JSV = NSV_AERBEG,NSV_AEREND + PWETDEPAER(:,:,:,JSV-NSV_AERBEG+1) = XDSVCONV(:,:,:,JSV) * XRHODJ(:,:,:) + XRSVS(:,:,:,JSV) = ZRSVS(:,:,:,JSV) + END DO + END IF + END IF +! + IF ((LDUST).AND.(LCHTRANS)) THEN ! dust convective balance + IF (CPROGRAM == "MESONH") THEN + DO JSV=NSV_DSTBEG,NSV_DSTEND + ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) + ENDDO + ELSE + DO JSV=NSV_DSTBEG,NSV_DSTEND + ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) = XSVT(:,:,:,JSV) + ENDDO + ENDIF + CALL DUST2PPP(ZSVDST(IIB:IIE,IJB:IJE,IKB:IKE,:), & + XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), ZSIGDST(IIB:IIE,IJB:IJE,IKB:IKE,:),& + ZRGDST(IIB:IIE,IJB:IJE,IKB:IKE,:)) + DO JSV=NSV_DSTBEG,NSV_DSTEND + XRSVS(:,:,:,JSV) = ZSVDST(:,:,:,JSV-NSV_DSTBEG+1) * XRHODJ(:,:,:) / XTSTEP + ENDDO + ! + DEALLOCATE(ZSVDST) + DEALLOCATE(ZNDST) + DEALLOCATE(ZRGDST) + DEALLOCATE(ZSIGDST) + END IF + ! + IF ((LSALT).AND.(LCHTRANS)) THEN ! sea salt convective balance + IF (CPROGRAM == "MESONH") THEN + DO JSV=NSV_SLTBEG,NSV_SLTEND + ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XRSVS(:,:,:,JSV) * XTSTEP / XRHODJ(:,:,:) + ENDDO + ELSE + DO JSV=NSV_SLTBEG,NSV_SLTEND + ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) = XSVT(:,:,:,JSV) + ENDDO + END IF + CALL SALT2PPP(ZSVSLT(IIB:IIE,IJB:IJE,IKB:IKE,:), & + XRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), ZSIGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:),& + ZRGSLT(IIB:IIE,IJB:IJE,IKB:IKE,:)) + DO JSV=NSV_SLTBEG,NSV_SLTEND + XRSVS(:,:,:,JSV) = ZSVSLT(:,:,:,JSV-NSV_SLTBEG+1) * XRHODJ(:,:,:) / XTSTEP + ENDDO + ! + DEALLOCATE(ZSVSLT) + DEALLOCATE(ZNSLT) + DEALLOCATE(ZRGSLT) + DEALLOCATE(ZSIGSLT) + END IF + ! +END IF +! + IF( LUSERC .AND. LUSERI ) THEN + XRRS(:,:,:,2) = XRRS(:,:,:,2) + XRHODJ(:,:,:) * XDRCCONV(:,:,:) + XRRS(:,:,:,4) = XRRS(:,:,:,4) + XRHODJ(:,:,:) * XDRICONV(:,:,:) +! + ELSE IF ( LUSERC .AND. (.NOT. LUSERI) ) THEN +! +! If only cloud water but no cloud ice is used, the convective tendency +! for cloud ice is added to the tendency for cloud water +! + XRRS(:,:,:,2) = XRRS(:,:,:,2) + XRHODJ(:,:,:) * (XDRCCONV(:,:,:) + & + XDRICONV(:,:,:) ) +! and cloud ice is melted +! + XRTHS(:,:,:) = XRTHS(:,:,:) - XRHODJ(:,:,:) * & + ( XP00/XPABST(:,:,:) )**(XRD/XCPD) * XLMTT / XCPD * XDRICONV(:,:,:) +! + ELSE IF ( (.NOT. LUSERC) .AND. (.NOT. LUSERI) ) THEN +! +! If no cloud water and no cloud ice are used the convective tendencies for these +! variables are added to the water vapor tendency +! + XRRS(:,:,:,1) = XRRS(:,:,:,1) + XRHODJ(:,:,:) * (XDRCCONV(:,:,:) + & + XDRICONV(:,:,:) ) +! and all cloud condensate is evaporated +! + XRTHS(:,:,:) = XRTHS(:,:,:) - XRHODJ(:,:,:) / XCPD * ( & + XLVTT * XDRCCONV(:,:,:) + XLSTT * XDRICONV(:,:,:) ) *& + ( XP00 / XPABST(:,:,:) ) ** ( XRD / XCPD ) + END IF + + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'DCONV', xrths(:, :, :) ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'DCONV', xrrs (:, :, :, 1) ) + if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'DCONV', xrrs (:, :, :, 2) ) + if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'DCONV', xrrs (:, :, :, 4) ) + if ( lbudget_sv .and. lchtrans ) then + do jsv = 1, size( xrsvs, 4 ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv), 'DCONV', xrsvs (:, :, :, jsv) ) + end do + end if +END IF +! +CALL SECOND_MNH2(ZTIME2) +! +PKAFR = PKAFR + ZTIME2 - ZTIME1 & + - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS +! +PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS +! +!----------------------------------------------------------------------------- +! +!* 3. TURBULENT SURFACE FLUXES +! ------------------------ +! +ZTIME1 = ZTIME2 +! +IF (CSURF=='EXTE') THEN + CALL GOTO_SURFEX(IMI) +! + IF( LTRANS ) THEN + XUT(:,:,1+JPVEXT) = XUT(:,:,1+JPVEXT) + XUTRANS + XVT(:,:,1+JPVEXT) = XVT(:,:,1+JPVEXT) + XVTRANS + END IF + ! + ALLOCATE(ZDIR_ALB(IIU,IJU,NSWB_MNH)) + ALLOCATE(ZSCA_ALB(IIU,IJU,NSWB_MNH)) + ALLOCATE(ZEMIS (IIU,IJU,NLWB_MNH)) + ALLOCATE(ZTSRAD (IIU,IJU)) + ! + IKIDM=0 + DO JKID = IMI+1,NMODEL ! min value of the possible kids + IF (IMI == NDAD(JKID) .AND. XWAY(JKID) == 2. .AND. & + CPROGRAM=='MESONH' .AND. & + (CCONF == 'RESTA' .OR. (CCONF == 'START' .AND. KTCOUNT /= 1))) THEN + ! where kids exist, use the two-way output fields (i.e. OMASKkids true) + ! rather than the farther calculations in radiation and convection schemes +! BUG if number of the son does not follow the number of the dad +! IKIDM = JKID-IMI + IKIDM = IKIDM + 1 + IF (LUSERC .AND. ( & + (LSEDIC .AND. CCLOUD(1:3) == 'ICE') .OR. & + (LSEDC .AND. (CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO')) .OR. & + (MSEDC .AND. CCLOUD=='LIMA') & + )) THEN + WHERE (OMASKkids(:,:) ) + XINPRC(:,:) = ZSAVE_INPRC(:,:,IKIDM) + ENDWHERE + END IF + IF (LUSERR) THEN + WHERE (OMASKkids(:,:) ) + XINPRR(:,:) = ZSAVE_INPRR(:,:,IKIDM) + ENDWHERE + END IF + IF (LUSERS) THEN + WHERE (OMASKkids(:,:) ) + XINPRS(:,:) = ZSAVE_INPRS(:,:,IKIDM) + ENDWHERE + END IF + IF (LUSERG) THEN + WHERE (OMASKkids(:,:) ) + XINPRG(:,:) = ZSAVE_INPRG(:,:,IKIDM) + ENDWHERE + END IF + IF (LUSERH) THEN + WHERE (OMASKkids(:,:) ) + XINPRH(:,:) = ZSAVE_INPRH(:,:,IKIDM) + ENDWHERE + END IF + IF (CDCONV /= 'NONE') THEN + WHERE (OMASKkids(:,:) ) + XPRCONV(:,:) = ZSAVE_PRCONV(:,:,IKIDM) + XPRSCONV(:,:) = ZSAVE_PRSCONV(:,:,IKIDM) + ENDWHERE + END IF + IF (CRAD /= 'NONE') THEN + DO JSWB=1,NSWB_MNH + WHERE (OMASKkids(:,:) ) + XDIRFLASWD(:,:,JSWB) = ZSAVE_DIRFLASWD(:,:,JSWB,IKIDM) + XSCAFLASWD(:,:,JSWB) = ZSAVE_SCAFLASWD(:,:,JSWB,IKIDM) + XDIRSRFSWD(:,:,JSWB) = ZSAVE_DIRSRFSWD(:,:,JSWB,IKIDM) + ENDWHERE + ENDDO + END IF + ENDIF + END DO + ! + IF (IMODSON /= 0 ) THEN + DEALLOCATE( ZSAVE_INPRR,ZSAVE_INPRS,ZSAVE_INPRG,ZSAVE_INPRH) + DEALLOCATE( ZSAVE_INPRC,ZSAVE_PRCONV,ZSAVE_PRSCONV) + DEALLOCATE( ZSAVE_DIRFLASWD,ZSAVE_SCAFLASWD,ZSAVE_DIRSRFSWD) + END IF + CALL GROUND_PARAM_n(ZSFTH, ZSFRV, ZSFSV, ZSFCO2, ZSFU, ZSFV, & + ZDIR_ALB, ZSCA_ALB, ZEMIS, ZTSRAD ) + ! + IF (LIBM) THEN + WHERE(XIBM_LS(:,:,IKB,1).GT.-XIBM_EPSI) + ZSFTH(:,:)=0. + ZSFRV(:,:)=0. + ZSFU (:,:)=0. + ZSFV (:,:)=0. + ENDWHERE + IF (NSV>0) THEN + DO JSV = 1 , NSV + WHERE(XIBM_LS(:,:,IKB,1).GT.-XIBM_EPSI) ZSFSV(:,:,JSV)=0. + ENDDO + ENDIF + ENDIF + ! + IF (SIZE(XEMIS)>0) THEN + XDIR_ALB = ZDIR_ALB + XSCA_ALB = ZSCA_ALB + XEMIS = ZEMIS + XTSRAD = ZTSRAD + END IF + ! + DEALLOCATE(ZDIR_ALB) + DEALLOCATE(ZSCA_ALB) + DEALLOCATE(ZEMIS ) + DEALLOCATE(ZTSRAD ) + ! + ! + IF( LTRANS ) THEN + XUT(:,:,1+JPVEXT) = XUT(:,:,1+JPVEXT) - XUTRANS + XVT(:,:,1+JPVEXT) = XVT(:,:,1+JPVEXT) - XVTRANS + END IF +! +ELSE + ZSFTH = 0. + ZSFRV = 0. + ZSFSV = 0. + ZSFCO2 = 0. + ZSFU = 0. + ZSFV = 0. +END IF +! +CALL SECOND_MNH2(ZTIME2) +! +PGROUND = PGROUND + ZTIME2 - ZTIME1 +! +!----------------------------------------------------------------------------- +! +!* 3.1 EDDY FLUXES PARAMETRIZATION +! ------------------ +! +IF (IMI==1) THEN ! On calcule les flus turb. comme preconise par PP + + ! Heat eddy fluxes + IF ( LTH_FLX ) CALL EDDY_FLUX_n(IMI,KTCOUNT,XVT,XTHT,XRHODJ,XRTHS,XVTH_FLUX_M,XWTH_FLUX_M) + ! + ! Momentum eddy fluxes + IF ( LUV_FLX ) CALL EDDYUV_FLUX_n(IMI,KTCOUNT,XVT,XTHT,XRHODJ,XRHODREF,XPABSM,XRVS,XVU_FLUX_M) + +ELSE + ! TEST pour maille infèrieure à 20km ? + ! car pb d'instabilités ? + ! Pour le modèle fils, on spawne les flux du modèle père + ! Heat eddy fluxes + IF ( LTH_FLX ) CALL EDDY_FLUX_ONE_WAY_n (IMI,KTCOUNT,NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI),CLBCX,CLBCY) + ! + ! Momentum eddy fluxes + IF ( LUV_FLX ) CALL EDDYUV_FLUX_ONE_WAY_n (IMI,KTCOUNT,NDXRATIO_ALL(IMI),NDYRATIO_ALL(IMI),CLBCX,CLBCY) + ! +END IF +!----------------------------------------------------------------------------- +! +!* 4. PASSIVE POLLUTANTS +! ------------------ +! +ZTIME1 = ZTIME2 +! +IF (LPASPOL) CALL PASPOL(XTSTEP, ZSFSV, ILUOUT, NVERB, TPFILE) +! +! +!* 4b. PASSIVE POLLUTANTS FOR MASS-FLUX SCHEME DIAGNOSTICS +! --------------------------------------------------- +! +IF (LCONDSAMP) CALL CONDSAMP(XTSTEP, ZSFSV, ILUOUT, NVERB) +! +CALL SECOND_MNH2(ZTIME2) +! +PTRACER = PTRACER + ZTIME2 - ZTIME1 +!----------------------------------------------------------------------------- +! +!* 5a. Drag force +! ---------- +! +ZTIME1 = ZTIME2 +XTIME_BU_PROCESS = 0. +XTIME_LES_BU_PROCESS = 0. +! +IF (LDRAGTREE) CALL DRAG_VEG( XTSTEP, XUT, XVT, XTKET, LDEPOTREE, XVDEPOTREE, & + CCLOUD, XPABST, XTHT, XRT, XSVT, XRHODJ, XZZ, & + XRUS, XRVS, XRTKES, XRRS, XRSVS ) +! +IF (LDRAGBLDG) CALL DRAG_BLD( XTSTEP, XUT, XVT, XTKET, XRHODJ, XZZ, XRUS, XRVS, XRTKES ) +! +CALL SECOND_MNH2(ZTIME2) +! +PDRAG = PDRAG + ZTIME2 - ZTIME1 & + - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS +! +PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS +! +!* 5b. Drag force from wind turbines +! ----------------------- +! +ZTIME1 = ZTIME2 +XTIME_BU_PROCESS = 0. +XTIME_LES_BU_PROCESS = 0. +! +IF (LMAIN_EOL .AND. IMI == NMODEL_EOL) THEN + CALL EOL_MAIN(KTCOUNT,XTSTEP, & + XDXX,XDYY,XDZZ, & + XRHODJ, & + XUT,XVT,XWT, & + XRUS, XRVS, XRWS ) +END IF +! +CALL SECOND_MNH2(ZTIME2) +! +PEOL = PEOL + ZTIME2 - ZTIME1 & + - XTIME_LES_BU_PROCESS - XTIME_BU_PROCESS +! +PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS +! +!* +!----------------------------------------------------------------------------- +! +!* 6. TURBULENCE SCHEME +! ----------------- +! +ZTIME1 = ZTIME2 +XTIME_BU_PROCESS = 0. +XTIME_LES_BU_PROCESS = 0. +! +ZSFTH(:,:) = ZSFTH(:,:) * XDIRCOSZW(:,:) +ZSFRV(:,:) = ZSFRV(:,:) * XDIRCOSZW(:,:) +DO JSV=1,NSV + ZSFSV(:,:,JSV) = ZSFSV(:,:,JSV) * XDIRCOSZW(:,:) +END DO +! +IF (LLES_CALL) CALL SWITCH_SBG_LES_n +! +! +IF ( CTURB == 'TKEL' ) THEN +! + +!* 6.1 complete surface flux fields on the border +! +!!$ IF(NHALO == 1) THEN + CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFTH, 'PHYS_PARAM_n::ZSFTH' ) + CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFRV, 'PHYS_PARAM_n::ZSFRV' ) + CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFU, 'PHYS_PARAM_n::ZSFU' ) + CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFV, 'PHYS_PARAM_n::ZSFV' ) + IF(NSV >0)THEN + DO JSV=1,NSV + write ( ynum, '( I6 ) ' ) jsv + CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFSV(:,:,JSV), 'PHYS_PARAM_n::ZSFSV:'//trim( adjustl( ynum ) ) ) + END DO + END IF + CALL ADD2DFIELD_ll( TZFIELDS_ll, ZSFCO2, 'PHYS_PARAM_n::ZSFCO2' ) + CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) + CALL CLEANLIST_ll(TZFIELDS_ll) +!!$ END IF +! + CALL MPPDB_CHECK2D(ZSFU,"phys_param::ZSFU",PRECISION) + ! + IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN + ZSFTH(IIB-1,:)=ZSFTH(IIB,:) + ZSFRV(IIB-1,:)=ZSFRV(IIB,:) + ZSFU(IIB-1,:)=ZSFU(IIB,:) + ZSFV(IIB-1,:)=ZSFV(IIB,:) + IF (NSV>0) THEN + ZSFSV(IIB-1,:,:)=ZSFSV(IIB,:,:) + WHERE ((ZSFSV(IIB-1,:,:).LT.0.).AND.(XSVT(IIB-1,:,IKB,:).EQ.0.)) + ZSFSV(IIB-1,:,:) = 0. + END WHERE + ENDIF + ZSFCO2(IIB-1,:)=ZSFCO2(IIB,:) + END IF + ! + IF ( CLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN + ZSFTH(IIE+1,:)=ZSFTH(IIE,:) + ZSFRV(IIE+1,:)=ZSFRV(IIE,:) + ZSFU(IIE+1,:)=ZSFU(IIE,:) + ZSFV(IIE+1,:)=ZSFV(IIE,:) + IF (NSV>0) THEN + ZSFSV(IIE+1,:,:)=ZSFSV(IIE,:,:) + WHERE ((ZSFSV(IIE+1,:,:).LT.0.).AND.(XSVT(IIE+1,:,IKB,:).EQ.0.)) + ZSFSV(IIE+1,:,:) = 0. + END WHERE + ENDIF + ZSFCO2(IIE+1,:)=ZSFCO2(IIE,:) + END IF + ! + IF ( CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN + ZSFTH(:,IJB-1)=ZSFTH(:,IJB) + ZSFRV(:,IJB-1)=ZSFRV(:,IJB) + ZSFU(:,IJB-1)=ZSFU(:,IJB) + ZSFV(:,IJB-1)=ZSFV(:,IJB) + IF (NSV>0) THEN + ZSFSV(:,IJB-1,:)=ZSFSV(:,IJB,:) + WHERE ((ZSFSV(:,IJB-1,:).LT.0.).AND.(XSVT(:,IJB-1,IKB,:).EQ.0.)) + ZSFSV(:,IJB-1,:) = 0. + END WHERE + ENDIF + ZSFCO2(:,IJB-1)=ZSFCO2(:,IJB) + END IF + ! + IF ( CLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN + ZSFTH(:,IJE+1)=ZSFTH(:,IJE) + ZSFRV(:,IJE+1)=ZSFRV(:,IJE) + ZSFU(:,IJE+1)=ZSFU(:,IJE) + ZSFV(:,IJE+1)=ZSFV(:,IJE) + IF (NSV>0) THEN + ZSFSV(:,IJE+1,:)=ZSFSV(:,IJE,:) + WHERE ((ZSFSV(:,IJE+1,:).LT.0.).AND.(XSVT(:,IJE+1,IKB,:).EQ.0.)) + ZSFSV(:,IJE+1,:) = 0. + END WHERE + ENDIF + ZSFCO2(:,IJE+1)=ZSFCO2(:,IJE) + END IF +! + IF( LTRANS ) THEN + XUT(:,:,:) = XUT(:,:,:) + XUTRANS + XVT(:,:,:) = XVT(:,:,:) + XVTRANS + END IF +! +! +IF(ALLOCATED(XTHW_FLUX)) THEN + DEALLOCATE(XTHW_FLUX) + ALLOCATE(XTHW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))) +ELSE + ALLOCATE(XTHW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))) +END IF + +IF(ALLOCATED(XRCW_FLUX)) THEN + DEALLOCATE(XRCW_FLUX) + ALLOCATE(XRCW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))) +ELSE + ALLOCATE(XRCW_FLUX(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))) +END IF +! +IF(ALLOCATED(XSVW_FLUX)) THEN + DEALLOCATE(XSVW_FLUX) + ALLOCATE(XSVW_FLUX(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),SIZE(XSVT,4))) +ELSE + ALLOCATE(XSVW_FLUX(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),SIZE(XSVT,4))) +END IF +! + CALL TURB( 1, IKU, 1, IMI, NRR, NRRL, NRRI, CLBCX, CLBCY, 1, NMODEL_CLOUD, & + LTURB_FLX, LTURB_DIAG, LSUBG_COND, LRMC01, LOCEAN, & + CTURBDIM, CTURBLEN, CTOM, CTURBLEN_CLOUD, CCLOUD,XIMPL, & + XTSTEP, TPFILE, & + XDXX, XDYY, XDZZ, XDZX, XDZY, XZZ, & + XDIRCOSXW, XDIRCOSYW, XDIRCOSZW, XCOSSLOPE, XSINSLOPE, & + XRHODJ, XTHVREF, & + ZSFTH, ZSFRV, ZSFSV, ZSFU, ZSFV, & + XPABST, XUT, XVT, XWT, XTKET, XSVT, XSRCT, & + ZLENGTHM, ZLENGTHH, ZMFMOIST, & + XBL_DEPTH, XSBL_DEPTH, & + XCEI, XCEI_MIN, XCEI_MAX, XCOEF_AMPL_SAT, & + XTHT, XRT, & + XRUS, XRVS, XRWS, XRTHS, XRRS, XRSVS, XRTKES, XSIGS, XWTHVMF, & + XTHW_FLUX, XRCW_FLUX, XSVW_FLUX,XDYP, XTHP, XTR, XDISS, & + TBUDGETS, KBUDGETS=SIZE(TBUDGETS),PLEM=XLEM,PRTKEMS=XRTKEMS ) +! +IF (LRMC01) THEN + CALL ADD2DFIELD_ll( TZFIELDS_ll, XSBL_DEPTH, 'PHYS_PARAM_n::XSBL_DEPTH' ) + CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) + CALL CLEANLIST_ll(TZFIELDS_ll) + IF ( CLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN + XSBL_DEPTH(IIB-1,:)=XSBL_DEPTH(IIB,:) + END IF + IF ( CLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN + XSBL_DEPTH(IIE+1,:)=XSBL_DEPTH(IIE,:) + END IF + IF ( CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN + XSBL_DEPTH(:,IJB-1)=XSBL_DEPTH(:,IJB) + END IF + IF ( CLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN + XSBL_DEPTH(:,IJE+1)=XSBL_DEPTH(:,IJE) + END IF +END IF +! +CALL SECOND_MNH2(ZTIME3) +! +!----------------------------------------------------------------------------- +! +!* 7. EDMF SCHEME +! ----------- +! +IF (CSCONV == 'EDKF') THEN + ALLOCATE(ZEXN (IIU,IJU,IKU)) + ALLOCATE(ZSIGMF (IIU,IJU,IKU)) + ZSIGMF(:,:,:)=0. + ZEXN(:,:,:)=(XPABST(:,:,:)/XP00)**(XRD/XCPD) + !$20131113 check3d on ZEXN + CALL MPPDB_CHECK3D(ZEXN,"physparan.7::ZEXN",PRECISION) + CALL ADD3DFIELD_ll( TZFIELDS_ll, ZEXN, 'PHYS_PARAM_n::ZEXN' ) + !$20131113 add update_halo_ll + CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) + CALL CLEANLIST_ll(TZFIELDS_ll) + CALL MPPDB_CHECK3D(ZEXN,"physparam.7::ZEXN",PRECISION) + ! + CALL SHALLOW_MF_PACK(NRR,NRRL,NRRI, CMF_UPDRAFT, CMF_CLOUD, LMIXUV, & + LMF_FLX,TPFILE,ZTIME_LES_MF, & + XIMPL_MF, XTSTEP, & + XDZZ, XZZ,XDXHAT(1),XDYHAT(1), & + XRHODJ, XRHODREF, XPABST, ZEXN, ZSFTH, ZSFRV, & + XTHT,XRT,XUT,XVT,XWT,XTKET,XSVT, & + XRTHS,XRRS,XRUS,XRVS,XRSVS, & + ZSIGMF,XRC_MF, XRI_MF, XCF_MF, XWTHVMF) +! +ELSE + XWTHVMF(:,:,:)=0. + XRC_MF(:,:,:)=0. + XRI_MF(:,:,:)=0. + XCF_MF(:,:,:)=0. +ENDIF +! +CALL SECOND_MNH2(ZTIME4) + + IF( LTRANS ) THEN + XUT(:,:,:) = XUT(:,:,:) - XUTRANS + XVT(:,:,:) = XVT(:,:,:) - XVTRANS + END IF + + IF (CMF_CLOUD == 'STAT') THEN + XSIGS =SQRT( XSIGS**2 + ZSIGMF**2 ) + ENDIF + IF (CSCONV == 'EDKF') THEN + DEALLOCATE(ZSIGMF) + DEALLOCATE(ZEXN) + ENDIF +END IF +! +IF (LLES_CALL) CALL SWITCH_SBG_LES_n +! +CALL SECOND_MNH2(ZTIME2) +! +PTURB = PTURB + ZTIME2 - ZTIME1 - (XTIME_LES-ZTIME_LES_MF) - XTIME_LES_BU_PROCESS & + - XTIME_BU_PROCESS - (ZTIME4 - ZTIME3) +! +PMAFL = PMAFL + ZTIME4 - ZTIME3 - ZTIME_LES_MF +! +PTIME_BU = PTIME_BU + XTIME_LES_BU_PROCESS + XTIME_BU_PROCESS +! +! +!* deallocate sf flux array for ocean model (in grid nesting, dimensions can vary) +! +IF (LOCEAN .AND. (.NOT. LCOUPLES)) THEN + DEALLOCATE(XSSUFL) + DEALLOCATE(XSSVFL) + DEALLOCATE(XSSTFL) + DEALLOCATE(XSSOLA) +END IF +!------------------------------------------------------------------------------- +! +!* deallocation of variables used in more than one parameterization +! +DEALLOCATE(ZSFU ) ! surface schemes + turbulence +DEALLOCATE(ZSFV ) +DEALLOCATE(ZSFTH ) +DEALLOCATE(ZSFRV ) +DEALLOCATE(ZSFSV ) +DEALLOCATE(ZSFCO2) +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE PHYS_PARAM_n + diff --git a/src/mesonh/ext/prep_ideal_case.f90 b/src/mesonh/ext/prep_ideal_case.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a1c1ec6c6a4d7ab52ea4549f93ffc4a35a2deb5b --- /dev/null +++ b/src/mesonh/ext/prep_ideal_case.f90 @@ -0,0 +1,1933 @@ +!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. +!----------------------------------------------------------------- +! ####################### + PROGRAM PREP_IDEAL_CASE +! ####################### +! +!!**** *PREP_IDEAL_CASE* - program to write an initial FM-file +!! +!! PURPOSE +!! ------- +! The purpose of this program is to prepare an initial meso-NH file +! (LFIFM and DESFM files) filled with some idealized fields. +! +! ---- The present version can provide two types of fields: +! +! 1) CIDEAL = 'CSTN' : 3D fields derived from a vertical profile with +! --------------- n levels of constant moist Brunt Vaisala frequency +! The vertical profile is read in EXPRE file. +! These fields can be used for model runs +! +! 2) CIDEAL = 'RSOU' : 3D fields derived from a radiosounding. +! --------------- +! The radiosounding is read in EXPRE file. +! The following kind of data is permitted : +! YKIND = 'STANDARD' : Zsol, Psol, Tsol, TDsol +! (Pressure, dd, ff) , +! (Pressure, T, Td) +! YKIND = 'PUVTHVMR' : zsol, Psol, Thvsol, Rsol +! (Pressure, U, V) , +! (Pressure, THv, R) +! YKIND = 'PUVTHVHU' : zsol, Psol, Thvsol, Husol +! (Pressure, U, V) , +! (Pressure, THv, Hu) +! YKIND = 'ZUVTHVHU' : zsol, Psol, Thvsol, Husol +! (height, U, V) , +! (height, THv, Hu) +! YKIND = 'ZUVTHVMR' : zsol, Psol, Thvsol, Rsol +! (height, U, V) , +! (height, THv, R) +! YKIND = 'PUVTHDMR' : zsol, Psol, Thdsol, Rsol +! (Pressure, U, V) , +! (Pressure, THd, R) +! YKIND = 'PUVTHDHU' : zsol, Psol, Thdsol, Husol +! (Pressure, U, V) , +! (Pressure, THd, Hu) +! YKIND = 'ZUVTHDMR' : zsol, Psol, Thdsol, Rsol +! (height, U, V) , +! (height, THd, R) +! YKIND = 'ZUVTHLMR' : zsol, Psol, Thdsol, Rsol +! (height, U, V) , +! (height, THl, Rt) +! +! These fields can be used for model runs +! +! Cases (1) and (2) can be balanced +! (geostrophic, hydrostatic and anelastic balances) if desired. +! +! ---- The orography can be flat (YZS='FLAT'), but also +! sine-shaped (YZS='SINE') or bell-shaped (YZS='BELL') +! +! ---- The U(z) profile given in the RSOU and CSTN cases can +! be multiplied (CUFUN="Y*Z") by a function of y (function FUNUY) +! The V(z) profile given in the RSOU and CSTN cases can +! be multiplied (CVFUN="X*Z") by a function of x (function FUNVX). +! If it is not the case, i.e. U(y,z)=U(z) then CUFUN="ZZZ" and +! CVFUN="ZZZ" for V(y,z)=V(z). Instead of these separable forms, +! non-separables functions FUNUYZ (CUFUN="Y,Z") and FUNVXZ (CVFUN="X,Z") +! can be used to specify the wind components. +! +!!** METHOD +!! ------ +!! The directives and data to perform the preparation of the initial FM +!! file are stored in EXPRE file. This file is composed of two parts : +!! - a namelists-format part which is present in all cases +!! - a free-format part which contains data in cases +!! of discretised orography (CZS='DATA') +!! of radiosounding (CIDEAL='RSOU') or Nv=cste profile (CIDEAL='CSTN') +!! of forced version (LFORCING=.TRUE.) +!! +!! +!! The following PREP_IDEAL_CASE program : +!! +!! - initializes physical constants by calling INI_CST +!! +!! - sets default values for global variables which will be +!! written in DESFM file and for variables in EXPRE file (namelists part) +!! which will be written in LFIFM file. +!! +!! - reads the namelists part of EXPRE file which gives +!! informations about the preinitialization to perform, +!! +!! - allocates memory for arrays, +!! +!! - initializes fields depending on the +!! directives (CIDEAL in namelist NAM_CONF_PRE) : +!! +!! * grid variables : +!! The gridpoints are regularly spaced by XDELTAX, XDELTAY. +!! The grid is stretched along the z direction, the mesh varies +!! from XDZGRD near the ground to XDZTOP near the top and the +!! weigthing function is a TANH function characterized by its +!! center and width above and under this center +!! The orography is initialized following the kind of orography +!! (YZS in namelist NAM_CONF_PRE) and the degrees of freedom : +!! sine-shape ---> ZHMAX, IEXPX,IEXPY +!! bell-shape ---> ZHMAX, ZAX,ZAY,IIZS,IJZS +!! The horizontal grid variables are initialized following +!! the kind of geometry (LCARTESIAN in namelist NAM_CONF_PRE) +!! and the grid parameters XLAT0,XLON0,XBETA in both geometries +!! and XRPK,XLONORI,XLATORI in conformal projection. +!! In the case of initialization from a radiosounding, the +!! date and time is read in free-part of the EXPRE file. In other +!! cases year, month and day are set to NUNDEF and time to 0. +!! +!! * prognostic fields : +!! +!! U,V,W, Theta and r. are first determined. They are +!! multiplied by rhoj after the anelastic reference state +!! computation. +!! For the CSTN and RSOU cases, the determination of +!! Theta and rv is performed respectively by SET_RSOU +!! and by SET_CSTN which call the common routine SET_MASS. +!! These three routines have the following actions : +!! --- The input vertical profile is converted in +!! variables (U,V,thetav,r) and interpolated +!! on a mixed grid (with VERT_COORD) as in PREP_REAL_CASE +!! --- A variation of the u-wind component( x-model axis component) +!! is possible in y direction, a variation of the v-wind component +!! (y-model axis component) is possible in x direction. +!! --- Thetav could be computed with thermal wind balance +!! (LGEOSBAL=.TRUE. with call of SET_GEOSBAL) +!! --- The mass fields (theta and r ) and the wind components are +!! then interpolated on the model grid with orography as in +!! PREP_REAL_CASE with the option LSHIFT +!! --- An anelastic correction is applied in PRESSURE_IN_PREP in +!! the case of non-vanishing orography. +!! +!! * anelastic reference state variables : +!! +!! 1D reference state : +!! RSOU and CSTN cases : rhorefz and thvrefz are computed +!! by SET_REFZ (called by SET_MASS). +!! They are deduced from thetav and r on the model grid +!! without orography. +!! The 3D reference state is computed by SET_REF +!! +!! * The total mass of dry air is computed by TOTAL_DMASS +!! +!! - writes the DESFM file, +!! +!! - writes the LFIFM file . +!! +!! EXTERNAL +!! -------- +!! DEFAULT_DESFM : to set default values for variables which can be +!! contained in DESFM file +!! DEFAULT_EXPRE : to set default values for other global variables +!! which can be contained in namelist-part of EXPRE file +!! Module MODE_GRIDPROJ : contains conformal projection routines +!! SM_GRIDPROJ : to compute some grid variables, in +!! case of conformal projection. +!! Module MODE_GRIDCART : contains cartesian geometry routines +!! SM_GRIDCART : to compute some grid variables, in +!! case of cartesian geometry. +!! SET_RSOU : to initialize mass fields from a radiosounding +!! SET_CSTN : to initialize mass fields from a vertical profile of +!! n layers of Nv=cste +!! SET_REF : to compute rhoJ +!! RESSURE_IN_PREP : to apply an anelastic correction in the case of +!! non-vanishing orography +!! IO_File_open : to open a FM-file (DESFM + LFIFM) +!! WRITE_DESFM : to write the DESFM file +!! WRI_LFIFM : to write the LFIFM file +!! IO_File_close : to close a FM-file (DESFM + LFIFM) +!! +!! MXM,MYM,MZM : Shuman operators +!! WGUESS : to compute W with the continuity equation from +!! the U,V values +!! +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS : contains parameters +!! Module MODD_DIM1 : contains dimensions +!! Module MODD_CONF : contains configuration variables for +!! all models +!! Module MODD_CST : contains physical constants +!! Module MODD_GRID : contains grid variables for all models +!! Module MODD_GRID1 : contains grid variables +!! Module MODD_TIME : contains time variables for all models +!! Module MODD_TIME1 : contains time variables +!! Module MODD_REF : contains reference state variables for +!! all models +!! Module MODD_REF1 : contains reference state variables +!! Module MODD_LUNIT : contains variables which concern names +!! and logical unit numbers of files for all models +!! Module MODD_FIELD1 : contains prognostics variables +!! Module MODD_GR_FIELD1 : contains the surface prognostic variables +!! Module MODD_LSFIELD1 : contains Larger Scale fields +!! Module MODD_DYN1 : contains dynamic control variables for model 1 +!! Module MODD_LBC1 : contains lbc control variables for model 1 +!! +!! +!! Module MODN_CONF1 : contains configuration variables for model 1 +!! and the NAMELIST list +!! Module MODN_LUNIT1 : contains variables which concern names +!! and logical unit numbers of files and +!! the NAMELIST list +!! +!! +!! REFERENCE +!! --------- +!! Book2 of MESO-NH documentation (program PREP_IDEAL_CASE) +!! +!! AUTHOR +!! ------ +!! V. Ducrocq *Meteo France* +!! +!! MODIFICATIONS +!! ------------- +!! Original 05/05/94 +!! updated V. Ducrocq 27/06/94 +!! updated P.M. 27/07/94 +!! updated V. Ducrocq 23/08/94 +!! updated V. Ducrocq 01/09/94 +!! namelist changes J. Stein 26/10/94 +!! namelist changes J. Stein 04/11/94 +!! remove the second step of the geostrophic balance 14/11/94 (J.Stein) +!! add grid stretching in the z direction + Larger scale fields + +!! cleaning 6/12/94 (J.Stein) +!! periodize the orography and the grid sizes in the periodic case +!! 19/12/94 (J.Stein) +!! correct a bug in the Larger Scale Fields initialization +!! 19/12/94 (J.Stein) +!! add the vertical grid stretching 02/01/95 (J. Stein) +!! Total mass of dry air computation 02/01/95 (J.P.Lafore) +!! add the 1D switch 13/01/95 (J. Stein) +!! enforce a regular vertical grid if desired 18/01/95 (J. Stein) +!! add the tdtcur initialization 26/01/95 (J. Stein) +!! bug in the test of the type of RS localization 25/02/95 (J. Stein) +!! remove R from the historical variables 16/03/95 (J. Stein) +!! error on the grid stretching 30/06/95 (J. Stein) +!! add the soil fields 01/09/95 (S.Belair) +!! change the streching function and the wind guess +!! (J. Stein and V.Masson) 21/09/95 +!! reset to FALSE LUSERC,..,LUSERH 12/12/95 (J. Stein) +!! enforce the RS localization in 1D and 2D config. +!! + add the 'TSZ0' option for the soil variables 28/01/96 (J. Stein) +!! initialization of domain from center point 31/01/96 (V. Masson) +!! add the constant file reading 05/02/96 (J. Stein) +!! enter vertical model levels values 20/10/95 (T.Montmerle) +!! add LFORCING option 19/02/96 (K. Suhre) +!! modify structure of NAM_CONF_PRE 20/02/96 (J.-P. Pinty) +!! default of the domain center when use of pgd file 12/03/96 (V. Masson) +!! change the surface initialization 20/03/96 ( Stein, +!! Bougeault, Kastendeutsch ) +!! change the DEFAULT_DESFMN CALL 17/04/96 ( Lafore ) +!! set the STORAGE_TYPE to 'TT' (a single instant) 30/04/96 (Stein, +!! Jabouille) +!! new wguess to spread the divergence 15/05/96 (Stein) +!! set LTHINSHELL to TRUE + return to the old wguess 29/08/96 (Stein) +!! MY_NAME and DAD_NAME writing for nesting 30/07/96 (Lafore) +!! MY_NAME and DAD_NAME reading in pgd file 26/09/96 (Masson) +!! and reading of pgd grid in a new routine +!! XXHAT and XYHAT are set to 0. at origine point 02/10/96 (Masson) +!! add LTHINSHELL in namelist NAM_CONF_PRE 08/10/96 (Masson) +!! restores use of TS and T2 26/11/96 (Masson) +!! value XUNDEF for soil and vegetation fields on sea 27/11/96 (Masson) +!! use of HUG and HU2 in both ISBA and TSZ0 cases 04/12/96 (Masson) +!! add initialization of chemical variables 06/08/96 (K. Suhre) +!! add MANUAL option for the terrain elevation 12/12/96 (J.-P. Pinty) +!! set DATA instead of MANUAL for the terrain +!! elevation option +!! add new anelastic equations' systems 29/06/97 (Stein) +!! split mode_lfifm_pgd 29/07/97 (Masson) +!! add directional z0 and subgrid scale orography 31/07/97 (Masson) +!! separates surface treatment in PREP_IDEAL_SURF 15/03/99 (Masson) +!! new PGD fields allocations 15/03/99 (Masson) +!! iterative call to pressure solver 15/03/99 (Masson) +!! removes TSZ0 case 04/01/00 (Masson) +!! parallelization 18/06/00 (Pinty) +!! adaptation for patch approach 02/07/00 (Solmon/Masson) +!! bug in W LB field on Y direction 05/03/01 (Stein) +!! add module MODD_NSV for NSV variable 01/02/01 (D. Gazen) +!! allow namelists in different orders 15/10/01 (I. Mallet) +!! allow LUSERC and LUSERI in 1D configuration 05/06/02 (P. Jabouille) +!! add ZUVTHLMR case (move in set_rsou latter) 05/12/02 Jabouille/Masson +!! move LHORELAX_SV (after INI_NSV) 30/04/04 (Pinty) +!! Correction Parallel bug IBEG & IDEND evalution 13/11/08 J.Escobar +!! add the option LSHIFT for interpolation of 26/10/10 (G.Tanguy) +!! correction for XHAT & parallelizarion of ZSDATA 23/09/11 J.Escobar +!! the vertical profile (as in PREP_REAL_CASE) +!! add use MODI of SURFEX routines 10/10/111 J.Escobar +!! +!! For 2D modeling: +!! Initialization of ADVFRC profiles (SET_ADVFRC) 06/2010 (P.Peyrille) +!! when LDUMMY(2)=T in PRE_IDEA1.nam +!! USE MODDB_ADVFRC_n for grid-nesting 02*2012 (M. Tomasini) +!! LBOUSS in MODD_REF 07/2013 (C.Lac) +!! Correction for ZS in PGD file 04/2014 (G. TANGUY) +!! Bug : remove NC WRITE_HGRID 05/2014 (S. Bielli via J.Escobar ) +!! BUG if ZFRC and ZFRC_ADV or ZFRC_REL are used together 11/2014 (G. Delautier) +!! Bug : detected with cray compiler , +!! missing '&' in continuation string 3/12/2014 J.Escobar +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! 06/2016 (G.Delautier) phasage surfex 8 +!! P.Wautelet : 08/07/2016 : removed MNH_NCWRIT define +!! 01/2018 (G.Delautier) SURFEX 8.1 +! P. Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 07/02/2019: force TYPE to a known value for IO_File_add2list +! P. Wautelet 14/02/2019: remove CLUOUT/CLUOUT0 and associated variables +! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables +! P. Wautelet 28/03/2019: use TFILE instead of unit number for set_iluout_timing +! P. Wautelet 19/04/2019: removed unused dummy arguments and variables +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +! F. Auguste 02/2021: add IBM +! P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv +! Jean-Luc Redelsperger 03/2021: ocean LES case +! P. Wautelet 06/07/2021: use FINALIZE_MNH +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_PARAMETERS ! Declarative modules +USE MODD_ARGSLIST_ll, ONLY : LIST_ll +USE MODD_DIM_n +USE MODD_CONF +USE MODD_CST +USE MODD_GRID +USE MODD_GRID_n +USE MODD_IBM_LSF, ONLY: CIBM_TYPE, LIBM_LSF, NIBM_SMOOTH, XIBM_SMOOTH +USE MODD_IBM_PARAM_n, ONLY: XIBM_LS +USE MODD_METRICS_n +USE MODD_PGDDIM +USE MODD_PGDGRID +USE MODD_TIME +USE MODD_TIME_n +USE MODD_REF +USE MODD_REF_n +USE MODD_LUNIT +USE MODD_FIELD_n +USE MODD_DYN_n +USE MODD_LBC_n +USE MODD_LSFIELD_n +USE MODD_PARAM_n +USE MODD_CH_MNHC_n, ONLY: LUSECHEM, LUSECHAQ, LUSECHIC, LCH_PH, LCH_INIT_FIELD +USE MODD_CH_AEROSOL,ONLY: LORILAM, CORGANIC, LVARSIGI, LVARSIGJ, LINITPM, XINIRADIUSI, & + XINIRADIUSJ, XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT +USE MODD_DUST, ONLY: LDUST, NMODE_DST, CRGUNITD, XINISIG, XINIRADIUS, XN0MIN +USE MODD_SALT, ONLY: LSALT, NMODE_SLT, CRGUNITS, XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT +USE MODD_VAR_ll, ONLY: NPROC +USE MODD_LUNIT, ONLY: TLUOUT0, TOUTDATAFILE +USE MODD_LUNIT_n +USE MODD_IO, ONLY: TFILE_DUMMY, TFILE_OUTPUTLISTING +USE MODD_CONF_n +USE MODD_NSV, ONLY: NSV +use modd_precision, only: LFIINT, MNHREAL_MPI, MNHTIME +! +USE MODN_BLANK_n +! +USE MODE_FINALIZE_MNH, only: FINALIZE_MNH +USE MODE_THERMO +USE MODE_POS +USE MODE_GRIDCART ! Executive modules +USE MODE_GRIDPROJ +USE MODE_GATHER_ll +USE MODE_IO, only: IO_Config_set, IO_Init, IO_Pack_set +USE MODE_IO_FIELD_READ, only: IO_Field_read +USE MODE_IO_FIELD_WRITE, only: IO_Field_write, IO_Header_write +USE MODE_IO_FILE, only: IO_File_close, IO_File_open +USE MODE_IO_MANAGE_STRUCT, only: IO_File_add2list +USE MODE_ll +USE MODE_MODELN_HANDLER +use mode_field, only: Alloc_field_scalars, Ini_field_list, Ini_field_scalars +USE MODE_MSG +! +USE MODI_DEFAULT_DESFM_n ! Interface modules +USE MODI_DEFAULT_EXPRE +USE MODI_IBM_INIT_LS +USE MODI_READ_HGRID +USE MODI_SHUMAN +USE MODI_SET_RSOU +USE MODI_SET_CSTN +USE MODI_SET_FRC +USE MODI_PRESSURE_IN_PREP +USE MODI_WRITE_DESFM_n +USE MODI_WRITE_LFIFM_n +USE MODI_METRICS +USE MODI_UPDATE_METRICS +USE MODI_SET_REF +USE MODI_SET_PERTURB +USE MODI_TOTAL_DMASS +USE MODI_CH_INIT_FIELD_n +USE MODI_INI_NSV +USE MODI_READ_PRE_IDEA_NAM_n +USE MODI_ZSMT_PIC +USE MODI_ZSMT_PGD +USE MODI_READ_VER_GRID +USE MODI_READ_ALL_NAMELISTS +USE MODI_PGD_GRID_SURF_ATM +USE MODI_SPLIT_GRID +USE MODI_PGD_SURF_ATM +USE MODI_ICE_ADJUST_BIS +USE MODI_WRITE_PGD_SURF_ATM_n +USE MODI_PREP_SURF_MNH +! +!JUAN +USE MODE_SPLITTINGZ_ll +USE MODD_SUB_MODEL_n +USE MODE_MNH_TIMING +USE MODN_CONFZ +!JUAN +USE MODE_TH_R_FROM_THL_RT_3D +! +USE MODI_VERSION +USE MODI_INIT_PGD_SURF_ATM +USE MODI_WRITE_SURF_ATM_N +USE MODD_MNH_SURFEX_n +! Modif ADVFRC +USE MODD_2D_FRC +USE MODD_ADVFRC_n ! Modif for grid-nesting +USE MODI_SETADVFRC +USE MODD_RELFRC_n ! Modif for grid-nesting +USE MODI_SET_RELFRC +! +USE MODI_INI_CST +USE MODI_INI_NEB +USE MODI_WRITE_HGRID +USE MODD_MPIF +USE MODD_VAR_ll +USE MODD_IO, ONLY: TFILEDATA,TFILE_SURFEX +! +USE MODE_MPPDB +! +USE MODD_GET_n +! +USE MODN_CONFIO, ONLY : NAM_CONFIO +! +IMPLICIT NONE +! +!* 0.1 Declarations of global variables not declared in the modules +! +REAL, DIMENSION(:,:,:), ALLOCATABLE :: XJ ! Jacobian +REAL :: XLATCEN=XUNDEF, XLONCEN=XUNDEF ! latitude and longitude of the center of + ! the domain for initialization. This + ! point is vertical vorticity point + ! ------------------------ +REAL :: XDELTAX=0.5E4, XDELTAY=0.5E4 ! horizontal mesh lengths + ! used to determine XXHAT,XYHAT +! +INTEGER :: NLUPRE,NLUOUT ! Logical unit numbers for EXPRE file + ! and for output_listing file +INTEGER :: NRESP ! return code in FM routines +INTEGER :: NTYPE ! type of file (cpio or not) +INTEGER(KIND=LFIINT) :: NNPRAR ! number of articles predicted in the LFIFM file +LOGICAL :: GFOUND ! Return code when searching namelist +! +INTEGER :: JLOOP,JILOOP,JJLOOP ! Loop indexes +! +INTEGER :: NIB,NJB,NKB ! Begining useful area in x,y,z directions +INTEGER :: NIE,NJE ! Ending useful area in x,y directions +INTEGER :: NIU,NJU,NKU ! Upper bounds in x,y,z directions +CHARACTER(LEN=4) :: CIDEAL ='CSTN' ! kind of idealized fields + ! 'CSTN' : Nv=cste case + ! 'RSOU' : radiosounding case +CHARACTER(LEN=4) :: CZS ='FLAT' ! orography selector + ! 'FLAT' : zero orography + ! 'SINE' : sine-shaped orography + ! 'BELL' : bell-shaped orography +REAL :: XHMAX=XUNDEF ! Maximum height for orography +REAL :: NEXPX=3,NEXPY=1 ! Exponents for orography in case of CZS='SINE' +REAL :: XAX= 1.E4, XAY=1.E4 ! Widths for orography in case CZS='BELL' + ! along x and y +INTEGER :: NIZS = 5, NJZS = 5 ! Localization of the center in + ! case CZS ='BELL' +! +!* 0.1.1 Declarations of local variables for N=cste and +! radiosounding cases : +! +INTEGER :: NYEAR,NMONTH,NDAY ! year, month and day in EXPRE file +REAL :: XTIME ! time in EXPRE file +LOGICAL :: LPERTURB =.FALSE. ! Logical to add a perturbation to + ! a basic state +LOGICAL :: LGEOSBAL =.FALSE. ! Logical to satisfy the geostrophic + ! balance + ! .TRUE. for geostrophic balance + ! .FALSE. to ignore this balance +LOGICAL :: LSHIFT =.FALSE. ! flag to perform vertical shift or not. +CHARACTER(LEN=3) :: CFUNU ='ZZZ' ! CHARACTER STRING for variation of + ! U in y direction + ! 'ZZZ' : U = U(Z) + ! 'Y*Z' : U = F(Y) * U(Z) + ! 'Y,Z' : U = G(Y,Z) +CHARACTER(LEN=3) :: CFUNV ='ZZZ' ! CHARACTER STRING for variation of + ! V in x direction + ! 'ZZZ' : V = V(Z) + ! 'Y*Z' : V = F(X) * V(Z) + ! 'Y,Z' : V = G(X,Z) +CHARACTER(LEN=6) :: CTYPELOC='IJGRID' ! Type of informations used to give the + ! localization of vertical profile + ! 'IJGRID' for (i,j) point on index space + ! 'XYHATM' for (x,y) coordinates on + ! conformal or cartesian plane + ! 'LATLON' for (latitude,longitude) on + ! spherical earth +REAL :: XLATLOC= 45., XLONLOC=0. + ! Latitude and longitude of the vertical + ! profile localization (used in case + ! CTYPELOC='LATLON') +REAL :: XXHATLOC=2.E4, XYHATLOC=2.E4 + ! (x,y) of the vertical profile + ! localization (used in cases + ! CTYPELOC='LATLON' and 'XYHATM') +INTEGER, DIMENSION(1) :: NILOC=4, NJLOC=4 + ! (i,j) of the vertical profile + ! localization +! +! +REAL,DIMENSION(:,:,:),ALLOCATABLE :: XCORIOZ ! Coriolis parameter (this + ! is exceptionnaly a 3D array + ! for computing needs) +! +! +!* 0.1.2 Declarations of local variables used when a PhysioGraphic Data +! file is used : +! +INTEGER :: JSV ! loop index on scalar var. +CHARACTER(LEN=28) :: CPGD_FILE=' ' ! Physio-Graphic Data file name +LOGICAL :: LREAD_ZS = .TRUE., & ! switch to use orography + ! coming from the PGD file + LREAD_GROUND_PARAM = .TRUE. ! switch to use soil parameters + ! useful for the soil scheme + ! coming from the PGD file + +INTEGER :: NSLEVE =12 ! number of iteration for smooth orography +REAL :: XSMOOTH_ZS = XUNDEF ! optional uniform smooth orography for SLEVE coordinate +CHARACTER(LEN=28) :: YPGD_NAME, YPGD_DAD_NAME ! general information +CHARACTER(LEN=2) :: YPGD_TYPE +! +INTEGER :: IINFO_ll ! return code of // routines +TYPE(LIST_ll), POINTER :: TZ_FIELDS_ll ! list of metric coefficient fields +! +INTEGER :: IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU ! dimensions of the +INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2 ! West-east LB arrays +INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV ! dimensions of the +INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2 ! North-south LB arrays +INTEGER :: IBEG,IEND,IXOR,IXDIM,IYOR,IYDIM,ILBX,ILBY +REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll, ZYHAT_ll +! +REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZTHL,ZT,ZRT,ZFRAC_ICE,& + ZEXN,ZLVOCPEXN,ZLSOCPEXN,ZCPH, & + ZRSATW, ZRSATI + ! variables for adjustement +REAL :: ZDIST +! +!JUAN TIMING +REAL(kind=MNHTIME), DIMENSION(2) :: ZTIME1, ZTIME2, ZEND, ZTOT +CHARACTER :: YMI +INTEGER :: IMI +!JUAN TIMING +! +REAL, DIMENSION(:), ALLOCATABLE :: ZZS_ll +INTEGER :: IJ +! +REAL :: ZZS_MAX, ZZS_MAX_ll +INTEGER :: IJPHEXT +! +TYPE(TFILEDATA),POINTER :: TZEXPREFILE => NULL() +! +! +!* 0.2 Namelist declarations +! +NAMELIST/NAM_CONF_PRE/ LTHINSHELL,LCARTESIAN, &! Declarations in MODD_CONF + LPACK, &! + NVERB,CIDEAL,CZS, &!+global variables initialized + LBOUSS,LOCEAN,LPERTURB, &! at their declarations + LFORCING,CEQNSYS, &! at their declarations + LSHIFT,L2D_ADV_FRC,L2D_REL_FRC, & + NHALO , JPHEXT +NAMELIST/NAM_GRID_PRE/ XLON0,XLAT0, & ! Declarations in MODD_GRID + XBETA,XRPK, & + XLONORI,XLATORI +NAMELIST/NAM_GRIDH_PRE/ XLATCEN,XLONCEN, & ! local variables initialized + XDELTAX,XDELTAY, & ! at their declarations + XHMAX,NEXPX,NEXPY, & + XAX,XAY,NIZS,NJZS +NAMELIST/NAM_VPROF_PRE/LGEOSBAL, CFUNU,CFUNV, &! global variables initialized + CTYPELOC,XLATLOC,XLONLOC, &! at their declarations + XXHATLOC,XYHATLOC,NILOC,NJLOC +NAMELIST/NAM_REAL_PGD/CPGD_FILE, & ! Physio-Graphic Data file + ! name + LREAD_ZS, & ! switch to use orography + ! coming from the PGD file + LREAD_GROUND_PARAM +NAMELIST/NAM_SLEVE/NSLEVE, XSMOOTH_ZS +! +!* 0.3 Auxillary Namelist declarations +! +NAMELIST/NAM_AERO_PRE/ LORILAM, LINITPM, XINIRADIUSI, XINIRADIUSJ, & + XINISIGI, XINISIGJ, XN0IMIN, XN0JMIN, CRGUNIT, & + LDUST, LSALT, CRGUNITD, CRGUNITS,& + NMODE_DST, XINISIG, XINIRADIUS, XN0MIN,& + XINISIG_SLT, XINIRADIUS_SLT, XN0MIN_SLT, & + NMODE_SLT +! +NAMELIST/NAM_IBM_LSF/ LIBM_LSF, CIBM_TYPE, NIBM_SMOOTH, XIBM_SMOOTH +! +!------------------------------------------------------------------------------- +! +!* 0. PROLOGUE +! -------- +CALL MPPDB_INIT() +! +CALL GOTO_MODEL(1) +! +CALL IO_Init() +NULLIFY(TZ_FIELDS_ll) +CALL VERSION +CPROGRAM='IDEAL ' +! +!JUAN TIMING + XT_START = 0.0_MNHTIME + XT_STORE = 0.0_MNHTIME +! + CALL SECOND_MNH2(ZEND) +! +!JUAN TIMING +! +!* 1. INITIALIZE PHYSICAL CONSTANTS : +! ------------------------------ +! +NVERB = 5 +CALL INI_CST +CALL INI_NEB +! +!------------------------------------------------------------------------------- +! +! +!* 2. SET DEFAULT VALUES : +! -------------------- +! +! +!* 2.1 For variables in DESFM file +! +CALL ALLOC_FIELD_SCALARS() +! +CALL DEFAULT_DESFM_n(1) +! +CSURF = "NONE" +! +! +!* 2.2 For other global variables in EXPRE file +! +CALL DEFAULT_EXPRE +!------------------------------------------------------------------------------- +! +!* 3. READ THE EXPRE FILE : +! -------------------- +! +!* 3.1 initialize logical unit numbers (EXPRE and output-listing files) +! and open these files : +! +! +CALL IO_File_add2list(TLUOUT0,'OUTPUT_LISTING1','OUTPUTLISTING','WRITE') +CALL IO_File_open(TLUOUT0) +NLUOUT = TLUOUT0%NLU +!Set output files for PRINT_MSG +TLUOUT => TLUOUT0 +TFILE_OUTPUTLISTING => TLUOUT0 +! +CALL IO_File_add2list(TZEXPREFILE,'PRE_IDEA1.nam','NML','READ') +CALL IO_File_open(TZEXPREFILE) +NLUPRE=TZEXPREFILE%NLU +! +!* 3.2 read in NLUPRE the namelist informations +! +WRITE(NLUOUT,FMT=*) 'attempt to read ',TRIM(TZEXPREFILE%CNAME),' file' +CALL POSNAM(NLUPRE,'NAM_REAL_PGD',GFOUND,NLUOUT) +IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_REAL_PGD) +! +! +CALL POSNAM(NLUPRE,'NAM_CONF_PRE',GFOUND,NLUOUT) +IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONF_PRE) +!JUANZ +CALL POSNAM(NLUPRE,'NAM_CONFZ',GFOUND,NLUOUT) +IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFZ) +!JUANZ +CALL POSNAM(NLUPRE,'NAM_CONFIO',GFOUND,NLUOUT) +IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFIO) +CALL IO_Config_set() +CALL POSNAM(NLUPRE,'NAM_GRID_PRE',GFOUND,NLUOUT) +IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_GRID_PRE) +CALL POSNAM(NLUPRE,'NAM_GRIDH_PRE',GFOUND,NLUOUT) +IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_GRIDH_PRE) +CALL POSNAM(NLUPRE,'NAM_VPROF_PRE',GFOUND,NLUOUT) +IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_VPROF_PRE) +CALL POSNAM(NLUPRE,'NAM_BLANKN',GFOUND,NLUOUT) +CALL INIT_NAM_BLANKn +IF (GFOUND) THEN + READ(UNIT=NLUPRE,NML=NAM_BLANKn) + CALL UPDATE_NAM_BLANKn +END IF +CALL READ_PRE_IDEA_NAM_n(NLUPRE,NLUOUT) +CALL POSNAM(NLUPRE,'NAM_AERO_PRE',GFOUND,NLUOUT) +IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_AERO_PRE) +CALL POSNAM(NLUPRE,'NAM_IBM_LSF' ,GFOUND,NLUOUT) +IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_IBM_LSF ) +! +CALL INI_FIELD_LIST(1) +! +CALL INI_FIELD_SCALARS() +! +IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN + ! open the PGD_FILE + CALL IO_File_add2list(TPGDFILE,TRIM(CPGD_FILE),'PGD','READ',KLFINPRAR=NNPRAR,KLFITYPE=2,KLFIVERB=NVERB) + CALL IO_File_open(TPGDFILE) + + ! read the grid in the PGD file + CALL IO_Field_read(TPGDFILE,'IMAX', NIMAX) + CALL IO_Field_read(TPGDFILE,'JMAX', NJMAX) + CALL IO_Field_read(TPGDFILE,'JPHEXT',IJPHEXT) + + IF ( CPGD_FILE /= CINIFILEPGD) THEN + WRITE(NLUOUT,FMT=*) ' WARNING : in PRE_IDEA1.nam, in NAM_LUNITn you& + & have CINIFILEPGD= ',CINIFILEPGD + WRITE(NLUOUT,FMT=*) ' whereas in NAM_REAL_PGD you have CPGD_FILE = '& + ,CPGD_FILE + WRITE(NLUOUT,FMT=*) ' ' + WRITE(NLUOUT,FMT=*) ' CINIFILEPGD HAS BEEN SET TO ',CPGD_FILE + CINIFILEPGD=CPGD_FILE + END IF + IF ( IJPHEXT .NE. JPHEXT ) THEN + WRITE(NLUOUT,FMT=*) ' PREP_IDEAL_CASE : JPHEXT in PRE_IDEA1.nam/NAM_CONF_PRE ( or default value )& + & JPHEXT=',JPHEXT + WRITE(NLUOUT,FMT=*) ' different from PGD files=', CINIFILEPGD,' value JPHEXT=',IJPHEXT + WRITE(NLUOUT,FMT=*) '-> JOB ABORTED' + CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','') + !WRITE(NLUOUT,FMT=*) ' JPHEXT HAS BEEN SET TO ', IJPHEXT + !IJPHEXT = JPHEXT + END IF +END IF +! +NIMAX_ll=NIMAX !! _ll variables are global variables +NJMAX_ll=NJMAX !! but the old names are kept in PRE_IDEA1.nam file +! +!* 3.3 check some parameters: +! +L1D=.FALSE. ; L2D=.FALSE. +! +IF ((NIMAX == 1).OR.(NJMAX == 1)) THEN + L2D=.TRUE. + NJMAX_ll=1 + NIMAX_ll=MAX(NIMAX,NJMAX) + WRITE(NLUOUT,FMT=*) ' NJMAX HAS BEEN SET TO 1 SINCE 2D INITIAL FILE IS REQUIRED & + & (L2D=TRUE) )' +END IF +! +IF ((NIMAX == 1).AND.(NJMAX == 1)) THEN + L1D=.TRUE. + NIMAX_ll = 1 + NJMAX_ll = 1 + WRITE(NLUOUT,FMT=*) ' 1D INITIAL FILE IS REQUIRED (L1D=TRUE) ' +END IF +! +IF(.NOT. L1D) THEN + LHORELAX_UVWTH=.TRUE. + LHORELAX_RV=.TRUE. +ENDIF +! +NRIMX= MIN(JPRIMMAX,NIMAX_ll/2) +! +IF (L2D) THEN + NRIMY=0 +ELSE + NRIMY= MIN(JPRIMMAX,NJMAX_ll/2) +END IF +! +IF (L1D) THEN + NRIMX=0 + NRIMY=0 +END IF +! +IF (L1D .AND. ( LPERTURB .OR. LGEOSBAL .OR. & + (.NOT. LCARTESIAN ) .OR. (.NOT. LTHINSHELL) ))THEN + LGEOSBAL = .FALSE. + LPERTURB = .FALSE. + LCARTESIAN = .TRUE. + LTHINSHELL = .TRUE. + WRITE(NLUOUT,FMT=*) ' LGEOSBAL AND LPERTURB HAVE BEEN SET TO FALSE & + & AND LCARTESIAN AND LTHINSHELL TO TRUE & + & SINCE 1D INITIAL FILE IS REQUIRED (L1D=TRUE)' +END IF +! +IF (LGEOSBAL .AND. LSHIFT ) THEN + LSHIFT=.FALSE. + WRITE(NLUOUT,FMT=*) ' LSHIFT HAS BEEN SET TO FALSE SINCE & + & LGEOSBAL=.TRUE. IS REQUIRED ' +END IF +! +!* 3.4 compute the number of moist variables : +! +IF (.NOT.LUSERV) THEN + LUSERV = .TRUE. + WRITE(NLUOUT,FMT=*) ' LUSERV HAS BEEN RESET TO TRUE, SINCE A MOIST VARIABLE & + & IS PRESENT IN EXPRE FILE (CIDEAL = RSOU OR CSTN)' +END IF +! +IF((LUSERI .OR. LUSERC).AND. (CIDEAL /= 'RSOU')) THEN + !callabortstop + CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','use of hydrometeors is only allowed in RSOU case') +ENDIF +IF (LUSERI) THEN + LUSERC =.TRUE. + LUSERR =.TRUE. + LUSERI =.TRUE. + LUSERS =.TRUE. + LUSERG =.TRUE. + LUSERH =.FALSE. + CCLOUD='ICE3' +ELSEIF(LUSERC) THEN + LUSERR =.FALSE. + LUSERI =.FALSE. + LUSERS =.FALSE. + LUSERG =.FALSE. + LUSERH =.FALSE. + CCLOUD='REVE' +ELSE + LUSERC =.FALSE. + LUSERR =.FALSE. + LUSERI =.FALSE. + LUSERS =.FALSE. + LUSERG =.FALSE. + LUSERH =.FALSE. + LHORELAX_RC=.FALSE. + LHORELAX_RR=.FALSE. + LHORELAX_RI=.FALSE. + LHORELAX_RS=.FALSE. + LHORELAX_RG=.FALSE. + LHORELAX_RH=.FALSE. + CCLOUD='NONE' +! +END IF +! +NRR=0 +IF (LUSERV) THEN + NRR=NRR+1 + IDX_RVT = NRR +END IF +IF (LUSERC) THEN + NRR=NRR+1 + IDX_RCT = NRR +END IF +IF (LUSERR) THEN + NRR=NRR+1 + IDX_RRT = NRR +END IF +IF (LUSERI) THEN + NRR=NRR+1 + IDX_RIT = NRR +END IF +IF (LUSERS) THEN + NRR=NRR+1 + IDX_RST = NRR +END IF +IF (LUSERG) THEN + NRR=NRR+1 + IDX_RGT = NRR +END IF +IF (LUSERH) THEN + NRR=NRR+1 + IDX_RHT = NRR +END IF +! +! NRR=4 for RSOU case because RI and Rc always computed +IF (CIDEAL == 'RSOU' .AND. NRR < 4 ) NRR=4 +! +! +!* 3.5 Chemistry +! +IF (LORILAM .OR. LCH_INIT_FIELD) THEN + LUSECHEM = .TRUE. + IF (LORILAM) THEN + CORGANIC = "MPMPO" + LVARSIGI = .TRUE. + LVARSIGJ = .TRUE. + END IF +END IF +! initialise NSV_* variables +CALL INI_NSV(1) +LHORELAX_SV(:)=.FALSE. +IF(.NOT. L1D) LHORELAX_SV(1:NSV)=.TRUE. +! +!------------------------------------------------------------------------------- +! +!* 4. ALLOCATE MEMORY FOR ARRAYS : +! ---------------------------- +! +!* 4.1 Vertical Spatial grid +! +CALL READ_VER_GRID(TZEXPREFILE) +! +!* 4.2 Initialize parallel variables and compute array's dimensions +! +! +IF(LGEOSBAL) THEN + CALL SET_SPLITTING_ll('XSPLITTING') ! required for integration of thermal wind balance +ELSE + CALL SET_SPLITTING_ll('BSPLITTING') +ENDIF +CALL SET_JP_ll(1,JPHEXT,JPVEXT,JPHEXT) +CALL SET_DAD0_ll() +CALL SET_DIM_ll(NIMAX_ll, NJMAX_ll, NKMAX) +CALL IO_Pack_set(L1D,L2D,LPACK) +CALL SET_LBX_ll(CLBCX(1), 1) +CALL SET_LBY_ll(CLBCY(1), 1) +CALL SET_XRATIO_ll(1, 1) +CALL SET_YRATIO_ll(1, 1) +CALL SET_XOR_ll(1, 1) +CALL SET_XEND_ll(NIMAX_ll+2*JPHEXT, 1) +CALL SET_YOR_ll(1, 1) +CALL SET_YEND_ll(NJMAX_ll+2*JPHEXT, 1) +CALL SET_DAD_ll(0, 1) +CALL INI_PARAZ_ll(IINFO_ll) +! +! sizes of arrays of the extended sub-domain +! +CALL GET_DIM_EXT_ll('B',NIU,NJU) +CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX) +CALL GET_INDICE_ll(NIB,NJB,NIE,NJE) +CALL GET_OR_ll('B',IXOR,IYOR) +NKB=1+JPVEXT +NKU=NKMAX+2*JPVEXT +! +!* 4.3 Global variables absent from the modules : +! +ALLOCATE(XJ(NIU,NJU,NKU)) +SELECT CASE(CIDEAL) + CASE('RSOU','CSTN') + IF (LGEOSBAL) ALLOCATE(XCORIOZ(NIU,NJU,NKU)) ! exceptionally a 3D array + CASE DEFAULT ! undefined preinitialization + !callabortstop + CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CIDEAL is not correctly defined') +END SELECT +! +!* 4.4 Prognostic variables at M instant (module MODD_FIELD1): +! +ALLOCATE(XUT(NIU,NJU,NKU)) +ALLOCATE(XVT(NIU,NJU,NKU)) +ALLOCATE(XWT(NIU,NJU,NKU)) +ALLOCATE(XTHT(NIU,NJU,NKU)) +ALLOCATE(XPABST(NIU,NJU,NKU)) +ALLOCATE(XRT(NIU,NJU,NKU,NRR)) +ALLOCATE(XSVT(NIU,NJU,NKU,NSV)) +! +!* 4.5 Grid variables (module MODD_GRID1 and MODD_METRICS1): +! +ALLOCATE(XMAP(NIU,NJU)) +ALLOCATE(XLAT(NIU,NJU)) +ALLOCATE(XLON(NIU,NJU)) +ALLOCATE(XDXHAT(NIU),XDYHAT(NJU)) +IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(XZS(NIU,NJU)) +IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(ZZS_ll(NIMAX_ll)) +IF (LEN_TRIM(CPGD_FILE)==0) ALLOCATE(XZSMT(NIU,NJU)) +ALLOCATE(XZZ(NIU,NJU,NKU)) +! +ALLOCATE(XDXX(NIU,NJU,NKU)) +ALLOCATE(XDYY(NIU,NJU,NKU)) +ALLOCATE(XDZX(NIU,NJU,NKU)) +ALLOCATE(XDZY(NIU,NJU,NKU)) +ALLOCATE(XDZZ(NIU,NJU,NKU)) +! +!* 4.6 Reference state variables (modules MODD_REF and MODD_REF1): +! +ALLOCATE(XRHODREFZ(NKU),XTHVREFZ(NKU)) +XTHVREFZ(:)=0.0 +IF (LCOUPLES) THEN + ! Arrays for reference state different in ocean and atmosphere + ALLOCATE(XRHODREFZO(NKU),XTHVREFZO(NKU)) + XTHVREFZO(:)=0.0 +END IF +IF(CEQNSYS == 'DUR') THEN + ALLOCATE(XRVREF(NIU,NJU,NKU)) +ELSE + ALLOCATE(XRVREF(0,0,0)) +END IF +ALLOCATE(XRHODREF(NIU,NJU,NKU),XTHVREF(NIU,NJU,NKU),XEXNREF(NIU,NJU,NKU)) +ALLOCATE(XRHODJ(NIU,NJU,NKU)) +! +!* 4.7 Larger Scale fields (modules MODD_LSFIELD1): +! +ALLOCATE(XLSUM(NIU,NJU,NKU)) +ALLOCATE(XLSVM(NIU,NJU,NKU)) +ALLOCATE(XLSWM(NIU,NJU,NKU)) +ALLOCATE(XLSTHM(NIU,NJU,NKU)) +IF ( NRR >= 1) THEN + ALLOCATE(XLSRVM(NIU,NJU,NKU)) +ELSE + ALLOCATE(XLSRVM(0,0,0)) +ENDIF +! +! allocate lateral boundary field used for coupling +! +IF ( L1D) THEN ! 1D case +! + NSIZELBX_ll=0 + NSIZELBXU_ll=0 + NSIZELBY_ll=0 + NSIZELBYV_ll=0 + NSIZELBXTKE_ll=0 + NSIZELBXR_ll=0 + NSIZELBXSV_ll=0 + NSIZELBYTKE_ll=0 + NSIZELBYR_ll=0 + NSIZELBYSV_ll=0 + ALLOCATE(XLBXUM(0,0,0)) + ALLOCATE(XLBYUM(0,0,0)) + ALLOCATE(XLBXVM(0,0,0)) + ALLOCATE(XLBYVM(0,0,0)) + ALLOCATE(XLBXWM(0,0,0)) + ALLOCATE(XLBYWM(0,0,0)) + ALLOCATE(XLBXTHM(0,0,0)) + ALLOCATE(XLBYTHM(0,0,0)) + ALLOCATE(XLBXTKEM(0,0,0)) + ALLOCATE(XLBYTKEM(0,0,0)) + ALLOCATE(XLBXRM(0,0,0,0)) + ALLOCATE(XLBYRM(0,0,0,0)) + ALLOCATE(XLBXSVM(0,0,0,0)) + ALLOCATE(XLBYSVM(0,0,0,0)) +! +ELSEIF( L2D ) THEN ! 2D case (not yet parallelized) +! + CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX, & + IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, & + IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2) + NSIZELBY_ll=0 + NSIZELBYV_ll=0 + NSIZELBYTKE_ll=0 + NSIZELBYR_ll=0 + NSIZELBYSV_ll=0 + ALLOCATE(XLBYUM(0,0,0)) + ALLOCATE(XLBYVM(0,0,0)) + ALLOCATE(XLBYWM(0,0,0)) + ALLOCATE(XLBYTHM(0,0,0)) + ALLOCATE(XLBYTKEM(0,0,0)) + ALLOCATE(XLBYRM(0,0,0,0)) + ALLOCATE(XLBYSVM(0,0,0,0)) + ! + IF ( LHORELAX_UVWTH ) THEN +!JUAN A REVOIR TODO_JPHEXT +! <<<<<<< prep_ideal_case.f90 + ! NSIZELBX_ll=2*NRIMX+2 + ! NSIZELBXU_ll=2*NRIMX+2 + ALLOCATE(XLBXUM(IISIZEXFU,NJU,NKU)) + ALLOCATE(XLBXVM(IISIZEXF,NJU,NKU)) + ALLOCATE(XLBXWM(IISIZEXF,NJU,NKU)) + ALLOCATE(XLBXTHM(IISIZEXF,NJU,NKU)) +! ======= + NSIZELBX_ll=2*NRIMX+2*JPHEXT + NSIZELBXU_ll=2*NRIMX+2*JPHEXT + ! ALLOCATE(XLBXUM(2*NRIMX+2*JPHEXT,NJU,NKU)) + ! ALLOCATE(XLBXVM(2*NRIMX+2*JPHEXT,NJU,NKU)) + ! ALLOCATE(XLBXWM(2*NRIMX+2*JPHEXT,NJU,NKU)) + ! ALLOCATE(XLBXTHM(2*NRIMX+2*JPHEXT,NJU,NKU)) +! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2 + ELSE + NSIZELBX_ll= 2*JPHEXT ! 2 + NSIZELBXU_ll=2*(JPHEXT+1) ! 4 + ALLOCATE(XLBXUM(NSIZELBXU_ll,NJU,NKU)) + ALLOCATE(XLBXVM(NSIZELBX_ll,NJU,NKU)) + ALLOCATE(XLBXWM(NSIZELBX_ll,NJU,NKU)) + ALLOCATE(XLBXTHM(NSIZELBX_ll,NJU,NKU)) + END IF + ! + IF ( NRR > 0 ) THEN + IF ( LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI & + .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH & + ) THEN +!JUAN A REVOIR TODO_JPHEXT +! <<<<<<< prep_ideal_case.f90 + ! NSIZELBXR_ll=2* NRIMX+2 + ALLOCATE(XLBXRM(IISIZEXF,NJU,NKU,NRR)) +! ======= + NSIZELBXR_ll=2*NRIMX+2*JPHEXT + ! ALLOCATE(XLBXRM(2*NRIMX+2*JPHEXT,NJU,NKU,NRR)) +! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2 + ELSE + NSIZELBXR_ll=2*JPHEXT ! 2 + ALLOCATE(XLBXRM(NSIZELBXR_ll,NJU,NKU,NRR)) + ENDIF + ELSE + NSIZELBXR_ll=0 + ALLOCATE(XLBXRM(0,0,0,0)) + END IF + ! + IF ( NSV > 0 ) THEN + IF ( ANY( LHORELAX_SV(:)) ) THEN +!JUAN A REVOIR TODO_JPHEXT +! <<<<<<< prep_ideal_case.f90 + ! NSIZELBXSV_ll=2* NRIMX+2 + ALLOCATE(XLBXSVM(IISIZEXF,NJU,NKU,NSV)) +! ======= + NSIZELBXSV_ll=2*NRIMX+2*JPHEXT + ! ALLOCATE(XLBXSVM(2*NRIMX+2*JPHEXT,NJU,NKU,NSV)) +! >>>>>>> 1.3.2.4.2.3.2.14.2.8.2.11.2.2 + ELSE + NSIZELBXSV_ll=2*JPHEXT ! 2 + ALLOCATE(XLBXSVM(NSIZELBXSV_ll,NJU,NKU,NSV)) + END IF + ELSE + NSIZELBXSV_ll=0 + ALLOCATE(XLBXSVM(0,0,0,0)) + END IF +! +ELSE ! 3D case +! + CALL GET_SIZEX_LB(NIMAX_ll,NJMAX_ll,NRIMX, & + IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU, & + IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2) + CALL GET_SIZEY_LB(NIMAX_ll,NJMAX_ll,NRIMY, & + IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV, & + IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2) +! + IF ( LHORELAX_UVWTH ) THEN + NSIZELBX_ll=2*NRIMX+2*JPHEXT + NSIZELBXU_ll=2*NRIMX+2*JPHEXT + NSIZELBY_ll=2*NRIMY+2*JPHEXT + NSIZELBYV_ll=2*NRIMY+2*JPHEXT + ALLOCATE(XLBXUM(IISIZEXFU,IJSIZEXFU,NKU)) + ALLOCATE(XLBYUM(IISIZEYF,IJSIZEYF,NKU)) + ALLOCATE(XLBXVM(IISIZEXF,IJSIZEXF,NKU)) + ALLOCATE(XLBYVM(IISIZEYFV,IJSIZEYFV,NKU)) + ALLOCATE(XLBXWM(IISIZEXF,IJSIZEXF,NKU)) + ALLOCATE(XLBYWM(IISIZEYF,IJSIZEYF,NKU)) + ALLOCATE(XLBXTHM(IISIZEXF,IJSIZEXF,NKU)) + ALLOCATE(XLBYTHM(IISIZEYF,IJSIZEYF,NKU)) + ELSE + NSIZELBX_ll=2*JPHEXT ! 2 + NSIZELBXU_ll=2*(JPHEXT+1) ! 4 + NSIZELBY_ll=2*JPHEXT ! 2 + NSIZELBYV_ll=2*(JPHEXT+1) ! 4 + ALLOCATE(XLBXUM(IISIZEX4,IJSIZEX4,NKU)) + ALLOCATE(XLBYUM(IISIZEY2,IJSIZEY2,NKU)) + ALLOCATE(XLBXVM(IISIZEX2,IJSIZEX2,NKU)) + ALLOCATE(XLBYVM(IISIZEY4,IJSIZEY4,NKU)) + ALLOCATE(XLBXWM(IISIZEX2,IJSIZEX2,NKU)) + ALLOCATE(XLBYWM(IISIZEY2,IJSIZEY2,NKU)) + ALLOCATE(XLBXTHM(IISIZEX2,IJSIZEX2,NKU)) + ALLOCATE(XLBYTHM(IISIZEY2,IJSIZEY2,NKU)) + END IF + ! + IF ( NRR > 0 ) THEN + IF ( LHORELAX_RV .OR. LHORELAX_RC .OR. LHORELAX_RR .OR. LHORELAX_RI & + .OR. LHORELAX_RS .OR. LHORELAX_RG .OR. LHORELAX_RH & + ) THEN + NSIZELBXR_ll=2*NRIMX+2*JPHEXT + NSIZELBYR_ll=2*NRIMY+2*JPHEXT + ALLOCATE(XLBXRM(IISIZEXF,IJSIZEXF,NKU,NRR)) + ALLOCATE(XLBYRM(IISIZEYF,IJSIZEYF,NKU,NRR)) + ELSE + NSIZELBXR_ll=2*JPHEXT ! 2 + NSIZELBYR_ll=2*JPHEXT ! 2 + ALLOCATE(XLBXRM(IISIZEX2,IJSIZEX2,NKU,NRR)) + ALLOCATE(XLBYRM(IISIZEY2,IJSIZEY2,NKU,NRR)) + ENDIF + ELSE + NSIZELBXR_ll=0 + NSIZELBYR_ll=0 + ALLOCATE(XLBXRM(0,0,0,0)) + ALLOCATE(XLBYRM(0,0,0,0)) + END IF + ! + IF ( NSV > 0 ) THEN + IF ( ANY( LHORELAX_SV(:)) ) THEN + NSIZELBXSV_ll=2*NRIMX+2*JPHEXT + NSIZELBYSV_ll=2*NRIMY+2*JPHEXT + ALLOCATE(XLBXSVM(IISIZEXF,IJSIZEXF,NKU,NSV)) + ALLOCATE(XLBYSVM(IISIZEYF,IJSIZEYF,NKU,NSV)) + ELSE + NSIZELBXSV_ll=2*JPHEXT ! 2 + NSIZELBYSV_ll=2*JPHEXT ! 2 + ALLOCATE(XLBXSVM(IISIZEX2,IJSIZEX2,NKU,NSV)) + ALLOCATE(XLBYSVM(IISIZEY2,IJSIZEY2,NKU,NSV)) + END IF + ELSE + NSIZELBXSV_ll=0 + NSIZELBYSV_ll=0 + ALLOCATE(XLBXSVM(0,0,0,0)) + ALLOCATE(XLBYSVM(0,0,0,0)) + END IF +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 5. INITIALIZE ALL THE MODEL VARIABLES +! ---------------------------------- +! +! +!* 5.1 Grid variables and RS localization: +! +!* 5.1.1 Horizontal Spatial grid : +! +IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN +!-------------------------------------------------------- +! the MESONH horizontal grid will be read in the PGD_FILE +!-------------------------------------------------------- + CALL READ_HGRID(1,TPGDFILE,YPGD_NAME,YPGD_DAD_NAME,YPGD_TYPE) +! control the cartesian option + IF( LCARTESIAN ) THEN + WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE : IN GENERAL, THE USE OF A PGD_FILE & + & IMPLIES THAT YOU MUST TAKE INTO ACCOUNT THE EARTH SPHERICITY' + WRITE(NLUOUT,FMT=*) 'NEVERTHELESS, LCARTESIAN HAS BEEN KEPT TO TRUE' + END IF +! +!* use of the externalized surface +! + CSURF = "EXTE" +! +! determine whether the model is flat or no +! + ZZS_MAX = ABS( MAXVAL(XZS(NIB:NIU-JPHEXT,NJB:NJU-JPHEXT))) + CALL MPI_ALLREDUCE(ZZS_MAX, ZZS_MAX_ll, 1, MNHREAL_MPI, MPI_MAX, & + NMNH_COMM_WORLD,IINFO_ll) + IF( ABS(ZZS_MAX_ll) < 1.E-10 ) THEN + LFLAT=.TRUE. + ELSE + LFLAT=.FALSE. + END IF +! + +ELSE +!------------------------------------------------------------------------ +! the MESONH horizontal grid is built from the PRE_IDEA1.nam informations +!------------------------------------------------------------------------ +! + ALLOCATE(XXHAT(NIU),XYHAT(NJU)) +! +! define the grid localization at the earth surface by the central point +! coordinates +! + IF (XLONCEN/=XUNDEF .OR. XLATCEN/=XUNDEF) THEN + IF (XLONCEN/=XUNDEF .AND. XLATCEN/=XUNDEF) THEN +! +! it should be noted that XLATCEN and XLONCEN refer to a vertical +! vorticity point and (XLATORI, XLONORI) refer to the mass point of +! conformal coordinates (0,0). This is to allow the centering of the model in +! a non-cyclic configuration regarding to XLATCEN or XLONCEN. +! + ALLOCATE(ZXHAT_ll(NIMAX_ll+2*JPHEXT),ZYHAT_ll(NJMAX_ll+2*JPHEXT)) + ZXHAT_ll=0. + ZYHAT_ll=0. + CALL SM_LATLON(XLATCEN,XLONCEN, & + -XDELTAX*(NIMAX_ll/2-0.5+JPHEXT), & + -XDELTAY*(NJMAX_ll/2-0.5+JPHEXT), & + XLATORI,XLONORI) + DEALLOCATE(ZXHAT_ll,ZYHAT_ll) +! + WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE : XLATORI=' , XLATORI, & + ' XLONORI= ', XLONORI + ELSE + !callabortstop + CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE',& + 'latitude and longitude of the center point must be initialized alltogether or not') + END IF + END IF +! + IF (NPROC > 1) THEN + CALL GET_DIM_EXT_ll('B',IXDIM,IYDIM) + IBEG = IXOR-JPHEXT-1 + IEND = IBEG+IXDIM-1 + XXHAT(:) = (/ (REAL(JLOOP)*XDELTAX, JLOOP=IBEG,IEND) /) + IBEG = IYOR-JPHEXT-1 + IEND = IBEG+IYDIM-1 + XYHAT(:) = (/ (REAL(JLOOP)*XDELTAY, JLOOP=IBEG,IEND) /) +! + ELSE + XXHAT(:) = (/ (REAL(JLOOP-NIB)*XDELTAX, JLOOP=1,NIU) /) + XYHAT(:) = (/ (REAL(JLOOP-NJB)*XDELTAY, JLOOP=1,NJU) /) + END IF +END IF +! +!* 5.1.2 Orography and Gal-Chen Sommerville transformation : +! +IF ( LEN_TRIM(CPGD_FILE) == 0 .OR. .NOT. LREAD_ZS) THEN + SELECT CASE(CZS) ! 'FLAT' or 'SINE' or 'BELL' + CASE('FLAT') + LFLAT = .TRUE. + IF (XHMAX==XUNDEF) THEN + XZS(:,:) = 0. + ELSE + XZS(:,:) = XHMAX + END IF + CASE('SINE') ! sinus-shaped orography + IF (XHMAX==XUNDEF) XHMAX=300. + LFLAT =.FALSE. + XZS(:,:) = XHMAX & ! three-dimensional case + *SPREAD((/((SIN((XPI/(NIMAX_ll+2*JPHEXT-1))*JLOOP)**2)**NEXPX,JLOOP=IXOR-1,IXOR+NIU-2)/),2,NJU) & + *SPREAD((/((SIN((XPI/(NJMAX_ll+2*JPHEXT-1))*JLOOP)**2)**NEXPY,JLOOP=IYOR-1,IYOR+NJU-2)/),1,NIU) + IF(L1D) THEN ! one-dimensional case + XZS(:,:) = XHMAX + END IF + CASE('BELL') ! bell-shaped orography + IF (XHMAX==XUNDEF) XHMAX=300. + LFLAT = .FALSE. + IF(.NOT.L2D) THEN ! three-dimensional case + XZS(:,:) = XHMAX / ( 1. & + + ( (SPREAD(XXHAT(1:NIU),2,NJU) - REAL(NIZS) * XDELTAX) /XAX ) **2 & + + ( (SPREAD(XYHAT(1:NJU),1,NIU) - REAL(NJZS) * XDELTAY) /XAY ) **2 ) **1.5 + ELSE ! two-dimensional case + XZS(:,:) = XHMAX / ( 1. & + + ( (SPREAD(XXHAT(1:NIU),2,NJU) - REAL(NIZS) * XDELTAX) /XAX ) **2 ) + ENDIF + IF(L1D) THEN ! one-dimensional case + XZS(:,:) = XHMAX + END IF + CASE('COSI') ! (1+cosine)**4 shape + IF (XHMAX==XUNDEF) XHMAX=800. + LFLAT = .FALSE. + IF(L2D) THEN ! two-dimensional case + DO JILOOP = 1, NIU + ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX + IF( ABS(ZDIST)<(4.0*XAX) ) THEN + XZS(JILOOP,:) = (XHMAX/16.0)*( 1.0 + COS((XPI*ZDIST)/(4.0*XAX)) )**4 + ELSE + XZS(JILOOP,:) = 0.0 + ENDIF + END DO + ENDIF + CASE('SCHA') ! exp(-(x/a)**2)*cosine(pi*x/lambda)**2 shape + IF (XHMAX==XUNDEF) XHMAX=800. + LFLAT = .FALSE. + IF(L2D) THEN ! two-dimensional case + DO JILOOP = 1, NIU + ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX + IF( ABS(ZDIST)<(4.0*XAX) ) THEN + XZS(JILOOP,:) = XHMAX*EXP(-(ZDIST/XAY)**2)*COS((XPI*ZDIST)/XAX)**2 + ELSE + XZS(JILOOP,:) = 0.0 + ENDIF + END DO + ENDIF + CASE('AGNE') ! h*a**2/(x**2+a**2) shape + LFLAT = .FALSE. + IF(L2D) THEN ! two-dimensional case + DO JILOOP = 1, NIU + ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX + XZS(JILOOP,:) = XHMAX*(XAX**2)/(XAX**2+ZDIST**2) + END DO + ELSE ! three dimensionnal case - infinite profile in y direction + DO JILOOP = 1, NIU + ZDIST = XXHAT(JILOOP)-REAL(NIZS)*XDELTAX + XZS(JILOOP,:) = XHMAX*(XAX**2)/(XAX**2+ZDIST**2) + END DO + ENDIF + + CASE('DATA') ! discretized orography + LFLAT =.FALSE. + WRITE(NLUOUT,FMT=*) 'CZS="DATA", ATTEMPT TO READ ARRAY & + &XZS(NIB:NIU-JPHEXT:1,NJU-JPHEXT:NJB:-1) & + &starting from the first index' + CALL POSKEY(NLUPRE,NLUOUT,'ZSDATA') + DO JJLOOP = NJMAX_ll+2*JPHEXT-1,JPHEXT+1,-1 ! input like a map prior the sounding + READ(NLUPRE,FMT=*) ZZS_ll + IF ( ( JJLOOP <= ( NJU-JPHEXT + IYOR-1 ) ) .AND. ( JJLOOP >= ( NJB + IYOR-1 ) ) ) THEN + IJ = JJLOOP - ( IYOR-1 ) + XZS(NIB:NIU-JPHEXT,IJ) = ZZS_ll(IXOR:IXOR + NIU-JPHEXT - NIB ) + END IF + END DO +! + CASE DEFAULT ! undefined shape of orography + !callabortstop + CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','erroneous ground type') + END SELECT +! + CALL ADD2DFIELD_ll( TZ_FIELDS_ll, XZS, 'PREP_IDEAL_CASE::XZS' ) + CALL UPDATE_HALO_ll(TZ_FIELDS_ll,IINFO_ll) + CALL CLEANLIST_ll(TZ_FIELDS_ll) +! +END IF +! +!IF( ( LEN_TRIM(CPGD_FILE) /= 0 ) .AND. .NOT.LFLAT .AND. & +! ((CLBCX(1) /= "OPEN" ) .OR. & +! (CLBCX(2) /= "OPEN" ) .OR. (CLBCY(1) /= "OPEN" ) .OR. & +! (CLBCY(2) /= "OPEN" )) ) THEN +! !callabortstop +! CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','with a PGD file, you cannot be in a cyclic LBC') +!END IF +! +IF (LWEST_ll()) THEN + DO JILOOP = 1,JPHEXT + XZS(JILOOP,:) = XZS(NIB,:) + END DO +END IF +IF (LEAST_ll()) THEN + DO JILOOP = NIU-JPHEXT+1,NIU + XZS(JILOOP,:)=XZS(NIU-JPHEXT,:) + END DO +END IF +IF (LSOUTH_ll()) THEN + DO JJLOOP = 1,JPHEXT + XZS(:,JJLOOP)=XZS(:,NJB) + END DO +END IF +IF (LNORTH_ll()) THEN + DO JJLOOP =NJU-JPHEXT+1,NJU + XZS(:,JJLOOP)=XZS(:,NJU-JPHEXT) + END DO +END IF +! +IF ( LEN_TRIM(CPGD_FILE) == 0 .OR. .NOT. LREAD_ZS) THEN + IF (LSLEVE) THEN + CALL ZSMT_PIC(NSLEVE,XSMOOTH_ZS) + ELSE + XZSMT(:,:) = 0. + END IF +END IF +! +IF (LCARTESIAN) THEN + CALL SM_GRIDCART(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XDXHAT,XDYHAT,XZZ,XJ) + XMAP=1. +ELSE + CALL SM_GRIDPROJ(XXHAT,XYHAT,XZHAT,XZS,LSLEVE,XLEN1,XLEN2,XZSMT,XLATORI,XLONORI, & + XMAP,XLAT,XLON,XDXHAT,XDYHAT,XZZ,XJ) +END IF +!* 5.4.1 metrics coefficients and update halos: +! +CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) +! +CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ) +! +!* 5.1.3 Compute the localization in index space of the vertical profile +! in CSTN and RSOU cases : +! +IF (CTYPELOC =='LATLON' ) THEN + IF (.NOT.LCARTESIAN) THEN ! compute (x,y) if + CALL SM_XYHAT(XLATORI,XLONORI, & ! the localization + XLATLOC,XLONLOC,XXHATLOC,XYHATLOC) ! is given in latitude + ELSE ! and longitude + WRITE(NLUOUT,FMT=*) 'CTYPELOC CANNOT BE LATLON IN CARTESIAN GEOMETRY' + WRITE(NLUOUT,FMT=*) '-> JOB ABORTED' + !callabortstop + CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CTYPELOC cannot be LATLON in cartesian geometry') + END IF +END IF +! +ALLOCATE(ZXHAT_ll(NIMAX_ll+ 2 * JPHEXT),ZYHAT_ll(NJMAX_ll+2 * JPHEXT)) +CALL GATHERALL_FIELD_ll('XX',XXHAT,ZXHAT_ll,NRESP) !// +CALL GATHERALL_FIELD_ll('YY',XYHAT,ZYHAT_ll,NRESP) !// +IF (CTYPELOC /= 'IJGRID') THEN + NILOC = MINLOC(ABS(XXHATLOC-ZXHAT_ll(:))) + NJLOC = MINLOC(ABS(XYHATLOC-ZYHAT_ll(:))) +END IF +! +IF ( L1D .AND. ( NILOC(1) /= 1 .OR. NJLOC(1) /= 1 ) ) THEN + NILOC = 1 + NJLOC = 1 + WRITE(NLUOUT,FMT=*) 'FOR 1D CONFIGURATION, THE RS INFORMATIONS ARE TAKEN AT & + & I=1 AND J=1 (CENTRAL VERTICAL WITHOUT HALO)' +END IF +! +IF ( L2D .AND. ( NJLOC(1) /= 1 ) ) THEN + NJLOC = 1 + WRITE(NLUOUT,FMT=*) 'FOR 2D CONFIGURATION, THE RS INFORMATIONS ARE TAKEN AT & + & J=1 (CENTRAL PLANE WITHOUT HALO)' +END IF +! +!* 5.2 Prognostic variables (not multiplied by rhoJ) : u,v,w,theta,r +! and 1D anelastic reference state +! +! +!* 5.2.1 Use a Radiosounding : CIDEAL='RSOU'' +! +IF (CIDEAL == 'RSOU') THEN + WRITE(NLUOUT,FMT=*) 'CIDEAL="RSOU", attempt to read DATE' + CALL POSKEY(NLUPRE,NLUOUT,'RSOU') + READ(NLUPRE,FMT=*) NYEAR,NMONTH,NDAY,XTIME + TDTCUR = DATE_TIME(DATE(NYEAR,NMONTH,NDAY),XTIME) + TDTEXP = TDTCUR + TDTSEG = TDTCUR + TDTMOD = TDTCUR + WRITE(NLUOUT,FMT=*) 'CIDEAL="RSOU", ATTEMPT TO PROCESS THE SOUNDING DATA' + IF (LGEOSBAL) THEN + CALL SET_RSOU(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, & + XJ,LSHIFT,XCORIOZ) + ELSE + CALL SET_RSOU(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, & + XJ,LSHIFT) + END IF +! +!* 5.2.2 N=cste and U(z) : CIDEAL='CSTN' +! +ELSE IF (CIDEAL == 'CSTN') THEN + WRITE(NLUOUT,FMT=*) 'CIDEAL="CSTN", attempt to read DATE' + CALL POSKEY(NLUPRE,NLUOUT,'CSTN') + READ(NLUPRE,FMT=*) NYEAR,NMONTH,NDAY,XTIME + TDTCUR = DATE_TIME(DATE(NYEAR,NMONTH,NDAY),XTIME) + TDTEXP = TDTCUR + TDTSEG = TDTCUR + TDTMOD = TDTCUR + WRITE(NLUOUT,FMT=*) 'CIDEAL="CSTN", ATTEMPT TO PROCESS THE SOUNDING DATA' + IF (LGEOSBAL) THEN + CALL SET_CSTN(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, & + XJ,LSHIFT,XCORIOZ) + ELSE + CALL SET_CSTN(TFILE_DUMMY,TZEXPREFILE,CFUNU,CFUNV,NILOC(1),NJLOC(1),LBOUSS, & + XJ,LSHIFT) + END IF +! +END IF +! +!* 5.3 Forcing variables +! +IF (LFORCING) THEN + WRITE(NLUOUT,FMT=*) 'FORCING IS ENABLED, ATTEMPT TO SET FORCING FIELDS' + CALL POSKEY(NLUPRE,NLUOUT,'ZFRC ','PFRC') + CALL SET_FRC(TZEXPREFILE) +END IF +! +!! --------------------------------------------------------------------- +! Modif PP ADV FRC +! 5.4.2 initialize profiles for adv forcings +IF (L2D_ADV_FRC) THEN + WRITE(NLUOUT,FMT=*) 'L2D_ADV_FRC IS SET TO TRUE' + WRITE(NLUOUT,FMT=*) 'ADVECTING FORCING USED IS USER MADE, NOT STANDARD ONE ' + WRITE(NLUOUT,FMT=*) 'IT IS FOR 2D IDEALIZED WAM STUDY ONLY ' + CALL POSKEY(NLUPRE,NLUOUT,'ZFRC_ADV') + CALL SET_ADVFRC(TZEXPREFILE) +ENDIF +IF (L2D_REL_FRC) THEN + WRITE(NLUOUT,FMT=*) 'L2D_REL_FRC IS SET TO TRUE' + WRITE(NLUOUT,FMT=*) 'RELAXATION FORCING USED IS USER MADE, NOT STANDARD ONE ' + WRITE(NLUOUT,FMT=*) 'IT IS FOR 2D IDEALIZED WAM STUDY ONLY ' + CALL POSKEY(NLUPRE,NLUOUT,'ZFRC_REL') + CALL SET_RELFRC(TZEXPREFILE) +ENDIF +!* 5.4 3D Reference state variables : +! +! +!* 5.4.1 metrics coefficients and update halos: +! +CALL METRICS(XMAP,XDXHAT,XDYHAT,XZZ,XDXX,XDYY,XDZX,XDZY,XDZZ) +! +CALL UPDATE_METRICS(CLBCX,CLBCY,XDXX,XDYY,XDZX,XDZY,XDZZ) +! +!* 5.4.2 3D reference state : +! +CALL SET_REF(0,TFILE_DUMMY, & + XZZ,XZHAT,XJ,XDXX,XDYY,CLBCX,CLBCY, & + XREFMASS,XMASS_O_PHI0,XLINMASS, & + XRHODREF,XTHVREF,XRVREF,XEXNREF,XRHODJ) +! +! +!* 5.5.1 Absolute pressure : +! +! +!* 5.5.2 Total mass of dry air Md computation : +! +CALL TOTAL_DMASS(XJ,XRHODREF,XDRYMASST) +! +! +!* 5.6 Complete prognostic variables (multipliy by rhoJ) at time t : +! +! U grid : gridpoint 2 +IF (LWEST_ll()) XUT(1,:,:) = 2.*XUT(2,:,:) - XUT(3,:,:) +! V grid : gridpoint 3 +IF (LSOUTH_ll()) XVT(:,1,:) = 2.*XVT(:,2,:) - XVT(:,3,:) +! SV : gridpoint 1 +XSVT(:,:,:,:) = 0. +! +! +!* 5.7 Larger scale fields initialization : +! +XLSUM(:,:,:) = XUT(:,:,:) ! these fields do not satisfy the +XLSVM(:,:,:) = XVT(:,:,:) ! lower boundary condition but are +XLSWM(:,:,:) = XWT(:,:,:) ! in equilibrium +XLSTHM(:,:,:)= XTHT(:,:,:) +XLSRVM(:,:,:)= XRT(:,:,:,1) +! +! enforce the vertical homogeneity under the ground and above the top of +! the model for the LS fields +! +XLSUM(:,:,NKB-1)=XLSUM(:,:,NKB) +XLSUM(:,:,NKU)=XLSUM(:,:,NKU-1) +XLSVM(:,:,NKB-1)=XLSVM(:,:,NKB) +XLSVM(:,:,NKU)=XLSVM(:,:,NKU-1) +XLSWM(:,:,NKB-1)=XLSWM(:,:,NKB) +XLSWM(:,:,NKU)=XLSWM(:,:,NKU-1) +XLSTHM(:,:,NKB-1)=XLSTHM(:,:,NKB) +XLSTHM(:,:,NKU)=XLSTHM(:,:,NKU-1) +IF ( NRR > 0 ) THEN + XLSRVM(:,:,NKB-1)=XLSRVM(:,:,NKB) + XLSRVM(:,:,NKU)=XLSRVM(:,:,NKU-1) +END IF +! +ILBX=SIZE(XLBXUM,1) +ILBY=SIZE(XLBYUM,2) +IF(LWEST_ll() .AND. .NOT. L1D) THEN + XLBXUM(1:NRIMX+JPHEXT, :,:) = XUT(2:NRIMX+JPHEXT+1, :,:) + XLBXVM(1:NRIMX+JPHEXT, :,:) = XVT(1:NRIMX+JPHEXT, :,:) + XLBXWM(1:NRIMX+JPHEXT, :,:) = XWT(1:NRIMX+JPHEXT, :,:) + XLBXTHM(1:NRIMX+JPHEXT, :,:) = XTHT(1:NRIMX+JPHEXT, :,:) + XLBXRM(1:NRIMX+JPHEXT, :,:,:) = XRT(1:NRIMX+JPHEXT, :,:,:) +ENDIF +IF(LEAST_ll() .AND. .NOT. L1D) THEN + XLBXUM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:) = XUT(NIU-NRIMX-JPHEXT+1:NIU, :,:) + XLBXVM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:) = XVT(NIU-NRIMX-JPHEXT+1:NIU, :,:) + XLBXWM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:) = XWT(NIU-NRIMX-JPHEXT+1:NIU, :,:) + XLBXTHM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:) = XTHT(NIU-NRIMX-JPHEXT+1:NIU, :,:) + XLBXRM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:,:) = XRT(NIU-NRIMX-JPHEXT+1:NIU, :,:,:) +ENDIF +IF(LSOUTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) THEN + XLBYUM(:,1:NRIMY+JPHEXT, :) = XUT(:,1:NRIMY+JPHEXT, :) + XLBYVM(:,1:NRIMY+JPHEXT, :) = XVT(:,2:NRIMY+JPHEXT+1, :) + XLBYWM(:,1:NRIMY+JPHEXT, :) = XWT(:,1:NRIMY+JPHEXT, :) + XLBYTHM(:,1:NRIMY+JPHEXT, :) = XTHT(:,1:NRIMY+JPHEXT, :) + XLBYRM(:,1:NRIMY+JPHEXT, :,:) = XRT(:,1:NRIMY+JPHEXT, :,:) +ENDIF +IF(LNORTH_ll().AND. .NOT. L1D .AND. .NOT. L2D) THEN + XLBYUM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:) = XUT(:,NJU-NRIMY-JPHEXT+1:NJU, :) + XLBYVM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:) = XVT(:,NJU-NRIMY-JPHEXT+1:NJU, :) + XLBYWM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:) = XWT(:,NJU-NRIMY-JPHEXT+1:NJU, :) + XLBYTHM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:) = XTHT(:,NJU-NRIMY-JPHEXT+1:NJU, :) + XLBYRM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:,:) = XRT(:,NJU-NRIMY-JPHEXT+1:NJU, :,:) +ENDIF +DO JSV = 1, NSV + IF(LWEST_ll() .AND. .NOT. L1D) & + XLBXSVM(1:NRIMX+JPHEXT, :,:,JSV) = XSVT(1:NRIMX+JPHEXT, :,:,JSV) + IF(LEAST_ll() .AND. .NOT. L1D) & + XLBXSVM(ILBX-NRIMX-JPHEXT+1:ILBX,:,:,JSV) = XSVT(NIU-NRIMX-JPHEXT+1:NIU, :,:,JSV) + IF(LSOUTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) & + XLBYSVM(:,1:NRIMY+JPHEXT, :,JSV) = XSVT(:,1:NRIMY+JPHEXT, :,JSV) + IF(LNORTH_ll() .AND. .NOT. L1D .AND. .NOT. L2D) & + XLBYSVM(:,ILBY-NRIMY-JPHEXT+1:ILBY,:,JSV) = XSVT(:,NJU-NRIMY-JPHEXT+1:NJU, :,JSV) +END DO +! +! +!* 5.8 Add a perturbation to a basic state : +! +IF(LPERTURB) CALL SET_PERTURB(TZEXPREFILE) +! +! +!* 5.9 Anelastic correction and pressure: +! +IF (.NOT.LOCEAN) THEN + CALL ICE_ADJUST_BIS(XPABST,XTHT,XRT) + IF ( .NOT. L1D ) CALL PRESSURE_IN_PREP(XDXX,XDYY,XDZX,XDZY,XDZZ) + CALL ICE_ADJUST_BIS(XPABST,XTHT,XRT) +END IF +! +! +!* 5.10 Compute THETA, vapor and cloud mixing ratio +! +IF (CIDEAL == 'RSOU') THEN + ALLOCATE(ZEXN(NIU,NJU,NKU)) + ALLOCATE(ZT(NIU,NJU,NKU)) + ALLOCATE(ZTHL(NIU,NJU,NKU)) + ALLOCATE(ZRT(NIU,NJU,NKU)) + ALLOCATE(ZCPH(NIU,NJU,NKU)) + ALLOCATE(ZLVOCPEXN(NIU,NJU,NKU)) + ALLOCATE(ZLSOCPEXN(NIU,NJU,NKU)) + ALLOCATE(ZFRAC_ICE(NIU,NJU,NKU)) + ALLOCATE(ZRSATW(NIU,NJU,NKU)) + ALLOCATE(ZRSATI(NIU,NJU,NKU)) + ZRT=XRT(:,:,:,1)+XRT(:,:,:,2)+XRT(:,:,:,4) +IF (LOCEAN) THEN + ZEXN(:,:,:)= 1. + ZT=XTHT + ZTHL=XTHT + ZCPH=XCPD+ XCPV * XRT(:,:,:,1) + ZLVOCPEXN = XLVTT + ZLSOCPEXN = XLSTT +ELSE + ZEXN=(XPABST/XP00) ** (XRD/XCPD) + ZT=XTHT*(XPABST/XP00)**(XRD/XCPD) + ZCPH=XCPD+ XCPV * XRT(:,:,:,1)+ XCL *XRT(:,:,:,2) + XCI * XRT(:,:,:,4) + ZLVOCPEXN = (XLVTT + (XCPV-XCL) * (ZT-XTT))/(ZCPH*ZEXN) + ZLSOCPEXN = (XLSTT + (XCPV-XCI) * (ZT-XTT))/(ZCPH*ZEXN) + ZTHL=XTHT-ZLVOCPEXN*XRT(:,:,:,2)-ZLSOCPEXN*XRT(:,:,:,4) + CALL TH_R_FROM_THL_RT_3D('T',ZFRAC_ICE,XPABST,ZTHL,ZRT,XTHT,XRT(:,:,:,1), & + XRT(:,:,:,2),XRT(:,:,:,4),ZRSATW, ZRSATI,OOCEAN=.FALSE.) +END IF + DEALLOCATE(ZEXN) + DEALLOCATE(ZT) + DEALLOCATE(ZCPH) + DEALLOCATE(ZLVOCPEXN) + DEALLOCATE(ZLSOCPEXN) + DEALLOCATE(ZTHL) + DEALLOCATE(ZRT) +! Coherence test + IF ((.NOT. LUSERI) ) THEN + IF (MAXVAL(XRT(:,:,:,4))/= 0) THEN + WRITE(NLUOUT,FMT=*) "*********************************" + WRITE(NLUOUT,FMT=*) 'WARNING' + WRITE(NLUOUT,FMT=*) 'YOU HAVE LUSERI=FALSE ' + WRITE(NLUOUT,FMT=*) ' BUT WITH YOUR RADIOSOUNDING Ri/=0' + WRITE(NLUOUT,FMT=*) MINVAL(XRT(:,:,:,4)),MAXVAL(XRT(:,:,:,4)) + WRITE(NLUOUT,FMT=*) "*********************************" + ENDIF + ENDIF + IF ((.NOT. LUSERC)) THEN + IF (MAXVAL(XRT(:,:,:,2))/= 0) THEN + WRITE(NLUOUT,FMT=*) "*********************************" + WRITE(NLUOUT,FMT=*) 'WARNING' + WRITE(NLUOUT,FMT=*) 'YOU HAVE LUSERC=FALSE ' + WRITE(NLUOUT,FMT=*) 'BUT WITH YOUR RADIOSOUNDING RC/=0' + WRITE(NLUOUT,FMT=*) MINVAL(XRT(:,:,:,2)),MAXVAL(XRT(:,:,:,2)) + WRITE(NLUOUT,FMT=*) "*********************************" + ENDIF + ENDIF + ! on remet les bonnes valeurs pour NRR + IF(CCLOUD=='NONE') NRR=1 + IF(CCLOUD=='REVE') NRR=2 +END IF +! +!------------------------------------------------------------------------------- +! +!* 6. INITIALIZE SCALAR VARIABLES FOR CHEMISTRY +! ----------------------------------------- +! +! before calling chemistry +CCONF = 'START' +CSTORAGE_TYPE='TT' +CALL IO_File_close(TZEXPREFILE) ! Close the EXPRE file +! +IF ( LCH_INIT_FIELD ) CALL CH_INIT_FIELD_n(1, NLUOUT, NVERB) +! +!------------------------------------------------------------------------------- +! +!* 7. INITIALIZE LEVELSET FOR IBM +! --------------------------- +! +IF (LIBM_LSF) THEN + ! + ! In their current state, the IBM can only be used in + ! combination with cartesian coordinates and flat orography. + ! + IF ((CZS.NE."FLAT").OR.(.NOT.LCARTESIAN)) THEN + CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','IBM can only be used with flat ground') + ENDIF + ! + ALLOCATE(XIBM_LS(NIU,NJU,NKU,4)) + ! + CALL IBM_INIT_LS(XIBM_LS) + ! +ENDIF +! +!------------------------------------------------------------------------------- +! +!* 8. WRITE THE FMFILE +! ---------------- +! +CALL SECOND_MNH2(ZTIME1) +! +NNPRAR = 22 + 2*(NRR+NSV) & ! 22 = number of grid variables + reference + + 8 + 17 ! state variables + dimension variables + ! 2*(8+NRR+NSV) + 1 = number of prognostic + ! variables at time t and t-dt +NTYPE=1 +! +CALL IO_File_add2list(TINIFILE,TRIM(CINIFILE),'MNH','WRITE',KLFINPRAR=NNPRAR,KLFITYPE=NTYPE,KLFIVERB=NVERB) +! +CALL IO_File_open(TINIFILE) +! +CALL IO_Header_write(TINIFILE) +! +CALL WRITE_DESFM_n(1,TINIFILE) +! +CALL WRITE_LFIFM_n(TINIFILE,'') ! There is no DAD model for PREP_IDEAL_CASE +! +CALL SECOND_MNH2(ZTIME2) +! +XT_STORE = XT_STORE + ZTIME2 - ZTIME1 +! +!------------------------------------------------------------------------------- +! +!* 9. EXTERNALIZED SURFACE +! -------------------- +! +! +IF (CSURF =='EXTE') THEN + IF (LEN_TRIM(CINIFILEPGD)==0) THEN + IF (LEN_TRIM(CPGD_FILE)/=0) THEN + CINIFILEPGD=CPGD_FILE + ELSE + !callabortstop + CALL PRINT_MSG(NVERB_FATAL,'GEN','PREP_IDEAL_CASE','CINIFILEPGD needed in NAM_LUNITn') + ENDIF + ENDIF + CALL SURFEX_ALLOC_LIST(1) + YSURF_CUR => YSURF_LIST(1) + CALL READ_ALL_NAMELISTS(YSURF_CUR,'MESONH','PRE',.FALSE.) + ! Switch to model 1 surface variables + CALL GOTO_SURFEX(1) + !* definition of physiographic fields + ! computed ... + IF (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM) THEN + TPGDFILE => TINIFILE + CALL PGD_GRID_SURF_ATM(YSURF_CUR%UG, YSURF_CUR%U,YSURF_CUR%GCP,'MESONH',TINIFILE%CNAME,'MESONH',.TRUE.,HDIR='-') + CALL PGD_SURF_ATM (YSURF_CUR,'MESONH',TINIFILE%CNAME,'MESONH',.TRUE.) + CALL IO_File_add2list(TINIFILEPGD,TRIM(CINIFILEPGD),'PGD','WRITE',KLFINPRAR=NNPRAR,KLFITYPE=NTYPE,KLFIVERB=NVERB) + CALL IO_File_open (TINIFILEPGD) + TPGDFILE => TINIFILEPGD + ELSE + ! ... or read from file. + CALL INIT_PGD_SURF_ATM( YSURF_CUR, 'MESONH', 'PGD', & + ' ', ' ', & + TDTCUR%nyear, TDTCUR%nmonth, & + TDTCUR%nday, TDTCUR%xtime ) +! + END IF + ! + !* forces orography from atmospheric file + IF (.NOT. LREAD_ZS) CALL MNHPUT_ZS_n + ! + ! on ecrit un nouveau fichier PGD que s'il n'existe pas + IF (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM) THEN + !* writing of physiographic fields in the file + CSTORAGE_TYPE='PG' + ! + CALL IO_Header_write(TINIFILEPGD) + CALL IO_Field_write(TINIFILEPGD,'JPHEXT', JPHEXT) + CALL IO_Field_write(TINIFILEPGD,'SURF','EXTE') + CALL IO_Field_write(TINIFILEPGD,'L1D', L1D) + CALL IO_Field_write(TINIFILEPGD,'L2D', L2D) + CALL IO_Field_write(TINIFILEPGD,'PACK',LPACK) + CALL WRITE_HGRID(1,TINIFILEPGD) + ! + TOUTDATAFILE => TINIFILEPGD + ! + TFILE_SURFEX => TINIFILEPGD + ALLOCATE(YSURF_CUR%DUO%CSELECT(0)) + CALL WRITE_PGD_SURF_ATM_n(YSURF_CUR,'MESONH') + NULLIFY(TFILE_SURFEX) + CSTORAGE_TYPE='TT' + ENDIF + ! + ! + !* rereading of physiographic fields and definition of prognostic fields + !* writing of all surface fields + TOUTDATAFILE => TINIFILE + TFILE_SURFEX => TINIFILE + CALL PREP_SURF_MNH(' ',' ') + NULLIFY(TFILE_SURFEX) +ELSE + CSURF = "NONE" +END IF +! +!------------------------------------------------------------------------------- +! +!* 10. CLOSES THE FILE +! --------------- +! +IF (CSURF =='EXTE' .AND. (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM)) THEN + CALL IO_File_close(TINIFILEPGD) +ENDIF +CALL IO_File_close(TINIFILE) +IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN + CALL IO_File_close(TPGDFILE) +ENDIF +! +! +!------------------------------------------------------------------------------- +! +!* 11. PRINTS ON OUTPUT-LISTING +! ------------------------ +! +IF (NVERB >= 5) THEN + WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: LCARTESIAN,CIDEAL,CZS=', & + LCARTESIAN,CIDEAL,CZS + WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: LUSERV=',LUSERV + WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: XLON0,XLAT0,XBETA,XRPK,XLONORI,XLATORI=', & + XLON0,XLAT0,XBETA,XRPK,XLONORI,XLATORI + WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: XDELTAX,XDELTAY=',XDELTAX,XDELTAY + WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: NVERB=',NVERB + IF(LCARTESIAN) THEN + WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: No map projection used.' + ELSE + IF (XRPK == 1.) THEN + WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Polar stereo used.' + ELSE IF (XRPK == 0.) THEN + WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Mercator used.' + ELSE + WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: Lambert used, cone factor=',XRPK + END IF + END IF +END IF +! +IF (NVERB >= 5) THEN + WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: IIB, IJB, IKB=',NIB,NJB,NKB + WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE: IIU, IJU, IKU=',NIU,NJU,NKU +END IF +! +! +!* 28.1 print statistics! +! + ! + CALL SECOND_MNH2(ZTIME2) + XT_START=XT_START+ZTIME2-ZEND + ! + ! Set File Timing OUTPUT + ! + CALL SET_ILUOUT_TIMING(TLUOUT0) + ! + ! Compute global time + ! + CALL TIME_STAT_ll(XT_START,ZTOT) + ! + ! + IMI = 1 + CALL TIME_HEADER_ll(IMI) + ! + CALL TIME_STAT_ll(XT_STORE,ZTOT, ' STORE-FIELDS','=') + CALL TIMING_SEPARATOR('+') + CALL TIMING_SEPARATOR('+') + WRITE(YMI,FMT="(I0)") IMI + CALL TIME_STAT_ll(XT_START,ZTOT, ' MODEL'//YMI,'+') + CALL TIMING_SEPARATOR('+') + CALL TIMING_SEPARATOR('+') + CALL TIMING_SEPARATOR('+') +WRITE(NLUOUT,FMT=*) ' ' +WRITE(NLUOUT,FMT=*) '****************************************************' +WRITE(NLUOUT,FMT=*) '* PREP_IDEAL_CASE: PREP_IDEAL_CASE ENDS CORRECTLY. *' +WRITE(NLUOUT,FMT=*) '****************************************************' +! +CALL FINALIZE_MNH() +! +END PROGRAM PREP_IDEAL_CASE diff --git a/src/mesonh/ext/resolved_cloud.f90 b/src/mesonh/ext/resolved_cloud.f90 new file mode 100644 index 0000000000000000000000000000000000000000..fe77e35d3e53e33e750edcf23eaa01e24e32ea5d --- /dev/null +++ b/src/mesonh/ext/resolved_cloud.f90 @@ -0,0 +1,1064 @@ +!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. +!----------------------------------------------------------------- +! ########################## + MODULE MODI_RESOLVED_CLOUD +! ########################## +INTERFACE + SUBROUTINE RESOLVED_CLOUD ( HCLOUD, HACTCCN, HSCONV, HMF_CLOUD, & + KRR, KSPLITR, KSPLITG, KMI, KTCOUNT, & + HLBCX, HLBCY, TPFILE, HRAD, HTURBDIM, & + OSUBG_COND, OSIGMAS, HSUBG_AUCV, & + PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF, & + PPABST, PTHT, PRT, PSIGS, PSIGQSAT, PMFCONV, & + PTHM, PRCM, PPABSM, & + PW_ACT,PDTHRAD, PTHS, PRS, PSVT, PSVS, PSRCS, PCLDFR,& + PCIT, OSEDIC, OACTIT, OSEDC, OSEDI, & + ORAIN, OWARM, OHHONI, OCONVHG, & + PCF_MF,PRC_MF, PRI_MF, & + PINPRC,PINPRC3D,PINPRR,PINPRR3D, PEVAP3D, & + PINPRS,PINPRS3D,PINPRG,PINPRG3D,PINPRH,PINPRH3D, & + PSOLORG,PMI, & + PSPEEDC, PSPEEDR, PSPEEDS, PSPEEDG, PSPEEDH, & + PINDEP, PSUPSAT, PNACT, PNPRO,PSSPRO, PRAINFR, & + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & + PSEA,PTOWN ) +! +USE MODD_IO, ONLY: TFILEDATA +! +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud +CHARACTER(LEN=4), INTENT(IN) :: HACTCCN ! kind of CCN activation scheme + ! paramerization +CHARACTER(LEN=4), INTENT(IN) :: HSCONV ! Shallow convection scheme +CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD! Type of statistical cloud +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! integrations for rain sedimendation +INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step + ! integrations for ice sedimendation +INTEGER, INTENT(IN) :: KMI ! Model index +INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter +CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY ! X and Y-direc. LBC type +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Dimensionality of the + ! turbulence scheme +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid Cond. +LOGICAL, INTENT(IN) :: OSIGMAS ! Switch for Sigma_s: + ! use values computed in CONDENSATION + ! or that from turbulence scheme +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV + ! Kind of Subgrid autoconversion method +REAL, INTENT(IN) :: PTSTEP ! Time step :XTSTEP in namelist +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ !Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference dry air density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PRT ! Moist variables at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t +REAL, INTENT(IN) :: PSIGQSAT! coeff applied to qsat variance contribution +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-Dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure time t-Dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at time t-Dt +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_ACT ! W for CCN activation +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD! THeta RADiative Tendancy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable sources +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Scalar variable at time t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable sources +! +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice number + ! concentration at time t +LOGICAL, INTENT(IN) :: OSEDIC! Switch to activate the + ! cloud droplet sedimentation + ! for ICE3 +LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the + ! activation through temp. + ! evolution in C2R2 and KHKO +LOGICAL, INTENT(IN) :: OSEDC ! Switch to activate the + ! cloud droplet sedimentation + ! for C2R2 or KHKO +LOGICAL, INTENT(IN) :: OSEDI ! Switch to activate the + ! cloud crystal sedimentation +LOGICAL, INTENT(IN) :: ORAIN ! Switch to activate the + ! raindrop formation +LOGICAL, INTENT(IN) :: OWARM ! Control of the rain formation + ! by slow warm microphysical + ! processes +LOGICAL, INTENT(IN) :: OHHONI! enable haze freezing +LOGICAL, INTENT(IN) :: OCONVHG! Switch for conversion from + ! hail to graupel +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux solid mixing ratio +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! sed flux of precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! evap profile +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRC3D ! sed flux of precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRS3D ! sed flux of precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRG3D ! sed flux of precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRH3D ! sed flux of precip +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSOLORG ![%] solubility fraction of soa +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PMI +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDC ! Cloud sedimentation speed +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDR ! Rain sedimentation speed +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDS ! Snow sedimentation speed +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDG ! Graupel sedimentation speed +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDH ! Hail sedimentation speed +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSUPSAT !sursat +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNACT !concentrtaion d'aérosols activés au temps t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNPRO !concentrtaion d'aérosols activés au temps t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSSPRO !sursat +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR ! Rain fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLC_HRC !HighLow liquid content +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLC_HCF !HighLow liquid cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLI_HRI !HighLow ice content +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLI_HCF !HighLow ice clous fraction +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction +! +END SUBROUTINE RESOLVED_CLOUD +END INTERFACE +END MODULE MODI_RESOLVED_CLOUD +! +! ########################################################################## + SUBROUTINE RESOLVED_CLOUD ( HCLOUD, HACTCCN, HSCONV, HMF_CLOUD, & + KRR, KSPLITR, KSPLITG, KMI, KTCOUNT, & + HLBCX, HLBCY, TPFILE, HRAD, HTURBDIM, & + OSUBG_COND, OSIGMAS, HSUBG_AUCV, & + PTSTEP, PZZ, PRHODJ, PRHODREF, PEXNREF, & + PPABST, PTHT, PRT, PSIGS, PSIGQSAT, PMFCONV, & + PTHM, PRCM, PPABSM, & + PW_ACT,PDTHRAD, PTHS, PRS, PSVT, PSVS, PSRCS, PCLDFR,& + PCIT, OSEDIC, OACTIT, OSEDC, OSEDI, & + ORAIN, OWARM, OHHONI, OCONVHG, & + PCF_MF,PRC_MF, PRI_MF, & + PINPRC,PINPRC3D,PINPRR,PINPRR3D, PEVAP3D, & + PINPRS,PINPRS3D,PINPRG,PINPRG3D,PINPRH,PINPRH3D, & + PSOLORG,PMI, & + PSPEEDC, PSPEEDR, PSPEEDS, PSPEEDG, PSPEEDH, & + PINDEP, PSUPSAT, PNACT, PNPRO,PSSPRO, PRAINFR, & + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & + PSEA,PTOWN ) +! ########################################################################## +! +!!**** * - compute the resolved clouds and precipitation +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the microphysical sources +!! related to the resolved clouds and precipitation +!! +!! +!!** METHOD +!! ------ +!! The main actions of this routine is to call the routines computing the +!! microphysical sources. Before that: +!! - it computes the real absolute pressure, +!! - negative values of the current guess of all mixing ratio are removed. +!! This is done by a global filling algorithm based on a multiplicative +!! method (Rood, 1987), in order to conserved the total mass in the +!! simulation domain. +!! - Sources are transformed in physical tendencies, by removing the +!! multiplicative term Rhod*J. +!! - External points values are filled owing to the use of cyclic +!! l.b.c., in order to performe computations on the full domain. +!! After calling to microphysical routines, the physical tendencies are +!! switched back to prognostic variables. +!! +!! +!! EXTERNAL +!! -------- +!! Subroutine SLOW_TERMS: Computes the explicit microphysical sources +!! Subroutine FAST_TERMS: Performs the saturation adjustment for l +!! Subroutine RAIN_ICE : Computes the explicit microphysical sources for i +!! Subroutine ICE_ADJUST: Performs the saturation adjustment for i+l +!! MIN_ll,SUM3D_ll : distributed functions equivalent to MIN and SUM +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_PARAMETERS : contains declarations of parameter variables +!! JPHEXT : Horizontal external points number +!! JPVEXT : Vertical external points number +!! Module MODD_CST +!! XP00 ! Reference pressure +!! XRD ! Gaz constant for dry air +!! XCPD ! Cpd (dry air) +!! +!! REFERENCE +!! --------- +!! +!! Book1 and book2 of documentation ( routine RESOLVED_CLOUD ) +!! +!! AUTHOR +!! ------ +!! E. Richard * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 21/12/94 +!! Modifications: June 8, 1995 ( J.Stein ) +!! Cleaning to improve efficienty and clarity +!! in agreement with the MESO-NH coding norm +!! March 1, 1996 ( J.Stein ) +!! store the cloud fraction +!! March 18, 1996 ( J.Stein ) +!! check that ZMASSPOS /= 0 +!! Oct. 12, 1996 ( J.Stein ) +!! remove the negative values correction +!! for the KES2 case +!! Modifications: Dec 14, 1995 (J.-P. Pinty) +!! Add the mixed-phase option +!! Modifications: Jul 01, 1996 (J.-P. Pinty) +!! Change arg. list in routine FAST_TERMS +!! Modifications: Jan 27, 1997 (J.-P. Pinty) +!! add W and SV in arg. list +!! Modifications: March 23, 98 (E.Richard) +!! correction of negative value based on +!! rv+rc+ri and thetal or thetail conservation +!! Modifications: April 08, 98 (J.-P. Lafore and V. Ducrocq ) +!! modify the correction of negative values +!! Modifications: June 08, 00 (J.-P. Pinty and J.-M. Cohard) +!! add the C2R2 scheme +!! Modifications: April 08, 01 (J.-P. Pinty) +!! add the C3R5 scheme +!! Modifications: July 21, 01 (J.-P. Pinty) +!! Add OHHONI and PW_ACT (for haze freezing) +!! Modifications: Sept 21, 01 (J.-P. Pinty) +!! Add XCONC_CCN limitation +!! Modifications: Nov 21, 02 (J.-P. Pinty) +!! Add ICE4 and C3R5 options +!! June, 2005 (V. Masson) +!! Technical change in interface for scalar arguments +!! Modifications : March, 2006 (O.Geoffroy) +!! Add KHKO scheme +!! Modifications : March 2013 (O.Thouron) +!! Add prognostic supersaturation +!! July, 2015 (O.Nuissier/F.Duffourg) Add microphysics diagnostic for +!! aircraft, ballon and profiler +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! M.Mazoyer : 04/2016 : Temperature radiative tendency used for +!! activation by cooling (OACTIT) +!! Modification 01/2016 (JP Pinty) Add LIMA +!! 10/2016 M.Mazoyer New KHKO output fields +!! 10/2016 (C.Lac) Add droplet deposition +!! S.Riette : 11/2016 : ice_adjust before and after rain_ice +!! ICE3/ICE4 modified, old version under LRED=F +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 01/02/2019: ZRSMIN is now allocatable (instead of size of XRTMIN which was sometimes not allocated) +! C. Lac 02/2019: add rain fraction as an output field +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! B. Vie 03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets +! B. Vie 03/03/2020: use DTHRAD instead of dT/dt in Smax diagnostic computation +! P. Wautelet 11/06/2020: bugfix: correct ZSVS array indices +! P. Wautelet 11/06/2020: bugfix: add "Non local correction for precipitating species" for ICE4 +! P. Wautelet + Benoit Vié 06/2020: improve removal of negative scalar variables + adapt the corresponding budgets +! P. Wautelet 23/06/2020: remove ZSVS and ZSVT to improve code readability +! P. Wautelet 30/06/2020: move removal of negative scalar variables to Sources_neg_correct +! P. Wautelet 30/06/2020: remove non-local corrections +! B. Vie 06/2020: add prognostic supersaturation for LIMA +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +USE MODD_BUDGET, ONLY: TBUDGETS +USE MODD_CH_AEROSOL, ONLY: LORILAM +USE MODD_DUST, ONLY: LDUST +use modd_cst, only: xcpd, xrd, xp00, xrholw +USE MODD_DUST , ONLY: LDUST +USE MODD_IO, ONLY: TFILEDATA +USE MODD_NSV, ONLY: NSV_C1R3END, NSV_C2R2BEG, NSV_C2R2END, & + NSV_LIMA_BEG, NSV_LIMA_END, NSV_LIMA_CCN_FREE, NSV_LIMA_IFN_FREE, & + NSV_LIMA_NC, NSV_LIMA_NI, NSV_LIMA_NR +USE MODD_PARAM_C2R2, ONLY: LSUPSAT +USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT +USE MODD_PARAM_ICE, ONLY: CSEDIM, LADJ_BEFORE, LADJ_AFTER, CFRAC_ICE_ADJUST, LRED +USE MODD_PARAM_LIMA, ONLY: LADJ, LCOLD, LPTSPLIT, LSPRO, NMOD_CCN, NMOD_IFN, NMOD_IMM +USE MODD_RAIN_ICE_DESCR, ONLY: XRTMIN +USE MODD_SALT, ONLY: LSALT +USE MODD_TURB_n, ONLY: CSUBG_AUCV_RI, CCONDENS, CLAMBDA3, CSUBG_MF_PDF +! +USE MODE_ll +use mode_sources_neg_correct, only: Sources_neg_correct +! +USE MODI_C2R2_ADJUST +USE MODI_FAST_TERMS +USE MODI_GET_HALO +USE MODI_ICE_ADJUST +USE MODI_KHKO_NOTADJUST +USE MODI_LIMA +USE MODI_LIMA_ADJUST +USE MODI_LIMA_ADJUST_SPLIT +USE MODI_LIMA_COLD +USE MODI_LIMA_MIXED +USE MODI_LIMA_NOTADJUST +USE MODI_LIMA_WARM +USE MODI_RAIN_C2R2_KHKO +USE MODI_RAIN_ICE_RED +USE MODI_SHUMAN +USE MODI_SLOW_TERMS +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +! +CHARACTER(LEN=4), INTENT(IN) :: HCLOUD ! kind of cloud paramerization +CHARACTER(LEN=4), INTENT(IN) :: HACTCCN ! kind of CCN activation scheme +CHARACTER(LEN=4), INTENT(IN) :: HSCONV ! Shallow convection scheme +CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD! Type of statistical cloud +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +INTEGER, INTENT(IN) :: KSPLITR ! Number of small time step + ! integrations for rain sedimendation +INTEGER, INTENT(IN) :: KSPLITG ! Number of small time step + ! integrations for ice sedimendation +INTEGER, INTENT(IN) :: KMI ! Model index +INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter +CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY ! X and Y-direc. LBC type +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Dimensionality of the + ! turbulence scheme +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid Cond. +LOGICAL, INTENT(IN) :: OSIGMAS ! Switch for Sigma_s: + ! use values computed in CONDENSATION + ! or that from turbulence scheme +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV + ! Kind of Subgrid autoconversion method +REAL, INTENT(IN) :: PTSTEP ! Time step :XTSTEP in namelist +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ !Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF! Reference dry air density +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! abs. pressure at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT):: PRT ! Moist variables at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t +REAL, INTENT(IN) :: PSIGQSAT! coeff applied to qsat variance contribution +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at time t-Dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure time t-Dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCM ! Cloud water m.r. at time t-Dt +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PW_ACT ! W for CCN activation +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTHRAD! THeta RADiative Tendancy +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRS ! Moist variable sources +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVT ! Scalar variable at time t +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS ! Scalar variable sources +! +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCLDFR! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PCIT ! Pristine ice number + ! concentration at time t +LOGICAL, INTENT(IN) :: OSEDIC! Switch to activate the + ! cloud droplet sedimentation + ! for ICE3 +LOGICAL, INTENT(IN) :: OACTIT ! Switch to activate the + ! activation through temp. + ! evolution in C2R2 and KHKO +LOGICAL, INTENT(IN) :: OSEDC ! Switch to activate the + ! cloud droplet sedimentation +LOGICAL, INTENT(IN) :: OSEDI ! Switch to activate the + ! cloud crystal sedimentation +LOGICAL, INTENT(IN) :: ORAIN ! Switch to activate the + ! raindrop formation +LOGICAL, INTENT(IN) :: OWARM ! Control of the rain formation + ! by slow warm microphysical + ! processes +LOGICAL, INTENT(IN) :: OHHONI! enable haze freezing +LOGICAL, INTENT(IN) :: OCONVHG! Switch for conversion from + ! hail to graupel +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux solid mixing ratio +! +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! sed flux of precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D ! evap profile +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRC3D ! sed flux of precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRS3D ! sed flux of precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRG3D ! sed flux of precip +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRH3D ! sed flux of precip +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSOLORG ![%] solubility fraction of soa +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PMI +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDC ! Cloud sedimentation speed +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDR ! Rain sedimentation speed +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDS ! Snow sedimentation speed +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDG ! Graupel sedimentation speed +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSPEEDH ! Hail sedimentation speed +REAL, DIMENSION(:,:), INTENT(INOUT) :: PINDEP ! Cloud instant deposition +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSUPSAT !sursat +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNACT !concentrtaion d'aérosols activés au temps t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PNPRO !concentrtaion d'aérosols activés au temps t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSSPRO !sursat +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR ! Rain fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLC_HRC !HighLow liquid content +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLC_HCF !HighLow liquid cloud fraction +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLI_HRI !HighLow ice content +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PHLI_HCF !HighLow ice clous fraction +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask +REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction +! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JRR,JSV ! Loop index for the moist and scalar variables +INTEGER :: IIB ! Define the physical domain +INTEGER :: IIE ! +INTEGER :: IJB ! +INTEGER :: IJE ! +INTEGER :: IKB ! +INTEGER :: IKE ! +INTEGER :: IKU +INTEGER :: IINFO_ll ! return code of parallel routine +INTEGER :: JK,JI,JL +! +! +! +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZDZZ +real, dimension(:,:,:), allocatable :: ZEXN +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZZZ + ! model layer height +! REAL :: ZMASSTOT ! total mass for one water category +! ! including the negative values +! REAL :: ZMASSPOS ! total mass for one water category +! ! after removing the negative values +! REAL :: ZRATIO ! ZMASSTOT / ZMASSCOR +! +INTEGER :: ISVBEG ! first scalar index for microphysics +INTEGER :: ISVEND ! last scalar index for microphysics +REAL, DIMENSION(:), ALLOCATABLE :: ZRSMIN ! Minimum value for tendencies +LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: LLMICRO ! mask to limit computation +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3), KRR) :: ZFPR +! +INTEGER :: JMOD, JMOD_IFN +LOGICAL :: GWEST,GEAST,GNORTH,GSOUTH +! BVIE work array waiting for PINPRI +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)):: ZINPRI +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZICEFR +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZPRCFR +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZTM +REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZSIGQSAT2D +ZSIGQSAT2D(:,:) = PSIGQSAT +! +!------------------------------------------------------------------------------ +! +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ +! +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +IKB=1+JPVEXT +IKE=SIZE(PZZ,3) - JPVEXT +IKU=SIZE(PZZ,3) +! +GWEST = LWEST_ll() +GEAST = LEAST_ll() +GSOUTH = LSOUTH_ll() +GNORTH = LNORTH_ll() +! +IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO') THEN + ISVBEG = NSV_C2R2BEG + ISVEND = NSV_C2R2END +ELSE IF (HCLOUD == 'C3R5') THEN + ISVBEG = NSV_C2R2BEG + ISVEND = NSV_C1R3END +ELSE IF (HCLOUD == 'LIMA') THEN + ISVBEG = NSV_LIMA_BEG + ISVEND = NSV_LIMA_END +ELSE + ISVBEG = 0 + ISVEND = -1 +END IF +! +IF (HCLOUD(1:3)=='ICE' .AND. LRED) THEN + ALLOCATE(ZRSMIN(SIZE(XRTMIN))) + ZRSMIN(:) = XRTMIN(:) / PTSTEP +END IF +! +!* 2. TRANSFORMATION INTO PHYSICAL TENDENCIES +! --------------------------------------- +! +PTHS(:,:,:) = PTHS(:,:,:) / PRHODJ(:,:,:) +DO JRR = 1,KRR + PRS(:,:,:,JRR) = PRS(:,:,:,JRR) / PRHODJ(:,:,:) +END DO +! +IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN + DO JSV = ISVBEG, ISVEND + PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) / PRHODJ(:,:,:) + ENDDO +ENDIF +! +! complete the lateral boundaries to avoid possible problems +! +DO JI=1,JPHEXT + PTHS(JI,:,:) = PTHS(IIB,:,:) + PTHS(IIE+JI,:,:) = PTHS(IIE,:,:) + PTHS(:,JI,:) = PTHS(:,IJB,:) + PTHS(:,IJE+JI,:) = PTHS(:,IJE,:) +! + PRS(JI,:,:,:) = PRS(IIB,:,:,:) + PRS(IIE+JI,:,:,:) = PRS(IIE,:,:,:) + PRS(:,JI,:,:) = PRS(:,IJB,:,:) + PRS(:,IJE+JI,:,:) = PRS(:,IJE,:,:) +END DO +! +! complete the physical boundaries to avoid some computations +! +IF(GWEST .AND. HLBCX(1) /= 'CYCL') PRT(:IIB-1,:,:,2:) = 0.0 +IF(GEAST .AND. HLBCX(2) /= 'CYCL') PRT(IIE+1:,:,:,2:) = 0.0 +IF(GSOUTH .AND. HLBCY(1) /= 'CYCL') PRT(:,:IJB-1,:,2:) = 0.0 +IF(GNORTH .AND. HLBCY(2) /= 'CYCL') PRT(:,IJE+1:,:,2:) = 0.0 +! +IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN +DO JI=1,JPHEXT + PSVS(JI, :, :, ISVBEG:ISVEND) = PSVS(IIB, :, :, ISVBEG:ISVEND) + PSVS(IIE+JI, :, :, ISVBEG:ISVEND) = PSVS(IIE, :, :, ISVBEG:ISVEND) + PSVS(:, JI, :, ISVBEG:ISVEND) = PSVS(:, IJB, :, ISVBEG:ISVEND) + PSVS(:, IJE+JI, :, ISVBEG:ISVEND) = PSVS(:, IJE, :, ISVBEG:ISVEND) +END DO + ! +! complete the physical boundaries to avoid some computations +! + IF(GWEST .AND. HLBCX(1) /= 'CYCL') PSVT(:IIB-1, :, :, ISVBEG:ISVEND) = 0.0 + IF(GEAST .AND. HLBCX(2) /= 'CYCL') PSVT(IIE+1:, :, :, ISVBEG:ISVEND) = 0.0 + IF(GSOUTH .AND. HLBCY(1) /= 'CYCL') PSVT(:, :IJB-1, :, ISVBEG:ISVEND) = 0.0 + IF(GNORTH .AND. HLBCY(2) /= 'CYCL') PSVT(:, IJE+1:, :, ISVBEG:ISVEND) = 0.0 +ENDIF +! +! complete the vertical boundaries +! +PTHS(:,:,IKB-1) = PTHS(:,:,IKB) +PTHS(:,:,IKE+1) = PTHS(:,:,IKE) +! +PRS(:,:,IKB-1,:) = PRS(:,:,IKB,:) +PRS(:,:,IKE+1,:) = PRS(:,:,IKE,:) +! +PRT(:,:,IKB-1,:) = PRT(:,:,IKB,:) +PRT(:,:,IKE+1,:) = PRT(:,:,IKE,:) +! +IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' .OR. HCLOUD == 'KHKO' & + .OR. HCLOUD == 'LIMA') THEN + PSVS(:,:,IKB-1,ISVBEG:ISVEND) = PSVS(:,:,IKB,ISVBEG:ISVEND) + PSVS(:,:,IKE+1,ISVBEG:ISVEND) = PSVS(:,:,IKE,ISVBEG:ISVEND) + PSVT(:,:,IKB-1,ISVBEG:ISVEND) = PSVT(:,:,IKB,ISVBEG:ISVEND) + PSVT(:,:,IKE+1,ISVBEG:ISVEND) = PSVT(:,:,IKE,ISVBEG:ISVEND) +ENDIF +! +! +!* 3. REMOVE NEGATIVE VALUES +! ---------------------- +! +!* 3.1 Non local correction for precipitating species (Rood 87) +! +! IF ( HCLOUD == 'KESS' & +! .OR. HCLOUD == 'ICE3' .OR. HCLOUD == 'ICE4' & +! .OR. HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' & +! .OR. HCLOUD == 'KHKO' .OR. HCLOUD == 'LIMA' ) THEN +! ! +! DO JRR = 3,KRR +! SELECT CASE (JRR) +! CASE(3,5,6,7) ! rain, snow, graupel and hail +! +! IF ( MIN_ll( PRS(:,:,:,JRR), IINFO_ll) < 0.0 ) THEN +! ! +! ! compute the total water mass computation +! ! +! ZMASSTOT = MAX( 0. , SUM3D_ll( PRS(:,:,:,JRR), IINFO_ll ) ) +! ! +! ! remove the negative values +! ! +! PRS(:,:,:,JRR) = MAX( 0., PRS(:,:,:,JRR) ) +! ! +! ! compute the new total mass +! ! +! ZMASSPOS = MAX(XMNH_TINY,SUM3D_ll( PRS(:,:,:,JRR), IINFO_ll ) ) +! ! +! ! correct again in such a way to conserve the total mass +! ! +! ZRATIO = ZMASSTOT / ZMASSPOS +! PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * ZRATIO +! ! +! END IF +! END SELECT +! END DO +! END IF +! +!* 3.2 Adjustement for liquid and solid cloud +! +! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets +call Sources_neg_correct( hcloud, 'NEGA', krr, ptstep, ppabst, ptht, prt, pths, prs, psvs, prhodj ) +! +!* 3.4 Limitations of Na and Nc to the CCN max number concentration +! +! Commented by O.Thouron 03/2013 +!IF ((HCLOUD == 'C2R2' .OR. HCLOUD == 'C3R5' .OR. HCLOUD == 'KHKO') & +! .AND.(XCONC_CCN > 0)) THEN +! IF ((HACTCCN /= 'ABRK')) THEN +! ZSVT(:,:,:,1) = MIN( ZSVT(:,:,:,1),XCONC_CCN ) +! ZSVT(:,:,:,2) = MIN( ZSVT(:,:,:,2),XCONC_CCN ) +! ZSVS(:,:,:,1) = MIN( ZSVS(:,:,:,1),XCONC_CCN ) +! ZSVS(:,:,:,2) = MIN( ZSVS(:,:,:,2),XCONC_CCN ) +! END IF +!END IF +! +! +!------------------------------------------------------------------------------- +! +SELECT CASE ( HCLOUD ) + CASE ('REVE') +! +!* 4. REVERSIBLE MICROPHYSICAL SCHEME +! ------------------------------- +! + CALL FAST_TERMS ( KRR, KMI, HRAD, HTURBDIM, & + HSCONV, HMF_CLOUD, OSUBG_COND, PTSTEP, & + PRHODJ, PSIGS, PPABST, & + PCF_MF,PRC_MF, & + PRVT=PRT(:,:,:,1), PRCT=PRT(:,:,:,2), & + PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & + PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR ) +! + CASE ('KESS') +! +!* 5. KESSLER MICROPHYSICAL SCHEME +! ---------------------------- +! +! +!* 5.1 Compute the explicit microphysical sources +! + CALL SLOW_TERMS ( KSPLITR, PTSTEP, KMI, HSUBG_AUCV, & + PZZ, PRHODJ, PRHODREF, PCLDFR, & + PTHT, PRT(:,:,:,1), PRT(:,:,:,2), PRT(:,:,:,3), PPABST, & + PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & + PINPRR, PINPRR3D, PEVAP3D ) +! +!* 5.2 Perform the saturation adjustment +! + CALL FAST_TERMS ( KRR, KMI, HRAD, HTURBDIM, & + HSCONV, HMF_CLOUD, OSUBG_COND, PTSTEP, & + PRHODJ, PSIGS, PPABST, & + PCF_MF,PRC_MF, & + PRVT=PRT(:,:,:,1), PRCT=PRT(:,:,:,2), & + PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), PRRS=PRS(:,:,:,3), & + PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR ) +! +! + CASE ('C2R2','KHKO') +! +!* 7. 2-MOMENT WARM MICROPHYSICAL SCHEME C2R2 or KHKO +! --------------------------------------- +! +! +!* 7.1 Compute the explicit microphysical sources +! +! + CALL RAIN_C2R2_KHKO ( HCLOUD, OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & + TPFILE, PZZ, PRHODJ, PRHODREF, PEXNREF, & + PPABST, PTHT, PRT(:,:,:,1), PRT(:,:,:,2), PRT(:,:,:,3), & + PTHM, PRCM, PPABSM, & + PW_ACT,PDTHRAD,PTHS, PRS(:,:,:,1),PRS(:,:,:,2),PRS(:,:,:,3), & + PSVT(:,:,:,NSV_C2R2BEG), PSVT(:,:,:,NSV_C2R2BEG+1), & + PSVT(:,:,:,NSV_C2R2BEG+2), PSVS(:,:,:,NSV_C2R2BEG), & + PSVS(:,:,:,NSV_C2R2BEG+1), PSVS(:,:,:,NSV_C2R2BEG+2), & + PINPRC, PINPRR, PINPRR3D, PEVAP3D , & + PSVT(:,:,:,:), PSOLORG, PMI, HACTCCN, & + PINDEP, PSUPSAT, PNACT ) +! +! +!* 7.2 Perform the saturation adjustment +! + IF (LSUPSAT) THEN + CALL KHKO_NOTADJUST (KRR, KTCOUNT,TPFILE, HRAD, & + PTSTEP, PRHODJ, PPABSM, PPABST, PRHODREF, PZZ, & + PTHT,PRT(:,:,:,1),PRT(:,:,:,2),PRT(:,:,:,3), & + PTHS,PRS(:,:,:,1),PRS(:,:,:,2),PRS(:,:,:,3), & + PSVS(:,:,:,NSV_C2R2BEG+1), PSVS(:,:,:,NSV_C2R2BEG), & + PSVS(:,:,:,NSV_C2R2BEG+3), PCLDFR, PSRCS, PNPRO, PSSPRO ) +! + ELSE + CALL C2R2_ADJUST ( KRR,TPFILE, HRAD, & + HTURBDIM, OSUBG_COND, PTSTEP, & + PRHODJ, PSIGS, PPABST, & + PTHS=PTHS, PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & + PCNUCS=PSVS(:,:,:,NSV_C2R2BEG), & + PCCS=PSVS(:,:,:,NSV_C2R2BEG+1), & + PSRCS=PSRCS, PCLDFR=PCLDFR, PRRS=PRS(:,:,:,3) ) +! + END IF +! + CASE ('ICE3') +! +!* 9. MIXED-PHASE MICROPHYSICAL SCHEME (WITH 3 ICE SPECIES) +! ----------------------------------------------------- +! + allocate( zexn( size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) ) + ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) +! +!* 9.1 Compute the explicit microphysical sources +! +! + DO JK=IKB,IKE + ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) + ENDDO + ZZZ = MZF( PZZ ) + IF(LRED .AND. LADJ_BEFORE) THEN + CALL ICE_ADJUST (1, IKU, 1, KRR, CFRAC_ICE_ADJUST, CCONDENS, CLAMBDA3, & + 'ADJU', OSUBG_COND, OSIGMAS, .FALSE., CSUBG_MF_PDF, & + PTSTEP, ZSIGQSAT2D, & + PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABST, ZZZ, & + ZEXN, PCF_MF, PRC_MF, PRI_MF, & + PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & + PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & + PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR, & + PRR=PRS(:,:,:,3)*PTSTEP, & + PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & + PRS=PRS(:,:,:,5)*PTSTEP, & + PRG=PRS(:,:,:,6)*PTSTEP, & + TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & + PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & + PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) + ENDIF + IF (LRED) THEN + LLMICRO(:,:,:)=PRT(:,:,:,2)>XRTMIN(2) .OR. & + PRT(:,:,:,3)>XRTMIN(3) .OR. & + PRT(:,:,:,4)>XRTMIN(4) .OR. & + PRT(:,:,:,5)>XRTMIN(5) .OR. & + PRT(:,:,:,6)>XRTMIN(6) + LLMICRO(:,:,:)=LLMICRO(:,:,:) .OR. & + PRS(:,:,:,2)>ZRSMIN(2) .OR. & + PRS(:,:,:,3)>ZRSMIN(3) .OR. & + PRS(:,:,:,4)>ZRSMIN(4) .OR. & + PRS(:,:,:,5)>ZRSMIN(5) .OR. & + PRS(:,:,:,6)>ZRSMIN(6) + CALL RAIN_ICE_RED (COUNT(LLMICRO), SIZE(PTHT, 1), SIZE(PTHT, 2), & + SIZE(PTHT, 3), COUNT(LLMICRO), & + OSEDIC, .FALSE.,CSEDIM, HSUBG_AUCV, CSUBG_AUCV_RI,& + OWARM,1,IKU,1, & + PTSTEP, KRR, LLMICRO, ZEXN, & + ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT,PCLDFR,& + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & + PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & + PRT(:,:,:,3), PRT(:,:,:,4), & + PRT(:,:,:,5), PRT(:,:,:,6), & + PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & + PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & + PINPRC,PINPRR, PEVAP3D, & + PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & + TBUDGETS,SIZE(TBUDGETS), & + PSEA,PTOWN, PFPR=ZFPR ) + ELSE + CALL RAIN_ICE_RED (COUNT(LLMICRO), SIZE(PTHT, 1), SIZE(PTHT, 2), & + SIZE(PTHT, 3), COUNT(LLMICRO), & + OSEDIC, .FALSE.,CSEDIM, HSUBG_AUCV, CSUBG_AUCV_RI,& + OWARM,1,IKU,1, & + PTSTEP, KRR, LLMICRO, ZEXN, & + ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT,PCLDFR,& + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & + PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & + PRT(:,:,:,3), PRT(:,:,:,4), & + PRT(:,:,:,5), PRT(:,:,:,6), & + PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & + PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & + PINPRC,PINPRR, PEVAP3D, & + PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & + TBUDGETS,SIZE(TBUDGETS), & + PSEA,PTOWN, PFPR=ZFPR ) + END IF +! +!* 9.2 Perform the saturation adjustment over cloud ice and cloud water +! +! + IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN + CALL ICE_ADJUST (1, IKU, 1, KRR, CFRAC_ICE_ADJUST, CCONDENS, CLAMBDA3, & + 'DEPI', OSUBG_COND, OSIGMAS, .FALSE.,CSUBG_MF_PDF, & + PTSTEP, ZSIGQSAT2D, & + PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABST, ZZZ, & + ZEXN, PCF_MF, PRC_MF, PRI_MF, & + PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & + PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & + PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR, & + PRR=PRS(:,:,:,3)*PTSTEP, & + PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & + PRS=PRS(:,:,:,5)*PTSTEP, & + PRG=PRS(:,:,:,6)*PTSTEP, & + TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & + PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & + PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) + END IF + + deallocate( zexn ) +! + CASE ('ICE4') +! +!* 10. MIXED-PHASE MICROPHYSICAL SCHEME (WITH 4 ICE SPECIES) +! ----------------------------------------------------- +! + allocate( zexn( size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) ) + ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) +! +!* 10.1 Compute the explicit microphysical sources +! +! + DO JK=IKB,IKE + ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) + ENDDO + ZZZ = MZF( PZZ ) + IF(LRED .AND. LADJ_BEFORE) THEN + CALL ICE_ADJUST (1, IKU, 1, KRR, CFRAC_ICE_ADJUST, CCONDENS, CLAMBDA3, & + 'ADJU', OSUBG_COND, OSIGMAS, .FALSE., CSUBG_MF_PDF, & + PTSTEP, ZSIGQSAT2D, & + PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABST, ZZZ, & + ZEXN, PCF_MF, PRC_MF, PRI_MF, & + PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & + PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & + PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR, & + PRR=PRS(:,:,:,3)*PTSTEP, & + PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & + PRS=PRS(:,:,:,5)*PTSTEP, & + PRG=PRS(:,:,:,6)*PTSTEP, & + TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & + PRH=PRS(:,:,:,7)*PTSTEP, & + PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & + PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) + ENDIF + IF (LRED) THEN + LLMICRO(:,:,:)=PRT(:,:,:,2)>XRTMIN(2) .OR. & + PRT(:,:,:,3)>XRTMIN(3) .OR. & + PRT(:,:,:,4)>XRTMIN(4) .OR. & + PRT(:,:,:,5)>XRTMIN(5) .OR. & + PRT(:,:,:,6)>XRTMIN(6) .OR. & + PRT(:,:,:,7)>XRTMIN(7) + LLMICRO(:,:,:)=LLMICRO(:,:,:) .OR. & + PRS(:,:,:,2)>ZRSMIN(2) .OR. & + PRS(:,:,:,3)>ZRSMIN(3) .OR. & + PRS(:,:,:,4)>ZRSMIN(4) .OR. & + PRS(:,:,:,5)>ZRSMIN(5) .OR. & + PRS(:,:,:,6)>ZRSMIN(6) .OR. & + PRS(:,:,:,7)>ZRSMIN(7) + CALL RAIN_ICE_RED (COUNT(LLMICRO), SIZE(PTHT, 1), SIZE(PTHT, 2), SIZE(PTHT, 3),& + COUNT(LLMICRO), OSEDIC, .FALSE., CSEDIM, HSUBG_AUCV, CSUBG_AUCV_RI,& + OWARM, 1, IKU, 1, & + PTSTEP, KRR, LLMICRO, ZEXN, & + ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,& + PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & + PRT(:,:,:,3), PRT(:,:,:,4), & + PRT(:,:,:,5), PRT(:,:,:,6), & + PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & + PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & + PINPRC, PINPRR, PEVAP3D, & + PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & + TBUDGETS,SIZE(TBUDGETS), & + PSEA, PTOWN, & + PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR ) + + ELSE + CALL RAIN_ICE_RED (COUNT(LLMICRO), SIZE(PTHT, 1), SIZE(PTHT, 2), SIZE(PTHT, 3),& + COUNT(LLMICRO), OSEDIC, .FALSE., CSEDIM, HSUBG_AUCV, CSUBG_AUCV_RI,& + OWARM, 1, IKU, 1, & + PTSTEP, KRR, LLMICRO, ZEXN, & + ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,& + PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & + PRT(:,:,:,3), PRT(:,:,:,4), & + PRT(:,:,:,5), PRT(:,:,:,6), & + PTHS, PRS(:,:,:,1), PRS(:,:,:,2), PRS(:,:,:,3), & + PRS(:,:,:,4), PRS(:,:,:,5), PRS(:,:,:,6), & + PINPRC, PINPRR, PEVAP3D, & + PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & + TBUDGETS,SIZE(TBUDGETS), & + PSEA, PTOWN, & + PRT(:,:,:,7), PRS(:,:,:,7), PINPRH, PFPR=ZFPR ) + END IF + + +! +!* 10.2 Perform the saturation adjustment over cloud ice and cloud water +! + IF (.NOT. LRED .OR. (LRED .AND. LADJ_AFTER) ) THEN + CALL ICE_ADJUST (1, IKU, 1, KRR, CFRAC_ICE_ADJUST, CCONDENS, CLAMBDA3, & + 'DEPI', OSUBG_COND, OSIGMAS, .FALSE., CSUBG_MF_PDF, & + PTSTEP, ZSIGQSAT2D, & + PRHODJ, PEXNREF, PRHODREF, PSIGS, PMFCONV, PPABST, ZZZ, & + ZEXN, PCF_MF, PRC_MF, PRI_MF, & + PRV=PRS(:,:,:,1)*PTSTEP, PRC=PRS(:,:,:,2)*PTSTEP, & + PRVS=PRS(:,:,:,1), PRCS=PRS(:,:,:,2), & + PTH=PTHS*PTSTEP, PTHS=PTHS, PSRCS=PSRCS, PCLDFR=PCLDFR, & + PRR=PRS(:,:,:,3)*PTSTEP, & + PRI=PRS(:,:,:,4)*PTSTEP, PRIS=PRS(:,:,:,4), & + PRS=PRS(:,:,:,5)*PTSTEP, & + PRG=PRS(:,:,:,6)*PTSTEP, & + TBUDGETS=TBUDGETS,KBUDGETS=SIZE(TBUDGETS), & + PRH=PRS(:,:,:,7)*PTSTEP, & + PHLC_HRC=PHLC_HRC, PHLC_HCF=PHLC_HCF, & + PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) + END IF + + deallocate( zexn ) +! +! +!* 12. 2-MOMENT MIXED-PHASE MICROPHYSICAL SCHEME LIMA +! -------------------------------------------------------------- +! +! +!* 12.1 Compute the explicit microphysical sources +! + CASE ('LIMA') + ! + DO JK=IKB,IKE + ZDZZ(:,:,JK)=PZZ(:,:,JK+1)-PZZ(:,:,JK) + ENDDO + ZZZ = MZF( PZZ ) + IF (LPTSPLIT) THEN + CALL LIMA (1, IKU, 1, & + PTSTEP, TPFILE, & + PRHODREF, PEXNREF, ZDZZ, & + PRHODJ, PPABSM, PPABST, & + NMOD_CCN, NMOD_IFN, NMOD_IMM, & + PDTHRAD, PTHT, PRT, & + PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), PW_ACT, & + PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PINPRC, PINDEP, PINPRR, ZINPRI, PINPRS, PINPRG, PINPRH, & + PEVAP3D, PCLDFR, ZICEFR, ZPRCFR ) + ELSE + + IF (OWARM) CALL LIMA_WARM(OACTIT, OSEDC, ORAIN, KSPLITR, PTSTEP, KMI, & + TPFILE, KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PW_ACT, PPABSM, PPABST, & + PDTHRAD, PRCM, & + PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PINPRC, PINPRR, PINDEP, PINPRR3D, PEVAP3D ) +! + IF (LCOLD) CALL LIMA_COLD(OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & + KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_ACT, & + PTHM, PPABSM, & + PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PINPRS, PINPRG, PINPRH ) +! + IF (OWARM .AND. LCOLD) CALL LIMA_MIXED(OSEDI, OHHONI, KSPLITG, PTSTEP, KMI, & + KRR, PZZ, PRHODJ, & + PRHODREF, PEXNREF, PPABST, PW_ACT, & + PTHM, PPABSM, & + PTHT, PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PTHS, PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END) ) + ENDIF +! +!* 12.2 Perform the saturation adjustment +! + IF (LSPRO) THEN + CALL LIMA_NOTADJUST (KMI, TPFILE, HRAD, & + PTSTEP, PRHODJ, PPABSM, PPABST, PRHODREF, PEXNREF, PZZ, & + PTHT,PRT, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PTHS,PRS, PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PCLDFR, PSRCS ) + ELSE IF (LPTSPLIT) THEN + CALL LIMA_ADJUST_SPLIT(KRR, KMI, TPFILE, CCONDENS, CLAMBDA3, & + OSUBG_COND, OSIGMAS, PTSTEP, PSIGQSAT, & + PRHODREF, PRHODJ, PEXNREF, PPABST, PSIGS, PMFCONV, PPABST, ZZZ, & + PDTHRAD, PW_ACT, & + PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PTHS, PSRCS, PCLDFR, PRC_MF, PCF_MF ) + ELSE + CALL LIMA_ADJUST(KRR, KMI, TPFILE, & + OSUBG_COND, PTSTEP, & + PRHODREF, PRHODJ, PEXNREF, PPABST, PPABST, & + PRT, PRS, PSVT(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PSVS(:,:,:,NSV_LIMA_BEG:NSV_LIMA_END), & + PTHS, PSRCS, PCLDFR ) + ENDIF +! +END SELECT +! +IF(HCLOUD=='ICE3' .OR. HCLOUD=='ICE4' ) THEN + PINPRC3D=ZFPR(:,:,:,2) / XRHOLW + PINPRR3D=ZFPR(:,:,:,3) / XRHOLW + PINPRS3D=ZFPR(:,:,:,5) / XRHOLW + PINPRG3D=ZFPR(:,:,:,6) / XRHOLW + IF(KRR==7) PINPRH3D=ZFPR(:,:,:,7) / XRHOLW + WHERE (PRT(:,:,:,2) > 1.E-04 ) + PSPEEDC=ZFPR(:,:,:,2) / (PRT(:,:,:,2) * PRHODREF(:,:,:)) + ENDWHERE + WHERE (PRT(:,:,:,3) > 1.E-04 ) + PSPEEDR=ZFPR(:,:,:,3) / (PRT(:,:,:,3) * PRHODREF(:,:,:)) + ENDWHERE + WHERE (PRT(:,:,:,5) > 1.E-04 ) + PSPEEDS=ZFPR(:,:,:,5) / (PRT(:,:,:,5) * PRHODREF(:,:,:)) + ENDWHERE + WHERE (PRT(:,:,:,6) > 1.E-04 ) + PSPEEDG=ZFPR(:,:,:,6) / (PRT(:,:,:,6) * PRHODREF(:,:,:)) + ENDWHERE + IF(KRR==7) THEN + WHERE (PRT(:,:,:,7) > 1.E-04 ) + PSPEEDH=ZFPR(:,:,:,7) / (PRT(:,:,:,7) * PRHODREF(:,:,:)) + ENDWHERE + ENDIF +ENDIF + +! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets +call Sources_neg_correct( hcloud, 'NECON', krr, ptstep, ppabst, ptht, prt, pths, prs, psvs, prhodj ) + +!------------------------------------------------------------------------------- +! +! +!* 13. SWITCH BACK TO THE PROGNOSTIC VARIABLES +! --------------------------------------- +! +PTHS(:,:,:) = PTHS(:,:,:) * PRHODJ(:,:,:) +! +DO JRR = 1,KRR + PRS(:,:,:,JRR) = PRS(:,:,:,JRR) * PRHODJ(:,:,:) +END DO +! +IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN + DO JSV = ISVBEG, ISVEND + PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) * PRHODJ(:,:,:) + ENDDO +ENDIF + +!------------------------------------------------------------------------------- +! +END SUBROUTINE RESOLVED_CLOUD diff --git a/src/mesonh/ext/set_rsou.f90 b/src/mesonh/ext/set_rsou.f90 new file mode 100644 index 0000000000000000000000000000000000000000..9f7cca3e1c76de20267a8a398b309e005b804022 --- /dev/null +++ b/src/mesonh/ext/set_rsou.f90 @@ -0,0 +1,1633 @@ +!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. +!----------------------------------------------------------------- +! #################### + MODULE MODI_SET_RSOU +! #################### +! +INTERFACE +! + SUBROUTINE SET_RSOU(TPFILE,TPEXPREFILE,HFUNU,HFUNV,KILOC,KJLOC,OBOUSS,& + PJ,OSHIFT,PCORIOZ) +! +USE MODD_IO, ONLY : TFILEDATA +! +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! outpput data file +TYPE(TFILEDATA), INTENT(IN) :: TPEXPREFILE ! input data file +CHARACTER(LEN=*), INTENT(IN) :: HFUNU ! type of variation of U + ! in y direction +CHARACTER(LEN=*), INTENT(IN) :: HFUNV ! type of variation of V + ! in x direction +INTEGER, INTENT(IN) :: KILOC ! I Localisation of vertical profile +INTEGER, INTENT(IN) :: KJLOC ! J Localisation of vertical profile +LOGICAL, INTENT(IN) :: OBOUSS ! logical switch for Boussinesq version +REAL, DIMENSION(:,:,:), INTENT(IN) :: PJ ! jacobien +LOGICAL, INTENT(IN) :: OSHIFT ! logical switch for vertical shift +! +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCORIOZ ! Coriolis parameter + ! (exceptionnaly 3D array) +! +END SUBROUTINE SET_RSOU +! +END INTERFACE +! +END MODULE MODI_SET_RSOU +! +! ######################################################################## + SUBROUTINE SET_RSOU(TPFILE,TPEXPREFILE,HFUNU,HFUNV,KILOC,KJLOC,OBOUSS, & + PJ,OSHIFT,PCORIOZ) +! ######################################################################## +! +!!**** *SET_RSOU * - to initialize mass fiels from a radiosounding +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to initialize the mass field (theta,r, +! thetavrefz,rhorefz) on model grid from a radiosounding located at point +! (KILOC,KJLOC). +! +! The free-formatted part of EXPRE file contains the radiosounding data.The data +! are stored in following order : +! +! - year,month,day, time (these variables are read in PREINIT program) +! - kind of data in EXPRE file (see below for more explanations about +! YKIND) +! - ZGROUND +! - PGROUND +! - temperature variable at ground ( depending on the data Kind ) +! - moist variable at ground ( depending on the data Kind ) +! - number of wind data levels ( variable ILEVELU) +! - height , dd , ff | +! or or | ILEVELU times +! pressure, U , V | +! - number of mass levels ( variable ILEVELM), including the ground +! level +! - height , T , Td | +! or or or | (ILEVELM-1) times +! pressure, THeta_Dry , Mixing Ratio | +! or or | +! THeta_V , relative HUmidity| +! +! NB : the first mass level is at ground +! +! The following kind of data is permitted : +! YKIND = 'STANDARD' : ZGROUND, PGROUND, TGROUND, TDGROUND +! (Pressure, dd, ff) , +! (Pressure, T, Td) +! YKIND = 'PUVTHVMR' : zGROUND, PGROUND, ThvGROUND, RGROUND +! (Pressure, U, V) , +! (Pressure, THv, R) +! YKIND = 'PUVTHVHU' : zGROUND, PGROUND, ThvGROUND, HuGROUND +! (Pressure, U, V) , +! (Pressure, THv, Hu) +! YKIND = 'ZUVTHVHU' : zGROUND, PGROUND, ThvGROUND, HuGROUND +! (height, U, V) , +! (height, THv, Hu) +! YKIND = 'ZUVTHVMR' : zGROUND, PGROUND, ThvGROUND, RGROUND +! (height, U, V) , +! (height, THv, R) +! YKIND = 'PUVTHDMR' : zGROUND, PGROUND, ThdGROUND, RGROUND +! (Pressure, U, V) , +! (Pressure, THd, R) +! YKIND = 'PUVTHDHU' : zGROUND, PGROUND, ThdGROUND, HuGROUND +! (Pressure, U, V) , +! (Pressure, THd, Hu) +! YKIND = 'ZUVTHDMR' : zGROUND, PGROUND, ThdGROUND, +! RGROUND +! (height, U, V) , +! (height, THd, R) +! YKIND = 'PUVTHU' : ZGROUND, PGROUND, TGROUND, HuGROUND +! (Pressure, U, V) , +! (Pressure, T, Hu) +! +! For ocean-LES case the following kind of data is permitted +! +! YKIND = 'IDEALOCE' : ZGROUND (Water depth),PGROUND(Sfc Atmos Press), +! TGROUND (SST), RGROUND (SSS) +! (Depth , U, V) starting from sfc +! (Depth, T, S) +! (Time, LE, H, SW_d,SW_u,LW_d,LW_u,Stress_X,Stress_Y) +! +! YKIND = 'STANDOCE' : (Depth , Temp, Salinity, U, V) starting from sfc +! (Time, LE, H, SW_d,SW_u,LW_d,LW_u,Stress_X,Stress_Y) +! +!!** METHOD +!! ------ +!! The radiosounding is first read, then data are converted in order to +!! always obtain the following variables (case YKIND = 'ZUVTHVMR') : +!! (height,U,V) and (height,Thetav,r) which are the model variables. +!! That is to say : +!! - YKIND = 'STANDARD' : +!! dd,ff converted in U,V +!! Td + pressure ----> r +!! T,r ---> Tv + pressure ----> thetav +!! Pressure + thetav + ZGROUND ----> height (for mass levels) +!! Thetav at mass levels ----> thetav at wind levels +!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) +!! - YKIND = 'PUVTHVMR' : +!! Pressure + thetav + ZGROUND ----> height (for mass levels) +!! Thetav at mass levels ----> thetav at wind levels +!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) +!! - YKIND = 'PUVTHVHU' : +!! thetav + pressure ----> Tv +pressure +Hu ----> r +!! Pressure + thetav + ZGROUND ----> height (for mass levels) +!! Thetav at mass levels ----> thetav at wind levels +!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) +!! - YKIND = 'ZUVTHVHU' : +!! height +thetav + PGROUND -----> pressure (for mass levels) +!! thetav + pressure ----> Tv +pressure +Hu ----> r +!! - YKIND = 'PUVTHDVMR' : +!! thetad + r ----> thetav +!! pressure + thetav + ZGROUND ----> height (for mass levels) +!! Thetav at mass levels ----> thetav at wind levels +!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) +!! - YKIND = 'PUVTHDHU' : +!! thetad + pressure -----> T +!! T + pressure + Hu -----> r +!! thetad + r -----> thetav +!! pressure + thetav + ZGROUND ----> height (for mass levels) +!! Thetav at mass levels ----> thetav at wind levels +!! Pressure + thetav + ZGROUND + PGROUND ---->height (for wind levels) +!! - YKIND = 'ZUVTHDHU' : +!! thetad + r -----> thetav +!! - YKIND = 'PUVTHU' : +!! T + pressure -----> thetad +!! T + pressure + Hu -----> r +!! thetad + r -----> thetav +!! pressure + thetav + ZGROUND ----> height (for mass levels) +!! Thetav at mass levels ----> thetav at wind levels +!! +!! The following basic formula are used : +!! Rd es(Td) +!! r = -- ---------- +!! Rv P - es(Td) +!! +!! 1 + (Rv/Rd) r +!! Tv = -------------- T +!! 1 + r +!! +!! P00 Rd/Cpd 1 + (Rv/Rd) r +!! Thetav = Tv ( ---- ) = Thetad ( --------------) +!! P 1 + r +!! The integration of hydrostatic relation is used to compute height from +!! pressure and vice-versa. This is done by HEIGHT_PRESS and PRESS_HEIGHT +!! routines. +!! +!! Then, these data are interpolated on a vertical grid which is +!! a mixed grid calaculated with VERT_COORD from the vertical levels of MNH +!! grid and with a constant ororgraphy equal to the altitude of the vertical +!! profile (ZZGROUND) (It permits to keep low levels information with a +!! shifting function (as in PREP_REAL_CASE)) +!! +!! Then, the 3D mass and wind fields are deduced in SET_MASS +!! +!! +!! EXTERNAL +!! -------- +!! SET_MASS : to compute mass field on 3D-model grid +!! Module MODE_THERMO : contains thermodynamic routines +!! SM_FOES : To compute saturation vapor pressure from +!! temperature +!! SM_PMR_HU : to compute vapor mixing ratio from pressure, virtual +!! temperature and relative humidity +!! HEIGHT_PRESS : to compute height from pressure and thetav +!! by integration of hydrostatic relation +!! PRESS_HEIGHT : to compute pressure from height and thetav +!! by integration of hydrostatic relation +!! THETAVPU_THETAVPM : to interpolate thetav on wind levels +!! from thetav on mass levels +!! +!! Module MODI_HEIGHT_PRESS : interface for function HEIGHT_PRESS +!! Module MODI_PRESS_HEIGHT : interface for function PRESS_HEIGHT +!! Module MODI_THETAVPU_THETAVPM : interface for function +!! THETAVPU_THETVPM +!! Module MODI_SET_MASS : interface for subroutine SET_MASS +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! XPI : Pi +!! XRV : Gas constant for vapor +!! XRD : Gas constant for dry air +!! XCPD : Specific heat for dry air at constant pressure +!! +!! Module MODD_LUNIT1 : contains logical unit names +!! TLUOUT : name of output-listing +!! +!! Module MODD_CONF : contains configuration variables for all models. +!! NVERB : verbosity level for output-listing +!! +!! Module MODD_GRID1 : contains grid variables +!! XZHAT : height of w-levels of vertical model grid without orography +!! +!! REFERENCE +!! --------- +!! Book2 of MESO-NH documentation (routine SET_RSOU) +!! +!! +!! AUTHOR +!! ------ +!! V. Ducrocq * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 25/08/94 +!! J.Stein 06/12/94 change the way to prescribe the horizontal wind +!! variations + cleaning +!! J.Stein 18/01/95 bug corrections in the ILEVELM readings +!! J.Stein 16/04/95 put the same names of the declarative modules +!! in the descriptive part +!! J.Stein 30/01/96 use the RS ground pressure to initialize the +!! hydrostatic pressure computation +!! V.Masson 02/09/96 add allocation of ZTHVU in two cases +!! P.Jabouille 14/02/96 bug in extrapolation of ZMRM below the first level +!! Jabouille/Masson 05/12/02 add ZUVTHLMR case and hydrometeor initialization +!! P.Jabouille 29/10/03 add hydrometeor initialization for ZUVTHDMR case +!! G. Tanguy 26/10/10 change the interpolation of the RS : we use now a +!! mixed grid (PREP_REAL_CASE method) +!! add PUVTHU case +!! V.Masson 12/08/13 Parallelization of the initilization profile +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 19/04/2019: removed unused dummy arguments and variables +! JL Redelsperger 01/2021: Ocean LES cases added +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CONF +USE MODD_CONF_n +USE MODD_CST +USE MODD_DYN_n, ONLY: LOCEAN +USE MODD_FIELD_n +USE MODD_GRID +USE MODD_GRID_n +USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_IO, ONLY: TFILEDATA +USE MODD_NETCDF +USE MODD_OCEANH +USE MODD_PARAMETERS, ONLY: JPHEXT +USE MODD_TYPE_DATE +! +USE MODE_ll +USE MODE_MSG +USE MODE_THERMO +! +USE MODI_COMPUTE_EXNER_FROM_GROUND +USE MODI_HEIGHT_PRESS +USE MODI_PRESS_HEIGHT +USE MODI_SET_MASS +USE MODI_SHUMAN +USE MODI_THETAVPU_THETAVPM +USE MODE_TH_R_FROM_THL_RT_1D +USE MODI_VERT_COORD +! +USE NETCDF ! for reading the NR files +! +IMPLICIT NONE +! +! +!* 0.1 Declarations of arguments : +! +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! outpput data file +TYPE(TFILEDATA), INTENT(IN) :: TPEXPREFILE ! input data file +CHARACTER(LEN=*), INTENT(IN) :: HFUNU ! type of variation of U + ! in y direction +CHARACTER(LEN=*), INTENT(IN) :: HFUNV ! type of variation of V + ! in x direction +INTEGER, INTENT(IN) :: KILOC ! I Localisation of vertical profile +INTEGER, INTENT(IN) :: KJLOC ! J Localisation of vertical profile +LOGICAL, INTENT(IN) :: OBOUSS ! logical switch for Boussinesq version +LOGICAL, INTENT(IN) :: OSHIFT ! logical switch for vertical shift +REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCORIOZ ! Coriolis parameter + ! (exceptionnaly 3D array) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PJ ! jacobien +! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: ILUPRE ! logical unit number of the EXPRE return code +INTEGER :: ILUOUT ! Logical unit number for output-listing +! local variables for reading sea sfc flux forcing for ocean model +INTEGER :: IFRCLT +REAL, DIMENSION(:), ALLOCATABLE :: ZSSUFL_T,ZSSVFL_T,ZSSTFL_T,ZSSOLA_T ! +TYPE (DATE_TIME), DIMENSION(:), ALLOCATABLE :: ZFRCLT ! date/time of sea surface forcings +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +! variables read in EXPRE file at the RS/CTD levels +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +CHARACTER(LEN=8) :: YKIND ! Kind of variables in + ! EXPRE FILE +INTEGER :: ILEVELU ! number of wind levels +REAL, DIMENSION(:), ALLOCATABLE :: ZHEIGHTU ! Height at wind levels +REAL, DIMENSION(:), ALLOCATABLE :: ZPRESSU ! Pressure at wind levels +REAL, DIMENSION(:), ALLOCATABLE :: ZTHVU ! Thetav at wind levels +REAL, DIMENSION(:), ALLOCATABLE :: ZU,ZV ! wind components +REAL, DIMENSION(:), ALLOCATABLE :: ZDD,ZFF ! dd (direction) and ff(force) + ! for wind +REAL :: ZZGROUND,ZPGROUND ! height and Pressure at ground +REAL :: ZTGROUND,ZTHVGROUND,ZTHDGROUND,ZTHLGROUND, & + ZTDGROUND,ZMRGROUND,ZHUGROUND + ! temperature and moisture + ! variables at ground +INTEGER :: ILEVELM ! number of mass levels +REAL, DIMENSION(:), ALLOCATABLE :: ZHEIGHTM ! Height at mass levels +REAL, DIMENSION(:), ALLOCATABLE :: ZPRESSM ! Pressure at mass levels +REAL, DIMENSION(:), ALLOCATABLE :: ZTHV ! Thetav at mass levels +REAL, DIMENSION(:), ALLOCATABLE :: ZTHD ! Theta (dry) at mass levels +REAL, DIMENSION(:), ALLOCATABLE :: ZTHL ! Thetal at mass levels +REAL, DIMENSION(:), ALLOCATABLE :: ZTH ! Theta at mass levels +REAL, DIMENSION(:), ALLOCATABLE :: ZT ! Temperature at mass levels +REAL, DIMENSION(:), ALLOCATABLE :: ZMR ! Vapor mixing ratio at mass levels +REAL, DIMENSION(:), ALLOCATABLE :: ZMRC ! cloud mixing ratio at mass levels +REAL, DIMENSION(:), ALLOCATABLE :: ZMRI ! ice mixing ratio or cloud concentration +REAL, DIMENSION(:), ALLOCATABLE :: ZRT ! total mixing ratio +REAL, DIMENSION(:), ALLOCATABLE :: ZPRESS ! pressure at mass level +REAL, DIMENSION(:), ALLOCATABLE :: ZHU ! relative humidity at mass levels +REAL, DIMENSION(:), ALLOCATABLE :: ZTD ! Td at mass levels +REAL, DIMENSION(:), ALLOCATABLE :: ZTV ! Tv at mass levels +REAL, DIMENSION(:), ALLOCATABLE :: ZEXN +REAL, DIMENSION(:), ALLOCATABLE :: ZCPH +REAL, DIMENSION(:), ALLOCATABLE :: ZLVOCPEXN +REAL, DIMENSION(:), ALLOCATABLE :: ZLSOCPEXN +REAL, DIMENSION(SIZE(XZHAT)) :: ZZFLUX_PROFILE ! altitude of flux points on the initialization columns +REAL, DIMENSION(SIZE(XZHAT)) :: ZZMASS_PROFILE ! altitude of mass points on the initialization columns +! +! fields on the grid of the model without orography +! +REAL, DIMENSION(SIZE(XZHAT)) :: ZUW,ZVW ! Wind at w model grid levels +REAL, DIMENSION(SIZE(XZHAT)) :: ZMRM ! vapor mixing ratio at mass model + !grid levels +REAL, DIMENSION(SIZE(XZHAT)) :: ZMRCM,ZMRIM +REAL, DIMENSION(SIZE(XZHAT)) :: ZTHVM ! Temperature at mass model grid levels +REAL, DIMENSION(SIZE(XZHAT)) :: ZTHLM ! Thetal at mass model grid levels +REAL, DIMENSION(SIZE(XZHAT)) :: ZTHM ! Thetal at mass model grid levels +REAL, DIMENSION(SIZE(XZHAT)) :: ZRHODM ! density at mass model grid level +REAL, DIMENSION(:), ALLOCATABLE :: ZMRT ! Total Vapor mixing ratio at mass levels on mixed grid +REAL, DIMENSION(:), ALLOCATABLE :: ZEXNMASS ! exner fonction at mass level +REAL, DIMENSION(:), ALLOCATABLE :: ZEXNFLUX ! exner fonction at flux level +REAL :: ZEXNSURF ! exner fonction at surface +REAL, DIMENSION(:), ALLOCATABLE :: ZPREFLUX ! pressure at flux model grid level +REAL, DIMENSION(:), ALLOCATABLE :: ZFRAC_ICE ! ice fraction +REAL, DIMENSION(:), ALLOCATABLE :: ZRSATW, ZRSATI +REAL :: ZDZSDH,ZDZ1SDH,ZDZ2SDH ! interpolation + ! working arrays +! +INTEGER :: JK,JKLEV,JKU,JKM,JKT,JJ,JI,JO,JLOOP ! Loop indexes +INTEGER :: IKU ! Upper bound in z direction +REAL :: ZRDSCPD,ZRADSDG, & ! Rd/Cpd, Pi/180., + ZRVSRD,ZRDSRV, & ! Rv/Rd, Rd/Rv + ZPTOP ! Pressure at domain top +LOGICAL :: GUSERC ! use of input data cloud +INTEGER :: IIB, IIE, IJB, IJE +INTEGER :: IXOR_ll, IYOR_ll +INTEGER :: IINFO_ll +LOGICAL :: GPROFILE_IN_PROC ! T : initialization profile is in current processor +! +REAL,DIMENSION(SIZE(XXHAT),SIZE(XYHAT)) ::ZZS_LS +REAL,DIMENSION(SIZE(XXHAT),SIZE(XYHAT),SIZE(XZHAT)) ::ZZFLUX_MX,ZZMASS_MX ! mixed grid +!------------------------------------------------------------------------------- +! For standard ocean version, reading external files +CHARACTER(LEN=256) :: yinfile, yinfisf ! files to be read +INTEGER :: IDX +INTEGER(KIND=CDFINT) :: INZ, INLATI, INLONGI +INTEGER(KIND=CDFINT) :: incid, ivarid, idimid, idimlen +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZOC_TEMPERATURE,ZOC_SALINITY,ZOC_U,ZOC_V +REAL, DIMENSION(:), ALLOCATABLE :: ZOC_DEPTH +REAL, DIMENSION(:), ALLOCATABLE :: ZOC_LE,ZOC_H +REAL, DIMENSION(:), ALLOCATABLE :: ZOC_SW_DOWN,ZOC_SW_UP,ZOC_LW_DOWN,ZOC_LW_UP +REAL, DIMENSION(:), ALLOCATABLE :: ZOC_TAUX,ZOC_TAUY + +!-------------------------------------------------------------------------------- +! +!* 1. PROLOGUE : INITIALIZE SOME CONSTANTS, RETRIEVE LOGICAL +! UNIT NUMBERS AND READ KIND OF DATA IN EXPRE FILE +! ------------------------------------------------------- +! +CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) +CALL GET_OR_ll('B',IXOR_ll,IYOR_ll) +! +!* 1.1 initialize some constants +! +ZRDSCPD = XRD / XCPD +ZRADSDG = XPI/180. +ZRVSRD = XRV/XRD +ZRDSRV = XRD/XRV +! +!* 1.2 Retrieve logical unit numbers +! +ILUPRE = TPEXPREFILE%NLU +ILUOUT = TLUOUT%NLU +! +!* 1.3 Read data kind in EXPRE file +! +READ(ILUPRE,*) YKIND +WRITE(ILUOUT,*) 'YKIND read in set_rsou: ', YKIND +! +IF(LUSERC .AND. YKIND/='PUVTHDMR' .AND. YKIND/='ZUVTHDMR' .AND. YKIND/='ZUVTHLMR') THEN + CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','hydrometeors are not allowed for YKIND = '//trim(YKIND)) +ENDIF +! +IF(YKIND=='ZUVTHLMR' .AND. .NOT. LUSERC) THEN +!callabortstop + CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','LUSERC=T is required for YKIND=ZUVTHLMR') +ENDIF +! +GUSERC=.FALSE. +IF(LUSERC .AND. (YKIND == 'PUVTHDMR' .OR. YKIND == 'ZUVTHDMR')) GUSERC=.TRUE. +!------------------------------------------------------------------------------- +! +!* 2. READ DATA AND CONVERT IN (height,U,V), (height,Thetav,r) +! -------------------------------------------------------- +! +SELECT CASE(YKIND) +! +! 2.0.1 Ocean case 1 +! + CASE ('IDEALOCE') +! + XP00=XP00OCEAN + ! Read data in PRE_IDEA1.nam + ! Surface + WRITE(ILUOUT,FMT=*) 'Reading data for ideal ocean :IDEALOCE' + READ(ILUPRE,*) ZPTOP ! P_atmosphere at sfc =P top domain + READ(ILUPRE,*) ZTGROUND ! SST + READ(ILUPRE,*) ZMRGROUND ! SSS + WRITE(ILUOUT,FMT=*) 'Patm SST SSS', ZPTOP,ZTGROUND,ZMRGROUND + READ(ILUPRE,*) ILEVELU ! Read number of Current levels + ! Allocate required memory + ALLOCATE(ZHEIGHTU(ILEVELU),ZU(ILEVELU),ZV(ILEVELU)) + ALLOCATE(ZOC_U(ILEVELU,1,1),ZOC_V(ILEVELU,1,1)) + WRITE(ILUOUT,FMT=*) 'Level number for Current in data', ILEVELU + ! Read U and V at each wind level + DO JKU = 1,ILEVELU + READ(ILUPRE,*) ZHEIGHTU(JKU),ZOC_U(JKU,1,1),ZOC_V(JKU,1,1) + ! WRITE(ILUOUT,FMT=*) 'Leveldata D(m) under sfc: U_cur, V_cur', JKU, ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) + END DO + DO JKU=1,ILEVELU + ! Z axis reoriented as in the model + IDX = ILEVELU-JKU+1 + ZU(JKU) = ZOC_U(IDX,1,1) + ZV(JKU) = ZOC_V(IDX,1,1) + ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model + ! Z oriented in same time to have a model domain axis going + ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top) + END DO + ! Read number of mass levels + READ(ILUPRE,*) ILEVELM + ! Allocate required memory + ALLOCATE(ZOC_DEPTH(ILEVELM)) + ALLOCATE(ZHEIGHTM(ILEVELM)) + ALLOCATE(ZTHL(ILEVELM),ZTH(ILEVELM),ZTHV(ILEVELM)) + ALLOCATE(ZMR(ILEVELM),ZRT(ILEVELM)) + ALLOCATE(ZOC_TEMPERATURE(ILEVELM,1,1),ZOC_SALINITY(ILEVELM,1,1)) + ! Read T and S at each mass level + DO JKM= 2,ILEVELM + READ(ILUPRE,*) ZOC_DEPTH(JKM),ZOC_TEMPERATURE(JKM,1,1),ZOC_SALINITY(JKM,1,1) + END DO + ! Complete the mass arrays with the ground informations read in EXPRE file + ZOC_DEPTH(1) = 0. + ZOC_TEMPERATURE(1,1,1)= ZTGROUND + ZOC_SALINITY(1,1,1)= ZMRGROUND + !!!!!!!!!!!!!!!!!!!!!!!!Inversing Axis!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + ! Going from the data (axis downward i.e inverse model) grid to the model grid (axis upward) + ! Uniform bathymetry; depth goes from ocean sfc downwards (data grid) + ! ZHEIGHT goes from the model domain bottom up to the sfc ocean (top of model domain) + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + ZZGROUND = 0. + ZTGROUND = ZOC_TEMPERATURE(ILEVELM,1,1) + ZMRGROUND = ZOC_SALINITY(ILEVELM,1,1) + DO JKM= 1,ILEVELM + ! Z upward axis (oriented as in the model), i.e. + ! going from 0m (ocean bottom/model bottom) upward to H (ocean sfc/model top) + ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model + IDX = ILEVELM-JKM+1 + ZTH(JKM) = ZOC_TEMPERATURE(IDX,1,1) + ZMR(JKM) = ZOC_SALINITY(IDX,1,1) + ZHEIGHTM(JKM)= ZOC_DEPTH(ILEVELM)- ZOC_DEPTH(IDX) + WRITE(ILUOUT,FMT=*) 'Model oriented initial data: JKM IDX depth T S ZHEIGHTM', & + JKM,IDX,ZOC_DEPTH(IDX),ZTH(JKM),ZMR(JKM),ZHEIGHTM(JKM) + END DO + ! mass levels of the RS + ZTHV = ZTH ! TV==THETA=TL + ZTHL = ZTH + ZRT = ZMR + !!!!!!!!!!!!!!!!!!!!!!!!!!!! + ! READ Sea Surface Forcing ! + !!!!!!!!!!!!!!!!!!!!!!!!!!!! + ! Reading the forcings from prep_idea1.nam + READ(ILUPRE,*) IFRCLT ! Number of time-dependent forcing + IF (IFRCLT > 99*8) THEN + ! CAUTION: number of forcing times is limited by the WRITE format 99(8E10.3) + ! and also by the name of forcing variables (format I3.3) + ! You have to modify those if you need more forcing times + CALL PRINT_MSG(NVERB_FATAL,'IO','SET_RSOU','maximum forcing times NFRCLT is 99*8') + END IF +! + WRITE(UNIT=ILUOUT,FMT='(" THERE ARE ",I2," SFC FLUX FORCINGs AT:")') IFRCLT + ALLOCATE(ZFRCLT(IFRCLT)) + ALLOCATE(ZSSUFL_T(IFRCLT)); ZSSUFL_T = 0.0 + ALLOCATE(ZSSVFL_T(IFRCLT)); ZSSVFL_T = 0.0 + ALLOCATE(ZSSTFL_T(IFRCLT)); ZSSTFL_T = 0.0 + ALLOCATE(ZSSOLA_T(IFRCLT)); ZSSOLA_T = 0.0 + DO JKT = 1,IFRCLT + WRITE(ILUOUT,FMT='(A, I4)') "SET_RSOU/Reading Sea Surface forcing: Number=", JKT + READ(ILUPRE,*) ZFRCLT(JKT)%nyear, ZFRCLT(JKT)%nmonth, & + ZFRCLT(JKT)%nday, ZFRCLT(JKT)%xtime + READ(ILUPRE,*) ZSSUFL_T(JKT) + READ(ILUPRE,*) ZSSVFL_T(JKT) + READ(ILUPRE,*) ZSSTFL_T(JKT) + READ(ILUPRE,*) ZSSOLA_T(JKT) + END DO +! + DO JKT = 1 , IFRCLT + WRITE(UNIT=ILUOUT,FMT='(F9.0, "s, date:", I3, "/", I3, "/", I5)') & + ZFRCLT(JKT)%xtime, ZFRCLT(JKT)%nday, & + ZFRCLT(JKT)%nmonth, ZFRCLT(JKT)%nyear + END DO + NINFRT= INT(ZFRCLT(2)%xtime) + WRITE(ILUOUT,FMT='(A)') & + "Number U-Stress, V-Stress, Heat turb Flux, Solar Flux Interval(s)",NINFRT + DO JKT = 1, IFRCLT + WRITE(ILUOUT,FMT='(I10,99(3F10.2))') JKT, ZSSUFL_T(JKT),ZSSVFL_T(JKT),ZSSTFL_T(JKT) + END DO + NFRCLT = IFRCLT + ALLOCATE(TFRCLT(NFRCLT)) + ALLOCATE(XSSUFL_T(NFRCLT));XSSUFL_T(:)=0. + ALLOCATE(XSSVFL_T(NFRCLT));XSSVFL_T(:)=0. + ALLOCATE(XSSTFL_T(NFRCLT));XSSTFL_T(:)=0. + ALLOCATE(XSSOLA_T(NFRCLT));XSSOLA_T(:)=0. +! + DO JKT=1,NFRCLT + TFRCLT(JKT)= ZFRCLT(JKT) + XSSUFL_T(JKT)=ZSSUFL_T(JKT)/XRH00OCEAN + XSSVFL_T(JKT)=ZSSVFL_T(JKT)/XRH00OCEAN + ! working in SI + XSSTFL_T(JKT)=ZSSTFL_T(JKT) /(3900.*XRH00OCEAN) + XSSOLA_T(JKT)=ZSSOLA_T(JKT) /(3900.*XRH00OCEAN) + END DO + DEALLOCATE(ZFRCLT) + DEALLOCATE(ZSSUFL_T) + DEALLOCATE(ZSSVFL_T) + DEALLOCATE(ZSSTFL_T) + DEALLOCATE(ZSSOLA_T) +! +!-------------------------------------------------------------------------------- +! 2.0.2 Ocean standard initialize from netcdf files +! U,V,T,S at Z levels + Forcings at model TOP (sea surface) +!-------------------------------------------------------------------------------- +! + CASE ('STANDOCE') +! + XP00=XP00OCEAN + READ(ILUPRE,*) ZPTOP ! P_atmosphere at sfc =P top domain + READ(ILUPRE,*) YINFILE, YINFISF + WRITE(ILUOUT,FMT=*) 'Netcdf files to read:', YINFILE, YINFISF + ! Open file containing initial profiles + CALL check(nf90_open(yinfile,NF90_NOWRITE,incid), "opening NC file") + ! Reading dimensions and lengths + CALL check( nf90_inq_dimid(incid, "depth",idimid), "getting depth dimension id" ) + CALL check( nf90_inquire_dimension(incid, idimid, len=INZ), "getting INZ" ) + CALL check( nf90_inquire_dimension(incid, INT(2,KIND=CDFINT), len=INLONGI), "getting NLONG" ) + CALL check( nf90_inquire_dimension(incid, INT(1,KIND=CDFINT), len=INLATI), "getting NLAT" ) +! + WRITE(ILUOUT,FMT=*) 'NB LEVLS READ INZ, NLONG NLAT ', INZ, INLONGI,INLATI + ALLOCATE(ZOC_TEMPERATURE(INLATI,INLONGI,INZ),ZOC_SALINITY(INLATI,INLONGI,INZ)) + ALLOCATE(ZOC_U(INLATI,INLONGI,INZ),ZOC_V(INLATI,INLONGI,INZ)) + ALLOCATE(ZOC_DEPTH(INZ)) + WRITE(ILUOUT,FMT=*) 'NETCDF READING ==> Temp' + CALL check(nf90_inq_varid(incid,"temperature",ivarid), "getting temp ivarid") + CALL check(nf90_get_var(incid,ivarid,ZOC_TEMPERATURE), "reading temp") + WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> salinity' + CALL check(nf90_inq_varid(incid,"salinity",ivarid), "getting salinity ivarid") + CALL check(nf90_get_var(incid,ivarid,ZOC_SALINITY), "reading salinity") + WRITE(ILUOUT,FMT=*) 'Netcdf ==> Reading depth' + CALL check(nf90_inq_varid(incid,"depth",ivarid), "getting depth ivarid") + CALL check(nf90_get_var(incid,ivarid,ZOC_DEPTH), "reading depth") + WRITE(ILUOUT,FMT=*) 'depth: max min ', MAXVAL(ZOC_DEPTH),MINVAL(ZOC_DEPTH) + WRITE(ILUOUT,FMT=*) 'depth 1 nz: ', ZOC_DEPTH(1),ZOC_DEPTH(INZ) + WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> Currents' + CALL check(nf90_inq_varid(incid,"u",ivarid), "getting u ivarid") + CALL check(nf90_get_var(incid,ivarid,ZOC_U), "reading u") + CALL check(nf90_inq_varid(incid,"v",ivarid), "getting v ivarid") + CALL check(nf90_get_var(incid,ivarid,ZOC_V), "reading v") + CALL check(nf90_close(incid), "closing yinfile") + WRITE(ILUOUT,FMT=*) 'End of initial file reading' +! + DO JKM=1,INZ + ZOC_TEMPERATURE(1,1,JKM)=ZOC_TEMPERATURE(1,1,JKM)+273.15 + WRITE(ILUOUT,FMT=*) 'Z T(Kelvin) S(Sverdup) U V K',& + JKM,ZOC_DEPTH(JKM),ZOC_TEMPERATURE(1,1,JKM),ZOC_SALINITY(1,1,JKM),ZOC_U(1,1,JKM),ZOC_V(1,1,JKM), JKM + ENDDO + ! number of data levels + ILEVELM=INZ + ! Model bottom + ZTGROUND = ZOC_TEMPERATURE(1,1,ILEVELM) + ZMRGROUND = ZOC_SALINITY(1,1,ILEVELM) + ZZGROUND=0. + ! Allocate required memory + ALLOCATE(ZHEIGHTM(ILEVELM)) + ALLOCATE(ZT(ILEVELM)) + ALLOCATE(ZTV(ILEVELM)) + ALLOCATE(ZMR(ILEVELM)) + ALLOCATE(ZTHV(ILEVELM)) + ALLOCATE(ZTHL(ILEVELM)) + ALLOCATE(ZRT(ILEVELM)) + ! Going from the inverse model grid (data) to the normal one + DO JKM= 1,ILEVELM + ! Z axis reoriented as in the model + IDX = ILEVELM-JKM+1 + ZT(JKM) = ZOC_TEMPERATURE(1,1,IDX) + ZMR(JKM) = ZOC_SALINITY(1,1,IDX) + ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model + ! Z oriented in same time to have a model domain axis going + ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top) + ! translation/inversion + ZHEIGHTM(JKM) = -ZOC_DEPTH(IDX) + ZOC_DEPTH(ILEVELM) + WRITE(ILUOUT,FMT=*) 'End gridmodel comput: JKM IDX depth T S ZHEIGHTM', & + JKM,IDX,ZOC_DEPTH(IDX),ZT(JKM),ZMR(JKM),ZHEIGHTM(JKM) + END DO + ! complete ther variables + ZTV = ZT + ZTHV = ZT + ZRT = ZMR + ZTHL = ZT + ZTH = ZT + ! INIT --- U V ----- + ILEVELU = INZ ! Same nb of levels for u,v,T,S + !Assume that current and temp are given at same level + ALLOCATE(ZHEIGHTU(ILEVELU)) + ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) + ZHEIGHTU=ZHEIGHTM + DO JKM= 1,ILEVELU + ! Z axis reoriented as in the model + IDX = ILEVELU-JKM+1 + ZU(JKM) = ZOC_U(1,1,IDX) + ZV(JKM) = ZOC_V(1,1,IDX) + ! ZHEIGHT used only in set_ rsou, defined as such ZHEIGHT(ILEVELM)=H_model + ! Z oriented in same time to have a model domain axis going + ! from 0m (ocean bottom/model bottom) towards H (ocean sfc/model top) + END DO +! + DEALLOCATE(ZOC_TEMPERATURE) + DEALLOCATE(ZOC_SALINITY) + DEALLOCATE(ZOC_U) + DEALLOCATE(ZOC_V) + DEALLOCATE(ZOC_DEPTH) +! + ! Reading/initializing surface forcings +! + WRITE(ILUOUT,FMT=*) 'netcdf sfc forcings file to be read:',yinfisf + ! Open of sfc forcing file + CALL check(nf90_open(yinfisf,NF90_NOWRITE,incid), "opening NC file") + ! Reading dimension and length + CALL check( nf90_inq_dimid(incid,"t",idimid), "getting time dimension id" ) + CALL check( nf90_inquire_dimension(incid, idimid, len=idimlen), "getting idimlen " ) +! + WRITE(ILUOUT,FMT=*) 'nb sfc-forcing time idimlen=',idimlen + ALLOCATE(ZOC_LE(idimlen)) + ALLOCATE(ZOC_H(idimlen)) + ALLOCATE(ZOC_SW_DOWN(idimlen)) + ALLOCATE(ZOC_SW_UP(idimlen)) + ALLOCATE(ZOC_LW_DOWN(idimlen)) + ALLOCATE(ZOC_LW_UP(idimlen)) + ALLOCATE(ZOC_TAUX(idimlen)) + ALLOCATE(ZOC_TAUY(idimlen)) +! + WRITE(ILUOUT,FMT=*)'Netcdf Reading ==> LE' + CALL check(nf90_inq_varid(incid,"LE",ivarid), "getting LE ivarid") + CALL check(nf90_get_var(incid,ivarid,ZOC_LE), "reading LE flux") + WRITE(ILUOUT,FMT=*)'Netcdf Reading ==> H' + CALL check(nf90_inq_varid(incid,"H",ivarid), "getting H ivarid") + CALL check(nf90_get_var(incid,ivarid,ZOC_H), "reading H flux") + WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> SW_DOWN' + CALL check(nf90_inq_varid(incid,"SW_DOWN",ivarid), "getting SW_DOWN ivarid") + CALL check(nf90_get_var(incid,ivarid,ZOC_SW_DOWN), "reading SW_DOWN") + WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> SW_UP' + CALL check(nf90_inq_varid(incid,"SW_UP",ivarid), "getting SW_UP ivarid") + CALL check(nf90_get_var(incid,ivarid,ZOC_SW_UP), "reading SW_UP") + WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> LW_DOWN' + CALL check(nf90_inq_varid(incid,"LW_DOWN",ivarid), "getting LW_DOWN ivarid") + CALL check(nf90_get_var(incid,ivarid,ZOC_LW_DOWN), "reading LW_DOWN") + WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> LW_UP' + CALL check(nf90_inq_varid(incid,"LW_UP",ivarid), "getting LW_UP ivarid") + CALL check(nf90_get_var(incid,ivarid,ZOC_LW_UP), "reading LW_UP") + WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> TAUX' + CALL check(nf90_inq_varid(incid,"TAUX",ivarid), "getting TAUX ivarid") + CALL check(nf90_get_var(incid,ivarid,ZOC_TAUX), "reading TAUX") + WRITE(ILUOUT,FMT=*) 'Netcdf Reading ==> TAUY' + CALL check(nf90_inq_varid(incid,"TAUY",ivarid), "getting TAUY ivarid") + CALL check(nf90_get_var(incid,ivarid,ZOC_TAUY), "reading TAUY") + CALL check(nf90_close(incid), "closing yinfifs") +! + WRITE(ILUOUT,FMT=*) ' Forcing-Number LE H SW_down SW_up LW_down LW_up TauX TauY' + DO JKM = 1, idimlen + WRITE(ILUOUT,FMT=*) JKM, ZOC_LE(JKM), ZOC_H(JKM),ZOC_SW_DOWN(JKM),ZOC_SW_UP(JKM),& + ZOC_LW_DOWN(JKM),ZOC_LW_UP(JKM),ZOC_TAUX(JKM),ZOC_TAUY(JKM) + ENDDO + ! IFRCLT FORCINGS at sea surface + IFRCLT=idimlen + ALLOCATE(ZFRCLT(IFRCLT)) + ALLOCATE(ZSSUFL_T(IFRCLT)); ZSSUFL_T = 0.0 + ALLOCATE(ZSSVFL_T(IFRCLT)); ZSSVFL_T = 0.0 + ALLOCATE(ZSSTFL_T(IFRCLT)); ZSSTFL_T = 0.0 + ALLOCATE(ZSSOLA_T(IFRCLT)); ZSSOLA_T = 0.0 + DO JKT=1,IFRCLT + ! Initial file for CINDY-DYNAMO: all fluxes correspond to the absolute value (>0) + ! modele ocean: axe z dirigé du bas vers la sfc de l'océan + ! => flux dirigé vers le haut (positif ocean vers l'atmopshere i.e. bas vers le haut) + ZSSOLA_T(JKT)=ZOC_SW_DOWN(JKT)-ZOC_SW_UP(JKT) + ZSSTFL_T(JKT)=(ZOC_LW_DOWN(JKT)-ZOC_LW_UP(JKT)-ZOC_LE(JKT)-ZOC_H(JKT)) + ! assume that Tau given on file is along Ox + ! rho_air UW_air = rho_ocean UW_ocean= N/m2 + ! uw_ocean + ZSSUFL_T(JKT)=ZOC_TAUX(JKT) + ZSSVFL_T(JKT)=ZOC_TAUY(JKT) + WRITE(ILUOUT,FMT=*) 'Forcing Nb Sol NSol UW_oc VW',& + JKT,ZSSOLA_T(JKT),ZSSTFL_T(JKT),ZSSUFL_T(JKT),ZSSVFL_T(JKT) + ENDDO + ! Allocate and Writing the corresponding variables in module MODD_OCEAN_FRC + NFRCLT=IFRCLT + ! value to read later on file ? + NINFRT=600 + ALLOCATE(TFRCLT(NFRCLT)) + ALLOCATE(XSSUFL_T(NFRCLT));XSSUFL_T(:)=0. + ALLOCATE(XSSVFL_T(NFRCLT));XSSVFL_T(:)=0. + ALLOCATE(XSSTFL_T(NFRCLT));XSSTFL_T(:)=0. + ALLOCATE(XSSOLA_T(NFRCLT));XSSOLA_T(:)=0. + ! on passe en unités SI, signe, etc pour le modele ocean + ! W/m2 => SI : /(CP_mer * rho_mer) + ! a revoir dans tt le code pour mettre de svaleurs plus exactes + DO JKT=1,NFRCLT + TFRCLT(JKT)= ZFRCLT(JKT) + XSSUFL_T(JKT)=ZSSUFL_T(JKT)/XRH00OCEAN + XSSVFL_T(JKT)=ZSSVFL_T(JKT)/XRH00OCEAN + XSSTFL_T(JKT)=ZSSTFL_T(JKT) /(3900.*XRH00OCEAN) + XSSOLA_T(JKT)=ZSSOLA_T(JKT) /(3900.*XRH00OCEAN) + END DO + DEALLOCATE(ZFRCLT) + DEALLOCATE(ZSSUFL_T) + DEALLOCATE(ZSSVFL_T) + DEALLOCATE(ZSSTFL_T) + DEALLOCATE(ZSSOLA_T) + DEALLOCATE(ZOC_LE) + DEALLOCATE(ZOC_H) + DEALLOCATE(ZOC_SW_DOWN) + DEALLOCATE(ZOC_SW_UP) + DEALLOCATE(ZOC_LW_DOWN) + DEALLOCATE(ZOC_LW_UP) + DEALLOCATE(ZOC_TAUX) + DEALLOCATE(ZOC_TAUY) + ! END OCEAN STANDARD +! +! +!* 2.1 ATMOSPHERIC STANDARD case : ZGROUND, PGROUND, TGROUND, TDGROUND +! (Pressure, dd, ff) , +! (Pressure, T, Td) +! + CASE ('STANDARD') + + READ(ILUPRE,*) ZZGROUND ! Read data at ground level + READ(ILUPRE,*) ZPGROUND + READ(ILUPRE,*) ZTGROUND + READ(ILUPRE,*) ZTDGROUND +! + READ(ILUPRE,*) ILEVELU ! Read number of wind levels + ALLOCATE(ZPRESSU(ILEVELU)) ! Allocate memory for arrays to be read + ALLOCATE(ZDD(ILEVELU),ZFF(ILEVELU)) + ALLOCATE(ZHEIGHTU(ILEVELU)) ! Allocate memory for needed + ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) ! arrays + ALLOCATE(ZTHVU(ILEVELU)) ! Allocate memory for intermediate + ! arrays +! + DO JKU = 1,ILEVELU ! Read data at wind levels + READ(ILUPRE,*) ZPRESSU(JKU),ZDD(JKU),ZFF(JKU) + END DO +! + READ(ILUPRE,*) ILEVELM ! Read number of mass levels + ! including the ground level + ALLOCATE(ZPRESSM(ILEVELM)) ! Allocate memory for arrays to be read + ALLOCATE(ZT(ILEVELM)) + ALLOCATE(ZTD(ILEVELM)) + ALLOCATE(ZHEIGHTM(ILEVELM)) ! Allocate memory for needed + ALLOCATE(ZTHV(ILEVELM)) ! arrays + ALLOCATE(ZMR(ILEVELM)) + ALLOCATE(ZTV(ILEVELM)) ! Allocate memory for intermediate arrays + ALLOCATE(ZTHL(ILEVELM)) + ALLOCATE(ZRT(ILEVELM)) +! +! + DO JKM= 2,ILEVELM ! Read data at mass levels + READ(ILUPRE,*) ZPRESSM(JKM),ZT(JKM),ZTD(JKM) + END DO + ZPRESSM(1)=ZPGROUND ! Mass level 1 is at the ground + ZT(1)=ZTGROUND + ZTD(1)=ZTDGROUND +! +! recover the North-South and West-East wind components + ZU(:) = ZFF(:)*COS(ZRADSDG*(270.-ZDD(:)) ) + ZV(:) = ZFF(:)*SIN(ZRADSDG*(270.-ZDD(:)) ) +! +! compute vapor mixing ratio + ZMR(:) = SM_FOES(ZTD(:)) & + / ( (ZPRESSM(:) - SM_FOES(ZTD(:))) * ZRVSRD ) +! +! compute Tv + ZTV(:) = ZT(:) * (1. + ZRVSRD * ZMR(:))/(1.+ZMR(:)) +! +! compute thetav + ZTHV(:) = ZTV(:) * (XP00/ ZPRESSM(:)) **(ZRDSCPD) +! +! compute height at the mass levels of the RS + ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) +! +! compute thetav and height at the wind levels of the RS + ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) + ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) +! +! Compute Thetal and Rt + ZRT(:)=ZMR(:) + ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) +! +!* 2.2 PUVTHVMR case : zGROUND, PGROUND, ThvGROUND, RGROUND +! (Pressure, U, V) , +! (Pressure, THv, R) +! + CASE ('PUVTHVMR') +! +! Read data at ground level + READ(ILUPRE,*) ZZGROUND + READ(ILUPRE,*) ZPGROUND + READ(ILUPRE,*) ZTHVGROUND + READ(ILUPRE,*) ZMRGROUND +! +! Read number of wind levels + READ(ILUPRE,*) ILEVELU +! +! Allocate the required memory + ALLOCATE(ZPRESSU(ILEVELU)) + ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) + ALLOCATE(ZHEIGHTU(ILEVELU)) + ALLOCATE(ZTHVU(ILEVELU)) +! +! Read the data at each wind level of the RS + DO JKU =1,ILEVELU + READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) + END DO +! +! Read number of mass levels + READ(ILUPRE,*) ILEVELM +! +! Allocate the required memory + ALLOCATE(ZPRESSM(ILEVELM)) + ALLOCATE(ZHEIGHTM(ILEVELM)) + ALLOCATE(ZTHV(ILEVELM)) + ALLOCATE(ZMR(ILEVELM)) + ALLOCATE(ZTHL(ILEVELM)) + ALLOCATE(ZRT(ILEVELM)) +! +! Read the data at each mass level of the RS + DO JKM = 2,ILEVELM + READ(ILUPRE,*) ZPRESSM(JKM),ZTHV(JKM),ZMR(JKM) + END DO +! +! Complete the mass arrays with the ground informations read in EXPRE file + ZPRESSM(1) = ZPGROUND + ZTHV(1) = ZTHVGROUND + ZMR(1) = ZMRGROUND +! +! Compute height of the mass levels of the RS + ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) +! +! Compute thetav and heigth at the wind levels of the RS + ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) + ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) +! +! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total + ZRT(:)=ZMR(:) + ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) +! +!* 2.3 PUVTHVHU case : zGROUND, PGROUND, ThvGROUND, HuGROUND +! (Pressure, U, V) , +! (Pressure, THv, Hu) +! + CASE ('PUVTHVHU') +! +! Read data at ground level + READ(ILUPRE,*) ZZGROUND + READ(ILUPRE,*) ZPGROUND + READ(ILUPRE,*) ZTHVGROUND + READ(ILUPRE,*) ZHUGROUND +! +! Read number of wind levels + READ(ILUPRE,*) ILEVELU +! +! Allocate the required memory + ALLOCATE(ZPRESSU(ILEVELU)) + ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) + ALLOCATE(ZHEIGHTU(ILEVELU)) + ALLOCATE(ZTHVU(ILEVELU)) +! +! Read the data at each wind level of the RS + DO JKU =1,ILEVELU + READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) + END DO +! +! Read number of mass levels + READ(ILUPRE,*) ILEVELM +! +! Allocate the required memory + ALLOCATE(ZPRESSM(ILEVELM)) + ALLOCATE(ZTHV(ILEVELM)) + ALLOCATE(ZHU(ILEVELM)) + ALLOCATE(ZHEIGHTM(ILEVELM)) + ALLOCATE(ZMR(ILEVELM)) + ALLOCATE(ZTV(ILEVELM)) + ALLOCATE(ZTHL(ILEVELM)) + ALLOCATE(ZRT(ILEVELM)) +! +! Read the data at each mass level of the RS + DO JKM = 2,ILEVELM + READ(ILUPRE,*) ZPRESSM(JKM),ZTHV(JKM),ZHU(JKM) + END DO +! +! Complete the mass arrays with the ground informations read in EXPRE file + ZPRESSM(1) = ZPGROUND ! Mass level 1 is at the ground + ZTHV(1) = ZTHVGROUND + ZHU(1) = ZHUGROUND +! +! Compute Tv + ZTV(:)=ZTHV(:) * (ZPRESSM(:) / XP00) ** ZRDSCPD +! +! Compte mixing ratio + ZMR(:)=SM_PMR_HU(ZPRESSM(:),ZTV(:),ZHU(:),SPREAD(ZMR(:),2,1)) +! +! Compute height of the mass levels of the RS + ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) +! +! Compute thetav and height of the wind levels of the RS + ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) + ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) +! +! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total + ZRT(:)=ZMR(:) + ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) +! +!* 2.4 ZUVTHVHU case : zGROUND, PGROUND, ThvGROUND, HuGROUND +! (height, U, V) , +! (height, THv, Hu) +! + CASE ('ZUVTHVHU') +! Read data at ground level + READ(ILUPRE,*) ZZGROUND + READ(ILUPRE,*) ZPGROUND + READ(ILUPRE,*) ZTHVGROUND + READ(ILUPRE,*) ZHUGROUND +! +! Read number of wind levels + READ(ILUPRE,*) ILEVELU +! +! Allocate the required memory + ALLOCATE(ZPRESSU(ILEVELU)) + ALLOCATE(ZHEIGHTU(ILEVELU)) + ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) +! +! +! Read the data at each wind level of the RS + DO JKU = 1,ILEVELU + READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) + END DO +! +! Read number of mass levels + READ(ILUPRE,*) ILEVELM +! +! Allocate the required memory + ALLOCATE(ZHEIGHTM(ILEVELM)) + ALLOCATE(ZTHV(ILEVELM)) + ALLOCATE(ZHU(ILEVELM)) + ALLOCATE(ZMR(ILEVELM)) + ALLOCATE(ZPRESSM(ILEVELM)) + ALLOCATE(ZTV(ILEVELM)) + ALLOCATE(ZTHL(ILEVELM)) + ALLOCATE(ZRT(ILEVELM)) +! +! Read the data at each mass level of the RS + DO JKM = 2,ILEVELM + READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHV(JKM),ZHU(JKM) + END DO +! +! Complete the mass arrays with the ground informations read in EXPRE file + ZHEIGHTM(1) = ZZGROUND ! Mass level 1 is at the ground + ZTHV(1) = ZTHVGROUND + ZHU(1) = ZHUGROUND +! +! Compute Pressure at the mass levels of the RS + ZPRESSM= PRESS_HEIGHT(ZHEIGHTM,ZTHV,ZPGROUND,ZTHV(1),ZHEIGHTM(1)) +! +! Compute Tv and the mixing ratio at the mass levels of the RS + ZTV(:)=ZTHV(:) * (ZPRESSM(:) / XP00) ** ZRDSCPD + ZMR(:)=SM_PMR_HU(ZPRESSM(:),ZTV(:),ZHU(:),SPREAD(ZMR(:),2,1)) +! +! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total + ZRT(:)=ZMR(:) + ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) +! +! +!* 2.5 ZUVTHVMR case : zGROUND, PGROUND, ThvGROUND, RGROUND +! (height, U, V) , +! (height, THv, R) +! +! + CASE ('ZUVTHVMR') +! Read data at ground level + READ(ILUPRE,*) ZZGROUND + READ(ILUPRE,*) ZPGROUND + READ(ILUPRE,*) ZTHVGROUND + READ(ILUPRE,*) ZMRGROUND +! +! Read number of wind levels + READ(ILUPRE,*) ILEVELU +! +! Allocate the required memory + ALLOCATE(ZHEIGHTU(ILEVELU)) + ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) +! +! Read the data at each wind level of the RS + DO JKU = 1,ILEVELU + READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) + END DO +! +! Read number of mass levels + READ(ILUPRE,*) ILEVELM +! +! Allocate the required memory + ALLOCATE(ZHEIGHTM(ILEVELM)) + ALLOCATE(ZTHV(ILEVELM)) + ALLOCATE(ZMR(ILEVELM)) + ALLOCATE(ZTHL(ILEVELM)) + ALLOCATE(ZRT(ILEVELM)) +! +! Read the data at each mass level of the RS + DO JKM=2,ILEVELM + READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHV(JKM),ZMR(JKM) + END DO +! +! Complete the mass arrays with the ground informations read in EXPRE file + ZHEIGHTM(1)= ZZGROUND ! Mass level 1 is at the ground + ZTHV(1) = ZTHVGROUND + ZMR(1) = ZMRGROUND +! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total + ZRT(:)=ZMR(:) + ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) +! +! +!* 2.6 PUVTHDMR case : zGROUND, PGROUND, ThdGROUND, RGROUND +! (Pressure, U, V) , +! (Pressure, THd, R) +! + CASE ('PUVTHDMR') +! Read data at ground level + READ(ILUPRE,*) ZZGROUND + READ(ILUPRE,*) ZPGROUND + READ(ILUPRE,*) ZTHDGROUND + READ(ILUPRE,*) ZMRGROUND +! +! Read number of wind levels + READ(ILUPRE,*) ILEVELU +! +! Allocate the required memory + ALLOCATE(ZPRESSU(ILEVELU)) + ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) + ALLOCATE(ZTHVU(ILEVELU)) + ALLOCATE(ZHEIGHTU(ILEVELU)) +! +! Read the data at each wind level of the RS + DO JKU =1,ILEVELU + READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) + END DO +! +! Read number of mass levels + READ(ILUPRE,*) ILEVELM +! +! Allocate the required memory + ALLOCATE(ZPRESSM(ILEVELM)) + ALLOCATE(ZTHD(ILEVELM)) + ALLOCATE(ZMR(ILEVELM)) + ALLOCATE(ZMRC(ILEVELM)) + ZMRC=0 + ALLOCATE(ZMRI(ILEVELM)) + ZMRI=0 + ALLOCATE(ZHEIGHTM(ILEVELM)) + ALLOCATE(ZTHV(ILEVELM)) + ALLOCATE(ZTHL(ILEVELM)) + ALLOCATE(ZRT(ILEVELM)) +! +! Read the data at each mass level of the RS + DO JKM=2,ILEVELM + IF(LUSERI) THEN + READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM) + ELSEIF (GUSERC) THEN + READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM) + ELSE + READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM),ZMR(JKM) + ENDIF + END DO +! +! Complete the mass arrays with the ground informations read in EXPRE file + ZPRESSM(1) = ZPGROUND ! Mass level 1 is at the ground + ZTHD(1) = ZTHDGROUND + ZMR(1) = ZMRGROUND + IF(GUSERC) ZMRC(1) = ZMRC(2) + IF(LUSERI) ZMRI(1) = ZMRI(2) +! +! Compute thetav at the mass levels of the RS + ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:)+ZMRI(:)) +! +! Compute the heights at the mass levels of the RS + ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) +! +! Compute thetav and heights of the wind levels + ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) + ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) +! +! Compute Theta l and Rt + IF (.NOT. GUSERC .AND. .NOT. LUSERI) THEN + ZRT(:)=ZMR(:) + ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) + ELSE + ALLOCATE(ZEXN(ILEVELM)) + ALLOCATE(ZT(ILEVELM)) + ALLOCATE(ZCPH(ILEVELM)) + ALLOCATE(ZLVOCPEXN(ILEVELM)) + ALLOCATE(ZLSOCPEXN(ILEVELM)) + ZRT(:)=ZMR(:)+ZMRI(:)+ZMRC(:) + ZEXN(:)=(ZPRESSM/XP00) ** (XRD/XCPD) + ZT(:)=ZTHV*(ZPRESSM(:)/XP00)**(ZRDSCPD)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) + ZCPH(:)=XCPD+ XCPV * ZMR(:)+ XCL *ZMRC(:) + XCI * ZMRI(:) + ZLVOCPEXN(:) = (XLVTT + (XCPV-XCL) * (ZT(:)-XTT))/(ZCPH*ZEXN(:)) + ZLSOCPEXN(:) = (XLSTT + (XCPV-XCI) * (ZT(:)-XTT))/(ZCPH*ZEXN(:)) + ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))-ZLVOCPEXN(:)*ZMRC(:)-ZLSOCPEXN(:)*ZMRI(:) + DEALLOCATE(ZEXN) + DEALLOCATE(ZT) + DEALLOCATE(ZCPH) + DEALLOCATE(ZLVOCPEXN) + DEALLOCATE(ZLSOCPEXN) + ENDIF +! +! +!* 2.7 PUVTHDHU case : zGROUND, PGROUND, ThdGROUND, HuGROUND +! (Pressure, U, V) , +! (Pressure, THd, Hu) +! + CASE ('PUVTHDHU') +! Read data at ground level + READ(ILUPRE,*) ZZGROUND + READ(ILUPRE,*) ZPGROUND + READ(ILUPRE,*) ZTHDGROUND + READ(ILUPRE,*) ZHUGROUND +! +! Read number of wind levels + READ(ILUPRE,*) ILEVELU +! +! Allocate the required memory + ALLOCATE(ZPRESSU(ILEVELU)) + ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) + ALLOCATE(ZTHVU(ILEVELU)) + ALLOCATE(ZHEIGHTU(ILEVELU)) +! +! Read the data at each wind level of the RS + DO JKU = 1,ILEVELU + READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) + END DO +! +! Read number of mass levels + READ(ILUPRE,*) ILEVELM +! +! Allocate the required memory + ALLOCATE(ZPRESSM(ILEVELM)) + ALLOCATE(ZTHD(ILEVELM)) + ALLOCATE(ZHU(ILEVELM)) + ALLOCATE(ZHEIGHTM(ILEVELM)) + ALLOCATE(ZTHV(ILEVELM)) + ALLOCATE(ZMR(ILEVELM)) + ALLOCATE(ZT(ILEVELM)) + ALLOCATE(ZTHL(ILEVELM)) + ALLOCATE(ZRT(ILEVELM)) +! +! Read the data at each mass level of the RS + DO JKM =2,ILEVELM + READ(ILUPRE,*) ZPRESSM(JKM),ZTHD(JKM), ZHU(JKM) + END DO +! Complete the mass arrays with the ground informations read in EXPRE file + ZPRESSM(1) = ZPGROUND ! Mass level 1 is at the ground + ZTHD(1) = ZTHDGROUND + ZHU(1) = ZHUGROUND +! + ZT(:) = ZTHD(:) * (ZPRESSM(:)/XP00)**ZRDSCPD ! compute T and mixing ratio + ZMR(:) = ZRDSRV*SM_FOES(ZT(:))/((ZPRESSM(:)*100./ZHU(:)) -SM_FOES(ZT(:))) + +! Compute thetav at the mass levels of the RS + ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)) +! +! Compute height at mass levels + ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) +! +! Compute thetav and heights of the wind levels + ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) + ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) +! +! Compute thetal and Rt + ZRT(:)=ZMR(:) + ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) +! +!* 2.8 ZUVTHDMR case : zGROUND, PGROUND, ThdGROUND, RGROUND +! (height, U, V) , +! (height, THd, R) +! + CASE ('ZUVTHDMR') +! Read data at ground level + READ(ILUPRE,*) ZZGROUND + READ(ILUPRE,*) ZPGROUND + READ(ILUPRE,*) ZTHDGROUND + READ(ILUPRE,*) ZMRGROUND +! +! Read number of wind levels + READ(ILUPRE,*) ILEVELU +! +! Allocate required memory + ALLOCATE(ZHEIGHTU(ILEVELU)) + ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) +! +! Read the data at each wind level of the RS + DO JKU = 1,ILEVELU + READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) + END DO +! +! Read number of mass levels + READ(ILUPRE,*) ILEVELM +! +! Allocate required memory + ALLOCATE(ZHEIGHTM(ILEVELM)) + ALLOCATE(ZTHD(ILEVELM)) + ALLOCATE(ZMR(ILEVELM)) + ALLOCATE(ZTHV(ILEVELM)) + ALLOCATE(ZMRC(ILEVELM)) + ZMRC=0 + ALLOCATE(ZMRI(ILEVELM)) + ZMRI=0 + ALLOCATE(ZTHL(ILEVELM)) + ALLOCATE(ZRT(ILEVELM)) +! +! Read the data at each mass level of the RS + DO JKM= 2,ILEVELM + IF(LUSERI) THEN + READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM) + ELSEIF (GUSERC) THEN + READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM),ZMRC(JKM) + ELSE + READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHD(JKM),ZMR(JKM) + ENDIF + END DO +! Complete the mass arrays with the ground informations read in EXPRE file + ZHEIGHTM(1) = ZZGROUND ! Mass level 1 is at ground + ZTHD(1) = ZTHDGROUND + ZMR(1) = ZMRGROUND + IF(GUSERC) ZMRC(1) = ZMRC(2) + IF(LUSERI) ZMRI(1) = ZMRI(2) +! Compute thetav at the mass levels of the RS + IF(LUSERI) THEN + ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:)+ZMRI(:)) + ELSEIF (GUSERC) THEN + ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)+ZMRC(:)) + ELSE + ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)) + ENDIF +! +! Compute Theta l and Rt + IF (.NOT. GUSERC .AND. .NOT. LUSERI) THEN + ZRT(:)=ZMR(:) + ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) + ELSE + ALLOCATE(ZEXN(ILEVELM)) + ALLOCATE(ZEXNFLUX(ILEVELM)) + ALLOCATE(ZT(ILEVELM)) + ALLOCATE(ZCPH(ILEVELM)) + ALLOCATE(ZLVOCPEXN(ILEVELM)) + ALLOCATE(ZLSOCPEXN(ILEVELM)) + ZRT(:)=ZMR(:)+ZMRI(:)+ZMRC(:) + ZEXNSURF=(ZPGROUND/XP00) ** (XRD/XCPD) + CALL COMPUTE_EXNER_FROM_GROUND(ZTHV,ZHEIGHTM,ZEXNSURF,ZEXNFLUX,ZEXN) + ZT(:)=ZTHV*ZEXN(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) + ZCPH(:)=XCPD+ XCPV * ZMR(:)+ XCL *ZMRC(:) + XCI * ZMRI(:) + ZLVOCPEXN(:) = (XLVTT + (XCPV-XCL) * (ZT(:)-XTT))/(ZCPH*ZEXN(:)) + ZLSOCPEXN(:) = (XLSTT + (XCPV-XCI) * (ZT(:)-XTT))/(ZCPH*ZEXN(:)) + ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:))-ZLVOCPEXN(:)*ZMRC(:)-ZLSOCPEXN(:)*ZMRI(:) + DEALLOCATE(ZEXN) + DEALLOCATE(ZEXNFLUX) + DEALLOCATE(ZT) + DEALLOCATE(ZCPH) + DEALLOCATE(ZLVOCPEXN) + DEALLOCATE(ZLSOCPEXN) + ENDIF +! +! 2.9 ZUVTHLMR case : zGROUND, PGROUND, ThdGROUND, RGROUND +! (height, U, V) +! (height, THL, Rt) + +! + CASE ('ZUVTHLMR') +! Read data at ground level + READ(ILUPRE,*) ZZGROUND + READ(ILUPRE,*) ZPGROUND + READ(ILUPRE,*) ZTHLGROUND + READ(ILUPRE,*) ZMRGROUND +! +! Read number of wind levels + READ(ILUPRE,*) ILEVELU +! +! Allocate required memory + ALLOCATE(ZHEIGHTU(ILEVELU)) + ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) +! +! Read the data at each wind level of the RS + DO JKU = 1,ILEVELU + READ(ILUPRE,*) ZHEIGHTU(JKU),ZU(JKU),ZV(JKU) + END DO +! +! Read number of mass levels + READ(ILUPRE,*) ILEVELM +! +! Allocate required memory + ALLOCATE(ZHEIGHTM(ILEVELM)) + ALLOCATE(ZTHL(ILEVELM)) + ALLOCATE(ZTH(ILEVELM)) + ALLOCATE(ZMR(ILEVELM)) + ALLOCATE(ZTHV(ILEVELM)) + ALLOCATE(ZMRC(ILEVELM)) + ZMRC=0 + ALLOCATE(ZMRI(ILEVELM)) + ZMRI=0 + ALLOCATE(ZRT(ILEVELM)) +! +! Read the data at each mass level of the RS + DO JKM= 2,ILEVELM +! IF(LUSERI) THEN +! READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM),ZMRC(JKM),ZMRI(JKM) +! ELSEIF (GUSERC) THEN + IF (GUSERC) THEN + READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM),ZMRC(JKM) + ELSE + READ(ILUPRE,*) ZHEIGHTM(JKM),ZTHL(JKM),ZMR(JKM) + ENDIF + END DO +! Complete the mass arrays with the ground informations read in EXPRE file + ZHEIGHTM(1) = ZZGROUND ! Mass level 1 is at ground + ZTHL(1) = ZTHLGROUND + ZMR(1) = ZMRGROUND + IF(GUSERC) ZMRC(1) = ZMRC(2) +! IF(LUSERI) ZMRI(1) = ZMRI(2) +! +! Compute Rt + ZRT(:)=ZMR+ZMRC+ZMRI +! +!* 2.10 PUVTHU case : zGROUND, PGROUND, TempGROUND, HuGROUND +! (Pressure, U, V) , +! (Pressure, Temp, Hu) +! + CASE ('PUVTHU') +! Read data at ground level + READ(ILUPRE,*) ZZGROUND + READ(ILUPRE,*) ZPGROUND + READ(ILUPRE,*) ZTGROUND + READ(ILUPRE,*) ZHUGROUND +! +! Read number of wind levels + READ(ILUPRE,*) ILEVELU +! +! Allocate the required memory + ALLOCATE(ZPRESSU(ILEVELU)) + ALLOCATE(ZU(ILEVELU),ZV(ILEVELU)) + ALLOCATE(ZTHVU(ILEVELU)) + ALLOCATE(ZHEIGHTU(ILEVELU)) +! +! Read the data at each wind level of the RS + DO JKU = 1,ILEVELU + READ(ILUPRE,*) ZPRESSU(JKU),ZU(JKU),ZV(JKU) + END DO +! +! Read number of mass levels + READ(ILUPRE,*) ILEVELM +! +! Allocate the required memory + ALLOCATE(ZPRESSM(ILEVELM)) + ALLOCATE(ZTHD(ILEVELM)) + ALLOCATE(ZHU(ILEVELM)) + ALLOCATE(ZHEIGHTM(ILEVELM)) + ALLOCATE(ZTHV(ILEVELM)) + ALLOCATE(ZMR(ILEVELM)) + ALLOCATE(ZT(ILEVELM)) + ALLOCATE(ZTHL(ILEVELM)) + ALLOCATE(ZRT(ILEVELM)) + +! +! Read the data at each mass level of the RS + DO JKM =2,ILEVELM + READ(ILUPRE,*) ZPRESSM(JKM),ZT(JKM), ZHU(JKM) + END DO +! Complete the mass arrays with the ground informations read in EXPRE file + ZPRESSM(1) = ZPGROUND ! Mass level 1 is at the ground + ZT(1) = ZTGROUND + ZHU(1) = ZHUGROUND +! + ZTHD(:) = ZT(:) / (ZPRESSM(:)/XP00)**ZRDSCPD ! compute THD and mixing ratio + ZMR(:) = ZRDSRV*SM_FOES(ZT(:))/((ZPRESSM(:)*100./ZHU(:)) -SM_FOES(ZT(:))) +! Compute thetav at the mass levels of the RS + ZTHV(:) = ZTHD(:) * (1. + ZRVSRD *ZMR(:))/(1.+ZMR(:)) +! +! Compute height at mass levels + ZHEIGHTM(:) = HEIGHT_PRESS(ZPRESSM,ZTHV,ZPGROUND,ZTHV(1),ZZGROUND) +! +! Compute thetav and heights of the wind levels + ZTHVU(:) = THETAVPU_THETAVPM(ZPRESSM,ZPRESSU,ZTHV) + ZHEIGHTU(:) = HEIGHT_PRESS(ZPRESSU,ZTHVU,ZPGROUND,ZTHV(1),ZZGROUND) +! +! on interpole thetal(=theta quand il n'y a pas d'eau liquide) et r total + ZRT(:)=ZMR(:) + ZTHL(:)=ZTHV(:)*(1+ZRT(:))/(1+ZRVSRD*ZRT(:)) + CASE DEFAULT + CALL PRINT_MSG(NVERB_FATAL,'GEN','SET_RSOU','data type YKIND='//TRIM(YKIND)//' in PREFILE unknown') +END SELECT +! +!------------------------------------------------------------------------------- +! +!* 3. INTERPOLATE ON THE VERTICAL MIXED MODEL GRID +! --------------------------------------------------------- +! +! +! +IKU=SIZE(XZHAT) +! +!* 3.1 Compute mixed grid +! +IF (PRESENT(PCORIOZ)) THEN +! LGEOSBAL=T (no shift allowed, MNH grid without ororgraphy) + ZZS_LS(:,:)=0 +ELSE + IF (OSHIFT) THEN + ZZS_LS(:,:)=ZZGROUND + ELSE + ZZS_LS(:,:)=0 + ENDIF +ENDIF +CALL VERT_COORD(LSLEVE,ZZS_LS,ZZS_LS,XLEN1,XLEN2,XZHAT,ZZFLUX_MX) +ZZMASS_MX(:,:,:)=MZF(ZZFLUX_MX) +ZZMASS_MX(:,:,IKU)=1.5*ZZFLUX_MX(:,:,IKU)-0.5*ZZFLUX_MX(:,:,IKU-1) +! +!* 3.2 Interpolate and extrapolate U and V on w- mixed grid levels +! +!* vertical grid at initialization profile location +GPROFILE_IN_PROC=(KILOC+JPHEXT-IXOR_ll+1>=IIB .AND. KILOC+JPHEXT-IXOR_ll+1<=IIE) & + & .AND. (KJLOC+JPHEXT-IYOR_ll+1>=IJB .AND. KJLOC+JPHEXT-IYOR_ll+1<=IJE) +! +IF (GPROFILE_IN_PROC) THEN + ZZMASS_PROFILE(:) = ZZMASS_MX(KILOC+JPHEXT-IXOR_ll+1,KJLOC+JPHEXT-IYOR_ll+1,:) + ZZFLUX_PROFILE(:) = ZZFLUX_MX(KILOC+JPHEXT-IXOR_ll+1,KJLOC+JPHEXT-IYOR_ll+1,:) +ELSE + ZZMASS_PROFILE(:) = 0. + ZZFLUX_PROFILE(:) = 0. +END IF +DO JK = 1,IKU + CALL REDUCESUM_ll(ZZMASS_PROFILE(JK), IINFO_ll) + CALL REDUCESUM_ll(ZZFLUX_PROFILE(JK), IINFO_ll) +END DO + +! interpolation of U and V +DO JK = 1,IKU + IF (ZZFLUX_PROFILE(JK) <= ZHEIGHTU(1)) THEN ! extrapolation below the first level + ZDZSDH = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(1)) / (ZHEIGHTU(2) - ZHEIGHTU(1)) + ZUW(JK) = ZU(1) + (ZU(2) - ZU(1)) * ZDZSDH + ZVW(JK) = ZV(1) + (ZV(2) - ZV(1)) * ZDZSDH + ELSE IF (ZZFLUX_PROFILE(JK) > ZHEIGHTU(ILEVELU) ) THEN ! extrapolation above the last + ZDZSDH = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(ILEVELU)) & ! level + / (ZHEIGHTU(ILEVELU) - ZHEIGHTU(ILEVELU-1)) + ZUW(JK) = ZU(ILEVELU) + (ZU(ILEVELU) -ZU(ILEVELU -1)) * ZDZSDH + ZVW(JK) = ZV(ILEVELU) + (ZV(ILEVELU) -ZV(ILEVELU -1)) * ZDZSDH + ELSE ! interpolation between the first and last levels + DO JKLEV = 1,ILEVELU-1 + IF ( (ZZFLUX_PROFILE(JK) > ZHEIGHTU(JKLEV)).AND. & + (ZZFLUX_PROFILE(JK) <= ZHEIGHTU(JKLEV+1)) )THEN + ZDZ1SDH = (ZZFLUX_PROFILE(JK) - ZHEIGHTU(JKLEV)) & + / (ZHEIGHTU(JKLEV+1)-ZHEIGHTU(JKLEV)) + ZDZ2SDH = (ZHEIGHTU(JKLEV+1) - ZZFLUX_PROFILE(JK) ) & + / (ZHEIGHTU(JKLEV+1)-ZHEIGHTU(JKLEV)) + ZUW(JK) = (ZU(JKLEV) * ZDZ2SDH) + (ZU(JKLEV+1) *ZDZ1SDH) + ZVW(JK) = (ZV(JKLEV) * ZDZ2SDH) + (ZV(JKLEV+1) *ZDZ1SDH) + END IF + END DO + END IF +END DO +! +!* 3.3 Interpolate and extrapolate Thetav and r on mass mixed grid levels +! +ZMRCM=0 +ZMRIM=0 +DO JK = 1,IKU + IF (ZZMASS_PROFILE(JK) <= ZHEIGHTM(1)) THEN ! extrapolation below the first level + ZDZSDH = (ZZMASS_PROFILE(JK) - ZHEIGHTM(1)) / (ZHEIGHTM(2) - ZHEIGHTM(1)) + ZTHLM(JK) = ZTHL(1) + (ZTHL(2) - ZTHL(1)) * ZDZSDH + ZMRM(JK) = ZRT(1) + (ZRT(2) - ZRT(1)) * ZDZSDH + IF (GUSERC) ZMRCM(JK) = ZMRC(1) + (ZMRC(2) - ZMRC(1)) * ZDZSDH + IF (LUSERI) ZMRIM(JK) = ZMRI(1) + (ZMRI(2) - ZMRI(1)) * ZDZSDH + ELSE IF (ZZMASS_PROFILE(JK) > ZHEIGHTM(ILEVELM) ) THEN ! extrapolation above the last + ZDZSDH = (ZZMASS_PROFILE(JK) - ZHEIGHTM(ILEVELM)) & ! level + / (ZHEIGHTM(ILEVELM) - ZHEIGHTM(ILEVELM-1)) + ZTHLM(JK) = ZTHL(ILEVELM) + (ZTHL(ILEVELM) -ZTHL(ILEVELM -1)) * ZDZSDH + ZMRM(JK) = ZRT(ILEVELM) + (ZRT(ILEVELM) -ZRT(ILEVELM -1)) * ZDZSDH + IF (GUSERC) ZMRCM(JK) = ZMRC(ILEVELM) + (ZMRC(ILEVELM) -ZMRC(ILEVELM -1)) * ZDZSDH + IF (LUSERI) ZMRIM(JK) = ZMRI(ILEVELM) + (ZMRI(ILEVELM) -ZMRI(ILEVELM -1)) * ZDZSDH + ELSE ! interpolation between the first and last levels + DO JKLEV = 1,ILEVELM-1 + IF ( (ZZMASS_PROFILE(JK) > ZHEIGHTM(JKLEV)).AND. & + (ZZMASS_PROFILE(JK) <= ZHEIGHTM(JKLEV+1)) )THEN + ZDZ1SDH = (ZZMASS_PROFILE(JK) - ZHEIGHTM(JKLEV)) & + / (ZHEIGHTM(JKLEV+1)-ZHEIGHTM(JKLEV)) + ZDZ2SDH = (ZHEIGHTM(JKLEV+1) - ZZMASS_PROFILE(JK) ) & + / (ZHEIGHTM(JKLEV+1)-ZHEIGHTM(JKLEV)) + ZTHLM(JK) = (ZTHL(JKLEV) * ZDZ2SDH) + (ZTHL(JKLEV+1) *ZDZ1SDH) + ZMRM(JK) = (ZRT(JKLEV) * ZDZ2SDH) + (ZRT(JKLEV+1) *ZDZ1SDH) + IF (GUSERC) ZMRCM(JK) = (ZMRC(JKLEV) * ZDZ2SDH) + (ZMRC(JKLEV+1) *ZDZ1SDH) + IF (LUSERI) ZMRIM(JK) = (ZMRI(JKLEV) * ZDZ2SDH) + (ZMRI(JKLEV+1) *ZDZ1SDH) + END IF + END DO + END IF +END DO +! +! Compute thetaV rv ri and Rc with adjustement +ALLOCATE(ZEXNFLUX(IKU)) +ALLOCATE(ZEXNMASS(IKU)) +ALLOCATE(ZPRESS(IKU)) +ALLOCATE(ZPREFLUX(IKU)) +ALLOCATE(ZFRAC_ICE(IKU)) +ALLOCATE(ZRSATW(IKU)) +ALLOCATE(ZRSATI(IKU)) +ALLOCATE(ZMRT(IKU)) +ZMRT=ZMRM+ZMRCM+ZMRIM +ZTHVM=ZTHLM +! +IF (LOCEAN) THEN + ZRHODM(:)=XRH00OCEAN*(1.-XALPHAOC*(ZTHLM(:) - XTH00OCEAN)& + +XBETAOC* (ZMRM(:) - XSA00OCEAN)) + ZPREFLUX(IKU)=ZPTOP + DO JK=IKU-1,2,-1 + ZPREFLUX(JK) = ZPREFLUX(JK+1) + XG*ZRHODM(JK)*(ZZFLUX_PROFILE(JK+1)-ZZFLUX_PROFILE(JK)) + END DO + ZPGROUND=ZPREFLUX(2) + WRITE(ILUOUT,FMT=*)'ZPGROUND i.e. Pressure at ocean domain bottom',ZPGROUND + ZTHM=ZTHVM +ELSE +! Atmospheric case + ZEXNSURF=(ZPGROUND/XP00)**(XRD/XCPD) + DO JLOOP=1,20 ! loop for pression + CALL COMPUTE_EXNER_FROM_GROUND(ZTHVM,ZZMASS_PROFILE(:),ZEXNSURF,ZEXNFLUX,ZEXNMASS) + ZPRESS(:)=XP00*(ZEXNMASS(:))**(XCPD/XRD) + CALL TH_R_FROM_THL_RT_1D('T',ZFRAC_ICE,ZPRESS,ZTHLM,ZMRT,ZTHM,ZMRM,ZMRCM,ZMRIM, & + ZRSATW, ZRSATI,OOCEAN=.FALSE.) + ZTHVM(:)=ZTHM(:)*(1.+XRV/XRD*ZMRM(:))/(1.+(ZMRM(:)+ZMRIM(:)+ZMRCM(:))) + ENDDO +ENDIF +! +DEALLOCATE(ZEXNFLUX) +DEALLOCATE(ZEXNMASS) +DEALLOCATE(ZPRESS) +DEALLOCATE(ZFRAC_ICE) +DEALLOCATE(ZRSATW) +DEALLOCATE(ZRSATI) +DEALLOCATE(ZMRT) +!------------------------------------------------------------------------------- +! +!* 4. COMPUTE FIELDS ON THE MODEL GRID (WITH OROGRAPHY) +! ------------------------------------------------- +CALL SET_MASS(TPFILE,GPROFILE_IN_PROC, ZZFLUX_PROFILE, & + KILOC+JPHEXT,KJLOC+JPHEXT,ZZS_LS,ZZMASS_MX,ZZFLUX_MX,ZPGROUND,& + ZTHVM,ZMRM,ZUW,ZVW,OSHIFT,OBOUSS,PJ,HFUNU,HFUNV, & + PMRCM=ZMRCM,PMRIM=ZMRIM,PCORIOZ=PCORIOZ) +! +DEALLOCATE(ZPREFLUX) +DEALLOCATE(ZHEIGHTM) +DEALLOCATE(ZTHV) +DEALLOCATE(ZMR) +DEALLOCATE(ZTHL) +!------------------------------------------------------------------------------- +CONTAINS + SUBROUTINE CHECK( ISTATUS, YLOC ) + INTEGER(KIND=CDFINT), INTENT(IN) :: ISTATUS + CHARACTER(LEN=*), INTENT(IN) :: YLOC + + IF( ISTATUS /= NF90_NOERR ) THEN + CALL PRINT_MSG( NVERB_ERROR, 'IO', 'SET_RSOU', 'error at ' // Trim( yloc) // ': ' // NF90_STRERROR( ISTATUS ) ) + END IF + END SUBROUTINE check +! +END SUBROUTINE SET_RSOU diff --git a/src/mesonh/ext/shallow_mf_pack.f90 b/src/mesonh/ext/shallow_mf_pack.f90 new file mode 100644 index 0000000000000000000000000000000000000000..5001e4bad2c8926109efca0bcc1c4cf4469ba006 --- /dev/null +++ b/src/mesonh/ext/shallow_mf_pack.f90 @@ -0,0 +1,481 @@ +!MNH_LIC Copyright 2010-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. +!----------------------------------------------------------------- +! ###################### + MODULE MODI_SHALLOW_MF_PACK +! ###################### +! +INTERFACE +! ################################################################# + SUBROUTINE SHALLOW_MF_PACK(KRR,KRRL,KRRI, & + HMF_UPDRAFT, HMF_CLOUD, OMIXUV, & + OMF_FLX,TPFILE,PTIME_LES, & + PIMPL_MF, PTSTEP, & + PDZZ, PZZ, PDX,PDY, & + PRHODJ, PRHODREF, & + PPABSM, PEXN, & + PSFTH,PSFRV, & + PTHM,PRM,PUM,PVM,PWM,PTKEM,PSVM, & + PRTHS,PRRS,PRUS,PRVS,PRSVS, & + PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF ) +! ################################################################# +!! +use MODD_IO, only: TFILEDATA +use modd_precision, only: MNHTIME +! +!* 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. +CHARACTER (LEN=4), INTENT(IN) :: HMF_UPDRAFT! Type of Mass Flux Scheme + ! 'NONE' if no parameterization +CHARACTER (LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud + ! scheme +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum +LOGICAL, INTENT(IN) :: OMF_FLX ! switch to write the + ! MF fluxes in the synchronous FM-file +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +REAL(kind=MNHTIME),DIMENSION(2), INTENT(OUT) :: PTIME_LES ! time spent in LES computations +REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness +REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height of flux point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry density of the + ! reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXN ! Exner function at t-dt + +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at t-dt +REAL, DIMENSION(:,:,:,:),INTENT(IN):: PRM ! water var. at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM ! wind components at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! tke at t-dt + +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar variable a t-dt + +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS,PRVS,PRTHS ! Meso-NH sources +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Scalar sources +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme +! +REAL, INTENT(IN) :: PDX,PDY ! Size of mesh in X/Y directions +END SUBROUTINE SHALLOW_MF_PACK + +END INTERFACE +! +END MODULE MODI_SHALLOW_MF_PACK + +! ################################################################# + SUBROUTINE SHALLOW_MF_PACK(KRR,KRRL,KRRI, & + HMF_UPDRAFT, HMF_CLOUD, OMIXUV, & + OMF_FLX,TPFILE,PTIME_LES, & + PIMPL_MF, PTSTEP, & + PDZZ, PZZ, PDX,PDY, & + PRHODJ, PRHODREF, & + PPABSM, PEXN, & + PSFTH,PSFRV, & + PTHM,PRM,PUM,PVM,PWM,PTKEM,PSVM, & + PRTHS,PRRS,PRUS,PRVS,PRSVS, & + PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF ) +! ################################################################# +!! +!!**** *SHALLOW_MF_PACK* - +!! +!! +!! PURPOSE +!! ------- +!!**** The purpose of this routine is +!! +! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! +!! AUTHOR +!! ------ +!! V.Masson 09/2010 +! -------------------------------------------------------------------------- +! Modifications: +! R. Honnert 07/2012: introduction of vertical wind for the height of the thermal +! M. Leriche 02/2017: avoid negative values for sv tendencies +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! S. Riette 11/2016: support for CFRAC_ICE_SHALLOW_MF +! P. Wautelet 28/03/2019: use MNHTIME for time measurement variables +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_u, lbudget_v, lbudget_th, lbudget_rv, lbudget_sv, & + NBUDGET_U, NBUDGET_V, NBUDGET_TH, NBUDGET_RV, NBUDGET_SV1, & + tbudgets +USE MODD_CONF +USE MODD_CST +USE MODD_IO, ONLY: TFILEDATA +use modd_field, only: tfielddata, TYPEREAL +USE MODD_NSV +USE MODD_PARAMETERS +USE MODD_PARAM_ICE, ONLY: CFRAC_ICE_SHALLOW_MF +USE MODD_PARAM_MFSHALL_n +use modd_precision, only: MNHTIME + +use mode_budget, only: Budget_store_init, Budget_store_end +USE MODE_IO_FIELD_WRITE, only: IO_Field_write + +USE MODI_DIAGNOS_LES_MF +USE MODI_SHALLOW_MF +USE MODI_SHUMAN +! +IMPLICIT NONE + +!* 0.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. +CHARACTER (LEN=4), INTENT(IN) :: HMF_UPDRAFT! Type of Mass Flux Scheme + ! 'NONE' if no parameterization +CHARACTER (LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud + ! scheme +LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum +LOGICAL, INTENT(IN) :: OMF_FLX ! switch to write the + ! MF fluxes in the synchronous FM-file +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +REAL(kind=MNHTIME),DIMENSION(2), INTENT(OUT) :: PTIME_LES ! time spent in LES computations +REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness +REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep + +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height of flux point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! Metric coefficients +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry density of the + ! reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXN ! Exner function at t-dt + +REAL, DIMENSION(:,:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHM ! Theta at t-dt +REAL, DIMENSION(:,:,:,:),INTENT(IN):: PRM ! water var. at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM ! wind components at t-dt +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! tke at t-dt + +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar variable a t-dt + +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS,PRVS,PRTHS ! Meso-NH sources +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS +REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! Scalar sources +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme +! +REAL, INTENT(IN) :: PDX,PDY ! Size of mesh in X/Y directions +! 0.2 Declaration of local variables +! +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZZZ ! Height of flux point +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDZZ ! Metric coefficients +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRHODJ ! dry density * Grid size +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRHODREF ! dry density of the + ! reference state +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZPABSM ! Pressure at time t-1 +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZEXN ! Exner function at t-dt + +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZTHM ! Theta at t-dt +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PRM,4)) :: ZRM ! water var. at t-dt +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZUM,ZVM,ZWM ! wind components at t-dt +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZTKEM ! tke at t-dt + +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) :: ZSVM ! scalar variable a t-dt + +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDUDT_TURB ! tendency of U by turbulence only +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDVDT_TURB ! tendency of V by turbulence only +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDTHLDT_TURB ! tendency of thl by turbulence only +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDRTDT_TURB ! tendency of rt by turbulence only +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) :: ZDSVDT_TURB ! tendency of Sv by turbulence only +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDUDT_MF ! tendency of U by massflux scheme +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDVDT_MF ! tendency of V by massflux scheme +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDTHLDT_MF ! tendency of thl by massflux scheme +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDRTDT_MF ! tendency of Rt by massflux scheme +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) :: ZDSVDT_MF ! tendency of Sv by massflux scheme +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZSIGMF,ZRC_MF,ZRI_MF,ZCF_MF ! cloud info for the cloud scheme +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZTHVMF ! Thermal production for TKE scheme +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZTHMF +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZRMF +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZUMF +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFLXZVMF +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZTHL_UP ! updraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRT_UP ! updraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRV_UP ! updraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZU_UP ! updraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZV_UP ! updraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRC_UP ! updraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRI_UP ! updraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZTHV_UP ! updraft characteristics + +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZTHL_DO ! downdraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZTHV_DO ! downdraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZRT_DO ! downdraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZU_DO ! downdraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZV_DO ! downdraft characteristics + +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZW_UP ! updraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZFRAC_UP ! updraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZEMF ! updraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDETR ! updraft characteristics +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2),SIZE(PTHM,3)) :: ZENTR ! updraft characteristics +INTEGER,DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2)) :: IKLCL,IKETL,IKCTL ! level of LCL,ETL and CTL +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2)) :: ZSFTH ! Surface sensible heat flux +REAL, DIMENSION(SIZE(PTHM,1)*SIZE(PTHM,2)) :: ZSFRV ! Surface latent heat flux +! +! +!* 3D arrays +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZWORK ! work array +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZUMM ! wind on mass point +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZVMM ! wind on mass point +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZWMM ! wind on mass point +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDUDT ! tendency of U by massflux scheme +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDVDT ! tendency of V by massflux scheme +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDTHLDT ! tendency of thl by massflux scheme +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3)) :: ZDRTDT ! tendency of Rt by massflux scheme +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) :: ZDSVDT ! tendency of Sv by massflux scheme + +INTEGER :: IIU, IJU, IKU, IKB, IKE, IRR, ISV +INTEGER :: JK,JRR,JSV ! Loop counters + +TYPE(TFIELDDATA) :: TZFIELD +!------------------------------------------------------------------------ + +!!! 1. Initialisation + +! Internal Domain +IIU=SIZE(PTHM,1) +IJU=SIZE(PTHM,2) +IKU=SIZE(PTHM,3) +IKB=1+JPVEXT +IKE=IKU-JPVEXT + +! number of moist var +IRR=SIZE(PRM,4) +! number of scalar var +ISV=SIZE(PSVM,4) + +if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U ), 'MAFL', prus (:, :, :) ) +if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V ), 'MAFL', prvs (:, :, :) ) +if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'MAFL', prths(:, :, :) ) +if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'MAFL', prrs (:, :, :, 1) ) +if ( lbudget_sv ) then + do jsv = 1, isv + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv), 'MAFL', prsvs(:, :, :, jsv) ) + end do +end if + +ZSVM(:,:,:) = 0. +! +! +! wind on mass points +ZUMM=MXF(PUM) +ZVMM=MYF(PVM) +ZWMM=MZF(PWM) +! +!!! 2. Pack input variables +! +DO JK=1,IKU + ZZZ (:,JK) = RESHAPE(PZZ (:,:,JK),(/ IIU*IJU /) ) + ZDZZ (:,JK) = RESHAPE(PDZZ (:,:,JK),(/ IIU*IJU /) ) + ZRHODJ (:,JK) = RESHAPE(PRHODJ (:,:,JK),(/ IIU*IJU /) ) + ZTHM (:,JK) = RESHAPE(PTHM (:,:,JK),(/ IIU*IJU /) ) + ZTKEM (:,JK) = RESHAPE(PTKEM (:,:,JK),(/ IIU*IJU /) ) + ZPABSM (:,JK) = RESHAPE(PPABSM (:,:,JK),(/ IIU*IJU /) ) + ZEXN (:,JK) = RESHAPE(PEXN (:,:,JK),(/ IIU*IJU /) ) + ZRHODJ (:,JK) = RESHAPE(PRHODJ (:,:,JK),(/ IIU*IJU /) ) + ZRHODREF(:,JK) = RESHAPE(PRHODREF(:,:,JK),(/ IIU*IJU /) ) + ZUM (:,JK) = RESHAPE(ZUMM (:,:,JK),(/ IIU*IJU /) ) + ZVM (:,JK) = RESHAPE(ZVMM (:,:,JK),(/ IIU*IJU /) ) + ZWM (:,JK) = RESHAPE(ZWMM (:,:,JK),(/ IIU*IJU /) ) + DO JRR=1,IRR + ZRM (:,JK,JRR) = RESHAPE(PRM (:,:,JK,JRR),(/ IIU*IJU /) ) + END DO + DO JSV=1,ISV + IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE + ZSVM(:,JK,JSV) = RESHAPE(PSVM (:,:,JK,JSV),(/ IIU*IJU /) ) + END DO +END DO + +ZSFTH(:)=RESHAPE(PSFTH(:,:),(/ IIU*IJU /) ) +ZSFRV(:)=RESHAPE(PSFRV(:,:),(/ IIU*IJU /) ) + +!!! 3. Call of the physical parameterization of massflux vertical transport + +CALL SHALLOW_MF(1,IKU,1,KRR,KRRL,KRRI, & + HMF_UPDRAFT, HMF_CLOUD, CFRAC_ICE_SHALLOW_MF, OMIXUV, & + LNOMIXLG,NSV_LGBEG,NSV_LGEND, & + PIMPL_MF, PTSTEP, & + ZDZZ, ZZZ, & + ZRHODJ,ZRHODREF, & + ZPABSM, ZEXN, & + ZSFTH,ZSFRV, & + ZTHM,ZRM,ZUM,ZVM,ZTKEM,ZSVM, & + ZDUDT_MF,ZDVDT_MF, & + ZDTHLDT_MF,ZDRTDT_MF,ZDSVDT_MF, & + ZSIGMF,ZRC_MF,ZRI_MF,ZCF_MF,ZFLXZTHVMF, & + ZFLXZTHMF,ZFLXZRMF,ZFLXZUMF,ZFLXZVMF, & + ZTHL_UP,ZRT_UP,ZRV_UP,ZRC_UP,ZRI_UP, & + ZU_UP, ZV_UP, ZTHV_UP, ZW_UP, & + ZFRAC_UP,ZEMF,ZDETR,ZENTR, & + IKLCL,IKETL,IKCTL,PDX,PDY ) + +!!! 4. Unpack output variables + +ZDTHLDT(:,:,:)=RESHAPE(ZDTHLDT_MF(:,:),(/ IIU,IJU,IKU /) ) +ZDRTDT(:,:,:)=RESHAPE(ZDRTDT_MF(:,:),(/ IIU,IJU,IKU /) ) +ZDUDT(:,:,:)=RESHAPE(ZDUDT_MF(:,:),(/ IIU,IJU,IKU /) ) +ZDVDT(:,:,:)=RESHAPE(ZDVDT_MF(:,:),(/ IIU,IJU,IKU /) ) +PSIGMF(:,:,:)=RESHAPE(ZSIGMF(:,:),(/ IIU,IJU,IKU /) ) +PRC_MF(:,:,:)=RESHAPE(ZRC_MF(:,:),(/ IIU,IJU,IKU /) ) +PRI_MF(:,:,:)=RESHAPE(ZRI_MF(:,:),(/ IIU,IJU,IKU /) ) +PCF_MF(:,:,:)=RESHAPE(ZCF_MF(:,:),(/ IIU,IJU,IKU /) ) +PFLXZTHVMF(:,:,:)=RESHAPE(ZFLXZTHVMF(:,:),(/ IIU,IJU,IKU /) ) +DO JSV=1,ISV + IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE + ZDSVDT(:,:,:,JSV) = RESHAPE(ZDSVDT_MF(:,:,JSV),(/ IIU,IJU,IKU /) ) +END DO +! +!!! 5. Compute source terms for Meso-NH pronostic variables +!!! ---------------------------------------------------- + + +! As the pronostic variable of Meso-Nh are not (yet) the conservative variables +! the thl tendency is put in th and the rt tendency in rv +! the adjustment will do later the repartition between vapor and cloud +PRTHS(:,:,:) = PRTHS(:,:,:) + & + PRHODJ(:,:,:)*ZDTHLDT(:,:,:) +PRRS(:,:,:,1) = PRRS(:,:,:,1) + & + PRHODJ(:,:,:)*ZDRTDT(:,:,:) +PRUS(:,:,:) = PRUS(:,:,:) +MXM( & + PRHODJ(:,:,:)*ZDUDT(:,:,:)) +PRVS(:,:,:) = PRVS(:,:,:) +MYM( & + PRHODJ(:,:,:)*ZDVDT(:,:,:)) + +DO JSV=1,ISV + IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE + PRSVS(:,:,:,JSV) = MAX((PRSVS(:,:,:,JSV) + & + PRHODJ(:,:,:)*ZDSVDT(:,:,:,JSV)),XSVMIN(JSV)) +END DO + +!!! 7. call to MesoNH budgets +if ( lbudget_u ) call Budget_store_end( tbudgets(NBUDGET_U ), 'MAFL', prus (:, :, :) ) +if ( lbudget_v ) call Budget_store_end( tbudgets(NBUDGET_V ), 'MAFL', prvs (:, :, :) ) +if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'MAFL', prths(:, :, :) ) +if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'MAFL', prrs (:, :, :, 1) ) +if ( lbudget_sv ) then + do jsv = 1, isv + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv), 'MAFL', prsvs(:, :, :, jsv) ) + end do +end if + +!!! 8. Prints the fluxes in output file +! +IF ( OMF_FLX .AND. tpfile%lopened ) THEN + ! stores the conservative potential temperature vertical flux + ZWORK(:,:,:)=RESHAPE(ZFLXZTHMF (:,:),(/ IIU,IJU,IKU /) ) + TZFIELD%CMNHNAME = 'MF_THW_FLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'MF_THW_FLX' + TZFIELD%CUNITS = 'K m s-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_MF_THW_FLX' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK) + ! + ! stores the conservative mixing ratio vertical flux + ZWORK(:,:,:)=RESHAPE(ZFLXZRMF(:,:),(/ IIU,IJU,IKU /) ) + TZFIELD%CMNHNAME = 'MF_RCONSW_FLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'MF_RCONSW_FLX' + TZFIELD%CUNITS = 'K m s-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_MF_RCONSW_FLX' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK) + ! + ! stores the theta_v vertical flux + TZFIELD%CMNHNAME = 'MF_THVW_FLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'MF_THVW_FLX' + TZFIELD%CUNITS = 'K m s-1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_MF_THVW_FLX' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PFLXZTHVMF) + ! + IF (OMIXUV) THEN + ! stores the U momentum vertical flux + ZWORK(:,:,:)=RESHAPE(ZFLXZUMF(:,:),(/ IIU,IJU,IKU /) ) + TZFIELD%CMNHNAME = 'MF_UW_FLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'MF_UW_FLX' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_MF_UW_FLX' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK) + ! + ! stores the V momentum vertical flux + ZWORK(:,:,:)=RESHAPE(ZFLXZVMF(:,:),(/ IIU,IJU,IKU /) ) + TZFIELD%CMNHNAME = 'MF_VW_FLX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'MF_VW_FLX' + TZFIELD%CUNITS = 'm2 s-2' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_MF_VW_FLX' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,ZWORK) + ! + END IF +END IF + +!!! 9. Externalised LES Diagnostic for Mass Flux Scheme +!!! ------------------------------------------------ + + CALL DIAGNOS_LES_MF(IIU,IJU,IKU,PTIME_LES, & + ZTHL_UP,ZRT_UP,ZRV_UP,ZRC_UP,ZRI_UP, & + ZU_UP,ZV_UP,ZTHV_UP,ZW_UP, & + ZFRAC_UP,ZEMF,ZDETR,ZENTR, & + ZFLXZTHMF,ZFLXZTHVMF,ZFLXZRMF, & + ZFLXZUMF,ZFLXZVMF, & + IKLCL,IKETL,IKCTL ) + + +END SUBROUTINE SHALLOW_MF_PACK diff --git a/src/mesonh/micro/ice_adjust_elec.f90 b/src/mesonh/micro/ice_adjust_elec.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a52ffd2b375acda4dd911a74577409144202de0c --- /dev/null +++ b/src/mesonh/micro/ice_adjust_elec.f90 @@ -0,0 +1,651 @@ +!MNH_LIC Copyright 2002-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. +!----------------------------------------------------------------- +! ########################### + MODULE MODI_ICE_ADJUST_ELEC +! ########################### +! +INTERFACE +! + SUBROUTINE ICE_ADJUST_ELEC (KRR, KMI, HRAD, HTURBDIM, HSCONV, HMF_CLOUD, & + OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT, & + PRHODJ, PEXNREF, PSIGS, PPABST, PZZ, & + PMFCONV, PCF_MF, PRC_MF, PRI_MF, & + PRVT, PRCT, PRVS, PRCS, PTHS, PSRCS, PCLDFR , & + PRRT, PRRS, PRIT, PRIS, PRST, PRSS, PRGT, PRGS, & + PQPIT, PQPIS, PQCT, PQCS, & + PQRT, PQRS, PQIT, PQIS, PQST, PQSS, PQGT, PQGS, & + PQNIT, PQNIS, PRHT, PRHS, PQHT, PQHS ) +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Dimensionality of the + ! turbulence scheme +CHARACTER(LEN=4), INTENT(IN) :: HSCONV ! Shallow convection scheme +CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD! Type of statistical cloud +CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid + ! Condensation +LOGICAL :: OSIGMAS ! Switch for Sigma_s: + ! use values computed in CONDENSATION + ! or that from turbulence scheme +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +REAL, INTENT(IN) :: PSIGQSAT ! coeff applied to qsat variance contribution +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height of model layer +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux solid mixing ratio +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRS ! Rain water m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRIS ! Cloud ice m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRSS ! Aggregate m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS ! Graupel m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHS ! Hail m.r. at t+1 +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQPIT ! positive ion m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQPIS ! source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQNIT ! negative ion m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQNIS ! source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQRS ! Rain water m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(INOUT):: PQIS ! Cloud ice m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQSS ! Aggregate m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQGS ! Graupel m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQST ! Aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQGT ! Graupel m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PQHT ! Hail m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PQHS ! Hail m.r. at t+1 +! +END SUBROUTINE ICE_ADJUST_ELEC +END INTERFACE +END MODULE MODI_ICE_ADJUST_ELEC +! +! ######################################################################## + SUBROUTINE ICE_ADJUST_ELEC (KRR, KMI, HRAD, HTURBDIM, HSCONV, & + HMF_CLOUD, OSUBG_COND, OSIGMAS, PTSTEP,PSIGQSAT,& + PRHODJ, PEXNREF, PSIGS, PPABST, PZZ, & + PMFCONV, PCF_MF, PRC_MF, PRI_MF, & + PRVT, PRCT, PRVS, PRCS, PTHS, PSRCS, PCLDFR , & + PRRT, PRRS, PRIT, PRIS, PRST, PRSS, PRGT, PRGS, & + PQPIT, PQPIS, PQCT, PQCS, & + PQRT, PQRS, PQIT, PQIS, PQST, PQSS, PQGT, PQGS, & + PQNIT, PQNIS, PRHT, PRHS, PQHT, PQHS ) +! ######################################################################## +! +!!**** *ICE_ADJUST_ELEC* - compute the ajustment of water vapor in mixed-phase +!! clouds +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to compute the fast microphysical sources +!! through a saturation ajustement procedure in case of mixed-phase clouds. +!! +!! +!!** METHOD +!! ------ +!! Langlois, Tellus, 1973 for the cloudless version. +!! When cloud water is taken into account, refer to book 1 of the +!! documentation. +!! +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XP00 ! Reference pressure +!! XMD,XMV ! Molar mass of dry air and molar mass of vapor +!! XRD,XRV ! Gaz constant for dry air, gaz constant for vapor +!! XCPD,XCPV ! Cpd (dry air), Cpv (vapor) +!! XCL ! Cl (liquid) +!! XCI ! Ci (ice) +!! XTT ! Triple point temperature +!! XLVTT ! Vaporization heat constant +!! XLSTT ! Sublimation heat constant +!! XALPW,XBETAW,XGAMW ! Constants for saturation vapor over liquid +!! ! pressure function +!! XALPI,XBETAI,XGAMI ! Constants for saturation vapor over ice +!! ! pressure function +!! Module MODD_CONF +!! CCONF +!! +!! +!! REFERENCE +!! --------- +!! Book 1 and Book2 of documentation ( routine ICE_ADJUST ) +!! Langlois, Tellus, 1973 +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! +!! MODIFICATIONS +!! ------------- +!! Original 2002 +!! C. Barthe 19/11/09 update to version 4.8.1 +!! M. Chong Mar. 2010 Add small ions +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 03/2020: use the new data structures and subroutines for budgets +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +use modd_budget, only: lbudget_th, lbudget_rv, lbudget_rc, lbudget_ri, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RI, NBUDGET_SV1, & + tbudgets +USE MODD_CONF +USE MODD_CST +USE MODD_ELEC_DESCR, ONLY : XRTMIN_ELEC, XQTMIN, XFC, XFI, XECHARGE +USE MODD_NSV, ONLY : NSV_ELECBEG, NSV_ELECEND +USE MODD_PARAMETERS +USE MODD_RAIN_ICE_DESCR, ONLY : XRTMIN, XBI + +use mode_budget, only: Budget_store_init, Budget_store_end +use mode_tools_ll, only: GET_INDICE_ll + +USE MODI_CONDENSATION +USE MODI_GET_HALO +! +IMPLICIT NONE +! +! +!* 0.1 Declarations of dummy arguments +! +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +INTEGER, INTENT(IN) :: KMI ! Model index +CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Dimensionality of the + ! turbulence scheme +CHARACTER(LEN=4), INTENT(IN) :: HSCONV ! Shallow convection scheme +CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD! Type of statistical cloud +CHARACTER(len=4), INTENT(IN) :: HRAD ! Radiation scheme name +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid + ! Condensation +LOGICAL :: OSIGMAS ! Switch for Sigma_s: + ! use values computed in CONDENSATION + ! or that from turbulence scheme +REAL, INTENT(IN) :: PTSTEP ! Double Time step + ! (single if cold start) +REAL, INTENT(IN) :: PSIGQSAT ! coeff applied to qsat variance contribution +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height of model layer +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux solid mixing ratio +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVT ! Water vapor m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux + ! s'rc'/2Sigma_s2 at time t+1 + ! multiplied by Lambda_3 +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRS ! Rain water m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Cloud ice m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRSS ! Aggregate m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGS ! Graupel m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRST ! Aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PRGT ! Graupel m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHS ! Hail m.r. at t+1 +! +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQPIT ! positive ion m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQPIS ! source +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQNIT ! negative ion m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQNIS ! source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQCT ! Cloud water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQCS ! Cloud water m.r. source +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQRS ! Rain water m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PQIS ! Cloud ice m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQSS ! Aggregate m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQGS ! Graupel m.r. at t+1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQRT ! Rain water m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQIT ! Cloud ice m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQST ! Aggregate m.r. at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQGT ! Graupel m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PQHT ! Hail m.r. at t +REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PQHS ! Hail m.r. at t+1 +! +! +!* 0.2 Declarations of local variables : +! +REAL :: ZEPS ! Mv/Md +REAL :: ZT00,ZT0 ! Min and max temperature for the mixed phase liquid and solid water + ! for the coeff CND of the barycentric mixing ratio +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZEXNS,& ! guess of the Exner functon at t+1 + ZT, & ! guess of the temperature at t+1 + ZCPH, & ! guess of the CPh for the mixing + ZLV, & ! guess of the Lv at t+1 + ZLS, & ! guess of the Ls at t+1 + ZW1,ZW2,ZW3,ZW4,ZW5,ZW6,ZW7,& ! Work arrays for intermediate fields + ZW1_IN, ZW2_IN, ZW3_IN, & + ZCND ! CND=(T-T00)/(T0-T00) cf sc doc and TAO etal (89) +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZWE1, & + ZWE2 +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & + :: ZION_NUMBER, & !nearly Nb of elementary charge + ! in hydrometeor charge + ZADD ! ratio (0 or 1) of ZION_NUMBER + ! to add to positive + ! or negative ion number +REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2)) :: ZSIGQSAT2D + ! +INTEGER :: IIU,IJU,IKU! dimensions of dummy arrays +INTEGER :: IIB,IJB ! Horz index values of the first inner mass points +INTEGER :: IIE,IJE ! Horz index values of the last inner mass points +INTEGER :: IKB ! K index value of the first inner mass point +INTEGER :: IKE ! K index value of the last inner mass point +INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment +! +LOGICAL :: LPRETREATMENT, LNEW_ADJUST +! +!------------------------------------------------------------------------------- +! +!* 1. PRELIMINARIES +! ------------- +! +IIU = SIZE(PEXNREF,1) +IJU = SIZE(PEXNREF,2) +IKU = SIZE(PEXNREF,3) +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +IKB = 1 + JPVEXT +IKE = IKU - JPVEXT +! +ZEPS = XMV / XMD +! +ITERMAX = 1 +! +LPRETREATMENT=.TRUE. ! FALSE to retreive the previous MASDEV4_1 version +LNEW_ADJUST =.TRUE. ! FALSE to retreive the previous MASDEV4_1 version +ZT0 = XTT ! Usefull if LPRETREATMENT=T or LNEW_ADJUST=T +ZT00 = XTT-40. ! Usefull if LPRETREATMENT=T or LNEW_ADJUST=T +! +!------------------------------------------------------------------------------- +if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'DEPI', pths(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'DEPI', prvs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC), 'DEPI', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI), 'DEPI', pris(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_sv ) then + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'DEPI', pqpis(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'DEPI', pqnis(:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'DEPI', pqcs (:, :, :) * prhodj(:, :, :) ) + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'DEPI', pqis (:, :, :) * prhodj(:, :, :) ) +end if +! +!* 2. COMPUTE QUANTITIES WITH THE GUESS OF THE FUTURE INSTANT +! ------------------------------------------------------- +! +!* 2.1 estimate the pressure at t+1 +! +ZEXNS(:,:,:) = ( PPABST(:,:,:) / XP00)**(XRD/XCPD) +! +! beginning of the iterative loop +! +DO JITER = 1, ITERMAX +! +!* 2.2 compute the intermediate temperature at t+1, T* +! + ZT(:,:,:) = (PTHS(:,:,:) * PTSTEP) * ZEXNS(:,:,:) +! +!* 2.3 compute the latent heat of vaporization Lv(T*) at t+1 +! and the latent heat of sublimation Ls(T*) at t+1 +! + ZLV(:,:,:) = XLVTT + (XCPV - XCL) * (ZT(:,:,:) - XTT) + ZLS(:,:,:) = XLSTT + (XCPV - XCI) * (ZT(:,:,:) - XTT) +! +!* 2.4 compute the specific heat for moist air (Cph) at t+1 +! + IF ( KRR == 7 ) THEN + ZCPH(:,:,:) = XCPD + XCPV *PTSTEP* PRVS(:,:,:) & + + XCL *PTSTEP* (PRCS(:,:,:) + PRRS(:,:,:)) & + + XCI *PTSTEP* (PRIS(:,:,:) + PRSS(:,:,:) + PRGS(:,:,:) & + + PRHS(:,:,:)) + ELSE IF( KRR == 6 ) THEN + ZCPH(:,:,:) = XCPD + XCPV *PTSTEP* PRVS(:,:,:) & + + XCL *PTSTEP* (PRCS(:,:,:) + PRRS(:,:,:)) & + + XCI *PTSTEP* (PRIS(:,:,:) + PRSS(:,:,:) + PRGS(:,:,:)) + ELSE IF( KRR == 5 ) THEN + ZCPH(:,:,:) = XCPD + XCPV *PTSTEP* PRVS(:,:,:) & + + XCL *PTSTEP* (PRCS(:,:,:) + PRRS(:,:,:)) & + + XCI *PTSTEP* (PRIS(:,:,:) + PRSS(:,:,:)) + ELSE IF( KRR == 3 ) THEN + ZCPH(:,:,:) = XCPD + XCPV *PTSTEP* PRVS(:,:,:) & + + XCL *PTSTEP* (PRCS(:,:,:) + PRRS(:,:,:)) + ELSE IF( KRR == 2 ) THEN + ZCPH(:,:,:) = XCPD + XCPV *PTSTEP* PRVS(:,:,:) & + + XCL *PTSTEP* PRCS(:,:,:) + END IF +! +! +!* 3. FIRST ORDER SUBGRID CONDENSATION SCHEME +! --------------------------------------- +! + IF (OSUBG_COND) THEN +! +!* 3.1 compute condensate, cloud fraction +! + ! ZW3=water vapor ZW1=rc (OUT) ZW2=ri (OUT) PSRC= s'rci'/Sigma_s^2 + ! ZW3_IN/ZW2_IN/ZW1_IN (IN) + ZW3_IN = PRVS * PTSTEP; ZW1_IN = PRCS * PTSTEP; ZW2_IN = PRIS * PTSTEP + ZW3=ZW3_IN; ZW2=ZW2_IN; ZW1=ZW1_IN + ZSIGQSAT2D(:,:)=PSIGQSAT + ZW4 = 1. ! PRODREF is not used if HL variables are not present +! + CALL CONDENSATION( IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE,1, 'T', 'CB02', 'CB', & + PPABST, PZZ, ZW4, ZT, ZW3_IN, ZW3, ZW1_IN, ZW1, ZW2_IN, ZW2, & + PRSS*PTSTEP, PRGS*PTSTEP, & + PSIGS, PMFCONV, PCLDFR, PSRCS, .TRUE., & + OSIGMAS, .FALSE., ZSIGQSAT2D, PLV=ZLV, PLS=ZLS, PCPH=ZCPH ) +! +!* 3.2 compute the variation of mixing ratio +! + ! Rc - Rc* + ZW1(:,:,:) = (ZW1(:,:,:) / PTSTEP) - PRCS(:,:,:) ! Pcon = ---------- + ! 2 Delta t + + ZW2(:,:,:) = (ZW2(:,:,:) / PTSTEP) - PRIS(:,:,:) ! idem ZW1 but for Ri + + ELSE +! +! +!* 4. SECOND ORDER ALL OR NOTHING CONDENSATION SCHEME +! FOR MIXED-PHASE CLOUD +! ----------------------------------------------- +! +! +!* 4.1 Eventually pretreatment +! + IF (LPRETREATMENT) THEN +! +! compute the saturation vapor pressures at t+1 +! + CALL GET_HALO(ZT) + ZW1(:,:,:) = EXP(XALPW - XBETAW/ZT(:,:,:) - XGAMW*ALOG(ZT(:,:,:))) ! e_sw + ZW2(:,:,:) = EXP(XALPI - XBETAI/ZT(:,:,:) - XGAMI*ALOG(ZT(:,:,:))) ! e_si + ZW1(:,:,:) = MIN(PPABST(:,:,:)/2.,ZW1(:,:,:)) ! safety limitation + ZW2(:,:,:) = MIN(PPABST(:,:,:)/2.,ZW2(:,:,:)) ! safety limitation +! +! compute the saturation mixing ratios at t+1 +! + ZW3(:,:,:) = ZW1(:,:,:) * ZEPS / & + ( PPABST(:,:,:) - ZW1(:,:,:)) ! r_sw + ZW4(:,:,:) = ZW2(:,:,:) * ZEPS / & + ( PPABST(:,:,:) - ZW2(:,:,:)) ! r_si +! + WHERE(PRVS(:,:,:)*PTSTEP .LT. ZW4(:,:,:) .AND. & + PRCS(:,:,:) .GT. 0. .AND. ZT(:,:,:) .LT. XTT) +! +! Subsaturation case with respect to rsi(T,P) (and case rv<0): +! Evaporation of rc>0 (while enough) to decrease the lack of vapor +! + ZW5 (:,:,:)= MIN( PRCS , ZW4(:,:,:)/PTSTEP - PRVS(:,:,:) ) ! RVCNDC + PRVS(:,:,:)= PRVS(:,:,:) + ZW5(:,:,:) + PRCS(:,:,:)= PRCS(:,:,:) - ZW5(:,:,:) + PTHS(:,:,:)= PTHS(:,:,:) - ZW5(:,:,:) * ZLV(:,:,:) /(ZCPH(:,:,:)*PEXNREF(:,:,:)) +! + END WHERE +! + WHERE (PRVS(:,:,:)*PTSTEP .GT. ZW3(:,:,:)) +! +! Supersaturation case with respect to rsw(T,P): +! Condensation of the vapor that is left +! + ZW5 (:,:,:)= PRVS(:,:,:) - ZW3(:,:,:)/PTSTEP + PRVS(:,:,:)= PRVS(:,:,:) - ZW5(:,:,:) ! RVCNDC + PRCS(:,:,:)= PRCS(:,:,:) + ZW5(:,:,:) + PTHS(:,:,:)= PTHS(:,:,:) + ZW5(:,:,:) * ZLV(:,:,:) /(ZCPH(:,:,:)*PEXNREF(:,:,:)) +! + END WHERE +! + WHERE (PRCS(:,:,:) .GT. 0. .AND. ZT(:,:,:) .LT. ZT00) +! +! Treatment of rc>0 if T<T00: +! + PRIS(:,:,:)= PRIS(:,:,:) + PRCS(:,:,:) + PTHS(:,:,:)= PTHS(:,:,:) + PRCS(:,:,:) * & + (ZLS(:,:,:) - ZLV(:,:,:)) / (ZCPH(:,:,:) * PEXNREF(:,:,:)) + PRCS(:,:,:)= 0. +! + END WHERE +! +!* 4.2 compute the intermediate temperature at t+1, T* +! + ZT(:,:,:) = (PTHS(:,:,:) * PTSTEP) * ZEXNS(:,:,:) +! + END IF !end PRETREATMENT +! +!* 4.3 compute the saturation vapor pressures at t+1 +! + ZW1(:,:,:) = EXP(XALPW - XBETAW / ZT(:,:,:) - XGAMW * ALOG(ZT(:,:,:))) ! e_sw + ZW2(:,:,:) = EXP(XALPI - XBETAI / ZT(:,:,:) - XGAMI * ALOG(ZT(:,:,:))) ! e_si + ZW1(:,:,:) = MIN(PPABST(:,:,:)/2.,ZW1(:,:,:)) ! safety limitation + ZW2(:,:,:) = MIN(PPABST(:,:,:)/2.,ZW2(:,:,:)) ! safety limitation +! +!* 4.4 compute the saturation mixing ratios at t+1 +! + ZW3(:,:,:) = ZW1(:,:,:) * ZEPS & + / ( PPABST(:,:,:) - ZW1(:,:,:) ) ! r_sw + ZW4(:,:,:) = ZW2(:,:,:) * ZEPS & + / ( PPABST(:,:,:) - ZW2(:,:,:) ) ! r_si +! +!* 4.5 compute the saturation mixing ratio derivatives (r'_vs) +! + ZW1(:,:,:) = (( XBETAW/ZT(:,:,:) - XGAMW ) / ZT(:,:,:)) & ! r'_sw + * ZW3(:,:,:) * ( 1. + ZW3(:,:,:)/ZEPS ) + ZW2(:,:,:) = (( XBETAI/ZT(:,:,:) - XGAMI ) / ZT(:,:,:)) & ! r'_si + * ZW4(:,:,:) * ( 1. + ZW4(:,:,:)/ZEPS ) +! + IF (LNEW_ADJUST) THEN + ZCND(:,:,:)= (ZT(:,:,:) - ZT00) / (ZT0 - ZT00) ! Like Tao et al 89 + ZCND(:,:,:)= MAX ( MIN(ZCND(:,:,:),1.) , 0. ) + ELSE + WHERE ((PRCS(:,:,:)+PRIS(:,:,:)) .GT. 1.0E-20) & + ZCND(:,:,:)= PRCS(:,:,:) / (PRCS(:,:,:) + PRIS(:,:,:)) ! Like the original version + END IF +! +!* 4.5 compute L_v CND + L_s DEP and F'(T) +! + WHERE ((PRCS(:,:,:)+PRIS(:,:,:)) .GT. 1.0E-20) +! + ZW5(:,:,:) = ZLS(:,:,:) + (ZLV(:,:,:) - ZLS(:,:,:)) * ZCND(:,:,:) + ZW6(:,:,:) = ZCPH(:,:,:) * (PRCS(:,:,:) + PRIS(:,:,:)) + & + ZW5(:,:,:) * (PRCS(:,:,:) * ZW1(:,:,:) & + + PRIS(:,:,:) * ZW2(:,:,:)) +! +!* 4.6 compute Delta 2 +! + ZW7(:,:,:) = (ZW5(:,:,:) / (ZW6(:,:,:) * ZT(:,:,:))) * & + (PRCS(:,:,:) * ZW1(:,:,:) * & + ((-2. * XBETAW + XGAMW * ZT(:,:,:)) / (XBETAW - XGAMW * ZT(:,:,:)) + & + (XBETAW - XGAMW * ZT(:,:,:)) * (1.0 + 2.0 * ZW3(:,:,:) / ZEPS) / ZT(:,:,:)) + & + PRIS(:,:,:) * ZW2(:,:,:) * & + ((-2. * XBETAI + XGAMI * ZT(:,:,:)) / (XBETAI - XGAMI * ZT(:,:,:)) + & + (XBETAI - XGAMI * ZT(:,:,:)) * (1.0 + 2.0 * ZW4(:,:,:) / ZEPS) / ZT(:,:,:))) +! +!* 4.7 compute Delta 1 +! + ZW6(:,:,:) = ZW5(:,:,:) * (PRCS(:,:,:) * ZW3(:,:,:) + PRIS(:,:,:) * ZW4(:,:,:) - & + PRVS(:,:,:) * PTSTEP * (PRCS(:,:,:) + PRIS(:,:,:))) / & + ZW6(:,:,:) +! +!* 4.8 compute the sources +! + ZW3(:,:,:) = (ZCPH(:,:,:) / ZW5(:,:,:)) * & + (-ZW6(:,:,:) * (1.0 + 0.5 * ZW6(:,:,:) * ZW7(:,:,:))) / PTSTEP + ZW1(:,:,:) = ZW3(:,:,:) * ZCND(:,:,:) ! RVCNDC + ZW2(:,:,:) = ZW3(:,:,:) * (1.0 - ZCND(:,:,:)) ! RVDEPI +! + ELSEWHERE +! +!* 4.9 special case when both r_c and r_i are zero +! + ZW6(:,:,:) = ZCPH(:,:,:) + ZLV(:,:,:) * ZW1(:,:,:) ! F'(T) + ZW7(:,:,:) = (ZLV(:,:,:) / (ZW6(:,:,:) * ZT(:,:,:))) * & ! Delta 2 + (ZW1(:,:,:) * & + ((-2. * XBETAW + XGAMW * ZT(:,:,:)) / (XBETAW - XGAMW * ZT(:,:,:)) + & + (XBETAW - XGAMW * ZT(:,:,:)) * (1.0 + 2.0 * ZW3(:,:,:) / ZEPS) / ZT(:,:,:))) + ZW6(:,:,:) = ZLV(:,:,:) * (ZW3(:,:,:) - PRVS(:,:,:) * PTSTEP) / ZW6(:,:,:) ! Delta 1 + ZW1(:,:,:) = (ZCPH(:,:,:) / ZLV(:,:,:)) * & ! RVCNDC + (-ZW6(:,:,:) * ( 1.0 + 0.5 * ZW6(:,:,:) * ZW7(:,:,:))) / PTSTEP + ZW2(:,:,:) = 0.0 ! RVDEPI +! + END WHERE + END IF +! +!* 5. COMPUTE THE SOURCES AND STORES THE CLOUD FRACTION +! ------------------------------------------------- +! +!* 5.1 compute the sources +! +!* 5.1.1 microphysics +! + WHERE (ZW1(:,:,:) < 0.0) + ZW1(:,:,:) = MAX (ZW1(:,:,:), -PRCS(:,:,:)) ! Evaporation rate + ELSEWHERE + ZW1(:,:,:) = MIN (ZW1(:,:,:), PRVS(:,:,:)) ! Condensation rate + END WHERE +! + PRVS(:,:,:) = PRVS(:,:,:) - ZW1(:,:,:) + PRCS(:,:,:) = PRCS(:,:,:) + ZW1(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) + & + ZW1(:,:,:) * ZLV(:,:,:) / (ZCPH(:,:,:) * PEXNREF(:,:,:)) +! + WHERE (ZW2(:,:,:) < 0.0) + ZW2(:,:,:) = MAX (ZW2(:,:,:), -PRIS(:,:,:)) ! Sublimation rate + ELSEWHERE + ZW2(:,:,:) = MIN (ZW2(:,:,:), PRVS(:,:,:)) ! Deposition rate + END WHERE +! + PRVS(:,:,:) = PRVS(:,:,:) - ZW2(:,:,:) + PRIS(:,:,:) = PRIS(:,:,:) + ZW2(:,:,:) + PTHS(:,:,:) = PTHS(:,:,:) + & + ZW2(:,:,:) * ZLS(:,:,:) / (ZCPH(:,:,:) * PEXNREF(:,:,:)) +! +!* 5.1.2 electricity +! + ZWE1(:,:,:) = 0. + ZWE2(:,:,:) = 0. +! +! the electrical process due to condensation is removed and +! capture of ions by cloud droplets is done in ion_attach_elec routine +! +! evaporation + WHERE (ABS(PRCT(:,:,:)) > XRTMIN_ELEC(2) .AND. & + ABS(PQCT(:,:,:)) > XQTMIN(2) .AND. & + ZW1(:,:,:) < -XRTMIN(1)) + ZWE1(:,:,:) = (XFC / 3.) * (PQCT(:,:,:) / PRCT(:,:,:)) * (-ZW1(:,:,:)) + ZION_NUMBER(:,:,:) = ABS(ZWE1(:,:,:)) / XECHARGE + ZADD(:,:,:) = 0.5 + SIGN(0.5, ZWE1(:,:,:)) + PQPIS(:,:,:) = PQPIS(:,:,:) + & + ZADD(:,:,:) *ZION_NUMBER(:,:,:) + PQNIS(:,:,:) = PQNIS(:,:,:) + & + (1.-ZADD(:,:,:)) *ZION_NUMBER(:,:,:) + PQCS(:,:,:) = PQCS(:,:,:) - ZWE1(:,:,:) + END WHERE +! +! the electrical process due to deposition is removed and +! capture of ions by raindropsp is done in ion_attach_elec routine +! +! sublimation + WHERE (ABS(PRIT(:,:,:)) > XRTMIN_ELEC(4) .AND. & + ABS(PQIT(:,:,:)) > XQTMIN(4) .AND. & + ZW2(:,:,:) < -XRTMIN(1)) + ZWE2(:,:,:) = (XFI / XBI) * (PQIT(:,:,:) / PRIT(:,:,:)) * (-ZW2(:,:,:)) + ZION_NUMBER(:,:,:) = ABS(ZWE2(:,:,:)) / XECHARGE + ZADD(:,:,:) = 0.5 + SIGN(0.5, ZWE2(:,:,:)) + PQPIS(:,:,:) = PQPIS(:,:,:) + & + ZADD(:,:,:) *ZION_NUMBER(:,:,:) + PQNIS(:,:,:) = PQNIS(:,:,:) + & + (1.-ZADD(:,:,:)) *ZION_NUMBER(:,:,:) + PQIS(:,:,:) = PQIS(:,:,:) - ZWE2(:,:,:) + END WHERE +END DO ! end of the iterative loop +! +! +!* 5.2 compute the cloud fraction PCLDFR +! +IF (.NOT. OSUBG_COND) THEN + WHERE (PRCS(:,:,:) + PRIS(:,:,:) > 1.E-12 / PTSTEP) + PCLDFR(:,:,:) = 1. + ELSEWHERE + PCLDFR(:,:,:) = 0. + ENDWHERE + IF (SIZE(PSRCS,3) /= 0) THEN + PSRCS(:,:,:) = PCLDFR(:,:,:) + END IF +ELSE + IF (HSCONV == 'EDKF' .AND. HMF_CLOUD == 'DIRE') THEN + PCLDFR(:,:,:) = MIN(1.,PCLDFR(:,:,:)+PCF_MF(:,:,:)) + PRCS(:,:,:) = PRCS(:,:,:) + PRC_MF(:,:,:) / PTSTEP + PRIS(:,:,:) = PRIS(:,:,:)+PRI_MF(:,:,:)/PTSTEP + PRVS(:,:,:) = PRVS(:,:,:)- ( PRC_MF(:,:,:) + PRI_MF(:,:,:)) /PTSTEP + PTHS(:,:,:) = PTHS(:,:,:) + ( PRC_MF(:,:,:) * ZLV(:,:,:) + & + PRI_MF(:,:,:) * ZLS(:,:,:) ) / ZCPH(:,:,:) / & + PEXNREF(:,:,:) / PTSTEP + END IF +ENDIF +! +! +! +!* 6. STORE THE BUDGET TERMS +! ---------------------- +! +if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'DEPI', pths(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'DEPI', prvs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC), 'DEPI', prcs(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI), 'DEPI', pris(:, :, :) * prhodj(:, :, :) ) +if ( lbudget_sv ) then + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg ), 'DEPI', pqpis(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecend ), 'DEPI', pqnis(:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 1 ), 'DEPI', pqcs (:, :, :) * prhodj(:, :, :) ) + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + nsv_elecbeg + 3 ), 'DEPI', pqis (:, :, :) * prhodj(:, :, :) ) +end if +!------------------------------------------------------------------------------ +! +END SUBROUTINE ICE_ADJUST_ELEC diff --git a/src/mesonh/micro/ini_ice_c1r3.f90 b/src/mesonh/micro/ini_ice_c1r3.f90 new file mode 100644 index 0000000000000000000000000000000000000000..8de2f998d7bdb6c9f09808b619bbc0b3f253d97d --- /dev/null +++ b/src/mesonh/micro/ini_ice_c1r3.f90 @@ -0,0 +1,1128 @@ +!MNH_LIC Copyright 2000-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 MODI_INI_ICE_C1R3 +! ######################## +! +INTERFACE + SUBROUTINE INI_ICE_C1R3 ( PTSTEP, PDZMIN, KSPLITG ) +! +INTEGER, INTENT(OUT):: KSPLITG ! Number of small time step + ! integration for rain + ! sedimendation +! +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! +! +END SUBROUTINE INI_ICE_C1R3 +! +END INTERFACE +! +END MODULE MODI_INI_ICE_C1R3 +! ################################################### + SUBROUTINE INI_ICE_C1R3 ( PTSTEP, PDZMIN, KSPLITG ) +! ################################################### +! +!!**** *INI_ICE_C1R3 * - initialize the constants necessary for the warm and +!! cold microphysical schemes. +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the constants used to +!! resolve the mixed phase microphysical scheme. The collection kernels of +!! the precipitating particles are recomputed if necessary if some parameters +!! defining the ice categories have been modified. The number of small +!! time steps leading to stable scheme for the rain, ice, snow and ggraupeln +!! sedimentation is also computed (time-splitting technique). +!! +!!** METHOD +!! ------ +!! The constants are initialized to their numerical values and the number +!! of small time step is computed by dividing the 2* Deltat time interval of +!! the Leap-frog scheme so that the stability criterion for the rain +!! sedimentation is fulfilled for a Raindrop maximal fall velocity equal +!! VTRMAX. The parameters defining the collection kernels are read and are +!! checked against the new ones. If any change occurs, these kernels are +!! recomputed and their numerical values are written in the output listiing. +!! +!! EXTERNAL +!! -------- +!! GAMMA : gamma function +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST +!! XPI ! +!! XP00 ! Reference pressure +!! XRD ! Gaz constant for dry air +!! XRHOLW ! Liquid water density +!! Module MODD_REF +!! XTHVREFZ ! Reference virtual pot.temp. without orography +!! Module MODD_PARAMETERS +!! JPVEXT ! +!! Module MODD_ICE_C1R3_DESCR +!! Module MODD_ICE_C1R3_PARAM +!! +!! REFERENCE +!! --------- +!! Book2 of documentation ( routine INI_ICE_C1R3 ) +!! +!! AUTHOR +!! ------ +!! J.-P. Pinty * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! Original 04/12/2000 +!! J.-P. Pinty 28/05/2001 Correction for RHONI +!! J.-P. Pinty 31/05/2001 Correction for ICNVS factors +!! J.-P. Pinty 29/06/2001 Bug in RCHONI and RVHNCI +!! J.-P. Pinty 29/06/2001 Add RHHONI process (freezing haze part.) +!! J.-P. Pinty 23/09/2001 Review the HM process constants +!! J.-P. Pinty 23/10/2001 Add XRHORSMIN +!! J.-P. Pinty 05/04/2002 Add computation of the effective radius +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_ICE_C1R3_DESCR +USE MODD_ICE_C1R3_PARAM +USE MODD_LUNIT, ONLY: TLUOUT0 +USE MODD_PARAMETERS +USE MODD_PARAM_C1R3 +USE MODD_PARAM_C2R2, ONLY : XALPHAC,XNUC,XALPHAR,XNUR +USE MODD_RAIN_C2R2_DESCR, ONLY : XAR,XBR,XCR,XDR,XF0R,XF1R,XAC,XBC,XCC,XDC, & + XLBC,XLBEXC,XLBR,XLBEXR +USE MODD_REF +! +use mode_msg +! +USE MODI_GAMMA +USE MODI_GAMMA_INC +USE MODE_READ_XKER_RACCS, ONLY: READ_XKER_RACCS +USE MODE_READ_XKER_RDRYG, ONLY: READ_XKER_RDRYG +USE MODE_READ_XKER_SDRYG, ONLY: READ_XKER_SDRYG +USE MODE_RRCOLSS, ONLY: RRCOLSS +USE MODE_RSCOLRG, ONLY: RSCOLRG +USE MODE_RZCOLX, ONLY: RZCOLX +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +INTEGER, INTENT(OUT):: KSPLITG ! Number of small time step + ! integration for rain + ! sedimendation +! +REAL, INTENT(IN) :: PTSTEP ! Time step +! +REAL, INTENT(IN) :: PDZMIN ! minimun vertical mesh size +! diat +! +! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: IKB ! Coordinates of the first physical + ! points along z +INTEGER :: J1,J2 ! Internal loop indexes +! +REAL, DIMENSION(8) :: ZGAMI ! parameters involving various moments +REAL, DIMENSION(2) :: ZGAMS ! of the generalized gamma law +! +REAL :: ZT ! Work variable +REAL :: ZVTRMAX ! Raindrop maximal fall velocity +REAL :: ZRHO00 ! Surface reference air density +REAL :: ZRATE ! Geometrical growth of Lbda in the tabulated + ! functions and kernels +REAL :: ZBOUND ! XDCSLIM*Lbda_s: upper bound for the partial + ! integration of the riming rate of the aggregates +REAL :: ZEGS, ZEGR ! Bulk collection efficiencies +! +INTEGER :: IND ! Number of interval to integrate the kernels +REAL :: ZESR ! Mean efficiency of rain-aggregate collection +REAL :: ZFDINFTY ! Factor used to define the "infinite" diameter +! +! +INTEGER :: ILUOUT0 ! Logical unit number for output-listing +LOGICAL :: GFLAG ! Logical flag for printing the constatnts on the output + ! listing +REAL :: ZCONC_MAX ! Maximal concentration for snow +REAL :: ZFACT_NUCL! Amplification factor for the minimal ice concentration +! +INTEGER :: KND +INTEGER :: KACCLBDAS,KACCLBDAR,KDRYLBDAG,KDRYLBDAS,KDRYLBDAR +REAL :: PALPHAR,PALPHAS,PALPHAG +REAL :: PNUR,PNUS,PNUG +REAL :: PBR,PBS +REAL :: PCR,PCS,PCG +REAL :: PDR,PDS,PDG +REAL :: PESR,PEGS,PEGR +REAL :: PFDINFTY +REAL :: PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN +REAL :: PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN +REAL :: PDRYLBDAR_MAX,PDRYLBDAR_MIN +! +REAL :: ZFAC_ZRNIC ! Zrnic factor used to decrease Long Kernels +! +!------------------------------------------------------------------------------- +! +! +!* 0. FUNCTION STATEMENTS +! ------------------- +! +! +!* 0.1 G(p) for p_moment of the Generalized GAMMA function +! +! +! recall that MOMG(ZALPHA,ZNU,ZP)=GAMMA(ZNU+ZP/ZALPHA)/GAMMA(ZNU) +! +! +! 1. INTIALIZE OUTPUT LISTING AND COMPUTE KSPLITG FOR EACH MODEL +! ----------------------------------------------------------- +! +ILUOUT0 = TLUOUT0%NLU +! +!* 1.1 Set the graupel maximum fall velocity +! +ZVTRMAX = 30. +IF( CHEVRIMED_ICE_C1R3 == 'HAIL' ) THEN + ZVTRMAX = 60. ! Hail case +END IF +! +!* 1.2 Compute the number of small time step integration +! +KSPLITG = 1 +SPLIT : DO + ZT = 2.* PTSTEP / REAL(KSPLITG) + IF ( ZT * ZVTRMAX / PDZMIN .LT. 1.) EXIT SPLIT + KSPLITG = KSPLITG + 1 +END DO SPLIT +! +IF (ALLOCATED(XRTMIN)) RETURN ! In case of nesting microphysics constants of +! ! MODD_ICE_C1R3_PARAM are computed only once. +! +!------------------------------------------------------------------------------- +! +!* 2. CHARACTERISTICS OF THE SPECIES +! ------------------------------ +! +! +!* 2.1 Raindrops characteristics +! +! +!* 2.2 Ice crystal characteristics +! +SELECT CASE (CPRISTINE_ICE_C1R3) + CASE('PLAT') + XAI = 0.82 ! Plates + XBI = 2.5 ! Plates + XC_I = 800. ! Plates + XDI = 1.0 ! Plates + XC1I = 1./XPI ! Plates + CASE('COLU') + XAI = 2.14E-3 ! Columns + XBI = 1.7 ! Columns + XC_I = 2.1E5 ! Columns + XDI = 1.585 ! Columns + XC1I = 0.8 ! Columns + CASE('BURO') + XAI = 44.0 ! Bullet rosettes + XBI = 3.0 ! Bullet rosettes + XC_I = 4.3E5 ! Bullet rosettes + XDI = 1.663 ! Bullet rosettes + XC1I = 0.5 ! Bullet rosettes +END SELECT +! +! Note that XCCI=N_i (a locally predicted value) and XCXI=0.0, implicitly +! +XF0I = 1.00 +XF2I = 0.103 +XF0IS = 0.86 +XF1IS = 0.28 +! +! +!* 2.3 Snowflakes/aggregates characteristics +! +! +XAS = 0.02 +XBS = 1.9 +XCS = 5.1 +XDS = 0.27 +! +XCCS = 5.0 +XCXS = 1.0 +! +XF0S = 0.86 +XF1S = 0.28 +! +XC1S = 1./XPI +! +! +!* 2.4 Heavily rimed crystals characteristics +! +! +SELECT CASE (CHEVRIMED_ICE_C1R3) + CASE('GRAU') + XAG = 19.6 ! Lump graupel case + XBG = 2.8 ! Lump graupel case + XCG = 124. ! Lump graupel case + XDG = 0.66 ! Lump graupel case + CASE('HAIL') + XAG = 470. ! Hail case + XBG = 3.0 ! Hail case + XCG = 207. ! Hail case + XDG = 0.64 ! Hail case +END SELECT +! +XCCG = 5.E5 +XCXG = -0.5 +! XCCG = 4.E4 ! Test of Ziegler (1988) +! XCXG = -1.0 ! Test of Ziegler (1988) +! +XF0G = 0.86 +XF1G = 0.28 +! +XC1G = 1./2. +! +!------------------------------------------------------------------------------- +! +!* 3. DIMENSIONAL DISTRIBUTIONS OF THE SPECIES +! ---------------------------------------- +! +! +!* 3.2 Ice crystal distribution +! +XALPHAI = 3.0 ! Gamma law for the ice crystal volume +XNUI = 3.0 ! Gamma law with little dispersion +! +XALPHAS = 1.0 ! Exponential law +XNUS = 1.0 ! Exponential law +! +XALPHAG = 1.0 ! Exponential law +XNUG = 1.0 ! Exponential law +! +!* 3.3 Constants for shape parameter +! +XLBEXI = 1.0/XBI +XLBI = XAI*MOMG(XALPHAI,XNUI,XBI) +! +XLBEXS = 1.0/(XCXS-XBS) +XLBS = ( XAS*XCCS*MOMG(XALPHAS,XNUS,XBS) )**(-XLBEXS) +! +XLBEXG = 1.0/(XCXG-XBG) +XLBG = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG))**(-XLBEXG) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" Shape Parameters")') + WRITE(UNIT=ILUOUT0,FMT='(" XLBEXI =",E13.6," XLBI =",E13.6)') XLBEXI,XLBI + WRITE(UNIT=ILUOUT0,FMT='(" XLBEXS =",E13.6," XLBS =",E13.6)') XLBEXS,XLBS + WRITE(UNIT=ILUOUT0,FMT='(" XLBEXG =",E13.6," XLBG =",E13.6)') XLBEXG,XLBG +END IF +! +!* 3.4 Minimal values allowed for the mixing ratios +! +XLBDAS_MAX = 100000.0 +XLBDAG_MAX = 100000.0 +! +ZCONC_MAX = 1.E6 ! Maximal concentration for falling particules set to 1 per cc +XLBDAS_MAX = ( ZCONC_MAX/XCCS )**(1./XCXS) +! +ALLOCATE( XRTMIN(6) ) +XRTMIN(1) = 1.0E-20 +XRTMIN(2) = 1.0E-20 +XRTMIN(3) = 1.0E-20 +XRTMIN(4) = 1.0E-20 +XRTMIN(5) = 1.0E-15 +XRTMIN(6) = 1.0E-15 +ALLOCATE( XCTMIN(6) ) +XCTMIN(1) = 1.0 +XCTMIN(2) = 1.0 +XCTMIN(3) = 1.0E-3 +XCTMIN(4) = 1.0E-3 +XCTMIN(5) = 1.0E-3 +XCTMIN(6) = 1.0E-3 +! +!------------------------------------------------------------------------------- +! +!* 4. CONSTANTS FOR THE SEDIMENTATION +! ------------------------------- +! +! +!* 4.1 Exponent of the fall-speed air density correction +! +XCEXVT = 0.4 +! +IKB = 1 + JPVEXT +ZRHO00 = XP00/(XRD*XTHVREFZ(IKB)) +! +!* 4.2 Constants for sedimentation +! +!! XEXRSEDI = (XBI+XDI)/XBI +!! XEXCSEDI = 1.0-XEXRSEDI +!! XFSEDI = (4.*XPI*900.)**(-XEXCSEDI) * & +!! XC_I*XAI*MOMG(XALPHAI,XNUI,XBI+XDI) * & +!! ((XAI*MOMG(XALPHAI,XNUI,XBI)))**(-XEXRSEDI) * & +!! (ZRHO00)**XCEXVT +!! ! +!! ! Computations made for Columns +!! ! +!! XEXRSEDI = 1.9324 +!! XEXCSEDI =-0.9324 +!! XFSEDI = 3.89745E11*MOMG(XALPHAI,XNUI,3.285)* & +!! MOMG(XALPHAI,XNUI,1.7)**(-XEXRSEDI)*(ZRHO00)**XCEXVT +!! XEXCSEDI =-0.9324*3.0 +!! WRITE (ILUOUT0,FMT=*)' PRISTINE ICE SEDIMENTATION for columns XFSEDI=',XFSEDI +! +! +XEXSEDS = (XBS+XDS-XCXS)/(XBS-XCXS) +XFSEDS = XCS*XAS*XCCS*MOMG(XALPHAS,XNUS,XBS+XDS)* & + (XAS*XCCS*MOMG(XALPHAS,XNUS,XBS))**(-XEXSEDS)*(ZRHO00)**XCEXVT +! +XEXSEDG = (XBG+XDG-XCXG)/(XBG-XCXG) +XFSEDG = XCG*XAG*XCCG*MOMG(XALPHAG,XNUG,XBG+XDG)* & + (XAG*XCCG*MOMG(XALPHAG,XNUG,XBG))**(-XEXSEDG)*(ZRHO00)**XCEXVT +! +! +!------------------------------------------------------------------------------- +! +!* 5. CONSTANTS FOR THE SLOW COLD PROCESSES +! ------------------------------------- +! +! +!* 5.1 Constants for ice nucleation +! +SELECT CASE (CPRISTINE_ICE_C1R3) + CASE('PLAT') + ZFACT_NUCL = 1.0 ! Plates + CASE('COLU') + ZFACT_NUCL = 25.0 ! Columns + CASE('BURO') + ZFACT_NUCL = 17.0 ! Bullet rosettes +END SELECT +! +!* 5.1.1 Constants for nucleation from ice nuclei +! +XNUC_DEP = XFACTNUC_DEP*1000.*ZFACT_NUCL +XEXSI_DEP = 12.96 +XEX_DEP = -0.639 +! +XCONCI_MAX = 100.E3 ! Assume a maximum concentration of 100 per liter +XNUC_CON = XFACTNUC_CON*1000.*ZFACT_NUCL +XEXTT_CON = -0.262 +XEX_CON = -2.8 +! +XMNU0 = 6.88E-13 +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" Heterogeneous nucleation")') + WRITE(UNIT=ILUOUT0,FMT='(" XNUC_DEP=",E13.6," XEXSI=",E13.6," XEX=",E13.6)') & + XNUC_DEP,XEXSI_DEP,XEX_DEP + WRITE(UNIT=ILUOUT0,FMT='(" XNUC_CON=",E13.6," XEXTT=",E13.6," XEX=",E13.6)') & + XNUC_CON,XEXTT_CON,XEX_CON + WRITE(UNIT=ILUOUT0,FMT='(" mass of embryo XMNU0=",E13.6)') XMNU0 +END IF +! +!* 5.1.2 Constants for homogeneous nucleation from haze particules +! +XRHOI_HONH = 925.0 +XCEXP_DIFVAP_HONH = 1.94 +XCOEF_DIFVAP_HONH = (2.0*XPI)*0.211E-4*XP00/XTT**XCEXP_DIFVAP_HONH +XCRITSAT1_HONH = 2.583 +XCRITSAT2_HONH = 207.83 +XTMIN_HONH = 180.0 +XTMAX_HONH = 240.0 +XDLNJODT1_HONH = 4.37 +XDLNJODT2_HONH = 0.03 +XC1_HONH = 100.0 +XC2_HONH = 22.6 +XC3_HONH = 0.1 +XRCOEF_HONH = (XPI/6.0)*XRHOI_HONH +! +!* 5.1.3 Constants for homogeneous nucleation from cloud droplets +! +XTEXP1_HONC = -606.3952*LOG(10.0) +XTEXP2_HONC = -52.6611*LOG(10.0) +XTEXP3_HONC = -1.7439*LOG(10.0) +XTEXP4_HONC = -0.0265*LOG(10.0) +XTEXP5_HONC = -1.536E-4*LOG(10.0) +IF (XALPHAC == 3.0) THEN + XC_HONC = XPI/6.0 + XR_HONC = XPI/6.0 +ELSE + WRITE(UNIT=ILUOUT0,FMT='(" Homogeneous nucleation")') + WRITE(UNIT=ILUOUT0,FMT='(" XALPHAC=",E13.6," IS NOT 3.0")') XALPHAC + WRITE(UNIT=ILUOUT0,FMT='(" No algorithm yet developed in this case !")') + call Print_msg(NVERB_FATAL,'GEN','INI_ICE_C1R3','') +END IF +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" Homogeneous nucleation")') + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP1_HONC=",E13.6)') XTEXP1_HONC + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP2_HONC=",E13.6)') XTEXP2_HONC + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP3_HONC=",E13.6)') XTEXP3_HONC + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP4_HONC=",E13.6)') XTEXP4_HONC + WRITE(UNIT=ILUOUT0,FMT='(" XTEXP5_HONC=",E13.6)') XTEXP5_HONC + WRITE(UNIT=ILUOUT0,FMT='("XC_HONC=",E13.6," XR_HONC=",E13.6)') XC_HONC,XR_HONC +END IF +! +! +!* 5.2 Constants for vapor deposition on ice +! +XSCFAC = (0.63**(1./3.))*SQRT((ZRHO00)**XCEXVT) ! One assumes Sc=0.63 +! +X0DEPI = (4.0*XPI)*XC1I*XF0I*MOMG(XALPHAI,XNUI,1.) +X2DEPI = (4.0*XPI)*XC1I*XF2I*XC_I*MOMG(XALPHAI,XNUI,XDI+2.0) +! +! Harrington parameterization for ice to snow conversion +! +XDICNVS_LIM = 125.E-6 ! size in microns +XLBDAICNVS_LIM = (50.0**(1.0/(XALPHAI)))/XDICNVS_LIM ! ZLBDAI Limitation +XC0DEPIS = ((4.0*XPI)/(XAI*XBI))*XC1I*XF0IS* & + (XALPHAI/GAMMA(XNUI))*XDICNVS_LIM**(1.0-XBI) +XC1DEPIS = ((4.0*XPI)/(XAI*XBI))*XC1I*XF1IS*SQRT(XC_I)* & + (XALPHAI/GAMMA(XNUI))*XDICNVS_LIM**(1.0-XBI+(XDI+1.0)/2.0) +XR0DEPIS = XC0DEPIS *(XAI*XDICNVS_LIM**XBI) +XR1DEPIS = XC1DEPIS *(XAI*XDICNVS_LIM**XBI) +! +! Harrington parameterization for snow to ice conversion +! +XLBDASCNVI_MAX = 6000. ! lbdas max after Field (1999) +XCSCNVI_MAX = 1000. ! estimated ice conc. due to S->I conversion +XRHORSMIN = (XLBDASCNVI_MAX/XLBS)**(1.0/XLBEXS) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" snow is converted into pristine ice with ")') + WRITE(UNIT=ILUOUT0,FMT='(" XRHORSMIN=",E13.6)') XRHORSMIN +END IF +! +XDSCNVI_LIM = 125.E-6 ! size in microns +XLBDASCNVI_LIM = (50.0**(1.0/(XALPHAS)))/XDSCNVI_LIM ! ZLBDAS Limitation +XC0DEPSI = ((4.0*XPI)/(XAS*XBS))*XC1S*XF0IS* & + (XALPHAS/GAMMA(XNUS))*XDSCNVI_LIM**(1.0-XBS) +XC1DEPSI = ((4.0*XPI)/(XAS*XBS))*XC1S*XF1IS*SQRT(XCS)* & + (XALPHAS/GAMMA(XNUS))*XDSCNVI_LIM**(1.0-XBS+(XDS+1.0)/2.0) +XR0DEPSI = XC0DEPSI *(XAS*XDSCNVI_LIM**XBS) +XR1DEPSI = XC1DEPSI *(XAS*XDSCNVI_LIM**XBS) +! +! Vapor deposition on the snow and the graupels +! +X0DEPS = (4.0*XPI)*XCCS*XC1S*XF0S*MOMG(XALPHAS,XNUS,1.) +X1DEPS = (4.0*XPI)*XCCS*XC1S*XF1S*SQRT(XCS)*MOMG(XALPHAS,XNUS,0.5*XDS+1.5) +XEX0DEPS = XCXS-1.0 +XEX1DEPS = XCXS-0.5*(XDS+3.0) +! +X0DEPG = (4.0*XPI)*XCCG*XC1G*XF0G*MOMG(XALPHAG,XNUG,1.) +X1DEPG = (4.0*XPI)*XCCG*XC1G*XF1G*SQRT(XCG)*MOMG(XALPHAG,XNUG,0.5*XDG+1.5) +XEX0DEPG = XCXG-1.0 +XEX1DEPG = XCXG-0.5*(XDG+3.0) +! +!------------------------------------------------------------------------------- +! +!* 6. CONSTANTS FOR THE COALESCENCE PROCESSES +! -------------------------------------- +! +! +!* 6.0 Precalculation of the gamma function momentum +! +! +ZGAMI(1) = GAMMA(XNUI) +ZGAMI(2) = MOMG(XALPHAI,XNUI,3.) +ZGAMI(3) = MOMG(XALPHAI,XNUI,6.) +ZGAMI(4) = ZGAMI(3)-ZGAMI(2)**2 ! useful for Sig_I +ZGAMI(5) = MOMG(XALPHAI,XNUI,9.) +ZGAMI(6) = MOMG(XALPHAI,XNUI,3.+XBI) +ZGAMI(7) = MOMG(XALPHAI,XNUI,XBI) +ZGAMI(8) = MOMG(XALPHAI,XNUI,3.)/MOMG(XALPHAI,XNUI,2.) +! +ZGAMS(1) = GAMMA(XNUS) +ZGAMS(2) = MOMG(XALPHAS,XNUS,3.) +! +!* 6.1 Csts for the coalescence processes +! +ZFAC_ZRNIC = 0.1 +XKER_ZRNIC_A1 = 2.59E15*ZFAC_ZRNIC**2! From Long a1=9.44E9 cm-3 + ! so XKERA1= 9.44E9*1E6*(PI/6)**2 +XKER_ZRNIC_A2 = 3.03E3*ZFAC_ZRNIC ! From Long a2=5.78E3 + ! so XKERA2= 5.78E3* (PI/6) +! +!* 6.2 Csts for the pristine ice selfcollection process +! +XSELFI = XKER_ZRNIC_A1*ZGAMI(3) +XCOLEXII = 0.025 ! Temperature factor of the I+I collection efficiency +! +!* 6.3 Constants for pristine ice autoconversion +! +XTEXAUTI = 0.025 ! Temperature factor of the I+I collection efficiency +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" pristine ice autoconversion")') + WRITE(UNIT=ILUOUT0,FMT='(" Temp. factor XTEXAUTI=",E13.6)') XTEXAUTI +END IF +! +XAUTO3 = 6.25E18*(ZGAMI(2))**(1./3.)*SQRT(ZGAMI(4)) +XAUTO4 = 0.5E6*(ZGAMI(4))**(1./6.) +XLAUTS = 2.7E-2 +XLAUTS_THRESHOLD = 0.4 +XITAUTS= 0.27 ! (Notice that T2 of BR74 is uncorrect and that 0.27=1./3.7 +XITAUTS_THRESHOLD = 7.5 +! +!* 6.4 Constants for snow aggregation +! +XCOLEXIS = 0.05 ! Temperature factor of the I+S collection efficiency +XAGGS_CLARGE1 = XKER_ZRNIC_A2*ZGAMI(2) +XAGGS_CLARGE2 = XKER_ZRNIC_A2*ZGAMS(2) +XAGGS_RLARGE1 = XKER_ZRNIC_A2*ZGAMI(6)*XAI +XAGGS_RLARGE2 = XKER_ZRNIC_A2*ZGAMI(7)*ZGAMS(2)*XAI +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" snow aggregation")') + WRITE(UNIT=ILUOUT0,FMT='(" Temp. factor XCOLEXIS=",E13.6)') XCOLEXIS +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 7. CONSTANTS FOR THE FAST COLD PROCESSES FOR THE AGGREGATES +! -------------------------------------------------------- +! +! +!* 7.1 Constants for the riming of the aggregates +! +XDCSLIM = 0.007 ! D_cs^lim = 7 mm as suggested by Farley et al. (1989) +XCOLCS = 1.0 +XEXCRIMSS= XCXS-XDS-2.0 +XCRIMSS = (XPI/4.0)*XCOLCS*XCCS*XCS*(ZRHO00**XCEXVT)*MOMG(XALPHAS,XNUS,XDS+2.0) +XEXCRIMSG= XEXCRIMSS +XCRIMSG = XCRIMSS +XSRIMCG = XCCS*XAS*MOMG(XALPHAS,XNUS,XBS) +XEXSRIMCG= XCXS-XBS +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" riming of the aggregates")') + WRITE(UNIT=ILUOUT0,FMT='(" D_cs^lim (Farley et al.) XDCSLIM=",E13.6)') XDCSLIM + WRITE(UNIT=ILUOUT0,FMT='(" Coll. efficiency XCOLCS=",E13.6)') XCOLCS +END IF +! +NGAMINC = 80 +XGAMINC_BOUND_MIN = 1.0E-1 ! Minimal value of (Lbda * D_cs^lim)**alpha +XGAMINC_BOUND_MAX = 1.0E7 ! Maximal value of (Lbda * D_cs^lim)**alpha +ZRATE = EXP(LOG(XGAMINC_BOUND_MAX/XGAMINC_BOUND_MIN)/REAL(NGAMINC-1)) +! +ALLOCATE( XGAMINC_RIM1(NGAMINC) ) +ALLOCATE( XGAMINC_RIM2(NGAMINC) ) +! +DO J1=1,NGAMINC + ZBOUND = XGAMINC_BOUND_MIN*ZRATE**(J1-1) + XGAMINC_RIM1(J1) = GAMMA_INC(XNUS+(2.0+XDS)/XALPHAS,ZBOUND) + XGAMINC_RIM2(J1) = GAMMA_INC(XNUS+XBS/XALPHAS ,ZBOUND) +END DO +! +XRIMINTP1 = XALPHAS / LOG(ZRATE) +XRIMINTP2 = 1.0 + XRIMINTP1*LOG( XDCSLIM/(XGAMINC_BOUND_MIN)**(1.0/XALPHAS) ) +! +!* 7.1.1 Defining the constants for the Hallett-Mossop +! secondary ice nucleation process +! +XHMTMIN = XTT - 8.0 +XHMTMAX = XTT - 3.0 +XHM1 = 9.3E-3 ! Obsolete parameterization +XHM2 = 1.5E-3/LOG(10.0) ! from Ferrier (1995) +XHM_YIELD = 5.E-3 ! A splinter is produced after the riming of 200 droplets +XHM_COLLCS= 1.0 ! Collision efficiency snow/droplet (with Dc>25 microns) +XHM_FACTS = XHM_YIELD*(XHM_COLLCS/XCOLCS) +! +! Notice: One magnitude of lambda discretized over 10 points for the droplets +! +XGAMINC_HMC_BOUND_MIN = 1.0E-3 ! Min value of (Lbda * (12,25) microns)**alpha +XGAMINC_HMC_BOUND_MAX = 1.0E5 ! Max value of (Lbda * (12,25) microns)**alpha +ZRATE = EXP(LOG(XGAMINC_HMC_BOUND_MAX/XGAMINC_HMC_BOUND_MIN)/REAL(NGAMINC-1)) +! +ALLOCATE( XGAMINC_HMC(NGAMINC) ) +! +DO J1=1,NGAMINC + ZBOUND = XGAMINC_HMC_BOUND_MIN*ZRATE**(J1-1) + XGAMINC_HMC(J1) = GAMMA_INC(XNUC,ZBOUND) +END DO +! +XHMSINTP1 = XALPHAC / LOG(ZRATE) +XHMSINTP2 = 1.0 + XHMSINTP1*LOG( 12.E-6/(XGAMINC_HMC_BOUND_MIN)**(1.0/XALPHAC) ) +XHMLINTP1 = XALPHAC / LOG(ZRATE) +XHMLINTP2 = 1.0 + XHMLINTP1*LOG( 25.E-6/(XGAMINC_HMC_BOUND_MIN)**(1.0/XALPHAC) ) +! +!* 7.2 Constants for the accretion of raindrops onto aggregates +! +XFRACCSS = ((XPI**2)/24.0)*XCCS*XRHOLW*(ZRHO00**XCEXVT) +! +XLBRACCS1 = MOMG(XALPHAS,XNUS,2.)*MOMG(XALPHAR,XNUR,3.) +XLBRACCS3 = MOMG(XALPHAR,XNUR,5.) +! +XFSACCRG = (XPI/4.0)*XAS*XCCS*(ZRHO00**XCEXVT) +! +XLBSACCR1 = MOMG(XALPHAR,XNUR,2.)*MOMG(XALPHAS,XNUS,XBS) +XLBSACCR2 = 2.*MOMG(XALPHAR,XNUR,1.)*MOMG(XALPHAS,XNUS,XBS+1.) +XLBSACCR3 = MOMG(XALPHAS,XNUS,XBS+2.) +! +!* 7.2.1 Defining the ranges for the computation of the kernels +! +! Notice: One magnitude of lambda discretized over 10 points for rain +! Notice: One magnitude of lambda discretized over 10 points for snow +! +NACCLBDAS = 40 +XACCLBDAS_MIN = 5.0E1 ! Minimal value of Lbda_s to tabulate XKER_RACCS +XACCLBDAS_MAX = 5.0E5 ! Maximal value of Lbda_s to tabulate XKER_RACCS +ZRATE = LOG(XACCLBDAS_MAX/XACCLBDAS_MIN)/REAL(NACCLBDAS-1) +XACCINTP1S = 1.0 / ZRATE +XACCINTP2S = 1.0 - LOG( XACCLBDAS_MIN ) / ZRATE +NACCLBDAR = 40 +XACCLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RACCS +XACCLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RACCS +ZRATE = LOG(XACCLBDAR_MAX/XACCLBDAR_MIN)/REAL(NACCLBDAR-1) +XACCINTP1R = 1.0 / ZRATE +XACCINTP2R = 1.0 - LOG( XACCLBDAR_MIN ) / ZRATE +! +!* 7.2.2 Computations of the tabulated normalized kernels +! +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZESR = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_RACCSS, XKER_RACCS and XKER_SACCRG +! +ALLOCATE( XKER_RACCSS(NACCLBDAS,NACCLBDAR) ) +ALLOCATE( XKER_RACCS (NACCLBDAS,NACCLBDAR) ) +ALLOCATE( XKER_SACCRG(NACCLBDAR,NACCLBDAS) ) +! +CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN,& + PFDINFTY ) +IF( (KACCLBDAS/=NACCLBDAS) .OR. (KACCLBDAR/=NACCLBDAR) .OR. (KND/=IND) .OR. & + (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & + (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR) .OR. & + (PESR/=ZESR) .OR. (PBS/=XBS) .OR. (PBR/=XBR) .OR. & + (PCS/=XCS) .OR. (PDS/=XDS) .OR. (PCR/=XCR) .OR. (PDR/=XDR) .OR. & + (PACCLBDAS_MAX/=XACCLBDAS_MAX) .OR. (PACCLBDAR_MAX/=XACCLBDAR_MAX) .OR. & + (PACCLBDAS_MIN/=XACCLBDAS_MIN) .OR. (PACCLBDAR_MIN/=XACCLBDAR_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RRCOLSS ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBR, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_RACCSS, XAG, XBS, XAS ) + CALL RZCOLX ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBR, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_RACCS ) + CALL RSCOLRG ( IND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XBS, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + ZFDINFTY, XKER_SACCRG,XAG, XBS, XAS ) + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF RACSS KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF RACS KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF SACRG KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("KND=",I3)') IND + WRITE(UNIT=ILUOUT0,FMT='("KACCLBDAS=",I3)') NACCLBDAS + WRITE(UNIT=ILUOUT0,FMT='("KACCLBDAR=",I3)') NACCLBDAR + WRITE(UNIT=ILUOUT0,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=ILUOUT0,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=ILUOUT0,FMT='("PALPHAR=",E13.6)') XALPHAR + WRITE(UNIT=ILUOUT0,FMT='("PNUR=",E13.6)') XNUR + WRITE(UNIT=ILUOUT0,FMT='("PESR=",E13.6)') ZESR + WRITE(UNIT=ILUOUT0,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=ILUOUT0,FMT='("PBR=",E13.6)') XBR + WRITE(UNIT=ILUOUT0,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=ILUOUT0,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=ILUOUT0,FMT='("PCR=",E13.6)') XCR + WRITE(UNIT=ILUOUT0,FMT='("PDR=",E13.6)') XDR + WRITE(UNIT=ILUOUT0,FMT='("PACCLBDAS_MAX=",E13.6)') & + XACCLBDAS_MAX + WRITE(UNIT=ILUOUT0,FMT='("PACCLBDAR_MAX=",E13.6)') & + XACCLBDAR_MAX + WRITE(UNIT=ILUOUT0,FMT='("PACCLBDAS_MIN=",E13.6)') & + XACCLBDAS_MIN + WRITE(UNIT=ILUOUT0,FMT='("PACCLBDAR_MIN=",E13.6)') & + XACCLBDAR_MIN + WRITE(UNIT=ILUOUT0,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_RACCSS) ) THEN")') + DO J1 = 1 , NACCLBDAS + DO J2 = 1 , NACCLBDAR + WRITE(UNIT=ILUOUT0,FMT='(" PKER_RACCSS(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RACCSS(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_RACCS ) ) THEN")') + DO J1 = 1 , NACCLBDAS + DO J2 = 1 , NACCLBDAR + WRITE(UNIT=ILUOUT0,FMT='(" PKER_RACCS (",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RACCS (J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_SACCRG) ) THEN")') + DO J1 = 1 , NACCLBDAR + DO J2 = 1 , NACCLBDAS + WRITE(UNIT=ILUOUT0,FMT='(" PKER_SACCRG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_SACCRG(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + ELSE + CALL READ_XKER_RACCS (KACCLBDAS,KACCLBDAR,KND, & + PALPHAS,PNUS,PALPHAR,PNUR,PESR,PBS,PBR,PCS,PDS,PCR,PDR, & + PACCLBDAS_MAX,PACCLBDAR_MAX,PACCLBDAS_MIN,PACCLBDAR_MIN,& + PFDINFTY,XKER_RACCSS,XKER_RACCS,XKER_SACCRG ) + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_RACCSS")') + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_RACCS ")') + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_SACCRG")') +END IF +! +!* 7.3 Constant for the conversion-melting rate +! +XFSCVMG = 2.0 +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" conversion-melting of the aggregates")') + WRITE(UNIT=ILUOUT0,FMT='(" Conv. factor XFSCVMG=",E13.6)') XFSCVMG +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 8. CONSTANTS FOR THE FAST COLD PROCESSES FOR THE GRAUPELN +! ------------------------------------------------------ +! +! +!* 8.1 Constants for the rain contact freezing +! +XCOLIR = 1.0 +! +! values of these coeficients differ from the single-momemt rain_ice case +! +XEXRCFRI = -XDR-5.0 +XRCFRI = ((XPI**2)/24.0)*XRHOLW*XCOLIR*XCR*(ZRHO00**XCEXVT) & + *MOMG(XALPHAR,XNUR,XDR+5.0) +XEXICFRR = -XDR-2.0 +XICFRR = (XPI/4.0)*XCOLIR*XCR*(ZRHO00**XCEXVT) & + *MOMG(XALPHAR,XNUR,XDR+2.0) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" rain contact freezing")') + WRITE(UNIT=ILUOUT0,FMT='(" Coll. efficiency XCOLIR=",E13.6)') XCOLIR +END IF +! +! +!* 8.2 Constants for the dry growth of the graupeln +! +!* 8.2.1 Constants for the cloud droplet collection by the graupeln +! and for the Hallett-Mossop process +! +XCOLCG = 0.6 ! Estimated from Cober and List (1993) +XFCDRYG = (XPI/4.0)*XCOLCG*XCCG*XCG*(ZRHO00**XCEXVT)*MOMG(XALPHAG,XNUG,XDG+2.0) +! +XHM_COLLCG= 0.9 ! Collision efficiency graupel/droplet (with Dc>25 microns) +XHM_FACTG = XHM_YIELD*(XHM_COLLCG/XCOLCG) +! +!* 8.2.2 Constants for the cloud ice collection by the graupeln +! +XCOLIG = 0.25 ! Collection efficiency of I+G +XCOLEXIG = 0.05 ! Temperature factor of the I+G collection efficiency +XCOLIG = 0.01 ! Collection efficiency of I+G +XCOLEXIG = 0.1 ! Temperature factor of the I+G collection efficiency +WRITE (ILUOUT0, FMT=*) ' NEW Constants for the cloud ice collection by the graupeln' +WRITE (ILUOUT0, FMT=*) ' XCOLIG, XCOLEXIG = ',XCOLIG,XCOLEXIG +XFIDRYG = (XPI/4.0)*XCOLIG*XCCG*XCG*(ZRHO00**XCEXVT)*MOMG(XALPHAG,XNUG,XDG+2.0) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" cloud ice collection by the graupeln")') + WRITE(UNIT=ILUOUT0,FMT='(" Coll. efficiency XCOLIG=",E13.6)') XCOLIG + WRITE(UNIT=ILUOUT0,FMT='(" Temp. factor XCOLEXIG=",E13.6)') XCOLEXIG +END IF +! +!* 8.2.3 Constants for the aggregate collection by the graupeln +! +XCOLSG = 0.25 ! Collection efficiency of S+G +XCOLEXSG = 0.05 ! Temperature factor of the S+G collection efficiency +XCOLSG = 0.01 ! Collection efficiency of S+G +XCOLEXSG = 0.1 ! Temperature factor of the S+G collection efficiency +WRITE (ILUOUT0, FMT=*) ' NEW Constants for the aggregate collection by the graupeln' +WRITE (ILUOUT0, FMT=*) ' XCOLSG, XCOLEXSG = ',XCOLSG,XCOLEXSG +XFSDRYG = (XPI/4.0)*XCOLSG*XCCG*XCCS*XAS*(ZRHO00**XCEXVT) +! +XLBSDRYG1 = MOMG(XALPHAG,XNUG,2.)*MOMG(XALPHAS,XNUS,XBS) +XLBSDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAS,XNUS,XBS+1.) +XLBSDRYG3 = MOMG(XALPHAS,XNUS,XBS+2.) +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" aggregate collection by the graupeln")') + WRITE(UNIT=ILUOUT0,FMT='(" Coll. efficiency XCOLSG=",E13.6)') XCOLSG + WRITE(UNIT=ILUOUT0,FMT='(" Temp. factor XCOLEXSG=",E13.6)') XCOLEXSG +END IF +! +!* 8.2.4 Constants for the raindrop collection by the graupeln +! +XFRDRYG = ((XPI**2)/24.0)*XCCG*XRHOLW*(ZRHO00**XCEXVT) +! +XLBRDRYG1 = MOMG(XALPHAG,XNUG,2.)*MOMG(XALPHAR,XNUR,3.) +XLBRDRYG2 = 2.*MOMG(XALPHAG,XNUG,1.)*MOMG(XALPHAR,XNUR,4.) +XLBRDRYG3 = MOMG(XALPHAR,XNUR,5.) +! +! Notice: One magnitude of lambda discretized over 10 points +! +NDRYLBDAR = 40 +XDRYLBDAR_MIN = 1.0E3 ! Minimal value of Lbda_r to tabulate XKER_RDRYG +XDRYLBDAR_MAX = 1.0E7 ! Maximal value of Lbda_r to tabulate XKER_RDRYG +ZRATE = LOG(XDRYLBDAR_MAX/XDRYLBDAR_MIN)/REAL(NDRYLBDAR-1) +XDRYINTP1R = 1.0 / ZRATE +XDRYINTP2R = 1.0 - LOG( XDRYLBDAR_MIN ) / ZRATE +NDRYLBDAS = 80 +XDRYLBDAS_MIN = 2.5E1 ! Minimal value of Lbda_s to tabulate XKER_SDRYG +XDRYLBDAS_MAX = 2.5E9 ! Maximal value of Lbda_s to tabulate XKER_SDRYG +ZRATE = LOG(XDRYLBDAS_MAX/XDRYLBDAS_MIN)/REAL(NDRYLBDAS-1) +XDRYINTP1S = 1.0 / ZRATE +XDRYINTP2S = 1.0 - LOG( XDRYLBDAS_MIN ) / ZRATE +NDRYLBDAG = 40 +XDRYLBDAG_MIN = 1.0E3 ! Min value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG +XDRYLBDAG_MAX = 1.0E7 ! Max value of Lbda_g to tabulate XKER_SDRYG,XKER_RDRYG +ZRATE = LOG(XDRYLBDAG_MAX/XDRYLBDAG_MIN)/REAL(NDRYLBDAG-1) +XDRYINTP1G = 1.0 / ZRATE +XDRYINTP2G = 1.0 - LOG( XDRYLBDAG_MIN ) / ZRATE +! +!* 8.2.5 Computations of the tabulated normalized kernels +! +IND = 50 ! Interval number, collection efficiency and infinite diameter +ZEGS = 1.0 ! factor used to integrate the dimensional distributions when +ZFDINFTY = 20.0 ! computing the kernels XKER_SDRYG +! +ALLOCATE( XKER_SDRYG(NDRYLBDAG,NDRYLBDAS) ) +! +CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & + PFDINFTY ) +IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAS/=NDRYLBDAS) .OR. (KND/=IND) .OR. & + (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & + (PALPHAS/=XALPHAS) .OR. (PNUS/=XNUS) .OR. & + (PEGS/=ZEGS) .OR. (PBS/=XBS) .OR. & + (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCS/=XCS) .OR. (PDS/=XDS) .OR. & + (PDRYLBDAG_MAX/=XDRYLBDAG_MAX) .OR. (PDRYLBDAS_MAX/=XDRYLBDAS_MAX) .OR. & + (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAS_MIN/=XDRYLBDAS_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAS, XNUS, & + ZEGS, XBS, XCG, XDG, XCS, XDS, & + XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & + ZFDINFTY, XKER_SDRYG ) + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF SDRYG KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("KND=",I3)') IND + WRITE(UNIT=ILUOUT0,FMT='("KDRYLBDAG=",I3)') NDRYLBDAG + WRITE(UNIT=ILUOUT0,FMT='("KDRYLBDAS=",I3)') NDRYLBDAS + WRITE(UNIT=ILUOUT0,FMT='("PALPHAG=",E13.6)') XALPHAG + WRITE(UNIT=ILUOUT0,FMT='("PNUG=",E13.6)') XNUG + WRITE(UNIT=ILUOUT0,FMT='("PALPHAS=",E13.6)') XALPHAS + WRITE(UNIT=ILUOUT0,FMT='("PNUS=",E13.6)') XNUS + WRITE(UNIT=ILUOUT0,FMT='("PEGS=",E13.6)') ZEGS + WRITE(UNIT=ILUOUT0,FMT='("PBS=",E13.6)') XBS + WRITE(UNIT=ILUOUT0,FMT='("PCG=",E13.6)') XCG + WRITE(UNIT=ILUOUT0,FMT='("PDG=",E13.6)') XDG + WRITE(UNIT=ILUOUT0,FMT='("PCS=",E13.6)') XCS + WRITE(UNIT=ILUOUT0,FMT='("PDS=",E13.6)') XDS + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAG_MAX=",E13.6)') & + XDRYLBDAG_MAX + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAS_MAX=",E13.6)') & + XDRYLBDAS_MAX + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAG_MIN=",E13.6)') & + XDRYLBDAG_MIN + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAS_MIN=",E13.6)') & + XDRYLBDAS_MIN + WRITE(UNIT=ILUOUT0,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_SDRYG) ) THEN")') + DO J1 = 1 , NDRYLBDAG + DO J2 = 1 , NDRYLBDAS + WRITE(UNIT=ILUOUT0,FMT='("PKER_SDRYG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_SDRYG(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + ELSE + CALL READ_XKER_SDRYG (KDRYLBDAG,KDRYLBDAS,KND, & + PALPHAG,PNUG,PALPHAS,PNUS,PEGS,PBS,PCG,PDG,PCS,PDS, & + PDRYLBDAG_MAX,PDRYLBDAS_MAX,PDRYLBDAG_MIN,PDRYLBDAS_MIN, & + PFDINFTY,XKER_SDRYG ) + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_SDRYG")') +END IF +! +! +IND = 50 ! Number of interval used to integrate the dimensional +ZEGR = 1.0 ! distributions when computing the kernel XKER_RDRYG +ZFDINFTY = 20.0 +! +ALLOCATE( XKER_RDRYG(NDRYLBDAG,NDRYLBDAR) ) +! +CALL READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & + PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & + PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, & + PFDINFTY ) +IF( (KDRYLBDAG/=NDRYLBDAG) .OR. (KDRYLBDAR/=NDRYLBDAR) .OR. (KND/=IND) .OR. & + (PALPHAG/=XALPHAG) .OR. (PNUG/=XNUG) .OR. & + (PALPHAR/=XALPHAR) .OR. (PNUR/=XNUR) .OR. & + (PEGR/=ZEGR) .OR. (PBR/=XBR) .OR. & + (PCG/=XCG) .OR. (PDG/=XDG) .OR. (PCR/=XCR) .OR. (PDR/=XDR) .OR. & + (PDRYLBDAG_MAX/=XDRYLBDAG_MAX) .OR. (PDRYLBDAR_MAX/=XDRYLBDAR_MAX) .OR. & + (PDRYLBDAG_MIN/=XDRYLBDAG_MIN) .OR. (PDRYLBDAR_MIN/=XDRYLBDAR_MIN) .OR. & + (PFDINFTY/=ZFDINFTY) ) THEN + CALL RZCOLX ( IND, XALPHAG, XNUG, XALPHAR, XNUR, & + ZEGR, XBR, XCG, XDG, XCR, XDR, & + XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & + ZFDINFTY, XKER_RDRYG ) + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("**** UPDATE NEW SET OF RDRYG KERNELS ****")') + WRITE(UNIT=ILUOUT0,FMT='("*****************************************")') + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("KND=",I3)') IND + WRITE(UNIT=ILUOUT0,FMT='("KDRYLBDAG=",I3)') NDRYLBDAG + WRITE(UNIT=ILUOUT0,FMT='("KDRYLBDAR=",I3)') NDRYLBDAR + WRITE(UNIT=ILUOUT0,FMT='("PALPHAG=",E13.6)') XALPHAG + WRITE(UNIT=ILUOUT0,FMT='("PNUG=",E13.6)') XNUG + WRITE(UNIT=ILUOUT0,FMT='("PALPHAR=",E13.6)') XALPHAR + WRITE(UNIT=ILUOUT0,FMT='("PNUR=",E13.6)') XNUR + WRITE(UNIT=ILUOUT0,FMT='("PEGR=",E13.6)') ZEGR + WRITE(UNIT=ILUOUT0,FMT='("PBR=",E13.6)') XBR + WRITE(UNIT=ILUOUT0,FMT='("PCG=",E13.6)') XCG + WRITE(UNIT=ILUOUT0,FMT='("PDG=",E13.6)') XDG + WRITE(UNIT=ILUOUT0,FMT='("PCR=",E13.6)') XCR + WRITE(UNIT=ILUOUT0,FMT='("PDR=",E13.6)') XDR + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAG_MAX=",E13.6)') & + XDRYLBDAG_MAX + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAR_MAX=",E13.6)') & + XDRYLBDAR_MAX + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAG_MIN=",E13.6)') & + XDRYLBDAG_MIN + WRITE(UNIT=ILUOUT0,FMT='("PDRYLBDAR_MIN=",E13.6)') & + XDRYLBDAR_MIN + WRITE(UNIT=ILUOUT0,FMT='("PFDINFTY=",E13.6)') ZFDINFTY + WRITE(UNIT=ILUOUT0,FMT='("!")') + WRITE(UNIT=ILUOUT0,FMT='("IF( PRESENT(PKER_RDRYG) ) THEN")') + DO J1 = 1 , NDRYLBDAG + DO J2 = 1 , NDRYLBDAR + WRITE(UNIT=ILUOUT0,FMT='("PKER_RDRYG(",I3,",",I3,") = ",E13.6)') & + J1,J2,XKER_RDRYG(J1,J2) + END DO + END DO + WRITE(UNIT=ILUOUT0,FMT='("END IF")') + ELSE + CALL READ_XKER_RDRYG (KDRYLBDAG,KDRYLBDAR,KND, & + PALPHAG,PNUG,PALPHAR,PNUR,PEGR,PBR,PCG,PDG,PCR,PDR, & + PDRYLBDAG_MAX,PDRYLBDAR_MAX,PDRYLBDAG_MIN,PDRYLBDAR_MIN, & + PFDINFTY,XKER_RDRYG ) + WRITE(UNIT=ILUOUT0,FMT='(" Read XKER_RDRYG")') +END IF +! +!------------------------------------------------------------------------------- +! +!* 9. SET-UP RADIATIVE PARAMETERS +! --------------------------- +! +! R_eff_i = XFREFFI * (rho*r_i/N_i)**(1/3) +! +! +XFREFFI = 0.5 * ZGAMI(8) * (1.0/XLBI)**XLBEXI +! +!------------------------------------------------------------------------------- +! +!* 10. SOME PRINTS FOR CONTROL +! ----------------------- +! +GFLAG = .TRUE. +IF (GFLAG) THEN + WRITE(UNIT=ILUOUT0,FMT='(" Summary of the ice particule characteristics")') + WRITE(UNIT=ILUOUT0,FMT='(" PRISTINE ICE")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAI,XBI + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XC_I,XDI + WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAI,XNUI + WRITE(UNIT=ILUOUT0,FMT='(" SNOW")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAS,XBS + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCS,XDS + WRITE(UNIT=ILUOUT0,FMT='(" concentration:CC=",E13.6," x=",E13.6)') & + XCCS,XCXS + WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAS,XNUS + WRITE(UNIT=ILUOUT0,FMT='(" GRAUPEL")') + WRITE(UNIT=ILUOUT0,FMT='(" masse: A=",E13.6," B=",E13.6)') & + XAG,XBG + WRITE(UNIT=ILUOUT0,FMT='(" vitesse: C=",E13.6," D=",E13.6)') & + XCG,XDG + WRITE(UNIT=ILUOUT0,FMT='(" concentration:CC=",E13.6," x=",E13.6)') & + XCCG,XCXG + WRITE(UNIT=ILUOUT0,FMT='(" distribution:AL=",E13.6,"NU=",E13.6)') & + XALPHAG,XNUG +END IF +! +!------------------------------------------------------------------------------- +! +CONTAINS +! +!------------------------------------------------------------------------------ +! + FUNCTION MOMG (PALPHA,PNU,PP) RESULT (PMOMG) +! +! auxiliary routine used to compute the Pth moment order of the generalized +! gamma law +! + USE MODI_GAMMA +! + IMPLICIT NONE +! + REAL :: PALPHA ! first shape parameter of the dimensionnal distribution + REAL :: PNU ! second shape parameter of the dimensionnal distribution + REAL :: PP ! order of the moment + REAL :: PMOMG ! result: moment of order ZP +! +!------------------------------------------------------------------------------ +! +! + PMOMG = GAMMA(PNU+PP/PALPHA)/GAMMA(PNU) +! + END FUNCTION MOMG +! +!------------------------------------------------------------------------------ +! +! +END SUBROUTINE INI_ICE_C1R3 diff --git a/src/mesonh/micro/ini_param_elec.f90 b/src/mesonh/micro/ini_param_elec.f90 new file mode 100644 index 0000000000000000000000000000000000000000..d1eeb198f7d42d3312907491699c9bcf5a198609 --- /dev/null +++ b/src/mesonh/micro/ini_param_elec.f90 @@ -0,0 +1,1093 @@ +!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 MODI_INI_PARAM_ELEC +! ########################## +! +INTERFACE +! + SUBROUTINE INI_PARAM_ELEC (TPINIFILE, HGETSVM, PRHO00, & + KRR, KND, PFDINFTY, IIU, IJU, IKU ) +! +USE MODD_IO, ONLY : TFILEDATA +! +TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file +CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVM +INTEGER, INTENT(IN) :: KND ! Number of intervals to integrate kernels +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +REAL, INTENT(IN) :: PRHO00 ! Pressure at ground level +REAL, INTENT(IN) :: PFDINFTY ! Factor used to define the "infinite" diameter +INTEGER, INTENT(IN) :: IIU ! Upper dimension in x direction (local) +INTEGER, INTENT(IN) :: IJU ! Upper dimension in y direction (local) +INTEGER, INTENT(IN) :: IKU ! Upper dimension in z direction +! +END SUBROUTINE INI_PARAM_ELEC +END INTERFACE +END MODULE MODI_INI_PARAM_ELEC +! +! ############################################################## + SUBROUTINE INI_PARAM_ELEC (TPINIFILE, HGETSVM, PRHO00, & + KRR, KND, PFDINFTY, IIU, IJU, IKU ) +! ############################################################## +! +!!**** *INI_PARAM_ELEC* - initialize the constants necessary +!! for the electrical scheme. +!! +!! PURPOSE +!! ------- +!! The purpose of this routine is to initialize the constants used to +!! resolve the electrical scheme. +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! None +!! +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! Helsdon and Farley, 1987: A numerical study of a Montana thunderstorm: +!! 2. Model results versus observations involving electrical aspects. +!! J. Geophys. Res., 92, 5661-5675. +!! +!! Takahashi, 1978: Riming electrification as a charge generation +!! mechanism in thunderstorms. J. Atmos. Sci., 35, 1536-1548. +!! +!! Gardiner et al., 1985: Measurements of initial potential gradient and +!! particles charges in a Montana supercell thunderstorm. +!! J. Geophys. Res., 90, 6079-6086. +!! +!! Saunders et al., 1991: The effect of liquid water on thunderstorm +!! charging. J. Geophys. Res., 96, 11007-11017. +!! +!! AUTHOR +!! ------ +!! Gilles Molinie * Laboratoire d'Aerologie* +!! +!! MODIFICATIONS +!! ------------- +!! C. Barthe 01/02/2004 coefficients f/b +!! C. Barthe 21/05/2004 Add limitations for the NI processes +!! C. Barthe 31/05/2004 Add constants for the inductive process +!! C. Barthe 10/11/2009 Update to Masdev 4.8.1 +!! M. Chong 26/01/10 Small ions parameters +!! +Fair weather field from Helsdon-Farley +!! (JGR, 1987, 5661-5675) +!! J.-P. Pinty jan 2015 tabulate the equations for Saunders +!! J. Escobar 8/01/2016 bug , missing YDIR='XY' in READ +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_ELEC_n +USE MODD_ELEC_DESCR +USE MODD_ELEC_PARAM +USE MODD_IO, ONLY: TFILEDATA +USE MODD_NSV, ONLY: NSV_ELECEND +USE MODD_PARAMETERS +USE MODD_PARAM_ICE +USE MODD_RAIN_ICE_DESCR +USE MODD_RAIN_ICE_PARAM +USE MODD_VAR_ll +! +USE MODE_IO_FIELD_READ, only: IO_Field_read +! +USE MODI_MOMG +USE MODE_RRCOLSS, ONLY: RRCOLSS +USE MODE_RSCOLRG, ONLY: RSCOLRG +USE MODE_RZCOLX, ONLY: RZCOLX +USE MODI_VQZCOLX +! +IMPLICIT NONE +! +!* 0.1 Declaration of dummy arguments +! +TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file +CHARACTER (LEN=*), DIMENSION(:),INTENT(IN) :: HGETSVM +INTEGER, INTENT(IN) :: KND ! Number of intervals to integrate kernels +INTEGER, INTENT(IN) :: KRR ! Number of moist variables +REAL, INTENT(IN) :: PRHO00 ! Pressure at ground level +REAL, INTENT(IN) :: PFDINFTY ! Factor used to define the "infinite" diameter +INTEGER, INTENT(IN) :: IIU ! Upper dimension in x direction (local) +INTEGER, INTENT(IN) :: IJU ! Upper dimension in y direction (local) +INTEGER, INTENT(IN) :: IKU ! Upper dimension in z direction +! +!* 0.2 Declaration of local variables +! +REAL :: ZESR ! Mean efficiency of rain-aggregate collection +REAL :: ZEGS ! +REAL :: ZEGR +REAL, DIMENSION(:,:), ALLOCATABLE :: ZMANSELL1, ZMANSELL2 ! Used to initialize + ! XMANSELL array +! +INTEGER :: JLWC, JTEMP +REAL, DIMENSION(:), ALLOCATABLE :: ZT, ZLWCC, ZEW +! +!------------------------------------------------------------------------------- +! constants for electricity +! +XEPSILON = 8.85E-12 ! Dielectric permittivity of the air +XECHARGE = 1.6E-19 ! Elementary charge (C) +! +!* 1. SHAPE PARAMETERS +! ---------------- +! +XCXR = -1.0 ! Raindrop characteristic : XCXR (not declared in ini_rain_ice.f90) +! +! Individual charge q(d) = e_x * d ** f_x with f_x = XFx +! +XFC = 0.5 ! cloud +XFR = 1.3 ! rain +XFI = 0.5 ! pristine ice +XFS = 1.3 ! snow +XFG = 2.0 ! graupel +XFH = 2.0 ! hail +! +! Min/max values of e_x +! +XEGMIN = 1.E-12 +XEGMAX = 1.E-3 +! +XESMIN = 1.E-14 +XESMAX = 1.E-4 +! +XEIMIN = 1.E-12 +XEIMAX = 1.E-3 +! +XECMIN = 1.E-12 +XECMAX = 1.E-3 +! +XERMIN = 1.E-14 +XERMAX = 1.E-4 +! +XEHMIN = 1.E-14 +XEHMAX = 1.E-4 +! +! E=E_0 * exp(k_e*z) +XE_0 = -100. +XKEF = -2.E-4 ! 229.E-6 +! +! E=E_0 (b1 exp(-a1 z) + b2 exp(-a2 z) + b3 exp(-a3 z) : Helsdon-Farley, 1987 +XE0_HF = -80. +XA1_HF = 4.5E-3 +XB1_HF = 0.5 +XA2_HF = 3.8E-4 +XB2_HF = 0.65 +XA3_HF = 1.0E-4 +XB3_HF = 0.1 +! +XIONCOMB = 1.6E-12 +XF_POS = 1.4E-4 +XF_NEG = 1.9E-4 +XEXPMOB = 1.4E-4 +! +XFCORONA = 2.E-20 +XECORONA = 5000. +! +XJCURR_FW = -2.7E-12 +! +! +!------------------------------------------------------------------------------- +! +!* 2. COEFFICIENTS FOR CHARGE TRANSFERS +! --------------------------------- +! +! proportionality coefficient between mass transfer and charge transfer rates +! the mixing ratio is proportional to the volume of the particle +! the electric charge is proportional to the surface of the particle +! +XCOEF_RQ_V = 1 +XCOEF_RQ_C = XFC / 3.0 ! XBC=3 +XCOEF_RQ_R = XFR / XBR +XCOEF_RQ_I = XFI / XBI +XCOEF_RQ_S = XFS / XBS +XCOEF_RQ_G = XFG / XBG +XCOEF_RQ_H = XFH / XBH +! +! +!------------------------------------------------------------------------------- +! +!* 3. HOMOGENEOUS NUCLEATION +! ---------------------- +! +XALPHACQ = 3. !> +XNUCQ = 1. ! >--- generic values +XLBDACQ = 1.1E5 !> +! +XQHON = (1. / XRHOLW) +XQHON = XQHON * MOMG(XALPHACQ,XNUCQ,XFC+3.) +XQHON = XQHON / MOMG(XALPHACQ,XNUCQ,3.) +XQHON = XQHON / (XLBDACQ**XFC) +! +! +!------------------------------------------------------------------------------- +! +!* 4. SEDIMENTATION +! ------------- +IF (ALLOCATED(XQTMIN)) DEALLOCATE(XQTMIN) +IF (ALLOCATED(XRTMIN_ELEC)) DEALLOCATE(XRTMIN_ELEC) +! +IF (KRR == 6) THEN + ALLOCATE( XQTMIN(6) ) + ALLOCATE( XRTMIN_ELEC(6) ) +ELSE IF (KRR == 7) THEN + ALLOCATE( XQTMIN(7) ) + ALLOCATE( XRTMIN_ELEC(7) ) +END IF +! +XQTMIN(1) = 1.0E-17 ! +XQTMIN(2) = 1.0E-17 ! +XQTMIN(3) = 1.0E-17 ! ten particles per cubic meter that carried a charge +XQTMIN(4) = 1.0E-17 ! of one electron +XQTMIN(5) = 1.0E-17 ! +XQTMIN(6) = 1.0E-17 ! +IF (KRR == 7) XQTMIN(7) = 1.0E-17 ! +! +XRTMIN_ELEC(1) = 1.0E-6 +XRTMIN_ELEC(2) = 1.0E-6 +XRTMIN_ELEC(3) = 1.0E-6 +XRTMIN_ELEC(4) = 1.0E-6 +XRTMIN_ELEC(5) = 1.0E-6 +XRTMIN_ELEC(6) = 1.0E-6 +IF (KRR == 7) XRTMIN_ELEC(7) = 1.0E-6 +! +XLBDAR_MAXE = 2.E3 ! Less than 10000 particles in cube meter of cloud. +XLBDAS_MAXE = 2.E3 ! Less than 10000 particles in cube meter of cloud. +XLBDAG_MAXE = 2.E3 ! +XLBDAH_MAXE = 2.E3 ! +! +! Rain +! +XCEXVT = 0.4 +XEXQSEDR = (XCXR - XFR - XDR) / (XCXR - XBR) +XFQSEDR = XCR * (XCCR**(1 - XEXQSEDR)) * MOMG(XALPHAR,XNUR,XDR+XFR) * & + ((XAR * MOMG(XALPHAR,XNUR,XBR))**(-XEXQSEDR)) * (PRHO00)**XCEXVT +! +! Ice +! +XEXQSEDI = (XDI + XFI) / XBI +XFQSEDI = XC_I * MOMG(XALPHAI,XNUI,XDI+XFI) * (PRHO00**XCEXVT) * & + (XAI * MOMG(XALPHAI,XNUI,XBI))**(-XEXQSEDI) +! +! Snow +! +XEXQSEDS = (XCXS - XFS - XDS) / (XCXS - XBS) +XFQSEDS = XCS * (XCCS**(1 - XEXQSEDS)) * MOMG(XALPHAS,XNUS,XDS+XFS) * & + ((XAS * MOMG(XALPHAS,XNUS,XBS))**(-XEXQSEDS)) * (PRHO00)**XCEXVT +! +! Graupeln +! +XEXQSEDG = (XCXG - XFG - XDG) / (XCXG - XBG) +XFQSEDG = XCG * (XCCG**(1 - XEXQSEDG)) * MOMG(XALPHAG,XNUG,XDG+XFG) * & + ((XAG * MOMG(XALPHAG,XNUG,XBG))**(-XEXQSEDG)) * (PRHO00)**XCEXVT +! +! Hail +! +XEXQSEDH = (XCXH - XFH - XDH) / (XCXH - XBH) +XFQSEDH = XCH * (XCCH**(1 - XEXQSEDH)) * MOMG(XALPHAH,XNUH,XDH+XFH) * & + ((XAH * MOMG(XALPHAH,XNUH,XBH))**(-XEXQSEDH)) * (PRHO00)**XCEXVT +! +! +!------------------------------------------------------------------------------- +! +!* 5. EVAPORATION OF RAINDROPS +! ------------------------ +! +XQREVAV1 = (2. / XPI) * MOMG(XALPHAR,XNUR,XFR) / MOMG(XALPHAR,XNUR,2.) +XQREVAV2 = (XPI / XAR) * (MOMG(XALPHAR,XNUR,2.) / MOMG(XALPHAR,XNUR,XBR)) * & + (XCXR - 2.) / (XCXR - XBR) +! +! +!------------------------------------------------------------------------------- +! +!* 6. RIMING OF CLOUD DROPLETS ON SNOW +! -------------------------------- +! +XEXQSRIMCG = XCXS - XFS +XQSRIMCG = XCCS * MOMG(XALPHAS,XNUS,XFS) +! +! The array containing the tabulated function M(fs,D_cs^lim)/M(fs) +! is implemented in ini_rain_ice.f90 +! +! +!------------------------------------------------------------------------------- +! +!* 7. CONTACT FREEZING BETWEEN RAINDROPS AND PRISTINE ICE +! --------------------------------------------------- +! +XEXQRCFRIG = XCXR - XDR - XFR - 2.0 +XQRCFRIG = (XPI / 4.0) * XCR * XCCR * MOMG(XALPHAR,XNUR,XDR+XFR+2.) * & + PRHO00**XCEXVT +! +! +!------------------------------------------------------------------------------- +! +!* 8. INITIALIZATIONS FOR THE NON INDUCTIVE PROCESSES +! ----------------------------------------------- +! +! arrays allocation for NI charging rate +! +ALLOCATE( XNI_SDRYG(IIU, IJU, IKU) ) +ALLOCATE( XNI_IDRYG(IIU, IJU, IKU) ) +ALLOCATE( XNI_IAGGS(IIU, IJU, IKU) ) +ALLOCATE( XIND_RATE(IIU, IJU, IKU) ) +ALLOCATE( XEW(IIU, IJU, IKU) ) +XEW(:,:,:) = 0. +! +SELECT CASE(HGETSVM(NSV_ELECEND)) + CASE ('READ') + CALL IO_Field_read(TPINIFILE,'NI_IAGGS',XNI_IAGGS) + CALL IO_Field_read(TPINIFILE,'NI_IDRYG',XNI_IDRYG) + CALL IO_Field_read(TPINIFILE,'NI_SDRYG',XNI_SDRYG) + CALL IO_Field_read(TPINIFILE,'INDUC_CG',XIND_RATE) + CASE ('INIT') + XNI_IAGGS(:,:,:) = 0. + XNI_IDRYG(:,:,:) = 0. + XNI_SDRYG(:,:,:) = 0. + XIND_RATE(:,:,:) = 0. +END SELECT + +! +!* 8.1 Gardiner et al. (1985) parameterization +! +IF (CNI_CHARGING == 'GARDI') THEN + XLWCC = 0.1 ! g.m^-3 +END IF +! +! +!* 8.2 Saunders et al. (1991) and +!* Saunders and Peck (1998) parameterizations +! +IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'SAP98' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. & + CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN +! +! ice particle = the smallest particle (I-S and I-G collisions) + XIMP = 3.76 ! for positive charge + XINP = 2.5 + XIKP = 4.92E13 + XIKP_TAK = 6.1E12 ! for Takahashi + XIMN = 2.54 ! for negative charge + XINN = 2.8 + XIKN = 5.25E8 + XIKN_TAK = 4.3E7 ! for Takahashi +! +! snow = the smallest particle (S-G collisions) + XSMP = 0.44 ! for positive charge + XSNP = 2.5 + XSKP = 52.8 + XSKP_TAK = 6.5 ! for Takahashi + XSMN = 0.5 ! for negative charge + XSNN = 2.8 + XSKN = 24. + XSKN_TAK = 2.0 ! for Takahashi +! + XFQIAGGSP = XIKP * XCS**(1. + XINP) * & + MOMG(XALPHAS, XNUS, 2.+XDS*(1.+XINP)) * & + MOMG(XALPHAI, XNUI, XIMP) + XFQIAGGSN = XIKN * XCS**(1. + XINN) * & + MOMG(XALPHAS, XNUS, 2.+XDS*(1.+XINN)) * & + MOMG(XALPHAI, XNUI, XIMN) +! + XFQIDRYGBSP = XIKP * XCG**(1. + XINP) * & + MOMG(XALPHAG, XNUG, 2.+XDG*(1.+XINP)) * & + MOMG(XALPHAI, XNUI, XIMP) + XFQIDRYGBSN = XIKN * XCG**(1. + XINN) * & + MOMG(XALPHAG, XNUG, 2.+XDG*(1.+XINN)) * & + MOMG(XALPHAI, XNUI, XIMN) +! + XFQIAGGSP_TAK = XFQIAGGSP * XIKP_TAK / XIKP + XFQIAGGSN_TAK = XFQIAGGSN * XIKN_TAK / XIKN + XFQIDRYGBSP_TAK = XFQIDRYGBSP * XIKP_TAK / XIKP + XFQIDRYGBSN_TAK = XFQIDRYGBSN * XIKN_TAK / XIKN +! + XAIGAMMABI = XAI * MOMG(XALPHAI, XNUI, XBI) +! + XLBQSDRYGB1SP = MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAS, XNUS, XSMP) + XLBQSDRYGB1SN = MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAS, XNUS, XSMN) + XLBQSDRYGB2SP = 2. * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAS, XNUS, 1.+XSMP) + XLBQSDRYGB2SN = 2. * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAS, XNUS, 1.+XSMN) + XLBQSDRYGB3SP = MOMG(XALPHAS, XNUS, 2.+XSMP) + XLBQSDRYGB3SN = MOMG(XALPHAS, XNUS, 2.+XSMN) +ENDIF +! +IF (CNI_CHARGING == 'SAP98' .OR. CNI_CHARGING == 'TERAR' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2') THEN + XVSCOEF = XCS * MOMG(XALPHAS, XNUS, XBS+XDS) / MOMG(XALPHAS, XNUS, XBS) + XVGCOEF = XCG * MOMG(XALPHAG, XNUG, XBG+XDG) / MOMG(XALPHAG, XNUG, XBG) +END IF +! +! +!* 8.3 Takahashi (1978) parameterization +! +IF (CNI_CHARGING == 'TAKAH') THEN +! +! last column and line are duplicated for interpolation + NIND_TEMP = 31 + NIND_LWC = 28 + IF( .NOT.ALLOCATED(XMANSELL)) ALLOCATE( XMANSELL(NIND_LWC+1,NIND_TEMP+1)) + ALLOCATE( ZMANSELL1(29,16) ) + ALLOCATE( ZMANSELL2(29,16) ) + ZMANSELL1 = RESHAPE( & +(/ 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 1.65, 3.3 , & + 4.95, 13.2 , 19.8 , 26.4 , 31.02, 33.0 , 42.9 , 46.2 , 49.5 , & + 52.8 , 49.5 , 39.6 , 36.3 , 32.34, 32.01, 32.01, 31.68, 31.35, 31.35, 31.35,& + 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.33, 2.64, 4.95, 6.6 , & + 6.93, 15.18, 23.1 , 29.7 , 33.0 , 36.3 , 49.5 , 52.8 , 52.8 , & + 52.8 , 49.5 , 36.3 , 33.0 , 32.34, 32.01, 32.01, 31.35, 31.35, 31.35, 31.35,& + 0.0 , 0.0 , 0.0 , 0.0 , 0.33, 3.3 , 4.95, 6.6 , 7.59, & + 9.24, 17.16, 26.4 , 32.34, 36.3 , 39.6 , 52.8 , 56.1 , 56.1 , & + 56.1 , 42.9 , 33.0 , 32.01, 32.01, 31.68, 31.68, 31.02, 31.02, 30.36, 30.36,& + 0.0 , 0.0 , 0.0 , 0.33, 2.97, 5.61, 7.26, 8.25, 9.9 , & + 10.56, 19.8 , 28.71, 36.3 , 39.6 , 46.2 , 56.1 , 59.4 , 59.4 , & + 59.4 , 42.9 , 31.35, 31.35, 31.68, 31.35, 30.69, 30.36, 31.02, 30.03, 30.03,& + 0.0 , 0.0 , 0.33, 2.64, 5.61, 7.59, 9.24, 9.9 , 11.22, & + 11.88, 22.44, 31.35, 39.6 , 47.2 , 52.8 , 59.4 , 62.7 , 62.7 , & + 52.8 , 33.0 , 30.69, 30.69, 30.36, 30.69, 30.36, 30.03, 30.36, 30.03, 30.03,& + 0.0 , 0.0 , 0.33, 4.29, 7.26, 8.91, 10.23, 11.55, 12.21, & + 13.2 , 24.09, 33.0 , 39.6 , 49.5 , 56.1 , 56.1 , 56.1 , 66.0 , & + 49.5 , 31.35, 30.03, 29.7 , 29.37, 29.37, 29.37, 29.04, 30.03, 29.04, 29.04,& + 0.0 , 0.0 , 2.31, 6.6 , 8.91, 9.9 , 11.22, 13.2 , 13.2 , & + 14.85, 25.08, 36.3 , 42.9 , 49.5 , 52.8 , 46.2 , 42.9 , 52.8 , & + 42.9 , 28.05, 28.05, 29.71, 28.38, 28.71, 28.71, 28.71, 29.37, 28.71, 28.71,& + 0.0 , 0.0 , 4.29, 7.59, 9.9 , 10.23, 11.22, 14.85, 14.85, & + 16.5 , 26.4 , 36.3 , 42.9 , 42.9 , 46.2 , 42.9 , 39.6 , 46.2 , & + 33.0 , 24.75, 26.4 , 27.39, 27.39, 27.72, 28.05, 28.38, 29.04, 28.05, 28.05,& + 0.0 , 0.0 , 6.27, 9.24, 10.56, 12.21, 11.88, 15.18, 15.84, & + 16.5 , 27.39, 33.0 , 39.6 , 39.6 , 39.6 , 36.3 , 33.0 , 39.6 , & + 19.8 , 16.5 , 23.1 , 25.74, 26.73, 27.06, 27.39, 27.39, 28.38, 27.39, 27.39,& + 0.0 , 0.66, 6.93, 9.57, 11.22, 12.87, 12.54, 15.51, 16.5 , & + 18.15, 27.39, 31.02, 36.3 , 33.0 , 29.7 , 23.1 , 19.8 , 26.4 , & + 9.9 , 0.99, 20.46, 23.43, 25.41, 26.4 , 27.06, 27.06, 27.39, 27.06, 27.06,& + 0.0 , 2.64, 7.59, 10.23, 11.88, 13.53, 13.2 , 15.84, 16.5 , & + 19.14, 27.06, 28.71, 33.0 , 26.4 , 21.45, 16.5 , 9.9 , 3.3 , & + 0.0 , -6.6 , 18.15, 21.45, 23.76, 25.08, 26.07, 26.73, 26.73, 26.73, 26.73,& + 0.0 , 3.3 , 8.25, 10.89, 11.88, 13.53, 13.86, 15.84, 16.83, & + 18.81, 26.73, 27.39, 28.71, 21.45, 16.5 , 3.3 , 0.99, -0.99, & + -4.95,-16.5 , 16.5 , 19.8 , 22.77, 24.09, 25.08, 25.41, 25.74, 26.4 , 26.4 ,& + 0.0 , 4.62, 8.91, 11.22, 12.21, 13.53, 14.85, 16.17, 16.83, & + 18.81, 25.74, 26.4 , 26.4 , 16.5 , 2.97, 0.0 , -1.98, -9.9 , & + -11.55,-19.8 , 3.3 , 18.15, 20.13, 23.1 , 23.76, 24.42, 25.41, 25.41, 25.41,& + 0.0 , 5.8 , 9.24, 11.22, 12.54, 13.86, 15.18, 15.84, 16.83, & + 18.48, 24.42, 23.43, 22.44, 3.3 , 0.0 , -1.98, -4.29, -9.9 , & + -13.2 ,-26.4 , 0.0 , 16.83, 19.14, 21.45, 23.1 , 23.76, 24.42, 24.75, 24.75,& + 0.0 , 5.94, 9.57, 11.22, 12.54, 13.86, 14.85, 15.84, 16.5 , & + 17.82, 23.1 , 20.79, 19.47, 0.33, -1.32, -3.3 , -6.6 , -9.9 , & + -14.85,-33.0 , -0.33, 14.85, 18.48, 19.8 , 21.78, 23.1 , 23.76, 24.42, 24.42,& + 0.0 , 5.94, 9.57, 11.22, 12.54, 13.53, 14.85, 15.51, 16.5 , & + 16.83, 21.45, 17.82, 9.9 , -0.33, -2.31, -3.3 , -8.25, -9.99, & + -14.85,-33.0 , -1.32, 4.95, 17.49, 19.47, 20.79, 22.44, 23.43, 24.09, 24.09/)& + ,(/29, 16/)) + ZMANSELL2 = RESHAPE( & +(/ 0.0 , 6.27, 9.57, 10.89, 12.21, 13.53, 14.52, 15.18, 15.84, & + 16.17, 19.47, 9.9 , 0.0 , -0.99, -2.97, -4.95, -9.99, -9.99, & + -14.85,-29.7 , -2.97, 3.3 , 16.83, 19.14, 19.47, 21.12, 22.44, 23.43, 23.43,& + 0.0 , 5.94, 9.57, 10.89, 12.21, 13.2 , 14.19, 14.85, 15.18, & + 15.51, 17.16, 3.3 , -0.33, -1.65, -3.3 , -6.6 , -9.99, -9.99, & + -13.2 ,-28.1 , -3.3 , 2.64, 16.5 , 17.82, 19.14, 20.13, 21.45, 22.77, 22.77,& + 0.0 , 5.61, 8.91, 10.89, 11.88, 13.2 , 13.86, 14.52, 14.85, & + 14.85, 9.9 , 1.65, -0.99, -1.98, -3.3 , -6.6 , -9.99, -9.99, & + -13.2 ,-26.4 , -3.3 , 1.65, 13.2 , 17.49, 18.81, 19.8 , 20.79, 22.11, 22.11,& + 0.0 , 5.28, 8.58, 10.56, 11.55, 12.54, 13.2 , 13.86, 14.19, & + 13.86, 6.6 , 0.0 , -1.32, -2.31, -3.3 , -6.6 , -9.99, -9.99, & + -13.2 ,-24.8 , -3.3 , 1.32, 6.6 , 17.16, 18.48, 19.47, 20.46, 21.45, 21.45,& + 0.0 , 4.95, 8.25, 9.9 , 11.22, 11.88, 12.54, 12.87, 13.2 , & + 13.2 , 3.3 , -0.66, -1.98, -2.64, -3.3 , -6.6 , -9.9 , -9.9 , & + -13.2 ,-23.1 , -3.3 , 0.66, 4.95, 16.5 , 17.82, 18.81, 19.8 , 20.46, 20.46,& + 0.0 , 4.29, 7.59, 9.57, 10.56, 11.55, 11.88, 11.88, 12.21, & + 11.88, 2.64, -0.66, -2.31, -2.64, -3.3 , -6.6 , -9.9 , -9.9 , & + -13.2 ,-21.5 , -3.3 , 0.0 , 4.29, 14.85, 17.16, 18.48, 19.47, 20.13, 20.13,& + 0.0 , 3.96, 6.93, 8.91, 9.9 , 10.89, 10.89, 10.89, 10.89, & + 10.56, 0.99, -0.66, -2.31, -2.64, -3.3 , -6.6 , -9.9 , -9.99, & + -13.2 ,-19.8 , -6.6 , 0.0 , 3.3 , 13.2 , 16.83, 18.15, 19.47, 19.8 , 19.8 ,& + 0.0 , 2.97, 6.27, 8.25, 9.24, 9.9 , 10.23, 10.23, 9.9 , & + 9.57, 0.0 , -0.99, -2.31, -2.64, -3.3 , -6.6 , -9.9 , -9.99, & + -11.55,-18.2 , -9.9 , 0.0 , 3.3 , 11.55, 16.5 , 17.82, 18.81, 19.8 , 19.8 ,& + 0.0 , 0.66, 5.61, 7.59, 8.91, 9.24, 9.24, 9.24, 8.91, & + 8.58, 0.0 , -0.99, -1.98, -2.64, -3.3 , -6.6 , -9.9 , -9.9 , & + -11.55,-17.5 , -6.6 , 0.0 , 2.97, 8.25, 16.5 , 17.16, 18.48, 19.47, 19.47,& + 0.0 , 0.0 , 4.29, 6.6 , 7.59, 8.25, 8.25, 7.59, 7.92, & + 7.59, -0.33, -1.32, -1.98, -2.64, -3.3 , -4.95, -9.9 , -9.9 , & + -9.9 ,-16.5 , -6.6 , 0.0 , 2.97, 6.6 , 14.85, 16.83, 18.15, 19.47, 19.47,& + 0.0 , 0.0 , 2.64, 5.28, 6.93, 7.26, 7.59, 7.26, 6.93, & + 6.6 , -0.66, -1.32, -1.98, -2.64, -3.3 , -4.29, -8.25, -9.9 , & + -9.9 ,-16.5 , -6.6 , 0.0 , 2.64, 6.6 , 14.85, 16.5 , 17.82, 19.14, 19.14,& + 0.0 , 0.0 , 0.33, 3.63, 5.61, 6.6 , 6.6 , 6.6 , 4.95, & + 3.63, -0.66, -1.32, -1.98, -2.64, -3.3 , -3.3 , -6.6 , -8.25, & + -8.25,-16.5 , -6.6 , 0.0 , 2.64, 6.6 , 13.2 , 16.5 , 17.49, 18.81, 18.81,& + 0.0 , 0.0 , 0.0 , 0.99, 3.3 , 4.29, 4.29, 4.62, 3.3 , & + 2.97, -0.66, -1.32, -1.98, -2.64, -2.97, -2.97, -3.3 , -4.95, & + -4.95,-15.8 , -4.95, 0.0 , 2.31, 6.6 , 11.55, 16.5 , 17.49, 18.15, 18.15,& + 0.0 , 0.0 , 0.0 , 0.0 , 0.99, 3.3 , 2.64, 2.31, 2.31, & + 2.31, -0.66, -1.32, -1.98, -2.31, -2.97, -2.64, -2.97, -3.63, & + -4.95, -9.99, -4.95, 0.0 , 2.31, 6.6 , 9.9 , 14.85, 17.16, 18.15, 18.15,& + 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.66, 0.99, 1.65, 1.98, & + 1.65, -0.66, -1.32, -1.65, -2.31, -2.64, -2.64, -2.97, -2.97, & + -3.3 , -9.99, -3.3 , 0.0 , 2.31, 6.6 , 9.9 , 14.85, 17.16, 18.15, 18.15,& + 0.0 , 0.0 , 0.0 , 0.0 , 0.0 , 0.66, 0.99, 1.65, 1.98, & + 1.65, -0.66, -1.32, -1.65, -2.31, -2.64, -2.64, -2.97, -2.97, & + -3.3 , -9.99, -3.3 , 0.0 , 2.31, 6.6 , 9.9 , 14.85, 17.16, 18.15, 18.15/)& + ,(/29, 16/)) + XMANSELL(:, 1:16) = ZMANSELL1(:,:) + XMANSELL(:,17:32) = ZMANSELL2(:,:) + DEALLOCATE(ZMANSELL1) + DEALLOCATE(ZMANSELL2) +! + XMANSELL(:,:) = XMANSELL(:,:) * 1.E-15 ! in C +END IF +! +! +!* 8.4 Saunders et al. (1991) parameterization +! Idem for Brooks et al. (1997), but with EW = ZRAR/3. +! +! +IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2') THEN +! + NIND_TEMP = 31 + NIND_LWC = 28 +! + IF( .NOT.ALLOCATED(XSAUNDER)) ALLOCATE(XSAUNDER(NIND_LWC+1,NIND_TEMP+1)) + ALLOCATE(ZT(NIND_TEMP+1)) ! Kelvin + ALLOCATE(ZLWCC(NIND_TEMP+1)) + DO JTEMP = 1, NIND_TEMP+1 + ZT(JTEMP)=1.0-REAL(JTEMP)+XTT + END DO + ZLWCC(:) = MIN( MAX( -0.49 + 6.64E-2*(XTT-ZT(:)),0.22 ),1.1 ) ! (g m^-3) + ALLOCATE(ZEW(NIND_LWC+1)) +! +! LWC index (0.01 g.m^-3 --> 10 g.m^-3) +! 0.01 to 0.09 every 0.01 (9 values) +! 0.10 to 0.90 every 0.10 (9 values) +! 1.00 to 10.0 every 1.00 (10 values) + DO JLWC = 1, 9 + ZEW(JLWC)=0.01*REAL(JLWC) + END DO + DO JLWC = 10, 18 + ZEW(JLWC)=0.1 + 0.1*REAL(JLWC-10) + END DO + DO JLWC = 19, NIND_LWC+1 + ZEW(JLWC)=1.0 + REAL(JLWC-19) + END DO +! +! + XSAUNDER(:,:) = 0.0 + DO JTEMP = 1, NIND_TEMP+1 + DO JLWC = 1, NIND_LWC+1 +! +! region S4 : positive + IF (ZT(JTEMP) <= (XTT-7.35) .AND. ZT(JTEMP) > (XTT-23.9458) .AND. & + ZEW(JLWC) > ZLWCC(JTEMP)) THEN + XSAUNDER(JLWC,JTEMP) = MAX( 0., & + 20.22*ZEW(JLWC)+1.36*(ZT(JTEMP)-XTT)+10.05 ) + ENDIF +! +! region S1 : positive --> linear interpolation + IF (ZT(JTEMP) > (XTT-7.35) .AND. ZT(JTEMP) < XTT .AND. & + ZEW(JLWC) > ZLWCC(JTEMP)) THEN + XSAUNDER(JLWC,JTEMP) = MAX( 0.,-(2.75*ZEW(JLWC)+0.007)*(ZT(JTEMP)-XTT) ) + ENDIF +! +! region S8 : positive + IF (ZT(JTEMP) <= (XTT-23.9458) .AND. ZT(JTEMP) > (XTT-40.0) .AND. & + ZEW(JLWC) > ZLWCC(JTEMP)) THEN + XSAUNDER(JLWC,JTEMP) = MAX( 0.,20.22*ZEW(JLWC)-22.26 ) + ENDIF +! +! region S7 : negative + IF (ZT(JTEMP) <= (XTT-7.35) .AND. ZT(JTEMP) > (XTT-40.0) .AND. & + ZEW(JLWC) >= 0.104149 .AND. ZEW(JLWC) < ZLWCC(JTEMP)) THEN + XSAUNDER(JLWC,JTEMP) = MIN( 0.,3.02-31.76*ZEW(JLWC)+26.53*ZEW(JLWC)**2 ) + ENDIF + END DO + END DO +END IF +! +! SAUN1 doesn't take into account marginal positive and negative regions at +! low LWC +! +IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'BSMP1') THEN + DO JTEMP = 1, NIND_TEMP+1 + DO JLWC = 1, NIND_LWC+1 +! +! region S1 : negative --> linear interpolation + IF (ZT(JTEMP) > (XTT-7.35) .AND. ZT(JTEMP) < XTT .AND. & + ZEW(JLWC) < ZLWCC(JTEMP) .AND. ZEW(JLWC) >= 0.104149) THEN + XSAUNDER(JLWC,JTEMP) = MIN( 0., & + (-0.41+4.32*ZEW(JLWC)-3.61*ZEW(JLWC)**2)*(ZT(JTEMP)-XTT) ) + ENDIF + END DO + END DO +! + XSAUNDER(:,:) = XSAUNDER(:,:) * 1.E-15 ! in C +! +END IF +! +! SAUN2 takes into account marginal positive and negative regions at low LWC +! +IF (CNI_CHARGING == 'SAUN2' .OR. CNI_CHARGING == 'BSMP2') THEN + DO JTEMP = 1, NIND_TEMP+1 + DO JLWC = 1, NIND_LWC+1 +! +! region S2 : negative + IF (ZT(JTEMP) <= (XTT-7.35) .AND. ZT(JTEMP) > (XTT-16.0) .AND. & + ZEW(JLWC) >= 0.026 .AND. ZEW(JLWC) < 0.14) THEN + XSAUNDER(JLWC,JTEMP) = MIN( 0.,-314.4*ZEW(JLWC) + 7.92 ) + ENDIF +! +! region S3 : negative + IF (ZT(JTEMP) <= (XTT-7.35) .AND. ZT(JTEMP) > (XTT-16.0) .AND. & + ZEW(JLWC) >= 0.14 .AND. ZEW(JLWC) < 0.22) THEN + XSAUNDER(JLWC,JTEMP) = MIN( 0.,419.4 * ZEW(JLWC) - 92.64 ) + ENDIF +! +! region S5 : positive + IF (ZT(JTEMP) < (XTT-20.0) .AND. ZT(JTEMP) > (XTT-40.0) .AND. & + ZEW(JLWC) >= 0.063034 .AND. ZEW(JLWC) < 0.12) THEN + XSAUNDER(JLWC,JTEMP) = MAX( 0.,2041.76*ZEW(JLWC) - 128.7 ) + ENDIF +! +! region S6 : positive + IF (ZT(JTEMP) < (XTT-20.0) .AND. ZT(JTEMP) > (XTT-40.0) .AND. & + ZEW(JLWC) >= 0.12 .AND. ZEW(JLWC) < 0.1596) THEN + XSAUNDER(JLWC,JTEMP) = MAX( 0.,-2900.22*ZEW(JLWC) + 462.91 ) + ENDIF +! +! region S1 : negative --> linear interpolation of S3 + IF (ZT(JTEMP) > (XTT-7.35) .AND. ZT(JTEMP) < XTT .AND. & + ZEW(JLWC) >= 0.14 .AND. ZEW(JLWC) < ZLWCC(JTEMP)) THEN + XSAUNDER(JLWC,JTEMP) = MIN( 0.,(-57.06*ZEW(JLWC)+12.6)*(ZT(JTEMP)-XTT) ) + ENDIF +! +! region S1 : negative --> linear interpolation of S2 + IF (ZT(JTEMP) > (XTT-7.35) .AND. ZT(JTEMP) < XTT .AND. & + ZEW(JLWC) >= 0.026 .AND. ZEW(JLWC) < 0.14) THEN + XSAUNDER(JLWC,JTEMP) = MIN( 0.,(42.8*ZEW(JLWC)-1.08)*(ZT(JTEMP)-XTT) ) + ENDIF + END DO + END DO +! + XSAUNDER(:,:) = XSAUNDER(:,:) * 1.E-15 ! in C +! +END IF +! +!* 8.5 Takahashi with EW or ZRAR (Tsenova and Mitzeva, 2009, 2011) +! here ZRAR = 9 * EW +! Temperature index (0C --> -30C) +! LWC index (0.01 g.m^-3 --> 10 g.m^-3) +! 0.01 to 0.09 every 0.01 (9 values) +! 0.10 to 0.90 every 0.10 (9 values) +! 1.00 to 10.0 every 1.00 (10 values) +! +IF (CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN +! + NIND_TEMP = 31 + NIND_LWC = 28 +! + IF( .NOT.ALLOCATED(XTAKA_TM)) ALLOCATE(XTAKA_TM(NIND_LWC+1,NIND_TEMP+1)) + ALLOCATE(ZT(NIND_TEMP+1)) ! Kelvin + ALLOCATE(ZEW(NIND_LWC+1)) + DO JTEMP = 1, NIND_TEMP+1 + ZT(JTEMP) = 1.0 - REAL(JTEMP) + XTT + END DO + + DO JLWC = 1, 9 + ZEW(JLWC) = 0.01 * REAL(JLWC) + END DO + DO JLWC = 10, 18 + ZEW(JLWC) = 0.1 + 0.1 * REAL(JLWC-10) + END DO + DO JLWC = 19, NIND_LWC+1 + ZEW(JLWC) = 1.0 + REAL(JLWC-19) + END DO +! + XTAKA_TM(:,:) = 0.0 + DO JTEMP = 1, NIND_TEMP+1 + DO JLWC = 1, NIND_LWC+1 +! +! Eq. 1: >0 + IF ( ZT(JTEMP) > (XTT - 10.) .AND. ZEW(JLWC) <= 1.6) THEN + XTAKA_TM(JLWC, JTEMP) = 146.981 * ZEW(JLWC) - 116.37 * ZEW(JLWC)**2 & + + 29.76 * ZEW(JLWC)**3 & + - 0.03 * (ZT(JTEMP) - XTT)**3 * ZEW(JLWC) & + - 2.58 * (ZT(JTEMP) - XTT) & + - 0.21 * (ZT(JTEMP) - XTT)**3 * ZEW(JLWC)**3 & + + 0.36 * (ZT(JTEMP) - XTT)**3 * ZEW(JLWC)**2 & + + 0.15 * (ZT(JTEMP) - XTT)**2 & + + 2.92 * (ZT(JTEMP) - XTT) * ZEW(JLWC)**3 & + - 4.22 * (ZT(JTEMP) - XTT) * ZEW(JLWC) - 8.506 + END IF +! +! Eq. 2: >0 + IF ( ZT(JTEMP) > (XTT - 10.) .AND. & + ZEW(JLWC) > 1.6 .AND. ZEW(JLWC) <= 8.) THEN + XTAKA_TM(JLWC, JTEMP) = 4.179 * (ZT(JTEMP) - XTT) & + - 0.005 * (ZT(JTEMP) - XTT)**2 * ZEW(JLWC)**2 & + + 0.916 * ZEW(JLWC)**2 & + - 1.333 * (ZT(JTEMP) - XTT) * ZEW(JLWC) & + - 7.465 * ZEW(JLWC) & + + 0.109 * (ZT(JTEMP) - XTT) * ZEW(JLWC)**2 & + + 0.001 * (ZT(JTEMP) - XTT)**2 * ZEW(JLWC)**3 & + - 0.035 * ZEW(JLWC)**3 + 50.84454 + END IF +! +! Eq. 8: > 0 + IF ( ZEW(JLWC) <= 0.4 .AND. & + ZT(JTEMP) <= (XTT - 10.) .AND. ZT(JTEMP) >= (XTT - 40.)) THEN + XTAKA_TM(JLWC, JTEMP) = - 3.3515 * (ZT(JTEMP) - XTT) & + + 95.957 * (ZT(JTEMP) - XTT) * ZEW(JLWC)**2 & + + 511.83 * ZEW(JLWC) & + + 17.448 * (ZT(JTEMP) - XTT)**2 * ZEW(JLWC)**3 & + - 0.0007 * (ZT(JTEMP) - XTT)**3 & + + 20.570 * (ZT(JTEMP) - XTT) * ZEW(JLWC) & + + 0.1656 * (ZT(JTEMP) - XTT)**2 * ZEW(JLWC) & + + 0.4954 * (ZT(JTEMP) - XTT)**3 * ZEW(JLWC)**3 & + - 0.0975 * (ZT(JTEMP) - XTT)**3 * ZEW(JLWC)**2 & + + 67.457 * (ZT(JTEMP) - XTT) * ZEW(JLWC)**3 & + - 0.1066 * (ZT(JTEMP) - XTT)**2 - 24.5715 + END IF +! +! Eq. 9: < 0 + IF ( ZT(JTEMP) <= (XTT - 10.) .AND. ZT(JTEMP) >= (XTT - 40.) .AND. & + ZEW(JLWC) > 0.4 .AND. ZEW(JLWC) <= 3.2) THEN + XTAKA_TM(JLWC, JTEMP) = - 1.5676 * (ZT(JTEMP) - XTT) * ZEW(JLWC) & + + 0.2484 * (ZT(JTEMP) - XTT) * ZEW(JLWC)**3 & + + 0.0112 * (ZT(JTEMP) - XTT)**3 & + + 19.199 * (ZT(JTEMP) - XTT) & + + 0.8051 * (ZT(JTEMP) - XTT)**2 & + - 83.4 * ZEW(JLWC) & + + 15.4 * ZEW(JLWC)**2 & + + 5.97 * ZEW(JLWC)**3 + 167.9278 + END IF +! +! Eq. 10: > 0 + IF ( ZT(JTEMP) <= (XTT - 10.) .AND. ZT(JTEMP) >= (XTT - 40.) .AND. & + ZEW(JLWC) > 3.2 .AND. ZEW(JLWC) <= 8. ) THEN + XTAKA_TM(JLWC, JTEMP) = 4.2127 * (ZT(JTEMP) - XTT) & + - 0.8311 * (ZT(JTEMP) - XTT) * ZEW(JLWC) & + + 0.0670 * (ZT(JTEMP) - XTT) * ZEW(JLWC) **2 & + + 0.0042 * (ZT(JTEMP) - XTT)**2 * ZEW(JLWC) & + + 40.9642 + END IF + END DO + END DO +! + XTAKA_TM(:,:) = XTAKA_TM(:,:) * 1.E-15 ! in C +! +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 9. NON_INDUCTIVE PROCESS: AGGREGATION OF ICE ON SNOW +! ------------------------------------------------- +! +!* 9.1 Helsdon and Farley (1987) parameterization +! +XFQIAGGSBH = 2.E-14 ! (C.) Constant for ice-snow charging process +! +! +!* 9.2 Gardiner et al. (1985) parameterization +! +XFQIAGGSBG = (XPI / 4.0) * XCCS * XCS**4. * PRHO00**(4. * XCEXVT) * & + MOMG(XALPHAS,XNUS,2.+4.*XDS) * 7.3 * & + MOMG(XALPHAI,XNUI,4.) +! +! +!* 9.3 Saunders et al.(1991) parameterization +! +XFQIAGGSBS = (XPI / 4.0) * XCCS +! +! +!* 9.4 Takahashi (1978) parameterization +! +IF (CNI_CHARGING == 'TAKAH') THEN + XFQIAGGSBT1 = (XPI / 4.0) * XCCS * XCS + XFQIAGGSBT2 = 10 * MOMG(XALPHAS,XNUS,2.+XDS) + XFQIAGGSBT3 = 5. * XCS * MOMG(XALPHAI,XNUI,2.) * & + MOMG(XALPHAS,XNUS,2.+2*XDS) / ((1.E-4)**2 * 8. * & + (XAI * MOMG(XALPHAI,XNUI,XBI))**(2 / XBI)) +END IF +! +! +!------------------------------------------------------------------------------- +! +!* 10. ACCRETION OF RAINDROPS ON SNOW +! ------------------------------ +! +IF( .NOT.ALLOCATED(XKER_Q_RACCSS)) ALLOCATE( XKER_Q_RACCSS(NACCLBDAS,NACCLBDAR) ) +IF( .NOT.ALLOCATED(XKER_Q_RACCS)) ALLOCATE( XKER_Q_RACCS (NACCLBDAS,NACCLBDAR) ) +IF( .NOT.ALLOCATED(XKER_Q_SACCRG)) ALLOCATE( XKER_Q_SACCRG(NACCLBDAR,NACCLBDAS) ) +! +XFQRACCS = (XPI / 4.0) * XCCS * XCCR * (PRHO00**XCEXVT) +! +XLBQRACCS1 = MOMG(XALPHAR,XNUR,2.+XFR) +XLBQRACCS2 = 2. * MOMG(XALPHAR,XNUR,1.+XFR) * MOMG(XALPHAS,XNUS,1.) +XLBQRACCS3 = MOMG(XALPHAR,XNUR,XFR) * MOMG(XALPHAS,XNUS,2.) +! +XLBQSACCRG1 = MOMG(XALPHAS,XNUS,2.+XFS) +XLBQSACCRG2 = 2. * MOMG(XALPHAS,XNUS,1.+XFS) * MOMG(XALPHAR,XNUR,1.) +XLBQSACCRG3 = MOMG(XALPHAS,XNUS,XFS) * MOMG(XALPHAR,XNUR,2.) +! +ZESR = 1.0 +! +CALL RRCOLSS (KND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XFR, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + PFDINFTY, XKER_Q_RACCSS, XAG, XBS, XAS ) +! +CALL RZCOLX (KND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XFR, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + PFDINFTY, XKER_Q_RACCS ) +! +CALL RSCOLRG (KND, XALPHAS, XNUS, XALPHAR, XNUR, & + ZESR, XFS, XCS, XDS, XCR, XDR, & + XACCLBDAS_MAX, XACCLBDAR_MAX, XACCLBDAS_MIN, XACCLBDAR_MIN, & + PFDINFTY, XKER_Q_SACCRG, XAG, XBS, XAS ) +! +!------------------------------------------------------------------------------- +! +!* 11. DRY GROWTH OF GRAUPELN BY CAPTURE OF SNOW OR ICE +! ------------------------------------------------ +! +!* 11.1 charge transfer associated to mass transfer +! +IF( .NOT.ALLOCATED(XKER_Q_SDRYG)) ALLOCATE( XKER_Q_SDRYG(NDRYLBDAG,NDRYLBDAS) ) +! +XFQSDRYG = (XPI / 4.0) * XCCS * XCCG * (PRHO00**XCEXVT) +! +XLBQSDRYG1 = MOMG(XALPHAS,XNUS,2.+XFS) +XLBQSDRYG2 = 2. * MOMG(XALPHAS,XNUS,1.+XFS) * MOMG(XALPHAG,XNUG,1.) +XLBQSDRYG3 = MOMG(XALPHAS,XNUS,XFS) * MOMG(XALPHAG,XNUG,2.) +! +ZEGS = 1. ! also initialized in ini_rain_ice_elec +! +CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & + ZEGS, XFS, XCG, XDG, XCS, XDS, & + XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & + PFDINFTY, XKER_Q_SDRYG ) +! +! +!* 11.2 NI process: Heldson et Farley (1987) parameterization +! +IF (CNI_CHARGING == 'HELFA') THEN + XHIDRYG = 2.E-15 ! Charge exchanged per collision between ice and graupel + XHSDRYG = 2.E-14 +! + XFQSDRYGBH = (XPI / 4.0) * XCCG * XCCS * (PRHO00**(XCEXVT)) * XHSDRYG +! + XLBQSDRYGB4H = MOMG(XALPHAS,XNUS,2.) + XLBQSDRYGB5H = 2. * MOMG(XALPHAS,XNUS,1.) * MOMG(XALPHAG,XNUG,1.) + XLBQSDRYGB6H = MOMG(XALPHAG,XNUG,2.) +! + IF( .NOT.ALLOCATED(XKER_Q_SDRYGB)) ALLOCATE( XKER_Q_SDRYGB(NDRYLBDAG,NDRYLBDAS) ) + CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & + ZEGS, 0., XCG, XDG, XCS, XDS, & + XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & + PFDINFTY, XKER_Q_SDRYGB ) +! Delta vqb1_sg +ENDIF +! +! +!* 11.3 NI process: Gardiner et al. (1985) parameterization +! +IF (CNI_CHARGING == 'GARDI') THEN + XFQIDRYGBG = (XPI / 4.0) * XCCG * (PRHO00**(4. * XCEXVT)) * XCG**4. * & + 7.3 + XLBQIDRYGBG = MOMG(XALPHAI,XNUI,4.) * MOMG(XALPHAG,XNUG,2.+4.*XDG) +! + XFQSDRYGBG = (XPI / 4.0) * XCCS * XCCG * (PRHO00**(4. * XCEXVT)) * & + 7.3 + XLBQSDRYGB4G = MOMG(XALPHAS,XNUS,4.) * MOMG(XALPHAG,XNUG,2.) + XLBQSDRYGB5G = 2. * MOMG(XALPHAS,XNUS,5.) * MOMG(XALPHAG,XNUG,1.) + XLBQSDRYGB6G = MOMG(XALPHAS,XNUS,6.) +! + IF( .NOT.ALLOCATED(XKER_Q_SDRYGB)) ALLOCATE( XKER_Q_SDRYGB(NDRYLBDAG,NDRYLBDAS) ) + CALL VQZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & + ZEGS, 4., XCG, XDG, XCS, XDS, 4., & + XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & + PFDINFTY, XKER_Q_SDRYGB ) +END IF +! +! +!* 11.4 NI process: Saunders et al. (1991) and +!* Saunders and Peck (1998) parameterizations +! +IF (CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'SAP98' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. & + CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN + XFQIDRYGBS = (XPI / 4.0) * XCCG + XFQSDRYGBS = (XPI / 4.0) * XCCS * XCCG + XLBQSDRYGB1S = MOMG(XALPHAG,XNUG,2.) + XLBQSDRYGB2S = 2. * MOMG(XALPHAG,XNUG,1.) +! + IF( .NOT.ALLOCATED(XKER_Q_SDRYGB1)) ALLOCATE( XKER_Q_SDRYGB1(NDRYLBDAG,NDRYLBDAS) ) + IF( .NOT.ALLOCATED(XKER_Q_SDRYGB2)) ALLOCATE( XKER_Q_SDRYGB2(NDRYLBDAG,NDRYLBDAS) ) +! +! Positive charging region + CALL VQZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & + ZEGS, XSMP, XCG, XDG, XCS, XDS, (1.+XSNP), & + XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & + PFDINFTY, XKER_Q_SDRYGB1 ) +! +! Negative charging region + CALL VQZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & + ZEGS, XSMN, XCG, XDG, XCS, XDS, (1.+XSNN), & + XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & + PFDINFTY, XKER_Q_SDRYGB2 ) +ENDIF +! +! +!* 11.5 NI process: Takahashi (1978) parameterization +! +IF (CNI_CHARGING == 'TAKAH') THEN +! +! IDRYG_boun + XFQIDRYGBT1 = (XPI / 4.0) * XCCG * XCG + XFQIDRYGBT2 = 10.0 * MOMG(XALPHAG,XNUG,2.+XDG) + XFQIDRYGBT3 = 5.0 * XCG * MOMG(XALPHAI,XNUI,2.) * & + MOMG(XALPHAG,XNUG,2.+2.*XDG) / ((2.E-4)**2 * 8. * & + (XAI * MOMG(XALPHAI,XNUI,XBI))**(2 / XBI)) +! +! SDRYG_boun + XFQSDRYGBT1 = (XPI / 4.0) * XCCG * XCCS + XFQSDRYGBT2 = XCG * MOMG(XALPHAG,XNUG,XDG) * MOMG(XALPHAS,XNUS,2.) + XFQSDRYGBT3 = XCS * MOMG(XALPHAS,XNUS,2.+XDS) + XFQSDRYGBT4 = XCG * MOMG(XALPHAG,XNUG,2.+XDG) + XFQSDRYGBT5 = XCS * MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAS,XNUS,XDS) + XFQSDRYGBT6 = 2. * XCG * MOMG(XALPHAG,XNUG,1.+XDG) * MOMG(XALPHAS,XNUS,1.) + XFQSDRYGBT7 = 2. * XCS * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAS,XNUS,1.+XDS) + XFQSDRYGBT8 = 5. / ((1.E-4)**2 * 8.) + XFQSDRYGBT9 = MOMG(XALPHAG,XNUG,2.) * MOMG(XALPHAS,XNUS,2.) + XFQSDRYGBT10 = MOMG(XALPHAS,XNUS,4.) + XFQSDRYGBT11 = 2. * MOMG(XALPHAG,XNUG,1.) * MOMG(XALPHAS,XNUS,3.) +! + IF( .NOT.ALLOCATED(XKER_Q_SDRYGB)) ALLOCATE( XKER_Q_SDRYGB(NDRYLBDAG,NDRYLBDAS) ) + CALL VQZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & + ZEGS, 2., XCG, XDG, XCS, XDS, 2., & + XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & + PFDINFTY, XKER_Q_SDRYGB ) +END IF +! +! +!* 11.6 NI process: limit the charge exchanged during QSDRYG_boun +! +IF (CNI_CHARGING == 'TAKAH' .OR. CNI_CHARGING == 'SAP98' .OR. & + CNI_CHARGING == 'SAUN1' .OR. CNI_CHARGING == 'SAUN2' .OR. & + CNI_CHARGING == 'GARDI' .OR. & + CNI_CHARGING == 'BSMP1' .OR. CNI_CHARGING == 'BSMP2' .OR. & + CNI_CHARGING == 'TEEWC' .OR. CNI_CHARGING == 'TERAR') THEN + XAUX_LIM = (XPI / 4.0) * XCCG * XCCS + XAUX_LIM1 = MOMG(XALPHAS,XNUS,2.) + XAUX_LIM2 = 2. * MOMG(XALPHAS,XNUS,1.) * MOMG(XALPHAG,XNUG,1.) + XAUX_LIM3 = MOMG(XALPHAG,XNUG,2.) + IF( .NOT.ALLOCATED(XKER_Q_LIMSG)) ALLOCATE( XKER_Q_LIMSG(NDRYLBDAG,NDRYLBDAS) ) + CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAS, XNUS, & + ZEGS, 0., XCG, XDG, XCS, XDS, & + XDRYLBDAG_MAX, XDRYLBDAS_MAX, XDRYLBDAG_MIN, XDRYLBDAS_MIN, & + PFDINFTY, XKER_Q_LIMSG) +ENDIF +! +! +!------------------------------------------------------------------------------- +! +!* 12. DRY GROWTH OF GRAUPELN BY CAPTURE OF RAINDROP +! --------------------------------------------- +! +IF( .NOT.ALLOCATED(XKER_Q_RDRYG)) ALLOCATE( XKER_Q_RDRYG(NDRYLBDAG,NDRYLBDAR) ) +! +XFQRDRYG = (XPI / 4.0) * XCCG * XCCR * (PRHO00**XCEXVT) +! +XLBQRDRYG1 = MOMG(XALPHAR,XNUR,2.+XFR) +XLBQRDRYG2 = 2. * MOMG(XALPHAR,XNUR,1.+XFR) * MOMG(XALPHAG,XNUG,1.) +XLBQRDRYG3 = MOMG(XALPHAR,XNUR,XFR) * MOMG(XALPHAG,XNUG,2.) +! +ZEGR = 1.0 +! +CALL RZCOLX (KND, XALPHAG, XNUG, XALPHAR, XNUR, & + ZEGR, XFR, XCG, XDG, XCR, XDR, & + XDRYLBDAG_MAX, XDRYLBDAR_MAX, XDRYLBDAG_MIN, XDRYLBDAR_MIN, & + PFDINFTY, XKER_Q_RDRYG ) +! +! +!------------------------------------------------------------------------------- +! +!* 13. UPDATE THE Q=f(D) RELATION +! -------------------------- +! +XFQUPDC = 400.E6 * MOMG(XALPHACQ,XNUCQ,XFC) / XLBDACQ**XFC ! Nc~400E6 m-3 as + ! proposed for RCHONI +! +XFQUPDR = XCCR * MOMG(XALPHAR,XNUR,XFR) +XEXFQUPDI = (XFI/XBI) +XFQUPDI = MOMG(XALPHAI,XNUI,XFI) * (XAI*MOMG(XALPHAI,XNUI,XBI))**(-XEXFQUPDI) +XFQUPDS = XCCS * MOMG(XALPHAS,XNUS,XFS) +XFQUPDG = XCCG * MOMG(XALPHAG,XNUG,XFG) +XFQUPDH = XCCH * MOMG(XALPHAH,XNUH,XFH) +! +! +!------------------------------------------------------------------------------ +! +!* 14. INDUCTIVE PROCESS +! ----------------- +! +! d = 15 microns and N_c = 400 cm**(-3) +! +XCOLCG_IND = 0.8 +XEBOUND = 0.1 +XALPHA_IND = 0.07 ! moderate inductive charging +XCOS_THETA = 0.2 +! +XIND1 = (XPI**3 / 8.) * (15.E-6)**2 * & + XCG * 400.E6 * XCCG * & + XCOLCG_IND * XEBOUND * XALPHA_IND +XIND2 = XPI * XEPSILON * XCOS_THETA * MOMG(XALPHAG,XNUG,2.+XDG) +XIND3 = MOMG(XALPHAG,XNUG,XDG+XFG) / 3. +! +!------------------------------------------------------------------------------- +! +!* 15. LIGHTNING FLASHES +! ----------------- +! +XFQLIGHTC = 660. * MOMG(3.,3.,2.) / MOMG(3.,3.,3.) ! PI/A*lbda^(b-2) = 660. +! +XFQLIGHTR = XPI * XCCR * MOMG(XALPHAR,XNUR,2.) +XEXQLIGHTR = XCXR - 2. +! +XEXQLIGHTI = 2. / XBI +XFQLIGHTI = XPI / 4. * MOMG(XALPHAI,XNUI,2.) * & + (XAI * MOMG(XALPHAI,XNUI,XBI))**(-XEXQLIGHTI) +! +XFQLIGHTS = XPI * XCCS * MOMG(XALPHAS,XNUS,2.) +XEXQLIGHTS = XCXS - 2. +! +XFQLIGHTG = XPI * XCCG * MOMG(XALPHAG,XNUG,2.) +XEXQLIGHTG = XCXG - 2. +! +XFQLIGHTH = XPI * XCCH * MOMG(XALPHAH,XNUH,2.) +XEXQLIGHTH = XCXH - 2. +! +IF( .NOT.ALLOCATED(XNEUT_POS)) ALLOCATE( XNEUT_POS(NLGHTMAX) ) +IF( .NOT.ALLOCATED(XNEUT_NEG)) ALLOCATE( XNEUT_NEG(NLGHTMAX) ) +XNEUT_POS(:) = 0. +XNEUT_NEG(:) = 0. +! +!------------------------------------------------------------------------------- +! +END SUBROUTINE INI_PARAM_ELEC diff --git a/src/mesonh/micro/ini_rain_ice.f90 b/src/mesonh/micro/ini_rain_ice.f90 index c172f556ebca02c69cf1921f20fd8d2e1ec05fe3..ee733f4e23030bb3631c086a4fd7e1db1e72fb4d 100644 --- a/src/mesonh/micro/ini_rain_ice.f90 +++ b/src/mesonh/micro/ini_rain_ice.f90 @@ -128,6 +128,9 @@ USE MODE_READ_XKER_SWETH, ONLY: READ_XKER_SWETH USE MODE_READ_XKER_GWETH, ONLY: READ_XKER_GWETH USE MODE_READ_XKER_RWETH, ONLY: READ_XKER_RWETH ! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -196,6 +199,7 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE) ! +IF (LHOOK) CALL DR_HOOK('INI_RAIN_ICE',0,ZHOOK_HANDLE) ! !* 0. FUNCTION STATEMENTS ! ------------------- @@ -215,7 +219,7 @@ IF (CSEDIM == 'SPLI' .AND. .NOT. LRED ) THEN ZVTRMAX = 40. ELSE IF (HCLOUD == 'ICE3') THEN ZVTRMAX = 10. - END IF + END IF END IF ! !* 1.2 Compute the number of small time step integration @@ -595,7 +599,8 @@ IF (GFLAG) THEN WRITE(UNIT=KLUOUT,FMT='(" Crit. ice cont. XCRIAUTI=",E13.6)') XCRIAUTI WRITE(UNIT=KLUOUT,FMT='(" A Coef. for cirrus law XACRIAUTI=",E13.6)')XACRIAUTI WRITE(UNIT=KLUOUT,FMT='(" B Coef. for cirrus law XBCRIAUTI=",E13.6)')XBCRIAUTI - WRITE(UNIT=KLUOUT,FMT='(" Temp degC at which cirrus law starts to be used=",E13.6)') XT0CRIAUTI + WRITE(UNIT=KLUOUT, & + & FMT='(" Temp degC at which cirrus law starts to be used=",E13.6)') XT0CRIAUTI END IF ! ! diff --git a/src/mesonh/micro/lima_adjust_split.f90 b/src/mesonh/micro/lima_adjust_split.f90 index edaeec82007c9f14ed51c77c8aa092ad3bbc1d7b..ab87f141f0ee8d1dc4cb3bae80bf3d81b4259f8c 100644 --- a/src/mesonh/micro/lima_adjust_split.f90 +++ b/src/mesonh/micro/lima_adjust_split.f90 @@ -269,11 +269,12 @@ REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & ZLV, & ! guess of the Lv at t+1 ZLS, & ! guess of the Ls at t+1 ZMASK,& - ZRV, ZRV2, & - ZRC, ZRC2, & - ZRI, & + ZRV, ZRV2,ZRV_IN, & + ZRC, ZRC2,ZRC_IN, & + ZRI, ZRI_IN, & ZSIGS, & ZW_MF +REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2)) :: ZSIGQSAT2D LOGICAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) & :: GMICRO ! Test where to compute cond/dep proc. INTEGER :: IMICRO @@ -500,15 +501,20 @@ DO JITER =1,ITERMAX ! ZRV=PRVS*PTSTEP ZRC=PRCS*PTSTEP + ZRV_IN=ZRV + ZRC_IN=ZRC + ZRI_IN=0. ZRV2=PRVT ZRC2=PRCT ZRI=0. ZSIGS=PSIGS + ZSIGQSAT2D(:,:)=PSIGQSAT CALL CONDENSATION(IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, 'S', & HCONDENS, HLAMBDA3, & - PPABST, PZZ, PRHODREF, ZT, ZRV, ZRC, ZRI, PRSS*PTSTEP, PRGS*PTSTEP, & - ZSIGS, PMFCONV, PCLDFR, PSRCS, .FALSE., OSIGMAS, & - PSIGQSAT, PLV=ZLV, PLS=ZLS, PCPH=ZCPH ) + PPABST, PZZ, PRHODREF, ZT, ZRV_IN, ZRV, ZRC_IN, ZRC, ZRI_IN, ZRI,& + PRSS*PTSTEP, PRGS*PTSTEP, & + ZSIGS, PMFCONV, PCLDFR, PSRCS, .FALSE., OSIGMAS, .FALSE., & + ZSIGQSAT2D, PLV=ZLV, PLS=ZLS, PCPH=ZCPH ) PCLDFR(:,:,:) = MIN(PCLDFR(:,:,:) + PCF_MF(:,:,:) , 1.) ZRV(:,:,:) = ZRV(:,:,:) - MAX(MIN(PRC_MF(:,:,:), ZRV(:,:,:)),0.) ZRC(:,:,:) = ZRC(:,:,:) + MAX(MIN(PRC_MF(:,:,:), ZRV(:,:,:)),0.) diff --git a/src/mesonh/micro/modd_blankn.f90 b/src/mesonh/micro/modd_blankn.f90 deleted file mode 100644 index 6428103136f77d7639c070c7032add80316721f5..0000000000000000000000000000000000000000 --- a/src/mesonh/micro/modd_blankn.f90 +++ /dev/null @@ -1,173 +0,0 @@ -!MNH_LIC Copyright 1996-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. -!----------------------------------------------------------------- -! ################# - MODULE MODD_BLANK_n -! ################# -! -!!**** *MODD_BLANK$n* - Declarative module for MesoNH developpers namelist -!! -!! PURPOSE -!! ------- -!! -!! Offer dummy real, integer, logical and character variables for -!! test and debugging purposes. -!! -!!** METHOD -!! ------ -!! -!! Eight dummy real, integer, logical and character*80 variables are -!! defined and passed through the namelist read operations. None of the -!! MesoNH routines uses any of those variables. When a developper choses -!! to introduce temporarily a parameter to some subroutine, he has to -!! introduce a USE MODD_BLANK statement into that subroutine. Then he -!! can use any of the variables defined here and change them easily via -!! the namelist input. -!! -!! REFERENCE -!! --------- -!! None -!! -!! AUTHOR -!! ------ -!! K. Suhre *Laboratoire d'Aerologie* -!! -!! MODIFICATIONS -!! ------------- -!! -!! Original 25/04/96 -!! updated 17/11/00 (P Jabouille) Use dummy array -!! updated 26/10/21 (Q.Rodier) Use for n model (grid-nesting) -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS, ONLY : JPDUMMY, JPMODELMAX -! -IMPLICIT NONE -! -TYPE BLANK_t -! - LOGICAL :: LDUMMY1 - LOGICAL :: LDUMMY2 - LOGICAL :: LDUMMY3 - LOGICAL :: LDUMMY4 - LOGICAL :: LDUMMY5 - LOGICAL :: LDUMMY6 - LOGICAL :: LDUMMY7 - LOGICAL :: LDUMMY8 -! - CHARACTER(len=80) :: CDUMMY1 - CHARACTER(len=80) :: CDUMMY2 - CHARACTER(len=80) :: CDUMMY3 - CHARACTER(len=80) :: CDUMMY4 - CHARACTER(len=80) :: CDUMMY5 - CHARACTER(len=80) :: CDUMMY6 - CHARACTER(len=80) :: CDUMMY7 - CHARACTER(len=80) :: CDUMMY8 -! - INTEGER :: NDUMMY1 - INTEGER :: NDUMMY2 - INTEGER :: NDUMMY3 - INTEGER :: NDUMMY4 - INTEGER :: NDUMMY5 - INTEGER :: NDUMMY6 - INTEGER :: NDUMMY7 - INTEGER :: NDUMMY8 -! - REAL :: XDUMMY1 - REAL :: XDUMMY2 - REAL :: XDUMMY3 - REAL :: XDUMMY4 - REAL :: XDUMMY5 - REAL :: XDUMMY6 - REAL :: XDUMMY7 - REAL :: XDUMMY8 -! -END TYPE BLANK_t -! -TYPE(BLANK_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: BLANK_MODEL -! -LOGICAL, POINTER :: LDUMMY1=>NULL() -LOGICAL, POINTER :: LDUMMY2=>NULL() -LOGICAL, POINTER :: LDUMMY3=>NULL() -LOGICAL, POINTER :: LDUMMY4=>NULL() -LOGICAL, POINTER :: LDUMMY5=>NULL() -LOGICAL, POINTER :: LDUMMY6=>NULL() -LOGICAL, POINTER :: LDUMMY7=>NULL() -LOGICAL, POINTER :: LDUMMY8=>NULL() -! -CHARACTER(len=80), POINTER :: CDUMMY1=>NULL() -CHARACTER(len=80), POINTER :: CDUMMY2=>NULL() -CHARACTER(len=80), POINTER :: CDUMMY3=>NULL() -CHARACTER(len=80), POINTER :: CDUMMY4=>NULL() -CHARACTER(len=80), POINTER :: CDUMMY5=>NULL() -CHARACTER(len=80), POINTER :: CDUMMY6=>NULL() -CHARACTER(len=80), POINTER :: CDUMMY7=>NULL() -CHARACTER(len=80), POINTER :: CDUMMY8=>NULL() -! -INTEGER, POINTER :: NDUMMY1=>NULL() -INTEGER, POINTER :: NDUMMY2=>NULL() -INTEGER, POINTER :: NDUMMY3=>NULL() -INTEGER, POINTER :: NDUMMY4=>NULL() -INTEGER, POINTER :: NDUMMY5=>NULL() -INTEGER, POINTER :: NDUMMY6=>NULL() -INTEGER, POINTER :: NDUMMY7=>NULL() -INTEGER, POINTER :: NDUMMY8=>NULL() -! -REAL, POINTER :: XDUMMY1=>NULL() -REAL, POINTER :: XDUMMY2=>NULL() -REAL, POINTER :: XDUMMY3=>NULL() -REAL, POINTER :: XDUMMY4=>NULL() -REAL, POINTER :: XDUMMY5=>NULL() -REAL, POINTER :: XDUMMY6=>NULL() -REAL, POINTER :: XDUMMY7=>NULL() -REAL, POINTER :: XDUMMY8=>NULL() -! -CONTAINS -! -SUBROUTINE BLANK_GOTO_MODEL(KFROM,KTO) -INTEGER, INTENT(IN) :: KFROM, KTO -! -LDUMMY1=>BLANK_MODEL(KTO)%LDUMMY1 -LDUMMY2=>BLANK_MODEL(KTO)%LDUMMY2 -LDUMMY3=>BLANK_MODEL(KTO)%LDUMMY3 -LDUMMY4=>BLANK_MODEL(KTO)%LDUMMY4 -LDUMMY5=>BLANK_MODEL(KTO)%LDUMMY5 -LDUMMY6=>BLANK_MODEL(KTO)%LDUMMY6 -LDUMMY7=>BLANK_MODEL(KTO)%LDUMMY7 -LDUMMY8=>BLANK_MODEL(KTO)%LDUMMY8 - -CDUMMY1=>BLANK_MODEL(KTO)%CDUMMY1 -CDUMMY2=>BLANK_MODEL(KTO)%CDUMMY2 -CDUMMY3=>BLANK_MODEL(KTO)%CDUMMY3 -CDUMMY4=>BLANK_MODEL(KTO)%CDUMMY4 -CDUMMY5=>BLANK_MODEL(KTO)%CDUMMY5 -CDUMMY6=>BLANK_MODEL(KTO)%CDUMMY6 -CDUMMY7=>BLANK_MODEL(KTO)%CDUMMY7 -CDUMMY8=>BLANK_MODEL(KTO)%CDUMMY8 -! -NDUMMY1=>BLANK_MODEL(KTO)%NDUMMY1 -NDUMMY2=>BLANK_MODEL(KTO)%NDUMMY2 -NDUMMY3=>BLANK_MODEL(KTO)%NDUMMY3 -NDUMMY4=>BLANK_MODEL(KTO)%NDUMMY4 -NDUMMY5=>BLANK_MODEL(KTO)%NDUMMY5 -NDUMMY6=>BLANK_MODEL(KTO)%NDUMMY6 -NDUMMY7=>BLANK_MODEL(KTO)%NDUMMY7 -NDUMMY8=>BLANK_MODEL(KTO)%NDUMMY8 -! -XDUMMY1=>BLANK_MODEL(KTO)%XDUMMY1 -XDUMMY2=>BLANK_MODEL(KTO)%XDUMMY2 -XDUMMY3=>BLANK_MODEL(KTO)%XDUMMY3 -XDUMMY4=>BLANK_MODEL(KTO)%XDUMMY4 -XDUMMY5=>BLANK_MODEL(KTO)%XDUMMY5 -XDUMMY6=>BLANK_MODEL(KTO)%XDUMMY6 -XDUMMY7=>BLANK_MODEL(KTO)%XDUMMY7 -XDUMMY8=>BLANK_MODEL(KTO)%XDUMMY8 -! -END SUBROUTINE BLANK_GOTO_MODEL -! -END MODULE MODD_BLANK_n diff --git a/src/mesonh/micro/modd_conf.f90 b/src/mesonh/micro/modd_conf.f90 deleted file mode 100644 index a7995fec5548247b67356044fe285d76f13b68f6..0000000000000000000000000000000000000000 --- a/src/mesonh/micro/modd_conf.f90 +++ /dev/null @@ -1,127 +0,0 @@ -!MNH_LIC Copyright 1994-2018 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_CONF -! ################# -! -!!**** *MODD_CONF* - declaration of configuration variables -!! -!! PURPOSE -!! ------- -! The purpose of this declarative module is to specify the variables -! which concern the configuration of all models. For exemple, -! the type of geometry (Cartesian or conformal projection plane). -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! None -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (module MODD_CONF) -!! Technical Specifications Report of the Meso-NH (chapters 2 and 3) -!! -!! AUTHOR -!! ------ -!! V. Ducrocq *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original 05/05/94 -!! J. Stein 09/01/95 add the 1D switch -!! J. Stein and P. Jabouille 30/04/96 add the storage type -!! J.-P. Pinty 13/02/96 add LFORCING switch -!! J. Stein 25/07/97 add the equation system switch -!! P. Jabouille 07/05/98 add LPACK -!! V. Masson 18/03/98 add the VERSION switch -!! V. Masson 15/03/99 add PROGRAM swith -!! P. Jabouille 21/07/99 add NHALO and CSPLIT -!! P. Jabouille 26/06/01 lagrangian variables -!! V. Masson 09/07/01 add LNEUTRAL switch -!! P. Jabouille 18/04/02 add NBUGFIX and CBIBUSER -!! C. Lac 01/04/14 add LCHECK -!! G. Tanguy 01/04/14 add LCOUPLING -!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -! -CHARACTER (LEN=5),SAVE :: CCONF ! Configuration of models - ! 'START' for start configuration - ! 'RESTART' for restart configuration -LOGICAL,SAVE :: LTHINSHELL ! Logical for thinshell approximation - ! .TRUE. = thinshell approximation - ! .FALSE. = no thinshell approximation -LOGICAL,SAVE :: LCARTESIAN ! Logical for cartesian geometry : - ! .TRUE. = cartesian geometry - ! .FALSE. = conformal projection -LOGICAL,SAVE :: L2D = .FALSE. ! Logical for 2D model version - ! .TRUE. = 2D model version - ! .FALSE. = 3D model version -LOGICAL,SAVE :: L1D ! Logical for 1D model version - ! .TRUE. = 1D model version - ! .FALSE. = 2D or 3D model version -LOGICAL,SAVE :: LFLAT ! Logical for zero ororography - ! .TRUE. = no orography (zs=0.) - ! .FALSE. = orography -INTEGER,SAVE :: NMODEL ! Number of nested models -INTEGER,SAVE :: NVERB ! Level of informations on output-listing - ! 0 for minimum of prints - ! 5 for intermediate level of prints - ! 10 for maximum of prints -CHARACTER (LEN=5),SAVE :: CEXP ! Experiment name -CHARACTER (LEN=5),SAVE :: CSEG ! name of segment -LOGICAL,SAVE :: LFORCING ! Logical for forcing sources - ! .TRUE. = add forcing sources - ! .FALSE. = no forcing fields -! -CHARACTER (LEN=3),SAVE :: CEQNSYS! EQuatioN SYStem resolved by the MESONH model - ! 'LHE' Lipps and HEmler anelastic system - ! 'DUR' approximated form of the DURran version - ! of the anelastic sytem - ! 'MAE' classical Modified Anelastic Equations - ! but with not any approximation in the - ! momentum equation - ! 'FCE' fully compressible equations ( not - ! yet developped ) -LOGICAL,SAVE :: LPACK ! Logical to compress 1D or 2D FM files -! -! -INTEGER,DIMENSION(3),SAVE :: NMNHVERSION ! Version of MesoNH -INTEGER,SAVE :: NMASDEV ! NMASDEV=XY corresponds to the masdevX_Y -INTEGER,SAVE :: NBUGFIX ! NBUGFIX=n corresponds to the BUGn of masdevX_Y -CHARACTER(LEN=10),SAVE :: CBIBUSER! CBIBUSER is the name of the user binary library -! -CHARACTER(LEN=6),SAVE :: CPROGRAM ! CPROGRAM is the program currently running: -! ! 'PGD ','ADVPGD','NESPGD','REAL ','IDEAL ' -! ! 'MESONH','SPAWN ','DIAG ','SPEC ' -! -INTEGER,SAVE :: NHALO ! Size of the halo for parallel distribution -! -!INTEGER,SAVE :: JPHEXT = 1 ! Horizontal External points number -! -CHARACTER (LEN=10),SAVE :: CSPLIT ! kind of domain splitting for parallel distribution - ! "BSPLITTING","XSPLITTING","YSPLITTING" -LOGICAL,SAVE :: LLG ! Logical to use lagrangian variables -LOGICAL,SAVE :: LINIT_LG ! to reinitialize lagrangian variables -CHARACTER (LEN=5),SAVE :: CINIT_LG ! to reinitialize LG variables at every output -LOGICAL,SAVE :: LNOMIXLG ! to use turbulence for lagrangian variables -! -LOGICAL,SAVE :: LNEUTRAL ! True if ref. theta field is uniform -! -LOGICAL,SAVE :: LCPL_AROME ! true if coupling file are issued from AROME -LOGICAL,SAVE :: LCOUPLING ! true if coupling file (and not intial file) - ! (with LCOUPLING=T in PREP_REAL_CASE) -! -LOGICAL,SAVE :: LCHECK ! To test reproducibility -! -END MODULE MODD_CONF diff --git a/src/mesonh/micro/modd_les.f90 b/src/mesonh/micro/modd_les.f90 deleted file mode 100644 index db71d6f33aa854d4fa66308dece4c9cc7ad7bbcd..0000000000000000000000000000000000000000 --- a/src/mesonh/micro/modd_les.f90 +++ /dev/null @@ -1,458 +0,0 @@ -!MNH_LIC Copyright 1995-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. -!----------------------------------------------------------------- -! ############### - MODULE MODD_LES -! ############### -! -!!**** *MODD_LES* - declaration of prognostic variables -!! -!! PURPOSE -!! ------- -! The purpose of this declarative module is to specify the -! resolved fluxes and the spectra computed in LES mode -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! None -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (module MODD_LES) -!! Technical Specifications Report of the Meso-NH (chapters 2 and 3) -!! -!! -!! AUTHOR -!! ------ -!! J. Cuxart *INM and Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original March 10, 1995 -!! -!! (J.Stein) Sept. 25, 1995 add the model number in LES mode -!! J. Cuxart Oct. 4, 1996 New time series -!! V. Masson Jan. 20, 2000 New LES routines variables & // -!! V. Masson Nov. 6, 2002 LES budgets -!! F. Couvreux Oct 1, 2006 LES PDF -!! J.Pergaud Oct , 2007 MF LES -!! P. Aumond Oct ,2009 User multimaskS + 4th order -!! C.Lac Oct ,2014 Correction on user masks -! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 13/09/2019: budget: simplify and modernize date/time management -! P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS -! -IMPLICIT NONE -! -!------------------------------------------------------------------------------- -! -!* namelist variables -! -LOGICAL :: LLES_MEAN ! flag to activate the mean computations -LOGICAL :: LLES_RESOLVED ! flag to activate the resolved var. computations -LOGICAL :: LLES_SUBGRID ! flag to activate the subgrid var. computations -LOGICAL :: LLES_UPDRAFT ! flag to activate the computations in updrafts -LOGICAL :: LLES_DOWNDRAFT ! flag to activate the computations in downdrafts -LOGICAL :: LLES_SPECTRA ! flag to activate the spectra computations -LOGICAL :: LLES_PDF ! flag to activate the pdf computations -! -INTEGER, DIMENSION(900) :: NLES_LEVELS ! physical model levels for LES comp. -REAL, DIMENSION(900) :: XLES_ALTITUDES ! alt. levels for LES comp. -INTEGER, DIMENSION(900) :: NSPECTRA_LEVELS ! physical model levels for spectra comp. -REAL, DIMENSION(900) :: XSPECTRA_ALTITUDES ! alt. levels for spectra comp. -! -INTEGER, DIMENSION( 10) :: NLES_TEMP_SERIE_I ! I, J and Z point -INTEGER, DIMENSION( 10) :: NLES_TEMP_SERIE_J ! localizations to -INTEGER, DIMENSION( 10) :: NLES_TEMP_SERIE_Z ! record temporal data - -CHARACTER(LEN=4) :: CLES_NORM_TYPE ! type of turbulence normalization -CHARACTER(LEN=3) :: CBL_HEIGHT_DEF ! definition of the boundary layer height - -REAL :: XLES_TEMP_SAMPLING ! temporal sampling between each computation -REAL :: XLES_TEMP_MEAN_START ! time (in s) from the beginning of the simulation -REAL :: XLES_TEMP_MEAN_END ! for start and end of the temporal averaged comp. -REAL :: XLES_TEMP_MEAN_STEP ! time step for each averaging - -LOGICAL :: LLES_CART_MASK ! flag to use a cartesian mask -INTEGER :: NLES_IINF ! definition of the cartesians mask in physical domain -INTEGER :: NLES_ISUP ! for NLES_CART_MODNBR model -INTEGER :: NLES_JINF ! " -INTEGER :: NLES_JSUP ! " -LOGICAL :: LLES_NEB_MASK ! flag to use a 2D nebulosity mask -LOGICAL :: LLES_CORE_MASK ! flag to use a 3D cloud core mask -LOGICAL :: LLES_MY_MASK ! flag to use its own mask (must be coded by user) -INTEGER :: NLES_MASKS_USER ! number of user masks for LES computations -LOGICAL :: LLES_CS_MASK ! flag to use conditional sampling mask -INTEGER :: NPDF ! number of pdf intervals -! -!------------------------------------------------------------------------------- -! -INTEGER, DIMENSION(JPMODELMAX) :: NLESn_IINF ! definition of the cartesians mask in physical domain -INTEGER, DIMENSION(JPMODELMAX) :: NLESn_ISUP ! for all models -INTEGER, DIMENSION(JPMODELMAX) :: NLESn_JINF ! " -INTEGER, DIMENSION(JPMODELMAX) :: NLESn_JSUP ! " -! -CHARACTER(LEN=4), DIMENSION(2,JPMODELMAX) :: CLES_LBCX -! X boundary conditions for 2 points correlations computations for all models -! -CHARACTER(LEN=4), DIMENSION(2,JPMODELMAX) :: CLES_LBCY -! Y boundary conditions for 2 points correlations computations for all models -! -!------------------------------------------------------------------------------- -! -LOGICAL :: LLES ! flag to compute the LES diagnostics -! -LOGICAL :: LLES_CALL ! flag to compute the LES diagnostics at current -! ! time step -! -! -LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CART_MASK -! 2D cartesian mask of the current model -! -LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_NEB_MASK -! 2D nebulosity mask of the current model -! -LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CORE_MASK -! 2D surface precipitations mask of the current model -! -! 2D owner mask of the current model -LOGICAL, DIMENSION(:,:,:,:), ALLOCATABLE :: LLES_CURRENT_MY_MASKS -! -LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CS1_MASK -LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CS2_MASK -LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLES_CURRENT_CS3_MASK -! 2D conditional sampling mask of the current model -! -INTEGER :: NLES_CURRENT_TCOUNT -! current model LES time counter -! -INTEGER :: NLES_CURRENT_TIMES -! current model NLES_TIMES (number of LES samplings) -! -INTEGER :: NLES_CURRENT_IINF, NLES_CURRENT_ISUP, NLES_CURRENT_JINF, NLES_CURRENT_JSUP -! coordinates (in physical domain) for write_diachro, set to NLESn_IINF(current model), etc... -! -REAL :: XLES_CURRENT_DOMEGAX, XLES_CURRENT_DOMEGAY -! minimum wavelength in spectra analysis -! -CHARACTER(LEN=4), DIMENSION(2) :: CLES_CURRENT_LBCX -! current model X boundary conditions for 2 points correlations computations -! -CHARACTER(LEN=4), DIMENSION(2) :: CLES_CURRENT_LBCY -! current model Y boundary conditions for 2 points correlations computations -! -REAL, DIMENSION(:), ALLOCATABLE :: XLES_CURRENT_Z -! altitudes for diachro -! -REAL :: XLES_CURRENT_ZS -! orography (used for normalization of altitudes) -! -INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: NKLIN_CURRENT_LES -! levels for vertical interpolation -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: XCOEFLIN_CURRENT_LES -! coefficients for vertical interpolation -! -INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: NKLIN_CURRENT_SPEC -! levels for vertical interpolation -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: XCOEFLIN_CURRENT_SPEC -! coefficients for vertical interpolation -! -REAL,DIMENSION(2) :: XTIME_LES -! time spent in subgrid LES computations in this time-step in TURB -! -!------------------------------------------------------------------------------- -! -!* normalization variables -! -REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_M -! normalization coefficient for distances (Meters) -! -REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_K -! normalization coefficient for temperatures (Kelvin) -! -REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_S -! normalization coefficient for times (Seconds) -! -REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_RHO -! normalization coefficient for densities -! -REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_RV -! normalization coefficient for mixing ratio -! -REAL, DIMENSION(:,:), ALLOCATABLE :: XLES_NORM_SV -! normalization coefficient for scalar variables -! -REAL, DIMENSION(:), ALLOCATABLE :: XLES_NORM_P -! normalization coefficient for pressure -! -!------------------------------------------------------------------------------- -! -!* monitoring variables -! -INTEGER :: NLES_MASKS ! number of masks for LES computations -INTEGER :: NLES_K ! number of vertical levels for local diagnostics -INTEGER :: NSPECTRA_K ! number of vertical levels for spectra -! -CHARACTER(LEN=1) :: CLES_LEVEL_TYPE ! type of vertical levels for local diag. -CHARACTER(LEN=1) :: CSPECTRA_LEVEL_TYPE ! type of vertical levels for spectra -! -!------------------------------------------------------------------------------- -! -!* subgrid variables for current model -! -! ______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_WThl ! <w'w'Thl'> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_WRt ! <w'w'Rt'> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_Thl2 ! <w'Thl'2> -! ____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_Rt2 ! <w'Rt'2> -! _______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_W_SBG_ThlRt! <w'Thl'Rt'> -! _____ -REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_RES_W_SBG_WSv ! <w'w'Sv'> -! ____ -REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_RES_W_SBG_Sv2 ! <w'Sv'2> -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: XLES_SUBGRID_RCSIGS ! rc sigmas -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: XLES_SUBGRID_RCSIGC ! rc sigmac -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_U_SBG_UaU ! <du'/dxa ua'u'> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_V_SBG_UaV ! <dv'/dxa ua'v'> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_W_SBG_UaW ! <dw'/dxa ua'w'> -! _______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_W_SBG_UaThl ! <dw'/dxa ua'Thl'> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Thl_SBG_UaW ! <dThl'/dxa ua'w'> -! ___ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddz_Thl_SBG_W2 ! <dThl'/dz w'2> -! ______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_W_SBG_UaRt ! <dw'/dxa ua'Rt'> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Rt_SBG_UaW ! <dRt'/dxa ua'w'> -! ___ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddz_Rt_SBG_W2 ! <dRt'/dz w'2> -! ______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Thl_SBG_UaRt! <dThl'/dxa ua'Rt'> -! _______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Rt_SBG_UaThl! <dRt'/dxa ua'Thl'> -! _______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Thl_SBG_UaThl! <dThl'/dxa ua'Thl'> -! ______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Rt_SBG_UaRt ! <dRt'/dxa ua'Rt'> -! ______ -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_W_SBG_UaSv ! <dw'/dxa ua'Sv'> -! _____ -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Sv_SBG_UaW ! <dSv'/dxa ua'w'> -! ___ -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_RES_ddz_Sv_SBG_W2 ! <dSv'/dz w'2> -! ______ -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_RES_ddxa_Sv_SBG_UaSv ! <dSv'/dxa ua'Sv'> -! -! ___ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_U2 ! <u'2> -! ___ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_V2 ! <v'2> -! ___ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_W2 ! <w'2> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Thl2 ! <Thl'2> -! ____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Rt2 ! <Rt'2> -! ____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Rc2 ! <Rc'2> -! ____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Ri2 ! <Ri'2> -! _______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ThlRt ! <Thl'Rt'> -! ____ -REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_Sv2 ! <Sv'2> -! ____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_UV ! <u'v'> -! ____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WU ! <w'u'> -! ____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WV ! <w'v'> -! ______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_UThl ! <u'Thl'> -! ______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VThl ! <v'Thl'> -! ______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WThl ! <w'Thl'> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_URt ! <u'Rt'> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VRt ! <v'Rt'> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WRt ! <w'Rt'> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_URc ! <u'Rc'> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VRc ! <v'Rc'> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WRc ! <w'Rc'> -! _____ -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_SUBGRID_USv ! <u'Sv'> -! _____ -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VSv ! <v'Sv'> -! _____ -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WSv ! <w'Sv'> -! ___ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_UTke ! <u'e> -! ___ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_VTke ! <v'e> -! ___ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WTke ! <w'e> -! ___ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ddz_WTke ! <dw'e/dz> -! ______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WThv ! <w'Thv'> -! ________ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ThlThv ! <Thl'Thv'> -! _______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RtThv ! <Rt'Thv'> -! _______ -REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_SvThv ! <Sv'Thv'> -! ______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_W2Thl ! <w'2Thl> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_W2Rt ! <w'2Rt> -! _____ -REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_W2Sv ! <w'2Sv> -! _______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WThlRt ! <w'ThlRt> -! ______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WThl2 ! <w'Thl2> -! _____ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WRt2 ! <w'Rt2> -! _____ -REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_WSv2 ! <w'Sv2> -! _______ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DISS_Tke ! <epsilon> -! ____________ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DISS_Thl2 ! <epsilon_Thl2> -! ___________ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DISS_Rt2 ! <epsilon_Rt2> -! ______________ -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DISS_ThlRt! <epsilon_ThlRt> -! ___________ -REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_DISS_Sv2 ! <epsilon_Sv2> -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WP ! <w'p'> -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ThlPz ! <Thl'dp'/dz> -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RtPz ! <Rt'dp'/dz> -! -REAL, DIMENSION(:,:,:,:),ALLOCATABLE:: X_LES_SUBGRID_SvPz ! <Sv'dp'/dz> -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_PHI3 ! phi3 -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_PSI3 ! psi3 -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_LMix ! mixing length -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_LDiss ! dissipative length -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Km ! eddy diffusivity for momentum -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_Kh ! eddy diffusivity for heat -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_THLUP_MF ! Thl of the Updraft -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RTUP_MF ! Rt of the Updraft -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RVUP_MF ! Rv of the Updraft -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RCUP_MF ! Rc of the Updraft -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_RIUP_MF ! Ri of the Updraft -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WUP_MF ! Thl of the Updraft -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_MASSFLUX ! Mass Flux -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_DETR ! Detrainment -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_ENTR ! Entrainment -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_FRACUP ! Updraft Fraction -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_THVUP_MF ! Thv of the Updraft -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WTHLMF ! Flux of thl -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WRTMF ! Flux of rt -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WTHVMF ! Flux of thv -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WUMF ! Flux of u -! -REAL, DIMENSION(:,:,:), ALLOCATABLE :: X_LES_SUBGRID_WVMF ! Flux of v -! -!* surface variables -! -REAL, DIMENSION(:), ALLOCATABLE :: X_LES_USTAR ! local u* temporal series -REAL, DIMENSION(:), ALLOCATABLE :: X_LES_UW0 ! uw temporal series -REAL, DIMENSION(:), ALLOCATABLE :: X_LES_VW0 ! vw temporal series -REAL, DIMENSION(:), ALLOCATABLE :: X_LES_Q0 ! Qo temporal series -REAL, DIMENSION(:), ALLOCATABLE :: X_LES_E0 ! Eo temporal series -REAL, DIMENSION(:,:), ALLOCATABLE :: X_LES_SV0 ! scalar surface fluxes -! -!* pdf variables -REAL :: XRV_PDF_MIN ! min of rv pdf -REAL :: XRV_PDF_MAX ! max of rv pdf -REAL :: XTH_PDF_MIN ! min of theta pdf -REAL :: XTH_PDF_MAX ! max of theta pdf -REAL :: XW_PDF_MIN ! min of w pdf -REAL :: XW_PDF_MAX ! max of w pdf -REAL :: XTHV_PDF_MIN ! min of thetav pdf -REAL :: XTHV_PDF_MAX ! max of thetav pdf -REAL :: XRC_PDF_MIN ! min of rc pdf -REAL :: XRC_PDF_MAX ! max of rc pdf -REAL :: XRR_PDF_MIN ! min of rr pdf -REAL :: XRR_PDF_MAX ! max of rr pdf -REAL :: XRI_PDF_MIN ! min of ri pdf -REAL :: XRI_PDF_MAX ! max of ri pdf -REAL :: XRS_PDF_MIN ! min of rs pdf -REAL :: XRS_PDF_MAX ! max of rs pdf -REAL :: XRG_PDF_MIN ! min of rg pdf -REAL :: XRG_PDF_MAX ! max of rg pdf -REAL :: XRT_PDF_MIN ! min of rt pdf -REAL :: XRT_PDF_MAX ! max of rt pdf -REAL :: XTHL_PDF_MIN ! min of thetal pdf -REAL :: XTHL_PDF_MAX ! max of thetal pdf -!------------------------------------------------------------------------------- -!* pdf distribution -! -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RV ! rv pdf -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_TH ! theta pdf -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_W ! w pdf -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_THV ! thetav pdf -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RC ! rc pdf -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RR ! rr pdf -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RI ! ri pdf -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RS ! rs pdf -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RG ! rg pdf -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_RT ! rt pdf -REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: XLES_PDF_THL ! thetal pdf -! -! -!------------------------------------------------------------------------------- -! -END MODULE MODD_LES diff --git a/src/mesonh/micro/modd_nsv.f90 b/src/mesonh/micro/modd_nsv.f90 deleted file mode 100644 index 7a842a5c1cacb3073ca3daa6139f327c1ed1543e..0000000000000000000000000000000000000000 --- a/src/mesonh/micro/modd_nsv.f90 +++ /dev/null @@ -1,253 +0,0 @@ -!MNH_LIC Copyright 2001-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. -!------------------------------------------------------------------------------- -! ############### - MODULE MODD_NSV -! ############### -! -!!**** *MODD_NSV* - declaration of scalar variables numbers -!! -!! PURPOSE -!! ------- -!! Arrays to store the per-model NSV_* values number (suffix _A denote an array) -!! -!! AUTHOR -!! ------ -!! D. Gazen L.A. -!! -!! MODIFICATIONS -!! ------------- -!! Original 01/02/01 -!! J.-P. Pinty 29/11/02 add C3R5, ELEC -!! V. Masson 01/2004 add scalar names -!! M. Leriche 12/04/07 add aqueous chemistry -!! M. Leriche 08/07/10 add ice phase chemistry -!! C.Lac 07/11 add conditional sampling -!! Pialat/Tulet 15/02/12 add ForeFire -!! Modification 01/2016 (JP Pinty) Add LIMA -!! V. Vionnet 07/17 add blowing snow -! P. Wautelet 10/03/2021: add CSVNAMES and CSVNAMES_A to store the name of all the scalar variables -! B. Vie 06/2021: add prognostic supersaturation for LIMA -! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS, ONLY : JPMODELMAX, & ! Maximum allowed number of nested models - JPSVMAX, & ! Maximum number of scalar variables - JPSVNAMELGTMAX ! Maximum length of a scalar variable name -! -IMPLICIT NONE -SAVE -! -REAL,DIMENSION(JPSVMAX) :: XSVMIN ! minimum value for SV variables -! -LOGICAL :: LINI_NSV = .FALSE. ! becomes True when routine INI_NSV is called -! -CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:,:), ALLOCATABLE, TARGET :: CSVNAMES_A !Names of all the scalar variables - -INTEGER,DIMENSION(JPMODELMAX)::NSV_A = 0 ! total number of scalar variables - ! NSV_A = NSV_USER_A+NSV_C2R2_A+NSV_CHEM_A+.. -INTEGER,DIMENSION(JPMODELMAX)::NSV_USER_A = 0 ! number of user scalar variables with - ! indices in the range : 1...NSV_USER_A -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_C2R2_A = 0 ! number of liq scalar in C2R2 - ! and in C3R5 -INTEGER,DIMENSION(JPMODELMAX)::NSV_C2R2BEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_C2R2END_A = 0 ! NSV_C2R2BEG_A...NSV_C2R2END_A -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_C1R3_A = 0 ! number of ice scalar in C3R5 -INTEGER,DIMENSION(JPMODELMAX)::NSV_C1R3BEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_C1R3END_A = 0 ! NSV_C1R3BEG_A...NSV_C1R3END_A -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_ELEC_A = 0 ! number of scalar in ELEC -INTEGER,DIMENSION(JPMODELMAX)::NSV_ELECBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_ELECEND_A = 0 ! NSV_ELECBEG_A...NSV_ELECEND_A -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_CHEM_A = 0 ! number of chemical scalar -INTEGER,DIMENSION(JPMODELMAX)::NSV_CHEMBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_CHEMEND_A = 0 ! NSV_CHEMBEG_A...NSV_CHEMEND_A -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_CHGS_A = 0 ! number of gaseous chemcial species -INTEGER,DIMENSION(JPMODELMAX)::NSV_CHGSBEG_A = 0 ! with indices -INTEGER,DIMENSION(JPMODELMAX)::NSV_CHGSEND_A = 0 ! NSV_CHGSBEG_ -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_CHAC_A = 0 ! number of aqueous chemical species -INTEGER,DIMENSION(JPMODELMAX)::NSV_CHACBEG_A = 0 ! with indices -INTEGER,DIMENSION(JPMODELMAX)::NSV_CHACEND_A = 0 ! NSV_CHACBEG -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_CHIC_A = 0 ! number of ice phase chemical species -INTEGER,DIMENSION(JPMODELMAX)::NSV_CHICBEG_A = 0 ! with indices -INTEGER,DIMENSION(JPMODELMAX)::NSV_CHICEND_A = 0 ! NSV_CHICBEG -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_LG_A = 0 ! number of LaGrangian -INTEGER,DIMENSION(JPMODELMAX)::NSV_LGBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_LGEND_A = 0 ! NSV_LGBEG_A...NSV_LGEND_A -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOX_A = 0 ! number of lightning NOx -INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOXBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_LNOXEND_A = 0 ! NSV_LNOXBEG_A...NSV_LNOXEND_A ! -INTEGER,DIMENSION(JPMODELMAX)::NSV_DST_A = 0 ! number of dust scalar -INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTEND_A = 0 ! NSV_DSTBEG_A...NSV_DSTEND_A -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_SLT_A = 0 ! number of sea salt scalar -INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTEND_A = 0 ! NSV_SLTBEG_A...NSV_SLTEND_A -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_AER_A = 0 ! number of aerosol scalar -INTEGER,DIMENSION(JPMODELMAX)::NSV_AERBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_AEREND_A = 0 ! NSV_AERBEG_A...NSV_AEREND_A -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTDEP_A = 0 ! number of aerosol scalar -INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTDEPBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_DSTDEPEND_A = 0 ! NSV_AERBEG_A...NSV_AEREND_A -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_AERDEP_A = 0 ! number of aerosol scalar -INTEGER,DIMENSION(JPMODELMAX)::NSV_AERDEPBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_AERDEPEND_A = 0 ! NSV_AERBEG_A...NSV_AEREND_A -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTDEP_A = 0 ! number of aerosol scalar -INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTDEPBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_SLTDEPEND_A = 0 ! NSV_SLTBEG_A...NSV_SLTEND_A -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_PP_A = 0 ! number of passive pol. -INTEGER,DIMENSION(JPMODELMAX)::NSV_PPBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_PPEND_A = 0 ! NSV_PPBEG_A...NSV_PPEND_A -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_CS_A = 0 ! number of condit.samplings -INTEGER,DIMENSION(JPMODELMAX)::NSV_CSBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_CSEND_A = 0 ! NSV_CSBEG_A...NSV_CSEND_A -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_A = 0 ! number of scalar in LIMA -INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_BEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_END_A = 0 ! NSV_LIMA_BEG_A...NSV_LIMA_END_A -INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_NC_A = 0 ! First Nc variable -INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_NR_A = 0 ! First Nr variable -INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_CCN_FREE_A = 0 ! First Free CCN conc. -INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_CCN_ACTI_A = 0 ! First Acti. CNN conc. -INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_SCAVMASS_A = 0 ! Scavenged mass variable -INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_NI_A = 0 ! First Ni var. -INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_IFN_FREE_A = 0 ! First Free IFN conc. -INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_IFN_NUCL_A = 0 ! First Nucl. IFN conc. -INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_IMM_NUCL_A = 0 ! First Nucl. IMM conc. -INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_HOM_HAZE_A = 0 ! Hom. freezing of CCN -INTEGER,DIMENSION(JPMODELMAX)::NSV_LIMA_SPRO_A = 0 ! Supersaturation -! -#ifdef MNH_FOREFIRE -INTEGER,DIMENSION(JPMODELMAX)::NSV_FF_A = 0 ! number of ForeFire scalar variables -INTEGER,DIMENSION(JPMODELMAX)::NSV_FFBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_FFEND_A = 0 ! NSV_FFBEG_A...NSV_FFEND_A -#endif -! -INTEGER,DIMENSION(JPMODELMAX)::NSV_SNW_A = 0 ! number of blowing snow scalar -INTEGER,DIMENSION(JPMODELMAX)::NSV_SNWBEG_A = 0 ! with indices in the range : -INTEGER,DIMENSION(JPMODELMAX)::NSV_SNWEND_A = 0 ! NSV_SNWBEG_A...NSV_SNWEND_A -! -!############################################################################### -! -! variables updated for the current model -! -CHARACTER(LEN=JPSVNAMELGTMAX), DIMENSION(:), POINTER :: CSVNAMES !Names of all the scalar variables -CHARACTER(LEN=6), DIMENSION(:), ALLOCATABLE :: CSV ! name of the scalar variables -INTEGER :: NSV = 0 ! total number of user scalar variables -! -INTEGER :: NSV_USER = 0 ! number of user scalar variables with indices - ! in the range : 1...NSV_USER -INTEGER :: NSV_C2R2 = 0 ! number of liq scalar used in C2R2 and in C3R5 -INTEGER :: NSV_C2R2BEG = 0 ! with indices in the range : -INTEGER :: NSV_C2R2END = 0 ! NSV_C2R2BEG...NSV_C2R2END -! -INTEGER :: NSV_C1R3 = 0 ! number of ice scalar used in C3R5 -INTEGER :: NSV_C1R3BEG = 0 ! with indices in the range : -INTEGER :: NSV_C1R3END = 0 ! NSV_C1R3BEG...NSV_C1R3END -! -INTEGER :: NSV_ELEC = 0 ! number of scalar variables used in ELEC -INTEGER :: NSV_ELECBEG = 0 ! with indices in the range : -INTEGER :: NSV_ELECEND = 0 ! NSV_ELECBEG...NSV_ELECEND -! -INTEGER :: NSV_CHEM = 0 ! number of chemical scalar variables -INTEGER :: NSV_CHEMBEG = 0 ! with indices in the range : -INTEGER :: NSV_CHEMEND = 0 ! NSV_CHEMBEG...NSV_CHEMEND -! -INTEGER :: NSV_CHGS = 0 ! number of gas-phase chemicals -INTEGER :: NSV_CHGSBEG = 0 ! with indices in the range : -INTEGER :: NSV_CHGSEND = 0 ! NSV_CHGSBEG...NSV_CHGSEND -! -INTEGER :: NSV_CHAC = 0 ! number of aqueous-phase chemicals -INTEGER :: NSV_CHACBEG = 0 ! with indices in the range : -INTEGER :: NSV_CHACEND = 0 ! NSV_CHACBEG...NSV_CHACEND -! -INTEGER :: NSV_CHIC = 0 ! number of ice-phase chemicals -INTEGER :: NSV_CHICBEG = 0 ! with indices in the range : -INTEGER :: NSV_CHICEND = 0 ! NSV_CHICBEG...NSV_CHICEND -! -INTEGER :: NSV_LG = 0 ! number of lagrangian -INTEGER :: NSV_LGBEG = 0 ! with indices in the range : -INTEGER :: NSV_LGEND = 0 ! NSV_LGBEG...NSV_LGEND -! -INTEGER :: NSV_LNOX = 0 ! number of lightning NOx variables -INTEGER :: NSV_LNOXBEG = 0 ! with indices in the range : -INTEGER :: NSV_LNOXEND = 0 ! NSV_LNOXBEG...NSV_LNOXEND -! -INTEGER :: NSV_DST = 0 ! number of dust scalar variables -INTEGER :: NSV_DSTBEG = 0 ! with indices in the range : -INTEGER :: NSV_DSTEND = 0 ! NSV_DSTBEG...NSV_DSTEND - -INTEGER :: NSV_SLT = 0 ! number of sea salt scalar variables -INTEGER :: NSV_SLTBEG = 0 ! with indices in the range : -INTEGER :: NSV_SLTEND = 0 ! NSV_SLTBEG...NSV_SLTEND - -INTEGER :: NSV_AER = 0 ! number of aerosol scalar variables -INTEGER :: NSV_AERBEG = 0 ! with indices in the range : -INTEGER :: NSV_AEREND = 0 ! NSV_AERBEG...NSV_AEREND - -INTEGER :: NSV_DSTDEP = 0 ! number of aerosol scalar variables -INTEGER :: NSV_DSTDEPBEG = 0 ! with indices in the range : -INTEGER :: NSV_DSTDEPEND = 0 ! NSV_AERBEG...NSV_AEREND -! -INTEGER :: NSV_AERDEP = 0 ! number of aerosol scalar variables -INTEGER :: NSV_AERDEPBEG = 0 ! with indices in the range : -INTEGER :: NSV_AERDEPEND = 0 ! NSV_AERBEG...NSV_AEREND - -INTEGER :: NSV_SLTDEP = 0 ! number of aerosol scalar variables -INTEGER :: NSV_SLTDEPBEG = 0 ! with indices in the range : -INTEGER :: NSV_SLTDEPEND = 0 ! NSV_AERBEG...NSV_AEREND -! -INTEGER :: NSV_PP = 0 ! number of passive pollutants -INTEGER :: NSV_PPBEG = 0 ! with indices in the range : -INTEGER :: NSV_PPEND = 0 ! NSV_PPBEG...NSV_PPEND -! -INTEGER :: NSV_CS = 0 ! number of condit.samplings -INTEGER :: NSV_CSBEG = 0 ! with indices in the range : -INTEGER :: NSV_CSEND = 0 ! NSV_CSBEG...NSV_CSEND -! -INTEGER :: NSV_LIMA ! number of scalar in LIMA -INTEGER :: NSV_LIMA_BEG ! with indices in the range : -INTEGER :: NSV_LIMA_END ! NSV_LIMA_BEG_A...NSV_LIMA_END_A -INTEGER :: NSV_LIMA_NC ! -INTEGER :: NSV_LIMA_NR ! -INTEGER :: NSV_LIMA_CCN_FREE ! -INTEGER :: NSV_LIMA_CCN_ACTI ! -INTEGER :: NSV_LIMA_SCAVMASS ! -INTEGER :: NSV_LIMA_NI ! -INTEGER :: NSV_LIMA_IFN_FREE ! -INTEGER :: NSV_LIMA_IFN_NUCL ! -INTEGER :: NSV_LIMA_IMM_NUCL ! -INTEGER :: NSV_LIMA_HOM_HAZE ! -INTEGER :: NSV_LIMA_SPRO ! -! -#ifdef MNH_FOREFIRE -INTEGER :: NSV_FF = 0 ! number of ForeFire scalar variables -INTEGER :: NSV_FFBEG = 0 ! with indices in the range : -INTEGER :: NSV_FFEND = 0 ! NSV_FFBEG...NSV_FFEND -#endif -! -INTEGER :: NSV_SNW = 0 ! number of blowing snow scalar variables -INTEGER :: NSV_SNWBEG = 0 ! with indices in the range : -INTEGER :: NSV_SNWEND = 0 ! NSV_SNWBEG...NSV_SNWEND - -END MODULE MODD_NSV diff --git a/src/mesonh/micro/mode_qsatmx_tab.F90 b/src/mesonh/micro/mode_qsatmx_tab.F90 new file mode 100644 index 0000000000000000000000000000000000000000..01d697b19bdeeb1cc011c4826e8c37da037cb944 --- /dev/null +++ b/src/mesonh/micro/mode_qsatmx_tab.F90 @@ -0,0 +1,27 @@ +MODULE MODE_QSATMX_TAB +IMPLICIT NONE +CONTAINS +FUNCTION QSATMX_TAB(P,T,FICE) + + USE PARKIND1, ONLY : JPRB + USE MODD_CST ,ONLY : XEPSILO + USE MODE_TIWMX, ONLY : ESATI,ESATW + + IMPLICIT NONE + + REAL :: QSATMX_TAB + REAL, INTENT(IN) :: P,T,FICE + + REAL :: ZES + + ZES = ESATI(T)*FICE + ESATW(T)*(1.-FICE) + IF(ZES >= P)THEN ! temp > boiling point, condensation not possible. + ! Then this function lacks physical meaning, + ! here set to one + QSATMX_TAB = 1. + ELSE + QSATMX_TAB = XEPSILO*ZES/(P-ZES) !r + ENDIF + +END FUNCTION QSATMX_TAB +END MODULE MODE_QSATMX_TAB diff --git a/src/mesonh/micro/radtr_satel.f90 b/src/mesonh/micro/radtr_satel.f90 new file mode 100644 index 0000000000000000000000000000000000000000..ccad5e716ca659cfd4a058ce37ea5b38b06ad531 --- /dev/null +++ b/src/mesonh/micro/radtr_satel.f90 @@ -0,0 +1,738 @@ +!MNH_LIC Copyright 2000-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. +!----------------------------------------------------------------- +! ####################### + MODULE MODI_RADTR_SATEL +! ####################### +INTERFACE +! + SUBROUTINE RADTR_SATEL(KYEARF, KMONTHF, KDAYF, PSECF, & + KDLON, KFLEV, KSTATM, KRAD_COLNBR, PEMIS, PCCO2, & + PTSRAD, PSTATM, PTHT, PRT, PPABST, PZZ, & + PSIGS, PMFCONV, PCLDFR, OUSERI, OSIGMAS, & + OSUBG_COND, ORAD_SUBG_COND, PIRBT, PWVBT, KGEO,PSIGQSAT ) +! +INTEGER, INTENT(IN) :: KYEARF ! year of Final date +INTEGER, INTENT(IN) :: KMONTHF ! month of Final date +INTEGER, INTENT(IN) :: KDAYF ! day of Final date +REAL, INTENT(IN) :: PSECF ! number of seconds since date at 00 UTC +! +INTEGER, INTENT(IN) :: KDLON !number of columns where the + !radiation calculations are performed +INTEGER, INTENT(IN) :: KFLEV !number of vertical levels where the + !radiation calculations are performed +INTEGER, INTENT(IN) :: KSTATM !index of the standard atmosphere level + !just above the model top +INTEGER, INTENT(IN) :: KRAD_COLNBR !factor by which the memory is split +! +REAL, DIMENSION(:,:), INTENT(IN) :: PEMIS !Surface IR EMISsivity +REAL, INTENT(IN) :: PCCO2 !CO2 content +REAL, DIMENSION(:,:), INTENT(IN) :: PTSRAD !RADiative Surface Temperature +REAL, DIMENSION(:,:), INTENT(IN) :: PSTATM !selected standard atmosphere +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT !THeta at t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT !moist variables at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST !pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ !Model level heights +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s from turbulence scheme +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! cloud fraction +! +LOGICAL, INTENT(IN) :: OUSERI ! logical switch to compute both + ! liquid and solid condensate (OUSERI=.TRUE.) + ! or only liquid condensate (OUSERI=.FALSE.) +LOGICAL, INTENT(IN) :: OSIGMAS! use present global Sigma_s values + ! or that from turbulence scheme +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid Condensation + ! (prognotic mode) +LOGICAL, INTENT(IN) :: ORAD_SUBG_COND ! Switch for Subgrid Condensation + ! (diagnostic mode) +! +REAL, DIMENSION(:,:), INTENT(OUT):: PIRBT !IR Brightness Temp. (K) +REAL, DIMENSION(:,:), INTENT(OUT):: PWVBT !WV Brightness Temp. (K) +! +INTEGER, INTENT(IN) :: KGEO !SATELLITE INDEX +REAL, INTENT(IN) :: PSIGQSAT ! use an extra "qsat" variance contribution (OSIGMAS case) +! +END SUBROUTINE RADTR_SATEL +END INTERFACE +END MODULE MODI_RADTR_SATEL +! ##################################################################### + SUBROUTINE RADTR_SATEL(KYEARF, KMONTHF, KDAYF, PSECF, & + KDLON, KFLEV, KSTATM, KRAD_COLNBR, PEMIS, PCCO2, & + PTSRAD, PSTATM, PTHT, PRT, PPABST, PZZ, & + PSIGS, PMFCONV, PCLDFR, OUSERI, OSIGMAS, & + OSUBG_COND, ORAD_SUBG_COND, PIRBT, PWVBT, KGEO,PSIGQSAT) +! ##################################################################### +! +!!**** *RADTR_SATEL* - +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! Chaboureau, J.-P., J.-P. Cammas, P. Mascart, J.-P. Pinty, C. Claud, R. Roca, +!! and J.-J. Morcrette, 2000: Evaluation of a cloud system life-cycle simulated +!! by Meso-NH during FASTEX using METEOSAT radiances and TOVS-3I cloud retrievals. +!! Q. J. R. Meteorol. Soc., 126, 1735-1750. +!! Chaboureau, J.-P. and P. Bechtold, 2002: A simple cloud parameterization from +!! cloud resolving model data: Theory and application. J. Atmos. Sci., 59, 2362-2372. +!! +!! AUTHOR +!! ------ +!! J.-P. Chaboureau *L.A.* +!! +!! MODIFICATIONS +!! ------------- +!! Original 29/03/00 +!! J.-P. Chaboureau 15/04/03 add call to the subgrid condensation scheme +!! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!! G.Delautier 04/2016 : BUG JPHEXT +!! S. Riette 11/2016 : Condensation interface changed +! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST +USE MODD_PARAMETERS +USE MODD_GRID_n +! +USE MODD_RAD_TRANSF +USE MODE_ll +! +USE MODI_INIT_NBMOD +USE MODI_DETER_ANGLE +USE MODI_MAKE_RADSAT +! +USE MODI_CONDENSATION +! +IMPLICIT NONE +! +!* 0.1 DECLARATIONS OF DUMMY ARGUMENTS : +! +INTEGER, INTENT(IN) :: KYEARF ! year of Final date +INTEGER, INTENT(IN) :: KMONTHF ! month of Final date +INTEGER, INTENT(IN) :: KDAYF ! day of Final date +REAL, INTENT(IN) :: PSECF ! number of seconds since date at 00 UTC +! +INTEGER, INTENT(IN) :: KDLON !number of columns where the + ! radiation calculations are performed +INTEGER, INTENT(IN) :: KFLEV !number of vertical levels where the + ! radiation calculations are performed +INTEGER, INTENT(IN) :: KSTATM !index of the standard atmosphere level + !just above the model top +INTEGER, INTENT(IN) :: KRAD_COLNBR !factor by which the memory is split +! +REAL, DIMENSION(:,:), INTENT(IN) :: PEMIS !Surface IR EMISsivity +REAL, INTENT(IN) :: PCCO2 !CO2 content +REAL, DIMENSION(:,:), INTENT(IN) :: PTSRAD !RADiative Surface Temperature +REAL, DIMENSION(:,:), INTENT(IN) :: PSTATM !selected standard atmosphere +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT !THeta at t +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT !moist variables at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST !pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ !Model level heights +! +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s from turbulence scheme +REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV! convective mass flux (kg /s m^2) +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCLDFR ! cloud fraction +! +LOGICAL, INTENT(IN) :: OUSERI ! logical switch to compute both + ! liquid and solid condensate (OUSERI=.TRUE.) + ! or only liquid condensate (OUSERI=.FALSE.) +LOGICAL, INTENT(IN) :: OSIGMAS! use present global Sigma_s values + ! or that from turbulence scheme +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid Condensation + ! (prognotic mode) +LOGICAL, INTENT(IN) :: ORAD_SUBG_COND ! Switch for Subgrid Condensation + ! (diagnostic mode) +! +REAL, DIMENSION(:,:), INTENT(OUT):: PIRBT !IR Brightness Temp. (K) +REAL, DIMENSION(:,:), INTENT(OUT):: PWVBT !WV Brightness Temp. (K) +! +INTEGER, INTENT(IN) :: KGEO !SATELLITE INDEX +REAL, INTENT(IN) :: PSIGQSAT ! use an extra "qsat" variance contribution (OSIGMAS case) +! +!* 0.2 DECLARATIONS OF LOCAL VARIABLES +! +LOGICAL :: GPTDEP, GPVOIGT +! +! reference state +!from inprof +INTEGER :: IGL, ICABS, ING1, IUABS, IINIS, IENDS, ICONF, ICLOUD, IOVLP +INTEGER :: IH2O, ICO2, IO3, ICNT, IN2O, ICH4, ICO, IC11, IC12, ICFC +! +LOGICAL, DIMENSION(KDLON) :: GDOIT_2D ! .TRUE. for the larger scale +LOGICAL, DIMENSION(KDLON,KFLEV) :: GDOIT ! .TRUE. for all the levels of the + ! larger scale columns +! +INTEGER :: JI,JJ,JK,JK1,JK2,JKRAD ! loop indexes +! +INTEGER :: IIB,IIE ! I index value of the first/last inner mass point +INTEGER :: IJB,IJE ! J index value of the first/last inner mass point +INTEGER :: IKB,IKE ! K index value of the first/last inner mass point +INTEGER :: IIU ! array size for the first index +INTEGER :: IJU ! array size for the second index +INTEGER :: IKU ! array size for the third index +INTEGER :: IIJ ! reformatted array index +INTEGER :: IKSTAE ! level number of the STAndard atmosphere array +INTEGER :: IKUP ! vertical level above which STAndard atmosphere data +INTEGER :: IDOIT_COL ! number of larger scale columns +INTEGER :: IDOIT ! number of levels corresponding of the larger scale + ! columns are filled in +INTEGER :: IDIM ! effective number of columns for which the radiation + ! code is run +INTEGER, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,3)) :: IKKOZ ! indice array used to + ! vertically interpolate the ozone content on the model grid +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTAVE ! mean-layer temperature +REAL, DIMENSION(:,:), ALLOCATABLE :: ZQVAVE ! mean-layer specific humidity +REAL, DIMENSION(:,:), ALLOCATABLE :: ZO3AVE ! mean-layer ozone content +REAL, DIMENSION(:,:), ALLOCATABLE :: ZPRES_HL ! half-level pressure +REAL, DIMENSION(:,:), ALLOCATABLE :: ZT_HL ! half-level temperature +REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLDLD ! Downward cloud emissivity +REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLDLU ! Upward cloud emissivity +REAL, DIMENSION(:), ALLOCATABLE :: ZVIEW ! cosecant of viewing angle +REAL, DIMENSION(:), ALLOCATABLE :: ZREMIS ! Reformatted PEMIS array +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZEXNT ! Exner function +REAL, DIMENSION(SIZE(PSTATM,1)) :: ZSTAZZ,ZSTAOZ ! STAndard atmosphere height + ! and OZone content +REAL :: ZOZ ! variable used to interpolate the ozone profile +! +REAL, DIMENSION(:), ALLOCATABLE :: ZDT0 ! surface discontinuity +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRADBT +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRADBC +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRADFT +REAL, DIMENSION(:), ALLOCATABLE :: ZULAT +REAL, DIMENSION(:), ALLOCATABLE :: ZULON +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZZRADFT +! +REAL, DIMENSION(:), ALLOCATABLE :: ZWORK1, ZWORK3 +! +! split arrays used to split the memory required by the ECMWF_radiation +! subroutine, the fields have the same meaning as their complete counterpart +REAL, DIMENSION(:), ALLOCATABLE :: ZREMIS_SPLIT +REAL, DIMENSION(:,:), ALLOCATABLE :: ZO3AVE_SPLIT +REAL, DIMENSION(:,:), ALLOCATABLE :: ZT_HL_SPLIT +REAL, DIMENSION(:,:), ALLOCATABLE :: ZPRES_HL_SPLIT +REAL, DIMENSION(:,:), ALLOCATABLE :: ZQVAVE_SPLIT +REAL, DIMENSION(:,:), ALLOCATABLE :: ZTAVE_SPLIT +REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLDLD_SPLIT +REAL, DIMENSION(:,:), ALLOCATABLE :: ZCLDLU_SPLIT +REAL, DIMENSION(:), ALLOCATABLE :: ZVIEW_SPLIT +REAL, DIMENSION(:), ALLOCATABLE :: ZDT0_SPLIT +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRADBT_SPLIT +REAL, DIMENSION(:,:), ALLOCATABLE :: ZRADBC_SPLIT +! +INTEGER :: JI_SPLIT ! loop on the split array +INTEGER :: INUM_CALL ! number of CALL of the radiation scheme +INTEGER :: IDIM_EFF ! effective number of air-columns to compute +INTEGER :: IDIM_RESIDUE ! number of remaining air-columns to compute +INTEGER :: IBEG, IEND ! auxiliary indices +! +! Other arrays for emissivity +REAL :: ZFLWP, ZFIWP, ZANGCOR, ZRADLP, ZMULTS, ZTMP, ZKI +! +! Other arrays for condensation +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTEMP ! Temperature +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSIGRC ! s r_c / sig_s^2 +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZNCLD ! grid scale cloud fraction +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRC_IN, ZRC_OUT ! grid scale r_c mixing ratio (kg/kg) +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRI_IN, ZRI_OUT ! grid scale r_i (kg/kg) +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRV_IN, ZRV_OUT ! grid scale r_v (kg/kg) +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO +REAL, DIMENSION(SIZE(PPABST,1),SIZE(PPABST,2)) :: ZSIGQSAT2D +!---------------------------------------------------------------------------- +! +!* 1. INITIALIZATION OF CONSTANTS FOR TRANSFERT CODE +! ---------------------------------------------- +! +CALL INIT_NBMOD(KFLEV, IGL, ICABS, ING1, IUABS, IINIS, IENDS, & + IH2O, ICO2, IO3, ICNT, IN2O, ICH4, ICO, IC11, IC12, ICFC, & + ICONF, ICLOUD, IOVLP, GPVOIGT, GPTDEP) +X1CO2 = PCCO2 / 44.0 * XMD +! +!---------------------------------------------------------------------------- +! +!* 2. COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES +! ---------------------------------------------- +! +IIU = SIZE(PTHT,1) +IJU = SIZE(PTHT,2) +IKU = SIZE(PTHT,3) +CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) +IKB = 1 + JPVEXT +IKE = IKU - JPVEXT +! +IKSTAE = SIZE(PSTATM,1) +IKUP = IKE-JPVEXT+1 +! +!---------------------------------------------------------------------------- +! +!* 3. INITIALIZES THE MEAN-LAYER VARIABLES +! ------------------------------------ +! +ALLOCATE(ZEXNT(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3))) +ZEXNT(:,:,:)= ( PPABST(:,:,:)/XP00 ) ** (XRD/XCPD) +! +ALLOCATE(ZTAVE(KDLON,KFLEV)) +ALLOCATE(ZQVAVE(KDLON,KFLEV)) +! +ZQVAVE(:,:) = 0.0 +! +DO JK=IKB,IKE + JKRAD = JK-JPVEXT + DO JJ=IJB,IJE + DO JI=IIB,IIE + IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) + ZTAVE(IIJ,JKRAD) = PTHT(JI,JJ,JK)*ZEXNT(JI,JJ,JK) + END DO + END DO +END DO +! +! Check if the humidity mixing ratio is available +! +IF( SIZE(PRT(:,:,:,:),4) >= 1 ) THEN + DO JK=IKB,IKE + JKRAD = JK-JPVEXT + DO JJ=IJB,IJE + DO JI=IIB,IIE + IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) + ZQVAVE(IIJ,JKRAD) = PRT(JI,JJ,JK,1) + END DO + END DO + END DO +END IF +! +! Standard atmosphere extension +! +DO JK=IKUP,KFLEV + JK1 = (KSTATM-1)+(JK-IKUP) + JK2 = JK1+1 + ZTAVE(:,JK) = 0.5*( PSTATM(JK1,3)+PSTATM(JK2,3) ) + ZQVAVE(:,JK) = 0.5*( PSTATM(JK1,5)/PSTATM(JK1,4)+ & + PSTATM(JK2,5)/PSTATM(JK2,4) ) +END DO +! +!---------------------------------------------------------------------------- +! +!* 4. INITIALIZES THE HALF-LEVEL VARIABLES +! ------------------------------------ +! +ALLOCATE(ZPRES_HL(KDLON,KFLEV+1)) +ALLOCATE(ZT_HL(KDLON,KFLEV+1)) +! +DO JK=IKB,IKE+1 + JKRAD = JK-JPVEXT + DO JJ=IJB,IJE + DO JI=IIB,IIE + IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) + ZPRES_HL(IIJ,JKRAD) = XP00 * & + (0.5*(ZEXNT(JI,JJ,JK)+ZEXNT(JI,JJ,JK-1)))**(XCPD/XRD) + END DO + END DO +END DO +! +! Standard atmosphere extension +! begining at ikup+1 level allows to use a model domain higher than 50km +! +DO JK=IKUP+1,KFLEV+1 + JK1 = (KSTATM-1)+(JK-IKUP) + ZPRES_HL(:,JK) = PSTATM(JK1,2)*100.0 +END DO +! +! Surface temperature at the first level +DO JJ=IJB,IJE + DO JI=IIB,IIE + IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) + ZT_HL(IIJ,1) = PTSRAD(JI,JJ) + END DO +END DO +! +! Temperature at half levels +ZT_HL(:,2:IKE-JPVEXT) = 0.5*(ZTAVE(:,1:IKE-JPVEXT-1)+ZTAVE(:,2:IKE-JPVEXT)) +! +DO JJ=IJB,IJE + DO JI=IIB,IIE + IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) + ZT_HL(IIJ,IKE-JPVEXT+1) = 0.5*PTHT(JI,JJ,IKE )*ZEXNT(JI,JJ,IKE ) & + + 0.5*PTHT(JI,JJ,IKE+1)*ZEXNT(JI,JJ,IKE+1) + END DO +END DO +! +! Standard atmosphere extension +! begining at ikup+1 level allows to use a model domain higher than 50km +! +DO JK=IKUP+1,KFLEV+1 + JK1 = (KSTATM-1)+(JK-IKUP) + ZT_HL(:,JK) = PSTATM(JK1,3) +END DO +! +!---------------------------------------------------------------------------- +! +!* 5. INITIALIZES THE OZONE PROFILES from the standard atmosphere +! ------------------------------ +! +ALLOCATE(ZO3AVE(KDLON,KFLEV)) +! +ZSTAOZ(:) = PSTATM(:,6)/PSTATM(:,4) +ZSTAZZ(:) = 1000.0*PSTATM(:,1) +! +DO JJ = IJB,IJE + DO JK2 = IKB,IKE + JKRAD = JK2-JPVEXT + IKKOZ(:,JK2) = IKB-1 + DO JK1 = 1,IKSTAE + DO JI = IIB,IIE + IKKOZ(JI,JK2)=IKKOZ(JI,JK2) + NINT(0.5 + SIGN(0.5, & + -ZSTAZZ(JK1)+0.5*(PZZ(JI,JJ,JK2)+PZZ(JI,JJ,JK2+1)) )) + END DO + END DO + DO JI = IIB,IIE + ZOZ=(0.5*(PZZ(JI,JJ,JK2)+PZZ(JI,JJ,JK2+1))- ZSTAZZ(IKKOZ(JI,JK2))) & + /( ZSTAZZ(IKKOZ(JI,JK2)+1) - ZSTAZZ(IKKOZ(JI,JK2))) + IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) + ZO3AVE(IIJ,JKRAD) =( (1.- ZOZ) * ZSTAOZ(IKKOZ(JI,JK2)) & + + ZOZ * ZSTAOZ(IKKOZ(JI,JK2)+1)) + END DO + END DO +END DO +! +DO JK=IKUP,KFLEV + JK1 = (KSTATM)+(JK-IKUP) + ZO3AVE(:,JK) = ZSTAOZ(JK1) +END DO +! +!---------------------------------------------------------------------------- +! +!* 6. CALLS THE E.C.M.W.F. RADIATION CODE +! ----------------------------------- +! +!* 6.1 INITIALIZES 2D AND SURFACE FIELDS +! +ALLOCATE(ZREMIS(KDLON)) +DO JJ=IJB,IJE + DO JI=IIB,IIE + IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) + ZREMIS(IIJ) = PEMIS(JI,JJ) + END DO +END DO +! +! initializes surface discontinuity field +ALLOCATE(ZDT0(KDLON)) +DO JJ=IJB,IJE + DO JI=IIB,IIE + IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) + ZDT0(IIJ) = PTSRAD(JI,JJ) - PTHT(JI,JJ,1)*ZEXNT(JI,JJ,1) + END DO +END DO +! +ALLOCATE(ZULAT(KDLON)) +ALLOCATE(ZULON(KDLON)) +DO JJ=IJB,IJE + DO JI=IIB,IIE + IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) + ZULON(IIJ) = XLON(JI,JJ) + ZULAT(IIJ) = XLAT(JI,JJ) + END DO +END DO +ALLOCATE(ZVIEW(KDLON)) +CALL DETER_ANGLE(KGEO, KDLON, ZULAT, ZULON, ZVIEW) +DEALLOCATE(ZULAT) +DEALLOCATE(ZULON) +! +! +ALLOCATE(ZCLDLD(KDLON,KFLEV)) +ALLOCATE(ZCLDLU(KDLON,KFLEV)) +ZCLDLD = 0. +ZCLDLU = 0. +! +IF( SIZE(PRT(:,:,:,:),4) >= 2 ) THEN + ALLOCATE(ZNCLD(IIU,IJU,IKU)) + ALLOCATE(ZRC_IN(IIU,IJU,IKU)) + ALLOCATE(ZRC_OUT(IIU,IJU,IKU)) + ZRC_IN=PRT(:,:,:,2) + ALLOCATE(ZRI_IN(IIU,IJU,IKU)) + ALLOCATE(ZRI_OUT(IIU,IJU,IKU)) + ZRI_IN=0. + IF( OUSERI ) ZRI_IN=PRT(:,:,:,4) + IF ( .NOT. OSUBG_COND .AND. ORAD_SUBG_COND) THEN + PRINT*,' THE SUBGRID CONDENSATION SCHEME IN DIAGNOSTIC MODE IS ACTIVATED' + ALLOCATE(ZTEMP(IIU,IJU,IKU)) + ZTEMP=PTHT*ZEXNT + ALLOCATE(ZSIGRC(IIU,IJU,IKU)) + ALLOCATE(ZRV_IN(IIU,IJU,IKU)) + + ZRV_IN=PRT(:,:,:,1) + ALLOCATE(ZRHO(IIU,IJU,IKU)) + ZRHO=1. !unused + ZSIGQSAT2D(:,:)=PSIGQSAT + CALL CONDENSATION( IIU, IJU, IKU, IIB, IIE, IJB, IJE, IKB, IKE, 1, 'T', 'CB02', 'CB',& + PPABST, PZZ, ZRHO, ZTEMP, ZRV_IN, ZRV_OUT, ZRC_IN, ZRC_OUT, ZRI_IN, ZRI_OUT, PRT(:,:,:,5), PRT(:,:,:,6), PSIGS,& + PMFCONV, ZNCLD, ZSIGRC, OUSERI, OSIGMAS, .FALSE., PSIGQSAT=ZSIGQSAT2D ) + DEALLOCATE(ZTEMP,ZSIGRC) + DEALLOCATE(ZRV_OUT) + ELSE + ZNCLD=PCLDFR + END IF + DO JK=IKB,IKE-1 + JKRAD = JK-JPVEXT + DO JJ=IJB,IJE + DO JI=IIB,IIE + IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) + IF ( ZVIEW(IIJ) /= XUNDEF .AND. & + (ZRC_OUT(JI,JJ,JK) > 0. .OR. ZRI_OUT(JI,JJ,JK) > 0. ) ) THEN + ZFLWP = ZRC_OUT(JI,JJ,JK) / XG /MAX(1.E-10,ZNCLD(JI,JJ,JK)) & + * (PPABST(JI,JJ,JK)-PPABST(JI,JJ,JK+1)) + ZFIWP = ZRI_OUT(JI,JJ,JK) / XG /MAX(1.E-10,ZNCLD(JI,JJ,JK)) & + * (PPABST(JI,JJ,JK)-PPABST(JI,JJ,JK+1)) + ZANGCOR = ZVIEW(IIJ) / 1.66 + !!!Parametrization following Ou and Chou, 1995 (Atmos. Res.) + ZTMP = ZTAVE(IIJ,JKRAD)-XTT !ZTMP in Celsius degree + ZRADLP = 326.3+12.42*ZTMP+0.197*(ZTMP**2)+0.0012*(ZTMP**3) + ZRADLP = MIN(140., MAX(20., ZRADLP)) +!!! Parametrization following Ebert and Curry, 1992 (JGR-d) + ZKI = 0.3 + 1290. / ZRADLP + ZCLDLD(IIJ,JKRAD) = ZNCLD(JI,JJ,JK)*(1.-EXP & + ( -158.*ZFLWP *ZANGCOR-ZKI*ZFIWP*ZVIEW(IIJ))) + ZCLDLU(IIJ,JKRAD) = ZNCLD(JI,JJ,JK)*(1.-EXP & + ( -130.*ZFLWP *ZANGCOR-ZKI*ZFIWP*ZVIEW(IIJ))) + END IF + END DO + END DO + END DO + DEALLOCATE(ZNCLD,ZRC_OUT,ZRI_OUT) +END IF +! +DEALLOCATE(ZEXNT) +! +GDOIT_2D(:) = .FALSE. +! +! Flags the columns for which the computations have to be performed +! +DO JJ=IJB,IJE + DO JI=IIB,IIE + IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) + IF (ZVIEW(IIJ) /= XUNDEF) GDOIT_2D(IIJ) = .TRUE. + END DO +END DO +IDOIT_COL = COUNT( GDOIT_2D(:) ) ! number of larger scale columns +! +GDOIT(:,:) = SPREAD( GDOIT_2D(:),DIM=2,NCOPIES=KFLEV ) +IDOIT = IDOIT_COL*KFLEV +ALLOCATE(ZWORK1(IDOIT)) +! +! temperature profiles +ZWORK1(:) = PACK( ZTAVE(:,:),MASK=GDOIT(:,:) ) +DEALLOCATE(ZTAVE) +ALLOCATE(ZTAVE(IDOIT_COL,KFLEV)) +ZTAVE(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) ) +! +! vapor mixing ratio profiles +ZWORK1(:) = PACK( ZQVAVE(:,:),MASK=GDOIT(:,:) ) +DEALLOCATE(ZQVAVE) +ALLOCATE(ZQVAVE(IDOIT_COL,KFLEV)) +ZQVAVE(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) ) +! +! cloud emissivities +ZWORK1(:) = PACK( ZCLDLD(:,:),MASK=GDOIT(:,:) ) +DEALLOCATE(ZCLDLD) +ALLOCATE(ZCLDLD(IDOIT_COL,KFLEV)) +ZCLDLD(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) ) +! +ZWORK1(:) = PACK( ZCLDLU(:,:),MASK=GDOIT(:,:) ) +DEALLOCATE(ZCLDLU) +ALLOCATE(ZCLDLU(IDOIT_COL,KFLEV)) +ZCLDLU(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) ) +! +! ozone content profiles +ZWORK1(:) = PACK( ZO3AVE(:,:),MASK=GDOIT(:,:) ) +DEALLOCATE(ZO3AVE) +ALLOCATE(ZO3AVE(IDOIT_COL,KFLEV)) +ZO3AVE(:,:) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) ) +! +! half-level variables +ZWORK1(:) = PACK( ZPRES_HL(:,1:KFLEV),MASK=GDOIT(:,:) ) +DEALLOCATE(ZPRES_HL) +ALLOCATE(ZPRES_HL(IDOIT_COL,KFLEV+1)) +ZPRES_HL(:,1:KFLEV) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) ) +ZPRES_HL(:,KFLEV+1) = PSTATM(IKSTAE,2)*100.0 +! +ZWORK1(:) = PACK( ZT_HL(:,1:KFLEV),MASK=GDOIT(:,:) ) +DEALLOCATE(ZT_HL) +ALLOCATE(ZT_HL(IDOIT_COL,KFLEV+1)) +ZT_HL(:,1:KFLEV) = RESHAPE( ZWORK1(:),(/IDOIT_COL,KFLEV/) ) +ZT_HL(:,KFLEV+1) = PSTATM(IKSTAE,3) +! +! surface fields +ALLOCATE(ZWORK3(IDOIT_COL)) +ZWORK3(:) = PACK( ZVIEW(:),MASK=GDOIT_2D(:) ) +DEALLOCATE(ZVIEW) +ALLOCATE(ZVIEW(IDOIT_COL)) +ZVIEW(:) = ZWORK3(:) +! +ZWORK3(:) = PACK( ZREMIS(:),MASK=GDOIT_2D(:) ) +DEALLOCATE(ZREMIS) +ALLOCATE(ZREMIS(IDOIT_COL)) +ZREMIS(:) = ZWORK3(:) +! +ZWORK3(:) = PACK( ZDT0(:),MASK=GDOIT_2D(:) ) +DEALLOCATE(ZDT0) +ALLOCATE(ZDT0(IDOIT_COL)) +ZDT0(:) = ZWORK3(:) +! +DEALLOCATE(ZWORK1) +DEALLOCATE(ZWORK3) +! +! radiation fields +ALLOCATE(ZRADBC(IDOIT_COL,JPWVINT)) +ALLOCATE(ZRADBT(IDOIT_COL,JPWVINT)) +! +IDIM = IDOIT_COL +PRINT *,'KGEO =',KGEO,' IDIM =',IDIM +! +!* 6.2 CALLS THE ECMWF_RADIATION ROUTINES +! +! *********************************************************** +! *CAUTION: Routine nbmvec is written in FORTRAN 77* +! *********************************************************** +! +! mixing ratio -> specific humidity conversion +ZQVAVE(:,:) = ZQVAVE(:,:) / (1.+ZQVAVE(:,:)) +! +IF( IDIM <= KRAD_COLNBR ) THEN + ! + ! there is less than KRAD_COLNBR verticals to be considered therefore + ! no split of the arrays is performed + ! + CALL NBMVEC( 1, IDIM, IDIM, KFLEV, IGL, ICABS, ING1, IUABS, & + IH2O, ICO2, IO3, ICNT, IN2O, ICH4, ICO, IC11, IC12, ICFC, & + IINIS, IENDS, ICONF, ICLOUD, IOVLP, GPVOIGT, GPTDEP, & + ZTAVE, ZQVAVE, ZO3AVE, ZPRES_HL, ZT_HL, & + ZVIEW, ZCLDLD, ZCLDLU, ZDT0, ZREMIS, ZRADBC, ZRADBT) +ELSE + ! + ! the splitting of the arrays will be performed + ! + INUM_CALL = CEILING( REAL( IDIM ) / REAL( KRAD_COLNBR ) ) + IDIM_RESIDUE = IDIM + DO JI_SPLIT = 1 , INUM_CALL + IDIM_EFF = MIN( IDIM_RESIDUE,KRAD_COLNBR ) + ! + IF( JI_SPLIT == 1 .OR. JI_SPLIT == INUM_CALL ) THEN + ALLOCATE( ZREMIS_SPLIT(IDIM_EFF)) + ALLOCATE( ZO3AVE_SPLIT(IDIM_EFF,KFLEV)) + ALLOCATE( ZT_HL_SPLIT(IDIM_EFF,KFLEV+1)) + ALLOCATE( ZPRES_HL_SPLIT(IDIM_EFF,KFLEV+1)) + ALLOCATE( ZQVAVE_SPLIT(IDIM_EFF,KFLEV)) + ALLOCATE( ZTAVE_SPLIT(IDIM_EFF,KFLEV)) + ALLOCATE( ZCLDLU_SPLIT(IDIM_EFF,KFLEV)) + ALLOCATE( ZCLDLD_SPLIT(IDIM_EFF,KFLEV)) + ALLOCATE( ZVIEW_SPLIT(IDIM_EFF)) + ALLOCATE( ZDT0_SPLIT(IDIM_EFF)) + ALLOCATE( ZRADBT_SPLIT(IDIM_EFF,JPWVINT)) + ALLOCATE( ZRADBC_SPLIT(IDIM_EFF,JPWVINT)) + END IF + ! + ! fill the split arrays with their values + ! taken from the full arrays + ! + IBEG = IDIM-IDIM_RESIDUE+1 + IEND = IBEG+IDIM_EFF-1 + ZREMIS_SPLIT(:) = ZREMIS( IBEG:IEND ) + ZO3AVE_SPLIT(:,:) = ZO3AVE( IBEG:IEND ,:) + ZT_HL_SPLIT(:,:) = ZT_HL( IBEG:IEND ,:) + ZPRES_HL_SPLIT(:,:) = ZPRES_HL( IBEG:IEND ,:) + ZQVAVE_SPLIT(:,:) = ZQVAVE( IBEG:IEND ,:) + ZTAVE_SPLIT(:,:) = ZTAVE ( IBEG:IEND ,:) + ZCLDLU_SPLIT(:,:) = ZCLDLU ( IBEG:IEND ,:) + ZCLDLD_SPLIT(:,:) = ZCLDLD ( IBEG:IEND ,:) + ZVIEW_SPLIT(:) = ZVIEW ( IBEG:IEND ) + ZDT0_SPLIT(:) = ZDT0 ( IBEG:IEND ) + ! + ! call ECMWF_radiation with the split arrays + ! + CALL NBMVEC( 1, IDIM_EFF, IDIM_EFF, KFLEV, IGL, ICABS, ING1, IUABS,& + IH2O, ICO2, IO3, ICNT, IN2O, ICH4, ICO, IC11, IC12, ICFC, & + IINIS, IENDS, ICONF, ICLOUD, IOVLP, GPVOIGT, GPTDEP, & + ZTAVE_SPLIT, ZQVAVE_SPLIT, ZO3AVE_SPLIT, & + ZPRES_HL_SPLIT, ZT_HL_SPLIT, & + ZVIEW_SPLIT, ZCLDLD_SPLIT, ZCLDLU_SPLIT, ZDT0_SPLIT, & + ZREMIS_SPLIT, ZRADBC_SPLIT, ZRADBT_SPLIT) + ! + ! fill the full output arrays with the split arrays + ! + ZRADBT( IBEG:IEND ,:) = ZRADBT_SPLIT(:,:) + ZRADBC( IBEG:IEND ,:) = ZRADBC_SPLIT(:,:) + ! + IDIM_RESIDUE = IDIM_RESIDUE - IDIM_EFF + ! + ! desallocation of the split arrays + ! + IF( JI_SPLIT >= INUM_CALL-1 ) THEN + DEALLOCATE(ZREMIS_SPLIT) + DEALLOCATE(ZO3AVE_SPLIT) + DEALLOCATE(ZT_HL_SPLIT) + DEALLOCATE(ZPRES_HL_SPLIT) + DEALLOCATE(ZQVAVE_SPLIT) + DEALLOCATE(ZTAVE_SPLIT) + DEALLOCATE(ZCLDLU_SPLIT) + DEALLOCATE(ZCLDLD_SPLIT) + DEALLOCATE(ZVIEW_SPLIT) + DEALLOCATE(ZDT0_SPLIT) + DEALLOCATE(ZRADBT_SPLIT) + DEALLOCATE(ZRADBC_SPLIT) + END IF + END DO +END IF +! +DEALLOCATE(ZTAVE,ZQVAVE,ZO3AVE) +DEALLOCATE(ZPRES_HL,ZT_HL) +DEALLOCATE(ZREMIS) +DEALLOCATE(ZDT0) +DEALLOCATE(ZCLDLD,ZCLDLU) +DEALLOCATE(ZVIEW) +! +ZRADBT = ZRADBT / XPI +ALLOCATE(ZRADFT(IDIM,JPCAN)) +CALL MAKE_RADSAT(KYEARF, KMONTHF, KDAYF, PSECF, & + KGEO, IDIM, ZRADBT, ZRADFT) +DEALLOCATE(ZRADBT) +DEALLOCATE(ZRADBC) +! +ALLOCATE(ZWORK1(IDIM*JPCAN)) +ZWORK1(:) = PACK( ZRADFT(:,:),MASK=.TRUE. ) +ALLOCATE(ZZRADFT(KDLON,JPCAN)) +ZZRADFT(:,:) = UNPACK( ZWORK1(:),MASK=GDOIT(:,1:JPCAN),FIELD=XUNDEF ) +DEALLOCATE(ZRADFT) +DEALLOCATE(ZWORK1) +! +PIRBT = XUNDEF +PWVBT = XUNDEF +DO JJ=IJB,IJE + DO JI=IIB,IIE + IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB) + PIRBT(JI,JJ) = ZZRADFT(IIJ,1) + PWVBT(JI,JJ) = ZZRADFT(IIJ,2) + END DO +END DO +DEALLOCATE(ZZRADFT) +! +END SUBROUTINE RADTR_SATEL diff --git a/src/mesonh/micro/rain_ice.f90 b/src/mesonh/micro/rain_ice.f90 index d736f5a9cc920751da778ad291aa4ad4898d93aa..e6b139e055f168a59da23f171e952bd9afff6004 100644 --- a/src/mesonh/micro/rain_ice.f90 +++ b/src/mesonh/micro/rain_ice.f90 @@ -245,7 +245,7 @@ use MODE_RAIN_ICE_WARM, only: RAIN_ICE_WARM use mode_tools, only: Countjv use mode_tools_ll, only: GET_INDICE_ll -USE MODI_ICE4_RAINFR_VERT +USE MODE_ICE4_RAINFR_VERT IMPLICIT NONE ! diff --git a/src/mesonh/micro/rain_ice_red.f90 b/src/mesonh/micro/rain_ice_red.f90 index e3d0fabd52c8b09aafead4b71716d4e091b87a83..f309723132c26e799d934b13c4935126b82c37dc 100644 --- a/src/mesonh/micro/rain_ice_red.f90 +++ b/src/mesonh/micro/rain_ice_red.f90 @@ -25,9 +25,10 @@ INTERFACE PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & PINPRC,PINPRR, PEVAP3D, & - PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, PSEA, PTOWN, & - PRHT, PRHS, PINPRH, PFPR, & - TBUDGETS, KBUDGETS) + PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & + TBUDGETS, KBUDGETS, & + PSEA, PTOWN, & + PRHT, PRHS, PINPRH, PFPR ) ! ! USE MODD_BUDGET, ONLY: TBUDGETDATA @@ -100,7 +101,7 @@ REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH! Hail instant pre REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes ! TYPE(TBUDGETDATA), OPTIONAL, DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS -INTEGER, INTENT(IN) : KBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS ! END SUBROUTINE RAIN_ICE_RED END INTERFACE @@ -115,9 +116,10 @@ END MODULE MODI_RAIN_ICE_RED PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & PRGT, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & PINPRC, PINPRR, PEVAP3D, & - PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, PSEA, PTOWN, & - PRHT, PRHS, PINPRH, PFPR, & - TBUDGETS, KBUDGETS) + PINPRS, PINPRG, PINDEP, PRAINFR, PSIGS, & + TBUDGETS, KBUDGETS, & + PSEA, PTOWN, & + PRHT, PRHS, PINPRH, PFPR ) ! ###################################################################### ! !!**** * - compute the explicit microphysical sources @@ -281,7 +283,7 @@ END MODULE MODI_RAIN_ICE_RED USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE MODD_BUDGET, ONLY: TBUDGETDATA, LBU_ENABLE, & +USE MODD_BUDGET, ONLY: TBUDGETDATA, LBU_ENABLE, & & LBUDGET_TH, LBUDGET_RV, LBUDGET_RC, LBUDGET_RR, LBUDGET_RI, LBUDGET_RS, LBUDGET_RG, LBUDGET_RH, & & NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH USE MODD_CST, ONLY: XCI, XCL, XCPD, XCPV, XLSTT, XLVTT, XTT, XRHOLW @@ -307,7 +309,6 @@ USE MODE_ICE4_RAINFR_VERT, ONLY: ICE4_RAINFR_VERT USE MODE_ICE4_SEDIMENTATION_STAT, ONLY: ICE4_SEDIMENTATION_STAT USE MODE_ICE4_SEDIMENTATION_SPLIT, ONLY: ICE4_SEDIMENTATION_SPLIT USE MODE_ICE4_SEDIMENTATION_SPLIT_MOMENTUM, ONLY: ICE4_SEDIMENTATION_SPLIT_MOMENTUM -USE MODE_ICE4_NUCLEATION_WRAPPER, ONLY: ICE4_NUCLEATION_WRAPPER USE MODE_ICE4_TENDENCIES, ONLY: ICE4_TENDENCIES ! IMPLICIT NONE diff --git a/src/mesonh/turb/bl_depth_diag.f90 b/src/mesonh/turb/bl_depth_diag.f90 deleted file mode 100644 index 2e7fb121cdda00386511bb0254c18249bec192bb..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/bl_depth_diag.f90 +++ /dev/null @@ -1,200 +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 turb 2006/05/18 13:07:25 -!----------------------------------------------------------------- -! ################ - MODULE MODI_BL_DEPTH_DIAG -! ################ -! -INTERFACE BL_DEPTH_DIAG -! -! - FUNCTION BL_DEPTH_DIAG_3D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) - -INTEGER, INTENT(IN) :: KKB ! bottom point -INTEGER, INTENT(IN) :: KKE ! top point -REAL, DIMENSION(:,:), INTENT(IN) :: PSURF ! surface flux -REAL, DIMENSION(:,:), INTENT(IN) :: PZS ! orography -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLUX ! flux -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points -REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux -REAL, DIMENSION(SIZE(PSURF,1),SIZE(PSURF,2)) :: BL_DEPTH_DIAG_3D -! -END FUNCTION BL_DEPTH_DIAG_3D -! -! - FUNCTION BL_DEPTH_DIAG_1D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) -INTEGER, INTENT(IN) :: KKB ! bottom point -INTEGER, INTENT(IN) :: KKE ! top point -REAL, INTENT(IN) :: PSURF ! surface flux -REAL, INTENT(IN) :: PZS ! orography -REAL, DIMENSION(:), INTENT(IN) :: PFLUX ! flux -REAL, DIMENSION(:), INTENT(IN) :: PZZ ! altitude of flux points -REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux -REAL :: BL_DEPTH_DIAG_1D -! -END FUNCTION BL_DEPTH_DIAG_1D -! -END INTERFACE -! -END MODULE MODI_BL_DEPTH_DIAG -! -!------------------------------------------------------------------------------- -! -! ################ - MODULE MODI_BL_DEPTH_DIAG_3D -! ################ -! -! -INTERFACE -! -! - FUNCTION BL_DEPTH_DIAG_3D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) -INTEGER, INTENT(IN) :: KKB ! bottom point -INTEGER, INTENT(IN) :: KKE ! top point -REAL, DIMENSION(:,:), INTENT(IN) :: PSURF ! surface flux -REAL, DIMENSION(:,:), INTENT(IN) :: PZS ! orography -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLUX ! flux -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points -REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux -REAL, DIMENSION(SIZE(PSURF,1),SIZE(PSURF,2)) :: BL_DEPTH_DIAG_3D -! -END FUNCTION BL_DEPTH_DIAG_3D -! -! -END INTERFACE -! -END MODULE MODI_BL_DEPTH_DIAG_3D -! -!------------------------------------------------------------------------------- -! -FUNCTION BL_DEPTH_DIAG_3D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) -! -! -!!**** *SBL_DEPTH* - computes SBL depth -!! -!! PURPOSE -!! ------- -! -!!** METHOD -!! ------ -!! -!! SBL is defined as the layer where momentum flux is equal to XSBL_FRAC of its surface value -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original nov. 2005 -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -!* 0.1 declarations of arguments -! -IMPLICIT NONE -! -INTEGER, INTENT(IN) :: KKB ! bottom point -INTEGER, INTENT(IN) :: KKE ! top point -REAL, DIMENSION(:,:), INTENT(IN) :: PSURF ! surface flux -REAL, DIMENSION(:,:), INTENT(IN) :: PZS ! orography -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFLUX ! flux -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitude of flux points -REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux -REAL, DIMENSION(SIZE(PSURF,1),SIZE(PSURF,2)) :: BL_DEPTH_DIAG_3D -! -! -! 0.2 declaration of local variables -! -INTEGER :: JI,JJ,JK ! loop counters -INTEGER :: IKL ! +1 : MesoNH levels -1: Arome -REAL :: ZFLX ! flux at top of BL -! -!---------------------------------------------------------------------------- -! -IF (KKB < KKE) THEN - IKL=1 -ELSE - IKL=-1 -ENDIF - -BL_DEPTH_DIAG_3D(:,:) = 0. -! - -DO JJ=1,SIZE(PSURF,2) - DO JI=1,SIZE(PSURF,1) - IF (PSURF(JI,JJ)==0.) CYCLE - DO JK=KKB,KKE,IKL - IF (PZZ(JI,JJ,JK-IKL)<=PZS(JI,JJ)) CYCLE - ZFLX = PSURF(JI,JJ) * PFTOP_O_FSURF - IF ( (PFLUX(JI,JJ,JK)-ZFLX)*(PFLUX(JI,JJ,JK-IKL)-ZFLX) <= 0. ) THEN - BL_DEPTH_DIAG_3D(JI,JJ) = (PZZ (JI,JJ,JK-IKL) - PZS(JI,JJ)) & - + (PZZ (JI,JJ,JK) - PZZ (JI,JJ,JK-IKL)) & - * (ZFLX - PFLUX(JI,JJ,JK-IKL) ) & - / (PFLUX(JI,JJ,JK) - PFLUX(JI,JJ,JK-IKL) ) - EXIT - END IF - END DO - END DO -END DO -! -BL_DEPTH_DIAG_3D(:,:) = BL_DEPTH_DIAG_3D(:,:) / (1. - PFTOP_O_FSURF) -! -END FUNCTION BL_DEPTH_DIAG_3D -! -! -!------------------------------------------------------------------------------- -!------------------------------------------------------------------------------- -! -FUNCTION BL_DEPTH_DIAG_1D(KKB,KKE,PSURF,PZS,PFLUX,PZZ,PFTOP_O_FSURF) -! -USE MODI_BL_DEPTH_DIAG_3D -IMPLICIT NONE -! -INTEGER, INTENT(IN) :: KKB ! bottom point -INTEGER, INTENT(IN) :: KKE ! top point -REAL, INTENT(IN) :: PSURF ! surface flux -REAL, INTENT(IN) :: PZS ! orography -REAL, DIMENSION(:), INTENT(IN) :: PFLUX ! flux -REAL, DIMENSION(:), INTENT(IN) :: PZZ ! altitude of flux points -REAL, INTENT(IN) :: PFTOP_O_FSURF! Flux at BL top / Surface flux -REAL :: BL_DEPTH_DIAG_1D -! -REAL, DIMENSION(1,1) :: ZSURF -REAL, DIMENSION(1,1) :: ZZS -REAL, DIMENSION(1,1,SIZE(PFLUX)) :: ZFLUX -REAL, DIMENSION(1,1,SIZE(PZZ)) :: ZZZ -REAL, DIMENSION(1,1) :: ZBL_DEPTH_DIAG -! -ZSURF = PSURF -ZZS = PZS -ZFLUX(1,1,:) = PFLUX(:) -ZZZ (1,1,:) = PZZ (:) -! -ZBL_DEPTH_DIAG = BL_DEPTH_DIAG_3D(KKB,KKE,ZSURF,ZZS,ZFLUX,ZZZ,PFTOP_O_FSURF) -! -BL_DEPTH_DIAG_1D = ZBL_DEPTH_DIAG(1,1) -! -!------------------------------------------------------------------------------- -! -END FUNCTION BL_DEPTH_DIAG_1D 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/mf_turb_greyzone.f90 b/src/mesonh/turb/mf_turb_greyzone.f90 deleted file mode 100644 index ab28b6c61a22ce0a063e205612358f4fb6dda998..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/mf_turb_greyzone.f90 +++ /dev/null @@ -1,340 +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. -! ######spl - MODULE MODI_MF_TURB_GREYZONE -! ###################### -! -INTERFACE -! ################################################################# - SUBROUTINE MF_TURB_GREYZONE(KKA,KKB,KKE,KKU,KKL,OMIXUV, & - ONOMIXLG,KSV_LGBEG,KSV_LGEND, & - PIMPL, PTSTEP, & - PDZZ, & - PRHODJ, & - PTHLM,PTHVM,PRTM,PUM,PVM,PSVM, & - PTHLDT,PRTDT,PUDT,PVDT,PSVDT, & - PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP,PSV_UP, & - PTHL_DO,PTHV_DO,PRT_DO,PU_DO,PV_DO,PSV_DO, & - PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & - PFLXZSVMF ) - -! ################################################################# -! -! -!* 1.1 Declaration of Arguments -! -! -INTEGER, INTENT(IN) :: KKA ! near ground array index -INTEGER, INTENT(IN) :: KKB ! near ground physical index -INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index -INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise - -LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum -LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer -INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer -INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer -REAL, INTENT(IN) :: PIMPL ! degree of implicitness -REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep -! -REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! metric coefficients - -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size - -! Conservative var. at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM ! conservative pot. temp. -REAL, DIMENSION(:,:), INTENT(IN) :: PRTM ! water var. where -! Virtual potential temperature at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTHVM -! Momentum at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PUM -REAL, DIMENSION(:,:), INTENT(IN) :: PVM -! scalar variables at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM -! -! Tendencies of conservative variables -REAL, DIMENSION(:,:), INTENT(OUT) :: PTHLDT - -REAL, DIMENSION(:,:), INTENT(OUT) :: PRTDT -! Tendencies of momentum -REAL, DIMENSION(:,:), INTENT(OUT) :: PUDT -REAL, DIMENSION(:,:), INTENT(OUT) :: PVDT -! Tendencies of scalar variables -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSVDT - - -! Updraft characteritics -REAL, DIMENSION(:,:), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP -REAL, DIMENSION(:,:), INTENT(IN) :: PTHL_DO,PTHV_DO,PRT_DO,PU_DO,PV_DO -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSV_UP, PSV_DO -! Fluxes -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF - -REAL, DIMENSION(:,:,:), INTENT(OUT):: PFLXZSVMF - -END SUBROUTINE MF_TURB_GREYZONE - -END INTERFACE -! -END MODULE MODI_MF_TURB_GREYZONE -! ################################################################# - SUBROUTINE MF_TURB_GREYZONE(KKA, KKB, KKE, KKU, KKL,OMIXUV, & - ONOMIXLG,KSV_LGBEG,KSV_LGEND, & - PIMPL, PTSTEP, & - PDZZ, & - PRHODJ, & - PTHLM,PTHVM,PRTM,PUM,PVM,PSVM, & - PTHLDT,PRTDT,PUDT,PVDT,PSVDT, & - PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP,PSV_UP, & - PTHL_DO,PTHV_DO,PRT_DO,PU_DO,PV_DO,PSV_DO, & - PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & - PFLXZSVMF ) - -! ################################################################# -! -! -!!**** *MF_TURB_GREYZONE* - computes the MF_turbulent source terms for the prognostic -!! variables. -!! -!! PURPOSE -!! ------- -!!**** The purpose of this routine is to compute the source terms in -!! the evolution equations due to the MF turbulent mixing. -!! The source term is computed as the divergence of the turbulent fluxes. -! -!!** METHOD -!! ------ -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! -!! -!! MODIFICATIONS -!! ------------- -!! 10/2009 (C.Lac) Introduction of different PTSTEP according to the -!! advection schemes -!! 09/2010 (V.Masson) Optimization -!! S. Riette Jan 2012: support for both order of vertical levels -!! suppression of useless initialisations -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAM_MFSHALL_n -! -USE MODI_SHUMAN_MF -USE MODI_TRIDIAG_MASSFLUX -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -! -INTEGER, INTENT(IN) :: KKA ! near ground array index -INTEGER, INTENT(IN) :: KKB ! near ground physical index -INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index -INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum -LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer -INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer -INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer -REAL, INTENT(IN) :: PIMPL ! degree of implicitness -REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep -! -REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! metric coefficients - -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size - -! Conservative var. at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM ! conservative pot. temp. -REAL, DIMENSION(:,:), INTENT(IN) :: PRTM ! water var. where -! Virtual potential temperature at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTHVM -! Momentum at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PUM -REAL, DIMENSION(:,:), INTENT(IN) :: PVM -! scalar variables at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM -! -! Tendencies of conservative variables -REAL, DIMENSION(:,:), INTENT(OUT) :: PTHLDT - -REAL, DIMENSION(:,:), INTENT(OUT) :: PRTDT -! Tendencies of momentum -REAL, DIMENSION(:,:), INTENT(OUT) :: PUDT -REAL, DIMENSION(:,:), INTENT(OUT) :: PVDT -! Tendencies of scalar variables -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSVDT - - -! Updraft/environment characteritics -REAL, DIMENSION(:,:), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP -REAL, DIMENSION(:,:), INTENT(IN) :: PTHL_DO,PTHV_DO,PRT_DO,PU_DO,PV_DO -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSV_UP,PSV_DO -! Fluxes -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF - -REAL, DIMENSION(:,:,:), INTENT(OUT):: PFLXZSVMF -! -! -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -! - -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2)) :: ZVARS - -! -INTEGER :: ISV,JSV !number of scalar variables and Loop counter -! -!---------------------------------------------------------------------------- -! -!* 1.PRELIMINARIES -! ------------- -! -! -! number of scalar var -ISV=SIZE(PSVM,3) - -! -PFLXZSVMF = 0. -PSVDT = 0. - -! -!---------------------------------------------------------------------------- -! -!* 2. COMPUTE THE MEAN FLUX OF CONSERVATIVE VARIABLES at time t-dt -! (equation (3) of Soares et al) -! + THE MEAN FLUX OF THETA_V (buoyancy flux) -! ----------------------------------------------- -! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) -! -! downdraft data are on the flux points -PFLXZTHMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-PTHL_DO(:,:)) - -PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP(:,:)-PRT_DO(:,:)) - -PFLXZTHVMF(:,:) = PEMF(:,:)*(PTHV_UP(:,:)-PTHV_DO(:,:)) - -IF (OMIXUV) THEN - PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-PU_DO(:,:)) - PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-PV_DO(:,:)) -ELSE - PFLXZUMF(:,:) = 0. - PFLXZVMF(:,:) = 0. -ENDIF -! -! -!---------------------------------------------------------------------------- -! -!* 3. COMPUTE TENDENCIES OF CONSERVATIVE VARIABLES (or treated as such...) -! (implicit formulation) -! -------------------------------------------- -! - -! -! -! 3.1 Compute the tendency for the conservative potential temperature -! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) -! -CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PTHLM,PFLXZTHMF,-PEMF,PTSTEP,PIMPL, & - PDZZ,PRHODJ,ZVARS ) -! compute new flux -!!!!!!!!!!!!!!!!!!!!!!!!!! -! Pourquoi on le recalcule ici alors qu'il n'est pas utilisé ailleurs -! sauf pour l'écriture ? -! Est ce que ZVARS est au point de masse pour qu'il doivent être remis au point -! de flux ? -!!!!!!!!!!!!!!!!!!!!!!!!!! -PFLXZTHMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) - -!!! compute THL tendency -! -PTHLDT(:,:)= (ZVARS(:,:)-PTHLM(:,:))/PTSTEP - -! -! 3.2 Compute the tendency for the conservative mixing ratio -! -CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PRTM(:,:),PFLXZRMF,-PEMF,PTSTEP,PIMPL, & - PDZZ,PRHODJ,ZVARS ) -! compute new flux -PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) - -!!! compute RT tendency -PRTDT(:,:) = (ZVARS(:,:)-PRTM(:,:))/PTSTEP -! - -IF (OMIXUV) THEN - ! - ! 3.3 Compute the tendency for the (non conservative but treated as it) zonal momentum - ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) - ! - - CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PUM,PFLXZUMF,-PEMF,PTSTEP,PIMPL, & - PDZZ,PRHODJ,ZVARS ) - ! compute new flux - PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) - - ! compute U tendency - PUDT(:,:)= (ZVARS(:,:)-PUM(:,:))/PTSTEP - - ! - ! - ! 3.4 Compute the tendency for the (non conservative but treated as it for the time beiing) - ! meridian momentum - ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) - ! - CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PVM,PFLXZVMF,-PEMF,PTSTEP,PIMPL, & - PDZZ,PRHODJ,ZVARS ) - ! compute new flux - PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(KKA,KKU,KKL,ZVARS(:,:))) - - ! compute V tendency - PVDT(:,:)= (ZVARS(:,:)-PVM(:,:))/PTSTEP -ELSE - PUDT(:,:)=0. - PVDT(:,:)=0. -ENDIF - -DO JSV=1,ISV - - IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE - - !* compute mean flux of scalar variables at time t-dt - ! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) - - PFLXZSVMF(:,:,JSV) = PEMF(:,:)*(PSV_UP(:,:,JSV)-MZM_MF(KKA,KKU,KKL,PSVM(:,:,JSV))) - - ! - ! 3.5 Compute the tendency for scalar variables - ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) - ! - CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PSVM(:,:,JSV),PFLXZSVMF(:,:,JSV),& - -PEMF,PTSTEP,PIMPL,PDZZ,PRHODJ,ZVARS ) - ! compute new flux - PFLXZSVMF(:,:,JSV) = PEMF(:,:)*(PSV_UP(:,:,JSV)-MZM_MF(KKA,KKU,KKL,ZVARS)) - - ! compute Sv tendency - PSVDT(:,:,JSV)= (ZVARS(:,:)-PSVM(:,:,JSV))/PTSTEP - -ENDDO -! -END SUBROUTINE MF_TURB_GREYZONE diff --git a/src/mesonh/turb/modd_cturb.f90 b/src/mesonh/turb/modd_cturb.f90 deleted file mode 100644 index db23e955b7e52ad14c9d4d5d555fb24895d8fbd9..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/modd_cturb.f90 +++ /dev/null @@ -1,91 +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 modd 2006/05/23 10:10:13 -!----------------------------------------------------------------- -! ####################### - MODULE MODD_CTURB -! ####################### -! -!!**** *MODD_CTURB* - declaration of the turbulent scheme constants -!! -!! PURPOSE -!! ------- -! The purpose of this declarative module is to declare the -! turbulence scheme constants. -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! NONE -!! -!! REFERENCE -!! --------- -!! Book 2 of Meso-NH documentation (MODD_CTURB) -!! Book 1 of Meso-NH documentation (Chapter Turbulence) -!! -!! AUTHOR -!! ------ -!1 Joan Cuxart * INM and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 08/08/94 -!! Nov 06, 2002 (V. Masson) add XALPSBL and XASBL -!! May 06 Remove EPS -!! Jan 2019 (Q. Rodier) Remove XASBL -!---------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -! -REAL,SAVE :: XCMFS ! constant for the momentum flux due to shear -REAL,SAVE :: XCMFB ! constant for the momentum flux due to buoyancy -REAL,SAVE :: XCSHF ! constant for the sensible heat flux -REAL,SAVE :: XCHF ! constant for the humidity flux -REAL,SAVE :: XCTV ! constant for the temperature variance -REAL,SAVE :: XCHV ! constant for the humidity variance -REAL,SAVE :: XCHT1 ! first ct. for the humidity-temperature correlation -REAL,SAVE :: XCHT2 ! second ct. for the humidity-temperature correlation -! -REAL,SAVE :: XCPR1 ! first ct. for the turbulent Prandtl numbers -REAL,SAVE :: XCPR2 ! second ct. for the turbulent Prandtl numbers -REAL,SAVE :: XCPR3 ! third ct. for the turbulent Prandtl numbers -REAL,SAVE :: XCPR4 ! fourth ct. for the turbulent Prandtl numbers -REAL,SAVE :: XCPR5 ! fifth ct. for the turbulent Prandtl numbers -! -REAL,SAVE :: XCET ! constant into the transport term of the TKE eq. -REAL,SAVE :: XCED ! constant into the dissipation term of the TKE eq. -! -REAL,SAVE :: XCDP ! ct. for the production term in the dissipation eq. -REAL,SAVE :: XCDD ! ct. for the destruction term in the dissipation eq. -REAL,SAVE :: XCDT ! ct. for the transport term in the dissipation eq. -! -REAL,SAVE :: XTKEMIN ! mimimum value for the TKE -REAL,SAVE :: XRM17 ! Rodier et al 2017 constant in shear term for mixing length -! -REAL,SAVE :: XLINI ! initial value for BL mixing length -REAL,SAVE :: XLINF ! to prevent division by zero in the BL algorithm -! -REAL,SAVE :: XALPSBL ! constant linking TKE and friction velocity in the SBL -! -REAL,SAVE :: XCEP ! Constant for wind pressure-correlations -REAL,SAVE :: XA0 ! Constant a0 for wind pressure-correlations -REAL,SAVE :: XA2 ! Constant a2 for wind pressure-correlations -REAL,SAVE :: XA3 ! Constant a3 for wind pressure-correlations -REAL,SAVE :: XA5 ! Constant a5 for temperature pressure-correlations -REAL,SAVE :: XCTD ! Constant for temperature and vapor dissipation -REAL,SAVE :: XCTP ! Constant for temperature and vapor pressure-correlations -! -REAL,SAVE :: XPHI_LIM ! Threshold value for Phi3 and Psi3 -REAL,SAVE :: XSBL_O_BL ! SBL height / BL height ratio -REAL,SAVE :: XFTOP_O_FSURF! Fraction of surface (heat or momentum) flux used to define top of BL -! -END MODULE MODD_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/modd_turb_cloud.f90 b/src/mesonh/turb/modd_turb_cloud.f90 deleted file mode 100644 index 28b1f106f5854d3c081ff80594fb63ce6ff5b024..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/modd_turb_cloud.f90 +++ /dev/null @@ -1,58 +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 modd 2006/05/18 13:07:25 -!----------------------------------------------------------------- -! ################## - MODULE MODD_TURB_CLOUD -! ################## -! -!!**** *MODD_TURB_CLOUD* - declaration of parameters for cloud mixing length -!! -!! PURPOSE -!! ------- -! The purpose of this declarative module is to declare the -! variables that may be set by namelist for the cloud mixing length -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! None -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! M. Tomasini *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original September, 2004 -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -! -INTEGER,SAVE :: NMODEL_CLOUD ! model number where the modification ! of the mixing length in the clouds is computed -CHARACTER (LEN=4),SAVE :: CTURBLEN_CLOUD ! type of length in the clouds - ! 'DEAR' Deardorff mixing length - ! 'BL89' Bougeault and Lacarrere scheme - ! 'DELT' length = ( volum) ** 1/3 -REAL,SAVE :: XCOEF_AMPL_SAT ! saturation of the amplification coefficient -REAL,SAVE :: XCEI_MIN ! minimum threshold for the instability index CEI - !(beginning of the amplification) -REAL,SAVE :: XCEI_MAX ! maximum threshold for the instability index CEI - !(beginning of the saturation of the amplification) -REAL,SAVE,DIMENSION(:,:,:), ALLOCATABLE :: XCEI ! Cloud Entrainment instability - ! index to emphasize localy - ! turbulent fluxes -! -END MODULE MODD_TURB_CLOUD diff --git a/src/mesonh/turb/modd_turb_flux_aircraft_balloon.f90 b/src/mesonh/turb/modd_turb_flux_aircraft_balloon.f90 deleted file mode 100644 index cd3e40b6268045b53d226868e496c3383b048df9..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/modd_turb_flux_aircraft_balloon.f90 +++ /dev/null @@ -1,54 +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$ $Date$ -!----------------------------------------------------------------- -!----------------------------------------------------------------- -!----------------------------------------------------------------- -! ###################################### - MODULE MODD_TURB_FLUX_AIRCRAFT_BALLOON -! ###################################### -! -!!**** *MODD_CVERT* - Declares work arrays for vertical cross-sections -!! -!! PURPOSE -!! ------- -! For vertical cross-sections only, this declarative module declares -! the arrays containing the sea-level altitudes and the model topography -! of the oblique cross-section points. -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! None -!! -!! REFERENCE -!! --------- -!! -!! Book2 of the TRACE volume of the Meso-NH user manual -!! (MODD_CVERT) -!! -!! AUTHOR -!! ------ -!! P.Lacarrere -!! -!! MODIFICATIONS -!! ------------- -!! Original 18/09/06 -!! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -! -IMPLICIT NONE -! -REAL,DIMENSION(:,:,:) ,ALLOCATABLE,SAVE :: XTHW_FLUX !sensible flux -REAL,DIMENSION(:,:,:) ,ALLOCATABLE,SAVE :: XRCW_FLUX !Latent flux -REAL,DIMENSION(:,:,:,:),ALLOCATABLE,SAVE :: XSVW_FLUX !turb scalar flux -! -END MODULE MODD_TURB_FLUX_AIRCRAFT_BALLOON diff --git a/src/mesonh/turb/mode_compute_updraft_rhcj10.f90 b/src/mesonh/turb/mode_compute_updraft_rhcj10.f90 deleted file mode 100644 index abcbdc1c09192e02db5e837a06c68f79fbb2e77a..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/mode_compute_updraft_rhcj10.f90 +++ /dev/null @@ -1,590 +0,0 @@ -!MNH_LIC Copyright 2012-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. -!----------------------------------------------------------------- -! ######spl - MODULE MODE_COMPUTE_UPDRAFT_RHCJ10 -! ########################### -! -IMPLICIT NONE -CONTAINS -! -SUBROUTINE COMPUTE_UPDRAFT_RHCJ10(KKA,KKB,KKE,KKU,KKL,HFRAC_ICE, & - OENTR_DETR,OMIXUV, & - ONOMIXLG,KSV_LGBEG,KSV_LGEND, & - PZZ,PDZZ, & - PSFTH,PSFRV, & - PPABSM,PRHODREF,PUM,PVM, PTKEM, & - PTHM,PRVM,PTHLM,PRTM, & - PSVM,PTHL_UP,PRT_UP, & - PRV_UP,PRC_UP,PRI_UP,PTHV_UP, & - PW_UP,PU_UP, PV_UP, PSV_UP, & - PFRAC_UP,PFRAC_ICE_UP,PRSAT_UP, & - PEMF,PDETR,PENTR, & - PBUO_INTEG,KKLCL,KKETL,KKCTL, & - PDEPTH ) -! ################################################################# -!! -!!**** *COMPUTE_UPDRAFT_RHCJ10* - calculates caracteristics of the updraft -!! -!! -!! PURPOSE -!! ------- -!!**** The purpose of this routine is to build the updraft following Rio et al (2010) -!! -! -!!** METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! !! REFERENCE -!! --------- -!! Rio et al (2010) (Boundary Layer Meteorol 135:469-483) -!! -!! AUTHOR -!! ------ -!! Y. Bouteloup (2012) -!! R. Honert Janv 2013 ==> corection of some bugs -!! R. El Khatib 15-Oct-2014 Optimization -!! Q.Rodier 01/2019 : support RM17 mixing length -!! -------------------------------------------------------------------------- - -! WARNING ==> This updraft is not yet ready to use scalar variables - -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_PARAM_MFSHALL_n -USE MODD_TURB_n, ONLY : CTURBLEN -USE MODI_TH_R_FROM_THL_RT_1D -USE MODI_SHUMAN_MF, ONLY: MZF_MF, MZM_MF, GZ_M_W_MF - -USE MODE_COMPUTE_BL89_ML, ONLY: COMPUTE_BL89_ML -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK - - -IMPLICIT NONE - -!* 1.1 Declaration of Arguments -! -! -INTEGER, INTENT(IN) :: KKA ! near ground array index -INTEGER, INTENT(IN) :: KKB ! near ground physical index -INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index -INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme -LOGICAL, INTENT(IN) :: OENTR_DETR! flag to recompute entrainment, detrainment and mass flux -LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum -LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer -INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer -INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer -REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height at the flux point -REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metrics coefficient - -REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV -! normal surface fluxes of theta,rv,(u,v) parallel to the orography - -REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the - ! reference state -REAL, DIMENSION(:,:), INTENT(IN) :: PUM ! u mean wind -REAL, DIMENSION(:,:), INTENT(IN) :: PVM ! v mean wind -REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! TKE at t-dt -! -REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! pot. temp. at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PRVM ! vapor mixing ratio at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-dt - -REAL, DIMENSION(:,:), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties -REAL, DIMENSION(:,:), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components -REAL, DIMENSION(:,:), INTENT(INOUT):: PRV_UP,PRC_UP ! updraft rv, rc -REAL, DIMENSION(:,:), INTENT(INOUT):: PRI_UP ! updraft ri -REAL, DIMENSION(:,:), INTENT(INOUT):: PTHV_UP ! updraft THv -REAL, DIMENSION(:,:), INTENT(INOUT):: PW_UP,PFRAC_UP ! updraft w, fraction -REAL, DIMENSION(:,:), INTENT(INOUT):: PFRAC_ICE_UP ! liquid/solid fraction in updraft -REAL, DIMENSION(:,:), INTENT(INOUT):: PRSAT_UP ! Rsat - -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSV_UP ! updraft scalar var. - -REAL, DIMENSION(:,:), INTENT(INOUT):: PEMF,PDETR,PENTR ! Mass_flux, - ! detrainment,entrainment -REAL, DIMENSION(:,:), INTENT(INOUT) :: PBUO_INTEG ! Integrated Buoyancy -INTEGER, DIMENSION(:), INTENT(INOUT):: KKLCL,KKETL,KKCTL! LCL, ETL, CTL -REAL, DIMENSION(:), INTENT(OUT) :: PDEPTH ! Deepness of cloud -! 1.2 Declaration of local variables -! -! Mean environment variables at t-dt at flux point -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZTHM_F,ZRVM_F ! Theta,rv of - ! updraft environnement -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZRTM_F, ZTHLM_F, ZTKEM_F ! rt, thetal,TKE,pressure, -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZUM_F,ZVM_F,ZRHO_F ! density,momentum -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZPRES_F,ZTHVM_F ! interpolated at the flux point -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZG_O_THVREF ! g*ThetaV ref -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZW_UP2 ! w**2 of the updraft - -REAL, DIMENSION(SIZE(PSVM,1),SIZE(PTHM,2),SIZE(PSVM,3)) :: ZSVM_F ! scalar variables - - - -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZTH_UP ! updraft THETA -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZBUO ! Buoyancy - -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZCOEF ! diminution coefficient for too high clouds - -REAL :: ZWTHVSURF ! Surface w'thetav' - -REAL :: ZRVORD ! RV/RD - - -REAL, DIMENSION(SIZE(PTHM,1)) :: ZMIX1,ZMIX2 - -REAL, DIMENSION(SIZE(PTHM,1)) :: ZLUP ! Upward Mixing length from the ground - -INTEGER :: ISV ! Number of scalar variables -INTEGER :: IKU,IIJU ! array size in k -INTEGER :: JK,JI,JSV ! loop counters - -LOGICAL, DIMENSION(SIZE(PTHM,1)) :: GTEST,GTESTLCL - ! Test if the ascent continue, if LCL or ETL is reached -LOGICAL :: GLMIX - ! To choose upward or downward mixing length -LOGICAL, DIMENSION(SIZE(PTHM,1)) :: GWORK1 -LOGICAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: GWORK2 - -INTEGER :: ITEST - -REAL, DIMENSION(SIZE(PTHM,1)) :: ZRC_UP, ZRI_UP, ZRV_UP, ZRSATW, ZRSATI - -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZZDZ - -REAL, DIMENSION(SIZE(PTHM,1)) :: ZTEST,ZDZ,ZWUP_MEAN ! -REAL, DIMENSION(SIZE(PTHM,1)) :: ZCOE,ZWCOE,ZBUCOE -REAL, DIMENSION(SIZE(PTHM,1)) :: ZDETR_BUO, ZDETR_RT -REAL, DIMENSION(SIZE(PTHM,1)) :: ZW_MAX ! w**2 max of the updraft -REAL, DIMENSION(SIZE(PTHM,1)) :: ZZTOP ! Top of the updraft - -REAL :: ZDEPTH_MAX1, ZDEPTH_MAX2 ! control auto-extinction process - -REAL :: ZTMAX,ZRMAX, ZEPS ! control value - -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear -REAL(KIND=JPRB) :: ZHOOK_HANDLE -IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAFT_RHCJ10',0,ZHOOK_HANDLE) - -! Thresholds for the perturbation of -! theta_l and r_t at the first level of the updraft - -ZTMAX=2.0 -ZRMAX=1.E-3 -ZEPS=1.E-15 -!------------------------------------------------------------------------ -! INITIALISATION - -! Initialisation of the constants -ZRVORD = (XRV / XRD) - -! depth are different in compute_updraft (3000. and 4000.) ==> impact is small -ZDEPTH_MAX1=4500. ! clouds with depth infeRIOr to this value are keeped untouched -ZDEPTH_MAX2=5000. ! clouds with depth superior to this value are suppressed - - -! Local variables, internal domain -! Internal Domain - -IKU=SIZE(PTHM,2) -IIJU =SIZE(PTHM,1) -!number of scalar variables -ISV=SIZE(PSVM,3) - -! Initialisation of intersesting Level :LCL,ETL,CTL -KKLCL(:)=KKE -KKETL(:)=KKE -KKCTL(:)=KKE - -! -! Initialisation -!* udraft governing variables -PEMF(:,:)=0. -PDETR(:,:)=0. -PENTR(:,:)=0. - -! Initialisation -!* updraft core variables -PRC_UP(:,:)=0. - -PW_UP(:,:)=0. -ZTH_UP(:,:)=0. -PFRAC_UP(:,:)=0. -PTHV_UP(:,:)=0. - -PBUO_INTEG=0. -ZBUO =0. - -!no ice cloud coded yet -PRI_UP(:,:)=0. -PFRAC_ICE_UP(:,:)=0. -PRSAT_UP(:,:)=PRVM(:,:) ! should be initialised correctly but is (normaly) not used - -! Initialisation of environment variables at t-dt - -! variables at flux level -ZTHLM_F(:,:) = MZM_MF(PTHLM(:,:), KKA, KKU, KKL) -ZRTM_F (:,:) = MZM_MF(PRTM(:,:), KKA, KKU, KKL) -ZUM_F (:,:) = MZM_MF(PUM(:,:), KKA, KKU, KKL) -ZVM_F (:,:) = MZM_MF(PVM(:,:), KKA, KKU, KKL) -ZTKEM_F(:,:) = MZM_MF(PTKEM(:,:), KKA, KKU, KKL) - -! This updraft is not yet ready to use scalar variables -!DO JSV=1,ISV -! IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE -! *** SR merge AROME/Méso-nh: following two lines come from the AROME version -! ZSVM_F(:,KKB:IKU,JSV) = 0.5*(PSVM(:,KKB:IKU,JSV)+PSVM(:,1:IKU-1,JSV)) -! ZSVM_F(:,1,JSV) = ZSVM_F(:,KKB,JSV) -! *** the following single line comes from the Meso-NH version -! ZSVM_F(:,:,JSV) = MZM_MF(KKA,KKU,KKL,PSVM(:,:,JSV)) -!END DO - -! Initialisation of updraft characteristics -PTHL_UP(:,:)=ZTHLM_F(:,:) -PRT_UP(:,:)=ZRTM_F(:,:) -PU_UP(:,:)=ZUM_F(:,:) -PV_UP(:,:)=ZVM_F(:,:) -PSV_UP(:,:,:)=0. -! This updraft is not yet ready to use scalar variables -!IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) then -! PSV_UP(:,:,:)=ZSVM_F(:,:,:) -!ENDIF - -! Computation or initialisation of updraft characteristics at the KKB level -! thetal_up,rt_up,thetaV_up, w,Buoyancy term and mass flux (PEMF) - -DO JI=1,IIJU - !PTHL_UP(JI,KKB)= ZTHLM_F(JI,KKB)+MAX(0.,MIN(ZTMAX,(PSFTH(JI)/SQRT(ZTKEM_F(JI,KKB)))*XALP_PERT)) - !PRT_UP(JI,KKB) = ZRTM_F(JI,KKB)+MAX(0.,MIN(ZRMAX,(PSFRV(JI)/SQRT(ZTKEM_F(JI,KKB)))*XALP_PERT)) - PTHL_UP(JI,KKB)= ZTHLM_F(JI,KKB) - PRT_UP(JI,KKB) = ZRTM_F(JI,KKB) -ENDDO - -ZTHM_F (:,:) = MZM_MF(PTHM (:,:), KKA, KKU, KKL) -ZPRES_F(:,:) = MZM_MF(PPABSM(:,:), KKA, KKU, KKL) -ZRHO_F (:,:) = MZM_MF(PRHODREF(:,:), KKA, KKU, KKL) -ZRVM_F (:,:) = MZM_MF(PRVM(:,:), KKA, KKU, KKL) - -! thetav at mass and flux levels -DO JK=1,IKU - DO JI=1,IIJU - ZTHVM_F(JI,JK)=ZTHM_F(JI,JK)*((1.+ZRVORD*ZRVM_F(JI,JK))/(1.+ZRTM_F(JI,JK))) - ENDDO -ENDDO - -PTHV_UP(:,:)= ZTHVM_F(:,:) -PRV_UP (:,:)= ZRVM_F (:,:) - -ZW_UP2(:,:)=ZEPS -ZW_UP2(:,KKB) = MAX(0.0001,(2./3.)*ZTKEM_F(:,KKB)) - -! Computation of non conservative variable for the KKB level of the updraft -! (all or nothing ajustement) - -PRC_UP(:,KKB)=0. -PRI_UP(:,KKB)=0. -CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,KKB),ZPRES_F(:,KKB), & - PTHL_UP(:,KKB),PRT_UP(:,KKB),ZTH_UP(:,KKB), & - PRV_UP(:,KKB),PRC_UP(:,KKB),PRI_UP(:,KKB),ZRSATW(:),ZRSATI(:)) - -DO JI=1,IIJU - ! compute updraft thevav and buoyancy term at KKB level - PTHV_UP(JI,KKB) = ZTH_UP(JI,KKB)*((1+ZRVORD*PRV_UP(JI,KKB))/(1+PRT_UP(JI,KKB))) - ! compute mean rsat in updraft - PRSAT_UP(JI,KKB) = ZRSATW(JI)*(1-PFRAC_ICE_UP(JI,KKB)) + ZRSATI(JI)*PFRAC_ICE_UP(JI,KKB) -ENDDO - -!Tout est commente pour tester dans un premier temps la separation en deux de la -! boucle verticale, une pour w et une pour PEMF - -ZG_O_THVREF=XG/ZTHVM_F - -! Calcul de la fermeture de Julien Pergaut comme limite max de PHY - -DO JK=KKB,KKE-KKL,KKL ! Vertical loop - DO JI=1,IIJU - ZZDZ(JI,JK) = MAX(ZEPS,PZZ(JI,JK+KKL)-PZZ(JI,JK)) ! <== Delta Z between two flux level - ENDDO -ENDDO - -! compute L_up -GLMIX=.TRUE. -ZTKEM_F(:,KKB)=0. -! -IF(CTURBLEN=='RM17') THEN - ZDUDZ = MZF_MF(GZ_M_W_MF(PUM,PDZZ, KKA, KKU, KKL), KKA, KKU, KKL) - ZDVDZ = MZF_MF(GZ_M_W_MF(PVM,PDZZ, KKA, KKU, KKL), KKA, KKU, KKL) - ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) -ELSE - ZSHEAR = 0. !no shear in bl89 mixing length -END IF -! -CALL COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ,ZTKEM_F(:,KKB),ZG_O_THVREF(:,KKB), & - ZTHVM_F,KKB,GLMIX,.TRUE.,ZSHEAR,ZLUP) -ZLUP(:)=MAX(ZLUP(:),1.E-10) - -DO JI=1,IIJU - ! Compute Buoyancy flux at the ground - ZWTHVSURF = (ZTHVM_F(JI,KKB)/ZTHM_F(JI,KKB))*PSFTH(JI)+ & - (0.61*ZTHM_F(JI,KKB))*PSFRV(JI) - - ! Mass flux at KKB level (updraft triggered if PSFTH>0.) - IF (ZWTHVSURF>0.010) THEN ! <== Not 0 Important to have stratocumulus !!!!! - PEMF(JI,KKB) = XCMF * ZRHO_F(JI,KKB) * ((ZG_O_THVREF(JI,KKB))*ZWTHVSURF*ZLUP(JI))**(1./3.) - PFRAC_UP(JI,KKB)=MIN(PEMF(JI,KKB)/(SQRT(ZW_UP2(JI,KKB))*ZRHO_F(JI,KKB)),XFRAC_UP_MAX) - - ZW_UP2(JI,KKB)=(PEMF(JI,KKB)/(PFRAC_UP(JI,KKB)*ZRHO_F(JI,KKB)))**2 - GTEST(JI)=.TRUE. - ELSE - PEMF(JI,KKB) =0. - GTEST(JI)=.FALSE. - ENDIF -ENDDO - - -!-------------------------------------------------------------------------- - -! 3. Vertical ascending loop -! ----------------------- -! -! If GTEST = T the updraft starts from the KKB level and stops when GTEST becomes F -! -! -GTESTLCL(:)=.FALSE. - - -! Loop on vertical level to compute W - -ZW_MAX(:) = 0. -ZZTOP(:) = 0. - -DO JK=KKB,KKE-KKL,KKL - -! IF the updraft top is reached for all column, stop the loop on levels - - !ITEST=COUNT(GTEST) - !IF (ITEST==0) CYCLE ! <== I do not remember why I removed this ... - -! Computation of entrainment and detrainment with KF90 -! parameterization in clouds and LR01 in subcloud layer - - -! to find the LCL (check if JK is LCL or not) - - DO JI=1,IIJU - IF ((PRC_UP(JI,JK)+PRI_UP(JI,JK)>0.).AND.(.NOT.(GTESTLCL(JI)))) THEN - KKLCL(JI) = JK - GTESTLCL(JI)=.TRUE. - ENDIF - ENDDO - - -! COMPUTE PENTR and PDETR at mass level JK - - -! Buoyancy is computed on "flux" levels where updraft variables are known - - ! Compute theta_v of updraft at flux level JK - - ZRC_UP(:) =PRC_UP(:,JK) ! guess - ZRI_UP(:) =PRI_UP(:,JK) ! guess - ZRV_UP(:) =PRV_UP(:,JK) - CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,JK),& - PPABSM(:,JK),PTHL_UP(:,JK),PRT_UP(:,JK),& - ZTH_UP(:,JK),ZRV_UP,ZRC_UP,ZRI_UP,ZRSATW(:),ZRSATI(:)) - - DO JI=1,IIJU - IF (GTEST(JI)) THEN - PTHV_UP (JI,JK) = ZTH_UP(JI,JK)*(1.+ZRVORD*ZRV_UP(JI))/(1.+PRT_UP(JI,JK)) - ZBUO (JI,JK) = ZG_O_THVREF(JI,JK)*(PTHV_UP(JI,JK) - ZTHVM_F(JI,JK)) - PBUO_INTEG(JI,JK) = ZBUO(JI,JK)*(PZZ(JI,JK+KKL)-PZZ(JI,JK)) - - ZDZ(JI) = MAX(ZEPS,PZZ(JI,JK+KKL)-PZZ(JI,JK)) - ZTEST(JI) = XA1*ZBUO(JI,JK) - XB*ZW_UP2(JI,JK) - - ! Ancien calcul de la vitesse - ZCOE(JI) = ZDZ(JI) - IF (ZTEST(JI)>0.) THEN - ZCOE(JI) = ZDZ(JI)/(1.+ XBETA1) - ENDIF - - ! Convective Vertical speed computation - ZWCOE(JI) = (1.-XB*ZCOE(JI))/(1.+XB*ZCOE(JI)) - ZBUCOE(JI) = 2.*ZCOE(JI)/(1.+XB*ZCOE(JI)) - - ! Second Rachel bug correction (XA1 has been forgotten ... not yet tested ...) - !ZW_UP2(JI,JK+KKL) = MAX(ZEPS,ZW_UP2(JI,JK)*ZWCOE(JI) + ZBUO(JI,JK)*ZBUCOE(JI) ) - ZW_UP2(JI,JK+KKL) = MAX(ZEPS,ZW_UP2(JI,JK)*ZWCOE(JI) + XA1*ZBUO(JI,JK)*ZBUCOE(JI) ) - ZW_MAX(JI) = MAX(ZW_MAX(JI), SQRT(ZW_UP2(JI,JK+KKL))) - ZWUP_MEAN(JI) = MAX(ZEPS,0.5*(ZW_UP2(JI,JK+KKL)+ZW_UP2(JI,JK))) - - ! Entrainement and detrainement - - ! First Rachel bug correction (Parenthesis around 1+beta1 ==> impact is small) - PENTR(JI,JK) = MAX(0.,(XBETA1/(1.+XBETA1))*(XA1*ZBUO(JI,JK)/ZWUP_MEAN(JI)-XB)) - ZDETR_BUO(JI) = MAX(0., -(XBETA1/(1.+XBETA1))*XA1*ZBUO(JI,JK)/ZWUP_MEAN(JI)) - ZDETR_RT(JI) = XC*SQRT(MAX(0.,(PRT_UP(JI,JK) - ZRTM_F(JI,JK))) / MAX(ZEPS,ZRTM_F(JI,JK)) / ZWUP_MEAN(JI)) - PDETR(JI,JK) = ZDETR_RT(JI)+ZDETR_BUO(JI) - - ! If the updraft did not stop, compute cons updraft characteritics at jk+1 - ZZTOP(JI) = MAX(ZZTOP(JI),PZZ(JI,JK+KKL)) - ZMIX2(JI) = (PZZ(JI,JK+KKL)-PZZ(JI,JK))*PENTR(JI,JK) !& - - PTHL_UP(JI,JK+KKL)=(PTHL_UP(JI,JK)*(1.-0.5*ZMIX2(JI)) + PTHLM(JI,JK)*ZMIX2(JI)) & - /(1.+0.5*ZMIX2(JI)) - PRT_UP(JI,JK+KKL) =(PRT_UP (JI,JK)*(1.-0.5*ZMIX2(JI)) + PRTM(JI,JK)*ZMIX2(JI)) & - /(1.+0.5*ZMIX2(JI)) - ENDIF ! GTEST - ENDDO - - - IF(OMIXUV) THEN - IF(JK/=KKB) THEN - DO JI=1,IIJU - IF(GTEST(JI)) THEN - PU_UP(JI,JK+KKL) = (PU_UP (JI,JK)*(1-0.5*ZMIX2(JI)) + PUM(JI,JK)*ZMIX2(JI)+ & - 0.5*XPRES_UV*(PZZ(JI,JK+KKL)-PZZ(JI,JK))*& - ((PUM(JI,JK+KKL)-PUM(JI,JK))/PDZZ(JI,JK+KKL)+& - (PUM(JI,JK)-PUM(JI,JK-KKL))/PDZZ(JI,JK)) ) & - /(1+0.5*ZMIX2(JI)) - PV_UP(JI,JK+KKL) = (PV_UP (JI,JK)*(1-0.5*ZMIX2(JI)) + PVM(JI,JK)*ZMIX2(JI)+ & - 0.5*XPRES_UV*(PZZ(JI,JK+KKL)-PZZ(JI,JK))*& - ((PVM(JI,JK+KKL)-PVM(JI,JK))/PDZZ(JI,JK+KKL)+& - (PVM(JI,JK)-PVM(JI,JK-KKL))/PDZZ(JI,JK)) ) & - /(1+0.5*ZMIX2(JI)) - ENDIF - ENDDO - ELSE - DO JI=1,IIJU - IF(GTEST(JI)) THEN - PU_UP(JI,JK+KKL) = (PU_UP (JI,JK)*(1-0.5*ZMIX2(JI)) + PUM(JI,JK)*ZMIX2(JI)+ & - 0.5*XPRES_UV*(PZZ(JI,JK+KKL)-PZZ(JI,JK))*& - ((PUM(JI,JK+KKL)-PUM(JI,JK))/PDZZ(JI,JK+KKL)) ) & - /(1+0.5*ZMIX2(JI)) - PV_UP(JI,JK+KKL) = (PV_UP (JI,JK)*(1-0.5*ZMIX2(JI)) + PVM(JI,JK)*ZMIX2(JI)+ & - 0.5*XPRES_UV*(PZZ(JI,JK+KKL)-PZZ(JI,JK))*& - ((PVM(JI,JK+KKL)-PVM(JI,JK))/PDZZ(JI,JK+KKL)) ) & - /(1+0.5*ZMIX2(JI)) - ENDIF - ENDDO - ENDIF - ENDIF - -! This updraft is not yet ready to use scalar variables -! DO JSV=1,ISV -! IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE -! WHERE(GTEST) -! PSV_UP(:,JK+KKL,JSV) = (PSV_UP (:,JK,JSV)*(1-0.5*ZMIX2(:)) + & -! PSVM(:,JK,JSV)*ZMIX2(:)) /(1+0.5*ZMIX2(:)) -! ENDWHERE -! ENDDO - - -! Compute non cons. var. at level JK+KKL - ZRC_UP(:)=PRC_UP(:,JK) ! guess = level just below - ZRI_UP(:)=PRI_UP(:,JK) ! guess = level just below - ZRV_UP(:)=PRV_UP(:,JK) - CALL TH_R_FROM_THL_RT_1D(HFRAC_ICE,PFRAC_ICE_UP(:,JK+KKL),ZPRES_F(:,JK+KKL), & - PTHL_UP(:,JK+KKL),PRT_UP(:,JK+KKL),ZTH_UP(:,JK+KKL), & - ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:)) - - DO JI=1,IIJU - IF(GTEST(JI)) THEN - PRC_UP(JI,JK+KKL)=ZRC_UP(JI) - PRV_UP(JI,JK+KKL)=ZRV_UP(JI) - PRI_UP(JI,JK+KKL)=ZRI_UP(JI) - PRSAT_UP(JI,JK+KKL) = ZRSATW(JI)*(1-PFRAC_ICE_UP(JI,JK+KKL)) + ZRSATI(JI)*PFRAC_ICE_UP(JI,JK+KKL) - - ! Compute the updraft theta_v, buoyancy and w**2 for level JK+1 - PTHV_UP(JI,JK+KKL) = ZTH_UP(JI,JK+KKL)*((1+ZRVORD*PRV_UP(JI,JK+KKL))/(1+PRT_UP(JI,JK+KKL))) - ZMIX1(JI)=ZZDZ(JI,JK)*(PENTR(JI,JK)-PDETR(JI,JK)) - ENDIF - ENDDO - - DO JI=1,IIJU - IF(GTEST(JI)) THEN - PEMF(JI,JK+KKL)=PEMF(JI,JK)*EXP(ZMIX1(JI)) - ENDIF - ENDDO - - DO JI=1,IIJU - IF(GTEST(JI)) THEN - ! Updraft fraction must be smaller than XFRAC_UP_MAX - PFRAC_UP(JI,JK+KKL)=MIN(XFRAC_UP_MAX, & - &PEMF(JI,JK+KKL)/(SQRT(ZW_UP2(JI,JK+KKL))*ZRHO_F(JI,JK+KKL))) - ENDIF - ENDDO - -! Test if the updraft has reach the ETL - DO JI=1,IIJU - IF (GTEST(JI) .AND. (PBUO_INTEG(JI,JK)<=0.)) THEN - KKETL(JI) = JK+KKL - ENDIF - ENDDO - - -! Test is we have reached the top of the updraft - DO JI=1,IIJU - IF (GTEST(JI) .AND. ((ZW_UP2(JI,JK+KKL)<=ZEPS).OR.(PEMF(JI,JK+KKL)<=ZEPS))) THEN - ZW_UP2 (JI,JK+KKL)=ZEPS - PEMF (JI,JK+KKL)=0. - GTEST (JI) =.FALSE. - PTHL_UP (JI,JK+KKL)=ZTHLM_F(JI,JK+KKL) - PRT_UP (JI,JK+KKL)=ZRTM_F(JI,JK+KKL) - PRC_UP (JI,JK+KKL)=0. - PRI_UP (JI,JK+KKL)=0. - PRV_UP (JI,JK+KKL)=ZRVM_F (JI,JK+KKL) - PTHV_UP (JI,JK+KKL)=ZTHVM_F(JI,JK+KKL) - PFRAC_UP (JI,JK+KKL)=0. - KKCTL (JI) =JK+KKL - ENDIF - ENDDO - -ENDDO ! Fin de la boucle verticale - -PW_UP(:,:)=SQRT(ZW_UP2(:,:)) -PEMF(:,KKB) =0. - -! Limits the shallow convection scheme when cloud heigth is higher than 3000m. -! To do this, mass flux is multiplied by a coefficient decreasing linearly -! from 1 (for clouds of 3000m of depth) to 0 (for clouds of 4000m of depth). -! This way, all MF fluxes are diminished by this amount. -! Diagnosed cloud fraction is also multiplied by the same coefficient. -! -DO JI=1,IIJU - PDEPTH(JI) = MAX(0., PZZ(JI,KKCTL(JI)) - PZZ(JI,KKLCL(JI)) ) -ENDDO - -GWORK1(:)= (GTESTLCL(:) .AND. (PDEPTH(:) > ZDEPTH_MAX1) ) -GWORK2(:,:) = SPREAD( GWORK1(:), DIM=2, NCOPIES=IKU ) -ZCOEF(:,:) = SPREAD( (1.-(PDEPTH(:)-ZDEPTH_MAX1)/(ZDEPTH_MAX2-ZDEPTH_MAX1)), DIM=2, NCOPIES=IKU) -ZCOEF(:,:)=MIN(MAX(ZCOEF(:,:),0.),1.) -DO JK=1, IKU - DO JI=1,IIJU - IF (GWORK2(JI,JK)) THEN - PEMF(JI,JK) = PEMF(JI,JK) * ZCOEF(JI,JK) - PFRAC_UP(JI,JK) = PFRAC_UP(JI,JK) * ZCOEF(JI,JK) - ENDIF - ENDDO -ENDDO - -IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAFT_RHCJ10',1,ZHOOK_HANDLE) - -END SUBROUTINE COMPUTE_UPDRAFT_RHCJ10 -END MODULE MODE_COMPUTE_UPDRAFT_RHCJ10 diff --git a/src/mesonh/turb/mode_prandtl.f90 b/src/mesonh/turb/mode_prandtl.f90 index 04dfe6155e2efdacbcf981be63e260d8046e1187..be6a381d6f187c578aafff06a772118472da08ba 100644 --- a/src/mesonh/turb/mode_prandtl.f90 +++ b/src/mesonh/turb/mode_prandtl.f90 @@ -5,6 +5,8 @@ !----------------------------------------------------------------- ! #################### MODULE MODE_PRANDTL + USE PARKIND1, ONLY : JPRB + USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! #################### ! !* modification 08/2010 V. Masson smoothing of the discontinuity in functions @@ -14,11 +16,544 @@ USE MODD_CTURB, ONLY : XCTV, XCSHF, XCTD, XPHI_LIM, XCPR3, XCPR4, XCPR5 USE MODD_PARAMETERS, ONLY : JPVEXT_TURB ! -USE MODI_SHUMAN +USE MODI_SHUMAN, ONLY: MZM, MZF IMPLICIT NONE !---------------------------------------------------------------------------- CONTAINS !---------------------------------------------------------------------------- + SUBROUTINE PRANDTL(KKA,KKU,KKL,KRR,KRRI,OTURB_DIAG, & + HTURBDIM,OOCEAN, & + TPFILE, & + PDXX,PDYY,PDZZ,PDZX,PDZY, & + PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & + PLM,PLEPS,PTKEM,PTHLM,PRM,PSVM,PSRCM, & + PREDTH1,PREDR1, & + PRED2TH3, PRED2R3, PRED2THR3, & + PREDS1,PRED2THS3, PRED2RS3, & + PBLL_O_E, & + PETHETA, PEMOIST ) +! ########################################################### +! +! +!!**** *PRANDTL* - routine to compute the Prandtl turbulent numbers +!! +!! PURPOSE +!! ------- +! The purpose of this routine is to compute the Redelsperger +! numbers and then get the turbulent Prandtl and Schmidt numbers: +! * for the heat fluxes - PHI3 = 1/ Prandtl +! * for the moisture fluxes - PSI3 = 1/ Schmidt +! +!!** METHOD +!! ------ +!! The following steps are performed: +!! +!! 1 - default values of 1 are taken for phi3 and psi3 and different masks +!! are defined depending on the presence of turbulence, stratification and +!! humidity. The 1D Redelsperger numbers are computed +!! * ZREDTH1 : (g / THVREF ) (LT**2 / TKE ) ETHETA (D Theta / Dz) +!! * ZREDR1 : (g / THVREF ) (LT**2 / TKE ) EMOIST (D TW / Dz) +!! 2 - 3D Redelsperger numbers are computed only for turbulent +!! grid points where ZREDTH1 or ZREDR1 are > 0. +!! 3 - PHI3 is computed only for turbulent grid points where ZREDTH1 > 0 +!! (turbulent thermally stratified points) +!! 4 - PSI3 is computed only for turbulent grid points where ZREDR1 > 0 +!! (turbulent moist points) +!! +!! +!! EXTERNAL +!! -------- +!! FUNCTIONs ETHETA and EMOIST : +!! allows to compute the coefficients +!! for the turbulent correlation between any variable +!! and the virtual potential temperature, of its correlations +!! with the conservative potential temperature and the humidity +!! conservative variable: +!! ------- ------- ------- +!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' +!! +!! GX_M_M, GY_M_M, GZ_M_M : Cartesian gradient operators +!! MZM : Shuman function (mean operator in the z direction) +!! Module MODI_ETHETA : interface module for ETHETA +!! Module MODI_EMOIST : interface module for EMOIST +!! Module MODI_SHUMAN : interface module for Shuman operators +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! Module MODD_CST : contains physical constants +!! XG : gravity constant +!! +!! Module MODD_CTURB: contains the set of constants for +!! the turbulence scheme +!! XCTV,XCPR2 : constants for the turbulent prandtl numbers +!! XTKEMIN : minimum value allowed for the TKE +!! +!! Module MODD_PARAMETERS +!! JPVEXT_TURB : number of vertical marginal points +!! +!! REFERENCE +!! --------- +!! Book 2 of documentation (routine PRANDTL) +!! Book 1 of documentation (Chapter: Turbulence) +!! +!! AUTHOR +!! ------ +!! Joan Cuxart * INM and Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 18/10/94 +!! Modifications: Feb 14, 1995 (J.Cuxart and J.Stein) +!! Doctorization and Optimization +!! Modifications: March 21, 1995 (J.M. Carriere) +!! Introduction of cloud water +!! Modifications: March 21, 1995 (J. Cuxart and J.Stein) +!! Phi3 and Psi3 at w point + cleaning +!! Modifications: July 2, 1995 (J.Cuxart and Ph.Bougeault) +!! change the value of Phi3 and Psi3 if negative +!! Modifications: Sept 20, 1995 (J. Stein, J. Cuxart, J.L. Redelsperger) +!! remove the Where + use REDTH1+REDR1 for the tests +!! Modifications: October 10, 1995 (J. Cuxart and J.Stein) +!! Psi3 for tPREDS1he scalar variables +!! Modifications: February 27, 1996 (J.Stein) optimization +!! Modifications: June 15, 1996 (P.Jabouille) return to the previous +!! computation of Phi3 and Psi3 +!! Modifications: October 10, 1996 (J. Stein) change the temporal +!! discretization +!! Modifications: May 23, 1997 (J. Stein) bug in 3D Redels number at ground +!! with orography +!! Modifications: Feb 20, 1998 (J. Stein) bug in all the 3D cases due to +!! the use of ZW1 instead of ZW2 +!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE +!! July 2005 (Tomas, Masson) implicitation of PHI3 and PSI3 +!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after +!! change of YCOMMENT +!! 2012-02 Y. Seity, add possibility to run with reversed +!! vertical levels +!! Modifications: July 2015 (Wim de Rooy) LHARAT (Racmo turbulence) switch +!! 2017-09 J.Escobar, use epsilon XMNH_TINY_12 for R*4 +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! JL Redelsperger 03/2021 : adding Ocean case for temperature only +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! +USE MODD_CST +USE MODD_CONF +USE MODD_CTURB +USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL +USE MODD_IO, ONLY: TFILEDATA +USE MODD_PARAMETERS +! +USE MODI_GRADIENT_M +USE MODE_EMOIST +USE MODE_ETHETA +USE MODI_SHUMAN, ONLY: MZM +USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index +INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO + +INTEGER, INTENT(IN) :: KRR ! number of moist var. +INTEGER, INTENT(IN) :: KRRI ! number of ice var. +! +LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some + ! diagnostic fields in the syncronous FM-file +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +CHARACTER(LEN=4), INTENT(IN) :: HTURBDIM ! Kind of turbulence param. +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY + ! metric coefficients +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential Temp. + ! of the reference state +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between +REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp +! +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turbulent Mixing length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! Dissipative length +REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM,PTKEM! Conservative Potential + ! Temperature and TKE at t-1 +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-1 + ! with PRM(:,:,:,1) = cons. + ! mixing ratio +REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Scalars at t-1 +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM + ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 +! +! +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDTH1 ! Redelsperger number R_theta +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDR1 ! Redelsperger number R_q +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2TH3 ! Redelsperger number R*2_theta +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2R3 ! Redelsperger number R*2_q +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2THR3! Redelsperger number R*2_thq +REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PREDS1 ! Redelsperger number R_s +REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2THS3! Redelsperger number R*2_thsv +REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2RS3 ! Redelsperger number R*2_qsv +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBLL_O_E! beta*Lk*Leps/tke +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PETHETA ! coefficient E_theta +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMOIST ! coefficient E_moist +! +! +! 0.2 declaration of local variables +! +REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & + ZW1, ZW2, ZW3 +! working variables +! +INTEGER :: IKB ! vertical index value for the first inner mass point +INTEGER :: IKE ! vertical index value for the last inner mass point +INTEGER :: IRESP ! Return code of FM routines +INTEGER :: ILENG ! Length of the data field in LFIFM file +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 +INTEGER:: ISV ! number of scalar variables +INTEGER:: JSV ! loop index for the scalar variables + +INTEGER :: JLOOP +REAL :: ZMINVAL +TYPE(TFIELDDATA) :: TZFIELD +! --------------------------------------------------------------------------- +! +!* 1. DEFAULT VALUES, 1D REDELSPERGER NUMBERS +! ---------------------------------------- +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('PRANDTL',0,ZHOOK_HANDLE) + +IF (LHARAT) THEN +PREDTH1(:,:,:)=0. +PREDR1(:,:,:)=0. +PRED2TH3(:,:,:)=0. +PRED2R3(:,:,:)=0. +PRED2THR3(:,:,:)=0. +PREDS1(:,:,:,:)=0. +PRED2THS3(:,:,:,:)=0. +PRED2RS3(:,:,:,:)=0. +PBLL_O_E(:,:,:)=0. +ENDIF +! +IKB = KKA+JPVEXT_TURB*KKL +IKE = KKU-JPVEXT_TURB*KKL +ILENG=SIZE(PTHLM,1)*SIZE(PTHLM,2)*SIZE(PTHLM,3) +ISV =SIZE(PSVM,4) +! +PETHETA(:,:,:) = MZM(ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM,OOCEAN), KKA, KKU, KKL) +PEMOIST(:,:,:) = MZM(EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM,OOCEAN), KKA, KKU, KKL) +PETHETA(:,:,KKA) = 2.*PETHETA(:,:,IKB) - PETHETA(:,:,IKB+KKL) +PEMOIST(:,:,KKA) = 2.*PEMOIST(:,:,IKB) - PEMOIST(:,:,IKB+KKL) +! +!--------------------------------------------------------------------------- +IF (.NOT. LHARAT) THEN +! +! 1.3 1D Redelsperger numbers +! +PBLL_O_E(:,:,:) = MZM(XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:), KKA, KKU, KKL) +IF (KRR /= 0) THEN ! moist case + PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * PETHETA(:,:,:) * & + & GZ_M_W(KKA, KKU, KKL,PTHLM,PDZZ) + PREDR1(:,:,:) = XCTV*PBLL_O_E(:,:,:) * PEMOIST(:,:,:) * & + & GZ_M_W(KKA, KKU, KKL,PRM(:,:,:,1),PDZZ) +ELSE ! dry case + PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * GZ_M_W(KKA, KKU, KKL,PTHLM,PDZZ) + PREDR1(:,:,:) = 0. +END IF +! +! 3. Limits on 1D Redelperger numbers +! -------------------------------- +! +ZMINVAL = (1.-1./XPHI_LIM) +! +ZW1 = 1. +ZW2 = 1. +! +WHERE (PREDTH1+PREDR1<-ZMINVAL) + ZW1 = (-ZMINVAL) / (PREDTH1+PREDR1) +END WHERE +! +WHERE (PREDTH1<-ZMINVAL) + ZW2 = (-ZMINVAL) / (PREDTH1) +END WHERE +ZW2 = MIN(ZW1,ZW2) +! +ZW1 = 1. +WHERE (PREDR1<-ZMINVAL) + ZW1 = (-ZMINVAL) / (PREDR1) +END WHERE +ZW1 = MIN(ZW2,ZW1) +! +! +! 3. Modification of Mixing length and dissipative length +! ---------------------------------------------------- +! +PBLL_O_E(:,:,:) = PBLL_O_E(:,:,:) * ZW1(:,:,:) +PREDTH1 (:,:,:) = PREDTH1 (:,:,:) * ZW1(:,:,:) +PREDR1 (:,:,:) = PREDR1 (:,:,:) * ZW1(:,:,:) +! +! 4. Threshold for very small (in absolute value) Redelperger numbers +! ---------------------------------------------------------------- +! +ZW2=SIGN(1.,PREDTH1(:,:,:)) +PREDTH1(:,:,:)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDTH1(:,:,:)) +! +IF (KRR /= 0) THEN ! dry case + ZW2=SIGN(1.,PREDR1(:,:,:)) + PREDR1(:,:,:)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDR1(:,:,:)) +END IF +! +! +!--------------------------------------------------------------------------- +! +! For the scalar variables +DO JSV=1,ISV + PREDS1(:,:,:,JSV)=XCTV*PBLL_O_E(:,:,:)*GZ_M_W(KKA, KKU, KKL,PSVM(:,:,:,JSV),PDZZ) +END DO +! +DO JSV=1,ISV + ZW2=SIGN(1.,PREDS1(:,:,:,JSV)) + PREDS1(:,:,:,JSV)= ZW2(:,:,:) * MAX(1.E-30, ZW2(:,:,:)*PREDS1(:,:,:,JSV)) +END DO +! +!--------------------------------------------------------------------------- +! +!* 2. 3D REDELSPERGER NUMBERS +! ------------------------ +! +IF(HTURBDIM=='1DIM') THEN ! 1D case +! +! + PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 +! + PRED2R3(:,:,:) = PREDR1(:,:,:) **2 +! + PRED2THR3(:,:,:) = PREDTH1(:,:,:) * PREDR1(:,:,:) +! +ELSE IF (L2D) THEN ! 3D case in a 2D model +! + IF (KRR /= 0) THEN ! moist 3D case + PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2+(XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & + MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) + PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) +! + PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & + MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) + PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) +! + PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & + PEMOIST(:,:,:) * PETHETA(:,:,:) * & + MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL), KKA, KKU, KKL) + PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) +! + ELSE ! dry 3D case in a 2D model + PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & + MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2, KKA, KKU, KKL) + PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) +! + PRED2R3(:,:,:) = 0. +! + PRED2THR3(:,:,:) = 0. +! + END IF +! +ELSE ! 3D case in a 3D model +! + IF (KRR /= 0) THEN ! moist 3D case + PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2 + ( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & + MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 & + + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) + PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) +! + PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & + MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 + & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) + PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) +! + PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & + PEMOIST(:,:,:) * PETHETA(:,:,:) * & + MZM(GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)+ & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL), KKA, KKU, KKL) + PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) +! + ELSE ! dry 3D case in a 3D model + PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & + MZM(GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL)**2 & + + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL)**2, KKA, KKU, KKL) + PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) +! + PRED2R3(:,:,:) = 0. +! + PRED2THR3(:,:,:) = 0. +! + END IF +! +END IF ! end of the if structure on the turbulence dimensionnality +! +! +!--------------------------------------------------------------------------- +! +! 5. Prandtl numbers for scalars +! --------------------------- +DO JSV=1,ISV +! + IF(HTURBDIM=='1DIM') THEN +! 1D case + PRED2THS3(:,:,:,JSV) = PREDS1(:,:,:,JSV) * PREDTH1(:,:,:) + IF (KRR /= 0) THEN + PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) *PREDS1(:,:,:,JSV) + ELSE + PRED2RS3(:,:,:,JSV) = 0. + END IF +! + ELSE IF (L2D) THEN ! 3D case in a 2D model +! + IF (KRR /= 0) THEN + ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA + ELSE + ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) + END IF + PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & + ZW1* & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL), & + KKA, KKU, KKL) +! + IF (KRR /= 0) THEN + PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & + ZW1 * PEMOIST * & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL), & + KKA, KKU, KKL) + ELSE + PRED2RS3(:,:,:,JSV) = 0. + END IF +! + ELSE ! 3D case in a 3D model +! + IF (KRR /= 0) THEN + ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) *PETHETA + ELSE + ZW1 = MZM((XG / PTHVREF * PLM * PLEPS / PTKEM)**2, KKA, KKU, KKL) + END IF + PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & + ZW1* & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PTHLM,PDXX,PDZZ,PDZX, KKA, KKU, KKL) & + +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & + GY_M_M(PTHLM,PDYY,PDZZ,PDZY, KKA, KKU, KKL), & + KKA, KKU, KKL) +! + IF (KRR /= 0) THEN + PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & + ZW1 * PEMOIST * & + MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX, KKA, KKU, KKL)* & + GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX, KKA, KKU, KKL) & + +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY, KKA, KKU, KKL)* & + GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY, KKA, KKU, KKL), & + KKA, KKU, KKL) + ELSE + PRED2RS3(:,:,:,JSV) = 0. + END IF +! + END IF ! end of HTURBDIM if-block +! +END DO +! +!--------------------------------------------------------------------------- +! +!* 6. SAVES THE REDELSPERGER NUMBERS +! ------------------------------ +! +IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN + ! + ! stores the RED_TH1 + TZFIELD%CMNHNAME = 'RED_TH1' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED_TH1' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED_TH1' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PREDTH1) + ! + ! stores the RED_R1 + TZFIELD%CMNHNAME = 'RED_R1' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED_R1' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED_R1' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PREDR1) + ! + ! stores the RED2_TH3 + TZFIELD%CMNHNAME = 'RED2_TH3' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED2_TH3' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED2_TH3' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PRED2TH3) + ! + ! stores the RED2_R3 + TZFIELD%CMNHNAME = 'RED2_R3' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED2_R3' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED2_R3' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PRED2R3) + ! + ! stores the RED2_THR3 + TZFIELD%CMNHNAME = 'RED2_THR3' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'RED2_THR3' + TZFIELD%CUNITS = '1' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'X_Y_Z_RED2_THR3' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 3 + TZFIELD%LTIMEDEP = .TRUE. + CALL IO_Field_write(TPFILE,TZFIELD,PRED2THR3) + ! +END IF +! +!--------------------------------------------------------------------------- +ENDIF ! (Done only if LHARAT is FALSE) +! +IF (LHOOK) CALL DR_HOOK('PRANDTL',1,ZHOOK_HANDLE) +END SUBROUTINE PRANDTL +! SUBROUTINE SMOOTH_TURB_FUNCT(PPHI3,PF_LIM,PF) ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Phi3 @@ -54,6 +589,8 @@ FUNCTION PHI3(PREDTH1,PREDR1,PRED2TH3,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: ZW1, ZW2 INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PHI3',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PREDTH1,3)-JPVEXT_TURB ! @@ -97,6 +634,7 @@ END IF PHI3(:,:,IKB-1)=PHI3(:,:,IKB) PHI3(:,:,IKE+1)=PHI3(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PHI3',1,ZHOOK_HANDLE) END FUNCTION PHI3 !---------------------------------------------------------------------------- FUNCTION PSI_SV(PREDTH1,PREDR1,PREDS1,PRED2THS,PRED2RS,PPHI3,PPSI3) @@ -112,6 +650,8 @@ FUNCTION PSI_SV(PREDTH1,PREDR1,PREDS1,PRED2THS,PRED2RS,PPHI3,PPSI3) INTEGER :: IKB, IKE INTEGER :: JSV ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PSI_SV',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PREDTH1,3)-JPVEXT_TURB ! @@ -132,6 +672,7 @@ DO JSV=1,SIZE(PSI_SV,4) PSI_SV(:,:,IKE+1,JSV)=PSI_SV(:,:,IKE,JSV) END DO ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PSI_SV',1,ZHOOK_HANDLE) END FUNCTION PSI_SV !---------------------------------------------------------------------------- FUNCTION D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) @@ -145,6 +686,8 @@ FUNCTION D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUS REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: D_PHI3DTDZ_O_DDTDZ INTEGER :: IKB, IKE,JL,JK,JJ ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DTDZ_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PREDTH1,3)-JPVEXT_TURB ! @@ -204,6 +747,7 @@ CALL SMOOTH_TURB_FUNCT(PPHI3,PPHI3,D_PHI3DTDZ_O_DDTDZ) D_PHI3DTDZ_O_DDTDZ(:,:,IKB-1)=D_PHI3DTDZ_O_DDTDZ(:,:,IKB) D_PHI3DTDZ_O_DDTDZ(:,:,IKE+1)=D_PHI3DTDZ_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DTDZ_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_PHI3DTDZ_O_DDTDZ !---------------------------------------------------------------------------- FUNCTION D_PHI3DRDZ_O_DDRDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) @@ -217,6 +761,8 @@ FUNCTION D_PHI3DRDZ_O_DDRDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUS REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: D_PHI3DRDZ_O_DDRDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DRDZ_O_DDRDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PREDTH1,3)-JPVEXT_TURB ! @@ -254,6 +800,7 @@ CALL SMOOTH_TURB_FUNCT(PPHI3,PPHI3,D_PHI3DRDZ_O_DDRDZ) D_PHI3DRDZ_O_DDRDZ(:,:,IKB-1)=D_PHI3DRDZ_O_DDRDZ(:,:,IKB) D_PHI3DRDZ_O_DDRDZ(:,:,IKE+1)=D_PHI3DRDZ_O_DDRDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DRDZ_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_PHI3DRDZ_O_DDRDZ !---------------------------------------------------------------------------- FUNCTION D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTURBDIM,OUSERV) @@ -268,6 +815,8 @@ FUNCTION D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTURB REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: D_PHI3DTDZ2_O_DDTDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DTDZ2_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PREDTH1,3)-JPVEXT_TURB ! @@ -320,6 +869,7 @@ CALL SMOOTH_TURB_FUNCT(PPHI3,PPHI3*2.*PDTDZ,D_PHI3DTDZ2_O_DDTDZ) D_PHI3DTDZ2_O_DDTDZ(:,:,IKB-1)=D_PHI3DTDZ2_O_DDTDZ(:,:,IKB) D_PHI3DTDZ2_O_DDTDZ(:,:,IKE+1)=D_PHI3DTDZ2_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PHI3DTDZ2_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_PHI3DTDZ2_O_DDTDZ !---------------------------------------------------------------------------- FUNCTION M3_WTH_WTH2(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) @@ -331,6 +881,8 @@ FUNCTION M3_WTH_WTH2(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WTH_WTH2 INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WTH2',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -339,6 +891,7 @@ M3_WTH_WTH2(:,:,:) = XCSHF*PBLL_O_E*PETHETA*0.5/XCTD & M3_WTH_WTH2(:,:,IKB-1)=M3_WTH_WTH2(:,:,IKB) M3_WTH_WTH2(:,:,IKE+1)=M3_WTH_WTH2(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WTH2',1,ZHOOK_HANDLE) END FUNCTION M3_WTH_WTH2 !---------------------------------------------------------------------------- FUNCTION D_M3_WTH_WTH2_O_DDTDZ(PM3_WTH_WTH2,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) @@ -351,6 +904,8 @@ FUNCTION D_M3_WTH_WTH2_O_DDTDZ(PM3_WTH_WTH2,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WTH_WTH2_O_DDTDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WTH2_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -361,9 +916,13 @@ D_M3_WTH_WTH2_O_DDTDZ(:,:,:) = ( 0.5*XCSHF*PBLL_O_E*PETHETA*0.5/XCTD/PD & D_M3_WTH_WTH2_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_WTH2_O_DDTDZ(:,:,IKB) D_M3_WTH_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_WTH2_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WTH2_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WTH_WTH2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_W2TH(PREDTH1,PREDR1,PD,PKEFF,PTKE) +FUNCTION M3_WTH_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -372,18 +931,24 @@ FUNCTION M3_WTH_W2TH(PREDTH1,PREDR1,PD,PKEFF,PTKE) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WTH_W2TH INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_W2TH',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_WTH_W2TH(:,:,:) = XCSHF*PKEFF*1.5/MZM(PTKE) & +M3_WTH_W2TH(:,:,:) = XCSHF*PKEFF*1.5/MZM(PTKE, KKA, KKU, KKL) & * (1. - 0.5*PREDR1*(1.+PREDR1)/PD ) / (1.+PREDTH1) ! M3_WTH_W2TH(:,:,IKB-1)=M3_WTH_W2TH(:,:,IKB) M3_WTH_W2TH(:,:,IKE+1)=M3_WTH_W2TH(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_W2TH',1,ZHOOK_HANDLE) END FUNCTION M3_WTH_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_WTH_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKEFF,PTKE) +FUNCTION D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKEFF,PTKE) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -394,19 +959,25 @@ FUNCTION D_M3_WTH_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKEFF,PTKE) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WTH_W2TH_O_DDTDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_W2TH_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_WTH_W2TH_O_DDTDZ(:,:,:) = & - - XCSHF*PKEFF*1.5/MZM(PTKE)/(1.+PREDTH1)**2*XCTV*PBLL_O_E*PETHETA & + - XCSHF*PKEFF*1.5/MZM(PTKE, KKA, KKU, KKL)/(1.+PREDTH1)**2*XCTV*PBLL_O_E*PETHETA & * (1. - 0.5*PREDR1*(1.+PREDR1)/PD*( 1.+(1.+PREDTH1)*(1.5+PREDR1+PREDTH1)/PD) ) ! D_M3_WTH_W2TH_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_W2TH_O_DDTDZ(:,:,IKB) D_M3_WTH_W2TH_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_W2TH_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_W2TH_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WTH_W2TH_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_W2R(PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION M3_WTH_W2R(KKA,KKU,KKL,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE @@ -416,17 +987,23 @@ FUNCTION M3_WTH_W2R(PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WTH_W2R INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_W2R',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_WTH_W2R(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(PTKE)*PEMOIST*PDTDZ/PD +M3_WTH_W2R(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(PTKE, KKA, KKU, KKL)*PEMOIST*PDTDZ/PD ! M3_WTH_W2R(:,:,IKB-1)=M3_WTH_W2R(:,:,IKB) M3_WTH_W2R(:,:,IKE+1)=M3_WTH_W2R(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_W2R',1,ZHOOK_HANDLE) END FUNCTION M3_WTH_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_WTH_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST) +FUNCTION D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -437,18 +1014,24 @@ FUNCTION D_M3_WTH_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WTH_W2R_O_DDTDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_W2R_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -D_M3_WTH_W2R_O_DDTDZ(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(PTKE)*PEMOIST/PD & +D_M3_WTH_W2R_O_DDTDZ(:,:,:) = - XCSHF*PKEFF*0.75*XCTV*PBLL_O_E/MZM(PTKE, KKA, KKU, KKL)*PEMOIST/PD & * (1. - PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ! D_M3_WTH_W2R_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_W2R_O_DDTDZ(:,:,IKB) D_M3_WTH_W2R_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_W2R_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_W2R_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WTH_W2R_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_WR2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ) +FUNCTION M3_WTH_WR2(KKA,KKU,KKL,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE @@ -461,18 +1044,24 @@ FUNCTION M3_WTH_WR2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WTH_WR2 INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WR2',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_WTH_WR2(:,:,:) = - XCSHF*PKEFF*0.25*PBLL_O_E*XCTV*PEMOIST**2 & - *MZM(PBETA*PLEPS/(PSQRT_TKE*PTKE))/XCTD*PDTDZ/PD + *MZM(PBETA*PLEPS/(PSQRT_TKE*PTKE), KKA, KKU, KKL)/XCTD*PDTDZ/PD ! M3_WTH_WR2(:,:,IKB-1)=M3_WTH_WR2(:,:,IKB) M3_WTH_WR2(:,:,IKE+1)=M3_WTH_WR2(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WR2',1,ZHOOK_HANDLE) END FUNCTION M3_WTH_WR2 !---------------------------------------------------------------------------- -FUNCTION D_M3_WTH_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) +FUNCTION D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -486,19 +1075,25 @@ FUNCTION D_M3_WTH_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PB REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WTH_WR2_O_DDTDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WR2_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_WTH_WR2_O_DDTDZ(:,:,:) = - XCSHF*PKEFF*0.25*PBLL_O_E*XCTV*PEMOIST**2 & - *MZM(PBETA*PLEPS/(PSQRT_TKE*PTKE))/XCTD/PD & + *MZM(PBETA*PLEPS/(PSQRT_TKE*PTKE), KKA, KKU, KKL)/XCTD/PD & * (1. - PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ! D_M3_WTH_WR2_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_WR2_O_DDTDZ(:,:,IKB) D_M3_WTH_WR2_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_WR2_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WR2_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WTH_WR2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_WTH_WTHR(PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOIST) +FUNCTION M3_WTH_WTHR(KKA,KKU,KKL,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOIST) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF @@ -510,17 +1105,20 @@ FUNCTION M3_WTH_WTHR(PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOIST) REAL, DIMENSION(SIZE(PREDR1,1),SIZE(PREDR1,2),SIZE(PREDR1,3)) :: M3_WTH_WTHR INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WTHR',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -!M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST/MZM(PBETA*PTKE*PSQRT_TKE) & +!M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST/MZM(PBETA*PTKE*PSQRT_TKE, KKA, KKU, KKL) & ! *0.5*PLEPS/XCTD*(1+PREDR1)/PD -M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST*MZM(PBETA/PTKE*PSQRT_TKE) & +M3_WTH_WTHR(:,:,:) = XCSHF*PKEFF*PEMOIST*MZM(PBETA/PTKE*PSQRT_TKE, KKA, KKU, KKL) & *0.5*PLEPS/XCTD*(1+PREDR1)/PD ! M3_WTH_WTHR(:,:,IKB-1)=M3_WTH_WTHR(:,:,IKB) M3_WTH_WTHR(:,:,IKE+1)=M3_WTH_WTHR(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WTH_WTHR',1,ZHOOK_HANDLE) END FUNCTION M3_WTH_WTHR !---------------------------------------------------------------------------- FUNCTION D_M3_WTH_WTHR_O_DDTDZ(PM3_WTH_WTHR,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) @@ -533,6 +1131,8 @@ FUNCTION D_M3_WTH_WTHR_O_DDTDZ(PM3_WTH_WTHR,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WTH_WTHR_O_DDTDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WTHR_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -541,9 +1141,13 @@ D_M3_WTH_WTHR_O_DDTDZ(:,:,:) = - PM3_WTH_WTHR * (1.5+PREDTH1+PREDR1)/PD*XCTV*PBL D_M3_WTH_WTHR_O_DDTDZ(:,:,IKB-1)=D_M3_WTH_WTHR_O_DDTDZ(:,:,IKB) D_M3_WTH_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_WTH_WTHR_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WTH_WTHR_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WTH_WTHR_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_W2TH(PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE) +FUNCTION M3_TH2_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -554,18 +1158,24 @@ FUNCTION M3_TH2_W2TH(PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_TH2_W2TH INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_W2TH',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_TH2_W2TH(:,:,:) = - MZF((1.-0.5*PREDR1*(1.+PREDR1)/PD)/(1.+PREDTH1)*PDTDZ) & +M3_TH2_W2TH(:,:,:) = - MZF((1.-0.5*PREDR1*(1.+PREDR1)/PD)/(1.+PREDTH1)*PDTDZ, KKA, KKU, KKL) & * 1.5*PLM*PLEPS/PTKE*XCTV ! M3_TH2_W2TH(:,:,IKB-1)=M3_TH2_W2TH(:,:,IKB) M3_TH2_W2TH(:,:,IKE+1)=M3_TH2_W2TH(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_W2TH',1,ZHOOK_HANDLE) END FUNCTION M3_TH2_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSERV) +FUNCTION D_M3_TH2_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSERV) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -576,27 +1186,33 @@ FUNCTION D_M3_TH2_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSERV) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_TH2_W2TH_O_DDTDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_W2TH_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB IF (OUSERV) THEN ! D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF( & ! (1.-0.5*PREDR1*(1.+PREDR1)/PD)*(1.-(1.5+PREDTH1+PREDR1)*(1.+PREDTH1)/PD ) & -! / (1.+PREDTH1)**2 ) - D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF( & +! / (1.+PREDTH1)**2, KKA, KKU, KKL) + D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF( & (1.-0.5*PREDR1*(1.+PREDR1)/PD)*(1.-(1.5+PREDTH1+PREDR1)* & - PREDTH1*(1.+PREDTH1)/PD ) / (1.+PREDTH1)**2 ) + PREDTH1*(1.+PREDTH1)/PD ) / (1.+PREDTH1)**2, KKA, KKU, KKL) ELSE - D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF(1./(1.+PREDTH1)**2) + D_M3_TH2_W2TH_O_DDTDZ(:,:,:) = - 1.5*PLM*PLEPS/PTKE*XCTV * MZF(1./(1.+PREDTH1)**2, KKA, KKU, KKL) END IF ! D_M3_TH2_W2TH_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_W2TH_O_DDTDZ(:,:,IKB) D_M3_TH2_W2TH_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_W2TH_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_W2TH_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_TH2_W2TH_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_WTH2(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) +FUNCTION M3_TH2_WTH2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -605,18 +1221,24 @@ FUNCTION M3_TH2_WTH2(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_TH2_WTH2 INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WTH2',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_TH2_WTH2(:,:,:) = PLEPS*0.5/XCTD/PSQRT_TKE & - * MZF( (1.+0.5*PREDTH1+1.5*PREDR1+0.5*PREDR1**2)/PD ) + * MZF((1.+0.5*PREDTH1+1.5*PREDR1+0.5*PREDR1**2)/PD, KKA, KKU, KKL) ! M3_TH2_WTH2(:,:,IKB-1)=M3_TH2_WTH2(:,:,IKB) M3_TH2_WTH2(:,:,IKE+1)=M3_TH2_WTH2(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WTH2',1,ZHOOK_HANDLE) END FUNCTION M3_TH2_WTH2 !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) +FUNCTION D_M3_TH2_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -627,20 +1249,26 @@ FUNCTION D_M3_TH2_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHET REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_TH2_WTH2_O_DDTDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WTH2_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_TH2_WTH2_O_DDTDZ(:,:,:) = PLEPS*0.5/XCTD/PSQRT_TKE*XCTV & - * MZF( PBLL_O_E*PETHETA* (0.5/PD & + * MZF(PBLL_O_E*PETHETA* (0.5/PD & - (1.5+PREDTH1+PREDR1)*(1.+0.5*PREDTH1+1.5*PREDR1+0.5*PREDR1**2)/PD**2 & - ) ) + ), KKA, KKU, KKL) ! D_M3_TH2_WTH2_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_WTH2_O_DDTDZ(:,:,IKB) D_M3_TH2_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WTH2_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WTH2_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_TH2_WTH2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_W2R(PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION M3_TH2_W2R(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS @@ -651,17 +1279,23 @@ FUNCTION M3_TH2_W2R(PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_TH2_W2R INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_W2R',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_TH2_W2R(:,:,:) = 0.75*XCTV**2*MZF(PBLL_O_E*PEMOIST/PD*PDTDZ**2)*PLM*PLEPS/PTKE +M3_TH2_W2R(:,:,:) = 0.75*XCTV**2*MZF(PBLL_O_E*PEMOIST/PD*PDTDZ**2, KKA, KKU, KKL)*PLM*PLEPS/PTKE ! M3_TH2_W2R(:,:,IKB-1)=M3_TH2_W2R(:,:,IKB) M3_TH2_W2R(:,:,IKE+1)=M3_TH2_W2R(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_W2R',1,ZHOOK_HANDLE) END FUNCTION M3_TH2_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION D_M3_TH2_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -674,18 +1308,24 @@ FUNCTION D_M3_TH2_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST, REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_TH2_W2R_O_DDTDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_W2R_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_TH2_W2R_O_DDTDZ(:,:,:) = 0.75*XCTV**2*PLM*PLEPS/PTKE & - * MZF( PBLL_O_E*PEMOIST/PD*PDTDZ*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) + * MZF(PBLL_O_E*PEMOIST/PD*PDTDZ*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD), KKA, KKU, KKL) ! D_M3_TH2_W2R_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_W2R_O_DDTDZ(:,:,IKB) D_M3_TH2_W2R_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_W2R_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_W2R_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_TH2_W2R_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_WR2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION M3_TH2_WR2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE @@ -695,17 +1335,23 @@ FUNCTION M3_TH2_WR2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_TH2_WR2 INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WR2',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB -M3_TH2_WR2(:,:,:) = 0.25*XCTV**2*MZF((PBLL_O_E*PEMOIST*PDTDZ)**2/PD)*PLEPS/PSQRT_TKE/XCTD +M3_TH2_WR2(:,:,:) = 0.25*XCTV**2*MZF((PBLL_O_E*PEMOIST*PDTDZ)**2/PD, KKA, KKU, KKL)*PLEPS/PSQRT_TKE/XCTD ! M3_TH2_WR2(:,:,IKB-1)=M3_TH2_WR2(:,:,IKB) M3_TH2_WR2(:,:,IKE+1)=M3_TH2_WR2(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WR2',1,ZHOOK_HANDLE) END FUNCTION M3_TH2_WR2 !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION D_M3_TH2_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -717,18 +1363,24 @@ FUNCTION D_M3_TH2_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_TH2_WR2_O_DDTDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WR2_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_TH2_WR2_O_DDTDZ(:,:,:) = 0.25*XCTV**2*PLEPS/PSQRT_TKE/XCTD & - * MZF( (PBLL_O_E*PEMOIST)**2*PDTDZ/PD*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) + * MZF((PBLL_O_E*PEMOIST)**2*PDTDZ/PD*(2.-PREDTH1*(1.5+PREDTH1+PREDR1)/PD), KKA, KKU, KKL) ! D_M3_TH2_WR2_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_WR2_O_DDTDZ(:,:,IKB) D_M3_TH2_WR2_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WR2_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WR2_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_TH2_WR2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_TH2_WTHR(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION M3_TH2_WTHR(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS @@ -739,18 +1391,24 @@ FUNCTION M3_TH2_WTHR(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_TH2_WTHR INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WTHR',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_TH2_WTHR(:,:,:) = - 0.5*XCTV*PLEPS/PSQRT_TKE/XCTD & - * MZF( PBLL_O_E*PEMOIST*PDTDZ*(1.+PREDR1)/PD ) + * MZF(PBLL_O_E*PEMOIST*PDTDZ*(1.+PREDR1)/PD, KKA, KKU, KKL) ! M3_TH2_WTHR(:,:,IKB-1)=M3_TH2_WTHR(:,:,IKB) M3_TH2_WTHR(:,:,IKE+1)=M3_TH2_WTHR(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_TH2_WTHR',1,ZHOOK_HANDLE) END FUNCTION M3_TH2_WTHR !---------------------------------------------------------------------------- -FUNCTION D_M3_TH2_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION D_M3_TH2_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -762,18 +1420,24 @@ FUNCTION D_M3_TH2_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIS REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_TH2_WTHR_O_DDTDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WTHR_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_TH2_WTHR_O_DDTDZ(:,:,:) = - 0.5*XCTV*PLEPS/PSQRT_TKE/XCTD & - * MZF( PBLL_O_E*PEMOIST*(1.+PREDR1)/PD * (1. -PREDTH1*(1.5+PREDTH1+PREDR1)/PD) ) + * MZF(PBLL_O_E*PEMOIST*(1.+PREDR1)/PD * (1. -PREDTH1*(1.5+PREDTH1+PREDR1)/PD), KKA, KKU, KKL) ! D_M3_TH2_WTHR_O_DDTDZ(:,:,IKB-1)=D_M3_TH2_WTHR_O_DDTDZ(:,:,IKB) D_M3_TH2_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_TH2_WTHR_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_TH2_WTHR_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_TH2_WTHR_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_WTHR(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) +FUNCTION M3_THR_WTHR(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -782,18 +1446,24 @@ FUNCTION M3_THR_WTHR(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_THR_WTHR INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WTHR',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_THR_WTHR(:,:,:) = 0.5*PLEPS/PSQRT_TKE/XCTD & - * MZF( (1.+PREDTH1)*(1.+PREDR1)/PD ) + * MZF((1.+PREDTH1)*(1.+PREDR1)/PD, KKA, KKU, KKL) ! M3_THR_WTHR(:,:,IKB-1)=M3_THR_WTHR(:,:,IKB) M3_THR_WTHR(:,:,IKE+1)=M3_THR_WTHR(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WTHR',1,ZHOOK_HANDLE) END FUNCTION M3_THR_WTHR !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) +FUNCTION D_M3_THR_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -804,18 +1474,24 @@ FUNCTION D_M3_THR_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHET REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WTHR_O_DDTDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTHR_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_WTHR_O_DDTDZ(:,:,:) = 0.5*PLEPS/PSQRT_TKE/XCTD * XCTV & - * MZF( PETHETA*PBLL_O_E/PD*(1.+PREDR1)*(1.-(1.+PREDTH1)*(1.5+PREDTH1+PREDR1)/PD) ) + * MZF(PETHETA*PBLL_O_E/PD*(1.+PREDR1)*(1.-(1.+PREDTH1)*(1.5+PREDTH1+PREDR1)/PD), KKA, KKU, KKL) ! D_M3_THR_WTHR_O_DDTDZ(:,:,IKB-1)=D_M3_THR_WTHR_O_DDTDZ(:,:,IKB) D_M3_THR_WTHR_O_DDTDZ(:,:,IKE+1)=D_M3_THR_WTHR_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTHR_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_WTHR_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_WTH2(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION M3_THR_WTH2(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS @@ -826,18 +1502,24 @@ FUNCTION M3_THR_WTH2(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_THR_WTH2 INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WTH2',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_THR_WTH2(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV & - * MZF( (1.+PREDR1)*PBLL_O_E*PETHETA*PDRDZ/PD ) + * MZF((1.+PREDR1)*PBLL_O_E*PETHETA*PDRDZ/PD, KKA, KKU, KKL) ! M3_THR_WTH2(:,:,IKB-1)=M3_THR_WTH2(:,:,IKB) M3_THR_WTH2(:,:,IKE+1)=M3_THR_WTH2(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WTH2',1,ZHOOK_HANDLE) END FUNCTION M3_THR_WTH2 !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION D_M3_THR_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -849,18 +1531,24 @@ FUNCTION D_M3_THR_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHET REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WTH2_O_DDTDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTH2_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_WTH2_O_DDTDZ(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV**2 & - * MZF( -(1.+PREDR1)*(PBLL_O_E*PETHETA/PD)**2*PDRDZ*(1.5+PREDTH1+PREDR1) ) + * MZF(-(1.+PREDR1)*(PBLL_O_E*PETHETA/PD)**2*PDRDZ*(1.5+PREDTH1+PREDR1), KKA, KKU, KKL) ! D_M3_THR_WTH2_O_DDTDZ(:,:,IKB-1)=D_M3_THR_WTH2_O_DDTDZ(:,:,IKB) D_M3_THR_WTH2_O_DDTDZ(:,:,IKE+1)=D_M3_THR_WTH2_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTH2_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_WTH2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WTH2_O_DDRDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) +FUNCTION D_M3_THR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -871,20 +1559,26 @@ FUNCTION D_M3_THR_WTH2_O_DDRDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHET REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WTH2_O_DDRDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTH2_O_DDRDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_WTH2_O_DDRDZ(:,:,:) = - 0.25*PLEPS/PSQRT_TKE/XCTD*XCTV & - * MZF( PBLL_O_E*PETHETA/PD & - *(-(1.+PREDR1)*PREDR1/PD*(1.5+PREDTH1+PREDR1)+(1.+2.*PREDR1)) & - ) + * MZF(PBLL_O_E*PETHETA/PD & + *(-(1.+PREDR1)*PREDR1/PD*(1.5+PREDTH1+PREDR1)+(1.+2.*PREDR1)), & + KKA, KKU, KKL) ! D_M3_THR_WTH2_O_DDRDZ(:,:,IKB-1)=D_M3_THR_WTH2_O_DDRDZ(:,:,IKB) D_M3_THR_WTH2_O_DDRDZ(:,:,IKE+1)=D_M3_THR_WTH2_O_DDRDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTH2_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_WTH2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_W2TH(PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ) +FUNCTION M3_THR_W2TH(KKA,KKU,KKL,PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM @@ -894,18 +1588,24 @@ FUNCTION M3_THR_W2TH(PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_THR_W2TH INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_W2TH',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB M3_THR_W2TH(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV & - * MZF( (1.+PREDR1)*PDRDZ/PD ) + * MZF((1.+PREDR1)*PDRDZ/PD, KKA, KKU, KKL) ! M3_THR_W2TH(:,:,IKB-1)=M3_THR_W2TH(:,:,IKB) M3_THR_W2TH(:,:,IKE+1)=M3_THR_W2TH(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_W2TH',1,ZHOOK_HANDLE) END FUNCTION M3_THR_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDRDZ,PETHETA) +FUNCTION D_M3_THR_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDRDZ,PETHETA) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -918,19 +1618,25 @@ FUNCTION D_M3_THR_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDRDZ,P REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_W2TH_O_DDTDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2TH_O_DDTDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_W2TH_O_DDTDZ(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV**2 & - * MZF( -PETHETA*PBLL_O_E*(1.+PREDR1)*PDRDZ*(1.5+PREDTH1+PREDR1)/PD**2 ) + * MZF(-PETHETA*PBLL_O_E*(1.+PREDR1)*PDRDZ*(1.5+PREDTH1+PREDR1)/PD**2, KKA, KKU, KKL) ! D_M3_THR_W2TH_O_DDTDZ(:,:,IKB-1)=D_M3_THR_W2TH_O_DDTDZ(:,:,IKB) D_M3_THR_W2TH_O_DDTDZ(:,:,IKE+1)=D_M3_THR_W2TH_O_DDTDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2TH_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_W2TH_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_W2TH_O_DDRDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE) +FUNCTION D_M3_THR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -940,18 +1646,21 @@ FUNCTION D_M3_THR_W2TH_O_DDRDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_W2TH_O_DDRDZ INTEGER :: IKB, IKE ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2TH_O_DDRDZ',0,ZHOOK_HANDLE) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB D_M3_THR_W2TH_O_DDRDZ(:,:,:) = - 0.75*PLM*PLEPS/PTKE * XCTV & - * MZF( -(1.+PREDR1)*PREDR1*(1.5+PREDTH1+PREDR1)/PD**2 & - +(1.+2.*PREDR1)/PD & - ) + * MZF(-(1.+PREDR1)*PREDR1*(1.5+PREDTH1+PREDR1)/PD**2 & + +(1.+2.*PREDR1)/PD, & + KKA, KKU, KKL) ! D_M3_THR_W2TH_O_DDRDZ(:,:,IKB-1)=D_M3_THR_W2TH_O_DDRDZ(:,:,IKB) D_M3_THR_W2TH_O_DDRDZ(:,:,IKE+1)=D_M3_THR_W2TH_O_DDRDZ(:,:,IKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2TH_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_W2TH_O_DDRDZ !---------------------------------------------------------------------------- !---------------------------------------------------------------------------- @@ -967,8 +1676,11 @@ FUNCTION PSI3(PREDR1,PREDTH1,PRED2R3,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) LOGICAL, INTENT(IN) :: OUSERV ! flag to use vapor REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: PSI3 ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PSI3',0,ZHOOK_HANDLE) PSI3 = PHI3(PREDR1,PREDTH1,PRED2R3,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:PSI3',1,ZHOOK_HANDLE) END FUNCTION PSI3 !---------------------------------------------------------------------------- FUNCTION D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) @@ -981,10 +1693,13 @@ FUNCTION D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSE LOGICAL, INTENT(IN) :: OUSERV ! flag to use vapor REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: D_PSI3DRDZ_O_DDRDZ +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DRDZ_O_DDRDZ',0,ZHOOK_HANDLE) D_PSI3DRDZ_O_DDRDZ = D_PHI3DTDZ_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) ! !C'est ok?! ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DRDZ_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_PSI3DRDZ_O_DDRDZ !---------------------------------------------------------------------------- FUNCTION D_PSI3DTDZ_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) @@ -997,8 +1712,11 @@ FUNCTION D_PSI3DTDZ_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSE LOGICAL, INTENT(IN) :: OUSERV ! flag to use vapor REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: D_PSI3DTDZ_O_DDTDZ ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DTDZ_O_DDTDZ',0,ZHOOK_HANDLE) D_PSI3DTDZ_O_DDTDZ = D_PHI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,OUSERV) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DTDZ_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_PSI3DTDZ_O_DDTDZ !---------------------------------------------------------------------------- FUNCTION D_PSI3DRDZ2_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDRDZ,HTURBDIM,OUSERV) @@ -1012,8 +1730,11 @@ FUNCTION D_PSI3DRDZ2_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDRDZ,HTURBD LOGICAL, INTENT(IN) :: OUSERV ! flag to use vapor REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: D_PSI3DRDZ2_O_DDRDZ ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DRDZ2_O_DDRDZ',0,ZHOOK_HANDLE) D_PSI3DRDZ2_O_DDRDZ = D_PHI3DTDZ2_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDRDZ,HTURBDIM,OUSERV) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_PSI3DRDZ2_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_PSI3DRDZ2_O_DDRDZ !---------------------------------------------------------------------------- FUNCTION M3_WR_WR2(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) @@ -1024,8 +1745,11 @@ FUNCTION M3_WR_WR2(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WR_WR2 ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WR2',0,ZHOOK_HANDLE) M3_WR_WR2 = M3_WTH_WTH2(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WR2',1,ZHOOK_HANDLE) END FUNCTION M3_WR_WR2 !---------------------------------------------------------------------------- FUNCTION D_M3_WR_WR2_O_DDRDZ(PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) @@ -1037,11 +1761,17 @@ FUNCTION D_M3_WR_WR2_O_DDRDZ(PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WR_WR2_O_DDRDZ ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WR2_O_DDRDZ',0,ZHOOK_HANDLE) D_M3_WR_WR2_O_DDRDZ = D_M3_WTH_WTH2_O_DDTDZ(PM3_WR_WR2,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WR2_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WR_WR2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_W2R(PREDR1,PREDTH1,PD,PKEFF,PTKE) +FUNCTION M3_WR_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1049,11 +1779,17 @@ FUNCTION M3_WR_W2R(PREDR1,PREDTH1,PD,PKEFF,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WR_W2R ! -M3_WR_W2R = M3_WTH_W2TH(PREDR1,PREDTH1,PD,PKEFF,PTKE) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_W2R',0,ZHOOK_HANDLE) +M3_WR_W2R = M3_WTH_W2TH(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_W2R',1,ZHOOK_HANDLE) END FUNCTION M3_WR_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_WR_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) +FUNCTION D_M3_WR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1063,11 +1799,17 @@ FUNCTION D_M3_WR_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WR_W2R_O_DDRDZ ! -D_M3_WR_W2R_O_DDRDZ = D_M3_WTH_W2TH_O_DDTDZ(PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_W2R_O_DDRDZ',0,ZHOOK_HANDLE) +D_M3_WR_W2R_O_DDRDZ = D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST,PKEFF,PTKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_W2R_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WR_W2R_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_W2TH(PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION M3_WR_W2TH(KKA,KKU,KKL,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE @@ -1076,11 +1818,17 @@ FUNCTION M3_WR_W2TH(PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WR_W2TH ! -M3_WR_W2TH = M3_WTH_W2R(PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_W2TH',0,ZHOOK_HANDLE) +M3_WR_W2TH = M3_WTH_W2R(KKA,KKU,KKL,PD,PKEFF,PTKE,PBLL_O_E,PETHETA,PDRDZ) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_W2TH',1,ZHOOK_HANDLE) END FUNCTION M3_WR_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_WR_W2TH_O_DDRDZ(PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) +FUNCTION D_M3_WR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1090,11 +1838,17 @@ FUNCTION D_M3_WR_W2TH_O_DDRDZ(PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WR_W2TH_O_DDRDZ ! -D_M3_WR_W2TH_O_DDRDZ = D_M3_WTH_W2R_O_DDTDZ(PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_W2TH_O_DDRDZ',0,ZHOOK_HANDLE) +D_M3_WR_W2TH_O_DDRDZ = D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PBLL_O_E,PETHETA) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_W2TH_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WR_W2TH_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_WTH2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) +FUNCTION M3_WR_WTH2(KKA,KKU,KKL,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE @@ -1106,11 +1860,17 @@ FUNCTION M3_WR_WTH2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WR_WTH2 ! -M3_WR_WTH2 = M3_WTH_WR2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WTH2',0,ZHOOK_HANDLE) +M3_WR_WTH2 = M3_WTH_WR2(KKA,KKU,KKL,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA,PDRDZ) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WTH2',1,ZHOOK_HANDLE) END FUNCTION M3_WR_WTH2 !---------------------------------------------------------------------------- -FUNCTION D_M3_WR_WTH2_O_DDRDZ(PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) +FUNCTION D_M3_WR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1123,11 +1883,17 @@ FUNCTION D_M3_WR_WTH2_O_DDRDZ(PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PB REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WR_WTH2_O_DDRDZ ! -D_M3_WR_WTH2_O_DDRDZ = D_M3_WTH_WR2_O_DDTDZ(PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WTH2_O_DDRDZ',0,ZHOOK_HANDLE) +D_M3_WR_WTH2_O_DDRDZ = D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PETHETA) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WTH2_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WR_WTH2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_WR_WTHR(PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) +FUNCTION M3_WR_WTHR(KKA,KKU,KKL,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PKEFF @@ -1138,11 +1904,17 @@ FUNCTION M3_WR_WTHR(PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_WR_WTHR ! -M3_WR_WTHR = M3_WTH_WTHR(PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WTHR',0,ZHOOK_HANDLE) +M3_WR_WTHR = M3_WTH_WTHR(KKA,KKU,KKL,PREDTH1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PETHETA) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_WR_WTHR',1,ZHOOK_HANDLE) END FUNCTION M3_WR_WTHR !---------------------------------------------------------------------------- -FUNCTION D_M3_WR_WTHR_O_DDRDZ(PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) +FUNCTION D_M3_WR_WTHR_O_DDRDZ(KKA,KKU,KKL,PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PM3_WR_WTHR REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 @@ -1151,11 +1923,17 @@ FUNCTION D_M3_WR_WTHR_O_DDRDZ(PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_WR_WTHR_O_DDRDZ ! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WTHR_O_DDRDZ',0,ZHOOK_HANDLE) D_M3_WR_WTHR_O_DDRDZ = D_M3_WTH_WTHR_O_DDTDZ(PM3_WR_WTHR,PREDR1,PREDTH1,PD,PBLL_O_E,PEMOIST) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_WR_WTHR_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_WR_WTHR_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_W2R(PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) +FUNCTION M3_R2_W2R(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1165,11 +1943,17 @@ FUNCTION M3_R2_W2R(PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_W2R ! -M3_R2_W2R = M3_TH2_W2TH(PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_W2R',0,ZHOOK_HANDLE) +M3_R2_W2R = M3_TH2_W2TH(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PDRDZ,PLM,PLEPS,PTKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_W2R',1,ZHOOK_HANDLE) END FUNCTION M3_R2_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) +FUNCTION D_M3_R2_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1179,11 +1963,17 @@ FUNCTION D_M3_R2_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) LOGICAL, INTENT(IN) :: OUSERV REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_W2R_O_DDRDZ ! -D_M3_R2_W2R_O_DDRDZ = D_M3_TH2_W2TH_O_DDTDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_W2R_O_DDRDZ',0,ZHOOK_HANDLE) +D_M3_R2_W2R_O_DDRDZ = D_M3_TH2_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,OUSERV) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_W2R_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_R2_W2R_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_WR2(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) +FUNCTION M3_R2_WR2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1191,11 +1981,17 @@ FUNCTION M3_R2_WR2(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_WR2 ! -M3_R2_WR2 = M3_TH2_WTH2(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WR2',0,ZHOOK_HANDLE) +M3_R2_WR2 = M3_TH2_WTH2(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WR2',1,ZHOOK_HANDLE) END FUNCTION M3_R2_WR2 !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_WR2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +FUNCTION D_M3_R2_WR2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1205,11 +2001,17 @@ FUNCTION D_M3_R2_WR2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_WR2_O_DDRDZ ! -D_M3_R2_WR2_O_DDRDZ = D_M3_TH2_WTH2_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WR2_O_DDRDZ',0,ZHOOK_HANDLE) +D_M3_R2_WR2_O_DDRDZ = D_M3_TH2_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WR2_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_R2_WR2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_W2TH(PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION M3_R2_W2TH(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS @@ -1219,11 +2021,17 @@ FUNCTION M3_R2_W2TH(PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_W2TH ! -M3_R2_W2TH = M3_TH2_W2R(PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_W2TH',0,ZHOOK_HANDLE) +M3_R2_W2TH = M3_TH2_W2R(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_W2TH',1,ZHOOK_HANDLE) END FUNCTION M3_R2_W2TH !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_W2TH_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION D_M3_R2_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1235,11 +2043,17 @@ FUNCTION D_M3_R2_W2TH_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA, REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_W2TH_O_DDRDZ ! -D_M3_R2_W2TH_O_DDRDZ = D_M3_TH2_W2R_O_DDTDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_W2TH_O_DDRDZ',0,ZHOOK_HANDLE) +D_M3_R2_W2TH_O_DDRDZ = D_M3_TH2_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PETHETA,PDRDZ) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_W2TH_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_R2_W2TH_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_WTH2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION M3_R2_WTH2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE @@ -1248,11 +2062,17 @@ FUNCTION M3_R2_WTH2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_WTH2 ! -M3_R2_WTH2 = M3_TH2_WR2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WTH2',0,ZHOOK_HANDLE) +M3_R2_WTH2 = M3_TH2_WR2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WTH2',1,ZHOOK_HANDLE) END FUNCTION M3_R2_WTH2 !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_WTH2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION D_M3_R2_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1263,11 +2083,17 @@ FUNCTION D_M3_R2_WTH2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_WTH2_O_DDRDZ ! -D_M3_R2_WTH2_O_DDRDZ = D_M3_TH2_WR2_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WTH2_O_DDRDZ',0,ZHOOK_HANDLE) +D_M3_R2_WTH2_O_DDRDZ = D_M3_TH2_WR2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WTH2_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_R2_WTH2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_R2_WTHR(PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION M3_R2_WTHR(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS @@ -1277,11 +2103,17 @@ FUNCTION M3_R2_WTHR(PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_R2_WTHR ! -M3_R2_WTHR = M3_TH2_WTHR(PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WTHR',0,ZHOOK_HANDLE) +M3_R2_WTHR = M3_TH2_WTHR(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_R2_WTHR',1,ZHOOK_HANDLE) END FUNCTION M3_R2_WTHR !---------------------------------------------------------------------------- -FUNCTION D_M3_R2_WTHR_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +FUNCTION D_M3_R2_WTHR_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1292,11 +2124,17 @@ FUNCTION D_M3_R2_WTHR_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA REAL, DIMENSION(:,:,:), INTENT(IN) :: PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_R2_WTHR_O_DDRDZ ! -D_M3_R2_WTHR_O_DDRDZ = D_M3_TH2_WTHR_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WTHR_O_DDRDZ',0,ZHOOK_HANDLE) +D_M3_R2_WTHR_O_DDRDZ = D_M3_TH2_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_R2_WTHR_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_R2_WTHR_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WTHR_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +FUNCTION D_M3_THR_WTHR_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1306,11 +2144,17 @@ FUNCTION D_M3_THR_WTHR_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIS REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WTHR_O_DDRDZ ! -D_M3_THR_WTHR_O_DDRDZ = D_M3_THR_WTHR_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTHR_O_DDRDZ',0,ZHOOK_HANDLE) +D_M3_THR_WTHR_O_DDRDZ = D_M3_THR_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WTHR_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_WTHR_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_WR2(PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION M3_THR_WR2(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS @@ -1320,11 +2164,17 @@ FUNCTION M3_THR_WR2(PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_THR_WR2 ! -M3_THR_WR2 = M3_THR_WTH2(PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WR2',0,ZHOOK_HANDLE) +M3_THR_WR2 = M3_THR_WTH2(KKA,KKU,KKL,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_WR2',1,ZHOOK_HANDLE) END FUNCTION M3_THR_WR2 !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WR2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +FUNCTION D_M3_THR_WR2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1335,11 +2185,17 @@ FUNCTION D_M3_THR_WR2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WR2_O_DDRDZ ! -D_M3_THR_WR2_O_DDRDZ = D_M3_THR_WTH2_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WR2_O_DDRDZ',0,ZHOOK_HANDLE) +D_M3_THR_WR2_O_DDRDZ = D_M3_THR_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WR2_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_WR2_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_WR2_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +FUNCTION D_M3_THR_WR2_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1349,11 +2205,17 @@ FUNCTION D_M3_THR_WR2_O_DDTDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_WR2_O_DDTDZ ! -D_M3_THR_WR2_O_DDTDZ = D_M3_THR_WTH2_O_DDRDZ(PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WR2_O_DDTDZ',0,ZHOOK_HANDLE) +D_M3_THR_WR2_O_DDTDZ = D_M3_THR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_WR2_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_WR2_O_DDTDZ !---------------------------------------------------------------------------- -FUNCTION M3_THR_W2R(PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) +FUNCTION M3_THR_W2R(KKA,KKU,KKL,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM @@ -1362,11 +2224,17 @@ FUNCTION M3_THR_W2R(PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: M3_THR_W2R ! -M3_THR_W2R = M3_THR_W2TH(PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_W2R',0,ZHOOK_HANDLE) +M3_THR_W2R = M3_THR_W2TH(KKA,KKU,KKL,PREDTH1,PD,PLM,PLEPS,PTKE,PDTDZ) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:M3_THR_W2R',1,ZHOOK_HANDLE) END FUNCTION M3_THR_W2R !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST) +FUNCTION D_M3_THR_W2R_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1378,11 +2246,17 @@ FUNCTION D_M3_THR_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PE REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_W2R_O_DDRDZ ! -D_M3_THR_W2R_O_DDRDZ = D_M3_THR_W2TH_O_DDTDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2R_O_DDRDZ',0,ZHOOK_HANDLE) +D_M3_THR_W2R_O_DDRDZ = D_M3_THR_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDTDZ,PEMOIST) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2R_O_DDRDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_W2R_O_DDRDZ !---------------------------------------------------------------------------- -FUNCTION D_M3_THR_W2R_O_DDTDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) +FUNCTION D_M3_THR_W2R_O_DDTDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) + INTEGER, INTENT(IN) :: KKA + INTEGER, INTENT(IN) :: KKU + INTEGER, INTENT(IN) :: KKL REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PD @@ -1391,9 +2265,13 @@ FUNCTION D_M3_THR_W2R_O_DDTDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKE REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: D_M3_THR_W2R_O_DDTDZ ! -D_M3_THR_W2R_O_DDTDZ = D_M3_THR_W2TH_O_DDRDZ(PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) +REAL(KIND=JPRB) :: ZHOOK_HANDLE +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2R_O_DDTDZ',0,ZHOOK_HANDLE) +D_M3_THR_W2R_O_DDTDZ = D_M3_THR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDR1,PREDTH1,PD,PLM,PLEPS,PTKE) ! +IF (LHOOK) CALL DR_HOOK('MODE_PRANDTL:D_M3_THR_W2R_O_DDTDZ',1,ZHOOK_HANDLE) END FUNCTION D_M3_THR_W2R_O_DDTDZ !---------------------------------------------------------------------------- ! END MODULE MODE_PRANDTL + 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 diff --git a/src/mesonh/turb/modn_turb.f90 b/src/mesonh/turb/modn_turb.f90 deleted file mode 100644 index a7c794abd940f90b7eb71a1aa84b5e0158ce2531..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/modn_turb.f90 +++ /dev/null @@ -1,47 +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 modn 2006/05/18 13:07:25 -!----------------------------------------------------------------- -! ################### - MODULE MODN_TURB -! ################### -! -!!**** *MODN_TURB* - declaration of namelist NAM_TURB -!! -!! PURPOSE -!! ------- -! The purpose of this module is to specify the namelist NAM_TURB -! which concern the parameters of the turbulence scheme for all models -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original November 2005 -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CTURB -! -IMPLICIT NONE -! -NAMELIST/NAM_TURB/XPHI_LIM, XSBL_O_BL, XFTOP_O_FSURF -! -END MODULE MODN_TURB diff --git a/src/mesonh/turb/modn_turb_cloud.f90 b/src/mesonh/turb/modn_turb_cloud.f90 deleted file mode 100644 index f4929a58cadf6d1dae0e84f8e0d9a2ff542af502..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/modn_turb_cloud.f90 +++ /dev/null @@ -1,49 +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 modn 2006/05/18 13:07:25 -!----------------------------------------------------------------- -! ################## - MODULE MODN_TURB_CLOUD -! ################## -! -!!**** *MODN_TURB_CLOUD* - declaration of namelist NAM_TURB_CLOUD -!! -!! PURPOSE -!! ------- -! The purpose of this module is to specify the namelist NAM_TURB_CLOUD -! which concern the parameters of the cloud mixing length for a given model. -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_TURB_CLOUD -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! M. Tomasini *Meteo France* -!! -!! MODIFICATIONS -!! ------------- -!! Original September, 2004 -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_TURB_CLOUD -! -IMPLICIT NONE -! -NAMELIST/NAM_TURB_CLOUD/NMODEL_CLOUD, CTURBLEN_CLOUD, & - XCOEF_AMPL_SAT, XCEI_MIN, XCEI_MAX -! -END MODULE MODN_TURB_CLOUD diff --git a/src/mesonh/turb/modn_turbn.f90 b/src/mesonh/turb/modn_turbn.f90 deleted file mode 100644 index 3e777d2da81815862ba89818f858227e14421550..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/modn_turbn.f90 +++ /dev/null @@ -1,167 +0,0 @@ -!MNH_LIC Copyright 1995-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. -!----------------------------------------------------------------- -! ################### - MODULE MODN_TURB_n -! ################### -! -!!**** *MODN_TURB$n* - declaration of namelist NAM_TURBn -!! -!! PURPOSE -!! ------- -! The purpose of this module is to specify the namelist NAM_TURBn -! which concern the parameters of the turbulence scheme for one nested -! model. -! -!! -!!** IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_TURB$n : contains declaration of turbulence scheme -!! variables entering by a namelist -!! -!! XIMPL,CTURBLEN,CTURBDIM,LTURB_FLX -!! LTURB_DIAG,LSUBG_COND,LTGT_FLX -!! -!! REFERENCE -!! --------- -!! Book2 of documentation of Meso-NH (module MODD_TURBn) -!! -!! AUTHOR -!! ------ -!! J. Cuxart and J. Stein * I.N.M. and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original January 9, 1995 -!! J.Cuxart February 15, 1995 add the switches for diagnostic storages -!! J. Stein June 14, 1995 add the subgrid condensation switch -!! J. Stein October, 1999 add the tangential fluxes switch -!! M. Tomasini Jul 05, 2001 add the subgrid autoconversion -!! P. Bechtold Feb 11, 2002 add switch for Sigma_s computation -!! P. Jabouille Apr 4, 2002 add switch for Sigma_s convection -!! V. Masson Nov 13 2002 add switch for SBL lengths -!! D. Ricard May, 2021 add switch for Leonard Terms -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_TURB_n, ONLY: & - XIMPL_n => XIMPL, & - XKEMIN_n => XKEMIN, & - XCEDIS_n => XCEDIS, & - XCADAP_n => XCADAP, & - CTURBLEN_n => CTURBLEN, & - CTURBDIM_n => CTURBDIM, & - LTURB_FLX_n => LTURB_FLX, & - LTURB_DIAG_n => LTURB_DIAG, & - LSUBG_COND_n => LSUBG_COND, & - LSIGMAS_n => LSIGMAS, & - LSIG_CONV_n => LSIG_CONV, & - LRMC01_n => LRMC01, & - CTOM_n => CTOM, & - CSUBG_AUCV_n => CSUBG_AUCV, & - VSIGQSAT_n => VSIGQSAT, & - CSUBG_AUCV_RI_n => CSUBG_AUCV_RI, & - CCONDENS_n => CCONDENS, & - CLAMBDA3_n => CLAMBDA3, & - CSUBG_MF_PDF_n => CSUBG_MF_PDF, & - LHGRAD_n => LHGRAD, & - XCOEFHGRADTHL_n => XCOEFHGRADTHL, & - XCOEFHGRADRM_n => XCOEFHGRADRM, & - XALTHGRAD_n => XALTHGRAD, & - XCLDTHOLD_n => XCLDTHOLD -! -IMPLICIT NONE -! -REAL,SAVE :: XIMPL -REAL,SAVE :: XKEMIN -REAL,SAVE :: XCEDIS -REAL,SAVE :: XCADAP -CHARACTER (LEN=4),SAVE :: CTURBLEN -CHARACTER (LEN=4),SAVE :: CTURBDIM -LOGICAL,SAVE :: LTURB_FLX -LOGICAL,SAVE :: LTURB_DIAG -LOGICAL,SAVE :: LSUBG_COND -LOGICAL,SAVE :: LSIGMAS -LOGICAL,SAVE :: LSIG_CONV -LOGICAL,SAVE :: LRMC01 -CHARACTER (LEN=4),SAVE :: CTOM -CHARACTER (LEN=4),SAVE :: CSUBG_AUCV -CHARACTER (LEN=80),SAVE :: CSUBG_AUCV_RI -CHARACTER (LEN=80),SAVE :: CCONDENS -CHARACTER (LEN=4),SAVE :: CLAMBDA3 -CHARACTER (LEN=80),SAVE :: CSUBG_MF_PDF -REAL,SAVE :: VSIGQSAT -LOGICAL,SAVE :: LHGRAD -REAL,SAVE :: XCOEFHGRADTHL -REAL,SAVE :: XCOEFHGRADRM -REAL,SAVE :: XALTHGRAD -REAL,SAVE :: XCLDTHOLD -! -NAMELIST/NAM_TURBn/XIMPL,CTURBLEN,CTURBDIM,LTURB_FLX,LTURB_DIAG, & - LSUBG_COND,LSIGMAS,LSIG_CONV,LRMC01,CTOM,CSUBG_AUCV,& - XKEMIN,VSIGQSAT,XCEDIS,XCADAP,CSUBG_AUCV_RI,CCONDENS,& - CLAMBDA3,CSUBG_MF_PDF,LHGRAD,XCOEFHGRADTHL, XCOEFHGRADRM, & - XALTHGRAD, XCLDTHOLD - -! -CONTAINS -! -SUBROUTINE INIT_NAM_TURBn - XIMPL = XIMPL_n - XKEMIN = XKEMIN_n - XCEDIS = XCEDIS_n - XCADAP = XCADAP_n - CTURBLEN = CTURBLEN_n - CTURBDIM = CTURBDIM_n - LTURB_FLX = LTURB_FLX_n - LTURB_DIAG = LTURB_DIAG_n - LSUBG_COND = LSUBG_COND_n - LSIGMAS = LSIGMAS_n - LSIG_CONV = LSIG_CONV_n - LRMC01 = LRMC01_n - CTOM = CTOM_n - CSUBG_AUCV = CSUBG_AUCV_n - VSIGQSAT = VSIGQSAT_n - CSUBG_AUCV_RI = CSUBG_AUCV_RI_n - CCONDENS = CCONDENS_n - CLAMBDA3 = CLAMBDA3_n - CSUBG_MF_PDF = CSUBG_MF_PDF_n - LHGRAD = LHGRAD_n - XCOEFHGRADTHL = XCOEFHGRADTHL_n - XCOEFHGRADRM = XCOEFHGRADRM_n - XALTHGRAD = XALTHGRAD_n - XCLDTHOLD = XCLDTHOLD_n -END SUBROUTINE INIT_NAM_TURBn - -SUBROUTINE UPDATE_NAM_TURBn - XIMPL_n = XIMPL - XKEMIN_n = XKEMIN - XCEDIS_n = XCEDIS - XCADAP_n = XCADAP - CTURBLEN_n = CTURBLEN - CTURBDIM_n = CTURBDIM - LTURB_FLX_n = LTURB_FLX - LTURB_DIAG_n = LTURB_DIAG - LSUBG_COND_n = LSUBG_COND - LSIGMAS_n = LSIGMAS - LSIG_CONV_n = LSIG_CONV - LRMC01_n = LRMC01 - CTOM_n = CTOM - CSUBG_AUCV_n = CSUBG_AUCV - VSIGQSAT_n = VSIGQSAT - CSUBG_AUCV_RI_n = CSUBG_AUCV_RI - CCONDENS_n = CCONDENS - CLAMBDA3_n = CLAMBDA3 - CSUBG_MF_PDF_n = CSUBG_MF_PDF - LHGRAD_n = LHGRAD - XCOEFHGRADTHL_n = XCOEFHGRADTHL - XCOEFHGRADRM_n = XCOEFHGRADRM - XALTHGRAD_n = XALTHGRAD - XCLDTHOLD_n = XCLDTHOLD -END SUBROUTINE UPDATE_NAM_TURBn - -END MODULE MODN_TURB_n diff --git a/src/mesonh/turb/prandtl.f90 b/src/mesonh/turb/prandtl.f90 deleted file mode 100644 index fbfe0a7621714cebb151faee288c99338a4a555b..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/prandtl.f90 +++ /dev/null @@ -1,609 +0,0 @@ -!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. -!----------------------------------------------------------------- -! ################### - MODULE MODI_PRANDTL -! ################### -! -INTERFACE -! - SUBROUTINE PRANDTL(KKA,KKU,KKL,KRR,KRRI,OTURB_DIAG, & - HTURBDIM, & - TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY, & - PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & - PLM,PLEPS,PTKEM,PTHLM,PRM,PSVM,PSRCM, & - PREDTH1,PREDR1, & - PRED2TH3, PRED2R3, PRED2THR3, & - PREDS1,PRED2THS3, PRED2RS3, & - PBLL_O_E, & - PETHETA, PEMOIST ) -! -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRI ! number of ice var. -! -LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some - ! diagnostic fields in the syncronous FM-file -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Kind of turbulence param. -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential Temp. - ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turbulent Mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! Dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM,PTKEM! Conservative Potential - ! Temperature and TKE at t-1 -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-1 - ! with PRM(:,:,:,1) = cons. - ! mixing ratio -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Scalars at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM - ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -! -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDTH1 ! Redelsperger number R_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDR1 ! Redelsperger number R_q -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2TH3 ! Redelsperger number R*2_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2R3 ! Redelsperger number R*2_q -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2THR3! Redelsperger number R*2_thq -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PREDS1 ! Redelsperger number R_sv -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2THS3! Redelsperger number R*2_thsv -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2RS3 ! Redelsperger number R*2_qsv -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBLL_O_E! beta*Lk*Leps/tke -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PETHETA ! coefficient E_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMOIST ! coefficient E_moist -! -END SUBROUTINE PRANDTL -! -END INTERFACE -! -END MODULE MODI_PRANDTL -! -! -! -! ########################################################### - SUBROUTINE PRANDTL(KKA,KKU,KKL,KRR,KRRI,OTURB_DIAG, & - HTURBDIM, & - TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY, & - PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & - PLM,PLEPS,PTKEM,PTHLM,PRM,PSVM,PSRCM, & - PREDTH1,PREDR1, & - PRED2TH3, PRED2R3, PRED2THR3, & - PREDS1,PRED2THS3, PRED2RS3, & - PBLL_O_E, & - PETHETA, PEMOIST ) -! ########################################################### -! -! -!!**** *PRANDTL* - routine to compute the Prandtl turbulent numbers -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute the Redelsperger -! numbers and then get the turbulent Prandtl and Schmidt numbers: -! * for the heat fluxes - PHI3 = 1/ Prandtl -! * for the moisture fluxes - PSI3 = 1/ Schmidt -! -!!** METHOD -!! ------ -!! The following steps are performed: -!! -!! 1 - default values of 1 are taken for phi3 and psi3 and different masks -!! are defined depending on the presence of turbulence, stratification and -!! humidity. The 1D Redelsperger numbers are computed -!! * ZREDTH1 : (g / THVREF ) (LT**2 / TKE ) ETHETA (D Theta / Dz) -!! * ZREDR1 : (g / THVREF ) (LT**2 / TKE ) EMOIST (D TW / Dz) -!! 2 - 3D Redelsperger numbers are computed only for turbulent -!! grid points where ZREDTH1 or ZREDR1 are > 0. -!! 3 - PHI3 is computed only for turbulent grid points where ZREDTH1 > 0 -!! (turbulent thermally stratified points) -!! 4 - PSI3 is computed only for turbulent grid points where ZREDR1 > 0 -!! (turbulent moist points) -!! -!! -!! EXTERNAL -!! -------- -!! FUNCTIONs ETHETA and EMOIST : -!! allows to compute the coefficients -!! for the turbulent correlation between any variable -!! and the virtual potential temperature, of its correlations -!! with the conservative potential temperature and the humidity -!! conservative variable: -!! ------- ------- ------- -!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' -!! -!! GX_M_M, GY_M_M, GZ_M_M : Cartesian gradient operators -!! MZM : Shuman function (mean operator in the z direction) -!! Module MODI_ETHETA : interface module for ETHETA -!! Module MODI_EMOIST : interface module for EMOIST -!! Module MODI_SHUMAN : interface module for Shuman operators -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : contains physical constants -!! XG : gravity constant -!! -!! Module MODD_CTURB: contains the set of constants for -!! the turbulence scheme -!! XCTV,XCPR2 : constants for the turbulent prandtl numbers -!! XTKEMIN : minimum value allowed for the TKE -!! -!! Module MODD_PARAMETERS -!! JPVEXT_TURB : number of vertical marginal points -!! -!! REFERENCE -!! --------- -!! Book 2 of documentation (routine PRANDTL) -!! Book 1 of documentation (Chapter: Turbulence) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart * INM and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 18/10/94 -!! Modifications: Feb 14, 1995 (J.Cuxart and J.Stein) -!! Doctorization and Optimization -!! Modifications: March 21, 1995 (J.M. Carriere) -!! Introduction of cloud water -!! Modifications: March 21, 1995 (J. Cuxart and J.Stein) -!! Phi3 and Psi3 at w point + cleaning -!! Modifications: July 2, 1995 (J.Cuxart and Ph.Bougeault) -!! change the value of Phi3 and Psi3 if negative -!! Modifications: Sept 20, 1995 (J. Stein, J. Cuxart, J.L. Redelsperger) -!! remove the Where + use REDTH1+REDR1 for the tests -!! Modifications: October 10, 1995 (J. Cuxart and J.Stein) -!! Psi3 for tPREDS1he scalar variables -!! Modifications: February 27, 1996 (J.Stein) optimization -!! Modifications: June 15, 1996 (P.Jabouille) return to the previous -!! computation of Phi3 and Psi3 -!! Modifications: October 10, 1996 (J. Stein) change the temporal -!! discretization -!! Modifications: May 23, 1997 (J. Stein) bug in 3D Redels number at ground -!! with orography -!! Modifications: Feb 20, 1998 (J. Stein) bug in all the 3D cases due to -!! the use of ZW1 instead of ZW2 -!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE -!! July 2005 (Tomas, Masson) implicitation of PHI3 and PSI3 -!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after -!! change of YCOMMENT -!! 2012-02 Y. Seity, add possibility to run with reversed -!! vertical levels -!! 2017-09 J.Escobar, use epsilon XMNH_TINY_12 for R*4 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! JL Redelsperger 03/2021 : adding Ocean case for temperature only -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_CONF -USE MODD_CTURB -USE MODD_DYN_n, ONLY: LOCEAN -use modd_field, only: tfielddata, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS -! -USE MODI_GRADIENT_M -USE MODI_EMOIST -USE MODI_ETHETA -USE MODI_SHUMAN -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO - -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRI ! number of ice var. -! -LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some - ! diagnostic fields in the syncronous FM-file -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! Kind of turbulence param. -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Potential Temp. - ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turbulent Mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! Dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM,PTKEM! Conservative Potential - ! Temperature and TKE at t-1 -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-1 - ! with PRM(:,:,:,1) = cons. - ! mixing ratio -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Scalars at t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM - ! s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -! -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDTH1 ! Redelsperger number R_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PREDR1 ! Redelsperger number R_q -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2TH3 ! Redelsperger number R*2_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2R3 ! Redelsperger number R*2_q -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRED2THR3! Redelsperger number R*2_thq -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PREDS1 ! Redelsperger number R_s -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2THS3! Redelsperger number R*2_thsv -REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PRED2RS3 ! Redelsperger number R*2_qsv -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PBLL_O_E! beta*Lk*Leps/tke -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PETHETA ! coefficient E_theta -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMOIST ! coefficient E_moist -! -! -! 0.2 declaration of local variables -! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & - ZW1, ZW2 -! working variables -! -INTEGER :: IKB ! vertical index value for the first inner mass point -INTEGER :: IKE ! vertical index value for the last inner mass point -INTEGER:: ISV ! number of scalar variables -INTEGER:: JSV ! loop index for the scalar variables - -INTEGER :: JLOOP -REAL :: ZMINVAL -TYPE(TFIELDDATA) :: TZFIELD -! --------------------------------------------------------------------------- -! -!* 1. DEFAULT VALUES, 1D REDELSPERGER NUMBERS -! ---------------------------------------- -! -IKB = KKA+JPVEXT_TURB*KKL -IKE = KKU-JPVEXT_TURB*KKL -ISV =SIZE(PSVM,4) -! -PETHETA(:,:,:) = MZM( ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) ) -PEMOIST(:,:,:) = MZM( EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) ) -PETHETA(:,:,KKA) = 2.*PETHETA(:,:,IKB) - PETHETA(:,:,IKB+KKL) -PEMOIST(:,:,KKA) = 2.*PEMOIST(:,:,IKB) - PEMOIST(:,:,IKB+KKL) -! -!--------------------------------------------------------------------------- -! -! 1.3 1D Redelsperger numbers -! -IF (LOCEAN) THEN - PBLL_O_E(:,:,:) = MZM(XG *XALPHAOC* PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:) ) - PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ) - PREDR1(:,:,:) = 0. -ELSE - PBLL_O_E(:,:,:) = MZM(XG / PTHVREF(:,:,:) * PLM(:,:,:) * PLEPS(:,:,:) / PTKEM(:,:,:) ) - IF (KRR /= 0) THEN ! moist case - PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * PETHETA(:,:,:) * & - & GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ) - PREDR1(:,:,:) = XCTV*PBLL_O_E(:,:,:) * PEMOIST(:,:,:) * & - & GZ_M_W(KKA,KKU,KKL,PRM(:,:,:,1),PDZZ) - ELSE ! dry case - PREDTH1(:,:,:)= XCTV*PBLL_O_E(:,:,:) * GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ) - PREDR1(:,:,:) = 0. - END IF -! -END IF -! -! 3. Limits on 1D Redelperger numbers -! -------------------------------- -! -ZMINVAL = (1.-1./XPHI_LIM) -! -ZW1 = 1. -ZW2 = 1. -! -WHERE (PREDTH1+PREDR1<-ZMINVAL) - ZW1 = (-ZMINVAL) / (PREDTH1+PREDR1) -END WHERE -! -WHERE (PREDTH1<-ZMINVAL) - ZW2 = (-ZMINVAL) / (PREDTH1) -END WHERE -ZW2 = MIN(ZW1,ZW2) -! -ZW1 = 1. -WHERE (PREDR1<-ZMINVAL) - ZW1 = (-ZMINVAL) / (PREDR1) -END WHERE -ZW1 = MIN(ZW2,ZW1) -! -! -! 3. Modification of Mixing length and dissipative length -! ---------------------------------------------------- -! -PBLL_O_E(:,:,:) = PBLL_O_E(:,:,:) * ZW1(:,:,:) -PREDTH1 (:,:,:) = PREDTH1 (:,:,:) * ZW1(:,:,:) -PREDR1 (:,:,:) = PREDR1 (:,:,:) * ZW1(:,:,:) -! -! 4. Threshold for very small (in absolute value) Redelperger numbers -! ---------------------------------------------------------------- -! -ZW2=SIGN(1.,PREDTH1(:,:,:)) -PREDTH1(:,:,:)= ZW2(:,:,:) * MAX(XMNH_TINY_12, ZW2(:,:,:)*PREDTH1(:,:,:)) -! -IF (.NOT.LOCEAN) THEN - IF (KRR /= 0) THEN ! dry case - ZW2=SIGN(1.,PREDR1(:,:,:)) - PREDR1(:,:,:)= ZW2(:,:,:) * MAX(XMNH_TINY_12, ZW2(:,:,:)*PREDR1(:,:,:)) - END IF -END IF -! -! -!--------------------------------------------------------------------------- -! -! For the scalar variables -DO JSV=1,ISV - PREDS1(:,:,:,JSV)=XCTV*PBLL_O_E(:,:,:)*GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ) -END DO -! -DO JSV=1,ISV - ZW2=SIGN(1.,PREDS1(:,:,:,JSV)) - PREDS1(:,:,:,JSV)= ZW2(:,:,:) * MAX(XMNH_TINY_12, ZW2(:,:,:)*PREDS1(:,:,:,JSV)) -END DO -! -!--------------------------------------------------------------------------- -! -!* 2. 3D REDELSPERGER NUMBERS -! ------------------------ -! -IF(HTURBDIM=='1DIM') THEN ! 1D case -! -! - PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 -! - PRED2R3(:,:,:) = PREDR1(:,:,:) **2 -! - PRED2THR3(:,:,:) = PREDTH1(:,:,:) * PREDR1(:,:,:) -! -ELSE IF (L2D) THEN ! 3D case in a 2D model -! - IF (KRR /= 0) THEN ! moist 3D case - PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2+(XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & - MZM( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 ) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & - MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 ) - PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) -! - PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & - PEMOIST(:,:,:) * PETHETA(:,:,:) * & - MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX)) - PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) -! - ELSE ! dry 3D case in a 2D model - PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & - MZM( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 ) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:) = 0. -! - PRED2THR3(:,:,:) = 0. -! - END IF -! -ELSE ! 3D case in a 3D model -! - IF (KRR /= 0) THEN ! moist 3D case - PRED2TH3(:,:,:)= PREDTH1(:,:,:)**2 + ( XCTV*PBLL_O_E(:,:,:)*PETHETA(:,:,:) )**2 * & - MZM( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 & - + GY_M_M(PTHLM,PDYY,PDZZ,PDZY)**2 ) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:)= PREDR1(:,:,:)**2 + (XCTV*PBLL_O_E(:,:,:)*PEMOIST(:,:,:))**2 * & - MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)**2 + & - GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)**2 ) - PRED2R3(:,:,IKB)=PRED2R3(:,:,IKB+KKL) -! - PRED2THR3(:,:,:)= PREDR1(:,:,:) * PREDTH1(:,:,:) + XCTV**2*PBLL_O_E(:,:,:)**2 * & - PEMOIST(:,:,:) * PETHETA(:,:,:) * & - MZM( GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX)+ & - GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY)* & - GY_M_M(PTHLM,PDYY,PDZZ,PDZY) ) - PRED2THR3(:,:,IKB)=PRED2THR3(:,:,IKB+KKL) -! - ELSE ! dry 3D case in a 3D model - PRED2TH3(:,:,:) = PREDTH1(:,:,:)**2 + XCTV**2*PBLL_O_E(:,:,:)**2 * & - MZM( GX_M_M(PTHLM,PDXX,PDZZ,PDZX)**2 & - + GY_M_M(PTHLM,PDYY,PDZZ,PDZY)**2 ) - PRED2TH3(:,:,IKB)=PRED2TH3(:,:,IKB+KKL) -! - PRED2R3(:,:,:) = 0. -! - PRED2THR3(:,:,:) = 0. -! - END IF -! -END IF ! end of the if structure on the turbulence dimensionnality -! -! -!--------------------------------------------------------------------------- -! -! 5. Prandtl numbers for scalars -! --------------------------- -IF(HTURBDIM=='1DIM') THEN -! 1D case - DO JSV=1,ISV - PRED2THS3(:,:,:,JSV) = PREDS1(:,:,:,JSV) * PREDTH1(:,:,:) - IF (KRR /= 0) THEN - PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) *PREDS1(:,:,:,JSV) - ELSE - PRED2RS3(:,:,:,JSV) = 0. - END IF - ENDDO -! -ELSE IF (L2D) THEN ! 3D case in a 2D model -! - IF (LOCEAN) THEN - IF (KRR /= 0) THEN - ZW1 = MZM((XG *XALPHAOC * PLM * PLEPS / PTKEM)**2 ) *PETHETA - ELSE - ZW1 = MZM((XG *XALPHAOC * PLM * PLEPS / PTKEM)**2) - END IF - ELSE - DO JSV=1,ISV - IF (KRR /= 0) THEN - ZW1 = MZM( (XG / PTHVREF * PLM * PLEPS / PTKEM)**2 ) *PETHETA - ELSE - ZW1 = MZM( (XG / PTHVREF * PLM * PLEPS / PTKEM)**2) - END IF - PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1* & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX) & - ) -! - IF (KRR /= 0) THEN - PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1 * PEMOIST * & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & - GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) & - ) - ELSE - PRED2RS3(:,:,:,JSV) = 0. - END IF - ENDDO - END IF -! -ELSE ! 3D case in a 3D model -! - IF (LOCEAN) THEN - IF (KRR /= 0) THEN - ZW1 = MZM((XG *XALPHAOC * PLM * PLEPS / PTKEM)**2 ) *PETHETA - ELSE - ZW1 = MZM((XG *XALPHAOC * PLM * PLEPS / PTKEM)**2) - END IF - ELSE - DO JSV=1,ISV - IF (KRR /= 0) THEN - ZW1 = MZM( (XG / PTHVREF * PLM * PLEPS / PTKEM)**2 ) *PETHETA - ELSE - ZW1 = MZM( (XG / PTHVREF * PLM * PLEPS / PTKEM)**2) - END IF - PRED2THS3(:,:,:,JSV) = PREDTH1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1* & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & - GX_M_M(PTHLM,PDXX,PDZZ,PDZX) & - +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)* & - GY_M_M(PTHLM,PDYY,PDZZ,PDZY) & - ) -! - IF (KRR /= 0) THEN - PRED2RS3(:,:,:,JSV) = PREDR1(:,:,:) * PREDS1(:,:,:,JSV) + & - ZW1 * PEMOIST * & - MZM(GX_M_M(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX)* & - GX_M_M(PRM(:,:,:,1),PDXX,PDZZ,PDZX) & - +GY_M_M(PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY)* & - GY_M_M(PRM(:,:,:,1),PDYY,PDZZ,PDZY) & - ) - ELSE - PRED2RS3(:,:,:,JSV) = 0. - END IF - ENDDO - END IF -! -END IF ! end of HTURBDIM if-block -! -! -!--------------------------------------------------------------------------- -! -!* 6. SAVES THE REDELSPERGER NUMBERS -! ------------------------------ -! -IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN - ! - ! stores the RED_TH1 - TZFIELD%CMNHNAME = 'RED_TH1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED_TH1' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED_TH1' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PREDTH1) - ! - ! stores the RED_R1 - TZFIELD%CMNHNAME = 'RED_R1' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED_R1' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED_R1' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PREDR1) - ! - ! stores the RED2_TH3 - TZFIELD%CMNHNAME = 'RED2_TH3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_TH3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_TH3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PRED2TH3) - ! - ! stores the RED2_R3 - TZFIELD%CMNHNAME = 'RED2_R3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_R3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_R3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PRED2R3) - ! - ! stores the RED2_THR3 - TZFIELD%CMNHNAME = 'RED2_THR3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RED2_THR3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RED2_THR3' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PRED2THR3) - ! -END IF -! -!--------------------------------------------------------------------------- -! -END SUBROUTINE PRANDTL diff --git a/src/mesonh/turb/shallow_mf.f90 b/src/mesonh/turb/shallow_mf.f90 deleted file mode 100644 index c79dfa879b44a11e2b799680deae67cd47360865..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/shallow_mf.f90 +++ /dev/null @@ -1,320 +0,0 @@ -!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 SHALLOW_MF(KKA,KKU,KKL,KRR,KRRL,KRRI, & - HMF_UPDRAFT, HMF_CLOUD, HFRAC_ICE, OMIXUV, & - ONOMIXLG,KSV_LGBEG,KSV_LGEND, & - PIMPL_MF, PTSTEP, & - PDZZ, PZZ, & - PRHODJ, PRHODREF, & - PPABSM, PEXNM, & - PSFTH,PSFRV, & - PTHM,PRM,PUM,PVM,PTKEM,PSVM, & - PDUDT_MF,PDVDT_MF, & - PDTHLDT_MF,PDRTDT_MF,PDSVDT_MF, & - PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF, & - PFLXZTHMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & - PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & - PU_UP, PV_UP, PTHV_UP, PW_UP, & - PFRAC_UP,PEMF,PDETR,PENTR, & - KKLCL,KKETL,KKCTL,PDX,PDY ) - -! ################################################################# -!! -!!**** *SHALLOW_MF* - -!! -!! -!! PURPOSE -!! ------- -!!**** The purpose of this routine is -!! -! -!!** METHOD -!! ------ -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! J.Pergaud -!! -!! MODIFICATIONS -!! ------------- -!! Original -!! V.Masson 09/2010 : optimization -!! S. Riette 18 May 2010 interface changed due to ice correction -!! S.Riette DUAL case -!! S. Riette Jan 2012: support for both order of vertical levels -!! R.Honnert 07/2012 : elemnts of Rio according to Bouteloup -!! R.Honnert 07/2012 : MF gray zone -!! R.Honnert 10/2016 : SURF=gray zone initilisation + EDKF -!! R.Honnert 10/2016 : Update with Arome -!! S. Riette Nov 2016: HFRAC_ICE support -!! Philippe Wautelet 28/05/2018: corrected truncated integer division (2/3 -> 2./3.) -!! Q.Rodier 01/2019 : support RM17 mixing length -!! R.Honnert 1/2019 : remove SURF -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! R. Honnert 04/2021: remove HRIO and BOUT schemes -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_PARAMETERS, ONLY: JPVEXT -USE MODD_NEB, ONLY: NEB -USE MODD_PARAM_MFSHALL_n - -USE MODI_THL_RT_FROM_TH_R_MF -USE MODE_COMPUTE_UPDRAFT, ONLY: COMPUTE_UPDRAFT -USE MODE_COMPUTE_UPDRAFT_RHCJ10, ONLY: COMPUTE_UPDRAFT_RHCJ10 -USE MODE_COMPUTE_UPDRAFT_RAHA, ONLY: COMPUTE_UPDRAFT_RAHA -USE MODE_MF_TURB, ONLY: MF_TURB -USE MODE_MF_TURB_EXPL, ONLY: MF_TURB_EXPL -USE MODE_COMPUTE_MF_CLOUD, ONLY: COMPUTE_MF_CLOUD -USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! -IMPLICIT NONE - -!* 0.1 Declaration of Arguments -! -! -! -INTEGER, INTENT(IN) :: KKA ! near ground array index -INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -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. -CHARACTER(LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of Mass Flux Scheme - ! 'NONE' if no parameterization -CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud - ! scheme -CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme -LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum -LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer -INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer -INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer -REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness -REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep - -REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height of flux point -REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the - ! reference state -REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 -REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM ! Exner function at t-dt - -REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv -REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! Theta at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRM ! water var. at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PUM,PVM ! wind components at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! tke at t-dt - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM ! scalar variable a t-dt - -REAL, DIMENSION(:,:), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme -REAL, DIMENSION(:,:), INTENT(OUT):: PDVDT_MF ! tendency of V by massflux scheme -REAL, DIMENSION(:,:), INTENT(OUT):: PDTHLDT_MF ! tendency of thl by massflux scheme -REAL, DIMENSION(:,:), INTENT(OUT):: PDRTDT_MF ! tendency of rt by massflux scheme -REAL, DIMENSION(:,:,:), INTENT(OUT):: PDSVDT_MF ! tendency of Sv by massflux scheme - -REAL, DIMENSION(:,:), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHMF -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZRMF -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZUMF -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZVMF -REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHL_UP ! Thl updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRT_UP ! Rt updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRV_UP ! Vapor updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PU_UP ! U wind updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PV_UP ! V wind updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRC_UP ! cloud content updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRI_UP ! ice content updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHV_UP ! Thv updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PW_UP ! vertical speed updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PFRAC_UP ! updraft fraction -REAL, DIMENSION(:,:), INTENT(INOUT) :: PEMF ! updraft mass flux -REAL, DIMENSION(:,:), INTENT(OUT) :: PDETR ! updraft detrainment -REAL, DIMENSION(:,:), INTENT(OUT) :: PENTR ! updraft entrainment -INTEGER,DIMENSION(:), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL -REAL, INTENT(IN) :: PDX, PDY -! -! 0.2 Declaration of local variables -! -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: & - ZTHLM, & ! - ZRTM, & ! - ZTHVM, & ! - ZEMF_O_RHODREF, & ! entrainment/detrainment - ZBUO_INTEG ! integrated buoyancy -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZFRAC_ICE - -REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: & - ZSV_UP,& ! updraft scalar var. - ZFLXZSVMF ! Flux -REAL, DIMENSION(SIZE(PTHM,1)) :: ZDEPTH ! Deepness of cloud -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZFRAC_ICE_UP ! liquid/solid fraction in updraft -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZRSAT_UP ! Rsat in updraft - -LOGICAL :: GENTR_DETR ! flag to recompute entrainment, detrainment and mass flux -INTEGER :: IKB ! near ground physical index -INTEGER :: IKE ! uppest atmosphere physical index -INTEGER, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: IERR -! -REAL(KIND=JPRB) :: ZHOOK_HANDLE -!------------------------------------------------------------------------ - -!!! 1. Initialisation -IF (LHOOK) CALL DR_HOOK('SHALLOW_MF',0,ZHOOK_HANDLE) - -! vertical boundaries -IKB=KKA+KKL*JPVEXT -IKE=KKU-KKL*JPVEXT - -! updraft governing variables -IF (HMF_UPDRAFT == 'EDKF' .OR. HMF_UPDRAFT == 'RHCJ') THEN - PENTR = 1.E20 - PDETR = 1.E20 - PEMF = 1.E20 - ZBUO_INTEG = 1.E20 -ENDIF - -! Thermodynamics functions -ZFRAC_ICE(:,:) = 0. -IF (SIZE(PRM,3).GE.4) THEN - WHERE(PRM(:,:,2)+PRM(:,:,4) > 1.E-20) - ZFRAC_ICE(:,:) = PRM(:,:,4) / (PRM(:,:,2)+PRM(:,:,4)) - ENDWHERE -ENDIF -CALL COMPUTE_FRAC_ICE(HFRAC_ICE,NEB,ZFRAC_ICE(:,:),PTHM(:,:)*PEXNM(:,:), IERR(:,:)) - -! Conservative variables at t-dt -CALL THL_RT_FROM_TH_R_MF(KRR,KRRL,KRRI, & - PTHM, PRM, PEXNM, & - ZTHLM, ZRTM ) - -! Virtual potential temperature at t-dt -ZTHVM(:,:) = PTHM(:,:)*((1.+XRV / XRD *PRM(:,:,1))/(1.+ZRTM(:,:))) - -! -!!! 2. Compute updraft -!!! --------------- -! -IF (HMF_UPDRAFT == 'EDKF') THEN - GENTR_DETR = .TRUE. - CALL COMPUTE_UPDRAFT(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE,GENTR_DETR,OMIXUV,& - ONOMIXLG,KSV_LGBEG,KSV_LGEND, & - PZZ,PDZZ, & - PSFTH,PSFRV,PPABSM,PRHODREF, & - PUM,PVM,PTKEM, & - PTHM,PRM(:,:,1),ZTHLM,ZRTM,PSVM, & - PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & - PTHV_UP, PW_UP, PU_UP, PV_UP, ZSV_UP, & - PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP,PEMF,PDETR,& - PENTR,ZBUO_INTEG,KKLCL,KKETL,KKCTL,ZDEPTH,& - PDX,PDY) -ELSEIF (HMF_UPDRAFT == 'RHCJ') THEN - GENTR_DETR = .TRUE. - CALL COMPUTE_UPDRAFT_RHCJ10(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE,GENTR_DETR,OMIXUV,& - ONOMIXLG,KSV_LGBEG,KSV_LGEND, & - PZZ,PDZZ, & - PSFTH,PSFRV,PPABSM,PRHODREF, & - PUM,PVM,PTKEM, & - PTHM,PRM(:,:,1),ZTHLM,ZRTM,PSVM, & - PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & - PTHV_UP, PW_UP, PU_UP, PV_UP, ZSV_UP, & - PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP,PEMF,PDETR,& - PENTR,ZBUO_INTEG,KKLCL,KKETL,KKCTL,ZDEPTH ) -ELSEIF (HMF_UPDRAFT == 'RAHA') THEN - CALL COMPUTE_UPDRAFT_RAHA(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE, & - GENTR_DETR,OMIXUV, & - ONOMIXLG,KSV_LGBEG,KSV_LGEND, & - PZZ,PDZZ, & - PSFTH,PSFRV, & - PPABSM,PRHODREF,PUM,PVM,PTKEM, & - PEXNM,PTHM,PRM(:,:,1),ZTHLM,ZRTM, & - PSVM,PTHL_UP,PRT_UP, & - PRV_UP,PRC_UP,PRI_UP, PTHV_UP, & - PW_UP, PU_UP, PV_UP, ZSV_UP, & - PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP, & - PEMF,PDETR,PENTR, & - ZBUO_INTEG,KKLCL,KKETL,KKCTL, & - ZDEPTH ) -ELSEIF (HMF_UPDRAFT == 'DUAL') THEN - !Updraft characteristics are already computed and received by interface -ELSE - CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'SHALLOW_MF', 'no updraft model for EDKF: CMF_UPDRAFT='//TRIM(HMF_UPDRAFT) ) -ENDIF - -!!! 5. Compute diagnostic convective cloud fraction and content -!!! -------------------------------------------------------- -! -CALL COMPUTE_MF_CLOUD(KKA,IKB,IKE,KKU,KKL,KRR,KRRL,KRRI,& - HMF_CLOUD,ZFRAC_ICE, & - PRC_UP,PRI_UP,PEMF, & - PTHL_UP,PRT_UP,PFRAC_UP, & - PTHV_UP,ZFRAC_ICE_UP, & - ZRSAT_UP,PEXNM,ZTHLM,ZRTM, & - PTHM, ZTHVM, PRM, & - PDZZ,PZZ,KKLCL, & - PPABSM,PRHODREF, & - PRC_MF,PRI_MF,PCF_MF,PSIGMF,ZDEPTH) - - -!!! 3. Compute fluxes of conservative variables and their divergence = tendency -!!! ------------------------------------------------------------------------ -! -ZEMF_O_RHODREF=PEMF/PRHODREF - -IF ( PIMPL_MF > 1.E-10 ) THEN - CALL MF_TURB(KKA, IKB, IKE, KKU, KKL, OMIXUV, & - ONOMIXLG,KSV_LGBEG,KSV_LGEND, & - PIMPL_MF, PTSTEP, & - PDZZ, & - PRHODJ, & - ZTHLM,ZTHVM,ZRTM,PUM,PVM,PSVM, & - PDTHLDT_MF,PDRTDT_MF,PDUDT_MF,PDVDT_MF,PDSVDT_MF, & - ZEMF_O_RHODREF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP,ZSV_UP,& - PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & - ZFLXZSVMF ) -ELSE - CALL MF_TURB_EXPL(KKA, IKB, IKE, KKU, KKL, OMIXUV, & - PRHODJ, & - ZTHLM,ZTHVM,ZRTM,PUM,PVM, & - PDTHLDT_MF,PDRTDT_MF,PDUDT_MF,PDVDT_MF, & - ZEMF_O_RHODREF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP, & - PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF) -ENDIF - -! security in the case HMF_UPDRAFT = 'DUAL' -! to be modified if 'DUAL' is evolving (momentum mixing for example) -IF( HMF_UPDRAFT == 'DUAL') THEN - ! Now thetav_up from vdfhghtnn is used! - PFLXZTHVMF=0. - ! Yes/No UV mixing! -! PDUDT_MF=0. -! PDVDT_MF=0. -ENDIF -! -IF (LHOOK) CALL DR_HOOK('SHALLOW_MF',1,ZHOOK_HANDLE) -! -CONTAINS -INCLUDE "compute_frac_ice.func.h" -! -END SUBROUTINE SHALLOW_MF diff --git a/src/mesonh/turb/thl_rt_from_th_r_mf.f90 b/src/mesonh/turb/thl_rt_from_th_r_mf.f90 deleted file mode 100644 index 1fb982a1a082c9812051d3242c7c92387cef8354..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/thl_rt_from_th_r_mf.f90 +++ /dev/null @@ -1,146 +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. -! ######spl - MODULE MODI_THL_RT_FROM_TH_R_MF -! ############################### -! -INTERFACE -! ################################################################# - SUBROUTINE THL_RT_FROM_TH_R_MF( KRR,KRRL,KRRI, & - PTH, PR, PEXN, & - PTHL, PRT ) -! ################################################################# -! -! -!* 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) :: PEXN ! exner function - -REAL, DIMENSION(:,:), INTENT(OUT) :: PTHL ! th_l -REAL, DIMENSION(:,:), INTENT(OUT) :: PRT ! total non precip. water -! -END SUBROUTINE THL_RT_FROM_TH_R_MF - -END INTERFACE -! -END MODULE MODI_THL_RT_FROM_TH_R_MF -! ################################################################# - SUBROUTINE THL_RT_FROM_TH_R_MF( KRR,KRRL,KRRI, & - PTH, PR, PEXN, & - PTHL, PRT ) -! ################################################################# -! -!! -!!**** *THL_RT_FROM_TH_R* - computes the conservative variables THL and RT -!! from TH and the non precipitating water species -!! -!! PURPOSE -!! ------- -!! -!!** METHOD -!! ------ -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 20/09/02 -!! Externalisation of computations done in TURB and MF_TURB (Malardel and Pergaud, fev. 2007) -!! V.Masson : Optimization -!! S. Riette 2011 suppression of PLVOCPEXN and PLSOCPEXN -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -! -IMPLICIT NONE -! -! -!* 0.1 declarations 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) :: PEXN ! exner function - -REAL, DIMENSION(:,:), INTENT(OUT) :: PTHL ! th_l -REAL, DIMENSION(:,:), INTENT(OUT) :: PRT ! total non precip. water -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -! - -!---------------------------------------------------------------------------- -REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2)) :: ZCP, ZT -REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2)) :: ZLVOCPEXN, ZLSOCPEXN -INTEGER :: JRR -!---------------------------------------------------------------------------- -! -! -!temperature -ZT(:,:) = PTH(:,:) * PEXN(:,:) - -!Cp -ZCP=XCPD -IF (KRR > 0) ZCP(:,:) = ZCP(:,:) + XCPV * PR(:,:,1) -DO JRR = 2,1+KRRL ! loop on the liquid components - ZCP(:,:) = ZCP(:,:) + XCL * PR(:,:,JRR) -END DO -DO JRR = 2+KRRL,1+KRRL+KRRI ! loop on the solid components - ZCP(:,:) = ZCP(:,:) + XCI * PR(:,:,JRR) -END DO - -IF ( KRRL >= 1 ) THEN - IF ( KRRI >= 1 ) THEN - !ZLVOCPEXN and ZLSOCPEXN - ZLVOCPEXN(:,:)=(XLVTT + (XCPV-XCL) * (ZT(:,:)-XTT) ) / ZCP(:,:) / PEXN(:,:) - ZLSOCPEXN(:,:)=(XLSTT + (XCPV-XCI) * (ZT(:,:)-XTT) ) / ZCP(:,:) / PEXN(:,:) - ! Rnp - PRT(:,:) = PR(:,:,1) + PR(:,:,2) + PR(:,:,4) - ! Theta_l - PTHL(:,:) = PTH(:,:) - ZLVOCPEXN(:,:) * PR(:,:,2) & - - ZLSOCPEXN(:,:) * PR(:,:,4) - ELSE - !ZLVOCPEXN - ZLVOCPEXN(:,:)=(XLVTT + (XCPV-XCL) * (ZT(:,:)-XTT) ) / ZCP(:,:) / PEXN(:,:) - ! Rnp - PRT(:,:) = PR(:,:,1) + PR(:,:,2) - ! Theta_l - PTHL(:,:) = PTH(:,:) - ZLVOCPEXN(:,:) * PR(:,:,2) - END IF -ELSE - ! Rnp = rv - PRT(:,:) = PR(:,:,1) - ! Theta_l = Theta - PTHL(:,:) = PTH(:,:) -END IF -END SUBROUTINE THL_RT_FROM_TH_R_MF diff --git a/src/mesonh/turb/turb_cloud_index.f90 b/src/mesonh/turb/turb_cloud_index.f90 deleted file mode 100644 index c194db61154a5c3fe6fcf2308dae47d01720856c..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/turb_cloud_index.f90 +++ /dev/null @@ -1,344 +0,0 @@ -!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. -!----------------------------------------------------------------- -! ################ - MODULE MODI_TURB_CLOUD_INDEX -! ################ -! -INTERFACE -! - SUBROUTINE TURB_CLOUD_INDEX(PTSTEP,TPFILE, & - OTURB_DIAG,KRRI, & - PRRS,PRM,PRHODJ,PDXX,PDYY,PDZZ,PDZX,PDZY, & - PCEI ) -! -USE MODD_IO, ONLY: TFILEDATA -! -REAL, INTENT(IN) :: PTSTEP ! Double Time step -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some - ! diagnostic fields in the syncronous FM-file -INTEGER, INTENT(IN) :: KRRI ! number of ice water var. -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRRS ! Sources term of RR -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Variable at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Jacobian * dry density of - ! the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients -REAL, DIMENSION(:,:,:), INTENT(OUT):: PCEI ! Cloud Entrainment instability - ! index to emphasize locally - ! turbulent fluxes -! -END SUBROUTINE TURB_CLOUD_INDEX -! -END INTERFACE -! -END MODULE MODI_TURB_CLOUD_INDEX -! -! ####################### - SUBROUTINE TURB_CLOUD_INDEX(PTSTEP,TPFILE, & - OTURB_DIAG,KRRI, & - PRRS,PRM,PRHODJ,PDXX,PDYY,PDZZ,PDZX,PDZY, & - PCEI ) -! ####################### - ! -!! PURPOSE -!! ------- -!! CEI (cloud Entrainment Instability) index calculation -!! It permits to localize cloudy points where a different mixing length -!! from the one in clear sky can be applicated -!! It permits to quantify also, at those cloudy points, an instability -!! that can emphasize sub-grid turbulence. -!! If such an instability exists, mixing length is increased proportionnaly -!! to that CEI criterium -!! -!!** METHOD -!! ------ -!! -!! Criteria: For a cloudy point or a point adjacent to a cloudy point, -!! G = NORM( dVAR/dx_j ) > threshold -!! Q_j = DG_j/Dt of the same sign as G_j -!! where VAR=rv+rc+ri and j=x or y -!! then CEI= NORM(Q) -!! -!! EXTERNAL -!! -------- -!! GX_M_M, GY_M_M : Cartesian gradient operators -!! FMWRIT : FM-routine to write a record -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODI_GRADIENT_M : GX_M_M, GY_M_M -!! -!! AUTHOR -!! ------ -!! M. Tomasini * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/09/94 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! -!------------------------------------------------------------------------------- -! -use modd_field, only: tfielddata, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS, ONLY: JPVEXT -! -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -use mode_tools_ll, only: GET_INDICE_ll -! -USE MODI_GRADIENT_M -! -IMPLICIT NONE -! -!* 0. DECLARATIONS -! ------------ -! -!* 0.1 declarations of arguments -! -REAL, INTENT(IN) :: PTSTEP ! Double Time step -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -LOGICAL, INTENT(IN) :: OTURB_DIAG ! switch to write some - ! diagnostic fields in the syncronous FM-file -INTEGER, INTENT(IN) :: KRRI ! number of ice water var. -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRRS ! Sources term of RR -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Variable at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! Jacobian * dry density of - ! the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY - ! metric coefficients -REAL, DIMENSION(:,:,:), INTENT(OUT):: PCEI ! Cloud Entrainment instability - ! index to emphasize locally - ! turbulent fluxes -! -!* 0.2 declarations of local variables -! -REAL, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3)) :: ZWORK,ZRVCI0 ! Work arrays -REAL, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3)) :: ZCLOUD - ! rc+ri at time after ADVECTION routine - ! for the CEI criterium -REAL, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3)) :: ZRVCI,ZGNORM_RVCI,ZQNORM_RVCI - ! rv+rc+ri at time after ADVECTION routine - ! horizontal norm of the vector PG_RVCI - ! horizontal norm of the vector PQ_RVCI -REAL, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3),2) :: ZG_RVCI,ZQ_RVCI - ! x and y gradient of rv+rc+ri - ! x and y gradient of the advection of rv+rc+ri -! -INTEGER :: JI,JJ,JK ! loop counters -INTEGER :: IIB,IJB,IKB ! Begin of physical dimensions -INTEGER :: IIE,IJE,IKE ! End of physical dimensions -INTEGER, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3)) :: IMASK_CLOUD - ! 0 except cloudy points or adjacent points (1) -TYPE(TFIELDDATA) :: TZFIELD -! -!------------------------------------------------------------------------------- -! -!* 1. INITIALISATION -! -------------- -! -CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -IKB = 1 + JPVEXT -IKE = SIZE(PRM,3) - JPVEXT -! -IMASK_CLOUD(:,:,:) = 0 -PCEI(:,:,:) = 0. -! -!------------------------------------------------------------------------------- -! -!* 2. CALCULATION -! ----------- -!* 2.1 Gradients calculation of the variable : -! VAR at time (t+1)=VAR at time (t-1) + 2*dt*ADV at time t -! VAR is a source term (i.e. x by RHODJ) -! -! To avoid negative mixing ratios at external points -! but also in the physical domain ! -ZRVCI0(:,:,:) = MAX ( PRRS(:,:,:,1) , 0. ) + MAX ( PRRS(:,:,:,2) , 0. ) -IF (KRRI>=1) ZRVCI0(:,:,:) = ZRVCI0(:,:,:) + MAX ( PRRS(:,:,:,4) , 0. ) -! -ZRVCI(:,:,:)= PTSTEP *ZRVCI0(:,:,:) /PRHODJ(:,:,:) -ZG_RVCI(:,:,:,1) = GX_M_M(ZRVCI,PDXX,PDZZ,PDZX) -ZG_RVCI(:,:,:,2) = GY_M_M(ZRVCI,PDYY,PDZZ,PDZY) -! -ZGNORM_RVCI(:,:,:) = SQRT( ZG_RVCI(:,:,:,1)*ZG_RVCI(:,:,:,1) + & - ZG_RVCI(:,:,:,2)*ZG_RVCI(:,:,:,2) ) -! -! -!* 2.2 Frontogenetic terms calculation -! (gradient of the advection) -! Q_j=DG_j/Dt=d(DVAR/Dt)dx_j - d(u_k*dVAR/dx_k)/dx_j -! As DVAR/Dt=0 if the VAR is conserved during the movement, -! Q_j = dADV/dx_j -! VAR=rv+rc+ri -! -ZWORK(:,:,:) = ZRVCI0 / PRHODJ(:,:,:) - & - ( PRM(:,:,:,1)+ PRM(:,:,:,2) ) / PTSTEP -IF (KRRI>=1) ZWORK(:,:,:) = ZWORK(:,:,:) - PRM(:,:,:,4) / PTSTEP -! -ZQ_RVCI(:,:,:,1) = GX_M_M(ZWORK,PDXX,PDZZ,PDZX) -ZQ_RVCI(:,:,:,2) = GY_M_M(ZWORK,PDYY,PDZZ,PDZY) -! -ZQNORM_RVCI(:,:,:) = SQRT( ZQ_RVCI(:,:,:,1)*ZQ_RVCI(:,:,:,1) + & - ZQ_RVCI(:,:,:,2)*ZQ_RVCI(:,:,:,2) ) -! -! -!* 2.3 Cloud mask -! -ZCLOUD(:,:,:)= MAX ( PRRS(:,:,:,2) , 0. ) -IF (KRRI>=1) ZCLOUD(:,:,:) = ZCLOUD(:,:,:) + MAX ( PRRS(:,:,:,4) , 0. ) -ZCLOUD(:,:,:) = PTSTEP * ZCLOUD / PRHODJ(:,:,:) -! -DO JK=IKB,IKE -DO JJ=IJB,IJE -DO JI=IIB,IIE - ! rc+ri threshold to avoid white noise and calculations - IF ( ZCLOUD(JI,JJ,JK) > 1.E-6 ) THEN - IMASK_CLOUD(JI-1,JJ ,JK ) = 1 - IMASK_CLOUD(JI ,JJ ,JK ) = 1 - IMASK_CLOUD(JI+1,JJ ,JK ) = 1 - IMASK_CLOUD(JI ,JJ-1,JK ) = 1 - IMASK_CLOUD(JI ,JJ+1,JK ) = 1 - IMASK_CLOUD(JI ,JJ ,JK-1) = 1 - IMASK_CLOUD(JI ,JJ ,JK+1) = 1 - ! The cloudy points where the criteria will not be satisfied - ! will have the cloudy mixing length not amplified - ! We put in the CEI index a negative number to mark those points - ! in turb.f90 - PCEI(JI,JJ,JK) = -1. - ENDIF -ENDDO -ENDDO -ENDDO -! -!* 2.4 Cloud Entrainment Instability index -! -! CEI(:,:,:)=NORM_Q -! -! if the considered point is cloudy or surrounded by at least one cloudy point -! -! and if the characteristic time >0 in at least one direction that is to say -! |grad(rv+rc+ri)| increasing with time that is to say -! grad(rv+rc+ri) has the same sign as Q_RVCI -! -! and if NORM_G_RVCI >= 0.1 g/kg/km -! -DO JK=IKB,IKE -DO JJ=IJB,IJE -DO JI=IIB,IIE - IF ( IMASK_CLOUD(JI,JJ,JK) == 1 ) THEN - IF ( ZGNORM_RVCI(JI,JJ,JK) >= 1.E-07 ) THEN - IF ( SIGN(1.0,ZG_RVCI(JI,JJ,JK,1))==SIGN(1.0,ZQ_RVCI(JI,JJ,JK,1)) .OR. & - SIGN(1.0,ZG_RVCI(JI,JJ,JK,2))==SIGN(1.0,ZQ_RVCI(JI,JJ,JK,2)) ) THEN - PCEI(JI,JJ,JK) = ZQNORM_RVCI(JI,JJ,JK) - ENDIF - ENDIF - ENDIF -ENDDO -ENDDO -ENDDO -! -!* 2.5 Writing -! -IF ( OTURB_DIAG .AND. tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'RVCI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RVCI' - TZFIELD%CUNITS = 'kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RVCI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZRVCI) - ! - TZFIELD%CMNHNAME = 'GX_RVCI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'GX_RVCI' - TZFIELD%CUNITS = 'kg kg-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_GX_RVCI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZG_RVCI(:,:,:,1)) - ! - TZFIELD%CMNHNAME = 'GY_RVCI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'GY_RVCI' - TZFIELD%CUNITS = 'kg kg-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_GY_RVCI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZG_RVCI(:,:,:,2)) - ! - TZFIELD%CMNHNAME = 'GNORM_RVCI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'GNORM_RVCI' - TZFIELD%CUNITS = 'kg kg-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_NORM G' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZGNORM_RVCI) - ! - TZFIELD%CMNHNAME = 'QX_RVCI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'QX_RVCI' - TZFIELD%CUNITS = 'kg kg-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_QX_RVCI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZQ_RVCI(:,:,:,1)) - ! - TZFIELD%CMNHNAME = 'QY_RVCI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'QY_RVCI' - TZFIELD%CUNITS = 'kg kg-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_QY_RVCI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZQ_RVCI(:,:,:,2)) - ! - TZFIELD%CMNHNAME = 'QNORM_RVCI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'QNORM_RVCI' - TZFIELD%CUNITS = 'kg kg-1 m-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_QNORM_RVCI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZQNORM_RVCI) - ! - TZFIELD%CMNHNAME = 'CEI' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'CEI' - TZFIELD%CUNITS = 'kg kg-1 m-1 s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_CEI' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,PCEI) -END IF -! -END SUBROUTINE TURB_CLOUD_INDEX diff --git a/src/mesonh/turb/turb_ver.f90 b/src/mesonh/turb/turb_ver.f90 deleted file mode 100644 index 4117d8191eb9def704b654e606eba90307fe65ec..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/turb_ver.f90 +++ /dev/null @@ -1,746 +0,0 @@ -!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. -!----------------------------------------------------------------- -! #################### - MODULE MODI_TURB_VER -! #################### -! -INTERFACE -! - SUBROUTINE TURB_VER(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OTURB_FLX, & - HTURBDIM,HTOM,PIMPL,PEXPL, & - PTSTEP, TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & - PCOSSLOPE,PSINSLOPE, & - PRHODJ,PTHVREF, & - PSFTHM,PSFRM,PSFSVM,PSFTHP,PSFRP,PSFSVP, & - PCDUEFF,PTAU11M,PTAU12M,PTAU33M, & - PUM,PVM,PWM,PUSLOPEM,PVSLOPEM,PTHLM,PRM,PSVM, & - PTKEM,PLM,PLEPS, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & - PFWTH,PFWR,PFTH2,PFR2,PFTHR,PBL_DEPTH, & - PSBL_DEPTH,PLMO, & - PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS, & - PDP,PTP,PSIGS,PWTH,PWRC,PWSV ) - -! -USE MODD_IO, ONLY: TFILEDATA -! -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. -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -REAL, INTENT(IN) :: PTSTEP ! timestep -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitudes at flux points -REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle - ! between i and the slope vector -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual - ! Potential Temperature -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! t - deltat -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVP ! t + deltat -! -REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked - ! to the maximum slope direction and the surface normal and the binormal - ! at time t - dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM - ! Wind and potential temperature at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios - ! at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t -REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the - ! maximum slope direction -REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the - ! direction normal to the maximum slope one -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized - ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz -REAL, DIMENSION(:,:), INTENT(INOUT):: PBL_DEPTH ! BL depth -REAL, DIMENSION(:,:), INTENT(INOUT):: PSBL_DEPTH ! SBL depth -REAL, DIMENSION(:,:), INTENT(IN) :: PLMO ! Monin-Obukhov length -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS, PRTHLS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS,PRRS - ! cumulated sources for the prognostic variables -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP,PTP ! Dynamic and thermal - ! TKE production terms -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at t -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux -REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux - -! -! -END SUBROUTINE TURB_VER -! -END INTERFACE -! -END MODULE MODI_TURB_VER -! -! -! ############################################################### - SUBROUTINE TURB_VER(KKA,KKU,KKL,KRR, KRRL, KRRI, & - OTURB_FLX, & - HTURBDIM,HTOM,PIMPL,PEXPL, & - PTSTEP, TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & - PCOSSLOPE,PSINSLOPE, & - PRHODJ,PTHVREF, & - PSFTHM,PSFRM,PSFSVM,PSFTHP,PSFRP,PSFSVP, & - PCDUEFF,PTAU11M,PTAU12M,PTAU33M, & - PUM,PVM,PWM,PUSLOPEM,PVSLOPEM,PTHLM,PRM,PSVM, & - PTKEM,PLM,PLEPS, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & - PFWTH,PFWR,PFTH2,PFR2,PFTHR,PBL_DEPTH, & - PSBL_DEPTH,PLMO, & - PRUS,PRVS,PRWS,PRTHLS,PRRS,PRSVS, & - PDP,PTP,PSIGS,PWTH,PWRC,PWSV ) -! ############################################################### -! -! -!!**** *TURB_VER* -compute the source terms due to the vertical turbulent -!! fluxes. -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute the vertical turbulent -! fluxes of the evolutive variables and give back the source -! terms to the main program. In the case of large horizontal meshes, -! the divergence of these vertical turbulent fluxes represent the whole -! effect of the turbulence but when the three-dimensionnal version of -! the turbulence scheme is activated (CTURBDIM="3DIM"), these divergences -! are completed in the next routine TURB_HOR. -! An arbitrary degree of implicitness has been implemented for the -! temporal treatment of these diffusion terms. -! The vertical boundary conditions are as follows: -! * at the bottom, the surface fluxes are prescribed at the same -! as the other turbulent fluxes -! * at the top, the turbulent fluxes are set to 0. -! It should be noted that the condensation has been implicitely included -! in this turbulence scheme by using conservative variables and computing -! the subgrid variance of a statistical variable s indicating the presence -! or not of condensation in a given mesh. -! -!!** METHOD -!! ------ -!! 1D type calculations are made; -!! The vertical turbulent fluxes are computed in an off-centered -!! implicit scheme (a Crank-Nicholson type with coefficients different -!! than 0.5), which allows to vary the degree of implicitness of the -!! formulation. -!! The different prognostic variables are treated one by one. -!! The contributions of each turbulent fluxes are cumulated into the -!! tendency PRvarS, and into the dynamic and thermal production of -!! TKE if necessary. -!! -!! In section 2 and 3, the thermodynamical fields are considered. -!! Only the turbulent fluxes of the conservative variables -!! (Thetal and Rnp stored in PRx(:,:,:,1)) are computed. -!! Note that the turbulent fluxes at the vertical -!! boundaries are given either by the soil scheme for the surface one -!! ( at the same instant as the others fluxes) and equal to 0 at the -!! top of the model. The thermal production is computed by vertically -!! averaging the turbulent flux and multiply this flux at the mass point by -!! a function ETHETA or EMOIST, which preform the transformation from the -!! conservative variables to the virtual potential temperature. -!! -!! In section 4, the variance of the statistical variable -!! s indicating presence or not of condensation, is determined in function -!! of the turbulent moments of the conservative variables and its -!! squarred root is stored in PSIGS. This information will be completed in -!! the horizontal turbulence if the turbulence dimensionality is not -!! equal to "1DIM". -!! -!! In section 5, the x component of the stress tensor is computed. -!! The surface flux <u'w'> is computed from the value of the surface -!! fluxes computed in axes linked to the orography ( i", j" , k"): -!! i" is parallel to the surface and in the direction of the maximum -!! slope -!! j" is also parallel to the surface and in the normal direction of -!! the maximum slope -!! k" is the normal to the surface -!! In order to prevent numerical instability, the implicit scheme has -!! been extended to the surface flux regarding to its dependence in -!! function of U. The dependence in function of the other components -!! introduced by the different rotations is only explicit. -!! The turbulent fluxes are used to compute the dynamic production of -!! TKE. For the last TKE level ( located at PDZZ(:,:,IKB)/2 from the -!! ground), an harmonic extrapolation from the dynamic production at -!! PDZZ(:,:,IKB) is used to avoid an evaluation of the gradient of U -!! in the surface layer. -!! -!! In section 6, the same steps are repeated but for the y direction -!! and in section 7, a diagnostic computation of the W variance is -!! performed. -!! -!! In section 8, the turbulent fluxes for the scalar variables are -!! computed by the same way as the conservative thermodynamical variables -!! -!! -!! EXTERNAL -!! -------- -!! GX_U_M, GY_V_M, GZ_W_M : cartesian gradient operators -!! GX_U_UW,GY_V_VW (X,Y,Z) represent the direction of the gradient -!! _(M,U,...)_ represent the localization of the -!! field to be derivated -!! _(M,UW,...) represent the localization of the -!! field derivated -!! -!! SUBROUTINE TRIDIAG : to compute the split implicit evolution -!! of a variable located at a mass point -!! -!! SUBROUTINE TRIDIAG_WIND: to compute the split implicit evolution -!! of a variable located at a wind point -!! -!! FUNCTIONs ETHETA and EMOIST : -!! allows to compute: -!! - the coefficients for the turbulent correlation between -!! any variable and the virtual potential temperature, of its -!! correlations with the conservative potential temperature and -!! the humidity conservative variable: -!! ------- ------- ------- -!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : contains physical constants -!! -!! XG : gravity constant -!! -!! Module MODD_CTURB: contains the set of constants for -!! the turbulence scheme -!! -!! XCMFS,XCMFB : cts for the momentum flux -!! XCSHF : ct for the sensible heat flux -!! XCHF : ct for the moisture flux -!! XCTV,XCHV : cts for the T and moisture variances -!! -!! Module MODD_PARAMETERS -!! -!! JPVEXT_TURB : number of vertical external points -!! JPHEXT : number of horizontal external points -!! -!! -!! REFERENCE -!! --------- -!! Book 1 of documentation (Chapter: Turbulence) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart * INM and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original August 19, 1994 -!! Modifications: February 14, 1995 (J.Cuxart and J.Stein) -!! Doctorization and Optimization -!! Modifications: March 21, 1995 (J.M. Carriere) -!! Introduction of cloud water -!! Modifications: June 14, 1995 (J.Cuxart and J. Stein) -!! Phi3 and Psi3 at w-point + bug in the all -!! or nothing condens. -!! Modifications: Sept 15, 1995 (J.Cuxart and J. Stein) -!! Change the DP computation at the ground -!! Modifications: October 10, 1995 (J.Cuxart and J. Stein) -!! Psi for scal var and LES tools -!! Modifications: November 10, 1995 (J. Stein) -!! change the surface relations -!! Modifications: February 20, 1995 (J. Stein) optimization -!! Modifications: May 21, 1996 (J. Stein) -!! bug in the vertical flux of the V wind -!! component for explicit computation -!! Modifications: May 21, 1996 (N. wood) -!! modify the computation of the vertical -!! part or the surface tangential flux -!! Modifications: May 21, 1996 (P. Jabouille) -!! same modification in the Y direction -!! -!! Modifications: Sept 17, 1996 (J. Stein) change the moist case by using -!! Pi instead of Piref + use Atheta and Amoist -!! -!! Modifications: Nov 24, 1997 (V. Masson) removes the DO loops -!! Modifications: Mar 31, 1998 (V. Masson) splits the routine TURB_VER -!! Nov 06, 2002 (V. Masson) LES budgets -!! Feb 20, 2003 (JP Pinty) Add PFRAC_ICE -!! July 2005 (S. Tomas, V. Masson) -!! Add 3rd order moments and -!! implicitation of PHI3, PSI3 -!! Oct.2009 (C.Lac) Introduction of different PTSTEP according to the -!! advection schemes -!! Feb. 2012 (Y. Seity) add possibility to run with -!! reversed vertical levels -!! 10/2012 (J.Escobar) Bypass PGI bug , redefine some allocatable array inplace of automatic -!! 08/2014 (J.Escobar) Bypass PGI memory leak bug , replace IF statement with IF THEN ENDIF -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! JL Redelsperger 03/2021 : add Ocean LES case -!!-------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_CTURB -USE MODD_DYN_n, ONLY: LOCEAN -use modd_field, only: tfielddata, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS -USE MODD_LES -USE MODD_NSV, ONLY: NSV -! -USE MODI_PRANDTL -USE MODI_EMOIST -USE MODI_ETHETA -USE MODI_GRADIENT_M -USE MODI_GRADIENT_W -USE MODI_TURB -USE MODI_TURB_VER_THERMO_FLUX -USE MODI_TURB_VER_THERMO_CORR -USE MODI_TURB_VER_DYN_FLUX -USE MODI_TURB_VER_SV_FLUX -USE MODI_TURB_VER_SV_CORR -USE MODI_LES_MEAN_SUBGRID -USE MODI_SBL_DEPTH -! -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -USE MODE_PRANDTL -! -USE MODI_SECOND_MNH -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -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. -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -REAL, INTENT(IN) :: PTSTEP ! timestep -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! altitudes at flux points -REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle - ! between i and the slope vector -REAL, DIMENSION(:,:), INTENT(IN) :: PSINSLOPE ! sinus of the angle - ! between i and the slope vector -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual - ! Potential Temperature -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! t - deltat -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVP ! t + deltat -! -REAL, DIMENSION(:,:), INTENT(IN) :: PCDUEFF ! Cd * || u || at time t -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU11M ! <uu> in the axes linked - ! to the maximum slope direction and the surface normal and the binormal - ! at time t - dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU12M ! <uv> in the same axes -REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM - ! Wind and potential temperature at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios - ! at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t -REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the - ! maximum slope direction -REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the - ! direction normal to the maximum slope one -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized - ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFRAC_ICE ! ri fraction of rc+ri -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz -REAL, DIMENSION(:,:), INTENT(INOUT):: PBL_DEPTH ! BL depth -REAL, DIMENSION(:,:), INTENT(INOUT):: PSBL_DEPTH ! SBL depth -REAL, DIMENSION(:,:), INTENT(IN) :: PLMO ! Monin-Obukhov length -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS, PRTHLS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS,PRRS - ! cumulated sources for the prognostic variables -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP,PTP ! Dynamic and thermal - ! TKE production terms -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at t -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWTH ! heat flux -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux -REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux - -! -! -! -! -!* 0.2 declaration of local variables -! -!JUAN BUG PGI -!!$REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & -REAL, ALLOCATABLE, DIMENSION(:,:,:) :: & - ZBETA, & ! buoyancy coefficient - ZSQRT_TKE,& ! sqrt(e) - ZDTH_DZ, & ! d(th)/dz - ZDR_DZ, & ! d(rt)/dz - ZRED2TH3, & ! 3D Redeslperger number R*2_th - ZRED2R3, & ! 3D Redeslperger number R*2_r - ZRED2THR3,& ! 3D Redeslperger number R*2_thr - ZBLL_O_E, & ! beta * Lk * Leps / tke - ZETHETA, & ! Coefficient for theta in theta_v computation - ZEMOIST, & ! Coefficient for r in theta_v computation - ZREDTH1, & ! 1D Redelsperger number for Th - ZREDR1, & ! 1D Redelsperger number for r - ZPHI3, & ! phi3 Prandtl number - ZPSI3, & ! psi3 Prandtl number for vapor - ZD, & ! denominator in phi3 terms - ZWTHV, & ! buoyancy flux - ZWU, & ! (u'w') - ZWV, & ! (v'w') - ZTHLP, & ! guess of potential temperature due to vert. turbulent flux - ZRP ! guess of total water due to vert. turbulent flux - -!!$REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV) :: & -REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: & - ZPSI_SV, & ! Prandtl number for scalars - ZREDS1, & ! 1D Redelsperger number R_sv - ZRED2THS, & ! 3D Redelsperger number R*2_thsv - ZRED2RS ! 3D Redelsperger number R*2_rsv -! -LOGICAL :: GUSERV ! flag to use water vapor -INTEGER :: IKB,IKE ! index value for the Beginning - ! and the End of the physical domain for the mass points -INTEGER :: JSV ! loop counter on scalar variables -REAL :: ZTIME1 -REAL :: ZTIME2 -TYPE(TFIELDDATA) :: TZFIELD -!---------------------------------------------------------------------------- -ALLOCATE ( ZBETA(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZSQRT_TKE(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)),& - ZDTH_DZ(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZDR_DZ(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZRED2TH3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZRED2R3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZRED2THR3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)),& - ZBLL_O_E(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZETHETA(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZEMOIST(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZREDTH1(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZREDR1(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZPHI3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZPSI3(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZD(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZWTHV(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZWU(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZWV(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZTHLP(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ,& - ZRP(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) ) - -ALLOCATE ( & - ZPSI_SV(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV), & - ZREDS1(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV), & - ZRED2THS(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV), & - ZRED2RS(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV) ) - -!---------------------------------------------------------------------------- -! -!* 1. PRELIMINARIES -! ------------- -! -IKB=KKA+JPVEXT_TURB*KKL -IKE=KKU-JPVEXT_TURB*KKL -! -! -! 3D Redelsperger numbers -! -! -CALL PRANDTL(KKA,KKU,KKL,KRR,KRRI,OTURB_FLX, & - HTURBDIM, & - TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY, & - PTHVREF,PLOCPEXNM,PATHETA,PAMOIST, & - PLM,PLEPS,PTKEM,PTHLM,PRM,PSVM,PSRCM, & - ZREDTH1, ZREDR1, & - ZRED2TH3, ZRED2R3, ZRED2THR3, & - ZREDS1,ZRED2THS, ZRED2RS, & - ZBLL_O_E, & - ZETHETA, ZEMOIST ) -! -! Buoyancy coefficient -! -IF (LOCEAN) THEN - ZBETA = XG*XALPHAOC -ELSE - ZBETA = XG/PTHVREF -END IF -! -! Square root of Tke -! -ZSQRT_TKE = SQRT(PTKEM) -! -! gradients of mean quantities at previous time-step -! -ZDTH_DZ = GZ_M_W(KKA,KKU,KKL,PTHLM(:,:,:),PDZZ) -ZDR_DZ = 0. -IF (KRR>0) THEN -ZDR_DZ = GZ_M_W(KKA,KKU,KKL,PRM(:,:,:,1),PDZZ) -ENDIF -! -! -! Denominator factor in 3rd order terms -! -ZD(:,:,:) = (1.+ZREDTH1+ZREDR1) * (1.+0.5*(ZREDTH1+ZREDR1)) -! -! Phi3 and Psi3 Prandtl numbers -! -GUSERV = KRR/=0 -! -ZPHI3 = PHI3(ZREDTH1,ZREDR1,ZRED2TH3,ZRED2R3,ZRED2THR3,HTURBDIM,GUSERV) -IF(KRR/=0) THEN -ZPSI3 = PSI3(ZREDR1,ZREDTH1,ZRED2R3,ZRED2TH3,ZRED2THR3,HTURBDIM,GUSERV) -ENDIF -! -! Prandtl numbers for scalars -! -ZPSI_SV = PSI_SV(ZREDTH1,ZREDR1,ZREDS1,ZRED2THS,ZRED2RS,ZPHI3,ZPSI3) -! -! LES diagnostics -! -IF (LLES_CALL) THEN - CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID(ZPHI3,X_LES_SUBGRID_PHI3) - IF(KRR/=0) THEN - CALL LES_MEAN_SUBGRID(ZPSI3,X_LES_SUBGRID_PSI3) - END IF - CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 -END IF -!---------------------------------------------------------------------------- -! -! -!* 2. SOURCES OF CONSERVATIVE POTENTIAL TEMPERATURE AND -! PARTIAL THERMAL PRODUCTION -! --------------------------------------------------------------- -! -!* 3. SOURCES OF CONSERVATIVE AND CLOUD MIXING RATIO AND -! COMPLETE THERMAL PRODUCTION -! ------------------------------------------------------ -! -!* 4. TURBULENT CORRELATIONS : <w Rc>, <THl THl>, <THl Rnp>, <Rnp Rnp> -! ---------------------------------------------------------------- -! -! - CALL TURB_VER_THERMO_FLUX(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OTURB_FLX,HTURBDIM,HTOM, & - PIMPL,PEXPL,PTSTEP, & - TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & - PRHODJ,PTHVREF, & - PSFTHM,PSFRM,PSFTHP,PSFRP, & - PWM,PTHLM,PRM,PSVM, & - PTKEM,PLM,PLEPS, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PFRAC_ICE, & - ZBETA, ZSQRT_TKE, ZDTH_DZ, ZDR_DZ, ZRED2TH3, & - ZRED2R3, ZRED2THR3, ZBLL_O_E, ZETHETA, & - ZEMOIST, ZREDTH1, ZREDR1, ZPHI3, ZPSI3, ZD, & - PFWTH,PFWR,PFTH2,PFR2,PFTHR,PBL_DEPTH,ZWTHV, & - PRTHLS,PRRS,ZTHLP,ZRP,PTP,PWTH,PWRC ) -! - CALL TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OTURB_FLX,HTURBDIM,HTOM, & - PIMPL,PEXPL, & - TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW, & - PRHODJ,PTHVREF, & - PSFTHM,PSFRM,PSFTHP,PSFRP, & - PWM,PTHLM,PRM,PSVM, & - PTKEM,PLM,PLEPS, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & - ZBETA, ZSQRT_TKE, ZDTH_DZ, ZDR_DZ, ZRED2TH3, & - ZRED2R3, ZRED2THR3, ZBLL_O_E, ZETHETA, & - ZEMOIST, ZREDTH1, ZREDR1, ZPHI3, ZPSI3, ZD, & - PFWTH,PFWR,PFTH2,PFR2,PFTHR, & - ZTHLP,ZRP,PSIGS ) -! -!---------------------------------------------------------------------------- -! -! -! -!* 5. SOURCES OF U,W WIND COMPONENTS AND PARTIAL DYNAMIC PRODUCTION -! ------------------------------------------------------------- -! -!* 6. SOURCES OF V,W WIND COMPONENTS AND COMPLETE 1D DYNAMIC PRODUCTION -! ----------------------------------------------------------------- -! -!* 7. DIAGNOSTIC COMPUTATION OF THE 1D <W W> VARIANCE -! ----------------------------------------------- -! -CALL TURB_VER_DYN_FLUX(KKA,KKU,KKL, & - OTURB_FLX,KRR, & - HTURBDIM,PIMPL,PEXPL,PTSTEP, & - TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & - PCOSSLOPE,PSINSLOPE, & - PRHODJ, & - PCDUEFF,PTAU11M,PTAU12M,PTAU33M, & - PTHLM,PRM,PSVM,PUM,PVM,PWM,PUSLOPEM,PVSLOPEM, & - PTKEM,PLM,ZWU,ZWV, & - PRUS,PRVS,PRWS, & - PDP,PTP ) -! -!---------------------------------------------------------------------------- -! -! -!* 8. SOURCES OF PASSIVE SCALAR VARIABLES -! ----------------------------------- -! -IF (SIZE(PSVM,4)>0) & -CALL TURB_VER_SV_FLUX(KKA,KKU,KKL, & - OTURB_FLX,HTURBDIM, & - PIMPL,PEXPL,PTSTEP, & - TPFILE, & - PDZZ,PDIRCOSZW, & - PRHODJ,PWM, & - PSFSVM,PSFSVP, & - PSVM, & - PTKEM,PLM,ZPSI_SV, & - PRSVS,PWSV ) -! -! -IF (SIZE(PSVM,4)>0 .AND. LLES_CALL) & -CALL TURB_VER_SV_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & - PDZZ, & - PTHLM,PRM,PTHVREF, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM,ZPHI3,ZPSI3, & - PWM,PSVM, & - PTKEM,PLM,PLEPS,ZPSI_SV ) -! -! -!---------------------------------------------------------------------------- -! -!* 9. DIAGNOSTIC OF Surface Boundary Layer Depth -! ------------------------------------------ -! -IF (SIZE(PSBL_DEPTH)>0) CALL SBL_DEPTH(IKB,IKE,PZZ,ZWU,ZWV,ZWTHV,PLMO,PSBL_DEPTH) -! -!---------------------------------------------------------------------------- -! -! -!* 10. PRINTS -! ------ -! -! -IF ( OTURB_FLX .AND. tpfile%lopened ) THEN -! -! stores the Turbulent Prandtl number -! - TZFIELD%CMNHNAME = 'PHI3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PHI3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Turbulent Prandtl number' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZPHI3) -! -! stores the Turbulent Schmidt number -! - TZFIELD%CMNHNAME = 'PSI3' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'PSI3' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'Turbulent Schmidt number' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZPSI3) -! -! -! stores the Turbulent Schmidt number for the scalar variables -! - TZFIELD%CSTDNAME = '' - TZFIELD%CUNITS = '1' - TZFIELD%CDIR = 'XY' - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - DO JSV=1,NSV - WRITE(TZFIELD%CMNHNAME, '("PSI_SV_",I3.3)') JSV - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - CALL IO_Field_write(TPFILE,TZFIELD,ZPSI_SV(:,:,:,JSV)) - END DO -! -END IF -! -! -!---------------------------------------------------------------------------- -END SUBROUTINE TURB_VER diff --git a/src/mesonh/turb/turb_ver_sv_corr.f90 b/src/mesonh/turb/turb_ver_sv_corr.f90 deleted file mode 100644 index b62268e7e82a28d876844fb7abbbcaa02f3e87d0..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/turb_ver_sv_corr.f90 +++ /dev/null @@ -1,223 +0,0 @@ -!MNH_LIC Copyright 2002-2020 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 MODI_TURB_VER_SV_CORR -! #################### -! -INTERFACE -! - SUBROUTINE TURB_VER_SV_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & - PDZZ, & - PTHLM,PRM,PTHVREF, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PPHI3,PPSI3, & - PWM,PSVM, & - PTKEM,PLM,PLEPS,PPSI_SV ) -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRL ! number of liquid var. -INTEGER, INTENT(IN) :: KRRI ! number of ice var. -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ - ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! potential temperature at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-Delta t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! reference Thv -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized - ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Inv.Turb.Sch.for temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Inv.Turb.Sch.for humidity -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! w at time t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PPSI_SV ! Inv.Turb.Sch.for scalars - ! cumulated sources for the prognostic variables -! -! -END SUBROUTINE TURB_VER_SV_CORR -! -END INTERFACE -! -END MODULE MODI_TURB_VER_SV_CORR -! -! -! ############################################################### - SUBROUTINE TURB_VER_SV_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & - PDZZ, & - PTHLM,PRM,PTHVREF, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM,PPHI3,PPSI3, & - PWM,PSVM, & - PTKEM,PLM,PLEPS,PPSI_SV ) -! ############################################################### -! -! -!!**** *TURB_VER_SV_CORR* -compute the subgrid Sv2 and SvThv terms -!! -!! PURPOSE -!! ------- -!! -!! -!! EXTERNAL -!! -------- -!! -!! FUNCTIONs ETHETA and EMOIST : -!! allows to compute: -!! - the coefficients for the turbulent correlation between -!! any variable and the virtual potential temperature, of its -!! correlations with the conservative potential temperature and -!! the humidity conservative variable: -!! ------- ------- ------- -!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! V. Masson * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original October 29, 2002 -!! JP Pinty Feb 20, 2003 Add PFRAC_ICE -!!-------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_CTURB -USE MODD_PARAMETERS -USE MODD_LES -USE MODD_CONF -USE MODD_NSV, ONLY : NSV,NSV_LGBEG,NSV_LGEND -USE MODD_BLOWSNOW -! -! -USE MODI_GRADIENT_U -USE MODI_GRADIENT_V -USE MODI_GRADIENT_W -USE MODI_GRADIENT_M -USE MODI_SHUMAN -USE MODI_EMOIST -USE MODI_ETHETA -USE MODI_LES_MEAN_SUBGRID -! -USE MODI_SECOND_MNH -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -! -INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRL ! number of liquid var. -INTEGER, INTENT(IN) :: KRRI ! number of ice var. -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ - ! Metric coefficients -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! potential temperature at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios at t-Delta t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! reference Thv -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized - ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Inv.Turb.Sch.for temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Inv.Turb.Sch.for humidity -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! w at time t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PPSI_SV ! Inv.Turb.Sch.for scalars - ! cumulated sources for the prognostic variables -! -! -! -! -!* 0.2 declaration of local variables -! -! -REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: & - ZA, ZFLXZ -! -REAL :: ZCSV !constant for the scalar flux -! -INTEGER :: JSV ! loop counters -! -REAL :: ZTIME1, ZTIME2 -! -REAL :: ZCSVD = 1.2 ! constant for scalar variance dissipation -REAL :: ZCTSVD = 2.4 ! constant for temperature - scalar covariance dissipation -REAL :: ZCQSVD = 2.4 ! constant for humidity - scalar covariance dissipation -!---------------------------------------------------------------------------- -! -CALL SECOND_MNH(ZTIME1) -! -IF(LBLOWSNOW) THEN -! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables - ZCSV= XCHF/XRSNOW -ELSE - ZCSV= XCHF -ENDIF -! -DO JSV=1,NSV - ! - IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE - ! - ! variance Sv2 - ! - IF (LLES_CALL) THEN - ! approximation: diagnosed explicitely (without implicit term) - ZFLXZ(:,:,:) = PPSI_SV(:,:,:,JSV)*GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ)**2 - ZFLXZ(:,:,:) = ZCSV / ZCSVD * PLM * PLEPS * MZF(ZFLXZ(:,:,:) ) - CALL LES_MEAN_SUBGRID( -2.*ZCSVD*SQRT(PTKEM)*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Sv2(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLXZ, X_LES_RES_W_SBG_Sv2(:,:,:,JSV) ) - END IF - ! - ! covariance ThvSv - ! - IF (LLES_CALL) THEN - ! approximation: diagnosed explicitely (without implicit term) - ZA(:,:,:) = ETHETA(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PATHETA,PSRCM) - ZFLXZ(:,:,:)= ( XCSHF * PPHI3 + ZCSV * PPSI_SV(:,:,:,JSV) ) & - * GZ_M_W(KKA,KKU,KKL,PTHLM,PDZZ) & - * GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ) - ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCTSVD) * MZF(ZFLXZ) - CALL LES_MEAN_SUBGRID( ZA*ZFLXZ, X_LES_SUBGRID_SvThv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) - ! - IF (KRR>=1) THEN - ZA(:,:,:) = EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) - ZFLXZ(:,:,:)= ( XCHF * PPSI3 + ZCSV * PPSI_SV(:,:,:,JSV) ) & - * GZ_M_W(KKA,KKU,KKL,PRM(:,:,:,1),PDZZ) & - * GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ) - ZFLXZ(:,:,:)= PLM * PLEPS / (2.*ZCQSVD) * MZF(ZFLXZ) - CALL LES_MEAN_SUBGRID( ZA*ZFLXZ, X_LES_SUBGRID_SvThv(:,:,:,JSV) , .TRUE.) - CALL LES_MEAN_SUBGRID( -XG/PTHVREF/3.*ZA*ZFLXZ, X_LES_SUBGRID_SvPz(:,:,:,JSV), .TRUE.) - END IF - END IF - ! -END DO ! end of scalar loop -! -CALL SECOND_MNH(ZTIME2) -XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 -!---------------------------------------------------------------------------- -! -END SUBROUTINE TURB_VER_SV_CORR diff --git a/src/mesonh/turb/turb_ver_sv_flux.f90 b/src/mesonh/turb/turb_ver_sv_flux.f90 deleted file mode 100644 index 23d8bee0342d4fc3a6f28f73733d8f35c27308bc..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/turb_ver_sv_flux.f90 +++ /dev/null @@ -1,490 +0,0 @@ -!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. -!----------------------------------------------------------------- -! #################### - MODULE MODI_TURB_VER_SV_FLUX -! #################### -! -INTERFACE -! - SUBROUTINE TURB_VER_SV_FLUX(KKA,KKU,KKL, & - OTURB_FLX,HTURBDIM, & - PIMPL,PEXPL, & - PTSTEP, & - TPFILE, & - PDZZ,PDIRCOSZW, & - PRHODJ,PWM, & - PSFSVM,PSFSVP, & - PSVM, & - PTKEM,PLM,PPSI_SV, & - PRSVS,PWSV ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -REAL, INTENT(IN) :: PTSTEP ! Double Time Step -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! t - deltat -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVP ! t + deltat -! -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! vertical wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PPSI_SV ! Inv.Turb.Sch.for scalars -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS - ! cumulated sources for the prognostic variables -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PWSV ! scalar flux - -! -! -END SUBROUTINE TURB_VER_SV_FLUX -! -END INTERFACE -! -END MODULE MODI_TURB_VER_SV_FLUX -! -! -! ############################################################### - SUBROUTINE TURB_VER_SV_FLUX(KKA,KKU,KKL, & - OTURB_FLX,HTURBDIM, & - PIMPL,PEXPL, & - PTSTEP, & - TPFILE, & - PDZZ,PDIRCOSZW, & - PRHODJ,PWM, & - PSFSVM,PSFSVP, & - PSVM, & - PTKEM,PLM,PPSI_SV, & - PRSVS,PWSV ) -! - -! -! -!!**** *TURB_VER_SV_FLUX* -compute the source terms due to the vertical turbulent -!! fluxes. -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute the vertical turbulent -! fluxes of the evolutive variables and give back the source -! terms to the main program. In the case of large horizontal meshes, -! the divergence of these vertical turbulent fluxes represent the whole -! effect of the turbulence but when the three-dimensionnal version of -! the turbulence scheme is activated (CTURBDIM="3DIM"), these divergences -! are completed in the next routine TURB_HOR. -! An arbitrary degree of implicitness has been implemented for the -! temporal treatment of these diffusion terms. -! The vertical boundary conditions are as follows: -! * at the bottom, the surface fluxes are prescribed at the same -! as the other turbulent fluxes -! * at the top, the turbulent fluxes are set to 0. -! It should be noted that the condensation has been implicitely included -! in this turbulence scheme by using conservative variables and computing -! the subgrid variance of a statistical variable s indicating the presence -! or not of condensation in a given mesh. -! -!!** METHOD -!! ------ -!! 1D type calculations are made; -!! The vertical turbulent fluxes are computed in an off-centered -!! implicit scheme (a Crank-Nicholson type with coefficients different -!! than 0.5), which allows to vary the degree of implicitness of the -!! formulation. -!! The different prognostic variables are treated one by one. -!! The contributions of each turbulent fluxes are cumulated into the -!! tendency PRvarS, and into the dynamic and thermal production of -!! TKE if necessary. -!! -!! In section 2 and 3, the thermodynamical fields are considered. -!! Only the turbulent fluxes of the conservative variables -!! (Thetal and Rnp stored in PRx(:,:,:,1)) are computed. -!! Note that the turbulent fluxes at the vertical -!! boundaries are given either by the soil scheme for the surface one -!! ( at the same instant as the others fluxes) and equal to 0 at the -!! top of the model. The thermal production is computed by vertically -!! averaging the turbulent flux and multiply this flux at the mass point by -!! a function ETHETA or EMOIST, which preform the transformation from the -!! conservative variables to the virtual potential temperature. -!! -!! In section 4, the variance of the statistical variable -!! s indicating presence or not of condensation, is determined in function -!! of the turbulent moments of the conservative variables and its -!! squarred root is stored in PSIGS. This information will be completed in -!! the horizontal turbulence if the turbulence dimensionality is not -!! equal to "1DIM". -!! -!! In section 5, the x component of the stress tensor is computed. -!! The surface flux <u'w'> is computed from the value of the surface -!! fluxes computed in axes linked to the orography ( i", j" , k"): -!! i" is parallel to the surface and in the direction of the maximum -!! slope -!! j" is also parallel to the surface and in the normal direction of -!! the maximum slope -!! k" is the normal to the surface -!! In order to prevent numerical instability, the implicit scheme has -!! been extended to the surface flux regarding to its dependence in -!! function of U. The dependence in function of the other components -!! introduced by the different rotations is only explicit. -!! The turbulent fluxes are used to compute the dynamic production of -!! TKE. For the last TKE level ( located at PDZZ(:,:,IKB)/2 from the -!! ground), an harmonic extrapolation from the dynamic production at -!! PDZZ(:,:,IKB) is used to avoid an evaluation of the gradient of U -!! in the surface layer. -!! -!! In section 6, the same steps are repeated but for the y direction -!! and in section 7, a diagnostic computation of the W variance is -!! performed. -!! -!! In section 8, the turbulent fluxes for the scalar variables are -!! computed by the same way as the conservative thermodynamical variables -!! -!! -!! EXTERNAL -!! -------- -!! GX_U_M, GY_V_M, GZ_W_M : cartesian gradient operators -!! GX_U_UW,GY_V_VW (X,Y,Z) represent the direction of the gradient -!! _(M,U,...)_ represent the localization of the -!! field to be derivated -!! _(M,UW,...) represent the localization of the -!! field derivated -!! -!! -!! MXM,MXF,MYM,MYF,MZM,MZF -!! : Shuman functions (mean operators) -!! DXF,DYF,DZF,DZM -!! : Shuman functions (difference operators) -!! -!! SUBROUTINE TRIDIAG : to compute the split implicit evolution -!! of a variable located at a mass point -!! -!! SUBROUTINE TRIDIAG_WIND: to compute the split implicit evolution -!! of a variable located at a wind point -!! -!! FUNCTIONs ETHETA and EMOIST : -!! allows to compute: -!! - the coefficients for the turbulent correlation between -!! any variable and the virtual potential temperature, of its -!! correlations with the conservative potential temperature and -!! the humidity conservative variable: -!! ------- ------- ------- -!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : contains physical constants -!! -!! XG : gravity constant -!! -!! Module MODD_CTURB: contains the set of constants for -!! the turbulence scheme -!! -!! XCMFS,XCMFB : cts for the momentum flux -!! XCSHF : ct for the sensible heat flux -!! XCHF : ct for the moisture flux -!! XCTV,XCHV : cts for the T and moisture variances -!! -!! Module MODD_PARAMETERS -!! -!! JPVEXT_TURB : number of vertical external points -!! JPHEXT : number of horizontal external points -!! -!! -!! REFERENCE -!! --------- -!! Book 1 of documentation (Chapter: Turbulence) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart * INM and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original August 19, 1994 -!! Modifications: February 14, 1995 (J.Cuxart and J.Stein) -!! Doctorization and Optimization -!! Modifications: March 21, 1995 (J.M. Carriere) -!! Introduction of cloud water -!! Modifications: June 14, 1995 (J.Cuxart and J. Stein) -!! Phi3 and Psi3 at w-point + bug in the all -!! or nothing condens. -!! Modifications: Sept 15, 1995 (J.Cuxart and J. Stein) -!! Change the DP computation at the ground -!! Modifications: October 10, 1995 (J.Cuxart and J. Stein) -!! Psi for scal var and LES tools -!! Modifications: November 10, 1995 (J. Stein) -!! change the surface relations -!! Modifications: February 20, 1995 (J. Stein) optimization -!! Modifications: May 21, 1996 (J. Stein) -!! bug in the vertical flux of the V wind -!! component for explicit computation -!! Modifications: May 21, 1996 (N. wood) -!! modify the computation of the vertical -!! part or the surface tangential flux -!! Modifications: May 21, 1996 (P. Jabouille) -!! same modification in the Y direction -!! -!! Modifications: Sept 17, 1996 (J. Stein) change the moist case by using -!! Pi instead of Piref + use Atheta and Amoist -!! -!! Modifications: Nov 24, 1997 (V. Masson) removes the DO loops -!! Modifications: Mar 31, 1998 (V. Masson) splits the routine TURB_VER_SV_FLUX -!! Modifications: Dec 01, 2000 (V. Masson) conservation of scalar emission -!! from surface in 1DIM case -!! when slopes are present -!! Jun 20, 2001 (J Stein) case of lagragian variables -!! Nov 06, 2002 (V. Masson) LES budgets -!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after -!! change of YCOMMENT -!! Feb 2012(Y. Seity) add possibility to run with reversed -!! vertical levels -!! Feb 2017(M. Leriche) add initialisation of ZSOURCE -!! to avoid unknwon values outside physical domain -!! and avoid negative values in sv tendencies -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!!-------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_CTURB -use modd_field, only: tfielddata, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS -USE MODD_LES -USE MODD_CONF -USE MODD_NSV, ONLY: XSVMIN, NSV_LGBEG, NSV_LGEND -USE MODD_BLOWSNOW -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -! -USE MODI_GRADIENT_U -USE MODI_GRADIENT_V -USE MODI_GRADIENT_W -USE MODI_GRADIENT_M -USE MODI_SHUMAN -USE MODI_TRIDIAG -USE MODI_TRIDIAG_WIND -USE MODI_EMOIST -USE MODI_ETHETA -USE MODI_LES_MEAN_SUBGRID -! -USE MODI_SECOND_MNH -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -REAL, INTENT(IN) :: PTSTEP ! Double Time Step -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVM ! t - deltat -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSFSVP ! t + deltat -! -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-Delta t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM ! vertical wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PPSI_SV ! Inv.Turb.Sch.for scalars -! -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS - ! cumulated sources for the prognostic variables -REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PWSV ! scalar flux -! -! -! -! -!* 0.2 declaration of local variables -! -! -REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: & - ZA, & ! under diagonal elements of the tri-diagonal matrix involved - ! in the temporal implicit scheme (also used to store coefficient - ! J in Section 5) - ZRES, & ! guess of the treated variable at t+ deltat when the turbu- - ! lence is the only source of evolution added to the ones - ! considered in ZSOURCE - ZFLXZ, & ! vertical flux of the treated variable - ZSOURCE, & ! source of evolution for the treated variable - ZKEFF ! effectif diffusion coeff = LT * SQRT( TKE ) -INTEGER :: IKB,IKE ! I index values for the Beginning and End - ! mass points of the domain in the 3 direct. -INTEGER :: IKT ! array size in k direction -INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain -INTEGER :: JSV ! loop counters -INTEGER :: JK ! loop -INTEGER :: ISV ! number of scalar var. -! -REAL :: ZTIME1, ZTIME2 - -REAL :: ZCSVP = 4.0 ! constant for scalar flux presso-correlation (RS81) -REAL :: ZCSV !constant for the scalar flux -! -TYPE(TFIELDDATA) :: TZFIELD -!---------------------------------------------------------------------------- -! -!* 1. PRELIMINARIES -! ------------- -! -IKB=KKA+JPVEXT_TURB*KKL -IKE=KKU-JPVEXT_TURB*KKL -IKT=SIZE(PSVM,3) -IKTE =IKT-JPVEXT_TURB -IKTB =1+JPVEXT_TURB -! -ISV=SIZE(PSVM,4) -! -ZKEFF(:,:,:) = MZM( PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) -! -IF(LBLOWSNOW) THEN -! See Vionnet (PhD, 2012) for a complete discussion around the value of the Schmidt number for blowing snow variables - ZCSV= XCHF/XRSNOW -ELSE - ZCSV= XCHF -ENDIF -!---------------------------------------------------------------------------- -! -!* 8. SOURCES OF PASSIVE SCALAR VARIABLES -! ----------------------------------- -! -DO JSV=1,ISV -! - IF (LNOMIXLG .AND. JSV >= NSV_LGBEG .AND. JSV<= NSV_LGEND) CYCLE -! -! Preparation of the arguments for TRIDIAG - ZA(:,:,:) = -PTSTEP*ZCSV*PPSI_SV(:,:,:,JSV) * & - ZKEFF * MZM(PRHODJ) / & - PDZZ**2 - ZSOURCE(:,:,:) = 0. -! -! Compute the sources for the JSVth scalar variable - -!* in 3DIM case, a part of the flux goes vertically, and another goes horizontally -! (in presence of slopes) -!* in 1DIM case, the part of energy released in horizontal flux -! is taken into account in the vertical part - IF (HTURBDIM=='3DIM') THEN - ZSOURCE(:,:,IKB) = (PIMPL*PSFSVP(:,:,JSV) + PEXPL*PSFSVM(:,:,JSV)) / & - PDZZ(:,:,IKB) * PDIRCOSZW(:,:) & - * 0.5 * (1. + PRHODJ(:,:,KKA) / PRHODJ(:,:,IKB)) - ELSE - - ZSOURCE(:,:,IKB) = (PIMPL*PSFSVP(:,:,JSV) + PEXPL*PSFSVM(:,:,JSV)) / & - PDZZ(:,:,IKB) / PDIRCOSZW(:,:) & - * 0.5 * (1. + PRHODJ(:,:,KKA) / PRHODJ(:,:,IKB)) - END IF - ZSOURCE(:,:,IKTB+1:IKTE-1) = 0. - ZSOURCE(:,:,IKE) = 0. -! -! Obtention of the split JSV scalar variable at t+ deltat - CALL TRIDIAG(KKA,KKU,KKL,PSVM(:,:,:,JSV),ZA,PTSTEP,PEXPL,PIMPL,PRHODJ,ZSOURCE,ZRES) -! -! Compute the equivalent tendency for the JSV scalar variable - PRSVS(:,:,:,JSV)= PRSVS(:,:,:,JSV)+ & - PRHODJ(:,:,:)*(ZRES(:,:,:)-PSVM(:,:,:,JSV))/PTSTEP -! PRSVS(:,:,:,JSV)= MAX((PRSVS(:,:,:,JSV)+ & -! PRHODJ(:,:,:)*(ZRES(:,:,:)-PSVM(:,:,:,JSV))/PTSTEP),XSVMIN(JSV)) -! - IF ( (OTURB_FLX .AND. tpfile%lopened) .OR. LLES_CALL ) THEN - ! Diagnostic of the cartesian vertical flux - ! - ZFLXZ(:,:,:) = -ZCSV * PPSI_SV(:,:,:,JSV) * MZM(PLM*SQRT(PTKEM)) / PDZZ * & - DZM( PIMPL*ZRES(:,:,:) + PEXPL*PSVM(:,:,:,JSV) ) - ! surface flux - !* in 3DIM case, a part of the flux goes vertically, and another goes horizontally - ! (in presence of slopes) - !* in 1DIM case, the part of energy released in horizontal flux - ! is taken into account in the vertical part - IF (HTURBDIM=='3DIM') THEN - ZFLXZ(:,:,IKB) = (PIMPL*PSFSVP(:,:,JSV) + PEXPL*PSFSVM(:,:,JSV)) & - * PDIRCOSZW(:,:) - ELSE - ZFLXZ(:,:,IKB) = (PIMPL*PSFSVP(:,:,JSV) + PEXPL*PSFSVM(:,:,JSV)) & - / PDIRCOSZW(:,:) - END IF - ! extrapolates the flux under the ground so that the vertical average with - ! the IKB flux gives the ground value - ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) - DO JK=IKTB+1,IKTE-1 - PWSV(:,:,JK,JSV)=0.5*(ZFLXZ(:,:,JK)+ZFLXZ(:,:,JK+KKL)) - END DO - PWSV(:,:,IKB,JSV)=0.5*(ZFLXZ(:,:,IKB)+ZFLXZ(:,:,IKB+KKL)) - PWSV(:,:,IKE,JSV)=PWSV(:,:,IKE-KKL,JSV) - END IF - ! - IF (OTURB_FLX .AND. tpfile%lopened) THEN - ! stores the JSVth vertical flux - WRITE(TZFIELD%CMNHNAME,'("WSV_FLX_",I3.3)') JSV - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = TRIM(TZFIELD%CMNHNAME) - !PW: TODO: use the correct units of the JSV variable (and multiply it by m s-1) - TZFIELD%CUNITS = 'SVUNIT m s-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME) - TZFIELD%NGRID = 4 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - ! - CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) - END IF - ! - ! Storage in the LES configuration - ! - IF (LLES_CALL) THEN - CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( MZF(ZFLXZ), X_LES_SUBGRID_WSv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( GZ_W_M(PWM,PDZZ)*MZF(ZFLXZ), & - X_LES_RES_ddxa_W_SBG_UaSv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( MZF(GZ_M_W(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDZZ)*ZFLXZ), & - X_LES_RES_ddxa_Sv_SBG_UaSv(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( -ZCSVP*SQRT(PTKEM)/PLM*MZF(ZFLXZ), X_LES_SUBGRID_SvPz(:,:,:,JSV) ) - CALL LES_MEAN_SUBGRID( MZF(PWM*ZFLXZ), X_LES_RES_W_SBG_WSv(:,:,:,JSV) ) - CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 - END IF - ! -END DO ! end of scalar loop -! -!---------------------------------------------------------------------------- -! -END SUBROUTINE TURB_VER_SV_FLUX diff --git a/src/mesonh/turb/turb_ver_thermo_corr.f90 b/src/mesonh/turb/turb_ver_thermo_corr.f90 deleted file mode 100644 index bdd074e5c52af78809d84b8fa5077d56e12a76d5..0000000000000000000000000000000000000000 --- a/src/mesonh/turb/turb_ver_thermo_corr.f90 +++ /dev/null @@ -1,848 +0,0 @@ -!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. -!----------------------------------------------------------------- -! #################### - MODULE MODI_TURB_VER_THERMO_CORR -! #################### -! -INTERFACE -! - SUBROUTINE TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR,KRRL,KRRI, & - OTURB_FLX,HTURBDIM,HTOM, & - PIMPL,PEXPL, & - TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW, & - PRHODJ,PTHVREF, & - PSFTHM,PSFRM,PSFTHP,PSFRP, & - PWM,PTHLM,PRM,PSVM, & - PTKEM,PLM,PLEPS, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & - PBETA, PSQRT_TKE, PDTH_DZ, PDR_DZ, PRED2TH3, & - PRED2R3, PRED2THR3, PBLL_O_E, PETHETA, & - PEMOIST, PREDTH1, PREDR1, PPHI3, PPSI3, PD, & - PFWTH,PFWR,PFTH2,PFR2,PFTHR, & - PTHLP,PRP,PSIGS ) -! -USE MODD_IO, ONLY: TFILEDATA -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=AR -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. -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual - ! Potential Temperature -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time -! ! t - deltat -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time -! ! t + deltat -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM -! Vertical wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM -! potential temperature at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios - ! at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Mixing ratios -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized - ! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA ! buoyancy coefficient -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE ! sqrt(e) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTH_DZ ! d(th)/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDR_DZ ! d(rt)/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 ! 3D Redeslperger number R*2_th -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 ! 3D Redeslperger number R*2_r -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 ! 3D Redeslperger number R*2_thr -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E ! beta * Lk * Leps / tke -REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA ! Coefficient for theta in theta_v computation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST ! Coefficient for r in theta_v computation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 ! 1D Redelsperger number for Th -REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 ! 1D Redelsperger number for r -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Prandtl number for temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Prandtl number for vapor -REAL, DIMENSION(:,:,:), INTENT(IN) :: PD ! Denominator in Prandtl numbers -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz (at flux point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz (at flux point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz (at mass point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz (at mass point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at mass point) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLP ! guess of thl at t+ deltat -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRP ! guess of r at t+ deltat -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at t -! -! -! -END SUBROUTINE TURB_VER_THERMO_CORR -! -END INTERFACE -! -END MODULE MODI_TURB_VER_THERMO_CORR -! -! -! ############################################################### - SUBROUTINE TURB_VER_THERMO_CORR(KKA,KKU,KKL,KRR, KRRL, KRRI, & - OTURB_FLX,HTURBDIM,HTOM, & - PIMPL,PEXPL, & - TPFILE, & - PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW, & - PRHODJ,PTHVREF, & - PSFTHM,PSFRM,PSFTHP,PSFRP, & - PWM,PTHLM,PRM,PSVM, & - PTKEM,PLM,PLEPS, & - PLOCPEXNM,PATHETA,PAMOIST,PSRCM, & - PBETA, PSQRT_TKE, PDTH_DZ, PDR_DZ, PRED2TH3, & - PRED2R3, PRED2THR3, PBLL_O_E, PETHETA, & - PEMOIST, PREDTH1, PREDR1, PPHI3, PPSI3, PD, & - PFWTH,PFWR,PFTH2,PFR2,PFTHR, & - PTHLP,PRP,PSIGS ) -! ############################################################### -! -! -!!**** *TURB_VER_THERMO_FLUX* -compute the source terms due to the vertical turbulent -!! fluxes. -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to compute the vertical turbulent -! fluxes of the evolutive variables and give back the source -! terms to the main program. In the case of large horizontal meshes, -! the divergence of these vertical turbulent fluxes represent the whole -! effect of the turbulence but when the three-dimensionnal version of -! the turbulence scheme is activated (CTURBDIM="3DIM"), these divergences -! are completed in the next routine TURB_HOR. -! An arbitrary degree of implicitness has been implemented for the -! temporal treatment of these diffusion terms. -! The vertical boundary conditions are as follows: -! * at the bottom, the surface fluxes are prescribed at the same -! as the other turbulent fluxes -! * at the top, the turbulent fluxes are set to 0. -! It should be noted that the condensation has been implicitely included -! in this turbulence scheme by using conservative variables and computing -! the subgrid variance of a statistical variable s indicating the presence -! or not of condensation in a given mesh. -! -!!** METHOD -!! ------ -!! 1D type calculations are made; -!! The vertical turbulent fluxes are computed in an off-centered -!! implicit scheme (a Crank-Nicholson type with coefficients different -!! than 0.5), which allows to vary the degree of implicitness of the -!! formulation. -!! The different prognostic variables are treated one by one. -!! The contributions of each turbulent fluxes are cumulated into the -!! tendency PRvarS, and into the dynamic and thermal production of -!! TKE if necessary. -!! -!! In section 2 and 3, the thermodynamical fields are considered. -!! Only the turbulent fluxes of the conservative variables -!! (Thetal and Rnp stored in PRx(:,:,:,1)) are computed. -!! Note that the turbulent fluxes at the vertical -!! boundaries are given either by the soil scheme for the surface one -!! ( at the same instant as the others fluxes) and equal to 0 at the -!! top of the model. The thermal production is computed by vertically -!! averaging the turbulent flux and multiply this flux at the mass point by -!! a function ETHETA or EMOIST, which preform the transformation from the -!! conservative variables to the virtual potential temperature. -!! -!! In section 4, the variance of the statistical variable -!! s indicating presence or not of condensation, is determined in function -!! of the turbulent moments of the conservative variables and its -!! squarred root is stored in PSIGS. This information will be completed in -!! the horizontal turbulence if the turbulence dimensionality is not -!! equal to "1DIM". -!! -!! In section 5, the x component of the stress tensor is computed. -!! The surface flux <u'w'> is computed from the value of the surface -!! fluxes computed in axes linked to the orography ( i", j" , k"): -!! i" is parallel to the surface and in the direction of the maximum -!! slope -!! j" is also parallel to the surface and in the normal direction of -!! the maximum slope -!! k" is the normal to the surface -!! In order to prevent numerical instability, the implicit scheme has -!! been extended to the surface flux regarding to its dependence in -!! function of U. The dependence in function of the other components -!! introduced by the different rotations is only explicit. -!! The turbulent fluxes are used to compute the dynamic production of -!! TKE. For the last TKE level ( located at PDZZ(:,:,IKB)/2 from the -!! ground), an harmonic extrapolation from the dynamic production at -!! PDZZ(:,:,IKB) is used to avoid an evaluation of the gradient of U -!! in the surface layer. -!! -!! In section 6, the same steps are repeated but for the y direction -!! and in section 7, a diagnostic computation of the W variance is -!! performed. -!! -!! In section 8, the turbulent fluxes for the scalar variables are -!! computed by the same way as the conservative thermodynamical variables -!! -!! -!! EXTERNAL -!! -------- -!! GX_U_M, GY_V_M, GZ_W_M : cartesian gradient operators -!! GX_U_UW,GY_V_VW (X,Y,Z) represent the direction of the gradient -!! _(M,U,...)_ represent the localization of the -!! field to be derivated -!! _(M,UW,...) represent the localization of the -!! field derivated -!! -!! -!! MXM,MXF,MYM,MYF,MZM,MZF -!! : Shuman functions (mean operators) -!! DXF,DYF,DZF,DZM -!! : Shuman functions (difference operators) -!! -!! SUBROUTINE TRIDIAG : to compute the split implicit evolution -!! of a variable located at a mass point -!! -!! SUBROUTINE TRIDIAG_WIND: to compute the split implicit evolution -!! of a variable located at a wind point -!! -!! FUNCTIONs ETHETA and EMOIST : -!! allows to compute: -!! - the coefficients for the turbulent correlation between -!! any variable and the virtual potential temperature, of its -!! correlations with the conservative potential temperature and -!! the humidity conservative variable: -!! ------- ------- ------- -!! A' Thv' = ETHETA A' Thl' + EMOIST A' Rnp' -!! -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CST : contains physical constants -!! -!! XG : gravity constant -!! -!! Module MODD_CTURB: contains the set of constants for -!! the turbulence scheme -!! -!! XCMFS,XCMFB : cts for the momentum flux -!! XCSHF : ct for the sensible heat flux -!! XCHF : ct for the moisture flux -!! XCTV,XCHV : cts for the T and moisture variances -!! -!! Module MODD_PARAMETERS -!! -!! JPVEXT_TURB : number of vertical external points -!! JPHEXT : number of horizontal external points -!! -!! -!! REFERENCE -!! --------- -!! Book 1 of documentation (Chapter: Turbulence) -!! -!! AUTHOR -!! ------ -!! Joan Cuxart * INM and Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original August 19, 1994 -!! Modifications: February 14, 1995 (J.Cuxart and J.Stein) -!! Doctorization and Optimization -!! Modifications: March 21, 1995 (J.M. Carriere) -!! Introduction of cloud water -!! Modifications: June 14, 1995 (J.Cuxart and J. Stein) -!! Phi3 and Psi3 at w-point + bug in the all -!! or nothing condens. -!! Modifications: Sept 15, 1995 (J.Cuxart and J. Stein) -!! Change the DP computation at the ground -!! Modifications: October 10, 1995 (J.Cuxart and J. Stein) -!! Psi for scal var and LES tools -!! Modifications: November 10, 1995 (J. Stein) -!! change the surface relations -!! Modifications: February 20, 1995 (J. Stein) optimization -!! Modifications: May 21, 1996 (J. Stein) -!! bug in the vertical flux of the V wind -!! component for explicit computation -!! Modifications: May 21, 1996 (N. wood) -!! modify the computation of the vertical -!! part or the surface tangential flux -!! Modifications: May 21, 1996 (P. Jabouille) -!! same modification in the Y direction -!! -!! Modifications: Sept 17, 1996 (J. Stein) change the moist case by using -!! Pi instead of Piref + use Atheta and Amoist -!! -!! Modifications: Nov 24, 1997 (V. Masson) removes the DO loops -!! Modifications: Mar 31, 1998 (V. Masson) splits the routine TURB_VER_THERMO_FLUX -!! Modifications: Oct 18, 2000 (V. Masson) LES computations -!! Modifications: Dec 01, 2000 (V. Masson) conservation of energy from -!! surface flux in 1DIM case -!! when slopes are present -!! Nov 06, 2002 (V. Masson) LES budgets -!! October 2009 (G. Tanguy) add ILENCH=LEN(YCOMMENT) after -!! change of YCOMMENT -!! 2012-02 (Y. Seity) add possibility to run with reversed -!! vertical levels -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!!-------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_CTURB -use modd_field, only: tfielddata, TYPEREAL -USE MODD_IO, ONLY: TFILEDATA -USE MODD_PARAMETERS -USE MODD_CONF -USE MODD_LES -! -USE MODI_GRADIENT_U -USE MODI_GRADIENT_V -USE MODI_GRADIENT_W -USE MODI_GRADIENT_M -USE MODI_SHUMAN -USE MODI_TRIDIAG -USE MODI_LES_MEAN_SUBGRID -USE MODI_PRANDTL -USE MODI_TRIDIAG_THERMO -! -USE MODE_IO_FIELD_WRITE, only: IO_Field_write -USE MODE_PRANDTL -! -USE MODI_SECOND_MNH -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! -! -! -INTEGER, INTENT(IN) :: KKA !near ground array index -INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -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. -LOGICAL, INTENT(IN) :: OTURB_FLX ! switch to write the - ! turbulent fluxes in the syncronous FM-file -CHARACTER(len=4), INTENT(IN) :: HTURBDIM ! dimensionality of the - ! turbulence scheme -CHARACTER(len=4), INTENT(IN) :: HTOM ! type of Third Order Moment -REAL, INTENT(IN) :: PIMPL, PEXPL ! Coef. for temporal disc. -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ, PDXX, PDYY, PDZX, PDZY - ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus of the - ! normal to the ground surface -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry density * grid volum -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state Virtual - ! Potential Temperature -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHM,PSFRM ! surface fluxes at time -! ! t - deltat -! -REAL, DIMENSION(:,:), INTENT(IN) :: PSFTHP,PSFRP ! surface fluxes at time -! ! t + deltat -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PWM -! Vertical wind -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM -! potential temperature at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios - ! at t-Delta t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! Mixing ratios -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM ! TKE at time t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLM ! Turb. mixing length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLEPS ! dissipative length -REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exnref at time t-1 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PATHETA ! coefficients between -REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! s and Thetal and Rnp -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! normalized -! 2nd-order flux s'r'c/2Sigma_s2 at t-1 multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBETA ! buoyancy coefficient -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSQRT_TKE ! sqrt(e) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDTH_DZ ! d(th)/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDR_DZ ! d(rt)/dz -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2TH3 ! 3D Redeslperger number R*2_th -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2R3 ! 3D Redeslperger number R*2_r -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRED2THR3 ! 3D Redeslperger number R*2_thr -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBLL_O_E ! beta * Lk * Leps / tke -REAL, DIMENSION(:,:,:), INTENT(IN) :: PETHETA ! Coefficient for theta in theta_v computation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEMOIST ! Coefficient for r in theta_v computation -REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDTH1 ! 1D Redelsperger number for Th -REAL, DIMENSION(:,:,:), INTENT(IN) :: PREDR1 ! 1D Redelsperger number for r -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPHI3 ! Prandtl number for temperature -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPSI3 ! Prandtl number for vapor -REAL, DIMENSION(:,:,:), INTENT(IN) :: PD ! Denominator in Prandtl numbers -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWTH ! d(w'2th' )/dz (at flux point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFWR ! d(w'2r' )/dz (at flux point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTH2 ! d(w'th'2 )/dz (at mass point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFR2 ! d(w'r'2 )/dz (at mass point) -REAL, DIMENSION(:,:,:), INTENT(IN) :: PFTHR ! d(w'th'r')/dz (at mass point) -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLP ! guess of thl at t+ deltat -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRP ! guess of r at t+ deltat -! -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at t -! -! -! -!* 0.2 declaration of local variables -! -! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & - ZA, & ! work variable for wrc - ZFLXZ, & ! vertical flux of the treated variable - ZSOURCE, & ! source of evolution for the treated variable - ZKEFF, & ! effectif diffusion coeff = LT * SQRT( TKE ) - ZF, & ! Flux in dTh/dt =-dF/dz (evaluated at t-1)(or rt instead of Th) - ZDFDDTDZ, & ! dF/d(dTh/dz) - ZDFDDRDZ, & ! dF/d(dr/dz) - Z3RDMOMENT ! 3 order term in flux or variance equation -INTEGER :: IKB,IKE ! I index values for the Beginning and End - ! mass points of the domain in the 3 direct. -INTEGER :: I1,I2 ! For ZCOEFF allocation -REAL, DIMENSION(:,:,:),ALLOCATABLE :: ZCOEFF - ! coefficients for the uncentred gradient - ! computation near the ground -! -REAL :: ZTIME1, ZTIME2 -! -LOGICAL :: GUSERV ! flag to use water -LOGICAL :: GFTH2 ! flag to use w'th'2 -LOGICAL :: GFWTH ! flag to use w'2th' -LOGICAL :: GFR2 ! flag to use w'r'2 -LOGICAL :: GFWR ! flag to use w'2r' -LOGICAL :: GFTHR ! flag to use w'th'r' -TYPE(TFIELDDATA) :: TZFIELD -!---------------------------------------------------------------------------- -! -!* 1. PRELIMINARIES -! ------------- -! -IKB=KKA+JPVEXT_TURB*KKL -IKE=KKU-JPVEXT_TURB*KKL -I1=MIN(KKA+JPVEXT_TURB*KKL,KKA+JPVEXT_TURB*KKL+2*KKL) -I2=MAX(KKA+JPVEXT_TURB*KKL,KKA+JPVEXT_TURB*KKL+2*KKL) - -ALLOCATE(ZCOEFF(SIZE(PDZZ,1),SIZE(PDZZ,2),I1:I2)) -! -GUSERV = (KRR/=0) -! -! compute the coefficients for the uncentred gradient computation near the -! ground -ZCOEFF(:,:,IKB+2*KKL)= - PDZZ(:,:,IKB+KKL) / & - ( (PDZZ(:,:,IKB+2*KKL)+PDZZ(:,:,IKB+KKL)) * PDZZ(:,:,IKB+2*KKL) ) -ZCOEFF(:,:,IKB+KKL)= (PDZZ(:,:,IKB+2*KKL)+PDZZ(:,:,IKB+KKL)) / & - ( PDZZ(:,:,IKB+KKL) * PDZZ(:,:,IKB+2*KKL) ) -ZCOEFF(:,:,IKB)= - (PDZZ(:,:,IKB+2*KKL)+2.*PDZZ(:,:,IKB+KKL)) / & - ( (PDZZ(:,:,IKB+2*KKL)+PDZZ(:,:,IKB+KKL)) * PDZZ(:,:,IKB+KKL) ) -! -ZKEFF(:,:,:) = MZM( PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) -! -! Flags for 3rd order quantities -! -GFTH2 = .FALSE. -GFR2 = .FALSE. -GFTHR = .FALSE. -GFWTH = .FALSE. -GFWR = .FALSE. -! -IF (HTOM/='NONE') THEN - GFTH2 = ANY(PFTH2/=0.) - GFR2 = ANY(PFR2 /=0.) .AND. GUSERV - GFTHR = ANY(PFTHR/=0.) .AND. GUSERV - GFWTH = ANY(PFWTH/=0.) - GFWR = ANY(PFWR /=0.) .AND. GUSERV -END IF -!---------------------------------------------------------------------------- -! -! -!* 4. TURBULENT CORRELATIONS : <THl THl>, <THl Rnp>, <Rnp Rnp> -! -------------------------------------------------------- -! -! -!* 4.2 <THl THl> -! -! Compute the turbulent variance F and F' at time t-dt. - ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(PPHI3*PDTH_DZ**2) - ZDFDDTDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately - ! - ! Effect of 3rd order terms in temperature flux (at mass point) - ! - ! d(w'th'2)/dz - IF (GFTH2) THEN - ZF = ZF + M3_TH2_WTH2(PREDTH1,PREDR1,PD,PLEPS,& - & PSQRT_TKE) * PFTH2 - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WTH2_O_DDTDZ(PREDTH1,PREDR1,& - & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) * PFTH2 - END IF - ! - ! d(w'2th')/dz - IF (GFWTH) THEN - ZF = ZF + M3_TH2_W2TH(PREDTH1,PREDR1,PD,PDTH_DZ,& - & PLM,PLEPS,PTKEM) * MZF(PFWTH) - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,& - & PLM,PLEPS,PTKEM,GUSERV) * MZF(PFWTH) - END IF - ! - IF (KRR/=0) THEN - ! d(w'r'2)/dz - IF (GFR2) THEN - ZF = ZF + M3_TH2_WR2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,& - & PEMOIST,PDTH_DZ) * PFR2 - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,& - & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ) * PFR2 - END IF - ! - ! d(w'2r')/dz - IF (GFWR) THEN - ZF = ZF + M3_TH2_W2R(PD,PLM,PLEPS,PTKEM,PBLL_O_E,& - & PEMOIST,PDTH_DZ) * MZF(PFWR) - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,& - & PLM,PLEPS,PTKEM,PBLL_O_E,PEMOIST,PDTH_DZ) * MZF(PFWR) - END IF - ! - ! d(w'th'r')/dz - IF (GFTHR) THEN - ZF = ZF + M3_TH2_WTHR(PREDR1,PD,PLEPS,PSQRT_TKE,& - & PBLL_O_E,PEMOIST,PDTH_DZ) * PFTHR - ZDFDDTDZ = ZDFDDTDZ + D_M3_TH2_WTHR_O_DDTDZ(PREDTH1,PREDR1,& - & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ) * PFTHR - END IF - - END IF - ! - ZFLXZ(:,:,:) = ZF & - ! + PIMPL * XCTV*PLM*PLEPS & - ! *MZF(D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTH_DZ,HTURBDIM,GUSERV) & - ! *DZM(PTHLP - PTHLM) / PDZZ ) & - + PIMPL * ZDFDDTDZ * MZF(DZM(PTHLP - PTHLM) / PDZZ ) - ! - ! special case near the ground ( uncentred gradient ) - ZFLXZ(:,:,IKB) = XCTV * PPHI3(:,:,IKB+KKL) * PLM(:,:,IKB) & - * PLEPS(:,:,IKB) & - *( PEXPL * & - ( ZCOEFF(:,:,IKB+2*KKL)*PTHLM(:,:,IKB+2*KKL) & - +ZCOEFF(:,:,IKB+KKL )*PTHLM(:,:,IKB+KKL ) & - +ZCOEFF(:,:,IKB )*PTHLM(:,:,IKB ) )**2 & - +PIMPL * & - ( ZCOEFF(:,:,IKB+2*KKL)*PTHLP(:,:,IKB+2*KKL) & - +ZCOEFF(:,:,IKB+KKL )*PTHLP(:,:,IKB+KKL ) & - +ZCOEFF(:,:,IKB )*PTHLP(:,:,IKB ) )**2 & - ) - ! - ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) - ! - ZFLXZ = MAX(0., ZFLXZ) - ! - IF (KRRL > 0) THEN - PSIGS(:,:,:) = ZFLXZ(:,:,:) * PATHETA(:,:,:)**2 - END IF - ! - ! - ! stores <THl THl> - IF ( OTURB_FLX .AND. tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'THL_VVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THL_VVAR' - TZFIELD%CUNITS = 'K2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THL_VVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) - END IF -! -! and we store in LES configuration -! - IF (LLES_CALL) THEN - CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( ZFLXZ, X_LES_SUBGRID_Thl2 ) - CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLXZ, X_LES_RES_W_SBG_Thl2 ) - CALL LES_MEAN_SUBGRID( -2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Thl2 ) - CALL LES_MEAN_SUBGRID( PETHETA*ZFLXZ, X_LES_SUBGRID_ThlThv ) - CALL LES_MEAN_SUBGRID( -XA3*PBETA*PETHETA*ZFLXZ, X_LES_SUBGRID_ThlPz, .TRUE. ) - CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 - END IF -! - IF ( KRR /= 0 ) THEN -! -!* 4.3 <THl Rnp> -! -! - ! Compute the turbulent variance F and F' at time t-dt. - ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(0.5*(PPHI3+PPSI3)*PDTH_DZ*PDR_DZ) - ZDFDDTDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately - ZDFDDRDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately - ! - ! Effect of 3rd order terms in temperature flux (at mass point) - ! - ! d(w'th'2)/dz - IF (GFTH2) THEN - ZF = ZF + M3_THR_WTH2(PREDR1,PD,PLEPS,PSQRT_TKE,& - & PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WTH2_O_DDTDZ(PREDTH1,PREDR1,& - & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WTH2_O_DDRDZ(PREDTH1,PREDR1,& - & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) * PFTH2 - END IF - ! - ! d(w'2th')/dz - IF (GFWTH) THEN - ZF = ZF + M3_THR_W2TH(PREDR1,PD,PLM,PLEPS,PTKEM,& - & PDR_DZ) * MZF(PFWTH) - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_W2TH_O_DDTDZ(PREDTH1,PREDR1,& - & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PDR_DZ,PETHETA) * MZF(PFWTH) - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_W2TH_O_DDRDZ(PREDTH1,PREDR1,& - & PD,PLM,PLEPS,PTKEM) * MZF(PFWTH) - END IF - ! - ! d(w'r'2)/dz - IF (GFR2) THEN - ZF = ZF + M3_THR_WR2(PREDTH1,PD,PLEPS,PSQRT_TKE,& - & PBLL_O_E,PEMOIST,PDTH_DZ) * PFR2 - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WR2_O_DDTDZ(PREDR1,PREDTH1,PD,& - & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) * PFR2 - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WR2_O_DDRDZ(PREDR1,PREDTH1,PD,& - & PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTH_DZ) * PFR2 - END IF - ! - ! d(w'2r')/dz - IF (GFWR) THEN - ZF = ZF + M3_THR_W2R(PREDTH1,PD,PLM,PLEPS,PTKEM,& - & PDTH_DZ) * MZF(PFWR) - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_W2R_O_DDTDZ(PREDR1,PREDTH1,PD,& - & PLM,PLEPS,PTKEM) * MZF(PFWR) - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_W2R_O_DDRDZ(PREDR1,PREDTH1,PD,& - & PLM,PLEPS,PTKEM,PBLL_O_E,PDTH_DZ,PEMOIST) * MZF(PFWR) - END IF - ! - ! d(w'th'r')/dz - IF (GFTHR) THEN - ZF = ZF + M3_THR_WTHR(PREDTH1,PREDR1,PD,PLEPS,& - & PSQRT_TKE) * PFTHR - ZDFDDTDZ = ZDFDDTDZ + D_M3_THR_WTHR_O_DDTDZ(PREDTH1,PREDR1,& - & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA) * PFTHR - ZDFDDRDZ = ZDFDDRDZ + D_M3_THR_WTHR_O_DDRDZ(PREDR1,PREDTH1,& - & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) * PFTHR - END IF - ! - ZFLXZ(:,:,:) = ZF & - + PIMPL * XCTV*PLM*PLEPS*0.5 & - * MZF( ( D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) & ! d(phi3*dthdz)/ddthdz term - +D_PSI3DTDZ_O_DDTDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) & ! d(psi3*dthdz)/ddthdz term - ) *PDR_DZ *DZM(PTHLP - PTHLM ) / PDZZ & - +( D_PHI3DRDZ_O_DDRDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,GUSERV) & ! d(phi3*drdz )/ddrdz term - +D_PSI3DRDZ_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,HTURBDIM,GUSERV) & ! d(psi3*drdz )/ddrdz term - ) *PDTH_DZ *DZM(PRP - PRM(:,:,:,1)) / PDZZ & - ) & - + PIMPL * ZDFDDTDZ * MZF(DZM(PTHLP - PTHLM(:,:,:)) / PDZZ ) & - + PIMPL * ZDFDDRDZ * MZF(DZM(PRP - PRM(:,:,:,1)) / PDZZ ) - ! - ! special case near the ground ( uncentred gradient ) - ZFLXZ(:,:,IKB) = & - (XCHT1 * PPHI3(:,:,IKB+KKL) + XCHT2 * PPSI3(:,:,IKB+KKL)) & - *( PEXPL * & - ( ZCOEFF(:,:,IKB+2*KKL)*PTHLM(:,:,IKB+2*KKL) & - +ZCOEFF(:,:,IKB+KKL )*PTHLM(:,:,IKB+KKL ) & - +ZCOEFF(:,:,IKB )*PTHLM(:,:,IKB )) & - *( ZCOEFF(:,:,IKB+2*KKL)*PRM(:,:,IKB+2*KKL,1) & - +ZCOEFF(:,:,IKB+KKL )*PRM(:,:,IKB+KKL,1 ) & - +ZCOEFF(:,:,IKB )*PRM(:,:,IKB ,1 )) & - +PIMPL * & - ( ZCOEFF(:,:,IKB+2*KKL)*PTHLP(:,:,IKB+2*KKL) & - +ZCOEFF(:,:,IKB+KKL )*PTHLP(:,:,IKB+KKL ) & - +ZCOEFF(:,:,IKB )*PTHLP(:,:,IKB )) & - *( ZCOEFF(:,:,IKB+2*KKL)*PRP(:,:,IKB+2*KKL ) & - +ZCOEFF(:,:,IKB+KKL )*PRP(:,:,IKB+KKL ) & - +ZCOEFF(:,:,IKB )*PRP(:,:,IKB )) & - ) - ! - ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) - ! - IF ( KRRL > 0 ) THEN - PSIGS(:,:,:) = PSIGS(:,:,:) + & - 2. * PATHETA(:,:,:) * PAMOIST(:,:,:) * ZFLXZ(:,:,:) - END IF - ! stores <THl Rnp> - IF ( OTURB_FLX .AND. tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'THLRCONS_VCOR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'THLRCONS_VCOR' - TZFIELD%CUNITS = 'K kg kg-1' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_THLRCONS_VCOR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) - END IF -! -! and we store in LES configuration -! - IF (LLES_CALL) THEN - CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( ZFLXZ, X_LES_SUBGRID_THlRt ) - CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLXZ, X_LES_RES_W_SBG_ThlRt ) - CALL LES_MEAN_SUBGRID( -2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_ThlRt ) - CALL LES_MEAN_SUBGRID( PETHETA*ZFLXZ, X_LES_SUBGRID_RtThv ) - CALL LES_MEAN_SUBGRID( -XA3*PBETA*PETHETA*ZFLXZ, X_LES_SUBGRID_RtPz, .TRUE. ) - CALL LES_MEAN_SUBGRID( PEMOIST*ZFLXZ, X_LES_SUBGRID_ThlThv , .TRUE. ) - CALL LES_MEAN_SUBGRID( -XA3*PBETA*PEMOIST*ZFLXZ, X_LES_SUBGRID_ThlPz, .TRUE. ) - CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 - END IF -! -! -!* 4.4 <Rnp Rnp> -! -! - ! Compute the turbulent variance F and F' at time t-dt. - ZF (:,:,:) = XCTV*PLM*PLEPS*MZF(PPSI3*PDR_DZ**2) - ZDFDDRDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately - ! - ! Effect of 3rd order terms in temperature flux (at mass point) - ! - ! d(w'r'2)/dz - IF (GFR2) THEN - ZF = ZF + M3_R2_WR2(PREDR1,PREDTH1,PD,PLEPS,& - & PSQRT_TKE) * PFR2 - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WR2_O_DDRDZ(PREDR1,PREDTH1,& - & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST) * PFR2 - END IF - ! - ! d(w'2r')/dz - IF (GFWR) THEN - ZF = ZF + M3_R2_W2R(PREDR1,PREDTH1,PD,PDR_DZ,& - & PLM,PLEPS,PTKEM) * MZF(PFWR) - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_W2R_O_DDRDZ(PREDR1,PREDTH1,& - & PD,PLM,PLEPS,PTKEM,GUSERV) * MZF(PFWR) - END IF - ! - IF (KRR/=0) THEN - ! d(w'r'2)/dz - IF (GFTH2) THEN - ZF = ZF + M3_R2_WTH2(PD,PLEPS,PSQRT_TKE,& - & PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WTH2_O_DDRDZ(PREDR1,& - & PREDTH1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTH2 - END IF - ! - ! d(w'2r')/dz - IF (GFWTH) THEN - ZF = ZF + M3_R2_W2TH(PD,PLM,PLEPS,PTKEM,& - & PBLL_O_E,PETHETA,PDR_DZ) * MZF(PFWTH) - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_W2TH_O_DDRDZ(PREDR1,PREDTH1,& - & PD,PLM,PLEPS,PTKEM,PBLL_O_E,PETHETA,PDR_DZ) * MZF(PFWTH) - END IF - ! - ! d(w'th'r')/dz - IF (GFTHR) THEN - ZF = ZF + M3_R2_WTHR(PREDTH1,PD,PLEPS,& - & PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTHR - ZDFDDRDZ = ZDFDDRDZ + D_M3_R2_WTHR_O_DDRDZ(PREDR1,PREDTH1,& - & PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDR_DZ) * PFTHR - END IF - - END IF - ! - ZFLXZ(:,:,:) = ZF & - + PIMPL * XCTV*PLM*PLEPS & - *MZF(D_PSI3DRDZ2_O_DDRDZ(PPSI3,PREDR1,PREDTH1,PRED2R3,PRED2THR3,PDR_DZ,HTURBDIM,GUSERV) & - *DZM(PRP - PRM(:,:,:,1)) / PDZZ ) & - + PIMPL * ZDFDDRDZ * MZF(DZM(PRP - PRM(:,:,:,1)) / PDZZ ) - ! - ! special case near the ground ( uncentred gradient ) - ZFLXZ(:,:,IKB) = XCHV * PPSI3(:,:,IKB+KKL) * PLM(:,:,IKB) & - * PLEPS(:,:,IKB) & - *( PEXPL * & - ( ZCOEFF(:,:,IKB+2*KKL)*PRM(:,:,IKB+2*KKL,1) & - +ZCOEFF(:,:,IKB+KKL )*PRM(:,:,IKB+KKL,1 ) & - +ZCOEFF(:,:,IKB )*PRM(:,:,IKB ,1 ))**2 & - +PIMPL * & - ( ZCOEFF(:,:,IKB+2*KKL)*PRP(:,:,IKB+2*KKL) & - +ZCOEFF(:,:,IKB+KKL )*PRP(:,:,IKB+KKL ) & - +ZCOEFF(:,:,IKB )*PRP(:,:,IKB ))**2 & - ) - ! - ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) - ! - IF ( KRRL > 0 ) THEN - PSIGS(:,:,:) = PSIGS(:,:,:) + PAMOIST(:,:,:) **2 * ZFLXZ(:,:,:) - END IF - ! stores <Rnp Rnp> - IF ( OTURB_FLX .AND. tpfile%lopened ) THEN - TZFIELD%CMNHNAME = 'RTOT_VVAR' - TZFIELD%CSTDNAME = '' - TZFIELD%CLONGNAME = 'RTOT_VVAR' - TZFIELD%CUNITS = 'kg2 kg-2' - TZFIELD%CDIR = 'XY' - TZFIELD%CCOMMENT = 'X_Y_Z_RTOT_VVAR' - TZFIELD%NGRID = 1 - TZFIELD%NTYPE = TYPEREAL - TZFIELD%NDIMS = 3 - TZFIELD%LTIMEDEP = .TRUE. - CALL IO_Field_write(TPFILE,TZFIELD,ZFLXZ) - END IF - ! - ! and we store in LES configuration - ! - IF (LLES_CALL) THEN - CALL SECOND_MNH(ZTIME1) - CALL LES_MEAN_SUBGRID( ZFLXZ, X_LES_SUBGRID_Rt2 ) - CALL LES_MEAN_SUBGRID( MZF(PWM)*ZFLXZ, X_LES_RES_W_SBG_Rt2 ) - CALL LES_MEAN_SUBGRID( PEMOIST*ZFLXZ, X_LES_SUBGRID_RtThv , .TRUE. ) - CALL LES_MEAN_SUBGRID( -XA3*PBETA*PEMOIST*ZFLXZ, X_LES_SUBGRID_RtPz, .TRUE. ) - CALL LES_MEAN_SUBGRID( -2.*XCTD*PSQRT_TKE*ZFLXZ/PLEPS, X_LES_SUBGRID_DISS_Rt2 ) - CALL SECOND_MNH(ZTIME2) - XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 - END IF - ! - END IF ! end if KRR ne 0 -! -! -! 4.5 Vertical part of Sigma_s -! - IF ( KRRL > 0 ) THEN - ! Extrapolate PSIGS at the ground and at the top - PSIGS(:,:,KKA) = PSIGS(:,:,IKB) - PSIGS(:,:,KKU) = PSIGS(:,:,IKE) - PSIGS(:,:,:) = SQRT( MAX (PSIGS(:,:,:) , 1.E-12) ) - END IF - -! -! 4.6 Deallocate -! - DEALLOCATE(ZCOEFF) -!---------------------------------------------------------------------------- -END SUBROUTINE TURB_VER_THERMO_CORR