*IF DEF,C70_1A,AND,-DEF,SCMA INTFOUT1.2
C ******************************COPYRIGHT****************************** INTFOUT1.3
C (c) CROWN COPYRIGHT 1998, METEOROLOGICAL OFFICE, All Rights Reserved. INTFOUT1.4
C INTFOUT1.5
C Use, duplication or disclosure of this code is subject to the INTFOUT1.6
C restrictions as set forth in the contract. INTFOUT1.7
C INTFOUT1.8
C Meteorological Office INTFOUT1.9
C London Road INTFOUT1.10
C BRACKNELL INTFOUT1.11
C Berkshire UK INTFOUT1.12
C RG12 2SZ INTFOUT1.13
C INTFOUT1.14
C If no contract has been raised with this copy of the code, the use, INTFOUT1.15
C duplication or disclosure of it is strictly prohibited. Permission INTFOUT1.16
C to do so must first be obtained in writing from the Head of Numerical INTFOUT1.17
C Modelling at the above address. INTFOUT1.18
C ******************************COPYRIGHT****************************** INTFOUT1.19
C INTFOUT1.20
CLL Subroutine INTF_OUT ----------------------------------------------- INTFOUT1.21
C INTFOUT1.22
CLL Purpose: To open boundary files INTFOUT1.23
CLL Ocean has 4 on Fortran unit numbers 100-103 INTFOUT1.24
CLL Atmos has 8 on Fortran unit numbers 140-147 INTFOUT1.25
CLL INTFOUT1.26
CLL Model Modification history from model version 4.5 INTFOUT1.27
CLL version Date INTFOUT1.28
CLL 4.5 3/09/98 New deck added M.J.Bell INTFOUT1.29
CLL INTFOUT1.30
CLLEND --------------------------------------------------------------- INTFOUT1.31
subroutine intf_out ( 1,20INTFOUT1.32
*CALL ADUMLEN
INTFOUT1.33
*CALL AINFLEN
INTFOUT1.34
*CALL ARGDUM
INTFOUT1.35
*CALL ARGINF
INTFOUT1.36
*CALL ARGPPX
INTFOUT1.37
& NFTOUT, JINTF, im, mype, INTFOUT1.38
& INTF_PACK, INTFWIDTH, LEN_INTF_P, LEN_INTF_U, INTFOUT1.39
& len_intf_data, item_intf, len_bdy_flds, INTFOUT1.40
& dump_lookup_intf, intf_data, icode, cmessage ) INTFOUT1.41
!--------------------------------------- INTFOUT1.42
INTFOUT1.43
implicit none INTFOUT1.44
INTFOUT1.45
*CALL CDUMLEN
INTFOUT1.46
*CALL CINFLEN
INTFOUT1.47
*CALL TYPDUM
INTFOUT1.48
*CALL TYPINF
INTFOUT1.49
INTFOUT1.50
*CALL CSUBMODL
INTFOUT1.51
*CALL CPPXREF
INTFOUT1.52
*CALL PPXLOOK
INTFOUT1.53
INTFOUT1.54
integer INTFOUT1.55
& NFTOUT, ! unit to write to INTFOUT1.56
& JINTF, ! number of this boundary file INTFOUT1.57
& im, ! internal model identifier INTFOUT1.58
& mype, ! number of "my" processor INTFOUT1.59
& INTF_PACK(N_INTF), ! Packing Indicator for data INTFOUT1.60
* INTFWIDTH(N_INTF), ! Width of interface zone INTFOUT1.61
& LEN_INTF_P(N_INTF), ! Length of interface p field INTFOUT1.62
& LEN_INTF_U(N_INTF), ! Length of interface u field INTFOUT1.63
& len_intf_data, ! length of field of data to output INTFOUT1.64
& item_intf(INTF_LOOKUPS), ! stash item numbers of fields INTFOUT1.65
& len_bdy_flds(INTF_LOOKUPS), ! length of interface fields INTFOUT1.66
& dump_lookup_intf(INTF_LOOKUPS) ! numbers of corresponding INTFOUT1.67
! dump lookup tables INTFOUT1.68
INTFOUT1.69
real intf_data( len_intf_data ) ! boundary data for output INTFOUT1.70
integer icode INTFOUT1.71
character*256 cmessage INTFOUT1.72
INTFOUT1.73
!----------------------------------------------------------- INTFOUT1.74
*CALL CMAXSIZE
INTFOUT1.75
*CALL CMAXSIZO
INTFOUT1.76
*CALL CHSUNITS
INTFOUT1.77
*CALL IHISTO
! for FT_LASTFIELD INTFOUT1.78
*CALL CLFHIST
! for MODEL_FT_UNIT INTFOUT1.79
*CALL CLOOKADD
INTFOUT1.80
*CALL CNTLALL
! for ft_steps and lcal360 INTFOUT1.81
*CALL CNTLGEN
! for STEPS_PER_SEC etc. INTFOUT1.82
*CALL CTIME
! for basis_time_days, STEP_im etc. INTFOUT1.83
*CALL CNTL_IO
! stores um_sector_size INTFOUT1.84
INTFOUT1.85
CL Local variables INTFOUT1.86
INTFOUT1.87
integer INTFOUT1.88
& LEN_PPNAME, ! length of pp file name INTFOUT1.89
& NTIME, ! number of field in output file INTFOUT1.90
& lookup_start,! start location to write lookup table INTFOUT1.91
& LEN_IO, INTFOUT1.92
& disk_address, INTFOUT1.93
* start_addr, INTFOUT1.94
& len_data, ! INTFOUT1.95
& var, ! loop index for variable INTFOUT1.96
& i, ! loop index INTFOUT1.97
& N1, ! local packing index INTFOUT1.98
& disk_length, INTFOUT1.99
& iaddr, INTFOUT1.100
& j, ! loop index INTFOUT1.101
& data_start, ! start location for writing interface data INTFOUT1.102
INTFOUT1.103
& EXPPXI, ! function INTFOUT1.104
& P21BITS ! function INTFOUT1.105
EXTERNAL EXPPXI, P21BITS INTFOUT1.106
INTFOUT1.107
integer SEC,YY,MM,DD,HR,MN,SS,DAY_NO INTFOUT1.108
INTFOUT1.109
real a_io INTFOUT1.110
INTFOUT1.111
LOGICAL LPACK_32B, ! pack as 32 bit numbers INTFOUT1.112
& LPACK_PPXREF ! INTFOUT1.113
INTFOUT1.114
CHARACTER*80 STRING ! work array INTFOUT1.115
CHARACTER*14 PPNAME ! boundary output filename INTFOUT1.116
!------------------------------------------------------------- INTFOUT1.117
INTFOUT1.118
CL 0. Miscellaneous Preliminaries INTFOUT1.119
INTFOUT1.120
LPACK_32B = INTF_PACK(JINTF).EQ.1 INTFOUT1.121
LPACK_PPXREF = INTF_PACK(JINTF).EQ.2 INTFOUT1.122
INTFOUT1.123
CL 1.0 Open file; determine where to write new data INTFOUT1.124
INTFOUT1.125
CL Open boundary output file if reinitialised during run INTFOUT1.126
INTFOUT1.127
IF (FT_STEPS(NFTOUT).GT.0) THEN INTFOUT1.128
STRING = MODEL_FT_UNIT(NFTOUT) INTFOUT1.129
PPNAME = STRING(18:31) INTFOUT1.130
LEN_PPNAME = LEN(PPNAME) INTFOUT1.131
CALL FILE_OPEN
(NFTOUT,PPNAME,LEN_PPNAME,1,1,ICODE) INTFOUT1.132
IF (ICODE.NE.0) THEN INTFOUT1.133
CMESSAGE="INTF_OUT: Error opening preassigned boundary file" INTFOUT1.134
GO TO 999 ! Return INTFOUT1.135
ENDIF INTFOUT1.136
ENDIF INTFOUT1.137
INTFOUT1.138
C Determine position where to Buffer out data to INTFOUT1.139
NTIME=FT_LASTFIELD(NFTOUT)+1 INTFOUT1.140
INTFOUT1.141
CL 2. Set up headers INTFOUT1.142
INTFOUT1.143
CL 2.1 Fixed length header INTFOUT1.144
FIXHD_INTF(152,JINTF) = INTF_LOOKUPS*NTIME INTFOUT1.145
FIXHD_INTF(161,JINTF) = LEN_INTF_DATA*NTIME INTFOUT1.146
INTFOUT1.147
CL 2.2 Integer Constants INTFOUT1.148
INTHD_INTF(3,JINTF) = NTIME INTFOUT1.149
INTFOUT1.150
CL 2.3 LOOKUP Table INTFOUT1.151
INTFOUT1.152
C 2.3.1 Determine position in LOOKUP table INTFOUT1.153
LOOKUP_START=FIXHD_INTF(150,JINTF) + INTFOUT1.154
& FIXHD_INTF(151,JINTF)*INTF_LOOKUPS*(NTIME-1) - 1 INTFOUT1.155
INTFOUT1.156
C 2.3.2 For well-formed I/O re-read the last lookup INTFOUT1.157
C table on disk to find disk_address INTFOUT1.158
C also set initial start address INTFOUT1.159
INTFOUT1.160
if(ntime.ne.1) then INTFOUT1.161
call setpos
(nftout, lookup_start-len1_lookup, icode) INTFOUT1.162
call buffin
(nftout, lookup_intf(1, 1, jintf), len1_lookup, INTFOUT1.163
& len_io, a_io) INTFOUT1.164
INTFOUT1.165
c--check for errors INTFOUT1.166
if(a_io.ne.-1.0 .or. len_io.ne.len1_lookup) then INTFOUT1.167
call ioerror
('intf_out: Buffer in of Last Lookup Header', INTFOUT1.168
& a_io, len_io, len1_lookup) INTFOUT1.169
cmessage=' intf_out: I/O Error on reading last lookup' INTFOUT1.170
icode=5 INTFOUT1.171
goto 999 INTFOUT1.172
endif INTFOUT1.173
INTFOUT1.174
c--compute the new disk address from the last address and length INTFOUT1.175
disk_address=lookup_intf(lbegin, 1, jintf)+ INTFOUT1.176
& lookup_intf(lbnrec, 1, jintf) INTFOUT1.177
INTFOUT1.178
else ! ntime INTFOUT1.179
INTFOUT1.180
disk_address=fixhd_intf(160, jintf)-1 INTFOUT1.181
endif ! ntime INTFOUT1.182
INTFOUT1.183
c--round this disk address to ensure we start on a sector boundary INTFOUT1.184
disk_address=((disk_address+um_sector_size-1)/ INTFOUT1.185
& um_sector_size)*um_sector_size INTFOUT1.186
INTFOUT1.187
C - start address (not used by well formed I/O ?) INTFOUT1.188
START_ADDR = FIXHD_INTF(161,JINTF)-LEN_INTF_DATA+1 INTFOUT1.189
INTFOUT1.190
C 2.3.3 Check that there is enough space for this entry in LOOKUP table INTFOUT1.191
INTFOUT1.192
IF (FIXHD_INTF(150,JINTF)+ INTFOUT1.193
& FIXHD_INTF(151,JINTF)*FIXHD_INTF(152,JINTF).GT. INTFOUT1.194
& FIXHD_INTF(160,JINTF)) THEN INTFOUT1.195
CMESSAGE=' INTF_OUT: Insufficient space for headers in boundary INTFOUT1.196
& dataset.' INTFOUT1.197
ICODE=1 INTFOUT1.198
GO TO 999 ! Return INTFOUT1.199
ENDIF INTFOUT1.200
INTFOUT1.201
C 2.3.5 Set validity times INTFOUT1.202
INTFOUT1.203
SEC = STEPim(im) * SECS_PER_PERIODim(im) / INTFOUT1.204
& STEPS_PER_PERIODim(im) INTFOUT1.205
INTFOUT1.206
CALL SEC2TIME
(0,SEC,BASIS_TIME_DAYS,BASIS_TIME_SECS, INTFOUT1.207
& YY,MM,DD,HR,MN,SS,DAY_NO,LCAL360) INTFOUT1.208
INTFOUT1.209
DO VAR = 1, INTF_LOOKUPS INTFOUT1.210
INTFOUT1.211
C 2.3.6 Initialise lookup tables (with values from dump lookup tables) INTFOUT1.212
INTFOUT1.213
DO I=1,LEN1_LOOKUP INTFOUT1.214
LOOKUP_INTF(I,VAR,JINTF)=LOOKUP(I,dump_lookup_intf(var)) INTFOUT1.215
ENDDO INTFOUT1.216
INTFOUT1.217
C 2.3.7 Set times in lookup tables INTFOUT1.218
INTFOUT1.219
LOOKUP_INTF(LBYR ,VAR,JINTF) = YY INTFOUT1.220
LOOKUP_INTF(LBMON,VAR,JINTF) = MM INTFOUT1.221
LOOKUP_INTF(LBDAT,VAR,JINTF) = DD INTFOUT1.222
LOOKUP_INTF(LBHR ,VAR,JINTF) = HR INTFOUT1.223
LOOKUP_INTF(LBMIN,VAR,JINTF) = MN INTFOUT1.224
LOOKUP_INTF(LBDAY,VAR,JINTF) = DAY_NO INTFOUT1.225
INTFOUT1.226
LOOKUP_INTF(LBYRD ,VAR,JINTF) = FIXHD(21) INTFOUT1.227
LOOKUP_INTF(LBMOND,VAR,JINTF) = FIXHD(22) INTFOUT1.228
LOOKUP_INTF(LBDATD,VAR,JINTF) = FIXHD(23) INTFOUT1.229
LOOKUP_INTF(LBHRD ,VAR,JINTF) = FIXHD(24) INTFOUT1.230
LOOKUP_INTF(LBMIND,VAR,JINTF) = FIXHD(25) INTFOUT1.231
LOOKUP_INTF(LBDAYD,VAR,JINTF) = FIXHD(27) INTFOUT1.232
INTFOUT1.233
C 2.3.8 Set the length of the field in LOOKUP table INTFOUT1.234
C (simpler than in original atmosphere code) !! CHECK THIS !! INTFOUT1.235
INTFOUT1.236
LOOKUP_INTF(LBLREC,VAR,JINTF) = len_bdy_flds(var) INTFOUT1.237
INTFOUT1.238
C 2.3.9 Set packing info INTFOUT1.239
N1 = 0 ! Data not packed INTFOUT1.240
IF (LPACK_32B) N1 = 2 ! Data packed as 32 bits INTFOUT1.241
IF (LPACK_PPXREF) THEN INTFOUT1.242
N1 = EXPPXI
(im,0,item_intf,ppx_dump_packing, INTFOUT1.243
*CALL ARGPPX
INTFOUT1.244
& icode,cmessage) INTFOUT1.245
if (icode .gt. 0) then INTFOUT1.246
write(6,*) 'exppxi failed in intf_out' INTFOUT1.247
go to 999 INTFOUT1.248
end if INTFOUT1.249
END IF INTFOUT1.250
LOOKUP_INTF(LBPACK,VAR,JINTF)= N1 INTFOUT1.251
INTFOUT1.252
C 2.3.10 Store the disk address; and calculate for next field INTFOUT1.253
lookup_intf(lbegin, var, jintf)=disk_address INTFOUT1.254
INTFOUT1.255
c--fetch the data field length, allowing for packing INTFOUT1.256
if(mod(lookup_intf(lbpack, var, jintf), 10).eq.2) then INTFOUT1.257
disk_length=(lookup_intf(lblrec, var, jintf)+1)/2 INTFOUT1.258
else INTFOUT1.259
disk_length=lookup_intf(lblrec, var, jintf) INTFOUT1.260
endif INTFOUT1.261
INTFOUT1.262
c--store the rounded-up length INTFOUT1.263
C NB !! This length is not checked to fit sectors !! INTFOUT1.264
lookup_intf(lbnrec, var, jintf)=disk_length INTFOUT1.265
INTFOUT1.266
c--update the disk address INTFOUT1.267
disk_address=disk_address+disk_length INTFOUT1.268
INTFOUT1.269
C 2.3.11 Set other elements in the lookup table INTFOUT1.270
INTFOUT1.271
C grid code ; should be 1 for all variables (correction at 4.4) INTFOUT1.272
C !!! ideally should be 101 for rotated grid INTFOUT1.273
LOOKUP_INTF(LBCODE,VAR,JINTF)=1 INTFOUT1.274
INTFOUT1.275
LOOKUP_INTF(LBHEM,VAR,JINTF)=99 INTFOUT1.276
LOOKUP_INTF(LBROW,VAR,JINTF)=INTFWIDTH(JINTF) INTFOUT1.277
INTFOUT1.278
C numbers of rows & columns; var=2 or 3 is not suitable for ocean INTFOUT1.279
LOOKUP_INTF(LBNPT,VAR,JINTF) = INTFOUT1.280
& LEN_INTF_P(JINTF)/INTFWIDTH(JINTF) INTFOUT1.281
IF ( ( IM .EQ. 1. .AND. (VAR.EQ.2.OR.VAR.EQ.3) ) INTFOUT1.282
& .OR. ( IM .EQ. 2. .AND. (VAR.EQ.3.OR.VAR.EQ.4) ) ) THEN INTFOUT1.283
LOOKUP_INTF(LBNPT,VAR,JINTF) = INTFOUT1.284
& LEN_INTF_U(JINTF)/INTFWIDTH(JINTF) INTFOUT1.285
END IF INTFOUT1.286
INTFOUT1.287
LOOKUP_INTF(LBLEV,VAR,JINTF)=-1 INTFOUT1.288
LOOKUP_INTF(NADDR,VAR,JINTF) = START_ADDR INTFOUT1.289
START_ADDR = START_ADDR + LOOKUP_INTF(LBLREC,VAR,JINTF) INTFOUT1.290
INTFOUT1.291
END DO ! VAR INTFOUT1.292
INTFOUT1.293
CL 3. Pack data as required INTFOUT1.294
INTFOUT1.295
IADDR = 1 INTFOUT1.296
LEN_DATA = 0 INTFOUT1.297
INTFOUT1.298
DO VAR = 1,INTF_LOOKUPS INTFOUT1.299
IF (MOD(LOOKUP_INTF(LBPACK,VAR,JINTF),10).EQ.2) THEN INTFOUT1.300
CL 3.1 Pack this data field INTFOUT1.301
INTFOUT1.302
*IF DEF,MPP INTFOUT1.303
IF (mype .EQ. 0) THEN INTFOUT1.304
*ENDIF INTFOUT1.305
CALL PACK21
(LOOKUP_INTF(LBLREC,VAR,JINTF), INTFOUT1.306
& INTF_DATA(IADDR),INTF_DATA(LEN_DATA+1), INTFOUT1.307
& P21BITS
(FIXHD_INTF(12,JINTF))) INTFOUT1.308
*IF DEF,MPP INTFOUT1.309
ENDIF INTFOUT1.310
*ENDIF INTFOUT1.311
INTFOUT1.312
c--the (+1) in the expression below is unnecessary, since INTFOUT1.313
c LBC data is composed of two rows NS and two rows EW, and INTFOUT1.314
c thus always has an even number of data points. If this INTFOUT1.315
c is not true, then READFLDS will either get the data one INTFOUT1.316
c out downwards if the (+1) is omitted, or one word upwards INTFOUT1.317
c if the (+1) is added. In other words, the packing will INTFOUT1.318
c cause either one word to be omitted or one word added in INTFOUT1.319
c the data after the read. This is because READFLDS reads INTFOUT1.320
c and converts the whole LBC record at one go, rather than INTFOUT1.321
c as a series of separate records. INTFOUT1.322
LEN_DATA = LEN_DATA+(LOOKUP_INTF(LBLREC,VAR,JINTF)+1)/2 INTFOUT1.323
INTFOUT1.324
c--check that we are not packing an odd nuber of words INTFOUT1.325
if((lookup_intf(lblrec,var,jintf)/2)*2 .ne. INTFOUT1.326
& lookup_intf(lblrec,var,jintf)) then INTFOUT1.327
write(6,7734) lookup_intf(lblrec,var,jintf) INTFOUT1.328
7734 format(/'LBC Data contains ',i10,' Words, which is', INTFOUT1.329
& ' an Odd Number which is not allowed for 32-bit', INTFOUT1.330
& ' Packing') INTFOUT1.331
*IF DEF,T3E,AND,DEF,MPP INTFOUT1.332
if(mype.eq.0) then INTFOUT1.333
write(6,7734) lookup_intf(lblrec,var,jintf) INTFOUT1.334
endif INTFOUT1.335
*ENDIF INTFOUT1.336
endif INTFOUT1.337
INTFOUT1.338
ELSE ! LOOKUP_INTF(LBPACK.. INTFOUT1.339
INTFOUT1.340
CL 3.2 Copy unpacked data to new location if necessary INTFOUT1.341
IF (LEN_DATA+1.LT.IADDR) THEN INTFOUT1.342
*IF DEF,MPP INTFOUT1.343
IF (mype .EQ. 0) THEN INTFOUT1.344
*ENDIF INTFOUT1.345
DO J = 1,LOOKUP_INTF(LBLREC,VAR,JINTF) INTFOUT1.346
INTF_DATA(LEN_DATA+J) = INTF_DATA(IADDR+J-1) INTFOUT1.347
ENDDO INTFOUT1.348
*IF DEF,MPP INTFOUT1.349
ENDIF INTFOUT1.350
*ENDIF INTFOUT1.351
ENDIF INTFOUT1.352
LEN_DATA = LEN_DATA+LOOKUP_INTF(LBLREC,VAR,JINTF) INTFOUT1.353
INTFOUT1.354
ENDIF INTFOUT1.355
INTFOUT1.356
IADDR = IADDR+LOOKUP_INTF(LBLREC,VAR,JINTF) INTFOUT1.357
ENDDO ! VAR INTFOUT1.358
INTFOUT1.359
CL 4.0 Write out headers/data INTFOUT1.360
INTFOUT1.361
CL 4.1 Fixed length header INTFOUT1.362
INTFOUT1.363
IADDR = 0 INTFOUT1.364
CALL SETPOS
(NFTOUT,IADDR,ICODE) INTFOUT1.365
CALL BUFFOUT
(NFTOUT,FIXHD_INTF(1,JINTF),LEN_FIXHD,LEN_IO,A_IO) INTFOUT1.366
INTFOUT1.367
C Check for I/O Errors INTFOUT1.368
INTFOUT1.369
IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN_FIXHD) THEN INTFOUT1.370
CALL IOERROR
('buffer out of fixed length header',A_IO,LEN_IO, INTFOUT1.371
& LEN_FIXHD) INTFOUT1.372
CMESSAGE=' intf_out: I/O ERROR ' INTFOUT1.373
ICODE=2 INTFOUT1.374
GO TO 999 ! Return INTFOUT1.375
END IF INTFOUT1.376
INTFOUT1.377
CL 4.2 Integer constants INTFOUT1.378
INTFOUT1.379
CALL BUFFOUT
(NFTOUT,INTHD_INTF(1,JINTF), INTFOUT1.380
& PP_LEN_INTHD,LEN_IO,A_IO) INTFOUT1.381
INTFOUT1.382
C Check for I/O Errors INTFOUT1.383
INTFOUT1.384
IF(A_IO.NE.-1.0.OR.LEN_IO.NE.PP_LEN_INTHD) THEN INTFOUT1.385
CALL IOERROR
('buffer out of integer header',A_IO,LEN_IO, INTFOUT1.386
& PP_LEN_INTHD) INTFOUT1.387
CMESSAGE=' intf_out: I/O ERROR ' INTFOUT1.388
ICODE=3 INTFOUT1.389
GO TO 999 ! Return INTFOUT1.390
END IF INTFOUT1.391
INTFOUT1.392
CL 4.3 PP headers in LOOKUP table INTFOUT1.393
CALL SETPOS
(NFTOUT,LOOKUP_START,ICODE) INTFOUT1.394
CALL BUFFOUT
(NFTOUT,LOOKUP_INTF(1,1,JINTF), INTFOUT1.395
& LEN1_LOOKUP*INTF_LOOKUPS,LEN_IO,A_IO) INTFOUT1.396
INTFOUT1.397
C Check for I/O Errors INTFOUT1.398
INTFOUT1.399
IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN1_LOOKUP*INTF_LOOKUPS) THEN INTFOUT1.400
CALL IOERROR
('buffer out of PP header',A_IO,LEN_IO, INTFOUT1.401
& LEN1_LOOKUP*INTF_LOOKUPS) INTFOUT1.402
CMESSAGE=' intf_out: I/O ERROR ' INTFOUT1.403
ICODE=4 INTFOUT1.404
GO TO 999 ! Return INTFOUT1.405
END IF INTFOUT1.406
INTFOUT1.407
CL 4.4 Interface data INTFOUT1.408
C Determine position in data section INTFOUT1.409
INTFOUT1.410
DATA_START = INTFOUT1.411
& lookup_intf(lbegin, 1, jintf) INTFOUT1.412
c--round this disk length to a multiple of the sector size INTFOUT1.413
len_data=((len_data+um_sector_size-1)/ INTFOUT1.414
& um_sector_size)*um_sector_size INTFOUT1.415
CALL SETPOS
(NFTOUT,DATA_START,ICODE) INTFOUT1.416
CALL BUFFOUT
(NFTOUT,INTF_DATA(1),LEN_DATA,LEN_IO,A_IO) INTFOUT1.417
INTFOUT1.418
C Check for I/O Errors INTFOUT1.419
INTFOUT1.420
IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN_DATA) THEN INTFOUT1.421
CALL IOERROR
('buffer out of boundary data',A_IO,LEN_IO, INTFOUT1.422
& LEN_DATA) INTFOUT1.423
CMESSAGE=' intf_out: I/O ERROR ' INTFOUT1.424
ICODE=51 INTFOUT1.425
GO TO 999 ! Return INTFOUT1.426
END IF INTFOUT1.427
INTFOUT1.428
INTFOUT1.429
CL 5. Close boundary output file if reinitialised during run INTFOUT1.430
IF (FT_STEPS(NFTOUT).GT.0) THEN INTFOUT1.431
LEN_PPNAME=LEN(PPNAME) INTFOUT1.432
CALL FILE_CLOSE
(NFTOUT,PPNAME,LEN_PPNAME,1,0,ICODE) INTFOUT1.433
END IF INTFOUT1.434
INTFOUT1.435
CL 6. Update FT_LASTFIELD INTFOUT1.436
FT_LASTFIELD(NFTOUT) = FT_LASTFIELD(NFTOUT) + 1 INTFOUT1.437
INTFOUT1.438
999 RETURN INTFOUT1.439
END INTFOUT1.440
*ENDIF INTFOUT1.441