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 11822 for NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/BDY/bdydta.F90 – NEMO

Ignore:
Timestamp:
2019-10-29T11:41:36+01:00 (4 years ago)
Author:
acc
Message:

Branch 2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps. Sette tested updates to branch to align with trunk changes between 10721 and 11740. Sette tests are passing but results differ from branch before these changes (except for GYRE_PISCES and VORTEX) and branch results already differed from trunk because of algorithmic fixes. Will need more checks to confirm correctness.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/BDY/bdydta.F90

    r11480 r11822  
    4343   PUBLIC   bdy_dta_init     ! routine called by nemogcm.F90 
    4444 
    45    INTEGER, ALLOCATABLE, DIMENSION(:)   ::   nb_bdy_fld        ! Number of fields to update for each boundary set. 
    46    INTEGER                              ::   nb_bdy_fld_sum    ! Total number of fields to update for all boundary sets. 
    47    LOGICAL,           DIMENSION(jp_bdy) ::   ln_full_vel_array ! =T => full velocities in 3D boundary conditions 
    48                                                                ! =F => baroclinic velocities in 3D boundary conditions 
     45   INTEGER , PARAMETER ::   jpbdyfld  = 16    ! maximum number of files to read  
     46   INTEGER , PARAMETER ::   jp_bdyssh = 1     !  
     47   INTEGER , PARAMETER ::   jp_bdyu2d = 2     !  
     48   INTEGER , PARAMETER ::   jp_bdyv2d = 3     ! 
     49   INTEGER , PARAMETER ::   jp_bdyu3d = 4     ! 
     50   INTEGER , PARAMETER ::   jp_bdyv3d = 5     ! 
     51   INTEGER , PARAMETER ::   jp_bdytem = 6     !  
     52   INTEGER , PARAMETER ::   jp_bdysal = 7     !  
     53   INTEGER , PARAMETER ::   jp_bdya_i = 8     !  
     54   INTEGER , PARAMETER ::   jp_bdyh_i = 9     !  
     55   INTEGER , PARAMETER ::   jp_bdyh_s = 10    !  
     56   INTEGER , PARAMETER ::   jp_bdyt_i = 11    !  
     57   INTEGER , PARAMETER ::   jp_bdyt_s = 12    !  
     58   INTEGER , PARAMETER ::   jp_bdytsu = 13    !  
     59   INTEGER , PARAMETER ::   jp_bdys_i = 14    !  
     60   INTEGER , PARAMETER ::   jp_bdyaip = 15    !  
     61   INTEGER , PARAMETER ::   jp_bdyhip = 16    !  
     62#if ! defined key_si3 
     63   INTEGER , PARAMETER ::   jpl = 1 
     64#endif 
     65 
    4966!$AGRIF_DO_NOT_TREAT 
    50    TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:), TARGET ::   bf        ! structure of input fields (file informations, fields read) 
     67   TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:,:), TARGET ::   bf   ! structure of input fields (file informations, fields read) 
    5168!$AGRIF_END_DO_NOT_TREAT 
    52    TYPE(MAP_POINTER), ALLOCATABLE, DIMENSION(:) :: nbmap_ptr   ! array of pointers to nbmap 
    53  
    54 #if defined key_si3 
    55    INTEGER ::   nice_cat                      ! number of categories in the input file 
    56    INTEGER ::   jfld_hti, jfld_hts, jfld_ai   ! indices of ice thickness, snow thickness and concentration in bf structure 
    57    INTEGER, DIMENSION(jp_bdy) :: jfld_htit, jfld_htst, jfld_ait 
    58 #endif 
    5969 
    6070   !!---------------------------------------------------------------------- 
     
    6575CONTAINS 
    6676 
    67       SUBROUTINE bdy_dta( kt, Kmm, time_offset ) 
     77   SUBROUTINE bdy_dta( kt, Kmm, kit, kt_offset ) 
    6878      !!---------------------------------------------------------------------- 
    6979      !!                   ***  SUBROUTINE bdy_dta  *** 
     
    7686      INTEGER, INTENT(in)           ::   kt           ! ocean time-step index  
    7787      INTEGER, INTENT(in)           ::   Kmm          ! ocean time level index 
    78       INTEGER, INTENT(in), OPTIONAL ::   time_offset  ! time offset in units of timesteps. NB. if jit 
     88      INTEGER, INTENT(in), OPTIONAL ::   kit          ! subcycle time-step index (for timesplitting option) 
     89      INTEGER, INTENT(in), OPTIONAL ::   kt_offset    ! time offset in units of timesteps. NB. if kit 
    7990      !                                               ! is present then units = subcycle timesteps. 
    80       !                                               ! time_offset = 0 => get data at "now" time level 
    81       !                                               ! time_offset = -1 => get data at "before" time level 
    82       !                                               ! time_offset = +1 => get data at "after" time level 
     91      !                                               ! kt_offset = 0 => get data at "now" time level 
     92      !                                               ! kt_offset = -1 => get data at "before" time level 
     93      !                                               ! kt_offset = +1 => get data at "after" time level 
    8394      !                                               ! etc. 
    8495      ! 
    85       INTEGER ::  jbdy, jfld, jstart, jend, ib, jl  ! dummy loop indices 
    86       INTEGER ::  ii, ij, ik, igrd                  ! local integers 
    87       INTEGER,          DIMENSION(jpbgrd) ::   ilen1  
    88       INTEGER, POINTER, DIMENSION(:)      ::   nblen, nblenrim  ! short cuts 
    89       TYPE(OBC_DATA), POINTER             ::   dta              ! short cut 
     96      INTEGER ::  jbdy, jfld, jstart, jend, ib, jl    ! dummy loop indices 
     97      INTEGER ::  ii, ij, ik, igrd, ipl               ! local integers 
     98      INTEGER,   DIMENSION(jpbgrd)     ::   ilen1  
     99      INTEGER,   DIMENSION(:), POINTER ::   nblen, nblenrim  ! short cuts 
     100      TYPE(OBC_DATA)         , POINTER ::   dta_alias        ! short cut 
     101      TYPE(FLD), DIMENSION(:), POINTER ::   bf_alias 
    90102      !!--------------------------------------------------------------------------- 
    91103      ! 
     
    94106      ! Initialise data arrays once for all from initial conditions where required 
    95107      !--------------------------------------------------------------------------- 
    96       IF( kt == nit000 ) THEN 
     108      IF( kt == nit000 .AND. .NOT.PRESENT(kit) ) THEN 
    97109 
    98110         ! Calculate depth-mean currents 
    99111         !----------------------------- 
    100           
     112 
    101113         DO jbdy = 1, nb_bdy 
    102114            ! 
    103115            nblen    => idx_bdy(jbdy)%nblen 
    104116            nblenrim => idx_bdy(jbdy)%nblenrim 
    105             dta      => dta_bdy(jbdy) 
    106117            ! 
    107118            IF( nn_dyn2d_dta(jbdy) == 0 ) THEN  
    108119               ilen1(:) = nblen(:) 
    109                IF( dta%ll_ssh ) THEN  
     120               IF( dta_bdy(jbdy)%lneed_ssh ) THEN  
    110121                  igrd = 1 
    111122                  DO ib = 1, ilen1(igrd) 
     
    113124                     ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    114125                     dta_bdy(jbdy)%ssh(ib) = ssh(ii,ij,Kmm) * tmask(ii,ij,1)          
    115                   END DO  
    116                ENDIF 
    117                IF( dta%ll_u2d ) THEN  
     126                  END DO 
     127               ENDIF 
     128               IF( dta_bdy(jbdy)%lneed_dyn2d) THEN  
    118129                  igrd = 2 
    119130                  DO ib = 1, ilen1(igrd) 
     
    121132                     ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    122133                     dta_bdy(jbdy)%u2d(ib) = uu_b(ii,ij,Kmm) * umask(ii,ij,1)          
    123                   END DO  
    124                ENDIF 
    125                IF( dta%ll_v2d ) THEN  
     134                  END DO 
    126135                  igrd = 3 
    127136                  DO ib = 1, ilen1(igrd) 
     
    129138                     ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    130139                     dta_bdy(jbdy)%v2d(ib) = vv_b(ii,ij,Kmm) * vmask(ii,ij,1)          
    131                   END DO  
     140                  END DO 
    132141               ENDIF 
    133142            ENDIF 
     
    135144            IF( nn_dyn3d_dta(jbdy) == 0 ) THEN  
    136145               ilen1(:) = nblen(:) 
    137                IF( dta%ll_u3d ) THEN  
     146               IF( dta_bdy(jbdy)%lneed_dyn3d ) THEN  
    138147                  igrd = 2  
    139148                  DO ib = 1, ilen1(igrd) 
     
    143152                        dta_bdy(jbdy)%u3d(ib,ik) =  ( uu(ii,ij,ik,Kmm) - uu_b(ii,ij,Kmm) ) * umask(ii,ij,ik)          
    144153                     END DO 
    145                   END DO  
    146                ENDIF 
    147                IF( dta%ll_v3d ) THEN  
     154                  END DO 
    148155                  igrd = 3  
    149156                  DO ib = 1, ilen1(igrd) 
     
    152159                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    153160                        dta_bdy(jbdy)%v3d(ib,ik) =  ( vv(ii,ij,ik,Kmm) - vv_b(ii,ij,Kmm) ) * vmask(ii,ij,ik)          
    154                         END DO 
    155                   END DO  
     161                     END DO 
     162                  END DO 
    156163               ENDIF 
    157164            ENDIF 
     
    159166            IF( nn_tra_dta(jbdy) == 0 ) THEN  
    160167               ilen1(:) = nblen(:) 
    161                IF( dta%ll_tem ) THEN 
     168               IF( dta_bdy(jbdy)%lneed_tra ) THEN 
    162169                  igrd = 1  
    163170                  DO ib = 1, ilen1(igrd) 
     
    165172                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
    166173                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    167                         dta_bdy(jbdy)%tem(ib,ik) = ts(ii,ij,ik,jp_tem,Kmm) * tmask(ii,ij,ik)          
     174                        dta_bdy(jbdy)%tem(ib,ik) = ts(ii,ij,ik,jp_bdytem,Kmm) * tmask(ii,ij,ik)          
     175                        dta_bdy(jbdy)%sal(ib,ik) = ts(ii,ij,ik,jp_bdysal,Kmm) * tmask(ii,ij,ik)          
    168176                     END DO 
    169                   END DO  
    170                ENDIF 
    171                IF( dta%ll_sal ) THEN 
    172                   igrd = 1  
    173                   DO ib = 1, ilen1(igrd) 
    174                      DO ik = 1, jpkm1 
    175                         ii = idx_bdy(jbdy)%nbi(ib,igrd) 
    176                         ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    177                         dta_bdy(jbdy)%sal(ib,ik) = ts(ii,ij,ik,jp_sal,Kmm) * tmask(ii,ij,ik)          
    178                      END DO 
    179                   END DO  
     177                  END DO 
    180178               ENDIF 
    181179            ENDIF 
     
    184182            IF( nn_ice_dta(jbdy) == 0 ) THEN    ! set ice to initial values 
    185183               ilen1(:) = nblen(:) 
    186                IF( dta%ll_a_i ) THEN 
     184               IF( dta_bdy(jbdy)%lneed_ice ) THEN 
    187185                  igrd = 1    
    188186                  DO jl = 1, jpl 
     
    190188                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
    191189                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    192                         dta_bdy(jbdy)%a_i (ib,jl) =  a_i(ii,ij,jl) * tmask(ii,ij,1)  
    193                      END DO 
    194                   END DO 
    195                ENDIF 
    196                IF( dta%ll_h_i ) THEN 
    197                   igrd = 1    
    198                   DO jl = 1, jpl 
    199                      DO ib = 1, ilen1(igrd) 
    200                         ii = idx_bdy(jbdy)%nbi(ib,igrd) 
    201                         ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    202                         dta_bdy(jbdy)%h_i (ib,jl) =  h_i(ii,ij,jl) * tmask(ii,ij,1)  
    203                      END DO 
    204                   END DO 
    205                ENDIF 
    206                IF( dta%ll_h_s ) THEN 
    207                   igrd = 1    
    208                   DO jl = 1, jpl 
    209                      DO ib = 1, ilen1(igrd) 
    210                         ii = idx_bdy(jbdy)%nbi(ib,igrd) 
    211                         ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    212                         dta_bdy(jbdy)%h_s (ib,jl) =  h_s(ii,ij,jl) * tmask(ii,ij,1)  
     190                        dta_bdy(jbdy)%a_i(ib,jl) =  a_i (ii,ij,jl) * tmask(ii,ij,1)  
     191                        dta_bdy(jbdy)%h_i(ib,jl) =  h_i (ii,ij,jl) * tmask(ii,ij,1)  
     192                        dta_bdy(jbdy)%h_s(ib,jl) =  h_s (ii,ij,jl) * tmask(ii,ij,1)  
     193                        dta_bdy(jbdy)%t_i(ib,jl) =  SUM(t_i (ii,ij,:,jl)) * r1_nlay_i * tmask(ii,ij,1)  
     194                        dta_bdy(jbdy)%t_s(ib,jl) =  SUM(t_s (ii,ij,:,jl)) * r1_nlay_s * tmask(ii,ij,1) 
     195                        dta_bdy(jbdy)%tsu(ib,jl) =  t_su(ii,ij,jl) * tmask(ii,ij,1)  
     196                        dta_bdy(jbdy)%s_i(ib,jl) =  s_i (ii,ij,jl) * tmask(ii,ij,1) 
     197                        ! melt ponds 
     198                        dta_bdy(jbdy)%aip(ib,jl) =  a_ip(ii,ij,jl) * tmask(ii,ij,1)  
     199                        dta_bdy(jbdy)%hip(ib,jl) =  h_ip(ii,ij,jl) * tmask(ii,ij,1)  
    213200                     END DO 
    214201                  END DO 
     
    222209      ! update external data from files 
    223210      !-------------------------------- 
    224       
    225       jstart = 1 
    226       DO jbdy = 1, nb_bdy    
    227          dta => dta_bdy(jbdy) 
    228          IF( nn_dta(jbdy) == 1 ) THEN ! skip this bit if no external data required 
    229             IF (cn_tra(jbdy) == 'runoff') then      ! runoff condition 
    230                jend = nb_bdy_fld(jbdy) 
    231                CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend),  & 
    232                     & map=nbmap_ptr(jstart:jend), kt_offset=time_offset ) 
    233                ! 
    234                igrd = 2                      ! zonal velocity 
    235                DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
    236                   ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
    237                   ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    238                   dta%u2d(ib) = dta%u2d(ib) / ( e2u(ii,ij) * hu_0(ii,ij) ) 
     211 
     212      DO jbdy = 1, nb_bdy 
     213 
     214         dta_alias => dta_bdy(jbdy) 
     215         bf_alias  => bf(:,jbdy) 
     216 
     217         ! read/update all bdy data 
     218         ! ------------------------ 
     219         CALL fld_read( kt, 1, bf_alias, kit = kit, kt_offset = kt_offset ) 
     220         ! apply some corrections in some specific cases... 
     221         ! -------------------------------------------------- 
     222         ! 
     223         ! if runoff condition: change river flow we read (in m3/s) into barotropic velocity (m/s) 
     224         IF( cn_tra(jbdy) == 'runoff' .AND. TRIM(bf_alias(jp_bdyu2d)%clrootname) /= 'NOT USED' ) THEN   ! runoff and we read u/v2d 
     225            ! 
     226            igrd = 2                      ! zonal flow (m3/s) to barotropic zonal velocity (m/s) 
     227            DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     228               ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     229               ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
     230               dta_alias%u2d(ib) = dta_alias%u2d(ib) / ( e2u(ii,ij) * hu_0(ii,ij) ) 
     231            END DO 
     232            igrd = 3                      ! meridional flow (m3/s) to barotropic meridional velocity (m/s) 
     233            DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     234               ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     235               ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
     236               dta_alias%v2d(ib) = dta_alias%v2d(ib) / ( e1v(ii,ij) * hv_0(ii,ij) ) 
     237            END DO 
     238         ENDIF 
     239 
     240         ! tidal harmonic forcing ONLY: initialise arrays 
     241         IF( nn_dyn2d_dta(jbdy) == 2 ) THEN   ! we did not read ssh, u/v2d  
     242            IF( dta_alias%lneed_ssh   ) dta_alias%ssh(:) = 0._wp 
     243            IF( dta_alias%lneed_dyn2d ) dta_alias%u2d(:) = 0._wp 
     244            IF( dta_alias%lneed_dyn2d ) dta_alias%v2d(:) = 0._wp 
     245         ENDIF 
     246 
     247         ! If full velocities in boundary data, then split it into barotropic and baroclinic component 
     248         IF( bf_alias(jp_bdyu3d)%ltotvel ) THEN     ! if we read 3D total velocity (can be true only if u3d was read) 
     249            ! 
     250            igrd = 2                       ! zonal velocity 
     251            dta_alias%u2d(:) = 0._wp       ! compute barotrope zonal velocity and put it in u2d 
     252            DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     253               ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     254               ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
     255               DO ik = 1, jpkm1 
     256                  dta_alias%u2d(ib) = dta_alias%u2d(ib) + e3u(ii,ij,ik,Kmm) * umask(ii,ij,ik) * dta_alias%u3d(ib,ik) 
    239257               END DO 
    240                ! 
    241                igrd = 3                      ! meridional velocity 
    242                DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
    243                   ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
    244                   ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    245                   dta%v2d(ib) = dta%v2d(ib) / ( e1v(ii,ij) * hv_0(ii,ij) ) 
     258               dta_alias%u2d(ib) =  dta_alias%u2d(ib) * r1_hu(ii,ij,Kmm) 
     259               DO ik = 1, jpkm1            ! compute barocline zonal velocity and put it in u3d 
     260                  dta_alias%u3d(ib,ik) = dta_alias%u3d(ib,ik) - dta_alias%u2d(ib) 
    246261               END DO 
    247             ELSE 
    248                IF( nn_dyn2d_dta(jbdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 
    249                   IF( dta%ll_ssh ) dta%ssh(:) = 0._wp 
    250                   IF( dta%ll_u2d ) dta%u2d(:) = 0._wp 
    251                   IF( dta%ll_v2d ) dta%v2d(:) = 0._wp 
    252                ENDIF 
    253                IF( dta%nread(1) .gt. 0 ) THEN ! update external data 
    254                   jend = jstart + dta%nread(1) - 1 
    255                   CALL fld_read( kt=kt, kn_fsbc=1, sd=bf(jstart:jend), & 
    256                        & map=nbmap_ptr(jstart:jend), kt_offset=time_offset, jpk_bdy=nb_jpk_bdy,   & 
    257                        & fvl=ln_full_vel_array(jbdy), Kmm=Kmm ) 
    258                ENDIF 
    259                ! If full velocities in boundary data then split into barotropic and baroclinic data 
    260                IF( ln_full_vel_array(jbdy) .and.                                             & 
    261                     & ( nn_dyn2d_dta(jbdy) == 1 .OR. nn_dyn2d_dta(jbdy) == 3 .OR. & 
    262                     &   nn_dyn3d_dta(jbdy) == 1 ) ) THEN 
    263                   igrd = 2                      ! zonal velocity 
    264                   dta%u2d(:) = 0._wp 
    265                   DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
    266                      ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
    267                      ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    268                      DO ik = 1, jpkm1 
    269                         dta%u2d(ib) = dta%u2d(ib) & 
    270                              &                       + e3u(ii,ij,ik,Kmm) * umask(ii,ij,ik) * dta%u3d(ib,ik) 
    271                      END DO 
    272                      dta%u2d(ib) =  dta%u2d(ib) * r1_hu(ii,ij,Kmm) 
    273                      DO ik = 1, jpkm1 
    274                         dta%u3d(ib,ik) = dta%u3d(ib,ik) - dta%u2d(ib) 
    275                      END DO 
    276                   END DO 
    277                   igrd = 3                      ! meridional velocity 
    278                   dta%v2d(:) = 0._wp 
    279                   DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
    280                      ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
    281                      ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    282                      DO ik = 1, jpkm1 
    283                         dta%v2d(ib) = dta%v2d(ib) & 
    284                              &                       + e3v(ii,ij,ik,Kmm) * vmask(ii,ij,ik) * dta%v3d(ib,ik) 
    285                      END DO 
    286                      dta%v2d(ib) =  dta%v2d(ib) * r1_hv(ii,ij,Kmm) 
    287                      DO ik = 1, jpkm1 
    288                         dta%v3d(ib,ik) = dta%v3d(ib,ik) - dta%v2d(ib) 
    289                      END DO 
    290                   END DO 
    291                ENDIF 
    292  
    293             ENDIF 
     262            END DO 
     263            igrd = 3                       ! meridional velocity 
     264            dta_alias%v2d(:) = 0._wp       ! compute barotrope meridional velocity and put it in v2d 
     265            DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
     266               ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     267               ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
     268               DO ik = 1, jpkm1 
     269                  dta_alias%v2d(ib) = dta_alias%v2d(ib) + e3v(ii,ij,ik,Kmm) * vmask(ii,ij,ik) * dta_alias%v3d(ib,ik) 
     270               END DO 
     271               dta_alias%v2d(ib) =  dta_alias%v2d(ib) * r1_hv(ii,ij,Kmm) 
     272               DO ik = 1, jpkm1            ! compute barocline meridional velocity and put it in v3d 
     273                  dta_alias%v3d(ib,ik) = dta_alias%v3d(ib,ik) - dta_alias%v2d(ib) 
     274               END DO 
     275            END DO 
     276         ENDIF   ! ltotvel 
     277 
     278         ! update tidal harmonic forcing 
     279         IF( PRESENT(kit) .AND. nn_dyn2d_dta(jbdy) .GE. 2 ) THEN 
     280            CALL bdytide_update( kt = kt, idx = idx_bdy(jbdy), dta = dta_alias, td = tides(jbdy),   &  
     281               &                 kit = kit, kt_offset = kt_offset ) 
     282         ENDIF 
     283 
     284         !  atm surface pressure : add inverted barometer effect to ssh if it was read 
     285         IF ( ln_apr_obc .AND. TRIM(bf_alias(jp_bdyssh)%clrootname) /= 'NOT USED' ) THEN 
     286            igrd = 1 
     287            DO ib = 1, idx_bdy(jbdy)%nblenrim(igrd)   ! ssh is used only on the rim 
     288               ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     289               ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
     290               dta_alias%ssh(ib) = dta_alias%ssh(ib) + ssh_ib(ii,ij) 
     291            END DO 
     292         ENDIF 
     293 
    294294#if defined key_si3 
     295         IF( dta_alias%lneed_ice ) THEN 
     296            ! fill temperature and salinity arrays 
     297            IF( TRIM(bf_alias(jp_bdyt_i)%clrootname) == 'NOT USED' )   bf_alias(jp_bdyt_i)%fnow(:,1,:) = rice_tem (jbdy) 
     298            IF( TRIM(bf_alias(jp_bdyt_s)%clrootname) == 'NOT USED' )   bf_alias(jp_bdyt_s)%fnow(:,1,:) = rice_tem (jbdy) 
     299            IF( TRIM(bf_alias(jp_bdytsu)%clrootname) == 'NOT USED' )   bf_alias(jp_bdytsu)%fnow(:,1,:) = rice_tem (jbdy) 
     300            IF( TRIM(bf_alias(jp_bdys_i)%clrootname) == 'NOT USED' )   bf_alias(jp_bdys_i)%fnow(:,1,:) = rice_sal (jbdy) 
     301            IF( TRIM(bf_alias(jp_bdyaip)%clrootname) == 'NOT USED' )   bf_alias(jp_bdyaip)%fnow(:,1,:) = rice_apnd(jbdy) * & ! rice_apnd is the pond fraction 
     302               &                                                                         bf_alias(jp_bdya_i)%fnow(:,1,:)     !   ( a_ip = rice_apnd * a_i ) 
     303            IF( TRIM(bf_alias(jp_bdyhip)%clrootname) == 'NOT USED' )   bf_alias(jp_bdyhip)%fnow(:,1,:) = rice_hpnd(jbdy) 
     304            ! if T_su is read and not T_i, set T_i = (T_su + T_freeze)/2 
     305            IF( TRIM(bf_alias(jp_bdytsu)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdyt_i)%clrootname) == 'NOT USED' ) & 
     306               &   bf_alias(jp_bdyt_i)%fnow(:,1,:) = 0.5_wp * ( bf_alias(jp_bdytsu)%fnow(:,1,:) + 271.15 ) 
     307            ! if T_su is read and not T_s, set T_s = T_su 
     308            IF( TRIM(bf_alias(jp_bdytsu)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdyt_s)%clrootname) == 'NOT USED' ) & 
     309               &   bf_alias(jp_bdyt_s)%fnow(:,1,:) = bf_alias(jp_bdytsu)%fnow(:,1,:) 
     310            ! if T_s is read and not T_su, set T_su = T_s 
     311            IF( TRIM(bf_alias(jp_bdyt_s)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdytsu)%clrootname) == 'NOT USED' ) & 
     312               &   bf_alias(jp_bdytsu)%fnow(:,1,:) = bf_alias(jp_bdyt_s)%fnow(:,1,:) 
     313            ! if T_s is read and not T_i, set T_i = (T_s + T_freeze)/2 
     314            IF( TRIM(bf_alias(jp_bdyt_s)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdyt_i)%clrootname) == 'NOT USED' ) & 
     315               &   bf_alias(jp_bdyt_i)%fnow(:,1,:) = 0.5_wp * ( bf_alias(jp_bdyt_s)%fnow(:,1,:) + 271.15 ) 
     316 
     317            ! make sure ponds = 0 if no ponds scheme 
     318            IF ( .NOT.ln_pnd ) THEN 
     319               bf_alias(jp_bdyaip)%fnow(:,1,:) = 0._wp 
     320               bf_alias(jp_bdyhip)%fnow(:,1,:) = 0._wp 
     321            ENDIF 
     322             
    295323            ! convert N-cat fields (input) into jpl-cat (output) 
    296             IF( cn_ice(jbdy) /= 'none' .AND. nn_ice_dta(jbdy) == 1 ) THEN 
    297                jfld_hti = jfld_htit(jbdy) 
    298                jfld_hts = jfld_htst(jbdy) 
    299                jfld_ai  = jfld_ait(jbdy) 
    300                IF    ( jpl /= 1 .AND. nice_cat == 1 ) THEN                       ! case input cat = 1 
    301                   CALL ice_var_itd ( bf(jfld_hti)%fnow(:,1,1), bf(jfld_hts)%fnow(:,1,1), bf(jfld_ai)%fnow(:,1,1), & 
    302                        &               dta_bdy(jbdy)%h_i     , dta_bdy(jbdy)%h_s     , dta_bdy(jbdy)%a_i    ) 
    303                ELSEIF( jpl /= 1 .AND. nice_cat /= 1 .AND. nice_cat /= jpl ) THEN ! case input cat /=1 and /=jpl 
    304                   CALL ice_var_itd2( bf(jfld_hti)%fnow(:,1,:), bf(jfld_hts)%fnow(:,1,:), bf(jfld_ai)%fnow(:,1,:), & 
    305                        &               dta_bdy(jbdy)%h_i     , dta_bdy(jbdy)%h_s     , dta_bdy(jbdy)%a_i    ) 
    306                ENDIF 
    307             ENDIF 
     324            ipl = SIZE(bf_alias(jp_bdya_i)%fnow, 3)             
     325            IF( ipl /= jpl ) THEN      ! ice: convert N-cat fields (input) into jpl-cat (output) 
     326               CALL ice_var_itd( bf_alias(jp_bdyh_i)%fnow(:,1,:), bf_alias(jp_bdyh_s)%fnow(:,1,:), bf_alias(jp_bdya_i)%fnow(:,1,:), & 
     327                  &              dta_alias%h_i                  , dta_alias%h_s                  , dta_alias%a_i                  , & 
     328                  &              bf_alias(jp_bdyt_i)%fnow(:,1,:), bf_alias(jp_bdyt_s)%fnow(:,1,:), & 
     329                  &              bf_alias(jp_bdytsu)%fnow(:,1,:), bf_alias(jp_bdys_i)%fnow(:,1,:), & 
     330                  &              bf_alias(jp_bdyaip)%fnow(:,1,:), bf_alias(jp_bdyhip)%fnow(:,1,:), & 
     331                  &              dta_alias%t_i                  , dta_alias%t_s                  , & 
     332                  &              dta_alias%tsu                  , dta_alias%s_i                  , & 
     333                  &              dta_alias%aip                  , dta_alias%hip ) 
     334            ENDIF 
     335         ENDIF 
    308336#endif 
    309             jstart = jstart + dta%nread(1) 
    310          ENDIF    ! nn_dta(jbdy) = 1 
    311337      END DO  ! jbdy 
    312  
    313       IF ( ln_apr_obc ) THEN 
    314          DO jbdy = 1, nb_bdy 
    315             IF (cn_tra(jbdy) /= 'runoff')THEN 
    316                igrd = 1                      ! meridional velocity 
    317                DO ib = 1, idx_bdy(jbdy)%nblenrim(igrd) 
    318                   ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
    319                   ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    320                   dta_bdy(jbdy)%ssh(ib) = dta_bdy(jbdy)%ssh(ib) + ssh_ib(ii,ij) 
    321                END DO 
    322             ENDIF 
    323          END DO 
    324       ENDIF 
    325338 
    326339      IF ( ln_tide ) THEN 
    327340         IF (ln_dynspg_ts) THEN      ! Fill temporary arrays with slow-varying bdy data                            
    328             DO jbdy = 1, nb_bdy    ! Tidal component added in ts loop 
    329                IF ( nn_dyn2d_dta(jbdy) .ge. 2 ) THEN 
     341            DO jbdy = 1, nb_bdy      ! Tidal component added in ts loop 
     342               IF ( nn_dyn2d_dta(jbdy) .GE. 2 ) THEN 
    330343                  nblen => idx_bdy(jbdy)%nblen 
    331344                  nblenrim => idx_bdy(jbdy)%nblenrim 
    332                   IF( cn_dyn2d(jbdy) == 'frs' ) THEN; ilen1(:)=nblen(:) ; ELSE ; ilen1(:)=nblenrim(:) ; ENDIF  
    333                   IF ( dta_bdy(jbdy)%ll_ssh ) dta_bdy_s(jbdy)%ssh(1:ilen1(1)) = dta_bdy(jbdy)%ssh(1:ilen1(1)) 
    334                   IF ( dta_bdy(jbdy)%ll_u2d ) dta_bdy_s(jbdy)%u2d(1:ilen1(2)) = dta_bdy(jbdy)%u2d(1:ilen1(2)) 
    335                   IF ( dta_bdy(jbdy)%ll_v2d ) dta_bdy_s(jbdy)%v2d(1:ilen1(3)) = dta_bdy(jbdy)%v2d(1:ilen1(3)) 
    336                ENDIF 
    337             END DO 
    338          ELSE ! Add tides if not split-explicit free surface else this is done in ts loop 
    339             ! 
    340             CALL bdy_dta_tides( kt=kt, time_offset=time_offset ) 
    341          ENDIF 
    342       ENDIF 
    343  
    344       ! 
    345       IF( ln_timing )   CALL timing_stop('bdy_dta') 
    346       ! 
    347    END SUBROUTINE bdy_dta 
     345                  IF( cn_dyn2d(jbdy) == 'frs' ) THEN ; ilen1(:)=nblen(:) ; ELSE ; ilen1(:)=nblenrim(:) ; ENDIF  
     346                     IF ( dta_bdy(jbdy)%lneed_ssh   ) dta_bdy_s(jbdy)%ssh(1:ilen1(1)) = dta_bdy(jbdy)%ssh(1:ilen1(1)) 
     347                     IF ( dta_bdy(jbdy)%lneed_dyn2d ) dta_bdy_s(jbdy)%u2d(1:ilen1(2)) = dta_bdy(jbdy)%u2d(1:ilen1(2)) 
     348                     IF ( dta_bdy(jbdy)%lneed_dyn2d ) dta_bdy_s(jbdy)%v2d(1:ilen1(3)) = dta_bdy(jbdy)%v2d(1:ilen1(3)) 
     349                  ENDIF 
     350               END DO 
     351            ELSE ! Add tides if not split-explicit free surface else this is done in ts loop 
     352               ! 
     353               CALL bdy_dta_tides( kt=kt, kt_offset=kt_offset ) 
     354            ENDIF 
     355         ENDIF 
     356         ! 
     357         IF( ln_timing )   CALL timing_stop('bdy_dta') 
     358         ! 
     359      END SUBROUTINE bdy_dta 
    348360 
    349361 
     
    358370      !!                 
    359371      !!---------------------------------------------------------------------- 
    360       INTEGER ::   jbdy, jfld, jstart, jend, ierror, ios     ! Local integers 
     372      INTEGER ::   jbdy, jfld    ! Local integers 
     373      INTEGER ::   ierror, ios     !  
    361374      ! 
     375      CHARACTER(len=3)                       ::   cl3           !  
    362376      CHARACTER(len=100)                     ::   cn_dir        ! Root directory for location of data files 
    363       CHARACTER(len=100), DIMENSION(nb_bdy)  ::   cn_dir_array  ! Root directory for location of data files 
    364       CHARACTER(len = 256)::   clname                           ! temporary file name 
    365377      LOGICAL                                ::   ln_full_vel   ! =T => full velocities in 3D boundary data 
    366378      !                                                         ! =F => baroclinic velocities in 3D boundary data 
    367       INTEGER                                ::   ilen_global   ! Max length required for global bdy dta arrays 
    368       INTEGER, ALLOCATABLE, DIMENSION(:)     ::   ilen1, ilen3  ! size of 1st and 3rd dimensions of local arrays 
    369       INTEGER, ALLOCATABLE, DIMENSION(:)     ::   ibdy           ! bdy set for a particular jfld 
    370       INTEGER, ALLOCATABLE, DIMENSION(:)     ::   igrid         ! index for grid type (1,2,3 = T,U,V) 
    371       INTEGER, POINTER, DIMENSION(:)         ::   nblen, nblenrim  ! short cuts 
    372       TYPE(OBC_DATA), POINTER                ::   dta           ! short cut 
    373 #if defined key_si3 
    374       INTEGER               ::   kndims   ! number of dimensions in an array (i.e. 3 = wo ice cat; 4 = w ice cat) 
    375       INTEGER, DIMENSION(4) ::   kdimsz   ! size   of dimensions 
    376       INTEGER               ::   inum,id1 ! local integer 
    377 #endif 
    378       TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) ::   blf_i         !  array of namelist information structures 
    379       TYPE(FLD_N) ::   bn_tem, bn_sal, bn_u3d, bn_v3d   !  
    380       TYPE(FLD_N) ::   bn_ssh, bn_u2d, bn_v2d           ! informations about the fields to be read 
    381 #if defined key_si3 
    382       TYPE(FLD_N) ::   bn_a_i, bn_h_i, bn_h_s       
    383 #endif 
     379      LOGICAL                                ::   ln_zinterp    ! =T => requires a vertical interpolation of the bdydta 
     380      REAL(wp)                               ::   rn_ice_tem, rn_ice_sal, rn_ice_age, rn_ice_apnd, rn_ice_hpnd  
     381      INTEGER                                ::   ipk,ipl       ! 
     382      INTEGER                                ::   idvar         ! variable ID 
     383      INTEGER                                ::   indims        ! number of dimensions of the variable 
     384      INTEGER                                ::   iszdim        ! number of dimensions of the variable 
     385      INTEGER, DIMENSION(4)                  ::   i4dimsz       ! size of variable dimensions  
     386      INTEGER                                ::   igrd          ! index for grid type (1,2,3 = T,U,V) 
     387      LOGICAL                                ::   lluld         ! is the variable using the unlimited dimension 
     388      LOGICAL                                ::   llneed        ! 
     389      LOGICAL                                ::   llread        ! 
     390      TYPE(FLD_N), DIMENSION(1), TARGET  ::   bn_tem, bn_sal, bn_u3d, bn_v3d   ! must be an array to be used with fld_fill 
     391      TYPE(FLD_N), DIMENSION(1), TARGET  ::   bn_ssh, bn_u2d, bn_v2d           ! informations about the fields to be read 
     392      TYPE(FLD_N), DIMENSION(1), TARGET  ::   bn_a_i, bn_h_i, bn_h_s, bn_t_i, bn_t_s, bn_tsu, bn_s_i, bn_aip, bn_hip        
     393      TYPE(FLD_N), DIMENSION(:), POINTER ::   bn_alias                        ! must be an array to be used with fld_fill 
     394      TYPE(FLD  ), DIMENSION(:), POINTER ::   bf_alias 
     395      ! 
    384396      NAMELIST/nambdy_dta/ cn_dir, bn_tem, bn_sal, bn_u3d, bn_v3d, bn_ssh, bn_u2d, bn_v2d  
    385 #if defined key_si3 
    386       NAMELIST/nambdy_dta/ bn_a_i, bn_h_i, bn_h_s 
    387 #endif 
    388       NAMELIST/nambdy_dta/ ln_full_vel, nb_jpk_bdy 
     397      NAMELIST/nambdy_dta/ bn_a_i, bn_h_i, bn_h_s, bn_t_i, bn_t_s, bn_tsu, bn_s_i, bn_aip, bn_hip 
     398      NAMELIST/nambdy_dta/ rn_ice_tem, rn_ice_sal, rn_ice_age, rn_ice_apnd, rn_ice_hpnd 
     399      NAMELIST/nambdy_dta/ ln_full_vel, ln_zinterp 
    389400      !!--------------------------------------------------------------------------- 
    390401      ! 
     
    394405      IF(lwp) WRITE(numout,*) '' 
    395406 
    396       ! Set nn_dta 
    397       DO jbdy = 1, nb_bdy 
    398          nn_dta(jbdy) = MAX(   nn_dyn2d_dta  (jbdy)    & 
    399             &                , nn_dyn3d_dta  (jbdy)    & 
    400             &                , nn_tra_dta    (jbdy)    & 
    401 #if defined key_si3 
    402             &                , nn_ice_dta    (jbdy)    & 
    403 #endif 
    404                               ) 
    405          IF(nn_dta(jbdy) > 1)   nn_dta(jbdy) = 1 
    406       END DO 
    407  
    408       ! Work out upper bound of how many fields there are to read in and allocate arrays 
    409       ! --------------------------------------------------------------------------- 
    410       ALLOCATE( nb_bdy_fld(nb_bdy) ) 
    411       nb_bdy_fld(:) = 0 
    412       DO jbdy = 1, nb_bdy          
    413          IF( cn_dyn2d(jbdy) /= 'none' .AND. ( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) ) THEN 
    414             nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 3 
    415          ENDIF 
    416          IF( cn_dyn3d(jbdy) /= 'none' .AND. nn_dyn3d_dta(jbdy) == 1 ) THEN 
    417             nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 2 
    418          ENDIF 
    419          IF( cn_tra(jbdy) /= 'none' .AND. nn_tra_dta(jbdy) == 1  ) THEN 
    420             nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 2 
    421          ENDIF 
    422 #if defined key_si3 
    423          IF( cn_ice(jbdy) /= 'none' .AND. nn_ice_dta(jbdy) == 1  ) THEN 
    424             nb_bdy_fld(jbdy) = nb_bdy_fld(jbdy) + 3 
    425          ENDIF 
    426 #endif                
    427          IF(lwp) WRITE(numout,*) 'Maximum number of files to open =', nb_bdy_fld(jbdy) 
    428       END DO             
    429  
    430       nb_bdy_fld_sum = SUM( nb_bdy_fld ) 
    431  
    432       ALLOCATE( bf(nb_bdy_fld_sum), STAT=ierror ) 
     407      ALLOCATE( bf(jpbdyfld,nb_bdy), STAT=ierror ) 
    433408      IF( ierror > 0 ) THEN    
    434409         CALL ctl_stop( 'bdy_dta: unable to allocate bf structure' )   ;   RETURN   
    435410      ENDIF 
    436       ALLOCATE( blf_i(nb_bdy_fld_sum), STAT=ierror ) 
    437       IF( ierror > 0 ) THEN    
    438          CALL ctl_stop( 'bdy_dta: unable to allocate blf_i structure' )   ;   RETURN   
    439       ENDIF 
    440       ALLOCATE( nbmap_ptr(nb_bdy_fld_sum), STAT=ierror ) 
    441       IF( ierror > 0 ) THEN    
    442          CALL ctl_stop( 'bdy_dta: unable to allocate nbmap_ptr structure' )   ;   RETURN   
    443       ENDIF 
    444       ALLOCATE( ilen1(nb_bdy_fld_sum), ilen3(nb_bdy_fld_sum) )  
    445       ALLOCATE( ibdy(nb_bdy_fld_sum) )  
    446       ALLOCATE( igrid(nb_bdy_fld_sum) )  
    447  
     411      bf(:,:)%clrootname = 'NOT USED'   ! default definition used as a flag in fld_read to do nothing. 
     412      bf(:,:)%lzint      = .FALSE.      ! default definition 
     413      bf(:,:)%ltotvel    = .FALSE.      ! default definition 
     414  
    448415      ! Read namelists 
    449416      ! -------------- 
    450       REWIND(numnam_ref) 
    451417      REWIND(numnam_cfg) 
    452       jfld = 0  
    453       DO jbdy = 1, nb_bdy          
    454          IF( nn_dta(jbdy) == 1 ) THEN 
    455             READ  ( numnam_ref, nambdy_dta, IOSTAT = ios, ERR = 901) 
    456 901         IF( ios /= 0 )   CALL ctl_nam ( ios , 'nambdy_dta in reference namelist', lwp ) 
     418      DO jbdy = 1, nb_bdy 
     419 
     420         WRITE(ctmp1, '(a,i2)') 'BDY number ', jbdy 
     421         WRITE(ctmp2, '(a,i2)') 'block nambdy_dta number ', jbdy 
     422 
     423         ! There is only one nambdy_dta block in namelist_ref -> use it for each bdy so we do a rewind  
     424         REWIND(numnam_ref) 
     425         READ  ( numnam_ref, nambdy_dta, IOSTAT = ios, ERR = 901) 
     426901      IF( ios /= 0 )   CALL ctl_nam ( ios , 'nambdy_dta in reference namelist' ) 
     427 
     428         !   by-pass nambdy_dta reading if no input data used in this bdy    
     429         IF(       ( dta_bdy(jbdy)%lneed_dyn2d .AND. MOD(nn_dyn2d_dta(jbdy),2) == 1 )   & 
     430            & .OR. ( dta_bdy(jbdy)%lneed_dyn3d .AND.     nn_dyn3d_dta(jbdy)    == 1 )   & 
     431            & .OR. ( dta_bdy(jbdy)%lneed_tra   .AND.       nn_tra_dta(jbdy)    == 1 )   & 
     432            & .OR. ( dta_bdy(jbdy)%lneed_ice   .AND.       nn_ice_dta(jbdy)    == 1 )   )   THEN 
     433            ! WARNING: we don't do a rewind here, each bdy reads its own nambdy_dta block one after another 
    457434            READ  ( numnam_cfg, nambdy_dta, IOSTAT = ios, ERR = 902 ) 
    458 902         IF( ios >  0 )   CALL ctl_nam ( ios , 'nambdy_dta in configuration namelist', lwp ) 
    459             IF(lwm) WRITE( numond, nambdy_dta ) 
    460  
    461             cn_dir_array(jbdy) = cn_dir 
    462             ln_full_vel_array(jbdy) = ln_full_vel 
    463  
    464             nblen => idx_bdy(jbdy)%nblen 
    465             nblenrim => idx_bdy(jbdy)%nblenrim 
    466             dta => dta_bdy(jbdy) 
    467             dta%nread(2) = 0 
    468  
    469             ! Only read in necessary fields for this set. 
    470             ! Important that barotropic variables come first. 
    471             IF( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) THEN  
    472  
    473                IF( dta%ll_ssh ) THEN  
    474                   if(lwp) write(numout,*) '++++++ reading in ssh field' 
    475                   jfld = jfld + 1 
    476                   blf_i(jfld) = bn_ssh 
    477                   ibdy(jfld) = jbdy 
    478                   igrid(jfld) = 1 
    479                   ilen1(jfld) = nblen(igrid(jfld)) 
    480                   ilen3(jfld) = 1 
    481                   dta%nread(2) = dta%nread(2) + 1 
    482                ENDIF 
    483  
    484                IF( dta%ll_u2d .and. .not. ln_full_vel_array(jbdy) ) THEN 
    485                   if(lwp) write(numout,*) '++++++ reading in u2d field' 
    486                   jfld = jfld + 1 
    487                   blf_i(jfld) = bn_u2d 
    488                   ibdy(jfld) = jbdy 
    489                   igrid(jfld) = 2 
    490                   ilen1(jfld) = nblen(igrid(jfld)) 
    491                   ilen3(jfld) = 1 
    492                   dta%nread(2) = dta%nread(2) + 1 
    493                ENDIF 
    494  
    495                IF( dta%ll_v2d .and. .not. ln_full_vel_array(jbdy) ) THEN 
    496                   if(lwp) write(numout,*) '++++++ reading in v2d field' 
    497                   jfld = jfld + 1 
    498                   blf_i(jfld) = bn_v2d 
    499                   ibdy(jfld) = jbdy 
    500                   igrid(jfld) = 3 
    501                   ilen1(jfld) = nblen(igrid(jfld)) 
    502                   ilen3(jfld) = 1 
    503                   dta%nread(2) = dta%nread(2) + 1 
    504                ENDIF 
    505  
    506             ENDIF 
    507  
    508             ! read 3D velocities if baroclinic velocities require OR if 
    509             ! barotropic velocities required and ln_full_vel set to .true. 
    510             IF( nn_dyn3d_dta(jbdy) == 1 .OR. & 
    511            &  ( ln_full_vel_array(jbdy) .AND. ( nn_dyn2d_dta(jbdy) == 1 .OR. nn_dyn2d_dta(jbdy) == 3 ) ) ) THEN 
    512  
    513                IF( dta%ll_u3d .OR. ( ln_full_vel_array(jbdy) .and. dta%ll_u2d ) ) THEN 
    514                   if(lwp) write(numout,*) '++++++ reading in u3d field' 
    515                   jfld = jfld + 1 
    516                   blf_i(jfld) = bn_u3d 
    517                   ibdy(jfld) = jbdy 
    518                   igrid(jfld) = 2 
    519                   ilen1(jfld) = nblen(igrid(jfld)) 
    520                   ilen3(jfld) = jpk 
    521                   IF( ln_full_vel_array(jbdy) .and. dta%ll_u2d ) dta%nread(2) = dta%nread(2) + 1 
    522                ENDIF 
    523  
    524                IF( dta%ll_v3d .OR. ( ln_full_vel_array(jbdy) .and. dta%ll_v2d ) ) THEN 
    525                   if(lwp) write(numout,*) '++++++ reading in v3d field' 
    526                   jfld = jfld + 1 
    527                   blf_i(jfld) = bn_v3d 
    528                   ibdy(jfld) = jbdy 
    529                   igrid(jfld) = 3 
    530                   ilen1(jfld) = nblen(igrid(jfld)) 
    531                   ilen3(jfld) = jpk 
    532                   IF( ln_full_vel_array(jbdy) .and. dta%ll_v2d ) dta%nread(2) = dta%nread(2) + 1 
    533                ENDIF 
    534  
    535             ENDIF 
    536  
    537             ! temperature and salinity 
    538             IF( nn_tra_dta(jbdy) == 1 ) THEN 
    539  
    540                IF( dta%ll_tem ) THEN 
    541                   if(lwp) write(numout,*) '++++++ reading in tem field' 
    542                   jfld = jfld + 1 
    543                   blf_i(jfld) = bn_tem 
    544                   ibdy(jfld) = jbdy 
    545                   igrid(jfld) = 1 
    546                   ilen1(jfld) = nblen(igrid(jfld)) 
    547                   ilen3(jfld) = jpk 
    548                ENDIF 
    549  
    550                IF( dta%ll_sal ) THEN 
    551                   if(lwp) write(numout,*) '++++++ reading in sal field' 
    552                   jfld = jfld + 1 
    553                   blf_i(jfld) = bn_sal 
    554                   ibdy(jfld) = jbdy 
    555                   igrid(jfld) = 1 
    556                   ilen1(jfld) = nblen(igrid(jfld)) 
    557                   ilen3(jfld) = jpk 
    558                ENDIF 
    559  
    560             ENDIF 
     435902         IF( ios >  0 )   CALL ctl_nam ( ios , 'nambdy_dta in configuration namelist' ) 
     436            IF(lwm) WRITE( numond, nambdy_dta )            
     437         ENDIF 
     438 
     439         ! get the number of ice categories in bdy data file (use a_i information to do this) 
     440         ipl = jpl   ! default definition 
     441         IF( dta_bdy(jbdy)%lneed_ice ) THEN    ! if we need ice bdy data 
     442            IF( nn_ice_dta(jbdy) == 1 ) THEN   ! if we get ice bdy data from netcdf file 
     443               CALL fld_fill(  bf(jp_bdya_i,jbdy:jbdy), bn_a_i, cn_dir, 'bdy_dta', 'a_i'//' '//ctmp1, ctmp2 )   ! use namelist info 
     444               CALL fld_clopn( bf(jp_bdya_i,jbdy), nyear, nmonth, nday )   ! not a problem when we call it again after 
     445               idvar = iom_varid( bf(jp_bdya_i,jbdy)%num, bf(jp_bdya_i,jbdy)%clvar, kndims=indims, kdimsz=i4dimsz, lduld=lluld ) 
     446               IF( indims == 4 .OR. ( indims == 3 .AND. .NOT. lluld ) ) THEN   ;   ipl = i4dimsz(3)   ! xylt or xyl 
     447               ELSE                                                            ;   ipl = 1            ! xy or xyt 
     448               ENDIF 
     449            ENDIF 
     450         ENDIF 
    561451 
    562452#if defined key_si3 
    563             ! sea ice 
    564             IF( nn_ice_dta(jbdy) == 1 ) THEN 
    565                ! Test for types of ice input (1cat or Xcat)  
    566                ! Build file name to find dimensions  
    567                clname=TRIM( cn_dir )//TRIM(bn_a_i%clname) 
    568                IF( .NOT. bn_a_i%ln_clim ) THEN    
    569                                                   WRITE(clname, '(a,"_y",i4.4)' ) TRIM( clname ), nyear    ! add year 
    570                   IF( bn_a_i%cltype /= 'yearly' ) WRITE(clname, '(a,"m" ,i2.2)' ) TRIM( clname ), nmonth   ! add month 
    571                ELSE 
    572                   IF( bn_a_i%cltype /= 'yearly' ) WRITE(clname, '(a,"_m",i2.2)' ) TRIM( clname ), nmonth   ! add month 
    573                ENDIF 
    574                IF( bn_a_i%cltype == 'daily' .OR. bn_a_i%cltype(1:4) == 'week' ) & 
    575                &                                  WRITE(clname, '(a,"d" ,i2.2)' ) TRIM( clname ), nday     ! add day 
     453         IF( .NOT.ln_pnd ) THEN 
     454            rn_ice_apnd = 0. ; rn_ice_hpnd = 0. 
     455            CALL ctl_warn( 'rn_ice_apnd & rn_ice_hpnd = 0 when no ponds' ) 
     456         ENDIF 
     457#endif 
     458 
     459         ! temp, salt, age and ponds of incoming ice 
     460         rice_tem (jbdy) = rn_ice_tem 
     461         rice_sal (jbdy) = rn_ice_sal 
     462         rice_age (jbdy) = rn_ice_age 
     463         rice_apnd(jbdy) = rn_ice_apnd 
     464         rice_hpnd(jbdy) = rn_ice_hpnd 
     465          
     466          
     467         DO jfld = 1, jpbdyfld 
     468 
     469            ! ===================== 
     470            !          ssh  
     471            ! ===================== 
     472            IF( jfld == jp_bdyssh ) THEN 
     473               cl3 = 'ssh' 
     474               igrd = 1                                                    ! T point 
     475               ipk = 1                                                     ! surface data 
     476               llneed = dta_bdy(jbdy)%lneed_ssh                            ! dta_bdy(jbdy)%ssh will be needed 
     477               llread = MOD(nn_dyn2d_dta(jbdy),2) == 1                     ! get data from NetCDF file 
     478               bf_alias => bf(jp_bdyssh,jbdy:jbdy)                         ! alias for ssh structure of bdy number jbdy 
     479               bn_alias => bn_ssh                                          ! alias for ssh structure of nambdy_dta  
     480               iszdim = idx_bdy(jbdy)%nblenrim(igrd)                       ! length of this bdy on this MPI processus : used only on the rim 
     481            ENDIF 
     482            ! ===================== 
     483            !         dyn2d 
     484            ! ===================== 
     485            IF( jfld == jp_bdyu2d ) THEN 
     486               cl3 = 'u2d' 
     487               igrd = 2                                                    ! U point 
     488               ipk = 1                                                     ! surface data 
     489               llneed = dta_bdy(jbdy)%lneed_dyn2d                          ! dta_bdy(jbdy)%ssh will be needed 
     490               llread = .NOT. ln_full_vel .AND. MOD(nn_dyn2d_dta(jbdy),2) == 1   ! don't get u2d from u3d and read NetCDF file 
     491               bf_alias => bf(jp_bdyu2d,jbdy:jbdy)                         ! alias for u2d structure of bdy number jbdy 
     492               bn_alias => bn_u2d                                          ! alias for u2d structure of nambdy_dta 
     493               IF( ln_full_vel ) THEN  ;   iszdim = idx_bdy(jbdy)%nblen(igrd)      ! will be computed from u3d -> need on the full bdy 
     494               ELSE                    ;   iszdim = idx_bdy(jbdy)%nblenrim(igrd)   ! used only on the rim 
     495               ENDIF 
     496            ENDIF 
     497            IF( jfld == jp_bdyv2d ) THEN 
     498               cl3 = 'v2d' 
     499               igrd = 3                                                    ! V point 
     500               ipk = 1                                                     ! surface data 
     501               llneed = dta_bdy(jbdy)%lneed_dyn2d                          ! dta_bdy(jbdy)%ssh will be needed 
     502               llread = .NOT. ln_full_vel .AND. MOD(nn_dyn2d_dta(jbdy),2) == 1   ! don't get v2d from v3d and read NetCDF file 
     503               bf_alias => bf(jp_bdyv2d,jbdy:jbdy)                         ! alias for v2d structure of bdy number jbdy 
     504               bn_alias => bn_v2d                                          ! alias for v2d structure of nambdy_dta  
     505               IF( ln_full_vel ) THEN  ;   iszdim = idx_bdy(jbdy)%nblen(igrd)      ! will be computed from v3d -> need on the full bdy 
     506               ELSE                    ;   iszdim = idx_bdy(jbdy)%nblenrim(igrd)   ! used only on the rim 
     507               ENDIF 
     508            ENDIF 
     509            ! ===================== 
     510            !         dyn3d 
     511            ! ===================== 
     512            IF( jfld == jp_bdyu3d ) THEN 
     513               cl3 = 'u3d' 
     514               igrd = 2                                                    ! U point 
     515               ipk = jpk                                                   ! 3d data 
     516               llneed = dta_bdy(jbdy)%lneed_dyn3d .OR.               &     ! dta_bdy(jbdy)%u3d will be needed 
     517                  &   ( dta_bdy(jbdy)%lneed_dyn2d .AND. ln_full_vel )      !   u3d needed to compute u2d 
     518               llread = nn_dyn3d_dta(jbdy) == 1                            ! get data from NetCDF file 
     519               bf_alias => bf(jp_bdyu3d,jbdy:jbdy)                         ! alias for u3d structure of bdy number jbdy 
     520               bn_alias => bn_u3d                                          ! alias for u3d structure of nambdy_dta  
     521               iszdim = idx_bdy(jbdy)%nblen(igrd)                          ! length of this bdy on this MPI processus 
     522           ENDIF 
     523            IF( jfld == jp_bdyv3d ) THEN 
     524               cl3 = 'v3d' 
     525               igrd = 3                                                    ! V point 
     526               ipk = jpk                                                   ! 3d data 
     527               llneed = dta_bdy(jbdy)%lneed_dyn3d .OR.               &     ! dta_bdy(jbdy)%v3d will be needed 
     528                  &   ( dta_bdy(jbdy)%lneed_dyn2d .AND. ln_full_vel )      !   v3d needed to compute v2d 
     529               llread = nn_dyn3d_dta(jbdy) == 1                            ! get data from NetCDF file 
     530               bf_alias => bf(jp_bdyv3d,jbdy:jbdy)                         ! alias for v3d structure of bdy number jbdy 
     531               bn_alias => bn_v3d                                          ! alias for v3d structure of nambdy_dta  
     532               iszdim = idx_bdy(jbdy)%nblen(igrd)                          ! length of this bdy on this MPI processus 
     533           ENDIF 
     534 
     535            ! ===================== 
     536            !          tra 
     537            ! ===================== 
     538            IF( jfld == jp_bdytem ) THEN 
     539               cl3 = 'tem' 
     540               igrd = 1                                                    ! T point 
     541               ipk = jpk                                                   ! 3d data 
     542               llneed = dta_bdy(jbdy)%lneed_tra                            ! dta_bdy(jbdy)%tem will be needed 
     543               llread = nn_tra_dta(jbdy) == 1                              ! get data from NetCDF file 
     544               bf_alias => bf(jp_bdytem,jbdy:jbdy)                         ! alias for ssh structure of bdy number jbdy 
     545               bn_alias => bn_tem                                          ! alias for ssh structure of nambdy_dta  
     546               iszdim = idx_bdy(jbdy)%nblen(igrd)                          ! length of this bdy on this MPI processus 
     547            ENDIF 
     548            IF( jfld == jp_bdysal ) THEN 
     549               cl3 = 'sal' 
     550               igrd = 1                                                    ! T point 
     551               ipk = jpk                                                   ! 3d data 
     552               llneed = dta_bdy(jbdy)%lneed_tra                            ! dta_bdy(jbdy)%sal will be needed 
     553               llread = nn_tra_dta(jbdy) == 1                              ! get data from NetCDF file 
     554               bf_alias => bf(jp_bdysal,jbdy:jbdy)                         ! alias for ssh structure of bdy number jbdy 
     555               bn_alias => bn_sal                                          ! alias for ssh structure of nambdy_dta  
     556               iszdim = idx_bdy(jbdy)%nblen(igrd)                          ! length of this bdy on this MPI processus 
     557            ENDIF 
     558 
     559            ! ===================== 
     560            !          ice 
     561            ! ===================== 
     562            IF(  jfld == jp_bdya_i .OR. jfld == jp_bdyh_i .OR. jfld == jp_bdyh_s .OR. & 
     563               & jfld == jp_bdyt_i .OR. jfld == jp_bdyt_s .OR. jfld == jp_bdytsu .OR. & 
     564               & jfld == jp_bdys_i .OR. jfld == jp_bdyaip .OR. jfld == jp_bdyhip      ) THEN 
     565               igrd = 1                                                    ! T point 
     566               ipk = ipl                                                   ! jpl-cat data 
     567               llneed = dta_bdy(jbdy)%lneed_ice                            ! ice will be needed 
     568               llread = nn_ice_dta(jbdy) == 1                              ! get data from NetCDF file 
     569               iszdim = idx_bdy(jbdy)%nblen(igrd)                          ! length of this bdy on this MPI processus 
     570            ENDIF 
     571            IF( jfld == jp_bdya_i ) THEN 
     572               cl3 = 'a_i' 
     573               bf_alias => bf(jp_bdya_i,jbdy:jbdy)                         ! alias for a_i structure of bdy number jbdy 
     574               bn_alias => bn_a_i                                          ! alias for a_i structure of nambdy_dta  
     575            ENDIF 
     576            IF( jfld == jp_bdyh_i ) THEN 
     577               cl3 = 'h_i' 
     578               bf_alias => bf(jp_bdyh_i,jbdy:jbdy)                         ! alias for h_i structure of bdy number jbdy 
     579               bn_alias => bn_h_i                                          ! alias for h_i structure of nambdy_dta  
     580            ENDIF 
     581            IF( jfld == jp_bdyh_s ) THEN 
     582               cl3 = 'h_s' 
     583               bf_alias => bf(jp_bdyh_s,jbdy:jbdy)                         ! alias for h_s structure of bdy number jbdy 
     584               bn_alias => bn_h_s                                          ! alias for h_s structure of nambdy_dta  
     585            ENDIF 
     586            IF( jfld == jp_bdyt_i ) THEN 
     587               cl3 = 't_i' 
     588               bf_alias => bf(jp_bdyt_i,jbdy:jbdy)                         ! alias for t_i structure of bdy number jbdy 
     589               bn_alias => bn_t_i                                          ! alias for t_i structure of nambdy_dta  
     590            ENDIF 
     591            IF( jfld == jp_bdyt_s ) THEN 
     592               cl3 = 't_s' 
     593               bf_alias => bf(jp_bdyt_s,jbdy:jbdy)                         ! alias for t_s structure of bdy number jbdy 
     594               bn_alias => bn_t_s                                          ! alias for t_s structure of nambdy_dta  
     595            ENDIF 
     596            IF( jfld == jp_bdytsu ) THEN 
     597               cl3 = 'tsu' 
     598               bf_alias => bf(jp_bdytsu,jbdy:jbdy)                         ! alias for tsu structure of bdy number jbdy 
     599               bn_alias => bn_tsu                                          ! alias for tsu structure of nambdy_dta  
     600            ENDIF 
     601            IF( jfld == jp_bdys_i ) THEN 
     602               cl3 = 's_i' 
     603               bf_alias => bf(jp_bdys_i,jbdy:jbdy)                         ! alias for s_i structure of bdy number jbdy 
     604               bn_alias => bn_s_i                                          ! alias for s_i structure of nambdy_dta  
     605            ENDIF 
     606            IF( jfld == jp_bdyaip ) THEN 
     607               cl3 = 'aip' 
     608               bf_alias => bf(jp_bdyaip,jbdy:jbdy)                         ! alias for aip structure of bdy number jbdy 
     609               bn_alias => bn_aip                                          ! alias for aip structure of nambdy_dta  
     610            ENDIF 
     611            IF( jfld == jp_bdyhip ) THEN 
     612               cl3 = 'hip' 
     613               bf_alias => bf(jp_bdyhip,jbdy:jbdy)                         ! alias for hip structure of bdy number jbdy 
     614               bn_alias => bn_hip                                          ! alias for hip structure of nambdy_dta  
     615            ENDIF 
     616 
     617            IF( llneed ) THEN                                              ! dta_bdy(jbdy)%xxx will be needed 
     618               !                                                           !   -> must be associated with an allocated target 
     619               ALLOCATE( bf_alias(1)%fnow( iszdim, 1, ipk ) )              ! allocate the target 
    576620               ! 
    577                CALL iom_open  ( clname, inum ) 
    578                id1 = iom_varid( inum, bn_a_i%clvar, kdimsz=kdimsz, kndims=kndims, ldstop = .FALSE. ) 
    579                CALL iom_close ( inum ) 
    580  
    581                 IF ( kndims == 4 ) THEN 
    582                  nice_cat = kdimsz(4)   ! Xcat input 
    583                ELSE 
    584                  nice_cat = 1           ! 1cat input       
    585                ENDIF 
    586                ! End test 
    587  
    588                IF( dta%ll_a_i ) THEN 
    589                   jfld = jfld + 1 
    590                   blf_i(jfld) = bn_a_i 
    591                   ibdy(jfld)  = jbdy 
    592                   igrid(jfld) = 1 
    593                   ilen1(jfld) = nblen(igrid(jfld)) 
    594                   ilen3(jfld) = nice_cat 
    595                ENDIF 
    596  
    597                IF( dta%ll_h_i ) THEN 
    598                   jfld = jfld + 1 
    599                   blf_i(jfld) = bn_h_i 
    600                   ibdy(jfld)  = jbdy 
    601                   igrid(jfld) = 1 
    602                   ilen1(jfld) = nblen(igrid(jfld)) 
    603                   ilen3(jfld) = nice_cat 
    604                ENDIF 
    605  
    606                IF( dta%ll_h_s ) THEN 
    607                   jfld = jfld + 1 
    608                   blf_i(jfld) = bn_h_s 
    609                   ibdy(jfld)  = jbdy 
    610                   igrid(jfld) = 1 
    611                   ilen1(jfld) = nblen(igrid(jfld)) 
    612                   ilen3(jfld) = nice_cat 
    613                ENDIF 
    614  
    615             ENDIF 
    616 #endif 
    617             ! Recalculate field counts 
    618             !------------------------- 
    619             IF( jbdy == 1 ) THEN  
    620                nb_bdy_fld_sum = 0 
    621                nb_bdy_fld(jbdy) = jfld 
    622                nb_bdy_fld_sum     = jfld               
    623             ELSE 
    624                nb_bdy_fld(jbdy) = jfld - nb_bdy_fld_sum 
    625                nb_bdy_fld_sum = nb_bdy_fld_sum + nb_bdy_fld(jbdy) 
    626             ENDIF 
    627  
    628             dta%nread(1) = nb_bdy_fld(jbdy) 
    629  
    630          ENDIF ! nn_dta == 1 
    631       ENDDO ! jbdy 
    632  
    633       DO jfld = 1, nb_bdy_fld_sum 
    634          ALLOCATE( bf(jfld)%fnow(ilen1(jfld),1,ilen3(jfld)) ) 
    635          IF( blf_i(jfld)%ln_tint ) ALLOCATE( bf(jfld)%fdta(ilen1(jfld),1,ilen3(jfld),2) ) 
    636          nbmap_ptr(jfld)%ptr => idx_bdy(ibdy(jfld))%nbmap(:,igrid(jfld)) 
    637          nbmap_ptr(jfld)%ll_unstruc = ln_coords_file(ibdy(jfld)) 
    638       ENDDO 
    639  
    640       ! fill bf with blf_i and control print 
    641       !------------------------------------- 
    642       jstart = 1 
    643       DO jbdy = 1, nb_bdy 
    644          jend = jstart - 1 + nb_bdy_fld(jbdy)  
    645          CALL fld_fill( bf(jstart:jend), blf_i(jstart:jend), cn_dir_array(jbdy), 'bdy_dta',   & 
    646          &              'open boundary conditions', 'nambdy_dta' ) 
    647          jstart = jend + 1 
    648       ENDDO 
    649  
    650       DO jfld = 1, nb_bdy_fld_sum 
    651          bf(jfld)%igrd = igrid(jfld) 
    652          bf(jfld)%ibdy = ibdy(jfld) 
    653       ENDDO 
    654  
    655       ! Initialise local boundary data arrays 
    656       ! nn_xxx_dta=0 : allocate space - will be filled from initial conditions later 
    657       ! nn_xxx_dta=1 : point to "fnow" arrays 
    658       !------------------------------------- 
    659  
    660       jfld = 0 
    661       DO jbdy=1, nb_bdy 
    662  
    663          nblen => idx_bdy(jbdy)%nblen 
    664          dta => dta_bdy(jbdy) 
    665  
    666          if(lwp) then 
    667             write(numout,*) '++++++ dta%ll_ssh = ',dta%ll_ssh 
    668             write(numout,*) '++++++ dta%ll_u2d = ',dta%ll_u2d 
    669             write(numout,*) '++++++ dta%ll_v2d = ',dta%ll_v2d 
    670             write(numout,*) '++++++ dta%ll_u3d = ',dta%ll_u3d 
    671             write(numout,*) '++++++ dta%ll_v3d = ',dta%ll_v3d 
    672             write(numout,*) '++++++ dta%ll_tem = ',dta%ll_tem 
    673             write(numout,*) '++++++ dta%ll_sal = ',dta%ll_sal 
    674          endif 
    675  
    676          IF ( nn_dyn2d_dta(jbdy) == 0 .or. nn_dyn2d_dta(jbdy) == 2 ) THEN 
    677             if(lwp) write(numout,*) '++++++ dta%ssh/u2d/u3d allocated space' 
    678             IF( dta%ll_ssh ) ALLOCATE( dta%ssh(nblen(1)) ) 
    679             IF( dta%ll_u2d ) ALLOCATE( dta%u2d(nblen(2)) ) 
    680             IF( dta%ll_v2d ) ALLOCATE( dta%v2d(nblen(3)) ) 
    681          ENDIF 
    682          IF ( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) THEN 
    683             IF( dta%ll_ssh ) THEN 
    684                if(lwp) write(numout,*) '++++++ dta%ssh pointing to fnow' 
    685                jfld = jfld + 1 
    686                dta%ssh => bf(jfld)%fnow(:,1,1) 
    687             ENDIF 
    688             IF ( dta%ll_u2d ) THEN 
    689                IF ( ln_full_vel_array(jbdy) ) THEN 
    690                   if(lwp) write(numout,*) '++++++ dta%u2d allocated space' 
    691                   ALLOCATE( dta%u2d(nblen(2)) ) 
    692                ELSE 
    693                   if(lwp) write(numout,*) '++++++ dta%u2d pointing to fnow' 
    694                   jfld = jfld + 1 
    695                   dta%u2d => bf(jfld)%fnow(:,1,1) 
    696                ENDIF 
    697             ENDIF 
    698             IF ( dta%ll_v2d ) THEN 
    699                IF ( ln_full_vel_array(jbdy) ) THEN 
    700                   if(lwp) write(numout,*) '++++++ dta%v2d allocated space' 
    701                   ALLOCATE( dta%v2d(nblen(3)) ) 
    702                ELSE 
    703                   if(lwp) write(numout,*) '++++++ dta%v2d pointing to fnow' 
    704                   jfld = jfld + 1 
    705                   dta%v2d => bf(jfld)%fnow(:,1,1) 
    706                ENDIF 
    707             ENDIF 
    708          ENDIF 
    709  
    710          IF ( nn_dyn3d_dta(jbdy) == 0 ) THEN 
    711             if(lwp) write(numout,*) '++++++ dta%u3d/v3d allocated space' 
    712             IF( dta%ll_u3d ) ALLOCATE( dta_bdy(jbdy)%u3d(nblen(2),jpk) ) 
    713             IF( dta%ll_v3d ) ALLOCATE( dta_bdy(jbdy)%v3d(nblen(3),jpk) ) 
    714          ENDIF 
    715          IF ( nn_dyn3d_dta(jbdy) == 1 .or. & 
    716            &  ( ln_full_vel_array(jbdy) .and. ( nn_dyn2d_dta(jbdy) == 1 .or. nn_dyn2d_dta(jbdy) == 3 ) ) ) THEN 
    717             IF ( dta%ll_u3d .or. ( ln_full_vel_array(jbdy) .and. dta%ll_u2d ) ) THEN 
    718                if(lwp) write(numout,*) '++++++ dta%u3d pointing to fnow' 
    719                jfld = jfld + 1 
    720                dta_bdy(jbdy)%u3d => bf(jfld)%fnow(:,1,:) 
    721             ENDIF 
    722             IF ( dta%ll_v3d .or. ( ln_full_vel_array(jbdy) .and. dta%ll_v2d ) ) THEN 
    723                if(lwp) write(numout,*) '++++++ dta%v3d pointing to fnow' 
    724                jfld = jfld + 1 
    725                dta_bdy(jbdy)%v3d => bf(jfld)%fnow(:,1,:) 
    726             ENDIF 
    727          ENDIF 
    728  
    729          IF( nn_tra_dta(jbdy) == 0 ) THEN 
    730             if(lwp) write(numout,*) '++++++ dta%tem/sal allocated space' 
    731             IF( dta%ll_tem ) ALLOCATE( dta_bdy(jbdy)%tem(nblen(1),jpk) ) 
    732             IF( dta%ll_sal ) ALLOCATE( dta_bdy(jbdy)%sal(nblen(1),jpk) ) 
    733          ELSE 
    734             IF( dta%ll_tem ) THEN 
    735                if(lwp) write(numout,*) '++++++ dta%tem pointing to fnow' 
    736                jfld = jfld + 1 
    737                dta_bdy(jbdy)%tem => bf(jfld)%fnow(:,1,:) 
    738             ENDIF 
    739             IF( dta%ll_sal ) THEN  
    740                if(lwp) write(numout,*) '++++++ dta%sal pointing to fnow' 
    741                jfld = jfld + 1 
    742                dta_bdy(jbdy)%sal => bf(jfld)%fnow(:,1,:) 
    743             ENDIF 
    744          ENDIF 
    745  
    746 #if defined key_si3 
    747          IF (cn_ice(jbdy) /= 'none') THEN 
    748             IF( nn_ice_dta(jbdy) == 0 ) THEN 
    749                ALLOCATE( dta_bdy(jbdy)%a_i(nblen(1),jpl) ) 
    750                ALLOCATE( dta_bdy(jbdy)%h_i(nblen(1),jpl) ) 
    751                ALLOCATE( dta_bdy(jbdy)%h_s(nblen(1),jpl) ) 
    752             ELSE 
    753                IF ( nice_cat == jpl ) THEN ! case input cat = jpl 
    754                   jfld = jfld + 1 
    755                   dta_bdy(jbdy)%a_i => bf(jfld)%fnow(:,1,:) 
    756                   jfld = jfld + 1 
    757                   dta_bdy(jbdy)%h_i => bf(jfld)%fnow(:,1,:) 
    758                   jfld = jfld + 1 
    759                   dta_bdy(jbdy)%h_s => bf(jfld)%fnow(:,1,:) 
    760                ELSE                        ! case input cat = 1 OR (/=1 and /=jpl) 
    761                   jfld_ait(jbdy)  = jfld + 1 
    762                   jfld_htit(jbdy) = jfld + 2 
    763                   jfld_htst(jbdy) = jfld + 3 
    764                   jfld     = jfld + 3 
    765                   ALLOCATE( dta_bdy(jbdy)%a_i(nblen(1),jpl) ) 
    766                   ALLOCATE( dta_bdy(jbdy)%h_i(nblen(1),jpl) ) 
    767                   ALLOCATE( dta_bdy(jbdy)%h_s(nblen(1),jpl) ) 
    768                   dta_bdy(jbdy)%a_i(:,:) = 0._wp 
    769                   dta_bdy(jbdy)%h_i(:,:) = 0._wp 
    770                   dta_bdy(jbdy)%h_s(:,:) = 0._wp 
    771                ENDIF 
    772  
    773             ENDIF 
    774          ENDIF 
    775 #endif 
     621               IF( llread ) THEN                                           ! get data from NetCDF file 
     622                  CALL fld_fill( bf_alias, bn_alias, cn_dir, 'bdy_dta', cl3//' '//ctmp1, ctmp2 )   ! use namelist info 
     623                  IF( bf_alias(1)%ln_tint ) ALLOCATE( bf_alias(1)%fdta( iszdim, 1, ipk, 2 ) ) 
     624                  bf_alias(1)%imap    => idx_bdy(jbdy)%nbmap(1:iszdim,igrd)   ! associate the mapping used for this bdy 
     625                  bf_alias(1)%igrd    = igrd                                  ! used only for vertical integration of 3D arrays 
     626                  bf_alias(1)%ltotvel = ln_full_vel                           ! T if u3d is full velocity 
     627                  bf_alias(1)%lzint   = ln_zinterp                            ! T if it requires a vertical interpolation 
     628               ENDIF 
     629 
     630               ! associate the pointer and get rid of the dimensions with a size equal to 1 
     631               IF( jfld == jp_bdyssh )        dta_bdy(jbdy)%ssh => bf_alias(1)%fnow(:,1,1) 
     632               IF( jfld == jp_bdyu2d )        dta_bdy(jbdy)%u2d => bf_alias(1)%fnow(:,1,1) 
     633               IF( jfld == jp_bdyv2d )        dta_bdy(jbdy)%v2d => bf_alias(1)%fnow(:,1,1) 
     634               IF( jfld == jp_bdyu3d )        dta_bdy(jbdy)%u3d => bf_alias(1)%fnow(:,1,:) 
     635               IF( jfld == jp_bdyv3d )        dta_bdy(jbdy)%v3d => bf_alias(1)%fnow(:,1,:) 
     636               IF( jfld == jp_bdytem )        dta_bdy(jbdy)%tem => bf_alias(1)%fnow(:,1,:) 
     637               IF( jfld == jp_bdysal )        dta_bdy(jbdy)%sal => bf_alias(1)%fnow(:,1,:) 
     638               IF( jfld == jp_bdya_i ) THEN 
     639                  IF( ipk == jpl ) THEN   ;   dta_bdy(jbdy)%a_i => bf_alias(1)%fnow(:,1,:) 
     640                  ELSE                    ;   ALLOCATE( dta_bdy(jbdy)%a_i(iszdim,jpl) ) 
     641                  ENDIF 
     642               ENDIF 
     643               IF( jfld == jp_bdyh_i ) THEN 
     644                  IF( ipk == jpl ) THEN   ;   dta_bdy(jbdy)%h_i => bf_alias(1)%fnow(:,1,:) 
     645                  ELSE                    ;   ALLOCATE( dta_bdy(jbdy)%h_i(iszdim,jpl) ) 
     646                  ENDIF 
     647               ENDIF 
     648               IF( jfld == jp_bdyh_s ) THEN 
     649                  IF( ipk == jpl ) THEN   ;   dta_bdy(jbdy)%h_s => bf_alias(1)%fnow(:,1,:) 
     650                  ELSE                    ;   ALLOCATE( dta_bdy(jbdy)%h_s(iszdim,jpl) ) 
     651                  ENDIF 
     652               ENDIF 
     653               IF( jfld == jp_bdyt_i ) THEN 
     654                  IF( ipk == jpl ) THEN   ;   dta_bdy(jbdy)%t_i => bf_alias(1)%fnow(:,1,:) 
     655                  ELSE                    ;   ALLOCATE( dta_bdy(jbdy)%t_i(iszdim,jpl) ) 
     656                  ENDIF 
     657               ENDIF 
     658               IF( jfld == jp_bdyt_s ) THEN 
     659                  IF( ipk == jpl ) THEN   ;   dta_bdy(jbdy)%t_s => bf_alias(1)%fnow(:,1,:) 
     660                  ELSE                    ;   ALLOCATE( dta_bdy(jbdy)%t_s(iszdim,jpl) ) 
     661                  ENDIF 
     662               ENDIF 
     663               IF( jfld == jp_bdytsu ) THEN 
     664                  IF( ipk == jpl ) THEN   ;   dta_bdy(jbdy)%tsu => bf_alias(1)%fnow(:,1,:) 
     665                  ELSE                    ;   ALLOCATE( dta_bdy(jbdy)%tsu(iszdim,jpl) ) 
     666                  ENDIF 
     667               ENDIF 
     668               IF( jfld == jp_bdys_i ) THEN 
     669                  IF( ipk == jpl ) THEN   ;   dta_bdy(jbdy)%s_i => bf_alias(1)%fnow(:,1,:) 
     670                  ELSE                    ;   ALLOCATE( dta_bdy(jbdy)%s_i(iszdim,jpl) ) 
     671                  ENDIF 
     672               ENDIF 
     673               IF( jfld == jp_bdyaip ) THEN 
     674                  IF( ipk == jpl ) THEN   ;   dta_bdy(jbdy)%aip => bf_alias(1)%fnow(:,1,:) 
     675                  ELSE                    ;   ALLOCATE( dta_bdy(jbdy)%aip(iszdim,jpl) ) 
     676                  ENDIF 
     677               ENDIF 
     678               IF( jfld == jp_bdyhip ) THEN 
     679                  IF( ipk == jpl ) THEN   ;   dta_bdy(jbdy)%hip => bf_alias(1)%fnow(:,1,:) 
     680                  ELSE                    ;   ALLOCATE( dta_bdy(jbdy)%hip(iszdim,jpl) ) 
     681                  ENDIF 
     682               ENDIF 
     683            ENDIF 
     684 
     685         END DO   ! jpbdyfld 
    776686         ! 
    777687      END DO ! jbdy  
    778688      ! 
    779689   END SUBROUTINE bdy_dta_init 
    780  
     690    
    781691   !!============================================================================== 
    782692END MODULE bdydta 
Note: See TracChangeset for help on using the changeset viewer.