1 |
|
2 |
#include "ctrparam.h" |
3 |
|
4 |
! ========================================================== |
5 |
! |
6 |
! FORCEDOZONE.F: Routine to get ozone deviations from |
7 |
! specified file and interpolate |
8 |
! to the appropriate data |
9 |
! |
10 |
! ---------------------------------------------------------- |
11 |
! |
12 |
! Revision History: |
13 |
! |
14 |
! When Who What |
15 |
! ---- ---------- ------- |
16 |
! 073100 Chien Wang repack based on CliChem3 & M24x11, |
17 |
! and add cpp. |
18 |
! |
19 |
! 110100 Added data for Jan. 2000, |
20 |
! dimension of o3f was changed from nm to nm+1 |
21 |
! |
22 |
! 011503 Chris Forest Converted to use GISS 1850-2050 ozone data |
23 |
! uses nlev = 14 to adjust ozone profile in three |
24 |
! layers above 10 hPa top of dynamics levels |
25 |
! (layer edges at 5, 2, and 0.00001 hPa) |
26 |
! |
27 |
! ========================================================== |
28 |
|
29 |
subroutine getforcedozone( jyear, jday ) |
30 |
|
31 |
parameter (nm=1728) |
32 |
c parameter (nm =252) |
33 |
|
34 |
#include "chem_para" |
35 |
#include "chem_com" |
36 |
|
37 |
common /o3data/o3_data |
38 |
character * 120 o3_data |
39 |
C |
40 |
c Routine to get ozone deviations from specified file and interpolate |
41 |
c to the appropriate date. |
42 |
C |
43 |
C Author: Chris E Forest. |
44 |
C Added Mar 18, 1998 |
45 |
C |
46 |
C tropmass = 28.97296245*1.e-3*0.8/P0 |
47 |
C pxxx = dpl(l)*part |
48 |
C |
49 |
C ULGAS(L,3)=o3(ILON,jyyy,l)/48.0 |
50 |
C & *pxxx*tropmass |
51 |
C |
52 |
C o3 = ppb(m) |
53 |
C |
54 |
C 48 = mol weight of o3 |
55 |
C |
56 |
C ULGAS = cm^3 (STP)/cm^2 |
57 |
|
58 |
logical first |
59 |
integer year0, nlevp3 ,yrmax |
60 |
! real date, o3f(nlat,nlev+3,nm), o3dummy ! 03/20/2006 |
61 |
real date, o3f(nlat,nlev+3,nm+12), o3dummy |
62 |
c real date, o3f(24,11,nm+1), o3dummy |
63 |
character*43 filen |
64 |
DIMENSION JDOFM(13) |
65 |
data first / .true. / |
66 |
DATA JDOFM /0,31,59,90,120,151,181,212,243,273,304,334,365/ |
67 |
data year0 / 1859 / |
68 |
|
69 |
c year0 = 1974 for o3hadley.dat |
70 |
c year0 = 1979 for o3giss.MR.dat |
71 |
c year0 = 1850 for o3.1850_2050.giss.46x11.dat |
72 |
c year0 = 1859 for o3.1859_2002.giss.46x11.dat |
73 |
c |
74 |
C filen = '/data11/ceforest/forcing/dummyozone.dat' |
75 |
c filen = '/data11/ceforest/forcing/o3giss.MR.dat' |
76 |
C filen = '/data11/ceforest/forcing/o3hadley.dat' |
77 |
|
78 |
if (first) then |
79 |
print *,'GetForcedOzone: reading data for 14 layers' |
80 |
print *,'nlat=',nlat,' nlev=',nlev |
81 |
open(unit=500, file=o3_data,status='old') |
82 |
c |
83 |
c GISS: nm = 252 , HadCM2: nm=265, 1850-2050: nm=2412 |
84 |
c |
85 |
c nlev = nlev + 3 to include 3 layers above 10 hPa. |
86 |
c |
87 |
|
88 |
nlevp3 = nlev + 3 |
89 |
|
90 |
do i=1,nm |
91 |
do k=1, nlevp3 |
92 |
do j = 1,nlat |
93 |
read(500,'(E12.4)') o3dummy |
94 |
o3f(j,k,i) = o3dummy*1.e9 ! convert to ppb(m) |
95 |
enddo |
96 |
enddo |
97 |
enddo |
98 |
close(500) |
99 |
C Added data for Jan. 2000 to allow simulation until Jan 1 2000 |
100 |
c NOT necessary with 1850-2050 GISS ozone data |
101 |
c do k=1, nlev |
102 |
c do j = 1,nlat |
103 |
c o3f(j,k,nm+1) = o3f(j,k,nm) |
104 |
c enddo |
105 |
c enddo |
106 |
! 03/20/2006 Data for anaditional year are added |
107 |
! really only data for January are used |
108 |
do m=1, 12 |
109 |
do k=1, nlev |
110 |
do j = 1,nlat |
111 |
o3f(j,k,nm+m) = o3f(j,k,nm-12+m) |
112 |
enddo |
113 |
enddo |
114 |
enddo |
115 |
first=.false. |
116 |
nyears=nm/12 |
117 |
yrmax=year0+nyears-1 |
118 |
print *,'Ozone data for ',nyears,' years ' |
119 |
print *,'from ',year0,' to ',yrmax |
120 |
endif |
121 |
|
122 |
|
123 |
! iy = jyear - year0 ! 03/17/06 |
124 |
jyear1=min(jyear,yrmax) |
125 |
iy = jyear1 - year0 |
126 |
! print *,'Ozone for year ',jyear1,iy |
127 |
if (iy.lt.0) then |
128 |
do i=1,nlat |
129 |
do j=1,nlevp3 |
130 |
o3dev(1,i,j) = 0. |
131 |
enddo |
132 |
enddo |
133 |
else |
134 |
C--- o3interp(o3f, o3dev, date, year0) |
135 |
|
136 |
jdd = jday-15 |
137 |
|
138 |
if (iy .eq. 0 .and. jdd.le.0) then |
139 |
do i=1,nlat |
140 |
do j=1,nlevp3 |
141 |
dl = ( 31. + float(jdd) )/31. |
142 |
o3dev(1,i,j) = o3f(i,j,1)*dl |
143 |
enddo |
144 |
enddo |
145 |
else |
146 |
im =12 |
147 |
do i=1,12 |
148 |
if (jdd.gt.jdofm(i) .and. jdd.le.jdofm(i+1)) then |
149 |
im = i |
150 |
endif |
151 |
enddo |
152 |
if (iy .ge. 1 .and. im.eq.12 .and. jdd.le.0 ) iy = iy-1 |
153 |
C if (jdd.le.0) iy = iy-1 |
154 |
C endif |
155 |
|
156 |
dl = ( float(jdd) - jdofm(im))/(jdofm(im+1) - jdofm(im)) |
157 |
if (im.eq.12.and.jdd.le.0) dl = ( 31. + float(jdd) )/31. |
158 |
|
159 |
imm = im + 12*iy |
160 |
! print *,jyear1,jday,iy,im,imm |
161 |
|
162 |
if(imm.lt.1.or.imm.ge.nm+1)then |
163 |
print *,' error in o3interp im=',imm |
164 |
stop 25 |
165 |
endif |
166 |
|
167 |
do j=1,nlat |
168 |
do k=1,nlevp3 |
169 |
o3dev(1,j,k) = o3f(j,k,imm)*(1.-dl)+o3f(j,k,imm+1)*dl |
170 |
enddo |
171 |
enddo |
172 |
C print *,jyear,jday,iy,im,dl,o3dev(0,0,9) |
173 |
endif |
174 |
endif |
175 |
|
176 |
c print *,'GetForcedOzone: JYEAR, JDAY, IY=', jyear,jday, iy |
177 |
c if (iy.ge.0) print *,'GetForcedOzone: imm=', imm |
178 |
|
179 |
return |
180 |
end |
181 |
|
182 |
|