*IF DEF,RECON                                                              PERTURB1.2      
C ******************************COPYRIGHT******************************    GTS2F400.7183   
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.7184   
C                                                                          GTS2F400.7185   
C Use, duplication or disclosure of this code is subject to the            GTS2F400.7186   
C restrictions as set forth in the contract.                               GTS2F400.7187   
C                                                                          GTS2F400.7188   
C                Meteorological Office                                     GTS2F400.7189   
C                London Road                                               GTS2F400.7190   
C                BRACKNELL                                                 GTS2F400.7191   
C                Berkshire UK                                              GTS2F400.7192   
C                RG12 2SZ                                                  GTS2F400.7193   
C                                                                          GTS2F400.7194   
C If no contract has been raised with this copy of the code, the use,      GTS2F400.7195   
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.7196   
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.7197   
C Modelling at the above address.                                          GTS2F400.7198   
C ******************************COPYRIGHT******************************    GTS2F400.7199   
C                                                                          GTS2F400.7200   
CLL  SUBROUTINE PERTURB-----------------------------------------           PERTURB1.3      
CLL                                                                        PERTURB1.4      
CLL  Purpose:                                                              PERTURB1.5      
CLL           Reads in perturbations to ECMWF analyses for                 PERTURB1.6      
CLL           T, u, v and log(p*) on ECMWF model levels.                   PERTURB1.7      
CLL           Increments model thetal, u, v and p* fields                  PERTURB1.8      
CLL           weighted by value of PERTURBATION (+1.0 or -1.0)             PERTURB1.9      
CLL                                                                        PERTURB1.10     
CLL           STASH item-section codes used are:                           PERTURB1.11     
CLL           201 - ln(p*) inc      1 - p*                                 PERTURB1.12     
CLL           202 - u inc           2 - u                                  PERTURB1.13     
CLL           203 - v inc           3 - v                                  PERTURB1.14     
CLL           204 - T inc           4 - thetal                             PERTURB1.15     
CLL                                                                        PERTURB1.16     
CLL  Model            Modification history:                                PERTURB1.17     
CLL version  Date                                                          PERTURB1.18     
CLL   3.1   15/02/93  Written by A. Dickinson                              PERTURB1.19     
CLL   3.3   07/12/93  Extra argument in READ/WRITFLDS. D. Robinson         DR081293.94     
!    4.0  11/10/95     Pass in STASH lookup arrays as argument for use     UDG7F400.317    
!                      in call to F_TYPE                                   UDG7F400.318    
!                      Author D.M. Goddard                                 UDG7F400.319    
!    4.1  18/06/96     Changes to cope with changes in STASH addressing    GDG0F401.994    
!                      Author D.M. Goddard.                                GDG0F401.995    
!    4.5  23/9/98      Correct code for adding ECMWF perturbations         UDG3F405.345    
!                      Author D.M. Goddard                                 UDG3F405.346    
!    4.6 29/07/99      Correct polar row adjustment for THETAL             PXDG1406.6      
!                      Author D.M. Goddard                                 PXDG1406.7      
CLL                                                                        PERTURB1.20     
CLL  Programming standard:                                                 PERTURB1.21     
CLL                                                                        PERTURB1.22     
CLL  Logical component number: S1                                          PERTURB1.23     
CLL                                                                        PERTURB1.24     
CLL  Project task:                                                         PERTURB1.25     
CLL                                                                        PERTURB1.26     
CLL  Documentation: UM Doc Paper S1                                        PERTURB1.27     
CLL------------------------------------------------------------            PERTURB1.28     
C*L Arguments:-------------------------------------------------            PERTURB1.29     
                                                                           PERTURB1.30     

      SUBROUTINE PERTURB(                                                   1,36UDG7F400.320    
*CALL ARGPPX                                                               UDG7F400.321    
     &                   NFTPER,NFTOUT,                                    UDG7F400.322    
     &                   LEN_FIXHD_OUT,LEN_INTHD_PER,LEN_REALHD_PER,       UDG7F400.323    
     &                   LEN1_LEVDEPC_PER,LEN2_LEVDEPC_PER,                UDG7F400.324    
     &                   LEN1_LOOKUP_OUT,LEN2_LOOKUP_PER,LEN_DATA_PER,     UDG7F400.325    
     &                   FIXHD_OUT,INTHD_OUT,LEVDEPC_OUT,P_LEVELS_OUT,     UDG7F400.326    
     &                   LEN1_LEVDEPC_OUT,N_TYPES_OUT,P_FIELD_OUT,         UDG7F400.327    
     &                   LOOKUP_OUT,PP_POS_OUT,PP_ITEMC_OUT,               UDG7F400.328    
     &                   PERTURBATION,P_ROWS_OUT,ROW_LENGTH_OUT,           UDG3F405.347    
     &                   LPOLARCHK)                                        UDG3F405.348    
                                                                           PERTURB1.37     
      IMPLICIT NONE                                                        PERTURB1.38     
                                                                           PERTURB1.39     
      INTEGER                                                              PERTURB1.40     
     & NFTPER               !IN Unit no of perturbation file               PERTURB1.41     
     &,NFTOUT               !IN Unit no of model output file               PERTURB1.42     
     &,LEN_FIXHD_OUT        !IN Length of fixed length header              PERTURB1.43     
     &,LEN_INTHD_PER        !IN Length of perturbation integer header      PERTURB1.44     
     &,LEN_REALHD_PER       !IN Length of perturbation real header         PERTURB1.45     
     &,LEN1_LEVDEPC_OUT     !IN 1st dim of output level dep consts         PERTURB1.46     
     &,LEN1_LEVDEPC_PER     !IN 1st dim of perturbation level dep consts   PERTURB1.47     
     &,LEN2_LEVDEPC_PER     !IN 2nd dim of perturbation level dep consts   PERTURB1.48     
     &,LEN1_LOOKUP_OUT      !IN 1st dim of output (& PER) lookup table     PERTURB1.49     
     &,LEN2_LOOKUP_PER      !IN 2nd dim of perturbation lookup table       PERTURB1.50     
     &,LEN_DATA_PER         !IN Length of perturbation data                PERTURB1.51     
     &,P_LEVELS_OUT         !IN No of model levels                         PERTURB1.52     
     &,N_TYPES_OUT          !IN No of different item codes in out file     PERTURB1.53     
     &,P_FIELD_OUT          !IN Length of output field                     PERTURB1.54     
                                                                           PERTURB1.55     
      INTEGER                                                              PERTURB1.56     
     & INTHD_OUT(*)         !IN Integer header - model output file         PERTURB1.57     
     &,FIXHD_OUT(*)         !IN Fixed length header - model output file    PERTURB1.58     
     &,LOOKUP_OUT(*)        !IN Lookup - model output file                 PERTURB1.59     
     &,PP_POS_OUT(*)        !IN Pointer to pos of each group of fields     PERTURB1.60     
     &,PP_ITEMC_OUT(*)      !IN Item codes on output file                  UDG3F405.349    
     &,ROW_LENGTH_OUT       !IN No of points E-W (output)                  UDG3F405.350    
     &,P_ROWS_OUT           !IN No of P-points N-S (output)                UDG3F405.351    
                                                                           PERTURB1.62     
      REAL                                                                 PERTURB1.63     
     & LEVDEPC_OUT(*)       !IN Level dep consts - model output file       PERTURB1.64     
     &,PERTURBATION         !IN +1 add incs; -1 sub incs                   PERTURB1.65     
                                                                           UDG3F405.352    
      LOGICAL  LPOLARCHK    ! True if polar rows to be averaged            UDG3F405.353    
                            ! after horizontal interpolation               UDG3F405.354    
                                                                           PERTURB1.66     
