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.
bdydyn3d.F90 in NEMO/trunk/src/OCE/BDY – NEMO

source: NEMO/trunk/src/OCE/BDY/bdydyn3d.F90 @ 15360

Last change on this file since 15360 was 15360, checked in by smasson, 12 months ago

trunk: bugfix following [15354], see #2731

  • Property svn:keywords set to Id
File size: 21.1 KB
Line 
1MODULE bdydyn3d
2   !!======================================================================
3   !!                       ***  MODULE  bdydyn3d  ***
4   !! Unstructured Open Boundary Cond. :   Flow relaxation scheme on baroclinic velocities
5   !!======================================================================
6   !! History :  3.4  !  2011     (D. Storkey) new module as part of BDY rewrite
7   !!            3.5  !  2012     (S. Mocavero, I. Epicoco) Optimization of BDY communications
8   !!----------------------------------------------------------------------
9   !!   bdy_dyn3d        : apply open boundary conditions to baroclinic velocities
10   !!   bdy_dyn3d_frs    : apply Flow Relaxation Scheme
11   !!----------------------------------------------------------------------
12   USE timing          ! Timing
13   USE oce             ! ocean dynamics and tracers
14   USE dom_oce         ! ocean space and time domain
15   USE bdy_oce         ! ocean open boundary conditions
16   USE bdylib          ! for orlanski library routines
17   USE lib_mpp, ONLY: jpfillnothing
18   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
19   USE in_out_manager  !
20   USE lib_mpp
21   Use phycst
22
23   IMPLICIT NONE
24   PRIVATE
25
26   PUBLIC   bdy_dyn3d     ! routine called by bdy_dyn
27   PUBLIC   bdy_dyn3d_dmp ! routine called by step
28
29   !!----------------------------------------------------------------------
30   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
31   !! $Id$
32   !! Software governed by the CeCILL license (see ./LICENSE)
33   !!----------------------------------------------------------------------
34CONTAINS
35
36   SUBROUTINE bdy_dyn3d( kt, Kbb, puu, pvv, Kaa )
37      !!----------------------------------------------------------------------
38      !!                  ***  SUBROUTINE bdy_dyn3d  ***
39      !!
40      !! ** Purpose : - Apply open boundary conditions for baroclinic velocities
41      !!
42      !!----------------------------------------------------------------------
43      INTEGER                             , INTENT( in    ) ::   kt        ! Main time step counter
44      INTEGER                             , INTENT( in    ) ::   Kbb, Kaa  ! Time level indices
45      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
46      !
47      INTEGER               ::   ib_bdy, ir     ! BDY set index, rim index
48      LOGICAL               ::   llrim0         ! indicate if rim 0 is treated
49      LOGICAL, DIMENSION(8) ::   llsend2, llrecv2, llsend3, llrecv3  ! indicate how communications are to be carried out
50      !!----------------------------------------------------------------------
51     
52      llsend2(:) = .false.   ;   llrecv2(:) = .false.
53      llsend3(:) = .false.   ;   llrecv3(:) = .false.
54      DO ir = 1, 0, -1   ! treat rim 1 before rim 0
55         IF( ir == 0 ) THEN   ;   llrim0 = .TRUE.
56         ELSE                 ;   llrim0 = .FALSE.
57         END IF
58         DO ib_bdy=1, nb_bdy
59            !
60            SELECT CASE( cn_dyn3d(ib_bdy) )
61            CASE('none')        ;   CYCLE
62            CASE('frs' )        ! treat the whole boundary at once
63                       IF( ir == 0) CALL bdy_dyn3d_frs( puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy )
64            CASE('specified')   ! treat the whole rim      at once
65                       IF( ir == 0) CALL bdy_dyn3d_spe( puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy )
66            CASE('zero')        ! treat the whole rim      at once
67                       IF( ir == 0) CALL bdy_dyn3d_zro( puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy )
68            CASE('orlanski' )   ;   CALL bdy_dyn3d_orlanski( Kbb, puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, llrim0, ll_npo=.false. )
69            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.  )
70            CASE('zerograd')    ;   CALL bdy_dyn3d_zgrad( puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy, llrim0 )
71            CASE('neumann')     ;   CALL bdy_dyn3d_nmn( puu, pvv, Kaa, idx_bdy(ib_bdy), ib_bdy, llrim0 )
72            CASE DEFAULT        ;   CALL ctl_stop( 'bdy_dyn3d : unrecognised option for open boundaries for baroclinic velocities' )
73            END SELECT
74         END DO
75         !
76         IF( nn_hls > 1 .AND. ir == 1 ) CYCLE   ! at least 2 halos will be corrected -> no need to correct rim 1 before rim 0
77         IF( nn_hls == 1 ) THEN
78            llsend2(:) = .false.   ;   llrecv2(:) = .false.
79            llsend3(:) = .false.   ;   llrecv3(:) = .false.
80         END IF
81         DO ib_bdy=1, nb_bdy
82            SELECT CASE( cn_dyn3d(ib_bdy) )
83            CASE('orlanski', 'orlanski_npo')
84               llsend2(:) = llsend2(:) .OR. lsend_bdyolr(ib_bdy,2,:,ir)   ! possibly every direction, U points
85               llrecv2(:) = llrecv2(:) .OR. lrecv_bdyolr(ib_bdy,2,:,ir)   ! possibly every direction, U points
86               llsend3(:) = llsend3(:) .OR. lsend_bdyolr(ib_bdy,3,:,ir)   ! possibly every direction, V points
87               llrecv3(:) = llrecv3(:) .OR. lrecv_bdyolr(ib_bdy,3,:,ir)   ! possibly every direction, V points
88            CASE('zerograd')
89               llsend2(:) = llsend2(:) .OR. lsend_bdyint(ib_bdy,2,:,ir)
90               llrecv2(:) = llrecv2(:) .OR. lrecv_bdyint(ib_bdy,2,:,ir)
91               llsend3(:) = llsend3(:) .OR. lsend_bdyint(ib_bdy,3,:,ir)
92               llrecv3(:) = llrecv3(:) .OR. lrecv_bdyint(ib_bdy,3,:,ir)
93            CASE('neumann')
94               llsend2(:) = llsend2(:) .OR. lsend_bdyint(ib_bdy,2,:,ir)   ! possibly every direction, U points
95               llrecv2(:) = llrecv2(:) .OR. lrecv_bdyint(ib_bdy,2,:,ir)   ! possibly every direction, U points
96               llsend3(:) = llsend3(:) .OR. lsend_bdyint(ib_bdy,3,:,ir)   ! possibly every direction, V points
97               llrecv3(:) = llrecv3(:) .OR. lrecv_bdyint(ib_bdy,3,:,ir)   ! possibly every direction, V points
98            END SELECT
99         END DO
100         !
101         IF( ANY(llsend2) .OR. ANY(llrecv2) ) THEN   ! if need to send/recv in at least one direction
102            CALL lbc_lnk( 'bdydyn2d', puu(:,:,:,Kaa), 'U', -1.0_wp, kfillmode=jpfillnothing ,lsend=llsend2, lrecv=llrecv2 )
103         END IF
104         IF( ANY(llsend3) .OR. ANY(llrecv3) ) THEN   ! if need to send/recv in at least one direction
105            CALL lbc_lnk( 'bdydyn2d', pvv(:,:,:,Kaa), 'V', -1.0_wp, kfillmode=jpfillnothing ,lsend=llsend3, lrecv=llrecv3 )
106         END IF
107      END DO   ! ir
108      !
109   END SUBROUTINE bdy_dyn3d
110
111
112   SUBROUTINE bdy_dyn3d_spe( puu, pvv, Kaa, idx, dta, kt, ib_bdy )
113      !!----------------------------------------------------------------------
114      !!                  ***  SUBROUTINE bdy_dyn3d_spe  ***
115      !!
116      !! ** Purpose : - Apply a specified value for baroclinic velocities
117      !!                at open boundaries.
118      !!
119      !!----------------------------------------------------------------------
120      INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index
121      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
122      TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices
123      TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data
124      INTEGER                             , INTENT( in    ) ::   kt        ! Time step
125      INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index
126      !
127      INTEGER  ::   jb, jk         ! dummy loop indices
128      INTEGER  ::   ii, ij, igrd   ! local integers
129      !!----------------------------------------------------------------------
130      !
131      igrd = 2                      ! Relaxation of zonal velocity
132      DO jb = 1, idx%nblenrim(igrd)
133         DO jk = 1, jpkm1
134            ii   = idx%nbi(jb,igrd)
135            ij   = idx%nbj(jb,igrd)
136            puu(ii,ij,jk,Kaa) = dta%u3d(jb,jk) * umask(ii,ij,jk)
137         END DO
138      END DO
139      !
140      igrd = 3                      ! Relaxation of meridional velocity
141      DO jb = 1, idx%nblenrim(igrd)
142         DO jk = 1, jpkm1
143            ii   = idx%nbi(jb,igrd)
144            ij   = idx%nbj(jb,igrd)
145            pvv(ii,ij,jk,Kaa) = dta%v3d(jb,jk) * vmask(ii,ij,jk)
146         END DO
147      END DO
148      !
149   END SUBROUTINE bdy_dyn3d_spe
150
151
152   SUBROUTINE bdy_dyn3d_zgrad( puu, pvv, Kaa, idx, dta, kt, ib_bdy, llrim0 )
153      !!----------------------------------------------------------------------
154      !!                  ***  SUBROUTINE bdy_dyn3d_zgrad  ***
155      !!
156      !! ** Purpose : - Enforce a zero gradient of normal velocity
157      !!
158      !!----------------------------------------------------------------------
159      INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index
160      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
161      TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices
162      TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data
163      INTEGER                             , INTENT( in    ) ::   kt
164      INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index
165      LOGICAL                             , INTENT( in    ) ::   llrim0   ! indicate if rim 0 is treated
166      !!
167      INTEGER  ::   jb, jk         ! dummy loop indices
168      INTEGER  ::   ii, ij, igrd   ! local integers
169      INTEGER  ::   flagu, flagv           ! short cuts
170      INTEGER  ::   ibeg, iend     ! length of rim to be treated (rim 0 or rim 1 or both)
171      !!----------------------------------------------------------------------
172      !
173      igrd = 2                      ! Copying tangential velocity into bdy points
174      IF( llrim0 ) THEN   ;   ibeg = 1                       ;   iend = idx%nblenrim0(igrd)
175      ELSE                ;   ibeg = idx%nblenrim0(igrd)+1   ;   iend = idx%nblenrim(igrd)
176      ENDIF
177      DO jb = ibeg, iend
178         ii    = idx%nbi(jb,igrd)
179         ij    = idx%nbj(jb,igrd)
180         flagu = NINT(idx%flagu(jb,igrd))
181         flagv = NINT(idx%flagv(jb,igrd))
182         !
183         IF( flagu == 0 )   THEN              ! north/south bdy
184            IF( ij+flagv > jpj .OR. ij+flagv < 1 )   CYCLE     
185            !
186            DO jk = 1, jpkm1
187               puu(ii,ij,jk,Kaa) = puu(ii,ij+flagv,jk,Kaa) * umask(ii,ij+flagv,jk)
188            END DO
189            !
190         END IF
191      END DO
192      !
193      igrd = 3                      ! Copying tangential velocity into bdy points
194      IF( llrim0 ) THEN   ;   ibeg = 1                       ;   iend = idx%nblenrim0(igrd)
195      ELSE                ;   ibeg = idx%nblenrim0(igrd)+1   ;   iend = idx%nblenrim(igrd)
196      ENDIF
197      DO jb = ibeg, iend
198         ii    = idx%nbi(jb,igrd)
199         ij    = idx%nbj(jb,igrd)
200         flagu = NINT(idx%flagu(jb,igrd))
201         flagv = NINT(idx%flagv(jb,igrd))
202         !
203         IF( flagv == 0 )   THEN              !  west/east  bdy
204            IF( ii+flagu > jpi .OR. ii+flagu < 1 )   CYCLE     
205            !
206            DO jk = 1, jpkm1
207               pvv(ii,ij,jk,Kaa) = pvv(ii+flagu,ij,jk,Kaa) * vmask(ii+flagu,ij,jk)
208            END DO
209            !
210         END IF
211      END DO
212      !
213   END SUBROUTINE bdy_dyn3d_zgrad
214
215
216   SUBROUTINE bdy_dyn3d_zro( puu, pvv, Kaa, idx, dta, kt, ib_bdy )
217      !!----------------------------------------------------------------------
218      !!                  ***  SUBROUTINE bdy_dyn3d_zro  ***
219      !!
220      !! ** Purpose : - baroclinic velocities = 0. at open boundaries.
221      !!
222      !!----------------------------------------------------------------------
223      INTEGER                             , INTENT( in    ) ::   kt        ! time step index
224      INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index
225      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
226      TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices
227      TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data
228      INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index
229      !
230      INTEGER  ::   ib, ik         ! dummy loop indices
231      INTEGER  ::   ii, ij, igrd   ! local integers
232      !!----------------------------------------------------------------------
233      !
234      igrd = 2                       ! Everything is at T-points here
235      DO ib = 1, idx%nblenrim(igrd)
236         ii = idx%nbi(ib,igrd)
237         ij = idx%nbj(ib,igrd)
238         DO ik = 1, jpkm1
239            puu(ii,ij,ik,Kaa) = 0._wp
240         END DO
241      END DO
242      !
243      igrd = 3                       ! Everything is at T-points here
244      DO ib = 1, idx%nblenrim(igrd)
245         ii = idx%nbi(ib,igrd)
246         ij = idx%nbj(ib,igrd)
247         DO ik = 1, jpkm1
248            pvv(ii,ij,ik,Kaa) = 0._wp
249         END DO
250      END DO
251      !
252   END SUBROUTINE bdy_dyn3d_zro
253
254
255   SUBROUTINE bdy_dyn3d_frs( puu, pvv, Kaa, idx, dta, kt, ib_bdy )
256      !!----------------------------------------------------------------------
257      !!                  ***  SUBROUTINE bdy_dyn3d_frs  ***
258      !!
259      !! ** Purpose : - Apply the Flow Relaxation Scheme for baroclinic velocities
260      !!                at open boundaries.
261      !!
262      !! References :- Engedahl H., 1995: Use of the flow relaxation scheme in
263      !!               a three-dimensional baroclinic ocean model with realistic
264      !!               topography. Tellus, 365-382.
265      !!----------------------------------------------------------------------
266      INTEGER                             , INTENT( in    ) ::   kt        ! time step index
267      INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index
268      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
269      TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices
270      TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data
271      INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index
272      !
273      INTEGER  ::   jb, jk         ! dummy loop indices
274      INTEGER  ::   ii, ij, igrd   ! local integers
275      REAL(wp) ::   zwgt           ! boundary weight
276      !!----------------------------------------------------------------------
277      !
278      igrd = 2                      ! Relaxation of zonal velocity
279      DO jb = 1, idx%nblen(igrd)
280         DO jk = 1, jpkm1
281            ii   = idx%nbi(jb,igrd)
282            ij   = idx%nbj(jb,igrd)
283            zwgt = idx%nbw(jb,igrd)
284            puu(ii,ij,jk,Kaa) = ( puu(ii,ij,jk,Kaa) + zwgt * ( dta%u3d(jb,jk) - puu(ii,ij,jk,Kaa) ) ) * umask(ii,ij,jk)
285         END DO
286      END DO
287      !
288      igrd = 3                      ! Relaxation of meridional velocity
289      DO jb = 1, idx%nblen(igrd)
290         DO jk = 1, jpkm1
291            ii   = idx%nbi(jb,igrd)
292            ij   = idx%nbj(jb,igrd)
293            zwgt = idx%nbw(jb,igrd)
294            pvv(ii,ij,jk,Kaa) = ( pvv(ii,ij,jk,Kaa) + zwgt * ( dta%v3d(jb,jk) - pvv(ii,ij,jk,Kaa) ) ) * vmask(ii,ij,jk)
295         END DO
296      END DO   
297      !
298   END SUBROUTINE bdy_dyn3d_frs
299
300
301   SUBROUTINE bdy_dyn3d_orlanski( Kbb, puu, pvv, Kaa, idx, dta, ib_bdy, llrim0, ll_npo )
302      !!----------------------------------------------------------------------
303      !!                 ***  SUBROUTINE bdy_dyn3d_orlanski  ***
304      !!             
305      !!              - Apply Orlanski radiation to baroclinic velocities.
306      !!              - Wrapper routine for bdy_orlanski_3d
307      !!
308      !!
309      !! References:  Marchesiello, McWilliams and Shchepetkin, Ocean Modelling vol. 3 (2001)   
310      !!----------------------------------------------------------------------
311      INTEGER                             , INTENT( in    ) ::   Kbb, Kaa  ! Time level indices
312      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
313      TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices
314      TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data
315      INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index
316      LOGICAL                             , INTENT( in    ) ::   llrim0    ! indicate if rim 0 is treated
317      LOGICAL                             , INTENT( in    ) ::   ll_npo    ! switch for NPO version
318
319      INTEGER  ::   jb, igrd                               ! dummy loop indices
320      !!----------------------------------------------------------------------
321      !
322      !! Note that at this stage the puu(:,:,:,Kbb) and puu(:,:,:,Kaa) arrays contain the baroclinic velocities.
323      !
324      igrd = 2      ! Orlanski bc on u-velocity;
325      !           
326      CALL bdy_orlanski_3d( idx, igrd, puu(:,:,:,Kbb), puu(:,:,:,Kaa), dta%u3d, ll_npo, llrim0 )
327
328      igrd = 3      ! Orlanski bc on v-velocity
329     
330      CALL bdy_orlanski_3d( idx, igrd, pvv(:,:,:,Kbb), pvv(:,:,:,Kaa), dta%v3d, ll_npo, llrim0 )
331      !
332   END SUBROUTINE bdy_dyn3d_orlanski
333
334
335   SUBROUTINE bdy_dyn3d_dmp( kt, Kbb, puu, pvv, Krhs )
336      !!----------------------------------------------------------------------
337      !!                  ***  SUBROUTINE bdy_dyn3d_dmp  ***
338      !!
339      !! ** Purpose : Apply damping for baroclinic velocities at open boundaries.
340      !!
341      !!----------------------------------------------------------------------
342      INTEGER                             , INTENT( in    ) ::   kt        ! time step
343      INTEGER                             , INTENT( in    ) ::   Kbb, Krhs ! Time level indices
344      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities and trends (to be updated at open boundaries)
345      !
346      INTEGER  ::   jb, jk         ! dummy loop indices
347      INTEGER  ::   ib_bdy         ! loop index
348      INTEGER  ::   ii, ij, igrd   ! local integers
349      REAL(wp) ::   zwgt           ! boundary weight
350      !!----------------------------------------------------------------------
351      IF( l_istiled .AND. ntile /= 1 ) RETURN                        ! Do only for the full domain
352      !
353      IF( ln_timing )   CALL timing_start('bdy_dyn3d_dmp')
354      !
355      DO ib_bdy=1, nb_bdy
356         IF ( ln_dyn3d_dmp(ib_bdy) .and. cn_dyn3d(ib_bdy) /= 'none' ) THEN
357            igrd = 2                      ! Relaxation of zonal velocity
358            DO jb = 1, idx_bdy(ib_bdy)%nblen(igrd)
359               ii   = idx_bdy(ib_bdy)%nbi(jb,igrd)
360               ij   = idx_bdy(ib_bdy)%nbj(jb,igrd)
361               zwgt = idx_bdy(ib_bdy)%nbd(jb,igrd)
362               DO jk = 1, jpkm1
363                  puu(ii,ij,jk,Krhs) = ( puu(ii,ij,jk,Krhs) + zwgt * ( dta_bdy(ib_bdy)%u3d(jb,jk) - &
364                                   puu(ii,ij,jk,Kbb) + uu_b(ii,ij,Kbb)) ) * umask(ii,ij,jk)
365               END DO
366            END DO
367            !
368            igrd = 3                      ! Relaxation of meridional velocity
369            DO jb = 1, idx_bdy(ib_bdy)%nblen(igrd)
370               ii   = idx_bdy(ib_bdy)%nbi(jb,igrd)
371               ij   = idx_bdy(ib_bdy)%nbj(jb,igrd)
372               zwgt = idx_bdy(ib_bdy)%nbd(jb,igrd)
373               DO jk = 1, jpkm1
374                  pvv(ii,ij,jk,Krhs) = ( pvv(ii,ij,jk,Krhs) + zwgt * ( dta_bdy(ib_bdy)%v3d(jb,jk) -  &
375                                   pvv(ii,ij,jk,Kbb) + vv_b(ii,ij,Kbb)) ) * vmask(ii,ij,jk)
376               END DO
377            END DO
378         ENDIF
379      END DO
380      !
381      IF( ln_timing )   CALL timing_stop('bdy_dyn3d_dmp')
382      !
383   END SUBROUTINE bdy_dyn3d_dmp
384
385
386   SUBROUTINE bdy_dyn3d_nmn( puu, pvv, Kaa, idx, ib_bdy, llrim0 )
387      !!----------------------------------------------------------------------
388      !!                 ***  SUBROUTINE bdy_dyn3d_nmn  ***
389      !!             
390      !!              - Apply Neumann condition to baroclinic velocities.
391      !!              - Wrapper routine for bdy_nmn
392      !!
393      !!
394      !!----------------------------------------------------------------------
395      INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index
396      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
397      TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices
398      INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index
399      LOGICAL                             , INTENT( in    ) ::   llrim0    ! indicate if rim 0 is treated
400      INTEGER  ::   igrd                        ! dummy indice
401      !!----------------------------------------------------------------------
402      !
403      !! Note that at this stage the puu(:,:,:,Kbb) and puu(:,:,:,Kaa) arrays contain the baroclinic velocities.
404      !
405      igrd = 2      ! Neumann bc on u-velocity;
406      !           
407      CALL bdy_nmn( idx, igrd, puu(:,:,:,Kaa), llrim0 )
408
409      igrd = 3      ! Neumann bc on v-velocity
410     
411      CALL bdy_nmn( idx, igrd, pvv(:,:,:,Kaa), llrim0 )
412      !
413   END SUBROUTINE bdy_dyn3d_nmn
414
415   !!======================================================================
416END MODULE bdydyn3d
Note: See TracBrowser for help on using the repository browser.