*IF DEF,CONTROL                                                            U_MODEL1.2      
C ******************************COPYRIGHT******************************    GTS2F400.11017  
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.11018  
C                                                                          GTS2F400.11019  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.11020  
C restrictions as set forth in the contract.                               GTS2F400.11021  
C                                                                          GTS2F400.11022  
C                Meteorological Office                                     GTS2F400.11023  
C                London Road                                               GTS2F400.11024  
C                BRACKNELL                                                 GTS2F400.11025  
C                Berkshire UK                                              GTS2F400.11026  
C                RG12 2SZ                                                  GTS2F400.11027  
C                                                                          GTS2F400.11028  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.11029  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.11030  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.11031  
C Modelling at the above address.                                          GTS2F400.11032  
C ******************************COPYRIGHT******************************    GTS2F400.11033  
C                                                                          GTS2F400.11034  
CLL  Subroutine: U_MODEL -----------------------------------------------   @DYALLOC.3570   
CLL                                                                        U_MODEL1.4      
CLL  Purpose: High level control program for the Unified Model             @DYALLOC.3571   
CLL           (master routine).  Calls lower level control routines        U_MODEL1.6      
CLL           according to top level switch settings. Called by            @DYALLOC.3572   
CLL           top level routine UMSHELL which provides dimension sizes     @DYALLOC.3573   
CLL           for dynamic allocation of data arrays.                       @DYALLOC.3574   
CLL                                                                        U_MODEL1.8      
CLL  Tested under compiler:   cft77                                        U_MODEL1.9      
CLL  Tested under OS version: UNICOS 6.1.5A                                U_MODEL1.10     
CLL                                                                        U_MODEL1.11     
CLL  Model            Modification history from model version 3.0:         U_MODEL1.12     
CLL version  date                                                          U_MODEL1.13     
CLL  3.1   9/02/93 : reodered comdecks to define NUNITS for CCONTROL.      RB300993.130    
CLL  3.2  27/03/93 Change U_MODEL to be a called routine to provide        RB300993.131    
CLL                 dynamic allocation of main data arrays. R.Rawlins.     @DYALLOC.3576   
CLL   3.3  02/12/93  Correct logic for dumping/climate meaning in SLAB     TJ061293.1      
CLL                  model, which uses same dump for "ocean" fields. TCJ   TJ061293.2      
CLL  3.3  30/09/93 Option on frequency of convection scheme calls,         RB300993.132    
CLL                 using COMDECK ARGCNVI.               R.T.H.Barnes.     RB300993.133    
CLL   3.3  04/10/93 : introduce RESETOCN to ensure repeatability across    TJ230793.1      
CLL   3.4  08/06/94  Arguments LLBOUTA,LCAL360 passed to GEN_INTF          GSS1F304.713    
CLL                  Comdeck C_GLOBAL *CALLed                              GSS1F304.714    
CLL                  Arguments LANCILA, LANCILO, LCAL360 passed            GSS1F304.715    
CLL                                                     to UP_ANCIL        GSS1F304.716    
CLL                  Argument LCAL360 passed to MEANCTL, PRINTCTL,         GSS1F304.717    
CLL                    SET_HISTORY_VALUES                                  GSS1F304.718    
CLL                                              S.J.Swarbrick             GSS1F304.719    
CLL                   restarts if ocean prog fields 32-bit in dump (TCJ)   TJ230793.2      
CLL  3.4  21/03/94  Add lowest conv.cloud diagnostics.  R.T.H.Barnes.      ARN2F304.106    
CLL  3.5  18/04/95  Stage 1 submodel changes, replace ISUBMODL and         GRR2F305.608    
CLL                 generalise internal models. R. Rawlins                 GRR2F305.609    
CLL  3.5  Apr. 95   Submodels project:                                     GSS1F305.891    
CLL                 Introduce *CALL ARGPPX, *CALL PPXLOOK to pass in and   GSS1F305.892    
CLL                 dynamically allocate ppx look-up arrays.               GSS1F305.893    
CLL                 Introduce CALL GETPPX_PART to read from ppxref file    GSS1F305.894    
CLL                 those records which correspond to records in the       GSS1F305.895    
CLL                 STASH list. These ppx records are read into the ppx    GSS1F305.896    
CLL                 look-up arrays.                                        GSS1F305.897    
CLL                 S.J.Swarbrick                                          GSS1F305.898    
CLL  4.1  29/02/96  Introduce Wave sub-model.  RTHBarnes.                  WRB1F401.1133   
!    4.1  10/05/96  Remove LENRIMDATA_A from UP_BOUND argument list.       APB4F401.531    
!                   D. Robinson                                            APB4F401.532    
!    4.1  18/06/96  Changes to cope with changes in STASH addressing       GDG0F401.1473   
!                   Author D.M. Goddard.                                   GDG0F401.1474   
CLL   4.1  22/05/96  Replaced *DEF FAST with FRADIO to allow fast          GGH3F401.37     
CLL                  radiation i/o code to be used. G Henderson            GGH3F401.38     
CLL  4.2  11/10/96  Enable atmos-ocean coupling for MPP.                   GRR0F402.23     
CLL                 (1): Coupled fields. Get global sizes for SWAP         GRR0F402.24     
CLL                 routines. R. Rawlins                                   GRR0F402.25     
!  4.2  23/08/96  If MPP, only write history file from PE 0. RTHBarnes.    ARB1F402.788    
!LL  4.3  29/05/97  Enable coupled models with dump frequencies            GKR1F404.260    
!LL                 different to their coupling period to be               GKR1F404.261    
!LL                 restartable after a crash. K Rogers                    GKR1F404.262    
!LL  4.3  30/05/97  Added internal model to EXITCHEK arg list. K Rogers    GKR7F403.12     
!LL  4.3  02/04/97  Add extra WRITD1 args to DUMPCTL. K Rogers             GKR4F403.31     
!LL  4.4  28/10/97  Change RADINCS dimension. S.D.Mullerworth              ARE2F404.529    
!LL  4.3  08/05/97  Added barrier before start of timesteps  P.Burton      GPB5F403.89     
!LL  4.3  09/07/97  Changed barrier to portable gsync.  P.Burton           GPB1F404.89     
!LL  4.4  01/07/97  Added alignment directive to force D1 on to            GBC6F404.317    
!LL                 an SCACHE line boundary.                               GBC6F404.318    
!LL                   Author: Bob Carruthers, Cray Research.               GBC6F404.319    
!LL  4.5  08/01/98  T3E only: Flush unit 6 at the end of every             GPB0F405.13     
!LL                 timestep.                         P.Burton             GPB0F405.14     
!LL  4.5  09/11/98  Change test around history file updates to work        GKR2F405.13     
!LL                 correctly for slab model. K Rogers                     GKR2F405.14     
!LL  4.5  01/07/98  Calculate required dimensions of CO2 arrays            CCN1F405.85     
!LL                 in SWAPA2O and SWAPO2A. C.D.Jones.                     CCN1F405.86     
!LL  4.5  17/08/98  Print date/time at start and end of UM Job.            GDR3F405.28     
!                   D. Robinson.                                           GDR3F405.29     
!LL  4.5  10/10/98  Pass ARTINFO to MEANCTL. D. Robinson.                  GMB1F405.413    
!LL                 Pass new arguments to PP_CTL and GEN_INTF. M. Bell.    GMB1F405.414    
CLL                                                                        U_MODEL1.14     
CLL  Programming standard: UM Doc Paper 3, version 2 (7/9/90)              U_MODEL1.15     
CLL                                                                        U_MODEL1.16     
CLL  Logical components covered: C0                                        U_MODEL1.17     
CLL                                                                        U_MODEL1.18     
CLL  Project task: C0                                                      U_MODEL1.19     
CLL                                                                        U_MODEL1.20     
CLL  External documentation: On-line UM document C0 - The top-level        U_MODEL1.21     
CLL                          control system                                U_MODEL1.22     
CLL                                                                        U_MODEL1.23     
CLL  -------------------------------------------------------------------   U_MODEL1.24     

      SUBROUTINE U_MODEL(                                                   1,109@DYALLOC.3577   
     &       NFT,NFTU,                                                     GSS2F401.492    
*CALL ARGSZSP                                                              @DYALLOC.3578   
*CALL ARGSZSPA                                                             @DYALLOC.3579   
*CALL ARGSZSPO                                                             @DYALLOC.3580   
*CALL ARGSZSPW                                                             WRB1F401.1134   
*CALL ARGSZSPC                                                             @DYALLOC.3581   
*CALL ARGSIZE                                                              @DYALLOC.3582   
     &        P_FIELDDA_CONV,Q_LEVELSDA,                                   RB300993.134    
*IF DEF,FRADIO                                                             GGH3F401.39     
     &        P_FIELDDA,P_LEVELSDA,                                        @DYALLOC.3584   
*ENDIF                                                                     @DYALLOC.3585   
     & ppxRecs,ICODE,CMESSAGE)                                             GSS1F400.988    
                                                                           @DYALLOC.3587   
      IMPLICIT NONE                                                        @DYALLOC.3588   
                                                                           @DYALLOC.3589   
C*L  Interface and arguments: ------------------------------------------   U_MODEL1.25     
CL       Sizes of super arrays                                             @DYALLOC.3590   
*CALL TYPSZSP                                                              @DYALLOC.3591   
*CALL TYPSZSPA                                                             @DYALLOC.3592   
*CALL TYPSZSPO                                                             @DYALLOC.3593   
*CALL TYPSZSPW                                                             WRB1F401.1135   
*CALL TYPSZSPC                                                             @DYALLOC.3594   
CL                                                                         @DYALLOC.3595   
CL       Model sizes                                                       @DYALLOC.3596   
*CALL TYPSIZE                                                              @DYALLOC.3597   
CL                                                                         @DYALLOC.3598   
      INTEGER                                                              RB300993.135    
     & P_FIELDDA_CONV !copy of P_FIELD_CONV for portability of dyn.alloc   RB300993.136    
     &,Q_LEVELSDA ! copy of Q_LEVELS for portability of dynamic allocn.    RB300993.137    
*IF DEF,FRADIO                                                             GGH3F401.40     
     &,P_FIELDDA  ! copy of P_FIELD for portability of dynamic allocn.     RB300993.138    
     &,P_LEVELSDA ! copy of P_LEVELS for portability of dynamic allocn.    RB300993.139    
*ENDIF                                                                     @DYALLOC.3603   
CL       Addresses of component arrays within super arrays                 @DYALLOC.3604   
*CALL SPINDEX                                                              @DYALLOC.3605   
CL                                                                         @DYALLOC.3606   
      CHARACTER*80 CMESSAGE     ! OUT - Error message                      WRB1F401.1136   
      INTEGER ICODE             ! OUT - Return code                        @DYALLOC.3608   
C*----------------------------------------------------------------------   U_MODEL1.29     
C                                                                          U_MODEL1.31     
C  Common blocks                                                           U_MODEL1.32     
C                                                                          U_MODEL1.33     
*CALL CMAXSIZE                                                             GDR3F405.30     
*CALL CSUBMODL                                                             GRR2F305.610    
*CALL CHSUNITS                                                             GDR3F305.186    
*CALL CHISTORY                                                             RS030293.240    
*CALL CCONTROL                                                             U_MODEL1.34     
*CALL CTIME                                                                GDR3F405.31     
*CALL CINTFA                                                               GDR3F405.32     
*CALL C_GLOBAL                                                             GSS1F304.720    
*CALL PARVARS                                                              ARB1F402.789    
CL                                                                         GSS1F304.721    
!  Dynamic allocation of ppxref look-up arrays and declaration of          GSS1F305.900    
!                                            ppxref pointer array.         GSS1F305.901    
*CALL CPPXREF                                                              GSS1F305.902    
*CALL PPXLOOK                                                              GSS1F305.903    
*CALL DECOMPTP                                                             GRR0F402.26     
*CALL DECOMPDB                                                             GRR0F402.27     
C                                                                          U_MODEL1.38     
C  Subroutines called                                                      U_MODEL1.39     
C                                                                          U_MODEL1.40     
      EXTERNAL INITIAL,EXITCHEK,SETGRCTL,SETTSCTL,                         U_MODEL1.41     
     &         INCRTIME,DUMPCTL,PRINTCTL,GEN_INTF,MEANCTL,TEMPHIST,        U_MODEL1.42     
     &         UP_ANCIL,UP_BOUND,GETPPX_PART,                              GSS1F305.904    
     &         EXITPROC,EREPORT,ABORT,                                     U_MODEL1.44     
     &         TIMER,PPCTL,JOBCTL,SET_HISTORY_VALUES                       U_MODEL1.45     
*IF DEF,ATMOS                                                              U_MODEL1.46     
     *        ,ATM_STEP,RESETATM                                           U_MODEL1.47     
*ENDIF                                                                     U_MODEL1.48     
*IF DEF,OCEAN                                                              U_MODEL1.49     
     *        ,OCN_STEP,RESETOCN                                           TJ230793.3      
*ENDIF                                                                     U_MODEL1.51     
*IF DEF,SLAB                                                               U_MODEL1.52     
     *        ,SLABSTEP                                                    U_MODEL1.53     
*ENDIF                                                                     U_MODEL1.54     
*IF DEF,WAVE                                                               WRB1F401.1137   
     *        ,WAV_STEP                                                    WRB1F401.1138   
*ENDIF                                                                     WRB1F401.1139   
*IF DEF,ATMOS,AND,DEF,OCEAN                                                U_MODEL1.55     
     *        ,SWAP_A2O,SWAP_O2A                                           U_MODEL1.56     
