source: LMDZ6/trunk/libf/phylmd/surf_land_mod.F90

Last change on this file was 4526, checked in by evignon, 13 months ago

fix bug from merge of blowing snow branch

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