- Timestamp:
- 2013-04-22T12:05:52+02:00 (11 years ago)
- Location:
- branches/2012/dev_v3_4_STABLE_2012/NEMOGCM/NEMO/TOP_SRC/TRP
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2012/dev_v3_4_STABLE_2012/NEMOGCM/NEMO/TOP_SRC/TRP/trcdmp.F90
r3294 r3881 11 11 !! 3.3 ! 2010-06 (C. Ethe, G. Madec) merge TRA-TRC 12 12 !!---------------------------------------------------------------------- 13 #if defined key_top && defined key_trcdmp 14 !!---------------------------------------------------------------------- 15 !! key_trcdmp internal damping 13 #if defined key_top 16 14 !!---------------------------------------------------------------------- 17 15 !! trc_dmp : update the tracer trend with the internal damping … … 25 23 USE prtctl_trc ! Print control for debbuging 26 24 USE trdtra 25 USE trdmod_oce 27 26 28 27 IMPLICIT NONE … … 30 29 31 30 PUBLIC trc_dmp ! routine called by step.F90 31 PUBLIC trc_dmp_clo ! routine called by step.F90 32 32 PUBLIC trc_dmp_alloc ! routine called by nemogcm.F90 33 33 34 LOGICAL , PUBLIC, PARAMETER :: lk_trcdmp = .TRUE. !: internal damping flag35 36 34 ! !!* Namelist namtrc_dmp : passive tracer newtonian damping * 37 INTEGER :: nn_hdmp_tr = -1 ! = 0/-1/'latitude' for damping over passive tracer38 INTEGER :: nn_zdmp_tr = 0 ! = 0/1/2 flag for damping in the mixed layer39 REAL(wp) :: rn_surf_tr = 50. ! surface time scale for internal damping [days]40 REAL(wp) :: rn_bot_tr = 360. ! bottom time scale for internal damping [days]41 REAL(wp) :: rn_dep_tr = 800. ! depth of transition between rn_surf and rn_bot [meters]42 INTEGER :: nn_file_tr = 2 ! = 1 create a damping.coeff NetCDF file43 44 35 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: restotr ! restoring coeff. on tracers (s-1) 36 37 INTEGER, PARAMETER :: npncts = 5 ! number of closed sea 38 INTEGER, DIMENSION(npncts) :: nctsi1, nctsj1 ! south-west closed sea limits (i,j) 39 INTEGER, DIMENSION(npncts) :: nctsi2, nctsj2 ! north-east closed sea limits (i,j) 45 40 46 41 !! * Substitutions … … 86 81 INTEGER, INTENT( in ) :: kt ! ocean time-step index 87 82 !! 88 INTEGER :: ji, jj, jk, jn ! dummy loop indices83 INTEGER :: ji, jj, jk, jn, jl ! dummy loop indices 89 84 REAL(wp) :: ztra ! temporary scalars 90 85 CHARACTER (len=22) :: charout 91 86 REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrtrd 87 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztrcdta ! 4D workspace 92 88 !!---------------------------------------------------------------------- 93 89 ! … … 99 95 100 96 IF( l_trdtrc ) CALL wrk_alloc( jpi, jpj, jpk, ztrtrd ) ! temporary save of trends 101 102 ! 1. Newtonian damping trends on tracer fields 103 ! -------------------------------------------- 104 ! Initialize the input fields for newtonian damping 105 CALL trc_dta( kt ) 106 ! ! =========== 107 DO jn = 1, jptra ! tracer loop 108 ! ! =========== 109 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) ! save trends 110 111 IF( lutini(jn) ) THEN 97 ! 98 IF( nb_trcdta > 0 ) THEN ! Initialisation of tracer from a file that may also be used for damping 99 ! 100 CALL wrk_alloc( jpi, jpj, jpk, nb_trcdta, ztrcdta ) ! Memory allocation 101 CALL trc_dta( kt, ztrcdta ) ! read tracer data at nit000 102 ! ! =========== 103 DO jn = 1, jptra ! tracer loop 104 ! ! =========== 105 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) ! save trends 112 106 ! 113 SELECT CASE ( nn_zdmp_trc ) 114 ! 115 CASE( 0 ) !== newtonian damping throughout the water column ==! 116 DO jk = 1, jpkm1 117 DO jj = 2, jpjm1 118 DO ji = fs_2, fs_jpim1 ! vector opt. 119 ztra = restotr(ji,jj,jk) * ( trdta(ji,jj,jk,jn) - trb(ji,jj,jk,jn) ) 120 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra 107 IF( ln_trc_ini(jn) ) THEN ! update passive tracers arrays with input data read from file 108 109 jl = n_trc_index(jn) 110 111 SELECT CASE ( nn_zdmp_tr ) 112 ! 113 CASE( 0 ) !== newtonian damping throughout the water column ==! 114 DO jk = 1, jpkm1 115 DO jj = 2, jpjm1 116 DO ji = fs_2, fs_jpim1 ! vector opt. 117 ztra = restotr(ji,jj,jk) * ( ztrcdta(ji,jj,jk,jl) - trb(ji,jj,jk,jn) ) 118 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra 119 END DO 121 120 END DO 122 121 END DO 123 END DO124 !125 CASE ( 1 ) !== no damping in the turbocline (avt > 5 cm2/s) ==!126 DO jk = 1, jpkm1127 DO jj = 2, jpjm1128 DO ji = fs_2, fs_jpim1 ! vector opt.129 IF( avt(ji,jj,jk) <= 5.e-4 ) THEN130 ztra = restotr(ji,jj,jk) * ( trdta(ji,jj,jk,jn) - trb(ji,jj,jk,jn) )131 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra132 END IF122 ! 123 CASE ( 1 ) !== no damping in the turbocline (avt > 5 cm2/s) ==! 124 DO jk = 1, jpkm1 125 DO jj = 2, jpjm1 126 DO ji = fs_2, fs_jpim1 ! vector opt. 127 IF( avt(ji,jj,jk) <= 5.e-4 ) THEN 128 ztra = restotr(ji,jj,jk) * ( ztrcdta(ji,jj,jk,jl) - trb(ji,jj,jk,jn) ) 129 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra 130 ENDIF 131 END DO 133 132 END DO 134 133 END DO 135 END DO136 !137 CASE ( 2 ) !== no damping in the mixed layer ==!138 DO jk = 1, jpkm1139 DO jj = 2, jpjm1140 DO ji = fs_2, fs_jpim1 ! vector opt.141 IF( fsdept(ji,jj,jk) >= hmlp (ji,jj) ) THEN142 ztra = restotr(ji,jj,jk,jn) * ( trdta(ji,jj,jk,jn) - trb(ji,jj,jk,jn) )143 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra144 END IF134 ! 135 CASE ( 2 ) !== no damping in the mixed layer ==! 136 DO jk = 1, jpkm1 137 DO jj = 2, jpjm1 138 DO ji = fs_2, fs_jpim1 ! vector opt. 139 IF( fsdept(ji,jj,jk) >= hmlp (ji,jj) ) THEN 140 ztra = restotr(ji,jj,jk) * ( ztrcdta(ji,jj,jk,jl) - trb(ji,jj,jk,jn) ) 141 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra 142 END IF 143 END DO 145 144 END DO 146 145 END DO 147 END DO 148 ! 149 END SELECT 150 ! 151 ENDIF 152 ! 153 IF( l_trdtrc ) THEN 154 ztrtrd(:,:,:) = tra(:,:,:,jn) - ztrtrd(:,:,:) 155 CALL trd_tra( kt, 'TRC', jn, jptra_trd_dmp, ztrtrd ) 156 END IF 157 ! ! =========== 158 END DO ! tracer loop 159 ! ! =========== 146 ! 147 END SELECT 148 ! 149 ENDIF 150 ! 151 IF( l_trdtrc ) THEN 152 ztrtrd(:,:,:) = tra(:,:,:,jn) - ztrtrd(:,:,:) 153 CALL trd_tra( kt, 'TRC', jn, jptra_trd_dmp, ztrtrd ) 154 END IF 155 ! ! =========== 156 END DO ! tracer loop 157 ! ! =========== 158 CALL wrk_dealloc( jpi, jpj, jpk, nb_trcdta, ztrcdta ) 159 ENDIF 160 ! 160 161 IF( l_trdtrc ) CALL wrk_dealloc( jpi, jpj, jpk, ztrtrd ) 161 162 ! ! print mean trends (used for debugging) … … 168 169 ! 169 170 END SUBROUTINE trc_dmp 171 172 SUBROUTINE trc_dmp_clo( kt ) 173 !!--------------------------------------------------------------------- 174 !! *** ROUTINE trc_dmp_clo *** 175 !! 176 !! ** Purpose : Closed sea domain initialization 177 !! 178 !! ** Method : if a closed sea is located only in a model grid point 179 !! we restore to initial data 180 !! 181 !! ** Action : nctsi1(), nctsj1() : south-west closed sea limits (i,j) 182 !! nctsi2(), nctsj2() : north-east Closed sea limits (i,j) 183 !!---------------------------------------------------------------------- 184 INTEGER, INTENT( in ) :: kt ! ocean time-step index 185 ! 186 INTEGER :: ji, jj, jk, jn, jl, jc ! dummy loop indicesa 187 REAL(wp), POINTER, DIMENSION(:,:,:,:) :: ztrcdta ! 4D workspace 188 189 !!---------------------------------------------------------------------- 190 191 IF( kt == nit000 ) THEN 192 ! initial values 193 nctsi1(:) = 1 ; nctsi2(:) = 1 194 nctsj1(:) = 1 ; nctsj2(:) = 1 195 196 ! set the closed seas (in data domain indices) 197 ! ------------------- 198 199 IF( cp_cfg == "orca" ) THEN 200 ! 201 SELECT CASE ( jp_cfg ) 202 ! ! ======================= 203 CASE ( 2 ) ! ORCA_R2 configuration 204 ! ! ======================= 205 ! ! Caspian Sea 206 nctsi1(1) = 11 ; nctsj1(1) = 103 207 nctsi2(1) = 17 ; nctsj2(1) = 112 208 ! ! Great North American Lakes 209 nctsi1(2) = 97 ; nctsj1(2) = 107 210 nctsi2(2) = 103 ; nctsj2(2) = 111 211 ! ! Black Sea 1 : west part of the Black Sea 212 nctsi1(3) = 174 ; nctsj1(3) = 107 213 nctsi2(3) = 181 ; nctsj2(3) = 112 214 ! ! Black Sea 2 : est part of the Black Sea 215 nctsi1(4) = 2 ; nctsj1(4) = 107 216 nctsi2(4) = 6 ; nctsj2(4) = 112 217 ! ! Baltic Sea 218 nctsi1(5) = 145 ; nctsj1(5) = 116 219 nctsi2(5) = 150 ; nctsj2(5) = 126 220 ! ! ======================= 221 CASE ( 4 ) ! ORCA_R4 configuration 222 ! ! ======================= 223 ! ! Caspian Sea 224 nctsi1(1) = 4 ; nctsj1(1) = 53 225 nctsi2(1) = 4 ; nctsj2(1) = 56 226 ! ! Great North American Lakes 227 nctsi1(2) = 49 ; nctsj1(2) = 55 228 nctsi2(2) = 51 ; nctsj2(2) = 56 229 ! ! Black Sea 230 nctsi1(3) = 88 ; nctsj1(3) = 55 231 nctsi2(3) = 91 ; nctsj2(3) = 56 232 ! ! Baltic Sea 233 nctsi1(4) = 75 ; nctsj1(4) = 59 234 nctsi2(4) = 76 ; nctsj2(4) = 61 235 ! ! ======================= 236 CASE ( 025 ) ! ORCA_R025 configuration 237 ! ! ======================= 238 ! Caspian + Aral sea 239 nctsi1(1) = 1330 ; nctsj1(1) = 645 240 nctsi2(1) = 1400 ; nctsj2(1) = 795 241 ! ! Azov Sea 242 nctsi1(2) = 1284 ; nctsj1(2) = 722 243 nctsi2(2) = 1304 ; nctsj2(2) = 747 244 ! 245 END SELECT 246 ! 247 ENDIF 248 ! 249 250 ! convert the position in local domain indices 251 ! -------------------------------------------- 252 DO jc = 1, npncts 253 nctsi1(jc) = mi0( nctsi1(jc) ) 254 nctsj1(jc) = mj0( nctsj1(jc) ) 255 256 nctsi2(jc) = mi1( nctsi2(jc) ) 257 nctsj2(jc) = mj1( nctsj2(jc) ) 258 END DO 259 ! 260 ENDIF 261 262 ! Restore close seas values to initial data 263 IF( ln_trcdta .AND. nb_trcdta > 0 ) THEN ! Initialisation of tracer from a file that may also be used for damping 264 ! 265 IF(lwp) WRITE(numout,*) 266 IF(lwp) WRITE(numout,*) ' trc_dmp_clo : Restoring of nutrients on close seas at time-step kt = ', kt 267 IF(lwp) WRITE(numout,*) 268 ! 269 CALL wrk_alloc( jpi, jpj, jpk, nb_trcdta, ztrcdta ) ! Memory allocation 270 ! 271 CALL trc_dta( kt , ztrcdta ) ! read tracer data at nittrc000 272 ! 273 DO jn = 1, jptra 274 IF( ln_trc_ini(jn) ) THEN ! update passive tracers arrays with input data read from file 275 jl = n_trc_index(jn) 276 DO jc = 1, npncts 277 DO jk = 1, jpkm1 278 DO jj = nctsj1(jc), nctsj2(jc) 279 DO ji = nctsi1(jc), nctsi2(jc) 280 trn(ji,jj,jk,jn) = ztrcdta(ji,jj,jk,jl) * tmask(ji,jj,jk) 281 trb(ji,jj,jk,jn) = trn(ji,jj,jk,jn) 282 ENDDO 283 ENDDO 284 ENDDO 285 ENDDO 286 ENDIF 287 ENDDO 288 CALL wrk_dealloc( jpi, jpj, jpk, nb_trcdta, ztrcdta ) 289 ENDIF 290 ! 291 END SUBROUTINE trc_dmp_clo 170 292 171 293 … … 199 321 END SELECT 200 322 201 IF( .NOT. lk_dtatrc ) & 202 & CALL ctl_stop( 'no passive tracer data define key_dtatrc' ) 203 204 IF( .NOT. lk_tradmp ) & 323 IF( .NOT. ln_tradmp ) & 205 324 & CALL ctl_stop( 'passive trace damping need key_tradmp to compute damping coef.' ) 206 325 ! … … 214 333 ! 215 334 END SUBROUTINE trc_dmp_init 335 216 336 #else 217 337 !!---------------------------------------------------------------------- 218 !! Default key NO internal damping 219 !!---------------------------------------------------------------------- 220 LOGICAL , PUBLIC, PARAMETER :: lk_trcdmp = .FALSE. !: internal damping flag 338 !! Dummy module : No passive tracer 339 !!---------------------------------------------------------------------- 221 340 CONTAINS 222 341 SUBROUTINE trc_dmp( kt ) ! Empty routine … … 225 344 END SUBROUTINE trc_dmp 226 345 #endif 346 347 227 348 !!====================================================================== 228 349 END MODULE trcdmp -
branches/2012/dev_v3_4_STABLE_2012/NEMOGCM/NEMO/TOP_SRC/TRP/trcnam_trp.F90
r3294 r3881 13 13 !! trc_nam_trp : read the passive tracer namelist for transport 14 14 !!---------------------------------------------------------------------- 15 USE oce_trc 15 16 USE trc ! ocean passive tracers variables 16 17 USE in_out_manager ! ocean dynamics and active tracers variables … … 46 47 INTEGER , PUBLIC :: nn_trczdf_exp = 3 !: number of sub-time step (explicit time stepping) 47 48 48 49 #if defined key_trcdmp50 49 ! !!: ** newtonian damping namelist (nam_trcdmp) ** 51 50 INTEGER , PUBLIC :: nn_hdmp_tr = -1 ! = 0/-1/'latitude' for damping over passive tracer … … 55 54 REAL(wp), PUBLIC :: rn_dep_tr = 800. ! depth of transition between rn_surf and rn_bot [meters] 56 55 INTEGER , PUBLIC :: nn_file_tr = 2 ! = 1 create a damping.coeff NetCDF file 57 #endif58 56 59 57 !!---------------------------------------------------------------------- … … 80 78 NAMELIST/namtrc_zdf/ ln_trczdf_exp , nn_trczdf_exp 81 79 NAMELIST/namtrc_rad/ ln_trcrad 82 #if defined key_trcdmp83 80 NAMELIST/namtrc_dmp/ nn_hdmp_tr, nn_zdmp_tr, rn_surf_tr, & 84 81 & rn_bot_tr , rn_dep_tr , nn_file_tr 85 #endif86 82 !!---------------------------------------------------------------------- 87 83 … … 146 142 147 143 148 # if defined key_trcdmp149 144 REWIND ( numnat ) ! Read Namelist namtra_dmp : temperature and salinity damping term 150 145 READ ( numnat, namtrc_dmp ) 151 IF( lzoom ) nn_zdmp_tr c= 0 ! restoring to climatology at closed north or south boundaries146 IF( lzoom ) nn_zdmp_tr = 0 ! restoring to climatology at closed north or south boundaries 152 147 153 148 IF(lwp) THEN ! Namelist print … … 163 158 WRITE(numout,*) ' create a damping.coeff file nn_file_tr = ', nn_file_tr 164 159 ENDIF 165 #endif166 160 ! 167 161 END SUBROUTINE trc_nam_trp -
branches/2012/dev_v3_4_STABLE_2012/NEMOGCM/NEMO/TOP_SRC/TRP/trctrp.F90
r3294 r3881 65 65 CALL trc_sbc( kstp ) ! surface boundary condition 66 66 IF( lk_trabbl ) CALL trc_bbl( kstp ) ! advective (and/or diffusive) bottom boundary layer scheme 67 IF( lk_trcdmp ) CALL trc_dmp( kstp ) ! internal damping trends 67 IF( ln_trcdmp ) CALL trc_dmp( kstp ) ! internal damping trends 68 IF( ln_trcdmp_clo ) CALL trc_dmp_clo( kstp ) ! restoring on close seas 68 69 CALL trc_adv( kstp ) ! horizontal & vertical advection 69 70 CALL trc_ldf( kstp ) ! lateral mixing
Note: See TracChangeset
for help on using the changeset viewer.