*ENDIF                                                                     U_MODEL1.57     
CL                                                                         @DYALLOC.3609   
CL  DYNAMIC ALLOCATION OF SUPER ARRAYS:                                    @DYALLOC.3610   
CL                                                                         @DYALLOC.3611   
CL       Main D1 data array                                                @DYALLOC.3612   
*CALL TYPSPD1                                                              @DYALLOC.3613   
cdir$ cache_align spd1                                                     GBC6F404.320    
CL                                                                         @DYALLOC.3614   
CL       STASH related arrays                                              @DYALLOC.3615   
*CALL TYPSPST                                                              @DYALLOC.3616   
CL                                                                         @DYALLOC.3617   
CL       Dump headers and lookups                                          @DYALLOC.3618   
*CALL TYPSPDUA                                                             @DYALLOC.3619   
*CALL TYPSPDUO                                                             @DYALLOC.3620   
*CALL TYPSPDUW                                                             WRB1F401.1140   
CL                                                                         @DYALLOC.3621   
CL       Pointers (addresses) of model variables and constants             @DYALLOC.3622   
*CALL TYPSPPTA                                                             @DYALLOC.3623   
*CALL TYPSPPTO                                                             @DYALLOC.3624   
*CALL TYPSPPTW                                                             WRB1F401.1141   
CL Maximum sizes of fields limited by User Interface                       GDR3F305.187    
CL CMAXSIZE now included earlier in routine                                GDR3F305.188    
CL                                                                         @DYALLOC.3628   
CL       Model derived constants arrays                                    @DYALLOC.3629   
*CALL TYPSPCOA                                                             @DYALLOC.3630   
*CALL TYPSPCOO                                                             @DYALLOC.3631   
*CALL TYPSPCOW                                                             WRB1F401.1142   
CL                                                                         @DYALLOC.3632   
CL       Generation of output interface fields                             @DYALLOC.3633   
*CALL TYPSPINA                                                             @DYALLOC.3634   
*CALL TYPSPINO                                                             @DYALLOC.3635   
*CALL TYPSPINW                                                             WRB1F401.1143   
CL                                                                         @DYALLOC.3636   
CL       Updating of model from ancillary files                            @DYALLOC.3637   
*CALL TYPSPANA                                                             @DYALLOC.3638   
*CALL TYPSPANO                                                             @DYALLOC.3639   
*CALL TYPSPANW                                                             WRB1F401.1144   
CL                                                                         @DYALLOC.3640   
CL       Boundary updating for Limited Area Models                         @DYALLOC.3641   
*CALL TYPSPBO                                                              @DYALLOC.3642   
*CALL TYPSPBOA                                                             @DYALLOC.3643   
*CALL TYPSPBOO                                                             @DYALLOC.3644   
*CALL TYPSPBOW                                                             WRB1F401.1145   
CL                                                                         @DYALLOC.3645   
CL       Coupled model arrays (atmosphere-ocean)                           @DYALLOC.3646   
*CALL TYPSPCPL                                                             @DYALLOC.3647   
CL                                                                         @DYALLOC.3648   
CL       Convection increments arrays                                      RB300993.140    
CL Only used when convection scheme not called every timestep,             RB300993.141    
CL otherwise first dimension set to 1.                                     RB300993.142    
C  Same as *CALL TYPCNVI but 'DA' sizes for portability of dyn.allocn.     RB300993.143    
      REAL                                                                 RB300993.144    
     & CNVINCS(P_FIELDDA_CONV,Q_LEVELSDA,2) ! Conv.increments, TH & Q      RB300993.145    
     &,CNV_RAIN(P_FIELDDA_CONV)             ! Conv.rain amount             RB300993.146    
     &,CNV_SNOW(P_FIELDDA_CONV)             ! Conv.snow amount             RB300993.147    
     &,CNV_CCW(P_FIELDDA_CONV,Q_LEVELSDA)   ! Conv.cloud water amount      RB300993.148    
     &,CNV_LA(P_FIELDDA_CONV)   !INOUT Lowest conv.cloud amount            ARN2F304.107    
     &,CNV_LP(P_FIELDDA_CONV)   !INOUT Lowest conv.cloud liq.water path    ARN2F304.108    
      INTEGER                                                              ARN2F304.109    
     & CNV_LB(P_FIELDDA_CONV)   !INOUT Lowest conv.cloud base level        ARN2F304.110    
     &,CNV_LT(P_FIELDDA_CONV)   !INOUT Lowest conv.cloud top level         ARN2F304.111    
*IF DEF,FRADIO                                                             GGH3F401.41     
CL                                                                         RB300993.149    
CL       Radiation increments array (*IF DEF,FRADIO)                       GGH3F401.42     
C same as *CALL CRADINCS but with copies for portability of dyn.allocn.    @DYALLOC.3651   
CL The dimension of radincrs kept as for -*DEF,FRADIO which requires 512   GGH3F401.43     
CL word blocking.                                                          @DYALLOC.3653   
      REAL                           ! RADIATION INCRS (SW+LW)             @DYALLOC.3654   
     &    RADINCS ( (P_FIELDDA*(P_LEVELSDA+3)+511)/512*512*2 )             ARE2F404.530    
*ENDIF                                                                     @DYALLOC.3656   
C                                                                          U_MODEL1.58     
C  Local variables                                                         U_MODEL1.59     
C                                                                          U_MODEL1.60     
      INTEGER internal_model    ! Work - Internal model identifier         GRR2F305.611    
      INTEGER internal_model_prev!Work - Previous internal model ident     GRR2F305.612    
      INTEGER submodel          ! Work - Submodel id for dump partition    GRR2F305.613    
      INTEGER submodel_prev     ! Work - Previous submodel dump id         GRR2F305.614    
      INTEGER NGROUP            ! Work - Number of steps in "group"        U_MODEL1.62     
      INTEGER MEANLEV           ! Work - Mean level indicator              U_MODEL1.63     
      INTEGER IABORT            ! Work - Internal return code              @DYALLOC.3657   
      INTEGER I_STEP            ! Work - Loop counter over timesteps       U_MODEL1.65     
      INTEGER G_P_FIELD         ! Sizes for MPP dynamic allocation         GRR0F402.28     
     &       ,G_IMTJMT          ! in A-O coupling routines                 GRR0F402.29     
      LOGICAL LEXITNOW          ! Work - Immediate exit indicator          U_MODEL1.67     
      CHARACTER*14 PPNAME       ! Work - Dummy PP filename                 U_MODEL1.68     
      INTEGER NFT           ! Unit no. for standard STASHmaster files      GSS2F401.493    
      INTEGER NFTU          ! Do. user STASH files (for GET_FILE)          GSS2F401.494    
      INTEGER RowNumber     ! Row no. counter for PPXI, PPXC arrays        GSS2F401.495    
      INTEGER I,J,K         ! Loop counters                                GSS2F401.496    
      INTEGER CO2_DIMA,            ! CO2 array dimensions                  CCN1F405.87     
     &        CO2_DIMO,                                                    CCN1F405.88     
     &        CO2_DIMO2                                                    CCN1F405.89     
*IF DEF,MPP                                                                ARB1F402.790    
      Integer info   ! Return code from GCom routines                      ARB1F402.791    
*ENDIF                                                                     ARB1F402.792    
C                                                                          U_MODEL1.69     
                                                                           GDR3F405.33     
      integer len_runid       !  No of chars in RUNID                      GDR3F405.34     
      integer um_lbc_coup     !  LBC Coupling Switch : 1/0 is on/off       GDR3F405.35     
                                                                           GDR3F405.36     
      character*80 filename     !  Filename of communication file.         GDR3F405.37     
      character*8 c_lbc_coup    !  Character variable to read env var      GDR3F405.38     
      character*8 ch_date2      !  Date returned from date_and_time        GDR3F405.39     
      character*10 ch_time2     !  Time returned from date_and_time        GDR3F405.40     
      character*5 runid_char    !  RUNID for job                           GDR3F405.41     
      character*4 runtype_char  !  Run Type (ie. NRUN, CRUN)               GDR3F405.42     
      integer get_char_len      !  Function to get no of char in string    GDR3F405.43     
      integer lbc_ntimes        !  No of BCs in communication file.        GDR3F405.44     
      integer ms_ntimes         !  No of BCs required in mesoscale.        GDR3F405.45     
      integer len_wait_tot      !  Total wait for availability of BCs      GDR3F405.46     
*IF DEF,MPP                                                                GDR3F405.47     
      integer iostatus          !  Error code                              GDR3F405.48     
*ENDIF                                                                     GDR3F405.49     
      integer*8 isleep          !  Return value from SLEEP                 GDR3F405.50     
      integer*8 sleep           !  SLEEP function to make job wait         GDR3F405.51     
                                                                           GDR3F405.52     
      logical l_exist           !  T : Communication File exists           GDR3F405.53     
      logical l_active          !  T : Output stream active for LBCs.      GDR3F405.54     
                                                                           GDR3F405.55     
*CALL LBC_COUP                                                             GDR3F405.56     
                                                                           GDR3F405.57     
CL----------------------------------------------------------------------   U_MODEL1.70     
CL 0. Start Timer call for U_MODEL (NB: not conditional on LTIMER)         @DYALLOC.3658   
CL                                                                         U_MODEL1.72     
      IF (LTIMER) THEN                                                     GSM1F401.26     
        CALL TIMER('U_MODEL ',3)                                           GSM1F401.27     
      END IF                                                               GSM1F401.28     
                                                                           GDR3F405.58     
!     Find out if LBC Coupling has been switched on this run               GDR3F405.59     
!     from the env. variable UM_LBC_COUP.                                  GDR3F405.60     
                                                                           GDR3F405.61     
      call fort_get_env('UM_LBC_COUP',11,c_lbc_coup,8,icode)               GDR3F405.62     
      if (icode.ne.0) then                                                 GDR3F405.63     
        um_lbc_coup = 0 ! No coupling                                      GDR3F405.64     
        write (6,*) ' Env Var UM_LBC_COUP not set.'                        GDR3F405.65     
        write (6,*) ' Setting UM_LBC_COUP to ',um_lbc_coup                 GDR3F405.66     
      else                                                                 GDR3F405.67     
        read(c_lbc_coup,'(i8)') um_lbc_coup                                GDR3F405.68     
        write (6,*) ' UM_LBC_COUP is set to ',UM_LBC_COUP                  GDR3F405.69     
      endif                                                                GDR3F405.70     
      if (um_lbc_coup.eq.0 .or. um_lbc_coup.eq.1) then                     GDR3F405.71     
        l_lbc_coup = um_lbc_coup.eq.1                                      GDR3F405.72     
      else                                                                 GDR3F405.73     
        write (6,*) ' Invalid value given to UM_LBC_COUP ',                GDR3F405.74     
     &  UM_LBC_COUP                                                        GDR3F405.75     
        write (6,*) ' Valid values are 0 or 1'                             GDR3F405.76     
        write (6,*) ' L_LBC_COUP set to F. No LBC Coupling ',              GDR3F405.77     
     &  'in this run.'                                                     GDR3F405.78     
        cmessage = 'U_MODEL : Invalid value given to UM_LBC_COUP'          GDR3F405.79     
        icode = 100                                                        GDR3F405.80     
        go to 999   !  Return                                              GDR3F405.81     
      endif                                                                GDR3F405.82     
                                                                           GDR3F405.83     
      if (l_lbc_coup) then                                                 GDR3F405.84     
        write (6,*) ' LBC COUPLING switched on in this run.'               GDR3F405.85     
      else                                                                 GDR3F405.86     
        write (6,*) ' LBC COUPLING switched off in this run.'              GDR3F405.87     
      endif                                                                GDR3F405.88     
                                                                           GDR3F405.89     
      if (l_lbc_coup) then                                                 GDR3F405.90     
                                                                           GDR3F405.91     
*IF DEF,ATMOS,AND,DEF,GLOBAL                                               GDR3F405.92     
                                                                           GDR3F405.93     
!       Find out which LBC output stream is providing the data             GDR3F405.94     
!       from the env. variable UM_LBC_STREAM.                              GDR3F405.95     
                                                                           GDR3F405.96     
        call fort_get_env('UM_LBC_STREAM',13,c_lbc_coup,8,icode)           GDR3F405.97     
        if (icode.ne.0) then                                               GDR3F405.98     
          um_lbc_stream = 0 ! No coupling                                  GDR3F405.99     
          write (6,*) ' gl : Env Var UM_LBC_STREAM not set.'               GDR3F405.100    
          write (6,*) ' gl : Setting UM_LBC_STREAM to ',um_lbc_stream      GDR3F405.101    
        else                                                               GDR3F405.102    
          read(c_lbc_coup,'(i8)') um_lbc_stream                            GDR3F405.103    
          write (6,*) ' gl : UM_LBC_STREAM is set to ',UM_LBC_STREAM       GDR3F405.104    
        endif                                                              GDR3F405.105    
                                                                           GDR3F405.106    
!       Check validity of UM_LBC_STREAM                                    GDR3F405.107    
                                                                           GDR3F405.108    
        if (um_lbc_stream.lt.1.or.um_lbc_stream.gt.max_n_intf_a) then      GDR3F405.109    
          write (6,*) ' gl : UM_LBC_STREAM = ',UM_LBC_STREAM,              GDR3F405.110    
     &    ' is an invalid value.'                                          GDR3F405.111    
          write (6,*) ' gl : Valid values are 1-',MAX_N_INTF_A             GDR3F405.112    
          cmessage = 'U_MODEL : Invalid value given to UM_LBC_STREAM'      GDR3F405.113    
          icode = 101                                                      GDR3F405.114    
          go to 999   !  Return                                            GDR3F405.115    
        endif                                                              GDR3F405.116    
                                                                           GDR3F405.117    
!       Check if this output stream is active.                             GDR3F405.118    
        l_active = .false.                                                 GDR3F405.119    
        do j=1,n_intf_a                                                    GDR3F405.120    
        l_active = l_active .or. um_lbc_stream.eq.lbc_stream_a(j)          GDR3F405.121    
        enddo                                                              GDR3F405.122    
        if (.not.l_active) then                                            GDR3F405.123    
          write (6,*) ' gl : Output LBC stream ',UM_LBC_STREAM,            GDR3F405.124    
     &                ' is inactive. Check UM_LBC_STREAM.'                 GDR3F405.125    
          write (6,*) ' gl : Active LBC streams are ',                     GDR3F405.126    
     &                (LBC_STREAM_A(j),j=1,n_intf_a)                       GDR3F405.127    
          cmessage = 'U_MODEL : Output LBC stream is inactive.'            GDR3F405.128    
          icode = 101                                                      GDR3F405.129    
          go to 999   !  Return                                            GDR3F405.130    
        endif                                                              GDR3F405.131    
                                                                           GDR3F405.132    
                                                                           GDR3F405.133    
