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

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

CT : UPDATE151 : New trends organization

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