/[MITgcm]/MITgcm/pkg/fizhi/update_ocean_exports.F
ViewVC logotype

Annotation of /MITgcm/pkg/fizhi/update_ocean_exports.F

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


Revision 1.5 - (hide annotations) (download)
Wed Jun 9 16:23:43 2004 UTC (20 years ago) by molod
Branch: MAIN
Changes since 1.4: +213 -309 lines
Developing input sequence for sst and sea ice

1 molod 1.3 C $Header: /u/gcmpack/MITgcm/pkg/fizhi/update_ocean_exports.F,v 1.2 2004/06/07 18:11:38 molod Exp $
2 molod 1.1 C $Name: $
3    
4     subroutine update_ocean_exports (myTime, myIter, myThid)
5     c----------------------------------------------------------------------
6     c Subroutine update_ocean_exports - 'Wrapper' routine to update
7     c the fields related to the ocean's surface that are needed
8 molod 1.3 c by fizhi (sst and sea ice extent).
9 molod 1.1 c
10     c Call: getsst (Return the current sst field-read dataset if needed)
11     c getsice (Return the current sea ice field-read data if needed)
12     c-----------------------------------------------------------------------
13     implicit none
14     #include "CPP_OPTIONS.h"
15     #include "SIZE.h"
16     #include "GRID.h"
17 molod 1.2 #include "fizhi_ocean_coms.h"
18 molod 1.1 #include "EEPARAMS.h"
19 molod 1.3 #include "chronos.h"
20 molod 1.1
21     integer myTime, myIter, myThid
22    
23 molod 1.4 integer i, j, bi, bj, biglobal, bjglobal
24 molod 1.1 integer im1, im2, jm1, jm2, idim1, idim2, jdim1, jdim2
25 molod 1.4 integer nSxglobal, nSyglobal
26 molod 1.3 integer ksst,kice
27     real sstmin
28     parameter ( sstmin = 273.16 )
29 molod 1.1
30 molod 1.4 idim1 = 1-OLx
31     idim2 = sNx+OLx
32     jdim1 = 1-OLy
33     jdim2 = sNy+OLy
34     im1 = 1
35     im2 = sNx
36     jm1 = 1
37     jm2 = sNy
38     nSxglobal = nSx*nPx
39     nSyglobal = nSy*nPy
40    
41     call mdsfindunit( ksst, myThid )
42     call mdsfindunit( kice, myThid )
43    
44     C***********************************************************************
45 molod 1.3
46 molod 1.4 DO BJ = myByLo(myThid),myByHi(myThid)
47     DO BI = myBxLo(myThid),myBxHi(myThid)
48 molod 1.3
49 molod 1.4 biglobal=bi+(myXGlobalLo-1)/im2
50     bjglobal=bj+(myYGlobalLo-1)/jm2
51    
52     call getsst(ksst,idim1,idim2,jdim1,jdim2,im1,im2,jm1,jm2,nSx,
53     . nSy,nSxglobal,nSyglobal,bi,bj,biglobal,bjglobal,nymd,nhms,sst)
54     call getsice(kice,idim1,idim2,jdim1,jdim2,im1,im2,jm1,jm2,nSx,
55     . nSy,nSxglobal,nSyglobal,bi,bj,biglobal,bjglobal,nymd,nhms,sice)
56 molod 1.3
57     c Check for Minimum Open-Water SST
58     c --------------------------------
59 molod 1.4 do j=jm1,jm2
60     do i=im1,im2
61     if(sice(i,j,bi,bj).eq.0.0 .and. sst(i,j,bi,bj).lt.sstmin)
62     . sst(i,j,bi,bj) = sstmin
63 molod 1.1 enddo
64     enddo
65    
66 molod 1.4 ENDDO
67     ENDDO
68    
69 molod 1.1 return
70     end
71 molod 1.3
72 molod 1.4 subroutine getsice(iunit,idim1,idim2,jdim1,jdim2,im1,im2,jm1,jm2,
73     . nSx,nSy,nPx,nPy,bi,bj,biglobal,bjglobal,nymd,nhms,sice)
74 molod 1.3 C************************************************************************
75     C
76     C!ROUTINE: GETSICE
77     C!DESCRIPTION: GETSICE returns the sea ice depth.
78     C! This routine is adaptable for any frequency
79     C! data upto a daily frequency.
80     C! note: for diurnal data ndmax should be increased.
81     C
82     C!INPUT PARAMETERS:
83 molod 1.4 C! iunit Unit number assigned to the sice data file
84     C! idim1 Start dimension in x-direction
85     C! idim2 End dimension in x-direction
86     C! jdim1 Start dimension in y-direction
87     C! jdim2 End dimension in y-direction
88     C! im1 Begin of x-direction span for filling sice
89     C! im2 End of x-direction span for filling sice
90     C! jm1 Begin of y-direction span for filling sice
91     C! jm2 End of y-direction span for filling sice
92     C! nSx Number of processors in x-direction (local processor)
93     C! nSy Number of processors in y-direction (local processor)
94     C! nPx Number of processors in x-direction (global)
95     C! nPy Number of processors in y-direction (global)
96     C! bi Processor number in x-direction (local to processor)
97     C! bj Processor number in y-direction (local to processor)
98     C! biglobal Processor number in x-direction (global)
99     C! bjglobal Processor number in y-direction (global)
100     C! nymd YYMMDD of the current model timestep
101     C! nhms HHMMSS of the model time
102 molod 1.3 C
103     C!OUTPUT PARAMETERS:
104 molod 1.4 C! sice(idim1:idim2,jdim1:jdim2,nSx,nSy) Sea ice depth in meters
105 molod 1.3 C
106     C!ROUTINES CALLED:
107     C
108 molod 1.4 C! bcdata Reads the data for a given unit number
109     C! bcheader Reads the header info for a given unit number
110     C! interp_time Returns weights for linear interpolation
111 molod 1.3 C
112     C--------------------------------------------------------------------------
113    
114     implicit none
115 molod 1.4 #include "CPP_OPTIONS.h"
116    
117     integer iunit,idim1,idim2,jdim1,jdim2,im1,im2,jm1,jm2,nSx,nSy
118     integer bi,bj,biglobal.bjglobal,nymd,nhms
119    
120     _RL sice(idim1:idim2,jdim1:jdim2,nSx,nSy)
121 molod 1.3
122 molod 1.4 C Maximum number of dates in one year for the data
123     integer ndmax
124 molod 1.3 parameter (ndmax = 370)
125    
126 molod 1.4 character*8 cname
127     character*80 cdscrip
128     real fac1, fac2, lat0, lon0, timebc1, timebc2, timemod, undef
129     logical first, found, error
130 molod 1.5 integer i,j,n,nn,iyear,iyearbc,nd,ndby3,imbc,jmbc,npxbc,npybd
131     integer ndatebc,nhmsbc(ndmax), nhmsbc1, nhmsbc2,nrec
132 molod 1.4 integer nymdbc(ndmax),nymdbc1,nymdbc2,nymdmod
133 molod 1.3
134 molod 1.4 real sicebc1(im2,jm2,nPx,nPy),sicebc2(im2,jm2,nPx,nPy)
135 molod 1.3
136     C--------- Variable Initialization ---------------------------------
137    
138     data first /.true./
139     data error /.false./
140    
141     c save header info
142 molod 1.5 save imbc,jmbc,npxbc,npybc,lat0,lon0,ndatebc,undef,nymdbc,nhmsbc
143 molod 1.3 save nymdbc1, nymdbc2, nhmsbc1, nhmsbc2
144     save first
145 molod 1.4 save sicebc1, sicebc2
146 molod 1.3
147     c this only works for between 1950-2050
148     if (nymd .lt. 500101) then
149     nymdmod = 20000000 + nymd
150     else if (nymd .le. 991231) then
151     nymdmod = 19000000 + nymd
152     else
153     nymdmod = nymd
154     endif
155    
156     c initialize so that first time through they have values for the check
157     c these vaules make the iyear .ne. iyearbc true anyways for
158     c for the first time so first isnt checked below.
159    
160     if (first) then
161     nymdbc(2) = 0
162     nymdbc1 = 0
163     nymdbc2 = 0
164     nhmsbc1 = 0
165     nhmsbc2 = 0
166     first = .false.
167     endif
168    
169     C---------- Read in Header file ----------------------------------
170    
171     iyear = nymdmod/10000
172     iyearbc = nymdbc(2)/10000
173    
174     if( iyear.ne.iyearbc ) then
175    
176 molod 1.5 close(iunit)
177     open (iunit,form='unformatted',access='direct',
178     . recl=im2*jm2*nPx*nPy*4)
179     nrec = 1
180     call bcheader (iunit, ndmax, nrec,
181     . cname, cdscrip, imbc, jmbc, npxbc, npybc, lat0, lon0,
182     . ndatebc, nymdbc, nhmsbc, undef, error)
183 molod 1.3
184     C--------- Check data for Compatibility ------------------------------
185    
186     C Check for correct data in boundary condition file
187     if (.not.error .and. cname.ne.'SICE') then
188 molod 1.4 write(6,*)'Wrong data in SICE boundary condition file => ',cname
189     error = .true.
190 molod 1.3 endif
191    
192     C Check Horizontal Resolution
193 molod 1.5 if(.not.error .and. imbc*jmbc*npxbc*npybc.ne.im2*jm2*npx*npy)then
194 molod 1.4 write(6,*) ' B.C. Resolution DOES NOT match Model Resolution!'
195 molod 1.5 write(6,*) ' B.C. Resolution: ',imbc*jmbc*npxbc*npybc
196     write(6,*) 'Model Resolution: ',im2*jm2*npx*npy
197 molod 1.4 error = .true.
198 molod 1.3 endif
199    
200     C Check Year
201     iyearbc = nymdbc(2)/10000
202     if (.not.error .and. iyear.ne.iyearbc .and. iyearbc.ne.0) then
203 molod 1.5 write(6,*)' B.C. Year DOES NOT match REQUESTED Year!'
204     write(6,*)' B.C. Year: ', iyearbc
205     write(6,*)'Requested Year: ', iyear
206 molod 1.4 error = .true.
207 molod 1.3 endif
208    
209 molod 1.4 if (.not.error) then
210 molod 1.3 C if climatology, fill dates for data with current model year
211 molod 1.4 if (iyearbc.eq.0) then
212     write(6,*)
213     write(6,*) 'Climatological Dataset is being used.'
214     write(6,*) 'Current model year to be used to fill Header Dates'
215     do n = 2, ndatebc-1
216     nymdbc(n) = nymdbc(n) +(nymdmod/10000)*10000
217     enddo
218 molod 1.3 C For the first date subtract 1 year from the current model NYMD
219 molod 1.4 n = 1
220     nymdbc(n) = nymdbc(n) +(nymdmod/10000-1)*10000
221 molod 1.3 C For the last date add 1 year to the current model NYMD
222 molod 1.4 n = ndatebc
223     nymdbc(n) = nymdbc(n) +(nymdmod/10000+1)*10000
224     endif
225 molod 1.3
226     C Write out header info
227 molod 1.4 write(6,*) ' Updated boundary condition data'
228     write(6,*) ' ---------------------------------'
229     write(6,*) ' Variable: ',cname
230     write(6,*) ' Description: ',cdscrip
231     write(6,*) ' Resolution: x= ',imbc,' y= ',jmbc,
232     . ' Undefined value = ',undef
233     write(6,*) ' Starting latitude = ',lat0,' longitude =',lon0
234     write(6,*) ' Data valid at these times: '
235     ndby3 = ndatebc/3
236     do n = 1, ndby3*3,3
237     write(6,1000) (nn,nymdbc(nn),nhmsbc(nn),nn=n,n+2)
238     1000 format(3(2x,i3,':',i8,2x,i8))
239     enddo
240     write(6,1000) (nn,nymdbc(nn),nhmsbc(nn),nn=ndby3*3+1,ndatebc)
241     endif
242 molod 1.3
243 molod 1.4 endif
244 molod 1.3
245     C---------- Read sice data if necessary -------------------------------
246    
247 molod 1.4 found = .false.
248     nd = 2
249 molod 1.3
250     c If model time is not within the times of saved sice data
251     c from previous call to getsice then read new data
252    
253 molod 1.4 timemod = float(nymdmod) + float(nhms) /1000000
254     timebc1 = float(nymdbc1) + float(nhmsbc1)/1000000
255     timebc2 = float(nymdbc2) + float(nhmsbc2)/1000000
256    
257     if (timemod .lt. timebc1 .or. timemod .ge. timebc2) then
258    
259     do while (.not.found .and. nd .le. ndatebc)
260     timebc2 = float(nymdbc(nd)) + float(nhmsbc(nd))/1000000
261     if (timebc2 .gt. timemod) then
262 molod 1.5 nymdbc1 = nymdbc(nd-1)
263     nymdbc2 = nymdbc(nd)
264     nhmsbc1 = nhmsbc(nd-1)
265     nhmsbc2 = nhmsbc(nd)
266     call bcdata (iunit,imbc,jmbc,nPx,nPy,nd,nd+1,sicebc1,sicebc2)
267     found = .true.
268 molod 1.4 else
269 molod 1.5 nd = nd + 1
270 molod 1.4 endif
271     enddo
272 molod 1.3
273     c Otherwise the data from the last time in getsice surrounds the
274     c current model time.
275    
276 molod 1.4 else
277     found = .true.
278     endif
279    
280     if (.not.found) then
281     print *, 'STOP: Could not find SICE dates for model time.'
282     call my_finalize
283     call my_exit (101)
284     endif
285 molod 1.3
286     C---------- Interpolate sice data ------------------------------------
287    
288 molod 1.4 call interp_time(nymdmod,nhms,nymdbc1,nhmsbc1,nymdbc2,nhmsbc2,
289     . fac1,fac2)
290 molod 1.3
291 molod 1.4 do j = jm1,jm2
292     do i = im1,im2
293     sice(i,j,bi,bj) = sicebc1(i,j,biglobal,bjglobal)*fac1
294     . + sicebc2(i,j,biglobal,bjglobal)*fac2
295 molod 1.3 c average to 0 or 1
296     c -----------------
297 molod 1.4 if (sice(i,j,bi,bj) .ge. 0.5) then
298     sice(i,j,bi,bj) = 1.
299     else
300     sice(i,j,bi,bj) = 0.
301     endif
302     enddo
303     enddo
304 molod 1.3
305     C---------- Fill sice with depth of ice ------------------------------------
306 molod 1.4 do j = jm1,jm2
307     do i = im1,im2
308     if (sice(i,j,bi,bj) .eq. 1.) then
309     sice(i,j,bi,bj) = 3.
310     endif
311     enddo
312     enddo
313 molod 1.3 C---------------------------------------------------------------------------
314    
315     return
316     end
317 molod 1.5 subroutine getsst(iunit,idim1,idim2,jdim1,jdim2,im1,im2,jm1,jm2,
318     . nSx,nSy,nPx,nPy,bi,bj,biglobal,bjglobal,nymd,nhms,sst)
319 molod 1.3 C************************************************************************
320     C
321     C!ROUTINE: GETSST
322     C!DESCRIPTION: GETSST gets the SST data.
323     C! This routine is adaptable for any frequency
324     C! data upto a daily frequency.
325     C! note: for diurnal data ndmax should be increased.
326     C
327     C!INPUT PARAMETERS:
328 molod 1.5 C! iunit Unit number assigned to the sice data file
329     C! idim1 Start dimension in x-direction
330     C! idim2 End dimension in x-direction
331     C! jdim1 Start dimension in y-direction
332     C! jdim2 End dimension in y-direction
333     C! im1 Begin of x-direction span for filling sice
334     C! im2 End of x-direction span for filling sice
335     C! jm1 Begin of y-direction span for filling sice
336     C! jm2 End of y-direction span for filling sice
337     C! nSx Number of processors in x-direction (local processor)
338     C! nSy Number of processors in y-direction (local processor)
339     C! nPx Number of processors in x-direction (global)
340     C! nPy Number of processors in y-direction (global)
341     C! bi Processor number in x-direction (local to processor)
342     C! bj Processor number in y-direction (local to processor)
343     C! biglobal Processor number in x-direction (global)
344     C! bjglobal Processor number in y-direction (global)
345     C! nymd YYMMDD of the current model timestep
346     C! nhms HHMMSS of the model time
347 molod 1.3 C
348     C!OUTPUT PARAMETERS:
349 molod 1.5 C! sst(idim1:idim2,jdim1:jdim2,nSx,nSy) Sea surface temperature (K)
350 molod 1.3 C
351     C!ROUTINES CALLED:
352     C
353     C! bcdata Reads the data for a given unit number
354     C! bcheader Reads the header info for a given unit number
355     C! interp_time Returns weights for linear interpolation
356     C
357     C--------------------------------------------------------------------------
358    
359     implicit none
360 molod 1.5 #include "CPP_OPTIONS.h"
361    
362     integer iunit,idim1,idim2,jdim1,jdim2,im1,im2,jm1,jm2,nSx,nSy
363     integer bi,bj,biglobal.bjglobal,nymd,nhms
364 molod 1.3
365 molod 1.5 _RL sst(idim1:idim2,jdim1:jdim2,nSx,nSy)
366 molod 1.3
367 molod 1.5 C Maximum number of dates in one year for the data
368     integer ndmax
369 molod 1.3 parameter (ndmax = 370)
370    
371 molod 1.5 character*8 cname
372     character*80 cdscrip
373     real fac1, fac2, lat0, lon0, timebc1, timebc2, timemod, undef
374     logical first, found, error
375     integer i,j,n,nn,iyear,iyearbc,nd,ndby3,imbc,jmbc,npxbc,npybd
376     integer ndatebc,nhmsbc(ndmax), nhmsbc1, nhmsbc2,nrec
377     integer nymdbc(ndmax),nymdbc1,nymdbc2,nymdmod
378    
379     real sstbc1(im2,jm2,nPx,nPy),sstbc2(im2,jm2,nPx,nPy)
380 molod 1.3
381     C--------- Variable Initialization ---------------------------------
382    
383     data first /.true./
384     data error /.false./
385    
386     c save header info
387 molod 1.5 save imbc,jmbc,npxbc,npybc,lat0,lon0,ndatebc,undef,nymdbc,nhmsbc
388     save nymdbc1, nymdbc2, nhmsbc1, nhmsbc2
389 molod 1.3 save first
390 molod 1.5 save sstbc1, sstbc2
391 molod 1.3
392     c this only works for between 1950-2050
393     if (nymd .lt. 500101) then
394     nymdmod = 20000000 + nymd
395     else if (nymd .le. 991231) then
396     nymdmod = 19000000 + nymd
397     else
398     nymdmod = nymd
399     endif
400    
401     c initialize so that first time through they have values for the check
402     c these vaules make the iyear .ne. iyearbc true anyways for
403     c for the first time so first isnt checked below.
404     if (first) then
405     nymdbc(2) = 0
406     nymdbc1 = 0
407     nymdbc2 = 0
408     nhmsbc1 = 0
409     nhmsbc2 = 0
410     first = .false.
411     endif
412    
413     C---------- Read in Header file ----------------------------------
414    
415     iyear = nymdmod/10000
416     iyearbc = nymdbc(2)/10000
417    
418     if( iyear.ne.iyearbc ) then
419    
420 molod 1.5 close(iunit)
421     open (iunit,form='unformatted',access='direct',
422     . recl=im2*jm2nPx*nPy*4)
423     nrec = 1
424     call bcheader (iunit, ndmax, nrec,
425     . cname, cdscrip, imbc, jmbc, npxbc, npybc, lat0, lon0,
426     . ndatebc, nymdbc, nhmsbc, undef, error)
427 molod 1.3
428     C--------- Check data for Compatibility
429    
430     C Check for correct data in boundary condition file
431     if (.not.error .and. cname.ne.'SST') then
432 molod 1.5 write(6,*)'Wrong data in SST boundary condition file => ',cname
433     error = .true.
434 molod 1.3 endif
435    
436     C Check Horizontal Resolution
437 molod 1.5 if(.not.error .and. imbc*jmbc*npxbc*npybc.ne.im2*jm2*npx*npy)then
438     write(6,*) ' B.C. Resolution DOES NOT match Model Resolution!'
439     write(6,*) ' B.C. Resolution: ',imbc*jmbc*npxbc*npybc
440     write(6,*) 'Model Resolution: ',im2*jm2*npx*npy
441     error = .true.
442 molod 1.3 endif
443    
444     C Check Year
445     iyearbc = nymdbc(2)/10000
446     if (.not.error .and. iyear.ne.iyearbc .and. iyearbc.ne.0) then
447 molod 1.5 write(6,*)' B.C. Year DOES NOT match REQUESTED Year!'
448     write(6,*)' B.C. Year: ', iyearbc
449     write(6,*)'Requested Year: ', iyear
450     error = .true.
451 molod 1.3 endif
452    
453     if (.not.error) then
454     C if climatology, fill dates for data with current model year
455 molod 1.5 if (iyearbc.eq.0) then
456     write(6,*)
457     write(6,*) 'Climatological Dataset is being used.'
458     write(6,*) 'Current model year will be used to fill Header Dates'
459     do n = 2, ndatebc-1
460     nymdbc(n) = nymdbc(n) +(nymdmod/10000)*10000
461     enddo
462 molod 1.3 C For the first date subtract 1 year from the current model NYMD
463 molod 1.5 n = 1
464     nymdbc(n) = nymdbc(n) +(nymdmod/10000-1)*10000
465 molod 1.3 C For the last date add 1 year to the current model NYMD
466 molod 1.5 n = ndatebc
467     nymdbc(n) = nymdbc(n) +(nymdmod/10000+1)*10000
468     endif
469 molod 1.3
470     C Write out header info
471 molod 1.5 write(6,*) ' Updated boundary condition data'
472     write(6,*) ' ---------------------------------'
473     write(6,*) ' Variable: ',cname
474     write(6,*) ' Description: ',cdscrip
475     write(6,*) ' Resolution: x= ',imbc,' y= ',jmbc,
476     . ' Undefined value = ',undef
477     write(6,*) ' Starting latitude = ',lat0,' longitude =',lon0
478     write(6,*) ' Data valid at these times: '
479     ndby3 = ndatebc/3
480     do n = 1, ndby3*3,3
481     write(6,1000) (nn,nymdbc(nn),nhmsbc(nn),nn=n,n+2)
482     1000 format(3(2x,i3,':',i8,2x,i8))
483     enddo
484     write(6,1000) (nn,nymdbc(nn),nhmsbc(nn),nn=ndby3*3+1,ndatebc)
485     endif ! End error Check
486 molod 1.3
487     if( error ) call my_exit (101)
488    
489     endif ! New Year Info Check
490    
491     C---------- Read SST data if necessary -------------------------------
492    
493 molod 1.5 found = .false.
494     nd = 2
495 molod 1.3
496     c If model time is not within the times of saved sst data
497     c from previous call to getsst then read new data
498    
499 molod 1.5 timemod = float(nymdmod) + float(nhms) /1000000
500     timebc1 = float(nymdbc1) + float(nhmsbc1)/1000000
501     timebc2 = float(nymdbc2) + float(nhmsbc2)/1000000
502     if (timemod .lt. timebc1 .or. timemod .ge. timebc2) then
503    
504     do while (.not.found .and. nd .le. ndatebc)
505     timebc2 = float(nymdbc(nd)) + float(nhmsbc(nd))/1000000
506     if (timebc2 .gt. timemod) then
507     nymdbc1 = nymdbc(nd-1)
508     nymdbc2 = nymdbc(nd)
509     nhmsbc1 = nhmsbc(nd-1)
510     nhmsbc2 = nhmsbc(nd)
511     call bcdata (iunit,imbc,jmbc,nPx,nPy,nd,nd+1,sstbc1,sstbc2)
512     found = .true.
513     else
514     nd = nd + 1
515     endif
516     enddo
517 molod 1.3
518     c Otherwise the data from the last time in getsst surrounds the
519     c current model time.
520    
521 molod 1.5 else
522     found = .true.
523     endif
524 molod 1.3
525 molod 1.5 if (.not.found) then
526     print *, 'STOP: Could not find SST dates for model time.'
527     call my_finalize
528     call my_exit (101)
529     endif
530 molod 1.3
531     C---------- Interpolate SST data ------------------------------------
532    
533 molod 1.5 call interp_time(nymdmod,nhms,nymdbc1,nhmsbc1,nymdbc2,nhmsbc2,
534     . fac1,fac2)
535 molod 1.3
536 molod 1.5 do j = jm1,jm2
537     do i = im1,im2
538     sst(i,j,bi,bj) = sstbc1(i,j,biglobal,bjglobal)*fac1
539     . + sstbc2(i,j,biglobal,bjglobal)*fac2
540     enddo
541     enddo
542 molod 1.3
543     return
544     end
545    
546 molod 1.5 subroutine bcdata (iunit,im,jm,nPx,nPy,nrec1,nrec2,field1,field2)
547 molod 1.3 C************************************************************************
548     C
549 molod 1.5 C!ROUTINE: BCDATA
550     C!DESCRIPTION: BCDATA reads the data from the file assigned to the
551     C! passed unit number and returns data from the two times
552     C! surrounding the current model time. The two record
553     C! postitions are not assumed to be next to each other.
554 molod 1.3 C
555     C!INPUT PARAMETERS:
556 molod 1.5 C! im number of x points
557     C! im number of x points
558     C! nPx number of faces in x-direction
559     C! nPy number of faces in y-direction
560     C! nrec1 record number of the time before the model time
561     C! nrec2 record number of the time after the model time
562 molod 1.3 C
563     C!OUTPUT PARAMETERS:
564 molod 1.5 C! field1(im,jm,nPx,nPy) data field before the model time
565     C! field2(im,jm,nPx,nPy) data field after the model time
566 molod 1.3 C
567     C--------------------------------------------------------------------------
568 molod 1.5 implicit none
569 molod 1.3
570 molod 1.5 integer iunit,im,jm,nPx,nPy,nrec1,nrec2
571 molod 1.3
572 molod 1.5 real field1(im,jm)
573     real field2(im,jm)
574 molod 1.3
575 molod 1.5 integer i,j,n1,n2
576     real*4 f1(im,jm,nPx,nPy), f1(im,jm,nPx,nPy)
577 molod 1.3
578     C--------- Read file -----------------------------------------------
579     read(iunit,rec=nrec1) f1
580     read(iunit,rec=nrec2) f2
581    
582 molod 1.5 do n2=1,nPy
583     do n1=1,nPx
584 molod 1.3 do j=1,jm
585     do i=1,im
586 molod 1.5 field1(i,j,n1,n2) = f1(i,j,n1,n2)
587     field2(i,j,n1,n2) = f2(i,j,n1,n2)
588     enddo
589     enddo
590 molod 1.3 enddo
591     enddo
592    
593     return
594     end
595     subroutine bcheader (iunit, ndmax, nrec,
596 molod 1.5 . cname, cdscrip, im, jm, npx, npy, lat0, lon0, ndatebc,
597     . nymdbc, nhmsbc, undef, error)
598 molod 1.3 C************************************************************************
599     C
600 molod 1.5 C!ROUTINE: BCHEADER
601     C!DESCRIPTION: BCHEADER reads the header from a file and returns the info.
602 molod 1.3 C
603     C!INPUT PARAMETERS:
604 molod 1.5 C! iunit unit number assigned to the data file
605     C! ndmax maximum number of date/times of the data
606     C! nrec record number of the header info (or assume 1??)
607 molod 1.3 C
608     C!OUTPUT PARAMETERS:
609 molod 1.5 C! cname name of the data in the file header
610     C! cdscrip description of the data in the file header
611     C! im number of x points
612     C! jm number of y points
613     C! npx number of faces (processors) in x-direction
614     C! npy number of faces (processors) in x-direction
615     C! lat0 starting latitude for the data grid
616     C! lon0 starting longitude for the data grid
617     C! ndatebc number of date/times of the data in the file
618     C! nymdbc(ndmax) array of dates for the data including century
619     C! nhmsbc(ndmax) array of times for the data
620     C! undef value for undefined values in the data
621     C! error logical TRUE if dataset problem
622 molod 1.3 C
623     C--------------------------------------------------------------------------
624 molod 1.5 implicit none
625 molod 1.3
626 molod 1.5 integer iunit, ndmax, nrec
627 molod 1.3
628 molod 1.5 character*8 cname
629     character*80 cdscrip
630     integer im,jm,npx,npy,ndatebc,nymdbc(ndmax),nhmsbc(ndmax)
631     real lat0,lon0,undef
632     logical error
633    
634     integer i,n
635     integer*4 im_32,jm_32,npx_32,npy_32
636     integer*4 ndatebc_32(ndmax),nhmsbc_32(ndmax)
637     real*4 lat0_32,lon0_32,undef_32
638 molod 1.3
639     C--------- Read file -----------------------------------------------
640    
641     read(iunit,rec=nrec,err=500) cname, cdscrip,
642 molod 1.5 . im_32, jm_32, npx_32, npy_32, lat0_32, lon0_32,
643     . ndatebc_32, undef_32,
644     . (nymdbc_32(i), nhmsbc_32(i), i=1,ndatebc_32)
645    
646     im = im_32
647     jm = jm_32
648     npx = npx_32
649     npy = npy_32
650     lat0 = lat0_32
651     lon0 = lon0_32
652 molod 1.3 undef = undef_32
653    
654     ndatebc = ndatebc_32
655     do i=1,ndatebc
656     nymdbc(i) = nymdbc_32(i)
657     nhmsbc(i) = nhmsbc_32(i)
658     enddo
659    
660     return
661     500 continue
662     print *, 'Error reading boundary condition from unit ',iunit
663     error = .true.
664     return
665     end

  ViewVC Help
Powered by ViewVC 1.1.22