*IF DEF,CONTROL                                                            TRANSOU1.2      
C ******************************COPYRIGHT******************************    GTS2F400.10549  
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.10550  
C                                                                          GTS2F400.10551  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.10552  
C restrictions as set forth in the contract.                               GTS2F400.10553  
C                                                                          GTS2F400.10554  
C                Meteorological Office                                     GTS2F400.10555  
C                London Road                                               GTS2F400.10556  
C                BRACKNELL                                                 GTS2F400.10557  
C                Berkshire UK                                              GTS2F400.10558  
C                RG12 2SZ                                                  GTS2F400.10559  
C                                                                          GTS2F400.10560  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.10561  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.10562  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.10563  
C Modelling at the above address.                                          GTS2F400.10564  
C ******************************COPYRIGHT******************************    GTS2F400.10565  
C                                                                          GTS2F400.10566  
CLL    Subroutine: TRANSOUT -----------------------------------------      TRANSOU1.3      
CLL                                                                        TRANSOU1.4      
CLL    Purpose:                                                            TRANSOU1.5      
CLL    To transfer dump data from memory to disk en masse                  TRANSOU1.6      
CLL                                                                        TRANSOU1.7      
CLL    Tested under compiler: cft77                                        TRANSOU1.8      
CLL    Tested under OS version: UNICOS 6.1.5A                              TRANSOU1.9      
CLL                                                                        TS071093.8      
CLL  Model                                                                 TS071093.9      
CLL version  Date     Modification history:                                TS071093.10     
CLL   3.3    07/10/93 Corrected order of *CALLs to comdecks TYPSIZE        TS071093.11     
CLL                   and TYPD1.  Tracey Smith                             TS071093.12     
CLL                                                                        TRANSOU1.10     
CLL    Programming standard:                                               TRANSOU1.11     
CLL    UM Doc Paper 3                                                      TRANSOU1.12     
CLL                                                                        TRANSOU1.13     
CLL    Logical system components covered: C2                               TRANSOU1.14     
CLL                                                                        TRANSOU1.15     
CLL    Project tasks: C2                                                   TRANSOU1.16     
CLL                                                                        TRANSOU1.17     
CLL    External documentation:                                             TRANSOU1.18     
CLL    On-line UM document C5 - Control of means calculations              TRANSOU1.19     
CLL  Model            Modification history from model version 3.4:         ANF0F304.38     
CLL version  Date                                                          ANF0F304.39     
CLL 3.4  16/6/94 : Change CHARACTER*(*) to CHARACTER*(80) N.Farnon         ANF0F304.40     
CLL   3.5  24/03/95    Changed OPEN to FILE_OPEN and                       GPB1F305.162    
CLL                    CLOSE to FILE_CLOSE    P.Burton                     GPB1F305.163    
CLL   4.2  11/10/96    Enable atmos-ocean coupling for MPP.                GRR1F402.191    
CLL                    (2): Swap D1 memory.                                GRR1F402.192    
CLL                    Image of D1 either copied directly from local       GRR1F402.193    
CLL                    memory or I/O from file (local to processor)        GRR1F402.194    
CLL                    under MPP. I/O kept for mean dumps. R.Rawlins       GRR1F402.195    
CLL   4.4  01/07/97    Make transfers to the input file                    GBC6F404.252    
CLL                    well-formed.                                        GBC6F404.253    
CLL                      Author: Bob Carruthers, Cray Research.            GBC6F404.254    
CLL   4.4  11/10/97    Call CNTLALL for L_AO_D1_MEMORY. D. Robinson.       GDR5F404.7      
CLL   4.4  28/08/97    Minor tidy: replace SETPOS by SETPOS_SINGLE for     GRR0F404.5      
CLL                    MPP case. R.Rawlins                                 GRR0F404.6      
CLL                                                                        TRANSOU1.20     
CLLEND---------------------------------------------------------------      TRANSOU1.21     
C*L    Interface and arguments:                                            TRANSOU1.22     

      SUBROUTINE TRANSOUT(                                                  9,12@DYALLOC.3565   
*CALL ARGD1                                                                @DYALLOC.3566   
     &  LEN_DATA,NFTOUT,sm_ident                                           GRR1F402.196    
     & ,ICODE,CMESSAGE)                                                    TRANSOU1.24     
C                                                                          TRANSOU1.25     
      IMPLICIT NONE                                                        TRANSOU1.26     
