/[lmdze]/trunk/phylmd/Mobidic/o3_chem.f
ViewVC logotype

Contents of /trunk/phylmd/Mobidic/o3_chem.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 7 - (show annotations)
Mon Mar 31 12:24:17 2008 UTC (16 years, 2 months ago) by guez
Original Path: trunk/libf/phylmd/o3_chem_m.f90
File size: 5792 byte(s)
This revision is not in working order. Pending some moving of files.

Important changes. In the program "etat0_lim": ozone coefficients from
Mobidic are regridded in time instead of pressure ; consequences in
"etat0". In the program "gcm", ozone coefficients from Mobidic are
read once per day only for the current day and regridded in pressure ;
consequences in "o3_chem_m", "regr_pr_coefoz", "phytrac" and
"regr_pr_comb_coefoz_m".

NetCDF95 is a library and does not export NetCDF.

New variables "nag_gl_options", "nag_fcalls_options" and
"nag_cross_options" in "nag_tools.mk".

"check_coefoz.jnl" rewritten entirely for new version of
"coefoz_LMDZ.nc".

Target "obj_etat0_lim" moved from "GNUmakefile" to "nag_rules.mk".

Added some "intent" attributes in "calfis", "clmain", "clqh",
"cltrac", "cltracrn", "cvltr", "ini_undefSTD", "moy_undefSTD",
"nflxtr", "phystokenc", "phytrac", "readsulfate", "readsulfate_preind"
and "undefSTD".

In "dynetat0", "dynredem0" and "gcm", "phis" has rank 2 instead of
1. "phis" has assumed shape in "dynredem0".

Added module containing "dynredem0". Changed some calls with NetCDF
Fortran 77 interface to calls with NetCDF95 interface.

Replaced calls to "ssum" by calls to "sum" in "inigeom".

In "make.sh", new option "-c" to change compiler.

In "aaam_bud", argument "rjour" deleted.

In "physiq": renamed some variables; deleted variable "xjour".

In "phytrac": renamed some variables; new argument "lmt_pas".

