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

Annotation of /trunk/phylmd/cltracrn.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 78 - (hide annotations)
Wed Feb 5 17:51:07 2014 UTC (10 years, 3 months ago) by guez
Original Path: trunk/phylmd/cltracrn.f90
File size: 8323 byte(s)
Moved procedure inigeom into module comgeom.

In disvert, renamed s_sampling to vert_sampling, following
LMDZ. Removed choice strato1. In case read, read ap and bp instead of
s (following LMDZ).

Added argument phis to start_init_orog and start_init_dyn, and removed
variable phis of module start_init_orog_m. In etat0 and
start_init_orog, renamed relief to zmea_2d. In start_init_dyn, renamed
psol to ps.

In start_init_orog, renamed relief_hi to relief. No need to set
phis(iim + 1, :) = phis(1, :), already done in grid_noro.

Documentation for massbar out of SVN, in massbar.txt. Documentation
was duplicated in massdair, but not relevant in massdair.

In conflx, no need to initialize pen_[ud] and pde_[ud]. In flxasc,
used intermediary variable fact (following LMDZ).

In grid_noro, added local variable zmea0 for zmea not smoothed and
computed zphi from zmea instead of zmea0 (following LMDZ). This
changes the results of ce0l.

Removed arguments pen_u and pde_d of phytrac and nflxtr, which were
not used.

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 78 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 guez 3
11 guez 78 ! From phylmd/cltracrn.F, version 1.2 2005/05/25 13:10:09
12 guez 3
13 guez 78 ! Author: Alex A.
14     ! Date: february 1999
15     ! 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 78 ! 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 guez 3
49 guez 78 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 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