*IF DEF,C90_1A,OR,DEF,C90_2A,OR,DEF,C90_2B                                 AAD2F404.293    
C ******************************COPYRIGHT******************************    GTS2F400.1387   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.1388   
C                                                                          GTS2F400.1389   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.1390   
C restrictions as set forth in the contract.                               GTS2F400.1391   
C                                                                          GTS2F400.1392   
C                Meteorological Office                                     GTS2F400.1393   
C                London Road                                               GTS2F400.1394   
C                BRACKNELL                                                 GTS2F400.1395   
C                Berkshire UK                                              GTS2F400.1396   
C                RG12 2SZ                                                  GTS2F400.1397   
C                                                                          GTS2F400.1398   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.1399   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.1400   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.1401   
C Modelling at the above address.                                          GTS2F400.1402   
C ******************************COPYRIGHT******************************    GTS2F400.1403   
C                                                                          GTS2F400.1404   
CLL Subroutine COPYDIAG ----------------------------------------------     COPDIA1A.3      
CLL                                                                        COPDIA1A.4      
CLL Purpose : To copy a single diagnostic field from secondary space to    COPDIA1A.5      
CLL           the main data array for stash processing, and to extend      COPDIA1A.6      
CLL           the data to a full horizontal field.                         COPDIA1A.7      
CLL                                                                        COPDIA1A.8      
CLL Service routine                                                        COPDIA1A.9      
CLL                                                                        COPDIA1A.10     
CLL Written by : M.J.P. Cullen                                             COPDIA1A.11     
CLL                                                                        COPDIA1A.12     
CLL  Model            Modification history from model version 3.0:         COPDIA1A.13     
CLL version  Date                                                          COPDIA1A.14     
!LL  4.3     10/02/97 MPP code : Added PPX arguments and modified          GPB1F403.792    
!LL                   updating of polar rows.            P.Burton          GPB1F403.793    
CLL                                                                        COPDIA1A.15     
CLL Programming Standard : Unified Model Documentation paper number 4      COPDIA1A.16     
CLL                      : Version no 2, dated 18/01/90                    COPDIA1A.17     
CLL                                                                        COPDIA1A.18     
CLL System components covered : D3                                         COPDIA1A.19     
CLL                                                                        COPDIA1A.20     
CLL System task : P0                                                       COPDIA1A.21     
CLL                                                                        COPDIA1A.22     
CLL Documentation: U.M. Documentation paper number P0                      COPDIA1A.23     
CLL                    version 11 dated 26/11/90                           COPDIA1A.24     
CLL                                                                        COPDIA1A.25     
CLLEND -------------------------------------------------------------       COPDIA1A.26     
C                                                                          COPDIA1A.27     
C*L Arguments                                                              COPDIA1A.28     
C                                                                          COPDIA1A.29     

      SUBROUTINE COPYDIAG(DIAGOUT,DIAGIN,FIRST_POINT,LAST_POINT,FIELD,      94,2COPDIA1A.30     
     &                    ROW_LENGTH,                                      GPB1F403.794    
     &                    IM,IS,IE,                                        GPB1F403.795    
*CALL ARGPPX                                                               GPB1F403.796    
     &                    ICODE,CMESSAGE)                                  GPB1F403.797    
                                                                           COPDIA1A.32     
      IMPLICIT NONE                                                        COPDIA1A.33     
                                                                           COPDIA1A.34     
      INTEGER                                                              COPDIA1A.35     
     &       FIRST_POINT, ! First and last points for which data           COPDIA1A.36     
     &       LAST_POINT,  ! is pressent on input                           COPDIA1A.37     
     &       FIELD,       ! Length of full logical field                   COPDIA1A.38     
     &       ROW_LENGTH   ! Number of points in a row                      COPDIA1A.39     
     &,      IM,IS,IE     ! Model, section, item                           GPB1F403.798    
     &,      ICODE        ! Return code  =0 Normal exit  >1 Error          GPB1F403.799    
                                                                           GPB1F403.800    
      CHARACTER*80  CMESSAGE                                               GPB1F403.801    
                                                                           GPB1F403.802    
! ARGPPX arguments:                                                        GPB1F403.803    
*CALL CSUBMODL                                                             GPB1F403.804    
*CALL CPPXREF                                                              GPB1F403.805    
*CALL PPXLOOK                                                              GPB1F403.806    
                                                                           GPB1F403.807    
                                                                           COPDIA1A.40     
      REAL                                                                 COPDIA1A.41     
     &       DIAGIN(FIELD), ! Output data                                  COPDIA1A.42     
     &       DIAGOUT(FIELD) ! Input data                                   COPDIA1A.43     
                                                                           COPDIA1A.44     
                                                                           GPB1F403.808    
