File indexing completed on 2022-03-01 06:09:15 UTC
view on githubraw file Latest commit 01e0ec14 on 2022-01-31 14:41:23 UTC
d7fbd5d0c9 Gael*0001 #include "MDSIO_OPTIONS.h"
0002
0003
9f5240b52a Jean*0004
d7fbd5d0c9 Gael*0005
9f5240b52a Jean*0006 SUBROUTINE MDS_WRITE_WHALOS(
d7fbd5d0c9 Gael*0007 I fName,
0008 I len,
0009 I filePrec,
0010 I fid,
0011 I n2d,
0012 I fldRL,
0013 I irec,
9231496966 Gael*0014 I locSingleCPUIO,
ab63ca39fb Gael*0015 I locBufferIO,
9f5240b52a Jean*0016 I myThid )
d7fbd5d0c9 Gael*0017
0018
9f5240b52a Jean*0019
0020
0021
0022
0023
d7fbd5d0c9 Gael*0024
0025
0026
9f5240b52a Jean*0027 IMPLICIT NONE
d7fbd5d0c9 Gael*0028
9f5240b52a Jean*0029
d7fbd5d0c9 Gael*0030 #include "EEPARAMS.h"
0031 #include "SIZE.h"
0032 #include "PARAMS.h"
0033 #ifdef ALLOW_WHIO
0034 # include "MDSIO_BUFF_WH.h"
0035 #endif
0036
0037
9f5240b52a Jean*0038
0039
0040
0041
0042
0043
0044
0045
0046 CHARACTER*(*) fName
0047 INTEGER len
0048 INTEGER filePrec
0049 INTEGER fid
0050 INTEGER n2d
0051 _RL fldRL(1-OLx:sNx+OLx,1-OLy:sNy+OLy,n2d,nSx,nSy)
0052 INTEGER irec
0053 LOGICAL locSingleCPUIO, locBufferIO
0054 INTEGER myThid
d7fbd5d0c9 Gael*0055
0056 #ifdef ALLOW_WHIO
9f5240b52a Jean*0057
0058 INTEGER ILNBLNK
0059 INTEGER MDS_RECLEN
0060 EXTERNAL ILNBLNK
0061 EXTERNAL MDS_RECLEN
d7fbd5d0c9 Gael*0062
9f5240b52a Jean*0063
0064
0065
0066
d7fbd5d0c9 Gael*0067
0068
0069 INTEGER sNxWh
0070 INTEGER sNyWh
0071 INTEGER procNyWh
0072 INTEGER gloNyWh
9f5240b52a Jean*0073 PARAMETER ( sNxWh = sNx+2*OLx )
0074 PARAMETER ( sNyWh = sNy+2*OLy )
d7fbd5d0c9 Gael*0075 PARAMETER ( procNyWh = sNyWh*nSy*nSx )
0076 PARAMETER ( gloNyWh = procNyWh*nPy*nPx )
9f5240b52a Jean*0077
0078 CHARACTER*(MAX_LEN_FNAM) pfName
0079 INTEGER IL
0080 INTEGER lengthBuff, length_of_rec
0081 INTEGER i, j, i2d
0082 INTEGER dUnit, irec2d
d7fbd5d0c9 Gael*0083 LOGICAL iAmDoingIO
01e0ec14d7 Jean*0084 #ifdef ALLOW_WHIO_3D
0085 INTEGER js
0086 #endif
9f5240b52a Jean*0087
d7fbd5d0c9 Gael*0088
ab63ca39fb Gael*0089 #ifdef ALLOW_WHIO_3D
0090 writeWh=.TRUE.
0091 #endif
d7fbd5d0c9 Gael*0092
9f5240b52a Jean*0093 IF ( .NOT.locSingleCpuIO ) THEN
ab63ca39fb Gael*0094 lengthBuff=sNxWh*procNyWh
0095 ELSE
0096 lengthBuff=sNxWh*gloNyWh
0097 ENDIF
1d8c557c39 Jean*0098
9231496966 Gael*0099
0100 iAmDoingIO = .FALSE.
0101 IF ( .NOT.locSingleCpuIO .OR. myProcId.EQ.0 ) THEN
0102 _BEGIN_MASTER( myThid )
0103 iAmDoingIO = .TRUE.
0104 _END_MASTER( myThid )
1d8c557c39 Jean*0105 ENDIF
9231496966 Gael*0106
d7fbd5d0c9 Gael*0107 IF ( iAmDoingIO ) THEN
9f5240b52a Jean*0108
d7fbd5d0c9 Gael*0109 IL = ILNBLNK( fName )
9231496966 Gael*0110 IF ( .NOT.locSingleCpuIO ) THEN
0111 WRITE(pfName,'(2A,I3.3,A)') fName(1:IL),'.',myProcId,'.data'
d7fbd5d0c9 Gael*0112 length_of_rec = MDS_RECLEN( filePrec,sNxWh*procNyWh,myThid )
0113 ELSE
9231496966 Gael*0114 WRITE(pfName,'(2A)') fName(1:IL),'.data'
d7fbd5d0c9 Gael*0115 length_of_rec = MDS_RECLEN( filePrec,sNxWh*gloNyWh,myThid)
0116 ENDIF
9231496966 Gael*0117 IF (fid.EQ.0) THEN
0118 CALL MDSFINDUNIT( dUnit, myThid )
0119 OPEN( dUnit, file=pfName, status='unknown',
d7fbd5d0c9 Gael*0120 & access='direct', recl=length_of_rec )
9231496966 Gael*0121 ELSE
0122 dUnit=fid
0123 ENDIF
d7fbd5d0c9 Gael*0124 ENDIF
f6d7c45cef Jean*0125
9f5240b52a Jean*0126 DO i2d=1,n2d
d7fbd5d0c9 Gael*0127
0128 IF (filePrec .EQ. precFloat32) THEN
1cfc927d8c Jean*0129 CALL MDS_PASS_R4toRL( fld2d_procbuff_r4, fldRL,
0130 & OLx, OLy, 1, i2d, n2d, 0, 0, .FALSE., myThid )
9f5240b52a Jean*0131 IF ( locSingleCpuIO ) THEN
d7fbd5d0c9 Gael*0132 CALL BAR2( myThid )
ab63ca39fb Gael*0133 # ifndef EXCLUDE_WHIO_GLOBUFF_2D
f6d7c45cef Jean*0134 CALL GATHER_2D_WH_R4( fld2d_globuff_r4,
d7fbd5d0c9 Gael*0135 & fld2d_procbuff_r4,myThid)
ab63ca39fb Gael*0136 # endif
f6d7c45cef Jean*0137 ENDIF
d7fbd5d0c9 Gael*0138 ELSE
1cfc927d8c Jean*0139 CALL MDS_PASS_R8toRL( fld2d_procbuff_r8, fldRL,
0140 & OLx, OLy, 1, i2d, n2d, 0, 0, .FALSE., myThid )
9f5240b52a Jean*0141 IF ( locSingleCpuIO ) THEN
d7fbd5d0c9 Gael*0142 CALL BAR2( myThid )
ab63ca39fb Gael*0143 # ifndef EXCLUDE_WHIO_GLOBUFF_2D
f6d7c45cef Jean*0144 CALL GATHER_2D_WH_R8( fld2d_globuff_r8,
d7fbd5d0c9 Gael*0145 & fld2d_procbuff_r8,myThid)
ab63ca39fb Gael*0146 # endif
f6d7c45cef Jean*0147 ENDIF
d7fbd5d0c9 Gael*0148 ENDIF
0149
0150 _BARRIER
ab63ca39fb Gael*0151 #ifdef ALLOW_WHIO_3D
0152 IF ( iAmDoingIO.AND.locBufferIO.AND.(fid.NE.0) ) THEN
9f5240b52a Jean*0153
ab63ca39fb Gael*0154 IF (jWh.EQ.nWh) jWh=0
9f5240b52a Jean*0155
ab63ca39fb Gael*0156 jWh=jWh+1
9f5240b52a Jean*0157
ab63ca39fb Gael*0158 irec2d=i2d+n2d*(irec-1)
0159 iWh=(irec2d-1)/nWh+1
9f5240b52a Jean*0160
01e0ec14d7 Jean*0161 js = (jWh-1)*lengthBuff
0162 IF ( .NOT.locSingleCpuIO ) THEN
0163 IF (filePrec .EQ. precFloat32) THEN
0164 DO i=1,lengthBuff
0165 j = js + i
0166 fld3d_procbuff_r4(j) = fld2d_procbuff_r4(i)
0167 ENDDO
ab63ca39fb Gael*0168 ELSE
01e0ec14d7 Jean*0169 DO i=1,lengthBuff
0170 j = js + i
0171 fld3d_procbuff_r8(j) = fld2d_procbuff_r8(i)
0172 ENDDO
0173 ENDIF
0174 ELSE
ab63ca39fb Gael*0175 # ifdef INCLUDE_WHIO_GLOBUFF_3D
01e0ec14d7 Jean*0176 IF (filePrec .EQ. precFloat32) THEN
0177 DO i=1,lengthBuff
0178 j = js + i
0179 fld3d_globuff_r4(j) = fld2d_globuff_r4(i)
0180 ENDDO
0181 ELSE
0182 DO i=1,lengthBuff
0183 j = js + i
0184 fld3d_globuff_r8(j) = fld2d_globuff_r8(i)
0185 ENDDO
ab63ca39fb Gael*0186 ENDIF
01e0ec14d7 Jean*0187 # endif
0188 ENDIF
9f5240b52a Jean*0189
ab63ca39fb Gael*0190 IF (jWh.EQ.nWh) THEN
9f5240b52a Jean*0191 IF ( .NOT.locSingleCpuIO ) THEN
ab63ca39fb Gael*0192 IF (filePrec .EQ. precFloat32) THEN
0193 WRITE(dUnit,rec=iWh) fld3d_procbuff_r4
0194 ELSE
0195 WRITE(dUnit,rec=iWh) fld3d_procbuff_r8
0196 ENDIF
0197 ELSE
0198 # ifdef INCLUDE_WHIO_GLOBUFF_3D
0199 IF (filePrec .EQ. precFloat32) THEN
0200 WRITE(dUnit,rec=iWh) fld3d_globuff_r4
0201 ELSE
0202 WRITE(dUnit,rec=iWh) fld3d_globuff_r8
0203 ENDIF
0204 # endif
0205 ENDIF
0206 ENDIF
0207
0208 ELSEIF ( iAmDoingIO ) THEN
01e0ec14d7 Jean*0209 #else /* ALLOW_WHIO_3D */
d7fbd5d0c9 Gael*0210 IF ( iAmDoingIO ) THEN
01e0ec14d7 Jean*0211 #endif /* ALLOW_WHIO_3D */
9231496966 Gael*0212 irec2d=i2d+n2d*(irec-1)
9f5240b52a Jean*0213 IF ( .NOT.locSingleCpuIO ) THEN
d7fbd5d0c9 Gael*0214 IF (filePrec .EQ. precFloat32) THEN
0215 WRITE(dUnit,rec=irec2d) fld2d_procbuff_r4
0216 ELSE
0217 WRITE(dUnit,rec=irec2d) fld2d_procbuff_r8
0218 ENDIF
0219 ELSE
ab63ca39fb Gael*0220 # ifndef EXCLUDE_WHIO_GLOBUFF_2D
d7fbd5d0c9 Gael*0221 IF (filePrec .EQ. precFloat32) THEN
0222 WRITE(dUnit,rec=irec2d) fld2d_globuff_r4
0223 ELSE
0224 WRITE(dUnit,rec=irec2d) fld2d_globuff_r8
0225 ENDIF
ab63ca39fb Gael*0226 # endif
d7fbd5d0c9 Gael*0227 ENDIF
0228 ENDIF
0229 _BARRIER
0230
9f5240b52a Jean*0231 ENDDO
f6d7c45cef Jean*0232
9231496966 Gael*0233 IF ( iAmDoingIO.AND.(fid.EQ.0) ) THEN
d7fbd5d0c9 Gael*0234 CLOSE( dUnit )
0235 ENDIF
0236
01e0ec14d7 Jean*0237 #endif /* ALLOW_WHIO */
d7fbd5d0c9 Gael*0238
1d8c557c39 Jean*0239 RETURN
0240 END