*ENDIF                                                                     GDR3F405.134    
*IF DEF,ATMOS,AND,-DEF,GLOBAL                                              GDR3F405.135    
                                                                           GDR3F405.136    
!       Find out how long the mesoscale is to wait if there                GDR3F405.137    
!       are insufficient boundary conditions to proceed.                   GDR3F405.138    
                                                                           GDR3F405.139    
        call fort_get_env('UM_LBC_WAIT',11,c_lbc_coup,8,icode)             GDR3F405.140    
        if (icode.ne.0) then                                               GDR3F405.141    
          um_lbc_wait = 0 ! No waiting                                     GDR3F405.142    
          write (6,*) ' ms : Env Var UM_LBC_WAIT not set.'                 GDR3F405.143    
          write (6,*) ' ms : Setting UM_LBC_WAIT to ',um_lbc_wait          GDR3F405.144    
        else                                                               GDR3F405.145    
          read(c_lbc_coup,'(i8)') um_lbc_wait                              GDR3F405.146    
          write (6,*) ' ms : UM_LBC_WAIT is set to ',um_lbc_wait           GDR3F405.147    
        endif                                                              GDR3F405.148    
                                                                           GDR3F405.149    
!       Find out maximum wait if there are insufficient                    GDR3F405.150    
!       boundary conditions to proceed.                                    GDR3F405.151    
                                                                           GDR3F405.152    
        call fort_get_env('UM_LBC_WAIT_MAX',15,c_lbc_coup,8,icode)         GDR3F405.153    
        if (icode.ne.0) then                                               GDR3F405.154    
          um_lbc_wait_max = 0 ! No waiting                                 GDR3F405.155    
          write (6,*) ' ms : Env Var UM_LBC_WAIT_MAX not set.'             GDR3F405.156    
          write (6,*) ' ms : Setting UM_LBC_WAIT_MAX to ',                 GDR3F405.157    
     &                  um_lbc_wait_max                                    GDR3F405.158    
        else                                                               GDR3F405.159    
          read(c_lbc_coup,'(i8)') um_lbc_wait_max                          GDR3F405.160    
          write (6,*) ' ms : UM_LBC_WAIT_MAX is set to ',UM_LBC_WAIT_MAX   GDR3F405.161    
        endif                                                              GDR3F405.162    
*ENDIF                                                                     GDR3F405.163    
                                                                           GDR3F405.164    
      endif  !  if l_lbc_coup                                              GDR3F405.165    
                                                                           GDR3F405.166    
*IF DEF,ATMOS,AND,DEF,GLOBAL                                               GDR3F405.167    
                                                                           GDR3F405.168    
      if (l_lbc_coup) then                                                 GDR3F405.169    
                                                                           GDR3F405.170    
*IF DEF,MPP                                                                GDR3F405.171    
        if (mype.eq.0) then                                                GDR3F405.172    
*ENDIF                                                                     GDR3F405.173    
                                                                           GDR3F405.174    
!         Get filename attached to Unit 190                                GDR3F405.175    
          CALL GET_FILE(190,filename,80,ICODE)                             GDR3F405.176    
                                                                           GDR3F405.177    
          if (icode.ne.0) then                                             GDR3F405.178    
            write (6,*) ' gl : Problem with GET_FILE',                     GDR3F405.179    
     &      ' for Unit No 190.'                                            GDR3F405.180    
            write (6,*) ' gl : Return code from GET_FILE ',icode           GDR3F405.181    
            write (cmessage,*)                                             GDR3F405.182    
     &      'U_MODEL : Error in GET_FILE for Unit No 190.'                 GDR3F405.183    
            icode = 102                                                    GDR3F405.184    
            go to 123                                                      GDR3F405.185    
          endif                                                            GDR3F405.186    
                                                                           GDR3F405.187    
          write (6,*) ' gl : Filename for unit no 190 ',FILENAME           GDR3F405.188    
                                                                           GDR3F405.189    
!         Open the file with WRITE permission.                             GDR3F405.190    
          OPEN(unit=190,FILE=filename,action="write",iostat=icode)         GDR3F405.191    
                                                                           GDR3F405.192    
          if (icode.ne.0) then                                             GDR3F405.193    
            write (6,*) ' gl : Problem with OPEN for Unit 190.'            GDR3F405.194    
            write (6,*) ' gl : Return code from OPEN ',icode               GDR3F405.195    
            write (cmessage,*)                                             GDR3F405.196    
     &      'U_MODEL : Problem with OPEN for Unit No 190.'                 GDR3F405.197    
            icode = 103                                                    GDR3F405.198    
            go to 123                                                      GDR3F405.199    
          endif                                                            GDR3F405.200    
                                                                           GDR3F405.201    
          write (6,*) ' gl : File(unit 190) has been opened.'              GDR3F405.202    
                                                                           GDR3F405.203    
!         Send info to meso that L_LBC_COUP=T in Global.                   GDR3F405.204    
                                                                           GDR3F405.205    
          lbc_ntimes = 1000 + um_lbc_stream                                GDR3F405.206    
          write (190,*) lbc_ntimes                                         GDR3F405.207    
                                                                           GDR3F405.208    
          call flush (190,icode)                                           GDR3F405.209    
                                                                           GDR3F405.210    
          if (icode.ne.0) then                                             GDR3F405.211    
            write (6,*) 'Return Code from FLUSH ',icode                    GDR3F405.212    
            icode = 104                                                    GDR3F405.213    
            write (cmessage,*) 'U_MODEL : Error flushing out '//           GDR3F405.214    
     &      'contents for Unit 190.'                                       GDR3F405.215    
            go to 123                                                      GDR3F405.216    
          endif                                                            GDR3F405.217    
                                                                           GDR3F405.218    
          write (6,*) ' gl : lbc_ntimes ', lbc_ntimes,                     GDR3F405.219    
     &    ' sent to LBC_FILE.'                                             GDR3F405.220    
                                                                           GDR3F405.221    
!         Unit 191 : File with information for operators to                GDR3F405.222    
!         monitor progress with Boundary Conditions generated.             GDR3F405.223    
                                                                           GDR3F405.224    
!         Get filename attached to Unit 191                                GDR3F405.225    
          CALL GET_FILE(191,filename,80,ICODE)                             GDR3F405.226    
                                                                           GDR3F405.227    
          if (icode.ne.0) then                                             GDR3F405.228    
            write (6,*) ' gl : Problem with GET_FILE for Unit 191.'        GDR3F405.229    
            write (6,*) ' gl : Return code from GET_FILE ',icode           GDR3F405.230    
            write (cmessage,*)                                             GDR3F405.231    
     &      'U_MODEL : Error in GET_FILE for Unit No 191.'                 GDR3F405.232    
            icode = 105                                                    GDR3F405.233    
            go to 123                                                      GDR3F405.234    
          endif                                                            GDR3F405.235    
                                                                           GDR3F405.236    
          write (6,*) ' gl : Filename for unit no 191 ',FILENAME           GDR3F405.237    
                                                                           GDR3F405.238    
!         Open the file with WRITE permission only.                        GDR3F405.239    
          OPEN(unit=191,FILE=filename,action="write",iostat=icode)         GDR3F405.240    
                                                                           GDR3F405.241    
          if (icode.ne.0) then                                             GDR3F405.242    
            write (6,*) ' gl : Problem with OPEN for Unit 191.'            GDR3F405.243    
            write (6,*) ' gl : Return code from OPEN ',icode               GDR3F405.244    
            write (cmessage,*)                                             GDR3F405.245    
     &      'U_MODEL : Problem with OPEN for Unit No 191.'                 GDR3F405.246    
            icode = 106                                                    GDR3F405.247    
            go to 123                                                      GDR3F405.248    
          endif                                                            GDR3F405.249    
                                                                           GDR3F405.250    
          write (6,*) ' gl : File opened on unit 191.'                     GDR3F405.251    
                                                                           GDR3F405.252    
!         Send RUNID and date to file on unit 191                          GDR3F405.253    
          call fort_get_env('RUNID',5,runid_char,5,icode)                  GDR3F405.254    
          if (icode.ne.0) then                                             GDR3F405.255    
            write (6,*) ' Problem with FORT_GET_ENV for RUNID.'            GDR3F405.256    
            write (cmessage,*)                                             GDR3F405.257    
     &      'U_MODEL : Problem with FORT_GET_ENV for RUNID.'               GDR3F405.258    
            icode = 107                                                    GDR3F405.259    
            go to 123                                                      GDR3F405.260    
          endif                                                            GDR3F405.261    
                                                                           GDR3F405.262    
          call fort_get_env('TYPE',4,runtype_char,5,icode)                 GDR3F405.263    
          if (icode.ne.0) then                                             GDR3F405.264    
            write (6,*) ' Problem with FORT_GET_ENV for TYPE.'             GDR3F405.265    
            write (cmessage,*)                                             GDR3F405.266    
     &      'U_MODEL : Problem with FORT_GET_ENV for TYPE.'                GDR3F405.267    
            icode = 108                                                    GDR3F405.268    
            go to 123                                                      GDR3F405.269    
          endif                                                            GDR3F405.270    
                                                                           GDR3F405.271    
          len_runid=GET_CHAR_LEN(runid_char)                               GDR3F405.272    
          call date_and_time(ch_date2, ch_time2)                           GDR3F405.273    
          write (191,*) ' RUNID : ',runid_char(1:len_runid),               GDR3F405.274    
     &    '  RUN TYPE : ',runtype_char(1:get_char_len(runtype_char)),      GDR3F405.275    
     &    '  on ',ch_date2(7:8),'/',ch_date2(5:6),'/',ch_date2(1:4)        GDR3F405.276    
                                                                           GDR3F405.277    
          call flush (191,icode)                                           GDR3F405.278    
                                                                           GDR3F405.279    
          if (icode.ne.0) then                                             GDR3F405.280    
            write (6,*) 'Return Code from FLUSH ',icode                    GDR3F405.281    
            icode = 109                                                    GDR3F405.282    
            write (cmessage,*) 'U_MODEL : Error flushing out '//           GDR3F405.283    
     &      'contents for Unit 191.'                                       GDR3F405.284    
            go to 123                                                      GDR3F405.285    
          endif                                                            GDR3F405.286    
                                                                           GDR3F405.287    
*IF DEF,MPP                                                                GDR3F405.288    
        endif  !  if mype=0                                                GDR3F405.289    
*ENDIF                                                                     GDR3F405.290    
 123    continue                                                           GDR3F405.291    
                                                                           GDR3F405.292    
*IF DEF,MPP                                                                GDR3F405.293    
!       Broadcast icode to all PEs                                         GDR3F405.294    
        iostatus = icode                                                   GDR3F405.295    
        call gc_ibcast (458,1,0,nproc,info,iostatus)                       GDR3F405.296    
        icode = iostatus                                                   GDR3F405.297    
*ENDIF                                                                     GDR3F405.298    
                                                                           GDR3F405.299    
!       Check ICODE before proceeding.                                     GDR3F405.300    
        if (icode.ne.0) then                                               GDR3F405.301    
          write (6,*) ' U_MODEL - Error detected'                          GDR3F405.302    
          write (6,*) ' ICODE : ',ICODE                                    GDR3F405.303    
          write (6,*) ' CMESSAGE : ',CMESSAGE                              GDR3F405.304    
          go to 999  !  Return                                             GDR3F405.305    
        endif                                                              GDR3F405.306    
                                                                           GDR3F405.307    
      endif  !   if l_lbc_coup                                             GDR3F405.308    
                                                                           GDR3F405.309    
*ENDIF                                                                     GDR3F405.310    
*IF DEF,ATMOS,AND,-DEF,GLOBAL                                              GDR3F405.311    
                                                                           GDR3F405.312    
      if (l_lbc_coup) then                                                 GDR3F405.313    
                                                                           GDR3F405.314    
*IF DEF,MPP                                                                GDR3F405.315    
        if (mype.eq.0) then                                                GDR3F405.316    
*ENDIF                                                                     GDR3F405.317    
                                                                           GDR3F405.318    
!         Get filename attached to Unit 190                                GDR3F405.319    
          CALL GET_FILE(190,lbc_filename,80,ICODE)                         GDR3F405.320    
          write (6,*) ' ms : Filename from GET_FILE ',lbc_filename         GDR3F405.321    
                                                                           GDR3F405.322    
          if (icode.ne.0) then                                             GDR3F405.323    
            write (6,*) ' Return code from GET_FILE ',icode                GDR3F405.324    
            icode = 600                                                    GDR3F405.325    
            write (cmessage,*) 'U_MODEL : Problem with GET_FILE '//        GDR3F405.326    
     &      'for Unit No 190.'                                             GDR3F405.327    
            go to 147                                                      GDR3F405.328    
          endif                                                            GDR3F405.329    
                                                                           GDR3F405.330    
          call date_and_time(ch_date2, ch_time2)                           GDR3F405.331    
                                                                           GDR3F405.332    
          write(6,*) 'LBC_COUP: ',                                         GDR3F405.333    
     &    ch_time2(1:2),':',ch_time2(3:4),':',ch_time2(5:6),' on ',        GDR3F405.334    
     &    ch_date2(7:8),'/',ch_date2(5:6),'/',ch_date2(1:4),               GDR3F405.335    
     &    ' Wait to see if file exists.'                                   GDR3F405.336    
                                                                           GDR3F405.337    
          len_wait_tot = 0                                                 GDR3F405.338    
 149      continue                                                         GDR3F405.339    
                                                                           GDR3F405.340    