C                                                                          TRANSOU1.27     
      INTEGER                                                              TRANSOU1.28     
     &       LEN_DATA,            ! IN Length of model data                TRANSOU1.29     
     &       NFTOUT,              ! IN Unit no for data dump               TRANSOU1.30     
     &       sm_ident,            ! IN submodel identifier                 GRR1F402.197    
     &       ICODE                ! OUT Return code; successful=0          TRANSOU1.31     
     *                            !                  error>0               TRANSOU1.32     
C                                                                          TRANSOU1.33     
      CHARACTER*(80)                                                       ANF0F304.41     
     &       CMESSAGE             ! OUT Error message if ICODE>0           TRANSOU1.35     
C                                                                          TRANSOU1.36     
*CALL TYPSIZE                                                              TS071093.13     
*CALL TYPD1                                                                TS071093.14     
*IF DEF,T3E                                                                GBC6F404.255    
*CALL CNTL_IO                                                              GBC6F404.256    
c                                                                          GBC6F404.257    
      real local_buffer(um_sector_size)                                    GBC6F404.258    
cdir$ cache_align local_buffer                                             GBC6F404.259    
*ENDIF                                                                     GBC6F404.260    
C                                                                          TRANSOU1.39     
C      Cray specific functions  UNIT,LENGTH                                TRANSOU1.40     
C                                                                          TRANSOU1.41     
C      External subroutines called                                         TRANSOU1.42     
C                                                                          TRANSOU1.43     
      EXTERNAL SETPOS,BUFFOUT                                              TRANSOU1.44     
*IF DEF,MPP                                                                GRR1F402.198    
      EXTERNAL FORT_GET_ENV,OPEN_SINGLE,CLOSE_SINGLE                       GRR1F402.199    
      EXTERNAL BUFFIN_SINGLE,SETPOS_SINGLE                                 GRR0F404.7      
*ELSE                                                                      GRR1F402.200    
      EXTERNAL FILE_OPEN,FILE_CLOSE                                        GRR1F402.201    
*ENDIF                                                                     GRR1F402.202    
C                                                                          TRANSOU1.45     
C      Local variables                                                     TRANSOU1.46     
C                                                                          TRANSOU1.47     
      INTEGER                                                              TRANSOU1.48     
     &       LEN_IO               ! No of 64-bit words buffered in/out     TRANSOU1.49     
     &      ,I                    ! loop counter                           GRR1F402.203    
     &      ,LEN_FILENAME         ! Length of FILENAME variable            GRR1F402.204    
     &      ,LL                   ! Character length of filename root      GRR1F402.205    
     &      ,disk_len_1           ! Input length for the first transfer    GBC6F404.261    
     &      ,disk_len_2           ! The remainder                          GBC6F404.262    
C                                                                          TRANSOU1.50     
      REAL                                                                 TRANSOU1.51     
     &       A                    ! Error code from UNIT                   TRANSOU1.52     
                                                                           GRR1F402.206    
      LOGICAL                                                              GRR1F402.207    
     &       D1_COPY_IN_MEMORY    ! T or F: D1 copy in memory or disk      GRR1F402.208    
                                                                           GRR1F402.209    
      CHARACTER                                                            GRR1F402.210    
     &       FILENAME*80          ! File name for copy of D1               GRR1F402.211    
                                                                           GRR1F402.212    
*CALL PARVARS                                                              GRR1F402.213    
*CALL MPPTRANS                                                             GRR1F402.214    
*CALL CENVIR                                                               TRANSOU1.53     
*CALL CSMID                                                                GRR1F402.215    
*CALL CHSUNITS                                                             GDR5F404.8      
*CALL CNTLALL                                                              GDR5F404.9      
                                                                           GRR1F402.216    
*IF DEF,MPP                                                                GRR1F402.217    
      D1_COPY_IN_MEMORY=L_AO_D1_MEMORY       ! from COMDECK CNTLALL        GDR5F404.10     
      IF(NFTOUT.EQ.FT_MEANDUMP_UNIT) THEN    ! Check for dump meaning      GRR1F402.219    
        D1_COPY_IN_MEMORY=.FALSE.                                          GRR1F402.220    
      ENDIF                                                                GRR1F402.221    
                                                                           GRR1F402.222    
      IF(D1_COPY_IN_MEMORY) THEN  ! Write to memory rather than disk       GRR1F402.223    
