*IF DEF,CONTROL                                                            TRANSIN1.2      
C ******************************COPYRIGHT******************************    GTS2F400.10531  
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.10532  
C                                                                          GTS2F400.10533  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.10534  
C restrictions as set forth in the contract.                               GTS2F400.10535  
C                                                                          GTS2F400.10536  
C                Meteorological Office                                     GTS2F400.10537  
C                London Road                                               GTS2F400.10538  
C                BRACKNELL                                                 GTS2F400.10539  
C                Berkshire UK                                              GTS2F400.10540  
C                RG12 2SZ                                                  GTS2F400.10541  
C                                                                          GTS2F400.10542  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.10543  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.10544  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.10545  
C Modelling at the above address.                                          GTS2F400.10546  
C ******************************COPYRIGHT******************************    GTS2F400.10547  
C                                                                          GTS2F400.10548  
CLL                                                                        TRANSIN1.3      
CLL    Subroutine: TRANSIN  ---------------------------------------        TRANSIN1.4      
CLL                                                                        TRANSIN1.5      
CLL    Purpose:                                                            TRANSIN1.6      
CLL    To transfer dump data from disk to memory en masse                  TRANSIN1.7      
CLL                                                                        TRANSIN1.8      
CLL    Tested under compiler: cft77                                        TRANSIN1.9      
CLL                                                                        TRANSIN1.10     
CLL    Tested under OS version: UNICOS 6.1.5A                              TRANSIN1.11     
CLL                                                                        TRANSIN1.12     
CLL  Model            Modification history from model version 3.0:         TRANSIN1.13     
CLL version  Date                                                          TRANSIN1.14     
CLL 3.4  16/6/94 : Change CHARACTER*(*) to CHARACTER*(80) N.Farnon         ANF0F304.36     
CLL   3.3    07/10/93 Corrected order of *CALLs to comdecks TYPSIZE        TS071093.4      
CLL                   and TYPD1.  Tracey Smith                             TS071093.5      
CLL   3.5  24/03/95    Changed OPEN to FILE_OPEN and                       GPB1F305.156    
CLL                    CLOSE to FILE_CLOSE    P.Burton                     GPB1F305.157    
CLL   4.2  11/10/96    Enable atmos-ocean coupling for MPP.                GRR1F402.86     
CLL                    (2): Swap D1 memory.                                GRR1F402.87     
CLL                    Image of D1 either copied directly from local       GRR1F402.88     
CLL                    memory or I/O from file (local to processor)        GRR1F402.89     
CLL                    under MPP. I/O kept for mean dumps. R.Rawlins       GRR1F402.90     
CLL   4.3  30/01/97    Ensure that domain decomposition is consistent      GRR0F403.22     
CLL                    with submodel. R.Rawlins                            GRR0F403.23     
CLL   4.4  01/07/97    Make transfers to the input file                    GBC6F404.207    
CLL                    well-formed.                                        GBC6F404.208    
CLL                      Author: Bob Carruthers, Cray Research.            GBC6F404.209    
CLL   4.4  11/10/97    Call CNTLALL for L_AO_D1_MEMORY. D. Robinson.       GDR5F404.11     
CLL   4.4  28/08/97    Minor tidy: replace SETPOS by SETPOS_SINGLE for     GRR0F404.1      
CLL                    MPP case. R.Rawlins                                 GRR0F404.2      
CLL                                                                        TRANSIN1.15     
CLL    Programming standard:                                               TRANSIN1.16     
CLL    UM Doc Paper 3                                                      TRANSIN1.17     
CLL                                                                        TRANSIN1.18     
CLL    Logical system components covered: C2                               TRANSIN1.19     
CLL                                                                        TRANSIN1.20     
CLL    Project tasks: C2                                                   TRANSIN1.21     
CLL                                                                        TRANSIN1.22     
CLL    External documentation:                                             TRANSIN1.23     
CLL    On-line UM document C5 - Control of means calculations              TRANSIN1.24     
CLL                                                                        TRANSIN1.25     
CLLEND --------------------------------------------------------------      TRANSIN1.26     
C*L    Interface and arguments:                                            TRANSIN1.27     

      SUBROUTINE TRANSIN(                                                   11,13@DYALLOC.3560   
*CALL ARGD1                                                                @DYALLOC.3561   
     &  LEN_DATA,NFTIN,sm_ident                                            GRR1F402.91     
     & ,ICODE,CMESSAGE)                                                    TRANSIN1.29     
