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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 225 - (hide annotations)
Mon Oct 16 12:35:41 2017 UTC (6 years, 6 months ago) by guez
File size: 8015 byte(s)
LMDZE is now in Fortran 2003 (use of allocatable arguments).

gradsdef was not used.

Change names: [uv]10m to [uv]10m_srf in clmain, y[uv]1 to
[uv]1lay. Remove useless complication: zx_alf[12]. Do not modify
[uv]1lay after initial definition from [uv].

Add [uv]10m_srf to output.

Change names in physiq: [uv]10m to [uv]10m_srf, z[uv]10m to [uv]10m,
corresponding to NetCDF output names.

Remove unused complication couchelimite and useless variable inirnpb
in phytrac.

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 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 156 REAL coef(klon, klev)
36 guez 78 ! coef-----input-R- le coefficient d'echange (m**2/s) l>1
37     REAL, intent(in):: t(klon, klev) ! temperature (K)
38 guez 104 real, intent(in):: ftsol(klon, nbsrf), pctsrf(klon, nbsrf)
39 guez 156 ! ftsol----input-R- temperature du sol (en Kelvin)
40     REAL, intent(in):: tr(klon, klev) ! traceur
41     REAL, intent(in):: trs(:) ! (klon) traceur dans le sol
42 guez 78 REAL, intent(in):: paprs(klon, klev+1)
43 guez 156 ! paprs----input-R- pression a l'inter-couche (Pa)
44 guez 78 real, intent(in):: pplay(klon, klev)
45 guez 156 ! pplay----input-R- pression au milieu de couche (Pa)
46 guez 78 real delp(klon, klev)
47 guez 156 ! delp-----input-R- epaisseur de couche (Pa)
48 guez 78 REAL masktr(klon)
49 guez 156 ! masktr---input-R- Masque reservoir de sol traceur (1 = reservoir)
50 guez 78 REAL fshtr(klon)
51 guez 156 ! fshtr----input-R- Flux surfacique de production dans le sol
52 guez 78 REAL hsoltr
53 guez 156 ! hsoltr---input-R- Epaisseur equivalente du reservoir de sol
54 guez 78 REAL tautr
55 guez 156 ! tautr----input-R- Constante de decroissance du traceur
56    
57     REAL, intent(in):: vdeptr
58     ! vitesse de d\'ep\^ot sec dans la couche brownienne
59    
60 guez 78 REAL, intent(in):: lat(klon)
61 guez 156 ! lat-----input-R- latitude en degree
62 guez 78 REAL d_tr(klon, klev)
63 guez 156 ! d_tr-----output-R- le changement de "tr"
64 guez 78
65 guez 156 REAL, intent(out):: d_trs(:) ! (klon) (diagnostic) changement de "trs"
66 guez 78
67 guez 156 ! Local:
68     INTEGER i, k, n, l
69 guez 78 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_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     !------------------------------------------------------------------
82    
83     ! Pour l'instant les quatre types de surface ne sont pas pris en
84     ! compte. On fabrique avec zts un champ de température de sol que
85     ! l'on pondère par la fraction de sol.
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 guez 156 local_trs = trs
108 guez 78
109     ! Attention si dans clmain zx_alf1(i) = 1.
110     ! Il doit y avoir coherence (donc la meme chose ici)
111    
112     DO i = 1, klon
113     zx_alpha1(i) = 1.0
114     zx_alpha2(i) = 1.0 - zx_alpha1(i)
115     ENDDO
116    
117     DO i = 1, klon
118     zx_coef(i, 1) = coef(i, 1) &
119     * (1.0+SQRT(u1lay(i)**2+v1lay(i)**2)) &
120     * pplay(i, 1)/(RD*t(i, 1))
121     zx_coef(i, 1) = zx_coef(i, 1) * dtime*RG
122     ENDDO
123    
124     DO k = 2, klev
125     DO i = 1, klon
126     zx_coef(i, k) = coef(i, k)*RG/(pplay(i, k-1)-pplay(i, k)) &
127     *(paprs(i, k)*2/(t(i, k)+t(i, k-1))/RD)**2
128     zx_coef(i, k) = zx_coef(i, k) * dtime*RG
129     ENDDO
130     ENDDO
131    
132     DO i = 1, klon
133     zx_buf(i) = delp(i, klev) + zx_coef(i, klev)
134     zx_ctr(i, klev) = local_tr(i, klev)*delp(i, klev)/zx_buf(i)
135     zx_dtr(i, klev) = zx_coef(i, klev) / zx_buf(i)
136     ENDDO
137    
138     DO l = klev-1, 2 , -1
139     DO i = 1, klon
140     zx_buf(i) = delp(i, l)+zx_coef(i, l) &
141     +zx_coef(i, l+1)*(1.-zx_dtr(i, l+1))
142     zx_ctr(i, l) = (local_tr(i, l)*delp(i, l) &
143     + zx_coef(i, l+1)*zx_ctr(i, l+1))/zx_buf(i)
144     zx_dtr(i, l) = zx_coef(i, l) / zx_buf(i)
145     ENDDO
146     ENDDO
147    
148     DO i = 1, klon
149     zx_buf(i) = delp(i, 1) + zx_coef(i, 2)*(1.-zx_dtr(i, 2)) &
150     + masktr(i) * zx_coef(i, 1) &
151     *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i, 2))
152     zx_ctr(i, 1) = (local_tr(i, 1)*delp(i, 1) &
153     + zx_ctr(i, 2) &
154     *(zx_coef(i, 2) &
155     - masktr(i) * zx_coef(i, 1) &
156     *zx_alpha2(i))) / zx_buf(i)
157     zx_dtr(i, 1) = masktr(i) * zx_coef(i, 1) / zx_buf(i)
158     ENDDO
159    
160     ! Calculer d'abord local_trs nouvelle quantite dans le reservoir
161     ! de sol
162    
163     ! Au dessus des continents
164     ! Le pb peut se deposer partout : vdeptr = 10-3 m/s
165     ! Le Rn est traité commme une couche Brownienne puisque vdeptr = 0.
166    
167     DO i = 1, klon
168     IF (NINT(masktr(i)) .EQ. 1) THEN
169 guez 156 zx_a = local_trs(i) &
170 guez 78 +fshtr(i)*dtime*rotrhi(i) &
171     +rotrhi(i)*masktr(i)*zx_coef(i, 1)/RG &
172     *(zx_ctr(i, 1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i, 2)) &
173     +zx_alpha2(i)*zx_ctr(i, 2))
174 guez 156 ! Pour l'instant, pour aller vite, le d\'ep\^ot sec est trait\'e
175     ! comme une d\'ecroissance :
176 guez 78 zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i, 1)/RG &
177     * (1.-zx_dtr(i, 1) &
178     *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i, 2))) &
179     + dtime / tautr &
180     + dtime * vdeptr / hsoltr
181 guez 156 local_trs(i) = zx_a / zx_b
182 guez 78 ENDIF
183    
184     ! Si on est entre 60N et 70N on divise par 2 l'emanation
185    
186     IF ((itr.eq.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60. &
187     .AND.lat(i).LE.70.) .OR. &
188     (itr.eq.2.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60. &
189     .AND.lat(i).LE.70.)) THEN
190 guez 156 zx_a = local_trs(i) &
191 guez 78 +(fshtr(i)/2.)*dtime*rotrhi(i) &
192     +rotrhi(i)*masktr(i)*zx_coef(i, 1)/RG &
193     *(zx_ctr(i, 1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i, 2)) &
194     +zx_alpha2(i)*zx_ctr(i, 2))
195     zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i, 1)/RG &
196     * (1.-zx_dtr(i, 1) &
197     *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i, 2))) &
198     + dtime / tautr &
199     + dtime * vdeptr / hsoltr
200 guez 156 local_trs(i) = zx_a / zx_b
201 guez 78 ENDIF
202    
203     ! Au dessus des oceans et aux hautes latitudes
204    
205     ! au dessous de -60S pas d'emission de radon au dessus
206     ! des oceans et des continents
207    
208     IF ((itr.EQ.1.AND.NINT(masktr(i)).EQ.0) .OR. &
209     (itr.EQ.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).LT.-60.)) THEN
210     local_trs(i) = 0.
211     END IF
212    
213     ! au dessus de 70 N pas d'emission de radon au dessus
214     ! des oceans et des continents
215    
216     IF ((itr.EQ.1.AND.NINT(masktr(i)).EQ.0) .OR. &
217     (itr.EQ.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GT.70.)) THEN
218     local_trs(i) = 0.
219     END IF
220    
221     ! Au dessus des oceans la source est nulle
222    
223     IF (itr.eq.1.AND.NINT(masktr(i)).EQ.0) THEN
224     local_trs(i) = 0.
225     END IF
226     ENDDO ! sur le i=1, klon
227    
228 guez 156 ! une fois qu'on a local_trs, on peut faire l'iteration
229 guez 78
230     DO i = 1, klon
231 guez 156 local_tr(i, 1) = zx_ctr(i, 1)+zx_dtr(i, 1)*local_trs(i)
232 guez 78 ENDDO
233     DO l = 2, klev
234     DO i = 1, klon
235     local_tr(i, l) &
236     = zx_ctr(i, l) + zx_dtr(i, l)*local_tr(i, l-1)
237     ENDDO
238     ENDDO
239    
240     ! Calcul des tendances du traceur dans le sol et dans l'atmosphere
241    
242     DO l = 1, klev
243     DO i = 1, klon
244     d_tr(i, l) = local_tr(i, l) - tr(i, l)
245     ENDDO
246     ENDDO
247 guez 156 d_trs = local_trs - trs
248 guez 78
249     END SUBROUTINE cltracrn
250    
251     end module cltracrn_m

  ViewVC Help
Powered by ViewVC 1.1.21