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.
dynatf.F90 in NEMO/branches/2019/dev_r11943_MERGE_2019/src/OCE/DYN – NEMO

source: NEMO/branches/2019/dev_r11943_MERGE_2019/src/OCE/DYN/dynatf.F90 @ 11949

Last change on this file since 11949 was 11949, checked in by acc, 4 years ago

Merge in changes from 2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps. This just creates a fresh copy of this branch to use as the merge base. See ticket #2341

  • Property svn:keywords set to Id
File size: 18.5 KB
RevLine 
[11050]1MODULE dynatf
[1502]2   !!=========================================================================
[11050]3   !!                       ***  MODULE  dynatf  ***
4   !! Ocean dynamics: time filtering
[1502]5   !!=========================================================================
[1438]6   !! History :  OPA  !  1987-02  (P. Andrich, D. L Hostis)  Original code
7   !!                 !  1990-10  (C. Levy, G. Madec)
8   !!            7.0  !  1993-03  (M. Guyon)  symetrical conditions
9   !!            8.0  !  1997-02  (G. Madec & M. Imbard)  opa, release 8.0
10   !!            8.2  !  1997-04  (A. Weaver)  Euler forward step
11   !!             -   !  1997-06  (G. Madec)  lateral boudary cond., lbc routine
12   !!    NEMO    1.0  !  2002-08  (G. Madec)  F90: Free form and module
13   !!             -   !  2002-10  (C. Talandier, A-M. Treguier) Open boundary cond.
14   !!            2.0  !  2005-11  (V. Garnier) Surface pressure gradient organization
15   !!            2.3  !  2007-07  (D. Storkey) Calls to BDY routines.
[1502]16   !!            3.2  !  2009-06  (G. Madec, R.Benshila)  re-introduce the vvl option
[2528]17   !!            3.3  !  2010-09  (D. Storkey, E.O'Dea) Bug fix for BDY module
[2723]18   !!            3.3  !  2011-03  (P. Oddo) Bug fix for time-splitting+(BDY-OBC) and not VVL
[4292]19   !!            3.5  !  2013-07  (J. Chanut) Compliant with time splitting changes
[6140]20   !!            3.6  !  2014-04  (G. Madec) add the diagnostic of the time filter trends
[5930]21   !!            3.7  !  2015-11  (J. Chanut) Free surface simplification
[11475]22   !!            4.1  !  2019-08  (A. Coward, D. Storkey) Rename dynnxt.F90 -> dynatf.F90. Now just does time filtering.
[1502]23   !!-------------------------------------------------------------------------
[1438]24 
[11050]25   !!----------------------------------------------------------------------------------------------
26   !!   dyn_atf       : apply Asselin time filtering to "now" velocities and vertical scale factors
27   !!----------------------------------------------------------------------------------------------
[6140]28   USE oce            ! ocean dynamics and tracers
29   USE dom_oce        ! ocean space and time domain
30   USE sbc_oce        ! Surface boundary condition: ocean fields
[9023]31   USE sbcrnf         ! river runoffs
[9361]32   USE sbcisf         ! ice shelf
[6140]33   USE phycst         ! physical constants
34   USE dynadv         ! dynamics: vector invariant versus flux form
35   USE dynspg_ts      ! surface pressure gradient: split-explicit scheme
36   USE domvvl         ! variable volume
[7646]37   USE bdy_oce   , ONLY: ln_bdy
[6140]38   USE bdydta         ! ocean open boundary conditions
39   USE bdydyn         ! ocean open boundary conditions
40   USE bdyvol         ! ocean open boundary condition (bdy_vol routines)
41   USE trd_oce        ! trends: ocean variables
42   USE trddyn         ! trend manager: dynamics
43   USE trdken         ! trend manager: kinetic energy
[4990]44   !
[6140]45   USE in_out_manager ! I/O manager
46   USE iom            ! I/O manager library
47   USE lbclnk         ! lateral boundary condition (or mpp link)
48   USE lib_mpp        ! MPP library
49   USE prtctl         ! Print control
50   USE timing         ! Timing
[2528]51#if defined key_agrif
[9570]52   USE agrif_oce_interp
[11050]53#endif
[3]54
55   IMPLICIT NONE
56   PRIVATE
57
[11050]58   PUBLIC    dyn_atf   ! routine called by step.F90
[1438]59
[2715]60   !!----------------------------------------------------------------------
[9598]61   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
[1438]62   !! $Id$
[10068]63   !! Software governed by the CeCILL license (see ./LICENSE)
[2715]64   !!----------------------------------------------------------------------
[3]65CONTAINS
66
[11050]67   SUBROUTINE dyn_atf ( kt, Kbb, Kmm, Kaa, puu, pvv, pe3t, pe3u, pe3v )
[3]68      !!----------------------------------------------------------------------
[11050]69      !!                  ***  ROUTINE dyn_atf  ***
[3]70      !!                   
[5930]71      !! ** Purpose :   Finalize after horizontal velocity. Apply the boundary
[11475]72      !!             condition on the after velocity and apply the Asselin time
73      !!             filter to the now fields.
[3]74      !!
[5930]75      !! ** Method  : * Ensure after velocities transport matches time splitting
76      !!             estimate (ln_dynspg_ts=T)
[3]77      !!
[1502]78      !!              * Apply lateral boundary conditions on after velocity
79      !!             at the local domain boundaries through lbc_lnk call,
[7646]80      !!             at the one-way open boundaries (ln_bdy=T),
[4990]81      !!             at the AGRIF zoom   boundaries (lk_agrif=T)
[3]82      !!
[11475]83      !!              * Apply the Asselin time filter to the now fields
[1502]84      !!             arrays to start the next time step:
[11475]85      !!                (puu(Kmm),pvv(Kmm)) = (puu(Kmm),pvv(Kmm))
86      !!                                    + atfp [ (puu(Kbb),pvv(Kbb)) + (puu(Kaa),pvv(Kaa)) - 2 (puu(Kmm),pvv(Kmm)) ]
[6140]87      !!             Note that with flux form advection and non linear free surface,
88      !!             the time filter is applied on thickness weighted velocity.
[11475]89      !!             As a result, dyn_atf MUST be called after tra_atf.
[1502]90      !!
[11475]91      !! ** Action :   puu(Kmm),pvv(Kmm)   filtered now horizontal velocity
[3]92      !!----------------------------------------------------------------------
[11050]93      INTEGER                             , INTENT(in   ) :: kt               ! ocean time-step index
94      INTEGER                             , INTENT(in   ) :: Kbb, Kmm, Kaa    ! before and after time level indices
95      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv         ! velocities to be time filtered
96      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: pe3t, pe3u, pe3v ! scale factors to be time filtered
[2715]97      !
[3]98      INTEGER  ::   ji, jj, jk   ! dummy loop indices
[11050]99      REAL(wp) ::   zue3a, zue3n, zue3b, zcoef    ! local scalars
100      REAL(wp) ::   zve3a, zve3n, zve3b, z1_2dt   !   -      -
[9019]101      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zue, zve
[11050]102      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ze3t_f, ze3u_f, ze3v_f, zua, zva 
[1502]103      !!----------------------------------------------------------------------
[3294]104      !
[11050]105      IF( ln_timing    )   CALL timing_start('dyn_atf')
[9019]106      IF( ln_dynspg_ts )   ALLOCATE( zue(jpi,jpj)     , zve(jpi,jpj)     )
107      IF( l_trddyn     )   ALLOCATE( zua(jpi,jpj,jpk) , zva(jpi,jpj,jpk) )
[3294]108      !
[3]109      IF( kt == nit000 ) THEN
110         IF(lwp) WRITE(numout,*)
[11050]111         IF(lwp) WRITE(numout,*) 'dyn_atf : Asselin time filtering'
[3]112         IF(lwp) WRITE(numout,*) '~~~~~~~'
113      ENDIF
114
[5930]115      IF ( ln_dynspg_ts ) THEN
116         ! Ensure below that barotropic velocities match time splitting estimate
117         ! Compute actual transport and replace it with ts estimate at "after" time step
[11050]118         zue(:,:) = pe3u(:,:,1,Kaa) * puu(:,:,1,Kaa) * umask(:,:,1)
119         zve(:,:) = pe3v(:,:,1,Kaa) * pvv(:,:,1,Kaa) * vmask(:,:,1)
[5930]120         DO jk = 2, jpkm1
[11050]121            zue(:,:) = zue(:,:) + pe3u(:,:,jk,Kaa) * puu(:,:,jk,Kaa) * umask(:,:,jk)
122            zve(:,:) = zve(:,:) + pe3v(:,:,jk,Kaa) * pvv(:,:,jk,Kaa) * vmask(:,:,jk)
[1502]123         END DO
124         DO jk = 1, jpkm1
[11050]125            puu(:,:,jk,Kaa) = ( puu(:,:,jk,Kaa) - zue(:,:) * r1_hu(:,:,Kaa) + uu_b(:,:,Kaa) ) * umask(:,:,jk)
126            pvv(:,:,jk,Kaa) = ( pvv(:,:,jk,Kaa) - zve(:,:) * r1_hv(:,:,Kaa) + vv_b(:,:,Kaa) ) * vmask(:,:,jk)
[592]127         END DO
[6140]128         !
129         IF( .NOT.ln_bt_fw ) THEN
[5930]130            ! Remove advective velocity from "now velocities"
131            ! prior to asselin filtering     
132            ! In the forward case, this is done below after asselin filtering   
133            ! so that asselin contribution is removed at the same time
134            DO jk = 1, jpkm1
[11050]135               puu(:,:,jk,Kmm) = ( puu(:,:,jk,Kmm) - un_adv(:,:)*r1_hu(:,:,Kmm) + uu_b(:,:,Kmm) )*umask(:,:,jk)
136               pvv(:,:,jk,Kmm) = ( pvv(:,:,jk,Kmm) - vn_adv(:,:)*r1_hv(:,:,Kmm) + vv_b(:,:,Kmm) )*vmask(:,:,jk)
[7753]137            END DO 
[5930]138         ENDIF
[4292]139      ENDIF
140
[1502]141      ! Update after velocity on domain lateral boundaries
142      ! --------------------------------------------------     
[5930]143# if defined key_agrif
144      CALL Agrif_dyn( kt )             !* AGRIF zoom boundaries
145# endif
146      !
[11050]147      CALL lbc_lnk_multi( 'dynnxt', puu(:,:,:,Kaa), 'U', -1., pvv(:,:,:,Kaa), 'V', -1. )     !* local domain boundaries
[1502]148      !
149      !                                !* BDY open boundaries
[11050]150      IF( ln_bdy .AND. ln_dynspg_exp )   CALL bdy_dyn( kt, Kbb, puu, pvv, Kaa )
151      IF( ln_bdy .AND. ln_dynspg_ts  )   CALL bdy_dyn( kt, Kbb, puu, pvv, Kaa, dyn3d_only=.true. )
[3294]152
153!!$   Do we need a call to bdy_vol here??
154      !
[4990]155      IF( l_trddyn ) THEN             ! prepare the atf trend computation + some diagnostics
156         z1_2dt = 1._wp / (2. * rdt)        ! Euler or leap-frog time step
157         IF( neuler == 0 .AND. kt == nit000 )   z1_2dt = 1._wp / rdt
158         !
159         !                                  ! Kinetic energy and Conversion
[11050]160         IF( ln_KE_trd  )   CALL trd_dyn( puu(:,:,:,Kaa), pvv(:,:,:,Kaa), jpdyn_ken, kt, Kmm )
[4990]161         !
162         IF( ln_dyn_trd ) THEN              ! 3D output: total momentum trends
[11050]163            zua(:,:,:) = ( puu(:,:,:,Kaa) - puu(:,:,:,Kbb) ) * z1_2dt
164            zva(:,:,:) = ( pvv(:,:,:,Kaa) - pvv(:,:,:,Kbb) ) * z1_2dt
[4990]165            CALL iom_put( "utrd_tot", zua )        ! total momentum trends, except the asselin time filter
166            CALL iom_put( "vtrd_tot", zva )
167         ENDIF
168         !
[11050]169         zua(:,:,:) = puu(:,:,:,Kmm)             ! save the now velocity before the asselin filter
170         zva(:,:,:) = pvv(:,:,:,Kmm)             ! (caution: there will be a shift by 1 timestep in the
[7753]171         !                                  !  computation of the asselin filter trends)
[4990]172      ENDIF
173
[1438]174      ! Time filter and swap of dynamics arrays
175      ! ------------------------------------------
[9226]176         
[11050]177      IF( .NOT.( neuler == 0 .AND. kt == nit000 ) ) THEN    !* Leap-Frog : Asselin time filter
[2528]178         !                                ! =============!
[6140]179         IF( ln_linssh ) THEN             ! Fixed volume !
[2528]180            !                             ! =============!
[1502]181            DO jk = 1, jpkm1                             
[592]182               DO jj = 1, jpj
[1502]183                  DO ji = 1, jpi   
[11050]184                     puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) )
185                     pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) )
[1502]186                  END DO
187               END DO
188            END DO
[2528]189            !                             ! ================!
190         ELSE                             ! Variable volume !
191            !                             ! ================!
[11050]192            ! Time-filtered scale factor at t-points
[4292]193            ! ----------------------------------------------------
[11050]194            ALLOCATE( ze3t_f(jpi,jpj,jpk) )
[9023]195            DO jk = 1, jpkm1
[11050]196               ze3t_f(:,:,jk) = pe3t(:,:,jk,Kmm) + atfp * ( pe3t(:,:,jk,Kbb) - 2._wp * pe3t(:,:,jk,Kmm) + pe3t(:,:,jk,Kaa) )
[9023]197            END DO
198            ! Add volume filter correction: compatibility with tracer advection scheme
199            ! => time filter + conservation correction (only at the first level)
200            zcoef = atfp * rdt * r1_rau0
[9361]201
[11050]202            ze3t_f(:,:,1) = ze3t_f(:,:,1) - zcoef * ( emp_b(:,:) - emp(:,:) ) * tmask(:,:,1)
[9361]203
204            IF ( ln_rnf ) THEN
205               IF( ln_rnf_depth ) THEN
[11050]206                  DO jk = 1, jpkm1 ! Deal with Rivers separately, as can be through depth too
[9361]207                     DO jj = 1, jpj
208                        DO ji = 1, jpi
209                           IF( jk <=  nk_rnf(ji,jj)  ) THEN
[11050]210                               ze3t_f(ji,jj,jk) =   ze3t_f(ji,jj,jk) - zcoef *  ( - rnf_b(ji,jj) + rnf(ji,jj) ) &
211                                      &          * ( pe3t(ji,jj,jk,Kmm) / h_rnf(ji,jj) ) * tmask(ji,jj,jk)
[9361]212                           ENDIF
[9023]213                        ENDDO
214                     ENDDO
[9361]215                  ENDDO
216               ELSE
[11050]217                  ze3t_f(:,:,1) = ze3t_f(:,:,1) - zcoef *  ( -rnf_b(:,:) + rnf(:,:))*tmask(:,:,1)
[9361]218               ENDIF
219            END IF
220
221            IF ( ln_isf ) THEN   ! if ice shelf melting
222               DO jk = 1, jpkm1 ! Deal with isf separetely, as can be through depth too
[6140]223                  DO jj = 1, jpj
224                     DO ji = 1, jpi
[10349]225                        IF( misfkt(ji,jj) <=jk .and. jk < misfkb(ji,jj)  ) THEN
[11050]226                           ze3t_f(ji,jj,jk) = ze3t_f(ji,jj,jk) - zcoef * ( fwfisf_b(ji,jj) - fwfisf(ji,jj) ) &
227                                &          * ( pe3t(ji,jj,jk,Kmm) * r1_hisf_tbl(ji,jj) ) * tmask(ji,jj,jk)
[10349]228                        ELSEIF ( jk==misfkb(ji,jj) ) THEN
[11050]229                           ze3t_f(ji,jj,jk) = ze3t_f(ji,jj,jk) - zcoef * ( fwfisf_b(ji,jj) - fwfisf(ji,jj) ) &
230                                &          * ( pe3t(ji,jj,jk,Kmm) * r1_hisf_tbl(ji,jj) ) * ralpha(ji,jj) * tmask(ji,jj,jk)
[9361]231                        ENDIF
[5643]232                     END DO
233                  END DO
[9361]234               END DO
[9023]235            END IF
[2528]236            !
[11050]237            pe3t(:,:,1:jpkm1,Kmm) = ze3t_f(:,:,1:jpkm1)        ! filtered scale factor at T-points
238            !
[6140]239            IF( ln_dynadv_vec ) THEN      ! Asselin filter applied on velocity
240               ! Before filtered scale factor at (u/v)-points
[11050]241               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), pe3u(:,:,:,Kmm), 'U' )
242               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), pe3v(:,:,:,Kmm), 'V' )
[4292]243               DO jk = 1, jpkm1
244                  DO jj = 1, jpj
[2528]245                     DO ji = 1, jpi
[11050]246                        puu(ji,jj,jk,Kmm) = puu(ji,jj,jk,Kmm) + atfp * ( puu(ji,jj,jk,Kbb) - 2._wp * puu(ji,jj,jk,Kmm) + puu(ji,jj,jk,Kaa) )
247                        pvv(ji,jj,jk,Kmm) = pvv(ji,jj,jk,Kmm) + atfp * ( pvv(ji,jj,jk,Kbb) - 2._wp * pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk,Kaa) )
[2528]248                     END DO
249                  END DO
250               END DO
251               !
[6140]252            ELSE                          ! Asselin filter applied on thickness weighted velocity
253               !
[9019]254               ALLOCATE( ze3u_f(jpi,jpj,jpk) , ze3v_f(jpi,jpj,jpk) )
[11050]255               ! Now filtered scale factor at (u/v)-points stored in ze3u_f, ze3v_f
256               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), ze3u_f, 'U' )
257               CALL dom_vvl_interpol( pe3t(:,:,:,Kmm), ze3v_f, 'V' )
[4292]258               DO jk = 1, jpkm1
259                  DO jj = 1, jpj
[4312]260                     DO ji = 1, jpi                 
[11050]261                        zue3a = pe3u(ji,jj,jk,Kaa) * puu(ji,jj,jk,Kaa)
262                        zve3a = pe3v(ji,jj,jk,Kaa) * pvv(ji,jj,jk,Kaa)
263                        zue3n = pe3u(ji,jj,jk,Kmm) * puu(ji,jj,jk,Kmm)
264                        zve3n = pe3v(ji,jj,jk,Kmm) * pvv(ji,jj,jk,Kmm)
265                        zue3b = pe3u(ji,jj,jk,Kbb) * puu(ji,jj,jk,Kbb)
266                        zve3b = pe3v(ji,jj,jk,Kbb) * pvv(ji,jj,jk,Kbb)
[2528]267                        !
[11050]268                        puu(ji,jj,jk,Kmm) = ( zue3n + atfp * ( zue3b - 2._wp * zue3n  + zue3a ) ) / ze3u_f(ji,jj,jk)
269                        pvv(ji,jj,jk,Kmm) = ( zve3n + atfp * ( zve3b - 2._wp * zve3n  + zve3a ) ) / ze3v_f(ji,jj,jk)
[2528]270                     END DO
271                  END DO
272               END DO
[11050]273               pe3u(:,:,1:jpkm1,Kmm) = ze3u_f(:,:,1:jpkm1) 
274               pe3v(:,:,1:jpkm1,Kmm) = ze3v_f(:,:,1:jpkm1)
[6140]275               !
[9019]276               DEALLOCATE( ze3u_f , ze3v_f )
[2528]277            ENDIF
278            !
[11050]279            DEALLOCATE( ze3t_f )
[3]280         ENDIF
[2528]281         !
[6140]282         IF( ln_dynspg_ts .AND. ln_bt_fw ) THEN
[11050]283            ! Revert filtered "now" velocities to time split estimate
[4312]284            ! Doing it here also means that asselin filter contribution is removed 
[11050]285            zue(:,:) = pe3u(:,:,1,Kmm) * puu(:,:,1,Kmm) * umask(:,:,1)
286            zve(:,:) = pe3v(:,:,1,Kmm) * pvv(:,:,1,Kmm) * vmask(:,:,1)   
[4990]287            DO jk = 2, jpkm1
[11050]288               zue(:,:) = zue(:,:) + pe3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) * umask(:,:,jk)
289               zve(:,:) = zve(:,:) + pe3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) * vmask(:,:,jk)   
[4370]290            END DO
291            DO jk = 1, jpkm1
[11050]292               puu(:,:,jk,Kmm) = puu(:,:,jk,Kmm) - (zue(:,:) * r1_hu(:,:,Kmm) - uu_b(:,:,Kmm)) * umask(:,:,jk)
293               pvv(:,:,jk,Kmm) = pvv(:,:,jk,Kmm) - (zve(:,:) * r1_hv(:,:,Kmm) - vv_b(:,:,Kmm)) * vmask(:,:,jk)
[4292]294            END DO
295         ENDIF
296         !
[11050]297      ENDIF ! neuler /= 0
[4354]298      !
299      ! Set "now" and "before" barotropic velocities for next time step:
300      ! JC: Would be more clever to swap variables than to make a full vertical
301      ! integration
302      !
[6140]303      IF(.NOT.ln_linssh ) THEN
[11050]304         hu(:,:,Kmm) = pe3u(:,:,1,Kmm ) * umask(:,:,1)
305         hv(:,:,Kmm) = pe3v(:,:,1,Kmm ) * vmask(:,:,1)
[6140]306         DO jk = 2, jpkm1
[11050]307            hu(:,:,Kmm) = hu(:,:,Kmm) + pe3u(:,:,jk,Kmm ) * umask(:,:,jk)
308            hv(:,:,Kmm) = hv(:,:,Kmm) + pe3v(:,:,jk,Kmm ) * vmask(:,:,jk)
[4354]309         END DO
[11050]310         r1_hu(:,:,Kmm) = ssumask(:,:) / ( hu(:,:,Kmm) + 1._wp - ssumask(:,:) )
311         r1_hv(:,:,Kmm) = ssvmask(:,:) / ( hv(:,:,Kmm) + 1._wp - ssvmask(:,:) )
[4354]312      ENDIF
313      !
[11050]314      uu_b(:,:,Kaa) = pe3u(:,:,1,Kaa) * puu(:,:,1,Kaa) * umask(:,:,1)
315      uu_b(:,:,Kmm) = pe3u(:,:,1,Kmm) * puu(:,:,1,Kmm) * umask(:,:,1)
316      vv_b(:,:,Kaa) = pe3v(:,:,1,Kaa) * pvv(:,:,1,Kaa) * vmask(:,:,1)
317      vv_b(:,:,Kmm) = pe3v(:,:,1,Kmm) * pvv(:,:,1,Kmm) * vmask(:,:,1)
[6140]318      DO jk = 2, jpkm1
[11050]319         uu_b(:,:,Kaa) = uu_b(:,:,Kaa) + pe3u(:,:,jk,Kaa) * puu(:,:,jk,Kaa) * umask(:,:,jk)
320         uu_b(:,:,Kmm) = uu_b(:,:,Kmm) + pe3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) * umask(:,:,jk)
321         vv_b(:,:,Kaa) = vv_b(:,:,Kaa) + pe3v(:,:,jk,Kaa) * pvv(:,:,jk,Kaa) * vmask(:,:,jk)
322         vv_b(:,:,Kmm) = vv_b(:,:,Kmm) + pe3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) * vmask(:,:,jk)
[4354]323      END DO
[11050]324      uu_b(:,:,Kaa) = uu_b(:,:,Kaa) * r1_hu(:,:,Kaa)
325      vv_b(:,:,Kaa) = vv_b(:,:,Kaa) * r1_hv(:,:,Kaa)
326      uu_b(:,:,Kmm) = uu_b(:,:,Kmm) * r1_hu(:,:,Kmm)
327      vv_b(:,:,Kmm) = vv_b(:,:,Kmm) * r1_hv(:,:,Kmm)
[4354]328      !
[6140]329      IF( .NOT.ln_dynspg_ts ) THEN        ! output the barotropic currents
[11050]330         CALL iom_put(  "ubar", uu_b(:,:,Kmm) )
331         CALL iom_put(  "vbar", vv_b(:,:,Kmm) )
[6140]332      ENDIF
[4990]333      IF( l_trddyn ) THEN                ! 3D output: asselin filter trends on momentum
[11050]334         zua(:,:,:) = ( puu(:,:,:,Kmm) - zua(:,:,:) ) * z1_2dt
335         zva(:,:,:) = ( pvv(:,:,:,Kmm) - zva(:,:,:) ) * z1_2dt
[10946]336         CALL trd_dyn( zua, zva, jpdyn_atf, kt, Kmm )
[4990]337      ENDIF
338      !
[11050]339      IF(ln_ctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Kaa), clinfo1=' nxt  - puu(:,:,:,Kaa): ', mask1=umask,   &
340         &                       tab3d_2=pvv(:,:,:,Kaa), clinfo2=' pvv(:,:,:,Kaa): '       , mask2=vmask )
[6140]341      !
[9019]342      IF( ln_dynspg_ts )   DEALLOCATE( zue, zve )
343      IF( l_trddyn     )   DEALLOCATE( zua, zva )
[11050]344      IF( ln_timing    )   CALL timing_stop('dyn_atf')
[2715]345      !
[11050]346   END SUBROUTINE dyn_atf
[3]347
[1502]348   !!=========================================================================
[11050]349END MODULE dynatf
Note: See TracBrowser for help on using the repository browser.