!         Check that the file exists.                                      GDR3F405.341    
          INQUIRE (file=lbc_filename,exist=l_exist,iostat=icode)           GDR3F405.342    
                                                                           GDR3F405.343    
          if (l_exist) then  !  file exists                                GDR3F405.344    
                                                                           GDR3F405.345    
            call date_and_time(ch_date2, ch_time2)                         GDR3F405.346    
            write(6,*) 'LBC_COUP: ',                                       GDR3F405.347    
     &      ch_time2(1:2),':',ch_time2(3:4),':',ch_time2(5:6),' on ',      GDR3F405.348    
     &      ch_date2(7:8),'/',ch_date2(5:6),'/',ch_date2(1:4),             GDR3F405.349    
     &      ' File exists - Proceed to open file.'                         GDR3F405.350    
                                                                           GDR3F405.351    
!           Open the file with READ ONLY permission.                       GDR3F405.352    
            OPEN (unit=190,file=lbc_filename,action="read",                GDR3F405.353    
     &            iostat=icode)                                            GDR3F405.354    
                                                                           GDR3F405.355    
!           Check return code from OPEN.                                   GDR3F405.356    
            if (icode.ne.0) then                                           GDR3F405.357    
              write (6,*) ' Return code from OPEN ',icode                  GDR3F405.358    
              icode = 601                                                  GDR3F405.359    
              write (cmessage,*) 'U_MODEL : Problem with OPEN '//          GDR3F405.360    
     &        'for Unit No 190.'                                           GDR3F405.361    
              go to 147                                                    GDR3F405.362    
            endif                                                          GDR3F405.363    
                                                                           GDR3F405.364    
          else  !  file does not exist                                     GDR3F405.365    
                                                                           GDR3F405.366    
            if (len_wait_tot.ge.um_lbc_wait_max) then                      GDR3F405.367    
                                                                           GDR3F405.368    
!             Maximum wait time has been reached/exceeded.                 GDR3F405.369    
                                                                           GDR3F405.370    
              write (6,*) ' ms : lbc_file does not exist.'                 GDR3F405.371    
              write (6,*) ' ms : Maximum wait time reached',               GDR3F405.372    
     &                    ' after ',um_lbc_wait_max,' seconds.'            GDR3F405.373    
              icode = 602                                                  GDR3F405.374    
              cmessage = 'U_MODEL : LBC_FILE does not exist.'              GDR3F405.375    
              go to 147                                                    GDR3F405.376    
                                                                           GDR3F405.377    
            else                                                           GDR3F405.378    
                                                                           GDR3F405.379    
!             Wait for um_lbc_wait seconds before another attempt          GDR3F405.380    
!             to see if file exists.                                       GDR3F405.381    
                                                                           GDR3F405.382    
              write (6,*) ' ms : lbc_file does not exist yet.'             GDR3F405.383    
              write (6,*) ' ms : wait for ',um_lbc_wait,                   GDR3F405.384    
     &                    ' seconds and retry.'                            GDR3F405.385    
              isleep = sleep(um_lbc_wait)                                  GDR3F405.386    
              len_wait_tot = len_wait_tot+um_lbc_wait                      GDR3F405.387    
              write (6,*) ' ms : Total Wait so far ',len_wait_tot,         GDR3F405.388    
     &                    ' seconds.'                                      GDR3F405.389    
              go to 149   !  Retry to see if LBC_FILE exists               GDR3F405.390    
                                                                           GDR3F405.391    
            endif                                                          GDR3F405.392    
                                                                           GDR3F405.393    
          endif  ! if l_exist                                              GDR3F405.394    
                                                                           GDR3F405.395    
*IF DEF,MPP                                                                GDR3F405.396    
        endif  !  if mype=0                                                GDR3F405.397    
*ENDIF                                                                     GDR3F405.398    
                                                                           GDR3F405.399    
147     continue                                                           GDR3F405.400    
                                                                           GDR3F405.401    
*IF DEF,MPP                                                                GDR3F405.402    
!       Broadcast ICODE to all PEs                                         GDR3F405.403    
        iostatus = icode                                                   GDR3F405.404    
        call gc_ibcast (458,1,0,nproc,info,iostatus)                       GDR3F405.405    
        icode = iostatus                                                   GDR3F405.406    
*ENDIF                                                                     GDR3F405.407    
                                                                           GDR3F405.408    
!       Check on ICODE before proceeding.                                  GDR3F405.409    
        if (icode.ne.0) then                                               GDR3F405.410    
          write (6,*) ' U_MODEL - Error detected.'                         GDR3F405.411    
          write (6,*) ' ICODE : ',ICODE                                    GDR3F405.412    
          write (6,*) ' CMESSAGE : ',CMESSAGE                              GDR3F405.413    
          go to 999   !  Return                                            GDR3F405.414    
        endif                                                              GDR3F405.415    
                                                                           GDR3F405.416    
!       Check that LBC_COUPLING has been switched on in Global.            GDR3F405.417    
*IF DEF,MPP                                                                GDR3F405.418    
        if (mype.eq.0) then                                                GDR3F405.419    
*ENDIF                                                                     GDR3F405.420    
                                                                           GDR3F405.421    
          len_wait_tot = 0                                                 GDR3F405.422    
 150      continue                                                         GDR3F405.423    
                                                                           GDR3F405.424    
!         Close the communication file and re-open                         GDR3F405.425    
          close(190)                                                       GDR3F405.426    
          open (190,file=lbc_filename,action="read",iostat=icode)          GDR3F405.427    
                                                                           GDR3F405.428    
!         Check retrun code from OPEN                                      GDR3F405.429    
          if (icode.ne.0) then                                             GDR3F405.430    
            write (6,*) ' Return code from OPEN ',icode                    GDR3F405.431    
            icode = 603                                                    GDR3F405.432    
            write (cmessage,*) 'U_MODEL : Problem with OPEN '//            GDR3F405.433    
     &      'for Unit No 190.'                                             GDR3F405.434    
            go to 148                                                      GDR3F405.435    
          endif                                                            GDR3F405.436    
                                                                           GDR3F405.437    
!         Read in the first value                                          GDR3F405.438    
          read (190,*,iostat=icode) lbc_ntimes                             GDR3F405.439    
                                                                           GDR3F405.440    
!         Check return code from READ                                      GDR3F405.441    
          if (icode.ne.0) then                                             GDR3F405.442    
                                                                           GDR3F405.443    
            write (6,*) ' ms : Return code from READ ',icode               GDR3F405.444    
                                                                           GDR3F405.445    
            if (len_wait_tot.ge.um_lbc_wait_max) then                      GDR3F405.446    
                                                                           GDR3F405.447    
!             Maximum wait time has been reached or exceeded.              GDR3F405.448    
!             Give up waiting and abort.                                   GDR3F405.449    
                                                                           GDR3F405.450    
              write (6,*) ' ms : Required LBC_NTIMES not read in',         GDR3F405.451    
     &        ' after ',um_lbc_wait_max,' seconds.'                        GDR3F405.452    
              icode = 604                                                  GDR3F405.453    
              cmessage = 'U_MODEL : Required LBC_NTIMES '//                GDR3F405.454    
     &        'not found in LBC_FILE.'                                     GDR3F405.455    
              go to 148                                                    GDR3F405.456    
                                                                           GDR3F405.457    
            else                                                           GDR3F405.458    
                                                                           GDR3F405.459    
!             Wait for um_lbc_wait seconds abefore another attempt         GDR3F405.460    
!             to read a value.                                             GDR3F405.461    
                                                                           GDR3F405.462    
              write (6,*) ' ms : wait for ',um_lbc_wait,                   GDR3F405.463    
     &                    ' seconds and retry.'                            GDR3F405.464    
              isleep = sleep(um_lbc_wait)                                  GDR3F405.465    
              len_wait_tot = len_wait_tot+um_lbc_wait                      GDR3F405.466    
              write (6,*) ' ms : Total Wait so far ',len_wait_tot,         GDR3F405.467    
     &                    ' seconds.'                                      GDR3F405.468    
              go to 150   !  Retry to see if required LBC_NTIMES exists    GDR3F405.469    
                                                                           GDR3F405.470    
            endif                                                          GDR3F405.471    
                                                                           GDR3F405.472    
          endif  !  if icode.ne.0                                          GDR3F405.473    
                                                                           GDR3F405.474    
!         The first value in the file is >1000.                            GDR3F405.475    
          if (lbc_ntimes.gt.1000) then                                     GDR3F405.476    
            write (6,*) ' ms : l_lbc_coup = T in Global'                   GDR3F405.477    
            um_lbc_stream = lbc_ntimes - 1000                              GDR3F405.478    
            write (6,*) ' ms : global output stream is ',um_lbc_stream     GDR3F405.479    
          endif  !  if l_lbc_ntimes                                        GDR3F405.480    
                                                                           GDR3F405.481    
*IF DEF,MPP                                                                GDR3F405.482    
        endif  !  if mype=0                                                GDR3F405.483    
*ENDIF                                                                     GDR3F405.484    
                                                                           GDR3F405.485    
148     continue                                                           GDR3F405.486    
                                                                           GDR3F405.487    
*IF DEF,MPP                                                                GDR3F405.488    
!       Broadcast ICODE to all PEs                                         GDR3F405.489    
        iostatus = icode                                                   GDR3F405.490    
        call gc_ibcast (458,1,0,nproc,info,iostatus)                       GDR3F405.491    
        icode = iostatus                                                   GDR3F405.492    
*ENDIF                                                                     GDR3F405.493    
                                                                           GDR3F405.494    
!       Check ICODE before proceeding.                                     GDR3F405.495    
        if (icode.ne.0) then                                               GDR3F405.496    
          write (6,*) ' U_MODEL - Error detected.'                         GDR3F405.497    
          write (6,*) ' ICODE : ',ICODE                                    GDR3F405.498    
          write (6,*) ' CMESSAGE : ',CMESSAGE                              GDR3F405.499    
          go to 999   !  Return                                            GDR3F405.500    
        endif                                                              GDR3F405.501    
                                                                           GDR3F405.502    
      endif  !  if l_lbc_coup                                              GDR3F405.503    
                                                                           GDR3F405.504    
*ENDIF                                                                     GDR3F405.505    
                                                                           GDR3F405.506    
*IF DEF,T3E                                                                GBC6F404.321    
c                                                                          GBC6F404.322    
c--find the start address of spd1                                          GBC6F404.323    
      i=loc(spd1(ixd1(2)))                                                 GBC6F404.324    
c--find the offset to the nearest SCACHE line boundary upwards             GBC6F404.325    
      j=((i+63)/64)*64-i                                                   GBC6F404.326    
c--compute the offset to be added to the index values                      GBC6F404.327    
      j=j/8                                                                GBC6F404.328    
c                                                                          GBC6F404.329    
c--add this offset on to the current addresses                             GBC6F404.330    
      do k=1, ixd1_len                                                     GBC6F404.331    
        ixd1(k)=ixd1(k)+j                                                  GBC6F404.332    
      end do                                                               GBC6F404.333    
c                                                                          GBC6F404.334    
*IF DEF,DIAG92                                                             GBC6F404.335    
*IF DEF,MPP                                                                GBC6F404.336    
      if(mype.eq.0) then                                                   GBC6F404.337    
*ENDIF                                                                     GBC6F404.338    
        write(0,'(4z17)') (loc(spd1(ixd1(i))), i=1,4)                      GBC6F404.339    
*IF DEF,MPP                                                                GBC6F404.340    
      endif                                                                GBC6F404.341    
*ENDIF                                                                     GBC6F404.342    
*ENDIF                                                                     GBC6F404.343    
*ENDIF                                                                     GBC6F404.344    
                                                                           GSS1F305.907    
!  Routine GETPPX_PART reads those ppxref records which correspond to      GSS1F305.908    
!  entries in the stash list into the ppx look-up arrays PPXI, PPXC.       GSS1F305.909    
!  It also sets the ppx pointer array PPXPTR. The lengths of PPXI, PPXC    GSS1F305.910    
!  have been dynamically allocated to the value of ppxRecs.                GSS1F305.911    
                                                                           GSS1F305.912    
! Initialise row number in PPXI, PPXC arrays                               GSS2F401.497    
      RowNumber = 1                                                        GSS2F401.498    
                                                                           GSS2F401.499    
! Initialise lookup and pointer array                                      GSS2F401.500    
      DO   I=1,ppxRecs                                                     GSS2F401.501    
        DO J=1,PPXREF_CODELEN                                              GSS2F401.502    
          PPXI(I,J)=0                                                      GSS2F401.503    
        END DO                                                             GSS2F401.504    
        DO J=1,PPXREF_CHARLEN                                              GSS2F401.505    
          PPXC(I,J) = ' '                                                  GSS2F401.506    
        END DO                                                             GSS2F401.507    
      END DO                                                               GSS2F401.508    
*IF DEF,RECON                                                              GSS2F401.509    
      DO I = 1,N_INTERNAL_MODEL_MAX                                        GSS2F401.510    
*ELSE                                                                      GSS2F401.511    
      DO I = 1,N_INTERNAL_MODEL                                            GSS2F401.512    
*ENDIF                                                                     GSS2F401.513    
        DO J   = 0,PPXREF_SECTIONS                                         GSS2F401.514    
          DO K = 1,PPXREF_ITEMS                                            GSS2F401.515    
            PPXPTR(I,J,K)=0                                                GSS2F401.516    
          END DO                                                           GSS2F401.517    
        END DO                                                             GSS2F401.518    
      END DO                                                               GSS2F401.519    
                                                                           GSS2F401.520    
