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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.