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

Annotation of /trunk/phylmd/cltracrn.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 232 - (hide annotations)
Tue Nov 7 10:23:25 2017 UTC (6 years, 6 months ago) by guez
Original Path: trunk/Sources/phylmd/cltracrn.f
File size: 8060 byte(s)
Use separate variables for eddy diffusion and drag coefficient in
cltracrn (following LMDZ).

1 guez 78 module cltracrn_m
2 guez 3
3 guez 78 IMPLICIT none
4 guez 3
5 guez 78 contains
6 guez 3
7 guez 232 SUBROUTINE cltracrn(itr, dtime, u1lay, v1lay, coef, cdragh, t, ftsol, &
8     pctsrf, tr, trs, paprs, pplay, delp, masktr, fshtr, hsoltr, tautr, &
9     vdeptr, lat, d_tr, d_trs)
10 guez 3
11 guez 78 ! From phylmd/cltracrn.F, version 1.2 2005/05/25 13:10:09
12 guez 3
13 guez 156 ! Author: Alexandre ARMENGAUD
14     ! Date: February 1999
15 guez 78 ! Inspiré de clqh et clvent
16 guez 3
17 guez 78 ! Objet: diffusion verticale de traceurs avec quantité de traceur
18     ! dans le sol (réservoir de sol de radon)
19 guez 3
20 guez 78 ! Note : pour l'instant le traceur dans le sol et le flux sont
21     ! calculés mais ils ne servent que de diagnostics. Seule la
22     ! tendance sur le traceur est sortie (d_tr).
23 guez 3
24 guez 78 use indicesol, only: nbsrf
25     use dimphy, only: klon, klev
26     use SUPHEC_M, only: RD, rg
27 guez 3
28 guez 156 INTEGER itr
29 guez 78 ! itr--- -input-R- le type de traceur 1- Rn 2 - Pb
30 guez 156
31     REAL, intent(in):: dtime
32 guez 78 ! dtime----input-R- intervalle de temps (en second)
33 guez 225 REAL, intent(in):: u1lay(klon), v1lay(klon) ! vent de la premiere
34     ! couche (m/s)
35 guez 232 REAL coef(:, 2:) ! (klon, 2:klev)
36 guez 78 ! coef-----input-R- le coefficient d'echange (m**2/s) l>1
37 guez 232 real cdragh(:) ! klon
38 guez 78 REAL, intent(in):: t(klon, klev) ! temperature (K)
39 guez 104 real, intent(in):: ftsol(klon, nbsrf), pctsrf(klon, nbsrf)
40 guez 156 ! ftsol----input-R- temperature du sol (en Kelvin)
41     REAL, intent(in):: tr(klon, klev) ! traceur
42     REAL, intent(in):: trs(:) ! (klon) traceur dans le sol
43 guez 78 REAL, intent(in):: paprs(klon, klev+1)
44 guez 156 ! paprs----input-R- pression a l'inter-couche (Pa)
45 guez 78 real, intent(in):: pplay(klon, klev)
46 guez 156 ! pplay----input-R- pression au milieu de couche (Pa)
47 guez 78 real delp(klon, klev)
48 guez 156 ! delp-----input-R- epaisseur de couche (Pa)
49 guez 78 REAL masktr(klon)
50 guez 156 ! masktr---input-R- Masque reservoir de sol traceur (1 = reservoir)
51 guez 78 REAL fshtr(klon)
52 guez 156 ! fshtr----input-R- Flux surfacique de production dans le sol
53 guez 78 REAL hsoltr
54 guez 156 ! hsoltr---input-R- Epaisseur equivalente du reservoir de sol
55 guez 78 REAL tautr
56 guez 156 ! tautr----input-R- Constante de decroissance du traceur
57    
58     REAL, intent(in):: vdeptr
59     ! vitesse de d\'ep\^ot sec dans la couche brownienne
60    
61 guez 78 REAL, intent(in):: lat(klon)
62 guez 156 ! lat-----input-R- latitude en degree
63 guez 78 REAL d_tr(klon, klev)
64 guez 156 ! d_tr-----output-R- le changement de "tr"
65 guez 78
66 guez 156 REAL, intent(out):: d_trs(:) ! (klon) (diagnostic) changement de "trs"
67 guez 78
68 guez 156 ! Local:
69     INTEGER i, k, n, l
70 guez 78 REAL rotrhi(klon)
71     REAL zx_coef(klon, klev)
72     REAL zx_buf(klon)
73     REAL zx_ctr(klon, klev)
74     REAL zx_dtr(klon, klev)
75     REAL zx_a, zx_b
76    
77     REAL local_tr(klon, klev)
78     REAL local_trs(klon)
79     REAL zts(klon)
80     REAL zx_alpha1(klon), zx_alpha2(klon)
81    
82     !------------------------------------------------------------------
83    
84     ! Pour l'instant les quatre types de surface ne sont pas pris en
85     ! compte. On fabrique avec zts un champ de température de sol que
86     ! l'on pondère par la fraction de sol.
87    
88     DO i = 1, klon
89     zts(i) = 0.
90     ENDDO
91    
92     DO n=1, nbsrf
93     DO i = 1, klon
94     zts(i) = zts(i) + ftsol(i, n)*pctsrf(i, n)
95     ENDDO
96     ENDDO
97    
98     DO i = 1, klon
99     rotrhi(i) = RD * zts(i) / hsoltr
100     END DO
101    
102     DO k = 1, klev
103     DO i = 1, klon
104     local_tr(i, k) = tr(i, k)
105     ENDDO
106     ENDDO
107    
108 guez 156 local_trs = trs
109 guez 78
110     ! Attention si dans clmain zx_alf1(i) = 1.
111     ! Il doit y avoir coherence (donc 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 guez 232 zx_coef(i, 1) = cdragh(i) &
120 guez 78 * (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     ! Au dessus des continents
165     ! Le pb peut se deposer partout : vdeptr = 10-3 m/s
166     ! Le Rn est traité commme une couche Brownienne puisque vdeptr = 0.
167    
168     DO i = 1, klon
169     IF (NINT(masktr(i)) .EQ. 1) THEN
170 guez 156 zx_a = local_trs(i) &
171 guez 78 +fshtr(i)*dtime*rotrhi(i) &
172     +rotrhi(i)*masktr(i)*zx_coef(i, 1)/RG &
173     *(zx_ctr(i, 1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i, 2)) &
174     +zx_alpha2(i)*zx_ctr(i, 2))
175 guez 156 ! Pour l'instant, pour aller vite, le d\'ep\^ot sec est trait\'e
176     ! comme une d\'ecroissance :
177 guez 78 zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i, 1)/RG &
178     * (1.-zx_dtr(i, 1) &
179     *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i, 2))) &
180     + dtime / tautr &
181     + dtime * vdeptr / hsoltr
182 guez 156 local_trs(i) = zx_a / zx_b
183 guez 78 ENDIF
184    
185     ! Si on est entre 60N et 70N on divise par 2 l'emanation
186    
187     IF ((itr.eq.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60. &
188     .AND.lat(i).LE.70.) .OR. &
189     (itr.eq.2.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60. &
190     .AND.lat(i).LE.70.)) THEN
191 guez 156 zx_a = local_trs(i) &
192 guez 78 +(fshtr(i)/2.)*dtime*rotrhi(i) &
193     +rotrhi(i)*masktr(i)*zx_coef(i, 1)/RG &
194     *(zx_ctr(i, 1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i, 2)) &
195     +zx_alpha2(i)*zx_ctr(i, 2))
196     zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i, 1)/RG &
197     * (1.-zx_dtr(i, 1) &
198     *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i, 2))) &
199     + dtime / tautr &
200     + dtime * vdeptr / hsoltr
201 guez 156 local_trs(i) = zx_a / zx_b
202 guez 78 ENDIF
203    
204     ! Au dessus des oceans et aux hautes latitudes
205    
206     ! au dessous de -60S pas d'emission de radon au dessus
207     ! des oceans et des continents
208    
209     IF ((itr.EQ.1.AND.NINT(masktr(i)).EQ.0) .OR. &
210     (itr.EQ.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).LT.-60.)) THEN
211     local_trs(i) = 0.
212     END IF
213    
214     ! au dessus de 70 N pas d'emission de radon au dessus
215     ! des oceans et des continents
216    
217     IF ((itr.EQ.1.AND.NINT(masktr(i)).EQ.0) .OR. &
218     (itr.EQ.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GT.70.)) THEN
219     local_trs(i) = 0.
220     END IF
221    
222     ! Au dessus des oceans la source est nulle
223    
224     IF (itr.eq.1.AND.NINT(masktr(i)).EQ.0) THEN
225     local_trs(i) = 0.
226     END IF
227     ENDDO ! sur le i=1, klon
228    
229 guez 156 ! une fois qu'on a local_trs, on peut faire l'iteration
230 guez 78
231     DO i = 1, klon
232 guez 156 local_tr(i, 1) = zx_ctr(i, 1)+zx_dtr(i, 1)*local_trs(i)
233 guez 78 ENDDO
234     DO l = 2, klev
235     DO i = 1, klon
236     local_tr(i, l) &
237     = zx_ctr(i, l) + zx_dtr(i, l)*local_tr(i, l-1)
238     ENDDO
239     ENDDO
240    
241     ! Calcul des tendances du traceur dans le sol et dans l'atmosphere
242    
243     DO l = 1, klev
244     DO i = 1, klon
245     d_tr(i, l) = local_tr(i, l) - tr(i, l)
246     ENDDO
247     ENDDO
248 guez 156 d_trs = local_trs - trs
249 guez 78
250     END SUBROUTINE cltracrn
251    
252     end module cltracrn_m

  ViewVC Help
Powered by ViewVC 1.1.21