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 12910 for NEMO/releases/r4.0/r4.0-HEAD/src/OCE/BDY/bdytides.F90 – NEMO

Ignore:
Timestamp:
2020-05-12T10:21:19+02:00 (4 years ago)
Author:
smasson
Message:

r4.0-HEAD: bugfix potential out-of-bounds in bdydta/bdytides, see #2461

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/releases/r4.0/r4.0-HEAD/src/OCE/BDY/bdytides.F90

    r11536 r12910  
    6262      !! namelist variables 
    6363      !!------------------- 
    64       CHARACTER(len=80)                         ::   filtide             !: Filename root for tidal input files 
    65       LOGICAL                                   ::   ln_bdytide_2ddta    !: If true, read 2d harmonic data 
    66       LOGICAL                                   ::   ln_bdytide_conj     !: If true, assume complex conjugate tidal data 
     64      CHARACTER(len=80)                         ::   filtide             ! Filename root for tidal input files 
     65      LOGICAL                                   ::   ln_bdytide_2ddta    ! If true, read 2d harmonic data 
     66      LOGICAL                                   ::   ln_bdytide_conj     ! If true, assume complex conjugate tidal data 
    6767      !! 
    68       INTEGER                                   ::   ib_bdy, itide, ib   !: dummy loop indices 
    69       INTEGER                                   ::   ii, ij              !: dummy loop indices 
     68      INTEGER                                   ::   ib_bdy, itide, ib   ! dummy loop indices 
     69      INTEGER                                   ::   ii, ij              ! dummy loop indices 
    7070      INTEGER                                   ::   inum, igrd 
    71       INTEGER, DIMENSION(3)                     ::   ilen0       !: length of boundary data (from OBC arrays) 
     71      INTEGER                                   ::   isz                 ! bdy data size 
    7272      INTEGER                                   ::   ios                 ! Local integer output status for namelist read 
    73       CHARACTER(len=80)                         ::   clfile              !: full file name for tidal input file  
    74       REAL(wp),ALLOCATABLE, DIMENSION(:,:,:)    ::   dta_read            !: work space to read in tidal harmonics data 
    75       REAL(wp),ALLOCATABLE, DIMENSION(:,:)      ::   ztr, zti            !:  "     "    "   "   "   "        "      "  
     73      CHARACTER(len=80)                         ::   clfile              ! full file name for tidal input file  
     74      REAL(wp),ALLOCATABLE, DIMENSION(:,:,:)    ::   dta_read            ! work space to read in tidal harmonics data 
     75      REAL(wp),ALLOCATABLE, DIMENSION(:,:)      ::   ztr, zti            !  "     "    "   "   "   "        "      "  
    7676      !! 
    77       TYPE(TIDES_DATA),  POINTER                ::   td                  !: local short cut    
     77      TYPE(TIDES_DATA), POINTER                 ::   td                  ! local short cut    
     78      TYPE(  OBC_DATA), POINTER                 ::   dta                 ! local short cut 
    7879      !! 
    7980      NAMELIST/nambdy_tide/filtide, ln_bdytide_2ddta, ln_bdytide_conj 
     
    8990         IF( nn_dyn2d_dta(ib_bdy) >= 2 ) THEN 
    9091            ! 
    91             td => tides(ib_bdy) 
    92  
     92            td  => tides(ib_bdy) 
     93            dta => dta_bdy(ib_bdy) 
     94          
    9395            ! Namelist nambdy_tide : tidal harmonic forcing at open boundaries 
    9496            filtide(:) = '' 
     
    115117            IF(lwp) WRITE(numout,*) ' ' 
    116118 
    117             ! Allocate space for tidal harmonics data - get size from OBC data arrays 
     119            ! Allocate space for tidal harmonics data - get size from BDY data arrays 
     120            ! Allocate also slow varying data in the case of time splitting: 
     121            ! Do it anyway because at this stage knowledge of free surface scheme is unknown 
    118122            ! ----------------------------------------------------------------------- 
    119  
    120             ! JC: If FRS scheme is used, we assume that tidal is needed over the whole 
    121             ! relaxation area       
    122             IF( cn_dyn2d(ib_bdy) == 'frs' ) THEN   ;   ilen0(:) = idx_bdy(ib_bdy)%nblen   (:) 
    123             ELSE                                   ;   ilen0(:) = idx_bdy(ib_bdy)%nblenrim(:) 
     123            IF( ASSOCIATED(dta%ssh) ) THEN   ! we use bdy ssh on this mpi subdomain 
     124               isz = SIZE(dta%ssh) 
     125               ALLOCATE( td%ssh0( isz, nb_harmo, 2 ), td%ssh( isz, nb_harmo, 2 ), dta_bdy_s(ib_bdy)%ssh( isz ) ) 
     126               dta_bdy_s(ib_bdy)%ssh(:) = 0._wp   ! needed? 
    124127            ENDIF 
    125  
    126             ALLOCATE( td%ssh0( ilen0(1), nb_harmo, 2 ) ) 
    127             ALLOCATE( td%ssh ( ilen0(1), nb_harmo, 2 ) ) 
    128  
    129             ALLOCATE( td%u0( ilen0(2), nb_harmo, 2 ) ) 
    130             ALLOCATE( td%u ( ilen0(2), nb_harmo, 2 ) ) 
    131  
    132             ALLOCATE( td%v0( ilen0(3), nb_harmo, 2 ) ) 
    133             ALLOCATE( td%v ( ilen0(3), nb_harmo, 2 ) ) 
    134  
    135             td%ssh0(:,:,:) = 0._wp 
    136             td%ssh (:,:,:) = 0._wp 
    137             td%u0  (:,:,:) = 0._wp 
    138             td%u   (:,:,:) = 0._wp 
    139             td%v0  (:,:,:) = 0._wp 
    140             td%v   (:,:,:) = 0._wp 
    141  
     128            IF( ASSOCIATED(dta%u2d) ) THEN   ! we use bdy u2d on this mpi subdomain 
     129               isz = SIZE(dta%u2d) 
     130               ALLOCATE( td%u0  ( isz, nb_harmo, 2 ), td%u  ( isz, nb_harmo, 2 ), dta_bdy_s(ib_bdy)%u2d( isz ) ) 
     131               dta_bdy_s(ib_bdy)%u2d(:) = 0._wp   ! needed? 
     132            ENDIF 
     133            IF( ASSOCIATED(dta%v2d) ) THEN   ! we use bdy v2d on this mpi subdomain 
     134               isz = SIZE(dta%v2d) 
     135               ALLOCATE( td%v0  ( isz, nb_harmo, 2 ), td%v  ( isz, nb_harmo, 2 ), dta_bdy_s(ib_bdy)%v2d( isz ) ) 
     136               dta_bdy_s(ib_bdy)%v2d(:) = 0._wp   ! needed? 
     137            ENDIF 
     138 
     139            ! fill td%ssh0, td%u0, td%v0 
     140            ! ----------------------------------------------------------------------- 
    142141            IF( ln_bdytide_2ddta ) THEN 
     142               ! 
    143143               ! It is assumed that each data file contains all complex harmonic amplitudes 
    144144               ! given on the global domain (ie global, jpiglo x jpjglo) 
     
    147147               ! 
    148148               ! SSH fields 
    149                clfile = TRIM(filtide)//'_grid_T.nc' 
    150                CALL iom_open( clfile , inum )  
    151                igrd = 1                       ! Everything is at T-points here 
    152                DO itide = 1, nb_harmo 
    153                   CALL iom_get( inum, jpdom_autoglo, TRIM(Wave(ntide(itide))%cname_tide)//'_z1', ztr(:,:) ) 
    154                   CALL iom_get( inum, jpdom_autoglo, TRIM(Wave(ntide(itide))%cname_tide)//'_z2', zti(:,:) )  
    155                   DO ib = 1, ilen0(igrd) 
    156                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    157                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    158                      IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE   ! to remove? 
    159                      td%ssh0(ib,itide,1) = ztr(ii,ij) 
    160                      td%ssh0(ib,itide,2) = zti(ii,ij) 
     149               IF( ASSOCIATED(dta%ssh) ) THEN   ! we use bdy ssh on this mpi subdomain 
     150                  clfile = TRIM(filtide)//'_grid_T.nc' 
     151                  CALL iom_open( clfile , inum )  
     152                  igrd = 1                       ! Everything is at T-points here 
     153                  DO itide = 1, nb_harmo 
     154                     CALL iom_get( inum, jpdom_autoglo, TRIM(Wave(ntide(itide))%cname_tide)//'_z1', ztr(:,:) ) 
     155                     CALL iom_get( inum, jpdom_autoglo, TRIM(Wave(ntide(itide))%cname_tide)//'_z2', zti(:,:) )  
     156                     DO ib = 1, SIZE(dta%ssh) 
     157                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     158                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     159                        td%ssh0(ib,itide,1) = ztr(ii,ij) 
     160                        td%ssh0(ib,itide,2) = zti(ii,ij) 
     161                     END DO 
    161162                  END DO 
    162                END DO  
    163                CALL iom_close( inum ) 
     163                  CALL iom_close( inum ) 
     164               END IF 
    164165               ! 
    165166               ! U fields 
    166                clfile = TRIM(filtide)//'_grid_U.nc' 
    167                CALL iom_open( clfile , inum )  
    168                igrd = 2                       ! Everything is at U-points here 
    169                DO itide = 1, nb_harmo 
    170                   CALL iom_get  ( inum, jpdom_autoglo, TRIM(Wave(ntide(itide))%cname_tide)//'_u1', ztr(:,:) ) 
    171                   CALL iom_get  ( inum, jpdom_autoglo, TRIM(Wave(ntide(itide))%cname_tide)//'_u2', zti(:,:) ) 
    172                   DO ib = 1, ilen0(igrd) 
    173                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    174                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    175                      IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE   ! to remove? 
    176                      td%u0(ib,itide,1) = ztr(ii,ij) 
    177                      td%u0(ib,itide,2) = zti(ii,ij) 
     167               IF( ASSOCIATED(dta%u2d) ) THEN   ! we use bdy u2d on this mpi subdomain 
     168                  clfile = TRIM(filtide)//'_grid_U.nc' 
     169                  CALL iom_open( clfile , inum )  
     170                  igrd = 2                       ! Everything is at U-points here 
     171                  DO itide = 1, nb_harmo 
     172                     CALL iom_get  ( inum, jpdom_autoglo, TRIM(Wave(ntide(itide))%cname_tide)//'_u1', ztr(:,:) ) 
     173                     CALL iom_get  ( inum, jpdom_autoglo, TRIM(Wave(ntide(itide))%cname_tide)//'_u2', zti(:,:) ) 
     174                     DO ib = 1, SIZE(dta%u2d) 
     175                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     176                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     177                        td%u0(ib,itide,1) = ztr(ii,ij) 
     178                        td%u0(ib,itide,2) = zti(ii,ij) 
     179                     END DO 
    178180                  END DO 
    179                END DO 
    180                CALL iom_close( inum ) 
     181                  CALL iom_close( inum ) 
     182               END IF 
    181183               ! 
    182184               ! V fields 
    183                clfile = TRIM(filtide)//'_grid_V.nc' 
    184                CALL iom_open( clfile , inum )  
    185                igrd = 3                       ! Everything is at V-points here 
    186                DO itide = 1, nb_harmo 
    187                   CALL iom_get  ( inum, jpdom_autoglo, TRIM(Wave(ntide(itide))%cname_tide)//'_v1', ztr(:,:) ) 
    188                   CALL iom_get  ( inum, jpdom_autoglo, TRIM(Wave(ntide(itide))%cname_tide)//'_v2', zti(:,:) ) 
    189                   DO ib = 1, ilen0(igrd) 
    190                      ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    191                      ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    192                      IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE   ! to remove? 
    193                      td%v0(ib,itide,1) = ztr(ii,ij) 
    194                      td%v0(ib,itide,2) = zti(ii,ij) 
     185               IF( ASSOCIATED(dta%v2d) ) THEN   ! we use bdy v2d on this mpi subdomain 
     186                  clfile = TRIM(filtide)//'_grid_V.nc' 
     187                  CALL iom_open( clfile , inum )  
     188                  igrd = 3                       ! Everything is at V-points here 
     189                  DO itide = 1, nb_harmo 
     190                     CALL iom_get  ( inum, jpdom_autoglo, TRIM(Wave(ntide(itide))%cname_tide)//'_v1', ztr(:,:) ) 
     191                     CALL iom_get  ( inum, jpdom_autoglo, TRIM(Wave(ntide(itide))%cname_tide)//'_v2', zti(:,:) ) 
     192                     DO ib = 1, SIZE(dta%v2d) 
     193                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     194                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     195                        td%v0(ib,itide,1) = ztr(ii,ij) 
     196                        td%v0(ib,itide,2) = zti(ii,ij) 
     197                     END DO 
    195198                  END DO 
    196                END DO   
    197                CALL iom_close( inum ) 
     199                  CALL iom_close( inum ) 
     200               END IF 
    198201               ! 
    199202               DEALLOCATE( ztr, zti )  
     
    203206               ! Read tidal data only on bdy segments 
    204207               !  
    205                ALLOCATE( dta_read( MAXVAL(ilen0(1:3)), 1, 1 ) ) 
     208               ALLOCATE( dta_read( MAXVAL( idx_bdy(ib_bdy)%nblen(:) ), 1, 1 ) ) 
    206209               ! 
    207210               ! Open files and read in tidal forcing data 
     
    210213               DO itide = 1, nb_harmo 
    211214                  !                                                              ! SSH fields 
    212                   clfile = TRIM(filtide)//TRIM(Wave(ntide(itide))%cname_tide)//'_grid_T.nc' 
    213                   CALL iom_open( clfile, inum ) 
    214                   CALL fld_map( inum, 'z1' , dta_read(1:ilen0(1),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 
    215                   td%ssh0(:,itide,1) = dta_read(1:ilen0(1),1,1) 
    216                   CALL fld_map( inum, 'z2' , dta_read(1:ilen0(1),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 
    217                   td%ssh0(:,itide,2) = dta_read(1:ilen0(1),1,1) 
    218                   CALL iom_close( inum ) 
     215                  IF( ASSOCIATED(dta%ssh) ) THEN   ! we use bdy ssh on this mpi subdomain 
     216                     isz = SIZE(dta%ssh) 
     217                     clfile = TRIM(filtide)//TRIM(Wave(ntide(itide))%cname_tide)//'_grid_T.nc' 
     218                     CALL iom_open( clfile, inum ) 
     219                     CALL fld_map( inum, 'z1', dta_read(1:isz,1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 
     220                     td%ssh0(:,itide,1) = dta_read(1:isz,1,1) 
     221                     CALL fld_map( inum, 'z2', dta_read(1:isz,1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 
     222                     td%ssh0(:,itide,2) = dta_read(1:isz,1,1) 
     223                     CALL iom_close( inum ) 
     224                  ENDIF 
    219225                  !                                                              ! U fields 
    220                   clfile = TRIM(filtide)//TRIM(Wave(ntide(itide))%cname_tide)//'_grid_U.nc' 
    221                   CALL iom_open( clfile, inum ) 
    222                   CALL fld_map( inum, 'u1' , dta_read(1:ilen0(2),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 
    223                   td%u0(:,itide,1) = dta_read(1:ilen0(2),1,1) 
    224                   CALL fld_map( inum, 'u2' , dta_read(1:ilen0(2),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 
    225                   td%u0(:,itide,2) = dta_read(1:ilen0(2),1,1) 
    226                   CALL iom_close( inum ) 
     226                  IF( ASSOCIATED(dta%u2d) ) THEN   ! we use bdy u2d on this mpi subdomain 
     227                     isz = SIZE(dta%u2d) 
     228                     clfile = TRIM(filtide)//TRIM(Wave(ntide(itide))%cname_tide)//'_grid_U.nc' 
     229                     CALL iom_open( clfile, inum ) 
     230                     CALL fld_map( inum, 'u1', dta_read(1:isz,1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 
     231                     td%u0(:,itide,1) = dta_read(1:isz,1,1) 
     232                     CALL fld_map( inum, 'u2', dta_read(1:isz,1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 
     233                     td%u0(:,itide,2) = dta_read(1:isz,1,1) 
     234                     CALL iom_close( inum ) 
     235                  ENDIF 
    227236                  !                                                              ! V fields 
    228                   clfile = TRIM(filtide)//TRIM(Wave(ntide(itide))%cname_tide)//'_grid_V.nc' 
    229                   CALL iom_open( clfile, inum ) 
    230                   CALL fld_map( inum, 'v1' , dta_read(1:ilen0(3),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 
    231                   td%v0(:,itide,1) = dta_read(1:ilen0(3),1,1) 
    232                   CALL fld_map( inum, 'v2' , dta_read(1:ilen0(3),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 
    233                   td%v0(:,itide,2) = dta_read(1:ilen0(3),1,1) 
    234                   CALL iom_close( inum ) 
     237                  IF( ASSOCIATED(dta%v2d) ) THEN   ! we use bdy v2d on this mpi subdomain 
     238                     isz = SIZE(dta%v2d) 
     239                     clfile = TRIM(filtide)//TRIM(Wave(ntide(itide))%cname_tide)//'_grid_V.nc' 
     240                     CALL iom_open( clfile, inum ) 
     241                     CALL fld_map( inum, 'v1', dta_read(1:isz,1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 
     242                     td%v0(:,itide,1) = dta_read(1:isz,1,1) 
     243                     CALL fld_map( inum, 'v2', dta_read(1:isz,1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 
     244                     td%v0(:,itide,2) = dta_read(1:isz,1,1) 
     245                     CALL iom_close( inum ) 
     246                  ENDIF 
    235247                  ! 
    236248               END DO ! end loop on tidal components 
     
    241253            ! 
    242254            IF( ln_bdytide_conj ) THEN    ! assume complex conjugate in data files 
    243                td%ssh0(:,:,2) = - td%ssh0(:,:,2) 
    244                td%u0  (:,:,2) = - td%u0  (:,:,2) 
    245                td%v0  (:,:,2) = - td%v0  (:,:,2) 
     255               IF( ASSOCIATED(dta%ssh) )   td%ssh0(:,:,2) = - td%ssh0(:,:,2) 
     256               IF( ASSOCIATED(dta%u2d) )   td%u0  (:,:,2) = - td%u0  (:,:,2) 
     257               IF( ASSOCIATED(dta%v2d) )   td%v0  (:,:,2) = - td%v0  (:,:,2) 
    246258            ENDIF 
    247             ! 
    248             ! Allocate slow varying data in the case of time splitting: 
    249             ! Do it anyway because at this stage knowledge of free surface scheme is unknown 
    250             ALLOCATE( dta_bdy_s(ib_bdy)%ssh ( ilen0(1) ) ) 
    251             ALLOCATE( dta_bdy_s(ib_bdy)%u2d ( ilen0(2) ) ) 
    252             ALLOCATE( dta_bdy_s(ib_bdy)%v2d ( ilen0(3) ) ) 
    253             dta_bdy_s(ib_bdy)%ssh(:) = 0._wp 
    254             dta_bdy_s(ib_bdy)%u2d(:) = 0._wp 
    255             dta_bdy_s(ib_bdy)%v2d(:) = 0._wp 
    256259            ! 
    257260         ENDIF ! nn_dyn2d_dta(ib_bdy) >= 2 
     
    281284      !                                                 ! etc. 
    282285      ! 
    283       INTEGER  ::   itide, igrd, ib       ! dummy loop indices 
     286      INTEGER  ::   itide, ib             ! dummy loop indices 
    284287      INTEGER  ::   time_add              ! time offset in units of timesteps 
    285       INTEGER, DIMENSION(3) ::   ilen0    ! length of boundary data (from OBC arrays) 
     288      INTEGER  ::   isz                   ! bdy data size 
    286289      REAL(wp) ::   z_arg, z_sarg, zflag, zramp   ! local scalars     
    287290      REAL(wp), DIMENSION(jpmax_harmo) :: z_sist, z_cost 
    288291      !!---------------------------------------------------------------------- 
    289292      ! 
    290       ilen0(1) =  SIZE(td%ssh(:,1,1)) 
    291       ilen0(2) =  SIZE(td%u(:,1,1)) 
    292       ilen0(3) =  SIZE(td%v(:,1,1)) 
    293  
    294293      zflag=1 
    295294      IF ( PRESENT(kit) ) THEN 
    296295        IF ( kit /= 1 ) zflag=0 
    297296      ENDIF 
    298  
     297      ! 
    299298      IF ( (nsec_day == NINT(0.5_wp * rdt) .OR. kt==nit000) .AND. zflag==1 ) THEN 
    300299        ! 
     
    334333 
    335334      DO itide = 1, nb_harmo 
    336          igrd=1                              ! SSH on tracer grid 
    337          DO ib = 1, ilen0(igrd) 
    338             dta%ssh(ib) = dta%ssh(ib) + zramp*(td%ssh(ib,itide,1)*z_cost(itide) + td%ssh(ib,itide,2)*z_sist(itide)) 
    339          END DO 
    340          igrd=2                              ! U grid 
    341          DO ib = 1, ilen0(igrd) 
    342             dta%u2d(ib) = dta%u2d(ib) + zramp*(td%u  (ib,itide,1)*z_cost(itide) + td%u  (ib,itide,2)*z_sist(itide)) 
    343          END DO 
    344          igrd=3                              ! V grid 
    345          DO ib = 1, ilen0(igrd)  
    346             dta%v2d(ib) = dta%v2d(ib) + zramp*(td%v  (ib,itide,1)*z_cost(itide) + td%v  (ib,itide,2)*z_sist(itide)) 
    347          END DO 
     335         ! SSH on tracer grid 
     336         IF( ASSOCIATED(dta%ssh) ) THEN   ! we use bdy ssh on this mpi subdomain 
     337           DO ib = 1, SIZE(dta%ssh) 
     338               dta%ssh(ib) = dta%ssh(ib) + zramp*(td%ssh(ib,itide,1)*z_cost(itide) + td%ssh(ib,itide,2)*z_sist(itide)) 
     339            END DO 
     340         ENDIF 
     341         ! U grid 
     342         IF( ASSOCIATED(dta%u2d) ) THEN   ! we use bdy u2d on this mpi subdomain 
     343            DO ib = 1, SIZE(dta%u2d) 
     344               dta%u2d(ib) = dta%u2d(ib) + zramp*(td%u  (ib,itide,1)*z_cost(itide) + td%u  (ib,itide,2)*z_sist(itide)) 
     345            END DO 
     346         ENDIF 
     347         ! V grid 
     348         IF( ASSOCIATED(dta%v2d) ) THEN   ! we use bdy v2d on this mpi subdomain 
     349            DO ib = 1, SIZE(dta%v2d)  
     350               dta%v2d(ib) = dta%v2d(ib) + zramp*(td%v  (ib,itide,1)*z_cost(itide) + td%v  (ib,itide,2)*z_sist(itide)) 
     351            END DO 
     352         ENDIF 
    348353      END DO 
    349354      ! 
     
    368373      ! 
    369374      LOGICAL  ::   lk_first_btstp            ! =.TRUE. if time splitting and first barotropic step 
    370       INTEGER  ::   itide, ib_bdy, ib, igrd   ! loop indices 
     375      INTEGER  ::   itide, ib_bdy, ib         ! loop indices 
    371376      INTEGER  ::   time_add                  ! time offset in units of timesteps 
    372       INTEGER, DIMENSION(jpbgrd)   ::   ilen0  
    373       INTEGER, DIMENSION(1:jpbgrd) ::   nblen, nblenrim  ! short cuts 
    374377      REAL(wp) ::   z_arg, z_sarg, zramp, zoff, z_cost, z_sist       
    375378      !!---------------------------------------------------------------------- 
     
    398401         IF( nn_dyn2d_dta(ib_bdy) >= 2 ) THEN 
    399402            ! 
    400             nblen(1:jpbgrd) = idx_bdy(ib_bdy)%nblen(1:jpbgrd) 
    401             nblenrim(1:jpbgrd) = idx_bdy(ib_bdy)%nblenrim(1:jpbgrd) 
    402             ! 
    403             IF( cn_dyn2d(ib_bdy) == 'frs' ) THEN   ;   ilen0(:) = nblen   (:) 
    404             ELSE                                   ;   ilen0(:) = nblenrim(:) 
    405             ENDIF      
    406             ! 
    407403            ! We refresh nodal factors every day below 
    408404            ! This should be done somewhere else 
     
    425421            ! If time splitting, initialize arrays from slow varying open boundary data: 
    426422            IF ( PRESENT(kit) ) THEN            
    427                IF ( dta_bdy(ib_bdy)%lneed_ssh   ) dta_bdy(ib_bdy)%ssh(1:ilen0(1)) = dta_bdy_s(ib_bdy)%ssh(1:ilen0(1)) 
    428                IF ( dta_bdy(ib_bdy)%lneed_dyn2d ) dta_bdy(ib_bdy)%u2d(1:ilen0(2)) = dta_bdy_s(ib_bdy)%u2d(1:ilen0(2)) 
    429                IF ( dta_bdy(ib_bdy)%lneed_dyn2d ) dta_bdy(ib_bdy)%v2d(1:ilen0(3)) = dta_bdy_s(ib_bdy)%v2d(1:ilen0(3)) 
     423               IF ( ASSOCIATED(dta_bdy(ib_bdy)%ssh) ) dta_bdy(ib_bdy)%ssh(:) = dta_bdy_s(ib_bdy)%ssh(:) 
     424               IF ( ASSOCIATED(dta_bdy(ib_bdy)%u2d) ) dta_bdy(ib_bdy)%u2d(:) = dta_bdy_s(ib_bdy)%u2d(:) 
     425               IF ( ASSOCIATED(dta_bdy(ib_bdy)%v2d) ) dta_bdy(ib_bdy)%v2d(:) = dta_bdy_s(ib_bdy)%v2d(:) 
    430426            ENDIF 
    431427            ! 
     
    437433               z_sist = zramp * SIN( z_sarg ) 
    438434               ! 
    439                IF ( dta_bdy(ib_bdy)%lneed_ssh ) THEN 
    440                   igrd=1                              ! SSH on tracer grid 
    441                   DO ib = 1, ilen0(igrd) 
     435               IF ( ASSOCIATED(dta_bdy(ib_bdy)%ssh) ) THEN   ! SSH on tracer grid 
     436                  DO ib = 1, SIZE(dta_bdy(ib_bdy)%ssh) 
    442437                     dta_bdy(ib_bdy)%ssh(ib) = dta_bdy(ib_bdy)%ssh(ib) + & 
    443438                        &                      ( tides(ib_bdy)%ssh(ib,itide,1)*z_cost + & 
     
    446441               ENDIF 
    447442               ! 
    448                IF ( dta_bdy(ib_bdy)%lneed_dyn2d ) THEN 
    449                   igrd=2                              ! U grid 
    450                   DO ib = 1, ilen0(igrd) 
     443               IF ( ASSOCIATED(dta_bdy(ib_bdy)%u2d) ) THEN  ! U grid 
     444                  DO ib = 1, SIZE(dta_bdy(ib_bdy)%u2d) 
    451445                     dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) + & 
    452446                        &                      ( tides(ib_bdy)%u(ib,itide,1)*z_cost + & 
    453447                        &                        tides(ib_bdy)%u(ib,itide,2)*z_sist ) 
    454448                  END DO 
    455                   igrd=3                              ! V grid 
    456                   DO ib = 1, ilen0(igrd)  
     449               ENDIF 
     450               ! 
     451               IF ( ASSOCIATED(dta_bdy(ib_bdy)%v2d) ) THEN   ! V grid 
     452                  DO ib = 1, SIZE(dta_bdy(ib_bdy)%v2d) 
    457453                     dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) + & 
    458454                        &                      ( tides(ib_bdy)%v(ib,itide,1)*z_cost + & 
     
    460456                  END DO 
    461457               ENDIF 
     458               ! 
    462459            END DO              
    463460         END IF 
     
    474471      TYPE(TIDES_DATA), INTENT(inout) ::   td    ! tidal harmonics data 
    475472      ! 
    476       INTEGER ::   itide, igrd, ib       ! dummy loop indices 
    477       INTEGER, DIMENSION(1) ::   ilen0   ! length of boundary data (from OBC arrays) 
     473      INTEGER ::   itide, isz, ib       ! dummy loop indices 
    478474      REAL(wp),ALLOCATABLE, DIMENSION(:) ::   mod_tide, phi_tide 
    479475      !!---------------------------------------------------------------------- 
    480476      ! 
    481       igrd=1    
    482                               ! SSH on tracer grid. 
    483       ilen0(1) =  SIZE(td%ssh0(:,1,1)) 
    484       ! 
    485       ALLOCATE( mod_tide(ilen0(igrd)), phi_tide(ilen0(igrd)) ) 
    486       ! 
    487       DO itide = 1, nb_harmo 
    488          DO ib = 1, ilen0(igrd) 
    489             mod_tide(ib)=SQRT(td%ssh0(ib,itide,1)**2.+td%ssh0(ib,itide,2)**2.) 
    490             phi_tide(ib)=ATAN2(-td%ssh0(ib,itide,2),td%ssh0(ib,itide,1)) 
     477      IF( ASSOCIATED(td%ssh0) ) THEN   ! SSH on tracer grid. 
     478         ! 
     479         isz = SIZE( td%ssh0, dim = 1 ) 
     480         ALLOCATE( mod_tide(isz), phi_tide(isz) ) 
     481         ! 
     482         DO itide = 1, nb_harmo 
     483            DO ib = 1, isz 
     484               mod_tide(ib)=SQRT( td%ssh0(ib,itide,1)*td%ssh0(ib,itide,1) + td%ssh0(ib,itide,2)*td%ssh0(ib,itide,2) ) 
     485               phi_tide(ib)=ATAN2(-td%ssh0(ib,itide,2),td%ssh0(ib,itide,1)) 
     486            END DO 
     487            DO ib = 1, isz 
     488               mod_tide(ib)=mod_tide(ib)*ftide(itide) 
     489               phi_tide(ib)=phi_tide(ib)+v0tide(itide)+utide(itide) 
     490            END DO 
     491            DO ib = 1, isz 
     492               td%ssh(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 
     493               td%ssh(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 
     494            END DO 
    491495         END DO 
    492          DO ib = 1 , ilen0(igrd) 
    493             mod_tide(ib)=mod_tide(ib)*ftide(itide) 
    494             phi_tide(ib)=phi_tide(ib)+v0tide(itide)+utide(itide) 
    495          ENDDO 
    496          DO ib = 1 , ilen0(igrd) 
    497             td%ssh(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 
    498             td%ssh(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 
    499          ENDDO 
    500       END DO 
    501       ! 
    502       DEALLOCATE( mod_tide, phi_tide ) 
     496         ! 
     497         DEALLOCATE( mod_tide, phi_tide ) 
     498         ! 
     499      ENDIF 
    503500      ! 
    504501   END SUBROUTINE tide_init_elevation 
     
    512509      TYPE(TIDES_DATA), INTENT(inout) ::   td    ! tidal harmonics data 
    513510      ! 
    514       INTEGER ::   itide, igrd, ib       ! dummy loop indices 
    515       INTEGER, DIMENSION(3) ::   ilen0   ! length of boundary data (from OBC arrays) 
     511      INTEGER ::   itide, isz, ib        ! dummy loop indices 
    516512      REAL(wp),ALLOCATABLE, DIMENSION(:) ::   mod_tide, phi_tide 
    517513      !!---------------------------------------------------------------------- 
    518514      ! 
    519       ilen0(2) =  SIZE(td%u0(:,1,1)) 
    520       ilen0(3) =  SIZE(td%v0(:,1,1)) 
    521       ! 
    522       igrd=2                                 ! U grid. 
    523       ! 
    524       ALLOCATE( mod_tide(ilen0(igrd)) , phi_tide(ilen0(igrd)) ) 
    525       ! 
    526       DO itide = 1, nb_harmo 
    527          DO ib = 1, ilen0(igrd) 
    528             mod_tide(ib)=SQRT(td%u0(ib,itide,1)**2.+td%u0(ib,itide,2)**2.) 
    529             phi_tide(ib)=ATAN2(-td%u0(ib,itide,2),td%u0(ib,itide,1)) 
     515      IF( ASSOCIATED(td%u0) ) THEN   ! U grid. we use bdy u2d on this mpi subdomain 
     516         ! 
     517         isz = SIZE( td%u0, dim = 1 ) 
     518         ALLOCATE( mod_tide(isz), phi_tide(isz) ) 
     519         ! 
     520         DO itide = 1, nb_harmo 
     521            DO ib = 1, isz 
     522               mod_tide(ib)=SQRT( td%u0(ib,itide,1)*td%u0(ib,itide,1) + td%u0(ib,itide,2)*td%u0(ib,itide,2) ) 
     523               phi_tide(ib)=ATAN2(-td%u0(ib,itide,2),td%u0(ib,itide,1)) 
     524            END DO 
     525            DO ib = 1, isz 
     526               mod_tide(ib)=mod_tide(ib)*ftide(itide) 
     527               phi_tide(ib)=phi_tide(ib)+v0tide(itide)+utide(itide) 
     528            END DO 
     529            DO ib = 1, isz 
     530               td%u(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 
     531               td%u(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 
     532            END DO 
    530533         END DO 
    531          DO ib = 1, ilen0(igrd) 
    532             mod_tide(ib)=mod_tide(ib)*ftide(itide) 
    533             phi_tide(ib)=phi_tide(ib)+v0tide(itide)+utide(itide) 
    534          ENDDO 
    535          DO ib = 1, ilen0(igrd) 
    536             td%u(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 
    537             td%u(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 
    538          ENDDO 
    539       END DO 
    540       ! 
    541       DEALLOCATE( mod_tide , phi_tide ) 
    542       ! 
    543       igrd=3                                 ! V grid. 
    544       ! 
    545       ALLOCATE( mod_tide(ilen0(igrd)) , phi_tide(ilen0(igrd)) ) 
    546  
    547       DO itide = 1, nb_harmo 
    548          DO ib = 1, ilen0(igrd) 
    549             mod_tide(ib)=SQRT(td%v0(ib,itide,1)**2.+td%v0(ib,itide,2)**2.) 
    550             phi_tide(ib)=ATAN2(-td%v0(ib,itide,2),td%v0(ib,itide,1)) 
     534         ! 
     535         DEALLOCATE( mod_tide, phi_tide ) 
     536         ! 
     537      ENDIF 
     538      ! 
     539      IF( ASSOCIATED(td%v0) ) THEN   ! V grid. we use bdy u2d on this mpi subdomain 
     540         ! 
     541         isz = SIZE( td%v0, dim = 1 ) 
     542         ALLOCATE( mod_tide(isz), phi_tide(isz) ) 
     543         ! 
     544         DO itide = 1, nb_harmo 
     545            DO ib = 1, isz 
     546               mod_tide(ib)=SQRT( td%v0(ib,itide,1)*td%v0(ib,itide,1) + td%v0(ib,itide,2)*td%v0(ib,itide,2) ) 
     547               phi_tide(ib)=ATAN2(-td%v0(ib,itide,2),td%v0(ib,itide,1)) 
     548            END DO 
     549            DO ib = 1, isz 
     550               mod_tide(ib)=mod_tide(ib)*ftide(itide) 
     551               phi_tide(ib)=phi_tide(ib)+v0tide(itide)+utide(itide) 
     552            END DO 
     553            DO ib = 1, isz 
     554               td%v(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 
     555               td%v(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 
     556            END DO 
    551557         END DO 
    552          DO ib = 1, ilen0(igrd) 
    553             mod_tide(ib)=mod_tide(ib)*ftide(itide) 
    554             phi_tide(ib)=phi_tide(ib)+v0tide(itide)+utide(itide) 
    555          ENDDO 
    556          DO ib = 1, ilen0(igrd) 
    557             td%v(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 
    558             td%v(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 
    559          ENDDO 
    560       END DO 
    561       ! 
    562       DEALLOCATE( mod_tide, phi_tide ) 
    563       ! 
    564   END SUBROUTINE tide_init_velocities 
     558         ! 
     559         DEALLOCATE( mod_tide, phi_tide ) 
     560         ! 
     561      ENDIF 
     562      ! 
     563   END SUBROUTINE tide_init_velocities 
    565564 
    566565   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.