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 |
---|