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

Last change on this file since 1448 was 1266, checked in by aslmd, 11 years ago

LMDZ.MARS
IMPORTANT CHANGE

  • Remove all reference/use of nlayermx and dimphys.h
  • Made use of automatic arrays whenever arrays are needed with dimension nlayer
  • Remove lots of obsolete reference to dimensions.h
  • Converted iono.h and param_v4.h into corresponding modules

(with embedded subroutine to allocate arrays)
(no arrays allocated if thermosphere not used)

  • Deleted param.h and put contents into module param_v4_h
  • Adapted testphys1d, newstart, etc...
  • Made DATA arrays in param_read to be initialized by subroutine

fill_data_thermos in module param_v4_h

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