*IF DEF,MPP                                                                GPB1F403.809    
! MPP common block and parameters                                          GPB1F403.810    
*CALL PARVARS                                                              GPB1F403.811    
*ENDIF                                                                     GPB1F403.812    
C*                                                                         COPDIA1A.45     
C     Local variables                                                      COPDIA1A.46     
                                                                           COPDIA1A.47     
      INTEGER                                                              GPB1F403.813    
     &   I  ! loop bound                                                   GPB1F403.814    
     &,  NP_START , SP_START  ! start points of North/South pole rows      GPB1F403.815    
     &,  ECOL_START , WCOL_START ! start points of East/West boundaries    GPB1F403.816    
     &,  START_POINT,END_POINT ! MPP modified versions of FIRST/LAST       GPB1F403.817    
*IF DEF,MPP                                                                GPB1F403.818    
     &,  GR  ! grid type of grid                                           GPB1F403.819    
     &,  FLD_TYPE  ! is it a p field or a u field?                         GPB1F403.820    
     &,  info ! GCOM return code                                           GPB1F403.821    
                                                                           GPB1F403.822    
! Functions called:                                                        GPB1F403.823    
      INTEGER                                                              GPB1F403.824    
     &    EXPPXI,GET_FLD_TYPE                                              GPB1F403.825    
                                                                           GPB1F403.826    
*ENDIF                                                                     GPB1F403.827    
                                                                           GPB1F403.828    
      REAL                                                                 GPB1F403.829    
     &  COPY_VALUE  ! value to copy into start/end of array                GPB1F403.830    
                                                                           GPB1F403.831    
*IF DEF,MPP                                                                GPB1F403.832    
! Find out the gridtype of the field                                       GPB1F403.833    
      GR = EXPPXI(IM,IS,IE,ppx_grid_type,                                  GPB1F403.834    
*CALL ARGPPX                                                               GPB1F403.835    
     &            ICODE,CMESSAGE)                                          GPB1F403.836    
                                                                           GPB1F403.837    
      IF (ICODE .GT. 0) GOTO 9999                                          GPB1F403.838    
                                                                           GPB1F403.839    
! and use this to find the field type (p field or u field)                 GPB1F403.840    
                                                                           GPB1F403.841    
      FLD_TYPE=GET_FLD_TYPE(GR)                                            GPB1F403.842    
                                                                           GPB1F403.843    
*ENDIF                                                                     GPB1F403.844    
                                                                           GPB1F403.845    
! Set START_POINT and END_POINT                                            GPB1F403.846    
*IF -DEF,MPP                                                               GPB1F403.847    
      START_POINT=FIRST_POINT                                              GPB1F403.848    
      END_POINT=LAST_POINT                                                 GPB1F403.849    
*ELSE                                                                      GPB1F403.850    
! Place START and END to be in real data - not in the halos                GPB1F403.851    
      START_POINT=FIRST_POINT+Offx                                         GPB1F403.852    
      END_POINT=LAST_POINT-Offx                                            GPB1F403.853    
*ENDIF                                                                     GPB1F403.854    
                                                                           GPB1F403.855    
                                                                           COPDIA1A.51     
      DO I=START_POINT,END_POINT                                           GPB1F403.856    
        DIAGOUT(I)=DIAGIN(I)                                               COPDIA1A.53     
      END DO                                                               COPDIA1A.54     
                                                                           COPDIA1A.55     
! Set the START of the array to a constant value                           GPB1F403.857    
      COPY_VALUE=DIAGIN(START_POINT)                                       GPB1F403.858    
*IF DEF,MPP                                                                GPB1F403.859    
! If this is the Northern processor row - we must make sure we             GPB1F403.860    
! get a consistent value over the polar row - so we take                   GPB1F403.861    
! the value from PE 0 and use that on all processors                       GPB1F403.862    
      IF (attop) THEN                                                      GPB1F403.863    
        CALL GCG_RBCAST(700,1,first_comp_pe,gc_proc_row_group,             GPB1F403.864    
     &                  info,COPY_VALUE)                                   GPB1F403.865    
      ENDIF                                                                GPB1F403.866    
*ENDIF                                                                     GPB1F403.867    
                                                                           GPB1F403.868    
      DO I=1,START_POINT-1                                                 GPB1F403.869    
        DIAGOUT(I)=COPY_VALUE                                              GPB1F403.870    
      ENDDO                                                                GPB1F403.871    
                                                                           GPB1F403.872    
      COPY_VALUE=DIAGIN(END_POINT)                                         GPB1F403.873    
*IF DEF,MPP                                                                GPB1F403.874    
! If this is the Southern processor row - we must make sure we             GPB1F403.875    
! get a consistent value over the polar row - so we take                   GPB1F403.876    
! the value from PE 0 and use that on all processors                       GPB1F403.877    
      IF (atbase) THEN                                                     GPB1F403.878    
        CALL GCG_RBCAST(701,1,last_comp_pe,gc_proc_row_group,              GPB1F403.879    
     &                  info,COPY_VALUE)                                   GPB1F403.880    
      ENDIF                                                                GPB1F403.881    
