*IF DEF,C96_1A,OR,DEF,C96_1B                                               GPB3F403.293    
*IF DEF,MPP                                                                GPB3F403.294    
C *****************************COPYRIGHT******************************     DECMPO1A.3      
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved.    DECMPO1A.4      
C                                                                          DECMPO1A.5      
C Use, duplication or disclosure of this code is subject to the            DECMPO1A.6      
C restrictions as set forth in the contract.                               DECMPO1A.7      
C                                                                          DECMPO1A.8      
C                Meteorological Office                                     DECMPO1A.9      
C                London Road                                               DECMPO1A.10     
C                BRACKNELL                                                 DECMPO1A.11     
C                Berkshire UK                                              DECMPO1A.12     
C                RG12 2SZ                                                  DECMPO1A.13     
C                                                                          DECMPO1A.14     
C If no contract has been raised with this copy of the code, the use,      DECMPO1A.15     
C duplication or disclosure of it is strictly prohibited.  Permission      DECMPO1A.16     
C to do so must first be obtained in writing from the Head of Numerical    DECMPO1A.17     
C Modelling at the above address.                                          DECMPO1A.18     
C ******************************COPYRIGHT******************************    DECMPO1A.19     
!+ Parallel UM: Perform data decomposition for ocean model                 DECMPO1A.20     
!                                                                          DECMPO1A.21     
! Subroutine Interface:                                                    DECMPO1A.22     

      SUBROUTINE DECOMPOSE_OCEAN(global_row_len,global_n_rows,              1,1DECMPO1A.23     
     &                           tot_levels,                               DECMPO1A.24     
     &                           nproc_EW, nproc_NS,                       DECMPO1A.25     
     &                           local_row_len,local_n_rows,               GPB2F403.1      
     &                           l_ocyclic)                                GPB2F403.2      
      IMPLICIT NONE                                                        DECMPO1A.27     
