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 6808 for branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn3d.F90 – NEMO

Ignore:
Timestamp:
2016-07-19T10:38:35+02:00 (8 years ago)
Author:
jamesharle
Message:

merge with trunk@6232 for consistency with SSB code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn3d.F90

    r6807 r6808  
    2929   PUBLIC   bdy_dyn3d_dmp ! routine called by step 
    3030 
    31    !! * Substitutions 
    32 #  include "domzgr_substitute.h90" 
    3331   !!---------------------------------------------------------------------- 
    3432   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     
    4543      !! 
    4644      !!---------------------------------------------------------------------- 
    47       INTEGER, INTENT( in ) :: kt     ! Main time step counter 
    48       !! 
    49       INTEGER               :: ib_bdy ! loop index 
    50       !! 
    51  
     45      INTEGER, INTENT(in) ::   kt   ! Main time step counter 
     46      ! 
     47      INTEGER ::   ib_bdy  ! loop index 
     48      !!---------------------------------------------------------------------- 
     49      ! 
    5250      DO ib_bdy=1, nb_bdy 
    53  
     51         ! 
    5452         SELECT CASE( cn_dyn3d(ib_bdy) ) 
    55          CASE('none') 
    56             CYCLE 
    57          CASE('frs') 
    58             CALL bdy_dyn3d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
    59          CASE('specified') 
    60             CALL bdy_dyn3d_spe( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
    61          CASE('zerograd') 
    62             CALL bdy_dyn3d_zgrad( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
    63          CASE('zero') 
    64             CALL bdy_dyn3d_zro( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
    65          CASE('neumann') 
    66             CALL bdy_dyn3d_nmn( idx_bdy(ib_bdy), ib_bdy ) 
    67          CASE('orlanski') 
    68             CALL bdy_dyn3d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, ll_npo=.false. ) 
    69          CASE('orlanski_npo') 
    70             CALL bdy_dyn3d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, ll_npo=.true. ) 
    71          CASE DEFAULT 
    72             CALL ctl_stop( 'bdy_dyn3d : unrecognised option for open boundaries for baroclinic velocities' ) 
     53         CASE('none')        ;   CYCLE 
     54         CASE('frs' )        ;   CALL bdy_dyn3d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
     55         CASE('specified')   ;   CALL bdy_dyn3d_spe( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
     56         CASE('zero')        ;   CALL bdy_dyn3d_zro( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
     57         CASE('orlanski' )   ;   CALL bdy_dyn3d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, ll_npo=.false. ) 
     58         CASE('orlanski_npo');   CALL bdy_dyn3d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, ll_npo=.true. ) 
     59         CASE('zerograd')    ;   CALL bdy_dyn3d_zgrad( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
     60         CASE('neumann')     ;   CALL bdy_dyn3d_nmn( idx_bdy(ib_bdy), ib_bdy ) 
     61         CASE DEFAULT        ;   CALL ctl_stop( 'bdy_dyn3d : unrecognised option for open boundaries for baroclinic velocities' ) 
    7362         END SELECT 
    74       ENDDO 
    75  
     63      END DO 
     64      ! 
    7665   END SUBROUTINE bdy_dyn3d 
     66 
    7767 
    7868   SUBROUTINE bdy_dyn3d_spe( idx, dta, kt , ib_bdy ) 
     
    8272      !! ** Purpose : - Apply a specified value for baroclinic velocities 
    8373      !!                at open boundaries. 
     74      !! 
     75      !!---------------------------------------------------------------------- 
     76      INTEGER        , INTENT(in) ::   kt      ! time step index 
     77      TYPE(OBC_INDEX), INTENT(in) ::   idx     ! OBC indices 
     78      TYPE(OBC_DATA) , INTENT(in) ::   dta     ! OBC external data 
     79      INTEGER        , INTENT(in) ::   ib_bdy  ! BDY set index 
     80      ! 
     81      INTEGER  ::   jb, jk         ! dummy loop indices 
     82      INTEGER  ::   ii, ij, igrd   ! local integers 
     83      REAL(wp) ::   zwgt           ! boundary weight 
     84      !!---------------------------------------------------------------------- 
     85      ! 
     86      IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_spe') 
     87      ! 
     88      igrd = 2                      ! Relaxation of zonal velocity 
     89      DO jb = 1, idx%nblenrim(igrd) 
     90         DO jk = 1, jpkm1 
     91            ii   = idx%nbi(jb,igrd) 
     92            ij   = idx%nbj(jb,igrd) 
     93            ua(ii,ij,jk) = dta%u3d(jb,jk) * umask(ii,ij,jk) 
     94         END DO 
     95      END DO 
     96      ! 
     97      igrd = 3                      ! Relaxation of meridional velocity 
     98      DO jb = 1, idx%nblenrim(igrd) 
     99         DO jk = 1, jpkm1 
     100            ii   = idx%nbi(jb,igrd) 
     101            ij   = idx%nbj(jb,igrd) 
     102            va(ii,ij,jk) = dta%v3d(jb,jk) * vmask(ii,ij,jk) 
     103         END DO 
     104      END DO 
     105      CALL lbc_bdy_lnk( ua, 'U', -1., ib_bdy )   ! Boundary points should be updated   
     106      CALL lbc_bdy_lnk( va, 'V', -1., ib_bdy )    
     107      ! 
     108      IF( kt == nit000 )   CLOSE( unit = 102 ) 
     109      ! 
     110      IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_spe') 
     111      ! 
     112   END SUBROUTINE bdy_dyn3d_spe 
     113 
     114   SUBROUTINE bdy_dyn3d_zgrad( idx, dta, kt , ib_bdy ) 
     115      !!---------------------------------------------------------------------- 
     116      !!                  ***  SUBROUTINE bdy_dyn3d_zgrad  *** 
     117      !! 
     118      !! ** Purpose : - Enforce a zero gradient of normal velocity 
    84119      !! 
    85120      !!---------------------------------------------------------------------- 
     
    92127      INTEGER  ::   ii, ij, igrd   ! local integers 
    93128      REAL(wp) ::   zwgt           ! boundary weight 
    94       !!---------------------------------------------------------------------- 
    95       ! 
    96       IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_spe') 
    97       ! 
    98       igrd = 2                      ! Relaxation of zonal velocity 
    99       DO jb = 1, idx%nblenrim(igrd) 
    100          DO jk = 1, jpkm1 
    101             ii   = idx%nbi(jb,igrd) 
    102             ij   = idx%nbj(jb,igrd) 
    103             ua(ii,ij,jk) = dta%u3d(jb,jk) * umask(ii,ij,jk) 
    104          END DO 
    105       END DO 
    106       ! 
    107       igrd = 3                      ! Relaxation of meridional velocity 
    108       DO jb = 1, idx%nblenrim(igrd) 
    109          DO jk = 1, jpkm1 
    110             ii   = idx%nbi(jb,igrd) 
    111             ij   = idx%nbj(jb,igrd) 
    112             va(ii,ij,jk) = dta%v3d(jb,jk) * vmask(ii,ij,jk) 
    113          END DO 
    114       END DO 
    115       CALL lbc_bdy_lnk( ua, 'U', -1., ib_bdy )   ! Boundary points should be updated   
    116       CALL lbc_bdy_lnk( va, 'V', -1., ib_bdy )    
    117       ! 
    118       IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 
    119  
    120       IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_spe') 
    121  
    122    END SUBROUTINE bdy_dyn3d_spe 
    123  
    124    SUBROUTINE bdy_dyn3d_zgrad( idx, dta, kt , ib_bdy ) 
    125       !!---------------------------------------------------------------------- 
    126       !!                  ***  SUBROUTINE bdy_dyn3d_zgrad  *** 
    127       !! 
    128       !! ** Purpose : - Enforce a zero gradient of normal velocity 
    129       !! 
    130       !!---------------------------------------------------------------------- 
    131       INTEGER                     ::   kt 
    132       TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    133       TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
    134       INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
    135       !! 
    136       INTEGER  ::   jb, jk         ! dummy loop indices 
    137       INTEGER  ::   ii, ij, igrd   ! local integers 
    138       REAL(wp) ::   zwgt           ! boundary weight 
    139129      INTEGER  ::   fu, fv 
    140130      !!---------------------------------------------------------------------- 
     
    179169      !! 
    180170      !!---------------------------------------------------------------------- 
    181       INTEGER                     ::   kt 
    182       TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    183       TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
     171      INTEGER        , INTENT(in) ::   kt      ! time step index 
     172      TYPE(OBC_INDEX), INTENT(in) ::   idx     ! OBC indices 
     173      TYPE(OBC_DATA) , INTENT(in) ::   dta     ! OBC external data 
    184174      INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
    185       !! 
     175      ! 
    186176      INTEGER  ::   ib, ik         ! dummy loop indices 
    187       INTEGER  ::   ii, ij, igrd, zcoef   ! local integers 
     177      INTEGER  ::   ii, ij, igrd   ! local integers 
    188178      REAL(wp) ::   zwgt           ! boundary weight 
    189179      !!---------------------------------------------------------------------- 
     
    211201      CALL lbc_bdy_lnk( ua, 'U', -1., ib_bdy )   ;   CALL lbc_bdy_lnk( va, 'V', -1.,ib_bdy )   ! Boundary points should be updated 
    212202      ! 
    213       IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 
    214  
    215       IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_zro') 
    216  
     203      IF( kt == nit000 )  CLOSE( unit = 102 ) 
     204      ! 
     205      IF( nn_timing == 1 )   CALL timing_stop('bdy_dyn3d_zro') 
     206      ! 
    217207   END SUBROUTINE bdy_dyn3d_zro 
     208 
    218209 
    219210   SUBROUTINE bdy_dyn3d_frs( idx, dta, kt, ib_bdy ) 
     
    228219      !!               topography. Tellus, 365-382. 
    229220      !!---------------------------------------------------------------------- 
    230       INTEGER                     ::   kt 
    231       TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    232       TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
     221      INTEGER        , INTENT(in) ::   kt      ! time step index 
     222      TYPE(OBC_INDEX), INTENT(in) ::   idx     ! OBC indices 
     223      TYPE(OBC_DATA) , INTENT(in) ::   dta     ! OBC external data 
    233224      INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
    234       !! 
     225      ! 
    235226      INTEGER  ::   jb, jk         ! dummy loop indices 
    236227      INTEGER  ::   ii, ij, igrd   ! local integers 
     
    262253      CALL lbc_bdy_lnk( va, 'V', -1., ib_bdy )    
    263254      ! 
    264       IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 
    265  
    266       IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_frs') 
    267  
     255      IF( kt == nit000 )  CLOSE( unit = 102 ) 
     256      ! 
     257      IF( nn_timing == 1 )   CALL timing_stop('bdy_dyn3d_frs') 
     258      ! 
    268259   END SUBROUTINE bdy_dyn3d_frs 
     260 
    269261 
    270262   SUBROUTINE bdy_dyn3d_orlanski( idx, dta, ib_bdy, ll_npo ) 
     
    313305      !! 
    314306      !!---------------------------------------------------------------------- 
    315       INTEGER                     ::   kt 
    316       !! 
     307      INTEGER, INTENT(in) ::   kt   ! time step index 
     308      ! 
    317309      INTEGER  ::   jb, jk         ! dummy loop indices 
    318       INTEGER  ::   ii, ij, igrd   ! local integers 
    319       REAL(wp) ::   zwgt           ! boundary weight 
    320       INTEGER  ::  ib_bdy          ! loop index 
    321       !!---------------------------------------------------------------------- 
    322       ! 
    323       IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_dmp') 
    324       ! 
    325       !------------------------------------------------------- 
    326  
     310      INTEGER  ::   ib_bdy         ! loop index 
     311      INTEGER  ::   ii, ij, igrd   ! local integers 
     312      REAL(wp) ::   zwgt           ! boundary weight 
     313      !!---------------------------------------------------------------------- 
     314      ! 
     315      IF( nn_timing == 1 )   CALL timing_start('bdy_dyn3d_dmp') 
     316      ! 
    327317      DO ib_bdy=1, nb_bdy 
    328318         IF ( ln_dyn3d_dmp(ib_bdy) .and. cn_dyn3d(ib_bdy) /= 'none' ) THEN 
     
    349339            END DO 
    350340         ENDIF 
    351       ENDDO 
     341      END DO 
    352342      ! 
    353343      CALL lbc_lnk( ua, 'U', -1. )   ;   CALL lbc_lnk( va, 'V', -1. )   ! Boundary points should be updated 
    354344      ! 
    355       IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_dmp') 
    356  
     345      IF( nn_timing == 1 )   CALL timing_stop('bdy_dyn3d_dmp') 
     346      ! 
    357347   END SUBROUTINE bdy_dyn3d_dmp 
    358348 
     
    399389      WRITE(*,*) 'bdy_dyn3d: You should not have seen this print! error?', kt 
    400390   END SUBROUTINE bdy_dyn3d 
    401  
    402391   SUBROUTINE bdy_dyn3d_dmp( kt )      ! Empty routine 
    403392      WRITE(*,*) 'bdy_dyn3d_dmp: You should not have seen this print! error?', kt 
    404393   END SUBROUTINE bdy_dyn3d_dmp 
    405  
    406394#endif 
    407395 
Note: See TracChangeset for help on using the changeset viewer.