MODULE cla_div !!============================================================================== !! *** MODULE cla_div *** !! Ocean diagnostic variable : specific update of the horizontal divergence !! CAUTION: Specific to ORCA_R2 !!============================================================================== #if defined key_orca_r2 !!---------------------------------------------------------------------- !! 'key_orca_r2' global ocean model R2 !!---------------------------------------------------------------------- !! div_cla : !! div_bab_el_mandeb !! div_gibraltar !! div_hormuz !! div_cla_init : !!---------------------------------------------------------------------- !! * Modules used USE oce ! ocean dynamics and tracers USE dom_oce ! ocean space and time domain USE sbc_oce ! surface boundary condition: ocean USE in_out_manager ! I/O manager USE lib_mpp ! distributed memory computing library USE lbclnk ! ocean lateral boundary conditions (or mpp link) IMPLICIT NONE PRIVATE !! * Module variables REAL(wp) :: zempmed, zempred ! EMP of Mediterranean and Red Sea REAL(wp) :: zisw_rs, zbrw_rs, zurw_rs ! imposed transport at Red Sea REAL(wp) :: zisw_ms, zbrw_ms, zurw_ms, zmrw_ms ! imposed transport at Mediterranean Sea REAL(wp) :: zisw_pg, zbrw_pg ! imposed transport at Persic Gulf REAL(wp), DIMENSION (jpk) :: & zu1_rs_i, zu2_rs_i, zu3_rs_i, & ! Red Sea velocities zu1_ms_i, zu2_ms_i, zu3_ms_i, & ! Mediterranean Sea velocities zu_pg ! Persic Gulf velocities !! * Routine accessibility PUBLIC div_cla ! routine called by step.F90 !! * Substitutions # include "domzgr_substitute.h90" !!---------------------------------------------------------------------- !! OPA 9.0 , LOCEAN-IPSL (2005) !! $Id$ !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt !!---------------------------------------------------------------------- CONTAINS SUBROUTINE div_cla ( kt ) !!---------------------------------------------------------------------- !! *** ROUTINE div_cla *** !! !! ** Purpose : update the horizontal divergence of the velocity field !! for at some straits ( Gibraltar, Bab el Mandeb and Hormuz ). !! !! ** Method : With imposed transport at each strait, we compute !! corresponding velocities and update horizontal divergence. !! Apply lateral boundary conditions on hdivn through a call !! to routine lbc_lnk. !! !! ** Action : update hdivn array : the now horizontal divergence !! !! History : !! 8.5 ! 02-11 (A. Bozec) Free form, F90 !!---------------------------------------------------------------------- !! * Arguments INTEGER, INTENT( in ) :: kt ! ocean time-step index !!---------------------------------------------------------------------- ! Correction of the Divergence at some straits IF( kt == nit000 ) CALL div_cla_init ! Initialization CALL div_bab_el_mandeb ! New divergence at Bab el Mandeb CALL div_gibraltar ! New divergence at Gibraltar CALL div_hormuz ! Hormuz Strait ( persian Gulf) ! Lateral boundary conditions on hdivn CALL lbc_lnk( hdivn, 'T', 1. ) END SUBROUTINE div_cla SUBROUTINE div_bab_el_mandeb !!---------------------------------------------------------------------- !! *** ROUTINE div_bab_el_mandeb *** !! !! ** Purpose : Update the now horizontal divergence of the velocity !! field in Bab el Mandeb ( Red Sea strait ). !! !! ** Method : Set the velocity field at each side of the strait : !! | !! |/ \| N |\ /| !! |_|_|______ | |___|______ !! 88 | |<- W - - E 88 | |<- !! 87 |___|______ | 87 |___|->____ !! 160 161 S 160 161 !! horizontal view horizontal view !! surface depth !! The now divergence is given by : !! hdivn = 1/(e1t*e2t) [ di(e2u un) + dj(e1v vn) ] !! !! ** History : !! ! (A. Bozec) Original code !! 8.5 ! 02-11 (A. Bozec) F90: Free form and module !!---------------------------------------------------------------------- !! * Local declarations INTEGER :: ji, jj, jk ! dummy loop indices REAL(wp) :: zsu, zvt, zwei ! temporary scalar REAL(wp), DIMENSION (jpk) :: zu1_rs, zu2_rs, zu3_rs !!--------------------------------------------------------------------- ! EMP on the Red Sea ! ------------------ zempred = 0.e0 zwei = 0.e0 DO jj = mj0(87), mj1(96) DO ji = mi0(148), mi1(160) zwei = tmask(ji,jj,1) * e1t(ji,jj) * e2t(ji,jj) zempred = zempred + ( emp(ji,jj) - rnf(ji,jj) ) * zwei END DO END DO IF( lk_mpp ) CALL mpp_sum( zempred ) ! sum with other processors value ! convert in m3 zempred = zempred * 1.e-3 ! Velocity profile at each point ! ------------------------------ zu1_rs(:) = zu1_rs_i(:) zu2_rs(:) = zu2_rs_i(:) zu3_rs(:) = zu3_rs_i(:) ! velocity profile at 161,88 North point ! we imposed zisw_rs + EMP above the Red Sea DO jk = 1, 8 DO jj = mj0(88), mj1(88) DO ji = mi0(160), mi1(160) zu1_rs(jk) = zu1_rs(jk) - ( zempred / 8. ) / ( e2u(ji, jj) * fse3u(ji, jj,jk) ) END DO END DO END DO ! velocity profile at 160,88 North point ! we imposed zisw_rs + EMP above the Red Sea DO jk = 1, 10 DO jj = mj0(88), mj1(88) DO ji = mi0(160), mi1(160) zu3_rs(jk) = zu3_rs(jk) + ( zempred / 10. ) / ( e1v(ji, jj) * fse3v(ji, jj,jk) ) END DO END DO END DO ! Divergence at each point of the straits ! --------------------------------------- ! compute the new divergence at 161,88 DO jk = 1, 21 DO jj = mj0(88), mj1(88) DO ji = mi0(161), mi1(161) zvt = e1t(ji, jj) * e2t(ji, jj) * fse3t(ji, jj,jk) zsu = e2u(ji-1, jj) * fse3u(ji-1, jj,jk) hdivn(ji, jj ,jk) = hdivn(ji, jj ,jk) - ( 1. / zvt ) * zsu * zu1_rs(jk) END DO END DO END DO ! compute the new divergence at 161,87 DO jk = 1, 21 DO jj = mj0(87), mj1(87) DO ji = mi0(161), mi1(161) zvt = e1t(ji, jj) * e2t(ji, jj) * fse3t(ji, jj,jk) zsu = e2u(ji-1, jj) * fse3u(ji-1, jj,jk) hdivn(ji, jj,jk) = hdivn(ji, jj,jk) - ( 1. / zvt ) * zsu * zu2_rs(jk) END DO END DO END DO ! compute the divergence at 160,89 DO jk = 1, 18 DO jj = mj0(89), mj1(89) DO ji = mi0(160), mi1(160) zvt = e1t(ji, jj) * e2t(ji,jj) * fse3t(ji,jj,jk) zsu = e1v(ji, jj-1) * fse3v(ji, jj-1,jk) hdivn(ji, jj,jk) = hdivn(ji, jj,jk) - ( 1. / zvt ) * zsu * zu3_rs(jk) END DO END DO END DO END SUBROUTINE div_bab_el_mandeb SUBROUTINE div_gibraltar !! ------------------------------------------------------------------- !! *** ROUTINE div_gibraltar *** !! !! ** Purpose : update the now horizontal divergence of the velocity !! field in Gibraltar. !! !! ** Method : !! ________________ N ________________ !! 102 | |-> | <-| |<- !! 101 ___->|____|_____ W - - E ___->|____|_____ !! 139 140 141 | 139 140 141 !! horizontal view S horizontal view !! surface depth !! The now divergence is given by : !! hdivn = 1/(e1t*e2t) [ di(e2u un) + dj(e1v vn) ] !! !! ** History : !! ! (A. Bozec) Original code !! 8.5 ! 02-10 (A. Bozec) F90: Free form and module !!--------------------------------------------------------------------- !! * Local declarations INTEGER :: ji, jj, jk ! dummy loop indices REAL(wp) :: zsu, zvt REAL(wp) :: zwei REAL(wp), DIMENSION (jpk) :: zu1_ms, zu2_ms, zu3_ms !!--------------------------------------------------------------------- ! EMP on the Mediterranean Sea ! ---------------------------- zempmed = 0.e0 zwei = 0.e0 DO jj = mj0(96), mj1(110) DO ji = mi0(141),mi1(181) zwei = tmask(ji,jj,1) * e1t(ji,jj) * e2t(ji,jj) zempmed = zempmed + ( emp(ji,jj) - rnf(ji,jj) ) * zwei END DO END DO IF( lk_mpp ) CALL mpp_sum( zempmed ) ! sum with other processors value ! minus 2 points in Red Sea and 3 in Atlantic DO jj = mj0(96), mj1(96) DO ji = mi0(148),mi1(148) zempmed = zempmed - ( emp(ji , jj) - rnf(ji ,jj) ) * tmask(ji , jj,1) * e1t(ji , jj) * e2t(ji , jj) & - ( emp(ji+1, jj) - rnf(ji+1,jj) ) * tmask(ji+1, jj,1) * e1t(ji+1, jj) * e2t(ji+1, jj) END DO END DO ! convert in m3 zempmed = zempmed * 1.e-3 ! Velocity profile at each point ! ------------------------------ zu1_ms(:) = zu1_ms_i(:) zu2_ms(:) = zu2_ms_i(:) zu3_ms(:) = zu3_ms_i(:) ! velocity profile at 139,101 South point ! we imposed zisw + EMP above the Mediterranean Sea DO jk = 1, 14 DO jj = mj0(102), mj1(102) DO ji = mi0(140), mi1(140) zu1_ms(jk) = zu1_ms(jk) + ( zempmed / 14. ) / ( e2u(ji-1, jj-1) * fse3u(ji-1, jj-1,jk) ) END DO END DO END DO ! velocity profile at 141,102 East point ! flux in surface inflow of the Atlantic ocean + EMP DO jk = 1, 14 DO jj = mj0(102), mj1(102) DO ji = mi0(140), mi1(140) zu3_ms(jk) = zu3_ms(jk) + ( zempmed / 14. ) / ( e2u(ji, jj) * fse3u(ji, jj,jk) ) END DO END DO END DO ! Divergence at each point of the straits ! --------------------------------------- ! compute the new divergence at 139,101 South point DO jk = 1, jpk DO jj = mj0(101), mj1(101) DO ji = mi0(139), mi1(139) zvt = e1t(ji, jj) * e2t(ji, jj) * fse3t(ji, jj,jk) zsu = e2u(ji, jj) * fse3u(ji, jj,jk) hdivn(ji, jj,jk) = hdivn(ji, jj,jk) + ( 1. / zvt ) * zsu * zu1_ms(jk) END DO END DO END DO ! compute the new divergence at 139,102 deep North point DO jk = 1, jpk DO jj = mj0(102), mj1(102) DO ji = mi0(139), mi1(139) zvt = e1t(ji, jj) * e2t(ji, jj) * fse3t(ji, jj,jk) zsu = e2u(ji, jj) * fse3u(ji, jj,jk) hdivn(ji, jj,jk) = hdivn(ji, jj,jk) + ( 1. / zvt ) * zsu * zu2_ms(jk) END DO END DO END DO ! compute the divergence at 141,102 East point DO jk = 1, jpk DO jj = mj0(102), mj1(102) DO ji = mi0(141), mi1(141) zvt = e1t(ji, jj) * e2t(ji, jj) * fse3t(ji, jj,jk) zsu = e2u(ji-1, jj) * fse3u(ji-1, jj,jk) hdivn(ji, jj,jk) = hdivn(ji, jj,jk) - ( 1. / zvt ) * zsu * zu3_ms(jk) END DO END DO END DO END SUBROUTINE div_gibraltar SUBROUTINE div_hormuz !! ------------------------------------------------------------------- !! *** ROUTINE div_hormuz *** !! !! ** Purpose : update the now horizontal divergence of the velocity !! field in Hormuz ( Persic Gulf strait ) . !! !! ** Method : !! The now divergence is given by : !! hdivn = 1/(e1t*e2t) [ di(e2u un) + dj(e1v vn) ] !! !! ** History : !! ! (A. Bozec) Original code !! 8.5 ! 02-10 (A. Bozec) F90: Free form and module !!--------------------------------------------------------------------- !! * Local declarations INTEGER :: ji, jj, jk ! dummy loop indices REAL(wp) :: zsu, zvt ! temporary scalars !!--------------------------------------------------------------------- ! New divergence at Hormuz ! ------------------------ DO jk = 1, jpk DO jj = mj0(94), mj1(94) DO ji = mi0(172), mi1(172) zvt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) zsu = e2u(ji-1,jj) * fse3u(ji-1,jj,jk) hdivn(ji,jj,jk) = hdivn(ji,jj,jk) - ( 1. / zvt ) * zsu * zu_pg(jk) END DO END DO END DO END SUBROUTINE div_hormuz SUBROUTINE div_cla_init !! ------------------------------------------------------------------- !! *** ROUTINE div_cla_init *** !! !! ** Purpose : Initialization of variables at all straits !! !! ** History : !! ! (A. Bozec) Original code !! 8.5 ! 02-10 (A. Bozec) F90: Free form and module !!--------------------------------------------------------------------- !! * Local declarations INTEGER :: ji, jj, jk ! dummy loop indices !!--------------------------------------------------------------------- ! Control print ! ------------- IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) 'divmod_cross_land : cross land advection on divergence ' IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~~' IF(lwp) WRITE(numout,*) ' ' ! Initialization at Bab el Mandeb ! ------------------------------- ! imposed transport zisw_rs = 0.4e6 ! inflow surface water zurw_rs = 0.2e6 ! upper recirculation water !Alex zbrw = 1.2e6 ! bottom recirculation water zbrw_rs = 0.5e6 ! bottom recirculation water ! initialization of the velocity zu1_rs_i(:) = 0.e0 ! velocity profile at 161,88 South point zu2_rs_i(:) = 0.e0 ! velocity profile at 161,87 North point zu3_rs_i(:) = 0.e0 ! velocity profile at 160,88 East point ! velocity profile at 161,88 North point ! we imposed zisw_rs + EMP above the Red Sea DO jk = 1, 8 DO jj = mj0(88), mj1(88) DO ji = mi0(160), mi1(160) zu1_rs_i(jk) = -( zisw_rs / 8. ) / ( e2u(ji, jj) * fse3u(ji, jj,jk) ) END DO END DO END DO ! recirculation water DO jj = mj0(88), mj1(88) DO ji = mi0(160), mi1(160) zu1_rs_i(20) = - zurw_rs / ( e2u(ji, jj) * fse3u(ji, jj,20) ) zu1_rs_i(21) = -( zbrw_rs - zurw_rs ) / ( e2u(ji, jj) * fse3u(ji, jj,21) ) END DO END DO ! velocity profile at 161,87 South point DO jj = mj0(88), mj1(88) DO ji = mi0(160), mi1(160) zu2_rs_i(21) = ( zbrw_rs + zisw_rs ) / ( e2u(ji, jj-1 ) * fse3u(ji, jj-1,21) ) END DO END DO ! velocity profile at 160,88 North point ! we imposed zisw_rs + EMP above the Red Sea DO jk = 1, 10 DO jj = mj0(88), mj1(88) DO ji = mi0(160), mi1(160) zu3_rs_i(jk) = ( zisw_rs / 10. ) / ( e1v(ji, jj) * fse3v(ji, jj,jk) ) END DO END DO END DO ! deeper DO jj = mj0(88), mj1(88) DO ji = mi0(160), mi1(160) zu3_rs_i(16) = - zisw_rs / ( e1v(ji, jj) * fse3v(ji, jj,16) ) END DO END DO ! Initialization at Gibraltar ! --------------------------- ! imposed transport zisw_ms = 0.8e6 ! inflow surface water zmrw_ms = 0.7e6 ! middle recirculation water zurw_ms = 2.5e6 ! upper recirculation water zbrw_ms = 3.5e6 ! bottom recirculation water ! initialization of the velocity zu1_ms_i(:) = 0.e0 ! velocity profile at 139,101 South point zu2_ms_i(:) = 0.e0 ! velocity profile at 139,102 North point zu3_ms_i(:) = 0.e0 ! velocity profile at 141,102 East point ! velocity profile at 139,101 South point DO jk = 1, 14 DO jj = mj0(102), mj1(102) DO ji = mi0(140), mi1(140) zu1_ms_i(jk) = ( zisw_ms / 14. ) / ( e2u(ji-1, jj-1) * fse3u(ji-1, jj-1,jk) ) END DO END DO END DO ! recirculation water DO jk = 15, 20 DO jj = mj0(102), mj1(102) DO ji = mi0(140), mi1(140) zu1_ms_i(jk) = ( zmrw_ms / 6. ) / ( e2u(ji-1, jj-1) * fse3u(ji-1, jj-1,jk) ) END DO END DO END DO DO jj = mj0(102), mj1(102) DO ji = mi0(140), mi1(140) zu1_ms_i(21) = ( zurw_ms ) / ( e2u(ji-1, jj-1) * fse3u(ji-1, jj-1,21) ) zu1_ms_i(22) = ( zbrw_ms - zurw_ms ) / ( e2u(ji-1, jj-1) * fse3u(ji-1, jj-1,22) ) END DO END DO ! velocity profile at 139,102 North point DO jk = 15, 20 DO jj = mj0(102), mj1(102) DO ji = mi0(140), mi1(140) zu2_ms_i(jk) = -( zmrw_ms / 6. ) / ( e2u(ji-1, jj) * fse3u(ji-1, jj,jk) ) END DO END DO END DO ! outflow of Mediterranean sea + recirculation DO jj = mj0(102), mj1(102) DO ji = mi0(140), mi1(140) zu2_ms_i(22) = -( zisw_ms + zbrw_ms ) / ( e2u(ji-1, jj) * fse3u(ji-1, jj,22) ) END DO END DO ! velocity profile at 141,102 East point ! flux in surface inflow of the Atlantic ocean DO jk = 1, 14 DO jj = mj0(102), mj1(102) DO ji = mi0(140), mi1(140) zu3_ms_i(jk) = ( zisw_ms / 14. ) / ( e2u(ji, jj) * fse3u(ji, jj,jk) ) END DO END DO END DO ! deeper DO jj = mj0(102), mj1(102) DO ji = mi0(140), mi1(140) zu3_ms_i(21) = - zisw_ms / ( e2u(ji, jj) * fse3u(ji, jj,21) ) END DO END DO ! Initialization at Hormuz ! ------------------------ ! imposed transport zisw_pg = 4. * 0.25e6 ! inflow surface water zbrw_pg = 4. * 0.25e6 ! bottom recirculation water ! initialization of the velocity zu_pg(:) = 0.e0 ! velocity profile at 172,94 ! velocity profile DO jk = 1, 8 DO jj = mj0(94), mj1(94) DO ji = mi0(172), mi1(172) zu_pg(jk) = -( zisw_pg / 8. ) / ( e2u(ji-1,jj) * fse3u(ji-1,jj, jk) ) END DO END DO END DO DO jk = 16, 18 DO jj = mj0(94), mj1(94) DO ji = mi0(172), mi1(172) zu_pg(jk) = ( zbrw_pg / 3. ) / ( e2u(ji-1,jj) * fse3u(ji-1,jj, jk) ) END DO END DO END DO END SUBROUTINE div_cla_init #else !!---------------------------------------------------------------------- !! Default key Dummy module !!---------------------------------------------------------------------- CONTAINS SUBROUTINE div_cla( kt ) WRITE(*,*) 'div_cla: You should have not see this print! error?', kt END SUBROUTINE div_cla #endif !!====================================================================== END MODULE cla_div