C Local arrays:---------------------------------------------------------   PERTURB1.67     
      INTEGER                                                              PERTURB1.68     
     & INTHD_PER(LEN_INTHD_PER)        !PER integer header                 PERTURB1.69     
     &,FIXHD_PER(LEN_FIXHD_OUT)        !PER fixed length header            PERTURB1.70     
     &,LOOKUP_PER(LEN1_LOOKUP_OUT,LEN2_LOOKUP_PER) !PER lookup             PERTURB1.71     
     &,PP_LEN_PER(LEN2_LOOKUP_PER)     !Length      ^                      PERTURB1.72     
     &,PP_NUM_PER(LEN2_LOOKUP_PER)     !No of fields^   For each           PERTURB1.73     
     &,PP_POS_PER(LEN2_LOOKUP_PER)     !Position    ^   field type         PERTURB1.74     
     &,PP_TYPE_PER(LEN2_LOOKUP_PER)    !Real,int,log^   on PER file        PERTURB1.75     
     &,PP_ITEMC_PER(LEN2_LOOKUP_PER)   !Item code   ^                      PERTURB1.76     
     &,PP_LS_PER(LEN2_LOOKUP_PER)      !Land or sea                        PERTURB1.77     
                                                                           PERTURB1.78     
      REAL                                                                 PERTURB1.79     
     & D1_IN(P_FIELD_OUT)              !Data array                         PERTURB1.80     
     &,D1_OUT(P_FIELD_OUT)             !Data array                         PERTURB1.81     
     &,PSTAR(P_FIELD_OUT)              !Pstar                              PERTURB1.82     
     &,REALHD_PER(LEN_REALHD_PER)      !PER real header                    PERTURB1.83     
     &,LEVDEPC_PER(LEN1_LEVDEPC_PER*LEN2_LEVDEPC_PER) ! PER level dep co   PERTURB1.84     
                                                                           PERTURB1.85     
