/[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.3 - (show annotations) (download)
Thu Sep 30 01:02:22 2010 UTC (13 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62l, checkpoint62p
Changes since 1.2: +9 -10 lines
remove unused variables

1 C $Header: /u/gcmpack/MITgcm/pkg/mdsio/mdsio_write_whalos.F,v 1.2 2010/09/24 23:21:02 gforget Exp $
2 C $fName: $
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 mythid
18 & )
19
20 C !DESCRIPTION: \bv
21 c ==================================================================
22 c SUBROUTINE mds_write_whalos
23 c ==================================================================
24 c o Write file that includes halos. The main purpose is for
25 c adjoint related "tape I/O". The secondary purpose is debugging.
26 c ==================================================================
27 c SUBROUTINE mds_write_whalos
28 c ==================================================================
29 C \ev
30
31 C !USES:
32 implicit none
33
34 c == global variables ==
35 #include "EEPARAMS.h"
36 #include "SIZE.h"
37 #include "PARAMS.h"
38 #ifdef ALLOW_WHIO
39 # include "MDSIO_BUFF_WH.h"
40 #endif
41
42 C !INPUT/OUTPUT PARAMETERS:
43 c == routine arguments ==
44 c fName - extended tape fName.
45 c len - number of characters in fName.
46 c filePrec - number of bits per word in file (32 or 64).
47 c fid - file unit (its use is not implemented yet).
48 C n2d - size of the fldRL third dimension.
49 c fldRL - array to read.
50 c irec - record number to be written.
51 c mythid - number of the thread or instance of the program.
52
53 integer mythid
54 character*(*) fName
55 integer len
56 integer fid
57 integer filePrec
58 integer n2d
59 integer irec
60 _RL fldRL(1-Olx:sNx+Olx,1-Oly:sNy+Oly,n2d,nSx,nSy)
61 CEOP
62
63 #ifdef ALLOW_WHIO
64 C !LOCAL VARIABLES:
65 c == local variables ==
66
67 C sNxWh :: x tile size with halo included
68 C sNyWh :: y tile size with halo included
69 C pocNyWh :: processor sum of sNyWh
70 C gloNyWh :: global sum of sNyWh
71 INTEGER sNxWh
72 INTEGER sNyWh
73 INTEGER procNyWh
74 INTEGER gloNyWh
75 PARAMETER ( sNxWh = sNx+2*Olx )
76 PARAMETER ( sNyWh = sNy+2*Oly )
77 PARAMETER ( procNyWh = sNyWh*nSy*nSx )
78 PARAMETER ( gloNyWh = procNyWh*nPy*nPx )
79
80 C !LOCAL VARIABLES:
81 c == local variables ==
82 character*(MAX_LEN_FNAM) pfName
83 character*(MAX_LEN_MBUF) msgBuf
84 integer IL,pIL
85 integer bx,by
86
87 integer length2d, length3d, length_of_rec
88 integer i2d, i3d
89 integer i,j,k,bi,bj,ii
90 integer dUnit, irec2d
91 LOGICAL iAmDoingIO
92
93 _RL fld2d(1:sNxWh,1:sNyWh,nSx,nSy)
94
95 c == functions ==
96 INTEGER ILNBLNK
97 INTEGER MDS_RECLEN
98 LOGICAL MASTER_CPU_IO
99 EXTERNAL ILNBLNK
100 EXTERNAL MDS_RECLEN
101 EXTERNAL MASTER_CPU_IO
102
103 c == end of interface ==
104
105 length2d=sNxWh*procNyWh
106 length3d=length2d*nr
107
108 C Only do I/O if I am the master thread (and mpi process 0 IF useSingleCpuIO):
109 iAmDoingIO = MASTER_CPU_IO(myThid)
110 IF ( iAmDoingIO ) THEN
111 c get the unit and open file
112 CALL MDSFINDUNIT( dUnit, myThid )
113 IL = ILNBLNK( fName )
114 pIL = ILNBLNK( mdsioLocalDir )
115 IF ( pIL.EQ.0 ) THEN
116 pfName = fName
117 ELSE
118 WRITE(pfName,'(2A)') mdsioLocalDir(1:pIL), fName(1:IL)
119 ENDIF
120 pIL=ILNBLNK( pfName )
121 IF ( .NOT.useSingleCpuIO ) THEN
122 WRITE(pfName,'(2A,I3.3,A)') pfName(1:pIL),'.',myProcId,'.data'
123 length_of_rec = MDS_RECLEN( filePrec,sNxWh*procNyWh,myThid )
124 ELSE
125 WRITE(pfName,'(2A)') pfName(1:pIL),'.data'
126 length_of_rec = MDS_RECLEN( filePrec,sNxWh*gloNyWh,myThid)
127 ENDIF
128 OPEN( dUnit, file=pfName, status='unknown',
129 & access='direct', recl=length_of_rec )
130 ENDIF
131
132
133 do i2d=1,n2d
134
135 IF (filePrec .EQ. precFloat32) THEN
136 CALL MDS_PASS_WH_R4toRL( fld2d_procbuff_r4, fldRL,
137 & 1, i2d, n2d, 0, 0, .FALSE., myThid )
138 IF ( useSingleCpuIO ) then
139 CALL BAR2( myThid )
140 CALL GATHER_2D_WH_R4( fld2d_globuff_r4,
141 & fld2d_procbuff_r4,myThid)
142 ENDIF
143 ELSE
144 CALL MDS_PASS_WH_R8toRL( fld2d_procbuff_r8, fldRL,
145 & 1, i2d, n2d, 0, 0, .FALSE., myThid )
146 IF ( useSingleCpuIO ) then
147 CALL BAR2( myThid )
148 CALL GATHER_2D_WH_R8( fld2d_globuff_r8,
149 & fld2d_procbuff_r8,myThid)
150 ENDIF
151 ENDIF
152
153 _BARRIER
154 IF ( iAmDoingIO ) THEN
155 irec2d=i2d+n2d*(irec-1)
156 IF ( .NOT.useSingleCpuIO ) then
157 IF (filePrec .EQ. precFloat32) THEN
158 WRITE(dUnit,rec=irec2d) fld2d_procbuff_r4
159 ELSE
160 WRITE(dUnit,rec=irec2d) fld2d_procbuff_r8
161 ENDIF
162 ELSE
163 IF (filePrec .EQ. precFloat32) THEN
164 WRITE(dUnit,rec=irec2d) fld2d_globuff_r4
165 ELSE
166 WRITE(dUnit,rec=irec2d) fld2d_globuff_r8
167 ENDIF
168 ENDIF
169 ENDIF
170 _BARRIER
171
172 enddo
173
174 IF ( iAmDoingIO ) THEN
175 CLOSE( dUnit )
176 ENDIF
177
178 #endif
179
180 return
181 end
182

  ViewVC Help
Powered by ViewVC 1.1.22