[1160] | 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 |
---|
[2464] | 6 | SUBROUTINE phytrac_emiss (debutphy, |
---|
[1160] | 7 | I lafin, |
---|
| 8 | I nqmax, |
---|
| 9 | I nlon, |
---|
[2464] | 10 | I nlev, |
---|
[1160] | 11 | I pdtphys, |
---|
[2464] | 12 | I paprs, |
---|
[1160] | 13 | I xlat,xlon, |
---|
| 14 | O tr_seri) |
---|
[2464] | 15 | |
---|
| 16 | |
---|
[1160] | 17 | |
---|
| 18 | c====================================================================== |
---|
| 19 | c Auteur(s) FH |
---|
| 20 | c Objet: Moniteur general des tendances traceurs |
---|
| 21 | c |
---|
| 22 | cAA Remarques en vrac: |
---|
| 23 | cAA-------------------- |
---|
| 24 | cAA 1/ le call phytrac se fait avec nqmax |
---|
| 25 | c |
---|
| 26 | c SL: Janvier 2014 |
---|
| 27 | c Version developed for surface emission |
---|
| 28 | c Maybe could be used just to compute the 'source' variable from physiq |
---|
| 29 | c |
---|
| 30 | c====================================================================== |
---|
[2464] | 31 | use infotrac_phy, only: tname, nqtot |
---|
| 32 | #ifdef CPP_XIOS |
---|
| 33 | use xios_output_mod, only: send_xios_field |
---|
| 34 | #endif |
---|
[1160] | 35 | use dimphy |
---|
[1543] | 36 | USE geometry_mod, only: cell_area |
---|
[1519] | 37 | USE chemparam_mod,only:M_tr |
---|
[1530] | 38 | USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat |
---|
[1160] | 39 | IMPLICIT none |
---|
| 40 | #include "YOMCST.h" |
---|
| 41 | #include "clesphys.h" |
---|
[2464] | 42 | |
---|
[1160] | 43 | c====================================================================== |
---|
| 44 | |
---|
| 45 | c Arguments: |
---|
| 46 | |
---|
| 47 | c EN ENTREE: |
---|
| 48 | c ========== |
---|
| 49 | |
---|
| 50 | logical debutphy ! le flag de l'initialisation de la physique |
---|
| 51 | logical lafin ! le flag de la fin de la physique |
---|
| 52 | integer nqmax ! nombre de traceurs auxquels on applique la physique |
---|
| 53 | integer nlon ! nombre de points horizontaux |
---|
| 54 | integer nlev ! nombre de couches verticales |
---|
| 55 | real pdtphys ! pas d'integration pour la physique (seconde) |
---|
| 56 | real paprs(nlon,nlev+1) ! pression pour chaque inter-couche (en Pa) |
---|
| 57 | REAL xlat(nlon) ! latitudes pour chaque point |
---|
| 58 | REAL xlon(nlon) ! longitudes pour chaque point |
---|
| 59 | |
---|
| 60 | c EN ENTREE/SORTIE: |
---|
| 61 | c ================= |
---|
| 62 | |
---|
| 63 | real tr_seri(nlon,nlev,nqmax) ! traceur |
---|
| 64 | |
---|
| 65 | cAA ---------------------------- |
---|
| 66 | cAA VARIABLES LOCALES TRACEURS |
---|
| 67 | cAA ---------------------------- |
---|
| 68 | |
---|
[2464] | 69 | c pour emission type effusion |
---|
[1160] | 70 | real :: deltatr(klon,klev,nqtot) |
---|
| 71 | |
---|
| 72 | |
---|
[2464] | 73 | |
---|
| 74 | |
---|
| 75 | integer,parameter :: nblat=3,nblon=3,nbaire=3,nbflux=2,maxcell=16 |
---|
| 76 | integer,parameter :: Nheight=3 ! layer emission (150m) |
---|
| 77 | integer,save :: Ncell(nbaire) |
---|
| 78 | real,save :: flux_surface_co2(nbflux) ! flux de CO2 emis (kg/m2/s) |
---|
| 79 | real :: flux(nlon,nqtot) |
---|
| 80 | real,save :: lat_zone(nblat),lon_zone(nblon) |
---|
| 81 | integer,save :: ig_zone(nblat,nblon,nbaire,nbflux,maxcell) |
---|
| 82 | integer,save :: numcell(nblat,nblon,nbaire,nbflux) |
---|
| 83 | |
---|
| 84 | |
---|
[1160] | 85 | INTEGER i, k, it |
---|
[2464] | 86 | integer ilat,ilon,iaire,iflux,ipos |
---|
[1160] | 87 | real deltalat,deltalon |
---|
[2464] | 88 | |
---|
| 89 | |
---|
| 90 | |
---|
[1160] | 91 | c====================================================================== |
---|
| 92 | |
---|
[2464] | 93 | c EMISSIONS TRACEURS |
---|
[1160] | 94 | |
---|
| 95 | c--------- |
---|
| 96 | c debutphy |
---|
[1519] | 97 | c--------- |
---|
[1160] | 98 | if (debutphy) then |
---|
| 99 | |
---|
[1519] | 100 | print*,"DEBUT PHYTRAC" |
---|
| 101 | print*,"PHYTRAC: EMISSION" |
---|
[1160] | 102 | |
---|
[1519] | 103 | ALLOCATE(M_tr(nqtot)) |
---|
[2464] | 104 | M_tr(:)=44. ! CO2 |
---|
| 105 | |
---|
[1160] | 106 | C========================================================================= |
---|
[1519] | 107 | c Caracteristiques des traceurs emis: |
---|
[1160] | 108 | C========================================================================= |
---|
| 109 | |
---|
| 110 | c nombre total de traceur |
---|
[2464] | 111 | if (nblat*nblon*nbaire*nbflux+1 .gt. nqtot) then |
---|
| 112 | print*, nblat*nblon*nbaire*nbflux+1, nqtot |
---|
[1160] | 113 | write(*,*) "Attention, pas assez de traceurs" |
---|
| 114 | write(*,*) "le dernier sera bien le dernier" |
---|
[2464] | 115 | endif |
---|
| 116 | |
---|
[1160] | 117 | |
---|
[1519] | 118 | |
---|
| 119 | |
---|
[2464] | 120 | c flux de CO2 (kg/s/m2) |
---|
| 121 | flux_surface_co2(1) = 5.*10.**-9. |
---|
| 122 | flux_surface_co2(2) = 5.*10.**-15. |
---|
| 123 | |
---|
| 124 | c nombre de cellule pour le cote du carre d'aire |
---|
| 125 | Ncell(1)= 2 |
---|
| 126 | Ncell(2)= 3 |
---|
| 127 | Ncell(3)= 4 |
---|
| 128 | |
---|
| 129 | |
---|
| 130 | |
---|
| 131 | c localisation zone emission |
---|
| 132 | lat_zone(1) = 08. |
---|
| 133 | lat_zone(2) = -50. |
---|
| 134 | lat_zone(3) = 35. |
---|
| 135 | lon_zone(1) = -172. |
---|
| 136 | lon_zone(2) = -20. |
---|
| 137 | lon_zone(3) = 70. |
---|
| 138 | |
---|
| 139 | |
---|
[1530] | 140 | if ((nbp_lon*nbp_lat)==1) then ! running a 1D simulation |
---|
| 141 | deltalat=180. |
---|
| 142 | deltalon=360. |
---|
| 143 | else |
---|
| 144 | deltalat = 180./(nbp_lat-1) |
---|
| 145 | deltalon = 360./nbp_lon |
---|
| 146 | endif |
---|
[1160] | 147 | |
---|
[2464] | 148 | numcell(:,:,:,:)=0 |
---|
| 149 | ig_zone(:,:,:,:,:)=0 |
---|
[1160] | 150 | do i=1,nlon |
---|
| 151 | do ilat=1,nblat |
---|
| 152 | do ilon=1,nblon |
---|
[2464] | 153 | do iaire=1,nbaire |
---|
| 154 | |
---|
| 155 | if ((xlat(i).ge.lat_zone(ilat)) |
---|
| 156 | & .and.((xlat(i)-Ncell(iaire)*deltalat) |
---|
| 157 | & .lt.lat_zone(ilat)) |
---|
| 158 | & .and.(xlon(i).le.lon_zone(ilon)) |
---|
| 159 | & .and.((xlon(i)+Ncell(iaire)*deltalon) |
---|
| 160 | & .gt.lon_zone(ilon))) then |
---|
| 161 | |
---|
| 162 | do iflux=1,nbflux |
---|
| 163 | numcell(ilat,ilon,iaire,iflux)=numcell(ilat,ilon,iaire,iflux)+1 |
---|
| 164 | ig_zone(ilat,ilon,iaire,iflux,numcell(ilat,ilon,iaire,iflux))= i |
---|
| 165 | print*,"Lat,lon,naire,nflux,nlon=",ilat,ilon,iaire,iflux |
---|
| 166 | & ,i," OK" |
---|
| 167 | end do |
---|
| 168 | |
---|
| 169 | end if |
---|
| 170 | |
---|
| 171 | end do |
---|
[1519] | 172 | end do |
---|
| 173 | end do |
---|
| 174 | end do |
---|
[1160] | 175 | |
---|
[1519] | 176 | c Reinit des traceurs si necessaire |
---|
| 177 | if (reinit_trac) then |
---|
[2464] | 178 | tr_seri(:,:,:)=0. |
---|
| 179 | |
---|
| 180 | |
---|
[2135] | 181 | do i=1,klon |
---|
| 182 | do k=1,klev |
---|
[2464] | 183 | tr_seri(i,k,:)=1.-28/43.44*max(min(0.035, |
---|
| 184 | & 0.035*(1.-log(paprs(i,k)/6.e6)/log(9.e6/6.e6))),0.) |
---|
| 185 | end do |
---|
| 186 | end do |
---|
| 187 | endif |
---|
| 188 | |
---|
[1160] | 189 | C========================================================================= |
---|
| 190 | C========================================================================= |
---|
[1519] | 191 | ENDIF ! fin debutphy |
---|
[1160] | 192 | c------------- |
---|
| 193 | c fin debutphy |
---|
| 194 | c------------- |
---|
| 195 | |
---|
| 196 | c====================================================================== |
---|
[2464] | 197 | c Emission continue d'un traceur |
---|
[1519] | 198 | c necessite raz_date=1 dans run.def |
---|
| 199 | c et reinit_trac=y |
---|
[1160] | 200 | c====================================================================== |
---|
[1519] | 201 | deltatr(:,:,:) = 0. |
---|
[2464] | 202 | flux(:,:)=0. |
---|
[1160] | 203 | |
---|
[2464] | 204 | c emet les traceurs qui sont presents sur la grille |
---|
| 205 | do ilat = 1,nblat |
---|
| 206 | do ilon = 1,nblon |
---|
| 207 | do iaire = 1,nbaire |
---|
| 208 | do iflux = 1,nbflux |
---|
| 209 | |
---|
| 210 | it=min( (ilat-1)*nblon*nbflux*nbaire+(iaire-1)*nbflux |
---|
| 211 | & +(ilon-1)*nbaire*nbflux+iflux , nqtot ) |
---|
| 212 | |
---|
[1160] | 213 | |
---|
[1519] | 214 | c injection dans une seule cellule: |
---|
[1160] | 215 | c source en kg/kg/s |
---|
[1519] | 216 | c deltatr(i,Nheight(iz),it) = so2_quantity/(86400.*Nemiss) ! kg/s |
---|
| 217 | c $ *RG/( area_emiss(ilat,ilon) |
---|
| 218 | c $ *(paprs(i,Nheight(iz))-paprs(i,Nheight(iz)+1)) ) ! /kg (masse cellule) |
---|
| 219 | |
---|
| 220 | c tr_seri(i,Nheight(iz),it) = tr_seri(i,Nheight(iz),it) |
---|
| 221 | c $ + deltatr(i,Nheight(iz),it)*pdtphys |
---|
[1160] | 222 | |
---|
[1519] | 223 | c injection dans toute la colonne (a faire): |
---|
[2464] | 224 | do ipos=1,maxcell |
---|
| 225 | |
---|
| 226 | if (ig_zone(ilat,ilon,iaire,iflux,ipos).ne.0) then |
---|
| 227 | |
---|
| 228 | i=ig_zone(ilat,ilon,iaire,iflux,ipos) |
---|
| 229 | flux(i,it)=flux_surface_co2(iflux) |
---|
| 230 | |
---|
| 231 | do k=1,Nheight |
---|
| 232 | deltatr(i,k,it) = flux_surface_co2(iflux) ! kg/s/m2 |
---|
| 233 | $ *RG/(paprs(i,1)-paprs(i,Nheight+1)) ! /kg (masse colonne) |
---|
[1519] | 234 | |
---|
[2464] | 235 | tr_seri(i,k,it) = tr_seri(i,k,it)+deltatr(i,k,it)*pdtphys |
---|
| 236 | end do |
---|
| 237 | |
---|
| 238 | end if |
---|
[1160] | 239 | end do |
---|
[2464] | 240 | |
---|
[1519] | 241 | end do |
---|
| 242 | end do |
---|
[2464] | 243 | end do |
---|
| 244 | end do |
---|
[1519] | 245 | |
---|
| 246 | |
---|
[1160] | 247 | c====================================================================== |
---|
| 248 | c====================================================================== |
---|
| 249 | |
---|
[2464] | 250 | |
---|
| 251 | |
---|
| 252 | |
---|
| 253 | |
---|
| 254 | #ifdef CPP_XIOS |
---|
| 255 | do it=1,nqtot |
---|
| 256 | CALL send_xios_field("flux_"//tname(it), |
---|
| 257 | & flux(:,it)) |
---|
| 258 | end do |
---|
| 259 | #endif |
---|
| 260 | |
---|
| 261 | |
---|
| 262 | |
---|
[1160] | 263 | RETURN |
---|
| 264 | END |
---|