C External subroutines called:------------------------------------------   PERTURB1.86     
      EXTERNAL SETPOS,READHEAD,ABORT_IO,ABORT,LOCATE,READFLDS              PERTURB1.87     
     &,WRITFLDS,F_TYPE                                                     PERTURB1.88     
*IF DEF,TIMER                                                              PERTURB1.89     
     &,TIMER                                                               PERTURB1.90     
*ENDIF                                                                     PERTURB1.91     
C*----------------------------------------------------------------------   PERTURB1.92     
C*L  Local variables:---------------------------------------------------   PERTURB1.93     
                                                                           PERTURB1.94     
      INTEGER                                                              PERTURB1.95     
     & START_BLOCK                                                         PERTURB1.96     
     &,ICODE        !Return code; successful=0; error >0                   PERTURB1.97     
     &,DUMMY                                                               PERTURB1.98     
     &,POS_PER,POS_OUT                                                     PERTURB1.99     
     &,PR           !Pressure temporary                                    PERTURB1.100    
     &,K,J,I        !Indices                                               PERTURB1.101    
     &,M,N          !Indices                                               PERTURB1.102    
     &,N_TYPES_PER                                                         PERTURB1.103    
     &,N_FIELDS_PER                                                        PERTURB1.104    
                                                                           UDG3F405.355    
      REAL    RP_ROW_SUM    ! Sum of polar row values                      UDG3F405.356    
                                                                           PERTURB1.105    
      CHARACTER*80 F_TYPE_TITLE                                            UDG7F400.330    
      CHARACTER*100                                                        PERTURB1.106    
     & CMESSAGE     !Error message if ICODE > 0                            PERTURB1.107    
                                                                           PERTURB1.108    
C----------------------------------------------------------------------    PERTURB1.109    
! Comdecks:----------------------------------------------------------      UDG7F400.331    
*CALL CSUBMODL                                                             UDG7F400.332    
*CALL CPPXREF                                                              UDG7F400.334    
                                                                           UDG7F400.335    
*CALL PPXLOOK                                                              UDG7F400.336    
*CALL C_R_CP                                                               PERTURB1.110    
*CALL C_LHEAT                                                              PERTURB1.111    
C----------------------------------------------------------------------    PERTURB1.112    
                                                                           PERTURB1.113    
      DUMMY=0                                                              PERTURB1.114    
                                                                           PERTURB1.115    
      WRITE(6,'(//,'' READING IN PERTURBATION FIELDS'')')                  PERTURB1.116    
      WRITE(6,'(   '' ------------------------------'')')                  PERTURB1.117    
                                                                           PERTURB1.118    
      CALL SETPOS(NFTPER,0,ICODE)                                          GTD0F400.113    
                                                                           PERTURB1.120    
      CALL READHEAD(NFTPER,FIXHD_PER,LEN_FIXHD_OUT,                        GDG0F401.996    
     &              INTHD_PER,LEN_INTHD_PER,                               GDG0F401.997    
     &              REALHD_PER,LEN_REALHD_PER,                             GDG0F401.998    
     &              LEVDEPC_PER,LEN1_LEVDEPC_PER,LEN2_LEVDEPC_PER,         GDG0F401.999    
     &              DUMMY,DUMMY,DUMMY,                                     GDG0F401.1000   
     &              DUMMY,DUMMY,DUMMY,                                     GDG0F401.1001   
     &              DUMMY,DUMMY,DUMMY,                                     GDG0F401.1002   
     &              DUMMY,DUMMY,                                           GDG0F401.1003   
     &              DUMMY,DUMMY,                                           GDG0F401.1004   
     &              DUMMY,DUMMY,                                           GDG0F401.1005   
     &              DUMMY,DUMMY,                                           GDG0F401.1006   
     &              DUMMY,DUMMY,                                           GDG0F401.1007   
     &              LOOKUP_PER,LEN1_LOOKUP_OUT,LEN2_LOOKUP_PER,            GDG0F401.1008   
     &              LEN_DATA_PER,                                          GDG0F401.1009   
*CALL ARGPPX                                                               GDG0F401.1010   
     &              START_BLOCK,ICODE,CMESSAGE)                            GDG0F401.1011   
                                                                           PERTURB1.136    
        IF(ICODE.NE.0)CALL ABORT_IO('PERFILE',CMESSAGE,ICODE,NFTPER)       PERTURB1.137    
                                                                           PERTURB1.138    
