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 branches/2011/dev_LOCEAN_CMCC_2011/NEMOGCM/NEMO/OPA_SRC/DYN – NEMO

source: branches/2011/dev_LOCEAN_CMCC_2011/NEMOGCM/NEMO/OPA_SRC/DYN/dynvor.F90 @ 3097

Last change on this file since 3097 was 3097, checked in by cetlod, 13 years ago

dev_LOCEAN_CMCC_2011:Move one namelist parameter from dynvor to dommsk

  • Property svn:keywords set to Id
File size: 40.1 KB
RevLine 
[3]1MODULE dynvor
2   !!======================================================================
3   !!                       ***  MODULE  dynvor  ***
4   !! Ocean dynamics: Update the momentum trend with the relative and
5   !!                 planetary vorticity trends
6   !!======================================================================
[2715]7   !! History :  OPA  ! 1989-12  (P. Andrich)  vor_ens: Original code
8   !!            5.0  ! 1991-11  (G. Madec) vor_ene, vor_mix: Original code
9   !!            6.0  ! 1996-01  (G. Madec)  s-coord, suppress work arrays
10   !!   NEMO     0.5  ! 2002-08  (G. Madec)  F90: Free form and module
11   !!            1.0  ! 2004-02  (G. Madec)  vor_een: Original code
12   !!             -   ! 2003-08  (G. Madec)  add vor_ctl
13   !!             -   ! 2005-11  (G. Madec)  add dyn_vor (new step architecture)
14   !!            2.0  ! 2006-11  (G. Madec)  flux form advection: add metric term
15   !!            3.2  ! 2009-04  (R. Benshila)  vvl: correction of een scheme
16   !!            3.3  ! 2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase
[503]17   !!----------------------------------------------------------------------
[3]18
19   !!----------------------------------------------------------------------
[2528]20   !!   dyn_vor      : Update the momentum trend with the vorticity trend
21   !!       vor_ens  : enstrophy conserving scheme       (ln_dynvor_ens=T)
22   !!       vor_ene  : energy conserving scheme          (ln_dynvor_ene=T)
23   !!       vor_mix  : mixed enstrophy/energy conserving (ln_dynvor_mix=T)
24   !!       vor_een  : energy and enstrophy conserving   (ln_dynvor_een=T)
25   !!   dyn_vor_init : set and control of the different vorticity option
[3]26   !!----------------------------------------------------------------------
[503]27   USE oce            ! ocean dynamics and tracers
28   USE dom_oce        ! ocean space and time domain
[3097]29   USE dommsk         ! ocean mask
[643]30   USE dynadv         ! momentum advection (use ln_dynadv_vec value)
[503]31   USE trdmod         ! ocean dynamics trends
32   USE trdmod_oce     ! ocean variables trends
33   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
34   USE prtctl         ! Print control
35   USE in_out_manager ! I/O manager
[2715]36   USE lib_mpp
[3]37
38   IMPLICIT NONE
39   PRIVATE
40
[2528]41   PUBLIC   dyn_vor        ! routine called by step.F90
42   PUBLIC   dyn_vor_init   ! routine called by opa.F90
[3]43
[1601]44   !                                             !!* Namelist namdyn_vor: vorticity term
[32]45   LOGICAL, PUBLIC ::   ln_dynvor_ene = .FALSE.   !: energy conserving scheme
46   LOGICAL, PUBLIC ::   ln_dynvor_ens = .TRUE.    !: enstrophy conserving scheme
47   LOGICAL, PUBLIC ::   ln_dynvor_mix = .FALSE.   !: mixed scheme
[503]48   LOGICAL, PUBLIC ::   ln_dynvor_een = .FALSE.   !: energy and enstrophy conserving scheme
[3]49
[503]50   INTEGER ::   nvor = 0   ! type of vorticity trend used
[643]51   INTEGER ::   ncor = 1   ! coriolis
52   INTEGER ::   nrvm = 2   ! =2 relative vorticity ; =3 metric term
53   INTEGER ::   ntot = 4   ! =4 total vorticity (relative + planetary) ; =5 coriolis + metric term
[455]54
[3]55   !! * Substitutions
56#  include "domzgr_substitute.h90"
57#  include "vectopt_loop_substitute.h90"
58   !!----------------------------------------------------------------------
[2528]59   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
[1152]60   !! $Id$
[2715]61   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[3]62   !!----------------------------------------------------------------------
63CONTAINS
64
[455]65   SUBROUTINE dyn_vor( kt )
[3]66      !!----------------------------------------------------------------------
67      !!
[455]68      !! ** Purpose :   compute the lateral ocean tracer physics.
69      !!
70      !! ** Action : - Update (ua,va) with the now vorticity term trend
[503]71      !!             - save the trends in (ztrdu,ztrdv) in 2 parts (relative
[455]72      !!               and planetary vorticity trends) ('key_trddyn')
[503]73      !!----------------------------------------------------------------------
[2977]74      USE oce, ONLY:   tsa            ! tsa used as 2 3D workspace
75      !!
76      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index
[2715]77      !
[2977]78      REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdu, ztrdv
[455]79      !!----------------------------------------------------------------------
[2715]80      !
[2977]81      IF( l_trddyn )   THEN
82         ztrdu => tsa(:,:,:,1) 
83         ztrdv => tsa(:,:,:,2) 
84      END IF
85      !
[643]86      !                                          ! vorticity term
[455]87      SELECT CASE ( nvor )                       ! compute the vorticity trend and add it to the general trend
[643]88      !
[455]89      CASE ( -1 )                                      ! esopa: test all possibility with control print
[643]90         CALL vor_ene( kt, ntot, ua, va )
[503]91         CALL prt_ctl( tab3d_1=ua, clinfo1=' vor0 - Ua: ', mask1=umask, &
92            &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
[643]93         CALL vor_ens( kt, ntot, ua, va )
[503]94         CALL prt_ctl( tab3d_1=ua, clinfo1=' vor1 - Ua: ', mask1=umask, &
95            &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
[455]96         CALL vor_mix( kt )
[503]97         CALL prt_ctl( tab3d_1=ua, clinfo1=' vor2 - Ua: ', mask1=umask, &
98            &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
[643]99         CALL vor_een( kt, ntot, ua, va )
[503]100         CALL prt_ctl( tab3d_1=ua, clinfo1=' vor3 - Ua: ', mask1=umask, &
101            &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
[643]102         !
[455]103      CASE ( 0 )                                       ! energy conserving scheme
104         IF( l_trddyn )   THEN
105            ztrdu(:,:,:) = ua(:,:,:)
106            ztrdv(:,:,:) = va(:,:,:)
[643]107            CALL vor_ene( kt, nrvm, ua, va )                ! relative vorticity or metric trend
[455]108            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
109            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
[503]110            CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_rvo, 'DYN', kt )
[455]111            ztrdu(:,:,:) = ua(:,:,:)
112            ztrdv(:,:,:) = va(:,:,:)
[643]113            CALL vor_ene( kt, ncor, ua, va )                ! planetary vorticity trend
[455]114            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
115            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
[1104]116            CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_pvo, 'DYN', kt )
[503]117            CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_dat, 'DYN', kt )
[455]118         ELSE
[643]119            CALL vor_ene( kt, ntot, ua, va )                ! total vorticity
[455]120         ENDIF
[643]121         !
[455]122      CASE ( 1 )                                       ! enstrophy conserving scheme
123         IF( l_trddyn )   THEN   
124            ztrdu(:,:,:) = ua(:,:,:)
125            ztrdv(:,:,:) = va(:,:,:)
[643]126            CALL vor_ens( kt, nrvm, ua, va )                ! relative vorticity or metric trend
[455]127            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
128            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
[503]129            CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_rvo, 'DYN', kt )
[455]130            ztrdu(:,:,:) = ua(:,:,:)
131            ztrdv(:,:,:) = va(:,:,:)
[643]132            CALL vor_ens( kt, ncor, ua, va )                ! planetary vorticity trend
[455]133            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
134            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
[1104]135            CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_pvo, 'DYN', kt )
[503]136            CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_dat, 'DYN', kt )
[455]137         ELSE
[643]138            CALL vor_ens( kt, ntot, ua, va )                ! total vorticity
[455]139         ENDIF
[643]140         !
[455]141      CASE ( 2 )                                       ! mixed ene-ens scheme
142         IF( l_trddyn )   THEN
143            ztrdu(:,:,:) = ua(:,:,:)
144            ztrdv(:,:,:) = va(:,:,:)
[643]145            CALL vor_ens( kt, nrvm, ua, va )                ! relative vorticity or metric trend (ens)
[455]146            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
147            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
[503]148            CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_rvo, 'DYN', kt )
[455]149            ztrdu(:,:,:) = ua(:,:,:)
150            ztrdv(:,:,:) = va(:,:,:)
[643]151            CALL vor_ene( kt, ncor, ua, va )                ! planetary vorticity trend (ene)
[455]152            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
153            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
[1104]154            CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_pvo, 'DYN', kt )
[503]155            CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_dat, 'DYN', kt )
[455]156         ELSE
157            CALL vor_mix( kt )                               ! total vorticity (mix=ens-ene)
158         ENDIF
[643]159         !
[455]160      CASE ( 3 )                                       ! energy and enstrophy conserving scheme
161         IF( l_trddyn )   THEN
162            ztrdu(:,:,:) = ua(:,:,:)
163            ztrdv(:,:,:) = va(:,:,:)
[643]164            CALL vor_een( kt, nrvm, ua, va )                ! relative vorticity or metric trend
[455]165            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
166            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
[503]167            CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_rvo, 'DYN', kt )
[455]168            ztrdu(:,:,:) = ua(:,:,:)
169            ztrdv(:,:,:) = va(:,:,:)
[643]170            CALL vor_een( kt, ncor, ua, va )                ! planetary vorticity trend
[455]171            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
172            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
[1104]173            CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_pvo, 'DYN', kt )
[503]174            CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_dat, 'DYN', kt )
[455]175         ELSE
[643]176            CALL vor_een( kt, ntot, ua, va )                ! total vorticity
[455]177         ENDIF
[643]178         !
[455]179      END SELECT
[2715]180      !
[455]181      !                       ! print sum trends (used for debugging)
[2715]182      IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' vor  - Ua: ', mask1=umask,               &
[455]183         &                     tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
[1438]184      !
[455]185   END SUBROUTINE dyn_vor
186
187
[643]188   SUBROUTINE vor_ene( kt, kvor, pua, pva )
[455]189      !!----------------------------------------------------------------------
190      !!                  ***  ROUTINE vor_ene  ***
191      !!
[3]192      !! ** Purpose :   Compute the now total vorticity trend and add it to
193      !!      the general trend of the momentum equation.
194      !!
195      !! ** Method  :   Trend evaluated using now fields (centered in time)
196      !!      and the Sadourny (1975) flux form formulation : conserves the
197      !!      horizontal kinetic energy.
198      !!      The trend of the vorticity term is given by:
[455]199      !!       * s-coordinate (ln_sco=T), the e3. are inside the derivatives:
[3]200      !!          voru = 1/e1u  mj-1[ (rotn+f)/e3f  mi(e1v*e3v vn) ]
201      !!          vorv = 1/e2v  mi-1[ (rotn+f)/e3f  mj(e2u*e3u un) ]
202      !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes:
203      !!          voru = 1/e1u  mj-1[ (rotn+f)  mi(e1v vn) ]
204      !!          vorv = 1/e2v  mi-1[ (rotn+f)  mj(e2u un) ]
205      !!      Add this trend to the general momentum trend (ua,va):
206      !!          (ua,va) = (ua,va) + ( voru , vorv )
207      !!
208      !! ** Action : - Update (ua,va) with the now vorticity term trend
[503]209      !!             - save the trends in (ztrdu,ztrdv) in 2 parts (relative
[3]210      !!               and planetary vorticity trends) ('key_trddyn')
211      !!
[503]212      !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689.
[3]213      !!----------------------------------------------------------------------
[2715]214      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released
215      USE wrk_nemo, ONLY:   zwx => wrk_2d_1 , zwy => wrk_2d_2 , zwz => wrk_2d_3     ! 2D workspace
216      !
[643]217      INTEGER , INTENT(in   )                         ::   kt     ! ocean time-step index
218      INTEGER , INTENT(in   )                         ::   kvor   ! =ncor (planetary) ; =ntot (total) ;
[1438]219      !                                                           ! =nrvm (relative vorticity or metric)
[643]220      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pua    ! total u-trend
221      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pva    ! total v-trend
[2715]222      !
223      INTEGER  ::   ji, jj, jk   ! dummy loop indices
224      REAL(wp) ::   zx1, zy1, zfact2, zx2, zy2   ! local scalars
[3]225      !!----------------------------------------------------------------------
226
[2715]227      IF( wrk_in_use(2, 1,2,3) ) THEN
228         CALL ctl_stop('dyn:vor_ene: requested workspace arrays unavailable')   ;   RETURN
229      ENDIF
230
[52]231      IF( kt == nit000 ) THEN
232         IF(lwp) WRITE(numout,*)
[455]233         IF(lwp) WRITE(numout,*) 'dyn:vor_ene : vorticity term: energy conserving scheme'
234         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
[52]235      ENDIF
[3]236
[1438]237      zfact2 = 0.5 * 0.5      ! Local constant initialization
[216]238
[455]239!CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz )
[3]240      !                                                ! ===============
241      DO jk = 1, jpkm1                                 ! Horizontal slab
242         !                                             ! ===============
[1438]243         !
[3]244         ! Potential vorticity and horizontal fluxes
245         ! -----------------------------------------
[643]246         SELECT CASE( kvor )      ! vorticity considered
247         CASE ( 1 )   ;   zwz(:,:) =                  ff(:,:)      ! planetary vorticity (Coriolis)
248         CASE ( 2 )   ;   zwz(:,:) =   rotn(:,:,jk)                ! relative  vorticity
249         CASE ( 3 )                                                ! metric term
250            DO jj = 1, jpjm1
251               DO ji = 1, fs_jpim1   ! vector opt.
252                  zwz(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       &
253                       &         - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   &
254                       &     * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )
255               END DO
256            END DO
257         CASE ( 4 )   ;   zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) )    ! total (relative + planetary vorticity)
258         CASE ( 5 )                                                ! total (coriolis + metric)
259            DO jj = 1, jpjm1
260               DO ji = 1, fs_jpim1   ! vector opt.
261                  zwz(ji,jj) = ( ff (ji,jj)                                                                       &
262                       &       + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       &
263                       &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   &
264                       &       * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )                                               &
265                       &       )
266               END DO
267            END DO
[455]268         END SELECT
269
270         IF( ln_sco ) THEN
271            zwz(:,:) = zwz(:,:) / fse3f(:,:,jk)
[3]272            zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk)
273            zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk)
274         ELSE
275            zwx(:,:) = e2u(:,:) * un(:,:,jk)
276            zwy(:,:) = e1v(:,:) * vn(:,:,jk)
277         ENDIF
278
279         ! Compute and add the vorticity term trend
280         ! ----------------------------------------
281         DO jj = 2, jpjm1
282            DO ji = fs_2, fs_jpim1   ! vector opt.
283               zy1 = zwy(ji,jj-1) + zwy(ji+1,jj-1)
284               zy2 = zwy(ji,jj  ) + zwy(ji+1,jj  )
285               zx1 = zwx(ji-1,jj) + zwx(ji-1,jj+1)
286               zx2 = zwx(ji  ,jj) + zwx(ji  ,jj+1)
[455]287               pua(ji,jj,jk) = pua(ji,jj,jk) + zfact2 / e1u(ji,jj) * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 )
288               pva(ji,jj,jk) = pva(ji,jj,jk) - zfact2 / e2v(ji,jj) * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
[3]289            END DO 
290         END DO 
291         !                                             ! ===============
292      END DO                                           !   End of slab
293      !                                                ! ===============
[2715]294      IF( wrk_not_released(2, 1,2,3) )   CALL ctl_stop('dyn:vor_ene: failed to release workspace arrays')
295      !
[455]296   END SUBROUTINE vor_ene
[216]297
298
[455]299   SUBROUTINE vor_mix( kt )
[3]300      !!----------------------------------------------------------------------
[455]301      !!                 ***  ROUTINE vor_mix  ***
[3]302      !!
303      !! ** Purpose :   Compute the now total vorticity trend and add it to
304      !!      the general trend of the momentum equation.
305      !!
306      !! ** Method  :   Trend evaluated using now fields (centered in time)
307      !!      Mixte formulation : conserves the potential enstrophy of a hori-
308      !!      zontally non-divergent flow for (rotzu x uh), the relative vor-
309      !!      ticity term and the horizontal kinetic energy for (f x uh), the
310      !!      coriolis term. the now trend of the vorticity term is given by:
[455]311      !!       * s-coordinate (ln_sco=T), the e3. are inside the derivatives:
[3]312      !!          voru = 1/e1u  mj-1(rotn/e3f) mj-1[ mi(e1v*e3v vn) ]
313      !!              +1/e1u  mj-1[ f/e3f          mi(e1v*e3v vn) ]
314      !!          vorv = 1/e2v  mi-1(rotn/e3f) mi-1[ mj(e2u*e3u un) ]
315      !!              +1/e2v  mi-1[ f/e3f          mj(e2u*e3u un) ]
316      !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes:
317      !!          voru = 1/e1u  mj-1(rotn) mj-1[ mi(e1v vn) ]
318      !!              +1/e1u  mj-1[ f          mi(e1v vn) ]
319      !!          vorv = 1/e2v  mi-1(rotn) mi-1[ mj(e2u un) ]
320      !!              +1/e2v  mi-1[ f          mj(e2u un) ]
321      !!      Add this now trend to the general momentum trend (ua,va):
322      !!          (ua,va) = (ua,va) + ( voru , vorv )
323      !!
324      !! ** Action : - Update (ua,va) arrays with the now vorticity term trend
[503]325      !!             - Save the trends in (ztrdu,ztrdv) in 2 parts (relative
[3]326      !!               and planetary vorticity trends) ('key_trddyn')
327      !!
[503]328      !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689.
[3]329      !!----------------------------------------------------------------------
[2715]330      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released
331      USE wrk_nemo, ONLY:   zwx => wrk_2d_4 , zwy => wrk_2d_5 , zwz => wrk_2d_6 , zww => wrk_2d_7   ! 2D workspace
332      !
[503]333      INTEGER, INTENT(in) ::   kt   ! ocean timestep index
[2715]334      !
[1438]335      INTEGER  ::   ji, jj, jk   ! dummy loop indices
[2715]336      REAL(wp) ::   zfact1, zua, zcua, zx1, zy1   ! local scalars
337      REAL(wp) ::   zfact2, zva, zcva, zx2, zy2   !   -      -
[3]338      !!----------------------------------------------------------------------
339
[2715]340      IF( wrk_in_use(2, 4,5,6,7) ) THEN
341         CALL ctl_stop('dyn:vor_mix: requested workspace arrays unavailable')   ;   RETURN
342      ENDIF
343
[52]344      IF( kt == nit000 ) THEN
345         IF(lwp) WRITE(numout,*)
[455]346         IF(lwp) WRITE(numout,*) 'dyn:vor_mix : vorticity term: mixed energy/enstrophy conserving scheme'
347         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
[52]348      ENDIF
[3]349
[1438]350      zfact1 = 0.5 * 0.25      ! Local constant initialization
[3]351      zfact2 = 0.5 * 0.5
352
[455]353!CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz, zww )
[3]354      !                                                ! ===============
355      DO jk = 1, jpkm1                                 ! Horizontal slab
356         !                                             ! ===============
[1438]357         !
[3]358         ! Relative and planetary potential vorticity and horizontal fluxes
359         ! ----------------------------------------------------------------
[455]360         IF( ln_sco ) THEN       
[643]361            IF( ln_dynadv_vec ) THEN
362               zww(:,:) = rotn(:,:,jk) / fse3f(:,:,jk)
363            ELSE                       
364               DO jj = 1, jpjm1
365                  DO ji = 1, fs_jpim1   ! vector opt.
366                     zww(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       &
367                        &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   &
368                        &       * 0.5 / ( e1f(ji,jj) * e2f (ji,jj) * fse3f(ji,jj,jk) )
369                  END DO
370               END DO
371            ENDIF
[3]372            zwz(:,:) = ff  (:,:)    / fse3f(:,:,jk)
373            zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk)
374            zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk)
375         ELSE
[643]376            IF( ln_dynadv_vec ) THEN
377               zww(:,:) = rotn(:,:,jk)
378            ELSE                       
379               DO jj = 1, jpjm1
380                  DO ji = 1, fs_jpim1   ! vector opt.
381                     zww(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       &
382                        &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   &
383                        &       * 0.5 / ( e1f(ji,jj) * e2f (ji,jj) )
384                  END DO
385               END DO
386            ENDIF
387            zwz(:,:) = ff (:,:)
[3]388            zwx(:,:) = e2u(:,:) * un(:,:,jk)
389            zwy(:,:) = e1v(:,:) * vn(:,:,jk)
390         ENDIF
391
392         ! Compute and add the vorticity term trend
393         ! ----------------------------------------
394         DO jj = 2, jpjm1
395            DO ji = fs_2, fs_jpim1   ! vector opt.
396               zy1 = ( zwy(ji,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj)
397               zy2 = ( zwy(ji,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj)
398               zx1 = ( zwx(ji-1,jj) + zwx(ji-1,jj+1) ) / e2v(ji,jj)
399               zx2 = ( zwx(ji  ,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj)
400               ! enstrophy conserving formulation for relative vorticity term
401               zua = zfact1 * ( zww(ji  ,jj-1) + zww(ji,jj) ) * ( zy1 + zy2 )
402               zva =-zfact1 * ( zww(ji-1,jj  ) + zww(ji,jj) ) * ( zx1 + zx2 )
403               ! energy conserving formulation for planetary vorticity term
404               zcua = zfact2 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 )
405               zcva =-zfact2 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 )
[503]406               ! mixed vorticity trend added to the momentum trends
[3]407               ua(ji,jj,jk) = ua(ji,jj,jk) + zcua + zua
408               va(ji,jj,jk) = va(ji,jj,jk) + zcva + zva
409            END DO 
410         END DO 
411         !                                             ! ===============
412      END DO                                           !   End of slab
413      !                                                ! ===============
[2715]414      IF( wrk_not_released(2, 4,5,6,7) )   CALL ctl_stop('dyn:vor_mix: failed to release workspace arrays')
415      !
[455]416   END SUBROUTINE vor_mix
[216]417
418
[643]419   SUBROUTINE vor_ens( kt, kvor, pua, pva )
[3]420      !!----------------------------------------------------------------------
[455]421      !!                ***  ROUTINE vor_ens  ***
[3]422      !!
423      !! ** Purpose :   Compute the now total vorticity trend and add it to
424      !!      the general trend of the momentum equation.
425      !!
426      !! ** Method  :   Trend evaluated using now fields (centered in time)
427      !!      and the Sadourny (1975) flux FORM formulation : conserves the
428      !!      potential enstrophy of a horizontally non-divergent flow. the
429      !!      trend of the vorticity term is given by:
[455]430      !!       * s-coordinate (ln_sco=T), the e3. are inside the derivative:
[3]431      !!          voru = 1/e1u  mj-1[ (rotn+f)/e3f ]  mj-1[ mi(e1v*e3v vn) ]
432      !!          vorv = 1/e2v  mi-1[ (rotn+f)/e3f ]  mi-1[ mj(e2u*e3u un) ]
433      !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes:
434      !!          voru = 1/e1u  mj-1[ rotn+f ]  mj-1[ mi(e1v vn) ]
435      !!          vorv = 1/e2v  mi-1[ rotn+f ]  mi-1[ mj(e2u un) ]
436      !!      Add this trend to the general momentum trend (ua,va):
437      !!          (ua,va) = (ua,va) + ( voru , vorv )
438      !!
439      !! ** Action : - Update (ua,va) arrays with the now vorticity term trend
[503]440      !!             - Save the trends in (ztrdu,ztrdv) in 2 parts (relative
[3]441      !!               and planetary vorticity trends) ('key_trddyn')
442      !!
[503]443      !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689.
[3]444      !!----------------------------------------------------------------------
[2715]445      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released
446      USE wrk_nemo, ONLY:   zwx => wrk_2d_4, zwy => wrk_2d_5, zwz => wrk_2d_6    ! 2D workspace
447      !
[643]448      INTEGER , INTENT(in   )                         ::   kt     ! ocean time-step index
449      INTEGER , INTENT(in   )                         ::   kvor   ! =ncor (planetary) ; =ntot (total) ;
450         !                                                        ! =nrvm (relative vorticity or metric)
451      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pua    ! total u-trend
452      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pva    ! total v-trend
[2715]453      !
[503]454      INTEGER  ::   ji, jj, jk           ! dummy loop indices
455      REAL(wp) ::   zfact1, zuav, zvau   ! temporary scalars
[3]456      !!----------------------------------------------------------------------
457     
[2715]458      IF( wrk_in_use(2, 4,5,6) ) THEN
459         CALL ctl_stop('dyn:vor_ens: requested workspace arrays unavailable')   ;   RETURN
460      END IF
461
[52]462      IF( kt == nit000 ) THEN
463         IF(lwp) WRITE(numout,*)
[455]464         IF(lwp) WRITE(numout,*) 'dyn:vor_ens : vorticity term: enstrophy conserving scheme'
465         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
[52]466      ENDIF
[3]467
[1438]468      zfact1 = 0.5 * 0.25      ! Local constant initialization
[3]469
[455]470!CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz )
[3]471      !                                                ! ===============
472      DO jk = 1, jpkm1                                 ! Horizontal slab
473         !                                             ! ===============
[1438]474         !
[3]475         ! Potential vorticity and horizontal fluxes
476         ! -----------------------------------------
[643]477         SELECT CASE( kvor )      ! vorticity considered
478         CASE ( 1 )   ;   zwz(:,:) =                  ff(:,:)      ! planetary vorticity (Coriolis)
479         CASE ( 2 )   ;   zwz(:,:) =   rotn(:,:,jk)                ! relative  vorticity
480         CASE ( 3 )                                                ! metric term
481            DO jj = 1, jpjm1
482               DO ji = 1, fs_jpim1   ! vector opt.
483                  zwz(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       &
484                       &         - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   &
485                       &     * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )
486               END DO
487            END DO
488         CASE ( 4 )   ;   zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) )    ! total (relative + planetary vorticity)
489         CASE ( 5 )                                                ! total (coriolis + metric)
490            DO jj = 1, jpjm1
491               DO ji = 1, fs_jpim1   ! vector opt.
492                  zwz(ji,jj) = ( ff (ji,jj)                                                                       &
493                       &       + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       &
494                       &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   &
[1438]495                       &       * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )                                                &
[643]496                       &       )
497               END DO
498            END DO
[455]499         END SELECT
[1438]500         !
[455]501         IF( ln_sco ) THEN
[3]502            DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop
503               DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking
[455]504                  zwz(ji,jj) = zwz(ji,jj) / fse3f(ji,jj,jk)
505                  zwx(ji,jj) = e2u(ji,jj) * fse3u(ji,jj,jk) * un(ji,jj,jk)
506                  zwy(ji,jj) = e1v(ji,jj) * fse3v(ji,jj,jk) * vn(ji,jj,jk)
[3]507               END DO
508            END DO
509         ELSE
510            DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop
511               DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking
[455]512                  zwx(ji,jj) = e2u(ji,jj) * un(ji,jj,jk)
513                  zwy(ji,jj) = e1v(ji,jj) * vn(ji,jj,jk)
[3]514               END DO
515            END DO
516         ENDIF
[1438]517         !
[3]518         ! Compute and add the vorticity term trend
519         ! ----------------------------------------
520         DO jj = 2, jpjm1
521            DO ji = fs_2, fs_jpim1   ! vector opt.
[455]522               zuav = zfact1 / e1u(ji,jj) * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1)   &
[503]523                  &                         + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) )
[455]524               zvau =-zfact1 / e2v(ji,jj) * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1)   &
[503]525                  &                         + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) )
[455]526               pua(ji,jj,jk) = pua(ji,jj,jk) + zuav * ( zwz(ji  ,jj-1) + zwz(ji,jj) )
527               pva(ji,jj,jk) = pva(ji,jj,jk) + zvau * ( zwz(ji-1,jj  ) + zwz(ji,jj) )
[3]528            END DO 
529         END DO 
530         !                                             ! ===============
531      END DO                                           !   End of slab
532      !                                                ! ===============
[2715]533      IF( wrk_not_released(2, 4,5,6) )   CALL ctl_stop('dyn:vor_ens: failed to release workspace arrays')
534      !
[455]535   END SUBROUTINE vor_ens
[216]536
537
[643]538   SUBROUTINE vor_een( kt, kvor, pua, pva )
[108]539      !!----------------------------------------------------------------------
[455]540      !!                ***  ROUTINE vor_een  ***
[108]541      !!
542      !! ** Purpose :   Compute the now total vorticity trend and add it to
543      !!      the general trend of the momentum equation.
544      !!
545      !! ** Method  :   Trend evaluated using now fields (centered in time)
[1438]546      !!      and the Arakawa and Lamb (1980) flux form formulation : conserves
[108]547      !!      both the horizontal kinetic energy and the potential enstrophy
[1438]548      !!      when horizontal divergence is zero (see the NEMO documentation)
549      !!      Add this trend to the general momentum trend (ua,va).
[108]550      !!
551      !! ** Action : - Update (ua,va) with the now vorticity term trend
[503]552      !!             - save the trends in (ztrdu,ztrdv) in 2 parts (relative
[108]553      !!               and planetary vorticity trends) ('key_trddyn')
554      !!
[503]555      !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36
556      !!----------------------------------------------------------------------
[2715]557      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released
558      USE wrk_nemo, ONLY:   zwx  => wrk_2d_1 , zwy  => wrk_2d_2 ,  zwz => wrk_2d_3     ! 2D workspace
559      USE wrk_nemo, ONLY:   ztnw => wrk_2d_4 , ztne => wrk_2d_5 
560      USE wrk_nemo, ONLY:   ztsw => wrk_2d_6 , ztse => wrk_2d_7
561#if defined key_vvl
562      USE wrk_nemo, ONLY:   ze3f => wrk_3d_1                                           ! 3D workspace (lk_vvl=T)
563#endif
564      !
[643]565      INTEGER , INTENT(in   )                         ::   kt     ! ocean time-step index
566      INTEGER , INTENT(in   )                         ::   kvor   ! =ncor (planetary) ; =ntot (total) ;
[1438]567      !                                                           ! =nrvm (relative vorticity or metric)
[643]568      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pua    ! total u-trend
569      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pva    ! total v-trend
[218]570      !!
[1438]571      INTEGER  ::   ji, jj, jk         ! dummy loop indices
[2715]572      INTEGER  ::   ierr               ! local integer
573      REAL(wp) ::   zfac12, zua, zva   ! local scalars
574#if ! defined key_vvl
575      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE ::   ze3f     ! lk_vvl=F, ze3f=1/e3f saved one for all
[1438]576#endif
[108]577      !!----------------------------------------------------------------------
578
[2715]579      IF( wrk_in_use(2, 1,2,3,4,5,6,7) .OR. wrk_in_use(3, 1) ) THEN
580         CALL ctl_stop('dyn:vor_een: requested workspace arrays unavailable')   ;   RETURN
581      ENDIF
582
[108]583      IF( kt == nit000 ) THEN
584         IF(lwp) WRITE(numout,*)
[455]585         IF(lwp) WRITE(numout,*) 'dyn:vor_een : vorticity term: energy and enstrophy conserving scheme'
586         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
[2715]587         IF( .NOT.lk_vvl ) THEN
588            ALLOCATE( ze3f(jpi,jpj,jpk) , STAT=ierr )
589            IF( lk_mpp    )   CALL mpp_sum ( ierr )
590            IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'dyn:vor_een : unable to allocate arrays' )
591         ENDIF
[1438]592      ENDIF
[108]593
[1438]594      IF( kt == nit000 .OR. lk_vvl ) THEN      ! reciprocal of e3 at F-point (masked averaging of e3t)
[108]595         DO jk = 1, jpk
596            DO jj = 1, jpjm1
597               DO ji = 1, jpim1
598                  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)   &
599                     &             + fse3t(ji,jj  ,jk)*tmask(ji,jj  ,jk) + fse3t(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk) ) * 0.25
[2715]600                  IF( ze3f(ji,jj,jk) /= 0._wp )   ze3f(ji,jj,jk) = 1._wp / ze3f(ji,jj,jk)
[108]601               END DO
602            END DO
603         END DO
604         CALL lbc_lnk( ze3f, 'F', 1. )
605      ENDIF
606
[2715]607      zfac12 = 1._wp / 12._wp    ! Local constant initialization
[216]608
[108]609     
[455]610!CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz, ztnw, ztne, ztsw, ztse )
[108]611      !                                                ! ===============
612      DO jk = 1, jpkm1                                 ! Horizontal slab
613         !                                             ! ===============
614         
615         ! Potential vorticity and horizontal fluxes
616         ! -----------------------------------------
[643]617         SELECT CASE( kvor )      ! vorticity considered
[1438]618         CASE ( 1 )                                                ! planetary vorticity (Coriolis)
619            zwz(:,:) = ff(:,:)      * ze3f(:,:,jk)
620         CASE ( 2 )                                                ! relative  vorticity
621            zwz(:,:) = rotn(:,:,jk) * ze3f(:,:,jk)
[643]622         CASE ( 3 )                                                ! metric term
623            DO jj = 1, jpjm1
624               DO ji = 1, fs_jpim1   ! vector opt.
625                  zwz(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       &
626                       &         - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   &
627                       &     * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) * ze3f(ji,jj,jk)
628               END DO
629            END DO
[1516]630            CALL lbc_lnk( zwz, 'F', 1. )
631        CASE ( 4 )                                                ! total (relative + planetary vorticity)
[1438]632            zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) * ze3f(:,:,jk)
[643]633         CASE ( 5 )                                                ! total (coriolis + metric)
634            DO jj = 1, jpjm1
635               DO ji = 1, fs_jpim1   ! vector opt.
636                  zwz(ji,jj) = ( ff (ji,jj)                                                                       &
637                       &       + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       &
638                       &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   &
[1438]639                       &       * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )                                                &
[643]640                       &       ) * ze3f(ji,jj,jk)
641               END DO
642            END DO
[1516]643            CALL lbc_lnk( zwz, 'F', 1. )
[455]644         END SELECT
645
[108]646         zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk)
647         zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk)
648
649         ! Compute and add the vorticity term trend
650         ! ----------------------------------------
[1438]651         jj = 2
652         ztne(1,:) = 0   ;   ztnw(1,:) = 0   ;   ztse(1,:) = 0   ;   ztsw(1,:) = 0
[108]653         DO ji = 2, jpi   
654               ztne(ji,jj) = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1)
655               ztnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  )
656               ztse(ji,jj) = zwz(ji  ,jj  ) + zwz(ji  ,jj-1) + zwz(ji-1,jj-1)
657               ztsw(ji,jj) = zwz(ji  ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj  )
658         END DO
659         DO jj = 3, jpj
[1694]660            DO ji = fs_2, jpi   ! vector opt. ok because we start at jj = 3
[108]661               ztne(ji,jj) = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1)
662               ztnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  )
663               ztse(ji,jj) = zwz(ji  ,jj  ) + zwz(ji  ,jj-1) + zwz(ji-1,jj-1)
664               ztsw(ji,jj) = zwz(ji  ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj  )
665            END DO
666         END DO
667         DO jj = 2, jpjm1
668            DO ji = fs_2, fs_jpim1   ! vector opt.
669               zua = + zfac12 / e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   &
670                  &                           + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) )
671               zva = - zfac12 / e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   &
672                  &                           + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) )
[455]673               pua(ji,jj,jk) = pua(ji,jj,jk) + zua
674               pva(ji,jj,jk) = pva(ji,jj,jk) + zva
[108]675            END DO 
676         END DO 
677         !                                             ! ===============
678      END DO                                           !   End of slab
679      !                                                ! ===============
[2715]680      IF( wrk_not_released(2, 1,2,3,4,5,6,7) .OR.   &
681          wrk_not_released(3, 1)             )   CALL ctl_stop('dyn:vor_een: failed to release workspace arrays')
682      !
[455]683   END SUBROUTINE vor_een
[216]684
685
[2528]686   SUBROUTINE dyn_vor_init
[3]687      !!---------------------------------------------------------------------
[2528]688      !!                  ***  ROUTINE dyn_vor_init  ***
[3]689      !!
690      !! ** Purpose :   Control the consistency between cpp options for
[1438]691      !!              tracer advection schemes
[3]692      !!----------------------------------------------------------------------
[2715]693      INTEGER ::   ioptio          ! local integer
694      !!
[3097]695      NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, ln_dynvor_een
[3]696      !!----------------------------------------------------------------------
697
[1601]698      REWIND ( numnam )               ! Read Namelist namdyn_vor : Vorticity scheme options
699      READ   ( numnam, namdyn_vor )
[3]700
[503]701      IF(lwp) THEN                    ! Namelist print
[3]702         WRITE(numout,*)
[2528]703         WRITE(numout,*) 'dyn_vor_init : vorticity term : read namelist and control the consistency'
704         WRITE(numout,*) '~~~~~~~~~~~~'
[1601]705         WRITE(numout,*) '        Namelist namdyn_vor : oice of the vorticity term scheme'
[503]706         WRITE(numout,*) '           energy    conserving scheme                ln_dynvor_ene = ', ln_dynvor_ene
707         WRITE(numout,*) '           enstrophy conserving scheme                ln_dynvor_ens = ', ln_dynvor_ens
708         WRITE(numout,*) '           mixed enstrophy/energy conserving scheme   ln_dynvor_mix = ', ln_dynvor_mix
709         WRITE(numout,*) '           enstrophy and energy conserving scheme     ln_dynvor_een = ', ln_dynvor_een
[52]710      ENDIF
711
[3095]712      ! If energy, enstrophy or mixed advection of momentum in vector form change the value for masks
713      ! at angles with three ocean points and one land point
[3097]714      IF( ln_vorlat .AND. (ln_dynvor_ene .OR. ln_dynvor_ens .OR. ln_dynvor_mix) ) THEN
[3095]715          DO jj = 2, jpjm1
716            DO ji = 2, jpim1
717               IF( tmask(ji,jj,jk)+tmask(ji+1,jj,jk)+tmask(ji,jj+1,jk)+tmask(ji+1,jj+1,jk) == 3._wp ) &
718                   fmask(ji,jj,jk) = 1._wp
719            END DO
720          END DO
721          !
722          CALL lbc_lnk( fmask, 'F', 1._wp )      ! Lateral boundary conditions on fmask
723          !
724      ENDIF
725
[503]726      ioptio = 0                     ! Control of vorticity scheme options
727      IF( ln_dynvor_ene )   ioptio = ioptio + 1
728      IF( ln_dynvor_ens )   ioptio = ioptio + 1
729      IF( ln_dynvor_mix )   ioptio = ioptio + 1
730      IF( ln_dynvor_een )   ioptio = ioptio + 1
731      IF( lk_esopa      )   ioptio =          1
732
733      IF( ioptio /= 1 ) CALL ctl_stop( ' use ONE and ONLY one vorticity scheme' )
734
[643]735      !                              ! Set nvor (type of scheme for vorticity)
[503]736      IF( ln_dynvor_ene )   nvor =  0
737      IF( ln_dynvor_ens )   nvor =  1
738      IF( ln_dynvor_mix )   nvor =  2
739      IF( ln_dynvor_een )   nvor =  3
740      IF( lk_esopa      )   nvor = -1
741     
[643]742      !                              ! Set ncor, nrvm, ntot (type of vorticity)
743      IF(lwp) WRITE(numout,*)
744      ncor = 1
745      IF( ln_dynadv_vec ) THEN     
746         IF(lwp) WRITE(numout,*) '         Vector form advection : vorticity = Coriolis + relative vorticity'
747         nrvm = 2
748         ntot = 4
749      ELSE                       
750         IF(lwp) WRITE(numout,*) '         Flux form advection   : vorticity = Coriolis + metric term'
751         nrvm = 3
752         ntot = 5
753      ENDIF
754     
[503]755      IF(lwp) THEN                   ! Print the choice
756         WRITE(numout,*)
[643]757         IF( nvor ==  0 )   WRITE(numout,*) '         vorticity scheme : energy conserving scheme'
758         IF( nvor ==  1 )   WRITE(numout,*) '         vorticity scheme : enstrophy conserving scheme'
759         IF( nvor ==  2 )   WRITE(numout,*) '         vorticity scheme : mixed enstrophy/energy conserving scheme'
760         IF( nvor ==  3 )   WRITE(numout,*) '         vorticity scheme : energy and enstrophy conserving scheme'
[503]761         IF( nvor == -1 )   WRITE(numout,*) '         esopa test: use all lateral physics options'
[3]762      ENDIF
[503]763      !
[2528]764   END SUBROUTINE dyn_vor_init
[3]765
[503]766   !!==============================================================================
[3]767END MODULE dynvor
Note: See TracBrowser for help on using the repository browser.