*IF DEF,ATMOS,AND,DEF,OCEAN                                                GRR1F402.224    
CL                                                                         GRR1F402.225    
CL     Copy D1 directly into memory for submodel                           GRR1F402.226    
CL                                                                         GRR1F402.227    
      IF(sm_ident.eq.atmos_sm) THEN                                        GRR1F402.228    
         DO I=1,LEN_DATA                                                   GRR1F402.229    
          D1_A(I)=D1(I)                                                    GRR1F402.230    
         ENDDO            ! I                                              GRR1F402.231    
      ELSEIF(sm_ident.eq.ocean_sm) THEN                                    GRR1F402.232    
         DO I=1,LEN_DATA                                                   GRR1F402.233    
          D1_O(I)=D1(I)                                                    GRR1F402.234    
         ENDDO            ! I                                              GRR1F402.235    
      ELSE                                                                 GRR1F402.236    
         CMESSAGE='TRANSOUT: ERROR. Non-valid submodel identifier '        GRR1F402.237    
         write(6,*) CMESSAGE,sm_ident                                      GRR1F402.238    
         ICODE=1                                                           GRR1F402.239    
         GO TO 999                                                         GRR1F402.240    
      ENDIF                                                                GRR1F402.241    
*ENDIF                                                                     GRR1F402.242    
      write(6,*) 'TRANSOUT: Copied into memory LEN_DATA=',LEN_DATA,        GRR1F402.243    
     &                      'submodel=',sm_ident                           GRR1F402.244    
                                                                           GRR1F402.245    
      ELSE                       ! Write to disk rather than memory        GRR1F402.246    
                                                                           GRR1F402.247    
      LEN_FILENAME=LEN(FILENAME)                                           GRR1F402.248    
      CALL FORT_GET_ENV(FT_ENVIRON(NFTOUT),LEN_FT_ENVIR(NFTOUT),           GRR1F402.249    
     &                  FILENAME,LEN_FILENAME,ICODE)                       GRR1F402.250    
                                                                           GRR1F402.251    
      IF(ICODE.NE.0) THEN                                                  GRR1F402.252    
         CMESSAGE='TRANSOUT: Environment variable not set '                GRR1F402.253    
         write(6,*) 'ERROR ',CMESSAGE,FT_ENVIRON(NFTOUT)                   GRR1F402.254    
         GO TO 999                                                         GRR1F402.255    
      ENDIF                                                                GRR1F402.256    
                                                                           GRR1F402.257    
C       Search for end of filename                                         GRR1F402.258    
      LL=0                                                                 GRR1F402.259    
      DO I=1,LEN_FILENAME                                                  GRR1F402.260    
        IF(FILENAME(I:I).ne.' ') THEN                                      GRR1F402.261    
           LL=LL+1                                                         GRR1F402.262    
        ENDIF                                                              GRR1F402.263    
      ENDDO    ! I over characters                                         GRR1F402.264    
                                                                           GRR1F402.265    
C       Construct filename with PE no. appended                            GRR1F402.266    
      FILENAME(LL+1:LL+1)='.'                                              GRR1F402.267    
      WRITE(FILENAME(LL+2:LL+5),'(i4.4)') mype                             GRR1F402.268    
CL                                                                         TRANSOU1.54     
CL     Write out data                                                      TRANSOU1.55     
CL                                                                         GRR1F402.269    
        CALL OPEN_SINGLE(NFTOUT,FILENAME,LL+5,1,1,ICODE)                   GRR1F402.270    
        CALL SETPOS_SINGLE(NFTOUT,0,ICODE)                                 GRR0F404.8      
*IF DEF,T3E                                                                GBC6F404.263    
c--compute the length of the first write                                   GBC6F404.264    
        disk_len_1=(len_data/um_sector_size)*um_sector_size                GBC6F404.265    
        call buffout_single(nftout, d1(1), disk_len_1, len_io, a)          GBC6F404.266    
        if(a.ne.-1. .or. len_io.ne.disk_len_1) then                        GBC6F404.267    
          write(6,*) 'TRANSOUT: Error in data transfer to disk',           GBC6F404.268    
     2     '  A = ',a,'  LEN_IO = ',len_io,                                GBC6F404.269    
     3     '  Length Requested = ',disk_len_1                              GBC6F404.270    
          icode=1                                                          GBC6F404.271    
          cmessage='TRANSOUT: I/O write error'                             GBC6F404.272    
          goto 999                                                         GBC6F404.273    
        endif                                                              GBC6F404.274    
c--now the remainder                                                       GBC6F404.275    
        disk_len_2=len_data-disk_len_1                                     GBC6F404.276    
        if(disk_len_2.gt.0) then                                           GBC6F404.277    
c--copy the rest of the data over                                          GBC6F404.278    
          do i=1, disk_len_2                                               GBC6F404.279    
            local_buffer(i)=d1(disk_len_1+i)                               GBC6F404.280    
          end do                                                           GBC6F404.281    