*ENDIF                                                                     GPB1F403.882    
                                                                           GPB1F403.883    
      DO I=END_POINT+1,FIELD                                               GPB1F403.884    
        DIAGOUT(I)=COPY_VALUE                                              GPB1F403.885    
      ENDDO                                                                GPB1F403.886    
                                                                           COPDIA1A.63     
*IF -DEF,GLOBAL                                                            COPDIA1A.64     
                                                                           COPDIA1A.65     
CL Copy diagnostic information to N and S boundaries                       COPDIA1A.66     
                                                                           COPDIA1A.67     
*IF DEF,MPP                                                                GPB1F403.887    
      IF (attop) THEN                                                      GPB1F403.888    
        NP_START=Offy*ROW_LENGTH+1                                         GPB1F403.889    
*ELSE                                                                      GPB1F403.890    
        NP_START=1                                                         GPB1F403.891    
*ENDIF                                                                     GPB1F403.892    
        DO I=NP_START,NP_START+ROW_LENGTH-1                                GPB1F403.893    
          DIAGOUT(I)=DIAGOUT(I+ROW_LENGTH)                                 GPB1F403.894    
        ENDDO                                                              GPB1F403.895    
*IF DEF,MPP                                                                GPB1F403.896    
      ENDIF                                                                GPB1F403.897    
                                                                           GPB1F403.898    
      IF (atbase) THEN                                                     GPB1F403.899    
        IF (FLD_TYPE .EQ. fld_type_p) THEN                                 GPB1F403.900    
          SP_START=FIELD-(Offy+1)*ROW_LENGTH+1                             GPB1F403.901    
        ELSE                                                               GPB1F403.902    
          SP_START=FIELD-(Offy+2)*ROW_LENGTH+1                             GPB1F403.903    
        ENDIF                                                              GPB1F403.904    
*ELSE                                                                      GPB1F403.905    
                                                                           GPB1F403.906    
        SP_START=FIELD-ROW_LENGTH+1                                        GPB1F403.907    
*ENDIF                                                                     GPB1F403.908    
        DO I=SP_START,SP_START+ROW_LENGTH-1                                GPB1F403.909    
          DIAGOUT(I)=DIAGOUT(I-ROW_LENGTH)                                 GPB1F403.910    
        ENDDO                                                              GPB1F403.911    
*IF DEF,MPP                                                                GPB1F403.912    
      ENDIF                                                                GPB1F403.913    
*ENDIF                                                                     GPB1F403.914    
                                                                           COPDIA1A.72     
CL Copy diagnostic information to E and W boundaries                       COPDIA1A.73     
                                                                           COPDIA1A.74     
*IF DEF,MPP                                                                GPB1F403.915    
      IF (atleft) THEN                                                     GPB1F403.916    
                                                                           GPB1F403.917    
        WCOL_START=Offy*ROW_LENGTH+1+Offx                                  GPB1F403.918    
*ELSE                                                                      GPB1F403.919    
        WCOL_START=1                                                       GPB1F403.920    
*ENDIF                                                                     GPB1F403.921    
        DO I=WCOL_START,FIELD,ROW_LENGTH                                   GPB1F403.922    
          DIAGOUT(I)=DIAGOUT(I+1)                                          GPB1F403.923    
        ENDDO                                                              GPB1F403.924    
*IF DEF,MPP                                                                GPB1F403.925    
      ENDIF                                                                GPB1F403.926    
                                                                           GPB1F403.927    
      IF (atright) THEN                                                    GPB1F403.928    
                                                                           GPB1F403.929    
        ECOL_START=(Offy+1)*ROW_LENGTH-Offx                                GPB1F403.930    
*ELSE                                                                      GPB1F403.931    
                                                                           GPB1F403.932    
        ECOL_START=ROW_LENGTH                                              GPB1F403.933    
*ENDIF                                                                     GPB1F403.934    
        DO I=ECOL_START,FIELD,ROW_LENGTH                                   GPB1F403.935    
          DIAGOUT(I)=DIAGOUT(I-1)                                          GPB1F403.936    
        ENDDO                                                              GPB1F403.937    
*IF DEF,MPP                                                                GPB1F403.938    
      ENDIF                                                                GPB1F403.939    
*ENDIF                                                                     GPB1F403.940    
                                                                           COPDIA1A.80     
*ENDIF                                                                     COPDIA1A.81     
                                                                           COPDIA1A.82     
 9999 CONTINUE                                                             GPB1F403.941    
      RETURN                                                               COPDIA1A.83     
      END                                                                  COPDIA1A.84     
*ENDIF                                                                     COPDIA1A.85