source: lmdz_wrf/branches/LMDZ_WRFmeas/WRFV3/lmdz/cltracrn.F90 @ 27

Last change on this file since 27 was 1, checked in by lfita, 10 years ago
  • -- --- Opening of the WRF+LMDZ coupling repository --- -- -

WRF: version v3.3
LMDZ: version v1818

More details in:

File size: 11.0 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  PRINT *,'  Lluis in cltracrn: ftsol', ftsol(550,:)
93  PRINT *,'    UBOUND tr: ',UBOUND(tr),' trs: ',UBOUND(trs)
94  PRINT *,'    tr: ', tr(550,:),' trs: ', trs(550)
95 
96  DO i = 1,klon
97     zts(i) = 0.
98  ENDDO
99
100  DO n=1,nbsrf
101     DO i = 1,klon
102        zts(i) = zts(i) + ftsol(i,n)*pctsrf(i,n)
103     ENDDO
104  ENDDO
105
106  DO i = 1,klon
107     rotrhi(i) = RD * zts(i) / hsoltr
108  ENDDO
109
110  DO k = 1, klev
111     DO i = 1, klon
112        local_tr(i,k) = tr(i,k)
113     ENDDO
114  ENDDO
115
116  DO i = 1, klon
117     local_trs(i) = trs(i)
118  ENDDO
119!======================================================================
120!AA   Attention si dans clmain zx_alf1(i) = 1.0
121!AA   Il doit y avoir coherence (dc la meme chose ici)
122
123  DO i = 1, klon
124!AA         zx_alpha1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2))
125     zx_alpha1(i) = 1.0
126     zx_alpha2(i) = 1.0 - zx_alpha1(i)
127  ENDDO
128!======================================================================
129  DO i = 1, klon
130     zx_coef(i,1) = cdrag(i)*(1.0+SQRT(u1lay(i)**2+v1lay(i)**2)) &
131          *pplay(i,1)/(RD*t(i,1))
132     zx_coef(i,1) = zx_coef(i,1) * dtime*RG
133  ENDDO
134
135  DO k = 2, klev
136     DO i = 1, klon
137        zx_coef(i,k) = coef(i,k)*RG/(pplay(i,k-1)-pplay(i,k)) &
138             *(paprs(i,k)*2/(t(i,k)+t(i,k-1))/RD)**2
139        zx_coef(i,k) = zx_coef(i,k) * dtime*RG
140     ENDDO
141  ENDDO
142!======================================================================
143  DO i = 1, klon
144     zx_buf(i)      = delp(i,klev) + zx_coef(i,klev)
145     zx_ctr(i,klev) = local_tr(i,klev)*delp(i,klev)/zx_buf(i)
146     zx_dtr(i,klev) = zx_coef(i,klev) / zx_buf(i)
147  ENDDO
148
149  DO l = klev-1, 2 , -1
150     DO i = 1, klon
151        zx_buf(i) = delp(i,l)+zx_coef(i,l)      &
152             +zx_coef(i,l+1)*(1.-zx_dtr(i,l+1))
153 
154        zx_ctr(i,l) = ( local_tr(i,l)*delp(i,l) &
155             + zx_coef(i,l+1)*zx_ctr(i,l+1) )/zx_buf(i)
156        zx_dtr(i,l) = zx_coef(i,l) / zx_buf(i)
157     ENDDO
158  ENDDO
159
160  DO i = 1, klon
161     zx_buf(i) = delp(i,1) + zx_coef(i,2)*(1.-zx_dtr(i,2))  &
162          + masktr(i) * zx_coef(i,1)                        &
163          *( zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2) )
164
165     zx_ctr(i,1) = ( local_tr(i,1)*delp(i,1)                &
166          + zx_ctr(i,2)                                     &
167          *(zx_coef(i,2)                                    &
168          - masktr(i) * zx_coef(i,1)                        &
169          *zx_alpha2(i) ) ) / zx_buf(i)
170     zx_dtr(i,1) = masktr(i) * zx_coef(i,1) / zx_buf(i)
171  ENDDO
172!======================================================================
173! Calculer d'abord local_trs nouvelle quantite dans le reservoir
174! de sol
175!=====================================================================
176
177  DO i = 1, klon
178!-------------------------
179! Au dessus des continents
180!--
181! Le pb peut se deposer partout : vdeptr = 10-3 m/s
182! Le Rn est traiter commme une couche Brownienne puisque vdeptr = 0.
183!-------------------------------------------------------------------
184     IF ( NINT(masktr(i)) .EQ. 1 ) THEN
185        zx_trs(i) = local_trs(i)
186        zx_a = zx_trs(i)                                           &
187             +fshtr(i)*dtime*rotrhi(i)                             &
188             +rotrhi(i)*masktr(i)*zx_coef(i,1)/RG                  &
189             *(zx_ctr(i,1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)) &
190             +zx_alpha2(i)*zx_ctr(i,2))
191! Pour l'instant, pour aller vite, le depot sec est traite comme une decroissance
192        zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i,1)/RG            &
193             * (1.-zx_dtr(i,1)                                     &
194             *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)))             &
195             + dtime / tautr                                       &
196             + dtime * vdeptr / hsoltr
197        zx_trs(i) = zx_a / zx_b
198        local_trs(i) = zx_trs(i)
199     ENDIF
200!--------------------------------------------------------
201! Si on est entre 60N et 70N on divise par 2 l'emanation
202!--------------------------------------------------------
203
204     IF ( (itr.eq.id_rn.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60..AND.lat(i).LE.70.).OR.      &
205          (itr.eq.id_pb.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60..AND.lat(i).LE.70.) ) THEN
206        zx_trs(i) = local_trs(i)
207        zx_a = zx_trs(i)                                           &
208             +(fshtr(i)/2.)*dtime*rotrhi(i)                        &
209             +rotrhi(i)*masktr(i)*zx_coef(i,1)/RG                  &
210             *(zx_ctr(i,1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)) &
211             +zx_alpha2(i)*zx_ctr(i,2))
212        !
213        zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i,1)/RG  &
214             * (1.-zx_dtr(i,1)                           &
215             *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)))   &
216             + dtime / tautr                             &
217             + dtime * vdeptr / hsoltr
218        !
219        zx_trs(i) = zx_a / zx_b
220        local_trs(i) = zx_trs(i)
221     ENDIF
222
223!----------------------------------------------
224! Au dessus des oceans et aux hautes latitudes
225!--
226! au dessous de -60S  pas d'emission de radon au dessus
227! des oceans et des continents
228!---------------------------------------------------------------
229
230     IF ( (itr.EQ.id_rn.AND.NINT(masktr(i)).EQ.0).OR.       &
231          (itr.EQ.id_rn.AND.NINT(masktr(i)).EQ.1.AND.lat(i).LT.-60.)) THEN
232        zx_trs(i) = 0.
233        local_trs(i) = 0.
234     END IF
235!--
236! au dessus de 70 N pas d'emission de radon au dessus
237! des oceans et des continents
238!--------------------------------------------------------------
239     IF ( (itr.EQ.id_rn.AND.NINT(masktr(i)).EQ.0).OR.    &
240          (itr.EQ.id_rn.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GT.70.)) THEN
241        zx_trs(i) = 0.
242        local_trs(i) = 0.
243     END IF
244!---------------------------------------------
245! Au dessus des oceans la source est nulle
246!--------------------------------------------
247
248     IF (itr.eq.id_rn.AND.NINT(masktr(i)).EQ.0) THEN
249        zx_trs(i) = 0.
250        local_trs(i) = 0.
251     END IF
252
253  ENDDO    ! sur le i=1,klon
254!
255!======================================================================
256! Une fois on a zx_trs, on peut faire l'iteration
257!======================================================================
258
259  DO i = 1, klon
260     local_tr(i,1) = zx_ctr(i,1)+zx_dtr(i,1)*zx_trs(i)
261  ENDDO
262  DO l = 2, klev
263     DO i = 1, klon
264        local_tr(i,l) = zx_ctr(i,l) + zx_dtr(i,l)*local_tr(i,l-1)
265     ENDDO
266  ENDDO
267!======================================================================
268! Calcul du flux de traceur (flux_tr): UA/(m**2 s)
269!======================================================================
270  DO i = 1, klon
271     flux_tr(i,1) = masktr(i)*zx_coef(i,1)/RG                      &
272          * (zx_alpha1(i)*local_tr(i,1)+zx_alpha2(i)*local_tr(i,2) &
273          -zx_trs(i)) / dtime
274  ENDDO
275  DO l = 2, klev
276     DO i = 1, klon
277        flux_tr(i,l) = zx_coef(i,l)/RG                    &
278             * (local_tr(i,l)-local_tr(i,l-1)) / dtime
279     ENDDO
280  ENDDO
281!======================================================================
282! Calcul des tendances du traceur ds le sol et dans l'atmosphere
283!======================================================================
284  DO l = 1, klev
285     DO i = 1, klon
286        d_tr(i,l) = local_tr(i,l) - tr(i,l)
287     ENDDO
288  ENDDO
289  DO i = 1, klon
290     d_trs(i) = local_trs(i) - trs(i)
291  ENDDO
292
293END SUBROUTINE cltracrn
Note: See TracBrowser for help on using the repository browser.