[459] | 1 | subroutine surfacearea(ngrid, nlay, pplay, pzlay, pt, pq, nq, |
---|
| 2 | $ rdust, rice, tau, tauscaling, |
---|
| 3 | $ surfdust, surfice) |
---|
| 4 | |
---|
| 5 | implicit none |
---|
| 6 | |
---|
| 7 | !========================================================================== |
---|
| 8 | ! calculation of the ice and dust surface area (m2/m3) |
---|
| 9 | ! available for heterogeneous reactions |
---|
| 10 | ! |
---|
| 11 | ! Franck Lefevre |
---|
| 12 | ! version 1.0 november 2011 |
---|
| 13 | !========================================================================== |
---|
| 14 | |
---|
| 15 | #include "dimensions.h" |
---|
| 16 | #include "dimphys.h" |
---|
| 17 | #include "comcstfi.h" |
---|
| 18 | #include "callkeys.h" |
---|
| 19 | #include "tracer.h" |
---|
| 20 | #include "dimradmars.h" |
---|
| 21 | #include "chimiedata.h" |
---|
| 22 | #include "conc.h" |
---|
| 23 | |
---|
| 24 | ! input |
---|
| 25 | |
---|
| 26 | integer ngrid, nlay |
---|
| 27 | integer nq ! number of tracers |
---|
| 28 | real pplay(ngrid,nlay) ! pressure at mid-layers (Pa) |
---|
| 29 | real pzlay(ngrid,nlay) ! altitude at mid-layers (m) |
---|
| 30 | real pt(ngrid,nlay) ! temperature at mid-layers (K) |
---|
| 31 | real pq(ngrid,nlay,nq) ! tracers (kg/kg) |
---|
| 32 | real rdust(ngrid,nlay) ! dust geometric mean radius (m) |
---|
| 33 | real rice(ngrid,nlay) ! ice mass mean radius (m) |
---|
| 34 | real tau(ngrid,naerkind) ! column dust optical depth at each point |
---|
| 35 | real tauscaling(ngrid) ! conversion factor for dust amount |
---|
| 36 | |
---|
| 37 | ! output |
---|
| 38 | |
---|
| 39 | real surfdust(ngrid,nlay) ! dust surface area (m2/m3) |
---|
| 40 | real surfice(ngrid,nlay) ! water-ice surface area (m2/m3) |
---|
| 41 | |
---|
| 42 | ! local |
---|
| 43 | |
---|
| 44 | integer l, ig |
---|
| 45 | real rho ! density (kg/m3) |
---|
| 46 | real ccntyp ! typical dust number density (#/kg) |
---|
| 47 | ! (microphys = false) |
---|
| 48 | real rdusttyp ! typical dust radius (m) |
---|
| 49 | ! (microphys = false) |
---|
| 50 | |
---|
| 51 | !========================================================================== |
---|
| 52 | |
---|
| 53 | if (microphys) then ! improvedclouds |
---|
| 54 | do l = 1,nlay |
---|
| 55 | do ig = 1,ngrid |
---|
| 56 | rho = pplay(ig,l)/(rnew(ig,l)*pt(ig,l)) |
---|
| 57 | surfdust(ig,l) = pq(ig,l,igcm_dust_number)*rho |
---|
| 58 | $ *tauscaling(ig) |
---|
| 59 | $ *4.*pi*rdust(ig,l)**2 |
---|
| 60 | surfice(ig,l) = pq(ig,l,igcm_ccn_number)*rho |
---|
| 61 | $ *tauscaling(ig) |
---|
| 62 | $ *4.*pi*rice(ig,l)**2 |
---|
| 63 | end do |
---|
| 64 | end do |
---|
| 65 | else ! simpleclouds |
---|
| 66 | do l = 1,nlay |
---|
| 67 | do ig = 1,ngrid |
---|
| 68 | rho = pplay(ig,l)/(rnew(ig,l)*pt(ig,l)) |
---|
| 69 | rdusttyp = max(.8e-6*exp(-pzlay(ig,l)/18000.),1.e-9) |
---|
| 70 | ccntyp = 1.3e+8*max(tau(ig,1),0.001)/0.1 |
---|
| 71 | $ *exp(-pzlay(ig,l)/10000.) |
---|
| 72 | ccntyp = ccntyp/ccn_factor |
---|
| 73 | if (rice(ig,l) .gt. rdust(ig,l)) then |
---|
| 74 | surfdust(ig,l) = ccntyp*(ccn_factor - 1.)*rho |
---|
| 75 | $ *4.*pi*rdusttyp**2 |
---|
| 76 | surfice(ig,l) = ccntyp*4.*pi*rice(ig,l)**2 |
---|
| 77 | else |
---|
| 78 | surfdust(ig,l) = ccntyp*ccn_factor*rho |
---|
| 79 | $ *4.*pi*rdusttyp**2 |
---|
| 80 | surfice(ig,l) = 0. |
---|
| 81 | end if |
---|
| 82 | end do |
---|
| 83 | end do |
---|
| 84 | end if ! of microphys |
---|
| 85 | |
---|
| 86 | ! write diagnostics in micron2/cm3 |
---|
| 87 | |
---|
| 88 | call wstats(ngrid,"surfdust", "Dust surface area", |
---|
| 89 | $ "micron2 cm-3",3,surfdust*1.e6) |
---|
| 90 | call writediagfi(ngrid,"surfdust", "Dust cloud surface area", |
---|
| 91 | $ "micron2 cm-3",3,surfdust*1.e6) |
---|
| 92 | call wstats(ngrid,"surfice", "Ice cloud surface area", |
---|
| 93 | $ "micron2 cm-3",3,surfice*1.e6) |
---|
| 94 | call writediagfi(ngrid,"surfice", "Ice cloud surface area", |
---|
| 95 | $ "micron2 cm-3",3,surfice*1.e6) |
---|
| 96 | |
---|
| 97 | return |
---|
| 98 | end |
---|