/[MITgcm]/MITgcm/pkg/rbcs/rbcs_fields_load.F
ViewVC logotype

Contents of /MITgcm/pkg/rbcs/rbcs_fields_load.F

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


Revision 1.14 - (show annotations) (download)
Sat May 14 19:52:12 2011 UTC (13 years ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62y
Changes since 1.13: +61 -30 lines
- split RBCS.h into 3 files: RBCS_SIZE.h  RBCS_PARAMS.h  RBCS_FIELDS.h
- add capability to apply relaxation to horizontal velocity uVel & vVel

1 C $Header: /u/gcmpack/MITgcm/pkg/rbcs/rbcs_fields_load.F,v 1.13 2011/04/20 01:42:53 jmc Exp $
2 C $Name: $
3
4 #include "RBCS_OPTIONS.h"
5
6 C !ROUTINE: RBCS_FIELDS_LOAD
7 C !INTERFACE:
8 SUBROUTINE RBCS_FIELDS_LOAD( myTime, myIter, myThid )
9
10 C !DESCRIPTION: \bv
11 C *==========================================================*
12 C | SUBROUTINE RBCS_FIELDS_LOAD
13 C | o Control reading of fields from external source.
14 C *==========================================================*
15 C | RBCS External source field loading routine.
16 C | This routine is called every time we want to
17 C | load a a set of external fields. The routine decides
18 C | which fields to load and then reads them in.
19 C *==========================================================*
20 C \ev
21
22 C !USES:
23 IMPLICIT NONE
24 C === Global variables ===
25 #include "SIZE.h"
26 #include "EEPARAMS.h"
27 #include "PARAMS.h"
28 #ifdef ALLOW_PTRACERS
29 #include "PTRACERS_SIZE.h"
30 #include "PTRACERS_PARAMS.h"
31 #endif
32 #include "RBCS_SIZE.h"
33 #include "RBCS_PARAMS.h"
34 #include "RBCS_FIELDS.h"
35
36 C !INPUT/OUTPUT PARAMETERS:
37 C === Routine arguments ===
38 C myTime :: Simulation time
39 C myIter :: Simulation timestep number
40 C myThid :: Thread no. that called this routine.
41 _RL myTime
42 INTEGER myIter
43 INTEGER myThid
44
45 C !FUNCTIONS:
46 INTEGER IFNBLNK, ILNBLNK
47 EXTERNAL IFNBLNK, ILNBLNK
48
49 C !LOCAL VARIABLES:
50 C === Local arrays ===
51 C [01] :: End points for interpolation
52 C Above use static heap storage to allow exchange.
53 C aWght, bWght :: Interpolation weights
54
55 INTEGER bi, bj, i, j, k
56 INTEGER intimeP, intime0, intime1
57 _RL aWght, bWght, locTime
58 INTEGER Ifprd
59 #ifdef ALLOW_PTRACERS
60 INTEGER iTracer
61 #endif
62 INTEGER IL, initer0, initer1
63 CHARACTER*(MAX_LEN_FNAM) fullName
64 CEOP
65
66 #ifdef ALLOW_RBCS
67 CALL TIMER_START('RBCS_FIELDS_LOAD [I/O]', myThid)
68
69 C-- First call requires that we initialize everything to zero for safety
70 C <= already done in RBCS_INIT_VARIA
71
72 C-- Now calculate whether it is time to update the forcing arrays
73 bi = myBxLo(myThid)
74 bj = myByLo(myThid)
75 IF (rbcsForcingPeriod.GT.0. _d 0) THEN
76 locTime = myTime - rbcsForcingOffset
77 CALL GET_PERIODIC_INTERVAL(
78 O intimeP, intime0, intime1, bWght, aWght,
79 I rbcsForcingCycle, rbcsForcingPeriod,
80 I deltaTclock, locTime, myThid )
81 #ifdef ALLOW_DEBUG
82 IF ( debugLevel.GE.debLevA ) THEN
83 _BEGIN_MASTER(myThid)
84 WRITE(standardMessageUnit,'(A,I10,A,4I5,A,2F14.10)')
85 & ' RBCS_FIELDS_LOAD,', myIter,
86 & ' : iP,iLd,i0,i1=', intimeP,rbcsLdRec(bi,bj), intime0,intime1,
87 & ' ; Wght=', bWght, aWght
88 _END_MASTER(myThid)
89 ENDIF
90 #endif /* ALLOW_DEBUG */
91 ELSE
92 intimeP = 1
93 intime1 = 1
94 intime0 = 1
95 aWght = .5 _d 0
96 bWght = .5 _d 0
97 ENDIF
98
99 #ifdef ALLOW_AUTODIFF_TAMC
100 C- assuming that we call S/R RBCS_FIELDS_LOAD at each time-step and
101 C with increasing time, this will catch when we need to load new records;
102 C But with Adjoint run, this is not always the case => might end-up using
103 C the wrong time-records
104 IF ( intime0.NE.intimeP .OR. myIter.EQ.nIter0 ) THEN
105 #else /* ALLOW_AUTODIFF_TAMC */
106 C- Make no assumption on sequence of calls to RBCS_FIELDS_LOAD ;
107 C This is the correct formulation (works in Adjoint run).
108 C Unfortunatly, produces many recomputations <== not used until it is fixed
109 IF ( intime1.NE.rbcsLdRec(bi,bj) ) THEN
110 #endif /* ALLOW_AUTODIFF_TAMC */
111
112 C-- If the above condition is met then we need to read in
113 C data for the period ahead and the period behind myTime.
114 _BEGIN_MASTER(myThid)
115 WRITE(standardMessageUnit,'(A,I10,A,2(2I5,A))')
116 & ' RBCS_FIELDS_LOAD, it=', myIter,
117 & ' : Reading new data, i0,i1=', intime0, intime1,
118 & ' (prev=', intimeP, rbcsLdRec(bi,bj), ' )'
119 _END_MASTER(myThid)
120
121 C for rbcsSingleTimeFiles=.TRUE.
122 Ifprd = NINT(rbcsForcingPeriod/deltaTrbcs)
123 initer0 = rbcsIter0 + intime0*Ifprd
124 initer1 = rbcsIter0 + intime1*Ifprd
125
126 #ifndef DISABLE_RBCS_MOM
127 IF ( useRBCuVel .AND. relaxUFile.NE.' ' ) THEN
128 IF ( rbcsSingleTimeFiles ) THEN
129 IL=ILNBLNK( relaxUFile )
130 WRITE(fullName,'(2A,I10.10)') relaxUFile(1:IL),'.',initer0
131 CALL READ_REC_XYZ_RS(fullName, rbcu0, 1, myIter, myThid)
132 WRITE(fullName,'(2A,I10.10)') relaxUFile(1:IL),'.',initer1
133 CALL READ_REC_XYZ_RS(fullName, rbcu1, 1, myIter, myThid)
134 ELSE
135 CALL READ_REC_XYZ_RS(relaxUFile,rbcu0,intime0,myIter,myThid)
136 CALL READ_REC_XYZ_RS(relaxUFile,rbcu1,intime1,myIter,myThid)
137 ENDIF
138 ENDIF
139 IF ( useRBCvVel .AND. relaxVFile.NE.' ' ) THEN
140 IF ( rbcsSingleTimeFiles ) THEN
141 IL=ILNBLNK( relaxVFile )
142 WRITE(fullName,'(2A,I10.10)') relaxVFile(1:IL),'.',initer0
143 CALL READ_REC_XYZ_RS(fullName, rbcv0, 1, myIter, myThid)
144 WRITE(fullName,'(2A,I10.10)') relaxVFile(1:IL),'.',initer1
145 CALL READ_REC_XYZ_RS(fullName, rbcv1, 1, myIter, myThid)
146 ELSE
147 CALL READ_REC_XYZ_RS(relaxVFile,rbcv0,intime0,myIter,myThid)
148 CALL READ_REC_XYZ_RS(relaxVFile,rbcv1,intime1,myIter,myThid)
149 ENDIF
150 ENDIF
151 IF ( (useRBCuVel .AND. relaxUFile.NE.' ') .OR.
152 & (useRBCvVel .AND. relaxVFile.NE.' ') ) THEN
153 CALL EXCH_UV_XYZ_RS( rbcu0, rbcv0, .TRUE., myThid )
154 CALL EXCH_UV_XYZ_RS( rbcu1, rbcv1, .TRUE., myThid )
155 ENDIF
156 #endif /* DISABLE_RBCS_MOM */
157 IF ( useRBCtemp .AND. relaxTFile .NE. ' ' ) THEN
158 IF ( rbcsSingleTimeFiles ) THEN
159 IL=ILNBLNK( relaxTFile )
160 WRITE(fullName,'(2a,i10.10)') relaxTFile(1:IL),'.',initer0
161 CALL READ_REC_XYZ_RS(fullName, rbct0, 1, myIter, myThid)
162 WRITE(fullName,'(2a,i10.10)') relaxTFile(1:IL),'.',initer1
163 CALL READ_REC_XYZ_RS(fullName, rbct1, 1, myIter, myThid)
164 ELSE
165 CALL READ_REC_XYZ_RS(relaxTFile,rbct0,intime0,myIter,myThid)
166 CALL READ_REC_XYZ_RS(relaxTFile,rbct1,intime1,myIter,myThid)
167 ENDIF
168 CALL EXCH_XYZ_RS( rbct0 , myThid )
169 CALL EXCH_XYZ_RS( rbct1 , myThid )
170 ENDIF
171 IF ( useRBCsalt .AND. relaxSFile .NE. ' ' ) THEN
172 IF ( rbcsSingleTimeFiles ) THEN
173 IL=ILNBLNK( relaxSFile )
174 WRITE(fullName,'(2a,i10.10)') relaxSFile(1:IL),'.',initer0
175 CALL READ_REC_XYZ_RS(fullName, rbcs0, 1, myIter, myThid)
176 WRITE(fullName,'(2a,i10.10)') relaxSFile(1:IL),'.',initer1
177 CALL READ_REC_XYZ_RS(fullName, rbcs1, 1, myIter, myThid)
178 ELSE
179 CALL READ_REC_XYZ_RS(relaxSFile,rbcs0,intime0,myIter,myThid)
180 CALL READ_REC_XYZ_RS(relaxSFile,rbcs1,intime1,myIter,myThid)
181 ENDIF
182 CALL EXCH_XYZ_RS( rbcs0 , myThid )
183 CALL EXCH_XYZ_RS( rbcs1 , myThid )
184 ENDIF
185
186 #ifdef ALLOW_PTRACERS
187 IF ( usePTRACERS ) THEN
188 DO iTracer = 1, PTRACERS_numInUse
189 IF ( useRBCptrnum(iTracer) .AND.
190 & relaxPtracerFile(iTracer).NE. ' ' ) THEN
191 IF ( rbcsSingleTimeFiles ) THEN
192 IL=ILNBLNK( relaxPtracerFile(iTracer) )
193 WRITE(fullName,'(2a,i10.10)') relaxPtracerFile(iTracer)(1:IL)
194 & ,'.',initer0
195 CALL READ_REC_XYZ_RS( fullName,
196 & rbcptr0(1-Olx,1-Oly,1,1,1,iTracer),
197 & 1, myIter, myThid )
198 WRITE(fullName,'(2a,i10.10)') relaxPtracerFile(iTracer)(1:IL)
199 & ,'.',initer1
200 CALL READ_REC_XYZ_RS( fullName,
201 & rbcptr1(1-Olx,1-Oly,1,1,1,iTracer),
202 & 1, myIter, myThid )
203 ELSE
204 CALL READ_REC_XYZ_RS( relaxPtracerFile(iTracer),
205 & rbcptr0(1-Olx,1-Oly,1,1,1,iTracer),
206 & intime0, myIter, myThid )
207 CALL READ_REC_XYZ_RS( relaxPtracerFile(iTracer),
208 & rbcptr1(1-Olx,1-Oly,1,1,1,iTracer),
209 & intime1, myIter, myThid )
210 ENDIF
211 CALL EXCH_XYZ_RS( rbcptr0(1-Olx,1-Oly,1,1,1,iTracer),myThid )
212 CALL EXCH_XYZ_RS( rbcptr1(1-Olx,1-Oly,1,1,1,iTracer),myThid )
213 ENDIF
214 ENDDO
215 ENDIF
216 #endif /* ALLOW_PTRACERS */
217
218 C- save newly loaded time-record
219 DO bj = myByLo(myThid), myByHi(myThid)
220 DO bi = myBxLo(myThid), myBxHi(myThid)
221 rbcsLdRec(bi,bj) = intime1
222 ENDDO
223 ENDDO
224
225 C-- end if-block for loading new time-records
226 ENDIF
227
228 C-- Interpolate
229 DO bj = myByLo(myThid), myByHi(myThid)
230 DO bi = myBxLo(myThid), myBxHi(myThid)
231 #ifndef DISABLE_RBCS_MOM
232 IF ( useRBCuVel .OR. useRBCvVel ) THEN
233 DO k=1,Nr
234 DO j=1-Oly,sNy+Oly
235 DO i=1-Olx,sNx+Olx
236 RBCuVel(i,j,k,bi,bj) = bWght*rbcu0(i,j,k,bi,bj)
237 & +aWght*rbcu1(i,j,k,bi,bj)
238 RBCvVel(i,j,k,bi,bj) = bWght*rbcv0(i,j,k,bi,bj)
239 & +aWght*rbcv1(i,j,k,bi,bj)
240 ENDDO
241 ENDDO
242 ENDDO
243 ENDIF
244 #endif /* DISABLE_RBCS_MOM */
245 DO k=1,Nr
246 DO j=1-Oly,sNy+Oly
247 DO i=1-Olx,sNx+Olx
248 RBCtemp(i,j,k,bi,bj) = bWght*rbct0(i,j,k,bi,bj)
249 & +aWght*rbct1(i,j,k,bi,bj)
250 RBCsalt(i,j,k,bi,bj) = bWght*rbcs0(i,j,k,bi,bj)
251 & +aWght*rbcs1(i,j,k,bi,bj)
252 ENDDO
253 ENDDO
254 ENDDO
255 ENDDO
256 ENDDO
257
258 #ifdef ALLOW_PTRACERS
259 IF ( usePTRACERS ) THEN
260 DO iTracer = 1, PTRACERS_numInUse
261 IF (useRBCptrnum(iTracer)) THEN
262 DO bj = myByLo(myThid), myByHi(myThid)
263 DO bi = myBxLo(myThid), myBxHi(myThid)
264 DO k=1,Nr
265 DO j=1-Oly,sNy+Oly
266 DO i=1-Olx,sNx+Olx
267 RBC_ptracers(i,j,k,bi,bj,iTracer) =
268 & bWght*rbcptr0(i,j,k,bi,bj,iTracer)
269 & +aWght*rbcptr1(i,j,k,bi,bj,iTracer)
270 ENDDO
271 ENDDO
272 ENDDO
273 ENDDO
274 ENDDO
275 ENDIF
276 ENDDO
277 ENDIF
278 #endif /* ALLOW_PTRACERS */
279
280 CALL TIMER_STOP ('RBCS_FIELDS_LOAD [I/O]', myThid)
281
282 #endif /* ALLOW_RBCS */
283
284 RETURN
285 END

  ViewVC Help
Powered by ViewVC 1.1.22