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

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

trunk: final version (hopefully) for ticket #2731

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