*IF DEF,C80_1A,AND,-DEF,SCMA AJC0F405.275
C ******************************COPYRIGHT****************************** GTS2F400.12061
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.12062
C GTS2F400.12063
C Use, duplication or disclosure of this code is subject to the GTS2F400.12064
C restrictions as set forth in the contract. GTS2F400.12065
C GTS2F400.12066
C Meteorological Office GTS2F400.12067
C London Road GTS2F400.12068
C BRACKNELL GTS2F400.12069
C Berkshire UK GTS2F400.12070
C RG12 2SZ GTS2F400.12071
C GTS2F400.12072
C If no contract has been raised with this copy of the code, the use, GTS2F400.12073
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.12074
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.12075
C Modelling at the above address. GTS2F400.12076
C ******************************COPYRIGHT****************************** GTS2F400.12077
C GTS2F400.12078
CLL SUBROUTINE WRITDUMP--------------------------------------- WRITDM1A.3
CLL WRITDM1A.4
CLL AD, TJ <- programmer of some or all of previous code or changes WRITDM1A.5
CLL WRITDM1A.6
CLL Model Modification history from model version 3.0: WRITDM1A.7
CLL version Date WRITDM1A.8
CLL 3.1 19/02/93 Use FIXHD(12) not FIXHD(1) as Version no in P21BITS TJ190293.10
CLL 3.2 13/07/93 Changed CHARACTER*(*) to CHARACTER*(80) for TS150793.210
CLL portability. Author Tracey Smith. TS150793.211
CLL 3.2 24/07/93 CHECK ON THE ERROR STATUS FROM BUFFOUT MC240793.1
CLL 3.2 25/05/93 Skip DIAG81 diagnostics for obs files. D. Robinson DR260593.140
CLL 3.3 08/04/94 Check that BUFLEN is long enough TJ300394.106
CLL 3.3 22/11/93 Prevent dynamic allocation of zero dimension for DR221193.219
CLL BUF. (Possible for obs files) Call PR_LFLD to print DR221193.220
CLL logical fields. D Robinson. DR221193.221
CLL 3.5 28/03/95 MPP code : New code for parallel I/O GPB0F305.384
CLL P.Burton GPB0F305.385
!LL 4.1 22/05/96 Fixes to MPP code P.Burton GPB0F401.749
! 4.1 18/06/96 Changes to cope with changes in STASH addressing GDG0F401.1595
! Author D.M. Goddard. GDG0F401.1596
!LL 4.3 17/03/97 Changed name to UM_WRITDUMP and added GPB4F403.751
!LL D1_ADDRESSING arguments, which are passed GPB4F403.752
!LL to write_multi. P.Burton GPB4F403.753
! 4.4 23/07/97 Correct change_decomp error message P.Burton GPB1F404.104
! 4.4 25/04/97 Changes to write well-formed records if the GBC5F404.445
! input dumpfile is in that format (almost PP file GBC5F404.446
! format) GBC5F404.447
! Author: Bob Carruthers, Cray Research GBC5F404.448
! 4.5 5/11/98 Removed check that field size is less than GPB2F405.323
! MaxFieldSize as the arrays are now dynamically GPB2F405.324
! allocated to the required size. P.Burton GPB2F405.325
! 4.5 28/10/98 Introduce Single Column Model. J-C Thil. AJC0F405.276
CLL WRITDM1A.10
CLL Programming standard: Unified Model Documentation Paper No 3 WRITDM1A.11
CLL Version No 1 15/1/90 WRITDM1A.12
CLL WRITDM1A.13
CLL Logical component: R30 WRITDM1A.14
CLL WRITDM1A.15
CLL Project task: F3 WRITDM1A.16
CLL WRITDM1A.17
CLL Purpose: Writes out model dump on unit NFTOUT and checks model WRITDM1A.18
CLL and dump dimensions for consistency. WRITDM1A.19
CLL WRITDM1A.20
CLL Documentation: Unified Model Documentation Paper No F3 WRITDM1A.21
CLL Version No 5 9/2/90 WRITDM1A.22
CLLEND--------------------------------------------------------- WRITDM1A.23
C WRITDM1A.24
C*L Arguments:------------------------------------------------- WRITDM1A.25
SUBROUTINE UM_WRITDUMP(NFTOUT,FIXHD,LEN_FIXHD, 4,21GPB4F403.754
& INTHD,LEN_INTHD, GDG0F401.1598
& REALHD,LEN_REALHD, GDG0F401.1599
& LEVDEPC,LEN1_LEVDEPC,LEN2_LEVDEPC, GDG0F401.1600
& ROWDEPC,LEN1_ROWDEPC,LEN2_ROWDEPC, GDG0F401.1601
& COLDEPC,LEN1_COLDEPC,LEN2_COLDEPC, GDG0F401.1602
& FLDDEPC,LEN1_FLDDEPC,LEN2_FLDDEPC, GDG0F401.1603
& EXTCNST,LEN_EXTCNST, GDG0F401.1604
& DUMPHIST,LEN_DUMPHIST, GDG0F401.1605
& CFI1,LEN_CFI1, GDG0F401.1606
& CFI2,LEN_CFI2, GDG0F401.1607
& CFI3,LEN_CFI3, GDG0F401.1608
& LOOKUP,LEN1_LOOKUP,LEN2_LOOKUP, GSM1F403.252
*IF DEF,MPP GSM1F403.253
& MPP_LOOKUP,MPP_LEN1_LOOKUP, GSM1F403.254
*ENDIF GSM1F403.255
& BUFLEN, GSM1F403.256
& SUBMODEL_ID, GPB4F403.755
& N_OBJS_D1,D1_ADDR, GPB4F403.756
& LEN_DATA,D1, GDG0F401.1610
*CALL ARGPPX
GDG0F401.1611
& ICODE,CMESSAGE) GDG0F401.1612
WRITDM1A.40
IMPLICIT NONE WRITDM1A.41
WRITDM1A.42
INTEGER WRITDM1A.43
* NFTOUT !IN Unit no of dump WRITDM1A.44
*,LEN_FIXHD !IN Length of fixed length header WRITDM1A.45
*,LEN_INTHD !IN Length of integer header WRITDM1A.46
*,LEN_REALHD !IN Length of real header WRITDM1A.47
*,LEN1_LEVDEPC !IN 1st dim of level dep consts WRITDM1A.48
*,LEN2_LEVDEPC !IN 2ndt dim of level dep consts WRITDM1A.49
*,LEN1_ROWDEPC !IN 1st dim of row dep consts WRITDM1A.50
*,LEN2_ROWDEPC !IN 2nd dim of row dep consts WRITDM1A.51
&,LEN1_COLDEPC !IN 1st dim of column dep consts WRITDM1A.52
&,LEN2_COLDEPC !IN 2nd dim of column dep consts WRITDM1A.53
&,LEN1_FLDDEPC !IN 1st dim of field dep consts WRITDM1A.54
&,LEN2_FLDDEPC !IN 2nd dim of field dep consts WRITDM1A.55
&,LEN_EXTCNST !IN Length of extra constants WRITDM1A.56
&,LEN_DUMPHIST !IN Length of history block WRITDM1A.57
&,LEN_CFI1 !IN Length of comp field index 1 WRITDM1A.58
&,LEN_CFI2 !IN Length of comp field index 2 WRITDM1A.59
&,LEN_CFI3 !IN Length of comp field index 3 WRITDM1A.60
&,LEN1_LOOKUP !IN 1st dim of lookup WRITDM1A.61
&,LEN2_LOOKUP !IN 2nd dim of lookup WRITDM1A.62
*IF DEF,MPP GSM1F403.257
&,MPP_LEN1_LOOKUP !IN 1st dim of MPP lookup GSM1F403.258
*ENDIF GSM1F403.259
WRITDM1A.63
&,SUBMODEL_ID !IN submodel of dump GPB4F403.757
&,N_OBJS_D1 !IN number of objects (3D fields) in D1 GPB4F403.758
GPB4F403.759
! Parameters required for dimensioning the D1_ADDR array GPB4F403.760
*CALL D1_ADDR
GPB4F403.761
GPB4F403.762
INTEGER GPB4F403.763
& D1_ADDR(D1_LIST_LEN,N_OBJS_D1) ! IN D1 addressing info GPB4F403.764
INTEGER WRITDM1A.64
* BUFLEN !IN Maximum length of single field in dump WRITDM1A.65
*,LEN_DATA !IN Length of real data WRITDM1A.66
*,ICODE !OUT Return code; successful=0 WRITDM1A.67
* ! error > 0 WRITDM1A.68
WRITDM1A.69
CHARACTER*(80) TS150793.212
* CMESSAGE !OUT Error message if ICODE > 0 WRITDM1A.71
WRITDM1A.72
INTEGER WRITDM1A.73
* FIXHD(LEN_FIXHD) !IN Fixed length header WRITDM1A.74
*,INTHD(LEN_INTHD) !IN Integer header WRITDM1A.75
*,LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP) !IN PP lookup tables WRITDM1A.76
*IF DEF,MPP GSM1F403.260
C Local addressing of D1 GSM1F403.261
*,MPP_LOOKUP(MPP_LEN1_LOOKUP,LEN2_LOOKUP) ! OUT GSM1F403.262
*ENDIF GSM1F403.263
*,CFI1(LEN_CFI1+1) !IN Compressed field index no 1 WRITDM1A.77
*,CFI2(LEN_CFI2+1) !IN Compressed field index no 2 WRITDM1A.78
*,CFI3(LEN_CFI3+1) !IN Compressed field index no 3 WRITDM1A.79
WRITDM1A.80
REAL WRITDM1A.81
& REALHD(LEN_REALHD) !IN Real header WRITDM1A.82
&,LEVDEPC(1+LEN1_LEVDEPC*LEN2_LEVDEPC) !IN Lev dep consts WRITDM1A.83
&,ROWDEPC(1+LEN1_ROWDEPC*LEN2_ROWDEPC) !IN Row dep consts WRITDM1A.84
&,COLDEPC(1+LEN1_COLDEPC*LEN2_COLDEPC) !IN Col dep consts WRITDM1A.85
&,FLDDEPC(1+LEN1_FLDDEPC*LEN2_FLDDEPC) !IN Field dep consts WRITDM1A.86
&,EXTCNST(LEN_EXTCNST+1) !IN Extra constants WRITDM1A.87
&,DUMPHIST(LEN_DUMPHIST+1) !IN History block WRITDM1A.88
*,D1(LEN_DATA) !IN Real equivalence of data block WRITDM1A.89
WRITDM1A.90
*CALL CSUBMODL
GDG0F401.1613
*CALL C_MDI
GBC5F404.449
*CALL AMAXSIZE
GBC5F404.450
*CALL CNTL_IO
GBC5F404.451
*CALL CPPXREF
GDG0F401.1614
*CALL PPXLOOK
GDG0F401.1615
*CALL CLOOKADD
WRITDM1A.91
*IF DEF,MPP GPB0F305.386
*CALL DECOMPTP
GPB4F403.765
*CALL PARVARS
GPB0F305.387
*ENDIF GPB0F305.388
WRITDM1A.92
C ------------------------------------------------------------- WRITDM1A.93
C Local arrays:------------------------------------------------ WRITDM1A.94
real buf(((buflen+um_sector_size)/um_sector_size)*um_sector_size) GBC5F404.452
cdir$ cache_align buf GBC5F404.453
C ------------------------------------------------------------- WRITDM1A.96
C*L External subroutines called:------------------------------- WRITDM1A.97
EXTERNAL IOERROR,POSERROR,WRITHEAD,PR_LOOK,PR_IFLD,PR_RFLD WRITDM1A.98
*,PACK21,EXPAND21,BUFFOUT,P21BITS,PR_LFLD DR221193.223
INTEGER P21BITS WRITDM1A.100
C Cray specific functions UNIT,LENGTH WRITDM1A.101
C*------------------------------------------------------------- WRITDM1A.102
C Local variables:--------------------------------------------- WRITDM1A.103
INTEGER START_BLOCK ! Pointer to current position in file WRITDM1A.104
*,LEN_IO ! No of 64-bit words buffered in WRITDM1A.105
*,K,I ! Loop counts WRITDM1A.106
*,IPTS ! No of 64-bit words requested to be WRITDM1A.107
* ! buffered in WRITDM1A.108
*IF DEF,MPP GPB0F305.389
&, orig_decomp ! original decomposition type GPB4F403.766
&, local_len ! length of local field from buffout GPB0F305.390
&, address ! address of field in local D1 array GPB0F305.391
*ENDIF GPB0F305.392
&, word_address ! disk address of the record GBC5F404.454
&, real_start_block ! real start address and number of words moved GBC5F404.455
&, l_ipts ! record length during index search GBC5F404.456
&, um_sector_ipts ! number fo words to write, rounded up GBC5F404.457
&, ipts_write ! number of words actually write from disk GBC5F404.458
&, disk_address ! Current rounded disk address GBC5F404.459
&, number_of_data_words_on_disk ! Number of data words on disk GBC5F404.460
&, number_of_data_words_in_memory ! Number of Data Words in memory GBC5F404.461
INTEGER GPB4F403.767
& object_index, ! pointer to entry in D1_ADDR GPB4F403.768
& level ! level number of multi-level field GPB4F403.769
REAL A ! Error code returned by UNIT WRITDM1A.109
C-------------------------------------------------------------- WRITDM1A.110
WRITDM1A.111
*IF DEF,MPP GPB0F305.393
IF (mype .EQ. 0) THEN GPB0F305.394
*ENDIF GPB0F305.395
WRITE(6,'(/,'' WRITING UNIFIED MODEL DUMP ON UNIT'',I3)')NFTOUT WRITDM1A.112
WRITE(6,'('' #####################################'',/)') WRITDM1A.113
*IF DEF,MPP GPB0F305.396
ENDIF GPB0F305.397
*ENDIF GPB0F305.398
ICODE=0 WRITDM1A.114
CMESSAGE=' ' WRITDM1A.115
*IF DEF,MPP GPB4F403.770
! Select the relevant decomposition type for this dump GPB4F403.771
GPB4F403.772
orig_decomp=current_decomp_type GPB4F403.773
GPB4F403.774
IF (SUBMODEL_ID .EQ. A_IM) THEN GPB4F403.775
IF (current_decomp_type .NE. decomp_standard_atmos) GPB4F403.776
& CALL CHANGE_DECOMPOSITION
(decomp_standard_atmos,ICODE) GPB4F403.777
GPB4F403.778
ELSEIF (SUBMODEL_ID .EQ. O_IM) THEN GPB4F403.779
IF (current_decomp_type .NE. decomp_standard_ocean) GPB4F403.780
& CALL CHANGE_DECOMPOSITION
(decomp_standard_ocean,ICODE) GPB4F403.781
GPB4F403.782
ELSE ! unsupported decomposition type GPB4F403.783
WRITE(6,*) 'WRITEDUMP : Error - Only atmosphere and ocean ', GPB1F404.105
& 'submodels are currently supported for MPP code.' GPB4F403.785
ICODE=1 GPB4F403.786
CMESSAGE='Unsupported submodel for MPP code' GPB4F403.787
RETURN GPB4F403.788
ENDIF GPB4F403.789
GPB4F403.790
IF (ICODE .NE. 0) THEN GPB4F403.791
WRITE(6,*) 'READDUMP : Error - Could not set decomposition ', GPB4F403.792
& 'for selected submodel.' GPB4F403.793
CMESSAGE='Unsupported decomposition selected for MPP code' GPB4F403.794
RETURN GPB4F403.795
ENDIF GPB4F403.796
*ENDIF GPB4F403.797
WRITDM1A.116
c--reset the disk addresses and lengths for well-formed I/O GBC5F404.462
call set_dumpfile_address
(fixhd, len_fixhd, GBC5F404.463
& lookup, len1_lookup, GBC5F404.464
& len2_lookup, GBC5F404.465
& number_of_data_words_in_memory, GBC5F404.466
& number_of_data_words_on_disk, GBC5F404.467
& disk_address) GBC5F404.468
CL 1. Read in all header records and check for consistency WRITDM1A.117
C START_BLOCK points to position of model data block WRITDM1A.118
C on return WRITDM1A.119
WRITDM1A.120
CALL WRITHEAD
(NFTOUT,FIXHD,LEN_FIXHD, GDG0F401.1616
& INTHD,LEN_INTHD, GDG0F401.1617
& REALHD,LEN_REALHD, GDG0F401.1618
& LEVDEPC,LEN1_LEVDEPC,LEN2_LEVDEPC, GDG0F401.1619
& ROWDEPC,LEN1_ROWDEPC,LEN2_ROWDEPC, GDG0F401.1620
& COLDEPC,LEN1_COLDEPC,LEN2_COLDEPC, GDG0F401.1621
& FLDDEPC,LEN1_FLDDEPC,LEN2_FLDDEPC, GDG0F401.1622
& EXTCNST,LEN_EXTCNST, GDG0F401.1623
& DUMPHIST,LEN_DUMPHIST, GDG0F401.1624
& CFI1,LEN_CFI1, GDG0F401.1625
& CFI2,LEN_CFI2, GDG0F401.1626
& CFI3,LEN_CFI3, GDG0F401.1627
& LOOKUP,LEN1_LOOKUP,LEN2_LOOKUP,LEN_DATA, GDG0F401.1628
*CALL ARGPPX
GDG0F401.1629
& START_BLOCK,ICODE,CMESSAGE) GDG0F401.1630
WRITDM1A.136
IF(ICODE.GT.0)RETURN WRITDM1A.137
WRITDM1A.138
CL 2. Buffer in model data one field at a time for WRITDM1A.139
CL conversion from 64-bit to 32-bit numbers WRITDM1A.140
WRITDM1A.141
IF(FIXHD(160).GT.0)THEN WRITDM1A.142
WRITDM1A.143
C Check for error in file pointers WRITDM1A.144
real_start_block=start_block GBC5F404.469
if(start_block.ne.fixhd(160)) then GBC5F404.470
C If new format Dumpfile, we must reset the start address GBC5F404.471
if((lookup(lbnrec,1).eq.0) .or. GBC5F404.472
2 ((lookup(lbnrec,1).eq.imdi) .and. (fixhd(12).le.301))) then GBC5F404.473
CMESSAGE='WRITDUMP: Addressing conflict' WRITDM1A.146
ICODE=1 WRITDM1A.147
CALL POSERROR
('model data', WRITDM1A.148
* START_BLOCK,160,FIXHD(160)) WRITDM1A.149
RETURN WRITDM1A.150
else GBC5F404.474
real_start_block=fixhd(160) GBC5F404.475
endif GBC5F404.476
ENDIF WRITDM1A.151
WRITDM1A.152
C Loop over number of fields in data blocks WRITDM1A.153
*IF DEF,MPP GPB0F305.399
address=1 GPB0F305.400
*ENDIF GPB0F305.401
object_index=1 GPB4F403.798
level=1 GPB4F403.799
DO 200 K=1,FIXHD(152) WRITDM1A.154
*IF DEF,MPP GSM1F403.264
MPP_LOOKUP(P_LBLREC,K)=0 GSM1F403.265
MPP_LOOKUP(P_NADDR,K)=address GSM1F403.266
*ENDIF GSM1F403.267
IF (LOOKUP(LBLREC,K) .GT. 0) THEN ! if this isnt a zero GPB0F401.750
! ! length field GPB0F401.751
C Is the buffer length long enough for this field. TJ300394.107
IF(LOOKUP(LBLREC,K).GT.BUFLEN) THEN TJ300394.108
ICODE=100 TJ300394.109
CMESSAGE='WRITDUMP : Field length longer than buffer' TJ300394.110
WRITE(6,*) 'WRITDUMP :Field length longer than buffer, abort', TJ300394.111
& LOOKUP(LBLREC,K),'>',BUFLEN TJ300394.112
RETURN TJ300394.113
END IF TJ300394.114
*IF -DEF,MPP GPB0F305.402
C Pack if required WRITDM1A.155
IF(MOD((LOOKUP(LBPACK,K)),10).EQ.2) THEN WRITDM1A.156
C Pack 32 bit numbers WRITDM1A.157
IF(LOOKUP(DATA_TYPE,K).EQ.1) THEN WRITDM1A.158
CALL PACK21
(LOOKUP(LBLREC,K),D1(LOOKUP(NADDR,K)), WRITDM1A.159
& BUF(1),P21BITS
(FIXHD(12))) TJ190293.11
C Expand back to ensure reproducibility across a restart WRITDM1A.161
CALL EXPAND21
(LOOKUP(LBLREC,K),BUF(1), WRITDM1A.162
& D1(LOOKUP(NADDR,K)),P21BITS
(FIXHD(12))) TJ190293.12
END IF WRITDM1A.164
C Copy across if already in 64 bit WRITDM1A.165
ELSE WRITDM1A.166
DO 110 I=1,LOOKUP(LBLREC,K) WRITDM1A.167
BUF(I)=D1(LOOKUP(NADDR,K)+I-1) WRITDM1A.168
110 CONTINUE WRITDM1A.169
END IF WRITDM1A.170
*ELSE GPB0F305.403
! Data packing to 32 bits is moved down to write_multi. We only want GPB0F305.404
! to compress data after the global data has been gathered GPB0F305.405
*ENDIF GPB0F305.406
WRITDM1A.171
C Test whether data stored as 32-bit on disk WRITDM1A.172
IF(MOD((LOOKUP(LBPACK,K)),10).EQ.2) THEN WRITDM1A.173
IPTS=(LOOKUP(LBLREC,K)+1)/2 WRITDM1A.174
ELSE WRITDM1A.175
IPTS=LOOKUP(LBLREC,K) WRITDM1A.176
ENDIF WRITDM1A.177
GBC5F404.477
CL Compute word address in file from which to begin I/O GBC5F404.478
GBC5F404.479
C Old Format dumpfiles GBC5F404.480
if((lookup(lbnrec,k).eq.0) .or. GBC5F404.481
C Prog lookups in dump before vn3.2: GBC5F404.482
2 ((lookup(lbnrec,k).eq.imdi) .and. (fixhd(12).le.301))) then GBC5F404.483
C Dump and ancillary files GBC5F404.484
word_address=1 GBC5F404.485
if(k.gt.1) then GBC5F404.486
do i=2, k GBC5F404.487
if(mod(lookup(lbpack,i-1),10).eq.2) then GBC5F404.488
l_ipts=(lookup(lblrec,i-1)+1)/2 GBC5F404.489
else GBC5F404.490
l_ipts=(lookup(lblrec,i-1)) GBC5F404.491
endif GBC5F404.492
word_address=word_address+l_ipts GBC5F404.493
end do GBC5F404.494
endif GBC5F404.495
word_address=fixhd(160)+word_address-2 GBC5F404.496
um_sector_ipts=ipts GBC5F404.497
else ! fieldsfiles GBC5F404.498
C PP type files and new format Dumpfiles (vn4.4 onwards) GBC5F404.499
word_address=lookup(lbegin,k) GBC5F404.500
C Use the stored round-up value GBC5F404.501
um_sector_ipts=lookup(lbnrec,k) GBC5F404.502
endif GBC5F404.503
GBC5F404.504
ipts_write=ipts GBC5F404.505
GBC5F404.506
C Position file pointer GBC5F404.507
call setpos
(nftout, word_address, icode) GBC5F404.508
GBC5F404.509
WRITDM1A.178
C Write data out from buffer WRITDM1A.179
C Check that data_type is valid no: 1 to 3 or -1 to -3 WRITDM1A.180
IF((LOOKUP(DATA_TYPE,K).GE.1.AND.LOOKUP(DATA_TYPE,K).LE.3) .OR. WRITDM1A.181
+ (LOOKUP(DATA_TYPE,K).LE.-1.AND.LOOKUP(DATA_TYPE,K).GE.-3)) WRITDM1A.182
+ THEN WRITDM1A.183
*IF -DEF,MPP GPB0F305.407
CALL BUFFOUT
(NFTOUT,BUF(1),IPTS,LEN_IO,A) WRITDM1A.184
*ELSE GPB0F305.408
IF (SUBMODEL_ID .EQ. O_IM) THEN GPB4F403.800
IF (D1_ADDR(d1_object_type,object_index) .EQ. diagnostic) GPB4F403.801
& THEN GPB4F403.802
CALL CHANGE_DECOMPOSITION
(decomp_nowrap_ocean,ICODE) GPB4F403.803
ELSE GPB4F403.804
CALL CHANGE_DECOMPOSITION
(decomp_standard_ocean,ICODE) GPB4F403.805
ENDIF GPB4F403.806
ENDIF GPB4F403.807
ipts_write=um_sector_ipts GBC5F404.510
call write_multi
(nftout,d1(address),um_sector_ipts, GBC5F404.523
& len_io,local_len,a, GBC5F404.524
& LOOKUP(1,K),FIXHD(12),BUF, GPB4F403.808
& D1_ADDR(1,object_index), GPB4F403.809
& CMESSAGE) GPB4F403.810
MPP_LOOKUP(P_LBLREC,K)=local_len GSM1F403.268
address=address+local_len GPB0F305.411
*ENDIF GPB0F305.412
if((a.ne.-1.0).or.(len_io.ne.ipts_write)) then GBC5F404.525
GBC5F404.526
WRITE(6,*)'ERROR WRITING DUMP ON UNIT ',NFTOUT MC240793.3
ICODE=3 MC240793.4
CMESSAGE='WRITDUMP: BAD BUFFOUT OF DATA' MC240793.5
CALL IOERROR
('BUFFER OUT FROM WRITDUMP',A,LEN_IO,IPTS) MC240793.6
RETURN MC240793.7
END IF MC240793.8
ELSE WRITDM1A.185
IF (FIXHD(5).LT.6.OR. FIXHD(5).GT.9) THEN !Not AC/VarOb/Cx/Cov VSB1F400.5
CALL PR_LOOK
( GDG0F401.1631
*CALL ARGPPX
GDG0F401.1632
& LOOKUP,LOOKUP,LEN1_LOOKUP,K) GDG0F401.1633
ENDIF DR221193.225
ICODE=3 WRITDM1A.187
CMESSAGE='WRITDUMP: Invalid code in LOOKUP(DATA_TYPE,K)' WRITDM1A.188
RETURN WRITDM1A.189
END IF WRITDM1A.190
WRITDM1A.191
ENDIF ! IF this field is non-zero length GPB0F401.753
*IF DEF,DIAG81 WRITDM1A.192
IF (FIXHD(5).LT.6 .OR. FIXHD(5).GT.9) THEN ! Not AC/VarObs/Cx/Cov VSB1F400.6
C Print out PP header and summary of data field WRITDM1A.193
CALL PR_LOOK
( GDG0F401.1634
*CALL ARGPPX
GDG0F401.1635
& LOOKUP,LOOKUP,LEN1_LOOKUP,K) GDG0F401.1636
GDG0F401.1637
IF (FIXHD(5).NE.5) THEN ! Skip if boundary datasets DR221193.226
IF(LOOKUP(DATA_TYPE,K).EQ.1) THEN ! Real DR221193.227
CALL PR_RFLD
(LOOKUP,LOOKUP,D1(LOOKUP(NADDR,K)),K) WRITDM1A.196
ELSE IF(LOOKUP(DATA_TYPE,K).EQ.2) THEN ! Integer DR221193.228
CALL PR_IFLD
(LOOKUP,LOOKUP,D1(LOOKUP(NADDR,K)),K) WRITDM1A.199
ELSE IF(LOOKUP(DATA_TYPE,K).EQ.3) THEN ! Logical DR221193.229
CALL PR_LFLD
(LOOKUP,LOOKUP,LEN1_LOOKUP,D1(LOOKUP(NADDR,K)),K) DR221193.230
END IF DR221193.231
END IF WRITDM1A.200
END IF DR260593.142
*ENDIF WRITDM1A.201
WRITDM1A.202
START_BLOCK=START_BLOCK+LOOKUP(LBLREC,K) WRITDM1A.203
real_start_block=real_start_block+ipts GBC5F404.527
GBC5F404.528
WRITDM1A.204
level=level+1 GPB4F403.811
IF (level .GT. D1_ADDR(d1_no_levels,object_index)) THEN GPB4F403.812
level=1 GPB4F403.813
object_index=object_index+1 GPB4F403.814
ENDIF GPB4F403.815
200 CONTINUE WRITDM1A.205
WRITDM1A.206
WRITDM1A.207
*IF DEF,MPP GPB0F305.413
IF (mype .EQ.0 ) THEN GPB0F305.414
*ENDIF GPB0F305.415
WRITE(6,'('' '')') WRITDM1A.208
IF (FIXHD(5).GE.6 .AND. FIXHD(5).LE.9) THEN ! AC/VarObs/Cx/Cov VSB1F400.7
WRITE(6,'('' OBSERVATION DATA'')') WRITDM1A.210
ELSE WRITDM1A.211
WRITE(6,'('' MODEL DATA'')') WRITDM1A.212
ENDIF WRITDM1A.213
WRITE(6,'('' '',I8,'' words long'')')FIXHD(161) WRITDM1A.214
*IF DEF,MPP GPB0F305.416
ENDIF ! if mype .EQ. 0 GPB0F305.417
*ENDIF GPB0F305.418
WRITDM1A.215
ENDIF WRITDM1A.216
WRITDM1A.217
*IF DEF,MPP GPB4F403.816
! Reset to original decomposition type GPB4F403.817
CALL CHANGE_DECOMPOSITION
(orig_decomp,ICODE) GPB4F403.818
*ENDIF GPB4F403.819
*IF DEF,MPP GPB0F305.419
IF (mype .EQ.0 ) THEN GPB0F305.420
*ENDIF GPB0F305.421
WRITE(6,'('' '')') WRITDM1A.218
WRITE(6,'('' MODEL DUMP SUCCESSFULLY WRITTEN -'',I9, WRITDM1A.219
*'' WORDS TO UNIT'',I3)')START_BLOCK,NFTOUT WRITDM1A.220
if(real_start_block.ne.start_block) then GBC5F404.529
write(6,'(/'' Number of Words Written to Disk was '',i9)') GBC5F404.530
2 real_start_block GBC5F404.531
endif GBC5F404.532
*IF DEF,MPP GPB0F305.422
ENDIF ! if mype .EQ. 0 GPB0F305.423
*ENDIF GPB0F305.424
WRITDM1A.221
RETURN WRITDM1A.222
END WRITDM1A.223
WRITDM1A.224
CLL SUBROUTINE WRITDUMP--------------------------------------- GPB4F403.820
CLL GPB4F403.821
CLL Purpose : Writes an obs file. GPB4F403.822
CLL GPB4F403.823
CLL Code mostly copied from original WRITDUMP GPB4F403.824
CLL GPB4F403.825
CLL Model Modification history from model version 4.3: GPB4F403.826
CLL version Date GPB4F403.827
CLL 4.3 19/3/97 New routine introduced P.Burton GPB4F403.828
CLL GPB4F403.829
CLL Programming standard: Unified Model Documentation Paper No 3 GPB4F403.830
CLL Version No 1 15/1/90 GPB4F403.831
CLL GPB4F403.832
CLL Logical component: R30 GPB4F403.833
CLL GPB4F403.834
CLL Project task: F3 GPB4F403.835
CLL GPB4F403.836
CLL Purpose: Writes out model dump on unit NFTOUT and checks model GPB4F403.837
CLL and dump dimensions for consistency. GPB4F403.838
CLL GPB4F403.839
CLL Documentation: Unified Model Documentation Paper No F3 GPB4F403.840
CLL Version No 5 9/2/90 GPB4F403.841
CLLEND--------------------------------------------------------- GPB4F403.842
C GPB4F403.843
C*L Arguments:------------------------------------------------- GPB4F403.844
SUBROUTINE WRITDUMP(NFTOUT,FIXHD,LEN_FIXHD, ,10GPB4F403.845
& INTHD,LEN_INTHD, GPB4F403.846
& REALHD,LEN_REALHD, GPB4F403.847
& LEVDEPC,LEN1_LEVDEPC,LEN2_LEVDEPC, GPB4F403.848
& ROWDEPC,LEN1_ROWDEPC,LEN2_ROWDEPC, GPB4F403.849
& COLDEPC,LEN1_COLDEPC,LEN2_COLDEPC, GPB4F403.850
& FLDDEPC,LEN1_FLDDEPC,LEN2_FLDDEPC, GPB4F403.851
& EXTCNST,LEN_EXTCNST, GPB4F403.852
& DUMPHIST,LEN_DUMPHIST, GPB4F403.853
& CFI1,LEN_CFI1, GPB4F403.854
& CFI2,LEN_CFI2, GPB4F403.855
& CFI3,LEN_CFI3, GPB4F403.856
& LOOKUP,LEN1_LOOKUP,LEN2_LOOKUP,BUFLEN, GPB4F403.857
& LEN_DATA,D1, GPB4F403.858
*CALL ARGPPX
GPB4F403.859
& ICODE,CMESSAGE) GPB4F403.860
GPB4F403.861
IMPLICIT NONE GPB4F403.862
GPB4F403.863
INTEGER GPB4F403.864
* NFTOUT !IN Unit no of dump GPB4F403.865
*,LEN_FIXHD !IN Length of fixed length header GPB4F403.866
*,LEN_INTHD !IN Length of integer header GPB4F403.867
*,LEN_REALHD !IN Length of real header GPB4F403.868
*,LEN1_LEVDEPC !IN 1st dim of level dep consts GPB4F403.869
*,LEN2_LEVDEPC !IN 2ndt dim of level dep consts GPB4F403.870
*,LEN1_ROWDEPC !IN 1st dim of row dep consts GPB4F403.871
*,LEN2_ROWDEPC !IN 2nd dim of row dep consts GPB4F403.872
&,LEN1_COLDEPC !IN 1st dim of column dep consts GPB4F403.873
&,LEN2_COLDEPC !IN 2nd dim of column dep consts GPB4F403.874
&,LEN1_FLDDEPC !IN 1st dim of field dep consts GPB4F403.875
&,LEN2_FLDDEPC !IN 2nd dim of field dep consts GPB4F403.876
&,LEN_EXTCNST !IN Length of extra constants GPB4F403.877
&,LEN_DUMPHIST !IN Length of history block GPB4F403.878
&,LEN_CFI1 !IN Length of comp field index 1 GPB4F403.879
&,LEN_CFI2 !IN Length of comp field index 2 GPB4F403.880
&,LEN_CFI3 !IN Length of comp field index 3 GPB4F403.881
&,LEN1_LOOKUP !IN 1st dim of lookup GPB4F403.882
&,LEN2_LOOKUP !IN 2nd dim of lookup GPB4F403.883
GPB4F403.884
INTEGER GPB4F403.885
* BUFLEN !IN Maximum length of single field in dump GPB4F403.886
*,LEN_DATA !IN Length of real data GPB4F403.887
*,ICODE !OUT Return code; successful=0 GPB4F403.888
* ! error > 0 GPB4F403.889
GPB4F403.890
CHARACTER*(80) GPB4F403.891
* CMESSAGE !OUT Error message if ICODE > 0 GPB4F403.892
GPB4F403.893
INTEGER GPB4F403.894
* FIXHD(LEN_FIXHD) !IN Fixed length header GPB4F403.895
*,INTHD(LEN_INTHD) !IN Integer header GPB4F403.896
*,LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP) !IN PP lookup tables GPB4F403.897
*,CFI1(LEN_CFI1+1) !IN Compressed field index no 1 GPB4F403.898
*,CFI2(LEN_CFI2+1) !IN Compressed field index no 2 GPB4F403.899
*,CFI3(LEN_CFI3+1) !IN Compressed field index no 3 GPB4F403.900
GPB4F403.901
REAL GPB4F403.902
& REALHD(LEN_REALHD) !IN Real header GPB4F403.903
&,LEVDEPC(1+LEN1_LEVDEPC*LEN2_LEVDEPC) !IN Lev dep consts GPB4F403.904
&,ROWDEPC(1+LEN1_ROWDEPC*LEN2_ROWDEPC) !IN Row dep consts GPB4F403.905
&,COLDEPC(1+LEN1_COLDEPC*LEN2_COLDEPC) !IN Col dep consts GPB4F403.906
&,FLDDEPC(1+LEN1_FLDDEPC*LEN2_FLDDEPC) !IN Field dep consts GPB4F403.907
&,EXTCNST(LEN_EXTCNST+1) !IN Extra constants GPB4F403.908
&,DUMPHIST(LEN_DUMPHIST+1) !IN History block GPB4F403.909
*,D1(LEN_DATA) !IN Real equivalence of data block GPB4F403.910
GPB4F403.911
*CALL CSUBMODL
GPB4F403.912
*CALL CPPXREF
GPB4F403.913
*CALL PPXLOOK
GPB4F403.914
*CALL CLOOKADD
GPB4F403.915
*IF DEF,MPP GPB4F403.916
*CALL PARVARS
GPB4F403.917
*ENDIF GPB4F403.918
*CALL C_MDI
GBC5F404.533
*CALL AMAXSIZE
GBC5F404.534
*CALL CNTL_IO
GBC5F404.535
GPB4F403.919
C ------------------------------------------------------------- GPB4F403.920
C Local arrays:------------------------------------------------ GPB4F403.921
real buf(((buflen+um_sector_size)/um_sector_size)*um_sector_size) GBC5F404.536
cdir$ cache_align buf GBC5F404.537
C ------------------------------------------------------------- GPB4F403.923
C*L External subroutines called:------------------------------- GPB4F403.924
EXTERNAL IOERROR,POSERROR,WRITHEAD,PR_LOOK,PR_IFLD,PR_RFLD GPB4F403.925
*,PACK21,EXPAND21,BUFFOUT,P21BITS,PR_LFLD GPB4F403.926
INTEGER P21BITS GPB4F403.927
C Cray specific functions UNIT,LENGTH GPB4F403.928
C*------------------------------------------------------------- GPB4F403.929
C Local variables:--------------------------------------------- GPB4F403.930
INTEGER START_BLOCK ! Pointer to current position in file GPB4F403.931
*,LEN_IO ! No of 64-bit words buffered in GPB4F403.932
*,K,I ! Loop counts GPB4F403.933
*,IPTS ! No of 64-bit words requested to be GPB4F403.934
* ! buffered in GPB4F403.935
&, word_address ! disk address of the record GBC5F404.538
&, real_start_block ! real start address and number of words moved GBC5F404.539
&, l_ipts ! record length during index search GBC5F404.540
&, um_sector_ipts ! number fo words to write, rounded up GBC5F404.541
&, ipts_write ! number of words actually write from disk GBC5F404.542
&, disk_address ! Current rounded disk address GBC5F404.543
&, number_of_data_words_on_disk ! Number of data words on disk GBC5F404.544
&, number_of_data_words_in_memory ! Number of Data Words in memory GBC5F404.545
GPB4F403.936
REAL A ! Error code returned by UNIT GPB4F403.937
C-------------------------------------------------------------- GPB4F403.938
GPB4F403.939
*IF DEF,MPP GPB4F403.940
IF (mype .EQ. 0) THEN GPB4F403.941
*ENDIF GPB4F403.942
WRITE(6,'(/,'' WRITING UNIFIED MODEL DUMP ON UNIT'',I3)')NFTOUT GPB4F403.943
WRITE(6,'('' #####################################'',/)') GPB4F403.944
*IF DEF,MPP GPB4F403.945
ENDIF GPB4F403.946
*ENDIF GPB4F403.947
ICODE=0 GPB4F403.948
CMESSAGE=' ' GPB4F403.949
GPB4F403.950
CL 1. Read in all header records and check for consistency GPB4F403.951
C START_BLOCK points to position of model data block GPB4F403.952
C on return GPB4F403.953
c GBC5F404.546
c--reset the disk addresses and lengths for well-formed I/O GBC5F404.547
call set_dumpfile_address
(fixhd, len_fixhd, GBC5F404.548
& lookup, len1_lookup, GBC5F404.549
& len2_lookup, GBC5F404.550
& number_of_data_words_in_memory, GBC5F404.551
& number_of_data_words_on_disk, GBC5F404.552
& disk_address) GBC5F404.553
GPB4F403.954
CALL WRITHEAD
(NFTOUT,FIXHD,LEN_FIXHD, GPB4F403.955
& INTHD,LEN_INTHD, GPB4F403.956
& REALHD,LEN_REALHD, GPB4F403.957
& LEVDEPC,LEN1_LEVDEPC,LEN2_LEVDEPC, GPB4F403.958
& ROWDEPC,LEN1_ROWDEPC,LEN2_ROWDEPC, GPB4F403.959
& COLDEPC,LEN1_COLDEPC,LEN2_COLDEPC, GPB4F403.960
& FLDDEPC,LEN1_FLDDEPC,LEN2_FLDDEPC, GPB4F403.961
& EXTCNST,LEN_EXTCNST, GPB4F403.962
& DUMPHIST,LEN_DUMPHIST, GPB4F403.963
& CFI1,LEN_CFI1, GPB4F403.964
& CFI2,LEN_CFI2, GPB4F403.965
& CFI3,LEN_CFI3, GPB4F403.966
& LOOKUP,LEN1_LOOKUP,LEN2_LOOKUP,LEN_DATA, GPB4F403.967
*CALL ARGPPX
GPB4F403.968
& START_BLOCK,ICODE,CMESSAGE) GPB4F403.969
GPB4F403.970
IF(ICODE.GT.0)RETURN GPB4F403.971
GPB4F403.972
CL 2. Buffer in model data one field at a time for GPB4F403.973
CL conversion from 64-bit to 32-bit numbers GPB4F403.974
GPB4F403.975
IF(FIXHD(160).GT.0)THEN GPB4F403.976
GPB4F403.977
C Check for error in file pointers GPB4F403.978
real_start_block=start_block GBC5F404.554
if(start_block.eq.fixhd(160)) then GBC5F404.555
C If new format Dumpfile, we must reset the start address GBC5F404.556
if((lookup(lbnrec,1).eq.0) .or. GBC5F404.557
C Ocean ACOBS Files (?) GBC5F404.558
2 ((lookup(lbnrec,1).eq.imdi) .or. (lookup(lbegin,1).eq.imdi)) GBC5F404.559
3 .or. GBC5F404.560
C Prog lookups in dump before vn3.2: GBC5F404.561
4 ((lookup(lbnrec,1).eq.imdi) .and. (fixhd(12).le.301))) then GBC5F404.562
CMESSAGE='WRITDUMP: Addressing conflict' GPB4F403.980
ICODE=1 GPB4F403.981
CALL POSERROR
('model data', GPB4F403.982
* START_BLOCK,160,FIXHD(160)) GPB4F403.983
RETURN GPB4F403.984
else GBC5F404.563
real_start_block=fixhd(160) GBC5F404.564
endif GBC5F404.565
ENDIF GPB4F403.985
GPB4F403.986
C Loop over number of fields in data blocks GPB4F403.987
GPB4F403.988
DO 200 K=1,FIXHD(152) GPB4F403.989
IF (LOOKUP(LBLREC,K) .GT. 0) THEN ! if this isnt a zero GPB4F403.990
! ! length field GPB4F403.991
C Is the buffer length long enough for this field. GPB4F403.992
IF(LOOKUP(LBLREC,K).GT.BUFLEN) THEN GPB4F403.993
ICODE=100 GPB4F403.994
CMESSAGE='WRITDUMP : Field length longer than buffer' GPB4F403.995
WRITE(6,*) 'WRITDUMP :Field length longer than buffer, abort', GPB4F403.996
& LOOKUP(LBLREC,K),'>',BUFLEN GPB4F403.997
RETURN GPB4F403.998
END IF GPB4F403.999
*IF -DEF,MPP GPB4F403.1000
C Pack if required GPB4F403.1001
IF(MOD((LOOKUP(LBPACK,K)),10).EQ.2) THEN GPB4F403.1002
C Pack 32 bit numbers GPB4F403.1003
IF(LOOKUP(DATA_TYPE,K).EQ.1) THEN GPB4F403.1004
CALL PACK21
(LOOKUP(LBLREC,K),D1(LOOKUP(NADDR,K)), GPB4F403.1005
& BUF(1),P21BITS
(FIXHD(12))) GPB4F403.1006
C Expand back to ensure reproducibility across a restart GPB4F403.1007
CALL EXPAND21
(LOOKUP(LBLREC,K),BUF(1), GPB4F403.1008
& D1(LOOKUP(NADDR,K)),P21BITS
(FIXHD(12))) GPB4F403.1009
END IF GPB4F403.1010
C Copy across if already in 64 bit GPB4F403.1011
ELSE GPB4F403.1012
DO 110 I=1,LOOKUP(LBLREC,K) GPB4F403.1013
BUF(I)=D1(LOOKUP(NADDR,K)+I-1) GPB4F403.1014
110 CONTINUE GPB4F403.1015
END IF GPB4F403.1016
*ELSE GPB4F403.1017
! Data packing to 32 bits is moved down to write_multi. We only want GPB4F403.1018
! to compress data after the global data has been gathered GPB4F403.1019
*ENDIF GPB4F403.1020
GPB4F403.1021
C Test whether data stored as 32-bit on disk GPB4F403.1022
IF(MOD((LOOKUP(LBPACK,K)),10).EQ.2) THEN GPB4F403.1023
IPTS=(LOOKUP(LBLREC,K)+1)/2 GPB4F403.1024
ELSE GPB4F403.1025
IPTS=LOOKUP(LBLREC,K) GPB4F403.1026
ENDIF GPB4F403.1027
GBC5F404.566
CL Compute word address in file from which to begin I/O GBC5F404.567
GBC5F404.568
C Old Format dumpfiles GBC5F404.569
if((lookup(lbnrec,k).eq.0) .or. GBC5F404.570
C Ocean ACOBS Files (?) GBC5F404.571
2 ((lookup(lbnrec,k).eq.imdi) .or. (lookup(lbegin,k).eq.imdi)) GBC5F404.572
3 .or. GBC5F404.573
C Prog lookups in dump before vn3.2: GBC5F404.574
4 ((lookup(lbnrec,k).eq.imdi) .and. (fixhd(12).le.301))) then GBC5F404.575
C Dump and ancillary files GBC5F404.576
word_address=1 GBC5F404.577
if(k.gt.1) then GBC5F404.578
do i=2, k GBC5F404.579
if(mod(lookup(lbpack,i-1),10).eq.2) then GBC5F404.580
l_ipts=(lookup(lblrec,i-1)+1)/2 GBC5F404.581
else GBC5F404.582
l_ipts=(lookup(lblrec,i-1)) GBC5F404.583
endif GBC5F404.584
word_address=word_address+l_ipts GBC5F404.585
end do GBC5F404.586
endif GBC5F404.587
word_address=fixhd(160)+word_address-2 GBC5F404.588
um_sector_ipts=ipts GBC5F404.589
else ! fieldsfiles GBC5F404.590
C PP type files and new format Dumpfiles (vn4.4 onwards) GBC5F404.591
word_address=lookup(lbegin,k) GBC5F404.592
C Use the stored round-up value GBC5F404.593
um_sector_ipts=lookup(lbnrec,k) GBC5F404.594
endif GBC5F404.595
GBC5F404.596
ipts_write=ipts GBC5F404.597
GBC5F404.598
C Position file pointer GBC5F404.599
call setpos
(nftout, word_address, icode) GBC5F404.600
GBC5F404.601
GPB4F403.1028
C Write data out from buffer GPB4F403.1029
C Check that data_type is valid no: 1 to 3 or -1 to -3 GPB4F403.1030
IF((LOOKUP(DATA_TYPE,K).GE.1.AND.LOOKUP(DATA_TYPE,K).LE.3) .OR. GPB4F403.1031
+ (LOOKUP(DATA_TYPE,K).LE.-1.AND.LOOKUP(DATA_TYPE,K).GE.-3)) GPB4F403.1032
+ THEN GPB4F403.1033
ipts_write=um_sector_ipts GBC5F404.602
ipts=ipts_write GBC5F404.603
GBC5F404.604
*IF -DEF,MPP GPB4F403.1034
CALL BUFFOUT
(NFTOUT,BUF(1),IPTS,LEN_IO,A) GPB4F403.1035
*ELSE GPB4F403.1036
CALL BUFFOUT_shmem(
NFTOUT,BUF(1),IPTS,LEN_IO,A) GPB4F403.1037
*ENDIF GPB4F403.1038
IF((A.NE.-1.0).OR.(LEN_IO.NE.IPTS)) THEN GPB4F403.1039
WRITE(6,*)'ERROR WRITING DUMP ON UNIT ',NFTOUT GPB4F403.1040
ICODE=3 GPB4F403.1041
CMESSAGE='WRITDUMP: BAD BUFFOUT OF DATA' GPB4F403.1042
CALL IOERROR
('BUFFER OUT FROM WRITDUMP',A,LEN_IO,IPTS) GPB4F403.1043
RETURN GPB4F403.1044
END IF GPB4F403.1045
ENDIF GPB4F403.1046
GPB4F403.1047
ENDIF ! IF this field is non-zero length GPB4F403.1048
GPB4F403.1049
START_BLOCK=START_BLOCK+LOOKUP(LBLREC,K) GPB4F403.1050
real_start_block=real_start_block+ipts GBC5F404.605
GBC5F404.606
GPB4F403.1051
200 CONTINUE GPB4F403.1052
GPB4F403.1053
GPB4F403.1054
*IF DEF,MPP GPB4F403.1055
IF (mype .EQ.0 ) THEN GPB4F403.1056
*ENDIF GPB4F403.1057
WRITE(6,'('' '')') GPB4F403.1058
IF (FIXHD(5).GE.6 .AND. FIXHD(5).LE.9) THEN ! AC/VarObs/Cx/Cov GPB4F403.1059
WRITE(6,'('' OBSERVATION DATA'')') GPB4F403.1060
ELSE GPB4F403.1061
WRITE(6,'('' MODEL DATA'')') GPB4F403.1062
ENDIF GPB4F403.1063
WRITE(6,'('' '',I8,'' words long'')')FIXHD(161) GPB4F403.1064
*IF DEF,MPP GPB4F403.1065
ENDIF ! if mype .EQ. 0 GPB4F403.1066
*ENDIF GPB4F403.1067
GPB4F403.1068
ENDIF GPB4F403.1069
GPB4F403.1070
*IF DEF,MPP GPB4F403.1071
IF (mype .EQ.0 ) THEN GPB4F403.1072
*ENDIF GPB4F403.1073
WRITE(6,'('' '')') GPB4F403.1074
WRITE(6,'('' MODEL DUMP SUCCESSFULLY WRITTEN -'',I9, GPB4F403.1075
*'' WORDS TO UNIT'',I3)')START_BLOCK,NFTOUT GPB4F403.1076
if(real_start_block.ne.start_block) then GBC5F404.607
write(6,'(/'' Number of Words Written to Disk was '',i9)') GBC5F404.608
2 real_start_block GBC5F404.609
endif GBC5F404.610
*IF DEF,MPP GPB4F403.1077
ENDIF ! if mype .EQ. 0 GPB4F403.1078
*ENDIF GPB4F403.1079
GPB4F403.1080
RETURN GPB4F403.1081
END GPB4F403.1082
*ENDIF WRITDM1A.225