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 12928 for NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/BDY – NEMO

Ignore:
Timestamp:
2020-05-14T21:46:00+02:00 (4 years ago)
Author:
smueller
Message:

Synchronizing with /NEMO/trunk@12925 (ticket #2170)

Location:
NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser

    • Property svn:externals
      •  

        old new  
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
         8 
         9# SETTE 
         10^/utils/CI/sette@HEAD         sette 
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/BDY/bdy_oce.F90

    r12178 r12928  
    141141   LOGICAL, ALLOCATABLE, DIMENSION(:,:,:,:) ::   lsend_bdyext   !: mark needed communication for given boundary, grid and neighbour 
    142142   LOGICAL, ALLOCATABLE, DIMENSION(:,:,:,:) ::   lrecv_bdyext   !:  when searching towards the exterior of the computational domain 
     143   !! * Substitutions 
     144#  include "do_loop_substitute.h90" 
    143145   !!---------------------------------------------------------------------- 
    144146   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/BDY/bdydta.F90

    r12178 r12928  
    2323   USE phycst         ! physical constants 
    2424   USE sbcapr         ! atmospheric pressure forcing 
    25    USE sbctide        ! Tidal forcing or not 
     25   USE tide_mod, ONLY: ln_tide ! tidal forcing 
    2626   USE bdy_oce        ! ocean open boundary conditions   
    2727   USE bdytides       ! tidal forcing at boundaries 
     
    6868!$AGRIF_END_DO_NOT_TREAT 
    6969 
     70   !! * Substitutions 
     71#  include "do_loop_substitute.h90" 
    7072   !!---------------------------------------------------------------------- 
    7173   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    7577CONTAINS 
    7678 
    77    SUBROUTINE bdy_dta( kt, kit, kt_offset ) 
     79   SUBROUTINE bdy_dta( kt, Kmm ) 
    7880      !!---------------------------------------------------------------------- 
    7981      !!                   ***  SUBROUTINE bdy_dta  *** 
     
    8587      !!---------------------------------------------------------------------- 
    8688      INTEGER, INTENT(in)           ::   kt           ! ocean time-step index  
    87       INTEGER, INTENT(in), OPTIONAL ::   kit          ! subcycle time-step index (for timesplitting option) 
    88       INTEGER, INTENT(in), OPTIONAL ::   kt_offset    ! time offset in units of timesteps. NB. if kit 
    89       !                                               ! is present then units = subcycle timesteps. 
    90       !                                               ! kt_offset = 0 => get data at "now" time level 
    91       !                                               ! kt_offset = -1 => get data at "before" time level 
    92       !                                               ! kt_offset = +1 => get data at "after" time level 
    93       !                                               ! etc. 
     89      INTEGER, INTENT(in)           ::   Kmm          ! ocean time level index 
    9490      ! 
    9591      INTEGER ::  jbdy, jfld, jstart, jend, ib, jl    ! dummy loop indices 
    9692      INTEGER ::  ii, ij, ik, igrd, ipl               ! local integers 
    97       INTEGER,   DIMENSION(jpbgrd)     ::   ilen1  
    98       INTEGER,   DIMENSION(:), POINTER ::   nblen, nblenrim  ! short cuts 
    9993      TYPE(OBC_DATA)         , POINTER ::   dta_alias        ! short cut 
    10094      TYPE(FLD), DIMENSION(:), POINTER ::   bf_alias 
     
    10599      ! Initialise data arrays once for all from initial conditions where required 
    106100      !--------------------------------------------------------------------------- 
    107       IF( kt == nit000 .AND. .NOT.PRESENT(kit) ) THEN 
     101      IF( kt == nit000 ) THEN 
    108102 
    109103         ! Calculate depth-mean currents 
     
    112106         DO jbdy = 1, nb_bdy 
    113107            ! 
    114             nblen    => idx_bdy(jbdy)%nblen 
    115             nblenrim => idx_bdy(jbdy)%nblenrim 
    116             ! 
    117108            IF( nn_dyn2d_dta(jbdy) == 0 ) THEN  
    118                ilen1(:) = nblen(:) 
    119109               IF( dta_bdy(jbdy)%lneed_ssh ) THEN  
    120110                  igrd = 1 
    121                   DO ib = 1, ilen1(igrd) 
     111                  DO ib = 1, idx_bdy(jbdy)%nblenrim(igrd)   ! ssh is allocated and used only on the rim 
    122112                     ii = idx_bdy(jbdy)%nbi(ib,igrd) 
    123113                     ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    124                      dta_bdy(jbdy)%ssh(ib) = sshn(ii,ij) * tmask(ii,ij,1)          
     114                     dta_bdy(jbdy)%ssh(ib) = ssh(ii,ij,Kmm) * tmask(ii,ij,1)          
    125115                  END DO 
    126116               ENDIF 
    127                IF( dta_bdy(jbdy)%lneed_dyn2d) THEN  
     117               IF( ASSOCIATED(dta_bdy(jbdy)%u2d) ) THEN   ! no SIZE with a unassociated pointer. v2d and u2d can differ on subdomain 
    128118                  igrd = 2 
    129                   DO ib = 1, ilen1(igrd) 
     119                  DO ib = 1, SIZE(dta_bdy(jbdy)%u2d)      ! u2d is used either over the whole bdy or only on the rim 
    130120                     ii = idx_bdy(jbdy)%nbi(ib,igrd) 
    131121                     ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    132                      dta_bdy(jbdy)%u2d(ib) = un_b(ii,ij) * umask(ii,ij,1)          
     122                     dta_bdy(jbdy)%u2d(ib) = uu_b(ii,ij,Kmm) * umask(ii,ij,1)          
    133123                  END DO 
     124               ENDIF 
     125               IF( ASSOCIATED(dta_bdy(jbdy)%v2d) ) THEN   ! no SIZE with a unassociated pointer. v2d and u2d can differ on subdomain 
    134126                  igrd = 3 
    135                   DO ib = 1, ilen1(igrd) 
     127                  DO ib = 1, SIZE(dta_bdy(jbdy)%v2d)      ! v2d is used either over the whole bdy or only on the rim 
    136128                     ii = idx_bdy(jbdy)%nbi(ib,igrd) 
    137129                     ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    138                      dta_bdy(jbdy)%v2d(ib) = vn_b(ii,ij) * vmask(ii,ij,1)          
     130                     dta_bdy(jbdy)%v2d(ib) = vv_b(ii,ij,Kmm) * vmask(ii,ij,1)          
    139131                  END DO 
    140132               ENDIF 
     
    142134            ! 
    143135            IF( nn_dyn3d_dta(jbdy) == 0 ) THEN  
    144                ilen1(:) = nblen(:) 
    145136               IF( dta_bdy(jbdy)%lneed_dyn3d ) THEN  
    146137                  igrd = 2  
    147                   DO ib = 1, ilen1(igrd) 
     138                  DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
    148139                     DO ik = 1, jpkm1 
    149140                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
    150141                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    151                         dta_bdy(jbdy)%u3d(ib,ik) =  ( un(ii,ij,ik) - un_b(ii,ij) ) * umask(ii,ij,ik)          
     142                        dta_bdy(jbdy)%u3d(ib,ik) =  ( uu(ii,ij,ik,Kmm) - uu_b(ii,ij,Kmm) ) * umask(ii,ij,ik)          
    152143                     END DO 
    153144                  END DO 
    154145                  igrd = 3  
    155                   DO ib = 1, ilen1(igrd) 
     146                  DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
    156147                     DO ik = 1, jpkm1 
    157148                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
    158149                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    159                         dta_bdy(jbdy)%v3d(ib,ik) =  ( vn(ii,ij,ik) - vn_b(ii,ij) ) * vmask(ii,ij,ik)          
     150                        dta_bdy(jbdy)%v3d(ib,ik) =  ( vv(ii,ij,ik,Kmm) - vv_b(ii,ij,Kmm) ) * vmask(ii,ij,ik)          
    160151                     END DO 
    161152                  END DO 
     
    164155 
    165156            IF( nn_tra_dta(jbdy) == 0 ) THEN  
    166                ilen1(:) = nblen(:) 
    167157               IF( dta_bdy(jbdy)%lneed_tra ) THEN 
    168158                  igrd = 1  
    169                   DO ib = 1, ilen1(igrd) 
     159                  DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
    170160                     DO ik = 1, jpkm1 
    171161                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
    172162                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    173                         dta_bdy(jbdy)%tem(ib,ik) = tsn(ii,ij,ik,jp_bdytem) * tmask(ii,ij,ik)          
    174                         dta_bdy(jbdy)%sal(ib,ik) = tsn(ii,ij,ik,jp_bdysal) * tmask(ii,ij,ik)          
     163                        dta_bdy(jbdy)%tem(ib,ik) = ts(ii,ij,ik,jp_tem,Kmm) * tmask(ii,ij,ik)          
     164                        dta_bdy(jbdy)%sal(ib,ik) = ts(ii,ij,ik,jp_sal,Kmm) * tmask(ii,ij,ik)          
    175165                     END DO 
    176166                  END DO 
     
    180170#if defined key_si3 
    181171            IF( nn_ice_dta(jbdy) == 0 ) THEN    ! set ice to initial values 
    182                ilen1(:) = nblen(:) 
    183172               IF( dta_bdy(jbdy)%lneed_ice ) THEN 
    184173                  igrd = 1    
    185174                  DO jl = 1, jpl 
    186                      DO ib = 1, ilen1(igrd) 
     175                     DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
    187176                        ii = idx_bdy(jbdy)%nbi(ib,igrd) 
    188177                        ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     
    216205         ! read/update all bdy data 
    217206         ! ------------------------ 
    218          CALL fld_read( kt, 1, bf_alias, kit = kit, kt_offset = kt_offset ) 
    219  
     207         ! BDY: use pt_offset=0.5 as applied at the end of the step and fldread is referenced at the middle of the step 
     208         CALL fld_read( kt, 1, bf_alias, pt_offset = 0.5_wp, Kmm = Kmm ) 
    220209         ! apply some corrections in some specific cases... 
    221210         ! -------------------------------------------------- 
    222211         ! 
    223212         ! 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 
     213         IF( cn_tra(jbdy) == 'runoff' ) THEN   ! runoff 
    225214            ! 
    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 
     215            IF( ASSOCIATED(dta_bdy(jbdy)%u2d) ) THEN   ! no SIZE with a unassociated pointer. v2d and u2d can differ on subdomain 
     216               igrd = 2                         ! zonal flow (m3/s) to barotropic zonal velocity (m/s) 
     217               DO ib = 1, SIZE(dta_alias%u2d)   ! u2d is used either over the whole bdy or only on the rim 
     218                  ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     219                  ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
     220                  dta_alias%u2d(ib) = dta_alias%u2d(ib) / ( e2u(ii,ij) * hu_0(ii,ij) ) 
     221               END DO 
     222            ENDIF 
     223            IF( ASSOCIATED(dta_bdy(jbdy)%v2d) ) THEN   ! no SIZE with a unassociated pointer. v2d and u2d can differ on subdomain 
     224               igrd = 3                         ! meridional flow (m3/s) to barotropic meridional velocity (m/s) 
     225               DO ib = 1, SIZE(dta_alias%v2d)   ! v2d is used either over the whole bdy or only on the rim 
     226                  ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     227                  ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
     228                  dta_alias%v2d(ib) = dta_alias%v2d(ib) / ( e1v(ii,ij) * hv_0(ii,ij) ) 
     229               END DO 
     230            ENDIF 
    238231         ENDIF 
    239232 
    240233         ! tidal harmonic forcing ONLY: initialise arrays 
    241234         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 
     235            IF( ASSOCIATED(dta_alias%ssh) ) dta_alias%ssh(:) = 0._wp 
     236            IF( ASSOCIATED(dta_alias%u2d) ) dta_alias%u2d(:) = 0._wp 
     237            IF( ASSOCIATED(dta_alias%v2d) ) dta_alias%v2d(:) = 0._wp 
    245238         ENDIF 
    246239 
     
    249242            ! 
    250243            igrd = 2                       ! zonal velocity 
    251             dta_alias%u2d(:) = 0._wp       ! compute barotrope zonal velocity and put it in u2d 
    252244            DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
    253245               ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
    254246               ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
     247               dta_alias%u2d(ib) = 0._wp   ! compute barotrope zonal velocity and put it in u2d 
    255248               DO ik = 1, jpkm1 
    256                   dta_alias%u2d(ib) = dta_alias%u2d(ib) + e3u_n(ii,ij,ik) * umask(ii,ij,ik) * dta_alias%u3d(ib,ik) 
     249                  dta_alias%u2d(ib) = dta_alias%u2d(ib) + e3u(ii,ij,ik,Kmm) * umask(ii,ij,ik) * dta_alias%u3d(ib,ik) 
    257250               END DO 
    258                dta_alias%u2d(ib) =  dta_alias%u2d(ib) * r1_hu_n(ii,ij) 
     251               dta_alias%u2d(ib) =  dta_alias%u2d(ib) * r1_hu(ii,ij,Kmm) 
    259252               DO ik = 1, jpkm1            ! compute barocline zonal velocity and put it in u3d 
    260253                  dta_alias%u3d(ib,ik) = dta_alias%u3d(ib,ik) - dta_alias%u2d(ib) 
     
    262255            END DO 
    263256            igrd = 3                       ! meridional velocity 
    264             dta_alias%v2d(:) = 0._wp       ! compute barotrope meridional velocity and put it in v2d 
    265257            DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
    266258               ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
    267259               ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
     260               dta_alias%v2d(ib) = 0._wp   ! compute barotrope meridional velocity and put it in v2d 
    268261               DO ik = 1, jpkm1 
    269                   dta_alias%v2d(ib) = dta_alias%v2d(ib) + e3v_n(ii,ij,ik) * vmask(ii,ij,ik) * dta_alias%v3d(ib,ik) 
     262                  dta_alias%v2d(ib) = dta_alias%v2d(ib) + e3v(ii,ij,ik,Kmm) * vmask(ii,ij,ik) * dta_alias%v3d(ib,ik) 
    270263               END DO 
    271                dta_alias%v2d(ib) =  dta_alias%v2d(ib) * r1_hv_n(ii,ij) 
     264               dta_alias%v2d(ib) =  dta_alias%v2d(ib) * r1_hv(ii,ij,Kmm) 
    272265               DO ik = 1, jpkm1            ! compute barocline meridional velocity and put it in v3d 
    273266                  dta_alias%v3d(ib,ik) = dta_alias%v3d(ib,ik) - dta_alias%v2d(ib) 
     
    275268            END DO 
    276269         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 
    283270 
    284271         !  atm surface pressure : add inverted barometer effect to ssh if it was read 
     
    293280 
    294281#if defined key_si3 
    295          IF( dta_alias%lneed_ice ) THEN 
     282         IF( dta_alias%lneed_ice .AND. idx_bdy(jbdy)%nblen(1) > 0 ) THEN 
    296283            ! fill temperature and salinity arrays 
    297284            IF( TRIM(bf_alias(jp_bdyt_i)%clrootname) == 'NOT USED' )   bf_alias(jp_bdyt_i)%fnow(:,1,:) = rice_tem (jbdy) 
     
    302289               &                                                                         bf_alias(jp_bdya_i)%fnow(:,1,:)     !   ( a_ip = rice_apnd * a_i ) 
    303290            IF( TRIM(bf_alias(jp_bdyhip)%clrootname) == 'NOT USED' )   bf_alias(jp_bdyhip)%fnow(:,1,:) = rice_hpnd(jbdy) 
     291             
     292            ! if T_i is read and not T_su, set T_su = T_i 
     293            IF( TRIM(bf_alias(jp_bdyt_i)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdytsu)%clrootname) == 'NOT USED' ) & 
     294               &   bf_alias(jp_bdytsu)%fnow(:,1,:) = bf_alias(jp_bdyt_i)%fnow(:,1,:) 
     295            ! if T_s is read and not T_su, set T_su = T_s 
     296            IF( TRIM(bf_alias(jp_bdyt_s)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdytsu)%clrootname) == 'NOT USED' ) & 
     297               &   bf_alias(jp_bdytsu)%fnow(:,1,:) = bf_alias(jp_bdyt_s)%fnow(:,1,:) 
     298            ! if T_i is read and not T_s, set T_s = T_i 
     299            IF( TRIM(bf_alias(jp_bdyt_i)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdyt_s)%clrootname) == 'NOT USED' ) & 
     300               &   bf_alias(jp_bdyt_s)%fnow(:,1,:) = bf_alias(jp_bdyt_i)%fnow(:,1,:) 
     301            ! if T_su is read and not T_s, set T_s = T_su 
     302            IF( TRIM(bf_alias(jp_bdytsu)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdyt_s)%clrootname) == 'NOT USED' ) & 
     303               &   bf_alias(jp_bdyt_s)%fnow(:,1,:) = bf_alias(jp_bdytsu)%fnow(:,1,:) 
    304304            ! if T_su is read and not T_i, set T_i = (T_su + T_freeze)/2 
    305305            IF( TRIM(bf_alias(jp_bdytsu)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdyt_i)%clrootname) == 'NOT USED' ) & 
    306306               &   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,:) 
    313307            ! if T_s is read and not T_i, set T_i = (T_s + T_freeze)/2 
    314308            IF( TRIM(bf_alias(jp_bdyt_s)%clrootname) /= 'NOT USED' .AND. TRIM(bf_alias(jp_bdyt_i)%clrootname) == 'NOT USED' ) & 
     
    341335            DO jbdy = 1, nb_bdy      ! Tidal component added in ts loop 
    342336               IF ( nn_dyn2d_dta(jbdy) .GE. 2 ) THEN 
    343                   nblen => idx_bdy(jbdy)%nblen 
    344                   nblenrim => idx_bdy(jbdy)%nblenrim 
    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 
     337                  IF( ASSOCIATED(dta_bdy(jbdy)%ssh) ) dta_bdy_s(jbdy)%ssh(:) = dta_bdy(jbdy)%ssh(:) 
     338                  IF( ASSOCIATED(dta_bdy(jbdy)%u2d) ) dta_bdy_s(jbdy)%u2d(:) = dta_bdy(jbdy)%u2d(:) 
     339                  IF( ASSOCIATED(dta_bdy(jbdy)%v2d) ) dta_bdy_s(jbdy)%v2d(:) = dta_bdy(jbdy)%v2d(:) 
     340               ENDIF 
     341            END DO 
     342         ELSE ! Add tides if not split-explicit free surface else this is done in ts loop 
     343            ! 
     344            CALL bdy_dta_tides( kt=kt, pt_offset = 1._wp ) 
    355345         ENDIF 
    356          ! 
    357          IF( ln_timing )   CALL timing_stop('bdy_dta') 
    358          ! 
    359       END SUBROUTINE bdy_dta 
    360  
     346      ENDIF 
     347      ! 
     348      IF( ln_timing )   CALL timing_stop('bdy_dta') 
     349      ! 
     350   END SUBROUTINE bdy_dta 
     351    
    361352 
    362353   SUBROUTINE bdy_dta_init 
     
    373364      INTEGER ::   ierror, ios     !  
    374365      ! 
     366      INTEGER ::   nbdy_rdstart, nbdy_loc 
     367      CHARACTER(LEN=50)                      ::   cerrmsg       ! error string 
    375368      CHARACTER(len=3)                       ::   cl3           !  
    376369      CHARACTER(len=100)                     ::   cn_dir        ! Root directory for location of data files 
     
    388381      LOGICAL                                ::   llneed        ! 
    389382      LOGICAL                                ::   llread        ! 
     383      LOGICAL                                ::   llfullbdy     ! 
    390384      TYPE(FLD_N), DIMENSION(1), TARGET  ::   bn_tem, bn_sal, bn_u3d, bn_v3d   ! must be an array to be used with fld_fill 
    391385      TYPE(FLD_N), DIMENSION(1), TARGET  ::   bn_ssh, bn_u2d, bn_v2d           ! informations about the fields to be read 
     
    415409      ! Read namelists 
    416410      ! -------------- 
    417       REWIND(numnam_cfg) 
     411      nbdy_rdstart = 1 
    418412      DO jbdy = 1, nb_bdy 
    419413 
     
    421415         WRITE(ctmp2, '(a,i2)') 'block nambdy_dta number ', jbdy 
    422416 
    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) 
     417         ! There is only one nambdy_dta block in namelist_ref -> use it for each bdy so we read from the beginning 
    425418         READ  ( numnam_ref, nambdy_dta, IOSTAT = ios, ERR = 901) 
    426419901      IF( ios /= 0 )   CALL ctl_nam ( ios , 'nambdy_dta in reference namelist' ) 
     
    431424            & .OR. ( dta_bdy(jbdy)%lneed_tra   .AND.       nn_tra_dta(jbdy)    == 1 )   & 
    432425            & .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 
    434             READ  ( numnam_cfg, nambdy_dta, IOSTAT = ios, ERR = 902 ) 
     426            ! 
     427            ! Need to support possibility of reading more than one 
     428            ! nambdy_dta from the namelist_cfg internal file. 
     429            ! Do this by finding the jbdy'th occurence of nambdy_dta in the 
     430            ! character buffer as the starting point. 
     431            ! 
     432            nbdy_loc = INDEX( numnam_cfg( nbdy_rdstart: ), 'nambdy_dta' ) 
     433            IF( nbdy_loc .GT. 0 ) THEN 
     434               nbdy_rdstart = nbdy_rdstart + nbdy_loc 
     435            ELSE 
     436               WRITE(cerrmsg,'(A,I4,A)') 'Error: entry number ',jbdy,' of nambdy_dta not found' 
     437               ios = -1 
     438               CALL ctl_nam ( ios , cerrmsg ) 
     439            ENDIF 
     440            READ  ( numnam_cfg( MAX( 1, nbdy_rdstart - 2 ): ), nambdy_dta, IOSTAT = ios, ERR = 902) 
    435441902         IF( ios >  0 )   CALL ctl_nam ( ios , 'nambdy_dta in configuration namelist' ) 
    436442            IF(lwm) WRITE( numond, nambdy_dta )            
     
    442448            IF( nn_ice_dta(jbdy) == 1 ) THEN   ! if we get ice bdy data from netcdf file 
    443449               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 
     450               CALL fld_def( bf(jp_bdya_i,jbdy) ) 
     451               CALL iom_open( bf(jp_bdya_i,jbdy)%clname, bf(jp_bdya_i,jbdy)%num ) 
    445452               idvar = iom_varid( bf(jp_bdya_i,jbdy)%num, bf(jp_bdya_i,jbdy)%clvar, kndims=indims, kdimsz=i4dimsz, lduld=lluld ) 
    446453               IF( indims == 4 .OR. ( indims == 3 .AND. .NOT. lluld ) ) THEN   ;   ipl = i4dimsz(3)   ! xylt or xyl 
    447454               ELSE                                                            ;   ipl = 1            ! xy or xyt 
    448455               ENDIF 
     456               CALL iom_close( bf(jp_bdya_i,jbdy)%num ) 
     457               bf(jp_bdya_i,jbdy)%clrootname = 'NOT USED'   ! reset to default value as this subdomain may not need to read this bdy 
    449458            ENDIF 
    450459         ENDIF 
     
    487496               igrd = 2                                                    ! U point 
    488497               ipk = 1                                                     ! surface data 
    489                llneed = dta_bdy(jbdy)%lneed_dyn2d                          ! dta_bdy(jbdy)%ssh will be needed 
     498               llneed = dta_bdy(jbdy)%lneed_dyn2d                          ! dta_bdy(jbdy)%u2d will be needed 
    490499               llread = .NOT. ln_full_vel .AND. MOD(nn_dyn2d_dta(jbdy),2) == 1   ! don't get u2d from u3d and read NetCDF file 
    491500               bf_alias => bf(jp_bdyu2d,jbdy:jbdy)                         ! alias for u2d structure of bdy number jbdy 
    492501               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 
     502               llfullbdy = ln_full_vel .OR. cn_dyn2d(jbdy) == 'frs'        ! need u2d over the whole bdy or only over the rim? 
     503               IF( llfullbdy ) THEN  ;   iszdim = idx_bdy(jbdy)%nblen(igrd) 
     504               ELSE                  ;   iszdim = idx_bdy(jbdy)%nblenrim(igrd) 
    495505               ENDIF 
    496506            ENDIF 
     
    499509               igrd = 3                                                    ! V point 
    500510               ipk = 1                                                     ! surface data 
    501                llneed = dta_bdy(jbdy)%lneed_dyn2d                          ! dta_bdy(jbdy)%ssh will be needed 
     511               llneed = dta_bdy(jbdy)%lneed_dyn2d                          ! dta_bdy(jbdy)%v2d will be needed 
    502512               llread = .NOT. ln_full_vel .AND. MOD(nn_dyn2d_dta(jbdy),2) == 1   ! don't get v2d from v3d and read NetCDF file 
    503513               bf_alias => bf(jp_bdyv2d,jbdy:jbdy)                         ! alias for v2d structure of bdy number jbdy 
    504514               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 
     515               llfullbdy = ln_full_vel .OR. cn_dyn2d(jbdy) == 'frs'        ! need v2d over the whole bdy or only over the rim? 
     516               IF( llfullbdy ) THEN  ;   iszdim = idx_bdy(jbdy)%nblen(igrd) 
     517               ELSE                  ;   iszdim = idx_bdy(jbdy)%nblenrim(igrd) 
    507518               ENDIF 
    508519            ENDIF 
     
    615626            ENDIF 
    616627 
    617             IF( llneed ) THEN                                              ! dta_bdy(jbdy)%xxx will be needed 
     628            IF( llneed .AND. iszdim > 0 ) THEN                             ! dta_bdy(jbdy)%xxx will be needed 
    618629               !                                                           !   -> must be associated with an allocated target 
    619630               ALLOCATE( bf_alias(1)%fnow( iszdim, 1, ipk ) )              ! allocate the target 
     
    624635                  bf_alias(1)%imap    => idx_bdy(jbdy)%nbmap(1:iszdim,igrd)   ! associate the mapping used for this bdy 
    625636                  bf_alias(1)%igrd    = igrd                                  ! used only for vertical integration of 3D arrays 
     637                  bf_alias(1)%ibdy    = jbdy                                  !  "    "    "     "          "      "  "    "     
    626638                  bf_alias(1)%ltotvel = ln_full_vel                           ! T if u3d is full velocity 
    627639                  bf_alias(1)%lzint   = ln_zinterp                            ! T if it requires a vertical interpolation 
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/BDY/bdydyn.F90

    r10068 r12928  
    3737CONTAINS 
    3838 
    39    SUBROUTINE bdy_dyn( kt, dyn3d_only ) 
     39   SUBROUTINE bdy_dyn( kt, Kbb, puu, pvv, Kaa, dyn3d_only ) 
    4040      !!---------------------------------------------------------------------- 
    4141      !!                  ***  SUBROUTINE bdy_dyn  *** 
     
    4444      !! 
    4545      !!---------------------------------------------------------------------- 
    46       INTEGER, INTENT(in)           ::   kt           ! Main time step counter 
    47       LOGICAL, INTENT(in), OPTIONAL ::   dyn3d_only   ! T => only update baroclinic velocities 
     46      INTEGER                             , INTENT(in)    ::   kt           ! Main time step counter 
     47      INTEGER                             , INTENT(in)    ::   Kbb, Kaa     ! Ocean time level indices 
     48      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv     ! Ocean velocities (to be updated at open boundaries) 
     49      LOGICAL, OPTIONAL                   , INTENT(in)    ::   dyn3d_only   ! T => only update baroclinic velocities 
    4850      ! 
    4951      INTEGER ::   jk, ii, ij, ib_bdy, ib, igrd     ! Loop counter 
    5052      LOGICAL ::   ll_dyn2d, ll_dyn3d, ll_orlanski 
    51       REAL(wp), DIMENSION(jpi,jpj) :: pua2d, pva2d     ! after barotropic velocities 
     53      REAL(wp), DIMENSION(jpi,jpj) :: zua2d, zva2d     ! after barotropic velocities 
    5254      !!---------------------------------------------------------------------- 
    5355      ! 
     
    7072 
    7173      !                          ! "After" velocities:  
    72       pua2d(:,:) = 0._wp 
    73       pva2d(:,:) = 0._wp      
     74      zua2d(:,:) = 0._wp 
     75      zva2d(:,:) = 0._wp      
    7476      DO jk = 1, jpkm1 
    75          pua2d(:,:) = pua2d(:,:) + e3u_a(:,:,jk) * ua(:,:,jk) * umask(:,:,jk) 
    76          pva2d(:,:) = pva2d(:,:) + e3v_a(:,:,jk) * va(:,:,jk) * vmask(:,:,jk) 
     77         zua2d(:,:) = zua2d(:,:) + e3u(:,:,jk,Kaa) * puu(:,:,jk,Kaa) * umask(:,:,jk) 
     78         zva2d(:,:) = zva2d(:,:) + e3v(:,:,jk,Kaa) * pvv(:,:,jk,Kaa) * vmask(:,:,jk) 
    7779      END DO 
    78       pua2d(:,:) = pua2d(:,:) * r1_hu_a(:,:) 
    79       pva2d(:,:) = pva2d(:,:) * r1_hv_a(:,:) 
     80      zua2d(:,:) = zua2d(:,:) * r1_hu(:,:,Kaa) 
     81      zva2d(:,:) = zva2d(:,:) * r1_hv(:,:,Kaa) 
    8082 
    8183      DO jk = 1 , jpkm1 
    82          ua(:,:,jk) = ( ua(:,:,jk) - pua2d(:,:) ) * umask(:,:,jk) 
    83          va(:,:,jk) = ( va(:,:,jk) - pva2d(:,:) ) * vmask(:,:,jk) 
     84         puu(:,:,jk,Kaa) = ( puu(:,:,jk,Kaa) - zua2d(:,:) ) * umask(:,:,jk) 
     85         pvv(:,:,jk,Kaa) = ( pvv(:,:,jk,Kaa) - zva2d(:,:) ) * vmask(:,:,jk) 
    8486      END DO 
    8587 
     
    8789      IF( ll_orlanski ) THEN     ! "Before" velocities (Orlanski condition only)  
    8890         DO jk = 1 , jpkm1 
    89             ub(:,:,jk) = ( ub(:,:,jk) - ub_b(:,:) ) * umask(:,:,jk) 
    90             vb(:,:,jk) = ( vb(:,:,jk) - vb_b(:,:) ) * vmask(:,:,jk) 
     91            puu(:,:,jk,Kbb) = ( puu(:,:,jk,Kbb) - uu_b(:,:,Kbb) ) * umask(:,:,jk) 
     92            pvv(:,:,jk,Kbb) = ( pvv(:,:,jk,Kbb) - vv_b(:,:,Kbb) ) * vmask(:,:,jk) 
    9193         END DO 
    9294      ENDIF 
     
    9799      !------------------------------------------------------- 
    98100 
    99       IF( ll_dyn2d )   CALL bdy_dyn2d( kt, pua2d, pva2d, ub_b, vb_b, r1_hu_a(:,:), r1_hv_a(:,:), ssha ) 
     101      IF( ll_dyn2d )   CALL bdy_dyn2d( kt, zua2d, zva2d, uu_b(:,:,Kbb), vv_b(:,:,Kbb), r1_hu(:,:,Kaa), r1_hv(:,:,Kaa), ssh(:,:,Kaa) ) 
    100102 
    101       IF( ll_dyn3d )   CALL bdy_dyn3d( kt ) 
     103      IF( ll_dyn3d )   CALL bdy_dyn3d( kt, Kbb, puu, pvv, Kaa ) 
    102104 
    103105      !------------------------------------------------------- 
     
    106108      ! 
    107109      DO jk = 1 , jpkm1 
    108          ua(:,:,jk) = ( ua(:,:,jk) + pua2d(:,:) ) * umask(:,:,jk) 
    109          va(:,:,jk) = ( va(:,:,jk) + pva2d(:,:) ) * vmask(:,:,jk) 
     110         puu(:,:,jk,Kaa) = ( puu(:,:,jk,Kaa) + zua2d(:,:) ) * umask(:,:,jk) 
     111         pvv(:,:,jk,Kaa) = ( pvv(:,:,jk,Kaa) + zva2d(:,:) ) * vmask(:,:,jk) 
    110112      END DO 
    111113      ! 
    112114      IF ( ll_orlanski ) THEN 
    113115         DO jk = 1 , jpkm1 
    114             ub(:,:,jk) = ( ub(:,:,jk) + ub_b(:,:) ) * umask(:,:,jk) 
    115             vb(:,:,jk) = ( vb(:,:,jk) + vb_b(:,:) ) * vmask(:,:,jk) 
     116            puu(:,:,jk,Kbb) = ( puu(:,:,jk,Kbb) + uu_b(:,:,Kbb) ) * umask(:,:,jk) 
     117            pvv(:,:,jk,Kbb) = ( pvv(:,:,jk,Kbb) + vv_b(:,:,Kbb) ) * vmask(:,:,jk) 
    116118         END DO 
    117119      END IF 
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/BDY/bdydyn3d.F90

    r12178 r12928  
    3333CONTAINS 
    3434 
    35    SUBROUTINE bdy_dyn3d( kt ) 
     35   SUBROUTINE bdy_dyn3d( kt, Kbb, puu, pvv, Kaa ) 
    3636      !!---------------------------------------------------------------------- 
    3737      !!                  ***  SUBROUTINE bdy_dyn3d  *** 
     
    4040      !! 
    4141      !!---------------------------------------------------------------------- 
    42       INTEGER, INTENT(in) ::   kt   ! Main time step counter 
     42      INTEGER                             , INTENT( in    ) ::   kt        ! Main time step counter 
     43      INTEGER                             , INTENT( in    ) ::   Kbb, Kaa  ! Time level indices 
     44      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries) 
    4345      ! 
    4446      INTEGER  ::   ib_bdy, ir     ! BDY set index, rim index 
     
    5860            CASE('none')        ;   CYCLE 
    5961            CASE('frs' )        ! treat the whole boundary at once 
    60                IF( ir == 0) CALL bdy_dyn3d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
     62                       IF( ir == 0) CALL bdy_dyn3d_frs( puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
    6163            CASE('specified')   ! treat the whole rim      at once 
    62                IF( ir == 0) CALL bdy_dyn3d_spe( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
     64                       IF( ir == 0) CALL bdy_dyn3d_spe( puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
    6365            CASE('zero')        ! treat the whole rim      at once 
    64                IF( ir == 0) CALL bdy_dyn3d_zro( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
    65             CASE('orlanski' )   ;   CALL bdy_dyn3d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, llrim0, ll_npo=.false. ) 
    66             CASE('orlanski_npo');   CALL bdy_dyn3d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, llrim0, ll_npo=.true.  ) 
    67             CASE('zerograd')    ;   CALL bdy_dyn3d_zgrad( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy, llrim0 ) 
    68             CASE('neumann')     ;   CALL bdy_dyn3d_nmn( idx_bdy(ib_bdy), ib_bdy, llrim0 ) 
     66                       IF( ir == 0) CALL bdy_dyn3d_zro( puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
     67            CASE('orlanski' )   ;   CALL bdy_dyn3d_orlanski( Kbb, puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, llrim0, ll_npo=.false. ) 
     68            CASE('orlanski_npo');   CALL bdy_dyn3d_orlanski( Kbb, puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, llrim0, ll_npo=.true.  ) 
     69            CASE('zerograd')    ;   CALL bdy_dyn3d_zgrad( puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy, llrim0 ) 
     70            CASE('neumann')     ;   CALL bdy_dyn3d_nmn( puu, pvv, Kaa, idx_bdy(ib_bdy), ib_bdy, llrim0 ) 
    6971            CASE DEFAULT        ;   CALL ctl_stop( 'bdy_dyn3d : unrecognised option for open boundaries for baroclinic velocities' ) 
    7072            END SELECT 
     
    9799         ! 
    98100         IF( ANY(llsend2) .OR. ANY(llrecv2) ) THEN   ! if need to send/recv in at least one direction 
    99             CALL lbc_lnk( 'bdydyn2d', ua, 'U', -1., kfillmode=jpfillnothing ,lsend=llsend2, lrecv=llrecv2 ) 
     101            CALL lbc_lnk( 'bdydyn2d', puu(:,:,:,Kaa), 'U', -1., kfillmode=jpfillnothing ,lsend=llsend2, lrecv=llrecv2 ) 
    100102         END IF 
    101103         IF( ANY(llsend3) .OR. ANY(llrecv3) ) THEN   ! if need to send/recv in at least one direction 
    102             CALL lbc_lnk( 'bdydyn2d', va, 'V', -1., kfillmode=jpfillnothing ,lsend=llsend3, lrecv=llrecv3 ) 
     104            CALL lbc_lnk( 'bdydyn2d', pvv(:,:,:,Kaa), 'V', -1., kfillmode=jpfillnothing ,lsend=llsend3, lrecv=llrecv3 ) 
    103105         END IF 
    104106      END DO   ! ir 
     
    107109 
    108110 
    109    SUBROUTINE bdy_dyn3d_spe( idx, dta, kt , ib_bdy ) 
     111   SUBROUTINE bdy_dyn3d_spe( puu, pvv, Kaa, idx, dta, kt, ib_bdy ) 
    110112      !!---------------------------------------------------------------------- 
    111113      !!                  ***  SUBROUTINE bdy_dyn3d_spe  *** 
     
    115117      !! 
    116118      !!---------------------------------------------------------------------- 
    117       INTEGER        , INTENT(in) ::   kt      ! time step index 
    118       TYPE(OBC_INDEX), INTENT(in) ::   idx     ! OBC indices 
    119       TYPE(OBC_DATA) , INTENT(in) ::   dta     ! OBC external data 
    120       INTEGER        , INTENT(in) ::   ib_bdy  ! BDY set index 
     119      INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index 
     120      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries) 
     121      TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices 
     122      TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data 
     123      INTEGER                             , INTENT( in    ) ::   kt        ! Time step 
     124      INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index 
    121125      ! 
    122126      INTEGER  ::   jb, jk         ! dummy loop indices 
     
    129133            ii   = idx%nbi(jb,igrd) 
    130134            ij   = idx%nbj(jb,igrd) 
    131             ua(ii,ij,jk) = dta%u3d(jb,jk) * umask(ii,ij,jk) 
     135            puu(ii,ij,jk,Kaa) = dta%u3d(jb,jk) * umask(ii,ij,jk) 
    132136         END DO 
    133137      END DO 
     
    138142            ii   = idx%nbi(jb,igrd) 
    139143            ij   = idx%nbj(jb,igrd) 
    140             va(ii,ij,jk) = dta%v3d(jb,jk) * vmask(ii,ij,jk) 
     144            pvv(ii,ij,jk,Kaa) = dta%v3d(jb,jk) * vmask(ii,ij,jk) 
    141145         END DO 
    142146      END DO 
     
    145149 
    146150 
    147    SUBROUTINE bdy_dyn3d_zgrad( idx, dta, kt, ib_bdy, llrim0 ) 
     151   SUBROUTINE bdy_dyn3d_zgrad( puu, pvv, Kaa, idx, dta, kt, ib_bdy, llrim0 ) 
    148152      !!---------------------------------------------------------------------- 
    149153      !!                  ***  SUBROUTINE bdy_dyn3d_zgrad  *** 
     
    152156      !! 
    153157      !!---------------------------------------------------------------------- 
    154       INTEGER                     ::   kt 
    155       TYPE(OBC_INDEX), INTENT(in) ::   idx      ! OBC indices 
    156       TYPE(OBC_DATA),  INTENT(in) ::   dta      ! OBC external data 
    157       INTEGER,         INTENT(in) ::   ib_bdy   ! BDY set index 
    158       LOGICAL,         INTENT(in) ::   llrim0   ! indicate if rim 0 is treated 
     158      INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index 
     159      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries) 
     160      TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices 
     161      TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data 
     162      INTEGER                             , INTENT( in    ) ::   kt 
     163      INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index 
     164      LOGICAL                             , INTENT( in    ) ::   llrim0   ! indicate if rim 0 is treated 
    159165      !! 
    160166      INTEGER  ::   jb, jk         ! dummy loop indices 
     
    178184            ! 
    179185            DO jk = 1, jpkm1 
    180                ua(ii,ij,jk) = ua(ii,ij+flagv,jk) * umask(ii,ij+flagv,jk) 
     186               puu(ii,ij,jk,Kaa) = puu(ii,ij+flagv,jk,Kaa) * umask(ii,ij+flagv,jk) 
    181187            END DO 
    182188            ! 
     
    198204            ! 
    199205            DO jk = 1, jpkm1 
    200                va(ii,ij,jk) = va(ii+flagu,ij,jk) * vmask(ii+flagu,ij,jk) 
     206               pvv(ii,ij,jk,Kaa) = pvv(ii+flagu,ij,jk,Kaa) * vmask(ii+flagu,ij,jk) 
    201207            END DO 
    202208            ! 
     
    207213 
    208214 
    209    SUBROUTINE bdy_dyn3d_zro( idx, dta, kt, ib_bdy ) 
     215   SUBROUTINE bdy_dyn3d_zro( puu, pvv, Kaa, idx, dta, kt, ib_bdy ) 
    210216      !!---------------------------------------------------------------------- 
    211217      !!                  ***  SUBROUTINE bdy_dyn3d_zro  *** 
     
    214220      !! 
    215221      !!---------------------------------------------------------------------- 
    216       INTEGER        , INTENT(in) ::   kt      ! time step index 
    217       TYPE(OBC_INDEX), INTENT(in) ::   idx     ! OBC indices 
    218       TYPE(OBC_DATA) , INTENT(in) ::   dta     ! OBC external data 
    219       INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
     222      INTEGER                             , INTENT( in    ) ::   kt        ! time step index 
     223      INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index 
     224      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries) 
     225      TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices 
     226      TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data 
     227      INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index 
    220228      ! 
    221229      INTEGER  ::   ib, ik         ! dummy loop indices 
     
    228236         ij = idx%nbj(ib,igrd) 
    229237         DO ik = 1, jpkm1 
    230             ua(ii,ij,ik) = 0._wp 
     238            puu(ii,ij,ik,Kaa) = 0._wp 
    231239         END DO 
    232240      END DO 
     
    237245         ij = idx%nbj(ib,igrd) 
    238246         DO ik = 1, jpkm1 
    239             va(ii,ij,ik) = 0._wp 
     247            pvv(ii,ij,ik,Kaa) = 0._wp 
    240248         END DO 
    241249      END DO 
     
    244252 
    245253 
    246    SUBROUTINE bdy_dyn3d_frs( idx, dta, kt, ib_bdy ) 
     254   SUBROUTINE bdy_dyn3d_frs( puu, pvv, Kaa, idx, dta, kt, ib_bdy ) 
    247255      !!---------------------------------------------------------------------- 
    248256      !!                  ***  SUBROUTINE bdy_dyn3d_frs  *** 
     
    255263      !!               topography. Tellus, 365-382. 
    256264      !!---------------------------------------------------------------------- 
    257       INTEGER        , INTENT(in) ::   kt      ! time step index 
    258       TYPE(OBC_INDEX), INTENT(in) ::   idx     ! OBC indices 
    259       TYPE(OBC_DATA) , INTENT(in) ::   dta     ! OBC external data 
    260       INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
     265      INTEGER                             , INTENT( in    ) ::   kt        ! time step index 
     266      INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index 
     267      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries) 
     268      TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices 
     269      TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data 
     270      INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index 
    261271      ! 
    262272      INTEGER  ::   jb, jk         ! dummy loop indices 
     
    271281            ij   = idx%nbj(jb,igrd) 
    272282            zwgt = idx%nbw(jb,igrd) 
    273             ua(ii,ij,jk) = ( ua(ii,ij,jk) + zwgt * ( dta%u3d(jb,jk) - ua(ii,ij,jk) ) ) * umask(ii,ij,jk) 
     283            puu(ii,ij,jk,Kaa) = ( puu(ii,ij,jk,Kaa) + zwgt * ( dta%u3d(jb,jk) - puu(ii,ij,jk,Kaa) ) ) * umask(ii,ij,jk) 
    274284         END DO 
    275285      END DO 
     
    281291            ij   = idx%nbj(jb,igrd) 
    282292            zwgt = idx%nbw(jb,igrd) 
    283             va(ii,ij,jk) = ( va(ii,ij,jk) + zwgt * ( dta%v3d(jb,jk) - va(ii,ij,jk) ) ) * vmask(ii,ij,jk) 
     293            pvv(ii,ij,jk,Kaa) = ( pvv(ii,ij,jk,Kaa) + zwgt * ( dta%v3d(jb,jk) - pvv(ii,ij,jk,Kaa) ) ) * vmask(ii,ij,jk) 
    284294         END DO 
    285295      END DO    
     
    288298 
    289299 
    290    SUBROUTINE bdy_dyn3d_orlanski( idx, dta, ib_bdy, llrim0, ll_npo ) 
     300   SUBROUTINE bdy_dyn3d_orlanski( Kbb, puu, pvv, Kaa, idx, dta, ib_bdy, llrim0, ll_npo ) 
    291301      !!---------------------------------------------------------------------- 
    292302      !!                 ***  SUBROUTINE bdy_dyn3d_orlanski  *** 
     
    298308      !! References:  Marchesiello, McWilliams and Shchepetkin, Ocean Modelling vol. 3 (2001)     
    299309      !!---------------------------------------------------------------------- 
    300       TYPE(OBC_INDEX),              INTENT(in) ::   idx  ! OBC indices 
    301       TYPE(OBC_DATA),               INTENT(in) ::   dta  ! OBC external data 
    302       INTEGER,                      INTENT(in) ::   ib_bdy   ! BDY set index 
    303       LOGICAL,                      INTENT(in) ::   llrim0   ! indicate if rim 0 is treated 
    304       LOGICAL,                      INTENT(in) ::   ll_npo   ! switch for NPO version 
     310      INTEGER                             , INTENT( in    ) ::   Kbb, Kaa  ! Time level indices 
     311      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries) 
     312      TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices 
     313      TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data 
     314      INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index 
     315      LOGICAL                             , INTENT( in    ) ::   llrim0    ! indicate if rim 0 is treated 
     316      LOGICAL                             , INTENT( in    ) ::   ll_npo    ! switch for NPO version 
    305317 
    306318      INTEGER  ::   jb, igrd                               ! dummy loop indices 
    307319      !!---------------------------------------------------------------------- 
    308320      ! 
    309       !! Note that at this stage the ub and ua arrays contain the baroclinic velocities.  
     321      !! Note that at this stage the puu(:,:,:,Kbb) and puu(:,:,:,Kaa) arrays contain the baroclinic velocities.  
    310322      ! 
    311323      igrd = 2      ! Orlanski bc on u-velocity;  
    312324      !             
    313       CALL bdy_orlanski_3d( idx, igrd, ub, ua, dta%u3d, ll_npo, llrim0 ) 
     325      CALL bdy_orlanski_3d( idx, igrd, puu(:,:,:,Kbb), puu(:,:,:,Kaa), dta%u3d, ll_npo, llrim0 ) 
    314326 
    315327      igrd = 3      ! Orlanski bc on v-velocity 
    316328      !   
    317       CALL bdy_orlanski_3d( idx, igrd, vb, va, dta%v3d, ll_npo, llrim0 ) 
     329      CALL bdy_orlanski_3d( idx, igrd, pvv(:,:,:,Kbb), pvv(:,:,:,Kaa), dta%v3d, ll_npo, llrim0 ) 
    318330      ! 
    319331   END SUBROUTINE bdy_dyn3d_orlanski 
    320332 
    321333 
    322    SUBROUTINE bdy_dyn3d_dmp( kt ) 
     334   SUBROUTINE bdy_dyn3d_dmp( kt, Kbb, puu, pvv, Krhs ) 
    323335      !!---------------------------------------------------------------------- 
    324336      !!                  ***  SUBROUTINE bdy_dyn3d_dmp  *** 
     
    327339      !! 
    328340      !!---------------------------------------------------------------------- 
    329       INTEGER, INTENT(in) ::   kt   ! time step index 
     341      INTEGER                             , INTENT( in    ) ::   kt        ! time step 
     342      INTEGER                             , INTENT( in    ) ::   Kbb, Krhs ! Time level indices 
     343      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities and trends (to be updated at open boundaries) 
    330344      ! 
    331345      INTEGER  ::   jb, jk         ! dummy loop indices 
     
    345359               zwgt = idx_bdy(ib_bdy)%nbd(jb,igrd) 
    346360               DO jk = 1, jpkm1 
    347                   ua(ii,ij,jk) = ( ua(ii,ij,jk) + zwgt * ( dta_bdy(ib_bdy)%u3d(jb,jk) - & 
    348                                    ub(ii,ij,jk) + ub_b(ii,ij)) ) * umask(ii,ij,jk) 
     361                  puu(ii,ij,jk,Krhs) = ( puu(ii,ij,jk,Krhs) + zwgt * ( dta_bdy(ib_bdy)%u3d(jb,jk) - & 
     362                                   puu(ii,ij,jk,Kbb) + uu_b(ii,ij,Kbb)) ) * umask(ii,ij,jk) 
    349363               END DO 
    350364            END DO 
     
    356370               zwgt = idx_bdy(ib_bdy)%nbd(jb,igrd) 
    357371               DO jk = 1, jpkm1 
    358                   va(ii,ij,jk) = ( va(ii,ij,jk) + zwgt * ( dta_bdy(ib_bdy)%v3d(jb,jk) -  & 
    359                                    vb(ii,ij,jk) + vb_b(ii,ij)) ) * vmask(ii,ij,jk) 
     372                  pvv(ii,ij,jk,Krhs) = ( pvv(ii,ij,jk,Krhs) + zwgt * ( dta_bdy(ib_bdy)%v3d(jb,jk) -  & 
     373                                   pvv(ii,ij,jk,Kbb) + vv_b(ii,ij,Kbb)) ) * vmask(ii,ij,jk) 
    360374               END DO 
    361375            END DO 
     
    368382 
    369383 
    370    SUBROUTINE bdy_dyn3d_nmn( idx, ib_bdy, llrim0 ) 
     384   SUBROUTINE bdy_dyn3d_nmn( puu, pvv, Kaa, idx, ib_bdy, llrim0 ) 
    371385      !!---------------------------------------------------------------------- 
    372386      !!                 ***  SUBROUTINE bdy_dyn3d_nmn  *** 
     
    377391      !! 
    378392      !!---------------------------------------------------------------------- 
    379       TYPE(OBC_INDEX), INTENT(in) ::   idx      ! OBC indices 
    380       INTEGER,         INTENT(in) ::   ib_bdy   ! BDY set index 
    381       LOGICAL,         INTENT(in) ::   llrim0   ! indicate if rim 0 is treated 
     393      INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index 
     394      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries) 
     395      TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices 
     396      INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index 
     397      LOGICAL                             , INTENT( in    ) ::   llrim0    ! indicate if rim 0 is treated 
    382398      INTEGER  ::   igrd                        ! dummy indice 
    383399      !!---------------------------------------------------------------------- 
    384400      ! 
    385       !! Note that at this stage the ub and ua arrays contain the baroclinic velocities.  
     401      !! Note that at this stage the puu(:,:,:,Kbb) and puu(:,:,:,Kaa) arrays contain the baroclinic velocities.  
    386402      ! 
    387403      igrd = 2      ! Neumann bc on u-velocity;  
    388404      !             
    389       CALL bdy_nmn( idx, igrd, ua, llrim0 )   ! ua is masked 
     405      CALL bdy_nmn( idx, igrd, puu(:,:,:,Kaa), llrim0 ) 
    390406 
    391407      igrd = 3      ! Neumann bc on v-velocity 
    392408      !   
    393       CALL bdy_nmn( idx, igrd, va, llrim0 )   ! va is masked 
     409      CALL bdy_nmn( idx, igrd, pvv(:,:,:,Kaa), llrim0 ) 
    394410      ! 
    395411   END SUBROUTINE bdy_dyn3d_nmn 
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/BDY/bdyice.F90

    r12178 r12928  
    179179 
    180180            ! Then, a) transfer the snow excess into the ice (different from icethd_dh) 
    181             zdh = MAX( 0._wp, ( rhos * h_s(ji,jj,jl) + ( rhoi - rau0 ) * h_i(ji,jj,jl) ) * r1_rau0 ) 
     181            zdh = MAX( 0._wp, ( rhos * h_s(ji,jj,jl) + ( rhoi - rho0 ) * h_i(ji,jj,jl) ) * r1_rho0 ) 
    182182            ! Or, b) transfer all the snow into ice (if incoming ice is likely to melt as it comes into a warmer environment) 
    183183            !zdh = MAX( 0._wp, h_s(ji,jj,jl) * rhos / rhoi ) 
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/BDY/bdyini.F90

    r12178 r12928  
    1919   USE oce            ! ocean dynamics and tracers variables 
    2020   USE dom_oce        ! ocean space and time domain 
     21   USE sbc_oce , ONLY: nn_ice 
    2122   USE bdy_oce        ! unstructured open boundary conditions 
    2223   USE bdydta         ! open boundary cond. setting   (bdy_dta_init routine) 
    2324   USE bdytides       ! open boundary cond. setting   (bdytide_init routine) 
    24    USE sbctide        ! Tidal forcing or not 
    25    USE phycst   , ONLY: rday 
     25   USE tide_mod, ONLY: ln_tide ! tidal forcing 
     26   USE phycst  , ONLY: rday 
    2627   ! 
    2728   USE in_out_manager ! I/O units 
     
    7576      ! Read namelist parameters 
    7677      ! ------------------------ 
    77       REWIND( numnam_ref )              ! Namelist nambdy in reference namelist :Unstructured open boundaries 
    7878      READ  ( numnam_ref, nambdy, IOSTAT = ios, ERR = 901) 
    7979901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nambdy in reference namelist' ) 
     
    9393      cn_ice         (2:jp_bdy) = cn_ice         (1) 
    9494      nn_ice_dta     (2:jp_bdy) = nn_ice_dta     (1) 
    95       REWIND( numnam_cfg )              ! Namelist nambdy in configuration namelist :Unstructured open boundaries 
    9695      READ  ( numnam_cfg, nambdy, IOSTAT = ios, ERR = 902 ) 
    9796902   IF( ios >  0 )   CALL ctl_nam ( ios , 'nambdy in configuration namelist' ) 
     
    317316 
    318317         dta_bdy(ib_bdy)%lneed_ice = cn_ice(ib_bdy) /= 'none' 
     318 
     319         IF( dta_bdy(ib_bdy)%lneed_ice .AND. nn_ice /= 2 ) THEN 
     320            WRITE(ctmp1,*) 'bdy number ', ib_bdy,', needs ice model but nn_ice = ', nn_ice 
     321            CALL ctl_stop( ctmp1 ) 
     322         ENDIF 
    319323 
    320324         IF( lwp .AND. dta_bdy(ib_bdy)%lneed_ice ) THEN  
     
    364368      ! ------------------------------------------------- 
    365369 
    366       REWIND( numnam_cfg )      
    367370      nblendta(:,:) = 0 
    368371      nbdysege = 0 
     
    398401      jpbdta = MAXVAL(nblendta(1:jpbgrd,1:nb_bdy)) 
    399402      ALLOCATE( nbidta(jpbdta, jpbgrd, nb_bdy), nbjdta(jpbdta, jpbgrd, nb_bdy), nbrdta(jpbdta, jpbgrd, nb_bdy) ) 
    400      
     403      nbrdta(:,:,:) = 0   ! initialize nbrdta as it may not be completely defined for each bdy 
     404       
    401405      ! Calculate global boundary index arrays or read in from file 
    402406      !------------------------------------------------------------                
     
    10791083      INTEGER          ::   ios                 ! Local integer output status for namelist read 
    10801084      INTEGER          ::   nbdyind, nbdybeg, nbdyend 
     1085      INTEGER          ::   nbdy_count, nbdy_rdstart, nbdy_loc 
    10811086      CHARACTER(LEN=1) ::   ctypebdy   !     -        -  
     1087      CHARACTER(LEN=50)::   cerrmsg    !     -        -  
    10821088      NAMELIST/nambdy_index/ ctypebdy, nbdyind, nbdybeg, nbdyend 
    10831089      !!---------------------------------------------------------------------- 
    1084  
    1085       ! No REWIND here because may need to read more than one nambdy_index namelist. 
    1086       ! Read only namelist_cfg to avoid unseccessfull overwrite  
    1087       ! keep full control of the configuration namelist 
    1088       READ  ( numnam_cfg, nambdy_index, IOSTAT = ios, ERR = 904 ) 
     1090      ! Need to support possibility of reading more than one nambdy_index from 
     1091      ! the namelist_cfg internal file. 
     1092      ! Do this by finding the kb_bdy'th occurence of nambdy_index in the 
     1093      ! character buffer as the starting point. 
     1094      nbdy_rdstart = 1 
     1095      DO nbdy_count = 1, kb_bdy 
     1096       nbdy_loc = INDEX( numnam_cfg( nbdy_rdstart: ), 'nambdy_index' ) 
     1097       IF( nbdy_loc .GT. 0 ) THEN 
     1098          nbdy_rdstart = nbdy_rdstart + nbdy_loc 
     1099       ELSE 
     1100          WRITE(cerrmsg,'(A,I4,A)') 'Error: entry number ',kb_bdy,' of nambdy_index not found' 
     1101          ios = -1 
     1102          CALL ctl_nam ( ios , cerrmsg ) 
     1103       ENDIF 
     1104      END DO 
     1105      nbdy_rdstart = MAX( 1, nbdy_rdstart - 2 ) 
     1106      READ  ( numnam_cfg( nbdy_rdstart: ), nambdy_index, IOSTAT = ios, ERR = 904) 
    10891107904   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nambdy_index in configuration namelist' ) 
    10901108      IF(lwm) WRITE ( numond, nambdy_index ) 
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/BDY/bdylib.F90

    r12178 r12928  
    3535CONTAINS 
    3636 
    37    SUBROUTINE bdy_frs( idx, pta, dta ) 
     37   SUBROUTINE bdy_frs( idx, phia, dta ) 
    3838      !!---------------------------------------------------------------------- 
    3939      !!                 ***  SUBROUTINE bdy_frs  *** 
     
    4545      TYPE(OBC_INDEX),                     INTENT(in) ::   idx  ! OBC indices 
    4646      REAL(wp), DIMENSION(:,:),            INTENT(in) ::   dta  ! OBC external data 
    47       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pta  ! tracer trend 
     47      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   phia  ! tracer trend 
    4848      !! 
    4949      REAL(wp) ::   zwgt           ! boundary weight 
     
    5858            ij = idx%nbj(ib,igrd) 
    5959            zwgt = idx%nbw(ib,igrd) 
    60             pta(ii,ij,ik) = ( pta(ii,ij,ik) + zwgt * (dta(ib,ik) - pta(ii,ij,ik) ) ) * tmask(ii,ij,ik) 
     60            phia(ii,ij,ik) = ( phia(ii,ij,ik) + zwgt * (dta(ib,ik) - phia(ii,ij,ik) ) ) * tmask(ii,ij,ik) 
    6161         END DO 
    6262      END DO 
     
    6565 
    6666 
    67    SUBROUTINE bdy_spe( idx, pta, dta ) 
     67   SUBROUTINE bdy_spe( idx, phia, dta ) 
    6868      !!---------------------------------------------------------------------- 
    6969      !!                 ***  SUBROUTINE bdy_spe  *** 
     
    7474      TYPE(OBC_INDEX),                     INTENT(in) ::   idx  ! OBC indices 
    7575      REAL(wp), DIMENSION(:,:),            INTENT(in) ::   dta  ! OBC external data 
    76       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pta  ! tracer trend 
     76      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   phia  ! tracer trend 
    7777      !! 
    7878      INTEGER  ::   ib, ik, igrd   ! dummy loop indices 
     
    8585         ij = idx%nbj(ib,igrd) 
    8686         DO ik = 1, jpkm1 
    87             pta(ii,ij,ik) = dta(ib,ik) * tmask(ii,ij,ik) 
     87            phia(ii,ij,ik) = dta(ib,ik) * tmask(ii,ij,ik) 
    8888         END DO 
    8989      END DO 
     
    9292 
    9393 
    94    SUBROUTINE bdy_orl( idx, ptb, pta, dta, lrim0, ll_npo ) 
     94   SUBROUTINE bdy_orl( idx, phib, phia, dta, lrim0, ll_npo ) 
    9595      !!---------------------------------------------------------------------- 
    9696      !!                 ***  SUBROUTINE bdy_orl  *** 
     
    102102      TYPE(OBC_INDEX),                     INTENT(in) ::   idx  ! OBC indices 
    103103      REAL(wp), DIMENSION(:,:),            INTENT(in) ::   dta  ! OBC external data 
    104       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   ptb  ! before tracer field 
    105       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pta  ! tracer trend 
     104      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   phib  ! before tracer field 
     105      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   phia  ! tracer trend 
    106106      LOGICAL                 , OPTIONAL,  INTENT(in) ::   lrim0   ! indicate if rim 0 is treated 
    107107      LOGICAL,                             INTENT(in) ::   ll_npo  ! switch for NPO version 
     
    112112      igrd = 1                       ! Everything is at T-points here 
    113113      ! 
    114       CALL bdy_orlanski_3d( idx, igrd, ptb(:,:,:), pta(:,:,:), dta, lrim0, ll_npo ) 
     114      CALL bdy_orlanski_3d( idx, igrd, phib(:,:,:), phia(:,:,:), dta, lrim0, ll_npo ) 
    115115      ! 
    116116   END SUBROUTINE bdy_orl 
     
    240240         ! Centred derivative is calculated as average of "left" and "right" derivatives for  
    241241         ! this reason.  
    242          ! Note no rdt factor in expression for zdt because it cancels in the expressions for  
     242         ! Note no rn_Dt factor in expression for zdt because it cancels in the expressions for  
    243243         ! zrx and zry. 
    244244         zdt   =     phia(iibm1   ,ijbm1   ) - phib(iibm1   ,ijbm1   ) 
     
    259259         zout = sign( 1., zrx ) 
    260260         zout = 0.5*( zout + abs(zout) ) 
    261          zwgt = 2.*rdt*( (1.-zout) * idx%nbd(jb,igrd) + zout * idx%nbdout(jb,igrd) ) 
     261         zwgt = 2.*rn_Dt*( (1.-zout) * idx%nbd(jb,igrd) + zout * idx%nbdout(jb,igrd) ) 
    262262         ! only apply radiation on outflow points  
    263263         if( ll_npo ) then     !! NPO version !! 
     
    425425            zout = sign( 1., zrx ) 
    426426            zout = 0.5*( zout + abs(zout) ) 
    427             zwgt = 2.*rdt*( (1.-zout) * idx%nbd(jb,igrd) + zout * idx%nbdout(jb,igrd) ) 
     427            zwgt = 2.*rn_Dt*( (1.-zout) * idx%nbd(jb,igrd) + zout * idx%nbdout(jb,igrd) ) 
    428428            ! only apply radiation on outflow points  
    429429            if( ll_npo ) then     !! NPO version !! 
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/BDY/bdytides.F90

    r12178 r12928  
    1818   USE phycst         ! physical constants 
    1919   USE bdy_oce        ! ocean open boundary conditions 
    20    USE tideini        !  
     20   USE tide_mod       !  
    2121   USE daymod         ! calendar 
    2222   ! 
     
    3030 
    3131   PUBLIC   bdytide_init     ! routine called in bdy_init 
    32    PUBLIC   bdytide_update   ! routine called in bdy_dta 
    3332   PUBLIC   bdy_dta_tides    ! routine called in dyn_spg_ts 
    3433 
     
    4544   TYPE(OBC_DATA)  , PUBLIC, DIMENSION(jp_bdy) :: dta_bdy_s  !: bdy external data (slow component) 
    4645 
     46   INTEGER ::   kt_tide 
     47 
     48   !! * Substitutions 
     49#  include "do_loop_substitute.h90" 
    4750   !!---------------------------------------------------------------------- 
    4851   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    6265      !! namelist variables 
    6366      !!------------------- 
    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 
     67      CHARACTER(len=80)                         ::   filtide             ! Filename root for tidal input files 
     68      LOGICAL                                   ::   ln_bdytide_2ddta    ! If true, read 2d harmonic data 
    6769      !! 
    68       INTEGER                                   ::   ib_bdy, itide, ib   !: dummy loop indices 
    69       INTEGER                                   ::   ii, ij              !: dummy loop indices 
     70      INTEGER                                   ::   ib_bdy, itide, ib   ! dummy loop indices 
     71      INTEGER                                   ::   ii, ij              ! dummy loop indices 
    7072      INTEGER                                   ::   inum, igrd 
    71       INTEGER, DIMENSION(3)                     ::   ilen0       !: length of boundary data (from OBC arrays) 
     73      INTEGER                                   ::   isz                 ! bdy data size 
    7274      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            !:  "     "    "   "   "   "        "      "  
     75      INTEGER                                   ::   nbdy_rdstart, nbdy_loc 
     76      CHARACTER(LEN=50)                         ::   cerrmsg             ! error string 
     77      CHARACTER(len=80)                         ::   clfile              ! full file name for tidal input file  
     78      REAL(wp),ALLOCATABLE, DIMENSION(:,:,:)    ::   dta_read            ! work space to read in tidal harmonics data 
     79      REAL(wp),ALLOCATABLE, DIMENSION(:,:)      ::   ztr, zti            !  "     "    "   "   "   "        "      "  
    7680      !! 
    77       TYPE(TIDES_DATA),  POINTER                ::   td                  !: local short cut    
     81      TYPE(TIDES_DATA), POINTER                 ::   td                  ! local short cut    
     82      TYPE(  OBC_DATA), POINTER                 ::   dta                 ! local short cut 
    7883      !! 
    79       NAMELIST/nambdy_tide/filtide, ln_bdytide_2ddta, ln_bdytide_conj 
     84      NAMELIST/nambdy_tide/filtide, ln_bdytide_2ddta 
    8085      !!---------------------------------------------------------------------- 
    8186      ! 
     
    8489      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 
    8590 
    86       REWIND(numnam_cfg) 
    87  
     91 
     92      nbdy_rdstart = 1 
    8893      DO ib_bdy = 1, nb_bdy 
    8994         IF( nn_dyn2d_dta(ib_bdy) >= 2 ) THEN 
    9095            ! 
    91             td => tides(ib_bdy) 
    92  
     96            td  => tides(ib_bdy) 
     97            dta => dta_bdy(ib_bdy) 
     98          
    9399            ! Namelist nambdy_tide : tidal harmonic forcing at open boundaries 
    94100            filtide(:) = '' 
    95101 
    96             REWIND( numnam_ref ) 
    97102            READ  ( numnam_ref, nambdy_tide, IOSTAT = ios, ERR = 901) 
    98103901         IF( ios /= 0 )   CALL ctl_nam ( ios , 'nambdy_tide in reference namelist' ) 
    99             ! Don't REWIND here - may need to read more than one of these namelists.  
    100             READ  ( numnam_cfg, nambdy_tide, IOSTAT = ios, ERR = 902 ) 
     104            ! 
     105            ! Need to support possibility of reading more than one 
     106            ! nambdy_tide from the namelist_cfg internal file. 
     107            ! Do this by finding the ib_bdy'th occurence of nambdy_tide in the 
     108            ! character buffer as the starting point. 
     109            ! 
     110            nbdy_loc = INDEX( numnam_cfg( nbdy_rdstart: ), 'nambdy_tide' ) 
     111            IF( nbdy_loc .GT. 0 ) THEN 
     112               nbdy_rdstart = nbdy_rdstart + nbdy_loc 
     113            ELSE 
     114               WRITE(cerrmsg,'(A,I4,A)') 'Error: entry number ',ib_bdy,' of nambdy_tide not found' 
     115               ios = -1 
     116               CALL ctl_nam ( ios , cerrmsg ) 
     117            ENDIF 
     118            READ  ( numnam_cfg( MAX( 1, nbdy_rdstart - 2 ): ), nambdy_tide, IOSTAT = ios, ERR = 902) 
    101119902         IF( ios >  0 )   CALL ctl_nam ( ios , 'nambdy_tide in configuration namelist' ) 
    102120            IF(lwm) WRITE ( numond, nambdy_tide ) 
     
    105123            IF(lwp) WRITE(numout,*) '          Namelist nambdy_tide : tidal harmonic forcing at open boundaries' 
    106124            IF(lwp) WRITE(numout,*) '             read tidal data in 2d files: ', ln_bdytide_2ddta 
    107             IF(lwp) WRITE(numout,*) '             assume complex conjugate   : ', ln_bdytide_conj 
    108125            IF(lwp) WRITE(numout,*) '             Number of tidal components to read: ', nb_harmo 
    109126            IF(lwp) THEN  
    110127                    WRITE(numout,*) '             Tidal components: '  
    111128               DO itide = 1, nb_harmo 
    112                   WRITE(numout,*)  '                 ', Wave(ntide(itide))%cname_tide  
     129                  WRITE(numout,*)  '                 ', tide_harmonics(itide)%cname_tide  
    113130               END DO 
    114131            ENDIF  
    115132            IF(lwp) WRITE(numout,*) ' ' 
    116133 
    117             ! Allocate space for tidal harmonics data - get size from OBC data arrays 
     134            ! Allocate space for tidal harmonics data - get size from BDY data arrays 
     135            ! Allocate also slow varying data in the case of time splitting: 
     136            ! Do it anyway because at this stage knowledge of free surface scheme is unknown 
    118137            ! ----------------------------------------------------------------------- 
    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(:) 
    124             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  
     138            IF( ASSOCIATED(dta%ssh) ) THEN   ! we use bdy ssh on this mpi subdomain 
     139               isz = SIZE(dta%ssh) 
     140               ALLOCATE( td%ssh0( isz, nb_harmo, 2 ), td%ssh( isz, nb_harmo, 2 ), dta_bdy_s(ib_bdy)%ssh( isz ) ) 
     141               dta_bdy_s(ib_bdy)%ssh(:) = 0._wp   ! needed? 
     142            ENDIF 
     143            IF( ASSOCIATED(dta%u2d) ) THEN   ! we use bdy u2d on this mpi subdomain 
     144               isz = SIZE(dta%u2d) 
     145               ALLOCATE( td%u0  ( isz, nb_harmo, 2 ), td%u  ( isz, nb_harmo, 2 ), dta_bdy_s(ib_bdy)%u2d( isz ) ) 
     146               dta_bdy_s(ib_bdy)%u2d(:) = 0._wp   ! needed? 
     147            ENDIF 
     148            IF( ASSOCIATED(dta%v2d) ) THEN   ! we use bdy v2d on this mpi subdomain 
     149               isz = SIZE(dta%v2d) 
     150               ALLOCATE( td%v0  ( isz, nb_harmo, 2 ), td%v  ( isz, nb_harmo, 2 ), dta_bdy_s(ib_bdy)%v2d( isz ) ) 
     151               dta_bdy_s(ib_bdy)%v2d(:) = 0._wp   ! needed? 
     152            ENDIF 
     153 
     154            ! fill td%ssh0, td%u0, td%v0 
     155            ! ----------------------------------------------------------------------- 
    142156            IF( ln_bdytide_2ddta ) THEN 
     157               ! 
    143158               ! It is assumed that each data file contains all complex harmonic amplitudes 
    144159               ! given on the global domain (ie global, jpiglo x jpjglo) 
     
    147162               ! 
    148163               ! 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) 
    161                   END DO 
    162                END DO  
    163                CALL iom_close( inum ) 
     164               IF( ASSOCIATED(dta%ssh) ) THEN   ! we use bdy ssh on this mpi subdomain 
     165                  clfile = TRIM(filtide)//'_grid_T.nc' 
     166                  CALL iom_open( clfile , inum )  
     167                  igrd = 1                       ! Everything is at T-points here 
     168                  DO itide = 1, nb_harmo 
     169                     CALL iom_get( inum, jpdom_autoglo, TRIM(tide_harmonics(itide)%cname_tide)//'_z1', ztr(:,:) ) 
     170                     CALL iom_get( inum, jpdom_autoglo, TRIM(tide_harmonics(itide)%cname_tide)//'_z2', zti(:,:) )  
     171                     DO ib = 1, SIZE(dta%ssh) 
     172                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     173                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     174                        td%ssh0(ib,itide,1) = ztr(ii,ij) 
     175                        td%ssh0(ib,itide,2) = zti(ii,ij) 
     176                     END DO 
     177                  END DO 
     178                  CALL iom_close( inum ) 
     179               ENDIF 
    164180               ! 
    165181               ! 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) 
    178                   END DO 
    179                END DO 
    180                CALL iom_close( inum ) 
     182               IF( ASSOCIATED(dta%u2d) ) THEN   ! we use bdy u2d on this mpi subdomain 
     183                  clfile = TRIM(filtide)//'_grid_U.nc' 
     184                  CALL iom_open( clfile , inum )  
     185                  igrd = 2                       ! Everything is at U-points here 
     186                  DO itide = 1, nb_harmo 
     187                     CALL iom_get  ( inum, jpdom_autoglo, TRIM(tide_harmonics(itide)%cname_tide)//'_u1', ztr(:,:) ) 
     188                     CALL iom_get  ( inum, jpdom_autoglo, TRIM(tide_harmonics(itide)%cname_tide)//'_u2', zti(:,:) ) 
     189                     DO ib = 1, SIZE(dta%u2d) 
     190                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     191                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     192                        td%u0(ib,itide,1) = ztr(ii,ij) 
     193                        td%u0(ib,itide,2) = zti(ii,ij) 
     194                     END DO 
     195                  END DO 
     196                  CALL iom_close( inum ) 
     197               ENDIF 
    181198               ! 
    182199               ! 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) 
    195                   END DO 
    196                END DO   
    197                CALL iom_close( inum ) 
     200               IF( ASSOCIATED(dta%v2d) ) THEN   ! we use bdy v2d on this mpi subdomain 
     201                  clfile = TRIM(filtide)//'_grid_V.nc' 
     202                  CALL iom_open( clfile , inum )  
     203                  igrd = 3                       ! Everything is at V-points here 
     204                  DO itide = 1, nb_harmo 
     205                     CALL iom_get  ( inum, jpdom_autoglo, TRIM(tide_harmonics(itide)%cname_tide)//'_v1', ztr(:,:) ) 
     206                     CALL iom_get  ( inum, jpdom_autoglo, TRIM(tide_harmonics(itide)%cname_tide)//'_v2', zti(:,:) ) 
     207                     DO ib = 1, SIZE(dta%v2d) 
     208                        ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     209                        ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     210                        td%v0(ib,itide,1) = ztr(ii,ij) 
     211                        td%v0(ib,itide,2) = zti(ii,ij) 
     212                     END DO 
     213                  END DO 
     214                  CALL iom_close( inum ) 
     215               ENDIF 
    198216               ! 
    199217               DEALLOCATE( ztr, zti )  
     
    203221               ! Read tidal data only on bdy segments 
    204222               !  
    205                ALLOCATE( dta_read( MAXVAL(ilen0(1:3)), 1, 1 ) ) 
     223               ALLOCATE( dta_read( MAXVAL( idx_bdy(ib_bdy)%nblen(:) ), 1, 1 ) ) 
    206224               ! 
    207225               ! Open files and read in tidal forcing data 
     
    210228               DO itide = 1, nb_harmo 
    211229                  !                                                              ! 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 ) 
     230                  IF( ASSOCIATED(dta%ssh) ) THEN   ! we use bdy ssh on this mpi subdomain 
     231                     isz = SIZE(dta%ssh) 
     232                     clfile = TRIM(filtide)//TRIM(tide_harmonics(itide)%cname_tide)//'_grid_T.nc' 
     233                     CALL iom_open( clfile, inum ) 
     234                     CALL fld_map( inum, 'z1', dta_read(1:isz,1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 
     235                     td%ssh0(:,itide,1) = dta_read(1:isz,1,1) 
     236                     CALL fld_map( inum, 'z2', dta_read(1:isz,1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 
     237                     td%ssh0(:,itide,2) = dta_read(1:isz,1,1) 
     238                     CALL iom_close( inum ) 
     239                  ENDIF 
    219240                  !                                                              ! 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 ) 
     241                  IF( ASSOCIATED(dta%u2d) ) THEN   ! we use bdy u2d on this mpi subdomain 
     242                     isz = SIZE(dta%u2d) 
     243                     clfile = TRIM(filtide)//TRIM(tide_harmonics(itide)%cname_tide)//'_grid_U.nc' 
     244                     CALL iom_open( clfile, inum ) 
     245                     CALL fld_map( inum, 'u1', dta_read(1:isz,1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 
     246                     td%u0(:,itide,1) = dta_read(1:isz,1,1) 
     247                     CALL fld_map( inum, 'u2', dta_read(1:isz,1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 
     248                     td%u0(:,itide,2) = dta_read(1:isz,1,1) 
     249                     CALL iom_close( inum ) 
     250                  ENDIF 
    227251                  !                                                              ! 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 ) 
     252                  IF( ASSOCIATED(dta%v2d) ) THEN   ! we use bdy v2d on this mpi subdomain 
     253                     isz = SIZE(dta%v2d) 
     254                     clfile = TRIM(filtide)//TRIM(tide_harmonics(itide)%cname_tide)//'_grid_V.nc' 
     255                     CALL iom_open( clfile, inum ) 
     256                     CALL fld_map( inum, 'v1', dta_read(1:isz,1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 
     257                     td%v0(:,itide,1) = dta_read(1:isz,1,1) 
     258                     CALL fld_map( inum, 'v2', dta_read(1:isz,1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 
     259                     td%v0(:,itide,2) = dta_read(1:isz,1,1) 
     260                     CALL iom_close( inum ) 
     261                  ENDIF 
    235262                  ! 
    236263               END DO ! end loop on tidal components 
     
    240267            ENDIF ! ln_bdytide_2ddta=.true. 
    241268            ! 
    242             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) 
    246             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 
    256             ! 
    257269         ENDIF ! nn_dyn2d_dta(ib_bdy) >= 2 
    258270         ! 
     
    262274 
    263275 
    264    SUBROUTINE bdytide_update( kt, idx, dta, td, kit, kt_offset ) 
    265       !!---------------------------------------------------------------------- 
    266       !!                 ***  SUBROUTINE bdytide_update  *** 
    267       !!                 
    268       !! ** Purpose : - Add tidal forcing to ssh, u2d and v2d OBC data arrays.  
    269       !!                 
    270       !!---------------------------------------------------------------------- 
    271       INTEGER          , INTENT(in   ) ::   kt          ! Main timestep counter 
    272       TYPE(OBC_INDEX)  , INTENT(in   ) ::   idx         ! OBC indices 
    273       TYPE(OBC_DATA)   , INTENT(inout) ::   dta         ! OBC external data 
    274       TYPE(TIDES_DATA) , INTENT(inout) ::   td          ! tidal harmonics data 
    275       INTEGER, OPTIONAL, INTENT(in   ) ::   kit         ! Barotropic timestep counter (for timesplitting option) 
    276       INTEGER, OPTIONAL, INTENT(in   ) ::   kt_offset   ! time offset in units of timesteps. NB. if kit 
    277       !                                                 ! is present then units = subcycle timesteps. 
    278       !                                                 ! kt_offset = 0  => get data at "now"    time level 
    279       !                                                 ! kt_offset = -1 => get data at "before" time level 
    280       !                                                 ! kt_offset = +1 => get data at "after"  time level 
    281       !                                                 ! etc. 
    282       ! 
    283       INTEGER  ::   itide, igrd, ib       ! dummy loop indices 
    284       INTEGER  ::   time_add              ! time offset in units of timesteps 
    285       INTEGER, DIMENSION(3) ::   ilen0    ! length of boundary data (from OBC arrays) 
    286       REAL(wp) ::   z_arg, z_sarg, zflag, zramp   ! local scalars     
    287       REAL(wp), DIMENSION(jpmax_harmo) :: z_sist, z_cost 
    288       !!---------------------------------------------------------------------- 
    289       ! 
    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  
    294       zflag=1 
    295       IF ( PRESENT(kit) ) THEN 
    296         IF ( kit /= 1 ) zflag=0 
    297       ENDIF 
    298  
    299       IF ( (nsec_day == NINT(0.5_wp * rdt) .OR. kt==nit000) .AND. zflag==1 ) THEN 
    300         ! 
    301         kt_tide = kt - (nsec_day - 0.5_wp * rdt)/rdt 
    302         ! 
    303         IF(lwp) THEN 
    304            WRITE(numout,*) 
    305            WRITE(numout,*) 'bdytide_update : (re)Initialization of the tidal bdy forcing at kt=',kt 
    306            WRITE(numout,*) '~~~~~~~~~~~~~~ ' 
    307         ENDIF 
    308         ! 
    309         CALL tide_init_elevation ( idx, td ) 
    310         CALL tide_init_velocities( idx, td ) 
    311         ! 
    312       ENDIF  
    313  
    314       time_add = 0 
    315       IF( PRESENT(kt_offset) ) THEN 
    316          time_add = kt_offset 
    317       ENDIF 
    318           
    319       IF( PRESENT(kit) ) THEN   
    320          z_arg = ((kt-kt_tide) * rdt + (kit+0.5_wp*(time_add-1)) * rdt / REAL(nn_baro,wp) ) 
    321       ELSE                               
    322          z_arg = ((kt-kt_tide)+time_add) * rdt 
    323       ENDIF 
    324  
    325       ! Linear ramp on tidal component at open boundaries  
    326       zramp = 1._wp 
    327       IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg + (kt_tide-nit000)*rdt)/(rdttideramp*rday),0._wp),1._wp) 
    328  
    329       DO itide = 1, nb_harmo 
    330          z_sarg = z_arg * omega_tide(itide) 
    331          z_cost(itide) = COS( z_sarg ) 
    332          z_sist(itide) = SIN( z_sarg ) 
    333       END DO 
    334  
    335       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 
    348       END DO 
    349       ! 
    350    END SUBROUTINE bdytide_update 
    351  
    352  
    353    SUBROUTINE bdy_dta_tides( kt, kit, kt_offset ) 
     276   SUBROUTINE bdy_dta_tides( kt, kit, pt_offset ) 
    354277      !!---------------------------------------------------------------------- 
    355278      !!                 ***  SUBROUTINE bdy_dta_tides  *** 
     
    360283      INTEGER,           INTENT(in) ::   kt          ! Main timestep counter 
    361284      INTEGER, OPTIONAL, INTENT(in) ::   kit         ! Barotropic timestep counter (for timesplitting option) 
    362       INTEGER, OPTIONAL, INTENT(in) ::   kt_offset   ! time offset in units of timesteps. NB. if kit 
    363       !                                              ! is present then units = subcycle timesteps. 
    364       !                                              ! kt_offset = 0  => get data at "now"    time level 
    365       !                                              ! kt_offset = -1 => get data at "before" time level 
    366       !                                              ! kt_offset = +1 => get data at "after"  time level 
    367       !                                              ! etc. 
     285      REAL(wp),OPTIONAL, INTENT(in) ::   pt_offset   ! time offset in units of timesteps 
    368286      ! 
    369287      LOGICAL  ::   lk_first_btstp            ! =.TRUE. if time splitting and first barotropic step 
    370       INTEGER  ::   itide, ib_bdy, ib, igrd   ! loop indices 
    371       INTEGER  ::   time_add                  ! time offset in units of timesteps 
    372       INTEGER, DIMENSION(jpbgrd)   ::   ilen0  
    373       INTEGER, DIMENSION(1:jpbgrd) ::   nblen, nblenrim  ! short cuts 
    374       REAL(wp) ::   z_arg, z_sarg, zramp, zoff, z_cost, z_sist       
     288      INTEGER  ::   itide, ib_bdy, ib         ! loop indices 
     289      REAL(wp) ::   z_arg, z_sarg, zramp, zoff, z_cost, z_sist, zt_offset    
    375290      !!---------------------------------------------------------------------- 
    376291      ! 
     
    378293      IF ( PRESENT(kit).AND.( kit /= 1 ) ) THEN ; lk_first_btstp=.FALSE. ; ENDIF 
    379294 
    380       time_add = 0 
    381       IF( PRESENT(kt_offset) ) THEN 
    382          time_add = kt_offset 
    383       ENDIF 
     295      zt_offset = 0._wp 
     296      IF( PRESENT(pt_offset) )   zt_offset = pt_offset 
    384297       
    385298      ! Absolute time from model initialization:    
    386299      IF( PRESENT(kit) ) THEN   
    387          z_arg = ( kt + (kit+time_add-1) / REAL(nn_baro,wp) ) * rdt 
     300         z_arg = ( REAL(kt, wp) + ( REAL(kit, wp) + zt_offset - 1. ) / REAL(nn_e, wp) ) * rn_Dt 
    388301      ELSE                               
    389          z_arg = ( kt + time_add ) * rdt 
     302         z_arg = ( REAL(kt, wp) + zt_offset ) * rn_Dt 
    390303      ENDIF 
    391304 
    392305      ! Linear ramp on tidal component at open boundaries  
    393306      zramp = 1. 
    394       IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg - nit000*rdt)/(rdttideramp*rday),0.),1.) 
     307      IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg - REAL(nit000,wp)*rn_Dt)/(rn_tide_ramp_dt*rday),0.),1.) 
    395308 
    396309      DO ib_bdy = 1,nb_bdy 
    397310         ! 
    398311         IF( nn_dyn2d_dta(ib_bdy) >= 2 ) THEN 
    399             ! 
    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      
    406312            ! 
    407313            ! We refresh nodal factors every day below 
    408314            ! This should be done somewhere else 
    409             IF ( ( nsec_day == NINT(0.5_wp * rdt) .OR. kt==nit000 ) .AND. lk_first_btstp ) THEN 
    410                ! 
    411                kt_tide = kt - (nsec_day - 0.5_wp * rdt)/rdt 
     315            IF ( ( nsec_day == NINT(0.5_wp * rn_Dt) .OR. kt==nit000 ) .AND. lk_first_btstp ) THEN 
     316               ! 
     317               kt_tide = kt - NINT((REAL(nsec_day,wp) - 0.5_wp * rn_Dt)/rn_Dt) 
    412318               ! 
    413319               IF(lwp) THEN 
     
    421327               ! 
    422328            ENDIF 
    423             zoff = -kt_tide * rdt ! time offset relative to nodal factor computation time 
     329            zoff = REAL(-kt_tide,wp) * rn_Dt ! time offset relative to nodal factor computation time 
    424330            ! 
    425331            ! If time splitting, initialize arrays from slow varying open boundary data: 
    426332            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)) 
     333               IF ( ASSOCIATED(dta_bdy(ib_bdy)%ssh) ) dta_bdy(ib_bdy)%ssh(:) = dta_bdy_s(ib_bdy)%ssh(:) 
     334               IF ( ASSOCIATED(dta_bdy(ib_bdy)%u2d) ) dta_bdy(ib_bdy)%u2d(:) = dta_bdy_s(ib_bdy)%u2d(:) 
     335               IF ( ASSOCIATED(dta_bdy(ib_bdy)%v2d) ) dta_bdy(ib_bdy)%v2d(:) = dta_bdy_s(ib_bdy)%v2d(:) 
    430336            ENDIF 
    431337            ! 
     
    433339            DO itide = 1, nb_harmo 
    434340               ! 
    435                z_sarg = (z_arg + zoff) * omega_tide(itide) 
     341               z_sarg = (z_arg + zoff) * tide_harmonics(itide)%omega 
    436342               z_cost = zramp * COS( z_sarg ) 
    437343               z_sist = zramp * SIN( z_sarg ) 
    438344               ! 
    439                IF ( dta_bdy(ib_bdy)%lneed_ssh ) THEN 
    440                   igrd=1                              ! SSH on tracer grid 
    441                   DO ib = 1, ilen0(igrd) 
     345               IF ( ASSOCIATED(dta_bdy(ib_bdy)%ssh) ) THEN   ! SSH on tracer grid 
     346                  DO ib = 1, SIZE(dta_bdy(ib_bdy)%ssh) 
    442347                     dta_bdy(ib_bdy)%ssh(ib) = dta_bdy(ib_bdy)%ssh(ib) + & 
    443348                        &                      ( tides(ib_bdy)%ssh(ib,itide,1)*z_cost + & 
     
    446351               ENDIF 
    447352               ! 
    448                IF ( dta_bdy(ib_bdy)%lneed_dyn2d ) THEN 
    449                   igrd=2                              ! U grid 
    450                   DO ib = 1, ilen0(igrd) 
     353               IF ( ASSOCIATED(dta_bdy(ib_bdy)%u2d) ) THEN  ! U grid 
     354                  DO ib = 1, SIZE(dta_bdy(ib_bdy)%u2d) 
    451355                     dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) + & 
    452356                        &                      ( tides(ib_bdy)%u(ib,itide,1)*z_cost + & 
    453357                        &                        tides(ib_bdy)%u(ib,itide,2)*z_sist ) 
    454358                  END DO 
    455                   igrd=3                              ! V grid 
    456                   DO ib = 1, ilen0(igrd)  
     359               ENDIF 
     360               ! 
     361               IF ( ASSOCIATED(dta_bdy(ib_bdy)%v2d) ) THEN   ! V grid 
     362                  DO ib = 1, SIZE(dta_bdy(ib_bdy)%v2d) 
    457363                     dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) + & 
    458364                        &                      ( tides(ib_bdy)%v(ib,itide,1)*z_cost + & 
     
    460366                  END DO 
    461367               ENDIF 
     368               ! 
    462369            END DO              
    463          END IF 
     370         ENDIF 
    464371      END DO 
    465372      ! 
     
    474381      TYPE(TIDES_DATA), INTENT(inout) ::   td    ! tidal harmonics data 
    475382      ! 
    476       INTEGER ::   itide, igrd, ib       ! dummy loop indices 
    477       INTEGER, DIMENSION(1) ::   ilen0   ! length of boundary data (from OBC arrays) 
     383      INTEGER ::   itide, isz, ib       ! dummy loop indices 
    478384      REAL(wp),ALLOCATABLE, DIMENSION(:) ::   mod_tide, phi_tide 
    479385      !!---------------------------------------------------------------------- 
    480386      ! 
    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)) 
     387      IF( ASSOCIATED(td%ssh0) ) THEN   ! SSH on tracer grid. 
     388         ! 
     389         isz = SIZE( td%ssh0, dim = 1 ) 
     390         ALLOCATE( mod_tide(isz), phi_tide(isz) ) 
     391         ! 
     392         DO itide = 1, nb_harmo 
     393            DO ib = 1, isz 
     394               mod_tide(ib)=SQRT( td%ssh0(ib,itide,1)*td%ssh0(ib,itide,1) + td%ssh0(ib,itide,2)*td%ssh0(ib,itide,2) ) 
     395               phi_tide(ib)=ATAN2(-td%ssh0(ib,itide,2),td%ssh0(ib,itide,1)) 
     396            END DO 
     397            DO ib = 1, isz 
     398               mod_tide(ib)=mod_tide(ib)*tide_harmonics(itide)%f 
     399               phi_tide(ib)=phi_tide(ib)+tide_harmonics(itide)%v0+tide_harmonics(itide)%u 
     400            END DO 
     401            DO ib = 1, isz 
     402               td%ssh(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 
     403               td%ssh(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 
     404            END DO 
    491405         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 ) 
     406         ! 
     407         DEALLOCATE( mod_tide, phi_tide ) 
     408         ! 
     409      ENDIF 
    503410      ! 
    504411   END SUBROUTINE tide_init_elevation 
     
    512419      TYPE(TIDES_DATA), INTENT(inout) ::   td    ! tidal harmonics data 
    513420      ! 
    514       INTEGER ::   itide, igrd, ib       ! dummy loop indices 
    515       INTEGER, DIMENSION(3) ::   ilen0   ! length of boundary data (from OBC arrays) 
     421      INTEGER ::   itide, isz, ib        ! dummy loop indices 
    516422      REAL(wp),ALLOCATABLE, DIMENSION(:) ::   mod_tide, phi_tide 
    517423      !!---------------------------------------------------------------------- 
    518424      ! 
    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)) 
     425      IF( ASSOCIATED(td%u0) ) THEN   ! U grid. we use bdy u2d on this mpi subdomain 
     426         ! 
     427         isz = SIZE( td%u0, dim = 1 ) 
     428         ALLOCATE( mod_tide(isz), phi_tide(isz) ) 
     429         ! 
     430         DO itide = 1, nb_harmo 
     431            DO ib = 1, isz 
     432               mod_tide(ib)=SQRT( td%u0(ib,itide,1)*td%u0(ib,itide,1) + td%u0(ib,itide,2)*td%u0(ib,itide,2) ) 
     433               phi_tide(ib)=ATAN2(-td%u0(ib,itide,2),td%u0(ib,itide,1)) 
     434            END DO 
     435            DO ib = 1, isz 
     436               mod_tide(ib)=mod_tide(ib)*tide_harmonics(itide)%f 
     437               phi_tide(ib)=phi_tide(ib)+tide_harmonics(itide)%v0 + tide_harmonics(itide)%u 
     438            END DO 
     439            DO ib = 1, isz 
     440               td%u(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 
     441               td%u(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 
     442            END DO 
    530443         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)) 
     444         ! 
     445         DEALLOCATE( mod_tide, phi_tide ) 
     446         ! 
     447      ENDIF 
     448      ! 
     449      IF( ASSOCIATED(td%v0) ) THEN   ! V grid. we use bdy u2d on this mpi subdomain 
     450         ! 
     451         isz = SIZE( td%v0, dim = 1 ) 
     452         ALLOCATE( mod_tide(isz), phi_tide(isz) ) 
     453         ! 
     454         DO itide = 1, nb_harmo 
     455            DO ib = 1, isz 
     456               mod_tide(ib)=SQRT( td%v0(ib,itide,1)*td%v0(ib,itide,1) + td%v0(ib,itide,2)*td%v0(ib,itide,2) ) 
     457               phi_tide(ib)=ATAN2(-td%v0(ib,itide,2),td%v0(ib,itide,1)) 
     458            END DO 
     459            DO ib = 1, isz 
     460               mod_tide(ib)=mod_tide(ib)*tide_harmonics(itide)%f 
     461               phi_tide(ib)=phi_tide(ib)+tide_harmonics(itide)%v0 + tide_harmonics(itide)%u 
     462            END DO 
     463            DO ib = 1, isz 
     464               td%v(ib,itide,1)= mod_tide(ib)*COS(phi_tide(ib)) 
     465               td%v(ib,itide,2)=-mod_tide(ib)*SIN(phi_tide(ib)) 
     466            END DO 
    551467         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 
     468         ! 
     469         DEALLOCATE( mod_tide, phi_tide ) 
     470         ! 
     471      ENDIF 
     472      ! 
     473   END SUBROUTINE tide_init_velocities 
    565474 
    566475   !!====================================================================== 
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/BDY/bdytra.F90

    r12178 r12928  
    4040CONTAINS 
    4141 
    42    SUBROUTINE bdy_tra( kt ) 
     42   SUBROUTINE bdy_tra( kt, Kbb, pts, Kaa ) 
    4343      !!---------------------------------------------------------------------- 
    4444      !!                  ***  SUBROUTINE bdy_tra  *** 
     
    4747      !! 
    4848      !!---------------------------------------------------------------------- 
    49       INTEGER, INTENT(in) ::   kt   ! Main time step counter 
     49      INTEGER                                  , INTENT(in)    :: kt        ! Main time step counter 
     50      INTEGER                                  , INTENT(in)    :: Kbb, Kaa  ! time level indices 
     51      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts       ! tracer fields 
    5052      ! 
    5153      INTEGER                        :: ib_bdy, jn, igrd, ir   ! Loop indeces 
     
    7072               CASE('none'        )   ;   CYCLE 
    7173               CASE('frs'         )   ! treat the whole boundary at once 
    72                   IF( ir == 0 ) CALL bdy_frs ( idx_bdy(ib_bdy),                tsa(:,:,:,jn), zdta(jn)%tra ) 
     74                  IF( ir == 0 ) CALL bdy_frs ( idx_bdy(ib_bdy),                pts(:,:,:,jn,Kaa), zdta(jn)%tra ) 
    7375               CASE('specified'   )   ! treat the whole rim      at once 
    74                   IF( ir == 0 ) CALL bdy_spe ( idx_bdy(ib_bdy),                tsa(:,:,:,jn), zdta(jn)%tra ) 
    75                CASE('neumann'     )   ;   CALL bdy_nmn ( idx_bdy(ib_bdy), igrd         , tsa(:,:,:,jn), llrim0 )   ! tsa masked 
    76                CASE('orlanski'    )   ;   CALL bdy_orl ( idx_bdy(ib_bdy), tsb(:,:,:,jn), tsa(:,:,:,jn), & 
     76                  IF( ir == 0 ) CALL bdy_spe ( idx_bdy(ib_bdy),                pts(:,:,:,jn,Kaa), zdta(jn)%tra ) 
     77               CASE('neumann'     )   ;   CALL bdy_nmn ( idx_bdy(ib_bdy), igrd         , pts(:,:,:,jn,Kaa), llrim0 )   ! tsa masked 
     78               CASE('orlanski'    )   ;   CALL bdy_orl ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kbb), pts(:,:,:,jn,Kaa), & 
    7779                    & zdta(jn)%tra, llrim0, ll_npo=.false. ) 
    78                CASE('orlanski_npo')   ;   CALL bdy_orl ( idx_bdy(ib_bdy), tsb(:,:,:,jn), tsa(:,:,:,jn), & 
     80               CASE('orlanski_npo')   ;   CALL bdy_orl ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kbb), pts(:,:,:,jn,Kaa), & 
    7981                    & zdta(jn)%tra, llrim0, ll_npo=.true.  ) 
    80                CASE('runoff'      )   ;   CALL bdy_rnf ( idx_bdy(ib_bdy),                tsa(:,:,:,jn), jn, llrim0 ) 
     82               CASE('runoff'      )   ;   CALL bdy_rnf ( idx_bdy(ib_bdy),                pts(:,:,:,jn,Kaa), jn, llrim0 ) 
    8183               CASE DEFAULT           ;   CALL ctl_stop( 'bdy_tra : unrecognised option for open boundaries for T and S' ) 
    8284               END SELECT 
     
    98100         END DO 
    99101         IF( ANY(llsend1) .OR. ANY(llrecv1) ) THEN   ! if need to send/recv in at least one direction 
    100             CALL lbc_lnk( 'bdytra', tsa, 'T',  1., kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 ) 
     102            CALL lbc_lnk( 'bdytra', pts(:,:,:,jn,Kaa), 'T',  1., kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 ) 
    101103         END IF 
    102104         ! 
     
    106108 
    107109 
    108    SUBROUTINE bdy_rnf( idx, pta, jpa, llrim0 ) 
     110   SUBROUTINE bdy_rnf( idx, pt, jpa, llrim0 ) 
    109111      !!---------------------------------------------------------------------- 
    110112      !!                 ***  SUBROUTINE bdy_rnf  *** 
     
    116118      !!---------------------------------------------------------------------- 
    117119      TYPE(OBC_INDEX),                     INTENT(in) ::   idx      ! OBC indices 
    118       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pta      ! tracer trend 
     120      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pt       ! tracer trend 
    119121      INTEGER,                             INTENT(in) ::   jpa      ! TRA index 
    120122      LOGICAL,                             INTENT(in) ::   llrim0   ! indicate if rim 0 is treated 
    121123      ! 
    122124      INTEGER  ::   ib, ii, ij, igrd   ! dummy loop indices 
    123       INTEGER  ::   ik, ip, jp ! 2D addresses 
    124125      !!---------------------------------------------------------------------- 
    125126      ! 
    126127      igrd = 1                       ! Everything is at T-points here 
    127128      IF(      jpa == jp_tem ) THEN 
    128          CALL bdy_nmn( idx, igrd, pta, llrim0 ) 
     129         CALL bdy_nmn( idx, igrd, pt, llrim0 ) 
    129130      ELSE IF( jpa == jp_sal ) THEN 
    130131         IF( .NOT. llrim0 )   RETURN 
     
    132133            ii = idx%nbi(ib,igrd) 
    133134            ij = idx%nbj(ib,igrd) 
    134             pta(ii,ij,1:jpkm1) = 0.1 * tmask(ii,ij,1:jpkm1) 
     135            pt(ii,ij,1:jpkm1) = 0.1 * tmask(ii,ij,1:jpkm1) 
    135136         END DO 
    136137      END IF 
     
    139140 
    140141 
    141    SUBROUTINE bdy_tra_dmp( kt ) 
     142   SUBROUTINE bdy_tra_dmp( kt, Kbb, pts, Krhs ) 
    142143      !!---------------------------------------------------------------------- 
    143144      !!                 ***  SUBROUTINE bdy_tra_dmp  *** 
     
    146147      !!  
    147148      !!---------------------------------------------------------------------- 
    148       INTEGER, INTENT(in) ::   kt   ! 
     149      INTEGER                                  , INTENT(in)    :: kt        ! time step 
     150      INTEGER                                  , INTENT(in)    :: Kbb, Krhs ! time level indices 
     151      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts       ! active tracers and RHS of tracer equation 
    149152      ! 
    150153      REAL(wp) ::   zwgt           ! boundary weight 
     
    165168               zwgt = idx_bdy(ib_bdy)%nbd(ib,igrd) 
    166169               DO ik = 1, jpkm1 
    167                   zta = zwgt * ( dta_bdy(ib_bdy)%tem(ib,ik) - tsb(ii,ij,ik,jp_tem) ) * tmask(ii,ij,ik) 
    168                   zsa = zwgt * ( dta_bdy(ib_bdy)%sal(ib,ik) - tsb(ii,ij,ik,jp_sal) ) * tmask(ii,ij,ik) 
    169                   tsa(ii,ij,ik,jp_tem) = tsa(ii,ij,ik,jp_tem) + zta 
    170                   tsa(ii,ij,ik,jp_sal) = tsa(ii,ij,ik,jp_sal) + zsa 
     170                  zta = zwgt * ( dta_bdy(ib_bdy)%tem(ib,ik) - pts(ii,ij,ik,jp_tem,Kbb) ) * tmask(ii,ij,ik) 
     171                  zsa = zwgt * ( dta_bdy(ib_bdy)%sal(ib,ik) - pts(ii,ij,ik,jp_sal,Kbb) ) * tmask(ii,ij,ik) 
     172                  pts(ii,ij,ik,jp_tem,Krhs) = pts(ii,ij,ik,jp_tem,Krhs) + zta 
     173                  pts(ii,ij,ik,jp_sal,Krhs) = pts(ii,ij,ik,jp_sal,Krhs) + zsa 
    171174               END DO 
    172175            END DO 
  • NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/BDY/bdyvol.F90

    r12178 r12928  
    1414   USE bdy_oce        ! ocean open boundary conditions 
    1515   USE sbc_oce        ! ocean surface boundary conditions 
     16   USE isf_oce, ONLY : fwfisf_cav, fwfisf_par  ! ice shelf 
    1617   USE dom_oce        ! ocean space and time domain  
    1718   USE phycst         ! physical constants 
    18    USE sbcisf         ! ice shelf 
    1919   ! 
    2020   USE in_out_manager ! I/O manager 
     
    7777      ! Calculate the cumulate surface Flux z_cflxemp (m3/s) over all the domain 
    7878      ! ----------------------------------------------------------------------- 
    79       IF ( kc == 1 ) z_cflxemp = glob_sum( 'bdyvol', ( emp(:,:) - rnf(:,:) + fwfisf(:,:) ) * bdytmask(:,:) * e1e2t(:,:)  ) / rau0 
     79      IF ( kc == 1 ) z_cflxemp = glob_sum( 'bdyvol', ( emp(:,:) - rnf(:,:) + fwfisf_cav(:,:) + fwfisf_par(:,:) ) * bdytmask(:,:) * e1e2t(:,:)  ) / rho0 
    8080 
    8181      ! Compute bdy surface each cycle if non linear free surface 
     
    143143      ! Check the cumulated transport through unstructured OBC once barotropic velocities corrected 
    144144      ! ------------------------------------------------------ 
    145       IF( MOD( kt, nn_write ) == 0 .AND. ( kc == 1 ) ) THEN 
     145      IF( MOD( kt, MAX(nn_write,1) ) == 0 .AND. ( kc == 1 ) ) THEN 
    146146         ! 
    147147         ! compute residual transport across boundary 
Note: See TracChangeset for help on using the changeset viewer.