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

source: trunk/NEMO/OPA_SRC/DYN/dynldf_lap.F90 @ 106

Last change on this file since 106 was 106, checked in by opalod, 20 years ago

CT : UPDATE067 : Add control indices nictl, njctl used in SUM function output to compare mono versus multi procs runs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.2 KB
Line 
1MODULE dynldf_lap
2   !!======================================================================
3   !!                       ***  MODULE  dynldf_lap  ***
4   !! Ocean dynamics:  lateral viscosity trend
5   !!======================================================================
6
7   !!----------------------------------------------------------------------
8   !!   dyn_ldf_lap  : update the momentum trend with the lateral diffusion
9   !!                  using an iso-level harmonic operator
10   !!----------------------------------------------------------------------
11   !! * Modules used
12   USE oce             ! ocean dynamics and tracers
13   USE dom_oce         ! ocean space and time domain
14   USE ldfdyn_oce      ! ocean dynamics: lateral physics
15   USE zdf_oce         ! ocean vertical physics
16   USE in_out_manager  ! I/O manager
17   USE trddyn_oce      ! ocean dynamics trends
18   USE ldfslp          ! iso-neutral slopes
19
20   IMPLICIT NONE
21   PRIVATE
22
23   !! * Routine accessibility
24   PUBLIC dyn_ldf_lap  ! called by step.F90
25
26   !! * Substitutions
27#  include "domzgr_substitute.h90"
28#  include "ldfdyn_substitute.h90"
29#  include "vectopt_loop_substitute.h90"
30   !!----------------------------------------------------------------------
31   !!   OPA 9.0 , LODYC-IPSL  (2003)
32   !!----------------------------------------------------------------------
33
34CONTAINS
35
36   SUBROUTINE dyn_ldf_lap( kt )
37      !!----------------------------------------------------------------------
38      !!                     ***  ROUTINE dyn_ldf_lap  ***
39      !!                       
40      !! ** Purpose :   Compute the before horizontal tracer (t & s) diffusive
41      !!      trend and add it to the general trend of tracer equation.
42      !!
43      !! ** Method  :   The before horizontal momentum diffusion trend is an
44      !!      harmonic operator (laplacian type) which separates the divergent
45      !!      and rotational parts of the flow.
46      !!      Its horizontal components are computed as follow:
47      !!         difu = 1/e1u di[ahmt hdivb] - 1/(e2u*e3u) dj-1[e3f ahmf rotb]
48      !!         difv = 1/e2v dj[ahmt hdivb] + 1/(e1v*e3v) di-1[e3f ahmf rotb]
49      !!      If 'key_s_coord' key is not activated, the vertical scale factor
50      !!      is simplified in the rotational part of the diffusion.
51      !!      Add this before trend to the general trend (ua,va):
52      !!            (ua,va) = (ua,va) + (diffu,diffv)
53      !!      'key_trddyn' activated: the two components of the horizontal
54      !!                                 diffusion trend are saved.
55      !!
56      !! ** Action : - Update (ua,va) with the before iso-level harmonic
57      !!               mixing trend.
58      !!             - Save in (utrd,vtrd) arrays the trends ('key_diatrends')
59      !!
60      !! History :
61      !!        !  90-09 (G. Madec) Original code
62      !!        !  91-11 (G. Madec)
63      !!        !  96-01 (G. Madec) statement function for e3 and ahm
64      !!   8.5  !  02-06  (G. Madec)  F90: Free form and module
65      !!----------------------------------------------------------------------
66      !! * Arguments
67      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index
68
69      !! * Local declarations
70      INTEGER  ::   ji, jj, jk           ! dummy loop indices
71      REAL(wp) ::   &
72         zua, zva, ze2u, ze1v            ! temporary scalars
73      !!----------------------------------------------------------------------
74
75      IF( kt == nit000 ) THEN
76         IF(lwp) WRITE(numout,*)
77         IF(lwp) WRITE(numout,*) 'dyn_ldf : iso-level harmonic (laplacien) operator'
78         IF(lwp) WRITE(numout,*) '~~~~~~~ '
79      ENDIF
80
81      !                                                ! ===============
82      DO jk = 1, jpkm1                                 ! Horizontal slab
83         !                                             ! ===============
84         DO jj = 2, jpjm1
85            DO ji = fs_2, fs_jpim1   ! vector opt.
86#if defined key_s_coord || defined key_partial_steps
87               ze2u = rotb (ji,jj,jk)*fsahmf(ji,jj,jk)*fse3f(ji,jj,jk)
88               ze1v = hdivb(ji,jj,jk)*fsahmt(ji,jj,jk)
89               ! horizontal diffusive trends
90               zua = - ( ze2u - rotb (ji,jj-1,jk)*fsahmf(ji,jj-1,jk)*fse3f(ji,jj-1,jk) ) / ( e2u(ji,jj) * fse3u(ji,jj,jk) )   &
91                     + ( hdivb(ji+1,jj,jk)*fsahmt(ji+1,jj,jk) - ze1v                   ) / e1u(ji,jj)
92
93               zva = + ( ze2u - rotb (ji-1,jj,jk)*fsahmf(ji-1,jj,jk)*fse3f(ji-1,jj,jk) ) / ( e1v(ji,jj) * fse3v(ji,jj,jk) )   &
94                     + ( hdivb(ji,jj+1,jk)*fsahmt(ji,jj+1,jk) - ze1v                   ) / e2v(ji,jj)
95#else
96               ! horizontal diffusive trends
97               ze2u = rotb (ji,jj,jk)*fsahmf(ji,jj,jk)
98               ze1v = hdivb(ji,jj,jk)*fsahmt(ji,jj,jk)
99               zua = - (                ze2u                  - rotb (ji,jj-1,jk)*fsahmf(ji,jj-1,jk) ) / e2u(ji,jj)   &
100                     + ( hdivb(ji+1,jj,jk)*fsahmt(ji+1,jj,jk) -                ze1v                  ) / e1u(ji,jj)
101
102               zva = + (                ze2u                  - rotb (ji-1,jj,jk)*fsahmf(ji-1,jj,jk) ) / e1v(ji,jj)   &
103                     + ( hdivb(ji,jj+1,jk)*fsahmt(ji,jj+1,jk) -                ze1v                  ) / e2v(ji,jj)
104#endif
105
106               ! add it to the general momentum trends
107               ua(ji,jj,jk) = ua(ji,jj,jk) + zua
108               va(ji,jj,jk) = va(ji,jj,jk) + zva
109#if defined key_trddyn
110               ! save the horizontal diffusive trends
111               utrd(ji,jj,jk,5) = zua
112               vtrd(ji,jj,jk,5) = zva
113#endif
114            END DO
115         END DO
116         !                                             ! ===============
117      END DO                                           !   End of slab
118      !                                                ! ===============
119
120      IF(l_ctl) THEN         ! print sum trends (used for debugging)
121         zua = SUM( ua(2:nictl,2:njctl,1:jpkm1) * umask(2:nictl,2:njctl,1:jpkm1) )
122         zva = SUM( va(2:nictl,2:njctl,1:jpkm1) * vmask(2:nictl,2:njctl,1:jpkm1) )
123         WRITE(numout,*) ' ldf  - Ua: ', zua-u_ctl, ' Va: ', zva-v_ctl
124         u_ctl = zua   ;   v_ctl = zva
125      ENDIF
126
127   END SUBROUTINE dyn_ldf_lap
128
129   !!======================================================================
130END MODULE dynldf_lap
Note: See TracBrowser for help on using the repository browser.