- Timestamp:
- 2015-12-04T17:05:58+01:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/OPA_SRC/TRA/tranxt.F90
r5916 r6004 31 31 USE zdf_oce ! ocean vertical mixing 32 32 USE domvvl ! variable volume 33 USE dynspg_oce ! surface pressure gradient variables34 USE dynhpg ! hydrostatic pressure gradient35 33 USE trd_oce ! trends: ocean variables 36 34 USE trdtra ! trends manager: tracers … … 50 48 USE agrif_opa_interp 51 49 #endif 52 # include "vectopt_loop_substitute.h90"53 50 54 51 IMPLICIT NONE … … 59 56 PUBLIC tra_nxt_vvl ! to be used in trcnxt 60 57 61 REAL(wp) :: rbcp ! Brown & Campana parameters for semi-implicit hpg62 58 !! * Substitutions 59 # include "vectopt_loop_substitute.h90" 63 60 !!---------------------------------------------------------------------- 64 61 !! NEMO/OPA 3.3 , NEMO-Consortium (2010) … … 88 85 !! domains (lk_agrif=T) 89 86 !! 90 !! ** Action : - (tb,sb) and (tn,sn) ready for the next time step 91 !! - (ta,sa) time averaged (t,s) (ln_dynhpg_imp = T) 87 !! ** Action : - tsb & tsn ready for the next time step 92 88 !!---------------------------------------------------------------------- 93 89 INTEGER, INTENT(in) :: kt ! ocean time-step index … … 104 100 IF(lwp) WRITE(numout,*) 'tra_nxt : achieve the time stepping by Asselin filter and array swap' 105 101 IF(lwp) WRITE(numout,*) '~~~~~~~' 106 !107 rbcp = 0.25_wp * (1._wp + atfp) * (1._wp + atfp) * ( 1._wp - atfp) ! Brown & Campana parameter for semi-implicit hpg108 102 ENDIF 109 103 … … 154 148 CALL lbc_lnk( tsb(:,:,:,jn), 'T', 1._wp ) 155 149 CALL lbc_lnk( tsn(:,:,:,jn), 'T', 1._wp ) 156 CALL lbc_lnk( tsa(:,:,:,jn), 'T', 1._wp )157 150 END DO 158 151 ENDIF 159 152 ! 160 ! trends computation161 153 IF( l_trdtra ) THEN ! trend of the Asselin filter (tb filtered - tb)/dt 162 154 DO jk = 1, jpkm1 … … 187 179 !! 188 180 !! ** Method : - Apply a Asselin time filter on now fields. 189 !! - save in (ta,sa) an average over the three time levels190 !! which will be used to compute rdn and thus the semi-implicit191 !! hydrostatic pressure gradient (ln_dynhpg_imp = T)192 181 !! - swap tracer fields to prepare the next time_step. 193 !! This can be summurized for tempearture as: 194 !! ztm = tn + rbcp * [ta -2 tn + tb ] ln_dynhpg_imp = T 195 !! ztm = 0 otherwise 196 !! with rbcp=1/4 * (1-atfp^4) / (1-atfp) 197 !! tb = tn + atfp*[ tb - 2 tn + ta ] 198 !! tn = ta 199 !! ta = ztm (NB: reset to 0 after eos_bn2 call) 200 !! 201 !! ** Action : - (tb,sb) and (tn,sn) ready for the next time step 202 !! - (ta,sa) time averaged (t,s) (ln_dynhpg_imp = T) 203 !!---------------------------------------------------------------------- 204 INTEGER , INTENT(in ) :: kt ! ocean time-step index 205 INTEGER , INTENT(in ) :: kit000 ! first time step index 206 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 207 INTEGER , INTENT(in ) :: kjpt ! number of tracers 208 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb ! before tracer fields 209 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptn ! now tracer fields 210 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta ! tracer trend 182 !! 183 !! ** Action : - tsb & tsn ready for the next time step 184 !!---------------------------------------------------------------------- 185 INTEGER , INTENT(in ) :: kt ! ocean time-step index 186 INTEGER , INTENT(in ) :: kit000 ! first time step index 187 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 188 INTEGER , INTENT(in ) :: kjpt ! number of tracers 189 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: ptb ! before tracer fields 190 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: ptn ! now tracer fields 191 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 211 192 ! 212 193 INTEGER :: ji, jj, jk, jn ! dummy loop indices 213 LOGICAL :: ll_tra_hpg ! local logical214 194 REAL(wp) :: ztn, ztd ! local scalars 215 195 !!---------------------------------------------------------------------- … … 221 201 ENDIF 222 202 ! 223 IF( cdtype == 'TRA' ) THEN ; ll_tra_hpg = ln_dynhpg_imp ! active tracers case and semi-implicit hpg224 ELSE ; ll_tra_hpg = .FALSE. ! passive tracers case or NO semi-implicit hpg225 ENDIF226 !227 203 DO jn = 1, kjpt 228 204 ! … … 231 207 DO ji = fs_2, fs_jpim1 232 208 ztn = ptn(ji,jj,jk,jn) 233 ztd = pta(ji,jj,jk,jn) - 2. * ztn + ptb(ji,jj,jk,jn) ! time laplacian on tracers 234 ! 235 ptb(ji,jj,jk,jn) = ztn + atfp * ztd ! ptb <-- filtered ptn 236 ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn) ! ptn <-- pta 237 ! 238 IF( ll_tra_hpg ) pta(ji,jj,jk,jn) = ztn + rbcp * ztd ! pta <-- Brown & Campana average 209 ztd = pta(ji,jj,jk,jn) - 2._wp * ztn + ptb(ji,jj,jk,jn) ! time laplacian on tracers 210 ! 211 ptb(ji,jj,jk,jn) = ztn + atfp * ztd ! ptb <-- filtered ptn 212 ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn) ! ptn <-- pta 239 213 END DO 240 214 END DO … … 254 228 !! 255 229 !! ** Method : - Apply a thickness weighted Asselin time filter on now fields. 256 !! - save in (ta,sa) a thickness weighted average over the three257 !! time levels which will be used to compute rdn and thus the semi-258 !! implicit hydrostatic pressure gradient (ln_dynhpg_imp = T)259 230 !! - swap tracer fields to prepare the next time_step. 260 !! This can be summurized for tempearture as:261 !! ztm = ( e3t_n*tn + rbcp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] ) ln_dynhpg_imp = T262 !! /( e3t_n + rbcp*[ e3t_b - 2 e3t_n + e3t_a ] )263 !! ztm = 0 otherwise264 231 !! tb = ( e3t_n*tn + atfp*[ e3t_b*tb - 2 e3t_n*tn + e3t_a*ta ] ) 265 232 !! /( e3t_n + atfp*[ e3t_b - 2 e3t_n + e3t_a ] ) 266 233 !! tn = ta 267 !! ta = zt (NB: reset to 0 after eos_bn2 call) 268 !! 269 !! ** Action : - (tb,sb) and (tn,sn) ready for the next time step 270 !! - (ta,sa) time averaged (t,s) (ln_dynhpg_imp = T) 271 !!---------------------------------------------------------------------- 272 INTEGER , INTENT(in ) :: kt ! ocean time-step index 273 INTEGER , INTENT(in ) :: kit000 ! first time step index 274 REAL(wp) , INTENT(in ), DIMENSION(jpk) :: p2dt ! time-step 275 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 276 INTEGER , INTENT(in ) :: kjpt ! number of tracers 277 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb ! before tracer fields 278 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptn ! now tracer fields 279 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta ! tracer trend 280 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,kjpt) :: psbc_tc ! surface tracer content 281 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,kjpt) :: psbc_tc_b ! before surface tracer content 282 ! 283 LOGICAL :: ll_tra_hpg, ll_traqsr, ll_rnf, ll_isf ! local logical 234 !! 235 !! ** Action : - tsb & tsn ready for the next time step 236 !!---------------------------------------------------------------------- 237 INTEGER , INTENT(in ) :: kt ! ocean time-step index 238 INTEGER , INTENT(in ) :: kit000 ! first time step index 239 REAL(wp), DIMENSION(jpk) , INTENT(in ) :: p2dt ! time-step 240 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 241 INTEGER , INTENT(in ) :: kjpt ! number of tracers 242 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: ptb ! before tracer fields 243 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: ptn ! now tracer fields 244 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 245 REAL(wp), DIMENSION(jpi,jpj ,kjpt), INTENT(in ) :: psbc_tc ! surface tracer content 246 REAL(wp), DIMENSION(jpi,jpj ,kjpt), INTENT(in ) :: psbc_tc_b ! before surface tracer content 247 ! 248 LOGICAL :: ll_traqsr, ll_rnf, ll_isf ! local logical 284 249 INTEGER :: ji, jj, jk, jn ! dummy loop indices 285 250 REAL(wp) :: zfact1, ztc_a , ztc_n , ztc_b , ztc_f , ztc_d ! local scalar … … 293 258 ENDIF 294 259 ! 295 IF( cdtype == 'TRA' ) THEN 296 ll_tra_hpg = ln_dynhpg_imp ! active tracers case and semi-implicit hpg 297 ll_traqsr = ln_traqsr ! active tracers case and solar penetration 298 ll_rnf = ln_rnf ! active tracers case and river runoffs 260 IF( cdtype == 'TRA' ) THEN ! active tracers case 261 ll_traqsr = ln_traqsr ! solar penetration 262 ll_rnf = ln_rnf ! river runoffs 299 263 IF( nn_isf >= 1 ) THEN 300 ll_isf = .TRUE. ! active tracers case andice shelf melting/freezing264 ll_isf = .TRUE. ! ice shelf melting/freezing 301 265 ELSE 302 266 ll_isf = .FALSE. 303 267 END IF 304 ELSE 305 ll_tra_hpg = .FALSE. ! passive tracers case or NO semi-implicit hpg 306 ll_traqsr = .FALSE. ! active tracers case and NO solar penetration 307 ll_rnf = .FALSE. ! passive tracers or NO river runoffs 308 ll_isf = .FALSE. ! passive tracers or NO ice shelf melting/freezing 268 ELSE ! passive tracers case 269 ll_traqsr = .FALSE. ! NO solar penetration 270 ll_rnf = .FALSE. ! NO river runoffs ???? !!gm BUG ? 271 ll_isf = .FALSE. ! NO ice shelf melting/freezing !!gm BUG ?? 309 272 ENDIF 310 273 ! … … 312 275 DO jk = 1, jpkm1 313 276 zfact1 = atfp * p2dt(jk) 314 zfact2 = zfact1 /rau0277 zfact2 = zfact1 * r1_rau0 315 278 DO jj = 2, jpjm1 316 279 DO ji = fs_2, fs_jpim1 … … 335 298 ztc_f = ztc_f - zfact1 * ( psbc_tc(ji,jj,jn) - psbc_tc_b(ji,jj,jn) ) 336 299 ENDIF 337 300 ! 338 301 ! solar penetration (temperature only) 339 302 IF( ll_traqsr .AND. jn == jp_tem .AND. jk <= nksr ) & 340 303 & ztc_f = ztc_f - zfact1 * ( qsr_hc(ji,jj,jk) - qsr_hc_b(ji,jj,jk) ) 341 304 ! 342 305 ! river runoff 343 306 IF( ll_rnf .AND. jk <= nk_rnf(ji,jj) ) & 344 307 & ztc_f = ztc_f - zfact1 * ( rnf_tsc(ji,jj,jn) - rnf_tsc_b(ji,jj,jn) ) & 345 308 & * e3t_n(ji,jj,jk) / h_rnf(ji,jj) 346 309 ! 347 310 ! ice shelf 348 311 IF( ll_isf ) THEN … … 356 319 & * e3t_n(ji,jj,jk) * r1_hisf_tbl (ji,jj) * ralpha(ji,jj) 357 320 END IF 358 321 ! 359 322 ze3t_f = 1.e0 / ze3t_f 360 323 ptb(ji,jj,jk,jn) = ztc_f * ze3t_f ! ptb <-- ptn filtered 361 324 ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn) ! ptn <-- pta 362 325 ! 363 IF( ll_tra_hpg ) THEN ! semi-implicit hpg (T & S only)364 ze3t_d = 1.e0 / ( ze3t_n + rbcp * ze3t_d )365 pta(ji,jj,jk,jn) = ze3t_d * ( ztc_n + rbcp * ztc_d ) ! ta <-- Brown & Campana average366 ENDIF367 326 END DO 368 327 END DO
Note: See TracChangeset
for help on using the changeset viewer.