C Check data time of PER file is same as output file                       PERTURB1.139    
                                                                           PERTURB1.140    
      DO K=1,6                                                             PERTURB1.141    
        IF(FIXHD_PER(K+20).NE.FIXHD_OUT(K+27))THEN                         PERTURB1.142    
        WRITE(6,'('' *ERROR* Data time of PER data does not match'',       PERTURB1.143    
     * '' verification time of dump'',/,'' PER'',6I6,/'' Dump'',6I6)')     PERTURB1.144    
     *  (FIXHD_PER(I),I=21,26),(FIXHD_OUT(I),I=28,33)                      PERTURB1.145    
        CALL ABORT                                                         PERTURB1.146    
        ENDIF                                                              PERTURB1.147    
      ENDDO                                                                PERTURB1.148    
                                                                           PERTURB1.149    
C Check resolution of PER file is same as output resolution                PERTURB1.150    
                                                                           PERTURB1.151    
      IF(INTHD_PER(6).NE.INTHD_OUT(6).OR.                                  PERTURB1.152    
     *INTHD_PER(7).NE.INTHD_OUT(7))THEN                                    PERTURB1.153    
        WRITE(6,'('' *ERROR* Dimensions of PER file and output dump'',     PERTURB1.154    
     *  '' do not match, INTHD(6)='',2I5,'' INTHD(7)='',2I5)')             PERTURB1.155    
     *  INTHD_PER(6),INTHD_OUT(6)                                          PERTURB1.156    
     * ,INTHD_PER(7),INTHD_OUT(7)                                          PERTURB1.157    
        CALL ABORT                                                         PERTURB1.158    
      ENDIF                                                                PERTURB1.159    
                                                                           PERTURB1.160    
