GCC Code Coverage Report


Directory: ./
File: phys/cltracrn.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 87 87 100.0%
Branches: 82 86 95.3%

Line Branch Exec Source
1 !$Id $
2
3 76020960 SUBROUTINE cltracrn( itr, dtime,u1lay, v1lay, &
4 960 cdrag,coef,t,ftsol,pctsrf, &
5 960 tr,trs,paprs,pplay,delp, &
6 masktr,fshtr,hsoltr,tautr,vdeptr, &
7 lat,d_tr,d_trs )
8
9 USE dimphy
10 USE traclmdz_mod, ONLY : id_rn, id_pb
11 USE indice_sol_mod
12
13 IMPLICIT NONE
14 !======================================================================
15 ! Auteur(s): Alex/LMD) date: fev 99
16 ! inspire de clqh + clvent
17 ! Objet: diffusion verticale de traceurs avec quantite de traceur ds
18 ! le sol ( reservoir de sol de radon )
19 !
20 ! note : pour l'instant le traceur dans le sol et le flux sont
21 ! calcules mais ils ne servent que de diagnostiques
22 ! seule la tendance sur le traceur est sortie (d_tr)
23 !---------------------------------------------------------------------
24 ! Arguments:
25 ! itr......input-R- le type de traceur : id_rn(radon), id_pb(plomb)
26 ! dtime....input-R- intervalle du temps (en secondes) ~ pdtphys
27 ! u1lay....input-R- vent u de la premiere couche (m/s)
28 ! v1lay....input-R- vent v de la premiere couche (m/s)
29 ! cdrag....input-R- cdrag
30 ! coef.....input-R- le coefficient d'echange (m**2/s) l>1, valable uniquement pour k entre 2 et klev
31 ! t........input-R- temperature (K)
32 ! paprs....input-R- pression a inter-couche (Pa)
33 ! pplay....input-R- pression au milieu de couche (Pa)
34 ! delp.....input-R- epaisseur de couche (Pa)
35 ! ftsol....input-R- temperature du sol (en Kelvin)
36 ! tr.......input-R- traceurs
37 ! trs......input-R- traceurs dans le sol
38 ! masktr...input-R- Masque reservoir de sol traceur (1 = reservoir)
39 ! fshtr....input-R- Flux surfacique de production dans le sol
40 ! tautr....input-R- Constante de decroissance du traceur
41 ! vdeptr...input-R- Vitesse de depot sec dans la couche brownienne
42 ! hsoltr...input-R- Epaisseur equivalente du reservoir de sol
43 ! lat......input-R- latitude en degree
44 ! d_tr.....output-R- le changement de "tr"
45 ! d_trs....output-R- le changement de "trs"
46 !======================================================================
47 include "YOMCST.h"
48 !
49 !Entrees
50 INTEGER,INTENT(IN) :: itr
51 REAL,INTENT(IN) :: dtime
52 REAL,DIMENSION(klon),INTENT(IN) :: u1lay, v1lay
53 REAL,DIMENSION(klon),INTENT(IN) :: cdrag
54 REAL,DIMENSION(klon,klev),INTENT(IN) :: coef, t
55 REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: ftsol, pctsrf
56 REAL,DIMENSION(klon,klev),INTENT(IN) :: tr
57 REAL,DIMENSION(klon),INTENT(IN) :: trs
58 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs
59 REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay, delp
60 REAL,DIMENSION(klon),INTENT(IN) :: masktr
61 REAL,DIMENSION(klon),INTENT(IN) :: fshtr
62 REAL,INTENT(IN) :: hsoltr
63 REAL,INTENT(IN) :: tautr
64 REAL,INTENT(IN) :: vdeptr
65 REAL,DIMENSION(klon),INTENT(IN) :: lat
66
67 !Sorties
68 REAL,DIMENSION(klon,klev),INTENT(OUT) :: d_tr
69 REAL,DIMENSION(klon),INTENT(OUT) :: d_trs ! (diagnostic) traceur ds le sol
70
71 !Locales
72 1920 REAL,DIMENSION(klon,klev) :: flux_tr ! (diagnostic) flux de traceur
73 INTEGER :: i, k, n, l
74 1920 REAL,DIMENSION(klon) :: rotrhi
75 1920 REAL,DIMENSION(klon,klev) :: zx_coef
76 1920 REAL,DIMENSION(klon) :: zx_buf
77 1920 REAL,DIMENSION(klon,klev) :: zx_ctr
78 1920 REAL,DIMENSION(klon,klev) :: zx_dtr
79 1920 REAL,DIMENSION(klon) :: zx_trs
80 REAL :: zx_a, zx_b
81
82 1920 REAL,DIMENSION(klon,klev) :: local_tr
83 1920 REAL,DIMENSION(klon) :: local_trs
84 1920 REAL,DIMENSION(klon) :: zts ! champ de temperature du sol
85 960 REAL,DIMENSION(klon) :: zx_alpha1, zx_alpha2
86 !======================================================================
87 !AA Pour l'instant les 4 types de surface ne sont pas pris en compte
88 !AA On fabrique avec zts un champ de temperature de sol
89 !AA que le pondere par la fraction de nature de sol.
90
91
2/2
✓ Branch 0 taken 954240 times.
✓ Branch 1 taken 960 times.
955200 DO i = 1,klon
92 955200 zts(i) = 0.
93 ENDDO
94
95
2/2
✓ Branch 0 taken 3840 times.
✓ Branch 1 taken 960 times.
4800 DO n=1,nbsrf
96
2/2
✓ Branch 0 taken 3816960 times.
✓ Branch 1 taken 3840 times.
3821760 DO i = 1,klon
97 3820800 zts(i) = zts(i) + ftsol(i,n)*pctsrf(i,n)
98 ENDDO
99 ENDDO
100
101
2/2
✓ Branch 0 taken 954240 times.
✓ Branch 1 taken 960 times.
955200 DO i = 1,klon
102 955200 rotrhi(i) = RD * zts(i) / hsoltr
103 ENDDO
104
105
2/2
✓ Branch 0 taken 37440 times.
✓ Branch 1 taken 960 times.
38400 DO k = 1, klev
106
2/2
✓ Branch 0 taken 37215360 times.
✓ Branch 1 taken 37440 times.
37253760 DO i = 1, klon
107 37252800 local_tr(i,k) = tr(i,k)
108 ENDDO
109 ENDDO
110
111
2/2
✓ Branch 0 taken 954240 times.
✓ Branch 1 taken 960 times.
955200 DO i = 1, klon
112 955200 local_trs(i) = trs(i)
113 ENDDO
114 !======================================================================
115 !AA Attention si dans clmain zx_alf1(i) = 1.0
116 !AA Il doit y avoir coherence (dc la meme chose ici)
117
118
2/2
✓ Branch 0 taken 954240 times.
✓ Branch 1 taken 960 times.
955200 DO i = 1, klon
119 !AA zx_alpha1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2))
120 954240 zx_alpha1(i) = 1.0
121 955200 zx_alpha2(i) = 1.0 - zx_alpha1(i)
122 ENDDO
123 !======================================================================
124
2/2
✓ Branch 0 taken 954240 times.
✓ Branch 1 taken 960 times.
955200 DO i = 1, klon
125 zx_coef(i,1) = cdrag(i)*(1.0+SQRT(u1lay(i)**2+v1lay(i)**2)) &
126 954240 *pplay(i,1)/(RD*t(i,1))
127 955200 zx_coef(i,1) = zx_coef(i,1) * dtime*RG
128 ENDDO
129
130
2/2
✓ Branch 0 taken 36480 times.
✓ Branch 1 taken 960 times.
37440 DO k = 2, klev
131
2/2
✓ Branch 0 taken 36261120 times.
✓ Branch 1 taken 36480 times.
36298560 DO i = 1, klon
132 zx_coef(i,k) = coef(i,k)*RG/(pplay(i,k-1)-pplay(i,k)) &
133 36261120 *(paprs(i,k)*2/(t(i,k)+t(i,k-1))/RD)**2
134 36297600 zx_coef(i,k) = zx_coef(i,k) * dtime*RG
135 ENDDO
136 ENDDO
137 !======================================================================
138
2/2
✓ Branch 0 taken 954240 times.
✓ Branch 1 taken 960 times.
955200 DO i = 1, klon
139 954240 zx_buf(i) = delp(i,klev) + zx_coef(i,klev)
140 954240 zx_ctr(i,klev) = local_tr(i,klev)*delp(i,klev)/zx_buf(i)
141 955200 zx_dtr(i,klev) = zx_coef(i,klev) / zx_buf(i)
142 ENDDO
143
144
2/2
✓ Branch 0 taken 35520 times.
✓ Branch 1 taken 960 times.
36480 DO l = klev-1, 2 , -1
145
2/2
✓ Branch 0 taken 35306880 times.
✓ Branch 1 taken 35520 times.
35343360 DO i = 1, klon
146 zx_buf(i) = delp(i,l)+zx_coef(i,l) &
147 35306880 +zx_coef(i,l+1)*(1.-zx_dtr(i,l+1))
148
149 zx_ctr(i,l) = ( local_tr(i,l)*delp(i,l) &
150 35306880 + zx_coef(i,l+1)*zx_ctr(i,l+1) )/zx_buf(i)
151 35342400 zx_dtr(i,l) = zx_coef(i,l) / zx_buf(i)
152 ENDDO
153 ENDDO
154
155
2/2
✓ Branch 0 taken 954240 times.
✓ Branch 1 taken 960 times.
955200 DO i = 1, klon
156 zx_buf(i) = delp(i,1) + zx_coef(i,2)*(1.-zx_dtr(i,2)) &
157 + masktr(i) * zx_coef(i,1) &
158 954240 *( zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2) )
159
160 zx_ctr(i,1) = ( local_tr(i,1)*delp(i,1) &
161 + zx_ctr(i,2) &
162 *(zx_coef(i,2) &
163 - masktr(i) * zx_coef(i,1) &
164 954240 *zx_alpha2(i) ) ) / zx_buf(i)
165 955200 zx_dtr(i,1) = masktr(i) * zx_coef(i,1) / zx_buf(i)
166 ENDDO
167 !======================================================================
168 ! Calculer d'abord local_trs nouvelle quantite dans le reservoir
169 ! de sol
170 !=====================================================================
171
172
2/2
✓ Branch 0 taken 954240 times.
✓ Branch 1 taken 960 times.
955200 DO i = 1, klon
173 !-------------------------
174 ! Au dessus des continents
175 !--
176 ! Le pb peut se deposer partout : vdeptr = 10-3 m/s
177 ! Le Rn est traiter commme une couche Brownienne puisque vdeptr = 0.
178 !-------------------------------------------------------------------
179
2/2
✓ Branch 0 taken 583680 times.
✓ Branch 1 taken 370560 times.
954240 IF ( NINT(masktr(i)) .EQ. 1 ) THEN
180 583680 zx_trs(i) = local_trs(i)
181 zx_a = zx_trs(i) &
182 +fshtr(i)*dtime*rotrhi(i) &
183 +rotrhi(i)*masktr(i)*zx_coef(i,1)/RG &
184 *(zx_ctr(i,1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)) &
185 583680 +zx_alpha2(i)*zx_ctr(i,2))
186 ! Pour l'instant, pour aller vite, le depot sec est traite comme une decroissance
187 zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i,1)/RG &
188 * (1.-zx_dtr(i,1) &
189 *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2))) &
190 + dtime / tautr &
191 583680 + dtime * vdeptr / hsoltr
192 583680 zx_trs(i) = zx_a / zx_b
193 583680 local_trs(i) = zx_trs(i)
194 ENDIF
195 !--------------------------------------------------------
196 ! Si on est entre 60N et 70N on divise par 2 l'emanation
197 !--------------------------------------------------------
198
199
9/10
✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 477120 times.
✓ Branch 2 taken 477120 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 583680 times.
✓ Branch 5 taken 370560 times.
✓ Branch 6 taken 101280 times.
✓ Branch 7 taken 482400 times.
✓ Branch 8 taken 51360 times.
✓ Branch 9 taken 49920 times.
954240 IF ( (itr.eq.id_rn.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60..AND.lat(i).LE.70.).OR. &
200 (itr.eq.id_pb.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60..AND.lat(i).LE.70.) ) THEN
201 51360 zx_trs(i) = local_trs(i)
202 zx_a = zx_trs(i) &
203 +(fshtr(i)/2.)*dtime*rotrhi(i) &
204 +rotrhi(i)*masktr(i)*zx_coef(i,1)/RG &
205 *(zx_ctr(i,1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)) &
206 51360 +zx_alpha2(i)*zx_ctr(i,2))
207 !
208 zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i,1)/RG &
209 * (1.-zx_dtr(i,1) &
210 *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2))) &
211 + dtime / tautr &
212 51360 + dtime * vdeptr / hsoltr
213 !
214 51360 zx_trs(i) = zx_a / zx_b
215 51360 local_trs(i) = zx_trs(i)
216 ENDIF
217
218 !----------------------------------------------
219 ! Au dessus des oceans et aux hautes latitudes
220 !--
221 ! au dessous de -60S pas d'emission de radon au dessus
222 ! des oceans et des continents
223 !---------------------------------------------------------------
224
225
8/10
✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 477120 times.
✓ Branch 2 taken 106560 times.
✓ Branch 3 taken 370560 times.
✓ Branch 4 taken 106560 times.
✓ Branch 5 taken 477120 times.
✓ Branch 6 taken 106560 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 106560 times.
954240 IF ( (itr.EQ.id_rn.AND.NINT(masktr(i)).EQ.0).OR. &
226 (itr.EQ.id_rn.AND.NINT(masktr(i)).EQ.1.AND.lat(i).LT.-60.)) THEN
227 370560 zx_trs(i) = 0.
228 370560 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
9/10
✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 477120 times.
✓ Branch 2 taken 106560 times.
✓ Branch 3 taken 370560 times.
✓ Branch 4 taken 106560 times.
✓ Branch 5 taken 477120 times.
✓ Branch 6 taken 106560 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3360 times.
✓ Branch 9 taken 103200 times.
954240 IF ( (itr.EQ.id_rn.AND.NINT(masktr(i)).EQ.0).OR. &
235 (itr.EQ.id_rn.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GT.70.)) THEN
236 373920 zx_trs(i) = 0.
237 373920 local_trs(i) = 0.
238 END IF
239 !---------------------------------------------
240 ! Au dessus des oceans la source est nulle
241 !--------------------------------------------
242
243
4/4
✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 477120 times.
✓ Branch 2 taken 370560 times.
✓ Branch 3 taken 106560 times.
955200 IF (itr.eq.id_rn.AND.NINT(masktr(i)).EQ.0) THEN
244 370560 zx_trs(i) = 0.
245 370560 local_trs(i) = 0.
246 END IF
247
248 ENDDO ! sur le i=1,klon
249 !
250 !======================================================================
251 ! Une fois on a zx_trs, on peut faire l'iteration
252 !======================================================================
253
254
2/2
✓ Branch 0 taken 954240 times.
✓ Branch 1 taken 960 times.
955200 DO i = 1, klon
255 955200 local_tr(i,1) = zx_ctr(i,1)+zx_dtr(i,1)*zx_trs(i)
256 ENDDO
257
2/2
✓ Branch 0 taken 36480 times.
✓ Branch 1 taken 960 times.
37440 DO l = 2, klev
258
2/2
✓ Branch 0 taken 36261120 times.
✓ Branch 1 taken 36480 times.
36298560 DO i = 1, klon
259 36297600 local_tr(i,l) = zx_ctr(i,l) + zx_dtr(i,l)*local_tr(i,l-1)
260 ENDDO
261 ENDDO
262 !======================================================================
263 ! Calcul du flux de traceur (flux_tr): UA/(m**2 s)
264 !======================================================================
265
2/2
✓ Branch 0 taken 954240 times.
✓ Branch 1 taken 960 times.
955200 DO i = 1, klon
266 flux_tr(i,1) = masktr(i)*zx_coef(i,1)/RG &
267 * (zx_alpha1(i)*local_tr(i,1)+zx_alpha2(i)*local_tr(i,2) &
268 955200 -zx_trs(i)) / dtime
269 ENDDO
270
2/2
✓ Branch 0 taken 36480 times.
✓ Branch 1 taken 960 times.
37440 DO l = 2, klev
271
2/2
✓ Branch 0 taken 36261120 times.
✓ Branch 1 taken 36480 times.
36298560 DO i = 1, klon
272 flux_tr(i,l) = zx_coef(i,l)/RG &
273 36297600 * (local_tr(i,l)-local_tr(i,l-1)) / dtime
274 ENDDO
275 ENDDO
276 !======================================================================
277 ! Calcul des tendances du traceur ds le sol et dans l'atmosphere
278 !======================================================================
279
2/2
✓ Branch 0 taken 37440 times.
✓ Branch 1 taken 960 times.
38400 DO l = 1, klev
280
2/2
✓ Branch 0 taken 37215360 times.
✓ Branch 1 taken 37440 times.
37253760 DO i = 1, klon
281 37252800 d_tr(i,l) = local_tr(i,l) - tr(i,l)
282 ENDDO
283 ENDDO
284
2/2
✓ Branch 0 taken 954240 times.
✓ Branch 1 taken 960 times.
955200 DO i = 1, klon
285 955200 d_trs(i) = local_trs(i) - trs(i)
286 ENDDO
287
288 960 END SUBROUTINE cltracrn
289