source: trunk/LMDZ.VENUS/libf/phyvenus/phytrac_emiss.F @ 3461

Last change on this file since 3461 was 2464, checked in by slebonnois, 4 years ago

SL: major update related to extension to 250 km. New EUV heating as used in Martian GCM, debug of a few routines, adding He, clean up, updating mmean regularly, modification of the order of processes, add the possibility to use Hedin composition in rad transfer

File size: 7.3 KB
Line 
1!
2! $Header: /home/cvsroot/LMDZ4/libf/phylmd/phytrac.F,v 1.16 2006/03/24 15:06:23 lmdzadmin Exp $
3!
4c
5c
6      SUBROUTINE phytrac_emiss (debutphy,
7     I                    lafin,
8     I                    nqmax,
9     I                    nlon,
10     I                    nlev,
11     I                    pdtphys,
12     I                    paprs,
13     I                    xlat,xlon,
14     O                    tr_seri)
15     
16     
17
18c======================================================================
19c Auteur(s) FH
20c Objet: Moniteur general des tendances traceurs
21c
22cAA Remarques en vrac:
23cAA--------------------
24cAA 1/ le call phytrac se fait avec nqmax
25c
26c SL: Janvier 2014
27c Version developed for surface emission
28c Maybe could be used just to compute the 'source' variable from physiq
29c
30c======================================================================
31      use infotrac_phy, only: tname, nqtot
32#ifdef CPP_XIOS     
33      use xios_output_mod, only:  send_xios_field
34#endif
35      use dimphy
36      USE geometry_mod, only: cell_area
37      USE chemparam_mod,only:M_tr
38      USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat
39      IMPLICIT none
40#include "YOMCST.h"
41#include "clesphys.h"
42     
43c======================================================================
44
45c Arguments:
46
47c   EN ENTREE:
48c   ==========
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
60c   EN ENTREE/SORTIE:
61c   =================
62
63      real tr_seri(nlon,nlev,nqmax) ! traceur 
64
65cAA ----------------------------
66cAA  VARIABLES LOCALES TRACEURS
67cAA ----------------------------
68
69c pour emission type effusion
70      real :: deltatr(klon,klev,nqtot)
71
72
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
85      INTEGER i, k, it
86      integer ilat,ilon,iaire,iflux,ipos
87      real    deltalat,deltalon
88     
89
90
91c======================================================================
92
93c EMISSIONS TRACEURS
94
95c---------
96c debutphy
97c---------     
98      if (debutphy) then
99
100        print*,"DEBUT PHYTRAC"
101        print*,"PHYTRAC: EMISSION"
102
103        ALLOCATE(M_tr(nqtot))
104        M_tr(:)=44.                ! CO2
105
106C=========================================================================
107c Caracteristiques des traceurs emis:
108C=========================================================================
109
110c nombre total de traceur
111         if (nblat*nblon*nbaire*nbflux+1 .gt. nqtot) then
112            print*, nblat*nblon*nbaire*nbflux+1, nqtot
113            write(*,*) "Attention, pas assez de traceurs"
114            write(*,*) "le dernier sera bien le dernier"
115         endif
116                 
117
118
119
120c flux de CO2 (kg/s/m2)
121         flux_surface_co2(1) = 5.*10.**-9.
122         flux_surface_co2(2) = 5.*10.**-15.
123
124c 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
131c 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 
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
147
148         numcell(:,:,:,:)=0
149         ig_zone(:,:,:,:,:)=0
150         do i=1,nlon
151          do ilat=1,nblat
152           do ilon=1,nblon
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
172           end do
173          end do
174         end do
175
176c Reinit des traceurs si necessaire
177         if (reinit_trac) then
178          tr_seri(:,:,:)=0.
179
180
181           do i=1,klon
182            do k=1,klev
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 
189C=========================================================================
190C=========================================================================
191      ENDIF  ! fin debutphy
192c-------------
193c fin debutphy
194c-------------
195
196c======================================================================
197c Emission continue d'un traceur
198c necessite raz_date=1 dans run.def
199c et reinit_trac=y
200c======================================================================
201       deltatr(:,:,:) = 0.
202       flux(:,:)=0.
203
204c 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 
213
214c injection dans une seule cellule:
215c source en kg/kg/s
216c            deltatr(i,Nheight(iz),it) = so2_quantity/(86400.*Nemiss) ! kg/s
217c     $ *RG/( area_emiss(ilat,ilon)
218c     $      *(paprs(i,Nheight(iz))-paprs(i,Nheight(iz)+1)) )    ! /kg (masse cellule)
219     
220c            tr_seri(i,Nheight(iz),it) = tr_seri(i,Nheight(iz),it)
221c     $      + deltatr(i,Nheight(iz),it)*pdtphys
222
223c injection dans toute la colonne (a faire):
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)
234     
235               tr_seri(i,k,it) = tr_seri(i,k,it)+deltatr(i,k,it)*pdtphys
236            end do
237
238           end if
239          end do
240 
241        end do
242        end do
243        end do
244        end do
245
246       
247c======================================================================
248c======================================================================
249
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
263      RETURN
264      END
Note: See TracBrowser for help on using the repository browser.