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

Last change on this file since 1198 was 1047, checked in by emillour, 11 years ago

Mars GCM:

  • IMPORTANT CHANGE: Removed all reference/use of ngridmx (dimphys.h) in routines (necessary prerequisite to using parallel dynamics); in most cases this just means adding 'ngrid' as routine argument, and making local saved variables allocatable (and allocated at first call). In the process, had to convert many *.h files to equivalent modules: yomaer.h => yomaer_h.F90 , surfdat.h => surfdat_h.F90 , comsaison.h => comsaison_h.F90 , yomlw.h => yomlw_h.F90 , comdiurn.h => comdiurn_h.F90 , dimradmars.h => dimradmars_mod.F90 , comgeomfi.h => comgeomfi_h.F90, comsoil.h => comsoil_h.F90 , slope.h => slope_mod.F90
  • Also updated EOF routines, everything is now in eofdump_mod.F90
  • Removed unused routine lectfux.F (in dyn3d)

EM

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