Ignore:
Timestamp:
Jun 9, 2020, 1:01:31 PM (4 years ago)
Author:
aslmd
Message:

CO2 cloud microphysics

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.MARS/libf/phymars/co2snow.F

    r1779 r2341  
    1       SUBROUTINE co2snow (ngrid,nlayer,ptimestep,emisref,condsub
    2      &         ,pplev,pcondicea,pcondices,pfallice,pemisurf)
     1c=======================================================================
     2c     Program for simulate the impact of the CO2 snow fall on
     3c     the surface infrared emission (emissivity)
     4c-----------------------------------------------------------------------
     5c     Algorithme:
     6c     1 - Initialization
     7c     2 - Compute the surface emissivity
     8c-----------------------------------------------------------------------
     9c     Author: F. Forget
     10c-----------------------------------------------------------------------
     11c     Reference paper:
     12c     Francois Forget and James B. Pollack
     13c
     14c     "Thermal infrared observations of the condensing Martian polar
     15c     caps: CO2 ice temperatures and radiative budget"
     16c
     17c     JOURNAL OF GEOPHYSICAL RESEARCH, VOL. 101, NO. E7, PAGES 16,
     18c     865-16,879, JULY 25, 1996
     19c=======================================================================
    320
     21      SUBROUTINE co2snow(ngrid, nlayer, ptimestep, emisref, condsub,
     22     &                   pplev, pcondicea, pcondices, pfallice,
     23     &                   pemisurf)
     24     
    425      use surfdat_h, only: iceradius, dtemisice
    526      use geometry_mod, only: latitude ! grid point latitudes (rad)
    627      use time_phylmdz_mod, only: daysec
     28
    729      IMPLICIT NONE
    8 
    9 c=======================================================================
    10 c     Program for simulate the impact of the CO2 snow fall on
    11 c     the surface infrared emission (emissivity)  and on
    12 c     the airborne dust
    13 c     F.Forget 1996
    14 c=======================================================================
    15 
    16 c Declarations
    17 c ------------
    1830
    1931#include "callkeys.h"
    2032
    21 c     Arguments
    22 c     ---------
    2333
    24       INTEGER,INTENT(IN) :: ngrid ! number of atmospheric columns
    25       INTEGER,INTENT(IN) :: nlayer ! number of atmospheric layers
    26       REAL,INTENT(IN) :: ptimestep ! timestep of the physics (s)
    27       REAL,INTENT(IN) :: emisref(ngrid) ! grd or ice  emissivity without snow
    28       logical,intent(in) :: condsub(ngrid) ! true if there is CO2 condensation
    29                                            ! or sublimation in the column
    30       REAL,INTENT(IN) :: pplev(ngrid,nlayer+1) ! interlayer pressure (Pa)
    31       REAL,INTENT(IN) :: pcondicea(ngrid,nlayer) ! CO2 condensation rate (kg/m2/s)
    32       REAL,INTENT(IN) :: pcondices(ngrid) ! CO2 condensation rate (kg/m2/s)
    33                                           ! on the surface
    34       REAL,INTENT(IN) :: pfallice(ngrid,nlayer+1) ! falling CO2 ice (kg/m2/s)
     34c=======================================================================
     35c     Variables
     36c=======================================================================
     37c     Inputs:
     38c     -------
     39      integer, intent(in) ::
     40     &   ngrid, ! number of atmospheric columns
     41     &   nlayer ! number of atmospheric layers
     42                       
     43      real, intent(in) ::
     44     &   ptimestep,               ! timestep of the physics (s)
     45     &   emisref(ngrid),          ! grd or ice emissivity without snow
     46     &   pplev(ngrid,nlayer+1),   ! interlayer pressure (Pa)
     47     &   pcondicea(ngrid,nlayer), ! CO2 condensation rate in layers
     48                                  !   (kg/m2/s)
     49     &   pcondices(ngrid),        ! CO2 condensation rate on the surface
     50                                  !   (kg/m2/s)       
     51     &   pfallice(ngrid,nlayer+1) ! falling CO2 ice (kg/m2/s)
     52                           
     53      logical, intent(in) ::
     54     &   condsub(ngrid) ! true if there is CO2 condensation or
     55                        ! sublimation in the column
    3556
    36       REAL,INTENT(OUT) :: pemisurf(ngrid) ! surface emissivity
     57c     Output:
     58c     -------
     59      real, intent(out) ::
     60     &   pemisurf(ngrid) ! surface emissivity
    3761
    38 c     local
    39 c     -----
    40       integer ig , l , icap
     62c     local:
     63c     ------
     64      integer ::
     65     &   l,
     66     &   ig,
     67     &   icap
    4168
    42       REAL zdemisurf ,dtemis
    43       REAL sumdaer
     69      real ::
     70     &   sumdaer,
     71     &   zdemisurf
    4472
    45 c     saved
    46 c     -----
    47       REAL,save :: Kscat(2), scaveng
    48       LOGICAL,SAVE :: firstcall=.true.
     73      real, parameter ::
     74     &   alpha = 0.45
    4975
    50 c --------------
    51 c Initialisation
    52 c --------------
     76c     saved:
     77c     ------
     78      real, save ::
     79     &   Kscat(2) ! Kscat: coefficient for decreasing the surface
     80c                 !        emissivity
     81c                 !
     82c                 ! Kscat = (0.001/3.) * alpha / iceradius
     83c                 !          with 0.3 < alpha < 0.6
     84c                 !
     85c                 ! alpha set to 0.45 (coeff from emis = f (tau)) and
     86c                 ! iceradius the mean radius of the scaterring
     87c                 ! particles (200.e-6 < iceradius < 10.e-6)
     88c                 !
     89c                 ! (2) = N and S hemispheres
    5390
    54       ! AS: firstcall OK absolute
     91      logical, save ::
     92     &   firstcall = .true.
     93c=======================================================================
     94c BEGIN
     95c=======================================================================
     96c 1 - Initialization
     97c=======================================================================
    5598      if (firstcall) then
     99        Kscat(1) = (0.001/3.) * alpha / iceradius(1)
     100        Kscat(2) = (0.001/3.) * alpha / iceradius(2)
     101                   
     102        firstcall = .false.
     103      end if
     104c=======================================================================
     105c 2 - Compute the surface emissivity
     106c=======================================================================
     107      do ig = 1, ngrid
     108        if (condsub(ig)) then
     109          if (latitude(ig).lt.0.) then
     110              icap = 2 ! Southern hemisphere
     111          else
     112              icap = 1 ! Northern Hemisphere
     113          end if
    56114
    57 c   Kscat : coefficient for decreasing the surface emissivity
    58 c           =(0.001/3.)*alpha/iceradius ,
    59 c           with 0.3< alpha < 0.6, set to 0.45 (coeff from emis = f (tau))
    60 c           and iceradius the mean radius of the
    61 c           scaterring particles  (200.e-6<iceradius<10.e-6)
    62 
    63             Kscat(1)=(0.001/3.)*0.45/iceradius(1)
    64             Kscat(2)=(0.001/3.)*0.45/iceradius(2)
    65 
    66 c          Scavenging Ratio (dust concentration in the air / in the snow)
    67            scaveng = 100.0
    68            
    69 c          Collision Scavenging coefficient  (m2.kg-1)
    70 c          Csca  = 2.3  ! not used yet !!!!!!!!!!!
    71            firstcall = .false.
    72 
    73       end if
    74 
    75 
    76 c     LOOP on grid points
    77 c     -------------------
    78       do ig=1,ngrid
    79          if (condsub(ig)) then
    80 
    81 c         IF (scavenging) then
    82 c          Airborne Dust
    83 c          -------------
    84 c          sumdaer=0.
    85 c          do l=nlayer, 1, -1
    86 c             pdaerosol(ig,l)= -paerosol(ig,l,1)*
    87 c    &              (1-exp(-scaveng*pcondicea(ig,l)*ptimestep*g/
    88 c    &               (pplev(ig,l)-pplev(ig,l+1))))/ptimestep 
    89 
    90 c    &           - Csca*paerosol(ig,l,1) ! Scavenging by collision
    91 c    &           * 0.5*(pfallice(ig,l)) ! not included
    92 
    93 c             test to avoid releasing to much dust when subliming:
    94 c             if(pdaerosol(ig,l).gt.-sumdaer)pdaerosol(ig,l)=-sumdaer
    95 c             sumdaer=sumdaer + pdaerosol(ig,l)
    96 
    97 c            if (-pdaerosol(ig,l)*ptimestep.gt.paerosol(ig,l,1)) then
    98 c                write(*,*) 'ds co2snow: aerosol < 0.0 !!!'
    99 c                write(*,*) 'ig =' , ig
    100 c            end if
    101 c          end do
    102 c         END IF
    103 
    104 c          Surface emissivity
    105 c          ------------------
    106 c   dtemis: Time scale for increasing the ice emissivity
    107 
    108            IF(latitude(ig).LT. 0.) THEN
    109               icap=2 ! Southern hemisphere
    110            ELSE
    111               icap=1 ! Northern Hemisphere
    112            ENDIF
    113 
    114            zdemisurf =
    115      &    (emisref(ig)-pemisurf(ig))/(dtemisice(icap)*daysec)
    116 c Using directly the diferential equation:
    117 c    &       -Kscat(icap)*emisref(ig)*
    118 c    &      (pemisurf(ig)/emisref(ig))**4 *pfallice(ig,1)
    119 c Using an integrated form for numerical safety instead
    120      & +(emisref(ig)* ((pemisurf(ig)/emisref(ig))**(-3)+3.*Kscat(icap)*
    121      & pfallice(ig,1)*ptimestep)**(-1/3.) -pemisurf(ig))/ptimestep   
    122 
    123 
    124            pemisurf(ig) = pemisurf(ig) + zdemisurf*ptimestep
    125 
    126            if (pemisurf(ig).lt.0.1) then
    127                  write(*,*) 'ds co2snow: emis < 0.1 !!!'
    128                  write(*,*) 'ig =' , ig
    129                  write(*,*)'pemisurf(ig)',pemisurf(ig)
    130                  write(*,*) 'zdemisurf*ptimestep',zdemisurf*ptimestep
    131            end if
    132          else
     115          ! compute zdemisurf using an integrated form for numerical
     116          ! safety instead
     117          zdemisurf =
     118     &     (emisref(ig) - pemisurf(ig)) / (dtemisice(icap) * daysec)
     119     &     +
     120     &     ( emisref(ig) *
     121     &              ( (pemisurf(ig)/emisref(ig))**(-3) +
     122     &                3.*Kscat(icap)*pfallice(ig,1)*ptimestep )**(-1/3.)
     123     &       - pemisurf(ig)
     124     &      ) / ptimestep
     125         
     126          pemisurf(ig) = pemisurf(ig) + zdemisurf * ptimestep
     127          if (pemisurf(ig).lt.0.1) then
     128            write(*,*)'ds co2snow: emis < 0.1 !!!'
     129            write(*,*)'ig =' , ig
     130            write(*,*)'pemisurf(ig)', pemisurf(ig)
     131            write(*,*)'zdemisurf*ptimestep', zdemisurf*ptimestep
     132          end if
     133        else ! if condsub(ig) is false
    133134           pemisurf(ig) = emisref(ig)
    134          end if
    135       end do
    136 
     135        end if
     136      end do ! ngrid
     137c=======================================================================
     138c END
     139c=======================================================================
    137140      return
    138141      end
Note: See TracChangeset for help on using the changeset viewer.