- Timestamp:
- 2016-01-08T10:35:19+01:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90
r4624 r6225 12 12 13 13 !!---------------------------------------------------------------------- 14 !! sbc_rnf : monthly runoffs read in a NetCDF file15 !! sbc_rnf_init : runoffs initialisation16 !! rnf_mouth : set river mouth mask14 !! sbc_rnf : monthly runoffs read in a NetCDF file 15 !! sbc_rnf_init : runoffs initialisation 16 !! rnf_mouth : set river mouth mask 17 17 !!---------------------------------------------------------------------- 18 USE dom_oce ! ocean space and time domain 19 USE phycst ! physical constants 20 USE sbc_oce ! surface boundary condition variables 21 USE closea ! closed seas 22 USE fldread ! read input field at current time step 23 USE in_out_manager ! I/O manager 24 USE iom ! I/O module 25 USE lib_mpp ! MPP library 18 USE dom_oce ! ocean space and time domain 19 USE phycst ! physical constants 20 USE sbc_oce ! surface boundary condition variables 21 USE sbcisf ! PM we could remove it I think 22 USE closea ! closed seas 23 USE eosbn2 ! Equation Of State 24 ! 25 USE in_out_manager ! I/O manager 26 USE fldread ! read input field at current time step 27 USE iom ! I/O module 28 USE lib_mpp ! MPP library 29 USE wrk_nemo ! Memory allocation 26 30 27 31 IMPLICIT NONE 28 32 PRIVATE 29 33 30 PUBLIC sbc_rnf ! routine call in sbcmod module 31 PUBLIC sbc_rnf_div ! routine called in sshwzv module 32 PUBLIC sbc_rnf_alloc ! routine call in sbcmod module 33 PUBLIC sbc_rnf_init ! (PUBLIC for TAM) 34 ! !!* namsbc_rnf namelist * 35 CHARACTER(len=100), PUBLIC :: cn_dir !: Root directory for location of ssr files 36 LOGICAL , PUBLIC :: ln_rnf_depth !: depth river runoffs attribute specified in a file 37 LOGICAL , PUBLIC :: ln_rnf_tem !: temperature river runoffs attribute specified in a file 38 LOGICAL , PUBLIC :: ln_rnf_sal !: salinity river runoffs attribute specified in a file 39 LOGICAL , PUBLIC :: ln_rnf_emp !: runoffs into a file to be read or already into precipitation 40 TYPE(FLD_N) , PUBLIC :: sn_rnf !: information about the runoff file to be read 41 TYPE(FLD_N) , PUBLIC :: sn_cnf !: information about the runoff mouth file to be read 42 TYPE(FLD_N) :: sn_s_rnf !: information about the salinities of runoff file to be read 43 TYPE(FLD_N) :: sn_t_rnf !: information about the temperatures of runoff file to be read 44 TYPE(FLD_N) :: sn_dep_rnf !: information about the depth which river inflow affects 45 LOGICAL , PUBLIC :: ln_rnf_mouth !: specific treatment in mouths vicinity 46 REAL(wp) , PUBLIC :: rn_hrnf !: runoffs, depth over which enhanced vertical mixing is used 47 REAL(wp) , PUBLIC :: rn_avt_rnf !: runoffs, value of the additional vertical mixing coef. [m2/s] 48 REAL(wp) , PUBLIC :: rn_rfact !: multiplicative factor for runoff 49 50 INTEGER , PUBLIC :: nkrnf = 0 !: nb of levels over which Kz is increased at river mouths 34 PUBLIC sbc_rnf ! called in sbcmod module 35 PUBLIC sbc_rnf_div ! called in divhor module 36 PUBLIC sbc_rnf_alloc ! called in sbcmod module 37 PUBLIC sbc_rnf_init ! called in sbcmod module 38 39 ! !!* namsbc_rnf namelist * 40 CHARACTER(len=100) :: cn_dir !: Root directory for location of rnf files 41 LOGICAL :: ln_rnf_depth !: depth river runoffs attribute specified in a file 42 LOGICAL :: ln_rnf_depth_ini !: depth river runoffs computed at the initialisation 43 REAL(wp) :: rn_rnf_max !: maximum value of the runoff climatologie (ln_rnf_depth_ini =T) 44 REAL(wp) :: rn_dep_max !: depth over which runoffs is spread (ln_rnf_depth_ini =T) 45 INTEGER :: nn_rnf_depth_file !: create (=1) a runoff depth file or not (=0) 46 LOGICAL :: ln_rnf_tem !: temperature river runoffs attribute specified in a file 47 LOGICAL , PUBLIC :: ln_rnf_sal !: salinity river runoffs attribute specified in a file 48 TYPE(FLD_N) , PUBLIC :: sn_rnf !: information about the runoff file to be read 49 TYPE(FLD_N) :: sn_cnf !: information about the runoff mouth file to be read 50 TYPE(FLD_N) :: sn_s_rnf !: information about the salinities of runoff file to be read 51 TYPE(FLD_N) :: sn_t_rnf !: information about the temperatures of runoff file to be read 52 TYPE(FLD_N) :: sn_dep_rnf !: information about the depth which river inflow affects 53 LOGICAL , PUBLIC :: ln_rnf_mouth !: specific treatment in mouths vicinity 54 REAL(wp) :: rn_hrnf !: runoffs, depth over which enhanced vertical mixing is used 55 REAL(wp) , PUBLIC :: rn_avt_rnf !: runoffs, value of the additional vertical mixing coef. [m2/s] 56 REAL(wp) , PUBLIC :: rn_rfact !: multiplicative factor for runoff 57 58 LOGICAL , PUBLIC :: l_rnfcpl = .false. !: runoffs recieved from oasis 59 INTEGER , PUBLIC :: nkrnf = 0 !: nb of levels over which Kz is increased at river mouths 60 51 61 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rnfmsk !: river mouth mask (hori.) 52 62 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: rnfmsk_z !: river mouth mask (vert.) … … 55 65 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: rnf_tsc_b, rnf_tsc !: before and now T & S runoff contents [K.m/s & PSU.m/s] 56 66 57 TYPE(FLD), PUBLIC,ALLOCATABLE, DIMENSION(:) :: sf_rnf ! structure: river runoff (file information, fields read)58 TYPE(FLD), PUBLIC,ALLOCATABLE, DIMENSION(:) :: sf_s_rnf ! structure: river runoff salinity (file information, fields read)59 TYPE(FLD), PUBLIC,ALLOCATABLE, DIMENSION(:) :: sf_t_rnf ! structure: river runoff temperature (file information, fields read)67 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_rnf ! structure: river runoff (file information, fields read) 68 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_s_rnf ! structure: river runoff salinity (file information, fields read) 69 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_t_rnf ! structure: river runoff temperature (file information, fields read) 60 70 61 !! * Substitutions62 # include "domzgr_substitute.h90"63 71 !!---------------------------------------------------------------------- 64 72 !! NEMO/OPA 3.3 , NEMO Consortium (2010) … … 98 106 INTEGER :: z_err = 0 ! dummy integer for error handling 99 107 !!---------------------------------------------------------------------- 100 ! 101 IF( kt == nit000 ) CALL sbc_rnf_init ! Read namelist and allocate structures 108 REAL(wp), DIMENSION(:,:), POINTER :: ztfrz ! freezing point used for temperature correction 109 ! 110 CALL wrk_alloc( jpi,jpj, ztfrz) 102 111 103 112 ! ! ---------------------------------------- ! … … 109 118 ENDIF 110 119 111 ! !-------------------! 112 IF( .NOT. ln_rnf_emp ) THEN ! Update runoff ! 113 ! !-------------------! 114 ! 115 CALL fld_read ( kt, nn_fsbc, sf_rnf ) ! Read Runoffs data and provide it at kt 116 IF( ln_rnf_tem ) CALL fld_read ( kt, nn_fsbc, sf_t_rnf ) ! idem for runoffs temperature if required 117 IF( ln_rnf_sal ) CALL fld_read ( kt, nn_fsbc, sf_s_rnf ) ! idem for runoffs salinity if required 118 ! 119 ! Runoff reduction only associated to the ORCA2_LIM configuration 120 ! when reading the NetCDF file runoff_1m_nomask.nc 121 IF( cp_cfg == 'orca' .AND. jp_cfg == 2 ) THEN 122 WHERE( 40._wp < gphit(:,:) .AND. gphit(:,:) < 65._wp ) 123 sf_rnf(1)%fnow(:,:,1) = 0.85 * sf_rnf(1)%fnow(:,:,1) 120 ! !-------------------! 121 ! ! 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 IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 129 ! 130 IF( .NOT. l_rnfcpl ) rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) ! updated runoff value at time step kt 131 ! 132 ! ! set temperature & salinity content of runoffs 133 IF( ln_rnf_tem ) THEN ! use runoffs temperature data 134 rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 135 CALL eos_fzp( sss_m(:,:), ztfrz(:,:) ) 136 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp ) ! if missing data value use SST as runoffs temperature 137 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 124 138 END WHERE 125 ENDIF 126 ! 127 IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 128 ! 129 rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) ! updated runoff value at time step kt 130 ! 131 ! ! set temperature & salinity content of runoffs 132 IF( ln_rnf_tem ) THEN ! use runoffs temperature data 133 rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 134 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp ) ! if missing data value use SST as runoffs temperature 135 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 136 END WHERE 137 ELSE ! use SST as runoffs temperature 138 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 139 ENDIF 140 ! ! use runoffs salinity data 141 IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 142 ! ! else use S=0 for runoffs (done one for all in the init) 143 IF ( ANY( rnf(:,:) < 0._wp ) ) z_err=1 144 IF(lk_mpp) CALL mpp_sum(z_err) 145 IF( z_err > 0 ) CALL ctl_stop( 'sbc_rnf : negative runnoff values exist' ) 146 ! 147 CALL iom_put( "runoffs", rnf ) ! output runoffs arrays 148 ENDIF 149 ! 150 ENDIF 151 ! 139 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -222._wp ) ! where fwf comes from melting of ice shelves or iceberg 140 rnf_tsc(:,:,jp_tem) = ztfrz(:,:) * rnf(:,:) * r1_rau0 - rnf(:,:) * rlfusisf * r1_rau0_rcp 141 END WHERE 142 ELSE ! use SST as runoffs temperature 143 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 144 ENDIF 145 ! ! use runoffs salinity data 146 IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 147 ! ! else use S=0 for runoffs (done one for all in the init) 148 CALL iom_put( "runoffs", rnf ) ! output runoffs arrays 149 ENDIF 150 ! 151 ! ! ---------------------------------------- ! 152 152 IF( kt == nit000 ) THEN ! set the forcing field at nit000 - 1 ! 153 153 ! ! ---------------------------------------- ! … … 160 160 ELSE !* no restart: set from nit000 values 161 161 IF(lwp) WRITE(numout,*) ' nit000-1 runoff forcing fields set to nit000' 162 163 162 rnf_b (:,: ) = rnf (:,: ) 163 rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:) 164 164 ENDIF 165 165 ENDIF … … 176 176 ENDIF 177 177 ! 178 CALL wrk_dealloc( jpi,jpj, ztfrz) 179 ! 178 180 END SUBROUTINE sbc_rnf 179 181 … … 199 201 zfact = 0.5_wp 200 202 ! 201 IF( ln_rnf_depth ) THEN !== runoff distributed over several levels ==! 202 IF( lk_vvl ) THEN ! variable volume case 203 IF( ln_rnf_depth .OR. ln_rnf_depth_ini ) THEN !== runoff distributed over several levels ==! 204 IF( ln_linssh ) THEN !* constant volume case : just apply the runoff input flow 205 DO jj = 1, jpj 206 DO ji = 1, jpi 207 DO jk = 1, nk_rnf(ji,jj) 208 phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_rau0 / h_rnf(ji,jj) 209 END DO 210 END DO 211 END DO 212 ELSE !* variable volume case 203 213 DO jj = 1, jpj ! update the depth over which runoffs are distributed 204 214 DO ji = 1, jpi 205 215 h_rnf(ji,jj) = 0._wp 206 216 DO jk = 1, nk_rnf(ji,jj) ! recalculates h_rnf to be the depth in metres 207 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) ! to the bottom of the relevant grid box217 h_rnf(ji,jj) = h_rnf(ji,jj) + e3t_n(ji,jj,jk) ! to the bottom of the relevant grid box 208 218 END DO 209 219 ! ! apply the runoff input flow … … 213 223 END DO 214 224 END DO 215 ELSE ! constant volume case : just apply the runoff input flow216 DO jj = 1, jpj217 DO ji = 1, jpi218 DO jk = 1, nk_rnf(ji,jj)219 phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_rau0 / h_rnf(ji,jj)220 END DO221 END DO222 END DO223 225 ENDIF 224 226 ELSE !== runoff put only at the surface ==! 225 IF( lk_vvl ) THEN ! variable volume case 226 h_rnf(:,:) = fse3t(:,:,1) ! recalculate h_rnf to be depth of top box 227 ENDIF 228 phdivn(:,:,1) = phdivn(:,:,1) - ( rnf(:,:) + rnf_b(:,:) ) * zfact * r1_rau0 / fse3t(:,:,1) 227 h_rnf (:,:) = e3t_n (:,:,1) ! update h_rnf to be depth of top box 228 phdivn(:,:,1) = phdivn(:,:,1) - ( rnf(:,:) + rnf_b(:,:) ) * zfact * r1_rau0 / e3t_n(:,:,1) 229 229 ENDIF 230 230 ! … … 243 243 !!---------------------------------------------------------------------- 244 244 CHARACTER(len=32) :: rn_dep_file ! runoff file name 245 INTEGER :: ji, jj, jk ! dummy loop indices245 INTEGER :: ji, jj, jk, jm ! dummy loop indices 246 246 INTEGER :: ierror, inum ! temporary integer 247 247 INTEGER :: ios ! Local integer output status for namelist read 248 ! 249 NAMELIST/namsbc_rnf/ cn_dir, ln_rnf_emp, ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, & 248 INTEGER :: nbrec ! temporary integer 249 REAL(wp) :: zacoef 250 REAL(wp), DIMENSION(12) :: zrec ! times records 251 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zrnfcl 252 REAL(wp), DIMENSION(:,: ), ALLOCATABLE :: zrnf 253 ! 254 NAMELIST/namsbc_rnf/ cn_dir , ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, & 250 255 & sn_rnf, sn_cnf , sn_s_rnf , sn_t_rnf , sn_dep_rnf, & 251 & ln_rnf_mouth , rn_hrnf , rn_avt_rnf, rn_rfact 252 !!---------------------------------------------------------------------- 256 & ln_rnf_mouth , rn_hrnf , rn_avt_rnf, rn_rfact, & 257 & ln_rnf_depth_ini , rn_dep_max , rn_rnf_max, nn_rnf_depth_file 258 !!---------------------------------------------------------------------- 259 ! 260 ! !== allocate runoff arrays 261 IF( sbc_rnf_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_rnf_alloc : unable to allocate arrays' ) 262 ! 263 IF( .NOT. ln_rnf ) THEN ! no specific treatment in vicinity of river mouths 264 ln_rnf_mouth = .FALSE. ! default definition needed for example by sbc_ssr or by tra_adv_muscl 265 nkrnf = 0 266 rnf (:,:) = 0.0_wp 267 rnf_b (:,:) = 0.0_wp 268 rnfmsk (:,:) = 0.0_wp 269 rnfmsk_z(:) = 0.0_wp 270 RETURN 271 ENDIF 253 272 ! 254 273 ! ! ============ … … 271 290 WRITE(numout,*) '~~~~~~~ ' 272 291 WRITE(numout,*) ' Namelist namsbc_rnf' 273 WRITE(numout,*) ' runoff in a file to be read ln_rnf_emp = ', ln_rnf_emp274 292 WRITE(numout,*) ' specific river mouths treatment ln_rnf_mouth = ', ln_rnf_mouth 275 293 WRITE(numout,*) ' river mouth additional Kz rn_avt_rnf = ', rn_avt_rnf … … 277 295 WRITE(numout,*) ' multiplicative factor for runoff rn_rfact = ', rn_rfact 278 296 ENDIF 279 !280 297 ! ! ================== 281 298 ! ! Type of runoff 282 299 ! ! ================== 283 ! !== allocate runoff arrays 284 IF( sbc_rnf_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_rnf_alloc : unable to allocate arrays' ) 285 ! 286 IF( ln_rnf_emp ) THEN !== runoffs directly provided in the precipitations ==! 287 IF(lwp) WRITE(numout,*) 288 IF(lwp) WRITE(numout,*) ' runoffs directly provided in the precipitations' 289 IF( ln_rnf_depth .OR. ln_rnf_tem .OR. ln_rnf_sal ) THEN 290 CALL ctl_warn( 'runoffs already included in precipitations, so runoff (T,S, depth) attributes will not be used' ) 291 ln_rnf_depth = .FALSE. ; ln_rnf_tem = .FALSE. ; ln_rnf_sal = .FALSE. 292 ENDIF 293 ! 294 ELSE !== runoffs read in a file : set sf_rnf structure ==! 295 ! 300 ! 301 IF( .NOT. l_rnfcpl ) THEN 296 302 ALLOCATE( sf_rnf(1), STAT=ierror ) ! Create sf_rnf structure (runoff inflow) 297 303 IF(lwp) WRITE(numout,*) … … 302 308 ALLOCATE( sf_rnf(1)%fnow(jpi,jpj,1) ) 303 309 IF( sn_rnf%ln_tint ) ALLOCATE( sf_rnf(1)%fdta(jpi,jpj,1,2) ) 304 ! ! fill sf_rnf with the namelist (sn_rnf) and control print305 310 CALL fld_fill( sf_rnf, (/ sn_rnf /), cn_dir, 'sbc_rnf_init', 'read runoffs data', 'namsbc_rnf' ) 306 ! 307 IF( ln_rnf_tem ) THEN ! Create (if required) sf_t_rnf structure 308 IF(lwp) WRITE(numout,*) 309 IF(lwp) WRITE(numout,*) ' runoffs temperatures read in a file' 310 ALLOCATE( sf_t_rnf(1), STAT=ierror ) 311 IF( ierror > 0 ) THEN 312 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' ) ; RETURN 313 ENDIF 314 ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1) ) 315 IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) ) 316 CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 317 ENDIF 318 ! 319 IF( ln_rnf_sal ) THEN ! Create (if required) sf_s_rnf and sf_t_rnf structures 320 IF(lwp) WRITE(numout,*) 321 IF(lwp) WRITE(numout,*) ' runoffs salinities read in a file' 322 ALLOCATE( sf_s_rnf(1), STAT=ierror ) 323 IF( ierror > 0 ) THEN 324 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' ) ; RETURN 325 ENDIF 326 ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1) ) 327 IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) ) 328 CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 329 ENDIF 330 ! 331 IF( ln_rnf_depth ) THEN ! depth of runoffs set from a file 332 IF(lwp) WRITE(numout,*) 333 IF(lwp) WRITE(numout,*) ' runoffs depth read in a file' 334 rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 335 IF( .NOT. sn_dep_rnf%ln_clim ) THEN ; WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear ! add year 336 IF( sn_dep_rnf%cltype == 'monthly' ) WRITE(rn_dep_file, '(a,"m",i2)' ) TRIM( rn_dep_file ), nmonth ! add month 337 ENDIF 338 CALL iom_open ( rn_dep_file, inum ) ! open file 339 CALL iom_get ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf ) ! read the river mouth array 340 CALL iom_close( inum ) ! close file 341 ! 342 nk_rnf(:,:) = 0 ! set the number of level over which river runoffs are applied 343 DO jj = 1, jpj 344 DO ji = 1, jpi 345 IF( h_rnf(ji,jj) > 0._wp ) THEN 346 jk = 2 347 DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 ; END DO 348 nk_rnf(ji,jj) = jk 349 ELSEIF( h_rnf(ji,jj) == -1._wp ) THEN ; nk_rnf(ji,jj) = 1 350 ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN ; nk_rnf(ji,jj) = mbkt(ji,jj) 351 ELSE 352 CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 353 WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 354 ENDIF 311 ENDIF 312 ! 313 IF( ln_rnf_tem ) THEN ! Create (if required) sf_t_rnf structure 314 IF(lwp) WRITE(numout,*) 315 IF(lwp) WRITE(numout,*) ' runoffs temperatures read in a file' 316 ALLOCATE( sf_t_rnf(1), STAT=ierror ) 317 IF( ierror > 0 ) THEN 318 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' ) ; RETURN 319 ENDIF 320 ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1) ) 321 IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) ) 322 CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 323 ENDIF 324 ! 325 IF( ln_rnf_sal ) THEN ! Create (if required) sf_s_rnf and sf_t_rnf structures 326 IF(lwp) WRITE(numout,*) 327 IF(lwp) WRITE(numout,*) ' runoffs salinities read in a file' 328 ALLOCATE( sf_s_rnf(1), STAT=ierror ) 329 IF( ierror > 0 ) THEN 330 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' ) ; RETURN 331 ENDIF 332 ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1) ) 333 IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) ) 334 CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 335 ENDIF 336 ! 337 IF( ln_rnf_depth ) THEN ! depth of runoffs set from a file 338 IF(lwp) WRITE(numout,*) 339 IF(lwp) WRITE(numout,*) ' runoffs depth read in a file' 340 rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 341 IF( .NOT. sn_dep_rnf%ln_clim ) THEN ; WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear ! add year 342 IF( sn_dep_rnf%cltype == 'monthly' ) WRITE(rn_dep_file, '(a,"m",i2)' ) TRIM( rn_dep_file ), nmonth ! add month 343 ENDIF 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 ! 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. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 354 END DO 355 nk_rnf(ji,jj) = jk 356 ELSEIF( h_rnf(ji,jj) == -1._wp ) THEN ; nk_rnf(ji,jj) = 1 357 ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN ; nk_rnf(ji,jj) = mbkt(ji,jj) 358 ELSE 359 CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 360 WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 361 ENDIF 362 END DO 363 END DO 364 DO jj = 1, jpj ! set the associated depth 365 DO ji = 1, jpi 366 h_rnf(ji,jj) = 0._wp 367 DO jk = 1, nk_rnf(ji,jj) 368 h_rnf(ji,jj) = h_rnf(ji,jj) + e3t_n(ji,jj,jk) 355 369 END DO 356 370 END DO 357 DO jj = 1, jpj ! set the associated depth 358 DO ji = 1, jpi 359 h_rnf(ji,jj) = 0._wp 360 DO jk = 1, nk_rnf(ji,jj) 361 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 371 END DO 372 ! 373 ELSE IF( ln_rnf_depth_ini ) THEN ! runoffs applied at the surface 374 ! 375 IF(lwp) WRITE(numout,*) 376 IF(lwp) WRITE(numout,*) ' depth of runoff computed once from max value of runoff' 377 IF(lwp) WRITE(numout,*) ' max value of the runoff climatologie (over global domain) rn_rnf_max = ', rn_rnf_max 378 IF(lwp) WRITE(numout,*) ' depth over which runoffs is spread rn_dep_max = ', rn_dep_max 379 IF(lwp) WRITE(numout,*) ' create (=1) a runoff depth file or not (=0) nn_rnf_depth_file = ', nn_rnf_depth_file 380 381 CALL iom_open( TRIM( sn_rnf%clname ), inum ) ! open runoff file 382 CALL iom_gettime( inum, zrec, kntime=nbrec) 383 ALLOCATE( zrnfcl(jpi,jpj,nbrec) ) ; ALLOCATE( zrnf(jpi,jpj) ) 384 DO jm = 1, nbrec 385 CALL iom_get( inum, jpdom_data, TRIM( sn_rnf%clvar ), zrnfcl(:,:,jm), jm ) 386 END DO 387 CALL iom_close( inum ) 388 zrnf(:,:) = MAXVAL( zrnfcl(:,:,:), DIM=3 ) ! maximum value in time 389 DEALLOCATE( zrnfcl ) 390 ! 391 h_rnf(:,:) = 1. 392 ! 393 zacoef = rn_dep_max / rn_rnf_max ! coef of linear relation between runoff and its depth (150m for max of runoff) 394 ! 395 WHERE( zrnf(:,:) > 0._wp ) h_rnf(:,:) = zacoef * zrnf(:,:) ! compute depth for all runoffs 396 ! 397 DO jj = 1, jpj ! take in account min depth of ocean rn_hmin 398 DO ji = 1, jpi 399 IF( zrnf(ji,jj) > 0._wp ) THEN 400 jk = mbkt(ji,jj) 401 h_rnf(ji,jj) = MIN( h_rnf(ji,jj), gdept_0(ji,jj,jk ) ) 402 ENDIF 403 END DO 404 END DO 405 ! 406 nk_rnf(:,:) = 0 ! number of levels on which runoffs are distributed 407 DO jj = 1, jpj 408 DO ji = 1, jpi 409 IF( zrnf(ji,jj) > 0._wp ) THEN 410 jk = 2 411 DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 362 412 END DO 413 nk_rnf(ji,jj) = jk 414 ELSE 415 nk_rnf(ji,jj) = 1 416 ENDIF 417 END DO 418 END DO 419 ! 420 DEALLOCATE( zrnf ) 421 ! 422 DO jj = 1, jpj ! set the associated depth 423 DO ji = 1, jpi 424 h_rnf(ji,jj) = 0._wp 425 DO jk = 1, nk_rnf(ji,jj) 426 h_rnf(ji,jj) = h_rnf(ji,jj) + e3t_n(ji,jj,jk) 363 427 END DO 364 428 END DO 365 ELSE ! runoffs applied at the surface 366 nk_rnf(:,:) = 1 367 h_rnf (:,:) = fse3t(:,:,1) 368 ENDIF 369 ! 429 END DO 430 ! 431 IF( nn_rnf_depth_file == 1 ) THEN ! save output nb levels for runoff 432 IF(lwp) WRITE(numout,*) ' create runoff depht file' 433 CALL iom_open ( TRIM( sn_dep_rnf%clname ), inum, ldwrt = .TRUE., kiolib = jprstlib ) 434 CALL iom_rstput( 0, 0, inum, 'rodepth', h_rnf ) 435 CALL iom_close ( inum ) 436 ENDIF 437 ELSE ! runoffs applied at the surface 438 nk_rnf(:,:) = 1 439 h_rnf (:,:) = e3t_n(:,:,1) 370 440 ENDIF 371 441 ! … … 388 458 IF( rn_hrnf > 0._wp ) THEN 389 459 nkrnf = 2 390 DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf ) ; nkrnf = nkrnf + 1 ; END DO 460 DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf ) ; nkrnf = nkrnf + 1 461 END DO 391 462 IF( ln_sco ) CALL ctl_warn( 'sbc_rnf: number of levels over which Kz is increased is computed for zco...' ) 392 463 ENDIF
Note: See TracChangeset
for help on using the changeset viewer.