Ignore:
Timestamp:
Jan 4, 2021, 6:01:25 PM (3 years ago)
Author:
evignon
Message:

Ajout de INLANDSIS, nouvelle interface entre LMDZ et la neige de SISVAT
Etienne, 04/01/2021

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/surf_landice_mod.F90

    r3780 r3792  
    2525
    2626    USE dimphy
    27     USE surface_data,     ONLY : type_ocean, calice, calsno, ok_snow
     27    USE surface_data,     ONLY : type_ocean, calice, calsno, landice_opt, n_dtis
    2828    USE fonte_neige_mod,  ONLY : fonte_neige, run_off_lic
    2929    USE cpl_mod,          ONLY : cpl_send_landice_fields
     
    3636    USE surf_sisvat_mod,  ONLY : surf_sisvat
    3737#endif
     38
     39#ifdef CPP_INLANDSIS
     40    USE surf_inlandsis_mod,  ONLY : surf_inlandsis
     41#endif
     42
    3843    USE indice_sol_mod
    3944
     
    8691!    REAL, DIMENSION(klon), INTENT(OUT)            :: alb1  ! new albedo in visible SW interval
    8792!    REAL, DIMENSION(klon), INTENT(OUT)            :: alb2  ! new albedo in near IR interval
    88     REAL, DIMENSION(6), INTENT(IN)              ::SFRWL
    89     REAL, DIMENSION(klon,nsw), INTENT(OUT)        ::alb_dir,alb_dif
     93    REAL, DIMENSION(6), INTENT(IN)                :: SFRWL
     94    REAL, DIMENSION(klon,nsw), INTENT(OUT)        :: alb_dir,alb_dif
    9095!albedo SB <<<
    9196    REAL, DIMENSION(klon), INTENT(OUT)            :: evap, fluxsens, fluxlat
     
    108113    REAL, DIMENSION(klon)    :: zfra, alb_neig
    109114    REAL, DIMENSION(klon)    :: radsol
    110     REAL, DIMENSION(klon)    :: u0, v0, u1_lay, v1_lay
    111     INTEGER                  :: i,j
     115    REAL, DIMENSION(klon)    :: u0, v0, u1_lay, v1_lay, ustar
     116    INTEGER                  :: i,j,nt
    112117
    113118    REAL, DIMENSION(klon)    :: emis_new                  !Emissivity
    114119    REAL, DIMENSION(klon)    :: swdown,lwdown
    115120    REAL, DIMENSION(klon)    :: precip_snow_adv, snow_adv !Snow Drift precip./advection
    116     REAL, DIMENSION(klon)    :: bl_height, wind_velo      !height boundary layer, wind spd
     121    REAL, DIMENSION(klon)    :: zsl_height, wind_velo      !surface layer height, wind spd
    117122    REAL, DIMENSION(klon)    :: dens_air,  snow_cont_air  !air density; snow content air
    118123    REAL, DIMENSION(klon)    :: alb_soil                  !albedo of underlying ice
    119124    REAL, DIMENSION(klon)    :: pexner                    !Exner potential
    120125    REAL                     :: pref
    121     REAL, DIMENSION(klon,nsoilmx) :: tsoil0 !modfi
     126    REAL, DIMENSION(klon,nsoilmx) :: tsoil0               !modif
     127    REAL                          :: dtis                ! subtimestep
     128    LOGICAL                       :: debut_is, lafin_is  ! debut and lafin for inlandsis
    122129
    123130    CHARACTER (len = 20)                      :: modname = 'surf_landice'
     
    139146  LOGICAL, SAVE :: firstcall = .TRUE.
    140147  !$OMP THREADPRIVATE(firstcall)
    141 !FC
    142 
    143 
     148
     149
     150!FC firtscall initializations
     151!******************************************************************************************
    144152  IF (firstcall) THEN
    145153  alb_vis_sno_lic=0.77
     
    149157  CALL getin_p('alb_nir_sno_lic',alb_nir_sno_lic)
    150158           PRINT*, 'alb_nir_sno_lic',alb_nir_sno_lic
     159 
     160!  z0m=1.e-3
     161!  z0h = z0m
    151162  firstcall=.false.
    152163  ENDIF
    153 !
     164!******************************************************************************************
     165
    154166! Initialize output variables
    155167    alb3(:) = 999999.
     
    166178
    167179!****************************************************************************************
    168 !   ok_snow = TRUE  : prepare and call SISVAT snow model
    169 !   ok_snow = FALSE : soil_model, calcul_flux, fonte_neige, ...
    170 !
    171 !****************************************************************************************
    172     IF (ok_snow) THEN
     180!  landice_opt = 0 : soil_model, calcul_flux, fonte_neige, ... 
     181!  landice_opt = 1  : prepare and call SISVAT snow model
     182!  landice_opt = 2  : prepare and call INLANDSIS snow model
     183!****************************************************************************************
     184
     185
     186    IF (landice_opt .EQ. 1) THEN
     187   
     188!****************************************************************************************
     189! CALL to SISVAT interface
     190!****************************************************************************************
     191
    173192#ifdef CPP_SISVAT
    174193       ! Prepare for calling SISVAT
     
    192211          pexner(i)        = (p1lay(i)/pref)**(RD/RCPD)
    193212          dens_air(i)      = p1lay(i)/RD/temp_air(i)  ! dry air density
    194           bl_height(i)     = pphi1(i)/RG             
     213          zsl_height(i)     = pphi1(i)/RG             
    195214       END DO
    196215
    197 !****************************************************************************************
    198 ! CALL to SISVAT interface
    199 !
    200 !****************************************************************************************
     216
    201217       ! config: compute everything with SV but temperatures afterwards with soil/calculfluxs
    202218       DO i = 1, knon
     
    209225            rmu0, swdown, lwdown, pexner, ps, p1lay, &
    210226            precip_rain, precip_snow, precip_snow_adv, snow_adv, &
    211             bl_height, wind_velo, temp_air, dens_air, spechum, tsurf, &
     227            zsl_height, wind_velo, temp_air, dens_air, spechum, tsurf, &
    212228            rugoro, snow_cont_air, alb_soil, slope, cloudf, &
    213229            radsol, qsol, tsoil0, snow, snowhgt, qsnow, to_ice,sissnow, agesno, &
     
    232248            flux_u1, flux_v1)
    233249#else
    234        abort_message='Pb de coherence: ok_snow = .true. mais CPP_SISVAT = .false.'
     250       abort_message='Pb de coherence: landice_opt = 1 mais CPP_SISVAT = .false.'
    235251       CALL abort_physic(modname,abort_message,1)
    236252#endif
    237     ELSE ! ok_snow=FALSE
     253
     254!****************************************************************************************
     255! CALL to INLANDSIS interface
     256!****************************************************************************************
     257
     258    ELSE IF (landice_opt .EQ. 2) THEN
     259#ifdef CPP_INLANDSIS
     260
     261        debut_is=debut
     262        lafin_is=.false.
     263        ! Suppose zero surface speed
     264        u0(:)            = 0.0
     265        v0(:)            = 0.0
     266
     267
     268        CALL calcul_flux_wind(knon, dtime, &
     269         u0, v0, u1, v1, gustiness, cdragm, &
     270         AcoefU, AcoefV, BcoefU, BcoefV, &
     271         p1lay, temp_air, &
     272         flux_u1, flux_v1)
     273
     274       
     275       ! Set constants and compute some input for SISVAT
     276       ! = 1000 hPa
     277       ! and calculate incoming flux for SW and LW interval: swdown, lwdown
     278       swdown(:)        = 0.0
     279       lwdown(:)        = 0.0
     280       snow_adv(:)      = 0.  ! no snow blown in for now
     281       snow_cont_air(:) = 0.       
     282       alb_soil(:)      = 0.4 ! before albedo(:) but here it is the ice albedo that we have to set
     283       ustar(:)         = 0.
     284       pref             = 100000.       
     285       DO i = 1, knon
     286          swdown(i)        = swnet(i)/(1-albedo(i))
     287          lwdown(i)        = lwdownm(i)
     288          wind_velo(i)     = u1(i)**2 + v1(i)**2
     289          wind_velo(i)     = wind_velo(i)**0.5
     290          pexner(i)        = (p1lay(i)/pref)**(RD/RCPD)
     291          dens_air(i)      = p1lay(i)/RD/temp_air(i)  ! dry air density
     292          zsl_height(i)    = pphi1(i)/RG     
     293          tsoil0(i,:)      = tsoil(i,:) 
     294          ustar(i)= (cdragm(i)*(wind_velo(i)**2))**0.5   
     295       END DO
     296       
     297
     298       ! Subtimestepping
     299       
     300        dtis=dtime/n_dtis
     301
     302        DO nt=1,n_dtis
     303
     304          IF (lafin .and. nt.eq.n_dtis) THEN
     305            lafin_is=.true.
     306          END IF
     307
     308        !PRINT*,'RENTRE DANS INLANDSIS','itime',itime,'dtime',dtime,'dtis',dtis
     309        CALL surf_inlandsis(knon, rlon, rlat, knindex, itime, dtis, debut_is, lafin_is, &
     310            rmu0, swdown, lwdown, albedo, pexner, ps, p1lay, &
     311            precip_rain, precip_snow, precip_snow_adv, snow_adv, &
     312            zsl_height, wind_velo, ustar, temp_air, dens_air, spechum, tsurf, &
     313            rugoro, snow_cont_air, alb_soil, slope, cloudf, &
     314            radsol, qsol, tsoil0, snow, zfra, snowhgt, qsnow, to_ice,sissnow, agesno, &
     315            AcoefH, AcoefQ, BcoefH, BcoefQ, cdragm, cdragh, &
     316            run_off_lic, evap, fluxsens, fluxlat, dflux_s, dflux_l, &       
     317            tsurf_new, alb1, alb2, alb3, &
     318            emis_new, z0m, z0h, qsurf)     
     319
     320         debut_is=.false.
     321
     322        END DO
     323
     324
     325#else
     326       abort_message='Pb de coherence: landice_opt = 2 mais CPP_INLANDSIS = .false.'
     327       CALL abort_physic(modname,abort_message,1)
     328#endif
     329
     330
     331
     332    ELSE
    238333
    239334!****************************************************************************************
     
    261356!
    262357!****************************************************************************************
    263  !   beta(:) = 1.0
    264  !   dif_grnd(:) = 0.0
     358!    beta(:) = 1.0
     359!    dif_grnd(:) = 0.0
    265360
    266361! Suppose zero surface speed
     
    287382!   
    288383!****************************************************************************************
    289     CALL fonte_neige( knon, is_lic, knindex, dtime, &
     384    CALL fonte_neige(knon, is_lic, knindex, dtime, &
    290385         tsurf, precip_rain, precip_snow, &
    291386         snow, qsol, tsurf_new, evap)
     
    323418    z0m = SQRT(z0m**2+rugoro**2)
    324419
    325     END IF ! ok_snow
     420
     421
     422
     423   
     424
     425    END IF ! landice_opt
    326426
    327427
     
    340440 
    341441!****************************************************************************************
    342        snow_o=0.
    343        zfra_o = 0.
    344        DO j = 1, knon
    345            i = knindex(j)
    346            snow_o(i) = snow(j)
    347            zfra_o(i) = zfra(j)
    348        ENDDO
    349 
     442! Etienne: comment these lines because of duplication just below
     443!       snow_o=0.
     444!       zfra_o = 0.
     445!       DO j = 1, knon
     446!           i = knindex(j)
     447!           snow_o(i) = snow(j)
     448!           zfra_o(i) = zfra(j)
     449!       ENDDO
     450!
    350451!****************************************************************************************
    351452       snow_o=0.
Note: See TracChangeset for help on using the changeset viewer.