| Line | Branch | Exec | Source | 
    
      | 1 |  |  |  | 
    
      | 2 |  |  | ! $Header$ | 
    
      | 3 |  |  |  | 
    
      | 4 |  | ✗ | SUBROUTINE flxtr(pdtime, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, pt, pplay, & | 
    
      | 5 |  | ✗ | paprs, kcbot, kctop, kdtop, x, dx) | 
    
      | 6 |  |  | USE dimphy | 
    
      | 7 |  |  | IMPLICIT NONE | 
    
      | 8 |  |  | ! ===================================================================== | 
    
      | 9 |  |  | ! Objet : Melange convectif de traceurs a partir des flux de masse | 
    
      | 10 |  |  | ! Date : 13/12/1996 -- 13/01/97 | 
    
      | 11 |  |  | ! Auteur: O. Boucher (LOA) sur inspiration de Z. X. Li (LMD), | 
    
      | 12 |  |  | ! Brinkop et Sausen (1996) et Boucher et al. (1996). | 
    
      | 13 |  |  | ! ATTENTION : meme si cette routine se veut la plus generale possible, | 
    
      | 14 |  |  | ! elle a herite de certaines notations et conventions du | 
    
      | 15 |  |  | ! schema de Tiedtke (1993). | 
    
      | 16 |  |  | ! --En particulier, les couches sont numerotees de haut en bas !!! | 
    
      | 17 |  |  | ! Ceci est valable pour les flux, kcbot, kctop et kdtop | 
    
      | 18 |  |  | ! mais pas pour les entrees x, pplay, paprs !!!! | 
    
      | 19 |  |  | ! --Un schema amont est choisi pour calculer les flux pour s'assurer | 
    
      | 20 |  |  | ! de la positivite des valeurs de traceurs, cela implique des eqs | 
    
      | 21 |  |  | ! differentes pour les flux de traceurs montants et descendants. | 
    
      | 22 |  |  | ! --pmfu est positif, pmfd est negatif | 
    
      | 23 |  |  | ! --Tous les flux d'entrainements et de detrainements sont positifs | 
    
      | 24 |  |  | ! contrairement au schema de Tiedtke d'ou les changements de signe!!!! | 
    
      | 25 |  |  | ! ===================================================================== | 
    
      | 26 |  |  |  | 
    
      | 27 |  |  | include "YOMCST.h" | 
    
      | 28 |  |  | include "YOECUMF.h" | 
    
      | 29 |  |  |  | 
    
      | 30 |  |  | REAL pdtime | 
    
      | 31 |  |  | ! --les flux sont definis au 1/2 niveaux | 
    
      | 32 |  |  | ! --pmfu(klev+1) et pmfd(klev+1) sont implicitement nuls | 
    
      | 33 |  |  | REAL pmfu(klon, klev) ! flux de masse dans le panache montant | 
    
      | 34 |  |  | REAL pmfd(klon, klev) ! flux de masse dans le panache descendant | 
    
      | 35 |  |  | REAL pen_u(klon, klev) ! flux entraine dans le panache montant | 
    
      | 36 |  |  | REAL pde_u(klon, klev) ! flux detraine dans le panache montant | 
    
      | 37 |  |  | REAL pen_d(klon, klev) ! flux entraine dans le panache descendant | 
    
      | 38 |  |  | REAL pde_d(klon, klev) ! flux detraine dans le panache descendant | 
    
      | 39 |  |  | ! --idem mais en variables locales | 
    
      | 40 |  | ✗ | REAL zpen_u(klon, klev) | 
    
      | 41 |  | ✗ | REAL zpde_u(klon, klev) | 
    
      | 42 |  | ✗ | REAL zpen_d(klon, klev) | 
    
      | 43 |  | ✗ | REAL zpde_d(klon, klev) | 
    
      | 44 |  |  |  | 
    
      | 45 |  |  | REAL pplay(klon, klev) ! pression aux couches (bas en haut) | 
    
      | 46 |  | ✗ | REAL pap(klon, klev) ! pression aux couches (haut en bas) | 
    
      | 47 |  |  | REAL pt(klon, klev) ! temperature aux couches (bas en haut) | 
    
      | 48 |  | ✗ | REAL zt(klon, klev) ! temperature aux couches (haut en bas) | 
    
      | 49 |  |  | REAL paprs(klon, klev+1) ! pression aux 1/2 couches (bas en haut) | 
    
      | 50 |  | ✗ | REAL paph(klon, klev+1) ! pression aux 1/2 couches (haut en bas) | 
    
      | 51 |  |  | INTEGER kcbot(klon) ! niveau de base de la convection | 
    
      | 52 |  |  | INTEGER kctop(klon) ! niveau du sommet de la convection +1 | 
    
      | 53 |  |  | INTEGER kdtop(klon) ! niveau de sommet du panache descendant | 
    
      | 54 |  |  | REAL x(klon, klev) ! q de traceur (bas en haut) | 
    
      | 55 |  | ✗ | REAL zx(klon, klev) ! q de traceur (haut en bas) | 
    
      | 56 |  |  | REAL dx(klon, klev) ! tendance de traceur  (bas en haut) | 
    
      | 57 |  |  |  | 
    
      | 58 |  |  | ! --variables locales | 
    
      | 59 |  |  | ! --les flux de x sont definis aux 1/2 niveaux | 
    
      | 60 |  |  | ! --xu et xd sont definis aux niveaux complets | 
    
      | 61 |  | ✗ | REAL xu(klon, klev) ! q de traceurs dans le panache montant | 
    
      | 62 |  | ✗ | REAL xd(klon, klev) ! q de traceurs dans le panache descendant | 
    
      | 63 |  | ✗ | REAL xe(klon, klev) ! q de traceurs dans l'environnement | 
    
      | 64 |  | ✗ | REAL zmfux(klon, klev+1) ! flux de x dans le panache montant | 
    
      | 65 |  | ✗ | REAL zmfdx(klon, klev+1) ! flux de x dans le panache descendant | 
    
      | 66 |  | ✗ | REAL zmfex(klon, klev+1) ! flux de x dans l'environnement | 
    
      | 67 |  |  | INTEGER i, k | 
    
      | 68 |  |  | REAL zmfmin | 
    
      | 69 |  |  | PARAMETER (zmfmin=1.E-10) | 
    
      | 70 |  |  |  | 
    
      | 71 |  |  | ! On remet les taux d'entrainement et de detrainement dans le panache | 
    
      | 72 |  |  | ! descendant a des valeurs positives. | 
    
      | 73 |  |  | ! On ajuste les valeurs de pen_u, pen_d pde_u et pde_d pour que la | 
    
      | 74 |  |  | ! conservation de la masse soit realisee a chaque niveau dans les 2 | 
    
      | 75 |  |  | ! panaches. | 
    
      | 76 |  | ✗ | DO k = 1, klev | 
    
      | 77 |  | ✗ | DO i = 1, klon | 
    
      | 78 |  | ✗ | zpen_u(i, k) = pen_u(i, k) | 
    
      | 79 |  | ✗ | zpde_u(i, k) = pde_u(i, k) | 
    
      | 80 |  |  | END DO | 
    
      | 81 |  |  | END DO | 
    
      | 82 |  |  |  | 
    
      | 83 |  | ✗ | DO k = 1, klev - 1 | 
    
      | 84 |  | ✗ | DO i = 1, klon | 
    
      | 85 |  | ✗ | zpen_d(i, k) = -pen_d(i, k+1) | 
    
      | 86 |  | ✗ | zpde_d(i, k) = -pde_d(i, k+1) | 
    
      | 87 |  |  | END DO | 
    
      | 88 |  |  | END DO | 
    
      | 89 |  |  |  | 
    
      | 90 |  | ✗ | DO i = 1, klon | 
    
      | 91 |  | ✗ | zpen_d(i, klev) = 0.0 | 
    
      | 92 |  | ✗ | zpde_d(i, klev) = -pmfd(i, klev) | 
    
      | 93 |  |  | ! Correction 03 11 97 | 
    
      | 94 |  |  | ! zpen_d(i,kdtop(i)-1) = pmfd(i,kdtop(i)-1)-pmfd(i,kdtop(i)) | 
    
      | 95 |  | ✗ | IF (kdtop(i)==klev+1) THEN | 
    
      | 96 |  | ✗ | zpen_d(i, kdtop(i)-1) = pmfd(i, kdtop(i)-1) | 
    
      | 97 |  |  | ELSE | 
    
      | 98 |  | ✗ | zpen_d(i, kdtop(i)-1) = pmfd(i, kdtop(i)-1) - pmfd(i, kdtop(i)) | 
    
      | 99 |  |  | END IF | 
    
      | 100 |  |  |  | 
    
      | 101 |  | ✗ | zpde_u(i, kctop(i)-2) = pmfu(i, kctop(i)-1) | 
    
      | 102 |  | ✗ | zpen_u(i, klev) = pmfu(i, klev) | 
    
      | 103 |  |  | END DO | 
    
      | 104 |  |  |  | 
    
      | 105 |  | ✗ | DO i = 1, klon | 
    
      | 106 |  | ✗ | DO k = kcbot(i), klev - 1 | 
    
      | 107 |  | ✗ | zpen_u(i, k) = pmfu(i, k) - pmfu(i, k+1) | 
    
      | 108 |  |  | END DO | 
    
      | 109 |  |  | END DO | 
    
      | 110 |  |  |  | 
    
      | 111 |  |  | ! conversion des sens de notations bas-haut et haut-bas | 
    
      | 112 |  |  |  | 
    
      | 113 |  | ✗ | DO k = 1, klev + 1 | 
    
      | 114 |  | ✗ | DO i = 1, klon | 
    
      | 115 |  | ✗ | paph(i, klev+2-k) = paprs(i, k) | 
    
      | 116 |  |  | END DO | 
    
      | 117 |  |  | END DO | 
    
      | 118 |  |  |  | 
    
      | 119 |  | ✗ | DO i = 1, klon | 
    
      | 120 |  | ✗ | DO k = 1, klev | 
    
      | 121 |  | ✗ | pap(i, klev+1-k) = pplay(i, k) | 
    
      | 122 |  | ✗ | zt(i, klev+1-k) = pt(i, k) | 
    
      | 123 |  | ✗ | zx(i, klev+1-k) = x(i, k) | 
    
      | 124 |  |  | END DO | 
    
      | 125 |  |  | END DO | 
    
      | 126 |  |  |  | 
    
      | 127 |  |  | ! --initialisations des flux de traceurs aux extremites de la colonne | 
    
      | 128 |  |  |  | 
    
      | 129 |  | ✗ | DO i = 1, klon | 
    
      | 130 |  | ✗ | zmfux(i, klev+1) = 0.0 | 
    
      | 131 |  | ✗ | zmfdx(i, 1) = 0.0 | 
    
      | 132 |  | ✗ | zmfex(i, 1) = 0.0 | 
    
      | 133 |  |  | END DO | 
    
      | 134 |  |  |  | 
    
      | 135 |  |  | ! --calcul des flux dans le panache montant | 
    
      | 136 |  |  |  | 
    
      | 137 |  | ✗ | DO k = klev, 1, -1 | 
    
      | 138 |  | ✗ | DO i = 1, klon | 
    
      | 139 |  | ✗ | IF (k>=kcbot(i)) THEN | 
    
      | 140 |  | ✗ | xu(i, k) = zx(i, k) | 
    
      | 141 |  | ✗ | zmfux(i, k) = pmfu(i, k)*xu(i, k) | 
    
      | 142 |  |  | ELSE | 
    
      | 143 |  |  | zmfux(i, k) = (zmfux(i,k+1)+zpen_u(i,k)*zx(i,k))/ & | 
    
      | 144 |  | ✗ | (1.+zpde_u(i,k)/max(zmfmin,pmfu(i,k))) | 
    
      | 145 |  | ✗ | xu(i, k) = zmfux(i, k)/max(zmfmin, pmfu(i,k)) | 
    
      | 146 |  |  | END IF | 
    
      | 147 |  |  | END DO | 
    
      | 148 |  |  | END DO | 
    
      | 149 |  |  |  | 
    
      | 150 |  |  | ! --calcul des flux dans le panache descendant | 
    
      | 151 |  |  |  | 
    
      | 152 |  | ✗ | DO k = 1, klev - 1 | 
    
      | 153 |  | ✗ | DO i = 1, klon | 
    
      | 154 |  | ✗ | IF (k<=kdtop(i)-1) THEN | 
    
      | 155 |  | ✗ | xd(i, k) = (zx(i,k)+xu(i,k))/2. | 
    
      | 156 |  | ✗ | zmfdx(i, k+1) = pmfd(i, k+1)*xd(i, k) | 
    
      | 157 |  |  | ELSE | 
    
      | 158 |  |  | zmfdx(i, k+1) = (zmfdx(i,k)-zpen_d(i,k)*zx(i,k))/ & | 
    
      | 159 |  | ✗ | (1.-zpde_d(i,k)/min(-zmfmin,pmfd(i,k+1))) | 
    
      | 160 |  | ✗ | xd(i, k) = zmfdx(i, k+1)/min(-zmfmin, pmfd(i,k+1)) | 
    
      | 161 |  |  | END IF | 
    
      | 162 |  |  | END DO | 
    
      | 163 |  |  | END DO | 
    
      | 164 |  | ✗ | DO i = 1, klon | 
    
      | 165 |  | ✗ | zmfdx(i, klev+1) = 0.0 | 
    
      | 166 |  |  | xd(i, klev) = (zpen_d(i,klev)*zx(i,klev)-zmfdx(i,klev))/ & | 
    
      | 167 |  | ✗ | max(zmfmin, zpde_d(i,klev)) | 
    
      | 168 |  |  | END DO | 
    
      | 169 |  |  |  | 
    
      | 170 |  |  | ! --introduction du flux de retour dans l'environnement | 
    
      | 171 |  |  |  | 
    
      | 172 |  | ✗ | DO k = 1, klev - 1 | 
    
      | 173 |  | ✗ | DO i = 1, klon | 
    
      | 174 |  | ✗ | IF (k<=kctop(i)-3) THEN | 
    
      | 175 |  | ✗ | xe(i, k) = zx(i, k) | 
    
      | 176 |  | ✗ | zmfex(i, k+1) = -(pmfu(i,k+1)+pmfd(i,k+1))*xe(i, k) | 
    
      | 177 |  |  | ELSE | 
    
      | 178 |  |  | zmfex(i, k+1) = (zmfex(i,k)-(zpde_u(i,k)*xu(i,k)+zpde_d(i,k)*xd(i, & | 
    
      | 179 |  |  | k)))/(1.-(zpen_d(i,k)+zpen_u(i,k))/min(-zmfmin,-pmfu(i,k+1)-pmfd(i, & | 
    
      | 180 |  | ✗ | k+1))) | 
    
      | 181 |  | ✗ | xe(i, k) = zmfex(i, k+1)/min(-zmfmin, -pmfu(i,k+1)-pmfd(i,k+1)) | 
    
      | 182 |  |  | END IF | 
    
      | 183 |  |  | END DO | 
    
      | 184 |  |  | END DO | 
    
      | 185 |  | ✗ | DO i = 1, klon | 
    
      | 186 |  | ✗ | zmfex(i, klev+1) = 0.0 | 
    
      | 187 |  |  | xe(i, klev) = (zpde_u(i,klev)*xu(i,klev)+zpde_d(i,klev)*xd(i,klev)-zmfex( & | 
    
      | 188 |  | ✗ | i,klev))/max(zmfmin, zpen_u(i,klev)+zpen_d(i,klev)) | 
    
      | 189 |  |  | END DO | 
    
      | 190 |  |  |  | 
    
      | 191 |  |  | ! --calcul final des tendances | 
    
      | 192 |  |  |  | 
    
      | 193 |  | ✗ | DO k = 1, klev | 
    
      | 194 |  | ✗ | DO i = 1, klon | 
    
      | 195 |  |  | dx(i, klev+1-k) = rg/(paph(i,k+1)-paph(i,k))*pdtime* & | 
    
      | 196 |  |  | (zmfux(i,k+1)-zmfux(i,k)+zmfdx(i,k+1)-zmfdx(i,k)+zmfex(i,k+1)- & | 
    
      | 197 |  | ✗ | zmfex(i,k)) | 
    
      | 198 |  |  | END DO | 
    
      | 199 |  |  | END DO | 
    
      | 200 |  |  |  | 
    
      | 201 |  | ✗ | RETURN | 
    
      | 202 |  |  | END SUBROUTINE flxtr | 
    
      | 203 |  |  |  |