- Timestamp:
- 2015-12-16T10:25:22+01:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2015/dev_merge_2015/NEMOGCM/NEMO/TOP_SRC/TRP/trcldf.F90
r5836 r6060 12 12 !! 'key_top' TOP models 13 13 !!---------------------------------------------------------------------- 14 !! trc_ldf : update the tracer trend with the lateral diffusion 15 !! trc_ldf_ini : initialization, namelist read, and parameters control 16 !!---------------------------------------------------------------------- 17 USE trc ! ocean passive tracers variables 18 USE oce_trc ! ocean dynamics and active tracers 19 USE ldfslp ! lateral diffusion: iso-neutral slope 20 USE traldf_lap ! lateral diffusion: laplacian iso-level operator (tra_ldf_lap routine) 21 USE traldf_iso ! lateral diffusion: laplacian iso-neutral standard operator (tra_ldf_iso routine) 22 USE traldf_triad ! lateral diffusion: laplacian iso-neutral triad operator (tra_ldf_triad routine) 23 USE traldf_blp ! lateral diffusion (iso-level lap/blp) (tra_ldf_lap routine) 24 USE trd_oce ! trends: ocean variables 25 USE trdtra ! trends manager: tracers 14 !! trc_ldf : update the tracer trend with the lateral diffusion 15 !! trc_ldf_ini : initialization, namelist read, and parameters control 16 !!---------------------------------------------------------------------- 17 USE trc ! ocean passive tracers variables 18 USE oce_trc ! ocean dynamics and active tracers 19 USE ldfslp ! lateral diffusion: iso-neutral slope 20 USE traldf_lap_blp ! lateral diffusion: lap/bilaplacian iso-level operator (tra_ldf_lap/_blp routine) 21 USE traldf_iso ! lateral diffusion: laplacian iso-neutral standard operator (tra_ldf_iso routine) 22 USE traldf_triad ! lateral diffusion: laplacian iso-neutral triad operator (tra_ldf_ triad routine) 23 USE trd_oce ! trends: ocean variables 24 USE trdtra ! trends manager: tracers 26 25 ! 27 USE prtctl_trc 26 USE prtctl_trc ! Print control 28 27 29 28 IMPLICIT NONE … … 42 41 REAL(wp), PUBLIC :: rn_bhtrc_0 !: bilaplacian - -- - - [m4/s] 43 42 ! 44 !!: ** lateral mixing namelist (nam_trcldf) ** 45 REAL(wp) :: rldf ! ratio between active and passive tracers diffusive coefficient 43 ! !!: ** lateral mixing namelist (nam_trcldf) ** 44 REAL(wp) :: rldf ! ratio between active and passive tracers diffusive coefficient 45 46 46 INTEGER :: nldf = 0 ! type of lateral diffusion used defined from ln_trcldf_... namlist logicals) 47 47 48 48 !! * Substitutions 49 # include "domzgr_substitute.h90"50 49 # include "vectopt_loop_substitute.h90" 51 50 !!---------------------------------------------------------------------- … … 64 63 !!---------------------------------------------------------------------- 65 64 INTEGER, INTENT( in ) :: kt ! ocean time-step index 66 ! !65 ! 67 66 INTEGER :: jn 68 67 CHARACTER (len=22) :: charout … … 99 98 END SELECT 100 99 ! 101 IF( l_trdtrc ) THEN ! s ave the horizontal diffusive trends for further diagnostics100 IF( l_trdtrc ) THEN ! send the trends for further diagnostics 102 101 DO jn = 1, jptra 103 102 ztrtrd(:,:,:,jn) = tra(:,:,:,jn) - ztrtrd(:,:,:,jn) … … 106 105 CALL wrk_dealloc( jpi, jpj, jpk, jptra, ztrtrd ) 107 106 ENDIF 108 ! ! print mean trends (used for debugging) 109 IF( ln_ctl ) THEN 110 WRITE(charout, FMT="('ldf ')") ; CALL prt_ctl_trc_info(charout) 111 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm, clinfo2='trd' ) 107 ! 108 IF( ln_ctl ) THEN ! print mean trends (used for debugging) 109 WRITE(charout, FMT="('ldf ')") 110 CALL prt_ctl_trc_info(charout) 111 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm, clinfo2='trd' ) 112 112 ENDIF 113 113 ! … … 133 133 INTEGER :: ioptio, ierr ! temporary integers 134 134 INTEGER :: ios ! Local integer output status for namelist read 135 ! 135 !! 136 136 NAMELIST/namtrc_ldf/ ln_trcldf_lap, ln_trcldf_blp, & 137 137 & ln_trcldf_lev, ln_trcldf_hor, ln_trcldf_iso, ln_trcldf_triad, & 138 138 & rn_ahtrc_0 , rn_bhtrc_0 139 139 !!---------------------------------------------------------------------- 140 REWIND( numnat_ref ) ! namtrc_ldf in reference namelist 140 ! 141 REWIND( numnat_ref ) ! namtrc_ldf in reference namelist 141 142 READ ( numnat_ref, namtrc_ldf, IOSTAT = ios, ERR = 903) 142 903 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namtrc_ldf in reference namelist', lwp )143 144 REWIND( numnat_cfg ) 143 903 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namtrc_ldf in reference namelist', lwp ) 144 ! 145 REWIND( numnat_cfg ) ! namtrc_ldf in configuration namelist 145 146 READ ( numnat_cfg, namtrc_ldf, IOSTAT = ios, ERR = 904 ) 146 904 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namtrc_ldf in configuration namelist', lwp )147 904 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namtrc_ldf in configuration namelist', lwp ) 147 148 IF(lwm) WRITE ( numont, namtrc_ldf ) 148 149 IF(lwp) THEN ! Namelist print149 ! 150 IF(lwp) THEN ! Namelist print 150 151 WRITE(numout,*) 151 152 WRITE(numout,*) 'trc_ldf_ini : lateral tracer diffusive operator' … … 174 175 IF( ln_trcldf_lap .AND. ln_trcldf_blp ) CALL ctl_stop( 'trc_ldf_ctl: bilaplacian should be used on both TRC and TRA' ) 175 176 IF( ln_trcldf_blp .AND. ln_trcldf_lap ) CALL ctl_stop( 'trc_ldf_ctl: laplacian should be used on both TRC and TRA' ) 176 177 ! 177 178 ioptio = 0 178 179 IF( ln_trcldf_lev ) ioptio = ioptio + 1 … … 180 181 IF( ln_trcldf_iso ) ioptio = ioptio + 1 181 182 IF( ioptio /= 1 ) CALL ctl_stop( 'trc_ldf_ctl: use only ONE direction (level/hor/iso)' ) 182 183 ! 183 184 ! defined the type of lateral diffusion from ln_trcldf_... logicals 184 185 ! CAUTION : nldf = 1 is used in trazdf_imp, change it carefully … … 204 205 ENDIF 205 206 ! ! diffusivity ratio: passive / active tracers 206 IF( ABS(rn_aht_0) < 2._wp*TINY(1. e0) ) THEN207 IF( ABS(rn_ahtrc_0) < 2._wp*TINY(1. e0) ) THEN207 IF( ABS(rn_aht_0) < 2._wp*TINY(1._wp) ) THEN 208 IF( ABS(rn_ahtrc_0) < 2._wp*TINY(1._wp) ) THEN 208 209 rldf = 1.0_wp 209 210 ELSE 210 CALL ctl_stop( ' STOP', 'trc_ldf_ctl : cannot define rldf, rn_aht_0==0, rn_ahtrc_0 /=0' )211 CALL ctl_stop( 'trc_ldf_ctl : cannot define rldf, rn_aht_0==0, rn_ahtrc_0 /=0' ) 211 212 ENDIF 212 213 ELSE … … 235 236 ENDIF 236 237 ! ! diffusivity ratio: passive / active tracers 237 IF( ABS(rn_bht_0) < 2._wp*TINY(1. e0) ) THEN238 IF( ABS(rn_bhtrc_0) < 2._wp*TINY(1. e0) ) THEN238 IF( ABS(rn_bht_0) < 2._wp*TINY(1._wp) ) THEN 239 IF( ABS(rn_bhtrc_0) < 2._wp*TINY(1._wp) ) THEN 239 240 rldf = 1.0_wp 240 241 ELSE 241 CALL ctl_stop( ' STOP', 'trc_ldf_ctl : cannot define rldf, rn_aht_0==0, rn_ahtrc_0 /=0' )242 CALL ctl_stop( 'trc_ldf_ctl : cannot define rldf, rn_aht_0==0, rn_ahtrc_0 /=0' ) 242 243 ENDIF 243 244 ELSE … … 246 247 ENDIF 247 248 ! 248 IF( ierr == 1 ) CALL ctl_stop( ' iso-level in z-coordinate - partial step, not allowed' ) 249 IF( ln_ldfeiv .AND. .NOT.ln_trcldf_iso ) & 250 CALL ctl_stop( ' eddy induced velocity on tracers', & 251 & ' the eddy induced velocity on tracers requires isopycnal laplacian diffusion' ) 252 IF( nldf == 1 .OR. nldf == 3 ) THEN ! rotation 253 IF( .NOT.l_ldfslp ) CALL ctl_stop( ' the rotation of the diffusive tensor require l_ldfslp' ) 254 ENDIF 249 IF( ierr == 1 ) CALL ctl_stop( 'trc_ldf_ctl: iso-level in z-partial step, not allowed' ) 250 IF( ln_ldfeiv .AND. .NOT.ln_trcldf_iso ) CALL ctl_stop( 'trc_ldf_ctl: eiv requires isopycnal laplacian diffusion' ) 251 IF( nldf == 1 .OR. nldf == 3 ) l_ldfslp = .TRUE. ! slope of neutral surfaces required 255 252 ! 256 253 IF(lwp) THEN 257 254 WRITE(numout,*) 258 IF( nldf == np_no_ldf ) WRITE(numout,*) ' NO lateral diffusion' 259 IF( nldf == np_lap ) WRITE(numout,*) ' laplacian iso-level operator' 260 IF( nldf == np_lap_i ) WRITE(numout,*) ' Rotated laplacian operator (standard)' 261 IF( nldf == np_lap_it ) WRITE(numout,*) ' Rotated laplacian operator (triad)' 262 IF( nldf == np_blp ) WRITE(numout,*) ' bilaplacian iso-level operator' 263 IF( nldf == np_blp_i ) WRITE(numout,*) ' Rotated bilaplacian operator (standard)' 264 IF( nldf == np_blp_it ) WRITE(numout,*) ' Rotated bilaplacian operator (triad)' 255 SELECT CASE( nldf ) 256 CASE( np_no_ldf ) ; WRITE(numout,*) ' NO lateral diffusion' 257 CASE( np_lap ) ; WRITE(numout,*) ' laplacian iso-level operator' 258 CASE( np_lap_i ) ; WRITE(numout,*) ' Rotated laplacian operator (standard)' 259 CASE( np_lap_it ) ; WRITE(numout,*) ' Rotated laplacian operator (triad)' 260 CASE( np_blp ) ; WRITE(numout,*) ' bilaplacian iso-level operator' 261 CASE( np_blp_i ) ; WRITE(numout,*) ' Rotated bilaplacian operator (standard)' 262 CASE( np_blp_it ) ; WRITE(numout,*) ' Rotated bilaplacian operator (triad)' 263 END SELECT 265 264 ENDIF 266 265 !
Note: See TracChangeset
for help on using the changeset viewer.