1 module o3_chem_m
2
3 ! This module is clean: no C preprocessor directive, no include line.
4
5 IMPLICIT none
6
7 private o3_prod
8
9 contains
10
11 subroutine o3_chem(julien, gmtime, t_seri, zmasse, pdtphys, q)
12
13 ! This procedure evolves the ozone mass fraction through a time
14 ! step taking only chemistry into account.
15
16 use nrutil, only: assert
17 use dimphy, only: klon
18 use dimens_m, only: llm
19 use read_coefoz_m, only: c_Mob, a4_mass, a2, r_het_interm
20 use orbite_m, only: orbite, zenang
21 use nrtype, only: pi
22
23 integer, intent(in):: julien ! jour julien, 1 <= julien <= 360
24 real, intent(in):: gmtime ! heure de la journée en fraction de jour
25 real, intent(in):: t_seri(:, :) ! temperature, in K
26
27 real, intent(in):: zmasse(:, :)
28 ! (column-density of mass of air in a cell, in kg m-2)
29 ! (On the "physics" grid.
30 ! "zmasse(i, k)" is at longitude "rlon(i)", latitude "rlat(i)", for
31 ! layer "k".)
32
33 real, intent(in):: pdtphys ! time step for physics, in s
34
35 real, intent(inout):: q(:, :) ! mass fraction of ozone
36 ! (On the "physics" grid.
37 ! "q(i, k)" is at longitude "rlon(i)", latitude "rlat(i)", middle of
38 ! layer "k".)
39
40 ! Variables local to the procedure:
41 integer k
42
43 real c(klon, llm)
44 ! (constant term during a time step in the net mass production
45 ! rate of ozone by chemistry, per unit mass of air, in s-1)
46 ! (On the "physics" grid.
47 ! "c(i, k)" is at longitude "rlon(i)", latitude "rlat(i)", middle of
48 ! layer "k".)
49
50 real b(klon, llm)
51 ! (coefficient of "q" in the net mass production
52 ! rate of ozone by chemistry, per unit mass of air, in s-1)
53 ! (On the "physics" grid.
54 ! "b(i, k)" is at longitude "rlon(i)", latitude "rlat(i)", middle of
55 ! layer "k".)
56
57 real dq_o3_chem(klon, llm)
58 ! (variation of ozone mass fraction due to chemistry during a time step)
59 ! (On the "physics" grid.
60 ! "dq_o3_chem(i, k)" is at longitude "rlon(i)", latitude
61 ! "rlat(i)", middle of layer "k".)
62
63 real earth_long
64 ! (longitude vraie de la Terre dans son orbite solaire, par
65 ! rapport au point vernal (21 mars), en degrés)
66
67 real pmu0(klon) ! mean of cosine of solar zenith angle during "pdtphys"
68
69 !-------------------------------------------------------------
70
71 call assert(klon == (/size(q, 1), size(t_seri, 1), size(zmasse, 1)/), &
72 "o3_chem klon")
73 call assert(llm == (/size(q, 2), size(t_seri, 2), size(zmasse, 2)/), &
74 "o3_chem llm")
75
76 c = c_Mob + a4_mass * t_seri
77
78 ! Compute coefficient "b":
79
80 ! Heterogeneous chemistry is only at low temperature:
81 where (t_seri < 195.)
82 b = r_het_interm
83 elsewhere
84 b = 0.
85 end where
86
87 ! Heterogeneous chemistry is only during daytime:
88 call orbite(real(julien), earth_long)
89 call zenang(earth_long, gmtime, pdtphys, pmu0)
90 forall (k = 1: llm)
91 where (pmu0 <= cos(87. / 180. * pi)) b(:, k) = 0.
92 end forall
93
94 b = b + a2
95
96 ! Midpoint method:
97
98 ! Trial step to the midpoint:
99 dq_o3_chem = o3_prod(q, zmasse, c, b) * pdtphys / 2
100 ! "Real" step across the whole interval:
101 dq_o3_chem = o3_prod(q + dq_o3_chem, zmasse, c, b) * pdtphys
102 q = q + dq_o3_chem
103
104 ! Confine the mass fraction:
105 q = min(max(q, 0.), .01)
106
107 end subroutine o3_chem
108
109 !*************************************************
110
111 function o3_prod(q, zmasse, c, b)
112
113 ! This function computes the production rate of ozone by chemistry.
114
115 use read_coefoz_m, only: a6_mass
116 use nrutil, only: assert
117 use dimens_m, only: llm
118 use dimphy, only: klon
119
120 real, intent(in):: q(:, :) ! mass fraction of ozone
121 ! (On the "physics" grid.
122 ! "q(i, k)" is at longitude "rlon(i)", latitude "rlat(i)", middle of
123 ! layer "k".)
124
125 real, intent(in):: zmasse(:, :)
126 ! (column-density of mass of air in a layer, in kg m-2)
127 ! (On the "physics" grid.
128 ! "zmasse(i, k)" is at longitude "rlon(i)", latitude "rlat(i)", middle of
129 ! layer "k".)
130
131 real, intent(in):: c(:, :)
132 ! (constant term during a time step in the net mass production
133 ! rate of ozone by chemistry, per unit mass of air, in s-1)
134 ! (On the "physics" grid.
135 ! "c(i, k)" is at longitude "rlon(i)", latitude "rlat(i)", middle of
136 ! layer "k".)
137
138 real, intent(in):: b(:, :)
139 ! (coefficient of "q" in the net mass production
140 ! rate of ozone by chemistry, per unit mass of air, in s-1)
141 ! (On the "physics" grid.
142 ! "b(i, k)" is at longitude "rlon(i)", latitude "rlat(i)", middle of
143 ! layer "k".)
144
145 real o3_prod(klon, llm)
146 ! (net mass production rate of ozone by chemistry, per unit mass
147 ! of air, in s-1)
148 ! (On the "physics" grid.
149 ! "o3_prod(i, k)" is at longitude "rlon(i)", latitude "rlat(i)", middle of
150 ! layer "k".)
151
152 ! Variables local to the procedure:
153
154 real sigma_mass(klon, llm)
155 ! (mass column-density of ozone above point, in kg m-2)
156 ! (On the "physics" grid.
157 ! "sigma_mass(i, k)" is at longitude "rlon(i)", latitude
158 ! "rlat(i)", middle of layer "k".)
159
160 integer k
161
162 !-------------------------------------------------------------------
163
164 call assert(klon == (/size(q, 1), size(zmasse, 1), size(c, 1), &
165 size(b, 1)/), "o3_prod 1")
166 call assert(llm == (/size(q, 2), size(zmasse, 2), size(c, 2), &
167 size(b, 2)/), "o3_prod 2")
168
169 ! Compute the column-density above the base of layer
170 ! "k", and, as a first approximation, take it as column-density
171 ! above the middle of layer "k":
172 sigma_mass(:, llm) = zmasse(:, llm) * q(:, llm) ! top layer
173 do k = llm - 1, 1, -1
174 sigma_mass(:, k) = sigma_mass(:, k+1) + zmasse(:, k) * q(:, k)
175 end do
176
177 o3_prod = c + b * q + a6_mass * sigma_mass
178
179 end function o3_prod
180
181 end module o3_chem_m

  ViewVC Help
Powered by ViewVC 1.1.21