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

Contents of /trunk/phylmd/cltracrn.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 104 - (show annotations)
Thu Sep 4 10:05:52 2014 UTC (9 years, 8 months ago) by guez
File size: 8337 byte(s)
Removed procedure sortvarc0. Called sortvarc with an additional
argument resetvarc instead. (Following LMDZ.) Moved current time
computations and some printing statements from sortvarc to
caldyn. Could then remove arguments itau and time_0 of sortvarc, and
could remove "use dynetat0". Better to keep "dynetat0.f" as a gcm-only
file.

Moved some variables from module ener to module sortvarc.

Split file "mathelp.f" into single-procedure files.

Removed unused argument nadv of adaptdt. Removed dimension arguments
of bernoui.

Removed unused argument nisurf of interfoce_lim. Changed the size of
argument lmt_sst of interfoce_lim from klon to knon. Removed case when
newlmt is false.

dynredem1 is called only once in each run, either ce0l or gcm. So
variable nb in call to nf95_put_var was always 1. Removed variable nb.

Removed dimension arguments of calcul_fluxs. Removed unused arguments
precip_rain, precip_snow, snow of calcul_fluxs. Changed the size of
all the arrays in calcul_fluxs from klon to knon.

Removed dimension arguments of fonte_neige. Changed the size of all
the arrays in fonte_neige from klon to knon.

Changed the size of arguments tsurf and tsurf_new of interfsurf_hq
from klon to knon. Changed the size of argument ptsrf of soil from
klon to knon.

