Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
MODULE bdydyn
!!======================================================================
!! *** MODULE bdydyn ***
!! Unstructured Open Boundary Cond. : Apply boundary conditions to velocities
!!======================================================================
!! History : 1.0 ! 2005-02 (J. Chanut, A. Sellar) Original code
!! - ! 2007-07 (D. Storkey) Move Flather implementation to separate routine.
!! 3.0 ! 2008-04 (NEMO team) add in the reference version
!! 3.2 ! 2008-04 (R. Benshila) consider velocity instead of transport
!! 3.3 ! 2010-09 (E.O'Dea) modifications for Shelf configurations
!! 3.3 ! 2010-09 (D.Storkey) add ice boundary conditions
!! 3.4 ! 2011 (D. Storkey) rewrite in preparation for OBC-BDY merge
!!----------------------------------------------------------------------
!! bdy_dyn : split velocities into barotropic and baroclinic parts
!! and call bdy_dyn2d and bdy_dyn3d to apply boundary
!! conditions
!!----------------------------------------------------------------------
USE oce ! ocean dynamics and tracers
USE dom_oce ! ocean space and time domain
USE bdy_oce ! ocean open boundary conditions
USE bdydyn2d ! open boundary conditions for barotropic solution
USE bdydyn3d ! open boundary conditions for baroclinic velocities
USE lbclnk ! ocean lateral boundary conditions (or mpp link)
USE in_out_manager !
USE domvvl ! variable volume
IMPLICIT NONE
PRIVATE
PUBLIC bdy_dyn ! routine called in dyn_nxt
!! * Substitutions
# include "domzgr_substitute.h90"
!!----------------------------------------------------------------------
!! NEMO/OCE 4.0 , NEMO Consortium (2018)
!! $Id: bdydyn.F90 13237 2020-07-03 09:12:53Z smasson $
!! Software governed by the CeCILL license (see ./LICENSE)
!!----------------------------------------------------------------------
CONTAINS
SUBROUTINE bdy_dyn( kt, Kbb, puu, pvv, Kaa, dyn3d_only )
!!----------------------------------------------------------------------
!! *** SUBROUTINE bdy_dyn ***
!!
!! ** Purpose : - Wrapper routine for bdy_dyn2d and bdy_dyn3d.
!!
!!----------------------------------------------------------------------
INTEGER , INTENT(in) :: kt ! Main time step counter
INTEGER , INTENT(in) :: Kbb, Kaa ! Ocean time level indices
REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! Ocean velocities (to be updated at open boundaries)
LOGICAL, OPTIONAL , INTENT(in) :: dyn3d_only ! T => only update baroclinic velocities
!
INTEGER :: jk, ii, ij, ib_bdy, ib, igrd ! Loop counter
LOGICAL :: ll_dyn2d, ll_dyn3d, ll_orlanski
REAL(wp), DIMENSION(jpi,jpj) :: zua2d, zva2d ! after barotropic velocities
!!----------------------------------------------------------------------
!
ll_dyn2d = .true.
ll_dyn3d = .true.
!
IF( PRESENT(dyn3d_only) ) THEN
IF( dyn3d_only ) ll_dyn2d = .false.
ENDIF
!
ll_orlanski = .false.
DO ib_bdy = 1, nb_bdy
IF ( cn_dyn2d(ib_bdy) == 'orlanski' .OR. cn_dyn2d(ib_bdy) == 'orlanski_npo' &
& .OR. cn_dyn3d(ib_bdy) == 'orlanski' .OR. cn_dyn3d(ib_bdy) == 'orlanski_npo') ll_orlanski = .true.
END DO
!-------------------------------------------------------
! Split velocities into barotropic and baroclinic parts
!-------------------------------------------------------
! ! "After" velocities:
zua2d(:,:) = 0._wp
zva2d(:,:) = 0._wp
DO jk = 1, jpkm1
zua2d(:,:) = zua2d(:,:) + e3u(:,:,jk,Kaa) * puu(:,:,jk,Kaa) * umask(:,:,jk)
zva2d(:,:) = zva2d(:,:) + e3v(:,:,jk,Kaa) * pvv(:,:,jk,Kaa) * vmask(:,:,jk)
END DO
zua2d(:,:) = zua2d(:,:) * r1_hu(:,:,Kaa)
zva2d(:,:) = zva2d(:,:) * r1_hv(:,:,Kaa)
DO jk = 1 , jpkm1
puu(:,:,jk,Kaa) = ( puu(:,:,jk,Kaa) - zua2d(:,:) ) * umask(:,:,jk)
pvv(:,:,jk,Kaa) = ( pvv(:,:,jk,Kaa) - zva2d(:,:) ) * vmask(:,:,jk)
END DO
IF( ll_orlanski ) THEN ! "Before" velocities (Orlanski condition only)
DO jk = 1 , jpkm1
puu(:,:,jk,Kbb) = ( puu(:,:,jk,Kbb) - uu_b(:,:,Kbb) ) * umask(:,:,jk)
pvv(:,:,jk,Kbb) = ( pvv(:,:,jk,Kbb) - vv_b(:,:,Kbb) ) * vmask(:,:,jk)
END DO
ENDIF
!-------------------------------------------------------
! Apply boundary conditions to barotropic and baroclinic
! parts separately
!-------------------------------------------------------
IF( ll_dyn2d ) CALL bdy_dyn2d( kt, zua2d, zva2d, uu_b(:,:,Kbb), vv_b(:,:,Kbb), r1_hu(:,:,Kaa), r1_hv(:,:,Kaa), ssh(:,:,Kaa) )
IF( ll_dyn3d ) CALL bdy_dyn3d( kt, Kbb, puu, pvv, Kaa )
!-------------------------------------------------------
! Recombine velocities
!-------------------------------------------------------
!
DO jk = 1 , jpkm1
puu(:,:,jk,Kaa) = ( puu(:,:,jk,Kaa) + zua2d(:,:) ) * umask(:,:,jk)
pvv(:,:,jk,Kaa) = ( pvv(:,:,jk,Kaa) + zva2d(:,:) ) * vmask(:,:,jk)
END DO
!
IF ( ll_orlanski ) THEN
DO jk = 1 , jpkm1
puu(:,:,jk,Kbb) = ( puu(:,:,jk,Kbb) + uu_b(:,:,Kbb) ) * umask(:,:,jk)
pvv(:,:,jk,Kbb) = ( pvv(:,:,jk,Kbb) + vv_b(:,:,Kbb) ) * vmask(:,:,jk)
END DO
END IF
!
END SUBROUTINE bdy_dyn
!!======================================================================
END MODULE bdydyn