/[MITgcm]/MITgcm/pkg/exf/exf_set_gen.F
ViewVC logotype

Contents of /MITgcm/pkg/exf/exf_set_gen.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.22 - (show annotations) (download)
Fri Nov 30 22:22:06 2007 UTC (16 years, 6 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint59m, checkpoint59l, checkpoint59k
Changes since 1.21: +11 -4 lines
fix for multi-threaded run

1 C $Header: /u/gcmpack/MITgcm/pkg/exf/exf_set_gen.F,v 1.21 2007/04/18 19:55:34 heimbach Exp $
2 C $Name: $
3
4 #include "EXF_OPTIONS.h"
5
6 subroutine exf_set_gen(
7 & genfile, genstartdate, genperiod,
8 & genstartdate1, genstartdate2,
9 & exf_inscal_gen, genremove_intercept, genremove_slope,
10 & genfld, gen0, gen1, genmask,
11 #ifdef USE_EXF_INTERPOLATION
12 & gen_lon0, gen_lon_inc, gen_lat0, gen_lat_inc,
13 & gen_nlon, gen_nlat, gen_xout, gen_yout, interp_method,
14 #endif
15 & mytime, myiter, mythid )
16
17 c ==================================================================
18 c SUBROUTINE exf_set_gen
19 c ==================================================================
20 c
21 c o set external forcing gen
22 c
23 c started: Ralf.Giering@FastOpt.de 25-Mai-2000
24 c changed: heimbach@mit.edu 10-Jan-2002
25 c 20-Dec-2002: mods for pkg/seaice, menemenlis@jpl.nasa.gov
26 c heimbach@mit.edu: totally re-organized exf_set_...
27 c replaced all routines by one generic routine
28 c 5-Aug-2003: added USE_EXF_INTERPOLATION for arbitrary
29 c input grid capability
30 c 11-Dec-2006 added time-mean and monthly-mean climatology options
31 c genperiod=0 means input file is one time-constant field
32 c genperiod=-12 means input file contains 12 monthly means
33
34 c ==================================================================
35 c SUBROUTINE exf_set_gen
36 c ==================================================================
37
38 implicit none
39
40 c == global variables ==
41
42 #include "EEPARAMS.h"
43 #include "SIZE.h"
44 #include "PARAMS.h"
45 #include "GRID.h"
46
47 #include "EXF_PARAM.h"
48 #include "EXF_CONSTANTS.h"
49
50 c == routine arguments ==
51
52 integer genstartdate1, genstartdate2
53 _RL genstartdate, genperiod
54 _RL exf_inscal_gen
55 _RL genremove_intercept, genremove_slope
56 _RL genfld(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
57 _RL gen0 (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
58 _RL gen1 (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
59 character*1 genmask
60 character*(128) genfile
61 _RL mytime
62 integer myiter
63 integer mythid
64
65 #ifdef USE_EXF_INTERPOLATION
66 c gen_lon_0 ,gen_lat_0 :: longitude and latitude of SouthWest
67 c corner of global input grid
68 c gen_nlon, gen_nlat :: input x-grid and y-grid size
69 c gen_lon_inc :: scalar x-grid increment
70 c gen_lat_inc :: vector y-grid increments
71 c gen_xout, gen_yout :: coordinates for output grid
72 _RL gen_lon0, gen_lon_inc
73 _RL gen_lat0, gen_lat_inc(MAX_LAT_INC)
74 INTEGER gen_nlon, gen_nlat
75 _RS gen_xout (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
76 _RS gen_yout (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
77 integer interp_method
78 #endif /* USE_EXF_INTERPOLATION */
79
80 c == local variables ==
81
82 logical first, changed
83 integer count0, count1
84 integer year0, year1
85 integer bi, bj, i, j, il
86 _RL fac
87 character*(128) genfile0, genfile1
88
89 c == external ==
90
91 integer ilnblnk
92 external ilnblnk
93
94 c == end of interface ==
95
96 if ( genfile .NE. ' ' .and. genperiod .ne. 0 ) then
97
98 cph(
99 cph-exf-print if (genfile .EQ. hfluxfile) year0 = 3000
100 cph)
101
102 if ( genperiod .eq. -12 ) then
103 c genperiod=-12 means input file contains 12 monthly means
104 c record numbers are assumed 1 to 12 corresponding to
105 c Jan. through Dec.
106 call cal_GetMonthsRec(
107 O fac, first, changed,
108 O count0, count1,
109 I mytime, myiter, mythid
110 & )
111
112 elseif ( genperiod .lt. 0 ) then
113 print *, 'genperiod is out of range'
114 STOP 'ABNORMAL END: S/R EXF_GETFFIELDREC'
115
116 else
117 c get record numbers and interpolation factor for gen
118 call exf_GetFFieldRec(
119 I genstartdate, genperiod
120 I , genstartdate1, genstartdate2
121 I , useExfYearlyFields
122 O , fac, first, changed
123 O , count0, count1, year0, year1
124 I , mytime, myiter, mythid
125 & )
126
127 endif
128
129 if ( first ) then
130 if (useExfYearlyFields.and.genperiod.gt.0) then
131 C Complete filename with YR or _YEAR extension
132 il = ilnblnk( genfile )
133 if (twoDigitYear) then
134 if (year0.ge.2000) then
135 write(genfile0(1:128),'(a,i2.2)')
136 & genfile(1:il),year0-2000
137 else
138 write(genfile0(1:128),'(a,i2.2)')
139 & genfile(1:il),year0-1900
140 endif
141 else
142 write(genfile0(1:128),'(2a,i4.4)')
143 & genfile(1:il),'_',year0
144 endif
145 else
146 genfile0 = genfile
147 endif
148
149 #ifdef USE_EXF_INTERPOLATION
150 call exf_interp( genfile0, exf_iprec
151 & , gen1, count0, gen_xout, gen_yout
152 & , gen_lon0,gen_lon_inc
153 & , gen_lat0,gen_lat_inc
154 & , gen_nlon,gen_nlat,interp_method,mythid
155 & )
156 #else
157 _BARRIER
158 call mdsreadfield( genfile0, exf_iprec, exf_yftype, 1
159 & , gen1, count0, mythid
160 & )
161 _BARRIER
162 #endif /* USE_EXF_INTERPOLATION */
163
164 if (exf_yftype .eq. 'RL') then
165 call exf_filter_rl( gen1, genmask, mythid )
166 else
167 call exf_filter_rs( gen1, genmask, mythid )
168 end if
169 endif
170
171 if (( first ) .or. ( changed )) then
172 call exf_SwapFFields( gen0, gen1, mythid )
173
174 if (useExfYearlyFields.and.genperiod.gt.0) then
175 C Complete filename with YR or _YEAR extension
176 il = ilnblnk( genfile )
177 if (twoDigitYear) then
178 if (year1.ge.2000) then
179 write(genfile1(1:128),'(a,i2.2)')
180 & genfile(1:il),year1-2000
181 else
182 write(genfile1(1:128),'(a,i2.2)')
183 & genfile(1:il),year1-1900
184 endif
185 else
186 write(genfile1(1:128),'(2a,i4.4)')
187 & genfile(1:il),'_',year1
188 endif
189 else
190 genfile1 = genfile
191 endif
192 #ifdef USE_EXF_INTERPOLATION
193 call exf_interp( genfile1, exf_iprec
194 & , gen1, count1, gen_xout, gen_yout
195 & , gen_lon0,gen_lon_inc
196 & , gen_lat0,gen_lat_inc
197 & , gen_nlon,gen_nlat,interp_method,mythid
198 & )
199 #else
200 _BARRIER
201 call mdsreadfield( genfile1, exf_iprec, exf_yftype, 1
202 & , gen1, count1, mythid
203 & )
204 _BARRIER
205 #endif /* USE_EXF_INTERPOLATION */
206
207 if (exf_yftype .eq. 'RL') then
208 call exf_filter_rl( gen1, genmask, mythid )
209 else
210 call exf_filter_rs( gen1, genmask, mythid )
211 end if
212 endif
213
214 c Loop over tiles.
215 do bj = mybylo(mythid),mybyhi(mythid)
216 do bi = mybxlo(mythid),mybxhi(mythid)
217 do j = 1,sny
218 do i = 1,snx
219 c Interpolate linearly onto the time.
220 genfld(i,j,bi,bj) = exf_inscal_gen * (
221 & fac * gen0(i,j,bi,bj) +
222 & (exf_one - fac) * gen1(i,j,bi,bj) )
223 genfld(i,j,bi,bj) =
224 & genfld(i,j,bi,bj) -
225 & exf_inscal_gen * ( genremove_intercept +
226 & genremove_slope*(mytime-starttime) )
227 enddo
228 enddo
229 enddo
230 enddo
231
232 endif
233
234 RETURN
235 END
236
237 C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
238 C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
239
240 subroutine exf_init_gen (
241 & genfile, genperiod, exf_inscal_gen, genmask,
242 & genconst, genfld, gen0, gen1,
243 #ifdef USE_EXF_INTERPOLATION
244 & gen_lon0, gen_lon_inc, gen_lat0, gen_lat_inc,
245 & gen_nlon, gen_nlat, gen_xout, gen_yout, interp_method,
246 #endif
247 & mythid )
248
249
250 c ==================================================================
251 c SUBROUTINE exf_init_gen
252 c ==================================================================
253 c
254 c o
255 c
256 c started: Ralf.Giering@FastOpt.de 25-Mai-2000
257 c changed: heimbach@mit.edu 10-Jan-2002
258 c heimbach@mit.edu: totally re-organized exf_set_...
259 c replaced all routines by one generic routine
260 c
261 c ==================================================================
262 c SUBROUTINE exf_init_gen
263 c ==================================================================
264
265 implicit none
266
267 c == global variables ==
268
269 #include "EEPARAMS.h"
270 #include "SIZE.h"
271
272 #include "EXF_PARAM.h"
273
274 c == routine arguments ==
275
276 _RL genperiod, exf_inscal_gen, genconst
277 _RL genfld(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
278 _RL gen0 (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
279 _RL gen1 (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
280 character*1 genmask
281 character*(128) genfile
282 integer mythid
283
284 #ifdef USE_EXF_INTERPOLATION
285 c gen_lon_0 ,gen_lat_0 :: longitude and latitude of SouthWest
286 c corner of global input grid
287 c gen_nlon, gen_nlat :: input x-grid and y-grid size
288 c gen_lon_inc :: scalar x-grid increment
289 c gen_lat_inc :: vector y-grid increments
290 c gen_xout, gen_yout :: coordinates for output grid
291 _RL gen_lon0, gen_lon_inc
292 _RL gen_lat0, gen_lat_inc(MAX_LAT_INC)
293 INTEGER gen_nlon, gen_nlat
294 _RS gen_xout (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
295 _RS gen_yout (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
296 integer interp_method
297 #endif /* USE_EXF_INTERPOLATION */
298
299 c == local variables ==
300
301 integer bi, bj, i, j, count
302
303 c == end of interface ==
304
305 do bj = mybylo(mythid), mybyhi(mythid)
306 do bi = mybxlo(mythid), mybxhi(mythid)
307 do j = 1-oly, sny+oly
308 do i = 1-olx, snx+olx
309 genfld(i,j,bi,bj) = genconst
310 gen0(i,j,bi,bj) = genconst
311 gen1(i,j,bi,bj) = genconst
312 enddo
313 enddo
314 enddo
315 enddo
316
317 if ( genfile .NE. ' ' .and. genperiod .eq. 0. ) then
318 count = 1
319
320 #ifdef USE_EXF_INTERPOLATION
321 call exf_interp( genfile, exf_iprec
322 & , genfld, count, gen_xout, gen_yout
323 & , gen_lon0,gen_lon_inc
324 & , gen_lat0,gen_lat_inc
325 & , gen_nlon,gen_nlat,interp_method,mythid
326 & )
327 #else
328 _BARRIER
329 call mdsreadfield( genfile, exf_iprec, exf_yftype, 1
330 & , genfld, count, mythid
331 & )
332 _BARRIER
333 #endif /* USE_EXF_INTERPOLATION */
334
335 if (exf_yftype .eq. 'RL') then
336 call exf_filter_rl( genfld, genmask, mythid )
337 else
338 call exf_filter_rs( genfld, genmask, mythid )
339 end if
340
341 c Loop over tiles.
342 do bj = mybylo(mythid),mybyhi(mythid)
343 do bi = mybxlo(mythid),mybxhi(mythid)
344 do j = 1,sny
345 do i = 1,snx
346 c Interpolate linearly onto the time.
347 genfld(i,j,bi,bj) =
348 & exf_inscal_gen * genfld(i,j,bi,bj)
349 enddo
350 enddo
351 enddo
352 enddo
353
354 endif
355
356 RETURN
357 END

  ViewVC Help
Powered by ViewVC 1.1.22