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 3991 for branches/2013/dev_r3987_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn2d.F90 – NEMO

Ignore:
Timestamp:
2013-07-29T11:04:44+02:00 (11 years ago)
Author:
davestorkey
Message:

New branch from later branch point on trunk so you can do a clean
diff of all the changes. Copy in changes from dev_r3891_METO1_MERCATOR6_OBC_BDY_merge.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2013/dev_r3987_METO1_MERCATOR6_OBC_BDY_merge/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn2d.F90

    r3680 r3991  
    1818   USE dom_oce         ! ocean space and time domain 
    1919   USE bdy_oce         ! ocean open boundary conditions 
     20   USE bdylib          ! BDY library routines 
    2021   USE dynspg_oce      ! for barotropic variables 
    2122   USE phycst          ! physical constants 
     
    2627   PRIVATE 
    2728 
    28    PUBLIC   bdy_dyn2d     ! routine called in dynspg_ts and bdy_dyn 
     29   PUBLIC   bdy_dyn2d   ! routine called in dynspg_ts and bdy_dyn 
    2930 
    3031   !!---------------------------------------------------------------------- 
     
    4849      DO ib_bdy=1, nb_bdy 
    4950 
    50          SELECT CASE( nn_dyn2d(ib_bdy) ) 
    51          CASE(jp_none) 
     51         SELECT CASE( cn_dyn2d(ib_bdy) ) 
     52         CASE('none') 
    5253            CYCLE 
    53          CASE(jp_frs) 
     54         CASE('frs') 
    5455            CALL bdy_dyn2d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy ) 
    55          CASE(jp_flather) 
     56         CASE('flather') 
    5657            CALL bdy_dyn2d_fla( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy ) 
     58         CASE('orlanski') 
     59            CALL bdy_dyn2d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, ll_npo=.false. ) 
     60         CASE('orlanski_npo') 
     61            CALL bdy_dyn2d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, ll_npo=.true. ) 
    5762         CASE DEFAULT 
    5863            CALL ctl_stop( 'bdy_dyn2d : unrecognised option for open boundaries for barotropic variables' ) 
     
    8994         ij   = idx%nbj(jb,igrd) 
    9095         zwgt = idx%nbw(jb,igrd) 
    91          pu2d(ii,ij) = ( pu2d(ii,ij) + zwgt * ( dta%u2d(jb) - pu2d(ii,ij) ) ) * umask(ii,ij,1) 
     96         pua2d(ii,ij) = ( pua2d(ii,ij) + zwgt * ( dta%u2d(jb) - pua2d(ii,ij) ) ) * umask(ii,ij,1) 
    9297      END DO 
    9398      ! 
     
    97102         ij   = idx%nbj(jb,igrd) 
    98103         zwgt = idx%nbw(jb,igrd) 
    99          pv2d(ii,ij) = ( pv2d(ii,ij) + zwgt * ( dta%v2d(jb) - pv2d(ii,ij) ) ) * vmask(ii,ij,1) 
     104         pva2d(ii,ij) = ( pva2d(ii,ij) + zwgt * ( dta%v2d(jb) - pva2d(ii,ij) ) ) * vmask(ii,ij,1) 
    100105      END DO  
    101       CALL lbc_bdy_lnk( pu2d, 'U', -1., ib_bdy )  
    102       CALL lbc_bdy_lnk( pv2d, 'V', -1., ib_bdy)   ! Boundary points should be updated 
     106      CALL lbc_bdy_lnk( pua2d, 'U', -1., ib_bdy )  
     107      CALL lbc_bdy_lnk( pva2d, 'V', -1., ib_bdy)   ! Boundary points should be updated 
    103108      ! 
    104109      IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_frs') 
     
    133138      INTEGER  ::   jb, igrd                         ! dummy loop indices 
    134139      INTEGER  ::   ii, ij, iim1, iip1, ijm1, ijp1   ! 2D addresses 
     140      REAL(wp), POINTER :: flagu, flagv              ! short cuts 
    135141      REAL(wp) ::   zcorr                            ! Flather correction 
    136142      REAL(wp) ::   zforc                            ! temporary scalar 
     
    160166         ii  = idx%nbi(jb,igrd) 
    161167         ij  = idx%nbj(jb,igrd)  
    162          iim1 = ii + MAX( 0, INT( idx%flagu(jb) ) )   ! T pts i-indice inside the boundary 
    163          iip1 = ii - MIN( 0, INT( idx%flagu(jb) ) )   ! T pts i-indice outside the boundary  
     168         flagu => idx%flagu(jb,igrd) 
     169         iim1 = ii + MAX( 0, INT( flagu ) )   ! T pts i-indice inside the boundary 
     170         iip1 = ii - MIN( 0, INT( flagu ) )   ! T pts i-indice outside the boundary  
    164171         ! 
    165          zcorr = - idx%flagu(jb) * SQRT( grav * phur(ii, ij) ) * ( pssh(iim1, ij) - spgu(iip1,ij) ) 
     172         zcorr = - flagu * SQRT( grav * phur(ii, ij) ) * ( pssh(iim1, ij) - spgu(iip1,ij) ) 
    166173         zforc = dta%u2d(jb) 
    167          pu2d(ii,ij) = zforc + zcorr * umask(ii,ij,1)  
     174         pua2d(ii,ij) = zforc + zcorr * umask(ii,ij,1)  
    168175      END DO 
    169176      ! 
     
    173180         ii  = idx%nbi(jb,igrd) 
    174181         ij  = idx%nbj(jb,igrd)  
    175          ijm1 = ij + MAX( 0, INT( idx%flagv(jb) ) )   ! T pts j-indice inside the boundary 
    176          ijp1 = ij - MIN( 0, INT( idx%flagv(jb) ) )   ! T pts j-indice outside the boundary  
     182         flagv => idx%flagv(jb,igrd) 
     183         ijm1 = ij + MAX( 0, INT( flagv ) )   ! T pts j-indice inside the boundary 
     184         ijp1 = ij - MIN( 0, INT( flagv ) )   ! T pts j-indice outside the boundary  
    177185         ! 
    178          zcorr = - idx%flagv(jb) * SQRT( grav * phvr(ii, ij) ) * ( pssh(ii, ijm1) - spgu(ii,ijp1) ) 
     186         zcorr = - flagv * SQRT( grav * phvr(ii, ij) ) * ( pssh(ii, ijm1) - spgu(ii,ijp1) ) 
    179187         zforc = dta%v2d(jb) 
    180          pv2d(ii,ij) = zforc + zcorr * vmask(ii,ij,1) 
    181       END DO 
    182       CALL lbc_bdy_lnk( pu2d, 'U', -1., ib_bdy )   ! Boundary points should be updated 
    183       CALL lbc_bdy_lnk( pv2d, 'V', -1., ib_bdy )   ! 
     188         pva2d(ii,ij) = zforc + zcorr * vmask(ii,ij,1) 
     189      END DO 
     190      CALL lbc_bdy_lnk( pua2d, 'U', -1., ib_bdy )   ! Boundary points should be updated 
     191      CALL lbc_bdy_lnk( pva2d, 'V', -1., ib_bdy )   ! 
    184192      ! 
    185193      IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_fla') 
    186194      ! 
    187195   END SUBROUTINE bdy_dyn2d_fla 
     196 
     197 
     198   SUBROUTINE bdy_dyn2d_orlanski( idx, dta, ib_bdy, ll_npo ) 
     199      !!---------------------------------------------------------------------- 
     200      !!                 ***  SUBROUTINE bdy_dyn2d_orlanski  *** 
     201      !!              
     202      !!              - Apply Orlanski radiation condition adaptively: 
     203      !!                  - radiation plus weak nudging at outflow points 
     204      !!                  - no radiation and strong nudging at inflow points 
     205      !!  
     206      !! 
     207      !! References:  Marchesiello, McWilliams and Shchepetkin, Ocean Modelling vol. 3 (2001)     
     208      !!---------------------------------------------------------------------- 
     209      TYPE(OBC_INDEX),              INTENT(in) ::   idx  ! OBC indices 
     210      TYPE(OBC_DATA),               INTENT(in) ::   dta  ! OBC external data 
     211      INTEGER,                      INTENT(in) ::   ib_bdy  ! number of current open boundary set 
     212      LOGICAL,                      INTENT(in) ::   ll_npo  ! flag for NPO version 
     213 
     214      INTEGER  ::   ib, igrd                               ! dummy loop indices 
     215      INTEGER  ::   ii, ij, iibm1, ijbm1                   ! indices 
     216      !!---------------------------------------------------------------------- 
     217 
     218      IF( nn_timing == 1 ) CALL timing_start('bdy_dyn2d_orlanski') 
     219      ! 
     220      igrd = 2      ! Orlanski bc on u-velocity;  
     221      !             
     222      CALL bdy_orlanski_2d( idx, igrd, pub2d, pua2d, dta%u2d, ll_npo ) 
     223 
     224      igrd = 3      ! Orlanski bc on v-velocity 
     225      !   
     226      CALL bdy_orlanski_2d( idx, igrd, pvb2d, pva2d, dta%v2d, ll_npo ) 
     227      ! 
     228      IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_orlanski') 
     229      ! 
     230      CALL lbc_bdy_lnk( pua2d, 'U', -1., ib_bdy )   ! Boundary points should be updated 
     231      CALL lbc_bdy_lnk( pva2d, 'V', -1., ib_bdy )   ! 
     232      ! 
     233      IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_orlanski') 
     234      ! 
     235   END SUBROUTINE bdy_dyn2d_orlanski 
     236 
    188237#else 
    189238   !!---------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.