c--now output the remainder                                                GBC6F404.282    
          call buffout_single(nftout, local_buffer(1),                     GBC6F404.283    
     2     um_sector_size, len_io, a)                                      GBC6F404.284    
          if(a.ne.-1. .or. len_io.ne.um_sector_size) then                  GBC6F404.285    
            write(6,*) 'TRANSOUT: Error in data transfer to disk',         GBC6F404.286    
     2       '  A = ',a,'  LEN_IO = ',len_io,                              GBC6F404.287    
     3       '  Length Requested = ',um_sector_size                        GBC6F404.288    
            icode=1                                                        GBC6F404.289    
            cmessage='TRANSOUT: I/O write error'                           GBC6F404.290    
            goto 999                                                       GBC6F404.291    
          endif                                                            GBC6F404.292    
        endif                                                              GBC6F404.293    
        call close_single(nftout, filename, ll+5, 1, 0, icode)             GBC6F404.294    
        write(6,*) 'TRANSOUT: Length transferred = ', len_data             GBC6F404.295    
*ELSE                                                                      GBC6F404.296    
        CALL BUFFOUT_SINGLE(NFTOUT,D1(1),LEN_DATA,LEN_IO,A)                GSM1F403.321    
CL                                                                         GRR1F402.273    
CL----------------------------------------------------------------------   GRR1F402.274    
CL     Check for errors in data transfer to disk                           GRR1F402.275    
CL----------------------------------------------------------------------   GRR1F402.276    
CL                                                                         GRR1F402.277    
        CALL CLOSE_SINGLE(NFTOUT,FILENAME,LL+5,1,0,ICODE)                  GRR1F402.278    
          WRITE(6,*) 'TRANSOUT: Length transferred=',LEN_IO                GIE0F403.650    
          IF(A.NE.-1.0.OR.LEN_IO.NE.LEN_DATA)THEN                          GRR1F402.280    
            WRITE(6,*) 'TRANSOUT: Error in data transfer to disk'          GIE0F403.651    
            ICODE=1                                                        GRR1F402.282    
            CMESSAGE='TRANSOUT: I/O write error'                           GRR1F402.283    
            GOTO 999                                                       GRR1F402.284    
          ENDIF                                                            GRR1F402.285    
*ENDIF                                                                     GBC6F404.297    
      ENDIF                      ! End of disk/memory block                GRR1F402.286    
                                                                           GRR1F402.287    
*ELSE                                                                      GRR1F402.288    
CL                                                                         GRR1F402.289    
CL     Write out data (non-MPP)                                            GRR1F402.290    
CL                                                                         TRANSOU1.56     
        CALL FILE_OPEN(NFTOUT,FT_ENVIRON(NFTOUT),                          GPB1F305.164    
     &            LEN_FT_ENVIR(NFTOUT),1,0,ICODE)                          GPB1F305.165    
        CALL SETPOS(NFTOUT,0,ICODE)                                        GTD0F400.132    
        CALL BUFFOUT(NFTOUT,D1(1),LEN_DATA,LEN_IO,A)                       TRANSOU1.60     
CL                                                                         TRANSOU1.61     
CL----------------------------------------------------------------------   TRANSOU1.62     
CL     Check for errors in data transfer to disk                           TRANSOU1.63     
CL----------------------------------------------------------------------   TRANSOU1.64     
CL                                                                         TRANSOU1.65     
        CALL FILE_CLOSE(NFTOUT,FT_ENVIRON(NFTOUT),LEN_FT_ENVIR(NFTOUT)     GTD0F400.40     
     &                  ,0,0,ICODE)                                        GTD0F400.41     
          WRITE(6,*) 'TRANSOUT: Length transferred=',LEN_IO                GIE0F403.652    
          IF(A.NE.-1.0.OR.LEN_IO.NE.LEN_DATA)THEN                          TRANSOU1.68     
            WRITE(6,*) 'TRANSOUT: Error in data transfer to disk'          GIE0F403.653    
            ICODE=1                                                        TRANSOU1.70     
            CMESSAGE='TRANSOUT: I/O write error'                           TRANSOU1.71     
            GOTO 999                                                       TRANSOU1.72     
          ENDIF                                                            TRANSOU1.73     
*ENDIF                                                                     GRR1F402.291    
C                                                                          TRANSOU1.74     
 999  CONTINUE                                                             TRANSOU1.75     
      RETURN                                                               TRANSOU1.76     
      END                                                                  TRANSOU1.77     
*ENDIF                                                                     TRANSOU1.78