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

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

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


Revision 1.2 - (hide annotations) (download)
Tue Dec 30 02:13:01 2008 UTC (15 years, 5 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint61h
Changes since 1.1: +65 -56 lines
change name of S/R MDSWRITEVEC_LOC_RS to MDS_WRITEVEC_LOC
and add argument "arrType" ; also use new S/R MDS_WR_REC_RL/RS.

1 jmc 1.2 C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_writevec_loc.F,v 1.1 2005/10/30 21:12:20 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "MDSIO_OPTIONS.h"
5    
6 jmc 1.2 SUBROUTINE MDS_WRITEVEC_LOC(
7 jmc 1.1 I fName,
8     I filePrec,
9 jmc 1.2 I arrType,
10 jmc 1.1 I nArr,
11     I arr,
12     I bi, bj,
13     I irecord,
14     I myIter,
15     I myThid )
16 jmc 1.2
17 jmc 1.1 C Arguments:
18     C
19 jmc 1.2 C fName string base name for file to written
20     C filePrec integer :: number of bits per word in file (32 or 64)
21     C nArr integer :: number of elements from input array "arr" to be written
22     C arrType char(2) :: declaration type of "arr": either "RS" or "RL"
23     C arr RS/RL :: array to WRITE, arr(nArr)
24     C bi,bj integer :: tile indices (if tiled array) or 0,0 if not a tiled array
25     C irecord integer :: record number to WRITE
26     C myIter integer :: time step number
27     C myThid integer :: my Thread Id number
28 jmc 1.1 C
29 jmc 1.2 C MDS_WRITEVEC_LOC creates either a file of the form "fName.data" and
30 jmc 1.1 C "fName.meta" IF bi=bj=0. Otherwise it creates MDS tiled files of the
31     C form "fName.xxx.yyy.data" and "fName.xxx.yyy.meta".
32     C A meta-file is always created.
33     C The precision of the file is decsribed by filePrec, set either
34     C to floatPrec32 or floatPrec64.
35     C irecord is the record number to be written and must be >= 1.
36    
37     IMPLICIT NONE
38     C Global variables / common blocks
39     #include "SIZE.h"
40     #include "EEPARAMS.h"
41     #include "PARAMS.h"
42    
43     C Routine arguments
44     CHARACTER*(*) fName
45     INTEGER filePrec
46 jmc 1.2 CHARACTER*(2) arrType
47 jmc 1.1 INTEGER nArr
48 jmc 1.2 _RL arr(*)
49 jmc 1.1 INTEGER bi,bj
50     INTEGER irecord
51     INTEGER myIter
52     INTEGER myThid
53     C Functions
54     INTEGER ILNBLNK
55     INTEGER MDS_RECLEN
56 jmc 1.2 EXTERNAL ILNBLNK
57     EXTERNAL MDS_RECLEN
58 jmc 1.1 C Local variables
59     CHARACTER*(MAX_LEN_FNAM) dataFName, metaFName, pfName
60     CHARACTER*(MAX_LEN_MBUF) msgBuf
61     LOGICAL fileIsOpen
62 jmc 1.2 INTEGER iG,jG,iRec,k,dUnit,IL,pIL
63     INTEGER dimList(3,3), nDims, map2gl(2)
64 jmc 1.1 INTEGER length_of_rec
65     INTEGER loc_size
66     PARAMETER( loc_size = Nx+Ny+Nr )
67     real*4 r4seg(loc_size)
68     real*8 r8seg(loc_size)
69    
70 jmc 1.2 DATA map2gl / 0, 1 /
71    
72 jmc 1.1 C Only DO I/O IF I am the master thread
73     _BEGIN_MASTER( myThid )
74 jmc 1.2 C-- we write a non-tiled array (bi=bj=0) only 1 time (if ProcId=0):
75     IF ( (myProcId.EQ.0 .AND. bi.EQ.0 .AND. bj.EQ.0)
76     & .OR. bi.NE.0 .OR. bj.NE.0 ) THEN
77 jmc 1.1
78     C Record number must be >= 1
79     IF (irecord .LT. 1) THEN
80 jmc 1.2 WRITE(msgBuf,'(A,I9)')
81     & ' MDS_WRITEVEC_LOC: argument irecord = ',irecord
82 jmc 1.1 CALL PRINT_ERROR( msgBuf, myThid )
83     WRITE(msgBuf,'(A)')
84 jmc 1.2 & ' MDS_WRITEVEC_LOC: invalid value for irecord'
85 jmc 1.1 CALL PRINT_ERROR( msgBuf, myThid )
86 jmc 1.2 STOP 'ABNORMAL END: S/R MDS_WRITEVEC_LOC'
87 jmc 1.1 ENDIF
88    
89     C Assume nothing
90 jmc 1.2 fileIsOpen = .FALSE.
91 jmc 1.1 IL = ILNBLNK( fName )
92 jmc 1.2 iRec = irecord
93    
94     C Check buffer size
95     IF ( nArr.GT.loc_size ) THEN
96     WRITE(msgBuf,'(3A)')
97     & ' MDS_WRITEVEC_LOC: writing to file "', fName(1:IL), '":'
98     CALL PRINT_ERROR( msgBuf, myThid )
99     WRITE(msgBuf,'(A,I9)')
100     & ' MDS_WRITEVEC_LOC: dim of arr to write=', nArr
101     CALL PRINT_ERROR( msgBuf, myThid )
102     WRITE(msgBuf,'(A,I9)')
103     & ' MDS_WRITEVEC_LOC: exceeds buffer size=', loc_size
104     CALL PRINT_ERROR( msgBuf, myThid )
105     STOP 'ABNORMAL END: S/R MDS_WRITEVEC_LOC'
106     ENDIF
107 jmc 1.1
108     C Assign special directory
109     IF ( mdsioLocalDir .NE. ' ' ) THEN
110     pIL = ILNBLNK( mdsioLocalDir )
111     WRITE(pFname,'(2A)') mdsioLocalDir(1:pIL), fName(1:IL)
112     pIL = IL + pIL
113     ELSE
114     WRITE(pFname,'(A)') fName(1:IL)
115     pIL = IL
116     ENDIF
117    
118     C Assign a free unit number as the I/O channel for this routine
119     CALL MDSFINDUNIT( dUnit, myThid )
120    
121     C-- Set the file Name:
122     IF ( bi.EQ.0 .AND. bj.EQ.0 ) THEN
123     C- we are writing a non-tiled array (bi=bj=0):
124     WRITE(dataFname,'(2A)') fName(1:IL),'.data'
125     ELSE
126     C- we are writing a tiled array (bi>0,bj>0):
127     iG=bi+(myXGlobalLo-1)/sNx
128     jG=bj+(myYGlobalLo-1)/sNy
129     WRITE(dataFname,'(2A,I3.3,A,I3.3,A)')
130     & pfName(1:pIL),'.',iG,'.',jG,'.data'
131     ENDIF
132    
133     length_of_rec=MDS_RECLEN( filePrec, nArr, myThid )
134     IF (irecord .EQ. 1) THEN
135     OPEN( dUnit, file=dataFName, status=_NEW_STATUS,
136     & access='direct', recl=length_of_rec )
137     fileIsOpen=.TRUE.
138     ELSE
139     OPEN( dUnit, file=dataFName, status=_OLD_STATUS,
140     & access='direct', recl=length_of_rec )
141     fileIsOpen=.TRUE.
142     ENDIF
143     IF ( debugLevel.GE.debLevB ) THEN
144     WRITE(msgBuf,'(2A)')
145 jmc 1.2 & ' MDS_WRITEVEC_LOC: open file: ',dataFname(1:pIL+13)
146 jmc 1.1 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
147     & SQUEEZE_RIGHT , 1)
148     ENDIF
149    
150     IF (fileIsOpen) THEN
151 jmc 1.2 IF ( arrType.EQ.'RS' ) THEN
152     CALL MDS_WR_REC_RS( arr, r4seg, r8seg,
153     I filePrec, dUnit, iRec, nArr, myThid )
154     ELSEIF ( arrType.EQ.'RL' ) THEN
155     CALL MDS_WR_REC_RL( arr, r4seg, r8seg,
156     I filePrec, dUnit, iRec, nArr, myThid )
157 jmc 1.1 ELSE
158     WRITE(msgBuf,'(A)')
159 jmc 1.2 & ' MDS_WRITEVEC_LOC: illegal value for arrType'
160 jmc 1.1 CALL PRINT_ERROR( msgBuf, myThid )
161 jmc 1.2 STOP 'ABNORMAL END: S/R MDS_WRITEVEC_LOC'
162 jmc 1.1 ENDIF
163     ELSE
164     WRITE(msgBuf,'(A)')
165 jmc 1.2 & ' MDS_WRITEVEC_LOC: should never reach this point'
166 jmc 1.1 CALL PRINT_ERROR( msgBuf, myThid )
167 jmc 1.2 STOP 'ABNORMAL END: S/R MDS_WRITEVEC_LOC'
168 jmc 1.1 ENDIF
169    
170     C If we were writing to a tiled MDS file then we close it here
171     IF ( fileIsOpen ) THEN
172     CLOSE( dUnit )
173     fileIsOpen = .FALSE.
174     ENDIF
175    
176     C Create meta-file for each tile IF we are tiling
177     IF ( bi.EQ.0 .AND. bj.EQ.0 ) THEN
178     C-- we are writing a non-tiled array (bi=bj=0):
179     WRITE(metaFname,'(2A)') fName(1:IL),'.meta'
180     dimList(1,1)=1
181     dimList(2,1)=1
182     dimList(3,1)=1
183     dimList(1,2)=1
184     dimList(2,2)=1
185     dimList(3,2)=1
186     ELSE
187     C-- we are writing a tiled array (bi>0,bj>0):
188     iG=bi+(myXGlobalLo-1)/sNx
189     jG=bj+(myYGlobalLo-1)/sNy
190     WRITE(metaFname,'(2A,I3.3,A,I3.3,A)')
191     & pfName(1:pIL),'.',iG,'.',jG,'.meta'
192     dimList(1,1)=nSx*nPx
193     dimList(2,1)=iG
194     dimList(3,1)=iG
195     dimList(1,2)=nSy*nPy
196     dimList(2,2)=jG
197     dimList(3,2)=jG
198     ENDIF
199     dimList(1,3)=nArr
200     dimList(2,3)=1
201     dimList(3,3)=nArr
202 jmc 1.2 nDims=3
203     IF (nArr .EQ. 1) nDims=2
204     CALL MDS_WRITE_META(
205     I metaFName, dataFName, the_run_name, ' ',
206     I filePrec, nDims, dimList, map2gl, 0, ' ',
207     I 0, UNSET_RL, iRec, myIter, myThid )
208     c I metaFName, dataFName, the_run_name, titleLine,
209     c I filePrec, nDims, dimList, map2gl, nFlds, fldList,
210     c I nTimRec, timList, irecord, myIter, myThid )
211 jmc 1.1
212     ENDIF
213     _END_MASTER( myThid )
214    
215     RETURN
216     END

  ViewVC Help
Powered by ViewVC 1.1.22