!                                                                          DECMPO1A.28     
! Desciption:                                                              DECMPO1A.29     
! This routine currently performs a 1D North-South decomposition on the    DECMPO1A.30     
! ocean model. nproc_EW is currently ignored.                              DECMPO1A.31     
! The decomposition strategy is much the same as the atmosphere's -        DECMPO1A.32     
! First try and divide the rows equally between processors, and then       DECMPO1A.33     
! distribute any left over rows to the processors, starting from the       DECMPO1A.34     
! top.                                                                     DECMPO1A.35     
!                                                                          DECMPO1A.36     
! Method:                                                                  DECMPO1A.37     
! The local data sizes are calculated and sotred in the COMMON block       DECMPO1A.38     
! DECOMPDB. The boundary conditions are set (cyclic in East/West           DECMPO1A.39     
! direction if *DEF,GLOBAL                                                 DECMPO1A.40     
!                                                                          DECMPO1A.41     
! Current Code Owner : Paul Burton                                         DECMPO1A.42     
!                                                                          DECMPO1A.43     
! History:                                                                 DECMPO1A.44     
!  Model    Date     Modification history from model version 4.2           DECMPO1A.45     
!  version                                                                 DECMPO1A.46     
!  4.2      21/8/96  New deck created for MPP ocean model.  P.Burton       DECMPO1A.47     
!  4.3      17/02/97 Added initialisation of new ocean decompositon        GPB2F403.3      
!                    decomp_nowrap_ocean - which does not include          GPB2F403.4      
!                    the wrap around points on the ends of rows.           GPB2F403.5      
!                    This requires passing in the l_ocyclic variable       GPB2F403.6      
!                    to indicate if these points are present.              GPB2F403.7      
!                                                         P.Burton         GPB2F403.8      
!                                                                          DECMPO1A.48     
! Subroutine arguments:                                                    DECMPO1A.49     
                                                                           DECMPO1A.50     
      INTEGER                                                              DECMPO1A.51     
                                                                           DECMPO1A.52     
     &  global_row_len  ! IN :  number of E-W points of entire model       DECMPO1A.53     
     &, global_n_rows   ! IN :  number of N-S points of entire model       DECMPO1A.54     
     &, tot_levels      ! IN :  total number of levels                     DECMPO1A.55     
     &, nproc_EW        ! IN :  number of processors to decompose E-W      DECMPO1A.56     
     &, nproc_NS        ! IN :  number of processors to decompose N-S      DECMPO1A.57     
     &, local_row_len   ! OUT : local number of E-W points                 DECMPO1A.58     
     &, local_n_rows    ! OUT : local number of N-S points                 DECMPO1A.59     
!                       ! local_row_len and local_n_rows include           DECMPO1A.60     
!                       ! any halos                                        DECMPO1A.61     
                                                                           GPB2F403.9      
      LOGICAL                                                              GPB2F403.10     
                                                                           GPB2F403.11     
     &  l_ocyclic       ! IN : true if extra wrap points are present       GPB2F403.12     
!                       !      at the start/ends of rows                   GPB2F403.13     
                                                                           DECMPO1A.62     
! Parameters and Common blocks                                             DECMPO1A.63     
                                                                           DECMPO1A.64     
*CALL PARVARS                                                              DECMPO1A.65     
*CALL GCCOM                                                                DECMPO1A.66     
*CALL DECOMPTP                                                             DECMPO1A.67     
*CALL DECOMPDB                                                             DECMPO1A.68     
                                                                           DECMPO1A.69     
! Local variables                                                          DECMPO1A.70     
      INTEGER iproc,irest,jrest,info,in_ocn_decomp,idim                    GPB2F403.14     
                                                                           DECMPO1A.72     
! ------------------------------------------------------------------       DECMPO1A.73     
                                                                           DECMPO1A.74     
! Halo Sizes                                                               DECMPO1A.75     
                                                                           DECMPO1A.76     
      decomp_db_halosize(1,decomp_standard_ocean) = 0                      DECMPO1A.77     
      decomp_db_halosize(2,decomp_standard_ocean) = 1                      DECMPO1A.78     
      decomp_db_halosize(3,decomp_standard_ocean) = 0                      DECMPO1A.79     
                                                                           DECMPO1A.80     
! Size of global data                                                      DECMPO1A.81     
                                                                           DECMPO1A.82     
      decomp_db_glsize(1,decomp_standard_ocean) = global_row_len           DECMPO1A.83     
      decomp_db_glsize(2,decomp_standard_ocean) = global_n_rows            DECMPO1A.84     
      decomp_db_glsize(3,decomp_standard_ocean) = tot_levels               DECMPO1A.85     
                                                                           DECMPO1A.86     
! Make sure there's actually enough work for all the processors to do      DECMPO1A.87     
                                                                           DECMPO1A.88     
      IF (nproc_NS .GT. global_n_rows) THEN                                DECMPO1A.89     
        IF (mype .EQ. 0) THEN                                              DECMPO1A.90     
          WRITE(6,*) 'Warning : Ocean model has more processors than ',    DECMPO1A.91     
     &               'rows. Reducing nproc_y to ',global_n_rows            DECMPO1A.92     
        ENDIF                                                              DECMPO1A.93     
        nproc_NS=global_n_rows                                             DECMPO1A.94     
      ENDIF                                                                DECMPO1A.95     
                                                                           DECMPO1A.96     
      decomp_db_nproc(decomp_standard_ocean)=nproc_NS                      DECMPO1A.97     
      decomp_db_first_comp_pe(decomp_standard_ocean) = 0                   DECMPO1A.98     
      decomp_db_last_comp_pe(decomp_standard_ocean) =                      DECMPO1A.99     
     &  decomp_db_nproc(decomp_standard_ocean)-1                           DECMPO1A.100    
                                                                           DECMPO1A.101    
! Set the size of the Logical Processor Grid (LPG)                         DECMPO1A.102    
                                                                           DECMPO1A.103    
      decomp_db_gridsize(1,decomp_standard_ocean) = nproc_EW  ! =1         DECMPO1A.104    
      decomp_db_gridsize(2,decomp_standard_ocean) = nproc_NS               DECMPO1A.105    
      decomp_db_gridsize(3,decomp_standard_ocean) = 1                      DECMPO1A.106    
                                                                           DECMPO1A.107    
! Calculate processor specific information.                                DECMPO1A.108    
                                                                           DECMPO1A.109    
      DO iproc=decomp_db_first_comp_pe(decomp_standard_ocean),             DECMPO1A.110    
     &         decomp_db_last_comp_pe(decomp_standard_ocean)               DECMPO1A.111    
!       ! Loop over all processors in this decomposition                   DECMPO1A.112    
                                                                           DECMPO1A.113    
! NB : Although the decomposition is currently only N-S, all               DECMPO1A.114    
! the code is included to allow an E-W decomposition too.                  DECMPO1A.115    
! All that is required is to supply nproc_NS > 1.                          DECMPO1A.116    
                                                                           DECMPO1A.117    
! Calculate the position in the LPG:                                       DECMPO1A.118    
        decomp_db_g_gridpos(3,iproc,decomp_standard_ocean) = 0             DECMPO1A.119    
        decomp_db_g_gridpos(2,iproc,decomp_standard_ocean) =               DECMPO1A.120    
     &    iproc / decomp_db_gridsize(1,decomp_standard_ocean)              DECMPO1A.121    
        decomp_db_g_gridpos(1,iproc,decomp_standard_ocean) =               DECMPO1A.122    
     &    iproc - decomp_db_g_gridpos(2,iproc,decomp_standard_ocean)*      DECMPO1A.123    
     &            decomp_db_gridsize(1,decomp_standard_ocean)              DECMPO1A.124    
                                                                           DECMPO1A.125    
! Calculate the local data sizes for processor iproc                       DECMPO1A.126    
                                                                           DECMPO1A.127    
! East-West decomposition                                                  DECMPO1A.128    
                                                                           DECMPO1A.129    
        decomp_db_g_blsizep(1,iproc,decomp_standard_ocean) =               DECMPO1A.130    
     &    decomp_db_glsize(1,decomp_standard_ocean) /                      DECMPO1A.131    
     &    decomp_db_gridsize(1,decomp_standard_ocean)                      DECMPO1A.132    
        irest = decomp_db_glsize(1,decomp_standard_ocean)-                 DECMPO1A.133    
     &          decomp_db_g_blsizep(1,iproc,decomp_standard_ocean)*        DECMPO1A.134    
     &          decomp_db_gridsize(1,decomp_standard_ocean)                DECMPO1A.135    
        decomp_db_g_datastart(1,iproc,decomp_standard_ocean) =             DECMPO1A.136    
     &    decomp_db_g_gridpos(1,iproc,decomp_standard_ocean)*              DECMPO1A.137    
     &    decomp_db_g_blsizep(1,iproc,decomp_standard_ocean) + 1           DECMPO1A.138    
                                                                           DECMPO1A.139    
        IF (decomp_db_g_gridpos(1,iproc,decomp_standard_ocean) .LT.        DECMPO1A.140    
     &      irest) THEN                                                    DECMPO1A.141    
          decomp_db_g_blsizep(1,iproc,decomp_standard_ocean) =             DECMPO1A.142    
     &      decomp_db_g_blsizep(1,iproc,decomp_standard_ocean)+1           DECMPO1A.143    
          decomp_db_g_datastart(1,iproc,decomp_standard_ocean) =           DECMPO1A.144    
     &      decomp_db_g_datastart(1,iproc,decomp_standard_ocean) +         DECMPO1A.145    
     &      decomp_db_g_gridpos(1,iproc,decomp_standard_ocean)             DECMPO1A.146    
        ELSE                                                               DECMPO1A.147    
          decomp_db_g_datastart(1,iproc,decomp_standard_ocean) =           DECMPO1A.148    
     &      decomp_db_g_datastart(1,iproc,decomp_standard_ocean) +         DECMPO1A.149    
     &      irest                                                          DECMPO1A.150    
        ENDIF                                                              DECMPO1A.151    
                                                                           DECMPO1A.152    
        decomp_db_g_lasize(1,iproc,decomp_standard_ocean)=                 DECMPO1A.153    
     &    decomp_db_g_blsizep(1,iproc,decomp_standard_ocean) +             DECMPO1A.154    
     &    2*decomp_db_halosize(1,decomp_standard_ocean)                    DECMPO1A.155    
                                                                           DECMPO1A.156    
! North-South decomposition                                                DECMPO1A.157    
                                                                           DECMPO1A.158    
        decomp_db_g_blsizep(2,iproc,decomp_standard_ocean) =               DECMPO1A.159    
     &    decomp_db_glsize(2,decomp_standard_ocean) /                      DECMPO1A.160    
     &    decomp_db_gridsize(2,decomp_standard_ocean)                      DECMPO1A.161    
        jrest = decomp_db_glsize(2,decomp_standard_ocean)-                 DECMPO1A.162    
     &          decomp_db_g_blsizep(2,iproc,decomp_standard_ocean)*        DECMPO1A.163    
     &          decomp_db_gridsize(2,decomp_standard_ocean)                DECMPO1A.164    
        decomp_db_g_datastart(2,iproc,decomp_standard_ocean) =             DECMPO1A.165    
     &    decomp_db_g_gridpos(2,iproc,decomp_standard_ocean)*              DECMPO1A.166    
     &    decomp_db_g_blsizep(2,iproc,decomp_standard_ocean) + 1           DECMPO1A.167    
                                                                           DECMPO1A.168    
        IF (decomp_db_g_gridpos(2,iproc,decomp_standard_ocean) .LT.        DECMPO1A.169    
     &      jrest) THEN                                                    DECMPO1A.170    
          decomp_db_g_blsizep(2,iproc,decomp_standard_ocean) =             DECMPO1A.171    
     &      decomp_db_g_blsizep(2,iproc,decomp_standard_ocean)+1           DECMPO1A.172    
          decomp_db_g_datastart(2,iproc,decomp_standard_ocean) =           DECMPO1A.173    
     &      decomp_db_g_datastart(2,iproc,decomp_standard_ocean) +         DECMPO1A.174    
     &      decomp_db_g_gridpos(2,iproc,decomp_standard_ocean)             DECMPO1A.175    
        ELSE                                                               DECMPO1A.176    
          decomp_db_g_datastart(2,iproc,decomp_standard_ocean) =           DECMPO1A.177    
     &      decomp_db_g_datastart(2,iproc,decomp_standard_ocean) +         DECMPO1A.178    
     &      jrest                                                          DECMPO1A.179    
        ENDIF                                                              DECMPO1A.180    
                                                                           DECMPO1A.181    
        decomp_db_g_lasize(2,iproc,decomp_standard_ocean)=                 DECMPO1A.182    
     &    decomp_db_g_blsizep(2,iproc,decomp_standard_ocean) +             DECMPO1A.183    
     &    2*decomp_db_halosize(2,decomp_standard_ocean)                    DECMPO1A.184    
                                                                           DECMPO1A.185    
! No decomposition in the vertical                                         DECMPO1A.186    
                                                                           DECMPO1A.187    
        decomp_db_g_datastart(3,iproc,decomp_standard_ocean) = 1           DECMPO1A.188    
        decomp_db_g_blsizep(3,iproc,decomp_standard_ocean) =               DECMPO1A.189    
     &    tot_levels                                                       DECMPO1A.190    
        decomp_db_g_lasize(3,iproc,decomp_standard_ocean) =                DECMPO1A.191    
     &    tot_levels                                                       DECMPO1A.192    
                                                                           DECMPO1A.193    
! One less U row at bottom                                                 DECMPO1A.194    
                                                                           DECMPO1A.195    
        decomp_db_g_blsizeu(1,iproc,decomp_standard_ocean) =               DECMPO1A.196    
     &    decomp_db_g_blsizep(1,iproc,decomp_standard_ocean)               DECMPO1A.197    
        IF (  decomp_db_g_gridpos(2,iproc,decomp_standard_ocean)           DECMPO1A.198    
     &  .EQ. (decomp_db_gridsize(2,decomp_standard_ocean)-1))              DECMPO1A.199    
     &  THEN                                                               DECMPO1A.200    
          decomp_db_g_blsizeu(2,iproc,decomp_standard_ocean) =             DECMPO1A.201    
     &    decomp_db_g_blsizep(2,iproc,decomp_standard_ocean) - 1           DECMPO1A.202    
        ELSE                                                               DECMPO1A.203    
          decomp_db_g_blsizeu(2,iproc,decomp_standard_ocean) =             DECMPO1A.204    
     &    decomp_db_g_blsizep(2,iproc,decomp_standard_ocean)               DECMPO1A.205    
        ENDIF                                                              DECMPO1A.206    
        decomp_db_g_blsizeu(3,iproc,decomp_standard_ocean) =               DECMPO1A.207    
     &    decomp_db_g_blsizep(3,iproc,decomp_standard_ocean)               DECMPO1A.208    
                                                                           DECMPO1A.209    
      ENDDO  ! loop over processors                                        DECMPO1A.210    
                                                                           DECMPO1A.211    
! Set up the boundary types                                                DECMPO1A.212    
                                                                           DECMPO1A.213    
*IF DEF,GLOBAL                                                             DECMPO1A.214    
      decomp_db_bound(1,decomp_standard_ocean) = BC_CYCLIC                 DECMPO1A.215    
!       ! Cyclic East-West boundaries                                      DECMPO1A.216    
*ELSE                                                                      DECMPO1A.217    
      decomp_db_bound(1,decomp_standard_ocean) = BC_STATIC                 DECMPO1A.218    
!       ! No East-West wrap around                                         DECMPO1A.219    
*ENDIF                                                                     DECMPO1A.220    
      decomp_db_bound(2,decomp_standard_ocean) = BC_STATIC                 DECMPO1A.221    
!       ! No North-South wrap around                                       DECMPO1A.222    
      decomp_db_bound(3,decomp_standard_ocean) = BC_STATIC                 DECMPO1A.223    
!       ! No vertical wrap around                                          DECMPO1A.224    
                                                                           DECMPO1A.225    
! And set up the neighbour array                                           DECMPO1A.226    
                                                                           DECMPO1A.227    
      CALL SET_NEIGHBOUR(                                                  DECMPO1A.228    
     &  decomp_standard_ocean)                                             DECMPO1A.229    
                                                                           DECMPO1A.230    
! Set up the GCOM groups                                                   DECMPO1A.231    
                                                                           DECMPO1A.232    
! 1) Group of all processors on my row                                     DECMPO1A.233    
                                                                           DECMPO1A.234    
      IF ( decomp_db_gridsize(2,decomp_standard_ocean) .EQ. 1)             DECMPO1A.235    
     & THEN                                                                DECMPO1A.236    
       decomp_db_gc_proc_row_group(decomp_standard_ocean)=GCG_ALL          DECMPO1A.237    
      ELSE                                                                 DECMPO1A.238    
        CALL GCG_SPLIT(mype,nproc_max,                                     DECMPO1A.239    
     &    decomp_db_g_gridpos(2,mype,decomp_standard_ocean),               DECMPO1A.240    
     &    info,                                                            DECMPO1A.241    
     &    decomp_db_gc_proc_row_group(decomp_standard_ocean))              DECMPO1A.242    
      ENDIF                                                                DECMPO1A.243    
                                                                           DECMPO1A.244    
