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

Annotation of /trunk/phylmd/cltracrn.f

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.21