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

Annotation of /MITgcm/pkg/mdsio/mdsio_read_field.F

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


Revision 1.10 - (hide annotations) (download)
Mon Jun 8 03:32:33 2009 UTC (15 years ago) by jmc
Branch: MAIN
Changes since 1.9: +144 -128 lines
 - do tiled IO in 1 piece (all levels at a time)
 - multi-threaded: allow to read/write local (non-shared) array
   (was already working with singleCpuIO ; now works also without);
 - move barrier calls outside gather/scatter_2d to mds_read/write field

1 jmc 1.10 C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_read_field.F,v 1.9 2009/06/01 14:20:31 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "MDSIO_OPTIONS.h"
5    
6     CBOP
7     C !ROUTINE: MDS_READ_FIELD
8     C !INTERFACE:
9     SUBROUTINE MDS_READ_FIELD(
10     I fName,
11     I filePrec,
12     I useCurrentDir,
13     I arrType,
14 jmc 1.3 I kSize,kLo,kHi,
15 jmc 1.1 O arr,
16     I irecord,
17     I myThid )
18    
19     C !DESCRIPTION:
20     C Arguments:
21     C
22     C fName (string) :: base name for file to read
23     C filePrec (integer) :: number of bits per word in file (32 or 64)
24     C useCurrentDir(logic):: always read from the current directory (even if
25     C "mdsioLocalDir" is set)
26     C arrType (char(2)) :: declaration of "arr": either "RS" or "RL"
27 jmc 1.3 C kSize (integer) :: size of third dimension: normally either 1 or Nr
28     C kLo (integer) :: 1rst vertical level (of array "arr") to read-in
29     C kHi (integer) :: last vertical level (of array "arr") to read-in
30     C arr ( RS/RL ) :: array to read into, arr(:,:,kSize,:,:)
31 jmc 1.1 C irecord (integer) :: record number to read
32     C myIter (integer) :: time step number
33     C myThid (integer) :: thread identifier
34     C
35     C MDS_READ_FIELD first checks to see IF the file "fName" exists, then
36 jmc 1.3 C IF the file "fName.data" exists and finally the tiled files of the
37     C form "fName.xxx.yyy.data" exist. Currently, the meta-files are not
38     C read because it is difficult to parse files in fortran.
39 jmc 1.1 C The precision of the file is decsribed by filePrec, set either
40 jmc 1.3 C to floatPrec32 or floatPrec64. The precision or declaration of
41     C the array argument must be consistently described by the char*(2)
42     C string arrType, either "RS" or "RL".
43     C (kSize,kLo,kHi) allows for both 2-D and 3-D arrays to be handled, with
44     C the option to only read and fill-in a sub-set of consecutive vertical
45     C levels (from kLo to kHi) ; (kSize,kLo,kHi)=(1,1,1) implies a 2-D model
46     C field and (kSize,kLo,kHi)=(Nr,1,Nr) implies a 3-D model field.
47     C irecord is the record number to be read and must be >= 1.
48     C The file data is stored in arr *but* the overlaps are *not* updated,
49     C i.e., an exchange must be called. This is because the routine is
50     C sometimes called from within a MASTER_THID region.
51 jmc 1.1 C
52     C Created: 03/16/99 adcroft@mit.edu
53     CEOP
54    
55     C !USES:
56     IMPLICIT NONE
57     C Global variables / common blocks
58     #include "SIZE.h"
59     #include "EEPARAMS.h"
60     #include "PARAMS.h"
61     #ifdef ALLOW_EXCH2
62 jmc 1.7 #include "W2_EXCH2_SIZE.h"
63 jmc 1.1 #include "W2_EXCH2_TOPOLOGY.h"
64 jmc 1.8 #include "W2_EXCH2_PARAMS.h"
65 jmc 1.1 #endif /* ALLOW_EXCH2 */
66 jmc 1.8 #include "EEBUFF_SCPU.h"
67 jmc 1.10 #include "MDSIO_BUFF_3D.h"
68 jmc 1.1
69     C !INPUT PARAMETERS:
70     CHARACTER*(*) fName
71     INTEGER filePrec
72     LOGICAL useCurrentDir
73     CHARACTER*(2) arrType
74 jmc 1.3 INTEGER kSize, kLo, kHi
75 jmc 1.1 INTEGER irecord
76     INTEGER myThid
77     C !OUTPUT PARAMETERS:
78     Real arr(*)
79    
80     C !FUNCTIONS
81     INTEGER ILNBLNK
82     INTEGER MDS_RECLEN
83     LOGICAL MASTER_CPU_IO
84     EXTERNAL ILNBLNK
85     EXTERNAL MDS_RECLEN
86     EXTERNAL MASTER_CPU_IO
87    
88     C !LOCAL VARIABLES:
89 jmc 1.10 C bBij :: base shift in Buffer index for tile bi,bj
90 jmc 1.1 CHARACTER*(MAX_LEN_FNAM) dataFName,pfName
91     CHARACTER*(MAX_LEN_MBUF) msgBuf
92     LOGICAL exst
93     LOGICAL globalFile, fileIsOpen
94     LOGICAL iAmDoingIO
95 jmc 1.8 LOGICAL useExch2ioLayOut
96 jmc 1.5 INTEGER xSize, ySize
97 jmc 1.10 INTEGER iG,jG,bi,bj
98     INTEGER i1,i2,i,j,k,nNz
99 jmc 1.3 INTEGER irec,dUnit,IL,pIL
100 jahn 1.4 INTEGER length_of_rec
101 jmc 1.10 INTEGER bBij
102 jmc 1.8 INTEGER tNx, tNy, global_nTx
103     INTEGER tBx, tBy, iGjLoc, jGjLoc
104 jmc 1.1 #ifdef ALLOW_EXCH2
105 jmc 1.8 INTEGER tN
106 jmc 1.1 #endif /* ALLOW_EXCH2 */
107    
108     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
109 jmc 1.5 C Set dimensions:
110     xSize = Nx
111     ySize = Ny
112 jmc 1.8 useExch2ioLayOut = .FALSE.
113     #ifdef ALLOW_EXCH2
114     IF ( W2_useE2ioLayOut ) THEN
115     xSize = exch2_global_Nx
116     ySize = exch2_global_Ny
117     useExch2ioLayOut = .TRUE.
118     ENDIF
119     #endif /* ALLOW_EXCH2 */
120 jmc 1.1
121     C Assume nothing
122     globalFile = .FALSE.
123     fileIsOpen = .FALSE.
124     IL = ILNBLNK( fName )
125     pIL = ILNBLNK( mdsioLocalDir )
126 jmc 1.3 nNz = 1 + kHi - kLo
127 jmc 1.1
128     C Only do I/O if I am the master thread (and mpi process 0 IF useSingleCpuIO):
129     iAmDoingIO = MASTER_CPU_IO(myThid)
130    
131 jmc 1.10 C Record number must be >= 1
132     IF (irecord .LT. 1) THEN
133     WRITE(msgBuf,'(A,I9.8)')
134     & ' MDS_READ_FIELD: argument irecord = ',irecord
135     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
136     & SQUEEZE_RIGHT , myThid)
137     WRITE(msgBuf,'(A)')
138     & ' MDS_READ_FIELD: Invalid value for irecord'
139     CALL PRINT_ERROR( msgBuf, myThid )
140     CALL ALL_PROC_DIE( myThid )
141     STOP 'ABNORMAL END: S/R MDS_READ_FIELD'
142     ENDIF
143     C check for valid sub-set of levels:
144     IF ( kLo.LT.1 .OR. kHi.GT.kSize ) THEN
145     WRITE(msgBuf,'(3(A,I6))')
146     & ' MDS_READ_FIELD: arguments kSize=', kSize,
147     & ' , kLo=', kLo, ' , kHi=', kHi
148     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
149     & SQUEEZE_RIGHT , myThid)
150     WRITE(msgBuf,'(A)')
151     & ' MDS_READ_FIELD: invalid sub-set of levels'
152     CALL PRINT_ERROR( msgBuf, myThid )
153     CALL ALL_PROC_DIE( myThid )
154     STOP 'ABNORMAL END: S/R MDS_READ_FIELD'
155     ENDIF
156     C check for 3-D Buffer size:
157     IF ( .NOT.useSingleCpuIO .AND. nNz.GT.size3dBuf ) THEN
158     WRITE(msgBuf,'(3(A,I6))')
159     & ' MDS_READ_FIELD: Nb Lev to read =', nNz,
160     & ' >', size3dBuf, ' = buffer 3rd Dim'
161     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
162     & SQUEEZE_RIGHT , myThid)
163     WRITE(msgBuf,'(A)')
164     & ' MDS_READ_FIELD: buffer 3rd Dim. too small'
165     CALL PRINT_ERROR( msgBuf, myThid )
166     WRITE(msgBuf,'(A)')
167     & ' increase "size3dBuf" in "MDSIO_BUFF_3D.h" and recompile'
168     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
169     & SQUEEZE_RIGHT , myThid)
170     CALL ALL_PROC_DIE( myThid )
171     STOP 'ABNORMAL END: S/R MDS_READ_FIELD'
172     ENDIF
173    
174 jmc 1.1 C Only do I/O if I am the master thread
175     IF ( iAmDoingIO ) THEN
176    
177     C Assign special directory
178     IF ( useCurrentDir .OR. pIL.EQ.0 ) THEN
179     pfName= fName
180     ELSE
181     WRITE(pfName,'(2a)') mdsioLocalDir(1:pIL), fName(1:IL)
182     ENDIF
183     pIL=ILNBLNK( pfName )
184    
185     C Assign a free unit number as the I/O channel for this routine
186     CALL MDSFINDUNIT( dUnit, myThid )
187    
188     C Check first for global file with simple name (ie. fName)
189     dataFName = fName
190     INQUIRE( file=dataFName, exist=exst )
191     IF (exst) THEN
192     IF ( debugLevel .GE. debLevA ) THEN
193     WRITE(msgBuf,'(A,A)')
194     & ' MDS_READ_FIELD: opening global file: ',dataFName(1:IL)
195     #ifndef ALLOW_ECCO
196     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
197     & SQUEEZE_RIGHT , myThid)
198     #endif
199     ENDIF
200     globalFile = .TRUE.
201     ENDIF
202    
203     C If negative check for global file with MDS name (ie. fName.data)
204     IF (.NOT. globalFile) THEN
205     WRITE(dataFName,'(2a)') fName(1:IL),'.data'
206     INQUIRE( file=dataFName, exist=exst )
207     IF (exst) THEN
208     IF ( debugLevel .GE. debLevA ) THEN
209     WRITE(msgBuf,'(A,A)')
210     & ' MDS_READ_FIELD: opening global file: ',dataFName(1:IL+5)
211     #ifndef ALLOW_ECCO
212     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
213     & SQUEEZE_RIGHT , myThid)
214     #endif
215     ENDIF
216     globalFile = .TRUE.
217     ENDIF
218     ENDIF
219    
220     C- endif iAmDoingIO
221     ENDIF
222    
223     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
224    
225     IF ( useSingleCPUIO ) THEN
226    
227     C master thread of process 0, only, opens a global file
228     IF ( iAmDoingIO ) THEN
229     C If global file is visible to process 0, then open it here.
230     C Otherwise stop program.
231     IF ( globalFile) THEN
232 jmc 1.9 length_of_rec = MDS_RECLEN( filePrec, xSize*ySize, myThid )
233 jmc 1.1 OPEN( dUnit, file=dataFName, status='old',
234     & access='direct', recl=length_of_rec )
235     ELSE
236     WRITE(msgBuf,'(2A)')
237     & ' MDS_READ_FIELD: filename: ', dataFName(1:IL+5)
238     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
239     & SQUEEZE_RIGHT , myThid)
240     CALL PRINT_ERROR( msgBuf, myThid )
241     WRITE(msgBuf,'(A)')
242     & ' MDS_READ_FIELD: File does not exist'
243     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
244     & SQUEEZE_RIGHT , myThid)
245     CALL PRINT_ERROR( msgBuf, myThid )
246     STOP 'ABNORMAL END: S/R MDS_READ_FIELD'
247     ENDIF
248     C- endif iAmDoingIO
249     ENDIF
250    
251 jmc 1.3 DO k=kLo,kHi
252 jmc 1.1
253     C master thread of process 0, only, read from file
254     IF ( iAmDoingIO ) THEN
255 jmc 1.9 irec = 1 + k-kLo + (irecord-1)*nNz
256 jmc 1.1 IF (filePrec .EQ. precFloat32) THEN
257 jmc 1.5 READ(dUnit,rec=irec) ( xy_buffer_r4(i),i=1,xSize*ySize )
258 jmc 1.1 #ifdef _BYTESWAPIO
259 jmc 1.5 CALL MDS_BYTESWAPR4( xSize*ySize, xy_buffer_r4 )
260 jmc 1.1 #endif
261 jmc 1.10 ELSE
262 jmc 1.5 READ(dUnit,rec=irec) ( xy_buffer_r8(i),i=1,xSize*ySize )
263 jmc 1.2 #ifdef _BYTESWAPIO
264 jmc 1.5 CALL MDS_BYTESWAPR8( xSize*ySize, xy_buffer_r8 )
265 jmc 1.2 #endif
266     ENDIF
267 jmc 1.1 C- endif iAmDoingIO
268     ENDIF
269 jmc 1.6
270 jmc 1.10 C Wait for all thread to finish. This prevents other threads to continue
271     C to acces shared buffer while master thread is loading data into
272     CALL BAR2( myThid )
273    
274 jmc 1.6 IF ( filePrec.EQ.precFloat32 ) THEN
275     CALL SCATTER_2D_R4(
276     U xy_buffer_r4,
277     O sharedLocBuf_r4,
278     I xSize, ySize,
279 jmc 1.8 I useExch2ioLayOut, .FALSE., myThid )
280 jmc 1.10 C All threads wait for Master to finish loading into shared buffer
281     CALL BAR2( myThid )
282 jmc 1.6 IF ( arrType.EQ.'RS' ) THEN
283 jmc 1.9 CALL MDS_PASS_R4toRS( sharedLocBuf_r4, arr,
284 jmc 1.10 I 1, k, kSize, 0, 0, .TRUE., myThid )
285 jmc 1.6 ELSEIF ( arrType.EQ.'RL' ) THEN
286 jmc 1.9 CALL MDS_PASS_R4toRL( sharedLocBuf_r4, arr,
287 jmc 1.10 I 1, k, kSize, 0, 0, .TRUE., myThid )
288 jmc 1.6 ELSE
289     WRITE(msgBuf,'(A)')
290     & ' MDS_READ_FIELD: illegal value for arrType'
291     CALL PRINT_ERROR( msgBuf, myThid )
292 jmc 1.10 CALL ALL_PROC_DIE( myThid )
293 jmc 1.6 STOP 'ABNORMAL END: S/R MDS_READ_FIELD'
294     ENDIF
295 jmc 1.10 ELSEIF ( filePrec.EQ.precFloat64 ) THEN
296 jmc 1.6 CALL SCATTER_2D_R8(
297     U xy_buffer_r8,
298     O sharedLocBuf_r8,
299     I xSize, ySize,
300 jmc 1.8 I useExch2ioLayOut, .FALSE., myThid )
301 jmc 1.10 C All threads wait for Master to finish loading into shared buffer
302     CALL BAR2( myThid )
303 jmc 1.6 IF ( arrType.EQ.'RS' ) THEN
304 jmc 1.9 CALL MDS_PASS_R8toRS( sharedLocBuf_r8, arr,
305 jmc 1.10 I 1, k, kSize, 0, 0, .TRUE., myThid )
306 jmc 1.6 ELSEIF ( arrType.EQ.'RL' ) THEN
307 jmc 1.9 CALL MDS_PASS_R8toRL( sharedLocBuf_r8, arr,
308 jmc 1.10 I 1, k, kSize, 0, 0, .TRUE., myThid )
309 jmc 1.6 ELSE
310     WRITE(msgBuf,'(A)')
311 jmc 1.1 & ' MDS_READ_FIELD: illegal value for arrType'
312 jmc 1.6 CALL PRINT_ERROR( msgBuf, myThid )
313 jmc 1.10 CALL ALL_PROC_DIE( myThid )
314 jmc 1.6 STOP 'ABNORMAL END: S/R MDS_READ_FIELD'
315     ENDIF
316 jmc 1.10 ELSE
317     WRITE(msgBuf,'(A)')
318     & ' MDS_READ_FIELD: illegal value for filePrec'
319     CALL PRINT_ERROR( msgBuf, myThid )
320     CALL ALL_PROC_DIE( myThid )
321     STOP 'ABNORMAL END: S/R MDS_READ_FIELD'
322 jmc 1.1 ENDIF
323    
324     ENDDO
325 jmc 1.3 c ENDDO k=kLo,kHi
326 jmc 1.1
327     IF ( iAmDoingIO ) THEN
328     CLOSE( dUnit )
329     ENDIF
330    
331     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
332     C--- else .NOT.useSingleCpuIO
333     ELSE
334    
335 jmc 1.10 C Wait for all thread to finish. This prevents other threads to continue
336     C to acces 3-D buffer while master thread is reading
337     CALL BAR2( myThid )
338    
339 jmc 1.1 C Only do I/O if I am the master thread
340     IF ( iAmDoingIO ) THEN
341    
342     C If we are reading from a global file then we open it here
343     IF (globalFile) THEN
344 jmc 1.9 length_of_rec = MDS_RECLEN( filePrec, sNx, myThid )
345 jmc 1.1 OPEN( dUnit, file=dataFName, status='old',
346     & access='direct', recl=length_of_rec )
347     fileIsOpen=.TRUE.
348     ENDIF
349    
350     C Loop over all tiles
351     DO bj=1,nSy
352     DO bi=1,nSx
353 jmc 1.10 bBij = sNx*sNy*nNz*( bi-1 + (bj-1)*nSx )
354 jmc 1.1
355 jmc 1.9 IF (globalFile) THEN
356     C--- Case of 1 Global file:
357    
358     c IF (fileIsOpen) THEN
359 jmc 1.8 tNx = sNx
360 jmc 1.1 tNy = sNy
361 jmc 1.8 global_nTx = xSize/sNx
362     tBx = myXGlobalLo-1 + (bi-1)*sNx
363     tBy = myYGlobalLo-1 + (bj-1)*sNy
364     iGjLoc = 0
365     jGjLoc = 1
366 jmc 1.1 #ifdef ALLOW_EXCH2
367 jmc 1.8 IF ( useExch2ioLayOut ) THEN
368     tN = W2_myTileList(bi)
369     c tNx = exch2_tNx(tN)
370     c tNy = exch2_tNy(tN)
371     c global_nTx = exch2_global_Nx/tNx
372     tBx = exch2_txGlobalo(tN) - 1
373     tBy = exch2_tyGlobalo(tN) - 1
374     IF ( exch2_mydNx(tN) .GT. xSize ) THEN
375     C- face x-size larger than glob-size : fold it
376     iGjLoc = 0
377     jGjLoc = exch2_mydNx(tN) / xSize
378     ELSEIF ( exch2_tNy(tN) .GT. ySize ) THEN
379     C- tile y-size larger than glob-size : make a long line
380     iGjLoc = exch2_mydNx(tN)
381     jGjLoc = 0
382     ELSE
383     C- default (face fit into global-IO-array)
384     iGjLoc = 0
385     jGjLoc = 1
386     ENDIF
387 jmc 1.2 ENDIF
388 jmc 1.1 #endif /* ALLOW_EXCH2 */
389 jmc 1.10
390 jmc 1.3 DO k=kLo,kHi
391 jmc 1.1 DO j=1,tNy
392 jmc 1.9 irec = 1 + ( tBx + (j-1)*iGjLoc )/sNx
393     & + ( tBy + (j-1)*jGjLoc )*global_nTx
394     & +( k-kLo + (irecord-1)*nNz )*global_nTx*ySize
395 jmc 1.10 i1 = bBij + 1 + (j-1)*sNx + (k-kLo)*sNx*sNy
396     i2 = bBij + j*sNx + (k-kLo)*sNx*sNy
397     IF ( filePrec.EQ.precFloat32 ) THEN
398     READ(dUnit,rec=irec) (shared3dBuf_r4(i),i=i1,i2)
399 jmc 1.1 ELSE
400 jmc 1.10 READ(dUnit,rec=irec) (shared3dBuf_r8(i),i=i1,i2)
401 jmc 1.1 ENDIF
402 jmc 1.10 C End of j,k loops
403 jmc 1.1 ENDDO
404     ENDDO
405 jmc 1.9
406 jmc 1.1 C end if fileIsOpen
407 jmc 1.9 c ENDIF
408    
409     ELSE
410     C--- Case of 1 file per tile (globalFile=F):
411    
412     C If we are reading from a tiled MDS file then we open each one here
413     iG=bi+(myXGlobalLo-1)/sNx
414     jG=bj+(myYGlobalLo-1)/sNy
415     WRITE(dataFName,'(2A,I3.3,A,I3.3,A)')
416     & pfName(1:pIL),'.',iG,'.',jG,'.data'
417     INQUIRE( file=dataFName, exist=exst )
418     C Of course, we only open the file if the tile is "active"
419     C (This is a place-holder for the active/passive mechanism
420     IF (exst) THEN
421     IF ( debugLevel .GE. debLevA ) THEN
422     WRITE(msgBuf,'(A,A)')
423     & ' MDS_READ_FIELD: opening file: ',dataFName(1:pIL+13)
424     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
425     & SQUEEZE_RIGHT , myThid)
426     ENDIF
427 jmc 1.10 length_of_rec = MDS_RECLEN( filePrec, sNx*sNy*nNz, myThid )
428 jmc 1.9 OPEN( dUnit, file=dataFName, status='old',
429     & access='direct', recl=length_of_rec )
430     fileIsOpen=.TRUE.
431     ELSE
432     fileIsOpen=.FALSE.
433     WRITE(msgBuf,'(4A)') ' MDS_READ_FIELD: filename: ',
434     & fName(1:IL),' , ', dataFName(1:pIL+13)
435     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
436     & SQUEEZE_RIGHT , myThid)
437     CALL PRINT_ERROR( msgBuf, myThid )
438     WRITE(msgBuf,'(A)')
439     & ' MDS_READ_FIELD: Files DO not exist'
440     CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
441     & SQUEEZE_RIGHT , myThid)
442     CALL PRINT_ERROR( msgBuf, myThid )
443     STOP 'ABNORMAL END: S/R MDS_READ_FIELD'
444     ENDIF
445    
446 jmc 1.10 irec = irecord
447     i1 = bBij + 1
448     i2 = bBij + sNx*sNy*nNz
449     IF ( filePrec.EQ.precFloat32 ) THEN
450     READ(dUnit,rec=irec) (shared3dBuf_r4(i),i=i1,i2)
451     ELSE
452     READ(dUnit,rec=irec) (shared3dBuf_r8(i),i=i1,i2)
453     ENDIF
454 jmc 1.9
455     C here We close the tiled MDS file
456     IF ( fileIsOpen ) THEN
457 jmc 1.10 CLOSE( dUnit )
458     fileIsOpen = .FALSE.
459 jmc 1.9 ENDIF
460    
461     C--- End Global File / tile-file cases
462 jmc 1.1 ENDIF
463 jmc 1.9
464 jmc 1.1 C End of bi,bj loops
465     ENDDO
466     ENDDO
467    
468     C If global file was opened then close it
469     IF (fileIsOpen .AND. globalFile) THEN
470 jmc 1.10 CLOSE( dUnit )
471     fileIsOpen = .FALSE.
472     ENDIF
473    
474     #ifdef _BYTESWAPIO
475     IF ( filePrec.EQ.precFloat32 ) THEN
476     CALL MDS_BYTESWAPR4( sNx*sNy*nNz*nSx*nSy, shared3dBuf_r4 )
477     ELSE
478     CALL MDS_BYTESWAPR8( sNx*sNy*nNz*nSx*nSy, shared3dBuf_r8 )
479 jmc 1.1 ENDIF
480 jmc 1.10 #endif
481 jmc 1.1
482     C- endif iAmDoingIO
483     ENDIF
484    
485 jmc 1.10 C All threads wait for Master to finish reading into shared buffer
486     CALL BAR2( myThid )
487    
488     C--- Copy from 3-D buffer to arr (multi-threads):
489     IF ( filePrec.EQ.precFloat32 ) THEN
490     IF ( arrType.EQ.'RS' ) THEN
491     CALL MDS_PASS_R4toRS( shared3dBuf_r4, arr,
492     I nNz, kLo, kSize, 0, 0, .TRUE., myThid )
493     ELSEIF ( arrType.EQ.'RL' ) THEN
494     CALL MDS_PASS_R4toRL( shared3dBuf_r4, arr,
495     I nNz, kLo, kSize, 0, 0, .TRUE., myThid )
496     ELSE
497     WRITE(msgBuf,'(A)')
498     & ' MDS_READ_FIELD: illegal value for arrType'
499     CALL PRINT_ERROR( msgBuf, myThid )
500     CALL ALL_PROC_DIE( myThid )
501     STOP 'ABNORMAL END: S/R MDS_READ_FIELD'
502     ENDIF
503     ELSEIF ( filePrec.EQ.precFloat64 ) THEN
504     IF ( arrType.EQ.'RS' ) THEN
505     CALL MDS_PASS_R8toRS( shared3dBuf_r8, arr,
506     I nNz, kLo, kSize, 0, 0, .TRUE., myThid )
507     ELSEIF ( arrType.EQ.'RL' ) THEN
508     CALL MDS_PASS_R8toRL( shared3dBuf_r8, arr,
509     I nNz, kLo, kSize, 0, 0, .TRUE., myThid )
510     ELSE
511     WRITE(msgBuf,'(A)')
512     & ' MDS_READ_FIELD: illegal value for arrType'
513     CALL PRINT_ERROR( msgBuf, myThid )
514     CALL ALL_PROC_DIE( myThid )
515     STOP 'ABNORMAL END: S/R MDS_READ_FIELD'
516     ENDIF
517     ELSE
518     WRITE(msgBuf,'(A)')
519     & ' MDS_READ_FIELD: illegal value for filePrec'
520     CALL PRINT_ERROR( msgBuf, myThid )
521     CALL ALL_PROC_DIE( myThid )
522     STOP 'ABNORMAL END: S/R MDS_READ_FIELD'
523     ENDIF
524    
525 jmc 1.1 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
526     C if useSingleCpuIO / else / end
527     ENDIF
528    
529     RETURN
530     END

  ViewVC Help
Powered by ViewVC 1.1.22