C                                                                          TRANSIN1.30     
      IMPLICIT NONE                                                        TRANSIN1.31     
C                                                                          TRANSIN1.32     
      INTEGER                                                              TRANSIN1.33     
     &       LEN_DATA,            ! IN Length of model data                TRANSIN1.34     
     &       NFTIN,              ! IN Unit no for data dump                TRANSIN1.35     
     &       sm_ident,            ! IN submodel identifier                 GRR1F402.92     
     &       ICODE                ! OUT Return code; successful=0          TRANSIN1.36     
     *                            !                  error>0               TRANSIN1.37     
C                                                                          TRANSIN1.38     
      CHARACTER*(80)                                                       ANF0F304.37     
     &       CMESSAGE             ! OUT Error message if ICODE>0           TRANSIN1.40     
C                                                                          TRANSIN1.41     
*CALL TYPSIZE                                                              TS071093.6      
*CALL TYPD1                                                                TS071093.7      
*IF DEF,T3E                                                                GBC6F404.210    
*CALL CNTL_IO                                                              GBC6F404.211    
c                                                                          GBC6F404.212    
      real local_buffer(um_sector_size)                                    GBC6F404.213    
cdir$ cache_align local_buffer                                             GBC6F404.214    
*ENDIF                                                                     GBC6F404.215    
C                                                                          TRANSIN1.44     
C      Cray specific functions  UNIT,LENGTH                                TRANSIN1.45     
C                                                                          TRANSIN1.46     
C      External subroutines called                                         TRANSIN1.47     
C                                                                          TRANSIN1.48     
      EXTERNAL SETPOS                                                      GRR0F403.24     
*IF DEF,MPP                                                                GRR1F402.93     
      EXTERNAL FORT_GET_ENV,OPEN_SINGLE,CLOSE_SINGLE                       GRR1F402.94     
      EXTERNAL BUFFIN_SINGLE,SETPOS_SINGLE                                 GRR0F404.3      
      EXTERNAL CHANGE_DECOMPOSITION                                        GRR0F403.25     
*ELSE                                                                      GRR1F402.95     
      EXTERNAL FILE_OPEN,FILE_CLOSE                                        GRR1F402.96     
      EXTERNAL BUFFIN                                                      GRR0F403.26     
*ENDIF                                                                     GRR1F402.97     
C                                                                          TRANSIN1.50     
C      Local variables                                                     TRANSIN1.51     
C                                                                          TRANSIN1.52     
      INTEGER                                                              TRANSIN1.53     
     &       LEN_IO               ! No of 64-bit words buffered in/out     TRANSIN1.54     
     &      ,I                    ! loop counter                           GRR1F402.98     
     &      ,LEN_FILENAME         ! Length of FILENAME variable            GRR1F402.99     
     &      ,LL                   ! Character length of filename root      GRR1F402.100    
     &      ,decomp_standard      ! MPP domain decomposition ident         GRR0F403.27     
     &      ,disk_len_1           ! Input length for the first transfer    GBC6F404.216    
     &      ,disk_len_2           ! The remainder                          GBC6F404.217    
C                                                                          TRANSIN1.55     
      REAL                                                                 TRANSIN1.56     
     &       A                    ! Error code from UNIT                   TRANSIN1.57     
                                                                           GRR1F402.101    
      LOGICAL                                                              GRR1F402.102    
     &       D1_COPY_IN_MEMORY    ! T or F: D1 copy in memory or disk      GRR1F402.103    
                                                                           GRR1F402.104    
      CHARACTER                                                            GRR1F402.105    
     &       FILENAME*80          ! File name for copy of D1               GRR1F402.106    
                                                                           GRR1F402.107    
