/[lmdze]/trunk/Sources/phylmd/cltracrn.f
ViewVC logotype

Annotation of /trunk/Sources/phylmd/cltracrn.f

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.21