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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 7 - (hide 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 guez 3 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 guez 7 integer k
42 guez 3
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 guez 7 c = c_Mob + a4_mass * t_seri
77 guez 3
78     ! Compute coefficient "b":
79    
80     ! Heterogeneous chemistry is only at low temperature:
81     where (t_seri < 195.)
82 guez 7 b = r_het_interm
83 guez 3 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 guez 7 b = b + a2
95 guez 3
96     ! Midpoint method:
97    
98     ! Trial step to the midpoint:
99 guez 7 dq_o3_chem = o3_prod(q, zmasse, c, b) * pdtphys / 2
100 guez 3 ! "Real" step across the whole interval:
101 guez 7 dq_o3_chem = o3_prod(q + dq_o3_chem, zmasse, c, b) * pdtphys
102 guez 3 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 guez 7 function o3_prod(q, zmasse, c, b)
112 guez 3
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 guez 7 o3_prod = c + b * q + a6_mass * sigma_mass
178 guez 3
179     end function o3_prod
180    
181     end module o3_chem_m

  ViewVC Help
Powered by ViewVC 1.1.21