*CALL PARVARS                                                              GRR1F402.108    
*CALL DECOMPTP                                                             GRR0F403.28     
*CALL MPPTRANS                                                             GRR1F402.109    
*CALL CENVIR                                                               TRANSIN1.58     
*CALL CSMID                                                                GRR1F402.110    
*CALL CHSUNITS                                                             GDR5F404.12     
*CALL CNTLALL                                                              GDR5F404.13     
                                                                           GRR1F402.111    
*IF DEF,MPP                                                                GRR1F402.112    
      D1_COPY_IN_MEMORY=L_AO_D1_MEMORY       ! from COMDECK CNTLALL        GDR5F404.14     
      IF(NFTIN.EQ.FT_MEANDUMP_UNIT) THEN     ! Check for dump meaning      GRR1F402.114    
         D1_COPY_IN_MEMORY=.FALSE.                                         GRR1F402.115    
      ENDIF                                                                GRR1F402.116    
                                                                           GRR1F402.117    
      IF(D1_COPY_IN_MEMORY) THEN  ! Read from memory rather than disk      GRR1F402.118    
*IF DEF,ATMOS,AND,DEF,OCEAN                                                GRR1F402.119    
CL                                                                         GRR1F402.120    
CL     Copy D1 directly from memory for submodel                           GRR1F402.121    
CL                                                                         GRR1F402.122    
      IF(sm_ident.eq.atmos_sm) THEN                                        GRR1F402.123    
         DO I=1,LEN_DATA                                                   GRR1F402.124    
          D1(I)=D1_A(I)                                                    GRR1F402.125    
         ENDDO            ! I                                              GRR1F402.126    
      ELSEIF(sm_ident.eq.ocean_sm) THEN                                    GRR1F402.127    
         DO I=1,LEN_DATA                                                   GRR1F402.128    
          D1(I)=D1_O(I)                                                    GRR1F402.129    
         ENDDO            ! I                                              GRR1F402.130    
      ELSE                                                                 GRR1F402.131    
         CMESSAGE='TRANSIN: ERROR. Non-valid submodel identifier '         GRR1F402.132    
         write(6,*) CMESSAGE,sm_ident                                      GRR1F402.133    
         ICODE=1                                                           GRR1F402.134    
         GO TO 999                                                         GRR1F402.135    
      ENDIF                                                                GRR1F402.136    
*ENDIF                                                                     GRR1F402.137    
      write(6,*) 'TRANSIN : Copied from memory LEN_DATA=',LEN_DATA,        GRR1F402.138    
     &                      'submodel=',sm_ident                           GRR1F402.139    
                                                                           GRR1F402.140    
      ELSE                       ! Read from disk rather than memory       GRR1F402.141    
                                                                           GRR1F402.142    
CL                                                                         GRR1F402.143    
CL        Read from disk file rather than memory                           GRR1F402.144    
CL                                                                         GRR1F402.145    
      LEN_FILENAME=LEN(FILENAME)                                           GRR1F402.146    
      CALL FORT_GET_ENV(FT_ENVIRON(NFTIN),LEN_FT_ENVIR(NFTIN),             GRR1F402.147    
     &                  FILENAME,LEN_FILENAME,ICODE)                       GRR1F402.148    
                                                                           GRR1F402.149    
      IF(ICODE.NE.0) THEN                                                  GRR1F402.150    
         CMESSAGE='TRANSIN : Environment variable not set '                GRR1F402.151    
         write(6,*) 'ERROR ',CMESSAGE,FT_ENVIRON(NFTIN)                    GRR1F402.152    
         GO TO 999                                                         GRR1F402.153    
      ENDIF                                                                GRR1F402.154    
                                                                           GRR1F402.155    
