*IF DEF,CONTROL,AND,DEF,ATMOS                                              BOUNDVA1.2      
C ******************************COPYRIGHT******************************    GTS2F400.595    
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.596    
C                                                                          GTS2F400.597    
C Use, duplication or disclosure of this code is subject to the            GTS2F400.598    
C restrictions as set forth in the contract.                               GTS2F400.599    
C                                                                          GTS2F400.600    
C                Meteorological Office                                     GTS2F400.601    
C                London Road                                               GTS2F400.602    
C                BRACKNELL                                                 GTS2F400.603    
C                Berkshire UK                                              GTS2F400.604    
C                RG12 2SZ                                                  GTS2F400.605    
C                                                                          GTS2F400.606    
C If no contract has been raised with this copy of the code, the use,      GTS2F400.607    
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.608    
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.609    
C Modelling at the above address.                                          GTS2F400.610    
C ******************************COPYRIGHT******************************    GTS2F400.611    
C                                                                          GTS2F400.612    
CLL -------------- SUBROUTINE BOUNDVAL ---------------------------------   BOUNDVA1.3      
CLL                                                                        BOUNDVA1.4      
CLL Purpose: (i) To update the large scale model values using the          BOUNDVA1.5      
CLL         stored large scale tendencies.                                 BOUNDVA1.6      
CLL          (ii) To merge values near the boundary of a limited           BOUNDVA1.7      
CLL         area model with those provided from a large scale model        BOUNDVA1.8      
CLL         over an interface zone.                                        BOUNDVA1.9      
CLL                                                                        BOUNDVA1.10     
CLL Level 2 control routine                                                BOUNDVA1.11     
CLL Version for Cray YMP                                                   BOUNDVA1.12     
CLL                                                                        BOUNDVA1.13     
CLL C.Wilson    <- programmer of some or all of previous code or changes   BOUNDVA1.14     
CLL                                                                        BOUNDVA1.15     
CLL  Model            Modification history from model version 3.0:         BOUNDVA1.16     
CLL version  Date                                                          BOUNDVA1.17     
CLL  3.2  27/05/93  Dynamic allocation changes - R.T.H.Barnes.             @DYALLOC.667    
CLL 3.4  16/6/94 : Change CHARACTER*(*) to CHARACTER*(80) N.Farnon         ANF0F304.5      
!   4.1  16/01/96  Added MPP code    P.Burton                              APB4F401.3      
!   4.4  11/08/97  Generalise for mixed phase precip scheme. RTHBarnes.    ARB1F404.21     
!LL 4.5  27/05/98  Corrected order of indicies for JTRACER                 GPB0F405.122    
!LL                and removed commented out code                          GPB0F405.123    
!LL                                                        P.Burton        GPB0F405.124    
CLL                                                                        BOUNDVA1.18     
CLL Programing standard: UM Documentation paper No3,                       BOUNDVA1.19     
CLL                      Version No 1, dated 15/01/90                      BOUNDVA1.20     
CLL                                                                        BOUNDVA1.21     
CLL logical components covered: C72 (part)                                 BOUNDVA1.22     
CLL                                                                        BOUNDVA1.23     
CLL Project task: C7                                                       BOUNDVA1.24     
CLL                                                                        BOUNDVA1.25     
CLL Documentation: UM Documentation paper No 10,                           BOUNDVA1.26     
CLL                draft version No 7, Dated 05/02/90                      BOUNDVA1.27     
CLL    UM Documentation paper No C7, draft version No 6, Dated 22/01/90    BOUNDVA1.28     
CLL                                                                        BOUNDVA1.29     
CLLEND ------------------------------------------------------------        BOUNDVA1.30     
C                                                                          BOUNDVA1.31     

      SUBROUTINE BOUNDVAL(                                                  1,23@DYALLOC.668    
*CALL ARGSIZE                                                              @DYALLOC.669    
*CALL ARGD1                                                                @DYALLOC.670    
*CALL ARGDUMA                                                              @DYALLOC.671    
*CALL ARGPTRA                                                              @DYALLOC.672    
*CALL ARGBND                                                               @DYALLOC.673    
     &           ICODE,CMESSAGE)                                           @DYALLOC.674    
                                                                           BOUNDVA1.33     
      IMPLICIT NONE                                                        BOUNDVA1.34     
                                                                           BOUNDVA1.35     
