source: trunk/LMDZ.MARS/libf/aeronomars/surfacearea.F @ 2599

Last change on this file since 2599 was 2563, checked in by emillour, 3 years ago

Mars GCM:
Improve wstats: the callstats flag is now embedded within wstats and checked
internaly so no need to have some "if (callstats)" conditions around calls
to wstats anymore.
In addition: wstats now looks for an (optional) stats.def file in the
directory where the GCM is run to know which variable should be included
in the stats.nc file. The stats.def ASCII file should simply contain
one variable name per line, in the same way as the diagfi.def file for
diagfi outputs. If there is no stats.def file then all variables sent to
wstats will be in the stats.nc file (which matches the behaviour prior to
this improvement).
EM

File size: 5.4 KB
Line 
1      subroutine surfacearea(ngrid, nlay, naerkind, ptimestep,
2     $                       pplay, pzlay,
3     $                       pt, pq, pdq, nq, rdust, rice, tau,
4     $                       tauscaling,
5     $                       surfdust, surfice)
6
7      use tracer_mod, only: nuice_sed, igcm_dust_number,
8     &                      igcm_ccn_number, varian, ccn_factor
9      use conc_mod, only: rnew
10      use comcstfi_h, only: pi
11      use wstats_mod, only: wstats
12      implicit none
13
14!==========================================================================
15!     calculation of the ice and dust surface area (m2/m3)
16!     available for heterogeneous reactions
17!
18!     Franck Lefevre
19!     version 1.2 april 2012
20!==========================================================================
21
22      include "callkeys.h"
23
24! input
25
26      integer,intent(in) :: ngrid, nlay, naerkind
27      integer,intent(in) :: nq               ! number of tracers
28      real,intent(in) :: ptimestep           ! physics time step (s)
29      real,intent(in) :: pplay(ngrid,nlay)   ! pressure at mid-layers (Pa)
30      real,intent(in) :: pzlay(ngrid,nlay)   ! altitude at mid-layers (m)
31      real,intent(in) :: pt(ngrid,nlay)      ! temperature at mid-layers (K)
32      real,intent(in) :: pq(ngrid,nlay,nq)   ! tracers (kg/kg)
33      real,intent(in) :: pdq(ngrid,nlay,nq)  ! physical tendency (kg/kg.s-1)
34      real,intent(in) :: rdust(ngrid,nlay)   ! dust geometric mean radius (m)
35      real,intent(in) :: rice(ngrid,nlay)    ! ice mass mean radius (m)
36      real,intent(in) :: tau(ngrid,naerkind) ! column dust optical depth at each point
37      real,intent(in) :: tauscaling(ngrid)   ! conversion factor for dust amount
38
39! output
40
41      real,intent(out) :: surfdust(ngrid,nlay) ! dust surface area (m2/m3)
42      real,intent(out) :: surfice(ngrid,nlay)  ! water-ice surface area (m2/m3)
43
44! local
45
46      integer    :: l, ig
47      real       :: rho                     ! density (kg/m3)
48      real       :: dustnd, icend           ! uodated dust and ice number densities (kg/kg)
49      real, save :: factor_ice, factor_dust ! multiplying factor to compute total surface area
50                                            ! from the mass-mean radius
51      real       :: sigma_ice, sigma_dust   ! variance of the ice and dust distributions
52      real       :: ccntyp                  ! typical dust number density (#/kg)
53                                            ! (microphys = false)
54      real       :: rdusttyp                ! typical dust radius (m)
55                                            ! (microphys = false)
56
57      logical, save :: firstcall = .true.
58
59!==========================================================================
60
61      if (firstcall) then ! compute the multiplying factors
62         sigma_dust  = varian
63         sigma_ice   = sqrt(log(nuice_sed + 1.))
64         factor_dust = exp(0.5*(log(sigma_dust))**2)
65         factor_ice  = exp(0.5*(log(sigma_ice))**2)
66         write(*,*) 'surfacearea : factor_dust = ', factor_dust
67         write(*,*) 'surfacearea : factor_ice  = ', factor_ice
68         firstcall = .false.
69      end if
70
71      if (microphys) then ! improvedclouds
72         do l = 1,nlay
73            do ig = 1,ngrid
74!              atmospheric density
75               rho = pplay(ig,l)/(rnew(ig,l)*pt(ig,l))
76!              updated dust number density
77               dustnd = pq(ig,l,igcm_dust_number)
78     $                + pdq(ig,l,igcm_dust_number)*ptimestep
79!              updated ice number density
80               icend  = pq(ig,l,igcm_ccn_number)
81     $                + pdq(ig,l,igcm_ccn_number)*ptimestep
82!              dust surface area
83               surfdust(ig,l) = factor_dust*dustnd*rho*tauscaling(ig)
84     $                          *4.*pi*rdust(ig,l)**2
85!              ice surface area
86               surfice(ig,l)  = factor_ice*icend*rho*tauscaling(ig)
87     $                          *4.*pi*rice(ig,l)**2
88            end do
89         end do
90      else               ! simpleclouds
91         do l = 1,nlay
92            do ig = 1,ngrid
93!              atmospheric density
94               rho = pplay(ig,l)/(rnew(ig,l)*pt(ig,l))
95!              typical dust radius
96               rdusttyp = max(.8e-6*exp(-pzlay(ig,l)/18000.),1.e-9)
97!              typical dust number density
98               ccntyp = 1.3e+8*max(tau(ig,1),0.001)/0.1
99     $                  *exp(-pzlay(ig,l)/10000.)
100               ccntyp = ccntyp/ccn_factor
101               if (rice(ig,l) .gt. rdust(ig,l)) then
102                  surfdust(ig,l) = factor_dust*ccntyp*(ccn_factor - 1.)
103     $                             *rho*4.*pi*rdusttyp**2
104                  surfice(ig,l)  = factor_ice*ccntyp*4.*pi*rice(ig,l)**2
105               else
106                  surfdust(ig,l) = factor_dust*ccntyp*ccn_factor
107     $                             *rho*4.*pi*rdusttyp**2
108                  surfice(ig,l)  = 0.
109               end if
110            end do
111         end do
112      end if         ! of microphys
113
114! write diagnostics in micron2/cm3
115     
116      call wstats(ngrid,"surfdust", "Dust surface area",
117     $            "micron2 cm-3",3,surfdust*1.e6)
118      call wstats(ngrid,"surfice", "Ice cloud surface area",
119     $            "micron2 cm-3",3,surfice*1.e6)
120
121      call writediagfi(ngrid,"surfdust", "Dust surface area",
122     $            "micron2 cm-3",3,surfdust*1.e6)
123      call writediagfi(ngrid,"surfice", "Ice cloud surface area",
124     $            "micron2 cm-3",3,surfice*1.e6)
125
126      end
Note: See TracBrowser for help on using the repository browser.