C Check levels of PER file are same as levels in output file               PERTURB1.161    
                                                                           PERTURB1.162    
      DO K=1,P_LEVELS_OUT                                                  PERTURB1.163    
        IF(LEVDEPC_PER(K).LT.LEVDEPC_OUT(K)-0.001*LEVDEPC_OUT(K)           PERTURB1.164    
     * .OR.LEVDEPC_PER(K).GT.LEVDEPC_OUT(K)+0.001*LEVDEPC_OUT(K))THEN      PERTURB1.165    
          WRITE(6,'('' LEVEL'',I5)')K                                      PERTURB1.166    
          WRITE(6,'('' PER AKS'',5E12.5)')                                 PERTURB1.167    
     *    (LEVDEPC_PER(I),I=1,LEN1_LEVDEPC_PER)                            PERTURB1.168    
          WRITE(6,'('' OUT  AKS'',5E12.5)')                                PERTURB1.169    
     *    (LEVDEPC_OUT(I),I=1,LEN1_LEVDEPC_OUT)                            PERTURB1.170    
          CALL ABORT                                                       PERTURB1.171    
        ENDIF                                                              PERTURB1.172    
      ENDDO                                                                PERTURB1.173    
                                                                           PERTURB1.174    
      DO K=P_LEVELS_OUT+1,P_LEVELS_OUT*2                                   PERTURB1.175    
        IF(ABS(LEVDEPC_PER(K)-LEVDEPC_OUT(K)).GT.0.0001                    PERTURB1.176    
     *  .OR.ABS(LEVDEPC_PER(K)-LEVDEPC_OUT(K)).GT.0.0001)                  PERTURB1.177    
     *  THEN                                                               PERTURB1.178    
          WRITE(6,'('' LEVEL'',I5)')K                                      PERTURB1.179    
          WRITE(6,'('' PER BKS'',5E12.5)')                                 PERTURB1.180    
     *    (LEVDEPC_PER(I+LEN1_LEVDEPC_PER),I=1,LEN1_LEVDEPC_PER)           PERTURB1.181    
          WRITE(6,'('' OUT  BKS'',5E12.5)')                                PERTURB1.182    
     *    (LEVDEPC_OUT(I+LEN1_LEVDEPC_OUT),I=1,LEN1_LEVDEPC_OUT)           PERTURB1.183    
          CALL ABORT                                                       PERTURB1.184    
        ENDIF                                                              PERTURB1.185    
      ENDDO                                                                PERTURB1.186    
                                                                           PERTURB1.187    
      F_TYPE_TITLE='ECMWF PERTURBATION data'                               UDG7F400.337    
      CALL F_TYPE(LOOKUP_PER,LEN2_LOOKUP_PER,PP_NUM_PER,                   UDG7F400.338    
     &            N_TYPES_PER,PP_LEN_PER,PP_ITEMC_PER,PP_TYPE_PER,         UDG7F400.339    
     &            PP_POS_PER,PP_LS_PER,FIXHD_PER,                          UDG7F400.340    
*CALL ARGPPX                                                               UDG7F400.341    
     &            F_TYPE_TITLE)                                            UDG7F400.342    
                                                                           PERTURB1.191    
C Locate and read in ln(pstar) increment                                   PERTURB1.192    
        CALL LOCATE(201,PP_ITEMC_PER,N_TYPES_PER,POS_PER)                  PERTURB1.193    
                                                                           PERTURB1.194    
*IF DEF,TIMER                                                              PERTURB1.195    
      CALL TIMER('READFLDS',3)                                             PERTURB1.196    
*ENDIF                                                                     PERTURB1.197    
                                                                           PERTURB1.198    
        CALL READFLDS(NFTPER,1,PP_POS_PER(POS_PER),LOOKUP_PER,             GDG0F401.1012   
     &                LEN1_LOOKUP_OUT,D1_IN,P_FIELD_OUT,FIXHD_PER,         GDG0F401.1013   
*CALL ARGPPX                                                               GDG0F401.1014   
     &                ICODE,CMESSAGE)                                      GDG0F401.1015   
        IF(ICODE.NE.0)CALL ABORT_IO('PER_FILE',CMESSAGE,ICODE,NFTPER)      PERTURB1.202    
                                                                           PERTURB1.203    
C Locate and read in pstar                                                 PERTURB1.204    
        CALL LOCATE(1,PP_ITEMC_OUT,N_TYPES_OUT,POS_OUT)                    PERTURB1.205    
                                                                           PERTURB1.206    
                                                                           PERTURB1.207    
        CALL READFLDS(NFTOUT,1,PP_POS_OUT(POS_OUT),LOOKUP_OUT,             GDG0F401.1016   
     &                LEN1_LOOKUP_OUT,PSTAR,P_FIELD_OUT,FIXHD_OUT,         GDG0F401.1017   
*CALL ARGPPX                                                               GDG0F401.1018   
     &                ICODE,CMESSAGE)                                      GDG0F401.1019   
                                                                           PERTURB1.211    
*IF DEF,TIMER                                                              PERTURB1.212    
      CALL TIMER('READFLDS',4)                                             PERTURB1.213    
*ENDIF                                                                     PERTURB1.214    
        IF(ICODE.NE.0)CALL ABORT_IO('PER_FILE',CMESSAGE,ICODE,NFTOUT)      PERTURB1.215    
                                                                           PERTURB1.216    
C Increment pstar                                                          PERTURB1.217    
                                                                           PERTURB1.218    
      DO I=1,P_FIELD_OUT                                                   PERTURB1.219    
        PSTAR(I)=EXP(ALOG(PSTAR(I))+PERTURBATION*D1_IN(I))                 UDG3F405.357    
      ENDDO                                                                PERTURB1.221    
                                                                           PERTURB1.222    
C Write out pstar                                                          PERTURB1.223    
                                                                           PERTURB1.224    
