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

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

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


Revision 1.18 - (hide annotations) (download)
Mon Apr 16 23:27:21 2007 UTC (17 years, 2 months ago) by jmc
Branch: MAIN
Changes since 1.17: +6 -3 lines
move EXF header files from lower_case.h to UPPER_CASE.h ;
 add missing cvs Header & Name

1 jmc 1.18 C $Header: $
2     C $Name: $
3    
4 edhill 1.7 #include "EXF_OPTIONS.h"
5 heimbach 1.2
6     subroutine exf_set_gen(
7 heimbach 1.10 & genfile, genstartdate, genperiod,
8     & genstartdate1, genstartdate2,
9 heimbach 1.13 & exf_inscal_gen, genremove_intercept, genremove_slope,
10 dimitri 1.3 & genfld, gen0, gen1, genmask,
11     #ifdef USE_EXF_INTERPOLATION
12     & gen_lon0, gen_lon_inc, gen_lat0, gen_lat_inc,
13 dimitri 1.11 & gen_nlon, gen_nlat, gen_xout, gen_yout, interp_method,
14 dimitri 1.3 #endif
15 heimbach 1.13 & mytime, myiter, mythid )
16 heimbach 1.2
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 dimitri 1.4 c 20-Dec-2002: mods for pkg/seaice, menemenlis@jpl.nasa.gov
26 heimbach 1.2 c heimbach@mit.edu: totally re-organized exf_set_...
27     c replaced all routines by one generic routine
28 dimitri 1.4 c 5-Aug-2003: added USE_EXF_INTERPOLATION for arbitrary
29     c input grid capability
30 dimitri 1.15 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 heimbach 1.2
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 heimbach 1.13 #include "PARAMS.h"
45 heimbach 1.2 #include "GRID.h"
46    
47 jmc 1.18 #include "EXF_PARAM.h"
48     #include "EXF_CONSTANTS.h"
49 heimbach 1.2
50     c == routine arguments ==
51    
52 heimbach 1.10 integer genstartdate1, genstartdate2
53 heimbach 1.13 _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 heimbach 1.2 character*1 genmask
60 dimitri 1.16 character*(128) genfile
61 heimbach 1.13 _RL mytime
62     integer myiter
63 heimbach 1.2 integer mythid
64 dimitri 1.16
65 dimitri 1.3 #ifdef USE_EXF_INTERPOLATION
66 dimitri 1.4 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 dimitri 1.3 _RL gen_lon0, gen_lon_inc
73     _RL gen_lat0, gen_lat_inc(MAX_LAT_INC)
74     INTEGER gen_nlon, gen_nlat
75 dimitri 1.4 _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 dimitri 1.11 integer interp_method
78 dimitri 1.16 #endif /* USE_EXF_INTERPOLATION */
79 heimbach 1.2
80     c == local variables ==
81    
82     logical first, changed
83     integer count0, count1
84 heimbach 1.10 integer year0, year1
85 dimitri 1.16 integer bi, bj, i, j, il
86 heimbach 1.2 _RL fac
87 dimitri 1.16 character*(128) genfile0, genfile1
88 heimbach 1.10
89     c == external ==
90    
91     integer ilnblnk
92     external ilnblnk
93 heimbach 1.2
94     c == end of interface ==
95    
96 dimitri 1.16 if ( genfile .NE. ' ' .and. genperiod .ne. 0 ) then
97 heimbach 1.2
98 heimbach 1.10 cph(
99     cph-exf-print if (genfile .EQ. hfluxfile) year0 = 3000
100     cph)
101 dimitri 1.15
102 dimitri 1.16 if ( genperiod .eq. -12 ) then
103 dimitri 1.15 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 heimbach 1.2 c get record numbers and interpolation factor for gen
118 dimitri 1.15 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 heimbach 1.2
129     if ( first ) then
130 dimitri 1.15 if (useExfYearlyFields.and.genperiod.gt.0) then
131 dimitri 1.12 C Complete filename with YR or _YEAR extension
132 heimbach 1.10 il = ilnblnk( genfile )
133 dimitri 1.12 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 heimbach 1.10 else
146     genfile0 = genfile
147     endif
148 dimitri 1.15
149    
150 dimitri 1.3 #ifdef USE_EXF_INTERPOLATION
151 heimbach 1.10 call exf_interp( genfile0, exf_iprec
152 dimitri 1.4 & , gen1, count0, gen_xout, gen_yout
153 dimitri 1.3 & , gen_lon0,gen_lon_inc
154     & , gen_lat0,gen_lat_inc
155 dimitri 1.5 & , gen_nlon,gen_nlat,interp_method,mythid
156 dimitri 1.3 & )
157     #else
158 heimbach 1.10 call mdsreadfield( genfile0, exf_iprec, exf_yftype, 1
159 heimbach 1.2 & , gen1, count0, mythid
160     & )
161 dimitri 1.16 #endif /* USE_EXF_INTERPOLATION */
162 heimbach 1.2
163     if (exf_yftype .eq. 'RL') then
164     call exf_filter_rl( gen1, genmask, mythid )
165     else
166     call exf_filter_rs( gen1, genmask, mythid )
167     end if
168     endif
169    
170     if (( first ) .or. ( changed )) then
171     call exf_SwapFFields( gen0, gen1, mythid )
172    
173 dimitri 1.15 if (useExfYearlyFields.and.genperiod.gt.0) then
174 dimitri 1.12 C Complete filename with YR or _YEAR extension
175 heimbach 1.10 il = ilnblnk( genfile )
176 dimitri 1.12 if (twoDigitYear) then
177     if (year1.ge.2000) then
178     write(genfile1(1:128),'(a,i2.2)')
179     & genfile(1:il),year1-2000
180     else
181     write(genfile1(1:128),'(a,i2.2)')
182     & genfile(1:il),year1-1900
183     endif
184     else
185     write(genfile1(1:128),'(2a,i4.4)')
186     & genfile(1:il),'_',year1
187     endif
188 heimbach 1.10 else
189     genfile1 = genfile
190     endif
191 dimitri 1.3 #ifdef USE_EXF_INTERPOLATION
192 heimbach 1.10 call exf_interp( genfile1, exf_iprec
193 dimitri 1.4 & , gen1, count1, gen_xout, gen_yout
194 dimitri 1.3 & , gen_lon0,gen_lon_inc
195     & , gen_lat0,gen_lat_inc
196 dimitri 1.5 & , gen_nlon,gen_nlat,interp_method,mythid
197 dimitri 1.3 & )
198     #else
199 heimbach 1.10 call mdsreadfield( genfile1, exf_iprec, exf_yftype, 1
200 heimbach 1.2 & , gen1, count1, mythid
201     & )
202 dimitri 1.16 #endif /* USE_EXF_INTERPOLATION */
203 heimbach 1.2
204     if (exf_yftype .eq. 'RL') then
205     call exf_filter_rl( gen1, genmask, mythid )
206     else
207     call exf_filter_rs( gen1, genmask, mythid )
208     end if
209     endif
210    
211     c Loop over tiles.
212     do bj = mybylo(mythid),mybyhi(mythid)
213 heimbach 1.13 do bi = mybxlo(mythid),mybxhi(mythid)
214     do j = 1,sny
215     do i = 1,snx
216     c Interpolate linearly onto the time.
217     genfld(i,j,bi,bj) = exf_inscal_gen * (
218     & fac * gen0(i,j,bi,bj) +
219     & (exf_one - fac) * gen1(i,j,bi,bj) )
220     genfld(i,j,bi,bj) =
221     & genfld(i,j,bi,bj) -
222     & exf_inscal_gen * ( genremove_intercept +
223     & genremove_slope*(mytime-starttime) )
224 heimbach 1.2 enddo
225     enddo
226     enddo
227     enddo
228    
229     endif
230    
231     end
232    
233    
234 dimitri 1.16 C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
235     C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
236 heimbach 1.2
237     subroutine exf_init_gen (
238 dimitri 1.17 & genfile, genperiod, exf_inscal_gen, genmask,
239 dimitri 1.16 & genconst, genfld, gen0, gen1,
240     #ifdef USE_EXF_INTERPOLATION
241     & gen_lon0, gen_lon_inc, gen_lat0, gen_lat_inc,
242     & gen_nlon, gen_nlat, gen_xout, gen_yout, interp_method,
243     #endif
244     & mythid )
245    
246 heimbach 1.2
247     c ==================================================================
248     c SUBROUTINE exf_init_gen
249     c ==================================================================
250     c
251     c o
252     c
253     c started: Ralf.Giering@FastOpt.de 25-Mai-2000
254     c changed: heimbach@mit.edu 10-Jan-2002
255     c heimbach@mit.edu: totally re-organized exf_set_...
256     c replaced all routines by one generic routine
257     c
258     c ==================================================================
259     c SUBROUTINE exf_init_gen
260     c ==================================================================
261    
262     implicit none
263    
264     c == global variables ==
265    
266     #include "EEPARAMS.h"
267     #include "SIZE.h"
268    
269 jmc 1.18 #include "EXF_PARAM.h"
270 heimbach 1.2
271     c == routine arguments ==
272    
273 dimitri 1.17 _RL genperiod, exf_inscal_gen, genconst
274 heimbach 1.2 _RL genfld(1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
275     _RL gen0 (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
276     _RL gen1 (1-olx:snx+olx,1-oly:sny+oly,nsx,nsy)
277 dimitri 1.16 character*1 genmask
278     character*(128) genfile
279 heimbach 1.2 integer mythid
280    
281 dimitri 1.16 #ifdef USE_EXF_INTERPOLATION
282     c gen_lon_0 ,gen_lat_0 :: longitude and latitude of SouthWest
283     c corner of global input grid
284     c gen_nlon, gen_nlat :: input x-grid and y-grid size
285     c gen_lon_inc :: scalar x-grid increment
286     c gen_lat_inc :: vector y-grid increments
287     c gen_xout, gen_yout :: coordinates for output grid
288     _RL gen_lon0, gen_lon_inc
289     _RL gen_lat0, gen_lat_inc(MAX_LAT_INC)
290     INTEGER gen_nlon, gen_nlat
291     _RS gen_xout (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
292     _RS gen_yout (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
293     integer interp_method
294     #endif /* USE_EXF_INTERPOLATION */
295    
296 heimbach 1.2 c == local variables ==
297    
298 dimitri 1.16 integer bi, bj, i, j, count
299 heimbach 1.2
300     c == end of interface ==
301    
302     do bj = mybylo(mythid), mybyhi(mythid)
303     do bi = mybxlo(mythid), mybxhi(mythid)
304 heimbach 1.9 do j = 1-oly, sny+oly
305     do i = 1-olx, snx+olx
306 heimbach 1.2 genfld(i,j,bi,bj) = genconst
307 heimbach 1.9 gen0(i,j,bi,bj) = genconst
308     gen1(i,j,bi,bj) = genconst
309 heimbach 1.2 enddo
310     enddo
311     enddo
312     enddo
313    
314 dimitri 1.17 if ( genfile .NE. ' ' .and. genperiod .eq. 0. ) then
315 dimitri 1.16 count = 1
316    
317     #ifdef USE_EXF_INTERPOLATION
318     call exf_interp( genfile, exf_iprec
319     & , genfld, count, gen_xout, gen_yout
320     & , gen_lon0,gen_lon_inc
321     & , gen_lat0,gen_lat_inc
322     & , gen_nlon,gen_nlat,interp_method,mythid
323     & )
324     #else
325     call mdsreadfield( genfile, exf_iprec, exf_yftype, 1
326     & , genfld, count, mythid
327     & )
328     #endif /* USE_EXF_INTERPOLATION */
329    
330     if (exf_yftype .eq. 'RL') then
331     call exf_filter_rl( genfld, genmask, mythid )
332     else
333     call exf_filter_rs( genfld, genmask, mythid )
334     end if
335    
336     c Loop over tiles.
337     do bj = mybylo(mythid),mybyhi(mythid)
338     do bi = mybxlo(mythid),mybxhi(mythid)
339     do j = 1,sny
340     do i = 1,snx
341     c Interpolate linearly onto the time.
342     genfld(i,j,bi,bj) =
343     & exf_inscal_gen * genfld(i,j,bi,bj)
344     enddo
345     enddo
346     enddo
347     enddo
348    
349 heimbach 1.14 endif
350    
351 heimbach 1.2 end

  ViewVC Help
Powered by ViewVC 1.1.22