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