! 2) Group of all processors on my column                                  DECMPO1A.245    
                                                                           DECMPO1A.246    
      IF ( decomp_db_gridsize(1,decomp_standard_ocean) .EQ. 1)             DECMPO1A.247    
     & THEN                                                                DECMPO1A.248    
        decomp_db_gc_proc_col_group(decomp_standard_ocean)=GCG_ALL         DECMPO1A.249    
      ELSE                                                                 DECMPO1A.250    
        CALL GCG_SPLIT(mype,nproc_max,                                     DECMPO1A.251    
     &    decomp_db_g_gridpos(1,mype,decomp_standard_ocean),               DECMPO1A.252    
     &    info,                                                            DECMPO1A.253    
     &    decomp_db_gc_proc_col_group(decomp_standard_ocean))              DECMPO1A.254    
      ENDIF                                                                DECMPO1A.255    
                                                                           DECMPO1A.256    
! 3) Group of all processors in the atmosphere model                       DECMPO1A.257    
      IF (decomp_db_nproc(decomp_standard_ocean) .EQ. nproc_max)           DECMPO1A.258    
     & THEN                                                                DECMPO1A.259    
        decomp_db_gc_all_proc_group(decomp_standard_ocean)=GCG_ALL         DECMPO1A.260    
      ELSE                                                                 DECMPO1A.261    
        IF ((mype .GE. decomp_db_first_comp_pe(decomp_standard_ocean))     DECMPO1A.262    
     &    .AND.                                                            DECMPO1A.263    
     &     (mype .LE. decomp_db_last_comp_pe(decomp_standard_ocean) ))     DECMPO1A.264    
     &  THEN                                                               DECMPO1A.265    
          in_ocn_decomp=1                                                  DECMPO1A.266    
        ELSE                                                               DECMPO1A.267    
          in_ocn_decomp=0                                                  DECMPO1A.268    
        ENDIF                                                              DECMPO1A.269    
                                                                           DECMPO1A.270    
        CALL GCG_SPLIT(mype,nproc_max,in_ocn_decomp,info,                  DECMPO1A.271    
     &    decomp_db_gc_all_proc_group(decomp_standard_ocean))              DECMPO1A.272    
      ENDIF                                                                DECMPO1A.273    
                                                                           DECMPO1A.274    
