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.
dynvor.F90 in trunk/NEMO/OPA_SRC/DYN – NEMO

source: trunk/NEMO/OPA_SRC/DYN/dynvor.F90 @ 247

Last change on this file since 247 was 247, checked in by opalod, 19 years ago

CL : Add CVS Header and CeCILL licence information

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 35.1 KB
Line 
1MODULE dynvor
2   !!======================================================================
3   !!                       ***  MODULE  dynvor  ***
4   !! Ocean dynamics: Update the momentum trend with the relative and
5   !!                 planetary vorticity trends
6   !!======================================================================
7
8   !!----------------------------------------------------------------------
9   !!   dyn_vor_enstrophy: enstrophy conserving scheme       (ln_dynvor_ens=T)
10   !!   dyn_vor_energy   : energy conserving scheme          (ln_dynvor_ene=T)
11   !!   dyn_vor_mixed    : mixed enstrophy/energy conserving (ln_dynvor_mix=T)
12   !!   dyn_vor_ene_ens  : energy and enstrophy conserving   (ln_dynvor_een=T)
13   !!   dyn_vor_ctl      : control of the different vorticity option
14   !!----------------------------------------------------------------------
15   !! * Modules used
16   USE oce             ! ocean dynamics and tracers
17   USE dom_oce         ! ocean space and time domain
18   USE in_out_manager  ! I/O manager
19   USE trdmod          ! ocean dynamics trends
20   USE trdmod_oce      ! ocean variables trends
21   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
22
23   IMPLICIT NONE
24   PRIVATE
25
26   !! * Routine accessibility
27   PUBLIC dyn_vor_enstrophy      ! routine called by step.F90
28   PUBLIC dyn_vor_energy         ! routine called by step.F90
29   PUBLIC dyn_vor_mixed          ! routine called by step.F90
30   PUBLIC dyn_vor_ene_ens        ! routine called by step.F90
31   PUBLIC dyn_vor_ctl            ! routine called by step.F90
32
33   !! * Shared module variables
34   LOGICAL, PUBLIC ::   ln_dynvor_ene = .FALSE.   !: energy conserving scheme
35   LOGICAL, PUBLIC ::   ln_dynvor_ens = .TRUE.    !: enstrophy conserving scheme
36   LOGICAL, PUBLIC ::   ln_dynvor_mix = .FALSE.   !: mixed scheme
37   LOGICAL, PUBLIC ::   ln_dynvor_een = .FALSE.    !: energy and enstrophy conserving scheme
38
39   !! * Substitutions
40#  include "domzgr_substitute.h90"
41#  include "vectopt_loop_substitute.h90"
42   !!----------------------------------------------------------------------
43   !!   OPA 9.0 , LOCEAN-IPSL (2005)
44   !! $Header$
45   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
46   !!----------------------------------------------------------------------
47
48CONTAINS
49
50   SUBROUTINE dyn_vor_energy( kt )
51      !!----------------------------------------------------------------------
52      !!                  ***  ROUTINE dyn_vor_energy  ***
53      !!
54      !! ** Purpose :   Compute the now total vorticity trend and add it to
55      !!      the general trend of the momentum equation.
56      !!
57      !! ** Method  :   Trend evaluated using now fields (centered in time)
58      !!      and the Sadourny (1975) flux form formulation : conserves the
59      !!      horizontal kinetic energy.
60      !!      The trend of the vorticity term is given by:
61      !!       * s-coordinate (lk_sco=T), the e3. are inside the derivatives:
62      !!          voru = 1/e1u  mj-1[ (rotn+f)/e3f  mi(e1v*e3v vn) ]
63      !!          vorv = 1/e2v  mi-1[ (rotn+f)/e3f  mj(e2u*e3u un) ]
64      !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes:
65      !!          voru = 1/e1u  mj-1[ (rotn+f)  mi(e1v vn) ]
66      !!          vorv = 1/e2v  mi-1[ (rotn+f)  mj(e2u un) ]
67      !!      Add this trend to the general momentum trend (ua,va):
68      !!          (ua,va) = (ua,va) + ( voru , vorv )
69      !!
70      !! ** Action : - Update (ua,va) with the now vorticity term trend
71      !!             - save the trends in (utrd,vtrd) in 2 parts (relative
72      !!               and planetary vorticity trends) ('key_trddyn')
73      !!
74      !! References :
75      !!      Sadourny, r., 1975, j. atmos. sciences, 32, 680-689.
76      !! History :
77      !!   5.0  !  91-11  (G. Madec)  Original code
78      !!   6.0  !  96-01  (G. Madec)  s-coord, suppress work arrays
79      !!   8.5  !  02-08  (G. Madec)  F90: Free form and module
80      !!   9.0  !  04-08  (C. Talandier)  New trends organization
81      !!----------------------------------------------------------------------
82      !! * Modules used     
83      USE oce, ONLY :    ztdua => ta,     & ! use ta as 3D workspace   
84                         ztdva => sa        ! use sa as 3D workspace   
85
86      !! * Arguments
87      INTEGER, INTENT( in ) ::   kt         ! ocean time-step index
88
89      !! * Local declarations
90      INTEGER ::   ji, jj, jk               ! dummy loop indices
91      REAL(wp) ::   &
92         zfact2, zua, zva,               &  ! temporary scalars
93         zx1, zx2, zy1, zy2                 !    "         "
94      REAL(wp), DIMENSION(jpi,jpj) ::   &
95         zwx, zwy, zwz                      ! temporary workspace
96      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   &
97         zcu, zcv                           !    "         "
98      !!----------------------------------------------------------------------
99
100      IF( kt == nit000 ) THEN
101         IF(lwp) WRITE(numout,*)
102         IF(lwp) WRITE(numout,*) 'dyn_vor_energy : vorticity term: energy conserving scheme'
103         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~'
104      ENDIF
105
106      ! Local constant initialization
107      zfact2 = 0.5 * 0.5
108      zcu (:,:,:) = 0.e0
109      zcv (:,:,:) = 0.e0
110
111      ! Save ua and va trends
112      IF( l_trddyn )   THEN
113         ztdua(:,:,:) = ua(:,:,:) 
114         ztdva(:,:,:) = va(:,:,:) 
115         zcu(:,:,:) = 0.e0
116         zcv(:,:,:) = 0.e0
117      ENDIF
118     
119      !                                                ! ===============
120      DO jk = 1, jpkm1                                 ! Horizontal slab
121         !                                             ! ===============
122         
123         ! Potential vorticity and horizontal fluxes
124         ! -----------------------------------------
125         IF( lk_sco ) THEN
126            zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) / fse3f(:,:,jk)
127            zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk)
128            zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk)
129         ELSE
130            zwz(:,:) = rotn(:,:,jk) + ff(:,:)
131            zwx(:,:) = e2u(:,:) * un(:,:,jk)
132            zwy(:,:) = e1v(:,:) * vn(:,:,jk)
133         ENDIF
134
135         ! Compute and add the vorticity term trend
136         ! ----------------------------------------
137         DO jj = 2, jpjm1
138            DO ji = fs_2, fs_jpim1   ! vector opt.
139               zy1 = zwy(ji,jj-1) + zwy(ji+1,jj-1)
140               zy2 = zwy(ji,jj  ) + zwy(ji+1,jj  )
141               zx1 = zwx(ji-1,jj) + zwx(ji-1,jj+1)
142               zx2 = zwx(ji  ,jj) + zwx(ji  ,jj+1)
143               zua = zfact2 / e1u(ji,jj) * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 )
144               zva =-zfact2 / e2v(ji,jj) * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 )
145               ua(ji,jj,jk) = ua(ji,jj,jk) + zua
146               va(ji,jj,jk) = va(ji,jj,jk) + zva
147            END DO 
148         END DO 
149         !                                             ! ===============
150      END DO                                           !   End of slab
151      !                                                ! ===============
152
153      ! save the relative & planetary vorticity trends for diagnostic
154      ! momentum trends
155      IF( l_trddyn )   THEN
156         ! Compute the planetary vorticity term trend
157         !                                                ! ===============
158         DO jk = 1, jpkm1                                 ! Horizontal slab
159            !                                             ! ===============
160            DO jj = 2, jpjm1
161               DO ji = fs_2, fs_jpim1   ! vector opt.
162                  zy1 = zwy(ji,jj-1) + zwy(ji+1,jj-1)
163                  zy2 = zwy(ji,jj  ) + zwy(ji+1,jj  )
164                  zx1 = zwx(ji-1,jj) + zwx(ji-1,jj+1)
165                  zx2 = zwx(ji  ,jj) + zwx(ji  ,jj+1)
166# if defined key_s_coord
167                 zcu(ji,jj,jk) = zfact2 / e1u(ji,jj) * ( ff(ji  ,jj-1) / fse3f(ji,jj-1,jk) * zy1  &
168                   &                                   + ff(ji  ,jj  ) / fse3f(ji,jj  ,jk) * zy2 )
169                 zcv(ji,jj,jk) =-zfact2 / e2v(ji,jj) * ( ff(ji-1,jj  ) / fse3f(ji-1,jj,jk) * zx1  &
170                   &                                   + ff(ji  ,jj  ) / fse3f(ji  ,jj,jk) * zx2 )
171# else
172                 zcu(ji,jj,jk) = zfact2 / e1u(ji,jj) * ( ff(ji  ,jj-1) * zy1 + ff(ji,jj) * zy2 )
173                 zcv(ji,jj,jk) =-zfact2 / e2v(ji,jj) * ( ff(ji-1,jj  ) * zx1 + ff(ji,jj) * zx2 )
174# endif
175               END DO 
176            END DO 
177            !                                             ! ===============
178         END DO                                           !   End of slab
179         !                                                ! ===============
180
181         ! Compute the relative vorticity term trend
182         ztdua(:,:,:) = ua(:,:,:) - ztdua(:,:,:) - zcu(:,:,:) 
183         ztdva(:,:,:) = va(:,:,:) - ztdva(:,:,:) - zcv(:,:,:) 
184
185         CALL trd_mod(zcu  , zcv  , jpdtdpvo, 'DYN', kt)
186         CALL trd_mod(zcu  , zcv  , jpdtddat, 'DYN', kt)
187         CALL trd_mod(ztdua, ztdva, jpdtdrvo, 'DYN', kt)
188      ENDIF
189
190      IF(l_ctl) THEN         ! print sum trends (used for debugging)
191         zua = SUM( ua(2:nictl,2:njctl,1:jpkm1) * umask(2:nictl,2:njctl,1:jpkm1) )
192         zva = SUM( va(2:nictl,2:njctl,1:jpkm1) * vmask(2:nictl,2:njctl,1:jpkm1) )
193         WRITE(numout,*) ' vor  - Ua: ', zua-u_ctl, ' Va: ', zva-v_ctl
194         u_ctl = zua   ;   v_ctl = zva
195      ENDIF
196
197   END SUBROUTINE dyn_vor_energy
198
199
200   SUBROUTINE dyn_vor_mixed( kt )
201      !!----------------------------------------------------------------------
202      !!                 ***  ROUTINE dyn_vor_mixed  ***
203      !!
204      !! ** Purpose :   Compute the now total vorticity trend and add it to
205      !!      the general trend of the momentum equation.
206      !!
207      !! ** Method  :   Trend evaluated using now fields (centered in time)
208      !!      Mixte formulation : conserves the potential enstrophy of a hori-
209      !!      zontally non-divergent flow for (rotzu x uh), the relative vor-
210      !!      ticity term and the horizontal kinetic energy for (f x uh), the
211      !!      coriolis term. the now trend of the vorticity term is given by:
212      !!       * s-coordinate (lk_sco=T), the e3. are inside the derivatives:
213      !!          voru = 1/e1u  mj-1(rotn/e3f) mj-1[ mi(e1v*e3v vn) ]
214      !!              +1/e1u  mj-1[ f/e3f          mi(e1v*e3v vn) ]
215      !!          vorv = 1/e2v  mi-1(rotn/e3f) mi-1[ mj(e2u*e3u un) ]
216      !!              +1/e2v  mi-1[ f/e3f          mj(e2u*e3u un) ]
217      !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes:
218      !!          voru = 1/e1u  mj-1(rotn) mj-1[ mi(e1v vn) ]
219      !!              +1/e1u  mj-1[ f          mi(e1v vn) ]
220      !!          vorv = 1/e2v  mi-1(rotn) mi-1[ mj(e2u un) ]
221      !!              +1/e2v  mi-1[ f          mj(e2u un) ]
222      !!      Add this now trend to the general momentum trend (ua,va):
223      !!          (ua,va) = (ua,va) + ( voru , vorv )
224      !!
225      !! ** Action : - Update (ua,va) arrays with the now vorticity term trend
226      !!             - Save the trends in (utrd,vtrd) in 2 parts (relative
227      !!               and planetary vorticity trends) ('key_trddyn')
228      !!
229      !! References :
230      !!      Sadourny, r., 1975, j. atmos. sciences, 32, 680-689.
231      !! History :
232      !!   5.0  !  91-11  (G. Madec) Original code, enstrophy-energy-combined schemes
233      !!   6.0  !  96-01  (G. Madec) s-coord, suppress work arrays
234      !!   8.5  !  02-08  (G. Madec)  F90: Free form and module
235      !!   9.0  !  04-08  (C. Talandier)  New trends organization
236      !!----------------------------------------------------------------------
237      !! * Modules used     
238      USE oce, ONLY :    ztdua => ta,     & ! use ta as 3D workspace   
239                         ztdva => sa        ! use sa as 3D workspace   
240      !! * Arguments
241      INTEGER, INTENT( in ) ::   kt         ! ocean timestep index
242
243      !! * Local declarations
244      INTEGER ::   ji, jj, jk               ! dummy loop indices
245      REAL(wp) ::   &
246         zfact1, zfact2, zua, zva,       &  ! temporary scalars
247         zcua, zcva, zx1, zx2, zy1, zy2
248      REAL(wp), DIMENSION(jpi,jpj) ::   &
249         zwx, zwy, zwz, zww                 ! temporary workspace
250      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   &
251         zcu, zcv                           !    "         "
252      !!----------------------------------------------------------------------
253
254      IF( kt == nit000 ) THEN
255         IF(lwp) WRITE(numout,*)
256         IF(lwp) WRITE(numout,*) 'dyn_vor_mixed : vorticity term: mixed energy/enstrophy conserving scheme'
257         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~'
258      ENDIF
259
260      ! Local constant initialization
261      zfact1 = 0.5 * 0.25
262      zfact2 = 0.5 * 0.5
263
264      ! Save ua and va trends
265      IF( l_trddyn )   THEN
266         ztdua(:,:,:) = ua(:,:,:) 
267         ztdva(:,:,:) = va(:,:,:) 
268         zcu(:,:,:) = 0.e0
269         zcv(:,:,:) = 0.e0
270      ENDIF
271
272      !                                                ! ===============
273      DO jk = 1, jpkm1                                 ! Horizontal slab
274         !                                             ! ===============
275
276         ! Relative and planetary potential vorticity and horizontal fluxes
277         ! ----------------------------------------------------------------
278         IF( lk_sco ) THEN       
279            zwz(:,:) = ff  (:,:)    / fse3f(:,:,jk)
280            zww(:,:) = rotn(:,:,jk) / fse3f(:,:,jk)
281            zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk)
282            zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk)
283         ELSE
284            zwz(:,:) = ff(:,:)
285            zww(:,:) = rotn(:,:,jk)
286            zwx(:,:) = e2u(:,:) * un(:,:,jk)
287            zwy(:,:) = e1v(:,:) * vn(:,:,jk)
288         ENDIF
289
290         ! Compute and add the vorticity term trend
291         ! ----------------------------------------
292         DO jj = 2, jpjm1
293            DO ji = fs_2, fs_jpim1   ! vector opt.
294               zy1 = ( zwy(ji,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj)
295               zy2 = ( zwy(ji,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj)
296               zx1 = ( zwx(ji-1,jj) + zwx(ji-1,jj+1) ) / e2v(ji,jj)
297               zx2 = ( zwx(ji  ,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj)
298               ! enstrophy conserving formulation for relative vorticity term
299               zua = zfact1 * ( zww(ji  ,jj-1) + zww(ji,jj) ) * ( zy1 + zy2 )
300               zva =-zfact1 * ( zww(ji-1,jj  ) + zww(ji,jj) ) * ( zx1 + zx2 )
301               ! energy conserving formulation for planetary vorticity term
302               zcua = zfact2 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 )
303               zcva =-zfact2 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 )
304
305               ua(ji,jj,jk) = ua(ji,jj,jk) + zcua + zua
306               va(ji,jj,jk) = va(ji,jj,jk) + zcva + zva
307            END DO 
308         END DO 
309         !                                             ! ===============
310      END DO                                           !   End of slab
311      !                                                ! ===============
312
313      ! save the relative & planetary vorticity trends for diagnostic
314      ! momentum trends
315      IF( l_trddyn )   THEN
316         ! Compute the planetary vorticity term trend
317         !                                                ! ===============
318         DO jk = 1, jpkm1                                 ! Horizontal slab
319            !                                             ! ===============
320            DO jj = 2, jpjm1
321               DO ji = fs_2, fs_jpim1   ! vector opt.
322                  zy1 = ( zwy(ji,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj)
323                  zy2 = ( zwy(ji,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj)
324                  zx1 = ( zwx(ji-1,jj) + zwx(ji-1,jj+1) ) / e2v(ji,jj)
325                  zx2 = ( zwx(ji  ,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj)
326                  ! energy conserving formulation for planetary vorticity term
327                  zcu(ji,jj,jk) = zfact2 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 )
328                  zcv(ji,jj,jk) =-zfact2 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 )
329               END DO 
330            END DO 
331            !                                             ! ===============
332         END DO                                           !   End of slab
333         !                                                ! ===============
334
335         ! Compute the relative vorticity term trend
336         ztdua(:,:,:) = ua(:,:,:) - ztdua(:,:,:) - zcu(:,:,:) 
337         ztdva(:,:,:) = va(:,:,:) - ztdva(:,:,:) - zcv(:,:,:) 
338
339         CALL trd_mod(zcu  , zcv  , jpdtdpvo, 'DYN', kt)
340         CALL trd_mod(zcu  , zcv  , jpdtddat, 'DYN', kt)
341         CALL trd_mod(ztdua, ztdva, jpdtdrvo, 'DYN', kt)
342      ENDIF
343
344      IF(l_ctl) THEN         ! print sum trends (used for debugging)
345         zua = SUM( ua(2:nictl,2:njctl,1:jpkm1) * umask(2:nictl,2:njctl,1:jpkm1) )
346         zva = SUM( va(2:nictl,2:njctl,1:jpkm1) * vmask(2:nictl,2:njctl,1:jpkm1) )
347         WRITE(numout,*) ' vor  - Ua: ', zua-u_ctl, ' Va: ', zva-v_ctl
348         u_ctl = zua   ;   v_ctl = zva
349      ENDIF
350
351   END SUBROUTINE dyn_vor_mixed
352
353
354   SUBROUTINE dyn_vor_enstrophy( kt )
355      !!----------------------------------------------------------------------
356      !!                ***  ROUTINE dyn_vor_enstrophy  ***
357      !!
358      !! ** Purpose :   Compute the now total vorticity trend and add it to
359      !!      the general trend of the momentum equation.
360      !!
361      !! ** Method  :   Trend evaluated using now fields (centered in time)
362      !!      and the Sadourny (1975) flux FORM formulation : conserves the
363      !!      potential enstrophy of a horizontally non-divergent flow. the
364      !!      trend of the vorticity term is given by:
365      !!       * s-coordinate (lk_sco=T), the e3. are inside the derivative:
366      !!          voru = 1/e1u  mj-1[ (rotn+f)/e3f ]  mj-1[ mi(e1v*e3v vn) ]
367      !!          vorv = 1/e2v  mi-1[ (rotn+f)/e3f ]  mi-1[ mj(e2u*e3u un) ]
368      !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes:
369      !!          voru = 1/e1u  mj-1[ rotn+f ]  mj-1[ mi(e1v vn) ]
370      !!          vorv = 1/e2v  mi-1[ rotn+f ]  mi-1[ mj(e2u un) ]
371      !!      Add this trend to the general momentum trend (ua,va):
372      !!          (ua,va) = (ua,va) + ( voru , vorv )
373      !!
374      !! ** Action : - Update (ua,va) arrays with the now vorticity term trend
375      !!             - Save the trends in (utrd,vtrd) in 2 parts (relative
376      !!               and planetary vorticity trends) ('key_trddyn')
377      !!
378      !! References :
379      !!      Sadourny, r., 1975, j. atmos. sciences, 32, 680-689.
380      !! History :
381      !!   5.0  !  91-11  (G. Madec)  Original code
382      !!   6.0  !  96-01  (G. Madec)  s-coord, suppress work arrays
383      !!   8.5  !  02-08  (G. Madec)  F90: Free form and module
384      !!   9.0  !  04-08  (C. Talandier)  New trends organization
385      !!----------------------------------------------------------------------
386      !! * modules used
387      USE oce, ONLY:   zwx  => ta,   & ! use ta as 3D workspace
388                       zwy  => sa      ! use sa as 3D workspace
389      !! * Arguments
390      INTEGER, INTENT( in ) ::   kt    ! ocean timestep
391
392      !! * Local declarations
393      INTEGER ::   ji, jj, jk          ! dummy loop indices
394      REAL(wp) ::   &
395         zfact1, zua, zva, zuav, zvau  ! temporary scalars
396      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   &
397         zcu, zcv, zwz,              & ! temporary workspace
398         ztdua, ztdva                  ! temporary workspace
399      !!----------------------------------------------------------------------
400     
401      IF( kt == nit000 ) THEN
402         IF(lwp) WRITE(numout,*)
403         IF(lwp) WRITE(numout,*) 'dyn_vor_enstrophy : vorticity term: enstrophy conserving scheme'
404         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~~'
405      ENDIF
406
407      ! Local constant initialization
408      zfact1 = 0.5 * 0.25
409
410      ! Save ua and va trends
411      IF( l_trddyn )   THEN
412         ztdua(:,:,:) = ua(:,:,:) 
413         ztdva(:,:,:) = va(:,:,:) 
414         zcu(:,:,:) = 0.e0
415         zcv(:,:,:) = 0.e0
416      ENDIF
417
418      !                                                ! ===============
419      DO jk = 1, jpkm1                                 ! Horizontal slab
420         !                                             ! ===============
421
422         ! Potential vorticity and horizontal fluxes
423         ! -----------------------------------------
424         IF( lk_sco ) THEN
425            DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop
426               DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking
427                  zwz(ji,jj,jk) = ( rotn(ji,jj,jk) + ff(ji,jj) ) / fse3f(ji,jj,jk)
428                  zwx(ji,jj,jk) = e2u(ji,jj) * fse3u(ji,jj,jk) * un(ji,jj,jk)
429                  zwy(ji,jj,jk) = e1v(ji,jj) * fse3v(ji,jj,jk) * vn(ji,jj,jk)
430               END DO
431            END DO
432         ELSE
433            DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop
434               DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking
435                  zwz(ji,jj,jk) = rotn(ji,jj,jk) + ff(ji,jj)
436                  zwx(ji,jj,jk) = e2u(ji,jj) * un(ji,jj,jk)
437                  zwy(ji,jj,jk) = e1v(ji,jj) * vn(ji,jj,jk)
438               END DO
439            END DO
440         ENDIF
441
442
443         ! Compute and add the vorticity term trend
444         ! ----------------------------------------
445         DO jj = 2, jpjm1
446            DO ji = fs_2, fs_jpim1   ! vector opt.
447               zuav = zfact1 / e1u(ji,jj) * ( zwy(ji  ,jj-1,jk) + zwy(ji+1,jj-1,jk)   &
448                                            + zwy(ji  ,jj  ,jk) + zwy(ji+1,jj  ,jk) )
449               zvau =-zfact1 / e2v(ji,jj) * ( zwx(ji-1,jj  ,jk) + zwx(ji-1,jj+1,jk)   &
450                                            + zwx(ji  ,jj  ,jk) + zwx(ji  ,jj+1,jk) )
451
452               zua  = zuav * ( zwz(ji  ,jj-1,jk) + zwz(ji,jj,jk) )
453               zva  = zvau * ( zwz(ji-1,jj  ,jk) + zwz(ji,jj,jk) )
454
455               ua(ji,jj,jk) = ua(ji,jj,jk) + zua
456               va(ji,jj,jk) = va(ji,jj,jk) + zva
457            END DO 
458         END DO 
459         !                                             ! ===============
460      END DO                                           !   End of slab
461      !                                                ! ===============
462
463
464      ! save the relative & planetary vorticity trends for diagnostic
465      ! momentum trends
466      IF( l_trddyn )   THEN
467         ! Compute the planetary vorticity term trend
468         !                                                ! ===============
469         DO jk = 1, jpkm1                                 ! Horizontal slab
470            !                                             ! ===============
471            DO jj = 2, jpjm1
472               DO ji = fs_2, fs_jpim1   ! vector opt.
473                  zuav = zfact1 / e1u(ji,jj) * ( zwy(ji  ,jj-1,jk) + zwy(ji+1,jj-1,jk)   &
474                     &                         + zwy(ji  ,jj  ,jk) + zwy(ji+1,jj  ,jk) )
475                  zvau =-zfact1 / e2v(ji,jj) * ( zwx(ji-1,jj  ,jk) + zwx(ji-1,jj+1,jk)   &
476                     &                         + zwx(ji  ,jj  ,jk) + zwx(ji  ,jj+1,jk) )
477# if defined key_s_coord
478                  zcu(ji,jj,jk)  = zuav * ( ff(ji  ,jj-1) / fse3f(ji  ,jj-1,jk)   &
479                    &                     + ff(ji  ,jj  ) / fse3f(ji  ,jj  ,jk) )
480                  zcv(ji,jj,jk)  = zvau * ( ff(ji-1,jj  ) / fse3f(ji-1,jj  ,jk)   &
481                    &                     + ff(ji  ,jj  ) / fse3f(ji  ,jj  ,jk) )
482# else
483                  zcu(ji,jj,jk) = zuav * ( ff(ji  ,jj-1) + ff(ji,jj) )
484                  zcv(ji,jj,jk) = zvau * ( ff(ji-1,jj  ) + ff(ji,jj) )
485# endif
486               END DO 
487            END DO 
488            !                                             ! ===============
489         END DO                                           !   End of slab
490         !                                                ! ===============
491
492         ! Compute the relative vorticity term trend
493         ztdua(:,:,:) = ua(:,:,:) - ztdua(:,:,:) - zcu(:,:,:) 
494         ztdva(:,:,:) = va(:,:,:) - ztdva(:,:,:) - zcv(:,:,:) 
495
496         CALL trd_mod(zcu  , zcv  , jpdtdpvo, 'DYN', kt)
497         CALL trd_mod(zcu  , zcv  , jpdtddat, 'DYN', kt)
498         CALL trd_mod(ztdua, ztdva, jpdtdrvo, 'DYN', kt)
499      ENDIF
500
501      IF(l_ctl) THEN         ! print sum trends (used for debugging)
502         zua = SUM( ua(2:nictl,2:njctl,1:jpkm1) * umask(2:nictl,2:njctl,1:jpkm1) )
503         zva = SUM( va(2:nictl,2:njctl,1:jpkm1) * vmask(2:nictl,2:njctl,1:jpkm1) )
504         WRITE(numout,*) ' vor  - Ua: ', zua-u_ctl, ' Va: ', zva-v_ctl
505         u_ctl = zua   ;   v_ctl = zva
506      ENDIF
507
508   END SUBROUTINE dyn_vor_enstrophy
509
510
511   SUBROUTINE dyn_vor_ene_ens( kt )
512      !!----------------------------------------------------------------------
513      !!                ***  ROUTINE dyn_vor_ene_ens  ***
514      !!
515      !! ** Purpose :   Compute the now total vorticity trend and add it to
516      !!      the general trend of the momentum equation.
517      !!
518      !! ** Method  :   Trend evaluated using now fields (centered in time)
519      !!      and the Arakawa and Lamb (19XX) flux form formulation : conserves
520      !!      both the horizontal kinetic energy and the potential enstrophy
521      !!      when horizontal divergence is zero.
522      !!      The trend of the vorticity term is given by:
523      !!       * s-coordinate (lk_sco=T), the e3. are inside the derivatives:
524      !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes:
525      !!      Add this trend to the general momentum trend (ua,va):
526      !!          (ua,va) = (ua,va) + ( voru , vorv )
527      !!
528      !! ** Action : - Update (ua,va) with the now vorticity term trend
529      !!             - save the trends in (utrd,vtrd) in 2 parts (relative
530      !!               and planetary vorticity trends) ('key_trddyn')
531      !!
532      !! References :
533      !!      Arakawa and Lamb 1980, A potential enstrophy and energy conserving
534      !!                             scheme for the Shallow water equations,
535      !!                             Monthly Weather Review, vol. 109, p 18-36
536      !!
537      !! History :
538      !!   8.5  !  04-02  (G. Madec)  Original code
539      !!   9.0  !  04-08  (C. Talandier)  New trends organization
540      !!----------------------------------------------------------------------
541      !! * Modules used     
542      USE oce, ONLY :    ztdua => ta,    & ! use ta as 3D workspace   
543                         ztdva => sa       ! use sa as 3D workspace   
544
545      !! * Arguments
546      INTEGER, INTENT( in ) ::   kt        ! ocean time-step index
547
548      !! * Local declarations
549      INTEGER ::   ji, jj, jk              ! dummy loop indices
550      REAL(wp) ::   &
551         zfac12, zua, zva                  ! temporary scalars
552      REAL(wp), DIMENSION(jpi,jpj) ::   &
553         zwx, zwy, zwz,                 &  ! temporary workspace
554         ztnw, ztne, ztsw, ztse,        &  !    "           "
555         zcor                              ! potential planetary vorticity (f/e3)
556      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   &
557         zcu, zcv                          ! temporary workspace 
558      REAL(wp), DIMENSION(jpi,jpj,jpk), SAVE ::   &
559         ze3f
560      !!----------------------------------------------------------------------
561
562      IF( kt == nit000 ) THEN
563         IF(lwp) WRITE(numout,*)
564         IF(lwp) WRITE(numout,*) 'dyn_vor_ene_ens : vorticity term: energy and enstrophy conserving scheme'
565         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~'
566
567         DO jk = 1, jpk
568            DO jj = 1, jpjm1
569               DO ji = 1, jpim1
570                  ze3f(ji,jj,jk) = ( fse3t(ji,jj+1,jk)*tmask(ji,jj+1,jk) + fse3t(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   &
571                     &             + fse3t(ji,jj  ,jk)*tmask(ji,jj  ,jk) + fse3t(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk) ) * 0.25
572!!!               ze3f(ji,jj,jk) = MAX( ze3f(ji,jj,jk) , 1.e-20)
573                  IF( ze3f(ji,jj,jk) /= 0.e0 )   ze3f(ji,jj,jk) = 1.e0 / ze3f(ji,jj,jk)
574               END DO
575            END DO
576         END DO
577         CALL lbc_lnk( ze3f, 'F', 1. )
578      ENDIF
579
580      ! Local constant initialization
581      zfac12 = 1.e0 / 12.e0
582
583      ! Save ua and va trends
584      IF( l_trddyn )   THEN
585         ztdua(:,:,:) = ua(:,:,:) 
586         ztdva(:,:,:) = va(:,:,:) 
587         zcu(:,:,:) = 0.e0
588         zcv(:,:,:) = 0.e0
589      ENDIF
590     
591      !                                                ! ===============
592      DO jk = 1, jpkm1                                 ! Horizontal slab
593         !                                             ! ===============
594         
595         ! Potential vorticity and horizontal fluxes
596         ! -----------------------------------------
597!!!bug   zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) / fse3f(:,:,jk)
598         zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) * ze3f(:,:,jk)
599         zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk)
600         zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk)
601         zcor(:,:) = ff(:,:) * ze3f(:,:,jk)
602
603         ! Compute and add the vorticity term trend
604         ! ----------------------------------------
605         jj=2
606         ztne(1,:) = 0 ; ztnw(1,:) = 0 ; ztse(1,:) = 0 ; ztsw(1,:) = 0
607         DO ji = 2, jpi   
608               ztne(ji,jj) = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1)
609               ztnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  )
610               ztse(ji,jj) = zwz(ji  ,jj  ) + zwz(ji  ,jj-1) + zwz(ji-1,jj-1)
611               ztsw(ji,jj) = zwz(ji  ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj  )
612         END DO
613         DO jj = 3, jpj
614            DO ji = fs_2, jpi   ! vector opt.
615               ztne(ji,jj) = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1)
616               ztnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  )
617               ztse(ji,jj) = zwz(ji  ,jj  ) + zwz(ji  ,jj-1) + zwz(ji-1,jj-1)
618               ztsw(ji,jj) = zwz(ji  ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj  )
619            END DO
620         END DO
621         
622         DO jj = 2, jpjm1
623            DO ji = fs_2, fs_jpim1   ! vector opt.
624               zua = + zfac12 / e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   &
625                  &                           + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) )
626               zva = - zfac12 / e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   &
627                  &                           + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) )
628               ua(ji,jj,jk) = ua(ji,jj,jk) + zua
629               va(ji,jj,jk) = va(ji,jj,jk) + zva
630            END DO 
631         END DO 
632         !                                             ! ===============
633      END DO                                           !   End of slab
634      !                                                ! ===============
635
636      ! save the relative & planetary vorticity trends for diagnostic
637      ! momentum trends
638      IF( l_trddyn )   THEN
639         ! Compute the planetary vorticity term trend
640         !                                                ! ===============
641         DO jk = 1, jpkm1                                 ! Horizontal slab
642            !                                             ! ===============
643            DO jj = 2, jpjm1
644               DO ji = fs_2, fs_jpim1   ! vector opt.
645                  zcu(ji,jj,jk) = + zfac12 / e1u(ji,jj) * (  zcor(ji,jj  ) * zwy(ji  ,jj  ) + zcor(ji+1,jj) * zwy(ji+1,jj  )   &
646                    &                                      + zcor(ji,jj  ) * zwy(ji  ,jj-1) + zcor(ji+1,jj) * zwy(ji+1,jj-1) )
647                  zcv(ji,jj,jk) = - zfac12 / e2v(ji,jj) * (  zcor(ji,jj+1) * zwx(ji-1,jj+1) + zcor(ji,jj+1) * zwx(ji  ,jj+1)   &
648                    &                                      + zcor(ji,jj  ) * zwx(ji-1,jj  ) + zcor(ji,jj  ) * zwx(ji  ,jj  ) )
649               END DO 
650            END DO 
651            !                                             ! ===============
652         END DO                                           !   End of slab
653         !                                                ! ===============
654
655         ! Compute the relative vorticity term trend
656         ztdua(:,:,:) = ua(:,:,:) - ztdua(:,:,:) - zcu(:,:,:) 
657         ztdva(:,:,:) = va(:,:,:) - ztdva(:,:,:) - zcv(:,:,:) 
658
659         CALL trd_mod(zcu  , zcv  , jpdtdpvo, 'DYN', kt)
660         CALL trd_mod(zcu  , zcv  , jpdtddat, 'DYN', kt)
661         CALL trd_mod(ztdua, ztdva, jpdtdrvo, 'DYN', kt)
662      ENDIF
663
664      IF(l_ctl) THEN         ! print sum trends (used for debugging)
665         zua = SUM( ua(2:jpim1,2:jpjm1,1:jpkm1) * umask(2:jpim1,2:jpjm1,1:jpkm1) )
666         zva = SUM( va(2:jpim1,2:jpjm1,1:jpkm1) * vmask(2:jpim1,2:jpjm1,1:jpkm1) )
667         WRITE(numout,*) ' vor  een - Ua: ', zua-u_ctl, ' Va: ', zva-v_ctl
668         u_ctl = zua   ;   v_ctl = zva
669      ENDIF
670
671   END SUBROUTINE dyn_vor_ene_ens
672
673
674   SUBROUTINE dyn_vor_ctl
675      !!---------------------------------------------------------------------
676      !!                  ***  ROUTINE dyn_vor_ctl  ***
677      !!
678      !! ** Purpose :   Control the consistency between cpp options for
679      !!      tracer advection schemes
680      !!
681      !! History :
682      !!   9.0  !  03-08  (G. Madec)  Original code
683      !!----------------------------------------------------------------------
684      !! * Local declarations
685      INTEGER ::   ioptio = 0      ! temporary integer
686
687      NAMELIST/nam_dynvor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, ln_dynvor_een
688      !!----------------------------------------------------------------------
689
690      ! Read Namelist nam_dynvor : Vorticity scheme options
691      ! ------------------------
692      REWIND ( numnam )
693      READ   ( numnam, nam_dynvor )
694
695      ! Control of vorticity scheme options
696      ! -----------------------------------
697      ! Control print
698      IF(lwp) THEN
699         WRITE(numout,*)
700         WRITE(numout,*) 'dyn_vor_ctl : vorticity term : read namelist and control the consistency'
701         WRITE(numout,*) '~~~~~~~~~~~'
702         WRITE(numout,*) '              Namelist nam_dynvor : oice of the vorticity term scheme'
703         WRITE(numout,*) '                 enstrophy conserving scheme                ln_dynvor_ens = ', ln_dynvor_ens
704         WRITE(numout,*) '                 energy    conserving scheme                ln_dynvor_ene = ', ln_dynvor_ene
705         WRITE(numout,*) '                 mixed enstrophy/energy conserving scheme   ln_dynvor_mix = ', ln_dynvor_mix
706         WRITE(numout,*) '                 enstrophy and energy conserving scheme     ln_dynvor_een = ', ln_dynvor_een
707      ENDIF
708
709      IF( ln_dynvor_ens ) THEN
710         IF(lwp) WRITE(numout,*)
711         IF(lwp) WRITE(numout,*) '              vorticity term : enstrophy conserving scheme'
712         ioptio = ioptio + 1
713      ENDIF
714      IF( ln_dynvor_ene ) THEN
715         IF(lwp) WRITE(numout,*)
716         IF(lwp) WRITE(numout,*) '              vorticity term : energy conserving scheme'
717         ioptio = ioptio + 1
718      ENDIF
719      IF( ln_dynvor_mix ) THEN
720         IF(lwp) WRITE(numout,*)
721         IF(lwp) WRITE(numout,*) '              vorticity term : mixed enstrophy/energy conserving scheme'
722         ioptio = ioptio + 1
723      ENDIF
724      IF( ln_dynvor_een ) THEN
725         IF(lwp) WRITE(numout,*)
726         IF(lwp) WRITE(numout,*) '              vorticity term : energy and enstrophy conserving scheme'
727         ioptio = ioptio + 1
728      ENDIF
729      IF ( ioptio /= 1 .AND. .NOT. lk_esopa ) THEN
730          WRITE(numout,cform_err)
731          IF(lwp) WRITE(numout,*) ' use ONE and ONLY one vorticity scheme'
732          nstop = nstop + 1
733      ENDIF
734
735   END SUBROUTINE dyn_vor_ctl
736
737!!==============================================================================
738END MODULE dynvor
Note: See TracBrowser for help on using the repository browser.