Changeset 3598 for trunk/NEMOGCM/NEMO/OPA_SRC/SBC
- Timestamp:
- 2012-11-19T14:35:09+01:00 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90
r3421 r3598 6 6 !! History : OPA ! 2000-11 (R. Hordoir, E. Durand) NetCDF FORMAT 7 7 !! NEMO 1.0 ! 2002-09 (G. Madec) F90: Free form and module 8 !! 3.0 ! 2006-07 (G. Madec) Surface module 8 !! 3.0 ! 2006-07 (G. Madec) Surface module 9 9 !! 3.2 ! 2009-04 (B. Lemaire) Introduce iom_put 10 10 !! 3.3 ! 2010-10 (R. Furner, G. Madec) runoff distributed over ocean levels … … 32 32 PUBLIC sbc_rnf_div ! routine called in sshwzv module 33 33 PUBLIC sbc_rnf_alloc ! routine call in sbcmod module 34 34 PUBLIC sbc_rnf_init ! (PUBLIC for TAM) 35 35 ! !!* namsbc_rnf namelist * 36 36 CHARACTER(len=100), PUBLIC :: cn_dir = './' !: Root directory for location of ssr files 37 37 LOGICAL , PUBLIC :: ln_rnf_depth = .false. !: depth river runoffs attribute specified in a file 38 LOGICAL , PUBLIC :: ln_rnf_tem = .false. !: temperature river runoffs attribute specified in a file 39 LOGICAL , PUBLIC :: ln_rnf_sal = .false. !: salinity river runoffs attribute specified in a file 38 LOGICAL , PUBLIC :: ln_rnf_tem = .false. !: temperature river runoffs attribute specified in a file 39 LOGICAL , PUBLIC :: ln_rnf_sal = .false. !: salinity river runoffs attribute specified in a file 40 40 LOGICAL , PUBLIC :: ln_rnf_emp = .false. !: runoffs into a file to be read or already into precipitation 41 41 TYPE(FLD_N) , PUBLIC :: sn_rnf !: information about the runoff file to be read 42 42 TYPE(FLD_N) , PUBLIC :: sn_cnf !: information about the runoff mouth file to be read 43 TYPE(FLD_N) :: sn_s_rnf !: information about the salinities of runoff file to be read 44 TYPE(FLD_N) :: sn_t_rnf !: information about the temperatures of runoff file to be read 43 TYPE(FLD_N) :: sn_s_rnf !: information about the salinities of runoff file to be read 44 TYPE(FLD_N) :: sn_t_rnf !: information about the temperatures of runoff file to be read 45 45 TYPE(FLD_N) :: sn_dep_rnf !: information about the depth which river inflow affects 46 46 LOGICAL , PUBLIC :: ln_rnf_mouth = .false. !: specific treatment in mouths vicinity … … 55 55 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: nk_rnf !: depth of runoff in model levels 56 56 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: rnf_tsc_b, rnf_tsc !: before and now T & S runoff contents [K.m/s & PSU.m/s] 57 58 REAL(wp) :: r1_rau0 ! = 1 / rau0 59 60 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_rnf ! structure: river runoff (file information, fields read)61 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_s_rnf ! structure: river runoff salinity (file information, fields read)62 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_t_rnf ! structure: river runoff temperature (file information, fields read)63 64 !! * Substitutions 65 # include "domzgr_substitute.h90" 57 58 REAL(wp) :: r1_rau0 ! = 1 / rau0 59 60 TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) :: sf_rnf ! structure: river runoff (file information, fields read) (PUBLIC for TAM) 61 TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) :: sf_s_rnf ! structure: river runoff salinity (file information, fields read) (PUBLIC for TAM) 62 TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) :: sf_t_rnf ! structure: river runoff temperature (file information, fields read) (PUBLIC for TAM) 63 64 !! * Substitutions 65 # include "domzgr_substitute.h90" 66 66 !!---------------------------------------------------------------------- 67 67 !! NEMO/OPA 3.3 , NEMO Consortium (2010) … … 86 86 !!---------------------------------------------------------------------- 87 87 !! *** ROUTINE sbc_rnf *** 88 !! 88 !! 89 89 !! ** Purpose : Introduce a climatological run off forcing 90 90 !! 91 !! ** Method : Set each river mouth with a monthly climatology 91 !! ** Method : Set each river mouth with a monthly climatology 92 92 !! provided from different data. 93 93 !! CAUTION : upward water flux, runoff forced to be < 0 … … 99 99 INTEGER :: ji, jj ! dummy loop indices 100 100 !!---------------------------------------------------------------------- 101 ! 101 ! 102 102 IF( kt == nit000 ) CALL sbc_rnf_init ! Read namelist and allocate structures 103 103 … … 114 114 ! !-------------------! 115 115 ! 116 CALL fld_read ( kt, nn_fsbc, sf_rnf ) ! Read Runoffs data and provide it at kt 116 CALL fld_read ( kt, nn_fsbc, sf_rnf ) ! Read Runoffs data and provide it at kt 117 117 IF( ln_rnf_tem ) CALL fld_read ( kt, nn_fsbc, sf_t_rnf ) ! idem for runoffs temperature if required 118 118 IF( ln_rnf_sal ) CALL fld_read ( kt, nn_fsbc, sf_s_rnf ) ! idem for runoffs salinity if required … … 127 127 ! 128 128 IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 129 rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) 129 rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) 130 130 ! 131 131 r1_rau0 = 1._wp / rau0 … … 133 133 IF( ln_rnf_tem ) THEN ! use runoffs temperature data 134 134 rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 135 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999 ) ! if missing data value use SST as runoffs temperature 135 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999 ) ! if missing data value use SST as runoffs temperature 136 136 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 137 137 END WHERE 138 138 ELSE ! use SST as runoffs temperature 139 139 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 140 ENDIF 141 ! ! use runoffs salinity data 140 ENDIF 141 ! ! use runoffs salinity data 142 142 IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 143 143 ! ! else use S=0 for runoffs (done one for all in the init) 144 144 ! 145 145 IF( ln_rnf_tem .OR. ln_rnf_sal ) THEN ! runoffs as outflow: use ocean SST and SSS 146 WHERE( rnf(:,:) < 0._wp ) ! example baltic model when flow is out of domain 146 WHERE( rnf(:,:) < 0._wp ) ! example baltic model when flow is out of domain 147 147 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 148 148 rnf_tsc(:,:,jp_sal) = sss_m(:,:) * rnf(:,:) * r1_rau0 … … 158 158 ! ! ---------------------------------------- ! 159 159 IF( ln_rstart .AND. & !* Restart: read in restart file 160 & iom_varid( numror, 'rnf_b', ldstop = .FALSE. ) > 0 ) THEN 160 & iom_varid( numror, 'rnf_b', ldstop = .FALSE. ) > 0 ) THEN 161 161 IF(lwp) WRITE(numout,*) ' nit000-1 runoff forcing fields red in the restart file' 162 162 CALL iom_get( numror, jpdom_autoglo, 'rnf_b', rnf_b ) ! before runoff … … 165 165 ELSE !* no restart: set from nit000 values 166 166 IF(lwp) WRITE(numout,*) ' nit000-1 runoff forcing fields set to nit000' 167 rnf_b (:,: ) = rnf (:,: ) 168 rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:) 167 rnf_b (:,: ) = rnf (:,: ) 168 rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:) 169 169 ENDIF 170 170 ENDIF … … 187 187 !!---------------------------------------------------------------------- 188 188 !! *** ROUTINE sbc_rnf *** 189 !! 189 !! 190 190 !! ** Purpose : update the horizontal divergence with the runoff inflow 191 191 !! 192 !! ** Method : 193 !! CAUTION : rnf is positive (inflow) decreasing the 192 !! ** Method : 193 !! CAUTION : rnf is positive (inflow) decreasing the 194 194 !! divergence and expressed in m/s 195 195 !! … … 207 207 r1_rau0 = 1._wp / rau0 208 208 IF( ln_rnf_depth ) THEN !== runoff distributed over several levels ==! 209 IF( lk_vvl ) THEN ! variable volume case 209 IF( lk_vvl ) THEN ! variable volume case 210 210 DO jj = 1, jpj ! update the depth over which runoffs are distributed 211 211 DO ji = 1, jpi 212 h_rnf(ji,jj) = 0._wp 212 h_rnf(ji,jj) = 0._wp 213 213 DO jk = 1, nk_rnf(ji,jj) ! recalculates h_rnf to be the depth in metres 214 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) ! to the bottom of the relevant grid box 215 END DO 214 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) ! to the bottom of the relevant grid box 215 END DO 216 216 ! ! apply the runoff input flow 217 217 DO jk = 1, nk_rnf(ji,jj) … … 249 249 !! ** Action : - read parameters 250 250 !!---------------------------------------------------------------------- 251 CHARACTER(len=32) :: rn_dep_file ! runoff file name 251 CHARACTER(len=32) :: rn_dep_file ! runoff file name 252 252 INTEGER :: ji, jj, jk ! dummy loop indices 253 253 INTEGER :: ierror, inum ! temporary integer 254 !! 254 !! 255 255 NAMELIST/namsbc_rnf/ cn_dir, ln_rnf_emp, ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, & 256 & sn_rnf, sn_cnf , sn_s_rnf , sn_t_rnf , sn_dep_rnf, & 257 & ln_rnf_mouth , rn_hrnf , rn_avt_rnf, rn_rfact 256 & sn_rnf, sn_cnf , sn_s_rnf , sn_t_rnf , sn_dep_rnf, & 257 & ln_rnf_mouth , rn_hrnf , rn_avt_rnf, rn_rfact 258 258 !!---------------------------------------------------------------------- 259 259 … … 267 267 sn_cnf = FLD_N( 'runoffs', 0 , 'sorunoff' , .FALSE. , .true. , 'yearly' , '' , '' ) 268 268 269 sn_s_rnf = FLD_N( 'runoffs', 24. , 'rosaline' , .TRUE. , .true. , 'yearly' , '' , '' ) 270 sn_t_rnf = FLD_N( 'runoffs', 24. , 'rotemper' , .TRUE. , .true. , 'yearly' , '' , '' ) 271 sn_dep_rnf = FLD_N( 'runoffs', 0. , 'rodepth' , .FALSE. , .true. , 'yearly' , '' , '' ) 269 sn_s_rnf = FLD_N( 'runoffs', 24. , 'rosaline' , .TRUE. , .true. , 'yearly' , '' , '' ) 270 sn_t_rnf = FLD_N( 'runoffs', 24. , 'rotemper' , .TRUE. , .true. , 'yearly' , '' , '' ) 271 sn_dep_rnf = FLD_N( 'runoffs', 0. , 'rodepth' , .FALSE. , .true. , 'yearly' , '' , '' ) 272 272 ! 273 273 REWIND ( numnam ) ! Read Namelist namsbc_rnf … … 284 284 WRITE(numout,*) ' river mouth additional Kz rn_avt_rnf = ', rn_avt_rnf 285 285 WRITE(numout,*) ' depth of river mouth additional mixing rn_hrnf = ', rn_hrnf 286 WRITE(numout,*) ' multiplicative factor for runoff rn_rfact = ', rn_rfact 286 WRITE(numout,*) ' multiplicative factor for runoff rn_rfact = ', rn_rfact 287 287 ENDIF 288 288 … … 297 297 IF(lwp) WRITE(numout,*) ' runoffs directly provided in the precipitations' 298 298 IF( ln_rnf_depth .OR. ln_rnf_tem .OR. ln_rnf_sal ) THEN 299 CALL ctl_warn( 'runoffs already included in precipitations, so runoff (T,S, depth) attributes will not be used' ) 299 CALL ctl_warn( 'runoffs already included in precipitations, so runoff (T,S, depth) attributes will not be used' ) 300 300 ln_rnf_depth = .FALSE. ; ln_rnf_tem = .FALSE. ; ln_rnf_sal = .FALSE. 301 301 ENDIF … … 323 323 ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1) ) 324 324 IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) ) 325 CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 325 CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 326 326 ENDIF 327 327 ! … … 335 335 ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1) ) 336 336 IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) ) 337 CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 338 ENDIF 339 ! 340 IF( ln_rnf_depth ) THEN ! depth of runoffs set from a file 337 CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 338 ENDIF 339 ! 340 IF( ln_rnf_depth ) THEN ! depth of runoffs set from a file 341 341 IF(lwp) WRITE(numout,*) 342 342 IF(lwp) WRITE(numout,*) ' runoffs depth read in a file' 343 rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 344 CALL iom_open ( rn_dep_file, inum ) ! open file 345 CALL iom_get ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf ) ! read the river mouth array 346 CALL iom_close( inum ) ! close file 343 rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 344 CALL iom_open ( rn_dep_file, inum ) ! open file 345 CALL iom_get ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf ) ! read the river mouth array 346 CALL iom_close( inum ) ! close file 347 347 ! 348 348 nk_rnf(:,:) = 0 ! set the number of level over which river runoffs are applied 349 DO jj = 1, jpj 350 DO ji = 1, jpi 351 IF( h_rnf(ji,jj) > 0._wp ) THEN 352 jk = 2 353 DO WHILE ( jk /= mbkt(ji,jj) .AND. fsdept(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 ; END DO 354 nk_rnf(ji,jj) = jk 355 ELSEIF( h_rnf(ji,jj) == -1 ) THEN ; nk_rnf(ji,jj) = 1 349 DO jj = 1, jpj 350 DO ji = 1, jpi 351 IF( h_rnf(ji,jj) > 0._wp ) THEN 352 jk = 2 353 DO WHILE ( jk /= mbkt(ji,jj) .AND. fsdept(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 ; END DO 354 nk_rnf(ji,jj) = jk 355 ELSEIF( h_rnf(ji,jj) == -1 ) THEN ; nk_rnf(ji,jj) = 1 356 356 ELSEIF( h_rnf(ji,jj) == -999 ) THEN ; nk_rnf(ji,jj) = mbkt(ji,jj) 357 ELSEIF( h_rnf(ji,jj) /= 0 ) THEN 358 CALL ctl_stop( 'runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 359 WRITE(999,*) 'ji, jj, rnf(ji,jj) :', ji, jj, rnf(ji,jj) 360 ENDIF 361 END DO 362 END DO 363 DO jj = 1, jpj ! set the associated depth 364 DO ji = 1, jpi 357 ELSEIF( h_rnf(ji,jj) /= 0 ) THEN 358 CALL ctl_stop( 'runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 359 WRITE(999,*) 'ji, jj, rnf(ji,jj) :', ji, jj, rnf(ji,jj) 360 ENDIF 361 END DO 362 END DO 363 DO jj = 1, jpj ! set the associated depth 364 DO ji = 1, jpi 365 365 h_rnf(ji,jj) = 0._wp 366 DO jk = 1, nk_rnf(ji,jj) 367 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 366 DO jk = 1, nk_rnf(ji,jj) 367 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 368 368 END DO 369 369 END DO 370 370 END DO 371 ELSE ! runoffs applied at the surface 372 nk_rnf(:,:) = 1 371 ELSE ! runoffs applied at the surface 372 nk_rnf(:,:) = 1 373 373 h_rnf (:,:) = fse3t(:,:,1) 374 ENDIF 375 ! 374 ENDIF 375 ! 376 376 ENDIF 377 377 ! … … 389 389 ! 390 390 IF ( ln_rnf_depth ) CALL ctl_warn( 'sbc_rnf_init: increased mixing turned on but effects may already', & 391 & 'be spread through depth by ln_rnf_depth' ) 391 & 'be spread through depth by ln_rnf_depth' ) 392 392 ! 393 393 nkrnf = 0 ! Number of level over which Kz increase … … 410 410 IF(lwp) WRITE(numout,*) 411 411 IF(lwp) WRITE(numout,*) ' No specific treatment at river mouths' 412 rnfmsk (:,:) = 0._wp 412 rnfmsk (:,:) = 0._wp 413 413 rnfmsk_z(:) = 0._wp 414 414 nkrnf = 0 … … 421 421 !!---------------------------------------------------------------------- 422 422 !! *** ROUTINE rnf_mouth *** 423 !! 423 !! 424 424 !! ** Purpose : define the river mouths mask 425 425 !! 426 426 !! ** Method : read the river mouth mask (=0/1) in the river runoff 427 !! climatological file. Defined a given vertical structure. 428 !! CAUTION, the vertical structure is hard coded on the 427 !! climatological file. Defined a given vertical structure. 428 !! CAUTION, the vertical structure is hard coded on the 429 429 !! first 5 levels. 430 430 !! This fields can be used to: 431 !! - set an upstream advection scheme 431 !! - set an upstream advection scheme 432 432 !! (ln_rnf_mouth=T and ln_traadv_cen2=T) 433 !! - increase vertical on the top nn_krnf vertical levels 433 !! - increase vertical on the top nn_krnf vertical levels 434 434 !! at river runoff input grid point (nn_krnf>=2, see step.F90) 435 435 !! - set to zero SSS restoring flux at river mouth grid points … … 442 442 CHARACTER(len=140) :: cl_rnfile ! runoff file name 443 443 !!---------------------------------------------------------------------- 444 ! 444 ! 445 445 IF(lwp) WRITE(numout,*) 446 446 IF(lwp) WRITE(numout,*) 'rnf_mouth : river mouth mask' … … 451 451 IF( sn_cnf%cltype == 'monthly' ) WRITE(cl_rnfile, '(a,"m",i2)' ) TRIM( cl_rnfile ), nmonth ! add month 452 452 ENDIF 453 453 454 454 ! horizontal mask (read in NetCDF file) 455 455 CALL iom_open ( cl_rnfile, inum ) ! open file 456 456 CALL iom_get ( inum, jpdom_data, sn_cnf%clvar, rnfmsk ) ! read the river mouth array 457 457 CALL iom_close( inum ) ! close file 458 458 459 459 IF( nn_closea == 1 ) CALL clo_rnf( rnfmsk ) ! closed sea inflow set as ruver mouth 460 460 461 rnfmsk_z(:) = 0._wp ! vertical structure 461 rnfmsk_z(:) = 0._wp ! vertical structure 462 462 rnfmsk_z(1) = 1.0 463 463 rnfmsk_z(2) = 1.0 ! ********** … … 465 465 rnfmsk_z(4) = 0.25 ! ********** 466 466 rnfmsk_z(5) = 0.125 467 ! 467 ! 468 468 END SUBROUTINE rnf_mouth 469 469 470 470 !!====================================================================== 471 471 END MODULE sbcrnf
Note: See TracChangeset
for help on using the changeset viewer.