*CALL CMAXSIZE                                                             @DYALLOC.675    
*CALL TYPSIZE                                                              @DYALLOC.676    
*CALL TYPD1                                                                @DYALLOC.677    
*CALL TYPDUMA                                                              @DYALLOC.678    
*CALL TYPPTRA                                                              @DYALLOC.679    
*CALL TYPBND                                                               @DYALLOC.680    
*IF DEF,MPP                                                                APB4F401.4      
*CALL PARVARS                                                              APB4F401.5      
*ENDIF                                                                     APB4F401.6      
                                                                           @DYALLOC.681    
      INTEGER                                                              @DYALLOC.682    
     &        ICODE            ! Return code = 0 Normal Exit               @DYALLOC.683    
C                              !    "     "  > 0 Error Exit                @DYALLOC.684    
                                                                           @DYALLOC.685    
      CHARACTER*(80) CMESSAGE   ! Error message if ICODE > 0               ANF0F304.6      
C                                                                          @DYALLOC.687    
*CALL CNTLATM                                                              ARB1F404.22     
*CALL CLOOKADD                                                             BOUNDVA1.39     
                                                                           BOUNDVA1.40     
      EXTERNAL                                                             BOUNDVA1.41     
*IF DEF,MPP                                                                ARB1F404.23     
     &       MPP_MERGEFLD                                                  ARB1F404.24     
*ELSE                                                                      ARB1F404.25     
     &       MERGEFLD                                                      BOUNDVA1.42     
*ENDIF                                                                     ARB1F404.26     
                                                                           BOUNDVA1.43     
C*                                                                         BOUNDVA1.44     
C  Local variables                                                         BOUNDVA1.45     
                                                                           BOUNDVA1.46     
      REAL                                                                 BOUNDVA1.47     
     &       SCALAR                                                        BOUNDVA1.48     
     &      ,TEMP(LENRIMA)                                                 ARB1F404.27     
                                                                           BOUNDVA1.49     
      INTEGER                                                              BOUNDVA1.50     
     &       I,                                                            BOUNDVA1.51     
     &       LEVEL,                                                        BOUNDVA1.52     
     &       IADDR,                                                        BOUNDVA1.53     
     &       VAR                                                           BOUNDVA1.54     
                                                                           BOUNDVA1.55     
CL Internal structure                                                      BOUNDVA1.56     
                                                                           BOUNDVA1.57     
CL 1.0 UPDATE BOUNDARY VALUES                                              BOUNDVA1.58     
                                                                           BOUNDVA1.59     
CL 1.1 Check if using fixed boundaries                                     BOUNDVA1.60     
      IF ( BOUND_FIELDCODE(1).LE.0) RETURN                                 BOUNDVA1.61     
                                                                           BOUNDVA1.62     
      SCALAR=1.0/REAL(RIM_STEPSA)                                          BOUNDVA1.63     
      DO 100 I=1,LENRIMDATA_A                                              BOUNDVA1.64     
        D1(JRIM+I-1)=D1(JRIM+I-1)+D1(JRIM_TENDENCY+I-1)*SCALAR             BOUNDVA1.65     
 100  CONTINUE                                                             BOUNDVA1.66     
                                                                           BOUNDVA1.67     
CL 2.0 Loop over fields to be updated                                      BOUNDVA1.68     
                                                                           BOUNDVA1.69     
                                                                           BOUNDVA1.70     
C PSTAR                                                                    BOUNDVA1.71     
                                                                           BOUNDVA1.72     
*IF -DEF,MPP                                                               APB4F401.7      
      CALL MERGEFLD(ROW_LENGTH,ROW_LENGTH,P_ROWS,RIMWIDTHA,                BOUNDVA1.73     
     &     RIMWEIGHTSA,D1(JRIM),D1(JPSTAR))                                BOUNDVA1.74     
*ELSE                                                                      APB4F401.8      
      CALL MPP_MERGEFLD(ROW_LENGTH,P_ROWS,                                 APB4F401.9      
     &                  LENRIMA,RIMWIDTHA,RIMWEIGHTSA,                     APB4F401.10     
     &                  fld_type_p,D1(JRIM),D1(JPSTAR))                    APB4F401.11     
*ENDIF                                                                     APB4F401.12     
                                                                           BOUNDVA1.75     
      IADDR=JRIM+LENRIMA                                                   BOUNDVA1.76     
                                                                           BOUNDVA1.77     
C     U                                                                    BOUNDVA1.78     
                                                                           BOUNDVA1.79     
      DO 20 LEVEL=1,P_LEVELS                                               BOUNDVA1.80     
                                                                           BOUNDVA1.81     