C       Search for end of filename                                         GRR1F402.156    
      LL=0                                                                 GRR1F402.157    
      DO I=1,LEN_FILENAME                                                  GRR1F402.158    
        IF(FILENAME(I:I).ne.' ') THEN                                      GRR1F402.159    
           LL=LL+1                                                         GRR1F402.160    
        ENDIF                                                              GRR1F402.161    
      ENDDO    ! I over characters                                         GRR1F402.162    
                                                                           GRR1F402.163    
C       Construct filename with PE no. appended                            GRR1F402.164    
      FILENAME(LL+1:LL+1)='.'                                              GRR1F402.165    
      WRITE(FILENAME(LL+2:LL+5),'(i4.4)') mype                             GRR1F402.166    
CL                                                                         TRANSIN1.59     
CL     Read in data                                                        TRANSIN1.60     
CL                                                                         GRR1F402.167    
        CALL OPEN_SINGLE(NFTIN,FILENAME,LL+5,0,1,ICODE)                    GRR1F402.168    
        CALL SETPOS_SINGLE(NFTIN,0,ICODE)                                  GRR0F404.4      
*IF DEF,T3E                                                                GBC6F404.218    
c--compute the length of the first read                                    GBC6F404.219    
        disk_len_1=(len_data/um_sector_size)*um_sector_size                GBC6F404.220    
        call buffin_single(nftin, d1(1), disk_len_1, len_io, a)            GBC6F404.221    
        if(a.ne.-1. .or. len_io.ne.disk_len_1) then                        GBC6F404.222    
          write(6,*) 'TRANSIN: Error in data transfer from disk',          GBC6F404.223    
     2     '  A = ',a,'  LEN_IO = ',len_io,                                GBC6F404.224    
     3     '  Length Requested = ',disk_len_1                              GBC6F404.225    
          icode=1                                                          GBC6F404.226    
          cmessage='TRANSIN: I/O read error'                               GBC6F404.227    
          goto 999                                                         GBC6F404.228    
        endif                                                              GBC6F404.229    
c--now the remainder                                                       GBC6F404.230    
        disk_len_2=len_data-disk_len_1                                     GBC6F404.231    
        if(disk_len_2.gt.0) then                                           GBC6F404.232    
          call buffin_single(nftin, local_buffer(1),                       GBC6F404.233    
     2     um_sector_size, len_io, a)                                      GBC6F404.234    
          if(a.ne.-1. .or. len_io.ne.um_sector_size) then                  GBC6F404.235    
            write(6,*) 'TRANSIN: Error in data transfer from disk',        GBC6F404.236    
     2       '  A = ',a,'  LEN_IO = ',len_io,                              GBC6F404.237    
     3       '  Length Requested = ',um_sector_size                        GBC6F404.238    
            icode=1                                                        GBC6F404.239    
            cmessage='TRANSIN: I/O read error'                             GBC6F404.240    
            goto 999                                                       GBC6F404.241    
          endif                                                            GBC6F404.242    
c--copy the rest of the data over                                          GBC6F404.243    
          do i=1, disk_len_2                                               GBC6F404.244    
            d1(disk_len_1+i)=local_buffer(i)                               GBC6F404.245    
          end do                                                           GBC6F404.246    
        endif                                                              GBC6F404.247    
        call close_single(nftin, filename, ll+5, 1, 0, icode)              GBC6F404.248    
        write(6,*) 'TRANSIN: Length transferred = ', len_data              GBC6F404.249    
*ELSE                                                                      GBC6F404.250    
        CALL BUFFIN_SINGLE(NFTIN,D1(1),LEN_DATA,LEN_IO,A)                  GSM1F403.323    
