Changeset 1482


Ignore:
Timestamp:
Oct 14, 2015, 5:05:47 PM (9 years ago)
Author:
mturbet
Message:

Implementation of the Spectral Albedo

Location:
trunk/LMDZ.GENERIC
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.GENERIC/README

    r1477 r1482  
    10851085== 21/09/2015 == MT
    10861086- Cleanup of physiq.F90 and changed condense_cloud.F90 to condense_co2.F90
     1087
     1088== 14/10/2015 == MT
     1089- Implementation of the Spectral Albedo. Albedo(ngrid) is now Albedo(ngrid,L_NSPECTV) and has a value for each visible band.
     1090- Albedodat/Albedo0 have been removed. We now use Albedo_bareground.
     1091- CO2 Ice Albedo North/South dichotomy has been removed. CO2 ice Albedo is no longer stocked in start file. You can now
     1092prescribe CO2 ice albedo in callphys.def with "albedoco2ice". Its default value is 0.5.
  • trunk/LMDZ.GENERIC/libf/phystd/callcorrk.F90

    r1423 r1482  
    11      subroutine callcorrk(ngrid,nlayer,pq,nq,qsurf,           &
    2           albedo,emis,mu0,pplev,pplay,pt,                      &
     2          albedo,albedo_equivalent,emis,mu0,pplev,pplay,pt,    &
    33          tsurf,fract,dist_star,aerosol,muvar,                 &
    44          dtlw,dtsw,fluxsurf_lw,                               &
    5           fluxsurf_sw,fluxtop_lw,fluxabs_sw,fluxtop_dn,        &
     5          fluxsurf_sw,fluxsurfabs_sw,fluxtop_lw,               &
     6          fluxabs_sw,fluxtop_dn,                               &
    67          OLR_nu,OSR_nu,                                       &
    78          tau_col,cloudfrac,totcloudfrac,                      &
     
    4950      integer,intent(in) :: nq ! number of tracers
    5051      REAL,INTENT(IN) :: qsurf(ngrid,nq) ! tracer on surface (kg.m-2)
    51       REAL,INTENT(IN) :: albedo(ngrid)   ! SW albedo
     52      REAL,INTENT(IN) :: albedo(ngrid,L_NSPECTV)   ! Spectral SW albedo.MT2015.
    5253      REAL,INTENT(IN) :: emis(ngrid)     ! LW emissivity
    5354      real,intent(in) :: mu0(ngrid) ! cosine of sun incident angle
     
    6465      REAL,INTENT(OUT) :: fluxsurf_lw(ngrid)   ! incident LW flux to surf (W/m2)
    6566      REAL,INTENT(OUT) :: fluxsurf_sw(ngrid)   ! incident SW flux to surf (W/m2)
     67      REAL,INTENT(OUT) :: fluxsurfabs_sw(ngrid)   ! absorbed SW flux by the surface (W/m2). By MT2015.
    6668      REAL,INTENT(OUT) :: fluxtop_lw(ngrid)    ! outgoing LW flux to space (W/m2)
    6769      REAL,INTENT(OUT) :: fluxabs_sw(ngrid)    ! SW flux absorbed by planet (W/m2)
     
    7072      REAL,INTENT(OUT) :: OSR_nu(ngrid,L_NSPECTV)! Outgoing SW radition in each band (Normalized to the band width (W/m2/cm-1)
    7173      REAL,INTENT(OUT) :: tau_col(ngrid) ! diagnostic from aeropacity
     74      REAL,INTENT(OUT) :: albedo_equivalent(ngrid) ! Spectrally Integrated Albedo. For Diagnostic. By MT2015
    7275!     for H2O cloud fraction in aeropacity
    7376      real,intent(in) :: cloudfrac(ngrid,nlayer)
     
    121124      REAL*8 fluxupv(L_NLAYRAD),fluxupi(L_NLAYRAD)
    122125      REAL*8 fluxdnv(L_NLAYRAD),fluxdni(L_NLAYRAD)
    123       REAL*8 albi,albv,acosz
     126      REAL*8 albi,acosz
     127      REAL*8 albv(L_NSPECTV) ! Spectral Visible Albedo.
    124128
    125129      INTEGER ig,l,k,nw,iaer,irad
     
    182186      real vtmp(nlayer)
    183187      REAL*8 muvarrad(L_LEVELS)
     188     
     189!     included by MT for albedo calculations.     
     190      REAL*8 albedo_temp(L_NSPECTV) ! For equivalent albedo calculation.
    184191
    185192!===============================================================
     
    212219         call su_aer_radii(ngrid,nlayer,reffrad,nueffrad)
    213220         
    214          
    215 
    216221!--------------------------------------------------
    217222!     set up correlated k
     
    448453
    449454!     Albedo and emissivity
    450          albi=1-emis(ig)        ! longwave
    451          albv=albedo(ig)        ! shortwave
    452 
    453       if(nosurf.and.(albv.gt.0.0))then
    454          print*,'For open lower boundary in callcorrk must'
    455          print*,'have surface albedo set to zero!'
    456          call abort
    457       endif
     455         albi=1-emis(ig)   ! Longwave.
     456         DO nw=1,L_NSPECTV ! Shortwave loop.
     457            albv(nw)=albedo(ig,nw)
     458         ENDDO
     459
     460         if (nosurf) then
     461            DO nw=1,L_NSPECTV
     462               if(albv(nw).gt.0.0) then
     463                  print*,'For open lower boundary in callcorrk must'
     464                  print*,'have spectral surface band albedos all set to zero!'
     465                  call abort
     466               endif
     467            ENDDO         
     468         endif
    458469
    459470      if ((ngrid.eq.1).and.(global1d)) then       ! fixed zenith angle 'szangle' in 1D simulations w/ globally-averaged sunlight
     
    764775         end if
    765776
     777
     778         ! Equivalent Albedo Calculation. MT2015
     779         if(fract(ig) .ge. 1.0e-4) then ! equivalent albedo makes sense only during daylight.           
     780            DO nw=1,L_NSPECTV             
     781               albedo_temp(nw)=albedo(ig,nw)*nfluxgndv_nu(nw)
     782            ENDDO
     783            albedo_temp(1:L_NSPECTV)=albedo_temp(1:L_NSPECTV)/sum(nfluxgndv_nu(1:L_NSPECTV))
     784            albedo_equivalent(ig)=sum(albedo_temp(1:L_NSPECTV))
     785         else
     786            albedo_equivalent(ig)=0.0 ! Spectrally Integrated Albedo not defined for non-irradiated grid points. So we arbitrary set the equivalent albedo to 0.
     787         endif
     788
     789
    766790!-----------------------------------------------------------------------
    767791!     Longwave
     
    786810         fluxsurf_lw(ig) = real(fluxdni(L_NLAYRAD))
    787811         fluxsurf_sw(ig) = real(fluxdnv(L_NLAYRAD))
     812         
     813!        Flux absorbed by the surface. By MT2015.         
     814         fluxsurfabs_sw(ig) = fluxsurf_sw(ig)*(1.-albedo_equivalent(ig))
    788815
    789816         if(fluxtop_dn(ig).lt.0.0)then
  • trunk/LMDZ.GENERIC/libf/phystd/callkeys_mod.F90

    r1423 r1482  
    6666      real pceil
    6767      real albedosnow
     68      real albedoco2ice
    6869      real maxicethick
    6970      real Tsaldiff
  • trunk/LMDZ.GENERIC/libf/phystd/condense_co2.F90

    r1477 r1482  
    11      subroutine condense_co2(ngrid,nlayer,nq,ptimestep, &
    2           pcapcal,pplay,pplev,ptsrf,pt, &
    3           pphi,pdt,pdu,pdv,pdtsrf,pu,pv,pq,pdq, &
    4           piceco2,psolaralb,pemisurf, &
    5           pdtc,pdtsrfc,pdpsrf,pduc,pdvc, &
     2          pcapcal,pplay,pplev,ptsrf,pt,                  &
     3          pphi,pdt,pdu,pdv,pdtsrf,pu,pv,pq,pdq,          &
     4          piceco2,albedo,pemisurf,                       &
     5          albedo_bareground,albedo_co2_ice_SPECTV,       &
     6          pdtc,pdtsrfc,pdpsrf,pduc,pdvc,                 &
    67          pdqc)
    78
    8       use radinc_h, only : naerkind
     9      use radinc_h, only : L_NSPECTV, naerkind
    910      use gases_h, only: gfrac, igas_co2
    1011      use radii_mod, only : co2_reffrad
    1112      use aerosol_mod, only : iaero_co2
    12       USE surfdat_h, only: albedodat, albedice, emisice, emissiv
     13      USE surfdat_h, only: emisice, emissiv
    1314      USE comgeomfi_h, only: lati
    1415      USE tracer_h, only: noms, rho_co2
     
    3233!     ptsrf(ngrid)          Surface temperature
    3334!     
    34 !     pdt(ngrid,nlayer)   Time derivative before condensation/sublimation of pt
     35!     pdt(ngrid,nlayer)     Time derivative before condensation/sublimation of pt
    3536!     pdtsrf(ngrid)         Time derivative before condensation/sublimation of ptsrf
    3637!     pqsurf(ngrid,nq)      Sedimentation flux at the surface (kg.m-2.s-1)
     
    4445!     Both
    4546!     ----
    46 !     piceco2(ngrid)        CO2 ice at the surface (kg/m2)
    47 !     psolaralb(ngrid)      Albedo at the surface
    48 !     pemisurf(ngrid)       Emissivity of the surface
     47!     piceco2(ngrid)               CO2 ice at the surface (kg/m2)
     48!     albedo(ngrid,L_NSPECTV)      Spectral albedo at the surface
     49!     pemisurf(ngrid)              Emissivity of the surface
    4950!
    5051!     Authors
     
    7778      REAL,INTENT(IN) :: pq(ngrid,nlayer,nq)
    7879      REAL,INTENT(IN) :: pdq(ngrid,nlayer,nq)
     80      REAL,INTENT(IN) :: albedo_bareground(ngrid)
     81      REAL,INTENT(IN) :: albedo_co2_ice_SPECTV(L_NSPECTV)
    7982      REAL,INTENT(INOUT) :: piceco2(ngrid)
    80       REAL,INTENT(OUT) :: psolaralb(ngrid)
     83      REAL,INTENT(OUT) :: albedo(ngrid,L_NSPECTV)
    8184      REAL,INTENT(OUT) :: pemisurf(ngrid)
    8285      REAL,INTENT(OUT) :: pdtc(ngrid,nlayer)
     
    9093!     Local variables
    9194
    92       INTEGER l,ig,icap,ilay,it,iq
     95      INTEGER l,ig,icap,ilay,it,iq,nw
    9396
    9497      REAL reffrad(ngrid,nlayer) ! radius (m) of the co2 ice particles
     
    461464            piceco2(ig)=0.
    462465         endif
    463          if (piceco2(ig).gt.0) then
    464             psolaralb(ig) = albedice(icap)
     466         if (piceco2(ig) .gt. 1.) then  ! CO2 Albedo condition changed to 1 mm coverage. Change by MT2015.
     467            DO nw=1,L_NSPECTV
     468               albedo(ig,nw) = albedo_co2_ice_SPECTV(nw)
     469            ENDDO
    465470            emisref(ig)   = emisice(icap)
    466471         else
    467             psolaralb(ig) = albedodat(ig)
     472            DO nw=1,L_NSPECTV
     473               albedo(ig,nw) = albedo_bareground(ig) ! Note : If you have some water, it will be taken into account in the "hydrol" routine.
     474            ENDDO
    468475            emisref(ig)   = emissiv
    469476            pemisurf(ig)  = emissiv
  • trunk/LMDZ.GENERIC/libf/phystd/hydrol.F90

    r1397 r1482  
    1 subroutine hydrol(ngrid,nq,ptimestep,rnat,tsurf,          &
     1subroutine hydrol(ngrid,nq,ptimestep,rnat,tsurf,  &
    22     qsurf,dqsurf,dqs_hyd,pcapcal,                &
    3      albedo0,albedo,mu0,pdtsurf,pdtsurf_hyd,hice, &
     3     albedo,albedo_bareground,                    &
     4     albedo_snow_SPECTV,albedo_co2_ice_SPECTV,    &
     5     mu0,pdtsurf,pdtsurf_hyd,hice,                &
    46     pctsrf_sic,sea_ice)
    57
     
    1214  USE tracer_h
    1315  use slab_ice_h
    14   use callkeys_mod, only: albedosnow,ok_slab_ocean,Tsaldiff,maxicethick,co2cond
     16  use callkeys_mod, only: albedosnow,albedoco2ice,ok_slab_ocean,Tsaldiff,maxicethick,co2cond
     17  use radinc_h, only : L_NSPECTV
    1518
    1619  implicit none
     
    2528!     -------
    2629!     Adapted from LMDTERRE by B. Charnay (2010). Further
    27 !     modifications by R. Wordsworth (2010).
     30!     Modifications by R. Wordsworth (2010).
     31!     Spectral albedo by M. Turbet (2015).
    2832!     
    2933!     Called by
     
    4549!     Inputs
    4650!     ------
    47       real albedoice
    48       save albedoice
    49 !$OMP THREADPRIVATE(albedoice)
    50 
    5151      real snowlayer
    5252      parameter (snowlayer=33.0)        ! 33 kg/m^2 of snow, equal to a layer of 3.3 cm
     
    7272      real dqsurf(ngrid,nq), pdtsurf(ngrid)
    7373      real hice(ngrid)
    74       real albedo0(ngrid), albedo(ngrid)
     74      real albedo(ngrid,L_NSPECTV)
     75      real albedo_bareground(ngrid)
     76      real albedo_snow_SPECTV(L_NSPECTV)
     77      real albedo_co2_ice_SPECTV(L_NSPECTV)
    7578      real pctsrf_sic(ngrid), sea_ice(ngrid)
    7679
     
    8588!     -----
    8689      real a,b,E
    87       integer ig,iq, icap ! wld like to remove icap
     90      integer ig,iq, nw
    8891      real fsnoi, subli, fauxo
    8992      real twater(ngrid)
     
    130133!                      iliq is used in place of igcm_h2o_vap ONLY on the
    131134!                      surface.
    132 
    133135!                      Soon to be extended to the entire water cycle...
    134 
    135 !     Ice albedo = snow albedo for now
    136          albedoice=albedosnow
    137136
    138137!     Total ocean surface area
     
    188187!               albedo(ig) = MAX(MIN(albedo(ig),0.60),0.04)
    189188!            else
    190                albedo(ig) = alb_ocean ! modif Benjamin
     189               do nw=1,L_NSPECTV
     190                  albedo(ig,nw) = alb_ocean ! For now, alb_ocean is defined in slab_ice_h.F90. Later we could introduce spectral dependency for alb_ocean.
     191               enddo
    191192!            end if
    192193
    193194
    194           if(ok_slab_ocean) then
    195 
    196 ! Fraction neige (hauteur critique 45kg/m2~15cm)
    197             zfra = MAX(0.0,MIN(1.0,zqsurf(ig,iice)/45.0))
    198 ! Albedo glace
    199             alb_ice=alb_ice_max-(alb_ice_max-alb_ice_min) &
    200             *exp(-sea_ice(ig)/h_alb_ice)
    201 ! Albedo glace+neige
    202             albedo_sic= albedosnow*zfra + alb_ice*(1.0-zfra)
    203 
    204 ! Albedo final
    205             albedo(ig) = pctsrf_sic(ig)*albedo_sic + (1.-pctsrf_sic(ig))*alb_ocean
    206 !     oceanic ice height, just for diagnostics
    207             hice(ig)    = MIN(10.,sea_ice(ig)/rhowater)
    208           else !ok_slab_ocean
     195            if(ok_slab_ocean) then
     196         
     197               zfra = MAX(0.0,MIN(1.0,zqsurf(ig,iice)/45.0))     ! Snow Fraction (Critical height 45kg/m2~15cm)
     198               alb_ice=alb_ice_max-(alb_ice_max-alb_ice_min) &   ! Ice Albedo
     199               *exp(-sea_ice(ig)/h_alb_ice)
     200               ! Albedo final calculation :
     201               do nw=1,L_NSPECTV
     202                  albedo(ig,nw) = pctsrf_sic(ig)*                                        &
     203                                 (albedo_snow_SPECTV(nw)*zfra + alb_ice*(1.0-zfra))      &
     204                               + (1.-pctsrf_sic(ig))*alb_ocean
     205               enddo
     206
     207               ! Oceanic ice height, just for diagnostics
     208               hice(ig)    = MIN(10.,sea_ice(ig)/rhowater)
     209            else !ok_slab_ocean
    209210
    210211
    211212!     calculate oceanic ice height including the latent heat of ice formation
    212213!     hice is the height of oceanic ice with a maximum of maxicethick.
    213             hice(ig)    = zqsurf(ig,iice)/rhowater ! update hice to include recent snowfall
    214 
    215 !            twater(ig)  = tsurf(ig) + ptimestep*zdtsurf(ig) &
    216             twater(ig)  = ztsurf(ig) - hice(ig)*RLFTT*rhowater/pcapcal(ig)
    217             ! this is temperature water would have if we melted entire ocean ice layer
    218             hicebis(ig) = hice(ig)
    219             hice(ig)    = 0.
    220 
    221             if(twater(ig) .lt. T_h2O_ice_liq)then
    222                E=min((T_h2O_ice_liq+Tsaldiff-twater(ig))*pcapcal(ig),RLFTT*rhowater*maxicethick)
    223                hice(ig)        = E/(RLFTT*rhowater)
    224                hice(ig)        = max(hice(ig),0.0)
    225                hice(ig)        = min(hice(ig),maxicethick)
    226                pdtsurf_hyd(ig) = (hice(ig) - hicebis(ig))*RLFTT*rhowater/pcapcal(ig)/ptimestep             
    227                albedo(ig)      = albedoice
    228 
    229 !               if (zqsurf(ig,iice).ge.snowlayer) then
    230 !                  albedo(ig) = albedoice
    231 !               else
    232 !                  albedo(ig) = albedoocean &
    233 !                       + (albedosnow - albedoocean)*zqsurf(ig,iice)/snowlayer
    234 !               endif
    235 
    236             else
    237 
    238                pdtsurf_hyd(ig) = -hicebis(ig)*RLFTT*rhowater/pcapcal(ig)/ptimestep               
    239                albedo(ig)      = alb_ocean
    240 
    241             endif
    242 
    243             zqsurf(ig,iliq) = zqsurf(ig,iliq)-(hice(ig)*rhowater-zqsurf(ig,iice))
    244             zqsurf(ig,iice) = hice(ig)*rhowater
    245 
    246           endif!(ok_slab_ocean)
     214               hice(ig)    = zqsurf(ig,iice)/rhowater ! update hice to include recent snowfall
     215
     216!              twater(ig)  = tsurf(ig) + ptimestep*zdtsurf(ig) &
     217               twater(ig)  = ztsurf(ig) - hice(ig)*RLFTT*rhowater/pcapcal(ig)
     218               ! this is temperature water would have if we melted entire ocean ice layer
     219               hicebis(ig) = hice(ig)
     220               hice(ig)    = 0.
     221
     222               if(twater(ig) .lt. T_h2O_ice_liq)then
     223                  E=min((T_h2O_ice_liq+Tsaldiff-twater(ig))*pcapcal(ig),RLFTT*rhowater*maxicethick)
     224                  hice(ig)        = E/(RLFTT*rhowater)
     225                  hice(ig)        = max(hice(ig),0.0)
     226                  hice(ig)        = min(hice(ig),maxicethick)
     227                  pdtsurf_hyd(ig) = (hice(ig) - hicebis(ig))*RLFTT*rhowater/pcapcal(ig)/ptimestep             
     228                  do nw=1,L_NSPECTV
     229                     albedo(ig,nw) = albedo_snow_SPECTV(nw) ! Albedo of ice has been replaced by albedo of snow here. MT2015.
     230                  enddo 
     231
     232!                 if (zqsurf(ig,iice).ge.snowlayer) then
     233!                    albedo(ig) = albedoice
     234!                 else
     235!                    albedo(ig) = albedoocean &
     236!                    + (albedosnow - albedoocean)*zqsurf(ig,iice)/snowlayer
     237!                 endif
     238
     239               else
     240
     241                  pdtsurf_hyd(ig) = -hicebis(ig)*RLFTT*rhowater/pcapcal(ig)/ptimestep
     242                  DO nw=1,L_NSPECTV
     243                     albedo(ig,nw) = alb_ocean
     244                  ENDDO               
     245
     246               endif
     247
     248               zqsurf(ig,iliq) = zqsurf(ig,iliq)-(hice(ig)*rhowater-zqsurf(ig,iice))
     249               zqsurf(ig,iice) = hice(ig)*rhowater
     250
     251            endif!(ok_slab_ocean)
    247252
    248253
     
    299304
    300305!     re-calculate continental albedo
    301             albedo(ig) = albedo0(ig) ! albedo0 = base values
     306            DO nw=1,L_NSPECTV
     307               albedo(ig,nw) = albedo_bareground(ig)
     308            ENDDO
    302309            if (zqsurf(ig,iice).ge.snowlayer) then
    303                albedo(ig) = albedosnow
     310               DO nw=1,L_NSPECTV
     311                  albedo(ig,nw) = albedo_snow_SPECTV(nw)
     312               ENDDO
    304313            else
    305                albedo(ig) = albedo0(ig) &
    306                     + (albedosnow - albedo0(ig))*zqsurf(ig,iice)/snowlayer
     314               DO nw=1,L_NSPECTV
     315                  albedo(ig,nw) = albedo_bareground(ig)                            &
     316                               + (albedo_snow_SPECTV(nw) - albedo_bareground(ig))  &
     317                                 *zqsurf(ig,iice)/snowlayer
     318               ENDDO
    307319            endif
    308320
     
    370382      if(co2cond)then
    371383
    372          icap=1
    373384         do ig=1,ngrid
    374             if (qsurf(ig,igcm_co2_ice).gt.0) then
    375                albedo(ig) = albedice(icap)
    376             endif
    377          enddo
     385            if (qsurf(ig,igcm_co2_ice).gt.1.) then ! Condition changed - Need now ~1 mm CO2 ice coverage. MT2015
     386               DO nw=1,L_NSPECTV
     387                  albedo(ig,nw) = albedo_co2_ice_SPECTV(nw)
     388               ENDDO
     389            endif
     390         enddo ! ngrid
    378391         
    379       endif
     392      endif ! co2cond
    380393
    381394
  • trunk/LMDZ.GENERIC/libf/phystd/inifis.F

    r1423 r1482  
    619619         call getin_p("albedosnow",albedosnow)
    620620         write(*,*) " albedosnow = ",albedosnow
     621         
     622         write(*,*) "CO2 ice albedo ?"
     623         albedoco2ice=0.5       ! default value
     624         call getin_p("albedoco2ice",albedoco2ice)
     625         write(*,*) " albedoco2ice = ",albedoco2ice
    621626
    622627         write(*,*) "Maximum ice thickness ?"
  • trunk/LMDZ.GENERIC/libf/phystd/phyredem.F90

    r1397 r1482  
    1212  use comgeomfi_h, only: area
    1313  use surfdat_h, only: zmea, zstd, zsig, zgam, zthe, &
    14                        albedice, emisice, emissiv, &
     14                       emisice, emissiv,            &
    1515                       iceradius, dtemisice, phisfi
    1616  use iostart, only : open_restartphy, close_restartphy, &
     
    8383
    8484! Optical properties of polar caps and ground emissivity
    85   tab_cntrl(22) = albedice(1)  ! Albedo of northern cap ~0.5
    86   tab_cntrl(23) = albedice(2)  ! Albedo of southern cap ~0.5
    8785  tab_cntrl(24) = emisice(1)   ! Emissivity of northern cap ~0.95
    8886  tab_cntrl(25) = emisice(2)   ! Emissivity of southern cap ~0.95
  • trunk/LMDZ.GENERIC/libf/phystd/physiq.F90

    r1477 r1482  
    1111      use watercommon_h, only : RLVTT, Psat_water,epsi
    1212      use gases_h, only: gnom, gfrac
    13       use radcommon_h, only: sigma, glat, grav
     13      use radcommon_h, only: sigma, glat, grav, BWNV
    1414      use radii_mod, only: h2o_reffrad, co2_reffrad
    1515      use aerosol_mod, only: iaero_co2, iaero_h2o
    16       use surfdat_h, only: phisfi, albedodat, zmea, zstd, zsig, zgam, zthe, &
     16      use surfdat_h, only: phisfi, zmea, zstd, zsig, zgam, zthe, &
    1717                           dryness, watercaptag
    1818      use comdiurn_h, only: coslat, sinlat, coslon, sinlon
     
    190190! ----------------------
    191191
    192       integer day_ini                                  ! Initial date of the run (sol since Ls=0).
    193       integer icount                                   ! Counter of calls to physiq during the run.
    194       real, dimension(:),allocatable,save ::  tsurf    ! Surface temperature (K).
    195       real, dimension(:,:),allocatable,save ::  tsoil  ! Sub-surface temperatures (K).
    196       real, dimension(:),allocatable,save :: albedo    ! Surface albedo.
    197      
    198 !$OMP THREADPRIVATE(tsurf,tsoil,albedo)
    199 
    200       real,dimension(:),allocatable,save :: albedo0 ! Initial surface albedo.
    201       real,dimension(:),allocatable,save :: rnat    ! Defines the type of the grid (ocean,continent,...). By BC.
    202      
    203 !$OMP THREADPRIVATE(albedo0,rnat)
     192      integer day_ini                                              ! Initial date of the run (sol since Ls=0).
     193      integer icount                                               ! Counter of calls to physiq during the run.
     194      real, dimension(:),allocatable,save ::  tsurf                ! Surface temperature (K).
     195      real, dimension(:,:),allocatable,save ::  tsoil              ! Sub-surface temperatures (K).
     196      real, dimension(:,:),allocatable,save :: albedo              ! Surface Spectral albedo. By MT2015.
     197      real, dimension(:),allocatable,save :: albedo_equivalent     ! Spectral Mean albedo.
     198      real, dimension(:),allocatable,save :: albedo_snow_SPECTV    ! Snow Spectral albedo.
     199      real, dimension(:),allocatable,save :: albedo_co2_ice_SPECTV ! CO2 ice Spectral albedo.
     200     
     201!$OMP THREADPRIVATE(tsurf,tsoil,albedo,albedo_equivalent,albedo_snow_SPECTV,albedo_co2_ice_SPECTV)
     202
     203      real,dimension(:),allocatable,save :: albedo_bareground ! Bare Ground Albedo. By MT 2015.
     204      real,dimension(:),allocatable,save :: rnat              ! Defines the type of the grid (ocean,continent,...). By BC.
     205     
     206!$OMP THREADPRIVATE(albedo_bareground,rnat)
    204207
    205208      real,dimension(:),allocatable,save :: emis        ! Thermal IR surface emissivity.
     
    228231      real pw(ngrid,nlayer)               ! Vertical velocity (m/s). (NOTE : >0 WHEN DOWNWARDS !!)
    229232
    230       integer l,ig,ierr,iq
     233      integer l,ig,ierr,iq,nw
    231234     
    232235      ! FOR DIAGNOSTIC :
    233236     
    234       real,dimension(:),allocatable,save :: fluxsurf_lw  ! Incident Long Wave (IR) surface flux (W.m-2).
    235       real,dimension(:),allocatable,save :: fluxsurf_sw  ! incident Short Wave (stellar) surface flux (W.m-2).
    236       real,dimension(:),allocatable,save :: fluxtop_lw   ! Outgoing LW (IR) flux to space (W.m-2).
    237       real,dimension(:),allocatable,save :: fluxabs_sw   ! Absorbed SW (stellar) flux (W.m-2).
    238       real,dimension(:),allocatable,save :: fluxtop_dn   ! Incoming SW (stellar) radiation at the top of the atmosphere (W.m-2).
    239       real,dimension(:),allocatable,save :: fluxdyn      ! Horizontal heat transport by dynamics (W.m-2).
    240       real,dimension(:,:),allocatable,save :: OLR_nu     ! Outgoing LW radiation in each band (Normalized to the band width (W/m2/cm-1)).
    241       real,dimension(:,:),allocatable,save :: OSR_nu     ! Outgoing SW radiation in each band (Normalized to the band width (W/m2/cm-1)).
    242       real,dimension(:,:),allocatable,save :: zdtlw      ! LW heating tendencies (K/s).
    243       real,dimension(:,:),allocatable,save :: zdtsw      ! SW heating tendencies (K/s).
    244       real,dimension(:),allocatable,save :: sensibFlux   ! Turbulent flux given by the atmosphere to the surface (W.m-2).
    245      
    246 !$OMP THREADPRIVATE(fluxsurf_lw,fluxsurf_sw,fluxtop_lw,fluxabs_sw,fluxtop_dn,fluxdyn,OLR_nu,OSR_nu,&
     237      real,dimension(:),allocatable,save :: fluxsurf_lw     ! Incident Long Wave (IR) surface flux (W.m-2).
     238      real,dimension(:),allocatable,save :: fluxsurf_sw     ! Incident Short Wave (stellar) surface flux (W.m-2).
     239      real,dimension(:),allocatable,save :: fluxsurfabs_sw  ! Absorbed Short Wave (stellar) flux by the surface (W.m-2).
     240      real,dimension(:),allocatable,save :: fluxtop_lw      ! Outgoing LW (IR) flux to space (W.m-2).
     241      real,dimension(:),allocatable,save :: fluxabs_sw      ! Absorbed SW (stellar) flux (W.m-2).
     242      real,dimension(:),allocatable,save :: fluxtop_dn      ! Incoming SW (stellar) radiation at the top of the atmosphere (W.m-2).
     243      real,dimension(:),allocatable,save :: fluxdyn         ! Horizontal heat transport by dynamics (W.m-2).
     244      real,dimension(:,:),allocatable,save :: OLR_nu        ! Outgoing LW radiation in each band (Normalized to the band width (W/m2/cm-1)).
     245      real,dimension(:,:),allocatable,save :: OSR_nu        ! Outgoing SW radiation in each band (Normalized to the band width (W/m2/cm-1)).
     246      real,dimension(:,:),allocatable,save :: zdtlw         ! LW heating tendencies (K/s).
     247      real,dimension(:,:),allocatable,save :: zdtsw         ! SW heating tendencies (K/s).
     248      real,dimension(:),allocatable,save :: sensibFlux      ! Turbulent flux given by the atmosphere to the surface (W.m-2).
     249     
     250!$OMP THREADPRIVATE(fluxsurf_lw,fluxsurf_sw,fluxsurfabs_sw,fluxtop_lw,fluxabs_sw,fluxtop_dn,fluxdyn,OLR_nu,OSR_nu,&
    247251       
    248252        !$OMP zdtlw,zdtsw,sensibFlux)
     
    376380      logical clearsky ! For double radiative transfer call. By BC
    377381     
    378       real fluxsurf_lw1(ngrid), fluxsurf_sw1(ngrid), fluxtop_lw1(ngrid), fluxabs_sw1(ngrid) ! For SW/LW flux diagnostics.
    379       real tau_col1(ngrid)                                                                  ! For aerosol optical depth diagnostic.
    380       real OLR_nu1(ngrid,L_NSPECTI), OSR_nu1(ngrid,L_NSPECTV)                               ! For Outgoing Radiation diagnostics.
     382      ! For Clear Sky Case.
     383      real fluxsurf_lw1(ngrid), fluxsurf_sw1(ngrid), fluxsurfabs_sw1(ngrid)  ! For SW/LW flux.
     384      real fluxtop_lw1(ngrid), fluxabs_sw1(ngrid)                            ! For SW/LW flux.
     385      real albedo_equivalent1(ngrid)                                         ! For Equivalent albedo calculation.
     386      real tau_col1(ngrid)                                                   ! For aerosol optical depth diagnostic.
     387      real OLR_nu1(ngrid,L_NSPECTI), OSR_nu1(ngrid,L_NSPECTV)                ! For Outgoing Radiation diagnostics.
    381388      real tf, ntf
    382389
     
    435442        ALLOCATE(tsurf(ngrid))
    436443        ALLOCATE(tsoil(ngrid,nsoilmx))   
    437         ALLOCATE(albedo(ngrid))         
    438         ALLOCATE(albedo0(ngrid))         
     444        ALLOCATE(albedo(ngrid,L_NSPECTV))
     445        ALLOCATE(albedo_equivalent(ngrid))     
     446        ALLOCATE(albedo_snow_SPECTV(L_NSPECTV))
     447        ALLOCATE(albedo_co2_ice_SPECTV(L_NSPECTV))
     448        ALLOCATE(albedo_bareground(ngrid))           
    439449        ALLOCATE(rnat(ngrid))         
    440450        ALLOCATE(emis(ngrid))   
     
    457467        ALLOCATE(fluxsurf_lw(ngrid))
    458468        ALLOCATE(fluxsurf_sw(ngrid))
     469        ALLOCATE(fluxsurfabs_sw(ngrid))
    459470        ALLOCATE(fluxtop_lw(ngrid))
    460471        ALLOCATE(fluxabs_sw(ngrid))
     
    521532         write (*,*) 'In physiq day_ini =', day_ini
    522533
    523 !        Initialize albedo and orbital calculation.
    524 !        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    525          call surfini(ngrid,nq,qsurf,albedo0)
     534!        Initialize albedo calculation.
     535!        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     536         albedo(:,:)=0.0
     537         albedo_bareground(:)=0.0
     538         albedo_snow_SPECTV(:)=0.0
     539         albedo_co2_ice_SPECTV(:)=0.0
     540         call surfini(ngrid,nq,qsurf,albedo,albedo_bareground,albedo_snow_SPECTV,albedo_co2_ice_SPECTV)
     541         
     542         
     543!        Initialize orbital calculation.
     544!        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    526545         call iniorbit(apoastr,periastr,year_day,peri_day,obliquit)
    527546
    528          albedo(:)=albedo0(:)
    529547
    530548         if(tlocked)then
     
    677695         if (ngrid.ne.1) then ! Note : no need to create a restart file in 1d.
    678696            call physdem0("restartfi.nc",long,lati,nsoilmx,ngrid,nlayer,nq, &
    679                           ptimestep,pday+nday,time_phys,area, &
    680                           albedodat,inertiedat,zmea,zstd,zsig,zgam,zthe)
     697                          ptimestep,pday+nday,time_phys,area,               &
     698                          albedo_bareground,inertiedat,zmea,zstd,zsig,zgam,zthe)
    681699         endif
    682700         
     701               
    683702      endif ! end of 'firstcall'
    684703
     
    848867               ! standard callcorrk
    849868               clearsky=.false.
    850                call callcorrk(ngrid,nlayer,pq,nq,qsurf,                          &
    851                               albedo,emis,mu0,pplev,pplay,pt,                    &
    852                               tsurf,fract,dist_star,aerosol,muvar,               &
    853                               zdtlw,zdtsw,fluxsurf_lw,fluxsurf_sw,fluxtop_lw,    &
    854                               fluxabs_sw,fluxtop_dn,OLR_nu,OSR_nu,               &
    855                               tau_col,cloudfrac,totcloudfrac,                    &
    856                               clearsky,firstcall,lastcall)     
    857 
    858                 ! Option to call scheme once more for clear regions
     869               call callcorrk(ngrid,nlayer,pq,nq,qsurf,                           &
     870                              albedo,albedo_equivalent,emis,mu0,pplev,pplay,pt,   &
     871                              tsurf,fract,dist_star,aerosol,muvar,                &
     872                              zdtlw,zdtsw,fluxsurf_lw,fluxsurf_sw,                &
     873                              fluxsurfabs_sw,fluxtop_lw,                          &
     874                              fluxabs_sw,fluxtop_dn,OLR_nu,OSR_nu,                &
     875                              tau_col,cloudfrac,totcloudfrac,                     &
     876                              clearsky,firstcall,lastcall)     
     877
     878                ! Option to call scheme once more for clear regions 
    859879               if(CLFvarying)then
    860880
    861881                  ! ---> PROBLEMS WITH ALLOCATED ARRAYS : temporary solution in callcorrk: do not deallocate if CLFvarying ...
    862882                  clearsky=.true.
    863                   call callcorrk(ngrid,nlayer,pq,nq,qsurf,                            &
    864                                  albedo,emis,mu0,pplev,pplay,pt,                      &
    865                                  tsurf,fract,dist_star,aerosol,muvar,                 &
    866                                  zdtlw1,zdtsw1,fluxsurf_lw1,fluxsurf_sw1,fluxtop_lw1, &
    867                                  fluxabs_sw1,fluxtop_dn,OLR_nu1,OSR_nu1,              &
    868                                  tau_col1,cloudfrac,totcloudfrac,                     &
     883                  call callcorrk(ngrid,nlayer,pq,nq,qsurf,                           &
     884                                 albedo,albedo_equivalent1,emis,mu0,pplev,pplay,pt,   &
     885                                 tsurf,fract,dist_star,aerosol,muvar,                &
     886                                 zdtlw1,zdtsw1,fluxsurf_lw1,fluxsurf_sw1,            &
     887                                 fluxsurfabs_sw1,fluxtop_lw1,                        &
     888                                 fluxabs_sw1,fluxtop_dn,OLR_nu1,OSR_nu1,             &
     889                                 tau_col1,cloudfrac,totcloudfrac,                    &
    869890                                 clearsky,firstcall,lastcall)
    870891                  clearsky = .false.  ! just in case.     
    871 
    872892
    873893                  ! Sum the fluxes and heating rates from cloudy/clear cases
    874894                  do ig=1,ngrid
    875895                     tf=totcloudfrac(ig)
    876                      ntf=1.-tf
    877                    
    878                      fluxsurf_lw(ig) = ntf*fluxsurf_lw1(ig) + tf*fluxsurf_lw(ig)
    879                      fluxsurf_sw(ig) = ntf*fluxsurf_sw1(ig) + tf*fluxsurf_sw(ig)
    880                      fluxtop_lw(ig)  = ntf*fluxtop_lw1(ig)  + tf*fluxtop_lw(ig)
    881                      fluxabs_sw(ig)  = ntf*fluxabs_sw1(ig)  + tf*fluxabs_sw(ig)
    882                      tau_col(ig)     = ntf*tau_col1(ig)     + tf*tau_col(ig)
     896                     ntf=1.-tf                   
     897                     fluxsurf_lw(ig)       = ntf*fluxsurf_lw1(ig)       + tf*fluxsurf_lw(ig)
     898                     fluxsurf_sw(ig)       = ntf*fluxsurf_sw1(ig)       + tf*fluxsurf_sw(ig)
     899                     albedo_equivalent(ig) = ntf*albedo_equivalent1(ig) + tf*albedo_equivalent(ig)
     900                     fluxsurfabs_sw(ig)    = ntf*fluxsurfabs_sw1(ig)    + tf*fluxsurfabs_sw(ig)
     901                     fluxtop_lw(ig)        = ntf*fluxtop_lw1(ig)        + tf*fluxtop_lw(ig)
     902                     fluxabs_sw(ig)        = ntf*fluxabs_sw1(ig)        + tf*fluxabs_sw(ig)
     903                     tau_col(ig)           = ntf*tau_col1(ig)           + tf*tau_col(ig)
    883904                   
    884905                     zdtlw(ig,1:nlayer) = ntf*zdtlw1(ig,1:nlayer) + tf*zdtlw(ig,1:nlayer)
     
    887908                     OSR_nu(ig,1:L_NSPECTV) = ntf*OSR_nu1(ig,1:L_NSPECTV) + tf*OSR_nu(ig,1:L_NSPECTV)                 
    888909                     OLR_nu(ig,1:L_NSPECTI) = ntf*OLR_nu1(ig,1:L_NSPECTI) + tf*OLR_nu(ig,1:L_NSPECTI)                 
    889                  enddo
     910                  enddo                               
    890911
    891912               endif ! end of CLFvarying.
     
    896917
    897918
    898                ! Radiative flux from the sky absorbed by the surface (W.m-2)
     919               ! Radiative flux from the sky absorbed by the surface (W.m-2).
    899920               GSR=0.0
    900                fluxrad_sky(1:ngrid)=emis(1:ngrid)*fluxsurf_lw(1:ngrid)+fluxsurf_sw(1:ngrid)*(1.-albedo(1:ngrid))
     921               fluxrad_sky(1:ngrid)=emis(1:ngrid)*fluxsurf_lw(1:ngrid)+fluxsurfabs_sw(1:ngrid)
    901922
    902923                            !if(noradsurf)then ! no lower surface; SW flux just disappears
     
    910931
    911932            elseif(newtonian)then
    912 
    913                ! II.b Call Newtonian cooling scheme
    914                ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     933           
     934! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     935! II.b Call Newtonian cooling scheme
     936! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    915937               call newtrelax(ngrid,nlayer,mu0,sinlat,zpopsk,pt,pplay,pplev,dtrad,firstcall)
    916938
     
    928950               endif
    929951               fluxsurf_sw(1:ngrid) = fluxtop_dn(1:ngrid)
    930                fluxrad_sky(1:ngrid) = fluxtop_dn(1:ngrid)*(1.-albedo(1:ngrid))
     952               print*,'------------WARNING---WARNING------------' ! by MT2015.
     953               print*,'You are in corrk=false mode, '
     954               print*,'and the surface albedo is taken equal to its value at 0.5 micrometers ...'
     955               if ( (10000./BWNV(1) .le. 0.5) .or. (10000./BWNV(L_NSPECTV) .ge. 0.5) ) then
     956                  print*,'0.5 microns band doesnt match your visible bands ! Abort !'
     957                  call abort
     958               endif
     959               DO nw=1, L_NSPECTV-1
     960                  if ( (10000./BWNV(nw) .ge. 0.5) .and. (10000./BWNV(nw+1) .lt. 0.5) ) then
     961                     fluxsurfabs_sw(1:ngrid) = fluxtop_dn(1:ngrid)*(1.-albedo(1:ngrid,nw))
     962                     fluxrad_sky(1:ngrid)    = fluxsurfabs_sw(1:ngrid)
     963                  endif
     964               ENDDO
    931965               fluxtop_lw(1:ngrid)  = emis(1:ngrid)*sigma*tsurf(1:ngrid)**4
    932966
     
    950984            call planetwide_sumval(cpp*massarea(:,:)*zdtsw(:,:)/totarea_planet,dEtotSW)
    951985            call planetwide_sumval(cpp*massarea(:,:)*zdtlw(:,:)/totarea_planet,dEtotLW)
    952             call planetwide_sumval(fluxsurf_sw(:)*(1.-albedo(:))*area(:)/totarea_planet,dEtotsSW) !JL13 carefull, albedo can have changed since the last time we called corrk
     986            !call planetwide_sumval(fluxsurf_sw(:)*(1.-albedo_equivalent(:))*area(:)/totarea_planet,dEtotsSW) !JL13 carefull, albedo can have changed since the last time we called corrk
     987            call planetwide_sumval(fluxsurfabs_sw(:)*area(:)/totarea_planet,dEtotsSW) !JL13 carefull, albedo can have changed since the last time we called corrk
    953988            call planetwide_sumval((fluxsurf_lw(:)*emis(:)-zplanck(:))*area(:)/totarea_planet,dEtotsLW)
    954989            dEzRadsw(:,:)=cpp*mass(:,:)*zdtsw(:,:)
     
    11661201                           pphi,pdt,pdu,pdv,zdtsurf,pu,pv,pq,pdq,        &
    11671202                           qsurf(1,igcm_co2_ice),albedo,emis,            &
     1203                           albedo_bareground,albedo_co2_ice_SPECTV,      &
    11681204                           zdtc,zdtsurfc,pdpsrf,zduc,zdvc,               &
    11691205                           zdqc)
     
    14611497         if(hydrology)then
    14621498           
    1463             call hydrol(ngrid,nq,ptimestep,rnat,tsurf,qsurf,dqsurf,dqs_hyd,             &
    1464                         capcal,albedo0,albedo,mu0,zdtsurf,zdtsurf_hyd,hice,pctsrf_sic,  &
     1499            call hydrol(ngrid,nq,ptimestep,rnat,tsurf,qsurf,dqsurf,dqs_hyd, &
     1500                        capcal,albedo,albedo_bareground,                    &
     1501                        albedo_snow_SPECTV,albedo_co2_ice_SPECTV,           &
     1502                        mu0,zdtsurf,zdtsurf_hyd,hice,pctsrf_sic,            &
    14651503                        sea_ice)
    14661504
     
    18481886         call wstats(ngrid,"ASR","absorbed stellar rad.","W m-2",2,fluxabs_sw)
    18491887         call wstats(ngrid,"OLR","outgoing longwave rad.","W m-2",2,fluxtop_lw)
    1850          call wstats(ngrid,"ALB","Surface albedo"," ",2,albedo)
     1888         !call wstats(ngrid,"ALB","Surface albedo"," ",2,albedo_equivalent)
     1889         !call wstats(ngrid,"ALB_1st","First Band Surface albedo"," ",2,albedo(:,1))
    18511890         call wstats(ngrid,"p","Pressure","Pa",3,pplay)
    18521891         call wstats(ngrid,"temp","Atmospheric temperature","K",3,zt)
     
    19551994      if(callrad.and.(.not.newtonian))then
    19561995     
    1957          call writediagfi(ngrid,"ALB","Surface albedo"," ",2,albedo)
     1996         !call writediagfi(ngrid,"ALB","Surface albedo"," ",2,albedo_equivalent)
     1997         !call writediagfi(ngrid,"ALB_1st","First Band Surface albedo"," ",2,albedo(:,1))
    19581998         call writediagfi(ngrid,"ISR","incoming stellar rad.","W m-2",2,fluxtop_dn)
    19591999         call writediagfi(ngrid,"ASR","absorbed stellar rad.","W m-2",2,fluxabs_sw)
  • trunk/LMDZ.GENERIC/libf/phystd/sfluxv.F

    r961 r1482  
    2424
    2525      integer L, NG, NW, NG1,k
    26       real*8  rsfv, ubar0, f0pi, btop, bsurf, taumax, eterm
     26      real*8 ubar0, f0pi, btop, bsurf, taumax, eterm
     27      real*8 rsfv(L_NSPECTV) ! Spectral dependency added by MT2015.
    2728      real*8 FZEROV(L_NSPECTV)
    2829
     
    8384
    8485          ETERM = MIN(TAUV(L_NLEVRAD,NW,NG),TAUMAX)
    85           BSURF = RSFV*UBAR0*STEL(NW)*EXP(-ETERM/UBAR0)
     86          BSURF = RSFV(NW)*UBAR0*STEL(NW)*EXP(-ETERM/UBAR0)
    8687
    8788C         WE CAN NOW SOLVE FOR THE COEFFICIENTS OF THE TWO STREAM
     
    9495
    9596          CALL GFLUXV(DTAUV(1,NW,NG),TAUV(1,NW,NG),TAUCUMV(1,NW,NG),
    96      *                WBARV(1,NW,NG),COSBV(1,NW,NG),UBAR0,F0PI,RSFV,
     97     *                WBARV(1,NW,NG),COSBV(1,NW,NG),UBAR0,F0PI,RSFV(NW),   
    9798     *                BTOP,BSURF,FMUPV,FMDV,DIFFV,FLUXUP,FLUXDN)
    9899
     
    141142 
    142143        ETERM = MIN(TAUV(L_NLEVRAD,NW,NG),TAUMAX)
    143         BSURF = RSFV*UBAR0*STEL(NW)*EXP(-ETERM/UBAR0)
     144        BSURF = RSFV(NW)*UBAR0*STEL(NW)*EXP(-ETERM/UBAR0)
    144145
    145146
     
    152153
    153154        CALL GFLUXV(DTAUV(1,NW,NG),TAUV(1,NW,NG),TAUCUMV(1,NW,NG),
    154      *              WBARV(1,NW,NG),COSBV(1,NW,NG),UBAR0,F0PI,RSFV,
     155     *              WBARV(1,NW,NG),COSBV(1,NW,NG),UBAR0,F0PI,RSFV(NW),
    155156     *              BTOP,BSURF,FMUPV,FMDV,DIFFV,FLUXUP,FLUXDN)
    156157
  • trunk/LMDZ.GENERIC/libf/phystd/surfdat_h.F90

    r1315 r1482  
    44       implicit none
    55
    6        real,allocatable,dimension(:) :: albedodat ! albedo of bare ground
     6       real,allocatable,dimension(:) :: albedodat ! albedo of bare ground stocked in startfi.nc file.
    77!$OMP THREADPRIVATE(albedodat)
    88       ! Ehouarn: moved inertiedat to comsoil.h
     
    1010       real,allocatable,dimension(:) :: phisfi ! geopotential at ground level
    1111!$OMP THREADPRIVATE(phisfi)
    12        real,dimension(2) :: albedice
    1312       real,dimension(2) :: emisice ! ice emissivity; 1:Northern hemisphere 2:Southern hemisphere
    1413       real emissiv
    1514       real,dimension(2) :: iceradius, dtemisice
    16 !$OMP THREADPRIVATE(albedice,emisice,emissiv,iceradius,dtemisice)
     15!$OMP THREADPRIVATE(emisice,emissiv,iceradius,dtemisice)
    1716       real,allocatable,dimension(:) :: zmea,zstd,zsig,zgam,zthe
    1817!$OMP THREADPRIVATE(zmea,zstd,zsig,zgam,zthe)
  • trunk/LMDZ.GENERIC/libf/phystd/surfini.F

    r1397 r1482  
    1       SUBROUTINE surfini(ngrid,nq,qsurf,psolaralb)
     1      SUBROUTINE surfini(ngrid,nq,qsurf,albedo,albedo_bareground,
     2     &                   albedo_snow_SPECTV,albedo_co2_ice_SPECTV)
    23
    3       USE surfdat_h, only: albedodat, albedice
     4      USE surfdat_h, only: albedodat
    45      USE tracer_h, only: igcm_co2_ice
    5       use comgeomfi_h, only: lati
    66      use planetwide_mod, only: planetwide_maxval, planetwide_minval
     7      use radinc_h, only : L_NSPECTV
     8      use callkeys_mod, only : albedosnow, albedoco2ice
    79
    810      IMPLICIT NONE
    9 c=======================================================================
    10 c
    11 c   creation des calottes pour l'etat initial
    12 c
    13 c=======================================================================
    14 c-----------------------------------------------------------------------
     11     
     12     
     13ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
     14cccccccccccccc                                                                 cccccccccccccc
     15cccccccccccccc   Spectral Albedo Initialisation - Routine modified by MT2015.  cccccccccccccc
     16cccccccccccccc                                                                 cccccccccccccc
     17ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
     18
     19
     20c--------------------
    1521c   Declarations:
    16 c   -------------
    17 !#include "dimensions.h"
    18 !#include "dimphys.h"
    19 c
     22c--------------------
     23
    2024      INTEGER,INTENT(IN) :: ngrid
    2125      INTEGER,INTENT(IN) :: nq
    22       REAL,INTENT(OUT) :: psolaralb(ngrid)
    23       REAL,INTENT(IN) :: qsurf(ngrid,nq) !tracer on surface (kg/m2)
     26      REAL,INTENT(OUT) :: albedo(ngrid,L_NSPECTV)
     27      REAL,INTENT(OUT) :: albedo_bareground(ngrid)
     28      REAL,INTENT(OUT) :: albedo_snow_SPECTV(L_NSPECTV)
     29      REAL,INTENT(OUT) :: albedo_co2_ice_SPECTV(L_NSPECTV)
     30      REAL,INTENT(IN) :: qsurf(ngrid,nq) ! tracer on surface (kg/m2)
    2431
    25       INTEGER :: ig,icap
     32      INTEGER :: ig,nw
    2633      REAL :: min_albedo,max_albedo
    27 c
     34
    2835c=======================================================================
    2936
    30 
    31       DO ig=1,ngrid
    32          psolaralb(ig)=albedodat(ig)
     37      ! Step 1 : Initialisation of the Spectral Albedos.
     38      DO nw=1,L_NSPECTV
     39         albedo_snow_SPECTV(nw)=albedosnow
     40         albedo_co2_ice_SPECTV(nw)=albedoco2ice
    3341      ENDDO
    3442
    35       call planetwide_minval(albedodat,min_albedo)
    36       call planetwide_maxval(albedodat,max_albedo)
    37       write(*,*) 'surfini: minimum corrected albedo',min_albedo
    38       write(*,*) 'surfini: maximum corrected albedo',max_albedo
    3943
     44      ! Step 2 : We get the bare ground albedo from the start files.
     45      DO ig=1,ngrid
     46         albedo_bareground(ig)=albedodat(ig)
     47         DO nw=1,L_NSPECTV
     48            albedo(ig,nw)=albedo_bareground(ig)
     49         ENDDO
     50      ENDDO
     51      call planetwide_minval(albedo_bareground,min_albedo)
     52      call planetwide_maxval(albedo_bareground,max_albedo)
     53      write(*,*) 'surfini: minimum bare ground albedo',min_albedo
     54      write(*,*) 'surfini: maximum bare ground albedo',max_albedo
     55
     56
     57      ! Step 3 : We modify the albedo considering some CO2 at the surface. We dont take into account water ice (this is made in hydrol after the first timestep) ...
    4058      if (igcm_co2_ice.ne.0) then
    41 ! Change Albedo if there is CO2 ice on the surface
    42         DO ig=1,ngrid
    43           IF (qsurf(ig,igcm_co2_ice) .GT. 0.) THEN
    44              IF(lati(ig).LT.0.) THEN
    45                 icap=2 ! Southern hemisphere
    46              ELSE
    47                 icap=1 ! Northern hemisphere
    48              ENDIF
    49              psolaralb(ig) = albedice(icap)
    50           END IF
    51         ENDDO ! of DO ig=1,ngrid     
     59         DO ig=1,ngrid
     60            IF (qsurf(ig,igcm_co2_ice) .GT. 1.) THEN ! This was changed by MT2015. Condition for ~1mm of CO2 ice deposit.
     61               DO nw=1,L_NSPECTV
     62                  albedo(ig,nw)=albedo_co2_ice_SPECTV(nw)
     63               ENDDO
     64            END IF   
     65         ENDDO   
    5266      else
    53         write(*,*) "surfini: No CO2 ice tracer on surface  ..."
    54         write(*,*) "         and therefore no albedo change."
    55       endif
     67         write(*,*) "surfini: No CO2 ice tracer on surface  ..."
     68         write(*,*) "         and therefore no albedo change."
     69      endif     
     70      call planetwide_minval(albedo,min_albedo)
     71      call planetwide_maxval(albedo,max_albedo)
     72      write(*,*) 'surfini: minimum corrected initial albedo',min_albedo
     73      write(*,*) 'surfini: maximum corrected initial albedo',max_albedo
    5674
    57       call planetwide_minval(psolaralb,min_albedo)
    58       call planetwide_maxval(psolaralb,max_albedo)
    59       write(*,*) 'surfini: minimum corrected albedo',min_albedo
    60       write(*,*) 'surfini: maximum corrected albedo',max_albedo
    6175
    6276      END
  • trunk/LMDZ.GENERIC/libf/phystd/tabfi.F

    r1397 r1482  
    4646      use ioipsl_getincom , only: getin
    4747
    48       use surfdat_h, only: albedice, emisice, iceradius, dtemisice,
     48      use surfdat_h, only: emisice, iceradius, dtemisice,
    4949     &                     emissiv
    5050      use comsoil_h, only: volcapa
     
    133133      emin_turb = tab_cntrl(tab0+21)
    134134c optical properties of polar caps and ground emissivity
    135       albedice(1)= tab_cntrl(tab0+22)
    136       albedice(2)= tab_cntrl(tab0+23)
    137135      emisice(1) = tab_cntrl(tab0+24)
    138136      emisice(2) = tab_cntrl(tab0+25)
     
    190188      write(*,5) '(24)     emisice(1)',tab_cntrl(tab0+24),emisice(1)
    191189      write(*,5) '(25)     emisice(2)',tab_cntrl(tab0+25),emisice(2)
    192       write(*,5) '(22)    albedice(1)',tab_cntrl(tab0+22),albedice(1)
    193       write(*,5) '(23)    albedice(2)',tab_cntrl(tab0+23),albedice(2)
    194190      write(*,6) '(31)   iceradius(1)',tab_cntrl(tab0+31),iceradius(1)
    195191      write(*,6) '(32)   iceradius(2)',tab_cntrl(tab0+32),iceradius(2)
     
    225221      write(*,*) '(26)         emissiv : ground emissivity'
    226222      write(*,*) '(24 et 25)   emisice : CO2 ice max emissivity '
    227       write(*,*) '(22 et 23)  albedice : CO2 ice cap albedos'
    228223      write(*,*) '(31 et 32) iceradius : mean scat radius of CO2 snow'
    229224      write(*,*) '(33 et 34) dtemisice : time scale for snow',
     
    315310          write(*,*) ' emisice(2) (new value):',emisice(2)
    316311
    317         else if (modif(1:len_trim(modif)) .eq. 'albedice') then
    318           write(*,*) 'current value albedice(1) North:',albedice(1)
    319           write(*,*) 'enter new value:'
    320  108      read(*,*,iostat=ierr) albedice(1)
    321           if(ierr.ne.0) goto 108
    322           write(*,*)
    323           write(*,*) ' albedice(1) (new value):',albedice(1)
    324           write(*,*)
    325 
    326           write(*,*) 'current value albedice(2) South:',albedice(2)
    327           write(*,*) 'enter new value:'
    328  109      read(*,*,iostat=ierr) albedice(2)
    329           if(ierr.ne.0) goto 109
    330           write(*,*)
    331           write(*,*) ' albedice(2) (new value):',albedice(2)
    332 
    333312        else if (modif(1:len_trim(modif)) .eq. 'iceradius') then
    334313          write(*,*) 'current value iceradius(1) North:',iceradius(1)
     
    518497      write(*,5) '(24)     emisice(1)',tab_cntrl(tab0+24),emisice(1)
    519498      write(*,5) '(25)     emisice(2)',tab_cntrl(tab0+25),emisice(2)
    520       write(*,5) '(22)    albedice(1)',tab_cntrl(tab0+22),albedice(1)
    521       write(*,5) '(23)    albedice(2)',tab_cntrl(tab0+23),albedice(2)
    522499      write(*,6) '(31)   iceradius(1)',tab_cntrl(tab0+31),iceradius(1)
    523500      write(*,6) '(32)   iceradius(2)',tab_cntrl(tab0+32),iceradius(2)
Note: See TracChangeset for help on using the changeset viewer.