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