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

source: trunk/NEMO/OPA_SRC/cla_div.F90 @ 3

Last change on this file since 3 was 3, checked in by opalod, 20 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 20.2 KB
Line 
1MODULE cla_div
2   !!==============================================================================
3   !!                    ***  MODULE  cla_div  ***
4   !! Ocean diagnostic variable : specific update of the horizontal divergence
5   !!                             CAUTION: Specific to ORCA_R2
6   !!==============================================================================
7#if defined key_orca_r2
8   !!----------------------------------------------------------------------
9   !!   'key_orca_r2'                                 global ocean model R2
10   !!----------------------------------------------------------------------
11   !!   div_cla      :
12   !!   div_bab_el_mandeb
13   !!   div_gibraltar
14   !!   div_hormuz
15   !!   div_cla_init :
16   !!----------------------------------------------------------------------
17   !! * Modules used
18   USE oce             ! ocean dynamics and tracers
19   USE dom_oce         ! ocean space and time domain
20   USE in_out_manager  ! I/O manager
21   USE ocesbc          ! ocean surface boundary condition (fluxes)
22   USE lib_mpp         ! distributed memory computing library
23   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
24
25   IMPLICIT NONE
26   PRIVATE
27
28   !! * Module variables
29   REAL(wp) :: zempmed, zempred       ! EMP of Mediterranean and Red Sea
30
31   REAL(wp) :: zisw_rs, zbrw_rs, zurw_rs          ! imposed transport at Red Sea
32   REAL(wp) :: zisw_ms, zbrw_ms, zurw_ms, zmrw_ms ! imposed transport at Mediterranean Sea
33   REAL(wp) :: zisw_pg, zbrw_pg                   ! imposed transport at Persic Gulf
34
35   REAL(wp), DIMENSION (jpk) ::   &
36      zu1_rs_i, zu2_rs_i, zu3_rs_i,                   & ! Red Sea velocities
37      zu1_ms_i, zu2_ms_i, zu3_ms_i,                   & ! Mediterranean Sea velocities
38      zu_pg                                             ! Persic Gulf velocities
39   
40   !! * Routine accessibility
41   PUBLIC div_cla     ! routine called by step.F90
42
43   !! * Substitutions
44#  include "domzgr_substitute.h90"
45   !!----------------------------------------------------------------------
46   !!   OPA 9.0 , LODYC-IPSL  (2003)
47   !!----------------------------------------------------------------------
48
49CONTAINS
50
51   SUBROUTINE div_cla ( kt )
52      !!----------------------------------------------------------------------
53      !!                 ***  ROUTINE div_cla  ***
54      !!
55      !! ** Purpose :   update the horizontal divergence of the velocity field
56      !!      for at some straits ( Gibraltar, Bab el Mandeb and Hormuz ).
57      !!
58      !! ** Method  :   With imposed transport at each strait, we compute
59      !!      corresponding velocities and update horizontal divergence.
60      !!        Apply lateral boundary conditions on hdivn through a call
61      !!      to routine lbc_lnk.
62      !!
63      !! ** Action  :   update hdivn array : the now horizontal divergence
64      !!
65      !! History :
66      !!   8.5  !  02-11 (A. Bozec)  Free form, F90
67      !!----------------------------------------------------------------------
68      !! * Arguments
69      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index
70      !!----------------------------------------------------------------------
71
72      ! Correction of the Divergence at some straits
73           
74      IF( kt == nit000 )     CALL div_cla_init    ! Initialization
75
76      CALL div_bab_el_mandeb                        ! New divergence at Bab el Mandeb
77
78      CALL div_gibraltar                            ! New divergence at Gibraltar
79
80      CALL div_hormuz                               ! Hormuz Strait ( persian Gulf)
81
82      ! Lateral boundary conditions on hdivn
83      CALL lbc_lnk( hdivn, 'T', 1. )
84
85   END SUBROUTINE div_cla
86
87   SUBROUTINE div_bab_el_mandeb
88      !!----------------------------------------------------------------------
89      !!                ***  ROUTINE div_bab_el_mandeb  ***
90      !!       
91      !! ** Purpose :   Update  the now horizontal divergence of the velocity
92      !!     field in Bab el Mandeb ( Red Sea strait ).
93      !!
94      !! ** Method  :   Set the velocity field at each side of the strait :
95      !!                                          |
96      !!            |/ \|            N          |\ /|
97      !!            |_|_|______      |          |___|______
98      !!        88  |   |<-       W - - E    88 |   |<-
99      !!        87  |___|______      |       87 |___|->____
100      !!             160 161         S           160 161
101      !!       horizontal view                horizontal view
102      !!          surface                        depth
103      !!      The now divergence is given by :
104      !!       * z-coordinate (default key) and partial steps (key_partial_steps)
105      !!         hdivn = 1/(e1t*e2t) [ di(e2u  un) + dj(e1v  vn) ]
106      !!
107      !! ** History :
108      !!           !         (A. Bozec) Original code
109      !!      8.5  !  02-11  (A. Bozec) F90: Free form and module
110      !!----------------------------------------------------------------------
111      !! * Local declarations
112      INTEGER  :: ji, jj, jk   ! dummy loop indices
113      REAL(wp) :: zsu, zvt, zwei   ! temporary scalar
114      REAL(wp), DIMENSION (jpk) ::  zu1_rs, zu2_rs, zu3_rs
115      !!---------------------------------------------------------------------
116     
117      ! EMP on the Red Sea
118      ! ------------------
119
120      zempred = 0.e0
121      zwei = 0.e0
122      DO jj = mj0(87), mj1(96)
123         DO ji = mi0(148), mi1(160) 
124            zwei    = tmask(ji,jj,1) * e1t(ji,jj) * e2t(ji,jj)
125            zempred = zempred + emp(ji,jj) * zwei
126         END DO
127      END DO
128
129      ! mpp
130# if defined key_mpp
131      CALL mpp_sum( zempred )
132# endif
133
134      ! convert in m3
135      zempred = zempred * 1.e-3         
136
137      ! Velocity profile at each point
138      ! ------------------------------
139
140      zu1_rs(:) = zu1_rs_i(:)
141      zu2_rs(:) = zu2_rs_i(:)
142      zu3_rs(:) = zu3_rs_i(:)
143
144      ! velocity profile at 161,88 North point
145      ! we imposed zisw_rs + EMP above the Red Sea
146      DO jk = 1,  8                                     
147         DO jj = mj0(88), mj1(88) 
148            DO ji = mi0(160), mi1(160) 
149               zu1_rs(jk) = zu1_rs(jk) - ( zempred / 8. ) / ( e2u(ji, jj) * fse3u(ji, jj,jk) )
150            END DO
151         END DO
152      END DO
153
154      ! velocity profile at 160,88 North  point
155      ! we imposed zisw_rs + EMP above the Red Sea
156      DO jk = 1,  10                                     
157         DO jj = mj0(88), mj1(88) 
158            DO ji = mi0(160), mi1(160) 
159               zu3_rs(jk) = zu3_rs(jk) + ( zempred / 10. ) / ( e1v(ji, jj) * fse3v(ji, jj,jk) )
160            END DO
161         END DO
162      END DO
163       
164      ! Divergence at each point of the straits
165      ! ---------------------------------------
166
167      ! compute the new divergence at 161,88
168      DO jk = 1, 21
169         DO jj = mj0(88), mj1(88) 
170            DO ji = mi0(161), mi1(161) 
171               zvt = e1t(ji, jj) * e2t(ji, jj) * fse3t(ji, jj,jk)
172               zsu = e2u(ji-1, jj) * fse3u(ji-1, jj,jk)
173               hdivn(ji, jj  ,jk) = hdivn(ji, jj  ,jk) - ( 1. / zvt ) * zsu * zu1_rs(jk)
174            END DO
175         END DO
176      END DO
177
178      ! compute the new divergence at 161,87
179      DO jk = 1, 21
180         DO jj = mj0(87), mj1(87) 
181            DO ji = mi0(161), mi1(161) 
182               zvt = e1t(ji, jj) * e2t(ji, jj) * fse3t(ji, jj,jk)
183               zsu = e2u(ji-1, jj) * fse3u(ji-1, jj,jk)
184               hdivn(ji, jj,jk) = hdivn(ji, jj,jk) - ( 1. / zvt ) * zsu * zu2_rs(jk)
185            END DO
186         END DO
187      END DO
188
189      ! compute the divergence at 160,89
190      DO jk = 1, 18
191         DO jj = mj0(89), mj1(89) 
192            DO ji = mi0(160), mi1(160) 
193               zvt = e1t(ji, jj) * e2t(ji,jj) * fse3t(ji,jj,jk)
194               zsu = e1v(ji, jj-1) * fse3v(ji, jj-1,jk)
195               hdivn(ji, jj,jk) = hdivn(ji, jj,jk) - ( 1. / zvt ) * zsu * zu3_rs(jk)
196            END DO
197         END DO
198      END DO
199
200   END SUBROUTINE div_bab_el_mandeb
201
202   SUBROUTINE div_gibraltar
203      !! -------------------------------------------------------------------
204      !!                 ***  ROUTINE div_gibraltar  ***
205      !!       
206      !! ** Purpose :   update the now horizontal divergence of the velocity
207      !!     field in Gibraltar.
208      !!
209      !! ** Method :
210      !!          ________________      N        ________________
211      !! 102           |    |->         |           <-|    |<-
212      !! 101      ___->|____|_____   W - - E     ___->|____|_____
213      !!           139   140  141       |         139   140  141
214      !!          horizontal view       S        horizontal view
215      !!            surface                          depth
216      !!      The now divergence is given by :
217      !!         hdivn = 1/(e1t*e2t) [ di(e2u  un) + dj(e1v  vn) ]
218      !!
219      !! ** History :
220      !!           !         (A. Bozec) Original code
221      !!      8.5  !  02-10  (A. Bozec) F90: Free form and module
222      !!---------------------------------------------------------------------
223      !! * Local declarations
224      INTEGER  :: ji, jj, jk   ! dummy loop indices
225      REAL(wp) :: zsu, zvt
226      REAL(wp) :: zwei
227      REAL(wp), DIMENSION (jpk) ::  zu1_ms, zu2_ms, zu3_ms
228      !!---------------------------------------------------------------------
229     
230      ! EMP on the Mediterranean Sea
231      ! ----------------------------
232
233      zempmed = 0.e0
234      zwei = 0.e0
235      DO jj = mj0(96), mj1(110)
236         DO ji = mi0(141),mi1(181)
237            zwei    = tmask(ji,jj,1) * e1t(ji,jj) * e2t(ji,jj)
238            zempmed = zempmed + emp(ji,jj) * zwei
239         END DO
240      END DO
241
242      ! mpp
243# if defined key_mpp
244      CALL mpp_sum( zempmed )
245# endif
246
247      ! minus 2 points in Red Sea and 3 in Atlantic
248      DO jj = mj0(96), mj1(96)
249         DO ji = mi0(148),mi1(148)
250            zempmed = zempmed -  emp(ji  , jj) * tmask(ji  , jj,1) * e1t(ji  , jj) * e2t(ji  , jj)   &
251                              -  emp(ji+1, jj) * tmask(ji+1, jj,1) * e1t(ji+1, jj) * e2t(ji+1, jj)   
252         END DO
253      END DO
254
255      ! convert in m3
256      zempmed = zempmed * 1.e-3
257
258      ! Velocity profile at each point
259      ! ------------------------------
260
261      zu1_ms(:) = zu1_ms_i(:)
262      zu2_ms(:) = zu2_ms_i(:)
263      zu3_ms(:) = zu3_ms_i(:)
264
265      ! velocity profile at 139,101 South point
266      ! we imposed zisw + EMP above the Mediterranean Sea
267      DO jk = 1, 14                     
268         DO jj = mj0(102), mj1(102) 
269            DO ji = mi0(140), mi1(140) 
270               zu1_ms(jk) =  zu1_ms(jk) + ( zempmed / 14. ) / ( e2u(ji-1, jj-1) * fse3u(ji-1, jj-1,jk) ) 
271            END DO
272         END DO
273      END DO
274     
275      ! velocity profile at 141,102  East point
276      ! flux in surface inflow of the Atlantic ocean + EMP   
277      DO  jk = 1, 14                     
278         DO jj = mj0(102), mj1(102) 
279            DO ji = mi0(140), mi1(140) 
280               zu3_ms(jk) = zu3_ms(jk) +  ( zempmed / 14. ) / ( e2u(ji, jj) * fse3u(ji, jj,jk) ) 
281            END DO
282         END DO
283      END DO
284     
285      ! Divergence at each point of the straits
286      ! ---------------------------------------
287
288      ! compute the new divergence at 139,101 South point 
289      DO jk = 1, jpk
290         DO jj = mj0(101), mj1(101) 
291            DO ji = mi0(139), mi1(139) 
292               zvt = e1t(ji, jj) * e2t(ji, jj) * fse3t(ji, jj,jk)
293               zsu = e2u(ji, jj) * fse3u(ji, jj,jk)
294               hdivn(ji, jj,jk) = hdivn(ji, jj,jk) + ( 1. / zvt ) * zsu * zu1_ms(jk) 
295            END DO
296         END DO
297      END DO
298
299      ! compute the new divergence at 139,102 deep North point
300      DO jk = 1, jpk
301         DO jj = mj0(102), mj1(102) 
302            DO ji = mi0(139), mi1(139) 
303               zvt = e1t(ji, jj) * e2t(ji, jj) * fse3t(ji, jj,jk)
304               zsu = e2u(ji, jj) * fse3u(ji, jj,jk)
305               hdivn(ji, jj,jk) = hdivn(ji, jj,jk) + ( 1. / zvt ) * zsu * zu2_ms(jk) 
306            END DO
307         END DO
308      END DO
309
310      ! compute the divergence at 141,102 East point
311      DO jk = 1, jpk
312         DO jj = mj0(102), mj1(102) 
313            DO ji = mi0(141), mi1(141) 
314               zvt = e1t(ji, jj) * e2t(ji, jj) * fse3t(ji, jj,jk)
315               zsu = e2u(ji-1, jj) * fse3u(ji-1, jj,jk)
316               hdivn(ji, jj,jk) = hdivn(ji, jj,jk) - ( 1. / zvt ) * zsu * zu3_ms(jk)
317            END DO
318         END DO
319      END DO
320
321   END SUBROUTINE div_gibraltar
322
323   SUBROUTINE div_hormuz
324      !! -------------------------------------------------------------------
325      !!                   ***  ROUTINE div_hormuz  ***
326      !!             
327      !! ** Purpose :   update the now horizontal divergence of the velocity
328      !!     field in Hormuz ( Persic Gulf strait ) .
329      !!
330      !! ** Method :
331      !!      The now divergence is given by :
332      !!         hdivn = 1/(e1t*e2t) [ di(e2u  un) + dj(e1v  vn) ]
333      !!
334      !! ** History :
335      !!           !         (A. Bozec) Original code
336      !!      8.5  !  02-10  (A. Bozec) F90: Free form and module
337      !!---------------------------------------------------------------------
338      !! * Local declarations
339      INTEGER  :: ji, jj, jk   ! dummy loop indices
340      REAL(wp) :: zsu, zvt     ! temporary scalars
341      !!---------------------------------------------------------------------
342
343      ! New divergence at Hormuz
344      ! ------------------------
345      DO jk = 1, jpk
346         DO jj = mj0(94), mj1(94) 
347            DO ji = mi0(172), mi1(172) 
348               zvt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk)
349               zsu = e2u(ji-1,jj) * fse3u(ji-1,jj,jk)
350               hdivn(ji,jj,jk) = hdivn(ji,jj,jk) - ( 1. / zvt ) * zsu * zu_pg(jk)
351            END DO
352         END DO
353      END DO
354
355   END SUBROUTINE div_hormuz
356
357
358   SUBROUTINE div_cla_init
359      !! -------------------------------------------------------------------
360      !!                   ***  ROUTINE div_cla_init  ***
361      !!           
362      !! ** Purpose :   Initialization of variables at all straits 
363      !!
364      !! ** History :
365      !!           !         (A. Bozec) Original code
366      !!      8.5  !  02-10  (A. Bozec) F90: Free form and module
367      !!---------------------------------------------------------------------
368      !! * Local declarations
369      INTEGER  :: ji, jj, jk   ! dummy loop indices
370      !!---------------------------------------------------------------------
371
372      ! Control print
373      ! -------------
374      IF(lwp) WRITE(numout,*)
375      IF(lwp) WRITE(numout,*) 'divmod_cross_land : cross land advection on divergence '
376      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~~'
377      IF(lwp) WRITE(numout,*) ' '
378
379      ! Initialization at Bab el Mandeb
380      ! -------------------------------
381
382      ! imposed transport
383      zisw_rs = 0.4e6             ! inflow surface water
384      zurw_rs = 0.2e6             ! upper recirculation water
385!Alex      zbrw = 1.2e6        ! bottom  recirculation water
386      zbrw_rs = 0.5e6             ! bottom  recirculation water
387
388      ! initialization of the velocity
389      zu1_rs_i(:) = 0.e0          ! velocity profile at 161,88 South point
390      zu2_rs_i(:) = 0.e0          ! velocity profile at 161,87 North point
391      zu3_rs_i(:) = 0.e0          ! velocity profile at 160,88 East  point
392
393      ! velocity profile at 161,88 North point
394      ! we imposed zisw_rs + EMP above the Red Sea
395      DO jk = 1,  8                                     
396         DO jj = mj0(88), mj1(88) 
397            DO ji = mi0(160), mi1(160) 
398               zu1_rs_i(jk) = -( zisw_rs / 8. ) / ( e2u(ji, jj) * fse3u(ji, jj,jk) )
399            END DO
400         END DO
401      END DO
402
403      ! recirculation water
404      DO jj = mj0(88), mj1(88) 
405         DO ji = mi0(160), mi1(160) 
406            zu1_rs_i(20) =            - zurw_rs   / ( e2u(ji, jj) * fse3u(ji, jj,20) )
407            zu1_rs_i(21) = -( zbrw_rs - zurw_rs ) / ( e2u(ji, jj) * fse3u(ji, jj,21) )
408         END DO
409      END DO
410     
411      ! velocity profile at 161,87 South point
412      DO jj = mj0(88), mj1(88) 
413         DO ji = mi0(160), mi1(160) 
414            zu2_rs_i(21) =  ( zbrw_rs + zisw_rs ) / ( e2u(ji, jj-1 ) * fse3u(ji, jj-1,21) )
415         END DO
416      END DO
417
418      ! velocity profile at 160,88 North  point
419      ! we imposed zisw_rs + EMP above the Red Sea
420      DO jk = 1,  10                                     
421         DO jj = mj0(88), mj1(88) 
422            DO ji = mi0(160), mi1(160) 
423               zu3_rs_i(jk) = ( zisw_rs / 10. ) / ( e1v(ji, jj) * fse3v(ji, jj,jk) )
424            END DO
425         END DO
426      END DO
427
428      ! deeper
429      DO jj = mj0(88), mj1(88) 
430         DO ji = mi0(160), mi1(160) 
431            zu3_rs_i(16)  = - zisw_rs / ( e1v(ji, jj) * fse3v(ji, jj,16) )
432         END DO
433      END DO
434     
435
436      ! Initialization at Gibraltar
437      ! ---------------------------
438
439      ! imposed transport
440      zisw_ms = 0.8e6             ! inflow surface  water
441      zmrw_ms = 0.7e6             ! middle recirculation water
442      zurw_ms = 2.5e6             ! upper  recirculation water
443      zbrw_ms = 3.5e6             ! bottom recirculation water
444
445      ! initialization of the velocity
446      zu1_ms_i(:) = 0.e0          ! velocity profile at 139,101 South point
447      zu2_ms_i(:) = 0.e0          ! velocity profile at 139,102 North point
448      zu3_ms_i(:) = 0.e0          ! velocity profile at 141,102 East  point
449
450      ! velocity profile at 139,101 South point
451      DO jk = 1, 14                     
452         DO jj = mj0(102), mj1(102) 
453            DO ji = mi0(140), mi1(140) 
454               zu1_ms_i(jk) =  ( zisw_ms / 14. ) / ( e2u(ji-1, jj-1) * fse3u(ji-1, jj-1,jk) ) 
455            END DO
456         END DO
457      END DO
458
459      ! recirculation water
460      DO jk = 15, 20                     
461         DO jj = mj0(102), mj1(102) 
462            DO ji = mi0(140), mi1(140) 
463               zu1_ms_i(jk) =  ( zmrw_ms / 6. ) / ( e2u(ji-1, jj-1) * fse3u(ji-1, jj-1,jk) ) 
464            END DO
465         END DO
466      END DO
467
468      DO jj = mj0(102), mj1(102) 
469         DO ji = mi0(140), mi1(140) 
470            zu1_ms_i(21) =  (           zurw_ms ) / ( e2u(ji-1, jj-1) * fse3u(ji-1, jj-1,21) )
471            zu1_ms_i(22) =  ( zbrw_ms - zurw_ms ) / ( e2u(ji-1, jj-1) * fse3u(ji-1, jj-1,22) )
472         END DO
473      END DO
474     
475      ! velocity profile at 139,102 North point
476      DO jk = 15, 20                     
477         DO jj = mj0(102), mj1(102) 
478            DO ji = mi0(140), mi1(140) 
479               zu2_ms_i(jk) = -( zmrw_ms / 6. ) / ( e2u(ji-1, jj) * fse3u(ji-1, jj,jk) ) 
480            END DO
481         END DO
482      END DO
483
484      ! outflow of Mediterranean sea + recirculation
485      DO jj = mj0(102), mj1(102) 
486         DO ji = mi0(140), mi1(140) 
487            zu2_ms_i(22) = -( zisw_ms + zbrw_ms ) / ( e2u(ji-1, jj) * fse3u(ji-1, jj,22) )
488         END DO
489      END DO
490     
491      ! velocity profile at 141,102  East point
492      ! flux in surface inflow of the Atlantic ocean   
493      DO  jk = 1, 14                     
494         DO jj = mj0(102), mj1(102) 
495            DO ji = mi0(140), mi1(140) 
496               zu3_ms_i(jk) =  ( zisw_ms / 14. ) / ( e2u(ji, jj) * fse3u(ji, jj,jk) ) 
497            END DO
498         END DO
499      END DO
500
501      ! deeper
502      DO jj = mj0(102), mj1(102) 
503         DO ji = mi0(140), mi1(140) 
504            zu3_ms_i(21) = - zisw_ms / ( e2u(ji, jj) * fse3u(ji, jj,21) )
505         END DO
506      END DO
507
508      ! Initialization at Hormuz
509      ! ------------------------
510
511      ! imposed transport
512      zisw_pg = 4. * 0.25e6       ! inflow surface  water
513      zbrw_pg = 4. * 0.25e6       ! bottom recirculation water
514
515      ! initialization of the velocity
516      zu_pg(:) = 0.e0           ! velocity profile at 172,94
517
518      ! velocity profile
519      DO jk = 1, 8 
520         DO jj = mj0(94), mj1(94) 
521            DO ji = mi0(172), mi1(172) 
522               zu_pg(jk) = -( zisw_pg / 8. ) / ( e2u(ji-1,jj) * fse3u(ji-1,jj, jk) )
523            END DO
524         END DO
525      END DO
526
527      DO jk = 16, 18
528         DO jj = mj0(94), mj1(94) 
529            DO ji = mi0(172), mi1(172) 
530               zu_pg(jk) =  ( zbrw_pg / 3. ) / ( e2u(ji-1,jj) * fse3u(ji-1,jj, jk) )
531            END DO
532         END DO
533      END DO
534
535   END SUBROUTINE div_cla_init
536#else
537   !!----------------------------------------------------------------------
538   !!   Default key                                            Empty module
539   !!----------------------------------------------------------------------
540CONTAINS
541   SUBROUTINE div_cla( kt )
542      WRITE(*,*) kt                         ! suppress compilation warning
543   END SUBROUTINE div_cla
544#endif
545   
546   !!======================================================================
547END MODULE cla_div
Note: See TracBrowser for help on using the repository browser.