/[MITgcm]/MITgcm/pkg/mdsio/mdsio_read_whalos.F
ViewVC logotype

Contents of /MITgcm/pkg/mdsio/mdsio_read_whalos.F

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


Revision 1.8 - (show annotations) (download)
Wed Sep 21 01:52:20 2016 UTC (7 years, 7 months ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, HEAD
Changes since 1.7: +18 -1 lines
Implement workaround for NAS/Pleiades crashes of adjoint in /nobackupnfs2
forrtl: Device or resource busy
forrtl: severe (39): error during read, unit 1001, file
related to mdsio_read_whalos.F
encountered by Yoshihiro Nakajama
suggested by NAS engineers Sherry.Chang@nasa.gov and Johnny.Chang@nasa.gov

1 C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_read_whalos.F,v 1.7 2011/06/23 22:11:07 jmc Exp $
2 C $Name: $
3
4 #include "MDSIO_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: mds_read_whalos
8 C !INTERFACE:
9 subroutine mds_read_whalos(
10 I fName,
11 I len,
12 I filePrec,
13 I fid,
14 I n2d,
15 O fldRL,
16 I irec,
17 I locSingleCPUIO,
18 I locBufferIO,
19 I mythid
20 & )
21
22 C !DESCRIPTION: \bv
23 c ==================================================================
24 c SUBROUTINE mds_read_whalos
25 c ==================================================================
26 c o Read file that includes halos. The main purpose is for
27 c adjoint related "tape I/O". The secondary purpose is debugging.
28 c ==================================================================
29 c SUBROUTINE mds_read_whalos
30 c ==================================================================
31 C \ev
32
33 C !USES:
34 implicit none
35
36 c == global variables ==
37 #include "EEPARAMS.h"
38 #include "SIZE.h"
39 #include "PARAMS.h"
40 #ifdef ALLOW_WHIO
41 #include "MDSIO_BUFF_WH.h"
42 #endif
43
44 C !INPUT/OUTPUT PARAMETERS:
45 c == routine arguments ==
46 c fName - extended tape fName.
47 c len - number of characters in fName.
48 c filePrec - number of bits per word in file (32 or 64).
49 c fid - file unit (its use is not implemented yet).
50 C n2d - size of the fldRL third dimension.
51 c fldRL - array to read.
52 c irec - record number to be written.
53 c mythid - number of the thread or instance of the program.
54
55 integer mythid
56 character*(*) fName
57 integer len
58 integer fid
59 integer filePrec
60 integer n2d
61 integer irec
62 _RL fldRL(1-Olx:sNx+Olx,1-Oly:sNy+Oly,n2d,nSx,nSy)
63 logical locSingleCPUIO, locBufferIO
64 CEOP
65
66 #ifdef ALLOW_WHIO
67 C !LOCAL VARIABLES:
68 c == local variables ==
69
70 C sNxWh :: x tile size with halo included
71 C sNyWh :: y tile size with halo included
72 C pocNyWh :: processor sum of sNyWh
73 C gloNyWh :: global sum of sNyWh
74 INTEGER sNxWh
75 INTEGER sNyWh
76 INTEGER procNyWh
77 INTEGER gloNyWh
78 PARAMETER ( sNxWh = sNx+2*Olx )
79 PARAMETER ( sNyWh = sNy+2*Oly )
80 PARAMETER ( procNyWh = sNyWh*nSy*nSx )
81 PARAMETER ( gloNyWh = procNyWh*nPy*nPx )
82
83 character*(MAX_LEN_FNAM) pfName
84 character*(MAX_LEN_MBUF) msgBuf
85 integer IL
86 integer bx,by
87
88 integer lengthBuff, length_of_rec
89 integer i2d, i3d
90 integer i,j,k,bi,bj,ii
91 integer dUnit, irec2d
92 LOGICAL iAmDoingIO
93 cph(
94 #ifdef INTEL_COMMITQQ
95 cph Fix on Pleiades following model crashes on disk /nobackupnfs2/
96 cph reported by Yoshihiro.Nakayama@jpl.nasa.gov
97 cph forrtl: Device or resource busy
98 cph forrtl: severe (39): error during read, unit 1001, file
99 cph Workaround by NAS engineer Sherry.Chang@nasa.gov
100 logical results, commitqq
101 #endif
102 cph)
103
104
105 _RL fld2d(1:sNxWh,1:sNyWh,nSx,nSy)
106
107 c == functions ==
108 INTEGER ILNBLNK
109 INTEGER MDS_RECLEN
110 EXTERNAL ILNBLNK
111 EXTERNAL MDS_RECLEN
112
113 c == end of interface ==
114
115 #ifdef ALLOW_WHIO_3D
116 writeWh=.FALSE.
117 #endif
118
119 IF ( .NOT.locSingleCpuIO ) then
120 lengthBuff=sNxWh*procNyWh
121 ELSE
122 lengthBuff=sNxWh*gloNyWh
123 ENDIF
124
125 C Only do I/O if I am the master thread (and mpi process 0 IF locSingleCpuIO):
126 iAmDoingIO = .FALSE.
127 IF ( .NOT.locSingleCpuIO .OR. myProcId.EQ.0 ) THEN
128 _BEGIN_MASTER( myThid )
129 iAmDoingIO = .TRUE.
130 _END_MASTER( myThid )
131 ENDIF
132
133 IF ( iAmDoingIO ) THEN
134 c get the unit and open file
135 IL = ILNBLNK( fName )
136 IF ( .NOT.locSingleCpuIO ) THEN
137 WRITE(pfName,'(2A,I3.3,A)') fName(1:IL),'.',myProcId,'.data'
138 length_of_rec = MDS_RECLEN( filePrec,sNxWh*procNyWh, myThid )
139 ELSE
140 WRITE(pfName,'(2A)') fName(1:IL),'.data'
141 length_of_rec = MDS_RECLEN( filePrec,sNxWh*gloNyWh,myThid)
142 ENDIF
143 IF (fid.EQ.0) THEN
144 CALL MDSFINDUNIT( dUnit, myThid )
145 OPEN( dUnit, file=pfName, status='old',
146 & access='direct', recl=length_of_rec )
147 ELSE
148 dUnit=fid
149 ENDIF
150 ENDIF
151
152 cph(
153 cph NAS Pleiades fix here:
154 #ifdef INTEL_COMMITQQ
155 results = commitqq(dUnit)
156 #endif
157 cph)
158
159 do i2d=1,n2d
160
161 _BARRIER
162 #ifdef ALLOW_WHIO_3D
163 IF ( iAmDoingIO.AND.locBufferIO.AND.(fid.NE.0) ) THEN
164 c reset counter if needed
165 IF (jWh.EQ.nWh) jWh=0
166 c increment counter
167 jWh=jWh+1
168 c determine current file record
169 irec2d=i2d+n2d*(irec-1)
170 iWh=(irec2d-1)/nWh+1
171 c read new chunk if needed
172 IF (jWh.EQ.1) THEN
173 IF ( .NOT.locSingleCpuIO ) then
174 IF (filePrec .EQ. precFloat32) THEN
175 READ(dUnit,rec=iWh) fld3d_procbuff_r4
176 ELSE
177 READ(dUnit,rec=iWh) fld3d_procbuff_r8
178 ENDIF
179 ELSE
180 # ifdef INCLUDE_WHIO_GLOBUFF_3D
181 IF (filePrec .EQ. precFloat32) THEN
182 READ(dUnit,rec=iWh) fld3d_globuff_r4
183 ELSE
184 READ(dUnit,rec=iWh) fld3d_globuff_r8
185 ENDIF
186 # endif
187 ENDIF
188 ENDIF
189 c copy
190 DO i=1,lengthBuff
191 j=(jWh-1)*lengthBuff+i
192 IF ( .NOT.locSingleCpuIO ) then
193 IF (filePrec .EQ. precFloat32) THEN
194 fld2d_procbuff_r4(i)=fld3d_procbuff_r4(j)
195 ELSE
196 fld2d_procbuff_r8(i)=fld3d_procbuff_r8(j)
197 ENDIF
198 ELSE
199 # ifdef INCLUDE_WHIO_GLOBUFF_3D
200 IF (filePrec .EQ. precFloat32) THEN
201 fld2d_globuff_r4(i)=fld3d_globuff_r4(j)
202 ELSE
203 fld2d_globuff_r8(i)=fld3d_globuff_r8(j)
204 ENDIF
205 # endif
206 ENDIF
207 ENDDO
208
209 ELSEIF ( iAmDoingIO ) THEN
210 #else
211 IF ( iAmDoingIO ) THEN
212 #endif
213 irec2d=i2d+n2d*(irec-1)
214 IF ( .NOT.locSingleCpuIO ) then
215 IF (filePrec .EQ. precFloat32) THEN
216 READ(dUnit,rec=irec2d) fld2d_procbuff_r4
217 ELSE
218 READ(dUnit,rec=irec2d) fld2d_procbuff_r8
219 ENDIF
220 ELSE
221 # ifndef EXCLUDE_WHIO_GLOBUFF_2D
222 IF (filePrec .EQ. precFloat32) THEN
223 READ(dUnit,rec=irec2d) fld2d_globuff_r4
224 ELSE
225 READ(dUnit,rec=irec2d) fld2d_globuff_r8
226 ENDIF
227 # endif
228 ENDIF
229 ENDIF
230 _BARRIER
231
232 IF (filePrec .EQ. precFloat32) THEN
233 IF ( locSingleCpuIO ) then
234 # ifndef EXCLUDE_WHIO_GLOBUFF_2D
235 CALL SCATTER_2D_WH_R4 ( fld2d_globuff_r4,
236 & fld2d_procbuff_r4,myThid)
237 # endif
238 CALL BAR2( myThid )
239 ENDIF
240 CALL MDS_PASS_R4toRL( fld2d_procbuff_r4, fldRL,
241 & OLx, OLy, 1, i2d, n2d, 0, 0, .TRUE., myThid )
242 ELSE
243 IF ( locSingleCpuIO ) then
244 # ifndef EXCLUDE_WHIO_GLOBUFF_2D
245 CALL SCATTER_2D_WH_R8 ( fld2d_globuff_r8,
246 & fld2d_procbuff_r8,myThid)
247 # endif
248 CALL BAR2( myThid )
249 ENDIF
250 CALL MDS_PASS_R8toRL( fld2d_procbuff_r8, fldRL,
251 & OLx, OLy, 1, i2d, n2d, 0, 0, .TRUE., myThid )
252 ENDIF
253
254 enddo
255
256 IF ( iAmDoingIO.AND.(fid.EQ.0) ) THEN
257 CLOSE( dUnit )
258 ENDIF
259
260 #endif
261
262 RETURN
263 END

  ViewVC Help
Powered by ViewVC 1.1.22