! Read in STASHmaster records                                              GSS2F401.521    
      IF (INTERNAL_MODEL_INDEX(A_IM).GT.0) THEN                            GSS2F401.522    
      CALL GETPPX_PART(NFT,NFTU,'STASHmaster_A',A_IM,RowNumber,            GSS2F401.523    
*CALL ARGPPX                                                               GSS1F305.914    
     &                        ICODE,CMESSAGE)                              GSS1F305.915    
      END IF                                                               GSS2F401.524    
      IF (INTERNAL_MODEL_INDEX(O_IM).GT.0) THEN                            GSS2F401.525    
      CALL GETPPX_PART(NFT,NFTU,'STASHmaster_O',O_IM,RowNumber,            GSS2F401.526    
*CALL ARGPPX                                                               GSS2F401.527    
     &                        ICODE,CMESSAGE)                              GSS2F401.528    
      END IF                                                               GSS2F401.529    
      IF (INTERNAL_MODEL_INDEX(S_IM).GT.0) THEN                            GSS2F401.530    
      CALL GETPPX_PART(NFT,NFTU,'STASHmaster_S',S_IM,RowNumber,            GSS2F401.531    
*CALL ARGPPX                                                               GSS2F401.532    
     &                        ICODE,CMESSAGE)                              GSS2F401.533    
      END IF                                                               GSS2F401.534    
      IF (INTERNAL_MODEL_INDEX(W_IM).GT.0) THEN                            GSS2F401.535    
      CALL GETPPX_PART(NFT,NFTU,'STASHmaster_W',W_IM,RowNumber,            GSS2F401.536    
*CALL ARGPPX                                                               GSS2F401.537    
     &                        ICODE,CMESSAGE)                              GSS2F401.538    
      END IF                                                               GSS2F401.539    
                                                                           GSS2F401.540    
                                                                           GSS2F401.541    
      IF (ICODE.GT.0) GOTO 999                                             GSS1F400.989    
                                                                           GSS1F305.916    
CL----------------------------------------------------------------------   U_MODEL1.74     
CL 1. General initialisation of control and physical data blocks           U_MODEL1.75     
CL                                                                         U_MODEL1.76     
      ICODE=0                                                              U_MODEL1.77     
      CALL INITIAL(                                                        @DYALLOC.3660   
*CALL ARGPPX                                                               GSS1F305.917    
*CALL ARGSZSP                                                              @DYALLOC.3661   
*CALL ARGSZSPA                                                             @DYALLOC.3662   
*CALL ARGSZSPO                                                             @DYALLOC.3663   
*CALL ARGSZSPW                                                             WRB1F401.1146   
*CALL ARGSZSPC                                                             @DYALLOC.3664   
*CALL ARGSP                                                                @DYALLOC.3665   
*CALL ARGSPA                                                               @DYALLOC.3666   
*CALL ARGSPO                                                               @DYALLOC.3667   
*CALL ARGSPW                                                               WRB1F401.1147   
*CALL ARGSPC                                                               @DYALLOC.3668   
*CALL ARGSIZE                                                              @DYALLOC.3669   
     *     internal_model,submodel,NGROUP,MEANLEV,                         GRR2F305.615    
     *     ICODE,CMESSAGE)                                                 GRR2F305.616    
      IF (ICODE.GT.0) GOTO 999                                             U_MODEL1.79     
CL----------------------------------------------------------------------   U_MODEL1.80     
CL 2. Check for nothing-to-do                                              U_MODEL1.81     
CL                                                                         U_MODEL1.82     
                                IF (LTIMER) CALL TIMER('EXITCHEK',3)       U_MODEL1.83     
      CALL EXITCHEK( internal_model, LEXITNOW)                             GKR7F403.13     
                                IF (LTIMER) CALL TIMER('EXITCHEK',4)       U_MODEL1.85     
      IF (LEXITNOW) GOTO 999                                               U_MODEL1.86     
CL----------------------------------------------------------------------   U_MODEL1.87     
CL 3. Start group of timesteps                                             U_MODEL1.88     
CL                                                                         U_MODEL1.89     
   1  CONTINUE                                                             U_MODEL1.90     
CL----------------------------------------------------------------------   U_MODEL1.91     
CL 3.1. Start main timestep loop                                           U_MODEL1.92     
CL                                                                         U_MODEL1.93     
*IF DEF,ATMOS                                                              U_MODEL1.94     
*IF DEF,OCEAN,OR,DEF,SLAB                                                  U_MODEL1.95     
        DO I_STEP=1,NGROUP                                                 U_MODEL1.96     
*ENDIF                                                                     U_MODEL1.97     
*ENDIF                                                                     U_MODEL1.98     
CL 3.1.1 Increment model time ..                                           U_MODEL1.99     
                                IF (LTIMER) CALL TIMER('INCRTIME',3)       U_MODEL1.100    
      CALL INCRTIME (                                                      @DYALLOC.3671   
*CALL ARGSIZE                                                              @DYALLOC.3672   
*CALL ARTDUMA                                                              @DYALLOC.3673   
*CALL ARTDUMO                                                              @DYALLOC.3674   
*CALL ARTDUMW                                                              WRB1F401.1148   
     &       internal_model,ICODE,CMESSAGE)                                GRR2F305.617    
                                IF (LTIMER) CALL TIMER('INCRTIME',4)       U_MODEL1.102    
CL 3.1.2 .. set timestep control switches                                  U_MODEL1.103    
                                IF (LTIMER) CALL TIMER('SETTSCTL',3)       U_MODEL1.104    
      CALL SETTSCTL (                                                      @DYALLOC.3676   
*CALL ARGSIZE                                                              @DYALLOC.3677   
*CALL ARTDUMA                                                              @DYALLOC.3678   
*CALL ARTDUMO                                                              @DYALLOC.3679   
*CALL ARTDUMW                                                              WRB1F401.1149   
*CALL ARTSTS                                                               @DYALLOC.3680   
*CALL ARTINFA                                                              @DYALLOC.3681   
*CALL ARTINFO                                                              @DYALLOC.3682   
*CALL ARTINFW                                                              WRB1F401.1150   
     &         internal_model,.FALSE.,MEANLEV,ICODE,CMESSAGE)              GRR2F305.618    
                                IF (LTIMER) CALL TIMER('SETTSCTL',4)       U_MODEL1.106    
          IF (ICODE.GT.0) GOTO 999                                         U_MODEL1.107    
CL 3.1.3 If PPfile initialisation time call PP control routine             U_MODEL1.108    
CL          for instantaneous data (MEANLEV=0)                             U_MODEL1.109    
          IF (LPP) THEN                                                    U_MODEL1.110    
                                IF (LTIMER) CALL TIMER('PPCTL   ',3)       U_MODEL1.111    
            MEANLEV=0                                                      U_MODEL1.112    
      CALL PPCTL(                                                          @DYALLOC.3684   
*CALL ARGSIZE                                                              @DYALLOC.3685   
*CALL ARTD1                                                                @DYALLOC.3686   
*CALL ARTDUMA                                                              @DYALLOC.3687   
*CALL ARTDUMO                                                              @DYALLOC.3688   
*CALL ARTDUMW                                                              WRB1F401.1151   
*CALL ARTINFA                                                              @DYALLOC.3689   
*CALL ARTINFO                                                              GMB1F405.415    
*CALL ARGPPX                                                               GMB1F405.416    
     &         internal_model,MEANLEV,.FALSE.,PPNAME,ICODE,CMESSAGE)       GRR2F305.619    
                                IF (LTIMER) CALL TIMER('PPCTL   ',4)       U_MODEL1.114    
            IF (ICODE.GT.0) GOTO 999                                       U_MODEL1.115    
          ENDIF                                                            U_MODEL1.116    
                                                                           CJC1F404.1      
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!     CJC1F404.2      
!        call the oasis coupler before the dump.                           CJC1F404.3      
*IF DEF,OASIS                                                              CJC1F404.4      
*IF DEF,MPP                                                                CJC1F404.5      
! Synchronize before the timestep starts                                   CJC1F404.6      
      CALL GC_GSYNC(nproc,info)                                            CJC1F404.7      
*ENDIF                                                                     CJC1F404.8      
*IF DEF,MPP                                                                CJC1F404.9      
! Get 'global' atmos and ocean horizontal domain sizes from database       CJC1F404.10     
! in DECOMPDB to set dynamic allocation in SWAP_A2O,SWAP_O2A.              CJC1F404.11     
*IF DEF,ATMOS                                                              CJC1F404.12     
      G_P_FIELD= decomp_db_glsize(1,decomp_standard_atmos) *               CJC1F404.13     
     &  decomp_db_glsize(2,decomp_standard_atmos)                          CJC1F404.14     
*ENDIF                                                                     CJC1F404.15     
*IF DEF,OCEAN                                                              CJC1F404.16     
CC      G_IMTJMT = decomp_db_glsize(1,decomp_standard_ocean) *             CJC1F404.17     
CC     &  (decomp_db_glsize(2,decomp_standard_ocean)+1)                    CJC1F404.18     
      G_IMTJMT = decomp_db_glsize(1,decomp_standard_ocean) *               CJC1F404.19     
     &  (decomp_db_glsize(2,decomp_standard_ocean))                        CJC1F404.20     
*ENDIF                                                                     CJC1F404.21     
*ELSE                                                                      CJC1F404.22     
! Sizes not used for non-MPP: dummy values only                            CJC1F404.23     
*IF DEF,ATMOS                                                              CJC1F404.24     
        G_P_FIELD= P_FIELD                                                 CJC1F404.25     
*ENDIF                                                                     CJC1F404.26     
*IF DEF,OCEAN                                                              CJC1F404.27     
        G_IMTJMT = IMT*JMT                                                 CJC1F404.28     
*ENDIF                                                                     CJC1F404.29     
*ENDIF                                                                     CJC1F404.30     
          ICODE=0                                                          CJC1F404.31     
          CALL OASIS_STEP(                                                 CJC1F404.32     
*IF DEF,ATMOS                                                              CJC1F404.33     
     &      G_P_FIELD,                                                     CJC1F404.34     
*ENDIF                                                                     CJC1F404.35     
*IF DEF,OCEAN                                                              CJC1F404.36     
     &      G_IMTJMT,                                                      CJC1F404.37     
*ENDIF                                                                     CJC1F404.38     
*CALL ARGSIZE                                                              CJC1F404.39     
*CALL ARTD1                                                                CJC1F404.40     
*CALL ARTSTS                                                               CJC1F404.41     
*CALL ARTDUMA                                                              CJC1F404.42     
*CALL ARTDUMO                                                              CJC1F404.43     
*CALL ARTPTRA                                                              CJC1F404.44     
*CALL ARTPTRO                                                              CJC1F404.45     
*CALL ARTCONA                                                              CJC1F404.46     
*CALL ARTCONO                                                              CJC1F404.47     
     &      internal_model,                                                CJC1F404.48     
     &      ICODE,CMESSAGE)                                                CJC1F404.49     
          IF (ICODE.GT.0) GOTO 999                                         CJC1F404.50     
*ENDIF                                                                     CJC1F404.51     
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!     CJC1F404.52     
CL       Integrate atmosphere or ocean by 1 timestep                       U_MODEL1.117    
*IF DEF,ATMOS                                                              U_MODEL1.118    
          IF (internal_model.EQ.atmos_im) THEN                             GRR2F305.620    
                                IF (LTIMER) CALL TIMER('ATM_STEP',3)       U_MODEL1.120    
CC (DYNAMIC ALLOCATION) OCEAN COMDECKS NEEDED BECAUSE OF STASH STRUCTURE   @DYALLOC.3691   
                                                                           CJC1F404.53     
                                                                           GPB5F403.90     
*IF DEF,MPP                                                                GPB5F403.91     
! Synchronize before the timestep starts                                   GPB5F403.92     
      CALL GC_GSYNC(nproc,info)                                            GPB1F404.90     
*ENDIF                                                                     GPB5F403.94     
                                                                           GPB5F403.95     
         CALL ATM_STEP (                                                   @DYALLOC.3692   
*CALL ARGSZSP                                                              @DYALLOC.3693   
*CALL ARGSZSPA                                                             @DYALLOC.3694   
*CALL ARGSZSPO                                                             @DYALLOC.3695   
*CALL ARGSP                                                                @DYALLOC.3696   
*CALL ARGSPA                                                               @DYALLOC.3697   
*CALL ARGSPO                                                               @DYALLOC.3698   
*CALL ARGSIZE                                                              @DYALLOC.3699   
*CALL ARGCNVI                                                              RB300993.150    
*CALL ARGPPX                                                               GSS1F305.918    
*IF DEF,FRADIO                                                             GGH3F401.44     
     &                  RADINCS,                                           @DYALLOC.3701   
*ENDIF                                                                     @DYALLOC.3702   
     &   P_FIELD,     ! for dynamic array                                  NF171193.10     
     &                  ICODE,CMESSAGE)                                    @DYALLOC.3703   
                                IF (LTIMER) CALL TIMER('ATM_STEP',4)       U_MODEL1.122    
          ENDIF                                                            U_MODEL1.123    
*ENDIF                                                                     U_MODEL1.124    
*IF DEF,OCEAN                                                              U_MODEL1.127    
          IF (internal_model.EQ.ocean_im) THEN                             GRR2F305.621    
                                IF (LTIMER) CALL TIMER('OCN_STEP',3)       U_MODEL1.128    
CL (DYNAMIC ALLOCATION) ATMOS COMDECKs needed because of STASH structure   @DYALLOC.3704   
CL                                                                         @DYALLOC.3705   
                                                                           GPB5F403.96     
*IF DEF,MPP                                                                GPB5F403.97     
! Synchronize before the timestep starts                                   GPB5F403.98     
      CALL GC_GSYNC(nproc,info)                                            GPB1F404.91     
*ENDIF                                                                     GPB5F403.100    
            CALL OCN_STEP(                                                 @DYALLOC.3706   
*CALL ARGSIZE                                                              @DYALLOC.3707   
*CALL ARTDUMA                                                              @DYALLOC.3708   
*CALL ARTDUMO                                                              @DYALLOC.3709   
*CALL ARTDUMW                                                              GKR1F401.280    
*CALL ARTD1                                                                @DYALLOC.3710   
*CALL ARTPTRA                                                              @DYALLOC.3711   
*CALL ARTPTRO                                                              @DYALLOC.3712   
*CALL ARTSTS                                                               @DYALLOC.3713   
*CALL ARTCONA                                                              @DYALLOC.3714   
*CALL ARTCONO                                                              @DYALLOC.3715   
*CALL ARTBND                                                               SI180893.27     
*CALL ARGPPX                                                               GKR0F305.1008   
     &                    ICODE,CMESSAGE)                                  @DYALLOC.3716   
                                IF (LTIMER) CALL TIMER('OCN_STEP',4)       U_MODEL1.130    
          ENDIF                                                            TJ061293.11     
