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.
obccli.F90 in tags/nemo_dev_x3/NEMO/OPA_SRC/OBC – NEMO

source: tags/nemo_dev_x3/NEMO/OPA_SRC/OBC/obccli.F90 @ 105

Last change on this file since 105 was 105, checked in by cvs2svn, 20 years ago

This commit was manufactured by cvs2svn to create tag 'nemo_dev_x3'.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.7 KB
Line 
1MODULE obccli
2   !!===================================================================================
3   !!                       ***  MODULE  obccli  ***
4   !! Ocean dynamics:   Baroclinic componant of velocities on each open boundary
5   !!===================================================================================
6#if defined key_obc && ! defined key_dynspg_fsc
7   !!-----------------------------------------------------------------------------------
8   !!   'key_obc'               and
9   !!   'key_dynspg_fsc'
10   !!-----------------------------------------------------------------------------------
11   !!   obc_cli_dyn : Compute the baroclinic componant after the radiation phase
12   !!   obc_cli_dta : Compute the baroclinic componant for the climatological velocities
13   !!-----------------------------------------------------------------------------------
14   !! * Modules used
15   USE oce             ! ocean dynamics and tracers   
16   USE dom_oce         ! ocean space and time domain
17   USE phycst          ! physical constants
18   USE obc_oce         ! ocean open boundary conditions
19
20   IMPLICIT NONE
21   PRIVATE
22
23   !! * Accessibility
24   PUBLIC obc_cli    ! routine called in obcdyn.F90 and obcdta.F90 (rigid lid case)
25
26   INTERFACE obc_cli
27     MODULE PROCEDURE obc_cli_dyn, obc_cli_dta
28   END INTERFACE
29
30   !! * Substitutions
31#  include "domzgr_substitute.h90"
32   !!-----------------------------------------------------------------------------------
33   !!   OPA 9.0 , LODYC-IPSL  (2003)
34   !!-----------------------------------------------------------------------------------
35
36CONTAINS
37
38   SUBROUTINE obc_cli_dyn( obvel, velcli, obd, obf, obtyp, obl)
39      !!--------------------------------------------------------------------------------
40      !!                 ***  SUBROUTINE obc_cli_dyn  ***
41      !!                   
42      !! ** Purpose :   Compute the baroclinic velocities at the open boundaries.
43      !!
44      !! ** Method  :
45      !!      - Compute de barotropic velocity along the considered Open Boundary
46      !!        and substract it to the total velocity to have baroclinic velotity.
47      !!      - obtyp must be set to | 0 when traiting an East or West OB
48      !!                             | 1 when traiting a North or South OB.
49      !!      - obl is the lenght of the OB (jpi or jpj)
50      !!
51      !! History :
52      !!   8.5  !  02-10 (C. Talandier, A-M. Treguier) Free surface, F90
53      !!--------------------------------------------------------------------------------
54      !! * Arguments
55      INTEGER, INTENT( in ) ::   & ! OB localization:jpieob or jpiwob for East or West
56         obd, obf,               & !                 jpjnob or jpjsob for North or South
57         obl,                    & ! Lenght of the Open Boundary
58         obtyp                     ! Type of Open Boundary: zonal or Meridional
59      REAL(wp), DIMENSION(:,:), INTENT( out) ::   &
60         velcli                    ! Baroclinic velocity calculated
61      REAL(wp), DIMENSION(:,:,:), INTENT( in ) ::   &
62         obvel                     ! ua or va velocities from obcdyn.F90 routine
63
64      !! * Local declarations
65      INTEGER ::   &   
66         ji, jj, jk, jle, jol         ! loop indices 
67      REAL(wp) ::   zcbl              ! Temporary Baroclinic velocity
68      REAL(wp), DIMENSION(obl) ::   & 
69         zvelbtpe,                  & ! Barotropic velocity
70         zhinv                        ! Invert of the local depth 1/H
71      REAL(wp), DIMENSION(obl,jpk) ::   &
72         zmskob,                    & ! Velocity mask
73         zvel                         ! 2D Local velocity on OB
74# if defined key_partial_steps
75      REAL(wp), DIMENSION(obl,jpk) ::   &
76         ze3ob                        ! Vertical scale factor
77# else
78      REAL(wp), DIMENSION(jpk) ::   &
79         ze3ob                        ! Vertical scale factor
80# endif
81      !!--------------------------------------------------------------------------------
82
83      ! 0. Array initialization
84      ! -----------------------
85
86      zhinv(:) = 0.e0
87      zmskob(:,:) = 0.e0
88      zvel(:,:) = 0.e0
89# if defined key_partial_steps
90      ze3ob(:,:) = 0.e0
91# else
92      ze3ob(:) = 0.e0
93# endif
94
95      IF( obtyp == 0 ) THEN            ! Meridional Open Boundary ( East or West OB )
96         DO ji = obd, obf
97            zhinv(:) = hur(ji,:)
98            zmskob(:,:) = umask(ji,:,:)
99            zvel(:,:) = obvel(ji,:,:)
100# if defined key_partial_steps
101            ze3ob(:,:) = fse3u(ji,:,:)
102# else
103            ze3ob(:) = fse3u(:,:,:)
104# endif
105         END DO
106      ELSE                             ! Zonal Open Boundary ( North or South OB )
107         DO jj = obd, obf
108            zhinv(:) = hvr(:,jj)
109            zmskob(:,:) = vmask(:,jj,:)
110            zvel(:,:) = obvel(:,jj,:)
111# if defined key_partial_steps
112            ze3ob(:,:) = fse3v(:,jj,:)
113# else
114            ze3ob(:) = fse3v(:,:,:)
115# endif
116         END DO
117      END IF
118
119      zvelbtpe(:) = 0.e0
120
121      ! 1. vertical sum
122      ! ----------------
123# if defined key_vectopt_loop
124!CDIR NOLOOPCHG
125# endif
126      DO jol = obd, obf ! Vector opt.
127         DO jk = 1, jpkm1
128            DO jle = 1, obl
129               zvelbtpe(jle) = zvelbtpe(jle) + zvel(jle,jk)*zmskob(jle,jk) &
130# if defined key_partial_steps
131                                           * ze3ob(jol,jle,jk)
132# else
133                                           * ze3ob(jk)
134# endif
135            END DO
136         END DO
137      END DO
138
139      ! 2. divide by the depth
140      ! -----------------------
141      DO jle = 1, obl
142         zvelbtpe(jle) = zvelbtpe(jle) * zhinv(jle) * zmskob(jle,1) 
143      END DO
144
145      ! 3. substract zvelbtpe to the total velocity
146      !    and save the baroclinic velocity in velcli()
147      ! ------------------------------------------------
148      DO jk = 1, jpkm1
149         DO jle = 1, obl
150            zcbl = zvel(jle,jk) - zvelbtpe(jle)*zmskob(jle,jk)
151            velcli(jle,jk) = zcbl * zmskob(jle,jk)
152         END DO
153      END DO
154
155   END SUBROUTINE obc_cli_dyn
156
157
158   SUBROUTINE obc_cli_dta( obvel, velcli, obd, obf, obtyp, obl, mpp )
159      !!--------------------------------------------------------------------------------
160      !!                 ***  SUBROUTINE obc_cli_dta  ***
161      !!                   
162      !! ** Purpose :
163      !!      Compute the baroclinic velocities for the climatological velocities.
164      !!
165      !! ** Method  :
166      !!      - Compute de barotropic velocity along the considered Open Boundary
167      !!        and substract it to the total velocity to have baroclinic velotity.
168      !!      - obtyp must be set to | 0 when traiting an East or West OB
169      !!                             | 1 when traiting a North or South OB.
170      !!      - obl is the lenght of the OB (jpi or jpj)
171      !!
172      !! History :
173      !!   8.5  !  02-10 (C. Talandier, A-M. Treguier) Free surface, F90
174      !!--------------------------------------------------------------------------------
175      !! * Arguments
176      INTEGER, INTENT( in ) ::   & ! OB localization: jpieob or jpiwob for East or West
177         obd, obf,               & !                  jpjnob or jpjsob for North or South
178         obl,                    & ! Lenght of the Open Boundary
179         mpp,                    & ! MPP index
180         obtyp                     ! Type of Open Boundary: zonal or Meridional
181      REAL(wp), INTENT( out), DIMENSION(:,:) ::   &
182         velcli                    ! Baroclinic velocity calculated
183      REAL(wp), INTENT( inout ), DIMENSION(:,:,:) ::   &
184         obvel                     ! uXdta or vXdta climatological velocities from
185                                   ! obcdta.F90 routine
186
187      !! * Local declarations
188      INTEGER ::   &
189         ji, jj, jk, jle, jol, ij     ! loop indices 
190      REAL(wp), DIMENSION(obl) ::   & 
191         zvelbtpe,                  & ! Barotropic velocity
192         zhinv                        ! Invert of the local depth 1/H
193      REAL(wp), DIMENSION(obl,jpk) ::   &
194         zmskob                       ! Velocity mask
195# if defined key_partial_steps
196      REAL(wp), DIMENSION(obl,jpk) ::   &
197         ze3ob                        ! Vertical scale factor
198# else
199      REAL(wp), DIMENSION(jpk) ::   &
200         ze3ob                        ! Vertical scale factor
201# endif
202      !!--------------------------------------------------------------------------------
203
204      ! 0. Array initialization
205      ! -----------------------
206
207      zhinv(:) = 0.e0
208      zmskob(:,:) = 0.e0
209# if defined key_partial_steps
210      ze3ob(:,:) = 0.e0
211# else
212      ze3ob(:) = 0.e0
213# endif
214
215      IF( obtyp == 0 ) THEN            ! Meridional Open Boundary ( East or West OB )
216         DO ji = obd, obf
217            zhinv(:) = hur(ji,:)
218            zmskob(:,:) = umask(ji,:,:)
219# if defined key_partial_steps
220            ze3ob(:,:) = fse3u(ji,:,:)
221# else
222            ze3ob(:) = fse3u(:,:,:)
223# endif
224         END DO
225      ELSE                             ! Zonal Open Boundary ( North or South OB )
226         DO jj = obd, obf
227            zhinv(:) = hvr(:,jj)
228            zmskob(:,:) = vmask(:,jj,:)
229# if defined key_partial_steps
230            ze3ob(:,:) = fse3v(:,jj,:)
231# else
232            ze3ob(:) = fse3v(:,:,:)
233# endif
234         END DO
235      END IF
236
237      zvelbtpe(:) = 0.e0
238
239      ! 1. vertical sum
240      ! ----------------
241# if defined key_vectopt_loop
242!CDIR NOLOOPCHG
243# endif
244      DO jol = obd, obf ! Vector opt.
245         DO jk = 1, jpkm1
246            DO jle = 1, obl
247               ij = jle -1 + mpp
248               zvelbtpe(jle) = zvelbtpe(jle) + obvel(ij,jk,1)*zmskob(jle,jk) &
249# if defined key_partial_steps
250                                           * ze3ob(jol,jle,jk)
251# else
252                                           * ze3ob(jk)
253# endif
254            END DO
255         END DO
256      END DO
257
258      ! 2. divide by the depth
259      ! -----------------------
260      DO jle = 1, obl
261         zvelbtpe(jle) = zvelbtpe(jle) * zhinv(jle) * zmskob(jle,1) 
262      END DO 
263
264      ! 3. substract zvelbtpe to the total velocity
265      !    and save the baroclinic velocity in velcli()
266      ! ------------------------------------------------
267      DO jk = 1, jpkm1
268         DO jle = 1, obl
269            ij = jle -1 + mpp
270            obvel(ij,jk,1) = obvel(ij,jk,1) - zvelbtpe(jle)*zmskob(jle,jk)
271            velcli(jle,jk) = obvel(ij,jk,1) * zmskob(jle,jk)
272         END DO
273      END DO
274
275   END SUBROUTINE obc_cli_dta
276
277#else
278   !!----------------------------------------------------------------------------------
279   !!   Default options :                                                  Empty module
280   !!----------------------------------------------------------------------------------
281CONTAINS
282   SUBROUTINE obc_cli_dyn       ! Empty routine
283   END SUBROUTINE obc_cli_dyn
284   SUBROUTINE obc_cli_dta       ! Empty routine
285   END SUBROUTINE obc_cli_dta
286#endif
287
288   !!==================================================================================
289END MODULE obccli
Note: See TracBrowser for help on using the repository browser.