CL                                                                         GRR1F402.171    
CL----------------------------------------------------------------------   GRR1F402.172    
CL     Check for errors in data transfer from disk                         GRR1F402.173    
CL----------------------------------------------------------------------   GRR1F402.174    
CL                                                                         GRR1F402.175    
        CALL CLOSE_SINGLE(NFTIN,FILENAME,LL+5,1,0,ICODE)                   GRR1F402.176    
          WRITE(6,*) 'TRANSIN: Length transferred=',LEN_IO                 GIE0F403.646    
          IF(A.NE.-1.0.OR.LEN_IO.NE.LEN_DATA)THEN                          GRR1F402.178    
            WRITE(6,*) 'TRANSIN: Error in data transfer from disk'         GIE0F403.647    
            ICODE=1                                                        GRR1F402.180    
            CMESSAGE='TRANSIN: I/O read error'                             GRR1F402.181    
            GOTO 999                                                       GRR1F402.182    
          ENDIF                                                            GRR1F402.183    
*ENDIF                                                                     GBC6F404.251    
      ENDIF                       ! End of disk/memory block               GRR1F402.184    
                                                                           GRR1F402.185    
*IF DEF,ATMOS,AND,DEF,OCEAN                                                GRR0F403.29     
CL                                                                         GRR0F403.30     
CL    Ensure that domain decomposition is consistent with submodel         GRR0F403.31     
CL                                                                         GRR0F403.32     
      IF(sm_ident.EQ.atmos_sm) THEN                                        GRR0F403.33     
         decomp_standard = decomp_standard_atmos                           GRR0F403.34     
      ELSEIF(sm_ident.EQ.ocean_sm) THEN                                    GRR0F403.35     
         decomp_standard = decomp_standard_ocean                           GRR0F403.36     
      ENDIF                                                                GRR0F403.37     
                                                                           GRR0F403.38     
      CALL CHANGE_DECOMPOSITION(decomp_standard,ICODE)                     GRR0F403.39     
*ENDIF                                                                     GRR0F403.40     
                                                                           GRR0F403.41     
*ELSE                                                                      GRR1F402.186    
                                                                           GRR1F402.187    
CL                                                                         GRR1F402.188    
CL     Read in data (non-MPP)                                              GRR1F402.189    
CL                                                                         TRANSIN1.61     
        CALL FILE_OPEN(NFTIN,FT_ENVIRON(NFTIN),                            GPB1F305.158    
     &            LEN_FT_ENVIR(NFTIN),0,0,ICODE)                           GPB1F305.159    
        CALL SETPOS(NFTIN,0,ICODE)                                         GTD0F400.131    
        CALL BUFFIN(NFTIN,D1(1),LEN_DATA,LEN_IO,A)                         TRANSIN1.65     
CL                                                                         TRANSIN1.66     
CL----------------------------------------------------------------------   TRANSIN1.67     
CL     Check for errors in data transfer from disk                         TRANSIN1.68     
CL----------------------------------------------------------------------   TRANSIN1.69     
CL                                                                         TRANSIN1.70     
        CALL FILE_CLOSE(NFTIN,FT_ENVIRON(NFTIN),LEN_FT_ENVIR(NFTIN),       GTD0F400.38     
     &                  0,0,ICODE)                                         GTD0F400.39     
          WRITE(6,*) 'TRANSIN: Length transferred=',LEN_IO                 GIE0F403.648    
          IF(A.NE.-1.0.OR.LEN_IO.NE.LEN_DATA)THEN                          TRANSIN1.73     
            WRITE(6,*) 'TRANSIN: Error in data transfer from disk'         GIE0F403.649    
            ICODE=1                                                        TRANSIN1.75     
            CMESSAGE='TRANSIN: I/O read error'                             TRANSIN1.76     
            GOTO 999                                                       TRANSIN1.77     
          ENDIF                                                            TRANSIN1.78     
*ENDIF                                                                     GRR1F402.190    
C                                                                          TRANSIN1.79     
 999  CONTINUE                                                             TRANSIN1.80     
      RETURN                                                               TRANSIN1.81     
      END                                                                  TRANSIN1.82     
*ENDIF                                                                     TRANSIN1.83