/[MITgcm]/MITgcm/pkg/ptracers/ptracers_read_pickup.F
ViewVC logotype

Annotation of /MITgcm/pkg/ptracers/ptracers_read_pickup.F

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


Revision 1.18 - (hide annotations) (download)
Fri Mar 24 23:48:33 2017 UTC (7 years, 2 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, HEAD
Changes since 1.17: +17 -5 lines
use new S/R RW_GET_SUFFIX to get file suffix (according to "rwSuffixType")

1 jmc 1.18 C $Header: /u/gcmpack/MITgcm/pkg/ptracers/ptracers_read_pickup.F,v 1.17 2014/08/18 14:34:27 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4 jahn 1.11 #include "GAD_OPTIONS.h"
5 jmc 1.1 #include "PTRACERS_OPTIONS.h"
6    
7     CBOP
8     C !ROUTINE: PTRACERS_READ_PICKUP
9    
10     C !INTERFACE:
11     SUBROUTINE PTRACERS_READ_PICKUP( myIter, myThid )
12    
13     C !DESCRIPTION:
14     C Reads current state of passive tracers from a pickup file
15    
16     C !USES:
17 jahn 1.11 #include "PTRACERS_MOD.h"
18 jmc 1.1 IMPLICIT NONE
19     #include "SIZE.h"
20     #include "EEPARAMS.h"
21     #include "PARAMS.h"
22 jahn 1.11 #include "GAD.h"
23 jmc 1.1 #include "PTRACERS_SIZE.h"
24 jmc 1.5 #include "PTRACERS_PARAMS.h"
25 jmc 1.15 #include "PTRACERS_START.h"
26 jmc 1.5 #include "PTRACERS_FIELDS.h"
27 jmc 1.1
28     C !INPUT PARAMETERS:
29     C myIter :: time-step number
30     C myThid :: thread number
31     INTEGER myIter
32     INTEGER myThid
33    
34     #ifdef ALLOW_PTRACERS
35    
36     C !LOCAL VARIABLES:
37 jmc 1.6 C iTracer :: tracer index
38     C iRec :: record number
39     C fn :: character buffer for creating filename
40     C prec :: precision of pickup files
41     C filePrec :: pickup-file precision (read from meta file)
42     C nbFields :: number of fields in pickup file (read from meta file)
43     C fldName :: Name of the field to read
44     C missFldList :: List of missing fields (attempted to read but not found)
45     C missFldDim :: Dimension of missing fields list array: missFldList
46     C nMissing :: Number of missing fields (attempted to read but not found)
47     C j :: loop index
48     C nj :: record number
49     C ioUnit :: temp for writing msg unit
50     C msgBuf :: Informational/error message buffer
51 jmc 1.14 INTEGER iTracer, iRec, prec
52 jmc 1.6 INTEGER filePrec, nbFields
53     INTEGER missFldDim, nMissing
54     INTEGER nj, ioUnit
55     PARAMETER( missFldDim = 2*PTRACERS_num )
56 jmc 1.18 CHARACTER*(10) suff
57 jmc 1.10 CHARACTER*(MAX_LEN_FNAM) fn
58 jmc 1.6 CHARACTER*(8) fldName, missFldList(missFldDim)
59     CHARACTER*(MAX_LEN_MBUF) msgBuf
60 jmc 1.14 #ifdef PTRACERS_ALLOW_DYN_STATE
61 jmc 1.16 CHARACTER*(MAX_LEN_FNAM) filNam
62     LOGICAL useCurrentDir, fileExist
63 jmc 1.14 INTEGER n
64     #endif
65 jmc 1.1 CEOP
66    
67 jmc 1.14 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
68 jmc 1.2
69 jmc 1.1 #ifdef ALLOW_MNC
70     IF ( PTRACERS_pickup_read_mnc ) THEN
71     C Read variables from the pickup file
72     WRITE(fn,'(a)') 'pickup_ptracers'
73     CALL MNC_FILE_CLOSE_ALL_MATCHING(fn, myThid)
74     CALL MNC_CW_SET_UDIM(fn, 1, myThid)
75     CALL MNC_CW_SET_CITER(fn, 3, 3, myIter, -1, myThid)
76 jmc 1.6 DO iTracer = 1, PTRACERS_numInUse
77 jmc 1.1 CALL MNC_CW_RL_R('D',fn,0,0, PTRACERS_names(iTracer),
78 jmc 1.5 & gpTrNm1(1-OLx,1-OLy,1,1,1,iTracer),myThid)
79 jmc 1.15 CALL EXCH_3D_RL( gpTrNm1(1-OLx,1-OLy,1,1,1,iTracer),
80 jmc 1.6 & Nr, myThid )
81 jmc 1.1 ENDDO
82     CALL MNC_CW_SET_UDIM(fn, 2, myThid)
83 jmc 1.6 DO iTracer = 1, PTRACERS_numInUse
84 jmc 1.1 CALL MNC_CW_RL_R('D',fn,0,0, PTRACERS_names(iTracer),
85     & pTracer(1-OLx,1-OLy,1,1,1,iTracer),myThid)
86 jmc 1.15 CALL EXCH_3D_RL( pTracer(1-OLx,1-OLy,1,1,1,iTracer),
87 jmc 1.6 & Nr, myThid )
88 jmc 1.1 ENDDO
89     ENDIF
90 jahn 1.11 IF ( useMNC .AND. PTRACERS_pickup_read_mnc ) THEN
91     DO iTracer = 1, PTRACERS_numInUse
92     IF ( PTRACERS_SOM_Advection(iTracer) ) THEN
93     WRITE(msgBuf,'(3A)')'PTRACERS_READ_PICKUP: MNC not yet coded',
94     & ' for SOM advection',
95     & ' => read bin file instead'
96     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
97     & SQUEEZE_RIGHT, myThid)
98     ENDIF
99     ENDDO
100     ENDIF
101 jmc 1.1 #endif /* ALLOW_MNC */
102 jmc 1.2
103 jmc 1.16 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
104    
105 jmc 1.1 IF ( PTRACERS_pickup_read_mdsio ) THEN
106    
107 jmc 1.6 IF ( pickupSuff.EQ.' ' ) THEN
108 jmc 1.18 IF ( rwSuffixType.EQ.0 ) THEN
109     WRITE(fn,'(A,I10.10)') 'pickup_ptracers.', myIter
110     ELSE
111     CALL RW_GET_SUFFIX( suff, startTime, myIter, myThid )
112     WRITE(fn,'(A,A)') 'pickup_ptracers.', suff
113     ENDIF
114 jmc 1.6 ELSE
115 jmc 1.18 WRITE(fn,'(A,A10)') 'pickup_ptracers.', pickupSuff
116 jmc 1.6 ENDIF
117     prec = precFloat64
118    
119     CALL READ_MFLDS_SET(
120     I fn,
121     O nbFields, filePrec,
122     I Nr, myIter, myThid )
123     _BEGIN_MASTER( myThid )
124     c IF ( filePrec.NE.0 .AND. filePrec.NE.prec ) THEN
125     IF ( nbFields.GE.0 .AND. filePrec.NE.prec ) THEN
126 jmc 1.9 WRITE(msgBuf,'(2A,I4)') 'PTRACERS_READ_PICKUP: ',
127 jmc 1.6 & 'pickup-file binary precision do not match !'
128     CALL PRINT_ERROR( msgBuf, myThid )
129 jmc 1.9 WRITE(msgBuf,'(A,2(A,I4))') 'PTRACERS_READ_PICKUP: ',
130 jmc 1.6 & 'file prec.=', filePrec, ' but expecting prec.=', prec
131     CALL PRINT_ERROR( msgBuf, myThid )
132 jmc 1.9 STOP 'ABNORMAL END: S/R PTRACERS_READ_PICKUP (data-prec Pb)'
133 jmc 1.6 ENDIF
134     _END_MASTER( myThid )
135    
136     IF ( nbFields.LE.0 ) THEN
137     C- No meta-file or old meta-file without List of Fields
138     ioUnit = errorMessageUnit
139     IF ( pickupStrictlyMatch ) THEN
140 jmc 1.9 WRITE(msgBuf,'(4A)') 'PTRACERS_READ_PICKUP: ',
141 jmc 1.6 & 'no field-list found in meta-file',
142     & ' => cannot check for strick-matching'
143     CALL PRINT_ERROR( msgBuf, myThid )
144 jmc 1.9 WRITE(msgBuf,'(4A)') 'PTRACERS_READ_PICKUP: ',
145 jmc 1.6 & 'try with " pickupStrictlyMatch=.FALSE.,"',
146     & ' in file: "data", NameList: "PARM03"'
147     CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
148 jmc 1.9 STOP 'ABNORMAL END: S/R PTRACERS_READ_PICKUP'
149 jmc 1.6 ELSE
150 jmc 1.9 WRITE(msgBuf,'(4A)') 'WARNING >> PTRACERS_READ_PICKUP: ',
151 jmc 1.6 & ' no field-list found'
152     CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
153     IF ( nbFields.EQ.-1 ) THEN
154     C- No meta-file
155     WRITE(msgBuf,'(4A)') 'WARNING >> ',
156     & ' try to read pickup as currently written'
157     CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
158     ELSE
159     C- Old meta-file without List of Fields
160     WRITE(msgBuf,'(4A)') 'WARNING >> ',
161     & ' try to read pickup as it used to be written'
162     CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
163     WRITE(msgBuf,'(4A)') 'WARNING >> ',
164 jmc 1.7 & ' until checkpoint59l (2007 Dec 17)'
165 jmc 1.6 CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
166     ENDIF
167     ENDIF
168     ENDIF
169    
170     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
171 jmc 1.2
172 jmc 1.6 C--- Very Old way to read ptracer pickup:
173     IF ( nbFields.EQ.0 .AND. usePickupBeforeC54 ) THEN
174 jmc 1.1 C Read fields as consecutive records
175 jmc 1.6 DO iTracer = 1, PTRACERS_numInUse
176 jmc 1.1 iRec = iTracer
177 jmc 1.2 CALL READ_REC_3D_RL( fn, prec, Nr,
178 jmc 1.15 O pTracer(1-OLx,1-OLy,1,1,1,iTracer),
179 jmc 1.2 I iRec, myIter, myThid )
180 jmc 1.15 CALL EXCH_3D_RL( pTracer(1-OLx,1-OLy,1,1,1,iTracer),
181 jmc 1.6 & Nr, myThid )
182 jmc 1.1 ENDDO
183    
184 jmc 1.3 C Read historical tendencies as consecutive records
185 jmc 1.6 c DO iTracer = 1,PTRACERS_numInUse
186     c iRec = iTracer + PTRACERS_num
187     c CALL READ_REC_3D_RL( fn, prec, Nr,
188 jmc 1.15 c O gPtr(1-OLx,1-OLy,1,1,1,iTracer),
189 jmc 1.6 c I iRec, myIter, myThid )
190 jmc 1.15 c CALL EXCH_3D_RL( gPtr(1-OLx,1-OLy,1,1,1,iTracer),
191 jmc 1.6 c & Nr, myThid )
192     c ENDDO
193     DO iTracer = 1, PTRACERS_numInUse
194 jmc 1.1 iRec = iTracer + PTRACERS_num*2
195 jmc 1.2 CALL READ_REC_3D_RL( fn, prec, Nr,
196 jmc 1.15 O gpTrNm1(1-OLx,1-OLy,1,1,1,iTracer),
197 jmc 1.2 I iRec, myIter, myThid )
198 jmc 1.15 CALL EXCH_3D_RL( gpTrNm1(1-OLx,1-OLy,1,1,1,iTracer),
199 jmc 1.6 & Nr, myThid )
200 jmc 1.1 ENDDO
201    
202 jmc 1.6 ELSEIF ( nbFields.EQ.0 ) THEN
203     C--- Old way to read ptracer pickup:
204 jmc 1.3 C Read fields & tendencies (needed for AB) as consecutive records,
205 jmc 1.1 C one tracer after the other, only for tracers "InUse". Note:
206     C this allow to restart from a pickup with a different number of
207     C tracers, with write_pickup dumping all of them (PTRACERS_num).
208 jmc 1.6 DO iTracer = 1, PTRACERS_numInUse
209 jmc 1.2 iRec = 2*iTracer -1
210     CALL READ_REC_3D_RL( fn, prec, Nr,
211 jmc 1.15 O pTracer(1-OLx,1-OLy,1,1,1,iTracer),
212 jmc 1.2 I iRec, myIter, myThid )
213 jmc 1.1 iRec = 2*iTracer
214 jmc 1.2 CALL READ_REC_3D_RL( fn, prec, Nr,
215 jmc 1.15 O gpTrNm1(1-OLx,1-OLy,1,1,1,iTracer),
216 jmc 1.2 I iRec, myIter, myThid )
217 jmc 1.15 CALL EXCH_3D_RL( pTracer(1-OLx,1-OLy,1,1,1,iTracer),
218 jmc 1.6 & Nr, myThid )
219 jmc 1.15 CALL EXCH_3D_RL( gpTrNm1(1-OLx,1-OLy,1,1,1,iTracer),
220 jmc 1.6 & Nr, myThid )
221     ENDDO
222    
223     ELSE
224     C--- New way to read ptracer pickup:
225     nj = 0
226     DO iTracer = 1, PTRACERS_numInUse
227     C--- read pTracer 3-D fields for restart
228     fldName = 'pTr'//PTRACERS_ioLabel(iTracer)//' '
229     CALL READ_MFLDS_3D_RL( fldName,
230 jmc 1.15 O pTracer(1-OLx,1-OLy,1,1,1,iTracer),
231 jmc 1.6 & nj, prec, Nr, myIter, myThid )
232 jmc 1.15 CALL EXCH_3D_RL( pTracer(1-OLx,1-OLy,1,1,1,iTracer),
233 jmc 1.6 & Nr, myThid )
234     ENDDO
235     DO iTracer = 1, PTRACERS_numInUse
236     C--- read pTracer 3-D tendencies for AB-restart
237 jmc 1.17 IF ( PTRACERS_AdamsBashGtr(iTracer) .OR.
238     & PTRACERS_AdamsBash_Tr(iTracer) ) THEN
239     IF ( PTRACERS_AdamsBashGtr(iTracer) )
240     & fldName = 'gPtr'//PTRACERS_ioLabel(iTracer)//'m1'
241     IF ( PTRACERS_AdamsBash_Tr(iTracer) )
242     & fldName = 'pTr'//PTRACERS_ioLabel(iTracer)//'Nm1'
243 jmc 1.6 CALL READ_MFLDS_3D_RL( fldName,
244 jmc 1.15 O gpTrNm1(1-OLx,1-OLy,1,1,1,iTracer),
245 jmc 1.6 & nj, prec, Nr, myIter, myThid )
246 jmc 1.15 CALL EXCH_3D_RL( gpTrNm1(1-OLx,1-OLy,1,1,1,iTracer),
247 jmc 1.6 & Nr, myThid )
248     ENDIF
249     ENDDO
250    
251     C-- end: new way to read pickup file
252     ENDIF
253    
254     C-- Check for missing fields:
255     nMissing = missFldDim
256     CALL READ_MFLDS_CHECK(
257     O missFldList,
258     U nMissing,
259     I myIter, myThid )
260     IF ( nMissing.GT.missFldDim ) THEN
261 jmc 1.9 WRITE(msgBuf,'(2A,I4)') 'PTRACERS_READ_PICKUP: ',
262 jmc 1.6 & 'missing fields list has been truncated to', missFldDim
263     CALL PRINT_ERROR( msgBuf, myThid )
264 jmc 1.9 STOP 'ABNORMAL END: S/R PTRACERS_READ_PICKUP (list-size Pb)'
265 jmc 1.6 ENDIF
266     CALL PTRACERS_CHECK_PICKUP(
267     I missFldList,
268     I nMissing, nbFields,
269     I myIter, myThid )
270 jahn 1.11
271 jmc 1.16 C-- end: pickup_read_mdsio
272     ENDIF
273    
274     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
275    
276 jmc 1.12 #ifdef PTRACERS_ALLOW_DYN_STATE
277 jmc 1.16 c IF ( PTRACERS_pickup_read_mdsio ) THEN
278    
279 jahn 1.11 C-- Read pickup file with 2nd.Order moment fields
280 jmc 1.16 prec = precFloat64
281 jahn 1.11 DO iTracer = 1, PTRACERS_numInUse
282     IF ( PTRACERS_SOM_Advection(iTracer) ) THEN
283    
284 jmc 1.18 IF ( pickupSuff.EQ.' ' ) THEN
285     IF ( rwSuffixType.EQ.0 ) THEN
286     WRITE(fn,'(3A,I10.10)') 'pickup_somTRAC',
287 jahn 1.11 & PTRACERS_ioLabel(iTracer),'.', myIter
288 jmc 1.18 ELSE
289     CALL RW_GET_SUFFIX( suff, startTime, myIter, myThid )
290     WRITE(fn,'(3A,A)') 'pickup_somTRAC',
291     & PTRACERS_ioLabel(iTracer),'.', suff
292     ENDIF
293 jahn 1.11 ELSE
294     WRITE(fn,'(3A,A10)') 'pickup_somTRAC',
295     & PTRACERS_ioLabel(iTracer),'.', pickupSuff
296     ENDIF
297 jmc 1.16 ioUnit = standardMessageUnit
298 jmc 1.12 WRITE(msgBuf,'(A,I3,A)')'PTRACERS_READ_PICKUP: iTracer = ',
299 jmc 1.16 & iTracer, ' : reading 2nd-order moments from file:'
300     CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
301     CALL PRINT_MESSAGE( fn, ioUnit, SQUEEZE_RIGHT, myThid )
302    
303     C- First check if pickup file exist
304     #ifdef ALLOW_MDSIO
305     useCurrentDir = .FALSE.
306     CALL MDS_CHECK4FILE(
307     I fn, '.data', 'PTRACERS_READ_PICKUP',
308     O filNam, fileExist,
309     I useCurrentDir, myThid )
310     #else
311     STOP 'ABNORMAL END: S/R PTRACERS_READ_PICKUP: Needs MDSIO pkg'
312     #endif
313    
314     IF ( fileExist ) THEN
315     C- Read 2nd Order moments as consecutive records
316     DO n=1,nSOM
317 jahn 1.11 iRec = n
318     CALL READ_REC_3D_RL( fn, prec, Nr,
319 jmc 1.13 O _Ptracers_som(:,:,:,:,:,n,iTracer),
320 jahn 1.11 I iRec, myIter, myThid )
321 jmc 1.16 ENDDO
322     CALL GAD_EXCH_SOM( _Ptracers_som(:,:,:,:,:,:,iTracer),
323     & Nr, myThid )
324     ELSE
325     ioUnit = errorMessageUnit
326     IF ( pickupStrictlyMatch ) THEN
327     WRITE(msgBuf,'(4A)') 'PTRACERS_READ_PICKUP: ',
328     & 'try with " pickupStrictlyMatch=.FALSE.,"',
329     & ' in file: "data", NameList: "PARM03"'
330     CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
331     STOP 'ABNORMAL END: S/R PTRACERS_READ_PICKUP'
332     ELSE
333     WRITE(msgBuf,'(2A)') 'WARNING >> PTRACERS_READ_PICKUP: ',
334     & 'approximated restart: reset Ptr_SOM to zero'
335     CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
336     ENDIF
337     ENDIF
338 jahn 1.11 ENDIF
339     ENDDO
340 jmc 1.16
341     C-- end: pickup_read_mdsio, SOM pickups
342     c ENDIF
343 jmc 1.12 #endif /* PTRACERS_ALLOW_DYN_STATE */
344 jmc 1.1
345     #endif /* ALLOW_PTRACERS */
346    
347     RETURN
348     END

  ViewVC Help
Powered by ViewVC 1.1.22