! Set logical indicating this decomposition has been initialised           DECMPO1A.275    
! and is now ready for use                                                 DECMPO1A.276    
                                                                           DECMPO1A.277    
      decomp_db_set(decomp_standard_ocean)=.TRUE.                          DECMPO1A.278    
                                                                           DECMPO1A.279    
! Initialise decomp_nowrap_ocean which doesn't contain extra wrap          GPB2F403.15     
! points at start and end of each row                                      GPB2F403.16     
! Mostly it is a straight copy of the original ocean decomposition         GPB2F403.17     
                                                                           GPB2F403.18     
      DO idim=1,Ndim_max                                                   GPB2F403.19     
        decomp_db_bound(idim,decomp_nowrap_ocean)=                         GPB2F403.20     
     &    decomp_db_bound(idim,decomp_standard_ocean)                      GPB2F403.21     
        decomp_db_glsize(idim,decomp_nowrap_ocean)=                        GPB2F403.22     
     &    decomp_db_glsize(idim,decomp_standard_ocean)                     GPB2F403.23     
        decomp_db_gridsize(idim,decomp_nowrap_ocean)=                      GPB2F403.24     
     &    decomp_db_gridsize(idim,decomp_standard_ocean)                   GPB2F403.25     
        decomp_db_halosize(idim,decomp_nowrap_ocean)=                      GPB2F403.26     
     &    decomp_db_halosize(idim,decomp_standard_ocean)                   GPB2F403.27     
      ENDDO                                                                GPB2F403.28     
                                                                           GPB2F403.29     
      DO iproc=decomp_db_first_comp_pe(decomp_standard_ocean),             GPB2F403.30     
     &         decomp_db_last_comp_pe(decomp_standard_ocean)               GPB2F403.31     
        DO idim=1,Ndim_max                                                 GPB2F403.32     
          decomp_db_g_lasize(idim,iproc,decomp_nowrap_ocean)=              GPB2F403.33     
     &      decomp_db_g_lasize(idim,iproc,decomp_standard_ocean)           GPB2F403.34     
          decomp_db_g_blsizep(idim,iproc,decomp_nowrap_ocean)=             GPB2F403.35     
     &      decomp_db_g_blsizep(idim,iproc,decomp_standard_ocean)          GPB2F403.36     
          decomp_db_g_blsizeu(idim,iproc,decomp_nowrap_ocean)=             GPB2F403.37     
     &      decomp_db_g_blsizeu(idim,iproc,decomp_standard_ocean)          GPB2F403.38     
          decomp_db_g_datastart(idim,iproc,decomp_nowrap_ocean)=           GPB2F403.39     
     &      decomp_db_g_datastart(idim,iproc,decomp_standard_ocean)        GPB2F403.40     
          decomp_db_g_gridpos(idim,iproc,decomp_nowrap_ocean)=             GPB2F403.41     
     &      decomp_db_g_gridpos(idim,iproc,decomp_standard_ocean)          GPB2F403.42     
        ENDDO                                                              GPB2F403.43     
      ENDDO                                                                GPB2F403.44     
                                                                           GPB2F403.45     
      DO idim=1,4                                                          GPB2F403.46     
        decomp_db_neighbour(idim,decomp_nowrap_ocean)=                     GPB2F403.47     
     &    decomp_db_neighbour(idim,decomp_standard_ocean)                  GPB2F403.48     
      ENDDO                                                                GPB2F403.49     
                                                                           GPB2F403.50     
      decomp_db_first_comp_pe(decomp_nowrap_ocean)=                        GPB2F403.51     
     &  decomp_db_first_comp_pe(decomp_standard_ocean)                     GPB2F403.52     
      decomp_db_last_comp_pe(decomp_nowrap_ocean)=                         GPB2F403.53     
     &  decomp_db_last_comp_pe(decomp_standard_ocean)                      GPB2F403.54     
      decomp_db_nproc(decomp_nowrap_ocean)=                                GPB2F403.55     
     &  decomp_db_nproc(decomp_standard_ocean)                             GPB2F403.56     
      decomp_db_gc_proc_row_group(decomp_nowrap_ocean)=                    GPB2F403.57     
     &  decomp_db_gc_proc_row_group(decomp_standard_ocean)                 GPB2F403.58     
      decomp_db_gc_proc_col_group(decomp_nowrap_ocean)=                    GPB2F403.59     
     &  decomp_db_gc_proc_col_group(decomp_standard_ocean)                 GPB2F403.60     
      decomp_db_gc_all_proc_group(decomp_nowrap_ocean)=                    GPB2F403.61     
     &  decomp_db_gc_all_proc_group(decomp_standard_ocean)                 GPB2F403.62     
                                                                           GPB2F403.63     
      IF (l_ocyclic) THEN                                                  GPB2F403.64     
