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

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

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


Revision 1.15 - (show annotations) (download)
Mon May 14 22:53:26 2007 UTC (18 years, 1 month ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint60, checkpoint61, checkpoint59q, checkpoint59p, checkpoint59r, checkpoint59e, checkpoint59d, checkpoint59g, checkpoint59f, checkpoint59c, checkpoint59b, checkpoint59m, checkpoint59l, checkpoint59o, checkpoint59n, checkpoint59i, checkpoint59h, checkpoint59k, checkpoint61f, checkpoint59j, checkpoint61e, checkpoint61g, checkpoint61d, checkpoint61b, checkpoint61c, checkpoint61a
Changes since 1.14: +49 -1 lines
MOdify usage of mdsioLocalDir (M.Mazloff)

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

  ViewVC Help
Powered by ViewVC 1.1.22