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/bdydyn3d.F90 – 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:
2 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/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 
Note: See TracChangeset for help on using the changeset viewer.