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 @ 15354

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

trunk: BDY compliant with corner communications, see #2731

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