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.
dynkeg_tam.F90 in branches/2010_and_older/TAM_V3_2_2/NEMOTAM/OPATAM_SRC/DYN – NEMO

source: branches/2010_and_older/TAM_V3_2_2/NEMOTAM/OPATAM_SRC/DYN/dynkeg_tam.F90 @ 4555

Last change on this file since 4555 was 2578, checked in by rblod, 13 years ago

first import of NEMOTAM 3.2.2

File size: 8.5 KB
Line 
1MODULE dynkeg_tam
2#ifdef key_tam
3   !!===========================================================================
4   !!                       ***  MODULE  dynkeg_tam  ***   
5   !! Ocean dynamics:  kinetic energy gradient trend
6   !!======================================================================
7   !! History of the direct module:
8   !!            1.0  !  87-09  (P. Andrich, m.-a. Foujols)  Original code
9   !!            7.0  !  97-05  (G. Madec)  Split dynber into dynkeg and dynhpg
10   !!            9.0  !  02-07  (G. Madec)  F90: Free form and module
11   !! History of the TAM module:
12   !!            9.0  !  08-08  (A. Vidard) first version
13   !!----------------------------------------------------------------------
14   !!----------------------------------------------------------------------
15   !!   dyn_keg_tan  : update the momentum trend with the horizontal tke
16   !!   dyn_keg_adj  : update the momentum trend with the horizontal tke
17   !!----------------------------------------------------------------------
18   USE par_kind,       ONLY: & ! Precision variables
19      & wp
20   USE par_oce,        ONLY: & ! Ocean space and time domain variables
21      & jpi,                 &
22      & jpj,                 & 
23      & jpk,                 &
24      & jpim1,               &
25      & jpjm1,               &
26      & jpkm1
27   USE oce           , ONLY: & ! ocean dynamics and tracers
28      & un,                  &
29      & vn
30   USE dom_oce       , ONLY: & ! ocean space and time domain
31      & e1u,                 &
32      & e2v
33   USE in_out_manager, ONLY: & ! I/O manager
34      & numout,              &
35      & nit000,              &
36      & nitend,              &
37      & lwp
38   USE oce_tam       , ONLY: & ! tam ocean dynamics and tracers
39      & un_tl,               &
40      & vn_tl,               &
41      & ua_tl,               &
42      & va_tl,               &
43      & un_ad,               &
44      & vn_ad,               &
45      & ua_ad,               &
46      & va_ad
47   IMPLICIT NONE
48   PRIVATE
49
50   PUBLIC   dyn_keg_tan ! routine called by step_tam module
51   PUBLIC   dyn_keg_adj ! routine called by step_tam module
52   
53   !! * Substitutions
54#  include "vectopt_loop_substitute.h90"
55
56CONTAINS
57
58   SUBROUTINE dyn_keg_tan( kt )         
59      !!----------------------------------------------------------------------
60      !!                  ***  ROUTINE dyn_keg_tan  ***
61      !!
62      !! ** Purpose of the direct routine:
63      !!      Compute the now momentum trend due to the horizontal
64      !!      gradient of the horizontal kinetic energy and add it to the
65      !!      general momentum trend.
66      !!
67      !! ** Method of the direct routine:
68      !!      Compute the now horizontal kinetic energy
69      !!         zhke = 1/2 [ mi-1( un^2 ) + mj-1( vn^2 ) ]
70      !!      Take its horizontal gradient and add it to the general momentum
71      !!      trend (ua,va).
72      !!         ua = ua - 1/e1u di[ zhke ]
73      !!         va = va - 1/e2v dj[ zhke ]
74      !!
75      !! ** Action : - Update the (ua_tl, va_tl) with the hor. ke gradient trend
76      !!----------------------------------------------------------------------
77      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index
78      !!
79      INTEGER  ::   ji, jj, jk   ! dummy loop indices
80      REAL(wp) ::   zutl, zvtl   ! temporary scalars
81      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zhketl   ! temporary 3D workspace
82      !!----------------------------------------------------------------------
83      IF( kt == nit000 ) THEN
84         IF(lwp) WRITE(numout,*)
85         IF(lwp) WRITE(numout,*) 'dyn_keg_tan : kinetic energy gradient trend'
86         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
87      ENDIF     
88      !                                                ! ===============
89      DO jk = 1, jpkm1                                 ! Horizontal slab
90         !                                             ! ===============
91         DO jj = 2, jpj         ! Horizontal kinetic energy at T-point
92            DO ji = fs_2, jpi   ! vector opt.
93               zutl = 0.5_wp * ( un_tl(ji-1,jj  ,jk) * un(   ji-1,jj  ,jk)   &
94                  &            + un_tl(ji  ,jj  ,jk) * un(   ji  ,jj  ,jk)  ) 
95               zvtl = 0.5_wp * ( vn_tl(ji  ,jj-1,jk) * vn(   ji  ,jj-1,jk)   &
96                  &            + vn(   ji  ,jj  ,jk) * vn_tl(ji  ,jj  ,jk)  )
97               zhketl(ji,jj,jk) = zvtl + zutl
98            END DO 
99         END DO 
100         DO jj = 2, jpjm1       ! add the gradient of kinetic energy to the general momentum trends
101            DO ji = fs_2, fs_jpim1   ! vector opt.
102               ua_tl(ji,jj,jk) = ua_tl(ji,jj,jk) - ( zhketl(ji+1,jj  ,jk) - zhketl(ji,jj,jk) ) / e1u(ji,jj)
103               va_tl(ji,jj,jk) = va_tl(ji,jj,jk) - ( zhketl(ji  ,jj+1,jk) - zhketl(ji,jj,jk) ) / e2v(ji,jj)
104            END DO
105         END DO
106         !                                             ! ===============
107      END DO                                           !   End of slab
108      !                                                ! ===============
109
110   END SUBROUTINE dyn_keg_tan
111
112   SUBROUTINE dyn_keg_adj( kt )         
113      !!----------------------------------------------------------------------
114      !!                  ***  ROUTINE dyn_keg_adj  ***
115      !!
116      !! ** Purpose of the direct routine:
117      !!      Compute the now momentum trend due to the horizontal
118      !!      gradient of the horizontal kinetic energy and add it to the
119      !!      general momentum trend.
120      !!
121      !! ** Method of the direct routine:
122      !!      Compute the now horizontal kinetic energy
123      !!         zhke = 1/2 [ mi-1( un^2 ) + mj-1( vn^2 ) ]
124      !!      Take its horizontal gradient and add it to the general momentum
125      !!      trend (ua,va).
126      !!         ua = ua - 1/e1u di[ zhke ]
127      !!         va = va - 1/e2v dj[ zhke ]
128      !!
129      !! ** Action : - Update the (ua_ad, va_ad) with the hor. ke gradient trend
130      !!----------------------------------------------------------------------
131      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index
132      !!
133      INTEGER  ::   ji, jj, jk   ! dummy loop indices
134      REAL(wp) ::   zuad, zvad   ! temporary scalars
135      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zhkead   ! temporary 3D workspace
136      !!----------------------------------------------------------------------
137      IF( kt == nitend ) THEN
138         IF(lwp) WRITE(numout,*)
139         IF(lwp) WRITE(numout,*) 'dyn_keg_adj : kinetic energy gradient trend'
140         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
141      ENDIF 
142      zhkead(:,:,:) = 0.0_wp ; zuad = 0.0_wp ; zvad = 0.0_wp
143      !                                                ! ===============
144      DO jk = jpkm1, 1, -1                             ! Horizontal slab
145         !                                             ! ===============
146         DO jj =  jpjm1, 2, -1 ! add the gradient of kinetic energy to the general momentum trends
147            DO ji = fs_jpim1, fs_2, -1 ! vector opt.
148               zhkead(ji  ,jj+1,jk) = zhkead(ji  ,jj+1,jk)              &
149                  &                  - va_ad(ji  ,jj  ,jk) / e2v(ji,jj)
150               zhkead(ji  ,jj  ,jk) = zhkead(ji  ,jj  ,jk)              &
151                  &                  + va_ad(ji  ,jj  ,jk) / e2v(ji,jj)
152               zhkead(ji+1,jj  ,jk) = zhkead(ji+1,jj  ,jk) &
153                  &                  - ua_ad(ji  ,jj  ,jk) / e1u(ji,jj)
154               zhkead(ji  ,jj  ,jk) = zhkead(ji  ,jj  ,jk)              &
155                  &                  + ua_ad(ji  ,jj  ,jk) / e1u(ji,jj)
156            END DO
157         END DO
158         DO jj = jpj, 2, -1         ! Horizontal kinetic energy at T-point
159            DO ji = jpi, fs_2, -1   ! vector opt.
160               zuad = zhkead(ji,jj,jk)
161               zvad = zhkead(ji,jj,jk)
162               zhkead(ji,jj,jk) = 0.0_wp
163
164               vn_ad(ji  ,jj-1,jk) = vn_ad(ji  ,jj-1,jk) + zvad * vn(ji  ,jj-1,jk) * 0.5_wp
165               vn_ad(ji  ,jj  ,jk) = vn_ad(ji  ,jj  ,jk) + zvad * vn(ji  ,jj  ,jk) * 0.5_wp
166               un_ad(ji-1,jj  ,jk) = un_ad(ji-1,jj  ,jk) + zuad * un(ji-1,jj  ,jk) * 0.5_wp
167               un_ad(ji  ,jj  ,jk) = un_ad(ji  ,jj  ,jk) + zuad * un(ji  ,jj  ,jk) * 0.5_wp
168            END DO 
169         END DO 
170         !                                             ! ===============
171      END DO                                           !   End of slab
172      !                                                ! ===============
173
174   END SUBROUTINE dyn_keg_adj
175   SUBROUTINE dyn_keg_adj_tst( kumadt )         
176      INTEGER, INTENT(IN) :: &
177         & kumadt             ! Output unit
178      ! done in dynadv_tam
179   END SUBROUTINE dyn_keg_adj_tst
180#endif
181END MODULE dynkeg_tam
Note: See TracBrowser for help on using the repository browser.