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 3367 for branches/2012/dev_r3327_MERCATOR1_BDY/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn3d.F90 – NEMO

Ignore:
Timestamp:
2012-04-25T12:21:21+02:00 (12 years ago)
Author:
greffray
Message:

Merge tidal packages
Merge OBC-BDY packages
Add atmospheric pressure at the open boundaries
Modification of the namelist for AMM12 configuration

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2012/dev_r3327_MERCATOR1_BDY/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn3d.F90

    r3294 r3367  
    1919   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    2020   USE in_out_manager  ! 
     21   Use phycst 
    2122 
    2223   IMPLICIT NONE 
     
    2425 
    2526   PUBLIC   bdy_dyn3d     ! routine called by bdy_dyn 
     27   PUBLIC   bdy_dyn3d_dmp ! routine called by step 
    2628 
    2729   !!---------------------------------------------------------------------- 
     
    5557         CASE(jp_frs) 
    5658            CALL bdy_dyn3d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 
     59         CASE(2) 
     60            CALL bdy_dyn3d_spe( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 
     61         CASE(3) 
     62            CALL bdy_dyn3d_zro( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 
    5763         CASE DEFAULT 
    5864            CALL ctl_stop( 'bdy_dyn3d : unrecognised option for open boundaries for baroclinic velocities' ) 
     
    6268   END SUBROUTINE bdy_dyn3d 
    6369 
     70   SUBROUTINE bdy_dyn3d_spe( idx, dta, kt ) 
     71      !!---------------------------------------------------------------------- 
     72      !!                  ***  SUBROUTINE bdy_dyn3d_spe  *** 
     73      !! 
     74      !! ** Purpose : - Apply a specified value for baroclinic velocities 
     75      !!                at open boundaries. 
     76      !! 
     77      !!---------------------------------------------------------------------- 
     78      INTEGER                     ::   kt 
     79      TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
     80      TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
     81      !! 
     82      INTEGER  ::   jb, jk         ! dummy loop indices 
     83      INTEGER  ::   ii, ij, igrd   ! local integers 
     84      REAL(wp) ::   zwgt           ! boundary weight 
     85      !!---------------------------------------------------------------------- 
     86      ! 
     87      IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_spe') 
     88      ! 
     89      igrd = 2                      ! Relaxation of zonal velocity 
     90      DO jb = 1, idx%nblenrim(igrd) 
     91         DO jk = 1, jpkm1 
     92            ii   = idx%nbi(jb,igrd) 
     93            ij   = idx%nbj(jb,igrd) 
     94            ua(ii,ij,jk) = dta%u3d(jb,jk) * umask(ii,ij,jk) 
     95         END DO 
     96      END DO 
     97      ! 
     98      igrd = 3                      ! Relaxation of meridional 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            va(ii,ij,jk) = dta%v3d(jb,jk) * vmask(ii,ij,jk) 
     104         END DO 
     105      END DO 
     106      CALL lbc_lnk( ua, 'U', -1. )   ;   CALL lbc_lnk( va, 'V', -1. )   ! Boundary points should be updated 
     107      ! 
     108      IF( kt .eq. 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_zro( idx, dta, kt ) 
     115      !!---------------------------------------------------------------------- 
     116      !!                  ***  SUBROUTINE bdy_dyn3d_zro  *** 
     117      !! 
     118      !! ** Purpose : - baroclinic velocities = 0. at open boundaries. 
     119      !! 
     120      !!---------------------------------------------------------------------- 
     121      INTEGER                     ::   kt 
     122      TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
     123      TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
     124      !! 
     125      INTEGER  ::   ib, ik         ! dummy loop indices 
     126      INTEGER  ::   ii, ij, igrd, zcoef   ! local integers 
     127      REAL(wp) ::   zwgt           ! boundary weight 
     128      !!---------------------------------------------------------------------- 
     129      ! 
     130      IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_zro') 
     131      ! 
     132      igrd = 2                       ! Everything is at T-points here 
     133      DO ib = 1, idx%nblenrim(igrd) 
     134         ii = idx%nbi(ib,igrd) 
     135         ij = idx%nbj(ib,igrd) 
     136         DO ik = 1, jpkm1 
     137            ua(ii,ij,ik) = 0._wp 
     138         END DO 
     139      END DO 
     140 
     141      igrd = 3                       ! Everything is at T-points here 
     142      DO ib = 1, idx%nblenrim(igrd) 
     143         ii = idx%nbi(ib,igrd) 
     144         ij = idx%nbj(ib,igrd) 
     145         DO ik = 1, jpkm1 
     146            va(ii,ij,ik) = 0._wp 
     147         END DO 
     148      END DO 
     149      ! 
     150      CALL lbc_lnk( ua, 'U', -1. )   ;   CALL lbc_lnk( va, 'V', -1. )   ! Boundary points should be updated 
     151      ! 
     152      IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 
     153 
     154      IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_zro') 
     155 
     156   END SUBROUTINE bdy_dyn3d_zro 
     157 
    64158   SUBROUTINE bdy_dyn3d_frs( idx, dta, kt ) 
    65159      !!---------------------------------------------------------------------- 
     
    111205   END SUBROUTINE bdy_dyn3d_frs 
    112206 
     207   SUBROUTINE bdy_dyn3d_dmp( kt ) 
     208      !!---------------------------------------------------------------------- 
     209      !!                  ***  SUBROUTINE bdy_dyn3d_dmp  *** 
     210      !! 
     211      !! ** Purpose : Apply damping for baroclinic velocities at open boundaries. 
     212      !! 
     213      !!---------------------------------------------------------------------- 
     214      INTEGER                     ::   kt 
     215      !! 
     216      INTEGER  ::   jb, jk         ! dummy loop indices 
     217      INTEGER  ::   ii, ij, igrd   ! local integers 
     218      REAL(wp) ::   zwgt           ! boundary weight 
     219      INTEGER  ::  ib_bdy          ! loop index 
     220      !!---------------------------------------------------------------------- 
     221      ! 
     222      IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_dmp') 
     223      ! 
     224      DO ib_bdy=1, nb_bdy 
     225         IF ( ln_dyn3d_dmp(ib_bdy).and.nn_dyn3d(ib_bdy).gt.0 ) THEN 
     226            igrd = 2                      ! Relaxation of zonal velocity 
     227            DO jb = 1, idx_bdy(ib_bdy)%nblen(igrd) 
     228               ii   = idx_bdy(ib_bdy)%nbi(jb,igrd) 
     229               ij   = idx_bdy(ib_bdy)%nbj(jb,igrd) 
     230               zwgt = idx_bdy(ib_bdy)%nbw(jb,igrd) / ( rn_time_dmp(ib_bdy) * rday ) 
     231               DO jk = 1, jpkm1 
     232                  ua(ii,ij,jk) = ( ua(ii,ij,jk) + zwgt * ( dta_bdy(ib_bdy)%u3d(jb,jk) - ub(ii,ij,jk) ) ) * umask(ii,ij,jk) 
     233               END DO 
     234            END DO 
     235            ! 
     236            igrd = 3                      ! Relaxation of meridional velocity 
     237            DO jb = 1, idx_bdy(ib_bdy)%nblen(igrd) 
     238               ii   = idx_bdy(ib_bdy)%nbi(jb,igrd) 
     239               ij   = idx_bdy(ib_bdy)%nbj(jb,igrd) 
     240               zwgt = idx_bdy(ib_bdy)%nbw(jb,igrd) / ( rn_time_dmp(ib_bdy) * rday ) 
     241               DO jk = 1, jpkm1 
     242                  va(ii,ij,jk) = ( va(ii,ij,jk) + zwgt * ( dta_bdy(ib_bdy)%v3d(jb,jk) - vb(ii,ij,jk) ) ) * vmask(ii,ij,jk) 
     243               END DO 
     244            END DO 
     245         ENDIF 
     246      ENDDO 
     247      ! 
     248      CALL lbc_lnk( ua, 'U', -1. )   ;   CALL lbc_lnk( va, 'V', -1. )   ! Boundary points should be updated 
     249      ! 
     250      IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_dmp') 
     251 
     252   END SUBROUTINE bdy_dyn3d_dmp 
    113253 
    114254#else 
Note: See TracChangeset for help on using the changeset viewer.