1 module cltracrn_m
2
3 IMPLICIT none
4
5 contains
6
7 SUBROUTINE cltracrn(itr, dtime, u1lay, v1lay, coef, t, ftsol, pctsrf, tr, &
8 trs, paprs, pplay, delp, masktr, fshtr, hsoltr, tautr, vdeptr, lat, &
9 d_tr, d_trs)
10
11 ! From phylmd/cltracrn.F, version 1.2 2005/05/25 13:10:09
12
13 ! Author: Alex A.
14 ! Date: february 1999
15 ! Inspiré de clqh et clvent
16
17 ! Objet: diffusion verticale de traceurs avec quantité de traceur
18 ! dans le sol (réservoir de sol de radon)
19
20 ! 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
24 use indicesol, only: nbsrf
25 use dimphy, only: klon, klev
26 use SUPHEC_M, only: RD, rg
27
28 ! Arguments:
29 ! itr--- -input-R- le type de traceur 1- Rn 2 - Pb
30 ! dtime----input-R- intervalle de temps (en second)
31 ! u1lay----input-R- vent u de la premiere couche (m/s)
32 ! v1lay----input-R- vent v de la premiere couche (m/s)
33 ! coef-----input-R- le coefficient d'echange (m**2/s) l>1
34 ! paprs----input-R- pression a l'inter-couche (Pa)
35 ! pplay----input-R- pression au milieu de couche (Pa)
36 ! delp-----input-R- epaisseur de couche (Pa)
37 ! ftsol----input-R- temperature du sol (en Kelvin)
38 ! tr-------input-R- traceurs
39 ! trs------input-R- traceurs dans le sol
40 ! masktr---input-R- Masque reservoir de sol traceur (1 = reservoir)
41 ! fshtr----input-R- Flux surfacique de production dans le sol
42 ! tautr----input-R- Constante de decroissance du traceur
43 ! vdeptr---input-R- Vitesse de depot sec dans la couche brownienne
44 ! hsoltr---input-R- Epaisseur equivalente du reservoir de sol
45 ! lat-----input-R- latitude en degree
46 ! d_tr-----output-R- le changement de "tr"
47 ! d_trs----output-R- le changement de "trs"
48
49 REAL, intent(in):: dtime
50 REAL u1lay(klon), v1lay(klon)
51 REAL coef(klon, klev)
52 REAL, intent(in):: t(klon, klev) ! temperature (K)
53 real, intent(in):: ftsol(klon, nbsrf), pctsrf(klon, nbsrf)
54 REAL tr(klon, klev), trs(klon)
55 REAL, intent(in):: paprs(klon, klev+1)
56 real, intent(in):: pplay(klon, klev)
57 real delp(klon, klev)
58 REAL masktr(klon)
59 REAL fshtr(klon)
60 REAL hsoltr
61 REAL tautr
62 REAL vdeptr
63 REAL, intent(in):: lat(klon)
64 REAL d_tr(klon, klev)
65
66 REAL d_trs(klon) ! (diagnostic) traceur ds le sol
67
68 INTEGER i, k, itr, n, l
69 REAL rotrhi(klon)
70 REAL zx_coef(klon, klev)
71 REAL zx_buf(klon)
72 REAL zx_ctr(klon, klev)
73 REAL zx_dtr(klon, klev)
74 REAL zx_trs(klon)
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 DO i = 1, klon
109 local_trs(i) = trs(i)
110 ENDDO
111
112 ! Attention si dans clmain zx_alf1(i) = 1.
113 ! Il doit y avoir coherence (donc la meme chose ici)
114
115 DO i = 1, klon
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 ! Au dessus des continents
167 ! Le pb peut se deposer partout : vdeptr = 10-3 m/s
168 ! Le Rn est traité commme une couche Brownienne puisque vdeptr = 0.
169
170 DO i = 1, klon
171 IF (NINT(masktr(i)) .EQ. 1) THEN
172 zx_trs(i) = local_trs(i)
173 zx_a = zx_trs(i) &
174 +fshtr(i)*dtime*rotrhi(i) &
175 +rotrhi(i)*masktr(i)*zx_coef(i, 1)/RG &
176 *(zx_ctr(i, 1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i, 2)) &
177 +zx_alpha2(i)*zx_ctr(i, 2))
178 ! Pour l'instant, pour aller vite, le depot sec est traite
179 ! comme une decroissance :
180 zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i, 1)/RG &
181 * (1.-zx_dtr(i, 1) &
182 *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i, 2))) &
183 + dtime / tautr &
184 + dtime * vdeptr / hsoltr
185 zx_trs(i) = zx_a / zx_b
186 local_trs(i) = zx_trs(i)
187 ENDIF
188
189 ! Si on est entre 60N et 70N on divise par 2 l'emanation
190
191 IF ((itr.eq.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60. &
192 .AND.lat(i).LE.70.) .OR. &
193 (itr.eq.2.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60. &
194 .AND.lat(i).LE.70.)) THEN
195 zx_trs(i) = local_trs(i)
196 zx_a = zx_trs(i) &
197 +(fshtr(i)/2.)*dtime*rotrhi(i) &
198 +rotrhi(i)*masktr(i)*zx_coef(i, 1)/RG &
199 *(zx_ctr(i, 1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i, 2)) &
200 +zx_alpha2(i)*zx_ctr(i, 2))
201 zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i, 1)/RG &
202 * (1.-zx_dtr(i, 1) &
203 *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i, 2))) &
204 + dtime / tautr &
205 + dtime * vdeptr / hsoltr
206 zx_trs(i) = zx_a / zx_b
207 local_trs(i) = zx_trs(i)
208 ENDIF
209
210 ! Au dessus des oceans et aux hautes latitudes
211
212 ! au dessous de -60S pas d'emission de radon au dessus
213 ! des oceans et des continents
214
215 IF ((itr.EQ.1.AND.NINT(masktr(i)).EQ.0) .OR. &
216 (itr.EQ.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).LT.-60.)) THEN
217 zx_trs(i) = 0.
218 local_trs(i) = 0.
219 END IF
220
221 ! au dessus de 70 N pas d'emission de radon au dessus
222 ! des oceans et des continents
223
224 IF ((itr.EQ.1.AND.NINT(masktr(i)).EQ.0) .OR. &
225 (itr.EQ.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GT.70.)) THEN
226 zx_trs(i) = 0.
227 local_trs(i) = 0.
228 END IF
229
230 ! Au dessus des oceans la source est nulle
231
232 IF (itr.eq.1.AND.NINT(masktr(i)).EQ.0) THEN
233 zx_trs(i) = 0.
234 local_trs(i) = 0.
235 END IF
236
237 ENDDO ! sur le i=1, klon
238
239 ! une fois qu'on a zx_trs, on peut faire l'iteration
240
241 DO i = 1, klon
242 local_tr(i, 1) = zx_ctr(i, 1)+zx_dtr(i, 1)*zx_trs(i)
243 ENDDO
244 DO l = 2, klev
245 DO i = 1, klon
246 local_tr(i, l) &
247 = zx_ctr(i, l) + zx_dtr(i, l)*local_tr(i, l-1)
248 ENDDO
249 ENDDO
250
251 ! Calcul des tendances du traceur dans le sol et dans l'atmosphere
252
253 DO l = 1, klev
254 DO i = 1, klon
255 d_tr(i, l) = local_tr(i, l) - tr(i, l)
256 ENDDO
257 ENDDO
258 DO i = 1, klon
259 d_trs(i) = local_trs(i) - trs(i)
260 ENDDO
261
262 END SUBROUTINE cltracrn
263
264 end module cltracrn_m

  ViewVC Help
Powered by ViewVC 1.1.21