source: branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn.F90 @ 4254

Last change on this file since 4254 was 4254, checked in by acc, 8 years ago

Branch 2013/dev_r3858_NOC_ZTC, #863. Merge in final changes from the dev_r3867_MERCATOR1_DYN branch; mainly AGRIF and BDY compatibility

  • Property svn:keywords set to Id
File size: 7.6 KB
Line 
1MODULE bdydyn
2   !!======================================================================
3   !!                       ***  MODULE  bdydyn  ***
4   !! Unstructured Open Boundary Cond. :   Apply boundary conditions to velocities
5   !!======================================================================
6   !! History :  1.0  !  2005-02  (J. Chanut, A. Sellar)  Original code
7   !!             -   !  2007-07  (D. Storkey) Move Flather implementation to separate routine.
8   !!            3.0  !  2008-04  (NEMO team)  add in the reference version
9   !!            3.2  !  2008-04  (R. Benshila) consider velocity instead of transport
10   !!            3.3  !  2010-09  (E.O'Dea) modifications for Shelf configurations
11   !!            3.3  !  2010-09  (D.Storkey) add ice boundary conditions
12   !!            3.4  !  2011     (D. Storkey) rewrite in preparation for OBC-BDY merge
13   !!----------------------------------------------------------------------
14#if defined key_bdy 
15   !!----------------------------------------------------------------------
16   !!   'key_bdy' :                    Unstructured Open Boundary Condition
17   !!----------------------------------------------------------------------
18   !!   bdy_dyn        : split velocities into barotropic and baroclinic parts
19   !!                    and call bdy_dyn2d and bdy_dyn3d to apply boundary
20   !!                    conditions
21   !!----------------------------------------------------------------------
22   USE wrk_nemo        ! Memory Allocation
23   USE timing          ! Timing
24   USE oce             ! ocean dynamics and tracers
25   USE dom_oce         ! ocean space and time domain
26   USE dynspg_oce     
27   USE bdy_oce         ! ocean open boundary conditions
28   USE bdydyn2d        ! open boundary conditions for barotropic solution
29   USE bdydyn3d        ! open boundary conditions for baroclinic velocities
30   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
31   USE in_out_manager  !
32   USE domvvl
33
34   IMPLICIT NONE
35   PRIVATE
36
37   PUBLIC   bdy_dyn     ! routine called in dynspg_flt (if lk_dynspg_flt) or
38                        ! dyn_nxt (if lk_dynspg_ts or lk_dynspg_exp)
39
40#  include "domzgr_substitute.h90"
41   !!----------------------------------------------------------------------
42   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
43   !! $Id$
44   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
45   !!----------------------------------------------------------------------
46CONTAINS
47
48   SUBROUTINE bdy_dyn( kt, dyn3d_only )
49      !!----------------------------------------------------------------------
50      !!                  ***  SUBROUTINE bdy_dyn  ***
51      !!
52      !! ** Purpose : - Wrapper routine for bdy_dyn2d and bdy_dyn3d.
53      !!
54      !!----------------------------------------------------------------------
55      !!
56      INTEGER, INTENT( in )           :: kt               ! Main time step counter
57      LOGICAL, INTENT( in ), OPTIONAL :: dyn3d_only       ! T => only update baroclinic velocities
58      !!
59      INTEGER               :: jk,ii,ij,ib_bdy,ib,igrd     ! Loop counter
60      LOGICAL               :: ll_dyn2d, ll_dyn3d, ll_orlanski
61      !!
62
63      IF( nn_timing == 1 ) CALL timing_start('bdy_dyn')
64
65      ll_dyn2d = .true.
66      ll_dyn3d = .true.
67
68      IF( PRESENT(dyn3d_only) ) THEN
69         IF( dyn3d_only ) ll_dyn2d = .false.
70      ENDIF
71
72      ll_orlanski = .false.
73      DO ib_bdy = 1, nb_bdy
74         IF ( cn_dyn2d(ib_bdy) == 'orlanski' .or. cn_dyn2d(ib_bdy) == 'orlanski_npo' &
75     &   .or. cn_dyn3d(ib_bdy) == 'orlanski' .or. cn_dyn3d(ib_bdy) == 'orlanski_npo') ll_orlanski = .true.
76      ENDDO
77
78      !-------------------------------------------------------
79      ! Set pointers
80      !-------------------------------------------------------
81
82      pssh => sshn
83      phur => hur
84      phvr => hvr
85      CALL wrk_alloc(jpi,jpj,pua2d,pva2d) 
86      IF ( ll_orlanski ) CALL wrk_alloc(jpi,jpj,pub2d,pvb2d) 
87
88      !-------------------------------------------------------
89      ! Split velocities into barotropic and baroclinic parts
90      !-------------------------------------------------------
91
92      ! "After" velocities:
93
94      pua2d(:,:) = 0.e0
95      pva2d(:,:) = 0.e0
96     
97      IF (lk_vvl) THEN
98         DO jk = 1, jpkm1
99            pua2d(:,:) = pua2d(:,:) + fse3u_a(:,:,jk) * umask(:,:,jk) * ua(:,:,jk)
100            pva2d(:,:) = pva2d(:,:) + fse3v_a(:,:,jk) * vmask(:,:,jk) * va(:,:,jk)
101         END DO
102         pua2d(:,:) = pua2d(:,:) / ( hu_0(:,:) + sshu_a(:,:) + 1._wp - umask(:,:,1) ) 
103         pva2d(:,:) = pva2d(:,:) / ( hv_0(:,:) + sshv_a(:,:) + 1._wp - vmask(:,:,1) )
104      ELSE
105         DO jk = 1, jpkm1
106            pua2d(:,:) = pua2d(:,:) + fse3u(:,:,jk) * umask(:,:,jk) * ua(:,:,jk)
107            pva2d(:,:) = pva2d(:,:) + fse3v(:,:,jk) * vmask(:,:,jk) * va(:,:,jk)
108         END DO
109         pua2d(:,:) = pua2d(:,:) * phur(:,:)
110         pva2d(:,:) = pva2d(:,:) * phvr(:,:)
111      ENDIF
112
113      DO jk = 1 , jpkm1
114         ua(:,:,jk) = ua(:,:,jk) - pua2d(:,:)
115         va(:,:,jk) = va(:,:,jk) - pva2d(:,:)
116      END DO
117
118      ! "Before" velocities (required for Orlanski condition):
119
120      IF ( ll_orlanski ) THEN         
121         pub2d(:,:) = 0.e0
122         pvb2d(:,:) = 0.e0
123
124         IF (lk_vvl) THEN
125            DO jk = 1, jpkm1   !! Vertically integrated momentum trends
126               pub2d(:,:) = pub2d(:,:) + fse3u_b(:,:,jk) * umask(:,:,jk) * ub(:,:,jk)
127               pvb2d(:,:) = pvb2d(:,:) + fse3v_b(:,:,jk) * vmask(:,:,jk) * vb(:,:,jk)
128            END DO
129            pub2d(:,:) = pub2d(:,:) / ( hu_0(:,:) + sshu_b(:,:) + 1._wp - umask(:,:,1) ) 
130            pvb2d(:,:) = pvb2d(:,:) / ( hv_0(:,:) + sshv_b(:,:) + 1._wp - vmask(:,:,1) )
131         ELSE
132            DO jk = 1, jpkm1   !! Vertically integrated momentum trends
133               pub2d(:,:) = pub2d(:,:) + fse3u(:,:,jk) * umask(:,:,jk) * ub(:,:,jk)
134               pvb2d(:,:) = pvb2d(:,:) + fse3v(:,:,jk) * vmask(:,:,jk) * vb(:,:,jk)
135            END DO
136            pub2d(:,:) = pub2d(:,:) * phur(:,:)
137            pvb2d(:,:) = pvb2d(:,:) * phvr(:,:)
138         ENDIF
139
140         DO jk = 1 , jpkm1
141            ub(:,:,jk) = ub(:,:,jk) - pub2d(:,:)
142            vb(:,:,jk) = vb(:,:,jk) - pvb2d(:,:)
143         END DO
144      END IF
145
146      !-------------------------------------------------------
147      ! Apply boundary conditions to barotropic and baroclinic
148      ! parts separately
149      !-------------------------------------------------------
150
151      IF( ll_dyn2d ) CALL bdy_dyn2d( kt )
152
153      IF( ll_dyn3d ) CALL bdy_dyn3d( kt )
154
155      !-------------------------------------------------------
156      ! Recombine velocities
157      !-------------------------------------------------------
158
159      DO jk = 1 , jpkm1
160         ua(:,:,jk) = ( ua(:,:,jk) + pua2d(:,:) ) * umask(:,:,jk)
161         va(:,:,jk) = ( va(:,:,jk) + pva2d(:,:) ) * vmask(:,:,jk)
162      END DO
163
164      IF ( ll_orlanski ) THEN
165         DO jk = 1 , jpkm1
166            ub(:,:,jk) = ( ub(:,:,jk) + pub2d(:,:) ) * umask(:,:,jk)
167            vb(:,:,jk) = ( vb(:,:,jk) + pvb2d(:,:) ) * vmask(:,:,jk)
168         END DO
169      END IF
170
171      CALL wrk_dealloc(jpi,jpj,pua2d,pva2d) 
172      IF ( ll_orlanski ) CALL wrk_dealloc(jpi,jpj,pub2d,pvb2d) 
173
174      IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn')
175
176   END SUBROUTINE bdy_dyn
177
178#else
179   !!----------------------------------------------------------------------
180   !!   Dummy module                   NO Unstruct Open Boundary Conditions
181   !!----------------------------------------------------------------------
182CONTAINS
183   SUBROUTINE bdy_dyn( kt )      ! Empty routine
184      WRITE(*,*) 'bdy_dyn: You should not have seen this print! error?', kt
185   END SUBROUTINE bdy_dyn
186#endif
187
188   !!======================================================================
189END MODULE bdydyn
Note: See TracBrowser for help on using the repository browser.