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

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

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


Revision 1.7 - (show annotations) (download)
Thu Jun 23 22:11:07 2011 UTC (12 years, 10 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63g, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint64, checkpoint65, checkpoint63, checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, HEAD
Changes since 1.6: +6 -7 lines
fix CVS Name

1 C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_write_whalos.F,v 1.6 2011/01/21 22:02:33 gforget Exp $
2 C $Name: $
3
4 #include "MDSIO_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: mds_write_whalos
8 C !INTERFACE:
9 subroutine mds_write_whalos(
10 I fName,
11 I len,
12 I filePrec,
13 I fid,
14 I n2d,
15 I 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_write_whalos
25 c ==================================================================
26 c o Write 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_write_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 C !LOCAL VARIABLES:
84 c == local variables ==
85 character*(MAX_LEN_FNAM) pfName
86 character*(MAX_LEN_MBUF) msgBuf
87 integer IL
88 integer bx,by
89
90 integer lengthBuff, length_of_rec
91 integer i2d, i3d
92 integer i,j,k,bi,bj,ii
93 integer dUnit, irec2d
94 LOGICAL iAmDoingIO
95
96 _RL fld2d(1:sNxWh,1:sNyWh,nSx,nSy)
97
98 c == functions ==
99 INTEGER ILNBLNK
100 INTEGER MDS_RECLEN
101 EXTERNAL ILNBLNK
102 EXTERNAL MDS_RECLEN
103
104 c == end of interface ==
105
106 #ifdef ALLOW_WHIO_3D
107 writeWh=.TRUE.
108 #endif
109
110 IF ( .NOT.locSingleCpuIO ) then
111 lengthBuff=sNxWh*procNyWh
112 ELSE
113 lengthBuff=sNxWh*gloNyWh
114 ENDIF
115
116 C Only do I/O if I am the master thread (and mpi process 0 IF locSingleCpuIO):
117 iAmDoingIO = .FALSE.
118 IF ( .NOT.locSingleCpuIO .OR. myProcId.EQ.0 ) THEN
119 _BEGIN_MASTER( myThid )
120 iAmDoingIO = .TRUE.
121 _END_MASTER( myThid )
122 ENDIF
123
124 IF ( iAmDoingIO ) THEN
125 c get the unit and open file
126 IL = ILNBLNK( fName )
127 IF ( .NOT.locSingleCpuIO ) THEN
128 WRITE(pfName,'(2A,I3.3,A)') fName(1:IL),'.',myProcId,'.data'
129 length_of_rec = MDS_RECLEN( filePrec,sNxWh*procNyWh,myThid )
130 ELSE
131 WRITE(pfName,'(2A)') fName(1:IL),'.data'
132 length_of_rec = MDS_RECLEN( filePrec,sNxWh*gloNyWh,myThid)
133 ENDIF
134 IF (fid.EQ.0) THEN
135 CALL MDSFINDUNIT( dUnit, myThid )
136 OPEN( dUnit, file=pfName, status='unknown',
137 & access='direct', recl=length_of_rec )
138 ELSE
139 dUnit=fid
140 ENDIF
141 ENDIF
142
143
144 do i2d=1,n2d
145
146 IF (filePrec .EQ. precFloat32) THEN
147 CALL MDS_PASS_R4toRL( fld2d_procbuff_r4, fldRL,
148 & OLx, OLy, 1, i2d, n2d, 0, 0, .FALSE., myThid )
149 IF ( locSingleCpuIO ) then
150 CALL BAR2( myThid )
151 # ifndef EXCLUDE_WHIO_GLOBUFF_2D
152 CALL GATHER_2D_WH_R4( fld2d_globuff_r4,
153 & fld2d_procbuff_r4,myThid)
154 # endif
155 ENDIF
156 ELSE
157 CALL MDS_PASS_R8toRL( fld2d_procbuff_r8, fldRL,
158 & OLx, OLy, 1, i2d, n2d, 0, 0, .FALSE., myThid )
159 IF ( locSingleCpuIO ) then
160 CALL BAR2( myThid )
161 # ifndef EXCLUDE_WHIO_GLOBUFF_2D
162 CALL GATHER_2D_WH_R8( fld2d_globuff_r8,
163 & fld2d_procbuff_r8,myThid)
164 # endif
165 ENDIF
166 ENDIF
167
168 _BARRIER
169 #ifdef ALLOW_WHIO_3D
170 IF ( iAmDoingIO.AND.locBufferIO.AND.(fid.NE.0) ) THEN
171 c reset counter if needed
172 IF (jWh.EQ.nWh) jWh=0
173 c increment counter
174 jWh=jWh+1
175 c determine current file record
176 irec2d=i2d+n2d*(irec-1)
177 iWh=(irec2d-1)/nWh+1
178 c copy
179 DO i=1,lengthBuff
180 j=(jWh-1)*lengthBuff+i
181 IF ( .NOT.locSingleCpuIO ) then
182 IF (filePrec .EQ. precFloat32) THEN
183 fld3d_procbuff_r4(j)=fld2d_procbuff_r4(i)
184 ELSE
185 fld3d_procbuff_r8(j)=fld2d_procbuff_r8(i)
186 ENDIF
187 ELSE
188 # ifdef INCLUDE_WHIO_GLOBUFF_3D
189 IF (filePrec .EQ. precFloat32) THEN
190 fld3d_globuff_r4(j)=fld2d_globuff_r4(i)
191 ELSE
192 fld3d_globuff_r8(j)=fld2d_globuff_r8(i)
193 ENDIF
194 # endif
195 ENDIF
196 ENDDO
197 c write chunk if needed
198 IF (jWh.EQ.nWh) THEN
199 IF ( .NOT.locSingleCpuIO ) then
200 IF (filePrec .EQ. precFloat32) THEN
201 WRITE(dUnit,rec=iWh) fld3d_procbuff_r4
202 ELSE
203 WRITE(dUnit,rec=iWh) fld3d_procbuff_r8
204 ENDIF
205 ELSE
206 # ifdef INCLUDE_WHIO_GLOBUFF_3D
207 IF (filePrec .EQ. precFloat32) THEN
208 WRITE(dUnit,rec=iWh) fld3d_globuff_r4
209 ELSE
210 WRITE(dUnit,rec=iWh) fld3d_globuff_r8
211 ENDIF
212 # endif
213 ENDIF
214 ENDIF
215
216 ELSEIF ( iAmDoingIO ) THEN
217 #else
218 IF ( iAmDoingIO ) THEN
219 #endif
220 irec2d=i2d+n2d*(irec-1)
221 IF ( .NOT.locSingleCpuIO ) then
222 IF (filePrec .EQ. precFloat32) THEN
223 WRITE(dUnit,rec=irec2d) fld2d_procbuff_r4
224 ELSE
225 WRITE(dUnit,rec=irec2d) fld2d_procbuff_r8
226 ENDIF
227 ELSE
228 # ifndef EXCLUDE_WHIO_GLOBUFF_2D
229 IF (filePrec .EQ. precFloat32) THEN
230 WRITE(dUnit,rec=irec2d) fld2d_globuff_r4
231 ELSE
232 WRITE(dUnit,rec=irec2d) fld2d_globuff_r8
233 ENDIF
234 # endif
235 ENDIF
236 ENDIF
237 _BARRIER
238
239 enddo
240
241 IF ( iAmDoingIO.AND.(fid.EQ.0) ) THEN
242 CLOSE( dUnit )
243 ENDIF
244
245 #endif
246
247 RETURN
248 END

  ViewVC Help
Powered by ViewVC 1.1.22