*ENDIF                                                                     U_MODEL1.131    
*IF DEF,SLAB                                                               U_MODEL1.132    
          IF (internal_model.EQ.slab_im) THEN                              GRR2F305.622    
                                IF (LTIMER) CALL TIMER('SLABSTEP',3)       U_MODEL1.133    
CL (DYNAMIC ALLOCATION) ????? COMDECKs needed because of STASH structure   SCH0F405.28     
CL                                                                         SCH0F405.29     
                                                                           SCH0F405.30     
*IF DEF,MPP                                                                SCH0F405.31     
! Synchronize before the timestep starts                                   SCH0F405.32     
      CALL GC_GSYNC(nproc,info)                                            SCH0F405.33     
*ENDIF                                                                     SCH0F405.34     
            CALL SLABSTEP(                                                 @DYALLOC.3717   
*CALL ARGSIZE                                                              @DYALLOC.3718   
*CALL ARTD1                                                                @DYALLOC.3719   
*CALL ARTDUMA                                                              TJ061293.13     
*CALL ARTDUMO                                                              TJ061293.14     
*CALL ARTDUMW                                                              GKR1F401.281    
*CALL ARTSTS                                                               TJ061293.15     
*CALL ARTPTRA                                                              @DYALLOC.3720   
*CALL ARTPTRO                                                              TJ061293.16     
*CALL ARTCONA                                                              @DYALLOC.3722   
*CALL ARGPPX                                                               GKR0F305.1009   
     *                    ICODE,CMESSAGE)                                  @DYALLOC.3723   
                                IF (LTIMER) CALL TIMER('SLABSTEP',4)       U_MODEL1.135    
          ENDIF                                                            U_MODEL1.137    
*ENDIF                                                                     U_MODEL1.138    
*IF DEF,WAVE                                                               WRB1F401.1152   
          IF (internal_model.EQ.wave_im) THEN                              WRB1F401.1153   
                                IF (LTIMER) CALL TIMER('WAV_STEP',3)       WRB1F401.1154   
            CALL WAV_STEP(                                                 WRB1F401.1155   
*CALL ARGSIZE                                                              WRB1F401.1156   
*CALL ARTD1                                                                WRB1F401.1157   
*CALL ARTDUMW                                                              WRB1F401.1158   
*CALL ARTSTS                                                               WRB1F401.1159   
*CALL ARTPTRW                                                              WRB1F401.1160   
*CALL ARTCONW                                                              WRB1F401.1161   
*CALL ARGPPX                                                               WRB1F401.1162   
     *                    ICODE,CMESSAGE)                                  WRB1F401.1163   
                                IF (LTIMER) CALL TIMER('WAV_STEP',4)       WRB1F401.1164   
          ENDIF                                                            WRB1F401.1165   
*ENDIF                                                                     WRB1F401.1166   
          IF (ICODE.GT.0) GOTO 999                                         U_MODEL1.139    
CL 3.1.4 If dump time, call dump control routine                           U_MODEL1.140    
          IF (LDUMP) THEN                                                  U_MODEL1.141    
            IF (LTIMER) THEN                                               GPB1F401.35     
              CALL TIMER('DUMPCTL',5)                                      GPB1F401.36     
              CALL TIMER('DUMPCTL ',3)                                     GPB1F401.37     
            ENDIF                                                          GPB1F401.38     
            CALL DUMPCTL (                                                 @DYALLOC.3725   
*CALL ARGSIZE                                                              @DYALLOC.3726   
*CALL ARTD1                                                                @DYALLOC.3727   
*CALL ARTDUMA                                                              @DYALLOC.3728   
*CALL ARTDUMO                                                              @DYALLOC.3729   
*CALL ARTDUMW                                                              WRB1F401.1167   
*CALL ARTCONA                                                              @DYALLOC.3730   
*CALL ARTPTRA                                                              @DYALLOC.3731   
*CALL ARTSTS                                                               @DYALLOC.3732   
*CALL ARGPPX                                                               GDG0F401.1475   
     &          submodel,MEANLEV,.false.,'           ',0,                  GKR4F403.32     
     &          ICODE,CMESSAGE)                                            GKR4F403.33     
                                                                           GKR4F403.34     
            IF (LTIMER) THEN                                               GPB1F401.39     
              CALL TIMER('DUMPCTL',4)                                      GPB1F401.40     
              CALL TIMER('DUMPCTL ',6)                                     GPB1F401.41     
            ENDIF                                                          GPB1F401.42     
            IF (ICODE.GT.0) GOTO 999                                       U_MODEL1.145    
CL 3.1.4.1 Update interim history file unless means are to follow          U_MODEL1.146    
                                IF (LTIMER) CALL TIMER('TEMPHIST',3)       U_MODEL1.147    
            IF (.NOT.LMEAN) THEN                                           U_MODEL1.148    
              IF (.NOT. (N_SUBMODEL_PARTITION .GT.1 .AND. submodel         GKR2F405.15     
     &         .ne. SUBMODEL_PARTITION_LIST(N_SUBMODEL_PARTITION) .AND.    GKR2F405.16     
     &          steps_per_periodim(submodel) .NE.                          GKR2F405.17     
     &          dumpfreqim(submodel) )) THEN                               GKR2F405.18     
              CALL SET_HISTORY_VALUES                                      GRR2F305.626    
*IF DEF,MPP                                                                ARB1F402.793    
              CALL GC_SSYNC(nproc,info)                                    ARB1F402.794    
              IF (MYPE .eq. 0) THEN                                        ARB1F402.795    
*ENDIF                                                                     ARB1F402.796    
              CALL TEMPHIST(PHIST_UNIT,ICODE,CMESSAGE)                     U_MODEL1.150    
*IF DEF,MPP                                                                ARB1F402.797    
            ENDIF                                                          U_MODEL1.151    
*ENDIF                                                                     ARB1F402.798    
      ENDIF                                                                GJC0F405.39     
            ENDIF                                                          ARB1F402.799    
                                IF (LTIMER) CALL TIMER('TEMPHIST',4)       U_MODEL1.152    
            IF (ICODE.GT.0) GOTO 999                                       U_MODEL1.153    
*IF DEF,ATMOS                                                              U_MODEL1.154    
CL 3.1.4.2 If atmosphere timestep recalculate prognostic data and          U_MODEL1.155    
CL         wrap-around fields using rounded off values                     U_MODEL1.156    
            IF (submodel.EQ.atmos_sm) THEN                                 GRR2F305.624    
                                IF (LTIMER) CALL TIMER('RESETATM',3)       U_MODEL1.158    
         CALL RESETATM (                                                   @DYALLOC.3734   
*CALL ARGSZSP                                                              @DYALLOC.3735   
*CALL ARGSZSPA                                                             @DYALLOC.3736   
*CALL ARGSP                                                                @DYALLOC.3737   
*CALL ARGSPA                                                               @DYALLOC.3738   
*CALL ARGSIZE                                                              @DYALLOC.3739   
     &                                ICODE,CMESSAGE)                      @DYALLOC.3740   
                                IF (LTIMER) CALL TIMER('RESETATM',4)       U_MODEL1.160    
              IF (ICODE.GT.0) GOTO 999                                     TJ230793.4      
            ENDIF                                                          TJ230793.5      
*ENDIF                                                                     TJ230793.6      
*IF DEF,OCEAN                                                              TJ230793.7      
CL 3.1.4.3 If ocean timestep copy second timelevel prognostic data         TJ230793.8      
CL         from rounded off values                                         TJ230793.9      
            IF (internal_model.EQ.ocean_im) THEN                           GRR2F305.625    
                                IF (LTIMER) CALL TIMER('RESETOCN',3)       TJ230793.11     
              CALL RESETOCN(                                               TJ230793.12     
*CALL ARGSIZE                                                              TJ230793.13     
*CALL ARTD1                                                                TJ230793.14     
*CALL ARTPTRO                                                              TJ230793.15     
     &                      ICODE,CMESSAGE)                                TJ230793.16     
                                IF (LTIMER) CALL TIMER('RESETOCN',4)       TJ230793.17     
              IF (ICODE.GT.0) GOTO 999                                     U_MODEL1.161    
            ENDIF                                                          U_MODEL1.162    
*ENDIF                                                                     U_MODEL1.163    
          ENDIF                                                            U_MODEL1.164    
CL 3.1.5 If printed output time, call print control routine                U_MODEL1.165    
          IF (LPRINT) THEN                                                 U_MODEL1.166    
                                IF (LTIMER) CALL TIMER('PRINTCTL',3)       U_MODEL1.167    
            CALL PRINTCTL(                                                 GRR2F305.627    
*CALL ARGSIZE                                                              GRR2F305.628    
*CALL ARTD1                                                                GRR2F305.629    
*CALL ARTDUMA                                                              GRR2F305.630    
*CALL ARTPTRA                                                              GRR2F305.631    
*CALL ARTCONA                                                              GRR2F305.632    
     &                    submodel,MEANLEV,ICODE,CMESSAGE)                 GRR2F305.633    
                                IF (LTIMER) CALL TIMER('PRINTCTL',4)       U_MODEL1.169    
            IF (ICODE.GT.0) GOTO 999                                       U_MODEL1.170    
          ENDIF                                                            U_MODEL1.171    
CL 3.1.6 If interface generation time, generate interface fields           U_MODEL1.172    
          IF (internal_model.EQ.ocean_im) THEN                             GRR2F305.634    
                                                                           U_MODEL1.174    
          IF (LINTERFACE) THEN                                             U_MODEL1.175    
                                IF (LTIMER) CALL TIMER('GEN_INTF',3)       U_MODEL1.176    
            CALL GEN_INTF (                                                @DYALLOC.3741   
*CALL ARGSIZE                                                              @DYALLOC.3742   
*CALL ARTD1                                                                @DYALLOC.3743   
*CALL ARTDUMA                                                              @DYALLOC.3744   
*CALL ARTSTS                                                               @DYALLOC.3745   
*CALL ARTPTRA                                                              @DYALLOC.3746   
*CALL ARTCONA                                                              @DYALLOC.3747   
*CALL ARTINFA                                                              @DYALLOC.3748   
*CALL ARTPTRO                                                              GMB1F405.417    
*CALL ARTCONO                                                              GMB1F405.418    
*CALL ARTDUMO                                                              GMB1F405.419    
*CALL ARTINFO                                                              GMB1F405.420    
*CALL ARGPPX                                                               GMB1F405.421    
     &              submodel,ICODE,CMESSAGE)                               GRR2F305.635    
                                IF (LTIMER) CALL TIMER('GEN_INTF',4)       U_MODEL1.178    
            IF (ICODE.GT.0) GOTO 999                                       U_MODEL1.179    
          ENDIF                                                            U_MODEL1.180    
                                                                           U_MODEL1.181    
          END IF                                                           U_MODEL1.182    
CL 3.1.6.1 Release job to process output created so far, if selected       U_MODEL1.183    
          IF (LJOBRELEASE) THEN                                            U_MODEL1.184    
                                IF (LTIMER) CALL TIMER('JOBCTL  ',3)       U_MODEL1.185    
            CALL JOBCTL(internal_model,ICODE,CMESSAGE)                     GRR2F305.636    
                                IF (LTIMER) CALL TIMER('JOBCTL  ',4)       U_MODEL1.187    
            IF (ICODE.GT.0) GOTO 999                                       U_MODEL1.188    
          ENDIF                                                            U_MODEL1.189    
CL 3.1.7 If partial sum/mean creation time, call means control routine     U_MODEL1.190    
CL       (calls mean PPfield and diagnostic print routines internally)     U_MODEL1.191    
          IF (LMEAN) THEN                                                  U_MODEL1.192    
                                IF (LTIMER) CALL TIMER('MEANCTL ',3)       U_MODEL1.193    
            CALL MEANCTL (                                                 @DYALLOC.3750   
*CALL ARGSIZE                                                              @DYALLOC.3751   
*CALL ARTD1                                                                @DYALLOC.3752   
*CALL ARTDUMA                                                              @DYALLOC.3753   
*CALL ARTDUMO                                                              @DYALLOC.3754   
*CALL ARTDUMW                                                              GKR1F401.282    
*CALL ARTPTRA                                                              @DYALLOC.3755   
*CALL ARTPTRO                                                              @DYALLOC.3756   
*CALL ARTSTS                                                               @DYALLOC.3757   
*CALL ARTCONA                                                              @DYALLOC.3758   
*CALL ARTINFA                                                              @DYALLOC.3759   
*CALL ARTINFO                                                              GMB1F405.422    
*CALL ARGPPX                                                               GKR0F305.1010   
     &                  submodel,MEANLEV,ICODE,CMESSAGE)                   GRR2F305.637    
                                IF (LTIMER) CALL TIMER('MEANCTL ',4)       U_MODEL1.195    
            IF (ICODE.GT.0) THEN                                           U_MODEL1.196    
              CALL DEL_HIST(PHIST_UNIT)                                    U_MODEL1.197    
      WRITE(6,*)'U_MODEL: interim history file deleted due to failu        GIE0F403.666    
     &re writing partial sum files'                                        U_MODEL1.199    
              GOTO 999                                                     U_MODEL1.200    
            ENDIF                                                          U_MODEL1.201    