*IF -DEF,MPP                                                               APB4F401.13     
        CALL MERGEFLD(ROW_LENGTH-1,ROW_LENGTH,U_ROWS,RIMWIDTHA,            BOUNDVA1.82     
     &       RIMWEIGHTSA,D1(IADDR),D1(JU(LEVEL)))                          BOUNDVA1.83     
                                                                           BOUNDVA1.84     
      DO 205 I=ROW_LENGTH,U_FIELD,ROW_LENGTH                               BOUNDVA1.85     
      D1(JU(LEVEL)+I-1) = D1(JU(LEVEL)+I-2)                                BOUNDVA1.86     
205   CONTINUE                                                             BOUNDVA1.87     
                                                                           BOUNDVA1.88     
        IADDR=IADDR+LENRIMA-4*RIMWIDTHA                                    BOUNDVA1.89     
*ELSE                                                                      APB4F401.14     
        CALL MPP_MERGEFLD(ROW_LENGTH,P_ROWS,                               APB4F401.15     
     &                    LENRIMA_U,RIMWIDTHA,RIMWEIGHTSA,                 APB4F401.16     
     &                    fld_type_u,D1(IADDR),D1(JU(LEVEL)))              APB4F401.17     
                                                                           APB4F401.18     
        IF (atright) THEN                                                  APB4F401.19     
          DO I=ROW_LENGTH,U_FIELD,ROW_LENGTH                               APB4F401.20     
            D1(JU(LEVEL)+I-1-Offx) = D1(JU(LEVEL)+I-2-Offx)                APB4F401.21     
          ENDDO                                                            APB4F401.22     
        ENDIF                                                              APB4F401.23     
                                                                           APB4F401.24     
        IADDR=IADDR+LENRIMA_U                                              APB4F401.25     
*ENDIF                                                                     APB4F401.26     
                                                                           BOUNDVA1.90     
 20   CONTINUE                                                             BOUNDVA1.91     
                                                                           BOUNDVA1.92     
C     V                                                                    BOUNDVA1.93     
                                                                           BOUNDVA1.94     
      DO 21 LEVEL=1,P_LEVELS                                               BOUNDVA1.95     
*IF -DEF,MPP                                                               APB4F401.27     
        CALL MERGEFLD(ROW_LENGTH-1,ROW_LENGTH,U_ROWS,RIMWIDTHA,            BOUNDVA1.96     
     &       RIMWEIGHTSA,D1(IADDR),D1(JV(LEVEL)))                          BOUNDVA1.97     
                                                                           BOUNDVA1.98     
                                                                           BOUNDVA1.99     
      DO 215 I=ROW_LENGTH,U_FIELD,ROW_LENGTH                               BOUNDVA1.100    
      D1(JV(LEVEL)+I-1) = D1(JV(LEVEL)+I-2)                                BOUNDVA1.101    
215   CONTINUE                                                             BOUNDVA1.102    
                                                                           BOUNDVA1.103    
        IADDR=IADDR+LENRIMA-4*RIMWIDTHA                                    BOUNDVA1.104    
*ELSE                                                                      APB4F401.28     
        CALL MPP_MERGEFLD(ROW_LENGTH,P_ROWS,                               APB4F401.29     
     &                    LENRIMA_U,RIMWIDTHA,RIMWEIGHTSA,                 APB4F401.30     
     &                    fld_type_u,D1(IADDR),D1(JV(LEVEL)))              APB4F401.31     
                                                                           APB4F401.32     
        IF (atright) THEN                                                  APB4F401.33     
          DO I=ROW_LENGTH,U_FIELD,ROW_LENGTH                               APB4F401.34     
            D1(JV(LEVEL)+I-1-Offx) = D1(JV(LEVEL)+I-2-Offx)                APB4F401.35     
          ENDDO                                                            APB4F401.36     
        ENDIF                                                              APB4F401.37     
                                                                           APB4F401.38     
        IADDR=IADDR+LENRIMA_U                                              APB4F401.39     
*ENDIF                                                                     APB4F401.40     
                                                                           BOUNDVA1.105    
 21   CONTINUE                                                             BOUNDVA1.106    
                                                                           BOUNDVA1.107    
C    THETAL                                                                BOUNDVA1.108    
                                                                           BOUNDVA1.109    
      DO 22 LEVEL=1,P_LEVELS                                               BOUNDVA1.110    
                                                                           BOUNDVA1.111    
*IF -DEF,MPP                                                               APB4F401.41     
        CALL MERGEFLD(ROW_LENGTH,ROW_LENGTH,P_ROWS,RIMWIDTHA,              BOUNDVA1.112    
     &       RIMWEIGHTSA,D1(IADDR),D1(JTHETA(LEVEL)))                      BOUNDVA1.113    
