Directory: | ./ |
---|---|
File: | phys/surf_land_mod.f90 |
Date: | 2022-01-11 19:19:34 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 25 | 45 | 55.6% |
Branches: | 24 | 58 | 41.4% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | ! | ||
2 | MODULE surf_land_mod | ||
3 | |||
4 | IMPLICIT NONE | ||
5 | |||
6 | CONTAINS | ||
7 | ! | ||
8 | !**************************************************************************************** | ||
9 | ! | ||
10 | 960 | SUBROUTINE surf_land(itime, dtime, date0, jour, knon, knindex, & | |
11 | rlon, rlat, yrmu0, & | ||
12 | debut, lafin, zlev, ccanopy, swnet, lwnet, albedo, & | ||
13 | 480 | tsurf, p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum, & | |
14 | AcoefH, AcoefQ, BcoefH, BcoefQ, & | ||
15 | AcoefU, AcoefV, BcoefU, BcoefV, & | ||
16 | 480 | pref, u1, v1, gustiness, rugoro, pctsrf, & | |
17 | lwdown_m, q2m, t2m, & | ||
18 | snow, qsol, agesno, tsoil, & | ||
19 | 480 | z0m, z0h, SFRWL, alb_dir_new, alb_dif_new, evap, fluxsens, fluxlat, & | |
20 | qsurf, tsurf_new, dflux_s, dflux_l, & | ||
21 | flux_u1, flux_v1 , & | ||
22 | veget,lai,height) | ||
23 | |||
24 | USE dimphy | ||
25 | USE surface_data, ONLY : ok_veget | ||
26 | ! >> PC | ||
27 | USE carbon_cycle_mod | ||
28 | ! << PC | ||
29 | |||
30 | ! See comments in each module surf_land_orchidee_xxx for compatiblity with ORCHIDEE | ||
31 | USE surf_land_orchidee_mod | ||
32 | |||
33 | USE surf_land_bucket_mod | ||
34 | USE calcul_fluxs_mod | ||
35 | USE indice_sol_mod | ||
36 | |||
37 | ! >> PC | ||
38 | USE print_control_mod, ONLY: lunout | ||
39 | ! << PC | ||
40 | |||
41 | INCLUDE "dimsoil.h" | ||
42 | INCLUDE "YOMCST.h" | ||
43 | INCLUDE "clesphys.h" | ||
44 | INCLUDE "dimpft.h" | ||
45 | |||
46 | ! Input variables | ||
47 | !**************************************************************************************** | ||
48 | INTEGER, INTENT(IN) :: itime, jour, knon | ||
49 | INTEGER, DIMENSION(klon), INTENT(IN) :: knindex | ||
50 | REAL, INTENT(IN) :: date0 | ||
51 | REAL, DIMENSION(klon), INTENT(IN) :: rlon, rlat | ||
52 | REAL, DIMENSION(klon), INTENT(IN) :: yrmu0 ! cosine of solar zenith angle | ||
53 | LOGICAL, INTENT(IN) :: debut, lafin | ||
54 | REAL, INTENT(IN) :: dtime | ||
55 | REAL, DIMENSION(klon), INTENT(IN) :: zlev, ccanopy | ||
56 | REAL, DIMENSION(klon), INTENT(IN) :: swnet, lwnet | ||
57 | REAL, DIMENSION(klon), INTENT(IN) :: albedo ! albedo for whole short-wave interval | ||
58 | REAL, DIMENSION(klon), INTENT(IN) :: tsurf | ||
59 | REAL, DIMENSION(klon), INTENT(IN) :: p1lay | ||
60 | REAL, DIMENSION(klon), INTENT(IN) :: cdragh, cdragm | ||
61 | REAL, DIMENSION(klon), INTENT(IN) :: precip_rain, precip_snow | ||
62 | REAL, DIMENSION(klon), INTENT(IN) :: temp_air, spechum | ||
63 | REAL, DIMENSION(klon), INTENT(IN) :: AcoefH, AcoefQ, BcoefH, BcoefQ | ||
64 | REAL, DIMENSION(klon), INTENT(IN) :: AcoefU, AcoefV, BcoefU, BcoefV | ||
65 | REAL, DIMENSION(klon), INTENT(IN) :: pref ! pressure reference | ||
66 | REAL, DIMENSION(klon), INTENT(IN) :: u1, v1, gustiness | ||
67 | REAL, DIMENSION(klon), INTENT(IN) :: rugoro | ||
68 | REAL, DIMENSION(klon,nbsrf), INTENT(IN) :: pctsrf | ||
69 | REAL, DIMENSION(klon), INTENT(IN) :: lwdown_m ! downwelling longwave radiation at mean surface | ||
70 | ! corresponds to previous sollwdown | ||
71 | REAL, DIMENSION(klon), INTENT(IN) :: q2m, t2m | ||
72 | |||
73 | ! In/Output variables | ||
74 | !**************************************************************************************** | ||
75 | REAL, DIMENSION(klon), INTENT(INOUT) :: snow, qsol | ||
76 | REAL, DIMENSION(klon), INTENT(INOUT) :: agesno | ||
77 | REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil | ||
78 | |||
79 | ! Output variables | ||
80 | !**************************************************************************************** | ||
81 | REAL, DIMENSION(klon), INTENT(OUT) :: z0m, z0h | ||
82 | !albedo SB >>> | ||
83 | ! REAL, DIMENSION(klon), INTENT(OUT) :: alb1_new ! albdeo for shortwave interval 1(visible) | ||
84 | ! REAL, DIMENSION(klon), INTENT(OUT) :: alb2_new ! albedo for shortwave interval 2(near infrared) | ||
85 | REAL, DIMENSION(6), INTENT(IN) :: SFRWL | ||
86 | REAL, DIMENSION(klon,nsw), INTENT(OUT) :: alb_dir_new,alb_dif_new | ||
87 | !albedo SB <<< | ||
88 | REAL, DIMENSION(klon), INTENT(OUT) :: evap | ||
89 | REAL, DIMENSION(klon), INTENT(OUT) :: fluxsens, fluxlat | ||
90 | REAL, DIMENSION(klon), INTENT(OUT) :: qsurf | ||
91 | REAL, DIMENSION(klon), INTENT(OUT) :: tsurf_new | ||
92 | REAL, DIMENSION(klon), INTENT(OUT) :: dflux_s, dflux_l | ||
93 | REAL, DIMENSION(klon), INTENT(OUT) :: flux_u1, flux_v1 ! flux for U and V at first model level | ||
94 | REAL, DIMENSION(klon,nvm_lmdz), INTENT(OUT) :: veget,lai | ||
95 | REAL, DIMENSION(klon,nvm_lmdz), INTENT(OUT) :: height | ||
96 | |||
97 | ! Local variables | ||
98 | !**************************************************************************************** | ||
99 | 960 | REAL, DIMENSION(klon) :: p1lay_tmp | |
100 | 960 | REAL, DIMENSION(klon) :: pref_tmp | |
101 | 960 | REAL, DIMENSION(klon) :: swdown ! downwelling shortwave radiation at land surface | |
102 | 960 | REAL, DIMENSION(klon) :: epot_air ! potential air temperature | |
103 | 960 | REAL, DIMENSION(klon) :: tsol_rad, emis_new ! output from interfsol not used | |
104 | 960 | REAL, DIMENSION(klon) :: u0, v0 ! surface speed | |
105 | INTEGER :: i | ||
106 | |||
107 | !albedo SB >>> | ||
108 | 960 | REAL, DIMENSION(klon) :: alb1_new,alb2_new | |
109 | !albedo SB <<< | ||
110 | |||
111 | !**************************************************************************************** | ||
112 | ! Choice between call to vegetation model (ok_veget=true) or simple calculation below | ||
113 | ! | ||
114 | !**************************************************************************************** | ||
115 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 480 times.
|
480 | IF (ok_veget) THEN |
116 | !**************************************************************************************** | ||
117 | ! Call model sechiba in model ORCHIDEE | ||
118 | ! | ||
119 | !**************************************************************************************** | ||
120 | ✗ | p1lay_tmp(:) = 0.0 | |
121 | ✗ | pref_tmp(:) = 0.0 | |
122 | ✗ | p1lay_tmp(1:knon) = p1lay(1:knon)/100. | |
123 | ✗ | pref_tmp(1:knon) = pref(1:knon)/100. | |
124 | ! | ||
125 | !* Calculate incoming flux for SW and LW interval: swdown | ||
126 | ! | ||
127 | ✗ | swdown(:) = 0.0 | |
128 | ✗ | DO i = 1, knon | |
129 | ✗ | swdown(i) = swnet(i)/(1-albedo(i)) | |
130 | END DO | ||
131 | ! | ||
132 | !* Calculate potential air temperature | ||
133 | ! | ||
134 | ✗ | epot_air(:) = 0.0 | |
135 | ✗ | DO i = 1, knon | |
136 | ✗ | epot_air(i) = RCPD*temp_air(i)*(pref(i)/p1lay(i))**RKAPPA | |
137 | END DO | ||
138 | |||
139 | ! temporary for keeping same results using lwdown_m instead of lwdown | ||
140 | CALL surf_land_orchidee(itime, dtime, date0, knon, & | ||
141 | knindex, rlon, rlat, yrmu0, pctsrf, & | ||
142 | debut, lafin, & | ||
143 | zlev, u1, v1, gustiness, temp_air, spechum, epot_air, ccanopy, & | ||
144 | cdragh, AcoefH, AcoefQ, BcoefH, BcoefQ, & | ||
145 | precip_rain, precip_snow, lwdown_m, swnet, swdown, & | ||
146 | pref_tmp, q2m, t2m, & | ||
147 | evap, fluxsens, fluxlat, & | ||
148 | tsol_rad, tsurf_new, alb1_new, alb2_new, & | ||
149 | emis_new, z0m, z0h, qsurf, & | ||
150 | ✗ | veget, lai, height) | |
151 | ! | ||
152 | !* Add contribution of relief to surface roughness | ||
153 | ! | ||
154 | ✗ | DO i=1,knon | |
155 | ✗ | z0m(i) = MAX(1.5e-05,SQRT(z0m(i)**2 + rugoro(i)**2)) | |
156 | ENDDO | ||
157 | |||
158 | ELSE ! not ok_veget | ||
159 | !**************************************************************************************** | ||
160 | ! No extern vegetation model choosen, call simple bucket calculations instead. | ||
161 | ! | ||
162 | !**************************************************************************************** | ||
163 | CALL surf_land_bucket(itime, jour, knon, knindex, debut, dtime,& | ||
164 | tsurf, p1lay, cdragh, precip_rain, precip_snow, temp_air, & | ||
165 | spechum, AcoefH, AcoefQ, BcoefH, BcoefQ, pref, & | ||
166 | u1, v1, gustiness, rugoro, swnet, lwnet, & | ||
167 | snow, qsol, agesno, tsoil, & | ||
168 | qsurf, z0m, alb1_new, alb2_new, evap, & | ||
169 | 480 | fluxsens, fluxlat, tsurf_new, dflux_s, dflux_l) | |
170 |
2/2✓ Branch 0 taken 480 times.
✓ Branch 1 taken 247680 times.
|
248160 | z0h(1:knon)=z0m(1:knon) ! En attendant mieux |
171 | |||
172 | ENDIF ! ok_veget | ||
173 | |||
174 | !**************************************************************************************** | ||
175 | ! Calculation for all land models | ||
176 | ! - Flux calculation at first modele level for U and V | ||
177 | !**************************************************************************************** | ||
178 | ! Suppose zero surface speed | ||
179 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | u0(:)=0.0 |
180 |
2/2✓ Branch 0 taken 477120 times.
✓ Branch 1 taken 480 times.
|
477600 | v0(:)=0.0 |
181 | CALL calcul_flux_wind(knon, dtime, & | ||
182 | u0, v0, u1, v1, gustiness, cdragm, & | ||
183 | AcoefU, AcoefV, BcoefU, BcoefV, & | ||
184 | p1lay, temp_air, & | ||
185 | 480 | flux_u1, flux_v1) | |
186 | |||
187 | !albedo SB >>> | ||
188 | ✗ | SELECT CASE(NSW) | |
189 | CASE(2) | ||
190 | ✗ | alb_dir_new(1:knon,1)=alb1_new(1:knon) | |
191 | ✗ | alb_dir_new(1:knon,2)=alb2_new(1:knon) | |
192 | CASE(4) | ||
193 | ✗ | alb_dir_new(1:knon,1)=alb1_new(1:knon) | |
194 | ✗ | alb_dir_new(1:knon,2)=alb2_new(1:knon) | |
195 | ✗ | alb_dir_new(1:knon,3)=alb2_new(1:knon) | |
196 | ✗ | alb_dir_new(1:knon,4)=alb2_new(1:knon) | |
197 | CASE(6) | ||
198 |
2/2✓ Branch 0 taken 247680 times.
✓ Branch 1 taken 480 times.
|
248160 | alb_dir_new(1:knon,1)=alb1_new(1:knon) |
199 |
2/2✓ Branch 0 taken 247680 times.
✓ Branch 1 taken 480 times.
|
248160 | alb_dir_new(1:knon,2)=alb1_new(1:knon) |
200 |
2/2✓ Branch 0 taken 247680 times.
✓ Branch 1 taken 480 times.
|
248160 | alb_dir_new(1:knon,3)=alb1_new(1:knon) |
201 |
2/2✓ Branch 0 taken 247680 times.
✓ Branch 1 taken 480 times.
|
248160 | alb_dir_new(1:knon,4)=alb2_new(1:knon) |
202 |
2/2✓ Branch 0 taken 247680 times.
✓ Branch 1 taken 480 times.
|
248160 | alb_dir_new(1:knon,5)=alb2_new(1:knon) |
203 |
3/6✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 480 times.
✓ Branch 4 taken 480 times.
✓ Branch 5 taken 247680 times.
|
248640 | alb_dir_new(1:knon,6)=alb2_new(1:knon) |
204 | END SELECT | ||
205 | |||
206 |
4/4✓ Branch 0 taken 2880 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 2862720 times.
✓ Branch 3 taken 2880 times.
|
2866080 | alb_dif_new=alb_dir_new |
207 | !albedo SB <<< | ||
208 | |||
209 | 480 | END SUBROUTINE surf_land | |
210 | ! | ||
211 | !**************************************************************************************** | ||
212 | ! | ||
213 | END MODULE surf_land_mod | ||
214 | ! | ||
215 | !**************************************************************************************** | ||
216 | ! | ||
217 |