source: LMDZ6/trunk/libf/phylmd/surf_landice_mod.F90 @ 4245

Last change on this file since 4245 was 4245, checked in by evignon, 20 months ago

controle des z0 sur landice dans les .def et nettoyage surf_landice_mod
pour Valentin

  • 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: 16.3 KB
RevLine 
[781]1!
2MODULE surf_landice_mod
3 
4  IMPLICIT NONE
5
6CONTAINS
7!
8!****************************************************************************************
9!
10  SUBROUTINE surf_landice(itime, dtime, knon, knindex, &
[1865]11       rlon, rlat, debut, lafin, &
12       rmu0, lwdownm, albedo, pphi1, &
[888]13       swnet, lwnet, tsurf, p1lay, &
[1067]14       cdragh, cdragm, precip_rain, precip_snow, temp_air, spechum, &
15       AcoefH, AcoefQ, BcoefH, BcoefQ, &
16       AcoefU, AcoefV, BcoefU, BcoefV, &
[2240]17       ps, u1, v1, gustiness, rugoro, pctsrf, &
[888]18       snow, qsurf, qsol, agesno, &
[2243]19       tsoil, z0m, z0h, SFRWL, alb_dir, alb_dif, evap, fluxsens, fluxlat, &
[1067]20       tsurf_new, dflux_s, dflux_l, &
[3900]21       alt, slope, cloudf, &
[1865]22       snowhgt, qsnow, to_ice, sissnow, &
23       alb3, runoff, &
[1067]24       flux_u1, flux_v1)
[781]25
[1067]26    USE dimphy
[3974]27    USE geometry_mod,     ONLY : longitude,latitude
[3900]28    USE surface_data,     ONLY : type_ocean, calice, calsno, landice_opt, iflag_albcalc
29    USE fonte_neige_mod,  ONLY : fonte_neige,run_off_lic,fqcalving_global,ffonte_global,fqfonte_global,runofflic_global
[1067]30    USE cpl_mod,          ONLY : cpl_send_landice_fields
31    USE calcul_fluxs_mod
[1334]32    USE phys_output_var_mod
[2728]33!FC
34    USE ioipsl_getin_p_mod, ONLY : getin_p
35
[3792]36
37#ifdef CPP_INLANDSIS
38    USE surf_inlandsis_mod,  ONLY : surf_inlandsis
39#endif
40
[1785]41    USE indice_sol_mod
[1067]42
[1785]43!    INCLUDE "indicesol.h"
[781]44    INCLUDE "dimsoil.h"
[793]45    INCLUDE "YOMCST.h"
46    INCLUDE "clesphys.h"
[781]47
48! Input variables
49!****************************************************************************************
50    INTEGER, INTENT(IN)                           :: itime, knon
51    INTEGER, DIMENSION(klon), INTENT(in)          :: knindex
52    REAL, INTENT(in)                              :: dtime
[888]53    REAL, DIMENSION(klon), INTENT(IN)             :: swnet ! net shortwave radiance
54    REAL, DIMENSION(klon), INTENT(IN)             :: lwnet ! net longwave radiance
[781]55    REAL, DIMENSION(klon), INTENT(IN)             :: tsurf
56    REAL, DIMENSION(klon), INTENT(IN)             :: p1lay
[1067]57    REAL, DIMENSION(klon), INTENT(IN)             :: cdragh, cdragm
[781]58    REAL, DIMENSION(klon), INTENT(IN)             :: precip_rain, precip_snow
59    REAL, DIMENSION(klon), INTENT(IN)             :: temp_air, spechum
[1067]60    REAL, DIMENSION(klon), INTENT(IN)             :: AcoefH, AcoefQ
61    REAL, DIMENSION(klon), INTENT(IN)             :: BcoefH, BcoefQ
62    REAL, DIMENSION(klon), INTENT(IN)             :: AcoefU, AcoefV, BcoefU, BcoefV
[781]63    REAL, DIMENSION(klon), INTENT(IN)             :: ps
[2240]64    REAL, DIMENSION(klon), INTENT(IN)             :: u1, v1, gustiness
[781]65    REAL, DIMENSION(klon), INTENT(IN)             :: rugoro
66    REAL, DIMENSION(klon,nbsrf), INTENT(IN)       :: pctsrf
67
[1865]68    LOGICAL,  INTENT(IN)                          :: debut   !true if first step
69    LOGICAL,  INTENT(IN)                          :: lafin   !true if last step
70    REAL, DIMENSION(klon), INTENT(IN)             :: rlon, rlat
71    REAL, DIMENSION(klon), INTENT(IN)             :: rmu0
72    REAL, DIMENSION(klon), INTENT(IN)             :: lwdownm !ylwdown
73    REAL, DIMENSION(klon), INTENT(IN)             :: albedo  !mean albedo
74    REAL, DIMENSION(klon), INTENT(IN)             :: pphi1   
[3900]75    REAL, DIMENSION(klon), INTENT(IN)             :: alt   !mean altitude of the grid box 
[1865]76    REAL, DIMENSION(klon), INTENT(IN)             :: slope   !mean slope in grid box 
77    REAL, DIMENSION(klon), INTENT(IN)             :: cloudf  !total cloud fraction
78
[781]79! In/Output variables
80!****************************************************************************************
81    REAL, DIMENSION(klon), INTENT(INOUT)          :: snow, qsol
82    REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
83    REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
84
85! Output variables
86!****************************************************************************************
87    REAL, DIMENSION(klon), INTENT(OUT)            :: qsurf
[2243]88    REAL, DIMENSION(klon), INTENT(OUT)            :: z0m, z0h
[2227]89!albedo SB >>>
90!    REAL, DIMENSION(klon), INTENT(OUT)            :: alb1  ! new albedo in visible SW interval
91!    REAL, DIMENSION(klon), INTENT(OUT)            :: alb2  ! new albedo in near IR interval
[3792]92    REAL, DIMENSION(6), INTENT(IN)                :: SFRWL
93    REAL, DIMENSION(klon,nsw), INTENT(OUT)        :: alb_dir,alb_dif
[2227]94!albedo SB <<<
[781]95    REAL, DIMENSION(klon), INTENT(OUT)            :: evap, fluxsens, fluxlat
[888]96    REAL, DIMENSION(klon), INTENT(OUT)            :: tsurf_new
[781]97    REAL, DIMENSION(klon), INTENT(OUT)            :: dflux_s, dflux_l     
[1067]98    REAL, DIMENSION(klon), INTENT(OUT)            :: flux_u1, flux_v1
[781]99
[1865]100    REAL, DIMENSION(klon), INTENT(OUT)           :: alb3
101    REAL, DIMENSION(klon), INTENT(OUT)           :: qsnow   !column water in snow [kg/m2]
102    REAL, DIMENSION(klon), INTENT(OUT)           :: snowhgt !Snow height (m)
103    REAL, DIMENSION(klon), INTENT(OUT)           :: to_ice
104    REAL, DIMENSION(klon), INTENT(OUT)           :: sissnow
105    REAL, DIMENSION(klon), INTENT(OUT)           :: runoff  !Land ice runoff
106 
107
[781]108! Local variables
109!****************************************************************************************
110    REAL, DIMENSION(klon)    :: soilcap, soilflux
111    REAL, DIMENSION(klon)    :: cal, beta, dif_grnd
112    REAL, DIMENSION(klon)    :: zfra, alb_neig
[888]113    REAL, DIMENSION(klon)    :: radsol
[3792]114    REAL, DIMENSION(klon)    :: u0, v0, u1_lay, v1_lay, ustar
115    INTEGER                  :: i,j,nt
[3900]116    REAL, DIMENSION(klon)    :: fqfonte,ffonte
[1865]117    REAL, DIMENSION(klon)    :: emis_new                  !Emissivity
118    REAL, DIMENSION(klon)    :: swdown,lwdown
[3900]119    REAL, DIMENSION(klon)    :: precip_snow_adv, snow_adv !Snow Drift precip./advection (not used in inlandsis)
120    REAL, DIMENSION(klon)    :: erod                      !erosion of surface snow (flux, kg/m2/s like evap)
121    REAL, DIMENSION(klon)    :: zsl_height, wind_velo     !surface layer height, wind spd
[1865]122    REAL, DIMENSION(klon)    :: dens_air,  snow_cont_air  !air density; snow content air
123    REAL, DIMENSION(klon)    :: alb_soil                  !albedo of underlying ice
124    REAL, DIMENSION(klon)    :: pexner                    !Exner potential
125    REAL                     :: pref
[3792]126    REAL, DIMENSION(klon,nsoilmx) :: tsoil0               !modif
127    REAL                          :: dtis                ! subtimestep
128    LOGICAL                       :: debut_is, lafin_is  ! debut and lafin for inlandsis
[1865]129
130    CHARACTER (len = 20)                      :: modname = 'surf_landice'
131    CHARACTER (len = 80)                      :: abort_message
132
[2728]133
[3900]134    REAL,DIMENSION(klon) :: alb1,alb2
135    REAL, DIMENSION (klon,6) :: alb6
[781]136! End definition
137!****************************************************************************************
[2728]138!FC
139!FC
140   REAL,SAVE :: alb_vis_sno_lic
141  !$OMP THREADPRIVATE(alb_vis_sno_lic)
142   REAL,SAVE :: alb_nir_sno_lic
143  !$OMP THREADPRIVATE(alb_nir_sno_lic)
144  LOGICAL, SAVE :: firstcall = .TRUE.
145  !$OMP THREADPRIVATE(firstcall)
146
147
[3792]148!FC firtscall initializations
149!******************************************************************************************
[2728]150  IF (firstcall) THEN
151  alb_vis_sno_lic=0.77
152  CALL getin_p('alb_vis_sno_lic',alb_vis_sno_lic)
153           PRINT*, 'alb_vis_sno_lic',alb_vis_sno_lic
154  alb_nir_sno_lic=0.77
155  CALL getin_p('alb_nir_sno_lic',alb_nir_sno_lic)
156           PRINT*, 'alb_nir_sno_lic',alb_nir_sno_lic
[3792]157 
[2728]158  firstcall=.false.
159  ENDIF
[3792]160!******************************************************************************************
161
[781]162! Initialize output variables
[1865]163    alb3(:) = 999999.
[888]164    alb2(:) = 999999.
165    alb1(:) = 999999.
[1865]166   
167    runoff(:) = 0.
[888]168!****************************************************************************************
169! Calculate total absorbed radiance at surface
170!
171!****************************************************************************************
172    radsol(:) = 0.0
173    radsol(1:knon) = swnet(1:knon) + lwnet(1:knon)
[781]174
175!****************************************************************************************
[3792]176!  landice_opt = 0 : soil_model, calcul_flux, fonte_neige, ... 
[3901]177!  landice_opt = 1  : prepare and call INterace Lmdz SISvat (INLANDSIS)
[1865]178!****************************************************************************************
[3792]179
180
181    IF (landice_opt .EQ. 1) THEN
182
[3901]183!****************************************************************************************   
[3792]184! CALL to INLANDSIS interface
185!****************************************************************************************
186#ifdef CPP_INLANDSIS
187
188        debut_is=debut
189        lafin_is=.false.
190        ! Suppose zero surface speed
191        u0(:)            = 0.0
192        v0(:)            = 0.0
193
194
195        CALL calcul_flux_wind(knon, dtime, &
196         u0, v0, u1, v1, gustiness, cdragm, &
197         AcoefU, AcoefV, BcoefU, BcoefV, &
198         p1lay, temp_air, &
199         flux_u1, flux_v1)
200
201       
202       ! Set constants and compute some input for SISVAT
203       ! = 1000 hPa
204       ! and calculate incoming flux for SW and LW interval: swdown, lwdown
205       swdown(:)        = 0.0
206       lwdown(:)        = 0.0
[3900]207       snow_cont_air(:) = 0.  ! the snow content in air is not a prognostic variable of the model     
[3792]208       alb_soil(:)      = 0.4 ! before albedo(:) but here it is the ice albedo that we have to set
209       ustar(:)         = 0.
210       pref             = 100000.       
211       DO i = 1, knon
212          swdown(i)        = swnet(i)/(1-albedo(i))
213          lwdown(i)        = lwdownm(i)
214          wind_velo(i)     = u1(i)**2 + v1(i)**2
215          wind_velo(i)     = wind_velo(i)**0.5
216          pexner(i)        = (p1lay(i)/pref)**(RD/RCPD)
217          dens_air(i)      = p1lay(i)/RD/temp_air(i)  ! dry air density
218          zsl_height(i)    = pphi1(i)/RG     
219          tsoil0(i,:)      = tsoil(i,:) 
220          ustar(i)= (cdragm(i)*(wind_velo(i)**2))**0.5   
221       END DO
222       
223
224
[3900]225        dtis=dtime
[3792]226
[3900]227          IF (lafin) THEN
[3792]228            lafin_is=.true.
229          END IF
230
[3900]231          CALL surf_inlandsis(knon, rlon, rlat, knindex, itime, dtis, debut_is, lafin_is,&
232            rmu0, swdown, lwdown, albedo, pexner, ps, p1lay, precip_rain, precip_snow,   &
233            zsl_height, wind_velo, ustar, temp_air, dens_air, spechum, tsurf,&
234            rugoro, snow_cont_air, alb_soil, alt, slope, cloudf, &
235            radsol, qsol, tsoil0, snow, zfra, snowhgt, qsnow, to_ice, sissnow,agesno,   &
[3792]236            AcoefH, AcoefQ, BcoefH, BcoefQ, cdragm, cdragh, &
[3900]237            run_off_lic, fqfonte, ffonte, evap, erod, fluxsens, fluxlat,dflux_s, dflux_l, &
238            tsurf_new, alb1, alb2, alb3, alb6, &
239            emis_new, z0m, z0h, qsurf)
[3792]240
[3900]241          debut_is=.false.
[3792]242
243
[3900]244        ! Treatment of snow melting and calving
[3792]245
[3900]246        ! for consistency with standard LMDZ, add calving to run_off_lic
247        run_off_lic(:)=run_off_lic(:) + to_ice(:)
248
249        DO i = 1, knon
250           ffonte_global(knindex(i),is_lic)    = ffonte(i)
251           fqfonte_global(knindex(i),is_lic)   = fqfonte(i)! net melting= melting - refreezing
252           fqcalving_global(knindex(i),is_lic) = to_ice(i) ! flux
253           runofflic_global(knindex(i)) = run_off_lic(i)
254        ENDDO
255        ! Here, we assume that the calving term is equal to the to_ice term
256        ! (no ice accumulation)
257
258
[3792]259#else
[3901]260       abort_message='Pb de coherence: landice_opt = 1  mais CPP_INLANDSIS = .false.'
[3792]261       CALL abort_physic(modname,abort_message,1)
262#endif
263
264
265
266    ELSE
267
268!****************************************************************************************
[781]269! Soil calculations
270!
271!****************************************************************************************
[3780]272
273    ! EV: use calbeta
274    CALL calbeta(dtime, is_lic, knon, snow, qsol, beta, cal, dif_grnd)
275
276
277    ! use soil model and recalculate properly cal
[781]278    IF (soil_model) THEN
[3974]279       CALL soil(dtime, is_lic, knon, snow, tsurf, qsol, &
280        & longitude(knindex(1:knon)), latitude(knindex(1:knon)), tsoil, soilcap, soilflux)
[781]281       cal(1:knon) = RCPD / soilcap(1:knon)
282       radsol(1:knon)  = radsol(1:knon) + soilflux(1:knon)
283    ELSE
284       cal = RCPD * calice
285       WHERE (snow > 0.0) cal = RCPD * calsno
286    ENDIF
287
288
289!****************************************************************************************
290! Calulate fluxes
291!
292!****************************************************************************************
[3792]293!    beta(:) = 1.0
294!    dif_grnd(:) = 0.0
[781]295
[1067]296! Suppose zero surface speed
297    u0(:)=0.0
298    v0(:)=0.0
299    u1_lay(:) = u1(:) - u0(:)
300    v1_lay(:) = v1(:) - v0(:)
301
[781]302    CALL calcul_fluxs(knon, is_lic, dtime, &
[2254]303         tsurf, p1lay, cal, beta, cdragh, cdragh, ps, &
[781]304         precip_rain, precip_snow, snow, qsurf,  &
[2240]305         radsol, dif_grnd, temp_air, spechum, u1_lay, v1_lay, gustiness, &
[2254]306         1.,AcoefH, AcoefQ, BcoefH, BcoefQ, &
[781]307         tsurf_new, evap, fluxlat, fluxsens, dflux_s, dflux_l)
308
[1067]309    CALL calcul_flux_wind(knon, dtime, &
[2240]310         u0, v0, u1, v1, gustiness, cdragm, &
[1067]311         AcoefU, AcoefV, BcoefU, BcoefV, &
312         p1lay, temp_air, &
313         flux_u1, flux_v1)
[781]314
315!****************************************************************************************
316! Calculate snow height, age, run-off,..
317!   
318!****************************************************************************************
[3792]319    CALL fonte_neige(knon, is_lic, knindex, dtime, &
[781]320         tsurf, precip_rain, precip_snow, &
321         snow, qsol, tsurf_new, evap)
322
323
324!****************************************************************************************
325! Calculate albedo
326!
327!****************************************************************************************
328    CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)) 
[3780]329
[781]330    WHERE (snow(1 : knon) .LT. 0.0001) agesno(1 : knon) = 0.
331    zfra(1:knon) = MAX(0.0,MIN(1.0,snow(1:knon)/(snow(1:knon)+10.0)))
[888]332    alb1(1:knon) = alb_neig(1:knon)*zfra(1:knon) + &
[781]333         0.6 * (1.0-zfra(1:knon))
334!
335!IM: plusieurs choix/tests sur l'albedo des "glaciers continentaux"
[888]336!       alb1(1 : knon)  = 0.6 !IM cf FH/GK
337!       alb1(1 : knon)  = 0.82
338!       alb1(1 : knon)  = 0.77 !211003 Ksta0.77
339!       alb1(1 : knon)  = 0.8 !KstaTER0.8 & LMD_ARMIP5
[781]340!IM: KstaTER0.77 & LMD_ARMIP6   
341
[3780]342! Attantion: alb1 and alb2 are not the same!
[2728]343    alb1(1:knon)  = alb_vis_sno_lic
344    alb2(1:knon)  = alb_nir_sno_lic
[781]345
346
347!****************************************************************************************
348! Rugosity
349!
350!****************************************************************************************
[4245]351    z0m = z0m_landice
352    z0h = z0h_landice
353    !z0m = SQRT(z0m**2+rugoro**2)
[2243]354
[781]355
[1865]356
[3792]357    END IF ! landice_opt
358
359
[781]360!****************************************************************************************
361! Send run-off on land-ice to coupler if coupled ocean.
[3903]362! run_off_lic has been calculated in fonte_neige or surf_inlandsis
[781]363!
364!****************************************************************************************
[996]365    IF (type_ocean=='couple') THEN
[781]366       CALL cpl_send_landice_fields(itime, knon, knindex, run_off_lic)
367    ENDIF
[1865]368
369 ! transfer runoff rate [kg/m2/s](!) to physiq for output
370    runoff(1:knon)=run_off_lic(1:knon)/dtime
371
[1334]372 
373!****************************************************************************************
[3792]374! Etienne: comment these lines because of duplication just below
375!       snow_o=0.
376!       zfra_o = 0.
377!       DO j = 1, knon
378!           i = knindex(j)
379!           snow_o(i) = snow(j)
380!           zfra_o(i) = zfra(j)
381!       ENDDO
382!
[1403]383!****************************************************************************************
384       snow_o=0.
385       zfra_o = 0.
386       DO j = 1, knon
387           i = knindex(j)
388           snow_o(i) = snow(j)
389           zfra_o(i) = zfra(j)
390       ENDDO
391
392
[2227]393!albedo SB >>>
394     select case(NSW)
395     case(2)
396       alb_dir(1:knon,1)=alb1(1:knon)
397       alb_dir(1:knon,2)=alb2(1:knon)
398     case(4)
399       alb_dir(1:knon,1)=alb1(1:knon)
400       alb_dir(1:knon,2)=alb2(1:knon)
401       alb_dir(1:knon,3)=alb2(1:knon)
402       alb_dir(1:knon,4)=alb2(1:knon)
403     case(6)
404       alb_dir(1:knon,1)=alb1(1:knon)
405       alb_dir(1:knon,2)=alb1(1:knon)
406       alb_dir(1:knon,3)=alb1(1:knon)
407       alb_dir(1:knon,4)=alb2(1:knon)
408       alb_dir(1:knon,5)=alb2(1:knon)
409       alb_dir(1:knon,6)=alb2(1:knon)
[3900]410
[3901]411       IF ((landice_opt .EQ. 1) .AND. (iflag_albcalc .EQ. 2)) THEN
[3900]412       alb_dir(1:knon,1)=alb6(1:knon,1)
413       alb_dir(1:knon,2)=alb6(1:knon,2)
414       alb_dir(1:knon,3)=alb6(1:knon,3)
415       alb_dir(1:knon,4)=alb6(1:knon,4)
416       alb_dir(1:knon,5)=alb6(1:knon,5)
417       alb_dir(1:knon,6)=alb6(1:knon,6)
418       ENDIF
419
[2227]420     end select
421alb_dif=alb_dir
422!albedo SB <<<
423
[3900]424 
425 
[2227]426
[781]427  END SUBROUTINE surf_landice
428!
429!****************************************************************************************
430!
431END MODULE surf_landice_mod
432
433
434
Note: See TracBrowser for help on using the repository browser.