[2089] | 1 | ! $Id: physiq.F 1565 2011-08-31 12:53:29Z jghattas $ |
---|
| 2 | !#define IO_DEBUG |
---|
| 3 | |
---|
| 4 | !======================================================================================================================== |
---|
| 5 | ! Adaptation de physiq.F90 de phydev pour mettre en oeuvre une interface dynamique de LMDZ/physique de MAR. |
---|
| 6 | ! Martin Ménégoz (Février 2014) martin.menegoz@lgge.obs.ujf-grenoble.fr |
---|
| 7 | ! Contact LGGE: gallee@lgge.obs.ujf-grenoble.fr (modèle MAR) ; contact LMD: Frederic.hourdin@lmd.jussieu.fr (modèle LMDZ) |
---|
| 8 | !======================================================================================================================== |
---|
| 9 | |
---|
| 10 | SUBROUTINE physiq (nlon,nlev, & |
---|
| 11 | & debut,lafin,jD_cur, jH_cur,pdtphys, & |
---|
[2221] | 12 | & paprs,pplay,pphi,pphis,ppresnivs, & |
---|
[2089] | 13 | & u,v,t,qx, & |
---|
| 14 | & flxmass_w, & |
---|
| 15 | & d_u, d_v, d_t, d_qx, d_ps & |
---|
| 16 | & , dudyn ) |
---|
| 17 | |
---|
| 18 | USE dimphy, only : klon,klev,klevp1 |
---|
| 19 | USE infotrac, only : nqtot |
---|
| 20 | USE comgeomphy, only : rlatd,rlond,airephy |
---|
| 21 | !USE comcstphy, only : rg |
---|
| 22 | USE iophy, only : histbeg_phy,histwrite_phy |
---|
| 23 | USE ioipsl, only : getin,histvert,histdef,histend,ymds2ju,ju2ymds,histsync |
---|
| 24 | USE mod_phys_lmdz_para, only : jj_nb |
---|
| 25 | USE phys_state_var_mod, only : phys_state_var_init |
---|
| 26 | ! Modules LMDZ utilisés pour LMDZ-MAR: |
---|
| 27 | USE control_mod |
---|
| 28 | |
---|
| 29 | ! Modules utilisé pour MAR dans DYN_to_PHY_MAR.f90 |
---|
| 30 | use Mod_Real |
---|
| 31 | use Mod_PHY____dat |
---|
| 32 | use Mod_PHY____grd |
---|
| 33 | use Mod_PHY_S0_grd |
---|
| 34 | use Mod_SISVAT_grd |
---|
[2104] | 35 | use Mod_SISVAT_dat |
---|
[2089] | 36 | use Mod_SISVAT_gpt ! surface heat flxes in outputs |
---|
| 37 | use Mod_PHY_DY_kkl |
---|
| 38 | use Mod_PHY_CM_kkl ! pour écrire les snowfall et rainfall dans les outputs |
---|
| 39 | use Mod_PHY_CP_kkl ! pour écrire les snowfall et rainfall dans les outputs |
---|
| 40 | |
---|
| 41 | #ifdef CPP_XIOS |
---|
| 42 | USE wxios |
---|
| 43 | #endif |
---|
| 44 | |
---|
| 45 | IMPLICIT none |
---|
| 46 | |
---|
| 47 | #include "dimensions.h" |
---|
| 48 | ! Include LMDZ utilisés ici pour MAR-LMDZ: |
---|
| 49 | #include "comvert.h" |
---|
| 50 | #include "YOMCST.h" |
---|
| 51 | |
---|
| 52 | !====================================================================== |
---|
| 53 | ! Arguments du moniteur general de la physique dans le modele LMDZ |
---|
| 54 | !====================================================================== |
---|
| 55 | ! |
---|
| 56 | ! Arguments: |
---|
| 57 | ! |
---|
| 58 | ! nlon----input-I-nombre de points horizontaux |
---|
| 59 | ! nlev----input-I-nombre de couches verticales, doit etre egale a klev |
---|
| 60 | ! debut---input-L-variable logique indiquant le premier passage |
---|
| 61 | ! lafin---input-L-variable logique indiquant le dernier passage |
---|
| 62 | ! jD_cur -R-jour courant a l'appel de la physique (jour julien) |
---|
| 63 | ! jH_cur -R-heure courante a l'appel de la physique (jour julien) |
---|
| 64 | ! pdtphys-input-R-pas d'integration pour la physique (seconde) |
---|
| 65 | ! paprs---input-R-pression pour chaque inter-couche (en Pa) |
---|
| 66 | ! pplay---input-R-pression pour le mileu de chaque couche (en Pa) |
---|
| 67 | ! pphi----input-R-geopotentiel de chaque couche (g z) (reference sol) |
---|
| 68 | ! pphis---input-R-geopotentiel du sol |
---|
| 69 | ! ppresnivs-input_R_pressions approximat. des milieux couches ( en PA) |
---|
| 70 | ! u-------input-R-vitesse dans la direction X (de O a E) en m/s |
---|
| 71 | ! v-------input-R-vitesse Y (de S a N) en m/s |
---|
| 72 | ! t-------input-R-temperature (K) |
---|
| 73 | ! qx------input-R-humidite specifique (kg/kg) et d'autres traceurs |
---|
| 74 | ! d_t_dyn-input-R-tendance dynamique pour "t" (K/s) |
---|
| 75 | ! d_q_dyn-input-R-tendance dynamique pour "q" (kg/kg/s) |
---|
| 76 | ! flxmass_w -input-R- flux de masse verticale |
---|
| 77 | ! d_u-----output-R-tendance physique de "u" (m/s/s) |
---|
| 78 | ! d_v-----output-R-tendance physique de "v" (m/s/s) |
---|
| 79 | ! d_t-----output-R-tendance physique de "t" (K/s) |
---|
| 80 | ! d_qx----output-R-tendance physique de "qx" (kg/kg/s) |
---|
| 81 | ! d_ps----output-R-tendance physique de la pression au sol |
---|
| 82 | !IM |
---|
| 83 | |
---|
| 84 | !====================================================================== |
---|
| 85 | ! Variables ajoutés pour l'utilisation de la physique de MAR |
---|
| 86 | !====================================================================== |
---|
| 87 | |
---|
| 88 | integer,parameter :: jjmp1=jjm+1-1/jjm |
---|
| 89 | integer,parameter :: iip1=iim+1 |
---|
| 90 | |
---|
| 91 | ! Indices des traceurs (qx) |
---|
| 92 | ! NB: Tous les traceurs de MAR (vapeur d'eau et hydrométéores, solides et liquides) sont transportés via la variables qx (tendances: d_qx) |
---|
| 93 | ! Il doivent être déclarés dans un fichier traceur.def avant de lancer la simulation |
---|
| 94 | |
---|
| 95 | INTEGER, PARAMETER :: ivap = 1 ! indice de traceurs pour vapeur d'eau |
---|
| 96 | INTEGER, PARAMETER :: iliq = 2 ! indice de traceurs pour eau liquide |
---|
| 97 | INTEGER, PARAMETER :: iice = 3 ! indice de traceurs pour eau solide |
---|
| 98 | INTEGER, PARAMETER :: icin = 4 ! indice de traceurs pour CIN |
---|
| 99 | INTEGER, PARAMETER :: isnow = 5 ! indice de traceurs pour flocons de neige |
---|
| 100 | INTEGER, PARAMETER :: irain = 6 ! indice de traceurs pour gouttes de pluie |
---|
| 101 | INTEGER, PARAMETER :: itke = 7 ! indice de traceurs pour tke |
---|
| 102 | INTEGER, PARAMETER :: itked = 8 ! indice de traceurs pour tke dissipation |
---|
| 103 | ! #cw INTEGER, PARAMETER :: iccn = 9 ! indice de traceurs pour CCN |
---|
| 104 | |
---|
| 105 | !====================================================================== |
---|
| 106 | ! Arguments de la routine physiq.F90: |
---|
| 107 | !====================================================================== |
---|
| 108 | integer,intent(in) :: nlon ! number of atmospheric colums |
---|
| 109 | integer,intent(in) :: nlev ! number of vertical levels (should be =klev) |
---|
| 110 | real,intent(in) :: jD_cur ! current day number (Julian day) |
---|
| 111 | real,intent(in) :: jH_cur ! current time of day (as fraction of day) |
---|
| 112 | logical,intent(in) :: debut ! signals first call to physics |
---|
| 113 | logical,intent(in) :: lafin ! signals last call to physics |
---|
| 114 | real,intent(in) :: pdtphys ! physics time step (s) |
---|
| 115 | real,intent(in) :: paprs(klon,klev+1) ! interlayer pressure (Pa) |
---|
| 116 | real,intent(in) :: pplay(klon,klev) ! mid-layer pressure (Pa) |
---|
| 117 | real,intent(in) :: pphi(klon,klev) ! geopotential at mid-layer |
---|
| 118 | real,intent(in) :: pphis(klon) ! surface geopotential |
---|
| 119 | real,intent(in) :: ppresnivs(klev) ! pseudo-pressure (Pa) of mid-layers |
---|
| 120 | real,intent(in) :: u(klon,klev) ! eastward zonal wind (m/s) |
---|
| 121 | real,intent(in) :: v(klon,klev) ! northward meridional wind (m/s) |
---|
| 122 | real,intent(in) :: t(klon,klev) ! temperature (K) |
---|
| 123 | real,intent(in) :: qx(klon,klev,nqtot) ! tracers (.../kg_air) |
---|
| 124 | real,intent(in) :: flxmass_w(klon,klev) ! vertical mass flux |
---|
| 125 | real,intent(out) :: d_u(klon,klev) ! physics tendency on u (m/s/s) |
---|
| 126 | real,intent(out) :: d_v(klon,klev) ! physics tendency on v (m/s/s) |
---|
| 127 | real,intent(out) :: d_t(klon,klev) ! physics tendency on t (K/s) |
---|
| 128 | real,intent(out) :: d_qx(klon,klev,nqtot) ! physics tendency on tracers |
---|
| 129 | real,intent(out) :: d_ps(klon) ! physics tendency on surface pressure |
---|
| 130 | real,intent(in) :: dudyn(iim+1,jjmp1,klev) ! Not used |
---|
| 131 | |
---|
| 132 | !====================================================================== |
---|
| 133 | ! Variables locales temporelles |
---|
| 134 | !====================================================================== |
---|
| 135 | integer,save :: itau=0 ! counter to count number of calls to physics |
---|
| 136 | !$OMP THREADPRIVATE(itau) |
---|
| 137 | !real :: temp_newton(klon,klev) |
---|
| 138 | integer :: k |
---|
| 139 | logical, save :: first=.true. |
---|
| 140 | !$OMP THREADPRIVATE(first) |
---|
| 141 | |
---|
| 142 | !====================================================================== |
---|
| 143 | ! Inputs/Outputs |
---|
| 144 | !====================================================================== |
---|
| 145 | integer :: itau0 |
---|
| 146 | real :: zjulian |
---|
| 147 | real :: dtime |
---|
| 148 | integer :: nhori ! horizontal coordinate ID |
---|
| 149 | integer,save :: nid_hist ! output file ID |
---|
| 150 | !$OMP THREADPRIVATE(nid_hist) |
---|
| 151 | integer :: zvertid ! vertical coordinate ID |
---|
| 152 | integer,save :: iwrite_phys ! output every iwrite_phys physics step |
---|
| 153 | !$OMP THREADPRIVATE(iwrite_phys) |
---|
| 154 | integer :: iwrite_phys_omp ! intermediate variable to read iwrite_phys |
---|
| 155 | real :: t_ops ! frequency of the IOIPSL operations (eg average over...) |
---|
| 156 | real :: t_wrt ! frequency of the IOIPSL outputs |
---|
| 157 | |
---|
| 158 | |
---|
| 159 | !====================================================================== |
---|
| 160 | ! Arguments d'entrée pour la physique de MAR |
---|
| 161 | !====================================================================== |
---|
| 162 | |
---|
| 163 | ! NB : Pour plus de visibilité pour les développeurs de LMDZ et MAR, on conserve les noms de variables propres à MAR et LMDZ. |
---|
| 164 | ! La correspondance entre les variables se fait dans cette interface. |
---|
| 165 | |
---|
| 166 | ! Flags pour MAR (A ranger ultérieurement dans un fichier .def, selon le protocole LMDZ). |
---|
| 167 | ! Attention, ces Flags pilotent l'initialisation de nombreuses variables. Toutes les configurations n'ont pas été testées. |
---|
| 168 | ! Ici, on trouve les déclarations utilisées pour une experience aquaplanète. |
---|
| 169 | ! Contacter Hubert Gallée pour connaître la signification des Flags. |
---|
| 170 | |
---|
| 171 | |
---|
| 172 | logical :: FlagSV = .TRUE. ! Surface |
---|
| 173 | logical :: FlagSV_Veg = .TRUE. ! Végétation |
---|
| 174 | logical :: FlagSV_SNo = .TRUE. ! Neige |
---|
| 175 | logical :: FlagSV_BSn = .FALSE. ! |
---|
| 176 | logical :: FlagSV_KzT = .TRUE. ! |
---|
| 177 | logical :: FlagSV_SWD = .TRUE. ! (T,F) == SW INPUT is (downward,absorbed) |
---|
| 178 | ! FlagSV_SBC est utilisé pour lire des options de conditions aux limites. Ici, on le met à FALSE pour l'aquaplanète |
---|
| 179 | logical :: FlagSV_SBC = .FALSE. ! Flag pour utiliser le PHY_SISVAT_INP propre à notre experience |
---|
| 180 | logical :: FlagSV_UBC = .FALSE. ! |
---|
| 181 | logical :: FlagAT = .TRUE. ! |
---|
| 182 | character(len=1) :: TypeAT = 'e' ! Turbulence Model (e, K, L or H) |
---|
| 183 | logical :: FlagAT_TKE = .TRUE. ! |
---|
| 184 | logical :: FlagCM = .TRUE. ! |
---|
| 185 | !Gilles : T > F car LMDz utilise les tendances des traceurs (sauf frac.nuage) |
---|
| 186 | logical :: FlagCM_UpD = .FALSE. ! Update de la microphysique immédiat |
---|
| 187 | logical :: FlagCP = .TRUE. ! Avec ou sans convection |
---|
| 188 | logical :: FlagRT = .TRUE. ! |
---|
| 189 | logical :: FlagS0_SLO = .FALSE. ! |
---|
| 190 | logical :: FlagS0_MtM = .FALSE. ! |
---|
| 191 | logical :: Flag_O = .TRUE. ! |
---|
| 192 | !Gilles: FlagVR T > F pas de sortie interessante |
---|
| 193 | logical :: FlagVR = .FALSE. ! |
---|
| 194 | |
---|
| 195 | !====================================================================== |
---|
| 196 | ! Arguments pour la physique de MAR : |
---|
| 197 | !====================================================================== |
---|
| 198 | |
---|
| 199 | ! Pas de temps par défaut. Ils sont modifiés plus bas en fonction de pdtphys défini dans les fichiers .def. |
---|
| 200 | |
---|
| 201 | real :: dt0DYn = 60. ! Time Step, Dynamics [s] recalculé en fonction de day_step |
---|
| 202 | real :: dt0_SV = 60. ! Time Step, SISVAT [s] f(pdtphys) |
---|
| 203 | real :: dt0_AT = 60. ! Time Step, Atm_AT [s] f(pdtphys) |
---|
| 204 | real :: dt0_CM = 60. ! Time Step, CMiPhy [s] f(pdtphys) |
---|
| 205 | real :: dt0_CP = 600. ! Time Step, CVAmnh [s] f(pdtphys) |
---|
| 206 | real :: dt0_RT = 900. ! Time Step, radCEP [s] f(pdtphys) |
---|
| 207 | real :: dx = 4.0e+4 ! Grid Spacing, MAX authorised for CMiPhy [m] Limite max tolérée pour la microphysique MAR (40) |
---|
| 208 | real(kind=real8), dimension(klon) :: dx___HOST ! Grid Spacing max along x axis. |
---|
| 209 | real(kind=real8), dimension(klon) :: dy___HOST ! Grid Size [m] |
---|
| 210 | real :: DD_AxX = 90.00 ! x-Axis Direction [degree] Standard (90dg = Eastward) [dg] utilise juste pour les conditions aux limite et la position du soleil. |
---|
| 211 | real, dimension(klevp1) :: s_HOST ! MAR ne fonctionne que avec des coordonnées sigma: sigma=(p-Psommet)/(psurface -Psommet) |
---|
| 212 | real, dimension(klon) :: sh___HOST ! Surface Height [m] =0 en aquaplanète. A calculer ultérieurement en fonction de l'environnement LMDZ. |
---|
| 213 | real(kind=real8), dimension(klon) :: sh_a_HOST ! Topography Anomaly [m] |
---|
| 214 | real(kind=real8), dimension(klon) :: slopxHOST ! Slope, x-direction [-] |
---|
| 215 | real(kind=real8), dimension(klon) :: slopyHOST ! Slope, y-direction [-] |
---|
| 216 | real(kind=real8), dimension(klon) :: slopeHOST ! Slope [-] |
---|
| 217 | real(kind=real8), allocatable :: MMaskHOST(:,:) ! Mountain Mask [-] |
---|
| 218 | real, dimension(klon) :: lonh_HOST ! Longitude [hour] |
---|
| 219 | real, dimension(klon) :: latr_HOST ! Latitude [radian] |
---|
| 220 | real :: ptop_HOST ! Pressure Model Top [kPa] 0 in LMDZ |
---|
| 221 | real, dimension(klon,klevp1) :: pkta_HOST ! Reduced Potential Temperature [KX/s] ! Temperature * p ** (R/Cp) [KX] |
---|
| 222 | real, dimension(klon) :: psa__HOST ! Pressure Thickness [kPa] a recalculer en fonction du geopotentiel de surface: P*=Psurface-Ptop |
---|
| 223 | real, dimension(klon,klevp1) :: gZa__HOST ! Geopotential Height [m2/s2] pphi dans LMDZ |
---|
| 224 | real, dimension(klon,klevp1) :: gZam_HOST ! Geopotential Height, mid-level [m2/s2] On fait la moyenne entre couche du dessus et couche du dessous. |
---|
| 225 | real, dimension(klon,klev) :: Ua___HOST ! Wind Speed, x-direction [m/s] |
---|
| 226 | real, dimension(klon,klev) :: Va___HOST ! Wind Speed, y-direction [m/s] |
---|
| 227 | real, dimension(klon,klev) :: Wa___HOST ! Wind Speed, z-direction [m/s] Non echangé entre phys et dyn dans LMDZ. Necessaire pour MAR. On le recalcule ci-aprés ! |
---|
| 228 | real, dimension(klon,klevp1) :: qv___HOST ! Specific Humidity [kg/kg] qx(:,:,ivap) |
---|
| 229 | real, dimension(klon,klev) :: qw___HOST ! Cloud Droplets Concentration [kg/kg] qx(:,:,iliq) |
---|
| 230 | ! #cw real, dimension(klon,klev) :: CCN__HOST ! CCN Concentration [-/kg] qx(:,:,iccn) |
---|
| 231 | real, dimension(klon,klev) :: qi___HOST ! Cloud Crystals Concentration [kg/kg] qx(:,:,iice) |
---|
| 232 | real, dimension(klon,klev) :: CIN__HOST ! CIN Concentration [-/kg] qx(:,:,icin) |
---|
| 233 | real, dimension(klon,klev) :: CF___HOST ! Cloud Fraction [-/kg] Dans le futur, la CF sera transportée dans la dynamique, mais pour l'instant, on n'en a pas besoin. |
---|
| 234 | |
---|
| 235 | real, dimension(klon,klev) :: qs___HOST ! Snow Particles Concentration [kg/kg] qx(:,:,isnow) |
---|
| 236 | real, dimension(klon,klev) :: qr___HOST ! Rain Drops Concentration [kg/kg] qx(:,:,irain) |
---|
| 237 | real, dimension(klon,klev) :: TKE__HOST ! Turbulent Kinetic Energy [m2/s2] qx(:,:,itke) |
---|
| 238 | real, dimension(klon,klev) :: eps__HOST ! Turbulent Kinetic Energy Dissipation [m2/s3] qx(:,:,itked) |
---|
| 239 | real, dimension(klon,klev) :: dpkt___dt ! Reduced Potential Temperature TENDENCY, ALL Contribut.[KX/s] a recalculer en fonction de d_t de LMDZ |
---|
| 240 | real, dimension(klon,klev) :: dua____dt ! Wind Speed (x-direc.) TENDENCY, ALL Contribut.[m/s2] output commune MAR-LMD |
---|
| 241 | real, dimension(klon,klev) :: dva____dt ! Wind Speed (y-direc.) TENDENCY, ALL Contribut.[m/s2] output commune MAR-LMD |
---|
| 242 | real, dimension(klon,klev) :: dqv____dt ! Specific Humidity TENDENCY, ALL Contr. [kg/kg/s] output commune MAR-LMD |
---|
| 243 | real, dimension(klon,klev) :: dqw____dt ! Cloud Droplets Concentration TENDENCY, ALL Contr. [kg/kg/s] dqx |
---|
| 244 | ! #cw real, dimension(klon,klev) :: dCw____dt ! CCN Concentration TENDENCY, ALL Contr. [1/kg/s] dqx |
---|
| 245 | real, dimension(klon,klev) :: dqi____dt ! Cloud Crystals Concentration TENDENCY, ALL Contr. [kg/kg/s] dqx |
---|
| 246 | real, dimension(klon,klev) :: dCi____dt ! CIN Concentration TENDENCY, ALL Contr. [1/kg/s] dqx |
---|
| 247 | real, dimension(klon,klev) :: dCF____dt ! Cloud Fraction TENDENCY, ALL Contr. [kg/kg/s] dqx |
---|
| 248 | real, dimension(klon,klev) :: dqs____dt ! Snow Particles Concentration TENDENCY, ALL Contr. [kg/kg/s] dqx |
---|
| 249 | real, dimension(klon,klev) :: dqr____dt ! Rain Drops Concentration TENDENCY, ALL Contr. [kg/kg/s] dqx |
---|
| 250 | ! #dT& real, dimension(klon,klev) :: dpktSV_dt ! Reduced Potential Temperature Tendency, SISVAT [KX/s] |
---|
| 251 | ! #dT real, dimension(klon,klev) :: dpktAT_dt ! Reduced Potential Temperature Tendency, Atm_AT [KX/s] |
---|
| 252 | ! #dT real, dimension(klon,klev) :: dqv_AT_dt ! Specific Humidity TENDENCY, Atm_AT [kg/kg/s] dqx |
---|
| 253 | ! #dT real, dimension(klon,klev) :: dqw_AT_dt ! Cloud Droplets Concentration TENDENCY, Atm_AT [kg/kg/s] dqx |
---|
| 254 | ! #cw real, dimension(klon,klev) :: dCw_AT_dt ! CCN Concentration TENDENCY, Atm_AT [1/s] dqx |
---|
| 255 | ! #dT real, dimension(klon,klev) :: dqi_AT_dt ! Cloud Crystals Concentration TENDENCY, Atm_AT [kg/kg/s] dqx |
---|
| 256 | ! #dT real, dimension(klon,klev) :: dCi_AT_dt ! CIN Concentration TENDENCY, Atm_AT [1/s] dqx |
---|
| 257 | ! #dT real, dimension(klon,klev) :: dqs_AT_dt ! Snow Particles Concentration TENDENCY, Atm_AT [kg/kg/s] dqx |
---|
| 258 | ! #dT real, dimension(klon,klev) :: dqr_AT_dt ! Rain Drops Concentration TENDENCY, Atm_AT [kg/kg/s] dqx |
---|
| 259 | ! #dT real, dimension(klon,klev) :: dpktCM_dt ! Reduced Potential Temperature Tendency, CMiPhy [KX/s] dqx |
---|
| 260 | ! #dT real, dimension(klon,klev) :: dqv_CM_dt ! Specific Humidity TENDENCY, CMiPhy [kg/kg/s] dqx |
---|
| 261 | ! #dT real, dimension(klon,klev) :: dqw_CM_dt ! Cloud Droplets Concentration TENDENCY, CMiPhy [kg/kg/s] dqx |
---|
| 262 | ! #cw real, dimension(klon,klev) :: dCw_CM_dt ! CCN Concentration TENDENCY, CMiPhy [1/s] dqx |
---|
| 263 | ! #dT real, dimension(klon,klev) :: dqi_CM_dt ! Cloud Crystals Concentration TENDENCY, CMiPhy [kg/kg/s] dqx |
---|
| 264 | ! #dT real, dimension(klon,klev) :: dCi_CM_dt ! CIN Concentration TENDENCY, CMiPhy [1/s] dqx |
---|
| 265 | ! #dT real, dimension(klon,klev) :: dCF_CM_dt ! Cloud Fraction TENDENCY, CMiPhy [1/s] dqx |
---|
| 266 | ! #dT real, dimension(klon,klev) :: dqs_CM_dt ! Snow Particles Concentration TENDENCY, CMiPhy [kg/kg/s] dqx |
---|
| 267 | ! #dT real, dimension(klon,klev) :: dqr_CM_dt ! Rain Drops Concentration TENDENCY, CMiPhy [kg/kg/s] dqx |
---|
| 268 | ! #dT real, dimension(klon,klev) :: dpktCP_dt ! Reduced Potential Temperature TENDENCY, CVAmnh [KX/s] |
---|
| 269 | ! #dT real, dimension(klon,klev) :: dqv_CP_dt ! Specific Humidity TENDENCY, CVAmnh [kg/kg/s] dqx |
---|
| 270 | ! #dT real, dimension(klon,klev) :: dqw_CP_dt ! Cloud Droplets Concentration TENDENCY, CVAmnh [kg/kg/s] dqx |
---|
| 271 | ! #dT real, dimension(klon,klev) :: dqi_CP_dt ! Cloud Crystals Concentration TENDENCY, CVAmnh [kg/kg/s] dqx |
---|
| 272 | ! #dT real, dimension(klon,klev) :: dpktRT_dt ! Reduced Potential Temperature TENDENCY, radCEP [KX/s] |
---|
| 273 | |
---|
| 274 | integer,save :: it0EXP ! Incremente en fonction de debut et lafin. NB: MAR fait des restarts dans le Fortran, LMDZ avec des scripts shells. On suit ici la logique LMDZ. it0EXP et it0RUN sont donc identiques. |
---|
| 275 | integer,save :: it0RUN ! Incremente en fonction de debut et lafin. |
---|
| 276 | integer :: Year_H ! Time [year] |
---|
| 277 | integer :: Mon__H ! Time [month] |
---|
| 278 | integer :: Day__H ! Time [Day] |
---|
| 279 | integer :: Hour_H ! Time [hour] |
---|
| 280 | integer :: minu_H ! Time [minute] |
---|
| 281 | integer :: sec__H ! Time [s] |
---|
| 282 | integer :: ixq1,i0x0,mxqq ! Domain Dimension: x [-] |
---|
| 283 | integer :: jyq1,j0y0,myqq ! Domain Dimension: y [-] |
---|
| 284 | !integer :: klev ! Domain Dimension: z [-] Commun à MAR et LMDZ |
---|
| 285 | !integer :: klevp1 ! Domain Dimension: z [-] Commun à MAR et LMDZ |
---|
| 286 | integer :: mwq ! Domain Dimension: mosaic [-] |
---|
| 287 | !integer :: klon ! Domain Dimension: x * y [-] Commun à MAR et LMDZ |
---|
| 288 | integer :: kcolw ! Domain Dimension: x * y * mosaic [-] |
---|
| 289 | integer :: m_azim ! Mountain Mask, nb of directions taken into account [-] |
---|
| 290 | integer,parameter :: n0pt=1 ! nombre de points qui peuvent être choisis pour le fichier PHY____.OUT |
---|
| 291 | integer, dimension(n0pt) :: IOi0SV ! |
---|
| 292 | integer, dimension(n0pt) :: IOj0SV ! |
---|
| 293 | real, dimension(klon) :: sst__HOST ! Ocean FORCING (SST) [K] |
---|
| 294 | ! #IP real, dimension(klon) :: sif__HOST ! Ocean FORCING (Sea-Ice Fraction ) [-] |
---|
| 295 | ! #AO real, dimension(ixq1:mxqq,jyq1:myqq,mwq) :: s_T__HOST ! A - O COUPLING n=1: Open Ocean [K] |
---|
| 296 | ! #AO real, dimension(ixq1:mxqq,jyq1:myqq,mwq) :: Alb__HOST ! A - O COUPLING (Surface Albedo ) n=2: Sea Ice [-] |
---|
| 297 | ! #AO real, dimension(ixq1:mxqq,jyq1:myqq,mwq) :: dSdT2HOST ! A - O COUPLING ( d(SH Flux) / dT ) [W/m2/K] |
---|
| 298 | ! #AO real, dimension(ixq1:mxqq,jyq1:myqq,mwq) :: dLdT2HOST ! A - O COUPLING ( d(SH Flux) / dT ) [W/m2/K] |
---|
| 299 | ! #TC integer, parameter :: ntrac = 28 ! |
---|
| 300 | ! #TC real, dimension(ixq1:mxqq,jyq1:myqq,klev,ntrac) :: qxTC ! Aerosols: Atmospheric Contentration |
---|
| 301 | ! #TC real, dimension(ixq1:mxqq,jyq1:myqq ,ntrac) :: qsTC ! Aerosols: Near Surface Contentration |
---|
| 302 | ! #TC real, dimension(ixq1:mxqq,jyq1:myqq ,ntrac) :: uqTC ! Aerosols: Surf.Flux |
---|
| 303 | |
---|
| 304 | !====================================================================== |
---|
| 305 | ! Variables locales: |
---|
| 306 | !====================================================================== |
---|
| 307 | |
---|
| 308 | real :: secondes ! pour le calcul de la date |
---|
| 309 | integer :: i ! Pour les boucles |
---|
| 310 | integer :: daysec ! Nombre de secondes dans ue journée |
---|
| 311 | integer,save :: annee_ref ! Année du début de la simulation |
---|
| 312 | !integer :: count_year ! le nombre d'années depuis le début de la simulation |
---|
| 313 | !real,parameter :: epsilon = 1.e-6 ! pour le calcul du temps |
---|
| 314 | |
---|
| 315 | ! Constantes définies comme dans MAR et utilisées ici: |
---|
| 316 | real :: RdA = 287. ! Perfect Gas Law Constant for Dry Air [J/kg/K] |
---|
| 317 | real :: CpA = 1004. ! Specific Heat Capacity for Dry Air [J/kg/K] |
---|
| 318 | real :: kap ! RdA/CpA [-] |
---|
| 319 | |
---|
| 320 | ! Pour l'initialisation: |
---|
| 321 | real, dimension(klon) :: Ts___HOST ! Temperature de surface pour l'initialisation. |
---|
| 322 | real, dimension(klon) :: pkt_DY_surf_tmp ! pkt de surface pour l'initialisation. |
---|
| 323 | real, dimension(klon) :: qv_HOST_surf_tmp ! qv de surface pour l'initialisation. |
---|
| 324 | |
---|
| 325 | ! Pour ecriture en netcdf |
---|
| 326 | real, dimension(klon,klev) :: cldfra ! CF___HOST vertically inverted |
---|
| 327 | |
---|
| 328 | !====================================================================== |
---|
| 329 | !! Ecriture des sorties netcdf: |
---|
| 330 | !====================================================================== |
---|
| 331 | |
---|
| 332 | ! NB : La version de MAR utilisée ici ne permet pas d'écrire de sorties netcdf. |
---|
| 333 | ! On n'utilise pas encore XIOS |
---|
| 334 | ! En attendant, on utilise ici le classique ioipsl, ainsi que l'outil iotd de Frédéric Hourdin. |
---|
| 335 | |
---|
| 336 | if (debut) then ! Things to do only for the first call to physics |
---|
| 337 | ! load initial conditions for physics (including the grid) |
---|
| 338 | call phys_state_var_init() ! some initializations, required before calling phyetat0 |
---|
| 339 | call phyetat0("startphy.nc") |
---|
| 340 | |
---|
| 341 | ! Initialize outputs: |
---|
| 342 | itau0=0 |
---|
| 343 | !$OMP MASTER |
---|
| 344 | iwrite_phys_omp=1 !default: output every physics timestep |
---|
| 345 | ! NB: getin() is not threadsafe; only one thread should call it. |
---|
| 346 | call getin("iwrite_phys",iwrite_phys_omp) |
---|
| 347 | !$OMP END MASTER |
---|
| 348 | !$OMP BARRIER |
---|
| 349 | iwrite_phys=iwrite_phys_omp |
---|
| 350 | t_ops=pdtphys*iwrite_phys ! frequency of the IOIPSL operation |
---|
| 351 | t_wrt=pdtphys*iwrite_phys ! frequency of the outputs in the file |
---|
| 352 | ! compute zjulian for annee0=1979 and month=1 dayref=1 and hour=0.0 |
---|
| 353 | !CALL ymds2ju(annee0, month, dayref, hour, zjulian) |
---|
| 354 | call getin('anneeref',anneeref) |
---|
| 355 | call ymds2ju(anneeref, 1, 1, 0.0, zjulian) |
---|
| 356 | annee_ref=anneeref ! On la sauve pour le reste de la simulation |
---|
| 357 | dtime=pdtphys |
---|
| 358 | |
---|
| 359 | ! Initialisation de iophy pour l'utilisation de iotd créé par Frédéric Hourdin |
---|
| 360 | call iophys_ini ! NB: cette initialisation concerne l'ecriture de fichiers phys.nc dans PHY_MAR (rechercher iophys_ecrit) |
---|
| 361 | |
---|
| 362 | !Gilles : replace zjulian by jD_cur (if correct init of the year) |
---|
| 363 | ! call histbeg_phy("histins.nc",itau0,zjulian,dtime,nhori,nid_hist) |
---|
| 364 | call histbeg_phy("histins.nc",itau0,jD_cur,dtime,nhori,nid_hist) |
---|
| 365 | |
---|
| 366 | !$OMP MASTER |
---|
| 367 | |
---|
| 368 | ! define vertical coordinate |
---|
| 369 | call histvert(nid_hist,"presnivs","Vertical levels","Pa",klev, & |
---|
| 370 | ppresnivs,zvertid,'down') |
---|
| 371 | ! define variables which will be written in "histins.nc" file |
---|
| 372 | call histdef(nid_hist,'temperature','Atmospheric temperature','K', & |
---|
| 373 | iim,jj_nb,nhori,klev,1,klev,zvertid,32, & |
---|
| 374 | 'inst(X)',t_ops,t_wrt) |
---|
| 375 | call histdef(nid_hist,'pplay','atmospheric pressure','K', & |
---|
| 376 | iim,jj_nb,nhori,klev,1,klev,zvertid,32, & |
---|
| 377 | 'inst(X)',t_ops,t_wrt) |
---|
| 378 | call histdef(nid_hist,'ps','Surface Pressure','Pa', & |
---|
| 379 | iim,jj_nb,nhori,1,1,1,zvertid,32, & |
---|
| 380 | 'inst(X)',t_ops,t_wrt) |
---|
| 381 | call histdef(nid_hist,'qx_vap','specific humidity','kg/kg', & |
---|
| 382 | iim,jj_nb,nhori,klev,1,klev,zvertid,32, & |
---|
| 383 | 'inst(X)',t_ops,t_wrt) |
---|
| 384 | call histdef(nid_hist,'qx_liq','atmospheric liquid water content','kg/kg', & |
---|
| 385 | iim,jj_nb,nhori,klev,1,klev,zvertid,32, & |
---|
| 386 | 'inst(X)',t_ops,t_wrt) |
---|
| 387 | call histdef(nid_hist,'qx_ice','atmospheric ice content','kg/kg', & |
---|
| 388 | iim,jj_nb,nhori,klev,1,klev,zvertid,32, & |
---|
| 389 | 'inst(X)',t_ops,t_wrt) |
---|
| 390 | call histdef(nid_hist,'u','Eastward Zonal Wind','m/s', & |
---|
| 391 | iim,jj_nb,nhori,klev,1,klev,zvertid,32, & |
---|
| 392 | 'inst(X)',t_ops,t_wrt) |
---|
| 393 | call histdef(nid_hist,'v','Northward Meridional Wind','m/s', & |
---|
| 394 | iim,jj_nb,nhori,klev,1,klev,zvertid,32, & |
---|
| 395 | 'inst(X)',t_ops,t_wrt) |
---|
| 396 | call histdef(nid_hist,'lonh','longitude','Hours', & |
---|
| 397 | iim,jj_nb,nhori,1,1,1,zvertid,32, & |
---|
| 398 | 'inst(X)',t_ops,t_wrt) |
---|
| 399 | call histdef(nid_hist,'latr','latitude','radian', & |
---|
| 400 | iim,jj_nb,nhori,1,1,1,zvertid,32, & |
---|
| 401 | 'inst(X)',t_ops,t_wrt) |
---|
| 402 | call histdef(nid_hist,'sst','Prescribed SST','K', & |
---|
| 403 | iim,jj_nb,nhori,1,1,1,zvertid,32, & |
---|
| 404 | 'inst(X)',t_ops,t_wrt) |
---|
| 405 | ! Tendances physiques de MAR ; pour le developpement MAR-LMDZ: |
---|
| 406 | call histdef(nid_hist,'d_t','Atmospheric temperature trends after MAR physics','K/s', & |
---|
| 407 | iim,jj_nb,nhori,klev,1,klev,zvertid,32, & |
---|
| 408 | 'inst(X)',t_ops,t_wrt) |
---|
| 409 | call histdef(nid_hist,'d_u','Eastward Zonal Wind trend','m/s/s', & |
---|
| 410 | iim,jj_nb,nhori,klev,1,klev,zvertid,32, & |
---|
| 411 | 'inst(X)',t_ops,t_wrt) |
---|
| 412 | call histdef(nid_hist,'d_v','Northward Meridional Wind trend','m/s/s', & |
---|
| 413 | iim,jj_nb,nhori,klev,1,klev,zvertid,32, & |
---|
| 414 | 'inst(X)',t_ops,t_wrt) |
---|
| 415 | ! Définition de variables utilisée dans des sous-routines MAR |
---|
| 416 | call histdef(nid_hist,'snow','snowfall convectif + stratiform','m', & |
---|
| 417 | iim,jj_nb,nhori,1,1,1,zvertid,32, & |
---|
| 418 | 'inst(X)',t_ops,t_wrt) |
---|
| 419 | call histdef(nid_hist,'rain','rainfall convectif + stratiform','m', & |
---|
| 420 | iim,jj_nb,nhori,1,1,1,zvertid,32, & |
---|
| 421 | 'inst(X)',t_ops,t_wrt) |
---|
| 422 | call histdef(nid_hist,'snowCP','snowfall convective','m', & |
---|
| 423 | iim,jj_nb,nhori,1,1,1,zvertid,32, & |
---|
| 424 | 'inst(X)',t_ops,t_wrt) |
---|
| 425 | call histdef(nid_hist,'rainCP','rainfall convective','m', & |
---|
| 426 | iim,jj_nb,nhori,1,1,1,zvertid,32, & |
---|
| 427 | 'inst(X)',t_ops,t_wrt) |
---|
| 428 | call histdef(nid_hist,'nebulosity','CF___HOST','-', & |
---|
| 429 | iim,jj_nb,nhori,klev,1,klev,zvertid,32, & |
---|
| 430 | 'inst(X)',t_ops,t_wrt) |
---|
| 431 | ! end definition sequence |
---|
| 432 | call histend(nid_hist) |
---|
| 433 | |
---|
| 434 | !XIOS |
---|
| 435 | #ifdef CPP_XIOS |
---|
| 436 | ! Déclaration de l'axe vertical du fichier: |
---|
| 437 | !CALL wxios_add_vaxis("presnivs", "histins", klev, ppresnivs) |
---|
| 438 | |
---|
| 439 | !Déclaration du pas de temps: |
---|
| 440 | !CALL wxios_set_timestep(dtime) |
---|
| 441 | |
---|
| 442 | !Finalisation du contexte: |
---|
| 443 | !CALL wxios_closedef() |
---|
| 444 | #endif |
---|
| 445 | !$OMP END MASTER |
---|
| 446 | endif ! of if (debut) |
---|
| 447 | |
---|
| 448 | !====================================================================== |
---|
| 449 | ! Calcul de variables environnement nécessaires à la physique de MAR |
---|
| 450 | !====================================================================== |
---|
| 451 | |
---|
| 452 | ! NB : Calculs à faire avant l'initialisation de la physique |
---|
| 453 | |
---|
| 454 | ! Calcul de constantes |
---|
| 455 | |
---|
| 456 | kap = RdA / CpA |
---|
| 457 | rpi = 4.*ATAN(1.) |
---|
| 458 | daysec = 86400. |
---|
| 459 | |
---|
| 460 | ! increment counter itau |
---|
| 461 | itau=itau+1 |
---|
| 462 | |
---|
| 463 | PRINT*, 'dans physiq.F90 :' |
---|
| 464 | PRINT*, 'itau=',itau |
---|
| 465 | |
---|
| 466 | ! set all tendencies to zero |
---|
| 467 | PRINT*, 'On initialise les tendances à zéro:' |
---|
| 468 | d_u(1:klon,1:klev)=0. |
---|
| 469 | d_v(1:klon,1:klev)=0. |
---|
| 470 | d_t(1:klon,1:klev)=0. |
---|
| 471 | d_qx(1:klon,1:klev,1:nqtot)=0. |
---|
| 472 | d_ps(1:klon)=0. |
---|
| 473 | |
---|
| 474 | ! Allocation de tableaux: |
---|
| 475 | ! Pour l'instant : |
---|
| 476 | m_azim=1 ! Azimuths pour le calcul des masques de montagne |
---|
| 477 | ALLOCATE(MMaskHOST(klon,m_azim)) ! Mountain Mask [-] |
---|
| 478 | |
---|
| 479 | ! Appeller iniaqua et phyetat0 pour l'état initial avant le transfert vers les variables MAR ! |
---|
| 480 | ! A faire pour lorsque l'on prendra en compte les continents |
---|
| 481 | |
---|
| 482 | ! Timesteps pour MAR (définis ici à partir des pas de temps LMDZ). A modifier éventuellement (via les fichiers .def) |
---|
| 483 | ! dt0_CP & dt0_RT modifiees ici selon Hubert avec daystep=720 ie dtdyn=2mn |
---|
| 484 | ! pdtphys modifie via gcm.def avec iphysiq=1 & nsplit_phys=1 |
---|
| 485 | dt0DYn=daysec/REAL(day_step) ! Time Step, Dynamics [s] |
---|
| 486 | dt0_AT=pdtphys ! Time Step, SISVAT [s] |
---|
| 487 | dt0_SV=pdtphys ! Time Step, Atm_AT [s] |
---|
| 488 | dt0_CM=pdtphys ! Time Step, CMiPhy [s] |
---|
| 489 | dt0_CP=pdtphys*10 ! Time Step, CVAmnh [s] |
---|
| 490 | dt0_RT=pdtphys*20 ! Time Step, radCEP [s] |
---|
| 491 | |
---|
| 492 | ! Correspondances de grilles: inutilisé car on utilise directement les variables LMD |
---|
| 493 | |
---|
| 494 | ! Dans un premier temps, une seule mozaique: |
---|
| 495 | mwq=1 |
---|
| 496 | |
---|
| 497 | kcolw=mwq*klon |
---|
| 498 | |
---|
| 499 | DO i=1,klon |
---|
| 500 | IF (rlond(i) .LT. 0) THEN |
---|
| 501 | lonh_HOST(i)=rlond(i)*12./rpi+24. ! from radians to hours |
---|
| 502 | ELSE |
---|
| 503 | lonh_HOST(i)=rlond(i)*12./rpi ! from radians to hours |
---|
| 504 | ENDIF |
---|
| 505 | ENDDO |
---|
| 506 | latr_HOST(:)=rlatd(:) ! from radians to radians |
---|
| 507 | |
---|
| 508 | !PRINT*, 'lonh_HOST(:)=',lonh_HOST(:) |
---|
| 509 | !PRINT*, 'latr_HOST(:)=',latr_HOST(:) |
---|
| 510 | |
---|
| 511 | ! Niveaux verticaux: |
---|
| 512 | ! Attention, il faut faire un test pour vérifier si les coordonnées verticaux définis sont adéquats avec ceux de MAR! |
---|
| 513 | DO k = 1, klev |
---|
| 514 | i=klev+1-k |
---|
| 515 | IF (ap(k) .NE. 0) THEN |
---|
| 516 | CALL abort_gcm('','MAR physic can be applied only with sigma levels, check vertical resolution in disvert.F90',1) |
---|
| 517 | ELSE |
---|
| 518 | s_HOST(i)=0.5*(bp(k)+bp(k+1)) |
---|
| 519 | ENDIF |
---|
| 520 | END DO |
---|
| 521 | s_HOST(klev+1)=1 ! Dans MAR, sigma est défini depuis tout en haut jusqu'à la surface. s_HOST doit être égal à 1 en surface. |
---|
| 522 | |
---|
| 523 | ! En attendant que les routines PHY_____INI.F90, PHY_MAR_DAT.F90 et PHY_SISVAT_INP.F90 soient écrites selon un vecteur et non pas selon un tableau 2D lon-lat. |
---|
| 524 | ! On utilise ici la grille physique de LMDZ, qui a la taille klon (en argument de la physique): 2 + (JJM-1)*IIM (soit 1682 pour une grille dynamique de 48*36 déclarée à la compilation). |
---|
| 525 | |
---|
| 526 | mxqq=iim |
---|
| 527 | myqq=jjm+1 |
---|
| 528 | |
---|
| 529 | ! Pour MAR, on a besoin des indices du premier point de la grille. Avec une grille globale, c'esty toujours (1,1): |
---|
| 530 | ixq1=1 |
---|
| 531 | jyq1=1 |
---|
| 532 | |
---|
| 533 | |
---|
| 534 | ! Temps: |
---|
| 535 | IF (debut) THEN |
---|
| 536 | it0EXP=1 |
---|
| 537 | ELSE |
---|
| 538 | it0EXP=it0EXP+1 |
---|
| 539 | ENDIF |
---|
| 540 | |
---|
| 541 | IF (debut) THEN |
---|
| 542 | it0RUN=1 |
---|
| 543 | ELSE |
---|
| 544 | it0RUN=it0RUN+1 |
---|
| 545 | ENDIF |
---|
| 546 | |
---|
| 547 | ! Pour l'instant, on ne peut démarrer une simulation seulement le 1er jour de l'année de référence: |
---|
| 548 | ! Attention, ju2ymds ne donne pas l'année courante, mais compte les années de simulations à partir de 0 !!! A checker !!! |
---|
| 549 | CALL ymds2ju(annee_ref, 1, 1, 0.0, zjulian) |
---|
| 550 | !Gilles: zjulian already counted in jD_cur if year correctly initialised |
---|
| 551 | !CALL ju2ymds(jD_cur+jH_cur+zjulian,Year_H,Mon__H,Day__H,secondes) |
---|
| 552 | CALL ju2ymds(jD_cur+jH_cur,Year_H,Mon__H,Day__H,secondes) |
---|
| 553 | Hour_H=INT(secondes)/3600 |
---|
| 554 | minu_H=(INT(secondes)-Hour_H*3600)/60 |
---|
| 555 | !minu_H=INT((secondes-float(Hour_H)*3600.+epsilon)/60.) ! attention aux arrondis machine |
---|
| 556 | sec__H=INT(secondes)-(Hour_H*3600)-(minu_H*60) |
---|
| 557 | |
---|
| 558 | Print*,'CONTROL du temps avant d appeler la physique' |
---|
| 559 | Print*,'zjulian=',zjulian |
---|
| 560 | Print*,'annee_ref=',annee_ref |
---|
| 561 | Print*, 'jD_cur=',JD_cur |
---|
| 562 | Print*, 'jH_cur=',jH_cur |
---|
| 563 | Print*, 'Year_H=',Year_H |
---|
| 564 | Print*, 'Mon__H',Mon__H |
---|
| 565 | Print*, 'Day__H',Day__H |
---|
| 566 | Print*, 'secondes=',secondes |
---|
| 567 | Print*, 'Hour_H=',Hour_H |
---|
| 568 | Print*, 'minu_H=',minu_H |
---|
| 569 | Print*, 'sec__H=',sec__H |
---|
| 570 | Print*, 'klev=',klev |
---|
| 571 | Print*, 'klevp1=',klevp1 |
---|
| 572 | Print*, 'nlev=',nlev |
---|
| 573 | Print*, 'nlon=',nlon |
---|
| 574 | Print*, 'klon=',klon |
---|
| 575 | PRINT*, 'RCp=',RCp |
---|
| 576 | |
---|
| 577 | ! Coordonnées du point (en indice) pour lequel on imprime les sorties en ASCII dans le fichier PHY___________.OUT |
---|
| 578 | i0x0=23 |
---|
| 579 | j0y0=48 |
---|
| 580 | ! Variable utilisée juste pour les outputs: |
---|
| 581 | IOi0SV(:)=1 |
---|
| 582 | IOj0SV(:)=1 |
---|
| 583 | |
---|
| 584 | ! Variables inutilisees: |
---|
| 585 | dy___HOST=0. |
---|
| 586 | !CF___HOST=0. ! Pour l'instant pas utilisé, il faut tout de même l'initialiser? |
---|
| 587 | dCF____dt=0. |
---|
| 588 | |
---|
| 589 | |
---|
| 590 | !====================================================================== |
---|
| 591 | ! INITIALISATIONS MAR |
---|
| 592 | !====================================================================== |
---|
| 593 | ! |
---|
| 594 | ! NB : les routines MAR ci-aprés doivent encore être travaillées. Ici, elles ne fonctionnent que pour une aquaplanète ! |
---|
| 595 | |
---|
| 596 | it_RUN = it0RUN |
---|
| 597 | it_EXP = it0EXP |
---|
| 598 | |
---|
| 599 | IF (it0RUN.LE.1) THEN |
---|
| 600 | |
---|
| 601 | PRINT*,'it0RUN=0; On appelle les routines d initialisation de la physique de MAR' |
---|
| 602 | |
---|
| 603 | ! Initialization of Mod_PHY____grd |
---|
| 604 | ! -------------------------------- |
---|
| 605 | |
---|
| 606 | ! Anciennes initialisations MAR |
---|
| 607 | |
---|
| 608 | dxHOST = dx |
---|
| 609 | DirAxX = DD_AxX |
---|
| 610 | ixp1 = ixq1 |
---|
| 611 | i_x0 = i0x0 |
---|
| 612 | mxpp = mxqq |
---|
| 613 | jyp1 = jyq1 |
---|
| 614 | j_y0 = j0y0 |
---|
| 615 | mypp = myqq |
---|
| 616 | mzpp = klevp1 |
---|
| 617 | kcolp = klon |
---|
| 618 | kcolv = kcolw |
---|
| 619 | |
---|
| 620 | ! Initialization of Mod_PHY_S0_grd |
---|
| 621 | ! -------------------------------- |
---|
| 622 | ! Pour l'instant, en attendant du relief : |
---|
| 623 | n_azim = m_azim |
---|
| 624 | |
---|
| 625 | ! Initialization of Mod_SISVAT_grd (Mosaic Discretization only ) |
---|
| 626 | ! -------------------------------- ( Discretization from Mod_SISVAT_dim : see PHY_SISVAT_ALLOC) |
---|
| 627 | |
---|
| 628 | mwp = mwq |
---|
| 629 | |
---|
[2104] | 630 | ! Initialization of Mod_SISVAT_dat |
---|
| 631 | ! -------------------------------- |
---|
| 632 | ! pour aquaplanete: FixedSST=1 |
---|
| 633 | VarSST = 0. |
---|
| 634 | |
---|
[2089] | 635 | ! Initialization of Physical Constants and Allocation of main Variables |
---|
| 636 | ! --------------------------------------------------------------------- |
---|
| 637 | |
---|
| 638 | ! CONTROL |
---|
| 639 | PRINT*, 'Appel de PHY INI' |
---|
| 640 | ! ************** |
---|
| 641 | CALL PHY________INI |
---|
| 642 | ! ************** |
---|
| 643 | |
---|
| 644 | |
---|
| 645 | ! INPUT DATA surface et Calcul des dependances a des Points Horizontaux autres que le Point courant |
---|
| 646 | ! ================================================================================================= |
---|
| 647 | ! |
---|
| 648 | |
---|
| 649 | ! Pour l'instant, PHY_MAR_DAT n'est pas vectorisé, donc on initilise tout en dur pour l'aquaplanète. |
---|
| 650 | ! Ultérieurement, il faudra lires les données topo de LMDZ pour renseigner ces variables à l'initialisation. |
---|
| 651 | |
---|
| 652 | PRINT*,'Initialisation en dur des variables topo pour une aquaplanete' |
---|
| 653 | sh___HOST(:)=0.00 |
---|
| 654 | sh_a_HOST(:)=0.00 |
---|
| 655 | dx___HOST(:) = 1.e3 |
---|
| 656 | dy___HOST(:) = 1.e3 |
---|
| 657 | slopxHOST(:) = 0.00 |
---|
| 658 | slopyHOST(:) = 0.00 |
---|
| 659 | slopeHOST(:) = 0.00 |
---|
| 660 | MMaskHOST(:,:) = 0.00 |
---|
| 661 | |
---|
| 662 | ! CONTROL |
---|
| 663 | !PRINT*, 'Appel de PHY MAR DAT' |
---|
| 664 | ! *********** |
---|
| 665 | ! CALL PHY_MAR_DAT( & |
---|
| 666 | !! *********** |
---|
| 667 | !& sh___HOST &! Topographie [m] |
---|
| 668 | !& ,sh_a_HOST &! Topographie, Anomalie [m] |
---|
| 669 | !& ,dx___HOST &! Discretisation, x [m] |
---|
| 670 | !& ,dy___HOST &! Discretisation, y [m] |
---|
| 671 | !& ,slopxHOST &! Pente selon l'Axe x [-] |
---|
| 672 | !& ,slopyHOST &! Pente selon l'Axe y [-] |
---|
| 673 | !& ,slopeHOST &! Pente [-] |
---|
| 674 | !& ,MMaskHOST &! Masque de Montagnes [-] |
---|
| 675 | !& ,ixq1,mxqq &! |
---|
| 676 | !& ,jyq1,myqq &! |
---|
| 677 | !& ,m_azim &! |
---|
| 678 | !& ) |
---|
| 679 | |
---|
| 680 | ! FIRST Initialization of the Surface Variables |
---|
| 681 | ! ============================================= |
---|
| 682 | |
---|
| 683 | |
---|
| 684 | ! Initial Surface Temperature ( initialement dans DYN_to_PHY_MAR) |
---|
| 685 | ! --------------------------- |
---|
| 686 | |
---|
| 687 | ! CONTROL |
---|
| 688 | PRINT*, 'Calcul de Ts___HOST dans la physique' |
---|
| 689 | PRINT*, 'Initialisation de la temperature de surface avec les SST aquaplanète' |
---|
| 690 | DO i = 1,klon |
---|
| 691 | Ts___HOST(i)=273.+27.*(1-sin(1.5*rlatd(i))**2) |
---|
| 692 | IF ((rlatd(i).GT.1.0471975).OR.(rlatd(i).LT.-1.0471975)) THEN |
---|
| 693 | Ts___HOST(i)=273. |
---|
| 694 | ENDIF |
---|
| 695 | |
---|
| 696 | !PRINT*, 'Initialisation de la temperature de surface avec la temperature du premier niveau' |
---|
| 697 | !Ts___HOST(i) = pkta_HOST(i,klevp1)*(psa__HOST(i)+ptop_HOST)**RCp |
---|
| 698 | !Ts___HOST(i) = t(i,klev) |
---|
| 699 | ENDDO |
---|
| 700 | |
---|
| 701 | ! CONTROL |
---|
| 702 | PRINT*, 'Avant PHY SISVAT INP' |
---|
| 703 | PRINT*,'MAXVAL(Ts___HOST(:)=)',maxval(Ts___HOST(:)) |
---|
| 704 | PRINT*,'MINVAL(Ts___HOST(:)=)',minval(Ts___HOST(:)) |
---|
| 705 | PRINT*, 'Appel de PHY SISVAT INP' |
---|
| 706 | ! ************** |
---|
| 707 | CALL PHY_SISVAT_INP(FlagSV_SBC,Ts___HOST,klon) |
---|
| 708 | ! ************** |
---|
| 709 | |
---|
| 710 | PRINT*, 'Apres PHY SISVAT INP' |
---|
| 711 | PRINT*,'MAXVAL(Ts___HOST(:)=)',maxval(Ts___HOST(:)) |
---|
| 712 | PRINT*,'MINVAL(Ts___HOST(:)=)',minval(Ts___HOST(:)) |
---|
| 713 | |
---|
| 714 | END IF ! (it0RUN.LE.1) |
---|
| 715 | |
---|
| 716 | |
---|
| 717 | ! Horizontal Interactions |
---|
| 718 | ! ====================== |
---|
| 719 | |
---|
| 720 | |
---|
| 721 | ! Interface: DATA for Stand-Alone Version of the Physical Package |
---|
| 722 | ! =============================================================== |
---|
| 723 | |
---|
| 724 | IF (.NOT. FlagRT .OR. & |
---|
| 725 | & .NOT. FlagAT .OR. & |
---|
| 726 | & .NOT. FlagCM) THEN |
---|
| 727 | ! & .NOT. FlagCP) THEN |
---|
| 728 | ! CONTROL |
---|
| 729 | PRINT*, 'Appel de PHY SISVAT UBC' |
---|
| 730 | ! ************** |
---|
| 731 | CALL PHY_SISVAT_UBC(FlagRT,FlagAT,FlagCM,FlagCP) |
---|
| 732 | ! ************** |
---|
| 733 | |
---|
| 734 | END IF |
---|
| 735 | |
---|
| 736 | PRINT*, 'Apres PHY_SISVAT_UBC' |
---|
| 737 | Print*, 'mzp=',mzp |
---|
| 738 | Print*, 'mzpp=',mzpp |
---|
| 739 | |
---|
| 740 | !====================================================================== |
---|
| 741 | ! Calcul des inputs de MAR à partir de LMDZ |
---|
| 742 | !====================================================================== |
---|
| 743 | |
---|
| 744 | ! NB : Calculs à faire aprés l'initialisation de la physique du MAR |
---|
| 745 | |
---|
| 746 | PRINT*, 'Calcul des inputs de MAR à partir de LMDZ' |
---|
| 747 | |
---|
| 748 | ! Correspondance ou transformation de variables: |
---|
| 749 | ! RKAPPA=R/Cp dans un module LMD ; |
---|
| 750 | ! Probleme, on n'a pas la temperature de surface dans les arguments !!! a voir avec Hubert comment on fait... |
---|
| 751 | ! En attendant, on prend la température du premier niveau au lieu de celle de la surface (idem pour le haut de l'atmosphère): |
---|
| 752 | ! NB : Attention aux unités ! |
---|
| 753 | |
---|
| 754 | IF (debut) THEN |
---|
[2104] | 755 | ! On initialise avec la temperature du premier niveau au lieu de la temperature de surface à la première itération: |
---|
| 756 | pkt_DY_surf_tmp(:)=t(:,1) / (pplay(:,1)/1000) ** kap |
---|
[2089] | 757 | ELSE |
---|
[2104] | 758 | pkt_DY_surf_tmp(:)=pkt_DY(:,klev+1) |
---|
[2089] | 759 | ENDIF |
---|
[2104] | 760 | |
---|
[2089] | 761 | pkta_HOST(:,klev+1)=pkt_DY_surf_tmp(:) |
---|
| 762 | DO k = 1, klev |
---|
| 763 | i=klev+1-k |
---|
| 764 | pkta_HOST(:,i) = t(:,k) / (pplay(:,k)/1000) ** kap |
---|
| 765 | END DO |
---|
| 766 | |
---|
| 767 | ptop_HOST=0. |
---|
| 768 | psa__HOST(:)=(paprs(:,1)-paprs(:,klev+1))/1000. ! [kPa] |
---|
| 769 | |
---|
| 770 | ! Correspondance du géopotentiel entre LMDZ et MAR : |
---|
| 771 | |
---|
| 772 | ! Aux niveaux: |
---|
| 773 | DO k = 1, klev |
---|
| 774 | i=klev+1-k |
---|
| 775 | gZa__HOST(:,i)=pphi(:,k) |
---|
| 776 | END DO |
---|
| 777 | gZa__HOST(:,klev+1)=pphis(:) |
---|
| 778 | |
---|
| 779 | ! Aux inter-niveaux: |
---|
| 780 | DO k = 1, klev |
---|
| 781 | gZam_HOST(:,k+1)=0.5*(gZa__HOST(:,k+1)+gZa__HOST(:,k)) |
---|
| 782 | END DO |
---|
| 783 | gZam_HOST(:,1)=1.5*gZa__HOST(:,1)-0.5*gZa__HOST(:,2) ! Extrapolation au sommet de l'atmosphère |
---|
| 784 | DO k = 1, klev |
---|
| 785 | i=klev+1-k |
---|
| 786 | Ua___HOST(:,i)=u(:,k) |
---|
| 787 | Va___HOST(:,i)=v(:,k) |
---|
| 788 | ENDDO |
---|
| 789 | |
---|
| 790 | ! Calcul de vitesse verticale a partir de flux de masse verticale : |
---|
| 791 | DO k = 1, klev |
---|
| 792 | i=klev+1-k |
---|
| 793 | !omega(i,k) = RG*flxmass_w(i,k) / airephy(i) ! omega en Pa/s |
---|
| 794 | Wa___HOST(:,i)=flxmass_w(:,k) / airephy(:) * (gZam_HOST(:,i+1) - gZam_HOST(:,i))/(paprs(:,k+1)-paprs(:,k)) ! Equilibre hydrostatique |
---|
| 795 | END DO |
---|
| 796 | Wa___HOST(:,klev)=0 ! Vitesse nulle à la surface. |
---|
| 797 | Wa___HOST(:,1)=0 ! Vitesse nulle au sommet. |
---|
| 798 | |
---|
| 799 | ! Tendances: |
---|
| 800 | DO k = 1, klev |
---|
| 801 | i=klev+1-k |
---|
| 802 | dpkt___dt(:,i)=d_t(:,k) / (pplay(:,k)/1000) ** kap |
---|
| 803 | dua____dt(:,i)=d_u(:,k) |
---|
| 804 | dva____dt(:,i)=d_v(:,k) |
---|
| 805 | ENDDO |
---|
| 806 | |
---|
| 807 | |
---|
| 808 | DO k = 1, klev |
---|
| 809 | i=klev+1-k |
---|
| 810 | |
---|
| 811 | ! Traceurs: |
---|
| 812 | qv___HOST(:,i)=qx(:,k,ivap) ! Specific Humidity [kg/kg] |
---|
| 813 | qw___HOST(:,i)=qx(:,k,iliq) ! Cloud Droplets Concentration [kg/kg] |
---|
| 814 | qi___HOST(:,i)=qx(:,k,iice) ! Cloud Crystals Concentration [kg/kg] |
---|
| 815 | CIN__HOST(:,i)=qx(:,k,icin) ! CIN Concentration [-/kg] |
---|
| 816 | qs___HOST(:,i)=qx(:,k,isnow) ! Snow Particles Concentration [kg/kg] |
---|
| 817 | qr___HOST(:,i)=qx(:,k,irain) ! Rain Drops Concentration [kg/kg] |
---|
| 818 | TKE__HOST(:,i)=qx(:,k,itke) ! Turbulent Kinetic Energy [m2/s2] |
---|
| 819 | eps__HOST(:,i)=qx(:,k,itked) ! Turbulent Kinetic Energy Dissipation [m2/s3] |
---|
| 820 | ! #cw CCN__HOST(:,:)=qx(:,:,iccn) ! CCN Concentration [-/kg] |
---|
| 821 | |
---|
| 822 | END DO |
---|
| 823 | |
---|
| 824 | ! Dans MAR, qv(klev+1)=qv(klev) |
---|
| 825 | IF (debut) THEN |
---|
| 826 | ! On initialise avec le qv du premier niveau au lieu du qv de surface à la première itération: |
---|
| 827 | qv_HOST_surf_tmp(:)=qv___HOST(:,klev) |
---|
| 828 | ELSE |
---|
| 829 | qv_HOST_surf_tmp(:)=qv__DY(:,klev+1) |
---|
| 830 | ENDIF |
---|
| 831 | qv___HOST(:,klev+1)=qv_HOST_surf_tmp(:) ! Specific Humidity [kg/kg] |
---|
| 832 | |
---|
| 833 | DO k = 1, klev |
---|
| 834 | i=klev+1-k |
---|
| 835 | |
---|
| 836 | ! Dérivée des traceurs: |
---|
| 837 | dqv____dt(:,i)=d_qx(:,k,ivap) ! Specific Humidity TENDENCY, ALL Contr. [kg/kg/s] |
---|
| 838 | dqw____dt(:,i)=d_qx(:,k,iliq) ! Cloud Droplets Concentration TENDENCY, ALL Contr. [kg/kg/s] |
---|
| 839 | dqi____dt(:,i)=d_qx(:,k,iice) ! Cloud Crystals Concentration TENDENCY, ALL Contr. [kg/kg/s] |
---|
| 840 | dCi____dt(:,i)=d_qx(:,k,icin) ! CIN Concentration TENDENCY, ALL Contr. [1/kg/s] |
---|
| 841 | dqs____dt(:,i)=d_qx(:,k,isnow) ! Snow Particles Concentration TENDENCY, ALL Contr. [kg/kg/s] |
---|
| 842 | dqr____dt(:,i)=d_qx(:,k,irain) ! Rain Drops Concentration TENDENCY, ALL Contr. [kg/kg/s] |
---|
| 843 | ! #cw dCw____dt ! CCN Concentration TENDENCY, ALL Contr. [1/kg/s] |
---|
| 844 | |
---|
| 845 | END DO |
---|
| 846 | |
---|
| 847 | !====================================================================== |
---|
| 848 | ! Test Aquaplanète: |
---|
| 849 | !====================================================================== |
---|
| 850 | |
---|
| 851 | ! CONTROL |
---|
| 852 | PRINT*, 'Calcul des SST en aquaplanète pour MAR comme dans le cas n°101 de LMDZ' ! (cf iniaqua de LMDZ) |
---|
| 853 | !IF (debut) THEN |
---|
| 854 | DO i=1,klon |
---|
| 855 | sst__HOST(i)=273.+27.*(1-sin(1.5*rlatd(i))**2) |
---|
| 856 | IF ((rlatd(i).GT.1.0471975).OR.(rlatd(i).LT.-1.0471975)) THEN |
---|
| 857 | sst__HOST(i)=273. |
---|
| 858 | ENDIF |
---|
| 859 | ENDDO |
---|
| 860 | !ENDIF |
---|
| 861 | |
---|
| 862 | !====================================================================== |
---|
| 863 | ! CONTROL |
---|
| 864 | !====================================================================== |
---|
| 865 | PRINT*, 'Control variables LMDZ entree de la physique' |
---|
| 866 | PRINT*,'MAXVAL(pplay(:,klev))=',MAXVAL(pplay(:,klev)) |
---|
| 867 | PRINT*,'MINVAL(pplay(:,klev))=',MINVAL(pplay(:,klev)) |
---|
| 868 | PRINT*,'MAXVAL(t(:,klev))=',MAXVAL(t(:,klev)) |
---|
| 869 | PRINT*,'MINVAL(t(:,klev))=',MINVAL(t(:,klev)) |
---|
| 870 | PRINT*,'MAXVAL(pplay(:,1))=',MAXVAL(pplay(:,1)) |
---|
| 871 | PRINT*,'MINVAL(pplay(:,1))=',MINVAL(pplay(:,1)) |
---|
| 872 | PRINT*,'MAXVAL(t(:,1))=',MAXVAL(t(:,1)) |
---|
| 873 | PRINT*,'MINVAL(t(:,1))=',MINVAL(t(:,1)) |
---|
| 874 | PRINT*,'MAXVAL(pplay)=',MAXVAL(pplay) |
---|
| 875 | PRINT*,'MINVAL(pplay)=',MINVAL(pplay) |
---|
| 876 | PRINT*,'MAXVAL(t)=',MAXVAL(t) |
---|
| 877 | PRINT*,'MINVAL(t)=',MINVAL(t) |
---|
| 878 | PRINT*,'MAXVAL(pphis)=',MAXVAL(pphis) |
---|
| 879 | PRINT*,'MINVAL(pphis)=',MINVAL(pphis) |
---|
| 880 | PRINT*,'kap=',kap |
---|
| 881 | PRINT*, 'CONTROL variables MAR entree de la physique' |
---|
| 882 | PRINT*,'MAXVAL(pkta_HOST)=',MAXVAL(pkta_HOST) |
---|
| 883 | PRINT*,'MAXVAL(psa__HOST)=',MAXVAL(psa__HOST) |
---|
| 884 | PRINT*,'MAXVAL(gZa__HOST)=',MAXVAL(gZa__HOST) |
---|
| 885 | PRINT*,'MAXVAL(gZam_HOST)=',MAXVAL(gZam_HOST) |
---|
| 886 | PRINT*,'MAXVAL(Ua___HOST)=',MAXVAL(Ua___HOST) |
---|
| 887 | PRINT*,'MAXVAL(Va___HOST)=',MAXVAL(Va___HOST) |
---|
| 888 | PRINT*,'MAXVAL(qv___HOST)=',MAXVAL(qv___HOST) |
---|
| 889 | PRINT*,'MINVAL(pkta_HOST)=',MINVAL(pkta_HOST) |
---|
| 890 | PRINT*,'MINVAL(psa__HOST)=',MINVAL(psa__HOST) |
---|
| 891 | PRINT*,'MINVAL(gZa__HOST)=',MINVAL(gZa__HOST) |
---|
| 892 | PRINT*,'MINVAL(gZam_HOST)=',MINVAL(gZam_HOST) |
---|
| 893 | PRINT*,'MINVAL(Ua___HOST)=',MINVAL(Ua___HOST) |
---|
| 894 | PRINT*,'MINVAL(Va___HOST)=',MINVAL(Va___HOST) |
---|
| 895 | PRINT*,'MINVAL(qv___HOST)=',MINVAL(qv___HOST) |
---|
| 896 | PRINT*,'Control iterations:' |
---|
| 897 | PRINT*,'it0RUN=',it0RUN |
---|
| 898 | PRINT*,'it0EXP=',it0EXP |
---|
| 899 | PRINT*,'it_RUN=',it_RUN |
---|
| 900 | PRINT*,'it_EXP=',it_EXP |
---|
| 901 | |
---|
| 902 | ! On choisi l'endroit où on fait les diagnostics de verification MAR (fichier ASCII): |
---|
| 903 | ! Pour la phase de débug, on cherche des Nan ! |
---|
| 904 | |
---|
| 905 | DO i=1,klon |
---|
| 906 | DO k=1,klev |
---|
| 907 | IF (isnan(Va___HOST(i,k))) THEN |
---|
| 908 | ikl0 = i |
---|
| 909 | PRINT*,'Attention : NaN at' |
---|
| 910 | PRINT*,'longitude=',rlond(i)*180/rpi |
---|
| 911 | PRINT*,'latitude=',rlatd(i)*180/rpi |
---|
| 912 | ENDIF |
---|
| 913 | ENDDO |
---|
| 914 | ENDDO |
---|
| 915 | |
---|
| 916 | !====================================================================== |
---|
| 917 | ! Appel de PHY_MAR |
---|
| 918 | !====================================================================== |
---|
| 919 | |
---|
| 920 | ! NB: Logiquement, il faut conserver cet appel tel quel, car Hubert Gallée s'engage à ne pas le changer lors des mises à jour ! |
---|
| 921 | |
---|
| 922 | ! CONTROL |
---|
| 923 | PRINT*, 'Appel de PHY MAR' |
---|
| 924 | !PRINT*, 'FlagSV =',FlagSV |
---|
| 925 | !PRINT*, 'FlagSV_Veg =',FlagSV_Veg |
---|
| 926 | !PRINT*, 'FlagSV_SNo =',FlagSV_SNo |
---|
| 927 | !PRINT*, 'FlagSV_BSn =',FlagSV_BSn |
---|
| 928 | !PRINT*, 'FlagSV_KzT =',FlagSV_KzT |
---|
| 929 | !PRINT*, 'FlagSV_SWD =',FlagSV_SWD |
---|
| 930 | !PRINT*, 'FlagSV_SBC =',FlagSV_SBC |
---|
| 931 | !PRINT*, 'FlagSV_UBC =',FlagSV_UBC |
---|
| 932 | !PRINT*, 'FlagAT =',FlagAT |
---|
| 933 | |
---|
| 934 | CALL PHY_MAR(FlagSV & ! FLAG for SISVAT: (T,F) = (active OR NOT) |
---|
| 935 | & ,FlagSV_Veg & ! FLAG for SISVAT: (T,F) = (Variable Vegetation OR NOT) |
---|
| 936 | & ,FlagSV_SNo & ! FLAG for SISVAT: (T,F) = (Snow Model active OR NOT) |
---|
| 937 | & ,FlagSV_BSn & ! FLAG for SISVAT: (T,F) = (Blowing Snow Model active OR NOT) |
---|
| 938 | & ,FlagSV_KzT & ! FLAG for SISVAT: (T,F) = (pkt Turb.Transfert active OR NOT in SISVAT) |
---|
| 939 | & ,FlagSV_SWD & ! FLAG for SISVAT: (T,F) = (Modify SW INPUT->downward OR NOT) |
---|
| 940 | & ,FlagSV_SBC & ! FLAG for SISVAT: (T,F) = (INPUT of Soil & Vege DATA OR NOT in SISVAT) |
---|
| 941 | & ,FlagSV_UBC & ! FLAG for SISVAT: (T,F) = (pkt UpperBC is Von Neuman OR NOT in SISVAT) |
---|
| 942 | & ,FlagAT & ! FLAG for Atm_AT: (T,F) = (Turbulent Transfer active OR NOT) |
---|
| 943 | & ,TypeAT & ! TYPE of Atm_AT: (e= Ee Duynkerke, K= Ee Kitada, L= EL, H= Ee Huan-R) |
---|
| 944 | & ,FlagAT_TKE & ! FLAG for genTKE: (T,F) = (TKE-e Model active OR NOT) |
---|
| 945 | & ,FlagCM & ! FLAG for CMiPhy: (T,F) = (Cloud Microphysics active OR NOT) |
---|
| 946 | & ,FlagCM_UpD & ! FLAG for CMiPhy: (T,F) = (qv & hydrometeors updated OR NOT IN CMiPhy) |
---|
| 947 | & ,FlagCP & ! FLAG for Convection Paramet. |
---|
| 948 | & ,FlagRT & ! FLAG for Radiative Transfer |
---|
| 949 | & ,FlagS0_SLO & ! FLAG for Insolation, Surfac.Slope Impact included NEW |
---|
| 950 | & ,FlagS0_MtM & ! FLAG for Insolation, Surfac.Slope & Mountain Mask Impacts included NEW |
---|
| 951 | & ,Flag_O & ! FLAG for OUTPUT |
---|
| 952 | & ,FlagVR & ! FLAG for OUTPUT for VERIFICATION |
---|
| 953 | & ,dt0DYn & ! Time STEP between 2 CALLs of PHY_MAR [s] I, fix |
---|
| 954 | & ,dt0_SV & ! Time STEP between 2 CALLs of SISVAT [s] I, fix |
---|
| 955 | & ,dt0_AT & ! Time STEP between 2 CALLs of Atm_AT [s] I, fix |
---|
| 956 | & ,dt0_CM & ! Time STEP between 2 CALLs of CMiPhy [s] I, fix |
---|
| 957 | & ,dt0_CP & ! Time STEP between 2 CALLs of CVamnh [s] I, fix |
---|
| 958 | & ,dt0_RT & ! Time STEP between 2 CALLs of radCEP [s] I, fix |
---|
| 959 | & ,dx & ! Grid Mesh size (Horizontal) [m] I, fix |
---|
| 960 | & ,DD_AxX & ! Grid x-Axis Direction [degree] I, fix |
---|
| 961 | & ,s_HOST & ! Grid (Vertical) of HOST (NORMALIZED PRESSURE assumed) [-] I, fix |
---|
| 962 | & ,sh___HOST & ! Topography [m] I, fix |
---|
| 963 | & ,sh_a_HOST & ! Topography Anomaly [m] I, fix NEW |
---|
| 964 | & ,slopxHOST & ! Slope, x-direction [-] I, fix NEW |
---|
| 965 | & ,slopyHOST & ! Slope, y-direction [-] I, fix NEW |
---|
| 966 | & ,slopeHOST & ! Slope [-] I, fix NEW |
---|
| 967 | & ,MMaskHOST & ! Mountain Mask [-] I, fix NEW |
---|
| 968 | & ,lonh_HOST & ! Longitude [hour] I, fix |
---|
| 969 | & ,latr_HOST & ! Latitude [radian] I, fix |
---|
| 970 | & ,pkta_HOST & ! Reduced Potential Temperature [XK] I, O |
---|
| 971 | & ,ptop_HOST & ! Pressure, Model Top [kPa] I, fix |
---|
| 972 | & ,psa__HOST & ! Pressure Thickness [kPa] I |
---|
| 973 | & ,gZa__HOST & ! Geopotential Height [m2/s2] I |
---|
| 974 | & ,gZam_HOST & ! Geopotential Height, mid-level [m2/s2] I |
---|
| 975 | & ,Ua___HOST & ! Wind , x-Direction [m/s] I |
---|
| 976 | & ,Va___HOST & ! Wind , y-Direction [m/s] I |
---|
| 977 | & ,Wa___HOST & ! Wind , z-Direction [m/s] I |
---|
| 978 | & ,qv___HOST & ! Specific Humidity [kg/kg] I, O |
---|
| 979 | & ,qw___HOST & ! Cloud Droplets Concentration [kg/kg] I, O |
---|
| 980 | ! #cw& ,CCN__HOST & ! CCN Concentration [-/kg] |
---|
| 981 | & ,qi___HOST & ! Cloud Crystals Concentration [kg/kg] I, O |
---|
| 982 | & ,CIN__HOST & ! CIN Concentration [-/kg] I, O |
---|
| 983 | & ,CF___HOST & ! Cloud Fraction [-] I, O |
---|
| 984 | & ,qs___HOST & ! Snow Particles Concentration [kg/kg] I, O |
---|
| 985 | & ,qr___HOST & ! Rain Drops Concentration [kg/kg] I, O |
---|
| 986 | & ,TKE__HOST & ! Turbulent Kinetic Energy [m2/s2] I, O |
---|
| 987 | & ,eps__HOST & ! Turbulent Kinetic Energy Dissipation [m2/s3] I, O |
---|
| 988 | & ,dpkt___dt & ! Reduced Potential Temperature TENDENCY, ALL Contribut.[KX/s] O |
---|
| 989 | & ,dua____dt & ! Wind Speed (x-direc.) TENDENCY, ALL Contribut.[m/s2] O |
---|
| 990 | & ,dva____dt & ! Wind Speed (y-direc.) TENDENCY, ALL Contribut.[m/s2] O |
---|
| 991 | & ,dqv____dt & ! Specific Humidity TENDENCY, ALL Contr. [kg/kg/s] O |
---|
| 992 | & ,dqw____dt & ! Cloud Droplets Concentration TENDENCY, ALL Contr. [kg/kg/s] O |
---|
| 993 | ! #cw& ,dCw____dt & ! CCN Concentration TENDENCY, ALL Contr. [1/s] |
---|
| 994 | & ,dqi____dt & ! Cloud Crystals Concentration TENDENCY, ALL Contr. [kg/kg/s] O |
---|
| 995 | & ,dCi____dt & ! CIN Concentration TENDENCY, ALL Contr. [1/s] O |
---|
| 996 | & ,dCF____dt & ! Cloud Fraction TENDENCY, ALL Contr. [1/s] O |
---|
| 997 | & ,dqs____dt & ! Snow Particles Concentration TENDENCY, ALL Contr. [kg/kg/s] O |
---|
| 998 | & ,dqr____dt & ! Rain Drops Concentration TENDENCY, ALL Contr. [kg/kg/s] O |
---|
| 999 | ! #dT& ,dpktSV_dt & ! Reduced Potential Temperature TENDENCY, SISVAT [KX/s] (O) |
---|
| 1000 | ! #dT& ,dpktAT_dt & ! Reduced Potential Temperature TENDENCY, Atm_AT [KX/s] (O) |
---|
| 1001 | ! #dT& ,dqv_AT_dt & ! Specific Humidity TENDENCY, Atm_AT [kg/kg/s] (O) |
---|
| 1002 | ! #dT& ,dqw_AT_dt & ! Cloud Droplets Concentration TENDENCY, Atm_AT [kg/kg/s] (O) |
---|
| 1003 | ! #dT& ,dqi_AT_dt & ! Cloud Crystals Concentration TENDENCY, Atm_AT [kg/kg/s] (O) |
---|
| 1004 | ! #dT& ,dqs_AT_dt & ! Snow Particles Concentration TENDENCY, Atm_AT [kg/kg/s] (O) |
---|
| 1005 | ! #dT& ,dqr_AT_dt & ! Rain Drops Concentration TENDENCY, Atm_AT [kg/kg/s] (O) |
---|
| 1006 | ! #cw& ,dCw_AT_dt & ! CCN Concentration TENDENCY, Atm_AT [1/s] (O) |
---|
| 1007 | ! #dT& ,dCi_AT_dt & ! CIN Concentration TENDENCY, Atm_AT [1/s] (O) |
---|
| 1008 | ! #dT& ,dpktCM_dt & ! Reduced Potential Temperature TENDENCY, CMiPhy [KX/s] (O) |
---|
| 1009 | ! #dT& ,dqv_CM_dt & ! Specific Humidity TENDENCY, CMiPhy [kg/kg/s] (O) |
---|
| 1010 | ! #dT& ,dqw_CM_dt & ! Cloud Droplets Concentration TENDENCY, CMiPhy [kg/kg/s] (O) |
---|
| 1011 | ! #dT& ,dCF_CM_dt & ! Cloud Fraction TENDENCY, CMiPhy [1/s] (O) |
---|
| 1012 | ! #dT& ,dqi_CM_dt & ! Cloud Crystals Concentration TENDENCY, CMiPhy [kg/kg/s] (O) |
---|
| 1013 | ! #dT& ,dqs_CM_dt & ! Snow Particles Concentration TENDENCY, CMiPhy [kg/kg/s] (O) |
---|
| 1014 | ! #dT& ,dqr_CM_dt & ! Rain Drops Concentration TENDENCY, CMiPhy [kg/kg/s] (O) |
---|
| 1015 | ! #cw& ,dCw_CM_dt & ! CCN Concentration TENDENCY, CMiPhy [1/s] (O) |
---|
| 1016 | ! #dT& ,dCi_CM_dt & ! CIN Concentration TENDENCY, CMiPhy [1/s] (O) |
---|
| 1017 | ! #dT& ,dpktCP_dt & ! Reduced Potential Temperature TENDENCY, CVAmnh [KX/s] (O) |
---|
| 1018 | ! #dT& ,dqv_CP_dt & ! Specific Humidity TENDENCY, CVAmnh [kg/kg/s] (O) |
---|
| 1019 | ! #dT& ,dqw_CP_dt & ! Cloud Droplets Concentration TENDENCY, CVAmnh [kg/kg/s] (O) |
---|
| 1020 | ! #dT& ,dqi_CP_dt & ! Cloud Crystals Concentration TENDENCY, CVAmnh [kg/kg/s] (O) |
---|
| 1021 | ! #dT& ,dpktRT_dt & ! Reduced Potential Temperature TENDENCY, radCEP [KX/s] (O) |
---|
| 1022 | & ,sst__HOST & ! Ocean FORCING (SST) [K] I |
---|
| 1023 | ! #IP& ,sif__HOST & ! Ocean FORCING (Sea-Ice Fraction ) [-] I |
---|
| 1024 | ! #AO& ,s_T__HOST & ! Ocean COUPLING (Surface Temperat.) n=1: Open Ocean [-] I,NEMO |
---|
| 1025 | ! #AO& ,Alb__HOST & ! Ocean COUPLING (Surface Albedo ) n=2: Sea Ice [-] I,NEMO |
---|
| 1026 | ! #AO& ,dSdT2HOST & ! Ocean COUPLING ( d(SH Flux) / dT ) [W/m2/K] O |
---|
| 1027 | ! #AO& ,dLdT2HOST & ! Ocean COUPLING ( d(LH Flux) / dT ) [W/m2/K] O |
---|
| 1028 | !dead& ,it0EXP,it0RUN & ! Iteration |
---|
| 1029 | & ,Year_H,Mon__H,Day__H,Hour_H,minu_H,sec__H & ! Time |
---|
| 1030 | & ,ixq1 ,i0x0 ,mxqq & ! Domain Dimension: x |
---|
| 1031 | & ,jyq1 ,j0y0 ,myqq & ! Domain Dimension: y |
---|
| 1032 | & ,klev ,klevp1 & ! Domain Dimension: z |
---|
| 1033 | & ,mwq & ! Domain Dimension: mosaic |
---|
| 1034 | & ,klon & ! Domain Dimension: x * y NEW |
---|
| 1035 | & ,kcolw & ! Domain Dimension: x * y * mosaic NEW |
---|
| 1036 | & ,m_azim & ! Mountain Mask, nb of directions taken into account [-] NEW |
---|
| 1037 | & ,IOi0SV,IOj0SV,n0pt) ! Indices of OUTPUT Grid Point |
---|
| 1038 | ! ******* |
---|
| 1039 | |
---|
| 1040 | !====================================================================== |
---|
| 1041 | ! On renvoie les variables nécessaires à la dynamique de LMDZ: |
---|
| 1042 | !====================================================================== |
---|
| 1043 | |
---|
| 1044 | PRINT*, 'On est sorti de PHY_MAR, on peut actualiser les variables pour LMDZ' |
---|
| 1045 | |
---|
| 1046 | d_ps(:)=0.0 ! d_ps----output-R-tendance physique de la pression au sol ! égal à zéro sur la terre (car on néglige la perte de poid de la colonne lorsqu'il pleut). |
---|
| 1047 | |
---|
| 1048 | DO k = 1, klev |
---|
| 1049 | i=klev+1-k |
---|
| 1050 | |
---|
| 1051 | d_u(:,k)=dua____dt(:,i) ! d_u-----output-R-tendance physique de "u" (m/s/s) |
---|
| 1052 | d_v(:,k)=dva____dt(:,i) ! d_v-----output-R-tendance physique de "v" (m/s/s) |
---|
| 1053 | d_t(:,k)=dpkt___dt(:,i)*(pplay(:,k)/1000) ** kap !d_t(:,:)= ! d_t-----output-R-tendance physique de "t" (K/s). Note: la pression ne change pas au cours de la physique. |
---|
| 1054 | ! d_qx----output-R-tendance physique de "qx" (kg/kg/s): |
---|
| 1055 | d_qx(:,k,ivap)=dqv____dt(:,i) ! Specific Humidity TENDENCY, ALL Contr. [kg/kg/s] |
---|
| 1056 | d_qx(:,k,iliq)=dqw____dt(:,i) ! Cloud Droplets Concentration TENDENCY, ALL Contr. [kg/kg/s] |
---|
| 1057 | d_qx(:,k,iice)=dqi____dt(:,i) ! Cloud Crystals Concentration TENDENCY, ALL Contr. [kg/kg/s] |
---|
| 1058 | d_qx(:,k,icin)=dCi____dt(:,i) ! CIN Concentration TENDENCY, ALL Contr. [1/kg/s] |
---|
| 1059 | d_qx(:,k,isnow)=dqs____dt(:,i) ! Snow Particles Concentration TENDENCY, ALL Contr. [kg/kg/s] |
---|
| 1060 | d_qx(:,k,irain)=dqr____dt(:,i) ! Rain Drops Concentration TENDENCY, ALL Contr. [kg/kg/s] |
---|
| 1061 | ! #cw dCw____dt ! CCN Concentration TENDENCY, ALL Contr. [1/kg/s] |
---|
| 1062 | cldfra(:,k)=CF___HOST(:,i) ! cloud fraction |
---|
| 1063 | |
---|
| 1064 | END DO |
---|
| 1065 | |
---|
| 1066 | ! Heat flux at surface (diagnostic) |
---|
| 1067 | HsenSV_gpt(:) = -uts_SV_gpt(:) *1.e-3 *1005. ! sensible heat flx in W/m2 |
---|
| 1068 | HLatSV_gpt(:) = -uqs_SV_gpt(:) *1.e-3 *2.5e6 ! latent heat flx in W/m2 |
---|
| 1069 | |
---|
| 1070 | ! Question à Hubert : tendences de TKE non nécessaires ? Réponse: la TKE est mise à jour dans la physique, on n'a pas besoin de transporter la dérivée de TKE dans la dynamique. |
---|
| 1071 | |
---|
| 1072 | ! On désalloue les tableaux: |
---|
| 1073 | DEALLOCATE(MMaskHOST) ! Est-ce qu'il faut le faire ? |
---|
| 1074 | |
---|
| 1075 | PRINT*, 'Control des tendances aprés la physique de MAR' |
---|
| 1076 | |
---|
| 1077 | PRINT*, 'maxval(d_u)=',maxval(d_u) |
---|
| 1078 | PRINT*, 'maxval(d_v)=',maxval(d_v) |
---|
| 1079 | PRINT*, 'maxval(d_t)=',maxval(d_t) |
---|
| 1080 | PRINT*, 'maxval(paprs(:,1))=',maxval(paprs(:,1)) |
---|
| 1081 | PRINT*, 'minval(d_u)=',minval(d_u) |
---|
| 1082 | PRINT*, 'minval(d_v)=',minval(d_v) |
---|
| 1083 | PRINT*, 'minval(d_t)=',minval(d_t) |
---|
| 1084 | PRINT*, 'minval(paprs(:,1))=',minval(paprs(:,1)) |
---|
| 1085 | PRINT*,'Test snowCM' |
---|
| 1086 | PRINT*,'MAXVAL(snowCM)=',MAXVAL(snowCM) |
---|
| 1087 | PRINT*,'MAXVAL(rainCM)=',MAXVAL(rainCM) |
---|
| 1088 | PRINT*,'maxval(cldfra)=',maxval(cldfra) |
---|
| 1089 | PRINT*,'minval(cldfra)=',minval(cldfra) |
---|
| 1090 | |
---|
| 1091 | !====================================================================== |
---|
| 1092 | ! Ecriture des sorties netcdf |
---|
| 1093 | !====================================================================== |
---|
| 1094 | |
---|
| 1095 | PRINT*, 'On ecrit les variables dans un fichier netcdf instantané' |
---|
| 1096 | ! write some outputs: |
---|
| 1097 | if (debut) then ! On imprime les variables de sortie intemporelles seulement au début |
---|
| 1098 | !call iophys_ini |
---|
| 1099 | call histwrite_phy(nid_hist,.false.,"lonh",itau,lonh_HOST) |
---|
| 1100 | call histwrite_phy(nid_hist,.false.,"latr",itau,latr_HOST) |
---|
| 1101 | call histwrite_phy(nid_hist,.false.,"sst",itau,sst__HOST) |
---|
| 1102 | endif |
---|
| 1103 | if (modulo(itau,iwrite_phys)==0) then |
---|
| 1104 | call histwrite_phy(nid_hist,.false.,"temperature",itau,t) |
---|
| 1105 | call histwrite_phy(nid_hist,.false.,"pplay",itau,pplay) |
---|
| 1106 | call histwrite_phy(nid_hist,.false.,"ps",itau,paprs(:,1)) |
---|
| 1107 | call histwrite_phy(nid_hist,.false.,"qx_vap",itau,qx(:,:,ivap)) |
---|
| 1108 | call histwrite_phy(nid_hist,.false.,"qx_liq",itau,qx(:,:,iliq)) |
---|
| 1109 | call histwrite_phy(nid_hist,.false.,"qx_ice",itau,qx(:,:,iice)) |
---|
| 1110 | call histwrite_phy(nid_hist,.false.,"u",itau,u) |
---|
| 1111 | call histwrite_phy(nid_hist,.false.,"v",itau,v) |
---|
| 1112 | call histwrite_phy(nid_hist,.false.,"d_t",itau,d_t) |
---|
| 1113 | call histwrite_phy(nid_hist,.false.,"d_u",itau,d_u) |
---|
| 1114 | call histwrite_phy(nid_hist,.false.,"d_v",itau,d_v) |
---|
| 1115 | call histwrite_phy(nid_hist,.false.,"snow",itau,SnowCM) |
---|
| 1116 | call histwrite_phy(nid_hist,.false.,"rain",itau,RainCM) |
---|
| 1117 | call histwrite_phy(nid_hist,.false.,"snowCP",itau,snowCP) |
---|
| 1118 | call histwrite_phy(nid_hist,.false.,"rainCP",itau,rainCP) |
---|
| 1119 | call histwrite_phy(nid_hist,.false.,"nebulosity",itau,cldfra) |
---|
| 1120 | endif |
---|
| 1121 | |
---|
| 1122 | !XIOS |
---|
| 1123 | #ifdef CPP_XIOS |
---|
| 1124 | !$OMP MASTER |
---|
| 1125 | !On incrémente le pas de temps XIOS |
---|
| 1126 | !CALL wxios_update_calendar(itau) |
---|
| 1127 | |
---|
| 1128 | !Et on écrit, avec la routine histwrite dédiée: |
---|
| 1129 | !CALL histwrite_phy("temperature",t) |
---|
| 1130 | !CALL histwrite_phy("u",u) |
---|
| 1131 | !CALL histwrite_phy("v",v) |
---|
| 1132 | !CALL histwrite_phy("ps",paprs(:,1)) |
---|
| 1133 | !$OMP END MASTER |
---|
| 1134 | #endif |
---|
| 1135 | ! |
---|
| 1136 | ! On synchronise la fin de l'écriture du fichier à chaque pas de temps pour que le fichier soit OK même si le code plante... |
---|
| 1137 | CALL histsync(nid_hist) |
---|
| 1138 | |
---|
| 1139 | PRINT*, 'Fin de physiq.f90' |
---|
| 1140 | |
---|
| 1141 | return |
---|
| 1142 | end |
---|
| 1143 | |
---|
| 1144 | ! sub-routine inutilisée : |
---|
| 1145 | |
---|
| 1146 | !SUBROUTINE gr_fi_ecrit(nfield,nlon,iim,jjmp1,fi,ecrit) |
---|
| 1147 | ! IMPLICIT none |
---|
| 1148 | ! |
---|
| 1149 | ! Tranformer une variable de la grille physique a |
---|
| 1150 | ! la grille d'ecriture |
---|
| 1151 | ! INTEGER nfield,nlon,iim,jjmp1, jjm |
---|
| 1152 | ! REAL fi(nlon,nfield), ecrit(iim*jjmp1,nfield) |
---|
| 1153 | ! INTEGER i, n, ig |
---|
| 1154 | ! jjm = jjmp1 - 1 |
---|
| 1155 | ! DO n = 1, nfield |
---|
| 1156 | ! DO i=1,iim |
---|
| 1157 | ! ecrit(i,n) = fi(1,n) |
---|
| 1158 | !, ecrit(i+jjm*iim,n) = fi(nlon,n) |
---|
| 1159 | ! ENDDO |
---|
| 1160 | ! DO ig = 1, nlon - 2 |
---|
| 1161 | ! ecrit(iim+ig,n) = fi(1+ig,n) |
---|
| 1162 | ! ENDDO |
---|
| 1163 | ! ENDDO |
---|
| 1164 | !RETURN |
---|
| 1165 | !END |
---|