- Timestamp:
- 2018-09-12T15:59:13+02:00 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2018/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/TOP_SRC/TRP/trcnxt.F90
r8754 r10115 49 49 50 50 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) :: r2dt 51 51 REAL(wp) :: rfact1, rfact2 52 53 !! * Substitutions 54 # include "domzgr_substitute.h90" 55 # include "vectopt_loop_substitute.h90" 52 56 !!---------------------------------------------------------------------- 53 57 !! NEMO/TOP 3.3 , NEMO Consortium (2010) … … 145 149 ! 146 150 ELSE 147 ! Leap-Frog + Asselin filter time stepping 148 IF( lk_vvl ) THEN 149 150 IF( ln_crs_top )THEN 151 CALL tra_nxt_vvl_crs( kt, nittrc000, rdttrc, 'TRC', trb, trn, tra, & 152 & sbc_trc, sbc_trc_b, jptra ) ! variable volume level (vvl) 153 ELSE 154 CALL tra_nxt_vvl( kt, nittrc000, rdttrc, 'TRC', trb, trn, tra, & 155 & sbc_trc, sbc_trc_b, jptra ) ! variable volume level (vvl) 151 IF( .NOT. lk_offline ) THEN ! Leap-Frog + Asselin filter time stepping 152 153 IF( lk_vvl ) THEN 154 IF( ln_crs_top )THEN 155 CALL tra_nxt_vvl_crs( kt, nittrc000, rdttrc, 'TRC', trb, trn, tra, & 156 & sbc_trc, sbc_trc_b, jptra ) ! variable volume level (vvl) 157 ELSE 158 CALL tra_nxt_vvl( kt, nittrc000, rdttrc, 'TRC', trb, trn, tra, & 159 & sbc_trc, sbc_trc_b, jptra ) ! variable volume level (vvl) 160 ENDIF 161 ELSE 162 CALL tra_nxt_fix( kt, nittrc000, 'TRC', trb, trn, tra, jptra ) ! fixed volume level 156 163 ENDIF 157 ELSE ; CALL tra_nxt_fix( kt, nittrc000, 'TRC', trb, trn, tra, jptra ) ! fixed volume level 164 165 ELSE 166 CALL trc_nxt_off( kt ) ! offline 158 167 ENDIF 168 169 159 170 ENDIF 160 171 … … 181 192 END SUBROUTINE trc_nxt 182 193 194 SUBROUTINE trc_nxt_off( kt ) 195 !!---------------------------------------------------------------------- 196 !! *** ROUTINE tra_nxt_vvl *** 197 !! 198 !! ** Purpose : Time varying volume: apply the Asselin time filter 199 !! and swap the tracer fields. 200 !! 201 !! ** Method : - Apply a thickness weighted Asselin time filter on now fields. 202 !! - save in (ta,sa) a thickness weighted average over the three 203 !! time levels which will be used to compute rdn and thus the semi- 204 !! implicit hydrostatic pressure gradient (ln_dynhpg_imp = T) 205 !! - swap tracer fields to prepare the next time_step. 206 !! This can be summurized for tempearture as: 207 !! ztm = ( e3t_n*tn + rbcp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] ) ln_dynhpg_imp = T 208 !! /( e3t_n + rbcp*[ e3t_b - 2 e3t_n + e3t_a ] ) 209 !! ztm = 0 otherwise 210 !! tb = ( e3t_n*tn + atfp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] ) 211 !! /( e3t_n + atfp*[ e3t_b - 2 e3t_n + e3t_a ] ) 212 !! tn = ta 213 !! ta = zt (NB: reset to 0 after eos_bn2 call) 214 !! 215 !! ** Action : - (tb,sb) and (tn,sn) ready for the next time step 216 !! - (ta,sa) time averaged (t,s) (ln_dynhpg_imp = T) 217 !!---------------------------------------------------------------------- 218 INTEGER , INTENT(in ) :: kt ! ocean time-step index 219 !! 220 INTEGER :: ji, jj, jk, jn ! dummy loop indices 221 REAL(wp) :: ztc_a , ztc_n , ztc_b , ztc_f , ztc_d ! local scalar 222 REAL(wp) :: ze3t_b, ze3t_n, ze3t_a, ze3t_f, ze3t_d ! - - 223 !!---------------------------------------------------------------------- 224 ! 225 IF( kt == nittrc000 ) THEN 226 IF(lwp) WRITE(numout,*) 227 IF(lwp) WRITE(numout,*) 'trc_nxt_off : time stepping' 228 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 229 IF( lk_vvl ) THEN 230 rfact1 = atfp * rdttrc(1) 231 rfact2 = rfact1 / rau0 232 ENDIF 233 ENDIF 234 ! 235 DO jn = 1, jptra 236 DO jk = 1, jpkm1 237 DO jj = 1, jpj 238 DO ji = 1, jpi 239 ze3t_b = fse3t_b(ji,jj,jk) 240 ze3t_n = fse3t_n(ji,jj,jk) 241 ze3t_a = fse3t_a(ji,jj,jk) 242 ! ! tracer content at Before, now and after 243 ztc_b = trb(ji,jj,jk,jn) * ze3t_b 244 ztc_n = trn(ji,jj,jk,jn) * ze3t_n 245 ztc_a = tra(ji,jj,jk,jn) * ze3t_a 246 ! 247 ze3t_d = ze3t_a - 2. * ze3t_n + ze3t_b 248 ztc_d = ztc_a - 2. * ztc_n + ztc_b 249 ! 250 ze3t_f = ze3t_n + atfp * ze3t_d 251 ztc_f = ztc_n + atfp * ztc_d 252 ! 253 IF( lk_vvl .AND. jk == mikt(ji,jj) ) THEN ! first level 254 ze3t_f = ze3t_f - rfact2 * ( emp_b(ji,jj) - emp(ji,jj) ) 255 ztc_f = ztc_f - rfact1 * ( sbc_trc(ji,jj,jn) - sbc_trc_b(ji,jj,jn) ) 256 ENDIF 257 258 ze3t_f = 1.e0 / ze3t_f 259 trb(ji,jj,jk,jn) = ztc_f * ze3t_f ! ptb <-- ptn filtered 260 trn(ji,jj,jk,jn) = tra(ji,jj,jk,jn) ! ptn <-- pta 261 ! 262 END DO 263 END DO 264 END DO 265 ! 266 END DO 267 ! 268 END SUBROUTINE trc_nxt_off 269 183 270 #else 184 271 !!----------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.