[3] | 1 | ! |
---|
| 2 | ! $Header: /home/cvsroot/LMDZ4/libf/phylmd/phytrac.F,v 1.16 2006/03/24 15:06:23 lmdzadmin Exp $ |
---|
| 3 | ! |
---|
| 4 | c |
---|
| 5 | c |
---|
[1160] | 6 | SUBROUTINE phytrac_relax (debutphy,lafin, |
---|
[3] | 7 | I nqmax, |
---|
| 8 | I nlon, |
---|
| 9 | I nlev, |
---|
| 10 | I pdtphys, |
---|
| 11 | I pplay, |
---|
| 12 | O tr_seri) |
---|
| 13 | |
---|
| 14 | c====================================================================== |
---|
| 15 | c Auteur(s) FH |
---|
| 16 | c Objet: Moniteur general des tendances traceurs |
---|
| 17 | c |
---|
| 18 | cAA Remarques en vrac: |
---|
| 19 | cAA-------------------- |
---|
| 20 | cAA 1/ le call phytrac se fait avec nqmax |
---|
[1160] | 21 | c |
---|
| 22 | c SL: Janvier 2014 |
---|
| 23 | c Version developed by E. Marcq for pseudo-chemistry relaxation |
---|
| 24 | c See Marcq&Lebonnois 2013. |
---|
| 25 | c |
---|
[3] | 26 | c====================================================================== |
---|
[101] | 27 | USE ioipsl |
---|
| 28 | USE infotrac |
---|
| 29 | USE control_mod |
---|
| 30 | use dimphy |
---|
| 31 | USE comgeomphy |
---|
| 32 | IMPLICIT none |
---|
[3] | 33 | #include "YOMCST.h" |
---|
| 34 | #include "dimensions.h" |
---|
[1160] | 35 | #include "clesphys.h" |
---|
[3] | 36 | #include "temps.h" |
---|
| 37 | #include "paramet.h" |
---|
| 38 | c====================================================================== |
---|
| 39 | |
---|
| 40 | c Arguments: |
---|
[1160] | 41 | |
---|
[3] | 42 | c EN ENTREE: |
---|
| 43 | c ========== |
---|
[1160] | 44 | |
---|
| 45 | logical debutphy ! le flag de l'initialisation de la physique |
---|
| 46 | logical lafin ! le flag de la fin de la physique |
---|
| 47 | integer nqmax ! nombre de traceurs auxquels on applique la physique |
---|
[3] | 48 | integer nlon ! nombre de points horizontaux |
---|
| 49 | integer nlev ! nombre de couches verticales |
---|
| 50 | real pdtphys ! pas d'integration pour la physique (seconde) |
---|
| 51 | real pplay(nlon,nlev) ! pression pour le mileu de chaque couche (en Pa) |
---|
| 52 | |
---|
[1160] | 53 | c EN ENTREE/SORTIE: |
---|
| 54 | c ================= |
---|
| 55 | |
---|
| 56 | real tr_seri(nlon,nlev,nqmax) ! traceur |
---|
| 57 | |
---|
[3] | 58 | cAA ---------------------------- |
---|
| 59 | cAA VARIABLES LOCALES TRACEURS |
---|
| 60 | cAA ---------------------------- |
---|
| 61 | |
---|
| 62 | C les traceurs |
---|
[1160] | 63 | |
---|
[3] | 64 | c=================== |
---|
| 65 | c it--------indice de traceur |
---|
| 66 | c k,i---------indices long, vert |
---|
| 67 | c=================== |
---|
| 68 | c Variables deja declarees dont on a besoin pour traceurs |
---|
[1160] | 69 | c k,i,it,tr_seri(nlon,nlev,nqmax),pplay(nlon,nlev), |
---|
[3] | 70 | integer nqCO_OCS |
---|
| 71 | c real pzero,gamma |
---|
| 72 | c parameter (pzero=85000.) |
---|
| 73 | c parameter (gamma=5000.) |
---|
| 74 | REAL alpha |
---|
[1160] | 75 | real deltatr(nlon,nlev,nqtot) ! ecart au profil de ref zprof |
---|
[101] | 76 | real,save,allocatable :: zprof(:,:) |
---|
| 77 | real,save,allocatable :: tau(:,:) ! temps de relaxation vers le profil (s) |
---|
[3] | 78 | c====================================================================== |
---|
[1160] | 79 | |
---|
[3] | 80 | INTEGER i, k, it |
---|
[1160] | 81 | |
---|
[3] | 82 | c Variables liees a l'ecriture de la bande histoire physique |
---|
[1160] | 83 | |
---|
[3] | 84 | c Variables locales pour effectuer les appels en serie |
---|
| 85 | c---------------------------------------------------- |
---|
[1160] | 86 | |
---|
| 87 | REAL d_tr(nlon,nlev) ! tendances de traceurs |
---|
| 88 | |
---|
[101] | 89 | character*20 modname |
---|
[3] | 90 | character*80 abort_message |
---|
| 91 | |
---|
| 92 | c====================================================================== |
---|
[101] | 93 | |
---|
[1160] | 94 | modname = 'phytrac_relax' |
---|
[3] | 95 | c TRACEURS TYPE CO ET OCS |
---|
[1160] | 96 | nqCO_OCS = 6 |
---|
[3] | 97 | |
---|
| 98 | c--------- |
---|
| 99 | c debutphy |
---|
| 100 | c--------- |
---|
[1160] | 101 | if (debutphy) then |
---|
| 102 | print*,"DEBUT PHYTRAC" |
---|
| 103 | print*,"PHYTRAC: RELAXATION" |
---|
| 104 | allocate(zprof(nlev,nqtot),tau(nlev,nqtot)) |
---|
| 105 | |
---|
[3] | 106 | c============================================================= |
---|
| 107 | c============================================================= |
---|
| 108 | c============================================================= |
---|
| 109 | c Initialisation des traceurs |
---|
| 110 | c============================================================= |
---|
| 111 | c============================================================= |
---|
| 112 | c============================================================= |
---|
| 113 | |
---|
| 114 | C========================================================================= |
---|
| 115 | C========================================================================= |
---|
[1160] | 116 | |
---|
[3] | 117 | c II) Declaration d'un profil vertical de traceur OK |
---|
| 118 | c |
---|
| 119 | c zprof = profil de rappel |
---|
| 120 | c |
---|
| 121 | c 1 -> CO ; 2 -> OCS |
---|
| 122 | c def des profils en log(a) = a * log(P) + b par morceaux, cf. pollack et al |
---|
| 123 | c tr_seri en ppm |
---|
| 124 | c (initialisation seulement si ceux-ci sont nuls) |
---|
| 125 | |
---|
| 126 | c ICI, ON UTILISE 3 CONSTANTES DE TEMPS DIFFERENTES POUR CHAQUE, |
---|
| 127 | c DONC TRACEURS 1 A 3 POUR CO ET 4 A 6 POUR OCS |
---|
| 128 | C========================================================================= |
---|
| 129 | |
---|
| 130 | |
---|
| 131 | c Constantes de rappel: |
---|
| 132 | |
---|
| 133 | print*,"INIT TAU" |
---|
[1160] | 134 | do k=1,nlev |
---|
[3] | 135 | tau(k,1)=1.e6 |
---|
| 136 | tau(k,2)=1.e7 |
---|
| 137 | tau(k,3)=1.e8 |
---|
| 138 | tau(k,4)=1.e6 |
---|
| 139 | tau(k,5)=1.e7 |
---|
| 140 | tau(k,6)=1.e8 |
---|
| 141 | enddo |
---|
| 142 | |
---|
| 143 | c CO |
---|
| 144 | |
---|
| 145 | do it=1,3 |
---|
| 146 | print*,"INIT ZPROF ",tname(it) |
---|
[1160] | 147 | do k=1,nlev |
---|
[3] | 148 | zprof(k,it)=0. |
---|
| 149 | c pour l'instant, tau fixe, mais possibilite de le faire varier avec z |
---|
[1160] | 150 | if (pplay(nlon/2,k) >= 4.8e6) then |
---|
[3] | 151 | zprof(k,it)=14. |
---|
| 152 | endif |
---|
[1160] | 153 | if ((pplay(nlon/2,k)<=4.8e6).and.(pplay(nlon/2,k)>=1.9e6)) then |
---|
| 154 | alpha=(log(pplay(nlon/2,k))-log(1.9e6))/ |
---|
[3] | 155 | . (log(4.8e6)-log(1.9e6)) |
---|
| 156 | zprof(k,it)=20.*(14./20.)**alpha |
---|
| 157 | endif |
---|
[1160] | 158 | if ((pplay(nlon/2,k)<=1.9e6).and.(pplay(nlon/2,k)>=1.5e5)) then |
---|
| 159 | alpha=(log(pplay(nlon/2,k))-log(1.5e5))/ |
---|
[3] | 160 | . (log(1.9e6)-log(1.5e5)) |
---|
| 161 | zprof(k,it)=39.*(20./39.)**alpha |
---|
| 162 | endif |
---|
[1160] | 163 | if ((pplay(nlon/2,k)<=1.5e5).and.(pplay(nlon/2,k)>=1.1e4)) then |
---|
| 164 | alpha=(log(pplay(nlon/2,k))-log(1.1e4))/ |
---|
[3] | 165 | . (log(2.73e5)-log(1.1e4)) |
---|
| 166 | zprof(k,it)=50.*(39./50.)**alpha |
---|
| 167 | endif |
---|
[1160] | 168 | if ((pplay(nlon/2,k)<=1.1e4).and.(pplay(nlon/2,k)>=1.3e3)) then |
---|
| 169 | alpha=(log(pplay(nlon/2,k))-log(1.3e3))/ |
---|
[3] | 170 | . (log(1.1e4)-log(1.3e3)) |
---|
| 171 | zprof(k,it)=2.*(50./2.)**alpha |
---|
| 172 | endif |
---|
[1160] | 173 | if ((pplay(nlon/2,k)<=1.3e3).and.(pplay(nlon/2,k)>=2.4)) then |
---|
| 174 | alpha=(log(pplay(nlon/2,k))-log(2.4))/ |
---|
[3] | 175 | . (log(1.3e3)-log(2.4)) |
---|
| 176 | zprof(k,it)=1000.*(2./1000.)**alpha |
---|
| 177 | endif |
---|
[1160] | 178 | if (pplay(nlon/2,k) <= 2.4) then |
---|
[3] | 179 | zprof(k,it)=1000. |
---|
| 180 | endif |
---|
| 181 | enddo |
---|
| 182 | print*,zprof(:,it) |
---|
| 183 | |
---|
| 184 | c OCS |
---|
| 185 | print*,"INIT ZPROF ",tname(it+3) |
---|
[1160] | 186 | do k=1,nlev |
---|
[3] | 187 | zprof(k,it+3)=0. |
---|
[1160] | 188 | if (pplay(nlon/2,k) >= 4.8e6) then |
---|
[3] | 189 | zprof(k,it+3)=30. |
---|
| 190 | endif |
---|
[1160] | 191 | if ((pplay(nlon/2,k)<=4.8e6).and.(pplay(nlon/2,k)>=9.4e5)) |
---|
[3] | 192 | * then |
---|
[1160] | 193 | alpha=(log(pplay(nlon/2,k))-log(9.4e5))/ |
---|
[3] | 194 | * (log(4.8e6)-log(9.4e5)) |
---|
| 195 | zprof(k,it+3)=20.*(30/20.)**alpha |
---|
| 196 | endif |
---|
[1160] | 197 | if ((pplay(nlon/2,k)<=9.4e5).and.(pplay(nlon/2,k)>=4.724e5)) |
---|
[3] | 198 | * then |
---|
[1160] | 199 | alpha=(log(pplay(nlon/2,k))-log(4.724e5))/ |
---|
[3] | 200 | * (log(9.4e5)-log(4.724e5)) |
---|
| 201 | zprof(k,it+3)=0.5*(20/0.5)**alpha |
---|
| 202 | endif |
---|
[1160] | 203 | if ((pplay(nlon/2,k)<=4.724e5).and.(pplay(nlon/2,k)>=1.1e4)) |
---|
[3] | 204 | * then |
---|
[1160] | 205 | alpha=(log(pplay(nlon/2,k))-log(1.1e4))/ |
---|
[3] | 206 | * (log(4.724e5)-log(1.1e4)) |
---|
| 207 | zprof(k,it+3)=0.005*(0.5/0.005)**alpha |
---|
| 208 | endif |
---|
[1160] | 209 | if (pplay(nlon/2,k)<=1.1e4) then |
---|
[3] | 210 | zprof(k,it+3)=0. |
---|
| 211 | endif |
---|
| 212 | end do |
---|
| 213 | print*,zprof(:,it+3) |
---|
| 214 | enddo |
---|
| 215 | |
---|
| 216 | c Initialisation du traceur s'il est nul: |
---|
| 217 | do it=1,nqCO_OCS |
---|
[1160] | 218 | if ((tr_seri(nlon/2,1,it).eq.0.).and. |
---|
| 219 | . (tr_seri(nlon/2,nlev/2,it).eq.0.).and. |
---|
| 220 | . (tr_seri(nlon/2,nlev,it).eq.0.)) then |
---|
[3] | 221 | print*,"INITIALISATION DE ",tname(it) |
---|
[1160] | 222 | do k=1,nlev |
---|
| 223 | do i=1,nlon |
---|
[3] | 224 | tr_seri(i,k,it) = zprof(k,it) |
---|
| 225 | enddo |
---|
| 226 | enddo |
---|
| 227 | endif |
---|
| 228 | enddo |
---|
| 229 | |
---|
| 230 | C========================================================================= |
---|
| 231 | C========================================================================= |
---|
| 232 | |
---|
| 233 | c------------- |
---|
| 234 | c fin debutphy |
---|
| 235 | c------------- |
---|
| 236 | ENDIF ! fin debutphy |
---|
| 237 | |
---|
| 238 | c====================================================================== |
---|
| 239 | c Rappel vers un profil |
---|
| 240 | c====================================================================== |
---|
| 241 | do it=1,nqCO_OCS |
---|
[1160] | 242 | do k=1,nlev |
---|
| 243 | do i=1,nlon |
---|
[3] | 244 | c VERIF |
---|
| 245 | if (tr_seri(i,k,it).lt.0) then |
---|
| 246 | print*,"Traceur negatif AVANT rappel:",i,k,it |
---|
| 247 | stop |
---|
| 248 | endif |
---|
| 249 | c FIN VERIF |
---|
| 250 | |
---|
| 251 | deltatr(i,k,it) = (-tr_seri(i,k,it)+zprof(k,it))/tau(k,it) |
---|
| 252 | tr_seri(i,k,it) = tr_seri(i,k,it) + deltatr(i,k,it)*pdtphys |
---|
| 253 | |
---|
| 254 | c VERIF |
---|
| 255 | if (tr_seri(i,k,it).lt.0) then |
---|
| 256 | print*,"APRES rappel:",i,k,it, |
---|
| 257 | . deltatr(i,k,it),zprof(k,it),tr_seri(i,k,it),pdtphys/tau(k,it) |
---|
| 258 | stop |
---|
| 259 | endif |
---|
| 260 | c FIN VERIF |
---|
| 261 | enddo |
---|
| 262 | enddo |
---|
| 263 | enddo |
---|
| 264 | |
---|
| 265 | c====================================================================== |
---|
| 266 | c====================================================================== |
---|
| 267 | |
---|
| 268 | |
---|
| 269 | RETURN |
---|
| 270 | END |
---|
| 271 | |
---|
| 272 | |
---|