Changeset 10874
- Timestamp:
- 2019-04-15T15:57:37+02:00 (4 years ago)
- Location:
- NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src
- Files:
-
- 38 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DOM/dom_oce.F90
r10806 r10874 64 64 65 65 !!---------------------------------------------------------------------- 66 !! time level indices67 !!----------------------------------------------------------------------68 INTEGER, PUBLIC :: Nm1, Nnn, Np1, Nrhs, Nm1_2lev, Nnn_2lev69 70 !!----------------------------------------------------------------------71 66 !! space domain parameters 72 67 !!---------------------------------------------------------------------- … … 134 129 LOGICAL, PUBLIC :: ln_sco !: s-coordinate or hybrid z-s coordinate 135 130 LOGICAL, PUBLIC :: ln_isfcav !: presence of ISF 136 ! ! reference scale factors 137 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3t_0 !: t- vert. scale factor [m] 138 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3u_0 !: u- vert. scale factor [m] 139 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3v_0 !: v- vert. scale factor [m] 140 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3f_0 !: f- vert. scale factor [m] 141 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3w_0 !: w- vert. scale factor [m] 142 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3uw_0 !: uw-vert. scale factor [m] 143 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3vw_0 !: vw-vert. scale factor [m] 144 ! ! time-dependent scale factors 145 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:,:,:) :: e3t, e3u, e3v, e3w, e3uw, e3vw !: vert. scale factor [m] 146 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:,:) :: e3f !: F-point vert. scale factor [m] 147 148 ! ! reference depths of cells 149 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gdept_0 !: t- depth [m] 150 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gdepw_0 !: w- depth [m] 151 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gde3w_0 !: w- depth (sum of e3w) [m] 152 ! ! time-dependent depths of cells 153 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:,:,:) :: gdept, gdepw 154 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:,:) :: gde3w 131 ! ! ref. ! before ! now ! after ! 132 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3t_0 , e3t_b , e3t_n , e3t_a !: t- vert. scale factor [m] 133 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3u_0 , e3u_b , e3u_n , e3u_a !: u- vert. scale factor [m] 134 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3v_0 , e3v_b , e3v_n , e3v_a !: v- vert. scale factor [m] 135 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3f_0 , e3f_n !: f- vert. scale factor [m] 136 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3w_0 , e3w_b , e3w_n !: w- vert. scale factor [m] 137 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3uw_0 , e3uw_b , e3uw_n !: uw-vert. scale factor [m] 138 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3vw_0 , e3vw_b , e3vw_n !: vw-vert. scale factor [m] 139 140 ! ! ref. ! before ! now ! 141 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gdept_0 , gdept_b , gdept_n !: t- depth [m] 142 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gdepw_0 , gdepw_b , gdepw_n !: w- depth [m] 143 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gde3w_0 , gde3w_n !: w- depth (sum of e3w) [m] 155 144 156 145 ! ! ref. ! before ! now ! after ! … … 160 149 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: r1_hu_b , r1_hu_n , r1_hu_a !: inverse of u-depth [1/m] 161 150 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: r1_hv_b , r1_hv_n , r1_hv_a !: inverse of v-depth [1/m] 162 163 !! TEMPORARY POINTERS FOR DEVELOPMENT ONLY164 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: e3t_b , e3t_n , e3t_a !: t- vert. scale factor [m]165 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: e3u_b , e3u_n , e3u_a !: u- vert. scale factor [m]166 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: e3v_b , e3v_n , e3v_a !: v- vert. scale factor [m]167 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: e3f_n !: f- vert. scale factor [m]168 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: e3w_b , e3w_n !: w- vert. scale factor [m]169 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: e3uw_b , e3uw_n !: uw-vert. scale factor [m]170 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: e3vw_b , e3vw_n !: vw-vert. scale factor [m]171 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: gdept_b , gdept_n !: t- depth [m]172 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: gdepw_b , gdepw_n !: w- depth [m]173 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: gde3w_n !: w- depth (sum of e3w) [m]174 !! TEMPORARY POINTERS FOR DEVELOPMENT ONLY175 151 176 152 INTEGER, PUBLIC :: nla10 !: deepest W level Above ~10m (nlb10 - 1) … … 280 256 & ff_f (jpi,jpj) , ff_t (jpi,jpj) , STAT=ierr(3) ) 281 257 ! 282 ALLOCATE( gdept_0(jpi,jpj,jpk) , gdepw_0(jpi,jpj,jpk) , gde3w_0(jpi,jpj,jpk) , & 283 & gdept (jpi,jpj,jpk,jpt-1) , gdepw (jpi,jpj,jpk,jpt-1) , gde3w (jpi,jpj,jpk) , STAT=ierr(4) ) 284 ! 285 ALLOCATE( e3t_0(jpi,jpj,jpk) , e3u_0(jpi,jpj,jpk) , e3v_0(jpi,jpj,jpk) , e3f_0(jpi,jpj,jpk) , & 286 & e3w_0(jpi,jpj,jpk) , e3uw_0(jpi,jpj,jpk) , e3vw_0(jpi,jpj,jpk) , & 287 & e3t (jpi,jpj,jpk,jpt) , e3u (jpi,jpj,jpk,jpt) , e3v (jpi,jpj,jpk,jpt) , & 288 & e3w (jpi,jpj,jpk,jpt-1) , e3uw (jpi,jpj,jpk,jpt-1) , e3vw (jpi,jpj,jpk,jpt-1) , & 289 & e3f (jpi,jpj,jpk), STAT=ierr(5) ) 258 ALLOCATE( gdept_0(jpi,jpj,jpk) , gdepw_0(jpi,jpj,jpk) , gde3w_0(jpi,jpj,jpk) , & 259 & gdept_b(jpi,jpj,jpk) , gdepw_b(jpi,jpj,jpk) , & 260 & gdept_n(jpi,jpj,jpk) , gdepw_n(jpi,jpj,jpk) , gde3w_n(jpi,jpj,jpk) , STAT=ierr(4) ) 261 ! 262 ALLOCATE( e3t_0(jpi,jpj,jpk) , e3u_0(jpi,jpj,jpk) , e3v_0(jpi,jpj,jpk) , e3f_0(jpi,jpj,jpk) , e3w_0(jpi,jpj,jpk) , & 263 & e3t_b(jpi,jpj,jpk) , e3u_b(jpi,jpj,jpk) , e3v_b(jpi,jpj,jpk) , e3w_b(jpi,jpj,jpk) , & 264 & e3t_n(jpi,jpj,jpk) , e3u_n(jpi,jpj,jpk) , e3v_n(jpi,jpj,jpk) , e3f_n(jpi,jpj,jpk) , e3w_n(jpi,jpj,jpk) , & 265 & e3t_a(jpi,jpj,jpk) , e3u_a(jpi,jpj,jpk) , e3v_a(jpi,jpj,jpk) , & 266 ! ! 267 & e3uw_0(jpi,jpj,jpk) , e3vw_0(jpi,jpj,jpk) , & 268 & e3uw_b(jpi,jpj,jpk) , e3vw_b(jpi,jpj,jpk) , & 269 & e3uw_n(jpi,jpj,jpk) , e3vw_n(jpi,jpj,jpk) , STAT=ierr(5) ) 290 270 ! 291 271 ALLOCATE( ht_0(jpi,jpj) , hu_0(jpi,jpj) , hv_0(jpi,jpj) , & -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DYN/dynadv.F90
r10789 r10874 53 53 CONTAINS 54 54 55 SUBROUTINE dyn_adv( kt , ktlev1, ktlev2, pu_rhs, pv_rhs)55 SUBROUTINE dyn_adv( kt ) 56 56 !!--------------------------------------------------------------------- 57 57 !! *** ROUTINE dyn_adv *** … … 67 67 !!---------------------------------------------------------------------- 68 68 INTEGER, INTENT( in ) :: kt ! ocean time-step index 69 INTEGER, INTENT( in ) :: ktlev1, ktlev2 ! time level indices for source terms70 REAL(wp), INTENT( inout), DIMENSION(jpi,jpj,jpk) :: pu_rhs, pv_rhs ! momentum trends71 69 !!---------------------------------------------------------------------- 72 70 ! … … 75 73 SELECT CASE( n_dynadv ) !== compute advection trend and add it to general trend ==! 76 74 CASE( np_VEC_c2 ) 77 CALL dyn_keg ( kt, ktlev2, nn_dynkeg, pu_rhs, pv_rhs) ! vector form : horizontal gradient of kinetic energy78 CALL dyn_zad ( kt , ktlev2, pu_rhs, pv_rhs )! vector form : vertical advection75 CALL dyn_keg ( kt, nn_dynkeg ) ! vector form : horizontal gradient of kinetic energy 76 CALL dyn_zad ( kt ) ! vector form : vertical advection 79 77 CASE( np_FLX_c2 ) 80 CALL dyn_adv_cen2( kt , ktlev2, pu_rhs, pv_rhs )! 2nd order centered scheme78 CALL dyn_adv_cen2( kt ) ! 2nd order centered scheme 81 79 CASE( np_FLX_ubs ) 82 CALL dyn_adv_ubs ( kt , ktlev1, ktlev2, pu_rhs, pv_rhs) ! 3rd order UBS scheme (UP3)80 CALL dyn_adv_ubs ( kt ) ! 3rd order UBS scheme (UP3) 83 81 END SELECT 84 82 ! -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DYN/dynadv_cen2.F90
r10789 r10874 35 35 CONTAINS 36 36 37 SUBROUTINE dyn_adv_cen2( kt , ktlev, pu_rhs, pv_rhs)37 SUBROUTINE dyn_adv_cen2( kt ) 38 38 !!---------------------------------------------------------------------- 39 39 !! *** ROUTINE dyn_adv_cen2 *** … … 44 44 !! ** Method : Trend evaluated using now fields (centered in time) 45 45 !! 46 !! ** Action : ( pu_rhs,pv_rhs) updated with the now vorticity term trend46 !! ** Action : (ua,va) updated with the now vorticity term trend 47 47 !!---------------------------------------------------------------------- 48 INTEGER, INTENT( in ) :: kt ! ocean time-step index 49 INTEGER, INTENT( in ) :: ktlev ! time level index for source terms 50 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pu_rhs, pv_rhs ! momentum trends 48 INTEGER, INTENT( in ) :: kt ! ocean time-step index 51 49 ! 52 50 INTEGER :: ji, jj, jk ! dummy loop indices … … 62 60 ! 63 61 IF( l_trddyn ) THEN ! trends: store the input trends 64 zfu_uw(:,:,:) = pu_rhs(:,:,:)65 zfv_vw(:,:,:) = pv_rhs(:,:,:)62 zfu_uw(:,:,:) = ua(:,:,:) 63 zfv_vw(:,:,:) = va(:,:,:) 66 64 ENDIF 67 65 ! … … 69 67 ! 70 68 DO jk = 1, jpkm1 ! horizontal transport 71 zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u (:,:,jk,ktlev) * uu(:,:,jk,ktlev)72 zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v (:,:,jk,ktlev) * vv(:,:,jk,ktlev)69 zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u_n(:,:,jk) * un(:,:,jk) 70 zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 73 71 DO jj = 1, jpjm1 ! horizontal momentum fluxes (at T- and F-point) 74 72 DO ji = 1, fs_jpim1 ! vector opt. 75 zfu_t(ji+1,jj ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj,jk) ) * ( u u(ji,jj,jk,ktlev) + uu(ji+1,jj ,jk,ktlev) )76 zfv_f(ji ,jj ,jk) = ( zfv(ji,jj,jk) + zfv(ji+1,jj,jk) ) * ( u u(ji,jj,jk,ktlev) + uu(ji ,jj+1,jk,ktlev) )77 zfu_f(ji ,jj ,jk) = ( zfu(ji,jj,jk) + zfu(ji,jj+1,jk) ) * ( v v(ji,jj,jk,ktlev) + vv(ji+1,jj ,jk,ktlev) )78 zfv_t(ji ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji,jj+1,jk) ) * ( v v(ji,jj,jk,ktlev) + vv(ji ,jj+1,jk,ktlev) )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) ) 79 77 END DO 80 78 END DO 81 79 DO jj = 2, jpjm1 ! divergence of horizontal momentum fluxes 82 80 DO ji = fs_2, fs_jpim1 ! vector opt. 83 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) - ( zfu_t(ji+1,jj,jk) - zfu_t(ji,jj ,jk) &84 & + zfv_f(ji ,jj,jk) - zfv_f(ji,jj-1,jk) ) * r1_e1e2u(ji,jj) / e3u (ji,jj,jk,ktlev)85 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - ( zfu_f(ji,jj ,jk) - zfu_f(ji-1,jj,jk) &86 & + zfv_t(ji,jj+1,jk) - zfv_t(ji ,jj,jk) ) * r1_e1e2v(ji,jj) / e3v (ji,jj,jk,ktlev)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) 87 85 END DO 88 86 END DO … … 90 88 ! 91 89 IF( l_trddyn ) THEN ! trends: send trend to trddyn for diagnostic 92 zfu_uw(:,:,:) = pu_rhs(:,:,:) - zfu_uw(:,:,:)93 zfv_vw(:,:,:) = pv_rhs(:,:,:) - zfv_vw(:,:,:)90 zfu_uw(:,:,:) = ua(:,:,:) - zfu_uw(:,:,:) 91 zfv_vw(:,:,:) = va(:,:,:) - zfv_vw(:,:,:) 94 92 CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt ) 95 zfu_t(:,:,:) = pu_rhs(:,:,:)96 zfv_t(:,:,:) = pv_rhs(:,:,:)93 zfu_t(:,:,:) = ua(:,:,:) 94 zfv_t(:,:,:) = va(:,:,:) 97 95 ENDIF 98 96 ! … … 108 106 DO jj = 2, jpjm1 109 107 DO ji = fs_2, fs_jpim1 110 zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * w w(ji,jj,1) + e1e2t(ji+1,jj) * ww(ji+1,jj,1) ) * uu(ji,jj,1,ktlev)111 zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * w w(ji,jj,1) + e1e2t(ji,jj+1) * ww(ji,jj+1,1) ) * vv(ji,jj,1,ktlev)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) 112 110 END DO 113 111 END DO … … 116 114 DO jj = 2, jpj ! 1/4 * Vertical transport 117 115 DO ji = 2, jpi 118 zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * w w(ji,jj,jk)116 zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk) 119 117 END DO 120 118 END DO 121 119 DO jj = 2, jpjm1 122 120 DO ji = fs_2, fs_jpim1 ! vector opt. 123 zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji+1,jj ,jk) ) * ( u u(ji,jj,jk,ktlev) + uu(ji,jj,jk-1,ktlev) )124 zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji ,jj+1,jk) ) * ( v v(ji,jj,jk,ktlev) + vv(ji,jj,jk-1,ktlev) )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) ) 125 123 END DO 126 124 END DO … … 129 127 DO jj = 2, jpjm1 130 128 DO ji = fs_2, fs_jpim1 ! vector opt. 131 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,ktlev)132 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,ktlev)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) 133 131 END DO 134 132 END DO … … 136 134 ! 137 135 IF( l_trddyn ) THEN ! trends: send trend to trddyn for diagnostic 138 zfu_t(:,:,:) = pu_rhs(:,:,:) - zfu_t(:,:,:)139 zfv_t(:,:,:) = pv_rhs(:,:,:) - zfv_t(:,:,:)136 zfu_t(:,:,:) = ua(:,:,:) - zfu_t(:,:,:) 137 zfv_t(:,:,:) = va(:,:,:) - zfv_t(:,:,:) 140 138 CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt ) 141 139 ENDIF -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DYN/dynadv_ubs.F90
r10802 r10874 41 41 CONTAINS 42 42 43 SUBROUTINE dyn_adv_ubs( kt , ktlev1, ktlev2, pu_rhs, pv_rhs)43 SUBROUTINE dyn_adv_ubs( kt ) 44 44 !!---------------------------------------------------------------------- 45 45 !! *** ROUTINE dyn_adv_ubs *** … … 64 64 !! gamma1=1/3 and gamma2=1/32. 65 65 !! 66 !! ** Action : - ( pu_rhs,pv_rhs) updated with the 3D advective momentum trends66 !! ** Action : - (ua,va) updated with the 3D advective momentum trends 67 67 !! 68 68 !! Reference : Shchepetkin & McWilliams, 2005, Ocean Modelling. 69 69 !!---------------------------------------------------------------------- 70 INTEGER, INTENT(in) :: kt ! ocean time-step index 71 INTEGER, INTENT(in) :: ktlev1, ktlev2 ! time level indices for source terms 72 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pu_rhs, pv_rhs ! momentum trends 70 INTEGER, INTENT(in) :: kt ! ocean time-step index 73 71 ! 74 72 INTEGER :: ji, jj, jk ! dummy loop indices … … 97 95 ! 98 96 IF( l_trddyn ) THEN ! trends: store the input trends 99 zfu_uw(:,:,:) = pu_rhs(:,:,:)100 zfv_vw(:,:,:) = pv_rhs(:,:,:)97 zfu_uw(:,:,:) = ua(:,:,:) 98 zfv_vw(:,:,:) = va(:,:,:) 101 99 ENDIF 102 100 ! ! =========================== ! … … 104 102 ! ! =========================== ! 105 103 ! ! horizontal volume fluxes 106 zfu(:,:,jk) = e2u(:,:) * e3u (:,:,jk,ktlev2) * uu(:,:,jk,ktlev2)107 zfv(:,:,jk) = e1v(:,:) * e3v (:,:,jk,ktlev2) * vv(:,:,jk,ktlev2)104 zfu(:,:,jk) = e2u(:,:) * e3u_n(:,:,jk) * un(:,:,jk) 105 zfv(:,:,jk) = e1v(:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 108 106 ! 109 107 DO jj = 2, jpjm1 ! laplacian 110 108 DO ji = fs_2, fs_jpim1 ! vector opt. 111 zlu_uu(ji,jj,jk,1) = ( u u (ji+1,jj ,jk,ktlev1) - 2.*uu (ji,jj,jk,ktlev1) + uu (ji-1,jj ,jk,ktlev1) ) * umask(ji,jj,jk)112 zlv_vv(ji,jj,jk,1) = ( v v (ji ,jj+1,jk,ktlev1) - 2.*vv (ji,jj,jk,ktlev1) + vv (ji ,jj-1,jk,ktlev1) ) * vmask(ji,jj,jk)113 zlu_uv(ji,jj,jk,1) = ( u u (ji ,jj+1,jk,ktlev1) - uu (ji ,jj ,jk,ktlev1) ) * fmask(ji ,jj ,jk) &114 & - ( u u (ji ,jj ,jk,ktlev1) - uu (ji ,jj-1,jk,ktlev1) ) * fmask(ji ,jj-1,jk)115 zlv_vu(ji,jj,jk,1) = ( v v (ji+1,jj ,jk,ktlev1) - vv (ji ,jj ,jk,ktlev1) ) * fmask(ji ,jj ,jk) &116 & - ( v v (ji ,jj ,jk,ktlev1) - vv (ji-1,jj ,jk,ktlev1) ) * fmask(ji-1,jj ,jk)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) 117 115 ! 118 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) … … 134 132 DO jk = 1, jpkm1 ! ====================== ! 135 133 ! ! horizontal volume fluxes 136 zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u (:,:,jk,ktlev2) * uu(:,:,jk,ktlev2)137 zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v (:,:,jk,ktlev2) * vv(:,:,jk,ktlev2)134 zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u_n(:,:,jk) * un(:,:,jk) 135 zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 138 136 ! 139 137 DO jj = 1, jpjm1 ! horizontal momentum fluxes at T- and F-point 140 138 DO ji = 1, fs_jpim1 ! vector opt. 141 zui = ( u u(ji,jj,jk,ktlev2) + uu(ji+1,jj ,jk,ktlev2) )142 zvj = ( v v(ji,jj,jk,ktlev2) + vv(ji ,jj+1,jk,ktlev2) )139 zui = ( un(ji,jj,jk) + un(ji+1,jj ,jk) ) 140 zvj = ( vn(ji,jj,jk) + vn(ji ,jj+1,jk) ) 143 141 ! 144 142 IF( zui > 0 ) THEN ; zl_u = zlu_uu(ji ,jj,jk,1) … … 166 164 ! 167 165 zfv_f(ji ,jj ,jk) = ( zfvi - gamma2 * ( zlv_vu(ji,jj,jk,2) + zlv_vu(ji+1,jj ,jk,2) ) ) & 168 & * ( u u(ji,jj,jk,ktlev2) + uu(ji ,jj+1,jk,ktlev2) - gamma1 * zl_u )166 & * ( un(ji,jj,jk) + un(ji ,jj+1,jk) - gamma1 * zl_u ) 169 167 zfu_f(ji ,jj ,jk) = ( zfuj - gamma2 * ( zlu_uv(ji,jj,jk,2) + zlu_uv(ji ,jj+1,jk,2) ) ) & 170 & * ( v v(ji,jj,jk,ktlev2) + vv(ji+1,jj ,jk,ktlev2) - gamma1 * zl_v )168 & * ( vn(ji,jj,jk) + vn(ji+1,jj ,jk) - gamma1 * zl_v ) 171 169 END DO 172 170 END DO 173 171 DO jj = 2, jpjm1 ! divergence of horizontal momentum fluxes 174 172 DO ji = fs_2, fs_jpim1 ! vector opt. 175 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) - ( zfu_t(ji+1,jj,jk) - zfu_t(ji,jj ,jk) &176 & + zfv_f(ji ,jj,jk) - zfv_f(ji,jj-1,jk) ) * r1_e1e2u(ji,jj) / e3u (ji,jj,jk,ktlev2)177 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - ( zfu_f(ji,jj ,jk) - zfu_f(ji-1,jj,jk) &178 & + zfv_t(ji,jj+1,jk) - zfv_t(ji ,jj,jk) ) * r1_e1e2v(ji,jj) / e3v (ji,jj,jk,ktlev2)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) 179 177 END DO 180 178 END DO 181 179 END DO 182 180 IF( l_trddyn ) THEN ! trends: send trends to trddyn for diagnostic 183 zfu_uw(:,:,:) = pu_rhs(:,:,:) - zfu_uw(:,:,:)184 zfv_vw(:,:,:) = pv_rhs(:,:,:) - zfv_vw(:,:,:)181 zfu_uw(:,:,:) = ua(:,:,:) - zfu_uw(:,:,:) 182 zfv_vw(:,:,:) = va(:,:,:) - zfv_vw(:,:,:) 185 183 CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt ) 186 zfu_t(:,:,:) = pu_rhs(:,:,:)187 zfv_t(:,:,:) = pv_rhs(:,:,:)184 zfu_t(:,:,:) = ua(:,:,:) 185 zfv_t(:,:,:) = va(:,:,:) 188 186 ENDIF 189 187 ! ! ==================== ! … … 201 199 DO jj = 2, jpjm1 202 200 DO ji = fs_2, fs_jpim1 203 zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * w w(ji,jj,1) + e1e2t(ji+1,jj) * ww(ji+1,jj,1) ) * uu(ji,jj,1,ktlev2)204 zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * w w(ji,jj,1) + e1e2t(ji,jj+1) * ww(ji,jj+1,1) ) * vv(ji,jj,1,ktlev2)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) 205 203 END DO 206 204 END DO … … 209 207 DO jj = 2, jpj 210 208 DO ji = 2, jpi 211 zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * w w(ji,jj,jk)209 zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk) 212 210 END DO 213 211 END DO 214 212 DO jj = 2, jpjm1 215 213 DO ji = fs_2, fs_jpim1 ! vector opt. 216 zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji+1,jj,jk) ) * ( u u(ji,jj,jk,ktlev2) + uu(ji,jj,jk-1,ktlev2) )217 zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji,jj+1,jk) ) * ( v v(ji,jj,jk,ktlev2) + vv(ji,jj,jk-1,ktlev2) )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) ) 218 216 END DO 219 217 END DO … … 222 220 DO jj = 2, jpjm1 223 221 DO ji = fs_2, fs_jpim1 ! vector opt. 224 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,ktlev2)225 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,ktlev2)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) 226 224 END DO 227 225 END DO … … 229 227 ! 230 228 IF( l_trddyn ) THEN ! save the vertical advection trend for diagnostic 231 zfu_t(:,:,:) = pu_rhs(:,:,:) - zfu_t(:,:,:)232 zfv_t(:,:,:) = pv_rhs(:,:,:) - zfv_t(:,:,:)229 zfu_t(:,:,:) = ua(:,:,:) - zfu_t(:,:,:) 230 zfv_t(:,:,:) = va(:,:,:) - zfv_t(:,:,:) 233 231 CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt ) 234 232 ENDIF -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DYN/dynkeg.F90
r10789 r10874 44 44 CONTAINS 45 45 46 SUBROUTINE dyn_keg( kt, k tlev, kscheme, pu_rhs, pv_rhs)46 SUBROUTINE dyn_keg( kt, kscheme ) 47 47 !!---------------------------------------------------------------------- 48 48 !! *** ROUTINE dyn_keg *** … … 54 54 !! ** Method : * kscheme = nkeg_C2 : 2nd order centered scheme that 55 55 !! conserve kinetic energy. Compute the now horizontal kinetic energy 56 !! zhke = 1/2 [ mi-1( u u(:,:,:,ktlev)^2 ) + mj-1( vv(:,:,:,ktlev)^2 ) ]56 !! zhke = 1/2 [ mi-1( un^2 ) + mj-1( vn^2 ) ] 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 * u u(:,:,:,ktlev)^2 + ((uu(j+1,ktlev)+uu(j-1,ktlev))/2)^2 )60 !! + mj-1( 2 * v v(:,:,:,ktlev)^2 + ((vv(i+1,ktlev)+vv(i-1,ktlev))/2)^2 ) ]59 !! zhke = 1/6 [ mi-1( 2 * un^2 + ((un(j+1)+un(j-1))/2)^2 ) 60 !! + mj-1( 2 * vn^2 + ((vn(i+1)+vn(i-1))/2)^2 ) ] 61 61 !! 62 62 !! Take its horizontal gradient and add it to the general momentum 63 !! trend ( pu_rhs,pv_rhs).64 !! pu_rhs = pu_rhs- 1/e1u di[ zhke ]65 !! pv_rhs = pv_rhs- 1/e2v dj[ zhke ]63 !! trend (ua,va). 64 !! ua = ua - 1/e1u di[ zhke ] 65 !! va = va - 1/e2v dj[ zhke ] 66 66 !! 67 !! ** Action : - Update the ( pu_rhs, pv_rhs) with the hor. ke gradient trend67 !! ** Action : - Update the (ua, va) with the hor. ke gradient trend 68 68 !! - send this trends to trd_dyn (l_trddyn=T) for post-processing 69 69 !! … … 72 72 !!---------------------------------------------------------------------- 73 73 INTEGER, INTENT( in ) :: kt ! ocean time-step index 74 INTEGER, INTENT( in ) :: ktlev ! time level index for source terms75 74 INTEGER, INTENT( in ) :: kscheme ! =0/1 type of KEG scheme 76 REAL(wp), INTENT( inout), DIMENSION(jpi,jpj,jpk) :: pu_rhs, pv_rhs ! momentum trends77 75 ! 78 76 INTEGER :: ji, jj, jk, jb ! dummy loop indices … … 94 92 IF( l_trddyn ) THEN ! Save the input trends 95 93 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 96 ztrdu(:,:,:) = pu_rhs(:,:,:)97 ztrdv(:,:,:) = pv_rhs(:,:,:)94 ztrdu(:,:,:) = ua(:,:,:) 95 ztrdv(:,:,:) = va(:,:,:) 98 96 ENDIF 99 97 … … 111 109 ij = idx_bdy(ib_bdy)%nbj(jb,igrd) 112 110 ifu = NINT( idx_bdy(ib_bdy)%flagu(jb,igrd) ) 113 u u(ii-ifu,ij,jk,ktlev) = uu(ii,ij,jk,ktlev) * umask(ii,ij,jk)111 un(ii-ifu,ij,jk) = un(ii,ij,jk) * umask(ii,ij,jk) 114 112 END DO 115 113 END DO … … 121 119 ij = idx_bdy(ib_bdy)%nbj(jb,igrd) 122 120 ifv = NINT( idx_bdy(ib_bdy)%flagv(jb,igrd) ) 123 v v(ii,ij-ifv,jk,ktlev) = vv(ii,ij,jk,ktlev) * vmask(ii,ij,jk)121 vn(ii,ij-ifv,jk) = vn(ii,ij,jk) * vmask(ii,ij,jk) 124 122 END DO 125 123 END DO … … 134 132 DO jj = 2, jpj 135 133 DO ji = fs_2, jpi ! vector opt. 136 zu = u u(ji-1,jj ,jk,ktlev) * uu(ji-1,jj ,jk,ktlev) &137 & + u u(ji ,jj ,jk,ktlev) * uu(ji ,jj ,jk,ktlev)138 zv = v v(ji ,jj-1,jk,ktlev) * vv(ji ,jj-1,jk,ktlev) &139 & + v v(ji ,jj ,jk,ktlev) * vv(ji ,jj ,jk,ktlev)134 zu = un(ji-1,jj ,jk) * un(ji-1,jj ,jk) & 135 & + un(ji ,jj ,jk) * un(ji ,jj ,jk) 136 zv = vn(ji ,jj-1,jk) * vn(ji ,jj-1,jk) & 137 & + vn(ji ,jj ,jk) * vn(ji ,jj ,jk) 140 138 zhke(ji,jj,jk) = 0.25_wp * ( zv + zu ) 141 139 END DO … … 147 145 DO jj = 2, jpjm1 148 146 DO ji = fs_2, jpim1 ! vector opt. 149 zu = 8._wp * ( u u(ji-1,jj ,jk,ktlev) * uu(ji-1,jj ,jk,ktlev) &150 & + u u(ji ,jj ,jk,ktlev) * uu(ji ,jj ,jk,ktlev) ) &151 & + ( u u(ji-1,jj-1,jk,ktlev) + uu(ji-1,jj+1,jk,ktlev) ) * ( uu(ji-1,jj-1,jk,ktlev) + uu(ji-1,jj+1,jk,ktlev) ) &152 & + ( u u(ji ,jj-1,jk,ktlev) + uu(ji ,jj+1,jk,ktlev) ) * ( uu(ji ,jj-1,jk,ktlev) + uu(ji ,jj+1,jk,ktlev) )147 zu = 8._wp * ( un(ji-1,jj ,jk) * un(ji-1,jj ,jk) & 148 & + un(ji ,jj ,jk) * un(ji ,jj ,jk) ) & 149 & + ( un(ji-1,jj-1,jk) + un(ji-1,jj+1,jk) ) * ( un(ji-1,jj-1,jk) + un(ji-1,jj+1,jk) ) & 150 & + ( un(ji ,jj-1,jk) + un(ji ,jj+1,jk) ) * ( un(ji ,jj-1,jk) + un(ji ,jj+1,jk) ) 153 151 ! 154 zv = 8._wp * ( v v(ji ,jj-1,jk,ktlev) * vv(ji ,jj-1,jk,ktlev) &155 & + v v(ji ,jj ,jk,ktlev) * vv(ji ,jj ,jk,ktlev) ) &156 & + ( v v(ji-1,jj-1,jk,ktlev) + vv(ji+1,jj-1,jk,ktlev) ) * ( vv(ji-1,jj-1,jk,ktlev) + vv(ji+1,jj-1,jk,ktlev) ) &157 & + ( v v(ji-1,jj ,jk,ktlev) + vv(ji+1,jj ,jk,ktlev) ) * ( vv(ji-1,jj ,jk,ktlev) + vv(ji+1,jj ,jk,ktlev) )152 zv = 8._wp * ( vn(ji ,jj-1,jk) * vn(ji ,jj-1,jk) & 153 & + vn(ji ,jj ,jk) * vn(ji ,jj ,jk) ) & 154 & + ( vn(ji-1,jj-1,jk) + vn(ji+1,jj-1,jk) ) * ( vn(ji-1,jj-1,jk) + vn(ji+1,jj-1,jk) ) & 155 & + ( vn(ji-1,jj ,jk) + vn(ji+1,jj ,jk) ) * ( vn(ji-1,jj ,jk) + vn(ji+1,jj ,jk) ) 158 156 zhke(ji,jj,jk) = r1_48 * ( zv + zu ) 159 157 END DO … … 166 164 IF (ln_bdy) THEN 167 165 ! restore velocity masks at points outside boundary 168 u u(:,:,:,ktlev) = uu(:,:,:,ktlev) * umask(:,:,:)169 v v(:,:,:,ktlev) = vv(:,:,:,ktlev) * vmask(:,:,:)166 un(:,:,:) = un(:,:,:) * umask(:,:,:) 167 vn(:,:,:) = vn(:,:,:) * vmask(:,:,:) 170 168 ENDIF 171 169 … … 174 172 DO jj = 2, jpjm1 175 173 DO ji = fs_2, fs_jpim1 ! vector opt. 176 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) - ( zhke(ji+1,jj ,jk) - zhke(ji,jj,jk) ) / e1u(ji,jj)177 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - ( zhke(ji ,jj+1,jk) - zhke(ji,jj,jk) ) / e2v(ji,jj)174 ua(ji,jj,jk) = ua(ji,jj,jk) - ( zhke(ji+1,jj ,jk) - zhke(ji,jj,jk) ) / e1u(ji,jj) 175 va(ji,jj,jk) = va(ji,jj,jk) - ( zhke(ji ,jj+1,jk) - zhke(ji,jj,jk) ) / e2v(ji,jj) 178 176 END DO 179 177 END DO … … 181 179 ! 182 180 IF( l_trddyn ) THEN ! save the Kinetic Energy trends for diagnostic 183 ztrdu(:,:,:) = pu_rhs(:,:,:) - ztrdu(:,:,:)184 ztrdv(:,:,:) = pv_rhs(:,:,:) - ztrdv(:,:,:)181 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 182 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 185 183 CALL trd_dyn( ztrdu, ztrdv, jpdyn_keg, kt ) 186 184 DEALLOCATE( ztrdu , ztrdv ) -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DYN/dynldf.F90
r10806 r10874 43 43 CONTAINS 44 44 45 SUBROUTINE dyn_ldf( kt , ktlev1, ktlev2, pu_rhs, pv_rhs)45 SUBROUTINE dyn_ldf( kt ) 46 46 !!---------------------------------------------------------------------- 47 47 !! *** ROUTINE dyn_ldf *** … … 49 49 !! ** Purpose : compute the lateral ocean dynamics physics. 50 50 !!---------------------------------------------------------------------- 51 INTEGER, INTENT(in) :: kt ! ocean time-step index 52 INTEGER, INTENT(in) :: ktlev1, ktlev2 ! time level index for source terms 53 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pu_rhs, pv_rhs ! momentum trends 51 INTEGER, INTENT(in) :: kt ! ocean time-step index 54 52 ! 55 53 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv … … 60 58 IF( l_trddyn ) THEN ! temporary save of momentum trends 61 59 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 62 ztrdu(:,:,:) = pu_rhs(:,:,:)63 ztrdv(:,:,:) = pv_rhs(:,:,:)60 ztrdu(:,:,:) = ua(:,:,:) 61 ztrdv(:,:,:) = va(:,:,:) 64 62 ENDIF 65 63 66 64 SELECT CASE ( nldf_dyn ) ! compute lateral mixing trend and add it to the general trend 67 65 ! 68 CASE ( np_lap ) ; CALL dyn_ldf_lap( kt, ktlev1, ktlev2, uu(:,:,:,ktlev1), vv(:,:,:,ktlev1), pu_rhs, pv_rhs, 1 ) ! iso-level laplacian66 CASE ( np_lap ) ; CALL dyn_ldf_lap( kt, ub, vb, ua, va, 1 ) ! iso-level laplacian 69 67 CASE ( np_lap_i ) ; CALL dyn_ldf_iso( kt ) ! rotated laplacian 70 CASE ( np_blp ) ; CALL dyn_ldf_blp( kt, ktlev1, ktlev2, uu(:,:,:,ktlev1), vv(:,:,:,ktlev1), pu_rhs, pv_rhs) ! iso-level bi-laplacian68 CASE ( np_blp ) ; CALL dyn_ldf_blp( kt, ub, vb, ua, va ) ! iso-level bi-laplacian 71 69 ! 72 70 END SELECT 73 71 74 72 IF( l_trddyn ) THEN ! save the horizontal diffusive trends for further diagnostics 75 ztrdu(:,:,:) = pu_rhs(:,:,:) - ztrdu(:,:,:)76 ztrdv(:,:,:) = pv_rhs(:,:,:) - ztrdv(:,:,:)73 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 74 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 77 75 CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt ) 78 76 DEALLOCATE ( ztrdu , ztrdv ) -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DYN/dynldf_lap_blp.F90
r10806 r10874 35 35 CONTAINS 36 36 37 SUBROUTINE dyn_ldf_lap( kt, ktlev1, ktlev2, pu, pv, pu_rhs, pva_rhs, kpass )37 SUBROUTINE dyn_ldf_lap( kt, pub, pvb, pua, pva, kpass ) 38 38 !!---------------------------------------------------------------------- 39 39 !! *** ROUTINE dyn_ldf_lap *** … … 45 45 !! writen as : grad_h( ahmt div_h(U )) - curl_h( ahmf curl_z(U) ) 46 46 !! 47 !! ** Action : - pu _rhs, pva_rhs increased by the harmonic operator applied on pu, pv.47 !! ** Action : - pua, pva increased by the harmonic operator applied on pub, pvb. 48 48 !!---------------------------------------------------------------------- 49 INTEGER , INTENT(in ) :: kt ! ocean time-step index 50 INTEGER , INTENT(in ) :: ktlev1, ktlev2 ! time level index for scale factors 49 INTEGER , INTENT(in ) :: kt ! ocean time-step index 51 50 INTEGER , INTENT(in ) :: kpass ! =1/2 first or second passage 52 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pu , pv! before velocity [m/s]53 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu _rhs, pva_rhs! velocity trend [m/s2]51 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pub, pvb ! before velocity [m/s] 52 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pua, pva ! velocity trend [m/s2] 54 53 ! 55 54 INTEGER :: ji, jj, jk ! dummy loop indices … … 77 76 !!gm open question here : e3f at before or now ? probably now... 78 77 !!gm note that ahmf has already been multiplied by fmask 79 zcur(ji-1,jj-1) = ahmf(ji-1,jj-1,jk) * e3f (ji-1,jj-1,jk) * r1_e1e2f(ji-1,jj-1) &80 & * ( e2v(ji ,jj-1) * pv (ji ,jj-1,jk) - e2v(ji-1,jj-1) * pv(ji-1,jj-1,jk) &81 & - e1u(ji-1,jj ) * pu (ji-1,jj ,jk) + e1u(ji-1,jj-1) * pu(ji-1,jj-1,jk) )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) ) 82 81 ! ! ahm * div (computed from 2 to jpi/jpj) 83 82 !!gm note that ahmt has already been multiplied by tmask 84 zdiv(ji,jj) = ahmt(ji,jj,jk) * r1_e1e2t(ji,jj) / e3t (ji,jj,jk,ktlev1) &85 & * ( e2u(ji,jj)*e3u (ji,jj,jk,ktlev1) * pu(ji,jj,jk) - e2u(ji-1,jj)*e3u(ji-1,jj,jk,ktlev1) * pu(ji-1,jj,jk) &86 & + e1v(ji,jj)*e3v (ji,jj,jk,ktlev1) * pv(ji,jj,jk) - e1v(ji,jj-1)*e3v(ji,jj-1,jk,ktlev1) * pv(ji,jj-1,jk) )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) ) 87 86 END DO 88 87 END DO … … 90 89 DO jj = 2, jpjm1 ! - curl( curl) + grad( div ) 91 90 DO ji = fs_2, fs_jpim1 ! vector opt. 92 pu _rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zsign * ( &93 & - ( zcur(ji ,jj) - zcur(ji,jj-1) ) * r1_e2u(ji,jj) / e3u (ji,jj,jk,ktlev2) &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) & 94 93 & + ( zdiv(ji+1,jj) - zdiv(ji,jj ) ) * r1_e1u(ji,jj) ) 95 94 ! 96 pva _rhs(ji,jj,jk) = pva_rhs(ji,jj,jk) + zsign * ( &97 & ( zcur(ji,jj ) - zcur(ji-1,jj) ) * r1_e1v(ji,jj) / e3v (ji,jj,jk,ktlev2) &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) & 98 97 & + ( zdiv(ji,jj+1) - zdiv(ji ,jj) ) * r1_e2v(ji,jj) ) 99 98 END DO … … 106 105 107 106 108 SUBROUTINE dyn_ldf_blp( kt, ktlev1, ktlev2, pu, pv, pu_rhs, pva_rhs)107 SUBROUTINE dyn_ldf_blp( kt, pub, pvb, pua, pva ) 109 108 !!---------------------------------------------------------------------- 110 109 !! *** ROUTINE dyn_ldf_blp *** … … 117 116 !! It is computed by two successive calls to dyn_ldf_lap routine 118 117 !! 119 !! ** Action : pt _rhsupdated with the before rotated bilaplacian diffusion118 !! ** Action : pta updated with the before rotated bilaplacian diffusion 120 119 !!---------------------------------------------------------------------- 121 120 INTEGER , INTENT(in ) :: kt ! ocean time-step index 122 INTEGER , INTENT(in ) :: ktlev1, ktlev2 ! time level index for scale factors 123 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pu, pv ! before velocity fields 124 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu_rhs, pva_rhs ! momentum trend 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 125 123 ! 126 124 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zulap, zvlap ! laplacian at u- and v-point … … 136 134 zvlap(:,:,:) = 0._wp 137 135 ! 138 CALL dyn_ldf_lap( kt, ktlev1, ktlev2, pu, pv, zulap, zvlap, 1 ) ! rotated laplacian applied to pt(output in zlap)136 CALL dyn_ldf_lap( kt, pub, pvb, zulap, zvlap, 1 ) ! rotated laplacian applied to ptb (output in zlap) 139 137 ! 140 138 CALL lbc_lnk_multi( 'dynldf_lap_blp', zulap, 'U', -1., zvlap, 'V', -1. ) ! Lateral boundary conditions 141 139 ! 142 CALL dyn_ldf_lap( kt, ktlev1, ktlev2, zulap, zvlap, pu_rhs, pva_rhs, 2 ) ! rotated laplacian applied to zlap (output in pt_rhs)140 CALL dyn_ldf_lap( kt, zulap, zvlap, pua, pva, 2 ) ! rotated laplacian applied to zlap (output in pta) 143 141 ! 144 142 END SUBROUTINE dyn_ldf_blp -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DYN/dynvor.F90
r10806 r10874 96 96 CONTAINS 97 97 98 SUBROUTINE dyn_vor( kt , ktlev, pu_rhs, pv_rhs)98 SUBROUTINE dyn_vor( kt ) 99 99 !!---------------------------------------------------------------------- 100 100 !! 101 101 !! ** Purpose : compute the lateral ocean tracer physics. 102 102 !! 103 !! ** Action : - Update ( pu_rhs,pv_rhs) with the now vorticity term trend103 !! ** Action : - Update (ua,va) with the now vorticity term trend 104 104 !! - save the trends in (ztrdu,ztrdv) in 2 parts (relative 105 105 !! and planetary vorticity trends) and send them to trd_dyn 106 106 !! for futher diagnostics (l_trddyn=T) 107 107 !!---------------------------------------------------------------------- 108 INTEGER, INTENT( in ) :: kt ! ocean time-step index 109 INTEGER, INTENT( in ) :: ktlev ! time level index for source terms 110 REAL(wp), INTENT( inout), DIMENSION(jpi,jpj,jpk) :: pu_rhs, pv_rhs ! momentum trends 108 INTEGER, INTENT( in ) :: kt ! ocean time-step index 111 109 ! 112 110 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv … … 119 117 ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) ) 120 118 ! 121 ztrdu(:,:,:) = pu_rhs(:,:,:) !* planetary vorticity trend (including Stokes-Coriolis force)122 ztrdv(:,:,:) = pv_rhs(:,:,:)119 ztrdu(:,:,:) = ua(:,:,:) !* planetary vorticity trend (including Stokes-Coriolis force) 120 ztrdv(:,:,:) = va(:,:,:) 123 121 SELECT CASE( nvor_scheme ) 124 CASE( np_ENS ) ; CALL vor_ens( kt, ktlev, ncor, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! enstrophy conserving scheme125 IF( ln_stcor ) CALL vor_ens( kt, ktlev, ncor, usd, vsd, pu_rhs, pv_rhs) ! add the Stokes-Coriolis trend126 CASE( np_ENE, np_MIX ) ; CALL vor_ene( kt, ktlev, ncor, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! energy conserving scheme127 IF( ln_stcor ) CALL vor_ene( kt, ktlev, ncor, usd, vsd, pu_rhs, pv_rhs) ! add the Stokes-Coriolis trend128 CASE( np_ENT ) ; CALL vor_enT( kt, ktlev, ncor, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! energy conserving scheme (T-pts)129 IF( ln_stcor ) CALL vor_enT( kt, ktlev, ncor, usd, vsd, pu_rhs, pv_rhs) ! add the Stokes-Coriolis trend130 CASE( np_EET ) ; CALL vor_eeT( kt, ktlev, ncor, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! energy conserving scheme (een with e3t)131 IF( ln_stcor ) CALL vor_eeT( kt, ktlev, ncor, usd, vsd, pu_rhs, pv_rhs) ! add the Stokes-Coriolis trend132 CASE( np_EEN ) ; CALL vor_een( kt, ktlev, ncor, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! energy & enstrophy scheme133 IF( ln_stcor ) CALL vor_een( kt, ktlev, ncor, usd, vsd, pu_rhs, pv_rhs) ! add the Stokes-Coriolis trend122 CASE( np_ENS ) ; CALL vor_ens( kt, ncor, un , vn , ua, va ) ! enstrophy conserving scheme 123 IF( ln_stcor ) CALL vor_ens( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 124 CASE( np_ENE, np_MIX ) ; CALL vor_ene( kt, ncor, un , vn , ua, va ) ! energy conserving scheme 125 IF( ln_stcor ) CALL vor_ene( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 126 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 trend 128 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 trend 130 CASE( np_EEN ) ; CALL vor_een( kt, ncor, un , vn , ua, va ) ! energy & enstrophy scheme 131 IF( ln_stcor ) CALL vor_een( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 134 132 END SELECT 135 ztrdu(:,:,:) = pu_rhs(:,:,:) - ztrdu(:,:,:)136 ztrdv(:,:,:) = pv_rhs(:,:,:) - ztrdv(:,:,:)133 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 134 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 137 135 CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 138 136 ! 139 137 IF( n_dynadv /= np_LIN_dyn ) THEN !* relative vorticity or metric trend (only in non-linear case) 140 ztrdu(:,:,:) = pu_rhs(:,:,:)141 ztrdv(:,:,:) = pv_rhs(:,:,:)138 ztrdu(:,:,:) = ua(:,:,:) 139 ztrdv(:,:,:) = va(:,:,:) 142 140 SELECT CASE( nvor_scheme ) 143 CASE( np_ENT ) ; CALL vor_enT( kt, ktlev, nrvm, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! energy conserving scheme (T-pts)144 CASE( np_EET ) ; CALL vor_eeT( kt, ktlev, nrvm, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! energy conserving scheme (een with e3t)145 CASE( np_ENE ) ; CALL vor_ene( kt, ktlev, nrvm, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! energy conserving scheme146 CASE( np_ENS, np_MIX ) ; CALL vor_ens( kt, ktlev, nrvm, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! enstrophy conserving scheme147 CASE( np_EEN ) ; CALL vor_een( kt, ktlev, nrvm, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! energy & enstrophy scheme141 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 scheme 144 CASE( np_ENS, np_MIX ) ; CALL vor_ens( kt, nrvm, un , vn , ua, va ) ! enstrophy conserving scheme 145 CASE( np_EEN ) ; CALL vor_een( kt, nrvm, un , vn , ua, va ) ! energy & enstrophy scheme 148 146 END SELECT 149 ztrdu(:,:,:) = pu_rhs(:,:,:) - ztrdu(:,:,:)150 ztrdv(:,:,:) = pv_rhs(:,:,:) - ztrdv(:,:,:)147 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 148 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 151 149 CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 152 150 ENDIF … … 158 156 SELECT CASE ( nvor_scheme ) !== vorticity trend added to the general trend ==! 159 157 CASE( np_ENT ) !* energy conserving scheme (T-pts) 160 CALL vor_enT( kt, ktlev, ntot, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! total vorticity trend161 IF( ln_stcor ) CALL vor_enT( kt, ktlev, ncor, usd, vsd, pu_rhs, pv_rhs) ! add the Stokes-Coriolis trend158 CALL vor_enT( kt, ntot, un , vn , ua, va ) ! total vorticity trend 159 IF( ln_stcor ) CALL vor_enT( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 162 160 CASE( np_EET ) !* energy conserving scheme (een scheme using e3t) 163 CALL vor_eeT( kt, ktlev, ntot, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! total vorticity trend164 IF( ln_stcor ) CALL vor_eeT( kt, ktlev, ncor, usd, vsd, pu_rhs, pv_rhs) ! add the Stokes-Coriolis trend161 CALL vor_eeT( kt, ntot, un , vn , ua, va ) ! total vorticity trend 162 IF( ln_stcor ) CALL vor_eeT( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 165 163 CASE( np_ENE ) !* energy conserving scheme 166 CALL vor_ene( kt, ktlev, ntot, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! total vorticity trend167 IF( ln_stcor ) CALL vor_ene( kt, ktlev, ncor, usd, vsd, pu_rhs, pv_rhs) ! add the Stokes-Coriolis trend164 CALL vor_ene( kt, ntot, un , vn , ua, va ) ! total vorticity trend 165 IF( ln_stcor ) CALL vor_ene( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 168 166 CASE( np_ENS ) !* enstrophy conserving scheme 169 CALL vor_ens( kt, ktlev, ntot, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! total vorticity trend170 IF( ln_stcor ) CALL vor_ens( kt, ktlev, ncor, usd, vsd, pu_rhs, pv_rhs) ! add the Stokes-Coriolis trend167 CALL vor_ens( kt, ntot, un , vn , ua, va ) ! total vorticity trend 168 IF( ln_stcor ) CALL vor_ens( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 171 169 CASE( np_MIX ) !* mixed ene-ens scheme 172 CALL vor_ens( kt, ktlev, nrvm, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! relative vorticity or metric trend (ens)173 CALL vor_ene( kt, ktlev, ncor, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! planetary vorticity trend (ene)174 IF( ln_stcor ) CALL vor_ene( kt, ktlev, ncor, usd, vsd, pu_rhs, pv_rhs) ! add the Stokes-Coriolis trend170 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 trend 175 173 CASE( np_EEN ) !* energy and enstrophy conserving scheme 176 CALL vor_een( kt, ktlev, ntot, uu(:,:,:,ktlev) , vv(:,:,:,ktlev) , pu_rhs, pv_rhs) ! total vorticity trend177 IF( ln_stcor ) CALL vor_een( kt, ktlev, ncor, usd, vsd, pu_rhs, pv_rhs) ! add the Stokes-Coriolis trend174 CALL vor_een( kt, ntot, un , vn , ua, va ) ! total vorticity trend 175 IF( ln_stcor ) CALL vor_een( kt, ncor, usd, vsd, ua, va ) ! add the Stokes-Coriolis trend 178 176 END SELECT 179 177 ! … … 189 187 190 188 191 SUBROUTINE vor_enT( kt, k tlev, kvor, pu, pv, pu_rhs, pv_rhs )189 SUBROUTINE vor_enT( kt, kvor, pu, pv, pu_rhs, pv_rhs ) 192 190 !!---------------------------------------------------------------------- 193 191 !! *** ROUTINE vor_enT *** … … 205 203 !! where rvor is the relative vorticity at f-point 206 204 !! 207 !! ** Action : - Update (u _rhs,v_rhs) with the now vorticity term trend205 !! ** Action : - Update (ua,va) with the now vorticity term trend 208 206 !!---------------------------------------------------------------------- 209 207 INTEGER , INTENT(in ) :: kt ! ocean time-step index 210 INTEGER , INTENT( in ) :: ktlev ! time level index for source terms211 208 INTEGER , INTENT(in ) :: kvor ! total, planetary, relative, or metric 212 209 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu, pv ! now velocities … … 273 270 SELECT CASE( kvor ) !== volume weighted vorticity considered ==! 274 271 CASE ( np_COR ) !* Coriolis (planetary vorticity) 275 zwt(:,:) = ff_t(:,:) * e1e2t(:,:)*e3t (:,:,jk,ktlev)272 zwt(:,:) = ff_t(:,:) * e1e2t(:,:)*e3t_n(:,:,jk) 276 273 CASE ( np_RVO ) !* relative vorticity 277 274 DO jj = 2, jpj 278 275 DO ji = 2, jpi ! vector opt. 279 276 zwt(ji,jj) = r1_4 * ( zwz(ji-1,jj ,jk) + zwz(ji,jj ,jk) & 280 & + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) ) * e1e2t(ji,jj)*e3t (ji,jj,jk,ktlev)277 & + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) ) * e1e2t(ji,jj)*e3t_n(ji,jj,jk) 281 278 END DO 282 279 END DO … … 285 282 DO ji = 2, jpi 286 283 zwt(ji,jj) = ( ( pv(ji,jj,jk) + pv(ji,jj-1,jk) ) * di_e2u_2(ji,jj) & 287 & - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj) ) * e3t (ji,jj,jk,ktlev)284 & - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj) ) * e3t_n(ji,jj,jk) 288 285 END DO 289 286 END DO … … 292 289 DO ji = 2, jpi ! vector opt. 293 290 zwt(ji,jj) = ( ff_t(ji,jj) + r1_4 * ( zwz(ji-1,jj ,jk) + zwz(ji,jj ,jk) & 294 & + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) ) ) * e1e2t(ji,jj)*e3t (ji,jj,jk,ktlev)291 & + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) ) ) * e1e2t(ji,jj)*e3t_n(ji,jj,jk) 295 292 END DO 296 293 END DO … … 300 297 zwt(ji,jj) = ( ff_t(ji,jj) * e1e2t(ji,jj) & 301 298 & + ( pv(ji,jj,jk) + pv(ji,jj-1,jk) ) * di_e2u_2(ji,jj) & 302 & - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj) ) * e3t (ji,jj,jk,ktlev)299 & - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj) ) * e3t_n(ji,jj,jk) 303 300 END DO 304 301 END DO … … 310 307 DO jj = 2, jpjm1 311 308 DO ji = 2, jpim1 ! vector opt. 312 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + r1_4 * r1_e1e2u(ji,jj) / e3u (ji,jj,jk,ktlev) &309 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + r1_4 * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) & 313 310 & * ( zwt(ji+1,jj) * ( pv(ji+1,jj,jk) + pv(ji+1,jj-1,jk) ) & 314 311 & + zwt(ji ,jj) * ( pv(ji ,jj,jk) + pv(ji ,jj-1,jk) ) ) 315 312 ! 316 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e1e2v(ji,jj) / e3v (ji,jj,jk,ktlev) &313 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) & 317 314 & * ( zwt(ji,jj+1) * ( pu(ji,jj+1,jk) + pu(ji-1,jj+1,jk) ) & 318 315 & + zwt(ji,jj ) * ( pu(ji,jj ,jk) + pu(ji-1,jj ,jk) ) ) … … 325 322 326 323 327 SUBROUTINE vor_ene( kt, k tlev, kvor, pu, pv, pu_rhs, pva_rhs)324 SUBROUTINE vor_ene( kt, kvor, pun, pvn, pua, pva ) 328 325 !!---------------------------------------------------------------------- 329 326 !! *** ROUTINE vor_ene *** … … 337 334 !! The general trend of momentum is increased due to the vorticity 338 335 !! term which is given by: 339 !! voru = 1/e1u mj-1[ (rvor+f)/e3f mi(e1v*e3v v v(:,:,:,ktlev)) ]340 !! vorv = 1/e2v mi-1[ (rvor+f)/e3f mj(e2u*e3u u u(:,:,:,ktlev)) ]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) ] 341 338 !! where rvor is the relative vorticity 342 339 !! 343 !! ** Action : - Update (u _rhs,v_rhs) with the now vorticity term trend340 !! ** Action : - Update (ua,va) with the now vorticity term trend 344 341 !! 345 342 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 346 343 !!---------------------------------------------------------------------- 347 344 INTEGER , INTENT(in ) :: kt ! ocean time-step index 348 INTEGER , INTENT( in ) :: ktlev ! time level index for source terms349 345 INTEGER , INTENT(in ) :: kvor ! total, planetary, relative, or metric 350 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu , pv! now velocities351 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu _rhs, pva_rhs! total v-trend346 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pun, pvn ! now velocities 347 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pua, pva ! total v-trend 352 348 ! 353 349 INTEGER :: ji, jj, jk ! dummy loop indices … … 372 368 DO jj = 1, jpjm1 373 369 DO ji = 1, fs_jpim1 ! vector opt. 374 zwz(ji,jj) = ( e2v(ji+1,jj ) * pv (ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk) &375 & - e1u(ji ,jj+1) * pu (ji ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj)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) 376 372 END DO 377 373 END DO … … 379 375 DO jj = 1, jpjm1 380 376 DO ji = 1, fs_jpim1 ! vector opt. 381 zwz(ji,jj) = ( pv (ji+1,jj ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) &382 & - ( pu (ji ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)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) 383 379 END DO 384 380 END DO … … 386 382 DO jj = 1, jpjm1 387 383 DO ji = 1, fs_jpim1 ! vector opt. 388 zwz(ji,jj) = ff_f(ji,jj) + ( e2v(ji+1,jj) * pv (ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk) &389 & - e1u(ji,jj+1) * pu (ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj)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) 390 386 END DO 391 387 END DO … … 393 389 DO jj = 1, jpjm1 394 390 DO ji = 1, fs_jpim1 ! vector opt. 395 zwz(ji,jj) = ff_f(ji,jj) + ( pv (ji+1,jj ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) &396 & - ( pu (ji ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)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) 397 393 END DO 398 394 END DO … … 410 406 411 407 IF( ln_sco ) THEN 412 zwz(:,:) = zwz(:,:) / e3f (:,:,jk)413 zwx(:,:) = e2u(:,:) * e3u (:,:,jk,ktlev) * pu(:,:,jk)414 zwy(:,:) = e1v(:,:) * e3v (:,:,jk,ktlev) * pv(:,:,jk)408 zwz(:,:) = zwz(:,:) / e3f_n(:,:,jk) 409 zwx(:,:) = e2u(:,:) * e3u_n(:,:,jk) * pun(:,:,jk) 410 zwy(:,:) = e1v(:,:) * e3v_n(:,:,jk) * pvn(:,:,jk) 415 411 ELSE 416 zwx(:,:) = e2u(:,:) * pu (:,:,jk)417 zwy(:,:) = e1v(:,:) * pv (:,:,jk)412 zwx(:,:) = e2u(:,:) * pun(:,:,jk) 413 zwy(:,:) = e1v(:,:) * pvn(:,:,jk) 418 414 ENDIF 419 415 ! !== compute and add the vorticity term trend =! … … 424 420 zx1 = zwx(ji-1,jj) + zwx(ji-1,jj+1) 425 421 zx2 = zwx(ji ,jj) + zwx(ji ,jj+1) 426 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 )427 pva _rhs(ji,jj,jk) = pva_rhs(ji,jj,jk) - r1_4 * r1_e2v(ji,jj) * ( zwz(ji-1,jj ) * zx1 + zwz(ji,jj) * zx2 )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 ) 428 424 END DO 429 425 END DO … … 434 430 435 431 436 SUBROUTINE vor_ens( kt, k tlev, kvor, pu, pv, pu_rhs, pva_rhs)432 SUBROUTINE vor_ens( kt, kvor, pun, pvn, pua, pva ) 437 433 !!---------------------------------------------------------------------- 438 434 !! *** ROUTINE vor_ens *** … … 445 441 !! potential enstrophy of a horizontally non-divergent flow. the 446 442 !! trend of the vorticity term is given by: 447 !! voru = 1/e1u mj-1[ (rvor+f)/e3f ] mj-1[ mi(e1v*e3v v v(:,:,:,ktlev)) ]448 !! vorv = 1/e2v mi-1[ (rvor+f)/e3f ] mi-1[ mj(e2u*e3u u u(:,:,:,ktlev)) ]449 !! Add this trend to the general momentum trend (u _rhs,v_rhs):450 !! (u _rhs,v_rhs) = (u_rhs,v_rhs) + ( voru , vorv )451 !! 452 !! ** Action : - Update (u _rhs,v_rhs) arrays with the now vorticity term trend443 !! 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 !! (ua,va) = (ua,va) + ( voru , vorv ) 447 !! 448 !! ** Action : - Update (ua,va) arrays with the now vorticity term trend 453 449 !! 454 450 !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 455 451 !!---------------------------------------------------------------------- 456 452 INTEGER , INTENT(in ) :: kt ! ocean time-step index 457 INTEGER , INTENT( in ) :: ktlev ! time level index for source terms458 453 INTEGER , INTENT(in ) :: kvor ! total, planetary, relative, or metric 459 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu , pv! now velocities460 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu _rhs, pva_rhs! total v-trend454 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pun, pvn ! now velocities 455 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pua, pva ! total v-trend 461 456 ! 462 457 INTEGER :: ji, jj, jk ! dummy loop indices … … 480 475 DO jj = 1, jpjm1 481 476 DO ji = 1, fs_jpim1 ! vector opt. 482 zwz(ji,jj) = ( e2v(ji+1,jj ) * pv (ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk) &483 & - e1u(ji ,jj+1) * pu (ji ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj)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) 484 479 END DO 485 480 END DO … … 487 482 DO jj = 1, jpjm1 488 483 DO ji = 1, fs_jpim1 ! vector opt. 489 zwz(ji,jj) = ( pv (ji+1,jj ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) &490 & - ( pu (ji ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)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) 491 486 END DO 492 487 END DO … … 494 489 DO jj = 1, jpjm1 495 490 DO ji = 1, fs_jpim1 ! vector opt. 496 zwz(ji,jj) = ff_f(ji,jj) + ( e2v(ji+1,jj ) * pv (ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk) &497 & - e1u(ji ,jj+1) * pu (ji ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj)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) 498 493 END DO 499 494 END DO … … 501 496 DO jj = 1, jpjm1 502 497 DO ji = 1, fs_jpim1 ! vector opt. 503 zwz(ji,jj) = ff_f(ji,jj) + ( pv (ji+1,jj ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) &504 & - ( pu (ji ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)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) 505 500 END DO 506 501 END DO … … 518 513 ! 519 514 IF( ln_sco ) THEN !== horizontal fluxes ==! 520 zwz(:,:) = zwz(:,:) / e3f (:,:,jk)521 zwx(:,:) = e2u(:,:) * e3u (:,:,jk,ktlev) * pu(:,:,jk)522 zwy(:,:) = e1v(:,:) * e3v (:,:,jk,ktlev) * pv(:,:,jk)515 zwz(:,:) = zwz(:,:) / e3f_n(:,:,jk) 516 zwx(:,:) = e2u(:,:) * e3u_n(:,:,jk) * pun(:,:,jk) 517 zwy(:,:) = e1v(:,:) * e3v_n(:,:,jk) * pvn(:,:,jk) 523 518 ELSE 524 zwx(:,:) = e2u(:,:) * pu (:,:,jk)525 zwy(:,:) = e1v(:,:) * pv (:,:,jk)519 zwx(:,:) = e2u(:,:) * pun(:,:,jk) 520 zwy(:,:) = e1v(:,:) * pvn(:,:,jk) 526 521 ENDIF 527 522 ! !== compute and add the vorticity term trend =! … … 532 527 zvau =-r1_8 * r1_e2v(ji,jj) * ( zwx(ji-1,jj ) + zwx(ji-1,jj+1) & 533 528 & + zwx(ji ,jj ) + zwx(ji ,jj+1) ) 534 pu _rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zuav * ( zwz(ji ,jj-1) + zwz(ji,jj) )535 pva _rhs(ji,jj,jk) = pva_rhs(ji,jj,jk) + zvau * ( zwz(ji-1,jj ) + zwz(ji,jj) )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) ) 536 531 END DO 537 532 END DO … … 542 537 543 538 544 SUBROUTINE vor_een( kt, k tlev, kvor, pu, pv, pu_rhs, pva_rhs)539 SUBROUTINE vor_een( kt, kvor, pun, pvn, pua, pva ) 545 540 !!---------------------------------------------------------------------- 546 541 !! *** ROUTINE vor_een *** … … 553 548 !! both the horizontal kinetic energy and the potential enstrophy 554 549 !! when horizontal divergence is zero (see the NEMO documentation) 555 !! Add this trend to the general momentum trend (u _rhs,v_rhs).556 !! 557 !! ** Action : - Update (u _rhs,v_rhs) with the now vorticity term trend550 !! Add this trend to the general momentum trend (ua,va). 551 !! 552 !! ** Action : - Update (ua,va) with the now vorticity term trend 558 553 !! 559 554 !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 560 555 !!---------------------------------------------------------------------- 561 556 INTEGER , INTENT(in ) :: kt ! ocean time-step index 562 INTEGER , INTENT( in ) :: ktlev ! time level index for source terms563 557 INTEGER , INTENT(in ) :: kvor ! total, planetary, relative, or metric 564 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu , pv! now velocities565 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu _rhs, pva_rhs! total v-trend558 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pun, pvn ! now velocities 559 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pua, pva ! total v-trend 566 560 ! 567 561 INTEGER :: ji, jj, jk ! dummy loop indices … … 588 582 DO jj = 1, jpjm1 589 583 DO ji = 1, fs_jpim1 ! vector opt. 590 ze3f = ( e3t (ji,jj+1,jk,ktlev)*tmask(ji,jj+1,jk) + e3t(ji+1,jj+1,jk,ktlev)*tmask(ji+1,jj+1,jk) &591 & + e3t (ji,jj ,jk,ktlev)*tmask(ji,jj ,jk) + e3t(ji+1,jj ,jk,ktlev)*tmask(ji+1,jj ,jk) )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) ) 592 586 IF( ze3f /= 0._wp ) THEN ; z1_e3f(ji,jj) = 4._wp / ze3f 593 587 ELSE ; z1_e3f(ji,jj) = 0._wp … … 598 592 DO jj = 1, jpjm1 599 593 DO ji = 1, fs_jpim1 ! vector opt. 600 ze3f = ( e3t (ji,jj+1,jk,ktlev)*tmask(ji,jj+1,jk) + e3t(ji+1,jj+1,jk,ktlev)*tmask(ji+1,jj+1,jk) &601 & + e3t (ji,jj ,jk,ktlev)*tmask(ji,jj ,jk) + e3t(ji+1,jj ,jk,ktlev)*tmask(ji+1,jj ,jk) )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) ) 602 596 zmsk = ( tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) & 603 597 & + tmask(ji,jj ,jk) + tmask(ji+1,jj ,jk) ) … … 619 613 DO jj = 1, jpjm1 620 614 DO ji = 1, fs_jpim1 ! vector opt. 621 zwz(ji,jj,jk) = ( e2v(ji+1,jj ) * pv (ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk) &622 & - e1u(ji ,jj+1) * pu (ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) * r1_e1e2f(ji,jj)*z1_e3f(ji,jj)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) 623 617 END DO 624 618 END DO … … 626 620 DO jj = 1, jpjm1 627 621 DO ji = 1, fs_jpim1 ! vector opt. 628 zwz(ji,jj,jk) = ( ( pv (ji+1,jj,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) &629 & - ( pu (ji,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) ) * z1_e3f(ji,jj)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) 630 624 END DO 631 625 END DO … … 633 627 DO jj = 1, jpjm1 634 628 DO ji = 1, fs_jpim1 ! vector opt. 635 zwz(ji,jj,jk) = ( ff_f(ji,jj) + ( e2v(ji+1,jj ) * pv (ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk) &636 & - e1u(ji ,jj+1) * pu (ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) &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) ) & 637 631 & * r1_e1e2f(ji,jj) ) * z1_e3f(ji,jj) 638 632 END DO … … 641 635 DO jj = 1, jpjm1 642 636 DO ji = 1, fs_jpim1 ! vector opt. 643 zwz(ji,jj,jk) = ( ff_f(ji,jj) + ( pv (ji+1,jj ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) &644 & - ( pu (ji ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) ) * z1_e3f(ji,jj)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) 645 639 END DO 646 640 END DO … … 663 657 ! 664 658 ! !== horizontal fluxes ==! 665 zwx(:,:) = e2u(:,:) * e3u (:,:,jk,ktlev) * pu(:,:,jk)666 zwy(:,:) = e1v(:,:) * e3v (:,:,jk,ktlev) * pv(:,:,jk)659 zwx(:,:) = e2u(:,:) * e3u_n(:,:,jk) * pun(:,:,jk) 660 zwy(:,:) = e1v(:,:) * e3v_n(:,:,jk) * pvn(:,:,jk) 667 661 668 662 ! !== compute and add the vorticity term trend =! … … 689 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) & 690 684 & + ztnw(ji,jj ) * zwx(ji-1,jj ) + ztne(ji,jj ) * zwx(ji ,jj ) ) 691 pu _rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zua692 pva _rhs(ji,jj,jk) = pva_rhs(ji,jj,jk) + zva685 pua(ji,jj,jk) = pua(ji,jj,jk) + zua 686 pva(ji,jj,jk) = pva(ji,jj,jk) + zva 693 687 END DO 694 688 END DO … … 700 694 701 695 702 SUBROUTINE vor_eeT( kt, k tlev, kvor, pu, pv, pu_rhs, pva_rhs)696 SUBROUTINE vor_eeT( kt, kvor, pun, pvn, pua, pva ) 703 697 !!---------------------------------------------------------------------- 704 698 !! *** ROUTINE vor_eeT *** … … 711 705 !! a modified version of Arakawa and Lamb (1980) scheme (see vor_een). 712 706 !! The change consists in 713 !! Add this trend to the general momentum trend (u _rhs,v_rhs).714 !! 715 !! ** Action : - Update (u _rhs,v_rhs) with the now vorticity term trend707 !! Add this trend to the general momentum trend (ua,va). 708 !! 709 !! ** Action : - Update (ua,va) with the now vorticity term trend 716 710 !! 717 711 !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 718 712 !!---------------------------------------------------------------------- 719 713 INTEGER , INTENT(in ) :: kt ! ocean time-step index 720 INTEGER , INTENT( in ) :: ktlev ! time level index for source terms721 714 INTEGER , INTENT(in ) :: kvor ! total, planetary, relative, or metric 722 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu , pv! now velocities723 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu _rhs, pva_rhs! total v-trend715 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pun, pvn ! now velocities 716 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pua, pva ! total v-trend 724 717 ! 725 718 INTEGER :: ji, jj, jk ! dummy loop indices … … 753 746 DO jj = 1, jpjm1 754 747 DO ji = 1, fs_jpim1 ! vector opt. 755 zwz(ji,jj,jk) = ( e2v(ji+1,jj ) * pv (ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk) &756 & - e1u(ji ,jj+1) * pu (ji ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) &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) ) & 757 750 & * r1_e1e2f(ji,jj) 758 751 END DO … … 761 754 DO jj = 1, jpjm1 762 755 DO ji = 1, fs_jpim1 ! vector opt. 763 zwz(ji,jj,jk) = ( pv (ji+1,jj ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) &764 & - ( pu (ji ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)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) 765 758 END DO 766 759 END DO … … 768 761 DO jj = 1, jpjm1 769 762 DO ji = 1, fs_jpim1 ! vector opt. 770 zwz(ji,jj,jk) = ( ff_f(ji,jj) + ( e2v(ji+1,jj ) * pv (ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk) &771 & - e1u(ji ,jj+1) * pu (ji ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) &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) ) & 772 765 & * r1_e1e2f(ji,jj) ) 773 766 END DO … … 776 769 DO jj = 1, jpjm1 777 770 DO ji = 1, fs_jpim1 ! vector opt. 778 zwz(ji,jj,jk) = ff_f(ji,jj) + ( pv (ji+1,jj ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj) &779 & - ( pu (ji ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)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) 780 773 END DO 781 774 END DO … … 798 791 799 792 ! !== horizontal fluxes ==! 800 zwx(:,:) = e2u(:,:) * e3u (:,:,jk,ktlev) * pu(:,:,jk)801 zwy(:,:) = e1v(:,:) * e3v (:,:,jk,ktlev) * pv(:,:,jk)793 zwx(:,:) = e2u(:,:) * e3u_n(:,:,jk) * pun(:,:,jk) 794 zwy(:,:) = e1v(:,:) * e3v_n(:,:,jk) * pvn(:,:,jk) 802 795 803 796 ! !== compute and add the vorticity term trend =! … … 805 798 ztne(1,:) = 0 ; ztnw(1,:) = 0 ; ztse(1,:) = 0 ; ztsw(1,:) = 0 806 799 DO ji = 2, jpi ! split in 2 parts due to vector opt. 807 z1_e3t = 1._wp / e3t (ji,jj,jk,ktlev)800 z1_e3t = 1._wp / e3t_n(ji,jj,jk) 808 801 ztne(ji,jj) = ( zwz(ji-1,jj ,jk) + zwz(ji ,jj ,jk) + zwz(ji ,jj-1,jk) ) * z1_e3t 809 802 ztnw(ji,jj) = ( zwz(ji-1,jj-1,jk) + zwz(ji-1,jj ,jk) + zwz(ji ,jj ,jk) ) * z1_e3t … … 813 806 DO jj = 3, jpj 814 807 DO ji = fs_2, jpi ! vector opt. ok because we start at jj = 3 815 z1_e3t = 1._wp / e3t (ji,jj,jk,ktlev)808 z1_e3t = 1._wp / e3t_n(ji,jj,jk) 816 809 ztne(ji,jj) = ( zwz(ji-1,jj ,jk) + zwz(ji ,jj ,jk) + zwz(ji ,jj-1,jk) ) * z1_e3t 817 810 ztnw(ji,jj) = ( zwz(ji-1,jj-1,jk) + zwz(ji-1,jj ,jk) + zwz(ji ,jj ,jk) ) * z1_e3t … … 826 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) & 827 820 & + ztnw(ji,jj ) * zwx(ji-1,jj ) + ztne(ji,jj ) * zwx(ji ,jj ) ) 828 pu _rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zua829 pva _rhs(ji,jj,jk) = pva_rhs(ji,jj,jk) + zva821 pua(ji,jj,jk) = pua(ji,jj,jk) + zua 822 pva(ji,jj,jk) = pva(ji,jj,jk) + zva 830 823 END DO 831 824 END DO … … 873 866 WRITE(numout,*) ' e3f = averaging /4 (=0) or /sum(tmask) (=1) nn_een_e3f = ', nn_een_e3f 874 867 WRITE(numout,*) ' mixed enstrophy/energy conserving scheme ln_dynvor_mix = ', ln_dynvor_mix 875 WRITE(numout,*) ' masked (=T) or u u(:,:,:,ktlev)masked(=F) vorticity ln_dynvor_msk = ', ln_dynvor_msk868 WRITE(numout,*) ' masked (=T) or unmasked(=F) vorticity ln_dynvor_msk = ', ln_dynvor_msk 876 869 ENDIF 877 870 -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DYN/dynzad.F90
r10789 r10874 36 36 CONTAINS 37 37 38 SUBROUTINE dyn_zad ( kt , ktlev, pu_rhs, pv_rhs)38 SUBROUTINE dyn_zad ( kt ) 39 39 !!---------------------------------------------------------------------- 40 40 !! *** ROUTINE dynzad *** … … 44 44 !! 45 45 !! ** Method : The now vertical advection of momentum is given by: 46 !! w dz(u) = pu_rhs + 1/(e1e2u*e3u) mk+1[ mi(e1e2t*ww) dk(uu(:,:,:,ktlev)) ]47 !! w dz(v) = pv_rhs + 1/(e1e2v*e3v) mk+1[ mj(e1e2t*ww) dk(vv(:,:,:,ktlev)) ]48 !! Add this trend to the general trend ( pu_rhs,pv_rhs):49 !! ( pu_rhs,pv_rhs) = (pu_rhs,pv_rhs) + w dz(u,v)46 !! w dz(u) = ua + 1/(e1e2u*e3u) mk+1[ mi(e1e2t*wn) dk(un) ] 47 !! w dz(v) = va + 1/(e1e2v*e3v) mk+1[ mj(e1e2t*wn) dk(vn) ] 48 !! Add this trend to the general trend (ua,va): 49 !! (ua,va) = (ua,va) + w dz(u,v) 50 50 !! 51 !! ** Action : - Update ( pu_rhs,pv_rhs) with the vert. momentum adv. trends51 !! ** Action : - Update (ua,va) with the vert. momentum adv. trends 52 52 !! - Send the trends to trddyn for diagnostics (l_trddyn=T) 53 53 !!---------------------------------------------------------------------- 54 INTEGER, INTENT(in) :: kt ! ocean time-step index 55 INTEGER, INTENT(in) :: ktlev ! time level index for source terms 56 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pu_rhs, pv_rhs ! momentum trends 54 INTEGER, INTENT(in) :: kt ! ocean time-step inedx 57 55 ! 58 56 INTEGER :: ji, jj, jk ! dummy loop indices … … 70 68 ENDIF 71 69 72 IF( l_trddyn ) THEN ! Save pu_rhs and pv_rhstrends70 IF( l_trddyn ) THEN ! Save ua and va trends 73 71 ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 74 ztrdu(:,:,:) = pu_rhs(:,:,:)75 ztrdv(:,:,:) = pv_rhs(:,:,:)72 ztrdu(:,:,:) = ua(:,:,:) 73 ztrdv(:,:,:) = va(:,:,:) 76 74 ENDIF 77 75 … … 79 77 DO jj = 2, jpj ! vertical fluxes 80 78 DO ji = fs_2, jpi ! vector opt. 81 zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * w w(ji,jj,jk)79 zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk) 82 80 END DO 83 81 END DO 84 82 DO jj = 2, jpjm1 ! vertical momentum advection at w-point 85 83 DO ji = fs_2, fs_jpim1 ! vector opt. 86 zwuw(ji,jj,jk) = ( zww(ji+1,jj ) + zww(ji,jj) ) * ( u u(ji,jj,jk-1,ktlev) - uu(ji,jj,jk,ktlev) )87 zwvw(ji,jj,jk) = ( zww(ji ,jj+1) + zww(ji,jj) ) * ( v v(ji,jj,jk-1,ktlev) - vv(ji,jj,jk,ktlev) )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) ) 88 86 END DO 89 87 END DO … … 103 101 DO jj = 2, jpjm1 104 102 DO ji = fs_2, fs_jpim1 ! vector opt. 105 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,ktlev)106 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,ktlev)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) 107 105 END DO 108 106 END DO … … 110 108 111 109 IF( l_trddyn ) THEN ! save the vertical advection trends for diagnostic 112 ztrdu(:,:,:) = pu_rhs(:,:,:) - ztrdu(:,:,:)113 ztrdv(:,:,:) = pv_rhs(:,:,:) - ztrdv(:,:,:)110 ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 111 ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 114 112 CALL trd_dyn( ztrdu, ztrdv, jpdyn_zad, kt ) 115 113 DEALLOCATE( ztrdu, ztrdv ) -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DYN/dynzdf.F90
r10825 r10874 45 45 CONTAINS 46 46 47 SUBROUTINE dyn_zdf( kt , ktlev1, ktlev2, ktlev3, kt2lev, pu_rhs, pv_rhs)47 SUBROUTINE dyn_zdf( kt ) 48 48 !!---------------------------------------------------------------------- 49 49 !! *** ROUTINE dyn_zdf *** … … 54 54 !! 55 55 !! ** Method : - Leap-Frog time stepping on all trends but the vertical mixing 56 !! pu_rhs = uu(:,:,:,ktlev1) + 2*dt * pu_rhsvector form or linear free surf.57 !! pu_rhs = ( e3u_b*uu(:,:,:,ktlev1) + 2*dt * e3u_n*pu_rhs ) / e3u(:,:,:,ktlev3)otherwise56 !! ua = ub + 2*dt * ua vector form or linear free surf. 57 !! ua = ( e3u_b*ub + 2*dt * e3u_n*ua ) / e3u_a otherwise 58 58 !! - update the after velocity with the implicit vertical mixing. 59 59 !! This requires to solver the following system: 60 !! pu_rhs = pu_rhs + 1/e3u(:,:,:,ktlev3)dk+1[ mi(avm) / e3uw_a dk[ua] ]60 !! ua = ua + 1/e3u_a dk+1[ mi(avm) / e3uw_a dk[ua] ] 61 61 !! with the following surface/top/bottom boundary condition: 62 62 !! surface: wind stress input (averaged over kt-1/2 & kt+1/2) 63 63 !! top & bottom : top stress (iceshelf-ocean) & bottom stress (cf zdfdrg.F90) 64 64 !! 65 !! ** Action : ( pu_rhs,pv_rhs) after velocity65 !! ** Action : (ua,va) after velocity 66 66 !!--------------------------------------------------------------------- 67 INTEGER, INTENT(in) :: kt ! ocean time-step index 68 INTEGER, INTENT(in) :: ktlev1, ktlev2, ktlev3 ! time level indices for 3-time-level source terms 69 INTEGER, INTENT(in) :: kt2lev ! time level index for 2-time-level source terms 70 REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) :: pu_rhs, pv_rhs ! momentum trends -> momentum after fields 67 INTEGER, INTENT(in) :: kt ! ocean time-step index 71 68 ! 72 69 INTEGER :: ji, jj, jk ! dummy loop indices … … 99 96 ! 100 97 ! !* explicit top/bottom drag case 101 IF( .NOT.ln_drgimp ) CALL zdf_drg_exp( kt, u u(:,:,:,ktlev1), vv(:,:,:,ktlev1), pu_rhs, pv_rhs ) ! add top/bottom friction trend to (pu_rhs,pv_rhs)98 IF( .NOT.ln_drgimp ) CALL zdf_drg_exp( kt, ub, vb, ua, va ) ! add top/bottom friction trend to (ua,va) 102 99 ! 103 100 ! 104 101 IF( l_trddyn ) THEN !* temporary save of ta and sa trends 105 102 ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) ) 106 ztrdu(:,:,:) = pu_rhs(:,:,:)107 ztrdv(:,:,:) = pv_rhs(:,:,:)108 ENDIF 109 ! 110 ! !== RHS: Leap-Frog time stepping on all trends but the vertical mixing ==! (put in pu_rhs,pv_rhs)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) 111 108 ! 112 109 ! ! time stepping except vertical diffusion 113 110 IF( ln_dynadv_vec .OR. ln_linssh ) THEN ! applied on velocity 114 111 DO jk = 1, jpkm1 115 pu_rhs(:,:,jk) = ( uu(:,:,jk,ktlev1) + r2dt * pu_rhs(:,:,jk) ) * umask(:,:,jk)116 pv_rhs(:,:,jk) = ( vv(:,:,jk,ktlev1) + r2dt * pv_rhs(:,:,jk) ) * vmask(:,:,jk)112 ua(:,:,jk) = ( ub(:,:,jk) + r2dt * ua(:,:,jk) ) * umask(:,:,jk) 113 va(:,:,jk) = ( vb(:,:,jk) + r2dt * va(:,:,jk) ) * vmask(:,:,jk) 117 114 END DO 118 115 ELSE ! applied on thickness weighted velocity 119 116 DO jk = 1, jpkm1 120 pu_rhs(:,:,jk) = ( e3u(:,:,jk,ktlev1) * uu(:,:,jk,ktlev1) &121 & + r2dt * e3u (:,:,jk,ktlev2) * pu_rhs(:,:,jk) ) / e3u(:,:,jk,ktlev3) * umask(:,:,jk)122 pv_rhs(:,:,jk) = ( e3v(:,:,jk,ktlev1) * vv(:,:,jk,ktlev1) &123 & + r2dt * e3v (:,:,jk,ktlev2) * pv_rhs(:,:,jk) ) / e3v(:,:,jk,ktlev3) * vmask(:,:,jk)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) 124 121 END DO 125 122 ENDIF … … 128 125 ! J. Chanut: The bottom stress is computed considering after barotropic velocities, which does 129 126 ! not lead to the effective stress seen over the whole barotropic loop. 130 ! G. Madec : in linear free surface, e3u (:,:,:,ktlev3) = e3u(:,:,:,ktlev2) = e3u_0, so systematic use of e3u(:,:,:,ktlev3)127 ! G. Madec : in linear free surface, e3u_a = e3u_n = e3u_0, so systematic use of e3u_a 131 128 IF( ln_drgimp .AND. ln_dynspg_ts ) THEN 132 129 DO jk = 1, jpkm1 ! remove barotropic velocities 133 pu_rhs(:,:,jk) = ( pu_rhs(:,:,jk) - ua_b(:,:) ) * umask(:,:,jk)134 pv_rhs(:,:,jk) = ( pv_rhs(:,:,jk) - va_b(:,:) ) * vmask(:,:,jk)130 ua(:,:,jk) = ( ua(:,:,jk) - ua_b(:,:) ) * umask(:,:,jk) 131 va(:,:,jk) = ( va(:,:,jk) - va_b(:,:) ) * vmask(:,:,jk) 135 132 END DO 136 133 DO jj = 2, jpjm1 ! Add bottom/top stress due to barotropic component only … … 138 135 iku = mbku(ji,jj) ! ocean bottom level at u- and v-points 139 136 ikv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 140 ze3ua = ( 1._wp - r_vvl ) * e3u (ji,jj,iku,ktlev2) + r_vvl * e3u(ji,jj,iku,ktlev3)141 ze3va = ( 1._wp - r_vvl ) * e3v (ji,jj,ikv,ktlev2) + r_vvl * e3v(ji,jj,ikv,ktlev3)142 pu_rhs(ji,jj,iku) = pu_rhs(ji,jj,iku) + r2dt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * ua_b(ji,jj) / ze3ua143 pv_rhs(ji,jj,ikv) = pv_rhs(ji,jj,ikv) + r2dt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * va_b(ji,jj) / ze3va137 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) / ze3ua 140 va(ji,jj,ikv) = va(ji,jj,ikv) + r2dt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * va_b(ji,jj) / ze3va 144 141 END DO 145 142 END DO … … 149 146 iku = miku(ji,jj) ! top ocean level at u- and v-points 150 147 ikv = mikv(ji,jj) ! (first wet ocean u- and v-points) 151 ze3ua = ( 1._wp - r_vvl ) * e3u (ji,jj,iku,ktlev2) + r_vvl * e3u(ji,jj,iku,ktlev3)152 ze3va = ( 1._wp - r_vvl ) * e3v (ji,jj,ikv,ktlev2) + r_vvl * e3v(ji,jj,ikv,ktlev3)153 pu_rhs(ji,jj,iku) = pu_rhs(ji,jj,iku) + r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * ua_b(ji,jj) / ze3ua154 pv_rhs(ji,jj,ikv) = pv_rhs(ji,jj,ikv) + r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * va_b(ji,jj) / ze3va148 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) / ze3ua 151 va(ji,jj,ikv) = va(ji,jj,ikv) + r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * va_b(ji,jj) / ze3va 155 152 END DO 156 153 END DO … … 168 165 DO jj = 2, jpjm1 169 166 DO ji = fs_2, fs_jpim1 ! vector opt. 170 ze3ua = ( 1._wp - r_vvl ) * e3u (ji,jj,jk,ktlev2) + r_vvl * e3u(ji,jj,jk,ktlev3) ! after scale factor at U-point167 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk) ! after scale factor at U-point 171 168 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) + akzu(ji,jj,jk ) ) & 172 & / ( ze3ua * e3uw (ji,jj,jk ,kt2lev) ) * wumask(ji,jj,jk )169 & / ( ze3ua * e3uw_n(ji,jj,jk ) ) * wumask(ji,jj,jk ) 173 170 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) ) & 174 & / ( ze3ua * e3uw (ji,jj,jk+1,kt2lev) ) * wumask(ji,jj,jk+1)171 & / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 175 172 zWui = 0.5_wp * ( wi(ji,jj,jk ) + wi(ji+1,jj,jk ) ) 176 173 zWus = 0.5_wp * ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) … … 185 182 DO jj = 2, jpjm1 186 183 DO ji = fs_2, fs_jpim1 ! vector opt. 187 ze3ua = ( 1._wp - r_vvl ) * e3u (ji,jj,jk,ktlev2) + r_vvl * e3u(ji,jj,jk,ktlev3) ! after scale factor at U-point188 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) ) / ( ze3ua * e3uw (ji,jj,jk ,kt2lev) ) * wumask(ji,jj,jk )189 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) / ( ze3ua * e3uw (ji,jj,jk+1,kt2lev) ) * wumask(ji,jj,jk+1)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) 190 187 zWui = 0.5_wp * ( wi(ji,jj,jk ) + wi(ji+1,jj,jk ) ) 191 188 zWus = 0.5_wp * ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) … … 200 197 DO ji = fs_2, fs_jpim1 ! vector opt. 201 198 zwi(ji,jj,1) = 0._wp 202 ze3ua = ( 1._wp - r_vvl ) * e3u (ji,jj,1,ktlev2) + r_vvl * e3u(ji,jj,1,ktlev3)203 zzws = - zdt * ( avm(ji+1,jj,2) + avm(ji ,jj,2) ) / ( ze3ua * e3uw (ji,jj,2,kt2lev) ) * wumask(ji,jj,2)199 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) 204 201 zWus = 0.5_wp * ( wi(ji ,jj,2) + wi(ji+1,jj,2) ) 205 202 zws(ji,jj,1 ) = zzws - zdt * MAX( zWus, 0._wp ) … … 213 210 DO jj = 2, jpjm1 214 211 DO ji = fs_2, fs_jpim1 ! vector opt. 215 ze3ua = ( 1._wp - r_vvl ) * e3u (ji,jj,jk,ktlev2) + r_vvl * e3u(ji,jj,jk,ktlev3) ! after scale factor at U-point212 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk) ! after scale factor at U-point 216 213 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) + akzu(ji,jj,jk ) ) & 217 & / ( ze3ua * e3uw (ji,jj,jk ,kt2lev) ) * wumask(ji,jj,jk )214 & / ( ze3ua * e3uw_n(ji,jj,jk ) ) * wumask(ji,jj,jk ) 218 215 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) ) & 219 & / ( ze3ua * e3uw (ji,jj,jk+1,kt2lev) ) * wumask(ji,jj,jk+1)216 & / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 220 217 zwi(ji,jj,jk) = zzwi 221 218 zws(ji,jj,jk) = zzws … … 228 225 DO jj = 2, jpjm1 229 226 DO ji = fs_2, fs_jpim1 ! vector opt. 230 ze3ua = ( 1._wp - r_vvl ) * e3u (ji,jj,jk,ktlev2) + r_vvl * e3u(ji,jj,jk,ktlev3) ! after scale factor at U-point231 zzwi = - zdt * ( avm(ji+1,jj,jk ) + avm(ji,jj,jk ) ) / ( ze3ua * e3uw (ji,jj,jk ,kt2lev) ) * wumask(ji,jj,jk )232 zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) / ( ze3ua * e3uw (ji,jj,jk+1,kt2lev) ) * wumask(ji,jj,jk+1)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) 233 230 zwi(ji,jj,jk) = zzwi 234 231 zws(ji,jj,jk) = zzws … … 257 254 DO ji = 2, jpim1 258 255 iku = mbku(ji,jj) ! ocean bottom level at u- and v-points 259 ze3ua = ( 1._wp - r_vvl ) * e3u (ji,jj,iku,ktlev2) + r_vvl * e3u(ji,jj,iku,ktlev3) ! after scale factor at T-point256 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku) ! after scale factor at T-point 260 257 zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) / ze3ua 261 258 END DO … … 266 263 !!gm top Cd is masked (=0 outside cavities) no need of test on mik>=2 ==>> it has been suppressed 267 264 iku = miku(ji,jj) ! ocean top level at u- and v-points 268 ze3ua = ( 1._wp - r_vvl ) * e3u (ji,jj,iku,ktlev2) + r_vvl * e3u(ji,jj,iku,ktlev3) ! after scale factor at T-point265 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku) ! after scale factor at T-point 269 266 zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / ze3ua 270 267 END DO … … 285 282 ! m is decomposed in the product of an upper and a lower triangular matrix 286 283 ! The 3 diagonal terms are in 2d arrays: zwd, zws, zwi 287 ! The solution (the after velocity) is in pu_rhs284 ! The solution (the after velocity) is in ua 288 285 !----------------------------------------------------------------------- 289 286 ! … … 298 295 DO jj = 2, jpjm1 !== second recurrence: SOLk = RHSk - Lk / Dk-1 Lk-1 ==! 299 296 DO ji = fs_2, fs_jpim1 ! vector opt. 300 ze3ua = ( 1._wp - r_vvl ) * e3u (ji,jj,1,ktlev2) + r_vvl * e3u(ji,jj,1,ktlev3)301 pu_rhs(ji,jj,1) = pu_rhs(ji,jj,1) + r2dt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) ) &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) ) & 302 299 & / ( ze3ua * rau0 ) * umask(ji,jj,1) 303 300 END DO … … 306 303 DO jj = 2, jpjm1 307 304 DO ji = fs_2, fs_jpim1 308 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * pu_rhs(ji,jj,jk-1)305 ua(ji,jj,jk) = ua(ji,jj,jk) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua(ji,jj,jk-1) 309 306 END DO 310 307 END DO … … 313 310 DO jj = 2, jpjm1 !== thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk ==! 314 311 DO ji = fs_2, fs_jpim1 ! vector opt. 315 pu_rhs(ji,jj,jpkm1) = pu_rhs(ji,jj,jpkm1) / zwd(ji,jj,jpkm1)312 ua(ji,jj,jpkm1) = ua(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) 316 313 END DO 317 314 END DO … … 319 316 DO jj = 2, jpjm1 320 317 DO ji = fs_2, fs_jpim1 321 pu_rhs(ji,jj,jk) = ( pu_rhs(ji,jj,jk) - zws(ji,jj,jk) * pu_rhs(ji,jj,jk+1) ) / zwd(ji,jj,jk)318 ua(ji,jj,jk) = ( ua(ji,jj,jk) - zws(ji,jj,jk) * ua(ji,jj,jk+1) ) / zwd(ji,jj,jk) 322 319 END DO 323 320 END DO … … 334 331 DO jj = 2, jpjm1 335 332 DO ji = fs_2, fs_jpim1 ! vector opt. 336 ze3va = ( 1._wp - r_vvl ) * e3v (ji,jj,jk,ktlev2) + r_vvl * e3v(ji,jj,jk,ktlev3) ! after scale factor at V-point333 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk) ! after scale factor at V-point 337 334 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) + akzv(ji,jj,jk ) ) & 338 & / ( ze3va * e3vw (ji,jj,jk ,kt2lev) ) * wvmask(ji,jj,jk )335 & / ( ze3va * e3vw_n(ji,jj,jk ) ) * wvmask(ji,jj,jk ) 339 336 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) ) & 340 & / ( ze3va * e3vw (ji,jj,jk+1,kt2lev) ) * wvmask(ji,jj,jk+1)337 & / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 341 338 zWvi = 0.5_wp * ( wi(ji,jj,jk ) + wi(ji,jj+1,jk ) ) * wvmask(ji,jj,jk ) 342 339 zWvs = 0.5_wp * ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) * wvmask(ji,jj,jk+1) … … 351 348 DO jj = 2, jpjm1 352 349 DO ji = fs_2, fs_jpim1 ! vector opt. 353 ze3va = ( 1._wp - r_vvl ) * e3v (ji,jj,jk,ktlev2) + r_vvl * e3v(ji,jj,jk,ktlev3) ! after scale factor at V-point354 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) ) / ( ze3va * e3vw (ji,jj,jk ,kt2lev) ) * wvmask(ji,jj,jk )355 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) / ( ze3va * e3vw (ji,jj,jk+1,kt2lev) ) * wvmask(ji,jj,jk+1)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) 356 353 zWvi = 0.5_wp * ( wi(ji,jj,jk ) + wi(ji,jj+1,jk ) ) * wvmask(ji,jj,jk ) 357 354 zWvs = 0.5_wp * ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) * wvmask(ji,jj,jk+1) … … 366 363 DO ji = fs_2, fs_jpim1 ! vector opt. 367 364 zwi(ji,jj,1) = 0._wp 368 ze3va = ( 1._wp - r_vvl ) * e3v (ji,jj,1,ktlev2) + r_vvl * e3v(ji,jj,1,ktlev3)369 zzws = - zdt * ( avm(ji,jj+1,2) + avm(ji,jj,2) ) / ( ze3va * e3vw (ji,jj,2,kt2lev) ) * wvmask(ji,jj,2)365 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) 370 367 zWvs = 0.5_wp * ( wi(ji,jj ,2) + wi(ji,jj+1,2) ) 371 368 zws(ji,jj,1 ) = zzws - zdt * MAX( zWvs, 0._wp ) … … 379 376 DO jj = 2, jpjm1 380 377 DO ji = fs_2, fs_jpim1 ! vector opt. 381 ze3va = ( 1._wp - r_vvl ) * e3v (ji,jj,jk,ktlev2) + r_vvl * e3v(ji,jj,jk,ktlev3) ! after scale factor at V-point378 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk) ! after scale factor at V-point 382 379 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) + akzv(ji,jj,jk ) ) & 383 & / ( ze3va * e3vw (ji,jj,jk ,kt2lev) ) * wvmask(ji,jj,jk )380 & / ( ze3va * e3vw_n(ji,jj,jk ) ) * wvmask(ji,jj,jk ) 384 381 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) ) & 385 & / ( ze3va * e3vw (ji,jj,jk+1,kt2lev) ) * wvmask(ji,jj,jk+1)382 & / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 386 383 zwi(ji,jj,jk) = zzwi 387 384 zws(ji,jj,jk) = zzws … … 394 391 DO jj = 2, jpjm1 395 392 DO ji = fs_2, fs_jpim1 ! vector opt. 396 ze3va = ( 1._wp - r_vvl ) * e3v (ji,jj,jk,ktlev2) + r_vvl * e3v(ji,jj,jk,ktlev3) ! after scale factor at V-point397 zzwi = - zdt * ( avm(ji,jj+1,jk ) + avm(ji,jj,jk ) ) / ( ze3va * e3vw (ji,jj,jk ,kt2lev) ) * wvmask(ji,jj,jk )398 zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) / ( ze3va * e3vw (ji,jj,jk+1,kt2lev) ) * wvmask(ji,jj,jk+1)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) 399 396 zwi(ji,jj,jk) = zzwi 400 397 zws(ji,jj,jk) = zzws … … 422 419 DO ji = 2, jpim1 423 420 ikv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 424 ze3va = ( 1._wp - r_vvl ) * e3v (ji,jj,ikv,ktlev2) + r_vvl * e3v(ji,jj,ikv,ktlev3) ! after scale factor at T-point421 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv) ! after scale factor at T-point 425 422 zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - r2dt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) / ze3va 426 423 END DO … … 430 427 DO ji = 2, jpim1 431 428 ikv = mikv(ji,jj) ! (first wet ocean u- and v-points) 432 ze3va = ( 1._wp - r_vvl ) * e3v (ji,jj,ikv,ktlev2) + r_vvl * e3v(ji,jj,ikv,ktlev3) ! after scale factor at T-point429 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv) ! after scale factor at T-point 433 430 zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / ze3va 434 431 END DO … … 449 446 ! m is decomposed in the product of an upper and lower triangular matrix 450 447 ! The 3 diagonal terms are in 2d arrays: zwd, zws, zwi 451 ! The solution (after velocity) is in 2d array pv_rhs448 ! The solution (after velocity) is in 2d array va 452 449 !----------------------------------------------------------------------- 453 450 ! … … 462 459 DO jj = 2, jpjm1 !== second recurrence: SOLk = RHSk - Lk / Dk-1 Lk-1 ==! 463 460 DO ji = fs_2, fs_jpim1 ! vector opt. 464 ze3va = ( 1._wp - r_vvl ) * e3v (ji,jj,1,ktlev2) + r_vvl * e3v(ji,jj,1,ktlev3)465 pv_rhs(ji,jj,1) = pv_rhs(ji,jj,1) + r2dt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) ) &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) ) & 466 463 & / ( ze3va * rau0 ) * vmask(ji,jj,1) 467 464 END DO … … 470 467 DO jj = 2, jpjm1 471 468 DO ji = fs_2, fs_jpim1 ! vector opt. 472 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * pv_rhs(ji,jj,jk-1)469 va(ji,jj,jk) = va(ji,jj,jk) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va(ji,jj,jk-1) 473 470 END DO 474 471 END DO … … 477 474 DO jj = 2, jpjm1 !== third recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk ==! 478 475 DO ji = fs_2, fs_jpim1 ! vector opt. 479 pv_rhs(ji,jj,jpkm1) = pv_rhs(ji,jj,jpkm1) / zwd(ji,jj,jpkm1)476 va(ji,jj,jpkm1) = va(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) 480 477 END DO 481 478 END DO … … 483 480 DO jj = 2, jpjm1 484 481 DO ji = fs_2, fs_jpim1 485 pv_rhs(ji,jj,jk) = ( pv_rhs(ji,jj,jk) - zws(ji,jj,jk) * pv_rhs(ji,jj,jk+1) ) / zwd(ji,jj,jk)482 va(ji,jj,jk) = ( va(ji,jj,jk) - zws(ji,jj,jk) * va(ji,jj,jk+1) ) / zwd(ji,jj,jk) 486 483 END DO 487 484 END DO … … 489 486 ! 490 487 IF( l_trddyn ) THEN ! save the vertical diffusive trends for further diagnostics 491 ztrdu(:,:,:) = ( pu_rhs(:,:,:) - uu(:,:,:,ktlev1) ) / r2dt - ztrdu(:,:,:)492 ztrdv(:,:,:) = ( pv_rhs(:,:,:) - vv(:,:,:,ktlev1) ) / r2dt - ztrdv(:,:,:)488 ztrdu(:,:,:) = ( ua(:,:,:) - ub(:,:,:) ) / r2dt - ztrdu(:,:,:) 489 ztrdv(:,:,:) = ( va(:,:,:) - vb(:,:,:) ) / r2dt - ztrdv(:,:,:) 493 490 CALL trd_dyn( ztrdu, ztrdv, jpdyn_zdf, kt ) 494 491 DEALLOCATE( ztrdu, ztrdv ) -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/traadv.F90
r10806 r10874 75 75 CONTAINS 76 76 77 SUBROUTINE tra_adv( kt , ktlev1, ktlev2, ktlev3, kt2lev, pts_rhs)77 SUBROUTINE tra_adv( kt ) 78 78 !!---------------------------------------------------------------------- 79 79 !! *** ROUTINE tra_adv *** … … 81 81 !! ** Purpose : compute the ocean tracer advection trend. 82 82 !! 83 !! ** Method : - Update (pu_rhs,pv_rhs) with the advection term following nadv 84 !!---------------------------------------------------------------------- 85 INTEGER, INTENT(in) :: kt ! ocean time-step index 86 INTEGER, INTENT(in) :: ktlev1, ktlev2, ktlev3 ! time level indices for 3-time-level source terms 87 INTEGER, INTENT(in) :: kt2lev ! time level index for 2-time-level source terms 88 REAL(wp), INTENT( inout), DIMENSION(jpi,jpj,jpk,jpts) :: pts_rhs ! temperature and salinity trends 83 !! ** Method : - Update (ua,va) with the advection term following nadv 84 !!---------------------------------------------------------------------- 85 INTEGER, INTENT(in) :: kt ! ocean time-step index 89 86 ! 90 87 INTEGER :: jk ! dummy loop index … … 106 103 IF( ln_wave .AND. ln_sdw ) THEN 107 104 DO jk = 1, jpkm1 ! eulerian transport + Stokes Drift 108 zun(:,:,jk) = e2u (:,:) * e3u (:,:,jk,ktlev2) * ( uu(:,:,jk,ktlev2) + usd(:,:,jk) )109 zvn(:,:,jk) = e1v (:,:) * e3v (:,:,jk,ktlev2) * ( vv(:,:,jk,ktlev2) + vsd(:,:,jk) )110 zwn(:,:,jk) = e1e2t(:,:) * ( w w(:,:,jk) + wsd(:,:,jk) )105 zun(:,:,jk) = e2u (:,:) * e3u_n(:,:,jk) * ( un(:,:,jk) + usd(:,:,jk) ) 106 zvn(:,:,jk) = e1v (:,:) * e3v_n(:,:,jk) * ( vn(:,:,jk) + vsd(:,:,jk) ) 107 zwn(:,:,jk) = e1e2t(:,:) * ( wn(:,:,jk) + wsd(:,:,jk) ) 111 108 END DO 112 109 ELSE 113 110 DO jk = 1, jpkm1 114 zun(:,:,jk) = e2u (:,:) * e3u (:,:,jk,ktlev2) * uu(:,:,jk,ktlev2) ! eulerian transport only115 zvn(:,:,jk) = e1v (:,:) * e3v (:,:,jk,ktlev2) * vv(:,:,jk,ktlev2)116 zwn(:,:,jk) = e1e2t(:,:) * w w(:,:,jk)111 zun(:,:,jk) = e2u (:,:) * e3u_n(:,:,jk) * un(:,:,jk) ! eulerian transport only 112 zvn(:,:,jk) = e1v (:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 113 zwn(:,:,jk) = e1e2t(:,:) * wn(:,:,jk) 117 114 END DO 118 115 ENDIF … … 142 139 IF( l_trdtra ) THEN !* Save ta and sa trends 143 140 ALLOCATE( ztrdt(jpi,jpj,jpk), ztrds(jpi,jpj,jpk) ) 144 ztrdt(:,:,:) = pts_rhs(:,:,:,jp_tem)145 ztrds(:,:,:) = pts_rhs(:,:,:,jp_sal)141 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 142 ztrds(:,:,:) = tsa(:,:,:,jp_sal) 146 143 ENDIF 147 144 ! … … 149 146 ! 150 147 CASE ( np_CEN ) ! Centered scheme : 2nd / 4th order 151 CALL tra_adv_cen ( kt, nit000, ktlev2, 'TRA', zun, zvn, zwn , ts(:,:,:,:,ktlev2), pts_rhs, jpts, nn_cen_h, nn_cen_v )148 CALL tra_adv_cen ( kt, nit000, 'TRA', zun, zvn, zwn , tsn, tsa, jpts, nn_cen_h, nn_cen_v ) 152 149 CASE ( np_FCT ) ! FCT scheme : 2nd / 4th order 153 CALL tra_adv_fct ( kt, nit000, ktlev1, ktlev2, ktlev3, 'TRA', r2dt, zun, zvn, zwn, & 154 & ts(:,:,:,:,ktlev1), ts(:,:,:,:,ktlev2), pts_rhs, jpts, nn_fct_h, nn_fct_v ) 150 CALL tra_adv_fct ( kt, nit000, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts, nn_fct_h, nn_fct_v ) 155 151 CASE ( np_MUS ) ! MUSCL 156 CALL tra_adv_mus ( kt, nit000, ktlev2, kt2lev, 'TRA', r2dt, zun, zvn, zwn, ts(:,:,:,:,ktlev1), pts_rhs, jpts , ln_mus_ups )152 CALL tra_adv_mus ( kt, nit000, 'TRA', r2dt, zun, zvn, zwn, tsb, tsa, jpts , ln_mus_ups ) 157 153 CASE ( np_UBS ) ! UBS 158 CALL tra_adv_ubs ( kt, nit000, ktlev2, 'TRA', r2dt, zun, zvn, zwn, ts(:,:,:,:,ktlev1), ts(:,:,:,:,ktlev2), pts_rhs, jpts , nn_ubs_v )154 CALL tra_adv_ubs ( kt, nit000, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts , nn_ubs_v ) 159 155 CASE ( np_QCK ) ! QUICKEST 160 CALL tra_adv_qck ( kt, nit000, ktlev2, 'TRA', r2dt, zun, zvn, zwn, ts(:,:,:,:,ktlev1), ts(:,:,:,:,ktlev2), pts_rhs, jpts )156 CALL tra_adv_qck ( kt, nit000, 'TRA', r2dt, zun, zvn, zwn, tsb, tsn, tsa, jpts ) 161 157 ! 162 158 END SELECT … … 164 160 IF( l_trdtra ) THEN ! save the advective trends for further diagnostics 165 161 DO jk = 1, jpkm1 166 ztrdt(:,:,jk) = pts_rhs(:,:,jk,jp_tem) - ztrdt(:,:,jk)167 ztrds(:,:,jk) = pts_rhs(:,:,jk,jp_sal) - ztrds(:,:,jk)162 ztrdt(:,:,jk) = tsa(:,:,jk,jp_tem) - ztrdt(:,:,jk) 163 ztrds(:,:,jk) = tsa(:,:,jk,jp_sal) - ztrds(:,:,jk) 168 164 END DO 169 165 CALL trd_tra( kt, 'TRA', jp_tem, jptra_totad, ztrdt ) -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/traadv_cen.F90
r10806 r10874 44 44 CONTAINS 45 45 46 SUBROUTINE tra_adv_cen( kt, kit000, ktlev, cdtype, pu, pv, pw, &47 & pt, pt_rhs, kjpt, kn_cen_h, kn_cen_v )46 SUBROUTINE tra_adv_cen( kt, kit000, cdtype, pun, pvn, pwn, & 47 & ptn, pta, kjpt, kn_cen_h, kn_cen_v ) 48 48 !!---------------------------------------------------------------------- 49 49 !! *** ROUTINE tra_adv_cen *** … … 59 59 !! = 4 ==>> 4th order COMPACT scheme - - 60 60 !! 61 !! ** Action : - update pt _rhswith the now advective tracer trends61 !! ** Action : - update pta with the now advective tracer trends 62 62 !! - send trends to trdtra module for further diagnostcs (l_trdtra=T) 63 63 !! - htr_adv, str_adv : poleward advective heat and salt transport (ln_diaptr=T) … … 65 65 INTEGER , INTENT(in ) :: kt ! ocean time-step index 66 66 INTEGER , INTENT(in ) :: kit000 ! first time step index 67 INTEGER , INTENT(in ) :: ktlev ! time level index for source terms68 67 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 69 68 INTEGER , INTENT(in ) :: kjpt ! number of tracers 70 69 INTEGER , INTENT(in ) :: kn_cen_h ! =2/4 (2nd or 4th order scheme) 71 70 INTEGER , INTENT(in ) :: kn_cen_v ! =2/4 (2nd or 4th order scheme) 72 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pu , pv, pw! 3 ocean velocity components73 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt ! now tracer fields74 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt _rhs! tracer trend71 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 72 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptn ! now tracer fields 73 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 75 74 ! 76 75 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 107 106 DO jj = 1, jpjm1 108 107 DO ji = 1, fs_jpim1 ! vector opt. 109 zwx(ji,jj,jk) = 0.5_wp * pu (ji,jj,jk) * ( pt(ji,jj,jk,jn) + pt(ji+1,jj ,jk,jn) )110 zwy(ji,jj,jk) = 0.5_wp * pv (ji,jj,jk) * ( pt(ji,jj,jk,jn) + pt(ji ,jj+1,jk,jn) )108 zwx(ji,jj,jk) = 0.5_wp * pun(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji+1,jj ,jk,jn) ) 109 zwy(ji,jj,jk) = 0.5_wp * pvn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji ,jj+1,jk,jn) ) 111 110 END DO 112 111 END DO … … 119 118 DO jj = 2, jpjm1 120 119 DO ji = fs_2, fs_jpim1 ! vector opt. 121 ztu(ji,jj,jk) = ( pt (ji+1,jj ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk)122 ztv(ji,jj,jk) = ( pt (ji ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk)120 ztu(ji,jj,jk) = ( ptn(ji+1,jj ,jk,jn) - ptn(ji,jj,jk,jn) ) * umask(ji,jj,jk) 121 ztv(ji,jj,jk) = ( ptn(ji ,jj+1,jk,jn) - ptn(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 123 122 END DO 124 123 END DO … … 129 128 DO jj = 2, jpjm1 130 129 DO ji = 1, fs_jpim1 ! vector opt. 131 zC2t_u = pt (ji,jj,jk,jn) + pt(ji+1,jj ,jk,jn) ! C2 interpolation of T at u- & v-points (x2)132 zC2t_v = pt (ji,jj,jk,jn) + pt(ji ,jj+1,jk,jn)130 zC2t_u = ptn(ji,jj,jk,jn) + ptn(ji+1,jj ,jk,jn) ! C2 interpolation of T at u- & v-points (x2) 131 zC2t_v = ptn(ji,jj,jk,jn) + ptn(ji ,jj+1,jk,jn) 133 132 ! ! C4 interpolation of T at u- & v-points (x2) 134 133 zC4t_u = zC2t_u + r1_6 * ( ztu(ji-1,jj,jk) - ztu(ji+1,jj,jk) ) 135 134 zC4t_v = zC2t_v + r1_6 * ( ztv(ji,jj-1,jk) - ztv(ji,jj+1,jk) ) 136 135 ! ! C4 fluxes 137 zwx(ji,jj,jk) = 0.5_wp * pu (ji,jj,jk) * zC4t_u138 zwy(ji,jj,jk) = 0.5_wp * pv (ji,jj,jk) * zC4t_v136 zwx(ji,jj,jk) = 0.5_wp * pun(ji,jj,jk) * zC4t_u 137 zwy(ji,jj,jk) = 0.5_wp * pvn(ji,jj,jk) * zC4t_v 139 138 END DO 140 139 END DO … … 151 150 DO jj = 2, jpjm1 152 151 DO ji = fs_2, fs_jpim1 ! vector opt. 153 zwz(ji,jj,jk) = 0.5 * pw (ji,jj,jk) * ( pt(ji,jj,jk,jn) + pt(ji,jj,jk-1,jn) ) * wmask(ji,jj,jk)152 zwz(ji,jj,jk) = 0.5 * pwn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj,jk-1,jn) ) * wmask(ji,jj,jk) 154 153 END DO 155 154 END DO … … 157 156 ! 158 157 CASE( 4 ) !* 4th order compact 159 CALL interp_4th_cpt( pt (:,:,:,jn) , ztw ) ! ztw = interpolated value of T at w-point158 CALL interp_4th_cpt( ptn(:,:,:,jn) , ztw ) ! ztw = interpolated value of T at w-point 160 159 DO jk = 2, jpkm1 161 160 DO jj = 2, jpjm1 162 161 DO ji = fs_2, fs_jpim1 163 zwz(ji,jj,jk) = pw (ji,jj,jk) * ztw(ji,jj,jk) * wmask(ji,jj,jk)162 zwz(ji,jj,jk) = pwn(ji,jj,jk) * ztw(ji,jj,jk) * wmask(ji,jj,jk) 164 163 END DO 165 164 END DO … … 172 171 DO jj = 1, jpj 173 172 DO ji = 1, jpi 174 zwz(ji,jj, mikt(ji,jj) ) = pw (ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn)173 zwz(ji,jj, mikt(ji,jj) ) = pwn(ji,jj,mikt(ji,jj)) * ptn(ji,jj,mikt(ji,jj),jn) 175 174 END DO 176 175 END DO 177 176 ELSE ! no ice-shelf cavities (only ocean surface) 178 zwz(:,:,1) = pw (:,:,1) * pt(:,:,1,jn)177 zwz(:,:,1) = pwn(:,:,1) * ptn(:,:,1,jn) 179 178 ENDIF 180 179 ENDIF … … 183 182 DO jj = 2, jpjm1 184 183 DO ji = fs_2, fs_jpim1 ! vector opt. 185 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) &184 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) & 186 185 & - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 187 186 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & 188 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) / e3t (ji,jj,jk,ktlev)187 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 189 188 END DO 190 189 END DO … … 192 191 ! ! trend diagnostics 193 192 IF( l_trd ) THEN 194 CALL trd_tra( kt, cdtype, jn, jptra_xad, zwx, pu , pt(:,:,:,jn) )195 CALL trd_tra( kt, cdtype, jn, jptra_yad, zwy, pv , pt(:,:,:,jn) )196 CALL trd_tra( kt, cdtype, jn, jptra_zad, zwz, pw , pt(:,:,:,jn) )193 CALL trd_tra( kt, cdtype, jn, jptra_xad, zwx, pun, ptn(:,:,:,jn) ) 194 CALL trd_tra( kt, cdtype, jn, jptra_yad, zwy, pvn, ptn(:,:,:,jn) ) 195 CALL trd_tra( kt, cdtype, jn, jptra_zad, zwz, pwn, ptn(:,:,:,jn) ) 197 196 END IF 198 197 ! ! "Poleward" heat and salt transports -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/traadv_fct.F90
r10806 r10874 52 52 CONTAINS 53 53 54 SUBROUTINE tra_adv_fct( kt, kit000, ktlev1, ktlev2, ktlev3, cdtype, p2dt, pu, pv, pw, &55 & pt_lev1, pt_lev2, pt_rhs, kjpt, kn_fct_h, kn_fct_v )54 SUBROUTINE tra_adv_fct( kt, kit000, cdtype, p2dt, pun, pvn, pwn, & 55 & ptb, ptn, pta, kjpt, kn_fct_h, kn_fct_v ) 56 56 !!---------------------------------------------------------------------- 57 57 !! *** ROUTINE tra_adv_fct *** … … 65 65 !! - corrected flux (monotonic correction) 66 66 !! 67 !! ** Action : - update pt _rhswith the now advective tracer trends67 !! ** Action : - update pta with the now advective tracer trends 68 68 !! - send trends to trdtra module for further diagnostics (l_trdtra=T) 69 69 !! - htr_adv, str_adv : poleward advective heat and salt transport (ln_diaptr=T) 70 70 !!---------------------------------------------------------------------- 71 71 INTEGER , INTENT(in ) :: kt ! ocean time-step index 72 INTEGER , INTENT(in ) :: ktlev1, ktlev2, ktlev3 ! time level indices for source terms73 72 INTEGER , INTENT(in ) :: kit000 ! first time step index 74 73 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) … … 77 76 INTEGER , INTENT(in ) :: kn_fct_v ! order of the FCT scheme (=2 or 4) 78 77 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 79 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pu , pv, pw! 3 ocean velocity components80 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt _lev1, pt_lev2! before and now tracer fields81 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt _rhs! tracer trend78 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 79 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 80 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 82 81 ! 83 82 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 126 125 DO ji = 1, fs_jpim1 ! vector opt. 127 126 ! upstream scheme 128 zfp_ui = pu (ji,jj,jk) + ABS( pu(ji,jj,jk) )129 zfm_ui = pu (ji,jj,jk) - ABS( pu(ji,jj,jk) )130 zfp_vj = pv (ji,jj,jk) + ABS( pv(ji,jj,jk) )131 zfm_vj = pv (ji,jj,jk) - ABS( pv(ji,jj,jk) )132 zwx(ji,jj,jk) = 0.5 * ( zfp_ui * pt _lev1(ji,jj,jk,jn) + zfm_ui * pt_lev1(ji+1,jj ,jk,jn) )133 zwy(ji,jj,jk) = 0.5 * ( zfp_vj * pt _lev1(ji,jj,jk,jn) + zfm_vj * pt_lev1(ji ,jj+1,jk,jn) )127 zfp_ui = pun(ji,jj,jk) + ABS( pun(ji,jj,jk) ) 128 zfm_ui = pun(ji,jj,jk) - ABS( pun(ji,jj,jk) ) 129 zfp_vj = pvn(ji,jj,jk) + ABS( pvn(ji,jj,jk) ) 130 zfm_vj = pvn(ji,jj,jk) - ABS( pvn(ji,jj,jk) ) 131 zwx(ji,jj,jk) = 0.5 * ( zfp_ui * ptb(ji,jj,jk,jn) + zfm_ui * ptb(ji+1,jj ,jk,jn) ) 132 zwy(ji,jj,jk) = 0.5 * ( zfp_vj * ptb(ji,jj,jk,jn) + zfm_vj * ptb(ji ,jj+1,jk,jn) ) 134 133 END DO 135 134 END DO … … 139 138 DO jj = 1, jpj 140 139 DO ji = 1, jpi 141 zfp_wk = pw (ji,jj,jk) + ABS( pw(ji,jj,jk) )142 zfm_wk = pw (ji,jj,jk) - ABS( pw(ji,jj,jk) )143 zwz(ji,jj,jk) = 0.5 * ( zfp_wk * pt _lev1(ji,jj,jk,jn) + zfm_wk * pt_lev1(ji,jj,jk-1,jn) ) * wmask(ji,jj,jk)140 zfp_wk = pwn(ji,jj,jk) + ABS( pwn(ji,jj,jk) ) 141 zfm_wk = pwn(ji,jj,jk) - ABS( pwn(ji,jj,jk) ) 142 zwz(ji,jj,jk) = 0.5 * ( zfp_wk * ptb(ji,jj,jk,jn) + zfm_wk * ptb(ji,jj,jk-1,jn) ) * wmask(ji,jj,jk) 144 143 END DO 145 144 END DO … … 149 148 DO jj = 1, jpj 150 149 DO ji = 1, jpi 151 zwz(ji,jj, mikt(ji,jj) ) = pw (ji,jj,mikt(ji,jj)) * pt_lev1(ji,jj,mikt(ji,jj),jn) ! linear free surface150 zwz(ji,jj, mikt(ji,jj) ) = pwn(ji,jj,mikt(ji,jj)) * ptb(ji,jj,mikt(ji,jj),jn) ! linear free surface 152 151 END DO 153 152 END DO 154 153 ELSE ! no cavities: only at the ocean surface 155 zwz(:,:,1) = pw (:,:,1) * pt_lev1(:,:,1,jn)154 zwz(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn) 156 155 ENDIF 157 156 ENDIF … … 165 164 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) 166 165 ! ! update and guess with monotonic sheme 167 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + ztra / e3t(ji,jj,jk,ktlev2) * tmask(ji,jj,jk)168 zwi(ji,jj,jk) = ( e3t (ji,jj,jk,ktlev1) * pt_lev1(ji,jj,jk,jn) + p2dt * ztra ) / e3t(ji,jj,jk,ktlev3) * tmask(ji,jj,jk)166 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra / e3t_n(ji,jj,jk) * tmask(ji,jj,jk) 167 zwi(ji,jj,jk) = ( e3t_b(ji,jj,jk) * ptb(ji,jj,jk,jn) + p2dt * ztra ) / e3t_a(ji,jj,jk) * tmask(ji,jj,jk) 169 168 END DO 170 169 END DO … … 185 184 DO jj = 1, jpjm1 186 185 DO ji = 1, fs_jpim1 ! vector opt. 187 zwx(ji,jj,jk) = 0.5_wp * pu (ji,jj,jk) * ( pt_lev2(ji,jj,jk,jn) + pt_lev2(ji+1,jj,jk,jn) ) - zwx(ji,jj,jk)188 zwy(ji,jj,jk) = 0.5_wp * pv (ji,jj,jk) * ( pt_lev2(ji,jj,jk,jn) + pt_lev2(ji,jj+1,jk,jn) ) - zwy(ji,jj,jk)186 zwx(ji,jj,jk) = 0.5_wp * pun(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji+1,jj,jk,jn) ) - zwx(ji,jj,jk) 187 zwy(ji,jj,jk) = 0.5_wp * pvn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj+1,jk,jn) ) - zwy(ji,jj,jk) 189 188 END DO 190 189 END DO … … 197 196 DO jj = 1, jpjm1 ! 1st derivative (gradient) 198 197 DO ji = 1, fs_jpim1 ! vector opt. 199 ztu(ji,jj,jk) = ( pt _lev2(ji+1,jj ,jk,jn) - pt_lev2(ji,jj,jk,jn) ) * umask(ji,jj,jk)200 ztv(ji,jj,jk) = ( pt _lev2(ji ,jj+1,jk,jn) - pt_lev2(ji,jj,jk,jn) ) * vmask(ji,jj,jk)198 ztu(ji,jj,jk) = ( ptn(ji+1,jj ,jk,jn) - ptn(ji,jj,jk,jn) ) * umask(ji,jj,jk) 199 ztv(ji,jj,jk) = ( ptn(ji ,jj+1,jk,jn) - ptn(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 201 200 END DO 202 201 END DO … … 213 212 DO jj = 1, jpjm1 214 213 DO ji = 1, fs_jpim1 ! vector opt. 215 zC2t_u = pt _lev2(ji,jj,jk,jn) + pt_lev2(ji+1,jj ,jk,jn) ! 2 x C2 interpolation of T at u- & v-points216 zC2t_v = pt _lev2(ji,jj,jk,jn) + pt_lev2(ji ,jj+1,jk,jn)214 zC2t_u = ptn(ji,jj,jk,jn) + ptn(ji+1,jj ,jk,jn) ! 2 x C2 interpolation of T at u- & v-points 215 zC2t_v = ptn(ji,jj,jk,jn) + ptn(ji ,jj+1,jk,jn) 217 216 ! ! C4 minus upstream advective fluxes 218 zwx(ji,jj,jk) = 0.5_wp * pu (ji,jj,jk) * ( zC2t_u + zltu(ji,jj,jk) - zltu(ji+1,jj,jk) ) - zwx(ji,jj,jk)219 zwy(ji,jj,jk) = 0.5_wp * pv (ji,jj,jk) * ( zC2t_v + zltv(ji,jj,jk) - zltv(ji,jj+1,jk) ) - zwy(ji,jj,jk)217 zwx(ji,jj,jk) = 0.5_wp * pun(ji,jj,jk) * ( zC2t_u + zltu(ji,jj,jk) - zltu(ji+1,jj,jk) ) - zwx(ji,jj,jk) 218 zwy(ji,jj,jk) = 0.5_wp * pvn(ji,jj,jk) * ( zC2t_v + zltv(ji,jj,jk) - zltv(ji,jj+1,jk) ) - zwy(ji,jj,jk) 220 219 END DO 221 220 END DO … … 228 227 DO jj = 1, jpjm1 229 228 DO ji = 1, fs_jpim1 ! vector opt. 230 ztu(ji,jj,jk) = ( pt _lev2(ji+1,jj ,jk,jn) - pt_lev2(ji,jj,jk,jn) ) * umask(ji,jj,jk)231 ztv(ji,jj,jk) = ( pt _lev2(ji ,jj+1,jk,jn) - pt_lev2(ji,jj,jk,jn) ) * vmask(ji,jj,jk)229 ztu(ji,jj,jk) = ( ptn(ji+1,jj ,jk,jn) - ptn(ji,jj,jk,jn) ) * umask(ji,jj,jk) 230 ztv(ji,jj,jk) = ( ptn(ji ,jj+1,jk,jn) - ptn(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 232 231 END DO 233 232 END DO … … 238 237 DO jj = 2, jpjm1 239 238 DO ji = 2, fs_jpim1 ! vector opt. 240 zC2t_u = pt _lev2(ji,jj,jk,jn) + pt_lev2(ji+1,jj ,jk,jn) ! 2 x C2 interpolation of T at u- & v-points (x2)241 zC2t_v = pt _lev2(ji,jj,jk,jn) + pt_lev2(ji ,jj+1,jk,jn)239 zC2t_u = ptn(ji,jj,jk,jn) + ptn(ji+1,jj ,jk,jn) ! 2 x C2 interpolation of T at u- & v-points (x2) 240 zC2t_v = ptn(ji,jj,jk,jn) + ptn(ji ,jj+1,jk,jn) 242 241 ! ! C4 interpolation of T at u- & v-points (x2) 243 242 zC4t_u = zC2t_u + r1_6 * ( ztu(ji-1,jj ,jk) - ztu(ji+1,jj ,jk) ) 244 243 zC4t_v = zC2t_v + r1_6 * ( ztv(ji ,jj-1,jk) - ztv(ji ,jj+1,jk) ) 245 244 ! ! C4 minus upstream advective fluxes 246 zwx(ji,jj,jk) = 0.5_wp * pu (ji,jj,jk) * zC4t_u - zwx(ji,jj,jk)247 zwy(ji,jj,jk) = 0.5_wp * pv (ji,jj,jk) * zC4t_v - zwy(ji,jj,jk)245 zwx(ji,jj,jk) = 0.5_wp * pun(ji,jj,jk) * zC4t_u - zwx(ji,jj,jk) 246 zwy(ji,jj,jk) = 0.5_wp * pvn(ji,jj,jk) * zC4t_v - zwy(ji,jj,jk) 248 247 END DO 249 248 END DO … … 258 257 DO jj = 2, jpjm1 259 258 DO ji = fs_2, fs_jpim1 260 zwz(ji,jj,jk) = ( pw (ji,jj,jk) * 0.5_wp * ( pt_lev2(ji,jj,jk,jn) + pt_lev2(ji,jj,jk-1,jn) ) &259 zwz(ji,jj,jk) = ( pwn(ji,jj,jk) * 0.5_wp * ( ptn(ji,jj,jk,jn) + ptn(ji,jj,jk-1,jn) ) & 261 260 & - zwz(ji,jj,jk) ) * wmask(ji,jj,jk) 262 261 END DO … … 265 264 ! 266 265 CASE( 4 ) !- 4th order COMPACT 267 CALL interp_4th_cpt( pt _lev2(:,:,:,jn) , ztw ) ! zwt = COMPACT interpolation of T at w-point266 CALL interp_4th_cpt( ptn(:,:,:,jn) , ztw ) ! zwt = COMPACT interpolation of T at w-point 268 267 DO jk = 2, jpkm1 269 268 DO jj = 2, jpjm1 270 269 DO ji = fs_2, fs_jpim1 271 zwz(ji,jj,jk) = ( pw (ji,jj,jk) * ztw(ji,jj,jk) - zwz(ji,jj,jk) ) * wmask(ji,jj,jk)270 zwz(ji,jj,jk) = ( pwn(ji,jj,jk) * ztw(ji,jj,jk) - zwz(ji,jj,jk) ) * wmask(ji,jj,jk) 272 271 END DO 273 272 END DO … … 283 282 ! !== monotonicity algorithm ==! 284 283 ! 285 CALL nonosc( pt _lev1(:,:,:,jn), zwx, zwy, zwz, zwi, p2dt, e3t(:,:,:,ktlev2))284 CALL nonosc( ptb(:,:,:,jn), zwx, zwy, zwz, zwi, p2dt ) 286 285 ! 287 286 ! !== final trend with corrected fluxes ==! … … 290 289 DO jj = 2, jpjm1 291 290 DO ji = fs_2, fs_jpim1 ! vector opt. 292 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) &291 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 293 292 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) & 294 293 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) & 295 & * r1_e1e2t(ji,jj) / e3t (ji,jj,jk,ktlev2)294 & * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 296 295 END DO 297 296 END DO … … 304 303 ! 305 304 IF( l_trd ) THEN ! trend diagnostics 306 CALL trd_tra( kt, cdtype, jn, jptra_xad, ztrdx, pu , pt_lev2(:,:,:,jn) )307 CALL trd_tra( kt, cdtype, jn, jptra_yad, ztrdy, pv , pt_lev2(:,:,:,jn) )308 CALL trd_tra( kt, cdtype, jn, jptra_zad, ztrdz, pw , pt_lev2(:,:,:,jn) )305 CALL trd_tra( kt, cdtype, jn, jptra_xad, ztrdx, pun, ptn(:,:,:,jn) ) 306 CALL trd_tra( kt, cdtype, jn, jptra_yad, ztrdy, pvn, ptn(:,:,:,jn) ) 307 CALL trd_tra( kt, cdtype, jn, jptra_zad, ztrdz, pwn, ptn(:,:,:,jn) ) 309 308 ENDIF 310 309 ! ! heat/salt transport … … 329 328 330 329 331 SUBROUTINE nonosc( pbef, paa, pbb, pcc, paft, p2dt , pe3t)330 SUBROUTINE nonosc( pbef, paa, pbb, pcc, paft, p2dt ) 332 331 !!--------------------------------------------------------------------- 333 332 !! *** ROUTINE nonosc *** … … 342 341 !! in-space based differencing for fluid 343 342 !!---------------------------------------------------------------------- 344 REAL(wp) , INTENT(in ) :: p2dt 345 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in ) :: pbef, paft , pe3t ! before & after field, now e3tfield346 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(inout) :: paa, pbb, pcc 343 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 344 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in ) :: pbef, paft ! before & after field 345 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(inout) :: paa, pbb, pcc ! monotonic fluxes in the 3 directions 347 346 ! 348 347 INTEGER :: ji, jj, jk ! dummy loop indices … … 393 392 394 393 ! up & down beta terms 395 zbt = e1e2t(ji,jj) * pe3t(ji,jj,jk) / p2dt394 zbt = e1e2t(ji,jj) * e3t_n(ji,jj,jk) / p2dt 396 395 zbetup(ji,jj,jk) = ( zup - paft(ji,jj,jk) ) / ( zpos + zrtrn ) * zbt 397 396 zbetdo(ji,jj,jk) = ( paft(ji,jj,jk) - zdo ) / ( zneg + zrtrn ) * zbt … … 635 634 !! The tri-diagonals matrix is given as input 3D arrays: pD, pU, pL 636 635 !! (i.e. the Diagonal, the Upper diagonal, and the Lower diagonal). 637 !! The solution is pt _rhs.636 !! The solution is pta. 638 637 !! The 3d array zwt is used as a work space array. 639 638 !!---------------------------------------------------------------------- -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/traadv_mus.F90
r10806 r10874 54 54 CONTAINS 55 55 56 SUBROUTINE tra_adv_mus( kt, kit000, ktlev, kt2lev, cdtype, p2dt, pu, pv, pw, &57 & pt, pt_rhs, kjpt, ld_msc_ups )56 SUBROUTINE tra_adv_mus( kt, kit000, cdtype, p2dt, pun, pvn, pwn, & 57 & ptb, pta, kjpt, ld_msc_ups ) 58 58 !!---------------------------------------------------------------------- 59 59 !! *** ROUTINE tra_adv_mus *** … … 66 66 !! ld_msc_ups=T : 67 67 !! 68 !! ** Action : - update pt _rhswith the now advective tracer trends68 !! ** Action : - update pta with the now advective tracer trends 69 69 !! - send trends to trdtra module for further diagnostcs (l_trdtra=T) 70 70 !! - htr_adv, str_adv : poleward advective heat and salt transport (ln_diaptr=T) … … 75 75 INTEGER , INTENT(in ) :: kt ! ocean time-step index 76 76 INTEGER , INTENT(in ) :: kit000 ! first time step index 77 INTEGER , INTENT(in ) :: ktlev ! time level index for 3-time-level source terms78 INTEGER , INTENT(in ) :: kt2lev ! time level index for 2-time-level source terms79 77 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 80 78 INTEGER , INTENT(in ) :: kjpt ! number of tracers 81 79 LOGICAL , INTENT(in ) :: ld_msc_ups ! use upstream scheme within muscl 82 80 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 83 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pu , pv, pw! 3 ocean velocity components84 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt ! before tracer field85 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt _rhs! tracer trend81 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 82 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before tracer field 83 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 86 84 ! 87 85 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 136 134 DO jj = 1, jpjm1 137 135 DO ji = 1, fs_jpim1 ! vector opt. 138 zwx(ji,jj,jk) = umask(ji,jj,jk) * ( pt (ji+1,jj,jk,jn) - pt(ji,jj,jk,jn) )139 zwy(ji,jj,jk) = vmask(ji,jj,jk) * ( pt (ji,jj+1,jk,jn) - pt(ji,jj,jk,jn) )136 zwx(ji,jj,jk) = umask(ji,jj,jk) * ( ptb(ji+1,jj,jk,jn) - ptb(ji,jj,jk,jn) ) 137 zwy(ji,jj,jk) = vmask(ji,jj,jk) * ( ptb(ji,jj+1,jk,jn) - ptb(ji,jj,jk,jn) ) 140 138 END DO 141 139 END DO … … 174 172 DO ji = fs_2, fs_jpim1 ! vector opt. 175 173 ! MUSCL fluxes 176 z0u = SIGN( 0.5, pu (ji,jj,jk) )174 z0u = SIGN( 0.5, pun(ji,jj,jk) ) 177 175 zalpha = 0.5 - z0u 178 zu = z0u - 0.5 * pu (ji,jj,jk) * p2dt * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,ktlev)179 zzwx = pt (ji+1,jj,jk,jn) + xind(ji,jj,jk) * zu * zslpx(ji+1,jj,jk)180 zzwy = pt (ji ,jj,jk,jn) + xind(ji,jj,jk) * zu * zslpx(ji ,jj,jk)181 zwx(ji,jj,jk) = pu (ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy )176 zu = z0u - 0.5 * pun(ji,jj,jk) * p2dt * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 177 zzwx = ptb(ji+1,jj,jk,jn) + xind(ji,jj,jk) * zu * zslpx(ji+1,jj,jk) 178 zzwy = ptb(ji ,jj,jk,jn) + xind(ji,jj,jk) * zu * zslpx(ji ,jj,jk) 179 zwx(ji,jj,jk) = pun(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 182 180 ! 183 z0v = SIGN( 0.5, pv (ji,jj,jk) )181 z0v = SIGN( 0.5, pvn(ji,jj,jk) ) 184 182 zalpha = 0.5 - z0v 185 zv = z0v - 0.5 * pv (ji,jj,jk) * p2dt * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,ktlev)186 zzwx = pt (ji,jj+1,jk,jn) + xind(ji,jj,jk) * zv * zslpy(ji,jj+1,jk)187 zzwy = pt (ji,jj ,jk,jn) + xind(ji,jj,jk) * zv * zslpy(ji,jj ,jk)188 zwy(ji,jj,jk) = pv (ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy )183 zv = z0v - 0.5 * pvn(ji,jj,jk) * p2dt * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 184 zzwx = ptb(ji,jj+1,jk,jn) + xind(ji,jj,jk) * zv * zslpy(ji,jj+1,jk) 185 zzwy = ptb(ji,jj ,jk,jn) + xind(ji,jj,jk) * zv * zslpy(ji,jj ,jk) 186 zwy(ji,jj,jk) = pvn(ji,jj,jk) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) 189 187 END DO 190 188 END DO … … 195 193 DO jj = 2, jpjm1 196 194 DO ji = fs_2, fs_jpim1 ! vector opt. 197 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) &195 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) - ( zwx(ji,jj,jk) - zwx(ji-1,jj ,jk ) & 198 196 & + zwy(ji,jj,jk) - zwy(ji ,jj-1,jk ) ) & 199 & * r1_e1e2t(ji,jj) / e3t (ji,jj,jk,ktlev)197 & * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 200 198 END DO 201 199 END DO … … 203 201 ! ! trend diagnostics 204 202 IF( l_trd ) THEN 205 CALL trd_tra( kt, cdtype, jn, jptra_xad, zwx, pu , pt(:,:,:,jn) )206 CALL trd_tra( kt, cdtype, jn, jptra_yad, zwy, pv , pt(:,:,:,jn) )203 CALL trd_tra( kt, cdtype, jn, jptra_xad, zwx, pun, ptb(:,:,:,jn) ) 204 CALL trd_tra( kt, cdtype, jn, jptra_yad, zwy, pvn, ptb(:,:,:,jn) ) 207 205 END IF 208 206 ! ! "Poleward" heat and salt transports … … 217 215 zwx(:,:,jpk) = 0._wp 218 216 DO jk = 2, jpkm1 ! interior values 219 zwx(:,:,jk) = tmask(:,:,jk) * ( pt (:,:,jk-1,jn) - pt(:,:,jk,jn) )217 zwx(:,:,jk) = tmask(:,:,jk) * ( ptb(:,:,jk-1,jn) - ptb(:,:,jk,jn) ) 220 218 END DO 221 219 ! !-- Slopes of tracer … … 241 239 DO jj = 2, jpjm1 242 240 DO ji = fs_2, fs_jpim1 ! vector opt. 243 z0w = SIGN( 0.5, pw (ji,jj,jk+1) )241 z0w = SIGN( 0.5, pwn(ji,jj,jk+1) ) 244 242 zalpha = 0.5 + z0w 245 zw = z0w - 0.5 * pw (ji,jj,jk+1) * p2dt * r1_e1e2t(ji,jj) / e3w(ji,jj,jk+1,kt2lev)246 zzwx = pt (ji,jj,jk+1,jn) + xind(ji,jj,jk) * zw * zslpx(ji,jj,jk+1)247 zzwy = pt (ji,jj,jk ,jn) + xind(ji,jj,jk) * zw * zslpx(ji,jj,jk )248 zwx(ji,jj,jk+1) = pw (ji,jj,jk+1) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) * wmask(ji,jj,jk)243 zw = z0w - 0.5 * pwn(ji,jj,jk+1) * p2dt * r1_e1e2t(ji,jj) / e3w_n(ji,jj,jk+1) 244 zzwx = ptb(ji,jj,jk+1,jn) + xind(ji,jj,jk) * zw * zslpx(ji,jj,jk+1) 245 zzwy = ptb(ji,jj,jk ,jn) + xind(ji,jj,jk) * zw * zslpx(ji,jj,jk ) 246 zwx(ji,jj,jk+1) = pwn(ji,jj,jk+1) * ( zalpha * zzwx + (1.-zalpha) * zzwy ) * wmask(ji,jj,jk) 249 247 END DO 250 248 END DO … … 254 252 DO jj = 1, jpj 255 253 DO ji = 1, jpi 256 zwx(ji,jj, mikt(ji,jj) ) = pw (ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn)254 zwx(ji,jj, mikt(ji,jj) ) = pwn(ji,jj,mikt(ji,jj)) * ptb(ji,jj,mikt(ji,jj),jn) 257 255 END DO 258 256 END DO 259 257 ELSE ! no cavities: only at the ocean surface 260 zwx(:,:,1) = pw (:,:,1) * pt(:,:,1,jn)258 zwx(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn) 261 259 ENDIF 262 260 ENDIF … … 265 263 DO jj = 2, jpjm1 266 264 DO ji = fs_2, fs_jpim1 ! vector opt. 267 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) - ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,ktlev)265 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) - ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 268 266 END DO 269 267 END DO 270 268 END DO 271 269 ! ! send trends for diagnostic 272 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_zad, zwx, pw , pt(:,:,:,jn) )270 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_zad, zwx, pwn, ptb(:,:,:,jn) ) 273 271 ! 274 272 END DO ! end of tracer loop -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/traadv_qck.F90
r10806 r10874 47 47 CONTAINS 48 48 49 SUBROUTINE tra_adv_qck ( kt, kit000, ktlev, cdtype, p2dt, pu, pv, pw, &50 & pt_lev1, pt_lev2, pt_rhs, kjpt )49 SUBROUTINE tra_adv_qck ( kt, kit000, cdtype, p2dt, pun, pvn, pwn, & 50 & ptb, ptn, pta, kjpt ) 51 51 !!---------------------------------------------------------------------- 52 52 !! *** ROUTINE tra_adv_qck *** … … 72 72 !! dt = 2*rdtra and the scalar values are tb and sb 73 73 !! 74 !! On the vertical, the simple centered scheme used pt _lev274 !! On the vertical, the simple centered scheme used ptn 75 75 !! 76 76 !! The fluxes are bounded by the ULTIMATE limiter to … … 78 78 !! prevent the appearance of spurious numerical oscillations 79 79 !! 80 !! ** Action : - update pt _rhswith the now advective tracer trends80 !! ** Action : - update pta with the now advective tracer trends 81 81 !! - send trends to trdtra module for further diagnostcs (l_trdtra=T) 82 82 !! - htr_adv, str_adv : poleward advective heat and salt transport (ln_diaptr=T) … … 86 86 INTEGER , INTENT(in ) :: kt ! ocean time-step index 87 87 INTEGER , INTENT(in ) :: kit000 ! first time step index 88 INTEGER , INTENT(in ) :: ktlev ! time level index for source terms89 88 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 90 89 INTEGER , INTENT(in ) :: kjpt ! number of tracers 91 90 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 92 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pu , pv, pw! 3 ocean velocity components93 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt _lev1, pt_lev2! before and now tracer fields94 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt _rhs! tracer trend91 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 92 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 93 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 95 94 !!---------------------------------------------------------------------- 96 95 ! … … 109 108 ! 110 109 ! ! horizontal fluxes are computed with the QUICKEST + ULTIMATE scheme 111 CALL tra_adv_qck_i( kt, ktlev, cdtype, p2dt, pu, pt_lev1, pt_lev2, pt_rhs, kjpt )112 CALL tra_adv_qck_j( kt, ktlev, cdtype, p2dt, pv, pt_lev1, pt_lev2, pt_rhs, kjpt )110 CALL tra_adv_qck_i( kt, cdtype, p2dt, pun, ptb, ptn, pta, kjpt ) 111 CALL tra_adv_qck_j( kt, cdtype, p2dt, pvn, ptb, ptn, pta, kjpt ) 113 112 114 113 ! ! vertical fluxes are computed with the 2nd order centered scheme 115 CALL tra_adv_cen2_k( kt, ktlev, cdtype, pw, pt_lev2, pt_rhs, kjpt )114 CALL tra_adv_cen2_k( kt, cdtype, pwn, ptn, pta, kjpt ) 116 115 ! 117 116 END SUBROUTINE tra_adv_qck 118 117 119 118 120 SUBROUTINE tra_adv_qck_i( kt, ktlev, cdtype, p2dt, pu, &121 & pt _lev1, pt_lev2, pt_rhs, kjpt )119 SUBROUTINE tra_adv_qck_i( kt, cdtype, p2dt, pun, & 120 & ptb, ptn, pta, kjpt ) 122 121 !!---------------------------------------------------------------------- 123 122 !! 124 123 !!---------------------------------------------------------------------- 125 124 INTEGER , INTENT(in ) :: kt ! ocean time-step index 126 INTEGER , INTENT(in ) :: ktlev ! time level index for source terms127 125 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 128 126 INTEGER , INTENT(in ) :: kjpt ! number of tracers 129 127 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 130 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pu ! i-velocity components131 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt _lev1, pt_lev2! before and now tracer fields132 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt _rhs! tracer trend128 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun ! i-velocity components 129 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 130 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 133 131 !! 134 132 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 147 145 DO jj = 2, jpjm1 148 146 DO ji = fs_2, fs_jpim1 ! vector opt. 149 zfc(ji,jj,jk) = pt _lev1(ji-1,jj,jk,jn) ! Upstream in the x-direction for the tracer150 zfd(ji,jj,jk) = pt _lev1(ji+1,jj,jk,jn) ! Downstream in the x-direction for the tracer147 zfc(ji,jj,jk) = ptb(ji-1,jj,jk,jn) ! Upstream in the x-direction for the tracer 148 zfd(ji,jj,jk) = ptb(ji+1,jj,jk,jn) ! Downstream in the x-direction for the tracer 151 149 END DO 152 150 END DO … … 160 158 DO jj = 2, jpjm1 161 159 DO ji = fs_2, fs_jpim1 ! vector opt. 162 zdir = 0.5 + SIGN( 0.5, pu (ji,jj,jk) ) ! if pu> 0 : zdir = 1 otherwise zdir = 0160 zdir = 0.5 + SIGN( 0.5, pun(ji,jj,jk) ) ! if pun > 0 : zdir = 1 otherwise zdir = 0 163 161 zfu(ji,jj,jk) = zdir * zfc(ji,jj,jk ) + ( 1. - zdir ) * zfd(ji+1,jj,jk) ! FU in the x-direction for T 164 162 END DO … … 169 167 DO jj = 2, jpjm1 170 168 DO ji = fs_2, fs_jpim1 ! vector opt. 171 zdir = 0.5 + SIGN( 0.5, pu (ji,jj,jk) ) ! if pu> 0 : zdir = 1 otherwise zdir = 0172 zdx = ( zdir * e1t(ji,jj) + ( 1. - zdir ) * e1t(ji+1,jj) ) * e2u(ji,jj) * e3u (ji,jj,jk,ktlev)173 zwx(ji,jj,jk) = ABS( pu (ji,jj,jk) ) * p2dt / zdx ! (0<zc_cfl<1 : Courant number on x-direction)174 zfc(ji,jj,jk) = zdir * pt _lev1(ji ,jj,jk,jn) + ( 1. - zdir ) * pt_lev1(ji+1,jj,jk,jn) ! FC in the x-direction for T175 zfd(ji,jj,jk) = zdir * pt _lev1(ji+1,jj,jk,jn) + ( 1. - zdir ) * pt_lev1(ji ,jj,jk,jn) ! FD in the x-direction for T169 zdir = 0.5 + SIGN( 0.5, pun(ji,jj,jk) ) ! if pun > 0 : zdir = 1 otherwise zdir = 0 170 zdx = ( zdir * e1t(ji,jj) + ( 1. - zdir ) * e1t(ji+1,jj) ) * e2u(ji,jj) * e3u_n(ji,jj,jk) 171 zwx(ji,jj,jk) = ABS( pun(ji,jj,jk) ) * p2dt / zdx ! (0<zc_cfl<1 : Courant number on x-direction) 172 zfc(ji,jj,jk) = zdir * ptb(ji ,jj,jk,jn) + ( 1. - zdir ) * ptb(ji+1,jj,jk,jn) ! FC in the x-direction for T 173 zfd(ji,jj,jk) = zdir * ptb(ji+1,jj,jk,jn) + ( 1. - zdir ) * ptb(ji ,jj,jk,jn) ! FD in the x-direction for T 176 174 END DO 177 175 END DO … … 199 197 DO jj = 2, jpjm1 200 198 DO ji = fs_2, fs_jpim1 ! vector opt. 201 zdir = 0.5 + SIGN( 0.5, pu (ji,jj,jk) ) ! if pu> 0 : zdir = 1 otherwise zdir = 0199 zdir = 0.5 + SIGN( 0.5, pun(ji,jj,jk) ) ! if pun > 0 : zdir = 1 otherwise zdir = 0 202 200 !--- If the second ustream point is a land point 203 201 !--- the flux is computed by the 1st order UPWIND scheme 204 202 zmsk = zdir * zfu(ji,jj,jk) + ( 1. - zdir ) * zfu(ji+1,jj,jk) 205 203 zwx(ji,jj,jk) = zmsk * zwx(ji,jj,jk) + ( 1. - zmsk ) * zfc(ji,jj,jk) 206 zwx(ji,jj,jk) = zwx(ji,jj,jk) * pu (ji,jj,jk)204 zwx(ji,jj,jk) = zwx(ji,jj,jk) * pun(ji,jj,jk) 207 205 END DO 208 206 END DO … … 215 213 DO jj = 2, jpjm1 216 214 DO ji = fs_2, fs_jpim1 ! vector opt. 217 zbtr = r1_e1e2t(ji,jj) / e3t (ji,jj,jk,ktlev)215 zbtr = r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 218 216 ! horizontal advective trends 219 217 ztra = - zbtr * ( zwx(ji,jj,jk) - zwx(ji-1,jj,jk) ) 220 218 !--- add it to the general tracer trends 221 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + ztra219 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra 222 220 END DO 223 221 END DO 224 222 END DO 225 223 ! ! trend diagnostics 226 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_xad, zwx, pu , pt_lev2(:,:,:,jn) )224 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_xad, zwx, pun, ptn(:,:,:,jn) ) 227 225 ! 228 226 END DO … … 231 229 232 230 233 SUBROUTINE tra_adv_qck_j( kt, ktlev, cdtype, p2dt, pv, &234 & pt _lev1, pt_lev2, pt_rhs, kjpt )231 SUBROUTINE tra_adv_qck_j( kt, cdtype, p2dt, pvn, & 232 & ptb, ptn, pta, kjpt ) 235 233 !!---------------------------------------------------------------------- 236 234 !! 237 235 !!---------------------------------------------------------------------- 238 236 INTEGER , INTENT(in ) :: kt ! ocean time-step index 239 INTEGER , INTENT(in ) :: ktlev ! time level index for source terms240 237 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 241 238 INTEGER , INTENT(in ) :: kjpt ! number of tracers 242 239 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 243 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pv ! j-velocity components244 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt _lev1, pt_lev2! before and now tracer fields245 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt _rhs! tracer trend240 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pvn ! j-velocity components 241 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 242 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 246 243 !! 247 244 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 262 259 DO ji = fs_2, fs_jpim1 ! vector opt. 263 260 ! Upstream in the x-direction for the tracer 264 zfc(ji,jj,jk) = pt _lev1(ji,jj-1,jk,jn)261 zfc(ji,jj,jk) = ptb(ji,jj-1,jk,jn) 265 262 ! Downstream in the x-direction for the tracer 266 zfd(ji,jj,jk) = pt _lev1(ji,jj+1,jk,jn)263 zfd(ji,jj,jk) = ptb(ji,jj+1,jk,jn) 267 264 END DO 268 265 END DO … … 278 275 DO jj = 2, jpjm1 279 276 DO ji = fs_2, fs_jpim1 ! vector opt. 280 zdir = 0.5 + SIGN( 0.5, pv (ji,jj,jk) ) ! if pu> 0 : zdir = 1 otherwise zdir = 0277 zdir = 0.5 + SIGN( 0.5, pvn(ji,jj,jk) ) ! if pun > 0 : zdir = 1 otherwise zdir = 0 281 278 zfu(ji,jj,jk) = zdir * zfc(ji,jj,jk ) + ( 1. - zdir ) * zfd(ji,jj+1,jk) ! FU in the x-direction for T 282 279 END DO … … 287 284 DO jj = 2, jpjm1 288 285 DO ji = fs_2, fs_jpim1 ! vector opt. 289 zdir = 0.5 + SIGN( 0.5, pv (ji,jj,jk) ) ! if pu> 0 : zdir = 1 otherwise zdir = 0290 zdx = ( zdir * e2t(ji,jj) + ( 1. - zdir ) * e2t(ji,jj+1) ) * e1v(ji,jj) * e3v (ji,jj,jk,ktlev)291 zwy(ji,jj,jk) = ABS( pv (ji,jj,jk) ) * p2dt / zdx ! (0<zc_cfl<1 : Courant number on x-direction)292 zfc(ji,jj,jk) = zdir * pt _lev1(ji,jj ,jk,jn) + ( 1. - zdir ) * pt_lev1(ji,jj+1,jk,jn) ! FC in the x-direction for T293 zfd(ji,jj,jk) = zdir * pt _lev1(ji,jj+1,jk,jn) + ( 1. - zdir ) * pt_lev1(ji,jj ,jk,jn) ! FD in the x-direction for T286 zdir = 0.5 + SIGN( 0.5, pvn(ji,jj,jk) ) ! if pun > 0 : zdir = 1 otherwise zdir = 0 287 zdx = ( zdir * e2t(ji,jj) + ( 1. - zdir ) * e2t(ji,jj+1) ) * e1v(ji,jj) * e3v_n(ji,jj,jk) 288 zwy(ji,jj,jk) = ABS( pvn(ji,jj,jk) ) * p2dt / zdx ! (0<zc_cfl<1 : Courant number on x-direction) 289 zfc(ji,jj,jk) = zdir * ptb(ji,jj ,jk,jn) + ( 1. - zdir ) * ptb(ji,jj+1,jk,jn) ! FC in the x-direction for T 290 zfd(ji,jj,jk) = zdir * ptb(ji,jj+1,jk,jn) + ( 1. - zdir ) * ptb(ji,jj ,jk,jn) ! FD in the x-direction for T 294 291 END DO 295 292 END DO … … 317 314 DO jj = 2, jpjm1 318 315 DO ji = fs_2, fs_jpim1 ! vector opt. 319 zdir = 0.5 + SIGN( 0.5, pv (ji,jj,jk) ) ! if pu> 0 : zdir = 1 otherwise zdir = 0316 zdir = 0.5 + SIGN( 0.5, pvn(ji,jj,jk) ) ! if pun > 0 : zdir = 1 otherwise zdir = 0 320 317 !--- If the second ustream point is a land point 321 318 !--- the flux is computed by the 1st order UPWIND scheme 322 319 zmsk = zdir * zfu(ji,jj,jk) + ( 1. - zdir ) * zfu(ji,jj+1,jk) 323 320 zwy(ji,jj,jk) = zmsk * zwy(ji,jj,jk) + ( 1. - zmsk ) * zfc(ji,jj,jk) 324 zwy(ji,jj,jk) = zwy(ji,jj,jk) * pv (ji,jj,jk)321 zwy(ji,jj,jk) = zwy(ji,jj,jk) * pvn(ji,jj,jk) 325 322 END DO 326 323 END DO … … 333 330 DO jj = 2, jpjm1 334 331 DO ji = fs_2, fs_jpim1 ! vector opt. 335 zbtr = r1_e1e2t(ji,jj) / e3t (ji,jj,jk,ktlev)332 zbtr = r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 336 333 ! horizontal advective trends 337 334 ztra = - zbtr * ( zwy(ji,jj,jk) - zwy(ji,jj-1,jk) ) 338 335 !--- add it to the general tracer trends 339 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + ztra336 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra 340 337 END DO 341 338 END DO 342 339 END DO 343 340 ! ! trend diagnostics 344 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_yad, zwy, pv , pt_lev2(:,:,:,jn) )341 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_yad, zwy, pvn, ptn(:,:,:,jn) ) 345 342 ! ! "Poleward" heat and salt transports (contribution of upstream fluxes) 346 343 IF( l_ptr ) CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) ) … … 351 348 352 349 353 SUBROUTINE tra_adv_cen2_k( kt, ktlev, cdtype, pw, &354 & pt _lev2, pt_rhs, kjpt )350 SUBROUTINE tra_adv_cen2_k( kt, cdtype, pwn, & 351 & ptn, pta, kjpt ) 355 352 !!---------------------------------------------------------------------- 356 353 !! 357 354 !!---------------------------------------------------------------------- 358 355 INTEGER , INTENT(in ) :: kt ! ocean time-step index 359 INTEGER , INTENT(in ) :: ktlev ! time level index for source terms360 356 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 361 357 INTEGER , INTENT(in ) :: kjpt ! number of tracers 362 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pw ! vertical velocity363 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt _lev2! before and now tracer fields364 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt _rhs! tracer trend358 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pwn ! vertical velocity 359 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptn ! before and now tracer fields 360 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 365 361 ! 366 362 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 378 374 DO jj = 2, jpjm1 379 375 DO ji = fs_2, fs_jpim1 ! vector opt. 380 zwz(ji,jj,jk) = 0.5 * pw (ji,jj,jk) * ( pt_lev2(ji,jj,jk-1,jn) + pt_lev2(ji,jj,jk,jn) ) * wmask(ji,jj,jk)376 zwz(ji,jj,jk) = 0.5 * pwn(ji,jj,jk) * ( ptn(ji,jj,jk-1,jn) + ptn(ji,jj,jk,jn) ) * wmask(ji,jj,jk) 381 377 END DO 382 378 END DO … … 386 382 DO jj = 1, jpj 387 383 DO ji = 1, jpi 388 zwz(ji,jj, mikt(ji,jj) ) = pw (ji,jj,mikt(ji,jj)) * pt_lev2(ji,jj,mikt(ji,jj),jn) ! linear free surface384 zwz(ji,jj, mikt(ji,jj) ) = pwn(ji,jj,mikt(ji,jj)) * ptn(ji,jj,mikt(ji,jj),jn) ! linear free surface 389 385 END DO 390 386 END DO 391 387 ELSE ! no ocean cavities (only ocean surface) 392 zwz(:,:,1) = pw (:,:,1) * pt_lev2(:,:,1,jn)388 zwz(:,:,1) = pwn(:,:,1) * ptn(:,:,1,jn) 393 389 ENDIF 394 390 ENDIF … … 397 393 DO jj = 2, jpjm1 398 394 DO ji = fs_2, fs_jpim1 ! vector opt. 399 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) - ( zwz(ji,jj,jk) - zwz(ji,jj,jk+1) ) &400 & * r1_e1e2t(ji,jj) / e3t (ji,jj,jk,ktlev)395 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) - ( zwz(ji,jj,jk) - zwz(ji,jj,jk+1) ) & 396 & * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 401 397 END DO 402 398 END DO 403 399 END DO 404 400 ! ! Send trends for diagnostic 405 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_zad, zwz, pw , pt_lev2(:,:,:,jn) )401 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_zad, zwz, pwn, ptn(:,:,:,jn) ) 406 402 ! 407 403 END DO -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/traadv_ubs.F90
r10806 r10874 46 46 CONTAINS 47 47 48 SUBROUTINE tra_adv_ubs( kt, kit000, ktlev, cdtype, p2dt, pu, pv, pw, &49 & pt _lev1, pt_lev2, pt_rhs, kjpt, kn_ubs_v )48 SUBROUTINE tra_adv_ubs( kt, kit000, cdtype, p2dt, pun, pvn, pwn, & 49 & ptb, ptn, pta, kjpt, kn_ubs_v ) 50 50 !!---------------------------------------------------------------------- 51 51 !! *** ROUTINE tra_adv_ubs *** … … 58 58 !! It is only used in the horizontal direction. 59 59 !! For example the i-component of the advective fluxes are given by : 60 !! ! e2u e3u u u ( mi(Tn) - zltu(i ) ,ktlev) if uu(i,ktlev) >= 060 !! ! e2u e3u un ( mi(Tn) - zltu(i ) ) if un(i) >= 0 61 61 !! ztu = ! or 62 !! ! e2u e3u u u ( mi(Tn) - zltu(i+1) ,ktlev) if uu(i,ktlev) < 062 !! ! e2u e3u un ( mi(Tn) - zltu(i+1) ) if un(i) < 0 63 63 !! where zltu is the second derivative of the before temperature field: 64 64 !! zltu = 1/e3t di[ e2u e3u / e1u di[Tb] ] … … 77 77 !! scheme (kn_ubs_v=4). 78 78 !! 79 !! ** Action : - update pt _rhswith the now advective tracer trends79 !! ** Action : - update pta with the now advective tracer trends 80 80 !! - send trends to trdtra module for further diagnostcs (l_trdtra=T) 81 81 !! - htr_adv, str_adv : poleward advective heat and salt transport (ln_diaptr=T) … … 86 86 INTEGER , INTENT(in ) :: kt ! ocean time-step index 87 87 INTEGER , INTENT(in ) :: kit000 ! first time step index 88 INTEGER , INTENT(in ) :: ktlev ! time level index for source terms89 88 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 90 89 INTEGER , INTENT(in ) :: kjpt ! number of tracers 91 90 INTEGER , INTENT(in ) :: kn_ubs_v ! number of tracers 92 91 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 93 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pu , pv, pw! 3 ocean transport components94 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt _lev1, pt_lev2! before and now tracer fields95 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt _rhs! tracer trend92 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean transport components 93 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 94 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 96 95 ! 97 96 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 127 126 DO jj = 1, jpjm1 ! First derivative (masked gradient) 128 127 DO ji = 1, fs_jpim1 ! vector opt. 129 zeeu = e2_e1u(ji,jj) * e3u (ji,jj,jk,ktlev) * umask(ji,jj,jk)130 zeev = e1_e2v(ji,jj) * e3v (ji,jj,jk,ktlev) * vmask(ji,jj,jk)131 ztu(ji,jj,jk) = zeeu * ( pt _lev1(ji+1,jj ,jk,jn) - pt_lev1(ji,jj,jk,jn) )132 ztv(ji,jj,jk) = zeev * ( pt _lev1(ji ,jj+1,jk,jn) - pt_lev1(ji,jj,jk,jn) )128 zeeu = e2_e1u(ji,jj) * e3u_n(ji,jj,jk) * umask(ji,jj,jk) 129 zeev = e1_e2v(ji,jj) * e3v_n(ji,jj,jk) * vmask(ji,jj,jk) 130 ztu(ji,jj,jk) = zeeu * ( ptb(ji+1,jj ,jk,jn) - ptb(ji,jj,jk,jn) ) 131 ztv(ji,jj,jk) = zeev * ( ptb(ji ,jj+1,jk,jn) - ptb(ji,jj,jk,jn) ) 133 132 END DO 134 133 END DO 135 134 DO jj = 2, jpjm1 ! Second derivative (divergence) 136 135 DO ji = fs_2, fs_jpim1 ! vector opt. 137 zcoef = 1._wp / ( 6._wp * e3t (ji,jj,jk,ktlev) )136 zcoef = 1._wp / ( 6._wp * e3t_n(ji,jj,jk) ) 138 137 zltu(ji,jj,jk) = ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) ) * zcoef 139 138 zltv(ji,jj,jk) = ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) * zcoef … … 147 146 DO jj = 1, jpjm1 148 147 DO ji = 1, fs_jpim1 ! vector opt. 149 zfp_ui = pu (ji,jj,jk) + ABS( pu(ji,jj,jk) ) ! upstream transport (x2)150 zfm_ui = pu (ji,jj,jk) - ABS( pu(ji,jj,jk) )151 zfp_vj = pv (ji,jj,jk) + ABS( pv(ji,jj,jk) )152 zfm_vj = pv (ji,jj,jk) - ABS( pv(ji,jj,jk) )148 zfp_ui = pun(ji,jj,jk) + ABS( pun(ji,jj,jk) ) ! upstream transport (x2) 149 zfm_ui = pun(ji,jj,jk) - ABS( pun(ji,jj,jk) ) 150 zfp_vj = pvn(ji,jj,jk) + ABS( pvn(ji,jj,jk) ) 151 zfm_vj = pvn(ji,jj,jk) - ABS( pvn(ji,jj,jk) ) 153 152 ! ! 2nd order centered advective fluxes (x2) 154 zcenut = pu (ji,jj,jk) * ( pt_lev2(ji,jj,jk,jn) + pt_lev2(ji+1,jj ,jk,jn) )155 zcenvt = pv (ji,jj,jk) * ( pt_lev2(ji,jj,jk,jn) + pt_lev2(ji ,jj+1,jk,jn) )153 zcenut = pun(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji+1,jj ,jk,jn) ) 154 zcenvt = pvn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji ,jj+1,jk,jn) ) 156 155 ! ! UBS advective fluxes 157 156 ztu(ji,jj,jk) = 0.5 * ( zcenut - zfp_ui * zltu(ji,jj,jk) - zfm_ui * zltu(ji+1,jj,jk) ) … … 161 160 END DO 162 161 ! 163 zltu(:,:,:) = pt _rhs(:,:,:,jn) ! store the initial trends before its update162 zltu(:,:,:) = pta(:,:,:,jn) ! store the initial trends before its update 164 163 ! 165 164 DO jk = 1, jpkm1 !== add the horizontal advective trend ==! 166 165 DO jj = 2, jpjm1 167 166 DO ji = fs_2, fs_jpim1 ! vector opt. 168 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) &167 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) & 169 168 & - ( ztu(ji,jj,jk) - ztu(ji-1,jj ,jk) & 170 & + ztv(ji,jj,jk) - ztv(ji ,jj-1,jk) ) * r1_e1e2t(ji,jj) / e3t (ji,jj,jk,ktlev)169 & + ztv(ji,jj,jk) - ztv(ji ,jj-1,jk) ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 171 170 END DO 172 171 END DO … … 174 173 END DO 175 174 ! 176 zltu(:,:,:) = pt _rhs(:,:,:,jn) - zltu(:,:,:) ! Horizontal advective trend used in vertical 2nd order FCT case175 zltu(:,:,:) = pta(:,:,:,jn) - zltu(:,:,:) ! Horizontal advective trend used in vertical 2nd order FCT case 177 176 ! ! and/or in trend diagnostic (l_trd=T) 178 177 ! 179 178 IF( l_trd ) THEN ! trend diagnostics 180 CALL trd_tra( kt, cdtype, jn, jptra_xad, ztu, pu , pt_lev2(:,:,:,jn) )181 CALL trd_tra( kt, cdtype, jn, jptra_yad, ztv, pv , pt_lev2(:,:,:,jn) )179 CALL trd_tra( kt, cdtype, jn, jptra_xad, ztu, pun, ptn(:,:,:,jn) ) 180 CALL trd_tra( kt, cdtype, jn, jptra_yad, ztv, pvn, ptn(:,:,:,jn) ) 182 181 END IF 183 182 ! … … 194 193 CASE( 2 ) ! 2nd order FCT 195 194 ! 196 IF( l_trd ) zltv(:,:,:) = pt _rhs(:,:,:,jn) ! store pt_rhsif trend diag.195 IF( l_trd ) zltv(:,:,:) = pta(:,:,:,jn) ! store pta if trend diag. 197 196 ! 198 197 ! !* upstream advection with initial mass fluxes & intermediate update ==! … … 200 199 DO jj = 1, jpj 201 200 DO ji = 1, jpi 202 zfp_wk = pw (ji,jj,jk) + ABS( pw(ji,jj,jk) )203 zfm_wk = pw (ji,jj,jk) - ABS( pw(ji,jj,jk) )204 ztw(ji,jj,jk) = 0.5_wp * ( zfp_wk * pt _lev1(ji,jj,jk,jn) + zfm_wk * pt_lev1(ji,jj,jk-1,jn) ) * wmask(ji,jj,jk)201 zfp_wk = pwn(ji,jj,jk) + ABS( pwn(ji,jj,jk) ) 202 zfm_wk = pwn(ji,jj,jk) - ABS( pwn(ji,jj,jk) ) 203 ztw(ji,jj,jk) = 0.5_wp * ( zfp_wk * ptb(ji,jj,jk,jn) + zfm_wk * ptb(ji,jj,jk-1,jn) ) * wmask(ji,jj,jk) 205 204 END DO 206 205 END DO … … 210 209 DO jj = 1, jpj 211 210 DO ji = 1, jpi 212 ztw(ji,jj, mikt(ji,jj) ) = pw (ji,jj,mikt(ji,jj)) * pt_lev1(ji,jj,mikt(ji,jj),jn) ! linear free surface211 ztw(ji,jj, mikt(ji,jj) ) = pwn(ji,jj,mikt(ji,jj)) * ptb(ji,jj,mikt(ji,jj),jn) ! linear free surface 213 212 END DO 214 213 END DO 215 214 ELSE ! no cavities: only at the ocean surface 216 ztw(:,:,1) = pw (:,:,1) * pt_lev1(:,:,1,jn)215 ztw(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn) 217 216 ENDIF 218 217 ENDIF … … 221 220 DO jj = 2, jpjm1 222 221 DO ji = fs_2, fs_jpim1 ! vector opt. 223 ztak = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t (ji,jj,jk,ktlev)224 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + ztak225 zti(ji,jj,jk) = ( pt _lev1(ji,jj,jk,jn) + p2dt * ( ztak + zltu(ji,jj,jk) ) ) * tmask(ji,jj,jk)222 ztak = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 223 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztak 224 zti(ji,jj,jk) = ( ptb(ji,jj,jk,jn) + p2dt * ( ztak + zltu(ji,jj,jk) ) ) * tmask(ji,jj,jk) 226 225 END DO 227 226 END DO … … 233 232 DO jj = 1, jpj 234 233 DO ji = 1, jpi 235 ztw(ji,jj,jk) = ( 0.5_wp * pw (ji,jj,jk) * ( pt_lev2(ji,jj,jk,jn) + pt_lev2(ji,jj,jk-1,jn) ) &234 ztw(ji,jj,jk) = ( 0.5_wp * pwn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj,jk-1,jn) ) & 236 235 & - ztw(ji,jj,jk) ) * wmask(ji,jj,jk) 237 236 END DO … … 241 240 IF( ln_linssh ) ztw(:,:, 1 ) = 0._wp ! only ocean surface as interior zwz values have been w-masked 242 241 ! 243 CALL nonosc_z( pt _lev1(:,:,:,jn), ztw, zti, p2dt, e3t(:,:,:,ktlev)) ! monotonicity algorithm242 CALL nonosc_z( ptb(:,:,:,jn), ztw, zti, p2dt ) ! monotonicity algorithm 244 243 ! 245 244 CASE( 4 ) ! 4th order COMPACT 246 CALL interp_4th_cpt( pt _lev2(:,:,:,jn) , ztw ) ! 4th order compact interpolation of T at w-point245 CALL interp_4th_cpt( ptn(:,:,:,jn) , ztw ) ! 4th order compact interpolation of T at w-point 247 246 DO jk = 2, jpkm1 248 247 DO jj = 2, jpjm1 249 248 DO ji = fs_2, fs_jpim1 250 ztw(ji,jj,jk) = pw (ji,jj,jk) * ztw(ji,jj,jk) * wmask(ji,jj,jk)251 END DO 252 END DO 253 END DO 254 IF( ln_linssh ) ztw(:,:, 1 ) = pw (:,:,1) * pt_lev2(:,:,1,jn) !!gm ISF & 4th COMPACT doesn't work249 ztw(ji,jj,jk) = pwn(ji,jj,jk) * ztw(ji,jj,jk) * wmask(ji,jj,jk) 250 END DO 251 END DO 252 END DO 253 IF( ln_linssh ) ztw(:,:, 1 ) = pwn(:,:,1) * ptn(:,:,1,jn) !!gm ISF & 4th COMPACT doesn't work 255 254 ! 256 255 END SELECT … … 259 258 DO jj = 2, jpjm1 260 259 DO ji = fs_2, fs_jpim1 ! vector opt. 261 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,ktlev)260 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 262 261 END DO 263 262 END DO … … 265 264 ! 266 265 IF( l_trd ) THEN ! vertical advective trend diagnostics 267 DO jk = 1, jpkm1 ! (compute -w.dk[ptn]= -dk[w.ptn] + pt _lev2.dk[w])266 DO jk = 1, jpkm1 ! (compute -w.dk[ptn]= -dk[w.ptn] + ptn.dk[w]) 268 267 DO jj = 2, jpjm1 269 268 DO ji = fs_2, fs_jpim1 ! vector opt. 270 zltv(ji,jj,jk) = pt _rhs(ji,jj,jk,jn) - zltv(ji,jj,jk) &271 & + pt _lev2(ji,jj,jk,jn) * ( pw(ji,jj,jk) - pw(ji,jj,jk+1) ) &272 & * r1_e1e2t(ji,jj) / e3t (ji,jj,jk,ktlev)269 zltv(ji,jj,jk) = pta(ji,jj,jk,jn) - zltv(ji,jj,jk) & 270 & + ptn(ji,jj,jk,jn) * ( pwn(ji,jj,jk) - pwn(ji,jj,jk+1) ) & 271 & * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 273 272 END DO 274 273 END DO … … 282 281 283 282 284 SUBROUTINE nonosc_z( pbef, pcc, paft, p2dt , pe3t)283 SUBROUTINE nonosc_z( pbef, pcc, paft, p2dt ) 285 284 !!--------------------------------------------------------------------- 286 285 !! *** ROUTINE nonosc_z *** … … 297 296 REAL(wp), INTENT(in ) :: p2dt ! tracer time-step 298 297 REAL(wp), DIMENSION (jpi,jpj,jpk) :: pbef ! before field 299 REAL(wp), INTENT(in ), DIMENSION (jpi,jpj,jpk) :: pe3t ! now cell thickness field300 298 REAL(wp), INTENT(inout), DIMENSION (jpi,jpj,jpk) :: paft ! after field 301 299 REAL(wp), INTENT(inout), DIMENSION (jpi,jpj,jpk) :: pcc ! monotonic flux in the k direction … … 354 352 zneg = MAX( 0., pcc(ji ,jj ,jk ) ) - MIN( 0., pcc(ji ,jj ,jk+1) ) 355 353 ! up & down beta terms 356 zbt = e1e2t(ji,jj) * pe3t(ji,jj,jk) / p2dt354 zbt = e1e2t(ji,jj) * e3t_n(ji,jj,jk) / p2dt 357 355 zbetup(ji,jj,jk) = ( zbetup(ji,jj,jk) - paft(ji,jj,jk) ) / (zpos+zrtrn) * zbt 358 356 zbetdo(ji,jj,jk) = ( paft(ji,jj,jk) - zbetdo(ji,jj,jk) ) / (zneg+zrtrn) * zbt -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/trabbc.F90
r10806 r10874 51 51 CONTAINS 52 52 53 SUBROUTINE tra_bbc( kt , ktlev, pts_rhs)53 SUBROUTINE tra_bbc( kt ) 54 54 !!---------------------------------------------------------------------- 55 55 !! *** ROUTINE tra_bbc *** … … 74 74 !!---------------------------------------------------------------------- 75 75 INTEGER, INTENT(in) :: kt ! ocean time-step index 76 INTEGER, INTENT(in) :: ktlev ! time level index for source terms77 REAL(wp), INTENT( inout), DIMENSION(jpi,jpj,jpk,jpts) :: pts_rhs ! temperature and salinity trends78 76 ! 79 77 INTEGER :: ji, jj ! dummy loop indices … … 85 83 IF( l_trdtra ) THEN ! Save the input temperature trend 86 84 ALLOCATE( ztrdt(jpi,jpj,jpk) ) 87 ztrdt(:,:,:) = pts_rhs(:,:,:,jp_tem)85 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 88 86 ENDIF 89 87 ! ! Add the geothermal trend on temperature 90 88 DO jj = 2, jpjm1 91 89 DO ji = 2, jpim1 92 pts_rhs(ji,jj,mbkt(ji,jj),jp_tem) = pts_rhs(ji,jj,mbkt(ji,jj),jp_tem) + qgh_trd0(ji,jj) / e3t(ji,jj,mbkt(ji,jj),ktlev)90 tsa(ji,jj,mbkt(ji,jj),jp_tem) = tsa(ji,jj,mbkt(ji,jj),jp_tem) + qgh_trd0(ji,jj) / e3t_n(ji,jj,mbkt(ji,jj)) 93 91 END DO 94 92 END DO 95 93 ! 96 CALL lbc_lnk( 'trabbc', pts_rhs(:,:,:,jp_tem) , 'T', 1. )94 CALL lbc_lnk( 'trabbc', tsa(:,:,:,jp_tem) , 'T', 1. ) 97 95 ! 98 96 IF( l_trdtra ) THEN ! Send the trend for diagnostics 99 ztrdt(:,:,:) = pts_rhs(:,:,:,jp_tem) - ztrdt(:,:,:)97 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:) 100 98 CALL trd_tra( kt, 'TRA', jp_tem, jptra_bbc, ztrdt ) 101 99 DEALLOCATE( ztrdt ) -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/trabbl.F90
r10806 r10874 89 89 90 90 91 SUBROUTINE tra_bbl( kt , ktlev1, ktlev2, kt2lev, pts_rhs)91 SUBROUTINE tra_bbl( kt ) 92 92 !!---------------------------------------------------------------------- 93 93 !! *** ROUTINE bbl *** … … 101 101 !! is added to the general tracer trend 102 102 !!---------------------------------------------------------------------- 103 INTEGER, INTENT( in ) :: kt ! ocean time-step 104 INTEGER, INTENT( in ) :: ktlev1, ktlev2 ! time level indices for 3-time-level source terms 105 INTEGER, INTENT( in ) :: kt2lev ! time level index for 2-time-level source terms 106 REAL(wp), INTENT( inout), DIMENSION(jpi,jpj,jpk,jpts) :: pts_rhs ! temperature and salinity trends 103 INTEGER, INTENT( in ) :: kt ! ocean time-step 107 104 ! 108 105 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdt, ztrds … … 113 110 IF( l_trdtra ) THEN !* Save the T-S input trends 114 111 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 115 ztrdt(:,:,:) = pts_rhs(:,:,:,jp_tem)116 ztrds(:,:,:) = pts_rhs(:,:,:,jp_sal)117 ENDIF 118 119 IF( l_bbl ) CALL bbl( kt, nit000, ktlev1, ktlev2, kt2lev,'TRA' ) !* bbl coef. and transport (only if not already done in trcbbl)112 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 113 ztrds(:,:,:) = tsa(:,:,:,jp_sal) 114 ENDIF 115 116 IF( l_bbl ) CALL bbl( kt, nit000, 'TRA' ) !* bbl coef. and transport (only if not already done in trcbbl) 120 117 121 118 IF( nn_bbl_ldf == 1 ) THEN !* Diffusive bbl 122 119 ! 123 CALL tra_bbl_dif( ts (:,:,:,:,ktlev1), e3t(:,:,:,ktlev2), pts_rhs, jpts )120 CALL tra_bbl_dif( tsb, tsa, jpts ) 124 121 IF( ln_ctl ) & 125 122 CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' bbl_ldf - Ta: ', mask1=tmask, & … … 134 131 IF( nn_bbl_adv /= 0 ) THEN !* Advective bbl 135 132 ! 136 CALL tra_bbl_adv( ts (:,:,:,:,ktlev1), e3t(:,:,:,ktlev2), pts_rhs, jpts )133 CALL tra_bbl_adv( tsb, tsa, jpts ) 137 134 IF(ln_ctl) & 138 135 CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' bbl_adv - Ta: ', mask1=tmask, & … … 146 143 147 144 IF( l_trdtra ) THEN ! send the trends for further diagnostics 148 ztrdt(:,:,:) = pts_rhs(:,:,:,jp_tem) - ztrdt(:,:,:)149 ztrds(:,:,:) = pts_rhs(:,:,:,jp_sal) - ztrds(:,:,:)145 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:) 146 ztrds(:,:,:) = tsa(:,:,:,jp_sal) - ztrds(:,:,:) 150 147 CALL trd_tra( kt, 'TRA', jp_tem, jptra_bbl, ztrdt ) 151 148 CALL trd_tra( kt, 'TRA', jp_sal, jptra_bbl, ztrds ) … … 158 155 159 156 160 SUBROUTINE tra_bbl_dif( pt , pe3t, pt_rhs, kjpt )157 SUBROUTINE tra_bbl_dif( ptb, pta, kjpt ) 161 158 !!---------------------------------------------------------------------- 162 159 !! *** ROUTINE tra_bbl_dif *** … … 174 171 !! convection is satified) 175 172 !! 176 !! ** Action : pt _rhsincreased by the bbl diffusive trend173 !! ** Action : pta increased by the bbl diffusive trend 177 174 !! 178 175 !! References : Beckmann, A., and R. Doscher, 1997, J. Phys.Oceanogr., 581-591. … … 180 177 !!---------------------------------------------------------------------- 181 178 INTEGER , INTENT(in ) :: kjpt ! number of tracers 182 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt ! tracer fields 183 REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT(in ) :: pe3t ! thickness fields 184 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt_rhs ! tracer trend 179 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 180 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 185 181 ! 186 182 INTEGER :: ji, jj, jn ! dummy loop indices … … 195 191 DO ji = 1, jpi 196 192 ik = mbkt(ji,jj) ! bottom T-level index 197 zptb(ji,jj) = pt (ji,jj,ik,jn) ! bottom before T and S193 zptb(ji,jj) = ptb(ji,jj,ik,jn) ! bottom before T and S 198 194 END DO 199 195 END DO … … 202 198 DO ji = 2, jpim1 203 199 ik = mbkt(ji,jj) ! bottom T-level index 204 pt _rhs(ji,jj,ik,jn) = pt_rhs(ji,jj,ik,jn) &200 pta(ji,jj,ik,jn) = pta(ji,jj,ik,jn) & 205 201 & + ( ahu_bbl(ji ,jj ) * ( zptb(ji+1,jj ) - zptb(ji ,jj ) ) & 206 202 & - ahu_bbl(ji-1,jj ) * ( zptb(ji ,jj ) - zptb(ji-1,jj ) ) & 207 203 & + ahv_bbl(ji ,jj ) * ( zptb(ji ,jj+1) - zptb(ji ,jj ) ) & 208 204 & - ahv_bbl(ji ,jj-1) * ( zptb(ji ,jj ) - zptb(ji ,jj-1) ) ) & 209 & * r1_e1e2t(ji,jj) / pe3t(ji,jj,ik)205 & * r1_e1e2t(ji,jj) / e3t_n(ji,jj,ik) 210 206 END DO 211 207 END DO … … 216 212 217 213 218 SUBROUTINE tra_bbl_adv( pt , pe3t, pt_rhs, kjpt )214 SUBROUTINE tra_bbl_adv( ptb, pta, kjpt ) 219 215 !!---------------------------------------------------------------------- 220 216 !! *** ROUTINE trc_bbl *** … … 232 228 !!---------------------------------------------------------------------- 233 229 INTEGER , INTENT(in ) :: kjpt ! number of tracers 234 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt ! before and now tracer fields 235 REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT(in ) :: pe3t ! thickness fields 236 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt_rhs ! tracer trend 230 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 231 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 237 232 ! 238 233 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 255 250 ! 256 251 ! ! up -slope T-point (shelf bottom point) 257 zbtr = r1_e1e2t(iis,jj) / pe3t(iis,jj,ikus)258 ztra = zu_bbl * ( pt (iid,jj,ikus,jn) - pt(iis,jj,ikus,jn) ) * zbtr259 pt _rhs(iis,jj,ikus,jn) = pt_rhs(iis,jj,ikus,jn) + ztra252 zbtr = r1_e1e2t(iis,jj) / e3t_n(iis,jj,ikus) 253 ztra = zu_bbl * ( ptb(iid,jj,ikus,jn) - ptb(iis,jj,ikus,jn) ) * zbtr 254 pta(iis,jj,ikus,jn) = pta(iis,jj,ikus,jn) + ztra 260 255 ! 261 256 DO jk = ikus, ikud-1 ! down-slope upper to down T-point (deep column) 262 zbtr = r1_e1e2t(iid,jj) / pe3t(iid,jj,jk)263 ztra = zu_bbl * ( pt (iid,jj,jk+1,jn) - pt(iid,jj,jk,jn) ) * zbtr264 pt _rhs(iid,jj,jk,jn) = pt_rhs(iid,jj,jk,jn) + ztra257 zbtr = r1_e1e2t(iid,jj) / e3t_n(iid,jj,jk) 258 ztra = zu_bbl * ( ptb(iid,jj,jk+1,jn) - ptb(iid,jj,jk,jn) ) * zbtr 259 pta(iid,jj,jk,jn) = pta(iid,jj,jk,jn) + ztra 265 260 END DO 266 261 ! 267 zbtr = r1_e1e2t(iid,jj) / pe3t(iid,jj,ikud)268 ztra = zu_bbl * ( pt (iis,jj,ikus,jn) - pt(iid,jj,ikud,jn) ) * zbtr269 pt _rhs(iid,jj,ikud,jn) = pt_rhs(iid,jj,ikud,jn) + ztra262 zbtr = r1_e1e2t(iid,jj) / e3t_n(iid,jj,ikud) 263 ztra = zu_bbl * ( ptb(iis,jj,ikus,jn) - ptb(iid,jj,ikud,jn) ) * zbtr 264 pta(iid,jj,ikud,jn) = pta(iid,jj,ikud,jn) + ztra 270 265 ENDIF 271 266 ! … … 277 272 ! 278 273 ! up -slope T-point (shelf bottom point) 279 zbtr = r1_e1e2t(ji,ijs) / pe3t(ji,ijs,ikvs)280 ztra = zv_bbl * ( pt (ji,ijd,ikvs,jn) - pt(ji,ijs,ikvs,jn) ) * zbtr281 pt _rhs(ji,ijs,ikvs,jn) = pt_rhs(ji,ijs,ikvs,jn) + ztra274 zbtr = r1_e1e2t(ji,ijs) / e3t_n(ji,ijs,ikvs) 275 ztra = zv_bbl * ( ptb(ji,ijd,ikvs,jn) - ptb(ji,ijs,ikvs,jn) ) * zbtr 276 pta(ji,ijs,ikvs,jn) = pta(ji,ijs,ikvs,jn) + ztra 282 277 ! 283 278 DO jk = ikvs, ikvd-1 ! down-slope upper to down T-point (deep column) 284 zbtr = r1_e1e2t(ji,ijd) / pe3t(ji,ijd,jk)285 ztra = zv_bbl * ( pt (ji,ijd,jk+1,jn) - pt(ji,ijd,jk,jn) ) * zbtr286 pt _rhs(ji,ijd,jk,jn) = pt_rhs(ji,ijd,jk,jn) + ztra279 zbtr = r1_e1e2t(ji,ijd) / e3t_n(ji,ijd,jk) 280 ztra = zv_bbl * ( ptb(ji,ijd,jk+1,jn) - ptb(ji,ijd,jk,jn) ) * zbtr 281 pta(ji,ijd,jk,jn) = pta(ji,ijd,jk,jn) + ztra 287 282 END DO 288 283 ! ! down-slope T-point (deep bottom point) 289 zbtr = r1_e1e2t(ji,ijd) / pe3t(ji,ijd,ikvd)290 ztra = zv_bbl * ( pt (ji,ijs,ikvs,jn) - pt(ji,ijd,ikvd,jn) ) * zbtr291 pt _rhs(ji,ijd,ikvd,jn) = pt_rhs(ji,ijd,ikvd,jn) + ztra284 zbtr = r1_e1e2t(ji,ijd) / e3t_n(ji,ijd,ikvd) 285 ztra = zv_bbl * ( ptb(ji,ijs,ikvs,jn) - ptb(ji,ijd,ikvd,jn) ) * zbtr 286 pta(ji,ijd,ikvd,jn) = pta(ji,ijd,ikvd,jn) + ztra 292 287 ENDIF 293 288 END DO … … 300 295 301 296 302 SUBROUTINE bbl( kt, kit000, ktlev1, ktlev2, kt2lev,cdtype )297 SUBROUTINE bbl( kt, kit000, cdtype ) 303 298 !!---------------------------------------------------------------------- 304 299 !! *** ROUTINE bbl *** … … 328 323 INTEGER , INTENT(in ) :: kt ! ocean time-step index 329 324 INTEGER , INTENT(in ) :: kit000 ! first time step index 330 INTEGER , INTENT(in ) :: ktlev1, ktlev2 ! time level indices for 3-time-levelsource terms331 INTEGER , INTENT(in ) :: kt2lev ! time level index for 2-time-level source terms332 325 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 333 326 ! … … 351 344 DO ji = 1, jpi 352 345 ik = mbkt(ji,jj) ! bottom T-level index 353 zts (ji,jj,jp_tem) = ts (ji,jj,ik,jp_tem,ktlev1) ! bottom before T and S354 zts (ji,jj,jp_sal) = ts (ji,jj,ik,jp_sal,ktlev1)346 zts (ji,jj,jp_tem) = tsb(ji,jj,ik,jp_tem) ! bottom before T and S 347 zts (ji,jj,jp_sal) = tsb(ji,jj,ik,jp_sal) 355 348 ! 356 zdep(ji,jj) = gdept (ji,jj,ik,kt2lev) ! bottom T-level reference depth357 zub (ji,jj) = u u(ji,jj,mbku(ji,jj),ktlev2) ! bottom velocity358 zvb (ji,jj) = v v(ji,jj,mbkv(ji,jj),ktlev2)349 zdep(ji,jj) = gdept_n(ji,jj,ik) ! bottom T-level reference depth 350 zub (ji,jj) = un(ji,jj,mbku(ji,jj)) ! bottom velocity 351 zvb (ji,jj) = vn(ji,jj,mbkv(ji,jj)) 359 352 END DO 360 353 END DO -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/tradmp.F90
r10806 r10874 72 72 73 73 74 SUBROUTINE tra_dmp( kt , ktlev, kt2lev, pts_rhs)74 SUBROUTINE tra_dmp( kt ) 75 75 !!---------------------------------------------------------------------- 76 76 !! *** ROUTINE tra_dmp *** … … 90 90 !! ** Action : - tsa: tracer trends updated with the damping trend 91 91 !!---------------------------------------------------------------------- 92 INTEGER, INTENT(in) :: kt ! ocean time-step index 93 INTEGER, INTENT(in) :: ktlev ! time level index for 3-time-level source terms 94 INTEGER, INTENT(in) :: kt2lev ! time level index for 2-time-level source terms 95 REAL(wp), INTENT( inout), DIMENSION(jpi,jpj,jpk,jpts) :: pts_rhs ! temperature and salinity trends 92 INTEGER, INTENT(in) :: kt ! ocean time-step index 96 93 ! 97 94 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 104 101 IF( l_trdtra ) THEN !* Save ta and sa trends 105 102 ALLOCATE( ztrdts(jpi,jpj,jpk,jpts) ) 106 ztrdts(:,:,:,:) = pts_rhs(:,:,:,:)103 ztrdts(:,:,:,:) = tsa(:,:,:,:) 107 104 ENDIF 108 105 ! !== input T-S data at kt ==! … … 116 113 DO jj = 2, jpjm1 117 114 DO ji = fs_2, fs_jpim1 ! vector opt. 118 pts_rhs(ji,jj,jk,jn) = pts_rhs(ji,jj,jk,jn) + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jn) - ts(ji,jj,jk,jn,ktlev) )115 tsa(ji,jj,jk,jn) = tsa(ji,jj,jk,jn) + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jn) - tsb(ji,jj,jk,jn) ) 119 116 END DO 120 117 END DO … … 127 124 DO ji = fs_2, fs_jpim1 ! vector opt. 128 125 IF( avt(ji,jj,jk) <= avt_c ) THEN 129 pts_rhs(ji,jj,jk,jp_tem) = pts_rhs(ji,jj,jk,jp_tem) &130 & + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_tem) - ts (ji,jj,jk,jp_tem,ktlev) )131 pts_rhs(ji,jj,jk,jp_sal) = pts_rhs(ji,jj,jk,jp_sal) &132 & + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_sal) - ts (ji,jj,jk,jp_sal,ktlev) )126 tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) & 127 & + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_tem) - tsb(ji,jj,jk,jp_tem) ) 128 tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) & 129 & + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_sal) - tsb(ji,jj,jk,jp_sal) ) 133 130 ENDIF 134 131 END DO … … 140 137 DO jj = 2, jpjm1 141 138 DO ji = fs_2, fs_jpim1 ! vector opt. 142 IF( gdept (ji,jj,jk,kt2lev) >= hmlp (ji,jj) ) THEN143 pts_rhs(ji,jj,jk,jp_tem) = pts_rhs(ji,jj,jk,jp_tem) &144 & + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_tem) - ts (ji,jj,jk,jp_tem,ktlev) )145 pts_rhs(ji,jj,jk,jp_sal) = pts_rhs(ji,jj,jk,jp_sal) &146 & + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_sal) - ts (ji,jj,jk,jp_sal,ktlev) )139 IF( gdept_n(ji,jj,jk) >= hmlp (ji,jj) ) THEN 140 tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) & 141 & + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_tem) - tsb(ji,jj,jk,jp_tem) ) 142 tsa(ji,jj,jk,jp_sal) = tsa(ji,jj,jk,jp_sal) & 143 & + resto(ji,jj,jk) * ( zts_dta(ji,jj,jk,jp_sal) - tsb(ji,jj,jk,jp_sal) ) 147 144 ENDIF 148 145 END DO … … 153 150 ! 154 151 IF( l_trdtra ) THEN ! trend diagnostic 155 ztrdts(:,:,:,:) = pts_rhs(:,:,:,:) - ztrdts(:,:,:,:)152 ztrdts(:,:,:,:) = tsa(:,:,:,:) - ztrdts(:,:,:,:) 156 153 CALL trd_tra( kt, 'TRA', jp_tem, jptra_dmp, ztrdts(:,:,:,jp_tem) ) 157 154 CALL trd_tra( kt, 'TRA', jp_sal, jptra_dmp, ztrdts(:,:,:,jp_sal) ) -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/traldf.F90
r10806 r10874 47 47 CONTAINS 48 48 49 SUBROUTINE tra_ldf( kt , ktlev1, ktlev2, kt2lev, pts_rhs)49 SUBROUTINE tra_ldf( kt ) 50 50 !!---------------------------------------------------------------------- 51 51 !! *** ROUTINE tra_ldf *** … … 53 53 !! ** Purpose : compute the lateral ocean tracer physics. 54 54 !!---------------------------------------------------------------------- 55 INTEGER, INTENT( in ) :: kt ! ocean time-step index 56 INTEGER, INTENT( in ) :: ktlev1, ktlev2 ! time level indices for 3-time-level source terms 57 INTEGER, INTENT( in ) :: kt2lev ! time level index for 2-time-level source terms 58 REAL(wp), INTENT( inout), DIMENSION(jpi,jpj,jpk,jpts) :: pts_rhs ! temperature and salinity trends 55 INTEGER, INTENT( in ) :: kt ! ocean time-step index 59 56 !! 60 57 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdt, ztrds … … 65 62 IF( l_trdtra ) THEN !* Save ta and sa trends 66 63 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) 67 ztrdt(:,:,:) = pts_rhs(:,:,:,jp_tem)68 ztrds(:,:,:) = pts_rhs(:,:,:,jp_sal)64 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 65 ztrds(:,:,:) = tsa(:,:,:,jp_sal) 69 66 ENDIF 70 67 ! 71 68 SELECT CASE ( nldf_tra ) !* compute lateral mixing trend and add it to the general trend 72 69 CASE ( np_lap ) ! laplacian: iso-level operator 73 CALL tra_ldf_lap ( kt, nit000, ktlev2, kt2lev, 'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, ts(:,:,:,:,ktlev1), pts_rhs, jpts, 1 )70 CALL tra_ldf_lap ( kt, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, tsb, tsa, jpts, 1 ) 74 71 CASE ( np_lap_i ) ! laplacian: standard iso-neutral operator (Madec) 75 CALL tra_ldf_iso ( kt, nit000, ktlev2, kt2lev, 'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, ts(:,:,:,:,ktlev1), ts(:,:,:,:,ktlev1), pts_rhs, jpts, 1 )72 CALL tra_ldf_iso ( kt, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, tsb, tsb, tsa, jpts, 1 ) 76 73 CASE ( np_lap_it ) ! laplacian: triad iso-neutral operator (griffies) 77 CALL tra_ldf_triad( kt, nit000, ktlev2, kt2lev, 'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, ts(:,:,:,:,ktlev1), ts(:,:,:,:,ktlev1), pts_rhs, jpts, 1 )74 CALL tra_ldf_triad( kt, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, tsb, tsb, tsa, jpts, 1 ) 78 75 CASE ( np_blp , np_blp_i , np_blp_it ) ! bilaplacian: iso-level & iso-neutral operators 79 CALL tra_ldf_blp ( kt, nit000, ktlev2, kt2lev, 'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, ts(:,:,:,:,ktlev1) , pts_rhs, jpts, nldf_tra )76 CALL tra_ldf_blp ( kt, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, tsb , tsa, jpts, nldf_tra ) 80 77 END SELECT 81 78 ! 82 79 IF( l_trdtra ) THEN !* save the horizontal diffusive trends for further diagnostics 83 ztrdt(:,:,:) = pts_rhs(:,:,:,jp_tem) - ztrdt(:,:,:)84 ztrds(:,:,:) = pts_rhs(:,:,:,jp_sal) - ztrds(:,:,:)80 ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:) 81 ztrds(:,:,:) = tsa(:,:,:,jp_sal) - ztrds(:,:,:) 85 82 CALL trd_tra( kt, 'TRA', jp_tem, jptra_ldf, ztrdt ) 86 83 CALL trd_tra( kt, 'TRA', jp_sal, jptra_ldf, ztrds ) -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/traldf_iso.F90
r10806 r10874 48 48 CONTAINS 49 49 50 SUBROUTINE tra_ldf_iso( kt, kit000, ktlev, kt2lev,cdtype, pahu, pahv, pgu , pgv , &50 SUBROUTINE tra_ldf_iso( kt, kit000, cdtype, pahu, pahv, pgu , pgv , & 51 51 & pgui, pgvi, & 52 & pt , pt_lev0, pt_rhs, kjpt, kpass )52 & ptb , ptbb, pta , kjpt, kpass ) 53 53 !!---------------------------------------------------------------------- 54 54 !! *** ROUTINE tra_ldf_iso *** … … 87 87 !! difft = 1/(e1e2t*e3t) dk[ zftw ] 88 88 !! Add this trend to the general trend (ta,sa): 89 !! pt _rhs = pt_rhs+ difft90 !! 91 !! ** Action : Update pt _rhsarrays with the before rotated diffusion89 !! pta = pta + difft 90 !! 91 !! ** Action : Update pta arrays with the before rotated diffusion 92 92 !!---------------------------------------------------------------------- 93 93 INTEGER , INTENT(in ) :: kt ! ocean time-step index 94 94 INTEGER , INTENT(in ) :: kit000 ! first time step index 95 INTEGER , INTENT(in ) :: ktlev ! time level index for e3t96 INTEGER , INTENT(in ) :: kt2lev ! time level index for 2-time-level thicknesses97 95 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 98 96 INTEGER , INTENT(in ) :: kjpt ! number of tracers … … 101 99 REAL(wp), DIMENSION(jpi,jpj ,kjpt), INTENT(in ) :: pgu, pgv ! tracer gradient at pstep levels 102 100 REAL(wp), DIMENSION(jpi,jpj, kjpt), INTENT(in ) :: pgui, pgvi ! tracer gradient at top levels 103 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt ! tracer (kpass=1) or laplacian of tracer (kpass=2)104 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt _lev0! tracer (only used in kpass=2)105 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt _rhs! tracer trend101 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! tracer (kpass=1) or laplacian of tracer (kpass=2) 102 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptbb ! tracer (only used in kpass=2) 103 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 106 104 ! 107 105 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 184 182 DO ji = 1, fs_jpim1 185 183 akz(ji,jj,jk) = 16._wp * ah_wslp2(ji,jj,jk) & 186 & * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ( e3w (ji,jj,jk,kt2lev) * e3w(ji,jj,jk,kt2lev) ) )184 & * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ( e3w_n(ji,jj,jk) * e3w_n(ji,jj,jk) ) ) 187 185 END DO 188 186 END DO … … 192 190 DO jj = 1, jpjm1 193 191 DO ji = 1, fs_jpim1 194 ze3w_2 = e3w (ji,jj,jk,kt2lev) * e3w(ji,jj,jk,kt2lev)192 ze3w_2 = e3w_n(ji,jj,jk) * e3w_n(ji,jj,jk) 195 193 zcoef0 = z2dt * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2 ) 196 194 akz(ji,jj,jk) = MAX( zcoef0 - 0.5_wp , 0._wp ) * ze3w_2 * z1_2dt … … 221 219 DO jj = 1, jpjm1 222 220 DO ji = 1, fs_jpim1 ! vector opt. 223 zdit(ji,jj,jk) = ( pt (ji+1,jj ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk)224 zdjt(ji,jj,jk) = ( pt (ji ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk)221 zdit(ji,jj,jk) = ( ptb(ji+1,jj ,jk,jn) - ptb(ji,jj,jk,jn) ) * umask(ji,jj,jk) 222 zdjt(ji,jj,jk) = ( ptb(ji ,jj+1,jk,jn) - ptb(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 225 223 END DO 226 224 END DO … … 250 248 ! 251 249 ! !== Vertical tracer gradient 252 zdk1t(:,:) = ( pt (:,:,jk,jn) - pt(:,:,jk+1,jn) ) * wmask(:,:,jk+1) ! level jk+1250 zdk1t(:,:) = ( ptb(:,:,jk,jn) - ptb(:,:,jk+1,jn) ) * wmask(:,:,jk+1) ! level jk+1 253 251 ! 254 252 IF( jk == 1 ) THEN ; zdkt(:,:) = zdk1t(:,:) ! surface: zdkt(jk=1)=zdkt(jk=2) 255 ELSE ; zdkt(:,:) = ( pt (:,:,jk-1,jn) - pt(:,:,jk,jn) ) * wmask(:,:,jk)253 ELSE ; zdkt(:,:) = ( ptb(:,:,jk-1,jn) - ptb(:,:,jk,jn) ) * wmask(:,:,jk) 256 254 ENDIF 257 255 DO jj = 1 , jpjm1 !== Horizontal fluxes 258 256 DO ji = 1, fs_jpim1 ! vector opt. 259 zabe1 = pahu(ji,jj,jk) * e2_e1u(ji,jj) * e3u (ji,jj,jk,ktlev)260 zabe2 = pahv(ji,jj,jk) * e1_e2v(ji,jj) * e3v (ji,jj,jk,ktlev)257 zabe1 = pahu(ji,jj,jk) * e2_e1u(ji,jj) * e3u_n(ji,jj,jk) 258 zabe2 = pahv(ji,jj,jk) * e1_e2v(ji,jj) * e3v_n(ji,jj,jk) 261 259 ! 262 260 zmsku = 1. / MAX( wmask(ji+1,jj,jk ) + wmask(ji,jj,jk+1) & … … 278 276 END DO 279 277 ! 280 DO jj = 2 , jpjm1 !== horizontal divergence and add to pt _rhs278 DO jj = 2 , jpjm1 !== horizontal divergence and add to pta 281 279 DO ji = fs_2, fs_jpim1 ! vector opt. 282 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( zftu(ji,jj,jk) - zftu(ji-1,jj,jk) &280 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + zsign * ( zftu(ji,jj,jk) - zftu(ji-1,jj,jk) & 283 281 & + zftv(ji,jj,jk) - zftv(ji,jj-1,jk) ) & 284 & * r1_e1e2t(ji,jj) / e3t (ji,jj,jk,ktlev)282 & * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 285 283 END DO 286 284 END DO … … 327 325 DO jj = 1, jpjm1 328 326 DO ji = fs_2, fs_jpim1 329 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w (ji,jj,jk,kt2lev) * wmask(ji,jj,jk) &327 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w_n(ji,jj,jk) * wmask(ji,jj,jk) & 330 328 & * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) ) & 331 & * ( pt (ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) )329 & * ( ptb(ji,jj,jk-1,jn) - ptb(ji,jj,jk,jn) ) 332 330 END DO 333 331 END DO … … 342 340 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) & 343 341 & + ah_wslp2(ji,jj,jk) * e1e2t(ji,jj) & 344 & * ( pt (ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) / e3w(ji,jj,jk,kt2lev) * wmask(ji,jj,jk)342 & * ( ptb(ji,jj,jk-1,jn) - ptb(ji,jj,jk,jn) ) / e3w_n(ji,jj,jk) * wmask(ji,jj,jk) 345 343 END DO 346 344 END DO 347 345 END DO 348 CASE( 2 ) ! 2nd pass : eddy flux = ah_wslp2 and akz applied on pt and pt_lev0gradients, resp.346 CASE( 2 ) ! 2nd pass : eddy flux = ah_wslp2 and akz applied on ptb and ptbb gradients, resp. 349 347 DO jk = 2, jpkm1 350 348 DO jj = 1, jpjm1 351 349 DO ji = fs_2, fs_jpim1 352 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w (ji,jj,jk,kt2lev) * wmask(ji,jj,jk) &353 & * ( ah_wslp2(ji,jj,jk) * ( pt (ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) &354 & + akz (ji,jj,jk) * ( pt _lev0(ji,jj,jk-1,jn) - pt_lev0(ji,jj,jk,jn) ) )350 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w_n(ji,jj,jk) * wmask(ji,jj,jk) & 351 & * ( ah_wslp2(ji,jj,jk) * ( ptb (ji,jj,jk-1,jn) - ptb (ji,jj,jk,jn) ) & 352 & + akz (ji,jj,jk) * ( ptbb(ji,jj,jk-1,jn) - ptbb(ji,jj,jk,jn) ) ) 355 353 END DO 356 354 END DO … … 359 357 ENDIF 360 358 ! 361 DO jk = 1, jpkm1 !== Divergence of vertical fluxes added to pt _rhs==!359 DO jk = 1, jpkm1 !== Divergence of vertical fluxes added to pta ==! 362 360 DO jj = 2, jpjm1 363 361 DO ji = fs_2, fs_jpim1 ! vector opt. 364 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( ztfw (ji,jj,jk) - ztfw(ji,jj,jk+1) ) &365 & * r1_e1e2t(ji,jj) / e3t (ji,jj,jk,ktlev)362 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + zsign * ( ztfw (ji,jj,jk) - ztfw(ji,jj,jk+1) ) & 363 & * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 366 364 END DO 367 365 END DO -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/traldf_lap_blp.F90
r10806 r10874 45 45 CONTAINS 46 46 47 SUBROUTINE tra_ldf_lap( kt, kit000, ktlev, kt2lev,cdtype, pahu, pahv, pgu , pgv , &47 SUBROUTINE tra_ldf_lap( kt, kit000, cdtype, pahu, pahv, pgu , pgv , & 48 48 & pgui, pgvi, & 49 & pt , pt_rhs, kjpt, kpass )49 & ptb , pta , kjpt, kpass ) 50 50 !!---------------------------------------------------------------------- 51 51 !! *** ROUTINE tra_ldf_lap *** … … 59 59 !! difft = 1/(e1e2t*e3t) { di-1[ pahu e2u*e3u/e1u di(tb) ] 60 60 !! + dj-1[ pahv e1v*e3v/e2v dj(tb) ] } 61 !! Add this trend to the general tracer trend pt _rhs:62 !! pt _rhs = pt_rhs+ difft63 !! 64 !! ** Action : - Update pt _rhsarrays with the before iso-level61 !! Add this trend to the general tracer trend pta : 62 !! pta = pta + difft 63 !! 64 !! ** Action : - Update pta arrays with the before iso-level 65 65 !! harmonic mixing trend. 66 66 !!---------------------------------------------------------------------- 67 67 INTEGER , INTENT(in ) :: kt ! ocean time-step index 68 68 INTEGER , INTENT(in ) :: kit000 ! first time step index 69 INTEGER , INTENT(in ) :: ktlev ! time level index for e3t70 INTEGER , INTENT(in ) :: kt2lev ! time level index for 2-time-level thicknesses71 69 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 72 70 INTEGER , INTENT(in ) :: kjpt ! number of tracers … … 75 73 REAL(wp), DIMENSION(jpi,jpj ,kjpt), INTENT(in ) :: pgu, pgv ! tracer gradient at pstep levels 76 74 REAL(wp), DIMENSION(jpi,jpj, kjpt), INTENT(in ) :: pgui, pgvi ! tracer gradient at top levels 77 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt ! before and now tracer fields78 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt _rhs! tracer trend75 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 76 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 79 77 ! 80 78 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 102 100 DO jj = 1, jpjm1 103 101 DO ji = 1, fs_jpim1 ! vector opt. 104 zaheeu(ji,jj,jk) = zsign * pahu(ji,jj,jk) * e2_e1u(ji,jj) * e3u (ji,jj,jk,ktlev) !!gm * umask(ji,jj,jk) pah masked!105 zaheev(ji,jj,jk) = zsign * pahv(ji,jj,jk) * e1_e2v(ji,jj) * e3v (ji,jj,jk,ktlev) !!gm * vmask(ji,jj,jk)102 zaheeu(ji,jj,jk) = zsign * pahu(ji,jj,jk) * e2_e1u(ji,jj) * e3u_n(ji,jj,jk) !!gm * umask(ji,jj,jk) pah masked! 103 zaheev(ji,jj,jk) = zsign * pahv(ji,jj,jk) * e1_e2v(ji,jj) * e3v_n(ji,jj,jk) !!gm * vmask(ji,jj,jk) 106 104 END DO 107 105 END DO … … 115 113 DO jj = 1, jpjm1 116 114 DO ji = 1, fs_jpim1 117 ztu(ji,jj,jk) = zaheeu(ji,jj,jk) * ( pt (ji+1,jj ,jk,jn) - pt(ji,jj,jk,jn) )118 ztv(ji,jj,jk) = zaheev(ji,jj,jk) * ( pt (ji ,jj+1,jk,jn) - pt(ji,jj,jk,jn) )115 ztu(ji,jj,jk) = zaheeu(ji,jj,jk) * ( ptb(ji+1,jj ,jk,jn) - ptb(ji,jj,jk,jn) ) 116 ztv(ji,jj,jk) = zaheev(ji,jj,jk) * ( ptb(ji ,jj+1,jk,jn) - ptb(ji,jj,jk,jn) ) 119 117 END DO 120 118 END DO … … 140 138 DO jj = 2, jpjm1 141 139 DO ji = fs_2, fs_jpim1 142 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) &140 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) & 143 141 & + ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) & 144 & / ( e1e2t(ji,jj) * e3t (ji,jj,jk,ktlev) )142 & / ( e1e2t(ji,jj) * e3t_n(ji,jj,jk) ) 145 143 END DO 146 144 END DO … … 161 159 162 160 163 SUBROUTINE tra_ldf_blp( kt, kit000, ktlev, kt2lev,cdtype, pahu, pahv, pgu , pgv , &161 SUBROUTINE tra_ldf_blp( kt, kit000, cdtype, pahu, pahv, pgu , pgv , & 164 162 & pgui, pgvi, & 165 & pt , pt_rhs, kjpt, kldf )163 & ptb , pta , kjpt, kldf ) 166 164 !!---------------------------------------------------------------------- 167 165 !! *** ROUTINE tra_ldf_blp *** … … 174 172 !! It is computed by two successive calls to laplacian routine 175 173 !! 176 !! ** Action : pt _rhsupdated with the before rotated bilaplacian diffusion174 !! ** Action : pta updated with the before rotated bilaplacian diffusion 177 175 !!---------------------------------------------------------------------- 178 176 INTEGER , INTENT(in ) :: kt ! ocean time-step index 179 177 INTEGER , INTENT(in ) :: kit000 ! first time step index 180 INTEGER , INTENT(in ) :: ktlev ! time level index for e3t181 INTEGER , INTENT(in ) :: kt2lev ! time level index for 2-time-level thicknesses182 178 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 183 179 INTEGER , INTENT(in ) :: kjpt ! number of tracers … … 186 182 REAL(wp), DIMENSION(jpi,jpj ,kjpt), INTENT(in ) :: pgu, pgv ! tracer gradient at pstep levels 187 183 REAL(wp), DIMENSION(jpi,jpj, kjpt), INTENT(in ) :: pgui, pgvi ! tracer gradient at top levels 188 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt ! before and now tracer fields189 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt _rhs! tracer trend184 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 185 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 190 186 ! 191 187 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 207 203 zlap(:,:,:,:) = 0._wp 208 204 ! 209 SELECT CASE ( kldf ) !== 1st laplacian applied to pt (output in zlap) ==!205 SELECT CASE ( kldf ) !== 1st laplacian applied to ptb (output in zlap) ==! 210 206 ! 211 207 CASE ( np_blp ) ! iso-level bilaplacian 212 CALL tra_ldf_lap ( kt, kit000, ktlev, kt2lev, cdtype, pahu, pahv, pgu, pgv, pgui, pgvi, pt, zlap, kjpt, 1 )208 CALL tra_ldf_lap ( kt, kit000, cdtype, pahu, pahv, pgu, pgv, pgui, pgvi, ptb, zlap, kjpt, 1 ) 213 209 CASE ( np_blp_i ) ! rotated bilaplacian : standard operator (Madec) 214 CALL tra_ldf_iso ( kt, kit000, ktlev, kt2lev, cdtype, pahu, pahv, pgu, pgv, pgui, pgvi, pt, pt, zlap, kjpt, 1 )210 CALL tra_ldf_iso ( kt, kit000, cdtype, pahu, pahv, pgu, pgv, pgui, pgvi, ptb, ptb, zlap, kjpt, 1 ) 215 211 CASE ( np_blp_it ) ! rotated bilaplacian : triad operator (griffies) 216 CALL tra_ldf_triad( kt, kit000, ktlev, kt2lev, cdtype, pahu, pahv, pgu, pgv, pgui, pgvi, pt, pt, zlap, kjpt, 1 )212 CALL tra_ldf_triad( kt, kit000, cdtype, pahu, pahv, pgu, pgv, pgui, pgvi, ptb, ptb, zlap, kjpt, 1 ) 217 213 END SELECT 218 214 ! … … 223 219 ENDIF 224 220 ! 225 SELECT CASE ( kldf ) !== 2nd laplacian applied to zlap (output in pt _rhs) ==!221 SELECT CASE ( kldf ) !== 2nd laplacian applied to zlap (output in pta) ==! 226 222 ! 227 223 CASE ( np_blp ) ! iso-level bilaplacian 228 CALL tra_ldf_lap ( kt, kit000, ktlev, kt2lev, cdtype, pahu, pahv, zglu, zglv, zgui, zgvi, zlap, pt_rhs, kjpt, 2 )224 CALL tra_ldf_lap ( kt, kit000, cdtype, pahu, pahv, zglu, zglv, zgui, zgvi, zlap, pta, kjpt, 2 ) 229 225 CASE ( np_blp_i ) ! rotated bilaplacian : standard operator (Madec) 230 CALL tra_ldf_iso ( kt, kit000, ktlev, kt2lev, cdtype, pahu, pahv, zglu, zglv, zgui, zgvi, zlap, pt, pt_rhs, kjpt, 2 )226 CALL tra_ldf_iso ( kt, kit000, cdtype, pahu, pahv, zglu, zglv, zgui, zgvi, zlap, ptb, pta, kjpt, 2 ) 231 227 CASE ( np_blp_it ) ! rotated bilaplacian : triad operator (griffies) 232 CALL tra_ldf_triad( kt, kit000, ktlev, kt2lev, cdtype, pahu, pahv, zglu, zglv, zgui, zgvi, zlap, pt, pt_rhs, kjpt, 2 )228 CALL tra_ldf_triad( kt, kit000, cdtype, pahu, pahv, zglu, zglv, zgui, zgvi, zlap, ptb, pta, kjpt, 2 ) 233 229 END SELECT 234 230 ! -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/traldf_triad.F90
r10806 r10874 48 48 CONTAINS 49 49 50 SUBROUTINE tra_ldf_triad( kt, kit000, ktlev, kt2lev,cdtype, pahu, pahv, pgu , pgv , &50 SUBROUTINE tra_ldf_triad( kt, kit000, cdtype, pahu, pahv, pgu , pgv , & 51 51 & pgui, pgvi, & 52 & pt , pt_lev0, pt_rhs, kjpt, kpass )52 & ptb , ptbb, pta , kjpt, kpass ) 53 53 !!---------------------------------------------------------------------- 54 54 !! *** ROUTINE tra_ldf_triad *** … … 66 66 !! see documentation for the desciption 67 67 !! 68 !! ** Action : pt _rhsupdated with the before rotated diffusion68 !! ** Action : pta updated with the before rotated diffusion 69 69 !! ah_wslp2 .... 70 70 !! akz stabilizing vertical diffusivity coefficient (used in trazdf_imp) … … 72 72 INTEGER , INTENT(in ) :: kt ! ocean time-step index 73 73 INTEGER , INTENT(in ) :: kit000 ! first time step index 74 INTEGER , INTENT(in ) :: ktlev ! time level index for e3t75 INTEGER , INTENT(in ) :: kt2lev ! time level index for 2-time-level thicknesses76 74 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 77 75 INTEGER , INTENT(in ) :: kjpt ! number of tracers … … 80 78 REAL(wp), DIMENSION(jpi,jpj ,kjpt), INTENT(in ) :: pgu , pgv ! tracer gradient at pstep levels 81 79 REAL(wp), DIMENSION(jpi,jpj, kjpt), INTENT(in ) :: pgui, pgvi ! tracer gradient at top levels 82 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt ! tracer (kpass=1) or laplacian of tracer (kpass=2)83 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt _lev0! tracer (only used in kpass=2)84 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt _rhs! tracer trend80 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! tracer (kpass=1) or laplacian of tracer (kpass=2) 81 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptbb ! tracer (only used in kpass=2) 82 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 85 83 ! 86 84 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 144 142 DO jj = 1, jpjm1 145 143 DO ji = 1, fs_jpim1 146 ze3wr = 1._wp / e3w (ji+ip,jj,jk+kp,kt2lev)147 zbu = e1e2u(ji,jj) * e3u (ji,jj,jk,ktlev)144 ze3wr = 1._wp / e3w_n(ji+ip,jj,jk+kp) 145 zbu = e1e2u(ji,jj) * e3u_n(ji,jj,jk) 148 146 zah = 0.25_wp * pahu(ji,jj,jk) 149 147 zslope_skew = triadi_g(ji+ip,jj,jk,1-ip,kp) 150 148 ! Subtract s-coordinate slope at t-points to give slope rel to s-surfaces (do this by *adding* gradient of depth) 151 zslope2 = zslope_skew + ( gdept (ji+1,jj,jk,kt2lev) - gdept(ji,jj,jk,kt2lev) ) * r1_e1u(ji,jj) * umask(ji,jj,jk+kp)149 zslope2 = zslope_skew + ( gdept_n(ji+1,jj,jk) - gdept_n(ji,jj,jk) ) * r1_e1u(ji,jj) * umask(ji,jj,jk+kp) 152 150 zslope2 = zslope2 *zslope2 153 151 ah_wslp2(ji+ip,jj,jk+kp) = ah_wslp2(ji+ip,jj,jk+kp) + zah * zbu * ze3wr * r1_e1e2t(ji+ip,jj) * zslope2 … … 168 166 DO jj = 1, jpjm1 169 167 DO ji = 1, fs_jpim1 170 ze3wr = 1.0_wp / e3w (ji,jj+jp,jk+kp,kt2lev)171 zbv = e1e2v(ji,jj) * e3v (ji,jj,jk,ktlev)168 ze3wr = 1.0_wp / e3w_n(ji,jj+jp,jk+kp) 169 zbv = e1e2v(ji,jj) * e3v_n(ji,jj,jk) 172 170 zah = 0.25_wp * pahv(ji,jj,jk) 173 171 zslope_skew = triadj_g(ji,jj+jp,jk,1-jp,kp) 174 172 ! Subtract s-coordinate slope at t-points to give slope rel to s surfaces 175 173 ! (do this by *adding* gradient of depth) 176 zslope2 = zslope_skew + ( gdept (ji,jj+1,jk,kt2lev) - gdept(ji,jj,jk,kt2lev) ) * r1_e2v(ji,jj) * vmask(ji,jj,jk+kp)174 zslope2 = zslope_skew + ( gdept_n(ji,jj+1,jk) - gdept_n(ji,jj,jk) ) * r1_e2v(ji,jj) * vmask(ji,jj,jk+kp) 177 175 zslope2 = zslope2 * zslope2 178 176 ah_wslp2(ji,jj+jp,jk+kp) = ah_wslp2(ji,jj+jp,jk+kp) + zah * zbv * ze3wr * r1_e1e2t(ji,jj+jp) * zslope2 … … 195 193 DO ji = 1, fs_jpim1 196 194 akz(ji,jj,jk) = 16._wp * ah_wslp2(ji,jj,jk) & 197 & * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ( e3w (ji,jj,jk,kt2lev) * e3w(ji,jj,jk,kt2lev) ) )195 & * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ( e3w_n(ji,jj,jk) * e3w_n(ji,jj,jk) ) ) 198 196 END DO 199 197 END DO … … 203 201 DO jj = 1, jpjm1 204 202 DO ji = 1, fs_jpim1 205 ze3w_2 = e3w (ji,jj,jk,kt2lev) * e3w(ji,jj,jk,kt2lev)203 ze3w_2 = e3w_n(ji,jj,jk) * e3w_n(ji,jj,jk) 206 204 zcoef0 = z2dt * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2 ) 207 205 akz(ji,jj,jk) = MAX( zcoef0 - 0.5_wp , 0._wp ) * ze3w_2 * z1_2dt … … 231 229 DO jj = 1, jpjm1 232 230 DO ji = 1, fs_jpim1 ! vector opt. 233 zdit(ji,jj,jk) = ( pt (ji+1,jj ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk)234 zdjt(ji,jj,jk) = ( pt (ji ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk)231 zdit(ji,jj,jk) = ( ptb(ji+1,jj ,jk,jn) - ptb(ji,jj,jk,jn) ) * umask(ji,jj,jk) 232 zdjt(ji,jj,jk) = ( ptb(ji ,jj+1,jk,jn) - ptb(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 235 233 END DO 236 234 END DO … … 259 257 DO jk = 1, jpkm1 260 258 ! !== Vertical tracer gradient at level jk and jk+1 261 zdkt3d(:,:,1) = ( pt (:,:,jk,jn) - pt(:,:,jk+1,jn) ) * tmask(:,:,jk+1)259 zdkt3d(:,:,1) = ( ptb(:,:,jk,jn) - ptb(:,:,jk+1,jn) ) * tmask(:,:,jk+1) 262 260 ! 263 261 ! ! surface boundary condition: zdkt3d(jk=0)=zdkt3d(jk=1) 264 262 IF( jk == 1 ) THEN ; zdkt3d(:,:,0) = zdkt3d(:,:,1) 265 ELSE ; zdkt3d(:,:,0) = ( pt (:,:,jk-1,jn) - pt(:,:,jk,jn) ) * tmask(:,:,jk)263 ELSE ; zdkt3d(:,:,0) = ( ptb(:,:,jk-1,jn) - ptb(:,:,jk,jn) ) * tmask(:,:,jk) 266 264 ENDIF 267 265 ! … … 275 273 ze1ur = r1_e1u(ji,jj) 276 274 zdxt = zdit(ji,jj,jk) * ze1ur 277 ze3wr = 1._wp / e3w (ji+ip,jj,jk+kp,kt2lev)275 ze3wr = 1._wp / e3w_n(ji+ip,jj,jk+kp) 278 276 zdzt = zdkt3d(ji+ip,jj,kp) * ze3wr 279 277 zslope_skew = triadi_g(ji+ip,jj,jk,1-ip,kp) 280 278 zslope_iso = triadi (ji+ip,jj,jk,1-ip,kp) 281 279 ! 282 zbu = 0.25_wp * e1e2u(ji,jj) * e3u (ji,jj,jk,ktlev)280 zbu = 0.25_wp * e1e2u(ji,jj) * e3u_n(ji,jj,jk) 283 281 ! ln_botmix_triad is .T. don't mask zah for bottom half cells !!gm ????? ahu is masked.... 284 282 zah = pahu(ji,jj,jk) … … 298 296 ze2vr = r1_e2v(ji,jj) 299 297 zdyt = zdjt(ji,jj,jk) * ze2vr 300 ze3wr = 1._wp / e3w (ji,jj+jp,jk+kp,kt2lev)298 ze3wr = 1._wp / e3w_n(ji,jj+jp,jk+kp) 301 299 zdzt = zdkt3d(ji,jj+jp,kp) * ze3wr 302 300 zslope_skew = triadj_g(ji,jj+jp,jk,1-jp,kp) 303 301 zslope_iso = triadj(ji,jj+jp,jk,1-jp,kp) 304 zbv = 0.25_wp * e1e2v(ji,jj) * e3v (ji,jj,jk,ktlev)302 zbv = 0.25_wp * e1e2v(ji,jj) * e3v_n(ji,jj,jk) 305 303 ! ln_botmix_triad is .T. don't mask zah for bottom half cells !!gm ????? ahv is masked... 306 304 zah = pahv(ji,jj,jk) … … 322 320 ze1ur = r1_e1u(ji,jj) 323 321 zdxt = zdit(ji,jj,jk) * ze1ur 324 ze3wr = 1._wp / e3w (ji+ip,jj,jk+kp,kt2lev)322 ze3wr = 1._wp / e3w_n(ji+ip,jj,jk+kp) 325 323 zdzt = zdkt3d(ji+ip,jj,kp) * ze3wr 326 324 zslope_skew = triadi_g(ji+ip,jj,jk,1-ip,kp) 327 325 zslope_iso = triadi(ji+ip,jj,jk,1-ip,kp) 328 326 ! 329 zbu = 0.25_wp * e1e2u(ji,jj) * e3u (ji,jj,jk,ktlev)327 zbu = 0.25_wp * e1e2u(ji,jj) * e3u_n(ji,jj,jk) 330 328 ! ln_botmix_triad is .F. mask zah for bottom half cells 331 329 zah = pahu(ji,jj,jk) * umask(ji,jj,jk+kp) ! pahu(ji+ip,jj,jk) ===>> ???? … … 345 343 ze2vr = r1_e2v(ji,jj) 346 344 zdyt = zdjt(ji,jj,jk) * ze2vr 347 ze3wr = 1._wp / e3w (ji,jj+jp,jk+kp,kt2lev)345 ze3wr = 1._wp / e3w_n(ji,jj+jp,jk+kp) 348 346 zdzt = zdkt3d(ji,jj+jp,kp) * ze3wr 349 347 zslope_skew = triadj_g(ji,jj+jp,jk,1-jp,kp) 350 348 zslope_iso = triadj(ji,jj+jp,jk,1-jp,kp) 351 zbv = 0.25_wp * e1e2v(ji,jj) * e3v (ji,jj,jk,ktlev)349 zbv = 0.25_wp * e1e2v(ji,jj) * e3v_n(ji,jj,jk) 352 350 ! ln_botmix_triad is .F. mask zah for bottom half cells 353 351 zah = pahv(ji,jj,jk) * vmask(ji,jj,jk+kp) ! pahv(ji,jj+jp,jk) ???? … … 364 362 DO jj = 2 , jpjm1 365 363 DO ji = fs_2, fs_jpim1 ! vector opt. 366 pt _rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( zftu(ji-1,jj,jk) - zftu(ji,jj,jk) &364 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + zsign * ( zftu(ji-1,jj,jk) - zftu(ji,jj,jk) & 367 365 & + zftv(ji,jj-1,jk) - zftv(ji,jj,jk) ) & 368 & / ( e1e2t(ji,jj) * e3t (ji,jj,jk,ktlev) )366 & / ( e1e2t(ji,jj) * e3t_n(ji,jj,jk) ) 369 367 END DO 370 368 END DO … … 377 375 DO jj = 1, jpjm1 378 376 DO ji = fs_2, fs_jpim1 379 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w (ji,jj,jk,kt2lev) * tmask(ji,jj,jk) &377 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w_n(ji,jj,jk) * tmask(ji,jj,jk) & 380 378 & * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) ) & 381 & * ( pt (ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) )379 & * ( ptb(ji,jj,jk-1,jn) - ptb(ji,jj,jk,jn) ) 382 380 END DO 383 381 END DO … … 389 387 DO jj = 1, jpjm1 390 388 DO ji = fs_2, fs_jpim1 391 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w (ji,jj,jk,kt2lev) * tmask(ji,jj,jk) &392 & * ah_wslp2(ji,jj,jk) * ( pt (ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) )389 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w_n(ji,jj,jk) * tmask(ji,jj,jk) & 390 & * ah_wslp2(ji,jj,jk) * ( ptb(ji,jj,jk-1,jn) - ptb(ji,jj,jk,jn) ) 393 391 END DO 394 392 END DO 395 393 END DO 396 CASE( 2 ) ! 2nd pass : eddy flux = ah_wslp2 and akz applied on pt and pt_lev0gradients, resp.394 CASE( 2 ) ! 2nd pass : eddy flux = ah_wslp2 and akz applied on ptb and ptbb gradients, resp. 397 395 DO jk = 2, jpkm1 398 396 DO jj = 1, jpjm1 399 397 DO ji = fs_2, fs_jpim1 400 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w (ji,jj,jk,kt2lev) * tmask(ji,jj,jk) &401 & * ( ah_wslp2(ji,jj,jk) * ( pt (ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) &402 & + akz (ji,jj,jk) * ( pt _lev0(ji,jj,jk-1,jn) - pt_lev0(ji,jj,jk,jn) ) )398 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w_n(ji,jj,jk) * tmask(ji,jj,jk) & 399 & * ( ah_wslp2(ji,jj,jk) * ( ptb (ji,jj,jk-1,jn) - ptb (ji,jj,jk,jn) ) & <