Changeset 11057 for NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps_rewrite_time_filterswap/src/OCE
- Timestamp:
- 2019-05-24T17:36:26+02:00 (5 years ago)
- Location:
- NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps_rewrite_time_filterswap/src/OCE
- Files:
-
- 4 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps_rewrite_time_filterswap/src/OCE/C1D/step_c1d.F90
r11001 r11057 107 107 IF(.NOT.ln_linssh)CALL tra_adv( kstp, Nbb, Nnn, ts, Nrhs ) ! horizontal & vertical advection 108 108 IF( ln_zdfosm ) CALL tra_osm( kstp, Nnn , ts, Nrhs ) ! OSMOSIS non-local tracer fluxes 109 CALL tra_zdf( kstp, Nbb, Nnn, Nrhs, ts, Naa ) ! vertical mixing109 CALL tra_zdf( kstp, Nbb, Nnn, Nrhs, ts, Naa ) ! vertical mixing 110 110 CALL eos( ts(:,:,:,:,Nnn), rhd, rhop, gdept_0(:,:,:) ) ! now potential density for zdfmxl 111 IF( ln_zdfnpc ) CALL tra_npc( kstp, Nnn, Nrhs, ts, Naa ) ! applied non penetrative convective adjustment on (t,s)112 CALL tra_ nxt( kstp, Nbb, Nnn, Nrhs, Naa ) ! tracer fields at next time step111 IF( ln_zdfnpc ) CALL tra_npc( kstp, Nnn, Nrhs, ts, Naa ) ! applied non penetrative convective adjustment on (t,s) 112 CALL tra_atf( kstp, Nbb, Nnn, Nrhs, Naa, ts ) ! time filtering of "now" tracer fields 113 113 114 114 … … 124 124 IF( ln_zdfosm ) CALL dyn_osm ( kstp, Nnn , uu, vv, Nrhs ) ! OSMOSIS non-local velocity fluxes 125 125 CALL dyn_zdf ( kstp, Nbb, Nnn, Nrhs, uu, vv, Naa ) ! vertical diffusion 126 CALL dyn_nxt ( kstp, Nbb, Nnn, Naa ) ! lateral velocity at next time step 127 IF(.NOT.ln_linssh)CALL ssh_swp ( kstp, Nbb, Nnn, Naa ) ! swap of sea surface height 128 129 IF(.NOT.ln_linssh)CALL dom_vvl_sf_swp( kstp, Nbb, Nnn, Naa ) ! swap of vertical scale factors 126 CALL dyn_atf ( kstp, Nbb, Nnn, Naa , uu, vv, e3t, e3u, e3v ) ! time filtering of "now" fields 127 IF(.NOT.ln_linssh)CALL ssh_atf ( kstp, Nbb, Nnn, Naa , ssh ) ! time filtering of "now" sea surface height 128 ! 129 ! Swap time levels 130 Nrhs = Nbb 131 Nbb = Nnn 132 Nnn = Naa 133 Naa = Nrhs 134 ! 135 IF(.NOT.ln_linssh)CALL dom_vvl_sf_swp( kstp, Nbb, Nnn, Naa ) ! swap of vertical scale factors 130 136 131 137 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps_rewrite_time_filterswap/src/OCE/DYN/sshwzv.F90
r11053 r11057 13 13 !!---------------------------------------------------------------------- 14 14 !! ssh_nxt : after ssh 15 !! ssh_ swp: filter ans swap the ssh arrays15 !! ssh_atf : filter ans swap the ssh arrays 16 16 !! wzv : compute now vertical velocity 17 17 !!---------------------------------------------------------------------- … … 43 43 PUBLIC wzv ! called by step.F90 44 44 PUBLIC wAimp ! called by step.F90 45 PUBLIC ssh_ swp! called by step.F9045 PUBLIC ssh_atf ! called by step.F90 46 46 47 47 !! * Substitutions … … 218 218 219 219 220 SUBROUTINE ssh_swp( kt, Kbb, Kmm, Kaa ) 221 !!---------------------------------------------------------------------- 222 !! *** ROUTINE ssh_nxt *** 220 SUBROUTINE ssh_atf( kt, Kbb, Kmm, Kaa, pssh ) 221 !!---------------------------------------------------------------------- 222 !! *** ROUTINE ssh_atf *** 223 !! 224 !! !!!!!!!!!!!! REWRITE HEADER COMMENTS !!!!!!!!!!!! 223 225 !! 224 226 !! ** Purpose : achieve the sea surface height time stepping by … … 237 239 !! Reference : Leclair, M., and G. Madec, 2009, Ocean Modelling. 238 240 !!---------------------------------------------------------------------- 239 INTEGER, INTENT(in) :: kt ! ocean time-step index 240 INTEGER, INTENT(in) :: Kbb, Kmm, Kaa ! ocean time-step index 241 INTEGER , INTENT(in ) :: kt ! ocean time-step index 242 INTEGER , INTENT(in ) :: Kbb, Kmm, Kaa ! ocean time level indices 243 REAL(wp), DIMENSION(jpi,jpj,jpt), INTENT(inout) :: pssh ! SSH field 241 244 ! 242 245 REAL(wp) :: zcoef ! local scalar 243 246 !!---------------------------------------------------------------------- 244 247 ! 245 IF( ln_timing ) CALL timing_start('ssh_ swp')248 IF( ln_timing ) CALL timing_start('ssh_atf') 246 249 ! 247 250 IF( kt == nit000 ) THEN 248 251 IF(lwp) WRITE(numout,*) 249 IF(lwp) WRITE(numout,*) 'ssh_ swp : Asselin time filter and swapof sea surface height'252 IF(lwp) WRITE(numout,*) 'ssh_atf : Asselin time filter of sea surface height' 250 253 IF(lwp) WRITE(numout,*) '~~~~~~~ ' 251 254 ENDIF 252 255 ! !== Euler time-stepping: no filter, just swap ==! 253 IF ( neuler == 0 .AND. kt == nit000 ) THEN 254 ssh(:,:,Kmm) = ssh(:,:,Kaa) ! now <-- after (before already = now) 255 ! 256 ELSE !== Leap-Frog time-stepping: Asselin filter + swap ==! 257 ! ! before <-- now filtered 258 ssh(:,:,Kbb) = ssh(:,:,Kmm) + atfp * ( ssh(:,:,Kbb) - 2 * ssh(:,:,Kmm) + ssh(:,:,Kaa) ) 259 IF( .NOT.ln_linssh ) THEN ! before <-- with forcing removed 256 IF ( .NOT.( neuler == 0 .AND. kt == nit000 ) ) THEN ! Only do time filtering for leapfrog timesteps 257 ! ! filtered "now" field 258 ssh(:,:,Kmm) = ssh(:,:,Kmm) + atfp * ( ssh(:,:,Kbb) - 2 * ssh(:,:,Kmm) + ssh(:,:,Kaa) ) 259 IF( .NOT.ln_linssh ) THEN ! "now" <-- with forcing removed 260 260 zcoef = atfp * rdt * r1_rau0 261 ssh(:,:,K bb) = ssh(:,:,Kbb) - zcoef * ( emp_b(:,:) - emp (:,:) &261 ssh(:,:,Kmm) = ssh(:,:,Kmm) - zcoef * ( emp_b(:,:) - emp (:,:) & 262 262 & - rnf_b(:,:) + rnf (:,:) & 263 263 & + fwfisf_b(:,:) - fwfisf(:,:) ) * ssmask(:,:) 264 264 ENDIF 265 ssh(:,:,Kmm) = ssh(:,:,Kaa) ! now <-- after 266 ENDIF 267 ! 268 IF(ln_ctl) CALL prt_ctl( tab2d_1=ssh(:,:,Kbb), clinfo1=' ssh(:,:,Kbb) - : ', mask1=tmask ) 269 ! 270 IF( ln_timing ) CALL timing_stop('ssh_swp') 271 ! 272 END SUBROUTINE ssh_swp 265 ENDIF 266 ! 267 IF(ln_ctl) CALL prt_ctl( tab2d_1=ssh(:,:,Kmm), clinfo1=' ssh(:,:,Kmm) - : ', mask1=tmask ) 268 ! 269 IF( ln_timing ) CALL timing_stop('ssh_atf') 270 ! 271 END SUBROUTINE ssh_atf 273 272 274 273 SUBROUTINE wAimp( kt, Kmm ) -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps_rewrite_time_filterswap/src/OCE/TRA/traatf.F90
r11056 r11057 1 MODULE tra nxt1 MODULE traatf 2 2 !!====================================================================== 3 !! *** MODULE tra nxt***3 !! *** MODULE traatf *** 4 4 !! Ocean active tracers: time stepping on temperature and salinity 5 5 !!====================================================================== … … 20 20 21 21 !!---------------------------------------------------------------------- 22 !! tra_ nxt: time stepping on tracers23 !! tra_ nxt_fix : time stepping on tracers : fixed volume case24 !! tra_ nxt_vvl : time stepping on tracers : variable volume case22 !! tra_atf : time stepping on tracers 23 !! tra_atf_fix : time stepping on tracers : fixed volume case 24 !! tra_atf_vvl : time stepping on tracers : variable volume case 25 25 !!---------------------------------------------------------------------- 26 26 USE oce ! ocean dynamics and tracers variables … … 51 51 PRIVATE 52 52 53 PUBLIC tra_ nxt! routine called by step.F9054 PUBLIC tra_ nxt_fix ! to be used in trcnxt55 PUBLIC tra_ nxt_vvl ! to be used in trcnxt53 PUBLIC tra_atf ! routine called by step.F90 54 PUBLIC tra_atf_fix ! to be used in trcnxt 55 PUBLIC tra_atf_vvl ! to be used in trcnxt 56 56 57 57 !! * Substitutions … … 64 64 CONTAINS 65 65 66 SUBROUTINE tra_nxt( kt, Kbb, Kmm, Krhs, Kaa ) 67 !!---------------------------------------------------------------------- 68 !! *** ROUTINE tranxt *** 66 SUBROUTINE tra_atf( kt, Kbb, Kmm, Kaa, pts ) 67 !!---------------------------------------------------------------------- 68 !! *** ROUTINE traatf *** 69 !! 70 !! !!!!!!!!!!!!!!!!! REWRITE HEADER COMMENTS !!!!!!!!!!!!!!! 69 71 !! 70 72 !! ** Purpose : Apply the boundary condition on the after temperature … … 86 88 !! ** Action : - ts(Kbb) & ts(Kmm) ready for the next time step 87 89 !!---------------------------------------------------------------------- 88 INTEGER, INTENT(in) :: kt ! ocean time-step index 89 INTEGER, INTENT(in) :: Kbb, Kmm, Krhs, Kaa ! time level indices 90 INTEGER , INTENT(in ) :: kt ! ocean time-step index 91 INTEGER , INTENT(in ) :: Kbb, Kmm, Kaa ! time level indices 92 REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts ! active tracers 90 93 !! 91 94 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 94 97 !!---------------------------------------------------------------------- 95 98 ! 96 IF( ln_timing ) CALL timing_start( 'tra_ nxt')99 IF( ln_timing ) CALL timing_start( 'tra_atf') 97 100 ! 98 101 IF( kt == nit000 ) THEN 99 102 IF(lwp) WRITE(numout,*) 100 IF(lwp) WRITE(numout,*) 'tra_ nxt: achieve the time stepping by Asselin filter and array swap'103 IF(lwp) WRITE(numout,*) 'tra_atf : achieve the time stepping by Asselin filter and array swap' 101 104 IF(lwp) WRITE(numout,*) '~~~~~~~' 102 105 ENDIF … … 108 111 #endif 109 112 ! ! local domain boundaries (T-point, unchanged sign) 110 CALL lbc_lnk_multi( 'tranxt', ts(:,:,:,jp_tem,Krhs), 'T', 1., ts(:,:,:,jp_sal,Krhs), 'T', 1. ) 111 ! 112 !! IMMERSE development : Following the general pattern for the new code we want to pass in the 113 !! velocities to bdy_dyn as arguments so here we use "ts" even 114 !! though we haven't converted the tracer names in the rest of tranxt.F90 115 !! because it will be completely rewritten. DS. 116 IF( ln_bdy ) CALL bdy_tra( kt, Kbb, ts, Kaa ) ! BDY open boundaries 113 CALL lbc_lnk_multi( 'traatf', pts(:,:,:,jp_tem,Kaa), 'T', 1., pts(:,:,:,jp_sal,Kaa), 'T', 1. ) 114 ! 115 IF( ln_bdy ) CALL bdy_tra( kt, Kbb, pts, Kaa ) ! BDY open boundaries 117 116 118 117 ! set time step size (Euler/Leapfrog) … … 127 126 ztrds(:,:,jpk) = 0._wp 128 127 IF( ln_traldf_iso ) THEN ! diagnose the "pure" Kz diffusive trend 129 CALL trd_tra( kt, Kmm, K rhs, 'TRA', jp_tem, jptra_zdfp, ztrdt )130 CALL trd_tra( kt, Kmm, K rhs, 'TRA', jp_sal, jptra_zdfp, ztrds )128 CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_zdfp, ztrdt ) 129 CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_sal, jptra_zdfp, ztrds ) 131 130 ENDIF 132 131 ! total trend for the non-time-filtered variables. 133 132 zfact = 1.0 / rdt 134 ! G Nurser 23 Mar 2017. Recalculate trend as Delta(e3t*T)/e3tn; e3tn cancel from ts(Kmm) terms133 ! G Nurser 23 Mar 2017. Recalculate trend as Delta(e3t*T)/e3tn; e3tn cancel from pts(Kmm) terms 135 134 DO jk = 1, jpkm1 136 ztrdt(:,:,jk) = ( ts(:,:,jk,jp_tem,Krhs)*e3t(:,:,jk,Krhs) / e3t(:,:,jk,Kmm) -ts(:,:,jk,jp_tem,Kmm)) * zfact137 ztrds(:,:,jk) = ( ts(:,:,jk,jp_sal,Krhs)*e3t(:,:,jk,Krhs) / e3t(:,:,jk,Kmm) -ts(:,:,jk,jp_sal,Kmm)) * zfact138 END DO 139 CALL trd_tra( kt, Kmm, K rhs, 'TRA', jp_tem, jptra_tot, ztrdt )140 CALL trd_tra( kt, Kmm, K rhs, 'TRA', jp_sal, jptra_tot, ztrds )135 ztrdt(:,:,jk) = ( pts(:,:,jk,jp_tem,Kaa)*e3t(:,:,jk,Kaa) / e3t(:,:,jk,Kmm) - pts(:,:,jk,jp_tem,Kmm)) * zfact 136 ztrds(:,:,jk) = ( pts(:,:,jk,jp_sal,Kaa)*e3t(:,:,jk,Kaa) / e3t(:,:,jk,Kmm) - pts(:,:,jk,jp_sal,Kmm)) * zfact 137 END DO 138 CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_tot, ztrdt ) 139 CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_sal, jptra_tot, ztrds ) 141 140 IF( ln_linssh ) THEN ! linear sea surface height only 142 141 ! Store now fields before applying the Asselin filter 143 142 ! in order to calculate Asselin filter trend later. 144 ztrdt(:,:,:) = ts(:,:,:,jp_tem,Kmm)145 ztrds(:,:,:) = ts(:,:,:,jp_sal,Kmm)143 ztrdt(:,:,:) = pts(:,:,:,jp_tem,Kmm) 144 ztrds(:,:,:) = pts(:,:,:,jp_sal,Kmm) 146 145 ENDIF 147 146 ENDIF … … 150 149 DO jn = 1, jpts 151 150 DO jk = 1, jpkm1 152 ts(:,:,jk,jn,Kmm) = ts(:,:,jk,jn,Krhs)151 pts(:,:,jk,jn,Kmm) = pts(:,:,jk,jn,Kaa) 153 152 END DO 154 153 END DO 155 154 IF (l_trdtra .AND. .NOT. ln_linssh ) THEN ! Zero Asselin filter contribution must be explicitly written out since for vvl 156 ! ! Asselin filter is output by tra_ nxt_vvl that is not called on this time step155 ! ! Asselin filter is output by tra_atf_vvl that is not called on this time step 157 156 ztrdt(:,:,:) = 0._wp 158 157 ztrds(:,:,:) = 0._wp 159 CALL trd_tra( kt, Kmm, K rhs, 'TRA', jp_tem, jptra_atf, ztrdt )160 CALL trd_tra( kt, Kmm, K rhs, 'TRA', jp_sal, jptra_atf, ztrds )158 CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_atf, ztrdt ) 159 CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_sal, jptra_atf, ztrds ) 161 160 END IF 162 161 ! 163 162 ELSE ! Leap-Frog + Asselin filter time stepping 164 163 ! 165 IF( ln_linssh ) THEN ; CALL tra_nxt_fix( kt, Kmm, nit000, 'TRA', & 166 & ts(:,:,:,:,Kbb), ts(:,:,:,:,Kmm), ts(:,:,:,:,Krhs), jpts ) ! linear free surface 167 ELSE ; CALL tra_nxt_vvl( kt, Kbb, Kmm, Krhs, nit000, rdt, 'TRA', & 168 & ts(:,:,:,:,Kbb), ts(:,:,:,:,Kmm), ts(:,:,:,:,Krhs), & 169 & sbc_tsc , sbc_tsc_b , jpts ) ! non-linear free surface 170 ENDIF 171 ! 172 CALL lbc_lnk_multi( 'tranxt', ts(:,:,:,jp_tem,Kbb) , 'T', 1., ts(:,:,:,jp_sal,Kbb) , 'T', 1., & 173 & ts(:,:,:,jp_tem,Kmm) , 'T', 1., ts(:,:,:,jp_sal,Kmm) , 'T', 1., & 174 & ts(:,:,:,jp_tem,Krhs), 'T', 1., ts(:,:,:,jp_sal,Krhs), 'T', 1. ) 164 IF( ln_linssh ) THEN ; CALL tra_atf_fix( kt, Kbb, Kmm, Kaa, nit000, 'TRA', pts, jpts ) ! linear free surface 165 ELSE ; CALL tra_atf_vvl( kt, Kbb, Kmm, Kaa, nit000, rdt, 'TRA', pts, sbc_tsc, sbc_tsc_b, jpts ) ! non-linear free surface 166 ENDIF 167 ! 168 CALL lbc_lnk_multi( 'traatf', pts(:,:,:,jp_tem,Kbb) , 'T', 1., pts(:,:,:,jp_sal,Kbb) , 'T', 1., & 169 & pts(:,:,:,jp_tem,Kmm) , 'T', 1., pts(:,:,:,jp_sal,Kmm) , 'T', 1., & 170 & pts(:,:,:,jp_tem,Kaa), 'T', 1., pts(:,:,:,jp_sal,Kaa), 'T', 1. ) 175 171 ! 176 172 ENDIF … … 179 175 zfact = 1._wp / r2dt 180 176 DO jk = 1, jpkm1 181 ztrdt(:,:,jk) = ( ts(:,:,jk,jp_tem,Kbb) - ztrdt(:,:,jk) ) * zfact182 ztrds(:,:,jk) = ( ts(:,:,jk,jp_sal,Kbb) - ztrds(:,:,jk) ) * zfact183 END DO 184 CALL trd_tra( kt, Kmm, K rhs, 'TRA', jp_tem, jptra_atf, ztrdt )185 CALL trd_tra( kt, Kmm, K rhs, 'TRA', jp_sal, jptra_atf, ztrds )177 ztrdt(:,:,jk) = ( pts(:,:,jk,jp_tem,Kbb) - ztrdt(:,:,jk) ) * zfact 178 ztrds(:,:,jk) = ( pts(:,:,jk,jp_sal,Kbb) - ztrds(:,:,jk) ) * zfact 179 END DO 180 CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_tem, jptra_atf, ztrdt ) 181 CALL trd_tra( kt, Kmm, Kaa, 'TRA', jp_sal, jptra_atf, ztrds ) 186 182 END IF 187 183 IF( l_trdtra ) DEALLOCATE( ztrdt , ztrds ) 188 184 ! 189 185 ! ! control print 190 IF(ln_ctl) CALL prt_ctl( tab3d_1= ts(:,:,:,jp_tem,Kmm), clinfo1=' nxt - Tn: ', mask1=tmask, &191 & tab3d_2= ts(:,:,:,jp_sal,Kmm), clinfo2= ' Sn: ', mask2=tmask )192 ! 193 IF( ln_timing ) CALL timing_stop('tra_ nxt')194 ! 195 END SUBROUTINE tra_ nxt196 197 198 SUBROUTINE tra_ nxt_fix( kt, Kmm, kit000, cdtype, ptb, ptn, pta, kjpt )199 !!---------------------------------------------------------------------- 200 !! *** ROUTINE tra_ nxt_fix ***186 IF(ln_ctl) CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Kmm), clinfo1=' nxt - Tn: ', mask1=tmask, & 187 & tab3d_2=pts(:,:,:,jp_sal,Kmm), clinfo2= ' Sn: ', mask2=tmask ) 188 ! 189 IF( ln_timing ) CALL timing_stop('tra_atf') 190 ! 191 END SUBROUTINE tra_atf 192 193 194 SUBROUTINE tra_atf_fix( kt, kit000, Kbb, Kmm, Kaa, cdtype, pt, kjpt ) 195 !!---------------------------------------------------------------------- 196 !! *** ROUTINE tra_atf_fix *** 201 197 !! 202 198 !! ** Purpose : fixed volume: apply the Asselin time filter and … … 208 204 !! ** Action : - ptb & ptn ready for the next time step 209 205 !!---------------------------------------------------------------------- 210 INTEGER , INTENT(in ) :: kt ! ocean time-step index 211 INTEGER , INTENT(in ) :: Kmm ! time level index 212 INTEGER , INTENT(in ) :: kit000 ! first time step index 213 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 214 INTEGER , INTENT(in ) :: kjpt ! number of tracers 215 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: ptb ! before tracer fields 216 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: ptn ! now tracer fields 217 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 206 INTEGER , INTENT(in ) :: kt ! ocean time-step index 207 INTEGER , INTENT(in ) :: Kbb, Kmm, Kaa ! time level indices 208 INTEGER , INTENT(in ) :: kit000 ! first time step index 209 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 210 INTEGER , INTENT(in ) :: kjpt ! number of tracers 211 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracer fields 218 212 ! 219 213 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 223 217 IF( kt == kit000 ) THEN 224 218 IF(lwp) WRITE(numout,*) 225 IF(lwp) WRITE(numout,*) 'tra_ nxt_fix : time stepping', cdtype219 IF(lwp) WRITE(numout,*) 'tra_atf_fix : time stepping', cdtype 226 220 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 227 221 ENDIF … … 232 226 DO jj = 2, jpjm1 233 227 DO ji = fs_2, fs_jpim1 234 ztn = ptn(ji,jj,jk,jn) 235 ztd = pta(ji,jj,jk,jn) - 2._wp * ztn + ptb(ji,jj,jk,jn) ! time laplacian on tracers 236 ! 237 ptb(ji,jj,jk,jn) = ztn + atfp * ztd ! ptb <-- filtered ptn 238 ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn) ! ptn <-- pta 228 ztn = pt(ji,jj,jk,jn,Kmm) 229 ztd = pt(ji,jj,jk,jn,Kaa) - 2._wp * ztn + pt(ji,jj,jk,jn,Kbb) ! time laplacian on tracers 230 ! 231 pt(ji,jj,jk,jn,Kmm) = ztn + atfp * ztd ! ptb <-- filtered ptn 239 232 END DO 240 233 END DO … … 243 236 END DO 244 237 ! 245 END SUBROUTINE tra_ nxt_fix246 247 248 SUBROUTINE tra_ nxt_vvl( kt, Kbb, Kmm, Krhs, kit000, p2dt, cdtype, ptb, ptn, pta, psbc_tc, psbc_tc_b, kjpt )249 !!---------------------------------------------------------------------- 250 !! *** ROUTINE tra_ nxt_vvl ***238 END SUBROUTINE tra_atf_fix 239 240 241 SUBROUTINE tra_atf_vvl( kt, Kbb, Kmm, Kaa, kit000, p2dt, cdtype, pt, psbc_tc, psbc_tc_b, kjpt ) 242 !!---------------------------------------------------------------------- 243 !! *** ROUTINE tra_atf_vvl *** 251 244 !! 252 245 !! ** Purpose : Time varying volume: apply the Asselin time filter … … 256 249 !! - swap tracer fields to prepare the next time_step. 257 250 !! tb = ( e3t(Kmm)*tn + atfp*[ e3t(Kbb)*tb - 2 e3t(Kmm)*tn + e3t_a*ta ] ) 258 !! /( e3t(Kmm) + atfp*[ e3t(Kbb) - 2 e3t(Kmm) + e3t(K rhs) ] )251 !! /( e3t(Kmm) + atfp*[ e3t(Kbb) - 2 e3t(Kmm) + e3t(Kaa) ] ) 259 252 !! tn = ta 260 253 !! 261 254 !! ** Action : - ptb & ptn ready for the next time step 262 255 !!---------------------------------------------------------------------- 263 INTEGER , INTENT(in ) :: kt ! ocean time-step index 264 INTEGER , INTENT(in ) :: Kbb, Kmm, Krhs ! time level indices 265 INTEGER , INTENT(in ) :: kit000 ! first time step index 266 REAL(wp) , INTENT(in ) :: p2dt ! time-step 267 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 268 INTEGER , INTENT(in ) :: kjpt ! number of tracers 269 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: ptb ! before tracer fields 270 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: ptn ! now tracer fields 271 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 272 REAL(wp), DIMENSION(jpi,jpj ,kjpt), INTENT(in ) :: psbc_tc ! surface tracer content 273 REAL(wp), DIMENSION(jpi,jpj ,kjpt), INTENT(in ) :: psbc_tc_b ! before surface tracer content 256 INTEGER , INTENT(in ) :: kt ! ocean time-step index 257 INTEGER , INTENT(in ) :: Kbb, Kmm, Kaa ! time level indices 258 INTEGER , INTENT(in ) :: kit000 ! first time step index 259 REAL(wp) , INTENT(in ) :: p2dt ! time-step 260 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 261 INTEGER , INTENT(in ) :: kjpt ! number of tracers 262 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracer fields 263 REAL(wp), DIMENSION(jpi,jpj ,kjpt) , INTENT(in ) :: psbc_tc ! surface tracer content 264 REAL(wp), DIMENSION(jpi,jpj ,kjpt) , INTENT(in ) :: psbc_tc_b ! before surface tracer content 274 265 ! 275 266 LOGICAL :: ll_traqsr, ll_rnf, ll_isf ! local logical … … 282 273 IF( kt == kit000 ) THEN 283 274 IF(lwp) WRITE(numout,*) 284 IF(lwp) WRITE(numout,*) 'tra_ nxt_vvl : time stepping', cdtype275 IF(lwp) WRITE(numout,*) 'tra_atf_vvl : time stepping', cdtype 285 276 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 286 277 ENDIF … … 309 300 ze3t_b = e3t(ji,jj,jk,Kbb) 310 301 ze3t_n = e3t(ji,jj,jk,Kmm) 311 ze3t_a = e3t(ji,jj,jk,K rhs)302 ze3t_a = e3t(ji,jj,jk,Kaa) 312 303 ! ! tracer content at Before, now and after 313 ztc_b = pt b(ji,jj,jk,jn) * ze3t_b314 ztc_n = pt n(ji,jj,jk,jn) * ze3t_n315 ztc_a = pt a(ji,jj,jk,jn) * ze3t_a304 ztc_b = pt(ji,jj,jk,jn,Kbb) * ze3t_b 305 ztc_n = pt(ji,jj,jk,jn,Kmm) * ze3t_n 306 ztc_a = pt(ji,jj,jk,jn,Kaa) * ze3t_a 316 307 ! 317 308 ze3t_d = ze3t_a - 2. * ze3t_n + ze3t_b … … 361 352 ! 362 353 ze3t_f = 1.e0 / ze3t_f 363 ptb(ji,jj,jk,jn) = ztc_f * ze3t_f ! ptb <-- ptn filtered 364 ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn) ! ptn <-- pta 354 pt(ji,jj,jk,jn,Kmm) = ztc_f * ze3t_f ! time filtered "now" field 365 355 ! 366 356 IF( ( l_trdtra .and. cdtype == 'TRA' ) .OR. ( l_trdtrc .and. cdtype == 'TRC' ) ) THEN … … 376 366 IF( ( l_trdtra .AND. cdtype == 'TRA' ) .OR. ( l_trdtrc .AND. cdtype == 'TRC' ) ) THEN 377 367 IF( l_trdtra .AND. cdtype == 'TRA' ) THEN 378 CALL trd_tra( kt, Kmm, K rhs, cdtype, jp_tem, jptra_atf, ztrd_atf(:,:,:,jp_tem) )379 CALL trd_tra( kt, Kmm, K rhs, cdtype, jp_sal, jptra_atf, ztrd_atf(:,:,:,jp_sal) )368 CALL trd_tra( kt, Kmm, Kaa, cdtype, jp_tem, jptra_atf, ztrd_atf(:,:,:,jp_tem) ) 369 CALL trd_tra( kt, Kmm, Kaa, cdtype, jp_sal, jptra_atf, ztrd_atf(:,:,:,jp_sal) ) 380 370 ENDIF 381 371 IF( l_trdtrc .AND. cdtype == 'TRC' ) THEN 382 372 DO jn = 1, kjpt 383 CALL trd_tra( kt, Kmm, K rhs, cdtype, jn, jptra_atf, ztrd_atf(:,:,:,jn) )373 CALL trd_tra( kt, Kmm, Kaa, cdtype, jn, jptra_atf, ztrd_atf(:,:,:,jn) ) 384 374 END DO 385 375 ENDIF … … 387 377 ENDIF 388 378 ! 389 END SUBROUTINE tra_ nxt_vvl379 END SUBROUTINE tra_atf_vvl 390 380 391 381 !!====================================================================== 392 END MODULE tra nxt382 END MODULE traatf -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps_rewrite_time_filterswap/src/OCE/step.F90
r11053 r11057 280 280 !! 281 281 !!jc2: dynnxt must be the latest call. e3t(:,:,:,Nbb) are indeed updated in that routine 282 CALL tra_ nxt ( kstp, Nbb, Nnn, Nrhs, Naa ) ! finalize (bcs) tracer fields at next time step and swap283 CALL dyn_atf ( kstp, Nbb, Nnn, Naa, uu, vv, e3t, e3u, e3v ) ! time filtering of "now" arrays284 CALL ssh_ swp ( kstp, Nbb, Nnn, Naa ) ! swap ofsea surface height282 CALL tra_atf ( kstp, Nbb, Nnn, Naa, ts ) ! time filtering of "now" tracer arrays 283 CALL dyn_atf ( kstp, Nbb, Nnn, Naa, uu, vv, e3t, e3u, e3v ) ! time filtering of "now" velocities and scale factors 284 CALL ssh_atf ( kstp, Nbb, Nnn, Naa, ssh ) ! time filtering of "now" sea surface height 285 285 ! 286 286 ! Swap time levels -
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps_rewrite_time_filterswap/src/OCE/step_oce.F90
r11050 r11057 30 30 USE traldf ! lateral mixing (tra_ldf routine) 31 31 USE trazdf ! vertical mixing (tra_zdf routine) 32 USE tra nxt ! time-stepping (tra_nxtroutine)32 USE traatf ! time filtering (tra_atf routine) 33 33 USE tranpc ! non-penetrative convection (tra_npc routine) 34 34
Note: See TracChangeset
for help on using the changeset viewer.