Changeset 2900


Ignore:
Timestamp:
Feb 21, 2023, 5:00:24 PM (21 months ago)
Author:
romain.vande
Message:

Mars PCM:
Following r2896, further implementation of subslope parametrisation.
Carefull ! This is a devolpment revision and it still need improvements and tests.
However, this commit should not change anything for nslope=1.
Only nslope=1 is possible for now!
Utilitaries are not adapted yet.
Dimension of some variables (30 listed below) is changed to add the nslope dimension.
Outputs (diagfi and restartfi) are not changed yet.
nslope is now read and written in the startfi.nc

Changed variables:
_ In surfdat_h:

  • qsurf
  • tsurf
  • watercap
  • emis
  • capcal
  • fluxgrd

_ In comsoil_h

  • tsoil
  • mthermdiff
  • thermdiff
  • coefd
  • alph
  • beta

_ In dimradmars_mod

  • albedo
  • fluxrad_sky
  • fluxrad

_ In physiq_mod

  • inertiesoil
  • fluxsurf_lw
  • fluxsurf_dn_sw
  • dqsurf
  • zdtsurf
  • zdtsdif
  • zdtsurfc
  • zdqsdif
  • zdqsc
  • dwatercap
  • dwatercap_dif
  • zflubid
  • fluxsurf_dn_sw_tot
  • inertiedat_tmp

New variables called VAR_meshavg correspond to the mesh average over all the subslope distribution of the variable

