1 |
jmc |
1.9 |
C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_writevec_loc.F,v 1.8 2011/06/07 22:30:29 jmc Exp $ |
2 |
jmc |
1.1 |
C $Name: $ |
3 |
|
|
|
4 |
|
|
#include "MDSIO_OPTIONS.h" |
5 |
|
|
|
6 |
jmc |
1.3 |
CBOP |
7 |
|
|
C !ROUTINE: MDS_WRITEVEC_LOC |
8 |
|
|
C !INTERFACE: |
9 |
jmc |
1.2 |
SUBROUTINE MDS_WRITEVEC_LOC( |
10 |
jmc |
1.1 |
I fName, |
11 |
|
|
I filePrec, |
12 |
jmc |
1.3 |
U ioUnit, |
13 |
jmc |
1.2 |
I arrType, |
14 |
jmc |
1.5 |
I nSize, |
15 |
|
|
I fldRL, fldRS, |
16 |
jmc |
1.1 |
I bi, bj, |
17 |
|
|
I irecord, |
18 |
|
|
I myIter, |
19 |
|
|
I myThid ) |
20 |
jmc |
1.2 |
|
21 |
jmc |
1.3 |
C !DESCRIPTION: |
22 |
jmc |
1.1 |
C Arguments: |
23 |
|
|
C |
24 |
jmc |
1.3 |
C fName string :: base name for file to written |
25 |
jmc |
1.2 |
C filePrec integer :: number of bits per word in file (32 or 64) |
26 |
jmc |
1.3 |
C ioUnit integer :: fortran file IO unit |
27 |
jmc |
1.5 |
C nSize integer :: number of elements from input array "fldRL/RS" to be written |
28 |
|
|
C arrType char(2) :: which array (fldRL/RS) to write, either "RL" or "RS" |
29 |
|
|
C fldRL ( RL ) :: array to write if arrType="RL", fldRL(nSize) |
30 |
|
|
C fldRS ( RS ) :: array to write if arrType="RS", fldRS(nSize) |
31 |
jmc |
1.2 |
C bi,bj integer :: tile indices (if tiled array) or 0,0 if not a tiled array |
32 |
jmc |
1.3 |
C irecord integer :: record number to WRITE =|irecord| |
33 |
jmc |
1.2 |
C myIter integer :: time step number |
34 |
|
|
C myThid integer :: my Thread Id number |
35 |
jmc |
1.1 |
C |
36 |
jmc |
1.3 |
C MDS_WRITEVEC_LOC according to ioUnit: |
37 |
|
|
C ioUnit = 0 : open file, write and close the file (return ioUnit=0). |
38 |
|
|
C ioUnit =-1 : open file, write and leave it open (return IO unit in ioUnit) |
39 |
|
|
C ioUnit > 0 : assume file "ioUnit" is open, and write to it. |
40 |
|
|
C MDS_WRITEVEC_LOC writes either to a file of the form "fName.data" and |
41 |
jmc |
1.5 |
C "fName.meta" if bi=bj=0. Otherwise it writes to MDS tiled files of the |
42 |
jmc |
1.1 |
C form "fName.xxx.yyy.data" and "fName.xxx.yyy.meta". |
43 |
jmc |
1.3 |
C If irecord>0, a meta-file is created (skipped if irecord<0). |
44 |
jmc |
1.5 |
C The precision of the file is described by filePrec, set either |
45 |
jmc |
1.1 |
C to floatPrec32 or floatPrec64. |
46 |
jmc |
1.3 |
C |irecord|=iRec is the record number to be written and must be >=1. |
47 |
jmc |
1.1 |
|
48 |
jmc |
1.3 |
C !USES: |
49 |
jmc |
1.1 |
IMPLICIT NONE |
50 |
jmc |
1.3 |
|
51 |
jmc |
1.1 |
C Global variables / common blocks |
52 |
|
|
#include "SIZE.h" |
53 |
|
|
#include "EEPARAMS.h" |
54 |
|
|
#include "PARAMS.h" |
55 |
jmc |
1.7 |
#ifdef ALLOW_FIZHI |
56 |
|
|
# include "fizhi_SIZE.h" |
57 |
|
|
#endif /* ALLOW_FIZHI */ |
58 |
jmc |
1.6 |
#include "MDSIO_BUFF_3D.h" |
59 |
jmc |
1.1 |
|
60 |
jmc |
1.3 |
C !INPUT/OUTPUT PARAMETERS: |
61 |
jmc |
1.1 |
CHARACTER*(*) fName |
62 |
jmc |
1.3 |
INTEGER ioUnit |
63 |
jmc |
1.1 |
INTEGER filePrec |
64 |
jmc |
1.2 |
CHARACTER*(2) arrType |
65 |
jmc |
1.5 |
INTEGER nSize |
66 |
|
|
_RL fldRL(*) |
67 |
|
|
_RS fldRS(*) |
68 |
jmc |
1.1 |
INTEGER bi,bj |
69 |
|
|
INTEGER irecord |
70 |
|
|
INTEGER myIter |
71 |
|
|
INTEGER myThid |
72 |
jmc |
1.3 |
|
73 |
|
|
C !FUNCTIONS: |
74 |
jmc |
1.1 |
INTEGER ILNBLNK |
75 |
|
|
INTEGER MDS_RECLEN |
76 |
jmc |
1.2 |
EXTERNAL ILNBLNK |
77 |
|
|
EXTERNAL MDS_RECLEN |
78 |
jmc |
1.3 |
|
79 |
|
|
C !LOCAL VARIABLES: |
80 |
jmc |
1.1 |
CHARACTER*(MAX_LEN_FNAM) dataFName, metaFName, pfName |
81 |
|
|
CHARACTER*(MAX_LEN_MBUF) msgBuf |
82 |
|
|
LOGICAL fileIsOpen |
83 |
jmc |
1.5 |
INTEGER iG,jG,iRec,dUnit,IL,pIL |
84 |
jmc |
1.2 |
INTEGER dimList(3,3), nDims, map2gl(2) |
85 |
jmc |
1.1 |
INTEGER length_of_rec |
86 |
jmc |
1.6 |
INTEGER buffSize |
87 |
jmc |
1.4 |
_RL dummyRL(1) |
88 |
|
|
CHARACTER*8 blank8c |
89 |
jmc |
1.3 |
CEOP |
90 |
jmc |
1.1 |
|
91 |
jmc |
1.4 |
DATA dummyRL(1) / 0. _d 0 / |
92 |
|
|
DATA blank8c / ' ' / |
93 |
|
|
DATA map2gl / 0, 1 / |
94 |
jmc |
1.2 |
|
95 |
jmc |
1.3 |
C We write a non-tiled array (bi=bj=0) only 1 time (if ProcId=0): |
96 |
|
|
IF ( myProcId.EQ.0 .OR. bi.NE.0 .OR. bj.NE.0 ) THEN |
97 |
|
|
|
98 |
jmc |
1.1 |
C Only DO I/O IF I am the master thread |
99 |
jmc |
1.3 |
_BEGIN_MASTER( myThid ) |
100 |
|
|
|
101 |
|
|
C Assume nothing |
102 |
|
|
fileIsOpen = .FALSE. |
103 |
|
|
IL = ILNBLNK( fName ) |
104 |
|
|
iRec = ABS(irecord) |
105 |
jmc |
1.1 |
|
106 |
|
|
C Record number must be >= 1 |
107 |
jmc |
1.3 |
IF ( iRec.LT.1 ) THEN |
108 |
jmc |
1.2 |
WRITE(msgBuf,'(A,I9)') |
109 |
|
|
& ' MDS_WRITEVEC_LOC: argument irecord = ',irecord |
110 |
jmc |
1.1 |
CALL PRINT_ERROR( msgBuf, myThid ) |
111 |
|
|
WRITE(msgBuf,'(A)') |
112 |
jmc |
1.2 |
& ' MDS_WRITEVEC_LOC: invalid value for irecord' |
113 |
jmc |
1.1 |
CALL PRINT_ERROR( msgBuf, myThid ) |
114 |
jmc |
1.2 |
STOP 'ABNORMAL END: S/R MDS_WRITEVEC_LOC' |
115 |
jmc |
1.1 |
ENDIF |
116 |
|
|
|
117 |
jmc |
1.2 |
C Check buffer size |
118 |
jmc |
1.6 |
buffSize = sNx*sNy*size3dBuf*nSx*nSy |
119 |
|
|
IF ( nSize.GT.buffSize ) THEN |
120 |
jmc |
1.2 |
WRITE(msgBuf,'(3A)') |
121 |
|
|
& ' MDS_WRITEVEC_LOC: writing to file "', fName(1:IL), '":' |
122 |
|
|
CALL PRINT_ERROR( msgBuf, myThid ) |
123 |
|
|
WRITE(msgBuf,'(A,I9)') |
124 |
jmc |
1.5 |
& ' MDS_WRITEVEC_LOC: dim of array to write=', nSize |
125 |
jmc |
1.2 |
CALL PRINT_ERROR( msgBuf, myThid ) |
126 |
|
|
WRITE(msgBuf,'(A,I9)') |
127 |
jmc |
1.6 |
& ' MDS_WRITEVEC_LOC: exceeds buffer size=', buffSize |
128 |
|
|
CALL PRINT_ERROR( msgBuf, myThid ) |
129 |
|
|
WRITE(msgBuf,'(A)') |
130 |
|
|
& ' increase "size3dBuf" in "MDSIO_BUFF_3D.h" and recompile' |
131 |
jmc |
1.2 |
CALL PRINT_ERROR( msgBuf, myThid ) |
132 |
|
|
STOP 'ABNORMAL END: S/R MDS_WRITEVEC_LOC' |
133 |
|
|
ENDIF |
134 |
jmc |
1.1 |
|
135 |
|
|
C Assign special directory |
136 |
|
|
IF ( mdsioLocalDir .NE. ' ' ) THEN |
137 |
|
|
pIL = ILNBLNK( mdsioLocalDir ) |
138 |
|
|
WRITE(pFname,'(2A)') mdsioLocalDir(1:pIL), fName(1:IL) |
139 |
|
|
pIL = IL + pIL |
140 |
|
|
ELSE |
141 |
|
|
WRITE(pFname,'(A)') fName(1:IL) |
142 |
|
|
pIL = IL |
143 |
|
|
ENDIF |
144 |
|
|
|
145 |
jmc |
1.3 |
IF ( ioUnit.GT.0 ) THEN |
146 |
|
|
C- Assume file Unit is already open with correct Rec-Length & Precision |
147 |
|
|
fileIsOpen = .TRUE. |
148 |
|
|
dUnit = ioUnit |
149 |
|
|
ELSE |
150 |
|
|
C- Need to open file IO unit with File-name, Rec-Length & Precision |
151 |
|
|
|
152 |
|
|
C Assign a free unit number as the I/O channel for this routine |
153 |
|
|
CALL MDSFINDUNIT( dUnit, myThid ) |
154 |
jmc |
1.1 |
|
155 |
jmc |
1.3 |
C-- Set the file Name: |
156 |
|
|
IF ( bi.EQ.0 .AND. bj.EQ.0 ) THEN |
157 |
|
|
C- we are writing a non-tiled array (bi=bj=0): |
158 |
|
|
WRITE(dataFname,'(2A)') fName(1:IL),'.data' |
159 |
|
|
ELSE |
160 |
|
|
C- we are writing a tiled array (bi>0,bj>0): |
161 |
|
|
iG=bi+(myXGlobalLo-1)/sNx |
162 |
|
|
jG=bj+(myYGlobalLo-1)/sNy |
163 |
|
|
WRITE(dataFname,'(2A,I3.3,A,I3.3,A)') |
164 |
jmc |
1.1 |
& pfName(1:pIL),'.',iG,'.',jG,'.data' |
165 |
jmc |
1.3 |
ENDIF |
166 |
jmc |
1.1 |
|
167 |
jmc |
1.3 |
C-- Open the file: |
168 |
jmc |
1.5 |
length_of_rec=MDS_RECLEN( filePrec, nSize, myThid ) |
169 |
jmc |
1.3 |
IF (iRec .EQ. 1) THEN |
170 |
|
|
OPEN( dUnit, file=dataFName, status=_NEW_STATUS, |
171 |
|
|
& access='direct', recl=length_of_rec ) |
172 |
|
|
fileIsOpen=.TRUE. |
173 |
|
|
ELSE |
174 |
|
|
OPEN( dUnit, file=dataFName, status=_OLD_STATUS, |
175 |
|
|
& access='direct', recl=length_of_rec ) |
176 |
|
|
fileIsOpen=.TRUE. |
177 |
|
|
ENDIF |
178 |
jmc |
1.8 |
IF ( debugLevel.GE.debLevC ) THEN |
179 |
jmc |
1.3 |
WRITE(msgBuf,'(2A)') |
180 |
jmc |
1.2 |
& ' MDS_WRITEVEC_LOC: open file: ',dataFname(1:pIL+13) |
181 |
jmc |
1.3 |
CALL PRINT_MESSAGE( msgBuf, standardMessageUnit, |
182 |
|
|
& SQUEEZE_RIGHT , 1) |
183 |
|
|
ENDIF |
184 |
|
|
C- End if block: File Unit is already open / Need to open it |
185 |
jmc |
1.1 |
ENDIF |
186 |
|
|
|
187 |
|
|
IF (fileIsOpen) THEN |
188 |
jmc |
1.2 |
IF ( arrType.EQ.'RS' ) THEN |
189 |
jmc |
1.6 |
CALL MDS_WR_REC_RS( fldRS, shared3dBuf_r4, shared3dBuf_r8, |
190 |
jmc |
1.5 |
I filePrec, dUnit, iRec, nSize, myThid ) |
191 |
jmc |
1.2 |
ELSEIF ( arrType.EQ.'RL' ) THEN |
192 |
jmc |
1.6 |
CALL MDS_WR_REC_RL( fldRL, shared3dBuf_r4, shared3dBuf_r8, |
193 |
jmc |
1.5 |
I filePrec, dUnit, iRec, nSize, myThid ) |
194 |
jmc |
1.1 |
ELSE |
195 |
|
|
WRITE(msgBuf,'(A)') |
196 |
jmc |
1.2 |
& ' MDS_WRITEVEC_LOC: illegal value for arrType' |
197 |
jmc |
1.1 |
CALL PRINT_ERROR( msgBuf, myThid ) |
198 |
jmc |
1.2 |
STOP 'ABNORMAL END: S/R MDS_WRITEVEC_LOC' |
199 |
jmc |
1.1 |
ENDIF |
200 |
|
|
ELSE |
201 |
|
|
WRITE(msgBuf,'(A)') |
202 |
jmc |
1.2 |
& ' MDS_WRITEVEC_LOC: should never reach this point' |
203 |
jmc |
1.1 |
CALL PRINT_ERROR( msgBuf, myThid ) |
204 |
jmc |
1.2 |
STOP 'ABNORMAL END: S/R MDS_WRITEVEC_LOC' |
205 |
jmc |
1.1 |
ENDIF |
206 |
|
|
|
207 |
|
|
C If we were writing to a tiled MDS file then we close it here |
208 |
jmc |
1.3 |
IF ( fileIsOpen .AND. ioUnit.EQ.0 ) THEN |
209 |
jmc |
1.1 |
CLOSE( dUnit ) |
210 |
|
|
fileIsOpen = .FALSE. |
211 |
|
|
ENDIF |
212 |
jmc |
1.3 |
IF ( ioUnit.EQ.-1 ) ioUnit = dUnit |
213 |
jmc |
1.1 |
|
214 |
jmc |
1.3 |
IF ( irecord.GT.0 ) THEN |
215 |
jmc |
1.1 |
C Create meta-file for each tile IF we are tiling |
216 |
jmc |
1.3 |
IF ( bi.EQ.0 .AND. bj.EQ.0 ) THEN |
217 |
|
|
C-- we are writing a non-tiled array (bi=bj=0): |
218 |
|
|
WRITE(metaFname,'(2A)') fName(1:IL),'.meta' |
219 |
|
|
dimList(1,1)=1 |
220 |
|
|
dimList(2,1)=1 |
221 |
|
|
dimList(3,1)=1 |
222 |
|
|
dimList(1,2)=1 |
223 |
|
|
dimList(2,2)=1 |
224 |
|
|
dimList(3,2)=1 |
225 |
|
|
ELSE |
226 |
|
|
C-- we are writing a tiled array (bi>0,bj>0): |
227 |
|
|
iG=bi+(myXGlobalLo-1)/sNx |
228 |
|
|
jG=bj+(myYGlobalLo-1)/sNy |
229 |
|
|
WRITE(metaFname,'(2A,I3.3,A,I3.3,A)') |
230 |
jmc |
1.1 |
& pfName(1:pIL),'.',iG,'.',jG,'.meta' |
231 |
jmc |
1.3 |
dimList(1,1)=nSx*nPx |
232 |
|
|
dimList(2,1)=iG |
233 |
|
|
dimList(3,1)=iG |
234 |
|
|
dimList(1,2)=nSy*nPy |
235 |
|
|
dimList(2,2)=jG |
236 |
|
|
dimList(3,2)=jG |
237 |
|
|
ENDIF |
238 |
jmc |
1.5 |
dimList(1,3)=nSize |
239 |
jmc |
1.3 |
dimList(2,3)=1 |
240 |
jmc |
1.5 |
dimList(3,3)=nSize |
241 |
jmc |
1.3 |
nDims=3 |
242 |
jmc |
1.5 |
IF ( nSize.EQ.1 ) nDims=2 |
243 |
jmc |
1.3 |
CALL MDS_WRITE_META( |
244 |
jmc |
1.2 |
I metaFName, dataFName, the_run_name, ' ', |
245 |
jmc |
1.4 |
I filePrec, nDims, dimList, map2gl, 0, blank8c, |
246 |
jmc |
1.9 |
I 0, dummyRL, oneRL, irecord, myIter, myThid ) |
247 |
jmc |
1.3 |
ENDIF |
248 |
jmc |
1.1 |
|
249 |
jmc |
1.3 |
_END_MASTER( myThid ) |
250 |
jmc |
1.1 |
ENDIF |
251 |
|
|
|
252 |
|
|
RETURN |
253 |
|
|
END |