- Timestamp:
- Jul 29, 2024, 5:47:53 PM (3 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/phylmd/coef_diff_turb_mod.F90
r5139 r5143 1 2 1 MODULE coef_diff_turb_mod 3 2 4 ! This module contains some procedures for calculation of the coefficients of the5 ! turbulent diffusion in the atmosphere and coefficients for turbulent diffusion 6 ! at surface(cdrag)3 ! This module contains some procedures for calculation of the coefficients of the 4 ! turbulent diffusion in the atmosphere and coefficients for turbulent diffusion 5 ! at surface(cdrag) 7 6 8 7 IMPLICIT NONE 9 8 10 9 CONTAINS 11 10 12 !****************************************************************************************11 !**************************************************************************************** 13 12 14 13 SUBROUTINE coef_diff_turb(dtime, nsrf, knon, ni, & 15 ypaprs, ypplay, yu, yv, yq, yt, yts, yqsurf, ycdragm, &16 ycoefm, ycoefh ,yq2, yeps, ydrgpro)17 14 ypaprs, ypplay, yu, yv, yq, yt, yts, yqsurf, ycdragm, & 15 ycoefm, ycoefh, yq2, yeps, ydrgpro) 16 18 17 USE dimphy 19 18 USE indice_sol_mod … … 21 20 USE lmdz_clesphys 22 21 USE lmdz_compbl, ONLY: iflag_pbl, iflag_pbl_split, iflag_order2_sollw, ifl_pbltree 23 24 ! Calculate coefficients(ycoefm, ycoefh) for turbulent diffusion in the 25 ! atmosphere 26 ! NB! No values are calculated between surface and the first model layer. 27 ! ycoefm(:,1) and ycoefh(:,1) are not valid !!! 28 29 30 ! Input arguments 31 !**************************************************************************************** 32 REAL, INTENT(IN) :: dtime33 INTEGER, INTENT(IN) :: nsrf, knon34 INTEGER, DIMENSION(klon), INTENT(IN) :: ni35 REAL, DIMENSION(klon,klev+1), INTENT(IN) :: ypaprs36 REAL, DIMENSION(klon, klev), INTENT(IN) :: ypplay37 REAL, DIMENSION(klon, klev), INTENT(IN) :: yu, yv38 REAL, DIMENSION(klon, klev), INTENT(IN) :: yq, yt39 REAL, DIMENSION(klon ), INTENT(IN) :: yts, yqsurf40 REAL, DIMENSION(klon), INTENT(IN) :: ycdragm41 !FC 42 REAL, DIMENSION(klon,klev), INTENT(IN) :: ydrgpro43 44 45 ! InOutput arguments 46 !**************************************************************************************** 47 REAL, DIMENSION(klon,klev+1), INTENT(INOUT):: yq248 49 ! Output arguments 50 !**************************************************************************************** 51 REAL, DIMENSION(klon,klev+1), INTENT(OUT) :: yeps52 REAL, DIMENSION(klon, klev), INTENT(OUT) :: ycoefh53 REAL, DIMENSION(klon, klev), INTENT(OUT) :: ycoefm54 55 ! Other local variables 56 !**************************************************************************************** 57 INTEGER :: k, i, j58 REAL, DIMENSION(klon,klev) :: ycoefm0, ycoefh0, yzlay, yteta59 REAL, DIMENSION(klon, klev+1) :: yzlev, q2diag, ykmm, ykmn, ykmq60 REAL, DIMENSION(klon ) :: yustar61 62 ! Include 63 !**************************************************************************************** 64 INCLUDE "YOETHF.h"22 USE lmdz_YOETHF 23 24 ! Calculate coefficients(ycoefm, ycoefh) for turbulent diffusion in the 25 ! atmosphere 26 ! NB! No values are calculated between surface and the first model layer. 27 ! ycoefm(:,1) and ycoefh(:,1) are not valid !!! 28 29 30 ! Input arguments 31 !**************************************************************************************** 32 REAL, INTENT(IN) :: dtime 33 INTEGER, INTENT(IN) :: nsrf, knon 34 INTEGER, DIMENSION(klon), INTENT(IN) :: ni 35 REAL, DIMENSION(klon, klev + 1), INTENT(IN) :: ypaprs 36 REAL, DIMENSION(klon, klev), INTENT(IN) :: ypplay 37 REAL, DIMENSION(klon, klev), INTENT(IN) :: yu, yv 38 REAL, DIMENSION(klon, klev), INTENT(IN) :: yq, yt 39 REAL, DIMENSION(klon), INTENT(IN) :: yts, yqsurf 40 REAL, DIMENSION(klon), INTENT(IN) :: ycdragm 41 !FC 42 REAL, DIMENSION(klon, klev), INTENT(IN) :: ydrgpro 43 44 45 ! InOutput arguments 46 !**************************************************************************************** 47 REAL, DIMENSION(klon, klev + 1), INTENT(INOUT) :: yq2 48 49 ! Output arguments 50 !**************************************************************************************** 51 REAL, DIMENSION(klon, klev + 1), INTENT(OUT) :: yeps 52 REAL, DIMENSION(klon, klev), INTENT(OUT) :: ycoefh 53 REAL, DIMENSION(klon, klev), INTENT(OUT) :: ycoefm 54 55 ! Other local variables 56 !**************************************************************************************** 57 INTEGER :: k, i, j 58 REAL, DIMENSION(klon, klev) :: ycoefm0, ycoefh0, yzlay, yteta 59 REAL, DIMENSION(klon, klev + 1) :: yzlev, q2diag, ykmm, ykmn, ykmq 60 REAL, DIMENSION(klon) :: yustar 61 62 ! Include 63 !**************************************************************************************** 65 64 INCLUDE "YOMCST.h" 66 67 65 68 66 ykmm = 0 !ym missing init 69 67 ykmn = 0 !ym missing init 70 68 ykmq = 0 !ym missing init 71 72 yeps(:, :) = 0.73 74 !**************************************************************************************** 75 ! Calcul de coefficients de diffusion turbulent de l'atmosphere : 76 ! ycoefm(:,2:klev), ycoefh(:,2:klev) 77 78 !**************************************************************************************** 69 70 yeps(:, :) = 0. 71 72 !**************************************************************************************** 73 ! Calcul de coefficients de diffusion turbulent de l'atmosphere : 74 ! ycoefm(:,2:klev), ycoefh(:,2:klev) 75 76 !**************************************************************************************** 79 77 80 78 CALL coefkz(nsrf, knon, ypaprs, ypplay, & 81 ksta, ksta_ter, &82 yts, yu, yv, yt, yq, &83 yqsurf, &84 ycoefm, ycoefh)85 86 !****************************************************************************************87 ! Eventuelle recalcule des coeffeicients de diffusion turbulent de l'atmosphere : 88 ! ycoefm(:,2:klev), ycoefh(:,2:klev) 89 90 !****************************************************************************************79 ksta, ksta_ter, & 80 yts, yu, yv, yt, yq, & 81 yqsurf, & 82 ycoefm, ycoefh) 83 84 !**************************************************************************************** 85 ! Eventuelle recalcule des coeffeicients de diffusion turbulent de l'atmosphere : 86 ! ycoefm(:,2:klev), ycoefh(:,2:klev) 87 88 !**************************************************************************************** 91 89 92 90 IF (iflag_pbl==1) THEN 93 94 ycoefm0, ycoefh0)95 96 97 98 ycoefm(i,k) = MAX(ycoefm(i,k),ycoefm0(i,k))99 ycoefh(i,k) = MAX(ycoefh(i,k),ycoefh0(i,k))100 101 91 CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, & 92 ycoefm0, ycoefh0) 93 94 DO k = 2, klev 95 DO i = 1, knon 96 ycoefm(i, k) = MAX(ycoefm(i, k), ycoefm0(i, k)) 97 ycoefh(i, k) = MAX(ycoefh(i, k), ycoefh0(i, k)) 98 ENDDO 99 ENDDO 102 100 ENDIF 103 101 104 105 !**************************************************************************************** 106 ! Calcul d'une diffusion minimale pour les conditions tres stables107 108 !****************************************************************************************102 103 !**************************************************************************************** 104 ! Calcul d'une diffusion minimale pour les conditions tres stables 105 106 !**************************************************************************************** 109 107 IF (ok_kzmin) THEN 110 CALL coefkzmin(knon,ypaprs,ypplay,yu,yv,yt,yq,ycdragm, &111 ycoefm0,ycoefh0)112 113 114 115 ycoefm(i,k) = MAX(ycoefm(i,k),ycoefm0(i,k))116 ycoefh(i,k) = MAX(ycoefh(i,k),ycoefh0(i,k))117 118 119 108 CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycdragm, & 109 ycoefm0, ycoefh0) 110 111 DO k = 2, klev 112 DO i = 1, knon 113 ycoefm(i, k) = MAX(ycoefm(i, k), ycoefm0(i, k)) 114 ycoefh(i, k) = MAX(ycoefh(i, k), ycoefh0(i, k)) 115 ENDDO 116 ENDDO 117 120 118 ENDIF 121 119 122 123 !****************************************************************************************124 ! MELLOR ET YAMADA adapte a Mars Richard Fournier et Frederic Hourdin125 126 !****************************************************************************************120 121 !**************************************************************************************** 122 ! MELLOR ET YAMADA adapte a Mars Richard Fournier et Frederic Hourdin 123 124 !**************************************************************************************** 127 125 128 126 IF (iflag_pbl>=3) THEN 129 127 130 yzlay(1:knon,1)= &131 RD*yt(1:knon,1)/(0.5*(ypaprs(1:knon,1)+ypplay(1:knon,1))) &132 *(ypaprs(1:knon,1)-ypplay(1:knon,1))/RG133 DO k=2,klev134 135 yzlay(i,k)= &136 yzlay(i, k-1)+RD*0.5*(yt(i,k-1)+yt(i,k)) &137 /ypaprs(i,k)*(ypplay(i,k-1)-ypplay(i,k))/RG138 139 140 141 DO k=1,klev142 143 yteta(i,k)= &144 yt(i, k)*(ypaprs(i,1)/ypplay(i,k))**RKAPPA &145 *(1.+0.61*yq(i,k))146 147 148 149 yzlev(1:knon,1)=0.150 yzlev(1:knon,klev+1)=2.*yzlay(1:knon,klev)-yzlay(1:knon,klev-1)151 DO k=2,klev152 153 yzlev(i,k)=0.5*(yzlay(i,k)+yzlay(i,k-1))154 155 156 157 !!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!158 !!$! Pour memoire, le papier Hourdin et al. 2002 a ete obtenur avec un159 !!$! bug sur les coefficients de surface :160 !!$! ycdragh(1:knon) = ycoefm(1:knon,1)161 !!$! ycdragm(1:knon) = ycoefh(1:knon,1)162 !!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!163 164 165 166 167 IF ( klon>1 .OR. (klon==1 .AND. knon==1)) THEN168 CALL ustarhb(knon,klev,knon,yu,yv,ycdragm, yustar)169 170 171 172 WRITE(lunout,*) 'USTAR = ',(yustar(i),i=1,knon)173 174 175 ! iflag_pbl peut etre utilise comme longuer de melange176 177 IF ( klon>1 .OR. (klon==1 .AND. knon==1)) THEN178 CALL vdif_kcay(knon, klev,knon,dtime,RG,RD,ypaprs,yt, &179 yzlev,yzlay,yu,yv,yteta, &180 ycdragm,yq2,q2diag,ykmm,ykmn,yustar, &181 iflag_pbl)182 183 184 CALL yamada4(ni,nsrf,knon,dtime,RG,RD,ypaprs,yt, &185 yzlev,yzlay,yu,yv,yteta, &186 ycdragm,yq2,yeps,ykmm,ykmn,ykmq,yustar, &187 iflag_pbl,ydrgpro)188 !FC189 190 191 ycoefm(1:knon,2:klev)=ykmm(1:knon,2:klev)192 ycoefh(1:knon,2:klev)=ykmn(1:knon,2:klev)193 128 yzlay(1:knon, 1) = & 129 RD * yt(1:knon, 1) / (0.5 * (ypaprs(1:knon, 1) + ypplay(1:knon, 1))) & 130 * (ypaprs(1:knon, 1) - ypplay(1:knon, 1)) / RG 131 DO k = 2, klev 132 DO i = 1, knon 133 yzlay(i, k) = & 134 yzlay(i, k - 1) + RD * 0.5 * (yt(i, k - 1) + yt(i, k)) & 135 / ypaprs(i, k) * (ypplay(i, k - 1) - ypplay(i, k)) / RG 136 END DO 137 END DO 138 139 DO k = 1, klev 140 DO i = 1, knon 141 yteta(i, k) = & 142 yt(i, k) * (ypaprs(i, 1) / ypplay(i, k))**RKAPPA & 143 * (1. + 0.61 * yq(i, k)) 144 END DO 145 END DO 146 147 yzlev(1:knon, 1) = 0. 148 yzlev(1:knon, klev + 1) = 2. * yzlay(1:knon, klev) - yzlay(1:knon, klev - 1) 149 DO k = 2, klev 150 DO i = 1, knon 151 yzlev(i, k) = 0.5 * (yzlay(i, k) + yzlay(i, k - 1)) 152 END DO 153 END DO 154 155 !!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 156 !!$! Pour memoire, le papier Hourdin et al. 2002 a ete obtenur avec un 157 !!$! bug sur les coefficients de surface : 158 !!$! ycdragh(1:knon) = ycoefm(1:knon,1) 159 !!$! ycdragm(1:knon) = ycoefh(1:knon,1) 160 !!$!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 161 162 ! Normalement, on peut passer dans les codes avec knon=0 163 ! Mais ca fait planter le replay. 164 ! En attendant une réécriture, on a joute des if (Fredho) 165 IF (klon>1 .OR. (klon==1 .AND. knon==1)) THEN 166 CALL ustarhb(knon, klev, knon, yu, yv, ycdragm, yustar) 167 endif 168 169 IF (prt_level > 9) THEN 170 WRITE(lunout, *) 'USTAR = ', (yustar(i), i = 1, knon) 171 ENDIF 172 173 ! iflag_pbl peut etre utilise comme longuer de melange 174 IF (iflag_pbl>=31) THEN 175 IF (klon>1 .OR. (klon==1 .AND. knon==1)) THEN 176 CALL vdif_kcay(knon, klev, knon, dtime, RG, RD, ypaprs, yt, & 177 yzlev, yzlay, yu, yv, yteta, & 178 ycdragm, yq2, q2diag, ykmm, ykmn, yustar, & 179 iflag_pbl) 180 endif 181 ELSE IF (iflag_pbl<20) THEN 182 CALL yamada4(ni, nsrf, knon, dtime, RG, RD, ypaprs, yt, & 183 yzlev, yzlay, yu, yv, yteta, & 184 ycdragm, yq2, yeps, ykmm, ykmn, ykmq, yustar, & 185 iflag_pbl, ydrgpro) 186 !FC 187 ENDIF 188 189 ycoefm(1:knon, 2:klev) = ykmm(1:knon, 2:klev) 190 ycoefh(1:knon, 2:klev) = ykmn(1:knon, 2:klev) 191 194 192 ELSE 195 196 yq2=0.193 ! No TKE for Standard Physics 194 yq2 = 0. 197 195 ENDIF !(iflag_pbl.ge.3) 198 196 199 197 END SUBROUTINE coef_diff_turb 200 198 201 !****************************************************************************************199 !**************************************************************************************** 202 200 203 201 SUBROUTINE coefkz(nsrf, knon, paprs, pplay, & 204 ksta, ksta_ter, &205 ts, &206 u,v,t,q, &207 qsurf, &208 pcfm, pcfh)209 202 ksta, ksta_ter, & 203 ts, & 204 u, v, t, q, & 205 qsurf, & 206 pcfm, pcfh) 207 210 208 USE dimphy 211 209 USE indice_sol_mod 212 210 USE lmdz_print_control, ONLY: prt_level, lunout 213 211 USE lmdz_compbl, ONLY: iflag_pbl, iflag_pbl_split, iflag_order2_sollw, ifl_pbltree 214 215 !====================================================================== 216 ! Auteur(s) F. Hourdin, M. Forichon, Z.X. Li (LMD/CNRS) date: 19930922 217 ! (une version strictement identique a l'ancien modele) 218 ! Objet: calculer le coefficient du frottement du sol (Cdrag) et les 219 ! coefficients d'echange turbulent dans l'atmosphere. 220 ! Arguments: 221 ! nsrf-----input-I- indicateur de la nature du sol 222 ! knon-----input-I- nombre de points a traiter 223 ! paprs----input-R- pregssion a chaque intercouche (en Pa) 224 ! pplay----input-R- pression au milieu de chaque couche (en Pa) 225 ! ts-------input-R- temperature du sol (en Kelvin) 226 ! u--------input-R- vitesse u 227 ! v--------input-R- vitesse v 228 ! t--------input-R- temperature (K) 229 ! q--------input-R- vapeur d'eau (kg/kg) 230 231 ! pcfm-----output-R- coefficients a calculer (vitesse) 232 ! pcfh-----output-R- coefficients a calculer (chaleur et humidite) 233 !====================================================================== 234 INCLUDE "YOETHF.h" 212 USE lmdz_YOETHF 213 USE lmdz_fcttre, ONLY: foeew, foede, qsats, qsatl, dqsats, dqsatl, thermcep 214 215 !====================================================================== 216 ! Auteur(s) F. Hourdin, M. Forichon, Z.X. Li (LMD/CNRS) date: 19930922 217 ! (une version strictement identique a l'ancien modele) 218 ! Objet: calculer le coefficient du frottement du sol (Cdrag) et les 219 ! coefficients d'echange turbulent dans l'atmosphere. 220 ! Arguments: 221 ! nsrf-----input-I- indicateur de la nature du sol 222 ! knon-----input-I- nombre de points a traiter 223 ! paprs----input-R- pregssion a chaque intercouche (en Pa) 224 ! pplay----input-R- pression au milieu de chaque couche (en Pa) 225 ! ts-------input-R- temperature du sol (en Kelvin) 226 ! u--------input-R- vitesse u 227 ! v--------input-R- vitesse v 228 ! t--------input-R- temperature (K) 229 ! q--------input-R- vapeur d'eau (kg/kg) 230 231 ! pcfm-----output-R- coefficients a calculer (vitesse) 232 ! pcfh-----output-R- coefficients a calculer (chaleur et humidite) 233 !====================================================================== 235 234 INCLUDE "YOMCST.h" 236 INCLUDE "FCTTRE.h" 237 238 ! Arguments: 239 240 INTEGER, INTENT(IN) :: knon, nsrf 241 REAL, INTENT(IN) :: ksta, ksta_ter 242 REAL, DIMENSION(klon), INTENT(IN) :: ts 243 REAL, DIMENSION(klon,klev+1), INTENT(IN) :: paprs 244 REAL, DIMENSION(klon,klev), INTENT(IN) :: pplay 245 REAL, DIMENSION(klon,klev), INTENT(IN) :: u, v, t, q 246 REAL, DIMENSION(klon), INTENT(IN) :: qsurf 247 248 REAL, DIMENSION(klon,klev), INTENT(OUT) :: pcfm, pcfh 249 250 ! Local variables: 251 252 INTEGER, DIMENSION(klon) :: itop ! numero de couche du sommet de la couche limite 253 254 ! Quelques constantes et options: 255 256 REAL, PARAMETER :: cepdu2=0.1**2 257 REAL, PARAMETER :: CKAP=0.4 258 REAL, PARAMETER :: cb=5.0 259 REAL, PARAMETER :: cc=5.0 260 REAL, PARAMETER :: cd=5.0 261 REAL, PARAMETER :: clam=160.0 262 REAL, PARAMETER :: ratqs=0.05 ! largeur de distribution de vapeur d'eau 263 LOGICAL, PARAMETER :: richum=.TRUE. ! utilise le nombre de Richardson humide 264 REAL, PARAMETER :: ric=0.4 ! nombre de Richardson critique 265 REAL, PARAMETER :: prandtl=0.4 235 236 ! Arguments: 237 238 INTEGER, INTENT(IN) :: knon, nsrf 239 REAL, INTENT(IN) :: ksta, ksta_ter 240 REAL, DIMENSION(klon), INTENT(IN) :: ts 241 REAL, DIMENSION(klon, klev + 1), INTENT(IN) :: paprs 242 REAL, DIMENSION(klon, klev), INTENT(IN) :: pplay 243 REAL, DIMENSION(klon, klev), INTENT(IN) :: u, v, t, q 244 REAL, DIMENSION(klon), INTENT(IN) :: qsurf 245 246 REAL, DIMENSION(klon, klev), INTENT(OUT) :: pcfm, pcfh 247 248 ! Local variables: 249 250 INTEGER, DIMENSION(klon) :: itop ! numero de couche du sommet de la couche limite 251 252 ! Quelques constantes et options: 253 254 REAL, PARAMETER :: cepdu2 = 0.1**2 255 REAL, PARAMETER :: CKAP = 0.4 256 REAL, PARAMETER :: cb = 5.0 257 REAL, PARAMETER :: cc = 5.0 258 REAL, PARAMETER :: cd = 5.0 259 REAL, PARAMETER :: clam = 160.0 260 REAL, PARAMETER :: ratqs = 0.05 ! largeur de distribution de vapeur d'eau 261 LOGICAL, PARAMETER :: richum = .TRUE. ! utilise le nombre de Richardson humide 262 REAL, PARAMETER :: ric = 0.4 ! nombre de Richardson critique 263 REAL, PARAMETER :: prandtl = 0.4 266 264 REAL kstable ! diffusion minimale (situation stable) 267 265 ! GKtest 268 266 ! PARAMETER (kstable=1.0e-10) 269 !IM: 261103 REAL kstable_ter, kstable_sinon270 !IM: 211003 cf GK PARAMETER (kstable_ter = 1.0e-6)271 !IM: 261103 PARAMETER (kstable_ter = 1.0e-8)272 !IM: 261103 PARAMETER (kstable_ter = 1.0e-10)273 !IM: 261103 PARAMETER (kstable_sinon = 1.0e-10)267 !IM: 261103 REAL kstable_ter, kstable_sinon 268 !IM: 211003 cf GK PARAMETER (kstable_ter = 1.0e-6) 269 !IM: 261103 PARAMETER (kstable_ter = 1.0e-8) 270 !IM: 261103 PARAMETER (kstable_ter = 1.0e-10) 271 !IM: 261103 PARAMETER (kstable_sinon = 1.0e-10) 274 272 ! fin GKtest 275 REAL, PARAMETER :: mixlen =35.0 ! constante controlant longueur de melange273 REAL, PARAMETER :: mixlen = 35.0 ! constante controlant longueur de melange 276 274 INTEGER isommet ! le sommet de la couche limite 277 LOGICAL, PARAMETER :: tvirtu =.TRUE. ! calculer Ri d'une maniere plus performante278 LOGICAL, PARAMETER :: opt_ec =.FALSE.! formule du Centre Europeen dans l'atmosphere279 280 ! Variables locales:275 LOGICAL, PARAMETER :: tvirtu = .TRUE. ! calculer Ri d'une maniere plus performante 276 LOGICAL, PARAMETER :: opt_ec = .FALSE.! formule du Centre Europeen dans l'atmosphere 277 278 ! Variables locales: 281 279 INTEGER i, k !IM 120704 282 REAL zgeop(klon, klev)280 REAL zgeop(klon, klev) 283 281 REAL zmgeom(klon) 284 282 REAL zri(klon) … … 288 286 REAL zt, zq, zdelta, zcvm5, zcor, zqs, zfr, zdqs 289 287 REAL z2geomf, zalh2, zalm2, zscfh, zscfm 290 REAL, PARAMETER :: t_coup =273.15291 LOGICAL, PARAMETER :: check =.FALSE.292 293 ! contre-gradient pour la chaleur sensible: Kelvin/metre288 REAL, PARAMETER :: t_coup = 273.15 289 LOGICAL, PARAMETER :: check = .FALSE. 290 291 ! contre-gradient pour la chaleur sensible: Kelvin/metre 294 292 REAL gamt(2:klev) 295 293 296 LOGICAL, SAVE :: appel1er =.TRUE.294 LOGICAL, SAVE :: appel1er = .TRUE. 297 295 !$OMP THREADPRIVATE(appel1er) 298 296 299 ! Fonctions thermodynamiques et fonctions d'instabilite297 ! Fonctions thermodynamiques et fonctions d'instabilite 300 298 REAL fsta, fins, x 301 299 302 fsta(x) = 1.0 / (1.0 +10.0*x*(1+8.0*x))303 fins(x) = SQRT(1.0 -18.0*x)304 305 isommet =klev306 300 fsta(x) = 1.0 / (1.0 + 10.0 * x * (1 + 8.0 * x)) 301 fins(x) = SQRT(1.0 - 18.0 * x) 302 303 isommet = klev 304 307 305 IF (appel1er) THEN 308 309 WRITE(lunout,*)'coefkz, opt_ec:', opt_ec310 WRITE(lunout,*)'coefkz, richum:', richum311 IF (richum) WRITE(lunout,*)'coefkz, ratqs:', ratqs312 WRITE(lunout,*)'coefkz, isommet:', isommet313 WRITE(lunout,*)'coefkz, tvirtu:', tvirtu314 315 306 IF (prt_level > 9) THEN 307 WRITE(lunout, *)'coefkz, opt_ec:', opt_ec 308 WRITE(lunout, *)'coefkz, richum:', richum 309 IF (richum) WRITE(lunout, *)'coefkz, ratqs:', ratqs 310 WRITE(lunout, *)'coefkz, isommet:', isommet 311 WRITE(lunout, *)'coefkz, tvirtu:', tvirtu 312 appel1er = .FALSE. 313 ENDIF 316 314 ENDIF 317 315 318 ! Initialiser les sorties316 ! Initialiser les sorties 319 317 320 318 DO k = 1, klev 321 322 pcfm(i,k) = 0.0323 pcfh(i,k) = 0.0324 319 DO i = 1, knon 320 pcfm(i, k) = 0.0 321 pcfh(i, k) = 0.0 322 ENDDO 325 323 ENDDO 326 324 DO i = 1, knon 327 328 ENDDO 329 330 ! Prescrire la valeur de contre-gradient325 itop(i) = 0 326 ENDDO 327 328 ! Prescrire la valeur de contre-gradient 331 329 332 330 IF (iflag_pbl==1) THEN 333 334 335 336 331 DO k = 3, klev 332 gamt(k) = -1.0E-03 333 ENDDO 334 gamt(2) = -2.5E-03 337 335 ELSE 338 339 340 336 DO k = 2, klev 337 gamt(k) = 0.0 338 ENDDO 341 339 ENDIF 342 !IM cf JLD/ GKtest343 IF ( nsrf /= is_oce) THEN344 !IM 261103 kstable = kstable_ter345 340 !IM cf JLD/ GKtest 341 IF (nsrf /= is_oce) THEN 342 !IM 261103 kstable = kstable_ter 343 kstable = ksta_ter 346 344 ELSE 347 !IM 261103 kstable = kstable_sinon348 345 !IM 261103 kstable = kstable_sinon 346 kstable = ksta 349 347 ENDIF 350 !IM cf JLD/ GKtest fin351 352 ! Calculer les geopotentiels de chaque couche348 !IM cf JLD/ GKtest fin 349 350 ! Calculer les geopotentiels de chaque couche 353 351 354 352 DO i = 1, knon 355 zgeop(i,1) = RD * t(i,1) / (0.5*(paprs(i,1)+pplay(i,1))) &356 * (paprs(i,1)-pplay(i,1))353 zgeop(i, 1) = RD * t(i, 1) / (0.5 * (paprs(i, 1) + pplay(i, 1))) & 354 * (paprs(i, 1) - pplay(i, 1)) 357 355 ENDDO 358 356 DO k = 2, klev 359 360 zgeop(i,k) = zgeop(i,k-1) &361 + RD * 0.5*(t(i,k-1)+t(i,k)) / paprs(i,k) &362 * (pplay(i,k-1)-pplay(i,k))363 364 ENDDO 365 366 ! Calculer les coefficients turbulents dans l'atmosphere357 DO i = 1, knon 358 zgeop(i, k) = zgeop(i, k - 1) & 359 + RD * 0.5 * (t(i, k - 1) + t(i, k)) / paprs(i, k) & 360 * (pplay(i, k - 1) - pplay(i, k)) 361 ENDDO 362 ENDDO 363 364 ! Calculer les coefficients turbulents dans l'atmosphere 367 365 368 366 DO i = 1, knon 369 itop(i) = isommet 370 ENDDO 371 367 itop(i) = isommet 368 ENDDO 372 369 373 370 DO k = 2, isommet 374 DO i = 1, knon 375 zdu2=MAX(cepdu2,(u(i,k)-u(i,k-1))**2 & 376 +(v(i,k)-v(i,k-1))**2) 377 zmgeom(i)=zgeop(i,k)-zgeop(i,k-1) 378 zdphi =zmgeom(i) / 2.0 379 zt = (t(i,k)+t(i,k-1)) * 0.5 380 zq = (q(i,k)+q(i,k-1)) * 0.5 381 382 ! Calculer Qs et dQs/dT: 383 384 IF (thermcep) THEN 385 zdelta = MAX(0.,SIGN(1.,RTT-zt)) 386 zcvm5 = R5LES*RLVTT/RCPD/(1.0+RVTMP2*zq)*(1.-zdelta) & 387 + R5IES*RLSTT/RCPD/(1.0+RVTMP2*zq)*zdelta 388 zqs = R2ES * FOEEW(zt,zdelta) / pplay(i,k) 389 zqs = MIN(0.5,zqs) 390 zcor = 1./(1.-RETV*zqs) 391 zqs = zqs*zcor 392 zdqs = FOEDE(zt,zdelta,zcvm5,zqs,zcor) 371 DO i = 1, knon 372 zdu2 = MAX(cepdu2, (u(i, k) - u(i, k - 1))**2 & 373 + (v(i, k) - v(i, k - 1))**2) 374 zmgeom(i) = zgeop(i, k) - zgeop(i, k - 1) 375 zdphi = zmgeom(i) / 2.0 376 zt = (t(i, k) + t(i, k - 1)) * 0.5 377 zq = (q(i, k) + q(i, k - 1)) * 0.5 378 379 ! Calculer Qs et dQs/dT: 380 381 IF (thermcep) THEN 382 zdelta = MAX(0., SIGN(1., RTT - zt)) 383 zcvm5 = R5LES * RLVTT / RCPD / (1.0 + RVTMP2 * zq) * (1. - zdelta) & 384 + R5IES * RLSTT / RCPD / (1.0 + RVTMP2 * zq) * zdelta 385 zqs = R2ES * FOEEW(zt, zdelta) / pplay(i, k) 386 zqs = MIN(0.5, zqs) 387 zcor = 1. / (1. - RETV * zqs) 388 zqs = zqs * zcor 389 zdqs = FOEDE(zt, zdelta, zcvm5, zqs, zcor) 390 ELSE 391 IF (zt < t_coup) THEN 392 zqs = qsats(zt) / pplay(i, k) 393 zdqs = dqsats(zt, zqs) 393 394 ELSE 394 IF (zt < t_coup) THEN 395 zqs = qsats(zt) / pplay(i,k) 396 zdqs = dqsats(zt,zqs) 397 ELSE 398 zqs = qsatl(zt) / pplay(i,k) 399 zdqs = dqsatl(zt,zqs) 400 ENDIF 395 zqs = qsatl(zt) / pplay(i, k) 396 zdqs = dqsatl(zt, zqs) 401 397 ENDIF 402 403 ! calculer la fraction nuageuse (processus humide): 404 405 IF (zq /= 0.) THEN 406 zfr = (zq+ratqs*zq-zqs) / (2.0*ratqs*zq) 407 else 408 zfr = 0. 409 end if 410 zfr = MAX(0.0,MIN(1.0,zfr)) 411 IF (.NOT.richum) zfr = 0.0 412 413 ! calculer le nombre de Richardson: 414 415 IF (tvirtu) THEN 416 ztvd =( t(i,k) & 417 + zdphi/RCPD/(1.+RVTMP2*zq) & 418 *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) & 419 )*(1.+RETV*q(i,k)) 420 ztvu =( t(i,k-1) & 421 - zdphi/RCPD/(1.+RVTMP2*zq) & 422 *( (1.-zfr) + zfr*(1.+RLVTT*zqs/RD/zt)/(1.+zdqs) ) & 423 )*(1.+RETV*q(i,k-1)) 424 zri(i) =zmgeom(i)*(ztvd-ztvu)/(zdu2*0.5*(ztvd+ztvu)) 425 zri(i) = zri(i) & 426 + zmgeom(i)*zmgeom(i)/RG*gamt(k) & 427 *(paprs(i,k)/101325.0)**RKAPPA & 428 /(zdu2*0.5*(ztvd+ztvu)) 429 430 ELSE ! calcul de Ridchardson compatible LMD5 431 432 zri(i) =(RCPD*(t(i,k)-t(i,k-1)) & 433 -RD*0.5*(t(i,k)+t(i,k-1))/paprs(i,k) & 434 *(pplay(i,k)-pplay(i,k-1)) & 435 )*zmgeom(i)/(zdu2*0.5*RCPD*(t(i,k-1)+t(i,k))) 436 zri(i) = zri(i) + & 437 zmgeom(i)*zmgeom(i)*gamt(k)/RG & 438 *(paprs(i,k)/101325.0)**RKAPPA & 439 /(zdu2*0.5*(t(i,k-1)+t(i,k))) 398 ENDIF 399 400 ! calculer la fraction nuageuse (processus humide): 401 402 IF (zq /= 0.) THEN 403 zfr = (zq + ratqs * zq - zqs) / (2.0 * ratqs * zq) 404 else 405 zfr = 0. 406 end if 407 zfr = MAX(0.0, MIN(1.0, zfr)) 408 IF (.NOT.richum) zfr = 0.0 409 410 ! calculer le nombre de Richardson: 411 412 IF (tvirtu) THEN 413 ztvd = (t(i, k) & 414 + zdphi / RCPD / (1. + RVTMP2 * zq) & 415 * ((1. - zfr) + zfr * (1. + RLVTT * zqs / RD / zt) / (1. + zdqs)) & 416 ) * (1. + RETV * q(i, k)) 417 ztvu = (t(i, k - 1) & 418 - zdphi / RCPD / (1. + RVTMP2 * zq) & 419 * ((1. - zfr) + zfr * (1. + RLVTT * zqs / RD / zt) / (1. + zdqs)) & 420 ) * (1. + RETV * q(i, k - 1)) 421 zri(i) = zmgeom(i) * (ztvd - ztvu) / (zdu2 * 0.5 * (ztvd + ztvu)) 422 zri(i) = zri(i) & 423 + zmgeom(i) * zmgeom(i) / RG * gamt(k) & 424 * (paprs(i, k) / 101325.0)**RKAPPA & 425 / (zdu2 * 0.5 * (ztvd + ztvu)) 426 427 ELSE ! calcul de Ridchardson compatible LMD5 428 429 zri(i) = (RCPD * (t(i, k) - t(i, k - 1)) & 430 - RD * 0.5 * (t(i, k) + t(i, k - 1)) / paprs(i, k) & 431 * (pplay(i, k) - pplay(i, k - 1)) & 432 ) * zmgeom(i) / (zdu2 * 0.5 * RCPD * (t(i, k - 1) + t(i, k))) 433 zri(i) = zri(i) + & 434 zmgeom(i) * zmgeom(i) * gamt(k) / RG & 435 * (paprs(i, k) / 101325.0)**RKAPPA & 436 / (zdu2 * 0.5 * (t(i, k - 1) + t(i, k))) 437 ENDIF 438 439 ! finalement, les coefficients d'echange sont obtenus: 440 441 zcdn = SQRT(zdu2) / zmgeom(i) * RG 442 443 IF (opt_ec) THEN 444 z2geomf = zgeop(i, k - 1) + zgeop(i, k) 445 zalm2 = (0.5 * ckap / RG * z2geomf & 446 / (1. + 0.5 * ckap / rg / clam * z2geomf))**2 447 zalh2 = (0.5 * ckap / rg * z2geomf & 448 / (1. + 0.5 * ckap / RG / (clam * SQRT(1.5 * cd)) * z2geomf))**2 449 IF (zri(i)<0.0) THEN ! situation instable 450 zscf = ((zgeop(i, k) / zgeop(i, k - 1))**(1. / 3.) - 1.)**3 & 451 / (zmgeom(i) / RG)**3 / (zgeop(i, k - 1) / RG) 452 zscf = SQRT(-zri(i) * zscf) 453 zscfm = 1.0 / (1.0 + 3.0 * cb * cc * zalm2 * zscf) 454 zscfh = 1.0 / (1.0 + 3.0 * cb * cc * zalh2 * zscf) 455 pcfm(i, k) = zcdn * zalm2 * (1. - 2.0 * cb * zri(i) * zscfm) 456 pcfh(i, k) = zcdn * zalh2 * (1. - 3.0 * cb * zri(i) * zscfh) 457 ELSE ! situation stable 458 zscf = SQRT(1. + cd * zri(i)) 459 pcfm(i, k) = zcdn * zalm2 / (1. + 2.0 * cb * zri(i) / zscf) 460 pcfh(i, k) = zcdn * zalh2 / (1. + 3.0 * cb * zri(i) * zscf) 440 461 ENDIF 441 442 ! finalement, les coefficients d'echange sont obtenus: 443 444 zcdn=SQRT(zdu2) / zmgeom(i) * RG 445 446 IF (opt_ec) THEN 447 z2geomf=zgeop(i,k-1)+zgeop(i,k) 448 zalm2=(0.5*ckap/RG*z2geomf & 449 /(1.+0.5*ckap/rg/clam*z2geomf))**2 450 zalh2=(0.5*ckap/rg*z2geomf & 451 /(1.+0.5*ckap/RG/(clam*SQRT(1.5*cd))*z2geomf))**2 452 IF (zri(i)<0.0) THEN ! situation instable 453 zscf = ((zgeop(i,k)/zgeop(i,k-1))**(1./3.)-1.)**3 & 454 / (zmgeom(i)/RG)**3 / (zgeop(i,k-1)/RG) 455 zscf = SQRT(-zri(i)*zscf) 456 zscfm = 1.0 / (1.0+3.0*cb*cc*zalm2*zscf) 457 zscfh = 1.0 / (1.0+3.0*cb*cc*zalh2*zscf) 458 pcfm(i,k)=zcdn*zalm2*(1.-2.0*cb*zri(i)*zscfm) 459 pcfh(i,k)=zcdn*zalh2*(1.-3.0*cb*zri(i)*zscfh) 460 ELSE ! situation stable 461 zscf=SQRT(1.+cd*zri(i)) 462 pcfm(i,k)=zcdn*zalm2/(1.+2.0*cb*zri(i)/zscf) 463 pcfh(i,k)=zcdn*zalh2/(1.+3.0*cb*zri(i)*zscf) 464 ENDIF 465 ELSE 466 zl2(i)=(mixlen*MAX(0.0,(paprs(i,k)-paprs(i,itop(i)+1)) & 467 /(paprs(i,2)-paprs(i,itop(i)+1)) ))**2 468 pcfm(i,k)=SQRT(MAX(zcdn*zcdn*(ric-zri(i))/ric, kstable)) 469 pcfm(i,k)= zl2(i)* pcfm(i,k) 470 pcfh(i,k) = pcfm(i,k) /prandtl ! h et m different 471 ENDIF 472 ENDDO 473 ENDDO 474 475 ! Au-dela du sommet, pas de diffusion turbulente: 462 ELSE 463 zl2(i) = (mixlen * MAX(0.0, (paprs(i, k) - paprs(i, itop(i) + 1)) & 464 / (paprs(i, 2) - paprs(i, itop(i) + 1))))**2 465 pcfm(i, k) = SQRT(MAX(zcdn * zcdn * (ric - zri(i)) / ric, kstable)) 466 pcfm(i, k) = zl2(i) * pcfm(i, k) 467 pcfh(i, k) = pcfm(i, k) / prandtl ! h et m different 468 ENDIF 469 ENDDO 470 ENDDO 471 472 ! Au-dela du sommet, pas de diffusion turbulente: 476 473 477 474 DO i = 1, knon 478 IF (itop(i)+1 <= klev) THEN479 DO k = itop(i)+1, klev480 pcfh(i,k) = 0.0481 pcfm(i,k) = 0.0482 483 484 ENDDO 485 475 IF (itop(i) + 1 <= klev) THEN 476 DO k = itop(i) + 1, klev 477 pcfh(i, k) = 0.0 478 pcfm(i, k) = 0.0 479 ENDDO 480 ENDIF 481 ENDDO 482 486 483 END SUBROUTINE coefkz 487 484 488 !****************************************************************************************489 490 SUBROUTINE coefkz2(nsrf, knon, paprs, pplay, t, &491 pcfm, pcfh)485 !**************************************************************************************** 486 487 SUBROUTINE coefkz2(nsrf, knon, paprs, pplay, t, & 488 pcfm, pcfh) 492 489 493 490 USE dimphy 494 491 USE indice_sol_mod 495 492 496 !======================================================================497 ! J'introduit un peu de diffusion sauf dans les endroits498 ! ou une forte inversion est presente499 ! On peut dire qu'il represente la convection peu profonde500 501 ! Arguments:502 ! nsrf-----input-I- indicateur de la nature du sol503 ! knon-----input-I- nombre de points a traiter504 ! paprs----input-R- pression a chaque intercouche (en Pa)505 ! pplay----input-R- pression au milieu de chaque couche (en Pa)506 ! t--------input-R- temperature (K)507 508 ! pcfm-----output-R- coefficients a calculer (vitesse)509 ! pcfh-----output-R- coefficients a calculer (chaleur et humidite)510 !======================================================================511 512 ! Arguments:513 514 INTEGER, INTENT(IN) 515 REAL, DIMENSION(klon, klev +1), INTENT(IN) ::paprs516 REAL, DIMENSION(klon, klev), INTENT(IN) ::pplay517 REAL, DIMENSION(klon, klev), INTENT(IN) :: t(klon,klev)518 519 REAL, DIMENSION(klon, klev), INTENT(OUT) 520 521 ! Quelques constantes et options:522 523 REAL, PARAMETER :: prandtl =0.4524 REAL, PARAMETER :: kstable =0.002525 ! REAL, PARAMETER :: kstable=0.001526 REAL, PARAMETER :: mixlen =35.0 ! constante controlant longueur de melange527 REAL, PARAMETER :: seuil =-0.02 ! au-dela l'inversion est consideree trop faible528 ! PARAMETER (seuil=-0.04)529 ! PARAMETER (seuil=-0.06)530 ! PARAMETER (seuil=-0.09)531 532 ! Variables locales:493 !====================================================================== 494 ! J'introduit un peu de diffusion sauf dans les endroits 495 ! ou une forte inversion est presente 496 ! On peut dire qu'il represente la convection peu profonde 497 498 ! Arguments: 499 ! nsrf-----input-I- indicateur de la nature du sol 500 ! knon-----input-I- nombre de points a traiter 501 ! paprs----input-R- pression a chaque intercouche (en Pa) 502 ! pplay----input-R- pression au milieu de chaque couche (en Pa) 503 ! t--------input-R- temperature (K) 504 505 ! pcfm-----output-R- coefficients a calculer (vitesse) 506 ! pcfh-----output-R- coefficients a calculer (chaleur et humidite) 507 !====================================================================== 508 509 ! Arguments: 510 511 INTEGER, INTENT(IN) :: knon, nsrf 512 REAL, DIMENSION(klon, klev + 1), INTENT(IN) :: paprs 513 REAL, DIMENSION(klon, klev), INTENT(IN) :: pplay 514 REAL, DIMENSION(klon, klev), INTENT(IN) :: t(klon, klev) 515 516 REAL, DIMENSION(klon, klev), INTENT(OUT) :: pcfm, pcfh 517 518 ! Quelques constantes et options: 519 520 REAL, PARAMETER :: prandtl = 0.4 521 REAL, PARAMETER :: kstable = 0.002 522 ! REAL, PARAMETER :: kstable=0.001 523 REAL, PARAMETER :: mixlen = 35.0 ! constante controlant longueur de melange 524 REAL, PARAMETER :: seuil = -0.02 ! au-dela l'inversion est consideree trop faible 525 ! PARAMETER (seuil=-0.04) 526 ! PARAMETER (seuil=-0.06) 527 ! PARAMETER (seuil=-0.09) 528 529 ! Variables locales: 533 530 534 531 INTEGER i, k, invb(knon) … … 538 535 INCLUDE "YOMCST.h" 539 536 540 ! Initialiser les sorties537 ! Initialiser les sorties 541 538 542 539 DO k = 1, klev 543 544 pcfm(i,k) = 0.0545 pcfh(i,k) = 0.0546 547 ENDDO 548 549 ! Chercher la zone d'inversion forte540 DO i = 1, knon 541 pcfm(i, k) = 0.0 542 pcfh(i, k) = 0.0 543 ENDDO 544 ENDDO 545 546 ! Chercher la zone d'inversion forte 550 547 551 548 DO i = 1, knon 552 invb(i) = klev 553 zdthmin(i)=0.0 554 ENDDO 555 DO k = 2, klev/2-1 556 DO i = 1, knon 557 zdthdp = (t(i,k)-t(i,k+1))/(pplay(i,k)-pplay(i,k+1)) & 558 - RD * 0.5*(t(i,k)+t(i,k+1))/RCPD/paprs(i,k+1) 559 zdthdp = zdthdp * 100.0 560 IF (pplay(i,k)>0.8*paprs(i,1) .AND. & 561 zdthdp<zdthmin(i) ) THEN 562 zdthmin(i) = zdthdp 563 invb(i) = k 549 invb(i) = klev 550 zdthmin(i) = 0.0 551 ENDDO 552 DO k = 2, klev / 2 - 1 553 DO i = 1, knon 554 zdthdp = (t(i, k) - t(i, k + 1)) / (pplay(i, k) - pplay(i, k + 1)) & 555 - RD * 0.5 * (t(i, k) + t(i, k + 1)) / RCPD / paprs(i, k + 1) 556 zdthdp = zdthdp * 100.0 557 IF (pplay(i, k)>0.8 * paprs(i, 1) .AND. & 558 zdthdp<zdthmin(i)) THEN 559 zdthmin(i) = zdthdp 560 invb(i) = k 561 ENDIF 562 ENDDO 563 ENDDO 564 565 ! Introduire une diffusion: 566 567 IF (nsrf==is_oce) THEN 568 DO k = 2, klev 569 DO i = 1, knon 570 !IM cf FH/GK IF ( (nsrf.NE.is_oce) .OR. ! si ce n'est pas sur l'ocean 571 !IM cf FH/GK . (invb(i).EQ.klev) .OR. ! s'il n'y a pas d'inversion 572 !IM cf JLD/ GKtest TERkz2 573 ! IF ( (nsrf.EQ.is_ter) .OR. ! si on est sur la terre 574 ! fin GKtest 575 576 577 ! s'il n'y a pas d'inversion ou si l'inversion est trop faible 578 ! IF ( (nsrf.EQ.is_oce) .AND. & 579 IF ((invb(i)==klev) .OR. (zdthmin(i)>seuil)) THEN 580 zl2(i) = (mixlen * MAX(0.0, (paprs(i, k) - paprs(i, klev + 1)) & 581 / (paprs(i, 2) - paprs(i, klev + 1))))**2 582 pcfm(i, k) = zl2(i) * kstable 583 pcfh(i, k) = pcfm(i, k) / prandtl ! h et m different 564 584 ENDIF 565 ENDDO 566 ENDDO 567 568 ! Introduire une diffusion: 569 570 IF ( nsrf==is_oce ) THEN 571 DO k = 2, klev 572 DO i = 1, knon 573 !IM cf FH/GK IF ( (nsrf.NE.is_oce) .OR. ! si ce n'est pas sur l'ocean 574 !IM cf FH/GK . (invb(i).EQ.klev) .OR. ! s'il n'y a pas d'inversion 575 !IM cf JLD/ GKtest TERkz2 576 ! IF ( (nsrf.EQ.is_ter) .OR. ! si on est sur la terre 577 ! fin GKtest 578 579 580 ! s'il n'y a pas d'inversion ou si l'inversion est trop faible 581 ! IF ( (nsrf.EQ.is_oce) .AND. & 582 IF ( (invb(i)==klev) .OR. (zdthmin(i)>seuil) ) THEN 583 zl2(i)=(mixlen*MAX(0.0,(paprs(i,k)-paprs(i,klev+1)) & 584 /(paprs(i,2)-paprs(i,klev+1)) ))**2 585 pcfm(i,k)= zl2(i)* kstable 586 pcfh(i,k) = pcfm(i,k) /prandtl ! h et m different 587 ENDIF 588 ENDDO 589 ENDDO 585 ENDDO 586 ENDDO 590 587 ENDIF 591 588 592 589 END SUBROUTINE coefkz2 593 590 594 !****************************************************************************************591 !**************************************************************************************** 595 592 596 593 END MODULE coef_diff_turb_mod
Note: See TracChangeset
for help on using the changeset viewer.