source: LMDZ5/branches/LMDZ_tree_FC/libf/phylmd/surf_land_mod.F90 @ 2924

Last change on this file since 2924 was 2924, checked in by fcheruy, 7 years ago

Creation of LMDZ branch to incorporate tree drag from ORCHIDEE.
Should merge in LMDZ trunk quickly

  1. Cheruy with assistance from LF
  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 9.1 KB
Line 
1!
2MODULE surf_land_mod
3#ifndef LMDZ_nofrein
4
5  IMPLICIT NONE
6
7CONTAINS
8!
9!****************************************************************************************
10
11  SUBROUTINE surf_land(itime, dtime, date0, jour, knon, knindex, &
12       rlon, rlat, yrmu0, &
13       debut, lafin, zlev, ccanopy, swnet, lwnet, albedo, &
14       tsurf, p1lay, cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum, &
15       AcoefH, AcoefQ, BcoefH, BcoefQ, &
16       AcoefU, AcoefV, BcoefU, BcoefV, &
17       pref, u1, v1, gustiness, rugoro, pctsrf, &
18       lwdown_m, q2m, t2m, &
19       snow, qsol, agesno, tsoil, &
20       z0m, z0h, SFRWL, alb_dir_new, alb_dif_new, evap, fluxsens, fluxlat, &   
21       qsurf, tsurf_new, dflux_s, dflux_l, &
22       flux_u1, flux_v1 , &
23       veget,lai,height)
24
25!FCveget,lai,height, &
26
27    USE dimphy
28    USE surface_data, ONLY    : ok_veget
29
30    ! See comments in each module surf_land_orchidee_xxx for compatiblity with ORCHIDEE
31#ifdef ORCHIDEE_NOOPENMP
32    ! Compilation with cpp key ORCHIDEE NOOPENMP
33    USE surf_land_orchidee_noopenmp_mod
34#else
35#if ORCHIDEE_NOZ0H
36    ! Compilation with cpp key ORCHIDEE NOZ0H
37    USE surf_land_orchidee_noz0h_mod
38#else
39#if ORCHIDEE_NOFREIN
40    ! Compilation with cpp key ORCHIDEE_NOFREIN
41    USE surf_land_orchidee_nofrein_mod
42#else
43    USE surf_land_orchidee_mod
44#endif
45#endif
46#endif
47
48    USE surf_land_bucket_mod
49    USE calcul_fluxs_mod
50    USE indice_sol_mod
51
52    INCLUDE "dimsoil.h"
53    INCLUDE "YOMCST.h"
54!albedo SB >>>
55    INCLUDE "clesphys.h"
56!albedo SB <<<
57!FC
58   INCLUDE "dimpft.h"
59
60
61! Input variables 
62!****************************************************************************************
63    INTEGER, INTENT(IN)                     :: itime, jour, knon
64    INTEGER, DIMENSION(klon), INTENT(IN)    :: knindex
65    REAL, INTENT(IN)                        :: date0
66    REAL, DIMENSION(klon), INTENT(IN)       :: rlon, rlat
67    REAL, DIMENSION(klon), INTENT(IN)       :: yrmu0  ! cosine of solar zenith angle
68    LOGICAL, INTENT(IN)                     :: debut, lafin
69    REAL, INTENT(IN)                        :: dtime
70    REAL, DIMENSION(klon), INTENT(IN)       :: zlev, ccanopy
71    REAL, DIMENSION(klon), INTENT(IN)       :: swnet, lwnet
72    REAL, DIMENSION(klon), INTENT(IN)       :: albedo  ! albedo for whole short-wave interval
73    REAL, DIMENSION(klon), INTENT(IN)       :: tsurf
74    REAL, DIMENSION(klon), INTENT(IN)       :: p1lay
75    REAL, DIMENSION(klon), INTENT(IN)       :: cdragh, cdragm
76    REAL, DIMENSION(klon), INTENT(IN)       :: precip_rain, precip_snow
77    REAL, DIMENSION(klon), INTENT(IN)       :: temp_air, spechum
78    REAL, DIMENSION(klon), INTENT(IN)       :: AcoefH, AcoefQ, BcoefH, BcoefQ
79    REAL, DIMENSION(klon), INTENT(IN)       :: AcoefU, AcoefV, BcoefU, BcoefV
80    REAL, DIMENSION(klon), INTENT(IN)       :: pref   ! pressure reference
81    REAL, DIMENSION(klon), INTENT(IN)       :: u1, v1, gustiness
82    REAL, DIMENSION(klon), INTENT(IN)       :: rugoro
83    REAL, DIMENSION(klon,nbsrf), INTENT(IN) :: pctsrf
84    REAL, DIMENSION(klon), INTENT(IN)       :: lwdown_m  ! downwelling longwave radiation at mean surface
85                                                         ! corresponds to previous sollwdown
86    REAL, DIMENSION(klon), INTENT(IN)       :: q2m, t2m
87
88! In/Output variables
89!****************************************************************************************
90    REAL, DIMENSION(klon), INTENT(INOUT)          :: snow, qsol
91    REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
92    REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
93
94! Output variables
95!****************************************************************************************
96    REAL, DIMENSION(klon), INTENT(OUT)       :: z0m, z0h
97!albedo SB >>>
98!    REAL, DIMENSION(klon), INTENT(OUT)       :: alb1_new ! albdeo for shortwave interval 1(visible)
99!    REAL, DIMENSION(klon), INTENT(OUT)       :: alb2_new ! albedo for shortwave interval 2(near infrared)
100    REAL, DIMENSION(6), INTENT(IN) :: SFRWL
101    REAL, DIMENSION(klon,nsw), INTENT(OUT)       :: alb_dir_new,alb_dif_new
102!albedo SB <<<
103    REAL, DIMENSION(klon), INTENT(OUT)       :: evap
104    REAL, DIMENSION(klon), INTENT(OUT)       :: fluxsens, fluxlat
105    REAL, DIMENSION(klon), INTENT(OUT)       :: qsurf
106    REAL, DIMENSION(klon), INTENT(OUT)       :: tsurf_new
107    REAL, DIMENSION(klon), INTENT(OUT)       :: dflux_s, dflux_l     
108    REAL, DIMENSION(klon), INTENT(OUT)       :: flux_u1, flux_v1  ! flux for U and V at first model level
109!FC
110    REAL, DIMENSION(klon,nvm_lmdz), INTENT(OUT)       :: veget,lai
111    REAL, DIMENSION(klon,nvm_lmdz), INTENT(OUT)            :: height
112
113! Local variables
114!****************************************************************************************
115    REAL, DIMENSION(klon) :: p1lay_tmp
116    REAL, DIMENSION(klon) :: pref_tmp
117    REAL, DIMENSION(klon) :: swdown     ! downwelling shortwave radiation at land surface
118    REAL, DIMENSION(klon) :: epot_air           ! potential air temperature
119    REAL, DIMENSION(klon) :: tsol_rad, emis_new ! output from interfsol not used
120    REAL, DIMENSION(klon) :: u0, v0     ! surface speed
121    INTEGER               :: i
122
123!albedo SB >>>
124    REAL, DIMENSION(klon)      :: alb1_new,alb2_new
125!albedo SB <<<
126
127
128!****************************************************************************************
129! Choice between call to vegetation model (ok_veget=true) or simple calculation below
130!
131!****************************************************************************************
132   IF (ok_veget) THEN
133!****************************************************************************************
134!  Call model sechiba in model ORCHIDEE
135!
136!****************************************************************************************
137       p1lay_tmp(:)      = 0.0
138       pref_tmp(:)       = 0.0
139       p1lay_tmp(1:knon) = p1lay(1:knon)/100.
140       pref_tmp(1:knon)  = pref(1:knon)/100.
141!
142!* Calculate incoming flux for SW and LW interval: swdown
143!
144       swdown(:) = 0.0
145       DO i = 1, knon
146          swdown(i) = swnet(i)/(1-albedo(i))
147       END DO
148!
149!* Calculate potential air temperature
150!
151       epot_air(:) = 0.0
152       DO i = 1, knon
153          epot_air(i) = RCPD*temp_air(i)*(pref(i)/p1lay(i))**RKAPPA
154       END DO
155
156       ! temporary for keeping same results using lwdown_m instead of lwdown
157       CALL surf_land_orchidee(itime, dtime, date0, knon, &
158            knindex, rlon, rlat, yrmu0, pctsrf, &
159            debut, lafin, &
160            zlev,  u1, v1, gustiness, temp_air, spechum, epot_air, ccanopy, &
161            cdragh, AcoefH, AcoefQ, BcoefH, BcoefQ, &
162            precip_rain, precip_snow, lwdown_m, swnet, swdown, &
163            pref_tmp, q2m, t2m, &
164            evap, fluxsens, fluxlat, &             
165            tsol_rad, tsurf_new, alb1_new, alb2_new, &
166            emis_new, z0m, z0h, qsurf, &
167            veget, lai, height)       
168
169!    print*, " FC SORTIE surf_land_orchidee" ,height(1:100,2)
170!FC
171
172
173
174!* Add contribution of relief to surface roughness
175
176       DO i=1,knon
177          z0m(i) = MAX(1.5e-05,SQRT(z0m(i)**2 + rugoro(i)**2))
178       ENDDO
179
180    ELSE  ! not ok_veget
181!****************************************************************************************
182! No extern vegetation model choosen, call simple bucket calculations instead.
183!
184!****************************************************************************************
185       CALL surf_land_bucket(itime, jour, knon, knindex, debut, dtime,&
186            tsurf, p1lay, cdragh, precip_rain, precip_snow, temp_air, &
187            spechum, AcoefH, AcoefQ, BcoefH, BcoefQ, pref, &
188            u1, v1, gustiness, rugoro, swnet, lwnet, &
189            snow, qsol, agesno, tsoil, &
190            qsurf, z0m, alb1_new, alb2_new, evap, &
191            fluxsens, fluxlat, tsurf_new, dflux_s, dflux_l)
192        z0h(1:knon)=z0m(1:knon) ! En attendant mieux
193
194    ENDIF ! ok_veget
195
196!****************************************************************************************
197! Calculation for all land models
198! - Flux calculation at first modele level for U and V
199!****************************************************************************************
200! Suppose zero surface speed
201    u0(:)=0.0
202    v0(:)=0.0
203    CALL calcul_flux_wind(knon, dtime, &
204         u0, v0, u1, v1, gustiness, cdragm, &
205         AcoefU, AcoefV, BcoefU, BcoefV, &
206         p1lay, temp_air, &
207         flux_u1, flux_v1)
208
209!albedo SB >>>
210
211
212     select case(NSW)
213     case(2)
214       alb_dir_new(1:knon,1)=alb1_new(1:knon)
215       alb_dir_new(1:knon,2)=alb2_new(1:knon)
216     case(4)
217       alb_dir_new(1:knon,1)=alb1_new(1:knon)
218       alb_dir_new(1:knon,2)=alb2_new(1:knon)
219       alb_dir_new(1:knon,3)=alb2_new(1:knon)
220       alb_dir_new(1:knon,4)=alb2_new(1:knon)
221     case(6)
222       alb_dir_new(1:knon,1)=alb1_new(1:knon)
223       alb_dir_new(1:knon,2)=alb1_new(1:knon)
224       alb_dir_new(1:knon,3)=alb1_new(1:knon)
225       alb_dir_new(1:knon,4)=alb2_new(1:knon)
226       alb_dir_new(1:knon,5)=alb2_new(1:knon)
227       alb_dir_new(1:knon,6)=alb2_new(1:knon)
228     end select
229alb_dif_new=alb_dir_new
230!albedo SB <<<
231
232
233   
234  END SUBROUTINE surf_land
235!
236!****************************************************************************************
237
238#endif
239END MODULE surf_land_mod
240!
241!****************************************************************************************
242
Note: See TracBrowser for help on using the repository browser.