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

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

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


Revision 1.6 - (show annotations) (download)
Fri Jan 21 22:02:33 2011 UTC (13 years, 4 months ago) by gforget
Branch: MAIN
CVS Tags: checkpoint62s, checkpoint62r, checkpoint62w, checkpoint62v, checkpoint62u, checkpoint62t, checkpoint62z, checkpoint62y, checkpoint62x
Changes since 1.5: +69 -5 lines
- pkg/mdsio: introducing ALLOW_WHIO_3D (sub-option of ALLOW_WHIO)
  to bufferize the I/O (stack 2D fields up then write 3D field).
- this option is mostly meant to be used when NOT singlecpuio;
  to actually use it with singlecpuio (beware of memory overhead)
  you also need to define INCLUDE_WHIO_GLOBUFF_3D.
- locBufferIO is added to the list of mds_*_whalos.F params, and
  should be set to .TRUE. to exploit the ALLOW_WHIO_3D capability.

- pkg/autodiff: use this approach as the WHTAPEIO default.

1 C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_read_whalos.F,v 1.5 2011/01/19 23:20:24 gforget Exp $
2 C $fName: $
3
4 #include "MDSIO_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: mds_read_whalos
8 C !INTERFACE:
9 subroutine mds_read_whalos(
10 I fName,
11 I len,
12 I filePrec,
13 I fid,
14 I n2d,
15 O fldRL,
16 I irec,
17 I locSingleCPUIO,
18 I locBufferIO,
19 I mythid
20 & )
21
22 C !DESCRIPTION: \bv
23 c ==================================================================
24 c SUBROUTINE mds_read_whalos
25 c ==================================================================
26 c o Read file that includes halos. The main purpose is for
27 c adjoint related "tape I/O". The secondary purpose is debugging.
28 c ==================================================================
29 c SUBROUTINE mds_read_whalos
30 c ==================================================================
31 C \ev
32
33 C !USES:
34 implicit none
35
36 c == global variables ==
37 #include "EEPARAMS.h"
38 #include "SIZE.h"
39 #include "PARAMS.h"
40 #ifdef ALLOW_WHIO
41 #include "MDSIO_BUFF_WH.h"
42 #endif
43
44 C !INPUT/OUTPUT PARAMETERS:
45 c == routine arguments ==
46 c fName - extended tape fName.
47 c len - number of characters in fName.
48 c filePrec - number of bits per word in file (32 or 64).
49 c fid - file unit (its use is not implemented yet).
50 C n2d - size of the fldRL third dimension.
51 c fldRL - array to read.
52 c irec - record number to be written.
53 c mythid - number of the thread or instance of the program.
54
55 integer mythid
56 character*(*) fName
57 integer len
58 integer fid
59 integer filePrec
60 integer n2d
61 integer irec
62 _RL fldRL(1-Olx:sNx+Olx,1-Oly:sNy+Oly,n2d,nSx,nSy)
63 logical locSingleCPUIO, locBufferIO
64 CEOP
65
66 #ifdef ALLOW_WHIO
67 C !LOCAL VARIABLES:
68 c == local variables ==
69
70 C sNxWh :: x tile size with halo included
71 C sNyWh :: y tile size with halo included
72 C pocNyWh :: processor sum of sNyWh
73 C gloNyWh :: global sum of sNyWh
74 INTEGER sNxWh
75 INTEGER sNyWh
76 INTEGER procNyWh
77 INTEGER gloNyWh
78 PARAMETER ( sNxWh = sNx+2*Olx )
79 PARAMETER ( sNyWh = sNy+2*Oly )
80 PARAMETER ( procNyWh = sNyWh*nSy*nSx )
81 PARAMETER ( gloNyWh = procNyWh*nPy*nPx )
82
83 character*(MAX_LEN_FNAM) pfName
84 character*(MAX_LEN_MBUF) msgBuf
85 integer IL
86 integer bx,by
87
88 integer lengthBuff, length_of_rec
89 integer i2d, i3d
90 integer i,j,k,bi,bj,ii
91 integer dUnit, irec2d
92 LOGICAL iAmDoingIO
93
94 _RL fld2d(1:sNxWh,1:sNyWh,nSx,nSy)
95
96 c == functions ==
97 INTEGER ILNBLNK
98 INTEGER MDS_RECLEN
99 EXTERNAL ILNBLNK
100 EXTERNAL MDS_RECLEN
101
102 c == end of interface ==
103
104 #ifdef ALLOW_WHIO_3D
105 writeWh=.FALSE.
106 #endif
107
108 IF ( .NOT.locSingleCpuIO ) then
109 lengthBuff=sNxWh*procNyWh
110 ELSE
111 lengthBuff=sNxWh*gloNyWh
112 ENDIF
113
114 C Only do I/O if I am the master thread (and mpi process 0 IF locSingleCpuIO):
115 iAmDoingIO = .FALSE.
116 IF ( .NOT.locSingleCpuIO .OR. myProcId.EQ.0 ) THEN
117 _BEGIN_MASTER( myThid )
118 iAmDoingIO = .TRUE.
119 _END_MASTER( myThid )
120 ENDIF
121
122 IF ( iAmDoingIO ) THEN
123 c get the unit and open file
124 IL = ILNBLNK( fName )
125 IF ( .NOT.locSingleCpuIO ) THEN
126 WRITE(pfName,'(2A,I3.3,A)') fName(1:IL),'.',myProcId,'.data'
127 length_of_rec = MDS_RECLEN( filePrec,sNxWh*procNyWh, myThid )
128 ELSE
129 WRITE(pfName,'(2A)') fName(1:IL),'.data'
130 length_of_rec = MDS_RECLEN( filePrec,sNxWh*gloNyWh,myThid)
131 ENDIF
132 IF (fid.EQ.0) THEN
133 CALL MDSFINDUNIT( dUnit, myThid )
134 OPEN( dUnit, file=pfName, status='old',
135 & access='direct', recl=length_of_rec )
136 ELSE
137 dUnit=fid
138 ENDIF
139 ENDIF
140
141
142 do i2d=1,n2d
143
144 _BARRIER
145 #ifdef ALLOW_WHIO_3D
146 IF ( iAmDoingIO.AND.locBufferIO.AND.(fid.NE.0) ) THEN
147 c reset counter if needed
148 IF (jWh.EQ.nWh) jWh=0
149 c increment counter
150 jWh=jWh+1
151 c determine current file record
152 irec2d=i2d+n2d*(irec-1)
153 iWh=(irec2d-1)/nWh+1
154 c read new chunk if needed
155 IF (jWh.EQ.1) THEN
156 IF ( .NOT.locSingleCpuIO ) then
157 IF (filePrec .EQ. precFloat32) THEN
158 READ(dUnit,rec=iWh) fld3d_procbuff_r4
159 ELSE
160 READ(dUnit,rec=iWh) fld3d_procbuff_r8
161 ENDIF
162 ELSE
163 # ifdef INCLUDE_WHIO_GLOBUFF_3D
164 IF (filePrec .EQ. precFloat32) THEN
165 READ(dUnit,rec=iWh) fld3d_globuff_r4
166 ELSE
167 READ(dUnit,rec=iWh) fld3d_globuff_r8
168 ENDIF
169 # endif
170 ENDIF
171 ENDIF
172 c copy
173 DO i=1,lengthBuff
174 j=(jWh-1)*lengthBuff+i
175 IF ( .NOT.locSingleCpuIO ) then
176 IF (filePrec .EQ. precFloat32) THEN
177 fld2d_procbuff_r4(i)=fld3d_procbuff_r4(j)
178 ELSE
179 fld2d_procbuff_r8(i)=fld3d_procbuff_r8(j)
180 ENDIF
181 ELSE
182 # ifdef INCLUDE_WHIO_GLOBUFF_3D
183 IF (filePrec .EQ. precFloat32) THEN
184 fld2d_globuff_r4(i)=fld3d_globuff_r4(j)
185 ELSE
186 fld2d_globuff_r8(i)=fld3d_globuff_r8(j)
187 ENDIF
188 # endif
189 ENDIF
190 ENDDO
191
192 ELSEIF ( iAmDoingIO ) THEN
193 #else
194 IF ( iAmDoingIO ) THEN
195 #endif
196 irec2d=i2d+n2d*(irec-1)
197 IF ( .NOT.locSingleCpuIO ) then
198 IF (filePrec .EQ. precFloat32) THEN
199 READ(dUnit,rec=irec2d) fld2d_procbuff_r4
200 ELSE
201 READ(dUnit,rec=irec2d) fld2d_procbuff_r8
202 ENDIF
203 ELSE
204 # ifndef EXCLUDE_WHIO_GLOBUFF_2D
205 IF (filePrec .EQ. precFloat32) THEN
206 READ(dUnit,rec=irec2d) fld2d_globuff_r4
207 ELSE
208 READ(dUnit,rec=irec2d) fld2d_globuff_r8
209 ENDIF
210 # endif
211 ENDIF
212 ENDIF
213 _BARRIER
214
215 IF (filePrec .EQ. precFloat32) THEN
216 IF ( locSingleCpuIO ) then
217 # ifndef EXCLUDE_WHIO_GLOBUFF_2D
218 CALL SCATTER_2D_WH_R4 ( fld2d_globuff_r4,
219 & fld2d_procbuff_r4,myThid)
220 # endif
221 CALL BAR2( myThid )
222 ENDIF
223 CALL MDS_PASS_R4toRL( fld2d_procbuff_r4, fldRL,
224 & OLx, OLy, 1, i2d, n2d, 0, 0, .TRUE., myThid )
225 ELSE
226 IF ( locSingleCpuIO ) then
227 # ifndef EXCLUDE_WHIO_GLOBUFF_2D
228 CALL SCATTER_2D_WH_R8 ( fld2d_globuff_r8,
229 & fld2d_procbuff_r8,myThid)
230 # endif
231 CALL BAR2( myThid )
232 ENDIF
233 CALL MDS_PASS_R8toRL( fld2d_procbuff_r8, fldRL,
234 & OLx, OLy, 1, i2d, n2d, 0, 0, .TRUE., myThid )
235 ENDIF
236
237 enddo
238
239 IF ( iAmDoingIO.AND.(fid.EQ.0) ) THEN
240 CLOSE( dUnit )
241 ENDIF
242
243 #endif
244
245 return
246 end

  ViewVC Help
Powered by ViewVC 1.1.22