- Timestamp:
- 2015-06-10T22:06:39+02:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2015/dev_r5218_CNRS17_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90
r5381 r5403 32 32 33 33 PUBLIC sbc_rnf ! routine call in sbcmod module 34 PUBLIC sbc_rnf_div ! routine called in sshwzvmodule34 PUBLIC sbc_rnf_div ! routine called in divcurl module 35 35 PUBLIC sbc_rnf_alloc ! routine call in sbcmod module 36 36 PUBLIC sbc_rnf_init ! (PUBLIC for TAM) … … 40 40 LOGICAL , PUBLIC :: ln_rnf_tem !: temperature river runoffs attribute specified in a file 41 41 LOGICAL , PUBLIC :: ln_rnf_sal !: salinity river runoffs attribute specified in a file 42 LOGICAL , PUBLIC :: ln_rnf_emp !: runoffs into a file to be read or already into precipitation43 42 TYPE(FLD_N) , PUBLIC :: sn_rnf !: information about the runoff file to be read 44 43 TYPE(FLD_N) , PUBLIC :: sn_cnf !: information about the runoff mouth file to be read … … 118 117 ENDIF 119 118 120 ! !-------------------! 121 IF( .NOT. ln_rnf_emp ) THEN ! Update runoff ! 122 ! !-------------------! 123 ! 124 IF( .NOT. l_rnfcpl ) CALL fld_read ( kt, nn_fsbc, sf_rnf ) ! Read Runoffs data and provide it at kt 125 IF( ln_rnf_tem ) CALL fld_read ( kt, nn_fsbc, sf_t_rnf ) ! idem for runoffs temperature if required 126 IF( ln_rnf_sal ) CALL fld_read ( kt, nn_fsbc, sf_s_rnf ) ! idem for runoffs salinity if required 127 ! 128 ! Runoff reduction only associated to the ORCA2_LIM configuration 129 ! when reading the NetCDF file runoff_1m_nomask.nc 130 IF( cp_cfg == 'orca' .AND. jp_cfg == 2 .AND. .NOT. l_rnfcpl ) THEN 131 WHERE( 40._wp < gphit(:,:) .AND. gphit(:,:) < 65._wp ) 132 sf_rnf(1)%fnow(:,:,1) = 0.85 * sf_rnf(1)%fnow(:,:,1) 119 ! !-------------------! 120 ! ! Update runoff ! 121 ! !-------------------! 122 ! 123 IF( .NOT. l_rnfcpl ) CALL fld_read ( kt, nn_fsbc, sf_rnf ) ! Read Runoffs data and provide it at kt 124 IF( ln_rnf_tem ) CALL fld_read ( kt, nn_fsbc, sf_t_rnf ) ! idem for runoffs temperature if required 125 IF( ln_rnf_sal ) CALL fld_read ( kt, nn_fsbc, sf_s_rnf ) ! idem for runoffs salinity if required 126 ! 127 ! Runoff reduction only associated to the ORCA2_LIM configuration 128 ! when reading the NetCDF file runoff_1m_nomask.nc 129 IF( cp_cfg == 'orca' .AND. jp_cfg == 2 .AND. .NOT. l_rnfcpl ) THEN 130 WHERE( 40._wp < gphit(:,:) .AND. gphit(:,:) < 65._wp ) 131 sf_rnf(1)%fnow(:,:,1) = 0.85 * sf_rnf(1)%fnow(:,:,1) 132 END WHERE 133 ENDIF 134 ! 135 IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 136 ! 137 IF( .NOT. l_rnfcpl ) rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) ! updated runoff value at time step kt 138 ! 139 ! ! set temperature & salinity content of runoffs 140 IF( ln_rnf_tem ) THEN ! use runoffs temperature data 141 rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 142 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp ) ! if missing data value use SST as runoffs temperature 143 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 133 144 END WHERE 134 ENDIF 135 ! 136 IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 137 ! 138 IF( .NOT. l_rnfcpl ) rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) ! updated runoff value at time step kt 139 ! 140 ! ! set temperature & salinity content of runoffs 141 IF( ln_rnf_tem ) THEN ! use runoffs temperature data 142 rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 143 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp ) ! if missing data value use SST as runoffs temperature 144 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 145 END WHERE 146 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -222._wp ) ! where fwf comes from melting of ice shelves or iceberg 147 ztfrz(:,:) = -1.9 !tfreez( sss_m(:,:) ) !PM to be discuss (trouble if sensitivity study) 148 rnf_tsc(:,:,jp_tem) = ztfrz(:,:) * rnf(:,:) * r1_rau0 - rnf(:,:) * lfusisf * r1_rau0_rcp 149 END WHERE 150 ELSE ! use SST as runoffs temperature 151 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 152 ENDIF 153 ! ! use runoffs salinity data 154 IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 155 ! ! else use S=0 for runoffs (done one for all in the init) 156 CALL iom_put( "runoffs", rnf ) ! output runoffs arrays 157 ENDIF 158 ! 145 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -222._wp ) ! where fwf comes from melting of ice shelves or iceberg 146 ztfrz(:,:) = -1.9 !tfreez( sss_m(:,:) ) !PM to be discuss (trouble if sensitivity study) 147 rnf_tsc(:,:,jp_tem) = ztfrz(:,:) * rnf(:,:) * r1_rau0 - rnf(:,:) * lfusisf * r1_rau0_rcp 148 END WHERE 149 ELSE ! use SST as runoffs temperature 150 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 151 ENDIF 152 ! ! use runoffs salinity data 153 IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 154 ! ! else use S=0 for runoffs (done one for all in the init) 155 CALL iom_put( "runoffs", rnf ) ! output runoffs arrays 159 156 ENDIF 160 157 ! … … 170 167 ELSE !* no restart: set from nit000 values 171 168 IF(lwp) WRITE(numout,*) ' nit000-1 runoff forcing fields set to nit000' 172 173 169 rnf_b (:,: ) = rnf (:,: ) 170 rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:) 174 171 ENDIF 175 172 ENDIF … … 185 182 CALL iom_rstput( kt, nitrst, numrow, 'rnf_sc_b', rnf_tsc(:,:,jp_sal) ) 186 183 ENDIF 184 ! 187 185 CALL wrk_dealloc( jpi,jpj, ztfrz) 188 186 ! … … 258 256 INTEGER :: ios ! Local integer output status for namelist read 259 257 ! 260 NAMELIST/namsbc_rnf/ cn_dir , ln_rnf_emp, ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, &258 NAMELIST/namsbc_rnf/ cn_dir , ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, & 261 259 & sn_rnf, sn_cnf , sn_s_rnf , sn_t_rnf , sn_dep_rnf, & 262 260 & ln_rnf_mouth , rn_hrnf , rn_avt_rnf, rn_rfact … … 282 280 WRITE(numout,*) '~~~~~~~ ' 283 281 WRITE(numout,*) ' Namelist namsbc_rnf' 284 WRITE(numout,*) ' runoff in a file to be read ln_rnf_emp = ', ln_rnf_emp285 282 WRITE(numout,*) ' specific river mouths treatment ln_rnf_mouth = ', ln_rnf_mouth 286 283 WRITE(numout,*) ' river mouth additional Kz rn_avt_rnf = ', rn_avt_rnf 287 284 WRITE(numout,*) ' depth of river mouth additional mixing rn_hrnf = ', rn_hrnf 288 285 WRITE(numout,*) ' multiplicative factor for runoff rn_rfact = ', rn_rfact 289 ENDIF290 !291 IF( ln_rnf_emp .AND. nn_components == jp_iam_opa ) THEN292 CALL ctl_stop( 'sbc_rnf_init: ln_rnf_emp must be false in case of SAS-OPA coupling' ) ; RETURN293 286 ENDIF 294 287 ! ! ================== … … 298 291 IF( sbc_rnf_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_rnf_alloc : unable to allocate arrays' ) 299 292 ! 300 IF( ln_rnf_emp ) THEN !== runoffs directly provided in the precipitations ==! 293 IF( .NOT. l_rnfcpl ) THEN 294 ALLOCATE( sf_rnf(1), STAT=ierror ) ! Create (if required) sf_rnf structure (runoff inflow) 301 295 IF(lwp) WRITE(numout,*) 302 IF(lwp) WRITE(numout,*) ' runoffs directly provided in the precipitations' 303 IF( ln_rnf_depth .OR. ln_rnf_tem .OR. ln_rnf_sal ) THEN 304 CALL ctl_warn( 'runoffs already included in precipitations, so runoff (T,S, depth) attributes will not be used' ) 305 ln_rnf_depth = .FALSE. ; ln_rnf_tem = .FALSE. ; ln_rnf_sal = .FALSE. 306 ENDIF 307 ! 308 ELSE !== runoffs read in a file : set sf_rnf structure ==! 309 ! 310 IF( .NOT. l_rnfcpl ) THEN 311 ALLOCATE( sf_rnf(1), STAT=ierror ) ! Create (if required) sf_rnf structure (runoff inflow) 312 IF(lwp) WRITE(numout,*) 313 IF(lwp) WRITE(numout,*) ' runoffs inflow read in a file' 314 IF( ierror > 0 ) THEN 315 CALL ctl_stop( 'sbc_rnf: unable to allocate sf_rnf structure' ) ; RETURN 316 ENDIF 317 ALLOCATE( sf_rnf(1)%fnow(jpi,jpj,1) ) 318 IF( sn_rnf%ln_tint ) ALLOCATE( sf_rnf(1)%fdta(jpi,jpj,1,2) ) 319 CALL fld_fill( sf_rnf, (/ sn_rnf /), cn_dir, 'sbc_rnf_init', 'read runoffs data', 'namsbc_rnf' ) 320 ENDIF 321 ! 322 IF( ln_rnf_tem ) THEN ! Create (if required) sf_t_rnf structure 323 IF(lwp) WRITE(numout,*) 324 IF(lwp) WRITE(numout,*) ' runoffs temperatures read in a file' 325 ALLOCATE( sf_t_rnf(1), STAT=ierror ) 326 IF( ierror > 0 ) THEN 327 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' ) ; RETURN 328 ENDIF 329 ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1) ) 330 IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) ) 331 CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 332 ENDIF 333 ! 334 IF( ln_rnf_sal ) THEN ! Create (if required) sf_s_rnf and sf_t_rnf structures 335 IF(lwp) WRITE(numout,*) 336 IF(lwp) WRITE(numout,*) ' runoffs salinities read in a file' 337 ALLOCATE( sf_s_rnf(1), STAT=ierror ) 338 IF( ierror > 0 ) THEN 339 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' ) ; RETURN 340 ENDIF 341 ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1) ) 342 IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) ) 343 CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 344 ENDIF 345 ! 346 IF( ln_rnf_depth ) THEN ! depth of runoffs set from a file 347 IF(lwp) WRITE(numout,*) 348 IF(lwp) WRITE(numout,*) ' runoffs depth read in a file' 349 rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 350 IF( .NOT. sn_dep_rnf%ln_clim ) THEN ; WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear ! add year 351 IF( sn_dep_rnf%cltype == 'monthly' ) WRITE(rn_dep_file, '(a,"m",i2)' ) TRIM( rn_dep_file ), nmonth ! add month 352 ENDIF 353 CALL iom_open ( rn_dep_file, inum ) ! open file 354 CALL iom_get ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf ) ! read the river mouth array 355 CALL iom_close( inum ) ! close file 356 ! 357 nk_rnf(:,:) = 0 ! set the number of level over which river runoffs are applied 358 DO jj = 1, jpj 359 DO ji = 1, jpi 360 IF( h_rnf(ji,jj) > 0._wp ) THEN 361 jk = 2 362 DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 ; END DO 363 nk_rnf(ji,jj) = jk 364 ELSEIF( h_rnf(ji,jj) == -1._wp ) THEN ; nk_rnf(ji,jj) = 1 365 ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN ; nk_rnf(ji,jj) = mbkt(ji,jj) 366 ELSE 367 CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 368 WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 369 ENDIF 296 IF(lwp) WRITE(numout,*) ' runoffs inflow read in a file' 297 IF( ierror > 0 ) THEN 298 CALL ctl_stop( 'sbc_rnf: unable to allocate sf_rnf structure' ) ; RETURN 299 ENDIF 300 ALLOCATE( sf_rnf(1)%fnow(jpi,jpj,1) ) 301 IF( sn_rnf%ln_tint ) ALLOCATE( sf_rnf(1)%fdta(jpi,jpj,1,2) ) 302 CALL fld_fill( sf_rnf, (/ sn_rnf /), cn_dir, 'sbc_rnf_init', 'read runoffs data', 'namsbc_rnf' ) 303 ENDIF 304 ! 305 IF( ln_rnf_tem ) THEN ! Create (if required) sf_t_rnf structure 306 IF(lwp) WRITE(numout,*) 307 IF(lwp) WRITE(numout,*) ' runoffs temperatures read in a file' 308 ALLOCATE( sf_t_rnf(1), STAT=ierror ) 309 IF( ierror > 0 ) THEN 310 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' ) ; RETURN 311 ENDIF 312 ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1) ) 313 IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) ) 314 CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 315 ENDIF 316 ! 317 IF( ln_rnf_sal ) THEN ! Create (if required) sf_s_rnf and sf_t_rnf structures 318 IF(lwp) WRITE(numout,*) 319 IF(lwp) WRITE(numout,*) ' runoffs salinities read in a file' 320 ALLOCATE( sf_s_rnf(1), STAT=ierror ) 321 IF( ierror > 0 ) THEN 322 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' ) ; RETURN 323 ENDIF 324 ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1) ) 325 IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) ) 326 CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 327 ENDIF 328 ! 329 IF( ln_rnf_depth ) THEN ! depth of runoffs set from a file 330 IF(lwp) WRITE(numout,*) 331 IF(lwp) WRITE(numout,*) ' runoffs depth read in a file' 332 rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 333 IF( .NOT. sn_dep_rnf%ln_clim ) THEN ; WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear ! add year 334 IF( sn_dep_rnf%cltype == 'monthly' ) WRITE(rn_dep_file, '(a,"m",i2)' ) TRIM( rn_dep_file ), nmonth ! add month 335 ENDIF 336 CALL iom_open ( rn_dep_file, inum ) ! open file 337 CALL iom_get ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf ) ! read the river mouth array 338 CALL iom_close( inum ) ! close file 339 ! 340 nk_rnf(:,:) = 0 ! set the number of level over which river runoffs are applied 341 DO jj = 1, jpj 342 DO ji = 1, jpi 343 IF( h_rnf(ji,jj) > 0._wp ) THEN 344 jk = 2 345 DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 346 END DO 347 nk_rnf(ji,jj) = jk 348 ELSEIF( h_rnf(ji,jj) == -1._wp ) THEN ; nk_rnf(ji,jj) = 1 349 ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN ; nk_rnf(ji,jj) = mbkt(ji,jj) 350 ELSE 351 CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 352 WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 353 ENDIF 354 END DO 355 END DO 356 DO jj = 1, jpj ! set the associated depth 357 DO ji = 1, jpi 358 h_rnf(ji,jj) = 0._wp 359 DO jk = 1, nk_rnf(ji,jj) 360 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 370 361 END DO 371 362 END DO 372 DO jj = 1, jpj ! set the associated depth 373 DO ji = 1, jpi 374 h_rnf(ji,jj) = 0._wp 375 DO jk = 1, nk_rnf(ji,jj) 376 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 377 END DO 378 END DO 379 END DO 380 ELSE ! runoffs applied at the surface 381 nk_rnf(:,:) = 1 382 h_rnf (:,:) = fse3t(:,:,1) 383 ENDIF 384 ! 363 END DO 364 ELSE ! runoffs applied at the surface 365 nk_rnf(:,:) = 1 366 h_rnf (:,:) = fse3t(:,:,1) 385 367 ENDIF 386 368 ! … … 403 385 IF( rn_hrnf > 0._wp ) THEN 404 386 nkrnf = 2 405 DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf ) ; nkrnf = nkrnf + 1 ; END DO 387 DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf ) ; nkrnf = nkrnf + 1 388 END DO 406 389 IF( ln_sco ) CALL ctl_warn( 'sbc_rnf: number of levels over which Kz is increased is computed for zco...' ) 407 390 ENDIF 408 IF(lwp) WRITE(numout,*)409 IF(lwp) WRITE(numout,*) ' Specific treatment used in vicinity of river mouths :'410 IF(lwp) WRITE(numout,*) ' - Increase Kz in surface layers (if rn_hrnf > 0 )'411 IF(lwp) WRITE(numout,*) ' by ', rn_avt_rnf,' m2/s over ', nkrnf, ' w-levels'412 IF(lwp) WRITE(numout,*) ' - set to zero SSS damping (if ln_ssr=T)'413 IF(lwp) WRITE(numout,*) ' - mixed upstream-centered (if ln_traadv_cen2=T)'414 !415 CALL rnf_mouth ! set river mouth mask416 !417 ELSE ! No treatment at river mouths418 IF(lwp) WRITE(numout,*)419 IF(lwp) WRITE(numout,*) ' No specific treatment at river mouths'420 rnfmsk (:,:) = 0._wp421 rnfmsk_z(:) = 0._wp422 nkrnf = 0423 ENDIF424 !425 END SUBROUTINE sbc_rnf_init391 IF(lwp) WRITE(numout,*) 392 IF(lwp) WRITE(numout,*) ' Specific treatment used in vicinity of river mouths :' 393 IF(lwp) WRITE(numout,*) ' - Increase Kz in surface layers (if rn_hrnf > 0 )' 394 IF(lwp) WRITE(numout,*) ' by ', rn_avt_rnf,' m2/s over ', nkrnf, ' w-levels' 395 IF(lwp) WRITE(numout,*) ' - set to zero SSS damping (if ln_ssr=T)' 396 IF(lwp) WRITE(numout,*) ' - mixed upstream-centered (if ln_traadv_cen2=T)' 397 ! 398 CALL rnf_mouth ! set river mouth mask 399 ! 400 ELSE ! No treatment at river mouths 401 IF(lwp) WRITE(numout,*) 402 IF(lwp) WRITE(numout,*) ' No specific treatment at river mouths' 403 rnfmsk (:,:) = 0._wp 404 rnfmsk_z(:) = 0._wp 405 nkrnf = 0 406 ENDIF 407 ! 408 END SUBROUTINE sbc_rnf_init 426 409 427 410
Note: See TracChangeset
for help on using the changeset viewer.