1 |
jmc |
1.1 |
C $Header: /u/gcmpack/MITgcm/model/src/checkpoint.F,v 1.67 2006/08/09 02:23:13 jmc Exp $ |
2 |
|
|
C $Name: $ |
3 |
|
|
|
4 |
|
|
#include "PACKAGES_CONFIG.h" |
5 |
|
|
#include "CPP_OPTIONS.h" |
6 |
|
|
|
7 |
|
|
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
8 |
|
|
CBOP |
9 |
|
|
C !ROUTINE: READ_PICKUP |
10 |
|
|
C !INTERFACE: |
11 |
|
|
SUBROUTINE READ_PICKUP( |
12 |
|
|
I myIter, myThid ) |
13 |
|
|
|
14 |
|
|
C !DESCRIPTION: |
15 |
|
|
C This is the controlling routine for IO to read restart (or |
16 |
|
|
C "pickup" or "checkpoint" ) files. It calls routines from other |
17 |
|
|
C packages (\textit{eg.} rw and mnc) to do the per-variable |
18 |
|
|
C reads. |
19 |
|
|
|
20 |
|
|
C !USES: |
21 |
|
|
IMPLICIT NONE |
22 |
|
|
#include "SIZE.h" |
23 |
|
|
#include "EEPARAMS.h" |
24 |
|
|
#include "PARAMS.h" |
25 |
|
|
#include "DYNVARS.h" |
26 |
|
|
#include "SURFACE.h" |
27 |
|
|
#ifdef ALLOW_NONHYDROSTATIC |
28 |
|
|
#include "NH_VARS.h" |
29 |
|
|
#endif |
30 |
|
|
#ifdef ALLOW_MNC |
31 |
|
|
#include "MNC_PARAMS.h" |
32 |
|
|
#endif |
33 |
|
|
|
34 |
|
|
C !INPUT/OUTPUT PARAMETERS: |
35 |
|
|
C myIter :: Iteration number |
36 |
|
|
C myThid :: my Thread number Id. |
37 |
|
|
INTEGER myIter |
38 |
|
|
INTEGER myThid |
39 |
|
|
CEOP |
40 |
|
|
|
41 |
|
|
C !LOCAL VARIABLES: |
42 |
|
|
C fp :: pickup-file precision |
43 |
|
|
C fn :: Temp. for building file name. |
44 |
|
|
INTEGER fp |
45 |
|
|
INTEGER i, nj |
46 |
|
|
CHARACTER*(MAX_LEN_FNAM) fn |
47 |
|
|
CHARACTER*(10) suff |
48 |
|
|
#ifdef ALLOW_ADAMSBASHFORTH_3 |
49 |
|
|
INTEGER j |
50 |
|
|
#endif |
51 |
|
|
|
52 |
|
|
C Suffix for pickup files |
53 |
|
|
DO i = 1,MAX_LEN_FNAM |
54 |
|
|
fn(i:i) = ' ' |
55 |
|
|
ENDDO |
56 |
|
|
IF (pickupSuff .EQ. ' ') THEN |
57 |
|
|
WRITE(suff,'(I10.10)') myIter |
58 |
|
|
ELSE |
59 |
|
|
WRITE(suff,'(A10)') pickupSuff |
60 |
|
|
ENDIF |
61 |
|
|
WRITE(fn,'(A,A10)') 'pickup.',suff |
62 |
|
|
|
63 |
|
|
C Going to really do some IO. Make everyone except master thread wait. |
64 |
|
|
_BARRIER |
65 |
|
|
|
66 |
|
|
IF (pickup_read_mdsio) THEN |
67 |
|
|
|
68 |
|
|
fp = precFloat64 |
69 |
|
|
|
70 |
|
|
C Read model fields |
71 |
|
|
IF ( usePickupBeforeC54 ) THEN |
72 |
|
|
#ifndef ALLOW_ADAMSBASHFORTH_3 |
73 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, uVel, 1, myIter,myThid ) |
74 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gU, 2, myIter,myThid ) |
75 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, guNm1, 3, myIter,myThid ) |
76 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, vVel, 4, myIter,myThid ) |
77 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gV, 5, myIter,myThid ) |
78 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gvNm1, 6, myIter,myThid ) |
79 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, theta, 7, myIter,myThid ) |
80 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gT, 8, myIter,myThid ) |
81 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gtNm1, 9, myIter,myThid ) |
82 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, salt, 10, myIter,myThid ) |
83 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gS, 11, myIter,myThid ) |
84 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gsNm1,12, myIter,myThid ) |
85 |
|
|
#endif /* ALLOW_ADAMSBASHFORTH_3 */ |
86 |
|
|
CALL READ_REC_3D_RL( fn, fp, 1, etaN, |
87 |
|
|
& 12*Nr+1, myIter,myThid ) |
88 |
|
|
#ifdef NONLIN_FRSURF |
89 |
|
|
IF (nonlinFreeSurf .GE. 0) THEN |
90 |
|
|
CALL READ_REC_3D_RL(fn, fp, 1, etaH, |
91 |
|
|
& 12*Nr+2, myIter,myThid ) |
92 |
|
|
ENDIF |
93 |
|
|
#endif |
94 |
|
|
ELSE |
95 |
|
|
#ifdef ALLOW_ADAMSBASHFORTH_3 |
96 |
|
|
j = 3 |
97 |
|
|
IF ( startFromPickupAB2 ) j = 2 |
98 |
|
|
nj = 0 |
99 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, uVel, nj+1, myIter,myThid ) |
100 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, guNm(1-Olx,1-Oly,1,1,1,1), |
101 |
|
|
& nj+2, myIter,myThid ) |
102 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, guNm(1-Olx,1-Oly,1,1,1,2), |
103 |
|
|
& nj+j, myIter,myThid ) |
104 |
|
|
nj = j |
105 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, vVel, nj+1, myIter,myThid ) |
106 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gvNm(1-Olx,1-Oly,1,1,1,1), |
107 |
|
|
& nj+2, myIter,myThid ) |
108 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gvNm(1-Olx,1-Oly,1,1,1,2), |
109 |
|
|
& nj+j, myIter,myThid ) |
110 |
|
|
nj = 2*j |
111 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, theta,nj+1, myIter,myThid ) |
112 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gtNm(1-Olx,1-Oly,1,1,1,1), |
113 |
|
|
& nj+2, myIter,myThid ) |
114 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gtNm(1-Olx,1-Oly,1,1,1,2), |
115 |
|
|
& nj+j, myIter,myThid ) |
116 |
|
|
nj = 3*j |
117 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, salt, nj+1, myIter,myThid ) |
118 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gsNm(1-Olx,1-Oly,1,1,1,1), |
119 |
|
|
& nj+2, myIter,myThid ) |
120 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gsNm(1-Olx,1-Oly,1,1,1,2), |
121 |
|
|
& nj+j, myIter,myThid ) |
122 |
|
|
nj = 4*j |
123 |
|
|
#else /* ALLOW_ADAMSBASHFORTH_3 */ |
124 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, uVel, 1, myIter,myThid ) |
125 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, guNm1, 2, myIter,myThid ) |
126 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, vVel, 3, myIter,myThid ) |
127 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gvNm1, 4, myIter,myThid ) |
128 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, theta, 5, myIter,myThid ) |
129 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gtNm1, 6, myIter,myThid ) |
130 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, salt, 7, myIter,myThid ) |
131 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gsNm1, 8, myIter,myThid ) |
132 |
|
|
nj = 8 |
133 |
|
|
#endif /* ALLOW_ADAMSBASHFORTH_3 */ |
134 |
|
|
CALL READ_REC_3D_RL( fn,fp,1, etaN, nj*Nr+1, myIter,myThid ) |
135 |
|
|
#ifdef EXACT_CONSERV |
136 |
|
|
IF (exactConserv) THEN |
137 |
|
|
CALL READ_REC_3D_RL(fn,fp,1,dEtaHdt,nj*Nr+2,myIter,myThid ) |
138 |
|
|
ENDIF |
139 |
|
|
IF (nonlinFreeSurf .GT. 0) THEN |
140 |
|
|
CALL READ_REC_3D_RL(fn,fp,1, etaH, nj*Nr+3, myIter,myThid ) |
141 |
|
|
ENDIF |
142 |
|
|
#endif |
143 |
|
|
ENDIF |
144 |
|
|
|
145 |
|
|
IF ( useDynP_inEos_Zc ) THEN |
146 |
|
|
WRITE(fn,'(A,A10)') 'pickup_ph.',suff |
147 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, totPhiHyd,1,myIter,myThid ) |
148 |
|
|
ENDIF |
149 |
|
|
#ifdef ALLOW_NONHYDROSTATIC |
150 |
|
|
IF ( use3Dsolver ) THEN |
151 |
|
|
WRITE(fn,'(A,A10)') 'pickup_nh.',suff |
152 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, phi_nh, 1, myIter,myThid ) |
153 |
|
|
CALL READ_REC_3D_RL( fn, fp, Nr, gwNm1, 2, myIter,myThid ) |
154 |
|
|
ENDIF |
155 |
|
|
#endif |
156 |
|
|
|
157 |
|
|
ENDIF |
158 |
|
|
|
159 |
|
|
#ifdef ALLOW_MNC |
160 |
|
|
IF (useMNC .AND. pickup_read_mnc) THEN |
161 |
|
|
WRITE(fn,'(A)') 'pickup' |
162 |
|
|
CALL MNC_FILE_CLOSE_ALL_MATCHING(fn, myThid) |
163 |
|
|
CALL MNC_CW_SET_UDIM(fn, 1, myThid) |
164 |
|
|
CALL MNC_CW_SET_CITER(fn, 3, 3, myIter, -1, myThid) |
165 |
|
|
CALL MNC_CW_RL_R('D',fn,0,0,'U',uVel, myThid) |
166 |
|
|
CALL MNC_CW_RL_R('D',fn,0,0,'V',vVel, myThid) |
167 |
|
|
CALL MNC_CW_RL_R('D',fn,0,0,'Temp',theta, myThid) |
168 |
|
|
CALL MNC_CW_RL_R('D',fn,0,0,'S',salt, myThid) |
169 |
|
|
CALL MNC_CW_RL_R('D',fn,0,0,'Eta',etaN, myThid) |
170 |
|
|
#ifndef ALLOW_ADAMSBASHFORTH_3 |
171 |
|
|
CALL MNC_CW_RL_R('D',fn,0,0,'gUnm1',guNm1, myThid) |
172 |
|
|
CALL MNC_CW_RL_R('D',fn,0,0,'gVnm1',gvNm1, myThid) |
173 |
|
|
CALL MNC_CW_RL_R('D',fn,0,0,'gTnm1',gtNm1, myThid) |
174 |
|
|
CALL MNC_CW_RL_R('D',fn,0,0,'gSnm1',gsNm1, myThid) |
175 |
|
|
#endif /* ALLOW_ADAMSBASHFORTH_3 */ |
176 |
|
|
C#ifdef NONLIN_FRSURF |
177 |
|
|
C IF ( nonlinFreeSurf.GE.0 .AND. usePickupBeforeC54 ) |
178 |
|
|
C & CALL MNC_CW_RL_R('D',fn,0,0,'EtaH', etaH, myThid) |
179 |
|
|
C#endif |
180 |
|
|
#ifdef EXACT_CONSERV |
181 |
|
|
IF (exactConserv) THEN |
182 |
|
|
CALL MNC_CW_RL_R('D',fn,0,0,'dEtaHdt',dEtaHdt,myThid) |
183 |
|
|
ENDIF |
184 |
|
|
IF (nonlinFreeSurf .GT. 0) THEN |
185 |
|
|
CALL MNC_CW_RL_R('D',fn,0,0,'EtaH', etaH, myThid) |
186 |
|
|
ENDIF |
187 |
|
|
#endif |
188 |
|
|
#ifdef ALLOW_NONHYDROSTATIC |
189 |
|
|
IF (use3Dsolver) THEN |
190 |
|
|
CALL MNC_CW_RL_R('D',fn,0,0,'phi_nh', phi_nh, myThid) |
191 |
|
|
c CALL MNC_CW_RL_R('D',fn,0,0,'gW', gW, myThid) |
192 |
|
|
CALL MNC_CW_RL_R('D',fn,0,0,'gWnm1', gwNm1, myThid) |
193 |
|
|
ENDIF |
194 |
|
|
#endif |
195 |
|
|
IF ( useDynP_inEos_Zc ) THEN |
196 |
|
|
CALL MNC_CW_RL_R('D',fn,0,0,'phiHyd',totPhiHyd,myThid) |
197 |
|
|
ENDIF |
198 |
|
|
ENDIF |
199 |
|
|
#endif /* ALLOW_MNC */ |
200 |
|
|
|
201 |
|
|
_BARRIER |
202 |
|
|
|
203 |
|
|
C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| |
204 |
|
|
|
205 |
|
|
C Fill in edge regions |
206 |
|
|
CALL EXCH_UV_3D_RL( uVel, vVel, .TRUE., Nr, myThid ) |
207 |
|
|
CALL EXCH_3D_RL( theta, Nr, myThid ) |
208 |
|
|
CALL EXCH_3D_RL( salt, Nr, myThid ) |
209 |
|
|
#ifdef ALLOW_ADAMSBASHFORTH_3 |
210 |
|
|
CALL EXCH_UV_3D_RL( guNm(1-Olx,1-Oly,1,1,1,1), |
211 |
|
|
& gvNm(1-Olx,1-Oly,1,1,1,1),.TRUE.,Nr,myThid ) |
212 |
|
|
CALL EXCH_3D_RL( gtNm(1-Olx,1-Oly,1,1,1,1), Nr, myThid ) |
213 |
|
|
CALL EXCH_3D_RL( gsNm(1-Olx,1-Oly,1,1,1,1), Nr, myThid ) |
214 |
|
|
CALL EXCH_UV_3D_RL( guNm(1-Olx,1-Oly,1,1,1,2), |
215 |
|
|
& gvNm(1-Olx,1-Oly,1,1,1,2),.TRUE.,Nr,myThid ) |
216 |
|
|
CALL EXCH_3D_RL( gtNm(1-Olx,1-Oly,1,1,1,2), Nr, myThid ) |
217 |
|
|
CALL EXCH_3D_RL( gsNm(1-Olx,1-Oly,1,1,1,2), Nr, myThid ) |
218 |
|
|
#else /* ALLOW_ADAMSBASHFORTH_3 */ |
219 |
|
|
CALL EXCH_UV_3D_RL( guNm1, gvNm1, .TRUE., Nr, myThid ) |
220 |
|
|
CALL EXCH_3D_RL( gtNm1, Nr, myThid ) |
221 |
|
|
CALL EXCH_3D_RL( gsNm1, Nr, myThid ) |
222 |
|
|
#endif /* ALLOW_ADAMSBASHFORTH_3 */ |
223 |
|
|
CALL EXCH_XY_RL( etaN, myThid ) |
224 |
|
|
CALL EXCH_XY_RL( etaH, myThid ) |
225 |
|
|
#ifdef EXACT_CONSERV |
226 |
|
|
CALL EXCH_XY_RL( detaHdt, myThid ) |
227 |
|
|
#endif |
228 |
|
|
|
229 |
|
|
IF ( useDynP_inEos_Zc ) |
230 |
|
|
& CALL EXCH_3D_RL( totPhiHyd, Nr, myThid ) |
231 |
|
|
|
232 |
|
|
#ifdef ALLOW_NONHYDROSTATIC |
233 |
|
|
IF ( use3Dsolver ) THEN |
234 |
|
|
CALL EXCH_3D_RL( phi_nh, Nr, myThid ) |
235 |
|
|
CALL EXCH_3D_RL( gwNm1, Nr, myThid ) |
236 |
|
|
ENDIF |
237 |
|
|
#endif |
238 |
|
|
|
239 |
|
|
RETURN |
240 |
|
|
END |