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

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

CT : UPDATE153 : add/change comments

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