*IF DEF,TIMER                                                              PERTURB1.225    
      CALL TIMER('WRITFLDS',3)                                             PERTURB1.226    
*ENDIF                                                                     PERTURB1.227    
                                                                           PERTURB1.228    
        CALL WRITFLDS(NFTOUT,1,PP_POS_OUT(POS_OUT),LOOKUP_OUT,             GDG0F401.1020   
     &                LEN1_LOOKUP_OUT,PSTAR,P_FIELD_OUT,FIXHD_OUT,         GDG0F401.1021   
*CALL ARGPPX                                                               GDG0F401.1022   
     &                ICODE,CMESSAGE)                                      GDG0F401.1023   
        IF(ICODE.NE.0)CALL ABORT_IO('PER_FILE',CMESSAGE,ICODE,NFTOUT)      PERTURB1.232    
                                                                           PERTURB1.233    
*IF DEF,TIMER                                                              PERTURB1.234    
      CALL TIMER('WRITFLDS',4)                                             PERTURB1.235    
*ENDIF                                                                     PERTURB1.236    
                                                                           PERTURB1.237    
                                                                           UDG3F405.358    
! Process T increments                                                     UDG3F405.359    
                                                                           UDG3F405.360    
      CALL LOCATE(204,PP_ITEMC_PER,N_TYPES_PER,POS_PER)                    UDG3F405.361    
      CALL LOCATE(5,PP_ITEMC_OUT,N_TYPES_OUT,POS_OUT)                      UDG3F405.362    
      N_FIELDS_PER=PP_NUM_PER(POS_PER)                                     UDG3F405.363    
                                                                           UDG3F405.364    
      DO I=1,N_FIELDS_PER                                                  UDG3F405.365    
                                                                           UDG3F405.366    
*IF DEF,TIMER                                                              UDG3F405.367    
        CALL TIMER('READFLDS',3)                                           UDG3F405.368    
