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

Last change on this file since 463 was 463, checked in by emillour, 13 years ago

Mars GCM: more updates for photochemistry from FL: improved aeronomars/surfacearea.F, along with a change in arguments.
EM

File size: 4.5 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      implicit none
8
9!==========================================================================
10!     calculation of the ice and dust surface area (m2/m3)
11!     available for heterogeneous reactions
12!
13!     Franck Lefevre
14!     version 1.1 november 2011
15!==========================================================================
16
17#include "dimensions.h"
18#include "dimphys.h"
19#include "comcstfi.h"
20#include "callkeys.h"
21#include "tracer.h"
22#include "dimradmars.h"
23#include "chimiedata.h"
24#include "conc.h"
25
26! input
27
28      integer,intent(in) :: ngrid, nlay
29      integer,intent(in) :: nq               ! number of tracers
30      real,intent(in) :: ptimestep           ! physics time step (s)
31      real,intent(in) :: pplay(ngrid,nlay)   ! pressure at mid-layers (Pa)
32      real,intent(in) :: pzlay(ngrid,nlay)   ! altitude at mid-layers (m)
33      real,intent(in) :: pt(ngrid,nlay)      ! temperature at mid-layers (K)
34      real,intent(in) :: pq(ngrid,nlay,nq)   ! tracers (kg/kg)
35      real,intent(in) :: pdq(ngrid,nlay,nq)  ! physical tendency (kg/kg.s-1)
36      real,intent(in) :: rdust(ngrid,nlay)   ! dust geometric mean radius (m)
37      real,intent(in) :: rice(ngrid,nlay)    ! ice mass mean radius (m)
38      real,intent(in) :: tau(ngrid,naerkind) ! column dust optical depth at each point
39      real,intent(in) :: tauscaling(ngrid)   ! conversion factor for dust amount
40
41! output
42
43      real,intent(out) :: surfdust(ngrid,nlay) ! dust surface area (m2/m3)
44      real,intent(out) :: surfice(ngrid,nlay)  ! water-ice surface area (m2/m3)
45
46! local
47
48      integer l, ig
49      real rho                     ! density (kg/m3)
50      real dustnd                  ! uodated dust number density (kg/kg)
51      real icend                   ! uodated ice number density (kg/kg)
52      real ccntyp                  ! typical dust number density (#/kg)
53                                   ! (microphys = false)
54      real rdusttyp                ! typical dust radius (m)
55                                   ! (microphys = false)
56
57!==========================================================================
58
59      if (microphys) then ! improvedclouds
60         do l = 1,nlay
61            do ig = 1,ngrid
62!              atmospheric density
63               rho = pplay(ig,l)/(rnew(ig,l)*pt(ig,l))
64!              updated dust number density
65               dustnd = pq(ig,l,igcm_dust_number)
66     $                + pdq(ig,l,igcm_dust_number)*ptimestep
67!              updated ice number density
68               icend  = pq(ig,l,igcm_ccn_number)
69     $                + pdq(ig,l,igcm_ccn_number)*ptimestep
70!              dust surface area
71               surfdust(ig,l) = dustnd*rho*tauscaling(ig)
72     $                          *4.*pi*rdust(ig,l)**2
73!              ice surface area
74               surfice(ig,l)  = icend*rho*tauscaling(ig)
75     $                          *4.*pi*rice(ig,l)**2
76            end do
77         end do
78      else               ! simpleclouds
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!              typical dust radius
84               rdusttyp = max(.8e-6*exp(-pzlay(ig,l)/18000.),1.e-9)
85!              typical dust number density
86               ccntyp = 1.3e+8*max(tau(ig,1),0.001)/0.1
87     $                  *exp(-pzlay(ig,l)/10000.)
88               ccntyp = ccntyp/ccn_factor
89               if (rice(ig,l) .gt. rdust(ig,l)) then
90                  surfdust(ig,l) = ccntyp*(ccn_factor - 1.)*rho
91     $                             *4.*pi*rdusttyp**2
92                  surfice(ig,l)  = ccntyp*4.*pi*rice(ig,l)**2
93               else
94                  surfdust(ig,l) = ccntyp*ccn_factor*rho
95     $                             *4.*pi*rdusttyp**2
96                  surfice(ig,l)  = 0.
97               end if
98            end do
99         end do
100      end if         ! of microphys
101
102! write diagnostics in micron2/cm3
103
104      call wstats(ngrid,"surfdust", "Dust surface area",
105     $            "micron2 cm-3",3,surfdust*1.e6)
106      call writediagfi(ngrid,"surfdust", "Dust cloud surface area",
107     $            "micron2 cm-3",3,surfdust*1.e6)
108      call wstats(ngrid,"surfice", "Ice cloud surface area",
109     $            "micron2 cm-3",3,surfice*1.e6)
110      call writediagfi(ngrid,"surfice", "Ice cloud surface area",
111     $            "micron2 cm-3",3,surfice*1.e6)
112
113      return
114      end
Note: See TracBrowser for help on using the repository browser.