Changeset 2953


Ignore:
Timestamp:
Apr 28, 2023, 2:31:03 PM (19 months ago)
Author:
romain.vande
Message:

Mars PCM : Adapt vdifc, co2condens, rocketduststorm and topmons routines to the subslope parametrisation.
RV

Location:
trunk/LMDZ.MARS
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.MARS/README

    r2951 r2953  
    40194019too long for fixed fortran format.
    40204020Minor fix for picky gfortran compiler in testphys1d (no .eq. for logicals!)
     4021
     4022== 28/04/2023 == RV
     4023Correct writing of variables inertiesoil and fluxgeo following r2919 and r2942
     4024
     4025== 28/04/2023 == RV
     4026Adapt vdifc, co2condens, rocketduststorm and topmons routines to the subslope parametrisation.
  • trunk/LMDZ.MARS/libf/phymars/co2condens_mod.F

    r2942 r2953  
    88      CONTAINS
    99
    10       SUBROUTINE co2condens(ngrid,nlayer,nq,ptimestep,
     10      SUBROUTINE co2condens(ngrid,nlayer,nq,nslope,ptimestep,
    1111     $                  pcapcal,pplay,pplev,ptsrf,pt,
    1212     $                  pphi,pdt,pdu,pdv,pdtsrf,pu,pv,pq,pdq,
     
    3434       USE vertical_layers_mod, ONLY: ap, bp
    3535#endif
     36      use comslope_mod, ONLY: subslope_dist,def_slope_mean
    3637       IMPLICIT NONE
    3738c=======================================================================
     
    5960      INTEGER,INTENT(IN) :: nlayer ! number of vertical layers
    6061      INTEGER,INTENT(IN) :: nq  ! number of tracers
     62      INTEGER,INTENT(IN) :: nslope  ! number of subslope
    6163
    6264      REAL,INTENT(IN) :: ptimestep ! physics timestep (s)
    63       REAL,INTENT(IN) :: pcapcal(ngrid)
     65      REAL,INTENT(IN) :: pcapcal(ngrid,nslope)
    6466      REAL,INTENT(IN) :: pplay(ngrid,nlayer) !mid-layer pressure (Pa)
    6567      REAL,INTENT(IN) :: pplev(ngrid,nlayer+1) ! inter-layer pressure (Pa)
    66       REAL,INTENT(IN) :: ptsrf(ngrid) ! surface temperature (K)
     68      REAL,INTENT(IN) :: ptsrf(ngrid,nslope) ! surface temperature (K)
    6769      REAL,INTENT(IN) :: pt(ngrid,nlayer) ! atmospheric temperature (K)
    6870      REAL,INTENT(IN) :: pphi(ngrid,nlayer) ! geopotential (m2.s-2)
     
    7375      REAL,INTENT(IN) :: pdv(ngrid,nlayer) ! tendency on meridional wind (m/s2)
    7476                                           ! from previous physical processes
    75       REAL,INTENT(IN) :: pdtsrf(ngrid) ! tendency on surface temperature from
     77      REAL,INTENT(IN) :: pdtsrf(ngrid,nslope) ! tendency on surface temperature from
    7678                                       ! previous physical processes (K/s)
    7779      REAL,INTENT(IN) :: pu(ngrid,nlayer) ! zonal wind (m/s)
     
    8486      REAL,INTENT(IN) :: pcondicea_co2microp(ngrid,nlayer)! tendency due to CO2 condensation (kg/kg.s-1)
    8587
    86       REAL,INTENT(INOUT) :: piceco2(ngrid) ! CO2 ice on the surface (kg.m-2)
    87       REAL,INTENT(INOUT) :: psolaralb(ngrid,2) ! albedo of the surface
    88       REAL,INTENT(INOUT) :: pemisurf(ngrid) ! emissivity of the surface
     88      REAL,INTENT(INOUT) :: piceco2(ngrid,nslope) ! CO2 ice on the surface (kg.m-2)
     89      REAL,INTENT(INOUT) :: psolaralb(ngrid,2,nslope) ! albedo of the surface
     90      REAL,INTENT(INOUT) :: pemisurf(ngrid,nslope) ! emissivity of the surface
    8991      REAL,INTENT(IN) :: rdust(ngrid,nlayer) ! dust effective radius
    9092     
    9193      ! tendencies due to CO2 condensation/sublimation:
    9294      REAL,INTENT(OUT) :: pdtc(ngrid,nlayer) ! tendency on temperature (K/s)
    93       REAL,INTENT(OUT) :: pdtsrfc(ngrid) ! tendency on surface temperature (K/s)
     95      REAL,INTENT(OUT) :: pdtsrfc(ngrid,nslope) ! tendency on surface temperature (K/s)
    9496      REAL,INTENT(OUT) :: pdpsrf(ngrid) ! tendency on surface pressure (Pa/s)
    9597      REAL,INTENT(OUT) :: pduc(ngrid,nlayer) ! tendency on zonal wind (m.s-2)
     
    112114      REAL ztcond (ngrid,nlayer+1) ! CO2 condensation temperature (atm)
    113115      REAL ztcondsol(ngrid) ! CO2 condensation temperature (surface)
    114       REAL zdiceco2(ngrid)
     116      REAL zdiceco2(ngrid,nslope)
     117      REAL zdiceco2_mesh_avg(ngrid)
    115118      REAL zcondicea(ngrid,nlayer) ! condensation rate in layer  l  (kg/m2/s)
    116       REAL zcondices(ngrid) ! condensation rate on the ground (kg/m2/s)
     119      REAL zcondices(ngrid,nslope) ! condensation rate on the ground (kg/m2/s)
     120      REAL zcondices_mesh_avg(ngrid) ! condensation rate on the ground (kg/m2/s)
    117121      REAL zfallice(ngrid,nlayer+1) ! amount of ice falling from layer l (kg/m2/s)
    118122      REAL condens_layer(ngrid,nlayer) ! co2clouds: condensation rate in layer  l  (kg/m2/s)
     
    122126      REAL zu(nlayer),zv(nlayer)
    123127      REAL zqc(nlayer,nq),zq1(nlayer)
    124       REAL ztsrf(ngrid)
     128      REAL ztsrf(ngrid,nslope)
    125129      REAL ztc(nlayer), ztm(nlayer+1)
    126130      REAL zum(nlayer+1) , zvm(nlayer+1)
     
    129133      REAL Sm(nlayer),Smq(nlayer,nq),mixmas,qmix
    130134      REAL availco2
    131       LOGICAL condsub(ngrid)
    132 
    133       real :: emisref(ngrid)
     135      LOGICAL condsub(ngrid,nslope)
     136
     137      real :: emisref(ngrid,nslope)
    134138     
    135139      REAL zdq_scav(ngrid,nlayer,nq) ! tendency due to scavenging by co2
     
    170174      REAL masseq(nlayer),wq(nlayer+1)
    171175      INTEGER ifils,iq2
     176
     177c Subslope:
     178
     179      REAL   :: emisref_tmp(ngrid)
     180      REAL   :: alb_tmp(ngrid,2) ! local
     181      REAL   :: zcondices_tmp(ngrid)    ! local 
     182      REAL   :: piceco2_tmp(ngrid)    ! local 
     183      REAL   :: pemisurf_tmp(ngrid)! local
     184      LOGICAL :: condsub_tmp(ngrid) !local
     185      REAL :: zfallice_tmp(ngrid,nlayer+1)
     186      REAL :: condens_layer_tmp(ngrid,nlayer) ! co2clouds: condensation rate in layer  l  (kg/m2/s)
     187      INTEGER :: islope
    172188c----------------------------------------------------------------------
    173189
     
    231247      pdqc(1:ngrid,1:nlayer,1:nq)  = 0
    232248
    233       zcondices(1:ngrid) = 0.
    234       pdtsrfc(1:ngrid) = 0.
     249      zcondices(1:ngrid,1:nslope) = 0.
     250      zcondices_mesh_avg(1:ngrid)=0.
     251      pdtsrfc(1:ngrid,1:nslope) = 0.
    235252      pdpsrf(1:ngrid) = 0.
    236       condsub(1:ngrid) = .false.
    237       zdiceco2(1:ngrid) = 0.
     253      condsub(1:ngrid,1:nslope) = .false.
     254      zdiceco2(1:ngrid,1:nslope) = 0.
     255      zdiceco2_mesh_avg(1:ngrid)=0.
    238256
    239257      zfallheat=0
     
    301319           pdtc(ig,l)=0.
    302320           IF((zt(ig,l).LT.ztcond(ig,l)).or.(zfallice(ig,l+1).gt.0))THEN
    303                condsub(ig)=.true.
     321               condsub(ig,:)=.true.
    304322               IF (zfallice(ig,l+1).gt.0) then 
    305323                 zfallheat=zfallice(ig,l+1)*
     
    347365          condens_column(ig) = sum(condens_layer(ig,:))
    348366          zfallice(ig,1) = zdqssed_co2(ig)
    349           piceco2(ig) = piceco2(ig) + zdqssed_co2(ig)*ptimestep
     367          DO islope = 1,nslope
     368            piceco2(ig,islope) = piceco2(ig,islope) +
     369     &                                 zdqssed_co2(ig)*ptimestep *
     370     &                         cos(pi*def_slope_mean(islope)/180.)
     371          ENDDO
    350372        ENDDO
    351373       call write_output("co2condens_zfallice",
     
    371393         ztcondsol(ig)=
    372394     &          1./(bcond-acond*log(.01*vmr_co2(ig,1)*pplev(ig,1)))
    373          ztsrf(ig) = ptsrf(ig) + pdtsrf(ig)*ptimestep
     395         DO islope = 1,nslope
     396           ztsrf(ig,islope) = ptsrf(ig,islope) +
     397     &                      pdtsrf(ig,islope)*ptimestep
     398         ENDDO
    374399      ENDDO
    375400
     
    388413            icap=1
    389414         ENDIF
     415
     416         DO islope = 1,nslope
     417c        Need first to put piceco2_slope(ig,islope) in kg/m^2 flat
     418
     419         piceco2(ig,islope) = piceco2(ig,islope)
     420     &                /cos(pi*def_slope_mean(islope)/180.)
     421
    390422c
    391423c        Loop on where we have  condensation/ sublimation
    392          IF ((ztsrf(ig) .LT. ztcondsol(ig)) .OR.   ! ground cond
     424         IF ((ztsrf(ig,islope) .LT. ztcondsol(ig)) .OR.   ! ground cond
    393425     $       (zfallice(ig,1).NE.0.) .OR.           ! falling snow
    394      $      ((ztsrf(ig) .GT. ztcondsol(ig)) .AND.  ! ground sublim.
    395      $      ((piceco2(ig)+zfallice(ig,1)*ptimestep) .NE. 0.))) THEN
    396             condsub(ig) = .true.
     426     $      ((ztsrf(ig,islope) .GT. ztcondsol(ig)) .AND.  ! ground sublim.
     427     $      ((piceco2(ig,islope)+zfallice(ig,1)*ptimestep)
     428     $                 .NE. 0.))) THEN
     429            condsub(ig,islope) = .true.
    397430
    398431            IF (zfallice(ig,1).gt.0 .and. .not. co2clouds) then
     
    406439c           condensation or partial sublimation of CO2 ice
    407440c           """""""""""""""""""""""""""""""""""""""""""""""
    408             zcondices(ig) = pcapcal(ig)*(ztcondsol(ig)-ztsrf(ig))
    409      &                      /(latcond*ptimestep)  - zfallheat
    410             pdtsrfc(ig) = (ztcondsol(ig) - ztsrf(ig))/ptimestep
     441            if(ztsrf(ig,islope).LT. ztcondsol(ig)) then 
     442c            condensation
     443            zcondices(ig,islope)=pcapcal(ig,islope)
     444     &       *(ztcondsol(ig)-ztsrf(ig,islope))
     445c     &       /((latcond+cpp*(zt(ig,1)-ztcondsol(ig)))*ptimestep)   
     446     &       /(latcond*ptimestep)   
     447     &       - zfallheat
     448             else
     449c            sublimation
     450             zcondices(ig,islope)=pcapcal(ig,islope)
     451     &       *(ztcondsol(ig)-ztsrf(ig,islope))
     452     &       /(latcond*ptimestep)
     453     &       - zfallheat
     454            endif
     455            pdtsrfc(ig,islope) = (ztcondsol(ig) - ztsrf(ig,islope))
     456     &                            /ptimestep
    411457#ifdef MESOSCALE
    412458      print*, "not enough CO2 tracer in 1st layer to condense"
     
    421467                availco2 = pq(ig,1,ico2)*((ap(1)-ap(2))+
    422468     &                     (bp(1)-bp(2))*(pplev(ig,1)/g -
    423      &                     (zcondices(ig) + zfallice(ig,1))*ptimestep))
    424                 if ((zcondices(ig) + condens_layer(ig,1))*ptimestep
     469     &                     (zcondices(ig,islope) + zfallice(ig,1))
     470     &                      *ptimestep))
     471                if ((zcondices(ig,islope) + condens_layer(ig,1))
     472     &               *ptimestep
    425473     &           .gt.availco2) then
    426                   zcondices(ig) = availco2/ptimestep -
     474                  zcondices(ig,islope) = availco2/ptimestep -
    427475     &                            condens_layer(ig,1)
    428                   pdtsrfc(ig) = (latcond/pcapcal(ig))*
    429      &                          (zcondices(ig)+zfallheat)
     476                  pdtsrfc(ig,islope) = (latcond/pcapcal(ig,islope))*
     477     &                          (zcondices(ig,islope)+zfallheat)
    430478                end if
    431479#else
     
    437485#endif
    438486
    439 c           If the entire CO2 ice layer sublimes
     487c           If the entire CO2 ice layer sublimes on the slope
    440488c           """"""""""""""""""""""""""""""""""""""""""""""""""""
    441489c           (including what has just condensed in the atmosphere)
    442490            if (co2clouds) then
    443             IF((piceco2(ig)/ptimestep).LE.
    444      &          -zcondices(ig))THEN
    445                zcondices(ig) = -piceco2(ig)/ptimestep
    446                pdtsrfc(ig)=(latcond/pcapcal(ig)) *
    447      &         (zcondices(ig)+zfallheat)
     491            IF((piceco2(ig,islope)/ptimestep).LE.
     492     &          -zcondices(ig,islope))THEN
     493               zcondices(ig,islope) = -piceco2(ig,islope)/ptimestep
     494               pdtsrfc(ig,islope)=(latcond/pcapcal(ig,islope)) *
     495     &         (zcondices(ig,islope)+zfallheat)
    448496            END IF
    449497            else
    450             IF((piceco2(ig)/ptimestep+zfallice(ig,1)).LE.
    451      &          -zcondices(ig))THEN
    452                zcondices(ig) = -piceco2(ig)/ptimestep - zfallice(ig,1)
    453                pdtsrfc(ig)=(latcond/pcapcal(ig)) *
    454      &         (zcondices(ig)+zfallheat)
     498            IF((piceco2(ig,islope)/ptimestep+zfallice(ig,1)).LE.
     499     &          -zcondices(ig,islope))THEN
     500               zcondices(ig,islope) = -piceco2(ig,islope)
     501     &              /ptimestep - zfallice(ig,1)
     502               pdtsrfc(ig,islope)=(latcond/pcapcal(ig,islope)) *
     503     &         (zcondices(ig,islope)+zfallheat)
    455504            END IF
    456505            end if
    457506
    458 c           Changing CO2 ice amount and pressure :
     507c           Changing CO2 ice amount and pressure per slope:
    459508c           """"""""""""""""""""""""""""""""""""
    460             zdiceco2(ig) = zcondices(ig) + zfallice(ig,1)
     509            zdiceco2(ig,islope) = zcondices(ig,islope)+zfallice(ig,1)
    461510     &        + condens_column(ig)
    462511            if (co2clouds) then
    463512             ! add here only direct condensation/sublimation
    464             piceco2(ig) = piceco2(ig) + zcondices(ig)*ptimestep
     513            piceco2(ig,islope) = piceco2(ig,islope) +
     514     &                           zcondices(ig,islope)*ptimestep
    465515            else
    466516             ! add here also CO2 ice in the atmosphere
    467             piceco2(ig) = piceco2(ig) + zdiceco2(ig)*ptimestep
     517            piceco2(ig,islope) = piceco2(ig,islope) +
     518     &                           zdiceco2(ig,islope)*ptimestep
    468519            end if
    469             pdpsrf(ig) = -zdiceco2(ig)*g
     520
     521            zcondices_mesh_avg(ig) = zcondices_mesh_avg(ig) + 
     522     &          zcondices(ig,islope)* subslope_dist(ig,islope)
     523
     524            zdiceco2_mesh_avg(ig) = zdiceco2_mesh_avg(ig) + 
     525     &          zdiceco2(ig,islope)* subslope_dist(ig,islope)
     526
     527         END IF ! if there is condensation/sublimation
     528
     529         piceco2(ig,islope) = piceco2(ig,islope)
     530     &                * cos(pi*def_slope_mean(islope)/180.)
     531
     532         ENDDO !islope
     533
     534            pdpsrf(ig) = -zdiceco2_mesh_avg(ig)*g
    470535
    471536            IF(ABS(pdpsrf(ig)*ptimestep).GT.pplev(ig,1)) THEN
     
    480545     &              'condensing more than total mass', 1)
    481546            ENDIF
    482          END IF ! if there is condensation/sublimation
     547
    483548      ENDDO ! of DO ig=1,ngrid
     549     
    484550
    485551c  ********************************************************************
     
    489555!     Check that amont of CO2 ice is not problematic
    490556      DO ig=1,ngrid
    491            if(.not.piceco2(ig).ge.0.) THEN
    492               if(piceco2(ig).le.-5.e-8) print*,
    493      $         'WARNING co2condens piceco2(',ig,')=', piceco2(ig)
    494                piceco2(ig)=0.
     557         DO islope = 1,nslope
     558           if(.not.piceco2(ig,islope).ge.0.) THEN
     559              if(piceco2(ig,islope).le.-5.e-8) print*,
     560     $         'WARNING co2condens piceco2(',ig,')=', piceco2(ig,islope)
     561               piceco2(ig,islope)=0.
    495562           endif
     563        ENDDO
    496564      ENDDO
    497565     
    498566!     Set albedo and emissivity of the surface
    499567!     ----------------------------------------
    500       CALL albedocaps(zls,ngrid,piceco2,psolaralb,emisref)
     568      DO islope = 1,nslope
     569        piceco2_tmp(:) = piceco2(:,islope)
     570        alb_tmp(:,:) = psolaralb(:,:,islope)
     571        emisref_tmp(:) = 0.
     572        CALL albedocaps(zls,ngrid,piceco2_tmp,alb_tmp,emisref_tmp)
     573        psolaralb(:,1,islope) =  alb_tmp(:,1)
     574        psolaralb(:,2,islope) =  alb_tmp(:,2)
     575        emisref(:,islope) = emisref_tmp(:)
     576      ENDDO
    501577
    502578! set pemisurf() to emissiv when there is bare surface (needed for co2snow)
    503579      DO ig=1,ngrid
    504         if (piceco2(ig).eq.0) then
    505           pemisurf(ig)=emissiv
    506         endif
     580        DO islope = 1,nslope
     581          if (piceco2(ig,islope).eq.0) then
     582            pemisurf(ig,islope)=emissiv
     583          endif
     584        ENDDO
    507585      ENDDO
    508586
     
    515593
    516594      DO ig=1,ngrid
    517         if (condsub(ig)) then
     595        if (any(condsub(ig,:))) then
    518596           do l=1,nlayer
    519597             ztc(l)  =zt(ig,l)   +pdtc(ig,l)  *ptimestep
     
    527605c  Mass fluxes through the sigma levels (kg.m-2.s-1)  (>0 when up)
    528606c  """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    529               zmflux(1) = -zcondices(ig) - zdqssed_co2(ig)
     607              zmflux(1) = -zcondices_mesh_avg(ig) - zdqssed_co2(ig)
    530608              DO l=1,nlayer
    531609                zmflux(l+1) = zmflux(l) - condens_layer(ig,l)
     
    702780c   CO2 snow / clouds scheme
    703781c ***************************************************************
    704         call co2snow(ngrid,nlayer,ptimestep,emisref,condsub,pplev,
    705      &               condens_layer,zcondices,zfallice,pemisurf)
     782      DO islope = 1,nslope
     783        emisref_tmp(:) = emisref(:,islope)
     784        condsub_tmp(:) = condsub(:,islope)
     785        condens_layer_tmp(:,:) = condens_layer(:,:)*
     786     &            cos(pi*def_slope_mean(islope)/180.)
     787        zcondices_tmp(:) = zcondices(:,islope)*
     788     &            cos(pi*def_slope_mean(islope)/180.)
     789        zfallice_tmp(:,:) =  zfallice(:,:)*
     790     &            cos(pi*def_slope_mean(islope)/180.)
     791        pemisurf_tmp(:) = pemisurf(:,islope)
     792
     793        call co2snow(ngrid,nlayer,ptimestep,emisref_tmp,condsub_tmp,
     794     &        pplev,condens_layer_tmp,zcondices_tmp,zfallice_tmp,
     795     &        pemisurf_tmp)
     796        pemisurf(:,islope) = pemisurf_tmp(:)
     797
     798      ENDDO
    706799c ***************************************************************
    707800c Ecriture des diagnostiques
     
    739832     &          1./(bcond-acond*log(.01*vmr_co2(ngrid,1)*
    740833     &                    (pplev(ngrid,1)+pdpsrf(ngrid)*ptimestep)))
    741              pdtsrfc(ngrid)=(ztcondsol(ngrid)-ztsrf(ngrid))/ptimestep
     834             DO islope = 1,nslope
     835             pdtsrfc(ngrid,islope)=(ztcondsol(ngrid)-
     836     &           ztsrf(ngrid,islope))/ptimestep
     837             ENDDO ! islope = 1,nslope
    742838           endif
    743839         endif
  • trunk/LMDZ.MARS/libf/phymars/physiq_mod.F

    r2942 r2953  
    675675c        initialize tracers
    676676c        ~~~~~~~~~~~~~~~~~~
    677 
    678677         CALL initracer(ngrid,nq,qsurf)
    679678
     
    681680c        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    682681         CALL surfini(ngrid,qsurf)
    683 
    684682         CALL iniorbit(aphelie,periheli,year_day,peri_day,obliquit)
    685 
    686683c        initialize soil
    687684c        ~~~~~~~~~~~~~~~
     
    11701167          ELSE        ! not calling subslope, nslope might be > 1
    11711168          DO islope = 1,nslope
    1172             IF(def_slope_mean(islope).ge.0.) THEN
    1173               sl_psi = 0. !Northward slope
    1174             ELSE
    1175              sl_psi = 180. !Southward slope
    1176             ENDIF
    11771169            sl_the=abs(def_slope_mean(islope)) 
    11781170            IF (sl_the .gt. 1e-6) THEN
     1171              IF(def_slope_mean(islope).ge.0.) THEN
     1172                psi_sl(:) = 0. !Northward slope
     1173              ELSE
     1174                psi_sl(:) = 180. !Southward slope
     1175              ENDIF
    11791176              DO ig=1,ngrid 
    11801177                ztim1=fluxsurf_dn_sw(ig,1,islope)
     
    12321229           ENDDO
    12331230
    1234 
    12351231c          Net atmospheric radiative heating rate (K.s-1)
    12361232c          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     
    12541250c          Net radiative surface flux (W.m-2)
    12551251c          ~~~~~~~~~~~~~~~~~~~~~~~~~~
     1252
    12561253c
    12571254           DO ig=1,ngrid
     
    13121309c               for radiative transfer
    13131310     &                      clearatm,icount,zday,zls,
    1314      &                      tsurf,qsurf_meshavg(:,igcm_co2),igout,
    1315      &                      totstormfract,tauscaling,
     1311     &                      tsurf_meshavg,qsurf_meshavg(:,igcm_co2),
     1312     &                      igout,totstormfract,tauscaling,
    13161313     &                      dust_rad_adjust,IRtoVIScoef,
     1314     &                      albedo_meshavg,emis_meshavg,
    13171315c               input sub-grid scale cloud
    13181316     &                      clearsky,totcloudfrac,
     
    13781376     &                qsurf_meshavg(:,igcm_co2),
    13791377     &                igout,aerosol,tauscaling,dust_rad_adjust,
    1380      &                IRtoVIScoef,totstormfract,clearatm,
     1378     &                IRtoVIScoef,albedo_meshavg,emis_meshavg,
     1379     &                totstormfract,clearatm,
    13811380     &                clearsky,totcloudfrac,
    13821381     &                nohmons,
     
    14131412           endif ! end of if (dustinjection.gt.0)
    14141413
    1415 
    14161414c-----------------------------------------------------------------------
    14171415c    4. Gravity wave and subgrid scale topography drag :
     
    14711469          ENDDO
    14721470        ENDIF
     1471
    14731472c ----------------------
    14741473
     
    20001999c Sedimentation for co2 clouds tracers are inside co2cloud microtimestep
    20012000c Zdqssed isn't
     2001
    20022002           call callsedim(ngrid,nlayer,ptimestep,
    20032003     &                zplev,zzlev,zzlay,pt,pdt,
     
    21802180         zdqc(:,:,:) = 0.
    21812181         zdqsc(:,:,:) = 0.
    2182          CALL co2condens(ngrid,nlayer,nq,ptimestep,
     2182         CALL co2condens(ngrid,nlayer,nq,nslope,ptimestep,
    21832183     $              capcal,zplay,zplev,tsurf,pt,
    21842184     $              pphi,pdt,pdu,pdv,zdtsurf,pu,pv,pq,pdq,
  • trunk/LMDZ.MARS/libf/phymars/rocketduststorm_mod.F90

    r2934 r2953  
    2727                                 tsurf,co2ice,igout,totstormfract,     &
    2828                                 tauscaling,dust_rad_adjust,           &
    29                                  IRtoVIScoef,                          &
     29                                 IRtoVIScoef,albedo,emis,              &
    3030!             input sub-grid scale cloud
    3131                                 clearsky,totcloudfrac,                &
     
    4040                            ,rho_dust
    4141      USE comcstfi_h, only: r,g,cpp,rcp
    42       USE dimradmars_mod, only: albedo,naerkind
     42      USE dimradmars_mod, only: naerkind
    4343      USE comsaison_h, only: dist_sol,mu0,fract
    44       USE surfdat_h, only: emis,zmea, zstd, zsig, hmons
     44      USE surfdat_h, only: zmea, zstd, zsig, hmons
    4545      USE callradite_mod, only: callradite
    4646      use write_output_mod, only: write_output
     
    7878      REAL, INTENT(IN) :: zls
    7979      REAL, INTENT(IN) :: tsurf(ngrid)
     80      REAL, INTENT(IN) :: albedo(ngrid,2)
     81      REAL, INTENT(IN) :: emis(ngrid)
    8082      REAL,INTENT(IN) :: co2ice(ngrid)           ! co2 ice surface layer (kg.m-2)
    8183      INTEGER, INTENT(IN) :: igout
     
    255257      ! 1. Call the second radiative transfer for stormdust, obtain the extra heating
    256258      ! *********************************************************************
     259
    257260      CALL callradite(icount,ngrid,nlayer,nq,zday,zls,pq,albedo,          &
    258261                 emis,mu0,pplev,pplay,pt,tsurf,fract,dist_sol,igout,      &
  • trunk/LMDZ.MARS/libf/phymars/topmons_mod.F90

    r2934 r2953  
    2222                                 icount,zday,zls,tsurf,co2ice,igout,   &
    2323                                 aerosol,tauscaling,dust_rad_adjust,   &
    24                                  IRtoVIScoef,                          &
     24                                 IRtoVIScoef,albedo,emis,              &
    2525!             input sub-grid scale rocket dust storm
    2626                                 totstormfract,clearatm,               &
     
    3737                            ,rho_dust
    3838      USE comcstfi_h, only: r,g,cpp,rcp
    39       USE dimradmars_mod, only: albedo,naerkind
     39      USE dimradmars_mod, only: naerkind
    4040      USE comsaison_h, only: dist_sol,mu0,fract
    41       USE surfdat_h, only: emis,hmons,summit,alpha_hmons, &
     41      USE surfdat_h, only: hmons,summit,alpha_hmons, &
    4242                           hsummit,contains_mons
    4343      USE callradite_mod, only: callradite
     
    7474      REAL, INTENT(IN) :: zls
    7575      REAL, INTENT(IN) :: tsurf(ngrid)
     76      REAL, INTENT(IN) :: albedo(ngrid,2)
     77      REAL, INTENT(IN) :: emis(ngrid)
    7678      REAL,INTENT(IN) :: co2ice(ngrid)           ! co2 ice surface layer (kg.m-2)
    7779      INTEGER, INTENT(IN) :: igout
  • trunk/LMDZ.MARS/libf/phymars/vdifc_mod.F

    r2934 r2953  
    2121     &                      igcm_stormdust_mass, igcm_stormdust_number
    2222      use surfdat_h, only: watercaptag, frost_albedo_threshold, dryness
    23       USE comcstfi_h, ONLY: cpp, r, rcp, g
     23      USE comcstfi_h, ONLY: cpp, r, rcp, g, pi
    2424      use watersat_mod, only: watersat
    2525      use turb_mod, only: turb_resolved, ustar, tstar
     
    2929      use dust_param_mod, only: doubleq, submicron, lifting
    3030      use write_output_mod, only: write_output
     31      use comslope_mod, ONLY: nslope,def_slope,def_slope_mean,
     32     &                      subslope_dist,major_slope,iflat
    3133
    3234      IMPLICIT NONE
     
    6567      REAL,INTENT(IN) :: pu(ngrid,nlay),pv(ngrid,nlay)
    6668      REAL,INTENT(IN) :: ph(ngrid,nlay)
    67       REAL,INTENT(IN) :: ptsrf(ngrid),pemis(ngrid)
     69      REAL,INTENT(IN) :: ptsrf(ngrid,nslope),pemis(ngrid,nslope)
    6870      REAL,INTENT(IN) :: pdufi(ngrid,nlay),pdvfi(ngrid,nlay)
    6971      REAL,INTENT(IN) :: pdhfi(ngrid,nlay)
    70       REAL,INTENT(IN) :: pfluxsrf(ngrid)
     72      REAL,INTENT(IN) :: pfluxsrf(ngrid,nslope)
    7173      REAL,INTENT(OUT) :: pdudif(ngrid,nlay),pdvdif(ngrid,nlay)
    72       REAL,INTENT(OUT) :: pdtsrf(ngrid),pdhdif(ngrid,nlay)
    73       REAL,INTENT(IN) :: pcapcal(ngrid)
     74      REAL,INTENT(OUT) :: pdtsrf(ngrid,nslope),pdhdif(ngrid,nlay)
     75      REAL,INTENT(IN) :: pcapcal(ngrid,nslope)
    7476      REAL,INTENT(INOUT) :: pq2(ngrid,nlay+1)
    7577
     
    8789c    Traceurs :
    8890      integer,intent(in) :: nq
    89       REAL,INTENT(IN) :: pqsurf(ngrid,nq)
     91      REAL,INTENT(IN) :: pqsurf(ngrid,nq,nslope)
    9092      REAL :: zqsurf(ngrid) ! temporary water tracer
    9193      real,intent(in) :: pq(ngrid,nlay,nq), pdqfi(ngrid,nlay,nq)
    9294      real,intent(out) :: pdqdif(ngrid,nlay,nq)
    93       real,intent(out) :: pdqsdif(ngrid,nq)
     95      real,intent(out) :: pdqsdif(ngrid,nq,nslope)
    9496      REAL,INTENT(in) :: dustliftday(ngrid)
    9597      REAL,INTENT(in) :: local_time(ngrid)
     
    100102      REAL :: pt(ngrid,nlay)
    101103 
    102       INTEGER ilev,ig,ilay,nlev
     104      INTEGER ilev,ig,ilay,nlev,islope
    103105
    104106      REAL z4st,zdplanck(ngrid)
     
    106108      REAL zkq(ngrid,nlay+1)
    107109      REAL zcdv(ngrid),zcdh(ngrid)
    108       REAL zcdv_true(ngrid),zcdh_true(ngrid)    ! drag coeff are used by the LES to recompute u* and hfx
     110      REAL, INTENT(IN) :: zcdv_true(ngrid),zcdh_true(ngrid)    ! drag coeff are used by the LES to recompute u* and hfx
    109111      REAL zu(ngrid,nlay),zv(ngrid,nlay)
    110112      REAL zh(ngrid,nlay)
     
    136138      REAL zdqsdif(ngrid) ! subtimestep pdqsdif for water ice
    137139      REAL ztsrf(ngrid) ! temporary surface temperature in tsub
    138       REAL zdtsrf(ngrid) ! surface temperature tendancy in tsub
    139       REAL surf_h2o_lh(ngrid) ! Surface h2o latent heat flux
    140       REAL zsurf_h2o_lh(ngrid) ! Tsub surface h2o latent heat flux
     140      REAL zdtsrf(ngrid,nslope) ! surface temperature tendancy in tsub
     141      REAL surf_h2o_lh(ngrid,nslope) ! Surface h2o latent heat flux
     142      REAL zsurf_h2o_lh(ngrid,nslope) ! Tsub surface h2o latent heat flux
    141143
    142144c     For latent heat release from ground water ice sublimation   
     
    154156      REAL qsat(ngrid)
    155157
    156       REAL hdoflux(ngrid)       ! value of vapour flux of HDO
     158      REAL hdoflux(ngrid,nslope)       ! value of vapour flux of HDO
     159      REAL hdoflux_meshavg(ngrid)       ! value of vapour flux of HDO
    157160!      REAL h2oflux(ngrid)       ! value of vapour flux of H2O
    158161      REAL old_h2o_vap(ngrid)   ! traceur d'eau avant traitement
     162      REAL saved_h2o_vap(ngrid)   ! traceur d'eau avant traitement
    159163
    160164      REAL kmixmin
    161165
    162166c    Argument added for surface water ice budget:
    163       REAL,INTENT(IN) :: watercap(ngrid)
    164       REAL,INTENT(OUT) :: dwatercap_dif(ngrid)
     167      REAL,INTENT(IN) :: watercap(ngrid,nslope)
     168      REAL,INTENT(OUT) :: dwatercap_dif(ngrid,nslope)
    165169
    166170c    Subtimestep to compute h2o latent heat flux:
     
    198202!!MARGAUX
    199203      REAL DoH_vap(ngrid,nlay)
     204!! Sub-grid scale slopes
     205      REAL :: pdqsdif_tmp(ngrid,nq) ! Temporary for dust lifting
     206      REAL :: watercap_tmp(ngrid)
     207      REAL :: zq_slope_vap(ngrid,nlay,nq,nslope)
     208      REAL :: zq_tmp_vap(ngrid,nlay,nq)
     209      REAL :: ptsrf_tmp(ngrid)
     210      REAL :: pqsurf_tmp(ngrid,nq)
     211      REAL :: pdqsdif_tmphdo(ngrid,nq)
     212      REAL :: qsat_tmp(ngrid)
     213      INTEGER :: indmax
     214
     215      character*2 str2
    200216
    201217c    ** un petit test de coherence
     
    232248      ENDIF
    233249
     250      DO ig = 1,ngrid
     251       ptsrf_tmp(ig) = ptsrf(ig,major_slope(ig))
     252       pqsurf_tmp(ig,:) = pqsurf(ig,:,major_slope(ig))
     253      ENDDO
    234254
    235255c-----------------------------------------------------------------------
     
    243263      pdvdif(1:ngrid,1:nlay)=0
    244264      pdhdif(1:ngrid,1:nlay)=0
    245       pdtsrf(1:ngrid)=0
    246       zdtsrf(1:ngrid)=0
    247       surf_h2o_lh(1:ngrid)=0
    248       zsurf_h2o_lh(1:ngrid)=0
     265      pdtsrf(1:ngrid,1:nslope)=0
     266      zdtsrf(1:ngrid,1:nslope)=0
     267      surf_h2o_lh(1:ngrid,1:nslope)=0
     268      zsurf_h2o_lh(1:ngrid,1:nslope)=0
    249269      pdqdif(1:ngrid,1:nlay,1:nq)=0
    250       pdqsdif(1:ngrid,1:nq)=0
     270      pdqsdif(1:ngrid,1:nq,1:nslope)=0
     271      pdqsdif_tmp(1:ngrid,1:nq)=0
    251272      zdqsdif(1:ngrid)=0
    252       dwatercap_dif(1:ngrid)=0
     273      dwatercap_dif(1:ngrid,1:nslope)=0
    253274
    254275c    ** calcul de rho*dz et dt*rho/dz=dt*rho**2 g/dp
     
    275296      ENDDO
    276297      DO ig=1,ngrid
    277          zb0(ig,1)=ptimestep*pplev(ig,1)/(r*ptsrf(ig))
     298         zb0(ig,1)=ptimestep*pplev(ig,1)/(r*ptsrf_tmp(ig))
    278299      ENDDO
    279300
     
    354375         ENDDO
    355376      ENDDO
     377
    356378      zq(1:ngrid,1:nlay,1:nq)=pq(1:ngrid,1:nlay,1:nq)+
    357379     &                        pdqfi(1:ngrid,1:nlay,1:nq)*ptimestep
     
    366388c       ---------------------
    367389
    368       CALL vdif_cd(ngrid,nlay,pz0,g,pzlay,pu,pv,wstar,ptsrf,ph
    369      &             ,zcdv_true,zcdh_true)
     390      CALL vdif_cd(ngrid,nlay,pz0,g,pzlay,pu,pv,wstar,ptsrf_tmp
     391     &          ,ph,zcdv_true,zcdh_true)
    370392
    371393        zu2(:)=pu(:,1)*pu(:,1)+pv(:,1)*pv(:,1)
     
    383405           DO ig=1,ngrid
    384406              IF (zcdh_true(ig) .ne. 0.) THEN      ! When Cd=Ch=0, u*=t*=0
    385                  tstar(ig)=(ph(ig,1)-ptsrf(ig))*zcdh(ig)/ustar(ig)
     407                 tstar(ig)=(ph(ig,1)-ptsrf_tmp(ig))
     408     &                     *zcdh(ig)/ustar(ig)
    386409              ENDIF
    387410           ENDDO
     
    391414           zcdh(:)=zcdh_true(:)*sqrt(zu2(:))     ! 1 / bulk aerodynamic heat conductance
    392415           ustar(:)=sqrt(zcdv_true(:))*sqrt(zu2(:))
    393            tstar(:)=(ph(:,1)-ptsrf(:))*zcdh_true(:)/sqrt(zcdv_true(:))
     416           tstar(:)=(ph(:,1)-ptsrf_tmp(:))
     417     &      *zcdh_true(:)/sqrt(zcdv_true(:))
    394418        ENDIF
    395419
     
    454478      ENDIF
    455479
    456 
    457 
    458 
    459480c-----------------------------------------------------------------------
    460481c   4. inversion pour l'implicite sur u
     
    498519      ENDDO
    499520
    500 
    501 
    502 
    503 
    504521c-----------------------------------------------------------------------
    505522c   5. inversion pour l'implicite sur v
     
    539556         ENDDO
    540557      ENDDO
    541 
    542 
    543 
    544 
    545558
    546559c-----------------------------------------------------------------------
     
    575588      IF (tke_heat_flux .eq. 0.) THEN
    576589      DO ig=1,ngrid
    577          zdplanck(ig)=z4st*pemis(ig)*ptsrf(ig)*ptsrf(ig)*ptsrf(ig)
     590         indmax = major_slope(ig)
     591         zdplanck(ig)=z4st*pemis(ig,indmax)*ptsrf(ig,indmax)*
     592     &                ptsrf(ig,indmax)*ptsrf(ig,indmax)
    578593      ENDDO
    579594      ELSE
     
    603618      ENDIF
    604619
     620
     621
    605622      DO ig=1,ngrid
    606 
     623       indmax = major_slope(ig)
    607624! Initialization of z1 and zd, which do not depend on dmice
    608625
     
    649666c       ----------------------------------------------------
    650667
    651          z1(ig)=pcapcal(ig)*ptsrf(ig)+cpp*zb(ig,1)*zc(ig,1)
    652      s     +zdplanck(ig)*ptsrf(ig)+ pfluxsrf(ig)*ptimestep
    653          z2(ig)= pcapcal(ig)+cpp*zb(ig,1)*(1.-zd(ig,1))+zdplanck(ig)
     668         z1(ig)=pcapcal(ig,indmax)*ptsrf(ig,indmax)
     669     s     + cpp*zb(ig,1)*zc(ig,1)
     670     s     + zdplanck(ig)*ptsrf(ig,indmax)
     671     s     + pfluxsrf(ig,indmax)*ptimestep
     672         z2(ig)= pcapcal(ig,indmax)+cpp*zb(ig,1)*(1.-zd(ig,1))
     673     s     +zdplanck(ig)
    654674         ztsrf2(ig)=z1(ig)/z2(ig)
    655675!         pdtsrf(ig)=(ztsrf2(ig)-ptsrf(ig))/ptimestep  !incremented outside loop
     
    687707       ENDDO   
    688708      ENDIF
    689      
     709
    690710       ENDDO!of Do j=1,XXX
    691 
     711      pdtsrf(ig,indmax)=(ztsrf2(ig)-ptsrf(ig,indmax))/ptimestep
    692712      ENDDO   !of Do ig=1,ngrid
    693 
    694       pdtsrf(:)=(ztsrf2(:)-ptsrf(:))/ptimestep
    695713     
    696714      DO ig=1,ngrid  ! computing sensible heat flux (atm => surface)
    697715         sensibFlux(ig)=cpp*zb(ig,1)/ptimestep*(zhs(ig,1)-ztsrf2(ig))
    698716      ENDDO
     717
     718c  Now implicit sheme on each sub-grid subslope:
     719      IF (nslope.ne.1) then
     720      DO islope=1,nslope
     721        DO ig=1,ngrid
     722          IF(islope.ne.major_slope(ig)) then
     723            IF (tke_heat_flux .eq. 0.) THEN
     724              zdplanck(ig)=z4st*pemis(ig,islope)*ptsrf(ig,islope)**3
     725            ELSE
     726              zdplanck(ig) = 0.
     727            ENDIF
     728            z1(ig)=pcapcal(ig,islope)*ptsrf(ig,islope)
     729     s       + cpp*zb(ig,1)*zc(ig,1)
     730     s       + zdplanck(ig)*ptsrf(ig,islope)
     731     s       + pfluxsrf(ig,islope)*ptimestep
     732            z2(ig)= pcapcal(ig,islope)+cpp*zb(ig,1)*(1.-zd(ig,1))
     733     s       +zdplanck(ig)
     734            ztsrf2(ig)=z1(ig)/z2(ig)
     735            pdtsrf(ig,islope)=(ztsrf2(ig)-ptsrf(ig,islope))/ptimestep
     736          ENDIF ! islope != indmax
     737        ENDDO ! ig
     738       ENDDO !islope
     739       ENDIF !nslope.ne.1
    699740
    700741c-----------------------------------------------------------------------
     
    727768             do ig=1,ngrid
    728769c              if(qsurf(ig,igcm_co2).lt.1) then
    729                  pdqsdif(ig,igcm_dust_mass) =
     770                 pdqsdif_tmp(ig,igcm_dust_mass) =
    730771     &             -alpha_lift(igcm_dust_mass) 
    731                  pdqsdif(ig,igcm_dust_number) =
     772                 pdqsdif_tmp(ig,igcm_dust_number) =
    732773     &             -alpha_lift(igcm_dust_number) 
    733                  pdqsdif(ig,igcm_dust_submicron) =
     774                 pdqsdif_tmp(ig,igcm_dust_submicron) =
    734775     &             -alpha_lift(igcm_dust_submicron)
    735776c              end if
     
    739780                                          !or 2 (injection in CL)
    740781              do ig=1,ngrid
    741                if(pqsurf(ig,igcm_co2).lt.1) then ! pas de soulevement si glace CO2
    742                  pdqsdif(ig,igcm_dust_mass) =
     782               if(pqsurf_tmp(ig,igcm_co2).lt.1) then ! pas de soulevement si glace CO2
     783                 pdqsdif_tmp(ig,igcm_dust_mass) =
    743784     &             -alpha_lift(igcm_dust_mass) 
    744                  pdqsdif(ig,igcm_dust_number) =
     785                 pdqsdif_tmp(ig,igcm_dust_number) =
    745786     &             -alpha_lift(igcm_dust_number)
    746787               end if
     
    748789             elseif(dustinjection.eq.1)then ! dust injection scheme = 1 injection from surface
    749790              do ig=1,ngrid
    750                if(pqsurf(ig,igcm_co2).lt.1) then ! pas de soulevement si glace CO2
     791               if(pqsurf_tmp(ig,igcm_co2).lt.1) then ! pas de soulevement si glace CO2
    751792                IF((ti_injection_sol.LE.local_time(ig)).and.
    752793     &                  (local_time(ig).LE.tf_injection_sol)) THEN
    753794                  if (rdstorm) then !Rocket dust storm scheme
    754                         pdqsdif(ig,igcm_stormdust_mass) =
     795                        pdqsdif_tmp(ig,igcm_stormdust_mass) =
    755796     &                          -alpha_lift(igcm_stormdust_mass)
    756797     &                          *dustliftday(ig)
    757                         pdqsdif(ig,igcm_stormdust_number) =
     798                        pdqsdif_tmp(ig,igcm_stormdust_number) =
    758799     &                          -alpha_lift(igcm_stormdust_number)
    759800     &                          *dustliftday(ig)
    760                         pdqsdif(ig,igcm_dust_mass)= 0.
    761                         pdqsdif(ig,igcm_dust_number)= 0.
     801                        pdqsdif_tmp(ig,igcm_dust_mass)= 0.
     802                        pdqsdif_tmp(ig,igcm_dust_number)= 0.
    762803                  else
    763                         pdqsdif(ig,igcm_dust_mass)=
     804                        pdqsdif_tmp(ig,igcm_dust_mass)=
    764805     &                          -dustliftday(ig)*
    765806     &                          alpha_lift(igcm_dust_mass)               
    766                         pdqsdif(ig,igcm_dust_number)=
     807                        pdqsdif_tmp(ig,igcm_dust_number)=
    767808     &                          -dustliftday(ig)*
    768809     &                          alpha_lift(igcm_dust_number)
    769810                  endif
    770811                  if (submicron) then
    771                         pdqsdif(ig,igcm_dust_submicron) = 0.
     812                        pdqsdif_tmp(ig,igcm_dust_submicron) = 0.
    772813                  endif ! if (submicron)
    773814                ELSE ! outside dust injection time frame
    774                   pdqsdif(ig,igcm_dust_mass)= 0.
    775                   pdqsdif(ig,igcm_dust_number)= 0.
     815                  pdqsdif_tmp(ig,igcm_dust_mass)= 0.
     816                  pdqsdif_tmp(ig,igcm_dust_number)= 0.
    776817                  if (rdstorm) then     
    777                         pdqsdif(ig,igcm_stormdust_mass)= 0.
    778                         pdqsdif(ig,igcm_stormdust_number)= 0.
     818                        pdqsdif_tmp(ig,igcm_stormdust_mass)= 0.
     819                        pdqsdif_tmp(ig,igcm_stormdust_number)= 0.
    779820                  end if
    780821                ENDIF
     
    785826           else if (submicron) then
    786827             do ig=1,ngrid
    787                  pdqsdif(ig,igcm_dust_submicron) =
     828                 pdqsdif_tmp(ig,igcm_dust_submicron) =
    788829     &             -alpha_lift(igcm_dust_submicron)
    789830             end do
     
    791832#endif
    792833            call dustlift(ngrid,nlay,nq,rho,zcdh_true,zcdh,
    793      &                    pqsurf(:,igcm_co2),pdqsdif)
     834     &                    pqsurf_tmp(:,igcm_co2),pdqsdif_tmp)
    794835#ifndef MESOSCALE
    795836           endif !doubleq.AND.submicron
    796837#endif
    797838        else
    798            pdqsdif(1:ngrid,1:nq) = 0.
     839           pdqsdif_tmp(1:ngrid,1:nq) = 0.
    799840        end if
    800841
     
    847888                   zc(ig,1)=(za(ig,1)*zq(ig,1,iq)+
    848889     $              zb(ig,2)*zc(ig,2) +
    849      $             (-pdqsdif(ig,iq)) *ptimestep) *z1(ig)  !tracer flux from surface
     890     $             (-pdqsdif_tmp(ig,iq)) *ptimestep) *z1(ig)  !tracer flux from surface
    850891               ENDDO
    851892            endif !((iq.eq.igcm_h2o_ice)
     
    857898             ENDDO
    858899          ENDDO
     900          DO islope = 1,nslope
     901           DO ig = 1,ngrid
     902            pdqsdif(ig,iq,islope) = pdqsdif_tmp(ig,iq)
     903     &            * cos(pi*def_slope_mean(islope)/180.)
     904            ENDDO
     905          ENDDO
     906
    859907          endif! ((.not. water).or.(.not. iq.eq.igcm_h2o_vap)) then
    860908        enddo ! of do iq=1,nq
     
    867915c      de decrire le flux de chaleur latente
    868916
    869 
    870917        do iq=1,nq 
    871918          if ((water).and.(iq.eq.igcm_h2o_vap)) then
    872919
    873 
     920          DO islope = 1,nslope
    874921           DO ig=1,ngrid
    875              zqsurf(ig)=pqsurf(ig,igcm_h2o_ice)
     922             zqsurf(ig)=pqsurf(ig,igcm_h2o_ice,islope)/
     923     &             cos(pi*def_slope_mean(islope)/180.)
     924              watercap_tmp(ig) = watercap(ig,islope)/
     925     &                       cos(pi*def_slope_mean(islope)/180.)
    876926           ENDDO ! ig=1,ngrid
    877927
     
    879929c          la subroutine est a la fin du fichier
    880930
    881            call make_tsub(ngrid,pdtsrf,zqsurf,
     931           call make_tsub(ngrid,pdtsrf(:,islope),zqsurf,
    882932     &                    ptimestep,dtmax,watercaptag,
    883933     &                    nsubtimestep)
     
    886936c           initialization of ztsrf, which is surface temperature in
    887937c           the subtimestep.
     938           saved_h2o_vap(:)= zq(:,1,igcm_h2o_vap)   
     939
    888940           DO ig=1,ngrid
    889941            subtimestep = ptimestep/nsubtimestep(ig)
    890             ztsrf(ig)=ptsrf(ig)  !  +pdtsrf(ig)*subtimestep
    891 
     942            ztsrf(ig)=ptsrf(ig,islope)  !  +pdtsrf(ig)*subtimestep
     943            zq_tmp_vap(ig,:,:) =zq(ig,:,:)
    892944c           Debut du sous pas de temps
    893945
     
    895947
    896948c           C'est parti !
    897 
    898949             zb(1:ngrid,2:nlay)=zkh(1:ngrid,2:nlay)*zb0(1:ngrid,2:nlay)
    899950     &                     /float(nsubtimestep(ig))
     
    903954             
    904955             z1(ig)=1./(za(ig,nlay)+zb(ig,nlay))
    905              zc(ig,nlay)=za(ig,nlay)*zq(ig,nlay,iq)*z1(ig)
     956             zc(ig,nlay)=za(ig,nlay)*zq_tmp_vap(ig,nlay,iq)*z1(ig)
    906957             zd(ig,nlay)=zb(ig,nlay)*z1(ig)
    907958             DO ilay=nlay-1,2,-1
    908959                 z1(ig)=1./(za(ig,ilay)+zb(ig,ilay)+
    909960     $            zb(ig,ilay+1)*(1.-zd(ig,ilay+1)))
    910                  zc(ig,ilay)=(za(ig,ilay)*zq(ig,ilay,iq)+
     961                 zc(ig,ilay)=(za(ig,ilay)*zq_tmp_vap(ig,ilay,iq)+
    911962     $            zb(ig,ilay+1)*zc(ig,ilay+1))*z1(ig)
    912963                 zd(ig,ilay)=zb(ig,ilay)*z1(ig)
     
    914965             z1(ig)=1./(za(ig,1)+zb(ig,1)+
    915966     $          zb(ig,2)*(1.-zd(ig,2)))
    916              zc(ig,1)=(za(ig,1)*zq(ig,1,iq)+
     967             zc(ig,1)=(za(ig,1)*zq_tmp_vap(ig,1,iq)+
    917968     $        zb(ig,2)*zc(ig,2)) * z1(ig)
    918969
    919970             call watersat(1,ztsrf(ig),pplev(ig,1),qsat(ig))
    920              old_h2o_vap(ig)=zq(ig,1,igcm_h2o_vap)
     971             old_h2o_vap(ig)=zq_tmp_vap(ig,1,igcm_h2o_vap)
    921972             zd(ig,1)=zb(ig,1)*z1(ig)
    922973             zq1temp(ig)=zc(ig,1)+ zd(ig,1)*qsat(ig)
     
    925976     &                      *(zq1temp(ig)-qsat(ig))
    926977c             write(*,*)'subliming more than available frost:  qsurf!'
     978
    927979             if(.not.watercaptag(ig)) then
    928980               if ((-zdqsdif(ig)*subtimestep)
     
    935987c                write(*,*)'flux vers le sol=',pdqsdif(ig,nq)
    936988                 z1(ig)=1./(za(ig,1)+ zb(ig,2)*(1.-zd(ig,2)))
    937                  zc(ig,1)=(za(ig,1)*zq(ig,1,igcm_h2o_vap)+
     989                 zc(ig,1)=(za(ig,1)*zq_tmp_vap(ig,1,igcm_h2o_vap)+
    938990     $           zb(ig,2)*zc(ig,2) +
    939991     $           (-zdqsdif(ig)) *subtimestep) *z1(ig)
     
    944996c             Starting upward calculations for water :
    945997c             Actualisation de h2o_vap dans le premier niveau
    946              zq(ig,1,igcm_h2o_vap)=zq1temp(ig)
     998             zq_tmp_vap(ig,1,igcm_h2o_vap)=zq1temp(ig)
    947999
    9481000c    Take into account the H2O latent heat impact on the surface temperature
     
    9501002                lh=(2834.3-0.28*(ztsrf(ig)-To)-
    9511003     &              0.004*(ztsrf(ig)-To)*(ztsrf(ig)-To))*1.e+3
    952                 zdtsrf(ig)=  zdqsdif(ig)*lh /pcapcal(ig)
     1004                zdtsrf(ig,islope)=  zdqsdif(ig)*lh /pcapcal(ig,islope)
    9531005              endif ! (latentheat_surfwater) then
    9541006
    9551007              DO ilay=2,nlay
    956                 zq(ig,ilay,iq)=zc(ig,ilay)+zd(ig,ilay)*zq(ig,ilay-1,iq)
     1008                zq_tmp_vap(ig,ilay,iq)=zc(ig,ilay)+zd(ig,ilay)
     1009     &                              *zq_tmp_vap(ig,ilay-1,iq)
    9571010              ENDDO
    9581011
    9591012c             Subtimestep water budget :
    9601013
    961               ztsrf(ig) = ztsrf(ig)+(pdtsrf(ig) + zdtsrf(ig))
    962      &                          *subtimestep
     1014              ztsrf(ig) = ztsrf(ig)+(pdtsrf(ig,islope)
     1015     &                 + zdtsrf(ig,islope))*subtimestep
    9631016              zqsurf(ig)= zqsurf(ig)+(
    9641017     &                       zdqsdif(ig))*subtimestep
    9651018
    9661019c             Monitoring instantaneous latent heat flux in W.m-2 :
    967               zsurf_h2o_lh(ig) = zsurf_h2o_lh(ig)+
    968      &                               (zdtsrf(ig)*pcapcal(ig))
    969      &                               *subtimestep
     1020              zsurf_h2o_lh(ig,islope) = zsurf_h2o_lh(ig,islope)+
     1021     &                    (zdtsrf(ig,islope)*pcapcal(ig,islope))
     1022     &                    *subtimestep
    9701023
    9711024c             We ensure that surface temperature can't rise above the solid domain if there
     
    9731026               if(zqsurf(ig)
    9741027     &           +zdqsdif(ig)*subtimestep
    975      &           .gt.frost_albedo_threshold) ! if there is still ice, T cannot exceed To
    976      &           zdtsrf(ig) = min(zdtsrf(ig),(To-ztsrf(ig))/subtimestep) ! ice melt case
    977 
    978 
     1028     &           .gt.frost_albedo_threshold) then ! if there is still ice, T cannot exceed To
     1029                 zdtsrf(ig,islope) = min(zdtsrf(ig,islope),
     1030     &                          (To-ztsrf(ig))/subtimestep) ! ice melt case
     1031               endif
    9791032
    9801033c             Fin du sous pas de temps
     
    9841037c             (btw could also compute the post timestep temp and ice
    9851038c             by simply adding the subtimestep trend instead of this)
    986             surf_h2o_lh(ig)= zsurf_h2o_lh(ig)/ptimestep
    987             pdtsrf(ig)= (ztsrf(ig) -
    988      &                     ptsrf(ig))/ptimestep
    989             pdqsdif(ig,igcm_h2o_ice)=
    990      &                  (zqsurf(ig)- pqsurf(ig,igcm_h2o_ice))/ptimestep
     1039            surf_h2o_lh(ig,islope)= zsurf_h2o_lh(ig,islope)/ptimestep
     1040            pdtsrf(ig,islope)= (ztsrf(ig) -
     1041     &                     ptsrf(ig,islope))/ptimestep
     1042            pdqsdif(ig,igcm_h2o_ice,islope)=
     1043     &                  (zqsurf(ig)- pqsurf(ig,igcm_h2o_ice,islope)/
     1044     &                       cos(pi*def_slope_mean(islope)/180.))
     1045     &                       /ptimestep
    9911046
    9921047c if subliming more than qsurf(ice) and on watercaptag, water
    9931048c sublimates from watercap reservoir (dwatercap_dif is <0)
    9941049            if(watercaptag(ig)) then
    995               if ((-pdqsdif(ig,igcm_h2o_ice)*ptimestep)
    996      &           .gt.(pqsurf(ig,igcm_h2o_ice))) then
    997                  dwatercap_dif(ig)=pdqsdif(ig,igcm_h2o_ice)+
    998      &                     pqsurf(ig,igcm_h2o_ice)/ptimestep
    999                  pdqsdif(ig,igcm_h2o_ice)=
    1000      &                   - pqsurf(ig,igcm_h2o_ice)/ptimestep
     1050              if ((-pdqsdif(ig,igcm_h2o_ice,islope)*ptimestep)
     1051     &           .gt.(pqsurf(ig,igcm_h2o_ice,islope)
     1052     &                 /cos(pi*def_slope_mean(islope)/180.))) then
     1053                 dwatercap_dif(ig,islope)=
     1054     &                     pdqsdif(ig,igcm_h2o_ice,islope)+
     1055     &                     (pqsurf(ig,igcm_h2o_ice,islope) /
     1056     &          cos(pi*def_slope_mean(islope)/180.))/ptimestep
     1057                 pdqsdif(ig,igcm_h2o_ice,islope)=
     1058     &                   - (pqsurf(ig,igcm_h2o_ice,islope)/
     1059     &          cos(pi*def_slope_mean(islope)/180.))/ptimestep
    10011060              endif! ((-pdqsdif(ig)*ptimestep)
    10021061            endif !(watercaptag(ig)) then
    1003 
     1062           zq_slope_vap(ig,:,:,islope) = zq_tmp_vap(ig,:,:)
    10041063           ENDDO ! of DO ig=1,ngrid
     1064          ENDDO ! islope
     1065
     1066c Some grid box averages: interface with the atmosphere
     1067       DO ig = 1,ngrid
     1068         DO ilay = 1,nlay
     1069           zq(ig,ilay,iq) = 0.
     1070           DO islope = 1,nslope
     1071             zq(ig,ilay,iq) = zq(ig,ilay,iq) +
     1072     $           zq_slope_vap(ig,ilay,iq,islope) *
     1073     $           subslope_dist(ig,islope)
     1074           ENDDO
     1075         ENDDO
     1076       ENDDO
     1077
     1078! Recompute values in kg/m^2 slopped
     1079        DO ig = 1,ngrid
     1080          DO islope = 1,nslope 
     1081             pdqsdif(ig,igcm_h2o_ice,islope) =
     1082     &      pdqsdif(ig,igcm_h2o_ice,islope)
     1083     &      * cos(pi*def_slope_mean(islope)/180.)
     1084
     1085             dwatercap_dif(ig,islope) =
     1086     &      dwatercap_dif(ig,islope)
     1087     &      * cos(pi*def_slope_mean(islope)/180.)
     1088          ENDDO
     1089         ENDDO
     1090
    10051091          END IF ! of IF ((water).and.(iq.eq.igcm_h2o_vap))
    10061092
     
    10311117               ENDDO
    10321118          ENDDO
     1119          hdoflux_meshavg(:) = 0.
     1120          DO islope = 1,nslope
     1121
     1122            pdqsdif_tmphdo(:,:) = pdqsdif(:,:,islope)
     1123     &      /cos(pi*def_slope_mean(islope)/180.)
     1124
     1125            call watersat(ngrid,pdtsrf(:,islope)*ptimestep +
     1126     &                     ptsrf(:,islope),pplev(:,1),qsat_tmp)
    10331127
    10341128            CALL hdo_surfex(ngrid,nlay,nq,ptimestep,
    1035      &                      zt,pplay,zq,pqsurf,
    1036      &                      old_h2o_vap,qsat,pdqsdif,dwatercap_dif,
    1037      &                      hdoflux)
     1129     &                      zt,pplay,zq,pqsurf(:,:,islope),
     1130     &                      saved_h2o_vap,qsat_tmp,
     1131     &                      pdqsdif_tmphdo,
     1132     & dwatercap_dif(:,islope)/cos(pi*def_slope_mean(islope)/180.),
     1133     &                      hdoflux(:,islope))
     1134
     1135            pdqsdif(:,:,islope) = pdqsdif_tmphdo(:,:) *
     1136     &               cos(pi*def_slope_mean(islope)/180.)
     1137            DO ig = 1,ngrid
     1138              hdoflux_meshavg(ig) = hdoflux_meshavg(ig) +
     1139     &                     hdoflux(ig,islope)*subslope_dist(ig,islope)
     1140
     1141            ENDDO !ig = 1,ngrid
     1142          ENDDO !islope = 1,nslope
     1143
    10381144            DO ig=1,ngrid
    10391145                z1(ig)=1./(za(ig,1)+zb(ig,1)+
     
    10411147                zc(ig,1)=(za(ig,1)*zq(ig,1,iq)+
    10421148     $         zb(ig,2)*zc(ig,2) +
    1043      $        (-hdoflux(ig)) *ptimestep) *z1(ig)  !tracer flux from surface
     1149     $        (-hdoflux_meshavg(ig)) *ptimestep) *z1(ig)  !tracer flux from surface
    10441150            ENDDO
    10451151
     
    10601166         call write_output("surf_h2o_lh",
    10611167     &                          "Ground ice latent heat flux",
    1062      &                               "W.m-2",surf_h2o_lh(:))
     1168     &                               "W.m-2",surf_h2o_lh(:,iflat))
    10631169
    10641170C       Diagnostic output for HDO
     
    10661172!            CALL write_output('hdoflux',
    10671173!     &                       'hdoflux',
    1068 !     &                       ' ',hdoflux(:)) 
     1174!     &                       ' ',hdoflux_meshavg(:)) 
    10691175!            CALL write_output('h2oflux',
    10701176!     &                       'h2oflux',
     
    11011207         WRITE(*,'(a10,3a15)')
    11021208     s   'theta(t)','theta(t+dt)','u(t)','u(t+dt)'
    1103          PRINT*,ptsrf(ngrid/2+1),ztsrf2(ngrid/2+1)
     1209         PRINT*,ptsrf(ngrid/2+1,:),ztsrf2(ngrid/2+1)
    11041210         DO ilev=1,nlay
    11051211            WRITE(*,'(4f15.7)')
Note: See TracChangeset for help on using the changeset viewer.