1 |
! |
module ozonecm_m |
2 |
! $Header: /home/cvsroot/LMDZ4/libf/phylmd/ozonecm.F,v 1.3 2005/06/06 13:16:33 fairhead Exp $ |
|
3 |
! |
IMPLICIT NONE |
4 |
SUBROUTINE ozonecm(rjour, rlat, paprs, o3) |
|
5 |
use dimens_m |
contains |
6 |
use dimphy |
|
7 |
use clesphys |
function ozonecm(rjour, paprs) |
8 |
use YOMCST |
|
9 |
IMPLICIT none |
! From phylmd/ozonecm.F, version 1.3 2005/06/06 13:16:33 |
10 |
C |
|
11 |
C The ozone climatology is based on an analytic formula which fits the |
! The ozone climatology is based on an analytic formula which fits the |
12 |
C Krueger and Mintzner (1976) profile, as well as the variations with |
! Krueger and Mintzner (1976) profile, as well as the variations with |
13 |
C altitude and latitude of the maximum ozone concentrations and the total |
! altitude and latitude of the maximum ozone concentrations and the total |
14 |
C column ozone concentration of Keating and Young (1986). The analytic |
! column ozone concentration of Keating and Young (1986). The analytic |
15 |
C formula have been established by J-F Royer (CRNM, Meteo France), who |
! formula have been established by J.-F. Royer (CRNM, Meteo France), who |
16 |
C also provided us the code. |
! also provided us the code. |
17 |
C |
|
18 |
C A. J. Krueger and R. A. Minzner, A Mid-Latitude Ozone Model for the |
! A. J. Krueger and R. A. Minzner, A Mid-Latitude Ozone Model for the |
19 |
C 1976 U.S. Standard Atmosphere, J. Geophys. Res., 81, 4477, (1976). |
! 1976 U. S. Standard Atmosphere, J. Geophys. Res., 81, 4477, (1976). |
20 |
C |
|
21 |
C Keating, G. M. and D. F. Young, 1985: Interim reference models for the |
! Keating, G. M. and D. F. Young, 1985: Interim reference models for the |
22 |
C middle atmosphere, Handbook for MAP, vol. 16, 205-229. |
! middle atmosphere, Handbook for MAP, vol. 16, 205-229. |
23 |
C |
|
24 |
|
use dimensions, only: llm |
25 |
real, intent(in):: rjour |
use nr_util, only: assert, pi |
26 |
REAL, intent(in):: rlat(klon) |
use phyetat0_m, only: rlat |
27 |
real, intent(in):: paprs(klon,klev+1) |
|
28 |
REAL, intent(out):: o3(klon,klev) ! ozone concentration in kg/kg |
REAL, INTENT (IN) :: rjour |
29 |
|
|
30 |
REAL tozon |
REAL, INTENT (IN) :: paprs(:, :) ! (klon, llm + 1) |
31 |
real pi, pl |
! pression pour chaque inter-couche, en Pa |
32 |
INTEGER i, k |
|
33 |
C---------------------------------------------------------- |
REAL ozonecm(size(paprs, 1), llm) ! (klon, llm) |
34 |
REAL field(klon,klev+1) |
! "ozonecm(j, k)" is the column-density of ozone in cell "(j, k)", that is |
35 |
REAL ps |
! between interface "k" and interface "k + 1", in kDU. |
36 |
PARAMETER (ps=101325.0) |
|
37 |
REAL an, unit, zo3q3 |
! Local: |
38 |
SAVE an, unit, zo3q3 |
|
39 |
REAL mu,gms, zslat, zsint, zcost, z, ppm, qpm, a |
REAL tozon ! equivalent pressure of ozone above interface "k", in Pa |
40 |
REAL asec, bsec, aprim, zo3a3 |
INTEGER i, k |
41 |
C---------------------------------------------------------- |
|
42 |
c data an /365.25/ (meteo) |
REAL field(llm + 1) |
43 |
DATA an /360.00/ |
! "field(k)" is the column-density of ozone between interface |
44 |
DATA unit /2.1415e-05/ |
! "k" and the top of the atmosphere (interface "llm + 1"), in kDU. |
45 |
DATA zo3q3 /4.0e-08/ |
|
46 |
|
real, PARAMETER:: ps = 101325. |
47 |
pi = 4.0 * ATAN(1.0) |
REAL, parameter:: an = 360., zo3q3 = 4E-8 |
48 |
DO k = 1, klev |
real, parameter:: zo3a3 = zo3q3 / ps / 2. |
49 |
DO i = 1, klon |
REAL, parameter:: dobson_unit = 2.1415E-5 ! in kg m-2 |
50 |
zslat = SIN(pi/180.*rlat(i)) |
REAL gms, slat, slat2, sint, cost, ppm, a |
51 |
zsint = SIN(2.*pi*(rjour+15.)/an) |
REAL asec, bsec, aprim |
52 |
zcost = COS(2.*pi*(rjour+15.)/an) |
|
53 |
z = 0.0531+zsint*(-0.001595+0.009443*zslat) + |
!---------------------------------------------------------- |
54 |
. zcost*(-0.001344-0.00346*zslat) + |
|
55 |
. zslat**2*(.056222+zslat**2*(-.037609 |
call assert(size(paprs, 2) == llm + 1, "ozonecm") |
56 |
. +.012248*zsint+.00521*zcost+.008890*zslat)) |
|
57 |
zo3a3 = zo3q3/ps/2. |
sint = sin(2 * pi * (rjour + 15.) / an) |
58 |
z = z-zo3q3*ps |
cost = cos(2 * pi * (rjour + 15.) / an) |
59 |
gms = z |
field(llm + 1) = 0. |
60 |
mu = ABS(sin(pi/180.*rlat(i))) |
|
61 |
ppm = 800.-(500.*zslat+150.*zcost)*zslat |
DO i = 1, size(paprs, 1) |
62 |
qpm = 1.74e-5-(7.5e-6*zslat+1.7e-6*zcost)*zslat |
slat = sin(pi / 180. * rlat(i)) |
63 |
bsec = 2650.+5000.*zslat**2 |
slat2 = slat * slat |
64 |
a = 4.0*(bsec)**(3./2.)*(ppm)**(3./2.)*(1.0+(bsec/ps)**(3./2.)) |
gms = 0.0531 + sint * (- 0.001595 + 0.009443 * slat) + cost & |
65 |
a = a/(bsec**(3./2.)+ppm**(3./2.))**2 |
* (- 0.001344 - 0.00346 * slat) + slat2 * (0.056222 + slat2 & |
66 |
aprim = (2.666666*qpm*ppm-a*gms)/(1.0-a) |
* (- 0.037609 + 0.012248 * sint + 0.00521 * cost + 0.00889 & |
67 |
aprim = amax1(0.,aprim) |
* slat)) - zo3q3 * ps |
68 |
asec = (gms-aprim)*(1.0+(bsec/ps)**(3./2.)) |
ppm = 800. - 500. * slat2 - 150. * cost * slat |
69 |
asec = AMAX1(0.0,asec) |
bsec = 2650. + 5000. * slat2 |
70 |
aprim = gms-asec/(1.+(bsec/ps)**(3./2.)) |
a = 4. * bsec**1.5 * ppm**1.5 * (1. + (bsec / ps)**1.5) & |
71 |
pl = paprs(i,k) |
/ (bsec**1.5 + ppm**1.5)**2 |
72 |
tozon = aprim/(1.+3.*(ppm/pl)**2)+asec/(1.+(bsec/pl)**(3./2.)) |
aprim = max(0., (2.666666 * (1.74E-5 - 7.5E-6 * slat2 & |
73 |
. + zo3a3*pl*pl |
- 1.7E-6 * cost * slat) * ppm - a * gms) / (1. - a)) |
74 |
tozon = tozon / 9.81 ! en kg/m**2 |
asec = max(0., (gms - aprim) * (1. + (bsec / ps)**1.5)) |
75 |
tozon = tozon / unit ! en kg/m**2 > u dobson (10e-5 m) |
aprim = gms - asec / (1. + (bsec / ps)**1.5) |
76 |
tozon = tozon / 1000. ! en cm |
|
77 |
field(i,k) = tozon |
DO k = 1, llm |
78 |
ENDDO |
tozon = aprim / (1. + 3. * (ppm / paprs(i, k))**2) & |
79 |
ENDDO |
+ asec / (1. + (bsec / paprs(i, k))**1.5) & |
80 |
c |
+ zo3a3 * paprs(i, k) * paprs(i, k) |
81 |
DO i = 1, klon |
! Convert from Pa to kDU: |
82 |
field(i,klev+1) = 0.0 |
field(k) = tozon / 9.81 / dobson_unit / 1e3 |
83 |
ENDDO |
END DO |
84 |
DO k = 1, klev |
|
85 |
DO i = 1, klon |
forall (k = 1: llm) ozonecm(i, k) = field(k) - field(k + 1) |
86 |
o3(i,k) = field(i,k) - field(i,k+1) |
END DO |
87 |
IF (.not. bug_ozone) then |
|
88 |
c convert o3 into kg/kg |
ozonecm = max(ozonecm, 1e-12) |
89 |
o3(i,k)=MAX(o3(i,k),1.0e-12)*RG/46.6968 |
|
90 |
. /(paprs(i,k)-paprs(i,k+1)) |
END function ozonecm |
91 |
ENDIF |
|
92 |
ENDDO |
end module ozonecm_m |
|
ENDDO |
|
|
c |
|
|
RETURN |
|
|
END |
|