CL 3.1.7.1 On successful completion, update interim history file           U_MODEL1.202    
                                IF (LTIMER) CALL TIMER('TEMPHIST',3)       U_MODEL1.203    
                                                                           GKR1F404.267    
            IF (.NOT. (N_SUBMODEL_PARTITION .GT.1 .AND. submodel           GKR2F405.19     
     &         .ne. SUBMODEL_PARTITION_LIST(N_SUBMODEL_PARTITION) .AND.    GKR2F405.20     
     &          steps_per_periodim(submodel) .NE.                          GKR2F405.21     
     &          dumpfreqim(submodel) )) THEN                               GKR2F405.22     
                                                                           GKR1F404.271    
              CALL SET_HISTORY_VALUES                                      GRR2F305.638    
*IF DEF,MPP                                                                ARB1F402.800    
            CALL GC_SSYNC(nproc,info)                                      ARB1F402.801    
            IF (MYPE .eq. 0) THEN                                          ARB1F402.802    
*ENDIF                                                                     ARB1F402.803    
            CALL TEMPHIST(PHIST_UNIT,ICODE,CMESSAGE)                       U_MODEL1.205    
*IF DEF,MPP                                                                ARB1F402.804    
            ENDIF                                                          ARB1F402.805    
*ENDIF                                                                     ARB1F402.806    
            IF (ICODE.GT.0) GOTO 999                                       U_MODEL1.207    
      ENDIF                                                                GJC0F405.40     
                                IF (LTIMER) CALL TIMER('TEMPHIST',4)       GRH0F405.1      
          ENDIF                                                            U_MODEL1.208    
CL 3.1.8 Update temporary history file if at a 'safe' restart point        U_MODEL1.209    
                                IF (LTIMER) CALL TIMER('TEMPHIST',3)       U_MODEL1.210    
          IF (LHISTORY) THEN                                               U_MODEL1.211    
!          In coupled model do not update history file until both          GKR1F404.273    
!          submodels have reached the safe restart point                   GKR1F404.274    
                                                                           GKR1F404.275    
            IF (.NOT. (N_SUBMODEL_PARTITION .GT.1 .AND. submodel           GKR2F405.23     
     &         .ne. SUBMODEL_PARTITION_LIST(N_SUBMODEL_PARTITION) .AND.    GKR2F405.24     
     &          steps_per_periodim(submodel) .NE.                          GKR2F405.25     
     &          dumpfreqim(submodel) )) THEN                               GKR2F405.26     
              CALL SET_HISTORY_VALUES                                      GRR2F305.639    
*IF DEF,MPP                                                                ARB1F402.807    
            CALL GC_SSYNC(nproc,info)                                      ARB1F402.808    
            IF (MYPE .eq. 0) THEN                                          ARB1F402.809    
*ENDIF                                                                     ARB1F402.810    
            CALL TEMPHIST(THIST_UNIT,ICODE,CMESSAGE)                       U_MODEL1.213    
*IF DEF,MPP                                                                ARB1F402.811    
          ENDIF                                                            U_MODEL1.214    
*ENDIF                                                                     ARB1F402.812    
      ENDIF                                                                GJC0F405.41     
          ENDIF                                                            ARB1F402.813    
                                IF (LTIMER) CALL TIMER('TEMPHIST',4)       U_MODEL1.215    
          IF (ICODE.GT.0) GOTO 999                                         U_MODEL1.216    
CL 3.1.9 If exit check time, check for immediate exit                      U_MODEL1.217    
          IF (LEXIT) THEN                                                  U_MODEL1.218    
                                IF (LTIMER) CALL TIMER('EXITCHEK',3)       U_MODEL1.219    
            CALL EXITCHEK(internal_model, LEXITNOW)                        GKR7F403.14     
                                IF (LTIMER) CALL TIMER('EXITCHEK',4)       U_MODEL1.221    
            IF (LEXITNOW) THEN                                             GGH5F401.1      
              IF (.NOT.LDUMP) THEN                                         GGH5F401.2      
                                                                           GKR1F404.280    
                IF (.NOT. (N_SUBMODEL_PARTITION .GT.1 .AND. submodel       GKR2F405.27     
     &          .ne. SUBMODEL_PARTITION_LIST(N_SUBMODEL_PARTITION).AND.    GKR2F405.28     
     &          steps_per_periodim(submodel) .NE.                          GKR2F405.29     
     &          dumpfreqim(submodel) )) THEN                               GKR2F405.30     
                                                                           GKR1F404.284    
                CALL SET_HISTORY_VALUES                                    GGH5F401.3      
*IF DEF,MPP                                                                ARB1F402.814    
                CALL GC_SSYNC(nproc,info)                                  ARB1F402.815    
                IF (MYPE .eq. 0) THEN                                      ARB1F402.816    
*ENDIF                                                                     ARB1F402.817    
                CALL TEMPHIST(PHIST_UNIT,ICODE,CMESSAGE)                   GGH5F401.4      
*IF DEF,MPP                                                                ARB1F402.818    
                ENDIF                                                      ARB1F402.819    
*ENDIF                                                                     ARB1F402.820    
!               Exit model so no need to set ppflush                       GKR1F404.285    
         END IF                                                            GJC0F405.42     
              END IF                                                       GGH5F401.5      
              GOTO 999                                                     GGH5F401.6      
      END IF                                                               GJC0F405.43     
          ENDIF                                                            U_MODEL1.223    
CL 3.1.10 Update ancillary fields if necessary                             U_MODEL1.224    
          IF (LANCILLARY) THEN                                             U_MODEL1.225    
                                IF (LTIMER) CALL TIMER('UP_ANCIL',3)       U_MODEL1.226    
         CALL UP_ANCIL (                                                   @DYALLOC.3761   
*CALL ARGSIZE                                                              @DYALLOC.3762   
*CALL ARTD1                                                                @DYALLOC.3763   
*CALL ARTDUMA                                                              @DYALLOC.3764   
*CALL ARTDUMO                                                              @DYALLOC.3765   
*CALL ARTDUMW                                                              WRB1F401.1168   
*CALL ARTPTRA                                                              @DYALLOC.3766   
*CALL ARTPTRO                                                              @DYALLOC.3767   
*CALL ARTPTRW                                                              WRB1F401.1169   
*CALL ARTANC                                                               @DYALLOC.3768   
     &                   submodel,                                         GDG0F401.1476   
*CALL ARGPPX                                                               GDG0F401.1477   
     &                   ICODE,CMESSAGE)                                   GDG0F401.1478   
                                IF (LTIMER) CALL TIMER('UP_ANCIL',4)       U_MODEL1.228    
            IF (ICODE.GT.0) GOTO 999                                       U_MODEL1.229    
          ENDIF                                                            U_MODEL1.230    
CL 3.1.11 Update boundary fields if necessary                              U_MODEL1.231    
          IF (LBOUNDARY) THEN                                              U_MODEL1.232    
                                                                           GDR3F405.507    
            if (l_lbc_coup) then                                           GDR3F405.508    
                                                                           GDR3F405.509    
!             The boundary conditions (BCs) are updated every N hours.     GDR3F405.510    
!             The BCs required to proceed N hours are read in. If the      GDR3F405.511    
!             model has run M hours, then BCs must be available at         GDR3F405.512    
!             least M+N hours.                                             GDR3F405.513    
                                                                           GDR3F405.514    
              call date_and_time(ch_date2, ch_time2)                       GDR3F405.515    
                                                                           GDR3F405.516    
              write(6,*)  'LBC_COUP: ',                                    GDR3F405.517    
     &        ch_time2(1:2),':',ch_time2(3:4),':',ch_time2(5:6),' on ',    GDR3F405.518    
     &        ch_date2(7:8),'/',ch_date2(5:6),'/',ch_date2(1:4),           GDR3F405.519    
     &        ' Wait to call INBOUND/UPBOUND in U_MODEL.'                  GDR3F405.520    
                                                                           GDR3F405.521    
!             Determine which boundary data is required to proceed         GDR3F405.522    
!             the next period.                                             GDR3F405.523    
              ms_ntimes = 2 + (stepim(a_im)/boundary_stepsim(a_im))        GDR3F405.524    
                                                                           GDR3F405.525    
*IF DEF,MPP                                                                GDR3F405.526    
              if (mype.eq.0) then                                          GDR3F405.527    
*ENDIF                                                                     GDR3F405.528    
                                                                           GDR3F405.529    
                len_wait_tot = 0                                           GDR3F405.530    
 160            continue                                                   GDR3F405.531    
                                                                           GDR3F405.532    
!               Close the communication file and re-open.                  GDR3F405.533    
                close(190)                                                 GDR3F405.534    
                open (190,file=lbc_filename,action="read",iostat=icode)    GDR3F405.535    
                                                                           GDR3F405.536    
!               Check return code from OPEN.                               GDR3F405.537    
                if (icode.ne.0) then                                       GDR3F405.538    
                  write (6,*) ' Return code from OPEN ',icode              GDR3F405.539    
                  icode = 701                                              GDR3F405.540    
                  write (cmessage,*) 'U_MODEL : Problem with OPEN '//      GDR3F405.541    
     &            'for Unit No 190.'                                       GDR3F405.542    
                  go to 162                                                GDR3F405.543    
                endif                                                      GDR3F405.544    
                                                                           GDR3F405.545    
 161            continue                                                   GDR3F405.546    
                                                                           GDR3F405.547    
!               Read next value.                                           GDR3F405.548    
                read (190,*,iostat=icode) lbc_ntimes                       GDR3F405.549    
                                                                           GDR3F405.550    
!               Check return code from READ.                               GDR3F405.551    
                if (icode.ne.0) then                                       GDR3F405.552    
                                                                           GDR3F405.553    
                  write (6,*) ' ms : Return code from READ ',icode         GDR3F405.554    
                                                                           GDR3F405.555    
                  if (len_wait_tot.ge.um_lbc_wait_max) then                GDR3F405.556    
!                   Maximum wait time has been reached or exceeded.        GDR3F405.557    
                    write (6,*) ' ms : Maximum wait time reached'//        GDR3F405.558    
     &              ' after ',um_lbc_wait_max,' seconds.'                  GDR3F405.559    
                    icode = 702                                            GDR3F405.560    
                    write (cmessage,*) 'U_MODEL : Maximum wait time '//    GDR3F405.561    
     &              'reached while reading from LBC_FILE.'                 GDR3F405.562    
                    go to 162                                              GDR3F405.563    
                  endif                                                    GDR3F405.564    
                                                                           GDR3F405.565    
!                 Wait for um_lbc_wait seconds before re-trying.           GDR3F405.566    
                                                                           GDR3F405.567    
                  write (6,*) ' ms : Wait for ',um_lbc_wait,               GDR3F405.568    
     &                        ' seconds and retry.'                        GDR3F405.569    
                  isleep = sleep(um_lbc_wait)                              GDR3F405.570    
                  len_wait_tot = len_wait_tot+um_lbc_wait                  GDR3F405.571    
                  write (6,*) ' ms : Total Wait so far ',len_wait_tot,     GDR3F405.572    
     &                        ' seconds.'                                  GDR3F405.573    
                                                                           GDR3F405.574    
                  go to 160  ! Retry finding required lbc_ntimes           GDR3F405.575    
                                                                           GDR3F405.576    
                endif  !  if icode.ne.0                                    GDR3F405.577    
                                                                           GDR3F405.578    
!               See if required lbc_ntimes has been read in.               GDR3F405.579    
                if (lbc_ntimes.ge.1000) then                               GDR3F405.580    
                                                                           GDR3F405.581    
!                 First value in file is always >1000. Read next value.    GDR3F405.582    
                  go to 161                                                GDR3F405.583    
                                                                           GDR3F405.584    
                elseif (lbc_ntimes.lt.ms_ntimes) then                      GDR3F405.585    
                                                                           GDR3F405.586    
                  write (6,*) ' ms : gl_ntimes = ',lbc_ntimes,             GDR3F405.587    
     &            ' read in. gl_ntimes >= ',ms_ntimes,                     GDR3F405.588    
     &            ' is required. Read next value.'                         GDR3F405.589    
                  go to 161                                                GDR3F405.590    
                                                                           GDR3F405.591    
                elseif (lbc_ntimes.ge.ms_ntimes) then                      GDR3F405.592    
                                                                           GDR3F405.593    
                  write (6,*) ' ms : gl_ntimes = ',lbc_ntimes,             GDR3F405.594    
     &            ' read in. gl_ntimes >= ',ms_ntimes,' is required.',     GDR3F405.595    
     &            ' Proceed.'                                              GDR3F405.596    
                                                                           GDR3F405.597    
                  call date_and_time (ch_date2, ch_time2)                  GDR3F405.598    
                  write(6,*)  'LBC_COUP: ',                                GDR3F405.599    
     &            ch_time2(1:2),':',ch_time2(3:4),':',ch_time2(5:6),       GDR3F405.600    
     &            ' on ',                                                  GDR3F405.601    
     &            ch_date2(7:8),'/',ch_date2(5:6),'/',ch_date2(1:4),       GDR3F405.602    
     &            ' Proceed to call INBOUND in U_MODEL.'                   GDR3F405.603    
                                                                           GDR3F405.604    
                endif  !  if lbc_ntimes                                    GDR3F405.605    
                                                                           GDR3F405.606    
*IF DEF,MPP                                                                GDR3F405.607    
              endif !  if mype=0                                           GDR3F405.608    
*ENDIF                                                                     GDR3F405.609    
                                                                           GDR3F405.610    
 162          continue                                                     GDR3F405.611    
                                                                           GDR3F405.612    
*IF DEF,MPP                                                                GDR3F405.613    
!             Broadcast ICODE to all PEs                                   GDR3F405.614    
              iostatus = icode                                             GDR3F405.615    
              call gc_ibcast (458,1,0,nproc,info,iostatus)                 GDR3F405.616    
              icode = iostatus                                             GDR3F405.617    
*ENDIF                                                                     GDR3F405.618    
                                                                           GDR3F405.619    
