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

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

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


Revision 1.6 - (show annotations) (download)
Mon Dec 17 22:05:48 2007 UTC (16 years, 5 months ago) by jmc
Branch: MAIN
Changes since 1.5: +157 -33 lines
new version of ptracers pickup:
 read meta file and write only fields which are needed to restart.
 ( same logic as main pickup file ; also using pickupStrictlyMatch )

1 C $Header: /u/gcmpack/MITgcm/pkg/ptracers/ptracers_read_pickup.F,v 1.5 2007/11/05 18:48:04 jmc Exp $
2 C $Name: $
3
4 #include "PTRACERS_OPTIONS.h"
5
6 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
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 IMPLICIT NONE
18 #include "SIZE.h"
19 #include "EEPARAMS.h"
20 #include "PARAMS.h"
21 #include "PTRACERS_SIZE.h"
22 #include "PTRACERS_PARAMS.h"
23 #include "PTRACERS_RESTART.h"
24 #include "PTRACERS_FIELDS.h"
25
26 C !INPUT PARAMETERS:
27 C myIter :: time-step number
28 C myThid :: thread number
29 INTEGER myIter
30 INTEGER myThid
31
32 #ifdef ALLOW_PTRACERS
33
34 C !LOCAL VARIABLES:
35 C iTracer :: tracer index
36 C iRec :: record number
37 C fn :: character buffer for creating filename
38 C prec :: precision of pickup files
39 C filePrec :: pickup-file precision (read from meta file)
40 C nbFields :: number of fields in pickup file (read from meta file)
41 C fldName :: Name of the field to read
42 C missFldList :: List of missing fields (attempted to read but not found)
43 C missFldDim :: Dimension of missing fields list array: missFldList
44 C nMissing :: Number of missing fields (attempted to read but not found)
45 C j :: loop index
46 C nj :: record number
47 C ioUnit :: temp for writing msg unit
48 C msgBuf :: Informational/error message buffer
49 INTEGER iTracer, iRec, prec
50 INTEGER filePrec, nbFields
51 INTEGER missFldDim, nMissing
52 INTEGER nj, ioUnit
53 PARAMETER( missFldDim = 2*PTRACERS_num )
54 CHARACTER*(MAX_LEN_MBUF) fn
55 CHARACTER*(8) fldName, missFldList(missFldDim)
56 CHARACTER*(MAX_LEN_MBUF) msgBuf
57 CEOP
58
59 _BARRIER
60
61 #ifdef ALLOW_MNC
62 IF ( PTRACERS_pickup_read_mnc ) THEN
63 C Read variables from the pickup file
64 WRITE(fn,'(a)') 'pickup_ptracers'
65 CALL MNC_FILE_CLOSE_ALL_MATCHING(fn, myThid)
66 CALL MNC_CW_SET_UDIM(fn, 1, myThid)
67 CALL MNC_CW_SET_CITER(fn, 3, 3, myIter, -1, myThid)
68 DO iTracer = 1, PTRACERS_numInUse
69 CALL MNC_CW_RL_R('D',fn,0,0, PTRACERS_names(iTracer),
70 & gpTrNm1(1-OLx,1-OLy,1,1,1,iTracer),myThid)
71 CALL EXCH_3D_RL( gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer),
72 & Nr, myThid )
73 ENDDO
74 CALL MNC_CW_SET_UDIM(fn, 2, myThid)
75 DO iTracer = 1, PTRACERS_numInUse
76 CALL MNC_CW_RL_R('D',fn,0,0, PTRACERS_names(iTracer),
77 & pTracer(1-OLx,1-OLy,1,1,1,iTracer),myThid)
78 CALL EXCH_3D_RL( pTracer(1-Olx,1-Oly,1,1,1,iTracer),
79 & Nr, myThid )
80 ENDDO
81 ENDIF
82 #endif /* ALLOW_MNC */
83
84 IF ( PTRACERS_pickup_read_mdsio ) THEN
85
86 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
87
88 IF ( pickupSuff.EQ.' ' ) THEN
89 WRITE(fn,'(A,I10.10)') 'pickup_ptracers.',myIter
90 ELSE
91 WRITE(fn,'(A,A10)') 'pickup_ptracers.',pickupSuff
92 ENDIF
93 prec = precFloat64
94
95 CALL READ_MFLDS_SET(
96 I fn,
97 O nbFields, filePrec,
98 I Nr, myIter, myThid )
99 _BEGIN_MASTER( myThid )
100 c IF ( filePrec.NE.0 .AND. filePrec.NE.prec ) THEN
101 IF ( nbFields.GE.0 .AND. filePrec.NE.prec ) THEN
102 WRITE(msgBuf,'(2A,I4)') 'READ_PICKUP: ',
103 & 'pickup-file binary precision do not match !'
104 CALL PRINT_ERROR( msgBuf, myThid )
105 WRITE(msgBuf,'(A,2(A,I4))') 'READ_PICKUP: ',
106 & 'file prec.=', filePrec, ' but expecting prec.=', prec
107 CALL PRINT_ERROR( msgBuf, myThid )
108 STOP 'ABNORMAL END: S/R READ_PICKUP (data-prec Pb)'
109 ENDIF
110 _END_MASTER( myThid )
111
112 IF ( nbFields.LE.0 ) THEN
113 C- No meta-file or old meta-file without List of Fields
114 ioUnit = errorMessageUnit
115 IF ( pickupStrictlyMatch ) THEN
116 WRITE(msgBuf,'(4A)') 'READ_PICKUP: ',
117 & 'no field-list found in meta-file',
118 & ' => cannot check for strick-matching'
119 CALL PRINT_ERROR( msgBuf, myThid )
120 WRITE(msgBuf,'(4A)') 'READ_PICKUP: ',
121 & 'try with " pickupStrictlyMatch=.FALSE.,"',
122 & ' in file: "data", NameList: "PARM03"'
123 CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
124 STOP 'ABNORMAL END: S/R READ_PICKUP'
125 ELSE
126 WRITE(msgBuf,'(4A)') 'WARNING >> READ_PICKUP: ',
127 & ' no field-list found'
128 CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
129 IF ( nbFields.EQ.-1 ) THEN
130 C- No meta-file
131 WRITE(msgBuf,'(4A)') 'WARNING >> ',
132 & ' try to read pickup as currently written'
133 CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
134 ELSE
135 C- Old meta-file without List of Fields
136 WRITE(msgBuf,'(4A)') 'WARNING >> ',
137 & ' try to read pickup as it used to be written'
138 CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
139 WRITE(msgBuf,'(4A)') 'WARNING >> ',
140 & ' until checkpoint59k (2007 Dec 18)'
141 CALL PRINT_MESSAGE( msgBuf, ioUnit, SQUEEZE_RIGHT, myThid )
142 ENDIF
143 ENDIF
144 ENDIF
145
146 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
147
148 C--- Very Old way to read ptracer pickup:
149 IF ( nbFields.EQ.0 .AND. usePickupBeforeC54 ) THEN
150 C Read fields as consecutive records
151 DO iTracer = 1, PTRACERS_numInUse
152 iRec = iTracer
153 CALL READ_REC_3D_RL( fn, prec, Nr,
154 O pTracer(1-Olx,1-Oly,1,1,1,iTracer),
155 I iRec, myIter, myThid )
156 CALL EXCH_3D_RL( pTracer(1-Olx,1-Oly,1,1,1,iTracer),
157 & Nr, myThid )
158 ENDDO
159
160 C Read historical tendencies as consecutive records
161 c DO iTracer = 1,PTRACERS_numInUse
162 c iRec = iTracer + PTRACERS_num
163 c CALL READ_REC_3D_RL( fn, prec, Nr,
164 c O gPtr(1-Olx,1-Oly,1,1,1,iTracer),
165 c I iRec, myIter, myThid )
166 c CALL EXCH_3D_RL( gPtr(1-Olx,1-Oly,1,1,1,iTracer),
167 c & Nr, myThid )
168 c ENDDO
169 DO iTracer = 1, PTRACERS_numInUse
170 iRec = iTracer + PTRACERS_num*2
171 CALL READ_REC_3D_RL( fn, prec, Nr,
172 O gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer),
173 I iRec, myIter, myThid )
174 CALL EXCH_3D_RL( gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer),
175 & Nr, myThid )
176 ENDDO
177
178 ELSEIF ( nbFields.EQ.0 ) THEN
179 C--- Old way to read ptracer pickup:
180 C Read fields & tendencies (needed for AB) as consecutive records,
181 C one tracer after the other, only for tracers "InUse". Note:
182 C this allow to restart from a pickup with a different number of
183 C tracers, with write_pickup dumping all of them (PTRACERS_num).
184 DO iTracer = 1, PTRACERS_numInUse
185 iRec = 2*iTracer -1
186 CALL READ_REC_3D_RL( fn, prec, Nr,
187 O pTracer(1-Olx,1-Oly,1,1,1,iTracer),
188 I iRec, myIter, myThid )
189 iRec = 2*iTracer
190 CALL READ_REC_3D_RL( fn, prec, Nr,
191 O gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer),
192 I iRec, myIter, myThid )
193 CALL EXCH_3D_RL( pTracer(1-Olx,1-Oly,1,1,1,iTracer),
194 & Nr, myThid )
195 CALL EXCH_3D_RL( gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer),
196 & Nr, myThid )
197 ENDDO
198
199 ELSE
200 C--- New way to read ptracer pickup:
201 nj = 0
202 DO iTracer = 1, PTRACERS_numInUse
203 C--- read pTracer 3-D fields for restart
204 fldName = 'pTr'//PTRACERS_ioLabel(iTracer)//' '
205 CALL READ_MFLDS_3D_RL( fldName,
206 O pTracer(1-Olx,1-Oly,1,1,1,iTracer),
207 & nj, prec, Nr, myIter, myThid )
208 CALL EXCH_3D_RL( pTracer(1-Olx,1-Oly,1,1,1,iTracer),
209 & Nr, myThid )
210 ENDDO
211 DO iTracer = 1, PTRACERS_numInUse
212 C--- read pTracer 3-D tendencies for AB-restart
213 IF ( PTRACERS_AdamsBashGtr(iTracer) ) THEN
214 fldName = 'gPtr'//PTRACERS_ioLabel(iTracer)//'m1'
215 CALL READ_MFLDS_3D_RL( fldName,
216 O gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer),
217 & nj, prec, Nr, myIter, myThid )
218 CALL EXCH_3D_RL( gpTrNm1(1-Olx,1-Oly,1,1,1,iTracer),
219 & Nr, myThid )
220 ENDIF
221 ENDDO
222
223 C-- end: new way to read pickup file
224 ENDIF
225
226 C-- Check for missing fields:
227 nMissing = missFldDim
228 CALL READ_MFLDS_CHECK(
229 O missFldList,
230 U nMissing,
231 I myIter, myThid )
232 IF ( nMissing.GT.missFldDim ) THEN
233 WRITE(msgBuf,'(2A,I4)') 'READ_PICKUP: ',
234 & 'missing fields list has been truncated to', missFldDim
235 CALL PRINT_ERROR( msgBuf, myThid )
236 STOP 'ABNORMAL END: S/R READ_PICKUP (list-size Pb)'
237 ENDIF
238 CALL PTRACERS_CHECK_PICKUP(
239 I missFldList,
240 I nMissing, nbFields,
241 I myIter, myThid )
242
243 C-- end: pickup_read_mdsio
244 ENDIF
245
246 #endif /* ALLOW_PTRACERS */
247
248 RETURN
249 END

  ViewVC Help
Powered by ViewVC 1.1.22