- Timestamp:
- 2017-11-29T05:08:05+01:00 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/ROMS_WAD_7832/NEMOGCM/NEMO/TOP_SRC/TRP/trcnxt.F90
r7753 r8841 44 44 PUBLIC trc_nxt ! routine called by step.F90 45 45 46 REAL(wp) :: rfact1, rfact2 47 46 48 !!---------------------------------------------------------------------- 47 49 !! NEMO/TOP 3.3 , NEMO Consortium (2010) … … 104 106 ENDIF 105 107 ! ! Leap-Frog + Asselin filter time stepping 106 IF( neuler == 0 .AND. kt == nittrc000 ) THEN ! Euler time-stepping at first time-step(only swap)108 IF( (neuler == 0 .AND. kt == nittrc000) .OR. ln_top_euler ) THEN ! Euler time-stepping (only swap) 107 109 DO jn = 1, jptra 108 110 DO jk = 1, jpkm1 109 111 trn(:,:,jk,jn) = tra(:,:,jk,jn) 112 trb(:,:,jk,jn) = trn(:,:,jk,jn) 110 113 END DO 111 114 END DO 112 ELSE ! Asselin filter + swap 113 IF( ln_linssh ) THEN ; CALL tra_nxt_fix( kt, nittrc000, 'TRC', trb, trn, tra, jptra ) ! linear ssh 114 ELSE ; CALL tra_nxt_vvl( kt, nittrc000, rdttrc, 'TRC', trb, trn, tra, & 115 & sbc_trc, sbc_trc_b, jptra ) ! non-linear ssh 115 ELSE 116 IF( .NOT. l_offline ) THEN ! Leap-Frog + Asselin filter time stepping 117 IF( ln_linssh ) THEN ; CALL tra_nxt_fix( kt, nittrc000, 'TRC', trb, trn, tra, jptra ) ! linear ssh 118 ELSE ; CALL tra_nxt_vvl( kt, nittrc000, rdttrc, 'TRC', trb, trn, tra, & 119 & sbc_trc, sbc_trc_b, jptra ) ! non-linear ssh 120 ENDIF 121 ELSE 122 CALL trc_nxt_off( kt ) ! offline 116 123 ENDIF 117 124 ! … … 143 150 ! 144 151 END SUBROUTINE trc_nxt 152 153 154 SUBROUTINE trc_nxt_off( kt ) 155 !!---------------------------------------------------------------------- 156 !! *** ROUTINE tra_nxt_vvl *** 157 !! 158 !! ** Purpose : Time varying volume: apply the Asselin time filter 159 !! and swap the tracer fields. 160 !! 161 !! ** Method : - Apply a thickness weighted Asselin time filter on now fields. 162 !! - save in (ta,sa) a thickness weighted average over the three 163 !! time levels which will be used to compute rdn and thus the semi- 164 !! implicit hydrostatic pressure gradient (ln_dynhpg_imp = T) 165 !! - swap tracer fields to prepare the next time_step. 166 !! This can be summurized for tempearture as: 167 !! ztm = ( e3t_n*tn + rbcp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] ) ln_dynhpg_imp = T 168 !! /( e3t_n + rbcp*[ e3t_b - 2 e3t_n + e3t_a ] ) 169 !! ztm = 0 otherwise 170 !! tb = ( e3t_n*tn + atfp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] ) 171 !! /( e3t_n + atfp*[ e3t_b - 2 e3t_n + e3t_a ] ) 172 !! tn = ta 173 !! ta = zt (NB: reset to 0 after eos_bn2 call) 174 !! 175 !! ** Action : - (tb,sb) and (tn,sn) ready for the next time step 176 !! - (ta,sa) time averaged (t,s) (ln_dynhpg_imp = T) 177 !!---------------------------------------------------------------------- 178 INTEGER , INTENT(in ) :: kt ! ocean time-step index 179 !! 180 INTEGER :: ji, jj, jk, jn ! dummy loop indices 181 REAL(wp) :: ztc_a , ztc_n , ztc_b , ztc_f , ztc_d ! local scalar 182 REAL(wp) :: ze3t_b, ze3t_n, ze3t_a, ze3t_f, ze3t_d ! - - 183 !!---------------------------------------------------------------------- 184 ! 185 IF( kt == nittrc000 ) THEN 186 IF(lwp) WRITE(numout,*) 187 IF(lwp) WRITE(numout,*) 'trc_nxt_off : time stepping' 188 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 189 IF( .NOT. ln_linssh ) THEN 190 rfact1 = atfp * rdttrc 191 rfact2 = rfact1 / rau0 192 ENDIF 193 ! 194 ENDIF 195 ! 196 DO jn = 1, jptra 197 DO jk = 1, jpkm1 198 DO jj = 1, jpj 199 DO ji = 1, jpi 200 ze3t_b = e3t_b(ji,jj,jk) 201 ze3t_n = e3t_n(ji,jj,jk) 202 ze3t_a = e3t_a(ji,jj,jk) 203 ! ! tracer content at Before, now and after 204 ztc_b = trb(ji,jj,jk,jn) * ze3t_b 205 ztc_n = trn(ji,jj,jk,jn) * ze3t_n 206 ztc_a = tra(ji,jj,jk,jn) * ze3t_a 207 ! 208 ze3t_d = ze3t_a - 2. * ze3t_n + ze3t_b 209 ztc_d = ztc_a - 2. * ztc_n + ztc_b 210 ! 211 ze3t_f = ze3t_n + atfp * ze3t_d 212 ztc_f = ztc_n + atfp * ztc_d 213 ! 214 IF( .NOT. ln_linssh .AND. jk == mikt(ji,jj) ) THEN ! first level 215 ze3t_f = ze3t_f - rfact2 * ( emp_b(ji,jj) - emp(ji,jj) ) 216 ztc_f = ztc_f - rfact1 * ( sbc_trc(ji,jj,jn) - sbc_trc_b(ji,jj,jn) ) 217 ENDIF 218 219 ze3t_f = 1.e0 / ze3t_f 220 trb(ji,jj,jk,jn) = ztc_f * ze3t_f ! ptb <-- ptn filtered 221 trn(ji,jj,jk,jn) = tra(ji,jj,jk,jn) ! ptn <-- pta 222 ! 223 END DO 224 END DO 225 END DO 226 ! 227 END DO 228 ! 229 END SUBROUTINE trc_nxt_off 145 230 146 231 #else
Note: See TracChangeset
for help on using the changeset viewer.