| 1 |  |  |  | 
    
    | 2 |  |  | SUBROUTINE coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycdragm, km, kn) | 
    
    | 3 |  |  |  | 
    
    | 4 |  |  |   USE dimphy | 
    
    | 5 |  |  |   IMPLICIT NONE | 
    
    | 6 |  |  |  | 
    
    | 7 |  |  |   include "YOMCST.h" | 
    
    | 8 |  |  |  | 
    
    | 9 |  |  |   ! ....................................................................... | 
    
    | 10 |  |  |   ! Entrees modifies en attendant une version ou les zlev, et zlay soient | 
    
    | 11 |  |  |   ! disponibles. | 
    
    | 12 |  |  |  | 
    
    | 13 |  |  |   REAL ycdragm(klon) | 
    
    | 14 |  |  |  | 
    
    | 15 |  |  |   REAL yu(klon, klev), yv(klon, klev) | 
    
    | 16 |  |  |   REAL yt(klon, klev), yq(klon, klev) | 
    
    | 17 |  |  |   REAL ypaprs(klon, klev+1), ypplay(klon, klev) | 
    
    | 18 |  |  |   REAL yustar(klon) | 
    
    | 19 |  |  |   REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev) | 
    
    | 20 |  |  |  | 
    
    | 21 |  |  |   INTEGER i | 
    
    | 22 |  |  |  | 
    
    | 23 |  |  |   ! ....................................................................... | 
    
    | 24 |  |  |  | 
    
    | 25 |  |  |   ! En entree : | 
    
    | 26 |  |  |   ! ----------- | 
    
    | 27 |  |  |  | 
    
    | 28 |  |  |   ! zlev : altitude a chaque niveau (interface inferieure de la couche | 
    
    | 29 |  |  |   ! de meme indice) | 
    
    | 30 |  |  |   ! ustar : u* | 
    
    | 31 |  |  |  | 
    
    | 32 |  |  |   ! teta : temperature potentielle au centre de chaque couche | 
    
    | 33 |  |  |   ! (en entree : la valeur au debut du pas de temps) | 
    
    | 34 |  |  |  | 
    
    | 35 |  |  |   ! en sortier : | 
    
    | 36 |  |  |   ! ------------ | 
    
    | 37 |  |  |  | 
    
    | 38 |  |  |   ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque | 
    
    | 39 |  |  |   ! couche) | 
    
    | 40 |  |  |   ! (en sortie : la valeur a la fin du pas de temps) | 
    
    | 41 |  |  |   ! kn : diffusivite turbulente des scalaires (au bas de chaque couche) | 
    
    | 42 |  |  |   ! (en sortie : la valeur a la fin du pas de temps) | 
    
    | 43 |  |  |  | 
    
    | 44 |  |  |   ! ....................................................................... | 
    
    | 45 |  |  |  | 
    
    | 46 |  |  |   REAL ustar(klon) | 
    
    | 47 |  |  |   REAL kmin, qmin, pblhmin(klon), coriol(klon) | 
    
    | 48 |  |  |   REAL zlev(klon, klev+1) | 
    
    | 49 |  |  |   REAL teta(klon, klev) | 
    
    | 50 |  |  |  | 
    
    | 51 |  |  |   REAL km(klon, klev) | 
    
    | 52 |  |  |   REAL kn(klon, klev) | 
    
    | 53 |  |  |   INTEGER knon | 
    
    | 54 |  |  |  | 
    
    | 55 |  |  |  | 
    
    | 56 |  |  |   INTEGER nlay, nlev | 
    
    | 57 |  |  |   INTEGER ig, k | 
    
    | 58 |  |  |  | 
    
    | 59 |  |  |   REAL, PARAMETER :: kap = 0.4 | 
    
    | 60 |  |  |  | 
    
    | 61 |  |  |   nlay = klev | 
    
    | 62 |  |  |   nlev = klev + 1 | 
    
    | 63 |  |  |   ! ....................................................................... | 
    
    | 64 |  |  |   ! en attendant une version ou les zlev, et zlay soient | 
    
    | 65 |  |  |   ! disponibles. | 
    
    | 66 |  |  |   ! Debut de la partie qui doit etre unclue a terme dans clmain. | 
    
    | 67 |  |  |  | 
    
    | 68 |  |  |   DO i = 1, knon | 
    
    | 69 |  |  |     yzlay(i, 1) = rd*yt(i, 1)/(0.5*(ypaprs(i,1)+ypplay(i, & | 
    
    | 70 |  |  |       1)))*(ypaprs(i,1)-ypplay(i,1))/rg | 
    
    | 71 |  |  |   END DO | 
    
    | 72 |  |  |   DO k = 2, klev | 
    
    | 73 |  |  |     DO i = 1, knon | 
    
    | 74 |  |  |       yzlay(i, k) = yzlay(i, k-1) + rd*0.5*(yt(i,k-1)+yt(i,k))/ypaprs(i, k)*( & | 
    
    | 75 |  |  |         ypplay(i,k-1)-ypplay(i,k))/rg | 
    
    | 76 |  |  |     END DO | 
    
    | 77 |  |  |   END DO | 
    
    | 78 |  |  |   DO k = 1, klev | 
    
    | 79 |  |  |     DO i = 1, knon | 
    
    | 80 |  |  |       ! ATTENTION:on passe la temperature potentielle virt. pour le calcul de | 
    
    | 81 |  |  |       ! K | 
    
    | 82 |  |  |       yteta(i, k) = yt(i, k)*(ypaprs(i,1)/ypplay(i,k))**rkappa* & | 
    
    | 83 |  |  |         (1.+0.61*yq(i,k)) | 
    
    | 84 |  |  |     END DO | 
    
    | 85 |  |  |   END DO | 
    
    | 86 |  |  |   DO i = 1, knon | 
    
    | 87 |  |  |     yzlev(i, 1) = 0. | 
    
    | 88 |  |  |     yzlev(i, klev+1) = 2.*yzlay(i, klev) - yzlay(i, klev-1) | 
    
    | 89 |  |  |   END DO | 
    
    | 90 |  |  |   DO k = 2, klev | 
    
    | 91 |  |  |     DO i = 1, knon | 
    
    | 92 |  |  |       yzlev(i, k) = 0.5*(yzlay(i,k)+yzlay(i,k-1)) | 
    
    | 93 |  |  |     END DO | 
    
    | 94 |  |  |   END DO | 
    
    | 95 |  |  |  | 
    
    | 96 |  |  |   yustar(1:knon) = sqrt(ycdragm(1:knon)*(yu(1:knon,1)*yu(1:knon,1)+yv(1:knon, & | 
    
    | 97 |  |  |     1)*yv(1:knon,1))) | 
    
    | 98 |  |  |  | 
    
    | 99 |  |  |   ! Fin de la partie qui doit etre unclue a terme dans clmain. | 
    
    | 100 |  |  |  | 
    
    | 101 |  |  |   ! ette routine est ecrite pour avoir en entree ustar, teta et zlev | 
    
    | 102 |  |  |   ! Ici, on a inclut le calcul de ces trois variables dans la routine | 
    
    | 103 |  |  |   ! coefkzmin en attendant une nouvelle version de la couche limite | 
    
    | 104 |  |  |   ! ou ces variables seront disponibles. | 
    
    | 105 |  |  |  | 
    
    | 106 |  |  |   ! Debut de la routine coefkzmin proprement dite. | 
    
    | 107 |  |  |  | 
    
    | 108 |  |  |   ustar = yustar | 
    
    | 109 |  |  |   teta = yteta | 
    
    | 110 |  |  |   zlev = yzlev | 
    
    | 111 |  |  |  | 
    
    | 112 |  |  |   DO ig = 1, knon | 
    
    | 113 |  |  |     coriol(ig) = 1.E-4 | 
    
    | 114 |  |  |     pblhmin(ig) = 0.07*ustar(ig)/max(abs(coriol(ig)), 2.546E-5) | 
    
    | 115 |  |  |   END DO | 
    
    | 116 |  |  |  | 
    
    | 117 |  |  |   DO k = 2, klev | 
    
    | 118 |  |  |     DO ig = 1, knon | 
    
    | 119 |  |  |       IF (teta(ig,2)>teta(ig,1)) THEN | 
    
    | 120 |  |  |         qmin = ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2 | 
    
    | 121 |  |  |         kmin = kap*zlev(ig, k)*qmin | 
    
    | 122 |  |  |       ELSE | 
    
    | 123 |  |  |         kmin = 0. ! kmin n'est utilise que pour les SL stables. | 
    
    | 124 |  |  |       END IF | 
    
    | 125 |  |  |       kn(ig, k) = kmin | 
    
    | 126 |  |  |       km(ig, k) = kmin | 
    
    | 127 |  |  |     END DO | 
    
    | 128 |  |  |   END DO | 
    
    | 129 |  |  |  | 
    
    | 130 |  |  |  | 
    
    | 131 |  |  |   RETURN | 
    
    | 132 |  |  | END SUBROUTINE coefkzmin |