New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 8882 for branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90 – NEMO

Ignore:
Timestamp:
2017-12-01T18:44:09+01:00 (6 years ago)
Author:
flavoni
Message:

dev_CNRS_2017 branch: merged dev_r7881_ENHANCE09_RK3 with trunk r8864

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90

    r8329 r8882  
    1313   !!            3.6  !  2012-01  (C. Rousset) add ice boundary conditions for lim3 
    1414   !!---------------------------------------------------------------------- 
    15    !!    bdy_dta        : read external data along open boundaries from file 
    16    !!    bdy_dta_init   : initialise arrays etc for reading of external data 
     15 
    1716   !!---------------------------------------------------------------------- 
    18    USE timing          ! Timing 
    19    USE oce             ! ocean dynamics and tracers 
    20    USE dom_oce         ! ocean space and time domain 
    21    USE phycst          ! physical constants 
    22    USE bdy_oce         ! ocean open boundary conditions   
    23    USE bdytides        ! tidal forcing at boundaries 
    24    USE fldread         ! read input fields 
    25    USE iom             ! IOM library 
    26    USE in_out_manager  ! I/O logical units 
    27 #if defined key_lim2 
    28    USE ice_2 
    29 #elif defined key_lim3 
    30    USE ice 
    31    USE limvar          ! redistribute ice input into categories 
    32 #endif 
    33    USE sbcapr 
    34    USE sbctide         ! Tidal forcing or not 
     17   !!    bdy_dta      : read external data along open boundaries from file 
     18   !!    bdy_dta_init : initialise arrays etc for reading of external data 
     19   !!---------------------------------------------------------------------- 
     20   USE oce            ! ocean dynamics and tracers 
     21   USE dom_oce        ! ocean space and time domain 
     22   USE phycst         ! physical constants 
     23   USE sbcapr         ! atmospheric pressure forcing 
     24   USE sbctide        ! Tidal forcing or not 
     25   USE bdy_oce        ! ocean open boundary conditions   
     26   USE bdytides       ! tidal forcing at boundaries 
     27#if defined key_lim3 
     28   USE ice            ! sea-ice variables 
     29   USE icevar         ! redistribute ice input into categories 
     30#endif 
     31   ! 
     32   USE fldread        ! read input fields 
     33   USE iom            ! IOM library 
     34   USE in_out_manager ! I/O logical units 
     35   USE timing         ! Timing 
    3536 
    3637   IMPLICIT NONE 
     
    5051 
    5152#if defined key_lim3 
    52    LOGICAL :: ll_bdylim3                  ! determine whether ice input is lim2 (F) or lim3 (T) type 
    53    INTEGER :: jfld_hti, jfld_hts, jfld_ai ! indices of ice thickness, snow thickness and concentration in bf structure 
     53   INTEGER ::   nice_cat                      ! number of categories in the input file 
     54   INTEGER ::   jfld_hti, jfld_hts, jfld_ai  ! indices of ice thickness, snow thickness and concentration in bf structure 
    5455#endif 
    5556 
    5657   !!---------------------------------------------------------------------- 
    57    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     58   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    5859   !! $Id$  
    5960   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
     
    7980      !                                               ! etc. 
    8081      ! 
    81       INTEGER ::  ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd, jl  ! local indices 
     82      INTEGER ::  jbdy, jfld, jstart, jend, ib, jl  ! dummy loop indices 
     83      INTEGER ::  ii, ij, ik, igrd                  ! local integers 
    8284      INTEGER,          DIMENSION(jpbgrd) ::   ilen1  
    8385      INTEGER, POINTER, DIMENSION(:)      ::   nblen, nblenrim  ! short cuts 
     
    9496         !----------------------------- 
    9597          
    96          DO ib_bdy = 1, nb_bdy 
     98         DO jbdy = 1, nb_bdy 
    9799            ! 
    98             nblen => idx_bdy(ib_bdy)%nblen 
    99             nblenrim => idx_bdy(ib_bdy)%nblenrim 
    100             dta => dta_bdy(ib_bdy) 
    101  
    102             IF( nn_dyn2d_dta(ib_bdy) == 0 ) THEN  
     100            nblen    => idx_bdy(jbdy)%nblen 
     101            nblenrim => idx_bdy(jbdy)%nblenrim 
     102            dta      => dta_bdy(jbdy) 
     103            ! 
     104            IF( nn_dyn2d_dta(jbdy) == 0 ) THEN  
    103105               ilen1(:) = nblen(:) 
    104106               IF( dta%ll_ssh ) THEN  
    105107                  igrd = 1 
    106108                  DO ib = 1, ilen1(igrd) 
    107                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    108                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    109                      dta_bdy(ib_bdy)%ssh(ib) = sshn(ii,ij) * tmask(ii,ij,1)          
     109                     ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     110                     ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     111                     dta_bdy(jbdy)%ssh(ib) = sshn(ii,ij) * tmask(ii,ij,1)          
    110112                  END DO  
    111                END IF 
     113               ENDIF 
    112114               IF( dta%ll_u2d ) THEN  
    113115                  igrd = 2 
    114116                  DO ib = 1, ilen1(igrd) 
    115                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    116                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    117                      dta_bdy(ib_bdy)%u2d(ib) = un_b(ii,ij) * umask(ii,ij,1)          
     117                     ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     118                     ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     119                     dta_bdy(jbdy)%u2d(ib) = un_b(ii,ij) * umask(ii,ij,1)          
    118120                  END DO  
    119                END IF 
     121               ENDIF 
    120122               IF( dta%ll_v2d ) THEN  
    121123                  igrd = 3 
    122124                  DO ib = 1, ilen1(igrd) 
    123                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    124                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    125                      dta_bdy(ib_bdy)%v2d(ib) = vn_b(ii,ij) * vmask(ii,ij,1)          
     125                     ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     126                     ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     127                     dta_bdy(jbdy)%v2d(ib) = vn_b(ii,ij) * vmask(ii,ij,1)          
    126128                  END DO  
    127                END IF 
    128             ENDIF 
    129  
    130             IF( nn_dyn3d_dta(ib_bdy) == 0 ) THEN  
     129               ENDIF 
     130            ENDIF 
     131            ! 
     132            IF( nn_dyn3d_dta(jbdy) == 0 ) THEN  
    131133               ilen1(:) = nblen(:) 
    132134               IF( dta%ll_u3d ) THEN  
     
    134136                  DO ib = 1, ilen1(igrd) 
    135137                     DO ik = 1, jpkm1 
    136                         ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    137                         ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    138                         dta_bdy(ib_bdy)%u3d(ib,ik) =  ( un(ii,ij,ik) - un_b(ii,ij) ) * umask(ii,ij,ik)          
     138                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     139                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     140                        dta_bdy(jbdy)%u3d(ib,ik) =  ( un(ii,ij,ik) - un_b(ii,ij) ) * umask(ii,ij,ik)          
    139141                     END DO 
    140142                  END DO  
    141                END IF 
     143               ENDIF 
    142144               IF( dta%ll_v3d ) THEN  
    143145                  igrd = 3  
    144146                  DO ib = 1, ilen1(igrd) 
    145147                     DO ik = 1, jpkm1 
    146                         ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    147                         ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    148                         dta_bdy(ib_bdy)%v3d(ib,ik) =  ( vn(ii,ij,ik) - vn_b(ii,ij) ) * vmask(ii,ij,ik)          
     148                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     149                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     150                        dta_bdy(jbdy)%v3d(ib,ik) =  ( vn(ii,ij,ik) - vn_b(ii,ij) ) * vmask(ii,ij,ik)          
    149151                        END DO 
    150152                  END DO  
    151                END IF 
    152             ENDIF 
    153  
    154             IF( nn_tra_dta(ib_bdy) == 0 ) THEN  
     153               ENDIF 
     154            ENDIF 
     155 
     156            IF( nn_tra_dta(jbdy) == 0 ) THEN  
    155157               ilen1(:) = nblen(:) 
    156158               IF( dta%ll_tem ) THEN 
     
    158160                  DO ib = 1, ilen1(igrd) 
    159161                     DO ik = 1, jpkm1 
    160                         ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    161                         ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    162                         dta_bdy(ib_bdy)%tem(ib,ik) = tsn(ii,ij,ik,jp_tem) * tmask(ii,ij,ik)          
     162                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     163                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     164                        dta_bdy(jbdy)%tem(ib,ik) = tsn(ii,ij,ik,jp_tem) * tmask(ii,ij,ik)          
    163165                     END DO 
    164166                  END DO  
    165                END IF 
     167               ENDIF 
    166168               IF( dta%ll_sal ) THEN 
    167169                  igrd = 1  
    168170                  DO ib = 1, ilen1(igrd) 
    169171                     DO ik = 1, jpkm1 
    170                         ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    171                         ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    172                         dta_bdy(ib_bdy)%sal(ib,ik) = tsn(ii,ij,ik,jp_sal) * tmask(ii,ij,ik)          
     172                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     173                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     174                        dta_bdy(jbdy)%sal(ib,ik) = tsn(ii,ij,ik,jp_sal) * tmask(ii,ij,ik)          
    173175                     END DO 
    174176                  END DO  
    175                END IF 
    176             ENDIF 
    177  
    178 #if defined key_lim2 
    179             IF( nn_ice_lim_dta(ib_bdy) == 0 ) THEN  
    180                ilen1(:) = nblen(:) 
    181                IF( dta%ll_frld ) THEN 
    182                   igrd = 1  
    183                   DO ib = 1, ilen1(igrd) 
    184                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    185                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    186                      dta_bdy(ib_bdy)%frld(ib) = frld(ii,ij) * tmask(ii,ij,1)          
    187                   END DO  
    188                END IF 
    189                IF( dta%ll_hicif ) THEN 
    190                   igrd = 1  
    191                   DO ib = 1, ilen1(igrd) 
    192                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    193                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    194                      dta_bdy(ib_bdy)%hicif(ib) = hicif(ii,ij) * tmask(ii,ij,1)          
    195                   END DO  
    196                END IF 
    197                IF( dta%ll_hsnif ) THEN 
    198                   igrd = 1  
    199                   DO ib = 1, ilen1(igrd) 
    200                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    201                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    202                      dta_bdy(ib_bdy)%hsnif(ib) = hsnif(ii,ij) * tmask(ii,ij,1)          
    203                   END DO  
    204                END IF 
    205             ENDIF 
    206 #elif defined key_lim3 
    207             IF( nn_ice_lim_dta(ib_bdy) == 0 ) THEN  
     177               ENDIF 
     178            ENDIF 
     179 
     180#if defined key_lim3 
     181            IF( nn_ice_lim_dta(jbdy) == 0 ) THEN    ! set ice to initial values 
    208182               ilen1(:) = nblen(:) 
    209183               IF( dta%ll_a_i ) THEN 
     
    211185                  DO jl = 1, jpl 
    212186                     DO ib = 1, ilen1(igrd) 
    213                         ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    214                         ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    215                         dta_bdy(ib_bdy)%a_i (ib,jl) =  a_i(ii,ij,jl) * tmask(ii,ij,1)  
     187                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     188                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     189                        dta_bdy(jbdy)%a_i (ib,jl) =  a_i(ii,ij,jl) * tmask(ii,ij,1)  
    216190                     END DO 
    217191                  END DO 
    218192               ENDIF 
    219                IF( dta%ll_ht_i ) THEN 
     193               IF( dta%ll_h_i ) THEN 
    220194                  igrd = 1    
    221195                  DO jl = 1, jpl 
    222196                     DO ib = 1, ilen1(igrd) 
    223                         ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    224                         ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    225                         dta_bdy(ib_bdy)%ht_i (ib,jl) =  ht_i(ii,ij,jl) * tmask(ii,ij,1)  
     197                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     198                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     199                        dta_bdy(jbdy)%h_i (ib,jl) =  h_i(ii,ij,jl) * tmask(ii,ij,1)  
    226200                     END DO 
    227201                  END DO 
    228202               ENDIF 
    229                IF( dta%ll_ht_s ) THEN 
     203               IF( dta%ll_h_s ) THEN 
    230204                  igrd = 1    
    231205                  DO jl = 1, jpl 
    232206                     DO ib = 1, ilen1(igrd) 
    233                         ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    234                         ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    235                         dta_bdy(ib_bdy)%ht_s (ib,jl) =  ht_s(ii,ij,jl) * tmask(ii,ij,1)  
     207                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
     208                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     209                        dta_bdy(jbdy)%h_s (ib,jl) =  h_s(ii,ij,jl) * tmask(ii,ij,1)  
    236210                     END DO 
    237211                  END DO 
     
    239213            ENDIF 
    240214#endif 
    241          END DO ! ib_bdy 
     215         END DO ! jbdy 
    242216         ! 
    243217      ENDIF ! kt == nit000 
     
    247221      
    248222      jstart = 1 
    249       DO ib_bdy = 1, nb_bdy    
    250          dta => dta_bdy(ib_bdy) 
    251          IF( nn_dta(ib_bdy) == 1 ) THEN ! skip this bit if no external data required 
     223      DO jbdy = 1, nb_bdy    
     224         dta => dta_bdy(jbdy) 
     225         IF( nn_dta(jbdy) == 1 ) THEN ! skip this bit if no external data required 
    252226       
    253227            IF( PRESENT(jit) ) THEN 
    254228               ! Update barotropic boundary conditions only 
    255229               ! jit is optional argument for fld_read and bdytide_update 
    256                IF( cn_dyn2d(ib_bdy) /= 'none' ) THEN 
    257                   IF( nn_dyn2d_dta(ib_bdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 
     230               IF( cn_dyn2d(jbdy) /= 'none' ) THEN 
     231                  IF( nn_dyn2d_dta(jbdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 
    258232                     IF( dta%ll_ssh ) dta%ssh(:) = 0._wp 
    259233                     IF( dta%ll_u2d ) dta%u2d(:) = 0._wp 
    260234                     IF( dta%ll_u3d ) dta%v2d(:) = 0._wp 
    261235                  ENDIF 
    262                   IF (cn_tra(ib_bdy) /= 'runoff') THEN 
    263                      IF( nn_dyn2d_dta(ib_bdy) == 1 .OR. nn_dyn2d_dta(ib_bdy) == 3 ) THEN 
     236                  IF (cn_tra(jbdy) /= 'runoff') THEN 
     237                     IF( nn_dyn2d_dta(jbdy) == 1 .OR. nn_dyn2d_dta(jbdy) == 3 ) THEN 
    264238 
    265239                        jend = jstart + dta%nread(2) - 1 
    266                         IF( ln_full_vel_array(ib_bdy) ) THEN 
     240                        IF( ln_full_vel_array(jbdy) ) THEN 
    267241                           CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend),  & 
    268242                                     & kit=jit, kt_offset=time_offset , jpk_bdy=nb_jpk_bdy,   & 
    269                                      & fvl=ln_full_vel_array(ib_bdy)  ) 
     243                                     & fvl=ln_full_vel_array(jbdy)  ) 
    270244                        ELSE 
    271245                           CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), map=nbmap_ptr(jstart:jend),  & 
     
    274248 
    275249                        ! If full velocities in boundary data then extract barotropic velocities from 3D fields 
    276                         IF( ln_full_vel_array(ib_bdy) .AND.                                             & 
    277                           &    ( nn_dyn2d_dta(ib_bdy) == 1 .OR. nn_dyn2d_dta(ib_bdy) == 3 .OR.  & 
    278                           &      nn_dyn3d_dta(ib_bdy) == 1 ) )THEN 
     250                        IF( ln_full_vel_array(jbdy) .AND.                                             & 
     251                          &    ( nn_dyn2d_dta(jbdy) == 1 .OR. nn_dyn2d_dta(jbdy) == 3 .OR.  & 
     252                          &      nn_dyn3d_dta(jbdy) == 1 ) )THEN 
    279253 
    280254                           igrd = 2                      ! zonal velocity 
    281255                           dta%u2d(:) = 0._wp 
    282                            DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    283                               ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    284                               ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     256                           DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     257                              ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     258                              ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    285259                              DO ik = 1, jpkm1 
    286260                                 dta%u2d(ib) = dta%u2d(ib) & 
     
    291265                           igrd = 3                      ! meridional velocity 
    292266                           dta%v2d(:) = 0._wp 
    293                            DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    294                               ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    295                               ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     267                           DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     268                              ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     269                              ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    296270                              DO ik = 1, jpkm1 
    297271                                 dta%v2d(ib) = dta%v2d(ib) & 
     
    302276                        ENDIF                     
    303277                     ENDIF 
    304                      IF( nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN ! update tidal harmonic forcing 
    305                         CALL bdytide_update( kt=kt, idx=idx_bdy(ib_bdy), dta=dta, td=tides(ib_bdy),   &  
     278                     IF( nn_dyn2d_dta(jbdy) .ge. 2 ) THEN ! update tidal harmonic forcing 
     279                        CALL bdytide_update( kt=kt, idx=idx_bdy(jbdy), dta=dta, td=tides(jbdy),   &  
    306280                          &                 jit=jit, time_offset=time_offset ) 
    307281                     ENDIF 
     
    309283               ENDIF 
    310284            ELSE 
    311                IF (cn_tra(ib_bdy) == 'runoff') then      ! runoff condition 
    312                   jend = nb_bdy_fld(ib_bdy) 
     285               IF (cn_tra(jbdy) == 'runoff') then      ! runoff condition 
     286                  jend = nb_bdy_fld(jbdy) 
    313287                  CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend),  & 
    314288                               & map=nbmap_ptr(jstart:jend), kt_offset=time_offset ) 
    315289                  ! 
    316290                  igrd = 2                      ! zonal velocity 
    317                   DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    318                      ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    319                      ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     291                  DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     292                     ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     293                     ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    320294                     dta%u2d(ib) = dta%u2d(ib) / ( e2u(ii,ij) * hu_0(ii,ij) ) 
    321295                  END DO 
    322296                  ! 
    323297                  igrd = 3                      ! meridional velocity 
    324                   DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    325                      ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    326                      ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     298                  DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     299                     ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     300                     ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    327301                     dta%v2d(ib) = dta%v2d(ib) / ( e1v(ii,ij) * hv_0(ii,ij) ) 
    328302                  END DO 
    329303               ELSE 
    330                   IF( nn_dyn2d_dta(ib_bdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 
     304                  IF( nn_dyn2d_dta(jbdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 
    331305                     IF( dta%ll_ssh ) dta%ssh(:) = 0._wp 
    332306                     IF( dta%ll_u2d ) dta%u2d(:) = 0._wp 
     
    337311                     CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), & 
    338312                                  & map=nbmap_ptr(jstart:jend), kt_offset=time_offset, jpk_bdy=nb_jpk_bdy,   & 
    339                                   & fvl=ln_full_vel_array(ib_bdy) ) 
     313                                  & fvl=ln_full_vel_array(jbdy) ) 
    340314                  ENDIF 
    341315                  ! If full velocities in boundary data then split into barotropic and baroclinic data 
    342                   IF( ln_full_vel_array(ib_bdy) .and.                                             & 
    343                     & ( nn_dyn2d_dta(ib_bdy) == 1 .OR. nn_dyn2d_dta(ib_bdy) == 3 .OR. & 
    344                     &   nn_dyn3d_dta(ib_bdy) == 1 ) ) THEN 
     316                  IF( ln_full_vel_array(jbdy) .and.                                             & 
     317                    & ( nn_dyn2d_dta(jbdy) == 1 .OR. nn_dyn2d_dta(jbdy) == 3 .OR. & 
     318                    &   nn_dyn3d_dta(jbdy) == 1 ) ) THEN 
    345319                     igrd = 2                      ! zonal velocity 
    346320                     dta%u2d(:) = 0._wp 
    347                      DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    348                         ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    349                         ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     321                     DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     322                        ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     323                        ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    350324                        DO ik = 1, jpkm1 
    351325                           dta%u2d(ib) = dta%u2d(ib) & 
     
    359333                     igrd = 3                      ! meridional velocity 
    360334                     dta%v2d(:) = 0._wp 
    361                      DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 
    362                         ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    363                         ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     335                     DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     336                        ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     337                        ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    364338                        DO ik = 1, jpkm1 
    365339                           dta%v2d(ib) = dta%v2d(ib) & 
     
    375349               ENDIF 
    376350#if defined key_lim3 
    377                IF( .NOT. ll_bdylim3 .AND. cn_ice_lim(ib_bdy) /= 'none' .AND. nn_ice_lim_dta(ib_bdy) == 1 ) THEN ! bdy ice input (case input is lim2 type) 
    378                 CALL lim_var_itd ( bf(jfld_hti)%fnow(:,1,1), bf(jfld_hts)%fnow(:,1,1), bf(jfld_ai)%fnow(:,1,1), & 
    379                                   & dta_bdy(ib_bdy)%ht_i,     dta_bdy(ib_bdy)%ht_s,     dta_bdy(ib_bdy)%a_i     ) 
     351               IF( cn_ice_lim(jbdy) /= 'none' .AND. nn_ice_lim_dta(jbdy) == 1 ) THEN 
     352                  IF( nice_cat == 1 ) THEN ! case input cat = 1 
     353                     CALL ice_var_itd ( bf(jfld_hti)%fnow(:,1,1), bf(jfld_hts)%fnow(:,1,1), bf(jfld_ai)%fnow(:,1,1), & 
     354                        &               dta_bdy(jbdy)%h_i     , dta_bdy(jbdy)%h_s     , dta_bdy(jbdy)%a_i    ) 
     355                  ELSEIF( nice_cat /= 1 .AND. nice_cat /= jpl ) THEN ! case input cat /=1 and /=jpl 
     356                     CALL ice_var_itd2( bf(jfld_hti)%fnow(:,1,:), bf(jfld_hts)%fnow(:,1,:), bf(jfld_ai)%fnow(:,1,:), & 
     357                        &               dta_bdy(jbdy)%h_i     , dta_bdy(jbdy)%h_s     , dta_bdy(jbdy)%a_i    ) 
     358                  ENDIF 
    380359               ENDIF 
    381360#endif 
    382361            ENDIF 
    383362            jstart = jstart + dta%nread(1) 
    384          END IF ! nn_dta(ib_bdy) = 1 
    385       END DO  ! ib_bdy 
     363         ENDIF    ! nn_dta(jbdy) = 1 
     364      END DO  ! jbdy 
    386365 
    387366      IF ( ln_tide ) THEN 
    388367         IF (ln_dynspg_ts) THEN      ! Fill temporary arrays with slow-varying bdy data                            
    389             DO ib_bdy = 1, nb_bdy    ! Tidal component added in ts loop 
    390                IF ( nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN 
    391                   nblen => idx_bdy(ib_bdy)%nblen 
    392                   nblenrim => idx_bdy(ib_bdy)%nblenrim 
    393                   IF( cn_dyn2d(ib_bdy) == 'frs' ) THEN; ilen1(:)=nblen(:) ; ELSE ; ilen1(:)=nblenrim(:) ; ENDIF  
    394                   IF ( dta_bdy(ib_bdy)%ll_ssh ) dta_bdy_s(ib_bdy)%ssh(1:ilen1(1)) = dta_bdy(ib_bdy)%ssh(1:ilen1(1)) 
    395                   IF ( dta_bdy(ib_bdy)%ll_u2d ) dta_bdy_s(ib_bdy)%u2d(1:ilen1(2)) = dta_bdy(ib_bdy)%u2d(1:ilen1(2)) 
    396                   IF ( dta_bdy(ib_bdy)%ll_v2d ) dta_bdy_s(ib_bdy)%v2d(1:ilen1(3)) = dta_bdy(ib_bdy)%v2d(1:ilen1(3)) 
     368            DO jbdy = 1, nb_bdy    ! Tidal component added in ts loop 
     369               IF ( nn_dyn2d_dta(jbdy) .ge. 2 ) THEN 
     370                  nblen => idx_bdy(jbdy)%nblen 
     371                  nblenrim => idx_bdy(jbdy)%nblenrim 
     372                  IF( cn_dyn2d(jbdy) == 'frs' ) THEN; ilen1(:)=nblen(:) ; ELSE ; ilen1(:)=nblenrim(:) ; ENDIF  
     373                  IF ( dta_bdy(jbdy)%ll_ssh ) dta_bdy_s(jbdy)%ssh(1:ilen1(1)) = dta_bdy(jbdy)%ssh(1:ilen1(1)) 
     374                  IF ( dta_bdy(jbdy)%ll_u2d ) dta_bdy_s(jbdy)%u2d(1:ilen1(2)) = dta_bdy(jbdy)%u2d(1:ilen1(2)) 
     375                  IF ( dta_bdy(jbdy)%ll_v2d ) dta_bdy_s(jbdy)%v2d(1:ilen1(3)) = dta_bdy(jbdy)%v2d(1:ilen1(3)) 
    397376               ENDIF 
    398377            END DO 
     
    404383 
    405384      IF ( ln_apr_obc ) THEN 
    406          DO ib_bdy = 1, nb_bdy 
    407             IF (cn_tra(ib_bdy) /= 'runoff')THEN 
     385         DO jbdy = 1, nb_bdy 
     386            IF (cn_tra(jbdy) /= 'runoff')THEN 
    408387               igrd = 1                      ! meridional velocity 
    409                DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 
    410                   ii   = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    411                   ij   = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    412                   dta_bdy(ib_bdy)%ssh(ib) = dta_bdy(ib_bdy)%ssh(ib) + ssh_ib(ii,ij) 
     388               DO ib = 1, idx_bdy(jbdy)%nblenrim(igrd) 
     389                  ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     390                  ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
     391                  dta_bdy(jbdy)%ssh(ib) = dta_bdy(jbdy)%ssh(ib) + ssh_ib(ii,ij) 
    413392               END DO 
    414393            ENDIF 
     
    431410      !!                 
    432411      !!---------------------------------------------------------------------- 
    433       INTEGER ::   ib_bdy, jfld, jstart, jend, ierror, ios     ! Local integers 
     412      INTEGER ::   jbdy, jfld, jstart, jend, ierror, ios     ! Local integers 
    434413      ! 
    435414      CHARACTER(len=100)                     ::   cn_dir        ! Root directory for location of data files 
     
    437416      CHARACTER(len = 256)::   clname                           ! temporary file name 
    438417      LOGICAL                                ::   ln_full_vel   ! =T => full velocities in 3D boundary data 
    439                                                                 ! =F => baroclinic velocities in 3D boundary data 
     418      !                                                         ! =F => baroclinic velocities in 3D boundary data 
    440419      INTEGER                                ::   ilen_global   ! Max length required for global bdy dta arrays 
    441420      INTEGER, ALLOCATABLE, DIMENSION(:)     ::   ilen1, ilen3  ! size of 1st and 3rd dimensions of local arrays 
     
    445424      TYPE(OBC_DATA), POINTER                ::   dta           ! short cut 
    446425#if defined key_lim3 
    447       INTEGER               ::   zndims   ! number of dimensions in an array (i.e. 3 = wo ice cat; 4 = w ice cat) 
     426      INTEGER               ::   kndims   ! number of dimensions in an array (i.e. 3 = wo ice cat; 4 = w ice cat) 
     427      INTEGER, DIMENSION(4) ::   kdimsz   ! size   of dimensions 
    448428      INTEGER               ::   inum,id1 ! local integer 
    449429#endif 
     
    451431      TYPE(FLD_N) ::   bn_tem, bn_sal, bn_u3d, bn_v3d   !  
    452432      TYPE(FLD_N) ::   bn_ssh, bn_u2d, bn_v2d           ! informations about the fields to be read 
    453 #if defined key_lim2 
    454       TYPE(FLD_N) ::   bn_frld, bn_hicif, bn_hsnif      ! 
    455 #elif defined key_lim3 
    456       TYPE(FLD_N) ::   bn_a_i, bn_ht_i, bn_ht_s       
     433#if defined key_lim3 
     434      TYPE(FLD_N) ::   bn_a_i, bn_h_i, bn_h_s       
    457435#endif 
    458436      NAMELIST/nambdy_dta/ cn_dir, bn_tem, bn_sal, bn_u3d, bn_v3d, bn_ssh, bn_u2d, bn_v2d  
    459 #if defined key_lim2 
    460       NAMELIST/nambdy_dta/ bn_frld, bn_hicif, bn_hsnif 
    461 #elif defined key_lim3 
    462       NAMELIST/nambdy_dta/ bn_a_i, bn_ht_i, bn_ht_s 
     437#if defined key_lim3 
     438      NAMELIST/nambdy_dta/ bn_a_i, bn_h_i, bn_h_s 
    463439#endif 
    464440      NAMELIST/nambdy_dta/ ln_full_vel, nb_jpk_bdy 
     
    473449 
    474450      ! Set nn_dta 
    475       DO ib_bdy = 1, nb_bdy 
    476          nn_dta(ib_bdy) = MAX(  nn_dyn2d_dta(ib_bdy)       & 
    477                                ,nn_dyn3d_dta(ib_bdy)       & 
    478                                ,nn_tra_dta(ib_bdy)         & 
    479 #if ( defined key_lim2 || defined key_lim3 ) 
    480                               ,nn_ice_lim_dta(ib_bdy)    & 
     451      DO jbdy = 1, nb_bdy 
     452         nn_dta(jbdy) = MAX(   nn_dyn2d_dta  (jbdy)    & 
     453            &                , nn_dyn3d_dta  (jbdy)    & 
     454            &                , nn_tra_dta    (jbdy)    & 
     455#if defined key_lim3 
     456            &                , nn_ice_lim_dta(jbdy)    & 
    481457#endif 
    482458                              ) 
    483          IF(nn_dta(ib_bdy) > 1) nn_dta(ib_bdy) = 1 
     459         IF(nn_dta(jbdy) > 1)   nn_dta(jbdy) = 1 
    484460      END DO 
    485461 
     
    488464      ALLOCATE( nb_bdy_fld(nb_bdy) ) 
    489465      nb_bdy_fld(:) = 0 
    490       DO ib_bdy = 1, nb_bdy          
    491          IF( cn_dyn2d(ib_bdy) /= 'none' .and. ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) ) THEN 
    492             nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3 
    493          ENDIF 
    494          IF( cn_dyn3d(ib_bdy) /= 'none' .and. nn_dyn3d_dta(ib_bdy) == 1 ) THEN 
    495             nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2 
    496          ENDIF 
    497          IF( cn_tra(ib_bdy) /= 'none' .and. nn_tra_dta(ib_bdy) == 1  ) THEN 
    498             nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2 
    499          ENDIF 
    500 #if ( defined key_lim2 || defined key_lim3 ) 
    501          IF( cn_ice_lim(ib_bdy) /= 'none' .and. nn_ice_lim_dta(ib_bdy) == 1  ) THEN 
    502             nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3 
     466      DO jbdy = 1, nb_bdy          
     467         IF( cn_dyn2d(jbdy) /= 'none' .AND. ( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) ) THEN 
     468            nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 3 
     469         ENDIF 
     470         IF( cn_dyn3d(jbdy) /= 'none' .AND. nn_dyn3d_dta(jbdy) == 1 ) THEN 
     471            nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 2 
     472         ENDIF 
     473         IF( cn_tra(jbdy) /= 'none' .AND. nn_tra_dta(jbdy) == 1  ) THEN 
     474            nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 2 
     475         ENDIF 
     476#if defined key_lim3 
     477         IF( cn_ice_lim(jbdy) /= 'none' .AND. nn_ice_lim_dta(jbdy) == 1  ) THEN 
     478            nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 3 
    503479         ENDIF 
    504480#endif                
    505          IF(lwp) WRITE(numout,*) 'Maximum number of files to open =',nb_bdy_fld(ib_bdy) 
     481         IF(lwp) WRITE(numout,*) 'Maximum number of files to open =', nb_bdy_fld(jbdy) 
    506482      END DO             
    507483 
     
    529505      REWIND(numnam_cfg) 
    530506      jfld = 0  
    531       DO ib_bdy = 1, nb_bdy          
    532          IF( nn_dta(ib_bdy) == 1 ) THEN 
     507      DO jbdy = 1, nb_bdy          
     508         IF( nn_dta(jbdy) == 1 ) THEN 
    533509            READ  ( numnam_ref, nambdy_dta, IOSTAT = ios, ERR = 901) 
    534510901         IF( ios /= 0 )   CALL ctl_nam ( ios , 'nambdy_dta in reference namelist', lwp ) 
     
    538514            IF(lwm) WRITE( numond, nambdy_dta ) 
    539515 
    540             cn_dir_array(ib_bdy) = cn_dir 
    541             ln_full_vel_array(ib_bdy) = ln_full_vel 
    542  
    543             nblen => idx_bdy(ib_bdy)%nblen 
    544             nblenrim => idx_bdy(ib_bdy)%nblenrim 
    545             dta => dta_bdy(ib_bdy) 
     516            cn_dir_array(jbdy) = cn_dir 
     517            ln_full_vel_array(jbdy) = ln_full_vel 
     518 
     519            nblen => idx_bdy(jbdy)%nblen 
     520            nblenrim => idx_bdy(jbdy)%nblenrim 
     521            dta => dta_bdy(jbdy) 
    546522            dta%nread(2) = 0 
    547523 
    548524            ! Only read in necessary fields for this set. 
    549525            ! Important that barotropic variables come first. 
    550             IF( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) THEN  
     526            IF( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) THEN  
    551527 
    552528               IF( dta%ll_ssh ) THEN  
     
    554530                  jfld = jfld + 1 
    555531                  blf_i(jfld) = bn_ssh 
    556                   ibdy(jfld) = ib_bdy 
     532                  ibdy(jfld) = jbdy 
    557533                  igrid(jfld) = 1 
    558534                  ilen1(jfld) = nblen(igrid(jfld)) 
     
    561537               ENDIF 
    562538 
    563                IF( dta%ll_u2d .and. .not. ln_full_vel_array(ib_bdy) ) THEN 
     539               IF( dta%ll_u2d .and. .not. ln_full_vel_array(jbdy) ) THEN 
    564540                  if(lwp) write(numout,*) '++++++ reading in u2d field' 
    565541                  jfld = jfld + 1 
    566542                  blf_i(jfld) = bn_u2d 
    567                   ibdy(jfld) = ib_bdy 
     543                  ibdy(jfld) = jbdy 
    568544                  igrid(jfld) = 2 
    569545                  ilen1(jfld) = nblen(igrid(jfld)) 
     
    572548               ENDIF 
    573549 
    574                IF( dta%ll_v2d .and. .not. ln_full_vel_array(ib_bdy) ) THEN 
     550               IF( dta%ll_v2d .and. .not. ln_full_vel_array(jbdy) ) THEN 
    575551                  if(lwp) write(numout,*) '++++++ reading in v2d field' 
    576552                  jfld = jfld + 1 
    577553                  blf_i(jfld) = bn_v2d 
    578                   ibdy(jfld) = ib_bdy 
     554                  ibdy(jfld) = jbdy 
    579555                  igrid(jfld) = 3 
    580556                  ilen1(jfld) = nblen(igrid(jfld)) 
     
    587563            ! read 3D velocities if baroclinic velocities require OR if 
    588564            ! barotropic velocities required and ln_full_vel set to .true. 
    589             IF( nn_dyn3d_dta(ib_bdy) == 1 .OR. & 
    590            &  ( ln_full_vel_array(ib_bdy) .AND. ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) ) ) THEN 
    591  
    592                IF( dta%ll_u3d .OR. ( ln_full_vel_array(ib_bdy) .and. dta%ll_u2d ) ) THEN 
     565            IF( nn_dyn3d_dta(jbdy) == 1 .OR. & 
     566           &  ( ln_full_vel_array(jbdy) .AND. ( nn_dyn2d_dta(jbdy) == 1 .OR. nn_dyn2d_dta(jbdy) == 3 ) ) ) THEN 
     567 
     568               IF( dta%ll_u3d .OR. ( ln_full_vel_array(jbdy) .and. dta%ll_u2d ) ) THEN 
    593569                  if(lwp) write(numout,*) '++++++ reading in u3d field' 
    594570                  jfld = jfld + 1 
    595571                  blf_i(jfld) = bn_u3d 
    596                   ibdy(jfld) = ib_bdy 
     572                  ibdy(jfld) = jbdy 
    597573                  igrid(jfld) = 2 
    598574                  ilen1(jfld) = nblen(igrid(jfld)) 
    599575                  ilen3(jfld) = jpk 
    600                   IF( ln_full_vel_array(ib_bdy) .and. dta%ll_u2d ) dta%nread(2) = dta%nread(2) + 1 
    601                ENDIF 
    602  
    603                IF( dta%ll_v3d .OR. ( ln_full_vel_array(ib_bdy) .and. dta%ll_v2d ) ) THEN 
     576                  IF( ln_full_vel_array(jbdy) .and. dta%ll_u2d ) dta%nread(2) = dta%nread(2) + 1 
     577               ENDIF 
     578 
     579               IF( dta%ll_v3d .OR. ( ln_full_vel_array(jbdy) .and. dta%ll_v2d ) ) THEN 
    604580                  if(lwp) write(numout,*) '++++++ reading in v3d field' 
    605581                  jfld = jfld + 1 
    606582                  blf_i(jfld) = bn_v3d 
    607                   ibdy(jfld) = ib_bdy 
     583                  ibdy(jfld) = jbdy 
    608584                  igrid(jfld) = 3 
    609585                  ilen1(jfld) = nblen(igrid(jfld)) 
    610586                  ilen3(jfld) = jpk 
    611                   IF( ln_full_vel_array(ib_bdy) .and. dta%ll_v2d ) dta%nread(2) = dta%nread(2) + 1 
     587                  IF( ln_full_vel_array(jbdy) .and. dta%ll_v2d ) dta%nread(2) = dta%nread(2) + 1 
    612588               ENDIF 
    613589 
     
    615591 
    616592            ! temperature and salinity 
    617             IF( nn_tra_dta(ib_bdy) == 1 ) THEN 
     593            IF( nn_tra_dta(jbdy) == 1 ) THEN 
    618594 
    619595               IF( dta%ll_tem ) THEN 
     
    621597                  jfld = jfld + 1 
    622598                  blf_i(jfld) = bn_tem 
    623                   ibdy(jfld) = ib_bdy 
     599                  ibdy(jfld) = jbdy 
    624600                  igrid(jfld) = 1 
    625601                  ilen1(jfld) = nblen(igrid(jfld)) 
     
    631607                  jfld = jfld + 1 
    632608                  blf_i(jfld) = bn_sal 
    633                   ibdy(jfld) = ib_bdy 
     609                  ibdy(jfld) = jbdy 
    634610                  igrid(jfld) = 1 
    635611                  ilen1(jfld) = nblen(igrid(jfld)) 
     
    639615            ENDIF 
    640616 
    641 #if defined key_lim2 
     617#if defined key_lim3 
    642618            ! sea ice 
    643             IF( nn_ice_lim_dta(ib_bdy) == 1 ) THEN 
    644  
    645                IF( dta%ll_frld ) THEN 
    646                   jfld = jfld + 1 
    647                   blf_i(jfld) = bn_frld 
    648                   ibdy(jfld) = ib_bdy 
    649                   igrid(jfld) = 1 
    650                   ilen1(jfld) = nblen(igrid(jfld)) 
    651                   ilen3(jfld) = 1 
    652                ENDIF 
    653  
    654                IF( dta%ll_hicif ) THEN 
    655                   jfld = jfld + 1 
    656                   blf_i(jfld) = bn_hicif 
    657                   ibdy(jfld) = ib_bdy 
    658                   igrid(jfld) = 1 
    659                   ilen1(jfld) = nblen(igrid(jfld)) 
    660                   ilen3(jfld) = 1 
    661                ENDIF 
    662  
    663                IF( dta%ll_hsnif ) THEN 
    664                   jfld = jfld + 1 
    665                   blf_i(jfld) = bn_hsnif 
    666                   ibdy(jfld) = ib_bdy 
    667                   igrid(jfld) = 1 
    668                   ilen1(jfld) = nblen(igrid(jfld)) 
    669                   ilen3(jfld) = 1 
    670                ENDIF 
    671  
    672             ENDIF 
    673 #elif defined key_lim3 
    674             ! sea ice 
    675             IF( nn_ice_lim_dta(ib_bdy) == 1 ) THEN 
    676                ! Test for types of ice input (lim2 or lim3)  
     619            IF( nn_ice_lim_dta(jbdy) == 1 ) THEN 
     620               ! Test for types of ice input (1cat or Xcat)  
    677621               ! Build file name to find dimensions  
    678622               clname=TRIM( cn_dir )//TRIM(bn_a_i%clname) 
     
    687631               ! 
    688632               CALL iom_open  ( clname, inum ) 
    689                id1 = iom_varid( inum, bn_a_i%clvar, kndims=zndims, ldstop = .FALSE. ) 
     633               id1 = iom_varid( inum, bn_a_i%clvar, kdimsz=kdimsz, kndims=kndims, ldstop = .FALSE. ) 
    690634               CALL iom_close ( inum ) 
    691635 
    692                 IF ( zndims == 4 ) THEN 
    693                  ll_bdylim3 = .TRUE.   ! lim3 input 
     636                IF ( kndims == 4 ) THEN 
     637                 nice_cat = kdimsz(4)   ! Xcat input 
    694638               ELSE 
    695                  ll_bdylim3 = .FALSE.  ! lim2 input       
     639                 nice_cat = 1           ! 1cat input       
    696640               ENDIF 
    697641               ! End test 
     
    700644                  jfld = jfld + 1 
    701645                  blf_i(jfld) = bn_a_i 
    702                   ibdy(jfld) = ib_bdy 
     646                  ibdy(jfld)  = jbdy 
    703647                  igrid(jfld) = 1 
    704648                  ilen1(jfld) = nblen(igrid(jfld)) 
    705                   IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
    706                ENDIF 
    707  
    708                IF( dta%ll_ht_i ) THEN 
    709                   jfld = jfld + 1 
    710                   blf_i(jfld) = bn_ht_i 
    711                   ibdy(jfld) = ib_bdy 
     649                  ilen3(jfld) = nice_cat 
     650               ENDIF 
     651 
     652               IF( dta%ll_h_i ) THEN 
     653                  jfld = jfld + 1 
     654                  blf_i(jfld) = bn_h_i 
     655                  ibdy(jfld)  = jbdy 
    712656                  igrid(jfld) = 1 
    713657                  ilen1(jfld) = nblen(igrid(jfld)) 
    714                   IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
    715                ENDIF 
    716  
    717                IF( dta%ll_ht_s ) THEN 
    718                   jfld = jfld + 1 
    719                    blf_i(jfld) = bn_ht_s 
    720                   ibdy(jfld) = ib_bdy 
     658                  ilen3(jfld) = nice_cat 
     659               ENDIF 
     660 
     661               IF( dta%ll_h_s ) THEN 
     662                  jfld = jfld + 1 
     663                  blf_i(jfld) = bn_h_s 
     664                  ibdy(jfld)  = jbdy 
    721665                  igrid(jfld) = 1 
    722666                  ilen1(jfld) = nblen(igrid(jfld)) 
    723                   IF ( ll_bdylim3 ) THEN ; ilen3(jfld)=jpl ; ELSE ; ilen3(jfld)=1 ; ENDIF 
     667                  ilen3(jfld) = nice_cat 
    724668               ENDIF 
    725669 
     
    728672            ! Recalculate field counts 
    729673            !------------------------- 
    730             IF( ib_bdy == 1 ) THEN  
     674            IF( jbdy == 1 ) THEN  
    731675               nb_bdy_fld_sum = 0 
    732                nb_bdy_fld(ib_bdy) = jfld 
     676               nb_bdy_fld(jbdy) = jfld 
    733677               nb_bdy_fld_sum     = jfld               
    734678            ELSE 
    735                nb_bdy_fld(ib_bdy) = jfld - nb_bdy_fld_sum 
    736                nb_bdy_fld_sum = nb_bdy_fld_sum + nb_bdy_fld(ib_bdy) 
    737             ENDIF 
    738  
    739             dta%nread(1) = nb_bdy_fld(ib_bdy) 
     679               nb_bdy_fld(jbdy) = jfld - nb_bdy_fld_sum 
     680               nb_bdy_fld_sum = nb_bdy_fld_sum + nb_bdy_fld(jbdy) 
     681            ENDIF 
     682 
     683            dta%nread(1) = nb_bdy_fld(jbdy) 
    740684 
    741685         ENDIF ! nn_dta == 1 
    742       ENDDO ! ib_bdy 
     686      ENDDO ! jbdy 
    743687 
    744688      DO jfld = 1, nb_bdy_fld_sum 
     
    752696      !------------------------------------- 
    753697      jstart = 1 
    754       DO ib_bdy = 1, nb_bdy 
    755          jend = jstart - 1 + nb_bdy_fld(ib_bdy)  
    756          CALL fld_fill( bf(jstart:jend), blf_i(jstart:jend), cn_dir_array(ib_bdy), 'bdy_dta',   & 
     698      DO jbdy = 1, nb_bdy 
     699         jend = jstart - 1 + nb_bdy_fld(jbdy)  
     700         CALL fld_fill( bf(jstart:jend), blf_i(jstart:jend), cn_dir_array(jbdy), 'bdy_dta',   & 
    757701         &              'open boundary conditions', 'nambdy_dta' ) 
    758702         jstart = jend + 1 
     
    765709 
    766710      jfld = 0 
    767       DO ib_bdy=1, nb_bdy 
    768  
    769          nblen => idx_bdy(ib_bdy)%nblen 
    770          dta => dta_bdy(ib_bdy) 
     711      DO jbdy=1, nb_bdy 
     712 
     713         nblen => idx_bdy(jbdy)%nblen 
     714         dta => dta_bdy(jbdy) 
    771715 
    772716         if(lwp) then 
     
    780724         endif 
    781725 
    782          IF ( nn_dyn2d_dta(ib_bdy) == 0 .or. nn_dyn2d_dta(ib_bdy) == 2 ) THEN 
     726         IF ( nn_dyn2d_dta(jbdy) == 0 .or. nn_dyn2d_dta(jbdy) == 2 ) THEN 
    783727            if(lwp) write(numout,*) '++++++ dta%ssh/u2d/u3d allocated space' 
    784728            IF( dta%ll_ssh ) ALLOCATE( dta%ssh(nblen(1)) ) 
     
    786730            IF( dta%ll_v2d ) ALLOCATE( dta%v2d(nblen(3)) ) 
    787731         ENDIF 
    788          IF ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) THEN 
     732         IF ( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) THEN 
    789733            IF( dta%ll_ssh ) THEN 
    790734               if(lwp) write(numout,*) '++++++ dta%ssh pointing to fnow' 
     
    793737            ENDIF 
    794738            IF ( dta%ll_u2d ) THEN 
    795                IF ( ln_full_vel_array(ib_bdy) ) THEN 
     739               IF ( ln_full_vel_array(jbdy) ) THEN 
    796740                  if(lwp) write(numout,*) '++++++ dta%u2d allocated space' 
    797741                  ALLOCATE( dta%u2d(nblen(2)) ) 
     
    803747            ENDIF 
    804748            IF ( dta%ll_v2d ) THEN 
    805                IF ( ln_full_vel_array(ib_bdy) ) THEN 
     749               IF ( ln_full_vel_array(jbdy) ) THEN 
    806750                  if(lwp) write(numout,*) '++++++ dta%v2d allocated space' 
    807751                  ALLOCATE( dta%v2d(nblen(3)) ) 
     
    814758         ENDIF 
    815759 
    816          IF ( nn_dyn3d_dta(ib_bdy) == 0 ) THEN 
     760         IF ( nn_dyn3d_dta(jbdy) == 0 ) THEN 
    817761            if(lwp) write(numout,*) '++++++ dta%u3d/v3d allocated space' 
    818             IF( dta%ll_u3d ) ALLOCATE( dta_bdy(ib_bdy)%u3d(nblen(2),jpk) ) 
    819             IF( dta%ll_v3d ) ALLOCATE( dta_bdy(ib_bdy)%v3d(nblen(3),jpk) ) 
    820          ENDIF 
    821          IF ( nn_dyn3d_dta(ib_bdy) == 1 .or. & 
    822            &  ( ln_full_vel_array(ib_bdy) .and. ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) ) ) THEN 
    823             IF ( dta%ll_u3d .or. ( ln_full_vel_array(ib_bdy) .and. dta%ll_u2d ) ) THEN 
     762            IF( dta%ll_u3d ) ALLOCATE( dta_bdy(jbdy)%u3d(nblen(2),jpk) ) 
     763            IF( dta%ll_v3d ) ALLOCATE( dta_bdy(jbdy)%v3d(nblen(3),jpk) ) 
     764         ENDIF 
     765         IF ( nn_dyn3d_dta(jbdy) == 1 .or. & 
     766           &  ( ln_full_vel_array(jbdy) .and. ( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) ) ) THEN 
     767            IF ( dta%ll_u3d .or. ( ln_full_vel_array(jbdy) .and. dta%ll_u2d ) ) THEN 
    824768               if(lwp) write(numout,*) '++++++ dta%u3d pointing to fnow' 
    825769               jfld = jfld + 1 
    826                dta_bdy(ib_bdy)%u3d => bf(jfld)%fnow(:,1,:) 
    827             ENDIF 
    828             IF ( dta%ll_v3d .or. ( ln_full_vel_array(ib_bdy) .and. dta%ll_v2d ) ) THEN 
     770               dta_bdy(jbdy)%u3d => bf(jfld)%fnow(:,1,:) 
     771            ENDIF 
     772            IF ( dta%ll_v3d .or. ( ln_full_vel_array(jbdy) .and. dta%ll_v2d ) ) THEN 
    829773               if(lwp) write(numout,*) '++++++ dta%v3d pointing to fnow' 
    830774               jfld = jfld + 1 
    831                dta_bdy(ib_bdy)%v3d => bf(jfld)%fnow(:,1,:) 
    832             ENDIF 
    833          ENDIF 
    834  
    835          IF( nn_tra_dta(ib_bdy) == 0 ) THEN 
     775               dta_bdy(jbdy)%v3d => bf(jfld)%fnow(:,1,:) 
     776            ENDIF 
     777         ENDIF 
     778 
     779         IF( nn_tra_dta(jbdy) == 0 ) THEN 
    836780            if(lwp) write(numout,*) '++++++ dta%tem/sal allocated space' 
    837             IF( dta%ll_tem ) ALLOCATE( dta_bdy(ib_bdy)%tem(nblen(1),jpk) ) 
    838             IF( dta%ll_sal ) ALLOCATE( dta_bdy(ib_bdy)%sal(nblen(1),jpk) ) 
     781            IF( dta%ll_tem ) ALLOCATE( dta_bdy(jbdy)%tem(nblen(1),jpk) ) 
     782            IF( dta%ll_sal ) ALLOCATE( dta_bdy(jbdy)%sal(nblen(1),jpk) ) 
    839783         ELSE 
    840784            IF( dta%ll_tem ) THEN 
    841785               if(lwp) write(numout,*) '++++++ dta%tem pointing to fnow' 
    842786               jfld = jfld + 1 
    843                dta_bdy(ib_bdy)%tem => bf(jfld)%fnow(:,1,:) 
     787               dta_bdy(jbdy)%tem => bf(jfld)%fnow(:,1,:) 
    844788            ENDIF 
    845789            IF( dta%ll_sal ) THEN  
    846790               if(lwp) write(numout,*) '++++++ dta%sal pointing to fnow' 
    847791               jfld = jfld + 1 
    848                dta_bdy(ib_bdy)%sal => bf(jfld)%fnow(:,1,:) 
    849             ENDIF 
    850          ENDIF 
    851  
    852 #if defined key_lim2 
    853          IF (cn_ice_lim(ib_bdy) /= 'none') THEN 
    854             IF( nn_ice_lim_dta(ib_bdy) == 0 ) THEN 
    855                ALLOCATE( dta_bdy(ib_bdy)%frld(nblen(1)) ) 
    856                ALLOCATE( dta_bdy(ib_bdy)%hicif(nblen(1)) ) 
    857                ALLOCATE( dta_bdy(ib_bdy)%hsnif(nblen(1)) ) 
     792               dta_bdy(jbdy)%sal => bf(jfld)%fnow(:,1,:) 
     793            ENDIF 
     794         ENDIF 
     795 
     796#if defined key_lim3 
     797         IF (cn_ice_lim(jbdy) /= 'none') THEN 
     798            IF( nn_ice_lim_dta(jbdy) == 0 ) THEN 
     799               ALLOCATE( dta_bdy(jbdy)%a_i(nblen(1),jpl) ) 
     800               ALLOCATE( dta_bdy(jbdy)%h_i(nblen(1),jpl) ) 
     801               ALLOCATE( dta_bdy(jbdy)%h_s(nblen(1),jpl) ) 
    858802            ELSE 
    859                jfld = jfld + 1 
    860                dta_bdy(ib_bdy)%frld  => bf(jfld)%fnow(:,1,1) 
    861                jfld = jfld + 1 
    862                dta_bdy(ib_bdy)%hicif => bf(jfld)%fnow(:,1,1) 
    863                jfld = jfld + 1 
    864                dta_bdy(ib_bdy)%hsnif => bf(jfld)%fnow(:,1,1) 
    865             ENDIF 
    866          ENDIF 
    867 #elif defined key_lim3 
    868          IF (cn_ice_lim(ib_bdy) /= 'none') THEN 
    869             IF( nn_ice_lim_dta(ib_bdy) == 0 ) THEN 
    870                ALLOCATE( dta_bdy(ib_bdy)%a_i (nblen(1),jpl) ) 
    871                ALLOCATE( dta_bdy(ib_bdy)%ht_i(nblen(1),jpl) ) 
    872                ALLOCATE( dta_bdy(ib_bdy)%ht_s(nblen(1),jpl) ) 
    873             ELSE 
    874                IF ( ll_bdylim3 ) THEN ! case input is lim3 type 
    875                   jfld = jfld + 1 
    876                   dta_bdy(ib_bdy)%a_i  => bf(jfld)%fnow(:,1,:) 
    877                   jfld = jfld + 1 
    878                   dta_bdy(ib_bdy)%ht_i => bf(jfld)%fnow(:,1,:) 
    879                   jfld = jfld + 1 
    880                   dta_bdy(ib_bdy)%ht_s => bf(jfld)%fnow(:,1,:) 
    881                ELSE ! case input is lim2 type 
     803               IF ( nice_cat == jpl ) THEN ! case input cat = jpl 
     804                  jfld = jfld + 1 
     805                  dta_bdy(jbdy)%a_i => bf(jfld)%fnow(:,1,:) 
     806                  jfld = jfld + 1 
     807                  dta_bdy(jbdy)%h_i => bf(jfld)%fnow(:,1,:) 
     808                  jfld = jfld + 1 
     809                  dta_bdy(jbdy)%h_s => bf(jfld)%fnow(:,1,:) 
     810               ELSE                        ! case input cat = 1 OR (/=1 and /=jpl) 
    882811                  jfld_ai  = jfld + 1 
    883812                  jfld_hti = jfld + 2 
    884813                  jfld_hts = jfld + 3 
    885814                  jfld     = jfld + 3 
    886                   ALLOCATE( dta_bdy(ib_bdy)%a_i (nblen(1),jpl) ) 
    887                   ALLOCATE( dta_bdy(ib_bdy)%ht_i(nblen(1),jpl) ) 
    888                   ALLOCATE( dta_bdy(ib_bdy)%ht_s(nblen(1),jpl) ) 
    889                   dta_bdy(ib_bdy)%a_i (:,:) = 0._wp 
    890                   dta_bdy(ib_bdy)%ht_i(:,:) = 0._wp 
    891                   dta_bdy(ib_bdy)%ht_s(:,:) = 0._wp 
     815                  ALLOCATE( dta_bdy(jbdy)%a_i(nblen(1),jpl) ) 
     816                  ALLOCATE( dta_bdy(jbdy)%h_i(nblen(1),jpl) ) 
     817                  ALLOCATE( dta_bdy(jbdy)%h_s(nblen(1),jpl) ) 
     818                  dta_bdy(jbdy)%a_i(:,:) = 0._wp 
     819                  dta_bdy(jbdy)%h_i(:,:) = 0._wp 
     820                  dta_bdy(jbdy)%h_s(:,:) = 0._wp 
    892821               ENDIF 
    893822 
     
    896825#endif 
    897826         ! 
    898       END DO ! ib_bdy  
     827      END DO ! jbdy  
    899828      ! 
    900829      IF( nn_timing == 1 ) CALL timing_stop('bdy_dta_init') 
Note: See TracChangeset for help on using the changeset viewer.