! Make modifications to the decompositions to remove the point at          GPB2F403.65     
! the beginning and end of each row                                        GPB2F403.66     
        decomp_db_glsize(1,decomp_nowrap_ocean)=                           GPB2F403.67     
     &    decomp_db_glsize(1,decomp_nowrap_ocean)-2                        GPB2F403.68     
                                                                           GPB2F403.69     
      DO iproc=decomp_db_first_comp_pe(decomp_standard_ocean),             GPB2F403.70     
     &         decomp_db_last_comp_pe(decomp_standard_ocean)               GPB2F403.71     
                                                                           GPB2F403.72     
          IF (decomp_db_g_gridpos(1,iproc,decomp_nowrap_ocean)             GPB2F403.73     
     &        .EQ. 0) THEN  ! this processor at left of LPG                GPB2F403.74     
                                                                           GPB2F403.75     
            decomp_db_g_lasize(1,iproc,decomp_nowrap_ocean)=               GPB2F403.76     
     &        decomp_db_g_lasize(1,iproc,decomp_nowrap_ocean)-1            GPB2F403.77     
            decomp_db_g_blsizep(1,iproc,decomp_nowrap_ocean)=              GPB2F403.78     
     &        decomp_db_g_blsizep(1,iproc,decomp_nowrap_ocean)-1           GPB2F403.79     
            decomp_db_g_blsizeu(1,iproc,decomp_nowrap_ocean)=              GPB2F403.80     
     &        decomp_db_g_blsizeu(1,iproc,decomp_nowrap_ocean)-1           GPB2F403.81     
                                                                           GPB2F403.82     
          ELSE  ! processor not at left of LPG                             GPB2F403.83     
                                                                           GPB2F403.84     
            decomp_db_g_datastart(1,iproc,decomp_nowrap_ocean)=            GPB2F403.85     
     &        decomp_db_g_datastart(1,iproc,decomp_nowrap_ocean)-1         GPB2F403.86     
                                                                           GPB2F403.87     
          ENDIF                                                            GPB2F403.88     
                                                                           GPB2F403.89     
          IF (decomp_db_g_gridpos(1,iproc,decomp_nowrap_ocean)             GPB2F403.90     
     &       .EQ. (decomp_db_gridsize(1,decomp_nowrap_ocean)-1) )          GPB2F403.91     
     &    THEN  ! this processor at right of LPG                           GPB2F403.92     
                                                                           GPB2F403.93     
            decomp_db_g_lasize(1,iproc,decomp_nowrap_ocean)=               GPB2F403.94     
     &        decomp_db_g_lasize(1,iproc,decomp_nowrap_ocean)-1            GPB2F403.95     
            decomp_db_g_blsizep(1,iproc,decomp_nowrap_ocean)=              GPB2F403.96     
     &        decomp_db_g_blsizep(1,iproc,decomp_nowrap_ocean)-1           GPB2F403.97     
            decomp_db_g_blsizeu(1,iproc,decomp_nowrap_ocean)=              GPB2F403.98     
     &        decomp_db_g_blsizeu(1,iproc,decomp_nowrap_ocean)-1           GPB2F403.99     
                                                                           GPB2F403.100    
          ENDIF                                                            GPB2F403.101    
                                                                           GPB2F403.102    
        ENDDO                                                              GPB2F403.103    
                                                                           GPB2F403.104    
      ENDIF                                                                GPB2F403.105    
                                                                           GPB2F403.106    
! Finally, indicate this decomposition has been initialised                GPB2F403.107    
                                                                           GPB2F403.108    
      decomp_db_set(decomp_nowrap_ocean)=.TRUE.                            GPB2F403.109    
! And return the new horizontal dimensions                                 DECMPO1A.280    
                                                                           DECMPO1A.281    
      local_row_len=decomp_db_g_lasize(1,mype,decomp_standard_ocean)       DECMPO1A.282    
      local_n_rows=decomp_db_g_lasize(2,mype,decomp_standard_ocean)        DECMPO1A.283    
                                                                           DECMPO1A.284    
      RETURN                                                               DECMPO1A.285    
      END                                                                  DECMPO1A.286    
                                                                           DECMPO1A.287    
*ENDIF                                                                     DECMPO1A.288    
*ENDIF                                                                     GPB3F403.295