!             Check on ICODE before proceeding.                            GDR3F405.620    
              if (icode.ne.0) then                                         GDR3F405.621    
                write (6,*) ' U_MODEL - Error detected.'                   GDR3F405.622    
                write (6,*) ' ICODE : ',ICODE                              GDR3F405.623    
                write (6,*) ' CMESSAGE : ',CMESSAGE                        GDR3F405.624    
                go to 999   !  Return                                      GDR3F405.625    
              endif                                                        GDR3F405.626    
                                                                           GDR3F405.627    
!             Call IN_BOUND to update the headers/lookup-table             GDR3F405.628    
                                                                           GDR3F405.629    
              IF (LTIMER) CALL TIMER('IN_BOUND',3)                         GDR3F405.630    
                                                                           GDR3F405.631    
              CALL IN_BOUND(                                               GDR3F405.632    
*CALL ARGSIZE                                                              GDR3F405.633    
*CALL ARTDUMA                                                              GDR3F405.634    
*CALL ARTDUMO                                                              GDR3F405.635    
*CALL ARTDUMW                                                              GDR3F405.636    
*CALL ARTSTS                                                               GDR3F405.637    
*CALL ARTPTRA                                                              GDR3F405.638    
*CALL ARTPTRO                                                              GDR3F405.639    
*CALL ARTPTRW                                                              GDR3F405.640    
*CALL ARTBND                                                               GDR3F405.641    
*IF DEF,ATMOS                                                              GDR3F405.642    
     &   A_LEN1_LEVDEPC,A_LEN2_LEVDEPC,   ! for dynamic array              GDR3F405.643    
*ENDIF                                                                     GDR3F405.644    
*IF DEF,OCEAN                                                              GDR3F405.645    
     &   O_LEN1_LEVDEPC,O_LEN2_LEVDEPC,   ! for dynamic array              GDR3F405.646    
*ENDIF                                                                     GDR3F405.647    
*IF DEF,WAVE                                                               GDR3F405.648    
     &   W_LEN1_LEVDEPC,W_LEN2_LEVDEPC,   ! for dynamic array              GDR3F405.649    
*ENDIF                                                                     GDR3F405.650    
*CALL ARGPPX                                                               GDR3F405.651    
     &                   ICODE,CMESSAGE)                                   GDR3F405.652    
                                                                           GDR3F405.653    
              IF (LTIMER) CALL TIMER('IN_BOUND',4)                         GDR3F405.654    
                                                                           GDR3F405.655    
              IF (ICODE.GT.0) GO TO 999   !  Return                        GDR3F405.656    
                                                                           GDR3F405.657    
              call date_and_time(ch_date2, ch_time2)                       GDR3F405.658    
                                                                           GDR3F405.659    
              write(6,*)  'LBC_COUP: ',                                    GDR3F405.660    
     &        ch_time2(1:2),':',ch_time2(3:4),':',ch_time2(5:6),' on ',    GDR3F405.661    
     &        ch_date2(7:8),'/',ch_date2(5:6),'/',ch_date2(1:4),           GDR3F405.662    
     &        ' Proceed to call UPBOUND in U_MODEL.'                       GDR3F405.663    
                                                                           GDR3F405.664    
            endif   !   if l_lbc_coup                                      GDR3F405.665    
                                                                           GDR3F405.666    
                                IF (LTIMER) CALL TIMER('UP_BOUND',3)       U_MODEL1.233    
      CALL UP_BOUND(submodel,                                              GRR2F305.641    
*CALL ARGSIZE                                                              @DYALLOC.3771   
*CALL ARTD1                                                                @DYALLOC.3772   
*CALL ARTDUMA                                                              @DYALLOC.3773   
*CALL ARTDUMO                                                              @DYALLOC.3774   
*CALL ARTDUMW                                                              WRB1F401.1170   
*CALL ARTPTRA                                                              @DYALLOC.3775   
*CALL ARTPTRO                                                              @DYALLOC.3776   
*CALL ARTPTRW                                                              WRB1F401.1171   
*CALL ARTBND                                                               @DYALLOC.3777   
*CALL ARGPPX                                                               GDG0F401.1479   
     &              ICODE,CMESSAGE)                                        GDG0F401.1480   
                                IF (LTIMER) CALL TIMER('UP_BOUND',4)       U_MODEL1.235    
            IF (ICODE.GT.0) GOTO 999                                       U_MODEL1.236    
          ENDIF                                                            U_MODEL1.237    
*IF DEF,T3E                                                                GPB0F405.15     
! Flush any output from this timestep to unit6 output file                 GPB0F405.16     
      CALL flush(6)                                                        GPB0F405.17     
*ENDIF                                                                     GPB0F405.18     
CL                                                                         U_MODEL1.238    
CL      End main timestep loop                                             U_MODEL1.239    
CL----------------------------------------------------------------------   U_MODEL1.240    
*IF DEF,ATMOS                                                              U_MODEL1.241    
*IF DEF,OCEAN,OR,DEF,SLAB                                                  U_MODEL1.242    
                                                                           U_MODEL1.243    
        ENDDO                                                              U_MODEL1.244    
CL                                                                         U_MODEL1.245    
CL 3.2 If coupled, set timestep group control switches for next group      U_MODEL1.246    
CL                                                                         U_MODEL1.247    
        internal_model_prev=internal_model                                 GRR2F305.642    
        submodel_prev      =submodel                                       GRR2F305.643    
                                                                           GRR2F305.644    
                                IF (LTIMER) CALL TIMER('SETGRCTL',3)       U_MODEL1.248    
        CALL SETGRCTL(internal_model,submodel,NGROUP,                      GRR2F305.645    
     *                ICODE,CMESSAGE)                                      GRR2F305.646    
                                IF (LTIMER) CALL TIMER('SETGRCTL',4)       U_MODEL1.250    
        IF (ICODE.GT.0) GOTO 999                                           U_MODEL1.251    
                                                                           U_MODEL1.252    
CL 3.3 If coupled model, swap atmosphere/ocean data from disk to memory    U_MODEL1.253    
CL     and perform the data transfer (full coupled model),                 U_MODEL1.254    
CL     No action required for slab model.                                  U_MODEL1.255    
*IF DEF,OCEAN                                                              U_MODEL1.256    
*IF DEF,MPP                                                                GRR0F402.30     
! Get 'global' atmos and ocean horizontal domain sizes from database       GRR0F402.31     
! in DECOMPDB to set dynamic allocation in SWAP_A2O,SWAP_O2A.              GRR0F402.32     
        G_P_FIELD= decomp_db_glsize(1,decomp_standard_atmos) *             GRR0F402.33     
     &             decomp_db_glsize(2,decomp_standard_atmos)               GRR0F402.34     
                                                                           GRR0F402.35     
        G_IMTJMT = decomp_db_glsize(1,decomp_standard_ocean) *             GRR0F402.36     
     &             decomp_db_glsize(2,decomp_standard_ocean)               GRR0F402.37     
*ELSE                                                                      GRR0F402.38     
! Sizes not used for non-MPP: dummy values only                            GRR0F402.39     
        G_P_FIELD= P_FIELD                                                 GRR0F402.40     
        G_IMTJMT = IMT*JMT                                                 GRR0F402.41     
*ENDIF                                                                     GRR0F402.42     
        IF(new_sm) THEN     ! New submodel partition                       GRR2F305.647    
                                                                           GRR2F305.648    
      IF (L_CO2_INTERACTIVE) THEN                                          CCN1F405.90     
        CO2_DIMA  = G_P_FIELD                                              CCN1F405.91     
        CO2_DIMO  = G_IMTJMT                                               CCN1F405.92     
*IF DEF,MPP                                                                CCN1F405.93     
        CO2_DIMO2 = (decomp_db_glsize(1,decomp_standard_ocean)-2) *        CCN1F405.94     
     &              decomp_db_glsize(2,decomp_standard_ocean)              CCN1F405.95     
*ELSE                                                                      CCN1F405.96     
        CO2_DIMO2 = (IMT-2)*JMT                                            CCN1F405.97     
*ENDIF                                                                     CCN1F405.98     
      ELSE                                                                 CCN1F405.99     
        CO2_DIMA  = 1                                                      CCN1F405.100    
        CO2_DIMO  = 1                                                      CCN1F405.101    
        CO2_DIMO2 = 1                                                      CCN1F405.102    
      ENDIF                                                                CCN1F405.103    
           IF(submodel.EQ.ocean_sm.AND.                                    GRR2F305.649    
     *        submodel_prev.EQ.atmos_sm) THEN     ! Atmos -> Ocean         GRR2F305.650    
                                                                           GRR2F305.651    
                                IF (LTIMER) CALL TIMER('SWAP_A2O',3)       U_MODEL1.258    
          CALL SWAP_A2O(G_P_FIELD,G_IMTJMT,CO2_DIMA,CO2_DIMO,              CCN1F405.104    
*CALL ARGSIZE                                                              @DYALLOC.3780   
*CALL ARTD1                                                                @DYALLOC.3781   
*CALL ARTDUMO                                                              @DYALLOC.3782   
*CALL ARTPTRA                                                              @DYALLOC.3783   
*CALL ARTPTRO                                                              @DYALLOC.3784   
*CALL ARTCONA                                                              @DYALLOC.3785   
*CALL ARTCONO                                                              CJG6F401.1      
*CALL ARTAOCPL                                                             @DYALLOC.3786   
     *                  ICODE,CMESSAGE)                                    @DYALLOC.3787   
                                IF (LTIMER) CALL TIMER('SWAP_A2O',4)       U_MODEL1.260    
                                                                           GRR2F305.653    
           ELSEIF(submodel.EQ.atmos_sm.AND.                                GRR2F305.654    
     *            submodel_prev.EQ.ocean_sm) THEN ! Ocean -> Atmos         GRR2F305.655    
                                                                           GRR2F305.656    
                                IF (LTIMER) CALL TIMER('SWAP_O2A',3)       U_MODEL1.262    
          CALL SWAP_O2A(G_P_FIELD,G_IMTJMT,CO2_DIMA,CO2_DIMO,CO2_DIMO2,    CCN1F405.105    
*CALL ARGSIZE                                                              @DYALLOC.3789   
*CALL ARTD1                                                                @DYALLOC.3790   
*CALL ARTDUMO                                                              @DYALLOC.3791   
*CALL ARTPTRA                                                              @DYALLOC.3792   
*CALL ARTPTRO                                                              @DYALLOC.3793   
*CALL ARTCONO                                                              CJG6F401.2      
*CALL ARTAOCPL                                                             @DYALLOC.3794   
     *                  ICODE,CMESSAGE)                                    @DYALLOC.3795   
                                IF (LTIMER) CALL TIMER('SWAP_O2A',4)       U_MODEL1.264    
                                                                           GRR2F305.658    
           ELSE     ! No other submodel -> submodel coupling allowed yet   GRR2F305.659    
              ICODE=1                                                      GRR2F305.660    
              CMESSAGE='U_MODEL: Illegal combination of submodels'         GRR2F305.661    
              write(6,*) CMESSAGE                                          GRR2F305.662    
              write(6,*) 'Previous submodel id =',submodel_prev,           GRR2F305.663    
     *                   'Current  submodel id =',submodel                 GRR2F305.664    
                                                                           GRR2F305.665    
           ENDIF    ! End tests on coupled submodels' identity             GRR2F305.666    
                                                                           GRR2F305.667    
        ENDIF    ! End test on new submodel                                GRR2F305.668    
        IF (ICODE.GT.0) GOTO 999                                           U_MODEL1.266    
*ENDIF                                                                     U_MODEL1.267    
CL                                                                         U_MODEL1.268    
CL      End group of timesteps                                             U_MODEL1.269    
CL----------------------------------------------------------------------   U_MODEL1.270    
*ENDIF                                                                     U_MODEL1.271    
*ENDIF                                                                     U_MODEL1.272    
      GOTO 1                                                               U_MODEL1.273    
C                                                                          U_MODEL1.274    
 999  CONTINUE                                                             U_MODEL1.275    
CL----------------------------------------------------------------------   U_MODEL1.276    
CL 4. Exit processing: Output error messages and perform tidy-up           U_MODEL1.277    
CL                                                                         U_MODEL1.278    
CL 4.1 Exit processing: If abnormal completion, output error message       U_MODEL1.279    
      IABORT=ICODE                                                         U_MODEL1.280    
      IF (ICODE.NE.0) THEN                                                 U_MODEL1.281    
                                IF (LTIMER) CALL TIMER('EREPORT ',3)       U_MODEL1.282    
        CALL EREPORT(ICODE,CMESSAGE)                                       U_MODEL1.283    
                                IF (LTIMER) CALL TIMER('EREPORT ',4)       U_MODEL1.284    
      ENDIF                                                                U_MODEL1.285    
CL 4.2 Exit processing: Perform tidy-up                                    U_MODEL1.286    
                                IF (LTIMER) CALL TIMER('EXITPROC',3)       U_MODEL1.287    
      CALL EXITPROC(ICODE,CMESSAGE)                                        U_MODEL1.288    
                                IF (LTIMER) CALL TIMER('EXITPROC',4)       U_MODEL1.289    
CL 4.3 Exit processing: If error in exit processing, output error mess     U_MODEL1.290    
      IF (ICODE.NE.0) THEN                                                 U_MODEL1.291    
                                IF (LTIMER) CALL TIMER('EREPORT ',3)       U_MODEL1.292    
        CALL EREPORT(ICODE,CMESSAGE)                                       U_MODEL1.293    
                                IF (LTIMER) CALL TIMER('EREPORT ',4)       U_MODEL1.294    
      ENDIF                                                                U_MODEL1.295    
CL----------------------------------------------------------------------   U_MODEL1.296    
CL 5. Complete Timer call and return                                       @DYALLOC.3796   
CL                                                                         U_MODEL1.298    
      ICODE=IABORT                                                         @DYALLOC.3797   
      IF (LTIMER) THEN                                                     GSM1F401.29     
        CALL TIMER('U_MODEL ',4)                                           GSM1F401.30     
      END IF                                                               GSM1F401.31     
      RETURN                                                               @DYALLOC.3799   
      END                                                                  U_MODEL1.302    
*ENDIF                                                                     U_MODEL1.303