source: trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynldf_lap.F90 @ 3294

Last change on this file since 3294 was 3294, checked in by rblod, 9 years ago

Merge of 3.4beta into the trunk

  • Property svn:keywords set to Id
File size: 5.2 KB
Line 
1MODULE dynldf_lap
2   !!======================================================================
3   !!                       ***  MODULE  dynldf_lap  ***
4   !! Ocean dynamics:  lateral viscosity trend
5   !!======================================================================
6   !! History :  OPA  ! 1990-09 (G. Madec) Original code
7   !!            4.0  ! 1991-11 (G. Madec)
8   !!            6.0  ! 1996-01 (G. Madec) statement function for e3 and ahm
9   !!   NEMO     1.0  ! 2002-06 (G. Madec)  F90: Free form and module
10   !!             -   ! 2004-08 (C. Talandier) New trends organization
11   !!----------------------------------------------------------------------
12
13   !!----------------------------------------------------------------------
14   !!   dyn_ldf_lap  : update the momentum trend with the lateral diffusion
15   !!                  using an iso-level harmonic operator
16   !!----------------------------------------------------------------------
17   USE oce             ! ocean dynamics and tracers
18   USE dom_oce         ! ocean space and time domain
19   USE ldfdyn_oce      ! ocean dynamics: lateral physics
20   USE zdf_oce         ! ocean vertical physics
21   USE in_out_manager  ! I/O manager
22   USE trdmod          ! ocean dynamics trends
23   USE trdmod_oce      ! ocean variables trends
24   USE ldfslp          ! iso-neutral slopes
25   USE timing          ! Timing
26
27   IMPLICIT NONE
28   PRIVATE
29
30   PUBLIC dyn_ldf_lap  ! called by step.F90
31
32   !! * Substitutions
33#  include "domzgr_substitute.h90"
34#  include "ldfdyn_substitute.h90"
35#  include "vectopt_loop_substitute.h90"
36   !!----------------------------------------------------------------------
37   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
38   !! $Id$
39   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
40   !!----------------------------------------------------------------------
41CONTAINS
42
43   SUBROUTINE dyn_ldf_lap( kt )
44      !!----------------------------------------------------------------------
45      !!                     ***  ROUTINE dyn_ldf_lap  ***
46      !!                       
47      !! ** Purpose :   Compute the before horizontal tracer (t & s) diffusive
48      !!      trend and add it to the general trend of tracer equation.
49      !!
50      !! ** Method  :   The before horizontal momentum diffusion trend is an
51      !!      harmonic operator (laplacian type) which separates the divergent
52      !!      and rotational parts of the flow.
53      !!      Its horizontal components are computed as follow:
54      !!         difu = 1/e1u di[ahmt hdivb] - 1/(e2u*e3u) dj-1[e3f ahmf rotb]
55      !!         difv = 1/e2v dj[ahmt hdivb] + 1/(e1v*e3v) di-1[e3f ahmf rotb]
56      !!      in the rotational part of the diffusion.
57      !!      Add this before trend to the general trend (ua,va):
58      !!            (ua,va) = (ua,va) + (diffu,diffv)
59      !!      'key_trddyn' activated: the two components of the horizontal
60      !!                                 diffusion trend are saved.
61      !!
62      !! ** Action : - Update (ua,va) with the before iso-level harmonic
63      !!               mixing trend.
64      !!----------------------------------------------------------------------
65      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index
66      !
67      INTEGER  ::   ji, jj, jk             ! dummy loop indices
68      REAL(wp) ::   zua, zva, ze2u, ze1v   ! local scalars
69      !!----------------------------------------------------------------------
70      !
71      IF( nn_timing == 1 )  CALL timing_start('dyn_ldf_lap')
72      !
73      IF( kt == nit000 ) THEN
74         IF(lwp) WRITE(numout,*)
75         IF(lwp) WRITE(numout,*) 'dyn_ldf : iso-level harmonic (laplacian) operator'
76         IF(lwp) WRITE(numout,*) '~~~~~~~ '
77      ENDIF
78      !                                                ! ===============
79      DO jk = 1, jpkm1                                 ! Horizontal slab
80         !                                             ! ===============
81         DO jj = 2, jpjm1
82            DO ji = fs_2, fs_jpim1   ! vector opt.
83               ze2u = rotb (ji,jj,jk) * fsahmf(ji,jj,jk) * fse3f(ji,jj,jk)
84               ze1v = hdivb(ji,jj,jk) * fsahmt(ji,jj,jk)
85               ! horizontal diffusive trends
86               zua = - ( ze2u - rotb (ji,jj-1,jk)*fsahmf(ji,jj-1,jk)*fse3f(ji,jj-1,jk) ) / ( e2u(ji,jj) * fse3u(ji,jj,jk) )   &
87                     + ( hdivb(ji+1,jj,jk)*fsahmt(ji+1,jj,jk) - ze1v                   ) / e1u(ji,jj)
88
89               zva = + ( ze2u - rotb (ji-1,jj,jk)*fsahmf(ji-1,jj,jk)*fse3f(ji-1,jj,jk) ) / ( e1v(ji,jj) * fse3v(ji,jj,jk) )   &
90                     + ( hdivb(ji,jj+1,jk)*fsahmt(ji,jj+1,jk) - ze1v                   ) / e2v(ji,jj)
91
92               ! add it to the general momentum trends
93               ua(ji,jj,jk) = ua(ji,jj,jk) + zua
94               va(ji,jj,jk) = va(ji,jj,jk) + zva
95            END DO
96         END DO
97         !                                             ! ===============
98      END DO                                           !   End of slab
99      !                                                ! ===============
100      IF( nn_timing == 1 )  CALL timing_stop('dyn_ldf_lap')
101      !
102   END SUBROUTINE dyn_ldf_lap
103
104   !!======================================================================
105END MODULE dynldf_lap
Note: See TracBrowser for help on using the repository browser.