*ELSE                                                                      APB4F401.42     
        CALL MPP_MERGEFLD(ROW_LENGTH,P_ROWS,                               APB4F401.43     
     &                    LENRIMA,RIMWIDTHA,RIMWEIGHTSA,                   APB4F401.44     
     &                    fld_type_p,D1(IADDR),D1(JTHETA(LEVEL)))          APB4F401.45     
*ENDIF                                                                     APB4F401.46     
        do i=jtheta(level),jtheta(level)+p_field-1                         PXNEGQ.1      
          if (d1(i) .lt. 0.0) then                                         PXNEGQ.2      
            write(6,*)'Theta at level ',level,' point ',i,d1(i)            PXNEGQ.3      
            d1(i)=0.0                                                      PXNEGQ.4      
          endif                                                            PXNEGQ.5      
        enddo                                                              PXNEGQ.6      
                                                                           BOUNDVA1.114    
        IADDR=IADDR+LENRIMA                                                BOUNDVA1.115    
                                                                           BOUNDVA1.116    
 22   CONTINUE                                                             BOUNDVA1.117    
                                                                           BOUNDVA1.118    
C     QT                                                                   BOUNDVA1.119    
                                                                           BOUNDVA1.120    
      DO 23 LEVEL=1,Q_LEVELS                                               BOUNDVA1.121    
                                                                           BOUNDVA1.122    
*IF -DEF,MPP                                                               APB4F401.47     
        CALL MERGEFLD(ROW_LENGTH,ROW_LENGTH,P_ROWS,RIMWIDTHA,              BOUNDVA1.123    
     &       RIMWEIGHTSA,D1(IADDR),D1(JQ(LEVEL)))                          BOUNDVA1.124    
*ELSE                                                                      APB4F401.48     
        CALL MPP_MERGEFLD(ROW_LENGTH,P_ROWS,                               APB4F401.49     
     &                    LENRIMA,RIMWIDTHA,RIMWEIGHTSA,                   APB4F401.50     
     &                    fld_type_p,D1(IADDR),D1(JQ(LEVEL)))              APB4F401.51     
*ENDIF                                                                     APB4F401.52     
        do i=jq(level),jq(level)+p_field-1                                 PXNEGQ.7      
          if (d1(i) .lt. 0.0) then                                         PXNEGQ.8      
            write(6,*)'Q at level ',level,' point ',i,d1(i)                PXNEGQ.9      
            d1(i)=0.0                                                      PXNEGQ.10     
          endif                                                            PXNEGQ.11     
        enddo                                                              PXNEGQ.12     
                                                                           BOUNDVA1.125    
        IADDR=IADDR+LENRIMA                                                BOUNDVA1.126    
                                                                           BOUNDVA1.127    
                                                                           BOUNDVA1.128    
 23   CONTINUE                                                             BOUNDVA1.129    
                                                                           BOUNDVA1.130    
C     TRACERS                                                              BOUNDVA1.131    
                                                                           BOUNDVA1.132    
      IF (TR_VARS.gt.0) THEN                                               ARB1F404.28     
      DO 26 VAR=1,TR_VARS                                                  BOUNDVA1.133    
        DO 27 LEVEL=1,TR_LEVELS                                            BOUNDVA1.134    
                                                                           BOUNDVA1.135    
*IF -DEF,MPP                                                               APB4F401.53     
          CALL MERGEFLD(ROW_LENGTH,ROW_LENGTH,P_ROWS,RIMWIDTHA,            BOUNDVA1.136    
     &         RIMWEIGHTSA,D1(IADDR),D1(JTRACER(LEVEL,VAR)))               GPB0F405.125    
*ELSE                                                                      APB4F401.54     
          CALL MPP_MERGEFLD(ROW_LENGTH,P_ROWS,                             APB4F401.55     
     &                      LENRIMA,RIMWIDTHA,RIMWEIGHTSA,                 APB4F401.56     
     &                      fld_type_p,D1(IADDR),D1(JTRACER(LEVEL,VAR)))   GPB0F405.126    
*ENDIF                                                                     APB4F401.58     
                                                                           BOUNDVA1.138    
          IADDR=IADDR+LENRIMA                                              BOUNDVA1.139    
                                                                           BOUNDVA1.140    
 27     CONTINUE                                                           BOUNDVA1.141    
 26   CONTINUE                                                             BOUNDVA1.142    
      END IF ! TR_VARS                                                     ARB1F404.29     
                                                                           BOUNDVA1.143    
C     QCF                                                                  ARB1F404.30     
                                                                           ARB1F404.31     
      IF (L_LSPICE_BDY) THEN                                               ARB1F404.32     
      DO 24 LEVEL=1,Q_LEVELS                                               ARB1F404.33     
                                                                           ARB1F404.34     