*ENDIF                                                                     UDG3F405.369    
                                                                           UDG3F405.370    
        CALL READFLDS(NFTPER,1,PP_POS_PER(POS_PER)+I-1,LOOKUP_PER,         UDG3F405.371    
     &                LEN1_LOOKUP_OUT,D1_IN,P_FIELD_OUT,FIXHD_PER,         UDG3F405.372    
*CALL ARGPPX                                                               UDG3F405.373    
     &                ICODE,CMESSAGE)                                      UDG3F405.374    
        IF(ICODE.EQ.1501)THEN                                              UDG3F405.375    
  ! Average polar rows if not constant                                     UDG3F405.376    
          IF(LPOLARCHK)THEN                                                UDG3F405.377    
            write(6,*) 'Averaging polar rows to make them constant'        UDG3F405.378    
    !   North polar row                                                    UDG3F405.379    
            RP_ROW_SUM=0.0                                                 UDG3F405.380    
            DO K=1,ROW_LENGTH_OUT                                          UDG3F405.381    
              RP_ROW_SUM=RP_ROW_SUM+D1_IN(K)                               UDG3F405.382    
            END DO                                                         UDG3F405.383    
            DO K=1,ROW_LENGTH_OUT                                          UDG3F405.384    
              D1_IN(K)=RP_ROW_SUM/ROW_LENGTH_OUT                           UDG3F405.385    
            END DO                                                         UDG3F405.386    
    !   South polar row                                                    UDG3F405.387    
            RP_ROW_SUM=0.0                                                 UDG3F405.388    
            DO K=1,ROW_LENGTH_OUT                                          UDG3F405.389    
              RP_ROW_SUM=                                                  UDG3F405.390    
     &        RP_ROW_SUM+D1_IN((P_ROWS_OUT-1)*ROW_LENGTH_OUT+K)            UDG3F405.391    
            END DO                                                         UDG3F405.392    
            DO K=1,ROW_LENGTH_OUT                                          UDG3F405.393    
              D1_IN((P_ROWS_OUT-1)*ROW_LENGTH_OUT+K)=                      UDG3F405.394    
     &        RP_ROW_SUM/ROW_LENGTH_OUT                                    UDG3F405.395    
            END DO                                                         UDG3F405.396    
          END IF                                                           UDG3F405.397    
        ELSE IF(ICODE.NE.0)THEN                                            UDG3F405.398    
          CALL ABORT_IO('PER_FILE',CMESSAGE,ICODE,NFTPER)                  UDG3F405.399    
        END IF                                                             UDG3F405.400    
                                                                           UDG3F405.401    
        CALL READFLDS(NFTOUT,1,PP_POS_OUT(POS_OUT)+I-1,LOOKUP_OUT,         UDG3F405.402    
     &                LEN1_LOOKUP_OUT,D1_OUT,P_FIELD_OUT,FIXHD_OUT,        UDG3F405.403    
*CALL ARGPPX                                                               UDG3F405.404    
     &                ICODE,CMESSAGE)                                      UDG3F405.405    
        IF(ICODE.EQ.1501)THEN                                              UDG3F405.406    
  ! Average polar rows if not constant                                     UDG3F405.407    
          IF(LPOLARCHK)THEN                                                PXDG1406.8      
            write(6,*) 'Averaging polar rows to make them constant'        UDG3F405.409    
    !   North polar row                                                    UDG3F405.410    
            RP_ROW_SUM=0.0                                                 UDG3F405.411    
            DO K=1,ROW_LENGTH_OUT                                          UDG3F405.412    
              RP_ROW_SUM=RP_ROW_SUM+D1_OUT(K)                              UDG3F405.413    
            END DO                                                         UDG3F405.414    
            DO K=1,ROW_LENGTH_OUT                                          UDG3F405.415    
              D1_OUT(K)=RP_ROW_SUM/ROW_LENGTH_OUT                          UDG3F405.416    
            END DO                                                         UDG3F405.417    
    !   South polar row                                                    UDG3F405.418    
            RP_ROW_SUM=0.0                                                 UDG3F405.419    
            DO K=1,ROW_LENGTH_OUT                                          UDG3F405.420    
              RP_ROW_SUM=                                                  UDG3F405.421    
     &        RP_ROW_SUM+D1_OUT((P_ROWS_OUT-1)*ROW_LENGTH_OUT+K)           UDG3F405.422    
            END DO                                                         UDG3F405.423    
            DO K=1,ROW_LENGTH_OUT                                          UDG3F405.424    
              D1_OUT((P_ROWS_OUT-1)*ROW_LENGTH_OUT+K)=                     UDG3F405.425    
     &        RP_ROW_SUM/ROW_LENGTH_OUT                                    UDG3F405.426    
            END DO                                                         UDG3F405.427    
          END IF                                                           UDG3F405.428    
        ELSE IF(ICODE.NE.0)THEN                                            UDG3F405.429    
          CALL ABORT_IO('PER_FILE',CMESSAGE,ICODE,NFTOUT)                  UDG3F405.430    
        END IF                                                             UDG3F405.431    
                                                                           UDG3F405.432    
*IF DEF,TIMER                                                              UDG3F405.433    
        CALL TIMER('READFLDS',4)                                           UDG3F405.434    
*ENDIF                                                                     UDG3F405.435    
                                                                           UDG3F405.436    
        DO K=1,P_FIELD_OUT                                                 UDG3F405.437    
          PR=LEVDEPC_OUT(I)+PSTAR(K)*LEVDEPC_OUT(I+P_LEVELS_OUT)           UDG3F405.438    
          D1_OUT(K)=D1_OUT(K)+PERTURBATION*D1_IN(K)*(PREF/PR)**KAPPA       UDG3F405.439    
        END DO                                                             UDG3F405.440    
                                                                           UDG3F405.441    
*IF DEF,TIMER                                                              UDG3F405.442    
        CALL TIMER('WRITFLDS',3)                                           UDG3F405.443    
*ENDIF                                                                     UDG3F405.444    
                                                                           UDG3F405.445    
        CALL WRITFLDS(NFTOUT,1,PP_POS_OUT(POS_OUT)+I-1,LOOKUP_OUT,         UDG3F405.446    
     &                LEN1_LOOKUP_OUT,D1_OUT,P_FIELD_OUT,FIXHD_OUT,        UDG3F405.447    
*CALL ARGPPX                                                               UDG3F405.448    
     &                ICODE,CMESSAGE)                                      UDG3F405.449    
        IF(ICODE.NE.0)CALL ABORT_IO('PER_FILE',CMESSAGE,ICODE,NFTOUT)      UDG3F405.450    
                                                                           UDG3F405.451    
*IF DEF,TIMER                                                              UDG3F405.452    
        CALL TIMER('WRITFLDS',4)                                           UDG3F405.453    
