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

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

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


Revision 1.14 - (hide annotations) (download)
Sun Nov 6 01:25:13 2005 UTC (18 years, 7 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint58b_post, checkpoint57y_post, checkpoint59, checkpoint58, checkpoint58f_post, checkpoint58d_post, checkpoint58a_post, checkpoint57z_post, checkpoint58y_post, checkpoint58t_post, checkpoint58m_post, checkpoint58w_post, checkpoint57y_pre, checkpoint58o_post, checkpoint58p_post, checkpoint58q_post, checkpoint58e_post, mitgcm_mapl_00, checkpoint58r_post, checkpoint58n_post, checkpoint59a, checkpoint58k_post, checkpoint58v_post, checkpoint58l_post, checkpoint58g_post, checkpoint58x_post, checkpoint58h_post, checkpoint58j_post, checkpoint58i_post, checkpoint57x_post, checkpoint58c_post, checkpoint58u_post, checkpoint58s_post
Changes since 1.13: +6 -3 lines
remove unused variables (reduces number of compiler warnings)

1 jmc 1.14 C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_gl.F,v 1.13 2005/11/05 01:05:14 jmc Exp $
2     C $Name: $
3 adcroft 1.1
4 edhill 1.4 #include "MDSIO_OPTIONS.h"
5 heimbach 1.2
6     C The five "public" routines supplied here are:
7     C
8     C MDSREADFIELD - read model field from direct access global or tiled MDS file
9     C MDSWRITEFIELD - write model field to direct access global or tiled MDS file
10     C MDSFINDUNIT - returns an available (unused) I/O channel
11     C MDSREADVECTOR - read vector from direct access global or tiled MDS file
12     C MDSWRITEVECTOR - write vector to direct access global or tiled MDS file
13     C
14     C all other routines are "private" to these utilities and ought
15     C not be accessed directly from the main code.
16     C
17     C Created: 03/16/99 adcroft@mit.edu
18     C Modified: 03/23/99 adcroft@mit.edu
19     C To work with multiple records
20     C Modified: 03/29/99 eckert@mit.edu
21     C Added arbitrary vector capability
22     C Modified: 07/27/99 eckert@mit.edu
23     C Customized for state estimation (--> active_file_control.F)
24     C this relates only to *mdsreadvector* and *mdswritevector*
25     C Modified: 07/28/99 eckert@mit.edu
26     C inserted calls to *print_message* and *print_error*
27     C
28     C To be modified to work with MITgcmuv message routines.
29 adcroft 1.1
30     C=======================================================================
31 heimbach 1.2 SUBROUTINE MDSREADFIELD_3D_GL(
32 adcroft 1.1 I fName,
33     I filePrec,
34     I arrType,
35     I nNz,
36     O arr_gl,
37     I irecord,
38     I myThid )
39     C
40     C Arguments:
41     C
42     C fName string base name for file to read
43     C filePrec integer number of bits per word in file (32 or 64)
44     C arrType char(2) declaration of "arr": either "RS" or "RL"
45     C nNz integer size of third dimension: normally either 1 or Nr
46     C arr RS/RL array to read into, arr(:,:,nNz,:,:)
47     C irecord integer record number to read
48     C myThid integer thread identifier
49     C
50     C MDSREADFIELD first checks to see if the file "fName" exists, then
51     C if the file "fName.data" exists and finally the tiled files of the
52     C form "fName.xxx.yyy.data" exist. Currently, the meta-files are not
53     C read because it is difficult to parse files in fortran.
54     C The precision of the file is decsribed by filePrec, set either
55     C to floatPrec32 or floatPrec64. The precision or declaration of
56     C the array argument must be consistently described by the char*(2)
57     C string arrType, either "RS" or "RL". nNz allows for both 2-D and
58     C 3-D arrays to be handled. nNz=1 implies a 2-D model field and
59     C nNz=Nr implies a 3-D model field. irecord is the record number
60     C to be read and must be >= 1. The file data is stored in
61     C arr *but* the overlaps are *not* updated. ie. An exchange must
62     C be called. This is because the routine is sometimes called from
63     C within a MASTER_THID region.
64     C
65 heimbach 1.2 C Created: 03/16/99 adcroft@mit.edu
66 adcroft 1.1
67     implicit none
68     C Global variables / common blocks
69     #include "SIZE.h"
70     #include "EEPARAMS.h"
71 heimbach 1.7 #include "EESUPPORT.h"
72 adcroft 1.1 #include "PARAMS.h"
73    
74     C Routine arguments
75     character*(*) fName
76     integer filePrec
77     character*(2) arrType
78     integer nNz
79 heimbach 1.2 _RL arr_gl(sNx,nSx,nPx,sNy,nSy,nPy,Nr)
80 adcroft 1.1 integer irecord
81     integer myThid
82     C Functions
83     integer ILNBLNK
84     integer MDS_RECLEN
85     C Local variables
86 jmc 1.13 character*(MAX_LEN_FNAM) dataFName
87 heimbach 1.10 integer ip,jp,iG,jG,irec,bi,bj,i,j,k,dUnit,IL
88 adcroft 1.1 logical exst
89     _RL arr(1-oLx:sNx+oLx,1-oLy:sNy+oLy,Nr,nSx,nSy)
90     Real*4 r4seg(sNx)
91     Real*8 r8seg(sNx)
92     logical globalFile,fileIsOpen
93     integer length_of_rec
94     character*(max_len_mbuf) msgbuf
95 heimbach 1.9 cph-usesingle(
96     integer ii,jj
97 jmc 1.13 c integer iG_IO,jG_IO,npe
98     integer x_size,y_size
99 heimbach 1.9 PARAMETER ( x_size = Nx )
100     PARAMETER ( y_size = Ny )
101     Real*4 xy_buffer_r4(x_size,y_size)
102     Real*8 xy_buffer_r8(x_size,y_size)
103     Real*8 global(Nx,Ny)
104 jmc 1.13 c _RL local(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
105 heimbach 1.9 cph-usesingle)
106    
107 adcroft 1.1 C ------------------------------------------------------------------
108    
109     C Only do I/O if I am the master thread
110     _BEGIN_MASTER( myThid )
111    
112     C Record number must be >= 1
113     if (irecord .LT. 1) then
114     write(msgbuf,'(a,i9.8)')
115     & ' MDSREADFIELD_GL: argument irecord = ',irecord
116     call print_message( msgbuf, standardmessageunit,
117     & SQUEEZE_RIGHT , mythid)
118     write(msgbuf,'(a)')
119     & ' MDSREADFIELD_GL: Invalid value for irecord'
120     call print_error( msgbuf, mythid )
121     stop 'ABNORMAL END: S/R MDSREADFIELD_GL'
122     endif
123    
124     C Assume nothing
125     globalFile = .FALSE.
126     fileIsOpen = .FALSE.
127     IL=ILNBLNK( fName )
128    
129     C Assign a free unit number as the I/O channel for this routine
130     call MDSFINDUNIT( dUnit, mythid )
131    
132 heimbach 1.9 if ( useSingleCPUIO ) then
133    
134     #ifdef ALLOW_USE_MPI
135     IF( mpiMyId .EQ. 0 ) THEN
136     #else
137     IF ( .TRUE. ) THEN
138     #endif /* ALLOW_USE_MPI */
139    
140 adcroft 1.1 C Check first for global file with simple name (ie. fName)
141 heimbach 1.9 dataFName = fName
142     inquire( file=dataFname, exist=exst )
143     if (exst) globalFile = .TRUE.
144 adcroft 1.1
145     C If negative check for global file with MDS name (ie. fName.data)
146 heimbach 1.9 if (.NOT. globalFile) then
147 jmc 1.13 write(dataFname,'(2a)') fName(1:IL),'.data'
148 heimbach 1.9 inquire( file=dataFname, exist=exst )
149     if (exst) globalFile = .TRUE.
150     endif
151    
152     C If global file is visible to process 0, then open it here.
153     C Otherwise stop program.
154     if ( globalFile) then
155     length_of_rec=MDS_RECLEN( filePrec, x_size*y_size, mythid )
156     open( dUnit, file=dataFName, status='old',
157     & access='direct', recl=length_of_rec )
158     else
159 jmc 1.13 write(msgbuf,'(2a)')
160     & ' MDSREADFIELD: filename: ',dataFName(1:IL)
161 heimbach 1.9 call print_message( msgbuf, standardmessageunit,
162     & SQUEEZE_RIGHT , mythid)
163     call print_error( msgbuf, mythid )
164     write(msgbuf,'(a)')
165     & ' MDSREADFIELD: File does not exist'
166     call print_message( msgbuf, standardmessageunit,
167     & SQUEEZE_RIGHT , mythid)
168     call print_error( msgbuf, mythid )
169     stop 'ABNORMAL END: S/R MDSREADFIELD'
170     endif
171    
172     ENDIF
173    
174     c-- useSingleCpuIO
175     else
176     C Only do I/O if I am the master thread
177    
178     C Check first for global file with simple name (ie. fName)
179     dataFName = fName
180 adcroft 1.1 inquire( file=dataFname, exist=exst )
181     if (exst) then
182     write(msgbuf,'(a,a)')
183 jmc 1.13 & ' MDSREADFIELD: opening global file: ',dataFName(1:IL)
184 adcroft 1.1 call print_message( msgbuf, standardmessageunit,
185     & SQUEEZE_RIGHT , mythid)
186     endif
187 heimbach 1.9
188     C If negative check for global file with MDS name (ie. fName.data)
189     if (.NOT. globalFile) then
190 jmc 1.13 write(dataFname,'(2a)') fName(1:IL),'.data'
191 heimbach 1.9 inquire( file=dataFname, exist=exst )
192     if (exst) then
193     write(msgbuf,'(a,a)')
194 jmc 1.13 & ' MDSREADFIELD_GL: opening global file: ',dataFName(1:IL+5)
195 heimbach 1.9 call print_message( msgbuf, standardmessageunit,
196     & SQUEEZE_RIGHT , mythid)
197     globalFile = .TRUE.
198     endif
199     endif
200    
201     c-- useSingleCpuIO
202 adcroft 1.1 endif
203 heimbach 1.7
204 heimbach 1.9 if ( .not. useSingleCpuIO ) then
205 heimbach 1.12 cph if ( .not. ( globalFile .and. useSingleCPUIO ) ) then
206 heimbach 1.9 if ( .not. ( globalFile ) ) then
207 heimbach 1.7
208     C If we are reading from a global file then we open it here
209     if (globalFile) then
210     length_of_rec=MDS_RECLEN( filePrec, sNx, mythid )
211     open( dUnit, file=dataFName, status='old',
212     & access='direct', recl=length_of_rec )
213     fileIsOpen=.TRUE.
214     endif
215    
216 adcroft 1.1 C Loop over all processors
217     do jp=1,nPy
218     do ip=1,nPx
219     C Loop over all tiles
220     do bj=1,nSy
221     do bi=1,nSx
222     C If we are reading from a tiled MDS file then we open each one here
223     if (.NOT. globalFile) then
224     iG=bi+(ip-1)*nsx ! Kludge until unstructered tiles
225     jG=bj+(jp-1)*nsy ! Kludge until unstructered tiles
226 jmc 1.13 write(dataFname,'(2a,i3.3,a,i3.3,a)')
227 adcroft 1.1 & fName(1:IL),'.',iG,'.',jG,'.data'
228     inquire( file=dataFname, exist=exst )
229     C Of course, we only open the file if the tile is "active"
230     C (This is a place-holder for the active/passive mechanism
231     if (exst) then
232 heimbach 1.3 if ( debugLevel .GE. debLevA ) then
233     write(msgbuf,'(a,a)')
234 jmc 1.13 & ' MDSREADFIELD_GL: opening file: ',dataFName(1:IL+13)
235 heimbach 1.3 call print_message( msgbuf, standardmessageunit,
236 adcroft 1.1 & SQUEEZE_RIGHT , mythid)
237 heimbach 1.3 endif
238 adcroft 1.1 length_of_rec=MDS_RECLEN( filePrec, sNx, mythid )
239     open( dUnit, file=dataFName, status='old',
240     & access='direct', recl=length_of_rec )
241     fileIsOpen=.TRUE.
242     else
243     fileIsOpen=.FALSE.
244     write(msgbuf,'(a,a)')
245 jmc 1.13 & ' MDSREADFIELD_GL: filename: ',dataFName(1:IL+13)
246 adcroft 1.1 call print_message( msgbuf, standardmessageunit,
247     & SQUEEZE_RIGHT , mythid)
248 heimbach 1.6 call print_error( msgbuf, mythid )
249 adcroft 1.1 write(msgbuf,'(a)')
250     & ' MDSREADFIELD_GL: File does not exist'
251 heimbach 1.6 call print_message( msgbuf, standardmessageunit,
252     & SQUEEZE_RIGHT , mythid)
253 adcroft 1.1 call print_error( msgbuf, mythid )
254     stop 'ABNORMAL END: S/R MDSREADFIELD_GL'
255     endif
256     endif
257    
258     if (fileIsOpen) then
259 heimbach 1.2 do k=1,Nr
260 adcroft 1.1 do j=1,sNy
261 heimbach 1.7 if (globalFile) then
262     iG=bi+(ip-1)*nsx
263     jG=bj+(jp-1)*nsy
264     irec=1 + INT(iG/sNx) + nSx*nPx*(jG+j-1) + nSx*nPx*Ny*(k-1)
265     & + nSx*nPx*Ny*nNz*(irecord-1)
266     else
267 adcroft 1.1 iG = 0
268     jG = 0
269 heimbach 1.2 irec=j + sNy*(k-1) + sNy*Nr*(irecord-1)
270 heimbach 1.7 endif
271 adcroft 1.1 if (filePrec .eq. precFloat32) then
272     read(dUnit,rec=irec) r4seg
273     #ifdef _BYTESWAPIO
274     call MDS_BYTESWAPR4( sNx, r4seg )
275     #endif
276     if (arrType .eq. 'RS') then
277 heimbach 1.2 call MDS_SEG4toRS( j,bi,bj,k,Nr, r4seg, .TRUE., arr )
278 adcroft 1.1 elseif (arrType .eq. 'RL') then
279 heimbach 1.2 call MDS_SEG4toRL( j,bi,bj,k,Nr, r4seg, .TRUE., arr )
280 adcroft 1.1 else
281     write(msgbuf,'(a)')
282     & ' MDSREADFIELD_GL: illegal value for arrType'
283     call print_error( msgbuf, mythid )
284     stop 'ABNORMAL END: S/R MDSREADFIELD_GL'
285     endif
286     elseif (filePrec .eq. precFloat64) then
287     read(dUnit,rec=irec) r8seg
288     #ifdef _BYTESWAPIO
289     call MDS_BYTESWAPR8( sNx, r8seg )
290     #endif
291     if (arrType .eq. 'RS') then
292 heimbach 1.2 call MDS_SEG8toRS( j,bi,bj,k,Nr, r8seg, .TRUE., arr )
293 adcroft 1.1 elseif (arrType .eq. 'RL') then
294 heimbach 1.2 call MDS_SEG8toRL( j,bi,bj,k,Nr, r8seg, .TRUE., arr )
295 adcroft 1.1 else
296     write(msgbuf,'(a)')
297     & ' MDSREADFIELD_GL: illegal value for arrType'
298     call print_error( msgbuf, mythid )
299     stop 'ABNORMAL END: S/R MDSREADFIELD_GL'
300     endif
301     else
302     write(msgbuf,'(a)')
303     & ' MDSREADFIELD_GL: illegal value for filePrec'
304     call print_error( msgbuf, mythid )
305     stop 'ABNORMAL END: S/R MDSREADFIELD_GL'
306     endif
307     do ii=1,sNx
308     arr_gl(ii,bi,ip,j,bj,jp,k)=arr(ii,j,k,bi,bj)
309     enddo
310    
311     C End of j loop
312     enddo
313     C End of k loop
314     enddo
315     if (.NOT. globalFile) then
316     close( dUnit )
317     fileIsOpen = .FALSE.
318     endif
319     endif
320     C End of bi,bj loops
321     enddo
322     enddo
323     C End of ip,jp loops
324     enddo
325     enddo
326    
327     C If global file was opened then close it
328     if (fileIsOpen .AND. globalFile) then
329     close( dUnit )
330     fileIsOpen = .FALSE.
331     endif
332    
333 heimbach 1.9 c end of if ( .not. ( globalFile ) ) then
334     endif
335    
336 heimbach 1.12 c else of if ( .not. ( globalFile .and. useSingleCPUIO ) ) then
337 heimbach 1.9 else
338    
339     DO k=1,nNz
340    
341     #ifdef ALLOW_USE_MPI
342     IF( mpiMyId .EQ. 0 ) THEN
343     #else
344     IF ( .TRUE. ) THEN
345     #endif /* ALLOW_USE_MPI */
346     irec = k+nNz*(irecord-1)
347     if (filePrec .eq. precFloat32) then
348     read(dUnit,rec=irec) xy_buffer_r4
349     #ifdef _BYTESWAPIO
350     call MDS_BYTESWAPR4( x_size*y_size, xy_buffer_r4 )
351     #endif
352     DO J=1,Ny
353     DO I=1,Nx
354     global(I,J) = xy_buffer_r4(I,J)
355     ENDDO
356     ENDDO
357     elseif (filePrec .eq. precFloat64) then
358     read(dUnit,rec=irec) xy_buffer_r8
359     #ifdef _BYTESWAPIO
360     call MDS_BYTESWAPR8( x_size*y_size, xy_buffer_r8 )
361     #endif
362     DO J=1,Ny
363     DO I=1,Nx
364     global(I,J) = xy_buffer_r8(I,J)
365     ENDDO
366     ENDDO
367     else
368     write(msgbuf,'(a)')
369     & ' MDSREADFIELD: illegal value for filePrec'
370     call print_error( msgbuf, mythid )
371     stop 'ABNORMAL END: S/R MDSREADFIELD'
372     endif
373     ENDIF
374     DO jp=1,nPy
375     DO ip=1,nPx
376     DO bj = myByLo(myThid), myByHi(myThid)
377     DO bi = myBxLo(myThid), myBxHi(myThid)
378     DO J=1,sNy
379     JJ=((jp-1)*nSy+(bj-1))*sNy+J
380     DO I=1,sNx
381     II=((ip-1)*nSx+(bi-1))*sNx+I
382     arr_gl(i,bi,ip,j,bj,jp,k) = global(II,JJ)
383     ENDDO
384     ENDDO
385     ENDDO
386     ENDDO
387     ENDDO
388     ENDDO
389    
390     ENDDO
391     c ENDDO k=1,nNz
392    
393     close( dUnit )
394    
395 heimbach 1.7 endif
396     c end of if ( .not. ( globalFile .and. useSingleCPUIO ) ) then
397    
398 adcroft 1.1 _END_MASTER( myThid )
399    
400     C ------------------------------------------------------------------
401     return
402     end
403     C=======================================================================
404    
405     C=======================================================================
406 heimbach 1.2 SUBROUTINE MDSWRITEFIELD_3D_GL(
407 adcroft 1.1 I fName,
408     I filePrec,
409     I arrType,
410     I nNz,
411     I arr_gl,
412     I irecord,
413     I myIter,
414     I myThid )
415     C
416     C Arguments:
417     C
418     C fName string base name for file to written
419     C filePrec integer number of bits per word in file (32 or 64)
420     C arrType char(2) declaration of "arr": either "RS" or "RL"
421     C nNz integer size of third dimension: normally either 1 or Nr
422     C arr RS/RL array to write, arr(:,:,nNz,:,:)
423     C irecord integer record number to read
424     C myIter integer time step number
425     C myThid integer thread identifier
426     C
427     C MDSWRITEFIELD creates either a file of the form "fName.data" and
428     C "fName.meta" if the logical flag "globalFile" is set true. Otherwise
429     C it creates MDS tiled files of the form "fName.xxx.yyy.data" and
430     C "fName.xxx.yyy.meta". A meta-file is always created.
431     C Currently, the meta-files are not read because it is difficult
432     C to parse files in fortran. We should read meta information before
433     C adding records to an existing multi-record file.
434     C The precision of the file is decsribed by filePrec, set either
435     C to floatPrec32 or floatPrec64. The precision or declaration of
436     C the array argument must be consistently described by the char*(2)
437     C string arrType, either "RS" or "RL". nNz allows for both 2-D and
438     C 3-D arrays to be handled. nNz=1 implies a 2-D model field and
439     C nNz=Nr implies a 3-D model field. irecord is the record number
440     C to be read and must be >= 1. NOTE: It is currently assumed that
441     C the highest record number in the file was the last record written.
442     C Nor is there a consistency check between the routine arguments and file.
443     C ie. if your write record 2 after record 4 the meta information
444     C will record the number of records to be 2. This, again, is because
445     C we have read the meta information. To be fixed.
446     C
447     C Created: 03/16/99 adcroft@mit.edu
448     C
449     C Changed: 05/31/00 heimbach@mit.edu
450     C open(dUnit, ..., status='old', ... -> status='unknown'
451    
452     implicit none
453     C Global variables / common blocks
454     #include "SIZE.h"
455     #include "EEPARAMS.h"
456 heimbach 1.7 #include "EESUPPORT.h"
457 adcroft 1.1 #include "PARAMS.h"
458    
459     C Routine arguments
460     character*(*) fName
461     integer filePrec
462     character*(2) arrType
463     integer nNz
464     cph(
465     cph Real arr(*)
466 heimbach 1.2 _RL arr_gl(sNx,nSx,nPx,sNy,nSy,nPy,Nr)
467 adcroft 1.1 cph)
468     integer irecord
469     integer myIter
470     integer myThid
471     C Functions
472     integer ILNBLNK
473     integer MDS_RECLEN
474     C Local variables
475 jmc 1.13 character*(MAX_LEN_FNAM) dataFName,metaFName
476 heimbach 1.7 integer ip,jp,iG,jG,irec,bi,bj,i,j,k,dUnit,IL
477 adcroft 1.1 Real*4 r4seg(sNx)
478     Real*8 r8seg(sNx)
479     _RL arr(1-oLx:sNx+oLx,1-oLy:sNy+oLy,Nr,nSx,nSy)
480     integer dimList(3,3),ndims
481     integer length_of_rec
482     logical fileIsOpen
483     character*(max_len_mbuf) msgbuf
484 heimbach 1.7 cph-usesingle(
485 jmc 1.13 #ifdef ALLOW_USE_MPI
486 heimbach 1.7 integer ii,jj
487 jmc 1.14 c integer iG_IO,jG_IO,npe
488     integer x_size,y_size
489 heimbach 1.7 PARAMETER ( x_size = Nx )
490     PARAMETER ( y_size = Ny )
491     Real*4 xy_buffer_r4(x_size,y_size)
492     Real*8 xy_buffer_r8(x_size,y_size)
493     Real*8 global(Nx,Ny)
494 jmc 1.13 #endif
495 heimbach 1.7 cph-usesingle)
496    
497 adcroft 1.1 C ------------------------------------------------------------------
498    
499     C Only do I/O if I am the master thread
500     _BEGIN_MASTER( myThid )
501    
502     C Record number must be >= 1
503     if (irecord .LT. 1) then
504     write(msgbuf,'(a,i9.8)')
505     & ' MDSWRITEFIELD_GL: argument irecord = ',irecord
506     call print_message( msgbuf, standardmessageunit,
507     & SQUEEZE_RIGHT , mythid)
508     write(msgbuf,'(a)')
509     & ' MDSWRITEFIELD_GL: invalid value for irecord'
510     call print_error( msgbuf, mythid )
511     stop 'ABNORMAL END: S/R MDSWRITEFIELD_GL'
512     endif
513    
514     C Assume nothing
515     fileIsOpen=.FALSE.
516     IL=ILNBLNK( fName )
517    
518     C Assign a free unit number as the I/O channel for this routine
519     call MDSFINDUNIT( dUnit, mythid )
520    
521 heimbach 1.7 cph-usesingle(
522     #ifdef ALLOW_USE_MPI
523     _END_MASTER( myThid )
524     C If option globalFile is desired but does not work or if
525     C globalFile is too slow, then try using single-CPU I/O.
526     if (useSingleCpuIO) then
527    
528     C Master thread of process 0, only, opens a global file
529     _BEGIN_MASTER( myThid )
530     IF( mpiMyId .EQ. 0 ) THEN
531 jmc 1.13 write(dataFname,'(2a)') fName(1:IL),'.data'
532 heimbach 1.7 length_of_rec=MDS_RECLEN(filePrec,x_size*y_size,mythid)
533     if (irecord .EQ. 1) then
534     open( dUnit, file=dataFName, status=_NEW_STATUS,
535     & access='direct', recl=length_of_rec )
536     else
537     open( dUnit, file=dataFName, status=_OLD_STATUS,
538     & access='direct', recl=length_of_rec )
539     endif
540     ENDIF
541     _END_MASTER( myThid )
542    
543     C Gather array and write it to file, one vertical level at a time
544     DO k=1,nNz
545     C Loop over all processors
546     do jp=1,nPy
547     do ip=1,nPx
548     DO bj = myByLo(myThid), myByHi(myThid)
549     DO bi = myBxLo(myThid), myBxHi(myThid)
550     DO J=1,sNy
551     JJ=((jp-1)*nSy+(bj-1))*sNy+J
552     DO I=1,sNx
553     II=((ip-1)*nSx+(bi-1))*sNx+I
554     global(II,JJ) = arr_gl(i,bi,ip,j,bj,jp,k)
555     ENDDO
556     ENDDO
557     ENDDO
558     ENDDO
559     enddo
560     enddo
561     _BEGIN_MASTER( myThid )
562     IF( mpiMyId .EQ. 0 ) THEN
563     irec=k+nNz*(irecord-1)
564     if (filePrec .eq. precFloat32) then
565     DO J=1,Ny
566     DO I=1,Nx
567     xy_buffer_r4(I,J) = global(I,J)
568     ENDDO
569     ENDDO
570     #ifdef _BYTESWAPIO
571     call MDS_BYTESWAPR4( x_size*y_size, xy_buffer_r4 )
572     #endif
573     write(dUnit,rec=irec) xy_buffer_r4
574     elseif (filePrec .eq. precFloat64) then
575     DO J=1,Ny
576     DO I=1,Nx
577     xy_buffer_r8(I,J) = global(I,J)
578     ENDDO
579     ENDDO
580     #ifdef _BYTESWAPIO
581     call MDS_BYTESWAPR8( x_size*y_size, xy_buffer_r8 )
582     #endif
583     write(dUnit,rec=irec) xy_buffer_r8
584     else
585     write(msgbuf,'(a)')
586     & ' MDSWRITEFIELD: illegal value for filePrec'
587     call print_error( msgbuf, mythid )
588     stop 'ABNORMAL END: S/R MDSWRITEFIELD'
589     endif
590     ENDIF
591     _END_MASTER( myThid )
592     ENDDO
593    
594     C Close data-file and create meta-file
595     _BEGIN_MASTER( myThid )
596     IF( mpiMyId .EQ. 0 ) THEN
597     close( dUnit )
598 jmc 1.13 write(metaFName,'(2a)') fName(1:IL),'.meta'
599 heimbach 1.7 dimList(1,1)=Nx
600     dimList(2,1)=1
601     dimList(3,1)=Nx
602     dimList(1,2)=Ny
603     dimList(2,2)=1
604     dimList(3,2)=Ny
605     dimList(1,3)=nNz
606     dimList(2,3)=1
607     dimList(3,3)=nNz
608     ndims=3
609     if (nNz .EQ. 1) ndims=2
610     call MDSWRITEMETA( metaFName, dataFName,
611     & filePrec, ndims, dimList, irecord, myIter, mythid )
612     ENDIF
613     _END_MASTER( myThid )
614     C To be safe, make other processes wait for I/O completion
615     _BARRIER
616    
617     elseif ( .NOT. useSingleCpuIO ) then
618     _BEGIN_MASTER( myThid )
619     #endif /* ALLOW_USE_MPI */
620     cph-usesingle)
621 adcroft 1.1
622     C Loop over all processors
623     do jp=1,nPy
624     do ip=1,nPx
625     C Loop over all tiles
626     do bj=1,nSy
627     do bi=1,nSx
628     C If we are writing to a tiled MDS file then we open each one here
629     iG=bi+(ip-1)*nsx ! Kludge until unstructered tiles
630     jG=bj+(jp-1)*nsy ! Kludge until unstructered tiles
631 jmc 1.13 write(dataFname,'(2a,i3.3,a,i3.3,a)')
632 adcroft 1.1 & fName(1:IL),'.',iG,'.',jG,'.data'
633     if (irecord .EQ. 1) then
634     length_of_rec=MDS_RECLEN( filePrec, sNx, mythid )
635     open( dUnit, file=dataFName, status=_NEW_STATUS,
636     & access='direct', recl=length_of_rec )
637     fileIsOpen=.TRUE.
638     else
639     length_of_rec=MDS_RECLEN( filePrec, sNx, mythid )
640     open( dUnit, file=dataFName, status=_OLD_STATUS,
641     & access='direct', recl=length_of_rec )
642     fileIsOpen=.TRUE.
643     endif
644     if (fileIsOpen) then
645 heimbach 1.2 do k=1,Nr
646 adcroft 1.1 do j=1,sNy
647 jmc 1.13 do i=1,sNx
648     arr(i,j,k,bi,bj)=arr_gl(i,bi,ip,j,bj,jp,k)
649 adcroft 1.1 enddo
650     iG = 0
651     jG = 0
652 heimbach 1.2 irec=j + sNy*(k-1) + sNy*Nr*(irecord-1)
653 adcroft 1.1 if (filePrec .eq. precFloat32) then
654     if (arrType .eq. 'RS') then
655 heimbach 1.2 call MDS_SEG4toRS( j,bi,bj,k,Nr, r4seg, .FALSE., arr )
656 adcroft 1.1 elseif (arrType .eq. 'RL') then
657 heimbach 1.2 call MDS_SEG4toRL( j,bi,bj,k,Nr, r4seg, .FALSE., arr )
658 adcroft 1.1 else
659     write(msgbuf,'(a)')
660     & ' MDSWRITEFIELD_GL: illegal value for arrType'
661     call print_error( msgbuf, mythid )
662     stop 'ABNORMAL END: S/R MDSWRITEFIELD_GL'
663     endif
664     #ifdef _BYTESWAPIO
665     call MDS_BYTESWAPR4( sNx, r4seg )
666     #endif
667     write(dUnit,rec=irec) r4seg
668     elseif (filePrec .eq. precFloat64) then
669     if (arrType .eq. 'RS') then
670 heimbach 1.2 call MDS_SEG8toRS( j,bi,bj,k,Nr, r8seg, .FALSE., arr )
671 adcroft 1.1 elseif (arrType .eq. 'RL') then
672 heimbach 1.2 call MDS_SEG8toRL( j,bi,bj,k,Nr, r8seg, .FALSE., arr )
673 adcroft 1.1 else
674     write(msgbuf,'(a)')
675     & ' MDSWRITEFIELD_GL: illegal value for arrType'
676     call print_error( msgbuf, mythid )
677     stop 'ABNORMAL END: S/R MDSWRITEFIELD_GL'
678     endif
679     #ifdef _BYTESWAPIO
680     call MDS_BYTESWAPR8( sNx, r8seg )
681     #endif
682     write(dUnit,rec=irec) r8seg
683     else
684     write(msgbuf,'(a)')
685     & ' MDSWRITEFIELD_GL: illegal value for filePrec'
686     call print_error( msgbuf, mythid )
687     stop 'ABNORMAL END: S/R MDSWRITEFIELD_GL'
688     endif
689     C End of j loop
690     enddo
691     C End of k loop
692     enddo
693     else
694     write(msgbuf,'(a)')
695     & ' MDSWRITEFIELD_GL: I should never get to this point'
696     call print_error( msgbuf, mythid )
697     stop 'ABNORMAL END: S/R MDSWRITEFIELD_GL'
698     endif
699     C If we were writing to a tiled MDS file then we close it here
700     if (fileIsOpen) then
701     close( dUnit )
702     fileIsOpen = .FALSE.
703     endif
704     C Create meta-file for each tile if we are tiling
705     iG=bi+(ip-1)*nsx ! Kludge until unstructered tiles
706     jG=bj+(jp-1)*nsy ! Kludge until unstructered tiles
707 jmc 1.13 write(metaFname,'(2a,i3.3,a,i3.3,a)')
708 adcroft 1.1 & fName(1:IL),'.',iG,'.',jG,'.meta'
709     dimList(1,1)=Nx
710     dimList(2,1)=((ip-1)*nSx+(bi-1))*sNx+1
711     dimList(3,1)=((ip-1)*nSx+bi)*sNx
712     dimList(1,2)=Ny
713     dimList(2,2)=((jp-1)*nSy+(bj-1))*sNy+1
714     dimList(3,2)=((jp-1)*nSy+bj)*sNy
715     dimList(1,3)=Nr
716     dimList(2,3)=1
717     dimList(3,3)=Nr
718     ndims=3
719 heimbach 1.2 if (Nr .EQ. 1) ndims=2
720 adcroft 1.1 call MDSWRITEMETA( metaFName, dataFName,
721     & filePrec, ndims, dimList, irecord, myIter, mythid )
722     C End of bi,bj loops
723     enddo
724     enddo
725     C End of ip,jp loops
726     enddo
727     enddo
728    
729 heimbach 1.7 _END_MASTER( myThid )
730 adcroft 1.1
731 heimbach 1.7 cph-usesingle(
732     #ifdef ALLOW_USE_MPI
733     C endif useSingleCpuIO
734     endif
735     #endif /* ALLOW_USE_MPI */
736     cph-usesingle)
737 adcroft 1.1
738 heimbach 1.2 C ------------------------------------------------------------------
739     return
740     end
741     C=======================================================================
742    
743     C=======================================================================
744     SUBROUTINE MDSREADFIELD_2D_GL(
745     I fName,
746     I filePrec,
747     I arrType,
748     I nNz,
749     O arr_gl,
750     I irecord,
751     I myThid )
752     C
753     C Arguments:
754     C
755     C fName string base name for file to read
756     C filePrec integer number of bits per word in file (32 or 64)
757     C arrType char(2) declaration of "arr": either "RS" or "RL"
758     C nNz integer size of third dimension: normally either 1 or Nr
759     C arr RS/RL array to read into, arr(:,:,nNz,:,:)
760     C irecord integer record number to read
761     C myThid integer thread identifier
762     C
763     C MDSREADFIELD first checks to see if the file "fName" exists, then
764     C if the file "fName.data" exists and finally the tiled files of the
765     C form "fName.xxx.yyy.data" exist. Currently, the meta-files are not
766     C read because it is difficult to parse files in fortran.
767     C The precision of the file is decsribed by filePrec, set either
768     C to floatPrec32 or floatPrec64. The precision or declaration of
769     C the array argument must be consistently described by the char*(2)
770     C string arrType, either "RS" or "RL". nNz allows for both 2-D and
771     C 3-D arrays to be handled. nNz=1 implies a 2-D model field and
772     C nNz=Nr implies a 3-D model field. irecord is the record number
773     C to be read and must be >= 1. The file data is stored in
774     C arr *but* the overlaps are *not* updated. ie. An exchange must
775     C be called. This is because the routine is sometimes called from
776     C within a MASTER_THID region.
777     C
778     C Created: 03/16/99 adcroft@mit.edu
779    
780     implicit none
781     C Global variables / common blocks
782     #include "SIZE.h"
783     #include "EEPARAMS.h"
784 heimbach 1.7 #include "EESUPPORT.h"
785 heimbach 1.2 #include "PARAMS.h"
786    
787     C Routine arguments
788     character*(*) fName
789     integer filePrec
790     character*(2) arrType
791     integer nNz, nLocz
792     parameter (nLocz = 1)
793     _RL arr_gl(sNx,nSx,nPx,sNy,nSy,nPy,nLocz)
794     integer irecord
795     integer myThid
796     C Functions
797     integer ILNBLNK
798     integer MDS_RECLEN
799     C Local variables
800 jmc 1.13 character*(MAX_LEN_FNAM) dataFName
801 heimbach 1.10 integer ip,jp,iG,jG,irec,bi,bj,i,j,k,dUnit,IL
802 heimbach 1.2 logical exst
803     _RL arr(1-oLx:sNx+oLx,1-oLy:sNy+oLy,nLocz,nSx,nSy)
804     Real*4 r4seg(sNx)
805     Real*8 r8seg(sNx)
806     logical globalFile,fileIsOpen
807     integer length_of_rec
808     character*(max_len_mbuf) msgbuf
809 heimbach 1.9 cph-usesingle(
810     integer ii,jj
811 jmc 1.13 c integer iG_IO,jG_IO,npe
812     integer x_size,y_size
813 heimbach 1.9 PARAMETER ( x_size = Nx )
814     PARAMETER ( y_size = Ny )
815     Real*4 xy_buffer_r4(x_size,y_size)
816     Real*8 xy_buffer_r8(x_size,y_size)
817     Real*8 global(Nx,Ny)
818 jmc 1.13 c _RL local(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
819 heimbach 1.9 cph-usesingle)
820    
821 heimbach 1.2 C ------------------------------------------------------------------
822    
823     C Only do I/O if I am the master thread
824     _BEGIN_MASTER( myThid )
825    
826     C Record number must be >= 1
827     if (irecord .LT. 1) then
828     write(msgbuf,'(a,i9.8)')
829     & ' MDSREADFIELD_GL: argument irecord = ',irecord
830     call print_message( msgbuf, standardmessageunit,
831     & SQUEEZE_RIGHT , mythid)
832     write(msgbuf,'(a)')
833     & ' MDSREADFIELD_GL: Invalid value for irecord'
834     call print_error( msgbuf, mythid )
835     stop 'ABNORMAL END: S/R MDSREADFIELD_GL'
836     endif
837    
838     C Assume nothing
839     globalFile = .FALSE.
840     fileIsOpen = .FALSE.
841     IL=ILNBLNK( fName )
842    
843     C Assign a free unit number as the I/O channel for this routine
844     call MDSFINDUNIT( dUnit, mythid )
845    
846 heimbach 1.9 if ( useSingleCPUIO ) then
847    
848     C master thread of process 0, only, opens a global file
849     #ifdef ALLOW_USE_MPI
850     IF( mpiMyId .EQ. 0 ) THEN
851     #else
852     IF ( .TRUE. ) THEN
853     #endif /* ALLOW_USE_MPI */
854    
855 heimbach 1.2 C Check first for global file with simple name (ie. fName)
856 heimbach 1.9 dataFName = fName
857     inquire( file=dataFname, exist=exst )
858     if (exst) globalFile = .TRUE.
859 heimbach 1.2
860     C If negative check for global file with MDS name (ie. fName.data)
861 heimbach 1.9 if (.NOT. globalFile) then
862 jmc 1.13 write(dataFname,'(2a)') fName(1:IL),'.data'
863 heimbach 1.9 inquire( file=dataFname, exist=exst )
864     if (exst) globalFile = .TRUE.
865     endif
866    
867     C If global file is visible to process 0, then open it here.
868     C Otherwise stop program.
869     if ( globalFile) then
870     length_of_rec=MDS_RECLEN( filePrec, x_size*y_size, mythid )
871     open( dUnit, file=dataFName, status='old',
872     & access='direct', recl=length_of_rec )
873     else
874 jmc 1.13 write(msgbuf,'(2a)')
875     & ' MDSREADFIELD: filename: ',dataFName(1:IL)
876 heimbach 1.9 call print_message( msgbuf, standardmessageunit,
877     & SQUEEZE_RIGHT , mythid)
878     call print_error( msgbuf, mythid )
879     write(msgbuf,'(a)')
880     & ' MDSREADFIELD: File does not exist'
881     call print_message( msgbuf, standardmessageunit,
882     & SQUEEZE_RIGHT , mythid)
883     call print_error( msgbuf, mythid )
884     stop 'ABNORMAL END: S/R MDSREADFIELD'
885     endif
886    
887     ENDIF
888    
889     c-- useSingleCpuIO
890     else
891    
892     C Check first for global file with simple name (ie. fName)
893     dataFName = fName
894 heimbach 1.2 inquire( file=dataFname, exist=exst )
895     if (exst) then
896     write(msgbuf,'(a,a)')
897 jmc 1.13 & ' MDSREADFIELD: opening global file: ',dataFName(1:IL)
898 heimbach 1.2 call print_message( msgbuf, standardmessageunit,
899     & SQUEEZE_RIGHT , mythid)
900     endif
901 heimbach 1.9
902     C If negative check for global file with MDS name (ie. fName.data)
903     if (.NOT. globalFile) then
904 jmc 1.13 write(dataFname,'(2a)') fName(1:IL),'.data'
905 heimbach 1.9 inquire( file=dataFname, exist=exst )
906     if (exst) then
907     write(msgbuf,'(a,a)')
908 jmc 1.13 & ' MDSREADFIELD_GL: opening global file: ',dataFName(1:IL+5)
909 heimbach 1.9 call print_message( msgbuf, standardmessageunit,
910     & SQUEEZE_RIGHT , mythid)
911     globalFile = .TRUE.
912     endif
913     endif
914    
915     c-- useSingleCpuIO
916 heimbach 1.2 endif
917 heimbach 1.7
918 heimbach 1.9 if ( .not. useSingleCpuIO ) then
919     cph if ( .not. ( globalFile .and. useSingleCPUIO ) ) then
920     if ( .not. ( globalFile ) ) then
921 heimbach 1.7
922     C If we are reading from a global file then we open it here
923     if (globalFile) then
924     length_of_rec=MDS_RECLEN( filePrec, sNx, mythid )
925     open( dUnit, file=dataFName, status='old',
926     & access='direct', recl=length_of_rec )
927     fileIsOpen=.TRUE.
928     endif
929    
930 heimbach 1.2 C Loop over all processors
931     do jp=1,nPy
932     do ip=1,nPx
933     C Loop over all tiles
934     do bj=1,nSy
935     do bi=1,nSx
936     C If we are reading from a tiled MDS file then we open each one here
937     if (.NOT. globalFile) then
938     iG=bi+(ip-1)*nsx ! Kludge until unstructered tiles
939     jG=bj+(jp-1)*nsy ! Kludge until unstructered tiles
940 jmc 1.13 write(dataFname,'(2a,i3.3,a,i3.3,a)')
941 heimbach 1.2 & fName(1:IL),'.',iG,'.',jG,'.data'
942     inquire( file=dataFname, exist=exst )
943     C Of course, we only open the file if the tile is "active"
944     C (This is a place-holder for the active/passive mechanism
945     if (exst) then
946 heimbach 1.3 if ( debugLevel .GE. debLevA ) then
947     write(msgbuf,'(a,a)')
948 jmc 1.13 & ' MDSREADFIELD_GL: opening file: ',dataFName(1:IL+13)
949 heimbach 1.3 call print_message( msgbuf, standardmessageunit,
950 heimbach 1.2 & SQUEEZE_RIGHT , mythid)
951 heimbach 1.3 endif
952 heimbach 1.2 length_of_rec=MDS_RECLEN( filePrec, sNx, mythid )
953     open( dUnit, file=dataFName, status='old',
954     & access='direct', recl=length_of_rec )
955     fileIsOpen=.TRUE.
956     else
957     fileIsOpen=.FALSE.
958     write(msgbuf,'(a,a)')
959 jmc 1.13 & ' MDSREADFIELD_GL: filename: ',dataFName(1:IL+13)
960 heimbach 1.2 call print_message( msgbuf, standardmessageunit,
961     & SQUEEZE_RIGHT , mythid)
962 heimbach 1.6 call print_error( msgbuf, mythid )
963 heimbach 1.2 write(msgbuf,'(a)')
964     & ' MDSREADFIELD_GL: File does not exist'
965 heimbach 1.6 call print_message( msgbuf, standardmessageunit,
966     & SQUEEZE_RIGHT , mythid)
967 heimbach 1.2 call print_error( msgbuf, mythid )
968     stop 'ABNORMAL END: S/R MDSREADFIELD_GL'
969     endif
970     endif
971    
972     if (fileIsOpen) then
973     do k=1,nLocz
974     do j=1,sNy
975 heimbach 1.7 if (globalFile) then
976     iG=bi+(ip-1)*nsx
977     jG=bj+(jp-1)*nsy
978     irec=1 + INT(iG/sNx) + nSx*nPx*(jG+j-1) + nSx*nPx*Ny*(k-1)
979     & + nSx*nPx*Ny*nLocz*(irecord-1)
980     else
981 heimbach 1.2 iG = 0
982     jG = 0
983     irec=j + sNy*(k-1) + sNy*nLocz*(irecord-1)
984 heimbach 1.7 endif
985 heimbach 1.2 if (filePrec .eq. precFloat32) then
986     read(dUnit,rec=irec) r4seg
987     #ifdef _BYTESWAPIO
988     call MDS_BYTESWAPR4( sNx, r4seg )
989 adcroft 1.1 #endif
990 heimbach 1.2 if (arrType .eq. 'RS') then
991     call MDS_SEG4toRS( j,bi,bj,k,nLocz, r4seg, .TRUE., arr )
992     elseif (arrType .eq. 'RL') then
993     call MDS_SEG4toRL( j,bi,bj,k,nLocz, r4seg, .TRUE., arr )
994     else
995     write(msgbuf,'(a)')
996     & ' MDSREADFIELD_GL: illegal value for arrType'
997     call print_error( msgbuf, mythid )
998     stop 'ABNORMAL END: S/R MDSREADFIELD_GL'
999     endif
1000     elseif (filePrec .eq. precFloat64) then
1001     read(dUnit,rec=irec) r8seg
1002     #ifdef _BYTESWAPIO
1003     call MDS_BYTESWAPR8( sNx, r8seg )
1004     #endif
1005     if (arrType .eq. 'RS') then
1006     call MDS_SEG8toRS( j,bi,bj,k,nLocz, r8seg, .TRUE., arr )
1007     elseif (arrType .eq. 'RL') then
1008     call MDS_SEG8toRL( j,bi,bj,k,nLocz, r8seg, .TRUE., arr )
1009     else
1010     write(msgbuf,'(a)')
1011     & ' MDSREADFIELD_GL: illegal value for arrType'
1012     call print_error( msgbuf, mythid )
1013     stop 'ABNORMAL END: S/R MDSREADFIELD_GL'
1014     endif
1015     else
1016     write(msgbuf,'(a)')
1017     & ' MDSREADFIELD_GL: illegal value for filePrec'
1018     call print_error( msgbuf, mythid )
1019     stop 'ABNORMAL END: S/R MDSREADFIELD_GL'
1020     endif
1021     do ii=1,sNx
1022     arr_gl(ii,bi,ip,j,bj,jp,k)=arr(ii,j,k,bi,bj)
1023     enddo
1024    
1025     C End of j loop
1026     enddo
1027     C End of k loop
1028     enddo
1029     if (.NOT. globalFile) then
1030     close( dUnit )
1031     fileIsOpen = .FALSE.
1032     endif
1033     endif
1034     C End of bi,bj loops
1035     enddo
1036     enddo
1037     C End of ip,jp loops
1038     enddo
1039     enddo
1040    
1041     C If global file was opened then close it
1042     if (fileIsOpen .AND. globalFile) then
1043     close( dUnit )
1044     fileIsOpen = .FALSE.
1045     endif
1046    
1047 heimbach 1.9 c end of if ( .not. ( globalFile ) ) then
1048     endif
1049    
1050     c else of if ( .not. ( globalFile .and. useSingleCPUIO ) ) then
1051     else
1052    
1053     DO k=1,nLocz
1054    
1055     #ifdef ALLOW_USE_MPI
1056     IF( mpiMyId .EQ. 0 ) THEN
1057     #else
1058     IF ( .TRUE. ) THEN
1059     #endif /* ALLOW_USE_MPI */
1060     irec = k+nNz*(irecord-1)
1061     if (filePrec .eq. precFloat32) then
1062     read(dUnit,rec=irec) xy_buffer_r4
1063     #ifdef _BYTESWAPIO
1064     call MDS_BYTESWAPR4( x_size*y_size, xy_buffer_r4 )
1065     #endif
1066     DO J=1,Ny
1067     DO I=1,Nx
1068     global(I,J) = xy_buffer_r4(I,J)
1069     ENDDO
1070     ENDDO
1071     elseif (filePrec .eq. precFloat64) then
1072     read(dUnit,rec=irec) xy_buffer_r8
1073     #ifdef _BYTESWAPIO
1074     call MDS_BYTESWAPR8( x_size*y_size, xy_buffer_r8 )
1075     #endif
1076     DO J=1,Ny
1077     DO I=1,Nx
1078     global(I,J) = xy_buffer_r8(I,J)
1079     ENDDO
1080     ENDDO
1081     else
1082     write(msgbuf,'(a)')
1083     & ' MDSREADFIELD: illegal value for filePrec'
1084     call print_error( msgbuf, mythid )
1085     stop 'ABNORMAL END: S/R MDSREADFIELD'
1086     endif
1087     ENDIF
1088     DO jp=1,nPy
1089     DO ip=1,nPx
1090     DO bj = myByLo(myThid), myByHi(myThid)
1091     DO bi = myBxLo(myThid), myBxHi(myThid)
1092     DO J=1,sNy
1093     JJ=((jp-1)*nSy+(bj-1))*sNy+J
1094     DO I=1,sNx
1095     II=((ip-1)*nSx+(bi-1))*sNx+I
1096     arr_gl(i,bi,ip,j,bj,jp,k) = global(II,JJ)
1097     ENDDO
1098     ENDDO
1099     ENDDO
1100     ENDDO
1101     ENDDO
1102     ENDDO
1103    
1104     ENDDO
1105     c ENDDO k=1,nNz
1106    
1107     close( dUnit )
1108    
1109 heimbach 1.7 endif
1110     c end of if ( .not. ( globalFile .and. useSingleCPUIO ) ) then
1111    
1112 heimbach 1.2 _END_MASTER( myThid )
1113    
1114     C ------------------------------------------------------------------
1115     return
1116     end
1117     C=======================================================================
1118    
1119     C=======================================================================
1120     SUBROUTINE MDSWRITEFIELD_2D_GL(
1121     I fName,
1122     I filePrec,
1123     I arrType,
1124     I nNz,
1125     I arr_gl,
1126     I irecord,
1127     I myIter,
1128     I myThid )
1129     C
1130     C Arguments:
1131     C
1132     C fName string base name for file to written
1133     C filePrec integer number of bits per word in file (32 or 64)
1134     C arrType char(2) declaration of "arr": either "RS" or "RL"
1135     C nNz integer size of third dimension: normally either 1 or Nr
1136     C arr RS/RL array to write, arr(:,:,nNz,:,:)
1137     C irecord integer record number to read
1138     C myIter integer time step number
1139     C myThid integer thread identifier
1140     C
1141     C MDSWRITEFIELD creates either a file of the form "fName.data" and
1142     C "fName.meta" if the logical flag "globalFile" is set true. Otherwise
1143     C it creates MDS tiled files of the form "fName.xxx.yyy.data" and
1144     C "fName.xxx.yyy.meta". A meta-file is always created.
1145     C Currently, the meta-files are not read because it is difficult
1146     C to parse files in fortran. We should read meta information before
1147     C adding records to an existing multi-record file.
1148     C The precision of the file is decsribed by filePrec, set either
1149     C to floatPrec32 or floatPrec64. The precision or declaration of
1150     C the array argument must be consistently described by the char*(2)
1151     C string arrType, either "RS" or "RL". nNz allows for both 2-D and
1152     C 3-D arrays to be handled. nNz=1 implies a 2-D model field and
1153     C nNz=Nr implies a 3-D model field. irecord is the record number
1154     C to be read and must be >= 1. NOTE: It is currently assumed that
1155     C the highest record number in the file was the last record written.
1156     C Nor is there a consistency check between the routine arguments and file.
1157     C ie. if your write record 2 after record 4 the meta information
1158     C will record the number of records to be 2. This, again, is because
1159     C we have read the meta information. To be fixed.
1160     C
1161     C Created: 03/16/99 adcroft@mit.edu
1162     C
1163     C Changed: 05/31/00 heimbach@mit.edu
1164     C open(dUnit, ..., status='old', ... -> status='unknown'
1165    
1166     implicit none
1167     C Global variables / common blocks
1168     #include "SIZE.h"
1169     #include "EEPARAMS.h"
1170 heimbach 1.7 #include "EESUPPORT.h"
1171 heimbach 1.2 #include "PARAMS.h"
1172    
1173     C Routine arguments
1174     character*(*) fName
1175     integer filePrec
1176     character*(2) arrType
1177     integer nNz, nLocz
1178     parameter (nLocz = 1)
1179     cph(
1180     cph Real arr(*)
1181     _RL arr_gl(sNx,nSx,nPx,sNy,nSy,nPy,nLocz)
1182     cph)
1183     integer irecord
1184     integer myIter
1185     integer myThid
1186     C Functions
1187     integer ILNBLNK
1188     integer MDS_RECLEN
1189     C Local variables
1190 jmc 1.13 character*(MAX_LEN_FNAM) dataFName,metaFName
1191 heimbach 1.7 integer ip,jp,iG,jG,irec,bi,bj,i,j,k,dUnit,IL
1192 heimbach 1.2 Real*4 r4seg(sNx)
1193     Real*8 r8seg(sNx)
1194     _RL arr(1-oLx:sNx+oLx,1-oLy:sNy+oLy,nLocz,nSx,nSy)
1195     integer dimList(3,3),ndims
1196     integer length_of_rec
1197     logical fileIsOpen
1198     character*(max_len_mbuf) msgbuf
1199 heimbach 1.7 cph-usesingle(
1200 jmc 1.13 #ifdef ALLOW_USE_MPI
1201 heimbach 1.7 integer ii,jj
1202 jmc 1.14 c integer iG_IO,jG_IO,npe
1203     integer x_size,y_size
1204 heimbach 1.7 PARAMETER ( x_size = Nx )
1205     PARAMETER ( y_size = Ny )
1206     Real*4 xy_buffer_r4(x_size,y_size)
1207     Real*8 xy_buffer_r8(x_size,y_size)
1208     Real*8 global(Nx,Ny)
1209 jmc 1.13 #endif
1210 heimbach 1.7 cph-usesingle)
1211    
1212 heimbach 1.2 C ------------------------------------------------------------------
1213    
1214     C Only do I/O if I am the master thread
1215     _BEGIN_MASTER( myThid )
1216    
1217     C Record number must be >= 1
1218     if (irecord .LT. 1) then
1219     write(msgbuf,'(a,i9.8)')
1220     & ' MDSWRITEFIELD_GL: argument irecord = ',irecord
1221     call print_message( msgbuf, standardmessageunit,
1222     & SQUEEZE_RIGHT , mythid)
1223     write(msgbuf,'(a)')
1224     & ' MDSWRITEFIELD_GL: invalid value for irecord'
1225     call print_error( msgbuf, mythid )
1226     stop 'ABNORMAL END: S/R MDSWRITEFIELD_GL'
1227     endif
1228    
1229     C Assume nothing
1230     fileIsOpen=.FALSE.
1231     IL=ILNBLNK( fName )
1232    
1233     C Assign a free unit number as the I/O channel for this routine
1234     call MDSFINDUNIT( dUnit, mythid )
1235    
1236    
1237 heimbach 1.7 cph-usesingle(
1238     #ifdef ALLOW_USE_MPI
1239     _END_MASTER( myThid )
1240     C If option globalFile is desired but does not work or if
1241     C globalFile is too slow, then try using single-CPU I/O.
1242     if (useSingleCpuIO) then
1243    
1244     C Master thread of process 0, only, opens a global file
1245     _BEGIN_MASTER( myThid )
1246     IF( mpiMyId .EQ. 0 ) THEN
1247 jmc 1.13 write(dataFname,'(2a)') fName(1:IL),'.data'
1248 heimbach 1.7 length_of_rec=MDS_RECLEN(filePrec,x_size*y_size,mythid)
1249     if (irecord .EQ. 1) then
1250     open( dUnit, file=dataFName, status=_NEW_STATUS,
1251     & access='direct', recl=length_of_rec )
1252     else
1253     open( dUnit, file=dataFName, status=_OLD_STATUS,
1254     & access='direct', recl=length_of_rec )
1255     endif
1256     ENDIF
1257     _END_MASTER( myThid )
1258    
1259     C Gather array and write it to file, one vertical level at a time
1260     DO k=1,nLocz
1261     C Loop over all processors
1262     do jp=1,nPy
1263     do ip=1,nPx
1264     DO bj = myByLo(myThid), myByHi(myThid)
1265     DO bi = myBxLo(myThid), myBxHi(myThid)
1266     DO J=1,sNy
1267     JJ=((jp-1)*nSy+(bj-1))*sNy+J
1268     DO I=1,sNx
1269     II=((ip-1)*nSx+(bi-1))*sNx+I
1270     global(II,JJ) = arr_gl(i,bi,ip,j,bj,jp,k)
1271     ENDDO
1272     ENDDO
1273     ENDDO
1274     ENDDO
1275     enddo
1276     enddo
1277     _BEGIN_MASTER( myThid )
1278     IF( mpiMyId .EQ. 0 ) THEN
1279     irec=k+nLocz*(irecord-1)
1280     if (filePrec .eq. precFloat32) then
1281     DO J=1,Ny
1282     DO I=1,Nx
1283     xy_buffer_r4(I,J) = global(I,J)
1284     ENDDO
1285     ENDDO
1286     #ifdef _BYTESWAPIO
1287     call MDS_BYTESWAPR4( x_size*y_size, xy_buffer_r4 )
1288     #endif
1289     write(dUnit,rec=irec) xy_buffer_r4
1290     elseif (filePrec .eq. precFloat64) then
1291     DO J=1,Ny
1292     DO I=1,Nx
1293     xy_buffer_r8(I,J) = global(I,J)
1294     ENDDO
1295     ENDDO
1296     #ifdef _BYTESWAPIO
1297     call MDS_BYTESWAPR8( x_size*y_size, xy_buffer_r8 )
1298     #endif
1299     write(dUnit,rec=irec) xy_buffer_r8
1300     else
1301     write(msgbuf,'(a)')
1302     & ' MDSWRITEFIELD: illegal value for filePrec'
1303     call print_error( msgbuf, mythid )
1304     stop 'ABNORMAL END: S/R MDSWRITEFIELD'
1305     endif
1306     ENDIF
1307     _END_MASTER( myThid )
1308     ENDDO
1309    
1310     C Close data-file and create meta-file
1311     _BEGIN_MASTER( myThid )
1312     IF( mpiMyId .EQ. 0 ) THEN
1313     close( dUnit )
1314 jmc 1.13 write(metaFName,'(2a)') fName(1:IL),'.meta'
1315 heimbach 1.7 dimList(1,1)=Nx
1316     dimList(2,1)=1
1317     dimList(3,1)=Nx
1318     dimList(1,2)=Ny
1319     dimList(2,2)=1
1320     dimList(3,2)=Ny
1321     dimList(1,3)=nLocz
1322     dimList(2,3)=1
1323     dimList(3,3)=nLocz
1324     ndims=3
1325     if (nLocz .EQ. 1) ndims=2
1326     call MDSWRITEMETA( metaFName, dataFName,
1327     & filePrec, ndims, dimList, irecord, myIter, mythid )
1328     ENDIF
1329     _END_MASTER( myThid )
1330     C To be safe, make other processes wait for I/O completion
1331     _BARRIER
1332    
1333     elseif ( .NOT. useSingleCpuIO ) then
1334     _BEGIN_MASTER( myThid )
1335     #endif /* ALLOW_USE_MPI */
1336     cph-usesingle)
1337    
1338 heimbach 1.2 C Loop over all processors
1339     do jp=1,nPy
1340     do ip=1,nPx
1341     C Loop over all tiles
1342     do bj=1,nSy
1343     do bi=1,nSx
1344     C If we are writing to a tiled MDS file then we open each one here
1345     iG=bi+(ip-1)*nsx ! Kludge until unstructered tiles
1346     jG=bj+(jp-1)*nsy ! Kludge until unstructered tiles
1347 jmc 1.13 write(dataFname,'(2a,i3.3,a,i3.3,a)')
1348 heimbach 1.2 & fName(1:IL),'.',iG,'.',jG,'.data'
1349     if (irecord .EQ. 1) then
1350     length_of_rec=MDS_RECLEN( filePrec, sNx, mythid )
1351     open( dUnit, file=dataFName, status=_NEW_STATUS,
1352     & access='direct', recl=length_of_rec )
1353     fileIsOpen=.TRUE.
1354     else
1355     length_of_rec=MDS_RECLEN( filePrec, sNx, mythid )
1356     open( dUnit, file=dataFName, status=_OLD_STATUS,
1357     & access='direct', recl=length_of_rec )
1358     fileIsOpen=.TRUE.
1359     endif
1360     if (fileIsOpen) then
1361     do k=1,nLocz
1362     do j=1,sNy
1363 jmc 1.13 do i=1,sNx
1364     arr(i,j,k,bi,bj)=arr_gl(i,bi,ip,j,bj,jp,k)
1365 heimbach 1.2 enddo
1366     iG = 0
1367     jG = 0
1368     irec=j + sNy*(k-1) + sNy*nLocz*(irecord-1)
1369     if (filePrec .eq. precFloat32) then
1370     if (arrType .eq. 'RS') then
1371     call MDS_SEG4toRS( j,bi,bj,k,nLocz, r4seg, .FALSE., arr )
1372     elseif (arrType .eq. 'RL') then
1373     call MDS_SEG4toRL( j,bi,bj,k,nLocz, r4seg, .FALSE., arr )
1374     else
1375     write(msgbuf,'(a)')
1376     & ' MDSWRITEFIELD_GL: illegal value for arrType'
1377     call print_error( msgbuf, mythid )
1378     stop 'ABNORMAL END: S/R MDSWRITEFIELD_GL'
1379     endif
1380     #ifdef _BYTESWAPIO
1381     call MDS_BYTESWAPR4( sNx, r4seg )
1382     #endif
1383     write(dUnit,rec=irec) r4seg
1384     elseif (filePrec .eq. precFloat64) then
1385     if (arrType .eq. 'RS') then
1386     call MDS_SEG8toRS( j,bi,bj,k,nLocz, r8seg, .FALSE., arr )
1387     elseif (arrType .eq. 'RL') then
1388     call MDS_SEG8toRL( j,bi,bj,k,nLocz, r8seg, .FALSE., arr )
1389     else
1390     write(msgbuf,'(a)')
1391     & ' MDSWRITEFIELD_GL: illegal value for arrType'
1392     call print_error( msgbuf, mythid )
1393     stop 'ABNORMAL END: S/R MDSWRITEFIELD_GL'
1394     endif
1395     #ifdef _BYTESWAPIO
1396     call MDS_BYTESWAPR8( sNx, r8seg )
1397     #endif
1398     write(dUnit,rec=irec) r8seg
1399     else
1400     write(msgbuf,'(a)')
1401     & ' MDSWRITEFIELD_GL: illegal value for filePrec'
1402     call print_error( msgbuf, mythid )
1403     stop 'ABNORMAL END: S/R MDSWRITEFIELD_GL'
1404     endif
1405     C End of j loop
1406     enddo
1407     C End of k loop
1408     enddo
1409     else
1410     write(msgbuf,'(a)')
1411     & ' MDSWRITEFIELD_GL: I should never get to this point'
1412     call print_error( msgbuf, mythid )
1413     stop 'ABNORMAL END: S/R MDSWRITEFIELD_GL'
1414     endif
1415     C If we were writing to a tiled MDS file then we close it here
1416     if (fileIsOpen) then
1417     close( dUnit )
1418     fileIsOpen = .FALSE.
1419     endif
1420     C Create meta-file for each tile if we are tiling
1421     iG=bi+(ip-1)*nsx ! Kludge until unstructered tiles
1422     jG=bj+(jp-1)*nsy ! Kludge until unstructered tiles
1423 jmc 1.13 write(metaFname,'(2a,i3.3,a,i3.3,a)')
1424 heimbach 1.2 & fName(1:IL),'.',iG,'.',jG,'.meta'
1425     dimList(1,1)=Nx
1426     dimList(2,1)=((ip-1)*nSx+(bi-1))*sNx+1
1427     dimList(3,1)=((ip-1)*nSx+bi)*sNx
1428     dimList(1,2)=Ny
1429     dimList(2,2)=((jp-1)*nSy+(bj-1))*sNy+1
1430     dimList(3,2)=((jp-1)*nSy+bj)*sNy
1431     dimList(1,3)=Nr
1432     dimList(2,3)=1
1433     dimList(3,3)=Nr
1434     ndims=3
1435     if (nLocz .EQ. 1) ndims=2
1436     call MDSWRITEMETA( metaFName, dataFName,
1437     & filePrec, ndims, dimList, irecord, myIter, mythid )
1438     C End of bi,bj loops
1439     enddo
1440     enddo
1441     C End of ip,jp loops
1442     enddo
1443     enddo
1444    
1445 heimbach 1.7 _END_MASTER( myThid )
1446 heimbach 1.2
1447 heimbach 1.7 #ifdef ALLOW_USE_MPI
1448     C endif useSingleCpuIO
1449     endif
1450     #endif /* ALLOW_USE_MPI */
1451 adcroft 1.1
1452     C ------------------------------------------------------------------
1453     return
1454     end
1455     C=======================================================================

  ViewVC Help
Powered by ViewVC 1.1.22