*IF -DEF,MPP                                                               ARB1F404.35     
        CALL MERGEFLD(ROW_LENGTH,ROW_LENGTH,P_ROWS,RIMWIDTHA,              ARB1F404.36     
     &       RIMWEIGHTSA,D1(IADDR),D1(JQCF(LEVEL)))                        ARB1F404.37     
*ELSE                                                                      ARB1F404.38     
        CALL MPP_MERGEFLD(ROW_LENGTH,P_ROWS,                               ARB1F404.39     
     &                    LENRIMA,RIMWIDTHA,RIMWEIGHTSA,                   ARB1F404.40     
     &                    fld_type_p,D1(IADDR),D1(JQCF(LEVEL)))            ARB1F404.41     
*ENDIF                                                                     ARB1F404.42     
                                                                           ARB1F404.43     
        IADDR=IADDR+LENRIMA                                                ARB1F404.44     
                                                                           ARB1F404.45     
 24   CONTINUE                                                             ARB1F404.46     
                                                                           ARB1F404.47     
      ELSE                                                                 ARB1F404.48     
                                                                           ARB1F404.49     
! No qcf values available so update with field of zeroes.                  ARB1F404.50     
      DO  I = 1,LENRIMA                                                    ARB1F404.51     
        TEMP(I) = 0.0                                                      ARB1F404.52     
      END DO                                                               ARB1F404.53     
      DO 25 LEVEL=1,Q_LEVELS                                               ARB1F404.54     
                                                                           ARB1F404.55     
*IF -DEF,MPP                                                               ARB1F404.56     
        CALL MERGEFLD(ROW_LENGTH,ROW_LENGTH,P_ROWS,RIMWIDTHA,              ARB1F404.57     
     &       RIMWEIGHTSA,TEMP,D1(JQCF(LEVEL)))                             ARB1F404.58     
*ELSE                                                                      ARB1F404.59     
        CALL MPP_MERGEFLD(ROW_LENGTH,P_ROWS,                               ARB1F404.60     
     &                    LENRIMA,RIMWIDTHA,RIMWEIGHTSA,                   ARB1F404.61     
     &                    fld_type_p,TEMP,D1(JQCF(LEVEL)))                 ARB1F404.62     
*ENDIF                                                                     ARB1F404.63     
! Don't alter IADDR here.                                                  ARB1F404.64     
 25   CONTINUE                                                             ARB1F404.65     
      END IF ! L_LSPICE_BDY                                                ARB1F404.66     
                                                                           ARB1F404.67     
*IF DEF,MPP                                                                APB4F401.59     
! We must correct the halos of all the fields with new numbers in their    APB4F401.60     
! outer points.                                                            APB4F401.61     
      CALL SWAPBOUNDS(D1(JPSTAR),ROW_LENGTH,P_ROWS,Offx,Offy,1)            APB4F401.64     
      CALL SWAPBOUNDS(D1(JU(1)),ROW_LENGTH,P_ROWS,Offx,Offy,P_LEVELS)      APB4F401.66     
      CALL SWAPBOUNDS(D1(JV(1)),ROW_LENGTH,P_ROWS,Offx,Offy,P_LEVELS)      APB4F401.68     
      CALL SWAPBOUNDS(D1(JTHETA(1)),ROW_LENGTH,P_ROWS,Offx,Offy,           APB4F401.70     
     &                P_LEVELS)                                            APB4F401.71     
      CALL SWAPBOUNDS(D1(JQ(1)),ROW_LENGTH,P_ROWS,Offx,Offy,Q_LEVELS)      APB4F401.74     
      IF (TR_VARS.gt.0) THEN                                               ARB1F404.68     
      DO VAR=1,TR_VARS                                                     APB4F401.76     
        CALL SWAPBOUNDS(D1(JTRACER(1,VAR)),ROW_LENGTH,P_ROWS,Offx,Offy,    GPB0F405.127    
     &                  TR_LEVELS)                                         APB4F401.78     
      ENDDO                                                                APB4F401.81     
      END IF                                                               ARB1F404.69     
      IF (L_LSPICE) THEN                                                   ARB1F404.70     
      CALL SWAPBOUNDS(D1(JQCF(1)),ROW_LENGTH,P_ROWS,Offx,Offy,Q_LEVELS)    ARB1F404.71     
      END IF                                                               ARB1F404.72     
*ENDIF                                                                     APB4F401.82     
      RETURN                                                               BOUNDVA1.144    
      END                                                                  BOUNDVA1.145    
                                                                           BOUNDVA1.146    
                                                                           BOUNDVA1.147    
*ENDIF                                                                     BOUNDVA1.148