Changeset 5989 for branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90
- Timestamp:
- 2015-12-03T09:10:32+01:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4650_UKMO10_Tidally_Meaned_Diagnostics/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90
r5260 r5989 31 31 PRIVATE 32 32 33 PUBLIC sbc_rnf ! routine call in sbcmod module 34 PUBLIC sbc_rnf_div ! routine called in sshwzv module 35 PUBLIC sbc_rnf_alloc ! routine call in sbcmod module 36 PUBLIC sbc_rnf_init ! (PUBLIC for TAM) 33 PUBLIC sbc_rnf ! routine called in sbcmod module 34 PUBLIC sbc_rnf_div ! routine called in divhor module 35 PUBLIC sbc_rnf_alloc ! routine called in sbcmod module 36 PUBLIC sbc_rnf_init ! routine called in sbcmod module 37 37 38 ! !!* namsbc_rnf namelist * 38 CHARACTER(len=100), PUBLIC :: cn_dir !: Root directory for location of ssr files 39 LOGICAL , PUBLIC :: ln_rnf_depth !: depth river runoffs attribute specified in a file 40 LOGICAL , PUBLIC :: ln_rnf_tem !: temperature river runoffs attribute specified in a file 39 CHARACTER(len=100) :: cn_dir !: Root directory for location of rnf files 40 LOGICAL :: ln_rnf_depth !: depth river runoffs attribute specified in a file 41 LOGICAL :: ln_rnf_depth_ini !: depth river runoffs computed at the initialisation 42 REAL(wp) :: rn_rnf_max !: maximum value of the runoff climatologie ( ln_rnf_depth_ini = .true ) 43 REAL(wp) :: rn_dep_max !: depth over which runoffs is spread ( ln_rnf_depth_ini = .true ) 44 INTEGER :: nn_rnf_depth_file !: create (=1) a runoff depth file or not (=0) 45 LOGICAL :: ln_rnf_tem !: temperature river runoffs attribute specified in a file 41 46 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 47 TYPE(FLD_N) , PUBLIC :: sn_rnf !: information about the runoff file to be read 44 TYPE(FLD_N) , PUBLIC:: sn_cnf !: information about the runoff mouth file to be read48 TYPE(FLD_N) :: sn_cnf !: information about the runoff mouth file to be read 45 49 TYPE(FLD_N) :: sn_s_rnf !: information about the salinities of runoff file to be read 46 50 TYPE(FLD_N) :: sn_t_rnf !: information about the temperatures of runoff file to be read 47 51 TYPE(FLD_N) :: sn_dep_rnf !: information about the depth which river inflow affects 48 52 LOGICAL , PUBLIC :: ln_rnf_mouth !: specific treatment in mouths vicinity 49 REAL(wp) , PUBLIC:: rn_hrnf !: runoffs, depth over which enhanced vertical mixing is used53 REAL(wp) :: rn_hrnf !: runoffs, depth over which enhanced vertical mixing is used 50 54 REAL(wp) , PUBLIC :: rn_avt_rnf !: runoffs, value of the additional vertical mixing coef. [m2/s] 51 REAL(wp) , PUBLIC :: rn_rfact !: multiplicative factor for runoff 55 REAL(wp) :: rn_rfact !: multiplicative factor for runoff 56 57 LOGICAL , PUBLIC :: l_rnfcpl = .false. ! runoffs recieved from oasis 52 58 53 59 INTEGER , PUBLIC :: nkrnf = 0 !: nb of levels over which Kz is increased at river mouths … … 58 64 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: rnf_tsc_b, rnf_tsc !: before and now T & S runoff contents [K.m/s & PSU.m/s] 59 65 60 TYPE(FLD), PUBLIC,ALLOCATABLE, DIMENSION(:) :: sf_rnf ! structure: river runoff (file information, fields read)61 TYPE(FLD), PUBLIC,ALLOCATABLE, DIMENSION(:) :: sf_s_rnf ! structure: river runoff salinity (file information, fields read)62 TYPE(FLD), PUBLIC,ALLOCATABLE, DIMENSION(:) :: sf_t_rnf ! structure: river runoff temperature (file information, fields read)66 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_rnf ! structure: river runoff (file information, fields read) 67 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_s_rnf ! structure: river runoff salinity (file information, fields read) 68 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_t_rnf ! structure: river runoff temperature (file information, fields read) 63 69 64 70 !! * Substitutions … … 105 111 CALL wrk_alloc( jpi,jpj, ztfrz) 106 112 107 !108 IF( kt == nit000 ) CALL sbc_rnf_init ! Read namelist and allocate structures109 110 113 ! ! ---------------------------------------- ! 111 114 IF( kt /= nit000 ) THEN ! Swap of forcing fields ! … … 116 119 ENDIF 117 120 118 ! !-------------------! 119 IF( .NOT. ln_rnf_emp ) THEN ! Update runoff ! 120 ! !-------------------! 121 ! 122 CALL fld_read ( kt, nn_fsbc, sf_rnf ) ! Read Runoffs data and provide it at kt 123 IF( ln_rnf_tem ) CALL fld_read ( kt, nn_fsbc, sf_t_rnf ) ! idem for runoffs temperature if required 124 IF( ln_rnf_sal ) CALL fld_read ( kt, nn_fsbc, sf_s_rnf ) ! idem for runoffs salinity if required 125 ! 126 ! Runoff reduction only associated to the ORCA2_LIM configuration 127 ! when reading the NetCDF file runoff_1m_nomask.nc 128 IF( cp_cfg == 'orca' .AND. jp_cfg == 2 ) THEN 129 WHERE( 40._wp < gphit(:,:) .AND. gphit(:,:) < 65._wp ) 130 sf_rnf(1)%fnow(:,:,1) = 0.85 * sf_rnf(1)%fnow(:,:,1) 121 ! !-------------------! 122 ! ! Update runoff ! 123 ! !-------------------! 124 ! 125 IF( .NOT. l_rnfcpl ) CALL fld_read ( kt, nn_fsbc, sf_rnf ) ! Read Runoffs data and provide it at kt 126 IF( ln_rnf_tem ) CALL fld_read ( kt, nn_fsbc, sf_t_rnf ) ! idem for runoffs temperature if required 127 IF( ln_rnf_sal ) CALL fld_read ( kt, nn_fsbc, sf_s_rnf ) ! idem for runoffs salinity if required 128 ! 129 ! Runoff reduction only associated to the ORCA2_LIM configuration 130 ! when reading the NetCDF file runoff_1m_nomask.nc 131 IF( cp_cfg == 'orca' .AND. jp_cfg == 2 .AND. .NOT. l_rnfcpl ) THEN 132 WHERE( 40._wp < gphit(:,:) .AND. gphit(:,:) < 65._wp ) 133 sf_rnf(1)%fnow(:,:,1) = 0.85 * sf_rnf(1)%fnow(:,:,1) 134 END WHERE 135 ENDIF 136 ! 137 IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 138 ! 139 IF( .NOT. l_rnfcpl ) rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) ! updated runoff value at time step kt 140 ! 141 ! ! set temperature & salinity content of runoffs 142 IF( ln_rnf_tem ) THEN ! use runoffs temperature data 143 rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 144 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp ) ! if missing data value use SST as runoffs temperature 145 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 131 146 END WHERE 132 ENDIF 133 ! 134 IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 135 ! 136 rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) ) ! updated runoff value at time step kt 137 ! 138 ! ! set temperature & salinity content of runoffs 139 IF( ln_rnf_tem ) THEN ! use runoffs temperature data 140 rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 141 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp ) ! if missing data value use SST as runoffs temperature 142 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 143 END WHERE 144 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -222._wp ) ! where fwf comes from melting of ice shelves or iceberg 145 ztfrz(:,:) = -1.9 !tfreez( sss_m(:,:) ) !PM to be discuss (trouble if sensitivity study) 146 rnf_tsc(:,:,jp_tem) = ztfrz(:,:) * rnf(:,:) * r1_rau0 - rnf(:,:) * lfusisf * r1_rau0_rcp 147 END WHERE 148 ELSE ! use SST as runoffs temperature 149 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 150 ENDIF 151 ! ! use runoffs salinity data 152 IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 153 ! ! else use S=0 for runoffs (done one for all in the init) 154 IF ( ANY( rnf(:,:) < 0._wp ) ) z_err=1 155 IF(lk_mpp) CALL mpp_sum(z_err) 156 IF( z_err > 0 ) CALL ctl_stop( 'sbc_rnf : negative runnoff values exist' ) 157 ! 158 CALL iom_put( "runoffs", rnf ) ! output runoffs arrays 159 ENDIF 160 ! 161 ENDIF 162 ! 147 WHERE( sf_t_rnf(1)%fnow(:,:,1) == -222._wp ) ! where fwf comes from melting of ice shelves or iceberg 148 ztfrz(:,:) = -1.9 !tfreez( sss_m(:,:) ) !PM to be discuss (trouble if sensitivity study) 149 rnf_tsc(:,:,jp_tem) = ztfrz(:,:) * rnf(:,:) * r1_rau0 - rnf(:,:) * lfusisf * r1_rau0_rcp 150 END WHERE 151 ELSE ! use SST as runoffs temperature 152 rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 153 ENDIF 154 ! ! use runoffs salinity data 155 IF( ln_rnf_sal ) rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 156 ! ! else use S=0 for runoffs (done one for all in the init) 157 CALL iom_put( "runoffs", rnf ) ! output runoffs arrays 158 ENDIF 159 ! 160 ! ! ---------------------------------------- ! 163 161 IF( kt == nit000 ) THEN ! set the forcing field at nit000 - 1 ! 164 162 ! ! ---------------------------------------- ! … … 171 169 ELSE !* no restart: set from nit000 values 172 170 IF(lwp) WRITE(numout,*) ' nit000-1 runoff forcing fields set to nit000' 173 174 171 rnf_b (:,: ) = rnf (:,: ) 172 rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:) 175 173 ENDIF 176 174 ENDIF … … 186 184 CALL iom_rstput( kt, nitrst, numrow, 'rnf_sc_b', rnf_tsc(:,:,jp_sal) ) 187 185 ENDIF 186 ! 188 187 CALL wrk_dealloc( jpi,jpj, ztfrz) 189 188 ! … … 211 210 zfact = 0.5_wp 212 211 ! 213 IF( ln_rnf_depth ) THEN !== runoff distributed over several levels ==!212 IF( ln_rnf_depth .OR. ln_rnf_depth_ini ) THEN !== runoff distributed over several levels ==! 214 213 IF( lk_vvl ) THEN ! variable volume case 215 214 DO jj = 1, jpj ! update the depth over which runoffs are distributed … … 255 254 !!---------------------------------------------------------------------- 256 255 CHARACTER(len=32) :: rn_dep_file ! runoff file name 257 INTEGER :: ji, jj, jk ! dummy loop indices256 INTEGER :: ji, jj, jk, jm ! dummy loop indices 258 257 INTEGER :: ierror, inum ! temporary integer 259 258 INTEGER :: ios ! Local integer output status for namelist read 260 ! 261 NAMELIST/namsbc_rnf/ cn_dir, ln_rnf_emp, ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, & 259 INTEGER :: nbrec ! temporary integer 260 REAL(wp) :: zacoef 261 REAL(wp), DIMENSION(12) :: zrec ! times records 262 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zrnfcl 263 REAL(wp), DIMENSION(:,: ), ALLOCATABLE :: zrnf 264 ! 265 NAMELIST/namsbc_rnf/ cn_dir , ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, & 262 266 & sn_rnf, sn_cnf , sn_s_rnf , sn_t_rnf , sn_dep_rnf, & 263 & ln_rnf_mouth , rn_hrnf , rn_avt_rnf, rn_rfact 264 !!---------------------------------------------------------------------- 267 & ln_rnf_mouth , rn_hrnf , rn_avt_rnf, rn_rfact, & 268 & ln_rnf_depth_ini , rn_dep_max , rn_rnf_max, nn_rnf_depth_file 269 !!---------------------------------------------------------------------- 270 ! 271 ! !== allocate runoff arrays 272 IF( sbc_rnf_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_rnf_alloc : unable to allocate arrays' ) 273 ! 274 IF( .NOT. ln_rnf ) THEN ! no specific treatment in vicinity of river mouths 275 ln_rnf_mouth = .FALSE. ! default definition needed for example by sbc_ssr or by tra_adv_muscl 276 nkrnf = 0 277 rnf (:,:) = 0.0_wp 278 rnf_b (:,:) = 0.0_wp 279 rnfmsk (:,:) = 0.0_wp 280 rnfmsk_z(:) = 0.0_wp 281 RETURN 282 ENDIF 265 283 ! 266 284 ! ! ============ … … 283 301 WRITE(numout,*) '~~~~~~~ ' 284 302 WRITE(numout,*) ' Namelist namsbc_rnf' 285 WRITE(numout,*) ' runoff in a file to be read ln_rnf_emp = ', ln_rnf_emp286 303 WRITE(numout,*) ' specific river mouths treatment ln_rnf_mouth = ', ln_rnf_mouth 287 304 WRITE(numout,*) ' river mouth additional Kz rn_avt_rnf = ', rn_avt_rnf … … 289 306 WRITE(numout,*) ' multiplicative factor for runoff rn_rfact = ', rn_rfact 290 307 ENDIF 291 !292 308 ! ! ================== 293 309 ! ! Type of runoff 294 310 ! ! ================== 295 ! !== allocate runoff arrays 296 IF( sbc_rnf_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_rnf_alloc : unable to allocate arrays' ) 297 ! 298 IF( ln_rnf_emp ) THEN !== runoffs directly provided in the precipitations ==! 299 IF(lwp) WRITE(numout,*) 300 IF(lwp) WRITE(numout,*) ' runoffs directly provided in the precipitations' 301 IF( ln_rnf_depth .OR. ln_rnf_tem .OR. ln_rnf_sal ) THEN 302 CALL ctl_warn( 'runoffs already included in precipitations, so runoff (T,S, depth) attributes will not be used' ) 303 ln_rnf_depth = .FALSE. ; ln_rnf_tem = .FALSE. ; ln_rnf_sal = .FALSE. 304 ENDIF 305 ! 306 ELSE !== runoffs read in a file : set sf_rnf structure ==! 307 ! 311 ! 312 IF( .NOT. l_rnfcpl ) THEN 308 313 ALLOCATE( sf_rnf(1), STAT=ierror ) ! Create sf_rnf structure (runoff inflow) 309 314 IF(lwp) WRITE(numout,*) … … 314 319 ALLOCATE( sf_rnf(1)%fnow(jpi,jpj,1) ) 315 320 IF( sn_rnf%ln_tint ) ALLOCATE( sf_rnf(1)%fdta(jpi,jpj,1,2) ) 316 ! ! fill sf_rnf with the namelist (sn_rnf) and control print317 321 CALL fld_fill( sf_rnf, (/ sn_rnf /), cn_dir, 'sbc_rnf_init', 'read runoffs data', 'namsbc_rnf' ) 318 ! 319 IF( ln_rnf_tem ) THEN ! Create (if required) sf_t_rnf structure 320 IF(lwp) WRITE(numout,*) 321 IF(lwp) WRITE(numout,*) ' runoffs temperatures read in a file' 322 ALLOCATE( sf_t_rnf(1), STAT=ierror ) 323 IF( ierror > 0 ) THEN 324 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' ) ; RETURN 325 ENDIF 326 ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1) ) 327 IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) ) 328 CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 329 ENDIF 330 ! 331 IF( ln_rnf_sal ) THEN ! Create (if required) sf_s_rnf and sf_t_rnf structures 332 IF(lwp) WRITE(numout,*) 333 IF(lwp) WRITE(numout,*) ' runoffs salinities read in a file' 334 ALLOCATE( sf_s_rnf(1), STAT=ierror ) 335 IF( ierror > 0 ) THEN 336 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' ) ; RETURN 337 ENDIF 338 ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1) ) 339 IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) ) 340 CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 341 ENDIF 342 ! 343 IF( ln_rnf_depth ) THEN ! depth of runoffs set from a file 344 IF(lwp) WRITE(numout,*) 345 IF(lwp) WRITE(numout,*) ' runoffs depth read in a file' 346 rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 347 IF( .NOT. sn_dep_rnf%ln_clim ) THEN ; WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear ! add year 348 IF( sn_dep_rnf%cltype == 'monthly' ) WRITE(rn_dep_file, '(a,"m",i2)' ) TRIM( rn_dep_file ), nmonth ! add month 349 ENDIF 350 CALL iom_open ( rn_dep_file, inum ) ! open file 351 CALL iom_get ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf ) ! read the river mouth array 352 CALL iom_close( inum ) ! close file 353 ! 354 nk_rnf(:,:) = 0 ! set the number of level over which river runoffs are applied 355 DO jj = 1, jpj 356 DO ji = 1, jpi 357 IF( h_rnf(ji,jj) > 0._wp ) THEN 358 jk = 2 359 DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 ; END DO 360 nk_rnf(ji,jj) = jk 361 ELSEIF( h_rnf(ji,jj) == -1._wp ) THEN ; nk_rnf(ji,jj) = 1 362 ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN ; nk_rnf(ji,jj) = mbkt(ji,jj) 363 ELSE 364 CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 365 WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 366 ENDIF 322 ENDIF 323 ! 324 IF( ln_rnf_tem ) THEN ! Create (if required) sf_t_rnf structure 325 IF(lwp) WRITE(numout,*) 326 IF(lwp) WRITE(numout,*) ' runoffs temperatures read in a file' 327 ALLOCATE( sf_t_rnf(1), STAT=ierror ) 328 IF( ierror > 0 ) THEN 329 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' ) ; RETURN 330 ENDIF 331 ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1) ) 332 IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) ) 333 CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 334 ENDIF 335 ! 336 IF( ln_rnf_sal ) THEN ! Create (if required) sf_s_rnf and sf_t_rnf structures 337 IF(lwp) WRITE(numout,*) 338 IF(lwp) WRITE(numout,*) ' runoffs salinities read in a file' 339 ALLOCATE( sf_s_rnf(1), STAT=ierror ) 340 IF( ierror > 0 ) THEN 341 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' ) ; RETURN 342 ENDIF 343 ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1) ) 344 IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) ) 345 CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 346 ENDIF 347 ! 348 IF( ln_rnf_depth ) THEN ! depth of runoffs set from a file 349 IF(lwp) WRITE(numout,*) 350 IF(lwp) WRITE(numout,*) ' runoffs depth read in a file' 351 rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 352 IF( .NOT. sn_dep_rnf%ln_clim ) THEN ; WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear ! add year 353 IF( sn_dep_rnf%cltype == 'monthly' ) WRITE(rn_dep_file, '(a,"m",i2)' ) TRIM( rn_dep_file ), nmonth ! add month 354 ENDIF 355 CALL iom_open ( rn_dep_file, inum ) ! open file 356 CALL iom_get ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf ) ! read the river mouth array 357 CALL iom_close( inum ) ! close file 358 ! 359 nk_rnf(:,:) = 0 ! set the number of level over which river runoffs are applied 360 DO jj = 1, jpj 361 DO ji = 1, jpi 362 IF( h_rnf(ji,jj) > 0._wp ) THEN 363 jk = 2 364 DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 365 END DO 366 nk_rnf(ji,jj) = jk 367 ELSEIF( h_rnf(ji,jj) == -1._wp ) THEN ; nk_rnf(ji,jj) = 1 368 ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN ; nk_rnf(ji,jj) = mbkt(ji,jj) 369 ELSE 370 CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 371 WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 372 ENDIF 373 END DO 374 END DO 375 DO jj = 1, jpj ! set the associated depth 376 DO ji = 1, jpi 377 h_rnf(ji,jj) = 0._wp 378 DO jk = 1, nk_rnf(ji,jj) 379 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 367 380 END DO 368 381 END DO 369 DO jj = 1, jpj ! set the associated depth 370 DO ji = 1, jpi 371 h_rnf(ji,jj) = 0._wp 372 DO jk = 1, nk_rnf(ji,jj) 373 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 382 END DO 383 ! 384 ELSE IF( ln_rnf_depth_ini ) THEN ! runoffs applied at the surface 385 ! 386 IF(lwp) WRITE(numout,*) 387 IF(lwp) WRITE(numout,*) ' depth of runoff computed once from max value of runoff' 388 IF(lwp) WRITE(numout,*) ' max value of the runoff climatologie (over global domain) rn_rnf_max = ', rn_rnf_max 389 IF(lwp) WRITE(numout,*) ' depth over which runoffs is spread rn_dep_max = ', rn_dep_max 390 IF(lwp) WRITE(numout,*) ' create (=1) a runoff depth file or not (=0) nn_rnf_depth_file = ', nn_rnf_depth_file 391 392 CALL iom_open( TRIM( sn_rnf%clname ), inum ) ! open runoff file 393 CALL iom_gettime( inum, zrec, kntime=nbrec) 394 ALLOCATE( zrnfcl(jpi,jpj,nbrec) ) ; ALLOCATE( zrnf(jpi,jpj) ) 395 DO jm = 1, nbrec 396 CALL iom_get( inum, jpdom_data, TRIM( sn_rnf%clvar ), zrnfcl(:,:,jm), jm ) 397 END DO 398 CALL iom_close( inum ) 399 zrnf(:,:) = MAXVAL( zrnfcl(:,:,:), DIM=3 ) ! maximum value in time 400 DEALLOCATE( zrnfcl ) 401 ! 402 h_rnf(:,:) = 1. 403 ! 404 zacoef = rn_dep_max / rn_rnf_max ! coef of linear relation between runoff and its depth (150m for max of runoff) 405 ! 406 WHERE( zrnf(:,:) > 0._wp ) h_rnf(:,:) = zacoef * zrnf(:,:) ! compute depth for all runoffs 407 ! 408 DO jj = 1, jpj ! take in account min depth of ocean rn_hmin 409 DO ji = 1, jpi 410 IF( zrnf(ji,jj) > 0._wp ) THEN 411 jk = mbkt(ji,jj) 412 h_rnf(ji,jj) = MIN( h_rnf(ji,jj), gdept_0(ji,jj,jk ) ) 413 ENDIF 414 END DO 415 END DO 416 ! 417 nk_rnf(:,:) = 0 ! number of levels on which runoffs are distributed 418 DO jj = 1, jpj 419 DO ji = 1, jpi 420 IF( zrnf(ji,jj) > 0._wp ) THEN 421 jk = 2 422 DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 374 423 END DO 424 nk_rnf(ji,jj) = jk 425 ELSE 426 nk_rnf(ji,jj) = 1 427 ENDIF 428 END DO 429 END DO 430 ! 431 DEALLOCATE( zrnf ) 432 ! 433 DO jj = 1, jpj ! set the associated depth 434 DO ji = 1, jpi 435 h_rnf(ji,jj) = 0._wp 436 DO jk = 1, nk_rnf(ji,jj) 437 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 375 438 END DO 376 439 END DO 377 ELSE ! runoffs applied at the surface 378 nk_rnf(:,:) = 1 379 h_rnf (:,:) = fse3t(:,:,1) 380 ENDIF 381 ! 440 END DO 441 ! 442 IF( nn_rnf_depth_file == 1 ) THEN ! save output nb levels for runoff 443 IF(lwp) WRITE(numout,*) ' create runoff depht file' 444 CALL iom_open ( TRIM( sn_dep_rnf%clname ), inum, ldwrt = .TRUE., kiolib = jprstlib ) 445 CALL iom_rstput( 0, 0, inum, 'rodepth', h_rnf ) 446 CALL iom_close ( inum ) 447 ENDIF 448 ELSE ! runoffs applied at the surface 449 nk_rnf(:,:) = 1 450 h_rnf (:,:) = fse3t(:,:,1) 382 451 ENDIF 383 452 ! … … 400 469 IF( rn_hrnf > 0._wp ) THEN 401 470 nkrnf = 2 402 DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf ) ; nkrnf = nkrnf + 1 ; END DO 471 DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf ) ; nkrnf = nkrnf + 1 472 END DO 403 473 IF( ln_sco ) CALL ctl_warn( 'sbc_rnf: number of levels over which Kz is increased is computed for zco...' ) 404 474 ENDIF
Note: See TracChangeset
for help on using the changeset viewer.