source: lmdz_wrf/trunk/WRFV3/lmdz/cltracrn.F90 @ 354

Last change on this file since 354 was 186, checked in by lfita, 10 years ago

Removing checking printings

File size: 10.8 KB
Line 
1
2!$Id $
3
4SUBROUTINE cltracrn( id_rn, id_pb, itr, dtime,u1lay, v1lay, &
5     cdrag,coef,t,ftsol,pctsrf,               &
6     tr,trs,paprs,pplay,delp,                 &
7     masktr,fshtr,hsoltr,tautr,vdeptr,        &
8     lat,d_tr,d_trs )
9 
10  USE dimphy
11  USE indice_sol_mod
12
13  IMPLICIT NONE
14!======================================================================
15! Auteur(s): Alex/LMD) date:  fev 99
16!            inspire de clqh + clvent
17! Objet: diffusion verticale de traceurs avec quantite de traceur ds
18!        le sol ( reservoir de sol de radon )
19!       
20! note : pour l'instant le traceur dans le sol et le flux sont
21!        calcules mais ils ne servent que de diagnostiques
22!        seule la tendance sur le traceur est sortie (d_tr)
23!---------------------------------------------------------------------
24! Arguments:
25! itr......input-R-  le type de traceur : id_rn(radon), id_pb(plomb)
26! dtime....input-R-  intervalle du temps (en secondes) ~ pdtphys
27! u1lay....input-R-  vent u de la premiere couche (m/s)
28! v1lay....input-R-  vent v de la premiere couche (m/s)
29! cdrag....input-R-  cdrag
30! coef.....input-R-  le coefficient d'echange (m**2/s) l>1, valable uniquement pour k entre 2 et klev
31! t........input-R-  temperature (K)
32! paprs....input-R-  pression a inter-couche (Pa)
33! pplay....input-R-  pression au milieu de couche (Pa)
34! delp.....input-R-  epaisseur de couche (Pa)
35! ftsol....input-R-  temperature du sol (en Kelvin)
36! tr.......input-R-  traceurs
37! trs......input-R-  traceurs dans le sol
38! masktr...input-R-  Masque reservoir de sol traceur (1 = reservoir)
39! fshtr....input-R-  Flux surfacique de production dans le sol
40! tautr....input-R-  Constante de decroissance du traceur
41! vdeptr...input-R-  Vitesse de depot sec dans la couche brownienne
42! hsoltr...input-R-  Epaisseur equivalente du reservoir de sol
43! lat......input-R-  latitude en degree
44! d_tr.....output-R- le changement de "tr"
45! d_trs....output-R- le changement de "trs"
46!======================================================================
47  include "YOMCST.h"
48!
49!Entrees
50  INTEGER,INTENT(IN)                     :: id_rn, id_pb
51  INTEGER,INTENT(IN)                     :: itr
52  REAL,INTENT(IN)                        :: dtime
53  REAL,DIMENSION(klon),INTENT(IN)        :: u1lay, v1lay
54  REAL,DIMENSION(klon),INTENT(IN)        :: cdrag
55  REAL,DIMENSION(klon,klev),INTENT(IN)   :: coef, t
56  REAL,DIMENSION(klon,nbsrf),INTENT(IN)  :: ftsol, pctsrf
57  REAL,DIMENSION(klon,klev),INTENT(IN)   :: tr
58  REAL,DIMENSION(klon),INTENT(IN)        :: trs
59  REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs
60  REAL,DIMENSION(klon,klev),INTENT(IN)   :: pplay, delp
61  REAL,DIMENSION(klon),INTENT(IN)        :: masktr
62  REAL,DIMENSION(klon),INTENT(IN)        :: fshtr
63  REAL,INTENT(IN)                        :: hsoltr
64  REAL,INTENT(IN)                        :: tautr
65  REAL,INTENT(IN)                        :: vdeptr
66  REAL,DIMENSION(klon),INTENT(IN)        :: lat   
67
68!Sorties
69  REAL,DIMENSION(klon,klev),INTENT(OUT) :: d_tr
70  REAL,DIMENSION(klon),INTENT(OUT) :: d_trs  ! (diagnostic) traceur ds le sol
71
72!Locales
73  REAL,DIMENSION(klon,klev) :: flux_tr  ! (diagnostic) flux de traceur
74  INTEGER                   :: i, k, n, l
75  REAL,DIMENSION(klon)      :: rotrhi
76  REAL,DIMENSION(klon,klev) :: zx_coef
77  REAL,DIMENSION(klon)      :: zx_buf
78  REAL,DIMENSION(klon,klev) :: zx_ctr
79  REAL,DIMENSION(klon,klev) :: zx_dtr
80  REAL,DIMENSION(klon)      :: zx_trs
81  REAL                      :: zx_a, zx_b
82 
83  REAL,DIMENSION(klon,klev) :: local_tr
84  REAL,DIMENSION(klon)      :: local_trs
85  REAL,DIMENSION(klon)      :: zts      ! champ de temperature du sol
86  REAL,DIMENSION(klon)      :: zx_alpha1, zx_alpha2
87!======================================================================
88!AA Pour l'instant les 4 types de surface ne sont pas pris en compte
89!AA On fabrique avec zts un champ de temperature de sol 
90!AA que le pondere par la fraction de nature de sol.
91
92  DO i = 1,klon
93     zts(i) = 0.
94  ENDDO
95
96  DO n=1,nbsrf
97     DO i = 1,klon
98        zts(i) = zts(i) + ftsol(i,n)*pctsrf(i,n)
99     ENDDO
100  ENDDO
101
102  DO i = 1,klon
103     rotrhi(i) = RD * zts(i) / hsoltr
104  ENDDO
105
106  DO k = 1, klev
107     DO i = 1, klon
108        local_tr(i,k) = tr(i,k)
109     ENDDO
110  ENDDO
111
112  DO i = 1, klon
113     local_trs(i) = trs(i)
114  ENDDO
115!======================================================================
116!AA   Attention si dans clmain zx_alf1(i) = 1.0
117!AA   Il doit y avoir coherence (dc la meme chose ici)
118
119  DO i = 1, klon
120!AA         zx_alpha1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2))
121     zx_alpha1(i) = 1.0
122     zx_alpha2(i) = 1.0 - zx_alpha1(i)
123  ENDDO
124!======================================================================
125  DO i = 1, klon
126     zx_coef(i,1) = cdrag(i)*(1.0+SQRT(u1lay(i)**2+v1lay(i)**2)) &
127          *pplay(i,1)/(RD*t(i,1))
128     zx_coef(i,1) = zx_coef(i,1) * dtime*RG
129  ENDDO
130
131  DO k = 2, klev
132     DO i = 1, klon
133        zx_coef(i,k) = coef(i,k)*RG/(pplay(i,k-1)-pplay(i,k)) &
134             *(paprs(i,k)*2/(t(i,k)+t(i,k-1))/RD)**2
135        zx_coef(i,k) = zx_coef(i,k) * dtime*RG
136     ENDDO
137  ENDDO
138!======================================================================
139  DO i = 1, klon
140     zx_buf(i)      = delp(i,klev) + zx_coef(i,klev)
141     zx_ctr(i,klev) = local_tr(i,klev)*delp(i,klev)/zx_buf(i)
142     zx_dtr(i,klev) = zx_coef(i,klev) / zx_buf(i)
143  ENDDO
144
145  DO l = klev-1, 2 , -1
146     DO i = 1, klon
147        zx_buf(i) = delp(i,l)+zx_coef(i,l)      &
148             +zx_coef(i,l+1)*(1.-zx_dtr(i,l+1))
149 
150        zx_ctr(i,l) = ( local_tr(i,l)*delp(i,l) &
151             + zx_coef(i,l+1)*zx_ctr(i,l+1) )/zx_buf(i)
152        zx_dtr(i,l) = zx_coef(i,l) / zx_buf(i)
153     ENDDO
154  ENDDO
155
156  DO i = 1, klon
157     zx_buf(i) = delp(i,1) + zx_coef(i,2)*(1.-zx_dtr(i,2))  &
158          + masktr(i) * zx_coef(i,1)                        &
159          *( zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2) )
160
161     zx_ctr(i,1) = ( local_tr(i,1)*delp(i,1)                &
162          + zx_ctr(i,2)                                     &
163          *(zx_coef(i,2)                                    &
164          - masktr(i) * zx_coef(i,1)                        &
165          *zx_alpha2(i) ) ) / zx_buf(i)
166     zx_dtr(i,1) = masktr(i) * zx_coef(i,1) / zx_buf(i)
167  ENDDO
168!======================================================================
169! Calculer d'abord local_trs nouvelle quantite dans le reservoir
170! de sol
171!=====================================================================
172
173  DO i = 1, klon
174!-------------------------
175! Au dessus des continents
176!--
177! Le pb peut se deposer partout : vdeptr = 10-3 m/s
178! Le Rn est traiter commme une couche Brownienne puisque vdeptr = 0.
179!-------------------------------------------------------------------
180     IF ( NINT(masktr(i)) .EQ. 1 ) THEN
181        zx_trs(i) = local_trs(i)
182        zx_a = zx_trs(i)                                           &
183             +fshtr(i)*dtime*rotrhi(i)                             &
184             +rotrhi(i)*masktr(i)*zx_coef(i,1)/RG                  &
185             *(zx_ctr(i,1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)) &
186             +zx_alpha2(i)*zx_ctr(i,2))
187! Pour l'instant, pour aller vite, le depot sec est traite comme une decroissance
188        zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i,1)/RG            &
189             * (1.-zx_dtr(i,1)                                     &
190             *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)))             &
191             + dtime / tautr                                       &
192             + dtime * vdeptr / hsoltr
193        zx_trs(i) = zx_a / zx_b
194        local_trs(i) = zx_trs(i)
195     ENDIF
196!--------------------------------------------------------
197! Si on est entre 60N et 70N on divise par 2 l'emanation
198!--------------------------------------------------------
199
200     IF ( (itr.eq.id_rn.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60..AND.lat(i).LE.70.).OR.      &
201          (itr.eq.id_pb.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60..AND.lat(i).LE.70.) ) THEN
202        zx_trs(i) = local_trs(i)
203        zx_a = zx_trs(i)                                           &
204             +(fshtr(i)/2.)*dtime*rotrhi(i)                        &
205             +rotrhi(i)*masktr(i)*zx_coef(i,1)/RG                  &
206             *(zx_ctr(i,1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)) &
207             +zx_alpha2(i)*zx_ctr(i,2))
208        !
209        zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i,1)/RG  &
210             * (1.-zx_dtr(i,1)                           &
211             *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)))   &
212             + dtime / tautr                             &
213             + dtime * vdeptr / hsoltr
214        !
215        zx_trs(i) = zx_a / zx_b
216        local_trs(i) = zx_trs(i)
217     ENDIF
218
219!----------------------------------------------
220! Au dessus des oceans et aux hautes latitudes
221!--
222! au dessous de -60S  pas d'emission de radon au dessus
223! des oceans et des continents
224!---------------------------------------------------------------
225
226     IF ( (itr.EQ.id_rn.AND.NINT(masktr(i)).EQ.0).OR.       &
227          (itr.EQ.id_rn.AND.NINT(masktr(i)).EQ.1.AND.lat(i).LT.-60.)) THEN
228        zx_trs(i) = 0.
229        local_trs(i) = 0.
230     END IF
231!--
232! au dessus de 70 N pas d'emission de radon au dessus
233! des oceans et des continents
234!--------------------------------------------------------------
235     IF ( (itr.EQ.id_rn.AND.NINT(masktr(i)).EQ.0).OR.    &
236          (itr.EQ.id_rn.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GT.70.)) THEN
237        zx_trs(i) = 0.
238        local_trs(i) = 0.
239     END IF
240!---------------------------------------------
241! Au dessus des oceans la source est nulle
242!--------------------------------------------
243
244     IF (itr.eq.id_rn.AND.NINT(masktr(i)).EQ.0) THEN
245        zx_trs(i) = 0.
246        local_trs(i) = 0.
247     END IF
248
249  ENDDO    ! sur le i=1,klon
250!
251!======================================================================
252! Une fois on a zx_trs, on peut faire l'iteration
253!======================================================================
254
255  DO i = 1, klon
256     local_tr(i,1) = zx_ctr(i,1)+zx_dtr(i,1)*zx_trs(i)
257  ENDDO
258  DO l = 2, klev
259     DO i = 1, klon
260        local_tr(i,l) = zx_ctr(i,l) + zx_dtr(i,l)*local_tr(i,l-1)
261     ENDDO
262  ENDDO
263!======================================================================
264! Calcul du flux de traceur (flux_tr): UA/(m**2 s)
265!======================================================================
266  DO i = 1, klon
267     flux_tr(i,1) = masktr(i)*zx_coef(i,1)/RG                      &
268          * (zx_alpha1(i)*local_tr(i,1)+zx_alpha2(i)*local_tr(i,2) &
269          -zx_trs(i)) / dtime
270  ENDDO
271  DO l = 2, klev
272     DO i = 1, klon
273        flux_tr(i,l) = zx_coef(i,l)/RG                    &
274             * (local_tr(i,l)-local_tr(i,l-1)) / dtime
275     ENDDO
276  ENDDO
277!======================================================================
278! Calcul des tendances du traceur ds le sol et dans l'atmosphere
279!======================================================================
280  DO l = 1, klev
281     DO i = 1, klon
282        d_tr(i,l) = local_tr(i,l) - tr(i,l)
283     ENDDO
284  ENDDO
285  DO i = 1, klon
286     d_trs(i) = local_trs(i) - trs(i)
287  ENDDO
288
289END SUBROUTINE cltracrn
Note: See TracBrowser for help on using the repository browser.