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

source: trunk/NEMO/OPA_SRC/LDF/ldfeiv.F90 @ 789

Last change on this file since 789 was 789, checked in by rblod, 16 years ago

Suppress jki routines and associated key_mpp_omp

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.1 KB
Line 
1MODULE ldfeiv
2   !!======================================================================
3   !!                     ***  MODULE  ldfeiv  ***
4   !! Ocean physics:  variable eddy induced velocity coefficients
5   !!======================================================================
6#if   defined key_traldf_eiv   &&   defined key_traldf_c2d
7   !!----------------------------------------------------------------------
8   !!   'key_traldf_eiv'      and                     eddy induced velocity
9   !!   'key_traldf_c2d'                    2D tracer lateral  mixing coef.
10   !!----------------------------------------------------------------------
11   !!   ldf_eiv      : compute the eddy induced velocity coefficients
12   !!----------------------------------------------------------------------
13   !! * Modules used
14   USE oce             ! ocean dynamics and tracers
15   USE dom_oce         ! ocean space and time domain
16   USE ldftra_oce      ! ocean tracer   lateral physics
17   USE phycst          ! physical constants
18   USE ldfslp          ! iso-neutral slopes
19   USE flxrnf          !
20   USE in_out_manager  ! I/O manager
21   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
22   USE prtctl          ! Print control
23
24   IMPLICIT NONE
25   PRIVATE
26   
27   !! * Routine accessibility
28   PUBLIC ldf_eiv               ! routine called by step.F90
29   !!----------------------------------------------------------------------
30   !!  OPA 9.0 , LOCEAN-IPSL (2005)
31   !! $Header$
32   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
33   !!----------------------------------------------------------------------
34   !! * Substitutions
35#  include "domzgr_substitute.h90"
36#  include "vectopt_loop_substitute.h90"
37   !!----------------------------------------------------------------------
38
39CONTAINS
40
41   SUBROUTINE ldf_eiv( kt )
42      !!----------------------------------------------------------------------
43      !!                  ***  ROUTINE ldf_eiv  ***
44      !!
45      !! ** Purpose :   Compute the eddy induced velocity coefficient from the
46      !!      growth rate of baroclinic instability.
47      !!
48      !! ** Method :
49      !!
50      !! ** Action : - uslp(),  : i- and j-slopes of neutral surfaces
51      !!             - vslp()      at u- and v-points, resp.
52      !!             - wslpi(),  : i- and j-slopes of neutral surfaces
53      !!             - wslpj()     at w-points.
54      !!
55      !! History :
56      !!   8.1  !  99-03  (G. Madec, A. Jouzeau)  Original code
57      !!   8.5  !  02-06  (G. Madec)  Free form, F90
58      !!----------------------------------------------------------------------
59      !! * Arguments
60      INTEGER, INTENT( in ) ::   kt     ! ocean time-step inedx
61     
62      !! * Local declarations
63      INTEGER ::   ji, jj, jk           ! dummy loop indices
64      REAL(wp) ::   &
65         zfw, ze3w, zn2, zf20,       &  ! temporary scalars
66         zaht, zaht_min
67      REAL(wp), DIMENSION(jpi,jpj) ::   &
68         zn, zah, zhw, zross            ! workspace
69      !!----------------------------------------------------------------------
70     
71      IF( kt == nit000 ) THEN
72         IF(lwp) WRITE(numout,*)
73         IF(lwp) WRITE(numout,*) 'ldf_eiv : eddy induced velocity coefficients'
74         IF(lwp) WRITE(numout,*) '~~~~~~~'
75      ENDIF
76     
77      ! 0. Local initialization
78      ! -----------------------
79      zn   (:,:) = 0.e0
80      zhw  (:,:) = 5.e0
81      zah  (:,:) = 0.e0
82      zross(:,:) = 0.e0
83
84
85      ! 1. Compute lateral diffusive coefficient
86      ! ----------------------------------------
87
88      DO jk = 1, jpk
89#  if defined key_vectopt_loop 
90!CDIR NOVERRCHK
91         DO ji = 1, jpij   ! vector opt.
92            ! Take the max of N^2 and zero then take the vertical sum
93            ! of the square root of the resulting N^2 ( required to compute
94            ! internal Rossby radius Ro = .5 * sum_jpk(N) / f
95            zn2 = MAX( rn2(ji,1,jk), 0.e0 )
96            zn(ji,1) = zn(ji,1) + SQRT( zn2 ) * fse3w(ji,1,jk)
97            ! Compute elements required for the inverse time scale of baroclinic
98            ! eddies using the isopycnal slopes calculated in ldfslp.F :
99            ! T^-1 = sqrt(m_jpk(N^2*(r1^2+r2^2)*e3w))
100            ze3w = fse3w(ji,1,jk) * tmask(ji,1,jk)
101               zah(ji,1) = zah(ji,1) + zn2   &
102                              * ( wslpi(ji,1,jk) * wslpi(ji,1,jk)    &
103                                + wslpj(ji,1,jk) * wslpj(ji,1,jk) )   &
104                              * ze3w
105            zhw(ji,1) = zhw(ji,1) + ze3w
106         END DO
107#  else
108         DO jj = 2, jpjm1
109!CDIR NOVERRCHK
110            DO ji = 2, jpim1
111               ! Take the max of N^2 and zero then take the vertical sum
112               ! of the square root of the resulting N^2 ( required to compute
113               ! internal Rossby radius Ro = .5 * sum_jpk(N) / f
114               zn2 = MAX( rn2(ji,jj,jk), 0.e0 )
115               zn(ji,jj) = zn(ji,jj) + SQRT( zn2 ) * fse3w(ji,jj,jk)
116               ! Compute elements required for the inverse time scale of baroclinic
117               ! eddies using the isopycnal slopes calculated in ldfslp.F :
118               ! T^-1 = sqrt(m_jpk(N^2*(r1^2+r2^2)*e3w))
119               ze3w = fse3w(ji,jj,jk) * tmask(ji,jj,jk)
120               zah(ji,jj) = zah(ji,jj) + zn2   &
121                              * ( wslpi(ji,jj,jk) * wslpi(ji,jj,jk)    &
122                                + wslpj(ji,jj,jk) * wslpj(ji,jj,jk) )  &
123                              * ze3w
124               zhw(ji,jj) = zhw(ji,jj) + ze3w
125            END DO
126         END DO 
127#  endif
128      END DO
129
130      DO jj = 2, jpjm1
131!CDIR NOVERRCHK
132         DO ji = fs_2, fs_jpim1   ! vector opt.
133            zfw = MAX( ABS( 2. * omega * SIN( rad * gphit(ji,jj) ) ) , 1.e-10 )
134            ! Rossby radius at w-point taken < 40km and  > 2km
135            zross(ji,jj) = MAX( MIN( .4 * zn(ji,jj) / zfw, 40.e3 ), 2.e3 )
136            ! Compute aeiw by multiplying Ro^2 and T^-1
137            aeiw(ji,jj) = zross(ji,jj) * zross(ji,jj) * SQRT( zah(ji,jj) / zhw(ji,jj) ) * tmask(ji,jj,1)
138            IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN   ! ORCA R02
139               ! Take the minimum between aeiw and aeiv0 for depth levels
140               ! lower than 20 (21 in w- point)
141               IF( mbathy(ji,jj) <= 21. ) aeiw(ji,jj) = MIN( aeiw(ji,jj), 1000. )
142            ENDIF
143         END DO
144      END DO
145
146      ! Decrease the coefficient in the tropics (20N-20S)
147      zf20 = 2. * omega * sin( rad * 20. )
148      DO jj = 2, jpjm1
149         DO ji = fs_2, fs_jpim1   ! vector opt.
150            aeiw(ji,jj) = MIN( 1., ABS( ff(ji,jj) / zf20 ) ) * aeiw(ji,jj)
151         END DO
152      END DO
153
154      ! ORCA R05: Take the minimum between aeiw  and aeiv0
155      IF( cp_cfg == "orca" .AND. jp_cfg == 05 ) THEN
156         DO jj = 2, jpjm1
157            DO ji = fs_2, fs_jpim1   ! vector opt.
158               aeiw(ji,jj) = MIN( aeiw(ji,jj), aeiv0 )
159            END DO
160         END DO
161      ENDIF
162
163      ! lateral boundary condition on aeiw
164      CALL lbc_lnk( aeiw, 'W', 1. )
165
166      ! Average the diffusive coefficient at u- v- points
167      DO jj = 2, jpjm1
168         DO ji = fs_2, fs_jpim1   ! vector opt.
169            aeiu(ji,jj) = .5 * ( aeiw(ji,jj) + aeiw(ji+1,jj  ) )
170            aeiv(ji,jj) = .5 * ( aeiw(ji,jj) + aeiw(ji  ,jj+1) )
171         END DO
172      END DO 
173
174      ! lateral boundary condition on aeiu, aeiv
175      CALL lbc_lnk( aeiu, 'U', 1. )
176      CALL lbc_lnk( aeiv, 'V', 1. )
177
178      IF(ln_ctl)   THEN
179         CALL prt_ctl(tab2d_1=aeiu, clinfo1=' eiv  - u: ', ovlap=1)
180         CALL prt_ctl(tab2d_1=aeiv, clinfo1=' eiv  - v: ', ovlap=1)
181      ENDIF
182
183      ! ORCA R05: add a space variation on aht (=aeiv except at the equator and river mouth)
184      IF( cp_cfg == "orca" .AND. jp_cfg == 05 ) THEN
185         zf20     = 2. * omega * SIN( rad * 20. )
186         zaht_min = 100.                              ! minimum value for aht
187         DO jj = 1, jpj
188            DO ji = 1, jpi
189               zaht      = ( 1. -  MIN( 1., ABS( ff(ji,jj) / zf20 ) ) ) * ( aht0 - zaht_min )  &
190                  &      + aht0 * upsrnfh(ji,jj)                          ! enhanced near river mouths
191               ahtu(ji,jj) = MAX( MAX( zaht_min, aeiu(ji,jj) ) + zaht, aht0 )
192               ahtv(ji,jj) = MAX( MAX( zaht_min, aeiv(ji,jj) ) + zaht, aht0 )
193               ahtw(ji,jj) = MAX( MAX( zaht_min, aeiw(ji,jj) ) + zaht, aht0 )
194            END DO
195         END DO
196         IF(ln_ctl) THEN
197            CALL prt_ctl(tab2d_1=ahtu, clinfo1=' aht  - u: ', ovlap=1)
198            CALL prt_ctl(tab2d_1=ahtv, clinfo1=' aht  - v: ', ovlap=1)
199            CALL prt_ctl(tab2d_1=ahtw, clinfo1=' aht  - w: ', ovlap=1)
200         ENDIF
201      ENDIF
202
203      IF( aeiv0 == 0.e0 ) THEN
204         aeiu(:,:) = 0.e0
205         aeiv(:,:) = 0.e0
206         aeiw(:,:) = 0.e0
207      ENDIF
208
209   END SUBROUTINE ldf_eiv
210
211#else
212   !!----------------------------------------------------------------------
213   !!   Default option                                         Dummy module
214   !!----------------------------------------------------------------------
215CONTAINS
216   SUBROUTINE ldf_eiv( kt )       ! Empty routine
217      WRITE(*,*) 'ldf_eiv: You should not have seen this print! error?', kt
218   END SUBROUTINE ldf_eiv
219#endif
220
221   !!======================================================================
222END MODULE ldfeiv
Note: See TracBrowser for help on using the repository browser.