*ENDIF                                                                     UDG3F405.454    
      END DO                                                               UDG3F405.455    
                                                                           UDG3F405.456    
! Process u and v increments                                               UDG3F405.457    
                                                                           UDG3F405.458    
      DO J=202,203                                                         UDG3F405.459    
                                                                           PERTURB1.241    
        CALL LOCATE(J,PP_ITEMC_PER,N_TYPES_PER,POS_PER)                    PERTURB1.242    
        CALL LOCATE(J-200,PP_ITEMC_OUT,N_TYPES_OUT,POS_OUT)                PERTURB1.243    
        N_FIELDS_PER=PP_NUM_PER(POS_PER)                                   PERTURB1.244    
                                                                           PERTURB1.245    
        DO I=1,N_FIELDS_PER                                                PERTURB1.246    
                                                                           PERTURB1.247    
*IF DEF,TIMER                                                              PERTURB1.248    
      CALL TIMER('READFLDS',3)                                             PERTURB1.249    
*ENDIF                                                                     PERTURB1.250    
                                                                           PERTURB1.251    
        CALL READFLDS(NFTPER,1,PP_POS_PER(POS_PER)+I-1,LOOKUP_PER,         GDG0F401.1024   
     &                LEN1_LOOKUP_OUT,D1_IN,P_FIELD_OUT,FIXHD_PER,         GDG0F401.1025   
*CALL ARGPPX                                                               GDG0F401.1026   
     &                ICODE,CMESSAGE)                                      GDG0F401.1027   
        IF(ICODE.NE.0)CALL ABORT_IO('PER_FILE',CMESSAGE,ICODE,NFTPER)      PERTURB1.255    
                                                                           PERTURB1.256    
        CALL READFLDS(NFTOUT,1,PP_POS_OUT(POS_OUT)+I-1,LOOKUP_OUT,         UDG3F405.460    
     &                LEN1_LOOKUP_OUT,D1_OUT,P_FIELD_OUT,FIXHD_OUT,        GDG0F401.1029   
*CALL ARGPPX                                                               GDG0F401.1030   
     &                ICODE,CMESSAGE)                                      GDG0F401.1031   
        IF(ICODE.NE.0)CALL ABORT_IO('PER_FILE',CMESSAGE,ICODE,NFTOUT)      PERTURB1.260    
                                                                           PERTURB1.261    
*IF DEF,TIMER                                                              PERTURB1.262    
      CALL TIMER('READFLDS',4)                                             PERTURB1.263    
*ENDIF                                                                     PERTURB1.264    
                                                                           PERTURB1.265    
C u & v incs                                                               PERTURB1.276    
        DO K=1,P_FIELD_OUT                                                 PERTURB1.277    
          D1_OUT(K)=D1_OUT(K)+PERTURBATION*D1_IN(K)                        PERTURB1.278    
        ENDDO                                                              PERTURB1.279    
                                                                           PERTURB1.282    
*IF DEF,TIMER                                                              PERTURB1.283    
      CALL TIMER('WRITFLDS',3)                                             PERTURB1.284    
*ENDIF                                                                     PERTURB1.285    
                                                                           PERTURB1.286    
        CALL WRITFLDS(NFTOUT,1,PP_POS_OUT(POS_OUT)+I-1,LOOKUP_OUT,         GDG0F401.1032   
     &                LEN1_LOOKUP_OUT,D1_OUT,P_FIELD_OUT,FIXHD_OUT,        GDG0F401.1033   
*CALL ARGPPX                                                               GDG0F401.1034   
     &                ICODE,CMESSAGE)                                      GDG0F401.1035   
        IF(ICODE.NE.0)CALL ABORT_IO('PER_FILE',CMESSAGE,ICODE,NFTOUT)      PERTURB1.290    
                                                                           PERTURB1.291    
*IF DEF,TIMER                                                              PERTURB1.292    
      CALL TIMER('WRITFLDS',4)                                             PERTURB1.293    
*ENDIF                                                                     PERTURB1.294    
      ENDDO                                                                PERTURB1.295    
                                                                           PERTURB1.296    
      ENDDO                                                                PERTURB1.297    
                                                                           PERTURB1.298    
      RETURN                                                               PERTURB1.299    
      END                                                                  PERTURB1.300    
*ENDIF                                                                     PERTURB1.301