Location:
trunk/LMDZ.MARS
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.MARS/README

    r2897 r2900  
    38803880Minor edits then (+ svn update with RV had some issues, so there are some "artefact changes" ...)
    38813881
     3882== 14/02/2023 == RV
     3883First modifications to introduce subslope parametrization in surface processes.
     3884New variables are added in the new module comslope_mod to describe the subslopes:
     3885        _ nslope (number of subslope)
     3886        _ subslope_dist (distribution  of the slopes)
     3887        _ def_slope (bound of the slope statistics / repartitions) etc..
     3888These variables are added to the starfi file.
     3889Other GCM variables, outputs and subroutines are not modified yet.
     3890Only nslope=1 is accepted so far (ie. same as no subslope parametrization)
     3891
    38823892== 16/02/2023 == RV
    38833893MARS PEM : Deep cleaning of variables name and allocate.
    38843894All the "dyn to phys" grid change is done in subroutines and not in the main program.
     3895
     3896== 21/02/2023 == RV
     3897Following r2896, further implementation of subslope parametrisation.
     3898Carefull ! This is a devolpment revision and it still need improvements and tests.
     3899However, this commit should not change anything for nslope=1.
     3900Only nslope=1 is possible for now!
     3901Utilitaries are not adapted yet.
     3902Dimension of some variables (30 listed below) is changed to add the nslope dimension.
     3903Outputs (diagfi and restartfi) are not changed yet.
     3904nslope is now read and written in the startfi.nc
     3905
     3906
  • trunk/LMDZ.MARS/libf/phymars/comslope_mod.F90

    r2896 r2900  
    1313IMPLICIT NONE
    1414
    15 INTEGER, parameter :: nslope = 1                            ! Number of slopes for the statistic  (1)
     15INTEGER, SAVE :: nslope                                ! Number of slopes for the statistic  (1)
    1616INTEGER, SAVE :: iflat                                      ! Number of slopes for the statistic  (1)
    1717REAL,SAVE,ALLOCATABLE,DIMENSION(:) :: def_slope             ! bound of the slope statistics / repartitions (°)
     
    2020REAL,SAVE,ALLOCATABLE,DIMENSION(:,:) :: subslope_dist       ! distribution  of the slopes (1)
    2121INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: major_slope        ! Index of the subslope that occupies most of themesh (1)
    22 !$OMP THREADPRIVATE(def_slope,def_slope_mean,sky_slope,subslope_dist,iflat,major_slope)
     22!$OMP THREADPRIVATE(nslope,def_slope,def_slope_mean,sky_slope,subslope_dist,iflat,major_slope)
    2323
    2424CONTAINS
  • trunk/LMDZ.MARS/libf/phymars/comsoil_h.F90

    r2887 r2900  
    1717
    1818  ! variables (FC: built in firstcall in soil.F)
    19   REAL,SAVE,ALLOCATABLE :: tsoil(:,:)       ! sub-surface temperatures (K)
    20   real,save,allocatable :: mthermdiff(:,:)  ! (FC) mid-layer thermal diffusivity
    21   real,save,allocatable :: thermdiff(:,:)   ! (FC) inter-layer thermal diffusivity
     19  REAL,SAVE,ALLOCATABLE :: tsoil(:,:,:)       ! sub-surface temperatures (K)
     20  real,save,allocatable :: mthermdiff(:,:,:)  ! (FC) mid-layer thermal diffusivity
     21  real,save,allocatable :: thermdiff(:,:,:)   ! (FC) inter-layer thermal diffusivity
    2222  real,save,allocatable :: coefq(:)         ! (FC) q_{k+1/2} coefficients
    23   real,save,allocatable :: coefd(:,:)       ! (FC) d_k coefficients
    24   real,save,allocatable :: alph(:,:)        ! (FC) alpha_k coefficients
    25   real,save,allocatable :: beta(:,:)        ! beta_k coefficients
     23  real,save,allocatable :: coefd(:,:,:)       ! (FC) d_k coefficients
     24  real,save,allocatable :: alph(:,:,:)        ! (FC) alpha_k coefficients
     25  real,save,allocatable :: beta(:,:,:)        ! beta_k coefficients
    2626  real,save :: mu
    2727  real,save,allocatable :: flux_geo(:)       ! Geothermal Flux (W/m^2)
     
    3131contains
    3232
    33   subroutine ini_comsoil_h(ngrid)
     33  subroutine ini_comsoil_h(ngrid,nslope)
    3434 
    3535  implicit none
    3636  integer,intent(in) :: ngrid ! number of atmospheric columns
    37  
     37  integer,intent(in) :: nslope ! number of sub grid slopes
    3838    allocate(layer(nsoilmx)) !soil layer depths
    3939    allocate(mlayer(0:nsoilmx-1)) ! soil mid-layer depths
    4040    allocate(inertiedat(ngrid,nsoilmx)) ! soil thermal inertia
    4141 
    42     allocate(tsoil(ngrid,nsoilmx)) ! soil temperatures
     42    allocate(tsoil(ngrid,nsoilmx,nslope)) ! soil temperatures
    4343
    44     allocate(mthermdiff(ngrid,0:nsoilmx-1))
    45     allocate(thermdiff(ngrid,nsoilmx-1))
     44    allocate(mthermdiff(ngrid,0:nsoilmx-1,nslope))
     45    allocate(thermdiff(ngrid,nsoilmx-1,nslope))
    4646    allocate(coefq(0:nsoilmx-1))
    47     allocate(coefd(ngrid,nsoilmx-1))
    48     allocate(alph(ngrid,nsoilmx-1))
    49     allocate(beta(ngrid,nsoilmx-1))
     47    allocate(coefd(ngrid,nsoilmx-1,nslope))
     48    allocate(alph(ngrid,nsoilmx-1,nslope))
     49    allocate(beta(ngrid,nsoilmx-1,nslope))
    5050    allocate(flux_geo(ngrid))
    5151 
  • trunk/LMDZ.MARS/libf/phymars/dimradmars_mod.F90

    r2678 r2900  
    117117!!
    118118  REAL,SAVE,ALLOCATABLE :: dtrad(:,:) ! Net atm. radiative heating rate (K.s-1)
    119   REAL,SAVE,ALLOCATABLE :: fluxrad_sky(:) ! rad. flux from sky absorbed by surface (W.m-2)
    120   REAL,SAVE,ALLOCATABLE :: fluxrad(:) ! Net radiative surface flux (W.m-2)
    121   REAL,SAVE,ALLOCATABLE :: albedo(:,:) ! Surface albedo in each solar band
     119  REAL,SAVE,ALLOCATABLE :: fluxrad_sky(:,:) ! rad. flux from sky absorbed by surface (W.m-2)
     120  REAL,SAVE,ALLOCATABLE :: fluxrad(:,:) ! Net radiative surface flux (W.m-2)
     121  REAL,SAVE,ALLOCATABLE :: albedo(:,:,:) ! Surface albedo in each solar band
    122122  REAL,SAVE,ALLOCATABLE :: totcloudfrac(:) ! total cloud fraction over the column
    123123! aerosol (dust or ice) extinction optical depth  at reference wavelength
     
    181181contains
    182182
    183   subroutine ini_dimradmars_mod(ngrid,nlayer)
     183  subroutine ini_dimradmars_mod(ngrid,nlayer,nslope)
    184184 
    185185  implicit none
     
    187187  integer,intent(in) :: ngrid ! number of atmospheric columns
    188188  integer,intent(in) :: nlayer ! number of atmospheric layers
    189 
     189  integer,intent(in) :: nslope ! number of subgrid scale slopes
    190190   nflev=nlayer
    191191!  ndomainsz=ngrid
     
    195195   ndlo2=ndlon
    196196
    197    allocate(albedo(ngrid,2))
     197   allocate(albedo(ngrid,2,nslope))
    198198   allocate(dtrad(ngrid,nlayer))
    199    allocate(fluxrad_sky(ngrid))
    200    allocate(fluxrad(ngrid))
     199   allocate(fluxrad_sky(ngrid,nslope))
     200   allocate(fluxrad(ngrid,nslope))
    201201   allocate(nueffdust(ngrid,nlayer))
    202202   allocate(totcloudfrac(ngrid))
  • trunk/LMDZ.MARS/libf/phymars/phys_state_var_init_mod.F90

    r2628 r2900  
    6161      use dust_rad_adjust_mod, only: ini_dust_rad_adjust_mod, &
    6262                                     end_dust_rad_adjust_mod
     63      use comslope_mod, ONLY: nslope
     64      use netcdf
     65      USE mod_phys_lmdz_para, ONLY: is_master,bcast
     66
    6367      IMPLICIT NONE
    6468     
     
    7175      INTEGER,INTENT(in) :: dyn_nqperes
    7276      INTEGER,INTENT(in) :: dyn_nqfils(nq)
     77      character(len=10) :: filename  ! name of the startfi.nc
     78      integer :: ncid, status, nslope_dim_id
     79      integer :: nslope_read
     80
     81      filename="startfi.nc"
     82      if(is_master) then
     83        status = nf90_open(filename, nf90_nowrite, ncid)
     84        if (status /= nf90_noerr) then
     85          nslope=1
     86        else
     87          status = nf90_inq_dimid(ncid, "nslope", nslope_dim_id)
     88          if (status /= nf90_noerr) then
     89            nslope=1
     90          else
     91            status = nf90_inquire_dimension(ncid, nslope_dim_id, len = nslope_read)
     92            if (status /= nf90_noerr) then
     93              call abort_physic("phys_state_var_init","nslope present but not readable",1)
     94            else
     95              nslope=nslope_read
     96            endif
     97          endif
     98        endif
     99      endif
     100      call bcast(nslope)
    73101
    74102      ! set dimension and allocate arrays in tracer_mod
    75103      call end_tracer_mod
    76104      call ini_tracer_mod(nq,tname,dyn_nqperes,dyn_nqfils)! MVals: variables isotopes
    77 
    78105
    79106      ! initialize "print_control" constants/flags ("prt_level","lunout", etc.)
     
    101128      ! allocate "surfdat_h" arrays
    102129      call end_surfdat_h
    103       call ini_surfdat_h(ngrid,nq)
     130      call ini_surfdat_h(ngrid,nq,nslope)
    104131
    105132      ! allocate "comgeomfi_h" arrays
     
    109136      ! allocate "comsoil_h" arrays
    110137      call end_comsoil_h
    111       call ini_comsoil_h(ngrid)
     138      call ini_comsoil_h(ngrid,nslope)
    112139
    113140      ! set some variables in "dimradmars_mod"
    114141      call end_dimradmars_mod
    115       call ini_dimradmars_mod(ngrid,nlayer)
     142      call ini_dimradmars_mod(ngrid,nlayer,nslope)
    116143
    117144      ! allocate arrays in "yomlw_h"
  • trunk/LMDZ.MARS/libf/phymars/physiq_mod.F

    r2896 r2900  
    271271      real nuiceco2(ngrid,nlayer) ! Estimated effective variance of the
    272272                                  !   size distribution
    273       REAL inertiesoil(ngrid,nsoilmx) ! Time varying subsurface
     273      REAL inertiesoil(ngrid,nsoilmx,nslope) ! Time varying subsurface
    274274                                      ! thermal inertia (J.s-1/2.m-2.K-1)
    275275                                      ! (used only when tifeedback=.true.)
     
    301301      INTEGER l,ig,ierr,igout,iq,tapphys,isoil
    302302
    303       REAL fluxsurf_lw(ngrid)      !incident LW (IR) surface flux (W.m-2)
    304       REAL fluxsurf_dn_sw(ngrid,2) ! Incident SW (solar) surface flux (W.m-2)
     303      REAL fluxsurf_lw(ngrid,nslope)      !incident LW (IR) surface flux (W.m-2)
     304      REAL fluxsurf_dn_sw(ngrid,2,nslope) ! Incident SW (solar) surface flux (W.m-2)
    305305      REAL fluxsurf_up_sw(ngrid,2) ! Reflected SW (solar) surface flux (W.m-2)
    306306      REAL fluxtop_lw(ngrid)       !Outgoing LW (IR) flux to space (W.m-2)
     
    333333
    334334c     Tendancies due to various processes:
    335       REAL dqsurf(ngrid,nq)  ! tendency for tracers on surface (Kg/m2/s)
     335      REAL dqsurf(ngrid,nq,nslope)  ! tendency for tracers on surface (Kg/m2/s)
    336336      REAL zdtlw(ngrid,nlayer)     ! (K/s)
    337337      REAL zdtsw(ngrid,nlayer)     ! (K/s)
     
    340340      REAL zdtnirco2(ngrid,nlayer) ! (K/s)
    341341      REAL zdtnlte(ngrid,nlayer)   ! (K/s)
    342       REAL zdtsurf(ngrid)            ! (K/s)
     342      REAL zdtsurf(ngrid,nslope)            ! (K/s)
    343343      REAL zdtcloud(ngrid,nlayer),zdtcloudco2(ngrid,nlayer)
    344344      REAL zdvdif(ngrid,nlayer),zdudif(ngrid,nlayer)  ! (m.s-2)
    345       REAL zdhdif(ngrid,nlayer), zdtsdif(ngrid)         ! (K/s)
     345      REAL zdhdif(ngrid,nlayer), zdtsdif(ngrid,nslope)         ! (K/s)
    346346      REAL zdvadj(ngrid,nlayer),zduadj(ngrid,nlayer)  ! (m.s-2)
    347347      REAL zdhadj(ngrid,nlayer)                           ! (K/s)
    348348      REAL zdtgw(ngrid,nlayer)                            ! (K/s)
    349349      REAL zdugw(ngrid,nlayer),zdvgw(ngrid,nlayer)    ! (m.s-2)
    350       REAL zdtc(ngrid,nlayer),zdtsurfc(ngrid)
     350      REAL zdtc(ngrid,nlayer),zdtsurfc(ngrid,nslope)
    351351      REAL zdvc(ngrid,nlayer),zduc(ngrid,nlayer)
    352352
    353       REAL zdqdif(ngrid,nlayer,nq), zdqsdif(ngrid,nq)
     353      REAL zdqdif(ngrid,nlayer,nq), zdqsdif(ngrid,nq,nslope)
    354354      REAL zdqsed(ngrid,nlayer,nq), zdqssed(ngrid,nq)
    355355      REAL zdqdev(ngrid,nlayer,nq), zdqsdev(ngrid,nq)
     
    357357      REAL zdqc(ngrid,nlayer,nq)
    358358      REAL zdqcloudco2(ngrid,nlayer,nq)
    359       REAL zdqsc(ngrid,nq)
     359      REAL zdqsc(ngrid,nq,nslope)
    360360
    361361      REAL zdteuv(ngrid,nlayer)    ! (K/s)
     
    366366      real*8 PhiEscH,PhiEscH2,PhiEscD
    367367
    368       REAL dwatercap(ngrid), dwatercap_dif(ngrid)     ! (kg/m-2)
     368      REAL dwatercap(ngrid,nslope), dwatercap_dif(ngrid,nslope)     ! (kg/m-2)
    369369
    370370c     Local variable for local intermediate calcul:
    371       REAL zflubid(ngrid)
     371      REAL zflubid(ngrid,nslope)
    372372      REAL zplanck(ngrid),zpopsk(ngrid,nlayer)
    373373      REAL zdum1(ngrid,nlayer)
     
    393393
    394394      REAL fluxtop_dn_sw_tot(ngrid), fluxtop_up_sw_tot(ngrid)
    395       REAL fluxsurf_dn_sw_tot(ngrid), fluxsurf_up_sw_tot(ngrid)
     395      REAL fluxsurf_dn_sw_tot(ngrid,nslope), fluxsurf_up_sw_tot(ngrid)
    396396      character*2 str2
    397397!      character*5 str5
     
    534534
    535535c Sub-grid scale slopes
     536      real :: tsurf_meshavg(ngrid) ! Surface temperature grid box averaged [K]
     537      real :: albedo_meshavg(ngrid,2) ! albedo temperature grid box averaged [1]
     538      real :: emis_meshavg(ngrid,2) ! emis temperature grid box averaged [1]
     539      real :: qsurf_meshavg(ngrid,nq) ! surface tracer mesh averaged [kg/m^2]
     540      real :: qsurf_tmp(ngrid,nq) ! temporary qsurf for chimie
     541      real :: inertiedat_tmp(ngrid,nsoilmx,nslope) ! temporary inertiedat for soil.F
    536542      integer :: islope
     543      real :: zdqsdif_meshavg_tmp(ngrid,nq) ! temporary for dust lifting
    537544
    538545      logical :: write_restart
     
    557564
    558565#ifndef MESOSCALE
    559          fluxrad(:)=0
     566         fluxrad(:,:)=0
    560567         wstar(:)=0.
    561568#endif
     
    600607       PRINT*,'corresponding criterium = ',def_slope_mean(iflat)
    601608
     609       DO islope = 1,nslope
     610         inertiedat_tmp(:,:,islope) = inertiedat(:,:)
     611       ENDDO
     612
    602613#else
    603614! MESOSCALE. Supposedly everything is already set in modules.
     
    606617      print*,"check: rad,cpp,g,r,rcp,daysec"
    607618      print*,rad,cpp,g,r,rcp,daysec
    608       PRINT*,'check: tsurf ',tsurf(1),tsurf(ngrid)
    609       PRINT*,'check: tsoil ',tsoil(1,1),tsoil(ngrid,nsoilmx)
     619      PRINT*,'check: tsurf ',tsurf(1,:),tsurf(ngrid,:)
     620      PRINT*,'check: tsoil ',tsoil(1,1,:),tsoil(ngrid,nsoilmx,:)
    610621      PRINT*,'check: inert ',inertiedat(1,1),inertiedat(ngrid,nsoilmx)
    611622      PRINT*,'check: midlayer,layer ', mlayer(:),layer(:)
    612623      PRINT*,'check: tracernames ', noms
    613       PRINT*,'check: emis ',emis(1),emis(ngrid)
     624      PRINT*,'check: emis ',emis(1,:),emis(ngrid,:)
    614625      PRINT*,'check: q2 ',q2(1,1),q2(ngrid,nlayer+1)
    615       PRINT*,'check: qsurf ',qsurf(1,1),qsurf(ngrid,nq)
    616       PRINT*,'check: co2ice ',qsurf(1,igcm_co2),qsurf(ngrid,igcm_co2)
     626      PRINT*,'check: qsurf ',qsurf(1,1,:),qsurf(ngrid,nq,:)
     627      PRINT*,'check: co2ice ',qsurf(1,igcm_co2,:),qsurf(ngrid,igcm_co2,:)
    617628      !!!
    618629      day_ini = pday
     
    645656           endif
    646657           ! additionnal "academic" initialization of physics
    647            write(*,*) "Physiq: initializing tsurf(:) to pt(:,1) !!"
    648            tsurf(:)=pt(:,1)
     658           do islope = 1,nslope
     659             tsurf(:,islope)=pt(:,1)
     660           enddo
    649661           write(*,*) "Physiq: initializing tsoil(:) to pt(:,1) !!"
    650662           do isoil=1,nsoilmx
    651              tsoil(1:ngrid,isoil)=tsurf(1:ngrid)
     663             tsoil(1:ngrid,isoil,:)=tsurf(1:ngrid,:)
    652664           enddo
    653665           write(*,*) "Physiq: initializing inertiedat !!"
     
    683695c           Thermal inertia feedback:
    684696            IF (tifeedback) THEN
    685                 CALL soil_tifeedback(ngrid,nsoilmx,qsurf,inertiesoil)
     697             DO islope = 1,nslope
     698                CALL soil_tifeedback(ngrid,nsoilmx,
     699     s               qsurf(:,:,islope),inertiesoil(:,:,islope))
     700             ENDDO
    686701                CALL soil(ngrid,nsoilmx,firstcall,inertiesoil,
    687702     s             ptimestep,tsurf,tsoil,capcal,fluxgrd)
    688703            ELSE
    689                 CALL soil(ngrid,nsoilmx,firstcall,inertiedat,
     704                CALL soil(ngrid,nsoilmx,firstcall,inertiedat_tmp,
    690705     s             ptimestep,tsurf,tsoil,capcal,fluxgrd)
    691706            ENDIF ! of IF (tifeedback)
     
    694709     &     'PHYSIQ WARNING! Thermal conduction in the soil turned off'
    695710            DO ig=1,ngrid
    696                capcal(ig)=1.e5
    697                fluxgrd(ig)=0.
     711               capcal(ig,:)=1.e5
     712               fluxgrd(ig,:)=0.
    698713            ENDDO
    699714         ENDIF
     
    793808      pdq(:,:,:)=0
    794809      pdpsrf(:)=0
    795       zflubid(:)=0
    796       zdtsurf(:)=0
    797       dqsurf(:,:)=0
     810      zflubid(:,:)=0
     811      zdtsurf(:,:)=0
     812      dqsurf(:,:,:)=0
    798813      dsodust(:,:)=0.
    799814      dsords(:,:)=0.
    800815      dsotop(:,:)=0.
    801       dwatercap(:)=0
     816      dwatercap(:,:)=0
    802817     
    803818      ! Dust scenario conversion coefficient from IRabs to VISext
     
    899914     &        +(pdq(ig,l,igcm_co2)+pdq(ig,l,igcm_co2_ice))*ptimestep)
    900915          end do
    901           co2totA = co2totA + qsurf(ig,igcm_co2)
     916          do islope = 1,nslope
     917          co2totA = co2totA + qsurf(ig,igcm_co2,islope)*
     918     &    subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)
     919          enddo
    902920        end do
    903921      else
     
    909927     &        +pdq(ig,l,igcm_co2)*ptimestep)
    910928          end do
    911           co2totA = co2totA + qsurf(ig,igcm_co2)
     929          do islope = 1,nslope
     930          co2totA = co2totA + qsurf(ig,igcm_co2,islope)*
     931     &    subslope_dist(ig,islope)/cos(pi*def_slope_mean(islope)/180.)
     932          enddo
    912933        end do
    913934      endif ! of if (igcm_co2_ice.ne.0)
     
    10071028           ! callradite for the part with clouds
    10081029           clearsky=.false. ! part with clouds for both cases CLFvarying true/false
    1009            CALL callradite(icount,ngrid,nlayer,nq,zday,zls,pq,albedo,
    1010      &     emis,mu0,zplev,zplay,pt,tsurf,fract,dist_sol,igout,
    1011      &     zdtlw,zdtsw,fluxsurf_lw,fluxsurf_dn_sw,fluxsurf_up_sw,
     1030           CALL callradite(icount,ngrid,nlayer,nq,zday,zls,pq,
     1031     &     albedo(:,:,1),
     1032     &     emis(:,1),mu0,zplev,zplay,pt,tsurf(:,1),fract,dist_sol,igout,
     1033     &     zdtlw,zdtsw,fluxsurf_lw(:,iflat),fluxsurf_dn_sw(:,:,iflat),
     1034     &     fluxsurf_up_sw,
    10121035     &     fluxtop_lw,fluxtop_dn_sw,fluxtop_up_sw,
    10131036     &     tau_pref_scenario,tau_pref_gcm,
    10141037     &     tau,aerosol,dsodust,tauscaling,dust_rad_adjust,IRtoVIScoef,
    10151038     &     taucloudtes,rdust,rice,nuice,riceco2,nuiceco2,
    1016      &     qsurf(:,igcm_co2),rstormdust,rtopdust,totstormfract,
     1039     &     qsurf(:,igcm_co2,1),rstormdust,rtopdust,totstormfract,
    10171040     &     clearatm,dsords,dsotop,nohmons,clearsky,totcloudfrac)
     1041
     1042           DO islope=1,nslope
     1043             fluxsurf_lw(:,islope) =fluxsurf_lw(:,iflat)
     1044             fluxsurf_dn_sw(:,:,islope) =fluxsurf_dn_sw(:,:,iflat)
     1045           ENDDO
    10181046
    10191047           ! case of sub-grid water ice clouds: callradite for the clear case
     
    10251053               clearsky=.true. 
    10261054               CALL callradite(icount,ngrid,nlayer,nq,zday,zls,pq,
    1027      &              albedo,emis,mu0,zplev,zplay,pt,tsurf,fract,
     1055     &              albedo(:,:,1),emis(:,1),mu0,zplev,zplay,pt,
     1056     &              tsurf(:,1),fract,
    10281057     &              dist_sol,igout,zdtlwclf,zdtswclf,
    10291058     &              fluxsurf_lwclf,fluxsurf_dn_swclf,fluxsurf_up_swclf,
     
    10321061     &              dsodust,tauscaling,dust_rad_adjust,IRtoVIScoef,
    10331062     &              taucloudtesclf,rdust,
    1034      &              rice,nuice,riceco2, nuiceco2,qsurf(:,igcm_co2),
     1063     &              rice,nuice,riceco2, nuiceco2,qsurf(:,igcm_co2,1),
    10351064     &              rstormdust,rtopdust,totstormfract,
    10361065     &              clearatm,dsords,dsotop,
     
    10421071                  tf_clf=totcloudfrac(ig)
    10431072                  ntf_clf=1.-tf_clf
    1044                   fluxsurf_lw(ig) = ntf_clf*fluxsurf_lwclf(ig)
    1045      &                                      + tf_clf*fluxsurf_lw(ig)
    1046                   fluxsurf_dn_sw(ig,1:2) =
     1073                  DO islope=1,nslope
     1074                  fluxsurf_lw(ig,islope) = ntf_clf*fluxsurf_lwclf(ig)
     1075     &                          + tf_clf*fluxsurf_lw(ig,islope)
     1076                  fluxsurf_dn_sw(ig,1:2,islope) =
    10471077     &                           ntf_clf*fluxsurf_dn_swclf(ig,1:2)
    1048      &                          + tf_clf*fluxsurf_dn_sw(ig,1:2)
     1078     &                          + tf_clf*fluxsurf_dn_sw(ig,1:2,islope)
     1079                  ENDDO
    10491080                  fluxsurf_up_sw(ig,1:2) =
    10501081     &                           ntf_clf*fluxsurf_up_swclf(ig,1:2)
     
    10991130c          ---------------------------------------------------------
    11001131           IF(callslope) THEN
     1132           ! assume that in this case, nslope = 1
     1133            if(nslope.ne.1) then
     1134              call abort_physic(
     1135     &      "physiq","callslope=true but nslope.ne.1",1)
     1136            endif
    11011137            print *, 'Slope scheme is on and computing...'
    11021138            DO ig=1,ngrid 
    11031139              sl_the = theta_sl(ig)
    11041140              IF (sl_the .ne. 0.) THEN
    1105                 ztim1=fluxsurf_dn_sw(ig,1)+fluxsurf_dn_sw(ig,2)
     1141                ztim1=fluxsurf_dn_sw(ig,1,1)+fluxsurf_dn_sw(ig,2,1)
    11061142                DO l=1,2
    11071143                 sl_lct = ptime*24. + 180.*longitude(ig)/pi/15.
     
    11091145                 sl_lat = 180.*latitude(ig)/pi
    11101146                 sl_tau = tau(ig,1) !il faudrait iaerdust(iaer)
    1111                  sl_alb = albedo(ig,l)
     1147                 sl_alb = albedo(ig,l,1)
    11121148                 sl_psi = psi_sl(ig)
    1113                  sl_fl0 = fluxsurf_dn_sw(ig,l)
     1149                 sl_fl0 = fluxsurf_dn_sw(ig,l,1)
    11141150                 sl_di0 = 0.
    11151151                 if ((mu0(ig) .gt. 0.).and.(ztim1.gt.0.)) then
     
    11171153                  sl_di0 = sl_di0*flux_1AU/dist_sol/dist_sol
    11181154                  sl_di0 = sl_di0/ztim1
    1119                   sl_di0 = fluxsurf_dn_sw(ig,l)*sl_di0
     1155                  sl_di0 = fluxsurf_dn_sw(ig,l,1)*sl_di0
    11201156                 endif
    11211157                 ! you never know (roundup concern...)
     
    11261162     &                             sl_di0, sl_fl0, sl_flu )
    11271163                 !!!!!!!!!!!!!!!!!!!!!!!!!!
    1128                  fluxsurf_dn_sw(ig,l) = sl_flu
     1164                 fluxsurf_dn_sw(ig,l,1) = sl_flu
    11291165                ENDDO
    11301166              !!! compute correction on IR flux as well
    11311167              sky= (1.+cos(pi*theta_sl(ig)/180.))/2.
    1132               fluxsurf_lw(ig)= fluxsurf_lw(ig)*sky
     1168              fluxsurf_lw(ig,:)= fluxsurf_lw(ig,:)*sky
    11331169              ENDIF
    11341170            ENDDO
    1135            ENDIF
     1171c          ELSE        ! not calling subslope, nslope might be > 1
     1172c          DO islope = 1,nslope
     1173c            IF(def_slope_mean(islope).ge.0.) THEN
     1174c              sl_psi = 0. !Northward slope
     1175c            ELSE
     1176c             sl_psi = 180. !Southward slope
     1177c            ENDIF
     1178c            sl_the=abs(def_slope_mean(islope))         
     1179c            IF (sl_the .gt. 1e-6) THEN
     1180c              DO ig=1,ngrid 
     1181c                ztim1=fluxsurf_dn_sw(ig,1,islope)
     1182c     s                +fluxsurf_dn_sw(ig,2,islope)
     1183c                DO l=1,2
     1184c                 sl_lct = ptime*24. + 180.*longitude(ig)/pi/15.
     1185c                 sl_ra  = pi*(1.0-sl_lct/12.)
     1186c                 sl_lat = 180.*latitude(ig)/pi
     1187c                 sl_tau = tau(ig,1) !il faudrait iaerdust(iaer)
     1188c                 sl_alb = albedo(ig,l,islope)
     1189c                 sl_psi = psi_sl(ig)
     1190c                 sl_fl0 = fluxsurf_dn_sw(ig,l,islope)
     1191c                 sl_di0 = 0.
     1192c                 if (mu0(ig) .gt. 0.) then
     1193c                         sl_di0 = mu0(ig)*(exp(-sl_tau/mu0(ig)))
     1194c                  sl_di0 = sl_di0*flux_1AU/dist_sol/dist_sol
     1195c                  sl_di0 = sl_di0/ztim1
     1196c                  sl_di0 = fluxsurf_dn_sw(ig,l,islope)*sl_di0
     1197c                 endif
     1198c                 ! you never know (roundup concern...)
     1199c                 if (sl_fl0 .lt. sl_di0) sl_di0=sl_fl0
     1200c                 !!!!!!!!!!!!!!!!!!!!!!!!!!
     1201c                 CALL param_slope( mu0(ig), declin, sl_ra, sl_lat,
     1202c     &                             sl_tau, sl_alb, sl_the, sl_psi,
     1203c     &                             sl_di0, sl_fl0, sl_flu )
     1204c                 !!!!!!!!!!!!!!!!!!!!!!!!!!
     1205c                 fluxsurf_dn_sw(ig,l,islope) = sl_flu
     1206c                ENDDO
     1207c              !!! compute correction on IR flux as well
     1208c
     1209c              fluxsurf_lw(ig,islope)= fluxsurf_lw(ig,islope)
     1210c     &                                *sky_slope(islope)
     1211c              ENDDO
     1212c            ENDIF
     1213c          ENDDO ! islope = 1,nslope
     1214          ENDIF ! callslope
    11361215
    11371216c          CO2 near infrared absorption
     
    11461225c          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    11471226           DO ig=1,ngrid
    1148                fluxrad_sky(ig)=emis(ig)*fluxsurf_lw(ig)
    1149      $         +fluxsurf_dn_sw(ig,1)*(1.-albedo(ig,1))
    1150      $         +fluxsurf_dn_sw(ig,2)*(1.-albedo(ig,2))
     1227             DO islope = 1,nslope
     1228               fluxrad_sky(ig,islope) =
     1229     $           emis(ig,islope)*fluxsurf_lw(ig,islope)
     1230     $         +fluxsurf_dn_sw(ig,1,islope)*(1.-albedo(ig,1,islope))         
     1231     $         +fluxsurf_dn_sw(ig,2,islope)*(1.-albedo(ig,2,islope))
     1232             ENDDO
    11511233           ENDDO
    11521234
     
    11751257c
    11761258           DO ig=1,ngrid
    1177                zplanck(ig)=tsurf(ig)*tsurf(ig)
    1178                zplanck(ig)=emis(ig)*
     1259             DO islope = 1,nslope
     1260               zplanck(ig)=tsurf(ig,islope)*tsurf(ig,islope)
     1261               zplanck(ig)=emis(ig,islope)*
    11791262     $         stephan*zplanck(ig)*zplanck(ig)
    1180                fluxrad(ig)=fluxrad_sky(ig)-zplanck(ig)
     1263               fluxrad(ig,islope)=fluxrad_sky(ig,islope)-zplanck(ig)
    11811264               IF(callslope) THEN
    11821265                 sky= (1.+cos(pi*theta_sl(ig)/180.))/2.
    1183                  fluxrad(ig)=fluxrad(ig)+(1.-sky)*zplanck(ig)
     1266                 fluxrad(ig,nslope)=fluxrad(ig,nslope)+
     1267     $                             (1.-sky)*zplanck(ig)
     1268               ELSE
     1269                 fluxrad(ig,islope)=fluxrad(ig,islope) +
     1270     $              (1.-sky_slope(iflat))*emis(ig,iflat)*
     1271     $              stephan*tsurf(ig,iflat)**4 
    11841272               ENDIF
    11851273           ENDDO
     1274         ENDDO
    11861275
    11871276         DO l=1,nlayer
     
    12241313c               for radiative transfer
    12251314     &                      clearatm,icount,zday,zls,
    1226      &                      tsurf,qsurf(:,igcm_co2),igout,
     1315     &                      tsurf,qsurf(:,igcm_co2,iflat),igout,
    12271316     &                      totstormfract,tauscaling,
    12281317     &                      dust_rad_adjust,IRtoVIScoef,
     
    12871376     &                pq,pdq,pt,pdt,zplev,zplay,zzlev,
    12881377     &                zzlay,zdtsw,zdtlw,
    1289      &                icount,zday,zls,tsurf,qsurf(:,igcm_co2),
     1378     &                icount,zday,zls,tsurf(:,iflat),
     1379     &                qsurf(:,igcm_co2,iflat),
    12901380     &                igout,aerosol,tauscaling,dust_rad_adjust,
    12911381     &                IRtoVIScoef,totstormfract,clearatm,
     
    13491439      IF (calldifv) THEN
    13501440         DO ig=1,ngrid
    1351             zflubid(ig)=fluxrad(ig)+fluxgrd(ig)
     1441           DO islope = 1,nslope
     1442            zflubid(ig,islope)=fluxrad(ig,islope)
     1443     &                        +fluxgrd(ig,islope)
     1444           ENDDO
    13521445         ENDDO
    1353 
    13541446         zdum1(:,:)=0
    13551447         zdum2(:,:)=0
     
    13711463
    13721464          DO ig=1, ngrid
    1373              IF (zh(ig,1) .lt. tsurf(ig)) THEN
     1465             IF (zh(ig,1) .lt. tsurf(ig,1)) THEN
    13741466               wstar(ig)=1.
    13751467               hfmax_th(ig)=0.2
     
    13901482
    13911483c        Calling vdif (Martian version WITH CO2 condensation)
    1392          dwatercap_dif(:) = 0.
     1484         dwatercap_dif(:,:) = 0.
    13931485         zcdh(:) = 0.
    13941486         zcdv(:) = 0.
     
    14051497
    14061498          DO ig=1,ngrid
    1407              zdtsurf(ig)=zdtsurf(ig)+zdtsdif(ig)
    1408              dwatercap(ig)=dwatercap(ig)+dwatercap_dif(ig)
     1499             zdtsurf(ig,:)=zdtsurf(ig,:)+zdtsdif(ig,:)
     1500             dwatercap(ig,:)=dwatercap(ig,:)+dwatercap_dif(ig,:)
    14091501          ENDDO
    1410 
     1502c          call compute_meshgridavg(ngrid,nq,albedo,emis,tsurf,zdqsdif,
     1503c     &   albedo_meshavg,emis_meshavg,tsurf_meshavg,zdqsdif_meshavg_tmp)
    14111504         IF (.not.turb_resolved) THEN
    14121505          DO l=1,nlayer
     
    14291522           DO iq=1, nq
    14301523              DO ig=1,ngrid
    1431                  dqsurf(ig,iq)=dqsurf(ig,iq) + zdqsdif(ig,iq)
     1524                 dqsurf(ig,iq,:)=dqsurf(ig,iq,:) + zdqsdif(ig,iq,:)
    14321525              ENDDO
    14331526           ENDDO
     
    14461539             zdqdif(1:ngrid,1,1:nq)=0.
    14471540             zdqdif(1:ngrid,1,igcm_dust_number) =
    1448      .                  -zdqsdif(1:ngrid,igcm_dust_number)
     1541     .                  -zdqsdif(1:ngrid,igcm_dust_number,iflat)
    14491542             zdqdif(1:ngrid,1,igcm_dust_mass) =
    1450      .                  -zdqsdif(1:ngrid,igcm_dust_mass)
     1543     .                  -zdqsdif(1:ngrid,igcm_dust_mass,iflat)
    14511544             zdqdif(1:ngrid,2:nlayer,1:nq) = 0.
    14521545             DO iq=1, nq
    14531546               IF ((iq .ne. igcm_dust_mass)
    14541547     &          .and. (iq .ne. igcm_dust_number)) THEN
    1455                  zdqsdif(:,iq)=0.
     1548                 zdqsdif(:,iq,:)=0.
    14561549               ENDIF
    14571550             ENDDO
    14581551           ELSE
    14591552             zdqdif(1:ngrid,1:nlayer,1:nq) = 0.
    1460              zdqsdif(1:ngrid,1:nq) = 0.
     1553             zdqsdif(1:ngrid,1:nq,1:nslope) = 0.
    14611554           ENDIF
    14621555         ENDIF
    14631556      ELSE   
    14641557         DO ig=1,ngrid
    1465             zdtsurf(ig)=zdtsurf(ig)+
    1466      s        (fluxrad(ig)+fluxgrd(ig))/capcal(ig)
     1558           DO islope=1,nslope
     1559             zdtsurf(ig,islope)=zdtsurf(ig,islope)+
     1560     s   (fluxrad(ig,islope)+fluxgrd(ig,islope))/capcal(ig,islope)
     1561           ENDDO
    14671562         ENDDO
    14681563         IF (turb_resolved) THEN
     
    17071802          DO iq=1, nq
    17081803            DO ig=1,ngrid
    1709               dqsurf(ig,iq)=dqsurf(ig,iq)+zdqssed_ccn(ig,iq)
     1804             DO islope = 1,nslope
     1805              dqsurf(ig,iq,islope)=dqsurf(ig,iq,islope)+
     1806     &         zdqssed_ccn(ig,iq)*cos(pi*def_slope_mean(islope)/180.)
     1807             ENDDO !(islope)
    17101808            ENDDO  ! (ig)
    1711            ENDDO    ! (iq)
     1809           ENDDO    ! (iq)q)
    17121810c Temperature variation due to latent heat release
    17131811               pdt(1:ngrid,1:nlayer) =
     
    18841982              do iq=1,nq
    18851983                 DO ig=1,ngrid
    1886                     dqsurf(ig,iq)= dqsurf(ig,iq) + zdqsdev(ig,iq)
     1984                   DO islope = 1,nslope
     1985                    dqsurf(ig,iq,islope)= dqsurf(ig,iq,islope) +
     1986     &          zdqsdev(ig,iq)*cos(pi*def_slope_mean(islope)/180.)
     1987                   ENDDO
    18871988                 ENDDO
    18881989              enddo
     
    19332034           DO iq=1, nq
    19342035             DO ig=1,ngrid
    1935                 dqsurf(ig,iq)= dqsurf(ig,iq) + zdqssed(ig,iq)
     2036               DO islope = 1,nslope
     2037                    dqsurf(ig,iq,islope)= dqsurf(ig,iq,islope) +
     2038     &          zdqssed(ig,iq)*cos(pi*def_slope_mean(islope)/180.)
     2039               ENDDO
    19362040             ENDDO
    19372041           ENDDO
     
    19502054           DO iq=1, nq
    19512055              DO ig=1,ngrid
    1952                  dqsurf(ig,iq)=dqsurf(ig,iq) + zdqsdif(ig,iq)
     2056                 dqsurf(ig,iq,:)=dqsurf(ig,iq,:) + zdqsdif(ig,iq,:)
    19532057              ENDDO
    19542058           ENDDO
     
    19742078     $                       surfdust, surfice)
    19752079!           call photochemistry
     2080            DO ig = 1,ngrid
     2081              qsurf_tmp(ig,:) = qsurf(ig,:,major_slope(ig))
     2082            ENDDO
    19762083            call calchim(ngrid,nlayer,nq,
    19772084     &                   ptimestep,zplay,zplev,pt,pdt,dist_sol,mu0,
    19782085     $                   zzlev,zzlay,zday,pq,pdq,zdqchim,zdqschim,
    1979      $                   zdqcloud,zdqscloud,tau(:,1),qsurf(:,igcm_co2),
     2086     $                   zdqcloud,zdqscloud,tau(:,1),
     2087     $                   qsurf_tmp(:,igcm_co2),
    19802088     $                   pu,pdu,pv,pdv,surfdust,surfice)
    19812089
     
    20062114                      ! tracers is zero anyways
    20072115             DO ig=1,ngrid
    2008                dqsurf(ig,iq)=dqsurf(ig,iq)+zdqschim(ig,iq)
     2116              DO islope = 1,nslope
     2117               dqsurf(ig,iq,islope)=dqsurf(ig,iq,islope) +
     2118     &           zdqschim(ig,iq)*cos(pi*def_slope_mean(islope)/180.)
     2119              ENDDO
    20092120             ENDDO
    20102121           ENDDO ! of DO iq=1,nq
     
    20132124           if (igcm_h2o2.ne.0) then
    20142125             DO ig=1,ngrid
    2015                dqsurf(ig,igcm_h2o2)=dqsurf(ig,igcm_h2o2)
    2016      &                                +zdqscloud(ig,igcm_h2o2)
     2126              DO islope = 1,nslope
     2127              dqsurf(ig,igcm_h2o2,islope)=dqsurf(ig,igcm_h2o2,islope)+
     2128     &      zdqscloud(ig,igcm_h2o2)*cos(pi*def_slope_mean(islope)/180.)
     2129              ENDDO
    20172130             ENDDO
    20182131           endif
     
    20292142      if (callthermos) then
    20302143        call thermosphere(ngrid,nlayer,nq,zplev,zplay,dist_sol,
    2031      $     mu0,ptimestep,ptime,zday,tsurf,zzlev,zzlay,
     2144     $     mu0,ptimestep,ptime,zday,tsurf(:,iflat),zzlev,zzlay,
    20322145     &     pt,pq,pu,pv,pdt,pdq,
    20332146     $     zdteuv,zdtconduc,zdumolvis,zdvmolvis,zdqmoldiff,
     
    20562169         CALL geticecover(ngrid, 180.*zls/pi,
    20572170     .                  180.*longitude/pi, 180.*latitude/pi,
    2058      .                  qsurf(:,igcm_co2) )
    2059          qsurf(:,igcm_co2) = qsurf(:,igcm_co2) * 10000.
     2171     .                  qsurf_tmp(:,igcm_co2) )
     2172         qsurf_tmp(:,igcm_co2) = qsurf_tmp(:,igcm_co2) * 10000.
    20602173      ENDIF
    20612174     
     
    20632176      IF (callcond) THEN
    20642177         zdtc(:,:) = 0.
    2065          zdtsurfc(:) = 0.
     2178         zdtsurfc(:,:) = 0.
    20662179         zduc(:,:) = 0.
    20672180         zdvc(:,:) = 0.
    20682181         zdqc(:,:,:) = 0.
    2069          zdqsc(:,:) = 0.
     2182         zdqsc(:,:,:) = 0.
    20702183         CALL co2condens(ngrid,nlayer,nq,ptimestep,
    20712184     $              capcal,zplay,zplev,tsurf,pt,
    20722185     $              pphi,pdt,pdu,pdv,zdtsurf,pu,pv,pq,pdq,
    2073      $              qsurf(:,igcm_co2),albedo,emis,rdust,
     2186     $              qsurf(:,igcm_co2,:),albedo,emis,rdust,
    20742187     $              zdtc,zdtsurfc,pdpsrf,zduc,zdvc,zdqc,
    20752188     $              fluxsurf_dn_sw,zls,
     
    20792192         DO iq=1, nq
    20802193           DO ig=1,ngrid
    2081               dqsurf(ig,iq)=dqsurf(ig,iq)+zdqsc(ig,iq)
     2194              dqsurf(ig,iq,:)=dqsurf(ig,iq,:)+zdqsc(ig,iq,:)
    20822195           ENDDO  ! (ig)
    20832196         ENDDO    ! (iq)
     
    20902203         ENDDO
    20912204         DO ig=1,ngrid
    2092            zdtsurf(ig) = zdtsurf(ig) + zdtsurfc(ig)
     2205           zdtsurf(ig,:) = zdtsurf(ig,:) + zdtsurfc(ig,:)
    20932206         ENDDO
    20942207
     
    21302243        DO iq=1, nq
    21312244          DO ig=1,ngrid
    2132 
    2133             qsurf(ig,iq)=qsurf(ig,iq)+ptimestep*dqsurf(ig,iq)
    2134 
     2245           DO islope = 1,nslope
     2246            qsurf(ig,iq,islope)=qsurf(ig,iq,islope)+
     2247     &                ptimestep*dqsurf(ig,iq,islope)
     2248           ENDDO
    21352249          ENDDO  ! (ig)
    21362250        ENDDO    ! (iq)
     
    21442258
    21452259      DO ig=1,ngrid
    2146          tsurf(ig)=tsurf(ig)+ptimestep*zdtsurf(ig)
     2260        DO islope = 1,nslope
     2261            tsurf(ig,islope)=tsurf(ig,islope)+
     2262     &            ptimestep*zdtsurf(ig,islope)
     2263       ENDDO
    21472264      ENDDO
    21482265
     
    21692286c       -------------------------------------------------------------
    21702287         do ig=1,ngrid
    2171            if ((qsurf(ig,igcm_co2).eq.0).and.
    2172      &        (qsurf(ig,igcm_h2o_ice).gt.frost_albedo_threshold)) then
     2288          do islope = 1,nslope
     2289           if ((qsurf(ig,igcm_co2,islope).eq.0).and.
     2290     &        (qsurf(ig,igcm_h2o_ice,islope)
     2291     &       .gt.frost_albedo_threshold)) then
    21732292             if ((watercaptag(ig)).and.(cst_cap_albedo)) then
    2174                albedo(ig,1) = albedo_h2o_cap
    2175                albedo(ig,2) = albedo_h2o_cap
     2293               albedo(ig,1,islope) = albedo_h2o_cap
     2294               albedo(ig,2,islope) = albedo_h2o_cap
    21762295             else
    2177                albedo(ig,1) = albedo_h2o_frost
    2178                albedo(ig,2) = albedo_h2o_frost
     2296               albedo(ig,1,islope) = albedo_h2o_frost
     2297               albedo(ig,2,islope) = albedo_h2o_frost
    21792298             endif !((watercaptag(ig)).and.(cst_cap_albedo)) then
    21802299c              write(*,*) "frost thickness", qsurf(ig,igcm_h2o_ice)
     
    21822301c     &        ,latitude(ig)*180./pi, longitude(ig)*180./pi
    21832302           endif
     2303          enddo ! islope
    21842304         enddo  ! of do ig=1,ngrid
    21852305      ENDIF  ! of IF (water)
     
    21912311c       Thermal inertia feedback
    21922312        IF (tifeedback) THEN
    2193          CALL soil_tifeedback(ngrid,nsoilmx,qsurf,inertiesoil)
     2313         DO islope = 1,nslope
     2314           CALL soil_tifeedback(ngrid,nsoilmx,
     2315     s               qsurf(:,:,islope),inertiesoil(:,:,islope))
     2316         ENDDO
    21942317         CALL soil(ngrid,nsoilmx,.false.,inertiesoil,
    21952318     s          ptimestep,tsurf,tsoil,capcal,fluxgrd)
    21962319        ELSE
    2197          CALL soil(ngrid,nsoilmx,.false.,inertiedat,
     2320         CALL soil(ngrid,nsoilmx,.false.,inertiedat_tmp,
    21982321     s          ptimestep,tsurf,tsoil,capcal,fluxgrd)
    21992322        ENDIF
     
    22422365
    22432366      DO ig=1,ngrid
    2244          watercap(ig)=watercap(ig)+ptimestep*dwatercap(ig)
     2367        DO islope = 1,nslope
     2368         watercap(ig,islope)=watercap(ig,islope)+
     2369     s   ptimestep*dwatercap(ig,islope)
     2370        ENDDO
    22452371      ENDDO
    22462372
     
    22482374
    22492375        DO ig=1,ngrid
    2250            if (watercaptag(ig).and.
    2251      &        (qsurf(ig,igcm_h2o_ice).gt.frost_metam_threshold)) then
    2252 
    2253                 watercap(ig)=watercap(ig)+qsurf(ig,igcm_h2o_ice)
    2254      &                  - frost_metam_threshold
    2255                 qsurf(ig,igcm_h2o_ice) = frost_metam_threshold
     2376         DO islope = 1,nslope
     2377           if (watercaptag(ig).and. (qsurf(ig,igcm_h2o_ice,islope)
     2378     &        .gt.frost_metam_threshold)) then
     2379
     2380                watercap(ig,islope)=watercap(ig,islope)
     2381     &          +qsurf(ig,igcm_h2o_ice,islope)
     2382     &         - frost_metam_threshold
     2383                qsurf(ig,igcm_h2o_ice,islope) = frost_metam_threshold
    22562384           endif ! (watercaptag(ig).and.
     2385          ENDDO
    22572386        ENDDO
    22582387
     
    22632392c  13. Write output files
    22642393c  ----------------------
     2394
     2395      call compute_meshgridavg(ngrid,nq,albedo,emis,tsurf,qsurf,
     2396     &       albedo_meshavg,emis_meshavg,tsurf_meshavg,qsurf_meshavg)
    22652397
    22662398c    -------------------------------
     
    23122444      fluxtop_up_sw_tot(1:ngrid)=fluxtop_up_sw(1:ngrid,1) +
    23132445     &                           fluxtop_up_sw(1:ngrid,2)
    2314       fluxsurf_dn_sw_tot(1:ngrid)=fluxsurf_dn_sw(1:ngrid,1) +
    2315      &                            fluxsurf_dn_sw(1:ngrid,2)
     2446      fluxsurf_dn_sw_tot(1:ngrid,1:nslope)=
     2447     &                           fluxsurf_dn_sw(1:ngrid,1,1:nslope) +
     2448     &                           fluxsurf_dn_sw(1:ngrid,2,1:nslope)
    23162449      fluxsurf_up_sw_tot(1:ngrid)=fluxsurf_up_sw(1:ngrid,1) +
    23172450     &                            fluxsurf_up_sw(1:ngrid,2)
     
    23442477         WRITE(*,'(a6,a10,2a15)') 'Ts','dTs','ps','dps'
    23452478         WRITE(*,'(2f10.5,2f15.5)')
    2346      s   tsurf(igout),zdtsurf(igout)*ptimestep,
     2479     s   tsurf(igout,:),zdtsurf(igout,:)*ptimestep,
    23472480     s   zplev(igout,1),pdpsrf(igout)*ptimestep
    23482481         WRITE(*,'(a4,a6,5a10)') 'l','u','du','v','dv','T','dT'
     
    23742507
    23752508           call pbl_parameters(ngrid,nlayer,ps,zplay,z0,
    2376      & g,zzlay,zzlev,zu,zv,wstar,hfmax_th,zmax_th,tsurf,zh,z_out,n_out,
    2377      & T_out,u_out,ustar,tstar,L_mo,vhf,vvv)
     2509     & g,zzlay,zzlev,zu,zv,wstar,hfmax_th,zmax_th,tsurf(:,iflat),
     2510     & zh,z_out,n_out,T_out,u_out,ustar,tstar,L_mo,vhf,vvv)
    23782511                   ! pourquoi ustar recalcule ici? fait dans vdifc.
    23792512
     
    24722605          call physdem1("restartfi.nc",nsoilmx,ngrid,nlayer,nq,
    24732606     .                ptimestep,ztime_fin,
    2474      .                tsurf,tsoil,albedo,emis,
    2475      .                q2,qsurf,tauscaling,totcloudfrac,wstar,
    2476      .                watercap)
     2607     .                tsurf(:,iflat),tsoil(:,:,iflat),albedo(:,:,iflat),
     2608     .                emis(:,iflat),
     2609     .                q2,qsurf(:,:,iflat),tauscaling,totcloudfrac,wstar,
     2610     .                watercap(:,iflat))
    24772611         
    24782612         ENDIF ! of IF (write_restart)
     
    26772811         
    26782812        call wstats(ngrid,"ps","Surface pressure","Pa",2,ps)
    2679         call wstats(ngrid,"tsurf","Surface temperature","K",2,tsurf)
     2813        call wstats(ngrid,"tsurf","Surface temperature","K",2
     2814     &      ,tsurf(:,iflat))
    26802815        call wstats(ngrid,"co2ice","CO2 ice cover",
    2681      &                "kg.m-2",2,qsurf(:,igcm_co2))
     2816     &                "kg.m-2",2,qsurf(:,igcm_co2,iflat))
    26822817        call wstats(ngrid,"watercap","H2O ice cover",
    2683      &                "kg.m-2",2,watercap)
     2818     &                "kg.m-2",2,watercap(:,iflat))
    26842819        call wstats(ngrid,"tau_pref_scenario",
    26852820     &              "prescribed visible dod at 610 Pa","NU",
     
    26902825        call wstats(ngrid,"fluxsurf_lw",
    26912826     &                "Thermal IR radiative flux to surface","W.m-2",2,
    2692      &                fluxsurf_lw)
     2827     &                fluxsurf_lw(:,iflat))
    26932828        call wstats(ngrid,"fluxsurf_dn_sw",
    26942829     &        "Incoming Solar radiative flux to surface","W.m-2",2,
    2695      &                fluxsurf_dn_sw_tot)
     2830     &                fluxsurf_dn_sw_tot(:,iflat))
    26962831        call wstats(ngrid,"fluxsurf_up_sw",
    26972832     &        "Reflected Solar radiative flux from surface","W.m-2",2,
     
    27182853     &                "m2.s-2",3,q2)
    27192854          call wstats(ngrid,"emis","Surface emissivity","w.m-1",2,
    2720      &                emis)
     2855     &                emis(:,iflat))
    27212856c          call wstats(ngrid,"ssurf","Surface stress","N.m-2",
    27222857c    &                2,zstress)
     
    27642899               call wstats(ngrid,"h2o_ice_s",
    27652900     &                    "surface h2o_ice","kg/m2",
    2766      &                    2,qsurf(1,igcm_h2o_ice))
     2901     &                    2,qsurf(1,igcm_h2o_ice,iflat))
    27672902               call wstats(ngrid,'albedo',
    27682903     &                         'albedo',
    2769      &                         '',2,albedo(1,1))
     2904     &                         '',2,albedo(1,1,iflat))
    27702905               call wstats(ngrid,"mtot",
    27712906     &                    "total mass of water vapor","kg/m2",
     
    28522987     &                         'kg/kg',3,zq(1,1,iq))
    28532988                 call wstats(ngrid,'qsurf'//str2,'qsurf',
    2854      &                         'kg.m-2',2,qsurf(1,iq))
     2989     &                         'kg.m-2',2,qsurf(1,iq,iflat))
    28552990               end do
    28562991             endif ! (doubleq)
     
    30193154c        for any variables !!
    30203155         call WRITEDIAGFI(ngrid,"emis","Surface emissivity","w.m-1",2,
    3021      &                  emis)
     3156     &                  emis(:,iflat))
    30223157c        call WRITEDIAGFI(ngrid,"pplay","Pressure","Pa",3,zplay)
    30233158c        call WRITEDIAGFI(ngrid,"pplev","Pressure","Pa",3,zplev)
     
    30293164     &                    "m2s-2",2,phisfi)
    30303165         call WRITEDIAGFI(ngrid,"tsurf","Surface temperature","K",2,
    3031      &                  tsurf)
     3166     &                  tsurf(:,iflat))
    30323167         call WRITEDIAGFI(ngrid,"ps","surface pressure","Pa",2,ps)
    30333168         call WRITEDIAGFI(ngrid,"co2ice","co2 ice thickness"
    3034      &                              ,"kg.m-2",2,qsurf(:,igcm_co2))
     3169     &                              ,"kg.m-2",2,qsurf(:,igcm_co2,iflat))
    30353170         call WRITEDIAGFI(ngrid,"watercap","Water ice thickness"
    3036      &                                         ,"kg.m-2",2,watercap)
     3171     &         ,"kg.m-2",2,watercap(:,iflat))
    30373172
    30383173         call WRITEDIAGFI(ngrid,"temp_layer1","temperature in layer 1",
     
    30413176     &                  "K",2,zt(1,7))
    30423177         call WRITEDIAGFI(ngrid,"fluxsurf_lw","fluxsurf_lw","W.m-2",2,
    3043      &                  fluxsurf_lw)
     3178     &                  fluxsurf_lw(:,iflat))
    30443179         call WRITEDIAGFI(ngrid,"fluxsurf_dn_sw","fluxsurf_dn_sw",
    3045      &                  "W.m-2",2,fluxsurf_dn_sw_tot)
     3180     &                  "W.m-2",2,fluxsurf_dn_sw_tot(:,iflat))
    30463181         call WRITEDIAGFI(ngrid,"fluxtop_lw","fluxtop_lw","W.m-2",2,
    30473182     &                  fluxtop_lw)
     
    30793214      !!! this is to ensure correct initialisation of mesoscale model
    30803215      call WRITEDIAGFI(ngrid,"tsurf","Surface temperature","K",2,
    3081      &                 tsurf)
     3216     &                 tsurf(:,iflat))
    30823217      call WRITEDIAGFI(ngrid,"ps","surface pressure","Pa",2,ps)
    30833218      call WRITEDIAGFI(ngrid,"co2ice","co2 ice thickness","kg.m-2",2,
    3084      &                 qsurf(:,igcm_co2))
     3219     &                 qsurf(:,igcm_co2,iflat))
    30853220      call WRITEDIAGFI(ngrid,"temp","temperature","K",3,zt)
    30863221      call WRITEDIAGFI(ngrid,"u","Zonal wind","m.s-1",3,zu)
     
    30893224     &                 emis)
    30903225      call WRITEDIAGFI(ngrid,"tsoil","Soil temperature",
    3091      &                 "K",3,tsoil)
     3226     &                 "K",3,tsoil(:,:,iflat))
    30923227      call WRITEDIAGFI(ngrid,"inertiedat","Soil inertia",
    30933228     &                 "K",3,inertiedat)
     
    31703305          call WRITEDIAGFI(ngrid,'qsurf02','surface tracer',
    31713306     &                     'kg.m-2',2,
    3172      &                     qsurf(1:ngrid,igcm_h2o_ice))
     3307     &                     qsurf(1:ngrid,igcm_h2o_ice,iflat))
    31733308#endif
    31743309          call WRITEDIAGFI(ngrid,'mtot',
     
    32653400            call WRITEDIAGFI(ngrid,'h2o_ice_s',
    32663401     &                       'surface h2o_ice',
    3267      &                       'kg.m-2',2,qsurf(1,igcm_h2o_ice))
     3402     &                       'kg.m-2',2,qsurf(1,igcm_h2o_ice,iflat))
    32683403            if (hdo) then
    32693404            call WRITEDIAGFI(ngrid,'hdo_ice_s',
    32703405     &                       'surface hdo_ice',
    3271      &                       'kg.m-2',2,qsurf(1,igcm_hdo_ice))
     3406     &                       'kg.m-2',2,qsurf(1,igcm_hdo_ice,iflat))
    32723407
    32733408                do ig=1,ngrid
    3274                 if (qsurf(ig,igcm_h2o_ice).gt.qperemin) then
    3275                     DoH_surf(ig) = 0.5*( qsurf(ig,igcm_hdo_ice)/
    3276      &                  qsurf(ig,igcm_h2o_ice) )/155.76e-6
     3409                if (qsurf_meshavg(ig,igcm_h2o_ice).gt.qperemin) then
     3410           DoH_surf(ig) = 0.5*( qsurf_meshavg(ig,igcm_hdo_ice)/
     3411     &          qsurf_meshavg(ig,igcm_h2o_ice) )/155.76e-6
    32773412                else
    32783413                    DoH_surf(ig) = 0.
     
    32873422            CALL WRITEDIAGFI(ngrid,'albedo',
    32883423     &                         'albedo',
    3289      &                         '',2,albedo(1,1))
     3424     &                         '',2,albedo(1,1,iflat))
    32903425              if (tifeedback) then
    32913426                 call WRITEDIAGSOIL(ngrid,"soiltemp",
     
    32943429                 call WRITEDIAGSOIL(ngrid,'soilti',
    32953430     &                       'Soil Thermal Inertia',
    3296      &                       'J.s-1/2.m-2.K-1',3,inertiesoil)
     3431     &                       'J.s-1/2.m-2.K-1',3,inertiesoil(:,:,iflat))
    32973432              endif
    32983433!A. Pottier
     
    33923527     &                         'kg/kg',3,zq(1,1,iq))
    33933528               call WRITEDIAGFI(ngrid,'qsurf'//str2,'qsurf',
    3394      &                         'kg.m-2',2,qsurf(1,iq))
     3529     &                         'kg.m-2',2,qsurf(1,iq,iflat))
    33953530             end do
    33963531           endif ! (doubleq)
     
    34193554             call WRITEDIAGFI(ngrid,'qsurf',
    34203555     &                 'stormdust injection',
    3421      &                 'kg.m-2',2,qsurf(:,igcm_stormdust_mass))
     3556     &                 'kg.m-2',2,qsurf(:,igcm_stormdust_mass,iflat))
    34223557             call WRITEDIAGFI(ngrid,'pdqsurf',
    34233558     &                  'tendancy stormdust mass at surface',
    3424      &                  'kg.m-2',2,dqsurf(:,igcm_stormdust_mass))
     3559     &                  'kg.m-2',2,dqsurf(:,igcm_stormdust_mass,iflat))
    34253560             call WRITEDIAGFI(ngrid,'wspeed','vertical speed stormdust',
    34263561     &                        'm/s',3,wspeed(:,1:nlayer))
     
    34843619     &                        'part/kg',3,nccn)
    34853620             call WRITEDIAGFI(ngrid,'surfccnq','Surf nuclei mass mr',
    3486      &                        'kg.m-2',2,qsurf(1,igcm_ccn_mass))
     3621     &                        'kg.m-2',2,qsurf(1,igcm_ccn_mass,iflat))
    34873622             call WRITEDIAGFI(ngrid,'surfccnN','Surf nuclei number',
    3488      &                        'kg.m-2',2,qsurf(1,igcm_ccn_number))
     3623     &                        'kg.m-2',2,qsurf(1,igcm_ccn_number,iflat))
    34893624           endif ! (scavenging)
    34903625
     
    36363771         ! Write soil temperature
    36373772        call writediagsoil(ngrid,"soiltemp","Soil temperature","K",
    3638      &                     3,tsoil)
     3773     &                     3,tsoil(:,:,iflat))
    36393774         ! Write surface temperature
    36403775!        call writediagsoil(ngrid,"tsurf","Surface temperature","K",
     
    36663801c        CALL writeg1d(ngrid,nlayer,pw,'w','m.s-1')
    36673802        call writediagsoil(ngrid,"soiltemp","Soil temperature","K",
    3668      &                     3,tsoil)
     3803     &                     3,tsoil(:,:,iflat))
    36693804
    36703805! THERMALS STUFF 1D
     
    36903825         call WRITEDIAGFI(ngrid,"q2","q2","kg.m-3",1,q2)
    36913826         call WRITEDIAGFI(ngrid,"tsurf","Surface temperature","K",0,
    3692      &                  tsurf)
     3827     &                  tsurf(:,iflat))
    36933828         call WRITEDIAGFI(ngrid,"u","u wind","m/s",1,zu)
    36943829         call WRITEDIAGFI(ngrid,"v","v wind","m/s",1,zv)
     
    37043839     &                   'w.m-2',1,zdtlw)
    37053840         call WRITEDIAGFI(ngrid,"co2ice","co2 ice thickness"
    3706      &                                   ,"kg.m-2",0,qsurf(:,igcm_co2))
     3841     &       ,"kg.m-2",0,qsurf(:,igcm_co2,iflat))
    37073842
    37083843         if (igcm_co2.ne.0) then
     
    37423877     &                        ,1,aerosol(:,:,iaer_stormdust_doubleq))
    37433878             call WRITEDIAGFI(ngrid,'dqsdifdustq','diffusion',
    3744      &                       'kg.m-2.s-1',0,zdqsdif(1,igcm_dust_mass))
     3879     &          'kg.m-2.s-1',0,zdqsdif(1,igcm_dust_mass,iflat))
    37453880             call WRITEDIAGFI(ngrid,'dqsdifrdsq','diffusion',
    3746      &                  'kg.m-2.s-1',0,zdqsdif(1,igcm_stormdust_mass))
     3881     &          'kg.m-2.s-1',0,zdqsdif(1,igcm_stormdust_mass,iflat))
    37473882             call WRITEDIAGFI(ngrid,'mstormdtot',
    37483883     &                        'total mass of stormdust only',
     
    37673902             call WRITEDIAGFI(ngrid,'rdsqsurf',
    37683903     &                 'stormdust at surface',
    3769      &                 'kg.m-2',0,qsurf(:,igcm_stormdust_mass))
     3904     &                 'kg.m-2',0,qsurf(:,igcm_stormdust_mass,iflat))
    37703905             call WRITEDIAGFI(ngrid,'qsurf',
    37713906     &                  'dust mass at surface',
    3772      &                  'kg.m-2',0,qsurf(:,igcm_dust_mass))
     3907     &                  'kg.m-2',0,qsurf(:,igcm_dust_mass,iflat))
    37733908             call WRITEDIAGFI(ngrid,'wspeed','vertical speed stormdust',
    37743909     &                        'm/s',1,wspeed)
     
    38243959           mtot = 0
    38253960           icetot = 0
    3826            h2otot = qsurf(1,igcm_h2o_ice)
     3961           h2otot = qsurf(1,igcm_h2o_ice,iflat)
    38273962           if (hdo) THEN
    38283963           mtotD = 0
    38293964           icetotD = 0
    3830            hdotot = qsurf(1,igcm_hdo_ice)
     3965           hdotot = qsurf(1,igcm_hdo_ice,iflat)
    38313966           ENDIF !hdo
    38323967
     
    38603995             CALL WRITEDIAGFI(ngrid,'albedo',
    38613996     &                         'albedo',
    3862      &                         '',2,albedo(1,1))
     3997     &                         '',2,albedo(1,1,iflat))
    38633998
    38643999             IF (hdo) THEN
     
    39704105           do iq=1,nq
    39714106             call WRITEDIAGFI(ngrid,trim(noms(iq))//'_s',
    3972      &            trim(noms(iq))//'_s','kg/kg',0,qsurf(1,iq))
     4107     &       trim(noms(iq))//'_s','kg/kg',0,qsurf(1,iq,iflat))
    39734108           end do
    39744109     
     
    40304165     &        +(pdq(ig,l,igcm_co2)+pdq(ig,l,igcm_co2_ice))*ptimestep)
    40314166          enddo
    4032           co2totB = co2totB + qsurf(ig,igcm_co2)
     4167          co2totB = co2totB + qsurf(ig,igcm_co2,iflat)
    40334168        enddo
    40344169      else
     
    40394174     &             (pq(ig,l,igcm_co2)+pdq(ig,l,igcm_co2)*ptimestep)
    40404175          enddo
    4041           co2totB = co2totB + qsurf(ig,igcm_co2)
     4176          co2totB = co2totB + qsurf(ig,igcm_co2,iflat)
    40424177        enddo
    40434178      endif ! of if (igcm_co2_ice.ne.0)
  • trunk/LMDZ.MARS/libf/phymars/soil.F

    r2887 r2900  
    88     &                     coefd, alph, beta, mu,flux_geo
    99      use surfdat_h, only: watercaptag, inert_h2o_ice
    10 
     10      use comslope_mod, ONLY: nslope
    1111      implicit none
    1212
     
    2929      integer nsoil     ! number of soil layers
    3030      logical firstcall ! identifier for initialization call
    31       real therm_i(ngrid,nsoil) ! thermal inertia
     31      real therm_i(ngrid,nsoil,nslope) ! thermal inertia
    3232      real timestep         ! time step
    33       real tsurf(ngrid)   ! surface temperature
     33      real tsurf(ngrid,nslope)   ! surface temperature
    3434! outputs:
    35       real tsoil(ngrid,nsoil) ! soil (mid-layer) temperature
    36       real capcal(ngrid) ! surface specific heat
    37       real fluxgrd(ngrid) ! surface diffusive heat flux
     35      real tsoil(ngrid,nsoil,nslope) ! soil (mid-layer) temperature
     36      real capcal(ngrid,nslope) ! surface specific heat
     37      real fluxgrd(ngrid,nslope) ! surface diffusive heat flux
    3838
    3939! local variables:
    40       integer ig,ik
     40      integer ig,ik,islope
    4141
    4242! 0. Initialisations and preprocessing step
     
    4646! 0.1 Build mthermdiff(:), the mid-layer thermal diffusivities
    4747      do ig=1,ngrid
     48       do islope = 1,nslope
    4849        if (watercaptag(ig)) then
    4950          do ik=0,nsoil-1
    5051! If we have permanent ice, we use the water ice thermal inertia from ground to last layer.
    51               mthermdiff(ig,ik)=inert_h2o_ice*inert_h2o_ice/volcapa
     52              mthermdiff(ig,ik,islope)=inert_h2o_ice*
     53     &            inert_h2o_ice/volcapa
    5254          enddo
    5355        else
    5456          do ik=0,nsoil-1
    55            mthermdiff(ig,ik)=therm_i(ig,ik+1)*therm_i(ig,ik+1)/volcapa
     57           mthermdiff(ig,ik,islope)=therm_i(ig,ik+1,islope)*
     58     &         therm_i(ig,ik+1,islope)/volcapa
    5659          enddo
    5760        endif
    5861      enddo
     62      enddo
    5963
    6064#ifdef MESOSCALE
    6165      do ig=1,ngrid
    62         if ( therm_i(ig,1) .ge. inert_h2o_ice ) then
    63           print *, "limit max TI ", therm_i(ig,1), inert_h2o_ice
     66       do islope = 1,nslope
     67        if ( therm_i(ig,1,islope) .ge. inert_h2o_ice ) then
     68          print *, "limit max TI ", therm_i(ig,1,islope), inert_h2o_ice
    6469          do ik=0,nsoil-1
    65                mthermdiff(ig,ik)=inert_h2o_ice*inert_h2o_ice/volcapa
     70               mthermdiff(ig,ik,islope)=inert_h2o_ice*
     71     &    inert_h2o_ice/volcapa
    6672          enddo
    6773        endif
     74       enddo
    6875      enddo
    6976#endif
     
    7178! 0.2 Build thermdiff(:), the "interlayer" thermal diffusivities
    7279      do ig=1,ngrid
     80       do islope = 1,nslope
    7381        do ik=1,nsoil-1
    74       thermdiff(ig,ik)=((layer(ik)-mlayer(ik-1))*mthermdiff(ig,ik)
    75      &                +(mlayer(ik)-layer(ik))*mthermdiff(ig,ik-1))
     82      thermdiff(ig,ik,islope)=((layer(ik)-mlayer(ik-1))
     83     &                        *mthermdiff(ig,ik,islope)
     84     &                +(mlayer(ik)-layer(ik))
     85     &                *mthermdiff(ig,ik-1,islope))
    7686     &                    /(mlayer(ik)-mlayer(ik-1))
    7787!       write(*,*),'soil: ik: ',ik,' thermdiff:',thermdiff(ig,ik)
    7888        enddo
     89       enddo
    7990      enddo
    8091
     
    92103
    93104      do ig=1,ngrid
     105       do islope = 1,nslope
    94106        ! d_k
    95107        do ik=1,nsoil-1
    96           coefd(ig,ik)=thermdiff(ig,ik)/(mlayer(ik)-mlayer(ik-1))
     108          coefd(ig,ik,islope)=thermdiff(ig,ik,islope)
     109     &        /(mlayer(ik)-mlayer(ik-1))
    97110        enddo
    98111       
    99112        ! alph_{N-1}
    100         alph(ig,nsoil-1)=coefd(ig,nsoil-1)/
    101      &                  (coefq(nsoil-1)+coefd(ig,nsoil-1))
     113        alph(ig,nsoil-1,islope)=coefd(ig,nsoil-1,islope)/
     114     &                  (coefq(nsoil-1)+coefd(ig,nsoil-1,islope))
    102115        ! alph_k
    103116        do ik=nsoil-2,1,-1
    104           alph(ig,ik)=coefd(ig,ik)/(coefq(ik)+coefd(ig,ik+1)*
    105      &                              (1.-alph(ig,ik+1))+coefd(ig,ik))
     117          alph(ig,ik,islope)=coefd(ig,ik,islope)/
     118     &         (coefq(ik)+coefd(ig,ik+1,islope)*
     119     &          (1.-alph(ig,ik+1,islope))+coefd(ig,ik,islope))
    106120        enddo
    107121
    108122        ! capcal
    109123! Cstar
    110         capcal(ig)=volcapa*layer(1)+
    111      &              (thermdiff(ig,1)/(mlayer(1)-mlayer(0)))*
    112      &              (timestep*(1.-alph(ig,1)))
     124        capcal(ig,islope)=volcapa*layer(1)+
     125     &         (thermdiff(ig,1,islope)/(mlayer(1)-mlayer(0)))*
     126     &         (timestep*(1.-alph(ig,1,islope)))
    113127! Cs
    114         capcal(ig)=capcal(ig)/(1.+mu*(1.0-alph(ig,1))*
    115      &                         thermdiff(ig,1)/mthermdiff(ig,0))
     128        capcal(ig,islope)=capcal(ig,islope)/
     129     &            (1.+mu*(1.0-alph(ig,1,islope))*
     130     &            thermdiff(ig,1,islope)/mthermdiff(ig,0,islope))
    116131!      write(*,*)'soil: ig=',ig,' capcal(ig)=',capcal(ig)
     132      enddo ! islope
    117133      enddo ! of do ig=1,ngrid
    118134           
     
    122138      IF (.not.firstcall) THEN
    123139! First layer:
    124       do ig=1,ngrid
    125         tsoil(ig,1)=(tsurf(ig)+mu*beta(ig,1)*
    126      &                         thermdiff(ig,1)/mthermdiff(ig,0))/
    127      &              (1.+mu*(1.0-alph(ig,1))*
    128      &               thermdiff(ig,1)/mthermdiff(ig,0))
     140      do islope = 1,nslope
     141      do ig=1,ngrid
     142        tsoil(ig,1,islope)=(tsurf(ig,islope)+mu*beta(ig,1,islope)*
     143     &      thermdiff(ig,1,islope)/mthermdiff(ig,0,islope))/
     144     &      (1.+mu*(1.0-alph(ig,1,islope))*
     145     &      thermdiff(ig,1,islope)/mthermdiff(ig,0,islope))
    129146      enddo
    130147! Other layers:
    131148      do ik=1,nsoil-1
    132149        do ig=1,ngrid
    133           tsoil(ig,ik+1)=alph(ig,ik)*tsoil(ig,ik)+beta(ig,ik)
    134         enddo
    135       enddo
    136      
     150          tsoil(ig,ik+1,islope)=alph(ig,ik,islope)*
     151     &    tsoil(ig,ik,islope)+beta(ig,ik,islope)
     152        enddo
     153      enddo
     154       enddo ! islope
    137155      ENDIF! of if (.not.firstcall)
    138156
    139157!  2. Compute beta coefficients (preprocessing for next time step)
    140158! Bottom layer, beta_{N-1}
    141       do ig=1,ngrid
    142         beta(ig,nsoil-1)=coefq(nsoil-1)*tsoil(ig,nsoil)
    143      &            /(coefq(nsoil-1)+coefd(ig,nsoil-1))
    144      &            +flux_geo(ig)/(coefq(nsoil-1) + coefd(ig,nsoil-1))
     159       do islope = 1,nslope
     160      do ig=1,ngrid
     161        beta(ig,nsoil-1,islope)=coefq(nsoil-1)*tsoil(ig,nsoil,islope)
     162     &      /(coefq(nsoil-1)+coefd(ig,nsoil-1,islope))
     163     &      +flux_geo(ig)/(coefq(nsoil-1) + coefd(ig,nsoil-1,islope))
    145164      enddo
    146165   
     
    148167      do ik=nsoil-2,1,-1
    149168        do ig=1,ngrid
    150           beta(ig,ik)=(coefq(ik)*tsoil(ig,ik+1)+
    151      &                 coefd(ig,ik+1)*beta(ig,ik+1))/
    152      &                 (coefq(ik)+coefd(ig,ik+1)*(1.0-alph(ig,ik+1))
    153      &                  +coefd(ig,ik))
     169          beta(ig,ik,islope)=(coefq(ik)*tsoil(ig,ik+1,islope)+
     170     &                 coefd(ig,ik+1,islope)*beta(ig,ik+1,islope))/
     171     &                 (coefq(ik)+coefd(ig,ik+1,islope)*
     172     &                 (1.0-alph(ig,ik+1,islope))
     173     &                  +coefd(ig,ik,islope))
    154174        enddo
    155175      enddo
     
    162182!     &              (timestep*(1.-alph(ig,1)))
    163183! Fstar
    164         fluxgrd(ig)=(thermdiff(ig,1)/(mlayer(1)-mlayer(0)))*
    165      &              (beta(ig,1)+(alph(ig,1)-1.0)*tsoil(ig,1))
     184        fluxgrd(ig,islope)=(thermdiff(ig,1,islope)/
     185     &              (mlayer(1)-mlayer(0)))*
     186     &              (beta(ig,1,islope)+(alph(ig,1,islope)-1.0)
     187     &              *tsoil(ig,1,islope))
    166188
    167189!        mu=mlayer(ig,0)/(mlayer(ig,1)-mlayer(ig,0))
     
    169191!     &                         thermdiff(ig,1)/mthermdiff(ig,0))
    170192! Fs
    171         fluxgrd(ig)=fluxgrd(ig)+(capcal(ig)/timestep)*
    172      &              (tsoil(ig,1)*(1.+mu*(1.0-alph(ig,1))*
    173      &                         thermdiff(ig,1)/mthermdiff(ig,0))
    174      &               -tsurf(ig)-mu*beta(ig,1)*
    175      &                          thermdiff(ig,1)/mthermdiff(ig,0))
    176       enddo
    177 
     193        fluxgrd(ig,islope)=fluxgrd(ig,islope)+(capcal(ig,islope)
     194     &              /timestep)*
     195     &              (tsoil(ig,1,islope)*
     196     &              (1.+mu*(1.0-alph(ig,1,islope))*
     197     &               thermdiff(ig,1,islope)/mthermdiff(ig,0,islope))
     198     &               -tsurf(ig,islope)-mu*beta(ig,1,islope)*
     199     &                thermdiff(ig,1,islope)/mthermdiff(ig,0,islope))
     200      enddo
     201      enddo ! islope
    178202      end
    179203
  • trunk/LMDZ.MARS/libf/phymars/surfdat_h.F90

    r2826 r2900  
    4444
    4545  !! variables
    46   REAL,SAVE,ALLOCATABLE :: tsurf(:)   ! Surface temperature (K)
    47   REAL,SAVE,ALLOCATABLE :: emis(:)    ! Thermal IR surface emissivity
    48   REAL,SAVE,ALLOCATABLE :: capcal(:) ! surface heat capacity (J m-2 K-1)
    49   REAL,SAVE,ALLOCATABLE :: fluxgrd(:) ! surface conduction flux (W.m-2)
    50   REAL,ALLOCATABLE,SAVE :: qsurf(:,:) ! tracer on surface (e.g. kg.m-2)
    51   REAL,SAVE,ALLOCATABLE :: watercap(:) ! Surface water ice (kg.m-2)
     46  REAL,SAVE,ALLOCATABLE :: tsurf(:,:)   ! Surface temperature (K)
     47  REAL,SAVE,ALLOCATABLE :: emis(:,:)    ! Thermal IR surface emissivity
     48  REAL,SAVE,ALLOCATABLE :: capcal(:,:) ! surface heat capacity (J m-2 K-1)
     49  REAL,SAVE,ALLOCATABLE :: fluxgrd(:,:) ! surface conduction flux (W.m-2)
     50  REAL,ALLOCATABLE,SAVE :: qsurf(:,:,:) ! tracer on surface (e.g. kg.m-2)
     51  REAL,SAVE,ALLOCATABLE :: watercap(:,:) ! Surface water ice (kg.m-2)
    5252
    5353!$OMP THREADPRIVATE(tsurf,emis,capcal,fluxgrd,qsurf,watercap)
     
    5555contains
    5656
    57   subroutine ini_surfdat_h(ngrid,nq)
     57  subroutine ini_surfdat_h(ngrid,nq,nslope)
    5858 
    5959  implicit none
    6060  integer,intent(in) :: ngrid ! number of atmospheric columns
    6161  integer,intent(in) :: nq ! number of tracers 
    62 
     62  integer,intent(in) :: nslope ! number of sub-grid scale slope 
    6363    allocate(albedodat(ngrid))
    6464    allocate(phisfi(ngrid))
     
    7171    allocate(zthe(ngrid))
    7272    allocate(z0(ngrid))
    73     allocate(qsurf(ngrid,nq))
    74     allocate(tsurf(ngrid))
    75     allocate(watercap(ngrid))
    76     allocate(emis(ngrid))
    77     allocate(capcal(ngrid))
    78     allocate(fluxgrd(ngrid))
     73    allocate(qsurf(ngrid,nq,nslope))
     74    allocate(tsurf(ngrid,nslope))
     75    allocate(watercap(ngrid,nslope))
     76    allocate(emis(ngrid,nslope))
     77    allocate(capcal(ngrid,nslope))
     78    allocate(fluxgrd(ngrid,nslope))
    7979    allocate(hmons(ngrid))
    8080    allocate(summit(ngrid))
  • trunk/LMDZ.MARS/libf/phymars/writediagfi.F

    r2573 r2900  
    7878
    7979      integer,save :: zitau=0
    80       character(len=20),save :: firstnom='1234567890'
     80      character(len=27),save :: firstnom='1234567890'
    8181!$OMP THREADPRIVATE(zitau,firstnom)
    8282
Note: See TracChangeset for help on using the changeset viewer.