- Timestamp:
- 2020-09-14T17:40:34+02:00 (4 years ago)
- Location:
- NEMO/branches/2019/dev_r11351_fldread_with_XIOS
- Files:
-
- 1 deleted
- 18 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11351_fldread_with_XIOS
- Property svn:externals
-
old new 3 3 ^/utils/build/mk@HEAD mk 4 4 ^/utils/tools@HEAD tools 5 ^/vendors/AGRIF/dev @HEADext/AGRIF5 ^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS ext/AGRIF 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL 8 9 # SETTE 10 ^/utils/CI/sette@13382 sette
-
- Property svn:externals
-
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/divhor.F90
r10425 r13463 20 20 USE oce ! ocean dynamics and tracers 21 21 USE dom_oce ! ocean space and time domain 22 USE sbc_oce, ONLY : ln_rnf, ln_isf ! surface boundary condition: ocean 23 USE sbcrnf ! river runoff 24 USE sbcisf ! ice shelf 25 USE iscplhsb ! ice sheet / ocean coupling 26 USE iscplini ! ice sheet / ocean coupling 22 USE sbc_oce, ONLY : ln_rnf ! river runoff 23 USE sbcrnf , ONLY : sbc_rnf_div ! river runoff 24 USE isf_oce, ONLY : ln_isf ! ice shelf 25 USE isfhdiv, ONLY : isf_hdiv ! ice shelf 27 26 #if defined key_asminc 28 27 USE asminc ! Assimilation increment … … 40 39 41 40 !! * Substitutions 42 # include "vectopt_loop_substitute.h90" 41 # include "do_loop_substitute.h90" 42 # include "domzgr_substitute.h90" 43 43 !!---------------------------------------------------------------------- 44 44 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 48 48 CONTAINS 49 49 50 SUBROUTINE div_hor( kt )50 SUBROUTINE div_hor( kt, Kbb, Kmm ) 51 51 !!---------------------------------------------------------------------- 52 52 !! *** ROUTINE div_hor *** … … 55 55 !! 56 56 !! ** Method : the now divergence is computed as : 57 !! hdiv n= 1/(e1e2t*e3t) ( di[e2u*e3u un] + dj[e1v*e3v vn] )57 !! hdiv = 1/(e1e2t*e3t) ( di[e2u*e3u un] + dj[e1v*e3v vn] ) 58 58 !! and correct with runoff inflow (div_rnf) and cross land flow (div_cla) 59 59 !! 60 !! ** Action : - update hdiv n, the now horizontal divergence60 !! ** Action : - update hdiv, the now horizontal divergence 61 61 !!---------------------------------------------------------------------- 62 INTEGER, INTENT(in) :: kt ! ocean time-step index 62 INTEGER, INTENT(in) :: kt ! ocean time-step index 63 INTEGER, INTENT(in) :: Kbb, Kmm ! ocean time level indices 63 64 ! 64 65 INTEGER :: ji, jj, jk ! dummy loop indices 65 66 REAL(wp) :: zraur, zdep ! local scalars 67 REAL(wp), DIMENSION(jpi,jpj) :: ztmp 66 68 !!---------------------------------------------------------------------- 67 69 ! … … 72 74 IF(lwp) WRITE(numout,*) 'div_hor : horizontal velocity divergence ' 73 75 IF(lwp) WRITE(numout,*) '~~~~~~~ ' 76 hdiv(:,:,:) = 0._wp ! initialize hdiv for the halos at the first time step 74 77 ENDIF 75 78 ! 76 DO jk = 1, jpkm1 !== Horizontal divergence ==! 77 DO jj = 2, jpjm1 78 DO ji = fs_2, fs_jpim1 ! vector opt. 79 hdivn(ji,jj,jk) = ( e2u(ji ,jj) * e3u_n(ji ,jj,jk) * un(ji ,jj,jk) & 80 & - e2u(ji-1,jj) * e3u_n(ji-1,jj,jk) * un(ji-1,jj,jk) & 81 & + e1v(ji,jj ) * e3v_n(ji,jj ,jk) * vn(ji,jj ,jk) & 82 & - e1v(ji,jj-1) * e3v_n(ji,jj-1,jk) * vn(ji,jj-1,jk) ) & 83 & * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 84 END DO 85 END DO 86 END DO 87 #if defined key_agrif 88 IF( .NOT. Agrif_Root() ) THEN 89 IF( nbondi == -1 .OR. nbondi == 2 ) hdivn( 2 , : ,:) = 0._wp ! west 90 IF( nbondi == 1 .OR. nbondi == 2 ) hdivn( nlci-1, : ,:) = 0._wp ! east 91 IF( nbondj == -1 .OR. nbondj == 2 ) hdivn( : , 2 ,:) = 0._wp ! south 92 IF( nbondj == 1 .OR. nbondj == 2 ) hdivn( : ,nlcj-1,:) = 0._wp ! north 93 ENDIF 79 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 80 hdiv(ji,jj,jk) = ( e2u(ji ,jj) * e3u(ji ,jj,jk,Kmm) * uu(ji ,jj,jk,Kmm) & 81 & - e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm) * uu(ji-1,jj,jk,Kmm) & 82 & + e1v(ji,jj ) * e3v(ji,jj ,jk,Kmm) * vv(ji,jj ,jk,Kmm) & 83 & - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * vv(ji,jj-1,jk,Kmm) ) & 84 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 85 END_3D 86 ! 87 IF( ln_rnf ) CALL sbc_rnf_div( hdiv, Kmm ) !== runoffs ==! (update hdiv field) 88 ! 89 #if defined key_asminc 90 IF( ln_sshinc .AND. ln_asmiau ) CALL ssh_asm_div( kt, Kbb, Kmm, hdiv ) !== SSH assimilation ==! (update hdiv field) 91 ! 94 92 #endif 95 93 ! 96 IF( ln_ rnf ) CALL sbc_rnf_div( hdivn ) !== runoffs ==! (update hdivnfield)94 IF( ln_isf ) CALL isf_hdiv( kt, Kmm, hdiv ) !== ice shelf ==! (update hdiv field) 97 95 ! 98 #if defined key_asminc 99 IF( ln_sshinc .AND. ln_asmiau ) CALL ssh_asm_div( kt, hdivn ) !== SSH assimilation ==! (update hdivn field) 100 ! 101 #endif 102 IF( ln_isf ) CALL sbc_isf_div( hdivn ) !== ice shelf ==! (update hdivn field) 103 ! 104 IF( ln_iscpl .AND. ln_hsb ) CALL iscpl_div( hdivn ) !== ice sheet ==! (update hdivn field) 105 ! 106 CALL lbc_lnk( 'divhor', hdivn, 'T', 1. ) ! (no sign change) 96 CALL lbc_lnk( 'divhor', hdiv, 'T', 1.0_wp ) ! (no sign change) 107 97 ! 108 98 IF( ln_timing ) CALL timing_stop('div_hor') -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynadv.F90
r10068 r13463 44 44 INTEGER, PUBLIC, PARAMETER :: np_FLX_ubs = 3 ! flux form : 3rd order Upstream Biased Scheme 45 45 46 !! * Substitutions47 # include "vectopt_loop_substitute.h90"48 46 !!---------------------------------------------------------------------- 49 47 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 53 51 CONTAINS 54 52 55 SUBROUTINE dyn_adv( kt )53 SUBROUTINE dyn_adv( kt, Kbb, Kmm, puu, pvv, Krhs ) 56 54 !!--------------------------------------------------------------------- 57 55 !! *** ROUTINE dyn_adv *** … … 59 57 !! ** Purpose : compute the ocean momentum advection trend. 60 58 !! 61 !! ** Method : - Update ( ua,va) with the advection term following n_dynadv59 !! ** Method : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the advection term following n_dynadv 62 60 !! 63 61 !! NB: in flux form advection (ln_dynadv_cen2 or ln_dynadv_ubs=T) … … 66 64 !! (see dynvor module). 67 65 !!---------------------------------------------------------------------- 68 INTEGER, INTENT( in ) :: kt ! ocean time-step index 66 INTEGER , INTENT( in ) :: kt ! ocean time-step index 67 INTEGER , INTENT( in ) :: Kbb, Kmm, Krhs ! ocean time level indices 68 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 69 69 !!---------------------------------------------------------------------- 70 70 ! … … 73 73 SELECT CASE( n_dynadv ) !== compute advection trend and add it to general trend ==! 74 74 CASE( np_VEC_c2 ) 75 CALL dyn_keg ( kt, nn_dynkeg ) ! vector form : horizontal gradient of kinetic energy76 CALL dyn_zad ( kt )! vector form : vertical advection75 CALL dyn_keg ( kt, nn_dynkeg, Kmm, puu, pvv, Krhs ) ! vector form : horizontal gradient of kinetic energy 76 CALL dyn_zad ( kt, Kmm, puu, pvv, Krhs ) ! vector form : vertical advection 77 77 CASE( np_FLX_c2 ) 78 CALL dyn_adv_cen2( kt )! 2nd order centered scheme78 CALL dyn_adv_cen2( kt, Kmm, puu, pvv, Krhs ) ! 2nd order centered scheme 79 79 CASE( np_FLX_ubs ) 80 CALL dyn_adv_ubs ( kt )! 3rd order UBS scheme (UP3)80 CALL dyn_adv_ubs ( kt, Kbb, Kmm, puu, pvv, Krhs ) ! 3rd order UBS scheme (UP3) 81 81 END SELECT 82 82 ! … … 104 104 ENDIF 105 105 ! 106 REWIND( numnam_ref ) ! Namelist namdyn_adv in reference namelist : Momentum advection scheme107 106 READ ( numnam_ref, namdyn_adv, IOSTAT = ios, ERR = 901) 108 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_adv in reference namelist', lwp ) 109 REWIND( numnam_cfg ) ! Namelist namdyn_adv in configuration namelist : Momentum advection scheme 107 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_adv in reference namelist' ) 110 108 READ ( numnam_cfg, namdyn_adv, IOSTAT = ios, ERR = 902 ) 111 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namdyn_adv in configuration namelist' , lwp)109 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namdyn_adv in configuration namelist' ) 112 110 IF(lwm) WRITE ( numond, namdyn_adv ) 113 111 -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynadv_cen2.F90
r10068 r13463 27 27 28 28 !! * Substitutions 29 # include "vectopt_loop_substitute.h90" 29 # include "do_loop_substitute.h90" 30 # include "domzgr_substitute.h90" 30 31 !!---------------------------------------------------------------------- 31 32 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 35 36 CONTAINS 36 37 37 SUBROUTINE dyn_adv_cen2( kt )38 SUBROUTINE dyn_adv_cen2( kt, Kmm, puu, pvv, Krhs ) 38 39 !!---------------------------------------------------------------------- 39 40 !! *** ROUTINE dyn_adv_cen2 *** … … 44 45 !! ** Method : Trend evaluated using now fields (centered in time) 45 46 !! 46 !! ** Action : ( ua,va) updated with the now vorticity term trend47 !! ** Action : (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) updated with the now vorticity term trend 47 48 !!---------------------------------------------------------------------- 48 INTEGER, INTENT( in ) :: kt ! ocean time-step index 49 INTEGER , INTENT( in ) :: kt ! ocean time-step index 50 INTEGER , INTENT( in ) :: Kmm, Krhs ! ocean time level indices 51 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 49 52 ! 50 53 INTEGER :: ji, jj, jk ! dummy loop indices … … 60 63 ! 61 64 IF( l_trddyn ) THEN ! trends: store the input trends 62 zfu_uw(:,:,:) = ua(:,:,:)63 zfv_vw(:,:,:) = va(:,:,:)65 zfu_uw(:,:,:) = puu(:,:,:,Krhs) 66 zfv_vw(:,:,:) = pvv(:,:,:,Krhs) 64 67 ENDIF 65 68 ! … … 67 70 ! 68 71 DO jk = 1, jpkm1 ! horizontal transport 69 zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u_n(:,:,jk) * un(:,:,jk) 70 zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 71 DO jj = 1, jpjm1 ! horizontal momentum fluxes (at T- and F-point) 72 DO ji = 1, fs_jpim1 ! vector opt. 73 zfu_t(ji+1,jj ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj,jk) ) * ( un(ji,jj,jk) + un(ji+1,jj ,jk) ) 74 zfv_f(ji ,jj ,jk) = ( zfv(ji,jj,jk) + zfv(ji+1,jj,jk) ) * ( un(ji,jj,jk) + un(ji ,jj+1,jk) ) 75 zfu_f(ji ,jj ,jk) = ( zfu(ji,jj,jk) + zfu(ji,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji+1,jj ,jk) ) 76 zfv_t(ji ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji ,jj+1,jk) ) 77 END DO 78 END DO 79 DO jj = 2, jpjm1 ! divergence of horizontal momentum fluxes 80 DO ji = fs_2, fs_jpim1 ! vector opt. 81 ua(ji,jj,jk) = ua(ji,jj,jk) - ( zfu_t(ji+1,jj,jk) - zfu_t(ji,jj ,jk) & 82 & + zfv_f(ji ,jj,jk) - zfv_f(ji,jj-1,jk) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 83 va(ji,jj,jk) = va(ji,jj,jk) - ( zfu_f(ji,jj ,jk) - zfu_f(ji-1,jj,jk) & 84 & + zfv_t(ji,jj+1,jk) - zfv_t(ji ,jj,jk) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 85 END DO 86 END DO 72 zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) 73 zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) 74 DO_2D( 1, 0, 1, 0 ) 75 zfu_t(ji+1,jj ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji+1,jj ,jk,Kmm) ) 76 zfv_f(ji ,jj ,jk) = ( zfv(ji,jj,jk) + zfv(ji+1,jj,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji ,jj+1,jk,Kmm) ) 77 zfu_f(ji ,jj ,jk) = ( zfu(ji,jj,jk) + zfu(ji,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji+1,jj ,jk,Kmm) ) 78 zfv_t(ji ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji ,jj+1,jk,Kmm) ) 79 END_2D 80 DO_2D( 0, 0, 0, 0 ) 81 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zfu_t(ji+1,jj,jk) - zfu_t(ji,jj ,jk) & 82 & + zfv_f(ji ,jj,jk) - zfv_f(ji,jj-1,jk) ) * r1_e1e2u(ji,jj) & 83 & / e3u(ji,jj,jk,Kmm) 84 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zfu_f(ji,jj ,jk) - zfu_f(ji-1,jj,jk) & 85 & + zfv_t(ji,jj+1,jk) - zfv_t(ji ,jj,jk) ) * r1_e1e2v(ji,jj) & 86 & / e3v(ji,jj,jk,Kmm) 87 END_2D 87 88 END DO 88 89 ! 89 90 IF( l_trddyn ) THEN ! trends: send trend to trddyn for diagnostic 90 zfu_uw(:,:,:) = ua(:,:,:) - zfu_uw(:,:,:)91 zfv_vw(:,:,:) = va(:,:,:) - zfv_vw(:,:,:)92 CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt )93 zfu_t(:,:,:) = ua(:,:,:)94 zfv_t(:,:,:) = va(:,:,:)91 zfu_uw(:,:,:) = puu(:,:,:,Krhs) - zfu_uw(:,:,:) 92 zfv_vw(:,:,:) = pvv(:,:,:,Krhs) - zfv_vw(:,:,:) 93 CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt, Kmm ) 94 zfu_t(:,:,:) = puu(:,:,:,Krhs) 95 zfv_t(:,:,:) = pvv(:,:,:,Krhs) 95 96 ENDIF 96 97 ! 97 98 ! !== Vertical advection ==! 98 99 ! 99 DO jj = 2, jpjm1 ! surface/bottom advective fluxes set to zero 100 DO ji = fs_2, fs_jpim1 101 zfu_uw(ji,jj,jpk) = 0._wp ; zfv_vw(ji,jj,jpk) = 0._wp 102 zfu_uw(ji,jj, 1 ) = 0._wp ; zfv_vw(ji,jj, 1 ) = 0._wp 103 END DO 104 END DO 100 DO_2D( 0, 0, 0, 0 ) 101 zfu_uw(ji,jj,jpk) = 0._wp ; zfv_vw(ji,jj,jpk) = 0._wp 102 zfu_uw(ji,jj, 1 ) = 0._wp ; zfv_vw(ji,jj, 1 ) = 0._wp 103 END_2D 105 104 IF( ln_linssh ) THEN ! linear free surface: advection through the surface 106 DO jj = 2, jpjm1 107 DO ji = fs_2, fs_jpim1 108 zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * wn(ji,jj,1) + e1e2t(ji+1,jj) * wn(ji+1,jj,1) ) * un(ji,jj,1) 109 zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * wn(ji,jj,1) + e1e2t(ji,jj+1) * wn(ji,jj+1,1) ) * vn(ji,jj,1) 110 END DO 111 END DO 105 DO_2D( 0, 0, 0, 0 ) 106 zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * ww(ji,jj,1) + e1e2t(ji+1,jj) * ww(ji+1,jj,1) ) * puu(ji,jj,1,Kmm) 107 zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * ww(ji,jj,1) + e1e2t(ji,jj+1) * ww(ji,jj+1,1) ) * pvv(ji,jj,1,Kmm) 108 END_2D 112 109 ENDIF 113 110 DO jk = 2, jpkm1 ! interior advective fluxes 114 DO jj = 2, jpj ! 1/4 * Vertical transport 115 DO ji = 2, jpi 116 zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk) 117 END DO 118 END DO 119 DO jj = 2, jpjm1 120 DO ji = fs_2, fs_jpim1 ! vector opt. 121 zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji+1,jj ,jk) ) * ( un(ji,jj,jk) + un(ji,jj,jk-1) ) 122 zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji ,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji,jj,jk-1) ) 123 END DO 124 END DO 111 DO_2D( 0, 1, 0, 1 ) 112 zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk) 113 END_2D 114 DO_2D( 0, 0, 0, 0 ) 115 zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji+1,jj ,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji,jj,jk-1,Kmm) ) 116 zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji ,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk-1,Kmm) ) 117 END_2D 125 118 END DO 126 DO jk = 1, jpkm1 ! divergence of vertical momentum flux divergence 127 DO jj = 2, jpjm1 128 DO ji = fs_2, fs_jpim1 ! vector opt. 129 ua(ji,jj,jk) = ua(ji,jj,jk) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 130 va(ji,jj,jk) = va(ji,jj,jk) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 131 END DO 132 END DO 133 END DO 119 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 120 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) & 121 & / e3u(ji,jj,jk,Kmm) 122 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) & 123 & / e3v(ji,jj,jk,Kmm) 124 END_3D 134 125 ! 135 126 IF( l_trddyn ) THEN ! trends: send trend to trddyn for diagnostic 136 zfu_t(:,:,:) = ua(:,:,:) - zfu_t(:,:,:)137 zfv_t(:,:,:) = va(:,:,:) - zfv_t(:,:,:)138 CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt )127 zfu_t(:,:,:) = puu(:,:,:,Krhs) - zfu_t(:,:,:) 128 zfv_t(:,:,:) = pvv(:,:,:,Krhs) - zfv_t(:,:,:) 129 CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt, Kmm ) 139 130 ENDIF 140 131 ! ! Control print 141 IF( ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' cen2 adv - Ua: ', mask1=umask, &142 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )132 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' cen2 adv - Ua: ', mask1=umask, & 133 & tab3d_2=pvv(:,:,:,Krhs), clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 143 134 ! 144 135 END SUBROUTINE dyn_adv_cen2 -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynadv_ubs.F90
r10425 r13463 33 33 34 34 !! * Substitutions 35 # include "vectopt_loop_substitute.h90" 35 # include "do_loop_substitute.h90" 36 # include "domzgr_substitute.h90" 36 37 !!---------------------------------------------------------------------- 37 38 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 41 42 CONTAINS 42 43 43 SUBROUTINE dyn_adv_ubs( kt )44 SUBROUTINE dyn_adv_ubs( kt, Kbb, Kmm, puu, pvv, Krhs ) 44 45 !!---------------------------------------------------------------------- 45 46 !! *** ROUTINE dyn_adv_ubs *** … … 64 65 !! gamma1=1/3 and gamma2=1/32. 65 66 !! 66 !! ** Action : - ( ua,va) updated with the 3D advective momentum trends67 !! ** Action : - (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) updated with the 3D advective momentum trends 67 68 !! 68 69 !! Reference : Shchepetkin & McWilliams, 2005, Ocean Modelling. 69 70 !!---------------------------------------------------------------------- 70 INTEGER, INTENT(in) :: kt ! ocean time-step index 71 INTEGER , INTENT( in ) :: kt ! ocean time-step index 72 INTEGER , INTENT( in ) :: Kbb, Kmm, Krhs ! ocean time level indices 73 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 71 74 ! 72 75 INTEGER :: ji, jj, jk ! dummy loop indices … … 95 98 ! 96 99 IF( l_trddyn ) THEN ! trends: store the input trends 97 zfu_uw(:,:,:) = ua(:,:,:)98 zfv_vw(:,:,:) = va(:,:,:)100 zfu_uw(:,:,:) = puu(:,:,:,Krhs) 101 zfv_vw(:,:,:) = pvv(:,:,:,Krhs) 99 102 ENDIF 100 103 ! ! =========================== ! … … 102 105 ! ! =========================== ! 103 106 ! ! horizontal volume fluxes 104 zfu(:,:,jk) = e2u(:,:) * e3u _n(:,:,jk) * un(:,:,jk)105 zfv(:,:,jk) = e1v(:,:) * e3v _n(:,:,jk) * vn(:,:,jk)107 zfu(:,:,jk) = e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) 108 zfv(:,:,jk) = e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) 106 109 ! 107 DO jj = 2, jpjm1 ! laplacian 108 DO ji = fs_2, fs_jpim1 ! vector opt. 109 zlu_uu(ji,jj,jk,1) = ( ub (ji+1,jj ,jk) - 2.*ub (ji,jj,jk) + ub (ji-1,jj ,jk) ) * umask(ji,jj,jk) 110 zlv_vv(ji,jj,jk,1) = ( vb (ji ,jj+1,jk) - 2.*vb (ji,jj,jk) + vb (ji ,jj-1,jk) ) * vmask(ji,jj,jk) 111 zlu_uv(ji,jj,jk,1) = ( ub (ji ,jj+1,jk) - ub (ji ,jj ,jk) ) * fmask(ji ,jj ,jk) & 112 & - ( ub (ji ,jj ,jk) - ub (ji ,jj-1,jk) ) * fmask(ji ,jj-1,jk) 113 zlv_vu(ji,jj,jk,1) = ( vb (ji+1,jj ,jk) - vb (ji ,jj ,jk) ) * fmask(ji ,jj ,jk) & 114 & - ( vb (ji ,jj ,jk) - vb (ji-1,jj ,jk) ) * fmask(ji-1,jj ,jk) 115 ! 116 zlu_uu(ji,jj,jk,2) = ( zfu(ji+1,jj ,jk) - 2.*zfu(ji,jj,jk) + zfu(ji-1,jj ,jk) ) * umask(ji,jj,jk) 117 zlv_vv(ji,jj,jk,2) = ( zfv(ji ,jj+1,jk) - 2.*zfv(ji,jj,jk) + zfv(ji ,jj-1,jk) ) * vmask(ji,jj,jk) 118 zlu_uv(ji,jj,jk,2) = ( zfu(ji ,jj+1,jk) - zfu(ji ,jj ,jk) ) * fmask(ji ,jj ,jk) & 119 & - ( zfu(ji ,jj ,jk) - zfu(ji ,jj-1,jk) ) * fmask(ji ,jj-1,jk) 120 zlv_vu(ji,jj,jk,2) = ( zfv(ji+1,jj ,jk) - zfv(ji ,jj ,jk) ) * fmask(ji ,jj ,jk) & 121 & - ( zfv(ji ,jj ,jk) - zfv(ji-1,jj ,jk) ) * fmask(ji-1,jj ,jk) 122 END DO 123 END DO 110 DO_2D( 0, 0, 0, 0 ) 111 zlu_uu(ji,jj,jk,1) = ( puu (ji+1,jj ,jk,Kbb) - 2.*puu (ji,jj,jk,Kbb) + puu (ji-1,jj ,jk,Kbb) ) * umask(ji,jj,jk) 112 zlv_vv(ji,jj,jk,1) = ( pvv (ji ,jj+1,jk,Kbb) - 2.*pvv (ji,jj,jk,Kbb) + pvv (ji ,jj-1,jk,Kbb) ) * vmask(ji,jj,jk) 113 zlu_uv(ji,jj,jk,1) = ( puu (ji ,jj+1,jk,Kbb) - puu (ji ,jj ,jk,Kbb) ) * fmask(ji ,jj ,jk) & 114 & - ( puu (ji ,jj ,jk,Kbb) - puu (ji ,jj-1,jk,Kbb) ) * fmask(ji ,jj-1,jk) 115 zlv_vu(ji,jj,jk,1) = ( pvv (ji+1,jj ,jk,Kbb) - pvv (ji ,jj ,jk,Kbb) ) * fmask(ji ,jj ,jk) & 116 & - ( pvv (ji ,jj ,jk,Kbb) - pvv (ji-1,jj ,jk,Kbb) ) * fmask(ji-1,jj ,jk) 117 ! 118 zlu_uu(ji,jj,jk,2) = ( zfu(ji+1,jj ,jk) - 2.*zfu(ji,jj,jk) + zfu(ji-1,jj ,jk) ) * umask(ji,jj,jk) 119 zlv_vv(ji,jj,jk,2) = ( zfv(ji ,jj+1,jk) - 2.*zfv(ji,jj,jk) + zfv(ji ,jj-1,jk) ) * vmask(ji,jj,jk) 120 zlu_uv(ji,jj,jk,2) = ( zfu(ji ,jj+1,jk) - zfu(ji ,jj ,jk) ) * fmask(ji ,jj ,jk) & 121 & - ( zfu(ji ,jj ,jk) - zfu(ji ,jj-1,jk) ) * fmask(ji ,jj-1,jk) 122 zlv_vu(ji,jj,jk,2) = ( zfv(ji+1,jj ,jk) - zfv(ji ,jj ,jk) ) * fmask(ji ,jj ,jk) & 123 & - ( zfv(ji ,jj ,jk) - zfv(ji-1,jj ,jk) ) * fmask(ji-1,jj ,jk) 124 END_2D 124 125 END DO 125 CALL lbc_lnk_multi( 'dynadv_ubs', zlu_uu(:,:,:,1), 'U', 1. , zlu_uv(:,:,:,1), 'U', 1., &126 & zlu_uu(:,:,:,2), 'U', 1. , zlu_uv(:,:,:,2), 'U', 1., &127 & zlv_vv(:,:,:,1), 'V', 1. , zlv_vu(:,:,:,1), 'V', 1., &128 & zlv_vv(:,:,:,2), 'V', 1. , zlv_vu(:,:,:,2), 'V', 1.)126 CALL lbc_lnk_multi( 'dynadv_ubs', zlu_uu(:,:,:,1), 'U', 1.0_wp , zlu_uv(:,:,:,1), 'U', 1.0_wp, & 127 & zlu_uu(:,:,:,2), 'U', 1.0_wp , zlu_uv(:,:,:,2), 'U', 1.0_wp, & 128 & zlv_vv(:,:,:,1), 'V', 1.0_wp , zlv_vu(:,:,:,1), 'V', 1.0_wp, & 129 & zlv_vv(:,:,:,2), 'V', 1.0_wp , zlv_vu(:,:,:,2), 'V', 1.0_wp ) 129 130 ! 130 131 ! ! ====================== ! … … 132 133 DO jk = 1, jpkm1 ! ====================== ! 133 134 ! ! horizontal volume fluxes 134 zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u _n(:,:,jk) * un(:,:,jk)135 zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v _n(:,:,jk) * vn(:,:,jk)135 zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) 136 zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) 136 137 ! 137 DO jj = 1, jpjm1 ! horizontal momentum fluxes at T- and F-point 138 DO ji = 1, fs_jpim1 ! vector opt. 139 zui = ( un(ji,jj,jk) + un(ji+1,jj ,jk) ) 140 zvj = ( vn(ji,jj,jk) + vn(ji ,jj+1,jk) ) 141 ! 142 IF( zui > 0 ) THEN ; zl_u = zlu_uu(ji ,jj,jk,1) 143 ELSE ; zl_u = zlu_uu(ji+1,jj,jk,1) 144 ENDIF 145 IF( zvj > 0 ) THEN ; zl_v = zlv_vv(ji,jj ,jk,1) 146 ELSE ; zl_v = zlv_vv(ji,jj+1,jk,1) 147 ENDIF 148 ! 149 zfu_t(ji+1,jj ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj ,jk) & 150 & - gamma2 * ( zlu_uu(ji,jj,jk,2) + zlu_uu(ji+1,jj ,jk,2) ) ) & 151 & * ( zui - gamma1 * zl_u) 152 zfv_t(ji ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji ,jj+1,jk) & 153 & - gamma2 * ( zlv_vv(ji,jj,jk,2) + zlv_vv(ji ,jj+1,jk,2) ) ) & 154 & * ( zvj - gamma1 * zl_v) 155 ! 156 zfuj = ( zfu(ji,jj,jk) + zfu(ji ,jj+1,jk) ) 157 zfvi = ( zfv(ji,jj,jk) + zfv(ji+1,jj ,jk) ) 158 IF( zfuj > 0 ) THEN ; zl_v = zlv_vu( ji ,jj ,jk,1) 159 ELSE ; zl_v = zlv_vu( ji+1,jj,jk,1) 160 ENDIF 161 IF( zfvi > 0 ) THEN ; zl_u = zlu_uv( ji,jj ,jk,1) 162 ELSE ; zl_u = zlu_uv( ji,jj+1,jk,1) 163 ENDIF 164 ! 165 zfv_f(ji ,jj ,jk) = ( zfvi - gamma2 * ( zlv_vu(ji,jj,jk,2) + zlv_vu(ji+1,jj ,jk,2) ) ) & 166 & * ( un(ji,jj,jk) + un(ji ,jj+1,jk) - gamma1 * zl_u ) 167 zfu_f(ji ,jj ,jk) = ( zfuj - gamma2 * ( zlu_uv(ji,jj,jk,2) + zlu_uv(ji ,jj+1,jk,2) ) ) & 168 & * ( vn(ji,jj,jk) + vn(ji+1,jj ,jk) - gamma1 * zl_v ) 169 END DO 170 END DO 171 DO jj = 2, jpjm1 ! divergence of horizontal momentum fluxes 172 DO ji = fs_2, fs_jpim1 ! vector opt. 173 ua(ji,jj,jk) = ua(ji,jj,jk) - ( zfu_t(ji+1,jj,jk) - zfu_t(ji,jj ,jk) & 174 & + zfv_f(ji ,jj,jk) - zfv_f(ji,jj-1,jk) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 175 va(ji,jj,jk) = va(ji,jj,jk) - ( zfu_f(ji,jj ,jk) - zfu_f(ji-1,jj,jk) & 176 & + zfv_t(ji,jj+1,jk) - zfv_t(ji ,jj,jk) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 177 END DO 178 END DO 138 DO_2D( 1, 0, 1, 0 ) 139 zui = ( puu(ji,jj,jk,Kmm) + puu(ji+1,jj ,jk,Kmm) ) 140 zvj = ( pvv(ji,jj,jk,Kmm) + pvv(ji ,jj+1,jk,Kmm) ) 141 ! 142 IF( zui > 0 ) THEN ; zl_u = zlu_uu(ji ,jj,jk,1) 143 ELSE ; zl_u = zlu_uu(ji+1,jj,jk,1) 144 ENDIF 145 IF( zvj > 0 ) THEN ; zl_v = zlv_vv(ji,jj ,jk,1) 146 ELSE ; zl_v = zlv_vv(ji,jj+1,jk,1) 147 ENDIF 148 ! 149 zfu_t(ji+1,jj ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj ,jk) & 150 & - gamma2 * ( zlu_uu(ji,jj,jk,2) + zlu_uu(ji+1,jj ,jk,2) ) ) & 151 & * ( zui - gamma1 * zl_u) 152 zfv_t(ji ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji ,jj+1,jk) & 153 & - gamma2 * ( zlv_vv(ji,jj,jk,2) + zlv_vv(ji ,jj+1,jk,2) ) ) & 154 & * ( zvj - gamma1 * zl_v) 155 ! 156 zfuj = ( zfu(ji,jj,jk) + zfu(ji ,jj+1,jk) ) 157 zfvi = ( zfv(ji,jj,jk) + zfv(ji+1,jj ,jk) ) 158 IF( zfuj > 0 ) THEN ; zl_v = zlv_vu( ji ,jj ,jk,1) 159 ELSE ; zl_v = zlv_vu( ji+1,jj,jk,1) 160 ENDIF 161 IF( zfvi > 0 ) THEN ; zl_u = zlu_uv( ji,jj ,jk,1) 162 ELSE ; zl_u = zlu_uv( ji,jj+1,jk,1) 163 ENDIF 164 ! 165 zfv_f(ji ,jj ,jk) = ( zfvi - gamma2 * ( zlv_vu(ji,jj,jk,2) + zlv_vu(ji+1,jj ,jk,2) ) ) & 166 & * ( puu(ji,jj,jk,Kmm) + puu(ji ,jj+1,jk,Kmm) - gamma1 * zl_u ) 167 zfu_f(ji ,jj ,jk) = ( zfuj - gamma2 * ( zlu_uv(ji,jj,jk,2) + zlu_uv(ji ,jj+1,jk,2) ) ) & 168 & * ( pvv(ji,jj,jk,Kmm) + pvv(ji+1,jj ,jk,Kmm) - gamma1 * zl_v ) 169 END_2D 170 DO_2D( 0, 0, 0, 0 ) 171 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zfu_t(ji+1,jj,jk) - zfu_t(ji,jj ,jk) & 172 & + zfv_f(ji ,jj,jk) - zfv_f(ji,jj-1,jk) ) * r1_e1e2u(ji,jj) & 173 & / e3u(ji,jj,jk,Kmm) 174 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zfu_f(ji,jj ,jk) - zfu_f(ji-1,jj,jk) & 175 & + zfv_t(ji,jj+1,jk) - zfv_t(ji ,jj,jk) ) * r1_e1e2v(ji,jj) & 176 & / e3v(ji,jj,jk,Kmm) 177 END_2D 179 178 END DO 180 179 IF( l_trddyn ) THEN ! trends: send trends to trddyn for diagnostic 181 zfu_uw(:,:,:) = ua(:,:,:) - zfu_uw(:,:,:)182 zfv_vw(:,:,:) = va(:,:,:) - zfv_vw(:,:,:)183 CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt )184 zfu_t(:,:,:) = ua(:,:,:)185 zfv_t(:,:,:) = va(:,:,:)180 zfu_uw(:,:,:) = puu(:,:,:,Krhs) - zfu_uw(:,:,:) 181 zfv_vw(:,:,:) = pvv(:,:,:,Krhs) - zfv_vw(:,:,:) 182 CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt, Kmm ) 183 zfu_t(:,:,:) = puu(:,:,:,Krhs) 184 zfv_t(:,:,:) = pvv(:,:,:,Krhs) 186 185 ENDIF 187 186 ! ! ==================== ! 188 187 ! ! Vertical advection ! 189 188 ! ! ==================== ! 190 DO jj = 2, jpjm1 ! surface/bottom advective fluxes set to zero 191 DO ji = fs_2, fs_jpim1 192 zfu_uw(ji,jj,jpk) = 0._wp 193 zfv_vw(ji,jj,jpk) = 0._wp 194 zfu_uw(ji,jj, 1 ) = 0._wp 195 zfv_vw(ji,jj, 1 ) = 0._wp 196 END DO 189 DO_2D( 0, 0, 0, 0 ) 190 zfu_uw(ji,jj,jpk) = 0._wp 191 zfv_vw(ji,jj,jpk) = 0._wp 192 zfu_uw(ji,jj, 1 ) = 0._wp 193 zfv_vw(ji,jj, 1 ) = 0._wp 194 END_2D 195 IF( ln_linssh ) THEN ! constant volume : advection through the surface 196 DO_2D( 0, 0, 0, 0 ) 197 zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * ww(ji,jj,1) + e1e2t(ji+1,jj) * ww(ji+1,jj,1) ) * puu(ji,jj,1,Kmm) 198 zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * ww(ji,jj,1) + e1e2t(ji,jj+1) * ww(ji,jj+1,1) ) * pvv(ji,jj,1,Kmm) 199 END_2D 200 ENDIF 201 DO jk = 2, jpkm1 ! interior fluxes 202 DO_2D( 0, 1, 0, 1 ) 203 zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk) 204 END_2D 205 DO_2D( 0, 0, 0, 0 ) 206 zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji+1,jj,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji,jj,jk-1,Kmm) ) 207 zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk-1,Kmm) ) 208 END_2D 197 209 END DO 198 IF( ln_linssh ) THEN ! constant volume : advection through the surface 199 DO jj = 2, jpjm1 200 DO ji = fs_2, fs_jpim1 201 zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * wn(ji,jj,1) + e1e2t(ji+1,jj) * wn(ji+1,jj,1) ) * un(ji,jj,1) 202 zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * wn(ji,jj,1) + e1e2t(ji,jj+1) * wn(ji,jj+1,1) ) * vn(ji,jj,1) 203 END DO 204 END DO 205 ENDIF 206 DO jk = 2, jpkm1 ! interior fluxes 207 DO jj = 2, jpj 208 DO ji = 2, jpi 209 zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk) 210 END DO 211 END DO 212 DO jj = 2, jpjm1 213 DO ji = fs_2, fs_jpim1 ! vector opt. 214 zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji+1,jj,jk) ) * ( un(ji,jj,jk) + un(ji,jj,jk-1) ) 215 zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji,jj,jk-1) ) 216 END DO 217 END DO 218 END DO 219 DO jk = 1, jpkm1 ! divergence of vertical momentum flux divergence 220 DO jj = 2, jpjm1 221 DO ji = fs_2, fs_jpim1 ! vector opt. 222 ua(ji,jj,jk) = ua(ji,jj,jk) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 223 va(ji,jj,jk) = va(ji,jj,jk) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 224 END DO 225 END DO 226 END DO 210 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 211 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) & 212 & / e3u(ji,jj,jk,Kmm) 213 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) & 214 & / e3v(ji,jj,jk,Kmm) 215 END_3D 227 216 ! 228 217 IF( l_trddyn ) THEN ! save the vertical advection trend for diagnostic 229 zfu_t(:,:,:) = ua(:,:,:) - zfu_t(:,:,:)230 zfv_t(:,:,:) = va(:,:,:) - zfv_t(:,:,:)231 CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt )218 zfu_t(:,:,:) = puu(:,:,:,Krhs) - zfu_t(:,:,:) 219 zfv_t(:,:,:) = pvv(:,:,:,Krhs) - zfv_t(:,:,:) 220 CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt, Kmm ) 232 221 ENDIF 233 222 ! ! Control print 234 IF( ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' ubs2 adv - Ua: ', mask1=umask, &235 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )223 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' ubs2 adv - Ua: ', mask1=umask, & 224 & tab3d_2=pvv(:,:,:,Krhs), clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 236 225 ! 237 226 END SUBROUTINE dyn_adv_ubs -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynhpg.F90
r10491 r13463 31 31 !!---------------------------------------------------------------------- 32 32 USE oce ! ocean dynamics and tracers 33 USE isf_oce , ONLY : risfload ! ice shelf (risfload variable) 34 USE isfload , ONLY : isf_load ! ice shelf (isf_load routine ) 33 35 USE sbc_oce ! surface variable (only for the flag with ice shelf) 34 36 USE dom_oce ! ocean space and time domain … … 37 39 USE trd_oce ! trends: ocean variables 38 40 USE trddyn ! trend manager: dynamics 39 !jcUSE zpshde ! partial step: hor. derivative (zps_hde routine)41 USE zpshde ! partial step: hor. derivative (zps_hde routine) 40 42 ! 41 43 USE in_out_manager ! I/O manager … … 73 75 74 76 !! * Substitutions 75 # include "vectopt_loop_substitute.h90" 77 # include "do_loop_substitute.h90" 78 # include "domzgr_substitute.h90" 79 76 80 !!---------------------------------------------------------------------- 77 81 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 81 85 CONTAINS 82 86 83 SUBROUTINE dyn_hpg( kt )87 SUBROUTINE dyn_hpg( kt, Kmm, puu, pvv, Krhs ) 84 88 !!--------------------------------------------------------------------- 85 89 !! *** ROUTINE dyn_hpg *** … … 88 92 !! using the scheme defined in the namelist 89 93 !! 90 !! ** Action : - Update ( ua,va) with the now hydrastatic pressure trend94 !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 91 95 !! - send trends to trd_dyn for futher diagnostics (l_trddyn=T) 92 96 !!---------------------------------------------------------------------- 93 INTEGER, INTENT(in) :: kt ! ocean time-step index 97 INTEGER , INTENT( in ) :: kt ! ocean time-step index 98 INTEGER , INTENT( in ) :: Kmm, Krhs ! ocean time level indices 99 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 100 ! 94 101 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv 95 102 !!---------------------------------------------------------------------- … … 97 104 IF( ln_timing ) CALL timing_start('dyn_hpg') 98 105 ! 99 IF( l_trddyn ) THEN ! Temporary saving of ua and vatrends (l_trddyn)106 IF( l_trddyn ) THEN ! Temporary saving of puu(:,:,:,Krhs) and pvv(:,:,:,Krhs) trends (l_trddyn) 100 107 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 101 ztrdu(:,:,:) = ua(:,:,:)102 ztrdv(:,:,:) = va(:,:,:)108 ztrdu(:,:,:) = puu(:,:,:,Krhs) 109 ztrdv(:,:,:) = pvv(:,:,:,Krhs) 103 110 ENDIF 104 111 ! 105 112 SELECT CASE ( nhpg ) ! Hydrostatic pressure gradient computation 106 CASE ( np_zco ) ; CALL hpg_zco ( kt )! z-coordinate107 CASE ( np_zps ) ; CALL hpg_zps ( kt )! z-coordinate plus partial steps (interpolation)108 CASE ( np_sco ) ; CALL hpg_sco ( kt )! s-coordinate (standard jacobian formulation)109 CASE ( np_djc ) ; CALL hpg_djc ( kt )! s-coordinate (Density Jacobian with Cubic polynomial)110 CASE ( np_prj ) ; CALL hpg_prj ( kt )! s-coordinate (Pressure Jacobian scheme)111 CASE ( np_isf ) ; CALL hpg_isf ( kt )! s-coordinate similar to sco modify for ice shelf113 CASE ( np_zco ) ; CALL hpg_zco ( kt, Kmm, puu, pvv, Krhs ) ! z-coordinate 114 CASE ( np_zps ) ; CALL hpg_zps ( kt, Kmm, puu, pvv, Krhs ) ! z-coordinate plus partial steps (interpolation) 115 CASE ( np_sco ) ; CALL hpg_sco ( kt, Kmm, puu, pvv, Krhs ) ! s-coordinate (standard jacobian formulation) 116 CASE ( np_djc ) ; CALL hpg_djc ( kt, Kmm, puu, pvv, Krhs ) ! s-coordinate (Density Jacobian with Cubic polynomial) 117 CASE ( np_prj ) ; CALL hpg_prj ( kt, Kmm, puu, pvv, Krhs ) ! s-coordinate (Pressure Jacobian scheme) 118 CASE ( np_isf ) ; CALL hpg_isf ( kt, Kmm, puu, pvv, Krhs ) ! s-coordinate similar to sco modify for ice shelf 112 119 END SELECT 113 120 ! 114 121 IF( l_trddyn ) THEN ! save the hydrostatic pressure gradient trends for momentum trend diagnostics 115 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)116 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)117 CALL trd_dyn( ztrdu, ztrdv, jpdyn_hpg, kt )122 ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 123 ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 124 CALL trd_dyn( ztrdu, ztrdv, jpdyn_hpg, kt, Kmm ) 118 125 DEALLOCATE( ztrdu , ztrdv ) 119 126 ENDIF 120 127 ! 121 IF( ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' hpg - Ua: ', mask1=umask, &122 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )128 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' hpg - Ua: ', mask1=umask, & 129 & tab3d_2=pvv(:,:,:,Krhs), clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 123 130 ! 124 131 IF( ln_timing ) CALL timing_stop('dyn_hpg') … … 127 134 128 135 129 SUBROUTINE dyn_hpg_init 136 SUBROUTINE dyn_hpg_init( Kmm ) 130 137 !!---------------------------------------------------------------------- 131 138 !! *** ROUTINE dyn_hpg_init *** … … 137 144 !! with the type of vertical coordinate used (zco, zps, sco) 138 145 !!---------------------------------------------------------------------- 146 INTEGER, INTENT( in ) :: Kmm ! ocean time level index 147 ! 139 148 INTEGER :: ioptio = 0 ! temporary integer 140 149 INTEGER :: ios ! Local integer output status for namelist read … … 150 159 !!---------------------------------------------------------------------- 151 160 ! 152 REWIND( numnam_ref ) ! Namelist namdyn_hpg in reference namelist : Hydrostatic pressure gradient153 161 READ ( numnam_ref, namdyn_hpg, IOSTAT = ios, ERR = 901) 154 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_hpg in reference namelist', lwp ) 155 ! 156 REWIND( numnam_cfg ) ! Namelist namdyn_hpg in configuration namelist : Hydrostatic pressure gradient 162 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_hpg in reference namelist' ) 163 ! 157 164 READ ( numnam_cfg, namdyn_hpg, IOSTAT = ios, ERR = 902 ) 158 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namdyn_hpg in configuration namelist' , lwp)165 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namdyn_hpg in configuration namelist' ) 159 166 IF(lwm) WRITE ( numond, namdyn_hpg ) 160 167 ! … … 213 220 ENDIF 214 221 ! 215 IF ( .NOT. ln_isfcav ) THEN !--- no ice shelf load216 riceload(:,:) = 0._wp217 !218 ELSE !--- set an ice shelf load219 !220 IF(lwp) WRITE(numout,*)221 IF(lwp) WRITE(numout,*) ' ice shelf case: set the ice-shelf load'222 ALLOCATE( zts_top(jpi,jpj,jpts) , zrhd(jpi,jpj,jpk) , zrhdtop_isf(jpi,jpj) , ziceload(jpi,jpj) )223 !224 znad = 1._wp !- To use density and not density anomaly225 !226 ! !- assume water displaced by the ice shelf is at T=-1.9 and S=34.4 (rude)227 zts_top(:,:,jp_tem) = -1.9_wp ; zts_top(:,:,jp_sal) = 34.4_wp228 !229 DO jk = 1, jpk !- compute density of the water displaced by the ice shelf230 CALL eos( zts_top(:,:,:), gdept_n(:,:,jk), zrhd(:,:,jk) )231 END DO232 !233 ! !- compute rhd at the ice/oce interface (ice shelf side)234 CALL eos( zts_top , risfdep, zrhdtop_isf )235 !236 ! !- Surface value + ice shelf gradient237 ziceload = 0._wp ! compute pressure due to ice shelf load238 DO jj = 1, jpj ! (used to compute hpgi/j for all the level from 1 to miku/v)239 DO ji = 1, jpi ! divided by 2 later240 ikt = mikt(ji,jj)241 ziceload(ji,jj) = ziceload(ji,jj) + (znad + zrhd(ji,jj,1) ) * e3w_n(ji,jj,1) * (1._wp - tmask(ji,jj,1))242 DO jk = 2, ikt-1243 ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhd(ji,jj,jk-1) + zrhd(ji,jj,jk)) * e3w_n(ji,jj,jk) &244 & * (1._wp - tmask(ji,jj,jk))245 END DO246 IF (ikt >= 2) ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhdtop_isf(ji,jj) + zrhd(ji,jj,ikt-1)) &247 & * ( risfdep(ji,jj) - gdept_n(ji,jj,ikt-1) )248 END DO249 END DO250 riceload(:,:) = ziceload(:,:) ! need to be saved for diaar5251 !252 DEALLOCATE( zts_top , zrhd , zrhdtop_isf , ziceload )253 ENDIF254 !255 222 END SUBROUTINE dyn_hpg_init 256 223 257 224 258 SUBROUTINE hpg_zco( kt )225 SUBROUTINE hpg_zco( kt, Kmm, puu, pvv, Krhs ) 259 226 !!--------------------------------------------------------------------- 260 227 !! *** ROUTINE hpg_zco *** … … 266 233 !! level: zhpi = grav ..... 267 234 !! zhpj = grav ..... 268 !! add it to the general momentum trend (ua,va). 269 !! ua = ua - 1/e1u * zhpi 270 !! va = va - 1/e2v * zhpj 271 !! 272 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 273 !!---------------------------------------------------------------------- 274 INTEGER, INTENT(in) :: kt ! ocean time-step index 235 !! add it to the general momentum trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)). 236 !! puu(:,:,:,Krhs) = puu(:,:,:,Krhs) - 1/e1u * zhpi 237 !! pvv(:,:,:,Krhs) = pvv(:,:,:,Krhs) - 1/e2v * zhpj 238 !! 239 !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 240 !!---------------------------------------------------------------------- 241 INTEGER , INTENT( in ) :: kt ! ocean time-step index 242 INTEGER , INTENT( in ) :: Kmm, Krhs ! ocean time level indices 243 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 275 244 ! 276 245 INTEGER :: ji, jj, jk ! dummy loop indices … … 288 257 289 258 ! Surface value 290 DO jj = 2, jpjm1 291 DO ji = fs_2, fs_jpim1 ! vector opt. 292 zcoef1 = zcoef0 * e3w_n(ji,jj,1) 293 ! hydrostatic pressure gradient 294 zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 295 zhpj(ji,jj,1) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 296 ! add to the general momentum trend 297 ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 298 va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) 299 END DO 300 END DO 259 DO_2D( 0, 0, 0, 0 ) 260 zcoef1 = zcoef0 * e3w(ji,jj,1,Kmm) 261 ! hydrostatic pressure gradient 262 zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 263 zhpj(ji,jj,1) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 264 ! add to the general momentum trend 265 puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) 266 pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) 267 END_2D 301 268 302 269 ! 303 270 ! interior value (2=<jk=<jpkm1) 304 DO jk = 2, jpkm1 305 DO jj = 2, jpjm1 306 DO ji = fs_2, fs_jpim1 ! vector opt. 307 zcoef1 = zcoef0 * e3w_n(ji,jj,jk) 308 ! hydrostatic pressure gradient 309 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) & 310 & + zcoef1 * ( ( rhd(ji+1,jj,jk)+rhd(ji+1,jj,jk-1) ) & 311 & - ( rhd(ji ,jj,jk)+rhd(ji ,jj,jk-1) ) ) * r1_e1u(ji,jj) 312 313 zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) & 314 & + zcoef1 * ( ( rhd(ji,jj+1,jk)+rhd(ji,jj+1,jk-1) ) & 315 & - ( rhd(ji,jj, jk)+rhd(ji,jj ,jk-1) ) ) * r1_e2v(ji,jj) 316 ! add to the general momentum trend 317 ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 318 va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) 319 END DO 320 END DO 321 END DO 271 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 272 zcoef1 = zcoef0 * e3w(ji,jj,jk,Kmm) 273 ! hydrostatic pressure gradient 274 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) & 275 & + zcoef1 * ( ( rhd(ji+1,jj,jk)+rhd(ji+1,jj,jk-1) ) & 276 & - ( rhd(ji ,jj,jk)+rhd(ji ,jj,jk-1) ) ) * r1_e1u(ji,jj) 277 278 zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) & 279 & + zcoef1 * ( ( rhd(ji,jj+1,jk)+rhd(ji,jj+1,jk-1) ) & 280 & - ( rhd(ji,jj, jk)+rhd(ji,jj ,jk-1) ) ) * r1_e2v(ji,jj) 281 ! add to the general momentum trend 282 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) 283 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) 284 END_3D 322 285 ! 323 286 END SUBROUTINE hpg_zco 324 287 325 288 326 SUBROUTINE hpg_zps( kt )289 SUBROUTINE hpg_zps( kt, Kmm, puu, pvv, Krhs ) 327 290 !!--------------------------------------------------------------------- 328 291 !! *** ROUTINE hpg_zps *** … … 330 293 !! ** Method : z-coordinate plus partial steps case. blahblah... 331 294 !! 332 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 333 !!---------------------------------------------------------------------- 334 INTEGER, INTENT(in) :: kt ! ocean time-step index 295 !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 296 !!---------------------------------------------------------------------- 297 INTEGER , INTENT( in ) :: kt ! ocean time-step index 298 INTEGER , INTENT( in ) :: Kmm, Krhs ! ocean time level indices 299 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 335 300 !! 336 301 INTEGER :: ji, jj, jk ! dummy loop indices … … 338 303 REAL(wp) :: zcoef0, zcoef1, zcoef2, zcoef3 ! temporary scalars 339 304 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhpi, zhpj 305 REAL(wp), DIMENSION(jpi,jpj) :: zgtsu, zgtsv, zgru, zgrv 340 306 !!---------------------------------------------------------------------- 341 307 ! … … 346 312 ENDIF 347 313 348 ! Partial steps: bottom beforehorizontal gradient of t, s, rd at the last ocean level349 !jc CALL zps_hde ( kt, jpts, tsn, gtsu, gtsv, rhd, gru ,grv )314 ! Partial steps: Compute NOW horizontal gradient of t, s, rd at the last ocean level 315 CALL zps_hde( kt, Kmm, jpts, ts(:,:,:,:,Kmm), zgtsu, zgtsv, rhd, zgru , zgrv ) 350 316 351 317 ! Local constant initialization … … 353 319 354 320 ! Surface value (also valid in partial step case) 355 DO jj = 2, jpjm1 356 DO ji = fs_2, fs_jpim1 ! vector opt. 357 zcoef1 = zcoef0 * e3w_n(ji,jj,1) 358 ! hydrostatic pressure gradient 359 zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj ,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 360 zhpj(ji,jj,1) = zcoef1 * ( rhd(ji ,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 361 ! add to the general momentum trend 362 ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 363 va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) 364 END DO 365 END DO 321 DO_2D( 0, 0, 0, 0 ) 322 zcoef1 = zcoef0 * e3w(ji,jj,1,Kmm) 323 ! hydrostatic pressure gradient 324 zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj ,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 325 zhpj(ji,jj,1) = zcoef1 * ( rhd(ji ,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 326 ! add to the general momentum trend 327 puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) 328 pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) 329 END_2D 366 330 367 331 ! interior value (2=<jk=<jpkm1) 368 DO jk = 2, jpkm1 369 DO jj = 2, jpjm1 370 DO ji = fs_2, fs_jpim1 ! vector opt. 371 zcoef1 = zcoef0 * e3w_n(ji,jj,jk) 372 ! hydrostatic pressure gradient 373 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) & 374 & + zcoef1 * ( ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) ) & 375 & - ( rhd(ji ,jj,jk) + rhd(ji ,jj,jk-1) ) ) * r1_e1u(ji,jj) 376 377 zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) & 378 & + zcoef1 * ( ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) ) & 379 & - ( rhd(ji,jj, jk) + rhd(ji,jj ,jk-1) ) ) * r1_e2v(ji,jj) 380 ! add to the general momentum trend 381 ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 382 va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) 383 END DO 384 END DO 385 END DO 386 387 ! partial steps correction at the last level (use gru & grv computed in zpshde.F90) 388 DO jj = 2, jpjm1 389 DO ji = 2, jpim1 390 iku = mbku(ji,jj) 391 ikv = mbkv(ji,jj) 392 zcoef2 = zcoef0 * MIN( e3w_n(ji,jj,iku), e3w_n(ji+1,jj ,iku) ) 393 zcoef3 = zcoef0 * MIN( e3w_n(ji,jj,ikv), e3w_n(ji ,jj+1,ikv) ) 394 IF( iku > 1 ) THEN ! on i-direction (level 2 or more) 395 ua (ji,jj,iku) = ua(ji,jj,iku) - zhpi(ji,jj,iku) ! subtract old value 396 zhpi(ji,jj,iku) = zhpi(ji,jj,iku-1) & ! compute the new one 397 & + zcoef2 * ( rhd(ji+1,jj,iku-1) - rhd(ji,jj,iku-1) + gru(ji,jj) ) * r1_e1u(ji,jj) 398 ua (ji,jj,iku) = ua(ji,jj,iku) + zhpi(ji,jj,iku) ! add the new one to the general momentum trend 399 ENDIF 400 IF( ikv > 1 ) THEN ! on j-direction (level 2 or more) 401 va (ji,jj,ikv) = va(ji,jj,ikv) - zhpj(ji,jj,ikv) ! subtract old value 402 zhpj(ji,jj,ikv) = zhpj(ji,jj,ikv-1) & ! compute the new one 403 & + zcoef3 * ( rhd(ji,jj+1,ikv-1) - rhd(ji,jj,ikv-1) + grv(ji,jj) ) * r1_e2v(ji,jj) 404 va (ji,jj,ikv) = va(ji,jj,ikv) + zhpj(ji,jj,ikv) ! add the new one to the general momentum trend 405 ENDIF 406 END DO 407 END DO 332 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 333 zcoef1 = zcoef0 * e3w(ji,jj,jk,Kmm) 334 ! hydrostatic pressure gradient 335 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) & 336 & + zcoef1 * ( ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) ) & 337 & - ( rhd(ji ,jj,jk) + rhd(ji ,jj,jk-1) ) ) * r1_e1u(ji,jj) 338 339 zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) & 340 & + zcoef1 * ( ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) ) & 341 & - ( rhd(ji,jj, jk) + rhd(ji,jj ,jk-1) ) ) * r1_e2v(ji,jj) 342 ! add to the general momentum trend 343 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) 344 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) 345 END_3D 346 347 ! partial steps correction at the last level (use zgru & zgrv computed in zpshde.F90) 348 DO_2D( 0, 0, 0, 0 ) 349 iku = mbku(ji,jj) 350 ikv = mbkv(ji,jj) 351 zcoef2 = zcoef0 * MIN( e3w(ji,jj,iku,Kmm), e3w(ji+1,jj ,iku,Kmm) ) 352 zcoef3 = zcoef0 * MIN( e3w(ji,jj,ikv,Kmm), e3w(ji ,jj+1,ikv,Kmm) ) 353 IF( iku > 1 ) THEN ! on i-direction (level 2 or more) 354 puu (ji,jj,iku,Krhs) = puu(ji,jj,iku,Krhs) - zhpi(ji,jj,iku) ! subtract old value 355 zhpi(ji,jj,iku) = zhpi(ji,jj,iku-1) & ! compute the new one 356 & + zcoef2 * ( rhd(ji+1,jj,iku-1) - rhd(ji,jj,iku-1) + zgru(ji,jj) ) * r1_e1u(ji,jj) 357 puu (ji,jj,iku,Krhs) = puu(ji,jj,iku,Krhs) + zhpi(ji,jj,iku) ! add the new one to the general momentum trend 358 ENDIF 359 IF( ikv > 1 ) THEN ! on j-direction (level 2 or more) 360 pvv (ji,jj,ikv,Krhs) = pvv(ji,jj,ikv,Krhs) - zhpj(ji,jj,ikv) ! subtract old value 361 zhpj(ji,jj,ikv) = zhpj(ji,jj,ikv-1) & ! compute the new one 362 & + zcoef3 * ( rhd(ji,jj+1,ikv-1) - rhd(ji,jj,ikv-1) + zgrv(ji,jj) ) * r1_e2v(ji,jj) 363 pvv (ji,jj,ikv,Krhs) = pvv(ji,jj,ikv,Krhs) + zhpj(ji,jj,ikv) ! add the new one to the general momentum trend 364 ENDIF 365 END_2D 408 366 ! 409 367 END SUBROUTINE hpg_zps 410 368 411 369 412 SUBROUTINE hpg_sco( kt )370 SUBROUTINE hpg_sco( kt, Kmm, puu, pvv, Krhs ) 413 371 !!--------------------------------------------------------------------- 414 372 !! *** ROUTINE hpg_sco *** … … 422 380 !! zhpi = grav ..... + 1/e1u mi(rhd) di[ grav dep3w ] 423 381 !! zhpj = grav ..... + 1/e2v mj(rhd) dj[ grav dep3w ] 424 !! add it to the general momentum trend (ua,va). 425 !! ua = ua - 1/e1u * zhpi 426 !! va = va - 1/e2v * zhpj 427 !! 428 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 429 !!---------------------------------------------------------------------- 430 INTEGER, INTENT(in) :: kt ! ocean time-step index 382 !! add it to the general momentum trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)). 383 !! puu(:,:,:,Krhs) = puu(:,:,:,Krhs) - 1/e1u * zhpi 384 !! pvv(:,:,:,Krhs) = pvv(:,:,:,Krhs) - 1/e2v * zhpj 385 !! 386 !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 387 !!---------------------------------------------------------------------- 388 INTEGER , INTENT( in ) :: kt ! ocean time-step index 389 INTEGER , INTENT( in ) :: Kmm, Krhs ! ocean time level indices 390 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 431 391 !! 432 392 INTEGER :: ji, jj, jk, jii, jjj ! dummy loop indices … … 451 411 ! 452 412 IF( ln_wd_il ) THEN 453 DO jj = 2, jpjm1 454 DO ji = 2, jpim1 455 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji+1,jj) ) > & 456 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) .AND. & 457 & MAX( sshn(ji,jj) + ht_0(ji,jj), sshn(ji+1,jj) + ht_0(ji+1,jj) ) & 458 & > rn_wdmin1 + rn_wdmin2 459 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji+1,jj) ) > 1.E-12 ) .AND. ( & 460 & MAX( sshn(ji,jj) , sshn(ji+1,jj) ) > & 461 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 462 463 IF(ll_tmp1) THEN 464 zcpx(ji,jj) = 1.0_wp 465 ELSE IF(ll_tmp2) THEN 466 ! no worries about sshn(ji+1,jj) - sshn(ji ,jj) = 0, it won't happen ! here 467 zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 468 & / (sshn(ji+1,jj) - sshn(ji ,jj)) ) 469 ELSE 470 zcpx(ji,jj) = 0._wp 471 END IF 472 473 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji,jj+1) ) > & 474 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) .AND. & 475 & MAX( sshn(ji,jj) + ht_0(ji,jj), sshn(ji,jj+1) + ht_0(ji,jj+1) ) & 476 & > rn_wdmin1 + rn_wdmin2 477 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji,jj+1) ) > 1.E-12 ) .AND. ( & 478 & MAX( sshn(ji,jj) , sshn(ji,jj+1) ) > & 479 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 480 481 IF(ll_tmp1) THEN 482 zcpy(ji,jj) = 1.0_wp 483 ELSE IF(ll_tmp2) THEN 484 ! no worries about sshn(ji,jj+1) - sshn(ji,jj ) = 0, it won't happen ! here 485 zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 486 & / (sshn(ji,jj+1) - sshn(ji,jj )) ) 487 ELSE 488 zcpy(ji,jj) = 0._wp 489 END IF 490 END DO 491 END DO 492 CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1., zcpy, 'V', 1. ) 413 DO_2D( 0, 0, 0, 0 ) 414 ll_tmp1 = MIN( ssh(ji,jj,Kmm) , ssh(ji+1,jj,Kmm) ) > & 415 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) .AND. & 416 & MAX( ssh(ji,jj,Kmm) + ht_0(ji,jj), ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) ) & 417 & > rn_wdmin1 + rn_wdmin2 418 ll_tmp2 = ( ABS( ssh(ji,jj,Kmm) - ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. ( & 419 & MAX( ssh(ji,jj,Kmm) , ssh(ji+1,jj,Kmm) ) > & 420 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 421 422 IF(ll_tmp1) THEN 423 zcpx(ji,jj) = 1.0_wp 424 ELSE IF(ll_tmp2) THEN 425 ! no worries about ssh(ji+1,jj,Kmm) - ssh(ji ,jj,Kmm) = 0, it won't happen ! here 426 zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 427 & / (ssh(ji+1,jj,Kmm) - ssh(ji ,jj,Kmm)) ) 428 ELSE 429 zcpx(ji,jj) = 0._wp 430 END IF 431 432 ll_tmp1 = MIN( ssh(ji,jj,Kmm) , ssh(ji,jj+1,Kmm) ) > & 433 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) .AND. & 434 & MAX( ssh(ji,jj,Kmm) + ht_0(ji,jj), ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) ) & 435 & > rn_wdmin1 + rn_wdmin2 436 ll_tmp2 = ( ABS( ssh(ji,jj,Kmm) - ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. ( & 437 & MAX( ssh(ji,jj,Kmm) , ssh(ji,jj+1,Kmm) ) > & 438 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 439 440 IF(ll_tmp1) THEN 441 zcpy(ji,jj) = 1.0_wp 442 ELSE IF(ll_tmp2) THEN 443 ! no worries about ssh(ji,jj+1,Kmm) - ssh(ji,jj ,Kmm) = 0, it won't happen ! here 444 zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 445 & / (ssh(ji,jj+1,Kmm) - ssh(ji,jj ,Kmm)) ) 446 ELSE 447 zcpy(ji,jj) = 0._wp 448 END IF 449 END_2D 450 CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1.0_wp, zcpy, 'V', 1.0_wp ) 493 451 END IF 494 452 495 453 ! Surface value 496 DO jj = 2, jpjm1 497 DO ji = fs_2, fs_jpim1 ! vector opt. 498 ! hydrostatic pressure gradient along s-surfaces 499 zhpi(ji,jj,1) = zcoef0 * ( e3w_n(ji+1,jj ,1) * ( znad + rhd(ji+1,jj ,1) ) & 500 & - e3w_n(ji ,jj ,1) * ( znad + rhd(ji ,jj ,1) ) ) * r1_e1u(ji,jj) 501 zhpj(ji,jj,1) = zcoef0 * ( e3w_n(ji ,jj+1,1) * ( znad + rhd(ji ,jj+1,1) ) & 502 & - e3w_n(ji ,jj ,1) * ( znad + rhd(ji ,jj ,1) ) ) * r1_e2v(ji,jj) 503 ! s-coordinate pressure gradient correction 504 zuap = -zcoef0 * ( rhd (ji+1,jj,1) + rhd (ji,jj,1) + 2._wp * znad ) & 505 & * ( gde3w_n(ji+1,jj,1) - gde3w_n(ji,jj,1) ) * r1_e1u(ji,jj) 506 zvap = -zcoef0 * ( rhd (ji,jj+1,1) + rhd (ji,jj,1) + 2._wp * znad ) & 507 & * ( gde3w_n(ji,jj+1,1) - gde3w_n(ji,jj,1) ) * r1_e2v(ji,jj) 508 ! 509 IF( ln_wd_il ) THEN 510 zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 511 zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj) 512 zuap = zuap * zcpx(ji,jj) 513 zvap = zvap * zcpy(ji,jj) 514 ENDIF 515 ! 516 ! add to the general momentum trend 517 ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap 518 va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) + zvap 519 END DO 520 END DO 454 DO_2D( 0, 0, 0, 0 ) 455 ! hydrostatic pressure gradient along s-surfaces 456 zhpi(ji,jj,1) = & 457 & zcoef0 * ( e3w(ji+1,jj ,1,Kmm) * ( znad + rhd(ji+1,jj ,1) ) & 458 & - e3w(ji ,jj ,1,Kmm) * ( znad + rhd(ji ,jj ,1) ) ) & 459 & * r1_e1u(ji,jj) 460 zhpj(ji,jj,1) = & 461 & zcoef0 * ( e3w(ji ,jj+1,1,Kmm) * ( znad + rhd(ji ,jj+1,1) ) & 462 & - e3w(ji ,jj ,1,Kmm) * ( znad + rhd(ji ,jj ,1) ) ) & 463 & * r1_e2v(ji,jj) 464 ! s-coordinate pressure gradient correction 465 zuap = -zcoef0 * ( rhd (ji+1,jj,1) + rhd (ji,jj,1) + 2._wp * znad ) & 466 & * ( gde3w(ji+1,jj,1) - gde3w(ji,jj,1) ) * r1_e1u(ji,jj) 467 zvap = -zcoef0 * ( rhd (ji,jj+1,1) + rhd (ji,jj,1) + 2._wp * znad ) & 468 & * ( gde3w(ji,jj+1,1) - gde3w(ji,jj,1) ) * r1_e2v(ji,jj) 469 ! 470 IF( ln_wd_il ) THEN 471 zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 472 zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj) 473 zuap = zuap * zcpx(ji,jj) 474 zvap = zvap * zcpy(ji,jj) 475 ENDIF 476 ! 477 ! add to the general momentum trend 478 puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) + zuap 479 pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) + zvap 480 END_2D 521 481 522 482 ! interior value (2=<jk=<jpkm1) 523 DO jk = 2, jpkm1 524 DO jj = 2, jpjm1 525 DO ji = fs_2, fs_jpim1 ! vector opt. 526 ! hydrostatic pressure gradient along s-surfaces 527 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 * r1_e1u(ji,jj) & 528 & * ( e3w_n(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad ) & 529 & - e3w_n(ji ,jj,jk) * ( rhd(ji ,jj,jk) + rhd(ji ,jj,jk-1) + 2*znad ) ) 530 zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 * r1_e2v(ji,jj) & 531 & * ( e3w_n(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad ) & 532 & - e3w_n(ji,jj ,jk) * ( rhd(ji,jj, jk) + rhd(ji,jj ,jk-1) + 2*znad ) ) 533 ! s-coordinate pressure gradient correction 534 zuap = -zcoef0 * ( rhd (ji+1,jj ,jk) + rhd (ji,jj,jk) + 2._wp * znad ) & 535 & * ( gde3w_n(ji+1,jj ,jk) - gde3w_n(ji,jj,jk) ) * r1_e1u(ji,jj) 536 zvap = -zcoef0 * ( rhd (ji ,jj+1,jk) + rhd (ji,jj,jk) + 2._wp * znad ) & 537 & * ( gde3w_n(ji ,jj+1,jk) - gde3w_n(ji,jj,jk) ) * r1_e2v(ji,jj) 538 ! 539 IF( ln_wd_il ) THEN 540 zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 541 zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj) 542 zuap = zuap * zcpx(ji,jj) 543 zvap = zvap * zcpy(ji,jj) 544 ENDIF 545 ! 546 ! add to the general momentum trend 547 ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) + zuap 548 va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) + zvap 549 END DO 550 END DO 551 END DO 483 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 484 ! hydrostatic pressure gradient along s-surfaces 485 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 * r1_e1u(ji,jj) & 486 & * ( e3w(ji+1,jj,jk,Kmm) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad ) & 487 & - e3w(ji ,jj,jk,Kmm) * ( rhd(ji ,jj,jk) + rhd(ji ,jj,jk-1) + 2*znad ) ) 488 zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 * r1_e2v(ji,jj) & 489 & * ( e3w(ji,jj+1,jk,Kmm) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad ) & 490 & - e3w(ji,jj ,jk,Kmm) * ( rhd(ji,jj, jk) + rhd(ji,jj ,jk-1) + 2*znad ) ) 491 ! s-coordinate pressure gradient correction 492 zuap = -zcoef0 * ( rhd (ji+1,jj ,jk) + rhd (ji,jj,jk) + 2._wp * znad ) & 493 & * ( gde3w(ji+1,jj ,jk) - gde3w(ji,jj,jk) ) * r1_e1u(ji,jj) 494 zvap = -zcoef0 * ( rhd (ji ,jj+1,jk) + rhd (ji,jj,jk) + 2._wp * znad ) & 495 & * ( gde3w(ji ,jj+1,jk) - gde3w(ji,jj,jk) ) * r1_e2v(ji,jj) 496 ! 497 IF( ln_wd_il ) THEN 498 zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 499 zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj) 500 zuap = zuap * zcpx(ji,jj) 501 zvap = zvap * zcpy(ji,jj) 502 ENDIF 503 ! 504 ! add to the general momentum trend 505 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) + zuap 506 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) + zvap 507 END_3D 552 508 ! 553 509 IF( ln_wd_il ) DEALLOCATE( zcpx , zcpy ) … … 556 512 557 513 558 SUBROUTINE hpg_isf( kt )514 SUBROUTINE hpg_isf( kt, Kmm, puu, pvv, Krhs ) 559 515 !!--------------------------------------------------------------------- 560 516 !! *** ROUTINE hpg_isf *** … … 568 524 !! zhpi = grav ..... + 1/e1u mi(rhd) di[ grav dep3w ] 569 525 !! zhpj = grav ..... + 1/e2v mj(rhd) dj[ grav dep3w ] 570 !! add it to the general momentum trend ( ua,va).571 !! ua = ua- 1/e1u * zhpi572 !! va = va- 1/e2v * zhpj573 !! iceload is added and partial cell case are added to the top and bottom526 !! add it to the general momentum trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)). 527 !! puu(:,:,:,Krhs) = puu(:,:,:,Krhs) - 1/e1u * zhpi 528 !! pvv(:,:,:,Krhs) = pvv(:,:,:,Krhs) - 1/e2v * zhpj 529 !! iceload is added 574 530 !! 575 !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 576 !!---------------------------------------------------------------------- 577 INTEGER, INTENT(in) :: kt ! ocean time-step index 531 !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 532 !!---------------------------------------------------------------------- 533 INTEGER , INTENT( in ) :: kt ! ocean time-step index 534 INTEGER , INTENT( in ) :: Kmm, Krhs ! ocean time level indices 535 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 578 536 !! 579 537 INTEGER :: ji, jj, jk, ikt, iktp1i, iktp1j ! dummy loop indices … … 596 554 DO jj = 1, jpj 597 555 ikt = mikt(ji,jj) 598 zts_top(ji,jj,1) = ts n(ji,jj,ikt,1)599 zts_top(ji,jj,2) = ts n(ji,jj,ikt,2)556 zts_top(ji,jj,1) = ts(ji,jj,ikt,1,Kmm) 557 zts_top(ji,jj,2) = ts(ji,jj,ikt,2,Kmm) 600 558 END DO 601 559 END DO … … 605 563 !===== Compute surface value ===================================================== 606 564 !================================================================================== 607 DO jj = 2, jpjm1 608 DO ji = fs_2, fs_jpim1 ! vector opt. 609 ikt = mikt(ji,jj) 610 iktp1i = mikt(ji+1,jj) 611 iktp1j = mikt(ji,jj+1) 612 ! hydrostatic pressure gradient along s-surfaces and ice shelf pressure 613 ! we assume ISF is in isostatic equilibrium 614 zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( 0.5_wp * e3w_n(ji+1,jj,iktp1i) & 615 & * ( 2._wp * znad + rhd(ji+1,jj,iktp1i) + zrhdtop_oce(ji+1,jj) ) & 616 & - 0.5_wp * e3w_n(ji,jj,ikt) & 617 & * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) ) & 618 & + ( riceload(ji+1,jj) - riceload(ji,jj)) ) 619 zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( 0.5_wp * e3w_n(ji,jj+1,iktp1j) & 620 & * ( 2._wp * znad + rhd(ji,jj+1,iktp1j) + zrhdtop_oce(ji,jj+1) ) & 621 & - 0.5_wp * e3w_n(ji,jj,ikt) & 622 & * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) ) & 623 & + ( riceload(ji,jj+1) - riceload(ji,jj)) ) 624 ! s-coordinate pressure gradient correction (=0 if z coordinate) 625 zuap = -zcoef0 * ( rhd (ji+1,jj,1) + rhd (ji,jj,1) + 2._wp * znad ) & 626 & * ( gde3w_n(ji+1,jj,1) - gde3w_n(ji,jj,1) ) * r1_e1u(ji,jj) 627 zvap = -zcoef0 * ( rhd (ji,jj+1,1) + rhd (ji,jj,1) + 2._wp * znad ) & 628 & * ( gde3w_n(ji,jj+1,1) - gde3w_n(ji,jj,1) ) * r1_e2v(ji,jj) 629 ! add to the general momentum trend 630 ua(ji,jj,1) = ua(ji,jj,1) + (zhpi(ji,jj,1) + zuap) * umask(ji,jj,1) 631 va(ji,jj,1) = va(ji,jj,1) + (zhpj(ji,jj,1) + zvap) * vmask(ji,jj,1) 632 END DO 633 END DO 565 DO_2D( 0, 0, 0, 0 ) 566 ikt = mikt(ji,jj) 567 iktp1i = mikt(ji+1,jj) 568 iktp1j = mikt(ji,jj+1) 569 ! hydrostatic pressure gradient along s-surfaces and ice shelf pressure 570 ! we assume ISF is in isostatic equilibrium 571 zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( 0.5_wp * e3w(ji+1,jj,iktp1i,Kmm) & 572 & * ( 2._wp * znad + rhd(ji+1,jj,iktp1i) + zrhdtop_oce(ji+1,jj) ) & 573 & - 0.5_wp * e3w(ji,jj,ikt,Kmm) & 574 & * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) ) & 575 & + ( risfload(ji+1,jj) - risfload(ji,jj)) ) 576 zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( 0.5_wp * e3w(ji,jj+1,iktp1j,Kmm) & 577 & * ( 2._wp * znad + rhd(ji,jj+1,iktp1j) + zrhdtop_oce(ji,jj+1) ) & 578 & - 0.5_wp * e3w(ji,jj,ikt,Kmm) & 579 & * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) ) & 580 & + ( risfload(ji,jj+1) - risfload(ji,jj)) ) 581 ! s-coordinate pressure gradient correction (=0 if z coordinate) 582 zuap = -zcoef0 * ( rhd (ji+1,jj,1) + rhd (ji,jj,1) + 2._wp * znad ) & 583 & * ( gde3w(ji+1,jj,1) - gde3w(ji,jj,1) ) * r1_e1u(ji,jj) 584 zvap = -zcoef0 * ( rhd (ji,jj+1,1) + rhd (ji,jj,1) + 2._wp * znad ) & 585 & * ( gde3w(ji,jj+1,1) - gde3w(ji,jj,1) ) * r1_e2v(ji,jj) 586 ! add to the general momentum trend 587 puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + (zhpi(ji,jj,1) + zuap) * umask(ji,jj,1) 588 pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + (zhpj(ji,jj,1) + zvap) * vmask(ji,jj,1) 589 END_2D 634 590 !================================================================================== 635 591 !===== Compute interior value ===================================================== 636 592 !================================================================================== 637 593 ! interior value (2=<jk=<jpkm1) 638 DO jk = 2, jpkm1639 DO jj = 2, jpjm1640 DO ji = fs_2, fs_jpim1 ! vector opt.641 ! hydrostatic pressure gradient along s-surfaces642 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj) &643 & * ( e3w_n(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad ) * wmask(ji+1,jj,jk)&644 & - e3w_n(ji ,jj,jk)* ( rhd(ji ,jj,jk) + rhd(ji ,jj,jk-1) + 2*znad ) * wmask(ji ,jj,jk) )645 646 & * ( e3w_n(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad ) * wmask(ji,jj+1,jk)&647 & - e3w_n(ji,jj ,jk) * ( rhd(ji,jj, jk) + rhd(ji,jj ,jk-1) + 2*znad ) * wmask(ji,jj ,jk) )648 ! s-coordinate pressure gradient correction649 zuap = -zcoef0 * ( rhd (ji+1,jj ,jk) + rhd (ji,jj,jk) + 2._wp * znad ) &650 & * ( gde3w_n(ji+1,jj ,jk) - gde3w_n(ji,jj,jk) ) / e1u(ji,jj)651 zvap = -zcoef0 * ( rhd (ji ,jj+1,jk) + rhd (ji,jj,jk) + 2._wp * znad ) &652 & * ( gde3w_n(ji ,jj+1,jk) - gde3w_n(ji,jj,jk) ) / e2v(ji,jj)653 ! add to the general momentum trend654 ua(ji,jj,jk) = ua(ji,jj,jk) + (zhpi(ji,jj,jk) + zuap) * umask(ji,jj,jk)655 va(ji,jj,jk) = va(ji,jj,jk) + (zhpj(ji,jj,jk) + zvap) * vmask(ji,jj,jk)656 END DO657 END DO658 END DO594 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 595 ! hydrostatic pressure gradient along s-surfaces 596 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj) & 597 & * ( e3w(ji+1,jj,jk,Kmm) & 598 & * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad ) * wmask(ji+1,jj,jk) & 599 & - e3w(ji ,jj,jk,Kmm) & 600 & * ( rhd(ji ,jj,jk) + rhd(ji ,jj,jk-1) + 2*znad ) * wmask(ji ,jj,jk) ) 601 zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 / e2v(ji,jj) & 602 & * ( e3w(ji,jj+1,jk,Kmm) & 603 & * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad ) * wmask(ji,jj+1,jk) & 604 & - e3w(ji,jj ,jk,Kmm) & 605 & * ( rhd(ji,jj, jk) + rhd(ji,jj ,jk-1) + 2*znad ) * wmask(ji,jj ,jk) ) 606 ! s-coordinate pressure gradient correction 607 zuap = -zcoef0 * ( rhd (ji+1,jj ,jk) + rhd (ji,jj,jk) + 2._wp * znad ) & 608 & * ( gde3w(ji+1,jj ,jk) - gde3w(ji,jj,jk) ) / e1u(ji,jj) 609 zvap = -zcoef0 * ( rhd (ji ,jj+1,jk) + rhd (ji,jj,jk) + 2._wp * znad ) & 610 & * ( gde3w(ji ,jj+1,jk) - gde3w(ji,jj,jk) ) / e2v(ji,jj) 611 ! add to the general momentum trend 612 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zhpi(ji,jj,jk) + zuap) * umask(ji,jj,jk) 613 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zhpj(ji,jj,jk) + zvap) * vmask(ji,jj,jk) 614 END_3D 659 615 ! 660 616 END SUBROUTINE hpg_isf 661 617 662 618 663 SUBROUTINE hpg_djc( kt )619 SUBROUTINE hpg_djc( kt, Kmm, puu, pvv, Krhs ) 664 620 !!--------------------------------------------------------------------- 665 621 !! *** ROUTINE hpg_djc *** … … 669 625 !! Reference: Shchepetkin and McWilliams, J. Geophys. Res., 108(C3), 3090, 2003 670 626 !!---------------------------------------------------------------------- 671 INTEGER, INTENT(in) :: kt ! ocean time-step index 627 INTEGER , INTENT( in ) :: kt ! ocean time-step index 628 INTEGER , INTENT( in ) :: Kmm, Krhs ! ocean time level indices 629 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 672 630 !! 673 631 INTEGER :: ji, jj, jk ! dummy loop indices … … 685 643 IF( ln_wd_il ) THEN 686 644 ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 687 DO jj = 2, jpjm1 688 DO ji = 2, jpim1 689 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji+1,jj) ) > & 690 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) .AND. & 691 & MAX( sshn(ji,jj) + ht_0(ji,jj), sshn(ji+1,jj) + ht_0(ji+1,jj) ) & 692 & > rn_wdmin1 + rn_wdmin2 693 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji+1,jj) ) > 1.E-12 ) .AND. ( & 694 & MAX( sshn(ji,jj) , sshn(ji+1,jj) ) > & 695 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 696 IF(ll_tmp1) THEN 697 zcpx(ji,jj) = 1.0_wp 698 ELSE IF(ll_tmp2) THEN 699 ! no worries about sshn(ji+1,jj) - sshn(ji ,jj) = 0, it won't happen ! here 700 zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 701 & / (sshn(ji+1,jj) - sshn(ji ,jj)) ) 702 ELSE 703 zcpx(ji,jj) = 0._wp 704 END IF 705 706 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji,jj+1) ) > & 707 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) .AND. & 708 & MAX( sshn(ji,jj) + ht_0(ji,jj), sshn(ji,jj+1) + ht_0(ji,jj+1) ) & 709 & > rn_wdmin1 + rn_wdmin2 710 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji,jj+1) ) > 1.E-12 ) .AND. ( & 711 & MAX( sshn(ji,jj) , sshn(ji,jj+1) ) > & 712 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 713 714 IF(ll_tmp1) THEN 715 zcpy(ji,jj) = 1.0_wp 716 ELSE IF(ll_tmp2) THEN 717 ! no worries about sshn(ji,jj+1) - sshn(ji,jj ) = 0, it won't happen ! here 718 zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 719 & / (sshn(ji,jj+1) - sshn(ji,jj )) ) 720 ELSE 721 zcpy(ji,jj) = 0._wp 722 END IF 723 END DO 724 END DO 725 CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1., zcpy, 'V', 1. ) 645 DO_2D( 0, 0, 0, 0 ) 646 ll_tmp1 = MIN( ssh(ji,jj,Kmm) , ssh(ji+1,jj,Kmm) ) > & 647 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) .AND. & 648 & MAX( ssh(ji,jj,Kmm) + ht_0(ji,jj), ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) ) & 649 & > rn_wdmin1 + rn_wdmin2 650 ll_tmp2 = ( ABS( ssh(ji,jj,Kmm) - ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. ( & 651 & MAX( ssh(ji,jj,Kmm) , ssh(ji+1,jj,Kmm) ) > & 652 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 653 IF(ll_tmp1) THEN 654 zcpx(ji,jj) = 1.0_wp 655 ELSE IF(ll_tmp2) THEN 656 ! no worries about ssh(ji+1,jj,Kmm) - ssh(ji ,jj,Kmm) = 0, it won't happen ! here 657 zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 658 & / (ssh(ji+1,jj,Kmm) - ssh(ji ,jj,Kmm)) ) 659 ELSE 660 zcpx(ji,jj) = 0._wp 661 END IF 662 663 ll_tmp1 = MIN( ssh(ji,jj,Kmm) , ssh(ji,jj+1,Kmm) ) > & 664 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) .AND. & 665 & MAX( ssh(ji,jj,Kmm) + ht_0(ji,jj), ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) ) & 666 & > rn_wdmin1 + rn_wdmin2 667 ll_tmp2 = ( ABS( ssh(ji,jj,Kmm) - ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. ( & 668 & MAX( ssh(ji,jj,Kmm) , ssh(ji,jj+1,Kmm) ) > & 669 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 670 671 IF(ll_tmp1) THEN 672 zcpy(ji,jj) = 1.0_wp 673 ELSE IF(ll_tmp2) THEN 674 ! no worries about ssh(ji,jj+1,Kmm) - ssh(ji,jj ,Kmm) = 0, it won't happen ! here 675 zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 676 & / (ssh(ji,jj+1,Kmm) - ssh(ji,jj ,Kmm)) ) 677 ELSE 678 zcpy(ji,jj) = 0._wp 679 END IF 680 END_2D 681 CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1.0_wp, zcpy, 'V', 1.0_wp ) 726 682 END IF 727 683 … … 743 699 !!bug gm Not a true bug, but... dzz=e3w for dzx, dzy verify what it is really 744 700 745 DO jk = 2, jpkm1 746 DO jj = 2, jpjm1 747 DO ji = fs_2, fs_jpim1 ! vector opt. 748 drhoz(ji,jj,jk) = rhd (ji ,jj ,jk) - rhd (ji,jj,jk-1) 749 dzz (ji,jj,jk) = gde3w_n(ji ,jj ,jk) - gde3w_n(ji,jj,jk-1) 750 drhox(ji,jj,jk) = rhd (ji+1,jj ,jk) - rhd (ji,jj,jk ) 751 dzx (ji,jj,jk) = gde3w_n(ji+1,jj ,jk) - gde3w_n(ji,jj,jk ) 752 drhoy(ji,jj,jk) = rhd (ji ,jj+1,jk) - rhd (ji,jj,jk ) 753 dzy (ji,jj,jk) = gde3w_n(ji ,jj+1,jk) - gde3w_n(ji,jj,jk ) 754 END DO 755 END DO 756 END DO 701 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 702 drhoz(ji,jj,jk) = rhd (ji ,jj ,jk) - rhd (ji,jj,jk-1) 703 dzz (ji,jj,jk) = gde3w(ji ,jj ,jk) - gde3w(ji,jj,jk-1) 704 drhox(ji,jj,jk) = rhd (ji+1,jj ,jk) - rhd (ji,jj,jk ) 705 dzx (ji,jj,jk) = gde3w(ji+1,jj ,jk) - gde3w(ji,jj,jk ) 706 drhoy(ji,jj,jk) = rhd (ji ,jj+1,jk) - rhd (ji,jj,jk ) 707 dzy (ji,jj,jk) = gde3w(ji ,jj+1,jk) - gde3w(ji,jj,jk ) 708 END_3D 757 709 758 710 !------------------------------------------------------------------------- … … 764 716 !!bug gm idem for drhox, drhoy et ji=jpi and jj=jpj 765 717 766 DO jk = 2, jpkm1 767 DO jj = 2, jpjm1 768 DO ji = fs_2, fs_jpim1 ! vector opt. 769 cffw = 2._wp * drhoz(ji ,jj ,jk) * drhoz(ji,jj,jk-1) 770 771 cffu = 2._wp * drhox(ji+1,jj ,jk) * drhox(ji,jj,jk ) 772 cffx = 2._wp * dzx (ji+1,jj ,jk) * dzx (ji,jj,jk ) 773 774 cffv = 2._wp * drhoy(ji ,jj+1,jk) * drhoy(ji,jj,jk ) 775 cffy = 2._wp * dzy (ji ,jj+1,jk) * dzy (ji,jj,jk ) 776 777 IF( cffw > zep) THEN 778 drhow(ji,jj,jk) = 2._wp * drhoz(ji,jj,jk) * drhoz(ji,jj,jk-1) & 779 & / ( drhoz(ji,jj,jk) + drhoz(ji,jj,jk-1) ) 780 ELSE 781 drhow(ji,jj,jk) = 0._wp 782 ENDIF 783 784 dzw(ji,jj,jk) = 2._wp * dzz(ji,jj,jk) * dzz(ji,jj,jk-1) & 785 & / ( dzz(ji,jj,jk) + dzz(ji,jj,jk-1) ) 786 787 IF( cffu > zep ) THEN 788 drhou(ji,jj,jk) = 2._wp * drhox(ji+1,jj,jk) * drhox(ji,jj,jk) & 789 & / ( drhox(ji+1,jj,jk) + drhox(ji,jj,jk) ) 790 ELSE 791 drhou(ji,jj,jk ) = 0._wp 792 ENDIF 793 794 IF( cffx > zep ) THEN 795 dzu(ji,jj,jk) = 2._wp * dzx(ji+1,jj,jk) * dzx(ji,jj,jk) & 796 & / ( dzx(ji+1,jj,jk) + dzx(ji,jj,jk) ) 797 ELSE 798 dzu(ji,jj,jk) = 0._wp 799 ENDIF 800 801 IF( cffv > zep ) THEN 802 drhov(ji,jj,jk) = 2._wp * drhoy(ji,jj+1,jk) * drhoy(ji,jj,jk) & 803 & / ( drhoy(ji,jj+1,jk) + drhoy(ji,jj,jk) ) 804 ELSE 805 drhov(ji,jj,jk) = 0._wp 806 ENDIF 807 808 IF( cffy > zep ) THEN 809 dzv(ji,jj,jk) = 2._wp * dzy(ji,jj+1,jk) * dzy(ji,jj,jk) & 810 & / ( dzy(ji,jj+1,jk) + dzy(ji,jj,jk) ) 811 ELSE 812 dzv(ji,jj,jk) = 0._wp 813 ENDIF 814 815 END DO 816 END DO 817 END DO 718 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 719 cffw = 2._wp * drhoz(ji ,jj ,jk) * drhoz(ji,jj,jk-1) 720 721 cffu = 2._wp * drhox(ji+1,jj ,jk) * drhox(ji,jj,jk ) 722 cffx = 2._wp * dzx (ji+1,jj ,jk) * dzx (ji,jj,jk ) 723 724 cffv = 2._wp * drhoy(ji ,jj+1,jk) * drhoy(ji,jj,jk ) 725 cffy = 2._wp * dzy (ji ,jj+1,jk) * dzy (ji,jj,jk ) 726 727 IF( cffw > zep) THEN 728 drhow(ji,jj,jk) = 2._wp * drhoz(ji,jj,jk) * drhoz(ji,jj,jk-1) & 729 & / ( drhoz(ji,jj,jk) + drhoz(ji,jj,jk-1) ) 730 ELSE 731 drhow(ji,jj,jk) = 0._wp 732 ENDIF 733 734 dzw(ji,jj,jk) = 2._wp * dzz(ji,jj,jk) * dzz(ji,jj,jk-1) & 735 & / ( dzz(ji,jj,jk) + dzz(ji,jj,jk-1) ) 736 737 IF( cffu > zep ) THEN 738 drhou(ji,jj,jk) = 2._wp * drhox(ji+1,jj,jk) * drhox(ji,jj,jk) & 739 & / ( drhox(ji+1,jj,jk) + drhox(ji,jj,jk) ) 740 ELSE 741 drhou(ji,jj,jk ) = 0._wp 742 ENDIF 743 744 IF( cffx > zep ) THEN 745 dzu(ji,jj,jk) = 2._wp * dzx(ji+1,jj,jk) * dzx(ji,jj,jk) & 746 & / ( dzx(ji+1,jj,jk) + dzx(ji,jj,jk) ) 747 ELSE 748 dzu(ji,jj,jk) = 0._wp 749 ENDIF 750 751 IF( cffv > zep ) THEN 752 drhov(ji,jj,jk) = 2._wp * drhoy(ji,jj+1,jk) * drhoy(ji,jj,jk) & 753 & / ( drhoy(ji,jj+1,jk) + drhoy(ji,jj,jk) ) 754 ELSE 755 drhov(ji,jj,jk) = 0._wp 756 ENDIF 757 758 IF( cffy > zep ) THEN 759 dzv(ji,jj,jk) = 2._wp * dzy(ji,jj+1,jk) * dzy(ji,jj,jk) & 760 & / ( dzy(ji,jj+1,jk) + dzy(ji,jj,jk) ) 761 ELSE 762 dzv(ji,jj,jk) = 0._wp 763 ENDIF 764 765 END_3D 818 766 819 767 !---------------------------------------------------------------------------------- … … 833 781 !------------------------------------------------------------- 834 782 835 !!bug gm : e3w-gde3w = 0.5*e3w .... and gde3w(2)-gde3w(1)=e3w(2) .... to be verified 836 ! true if gde3w is really defined as the sum of the e3w scale factors as, it seems to me, it should be 837 838 DO jj = 2, jpjm1 839 DO ji = fs_2, fs_jpim1 ! vector opt. 840 rho_k(ji,jj,1) = -grav * ( e3w_n(ji,jj,1) - gde3w_n(ji,jj,1) ) & 841 & * ( rhd(ji,jj,1) & 842 & + 0.5_wp * ( rhd (ji,jj,2) - rhd (ji,jj,1) ) & 843 & * ( e3w_n (ji,jj,1) - gde3w_n(ji,jj,1) ) & 844 & / ( gde3w_n(ji,jj,2) - gde3w_n(ji,jj,1) ) ) 845 END DO 846 END DO 783 !!bug gm : e3w-gde3w(:,:,:) = 0.5*e3w .... and gde3w(:,:,2)-gde3w(:,:,1)=e3w(:,:,2,Kmm) .... to be verified 784 ! true if gde3w(:,:,:) is really defined as the sum of the e3w scale factors as, it seems to me, it should be 785 786 DO_2D( 0, 0, 0, 0 ) 787 rho_k(ji,jj,1) = -grav * ( e3w(ji,jj,1,Kmm) - gde3w(ji,jj,1) ) & 788 & * ( rhd(ji,jj,1) & 789 & + 0.5_wp * ( rhd (ji,jj,2) - rhd (ji,jj,1) ) & 790 & * ( e3w (ji,jj,1,Kmm) - gde3w(ji,jj,1) ) & 791 & / ( gde3w(ji,jj,2) - gde3w(ji,jj,1) ) ) 792 END_2D 847 793 848 794 !!bug gm : here also, simplification is possible 849 795 !!bug gm : optimisation: 1/10 and 1/12 the division should be done before the loop 850 796 851 DO jk = 2, jpkm1 852 DO jj = 2, jpjm1 853 DO ji = fs_2, fs_jpim1 ! vector opt. 854 855 rho_k(ji,jj,jk) = zcoef0 * ( rhd (ji,jj,jk) + rhd (ji,jj,jk-1) ) & 856 & * ( gde3w_n(ji,jj,jk) - gde3w_n(ji,jj,jk-1) ) & 857 & - grav * z1_10 * ( & 858 & ( drhow (ji,jj,jk) - drhow (ji,jj,jk-1) ) & 859 & * ( gde3w_n(ji,jj,jk) - gde3w_n(ji,jj,jk-1) - z1_12 * ( dzw (ji,jj,jk) + dzw (ji,jj,jk-1) ) ) & 860 & - ( dzw (ji,jj,jk) - dzw (ji,jj,jk-1) ) & 861 & * ( rhd (ji,jj,jk) - rhd (ji,jj,jk-1) - z1_12 * ( drhow(ji,jj,jk) + drhow(ji,jj,jk-1) ) ) & 862 & ) 863 864 rho_i(ji,jj,jk) = zcoef0 * ( rhd (ji+1,jj,jk) + rhd (ji,jj,jk) ) & 865 & * ( gde3w_n(ji+1,jj,jk) - gde3w_n(ji,jj,jk) ) & 866 & - grav* z1_10 * ( & 867 & ( drhou (ji+1,jj,jk) - drhou (ji,jj,jk) ) & 868 & * ( gde3w_n(ji+1,jj,jk) - gde3w_n(ji,jj,jk) - z1_12 * ( dzu (ji+1,jj,jk) + dzu (ji,jj,jk) ) ) & 869 & - ( dzu (ji+1,jj,jk) - dzu (ji,jj,jk) ) & 870 & * ( rhd (ji+1,jj,jk) - rhd (ji,jj,jk) - z1_12 * ( drhou(ji+1,jj,jk) + drhou(ji,jj,jk) ) ) & 871 & ) 872 873 rho_j(ji,jj,jk) = zcoef0 * ( rhd (ji,jj+1,jk) + rhd (ji,jj,jk) ) & 874 & * ( gde3w_n(ji,jj+1,jk) - gde3w_n(ji,jj,jk) ) & 875 & - grav* z1_10 * ( & 876 & ( drhov (ji,jj+1,jk) - drhov (ji,jj,jk) ) & 877 & * ( gde3w_n(ji,jj+1,jk) - gde3w_n(ji,jj,jk) - z1_12 * ( dzv (ji,jj+1,jk) + dzv (ji,jj,jk) ) ) & 878 & - ( dzv (ji,jj+1,jk) - dzv (ji,jj,jk) ) & 879 & * ( rhd (ji,jj+1,jk) - rhd (ji,jj,jk) - z1_12 * ( drhov(ji,jj+1,jk) + drhov(ji,jj,jk) ) ) & 880 & ) 881 882 END DO 883 END DO 884 END DO 885 CALL lbc_lnk_multi( 'dynhpg', rho_k, 'W', 1., rho_i, 'U', 1., rho_j, 'V', 1. ) 797 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 798 799 rho_k(ji,jj,jk) = zcoef0 * ( rhd (ji,jj,jk) + rhd (ji,jj,jk-1) ) & 800 & * ( gde3w(ji,jj,jk) - gde3w(ji,jj,jk-1) ) & 801 & - grav * z1_10 * ( & 802 & ( drhow (ji,jj,jk) - drhow (ji,jj,jk-1) ) & 803 & * ( gde3w(ji,jj,jk) - gde3w(ji,jj,jk-1) - z1_12 * ( dzw (ji,jj,jk) + dzw (ji,jj,jk-1) ) ) & 804 & - ( dzw (ji,jj,jk) - dzw (ji,jj,jk-1) ) & 805 & * ( rhd (ji,jj,jk) - rhd (ji,jj,jk-1) - z1_12 * ( drhow(ji,jj,jk) + drhow(ji,jj,jk-1) ) ) & 806 & ) 807 808 rho_i(ji,jj,jk) = zcoef0 * ( rhd (ji+1,jj,jk) + rhd (ji,jj,jk) ) & 809 & * ( gde3w(ji+1,jj,jk) - gde3w(ji,jj,jk) ) & 810 & - grav* z1_10 * ( & 811 & ( drhou (ji+1,jj,jk) - drhou (ji,jj,jk) ) & 812 & * ( gde3w(ji+1,jj,jk) - gde3w(ji,jj,jk) - z1_12 * ( dzu (ji+1,jj,jk) + dzu (ji,jj,jk) ) ) & 813 & - ( dzu (ji+1,jj,jk) - dzu (ji,jj,jk) ) & 814 & * ( rhd (ji+1,jj,jk) - rhd (ji,jj,jk) - z1_12 * ( drhou(ji+1,jj,jk) + drhou(ji,jj,jk) ) ) & 815 & ) 816 817 rho_j(ji,jj,jk) = zcoef0 * ( rhd (ji,jj+1,jk) + rhd (ji,jj,jk) ) & 818 & * ( gde3w(ji,jj+1,jk) - gde3w(ji,jj,jk) ) & 819 & - grav* z1_10 * ( & 820 & ( drhov (ji,jj+1,jk) - drhov (ji,jj,jk) ) & 821 & * ( gde3w(ji,jj+1,jk) - gde3w(ji,jj,jk) - z1_12 * ( dzv (ji,jj+1,jk) + dzv (ji,jj,jk) ) ) & 822 & - ( dzv (ji,jj+1,jk) - dzv (ji,jj,jk) ) & 823 & * ( rhd (ji,jj+1,jk) - rhd (ji,jj,jk) - z1_12 * ( drhov(ji,jj+1,jk) + drhov(ji,jj,jk) ) ) & 824 & ) 825 826 END_3D 827 CALL lbc_lnk_multi( 'dynhpg', rho_k, 'W', 1.0_wp, rho_i, 'U', 1.0_wp, rho_j, 'V', 1.0_wp ) 886 828 887 829 ! --------------- 888 830 ! Surface value 889 831 ! --------------- 890 DO jj = 2, jpjm1 891 DO ji = fs_2, fs_jpim1 ! vector opt. 892 zhpi(ji,jj,1) = ( rho_k(ji+1,jj ,1) - rho_k(ji,jj,1) - rho_i(ji,jj,1) ) * r1_e1u(ji,jj) 893 zhpj(ji,jj,1) = ( rho_k(ji ,jj+1,1) - rho_k(ji,jj,1) - rho_j(ji,jj,1) ) * r1_e2v(ji,jj) 894 IF( ln_wd_il ) THEN 895 zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 896 zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj) 897 ENDIF 898 ! add to the general momentum trend 899 ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 900 va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) 901 END DO 902 END DO 832 DO_2D( 0, 0, 0, 0 ) 833 zhpi(ji,jj,1) = ( rho_k(ji+1,jj ,1) - rho_k(ji,jj,1) - rho_i(ji,jj,1) ) * r1_e1u(ji,jj) 834 zhpj(ji,jj,1) = ( rho_k(ji ,jj+1,1) - rho_k(ji,jj,1) - rho_j(ji,jj,1) ) * r1_e2v(ji,jj) 835 IF( ln_wd_il ) THEN 836 zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 837 zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj) 838 ENDIF 839 ! add to the general momentum trend 840 puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) 841 pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) 842 END_2D 903 843 904 844 ! ---------------- 905 845 ! interior value (2=<jk=<jpkm1) 906 846 ! ---------------- 907 DO jk = 2, jpkm1 908 DO jj = 2, jpjm1 909 DO ji = fs_2, fs_jpim1 ! vector opt. 910 ! hydrostatic pressure gradient along s-surfaces 911 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) & 912 & + ( ( rho_k(ji+1,jj,jk) - rho_k(ji,jj,jk ) ) & 913 & - ( rho_i(ji ,jj,jk) - rho_i(ji,jj,jk-1) ) ) * r1_e1u(ji,jj) 914 zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) & 915 & + ( ( rho_k(ji,jj+1,jk) - rho_k(ji,jj,jk ) ) & 916 & -( rho_j(ji,jj ,jk) - rho_j(ji,jj,jk-1) ) ) * r1_e2v(ji,jj) 917 IF( ln_wd_il ) THEN 918 zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 919 zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj) 920 ENDIF 921 ! add to the general momentum trend 922 ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 923 va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) 924 END DO 925 END DO 926 END DO 847 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 848 ! hydrostatic pressure gradient along s-surfaces 849 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) & 850 & + ( ( rho_k(ji+1,jj,jk) - rho_k(ji,jj,jk ) ) & 851 & - ( rho_i(ji ,jj,jk) - rho_i(ji,jj,jk-1) ) ) * r1_e1u(ji,jj) 852 zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) & 853 & + ( ( rho_k(ji,jj+1,jk) - rho_k(ji,jj,jk ) ) & 854 & -( rho_j(ji,jj ,jk) - rho_j(ji,jj,jk-1) ) ) * r1_e2v(ji,jj) 855 IF( ln_wd_il ) THEN 856 zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 857 zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj) 858 ENDIF 859 ! add to the general momentum trend 860 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) 861 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) 862 END_3D 927 863 ! 928 864 IF( ln_wd_il ) DEALLOCATE( zcpx, zcpy ) … … 931 867 932 868 933 SUBROUTINE hpg_prj( kt )869 SUBROUTINE hpg_prj( kt, Kmm, puu, pvv, Krhs ) 934 870 !!--------------------------------------------------------------------- 935 871 !! *** ROUTINE hpg_prj *** … … 940 876 !! all vertical coordinate systems 941 877 !! 942 !! ** Action : - Update ( ua,va) with the now hydrastatic pressure trend878 !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 943 879 !!---------------------------------------------------------------------- 944 880 INTEGER, PARAMETER :: polynomial_type = 1 ! 1: cubic spline, 2: linear 945 INTEGER, INTENT(in) :: kt ! ocean time-step index 881 INTEGER , INTENT( in ) :: kt ! ocean time-step index 882 INTEGER , INTENT( in ) :: Kmm, Krhs ! ocean time level indices 883 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 946 884 !! 947 885 INTEGER :: ji, jj, jk, jkk ! dummy loop indices … … 973 911 IF( ln_wd_il ) THEN 974 912 ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 975 DO jj = 2, jpjm1 976 DO ji = 2, jpim1 977 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji+1,jj) ) > & 978 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) .AND. & 979 & MAX( sshn(ji,jj) + ht_0(ji,jj), sshn(ji+1,jj) + ht_0(ji+1,jj) ) & 980 & > rn_wdmin1 + rn_wdmin2 981 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji+1,jj) ) > 1.E-12 ) .AND. ( & 982 & MAX( sshn(ji,jj) , sshn(ji+1,jj) ) > & 983 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 984 985 IF(ll_tmp1) THEN 986 zcpx(ji,jj) = 1.0_wp 987 ELSE IF(ll_tmp2) THEN 988 ! no worries about sshn(ji+1,jj) - sshn(ji ,jj) = 0, it won't happen ! here 989 zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 990 & / (sshn(ji+1,jj) - sshn(ji ,jj)) ) 991 992 zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 993 ELSE 994 zcpx(ji,jj) = 0._wp 995 END IF 996 997 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji,jj+1) ) > & 998 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) .AND. & 999 & MAX( sshn(ji,jj) + ht_0(ji,jj), sshn(ji,jj+1) + ht_0(ji,jj+1) ) & 1000 & > rn_wdmin1 + rn_wdmin2 1001 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji,jj+1) ) > 1.E-12 ) .AND. ( & 1002 & MAX( sshn(ji,jj) , sshn(ji,jj+1) ) > & 1003 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 1004 1005 IF(ll_tmp1) THEN 1006 zcpy(ji,jj) = 1.0_wp 1007 ELSE IF(ll_tmp2) THEN 1008 ! no worries about sshn(ji,jj+1) - sshn(ji,jj ) = 0, it won't happen ! here 1009 zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 1010 & / (sshn(ji,jj+1) - sshn(ji,jj )) ) 1011 zcpy(ji,jj) = max(min( zcpy(ji,jj) , 1.0_wp),0.0_wp) 1012 1013 ELSE 1014 zcpy(ji,jj) = 0._wp 1015 ENDIF 1016 END DO 1017 END DO 1018 CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1., zcpy, 'V', 1. ) 913 DO_2D( 0, 0, 0, 0 ) 914 ll_tmp1 = MIN( ssh(ji,jj,Kmm) , ssh(ji+1,jj,Kmm) ) > & 915 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) .AND. & 916 & MAX( ssh(ji,jj,Kmm) + ht_0(ji,jj), ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) ) & 917 & > rn_wdmin1 + rn_wdmin2 918 ll_tmp2 = ( ABS( ssh(ji,jj,Kmm) - ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. ( & 919 & MAX( ssh(ji,jj,Kmm) , ssh(ji+1,jj,Kmm) ) > & 920 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 921 922 IF(ll_tmp1) THEN 923 zcpx(ji,jj) = 1.0_wp 924 ELSE IF(ll_tmp2) THEN 925 ! no worries about ssh(ji+1,jj,Kmm) - ssh(ji ,jj,Kmm) = 0, it won't happen ! here 926 zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 927 & / (ssh(ji+1,jj,Kmm) - ssh(ji ,jj,Kmm)) ) 928 929 zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 930 ELSE 931 zcpx(ji,jj) = 0._wp 932 END IF 933 934 ll_tmp1 = MIN( ssh(ji,jj,Kmm) , ssh(ji,jj+1,Kmm) ) > & 935 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) .AND. & 936 & MAX( ssh(ji,jj,Kmm) + ht_0(ji,jj), ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) ) & 937 & > rn_wdmin1 + rn_wdmin2 938 ll_tmp2 = ( ABS( ssh(ji,jj,Kmm) - ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. ( & 939 & MAX( ssh(ji,jj,Kmm) , ssh(ji,jj+1,Kmm) ) > & 940 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 941 942 IF(ll_tmp1) THEN 943 zcpy(ji,jj) = 1.0_wp 944 ELSE IF(ll_tmp2) THEN 945 ! no worries about ssh(ji,jj+1,Kmm) - ssh(ji,jj ,Kmm) = 0, it won't happen ! here 946 zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 947 & / (ssh(ji,jj+1,Kmm) - ssh(ji,jj ,Kmm)) ) 948 zcpy(ji,jj) = max(min( zcpy(ji,jj) , 1.0_wp),0.0_wp) 949 950 ELSE 951 zcpy(ji,jj) = 0._wp 952 ENDIF 953 END_2D 954 CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1.0_wp, zcpy, 'V', 1.0_wp ) 1019 955 ENDIF 1020 956 … … 1024 960 1025 961 ! Preparing vertical density profile "zrhh(:,:,:)" for hybrid-sco coordinate 1026 DO jj = 1, jpj 1027 DO ji = 1, jpi 1028 jk = mbkt(ji,jj)+1 1029 IF( jk <= 0 ) THEN ; zrhh(ji,jj, : ) = 0._wp 1030 ELSEIF( jk == 1 ) THEN ; zrhh(ji,jj,jk+1:jpk) = rhd(ji,jj,jk) 1031 ELSEIF( jk < jpkm1 ) THEN 1032 DO jkk = jk+1, jpk 1033 zrhh(ji,jj,jkk) = interp1(gde3w_n(ji,jj,jkk ), gde3w_n(ji,jj,jkk-1), & 1034 & gde3w_n(ji,jj,jkk-2), rhd (ji,jj,jkk-1), rhd(ji,jj,jkk-2)) 1035 END DO 1036 ENDIF 1037 END DO 1038 END DO 962 DO_2D( 1, 1, 1, 1 ) 963 jk = mbkt(ji,jj) 964 IF( jk <= 1 ) THEN ; zrhh(ji,jj, : ) = 0._wp 965 ELSEIF( jk == 2 ) THEN ; zrhh(ji,jj,jk+1:jpk) = rhd(ji,jj,jk) 966 ELSEIF( jk < jpkm1 ) THEN 967 DO jkk = jk+1, jpk 968 zrhh(ji,jj,jkk) = interp1(gde3w(ji,jj,jkk ), gde3w(ji,jj,jkk-1), & 969 & gde3w(ji,jj,jkk-2), zrhh (ji,jj,jkk-1), zrhh(ji,jj,jkk-2)) 970 END DO 971 ENDIF 972 END_2D 1039 973 1040 974 ! Transfer the depth of "T(:,:,:)" to vertical coordinate "zdept(:,:,:)" 1041 DO jj = 1, jpj 1042 DO ji = 1, jpi 1043 zdept(ji,jj,1) = 0.5_wp * e3w_n(ji,jj,1) - sshn(ji,jj) * znad 1044 END DO 1045 END DO 1046 1047 DO jk = 2, jpk 1048 DO jj = 1, jpj 1049 DO ji = 1, jpi 1050 zdept(ji,jj,jk) = zdept(ji,jj,jk-1) + e3w_n(ji,jj,jk) 1051 END DO 1052 END DO 1053 END DO 975 DO_2D( 1, 1, 1, 1 ) 976 zdept(ji,jj,1) = 0.5_wp * e3w(ji,jj,1,Kmm) - ssh(ji,jj,Kmm) * znad 977 END_2D 978 979 DO_3D( 1, 1, 1, 1, 2, jpk ) 980 zdept(ji,jj,jk) = zdept(ji,jj,jk-1) + e3w(ji,jj,jk,Kmm) 981 END_3D 1054 982 1055 983 fsp(:,:,:) = zrhh (:,:,:) … … 1062 990 1063 991 ! Integrate the hydrostatic pressure "zhpi(:,:,:)" at "T(ji,jj,1)" 1064 DO jj = 2, jpj 1065 DO ji = 2, jpi 1066 zrhdt1 = zrhh(ji,jj,1) - interp3( zdept(ji,jj,1), asp(ji,jj,1), bsp(ji,jj,1), & 1067 & csp(ji,jj,1), dsp(ji,jj,1) ) * 0.25_wp * e3w_n(ji,jj,1) 1068 1069 ! assuming linear profile across the top half surface layer 1070 zhpi(ji,jj,1) = 0.5_wp * e3w_n(ji,jj,1) * zrhdt1 1071 END DO 1072 END DO 992 DO_2D( 0, 1, 0, 1 ) 993 zrhdt1 = zrhh(ji,jj,1) - interp3( zdept(ji,jj,1), asp(ji,jj,1), bsp(ji,jj,1), & 994 & csp(ji,jj,1), dsp(ji,jj,1) ) * 0.25_wp * e3w(ji,jj,1,Kmm) 995 996 ! assuming linear profile across the top half surface layer 997 zhpi(ji,jj,1) = 0.5_wp * e3w(ji,jj,1,Kmm) * zrhdt1 998 END_2D 1073 999 1074 1000 ! Calculate the pressure "zhpi(:,:,:)" at "T(ji,jj,2:jpkm1)" 1075 DO jk = 2, jpkm1 1076 DO jj = 2, jpj 1077 DO ji = 2, jpi 1078 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + & 1079 & integ_spline( zdept(ji,jj,jk-1), zdept(ji,jj,jk), & 1080 & asp (ji,jj,jk-1), bsp (ji,jj,jk-1), & 1081 & csp (ji,jj,jk-1), dsp (ji,jj,jk-1) ) 1082 END DO 1083 END DO 1084 END DO 1001 DO_3D( 0, 1, 0, 1, 2, jpkm1 ) 1002 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + & 1003 & integ_spline( zdept(ji,jj,jk-1), zdept(ji,jj,jk), & 1004 & asp (ji,jj,jk-1), bsp (ji,jj,jk-1), & 1005 & csp (ji,jj,jk-1), dsp (ji,jj,jk-1) ) 1006 END_3D 1085 1007 1086 1008 ! Z coordinate of U(ji,jj,1:jpkm1) and V(ji,jj,1:jpkm1) 1087 1009 1088 1010 ! Prepare zsshu_n and zsshv_n 1089 DO jj = 2, jpjm1 1090 DO ji = 2, jpim1 1011 DO_2D( 0, 0, 0, 0 ) 1091 1012 !!gm BUG ? if it is ssh at u- & v-point then it should be: 1092 ! zsshu_n(ji,jj) = (e1e2t(ji,jj) * ssh n(ji,jj) + e1e2t(ji+1,jj) * sshn(ji+1,jj)) * &1013 ! zsshu_n(ji,jj) = (e1e2t(ji,jj) * ssh(ji,jj,Kmm) + e1e2t(ji+1,jj) * ssh(ji+1,jj,Kmm)) * & 1093 1014 ! & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp 1094 ! zsshv_n(ji,jj) = (e1e2t(ji,jj) * ssh n(ji,jj) + e1e2t(ji,jj+1) * sshn(ji,jj+1)) * &1015 ! zsshv_n(ji,jj) = (e1e2t(ji,jj) * ssh(ji,jj,Kmm) + e1e2t(ji,jj+1) * ssh(ji,jj+1,Kmm)) * & 1095 1016 ! & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp 1096 1017 !!gm not this: 1097 zsshu_n(ji,jj) = (e1e2u(ji,jj) * sshn(ji,jj) + e1e2u(ji+1, jj) * sshn(ji+1,jj)) * & 1098 & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp 1099 zsshv_n(ji,jj) = (e1e2v(ji,jj) * sshn(ji,jj) + e1e2v(ji+1, jj) * sshn(ji,jj+1)) * & 1100 & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp 1101 END DO 1102 END DO 1103 1104 CALL lbc_lnk_multi ('dynhpg', zsshu_n, 'U', 1., zsshv_n, 'V', 1. ) 1105 1106 DO jj = 2, jpjm1 1107 DO ji = 2, jpim1 1108 zu(ji,jj,1) = - ( e3u_n(ji,jj,1) - zsshu_n(ji,jj) * znad) 1109 zv(ji,jj,1) = - ( e3v_n(ji,jj,1) - zsshv_n(ji,jj) * znad) 1110 END DO 1111 END DO 1112 1113 DO jk = 2, jpkm1 1114 DO jj = 2, jpjm1 1115 DO ji = 2, jpim1 1116 zu(ji,jj,jk) = zu(ji,jj,jk-1) - e3u_n(ji,jj,jk) 1117 zv(ji,jj,jk) = zv(ji,jj,jk-1) - e3v_n(ji,jj,jk) 1118 END DO 1119 END DO 1120 END DO 1121 1122 DO jk = 1, jpkm1 1123 DO jj = 2, jpjm1 1124 DO ji = 2, jpim1 1125 zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * e3u_n(ji,jj,jk) 1126 zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * e3v_n(ji,jj,jk) 1127 END DO 1128 END DO 1129 END DO 1130 1131 DO jk = 1, jpkm1 1132 DO jj = 2, jpjm1 1133 DO ji = 2, jpim1 1134 zu(ji,jj,jk) = MIN( zu(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) ) ) 1135 zu(ji,jj,jk) = MAX( zu(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) ) ) 1136 zv(ji,jj,jk) = MIN( zv(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) ) ) 1137 zv(ji,jj,jk) = MAX( zv(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) ) ) 1138 END DO 1139 END DO 1140 END DO 1141 1142 1143 DO jk = 1, jpkm1 1144 DO jj = 2, jpjm1 1145 DO ji = 2, jpim1 1146 zpwes = 0._wp; zpwed = 0._wp 1147 zpnss = 0._wp; zpnsd = 0._wp 1148 zuijk = zu(ji,jj,jk) 1149 zvijk = zv(ji,jj,jk) 1150 1151 !!!!! for u equation 1152 IF( jk <= mbku(ji,jj) ) THEN 1153 IF( -zdept(ji+1,jj,jk) >= -zdept(ji,jj,jk) ) THEN 1154 jis = ji + 1; jid = ji 1155 ELSE 1156 jis = ji; jid = ji +1 1157 ENDIF 1158 1159 ! integrate the pressure on the shallow side 1160 jk1 = jk 1161 DO WHILE ( -zdept(jis,jj,jk1) > zuijk ) 1162 IF( jk1 == mbku(ji,jj) ) THEN 1163 zuijk = -zdept(jis,jj,jk1) 1164 EXIT 1165 ENDIF 1166 zdeps = MIN(zdept(jis,jj,jk1+1), -zuijk) 1167 zpwes = zpwes + & 1168 integ_spline(zdept(jis,jj,jk1), zdeps, & 1169 asp(jis,jj,jk1), bsp(jis,jj,jk1), & 1170 csp(jis,jj,jk1), dsp(jis,jj,jk1)) 1171 jk1 = jk1 + 1 1172 END DO 1173 1174 ! integrate the pressure on the deep side 1175 jk1 = jk 1176 DO WHILE ( -zdept(jid,jj,jk1) < zuijk ) 1177 IF( jk1 == 1 ) THEN 1178 zdeps = zdept(jid,jj,1) + MIN(zuijk, sshn(jid,jj)*znad) 1179 zrhdt1 = zrhh(jid,jj,1) - interp3(zdept(jid,jj,1), asp(jid,jj,1), & 1180 bsp(jid,jj,1), csp(jid,jj,1), & 1181 dsp(jid,jj,1)) * zdeps 1182 zpwed = zpwed + 0.5_wp * (zrhh(jid,jj,1) + zrhdt1) * zdeps 1183 EXIT 1184 ENDIF 1185 zdeps = MAX(zdept(jid,jj,jk1-1), -zuijk) 1186 zpwed = zpwed + & 1187 integ_spline(zdeps, zdept(jid,jj,jk1), & 1188 asp(jid,jj,jk1-1), bsp(jid,jj,jk1-1), & 1189 csp(jid,jj,jk1-1), dsp(jid,jj,jk1-1) ) 1190 jk1 = jk1 - 1 1191 END DO 1192 1193 ! update the momentum trends in u direction 1194 1195 zdpdx1 = zcoef0 * r1_e1u(ji,jj) * ( zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk) ) 1196 IF( .NOT.ln_linssh ) THEN 1197 zdpdx2 = zcoef0 * r1_e1u(ji,jj) * & 1198 & ( REAL(jis-jid, wp) * (zpwes + zpwed) + (sshn(ji+1,jj)-sshn(ji,jj)) ) 1199 ELSE 1200 zdpdx2 = zcoef0 * r1_e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 1201 ENDIF 1202 IF( ln_wd_il ) THEN 1203 zdpdx1 = zdpdx1 * zcpx(ji,jj) * wdrampu(ji,jj) 1204 zdpdx2 = zdpdx2 * zcpx(ji,jj) * wdrampu(ji,jj) 1205 ENDIF 1206 ua(ji,jj,jk) = ua(ji,jj,jk) + (zdpdx1 + zdpdx2) * umask(ji,jj,jk) 1207 ENDIF 1208 1209 !!!!! for v equation 1210 IF( jk <= mbkv(ji,jj) ) THEN 1211 IF( -zdept(ji,jj+1,jk) >= -zdept(ji,jj,jk) ) THEN 1212 jjs = jj + 1; jjd = jj 1213 ELSE 1214 jjs = jj ; jjd = jj + 1 1215 ENDIF 1216 1217 ! integrate the pressure on the shallow side 1218 jk1 = jk 1219 DO WHILE ( -zdept(ji,jjs,jk1) > zvijk ) 1220 IF( jk1 == mbkv(ji,jj) ) THEN 1221 zvijk = -zdept(ji,jjs,jk1) 1222 EXIT 1223 ENDIF 1224 zdeps = MIN(zdept(ji,jjs,jk1+1), -zvijk) 1225 zpnss = zpnss + & 1226 integ_spline(zdept(ji,jjs,jk1), zdeps, & 1227 asp(ji,jjs,jk1), bsp(ji,jjs,jk1), & 1228 csp(ji,jjs,jk1), dsp(ji,jjs,jk1) ) 1229 jk1 = jk1 + 1 1230 END DO 1231 1232 ! integrate the pressure on the deep side 1233 jk1 = jk 1234 DO WHILE ( -zdept(ji,jjd,jk1) < zvijk ) 1235 IF( jk1 == 1 ) THEN 1236 zdeps = zdept(ji,jjd,1) + MIN(zvijk, sshn(ji,jjd)*znad) 1237 zrhdt1 = zrhh(ji,jjd,1) - interp3(zdept(ji,jjd,1), asp(ji,jjd,1), & 1238 bsp(ji,jjd,1), csp(ji,jjd,1), & 1239 dsp(ji,jjd,1) ) * zdeps 1240 zpnsd = zpnsd + 0.5_wp * (zrhh(ji,jjd,1) + zrhdt1) * zdeps 1241 EXIT 1242 ENDIF 1243 zdeps = MAX(zdept(ji,jjd,jk1-1), -zvijk) 1244 zpnsd = zpnsd + & 1245 integ_spline(zdeps, zdept(ji,jjd,jk1), & 1246 asp(ji,jjd,jk1-1), bsp(ji,jjd,jk1-1), & 1247 csp(ji,jjd,jk1-1), dsp(ji,jjd,jk1-1) ) 1248 jk1 = jk1 - 1 1249 END DO 1250 1251 1252 ! update the momentum trends in v direction 1253 1254 zdpdy1 = zcoef0 * r1_e2v(ji,jj) * ( zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk) ) 1255 IF( .NOT.ln_linssh ) THEN 1256 zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 1257 ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (sshn(ji,jj+1)-sshn(ji,jj)) ) 1258 ELSE 1259 zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 1260 ENDIF 1261 IF( ln_wd_il ) THEN 1262 zdpdy1 = zdpdy1 * zcpy(ji,jj) * wdrampv(ji,jj) 1263 zdpdy2 = zdpdy2 * zcpy(ji,jj) * wdrampv(ji,jj) 1264 ENDIF 1265 1266 va(ji,jj,jk) = va(ji,jj,jk) + (zdpdy1 + zdpdy2) * vmask(ji,jj,jk) 1267 ENDIF 1268 ! 1269 END DO 1018 zsshu_n(ji,jj) = (e1e2u(ji,jj) * ssh(ji,jj,Kmm) + e1e2u(ji+1, jj) * ssh(ji+1,jj,Kmm)) * & 1019 & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp 1020 zsshv_n(ji,jj) = (e1e2v(ji,jj) * ssh(ji,jj,Kmm) + e1e2v(ji+1, jj) * ssh(ji,jj+1,Kmm)) * & 1021 & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp 1022 END_2D 1023 1024 CALL lbc_lnk_multi ('dynhpg', zsshu_n, 'U', 1.0_wp, zsshv_n, 'V', 1.0_wp ) 1025 1026 DO_2D( 0, 0, 0, 0 ) 1027 zu(ji,jj,1) = - ( e3u(ji,jj,1,Kmm) - zsshu_n(ji,jj) * znad) 1028 zv(ji,jj,1) = - ( e3v(ji,jj,1,Kmm) - zsshv_n(ji,jj) * znad) 1029 END_2D 1030 1031 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 1032 zu(ji,jj,jk) = zu(ji,jj,jk-1) - e3u(ji,jj,jk,Kmm) 1033 zv(ji,jj,jk) = zv(ji,jj,jk-1) - e3v(ji,jj,jk,Kmm) 1034 END_3D 1035 1036 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 1037 zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * e3u(ji,jj,jk,Kmm) 1038 zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * e3v(ji,jj,jk,Kmm) 1039 END_3D 1040 1041 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 1042 zu(ji,jj,jk) = MIN( zu(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) ) ) 1043 zu(ji,jj,jk) = MAX( zu(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) ) ) 1044 zv(ji,jj,jk) = MIN( zv(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) ) ) 1045 zv(ji,jj,jk) = MAX( zv(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) ) ) 1046 END_3D 1047 1048 1049 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 1050 zpwes = 0._wp; zpwed = 0._wp 1051 zpnss = 0._wp; zpnsd = 0._wp 1052 zuijk = zu(ji,jj,jk) 1053 zvijk = zv(ji,jj,jk) 1054 1055 !!!!! for u equation 1056 IF( jk <= mbku(ji,jj) ) THEN 1057 IF( -zdept(ji+1,jj,jk) >= -zdept(ji,jj,jk) ) THEN 1058 jis = ji + 1; jid = ji 1059 ELSE 1060 jis = ji; jid = ji +1 1061 ENDIF 1062 1063 ! integrate the pressure on the shallow side 1064 jk1 = jk 1065 DO WHILE ( -zdept(jis,jj,jk1) > zuijk ) 1066 IF( jk1 == mbku(ji,jj) ) THEN 1067 zuijk = -zdept(jis,jj,jk1) 1068 EXIT 1069 ENDIF 1070 zdeps = MIN(zdept(jis,jj,jk1+1), -zuijk) 1071 zpwes = zpwes + & 1072 integ_spline(zdept(jis,jj,jk1), zdeps, & 1073 asp(jis,jj,jk1), bsp(jis,jj,jk1), & 1074 csp(jis,jj,jk1), dsp(jis,jj,jk1)) 1075 jk1 = jk1 + 1 1270 1076 END DO 1271 END DO 1077 1078 ! integrate the pressure on the deep side 1079 jk1 = jk 1080 DO WHILE ( -zdept(jid,jj,jk1) < zuijk ) 1081 IF( jk1 == 1 ) THEN 1082 zdeps = zdept(jid,jj,1) + MIN(zuijk, ssh(jid,jj,Kmm)*znad) 1083 zrhdt1 = zrhh(jid,jj,1) - interp3(zdept(jid,jj,1), asp(jid,jj,1), & 1084 bsp(jid,jj,1), csp(jid,jj,1), & 1085 dsp(jid,jj,1)) * zdeps 1086 zpwed = zpwed + 0.5_wp * (zrhh(jid,jj,1) + zrhdt1) * zdeps 1087 EXIT 1088 ENDIF 1089 zdeps = MAX(zdept(jid,jj,jk1-1), -zuijk) 1090 zpwed = zpwed + & 1091 integ_spline(zdeps, zdept(jid,jj,jk1), & 1092 asp(jid,jj,jk1-1), bsp(jid,jj,jk1-1), & 1093 csp(jid,jj,jk1-1), dsp(jid,jj,jk1-1) ) 1094 jk1 = jk1 - 1 1095 END DO 1096 1097 ! update the momentum trends in u direction 1098 1099 zdpdx1 = zcoef0 * r1_e1u(ji,jj) * ( zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk) ) 1100 IF( .NOT.ln_linssh ) THEN 1101 zdpdx2 = zcoef0 * r1_e1u(ji,jj) * & 1102 & ( REAL(jis-jid, wp) * (zpwes + zpwed) + (ssh(ji+1,jj,Kmm)-ssh(ji,jj,Kmm)) ) 1103 ELSE 1104 zdpdx2 = zcoef0 * r1_e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 1105 ENDIF 1106 IF( ln_wd_il ) THEN 1107 zdpdx1 = zdpdx1 * zcpx(ji,jj) * wdrampu(ji,jj) 1108 zdpdx2 = zdpdx2 * zcpx(ji,jj) * wdrampu(ji,jj) 1109 ENDIF 1110 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zdpdx1 + zdpdx2) * umask(ji,jj,jk) 1111 ENDIF 1112 1113 !!!!! for v equation 1114 IF( jk <= mbkv(ji,jj) ) THEN 1115 IF( -zdept(ji,jj+1,jk) >= -zdept(ji,jj,jk) ) THEN 1116 jjs = jj + 1; jjd = jj 1117 ELSE 1118 jjs = jj ; jjd = jj + 1 1119 ENDIF 1120 1121 ! integrate the pressure on the shallow side 1122 jk1 = jk 1123 DO WHILE ( -zdept(ji,jjs,jk1) > zvijk ) 1124 IF( jk1 == mbkv(ji,jj) ) THEN 1125 zvijk = -zdept(ji,jjs,jk1) 1126 EXIT 1127 ENDIF 1128 zdeps = MIN(zdept(ji,jjs,jk1+1), -zvijk) 1129 zpnss = zpnss + & 1130 integ_spline(zdept(ji,jjs,jk1), zdeps, & 1131 asp(ji,jjs,jk1), bsp(ji,jjs,jk1), & 1132 csp(ji,jjs,jk1), dsp(ji,jjs,jk1) ) 1133 jk1 = jk1 + 1 1134 END DO 1135 1136 ! integrate the pressure on the deep side 1137 jk1 = jk 1138 DO WHILE ( -zdept(ji,jjd,jk1) < zvijk ) 1139 IF( jk1 == 1 ) THEN 1140 zdeps = zdept(ji,jjd,1) + MIN(zvijk, ssh(ji,jjd,Kmm)*znad) 1141 zrhdt1 = zrhh(ji,jjd,1) - interp3(zdept(ji,jjd,1), asp(ji,jjd,1), & 1142 bsp(ji,jjd,1), csp(ji,jjd,1), & 1143 dsp(ji,jjd,1) ) * zdeps 1144 zpnsd = zpnsd + 0.5_wp * (zrhh(ji,jjd,1) + zrhdt1) * zdeps 1145 EXIT 1146 ENDIF 1147 zdeps = MAX(zdept(ji,jjd,jk1-1), -zvijk) 1148 zpnsd = zpnsd + & 1149 integ_spline(zdeps, zdept(ji,jjd,jk1), & 1150 asp(ji,jjd,jk1-1), bsp(ji,jjd,jk1-1), & 1151 csp(ji,jjd,jk1-1), dsp(ji,jjd,jk1-1) ) 1152 jk1 = jk1 - 1 1153 END DO 1154 1155 1156 ! update the momentum trends in v direction 1157 1158 zdpdy1 = zcoef0 * r1_e2v(ji,jj) * ( zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk) ) 1159 IF( .NOT.ln_linssh ) THEN 1160 zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 1161 ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (ssh(ji,jj+1,Kmm)-ssh(ji,jj,Kmm)) ) 1162 ELSE 1163 zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 1164 ENDIF 1165 IF( ln_wd_il ) THEN 1166 zdpdy1 = zdpdy1 * zcpy(ji,jj) * wdrampv(ji,jj) 1167 zdpdy2 = zdpdy2 * zcpy(ji,jj) * wdrampv(ji,jj) 1168 ENDIF 1169 1170 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zdpdy1 + zdpdy2) * vmask(ji,jj,jk) 1171 ENDIF 1172 ! 1173 END_3D 1272 1174 ! 1273 1175 IF( ln_wd_il ) DEALLOCATE( zcpx, zcpy ) … … 1467 1369 !!====================================================================== 1468 1370 END MODULE dynhpg 1469 -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynkeg.F90
r10996 r13463 36 36 37 37 !! * Substitutions 38 # include " vectopt_loop_substitute.h90"38 # include "do_loop_substitute.h90" 39 39 !!---------------------------------------------------------------------- 40 40 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 44 44 CONTAINS 45 45 46 SUBROUTINE dyn_keg( kt, kscheme )46 SUBROUTINE dyn_keg( kt, kscheme, Kmm, puu, pvv, Krhs ) 47 47 !!---------------------------------------------------------------------- 48 48 !! *** ROUTINE dyn_keg *** … … 57 57 !! * kscheme = nkeg_HW : Hollingsworth correction following 58 58 !! Arakawa (2001). The now horizontal kinetic energy is given by: 59 !! zhke = 1/6 [ mi-1( 2 * un^2 + ((u n(j+1)+un(j-1))/2)^2 )60 !! + mj-1( 2 * vn^2 + ((v n(i+1)+vn(i-1))/2)^2 ) ]59 !! zhke = 1/6 [ mi-1( 2 * un^2 + ((u(j+1)+u(j-1))/2)^2 ) 60 !! + mj-1( 2 * vn^2 + ((v(i+1)+v(i-1))/2)^2 ) ] 61 61 !! 62 62 !! Take its horizontal gradient and add it to the general momentum 63 !! trend (ua,va).64 !! u a = ua- 1/e1u di[ zhke ]65 !! v a = va- 1/e2v dj[ zhke ]63 !! trend. 64 !! u(rhs) = u(rhs) - 1/e1u di[ zhke ] 65 !! v(rhs) = v(rhs) - 1/e2v dj[ zhke ] 66 66 !! 67 !! ** Action : - Update the ( ua, va) with the hor. ke gradient trend67 !! ** Action : - Update the (puu(:,:,:,Krhs), pvv(:,:,:,Krhs)) with the hor. ke gradient trend 68 68 !! - send this trends to trd_dyn (l_trddyn=T) for post-processing 69 69 !! … … 71 71 !! Hollingsworth et al., Quart. J. Roy. Meteor. Soc., 1983. 72 72 !!---------------------------------------------------------------------- 73 INTEGER, INTENT( in ) :: kt ! ocean time-step index 74 INTEGER, INTENT( in ) :: kscheme ! =0/1 type of KEG scheme 73 INTEGER , INTENT( in ) :: kt ! ocean time-step index 74 INTEGER , INTENT( in ) :: kscheme ! =0/1 type of KEG scheme 75 INTEGER , INTENT( in ) :: Kmm, Krhs ! ocean time level indices 76 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 75 77 ! 76 INTEGER :: ji, jj, jk, jb ! dummy loop indices 77 INTEGER :: ifu, ifv, igrd, ib_bdy ! local integers 78 INTEGER :: ji, jj, jk ! dummy loop indices 78 79 REAL(wp) :: zu, zv ! local scalars 79 80 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhke 80 81 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv 81 REAL(wp) :: zweightu, zweightv82 82 !!---------------------------------------------------------------------- 83 83 ! … … 92 92 IF( l_trddyn ) THEN ! Save the input trends 93 93 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 94 ztrdu(:,:,:) = ua(:,:,:)95 ztrdv(:,:,:) = va(:,:,:)94 ztrdu(:,:,:) = puu(:,:,:,Krhs) 95 ztrdv(:,:,:) = pvv(:,:,:,Krhs) 96 96 ENDIF 97 97 … … 101 101 ! 102 102 CASE ( nkeg_C2 ) !-- Standard scheme --! 103 DO jk = 1, jpkm1 104 DO jj = 2, jpj 105 DO ji = fs_2, jpi ! vector opt. 106 zu = un(ji-1,jj ,jk) * un(ji-1,jj ,jk) & 107 & + un(ji ,jj ,jk) * un(ji ,jj ,jk) 108 zv = vn(ji ,jj-1,jk) * vn(ji ,jj-1,jk) & 109 & + vn(ji ,jj ,jk) * vn(ji ,jj ,jk) 110 zhke(ji,jj,jk) = 0.25_wp * ( zv + zu ) 111 END DO 112 END DO 113 END DO 114 ! 115 IF (ln_bdy) THEN 116 ! Maria Luneva & Fred Wobus: July-2016 117 ! compensate for lack of turbulent kinetic energy on liquid bdy points 118 DO ib_bdy = 1, nb_bdy 119 IF( cn_dyn3d(ib_bdy) /= 'none' ) THEN 120 igrd = 1 ! compensating null velocity on the bdy 121 DO jb = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 122 ji = idx_bdy(ib_bdy)%nbi(jb,igrd) ! maximum extent : from 2 to jpi-1 123 jj = idx_bdy(ib_bdy)%nbj(jb,igrd) ! maximum extent : from 2 to jpj-1 124 DO jk = 1, jpkm1 125 zhke(ji,jj,jk) = 0._wp 126 zweightu = umask(ji-1,jj ,jk) + umask(ji,jj,jk) 127 zweightv = vmask(ji ,jj-1,jk) + vmask(ji,jj,jk) 128 zu = un(ji-1,jj ,jk) * un(ji-1,jj ,jk) + un(ji ,jj ,jk) * un(ji ,jj ,jk) 129 zv = vn(ji ,jj-1,jk) * vn(ji ,jj-1,jk) + vn(ji ,jj ,jk) * vn(ji ,jj ,jk) 130 IF( zweightu > 0._wp ) zhke(ji,jj,jk) = zhke(ji,jj,jk) + zu / (2._wp * zweightu) 131 IF( zweightv > 0._wp ) zhke(ji,jj,jk) = zhke(ji,jj,jk) + zv / (2._wp * zweightv) 132 END DO 133 END DO 134 END IF 135 CALL lbc_bdy_lnk( 'dynkeg', zhke, 'T', 1., ib_bdy ) ! send 2 and recv jpi, jpj used in the computation of the speed tendencies 136 END DO 137 END IF 138 ! 103 DO_3D( 0, 1, 0, 1, 1, jpkm1 ) 104 zu = puu(ji-1,jj ,jk,Kmm) * puu(ji-1,jj ,jk,Kmm) & 105 & + puu(ji ,jj ,jk,Kmm) * puu(ji ,jj ,jk,Kmm) 106 zv = pvv(ji ,jj-1,jk,Kmm) * pvv(ji ,jj-1,jk,Kmm) & 107 & + pvv(ji ,jj ,jk,Kmm) * pvv(ji ,jj ,jk,Kmm) 108 zhke(ji,jj,jk) = 0.25_wp * ( zv + zu ) 109 END_3D 139 110 CASE ( nkeg_HW ) !-- Hollingsworth scheme --! 140 DO jk = 1, jpkm1 141 DO jj = 2, jpjm1 142 DO ji = fs_2, jpim1 ! vector opt. 143 zu = 8._wp * ( un(ji-1,jj ,jk) * un(ji-1,jj ,jk) & 144 & + un(ji ,jj ,jk) * un(ji ,jj ,jk) ) & 145 & + ( un(ji-1,jj-1,jk) + un(ji-1,jj+1,jk) ) * ( un(ji-1,jj-1,jk) + un(ji-1,jj+1,jk) ) & 146 & + ( un(ji ,jj-1,jk) + un(ji ,jj+1,jk) ) * ( un(ji ,jj-1,jk) + un(ji ,jj+1,jk) ) 147 ! 148 zv = 8._wp * ( vn(ji ,jj-1,jk) * vn(ji ,jj-1,jk) & 149 & + vn(ji ,jj ,jk) * vn(ji ,jj ,jk) ) & 150 & + ( vn(ji-1,jj-1,jk) + vn(ji+1,jj-1,jk) ) * ( vn(ji-1,jj-1,jk) + vn(ji+1,jj-1,jk) ) & 151 & + ( vn(ji-1,jj ,jk) + vn(ji+1,jj ,jk) ) * ( vn(ji-1,jj ,jk) + vn(ji+1,jj ,jk) ) 152 zhke(ji,jj,jk) = r1_48 * ( zv + zu ) 153 END DO 154 END DO 155 END DO 156 IF (ln_bdy) THEN 157 ! Maria Luneva & Fred Wobus: July-2016 158 ! compensate for lack of turbulent kinetic energy on liquid bdy points 159 DO ib_bdy = 1, nb_bdy 160 IF( cn_dyn3d(ib_bdy) /= 'none' ) THEN 161 igrd = 1 ! compensation null velocity on land at the bdy 162 DO jb = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 163 ji = idx_bdy(ib_bdy)%nbi(jb,igrd) ! maximum extent : from 2 to jpi-1 164 jj = idx_bdy(ib_bdy)%nbj(jb,igrd) ! maximum extent : from 2 to jpj-1 165 DO jk = 1, jpkm1 166 zhke(ji,jj,jk) = 0._wp 167 zweightu = 8._wp * ( umask(ji-1,jj ,jk) + umask(ji ,jj ,jk) ) & 168 & + 2._wp * ( umask(ji-1,jj-1,jk) + umask(ji-1,jj+1,jk) + umask(ji ,jj-1,jk) + umask(ji ,jj+1,jk) ) 169 zweightv = 8._wp * ( vmask(ji ,jj-1,jk) + vmask(ji ,jj-1,jk) ) & 170 & + 2._wp * ( vmask(ji-1,jj-1,jk) + vmask(ji+1,jj-1,jk) + vmask(ji-1,jj ,jk) + vmask(ji+1,jj ,jk) ) 171 zu = 8._wp * ( un(ji-1,jj ,jk) * un(ji-1,jj ,jk) & 172 & + un(ji ,jj ,jk) * un(ji ,jj ,jk) ) & 173 & + ( un(ji-1,jj-1,jk) + un(ji-1,jj+1,jk) ) * ( un(ji-1,jj-1,jk) + un(ji-1,jj+1,jk) ) & 174 & + ( un(ji ,jj-1,jk) + un(ji ,jj+1,jk) ) * ( un(ji ,jj-1,jk) + un(ji ,jj+1,jk) ) 175 zv = 8._wp * ( vn(ji ,jj-1,jk) * vn(ji ,jj-1,jk) & 176 & + vn(ji ,jj ,jk) * vn(ji ,jj ,jk) ) & 177 & + ( vn(ji-1,jj-1,jk) + vn(ji+1,jj-1,jk) ) * ( vn(ji-1,jj-1,jk) + vn(ji+1,jj-1,jk) ) & 178 & + ( vn(ji-1,jj ,jk) + vn(ji+1,jj ,jk) ) * ( vn(ji-1,jj ,jk) + vn(ji+1,jj ,jk) ) 179 IF( zweightu > 0._wp ) zhke(ji,jj,jk) = zhke(ji,jj,jk) + zu / ( 2._wp * zweightu ) 180 IF( zweightv > 0._wp ) zhke(ji,jj,jk) = zhke(ji,jj,jk) + zv / ( 2._wp * zweightv ) 181 END DO 182 END DO 183 END IF 184 END DO 185 END IF 186 CALL lbc_lnk( 'dynkeg', zhke, 'T', 1. ) 111 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 112 zu = 8._wp * ( puu(ji-1,jj ,jk,Kmm) * puu(ji-1,jj ,jk,Kmm) & 113 & + puu(ji ,jj ,jk,Kmm) * puu(ji ,jj ,jk,Kmm) ) & 114 & + ( puu(ji-1,jj-1,jk,Kmm) + puu(ji-1,jj+1,jk,Kmm) ) * ( puu(ji-1,jj-1,jk,Kmm) + puu(ji-1,jj+1,jk,Kmm) ) & 115 & + ( puu(ji ,jj-1,jk,Kmm) + puu(ji ,jj+1,jk,Kmm) ) * ( puu(ji ,jj-1,jk,Kmm) + puu(ji ,jj+1,jk,Kmm) ) 116 ! 117 zv = 8._wp * ( pvv(ji ,jj-1,jk,Kmm) * pvv(ji ,jj-1,jk,Kmm) & 118 & + pvv(ji ,jj ,jk,Kmm) * pvv(ji ,jj ,jk,Kmm) ) & 119 & + ( pvv(ji-1,jj-1,jk,Kmm) + pvv(ji+1,jj-1,jk,Kmm) ) * ( pvv(ji-1,jj-1,jk,Kmm) + pvv(ji+1,jj-1,jk,Kmm) ) & 120 & + ( pvv(ji-1,jj ,jk,Kmm) + pvv(ji+1,jj ,jk,Kmm) ) * ( pvv(ji-1,jj ,jk,Kmm) + pvv(ji+1,jj ,jk,Kmm) ) 121 zhke(ji,jj,jk) = r1_48 * ( zv + zu ) 122 END_3D 123 CALL lbc_lnk( 'dynkeg', zhke, 'T', 1.0_wp ) 187 124 ! 188 125 END SELECT 189 126 ! 190 DO jk = 1, jpkm1 !== grad( KE ) added to the general momentum trends ==! 191 DO jj = 2, jpjm1 192 DO ji = fs_2, fs_jpim1 ! vector opt. 193 ua(ji,jj,jk) = ua(ji,jj,jk) - ( zhke(ji+1,jj ,jk) - zhke(ji,jj,jk) ) / e1u(ji,jj) 194 va(ji,jj,jk) = va(ji,jj,jk) - ( zhke(ji ,jj+1,jk) - zhke(ji,jj,jk) ) / e2v(ji,jj) 195 END DO 196 END DO 197 END DO 127 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 128 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zhke(ji+1,jj ,jk) - zhke(ji,jj,jk) ) / e1u(ji,jj) 129 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zhke(ji ,jj+1,jk) - zhke(ji,jj,jk) ) / e2v(ji,jj) 130 END_3D 198 131 ! 199 132 IF( l_trddyn ) THEN ! save the Kinetic Energy trends for diagnostic 200 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)201 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)202 CALL trd_dyn( ztrdu, ztrdv, jpdyn_keg, kt )133 ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 134 ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 135 CALL trd_dyn( ztrdu, ztrdv, jpdyn_keg, kt, Kmm ) 203 136 DEALLOCATE( ztrdu , ztrdv ) 204 137 ENDIF 205 138 ! 206 IF( ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' keg - Ua: ', mask1=umask, &207 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )139 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' keg - Ua: ', mask1=umask, & 140 & tab3d_2=pvv(:,:,:,Krhs), clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 208 141 ! 209 142 IF( ln_timing ) CALL timing_stop('dyn_keg') -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynldf.F90
r10068 r13463 34 34 PUBLIC dyn_ldf_init ! called by opa module 35 35 36 !! * Substitutions37 # include "vectopt_loop_substitute.h90"38 36 !!---------------------------------------------------------------------- 39 37 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 43 41 CONTAINS 44 42 45 SUBROUTINE dyn_ldf( kt )43 SUBROUTINE dyn_ldf( kt, Kbb, Kmm, puu, pvv, Krhs ) 46 44 !!---------------------------------------------------------------------- 47 45 !! *** ROUTINE dyn_ldf *** … … 49 47 !! ** Purpose : compute the lateral ocean dynamics physics. 50 48 !!---------------------------------------------------------------------- 51 INTEGER, INTENT(in) :: kt ! ocean time-step index 49 INTEGER , INTENT( in ) :: kt ! ocean time-step index 50 INTEGER , INTENT( in ) :: Kbb, Kmm, Krhs ! ocean time level indices 51 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 52 52 ! 53 53 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv … … 58 58 IF( l_trddyn ) THEN ! temporary save of momentum trends 59 59 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 60 ztrdu(:,:,:) = ua(:,:,:)61 ztrdv(:,:,:) = va(:,:,:)60 ztrdu(:,:,:) = puu(:,:,:,Krhs) 61 ztrdv(:,:,:) = pvv(:,:,:,Krhs) 62 62 ENDIF 63 63 64 64 SELECT CASE ( nldf_dyn ) ! compute lateral mixing trend and add it to the general trend 65 65 ! 66 CASE ( np_lap ) ; CALL dyn_ldf_lap( kt, ub, vb, ua, va, 1 ) ! iso-level laplacian 67 CASE ( np_lap_i ) ; CALL dyn_ldf_iso( kt ) ! rotated laplacian 68 CASE ( np_blp ) ; CALL dyn_ldf_blp( kt, ub, vb, ua, va ) ! iso-level bi-laplacian 66 CASE ( np_lap ) 67 CALL dyn_ldf_lap( kt, Kbb, Kmm, puu(:,:,:,Kbb), pvv(:,:,:,Kbb), puu(:,:,:,Krhs), pvv(:,:,:,Krhs), 1 ) ! iso-level laplacian 68 CASE ( np_lap_i ) 69 CALL dyn_ldf_iso( kt, Kbb, Kmm, puu, pvv, Krhs ) ! rotated laplacian 70 CASE ( np_blp ) 71 CALL dyn_ldf_blp( kt, Kbb, Kmm, puu(:,:,:,Kbb), pvv(:,:,:,Kbb), puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! iso-level bi-laplacian 69 72 ! 70 73 END SELECT 71 74 72 75 IF( l_trddyn ) THEN ! save the horizontal diffusive trends for further diagnostics 73 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)74 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)75 CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt )76 ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 77 ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 78 CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt, Kmm ) 76 79 DEALLOCATE ( ztrdu , ztrdv ) 77 80 ENDIF 78 81 ! ! print sum trends (used for debugging) 79 IF( ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf - Ua: ', mask1=umask, &80 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )82 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' ldf - Ua: ', mask1=umask, & 83 & tab3d_2=pvv(:,:,:,Krhs), clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 81 84 ! 82 85 IF( ln_timing ) CALL timing_stop('dyn_ldf') -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynldf_iso.F90
r10425 r13463 41 41 42 42 !! * Substitutions 43 # include "vectopt_loop_substitute.h90" 43 # include "do_loop_substitute.h90" 44 # include "domzgr_substitute.h90" 44 45 !!---------------------------------------------------------------------- 45 46 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 60 61 61 62 62 SUBROUTINE dyn_ldf_iso( kt )63 SUBROUTINE dyn_ldf_iso( kt, Kbb, Kmm, puu, pvv, Krhs ) 63 64 !!---------------------------------------------------------------------- 64 65 !! *** ROUTINE dyn_ldf_iso *** … … 81 82 !! horizontal fluxes associated with the rotated lateral mixing: 82 83 !! u-component: 83 !! ziut = ( ahmt + rn_ahm_b ) e2t * e3t / e1t di[ u b]84 !! - ahmt e2t * mi-1(uslp) dk[ mi(mk(u b)) ]85 !! zjuf = ( ahmf + rn_ahm_b ) e1f * e3f / e2f dj[ u b]86 !! - ahmf e1f * mi(vslp) dk[ mj(mk(u b)) ]84 !! ziut = ( ahmt + rn_ahm_b ) e2t * e3t / e1t di[ uu ] 85 !! - ahmt e2t * mi-1(uslp) dk[ mi(mk(uu)) ] 86 !! zjuf = ( ahmf + rn_ahm_b ) e1f * e3f / e2f dj[ uu ] 87 !! - ahmf e1f * mi(vslp) dk[ mj(mk(uu)) ] 87 88 !! v-component: 88 !! zivf = ( ahmf + rn_ahm_b ) e2t * e3t / e1t di[ v b]89 !! - ahmf e2t * mj(uslp) dk[ mi(mk(v b)) ]90 !! zjvt = ( ahmt + rn_ahm_b ) e1f * e3f / e2f dj[ ub]91 !! - ahmt e1f * mj-1(vslp) dk[ mj(mk(v b)) ]89 !! zivf = ( ahmf + rn_ahm_b ) e2t * e3t / e1t di[ vv ] 90 !! - ahmf e2t * mj(uslp) dk[ mi(mk(vv)) ] 91 !! zjvt = ( ahmt + rn_ahm_b ) e1f * e3f / e2f dj[ vv ] 92 !! - ahmt e1f * mj-1(vslp) dk[ mj(mk(vv)) ] 92 93 !! take the horizontal divergence of the fluxes: 93 94 !! diffu = 1/(e1u*e2u*e3u) { di [ ziut ] + dj-1[ zjuf ] } 94 95 !! diffv = 1/(e1v*e2v*e3v) { di-1[ zivf ] + dj [ zjvt ] } 95 !! Add this trend to the general trend (u a,va):96 !! u a = ua+ diffu96 !! Add this trend to the general trend (uu(rhs),vv(rhs)): 97 !! uu(rhs) = uu(rhs) + diffu 97 98 !! CAUTION: here the isopycnal part is with a coeff. of aht. This 98 99 !! should be modified for applications others than orca_r2 (!!bug) 99 100 !! 100 101 !! ** Action : 101 !! -( ua,va) updated with the before geopotential harmonic mixing trend102 !! -(puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) updated with the before geopotential harmonic mixing trend 102 103 !! -(akzu,akzv) to accompt for the diagonal vertical component 103 104 !! of the rotated operator in dynzdf module 104 105 !!---------------------------------------------------------------------- 105 INTEGER, INTENT( in ) :: kt ! ocean time-step index 106 INTEGER , INTENT( in ) :: kt ! ocean time-step index 107 INTEGER , INTENT( in ) :: Kbb, Kmm, Krhs ! ocean time level indices 108 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 106 109 ! 107 110 INTEGER :: ji, jj, jk ! dummy loop indices … … 125 128 IF( ln_dynldf_hor .AND. ln_traldf_iso ) THEN 126 129 ! 127 DO jk = 1, jpk ! set the slopes of iso-level 128 DO jj = 2, jpjm1 129 DO ji = 2, jpim1 130 uslp (ji,jj,jk) = - ( gdept_b(ji+1,jj,jk) - gdept_b(ji ,jj ,jk) ) * r1_e1u(ji,jj) * umask(ji,jj,jk) 131 vslp (ji,jj,jk) = - ( gdept_b(ji,jj+1,jk) - gdept_b(ji ,jj ,jk) ) * r1_e2v(ji,jj) * vmask(ji,jj,jk) 132 wslpi(ji,jj,jk) = - ( gdepw_b(ji+1,jj,jk) - gdepw_b(ji-1,jj,jk) ) * r1_e1t(ji,jj) * tmask(ji,jj,jk) * 0.5 133 wslpj(ji,jj,jk) = - ( gdepw_b(ji,jj+1,jk) - gdepw_b(ji,jj-1,jk) ) * r1_e2t(ji,jj) * tmask(ji,jj,jk) * 0.5 134 END DO 135 END DO 136 END DO 130 DO_3D( 0, 0, 0, 0, 1, jpk ) 131 uslp (ji,jj,jk) = - ( gdept(ji+1,jj,jk,Kbb) - gdept(ji ,jj ,jk,Kbb) ) * r1_e1u(ji,jj) * umask(ji,jj,jk) 132 vslp (ji,jj,jk) = - ( gdept(ji,jj+1,jk,Kbb) - gdept(ji ,jj ,jk,Kbb) ) * r1_e2v(ji,jj) * vmask(ji,jj,jk) 133 wslpi(ji,jj,jk) = - ( gdepw(ji+1,jj,jk,Kbb) - gdepw(ji-1,jj,jk,Kbb) ) * r1_e1t(ji,jj) * tmask(ji,jj,jk) * 0.5 134 wslpj(ji,jj,jk) = - ( gdepw(ji,jj+1,jk,Kbb) - gdepw(ji,jj-1,jk,Kbb) ) * r1_e2t(ji,jj) * tmask(ji,jj,jk) * 0.5 135 END_3D 137 136 ! Lateral boundary conditions on the slopes 138 CALL lbc_lnk_multi( 'dynldf_iso', uslp , 'U', -1. , vslp , 'V', -1., wslpi, 'W', -1., wslpj, 'W', -1.)137 CALL lbc_lnk_multi( 'dynldf_iso', uslp , 'U', -1.0_wp, vslp , 'V', -1.0_wp, wslpi, 'W', -1.0_wp, wslpj, 'W', -1.0_wp ) 139 138 ! 140 139 ENDIF … … 151 150 ! zdkv(jk=1)=zdkv(jk=2) 152 151 153 zdk1u(:,:) = ( ub(:,:,jk) -ub(:,:,jk+1) ) * umask(:,:,jk+1)154 zdk1v(:,:) = ( vb(:,:,jk) -vb(:,:,jk+1) ) * vmask(:,:,jk+1)152 zdk1u(:,:) = ( puu(:,:,jk,Kbb) -puu(:,:,jk+1,Kbb) ) * umask(:,:,jk+1) 153 zdk1v(:,:) = ( pvv(:,:,jk,Kbb) -pvv(:,:,jk+1,Kbb) ) * vmask(:,:,jk+1) 155 154 156 155 IF( jk == 1 ) THEN … … 158 157 zdkv(:,:) = zdk1v(:,:) 159 158 ELSE 160 zdku(:,:) = ( ub(:,:,jk-1) - ub(:,:,jk) ) * umask(:,:,jk)161 zdkv(:,:) = ( vb(:,:,jk-1) - vb(:,:,jk) ) * vmask(:,:,jk)159 zdku(:,:) = ( puu(:,:,jk-1,Kbb) - puu(:,:,jk,Kbb) ) * umask(:,:,jk) 160 zdkv(:,:) = ( pvv(:,:,jk-1,Kbb) - pvv(:,:,jk,Kbb) ) * vmask(:,:,jk) 162 161 ENDIF 163 162 … … 169 168 170 169 IF( ln_zps ) THEN ! z-coordinate - partial steps : min(e3u) 171 DO jj = 2, jpjm1172 DO ji = fs_2, jpi ! vector opt.173 zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj) * MIN( e3u_n(ji,jj,jk), e3u_n(ji-1,jj,jk) ) * r1_e1t(ji,jj)174 175 zmskt = 1._wp / MAX( umask(ji-1,jj,jk )+umask(ji,jj,jk+1) & 176 & + umask(ji-1,jj,jk+1)+umask(ji,jj,jk ) , 1._wp )177 178 zcof1 = - zaht_0 * e2t(ji,jj) * zmskt * 0.5 * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 179 180 ziut(ji,jj) = ( zabe1 * ( ub(ji,jj,jk) - ub(ji-1,jj,jk) ) & 181 & + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)&182 & +zdk1u(ji,jj) + zdku (ji-1,jj) ) ) * tmask(ji,jj,jk)183 END DO184 END DO170 DO_2D( 0, 0, 0, 1 ) 171 zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj) & 172 & * MIN( e3u(ji ,jj,jk,Kmm), & 173 & e3u(ji-1,jj,jk,Kmm) ) * r1_e1t(ji,jj) 174 175 zmskt = 1._wp / MAX( umask(ji-1,jj,jk )+umask(ji,jj,jk+1) & 176 & + umask(ji-1,jj,jk+1)+umask(ji,jj,jk ) , 1._wp ) 177 178 zcof1 = - zaht_0 * e2t(ji,jj) * zmskt * 0.5 * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 179 180 ziut(ji,jj) = ( zabe1 * ( puu(ji,jj,jk,Kbb) - puu(ji-1,jj,jk,Kbb) ) & 181 & + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj) & 182 & +zdk1u(ji,jj) + zdku (ji-1,jj) ) ) * tmask(ji,jj,jk) 183 END_2D 185 184 ELSE ! other coordinate system (zco or sco) : e3t 186 DO jj = 2, jpjm1 187 DO ji = fs_2, jpi ! vector opt. 188 zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj) * e3t_n(ji,jj,jk) * r1_e1t(ji,jj) 189 190 zmskt = 1._wp / MAX( umask(ji-1,jj,jk ) + umask(ji,jj,jk+1) & 191 & + umask(ji-1,jj,jk+1) + umask(ji,jj,jk ) , 1._wp ) 192 193 zcof1 = - zaht_0 * e2t(ji,jj) * zmskt * 0.5 * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 194 195 ziut(ji,jj) = ( zabe1 * ( ub(ji,jj,jk) - ub(ji-1,jj,jk) ) & 196 & + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj) & 197 & +zdk1u(ji,jj) + zdku (ji-1,jj) ) ) * tmask(ji,jj,jk) 198 END DO 199 END DO 185 DO_2D( 0, 0, 0, 1 ) 186 zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) & 187 & * e2t(ji,jj) * e3t(ji,jj,jk,Kmm) * r1_e1t(ji,jj) 188 189 zmskt = 1._wp / MAX( umask(ji-1,jj,jk ) + umask(ji,jj,jk+1) & 190 & + umask(ji-1,jj,jk+1) + umask(ji,jj,jk ) , 1._wp ) 191 192 zcof1 = - zaht_0 * e2t(ji,jj) * zmskt * 0.5 * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 193 194 ziut(ji,jj) = ( zabe1 * ( puu(ji,jj,jk,Kbb) - puu(ji-1,jj,jk,Kbb) ) & 195 & + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj) & 196 & +zdk1u(ji,jj) + zdku (ji-1,jj) ) ) * tmask(ji,jj,jk) 197 END_2D 200 198 ENDIF 201 199 202 200 ! j-flux at f-point 203 DO jj = 1, jpjm1 204 DO ji = 1, fs_jpim1 ! vector opt. 205 zabe2 = ( ahmf(ji,jj,jk) + rn_ahm_b ) * e1f(ji,jj) * e3f_n(ji,jj,jk) * r1_e2f(ji,jj) 206 207 zmskf = 1._wp / MAX( umask(ji,jj+1,jk )+umask(ji,jj,jk+1) & 208 & + umask(ji,jj+1,jk+1)+umask(ji,jj,jk ) , 1._wp ) 209 210 zcof2 = - zaht_0 * e1f(ji,jj) * zmskf * 0.5 * ( vslp(ji+1,jj,jk) + vslp(ji,jj,jk) ) 211 212 zjuf(ji,jj) = ( zabe2 * ( ub(ji,jj+1,jk) - ub(ji,jj,jk) ) & 213 & + zcof2 * ( zdku (ji,jj+1) + zdk1u(ji,jj) & 214 & +zdk1u(ji,jj+1) + zdku (ji,jj) ) ) * fmask(ji,jj,jk) 215 END DO 216 END DO 201 DO_2D( 1, 0, 1, 0 ) 202 zabe2 = ( ahmf(ji,jj,jk) + rn_ahm_b ) & 203 & * e1f(ji,jj) * e3f(ji,jj,jk) * r1_e2f(ji,jj) 204 205 zmskf = 1._wp / MAX( umask(ji,jj+1,jk )+umask(ji,jj,jk+1) & 206 & + umask(ji,jj+1,jk+1)+umask(ji,jj,jk ) , 1._wp ) 207 208 zcof2 = - zaht_0 * e1f(ji,jj) * zmskf * 0.5 * ( vslp(ji+1,jj,jk) + vslp(ji,jj,jk) ) 209 210 zjuf(ji,jj) = ( zabe2 * ( puu(ji,jj+1,jk,Kbb) - puu(ji,jj,jk,Kbb) ) & 211 & + zcof2 * ( zdku (ji,jj+1) + zdk1u(ji,jj) & 212 & +zdk1u(ji,jj+1) + zdku (ji,jj) ) ) * fmask(ji,jj,jk) 213 END_2D 217 214 218 215 ! | t | … … 222 219 ! i-flux at f-point | t | 223 220 224 DO jj = 2, jpjm1 225 DO ji = 1, fs_jpim1 ! vector opt. 226 zabe1 = ( ahmf(ji,jj,jk) + rn_ahm_b ) * e2f(ji,jj) * e3f_n(ji,jj,jk) * r1_e1f(ji,jj) 227 228 zmskf = 1._wp / MAX( vmask(ji+1,jj,jk )+vmask(ji,jj,jk+1) & 229 & + vmask(ji+1,jj,jk+1)+vmask(ji,jj,jk ) , 1._wp ) 230 231 zcof1 = - zaht_0 * e2f(ji,jj) * zmskf * 0.5 * ( uslp(ji,jj+1,jk) + uslp(ji,jj,jk) ) 232 233 zivf(ji,jj) = ( zabe1 * ( vb(ji+1,jj,jk) - vb(ji,jj,jk) ) & 234 & + zcof1 * ( zdkv (ji,jj) + zdk1v(ji+1,jj) & 235 & + zdk1v(ji,jj) + zdkv (ji+1,jj) ) ) * fmask(ji,jj,jk) 236 END DO 237 END DO 221 DO_2D( 0, 0, 1, 0 ) 222 zabe1 = ( ahmf(ji,jj,jk) + rn_ahm_b ) & 223 & * e2f(ji,jj) * e3f(ji,jj,jk) * r1_e1f(ji,jj) 224 225 zmskf = 1._wp / MAX( vmask(ji+1,jj,jk )+vmask(ji,jj,jk+1) & 226 & + vmask(ji+1,jj,jk+1)+vmask(ji,jj,jk ) , 1._wp ) 227 228 zcof1 = - zaht_0 * e2f(ji,jj) * zmskf * 0.5 * ( uslp(ji,jj+1,jk) + uslp(ji,jj,jk) ) 229 230 zivf(ji,jj) = ( zabe1 * ( pvv(ji+1,jj,jk,Kbb) - pvv(ji,jj,jk,Kbb) ) & 231 & + zcof1 * ( zdkv (ji,jj) + zdk1v(ji+1,jj) & 232 & + zdk1v(ji,jj) + zdkv (ji+1,jj) ) ) * fmask(ji,jj,jk) 233 END_2D 238 234 239 235 ! j-flux at t-point 240 236 IF( ln_zps ) THEN ! z-coordinate - partial steps : min(e3u) 241 DO jj = 2, jpj242 DO ji = 1, fs_jpim1 ! vector opt.243 zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj) * MIN( e3v_n(ji,jj,jk), e3v_n(ji,jj-1,jk) ) * r1_e2t(ji,jj)244 245 zmskt = 1._wp / MAX( vmask(ji,jj-1,jk )+vmask(ji,jj,jk+1) & 246 & + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk ) , 1._wp )247 248 zcof2 = - zaht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 249 250 zjvt(ji,jj) = ( zabe2 * ( vb(ji,jj,jk) - vb(ji,jj-1,jk) ) & 251 & + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj)&252 & +zdk1v(ji,jj-1) + zdkv (ji,jj) ) ) * tmask(ji,jj,jk)253 END DO254 END DO237 DO_2D( 0, 1, 1, 0 ) 238 zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj) & 239 & * MIN( e3v(ji,jj ,jk,Kmm), & 240 & e3v(ji,jj-1,jk,Kmm) ) * r1_e2t(ji,jj) 241 242 zmskt = 1._wp / MAX( vmask(ji,jj-1,jk )+vmask(ji,jj,jk+1) & 243 & + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk ) , 1._wp ) 244 245 zcof2 = - zaht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 246 247 zjvt(ji,jj) = ( zabe2 * ( pvv(ji,jj,jk,Kbb) - pvv(ji,jj-1,jk,Kbb) ) & 248 & + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj) & 249 & +zdk1v(ji,jj-1) + zdkv (ji,jj) ) ) * tmask(ji,jj,jk) 250 END_2D 255 251 ELSE ! other coordinate system (zco or sco) : e3t 256 DO jj = 2, jpj 257 DO ji = 1, fs_jpim1 ! vector opt. 258 zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj) * e3t_n(ji,jj,jk) * r1_e2t(ji,jj) 259 260 zmskt = 1./MAX( vmask(ji,jj-1,jk )+vmask(ji,jj,jk+1) & 261 & + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk ), 1. ) 262 263 zcof2 = - zaht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 264 265 zjvt(ji,jj) = ( zabe2 * ( vb(ji,jj,jk) - vb(ji,jj-1,jk) ) & 266 & + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj) & 267 & +zdk1v(ji,jj-1) + zdkv (ji,jj) ) ) * tmask(ji,jj,jk) 268 END DO 269 END DO 252 DO_2D( 0, 1, 1, 0 ) 253 zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) & 254 & * e1t(ji,jj) * e3t(ji,jj,jk,Kmm) * r1_e2t(ji,jj) 255 256 zmskt = 1./MAX( vmask(ji,jj-1,jk )+vmask(ji,jj,jk+1) & 257 & + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk ), 1. ) 258 259 zcof2 = - zaht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 260 261 zjvt(ji,jj) = ( zabe2 * ( pvv(ji,jj,jk,Kbb) - pvv(ji,jj-1,jk,Kbb) ) & 262 & + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj) & 263 & +zdk1v(ji,jj-1) + zdkv (ji,jj) ) ) * tmask(ji,jj,jk) 264 END_2D 270 265 ENDIF 271 266 … … 273 268 ! Second derivative (divergence) and add to the general trend 274 269 ! ----------------------------------------------------------- 275 DO jj = 2, jpjm1276 DO ji = 2, jpim1 !!gm Question vectop possible??? !!bug277 ua(ji,jj,jk) = ua(ji,jj,jk) + ( ziut(ji+1,jj) - ziut(ji,jj )&278 & + zjuf(ji ,jj) - zjuf(ji,jj-1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk)279 va(ji,jj,jk) = va(ji,jj,jk) + ( zivf(ji,jj ) - zivf(ji-1,jj) &280 & + zjvt(ji,jj+1) - zjvt(ji,jj ) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk)281 END DO282 END DO270 DO_2D( 0, 0, 0, 0 ) 271 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + ( ziut(ji+1,jj) - ziut(ji,jj ) & 272 & + zjuf(ji ,jj) - zjuf(ji,jj-1) ) * r1_e1e2u(ji,jj) & 273 & / e3u(ji,jj,jk,Kmm) 274 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + ( zivf(ji,jj ) - zivf(ji-1,jj) & 275 & + zjvt(ji,jj+1) - zjvt(ji,jj ) ) * r1_e1e2v(ji,jj) & 276 & / e3v(ji,jj,jk,Kmm) 277 END_2D 283 278 ! ! =============== 284 279 END DO ! End of slab … … 286 281 287 282 ! print sum trends (used for debugging) 288 IF( ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' ldfh - Ua: ', mask1=umask, &289 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )283 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' ldfh - Ua: ', mask1=umask, & 284 & tab3d_2=pvv(:,:,:,Krhs), clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 290 285 291 286 … … 306 301 DO ji = 2, jpi 307 302 ! i-gradient of u at jj 308 zdiu (ji,jk) = tmask(ji,jj ,jk) * ( ub(ji,jj ,jk) - ub(ji-1,jj ,jk) )303 zdiu (ji,jk) = tmask(ji,jj ,jk) * ( puu(ji,jj ,jk,Kbb) - puu(ji-1,jj ,jk,Kbb) ) 309 304 ! j-gradient of u and v at jj 310 zdju (ji,jk) = fmask(ji,jj ,jk) * ( ub(ji,jj+1,jk) - ub(ji ,jj ,jk) )311 zdjv (ji,jk) = tmask(ji,jj ,jk) * ( vb(ji,jj ,jk) - vb(ji ,jj-1,jk) )305 zdju (ji,jk) = fmask(ji,jj ,jk) * ( puu(ji,jj+1,jk,Kbb) - puu(ji ,jj ,jk,Kbb) ) 306 zdjv (ji,jk) = tmask(ji,jj ,jk) * ( pvv(ji,jj ,jk,Kbb) - pvv(ji ,jj-1,jk,Kbb) ) 312 307 ! j-gradient of u and v at jj+1 313 zdj1u(ji,jk) = fmask(ji,jj-1,jk) * ( ub(ji,jj ,jk) - ub(ji ,jj-1,jk) )314 zdj1v(ji,jk) = tmask(ji,jj+1,jk) * ( vb(ji,jj+1,jk) - vb(ji ,jj ,jk) )308 zdj1u(ji,jk) = fmask(ji,jj-1,jk) * ( puu(ji,jj ,jk,Kbb) - puu(ji ,jj-1,jk,Kbb) ) 309 zdj1v(ji,jk) = tmask(ji,jj+1,jk) * ( pvv(ji,jj+1,jk,Kbb) - pvv(ji ,jj ,jk,Kbb) ) 315 310 END DO 316 311 END DO … … 318 313 DO ji = 1, jpim1 319 314 ! i-gradient of v at jj 320 zdiv (ji,jk) = fmask(ji,jj ,jk) * ( vb(ji+1,jj,jk) - vb(ji ,jj ,jk) )315 zdiv (ji,jk) = fmask(ji,jj ,jk) * ( pvv(ji+1,jj,jk,Kbb) - pvv(ji ,jj ,jk,Kbb) ) 321 316 END DO 322 317 END DO … … 391 386 DO jk = 1, jpkm1 392 387 DO ji = 2, jpim1 393 ua(ji,jj,jk) = ua(ji,jj,jk) + ( zfuw(ji,jk) - zfuw(ji,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 394 va(ji,jj,jk) = va(ji,jj,jk) + ( zfvw(ji,jk) - zfvw(ji,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 388 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + ( zfuw(ji,jk) - zfuw(ji,jk+1) ) * r1_e1e2u(ji,jj) & 389 & / e3u(ji,jj,jk,Kmm) 390 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + ( zfvw(ji,jk) - zfvw(ji,jk+1) ) * r1_e1e2v(ji,jj) & 391 & / e3v(ji,jj,jk,Kmm) 395 392 END DO 396 393 END DO -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynldf_lap_blp.F90
r10425 r13463 27 27 28 28 !! * Substitutions 29 # include "vectopt_loop_substitute.h90" 29 # include "do_loop_substitute.h90" 30 # include "domzgr_substitute.h90" 30 31 !!---------------------------------------------------------------------- 31 32 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 35 36 CONTAINS 36 37 37 SUBROUTINE dyn_ldf_lap( kt, pub, pvb, pua, pva, kpass )38 SUBROUTINE dyn_ldf_lap( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs, kpass ) 38 39 !!---------------------------------------------------------------------- 39 40 !! *** ROUTINE dyn_ldf_lap *** … … 45 46 !! writen as : grad_h( ahmt div_h(U )) - curl_h( ahmf curl_z(U) ) 46 47 !! 47 !! ** Action : - pu a, pva increased by the harmonic operator applied on pub, pvb.48 !! ** Action : - pu_rhs, pv_rhs increased by the harmonic operator applied on pu, pv. 48 49 !!---------------------------------------------------------------------- 49 50 INTEGER , INTENT(in ) :: kt ! ocean time-step index 51 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices 50 52 INTEGER , INTENT(in ) :: kpass ! =1/2 first or second passage 51 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pu b, pvb! before velocity [m/s]52 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu a, pva! velocity trend [m/s2]53 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pu, pv ! before velocity [m/s] 54 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu_rhs, pv_rhs ! velocity trend [m/s2] 53 55 ! 54 56 INTEGER :: ji, jj, jk ! dummy loop indices … … 71 73 DO jk = 1, jpkm1 ! Horizontal slab 72 74 ! ! =============== 73 DO jj = 2, jpj 74 DO ji = fs_2, jpi ! vector opt. 75 ! ! ahm * e3 * curl (computed from 1 to jpim1/jpjm1) 76 !!gm open question here : e3f at before or now ? probably now... 77 !!gm note that ahmf has already been multiplied by fmask 78 zcur(ji-1,jj-1) = ahmf(ji-1,jj-1,jk) * e3f_n(ji-1,jj-1,jk) * r1_e1e2f(ji-1,jj-1) & 79 & * ( e2v(ji ,jj-1) * pvb(ji ,jj-1,jk) - e2v(ji-1,jj-1) * pvb(ji-1,jj-1,jk) & 80 & - e1u(ji-1,jj ) * pub(ji-1,jj ,jk) + e1u(ji-1,jj-1) * pub(ji-1,jj-1,jk) ) 81 ! ! ahm * div (computed from 2 to jpi/jpj) 82 !!gm note that ahmt has already been multiplied by tmask 83 zdiv(ji,jj) = ahmt(ji,jj,jk) * r1_e1e2t(ji,jj) / e3t_b(ji,jj,jk) & 84 & * ( e2u(ji,jj)*e3u_b(ji,jj,jk) * pub(ji,jj,jk) - e2u(ji-1,jj)*e3u_b(ji-1,jj,jk) * pub(ji-1,jj,jk) & 85 & + e1v(ji,jj)*e3v_b(ji,jj,jk) * pvb(ji,jj,jk) - e1v(ji,jj-1)*e3v_b(ji,jj-1,jk) * pvb(ji,jj-1,jk) ) 86 END DO 87 END DO 75 DO_2D( 0, 1, 0, 1 ) 76 ! ! ahm * e3 * curl (computed from 1 to jpim1/jpjm1) 77 zcur(ji-1,jj-1) = ahmf(ji-1,jj-1,jk) * e3f(ji-1,jj-1,jk) * r1_e1e2f(ji-1,jj-1) & ! ahmf already * by fmask 78 & * ( e2v(ji ,jj-1) * pv(ji ,jj-1,jk) - e2v(ji-1,jj-1) * pv(ji-1,jj-1,jk) & 79 & - e1u(ji-1,jj ) * pu(ji-1,jj ,jk) + e1u(ji-1,jj-1) * pu(ji-1,jj-1,jk) ) 80 ! ! ahm * div (computed from 2 to jpi/jpj) 81 zdiv(ji,jj) = ahmt(ji,jj,jk) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kbb) & ! ahmt already * by tmask 82 & * ( e2u(ji,jj)*e3u(ji,jj,jk,Kbb) * pu(ji,jj,jk) - e2u(ji-1,jj)*e3u(ji-1,jj,jk,Kbb) * pu(ji-1,jj,jk) & 83 & + e1v(ji,jj)*e3v(ji,jj,jk,Kbb) * pv(ji,jj,jk) - e1v(ji,jj-1)*e3v(ji,jj-1,jk,Kbb) * pv(ji,jj-1,jk) ) 84 END_2D 88 85 ! 89 DO jj = 2, jpjm1 ! - curl( curl) + grad( div ) 90 DO ji = fs_2, fs_jpim1 ! vector opt. 91 pua(ji,jj,jk) = pua(ji,jj,jk) + zsign * ( & 92 & - ( zcur(ji ,jj) - zcur(ji,jj-1) ) * r1_e2u(ji,jj) / e3u_n(ji,jj,jk) & 93 & + ( zdiv(ji+1,jj) - zdiv(ji,jj ) ) * r1_e1u(ji,jj) ) 94 ! 95 pva(ji,jj,jk) = pva(ji,jj,jk) + zsign * ( & 96 & ( zcur(ji,jj ) - zcur(ji-1,jj) ) * r1_e1v(ji,jj) / e3v_n(ji,jj,jk) & 97 & + ( zdiv(ji,jj+1) - zdiv(ji ,jj) ) * r1_e2v(ji,jj) ) 98 END DO 99 END DO 86 DO_2D( 0, 0, 0, 0 ) 87 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zsign * umask(ji,jj,jk) * ( & ! * by umask is mandatory for dyn_ldf_blp use 88 & - ( zcur(ji ,jj) - zcur(ji,jj-1) ) * r1_e2u(ji,jj) / e3u(ji,jj,jk,Kmm) & 89 & + ( zdiv(ji+1,jj) - zdiv(ji,jj ) ) * r1_e1u(ji,jj) ) 90 ! 91 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zsign * vmask(ji,jj,jk) * ( & ! * by vmask is mandatory for dyn_ldf_blp use 92 & ( zcur(ji,jj ) - zcur(ji-1,jj) ) * r1_e1v(ji,jj) / e3v(ji,jj,jk,Kmm) & 93 & + ( zdiv(ji,jj+1) - zdiv(ji ,jj) ) * r1_e2v(ji,jj) ) 94 END_2D 100 95 ! ! =============== 101 96 END DO ! End of slab … … 105 100 106 101 107 SUBROUTINE dyn_ldf_blp( kt, pub, pvb, pua, pva)102 SUBROUTINE dyn_ldf_blp( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs ) 108 103 !!---------------------------------------------------------------------- 109 104 !! *** ROUTINE dyn_ldf_blp *** … … 116 111 !! It is computed by two successive calls to dyn_ldf_lap routine 117 112 !! 118 !! ** Action : pt aupdated with the before rotated bilaplacian diffusion113 !! ** Action : pt(:,:,:,:,Krhs) updated with the before rotated bilaplacian diffusion 119 114 !!---------------------------------------------------------------------- 120 115 INTEGER , INTENT(in ) :: kt ! ocean time-step index 121 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pub, pvb ! before velocity fields 122 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pua, pva ! momentum trend 116 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices 117 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pu, pv ! before velocity fields 118 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu_rhs, pv_rhs ! momentum trend 123 119 ! 124 120 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zulap, zvlap ! laplacian at u- and v-point … … 134 130 zvlap(:,:,:) = 0._wp 135 131 ! 136 CALL dyn_ldf_lap( kt, pub, pvb, zulap, zvlap, 1 ) ! rotated laplacian applied to ptb (output in zlap)132 CALL dyn_ldf_lap( kt, Kbb, Kmm, pu, pv, zulap, zvlap, 1 ) ! rotated laplacian applied to pt (output in zlap,Kbb) 137 133 ! 138 CALL lbc_lnk_multi( 'dynldf_lap_blp', zulap, 'U', -1. , zvlap, 'V', -1.) ! Lateral boundary conditions134 CALL lbc_lnk_multi( 'dynldf_lap_blp', zulap, 'U', -1.0_wp, zvlap, 'V', -1.0_wp ) ! Lateral boundary conditions 139 135 ! 140 CALL dyn_ldf_lap( kt, zulap, zvlap, pua, pva, 2 ) ! rotated laplacian applied to zlap (output in pta)136 CALL dyn_ldf_lap( kt, Kbb, Kmm, zulap, zvlap, pu_rhs, pv_rhs, 2 ) ! rotated laplacian applied to zlap (output in pt(:,:,:,:,Krhs)) 141 137 ! 142 138 END SUBROUTINE dyn_ldf_blp -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynspg.F90
r10068 r13463 21 21 USE dynspg_exp ! surface pressure gradient (dyn_spg_exp routine) 22 22 USE dynspg_ts ! surface pressure gradient (dyn_spg_ts routine) 23 USE sbctide ! 24 USE updtide ! 23 USE tide_mod ! 25 24 USE trd_oce ! trends: ocean variables 26 25 USE trddyn ! trend manager: dynamics … … 43 42 INTEGER, PARAMETER :: np_EXP = 0 ! explicit time stepping 44 43 INTEGER, PARAMETER :: np_NO =-1 ! no surface pressure gradient, no scheme 44 ! 45 REAL(wp) :: zt0step ! Time of day at the beginning of the time step 45 46 46 47 !! * Substitutions 47 # include " vectopt_loop_substitute.h90"48 # include "do_loop_substitute.h90" 48 49 !!---------------------------------------------------------------------- 49 50 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 53 54 CONTAINS 54 55 55 SUBROUTINE dyn_spg( kt )56 SUBROUTINE dyn_spg( kt, Kbb, Kmm, Krhs, puu, pvv, pssh, puu_b, pvv_b, Kaa ) 56 57 !!---------------------------------------------------------------------- 57 58 !! *** ROUTINE dyn_spg *** … … 66 67 !! ln_apr_dyn=T : the atmospheric pressure forcing is applied 67 68 !! as the gradient of the inverse barometer ssh: 68 !! apgu = - 1/r au0 di[apr] = 0.5*grav di[ssh_ib+ssh_ibb]69 !! apgv = - 1/r au0 dj[apr] = 0.5*grav dj[ssh_ib+ssh_ibb]70 !! Note that as all external forcing a time averaging over a two r dt69 !! apgu = - 1/rho0 di[apr] = 0.5*grav di[ssh_ib+ssh_ibb] 70 !! apgv = - 1/rho0 dj[apr] = 0.5*grav dj[ssh_ib+ssh_ibb] 71 !! Note that as all external forcing a time averaging over a two rn_Dt 71 72 !! period is used to prevent the divergence of odd and even time step. 72 73 !!---------------------------------------------------------------------- 73 INTEGER, INTENT(in) :: kt ! ocean time-step index 74 INTEGER , INTENT( in ) :: kt ! ocean time-step index 75 INTEGER , INTENT( in ) :: Kbb, Kmm, Krhs, Kaa ! ocean time level indices 76 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 77 REAL(wp), DIMENSION(jpi,jpj,jpt) , INTENT(inout) :: pssh, puu_b, pvv_b ! SSH and barotropic velocities at main time levels 74 78 ! 75 79 INTEGER :: ji, jj, jk ! dummy loop indices 76 REAL(wp) :: z2dt, zg_2, zintp, zgr au0r, zld ! local scalars80 REAL(wp) :: z2dt, zg_2, zintp, zgrho0r, zld ! local scalars 77 81 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zpice 78 82 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv … … 83 87 IF( l_trddyn ) THEN ! temporary save of ta and sa trends 84 88 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 85 ztrdu(:,:,:) = ua(:,:,:)86 ztrdv(:,:,:) = va(:,:,:)89 ztrdu(:,:,:) = puu(:,:,:,Krhs) 90 ztrdv(:,:,:) = pvv(:,:,:,Krhs) 87 91 ENDIF 88 92 ! … … 91 95 .OR. ln_ice_embd ) THEN ! embedded sea-ice 92 96 ! 93 DO jj = 2, jpjm1 94 DO ji = fs_2, fs_jpim1 ! vector opt. 95 spgu(ji,jj) = 0._wp 96 spgv(ji,jj) = 0._wp 97 END DO 98 END DO 97 DO_2D( 0, 0, 0, 0 ) 98 spgu(ji,jj) = 0._wp 99 spgv(ji,jj) = 0._wp 100 END_2D 99 101 ! 100 102 IF( ln_apr_dyn .AND. .NOT.ln_dynspg_ts ) THEN !== Atmospheric pressure gradient (added later in time-split case) ==! 101 103 zg_2 = grav * 0.5 102 DO jj = 2, jpjm1 ! gradient of Patm using inverse barometer ssh 103 DO ji = fs_2, fs_jpim1 ! vector opt. 104 spgu(ji,jj) = spgu(ji,jj) + zg_2 * ( ssh_ib (ji+1,jj) - ssh_ib (ji,jj) & 105 & + ssh_ibb(ji+1,jj) - ssh_ibb(ji,jj) ) * r1_e1u(ji,jj) 106 spgv(ji,jj) = spgv(ji,jj) + zg_2 * ( ssh_ib (ji,jj+1) - ssh_ib (ji,jj) & 107 & + ssh_ibb(ji,jj+1) - ssh_ibb(ji,jj) ) * r1_e2v(ji,jj) 108 END DO 109 END DO 104 DO_2D( 0, 0, 0, 0 ) 105 spgu(ji,jj) = spgu(ji,jj) + zg_2 * ( ssh_ib (ji+1,jj) - ssh_ib (ji,jj) & 106 & + ssh_ibb(ji+1,jj) - ssh_ibb(ji,jj) ) * r1_e1u(ji,jj) 107 spgv(ji,jj) = spgv(ji,jj) + zg_2 * ( ssh_ib (ji,jj+1) - ssh_ib (ji,jj) & 108 & + ssh_ibb(ji,jj+1) - ssh_ibb(ji,jj) ) * r1_e2v(ji,jj) 109 END_2D 110 110 ENDIF 111 111 ! … … 113 113 IF( .NOT.ln_dynspg_ts .AND. ( ln_tide_pot .AND. ln_tide ) ) THEN ! N.B. added directly at sub-time-step in ts-case 114 114 ! 115 CALL upd_tide( kt ) ! update tide potential 115 ! Update tide potential at the beginning of current time step 116 zt0step = REAL(nsec_day, wp)-0.5_wp*rn_Dt 117 CALL upd_tide(zt0step, Kmm) 116 118 ! 117 DO jj = 2, jpjm1 ! add tide potential forcing 118 DO ji = fs_2, fs_jpim1 ! vector opt. 119 spgu(ji,jj) = spgu(ji,jj) + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) * r1_e1u(ji,jj) 120 spgv(ji,jj) = spgv(ji,jj) + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) * r1_e2v(ji,jj) 121 END DO 122 END DO 119 DO_2D( 0, 0, 0, 0 ) 120 spgu(ji,jj) = spgu(ji,jj) + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) * r1_e1u(ji,jj) 121 spgv(ji,jj) = spgv(ji,jj) + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) * r1_e2v(ji,jj) 122 END_2D 123 123 ! 124 124 IF (ln_scal_load) THEN 125 125 zld = rn_scal_load * grav 126 DO jj = 2, jpjm1 ! add scalar approximation for load potential 127 DO ji = fs_2, fs_jpim1 ! vector opt. 128 spgu(ji,jj) = spgu(ji,jj) + zld * ( sshn(ji+1,jj) - sshn(ji,jj) ) * r1_e1u(ji,jj) 129 spgv(ji,jj) = spgv(ji,jj) + zld * ( sshn(ji,jj+1) - sshn(ji,jj) ) * r1_e2v(ji,jj) 130 END DO 131 END DO 126 DO_2D( 0, 0, 0, 0 ) 127 spgu(ji,jj) = spgu(ji,jj) + zld * ( pssh(ji+1,jj,Kmm) - pssh(ji,jj,Kmm) ) * r1_e1u(ji,jj) 128 spgv(ji,jj) = spgv(ji,jj) + zld * ( pssh(ji,jj+1,Kmm) - pssh(ji,jj,Kmm) ) * r1_e2v(ji,jj) 129 END_2D 132 130 ENDIF 133 131 ENDIF … … 136 134 ALLOCATE( zpice(jpi,jpj) ) 137 135 zintp = REAL( MOD( kt-1, nn_fsbc ) ) / REAL( nn_fsbc ) 138 zgrau0r = - grav * r1_rau0 139 zpice(:,:) = ( zintp * snwice_mass(:,:) + ( 1.- zintp ) * snwice_mass_b(:,:) ) * zgrau0r 140 DO jj = 2, jpjm1 141 DO ji = fs_2, fs_jpim1 ! vector opt. 142 spgu(ji,jj) = spgu(ji,jj) + ( zpice(ji+1,jj) - zpice(ji,jj) ) * r1_e1u(ji,jj) 143 spgv(ji,jj) = spgv(ji,jj) + ( zpice(ji,jj+1) - zpice(ji,jj) ) * r1_e2v(ji,jj) 144 END DO 145 END DO 136 zgrho0r = - grav * r1_rho0 137 zpice(:,:) = ( zintp * snwice_mass(:,:) + ( 1.- zintp ) * snwice_mass_b(:,:) ) * zgrho0r 138 DO_2D( 0, 0, 0, 0 ) 139 spgu(ji,jj) = spgu(ji,jj) + ( zpice(ji+1,jj) - zpice(ji,jj) ) * r1_e1u(ji,jj) 140 spgv(ji,jj) = spgv(ji,jj) + ( zpice(ji,jj+1) - zpice(ji,jj) ) * r1_e2v(ji,jj) 141 END_2D 146 142 DEALLOCATE( zpice ) 147 143 ENDIF 148 144 ! 149 DO jk = 1, jpkm1 !== Add all terms to the general trend 150 DO jj = 2, jpjm1 151 DO ji = fs_2, fs_jpim1 ! vector opt. 152 ua(ji,jj,jk) = ua(ji,jj,jk) + spgu(ji,jj) 153 va(ji,jj,jk) = va(ji,jj,jk) + spgv(ji,jj) 154 END DO 155 END DO 156 END DO 145 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 146 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + spgu(ji,jj) 147 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + spgv(ji,jj) 148 END_3D 157 149 ! 158 150 !!gm add here a call to dyn_trd for ice pressure gradient, the surf pressure trends ???? … … 161 153 ! 162 154 SELECT CASE ( nspg ) !== surface pressure gradient computed and add to the general trend ==! 163 CASE ( np_EXP ) ; CALL dyn_spg_exp( kt )! explicit164 CASE ( np_TS ) ; CALL dyn_spg_ts ( kt )! time-splitting155 CASE ( np_EXP ) ; CALL dyn_spg_exp( kt, Kmm, puu, pvv, Krhs ) ! explicit 156 CASE ( np_TS ) ; CALL dyn_spg_ts ( kt, Kbb, Kmm, Krhs, puu, pvv, pssh, puu_b, pvv_b, Kaa ) ! time-splitting 165 157 END SELECT 166 158 ! 167 159 IF( l_trddyn ) THEN ! save the surface pressure gradient trends for further diagnostics 168 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)169 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)170 CALL trd_dyn( ztrdu, ztrdv, jpdyn_spg, kt )160 ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 161 ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 162 CALL trd_dyn( ztrdu, ztrdv, jpdyn_spg, kt, Kmm ) 171 163 DEALLOCATE( ztrdu , ztrdv ) 172 164 ENDIF 173 165 ! ! print mean trends (used for debugging) 174 IF( ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' spg - Ua: ', mask1=umask, &175 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )166 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' spg - Ua: ', mask1=umask, & 167 & tab3d_2=pvv(:,:,:,Krhs), clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 176 168 ! 177 169 IF( ln_timing ) CALL timing_stop('dyn_spg') … … 191 183 NAMELIST/namdyn_spg/ ln_dynspg_exp , ln_dynspg_ts, & 192 184 & ln_bt_fw, ln_bt_av , ln_bt_auto , & 193 & nn_ baro, rn_bt_cmax, nn_bt_flt, rn_bt_alpha185 & nn_e , rn_bt_cmax, nn_bt_flt, rn_bt_alpha 194 186 !!---------------------------------------------------------------------- 195 187 ! … … 200 192 ENDIF 201 193 ! 202 REWIND( numnam_ref ) ! Namelist namdyn_spg in reference namelist : Free surface203 194 READ ( numnam_ref, namdyn_spg, IOSTAT = ios, ERR = 901) 204 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_spg in reference namelist', lwp ) 205 ! 206 REWIND( numnam_cfg ) ! Namelist namdyn_spg in configuration namelist : Free surface 195 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_spg in reference namelist' ) 196 ! 207 197 READ ( numnam_cfg, namdyn_spg, IOSTAT = ios, ERR = 902 ) 208 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namdyn_spg in configuration namelist' , lwp)198 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namdyn_spg in configuration namelist' ) 209 199 IF(lwm) WRITE ( numond, namdyn_spg ) 210 200 ! … … 232 222 ! 233 223 IF( nspg == np_TS ) THEN ! split-explicit scheme initialisation 234 CALL dyn_spg_ts_init ! do it first: set nn_ baroused to allocate some arrays later on224 CALL dyn_spg_ts_init ! do it first: set nn_e used to allocate some arrays later on 235 225 ENDIF 236 226 ! -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynspg_exp.F90
r10068 r13463 30 30 31 31 !! * Substitutions 32 # include " vectopt_loop_substitute.h90"32 # include "do_loop_substitute.h90" 33 33 !!---------------------------------------------------------------------- 34 34 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 38 38 CONTAINS 39 39 40 SUBROUTINE dyn_spg_exp( kt )40 SUBROUTINE dyn_spg_exp( kt, Kmm, puu, pvv, Krhs ) 41 41 !!---------------------------------------------------------------------- 42 42 !! *** routine dyn_spg_exp *** … … 48 48 !! ** Method : Explicit free surface formulation. Add to the general 49 49 !! momentum trend the surface pressure gradient : 50 !! (u a,va) = (ua,va) + (spgu,spgv)51 !! where spgu = -1/r au0 d/dx(ps) = -g/e1u di( sshn)52 !! spgv = -1/r au0 d/dy(ps) = -g/e2v dj( sshn)50 !! (uu(rhs),vv(rhs)) = (uu(rhs),vv(rhs)) + (spgu,spgv) 51 !! where spgu = -1/rho0 d/dx(ps) = -g/e1u di( ssh(now) ) 52 !! spgv = -1/rho0 d/dy(ps) = -g/e2v dj( ssh(now) ) 53 53 !! 54 !! ** Action : ( ua,va) trend of horizontal velocity increased by54 !! ** Action : (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) trend of horizontal velocity increased by 55 55 !! the surf. pressure gradient trend 56 56 !!--------------------------------------------------------------------- 57 INTEGER, INTENT(in) :: kt ! ocean time-step index 57 INTEGER , INTENT( in ) :: kt ! ocean time-step index 58 INTEGER , INTENT( in ) :: Kmm, Krhs ! ocean time level indices 59 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 58 60 !! 59 61 INTEGER :: ji, jj, jk ! dummy loop indices … … 72 74 IF( ln_linssh ) THEN !* linear free surface : add the surface pressure gradient trend 73 75 ! 74 DO jj = 2, jpjm1 ! now surface pressure gradient 75 DO ji = fs_2, fs_jpim1 ! vector opt. 76 spgu(ji,jj) = - grav * ( sshn(ji+1,jj) - sshn(ji,jj) ) * r1_e1u(ji,jj) 77 spgv(ji,jj) = - grav * ( sshn(ji,jj+1) - sshn(ji,jj) ) * r1_e2v(ji,jj) 78 END DO 79 END DO 76 DO_2D( 0, 0, 0, 0 ) 77 spgu(ji,jj) = - grav * ( ssh(ji+1,jj,Kmm) - ssh(ji,jj,Kmm) ) * r1_e1u(ji,jj) 78 spgv(ji,jj) = - grav * ( ssh(ji,jj+1,Kmm) - ssh(ji,jj,Kmm) ) * r1_e2v(ji,jj) 79 END_2D 80 80 ! 81 DO jk = 1, jpkm1 ! Add it to the general trend 82 DO jj = 2, jpjm1 83 DO ji = fs_2, fs_jpim1 ! vector opt. 84 ua(ji,jj,jk) = ua(ji,jj,jk) + spgu(ji,jj) 85 va(ji,jj,jk) = va(ji,jj,jk) + spgv(ji,jj) 86 END DO 87 END DO 88 END DO 81 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 82 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + spgu(ji,jj) 83 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + spgv(ji,jj) 84 END_3D 89 85 ! 90 86 ENDIF -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynspg_ts.F90
r11405 r13463 1 1 MODULE dynspg_ts 2 2 3 !! Includes ROMS wd scheme with diagnostic outputs ; un and uaupdates are commented out !3 !! Includes ROMS wd scheme with diagnostic outputs ; puu(:,:,:,Kmm) and puu(:,:,:,Krhs) updates are commented out ! 4 4 5 5 !!====================================================================== … … 31 31 USE dom_oce ! ocean space and time domain 32 32 USE sbc_oce ! surface boundary condition: ocean 33 USE isf_oce ! ice shelf variable (fwfisf) 33 34 USE zdf_oce ! vertical physics: variables 34 35 USE zdfdrg ! vertical physics: top/bottom drag coef. 35 USE sbcisf ! ice shelf variable (fwfisf)36 36 USE sbcapr ! surface boundary condition: atmospheric pressure 37 37 USE dynadv , ONLY: ln_dynadv_vec … … 44 44 USE bdytides ! open boundary condition data 45 45 USE bdydyn2d ! open boundary conditions on barotropic variables 46 USE sbctide ! tides 47 USE updtide ! tide potential 46 USE tide_mod ! 48 47 USE sbcwave ! surface wave 49 USE diatmb ! Top,middle,bottom output50 48 #if defined key_agrif 51 49 USE agrif_oce_interp ! agrif … … 62 60 USE iom ! IOM library 63 61 USE restart ! only for lrst_oce 64 USE diatmb ! Top,middle,bottom output 62 63 USE iom ! to remove 65 64 66 65 IMPLICIT NONE … … 73 72 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: un_adv , vn_adv !: Advection vel. at "now" barocl. step 74 73 ! 75 INTEGER, SAVE :: icycle ! Number of barotropic sub-steps for each internal step nn_ baro <= 2.5 nn_baro76 REAL(wp),SAVE :: r dtbt! Barotropic time step74 INTEGER, SAVE :: icycle ! Number of barotropic sub-steps for each internal step nn_e <= 2.5 nn_e 75 REAL(wp),SAVE :: rDt_e ! Barotropic time step 77 76 ! 78 77 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) :: wgtbtp1, wgtbtp2 ! 1st & 2nd weights used in time filtering of barotropic fields … … 87 86 88 87 !! * Substitutions 89 # include "vectopt_loop_substitute.h90" 88 # include "do_loop_substitute.h90" 89 # include "domzgr_substitute.h90" 90 90 !!---------------------------------------------------------------------- 91 91 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 103 103 ierr(:) = 0 104 104 ! 105 ALLOCATE( wgtbtp1(3*nn_baro), wgtbtp2(3*nn_baro), zwz(jpi,jpj), STAT=ierr(1) ) 106 ! 105 ALLOCATE( wgtbtp1(3*nn_e), wgtbtp2(3*nn_e), zwz(jpi,jpj), STAT=ierr(1) ) 107 106 IF( ln_dynvor_een .OR. ln_dynvor_eeT ) & 108 & ALLOCATE( ftnw(jpi,jpj) , ftne(jpi,jpj) , & 109 & ftsw(jpi,jpj) , ftse(jpi,jpj) , STAT=ierr(2) ) 107 & ALLOCATE( ftnw(jpi,jpj) , ftne(jpi,jpj) , ftsw(jpi,jpj) , ftse(jpi,jpj), STAT=ierr(2) ) 110 108 ! 111 109 ALLOCATE( un_adv(jpi,jpj), vn_adv(jpi,jpj) , STAT=ierr(3) ) … … 119 117 120 118 121 SUBROUTINE dyn_spg_ts( kt )119 SUBROUTINE dyn_spg_ts( kt, Kbb, Kmm, Krhs, puu, pvv, pssh, puu_b, pvv_b, Kaa ) 122 120 !!---------------------------------------------------------------------- 123 121 !! … … 134 132 !! 135 133 !! ** Action : 136 !! -Update the filtered free surface at step "n+1" : ssha137 !! -Update filtered barotropic velocities at step "n+1" : ua_b, va_b134 !! -Update the filtered free surface at step "n+1" : pssh(:,:,Kaa) 135 !! -Update filtered barotropic velocities at step "n+1" : puu_b(:,:,:,Kaa), vv_b(:,:,:,Kaa) 138 136 !! -Compute barotropic advective fluxes at step "n" : un_adv, vn_adv 139 137 !! These are used to advect tracers and are compliant with discrete 140 138 !! continuity equation taken at the baroclinic time steps. This 141 139 !! ensures tracers conservation. 142 !! - ( ua, va) momentum trend updated with barotropic component.140 !! - (puu(:,:,:,Krhs), pvv(:,:,:,Krhs)) momentum trend updated with barotropic component. 143 141 !! 144 142 !! References : Shchepetkin and McWilliams, Ocean Modelling, 2005. 145 143 !!--------------------------------------------------------------------- 146 INTEGER, INTENT(in) :: kt ! ocean time-step index 144 INTEGER , INTENT( in ) :: kt ! ocean time-step index 145 INTEGER , INTENT( in ) :: Kbb, Kmm, Krhs, Kaa ! ocean time level indices 146 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 147 REAL(wp), DIMENSION(jpi,jpj,jpt) , INTENT(inout) :: pssh, puu_b, pvv_b ! SSH and barotropic velocities at main time levels 147 148 ! 148 149 INTEGER :: ji, jj, jk, jn ! dummy loop indices 149 150 LOGICAL :: ll_fw_start ! =T : forward integration 150 151 LOGICAL :: ll_init ! =T : special startup of 2d equations 151 LOGICAL :: ll_tmp1, ll_tmp2 ! local logical variables used in W/D 152 INTEGER :: ikbu, iktu, noffset ! local integers 153 INTEGER :: ikbv, iktv ! - - 154 REAL(wp) :: r1_2dt_b, z2dt_bf ! local scalars 155 REAL(wp) :: zx1, zx2, zu_spg, zhura, z1_hu ! - - 156 REAL(wp) :: zy1, zy2, zv_spg, zhvra, z1_hv ! - - 152 INTEGER :: noffset ! local integers : time offset for bdy update 153 REAL(wp) :: r1_Dt_b, z1_hu, z1_hv ! local scalars 157 154 REAL(wp) :: za0, za1, za2, za3 ! - - 158 REAL(wp) :: zmdi, zztmp , z1_ht ! - - 159 REAL(wp), DIMENSION(jpi,jpj) :: zsshp2_e, zhf 160 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zu_trd, zu_frc, zssh_frc 161 REAL(wp), DIMENSION(jpi,jpj) :: zwy, zv_trd, zv_frc, zhdiv 162 REAL(wp), DIMENSION(jpi,jpj) :: zsshu_a, zhup2_e, zhust_e, zhtp2_e 163 REAL(wp), DIMENSION(jpi,jpj) :: zsshv_a, zhvp2_e, zhvst_e 155 REAL(wp) :: zztmp, zldg ! - - 156 REAL(wp) :: zhu_bck, zhv_bck, zhdiv ! - - 157 REAL(wp) :: zun_save, zvn_save ! - - 158 REAL(wp), DIMENSION(jpi,jpj) :: zu_trd, zu_frc, zu_spg, zssh_frc 159 REAL(wp), DIMENSION(jpi,jpj) :: zv_trd, zv_frc, zv_spg 160 REAL(wp), DIMENSION(jpi,jpj) :: zsshu_a, zhup2_e, zhtp2_e 161 REAL(wp), DIMENSION(jpi,jpj) :: zsshv_a, zhvp2_e, zsshp2_e 164 162 REAL(wp), DIMENSION(jpi,jpj) :: zCdU_u, zCdU_v ! top/bottom stress at u- & v-points 163 REAL(wp), DIMENSION(jpi,jpj) :: zhU, zhV ! fluxes 164 REAL(wp), DIMENSION(jpi, jpj, jpk) :: ze3u, ze3v 165 165 ! 166 166 REAL(wp) :: zwdramp ! local scalar - only used if ln_wd_dl = .True. … … 172 172 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: ztwdmask, zuwdmask, zvwdmask ! ROMS wetting and drying masks at t,u,v points 173 173 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zuwdav2, zvwdav2 ! averages over the sub-steps of zuwdmask and zvwdmask 174 REAL(wp) :: zt0substep ! Time of day at the beginning of the time substep 174 175 !!---------------------------------------------------------------------- 175 176 ! … … 178 179 IF( ln_wd_dl ) ALLOCATE( ztwdmask(jpi,jpj), zuwdmask(jpi,jpj), zvwdmask(jpi,jpj), zuwdav2(jpi,jpj), zvwdav2(jpi,jpj)) 179 180 ! 180 zmdi=1.e+20 ! missing data indicator for masking181 !182 181 zwdramp = r_rn_wdmin1 ! simplest ramp 183 182 ! zwdramp = 1._wp / (rn_wdmin2 - rn_wdmin1) ! more general ramp 184 ! ! reciprocal of baroclinic time step 185 IF( kt == nit000 .AND. neuler == 0 ) THEN ; z2dt_bf = rdt 186 ELSE ; z2dt_bf = 2.0_wp * rdt 187 ENDIF 188 r1_2dt_b = 1.0_wp / z2dt_bf 183 ! ! inverse of baroclinic time step 184 r1_Dt_b = 1._wp / rDt 189 185 ! 190 186 ll_init = ln_bt_av ! if no time averaging, then no specific restart 191 187 ll_fw_start = .FALSE. 192 188 ! ! time offset in steps for bdy data update 193 IF( .NOT.ln_bt_fw ) THEN ; noffset = - nn_ baro189 IF( .NOT.ln_bt_fw ) THEN ; noffset = - nn_e 194 190 ELSE ; noffset = 0 195 191 ENDIF … … 202 198 IF(lwp) WRITE(numout,*) 203 199 ! 204 IF( neuler == 0) ll_init=.TRUE.205 ! 206 IF( ln_bt_fw .OR. neuler == 0) THEN200 IF( l_1st_euler ) ll_init=.TRUE. 201 ! 202 IF( ln_bt_fw .OR. l_1st_euler ) THEN 207 203 ll_fw_start =.TRUE. 208 204 noffset = 0 … … 210 206 ll_fw_start =.FALSE. 211 207 ENDIF 212 ! 213 ! Set averaging weights and cycle length: 208 ! ! Set averaging weights and cycle length: 214 209 CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 215 210 ! 216 ENDIF 217 ! 218 IF( ln_isfcav ) THEN ! top+bottom friction (ocean cavities) 219 DO jj = 2, jpjm1 220 DO ji = fs_2, fs_jpim1 ! vector opt. 221 zCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) + rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) 222 zCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) + rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) 223 END DO 224 END DO 225 ELSE ! bottom friction only 226 DO jj = 2, jpjm1 227 DO ji = fs_2, fs_jpim1 ! vector opt. 228 zCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) 229 zCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) 230 END DO 231 END DO 232 ENDIF 233 ! 234 ! Set arrays to remove/compute coriolis trend. 235 ! Do it once at kt=nit000 if volume is fixed, else at each long time step. 236 ! Note that these arrays are also used during barotropic loop. These are however frozen 237 ! although they should be updated in the variable volume case. Not a big approximation. 238 ! To remove this approximation, copy lines below inside barotropic loop 239 ! and update depths at T-F points (ht and zhf resp.) at each barotropic time step 240 ! 241 IF( kt == nit000 .OR. .NOT.ln_linssh ) THEN 242 ! 243 SELECT CASE( nvor_scheme ) 244 CASE( np_EEN ) != EEN scheme using e3f (energy & enstrophy scheme) 245 SELECT CASE( nn_een_e3f ) !* ff_f/e3 at F-point 246 CASE ( 0 ) ! original formulation (masked averaging of e3t divided by 4) 247 DO jj = 1, jpjm1 248 DO ji = 1, jpim1 249 zwz(ji,jj) = ( ht_n(ji ,jj+1) + ht_n(ji+1,jj+1) + & 250 & ht_n(ji ,jj ) + ht_n(ji+1,jj ) ) * 0.25_wp 251 IF( zwz(ji,jj) /= 0._wp ) zwz(ji,jj) = ff_f(ji,jj) / zwz(ji,jj) 252 END DO 253 END DO 254 CASE ( 1 ) ! new formulation (masked averaging of e3t divided by the sum of mask) 255 DO jj = 1, jpjm1 256 DO ji = 1, jpim1 257 zwz(ji,jj) = ( ht_n (ji ,jj+1) + ht_n (ji+1,jj+1) & 258 & + ht_n (ji ,jj ) + ht_n (ji+1,jj ) ) & 259 & / ( MAX( 1._wp, ssmask(ji ,jj+1) + ssmask(ji+1,jj+1) & 260 & + ssmask(ji ,jj ) + ssmask(ji+1,jj ) ) ) 261 IF( zwz(ji,jj) /= 0._wp ) zwz(ji,jj) = ff_f(ji,jj) / zwz(ji,jj) 262 END DO 263 END DO 264 END SELECT 265 CALL lbc_lnk( 'dynspg_ts', zwz, 'F', 1._wp ) 266 ! 267 ftne(1,:) = 0._wp ; ftnw(1,:) = 0._wp ; ftse(1,:) = 0._wp ; ftsw(1,:) = 0._wp 268 DO jj = 2, jpj 269 DO ji = 2, jpi 270 ftne(ji,jj) = zwz(ji-1,jj ) + zwz(ji ,jj ) + zwz(ji ,jj-1) 271 ftnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj ) + zwz(ji ,jj ) 272 ftse(ji,jj) = zwz(ji ,jj ) + zwz(ji ,jj-1) + zwz(ji-1,jj-1) 273 ftsw(ji,jj) = zwz(ji ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj ) 274 END DO 275 END DO 276 ! 277 CASE( np_EET ) != EEN scheme using e3t (energy conserving scheme) 278 ftne(1,:) = 0._wp ; ftnw(1,:) = 0._wp ; ftse(1,:) = 0._wp ; ftsw(1,:) = 0._wp 279 DO jj = 2, jpj 280 DO ji = 2, jpi 281 z1_ht = ssmask(ji,jj) / ( ht_n(ji,jj) + 1._wp - ssmask(ji,jj) ) 282 ftne(ji,jj) = ( ff_f(ji-1,jj ) + ff_f(ji ,jj ) + ff_f(ji ,jj-1) ) * z1_ht 283 ftnw(ji,jj) = ( ff_f(ji-1,jj-1) + ff_f(ji-1,jj ) + ff_f(ji ,jj ) ) * z1_ht 284 ftse(ji,jj) = ( ff_f(ji ,jj ) + ff_f(ji ,jj-1) + ff_f(ji-1,jj-1) ) * z1_ht 285 ftsw(ji,jj) = ( ff_f(ji ,jj-1) + ff_f(ji-1,jj-1) + ff_f(ji-1,jj ) ) * z1_ht 286 END DO 287 END DO 288 ! 289 CASE( np_ENE, np_ENS , np_MIX ) != all other schemes (ENE, ENS, MIX) except ENT ! 290 ! 291 zwz(:,:) = 0._wp 292 zhf(:,:) = 0._wp 293 294 !!gm assume 0 in both cases (which is almost surely WRONG ! ) as hvatf has been removed 295 !!gm A priori a better value should be something like : 296 !!gm zhf(i,j) = masked sum of ht(i,j) , ht(i+1,j) , ht(i,j+1) , (i+1,j+1) 297 !!gm divided by the sum of the corresponding mask 298 !!gm 299 !! 300 IF( .NOT.ln_sco ) THEN 301 302 !!gm agree the JC comment : this should be done in a much clear way 303 304 ! JC: It not clear yet what should be the depth at f-points over land in z-coordinate case 305 ! Set it to zero for the time being 306 ! IF( rn_hmin < 0._wp ) THEN ; jk = - INT( rn_hmin ) ! from a nb of level 307 ! ELSE ; jk = MINLOC( gdepw_0, mask = gdepw_0 > rn_hmin, dim = 1 ) ! from a depth 308 ! ENDIF 309 ! zhf(:,:) = gdepw_0(:,:,jk+1) 310 ! 311 ELSE 312 ! 313 !zhf(:,:) = hbatf(:,:) 314 DO jj = 1, jpjm1 315 DO ji = 1, jpim1 316 zhf(ji,jj) = ( ht_0 (ji,jj ) + ht_0 (ji+1,jj ) & 317 & + ht_0 (ji,jj+1) + ht_0 (ji+1,jj+1) ) & 318 & / MAX( ssmask(ji,jj ) + ssmask(ji+1,jj ) & 319 & + ssmask(ji,jj+1) + ssmask(ji+1,jj+1) , 1._wp ) 320 END DO 321 END DO 322 ENDIF 323 ! 324 DO jj = 1, jpjm1 325 zhf(:,jj) = zhf(:,jj) * (1._wp- umask(:,jj,1) * umask(:,jj+1,1)) 326 END DO 327 ! 328 DO jk = 1, jpkm1 329 DO jj = 1, jpjm1 330 zhf(:,jj) = zhf(:,jj) + e3f_n(:,jj,jk) * umask(:,jj,jk) * umask(:,jj+1,jk) 331 END DO 332 END DO 333 CALL lbc_lnk( 'dynspg_ts', zhf, 'F', 1._wp ) 334 ! JC: TBC. hf should be greater than 0 335 DO jj = 1, jpj 336 DO ji = 1, jpi 337 IF( zhf(ji,jj) /= 0._wp ) zwz(ji,jj) = 1._wp / zhf(ji,jj) ! zhf is actually hf here but it saves an array 338 END DO 339 END DO 340 zwz(:,:) = ff_f(:,:) * zwz(:,:) 341 END SELECT 342 ENDIF 343 ! 344 ! If forward start at previous time step, and centered integration, 345 ! then update averaging weights: 346 IF (.NOT.ln_bt_fw .AND.( neuler==0 .AND. kt==nit000+1 ) ) THEN 347 ll_fw_start=.FALSE. 348 CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 349 ENDIF 350 211 ELSEIF( kt == nit000 + 1 ) THEN !* initialisation 2nd time-step 212 ! 213 IF( .NOT.ln_bt_fw ) THEN 214 ! If we did an Euler timestep on the first timestep we need to reset ll_fw_start 215 ! and the averaging weights. We don't have an easy way of telling whether we did 216 ! an Euler timestep on the first timestep (because l_1st_euler is reset to .false. 217 ! at the end of the first timestep) so just do this in all cases. 218 ll_fw_start = .FALSE. 219 CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 220 ENDIF 221 ! 222 ENDIF 223 ! 351 224 ! ----------------------------------------------------------------------------- 352 225 ! Phase 1 : Coupling between general trend and barotropic estimates (1st step) … … 354 227 ! 355 228 ! 356 ! !* e3*d/dt(Ua) (Vertically integrated) 357 ! ! -------------------------------------------------- 358 zu_frc(:,:) = 0._wp 359 zv_frc(:,:) = 0._wp 360 ! 361 DO jk = 1, jpkm1 362 zu_frc(:,:) = zu_frc(:,:) + e3u_n(:,:,jk) * ua(:,:,jk) * umask(:,:,jk) 363 zv_frc(:,:) = zv_frc(:,:) + e3v_n(:,:,jk) * va(:,:,jk) * vmask(:,:,jk) 229 ! != zu_frc = 1/H e3*d/dt(Ua) =! (Vertical mean of Ua, the 3D trends) 230 ! ! --------------------------- ! 231 DO jk = 1 , jpk 232 ze3u(:,:,jk) = e3u(:,:,jk,Kmm) 233 ze3v(:,:,jk) = e3v(:,:,jk,Kmm) 364 234 END DO 365 235 ! 366 zu_frc(:,:) = zu_frc(:,:) * r1_hu_n(:,:) 367 zv_frc(:,:) = zv_frc(:,:) * r1_hv_n(:,:) 368 ! 369 ! 370 ! !* baroclinic momentum trend (remove the vertical mean trend) 371 DO jk = 1, jpkm1 ! ----------------------------------------------------------- 372 DO jj = 2, jpjm1 373 DO ji = fs_2, fs_jpim1 ! vector opt. 374 ua(ji,jj,jk) = ua(ji,jj,jk) - zu_frc(ji,jj) * umask(ji,jj,jk) 375 va(ji,jj,jk) = va(ji,jj,jk) - zv_frc(ji,jj) * vmask(ji,jj,jk) 376 END DO 377 END DO 236 zu_frc(:,:) = SUM( ze3u(:,:,:) * uu(:,:,:,Krhs) * umask(:,:,:) , DIM=3 ) * r1_hu(:,:,Kmm) 237 zv_frc(:,:) = SUM( ze3v(:,:,:) * vv(:,:,:,Krhs) * vmask(:,:,:) , DIM=3 ) * r1_hv(:,:,Kmm) 238 ! 239 ! 240 ! != U(Krhs) => baroclinic trend =! (remove its vertical mean) 241 DO jk = 1, jpkm1 ! ----------------------------- ! 242 uu(:,:,jk,Krhs) = ( uu(:,:,jk,Krhs) - zu_frc(:,:) ) * umask(:,:,jk) 243 vv(:,:,jk,Krhs) = ( vv(:,:,jk,Krhs) - zv_frc(:,:) ) * vmask(:,:,jk) 378 244 END DO 379 245 … … 381 247 !!gm Is it correct to do so ? I think so... 382 248 383 384 ! !* barotropic Coriolis trends (vorticity scheme dependent) 385 ! ! -------------------------------------------------------- 386 ! 387 zwx(:,:) = un_b(:,:) * hu_n(:,:) * e2u(:,:) ! now fluxes 388 zwy(:,:) = vn_b(:,:) * hv_n(:,:) * e1v(:,:) 389 ! 390 SELECT CASE( nvor_scheme ) 391 CASE( np_ENT ) ! enstrophy conserving scheme (f-point) 392 DO jj = 2, jpjm1 393 DO ji = 2, jpim1 ! vector opt. 394 zu_trd(ji,jj) = + r1_4 * r1_e1e2u(ji,jj) * r1_hu_n(ji,jj) & 395 & * ( e1e2t(ji+1,jj)*ht_n(ji+1,jj)*ff_t(ji+1,jj) * ( vn_b(ji+1,jj) + vn_b(ji+1,jj-1) ) & 396 & + e1e2t(ji ,jj)*ht_n(ji ,jj)*ff_t(ji ,jj) * ( vn_b(ji ,jj) + vn_b(ji ,jj-1) ) ) 397 ! 398 zv_trd(ji,jj) = - r1_4 * r1_e1e2v(ji,jj) * r1_hv_n(ji,jj) & 399 & * ( e1e2t(ji,jj+1)*ht_n(ji,jj+1)*ff_t(ji,jj+1) * ( un_b(ji,jj+1) + un_b(ji-1,jj+1) ) & 400 & + e1e2t(ji,jj )*ht_n(ji,jj )*ff_t(ji,jj ) * ( un_b(ji,jj ) + un_b(ji-1,jj ) ) ) 401 END DO 402 END DO 403 ! 404 CASE( np_ENE , np_MIX ) ! energy conserving scheme (t-point) ENE or MIX 405 DO jj = 2, jpjm1 406 DO ji = fs_2, fs_jpim1 ! vector opt. 407 zy1 = ( zwy(ji,jj-1) + zwy(ji+1,jj-1) ) * r1_e1u(ji,jj) 408 zy2 = ( zwy(ji,jj ) + zwy(ji+1,jj ) ) * r1_e1u(ji,jj) 409 zx1 = ( zwx(ji-1,jj) + zwx(ji-1,jj+1) ) * r1_e2v(ji,jj) 410 zx2 = ( zwx(ji ,jj) + zwx(ji ,jj+1) ) * r1_e2v(ji,jj) 411 ! energy conserving formulation for planetary vorticity term 412 zu_trd(ji,jj) = r1_4 * ( zwz(ji ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 413 zv_trd(ji,jj) = - r1_4 * ( zwz(ji-1,jj ) * zx1 + zwz(ji,jj) * zx2 ) 414 END DO 415 END DO 416 ! 417 CASE( np_ENS ) ! enstrophy conserving scheme (f-point) 418 DO jj = 2, jpjm1 419 DO ji = fs_2, fs_jpim1 ! vector opt. 420 zy1 = r1_8 * ( zwy(ji ,jj-1) + zwy(ji+1,jj-1) & 421 & + zwy(ji ,jj ) + zwy(ji+1,jj ) ) * r1_e1u(ji,jj) 422 zx1 = - r1_8 * ( zwx(ji-1,jj ) + zwx(ji-1,jj+1) & 423 & + zwx(ji ,jj ) + zwx(ji ,jj+1) ) * r1_e2v(ji,jj) 424 zu_trd(ji,jj) = zy1 * ( zwz(ji ,jj-1) + zwz(ji,jj) ) 425 zv_trd(ji,jj) = zx1 * ( zwz(ji-1,jj ) + zwz(ji,jj) ) 426 END DO 427 END DO 428 ! 429 CASE( np_EET , np_EEN ) ! energy & enstrophy scheme (using e3t or e3f) 430 DO jj = 2, jpjm1 431 DO ji = fs_2, fs_jpim1 ! vector opt. 432 zu_trd(ji,jj) = + r1_12 * r1_e1u(ji,jj) * ( ftne(ji,jj ) * zwy(ji ,jj ) & 433 & + ftnw(ji+1,jj) * zwy(ji+1,jj ) & 434 & + ftse(ji,jj ) * zwy(ji ,jj-1) & 435 & + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) 436 zv_trd(ji,jj) = - r1_12 * r1_e2v(ji,jj) * ( ftsw(ji,jj+1) * zwx(ji-1,jj+1) & 437 & + ftse(ji,jj+1) * zwx(ji ,jj+1) & 438 & + ftnw(ji,jj ) * zwx(ji-1,jj ) & 439 & + ftne(ji,jj ) * zwx(ji ,jj ) ) 440 END DO 441 END DO 442 ! 443 END SELECT 444 ! 445 ! !* Right-Hand-Side of the barotropic momentum equation 446 ! ! ---------------------------------------------------- 447 IF( .NOT.ln_linssh ) THEN ! Variable volume : remove surface pressure gradient 448 IF( ln_wd_il ) THEN ! Calculating and applying W/D gravity filters 449 DO jj = 2, jpjm1 450 DO ji = 2, jpim1 451 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji+1,jj) ) > & 452 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) .AND. & 453 & MAX( sshn(ji,jj) + ht_0(ji,jj) , sshn(ji+1,jj) + ht_0(ji+1,jj) ) & 454 & > rn_wdmin1 + rn_wdmin2 455 ll_tmp2 = ( ABS( sshn(ji+1,jj) - sshn(ji ,jj)) > 1.E-12 ).AND.( & 456 & MAX( sshn(ji,jj) , sshn(ji+1,jj) ) > & 457 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 458 IF(ll_tmp1) THEN 459 zcpx(ji,jj) = 1.0_wp 460 ELSEIF(ll_tmp2) THEN 461 ! no worries about sshn(ji+1,jj) - sshn(ji ,jj) = 0, it won't happen ! here 462 zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 463 & / (sshn(ji+1,jj) - sshn(ji ,jj)) ) 464 zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 465 ELSE 466 zcpx(ji,jj) = 0._wp 467 ENDIF 468 ! 469 ll_tmp1 = MIN( sshn(ji,jj) , sshn(ji,jj+1) ) > & 470 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) .AND. & 471 & MAX( sshn(ji,jj) + ht_0(ji,jj) , sshn(ji,jj+1) + ht_0(ji,jj+1) ) & 472 & > rn_wdmin1 + rn_wdmin2 473 ll_tmp2 = ( ABS( sshn(ji,jj) - sshn(ji,jj+1)) > 1.E-12 ).AND.( & 474 & MAX( sshn(ji,jj) , sshn(ji,jj+1) ) > & 475 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 476 477 IF(ll_tmp1) THEN 478 zcpy(ji,jj) = 1.0_wp 479 ELSE IF(ll_tmp2) THEN 480 ! no worries about sshn(ji,jj+1) - sshn(ji,jj ) = 0, it won't happen ! here 481 zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 482 & / (sshn(ji,jj+1) - sshn(ji,jj )) ) 483 zcpy(ji,jj) = MAX( 0._wp , MIN( zcpy(ji,jj) , 1.0_wp ) ) 484 ELSE 485 zcpy(ji,jj) = 0._wp 486 ENDIF 487 END DO 488 END DO 489 ! 490 DO jj = 2, jpjm1 491 DO ji = 2, jpim1 492 zu_trd(ji,jj) = zu_trd(ji,jj) - grav * ( sshn(ji+1,jj ) - sshn(ji ,jj ) ) & 493 & * r1_e1u(ji,jj) * zcpx(ji,jj) * wdrampu(ji,jj) !jth 494 zv_trd(ji,jj) = zv_trd(ji,jj) - grav * ( sshn(ji ,jj+1) - sshn(ji ,jj ) ) & 495 & * r1_e2v(ji,jj) * zcpy(ji,jj) * wdrampv(ji,jj) !jth 496 END DO 497 END DO 498 ! 499 ELSE 500 ! 501 DO jj = 2, jpjm1 502 DO ji = fs_2, fs_jpim1 ! vector opt. 503 zu_trd(ji,jj) = zu_trd(ji,jj) - grav * ( sshn(ji+1,jj ) - sshn(ji ,jj ) ) * r1_e1u(ji,jj) 504 zv_trd(ji,jj) = zv_trd(ji,jj) - grav * ( sshn(ji ,jj+1) - sshn(ji ,jj ) ) * r1_e2v(ji,jj) 505 END DO 506 END DO 507 ENDIF 508 ! 509 ENDIF 510 ! 511 DO jj = 2, jpjm1 ! Remove coriolis term (and possibly spg) from barotropic trend 512 DO ji = fs_2, fs_jpim1 513 zu_frc(ji,jj) = zu_frc(ji,jj) - zu_trd(ji,jj) * ssumask(ji,jj) 514 zv_frc(ji,jj) = zv_frc(ji,jj) - zv_trd(ji,jj) * ssvmask(ji,jj) 515 END DO 516 END DO 517 ! 518 ! ! Add bottom stress contribution from baroclinic velocities: 519 IF (ln_bt_fw) THEN 520 DO jj = 2, jpjm1 521 DO ji = fs_2, fs_jpim1 ! vector opt. 522 ikbu = mbku(ji,jj) 523 ikbv = mbkv(ji,jj) 524 zwx(ji,jj) = un(ji,jj,ikbu) - un_b(ji,jj) ! NOW bottom baroclinic velocities 525 zwy(ji,jj) = vn(ji,jj,ikbv) - vn_b(ji,jj) 526 END DO 527 END DO 249 ! != remove 2D Coriolis and pressure gradient trends =! 250 ! ! ------------------------------------------------- ! 251 ! 252 IF( kt == nit000 .OR. .NOT. ln_linssh ) CALL dyn_cor_2D_init( Kmm ) ! Set zwz, the barotropic Coriolis force coefficient 253 ! ! recompute zwz = f/depth at every time step for (.NOT.ln_linssh) as the water colomn height changes 254 ! 255 ! !* 2D Coriolis trends 256 zhU(:,:) = puu_b(:,:,Kmm) * hu(:,:,Kmm) * e2u(:,:) ! now fluxes 257 zhV(:,:) = pvv_b(:,:,Kmm) * hv(:,:,Kmm) * e1v(:,:) ! NB: FULL domain : put a value in last row and column 258 ! 259 CALL dyn_cor_2d( ht(:,:), hu(:,:,Kmm), hv(:,:,Kmm), puu_b(:,:,Kmm), pvv_b(:,:,Kmm), zhU, zhV, & ! <<== in 260 & zu_trd, zv_trd ) ! ==>> out 261 ! 262 IF( .NOT.ln_linssh ) THEN !* surface pressure gradient (variable volume only) 263 ! 264 IF( ln_wd_il ) THEN ! W/D : limiter applied to spgspg 265 CALL wad_spg( pssh(:,:,Kmm), zcpx, zcpy ) ! Calculating W/D gravity filters, zcpx and zcpy 266 DO_2D( 0, 0, 0, 0 ) 267 zu_trd(ji,jj) = zu_trd(ji,jj) - grav * ( pssh(ji+1,jj ,Kmm) - pssh(ji ,jj ,Kmm) ) & 268 & * r1_e1u(ji,jj) * zcpx(ji,jj) * wdrampu(ji,jj) !jth 269 zv_trd(ji,jj) = zv_trd(ji,jj) - grav * ( pssh(ji ,jj+1,Kmm) - pssh(ji ,jj ,Kmm) ) & 270 & * r1_e2v(ji,jj) * zcpy(ji,jj) * wdrampv(ji,jj) !jth 271 END_2D 272 ELSE ! now suface pressure gradient 273 DO_2D( 0, 0, 0, 0 ) 274 zu_trd(ji,jj) = zu_trd(ji,jj) - grav * ( pssh(ji+1,jj ,Kmm) - pssh(ji ,jj ,Kmm) ) * r1_e1u(ji,jj) 275 zv_trd(ji,jj) = zv_trd(ji,jj) - grav * ( pssh(ji ,jj+1,Kmm) - pssh(ji ,jj ,Kmm) ) * r1_e2v(ji,jj) 276 END_2D 277 ENDIF 278 ! 279 ENDIF 280 ! 281 DO_2D( 0, 0, 0, 0 ) 282 zu_frc(ji,jj) = zu_frc(ji,jj) - zu_trd(ji,jj) * ssumask(ji,jj) 283 zv_frc(ji,jj) = zv_frc(ji,jj) - zv_trd(ji,jj) * ssvmask(ji,jj) 284 END_2D 285 ! 286 ! != Add bottom stress contribution from baroclinic velocities =! 287 ! ! ----------------------------------------------------------- ! 288 CALL dyn_drg_init( Kbb, Kmm, puu, pvv, puu_b ,pvv_b, zu_frc, zv_frc, zCdU_u, zCdU_v ) ! also provide the barotropic drag coefficients 289 ! != Add atmospheric pressure forcing =! 290 ! ! ---------------------------------- ! 291 IF( ln_apr_dyn ) THEN 292 IF( ln_bt_fw ) THEN ! FORWARD integration: use kt+1/2 pressure (NOW+1/2) 293 DO_2D( 0, 0, 0, 0 ) 294 zu_frc(ji,jj) = zu_frc(ji,jj) + grav * ( ssh_ib (ji+1,jj ) - ssh_ib (ji,jj) ) * r1_e1u(ji,jj) 295 zv_frc(ji,jj) = zv_frc(ji,jj) + grav * ( ssh_ib (ji ,jj+1) - ssh_ib (ji,jj) ) * r1_e2v(ji,jj) 296 END_2D 297 ELSE ! CENTRED integration: use kt-1/2 + kt+1/2 pressure (NOW) 298 zztmp = grav * r1_2 299 DO_2D( 0, 0, 0, 0 ) 300 zu_frc(ji,jj) = zu_frc(ji,jj) + zztmp * ( ssh_ib (ji+1,jj ) - ssh_ib (ji,jj) & 301 & + ssh_ibb(ji+1,jj ) - ssh_ibb(ji,jj) ) * r1_e1u(ji,jj) 302 zv_frc(ji,jj) = zv_frc(ji,jj) + zztmp * ( ssh_ib (ji ,jj+1) - ssh_ib (ji,jj) & 303 & + ssh_ibb(ji ,jj+1) - ssh_ibb(ji,jj) ) * r1_e2v(ji,jj) 304 END_2D 305 ENDIF 306 ENDIF 307 ! 308 ! != Add atmospheric pressure forcing =! 309 ! ! ---------------------------------- ! 310 IF( ln_bt_fw ) THEN ! Add wind forcing 311 DO_2D( 0, 0, 0, 0 ) 312 zu_frc(ji,jj) = zu_frc(ji,jj) + r1_rho0 * utau(ji,jj) * r1_hu(ji,jj,Kmm) 313 zv_frc(ji,jj) = zv_frc(ji,jj) + r1_rho0 * vtau(ji,jj) * r1_hv(ji,jj,Kmm) 314 END_2D 528 315 ELSE 529 DO jj = 2, jpjm1 530 DO ji = fs_2, fs_jpim1 ! vector opt. 531 ikbu = mbku(ji,jj) 532 ikbv = mbkv(ji,jj) 533 zwx(ji,jj) = ub(ji,jj,ikbu) - ub_b(ji,jj) ! BEFORE bottom baroclinic velocities 534 zwy(ji,jj) = vb(ji,jj,ikbv) - vb_b(ji,jj) 535 END DO 536 END DO 537 ENDIF 538 ! 539 ! Note that the "unclipped" bottom friction parameter is used even with explicit drag 540 IF( ln_wd_il ) THEN 541 zztmp = -1._wp / rdtbt 542 DO jj = 2, jpjm1 543 DO ji = fs_2, fs_jpim1 ! vector opt. 544 zu_frc(ji,jj) = zu_frc(ji,jj) + & 545 & MAX(r1_hu_n(ji,jj) * r1_2 * ( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ), zztmp ) * zwx(ji,jj) * wdrampu(ji,jj) 546 zv_frc(ji,jj) = zv_frc(ji,jj) + & 547 & MAX(r1_hv_n(ji,jj) * r1_2 * ( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ), zztmp ) * zwy(ji,jj) * wdrampv(ji,jj) 548 END DO 549 END DO 550 ELSE 551 DO jj = 2, jpjm1 552 DO ji = fs_2, fs_jpim1 ! vector opt. 553 zu_frc(ji,jj) = zu_frc(ji,jj) + r1_hu_n(ji,jj) * r1_2 * ( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * zwx(ji,jj) 554 zv_frc(ji,jj) = zv_frc(ji,jj) + r1_hv_n(ji,jj) * r1_2 * ( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * zwy(ji,jj) 555 END DO 556 END DO 316 zztmp = r1_rho0 * r1_2 317 DO_2D( 0, 0, 0, 0 ) 318 zu_frc(ji,jj) = zu_frc(ji,jj) + zztmp * ( utau_b(ji,jj) + utau(ji,jj) ) * r1_hu(ji,jj,Kmm) 319 zv_frc(ji,jj) = zv_frc(ji,jj) + zztmp * ( vtau_b(ji,jj) + vtau(ji,jj) ) * r1_hv(ji,jj,Kmm) 320 END_2D 321 ENDIF 322 ! 323 ! !----------------! 324 ! !== sssh_frc ==! Right-Hand-Side of the barotropic ssh equation (over the FULL domain) 325 ! !----------------! 326 ! != Net water flux forcing applied to a water column =! 327 ! ! --------------------------------------------------- ! 328 IF (ln_bt_fw) THEN ! FORWARD integration: use kt+1/2 fluxes (NOW+1/2) 329 zssh_frc(:,:) = r1_rho0 * ( emp(:,:) - rnf(:,:) + fwfisf_cav(:,:) + fwfisf_par(:,:) ) 330 ELSE ! CENTRED integration: use kt-1/2 + kt+1/2 fluxes (NOW) 331 zztmp = r1_rho0 * r1_2 332 zssh_frc(:,:) = zztmp * ( emp(:,:) + emp_b(:,:) & 333 & - rnf(:,:) - rnf_b(:,:) & 334 & + fwfisf_cav(:,:) + fwfisf_cav_b(:,:) & 335 & + fwfisf_par(:,:) + fwfisf_par_b(:,:) ) 336 ENDIF 337 ! != Add Stokes drift divergence =! (if exist) 338 IF( ln_sdw ) THEN ! ----------------------------- ! 339 zssh_frc(:,:) = zssh_frc(:,:) + div_sd(:,:) 340 ENDIF 341 ! 342 ! ! ice sheet coupling 343 IF ( ln_isf .AND. ln_isfcpl ) THEN 344 ! 345 ! ice sheet coupling 346 IF( ln_rstart .AND. kt == nit000 ) THEN 347 zssh_frc(:,:) = zssh_frc(:,:) + risfcpl_ssh(:,:) 348 END IF 349 ! 350 ! conservation option 351 IF( ln_isfcpl_cons ) THEN 352 zssh_frc(:,:) = zssh_frc(:,:) + risfcpl_cons_ssh(:,:) 353 END IF 354 ! 557 355 END IF 558 356 ! 559 IF( ln_isfcav ) THEN ! Add TOP stress contribution from baroclinic velocities:560 IF( ln_bt_fw ) THEN561 DO jj = 2, jpjm1562 DO ji = fs_2, fs_jpim1 ! vector opt.563 iktu = miku(ji,jj)564 iktv = mikv(ji,jj)565 zwx(ji,jj) = un(ji,jj,iktu) - un_b(ji,jj) ! NOW top baroclinic velocities566 zwy(ji,jj) = vn(ji,jj,iktv) - vn_b(ji,jj)567 END DO568 END DO569 ELSE570 DO jj = 2, jpjm1571 DO ji = fs_2, fs_jpim1 ! vector opt.572 iktu = miku(ji,jj)573 iktv = mikv(ji,jj)574 zwx(ji,jj) = ub(ji,jj,iktu) - ub_b(ji,jj) ! BEFORE top baroclinic velocities575 zwy(ji,jj) = vb(ji,jj,iktv) - vb_b(ji,jj)576 END DO577 END DO578 ENDIF579 !580 ! Note that the "unclipped" top friction parameter is used even with explicit drag581 DO jj = 2, jpjm1582 DO ji = fs_2, fs_jpim1 ! vector opt.583 zu_frc(ji,jj) = zu_frc(ji,jj) + r1_hu_n(ji,jj) * r1_2 * ( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * zwx(ji,jj)584 zv_frc(ji,jj) = zv_frc(ji,jj) + r1_hv_n(ji,jj) * r1_2 * ( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * zwy(ji,jj)585 END DO586 END DO587 ENDIF588 !589 IF( ln_bt_fw ) THEN ! Add wind forcing590 DO jj = 2, jpjm1591 DO ji = fs_2, fs_jpim1 ! vector opt.592 zu_frc(ji,jj) = zu_frc(ji,jj) + r1_rau0 * utau(ji,jj) * r1_hu_n(ji,jj)593 zv_frc(ji,jj) = zv_frc(ji,jj) + r1_rau0 * vtau(ji,jj) * r1_hv_n(ji,jj)594 END DO595 END DO596 ELSE597 zztmp = r1_rau0 * r1_2598 DO jj = 2, jpjm1599 DO ji = fs_2, fs_jpim1 ! vector opt.600 zu_frc(ji,jj) = zu_frc(ji,jj) + zztmp * ( utau_b(ji,jj) + utau(ji,jj) ) * r1_hu_n(ji,jj)601 zv_frc(ji,jj) = zv_frc(ji,jj) + zztmp * ( vtau_b(ji,jj) + vtau(ji,jj) ) * r1_hv_n(ji,jj)602 END DO603 END DO604 ENDIF605 !606 IF( ln_apr_dyn ) THEN ! Add atm pressure forcing607 IF( ln_bt_fw ) THEN608 DO jj = 2, jpjm1609 DO ji = fs_2, fs_jpim1 ! vector opt.610 zu_spg = grav * ( ssh_ib (ji+1,jj ) - ssh_ib (ji,jj) ) * r1_e1u(ji,jj)611 zv_spg = grav * ( ssh_ib (ji ,jj+1) - ssh_ib (ji,jj) ) * r1_e2v(ji,jj)612 zu_frc(ji,jj) = zu_frc(ji,jj) + zu_spg613 zv_frc(ji,jj) = zv_frc(ji,jj) + zv_spg614 END DO615 END DO616 ELSE617 zztmp = grav * r1_2618 DO jj = 2, jpjm1619 DO ji = fs_2, fs_jpim1 ! vector opt.620 zu_spg = zztmp * ( ssh_ib (ji+1,jj ) - ssh_ib (ji,jj) &621 & + ssh_ibb(ji+1,jj ) - ssh_ibb(ji,jj) ) * r1_e1u(ji,jj)622 zv_spg = zztmp * ( ssh_ib (ji ,jj+1) - ssh_ib (ji,jj) &623 & + ssh_ibb(ji ,jj+1) - ssh_ibb(ji,jj) ) * r1_e2v(ji,jj)624 zu_frc(ji,jj) = zu_frc(ji,jj) + zu_spg625 zv_frc(ji,jj) = zv_frc(ji,jj) + zv_spg626 END DO627 END DO628 ENDIF629 ENDIF630 ! !* Right-Hand-Side of the barotropic ssh equation631 ! ! -----------------------------------------------632 ! ! Surface net water flux and rivers633 IF (ln_bt_fw) THEN634 zssh_frc(:,:) = r1_rau0 * ( emp(:,:) - rnf(:,:) + fwfisf(:,:) )635 ELSE636 zztmp = r1_rau0 * r1_2637 zssh_frc(:,:) = zztmp * ( emp(:,:) + emp_b(:,:) - rnf(:,:) - rnf_b(:,:) &638 & + fwfisf(:,:) + fwfisf_b(:,:) )639 ENDIF640 !641 IF( ln_sdw ) THEN ! Stokes drift divergence added if necessary642 zssh_frc(:,:) = zssh_frc(:,:) + div_sd(:,:)643 ENDIF644 !645 357 #if defined key_asminc 646 ! ! Include the IAU weighted SSH increment 358 ! != Add the IAU weighted SSH increment =! 359 ! ! ------------------------------------ ! 647 360 IF( lk_asminc .AND. ln_sshinc .AND. ln_asmiau ) THEN 648 361 zssh_frc(:,:) = zssh_frc(:,:) - ssh_iau(:,:) 649 362 ENDIF 650 363 #endif 651 ! ! *Fill boundary data arrays for AGRIF364 ! != Fill boundary data arrays for AGRIF 652 365 ! ! ------------------------------------ 653 366 #if defined key_agrif … … 671 384 vb_e (:,:) = 0._wp 672 385 ENDIF 673 386 ! 387 IF( ln_linssh ) THEN ! mid-step ocean depth is fixed (hup2_e=hu_n=hu_0) 388 zhup2_e(:,:) = hu(:,:,Kmm) 389 zhvp2_e(:,:) = hv(:,:,Kmm) 390 zhtp2_e(:,:) = ht(:,:) 391 ENDIF 674 392 ! 675 393 IF (ln_bt_fw) THEN ! FORWARD integration: start from NOW fields 676 sshn_e(:,:) = sshn(:,:)677 un_e (:,:) = un_b(:,:)678 vn_e (:,:) = vn_b(:,:)679 ! 680 hu_e (:,:) = hu _n(:,:)681 hv_e (:,:) = hv _n(:,:)682 hur_e (:,:) = r1_hu _n(:,:)683 hvr_e (:,:) = r1_hv _n(:,:)394 sshn_e(:,:) = pssh(:,:,Kmm) 395 un_e (:,:) = puu_b(:,:,Kmm) 396 vn_e (:,:) = pvv_b(:,:,Kmm) 397 ! 398 hu_e (:,:) = hu(:,:,Kmm) 399 hv_e (:,:) = hv(:,:,Kmm) 400 hur_e (:,:) = r1_hu(:,:,Kmm) 401 hvr_e (:,:) = r1_hv(:,:,Kmm) 684 402 ELSE ! CENTRED integration: start from BEFORE fields 685 sshn_e(:,:) = sshb(:,:) 686 un_e (:,:) = ub_b(:,:) 687 vn_e (:,:) = vb_b(:,:) 688 ! 689 hu_e (:,:) = hu_b(:,:) 690 hv_e (:,:) = hv_b(:,:) 691 hur_e (:,:) = r1_hu_b(:,:) 692 hvr_e (:,:) = r1_hv_b(:,:) 693 ENDIF 694 ! 695 ! 403 sshn_e(:,:) = pssh(:,:,Kbb) 404 un_e (:,:) = puu_b(:,:,Kbb) 405 vn_e (:,:) = pvv_b(:,:,Kbb) 406 ! 407 hu_e (:,:) = hu(:,:,Kbb) 408 hv_e (:,:) = hv(:,:,Kbb) 409 hur_e (:,:) = r1_hu(:,:,Kbb) 410 hvr_e (:,:) = r1_hv(:,:,Kbb) 411 ENDIF 696 412 ! 697 413 ! Initialize sums: 698 ua_b (:,:) = 0._wp ! After barotropic velocities (or transport if flux form)699 va_b (:,:) = 0._wp700 ssha (:,:) = 0._wp ! Sum for after averaged sea level414 puu_b (:,:,Kaa) = 0._wp ! After barotropic velocities (or transport if flux form) 415 pvv_b (:,:,Kaa) = 0._wp 416 pssh (:,:,Kaa) = 0._wp ! Sum for after averaged sea level 701 417 un_adv(:,:) = 0._wp ! Sum for now transport issued from ts loop 702 418 vn_adv(:,:) = 0._wp … … 714 430 ! 715 431 l_full_nf_update = jn == icycle ! false: disable full North fold update (performances) for jn = 1 to icycle-1 716 ! ! ------------------ 717 ! !* Update the forcing (BDY and tides) 718 ! ! ------------------ 719 ! Update only tidal forcing at open boundaries 720 IF( ln_bdy .AND. ln_tide ) CALL bdy_dta_tides( kt, kit=jn, time_offset= noffset+1 ) 721 IF( ln_tide_pot .AND. ln_tide ) CALL upd_tide ( kt, kit=jn, time_offset= noffset ) 722 ! 723 ! Set extrapolation coefficients for predictor step: 432 ! 433 ! !== Update the forcing ==! (BDY and tides) 434 ! 435 IF( ln_bdy .AND. ln_tide ) CALL bdy_dta_tides( kt, kit=jn, pt_offset= REAL(noffset+1,wp) ) 436 ! Update tide potential at the beginning of current time substep 437 IF( ln_tide_pot .AND. ln_tide ) THEN 438 zt0substep = REAL(nsec_day, wp) - 0.5_wp*rn_Dt + (jn + noffset - 1) * rn_Dt / REAL(nn_e, wp) 439 CALL upd_tide(zt0substep, Kmm) 440 END IF 441 ! 442 ! !== extrapolation at mid-step ==! (jn+1/2) 443 ! 444 ! !* Set extrapolation coefficients for predictor step: 724 445 IF ((jn<3).AND.ll_init) THEN ! Forward 725 446 za1 = 1._wp … … 731 452 za3 = 0.281105_wp ! za3 = bet 732 453 ENDIF 733 734 ! Extrapolate barotropic velocities at step jit+0.5: 454 ! 455 ! !* Extrapolate barotropic velocities at mid-step (jn+1/2) 456 !-- m+1/2 m m-1 m-2 --! 457 !-- u = (3/2+beta) u -(1/2+2beta) u + beta u --! 458 !-------------------------------------------------------------------------! 735 459 ua_e(:,:) = za1 * un_e(:,:) + za2 * ub_e(:,:) + za3 * ubb_e(:,:) 736 460 va_e(:,:) = za1 * vn_e(:,:) + za2 * vb_e(:,:) + za3 * vbb_e(:,:) … … 739 463 ! ! ------------------ 740 464 ! Extrapolate Sea Level at step jit+0.5: 465 !-- m+1/2 m m-1 m-2 --! 466 !-- ssh = (3/2+beta) ssh -(1/2+2beta) ssh + beta ssh --! 467 !--------------------------------------------------------------------------------! 741 468 zsshp2_e(:,:) = za1 * sshn_e(:,:) + za2 * sshb_e(:,:) + za3 * sshbb_e(:,:) 742 469 743 ! set wetting & drying mask at tracer points for this barotropic sub-step 744 IF ( ln_wd_dl ) THEN 745 ! 746 IF ( ln_wd_dl_rmp ) THEN 747 DO jj = 1, jpj 748 DO ji = 1, jpi ! vector opt. 749 IF ( zsshp2_e(ji,jj) + ht_0(ji,jj) > 2._wp * rn_wdmin1 ) THEN 750 ! IF ( zsshp2_e(ji,jj) + ht_0(ji,jj) > rn_wdmin2 ) THEN 751 ztwdmask(ji,jj) = 1._wp 752 ELSE IF ( zsshp2_e(ji,jj) + ht_0(ji,jj) > rn_wdmin1 ) THEN 753 ztwdmask(ji,jj) = (tanh(50._wp*( ( zsshp2_e(ji,jj) + ht_0(ji,jj) - rn_wdmin1 )*r_rn_wdmin1)) ) 754 ELSE 755 ztwdmask(ji,jj) = 0._wp 756 END IF 757 END DO 758 END DO 759 ELSE 760 DO jj = 1, jpj 761 DO ji = 1, jpi ! vector opt. 762 IF ( zsshp2_e(ji,jj) + ht_0(ji,jj) > rn_wdmin1 ) THEN 763 ztwdmask(ji,jj) = 1._wp 764 ELSE 765 ztwdmask(ji,jj) = 0._wp 766 ENDIF 767 END DO 768 END DO 769 ENDIF 770 ! 771 ENDIF 470 ! set wetting & drying mask at tracer points for this barotropic mid-step 471 IF( ln_wd_dl ) CALL wad_tmsk( zsshp2_e, ztwdmask ) 772 472 ! 773 DO jj = 2, jpjm1 ! Sea Surface Height at u- & v-points 774 DO ji = 2, fs_jpim1 ! Vector opt. 775 zwx(ji,jj) = r1_2 * ssumask(ji,jj) * r1_e1e2u(ji,jj) & 776 & * ( e1e2t(ji ,jj) * zsshp2_e(ji ,jj) & 777 & + e1e2t(ji+1,jj) * zsshp2_e(ji+1,jj) ) 778 zwy(ji,jj) = r1_2 * ssvmask(ji,jj) * r1_e1e2v(ji,jj) & 779 & * ( e1e2t(ji,jj ) * zsshp2_e(ji,jj ) & 780 & + e1e2t(ji,jj+1) * zsshp2_e(ji,jj+1) ) 781 END DO 782 END DO 783 CALL lbc_lnk_multi( 'dynspg_ts', zwx, 'U', 1._wp, zwy, 'V', 1._wp ) 473 ! ! ocean t-depth at mid-step 474 zhtp2_e(:,:) = ht_0(:,:) + zsshp2_e(:,:) 784 475 ! 785 zhup2_e(:,:) = hu_0(:,:) + zwx(:,:) ! Ocean depth at U- and V-points 786 zhvp2_e(:,:) = hv_0(:,:) + zwy(:,:) 787 zhtp2_e(:,:) = ht_0(:,:) + zsshp2_e(:,:) 788 ELSE 789 zhup2_e(:,:) = hu_n(:,:) 790 zhvp2_e(:,:) = hv_n(:,:) 791 zhtp2_e(:,:) = ht_n(:,:) 792 ENDIF 793 ! !* after ssh 794 ! ! ----------- 795 ! 796 ! Enforce volume conservation at open boundaries: 476 ! ! ocean u- and v-depth at mid-step (separate DO-loops remove the need of a lbc_lnk) 477 DO_2D( 1, 1, 1, 0 ) 478 zhup2_e(ji,jj) = hu_0(ji,jj) + r1_2 * r1_e1e2u(ji,jj) & 479 & * ( e1e2t(ji ,jj) * zsshp2_e(ji ,jj) & 480 & + e1e2t(ji+1,jj) * zsshp2_e(ji+1,jj) ) * ssumask(ji,jj) 481 END_2D 482 DO_2D( 1, 0, 1, 1 ) 483 zhvp2_e(ji,jj) = hv_0(ji,jj) + r1_2 * r1_e1e2v(ji,jj) & 484 & * ( e1e2t(ji,jj ) * zsshp2_e(ji,jj ) & 485 & + e1e2t(ji,jj+1) * zsshp2_e(ji,jj+1) ) * ssvmask(ji,jj) 486 END_2D 487 ! 488 ENDIF 489 ! 490 ! !== after SSH ==! (jn+1) 491 ! 492 ! ! update (ua_e,va_e) to enforce volume conservation at open boundaries 493 ! ! values of zhup2_e and zhvp2_e on the halo are not needed in bdy_vol2d 797 494 IF( ln_bdy .AND. ln_vol ) CALL bdy_vol2d( kt, jn, ua_e, va_e, zhup2_e, zhvp2_e ) 798 ! 799 zwx(:,:) = e2u(:,:) * ua_e(:,:) * zhup2_e(:,:) ! fluxes at jn+0.5 800 zwy(:,:) = e1v(:,:) * va_e(:,:) * zhvp2_e(:,:) 495 ! 496 ! ! resulting flux at mid-step (not over the full domain) 497 zhU(1:jpim1,1:jpj ) = e2u(1:jpim1,1:jpj ) * ua_e(1:jpim1,1:jpj ) * zhup2_e(1:jpim1,1:jpj ) ! not jpi-column 498 zhV(1:jpi ,1:jpjm1) = e1v(1:jpi ,1:jpjm1) * va_e(1:jpi ,1:jpjm1) * zhvp2_e(1:jpi ,1:jpjm1) ! not jpj-row 801 499 ! 802 500 #if defined key_agrif 803 501 ! Set fluxes during predictor step to ensure volume conservation 804 IF( .NOT.Agrif_Root() .AND. ln_bt_fw ) THEN 805 IF((nbondi == -1).OR.(nbondi == 2)) THEN 806 DO jj = 1, jpj 807 zwx(2:nbghostcells+1,jj) = ubdy_w(1:nbghostcells,jj) * e2u(2:nbghostcells+1,jj) 808 zwy(2:nbghostcells+1,jj) = vbdy_w(1:nbghostcells,jj) * e1v(2:nbghostcells+1,jj) 809 END DO 810 ENDIF 811 IF((nbondi == 1).OR.(nbondi == 2)) THEN 812 DO jj=1,jpj 813 zwx(nlci-nbghostcells-1:nlci-2,jj) = ubdy_e(1:nbghostcells,jj) * e2u(nlci-nbghostcells-1:nlci-2,jj) 814 zwy(nlci-nbghostcells :nlci-1,jj) = vbdy_e(1:nbghostcells,jj) * e1v(nlci-nbghostcells :nlci-1,jj) 815 END DO 816 ENDIF 817 IF((nbondj == -1).OR.(nbondj == 2)) THEN 818 DO ji=1,jpi 819 zwy(ji,2:nbghostcells+1) = vbdy_s(ji,1:nbghostcells) * e1v(ji,2:nbghostcells+1) 820 zwx(ji,2:nbghostcells+1) = ubdy_s(ji,1:nbghostcells) * e2u(ji,2:nbghostcells+1) 821 END DO 822 ENDIF 823 IF((nbondj == 1).OR.(nbondj == 2)) THEN 824 DO ji=1,jpi 825 zwy(ji,nlcj-nbghostcells-1:nlcj-2) = vbdy_n(ji,1:nbghostcells) * e1v(ji,nlcj-nbghostcells-1:nlcj-2) 826 zwx(ji,nlcj-nbghostcells :nlcj-1) = ubdy_n(ji,1:nbghostcells) * e2u(ji,nlcj-nbghostcells :nlcj-1) 827 END DO 828 ENDIF 829 ENDIF 502 IF( .NOT.Agrif_Root() .AND. ln_bt_fw ) CALL agrif_dyn_ts_flux( jn, zhU, zhV ) 830 503 #endif 831 IF( ln_wd_il ) CALL wad_lmt_bt(zwx, zwy, sshn_e, zssh_frc, rdtbt) 832 833 IF ( ln_wd_dl ) THEN 834 ! 835 ! un_e and vn_e are set to zero at faces where the direction of the flow is from dry cells 836 ! 837 DO jj = 1, jpjm1 838 DO ji = 1, jpim1 839 IF ( zwx(ji,jj) > 0.0 ) THEN 840 zuwdmask(ji, jj) = ztwdmask(ji ,jj) 841 ELSE 842 zuwdmask(ji, jj) = ztwdmask(ji+1,jj) 843 END IF 844 zwx(ji, jj) = zuwdmask(ji,jj)*zwx(ji, jj) 845 un_e(ji,jj) = zuwdmask(ji,jj)*un_e(ji,jj) 846 847 IF ( zwy(ji,jj) > 0.0 ) THEN 848 zvwdmask(ji, jj) = ztwdmask(ji, jj ) 849 ELSE 850 zvwdmask(ji, jj) = ztwdmask(ji, jj+1) 851 END IF 852 zwy(ji, jj) = zvwdmask(ji,jj)*zwy(ji,jj) 853 vn_e(ji,jj) = zvwdmask(ji,jj)*vn_e(ji,jj) 854 END DO 855 END DO 504 IF( ln_wd_il ) CALL wad_lmt_bt(zhU, zhV, sshn_e, zssh_frc, rDt_e) !!gm wad_lmt_bt use of lbc_lnk on zhU, zhV 505 506 IF( ln_wd_dl ) THEN ! un_e and vn_e are set to zero at faces where 507 ! ! the direction of the flow is from dry cells 508 CALL wad_Umsk( ztwdmask, zhU, zhV, un_e, vn_e, zuwdmask, zvwdmask ) ! not jpi colomn for U, not jpj row for V 856 509 ! 857 510 ENDIF 858 859 ! Sum over sub-time-steps to compute advective velocities 860 za2 = wgtbtp2(jn) 861 un_adv(:,:) = un_adv(:,:) + za2 * zwx(:,:) * r1_e2u(:,:) 862 vn_adv(:,:) = vn_adv(:,:) + za2 * zwy(:,:) * r1_e1v(:,:) 863 864 ! sum over sub-time-steps to decide which baroclinic velocities to set to zero (zuwdav2 is only used when ln_wd_dl_bc = True) 865 IF ( ln_wd_dl_bc ) THEN 866 zuwdav2(:,:) = zuwdav2(:,:) + za2 * zuwdmask(:,:) 867 zvwdav2(:,:) = zvwdav2(:,:) + za2 * zvwdmask(:,:) 868 END IF 869 870 ! Set next sea level: 871 DO jj = 2, jpjm1 872 DO ji = fs_2, fs_jpim1 ! vector opt. 873 zhdiv(ji,jj) = ( zwx(ji,jj) - zwx(ji-1,jj) & 874 & + zwy(ji,jj) - zwy(ji,jj-1) ) * r1_e1e2t(ji,jj) 875 END DO 876 END DO 877 ssha_e(:,:) = ( sshn_e(:,:) - rdtbt * ( zssh_frc(:,:) + zhdiv(:,:) ) ) * ssmask(:,:) 878 879 CALL lbc_lnk( 'dynspg_ts', ssha_e, 'T', 1._wp ) 880 511 ! 512 ! 513 ! Compute Sea Level at step jit+1 514 !-- m+1 m m+1/2 --! 515 !-- ssh = ssh - delta_t' * [ frc + div( flux ) ] --! 516 !-------------------------------------------------------------------------! 517 DO_2D( 0, 0, 0, 0 ) 518 zhdiv = ( zhU(ji,jj) - zhU(ji-1,jj) + zhV(ji,jj) - zhV(ji,jj-1) ) * r1_e1e2t(ji,jj) 519 ssha_e(ji,jj) = ( sshn_e(ji,jj) - rDt_e * ( zssh_frc(ji,jj) + zhdiv ) ) * ssmask(ji,jj) 520 END_2D 521 ! 522 CALL lbc_lnk_multi( 'dynspg_ts', ssha_e, 'T', 1._wp, zhU, 'U', -1._wp, zhV, 'V', -1._wp ) 523 ! 881 524 ! Duplicate sea level across open boundaries (this is only cosmetic if linssh=T) 882 525 IF( ln_bdy ) CALL bdy_ssh( ssha_e ) … … 884 527 IF( .NOT.Agrif_Root() ) CALL agrif_ssh_ts( jn ) 885 528 #endif 529 ! 530 ! ! Sum over sub-time-steps to compute advective velocities 531 za2 = wgtbtp2(jn) ! zhU, zhV hold fluxes extrapolated at jn+0.5 532 un_adv(:,:) = un_adv(:,:) + za2 * zhU(:,:) * r1_e2u(:,:) 533 vn_adv(:,:) = vn_adv(:,:) + za2 * zhV(:,:) * r1_e1v(:,:) 534 ! sum over sub-time-steps to decide which baroclinic velocities to set to zero (zuwdav2 is only used when ln_wd_dl_bc=True) 535 IF ( ln_wd_dl_bc ) THEN 536 zuwdav2(1:jpim1,1:jpj ) = zuwdav2(1:jpim1,1:jpj ) + za2 * zuwdmask(1:jpim1,1:jpj ) ! not jpi-column 537 zvwdav2(1:jpi ,1:jpjm1) = zvwdav2(1:jpi ,1:jpjm1) + za2 * zvwdmask(1:jpi ,1:jpjm1) ! not jpj-row 538 END IF 539 ! 886 540 ! 887 541 ! Sea Surface Height at u-,v-points (vvl case only) 888 542 IF( .NOT.ln_linssh ) THEN 889 DO jj = 2, jpjm1 890 DO ji = 2, jpim1 ! NO Vector Opt. 891 zsshu_a(ji,jj) = r1_2 * ssumask(ji,jj) * r1_e1e2u(ji,jj) & 892 & * ( e1e2t(ji ,jj ) * ssha_e(ji ,jj ) & 893 & + e1e2t(ji+1,jj ) * ssha_e(ji+1,jj ) ) 894 zsshv_a(ji,jj) = r1_2 * ssvmask(ji,jj) * r1_e1e2v(ji,jj) & 895 & * ( e1e2t(ji ,jj ) * ssha_e(ji ,jj ) & 896 & + e1e2t(ji ,jj+1) * ssha_e(ji ,jj+1) ) 897 END DO 898 END DO 899 CALL lbc_lnk_multi( 'dynspg_ts', zsshu_a, 'U', 1._wp, zsshv_a, 'V', 1._wp ) 543 DO_2D( 0, 0, 0, 0 ) 544 zsshu_a(ji,jj) = r1_2 * ssumask(ji,jj) * r1_e1e2u(ji,jj) & 545 & * ( e1e2t(ji ,jj ) * ssha_e(ji ,jj ) & 546 & + e1e2t(ji+1,jj ) * ssha_e(ji+1,jj ) ) 547 zsshv_a(ji,jj) = r1_2 * ssvmask(ji,jj) * r1_e1e2v(ji,jj) & 548 & * ( e1e2t(ji ,jj ) * ssha_e(ji ,jj ) & 549 & + e1e2t(ji ,jj+1) * ssha_e(ji ,jj+1) ) 550 END_2D 900 551 ENDIF 901 ! 902 ! Half-step back interpolation of SSH for surface pressure computation: 903 !---------------------------------------------------------------------- 904 IF ((jn==1).AND.ll_init) THEN 905 za0=1._wp ! Forward-backward 906 za1=0._wp 907 za2=0._wp 908 za3=0._wp 909 ELSEIF ((jn==2).AND.ll_init) THEN ! AB2-AM3 Coefficients; bet=0 ; gam=-1/6 ; eps=1/12 910 za0= 1.0833333333333_wp ! za0 = 1-gam-eps 911 za1=-0.1666666666666_wp ! za1 = gam 912 za2= 0.0833333333333_wp ! za2 = eps 913 za3= 0._wp 914 ELSE ! AB3-AM4 Coefficients; bet=0.281105 ; eps=0.013 ; gam=0.0880 915 IF (rn_bt_alpha==0._wp) THEN 916 za0=0.614_wp ! za0 = 1/2 + gam + 2*eps 917 za1=0.285_wp ! za1 = 1/2 - 2*gam - 3*eps 918 za2=0.088_wp ! za2 = gam 919 za3=0.013_wp ! za3 = eps 920 ELSE 921 zepsilon = 0.00976186_wp - 0.13451357_wp * rn_bt_alpha 922 zgamma = 0.08344500_wp - 0.51358400_wp * rn_bt_alpha 923 za0 = 0.5_wp + zgamma + 2._wp * rn_bt_alpha + 2._wp * zepsilon 924 za1 = 1._wp - za0 - zgamma - zepsilon 925 za2 = zgamma 926 za3 = zepsilon 927 ENDIF 928 ENDIF 929 ! 552 ! 553 ! Half-step back interpolation of SSH for surface pressure computation at step jit+1/2 554 !-- m+1/2 m+1 m m-1 m-2 --! 555 !-- ssh' = za0 * ssh + za1 * ssh + za2 * ssh + za3 * ssh --! 556 !------------------------------------------------------------------------------------------! 557 CALL ts_bck_interp( jn, ll_init, za0, za1, za2, za3 ) ! coeficients of the interpolation 930 558 zsshp2_e(:,:) = za0 * ssha_e(:,:) + za1 * sshn_e (:,:) & 931 559 & + za2 * sshb_e(:,:) + za3 * sshbb_e(:,:) 932 933 IF( ln_wd_il ) THEN ! Calculating and applying W/D gravity filters 934 DO jj = 2, jpjm1 935 DO ji = 2, jpim1 936 ll_tmp1 = MIN( zsshp2_e(ji,jj) , zsshp2_e(ji+1,jj) ) > & 937 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) .AND. & 938 & MAX( zsshp2_e(ji,jj) + ht_0(ji,jj) , zsshp2_e(ji+1,jj) + ht_0(ji+1,jj) ) & 939 & > rn_wdmin1 + rn_wdmin2 940 ll_tmp2 = (ABS(zsshp2_e(ji,jj) - zsshp2_e(ji+1,jj)) > 1.E-12 ).AND.( & 941 & MAX( zsshp2_e(ji,jj) , zsshp2_e(ji+1,jj) ) > & 942 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 943 944 IF(ll_tmp1) THEN 945 zcpx(ji,jj) = 1.0_wp 946 ELSE IF(ll_tmp2) THEN 947 ! no worries about zsshp2_e(ji+1,jj) - zsshp2_e(ji ,jj) = 0, it won't happen ! here 948 zcpx(ji,jj) = ABS( (zsshp2_e(ji+1,jj) + ht_0(ji+1,jj) - zsshp2_e(ji,jj) - ht_0(ji,jj)) & 949 & / (zsshp2_e(ji+1,jj) - zsshp2_e(ji ,jj)) ) 950 ELSE 951 zcpx(ji,jj) = 0._wp 952 ENDIF 953 ! 954 ll_tmp1 = MIN( zsshp2_e(ji,jj) , zsshp2_e(ji,jj+1) ) > & 955 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) .AND. & 956 & MAX( zsshp2_e(ji,jj) + ht_0(ji,jj) , zsshp2_e(ji,jj+1) + ht_0(ji,jj+1) ) & 957 & > rn_wdmin1 + rn_wdmin2 958 ll_tmp2 = (ABS(zsshp2_e(ji,jj) - zsshp2_e(ji,jj+1)) > 1.E-12 ).AND.( & 959 & MAX( zsshp2_e(ji,jj) , zsshp2_e(ji,jj+1) ) > & 960 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 961 962 IF(ll_tmp1) THEN 963 zcpy(ji,jj) = 1.0_wp 964 ELSEIF(ll_tmp2) THEN 965 ! no worries about zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj ) = 0, it won't happen ! here 966 zcpy(ji,jj) = ABS( (zsshp2_e(ji,jj+1) + ht_0(ji,jj+1) - zsshp2_e(ji,jj) - ht_0(ji,jj)) & 967 & / (zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj )) ) 968 ELSE 969 zcpy(ji,jj) = 0._wp 970 ENDIF 971 END DO 972 END DO 973 ENDIF 974 ! 975 ! Compute associated depths at U and V points: 976 IF( .NOT.ln_linssh .AND. .NOT.ln_dynadv_vec ) THEN !* Vector form 977 ! 978 DO jj = 2, jpjm1 979 DO ji = 2, jpim1 980 zx1 = r1_2 * ssumask(ji ,jj) * r1_e1e2u(ji ,jj) & 981 & * ( e1e2t(ji ,jj ) * zsshp2_e(ji ,jj) & 982 & + e1e2t(ji+1,jj ) * zsshp2_e(ji+1,jj ) ) 983 zy1 = r1_2 * ssvmask(ji ,jj) * r1_e1e2v(ji ,jj ) & 984 & * ( e1e2t(ji ,jj ) * zsshp2_e(ji ,jj ) & 985 & + e1e2t(ji ,jj+1) * zsshp2_e(ji ,jj+1) ) 986 zhust_e(ji,jj) = hu_0(ji,jj) + zx1 987 zhvst_e(ji,jj) = hv_0(ji,jj) + zy1 988 END DO 989 END DO 990 ! 560 ! 561 ! ! Surface pressure gradient 562 zldg = ( 1._wp - rn_scal_load ) * grav ! local factor 563 DO_2D( 0, 0, 0, 0 ) 564 zu_spg(ji,jj) = - zldg * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) * r1_e1u(ji,jj) 565 zv_spg(ji,jj) = - zldg * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) * r1_e2v(ji,jj) 566 END_2D 567 IF( ln_wd_il ) THEN ! W/D : gravity filters applied on pressure gradient 568 CALL wad_spg( zsshp2_e, zcpx, zcpy ) ! Calculating W/D gravity filters 569 zu_spg(2:jpim1,2:jpjm1) = zu_spg(2:jpim1,2:jpjm1) * zcpx(2:jpim1,2:jpjm1) 570 zv_spg(2:jpim1,2:jpjm1) = zv_spg(2:jpim1,2:jpjm1) * zcpy(2:jpim1,2:jpjm1) 991 571 ENDIF 992 572 ! … … 994 574 ! zwz array below or triads normally depend on sea level with ln_linssh=F and should be updated 995 575 ! at each time step. We however keep them constant here for optimization. 996 ! Recall that zwx and zwy arrays hold fluxes at this stage: 997 ! zwx(:,:) = e2u(:,:) * ua_e(:,:) * zhup2_e(:,:) ! fluxes at jn+0.5 998 ! zwy(:,:) = e1v(:,:) * va_e(:,:) * zhvp2_e(:,:) 999 ! 1000 SELECT CASE( nvor_scheme ) 1001 CASE( np_ENT ) ! energy conserving scheme (t-point) 1002 DO jj = 2, jpjm1 1003 DO ji = 2, jpim1 ! vector opt. 1004 1005 z1_hu = ssumask(ji,jj) / ( zhup2_e(ji,jj) + 1._wp - ssumask(ji,jj) ) 1006 z1_hv = ssvmask(ji,jj) / ( zhvp2_e(ji,jj) + 1._wp - ssvmask(ji,jj) ) 1007 1008 zu_trd(ji,jj) = + r1_4 * r1_e1e2u(ji,jj) * z1_hu & 1009 & * ( e1e2t(ji+1,jj)*zhtp2_e(ji+1,jj)*ff_t(ji+1,jj) * ( va_e(ji+1,jj) + va_e(ji+1,jj-1) ) & 1010 & + e1e2t(ji ,jj)*zhtp2_e(ji ,jj)*ff_t(ji ,jj) * ( va_e(ji ,jj) + va_e(ji ,jj-1) ) ) 1011 ! 1012 zv_trd(ji,jj) = - r1_4 * r1_e1e2v(ji,jj) * z1_hv & 1013 & * ( e1e2t(ji,jj+1)*zhtp2_e(ji,jj+1)*ff_t(ji,jj+1) * ( ua_e(ji,jj+1) + ua_e(ji-1,jj+1) ) & 1014 & + e1e2t(ji,jj )*zhtp2_e(ji,jj )*ff_t(ji,jj ) * ( ua_e(ji,jj ) + ua_e(ji-1,jj ) ) ) 1015 END DO 1016 END DO 1017 ! 1018 CASE( np_ENE, np_MIX ) ! energy conserving scheme (f-point) 1019 DO jj = 2, jpjm1 1020 DO ji = fs_2, fs_jpim1 ! vector opt. 1021 zy1 = ( zwy(ji ,jj-1) + zwy(ji+1,jj-1) ) * r1_e1u(ji,jj) 1022 zy2 = ( zwy(ji ,jj ) + zwy(ji+1,jj ) ) * r1_e1u(ji,jj) 1023 zx1 = ( zwx(ji-1,jj ) + zwx(ji-1,jj+1) ) * r1_e2v(ji,jj) 1024 zx2 = ( zwx(ji ,jj ) + zwx(ji ,jj+1) ) * r1_e2v(ji,jj) 1025 zu_trd(ji,jj) = r1_4 * ( zwz(ji ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 1026 zv_trd(ji,jj) =-r1_4 * ( zwz(ji-1,jj ) * zx1 + zwz(ji,jj) * zx2 ) 1027 END DO 1028 END DO 1029 ! 1030 CASE( np_ENS ) ! enstrophy conserving scheme (f-point) 1031 DO jj = 2, jpjm1 1032 DO ji = fs_2, fs_jpim1 ! vector opt. 1033 zy1 = r1_8 * ( zwy(ji ,jj-1) + zwy(ji+1,jj-1) & 1034 & + zwy(ji ,jj ) + zwy(ji+1,jj ) ) * r1_e1u(ji,jj) 1035 zx1 = - r1_8 * ( zwx(ji-1,jj ) + zwx(ji-1,jj+1) & 1036 & + zwx(ji ,jj ) + zwx(ji ,jj+1) ) * r1_e2v(ji,jj) 1037 zu_trd(ji,jj) = zy1 * ( zwz(ji ,jj-1) + zwz(ji,jj) ) 1038 zv_trd(ji,jj) = zx1 * ( zwz(ji-1,jj ) + zwz(ji,jj) ) 1039 END DO 1040 END DO 1041 ! 1042 CASE( np_EET , np_EEN ) ! energy & enstrophy scheme (using e3t or e3f) 1043 DO jj = 2, jpjm1 1044 DO ji = fs_2, fs_jpim1 ! vector opt. 1045 zu_trd(ji,jj) = + r1_12 * r1_e1u(ji,jj) * ( ftne(ji,jj ) * zwy(ji ,jj ) & 1046 & + ftnw(ji+1,jj) * zwy(ji+1,jj ) & 1047 & + ftse(ji,jj ) * zwy(ji ,jj-1) & 1048 & + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) 1049 zv_trd(ji,jj) = - r1_12 * r1_e2v(ji,jj) * ( ftsw(ji,jj+1) * zwx(ji-1,jj+1) & 1050 & + ftse(ji,jj+1) * zwx(ji ,jj+1) & 1051 & + ftnw(ji,jj ) * zwx(ji-1,jj ) & 1052 & + ftne(ji,jj ) * zwx(ji ,jj ) ) 1053 END DO 1054 END DO 1055 ! 1056 END SELECT 576 ! Recall that zhU and zhV hold fluxes at jn+0.5 (extrapolated not backward interpolated) 577 CALL dyn_cor_2d( zhtp2_e, zhup2_e, zhvp2_e, ua_e, va_e, zhU, zhV, zu_trd, zv_trd ) 1057 578 ! 1058 579 ! Add tidal astronomical forcing if defined 1059 580 IF ( ln_tide .AND. ln_tide_pot ) THEN 1060 DO jj = 2, jpjm1 1061 DO ji = fs_2, fs_jpim1 ! vector opt. 1062 zu_spg = grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) * r1_e1u(ji,jj) 1063 zv_spg = grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) * r1_e2v(ji,jj) 1064 zu_trd(ji,jj) = zu_trd(ji,jj) + zu_spg 1065 zv_trd(ji,jj) = zv_trd(ji,jj) + zv_spg 1066 END DO 1067 END DO 581 DO_2D( 0, 0, 0, 0 ) 582 zu_trd(ji,jj) = zu_trd(ji,jj) + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) * r1_e1u(ji,jj) 583 zv_trd(ji,jj) = zv_trd(ji,jj) + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) * r1_e2v(ji,jj) 584 END_2D 1068 585 ENDIF 1069 586 ! … … 1071 588 !jth do implicitly instead 1072 589 IF ( .NOT. ll_wd ) THEN ! Revert to explicit for bit comparison tests in non wad runs 1073 DO jj = 2, jpjm1 1074 DO ji = fs_2, fs_jpim1 ! vector opt. 1075 zu_trd(ji,jj) = zu_trd(ji,jj) + zCdU_u(ji,jj) * un_e(ji,jj) * hur_e(ji,jj) 1076 zv_trd(ji,jj) = zv_trd(ji,jj) + zCdU_v(ji,jj) * vn_e(ji,jj) * hvr_e(ji,jj) 1077 END DO 1078 END DO 1079 ENDIF 1080 ! 1081 ! Surface pressure trend: 1082 IF( ln_wd_il ) THEN 1083 DO jj = 2, jpjm1 1084 DO ji = 2, jpim1 1085 ! Add surface pressure gradient 1086 zu_spg = - grav * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) * r1_e1u(ji,jj) 1087 zv_spg = - grav * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) * r1_e2v(ji,jj) 1088 zwx(ji,jj) = (1._wp - rn_scal_load) * zu_spg * zcpx(ji,jj) 1089 zwy(ji,jj) = (1._wp - rn_scal_load) * zv_spg * zcpy(ji,jj) 1090 END DO 1091 END DO 1092 ELSE 1093 DO jj = 2, jpjm1 1094 DO ji = fs_2, fs_jpim1 ! vector opt. 1095 ! Add surface pressure gradient 1096 zu_spg = - grav * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) * r1_e1u(ji,jj) 1097 zv_spg = - grav * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) * r1_e2v(ji,jj) 1098 zwx(ji,jj) = (1._wp - rn_scal_load) * zu_spg 1099 zwy(ji,jj) = (1._wp - rn_scal_load) * zv_spg 1100 END DO 1101 END DO 1102 END IF 1103 590 DO_2D( 0, 0, 0, 0 ) 591 zu_trd(ji,jj) = zu_trd(ji,jj) + zCdU_u(ji,jj) * un_e(ji,jj) * hur_e(ji,jj) 592 zv_trd(ji,jj) = zv_trd(ji,jj) + zCdU_v(ji,jj) * vn_e(ji,jj) * hvr_e(ji,jj) 593 END_2D 594 ENDIF 1104 595 ! 1105 596 ! Set next velocities: 597 ! Compute barotropic speeds at step jit+1 (h : total height of the water colomn) 598 !-- VECTOR FORM 599 !-- m+1 m / m+1/2 \ --! 600 !-- u = u + delta_t' * \ (1-r)*g * grad_x( ssh') - f * k vect u + frc / --! 601 !-- --! 602 !-- FLUX FORM --! 603 !-- m+1 __1__ / m m / m+1/2 m+1/2 m+1/2 n \ \ --! 604 !-- u = m+1 | h * u + delta_t' * \ h * (1-r)*g * grad_x( ssh') - h * f * k vect u + h * frc / | --! 605 !-- h \ / --! 606 !------------------------------------------------------------------------------------------------------------------------! 1106 607 IF( ln_dynadv_vec .OR. ln_linssh ) THEN !* Vector form 1107 DO jj = 2, jpjm1 1108 DO ji = fs_2, fs_jpim1 ! vector opt. 1109 ua_e(ji,jj) = ( un_e(ji,jj) & 1110 & + rdtbt * ( zwx(ji,jj) & 1111 & + zu_trd(ji,jj) & 1112 & + zu_frc(ji,jj) ) & 1113 & ) * ssumask(ji,jj) 1114 1115 va_e(ji,jj) = ( vn_e(ji,jj) & 1116 & + rdtbt * ( zwy(ji,jj) & 1117 & + zv_trd(ji,jj) & 1118 & + zv_frc(ji,jj) ) & 1119 & ) * ssvmask(ji,jj) 1120 1121 END DO 1122 END DO 608 DO_2D( 0, 0, 0, 0 ) 609 ua_e(ji,jj) = ( un_e(ji,jj) & 610 & + rDt_e * ( zu_spg(ji,jj) & 611 & + zu_trd(ji,jj) & 612 & + zu_frc(ji,jj) ) & 613 & ) * ssumask(ji,jj) 614 615 va_e(ji,jj) = ( vn_e(ji,jj) & 616 & + rDt_e * ( zv_spg(ji,jj) & 617 & + zv_trd(ji,jj) & 618 & + zv_frc(ji,jj) ) & 619 & ) * ssvmask(ji,jj) 620 END_2D 1123 621 ! 1124 622 ELSE !* Flux form 1125 DO jj = 2, jpjm1 1126 DO ji = fs_2, fs_jpim1 ! vector opt. 1127 1128 zhura = hu_0(ji,jj) + zsshu_a(ji,jj) 1129 zhvra = hv_0(ji,jj) + zsshv_a(ji,jj) 1130 1131 zhura = ssumask(ji,jj)/(zhura + 1._wp - ssumask(ji,jj)) 1132 zhvra = ssvmask(ji,jj)/(zhvra + 1._wp - ssvmask(ji,jj)) 1133 1134 ua_e(ji,jj) = ( hu_e(ji,jj) * un_e(ji,jj) & 1135 & + rdtbt * ( zhust_e(ji,jj) * zwx(ji,jj) & 1136 & + zhup2_e(ji,jj) * zu_trd(ji,jj) & 1137 & + hu_n(ji,jj) * zu_frc(ji,jj) ) & 1138 & ) * zhura 1139 1140 va_e(ji,jj) = ( hv_e(ji,jj) * vn_e(ji,jj) & 1141 & + rdtbt * ( zhvst_e(ji,jj) * zwy(ji,jj) & 1142 & + zhvp2_e(ji,jj) * zv_trd(ji,jj) & 1143 & + hv_n(ji,jj) * zv_frc(ji,jj) ) & 1144 & ) * zhvra 1145 END DO 1146 END DO 623 DO_2D( 0, 0, 0, 0 ) 624 ! ! hu_e, hv_e hold depth at jn, zhup2_e, zhvp2_e hold extrapolated depth at jn+1/2 625 ! ! backward interpolated depth used in spg terms at jn+1/2 626 zhu_bck = hu_0(ji,jj) + r1_2*r1_e1e2u(ji,jj) * ( e1e2t(ji ,jj) * zsshp2_e(ji ,jj) & 627 & + e1e2t(ji+1,jj) * zsshp2_e(ji+1,jj) ) * ssumask(ji,jj) 628 zhv_bck = hv_0(ji,jj) + r1_2*r1_e1e2v(ji,jj) * ( e1e2t(ji,jj ) * zsshp2_e(ji,jj ) & 629 & + e1e2t(ji,jj+1) * zsshp2_e(ji,jj+1) ) * ssvmask(ji,jj) 630 ! ! inverse depth at jn+1 631 z1_hu = ssumask(ji,jj) / ( hu_0(ji,jj) + zsshu_a(ji,jj) + 1._wp - ssumask(ji,jj) ) 632 z1_hv = ssvmask(ji,jj) / ( hv_0(ji,jj) + zsshv_a(ji,jj) + 1._wp - ssvmask(ji,jj) ) 633 ! 634 ua_e(ji,jj) = ( hu_e (ji,jj) * un_e (ji,jj) & 635 & + rDt_e * ( zhu_bck * zu_spg (ji,jj) & ! 636 & + zhup2_e(ji,jj) * zu_trd (ji,jj) & ! 637 & + hu(ji,jj,Kmm) * zu_frc (ji,jj) ) ) * z1_hu 638 ! 639 va_e(ji,jj) = ( hv_e (ji,jj) * vn_e (ji,jj) & 640 & + rDt_e * ( zhv_bck * zv_spg (ji,jj) & ! 641 & + zhvp2_e(ji,jj) * zv_trd (ji,jj) & ! 642 & + hv(ji,jj,Kmm) * zv_frc (ji,jj) ) ) * z1_hv 643 END_2D 1147 644 ENDIF 1148 645 !jth implicit bottom friction: 1149 646 IF ( ll_wd ) THEN ! revert to explicit for bit comparison tests in non wad runs 1150 DO jj = 2, jpjm1 1151 DO ji = fs_2, fs_jpim1 ! vector opt. 1152 ua_e(ji,jj) = ua_e(ji,jj) /(1.0 - rdtbt * zCdU_u(ji,jj) * hur_e(ji,jj)) 1153 va_e(ji,jj) = va_e(ji,jj) /(1.0 - rdtbt * zCdU_v(ji,jj) * hvr_e(ji,jj)) 1154 END DO 1155 END DO 1156 ENDIF 1157 1158 1159 IF( .NOT.ln_linssh ) THEN !* Update ocean depth (variable volume case only) 1160 hu_e (:,:) = hu_0(:,:) + zsshu_a(:,:) 1161 hv_e (:,:) = hv_0(:,:) + zsshv_a(:,:) 1162 hur_e(:,:) = ssumask(:,:) / ( hu_e(:,:) + 1._wp - ssumask(:,:) ) 1163 hvr_e(:,:) = ssvmask(:,:) / ( hv_e(:,:) + 1._wp - ssvmask(:,:) ) 1164 ! 1165 ENDIF 1166 ! !* domain lateral boundary 1167 CALL lbc_lnk_multi( 'dynspg_ts', ua_e, 'U', -1._wp, va_e , 'V', -1._wp ) 1168 ! 647 DO_2D( 0, 0, 0, 0 ) 648 ua_e(ji,jj) = ua_e(ji,jj) /(1.0 - rDt_e * zCdU_u(ji,jj) * hur_e(ji,jj)) 649 va_e(ji,jj) = va_e(ji,jj) /(1.0 - rDt_e * zCdU_v(ji,jj) * hvr_e(ji,jj)) 650 END_2D 651 ENDIF 652 653 IF( .NOT.ln_linssh ) THEN !* Update ocean depth (variable volume case only) 654 hu_e (2:jpim1,2:jpjm1) = hu_0(2:jpim1,2:jpjm1) + zsshu_a(2:jpim1,2:jpjm1) 655 hur_e(2:jpim1,2:jpjm1) = ssumask(2:jpim1,2:jpjm1) / ( hu_e(2:jpim1,2:jpjm1) + 1._wp - ssumask(2:jpim1,2:jpjm1) ) 656 hv_e (2:jpim1,2:jpjm1) = hv_0(2:jpim1,2:jpjm1) + zsshv_a(2:jpim1,2:jpjm1) 657 hvr_e(2:jpim1,2:jpjm1) = ssvmask(2:jpim1,2:jpjm1) / ( hv_e(2:jpim1,2:jpjm1) + 1._wp - ssvmask(2:jpim1,2:jpjm1) ) 658 ENDIF 659 ! 660 IF( .NOT.ln_linssh ) THEN !* Update ocean depth (variable volume case only) 661 CALL lbc_lnk_multi( 'dynspg_ts', ua_e , 'U', -1._wp, va_e , 'V', -1._wp & 662 & , hu_e , 'U', 1._wp, hv_e , 'V', 1._wp & 663 & , hur_e, 'U', 1._wp, hvr_e, 'V', 1._wp ) 664 ELSE 665 CALL lbc_lnk_multi( 'dynspg_ts', ua_e , 'U', -1._wp, va_e , 'V', -1._wp ) 666 ENDIF 1169 667 ! ! open boundaries 1170 668 IF( ln_bdy ) CALL bdy_dyn2d( jn, ua_e, va_e, un_e, vn_e, hur_e, hvr_e, ssha_e ) … … 1190 688 za1 = wgtbtp1(jn) 1191 689 IF( ln_dynadv_vec .OR. ln_linssh ) THEN ! Sum velocities 1192 ua_b (:,:) = ua_b (:,:) + za1 * ua_e (:,:)1193 va_b (:,:) = va_b (:,:) + za1 * va_e (:,:)690 puu_b (:,:,Kaa) = puu_b (:,:,Kaa) + za1 * ua_e (:,:) 691 pvv_b (:,:,Kaa) = pvv_b (:,:,Kaa) + za1 * va_e (:,:) 1194 692 ELSE ! Sum transports 1195 693 IF ( .NOT.ln_wd_dl ) THEN 1196 ua_b (:,:) = ua_b (:,:) + za1 * ua_e (:,:) * hu_e (:,:)1197 va_b (:,:) = va_b (:,:) + za1 * va_e (:,:) * hv_e (:,:)694 puu_b (:,:,Kaa) = puu_b (:,:,Kaa) + za1 * ua_e (:,:) * hu_e (:,:) 695 pvv_b (:,:,Kaa) = pvv_b (:,:,Kaa) + za1 * va_e (:,:) * hv_e (:,:) 1198 696 ELSE 1199 ua_b (:,:) = ua_b (:,:) + za1 * ua_e (:,:) * hu_e (:,:) * zuwdmask(:,:)1200 va_b (:,:) = va_b (:,:) + za1 * va_e (:,:) * hv_e (:,:) * zvwdmask(:,:)697 puu_b (:,:,Kaa) = puu_b (:,:,Kaa) + za1 * ua_e (:,:) * hu_e (:,:) * zuwdmask(:,:) 698 pvv_b (:,:,Kaa) = pvv_b (:,:,Kaa) + za1 * va_e (:,:) * hv_e (:,:) * zvwdmask(:,:) 1201 699 END IF 1202 700 ENDIF 1203 701 ! ! Sum sea level 1204 ssha(:,:) = ssha(:,:) + za1 * ssha_e(:,:)702 pssh(:,:,Kaa) = pssh(:,:,Kaa) + za1 * ssha_e(:,:) 1205 703 1206 704 ! ! ==================== ! … … 1213 711 ! Set advection velocity correction: 1214 712 IF (ln_bt_fw) THEN 1215 zwx(:,:) = un_adv(:,:) 1216 zwy(:,:) = vn_adv(:,:) 1217 IF( .NOT.( kt == nit000 .AND. neuler==0 ) ) THEN 1218 un_adv(:,:) = r1_2 * ( ub2_b(:,:) + zwx(:,:) - atfp * un_bf(:,:) ) 1219 vn_adv(:,:) = r1_2 * ( vb2_b(:,:) + zwy(:,:) - atfp * vn_bf(:,:) ) 1220 ! 1221 ! Update corrective fluxes for next time step: 1222 un_bf(:,:) = atfp * un_bf(:,:) + (zwx(:,:) - ub2_b(:,:)) 1223 vn_bf(:,:) = atfp * vn_bf(:,:) + (zwy(:,:) - vb2_b(:,:)) 713 IF( .NOT.( kt == nit000 .AND. l_1st_euler ) ) THEN 714 DO_2D( 1, 1, 1, 1 ) 715 zun_save = un_adv(ji,jj) 716 zvn_save = vn_adv(ji,jj) 717 ! ! apply the previously computed correction 718 un_adv(ji,jj) = r1_2 * ( ub2_b(ji,jj) + zun_save - rn_atfp * un_bf(ji,jj) ) 719 vn_adv(ji,jj) = r1_2 * ( vb2_b(ji,jj) + zvn_save - rn_atfp * vn_bf(ji,jj) ) 720 ! ! Update corrective fluxes for next time step 721 un_bf(ji,jj) = rn_atfp * un_bf(ji,jj) + ( zun_save - ub2_b(ji,jj) ) 722 vn_bf(ji,jj) = rn_atfp * vn_bf(ji,jj) + ( zvn_save - vb2_b(ji,jj) ) 723 ! ! Save integrated transport for next computation 724 ub2_b(ji,jj) = zun_save 725 vb2_b(ji,jj) = zvn_save 726 END_2D 1224 727 ELSE 1225 un_bf(:,:) = 0._wp 1226 vn_bf(:,:) = 0._wp 1227 END IF 1228 ! Save integrated transport for next computation 1229 ub2_b(:,:) = zwx(:,:) 1230 vb2_b(:,:) = zwy(:,:) 728 un_bf(:,:) = 0._wp ! corrective fluxes for next time step set to zero 729 vn_bf(:,:) = 0._wp 730 ub2_b(:,:) = un_adv(:,:) ! Save integrated transport for next computation 731 vb2_b(:,:) = vn_adv(:,:) 732 END IF 1231 733 ENDIF 1232 734 … … 1236 738 IF( ln_dynadv_vec .OR. ln_linssh ) THEN 1237 739 DO jk=1,jpkm1 1238 ua(:,:,jk) = ua(:,:,jk) + ( ua_b(:,:) - ub_b(:,:) ) * r1_2dt_b1239 va(:,:,jk) = va(:,:,jk) + ( va_b(:,:) - vb_b(:,:) ) * r1_2dt_b740 puu(:,:,jk,Krhs) = puu(:,:,jk,Krhs) + ( puu_b(:,:,Kaa) - puu_b(:,:,Kbb) ) * r1_Dt_b 741 pvv(:,:,jk,Krhs) = pvv(:,:,jk,Krhs) + ( pvv_b(:,:,Kaa) - pvv_b(:,:,Kbb) ) * r1_Dt_b 1240 742 END DO 1241 743 ELSE 1242 ! At this stage, ssha has been corrected: compute new depths at velocity points 1243 DO jj = 1, jpjm1 1244 DO ji = 1, jpim1 ! NO Vector Opt. 1245 zsshu_a(ji,jj) = r1_2 * ssumask(ji,jj) * r1_e1e2u(ji,jj) & 1246 & * ( e1e2t(ji ,jj) * ssha(ji ,jj) & 1247 & + e1e2t(ji+1,jj) * ssha(ji+1,jj) ) 1248 zsshv_a(ji,jj) = r1_2 * ssvmask(ji,jj) * r1_e1e2v(ji,jj) & 1249 & * ( e1e2t(ji,jj ) * ssha(ji,jj ) & 1250 & + e1e2t(ji,jj+1) * ssha(ji,jj+1) ) 1251 END DO 1252 END DO 744 ! At this stage, pssh(:,:,:,Krhs) has been corrected: compute new depths at velocity points 745 DO_2D( 1, 0, 1, 0 ) 746 zsshu_a(ji,jj) = r1_2 * ssumask(ji,jj) * r1_e1e2u(ji,jj) & 747 & * ( e1e2t(ji ,jj) * pssh(ji ,jj,Kaa) & 748 & + e1e2t(ji+1,jj) * pssh(ji+1,jj,Kaa) ) 749 zsshv_a(ji,jj) = r1_2 * ssvmask(ji,jj) * r1_e1e2v(ji,jj) & 750 & * ( e1e2t(ji,jj ) * pssh(ji,jj ,Kaa) & 751 & + e1e2t(ji,jj+1) * pssh(ji,jj+1,Kaa) ) 752 END_2D 1253 753 CALL lbc_lnk_multi( 'dynspg_ts', zsshu_a, 'U', 1._wp, zsshv_a, 'V', 1._wp ) ! Boundary conditions 1254 754 ! 1255 755 DO jk=1,jpkm1 1256 ua(:,:,jk) = ua(:,:,jk) + r1_hu_n(:,:) * ( ua_b(:,:) - ub_b(:,:) * hu_b(:,:) ) * r1_2dt_b1257 va(:,:,jk) = va(:,:,jk) + r1_hv_n(:,:) * ( va_b(:,:) - vb_b(:,:) * hv_b(:,:) ) * r1_2dt_b756 puu(:,:,jk,Krhs) = puu(:,:,jk,Krhs) + r1_hu(:,:,Kmm) * ( puu_b(:,:,Kaa) - puu_b(:,:,Kbb) * hu(:,:,Kbb) ) * r1_Dt_b 757 pvv(:,:,jk,Krhs) = pvv(:,:,jk,Krhs) + r1_hv(:,:,Kmm) * ( pvv_b(:,:,Kaa) - pvv_b(:,:,Kbb) * hv(:,:,Kbb) ) * r1_Dt_b 1258 758 END DO 1259 759 ! Save barotropic velocities not transport: 1260 ua_b(:,:) = ua_b(:,:) / ( hu_0(:,:) + zsshu_a(:,:) + 1._wp - ssumask(:,:) )1261 va_b(:,:) = va_b(:,:) / ( hv_0(:,:) + zsshv_a(:,:) + 1._wp - ssvmask(:,:) )760 puu_b(:,:,Kaa) = puu_b(:,:,Kaa) / ( hu_0(:,:) + zsshu_a(:,:) + 1._wp - ssumask(:,:) ) 761 pvv_b(:,:,Kaa) = pvv_b(:,:,Kaa) / ( hv_0(:,:) + zsshv_a(:,:) + 1._wp - ssvmask(:,:) ) 1262 762 ENDIF 1263 763 … … 1265 765 ! Correct velocities so that the barotropic velocity equals (un_adv, vn_adv) (in all cases) 1266 766 DO jk = 1, jpkm1 1267 un(:,:,jk) = ( un(:,:,jk) + un_adv(:,:)*r1_hu_n(:,:) - un_b(:,:) ) * umask(:,:,jk)1268 vn(:,:,jk) = ( vn(:,:,jk) + vn_adv(:,:)*r1_hv_n(:,:) - vn_b(:,:) ) * vmask(:,:,jk)767 puu(:,:,jk,Kmm) = ( puu(:,:,jk,Kmm) + un_adv(:,:)*r1_hu(:,:,Kmm) - puu_b(:,:,Kmm) ) * umask(:,:,jk) 768 pvv(:,:,jk,Kmm) = ( pvv(:,:,jk,Kmm) + vn_adv(:,:)*r1_hv(:,:,Kmm) - pvv_b(:,:,Kmm) ) * vmask(:,:,jk) 1269 769 END DO 1270 770 1271 771 IF ( ln_wd_dl .and. ln_wd_dl_bc) THEN 1272 772 DO jk = 1, jpkm1 1273 un(:,:,jk) = ( un_adv(:,:)*r1_hu_n(:,:) &1274 & + zuwdav2(:,:)*( un(:,:,jk) - un_adv(:,:)*r1_hu_n(:,:)) ) * umask(:,:,jk)1275 vn(:,:,jk) = ( vn_adv(:,:)*r1_hv_n(:,:) &1276 & + zvwdav2(:,:)*( vn(:,:,jk) - vn_adv(:,:)*r1_hv_n(:,:)) ) * vmask(:,:,jk)773 puu(:,:,jk,Kmm) = ( un_adv(:,:)*r1_hu(:,:,Kmm) & 774 & + zuwdav2(:,:)*(puu(:,:,jk,Kmm) - un_adv(:,:)*r1_hu(:,:,Kmm)) ) * umask(:,:,jk) 775 pvv(:,:,jk,Kmm) = ( vn_adv(:,:)*r1_hv(:,:,Kmm) & 776 & + zvwdav2(:,:)*(pvv(:,:,jk,Kmm) - vn_adv(:,:)*r1_hv(:,:,Kmm)) ) * vmask(:,:,jk) 1277 777 END DO 1278 778 END IF 1279 779 1280 780 1281 CALL iom_put( "ubar", un_adv(:,:)*r1_hu _n(:,:) ) ! barotropic i-current1282 CALL iom_put( "vbar", vn_adv(:,:)*r1_hv _n(:,:) ) ! barotropic i-current781 CALL iom_put( "ubar", un_adv(:,:)*r1_hu(:,:,Kmm) ) ! barotropic i-current 782 CALL iom_put( "vbar", vn_adv(:,:)*r1_hv(:,:,Kmm) ) ! barotropic i-current 1283 783 ! 1284 784 #if defined key_agrif … … 1303 803 IF( ln_wd_dl ) DEALLOCATE( ztwdmask, zuwdmask, zvwdmask, zuwdav2, zvwdav2 ) 1304 804 ! 1305 IF( ln_diatmb ) THEN 1306 CALL iom_put( "baro_u" , un_b*ssumask(:,:)+zmdi*(1.-ssumask(:,:) ) ) ! Barotropic U Velocity 1307 CALL iom_put( "baro_v" , vn_b*ssvmask(:,:)+zmdi*(1.-ssvmask(:,:) ) ) ! Barotropic V Velocity 1308 ENDIF 805 CALL iom_put( "baro_u" , puu_b(:,:,Kmm) ) ! Barotropic U Velocity 806 CALL iom_put( "baro_v" , pvv_b(:,:,Kmm) ) ! Barotropic V Velocity 1309 807 ! 1310 808 END SUBROUTINE dyn_spg_ts … … 1320 818 LOGICAL, INTENT(in) :: ll_fw ! forward time splitting =.true. 1321 819 INTEGER, INTENT(inout) :: jpit ! cycle length 1322 REAL(wp), DIMENSION(3*nn_ baro), INTENT(inout) :: zwgt1, & ! Primary weights820 REAL(wp), DIMENSION(3*nn_e), INTENT(inout) :: zwgt1, & ! Primary weights 1323 821 zwgt2 ! Secondary weights 1324 822 … … 1332 830 ! Set time index when averaged value is requested 1333 831 IF (ll_fw) THEN 1334 jic = nn_ baro832 jic = nn_e 1335 833 ELSE 1336 jic = 2 * nn_ baro834 jic = 2 * nn_e 1337 835 ENDIF 1338 836 … … 1340 838 IF (ll_av) THEN 1341 839 ! Define simple boxcar window for primary weights 1342 ! (width = nn_ baro, centered around jic)840 ! (width = nn_e, centered around jic) 1343 841 SELECT CASE ( nn_bt_flt ) 1344 842 CASE( 0 ) ! No averaging … … 1346 844 jpit = jic 1347 845 1348 CASE( 1 ) ! Boxcar, width = nn_ baro1349 DO jn = 1, 3*nn_ baro1350 za1 = ABS(float(jn-jic))/float(nn_ baro)846 CASE( 1 ) ! Boxcar, width = nn_e 847 DO jn = 1, 3*nn_e 848 za1 = ABS(float(jn-jic))/float(nn_e) 1351 849 IF (za1 < 0.5_wp) THEN 1352 850 zwgt1(jn) = 1._wp … … 1355 853 ENDDO 1356 854 1357 CASE( 2 ) ! Boxcar, width = 2 * nn_ baro1358 DO jn = 1, 3*nn_ baro1359 za1 = ABS(float(jn-jic))/float(nn_ baro)855 CASE( 2 ) ! Boxcar, width = 2 * nn_e 856 DO jn = 1, 3*nn_e 857 za1 = ABS(float(jn-jic))/float(nn_e) 1360 858 IF (za1 < 1._wp) THEN 1361 859 zwgt1(jn) = 1._wp … … 1401 899 IF( TRIM(cdrw) == 'READ' ) THEN ! Read/initialise 1402 900 ! ! --------------- 1403 IF( ln_rstart .AND. ln_bt_fw .AND. ( neuler/=0) ) THEN !* Read the restart file1404 IF(lrxios) CALL iom_swap( TRIM(crxios_context) )1405 CALL iom_get( numror, jpdom_auto glo, 'ub2_b' , ub2_b (:,:), ldxios = lrxios )1406 CALL iom_get( numror, jpdom_auto glo, 'vb2_b' , vb2_b (:,:), ldxios = lrxios )1407 CALL iom_get( numror, jpdom_auto glo, 'un_bf' , un_bf (:,:), ldxios = lrxios )1408 CALL iom_get( numror, jpdom_auto glo, 'vn_bf' , vn_bf (:,:), ldxios = lrxios )901 IF( ln_rstart .AND. ln_bt_fw .AND. (.NOT.l_1st_euler) ) THEN !* Read the restart file 902 IF(lrxios) CALL iom_swap( TRIM(crxios_context) 903 CALL iom_get( numror, jpdom_auto, 'ub2_b' , ub2_b (:,:), cd_type = 'U', psgn = -1._wp, ldxios = lrxios ) 904 CALL iom_get( numror, jpdom_auto, 'vb2_b' , vb2_b (:,:), cd_type = 'V', psgn = -1._wp, ldxios = lrxios ) 905 CALL iom_get( numror, jpdom_auto, 'un_bf' , un_bf (:,:), cd_type = 'U', psgn = -1._wp, ldxios = lrxios ) 906 CALL iom_get( numror, jpdom_auto, 'vn_bf' , vn_bf (:,:), cd_type = 'V', psgn = -1._wp, ldxios = lrxios ) 1409 907 IF( .NOT.ln_bt_av ) THEN 1410 CALL iom_get( numror, jpdom_auto glo, 'sshbb_e' , sshbb_e(:,:), ldxios = lrxios )1411 CALL iom_get( numror, jpdom_auto glo, 'ubb_e' , ubb_e(:,:), ldxios = lrxios )1412 CALL iom_get( numror, jpdom_auto glo, 'vbb_e' , vbb_e(:,:), ldxios = lrxios )1413 CALL iom_get( numror, jpdom_auto glo, 'sshb_e' , sshb_e(:,:), ldxios = lrxios )1414 CALL iom_get( numror, jpdom_auto glo, 'ub_e' , ub_e(:,:), ldxios = lrxios )1415 CALL iom_get( numror, jpdom_auto glo, 'vb_e' , vb_e(:,:), ldxios = lrxios )908 CALL iom_get( numror, jpdom_auto, 'sshbb_e' , sshbb_e(:,:), cd_type = 'T', psgn = 1._wp, ldxios = lrxios ) 909 CALL iom_get( numror, jpdom_auto, 'ubb_e' , ubb_e(:,:), cd_type = 'U', psgn = -1._wp, ldxios = lrxios ) 910 CALL iom_get( numror, jpdom_auto, 'vbb_e' , vbb_e(:,:), cd_type = 'V', psgn = -1._wp, ldxios = lrxios ) 911 CALL iom_get( numror, jpdom_auto, 'sshb_e' , sshb_e(:,:), cd_type = 'T', psgn = 1._wp, ldxios = lrxios ) 912 CALL iom_get( numror, jpdom_auto, 'ub_e' , ub_e(:,:), cd_type = 'U', psgn = -1._wp, ldxios = lrxios ) 913 CALL iom_get( numror, jpdom_auto, 'vb_e' , vb_e(:,:), cd_type = 'V', psgn = -1._wp, ldxios = lrxios ) 1416 914 ENDIF 1417 915 #if defined key_agrif 1418 916 ! Read time integrated fluxes 1419 917 IF ( .NOT.Agrif_Root() ) THEN 1420 CALL iom_get( numror, jpdom_auto glo, 'ub2_i_b' , ub2_i_b(:,:), ldxios = lrxios )1421 CALL iom_get( numror, jpdom_auto glo, 'vb2_i_b' , vb2_i_b(:,:), ldxios = lrxios )918 CALL iom_get( numror, jpdom_auto, 'ub2_i_b' , ub2_i_b(:,:), cd_type = 'U', psgn = -1._wp, ldxios = lrxios ) 919 CALL iom_get( numror, jpdom_auto, 'vb2_i_b' , vb2_i_b(:,:), cd_type = 'V', psgn = -1._wp, ldxios = lrxios ) 1422 920 ENDIF 1423 921 #endif … … 1479 977 ! Max courant number for ext. grav. waves 1480 978 ! 1481 DO jj = 1, jpj 1482 DO ji =1, jpi 1483 zxr2 = r1_e1t(ji,jj) * r1_e1t(ji,jj) 1484 zyr2 = r1_e2t(ji,jj) * r1_e2t(ji,jj) 1485 zcu(ji,jj) = SQRT( grav * MAX(ht_0(ji,jj),0._wp) * (zxr2 + zyr2) ) 1486 END DO 1487 END DO 1488 ! 1489 zcmax = MAXVAL( zcu(:,:) ) 979 DO_2D( 0, 0, 0, 0 ) 980 zxr2 = r1_e1t(ji,jj) * r1_e1t(ji,jj) 981 zyr2 = r1_e2t(ji,jj) * r1_e2t(ji,jj) 982 zcu(ji,jj) = SQRT( grav * MAX(ht_0(ji,jj),0._wp) * (zxr2 + zyr2) ) 983 END_2D 984 ! 985 zcmax = MAXVAL( zcu(Nis0:Nie0,Njs0:Nje0) ) 1490 986 CALL mpp_max( 'dynspg_ts', zcmax ) 1491 987 1492 988 ! Estimate number of iterations to satisfy a max courant number= rn_bt_cmax 1493 IF( ln_bt_auto ) nn_ baro = CEILING( rdt / rn_bt_cmax * zcmax)989 IF( ln_bt_auto ) nn_e = CEILING( rn_Dt / rn_bt_cmax * zcmax) 1494 990 1495 r dtbt = rdt / REAL( nn_baro, wp )1496 zcmax = zcmax * r dtbt991 rDt_e = rn_Dt / REAL( nn_e , wp ) 992 zcmax = zcmax * rDt_e 1497 993 ! Print results 1498 994 IF(lwp) WRITE(numout,*) … … 1500 996 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~' 1501 997 IF( ln_bt_auto ) THEN 1502 IF(lwp) WRITE(numout,*) ' ln_ts_auto =.true. Automatically set nn_ baro'998 IF(lwp) WRITE(numout,*) ' ln_ts_auto =.true. Automatically set nn_e ' 1503 999 IF(lwp) WRITE(numout,*) ' Max. courant number allowed: ', rn_bt_cmax 1504 1000 ELSE 1505 IF(lwp) WRITE(numout,*) ' ln_ts_auto=.false.: Use nn_ baro in namelist nn_baro = ', nn_baro1001 IF(lwp) WRITE(numout,*) ' ln_ts_auto=.false.: Use nn_e in namelist nn_e = ', nn_e 1506 1002 ENDIF 1507 1003 1508 1004 IF(ln_bt_av) THEN 1509 IF(lwp) WRITE(numout,*) ' ln_bt_av =.true. ==> Time averaging over nn_ barotime steps is on '1005 IF(lwp) WRITE(numout,*) ' ln_bt_av =.true. ==> Time averaging over nn_e time steps is on ' 1510 1006 ELSE 1511 1007 IF(lwp) WRITE(numout,*) ' ln_bt_av =.false. => No time averaging of barotropic variables ' … … 1527 1023 SELECT CASE ( nn_bt_flt ) 1528 1024 CASE( 0 ) ; IF(lwp) WRITE(numout,*) ' Dirac' 1529 CASE( 1 ) ; IF(lwp) WRITE(numout,*) ' Boxcar: width = nn_ baro'1530 CASE( 2 ) ; IF(lwp) WRITE(numout,*) ' Boxcar: width = 2*nn_ baro'1025 CASE( 1 ) ; IF(lwp) WRITE(numout,*) ' Boxcar: width = nn_e' 1026 CASE( 2 ) ; IF(lwp) WRITE(numout,*) ' Boxcar: width = 2*nn_e' 1531 1027 CASE DEFAULT ; CALL ctl_stop( 'unrecognised value for nn_bt_flt: should 0,1, or 2' ) 1532 1028 END SELECT 1533 1029 ! 1534 1030 IF(lwp) WRITE(numout,*) ' ' 1535 IF(lwp) WRITE(numout,*) ' nn_ baro = ', nn_baro1536 IF(lwp) WRITE(numout,*) ' Barotropic time step [s] is :', r dtbt1031 IF(lwp) WRITE(numout,*) ' nn_e = ', nn_e 1032 IF(lwp) WRITE(numout,*) ' Barotropic time step [s] is :', rDt_e 1537 1033 IF(lwp) WRITE(numout,*) ' Maximum Courant number is :', zcmax 1538 1034 ! … … 1546 1042 ENDIF 1547 1043 IF( zcmax>0.9_wp ) THEN 1548 CALL ctl_stop( 'dynspg_ts ERROR: Maximum Courant number is greater than 0.9: Inc. nn_ baro!' )1044 CALL ctl_stop( 'dynspg_ts ERROR: Maximum Courant number is greater than 0.9: Inc. nn_e !' ) 1549 1045 ENDIF 1550 1046 ! … … 1581 1077 END SUBROUTINE dyn_spg_ts_init 1582 1078 1079 1080 SUBROUTINE dyn_cor_2D_init( Kmm ) 1081 !!--------------------------------------------------------------------- 1082 !! *** ROUTINE dyn_cor_2D_init *** 1083 !! 1084 !! ** Purpose : Set time splitting options 1085 !! Set arrays to remove/compute coriolis trend. 1086 !! Do it once during initialization if volume is fixed, else at each long time step. 1087 !! Note that these arrays are also used during barotropic loop. These are however frozen 1088 !! although they should be updated in the variable volume case. Not a big approximation. 1089 !! To remove this approximation, copy lines below inside barotropic loop 1090 !! and update depths at T-F points (ht and zhf resp.) at each barotropic time step 1091 !! 1092 !! Compute zwz = f / ( height of the water colomn ) 1093 !!---------------------------------------------------------------------- 1094 INTEGER, INTENT(in) :: Kmm ! Time index 1095 INTEGER :: ji ,jj, jk ! dummy loop indices 1096 REAL(wp) :: z1_ht 1097 REAL(wp), DIMENSION(jpi,jpj) :: zhf 1098 !!---------------------------------------------------------------------- 1099 ! 1100 SELECT CASE( nvor_scheme ) 1101 CASE( np_EEN ) != EEN scheme using e3f energy & enstrophy scheme 1102 SELECT CASE( nn_een_e3f ) !* ff_f/e3 at F-point 1103 CASE ( 0 ) ! original formulation (masked averaging of e3t divided by 4) 1104 DO_2D( 1, 0, 1, 0 ) 1105 zwz(ji,jj) = ( ht(ji ,jj+1) + ht(ji+1,jj+1) + & 1106 & ht(ji ,jj ) + ht(ji+1,jj ) ) * 0.25_wp 1107 IF( zwz(ji,jj) /= 0._wp ) zwz(ji,jj) = ff_f(ji,jj) / zwz(ji,jj) 1108 END_2D 1109 CASE ( 1 ) ! new formulation (masked averaging of e3t divided by the sum of mask) 1110 DO_2D( 1, 0, 1, 0 ) 1111 zwz(ji,jj) = ( ht (ji ,jj+1) + ht (ji+1,jj+1) & 1112 & + ht (ji ,jj ) + ht (ji+1,jj ) ) & 1113 & / ( MAX( 1._wp, ssmask(ji ,jj+1) + ssmask(ji+1,jj+1) & 1114 & + ssmask(ji ,jj ) + ssmask(ji+1,jj ) ) ) 1115 IF( zwz(ji,jj) /= 0._wp ) zwz(ji,jj) = ff_f(ji,jj) / zwz(ji,jj) 1116 END_2D 1117 END SELECT 1118 CALL lbc_lnk( 'dynspg_ts', zwz, 'F', 1._wp ) 1119 ! 1120 ftne(1,:) = 0._wp ; ftnw(1,:) = 0._wp ; ftse(1,:) = 0._wp ; ftsw(1,:) = 0._wp 1121 DO_2D( 0, 1, 0, 1 ) 1122 ftne(ji,jj) = zwz(ji-1,jj ) + zwz(ji ,jj ) + zwz(ji ,jj-1) 1123 ftnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj ) + zwz(ji ,jj ) 1124 ftse(ji,jj) = zwz(ji ,jj ) + zwz(ji ,jj-1) + zwz(ji-1,jj-1) 1125 ftsw(ji,jj) = zwz(ji ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj ) 1126 END_2D 1127 ! 1128 CASE( np_EET ) != EEN scheme using e3t energy conserving scheme 1129 ftne(1,:) = 0._wp ; ftnw(1,:) = 0._wp ; ftse(1,:) = 0._wp ; ftsw(1,:) = 0._wp 1130 DO_2D( 0, 1, 0, 1 ) 1131 z1_ht = ssmask(ji,jj) / ( ht(ji,jj) + 1._wp - ssmask(ji,jj) ) 1132 ftne(ji,jj) = ( ff_f(ji-1,jj ) + ff_f(ji ,jj ) + ff_f(ji ,jj-1) ) * z1_ht 1133 ftnw(ji,jj) = ( ff_f(ji-1,jj-1) + ff_f(ji-1,jj ) + ff_f(ji ,jj ) ) * z1_ht 1134 ftse(ji,jj) = ( ff_f(ji ,jj ) + ff_f(ji ,jj-1) + ff_f(ji-1,jj-1) ) * z1_ht 1135 ftsw(ji,jj) = ( ff_f(ji ,jj-1) + ff_f(ji-1,jj-1) + ff_f(ji-1,jj ) ) * z1_ht 1136 END_2D 1137 ! 1138 CASE( np_ENE, np_ENS , np_MIX ) != all other schemes (ENE, ENS, MIX) except ENT ! 1139 ! 1140 zwz(:,:) = 0._wp 1141 zhf(:,:) = 0._wp 1142 1143 !!gm assume 0 in both cases (which is almost surely WRONG ! ) as hvatf has been removed 1144 !!gm A priori a better value should be something like : 1145 !!gm zhf(i,j) = masked sum of ht(i,j) , ht(i+1,j) , ht(i,j+1) , (i+1,j+1) 1146 !!gm divided by the sum of the corresponding mask 1147 !!gm 1148 !! 1149 IF( .NOT.ln_sco ) THEN 1150 1151 !!gm agree the JC comment : this should be done in a much clear way 1152 1153 ! JC: It not clear yet what should be the depth at f-points over land in z-coordinate case 1154 ! Set it to zero for the time being 1155 ! IF( rn_hmin < 0._wp ) THEN ; jk = - INT( rn_hmin ) ! from a nb of level 1156 ! ELSE ; jk = MINLOC( gdepw_0, mask = gdepw_0 > rn_hmin, dim = 1 ) ! from a depth 1157 ! ENDIF 1158 ! zhf(:,:) = gdepw_0(:,:,jk+1) 1159 ! 1160 ELSE 1161 ! 1162 !zhf(:,:) = hbatf(:,:) 1163 DO_2D( 1, 0, 1, 0 ) 1164 zhf(ji,jj) = ( ht_0 (ji,jj ) + ht_0 (ji+1,jj ) & 1165 & + ht_0 (ji,jj+1) + ht_0 (ji+1,jj+1) ) & 1166 & / MAX( ssmask(ji,jj ) + ssmask(ji+1,jj ) & 1167 & + ssmask(ji,jj+1) + ssmask(ji+1,jj+1) , 1._wp ) 1168 END_2D 1169 ENDIF 1170 ! 1171 DO jj = 1, jpjm1 1172 zhf(:,jj) = zhf(:,jj) * (1._wp- umask(:,jj,1) * umask(:,jj+1,1)) 1173 END DO 1174 ! 1175 DO jk = 1, jpkm1 1176 DO jj = 1, jpjm1 1177 zhf(:,jj) = zhf(:,jj) + e3f(:,jj,jk) * umask(:,jj,jk) * umask(:,jj+1,jk) 1178 END DO 1179 END DO 1180 CALL lbc_lnk( 'dynspg_ts', zhf, 'F', 1._wp ) 1181 ! JC: TBC. hf should be greater than 0 1182 DO_2D( 1, 1, 1, 1 ) 1183 IF( zhf(ji,jj) /= 0._wp ) zwz(ji,jj) = 1._wp / zhf(ji,jj) 1184 END_2D 1185 zwz(:,:) = ff_f(:,:) * zwz(:,:) 1186 END SELECT 1187 1188 END SUBROUTINE dyn_cor_2d_init 1189 1190 1191 1192 SUBROUTINE dyn_cor_2d( pht, phu, phv, punb, pvnb, zhU, zhV, zu_trd, zv_trd ) 1193 !!--------------------------------------------------------------------- 1194 !! *** ROUTINE dyn_cor_2d *** 1195 !! 1196 !! ** Purpose : Compute u and v coriolis trends 1197 !!---------------------------------------------------------------------- 1198 INTEGER :: ji ,jj ! dummy loop indices 1199 REAL(wp) :: zx1, zx2, zy1, zy2, z1_hu, z1_hv ! - - 1200 REAL(wp), DIMENSION(jpi,jpj), INTENT(in ) :: pht, phu, phv, punb, pvnb, zhU, zhV 1201 REAL(wp), DIMENSION(jpi,jpj), INTENT( out) :: zu_trd, zv_trd 1202 !!---------------------------------------------------------------------- 1203 SELECT CASE( nvor_scheme ) 1204 CASE( np_ENT ) ! enstrophy conserving scheme (f-point) 1205 DO_2D( 0, 0, 0, 0 ) 1206 z1_hu = ssumask(ji,jj) / ( phu(ji,jj) + 1._wp - ssumask(ji,jj) ) 1207 z1_hv = ssvmask(ji,jj) / ( phv(ji,jj) + 1._wp - ssvmask(ji,jj) ) 1208 zu_trd(ji,jj) = + r1_4 * r1_e1e2u(ji,jj) * z1_hu & 1209 & * ( e1e2t(ji+1,jj)*pht(ji+1,jj)*ff_t(ji+1,jj) * ( pvnb(ji+1,jj) + pvnb(ji+1,jj-1) ) & 1210 & + e1e2t(ji ,jj)*pht(ji ,jj)*ff_t(ji ,jj) * ( pvnb(ji ,jj) + pvnb(ji ,jj-1) ) ) 1211 ! 1212 zv_trd(ji,jj) = - r1_4 * r1_e1e2v(ji,jj) * z1_hv & 1213 & * ( e1e2t(ji,jj+1)*pht(ji,jj+1)*ff_t(ji,jj+1) * ( punb(ji,jj+1) + punb(ji-1,jj+1) ) & 1214 & + e1e2t(ji,jj )*pht(ji,jj )*ff_t(ji,jj ) * ( punb(ji,jj ) + punb(ji-1,jj ) ) ) 1215 END_2D 1216 ! 1217 CASE( np_ENE , np_MIX ) ! energy conserving scheme (t-point) ENE or MIX 1218 DO_2D( 0, 0, 0, 0 ) 1219 zy1 = ( zhV(ji,jj-1) + zhV(ji+1,jj-1) ) * r1_e1u(ji,jj) 1220 zy2 = ( zhV(ji,jj ) + zhV(ji+1,jj ) ) * r1_e1u(ji,jj) 1221 zx1 = ( zhU(ji-1,jj) + zhU(ji-1,jj+1) ) * r1_e2v(ji,jj) 1222 zx2 = ( zhU(ji ,jj) + zhU(ji ,jj+1) ) * r1_e2v(ji,jj) 1223 ! energy conserving formulation for planetary vorticity term 1224 zu_trd(ji,jj) = r1_4 * ( zwz(ji ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 1225 zv_trd(ji,jj) = - r1_4 * ( zwz(ji-1,jj ) * zx1 + zwz(ji,jj) * zx2 ) 1226 END_2D 1227 ! 1228 CASE( np_ENS ) ! enstrophy conserving scheme (f-point) 1229 DO_2D( 0, 0, 0, 0 ) 1230 zy1 = r1_8 * ( zhV(ji ,jj-1) + zhV(ji+1,jj-1) & 1231 & + zhV(ji ,jj ) + zhV(ji+1,jj ) ) * r1_e1u(ji,jj) 1232 zx1 = - r1_8 * ( zhU(ji-1,jj ) + zhU(ji-1,jj+1) & 1233 & + zhU(ji ,jj ) + zhU(ji ,jj+1) ) * r1_e2v(ji,jj) 1234 zu_trd(ji,jj) = zy1 * ( zwz(ji ,jj-1) + zwz(ji,jj) ) 1235 zv_trd(ji,jj) = zx1 * ( zwz(ji-1,jj ) + zwz(ji,jj) ) 1236 END_2D 1237 ! 1238 CASE( np_EET , np_EEN ) ! energy & enstrophy scheme (using e3t or e3f) 1239 DO_2D( 0, 0, 0, 0 ) 1240 zu_trd(ji,jj) = + r1_12 * r1_e1u(ji,jj) * ( ftne(ji,jj ) * zhV(ji ,jj ) & 1241 & + ftnw(ji+1,jj) * zhV(ji+1,jj ) & 1242 & + ftse(ji,jj ) * zhV(ji ,jj-1) & 1243 & + ftsw(ji+1,jj) * zhV(ji+1,jj-1) ) 1244 zv_trd(ji,jj) = - r1_12 * r1_e2v(ji,jj) * ( ftsw(ji,jj+1) * zhU(ji-1,jj+1) & 1245 & + ftse(ji,jj+1) * zhU(ji ,jj+1) & 1246 & + ftnw(ji,jj ) * zhU(ji-1,jj ) & 1247 & + ftne(ji,jj ) * zhU(ji ,jj ) ) 1248 END_2D 1249 ! 1250 END SELECT 1251 ! 1252 END SUBROUTINE dyn_cor_2D 1253 1254 1255 SUBROUTINE wad_tmsk( pssh, ptmsk ) 1256 !!---------------------------------------------------------------------- 1257 !! *** ROUTINE wad_lmt *** 1258 !! 1259 !! ** Purpose : set wetting & drying mask at tracer points 1260 !! for the current barotropic sub-step 1261 !! 1262 !! ** Method : ??? 1263 !! 1264 !! ** Action : ptmsk : wetting & drying t-mask 1265 !!---------------------------------------------------------------------- 1266 REAL(wp), DIMENSION(jpi,jpj), INTENT(in ) :: pssh ! 1267 REAL(wp), DIMENSION(jpi,jpj), INTENT( out) :: ptmsk ! 1268 ! 1269 INTEGER :: ji, jj ! dummy loop indices 1270 !!---------------------------------------------------------------------- 1271 ! 1272 IF( ln_wd_dl_rmp ) THEN 1273 DO_2D( 1, 1, 1, 1 ) 1274 IF ( pssh(ji,jj) + ht_0(ji,jj) > 2._wp * rn_wdmin1 ) THEN 1275 ! IF ( pssh(ji,jj) + ht_0(ji,jj) > rn_wdmin2 ) THEN 1276 ptmsk(ji,jj) = 1._wp 1277 ELSEIF( pssh(ji,jj) + ht_0(ji,jj) > rn_wdmin1 ) THEN 1278 ptmsk(ji,jj) = TANH( 50._wp*( ( pssh(ji,jj) + ht_0(ji,jj) - rn_wdmin1 )*r_rn_wdmin1) ) 1279 ELSE 1280 ptmsk(ji,jj) = 0._wp 1281 ENDIF 1282 END_2D 1283 ELSE 1284 DO_2D( 1, 1, 1, 1 ) 1285 IF ( pssh(ji,jj) + ht_0(ji,jj) > rn_wdmin1 ) THEN ; ptmsk(ji,jj) = 1._wp 1286 ELSE ; ptmsk(ji,jj) = 0._wp 1287 ENDIF 1288 END_2D 1289 ENDIF 1290 ! 1291 END SUBROUTINE wad_tmsk 1292 1293 1294 SUBROUTINE wad_Umsk( pTmsk, phU, phV, pu, pv, pUmsk, pVmsk ) 1295 !!---------------------------------------------------------------------- 1296 !! *** ROUTINE wad_lmt *** 1297 !! 1298 !! ** Purpose : set wetting & drying mask at tracer points 1299 !! for the current barotropic sub-step 1300 !! 1301 !! ** Method : ??? 1302 !! 1303 !! ** Action : ptmsk : wetting & drying t-mask 1304 !!---------------------------------------------------------------------- 1305 REAL(wp), DIMENSION(jpi,jpj), INTENT(in ) :: pTmsk ! W & D t-mask 1306 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: phU, phV, pu, pv ! ocean velocities and transports 1307 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pUmsk, pVmsk ! W & D u- and v-mask 1308 ! 1309 INTEGER :: ji, jj ! dummy loop indices 1310 !!---------------------------------------------------------------------- 1311 ! 1312 DO_2D( 1, 1, 1, 0 ) 1313 IF ( phU(ji,jj) > 0._wp ) THEN ; pUmsk(ji,jj) = pTmsk(ji ,jj) 1314 ELSE ; pUmsk(ji,jj) = pTmsk(ji+1,jj) 1315 ENDIF 1316 phU(ji,jj) = pUmsk(ji,jj)*phU(ji,jj) 1317 pu (ji,jj) = pUmsk(ji,jj)*pu (ji,jj) 1318 END_2D 1319 ! 1320 DO_2D( 1, 0, 1, 1 ) 1321 IF ( phV(ji,jj) > 0._wp ) THEN ; pVmsk(ji,jj) = pTmsk(ji,jj ) 1322 ELSE ; pVmsk(ji,jj) = pTmsk(ji,jj+1) 1323 ENDIF 1324 phV(ji,jj) = pVmsk(ji,jj)*phV(ji,jj) 1325 pv (ji,jj) = pVmsk(ji,jj)*pv (ji,jj) 1326 END_2D 1327 ! 1328 END SUBROUTINE wad_Umsk 1329 1330 1331 SUBROUTINE wad_spg( pshn, zcpx, zcpy ) 1332 !!--------------------------------------------------------------------- 1333 !! *** ROUTINE wad_sp *** 1334 !! 1335 !! ** Purpose : 1336 !!---------------------------------------------------------------------- 1337 INTEGER :: ji ,jj ! dummy loop indices 1338 LOGICAL :: ll_tmp1, ll_tmp2 1339 REAL(wp), DIMENSION(jpi,jpj), INTENT(in ) :: pshn 1340 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: zcpx, zcpy 1341 !!---------------------------------------------------------------------- 1342 DO_2D( 0, 0, 0, 0 ) 1343 ll_tmp1 = MIN( pshn(ji,jj) , pshn(ji+1,jj) ) > & 1344 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) .AND. & 1345 & MAX( pshn(ji,jj) + ht_0(ji,jj) , pshn(ji+1,jj) + ht_0(ji+1,jj) ) & 1346 & > rn_wdmin1 + rn_wdmin2 1347 ll_tmp2 = ( ABS( pshn(ji+1,jj) - pshn(ji ,jj)) > 1.E-12 ).AND.( & 1348 & MAX( pshn(ji,jj) , pshn(ji+1,jj) ) > & 1349 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 1350 IF(ll_tmp1) THEN 1351 zcpx(ji,jj) = 1.0_wp 1352 ELSEIF(ll_tmp2) THEN 1353 ! no worries about pshn(ji+1,jj) - pshn(ji ,jj) = 0, it won't happen ! here 1354 zcpx(ji,jj) = ABS( (pshn(ji+1,jj) + ht_0(ji+1,jj) - pshn(ji,jj) - ht_0(ji,jj)) & 1355 & / (pshn(ji+1,jj) - pshn(ji ,jj)) ) 1356 zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 1357 ELSE 1358 zcpx(ji,jj) = 0._wp 1359 ENDIF 1360 ! 1361 ll_tmp1 = MIN( pshn(ji,jj) , pshn(ji,jj+1) ) > & 1362 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) .AND. & 1363 & MAX( pshn(ji,jj) + ht_0(ji,jj) , pshn(ji,jj+1) + ht_0(ji,jj+1) ) & 1364 & > rn_wdmin1 + rn_wdmin2 1365 ll_tmp2 = ( ABS( pshn(ji,jj) - pshn(ji,jj+1)) > 1.E-12 ).AND.( & 1366 & MAX( pshn(ji,jj) , pshn(ji,jj+1) ) > & 1367 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 1368 1369 IF(ll_tmp1) THEN 1370 zcpy(ji,jj) = 1.0_wp 1371 ELSE IF(ll_tmp2) THEN 1372 ! no worries about pshn(ji,jj+1) - pshn(ji,jj ) = 0, it won't happen ! here 1373 zcpy(ji,jj) = ABS( (pshn(ji,jj+1) + ht_0(ji,jj+1) - pshn(ji,jj) - ht_0(ji,jj)) & 1374 & / (pshn(ji,jj+1) - pshn(ji,jj )) ) 1375 zcpy(ji,jj) = MAX( 0._wp , MIN( zcpy(ji,jj) , 1.0_wp ) ) 1376 ELSE 1377 zcpy(ji,jj) = 0._wp 1378 ENDIF 1379 END_2D 1380 1381 END SUBROUTINE wad_spg 1382 1383 1384 1385 SUBROUTINE dyn_drg_init( Kbb, Kmm, puu, pvv, puu_b ,pvv_b, pu_RHSi, pv_RHSi, pCdU_u, pCdU_v ) 1386 !!---------------------------------------------------------------------- 1387 !! *** ROUTINE dyn_drg_init *** 1388 !! 1389 !! ** Purpose : - add the baroclinic top/bottom drag contribution to 1390 !! the baroclinic part of the barotropic RHS 1391 !! - compute the barotropic drag coefficients 1392 !! 1393 !! ** Method : computation done over the INNER domain only 1394 !!---------------------------------------------------------------------- 1395 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices 1396 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(in ) :: puu, pvv ! ocean velocities and RHS of momentum equation 1397 REAL(wp), DIMENSION(jpi,jpj,jpt) , INTENT(in ) :: puu_b, pvv_b ! barotropic velocities at main time levels 1398 REAL(wp), DIMENSION(jpi,jpj) , INTENT(inout) :: pu_RHSi, pv_RHSi ! baroclinic part of the barotropic RHS 1399 REAL(wp), DIMENSION(jpi,jpj) , INTENT( out) :: pCdU_u , pCdU_v ! barotropic drag coefficients 1400 ! 1401 INTEGER :: ji, jj ! dummy loop indices 1402 INTEGER :: ikbu, ikbv, iktu, iktv 1403 REAL(wp) :: zztmp 1404 REAL(wp), DIMENSION(jpi,jpj) :: zu_i, zv_i 1405 !!---------------------------------------------------------------------- 1406 ! 1407 ! !== Set the barotropic drag coef. ==! 1408 ! 1409 IF( ln_isfcav ) THEN ! top+bottom friction (ocean cavities) 1410 1411 DO_2D( 0, 0, 0, 0 ) 1412 pCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) + rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) 1413 pCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) + rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) 1414 END_2D 1415 ELSE ! bottom friction only 1416 DO_2D( 0, 0, 0, 0 ) 1417 pCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) 1418 pCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) 1419 END_2D 1420 ENDIF 1421 ! 1422 ! !== BOTTOM stress contribution from baroclinic velocities ==! 1423 ! 1424 IF( ln_bt_fw ) THEN ! FORWARD integration: use NOW bottom baroclinic velocities 1425 1426 DO_2D( 0, 0, 0, 0 ) 1427 ikbu = mbku(ji,jj) 1428 ikbv = mbkv(ji,jj) 1429 zu_i(ji,jj) = puu(ji,jj,ikbu,Kmm) - puu_b(ji,jj,Kmm) 1430 zv_i(ji,jj) = pvv(ji,jj,ikbv,Kmm) - pvv_b(ji,jj,Kmm) 1431 END_2D 1432 ELSE ! CENTRED integration: use BEFORE bottom baroclinic velocities 1433 1434 DO_2D( 0, 0, 0, 0 ) 1435 ikbu = mbku(ji,jj) 1436 ikbv = mbkv(ji,jj) 1437 zu_i(ji,jj) = puu(ji,jj,ikbu,Kbb) - puu_b(ji,jj,Kbb) 1438 zv_i(ji,jj) = pvv(ji,jj,ikbv,Kbb) - pvv_b(ji,jj,Kbb) 1439 END_2D 1440 ENDIF 1441 ! 1442 IF( ln_wd_il ) THEN ! W/D : use the "clipped" bottom friction !!gm explain WHY, please ! 1443 zztmp = -1._wp / rDt_e 1444 DO_2D( 0, 0, 0, 0 ) 1445 pu_RHSi(ji,jj) = pu_RHSi(ji,jj) + zu_i(ji,jj) * wdrampu(ji,jj) * MAX( & 1446 & r1_hu(ji,jj,Kmm) * r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) , zztmp ) 1447 pv_RHSi(ji,jj) = pv_RHSi(ji,jj) + zv_i(ji,jj) * wdrampv(ji,jj) * MAX( & 1448 & r1_hv(ji,jj,Kmm) * r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) , zztmp ) 1449 END_2D 1450 ELSE ! use "unclipped" drag (even if explicit friction is used in 3D calculation) 1451 1452 DO_2D( 0, 0, 0, 0 ) 1453 pu_RHSi(ji,jj) = pu_RHSi(ji,jj) + r1_hu(ji,jj,Kmm) * r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * zu_i(ji,jj) 1454 pv_RHSi(ji,jj) = pv_RHSi(ji,jj) + r1_hv(ji,jj,Kmm) * r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * zv_i(ji,jj) 1455 END_2D 1456 END IF 1457 ! 1458 ! !== TOP stress contribution from baroclinic velocities ==! (no W/D case) 1459 ! 1460 IF( ln_isfcav ) THEN 1461 ! 1462 IF( ln_bt_fw ) THEN ! FORWARD integration: use NOW top baroclinic velocity 1463 1464 DO_2D( 0, 0, 0, 0 ) 1465 iktu = miku(ji,jj) 1466 iktv = mikv(ji,jj) 1467 zu_i(ji,jj) = puu(ji,jj,iktu,Kmm) - puu_b(ji,jj,Kmm) 1468 zv_i(ji,jj) = pvv(ji,jj,iktv,Kmm) - pvv_b(ji,jj,Kmm) 1469 END_2D 1470 ELSE ! CENTRED integration: use BEFORE top baroclinic velocity 1471 1472 DO_2D( 0, 0, 0, 0 ) 1473 iktu = miku(ji,jj) 1474 iktv = mikv(ji,jj) 1475 zu_i(ji,jj) = puu(ji,jj,iktu,Kbb) - puu_b(ji,jj,Kbb) 1476 zv_i(ji,jj) = pvv(ji,jj,iktv,Kbb) - pvv_b(ji,jj,Kbb) 1477 END_2D 1478 ENDIF 1479 ! 1480 ! ! use "unclipped" top drag (even if explicit friction is used in 3D calculation) 1481 1482 DO_2D( 0, 0, 0, 0 ) 1483 pu_RHSi(ji,jj) = pu_RHSi(ji,jj) + r1_hu(ji,jj,Kmm) * r1_2*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * zu_i(ji,jj) 1484 pv_RHSi(ji,jj) = pv_RHSi(ji,jj) + r1_hv(ji,jj,Kmm) * r1_2*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * zv_i(ji,jj) 1485 END_2D 1486 ! 1487 ENDIF 1488 ! 1489 END SUBROUTINE dyn_drg_init 1490 1491 SUBROUTINE ts_bck_interp( jn, ll_init, & ! <== in 1492 & za0, za1, za2, za3 ) ! ==> out 1493 !!---------------------------------------------------------------------- 1494 INTEGER ,INTENT(in ) :: jn ! index of sub time step 1495 LOGICAL ,INTENT(in ) :: ll_init ! 1496 REAL(wp),INTENT( out) :: za0, za1, za2, za3 ! Half-step back interpolation coefficient 1497 ! 1498 REAL(wp) :: zepsilon, zgamma ! - - 1499 !!---------------------------------------------------------------------- 1500 ! ! set Half-step back interpolation coefficient 1501 IF ( jn==1 .AND. ll_init ) THEN !* Forward-backward 1502 za0 = 1._wp 1503 za1 = 0._wp 1504 za2 = 0._wp 1505 za3 = 0._wp 1506 ELSEIF( jn==2 .AND. ll_init ) THEN !* AB2-AM3 Coefficients; bet=0 ; gam=-1/6 ; eps=1/12 1507 za0 = 1.0833333333333_wp ! za0 = 1-gam-eps 1508 za1 =-0.1666666666666_wp ! za1 = gam 1509 za2 = 0.0833333333333_wp ! za2 = eps 1510 za3 = 0._wp 1511 ELSE !* AB3-AM4 Coefficients; bet=0.281105 ; eps=0.013 ; gam=0.0880 1512 IF( rn_bt_alpha == 0._wp ) THEN ! Time diffusion 1513 za0 = 0.614_wp ! za0 = 1/2 + gam + 2*eps 1514 za1 = 0.285_wp ! za1 = 1/2 - 2*gam - 3*eps 1515 za2 = 0.088_wp ! za2 = gam 1516 za3 = 0.013_wp ! za3 = eps 1517 ELSE ! no time diffusion 1518 zepsilon = 0.00976186_wp - 0.13451357_wp * rn_bt_alpha 1519 zgamma = 0.08344500_wp - 0.51358400_wp * rn_bt_alpha 1520 za0 = 0.5_wp + zgamma + 2._wp * rn_bt_alpha + 2._wp * zepsilon 1521 za1 = 1._wp - za0 - zgamma - zepsilon 1522 za2 = zgamma 1523 za3 = zepsilon 1524 ENDIF 1525 ENDIF 1526 END SUBROUTINE ts_bck_interp 1527 1528 1583 1529 !!====================================================================== 1584 1530 END MODULE dynspg_ts -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynvor.F90
r10425 r13463 80 80 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: di_e2u_2 ! = di(e2u)/2 used in T-point metric term calculation 81 81 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dj_e1v_2 ! = dj(e1v)/2 - - - - 82 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: di_e2v_2e1e2f ! = di(e2 u)/(2*e1e2f) used in F-point metric term calculation83 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dj_e1u_2e1e2f ! = dj(e1 v)/(2*e1e2f) - - - -82 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: di_e2v_2e1e2f ! = di(e2v)/(2*e1e2f) used in F-point metric term calculation 83 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: dj_e1u_2e1e2f ! = dj(e1u)/(2*e1e2f) - - - - 84 84 85 85 REAL(wp) :: r1_4 = 0.250_wp ! =1/4 … … 88 88 89 89 !! * Substitutions 90 # include "vectopt_loop_substitute.h90" 90 # include "do_loop_substitute.h90" 91 # include "domzgr_substitute.h90" 92 91 93 !!---------------------------------------------------------------------- 92 94 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 96 98 CONTAINS 97 99 98 SUBROUTINE dyn_vor( kt )100 SUBROUTINE dyn_vor( kt, Kmm, puu, pvv, Krhs ) 99 101 !!---------------------------------------------------------------------- 100 102 !! 101 103 !! ** Purpose : compute the lateral ocean tracer physics. 102 104 !! 103 !! ** Action : - Update ( ua,va) with the now vorticity term trend105 !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now vorticity term trend 104 106 !! - save the trends in (ztrdu,ztrdv) in 2 parts (relative 105 107 !! and planetary vorticity trends) and send them to trd_dyn 106 108 !! for futher diagnostics (l_trddyn=T) 107 109 !!---------------------------------------------------------------------- 108 INTEGER, INTENT( in ) :: kt ! ocean time-step index 110 INTEGER , INTENT( in ) :: kt ! ocean time-step index 111 INTEGER , INTENT( in ) :: Kmm, Krhs ! ocean time level indices 112 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocity field and RHS of momentum equation 109 113 ! 110 114 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv … … 117 121 ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) ) 118 122 ! 119 ztrdu(:,:,:) = ua(:,:,:) !* planetary vorticity trend (including Stokes-Coriolis force)120 ztrdv(:,:,:) = va(:,:,:)123 ztrdu(:,:,:) = puu(:,:,:,Krhs) !* planetary vorticity trend (including Stokes-Coriolis force) 124 ztrdv(:,:,:) = pvv(:,:,:,Krhs) 121 125 SELECT CASE( nvor_scheme ) 122 CASE( np_ENS ) ; CALL vor_ens( kt, ncor, un , vn , ua, va) ! enstrophy conserving scheme123 IF( ln_stcor ) CALL vor_ens( kt, ncor, usd, vsd, ua, va) ! add the Stokes-Coriolis trend124 CASE( np_ENE, np_MIX ) ; CALL vor_ene( kt, ncor, un , vn , ua, va) ! energy conserving scheme125 IF( ln_stcor ) CALL vor_ene( kt, ncor, usd, vsd, ua, va) ! add the Stokes-Coriolis trend126 CASE( np_ENT ) ; CALL vor_enT( kt, ncor, un , vn , ua, va) ! energy conserving scheme (T-pts)127 IF( ln_stcor ) CALL vor_enT( kt, ncor, usd, vsd, ua, va) ! add the Stokes-Coriolis trend128 CASE( np_EET ) ; CALL vor_eeT( kt, ncor, un , vn , ua, va) ! energy conserving scheme (een with e3t)129 IF( ln_stcor ) CALL vor_eeT( kt, ncor, usd, vsd, ua, va) ! add the Stokes-Coriolis trend130 CASE( np_EEN ) ; CALL vor_een( kt, ncor, un , vn , ua, va) ! energy & enstrophy scheme131 IF( ln_stcor ) CALL vor_een( kt, ncor, usd, vsd, ua, va) ! add the Stokes-Coriolis trend126 CASE( np_ENS ) ; CALL vor_ens( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! enstrophy conserving scheme 127 IF( ln_stcor ) CALL vor_ens( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 128 CASE( np_ENE, np_MIX ) ; CALL vor_ene( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! energy conserving scheme 129 IF( ln_stcor ) CALL vor_ene( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 130 CASE( np_ENT ) ; CALL vor_enT( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! energy conserving scheme (T-pts) 131 IF( ln_stcor ) CALL vor_enT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 132 CASE( np_EET ) ; CALL vor_eeT( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! energy conserving scheme (een with e3t) 133 IF( ln_stcor ) CALL vor_eeT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 134 CASE( np_EEN ) ; CALL vor_een( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! energy & enstrophy scheme 135 IF( ln_stcor ) CALL vor_een( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 132 136 END SELECT 133 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)134 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)135 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt )137 ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 138 ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 139 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt, Kmm ) 136 140 ! 137 141 IF( n_dynadv /= np_LIN_dyn ) THEN !* relative vorticity or metric trend (only in non-linear case) 138 ztrdu(:,:,:) = ua(:,:,:)139 ztrdv(:,:,:) = va(:,:,:)142 ztrdu(:,:,:) = puu(:,:,:,Krhs) 143 ztrdv(:,:,:) = pvv(:,:,:,Krhs) 140 144 SELECT CASE( nvor_scheme ) 141 CASE( np_ENT ) ; CALL vor_enT( kt, nrvm, un , vn , ua, va) ! energy conserving scheme (T-pts)142 CASE( np_EET ) ; CALL vor_eeT( kt, nrvm, un , vn , ua, va) ! energy conserving scheme (een with e3t)143 CASE( np_ENE ) ; CALL vor_ene( kt, nrvm, un , vn , ua, va) ! energy conserving scheme144 CASE( np_ENS, np_MIX ) ; CALL vor_ens( kt, nrvm, un , vn , ua, va) ! enstrophy conserving scheme145 CASE( np_EEN ) ; CALL vor_een( kt, nrvm, un , vn , ua, va) ! energy & enstrophy scheme145 CASE( np_ENT ) ; CALL vor_enT( kt, Kmm, nrvm, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! energy conserving scheme (T-pts) 146 CASE( np_EET ) ; CALL vor_eeT( kt, Kmm, nrvm, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! energy conserving scheme (een with e3t) 147 CASE( np_ENE ) ; CALL vor_ene( kt, Kmm, nrvm, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! energy conserving scheme 148 CASE( np_ENS, np_MIX ) ; CALL vor_ens( kt, Kmm, nrvm, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! enstrophy conserving scheme 149 CASE( np_EEN ) ; CALL vor_een( kt, Kmm, nrvm, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! energy & enstrophy scheme 146 150 END SELECT 147 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)148 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)149 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt )151 ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 152 ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 153 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt, Kmm ) 150 154 ENDIF 151 155 ! … … 156 160 SELECT CASE ( nvor_scheme ) !== vorticity trend added to the general trend ==! 157 161 CASE( np_ENT ) !* energy conserving scheme (T-pts) 158 CALL vor_enT( kt, ntot, un , vn , ua, va) ! total vorticity trend159 IF( ln_stcor ) CALL vor_enT( kt, ncor, usd, vsd, ua, va) ! add the Stokes-Coriolis trend162 CALL vor_enT( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! total vorticity trend 163 IF( ln_stcor ) CALL vor_enT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 160 164 CASE( np_EET ) !* energy conserving scheme (een scheme using e3t) 161 CALL vor_eeT( kt, ntot, un , vn , ua, va) ! total vorticity trend162 IF( ln_stcor ) CALL vor_eeT( kt, ncor, usd, vsd, ua, va) ! add the Stokes-Coriolis trend165 CALL vor_eeT( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! total vorticity trend 166 IF( ln_stcor ) CALL vor_eeT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 163 167 CASE( np_ENE ) !* energy conserving scheme 164 CALL vor_ene( kt, ntot, un , vn , ua, va) ! total vorticity trend165 IF( ln_stcor ) CALL vor_ene( kt, ncor, usd, vsd, ua, va) ! add the Stokes-Coriolis trend168 CALL vor_ene( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! total vorticity trend 169 IF( ln_stcor ) CALL vor_ene( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 166 170 CASE( np_ENS ) !* enstrophy conserving scheme 167 CALL vor_ens( kt, ntot, un , vn , ua, va) ! total vorticity trend168 IF( ln_stcor ) CALL vor_ens( kt, ncor, usd, vsd, ua, va) ! add the Stokes-Coriolis trend171 CALL vor_ens( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! total vorticity trend 172 IF( ln_stcor ) CALL vor_ens( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 169 173 CASE( np_MIX ) !* mixed ene-ens scheme 170 CALL vor_ens( kt, nrvm, un , vn , ua, va) ! relative vorticity or metric trend (ens)171 CALL vor_ene( kt, ncor, un , vn , ua, va) ! planetary vorticity trend (ene)172 IF( ln_stcor ) CALL vor_ene( kt, ncor, usd, vsd, ua, va) ! add the Stokes-Coriolis trend174 CALL vor_ens( kt, Kmm, nrvm, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! relative vorticity or metric trend (ens) 175 CALL vor_ene( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! planetary vorticity trend (ene) 176 IF( ln_stcor ) CALL vor_ene( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 173 177 CASE( np_EEN ) !* energy and enstrophy conserving scheme 174 CALL vor_een( kt, ntot, un , vn , ua, va) ! total vorticity trend175 IF( ln_stcor ) CALL vor_een( kt, ncor, usd, vsd, ua, va) ! add the Stokes-Coriolis trend178 CALL vor_een( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! total vorticity trend 179 IF( ln_stcor ) CALL vor_een( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add the Stokes-Coriolis trend 176 180 END SELECT 177 181 ! … … 179 183 ! 180 184 ! ! print sum trends (used for debugging) 181 IF( ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' vor - Ua: ', mask1=umask, &182 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )185 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' vor - Ua: ', mask1=umask, & 186 & tab3d_2=pvv(:,:,:,Krhs), clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 183 187 ! 184 188 IF( ln_timing ) CALL timing_stop('dyn_vor') … … 187 191 188 192 189 SUBROUTINE vor_enT( kt, kvor, pu, pv, pu_rhs, pv_rhs )193 SUBROUTINE vor_enT( kt, Kmm, kvor, pu, pv, pu_rhs, pv_rhs ) 190 194 !!---------------------------------------------------------------------- 191 195 !! *** ROUTINE vor_enT *** … … 203 207 !! where rvor is the relative vorticity at f-point 204 208 !! 205 !! ** Action : - Update ( ua,va) with the now vorticity term trend209 !! ** Action : - Update (pu_rhs,pv_rhs) with the now vorticity term trend 206 210 !!---------------------------------------------------------------------- 207 211 INTEGER , INTENT(in ) :: kt ! ocean time-step index 212 INTEGER , INTENT(in ) :: Kmm ! ocean time level index 208 213 INTEGER , INTENT(in ) :: kvor ! total, planetary, relative, or metric 209 214 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu, pv ! now velocities … … 226 231 CASE ( np_RVO ) !* relative vorticity 227 232 DO jk = 1, jpkm1 ! Horizontal slab 228 DO jj = 1, jpjm1 229 DO ji = 1, jpim1 230 zwz(ji,jj,jk) = ( e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk) & 231 & - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj) 232 END DO 233 END DO 233 DO_2D( 1, 0, 1, 0 ) 234 zwz(ji,jj,jk) = ( e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk) & 235 & - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj) 236 END_2D 234 237 IF( ln_dynvor_msk ) THEN ! mask/unmask relative vorticity 235 DO jj = 1, jpjm1 236 DO ji = 1, jpim1 237 zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 238 END DO 239 END DO 238 DO_2D( 1, 0, 1, 0 ) 239 zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 240 END_2D 240 241 ENDIF 241 242 END DO 242 243 243 CALL lbc_lnk( 'dynvor', zwz, 'F', 1. )244 CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 244 245 245 246 CASE ( np_CRV ) !* Coriolis + relative vorticity 246 247 DO jk = 1, jpkm1 ! Horizontal slab 247 DO jj = 1, jpjm1 248 DO ji = 1, jpim1 ! relative vorticity 249 zwz(ji,jj,jk) = ( e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk) & 250 & - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj) 251 END DO 252 END DO 248 DO_2D( 1, 0, 1, 0 ) 249 zwz(ji,jj,jk) = ( e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk) & 250 & - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj) 251 END_2D 253 252 IF( ln_dynvor_msk ) THEN ! mask/unmask relative vorticity 254 DO jj = 1, jpjm1 255 DO ji = 1, jpim1 256 zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 257 END DO 258 END DO 253 DO_2D( 1, 0, 1, 0 ) 254 zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 255 END_2D 259 256 ENDIF 260 257 END DO 261 258 262 CALL lbc_lnk( 'dynvor', zwz, 'F', 1. )259 CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 263 260 264 261 END SELECT … … 270 267 SELECT CASE( kvor ) !== volume weighted vorticity considered ==! 271 268 CASE ( np_COR ) !* Coriolis (planetary vorticity) 272 zwt(:,:) = ff_t(:,:) * e1e2t(:,:)*e3t _n(:,:,jk)269 zwt(:,:) = ff_t(:,:) * e1e2t(:,:)*e3t(:,:,jk,Kmm) 273 270 CASE ( np_RVO ) !* relative vorticity 274 DO jj = 2, jpj 275 DO ji = 2, jpi ! vector opt. 276 zwt(ji,jj) = r1_4 * ( zwz(ji-1,jj ,jk) + zwz(ji,jj ,jk) & 277 & + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) ) * e1e2t(ji,jj)*e3t_n(ji,jj,jk) 278 END DO 279 END DO 271 DO_2D( 0, 1, 0, 1 ) 272 zwt(ji,jj) = r1_4 * ( zwz(ji-1,jj ,jk) + zwz(ji,jj ,jk) & 273 & + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) ) & 274 & * e1e2t(ji,jj)*e3t(ji,jj,jk,Kmm) 275 END_2D 280 276 CASE ( np_MET ) !* metric term 281 DO jj = 2, jpj 282 DO ji = 2, jpi 283 zwt(ji,jj) = ( ( pv(ji,jj,jk) + pv(ji,jj-1,jk) ) * di_e2u_2(ji,jj) & 284 & - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj) ) * e3t_n(ji,jj,jk) 285 END DO 286 END DO 277 DO_2D( 0, 1, 0, 1 ) 278 zwt(ji,jj) = ( ( pv(ji,jj,jk) + pv(ji,jj-1,jk) ) * di_e2u_2(ji,jj) & 279 & - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj) ) & 280 & * e3t(ji,jj,jk,Kmm) 281 END_2D 287 282 CASE ( np_CRV ) !* Coriolis + relative vorticity 288 DO jj = 2, jpj 289 DO ji = 2, jpi ! vector opt. 290 zwt(ji,jj) = ( ff_t(ji,jj) + r1_4 * ( zwz(ji-1,jj ,jk) + zwz(ji,jj ,jk) & 291 & + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) ) ) * e1e2t(ji,jj)*e3t_n(ji,jj,jk) 292 END DO 293 END DO 283 DO_2D( 0, 1, 0, 1 ) 284 zwt(ji,jj) = ( ff_t(ji,jj) + r1_4 * ( zwz(ji-1,jj ,jk) + zwz(ji,jj ,jk) & 285 & + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) ) ) & 286 & * e1e2t(ji,jj)*e3t(ji,jj,jk,Kmm) 287 END_2D 294 288 CASE ( np_CME ) !* Coriolis + metric 295 DO jj = 2, jpj 296 DO ji = 2, jpi ! vector opt. 297 zwt(ji,jj) = ( ff_t(ji,jj) * e1e2t(ji,jj) & 298 & + ( pv(ji,jj,jk) + pv(ji,jj-1,jk) ) * di_e2u_2(ji,jj) & 299 & - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj) ) * e3t_n(ji,jj,jk) 300 END DO 301 END DO 289 DO_2D( 0, 1, 0, 1 ) 290 zwt(ji,jj) = ( ff_t(ji,jj) * e1e2t(ji,jj) & 291 & + ( pv(ji,jj,jk) + pv(ji,jj-1,jk) ) * di_e2u_2(ji,jj) & 292 & - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj) ) & 293 & * e3t(ji,jj,jk,Kmm) 294 END_2D 302 295 CASE DEFAULT ! error 303 296 CALL ctl_stop('STOP','dyn_vor: wrong value for kvor' ) … … 305 298 ! 306 299 ! !== compute and add the vorticity term trend =! 307 DO jj = 2, jpjm1 308 DO ji = 2, jpim1 ! vector opt. 309 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + r1_4 * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) & 310 & * ( zwt(ji+1,jj) * ( pv(ji+1,jj,jk) + pv(ji+1,jj-1,jk) ) & 311 & + zwt(ji ,jj) * ( pv(ji ,jj,jk) + pv(ji ,jj-1,jk) ) ) 312 ! 313 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) & 314 & * ( zwt(ji,jj+1) * ( pu(ji,jj+1,jk) + pu(ji-1,jj+1,jk) ) & 315 & + zwt(ji,jj ) * ( pu(ji,jj ,jk) + pu(ji-1,jj ,jk) ) ) 316 END DO 317 END DO 300 DO_2D( 0, 0, 0, 0 ) 301 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + r1_4 * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm) & 302 & * ( zwt(ji+1,jj) * ( pv(ji+1,jj,jk) + pv(ji+1,jj-1,jk) ) & 303 & + zwt(ji ,jj) * ( pv(ji ,jj,jk) + pv(ji ,jj-1,jk) ) ) 304 ! 305 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm) & 306 & * ( zwt(ji,jj+1) * ( pu(ji,jj+1,jk) + pu(ji-1,jj+1,jk) ) & 307 & + zwt(ji,jj ) * ( pu(ji,jj ,jk) + pu(ji-1,jj ,jk) ) ) 308 END_2D 318 309 ! ! =============== 319 310 END DO ! End of slab … … 322 313 323 314 324 SUBROUTINE vor_ene( kt, kvor, pun, pvn, pua, pva)315 SUBROUTINE vor_ene( kt, Kmm, kvor, pu, pv, pu_rhs, pv_rhs ) 325 316 !!---------------------------------------------------------------------- 326 317 !! *** ROUTINE vor_ene *** … … 334 325 !! The general trend of momentum is increased due to the vorticity 335 326 !! term which is given by: 336 !! voru = 1/e1u mj-1[ (rvor+f)/e3f mi(e1v*e3v vn) ]337 !! vorv = 1/e2v mi-1[ (rvor+f)/e3f mj(e2u*e3u un) ]327 !! voru = 1/e1u mj-1[ (rvor+f)/e3f mi(e1v*e3v pvv(:,:,:,Kmm)) ] 328 !! vorv = 1/e2v mi-1[ (rvor+f)/e3f mj(e2u*e3u puu(:,:,:,Kmm)) ] 338 329 !! where rvor is the relative vorticity 339 330 !! 340 !! ** Action : - Update ( ua,va) with the now vorticity term trend331 !! ** Action : - Update (pu_rhs,pv_rhs) with the now vorticity term trend 341 332 !! 342 333 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 343 334 !!---------------------------------------------------------------------- 344 335 INTEGER , INTENT(in ) :: kt ! ocean time-step index 336 INTEGER , INTENT(in ) :: Kmm ! ocean time level index 345 337 INTEGER , INTENT(in ) :: kvor ! total, planetary, relative, or metric 346 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu n, pvn! now velocities347 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu a, pva! total v-trend338 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu, pv ! now velocities 339 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu_rhs, pv_rhs ! total v-trend 348 340 ! 349 341 INTEGER :: ji, jj, jk ! dummy loop indices … … 366 358 zwz(:,:) = ff_f(:,:) 367 359 CASE ( np_RVO ) !* relative vorticity 368 DO jj = 1, jpjm1 369 DO ji = 1, fs_jpim1 ! vector opt. 370 zwz(ji,jj) = ( e2v(ji+1,jj ) * pvn(ji+1,jj ,jk) - e2v(ji,jj) * pvn(ji,jj,jk) & 371 & - e1u(ji ,jj+1) * pun(ji ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk) ) * r1_e1e2f(ji,jj) 372 END DO 373 END DO 360 DO_2D( 1, 0, 1, 0 ) 361 zwz(ji,jj) = ( e2v(ji+1,jj ) * pv(ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk) & 362 & - e1u(ji ,jj+1) * pu(ji ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj) 363 END_2D 374 364 CASE ( np_MET ) !* metric term 375 DO jj = 1, jpjm1 376 DO ji = 1, fs_jpim1 ! vector opt. 377 zwz(ji,jj) = ( pvn(ji+1,jj ,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 378 & - ( pun(ji ,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 379 END DO 380 END DO 365 DO_2D( 1, 0, 1, 0 ) 366 zwz(ji,jj) = ( pv(ji+1,jj ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 367 & - ( pu(ji ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 368 END_2D 381 369 CASE ( np_CRV ) !* Coriolis + relative vorticity 382 DO jj = 1, jpjm1 383 DO ji = 1, fs_jpim1 ! vector opt. 384 zwz(ji,jj) = ff_f(ji,jj) + ( e2v(ji+1,jj) * pvn(ji+1,jj,jk) - e2v(ji,jj) * pvn(ji,jj,jk) & 385 & - e1u(ji,jj+1) * pun(ji,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk) ) * r1_e1e2f(ji,jj) 386 END DO 387 END DO 370 DO_2D( 1, 0, 1, 0 ) 371 zwz(ji,jj) = ff_f(ji,jj) + ( e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk) & 372 & - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj) 373 END_2D 388 374 CASE ( np_CME ) !* Coriolis + metric 389 DO jj = 1, jpjm1 390 DO ji = 1, fs_jpim1 ! vector opt. 391 zwz(ji,jj) = ff_f(ji,jj) + ( pvn(ji+1,jj ,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 392 & - ( pun(ji ,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 393 END DO 394 END DO 375 DO_2D( 1, 0, 1, 0 ) 376 zwz(ji,jj) = ff_f(ji,jj) + ( pv(ji+1,jj ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 377 & - ( pu(ji ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 378 END_2D 395 379 CASE DEFAULT ! error 396 380 CALL ctl_stop('STOP','dyn_vor: wrong value for kvor' ) … … 398 382 ! 399 383 IF( ln_dynvor_msk ) THEN !== mask/unmask vorticity ==! 400 DO jj = 1, jpjm1 401 DO ji = 1, fs_jpim1 ! vector opt. 402 zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 403 END DO 404 END DO 384 DO_2D( 1, 0, 1, 0 ) 385 zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 386 END_2D 405 387 ENDIF 406 388 407 389 IF( ln_sco ) THEN 408 zwz(:,:) = zwz(:,:) / e3f _n(:,:,jk)409 zwx(:,:) = e2u(:,:) * e3u _n(:,:,jk) * pun(:,:,jk)410 zwy(:,:) = e1v(:,:) * e3v _n(:,:,jk) * pvn(:,:,jk)390 zwz(:,:) = zwz(:,:) / e3f(:,:,jk) 391 zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 392 zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 411 393 ELSE 412 zwx(:,:) = e2u(:,:) * pu n(:,:,jk)413 zwy(:,:) = e1v(:,:) * pv n(:,:,jk)394 zwx(:,:) = e2u(:,:) * pu(:,:,jk) 395 zwy(:,:) = e1v(:,:) * pv(:,:,jk) 414 396 ENDIF 415 397 ! !== compute and add the vorticity term trend =! 416 DO jj = 2, jpjm1 417 DO ji = fs_2, fs_jpim1 ! vector opt. 418 zy1 = zwy(ji,jj-1) + zwy(ji+1,jj-1) 419 zy2 = zwy(ji,jj ) + zwy(ji+1,jj ) 420 zx1 = zwx(ji-1,jj) + zwx(ji-1,jj+1) 421 zx2 = zwx(ji ,jj) + zwx(ji ,jj+1) 422 pua(ji,jj,jk) = pua(ji,jj,jk) + r1_4 * r1_e1u(ji,jj) * ( zwz(ji ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 423 pva(ji,jj,jk) = pva(ji,jj,jk) - r1_4 * r1_e2v(ji,jj) * ( zwz(ji-1,jj ) * zx1 + zwz(ji,jj) * zx2 ) 424 END DO 425 END DO 398 DO_2D( 0, 0, 0, 0 ) 399 zy1 = zwy(ji,jj-1) + zwy(ji+1,jj-1) 400 zy2 = zwy(ji,jj ) + zwy(ji+1,jj ) 401 zx1 = zwx(ji-1,jj) + zwx(ji-1,jj+1) 402 zx2 = zwx(ji ,jj) + zwx(ji ,jj+1) 403 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + r1_4 * r1_e1u(ji,jj) * ( zwz(ji ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 404 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e2v(ji,jj) * ( zwz(ji-1,jj ) * zx1 + zwz(ji,jj) * zx2 ) 405 END_2D 426 406 ! ! =============== 427 407 END DO ! End of slab … … 430 410 431 411 432 SUBROUTINE vor_ens( kt, kvor, pun, pvn, pua, pva)412 SUBROUTINE vor_ens( kt, Kmm, kvor, pu, pv, pu_rhs, pv_rhs ) 433 413 !!---------------------------------------------------------------------- 434 414 !! *** ROUTINE vor_ens *** … … 441 421 !! potential enstrophy of a horizontally non-divergent flow. the 442 422 !! trend of the vorticity term is given by: 443 !! voru = 1/e1u mj-1[ (rvor+f)/e3f ] mj-1[ mi(e1v*e3v vn) ]444 !! vorv = 1/e2v mi-1[ (rvor+f)/e3f ] mi-1[ mj(e2u*e3u un) ]445 !! Add this trend to the general momentum trend (ua,va):446 !! (u a,va) = (ua,va) + ( voru , vorv )447 !! 448 !! ** Action : - Update ( ua,va) arrays with the now vorticity term trend423 !! voru = 1/e1u mj-1[ (rvor+f)/e3f ] mj-1[ mi(e1v*e3v pvv(:,:,:,Kmm)) ] 424 !! vorv = 1/e2v mi-1[ (rvor+f)/e3f ] mi-1[ mj(e2u*e3u puu(:,:,:,Kmm)) ] 425 !! Add this trend to the general momentum trend: 426 !! (u(rhs),v(Krhs)) = (u(rhs),v(Krhs)) + ( voru , vorv ) 427 !! 428 !! ** Action : - Update (pu_rhs,pv_rhs)) arrays with the now vorticity term trend 449 429 !! 450 430 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 451 431 !!---------------------------------------------------------------------- 452 432 INTEGER , INTENT(in ) :: kt ! ocean time-step index 433 INTEGER , INTENT(in ) :: Kmm ! ocean time level index 453 434 INTEGER , INTENT(in ) :: kvor ! total, planetary, relative, or metric 454 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu n, pvn! now velocities455 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu a, pva! total v-trend435 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu, pv ! now velocities 436 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu_rhs, pv_rhs ! total v-trend 456 437 ! 457 438 INTEGER :: ji, jj, jk ! dummy loop indices … … 473 454 zwz(:,:) = ff_f(:,:) 474 455 CASE ( np_RVO ) !* relative vorticity 475 DO jj = 1, jpjm1 476 DO ji = 1, fs_jpim1 ! vector opt. 477 zwz(ji,jj) = ( e2v(ji+1,jj ) * pvn(ji+1,jj ,jk) - e2v(ji,jj) * pvn(ji,jj,jk) & 478 & - e1u(ji ,jj+1) * pun(ji ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk) ) * r1_e1e2f(ji,jj) 479 END DO 480 END DO 456 DO_2D( 1, 0, 1, 0 ) 457 zwz(ji,jj) = ( e2v(ji+1,jj ) * pv(ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk) & 458 & - e1u(ji ,jj+1) * pu(ji ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj) 459 END_2D 481 460 CASE ( np_MET ) !* metric term 482 DO jj = 1, jpjm1 483 DO ji = 1, fs_jpim1 ! vector opt. 484 zwz(ji,jj) = ( pvn(ji+1,jj ,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 485 & - ( pun(ji ,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 486 END DO 487 END DO 461 DO_2D( 1, 0, 1, 0 ) 462 zwz(ji,jj) = ( pv(ji+1,jj ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 463 & - ( pu(ji ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 464 END_2D 488 465 CASE ( np_CRV ) !* Coriolis + relative vorticity 489 DO jj = 1, jpjm1 490 DO ji = 1, fs_jpim1 ! vector opt. 491 zwz(ji,jj) = ff_f(ji,jj) + ( e2v(ji+1,jj ) * pvn(ji+1,jj ,jk) - e2v(ji,jj) * pvn(ji,jj,jk) & 492 & - e1u(ji ,jj+1) * pun(ji ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk) ) * r1_e1e2f(ji,jj) 493 END DO 494 END DO 466 DO_2D( 1, 0, 1, 0 ) 467 zwz(ji,jj) = ff_f(ji,jj) + ( e2v(ji+1,jj ) * pv(ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk) & 468 & - e1u(ji ,jj+1) * pu(ji ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj) 469 END_2D 495 470 CASE ( np_CME ) !* Coriolis + metric 496 DO jj = 1, jpjm1 497 DO ji = 1, fs_jpim1 ! vector opt. 498 zwz(ji,jj) = ff_f(ji,jj) + ( pvn(ji+1,jj ,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 499 & - ( pun(ji ,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 500 END DO 501 END DO 471 DO_2D( 1, 0, 1, 0 ) 472 zwz(ji,jj) = ff_f(ji,jj) + ( pv(ji+1,jj ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 473 & - ( pu(ji ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 474 END_2D 502 475 CASE DEFAULT ! error 503 476 CALL ctl_stop('STOP','dyn_vor: wrong value for kvor' ) … … 505 478 ! 506 479 IF( ln_dynvor_msk ) THEN !== mask/unmask vorticity ==! 507 DO jj = 1, jpjm1 508 DO ji = 1, fs_jpim1 ! vector opt. 509 zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 510 END DO 511 END DO 480 DO_2D( 1, 0, 1, 0 ) 481 zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 482 END_2D 512 483 ENDIF 513 484 ! 514 485 IF( ln_sco ) THEN !== horizontal fluxes ==! 515 zwz(:,:) = zwz(:,:) / e3f _n(:,:,jk)516 zwx(:,:) = e2u(:,:) * e3u _n(:,:,jk) * pun(:,:,jk)517 zwy(:,:) = e1v(:,:) * e3v _n(:,:,jk) * pvn(:,:,jk)486 zwz(:,:) = zwz(:,:) / e3f(:,:,jk) 487 zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 488 zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 518 489 ELSE 519 zwx(:,:) = e2u(:,:) * pu n(:,:,jk)520 zwy(:,:) = e1v(:,:) * pv n(:,:,jk)490 zwx(:,:) = e2u(:,:) * pu(:,:,jk) 491 zwy(:,:) = e1v(:,:) * pv(:,:,jk) 521 492 ENDIF 522 493 ! !== compute and add the vorticity term trend =! 523 DO jj = 2, jpjm1 524 DO ji = fs_2, fs_jpim1 ! vector opt. 525 zuav = r1_8 * r1_e1u(ji,jj) * ( zwy(ji ,jj-1) + zwy(ji+1,jj-1) & 526 & + zwy(ji ,jj ) + zwy(ji+1,jj ) ) 527 zvau =-r1_8 * r1_e2v(ji,jj) * ( zwx(ji-1,jj ) + zwx(ji-1,jj+1) & 528 & + zwx(ji ,jj ) + zwx(ji ,jj+1) ) 529 pua(ji,jj,jk) = pua(ji,jj,jk) + zuav * ( zwz(ji ,jj-1) + zwz(ji,jj) ) 530 pva(ji,jj,jk) = pva(ji,jj,jk) + zvau * ( zwz(ji-1,jj ) + zwz(ji,jj) ) 531 END DO 532 END DO 494 DO_2D( 0, 0, 0, 0 ) 495 zuav = r1_8 * r1_e1u(ji,jj) * ( zwy(ji ,jj-1) + zwy(ji+1,jj-1) & 496 & + zwy(ji ,jj ) + zwy(ji+1,jj ) ) 497 zvau =-r1_8 * r1_e2v(ji,jj) * ( zwx(ji-1,jj ) + zwx(ji-1,jj+1) & 498 & + zwx(ji ,jj ) + zwx(ji ,jj+1) ) 499 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zuav * ( zwz(ji ,jj-1) + zwz(ji,jj) ) 500 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zvau * ( zwz(ji-1,jj ) + zwz(ji,jj) ) 501 END_2D 533 502 ! ! =============== 534 503 END DO ! End of slab … … 537 506 538 507 539 SUBROUTINE vor_een( kt, kvor, pun, pvn, pua, pva)508 SUBROUTINE vor_een( kt, Kmm, kvor, pu, pv, pu_rhs, pv_rhs ) 540 509 !!---------------------------------------------------------------------- 541 510 !! *** ROUTINE vor_een *** … … 548 517 !! both the horizontal kinetic energy and the potential enstrophy 549 518 !! when horizontal divergence is zero (see the NEMO documentation) 550 !! Add this trend to the general momentum trend ( ua,va).551 !! 552 !! ** Action : - Update ( ua,va) with the now vorticity term trend519 !! Add this trend to the general momentum trend (pu_rhs,pv_rhs). 520 !! 521 !! ** Action : - Update (pu_rhs,pv_rhs) with the now vorticity term trend 553 522 !! 554 523 !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 555 524 !!---------------------------------------------------------------------- 556 525 INTEGER , INTENT(in ) :: kt ! ocean time-step index 526 INTEGER , INTENT(in ) :: Kmm ! ocean time level index 557 527 INTEGER , INTENT(in ) :: kvor ! total, planetary, relative, or metric 558 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu n, pvn! now velocities559 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu a, pva! total v-trend528 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu, pv ! now velocities 529 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu_rhs, pv_rhs ! total v-trend 560 530 ! 561 531 INTEGER :: ji, jj, jk ! dummy loop indices … … 580 550 SELECT CASE( nn_een_e3f ) ! == reciprocal of e3 at F-point 581 551 CASE ( 0 ) ! original formulation (masked averaging of e3t divided by 4) 582 DO jj = 1, jpjm1583 DO ji = 1, fs_jpim1 ! vector opt.584 ze3f = ( e3t_n(ji,jj+1,jk)*tmask(ji,jj+1,jk) + e3t_n(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk) &585 & + e3t_n(ji,jj ,jk)*tmask(ji,jj ,jk) + e3t_n(ji+1,jj ,jk)*tmask(ji+1,jj ,jk) )586 IF( ze3f /= 0._wp ) THEN ; z1_e3f(ji,jj) = 4._wp / ze3f587 ELSE ; z1_e3f(ji,jj) = 0._wp588 ENDIF589 END DO590 END DO552 DO_2D( 1, 0, 1, 0 ) 553 ze3f = ( e3t(ji ,jj+1,jk,Kmm)*tmask(ji ,jj+1,jk) & 554 & + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) & 555 & + e3t(ji ,jj ,jk,Kmm)*tmask(ji ,jj ,jk) & 556 & + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk) ) 557 IF( ze3f /= 0._wp ) THEN ; z1_e3f(ji,jj) = 4._wp / ze3f 558 ELSE ; z1_e3f(ji,jj) = 0._wp 559 ENDIF 560 END_2D 591 561 CASE ( 1 ) ! new formulation (masked averaging of e3t divided by the sum of mask) 592 DO jj = 1, jpjm1593 DO ji = 1, fs_jpim1 ! vector opt.594 ze3f = ( e3t_n(ji,jj+1,jk)*tmask(ji,jj+1,jk) + e3t_n(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk) &595 & + e3t_n(ji,jj ,jk)*tmask(ji,jj ,jk) + e3t_n(ji+1,jj ,jk)*tmask(ji+1,jj ,jk) )596 zmsk = ( tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) &597 & + tmask(ji,jj ,jk) + tmask(ji+1,jj ,jk) )598 IF( ze3f /= 0._wp ) THEN ; z1_e3f(ji,jj) = zmsk / ze3f599 ELSE ; z1_e3f(ji,jj) = 0._wp600 ENDIF601 END DO602 END DO562 DO_2D( 1, 0, 1, 0 ) 563 ze3f = ( e3t(ji ,jj+1,jk,Kmm)*tmask(ji ,jj+1,jk) & 564 & + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) & 565 & + e3t(ji ,jj ,jk,Kmm)*tmask(ji ,jj ,jk) & 566 & + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk) ) 567 zmsk = ( tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) & 568 & + tmask(ji,jj ,jk) + tmask(ji+1,jj ,jk) ) 569 IF( ze3f /= 0._wp ) THEN ; z1_e3f(ji,jj) = zmsk / ze3f 570 ELSE ; z1_e3f(ji,jj) = 0._wp 571 ENDIF 572 END_2D 603 573 END SELECT 604 574 ! 605 575 SELECT CASE( kvor ) !== vorticity considered ==! 606 576 CASE ( np_COR ) !* Coriolis (planetary vorticity) 607 DO jj = 1, jpjm1 608 DO ji = 1, fs_jpim1 ! vector opt. 609 zwz(ji,jj,jk) = ff_f(ji,jj) * z1_e3f(ji,jj) 610 END DO 611 END DO 577 DO_2D( 1, 0, 1, 0 ) 578 zwz(ji,jj,jk) = ff_f(ji,jj) * z1_e3f(ji,jj) 579 END_2D 612 580 CASE ( np_RVO ) !* relative vorticity 613 DO jj = 1, jpjm1 614 DO ji = 1, fs_jpim1 ! vector opt. 615 zwz(ji,jj,jk) = ( e2v(ji+1,jj ) * pvn(ji+1,jj,jk) - e2v(ji,jj) * pvn(ji,jj,jk) & 616 & - e1u(ji ,jj+1) * pun(ji,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk) ) * r1_e1e2f(ji,jj)*z1_e3f(ji,jj) 617 END DO 618 END DO 581 DO_2D( 1, 0, 1, 0 ) 582 zwz(ji,jj,jk) = ( e2v(ji+1,jj ) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk) & 583 & - e1u(ji ,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj)*z1_e3f(ji,jj) 584 END_2D 619 585 CASE ( np_MET ) !* metric term 620 DO jj = 1, jpjm1 621 DO ji = 1, fs_jpim1 ! vector opt. 622 zwz(ji,jj,jk) = ( ( pvn(ji+1,jj,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 623 & - ( pun(ji,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) ) * z1_e3f(ji,jj) 624 END DO 625 END DO 586 DO_2D( 1, 0, 1, 0 ) 587 zwz(ji,jj,jk) = ( ( pv(ji+1,jj,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 588 & - ( pu(ji,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) ) * z1_e3f(ji,jj) 589 END_2D 626 590 CASE ( np_CRV ) !* Coriolis + relative vorticity 627 DO jj = 1, jpjm1 628 DO ji = 1, fs_jpim1 ! vector opt. 629 zwz(ji,jj,jk) = ( ff_f(ji,jj) + ( e2v(ji+1,jj ) * pvn(ji+1,jj,jk) - e2v(ji,jj) * pvn(ji,jj,jk) & 630 & - e1u(ji ,jj+1) * pun(ji,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk) ) & 631 & * r1_e1e2f(ji,jj) ) * z1_e3f(ji,jj) 632 END DO 633 END DO 591 DO_2D( 1, 0, 1, 0 ) 592 zwz(ji,jj,jk) = ( ff_f(ji,jj) + ( e2v(ji+1,jj ) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk) & 593 & - e1u(ji ,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) & 594 & * r1_e1e2f(ji,jj) ) * z1_e3f(ji,jj) 595 END_2D 634 596 CASE ( np_CME ) !* Coriolis + metric 635 DO jj = 1, jpjm1 636 DO ji = 1, fs_jpim1 ! vector opt. 637 zwz(ji,jj,jk) = ( ff_f(ji,jj) + ( pvn(ji+1,jj ,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 638 & - ( pun(ji ,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) ) * z1_e3f(ji,jj) 639 END DO 640 END DO 597 DO_2D( 1, 0, 1, 0 ) 598 zwz(ji,jj,jk) = ( ff_f(ji,jj) + ( pv(ji+1,jj ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 599 & - ( pu(ji ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) ) * z1_e3f(ji,jj) 600 END_2D 641 601 CASE DEFAULT ! error 642 602 CALL ctl_stop('STOP','dyn_vor: wrong value for kvor' ) … … 644 604 ! 645 605 IF( ln_dynvor_msk ) THEN !== mask/unmask vorticity ==! 646 DO jj = 1, jpjm1 647 DO ji = 1, fs_jpim1 ! vector opt. 648 zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 649 END DO 650 END DO 606 DO_2D( 1, 0, 1, 0 ) 607 zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 608 END_2D 651 609 ENDIF 652 610 END DO ! End of slab 653 611 ! 654 CALL lbc_lnk( 'dynvor', zwz, 'F', 1. )612 CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 655 613 656 614 DO jk = 1, jpkm1 ! Horizontal slab 657 615 ! 658 616 ! !== horizontal fluxes ==! 659 zwx(:,:) = e2u(:,:) * e3u _n(:,:,jk) * pun(:,:,jk)660 zwy(:,:) = e1v(:,:) * e3v _n(:,:,jk) * pvn(:,:,jk)617 zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 618 zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 661 619 662 620 ! !== compute and add the vorticity term trend =! … … 670 628 END DO 671 629 DO jj = 3, jpj 672 DO ji = fs_2, jpi ! vector opt. ok because we start at jj = 3630 DO ji = 2, jpi ! vector opt. ok because we start at jj = 3 673 631 ztne(ji,jj) = zwz(ji-1,jj ,jk) + zwz(ji ,jj ,jk) + zwz(ji ,jj-1,jk) 674 632 ztnw(ji,jj) = zwz(ji-1,jj-1,jk) + zwz(ji-1,jj ,jk) + zwz(ji ,jj ,jk) … … 677 635 END DO 678 636 END DO 679 DO jj = 2, jpjm1 680 DO ji = fs_2, fs_jpim1 ! vector opt. 681 zua = + r1_12 * r1_e1u(ji,jj) * ( ztne(ji,jj ) * zwy(ji ,jj ) + ztnw(ji+1,jj) * zwy(ji+1,jj ) & 682 & + ztse(ji,jj ) * zwy(ji ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 683 zva = - r1_12 * r1_e2v(ji,jj) * ( ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji ,jj+1) & 684 & + ztnw(ji,jj ) * zwx(ji-1,jj ) + ztne(ji,jj ) * zwx(ji ,jj ) ) 685 pua(ji,jj,jk) = pua(ji,jj,jk) + zua 686 pva(ji,jj,jk) = pva(ji,jj,jk) + zva 687 END DO 688 END DO 637 DO_2D( 0, 0, 0, 0 ) 638 zua = + r1_12 * r1_e1u(ji,jj) * ( ztne(ji,jj ) * zwy(ji ,jj ) + ztnw(ji+1,jj) * zwy(ji+1,jj ) & 639 & + ztse(ji,jj ) * zwy(ji ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 640 zva = - r1_12 * r1_e2v(ji,jj) * ( ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji ,jj+1) & 641 & + ztnw(ji,jj ) * zwx(ji-1,jj ) + ztne(ji,jj ) * zwx(ji ,jj ) ) 642 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zua 643 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zva 644 END_2D 689 645 ! ! =============== 690 646 END DO ! End of slab … … 694 650 695 651 696 SUBROUTINE vor_eeT( kt, kvor, pun, pvn, pua, pva)652 SUBROUTINE vor_eeT( kt, Kmm, kvor, pu, pv, pu_rhs, pv_rhs ) 697 653 !!---------------------------------------------------------------------- 698 654 !! *** ROUTINE vor_eeT *** … … 705 661 !! a modified version of Arakawa and Lamb (1980) scheme (see vor_een). 706 662 !! The change consists in 707 !! Add this trend to the general momentum trend ( ua,va).708 !! 709 !! ** Action : - Update ( ua,va) with the now vorticity term trend663 !! Add this trend to the general momentum trend (pu_rhs,pv_rhs). 664 !! 665 !! ** Action : - Update (pu_rhs,pv_rhs) with the now vorticity term trend 710 666 !! 711 667 !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 712 668 !!---------------------------------------------------------------------- 713 669 INTEGER , INTENT(in ) :: kt ! ocean time-step index 670 INTEGER , INTENT(in ) :: Kmm ! ocean time level index 714 671 INTEGER , INTENT(in ) :: kvor ! total, planetary, relative, or metric 715 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu n, pvn! now velocities716 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu a, pva! total v-trend672 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu, pv ! now velocities 673 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu_rhs, pv_rhs ! total v-trend 717 674 ! 718 675 INTEGER :: ji, jj, jk ! dummy loop indices … … 738 695 SELECT CASE( kvor ) !== vorticity considered ==! 739 696 CASE ( np_COR ) !* Coriolis (planetary vorticity) 740 DO jj = 1, jpjm1 741 DO ji = 1, fs_jpim1 ! vector opt. 742 zwz(ji,jj,jk) = ff_f(ji,jj) 743 END DO 744 END DO 697 DO_2D( 1, 0, 1, 0 ) 698 zwz(ji,jj,jk) = ff_f(ji,jj) 699 END_2D 745 700 CASE ( np_RVO ) !* relative vorticity 746 DO jj = 1, jpjm1 747 DO ji = 1, fs_jpim1 ! vector opt. 748 zwz(ji,jj,jk) = ( e2v(ji+1,jj ) * pvn(ji+1,jj ,jk) - e2v(ji,jj) * pvn(ji,jj,jk) & 749 & - e1u(ji ,jj+1) * pun(ji ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk) ) & 750 & * r1_e1e2f(ji,jj) 751 END DO 752 END DO 701 DO_2D( 1, 0, 1, 0 ) 702 zwz(ji,jj,jk) = ( e2v(ji+1,jj ) * pv(ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk) & 703 & - e1u(ji ,jj+1) * pu(ji ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) & 704 & * r1_e1e2f(ji,jj) 705 END_2D 753 706 CASE ( np_MET ) !* metric term 754 DO jj = 1, jpjm1 755 DO ji = 1, fs_jpim1 ! vector opt. 756 zwz(ji,jj,jk) = ( pvn(ji+1,jj ,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 757 & - ( pun(ji ,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 758 END DO 759 END DO 707 DO_2D( 1, 0, 1, 0 ) 708 zwz(ji,jj,jk) = ( pv(ji+1,jj ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 709 & - ( pu(ji ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 710 END_2D 760 711 CASE ( np_CRV ) !* Coriolis + relative vorticity 761 DO jj = 1, jpjm1 762 DO ji = 1, fs_jpim1 ! vector opt. 763 zwz(ji,jj,jk) = ( ff_f(ji,jj) + ( e2v(ji+1,jj ) * pvn(ji+1,jj ,jk) - e2v(ji,jj) * pvn(ji,jj,jk) & 764 & - e1u(ji ,jj+1) * pun(ji ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk) ) & 765 & * r1_e1e2f(ji,jj) ) 766 END DO 767 END DO 712 DO_2D( 1, 0, 1, 0 ) 713 zwz(ji,jj,jk) = ( ff_f(ji,jj) + ( e2v(ji+1,jj ) * pv(ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk) & 714 & - e1u(ji ,jj+1) * pu(ji ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) & 715 & * r1_e1e2f(ji,jj) ) 716 END_2D 768 717 CASE ( np_CME ) !* Coriolis + metric 769 DO jj = 1, jpjm1 770 DO ji = 1, fs_jpim1 ! vector opt. 771 zwz(ji,jj,jk) = ff_f(ji,jj) + ( pvn(ji+1,jj ,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 772 & - ( pun(ji ,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 773 END DO 774 END DO 718 DO_2D( 1, 0, 1, 0 ) 719 zwz(ji,jj,jk) = ff_f(ji,jj) + ( pv(ji+1,jj ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) & 720 & - ( pu(ji ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 721 END_2D 775 722 CASE DEFAULT ! error 776 723 CALL ctl_stop('STOP','dyn_vor: wrong value for kvor' ) … … 778 725 ! 779 726 IF( ln_dynvor_msk ) THEN !== mask/unmask vorticity ==! 780 DO jj = 1, jpjm1 781 DO ji = 1, fs_jpim1 ! vector opt. 782 zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 783 END DO 784 END DO 727 DO_2D( 1, 0, 1, 0 ) 728 zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 729 END_2D 785 730 ENDIF 786 731 END DO 787 732 ! 788 CALL lbc_lnk( 'dynvor', zwz, 'F', 1. )733 CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 789 734 ! 790 735 DO jk = 1, jpkm1 ! Horizontal slab 791 736 792 737 ! !== horizontal fluxes ==! 793 zwx(:,:) = e2u(:,:) * e3u _n(:,:,jk) * pun(:,:,jk)794 zwy(:,:) = e1v(:,:) * e3v _n(:,:,jk) * pvn(:,:,jk)738 zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 739 zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 795 740 796 741 ! !== compute and add the vorticity term trend =! … … 798 743 ztne(1,:) = 0 ; ztnw(1,:) = 0 ; ztse(1,:) = 0 ; ztsw(1,:) = 0 799 744 DO ji = 2, jpi ! split in 2 parts due to vector opt. 800 z1_e3t = 1._wp / e3t _n(ji,jj,jk)745 z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 801 746 ztne(ji,jj) = ( zwz(ji-1,jj ,jk) + zwz(ji ,jj ,jk) + zwz(ji ,jj-1,jk) ) * z1_e3t 802 747 ztnw(ji,jj) = ( zwz(ji-1,jj-1,jk) + zwz(ji-1,jj ,jk) + zwz(ji ,jj ,jk) ) * z1_e3t … … 805 750 END DO 806 751 DO jj = 3, jpj 807 DO ji = fs_2, jpi ! vector opt. ok because we start at jj = 3808 z1_e3t = 1._wp / e3t _n(ji,jj,jk)752 DO ji = 2, jpi ! vector opt. ok because we start at jj = 3 753 z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 809 754 ztne(ji,jj) = ( zwz(ji-1,jj ,jk) + zwz(ji ,jj ,jk) + zwz(ji ,jj-1,jk) ) * z1_e3t 810 755 ztnw(ji,jj) = ( zwz(ji-1,jj-1,jk) + zwz(ji-1,jj ,jk) + zwz(ji ,jj ,jk) ) * z1_e3t … … 813 758 END DO 814 759 END DO 815 DO jj = 2, jpjm1 816 DO ji = fs_2, fs_jpim1 ! vector opt. 817 zua = + r1_12 * r1_e1u(ji,jj) * ( ztne(ji,jj ) * zwy(ji ,jj ) + ztnw(ji+1,jj) * zwy(ji+1,jj ) & 818 & + ztse(ji,jj ) * zwy(ji ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 819 zva = - r1_12 * r1_e2v(ji,jj) * ( ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji ,jj+1) & 820 & + ztnw(ji,jj ) * zwx(ji-1,jj ) + ztne(ji,jj ) * zwx(ji ,jj ) ) 821 pua(ji,jj,jk) = pua(ji,jj,jk) + zua 822 pva(ji,jj,jk) = pva(ji,jj,jk) + zva 823 END DO 824 END DO 760 DO_2D( 0, 0, 0, 0 ) 761 zua = + r1_12 * r1_e1u(ji,jj) * ( ztne(ji,jj ) * zwy(ji ,jj ) + ztnw(ji+1,jj) * zwy(ji+1,jj ) & 762 & + ztse(ji,jj ) * zwy(ji ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 763 zva = - r1_12 * r1_e2v(ji,jj) * ( ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji ,jj+1) & 764 & + ztnw(ji,jj ) * zwx(ji-1,jj ) + ztne(ji,jj ) * zwx(ji ,jj ) ) 765 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zua 766 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zva 767 END_2D 825 768 ! ! =============== 826 769 END DO ! End of slab … … 849 792 ENDIF 850 793 ! 851 REWIND( numnam_ref ) ! Namelist namdyn_vor in reference namelist : Vorticity scheme options852 794 READ ( numnam_ref, namdyn_vor, IOSTAT = ios, ERR = 901) 853 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_vor in reference namelist', lwp ) 854 REWIND( numnam_cfg ) ! Namelist namdyn_vor in configuration namelist : Vorticity scheme options 795 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdyn_vor in reference namelist' ) 855 796 READ ( numnam_cfg, namdyn_vor, IOSTAT = ios, ERR = 902 ) 856 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namdyn_vor in configuration namelist' , lwp)797 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namdyn_vor in configuration namelist' ) 857 798 IF(lwm) WRITE ( numond, namdyn_vor ) 858 799 ! … … 877 818 IF(lwp) WRITE(numout,*) ' change fmask value in the angles (T) ln_vorlat = ', ln_vorlat 878 819 IF( ln_vorlat .AND. ( ln_dynvor_ene .OR. ln_dynvor_ens .OR. ln_dynvor_mix ) ) THEN 879 DO jk = 1, jpk 880 DO jj = 1, jpjm1 881 DO ji = 1, jpim1 882 IF( tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) & 883 & + tmask(ji,jj ,jk) + tmask(ji+1,jj+1,jk) == 3._wp ) fmask(ji,jj,jk) = 1._wp 884 END DO 885 END DO 886 END DO 820 DO_3D( 1, 0, 1, 0, 1, jpk ) 821 IF( tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) & 822 & + tmask(ji,jj ,jk) + tmask(ji+1,jj ,jk) == 3._wp ) fmask(ji,jj,jk) = 1._wp 823 END_3D 887 824 ! 888 825 CALL lbc_lnk( 'dynvor', fmask, 'F', 1._wp ) ! Lateral boundary conditions on fmask … … 920 857 CASE( np_ENT ) !* T-point metric term : pre-compute di(e2u)/2 and dj(e1v)/2 921 858 ALLOCATE( di_e2u_2(jpi,jpj), dj_e1v_2(jpi,jpj) ) 922 DO jj = 2, jpjm1 923 DO ji = 2, jpim1 924 di_e2u_2(ji,jj) = ( e2u(ji,jj) - e2u(ji-1,jj ) ) * 0.5_wp 925 dj_e1v_2(ji,jj) = ( e1v(ji,jj) - e1v(ji ,jj-1) ) * 0.5_wp 926 END DO 927 END DO 928 CALL lbc_lnk_multi( 'dynvor', di_e2u_2, 'T', -1. , dj_e1v_2, 'T', -1. ) ! Lateral boundary conditions 859 DO_2D( 0, 0, 0, 0 ) 860 di_e2u_2(ji,jj) = ( e2u(ji,jj) - e2u(ji-1,jj ) ) * 0.5_wp 861 dj_e1v_2(ji,jj) = ( e1v(ji,jj) - e1v(ji ,jj-1) ) * 0.5_wp 862 END_2D 863 CALL lbc_lnk_multi( 'dynvor', di_e2u_2, 'T', -1.0_wp , dj_e1v_2, 'T', -1.0_wp ) ! Lateral boundary conditions 929 864 ! 930 865 CASE DEFAULT !* F-point metric term : pre-compute di(e2u)/(2*e1e2f) and dj(e1v)/(2*e1e2f) 931 866 ALLOCATE( di_e2v_2e1e2f(jpi,jpj), dj_e1u_2e1e2f(jpi,jpj) ) 932 DO jj = 1, jpjm1 933 DO ji = 1, jpim1 934 di_e2v_2e1e2f(ji,jj) = ( e2v(ji+1,jj ) - e2v(ji,jj) ) * 0.5 * r1_e1e2f(ji,jj) 935 dj_e1u_2e1e2f(ji,jj) = ( e1u(ji ,jj+1) - e1u(ji,jj) ) * 0.5 * r1_e1e2f(ji,jj) 936 END DO 937 END DO 938 CALL lbc_lnk_multi( 'dynvor', di_e2v_2e1e2f, 'F', -1. , dj_e1u_2e1e2f, 'F', -1. ) ! Lateral boundary conditions 867 DO_2D( 1, 0, 1, 0 ) 868 di_e2v_2e1e2f(ji,jj) = ( e2v(ji+1,jj ) - e2v(ji,jj) ) * 0.5 * r1_e1e2f(ji,jj) 869 dj_e1u_2e1e2f(ji,jj) = ( e1u(ji ,jj+1) - e1u(ji,jj) ) * 0.5 * r1_e1e2f(ji,jj) 870 END_2D 871 CALL lbc_lnk_multi( 'dynvor', di_e2v_2e1e2f, 'F', -1.0_wp , dj_e1u_2e1e2f, 'F', -1.0_wp ) ! Lateral boundary conditions 939 872 END SELECT 940 873 ! -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynzad.F90
r10068 r13463 28 28 29 29 !! * Substitutions 30 # include "vectopt_loop_substitute.h90" 30 # include "do_loop_substitute.h90" 31 # include "domzgr_substitute.h90" 31 32 !!---------------------------------------------------------------------- 32 33 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 36 37 CONTAINS 37 38 38 SUBROUTINE dyn_zad ( kt )39 SUBROUTINE dyn_zad ( kt, Kmm, puu, pvv, Krhs ) 39 40 !!---------------------------------------------------------------------- 40 41 !! *** ROUTINE dynzad *** … … 44 45 !! 45 46 !! ** Method : The now vertical advection of momentum is given by: 46 !! w dz(u) = u a + 1/(e1e2u*e3u) mk+1[ mi(e1e2t*wn) dk(un) ]47 !! w dz(v) = v a + 1/(e1e2v*e3v) mk+1[ mj(e1e2t*wn) dk(vn) ]48 !! Add this trend to the general trend ( ua,va):49 !! (u a,va) = (ua,va) + w dz(u,v)47 !! w dz(u) = u(rhs) + 1/(e1e2u*e3u) mk+1[ mi(e1e2t*ww) dk(u) ] 48 !! w dz(v) = v(rhs) + 1/(e1e2v*e3v) mk+1[ mj(e1e2t*ww) dk(v) ] 49 !! Add this trend to the general trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)): 50 !! (u(rhs),v(rhs)) = (u(rhs),v(rhs)) + w dz(u,v) 50 51 !! 51 !! ** Action : - Update ( ua,va) with the vert. momentum adv. trends52 !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the vert. momentum adv. trends 52 53 !! - Send the trends to trddyn for diagnostics (l_trddyn=T) 53 54 !!---------------------------------------------------------------------- 54 INTEGER, INTENT(in) :: kt ! ocean time-step inedx 55 INTEGER , INTENT( in ) :: kt ! ocean time-step inedx 56 INTEGER , INTENT( in ) :: Kmm, Krhs ! ocean time level indices 57 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 55 58 ! 56 59 INTEGER :: ji, jj, jk ! dummy loop indices … … 68 71 ENDIF 69 72 70 IF( l_trddyn ) THEN ! Save ua and vatrends73 IF( l_trddyn ) THEN ! Save puu(:,:,:,Krhs) and pvv(:,:,:,Krhs) trends 71 74 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 72 ztrdu(:,:,:) = ua(:,:,:)73 ztrdv(:,:,:) = va(:,:,:)75 ztrdu(:,:,:) = puu(:,:,:,Krhs) 76 ztrdv(:,:,:) = pvv(:,:,:,Krhs) 74 77 ENDIF 75 78 76 79 DO jk = 2, jpkm1 ! Vertical momentum advection at level w and u- and v- vertical 77 DO jj = 2, jpj ! vertical fluxes 78 DO ji = fs_2, jpi ! vector opt. 79 zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk) 80 END DO 81 END DO 82 DO jj = 2, jpjm1 ! vertical momentum advection at w-point 83 DO ji = fs_2, fs_jpim1 ! vector opt. 84 zwuw(ji,jj,jk) = ( zww(ji+1,jj ) + zww(ji,jj) ) * ( un(ji,jj,jk-1) - un(ji,jj,jk) ) 85 zwvw(ji,jj,jk) = ( zww(ji ,jj+1) + zww(ji,jj) ) * ( vn(ji,jj,jk-1) - vn(ji,jj,jk) ) 86 END DO 87 END DO 80 DO_2D( 0, 1, 0, 1 ) 81 zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk) 82 END_2D 83 DO_2D( 0, 0, 0, 0 ) 84 zwuw(ji,jj,jk) = ( zww(ji+1,jj ) + zww(ji,jj) ) * ( puu(ji,jj,jk-1,Kmm) - puu(ji,jj,jk,Kmm) ) 85 zwvw(ji,jj,jk) = ( zww(ji ,jj+1) + zww(ji,jj) ) * ( pvv(ji,jj,jk-1,Kmm) - pvv(ji,jj,jk,Kmm) ) 86 END_2D 88 87 END DO 89 88 ! 90 89 ! Surface and bottom advective fluxes set to zero 91 DO jj = 2, jpjm1 92 DO ji = fs_2, fs_jpim1 ! vector opt. 93 zwuw(ji,jj, 1 ) = 0._wp 94 zwvw(ji,jj, 1 ) = 0._wp 95 zwuw(ji,jj,jpk) = 0._wp 96 zwvw(ji,jj,jpk) = 0._wp 97 END DO 98 END DO 90 DO_2D( 0, 0, 0, 0 ) 91 zwuw(ji,jj, 1 ) = 0._wp 92 zwvw(ji,jj, 1 ) = 0._wp 93 zwuw(ji,jj,jpk) = 0._wp 94 zwvw(ji,jj,jpk) = 0._wp 95 END_2D 99 96 ! 100 DO jk = 1, jpkm1 ! Vertical momentum advection at u- and v-points 101 DO jj = 2, jpjm1 102 DO ji = fs_2, fs_jpim1 ! vector opt. 103 ua(ji,jj,jk) = ua(ji,jj,jk) - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 104 va(ji,jj,jk) = va(ji,jj,jk) - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 105 END DO 106 END DO 107 END DO 97 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 98 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) & 99 & / e3u(ji,jj,jk,Kmm) 100 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) & 101 & / e3v(ji,jj,jk,Kmm) 102 END_3D 108 103 109 104 IF( l_trddyn ) THEN ! save the vertical advection trends for diagnostic 110 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)111 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)112 CALL trd_dyn( ztrdu, ztrdv, jpdyn_zad, kt )105 ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 106 ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 107 CALL trd_dyn( ztrdu, ztrdv, jpdyn_zad, kt, Kmm ) 113 108 DEALLOCATE( ztrdu, ztrdv ) 114 109 ENDIF 115 110 ! ! Control print 116 IF( ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' zad - Ua: ', mask1=umask, &117 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )111 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' zad - Ua: ', mask1=umask, & 112 & tab3d_2=pvv(:,:,:,Krhs), clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 118 113 ! 119 114 IF( ln_timing ) CALL timing_stop('dyn_zad') -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynzdf.F90
r11281 r13463 37 37 38 38 !! * Substitutions 39 # include "vectopt_loop_substitute.h90" 39 # include "do_loop_substitute.h90" 40 # include "domzgr_substitute.h90" 40 41 !!---------------------------------------------------------------------- 41 42 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 45 46 CONTAINS 46 47 47 SUBROUTINE dyn_zdf( kt )48 SUBROUTINE dyn_zdf( kt, Kbb, Kmm, Krhs, puu, pvv, Kaa ) 48 49 !!---------------------------------------------------------------------- 49 50 !! *** ROUTINE dyn_zdf *** … … 54 55 !! 55 56 !! ** Method : - Leap-Frog time stepping on all trends but the vertical mixing 56 !! u a = ub + 2*dt * uavector form or linear free surf.57 !! u a = ( e3u_b*ub + 2*dt * e3u_n*ua ) / e3u_aotherwise57 !! u(after) = u(before) + 2*dt * u(rhs) vector form or linear free surf. 58 !! u(after) = ( e3u_b*u(before) + 2*dt * e3u_n*u(rhs) ) / e3u_after otherwise 58 59 !! - update the after velocity with the implicit vertical mixing. 59 60 !! This requires to solver the following system: 60 !! u a = ua + 1/e3u_a dk+1[ mi(avm) / e3uw_adk[ua] ]61 !! u(after) = u(after) + 1/e3u_after dk+1[ mi(avm) / e3uw_after dk[ua] ] 61 62 !! with the following surface/top/bottom boundary condition: 62 63 !! surface: wind stress input (averaged over kt-1/2 & kt+1/2) 63 64 !! top & bottom : top stress (iceshelf-ocean) & bottom stress (cf zdfdrg.F90) 64 65 !! 65 !! ** Action : ( ua,va) after velocity66 !! ** Action : (puu(:,:,:,Kaa),pvv(:,:,:,Kaa)) after velocity 66 67 !!--------------------------------------------------------------------- 67 INTEGER, INTENT(in) :: kt ! ocean time-step index 68 INTEGER , INTENT( in ) :: kt ! ocean time-step index 69 INTEGER , INTENT( in ) :: Kbb, Kmm, Krhs, Kaa ! ocean time level indices 70 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 68 71 ! 69 72 INTEGER :: ji, jj, jk ! dummy loop indices … … 90 93 ENDIF 91 94 ENDIF 92 ! !* set time step93 IF( neuler == 0 .AND. kt == nit000 ) THEN ; r2dt = rdt ! = rdt (restart with Euler time stepping)94 ELSEIF( kt <= nit000 + 1 ) THEN ; r2dt = 2. * rdt ! = 2 rdt (leapfrog)95 ENDIF96 !97 95 ! !* explicit top/bottom drag case 98 IF( .NOT.ln_drgimp ) CALL zdf_drg_exp( kt, ub, vb, ua, va ) ! add top/bottom friction trend to (ua,va)96 IF( .NOT.ln_drgimp ) CALL zdf_drg_exp( kt, Kmm, puu(:,:,:,Kbb), pvv(:,:,:,Kbb), puu(:,:,:,Krhs), pvv(:,:,:,Krhs) ) ! add top/bottom friction trend to (puu(Kaa),pvv(Kaa)) 99 97 ! 100 98 ! 101 99 IF( l_trddyn ) THEN !* temporary save of ta and sa trends 102 100 ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) ) 103 ztrdu(:,:,:) = ua(:,:,:)104 ztrdv(:,:,:) = va(:,:,:)105 ENDIF 106 ! 107 ! !== RHS: Leap-Frog time stepping on all trends but the vertical mixing ==! (put in ua,va)101 ztrdu(:,:,:) = puu(:,:,:,Krhs) 102 ztrdv(:,:,:) = pvv(:,:,:,Krhs) 103 ENDIF 104 ! 105 ! !== RHS: Leap-Frog time stepping on all trends but the vertical mixing ==! (put in puu(:,:,:,Kaa),pvv(:,:,:,Kaa)) 108 106 ! 109 107 ! ! time stepping except vertical diffusion 110 108 IF( ln_dynadv_vec .OR. ln_linssh ) THEN ! applied on velocity 111 DO jk = 1, jpkm1112 ua(:,:,jk) = ( ub(:,:,jk) + r2dt * ua(:,:,jk) ) * umask(:,:,jk)113 va(:,:,jk) = ( vb(:,:,jk) + r2dt * va(:,:,jk) ) * vmask(:,:,jk)114 END DO109 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 110 puu(ji,jj,jk,Kaa) = ( puu(ji,jj,jk,Kbb) + rDt * puu(ji,jj,jk,Krhs) ) * umask(ji,jj,jk) 111 pvv(ji,jj,jk,Kaa) = ( pvv(ji,jj,jk,Kbb) + rDt * pvv(ji,jj,jk,Krhs) ) * vmask(ji,jj,jk) 112 END_3D 115 113 ELSE ! applied on thickness weighted velocity 116 DO jk = 1, jpkm1 117 ua(:,:,jk) = ( e3u_b(:,:,jk) * ub(:,:,jk) & 118 & + r2dt * e3u_n(:,:,jk) * ua(:,:,jk) ) / e3u_a(:,:,jk) * umask(:,:,jk) 119 va(:,:,jk) = ( e3v_b(:,:,jk) * vb(:,:,jk) & 120 & + r2dt * e3v_n(:,:,jk) * va(:,:,jk) ) / e3v_a(:,:,jk) * vmask(:,:,jk) 121 END DO 114 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 115 puu(ji,jj,jk,Kaa) = ( e3u(ji,jj,jk,Kbb) * puu(ji,jj,jk,Kbb ) & 116 & + rDt * e3u(ji,jj,jk,Kmm) * puu(ji,jj,jk,Krhs) ) & 117 & / e3u(ji,jj,jk,Kaa) * umask(ji,jj,jk) 118 pvv(ji,jj,jk,Kaa) = ( e3v(ji,jj,jk,Kbb) * pvv(ji,jj,jk,Kbb ) & 119 & + rDt * e3v(ji,jj,jk,Kmm) * pvv(ji,jj,jk,Krhs) ) & 120 & / e3v(ji,jj,jk,Kaa) * vmask(ji,jj,jk) 121 END_3D 122 122 ENDIF 123 123 ! ! add top/bottom friction … … 125 125 ! J. Chanut: The bottom stress is computed considering after barotropic velocities, which does 126 126 ! not lead to the effective stress seen over the whole barotropic loop. 127 ! G. Madec : in linear free surface, e3u _a = e3u_n = e3u_0, so systematic use of e3u_a127 ! G. Madec : in linear free surface, e3u(:,:,:,Kaa) = e3u(:,:,:,Kmm) = e3u_0, so systematic use of e3u(:,:,:,Kaa) 128 128 IF( ln_drgimp .AND. ln_dynspg_ts ) THEN 129 DO jk = 1, jpkm1! remove barotropic velocities130 ua(:,:,jk) = ( ua(:,:,jk) - ua_b(:,:) ) * umask(:,:,jk)131 va(:,:,jk) = ( va(:,:,jk) - va_b(:,:) ) * vmask(:,:,jk)132 END DO133 DO jj = 2, jpjm1 ! Add bottom/top stress due to barotropic component only134 DO ji = fs_2, fs_jpim1 ! vector opt.135 iku = mbku(ji,jj) ! ocean bottom level at u- and v-points136 ikv = mbkv(ji,jj) ! (deepest ocean u- and v-points)137 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku)138 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv)139 ua(ji,jj,iku) = ua(ji,jj,iku) + r2dt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * ua_b(ji,jj) / ze3ua140 va(ji,jj,ikv) = va(ji,jj,ikv) + r2dt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * va_b(ji,jj) / ze3va141 END DO142 END DO129 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! remove barotropic velocities 130 puu(ji,jj,jk,Kaa) = ( puu(ji,jj,jk,Kaa) - uu_b(ji,jj,Kaa) ) * umask(ji,jj,jk) 131 pvv(ji,jj,jk,Kaa) = ( pvv(ji,jj,jk,Kaa) - vv_b(ji,jj,Kaa) ) * vmask(ji,jj,jk) 132 END_3D 133 DO_2D( 0, 0, 0, 0 ) 134 iku = mbku(ji,jj) ! ocean bottom level at u- and v-points 135 ikv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 136 ze3ua = ( 1._wp - r_vvl ) * e3u(ji,jj,iku,Kmm) & 137 & + r_vvl * e3u(ji,jj,iku,Kaa) 138 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,ikv,Kmm) & 139 & + r_vvl * e3v(ji,jj,ikv,Kaa) 140 puu(ji,jj,iku,Kaa) = puu(ji,jj,iku,Kaa) + rDt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * uu_b(ji,jj,Kaa) / ze3ua 141 pvv(ji,jj,ikv,Kaa) = pvv(ji,jj,ikv,Kaa) + rDt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * vv_b(ji,jj,Kaa) / ze3va 142 END_2D 143 143 IF( ln_isfcav ) THEN ! Ocean cavities (ISF) 144 DO jj = 2, jpjm1145 DO ji = fs_2, fs_jpim1 ! vector opt.146 iku = miku(ji,jj) ! top ocean level at u- and v-points147 ikv = mikv(ji,jj) ! (first wet ocean u- and v-points)148 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku)149 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv)150 ua(ji,jj,iku) = ua(ji,jj,iku) + r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * ua_b(ji,jj) / ze3ua151 va(ji,jj,ikv) = va(ji,jj,ikv) + r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * va_b(ji,jj) / ze3va152 END DO153 END DO144 DO_2D( 0, 0, 0, 0 ) 145 iku = miku(ji,jj) ! top ocean level at u- and v-points 146 ikv = mikv(ji,jj) ! (first wet ocean u- and v-points) 147 ze3ua = ( 1._wp - r_vvl ) * e3u(ji,jj,iku,Kmm) & 148 & + r_vvl * e3u(ji,jj,iku,Kaa) 149 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,ikv,Kmm) & 150 & + r_vvl * e3v(ji,jj,ikv,Kaa) 151 puu(ji,jj,iku,Kaa) = puu(ji,jj,iku,Kaa) + rDt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * uu_b(ji,jj,Kaa) / ze3ua 152 pvv(ji,jj,ikv,Kaa) = pvv(ji,jj,ikv,Kaa) + rDt * 0.5*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * vv_b(ji,jj,Kaa) / ze3va 153 END_2D 154 154 END IF 155 155 ENDIF … … 158 158 ! 159 159 ! !* Matrix construction 160 zdt = r 2dt * 0.5160 zdt = rDt * 0.5 161 161 IF( ln_zad_Aimp ) THEN !! 162 162 SELECT CASE( nldf_dyn ) 163 163 CASE( np_lap_i ) ! rotated lateral mixing: add its vertical mixing (akzu) 164 DO jk = 1, jpkm1 165 DO jj = 2, jpjm1 166 DO ji = fs_2, fs_jpim1 ! vector opt. 167 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk) ! after scale factor at U-point 168 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) + akzu(ji,jj,jk ) ) & 169 & / ( ze3ua * e3uw_n(ji,jj,jk ) ) * wumask(ji,jj,jk ) 170 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) ) & 171 & / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 172 zWui = ( wi(ji,jj,jk ) + wi(ji+1,jj,jk ) ) / ze3ua 173 zWus = ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) / ze3ua 174 zwi(ji,jj,jk) = zzwi + zdt * MIN( zWui, 0._wp ) 175 zws(ji,jj,jk) = zzws - zdt * MAX( zWus, 0._wp ) 176 zwd(ji,jj,jk) = 1._wp - zzwi - zzws + zdt * ( MAX( zWui, 0._wp ) - MIN( zWus, 0._wp ) ) 177 END DO 178 END DO 179 END DO 164 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 165 ze3ua = ( 1._wp - r_vvl ) * e3u(ji,jj,jk,Kmm) & 166 & + r_vvl * e3u(ji,jj,jk,Kaa) ! after scale factor at U-point 167 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) + akzu(ji,jj,jk ) ) & 168 & / ( ze3ua * e3uw(ji,jj,jk ,Kmm) ) * wumask(ji,jj,jk ) 169 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) ) & 170 & / ( ze3ua * e3uw(ji,jj,jk+1,Kmm) ) * wumask(ji,jj,jk+1) 171 zWui = ( wi(ji,jj,jk ) + wi(ji+1,jj,jk ) ) / ze3ua 172 zWus = ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) / ze3ua 173 zwi(ji,jj,jk) = zzwi + zdt * MIN( zWui, 0._wp ) 174 zws(ji,jj,jk) = zzws - zdt * MAX( zWus, 0._wp ) 175 zwd(ji,jj,jk) = 1._wp - zzwi - zzws + zdt * ( MAX( zWui, 0._wp ) - MIN( zWus, 0._wp ) ) 176 END_3D 180 177 CASE DEFAULT ! iso-level lateral mixing 181 DO jk = 1, jpkm1 182 DO jj = 2, jpjm1 183 DO ji = fs_2, fs_jpim1 ! vector opt. 184 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk) ! after scale factor at U-point 185 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) ) / ( ze3ua * e3uw_n(ji,jj,jk ) ) * wumask(ji,jj,jk ) 186 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 187 zWui = ( wi(ji,jj,jk ) + wi(ji+1,jj,jk ) ) / ze3ua 188 zWus = ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) / ze3ua 189 zwi(ji,jj,jk) = zzwi + zdt * MIN( zWui, 0._wp ) 190 zws(ji,jj,jk) = zzws - zdt * MAX( zWus, 0._wp ) 191 zwd(ji,jj,jk) = 1._wp - zzwi - zzws + zdt * ( MAX( zWui, 0._wp ) - MIN( zWus, 0._wp ) ) 192 END DO 193 END DO 194 END DO 178 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 179 ze3ua = ( 1._wp - r_vvl ) * e3u(ji,jj,jk,Kmm) & ! after scale factor at U-point 180 & + r_vvl * e3u(ji,jj,jk,Kaa) 181 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) ) & 182 & / ( ze3ua * e3uw(ji,jj,jk ,Kmm) ) * wumask(ji,jj,jk ) 183 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) & 184 & / ( ze3ua * e3uw(ji,jj,jk+1,Kmm) ) * wumask(ji,jj,jk+1) 185 zWui = ( wi(ji,jj,jk ) + wi(ji+1,jj,jk ) ) / ze3ua 186 zWus = ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) / ze3ua 187 zwi(ji,jj,jk) = zzwi + zdt * MIN( zWui, 0._wp ) 188 zws(ji,jj,jk) = zzws - zdt * MAX( zWus, 0._wp ) 189 zwd(ji,jj,jk) = 1._wp - zzwi - zzws + zdt * ( MAX( zWui, 0._wp ) - MIN( zWus, 0._wp ) ) 190 END_3D 195 191 END SELECT 196 DO jj = 2, jpjm1 !* Surface boundary conditions197 DO ji = fs_2, fs_jpim1 ! vector opt.198 zwi(ji,jj,1) = 0._wp199 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,1) + r_vvl * e3u_a(ji,jj,1)200 zzws = - zdt * ( avm(ji+1,jj,2) + avm(ji ,jj,2) ) / ( ze3ua * e3uw_n(ji,jj,2) ) * wumask(ji,jj,2)201 zWus = ( wi(ji ,jj,2) + wi(ji+1,jj,2) ) / ze3ua202 zws(ji,jj,1 ) = zzws - zdt * MAX( zWus, 0._wp )203 zwd(ji,jj,1 ) = 1._wp - zzws - zdt * ( MIN( zWus, 0._wp ))204 END DO205 END DO192 DO_2D( 0, 0, 0, 0 ) 193 zwi(ji,jj,1) = 0._wp 194 ze3ua = ( 1._wp - r_vvl ) * e3u(ji,jj,1,Kmm) & 195 & + r_vvl * e3u(ji,jj,1,Kaa) 196 zzws = - zdt * ( avm(ji+1,jj,2) + avm(ji ,jj,2) ) & 197 & / ( ze3ua * e3uw(ji,jj,2,Kmm) ) * wumask(ji,jj,2) 198 zWus = ( wi(ji ,jj,2) + wi(ji+1,jj,2) ) / ze3ua 199 zws(ji,jj,1 ) = zzws - zdt * MAX( zWus, 0._wp ) 200 zwd(ji,jj,1 ) = 1._wp - zzws - zdt * ( MIN( zWus, 0._wp ) ) 201 END_2D 206 202 ELSE 207 203 SELECT CASE( nldf_dyn ) 208 204 CASE( np_lap_i ) ! rotated lateral mixing: add its vertical mixing (akzu) 209 DO jk = 1, jpkm1 210 DO jj = 2, jpjm1 211 DO ji = fs_2, fs_jpim1 ! vector opt. 212 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk) ! after scale factor at U-point 213 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) + akzu(ji,jj,jk ) ) & 214 & / ( ze3ua * e3uw_n(ji,jj,jk ) ) * wumask(ji,jj,jk ) 215 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) ) & 216 & / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 217 zwi(ji,jj,jk) = zzwi 218 zws(ji,jj,jk) = zzws 219 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 220 END DO 221 END DO 222 END DO 205 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 206 ze3ua = ( 1._wp - r_vvl ) * e3u(ji,jj,jk,Kmm) & 207 & + r_vvl * e3u(ji,jj,jk,Kaa) ! after scale factor at U-point 208 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) + akzu(ji,jj,jk ) ) & 209 & / ( ze3ua * e3uw(ji,jj,jk ,Kmm) ) * wumask(ji,jj,jk ) 210 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) ) & 211 & / ( ze3ua * e3uw(ji,jj,jk+1,Kmm) ) * wumask(ji,jj,jk+1) 212 zwi(ji,jj,jk) = zzwi 213 zws(ji,jj,jk) = zzws 214 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 215 END_3D 223 216 CASE DEFAULT ! iso-level lateral mixing 224 DO jk = 1, jpkm1 225 DO jj = 2, jpjm1 226 DO ji = fs_2, fs_jpim1 ! vector opt. 227 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk) ! after scale factor at U-point 228 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) ) / ( ze3ua * e3uw_n(ji,jj,jk ) ) * wumask(ji,jj,jk ) 229 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 230 zwi(ji,jj,jk) = zzwi 231 zws(ji,jj,jk) = zzws 232 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 233 END DO 234 END DO 235 END DO 217 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 218 ze3ua = ( 1._wp - r_vvl ) * e3u(ji,jj,jk,Kmm) & 219 & + r_vvl * e3u(ji,jj,jk,Kaa) ! after scale factor at U-point 220 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) ) & 221 & / ( ze3ua * e3uw(ji,jj,jk ,Kmm) ) * wumask(ji,jj,jk ) 222 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) & 223 & / ( ze3ua * e3uw(ji,jj,jk+1,Kmm) ) * wumask(ji,jj,jk+1) 224 zwi(ji,jj,jk) = zzwi 225 zws(ji,jj,jk) = zzws 226 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 227 END_3D 236 228 END SELECT 237 DO jj = 2, jpjm1 !* Surface boundary conditions 238 DO ji = fs_2, fs_jpim1 ! vector opt. 239 zwi(ji,jj,1) = 0._wp 240 zwd(ji,jj,1) = 1._wp - zws(ji,jj,1) 241 END DO 242 END DO 229 DO_2D( 0, 0, 0, 0 ) 230 zwi(ji,jj,1) = 0._wp 231 zwd(ji,jj,1) = 1._wp - zws(ji,jj,1) 232 END_2D 243 233 ENDIF 244 234 ! … … 251 241 ! 252 242 IF ( ln_drgimp ) THEN ! implicit bottom friction 253 DO jj = 2, jpjm1 254 DO ji = 2, jpim1 255 iku = mbku(ji,jj) ! ocean bottom level at u- and v-points 256 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku) ! after scale factor at T-point 257 zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) / ze3ua 258 END DO 259 END DO 243 DO_2D( 0, 0, 0, 0 ) 244 iku = mbku(ji,jj) ! ocean bottom level at u- and v-points 245 ze3ua = ( 1._wp - r_vvl ) * e3u(ji,jj,iku,Kmm) & 246 & + r_vvl * e3u(ji,jj,iku,Kaa) ! after scale factor at T-point 247 zwd(ji,jj,iku) = zwd(ji,jj,iku) - rDt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) / ze3ua 248 END_2D 260 249 IF ( ln_isfcav ) THEN ! top friction (always implicit) 261 DO jj = 2, jpjm1 262 DO ji = 2, jpim1 263 !!gm top Cd is masked (=0 outside cavities) no need of test on mik>=2 ==>> it has been suppressed 264 iku = miku(ji,jj) ! ocean top level at u- and v-points 265 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku) ! after scale factor at T-point 266 zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / ze3ua 267 END DO 268 END DO 250 DO_2D( 0, 0, 0, 0 ) 251 !!gm top Cd is masked (=0 outside cavities) no need of test on mik>=2 ==>> it has been suppressed 252 iku = miku(ji,jj) ! ocean top level at u- and v-points 253 ze3ua = ( 1._wp - r_vvl ) * e3u(ji,jj,iku,Kmm) & 254 & + r_vvl * e3u(ji,jj,iku,Kaa) ! after scale factor at T-point 255 zwd(ji,jj,iku) = zwd(ji,jj,iku) - rDt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / ze3ua 256 END_2D 269 257 END IF 270 258 ENDIF … … 282 270 ! m is decomposed in the product of an upper and a lower triangular matrix 283 271 ! The 3 diagonal terms are in 2d arrays: zwd, zws, zwi 284 ! The solution (the after velocity) is in ua272 ! The solution (the after velocity) is in puu(:,:,:,Kaa) 285 273 !----------------------------------------------------------------------- 286 274 ! 287 DO jk = 2, jpkm1 !== First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1 (increasing k) == 288 DO jj = 2, jpjm1 289 DO ji = fs_2, fs_jpim1 ! vector opt. 290 zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1) 291 END DO 292 END DO 293 END DO 294 ! 295 DO jj = 2, jpjm1 !== second recurrence: SOLk = RHSk - Lk / Dk-1 Lk-1 ==! 296 DO ji = fs_2, fs_jpim1 ! vector opt. 297 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,1) + r_vvl * e3u_a(ji,jj,1) 298 ua(ji,jj,1) = ua(ji,jj,1) + r2dt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) ) & 299 & / ( ze3ua * rau0 ) * umask(ji,jj,1) 300 END DO 301 END DO 302 DO jk = 2, jpkm1 303 DO jj = 2, jpjm1 304 DO ji = fs_2, fs_jpim1 305 ua(ji,jj,jk) = ua(ji,jj,jk) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua(ji,jj,jk-1) 306 END DO 307 END DO 308 END DO 309 ! 310 DO jj = 2, jpjm1 !== thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk ==! 311 DO ji = fs_2, fs_jpim1 ! vector opt. 312 ua(ji,jj,jpkm1) = ua(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) 313 END DO 314 END DO 315 DO jk = jpk-2, 1, -1 316 DO jj = 2, jpjm1 317 DO ji = fs_2, fs_jpim1 318 ua(ji,jj,jk) = ( ua(ji,jj,jk) - zws(ji,jj,jk) * ua(ji,jj,jk+1) ) / zwd(ji,jj,jk) 319 END DO 320 END DO 321 END DO 275 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 276 zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1) 277 END_3D 278 ! 279 DO_2D( 0, 0, 0, 0 ) 280 ze3ua = ( 1._wp - r_vvl ) * e3u(ji,jj,1,Kmm) & 281 & + r_vvl * e3u(ji,jj,1,Kaa) 282 puu(ji,jj,1,Kaa) = puu(ji,jj,1,Kaa) + rDt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) ) & 283 & / ( ze3ua * rho0 ) * umask(ji,jj,1) 284 END_2D 285 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 286 puu(ji,jj,jk,Kaa) = puu(ji,jj,jk,Kaa) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * puu(ji,jj,jk-1,Kaa) 287 END_3D 288 ! 289 DO_2D( 0, 0, 0, 0 ) 290 puu(ji,jj,jpkm1,Kaa) = puu(ji,jj,jpkm1,Kaa) / zwd(ji,jj,jpkm1) 291 END_2D 292 DO_3DS( 0, 0, 0, 0, jpk-2, 1, -1 ) 293 puu(ji,jj,jk,Kaa) = ( puu(ji,jj,jk,Kaa) - zws(ji,jj,jk) * puu(ji,jj,jk+1,Kaa) ) / zwd(ji,jj,jk) 294 END_3D 322 295 ! 323 296 ! !== Vertical diffusion on v ==! 324 297 ! 325 298 ! !* Matrix construction 326 zdt = r 2dt * 0.5299 zdt = rDt * 0.5 327 300 IF( ln_zad_Aimp ) THEN !! 328 301 SELECT CASE( nldf_dyn ) 329 302 CASE( np_lap_i ) ! rotated lateral mixing: add its vertical mixing (akzv) 330 DO jk = 1, jpkm1 331 DO jj = 2, jpjm1 332 DO ji = fs_2, fs_jpim1 ! vector opt. 333 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk) ! after scale factor at V-point 334 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) + akzv(ji,jj,jk ) ) & 335 & / ( ze3va * e3vw_n(ji,jj,jk ) ) * wvmask(ji,jj,jk ) 336 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) ) & 337 & / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 338 zWvi = ( wi(ji,jj,jk ) + wi(ji,jj+1,jk ) ) / ze3va 339 zWvs = ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) / ze3va 340 zwi(ji,jj,jk) = zzwi + zdt * MIN( zWvi, 0._wp ) 341 zws(ji,jj,jk) = zzws - zdt * MAX( zWvs, 0._wp ) 342 zwd(ji,jj,jk) = 1._wp - zzwi - zzws - zdt * ( - MAX( zWvi, 0._wp ) + MIN( zWvs, 0._wp ) ) 343 END DO 344 END DO 345 END DO 303 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 304 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,jk,Kmm) & 305 & + r_vvl * e3v(ji,jj,jk,Kaa) ! after scale factor at V-point 306 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) + akzv(ji,jj,jk ) ) & 307 & / ( ze3va * e3vw(ji,jj,jk ,Kmm) ) * wvmask(ji,jj,jk ) 308 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) ) & 309 & / ( ze3va * e3vw(ji,jj,jk+1,Kmm) ) * wvmask(ji,jj,jk+1) 310 zWvi = ( wi(ji,jj,jk ) + wi(ji,jj+1,jk ) ) / ze3va 311 zWvs = ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) / ze3va 312 zwi(ji,jj,jk) = zzwi + zdt * MIN( zWvi, 0._wp ) 313 zws(ji,jj,jk) = zzws - zdt * MAX( zWvs, 0._wp ) 314 zwd(ji,jj,jk) = 1._wp - zzwi - zzws - zdt * ( - MAX( zWvi, 0._wp ) + MIN( zWvs, 0._wp ) ) 315 END_3D 346 316 CASE DEFAULT ! iso-level lateral mixing 347 DO jk = 1, jpkm1 348 DO jj = 2, jpjm1 349 DO ji = fs_2, fs_jpim1 ! vector opt. 350 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk) ! after scale factor at V-point 351 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) ) / ( ze3va * e3vw_n(ji,jj,jk ) ) * wvmask(ji,jj,jk ) 352 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 353 zWvi = ( wi(ji,jj,jk ) + wi(ji,jj+1,jk ) ) / ze3va 354 zWvs = ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) / ze3va 355 zwi(ji,jj,jk) = zzwi + zdt * MIN( zWvi, 0._wp ) 356 zws(ji,jj,jk) = zzws - zdt * MAX( zWvs, 0._wp ) 357 zwd(ji,jj,jk) = 1._wp - zzwi - zzws - zdt * ( - MAX( zWvi, 0._wp ) + MIN( zWvs, 0._wp ) ) 358 END DO 359 END DO 360 END DO 317 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 318 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,jk,Kmm) & 319 & + r_vvl * e3v(ji,jj,jk,Kaa) ! after scale factor at V-point 320 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) ) & 321 & / ( ze3va * e3vw(ji,jj,jk ,Kmm) ) * wvmask(ji,jj,jk ) 322 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) & 323 & / ( ze3va * e3vw(ji,jj,jk+1,Kmm) ) * wvmask(ji,jj,jk+1) 324 zWvi = ( wi(ji,jj,jk ) + wi(ji,jj+1,jk ) ) / ze3va 325 zWvs = ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) / ze3va 326 zwi(ji,jj,jk) = zzwi + zdt * MIN( zWvi, 0._wp ) 327 zws(ji,jj,jk) = zzws - zdt * MAX( zWvs, 0._wp ) 328 zwd(ji,jj,jk) = 1._wp - zzwi - zzws - zdt * ( - MAX( zWvi, 0._wp ) + MIN( zWvs, 0._wp ) ) 329 END_3D 361 330 END SELECT 362 DO jj = 2, jpjm1 !* Surface boundary conditions363 DO ji = fs_2, fs_jpim1 ! vector opt.364 zwi(ji,jj,1) = 0._wp365 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,1) + r_vvl * e3v_a(ji,jj,1)366 zzws = - zdt * ( avm(ji,jj+1,2) + avm(ji,jj,2) ) / ( ze3va * e3vw_n(ji,jj,2) ) * wvmask(ji,jj,2)367 zWvs = ( wi(ji,jj ,2) + wi(ji,jj+1,2) ) / ze3va368 zws(ji,jj,1 ) = zzws - zdt * MAX( zWvs, 0._wp )369 zwd(ji,jj,1 ) = 1._wp - zzws - zdt * ( MIN( zWvs, 0._wp ))370 END DO371 END DO331 DO_2D( 0, 0, 0, 0 ) 332 zwi(ji,jj,1) = 0._wp 333 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,1,Kmm) & 334 & + r_vvl * e3v(ji,jj,1,Kaa) 335 zzws = - zdt * ( avm(ji,jj+1,2) + avm(ji,jj,2) ) & 336 & / ( ze3va * e3vw(ji,jj,2,Kmm) ) * wvmask(ji,jj,2) 337 zWvs = ( wi(ji,jj ,2) + wi(ji,jj+1,2) ) / ze3va 338 zws(ji,jj,1 ) = zzws - zdt * MAX( zWvs, 0._wp ) 339 zwd(ji,jj,1 ) = 1._wp - zzws - zdt * ( MIN( zWvs, 0._wp ) ) 340 END_2D 372 341 ELSE 373 342 SELECT CASE( nldf_dyn ) 374 343 CASE( np_lap_i ) ! rotated lateral mixing: add its vertical mixing (akzu) 375 DO jk = 1, jpkm1 376 DO jj = 2, jpjm1 377 DO ji = fs_2, fs_jpim1 ! vector opt. 378 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk) ! after scale factor at V-point 379 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) + akzv(ji,jj,jk ) ) & 380 & / ( ze3va * e3vw_n(ji,jj,jk ) ) * wvmask(ji,jj,jk ) 381 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) ) & 382 & / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 383 zwi(ji,jj,jk) = zzwi 384 zws(ji,jj,jk) = zzws 385 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 386 END DO 387 END DO 388 END DO 344 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 345 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,jk,Kmm) & 346 & + r_vvl * e3v(ji,jj,jk,Kaa) ! after scale factor at V-point 347 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) + akzv(ji,jj,jk ) ) & 348 & / ( ze3va * e3vw(ji,jj,jk ,Kmm) ) * wvmask(ji,jj,jk ) 349 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) ) & 350 & / ( ze3va * e3vw(ji,jj,jk+1,Kmm) ) * wvmask(ji,jj,jk+1) 351 zwi(ji,jj,jk) = zzwi 352 zws(ji,jj,jk) = zzws 353 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 354 END_3D 389 355 CASE DEFAULT ! iso-level lateral mixing 390 DO jk = 1, jpkm1 391 DO jj = 2, jpjm1 392 DO ji = fs_2, fs_jpim1 ! vector opt. 393 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk) ! after scale factor at V-point 394 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) ) / ( ze3va * e3vw_n(ji,jj,jk ) ) * wvmask(ji,jj,jk ) 395 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 396 zwi(ji,jj,jk) = zzwi 397 zws(ji,jj,jk) = zzws 398 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 399 END DO 400 END DO 401 END DO 356 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 357 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,jk,Kmm) & 358 & + r_vvl * e3v(ji,jj,jk,Kaa) ! after scale factor at V-point 359 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) ) & 360 & / ( ze3va * e3vw(ji,jj,jk ,Kmm) ) * wvmask(ji,jj,jk ) 361 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) & 362 & / ( ze3va * e3vw(ji,jj,jk+1,Kmm) ) * wvmask(ji,jj,jk+1) 363 zwi(ji,jj,jk) = zzwi 364 zws(ji,jj,jk) = zzws 365 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 366 END_3D 402 367 END SELECT 403 DO jj = 2, jpjm1 !* Surface boundary conditions 404 DO ji = fs_2, fs_jpim1 ! vector opt. 405 zwi(ji,jj,1) = 0._wp 406 zwd(ji,jj,1) = 1._wp - zws(ji,jj,1) 407 END DO 408 END DO 368 DO_2D( 0, 0, 0, 0 ) 369 zwi(ji,jj,1) = 0._wp 370 zwd(ji,jj,1) = 1._wp - zws(ji,jj,1) 371 END_2D 409 372 ENDIF 410 373 ! … … 416 379 ! 417 380 IF( ln_drgimp ) THEN 418 DO jj = 2, jpjm1 419 DO ji = 2, jpim1 420 ikv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 421 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv) ! after scale factor at T-point 422 zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - r2dt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) / ze3va 423 END DO 424 END DO 381 DO_2D( 0, 0, 0, 0 ) 382 ikv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 383 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,ikv,Kmm) & 384 & + r_vvl * e3v(ji,jj,ikv,Kaa) ! after scale factor at T-point 385 zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - rDt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) / ze3va 386 END_2D 425 387 IF ( ln_isfcav ) THEN 426 DO jj = 2, jpjm1 427 DO ji = 2, jpim1 428 ikv = mikv(ji,jj) ! (first wet ocean u- and v-points) 429 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv) ! after scale factor at T-point 430 zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / ze3va 431 END DO 432 END DO 388 DO_2D( 0, 0, 0, 0 ) 389 ikv = mikv(ji,jj) ! (first wet ocean u- and v-points) 390 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,ikv,Kmm) & 391 & + r_vvl * e3v(ji,jj,ikv,Kaa) ! after scale factor at T-point 392 zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - rDt * 0.5*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) / ze3va 393 END_2D 433 394 ENDIF 434 395 ENDIF … … 449 410 !----------------------------------------------------------------------- 450 411 ! 451 DO jk = 2, jpkm1 !== First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1 (increasing k) == 452 DO jj = 2, jpjm1 453 DO ji = fs_2, fs_jpim1 ! vector opt. 454 zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1) 455 END DO 456 END DO 457 END DO 458 ! 459 DO jj = 2, jpjm1 !== second recurrence: SOLk = RHSk - Lk / Dk-1 Lk-1 ==! 460 DO ji = fs_2, fs_jpim1 ! vector opt. 461 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,1) + r_vvl * e3v_a(ji,jj,1) 462 va(ji,jj,1) = va(ji,jj,1) + r2dt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) ) & 463 & / ( ze3va * rau0 ) * vmask(ji,jj,1) 464 END DO 465 END DO 466 DO jk = 2, jpkm1 467 DO jj = 2, jpjm1 468 DO ji = fs_2, fs_jpim1 ! vector opt. 469 va(ji,jj,jk) = va(ji,jj,jk) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va(ji,jj,jk-1) 470 END DO 471 END DO 472 END DO 473 ! 474 DO jj = 2, jpjm1 !== third recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk ==! 475 DO ji = fs_2, fs_jpim1 ! vector opt. 476 va(ji,jj,jpkm1) = va(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) 477 END DO 478 END DO 479 DO jk = jpk-2, 1, -1 480 DO jj = 2, jpjm1 481 DO ji = fs_2, fs_jpim1 482 va(ji,jj,jk) = ( va(ji,jj,jk) - zws(ji,jj,jk) * va(ji,jj,jk+1) ) / zwd(ji,jj,jk) 483 END DO 484 END DO 485 END DO 412 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 413 zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1) 414 END_3D 415 ! 416 DO_2D( 0, 0, 0, 0 ) 417 ze3va = ( 1._wp - r_vvl ) * e3v(ji,jj,1,Kmm) & 418 & + r_vvl * e3v(ji,jj,1,Kaa) 419 pvv(ji,jj,1,Kaa) = pvv(ji,jj,1,Kaa) + rDt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) ) & 420 & / ( ze3va * rho0 ) * vmask(ji,jj,1) 421 END_2D 422 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 423 pvv(ji,jj,jk,Kaa) = pvv(ji,jj,jk,Kaa) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * pvv(ji,jj,jk-1,Kaa) 424 END_3D 425 ! 426 DO_2D( 0, 0, 0, 0 ) 427 pvv(ji,jj,jpkm1,Kaa) = pvv(ji,jj,jpkm1,Kaa) / zwd(ji,jj,jpkm1) 428 END_2D 429 DO_3DS( 0, 0, 0, 0, jpk-2, 1, -1 ) 430 pvv(ji,jj,jk,Kaa) = ( pvv(ji,jj,jk,Kaa) - zws(ji,jj,jk) * pvv(ji,jj,jk+1,Kaa) ) / zwd(ji,jj,jk) 431 END_3D 486 432 ! 487 433 IF( l_trddyn ) THEN ! save the vertical diffusive trends for further diagnostics 488 ztrdu(:,:,:) = ( ua(:,:,:) - ub(:,:,:) ) / r2dt - ztrdu(:,:,:)489 ztrdv(:,:,:) = ( va(:,:,:) - vb(:,:,:) ) / r2dt - ztrdv(:,:,:)490 CALL trd_dyn( ztrdu, ztrdv, jpdyn_zdf, kt )434 ztrdu(:,:,:) = ( puu(:,:,:,Kaa) - puu(:,:,:,Kbb) ) / rDt - ztrdu(:,:,:) 435 ztrdv(:,:,:) = ( pvv(:,:,:,Kaa) - pvv(:,:,:,Kbb) ) / rDt - ztrdv(:,:,:) 436 CALL trd_dyn( ztrdu, ztrdv, jpdyn_zdf, kt, Kmm ) 491 437 DEALLOCATE( ztrdu, ztrdv ) 492 438 ENDIF 493 439 ! ! print mean trends (used for debugging) 494 IF( ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' zdf - Ua: ', mask1=umask, &495 & tab3d_2=va, clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' )440 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=puu(:,:,:,Kaa), clinfo1=' zdf - Ua: ', mask1=umask, & 441 & tab3d_2=pvv(:,:,:,Kaa), clinfo2= ' Va: ', mask2=vmask, clinfo3='dyn' ) 496 442 ! 497 443 IF( ln_timing ) CALL timing_stop('dyn_zdf') -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/sshwzv.F90
r11293 r13463 9 9 !! - ! 2010-09 (D.Storkey and E.O'Dea) bug fixes for BDY module 10 10 !! 3.3 ! 2011-10 (M. Leclair) split former ssh_wzv routine and remove all vvl related work 11 !! 4.0 ! 2018-12 (A. Coward) add mixed implicit/explicit advection 12 !! 4.1 ! 2019-08 (A. Coward, D. Storkey) Rename ssh_nxt -> ssh_atf. Now only does time filtering. 11 13 !!---------------------------------------------------------------------- 12 14 13 15 !!---------------------------------------------------------------------- 14 16 !! ssh_nxt : after ssh 15 !! ssh_ swp : filter ans swapthe ssh arrays17 !! ssh_atf : time filter the ssh arrays 16 18 !! wzv : compute now vertical velocity 17 19 !!---------------------------------------------------------------------- 18 20 USE oce ! ocean dynamics and tracers variables 21 USE isf_oce ! ice shelf 19 22 USE dom_oce ! ocean space and time domain variables 20 23 USE sbc_oce ! surface boundary condition: ocean … … 25 28 USE bdydyn2d ! bdy_ssh routine 26 29 #if defined key_agrif 30 USE agrif_oce 27 31 USE agrif_oce_interp 28 32 #endif … … 43 47 PUBLIC wzv ! called by step.F90 44 48 PUBLIC wAimp ! called by step.F90 45 PUBLIC ssh_ swp! called by step.F9049 PUBLIC ssh_atf ! called by step.F90 46 50 47 51 !! * Substitutions 48 # include "vectopt_loop_substitute.h90" 52 # include "do_loop_substitute.h90" 53 # include "domzgr_substitute.h90" 54 49 55 !!---------------------------------------------------------------------- 50 56 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 54 60 CONTAINS 55 61 56 SUBROUTINE ssh_nxt( kt )62 SUBROUTINE ssh_nxt( kt, Kbb, Kmm, pssh, Kaa ) 57 63 !!---------------------------------------------------------------------- 58 64 !! *** ROUTINE ssh_nxt *** 59 65 !! 60 !! ** Purpose : compute the after ssh (ssh a)66 !! ** Purpose : compute the after ssh (ssh(Kaa)) 61 67 !! 62 68 !! ** Method : - Using the incompressibility hypothesis, the ssh increment … … 64 70 !! by the time step. 65 71 !! 66 !! ** action : ssh a, after sea surface height72 !! ** action : ssh(:,:,Kaa), after sea surface height 67 73 !! 68 74 !! Reference : Leclair, M., and G. Madec, 2009, Ocean Modelling. 69 75 !!---------------------------------------------------------------------- 70 INTEGER, INTENT(in) :: kt ! time step 76 INTEGER , INTENT(in ) :: kt ! time step 77 INTEGER , INTENT(in ) :: Kbb, Kmm, Kaa ! time level index 78 REAL(wp), DIMENSION(jpi,jpj,jpt), INTENT(inout) :: pssh ! sea-surface height 71 79 ! 72 INTEGER :: jk ! dummy loop indice73 REAL(wp) :: z 2dt, zcoef ! local scalars80 INTEGER :: jk ! dummy loop index 81 REAL(wp) :: zcoef ! local scalar 74 82 REAL(wp), DIMENSION(jpi,jpj) :: zhdiv ! 2D workspace 75 83 !!---------------------------------------------------------------------- … … 83 91 ENDIF 84 92 ! 85 z2dt = 2._wp * rdt ! set time step size (Euler/Leapfrog) 86 IF( neuler == 0 .AND. kt == nit000 ) z2dt = rdt 87 zcoef = 0.5_wp * r1_rau0 93 zcoef = 0.5_wp * r1_rho0 88 94 89 95 ! !------------------------------! … … 91 97 ! !------------------------------! 92 98 IF(ln_wd_il) THEN 93 CALL wad_lmt( sshb, zcoef * (emp_b(:,:) + emp(:,:)), z2dt)94 ENDIF 95 96 CALL div_hor( kt )! Horizontal divergence99 CALL wad_lmt(pssh(:,:,Kbb), zcoef * (emp_b(:,:) + emp(:,:)), rDt, Kmm, uu, vv ) 100 ENDIF 101 102 CALL div_hor( kt, Kbb, Kmm ) ! Horizontal divergence 97 103 ! 98 104 zhdiv(:,:) = 0._wp 99 105 DO jk = 1, jpkm1 ! Horizontal divergence of barotropic transports 100 zhdiv(:,:) = zhdiv(:,:) + e3t _n(:,:,jk) * hdivn(:,:,jk)106 zhdiv(:,:) = zhdiv(:,:) + e3t(:,:,jk,Kmm) * hdiv(:,:,jk) 101 107 END DO 102 108 ! ! Sea surface elevation time stepping … … 104 110 ! compute the vertical velocity which can be used to compute the non-linear terms of the momentum equations. 105 111 ! 106 ssha(:,:) = ( sshb(:,:) - z2dt * ( zcoef * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) ) ) * ssmask(:,:)112 pssh(:,:,Kaa) = ( pssh(:,:,Kbb) - rDt * ( zcoef * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) ) ) * ssmask(:,:) 107 113 ! 108 114 #if defined key_agrif 115 Kbb_a = Kbb ; Kmm_a = Kmm ; Krhs_a = Kaa 109 116 CALL agrif_ssh( kt ) 110 117 #endif … … 112 119 IF ( .NOT.ln_dynspg_ts ) THEN 113 120 IF( ln_bdy ) THEN 114 CALL lbc_lnk( 'sshwzv', ssha, 'T', 1.) ! Not sure that's necessary115 CALL bdy_ssh( ssha) ! Duplicate sea level across open boundaries121 CALL lbc_lnk( 'sshwzv', pssh(:,:,Kaa), 'T', 1.0_wp ) ! Not sure that's necessary 122 CALL bdy_ssh( pssh(:,:,Kaa) ) ! Duplicate sea level across open boundaries 116 123 ENDIF 117 124 ENDIF … … 120 127 ! !------------------------------! 121 128 ! 122 IF( ln_ctl) CALL prt_ctl( tab2d_1=ssha, clinfo1=' ssha- : ', mask1=tmask )129 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab2d_1=pssh(:,:,Kaa), clinfo1=' pssh(:,:,Kaa) - : ', mask1=tmask ) 123 130 ! 124 131 IF( ln_timing ) CALL timing_stop('ssh_nxt') … … 127 134 128 135 129 SUBROUTINE wzv( kt )136 SUBROUTINE wzv( kt, Kbb, Kmm, Kaa, pww ) 130 137 !!---------------------------------------------------------------------- 131 138 !! *** ROUTINE wzv *** … … 138 145 !! The boundary conditions are w=0 at the bottom (no flux) and. 139 146 !! 140 !! ** action : wn: now vertical velocity147 !! ** action : pww : now vertical velocity 141 148 !! 142 149 !! Reference : Leclair, M., and G. Madec, 2009, Ocean Modelling. 143 150 !!---------------------------------------------------------------------- 144 INTEGER, INTENT(in) :: kt ! time step 151 INTEGER , INTENT(in) :: kt ! time step 152 INTEGER , INTENT(in) :: Kbb, Kmm, Kaa ! time level indices 153 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pww ! vertical velocity at Kmm 145 154 ! 146 155 INTEGER :: ji, jj, jk ! dummy loop indices 147 REAL(wp) :: z1_2dt ! local scalars148 156 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zhdiv 149 157 !!---------------------------------------------------------------------- … … 156 164 IF(lwp) WRITE(numout,*) '~~~~~ ' 157 165 ! 158 wn(:,:,jpk) = 0._wp ! bottom boundary condition: w=0 (set once for all)166 pww(:,:,jpk) = 0._wp ! bottom boundary condition: w=0 (set once for all) 159 167 ENDIF 160 168 ! !------------------------------! 161 169 ! ! Now Vertical Velocity ! 162 170 ! !------------------------------! 163 z1_2dt = 1. / ( 2. * rdt ) ! set time step size (Euler/Leapfrog)164 IF( neuler == 0 .AND. kt == nit000 ) z1_2dt = 1. / rdt165 !166 IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN ! z_tilde and layer cases171 ! 172 ! !===============================! 173 IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN !== z_tilde and layer cases ==! 174 ! !===============================! 167 175 ALLOCATE( zhdiv(jpi,jpj,jpk) ) 168 176 ! … … 170 178 ! horizontal divergence of thickness diffusion transport ( velocity multiplied by e3t) 171 179 ! - ML - note: computation already done in dom_vvl_sf_nxt. Could be optimized (not critical and clearer this way) 172 DO jj = 2, jpjm1 173 DO ji = fs_2, fs_jpim1 ! vector opt. 174 zhdiv(ji,jj,jk) = r1_e1e2t(ji,jj) * ( un_td(ji,jj,jk) - un_td(ji-1,jj,jk) + vn_td(ji,jj,jk) - vn_td(ji,jj-1,jk) ) 175 END DO 176 END DO 177 END DO 178 CALL lbc_lnk('sshwzv', zhdiv, 'T', 1.) ! - ML - Perhaps not necessary: not used for horizontal "connexions" 180 DO_2D( 0, 0, 0, 0 ) 181 zhdiv(ji,jj,jk) = r1_e1e2t(ji,jj) * ( un_td(ji,jj,jk) - un_td(ji-1,jj,jk) + vn_td(ji,jj,jk) - vn_td(ji,jj-1,jk) ) 182 END_2D 183 END DO 184 CALL lbc_lnk('sshwzv', zhdiv, 'T', 1.0_wp) ! - ML - Perhaps not necessary: not used for horizontal "connexions" 179 185 ! ! Is it problematic to have a wrong vertical velocity in boundary cells? 180 ! ! Same question holds for hdiv n. Perhaps just for security186 ! ! Same question holds for hdiv. Perhaps just for security 181 187 DO jk = jpkm1, 1, -1 ! integrate from the bottom the hor. divergence 182 188 ! computation of w 183 wn(:,:,jk) = wn(:,:,jk+1) - ( e3t_n(:,:,jk) * hdivn(:,:,jk) + zhdiv(:,:,jk) & 184 & + z1_2dt * ( e3t_a(:,:,jk) - e3t_b(:,:,jk) ) ) * tmask(:,:,jk) 185 END DO 186 ! IF( ln_vvl_layer ) wn(:,:,:) = 0.e0 189 pww(:,:,jk) = pww(:,:,jk+1) - ( e3t(:,:,jk,Kmm) * hdiv(:,:,jk) & 190 & + zhdiv(:,:,jk) & 191 & + r1_Dt * ( e3t(:,:,jk,Kaa) & 192 & - e3t(:,:,jk,Kbb) ) ) * tmask(:,:,jk) 193 END DO 194 ! IF( ln_vvl_layer ) pww(:,:,:) = 0.e0 187 195 DEALLOCATE( zhdiv ) 188 ELSE ! z_star and linear free surface cases 196 ! !=================================! 197 ELSEIF( ln_linssh ) THEN !== linear free surface cases ==! 198 ! !=================================! 199 DO jk = jpkm1, 1, -1 ! integrate from the bottom the hor. divergence 200 pww(:,:,jk) = pww(:,:,jk+1) - ( e3t(:,:,jk,Kmm) * hdiv(:,:,jk) ) * tmask(:,:,jk) 201 END DO 202 ! !==========================================! 203 ELSE !== Quasi-Eulerian vertical coordinate ==! ('key_qco') 204 ! !==========================================! 189 205 DO jk = jpkm1, 1, -1 ! integrate from the bottom the hor. divergence 190 ! computation of w191 wn(:,:,jk) = wn(:,:,jk+1) - ( e3t_n(:,:,jk) * hdivn(:,:,jk)&192 & + z1_2dt * ( e3t_a(:,:,jk) - e3t_b(:,:,jk) )) * tmask(:,:,jk)206 pww(:,:,jk) = pww(:,:,jk+1) - ( e3t(:,:,jk,Kmm) * hdiv(:,:,jk) & 207 & + r1_Dt * ( e3t(:,:,jk,Kaa) & 208 & - e3t(:,:,jk,Kbb) ) ) * tmask(:,:,jk) 193 209 END DO 194 210 ENDIF … … 196 212 IF( ln_bdy ) THEN 197 213 DO jk = 1, jpkm1 198 wn(:,:,jk) = wn(:,:,jk) * bdytmask(:,:) 199 END DO 200 ENDIF 201 ! 202 #if defined key_agrif 203 IF( .NOT. AGRIF_Root() ) THEN 204 IF ((nbondi == 1).OR.(nbondi == 2)) wn(nlci-1 , : ,:) = 0.e0 ! east 205 IF ((nbondi == -1).OR.(nbondi == 2)) wn(2 , : ,:) = 0.e0 ! west 206 IF ((nbondj == 1).OR.(nbondj == 2)) wn(: ,nlcj-1 ,:) = 0.e0 ! north 207 IF ((nbondj == -1).OR.(nbondj == 2)) wn(: ,2 ,:) = 0.e0 ! south 214 pww(:,:,jk) = pww(:,:,jk) * bdytmask(:,:) 215 END DO 216 ENDIF 217 ! 218 #if defined key_agrif 219 IF( .NOT. AGRIF_Root() ) THEN 220 ! 221 ! Mask vertical velocity at first/last columns/row 222 ! inside computational domain (cosmetic) 223 DO jk = 1, jpkm1 224 IF( lk_west ) THEN ! --- West --- ! 225 DO ji = mi0(2+nn_hls), mi1(2+nn_hls) 226 DO jj = 1, jpj 227 pww(ji,jj,jk) = 0._wp 228 END DO 229 END DO 230 ENDIF 231 IF( lk_east ) THEN ! --- East --- ! 232 DO ji = mi0(jpiglo-1-nn_hls), mi1(jpiglo-1-nn_hls) 233 DO jj = 1, jpj 234 pww(ji,jj,jk) = 0._wp 235 END DO 236 END DO 237 ENDIF 238 IF( lk_south ) THEN ! --- South --- ! 239 DO jj = mj0(2+nn_hls), mj1(2+nn_hls) 240 DO ji = 1, jpi 241 pww(ji,jj,jk) = 0._wp 242 END DO 243 END DO 244 ENDIF 245 IF( lk_north ) THEN ! --- North --- ! 246 DO jj = mj0(jpjglo-1-nn_hls), mj1(jpjglo-1-nn_hls) 247 DO ji = 1, jpi 248 pww(ji,jj,jk) = 0._wp 249 END DO 250 END DO 251 ENDIF 252 ! 253 END DO 254 ! 208 255 ENDIF 209 #endif 256 #endif 210 257 ! 211 258 IF( ln_timing ) CALL timing_stop('wzv') … … 214 261 215 262 216 SUBROUTINE ssh_swp( kt ) 217 !!---------------------------------------------------------------------- 218 !! *** ROUTINE ssh_nxt *** 219 !! 220 !! ** Purpose : achieve the sea surface height time stepping by 221 !! applying Asselin time filter and swapping the arrays 222 !! ssha already computed in ssh_nxt 263 SUBROUTINE ssh_atf( kt, Kbb, Kmm, Kaa, pssh, pssh_f ) 264 !!---------------------------------------------------------------------- 265 !! *** ROUTINE ssh_atf *** 266 !! 267 !! ** Purpose : Apply Asselin time filter to now SSH. 223 268 !! 224 269 !! ** Method : - apply Asselin time fiter to now ssh (excluding the forcing 225 270 !! from the filter, see Leclair and Madec 2010) and swap : 226 !! sshn = ssha + atfp * ( sshb -2 sshn + ssha ) 227 !! - atfp * rdt * ( emp_b - emp ) / rau0 228 !! sshn = ssha 229 !! 230 !! ** action : - sshb, sshn : before & now sea surface height 231 !! ready for the next time step 271 !! pssh(:,:,Kmm) = pssh(:,:,Kaa) + rn_atfp * ( pssh(:,:,Kbb) -2 pssh(:,:,Kmm) + pssh(:,:,Kaa) ) 272 !! - rn_atfp * rn_Dt * ( emp_b - emp ) / rho0 273 !! 274 !! ** action : - pssh(:,:,Kmm) time filtered 232 275 !! 233 276 !! Reference : Leclair, M., and G. Madec, 2009, Ocean Modelling. 234 277 !!---------------------------------------------------------------------- 235 INTEGER, INTENT(in) :: kt ! ocean time-step index 278 INTEGER , INTENT(in ) :: kt ! ocean time-step index 279 INTEGER , INTENT(in ) :: Kbb, Kmm, Kaa ! ocean time level indices 280 REAL(wp), DIMENSION(jpi,jpj,jpt) , TARGET, INTENT(inout) :: pssh ! SSH field 281 REAL(wp), DIMENSION(jpi,jpj ), OPTIONAL, TARGET, INTENT( out) :: pssh_f ! filtered SSH field 236 282 ! 237 283 REAL(wp) :: zcoef ! local scalar 238 !!---------------------------------------------------------------------- 239 ! 240 IF( ln_timing ) CALL timing_start('ssh_swp') 284 REAL(wp), POINTER, DIMENSION(:,:) :: zssh ! pointer for filtered SSH 285 !!---------------------------------------------------------------------- 286 ! 287 IF( ln_timing ) CALL timing_start('ssh_atf') 241 288 ! 242 289 IF( kt == nit000 ) THEN 243 290 IF(lwp) WRITE(numout,*) 244 IF(lwp) WRITE(numout,*) 'ssh_ swp : Asselin time filter and swapof sea surface height'291 IF(lwp) WRITE(numout,*) 'ssh_atf : Asselin time filter of sea surface height' 245 292 IF(lwp) WRITE(numout,*) '~~~~~~~ ' 246 293 ENDIF 247 294 ! !== Euler time-stepping: no filter, just swap ==! 248 IF ( neuler == 0 .AND. kt == nit000 ) THEN 249 sshn(:,:) = ssha(:,:) ! now <-- after (before already = now) 250 ! 251 ELSE !== Leap-Frog time-stepping: Asselin filter + swap ==! 252 ! ! before <-- now filtered 253 sshb(:,:) = sshn(:,:) + atfp * ( sshb(:,:) - 2 * sshn(:,:) + ssha(:,:) ) 254 IF( .NOT.ln_linssh ) THEN ! before <-- with forcing removed 255 zcoef = atfp * rdt * r1_rau0 256 sshb(:,:) = sshb(:,:) - zcoef * ( emp_b(:,:) - emp (:,:) & 257 & - rnf_b(:,:) + rnf (:,:) & 258 & + fwfisf_b(:,:) - fwfisf(:,:) ) * ssmask(:,:) 295 IF ( .NOT.( l_1st_euler ) ) THEN ! Only do time filtering for leapfrog timesteps 296 IF( PRESENT( pssh_f ) ) THEN ; zssh => pssh_f 297 ELSE ; zssh => pssh(:,:,Kmm) 259 298 ENDIF 260 sshn(:,:) = ssha(:,:) ! now <-- after 261 ENDIF 262 ! 263 IF(ln_ctl) CALL prt_ctl( tab2d_1=sshb, clinfo1=' sshb - : ', mask1=tmask ) 264 ! 265 IF( ln_timing ) CALL timing_stop('ssh_swp') 266 ! 267 END SUBROUTINE ssh_swp 268 269 SUBROUTINE wAimp( kt ) 299 ! ! filtered "now" field 300 pssh(:,:,Kmm) = pssh(:,:,Kmm) + rn_atfp * ( pssh(:,:,Kbb) - 2 * pssh(:,:,Kmm) + pssh(:,:,Kaa) ) 301 IF( .NOT.ln_linssh ) THEN ! "now" <-- with forcing removed 302 zcoef = rn_atfp * rn_Dt * r1_rho0 303 pssh(:,:,Kmm) = pssh(:,:,Kmm) - zcoef * ( emp_b(:,:) - emp (:,:) & 304 & - rnf_b(:,:) + rnf (:,:) & 305 & + fwfisf_cav_b(:,:) - fwfisf_cav(:,:) & 306 & + fwfisf_par_b(:,:) - fwfisf_par(:,:) ) * ssmask(:,:) 307 308 ! ice sheet coupling 309 IF ( ln_isf .AND. ln_isfcpl .AND. kt == nit000+1) pssh(:,:,Kbb) = pssh(:,:,Kbb) - rn_atfp * rn_Dt * ( risfcpl_ssh(:,:) - 0.0 ) * ssmask(:,:) 310 311 ENDIF 312 ENDIF 313 ! 314 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab2d_1=pssh(:,:,Kmm), clinfo1=' pssh(:,:,Kmm) - : ', mask1=tmask ) 315 ! 316 IF( ln_timing ) CALL timing_stop('ssh_atf') 317 ! 318 END SUBROUTINE ssh_atf 319 320 321 SUBROUTINE wAimp( kt, Kmm ) 270 322 !!---------------------------------------------------------------------- 271 323 !! *** ROUTINE wAimp *** … … 276 328 !! ** Method : - 277 329 !! 278 !! ** action : w n: now vertical velocity (to be handled explicitly)330 !! ** action : ww : now vertical velocity (to be handled explicitly) 279 331 !! : wi : now vertical velocity (for implicit treatment) 280 332 !! 281 !! Reference : Leclair, M., and G. Madec, 2009, Ocean Modelling. 333 !! Reference : Shchepetkin, A. F. (2015): An adaptive, Courant-number-dependent 334 !! implicit scheme for vertical advection in oceanic modeling. 335 !! Ocean Modelling, 91, 38-69. 282 336 !!---------------------------------------------------------------------- 283 337 INTEGER, INTENT(in) :: kt ! time step 338 INTEGER, INTENT(in) :: Kmm ! time level index 284 339 ! 285 340 INTEGER :: ji, jj, jk ! dummy loop indices 286 REAL(wp) :: zCu, zcff, z1_e3t 341 REAL(wp) :: zCu, zcff, z1_e3t, zdt ! local scalars 287 342 REAL(wp) , PARAMETER :: Cu_min = 0.15_wp ! local parameters 288 REAL(wp) , PARAMETER :: Cu_max = 0. 27! local parameters343 REAL(wp) , PARAMETER :: Cu_max = 0.30_wp ! local parameters 289 344 REAL(wp) , PARAMETER :: Cu_cut = 2._wp*Cu_max - Cu_min ! local parameters 290 345 REAL(wp) , PARAMETER :: Fcu = 4._wp*Cu_max*(Cu_max-Cu_min) ! local parameters … … 300 355 ENDIF 301 356 ! 302 ! 303 DO jk = 1, jpkm1 ! calculate Courant numbers 304 DO jj = 2, jpjm1 305 DO ji = 2, fs_jpim1 ! vector opt. 306 z1_e3t = 1._wp / e3t_n(ji,jj,jk) 307 Cu_adv(ji,jj,jk) = 2._wp * rdt * ( ( MAX( wn(ji,jj,jk) , 0._wp ) - MIN( wn(ji,jj,jk+1) , 0._wp ) ) & ! 2*rdt and not r2dt (for restartability) 308 & + ( MAX( e2u(ji ,jj)*e3u_n(ji ,jj,jk)*un(ji ,jj,jk), 0._wp ) - & 309 & MIN( e2u(ji-1,jj)*e3u_n(ji-1,jj,jk)*un(ji-1,jj,jk), 0._wp ) ) & 310 & * r1_e1e2t(ji,jj) & 311 & + ( MAX( e1v(ji,jj )*e3v_n(ji,jj ,jk)*vn(ji,jj ,jk), 0._wp ) - & 312 & MIN( e1v(ji,jj-1)*e3v_n(ji,jj-1,jk)*vn(ji,jj-1,jk), 0._wp ) ) & 313 & * r1_e1e2t(ji,jj) & 314 & ) * z1_e3t 315 END DO 316 END DO 317 END DO 318 CALL lbc_lnk( 'sshwzv', Cu_adv, 'T', 1. ) 357 ! Calculate Courant numbers 358 zdt = 2._wp * rn_Dt ! 2*rn_Dt and not rDt (for restartability) 359 IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN 360 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 361 z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 362 Cu_adv(ji,jj,jk) = zdt * & 363 & ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) ) & 364 & + ( MAX( e2u(ji ,jj) * e3u(ji ,jj,jk,Kmm) & 365 & * uu (ji ,jj,jk,Kmm) + un_td(ji ,jj,jk), 0._wp ) - & 366 & MIN( e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm) & 367 & * uu (ji-1,jj,jk,Kmm) + un_td(ji-1,jj,jk), 0._wp ) ) & 368 & * r1_e1e2t(ji,jj) & 369 & + ( MAX( e1v(ji,jj ) * e3v(ji,jj ,jk,Kmm) & 370 & * vv (ji,jj ,jk,Kmm) + vn_td(ji,jj ,jk), 0._wp ) - & 371 & MIN( e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) & 372 & * vv (ji,jj-1,jk,Kmm) + vn_td(ji,jj-1,jk), 0._wp ) ) & 373 & * r1_e1e2t(ji,jj) & 374 & ) * z1_e3t 375 END_3D 376 ELSE 377 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 378 z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 379 Cu_adv(ji,jj,jk) = zdt * & 380 & ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) ) & 381 & + ( MAX( e2u(ji ,jj)*e3u(ji ,jj,jk,Kmm)*uu(ji ,jj,jk,Kmm), 0._wp ) - & 382 & MIN( e2u(ji-1,jj)*e3u(ji-1,jj,jk,Kmm)*uu(ji-1,jj,jk,Kmm), 0._wp ) ) & 383 & * r1_e1e2t(ji,jj) & 384 & + ( MAX( e1v(ji,jj )*e3v(ji,jj ,jk,Kmm)*vv(ji,jj ,jk,Kmm), 0._wp ) - & 385 & MIN( e1v(ji,jj-1)*e3v(ji,jj-1,jk,Kmm)*vv(ji,jj-1,jk,Kmm), 0._wp ) ) & 386 & * r1_e1e2t(ji,jj) & 387 & ) * z1_e3t 388 END_3D 389 ENDIF 390 CALL lbc_lnk( 'sshwzv', Cu_adv, 'T', 1.0_wp ) 319 391 ! 320 392 CALL iom_put("Courant",Cu_adv) 321 393 ! 322 394 IF( MAXVAL( Cu_adv(:,:,:) ) > Cu_min ) THEN ! Quick check if any breaches anywhere 323 DO jk = jpkm1, 2, -1 ! or scan Courant criterion and partition 324 DO jj = 1, jpj ! w where necessary 325 DO ji = 1, jpi 326 ! 327 zCu = MAX( Cu_adv(ji,jj,jk) , Cu_adv(ji,jj,jk-1) ) 395 DO_3DS( 1, 1, 1, 1, jpkm1, 2, -1 ) 396 ! 397 zCu = MAX( Cu_adv(ji,jj,jk) , Cu_adv(ji,jj,jk-1) ) 328 398 ! alt: 329 ! IF ( w n(ji,jj,jk) > 0._wp ) THEN399 ! IF ( ww(ji,jj,jk) > 0._wp ) THEN 330 400 ! zCu = Cu_adv(ji,jj,jk) 331 401 ! ELSE 332 402 ! zCu = Cu_adv(ji,jj,jk-1) 333 403 ! ENDIF 334 ! 335 IF( zCu <= Cu_min ) THEN !<-- Fully explicit 336 zcff = 0._wp 337 ELSEIF( zCu < Cu_cut ) THEN !<-- Mixed explicit 338 zcff = ( zCu - Cu_min )**2 339 zcff = zcff / ( Fcu + zcff ) 340 ELSE !<-- Mostly implicit 341 zcff = ( zCu - Cu_max )/ zCu 342 ENDIF 343 zcff = MIN(1._wp, zcff) 344 ! 345 wi(ji,jj,jk) = zcff * wn(ji,jj,jk) 346 wn(ji,jj,jk) = ( 1._wp - zcff ) * wn(ji,jj,jk) 347 ! 348 Cu_adv(ji,jj,jk) = zcff ! Reuse array to output coefficient 349 END DO 350 END DO 351 END DO 404 ! 405 IF( zCu <= Cu_min ) THEN !<-- Fully explicit 406 zcff = 0._wp 407 ELSEIF( zCu < Cu_cut ) THEN !<-- Mixed explicit 408 zcff = ( zCu - Cu_min )**2 409 zcff = zcff / ( Fcu + zcff ) 410 ELSE !<-- Mostly implicit 411 zcff = ( zCu - Cu_max )/ zCu 412 ENDIF 413 zcff = MIN(1._wp, zcff) 414 ! 415 wi(ji,jj,jk) = zcff * ww(ji,jj,jk) 416 ww(ji,jj,jk) = ( 1._wp - zcff ) * ww(ji,jj,jk) 417 ! 418 Cu_adv(ji,jj,jk) = zcff ! Reuse array to output coefficient below and in stp_ctl 419 END_3D 352 420 Cu_adv(:,:,1) = 0._wp 353 421 ELSE 354 422 ! Fully explicit everywhere 355 Cu_adv(:,:,:) = 0._wp ! Reuse array to output coefficient 423 Cu_adv(:,:,:) = 0._wp ! Reuse array to output coefficient below and in stp_ctl 356 424 wi (:,:,:) = 0._wp 357 425 ENDIF 358 426 CALL iom_put("wimp",wi) 359 427 CALL iom_put("wi_cff",Cu_adv) 360 CALL iom_put("wexp",w n)428 CALL iom_put("wexp",ww) 361 429 ! 362 430 IF( ln_timing ) CALL timing_stop('wAimp') -
NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/wet_dry.F90
r10499 r13463 31 31 PRIVATE 32 32 33 !! * Substitutions 34 # include "do_loop_substitute.h90" 35 # include "domzgr_substitute.h90" 33 36 !!---------------------------------------------------------------------- 34 37 !! critical depths,filters, limiters,and masks for Wetting and Drying … … 61 64 62 65 !! * Substitutions 63 # include "vectopt_loop_substitute.h90"64 66 !!---------------------------------------------------------------------- 65 67 CONTAINS … … 79 81 !!---------------------------------------------------------------------- 80 82 ! 81 REWIND( numnam_ref ) ! Namelist namwad in reference namelist : Parameters for Wetting/Drying82 83 READ ( numnam_ref, namwad, IOSTAT = ios, ERR = 905) 83 905 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namwad in reference namelist', .TRUE.) 84 REWIND( numnam_cfg ) ! Namelist namwad in configuration namelist : Parameters for Wetting/Drying 84 905 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namwad in reference namelist' ) 85 85 READ ( numnam_cfg, namwad, IOSTAT = ios, ERR = 906) 86 906 IF( ios > 0 ) CALL ctl_nam ( ios , 'namwad in configuration namelist' , .TRUE.)86 906 IF( ios > 0 ) CALL ctl_nam ( ios , 'namwad in configuration namelist' ) 87 87 IF(lwm) WRITE ( numond, namwad ) 88 88 ! … … 122 122 123 123 124 SUBROUTINE wad_lmt( sshb1, sshemp, z2dt)124 SUBROUTINE wad_lmt( psshb1, psshemp, z2dt, Kmm, puu, pvv ) 125 125 !!---------------------------------------------------------------------- 126 126 !! *** ROUTINE wad_lmt *** … … 132 132 !! ** Action : - calculate flux limiter and W/D flag 133 133 !!---------------------------------------------------------------------- 134 REAL(wp), DIMENSION(:,:), INTENT(inout) :: sshb1 !!gm DOCTOR names: should start with p ! 135 REAL(wp), DIMENSION(:,:), INTENT(in ) :: sshemp 136 REAL(wp) , INTENT(in ) :: z2dt 134 REAL(wp), DIMENSION(:,:) , INTENT(inout) :: psshb1 135 REAL(wp), DIMENSION(:,:) , INTENT(in ) :: psshemp 136 REAL(wp) , INTENT(in ) :: z2dt 137 INTEGER , INTENT(in ) :: Kmm ! time level index 138 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! velocity arrays 137 139 ! 138 140 INTEGER :: ji, jj, jk, jk1 ! dummy loop indices … … 150 152 ! 151 153 DO jk = 1, jpkm1 152 un(:,:,jk) = un(:,:,jk) * zwdlmtu(:,:)153 vn(:,:,jk) = vn(:,:,jk) * zwdlmtv(:,:)154 puu(:,:,jk,Kmm) = puu(:,:,jk,Kmm) * zwdlmtu(:,:) 155 pvv(:,:,jk,Kmm) = pvv(:,:,jk,Kmm) * zwdlmtv(:,:) 154 156 END DO 155 157 jflag = 0 … … 165 167 ! 166 168 DO jk = 1, jpkm1 ! Horizontal Flux in u and v direction 167 zflxu(:,:) = zflxu(:,:) + e3u _n(:,:,jk) * un(:,:,jk) * umask(:,:,jk)168 zflxv(:,:) = zflxv(:,:) + e3v _n(:,:,jk) * vn(:,:,jk) * vmask(:,:,jk)169 zflxu(:,:) = zflxu(:,:) + e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) * umask(:,:,jk) 170 zflxv(:,:) = zflxv(:,:) + e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) * vmask(:,:,jk) 169 171 END DO 170 172 zflxu(:,:) = zflxu(:,:) * e2u(:,:) … … 172 174 ! 173 175 wdmask(:,:) = 1._wp 174 DO jj = 2, jpj 175 DO ji = 2, jpi 176 ! 177 IF( tmask(ji,jj,1) < 0.5_wp ) CYCLE ! we don't care about land cells 178 IF( ht_0(ji,jj) - ssh_ref > zdepwd ) CYCLE ! and cells which are unlikely to dry 179 ! 180 zflxp(ji,jj) = MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj ) , 0._wp ) & 181 & + MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji, jj-1) , 0._wp ) 182 zflxn(ji,jj) = MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj ) , 0._wp ) & 183 & + MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji, jj-1) , 0._wp ) 184 ! 185 zdep2 = ht_0(ji,jj) + sshb1(ji,jj) - rn_wdmin1 186 IF( zdep2 <= 0._wp ) THEN ! add more safty, but not necessary 187 sshb1(ji,jj) = rn_wdmin1 - ht_0(ji,jj) 188 IF(zflxu(ji, jj) > 0._wp) zwdlmtu(ji ,jj) = 0._wp 189 IF(zflxu(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = 0._wp 190 IF(zflxv(ji, jj) > 0._wp) zwdlmtv(ji ,jj) = 0._wp 191 IF(zflxv(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = 0._wp 192 wdmask(ji,jj) = 0._wp 193 END IF 194 END DO 195 END DO 176 DO_2D( 0, 1, 0, 1 ) 177 ! 178 IF( tmask(ji,jj,1) < 0.5_wp ) CYCLE ! we don't care about land cells 179 IF( ht_0(ji,jj) - ssh_ref > zdepwd ) CYCLE ! and cells which are unlikely to dry 180 ! 181 zflxp(ji,jj) = MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj ) , 0._wp ) & 182 & + MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji, jj-1) , 0._wp ) 183 zflxn(ji,jj) = MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj ) , 0._wp ) & 184 & + MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji, jj-1) , 0._wp ) 185 ! 186 zdep2 = ht_0(ji,jj) + psshb1(ji,jj) - rn_wdmin1 187 IF( zdep2 <= 0._wp ) THEN ! add more safty, but not necessary 188 psshb1(ji,jj) = rn_wdmin1 - ht_0(ji,jj) 189 IF(zflxu(ji, jj) > 0._wp) zwdlmtu(ji ,jj) = 0._wp 190 IF(zflxu(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = 0._wp 191 IF(zflxv(ji, jj) > 0._wp) zwdlmtv(ji ,jj) = 0._wp 192 IF(zflxv(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = 0._wp 193 wdmask(ji,jj) = 0._wp 194 END IF 195 END_2D 196 196 ! 197 197 ! ! HPG limiter from jholt 198 wdramp(:,:) = min((ht_0(:,:) + sshb1(:,:) - rn_wdmin1)/(rn_wdmin0 - rn_wdmin1),1.0_wp)198 wdramp(:,:) = min((ht_0(:,:) + psshb1(:,:) - rn_wdmin1)/(rn_wdmin0 - rn_wdmin1),1.0_wp) 199 199 !jth assume don't need a lbc_lnk here 200 DO jj = 1, jpjm1 201 DO ji = 1, jpim1 202 wdrampu(ji,jj) = MIN( wdramp(ji,jj) , wdramp(ji+1,jj) ) 203 wdrampv(ji,jj) = MIN( wdramp(ji,jj) , wdramp(ji,jj+1) ) 204 END DO 205 END DO 200 DO_2D( 1, 0, 1, 0 ) 201 wdrampu(ji,jj) = MIN( wdramp(ji,jj) , wdramp(ji+1,jj) ) 202 wdrampv(ji,jj) = MIN( wdramp(ji,jj) , wdramp(ji,jj+1) ) 203 END_2D 206 204 ! ! end HPG limiter 207 205 ! … … 213 211 jflag = 0 ! flag indicating if any further iterations are needed 214 212 ! 215 DO jj = 2, jpj 216 DO ji = 2, jpi 217 IF( tmask(ji, jj, 1) < 0.5_wp ) CYCLE 218 IF( ht_0(ji,jj) > zdepwd ) CYCLE 219 ! 220 ztmp = e1e2t(ji,jj) 221 ! 222 zzflxp = MAX( zflxu1(ji,jj) , 0._wp ) - MIN( zflxu1(ji-1,jj ) , 0._wp) & 223 & + MAX( zflxv1(ji,jj) , 0._wp ) - MIN( zflxv1(ji, jj-1) , 0._wp) 224 zzflxn = MIN( zflxu1(ji,jj) , 0._wp ) - MAX( zflxu1(ji-1,jj ) , 0._wp) & 225 & + MIN( zflxv1(ji,jj) , 0._wp ) - MAX( zflxv1(ji, jj-1) , 0._wp) 226 ! 227 zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 228 zdep2 = ht_0(ji,jj) + sshb1(ji,jj) - rn_wdmin1 - z2dt * sshemp(ji,jj) 229 ! 230 IF( zdep1 > zdep2 ) THEN 231 wdmask(ji, jj) = 0._wp 232 zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 233 !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 234 ! flag if the limiter has been used but stop flagging if the only 235 ! changes have zeroed the coefficient since further iterations will 236 ! not change anything 237 IF( zcoef > 0._wp ) THEN ; jflag = 1 238 ELSE ; zcoef = 0._wp 239 ENDIF 240 IF( jk1 > nn_wdit ) zcoef = 0._wp 241 IF( zflxu1(ji ,jj ) > 0._wp ) zwdlmtu(ji ,jj ) = zcoef 242 IF( zflxu1(ji-1,jj ) < 0._wp ) zwdlmtu(ji-1,jj ) = zcoef 243 IF( zflxv1(ji ,jj ) > 0._wp ) zwdlmtv(ji ,jj ) = zcoef 244 IF( zflxv1(ji ,jj-1) < 0._wp ) zwdlmtv(ji ,jj-1) = zcoef 213 DO_2D( 0, 1, 0, 1 ) 214 IF( tmask(ji, jj, 1) < 0.5_wp ) CYCLE 215 IF( ht_0(ji,jj) > zdepwd ) CYCLE 216 ! 217 ztmp = e1e2t(ji,jj) 218 ! 219 zzflxp = MAX( zflxu1(ji,jj) , 0._wp ) - MIN( zflxu1(ji-1,jj ) , 0._wp) & 220 & + MAX( zflxv1(ji,jj) , 0._wp ) - MIN( zflxv1(ji, jj-1) , 0._wp) 221 zzflxn = MIN( zflxu1(ji,jj) , 0._wp ) - MAX( zflxu1(ji-1,jj ) , 0._wp) & 222 & + MIN( zflxv1(ji,jj) , 0._wp ) - MAX( zflxv1(ji, jj-1) , 0._wp) 223 ! 224 zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 225 zdep2 = ht_0(ji,jj) + psshb1(ji,jj) - rn_wdmin1 - z2dt * psshemp(ji,jj) 226 ! 227 IF( zdep1 > zdep2 ) THEN 228 wdmask(ji, jj) = 0._wp 229 zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 230 !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 231 ! flag if the limiter has been used but stop flagging if the only 232 ! changes have zeroed the coefficient since further iterations will 233 ! not change anything 234 IF( zcoef > 0._wp ) THEN ; jflag = 1 235 ELSE ; zcoef = 0._wp 245 236 ENDIF 246 END DO 247 END DO 248 CALL lbc_lnk_multi( 'wet_dry', zwdlmtu, 'U', 1., zwdlmtv, 'V', 1. ) 237 IF( jk1 > nn_wdit ) zcoef = 0._wp 238 IF( zflxu1(ji ,jj ) > 0._wp ) zwdlmtu(ji ,jj ) = zcoef 239 IF( zflxu1(ji-1,jj ) < 0._wp ) zwdlmtu(ji-1,jj ) = zcoef 240 IF( zflxv1(ji ,jj ) > 0._wp ) zwdlmtv(ji ,jj ) = zcoef 241 IF( zflxv1(ji ,jj-1) < 0._wp ) zwdlmtv(ji ,jj-1) = zcoef 242 ENDIF 243 END_2D 244 CALL lbc_lnk_multi( 'wet_dry', zwdlmtu, 'U', 1.0_wp, zwdlmtv, 'V', 1.0_wp ) 249 245 ! 250 246 CALL mpp_max('wet_dry', jflag) !max over the global domain … … 255 251 ! 256 252 DO jk = 1, jpkm1 257 un(:,:,jk) = un(:,:,jk) * zwdlmtu(:,:)258 vn(:,:,jk) = vn(:,:,jk) * zwdlmtv(:,:)253 puu(:,:,jk,Kmm) = puu(:,:,jk,Kmm) * zwdlmtu(:,:) 254 pvv(:,:,jk,Kmm) = pvv(:,:,jk,Kmm) * zwdlmtv(:,:) 259 255 END DO 260 u n_b(:,:) = un_b(:,:) * zwdlmtu(:, :)261 v n_b(:,:) = vn_b(:,:) * zwdlmtv(:, :)256 uu_b(:,:,Kmm) = uu_b(:,:,Kmm) * zwdlmtu(:, :) 257 vv_b(:,:,Kmm) = vv_b(:,:,Kmm) * zwdlmtv(:, :) 262 258 ! 263 259 !!gm TO BE SUPPRESSED ? these lbc_lnk are useless since zwdlmtu and zwdlmtv are defined everywhere ! 264 CALL lbc_lnk_multi( 'wet_dry', un , 'U', -1., vn , 'V', -1.)265 CALL lbc_lnk_multi( 'wet_dry', u n_b, 'U', -1., vn_b, 'V', -1.)260 CALL lbc_lnk_multi( 'wet_dry', puu(:,:,:,Kmm) , 'U', -1.0_wp, pvv(:,:,:,Kmm) , 'V', -1.0_wp ) 261 CALL lbc_lnk_multi( 'wet_dry', uu_b(:,:,Kmm), 'U', -1.0_wp, vv_b(:,:,Kmm), 'V', -1.0_wp ) 266 262 !!gm 267 263 ! 268 264 IF(jflag == 1 .AND. lwp) WRITE(numout,*) 'Need more iterations in wad_lmt!!!' 269 265 ! 270 !IF( ln_rnf ) CALL sbc_rnf_div( hdiv n ) ! runoffs (update hdivnfield)266 !IF( ln_rnf ) CALL sbc_rnf_div( hdiv ) ! runoffs (update hdiv field) 271 267 ! 272 268 IF( ln_timing ) CALL timing_stop('wad_lmt') ! … … 275 271 276 272 277 SUBROUTINE wad_lmt_bt( zflxu, zflxv, sshn_e, zssh_frc, r dtbt)273 SUBROUTINE wad_lmt_bt( zflxu, zflxv, sshn_e, zssh_frc, rDt_e ) 278 274 !!---------------------------------------------------------------------- 279 275 !! *** ROUTINE wad_lmt *** … … 285 281 !! ** Action : - calculate flux limiter and W/D flag 286 282 !!---------------------------------------------------------------------- 287 REAL(wp) , INTENT(in ) :: r dtbt! ocean time-step index283 REAL(wp) , INTENT(in ) :: rDt_e ! ocean time-step index 288 284 REAL(wp), DIMENSION(:,:), INTENT(inout) :: zflxu, zflxv, sshn_e, zssh_frc 289 285 ! … … 304 300 zdepwd = 50._wp ! maximum depth that ocean cells can have W/D processes 305 301 ! 306 z2dt = r dtbt302 z2dt = rDt_e 307 303 ! 308 304 zflxp(:,:) = 0._wp … … 311 307 zwdlmtv(:,:) = 1._wp 312 308 ! 313 DO jj = 2, jpj ! Horizontal Flux in u and v direction 314 DO ji = 2, jpi 315 ! 316 IF( tmask(ji, jj, 1 ) < 0.5_wp) CYCLE ! we don't care about land cells 317 IF( ht_0(ji,jj) > zdepwd ) CYCLE ! and cells which are unlikely to dry 318 ! 319 zflxp(ji,jj) = MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj ) , 0._wp ) & 320 & + MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji, jj-1) , 0._wp ) 321 zflxn(ji,jj) = MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj ) , 0._wp ) & 322 & + MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji, jj-1) , 0._wp ) 323 ! 324 zdep2 = ht_0(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 325 IF( zdep2 <= 0._wp ) THEN !add more safety, but not necessary 326 sshn_e(ji,jj) = rn_wdmin1 - ht_0(ji,jj) 327 IF( zflxu(ji ,jj ) > 0._wp) zwdlmtu(ji ,jj ) = 0._wp 328 IF( zflxu(ji-1,jj ) < 0._wp) zwdlmtu(ji-1,jj ) = 0._wp 329 IF( zflxv(ji ,jj ) > 0._wp) zwdlmtv(ji ,jj ) = 0._wp 330 IF( zflxv(ji ,jj-1) < 0._wp) zwdlmtv(ji ,jj-1) = 0._wp 331 ENDIF 332 END DO 333 END DO 309 DO_2D( 0, 1, 0, 1 ) 310 ! 311 IF( tmask(ji, jj, 1 ) < 0.5_wp) CYCLE ! we don't care about land cells 312 IF( ht_0(ji,jj) > zdepwd ) CYCLE ! and cells which are unlikely to dry 313 ! 314 zflxp(ji,jj) = MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj ) , 0._wp ) & 315 & + MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji, jj-1) , 0._wp ) 316 zflxn(ji,jj) = MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj ) , 0._wp ) & 317 & + MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji, jj-1) , 0._wp ) 318 ! 319 zdep2 = ht_0(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 320 IF( zdep2 <= 0._wp ) THEN !add more safety, but not necessary 321 sshn_e(ji,jj) = rn_wdmin1 - ht_0(ji,jj) 322 IF( zflxu(ji ,jj ) > 0._wp) zwdlmtu(ji ,jj ) = 0._wp 323 IF( zflxu(ji-1,jj ) < 0._wp) zwdlmtu(ji-1,jj ) = 0._wp 324 IF( zflxv(ji ,jj ) > 0._wp) zwdlmtv(ji ,jj ) = 0._wp 325 IF( zflxv(ji ,jj-1) < 0._wp) zwdlmtv(ji ,jj-1) = 0._wp 326 ENDIF 327 END_2D 334 328 ! 335 329 DO jk1 = 1, nn_wdit + 1 !! start limiter iterations … … 339 333 jflag = 0 ! flag indicating if any further iterations are needed 340 334 ! 341 DO jj = 2, jpj 342 DO ji = 2, jpi 343 ! 344 IF( tmask(ji, jj, 1 ) < 0.5_wp ) CYCLE 345 IF( ht_0(ji,jj) > zdepwd ) CYCLE 346 ! 347 ztmp = e1e2t(ji,jj) 348 ! 349 zzflxp = max(zflxu1(ji,jj), 0._wp) - min(zflxu1(ji-1,jj), 0._wp) & 350 & + max(zflxv1(ji,jj), 0._wp) - min(zflxv1(ji, jj-1), 0._wp) 351 zzflxn = min(zflxu1(ji,jj), 0._wp) - max(zflxu1(ji-1,jj), 0._wp) & 352 & + min(zflxv1(ji,jj), 0._wp) - max(zflxv1(ji, jj-1), 0._wp) 353 354 zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 355 zdep2 = ht_0(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 - z2dt * zssh_frc(ji,jj) 356 357 IF(zdep1 > zdep2) THEN 358 zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 359 !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 360 ! flag if the limiter has been used but stop flagging if the only 361 ! changes have zeroed the coefficient since further iterations will 362 ! not change anything 363 IF( zcoef > 0._wp ) THEN 364 jflag = 1 365 ELSE 366 zcoef = 0._wp 367 ENDIF 368 IF(jk1 > nn_wdit) zcoef = 0._wp 369 IF(zflxu1(ji, jj) > 0._wp) zwdlmtu(ji ,jj) = zcoef 370 IF(zflxu1(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = zcoef 371 IF(zflxv1(ji, jj) > 0._wp) zwdlmtv(ji ,jj) = zcoef 372 IF(zflxv1(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = zcoef 373 END IF 374 END DO ! ji loop 375 END DO ! jj loop 376 ! 377 CALL lbc_lnk_multi( 'wet_dry', zwdlmtu, 'U', 1., zwdlmtv, 'V', 1. ) 335 DO_2D( 0, 1, 0, 1 ) 336 ! 337 IF( tmask(ji, jj, 1 ) < 0.5_wp ) CYCLE 338 IF( ht_0(ji,jj) > zdepwd ) CYCLE 339 ! 340 ztmp = e1e2t(ji,jj) 341 ! 342 zzflxp = max(zflxu1(ji,jj), 0._wp) - min(zflxu1(ji-1,jj), 0._wp) & 343 & + max(zflxv1(ji,jj), 0._wp) - min(zflxv1(ji, jj-1), 0._wp) 344 zzflxn = min(zflxu1(ji,jj), 0._wp) - max(zflxu1(ji-1,jj), 0._wp) & 345 & + min(zflxv1(ji,jj), 0._wp) - max(zflxv1(ji, jj-1), 0._wp) 346 347 zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 348 zdep2 = ht_0(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 - z2dt * zssh_frc(ji,jj) 349 350 IF(zdep1 > zdep2) THEN 351 zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 352 !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 353 ! flag if the limiter has been used but stop flagging if the only 354 ! changes have zeroed the coefficient since further iterations will 355 ! not change anything 356 IF( zcoef > 0._wp ) THEN 357 jflag = 1 358 ELSE 359 zcoef = 0._wp 360 ENDIF 361 IF(jk1 > nn_wdit) zcoef = 0._wp 362 IF(zflxu1(ji, jj) > 0._wp) zwdlmtu(ji ,jj) = zcoef 363 IF(zflxu1(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = zcoef 364 IF(zflxv1(ji, jj) > 0._wp) zwdlmtv(ji ,jj) = zcoef 365 IF(zflxv1(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = zcoef 366 END IF 367 END_2D 368 ! 369 CALL lbc_lnk_multi( 'wet_dry', zwdlmtu, 'U', 1.0_wp, zwdlmtv, 'V', 1.0_wp ) 378 370 ! 379 371 CALL mpp_max('wet_dry', jflag) !max over the global domain … … 387 379 ! 388 380 !!gm THIS lbc_lnk is useless since it is already done at the end of the jk1-loop 389 CALL lbc_lnk_multi( 'wet_dry', zflxu, 'U', -1. , zflxv, 'V', -1.)381 CALL lbc_lnk_multi( 'wet_dry', zflxu, 'U', -1.0_wp, zflxv, 'V', -1.0_wp ) 390 382 !!gm end 391 383 ! 392 384 IF( jflag == 1 .AND. lwp ) WRITE(numout,*) 'Need more iterations in wad_lmt_bt!!!' 393 385 ! 394 !IF( ln_rnf ) CALL sbc_rnf_div( hdiv n ) ! runoffs (update hdivnfield)386 !IF( ln_rnf ) CALL sbc_rnf_div( hdiv ) ! runoffs (update hdiv field) 395 387 ! 396 388 IF( ln_timing ) CALL timing_stop('wad_lmt_bt') !
Note: See TracChangeset
for help on using the changeset viewer.