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/2012/dev_r3604_LEGI8_TAM/NEMOGCM/NEMO/OPATAM_SRC/DYN – NEMO

source: branches/2012/dev_r3604_LEGI8_TAM/NEMOGCM/NEMO/OPATAM_SRC/DYN/dynkeg_tam.F90 @ 3611

Last change on this file since 3611 was 3611, checked in by pabouttier, 11 years ago

Add TAM code and ORCA2_TAM configuration - see Ticket #1007

  • Property svn:executable set to *
File size: 8.2 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   !!      NEMO  3.4  !  12-07  (P.-A. Bouttier) Phasing with 3.4
14   !!----------------------------------------------------------------------
15   !!----------------------------------------------------------------------
16   !!   dyn_keg_tan  : update the momentum trend with the horizontal tke
17   !!   dyn_keg_adj  : update the momentum trend with the horizontal tke
18   !!----------------------------------------------------------------------
19   USE par_oce
20   USE oce
21   USE dom_oce
22   USE in_out_manager
23   USE oce_tam
24   USE lib_mpp         ! MPP library
25   USE wrk_nemo        ! Memory Allocation
26   USE timing
27
28   IMPLICIT NONE
29   PRIVATE
30
31   PUBLIC   dyn_keg_tan ! routine called by step_tam module
32   PUBLIC   dyn_keg_adj ! routine called by step_tam module
33
34   !! * Substitutions
35#  include "vectopt_loop_substitute.h90"
36
37CONTAINS
38
39   SUBROUTINE dyn_keg_tan( kt )
40      !!----------------------------------------------------------------------
41      !!                  ***  ROUTINE dyn_keg_tan  ***
42      !!
43      !! ** Purpose of the direct routine:
44      !!      Compute the now momentum trend due to the horizontal
45      !!      gradient of the horizontal kinetic energy and add it to the
46      !!      general momentum trend.
47      !!
48      !! ** Method of the direct routine:
49      !!      Compute the now horizontal kinetic energy
50      !!         zhke = 1/2 [ mi-1( un^2 ) + mj-1( vn^2 ) ]
51      !!      Take its horizontal gradient and add it to the general momentum
52      !!      trend (ua,va).
53      !!         ua = ua - 1/e1u di[ zhke ]
54      !!         va = va - 1/e2v dj[ zhke ]
55      !!
56      !! ** Action : - Update the (ua_tl, va_tl) with the hor. ke gradient trend
57      !!----------------------------------------------------------------------
58      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index
59      !!
60      INTEGER  ::   ji, jj, jk   ! dummy loop indices
61      REAL(wp) ::   zutl, zvtl   ! temporary scalars
62      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zhketl   ! temporary 3D workspace
63      !!----------------------------------------------------------------------
64      !
65      IF( nn_timing == 1 )  CALL timing_start('dyn_keg_tan')
66      !
67      CALL wrk_alloc( jpi, jpj, jpk, zhketl )
68      !
69      IF( kt == nit000 ) THEN
70         IF(lwp) WRITE(numout,*)
71         IF(lwp) WRITE(numout,*) 'dyn_keg_tan : kinetic energy gradient trend'
72         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
73      ENDIF
74      !                                                ! ===============
75      DO jk = 1, jpkm1                                 ! Horizontal slab
76         !                                             ! ===============
77         DO jj = 2, jpj         ! Horizontal kinetic energy at T-point
78            DO ji = fs_2, jpi   ! vector opt.
79               zutl = 0.5_wp * ( un_tl(ji-1,jj  ,jk) * un(ji-1,jj  ,jk)   &
80                  &            + un_tl(ji  ,jj  ,jk) * un(ji  ,jj  ,jk)  )
81               zvtl = 0.5_wp * ( vn_tl(ji  ,jj-1,jk) * vn(ji  ,jj-1,jk)   &
82                  &            + vn_tl(ji  ,jj  ,jk) * vn(ji  ,jj  ,jk)  )
83               zhketl(ji,jj,jk) = zvtl + zutl
84            END DO
85         END DO
86         DO jj = 2, jpjm1       ! add the gradient of kinetic energy to the general momentum trends
87            DO ji = fs_2, fs_jpim1   ! vector opt.
88               ua_tl(ji,jj,jk) = ua_tl(ji,jj,jk) - ( zhketl(ji+1,jj  ,jk) - zhketl(ji,jj,jk) ) / e1u(ji,jj)
89               va_tl(ji,jj,jk) = va_tl(ji,jj,jk) - ( zhketl(ji  ,jj+1,jk) - zhketl(ji,jj,jk) ) / e2v(ji,jj)
90            END DO
91         END DO
92         !                                             ! ===============
93      END DO                                           !   End of slab
94      !                                                ! ===============
95      CALL wrk_dealloc( jpi, jpj, jpk, zhketl )
96      !
97      IF( nn_timing == 1 )  CALL timing_stop('dyn_keg_tan')
98      !
99   END SUBROUTINE dyn_keg_tan
100
101   SUBROUTINE dyn_keg_adj( kt )
102      !!----------------------------------------------------------------------
103      !!                  ***  ROUTINE dyn_keg_adj  ***
104      !!
105      !! ** Purpose of the direct routine:
106      !!      Compute the now momentum trend due to the horizontal
107      !!      gradient of the horizontal kinetic energy and add it to the
108      !!      general momentum trend.
109      !!
110      !! ** Method of the direct routine:
111      !!      Compute the now horizontal kinetic energy
112      !!         zhke = 1/2 [ mi-1( un^2 ) + mj-1( vn^2 ) ]
113      !!      Take its horizontal gradient and add it to the general momentum
114      !!      trend (ua,va).
115      !!         ua = ua - 1/e1u di[ zhke ]
116      !!         va = va - 1/e2v dj[ zhke ]
117      !!
118      !! ** Action : - Update the (ua_ad, va_ad) with the hor. ke gradient trend
119      !!----------------------------------------------------------------------
120      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index
121      !!
122      INTEGER  ::   ji, jj, jk   ! dummy loop indices
123      REAL(wp) ::   zuad, zvad   ! temporary scalars
124      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zhkead   ! temporary 3D workspace
125      !!----------------------------------------------------------------------
126      IF( nn_timing == 1 )  CALL timing_start('dyn_keg_adj')
127      !
128      CALL wrk_alloc( jpi, jpj, jpk, zhkead )
129      !
130      IF( kt == nitend ) THEN
131         IF(lwp) WRITE(numout,*)
132         IF(lwp) WRITE(numout,*) 'dyn_keg_adj : kinetic energy gradient trend'
133         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
134      ENDIF
135      zhkead(:,:,:) = 0.0_wp ; zuad = 0.0_wp ; zvad = 0.0_wp
136      !                                                ! ===============
137      DO jk = jpkm1, 1, -1                             ! Horizontal slab
138         !                                             ! ===============
139         DO jj =  jpjm1, 2, -1 ! add the gradient of kinetic energy to the general momentum trends
140            DO ji = fs_jpim1, fs_2, -1 ! vector opt.
141               zhkead(ji  ,jj+1,jk) = zhkead(ji  ,jj+1,jk)              &
142                  &                  - va_ad(ji  ,jj  ,jk) / e2v(ji,jj)
143               zhkead(ji  ,jj  ,jk) = zhkead(ji  ,jj  ,jk)              &
144                  &                  + va_ad(ji  ,jj  ,jk) / e2v(ji,jj)
145               zhkead(ji+1,jj  ,jk) = zhkead(ji+1,jj  ,jk) &
146                  &                  - ua_ad(ji  ,jj  ,jk) / e1u(ji,jj)
147               zhkead(ji  ,jj  ,jk) = zhkead(ji  ,jj  ,jk)              &
148                  &                  + ua_ad(ji  ,jj  ,jk) / e1u(ji,jj)
149            END DO
150         END DO
151         DO jj = jpj, 2, -1         ! Horizontal kinetic energy at T-point
152            DO ji = jpi, fs_2, -1   ! vector opt.
153               zuad = zhkead(ji,jj,jk)
154               zvad = zhkead(ji,jj,jk)
155               zhkead(ji,jj,jk) = 0.0_wp
156
157               vn_ad(ji  ,jj-1,jk) = vn_ad(ji  ,jj-1,jk) + zvad * vn(ji  ,jj-1,jk) * 0.5_wp
158               vn_ad(ji  ,jj  ,jk) = vn_ad(ji  ,jj  ,jk) + zvad * vn(ji  ,jj  ,jk) * 0.5_wp
159               un_ad(ji-1,jj  ,jk) = un_ad(ji-1,jj  ,jk) + zuad * un(ji-1,jj  ,jk) * 0.5_wp
160               un_ad(ji  ,jj  ,jk) = un_ad(ji  ,jj  ,jk) + zuad * un(ji  ,jj  ,jk) * 0.5_wp
161            END DO
162         END DO
163         !                                             ! ===============
164      END DO                                           !   End of slab
165      !                                                ! ===============
166      CALL wrk_dealloc( jpi, jpj, jpk, zhkead )
167      !
168      IF( nn_timing == 1 )  CALL timing_stop('dyn_keg_adj')
169      !
170   END SUBROUTINE dyn_keg_adj
171   SUBROUTINE dyn_keg_adj_tst( kumadt )
172      INTEGER, INTENT(IN) :: &
173         & kumadt             ! Output unit
174      ! done in dynadv_tam
175   END SUBROUTINE dyn_keg_adj_tst
176#endif
177END MODULE dynkeg_tam
Note: See TracBrowser for help on using the repository browser.