Changeset 10743
- Timestamp:
- 2019-03-12T12:06:29+01:00 (6 years ago)
- Location:
- NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DOM/dom_oce.F90
r10068 r10743 62 62 INTEGER , PUBLIC :: neuler !: restart euler forward option (0=Euler) 63 63 REAL(wp), PUBLIC :: r2dt !: = 2*rdt except at nit000 (=rdt) if neuler=0 64 65 !!---------------------------------------------------------------------- 66 !! time level indices 67 !!---------------------------------------------------------------------- 68 INTEGER, PUBLIC :: Nm1, Nnn, Np1, Nrhs, Nm1_2lev, Nnn_2lev 64 69 65 70 !!---------------------------------------------------------------------- … … 129 134 LOGICAL, PUBLIC :: ln_sco !: s-coordinate or hybrid z-s coordinate 130 135 LOGICAL, PUBLIC :: ln_isfcav !: presence of ISF 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] 136 ! ! ref. 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] 139 147 140 148 ! ! ref. ! before ! now ! … … 149 157 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: r1_hu_b , r1_hu_n , r1_hu_a !: inverse of u-depth [1/m] 150 158 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: r1_hv_b , r1_hv_n , r1_hv_a !: inverse of v-depth [1/m] 159 160 !! TEMPORARY POINTERS FOR DEVELOPMENT ONLY 161 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: e3t_b , e3t_n , e3t_a !: t- vert. scale factor [m] 162 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: e3u_b , e3u_n , e3u_a !: u- vert. scale factor [m] 163 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: e3v_b , e3v_n , e3v_a !: v- vert. scale factor [m] 164 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: e3f_n !: f- vert. scale factor [m] 165 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: e3w_b , e3w_n !: w- vert. scale factor [m] 166 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: e3uw_b , e3uw_n !: uw-vert. scale factor [m] 167 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: e3vw_b , e3vw_n !: vw-vert. scale factor [m] 168 !! TEMPORARY POINTERS FOR DEVELOPMENT ONLY 151 169 152 170 INTEGER, PUBLIC :: nla10 !: deepest W level Above ~10m (nlb10 - 1) … … 260 278 & gdept_n(jpi,jpj,jpk) , gdepw_n(jpi,jpj,jpk) , gde3w_n(jpi,jpj,jpk) , STAT=ierr(4) ) 261 279 ! 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) ) 280 ALLOCATE( e3t_0(jpi,jpj,jpk) , e3u_0(jpi,jpj,jpk) , e3v_0(jpi,jpj,jpk) , e3f_0(jpi,jpj,jpk) , & 281 & e3w_0(jpi,jpj,jpk) , e3uw_0(jpi,jpj,jpk) , e3vw_0(jpi,jpj,jpk) , & 282 & e3t (jpi,jpj,jpk,jpt) , e3u (jpi,jpj,jpk,jpt) , e3v (jpi,jpj,jpk,jpt) , & 283 & e3w (jpi,jpj,jpk,jpt-1) , e3uw (jpi,jpj,jpk,jpt-1) , e3vw (jpi,jpj,jpk,jpt-1) , & 284 & e3f (jpi,jpj,jpk), STAT=ierr(5) ) 270 285 ! 271 286 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/DOM/domvvl.F90
r10425 r10743 563 563 564 564 565 SUBROUTINE dom_vvl_sf_swp( kt )565 SUBROUTINE dom_vvl_sf_swp( kt, kNm1, kNnn, kNm1_2lev, kNnn_2lev ) 566 566 !!---------------------------------------------------------------------- 567 567 !! *** ROUTINE dom_vvl_sf_swp *** … … 588 588 !!---------------------------------------------------------------------- 589 589 INTEGER, INTENT( in ) :: kt ! time step 590 INTEGER, INTENT( in ) :: kNm1, kNnn, kNm1_2lev, kNnn_2lev ! time level indices 590 591 ! 591 592 INTEGER :: ji, jj, jk ! dummy loop indices … … 605 606 ! Time filter and swap of scale factors 606 607 ! ===================================== 607 ! - ML - e3(t/u/v)_b are al lready computed in dynnxt.608 ! - ML - e3(t/u/v)_b are already computed in dynnxt. 608 609 IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN 609 610 IF( neuler == 0 .AND. kt == nit000 ) THEN … … 618 619 gdepw_b(:,:,:) = gdepw_n(:,:,:) 619 620 620 e3t_n(:,:,:) = e3t_a(:,:,:) 621 e3u_n(:,:,:) = e3u_a(:,:,:) 622 e3v_n(:,:,:) = e3v_a(:,:,:) 621 !! TO BE DELETED 622 !!$ e3t_n(:,:,:) = e3t_a(:,:,:) 623 !!$ e3u_n(:,:,:) = e3u_a(:,:,:) 624 !!$ e3v_n(:,:,:) = e3v_a(:,:,:) 625 !! TO BE DELETED 623 626 624 627 ! Compute all missing vertical scale factor and depths … … 629 632 ! - JC - hu_b, hv_b, hur_b, hvr_b also 630 633 631 CALL dom_vvl_interpol( e3u _n(:,:,:), e3f_n(:,:,:), 'F' )634 CALL dom_vvl_interpol( e3u(:,:,:,kNnn), e3f(:,:,:), 'F' ) 632 635 633 636 ! Vertical scale factor interpolations 634 CALL dom_vvl_interpol( e3t _n(:,:,:), e3w_n(:,:,:), 'W' )635 CALL dom_vvl_interpol( e3u _n(:,:,:), e3uw_n(:,:,:), 'UW' )636 CALL dom_vvl_interpol( e3v _n(:,:,:), e3vw_n(:,:,:), 'VW' )637 CALL dom_vvl_interpol( e3t _b(:,:,:), e3w_b(:,:,:), 'W' )638 CALL dom_vvl_interpol( e3u _b(:,:,:), e3uw_b(:,:,:), 'UW' )639 CALL dom_vvl_interpol( e3v _b(:,:,:), e3vw_b(:,:,:), 'VW' )637 CALL dom_vvl_interpol( e3t(:,:,:,kNnn), e3w(:,:,:,kNnn_2lev), 'W' ) 638 CALL dom_vvl_interpol( e3u(:,:,:,kNnn), e3uw(:,:,:,kNnn_2lev), 'UW' ) 639 CALL dom_vvl_interpol( e3v(:,:,:,kNnn), e3vw(:,:,:,kNnn_2lev), 'VW' ) 640 CALL dom_vvl_interpol( e3t(:,:,:,kNm1), e3w(:,:,:,kNm1_2lev), 'W' ) 641 CALL dom_vvl_interpol( e3u(:,:,:,kNm1), e3uw(:,:,:,kNm1_2lev), 'UW' ) 642 CALL dom_vvl_interpol( e3v(:,:,:,kNm1), e3vw(:,:,:,kNm1_2lev), 'VW' ) 640 643 641 644 ! t- and w- points depth (set the isf depth as it is in the initial step) 642 gdept_n(:,:,1) = 0.5_wp * e3w _n(:,:,1)645 gdept_n(:,:,1) = 0.5_wp * e3w(:,:,1,kNnn_2lev) 643 646 gdepw_n(:,:,1) = 0.0_wp 644 647 gde3w_n(:,:,1) = gdept_n(:,:,1) - sshn(:,:) … … 649 652 ! 1 for jk = mikt 650 653 zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk)) 651 gdepw_n(ji,jj,jk) = gdepw_n(ji,jj,jk-1) + e3t _n(ji,jj,jk-1)652 gdept_n(ji,jj,jk) = zcoef * ( gdepw_n(ji,jj,jk ) + 0.5 * e3w _n(ji,jj,jk) ) &653 & + (1-zcoef) * ( gdept_n(ji,jj,jk-1) + e3w _n(ji,jj,jk) )654 gdepw_n(ji,jj,jk) = gdepw_n(ji,jj,jk-1) + e3t(ji,jj,jk-1,kNnn) 655 gdept_n(ji,jj,jk) = zcoef * ( gdepw_n(ji,jj,jk ) + 0.5 * e3w(ji,jj,jk,kNnn_2lev) ) & 656 & + (1-zcoef) * ( gdept_n(ji,jj,jk-1) + e3w(ji,jj,jk,kNnn_2lev) ) 654 657 gde3w_n(ji,jj,jk) = gdept_n(ji,jj,jk) - sshn(ji,jj) 655 658 END DO -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DYN/dynnxt.F90
r10425 r10743 64 64 CONTAINS 65 65 66 SUBROUTINE dyn_nxt ( kt )66 SUBROUTINE dyn_nxt ( kt, kNm1, kNp1, puu, pvv, pe3t, pe3u, pe3v ) 67 67 !!---------------------------------------------------------------------- 68 68 !! *** ROUTINE dyn_nxt *** … … 92 92 !! un,vn now horizontal velocity of next time-step 93 93 !!---------------------------------------------------------------------- 94 INTEGER, INTENT( in ) :: kt ! ocean time-step index 94 INTEGER, INTENT( in ) :: kt ! ocean time-step index 95 INTEGER, INTENT( in ) :: kNm1, kNp1 ! before and after time level indices 96 REAL(wp), INTENT( inout), DIMENSION(jpi,jpj,jpk) :: puu, pvv ! now velocities to be time filtered 97 REAL(wp), INTENT( inout), DIMENSION(jpi,jpj,jpk) :: pe3t, pe3u, pe3v ! now scale factors to be time filtered 95 98 ! 96 99 INTEGER :: ji, jj, jk ! dummy loop indices 97 100 INTEGER :: ikt ! local integers 98 REAL(wp) :: zue3a, zue3n, zue3b, z uf, zcoef ! local scalars99 REAL(wp) :: zve3a, zve3n, zve3b, z vf, z1_2dt ! - -101 REAL(wp) :: zue3a, zue3n, zue3b, zcoef ! local scalars 102 REAL(wp) :: zve3a, zve3n, zve3b, z1_2dt ! - - 100 103 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zue, zve 101 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ze3 u_f, ze3v_f, zua, zva104 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ze3t_f, ze3u_f, ze3v_f, zua, zva 102 105 !!---------------------------------------------------------------------- 103 106 ! … … 115 118 ! Ensure below that barotropic velocities match time splitting estimate 116 119 ! Compute actual transport and replace it with ts estimate at "after" time step 117 zue(:,:) = e3u _a(:,:,1) * ua(:,:,1) * umask(:,:,1)118 zve(:,:) = e3v _a(:,:,1) * va(:,:,1) * vmask(:,:,1)120 zue(:,:) = e3u(:,:,1,kNp1) * uu(:,:,1,kNp1) * umask(:,:,1) 121 zve(:,:) = e3v(:,:,1,kNp1) * vv(:,:,1,kNp1) * vmask(:,:,1) 119 122 DO jk = 2, jpkm1 120 zue(:,:) = zue(:,:) + e3u _a(:,:,jk) * ua(:,:,jk) * umask(:,:,jk)121 zve(:,:) = zve(:,:) + e3v _a(:,:,jk) * va(:,:,jk) * vmask(:,:,jk)123 zue(:,:) = zue(:,:) + e3u(:,:,jk,kNp1) * uu(:,:,jk,kNp1) * umask(:,:,jk) 124 zve(:,:) = zve(:,:) + e3v(:,:,jk,kNp1) * vv(:,:,jk,kNp1) * vmask(:,:,jk) 122 125 END DO 123 126 DO jk = 1, jpkm1 124 u a(:,:,jk) = ( ua(:,:,jk) - zue(:,:) * r1_hu_a(:,:) + ua_b(:,:) ) * umask(:,:,jk)125 v a(:,:,jk) = ( va(:,:,jk) - zve(:,:) * r1_hv_a(:,:) + va_b(:,:) ) * vmask(:,:,jk)127 uu(:,:,jk,kNp1) = ( uu(:,:,jk,kNp1) - zue(:,:) * r1_hu_a(:,:) + ua_b(:,:) ) * umask(:,:,jk) 128 vv(:,:,jk,kNp1) = ( vv(:,:,jk,kNp1) - zve(:,:) * r1_hv_a(:,:) + va_b(:,:) ) * vmask(:,:,jk) 126 129 END DO 127 130 ! … … 132 135 ! so that asselin contribution is removed at the same time 133 136 DO jk = 1, jpkm1 134 un(:,:,jk) = ( un(:,:,jk) - un_adv(:,:)*r1_hu_n(:,:) + un_b(:,:) )*umask(:,:,jk)135 vn(:,:,jk) = ( vn(:,:,jk) - vn_adv(:,:)*r1_hv_n(:,:) + vn_b(:,:) )*vmask(:,:,jk)137 puu(:,:,jk) = ( puu(:,:,jk) - un_adv(:,:)*r1_hu_n(:,:) + un_b(:,:) )*umask(:,:,jk) 138 pvv(:,:,jk) = ( pvv(:,:,jk) - vn_adv(:,:)*r1_hv_n(:,:) + vn_b(:,:) )*vmask(:,:,jk) 136 139 END DO 137 140 ENDIF … … 144 147 # endif 145 148 ! 146 CALL lbc_lnk_multi( 'dynnxt', u a, 'U', -1., va, 'V', -1. ) !* local domain boundaries149 CALL lbc_lnk_multi( 'dynnxt', uu(:,:,:,kNp1), 'U', -1., vv(:,:,:,kNp1), 'V', -1. ) !* local domain boundaries 147 150 ! 148 151 ! !* BDY open boundaries … … 157 160 ! 158 161 ! ! Kinetic energy and Conversion 159 IF( ln_KE_trd ) CALL trd_dyn( u a, va, jpdyn_ken, kt )162 IF( ln_KE_trd ) CALL trd_dyn( uu(:,:,:,kNp1), vv(:,:,:,kNp1), jpdyn_ken, kt ) 160 163 ! 161 164 IF( ln_dyn_trd ) THEN ! 3D output: total momentum trends 162 zua(:,:,:) = ( u a(:,:,:) - ub(:,:,:) ) * z1_2dt163 zva(:,:,:) = ( v a(:,:,:) - vb(:,:,:) ) * z1_2dt165 zua(:,:,:) = ( uu(:,:,:,kNp1) - uu(:,:,:,kNm1) ) * z1_2dt 166 zva(:,:,:) = ( vv(:,:,:,kNp1) - vv(:,:,:,kNm1) ) * z1_2dt 164 167 CALL iom_put( "utrd_tot", zua ) ! total momentum trends, except the asselin time filter 165 168 CALL iom_put( "vtrd_tot", zva ) 166 169 ENDIF 167 170 ! 168 zua(:,:,:) = un(:,:,:) ! save the now velocity before the asselin filter169 zva(:,:,:) = vn(:,:,:) ! (caution: there will be a shift by 1 timestep in the171 zua(:,:,:) = puu(:,:,:) ! save the now velocity before the asselin filter 172 zva(:,:,:) = pvv(:,:,:) ! (caution: there will be a shift by 1 timestep in the 170 173 ! ! computation of the asselin filter trends) 171 174 ENDIF … … 173 176 ! Time filter and swap of dynamics arrays 174 177 ! ------------------------------------------ 175 IF( neuler == 0 .AND. kt == nit000 ) THEN !* Euler at first time-step: only swap 176 DO jk = 1, jpkm1 177 un(:,:,jk) = ua(:,:,jk) ! un <-- ua 178 vn(:,:,jk) = va(:,:,jk) 179 END DO 180 IF( .NOT.ln_linssh ) THEN ! e3._b <-- e3._n 178 !! TO BE DELETED 179 !!$ IF( neuler == 0 .AND. kt == nit000 ) THEN !* Euler at first time-step: only swap 180 !!$ DO jk = 1, jpkm1 181 !!$ un(:,:,jk) = ua(:,:,jk) ! un <-- ua 182 !!$ vn(:,:,jk) = va(:,:,jk) 183 !!$ END DO 184 !!$ IF( .NOT.ln_linssh ) THEN ! e3._b <-- e3._n 181 185 !!gm BUG ???? I don't understand why it is not : e3._n <-- e3._a 182 DO jk = 1, jpkm1186 !!$ DO jk = 1, jpkm1 183 187 ! e3t_b(:,:,jk) = e3t_n(:,:,jk) 184 188 ! e3u_b(:,:,jk) = e3u_n(:,:,jk) 185 189 ! e3v_b(:,:,jk) = e3v_n(:,:,jk) 186 190 ! 187 e3t_n(:,:,jk) = e3t_a(:,:,jk)188 e3u_n(:,:,jk) = e3u_a(:,:,jk)189 e3v_n(:,:,jk) = e3v_a(:,:,jk)190 END DO191 !!$ e3t_n(:,:,jk) = e3t_a(:,:,jk) 192 !!$ e3u_n(:,:,jk) = e3u_a(:,:,jk) 193 !!$ e3v_n(:,:,jk) = e3v_a(:,:,jk) 194 !!$ END DO 191 195 !!gm BUG end 192 ENDIF 196 !!$ ENDIF 197 !! TO BE DELETED 193 198 ! 194 199 195 ELSE!* Leap-Frog : Asselin filter and swap200 IF( .NOT.( neuler == 0 .AND. kt == nit000 ) ) THEN !* Leap-Frog : Asselin filter and swap 196 201 ! ! =============! 197 202 IF( ln_linssh ) THEN ! Fixed volume ! … … 200 205 DO jj = 1, jpj 201 206 DO ji = 1, jpi 202 zuf = un(ji,jj,jk) + atfp * ( ub(ji,jj,jk) - 2._wp * un(ji,jj,jk) + ua(ji,jj,jk) )203 zvf = vn(ji,jj,jk) + atfp * ( vb(ji,jj,jk) - 2._wp * vn(ji,jj,jk) + va(ji,jj,jk) )207 puu(ji,jj,jk) = puu(ji,jj,jk) + atfp * ( uu(ji,jj,jk,kNm1) - 2._wp * puu(ji,jj,jk) + uu(ji,jj,jk,kNp1) ) 208 pvv(ji,jj,jk) = pvv(ji,jj,jk) + atfp * ( vv(ji,jj,jk,kNm1) - 2._wp * pvv(ji,jj,jk) + vv(ji,jj,jk,kNp1) ) 204 209 ! 205 ub(ji,jj,jk) = zuf ! ub <-- filtered velocity 206 vb(ji,jj,jk) = zvf 207 un(ji,jj,jk) = ua(ji,jj,jk) ! un <-- ua 208 vn(ji,jj,jk) = va(ji,jj,jk) 210 !! TO BE DELETED 211 !!$ ub(ji,jj,jk) = zuf ! ub <-- filtered velocity 212 !!$ vb(ji,jj,jk) = zvf 213 !!$ un(ji,jj,jk) = ua(ji,jj,jk) ! un <-- ua 214 !!$ vn(ji,jj,jk) = va(ji,jj,jk) 215 !! TO BE DELETED 209 216 END DO 210 217 END DO … … 213 220 ELSE ! Variable volume ! 214 221 ! ! ================! 215 ! Before scale factor at t-points 216 ! (used as a now filtered scale factor until the swap) 222 ! Time-filtered scale factor at t-points 217 223 ! ---------------------------------------------------- 224 ALLOCATE( ze3t_f(jpi,jpj,jpk) ) 218 225 DO jk = 1, jpkm1 219 e3t_b(:,:,jk) = e3t_n(:,:,jk) + atfp * ( e3t_b(:,:,jk) - 2._wp * e3t_n(:,:,jk) + e3t_a(:,:,jk) )226 ze3t_f(:,:,jk) = pe3t(:,:,jk) + atfp * ( e3t(:,:,jk,kNm1) - 2._wp * pe3t(:,:,jk) + e3t(:,:,jk,kNp1) ) 220 227 END DO 221 228 ! Add volume filter correction: compatibility with tracer advection scheme … … 223 230 zcoef = atfp * rdt * r1_rau0 224 231 225 e3t_b(:,:,1) = e3t_b(:,:,1) - zcoef * ( emp_b(:,:) - emp(:,:) ) * tmask(:,:,1)232 ze3t_f(:,:,1) = ze3t_f(:,:,1) - zcoef * ( emp_b(:,:) - emp(:,:) ) * tmask(:,:,1) 226 233 227 234 IF ( ln_rnf ) THEN … … 231 238 DO ji = 1, jpi 232 239 IF( jk <= nk_rnf(ji,jj) ) THEN 233 e3t_b(ji,jj,jk) = e3t_b(ji,jj,jk) - zcoef * ( - rnf_b(ji,jj) + rnf(ji,jj) ) &234 & * ( e3t_n(ji,jj,jk) / h_rnf(ji,jj) ) * tmask(ji,jj,jk)240 ze3t_f(ji,jj,jk) = ze3t_f(ji,jj,jk) - zcoef * ( - rnf_b(ji,jj) + rnf(ji,jj) ) & 241 & * ( pe3t(ji,jj,jk) / h_rnf(ji,jj) ) * tmask(ji,jj,jk) 235 242 ENDIF 236 243 ENDDO … … 238 245 ENDDO 239 246 ELSE 240 e3t_b(:,:,1) = e3t_b(:,:,1) - zcoef * ( -rnf_b(:,:) + rnf(:,:))*tmask(:,:,1)247 ze3t_f(:,:,1) = ze3t_f(:,:,1) - zcoef * ( -rnf_b(:,:) + rnf(:,:))*tmask(:,:,1) 241 248 ENDIF 242 249 END IF … … 247 254 DO ji = 1, jpi 248 255 IF( misfkt(ji,jj) <=jk .and. jk < misfkb(ji,jj) ) THEN 249 e3t_b(ji,jj,jk) = e3t_b(ji,jj,jk) - zcoef * ( fwfisf_b(ji,jj) - fwfisf(ji,jj) ) &250 & * ( e3t_n(ji,jj,jk) * r1_hisf_tbl(ji,jj) ) * tmask(ji,jj,jk)256 ze3t_f(ji,jj,jk) = ze3t_f(ji,jj,jk) - zcoef * ( fwfisf_b(ji,jj) - fwfisf(ji,jj) ) & 257 & * ( pe3t(ji,jj,jk) * r1_hisf_tbl(ji,jj) ) * tmask(ji,jj,jk) 251 258 ELSEIF ( jk==misfkb(ji,jj) ) THEN 252 e3t_b(ji,jj,jk) = e3t_b(ji,jj,jk) - zcoef * ( fwfisf_b(ji,jj) - fwfisf(ji,jj) ) &253 & * ( e3t_n(ji,jj,jk) * r1_hisf_tbl(ji,jj) ) * ralpha(ji,jj) * tmask(ji,jj,jk)259 ze3t_f(ji,jj,jk) = ze3t_f(ji,jj,jk) - zcoef * ( fwfisf_b(ji,jj) - fwfisf(ji,jj) ) & 260 & * ( pe3t(ji,jj,jk) * r1_hisf_tbl(ji,jj) ) * ralpha(ji,jj) * tmask(ji,jj,jk) 254 261 ENDIF 255 262 END DO … … 258 265 END IF 259 266 ! 267 pe3t(:,:,1:jpkm1) = ze3t_f(:,:,1:jpkm1) ! filtered scale factor at T-points 268 ! 260 269 IF( ln_dynadv_vec ) THEN ! Asselin filter applied on velocity 261 270 ! Before filtered scale factor at (u/v)-points 262 CALL dom_vvl_interpol( e3t_b(:,:,:), e3u_b(:,:,:), 'U' )263 CALL dom_vvl_interpol( e3t_b(:,:,:), e3v_b(:,:,:), 'V' )271 CALL dom_vvl_interpol( pe3t(:,:,:), pe3u(:,:,:), 'U' ) 272 CALL dom_vvl_interpol( pe3t(:,:,:), pe3v(:,:,:), 'V' ) 264 273 DO jk = 1, jpkm1 265 274 DO jj = 1, jpj 266 275 DO ji = 1, jpi 267 zuf = un(ji,jj,jk) + atfp * ( ub(ji,jj,jk) - 2._wp * un(ji,jj,jk) + ua(ji,jj,jk) )268 zvf = vn(ji,jj,jk) + atfp * ( vb(ji,jj,jk) - 2._wp * vn(ji,jj,jk) + va(ji,jj,jk) )276 puu(ji,jj,jk) = puu(ji,jj,jk) + atfp * ( uu(ji,jj,jk,kNm1) - 2._wp * puu(ji,jj,jk) + uu(ji,jj,jk,kNp1) ) 277 pvv(ji,jj,jk) = pvv(ji,jj,jk) + atfp * ( vv(ji,jj,jk,kNm1) - 2._wp * pvv(ji,jj,jk) + vv(ji,jj,jk,kNp1) ) 269 278 ! 270 ub(ji,jj,jk) = zuf ! ub <-- filtered velocity 271 vb(ji,jj,jk) = zvf 272 un(ji,jj,jk) = ua(ji,jj,jk) ! un <-- ua 273 vn(ji,jj,jk) = va(ji,jj,jk) 279 !! TO BE DELETED 280 !!$ ub(ji,jj,jk) = zuf ! ub <-- filtered velocity 281 !!$ vb(ji,jj,jk) = zvf 282 !!$ un(ji,jj,jk) = ua(ji,jj,jk) ! un <-- ua 283 !!$ vn(ji,jj,jk) = va(ji,jj,jk) 284 !! TO BE DELETED 274 285 END DO 275 286 END DO … … 279 290 ! 280 291 ALLOCATE( ze3u_f(jpi,jpj,jpk) , ze3v_f(jpi,jpj,jpk) ) 281 ! Beforefiltered scale factor at (u/v)-points stored in ze3u_f, ze3v_f282 CALL dom_vvl_interpol( e3t_b(:,:,:), ze3u_f, 'U' )283 CALL dom_vvl_interpol( e3t_b(:,:,:), ze3v_f, 'V' )292 ! Now filtered scale factor at (u/v)-points stored in ze3u_f, ze3v_f 293 CALL dom_vvl_interpol( pe3t(:,:,:), ze3u_f, 'U' ) 294 CALL dom_vvl_interpol( pe3t(:,:,:), ze3v_f, 'V' ) 284 295 DO jk = 1, jpkm1 285 296 DO jj = 1, jpj 286 297 DO ji = 1, jpi 287 zue3a = e3u _a(ji,jj,jk) * ua(ji,jj,jk)288 zve3a = e3v _a(ji,jj,jk) * va(ji,jj,jk)289 zue3n = e3u_n(ji,jj,jk) * un(ji,jj,jk)290 zve3n = e3v_n(ji,jj,jk) * vn(ji,jj,jk)291 zue3b = e3u _b(ji,jj,jk) * ub(ji,jj,jk)292 zve3b = e3v _b(ji,jj,jk) * vb(ji,jj,jk)298 zue3a = e3u(ji,jj,jk,kNp1) * uu(ji,jj,jk,kNp1) 299 zve3a = e3v(ji,jj,jk,kNp1) * vv(ji,jj,jk,kNp1) 300 zue3n = pe3u(ji,jj,jk) * puu(ji,jj,jk) 301 zve3n = pe3v(ji,jj,jk) * pvv(ji,jj,jk) 302 zue3b = e3u(ji,jj,jk,kNm1) * uu(ji,jj,jk,kNm1) 303 zve3b = e3v(ji,jj,jk,kNm1) * vv(ji,jj,jk,kNm1) 293 304 ! 294 zuf= ( zue3n + atfp * ( zue3b - 2._wp * zue3n + zue3a ) ) / ze3u_f(ji,jj,jk)295 zvf= ( zve3n + atfp * ( zve3b - 2._wp * zve3n + zve3a ) ) / ze3v_f(ji,jj,jk)305 puu(ji,jj,jk) = ( zue3n + atfp * ( zue3b - 2._wp * zue3n + zue3a ) ) / ze3u_f(ji,jj,jk) 306 pvv(ji,jj,jk) = ( zve3n + atfp * ( zve3b - 2._wp * zve3n + zve3a ) ) / ze3v_f(ji,jj,jk) 296 307 ! 297 ub(ji,jj,jk) = zuf ! ub <-- filtered velocity 298 vb(ji,jj,jk) = zvf 299 un(ji,jj,jk) = ua(ji,jj,jk) ! un <-- ua 300 vn(ji,jj,jk) = va(ji,jj,jk) 308 !! TO BE DELETED 309 !!$ ub(ji,jj,jk) = zuf ! ub <-- filtered velocity 310 !!$ vb(ji,jj,jk) = zvf 311 !!$ un(ji,jj,jk) = ua(ji,jj,jk) ! un <-- ua 312 !!$ vn(ji,jj,jk) = va(ji,jj,jk) 313 !! TO BE DELETED 301 314 END DO 302 315 END DO 303 316 END DO 304 e3u_b(:,:,1:jpkm1) = ze3u_f(:,:,1:jpkm1) ! e3u_b <-- filtered scale factor305 e3v_b(:,:,1:jpkm1) = ze3v_f(:,:,1:jpkm1)317 pe3u(:,:,1:jpkm1) = ze3u_f(:,:,1:jpkm1) 318 pe3v(:,:,1:jpkm1) = ze3v_f(:,:,1:jpkm1) 306 319 ! 307 320 DEALLOCATE( ze3u_f , ze3v_f ) 308 321 ENDIF 309 322 ! 323 DEALLOCATE( ze3t_f ) 310 324 ENDIF 311 325 ! 312 326 IF( ln_dynspg_ts .AND. ln_bt_fw ) THEN 313 ! Revert "before" velocities to time split estimate327 ! Revert filtered "now" velocities to time split estimate 314 328 ! Doing it here also means that asselin filter contribution is removed 315 zue(:,:) = e3u_b(:,:,1) * ub(:,:,1) * umask(:,:,1)316 zve(:,:) = e3v_b(:,:,1) * vb(:,:,1) * vmask(:,:,1)329 zue(:,:) = pe3u(:,:,1) * puu(:,:,1) * umask(:,:,1) 330 zve(:,:) = pe3v(:,:,1) * pvv(:,:,1) * vmask(:,:,1) 317 331 DO jk = 2, jpkm1 318 zue(:,:) = zue(:,:) + e3u_b(:,:,jk) * ub(:,:,jk) * umask(:,:,jk)319 zve(:,:) = zve(:,:) + e3v_b(:,:,jk) * vb(:,:,jk) * vmask(:,:,jk)332 zue(:,:) = zue(:,:) + pe3u(:,:,jk) * puu(:,:,jk) * umask(:,:,jk) 333 zve(:,:) = zve(:,:) + pe3v(:,:,jk) * pvv(:,:,jk) * vmask(:,:,jk) 320 334 END DO 321 335 DO jk = 1, jpkm1 322 ub(:,:,jk) = ub(:,:,jk) - (zue(:,:) * r1_hu_n(:,:) - un_b(:,:)) * umask(:,:,jk)323 vb(:,:,jk) = vb(:,:,jk) - (zve(:,:) * r1_hv_n(:,:) - vn_b(:,:)) * vmask(:,:,jk)336 puu(:,:,jk) = puu(:,:,jk) - (zue(:,:) * r1_hu_n(:,:) - un_b(:,:)) * umask(:,:,jk) 337 pvv(:,:,jk) = pvv(:,:,jk) - (zve(:,:) * r1_hv_n(:,:) - vn_b(:,:)) * vmask(:,:,jk) 324 338 END DO 325 339 ENDIF … … 331 345 ! integration 332 346 ! 347 ! DS IMMERSE :: This is very confusing as it stands. But should 348 ! hopefully be simpler when we do the time-level swapping for the 349 ! external mode solution. 333 350 ! 334 351 IF(.NOT.ln_linssh ) THEN 335 hu_b(:,:) = e3u_b(:,:,1) * umask(:,:,1)336 hv_b(:,:) = e3v_b(:,:,1) * vmask(:,:,1)352 hu_b(:,:) = pe3u(:,:,1) * umask(:,:,1) 353 hv_b(:,:) = pe3v(:,:,1) * vmask(:,:,1) 337 354 DO jk = 2, jpkm1 338 hu_b(:,:) = hu_b(:,:) + e3u_b(:,:,jk) * umask(:,:,jk)339 hv_b(:,:) = hv_b(:,:) + e3v_b(:,:,jk) * vmask(:,:,jk)355 hu_b(:,:) = hu_b(:,:) + pe3u(:,:,jk) * umask(:,:,jk) 356 hv_b(:,:) = hv_b(:,:) + pe3v(:,:,jk) * vmask(:,:,jk) 340 357 END DO 341 358 r1_hu_b(:,:) = ssumask(:,:) / ( hu_b(:,:) + 1._wp - ssumask(:,:) ) … … 343 360 ENDIF 344 361 ! 345 un_b(:,:) = e3u _a(:,:,1) * un(:,:,1) * umask(:,:,1)346 ub_b(:,:) = e3u_b(:,:,1) * ub(:,:,1) * umask(:,:,1)347 vn_b(:,:) = e3v _a(:,:,1) * vn(:,:,1) * vmask(:,:,1)348 vb_b(:,:) = e3v_b(:,:,1) * vb(:,:,1) * vmask(:,:,1)362 un_b(:,:) = e3u(:,:,1,kNp1) * uu(:,:,1,kNp1) * umask(:,:,1) 363 ub_b(:,:) = pe3u(:,:,1) * puu(:,:,1) * umask(:,:,1) 364 vn_b(:,:) = e3v(:,:,1,kNp1) * vv(:,:,1,kNp1) * vmask(:,:,1) 365 vb_b(:,:) = pe3v(:,:,1) * pvv(:,:,1) * vmask(:,:,1) 349 366 DO jk = 2, jpkm1 350 un_b(:,:) = un_b(:,:) + e3u _a(:,:,jk) * un(:,:,jk) * umask(:,:,jk)351 ub_b(:,:) = ub_b(:,:) + e3u_b(:,:,jk) * ub(:,:,jk) * umask(:,:,jk)352 vn_b(:,:) = vn_b(:,:) + e3v _a(:,:,jk) * vn(:,:,jk) * vmask(:,:,jk)353 vb_b(:,:) = vb_b(:,:) + e3v_b(:,:,jk) * vb(:,:,jk) * vmask(:,:,jk)367 un_b(:,:) = un_b(:,:) + e3u(:,:,jk,kNp1) * uu(:,:,jk,kNp1) * umask(:,:,jk) 368 ub_b(:,:) = ub_b(:,:) + pe3u(:,:,jk) * puu(:,:,jk) * umask(:,:,jk) 369 vn_b(:,:) = vn_b(:,:) + e3v(:,:,jk,kNp1) * vv(:,:,jk,kNp1) * vmask(:,:,jk) 370 vb_b(:,:) = vb_b(:,:) + pe3v(:,:,jk) * pvv(:,:,jk) * vmask(:,:,jk) 354 371 END DO 355 372 un_b(:,:) = un_b(:,:) * r1_hu_a(:,:) … … 363 380 ENDIF 364 381 IF( l_trddyn ) THEN ! 3D output: asselin filter trends on momentum 365 zua(:,:,:) = ( ub(:,:,:) - zua(:,:,:) ) * z1_2dt366 zva(:,:,:) = ( vb(:,:,:) - zva(:,:,:) ) * z1_2dt382 zua(:,:,:) = ( puu(:,:,:) - zua(:,:,:) ) * z1_2dt 383 zva(:,:,:) = ( pvv(:,:,:) - zva(:,:,:) ) * z1_2dt 367 384 CALL trd_dyn( zua, zva, jpdyn_atf, kt ) 368 385 ENDIF 369 386 ! 370 IF(ln_ctl) CALL prt_ctl( tab3d_1=u n, clinfo1=' nxt - Un: ', mask1=umask, &371 & tab3d_2=v n, clinfo2=' Vn: ' , mask2=vmask )387 IF(ln_ctl) CALL prt_ctl( tab3d_1=uu(:,:,:,kNp1), clinfo1=' nxt - uu(:,:,:,kNp1): ', mask1=umask, & 388 & tab3d_2=vv(:,:,:,kNp1), clinfo2=' vv(:,:,:,kNp1): ' , mask2=vmask ) 372 389 ! 373 390 IF( ln_dynspg_ts ) DEALLOCATE( zue, zve ) -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/nemogcm.F90
r10588 r10743 401 401 CALL nemo_alloc() 402 402 403 ! Initialise time level indices 404 Nm1 = 1; Nnn = 2; Np1 = 3; Nrhs = Np1 405 Nm1_2lev = 1; Nnn_2lev = 2 406 407 ! Initialisation of temporary pointers (to be deleted after development finished) 408 CALL update_pointers() 409 403 410 ! !-------------------------------! 404 411 ! ! NEMO general initialization ! -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/oce.F90
r10425 r10743 17 17 PUBLIC oce_alloc ! routine called by nemo_init in nemogcm.F90 18 18 19 !! dynamics and tracer fields ! before ! now ! after ! the after trends becomes the fields 20 !! -------------------------- ! fields ! fields ! trends ! only after tra_zdf and dyn_spg 21 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: ub , un , ua !: i-horizontal velocity [m/s] 22 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: vb , vn , va !: j-horizontal velocity [m/s] 19 !! dynamics and tracer fields NOTE THAT "TARGET" ATTRIBUTE CAN BE REMOVED AFTER IMMERSE DEVELOPMENT FINISHED 20 !! -------------------------- 21 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:), TARGET :: uu , vv !: horizontal velocities [m/s] 23 22 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: wn !: vertical velocity [m/s] 24 23 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: wi !: vertical vel. (adaptive-implicit) [m/s] … … 69 68 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: fraqsr_1lev !: fraction of solar net radiation absorbed in the first ocean level [-] 70 69 70 !! TEMPORARY POINTERS FOR DEVELOPMENT ONLY 71 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: ub , un , ua !: i-horizontal velocity [m/s] 72 REAL(wp), PUBLIC, POINTER, SAVE, DIMENSION(:,:,:) :: vb , vn , va !: j-horizontal velocity [m/s] 73 71 74 !!---------------------------------------------------------------------- 72 75 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 84 87 ! 85 88 ierr(:) = 0 86 ALLOCATE( ub (jpi,jpj,jpk) , un (jpi,jpj,jpk) , ua(jpi,jpj,jpk) , & 87 & vb (jpi,jpj,jpk) , vn (jpi,jpj,jpk) , va(jpi,jpj,jpk) , & 89 ALLOCATE( uu (jpi,jpj,jpk, jpt) , vv (jpi,jpj,jpk,jpt) , & 88 90 & wn (jpi,jpj,jpk) , hdivn(jpi,jpj,jpk) , & 89 91 & tsb (jpi,jpj,jpk,jpts) , tsn (jpi,jpj,jpk,jpts) , tsa(jpi,jpj,jpk,jpts) , & -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/par_oce.F90
r10068 r10743 51 51 INTEGER, PUBLIC :: jpj ! !: second dimension 52 52 INTEGER, PUBLIC :: jpk ! = jpkglo !: third dimension 53 INTEGER, PUBLIC, PARAMETER :: jpt = 3 !: fourth dimension (time level) 53 54 INTEGER, PUBLIC :: jpim1 ! = jpi-1 !: inner domain indices 54 55 INTEGER, PUBLIC :: jpjm1 ! = jpj-1 !: - - - -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/step.F90
r10364 r10743 44 44 45 45 PUBLIC stp ! called by nemogcm.F90 46 PUBLIC update_pointers ! called by nemo_init 46 47 47 48 !!---------------------------------------------------------------------- … … 276 277 !!jc2: dynnxt must be the latest call. e3t_b are indeed updated in that routine 277 278 CALL tra_nxt ( kstp ) ! finalize (bcs) tracer fields at next time step and swap 278 CALL dyn_nxt ( kstp ) ! finalize (bcs) velocities at next time step and swap (always called after tra_nxt)279 CALL dyn_nxt ( kstp, Nm1, Np1, uu(:,:,:,Nnn), vv(:,:,:,Nnn), e3t(:,:,:,Nnn), e3u(:,:,:,Nnn), e3v(:,:,:,Nnn) ) ! 279 280 CALL ssh_swp ( kstp ) ! swap of sea surface height 280 IF(.NOT.ln_linssh) CALL dom_vvl_sf_swp( kstp ) ! swap of vertical scale factors 281 ! 282 ! Swap time levels 283 Nrhs = Nm1 284 Nm1 = Nnn 285 Nnn = Np1 286 Np1 = Nrhs 287 ! 288 ! Update temporary pointers 289 CALL update_pointers() 290 ! 291 ! Note that 2-time-level indices don't need to be swapped because both "before" and "now" fields are derived in dom_vvl_sf_swp 292 IF(.NOT.ln_linssh) CALL dom_vvl_sf_swp( kstp, Nm1, Nnn, Nm1_2lev, Nnn_2lev ) ! interpolate vertical scale factors for Nnn time level 281 293 ! 282 294 IF( ln_diahsb ) CALL dia_hsb ( kstp ) ! - ML - global conservation diagnostics … … 329 341 END SUBROUTINE stp 330 342 343 SUBROUTINE update_pointers 344 !!---------------------------------------------------------------------- 345 !! *** ROUTINE update_pointers *** 346 !! 347 !! ** Purpose : Associate temporary pointer arrays. 348 !! For IMMERSE development phase only - to be deleted 349 !! 350 !! ** Method : 351 !!---------------------------------------------------------------------- 352 353 ub => uu(:,:,:,Nm1); un => uu(:,:,:,Nnn); ua => uu(:,:,:,Np1) 354 vb => vv(:,:,:,Nm1); vn => vv(:,:,:,Nnn); va => vv(:,:,:,Np1) 355 356 e3t_b => e3t(:,:,:,Nm1); e3t_n => e3t(:,:,:,Nnn); e3t_a => e3t(:,:,:,Np1) 357 e3u_b => e3u(:,:,:,Nm1); e3u_n => e3u(:,:,:,Nnn); e3u_a => e3u(:,:,:,Np1) 358 e3v_b => e3v(:,:,:,Nm1); e3v_n => e3v(:,:,:,Nnn); e3v_a => e3v(:,:,:,Np1) 359 360 e3f_n => e3f(:,:,:) 361 362 e3w_b => e3w (:,:,:,Nm1_2lev); e3w_n => e3w (:,:,:,Nnn_2lev) 363 e3uw_b => e3uw(:,:,:,Nm1_2lev); e3uw_n => e3uw(:,:,:,Nnn_2lev) 364 e3vw_b => e3vw(:,:,:,Nm1_2lev); e3vw_n => e3vw(:,:,:,Nnn_2lev) 365 366 END SUBROUTINE update_pointers 367 331 368 !!====================================================================== 332 369 END MODULE step
Note: See TracChangeset
for help on using the changeset viewer.