- Timestamp:
- 2020-05-14T21:46:00+02:00 (4 years ago)
- Location:
- NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser
- Property svn:externals
-
old new 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL 8 9 # SETTE 10 ^/utils/CI/sette@HEAD sette
-
- Property svn:externals
-
NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/SBC/sbcrnf.F90
r12178 r12928 19 19 USE phycst ! physical constants 20 20 USE sbc_oce ! surface boundary condition variables 21 USE sbcisf ! PM we could remove it I think22 21 USE eosbn2 ! Equation Of State 23 USE closea 22 USE closea, ONLY: l_clo_rnf, clo_rnf ! closed seas 24 23 ! 25 24 USE in_out_manager ! I/O manager … … 43 42 REAL(wp) :: rn_dep_max !: depth over which runoffs is spread (ln_rnf_depth_ini =T) 44 43 INTEGER :: nn_rnf_depth_file !: create (=1) a runoff depth file or not (=0) 44 LOGICAL :: ln_rnf_icb !: iceberg flux is specified in a file 45 45 LOGICAL :: ln_rnf_tem !: temperature river runoffs attribute specified in a file 46 46 LOGICAL , PUBLIC :: ln_rnf_sal !: salinity river runoffs attribute specified in a file 47 47 TYPE(FLD_N) , PUBLIC :: sn_rnf !: information about the runoff file to be read 48 48 TYPE(FLD_N) :: sn_cnf !: information about the runoff mouth file to be read 49 TYPE(FLD_N) :: sn_i_rnf !: information about the iceberg flux file to be read 49 50 TYPE(FLD_N) :: sn_s_rnf !: information about the salinities of runoff file to be read 50 51 TYPE(FLD_N) :: sn_t_rnf !: information about the temperatures of runoff file to be read … … 65 66 66 67 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_rnf ! structure: river runoff (file information, fields read) 68 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_i_rnf ! structure: iceberg flux (file information, fields read) 67 69 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_s_rnf ! structure: river runoff salinity (file information, fields read) 68 70 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_t_rnf ! structure: river runoff temperature (file information, fields read) 69 71 72 !! * Substitutions 73 # include "do_loop_substitute.h90" 70 74 !!---------------------------------------------------------------------- 71 75 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 112 116 ! !-------------------! 113 117 ! 114 IF( .NOT. l_rnfcpl ) CALL fld_read ( kt, nn_fsbc, sf_rnf ) ! Read Runoffs data and provide it at kt 118 ! 119 IF( .NOT. l_rnfcpl ) THEN 120 CALL fld_read ( kt, nn_fsbc, sf_rnf ) ! Read Runoffs data and provide it at kt ( runoffs + iceberg ) 121 IF( ln_rnf_icb ) CALL fld_read ( kt, nn_fsbc, sf_i_rnf ) ! idem for iceberg flux if required 122 ENDIF 115 123 IF( ln_rnf_tem ) CALL fld_read ( kt, nn_fsbc, sf_t_rnf ) ! idem for runoffs temperature if required 116 124 IF( ln_rnf_sal ) CALL fld_read ( kt, nn_fsbc, sf_s_rnf ) ! idem for runoffs salinity if required … … 118 126 IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 119 127 ! 120 IF( .NOT. l_rnfcpl ) rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) * tmask(:,:,1) ! updated runoff value at time step kt 128 IF( .NOT. l_rnfcpl ) THEN 129 rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) * tmask(:,:,1) ! updated runoff value at time step kt 130 IF( ln_rnf_icb ) THEN 131 fwficb(:,:) = rn_rfact * ( sf_i_rnf(1)%fnow(:,:,1) ) * tmask(:,:,1) ! updated runoff value at time step kt 132 CALL iom_put( 'iceberg_cea' , fwficb(:,:) ) ! output iceberg flux 133 CALL iom_put( 'hflx_icb_cea' , fwficb(:,:) * rLfus ) ! output Heat Flux into Sea Water due to Iceberg Thermodynamics --> 134 ENDIF 135 ENDIF 121 136 ! 122 137 ! ! set temperature & salinity content of runoffs 123 138 IF( ln_rnf_tem ) THEN ! use runoffs temperature data 124 rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_r au0139 rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rho0 125 140 CALL eos_fzp( sss_m(:,:), ztfrz(:,:) ) 126 141 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp ) ! if missing data value use SST as runoffs temperature 127 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 128 END WHERE 129 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -222._wp ) ! where fwf comes from melting of ice shelves or iceberg 130 rnf_tsc(:,:,jp_tem) = ztfrz(:,:) * rnf(:,:) * r1_rau0 - rnf(:,:) * rLfusisf * r1_rau0_rcp 142 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rho0 131 143 END WHERE 132 144 ELSE ! use SST as runoffs temperature 133 145 !CEOD River is fresh water so must at least be 0 unless we consider ice 134 rnf_tsc(:,:,jp_tem) = MAX( sst_m(:,:),0.0_wp) * rnf(:,:) * r1_rau0146 rnf_tsc(:,:,jp_tem) = MAX( sst_m(:,:), 0.0_wp ) * rnf(:,:) * r1_rho0 135 147 ENDIF 136 148 ! ! use runoffs salinity data 137 IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_r au0149 IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rho0 138 150 ! ! else use S=0 for runoffs (done one for all in the init) 139 IF( iom_use('runoffs') )CALL iom_put( 'runoffs' , rnf(:,:) ) ! output runoff mass flux140 IF( iom_use('hflx_rnf_cea') ) CALL iom_put( 'hflx_rnf_cea', rnf_tsc(:,:,jp_tem) * r au0 * rcp ) ! output runoff sensible heat (W/m2)151 CALL iom_put( 'runoffs' , rnf(:,:) ) ! output runoff mass flux 152 IF( iom_use('hflx_rnf_cea') ) CALL iom_put( 'hflx_rnf_cea', rnf_tsc(:,:,jp_tem) * rho0 * rcp ) ! output runoff sensible heat (W/m2) 141 153 ENDIF 142 154 ! … … 173 185 174 186 175 SUBROUTINE sbc_rnf_div( phdivn )187 SUBROUTINE sbc_rnf_div( phdivn, Kmm ) 176 188 !!---------------------------------------------------------------------- 177 189 !! *** ROUTINE sbc_rnf *** … … 185 197 !! ** Action : phdivn decreased by the runoff inflow 186 198 !!---------------------------------------------------------------------- 199 INTEGER , INTENT(in ) :: Kmm ! ocean time level index 187 200 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: phdivn ! horizontal divergence 188 201 !! … … 195 208 IF( ln_rnf_depth .OR. ln_rnf_depth_ini ) THEN !== runoff distributed over several levels ==! 196 209 IF( ln_linssh ) THEN !* constant volume case : just apply the runoff input flow 197 DO jj = 1, jpj 198 DO ji = 1, jpi 199 DO jk = 1, nk_rnf(ji,jj) 200 phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_rau0 / h_rnf(ji,jj) 201 END DO 210 DO_2D_11_11 211 DO jk = 1, nk_rnf(ji,jj) 212 phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_rho0 / h_rnf(ji,jj) 202 213 END DO 203 END DO214 END_2D 204 215 ELSE !* variable volume case 205 DO jj = 1, jpj ! update the depth over which runoffs are distributed 206 DO ji = 1, jpi 207 h_rnf(ji,jj) = 0._wp 208 DO jk = 1, nk_rnf(ji,jj) ! recalculates h_rnf to be the depth in metres 209 h_rnf(ji,jj) = h_rnf(ji,jj) + e3t_n(ji,jj,jk) ! to the bottom of the relevant grid box 210 END DO 211 ! ! apply the runoff input flow 212 DO jk = 1, nk_rnf(ji,jj) 213 phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_rau0 / h_rnf(ji,jj) 214 END DO 216 DO_2D_11_11 217 h_rnf(ji,jj) = 0._wp 218 DO jk = 1, nk_rnf(ji,jj) ! recalculates h_rnf to be the depth in metres 219 h_rnf(ji,jj) = h_rnf(ji,jj) + e3t(ji,jj,jk,Kmm) ! to the bottom of the relevant grid box 215 220 END DO 216 END DO 221 ! ! apply the runoff input flow 222 DO jk = 1, nk_rnf(ji,jj) 223 phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_rho0 / h_rnf(ji,jj) 224 END DO 225 END_2D 217 226 ENDIF 218 227 ELSE !== runoff put only at the surface ==! 219 h_rnf (:,:) = e3t _n (:,:,1) ! update h_rnf to be depth of top box220 phdivn(:,:,1) = phdivn(:,:,1) - ( rnf(:,:) + rnf_b(:,:) ) * zfact * r1_r au0 / e3t_n(:,:,1)228 h_rnf (:,:) = e3t (:,:,1,Kmm) ! update h_rnf to be depth of top box 229 phdivn(:,:,1) = phdivn(:,:,1) - ( rnf(:,:) + rnf_b(:,:) ) * zfact * r1_rho0 / e3t(:,:,1,Kmm) 221 230 ENDIF 222 231 ! … … 224 233 225 234 226 SUBROUTINE sbc_rnf_init 235 SUBROUTINE sbc_rnf_init( Kmm ) 227 236 !!---------------------------------------------------------------------- 228 237 !! *** ROUTINE sbc_rnf_init *** … … 234 243 !! ** Action : - read parameters 235 244 !!---------------------------------------------------------------------- 245 INTEGER, INTENT(in) :: Kmm ! ocean time level index 236 246 CHARACTER(len=32) :: rn_dep_file ! runoff file name 237 247 INTEGER :: ji, jj, jk, jm ! dummy loop indices … … 242 252 REAL(wp), DIMENSION(jpi,jpj,2) :: zrnfcl 243 253 !! 244 NAMELIST/namsbc_rnf/ cn_dir , ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, &245 & sn_rnf, sn_cnf , sn_ s_rnf , sn_t_rnf , sn_dep_rnf, &254 NAMELIST/namsbc_rnf/ cn_dir , ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, ln_rnf_icb, & 255 & sn_rnf, sn_cnf , sn_i_rnf, sn_s_rnf , sn_t_rnf , sn_dep_rnf, & 246 256 & ln_rnf_mouth , rn_hrnf , rn_avt_rnf, rn_rfact, & 247 257 & ln_rnf_depth_ini , rn_dep_max , rn_rnf_max, nn_rnf_depth_file … … 265 275 ! ! ============ 266 276 ! 267 REWIND( numnam_ref ) ! Namelist namsbc_rnf in reference namelist : Runoffs268 277 READ ( numnam_ref, namsbc_rnf, IOSTAT = ios, ERR = 901) 269 278 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_rnf in reference namelist' ) 270 279 271 REWIND( numnam_cfg ) ! Namelist namsbc_rnf in configuration namelist : Runoffs272 280 READ ( numnam_cfg, namsbc_rnf, IOSTAT = ios, ERR = 902 ) 273 281 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namsbc_rnf in configuration namelist' ) … … 299 307 IF( sn_rnf%ln_tint ) ALLOCATE( sf_rnf(1)%fdta(jpi,jpj,1,2) ) 300 308 CALL fld_fill( sf_rnf, (/ sn_rnf /), cn_dir, 'sbc_rnf_init', 'read runoffs data', 'namsbc_rnf', no_print ) 309 ! 310 IF( ln_rnf_icb ) THEN ! Create (if required) sf_i_rnf structure 311 IF(lwp) WRITE(numout,*) 312 IF(lwp) WRITE(numout,*) ' iceberg flux read in a file' 313 ALLOCATE( sf_i_rnf(1), STAT=ierror ) 314 IF( ierror > 0 ) THEN 315 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_i_rnf structure' ) ; RETURN 316 ENDIF 317 ALLOCATE( sf_i_rnf(1)%fnow(jpi,jpj,1) ) 318 IF( sn_i_rnf%ln_tint ) ALLOCATE( sf_i_rnf(1)%fdta(jpi,jpj,1,2) ) 319 CALL fld_fill (sf_i_rnf, (/ sn_i_rnf /), cn_dir, 'sbc_rnf_init', 'read iceberg flux data', 'namsbc_rnf' ) 320 ELSE 321 fwficb(:,:) = 0._wp 322 ENDIF 323 301 324 ENDIF 302 325 ! … … 337 360 ! 338 361 nk_rnf(:,:) = 0 ! set the number of level over which river runoffs are applied 339 DO jj = 1, jpj 340 DO ji = 1, jpi 341 IF( h_rnf(ji,jj) > 0._wp ) THEN 342 jk = 2 343 DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 344 END DO 345 nk_rnf(ji,jj) = jk 346 ELSEIF( h_rnf(ji,jj) == -1._wp ) THEN ; nk_rnf(ji,jj) = 1 347 ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN ; nk_rnf(ji,jj) = mbkt(ji,jj) 348 ELSE 349 CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 350 WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 351 ENDIF 362 DO_2D_11_11 363 IF( h_rnf(ji,jj) > 0._wp ) THEN 364 jk = 2 365 DO WHILE ( jk < mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 366 END DO 367 nk_rnf(ji,jj) = jk 368 ELSEIF( h_rnf(ji,jj) == -1._wp ) THEN ; nk_rnf(ji,jj) = 1 369 ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN ; nk_rnf(ji,jj) = mbkt(ji,jj) 370 ELSE 371 CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 372 WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 373 ENDIF 374 END_2D 375 DO_2D_11_11 376 h_rnf(ji,jj) = 0._wp 377 DO jk = 1, nk_rnf(ji,jj) 378 h_rnf(ji,jj) = h_rnf(ji,jj) + e3t(ji,jj,jk,Kmm) 352 379 END DO 353 END DO 354 DO jj = 1, jpj ! set the associated depth 355 DO ji = 1, jpi 356 h_rnf(ji,jj) = 0._wp 357 DO jk = 1, nk_rnf(ji,jj) 358 h_rnf(ji,jj) = h_rnf(ji,jj) + e3t_n(ji,jj,jk) 359 END DO 360 END DO 361 END DO 380 END_2D 362 381 ! 363 382 ELSE IF( ln_rnf_depth_ini ) THEN ! runoffs applied at the surface … … 384 403 WHERE( zrnfcl(:,:,1) > 0._wp ) h_rnf(:,:) = zacoef * zrnfcl(:,:,1) ! compute depth for all runoffs 385 404 ! 386 DO jj = 1, jpj ! take in account min depth of ocean rn_hmin 387 DO ji = 1, jpi 388 IF( zrnfcl(ji,jj,1) > 0._wp ) THEN 389 jk = mbkt(ji,jj) 390 h_rnf(ji,jj) = MIN( h_rnf(ji,jj), gdept_0(ji,jj,jk ) ) 391 ENDIF 405 DO_2D_11_11 406 IF( zrnfcl(ji,jj,1) > 0._wp ) THEN 407 jk = mbkt(ji,jj) 408 h_rnf(ji,jj) = MIN( h_rnf(ji,jj), gdept_0(ji,jj,jk ) ) 409 ENDIF 410 END_2D 411 ! 412 nk_rnf(:,:) = 0 ! number of levels on which runoffs are distributed 413 DO_2D_11_11 414 IF( zrnfcl(ji,jj,1) > 0._wp ) THEN 415 jk = 2 416 DO WHILE ( jk < mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 417 END DO 418 nk_rnf(ji,jj) = jk 419 ELSE 420 nk_rnf(ji,jj) = 1 421 ENDIF 422 END_2D 423 ! 424 DO_2D_11_11 425 h_rnf(ji,jj) = 0._wp 426 DO jk = 1, nk_rnf(ji,jj) 427 h_rnf(ji,jj) = h_rnf(ji,jj) + e3t(ji,jj,jk,Kmm) 392 428 END DO 393 END DO 394 ! 395 nk_rnf(:,:) = 0 ! number of levels on which runoffs are distributed 396 DO jj = 1, jpj 397 DO ji = 1, jpi 398 IF( zrnfcl(ji,jj,1) > 0._wp ) THEN 399 jk = 2 400 DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 401 END DO 402 nk_rnf(ji,jj) = jk 403 ELSE 404 nk_rnf(ji,jj) = 1 405 ENDIF 406 END DO 407 END DO 408 ! 409 DO jj = 1, jpj ! set the associated depth 410 DO ji = 1, jpi 411 h_rnf(ji,jj) = 0._wp 412 DO jk = 1, nk_rnf(ji,jj) 413 h_rnf(ji,jj) = h_rnf(ji,jj) + e3t_n(ji,jj,jk) 414 END DO 415 END DO 416 END DO 429 END_2D 417 430 ! 418 431 IF( nn_rnf_depth_file == 1 ) THEN ! save output nb levels for runoff … … 424 437 ELSE ! runoffs applied at the surface 425 438 nk_rnf(:,:) = 1 426 h_rnf (:,:) = e3t _n(:,:,1)439 h_rnf (:,:) = e3t(:,:,1,Kmm) 427 440 ENDIF 428 441 ! … … 439 452 ! ! - mixed upstream-centered (ln_traadv_cen2=T) 440 453 ! 441 IF 454 IF( ln_rnf_depth ) CALL ctl_warn( 'sbc_rnf_init: increased mixing turned on but effects may already', & 442 455 & 'be spread through depth by ln_rnf_depth' ) 443 456 !
Note: See TracChangeset
for help on using the changeset viewer.