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