/[MITgcm]/MITgcm/pkg/obcs/obcs_external_fields_load.F
ViewVC logotype

Contents of /MITgcm/pkg/obcs/obcs_external_fields_load.F

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


Revision 1.10 - (show annotations) (download)
Thu Nov 8 22:26:22 2007 UTC (16 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint60, checkpoint61, checkpoint59q, checkpoint59p, checkpoint59r, checkpoint59m, checkpoint59l, checkpoint59o, checkpoint59n, checkpoint59k, checkpoint59j, checkpoint61b, checkpoint61c, checkpoint61a
Changes since 1.9: +15 -15 lines
use a stardard way to compute coeff. for time interpolation
 (like in external_fields_load.F or bulkf_fields_load.F):
make results less dependent on compiler or platform.

1 C $Header: /u/gcmpack/MITgcm/pkg/obcs/obcs_external_fields_load.F,v 1.9 2007/11/05 19:19:05 jmc Exp $
2 C $Name: $
3 #include "OBCS_OPTIONS.h"
4
5 CBOP
6 C !ROUTINE: OBCS_EXTERNAL_FIELDS_LOAD
7 C !INTERFACE:
8 SUBROUTINE OBCS_EXTERNAL_FIELDS_LOAD( myTime, myIter, myThid )
9 C !DESCRIPTION: \bv
10 C *==========================================================*
11 C | SUBROUTINE OBCS_EXTERNAL_FIELDS_LOAD
12 C | o Control reading of fields from external source.
13 C *==========================================================*
14 C | External source field loading routine for open boundaries.
15 C | This routine is called every time we want to
16 C | load a a set of external open boundary fields.
17 C | Only if there are fields available (file names are not empty)
18 C | the open boundary fields are overwritten.
19 C | The routine decides which fields to load and then reads them in.
20 C | This routine needs to be customised for particular
21 C | experiments.
22 C | Notes
23 C | =====
24 C | Two-dimensional and three-dimensional I/O are handled in
25 C | the following way under MITgcmUV. A master thread
26 C | performs I/O using system calls. This threads reads data
27 C | into a temporary buffer. At present the buffer is loaded
28 C | with the entire model domain. This is probably OK for now
29 C | Each thread then copies data from the buffer to the
30 C | region of the proper array it is responsible for.
31 C | =====
32 C | This routine is the complete analogue to external_fields_load,
33 C | except for exchanges of forcing fields. These are done in
34 C | obcs_precribe_exchanges, which is called from dynamics.
35 C | - Forcing period and cycle are the same as for other fields
36 C | in external forcing.
37 C | - constant boundary values are also read here and not
38 C | directly in obcs_init_variables (which calls obcs_calc
39 C | which in turn calls this routine)
40 C *==========================================================*
41 C \ev
42
43 C !USES:
44 IMPLICIT NONE
45 C === Global variables ===
46 #include "SIZE.h"
47 #include "EEPARAMS.h"
48 #include "PARAMS.h"
49 #include "GRID.h"
50
51 C !INPUT/OUTPUT PARAMETERS:
52 C === Routine arguments ===
53 C myThid - Thread no. that called this routine.
54 C myTime - Simulation time
55 C myIter - Simulation timestep number
56 INTEGER myThid
57 _RL myTime
58 INTEGER myIter
59
60 C if external forcing (exf) package is enabled, all loading of external
61 C fields is done by exf
62 #if (defined ALLOW_OBCS && defined ALLOW_OBCS_PRESCRIBE && !defined ALLOW_EXF)
63 C
64 #include "OBCS.h"
65 #ifdef ALLOW_PTRACERS
66 #include "PTRACERS_SIZE.h"
67 #include "OBCS_PTRACERS.h"
68 #include "PTRACERS_PARAMS.h"
69 c#include "PTRACERS_FIELDS.h"
70 #endif /* ALLOW_PTRACERS */
71
72 C !LOCAL VARIABLES:
73 C === Local arrays ===
74 C aWght, bWght :: Interpolation weights
75 C msgBuf :: Informational/error meesage buffer
76 INTEGER intime0,intime1,iTracer
77 _RL aWght,bWght,rdt
78 INTEGER nForcingPeriods,Imytm,Ifprd,Ifcyc,Iftm
79 CHARACTER*(MAX_LEN_MBUF) msgBuf
80 CEOP
81
82 IF ( periodicExternalForcing ) THEN
83
84 C Now calculate whether it is time to update the forcing arrays
85 rdt = 1. _d 0 / deltaTclock
86 nForcingPeriods = NINT(externForcingCycle/externForcingPeriod)
87 Imytm = NINT(myTime*rdt)
88 Ifprd = NINT(externForcingPeriod*rdt)
89 Ifcyc = NINT(externForcingCycle*rdt)
90 Iftm = MOD( Imytm+Ifcyc-Ifprd/2, Ifcyc)
91
92 intime0 = 1 + INT(Iftm/Ifprd)
93 intime1 = 1 + MOD(intime0,nForcingPeriods)
94 c aWght = DFLOAT( Iftm-Ifprd*(intime0 - 1) ) / DFLOAT( Ifprd )
95 aWght = FLOAT( Iftm-Ifprd*(intime0 - 1) )
96 bWght = FLOAT( Ifprd )
97 aWght = aWght / bWght
98 bWght = 1. _d 0 - aWght
99
100 IF (
101 & Iftm-Ifprd*(intime0-1) .EQ. 0
102 & .OR. myIter .EQ. nIter0
103 & ) THEN
104
105 _BARRIER
106 _BEGIN_MASTER(myThid)
107
108 C If the above condition is met then we need to read in
109 C data for the period ahead and the period behind myTime.
110 WRITE(msgBuf,'(1X,A,2I5,I10,1P1E20.12)')
111 & 'OBCS_EXTERNAL_FIELDS_LOAD: Reading new data:',
112 & intime0, intime1, myIter, myTime
113 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,
114 & SQUEEZE_RIGHT,myThid)
115
116 #ifdef ALLOW_MDSIO
117 #ifdef ALLOW_OBCS_EAST
118 C Eastern boundary
119 IF ( OBEuFile .NE. ' ' ) THEN
120 CALL MDSREADFIELDYZ ( OBEuFile, readBinaryPrec,
121 & 'RL', Nr, OBEu0, intime0, myThid )
122 CALL MDSREADFIELDYZ ( OBEuFile, readBinaryPrec,
123 & 'RL', Nr, OBEu1, intime1, myThid )
124 ENDIF
125 IF ( OBEvFile .NE. ' ' ) THEN
126 CALL MDSREADFIELDYZ ( OBEvFile, readBinaryPrec,
127 & 'RL', Nr, OBEv0, intime0, myThid )
128 CALL MDSREADFIELDYZ ( OBEvFile, readBinaryPrec,
129 & 'RL', Nr, OBEv1, intime1, myThid )
130 ENDIF
131 IF ( OBEtFile .NE. ' ' ) THEN
132 CALL MDSREADFIELDYZ ( OBEtFile, readBinaryPrec,
133 & 'RL', Nr, OBEt0, intime0, myThid )
134 CALL MDSREADFIELDYZ ( OBEtFile, readBinaryPrec,
135 & 'RL', Nr, OBEt1, intime1, myThid )
136 ENDIF
137 IF ( OBEsFile .NE. ' ' ) THEN
138 CALL MDSREADFIELDYZ ( OBEsFile, readBinaryPrec,
139 & 'RL', Nr, OBEs0, intime0, myThid )
140 CALL MDSREADFIELDYZ ( OBEsFile, readBinaryPrec,
141 & 'RL', Nr, OBEs1, intime1, myThid )
142 ENDIF
143 #endif /* ALLOW_OBCS_WEST */
144 #ifdef ALLOW_OBCS_WEST
145 C Western boundary
146 IF ( OBWuFile .NE. ' ' ) THEN
147 CALL MDSREADFIELDYZ ( OBWuFile, readBinaryPrec,
148 & 'RL', Nr, OBWu0, intime0, myThid )
149 CALL MDSREADFIELDYZ ( OBWuFile, readBinaryPrec,
150 & 'RL', Nr, OBWu1, intime1, myThid )
151 ENDIF
152 IF ( OBWvFile .NE. ' ' ) THEN
153 CALL MDSREADFIELDYZ ( OBWvFile, readBinaryPrec,
154 & 'RL', Nr, OBWv0, intime0, myThid )
155 CALL MDSREADFIELDYZ ( OBWvFile, readBinaryPrec,
156 & 'RL', Nr, OBWv1, intime1, myThid )
157 ENDIF
158 IF ( OBWtFile .NE. ' ' ) THEN
159 CALL MDSREADFIELDYZ ( OBWtFile, readBinaryPrec,
160 & 'RL', Nr, OBWt0, intime0, myThid )
161 CALL MDSREADFIELDYZ ( OBWtFile, readBinaryPrec,
162 & 'RL', Nr, OBWt1, intime1, myThid )
163 ENDIF
164 IF ( OBWsFile .NE. ' ' ) THEN
165 CALL MDSREADFIELDYZ ( OBWsFile, readBinaryPrec,
166 & 'RL', Nr, OBWs0, intime0, myThid )
167 CALL MDSREADFIELDYZ ( OBWsFile, readBinaryPrec,
168 & 'RL', Nr, OBWs1, intime1, myThid )
169 ENDIF
170 #endif /* ALLOW_OBCS_WEST */
171 #ifdef ALLOW_OBCS_NORTH
172 C Northern boundary
173 IF ( OBNuFile .NE. ' ' ) THEN
174 CALL MDSREADFIELDXZ ( OBNuFile, readBinaryPrec,
175 & 'RL', Nr, OBNu0, intime0, myThid )
176 CALL MDSREADFIELDXZ ( OBNuFile, readBinaryPrec,
177 & 'RL', Nr, OBNu1, intime1, myThid )
178 ENDIF
179 IF ( OBNvFile .NE. ' ' ) THEN
180 CALL MDSREADFIELDXZ ( OBNvFile, readBinaryPrec,
181 & 'RL', Nr, OBNv0, intime0, myThid )
182 CALL MDSREADFIELDXZ ( OBNvFile, readBinaryPrec,
183 & 'RL', Nr, OBNv1, intime1, myThid )
184 ENDIF
185 IF ( OBNtFile .NE. ' ' ) THEN
186 CALL MDSREADFIELDXZ ( OBNtFile, readBinaryPrec,
187 & 'RL', Nr, OBNt0, intime0, myThid )
188 CALL MDSREADFIELDXZ ( OBNtFile, readBinaryPrec,
189 & 'RL', Nr, OBNt1, intime1, myThid )
190 ENDIF
191 IF ( OBNsFile .NE. ' ' ) THEN
192 CALL MDSREADFIELDXZ ( OBNsFile, readBinaryPrec,
193 & 'RL', Nr, OBNs0, intime0, myThid )
194 CALL MDSREADFIELDXZ ( OBNsFile, readBinaryPrec,
195 & 'RL', Nr, OBNs1, intime1, myThid )
196 ENDIF
197 #endif /* ALLOW_OBCS_NORTH */
198 #ifdef ALLOW_OBCS_SOUTH
199 C Southern boundary
200 IF ( OBSuFile .NE. ' ' ) THEN
201 CALL MDSREADFIELDXZ ( OBSuFile, readBinaryPrec,
202 & 'RL', Nr, OBSu0, intime0, myThid )
203 CALL MDSREADFIELDXZ ( OBSuFile, readBinaryPrec,
204 & 'RL', Nr, OBSu1, intime1, myThid )
205 ENDIF
206 IF ( OBSvFile .NE. ' ' ) THEN
207 CALL MDSREADFIELDXZ ( OBSvFile, readBinaryPrec,
208 & 'RL', Nr, OBSv0, intime0, myThid )
209 CALL MDSREADFIELDXZ ( OBSvFile, readBinaryPrec,
210 & 'RL', Nr, OBSv1, intime1, myThid )
211 ENDIF
212 IF ( OBStFile .NE. ' ' ) THEN
213 CALL MDSREADFIELDXZ ( OBStFile, readBinaryPrec,
214 & 'RL', Nr, OBSt0, intime0, myThid )
215 CALL MDSREADFIELDXZ ( OBStFile, readBinaryPrec,
216 & 'RL', Nr, OBSt1, intime1, myThid )
217 ENDIF
218 IF ( OBSsFile .NE. ' ' ) THEN
219 CALL MDSREADFIELDXZ ( OBSsFile, readBinaryPrec,
220 & 'RL', Nr, OBSs0, intime0, myThid )
221 CALL MDSREADFIELDXZ ( OBSsFile, readBinaryPrec,
222 & 'RL', Nr, OBSs1, intime1, myThid )
223 ENDIF
224 #endif /* ALLOW_OBCS_SOUTH */
225 #ifdef ALLOW_PTRACERS
226 IF (usePTRACERS) THEN
227 C read boundary values for passive tracers
228 DO iTracer = 1, PTRACERS_numInUse
229 # ifdef ALLOW_OBCS_EAST
230 C Eastern boundary
231 IF ( OBEptrFile(iTracer) .NE. ' ' ) THEN
232 CALL MDSREADFIELDYZ ( OBEptrFile(itracer), readBinaryPrec,
233 & 'RL', Nr, OBEptr0(1-Oly,1,1,1,iTracer),
234 & intime0, myThid )
235 CALL MDSREADFIELDYZ ( OBEptrFile(itracer), readBinaryPrec,
236 & 'RL', Nr, OBEptr1(1-Oly,1,1,1,iTracer),
237 & intime1, myThid )
238 ENDIF
239 # endif /* ALLOW_OBCS_WEST */
240 # ifdef ALLOW_OBCS_WEST
241 C Western boundary
242 IF ( OBWptrFile(iTracer) .NE. ' ' ) THEN
243 CALL MDSREADFIELDYZ ( OBWptrFile(itracer), readBinaryPrec,
244 & 'RL', Nr, OBWptr0(1-Oly,1,1,1,iTracer),
245 & intime0, myThid )
246 CALL MDSREADFIELDYZ ( OBWptrFile(itracer), readBinaryPrec,
247 & 'RL', Nr, OBWptr1(1-Oly,1,1,1,iTracer),
248 & intime1, myThid )
249 ENDIF
250 # endif /* ALLOW_OBCS_WEST */
251 # ifdef ALLOW_OBCS_NORTH
252 C Northern boundary
253 IF ( OBNptrFile(iTracer) .NE. ' ' ) THEN
254 CALL MDSREADFIELDXZ ( OBNptrFile(itracer), readBinaryPrec,
255 & 'RL', Nr, OBNptr0(1-Olx,1,1,1,iTracer),
256 & intime0, myThid )
257 CALL MDSREADFIELDXZ ( OBNptrFile(itracer), readBinaryPrec,
258 & 'RL', Nr, OBNptr1(1-Olx,1,1,1,iTracer),
259 & intime1, myThid )
260 ENDIF
261 # endif /* ALLOW_OBCS_NORTH */
262 # ifdef ALLOW_OBCS_SOUTH
263 C Southern boundary
264 IF ( OBSptrFile(iTracer) .NE. ' ' ) THEN
265 CALL MDSREADFIELDXZ ( OBSptrFile(itracer), readBinaryPrec,
266 & 'RL', Nr, OBSptr0(1-Olx,1,1,1,iTracer),
267 & intime0, myThid )
268 CALL MDSREADFIELDXZ ( OBSptrFile(itracer), readBinaryPrec,
269 & 'RL', Nr, OBSptr1(1-Olx,1,1,1,iTracer),
270 & intime1, myThid )
271 ENDIF
272 # endif /* ALLOW_OBCS_SOUTH */
273 C end do iTracer
274 ENDDO
275 C end if (usePTRACERS)
276 ENDIF
277 #endif /* ALLOW_PTRACERS */
278 #else /* ALLOW_MDSIO */
279 STOP 'ABNORMAL END: OBCS_EXTERNAL_FIELDS_LOAD: NEEDS MSDIO PKG'
280 #endif /* ALLOW_MDSIO */
281
282 _END_MASTER(myThid)
283 C
284 C At this point in external_fields_load the input fields are exchanged.
285 C However, we do not have exchange routines for vertical
286 C slices and they are not planned, either, so the approriate fields
287 C are exchanged after the open boundary conditions have been
288 C applied. (in DYNAMICS and DO_FIELDS_BLOCKING_EXCHANGES)
289 _BARRIER
290
291 C end if time to read new data
292 ENDIF
293
294 C if not periodicForcing
295 ELSE
296 aWght = 0. _d 0
297 bWght = 1. _d 0
298 C read boundary values once and for all
299 IF ( myIter .EQ. nIter0 ) THEN
300 _BARRIER
301 _BEGIN_MASTER(myThid)
302 C Read constant boundary conditions only for myIter = nIter0
303 WRITE(msgBuf,'(1X,A,I10,1P1E20.12)')
304 & 'OBCS_EXTERNAL_FIELDS_LOAD: Reading initial data:',
305 & myIter, myTime
306 CALL PRINT_MESSAGE(msgBuf,standardMessageUnit,
307 & SQUEEZE_RIGHT,myThid)
308 inTime0 = 1
309 #ifdef ALLOW_MDSIO
310 #ifdef ALLOW_OBCS_EAST
311 C Eastern boundary
312 IF ( OBEuFile .NE. ' ' ) THEN
313 CALL MDSREADFIELDYZ ( OBEuFile, readBinaryPrec,
314 & 'RL', Nr, OBEu0, inTime0, myThid )
315 ENDIF
316 IF ( OBEvFile .NE. ' ' ) THEN
317 CALL MDSREADFIELDYZ ( OBEvFile, readBinaryPrec,
318 & 'RL', Nr, OBEv0, inTime0, myThid )
319 ENDIF
320 IF ( OBEtFile .NE. ' ' ) THEN
321 CALL MDSREADFIELDYZ ( OBEtFile, readBinaryPrec,
322 & 'RL', Nr, OBEt0, inTime0, myThid )
323 ENDIF
324 IF ( OBEsFile .NE. ' ' ) THEN
325 CALL MDSREADFIELDYZ ( OBEsFile, readBinaryPrec,
326 & 'RL', Nr, OBEs0, inTime0, myThid )
327 ENDIF
328 #endif /* ALLOW_OBCS_WEST */
329 #ifdef ALLOW_OBCS_WEST
330 C Western boundary
331 IF ( OBWuFile .NE. ' ' ) THEN
332 CALL MDSREADFIELDYZ ( OBWuFile, readBinaryPrec,
333 & 'RL', Nr, OBWu0, inTime0, myThid )
334 ENDIF
335 IF ( OBWvFile .NE. ' ' ) THEN
336 CALL MDSREADFIELDYZ ( OBWvFile, readBinaryPrec,
337 & 'RL', Nr, OBWv0, inTime0, myThid )
338 ENDIF
339 IF ( OBWtFile .NE. ' ' ) THEN
340 CALL MDSREADFIELDYZ ( OBWtFile, readBinaryPrec,
341 & 'RL', Nr, OBWt0, inTime0, myThid )
342 ENDIF
343 IF ( OBWsFile .NE. ' ' ) THEN
344 CALL MDSREADFIELDYZ ( OBWsFile, readBinaryPrec,
345 & 'RL', Nr, OBWs0, inTime0, myThid )
346 ENDIF
347 #endif /* ALLOW_OBCS_WEST */
348 #ifdef ALLOW_OBCS_NORTH
349 C Northern boundary
350 IF ( OBNuFile .NE. ' ' ) THEN
351 CALL MDSREADFIELDXz ( OBNuFile, readBinaryPrec,
352 & 'RL', Nr, OBNu0, inTime0, myThid )
353 ENDIF
354 IF ( OBNvFile .NE. ' ' ) THEN
355 CALL MDSREADFIELDXZ ( OBNvFile, readBinaryPrec,
356 & 'RL', Nr, OBNv0, inTime0, myThid )
357 ENDIF
358 IF ( OBNtFile .NE. ' ' ) THEN
359 CALL MDSREADFIELDXZ ( OBNtFile, readBinaryPrec,
360 & 'RL', Nr, OBNt0, inTime0, myThid )
361 ENDIF
362 IF ( OBNsFile .NE. ' ' ) THEN
363 CALL MDSREADFIELDXZ ( OBNsFile, readBinaryPrec,
364 & 'RL', Nr, OBNs0, inTime0, myThid )
365 ENDIF
366 #endif /* ALLOW_OBCS_NORTH */
367 #ifdef ALLOW_OBCS_SOUTH
368 C Southern boundary
369 IF ( OBSuFile .NE. ' ' ) THEN
370 CALL MDSREADFIELDXz ( OBSuFile, readBinaryPrec,
371 & 'RL', Nr, OBSu0, inTime0, myThid )
372 ENDIF
373 IF ( OBSvFile .NE. ' ' ) THEN
374 CALL MDSREADFIELDXZ ( OBSvFile, readBinaryPrec,
375 & 'RL', Nr, OBSv0, inTime0, myThid )
376 ENDIF
377 IF ( OBStFile .NE. ' ' ) THEN
378 CALL MDSREADFIELDXZ ( OBStFile, readBinaryPrec,
379 & 'RL', Nr, OBSt0, inTime0, myThid )
380 ENDIF
381 IF ( OBSsFile .NE. ' ' ) THEN
382 CALL MDSREADFIELDXZ ( OBSsFile, readBinaryPrec,
383 & 'RL', Nr, OBSs0, inTime0, myThid )
384 ENDIF
385 #endif /* ALLOW_OBCS_SOUTH */
386 #ifdef ALLOW_PTRACERS
387 IF (usePTRACERS) THEN
388 C read passive tracer boundary values
389 DO iTracer = 1, PTRACERS_numInUse
390 # ifdef ALLOW_OBCS_EAST
391 C Eastern boundary
392 IF ( OBEptrFile(iTracer) .NE. ' ' ) THEN
393 CALL MDSREADFIELDYZ ( OBEptrFile(iTracer), readBinaryPrec,
394 & 'RL', Nr, OBEptr0(1-Oly,1,1,1,iTracer),
395 & inTime0, myThid )
396 ENDIF
397 # endif /* ALLOW_OBCS_WEST */
398 # ifdef ALLOW_OBCS_WEST
399 C Western boundary
400 IF ( OBWptrFile(iTracer) .NE. ' ' ) THEN
401 CALL MDSREADFIELDYZ ( OBWptrFile(iTracer), readBinaryPrec,
402 & 'RL', Nr, OBWptr0(1-Oly,1,1,1,iTracer),
403 & inTime0, myThid )
404 ENDIF
405 # endif /* ALLOW_OBCS_WEST */
406 # ifdef ALLOW_OBCS_NORTH
407 C Northern boundary
408 IF ( OBNptrFile(iTracer) .NE. ' ' ) THEN
409 CALL MDSREADFIELDXZ ( OBNptrFile(iTracer), readBinaryPrec,
410 & 'RL', Nr, OBNptr0(1-Olx,1,1,1,iTracer),
411 & inTime0, myThid )
412 ENDIF
413 # endif /* ALLOW_OBCS_NORTH */
414 # ifdef ALLOW_OBCS_SOUTH
415 C Southern boundary
416 IF ( OBSptrFile(iTracer) .NE. ' ' ) THEN
417 CALL MDSREADFIELDXZ ( OBSptrFile(iTracer), readBinaryPrec,
418 & 'RL', Nr, OBSptr0(1-Olx,1,1,1,iTracer),
419 & inTime0, myThid )
420 ENDIF
421 # endif /* ALLOW_OBCS_SOUTH */
422 C end do iTracer
423 ENDDO
424 C end if (usePTRACERS)
425 ENDIF
426 #endif /* ALLOW_PTRACERS */
427 #else /* ALLOW_MDSIO */
428 STOP 'ABNORMAL END: OBCS_EXTERNAL_FIELDS_LOAD: NEEDS MSDIO PKG'
429 #endif /* ALLOW_MDSIO */
430 _END_MASTER(myThid)
431 _BARRIER
432 C endif myIter .EQ. nIter0
433 ENDIF
434 C endif for periodicForcing
435 ENDIF
436
437 C-- Now interpolate OBSu, OBSv, OBSt, OBSs, OBSptr, etc.
438 C-- For periodicForcing, aWght = 0. and bWght = 1. so that the
439 C-- interpolation boilds down to copying the time-independent
440 C-- forcing field OBSu0 to OBSu
441 #ifdef ALLOW_OBCS_EAST
442 IF ( OBEuFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_YZ(
443 & OBEu, OBEu0, OBEu1, aWght, bWght, myThid )
444 IF ( OBEvFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_YZ(
445 & OBEv, OBEv0, OBEv1, aWght, bWght, myThid )
446 IF ( OBEtFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_YZ(
447 & OBEt, OBEt0, OBEt1, aWght, bWght, myThid )
448 IF ( OBEsFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_YZ(
449 & OBEs, OBEs0, OBEs1, aWght, bWght, myThid )
450 #endif /* ALLOW_OBCS_EAST */
451 #ifdef ALLOW_OBCS_WEST
452 IF ( OBWuFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_YZ(
453 & OBWu, OBWu0, OBWu1, aWght, bWght, myThid )
454 IF ( OBWvFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_YZ(
455 & OBWv, OBWv0, OBWv1, aWght, bWght, myThid )
456 IF ( OBWtFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_YZ(
457 & OBWt, OBWt0, OBWt1, aWght, bWght, myThid )
458 IF ( OBWsFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_YZ(
459 & OBWs, OBWs0, OBWs1, aWght, bWght, myThid )
460 #endif /* ALLOW_OBCS_WEST */
461 #ifdef ALLOW_OBCS_NORTH
462 IF ( OBNuFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_XZ(
463 & OBNu, OBNu0, OBNu1, aWght, bWght, myThid )
464 IF ( OBNvFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_XZ(
465 & OBNv, OBNv0, OBNv1, aWght, bWght, myThid )
466 IF ( OBNtFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_XZ(
467 & OBNt, OBNt0, OBNt1, aWght, bWght, myThid )
468 IF ( OBNsFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_XZ(
469 & OBNs, OBNs0, OBNs1, aWght, bWght, myThid )
470 #endif /* ALLOW_OBCS_NORTH */
471 #ifdef ALLOW_OBCS_SOUTH
472 IF ( OBSuFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_XZ(
473 & OBSu, OBSu0, OBSu1, aWght, bWght, myThid )
474 IF ( OBSvFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_XZ(
475 & OBSv, OBSv0, OBSv1, aWght, bWght, myThid )
476 IF ( OBStFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_XZ(
477 & OBSt, OBSt0, OBSt1, aWght, bWght, myThid )
478 IF ( OBSsFile .NE. ' ' ) CALL OBCS_EXTERNAL_FIELDS_INTERP_XZ(
479 & OBSs, OBSs0, OBSs1, aWght, bWght, myThid )
480 #endif /* ALLOW_OBCS_SOUTH */
481 #ifdef ALLOW_PTRACERS
482 IF (usePTRACERS) THEN
483 C "interpolate" passive tracer boundary values
484 DO iTracer = 1, PTRACERS_numInUse
485 # ifdef ALLOW_OBCS_EAST
486 IF ( OBEptrFile(iTracer) .NE. ' ' )
487 & CALL OBCS_EXTERNAL_FIELDS_INTERP_YZ(
488 O OBEptr (1-Oly,1,1,1,iTracer),
489 I OBEptr0(1-Oly,1,1,1,iTracer),
490 I OBEptr1(1-Oly,1,1,1,iTracer), aWght, bWght, myThid )
491 # endif /* ALLOW_OBCS_EAST */
492 # ifdef ALLOW_OBCS_WEST
493 IF ( OBWptrFile(iTracer) .NE. ' ' )
494 & CALL OBCS_EXTERNAL_FIELDS_INTERP_YZ(
495 O OBWptr (1-Oly,1,1,1,iTracer),
496 I OBWptr0(1-Oly,1,1,1,iTracer),
497 I OBWptr1(1-Oly,1,1,1,iTracer), aWght, bWght, myThid )
498 # endif /* ALLOW_OBCS_WEST */
499 # ifdef ALLOW_OBCS_NORTH
500 IF ( OBNptrFile(iTracer) .NE. ' ' )
501 & CALL OBCS_EXTERNAL_FIELDS_INTERP_XZ(
502 O OBNptr (1-Olx,1,1,1,iTracer),
503 I OBNptr0(1-Olx,1,1,1,iTracer),
504 I OBNptr1(1-Olx,1,1,1,iTracer), aWght, bWght, myThid )
505 # endif /* ALLOW_OBCS_NORTH */
506 # ifdef ALLOW_OBCS_SOUTH
507 IF ( OBSptrFile(iTracer) .NE. ' ' )
508 & CALL OBCS_EXTERNAL_FIELDS_INTERP_XZ(
509 O OBSptr (1-Olx,1,1,1,iTracer),
510 I OBSptr0(1-Olx,1,1,1,iTracer),
511 I OBSptr1(1-Olx,1,1,1,iTracer), aWght, bWght, myThid )
512 # endif /* ALLOW_OBCS_SOUTH */
513 C end do iTracer
514 ENDDO
515 C end if (usePTRACERS)
516 ENDIF
517 #endif /* ALLOW_PTRACERS */
518 CMLC endif for periodicForcing
519 CML ENDIF
520
521 RETURN
522 END
523
524 CBOP
525 C !ROUTINE: OBCS_EXTERNAL_FIELDS_INTERP_XZ
526 C !INTERFACE:
527 SUBROUTINE OBCS_EXTERNAL_FIELDS_INTERP_XZ(
528 O fld,
529 I fld0, fld1, aWght, bWght, myThid )
530 C !DESCRIPTION: \bv
531 C *==========================================================*
532 C | SUBROUTINE OBCS_EXTERNAL_FIELDS_INTERP_XZ
533 C | o Interpolate between to records
534 C *==========================================================*
535 C \ev
536
537 C !USES:
538 IMPLICIT NONE
539 C === Global variables ===
540 #include "SIZE.h"
541 #include "EEPARAMS.h"
542 #include "PARAMS.h"
543
544 C !INPUT/OUTPUT PARAMETERS:
545 C === Routine arguments ===
546 C myThid - Thread no. that called this routine.
547 C aWght, bWght :: Interpolation weights
548 INTEGER myThid
549 _RL aWght,bWght
550 _RL fld (1-Olx:sNx+Olx,Nr,nSx,nSy)
551 _RL fld0(1-Olx:sNx+Olx,Nr,nSx,nSy)
552 _RL fld1(1-Olx:sNx+Olx,Nr,nSx,nSy)
553
554 C !LOCAL VARIABLES:
555 C === Local arrays ===
556 C bi,bj,i,j :: loop counters
557 INTEGER bi,bj,i,k
558 CEOP
559 DO bj = myByLo(myThid), myByHi(myThid)
560 DO bi = myBxLo(myThid), myBxHi(myThid)
561 DO K = 1, Nr
562 DO i=1-Olx,sNx+Olx
563 fld(i,k,bi,bj) = bWght*fld0(i,k,bi,bj)
564 & +aWght*fld1(i,k,bi,bj)
565 ENDDO
566 ENDDO
567 ENDDO
568 ENDDO
569
570 RETURN
571 END
572 CBOP
573 C !ROUTINE: OBCS_EXTERNAL_FIELDS_INTERP_YZ
574 C !INTERFACE:
575 SUBROUTINE OBCS_EXTERNAL_FIELDS_INTERP_YZ(
576 O fld,
577 I fld0, fld1, aWght, bWght, myThid )
578 C !DESCRIPTION: \bv
579 C *==========================================================*
580 C | SUBROUTINE OBCS_EXTERNAL_FIELDS_INTERP_YZ
581 C | o Interpolate between to records
582 C *==========================================================*
583 C \ev
584
585 C !USES:
586 IMPLICIT NONE
587 C === Global variables ===
588 #include "SIZE.h"
589 #include "EEPARAMS.h"
590 #include "PARAMS.h"
591
592 C !INPUT/OUTPUT PARAMETERS:
593 C === Routine arguments ===
594 C myThid - Thread no. that called this routine.
595 C aWght, bWght :: Interpolation weights
596 INTEGER myThid
597 _RL aWght,bWght
598 _RL fld (1-Oly:sNy+Oly,Nr,nSx,nSy)
599 _RL fld0(1-Oly:sNy+Oly,Nr,nSx,nSy)
600 _RL fld1(1-Oly:sNy+Oly,Nr,nSx,nSy)
601
602 C !LOCAL VARIABLES:
603 C === Local arrays ===
604 C bi,bj,i,j :: loop counters
605 INTEGER bi,bj,j,k
606 CEOP
607 DO bj = myByLo(myThid), myByHi(myThid)
608 DO bi = myBxLo(myThid), myBxHi(myThid)
609 DO K = 1, Nr
610 DO j=1-Oly,sNy+Oly
611 fld(j,k,bi,bj) = bWght*fld0(j,k,bi,bj)
612 & +aWght*fld1(j,k,bi,bj)
613 ENDDO
614 ENDDO
615 ENDDO
616 ENDDO
617
618 #endif /* ALLOW_OBCS AND ALLOW_OBCS_PRESCRIBE AND .NOT. ALLOW_EXF */
619
620 RETURN
621 END

  ViewVC Help
Powered by ViewVC 1.1.22