- Timestamp:
- 2015-12-17T15:19:01+01:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2015/dev_agrif_v3_6_STABLE/NEMOGCM/NEMO/OPA_SRC/TRA/tranxt.F90
r4954 r6092 27 27 USE dom_oce ! ocean space and time domain variables 28 28 USE sbc_oce ! surface boundary condition: ocean 29 USE zdf_oce ! ??? 29 USE sbcrnf ! river runoffs 30 USE zdf_oce ! ocean vertical mixing 30 31 USE domvvl ! variable volume 31 32 USE dynspg_oce ! surface pressure gradient variables 32 33 USE dynhpg ! hydrostatic pressure gradient 33 USE trdmod_oce ! ocean space and time domain variables 34 USE trdtra ! ocean active tracers trends 35 USE phycst 36 USE bdy_oce 34 USE trd_oce ! trends: ocean variables 35 USE trdtra ! trends manager: tracers 36 USE traqsr ! penetrative solar radiation (needed for nksr) 37 USE phycst ! physical constant 38 USE ldftra_oce ! lateral physics on tracers 39 USE bdy_oce ! BDY open boundary condition variables 37 40 USE bdytra ! open boundary condition (bdy_tra routine) 41 ! 38 42 USE in_out_manager ! I/O manager 39 43 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 40 44 USE prtctl ! Print control 41 USE traqsr ! penetrative solar radiation (needed for nksr) 45 USE wrk_nemo ! Memory allocation 46 USE timing ! Timing 42 47 #if defined key_agrif 43 48 USE agrif_opa_interp 44 49 #endif 45 USE wrk_nemo ! Memory allocation46 USE timing ! Timing47 50 48 51 IMPLICIT NONE … … 79 82 !! at the local domain boundaries through lbc_lnk call, 80 83 !! at the one-way open boundaries (lk_bdy=T), 81 !! at the AGRIF zoom 84 !! at the AGRIF zoom boundaries (lk_agrif=T) 82 85 !! 83 86 !! - Update lateral boundary conditions on AGRIF children … … 127 130 ztrdt(:,:,:) = tsn(:,:,:,jp_tem) 128 131 ztrds(:,:,:) = tsn(:,:,:,jp_sal) 132 IF( ln_traldf_iso ) THEN ! diagnose the "pure" Kz diffusive trend 133 CALL trd_tra( kt, 'TRA', jp_tem, jptra_zdfp, ztrdt ) 134 CALL trd_tra( kt, 'TRA', jp_sal, jptra_zdfp, ztrds ) 135 ENDIF 129 136 ENDIF 130 137 … … 137 144 ELSE ! Leap-Frog + Asselin filter time stepping 138 145 ! 139 IF( lk_vvl ) THEN ; CALL tra_nxt_vvl( kt, nit000, 'TRA', tsb, tsn, tsa, jpts ) ! variable volume level (vvl) 140 ELSE ; CALL tra_nxt_fix( kt, nit000, 'TRA', tsb, tsn, tsa, jpts ) ! fixed volume level 146 IF( lk_vvl ) THEN ; CALL tra_nxt_vvl( kt, nit000, rdttra, 'TRA', tsb, tsn, tsa, & 147 & sbc_tsc, sbc_tsc_b, jpts ) ! variable volume level (vvl) 148 ELSE ; CALL tra_nxt_fix( kt, nit000, 'TRA', tsb, tsn, tsa, jpts ) ! fixed volume level 141 149 ENDIF 142 150 ENDIF … … 145 153 IF( l_trdtra ) THEN ! trend of the Asselin filter (tb filtered - tb)/dt 146 154 DO jk = 1, jpkm1 147 zfact = 1. e0_wp / r2dtra(jk)155 zfact = 1._wp / r2dtra(jk) 148 156 ztrdt(:,:,jk) = ( tsb(:,:,jk,jp_tem) - ztrdt(:,:,jk) ) * zfact 149 157 ztrds(:,:,jk) = ( tsb(:,:,jk,jp_sal) - ztrds(:,:,jk) ) * zfact 150 158 END DO 151 CALL trd_tra( kt, 'TRA', jp_tem, jptra_ trd_atf, ztrdt )152 CALL trd_tra( kt, 'TRA', jp_sal, jptra_ trd_atf, ztrds )159 CALL trd_tra( kt, 'TRA', jp_tem, jptra_atf, ztrdt ) 160 CALL trd_tra( kt, 'TRA', jp_sal, jptra_atf, ztrds ) 153 161 CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds ) 154 162 END IF … … 158 166 & tab3d_2=tsn(:,:,:,jp_sal), clinfo2= ' Sn: ', mask2=tmask ) 159 167 ! 160 ! 161 IF( nn_timing == 1 ) CALL timing_stop('tra_nxt') 168 IF( nn_timing == 1 ) CALL timing_stop('tra_nxt') 162 169 ! 163 170 END SUBROUTINE tra_nxt … … 231 238 232 239 233 SUBROUTINE tra_nxt_vvl( kt, kit000, cdtype, ptb, ptn, pta, kjpt )240 SUBROUTINE tra_nxt_vvl( kt, kit000, p2dt, cdtype, ptb, ptn, pta, psbc_tc, psbc_tc_b, kjpt ) 234 241 !!---------------------------------------------------------------------- 235 242 !! *** ROUTINE tra_nxt_vvl *** … … 255 262 !! - (ta,sa) time averaged (t,s) (ln_dynhpg_imp = T) 256 263 !!---------------------------------------------------------------------- 257 INTEGER , INTENT(in ) :: kt ! ocean time-step index 258 INTEGER , INTENT(in ) :: kit000 ! first time step index 259 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 260 INTEGER , INTENT(in ) :: kjpt ! number of tracers 261 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb ! before tracer fields 262 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptn ! now tracer fields 263 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta ! tracer trend 264 INTEGER , INTENT(in ) :: kt ! ocean time-step index 265 INTEGER , INTENT(in ) :: kit000 ! first time step index 266 REAL(wp) , INTENT(in ), DIMENSION(jpk) :: 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) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb ! before tracer fields 270 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptn ! now tracer fields 271 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta ! tracer trend 272 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,kjpt) :: psbc_tc ! surface tracer content 273 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,kjpt) :: psbc_tc_b ! before surface tracer content 274 264 275 !! 265 LOGICAL :: ll_tra , ll_tra_hpg, ll_traqsr! local logical276 LOGICAL :: ll_tra_hpg, ll_traqsr, ll_rnf ! local logical 266 277 INTEGER :: ji, jj, jk, jn ! dummy loop indices 267 278 REAL(wp) :: zfact1, ztc_a , ztc_n , ztc_b , ztc_f , ztc_d ! local scalar … … 276 287 ! 277 288 IF( cdtype == 'TRA' ) THEN 278 ll_tra = .TRUE. ! active tracers case279 289 ll_tra_hpg = ln_dynhpg_imp ! active tracers case and semi-implicit hpg 280 290 ll_traqsr = ln_traqsr ! active tracers case and solar penetration 291 ll_rnf = ln_rnf ! active tracers case and river runoffs 281 292 ELSE 282 ll_tra = .FALSE. ! passive tracers case283 293 ll_tra_hpg = .FALSE. ! passive tracers case or NO semi-implicit hpg 284 294 ll_traqsr = .FALSE. ! active tracers case and NO solar penetration 295 ll_rnf = .FALSE. ! passive tracers or NO river runoffs 285 296 ENDIF 286 297 ! 287 298 DO jn = 1, kjpt 288 299 DO jk = 1, jpkm1 289 zfact1 = atfp * rdttra(jk)300 zfact1 = atfp * p2dt(jk) 290 301 zfact2 = zfact1 / rau0 291 302 DO jj = 1, jpj … … 305 316 ztc_f = ztc_n + atfp * ztc_d 306 317 ! 307 IF( ll_tra .AND. jk == 1 ) THEN ! first level only for T & S308 ze3t_f = ze3t_f - zfact2 * ( emp_b(ji,jj) - emp(ji,jj) )309 ztc_f = ztc_f - zfact1 * ( sbc_tsc(ji,jj,jn) - sbc_tsc_b(ji,jj,jn) )318 IF( jk == 1 ) THEN ! first level 319 ze3t_f = ze3t_f - zfact2 * ( emp_b(ji,jj) - emp(ji,jj) + rnf(ji,jj) - rnf_b(ji,jj) ) 320 ztc_f = ztc_f - zfact1 * ( psbc_tc(ji,jj,jn) - psbc_tc_b(ji,jj,jn) ) 310 321 ENDIF 322 311 323 IF( ll_traqsr .AND. jn == jp_tem .AND. jk <= nksr ) & ! solar penetration (temperature only) 312 324 & ztc_f = ztc_f - zfact1 * ( qsr_hc(ji,jj,jk) - qsr_hc_b(ji,jj,jk) ) 313 325 314 ze3t_f = 1.e0 / ze3t_f 315 ptb(ji,jj,jk,jn) = ztc_f * ze3t_f ! ptb <-- ptn filtered 316 ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn) ! ptn <-- pta 317 ! 318 IF( ll_tra_hpg ) THEN ! semi-implicit hpg (T & S only) 319 ze3t_d = 1.e0 / ( ze3t_n + rbcp * ze3t_d ) 320 pta(ji,jj,jk,jn) = ze3t_d * ( ztc_n + rbcp * ztc_d ) ! ta <-- Brown & Campana average 321 ENDIF 326 IF( ll_rnf .AND. jk <= nk_rnf(ji,jj) ) & ! river runoffs 327 & ztc_f = ztc_f - zfact1 * ( rnf_tsc(ji,jj,jn) - rnf_tsc_b(ji,jj,jn) ) & 328 & * fse3t_n(ji,jj,jk) / h_rnf(ji,jj) 329 330 ze3t_f = 1.e0 / ze3t_f 331 ptb(ji,jj,jk,jn) = ztc_f * ze3t_f ! ptb <-- ptn filtered 332 ptn(ji,jj,jk,jn) = pta(ji,jj,jk,jn) ! ptn <-- pta 333 ! 334 IF( ll_tra_hpg ) THEN ! semi-implicit hpg (T & S only) 335 ze3t_d = 1.e0 / ( ze3t_n + rbcp * ze3t_d ) 336 pta(ji,jj,jk,jn) = ze3t_d * ( ztc_n + rbcp * ztc_d ) ! ta <-- Brown & Campana average 337 ENDIF 322 338 END DO 323 339 END DO
Note: See TracChangeset
for help on using the changeset viewer.