Changeset 5682 for branches/2015/dev_r5072_UKMO2_OBS_simplification/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90
- Timestamp:
- 2015-08-12T17:46:45+02:00 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2015/dev_r5072_UKMO2_OBS_simplification/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90
r4990 r5682 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) 37 37 ! !!* 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 38 CHARACTER(len=100) :: cn_dir !: Root directory for location of rnf files 39 LOGICAL :: ln_rnf_depth !: depth river runoffs attribute specified in a file 40 LOGICAL :: ln_rnf_depth_ini !: depth river runoffs computed at the initialisation 41 REAL(wp) :: rn_rnf_max !: maximum value of the runoff climatologie ( ln_rnf_depth_ini = .true ) 42 REAL(wp) :: rn_dep_max !: depth over which runoffs is spread ( ln_rnf_depth_ini = .true ) 43 INTEGER :: nn_rnf_depth_file !: create (=1) a runoff depth file or not (=0) 44 LOGICAL :: ln_rnf_tem !: temperature river runoffs attribute specified in a file 41 45 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 46 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 read47 TYPE(FLD_N) :: sn_cnf !: information about the runoff mouth file to be read 45 48 TYPE(FLD_N) :: sn_s_rnf !: information about the salinities of runoff file to be read 46 49 TYPE(FLD_N) :: sn_t_rnf !: information about the temperatures of runoff file to be read 47 50 TYPE(FLD_N) :: sn_dep_rnf !: information about the depth which river inflow affects 48 51 LOGICAL , PUBLIC :: ln_rnf_mouth !: specific treatment in mouths vicinity 49 REAL(wp) , PUBLIC:: rn_hrnf !: runoffs, depth over which enhanced vertical mixing is used52 REAL(wp) :: rn_hrnf !: runoffs, depth over which enhanced vertical mixing is used 50 53 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 54 REAL(wp) :: rn_rfact !: multiplicative factor for runoff 55 56 LOGICAL , PUBLIC :: l_rnfcpl = .false. ! runoffs recieved from oasis 52 57 53 58 INTEGER , PUBLIC :: nkrnf = 0 !: nb of levels over which Kz is increased at river mouths … … 58 63 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 64 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)65 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_rnf ! structure: river runoff (file information, fields read) 66 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_s_rnf ! structure: river runoff salinity (file information, fields read) 67 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_t_rnf ! structure: river runoff temperature (file information, fields read) 63 68 64 69 !! * Substitutions … … 105 110 CALL wrk_alloc( jpi,jpj, ztfrz) 106 111 107 !108 IF( kt == nit000 ) CALL sbc_rnf_init ! Read namelist and allocate structures109 110 112 ! ! ---------------------------------------- ! 111 113 IF( kt /= nit000 ) THEN ! Swap of forcing fields ! … … 116 118 ENDIF 117 119 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) 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 ! 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) 133 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 131 145 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 ! 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 ! 159 ! ! ---------------------------------------- ! 163 160 IF( kt == nit000 ) THEN ! set the forcing field at nit000 - 1 ! 164 161 ! ! ---------------------------------------- ! … … 171 168 ELSE !* no restart: set from nit000 values 172 169 IF(lwp) WRITE(numout,*) ' nit000-1 runoff forcing fields set to nit000' 173 174 170 rnf_b (:,: ) = rnf (:,: ) 171 rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:) 175 172 ENDIF 176 173 ENDIF … … 186 183 CALL iom_rstput( kt, nitrst, numrow, 'rnf_sc_b', rnf_tsc(:,:,jp_sal) ) 187 184 ENDIF 185 ! 188 186 CALL wrk_dealloc( jpi,jpj, ztfrz) 189 187 ! … … 211 209 zfact = 0.5_wp 212 210 ! 213 IF( ln_rnf_depth ) THEN !== runoff distributed over several levels ==!211 IF( ln_rnf_depth .OR. ln_rnf_depth_ini ) THEN !== runoff distributed over several levels ==! 214 212 IF( lk_vvl ) THEN ! variable volume case 215 213 DO jj = 1, jpj ! update the depth over which runoffs are distributed … … 255 253 !!---------------------------------------------------------------------- 256 254 CHARACTER(len=32) :: rn_dep_file ! runoff file name 257 INTEGER :: ji, jj, jk ! dummy loop indices255 INTEGER :: ji, jj, jk, jm ! dummy loop indices 258 256 INTEGER :: ierror, inum ! temporary integer 259 257 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, & 258 INTEGER :: nbrec ! temporary integer 259 REAL(wp) :: zacoef 260 REAL(wp), DIMENSION(12) :: zrec ! times records 261 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zrnfcl 262 REAL(wp), DIMENSION(:,: ), ALLOCATABLE :: zrnf 263 ! 264 NAMELIST/namsbc_rnf/ cn_dir , ln_rnf_depth, ln_rnf_tem, ln_rnf_sal, & 262 265 & 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 !!---------------------------------------------------------------------- 266 & ln_rnf_mouth , rn_hrnf , rn_avt_rnf, rn_rfact, & 267 & ln_rnf_depth_ini , rn_dep_max , rn_rnf_max, nn_rnf_depth_file 268 !!---------------------------------------------------------------------- 269 ! 270 ! !== allocate runoff arrays 271 IF( sbc_rnf_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'sbc_rnf_alloc : unable to allocate arrays' ) 272 ! 273 IF( .NOT. ln_rnf ) THEN ! no specific treatment in vicinity of river mouths 274 ln_rnf_mouth = .FALSE. ! default definition needed for example by sbc_ssr or by tra_adv_muscl 275 nkrnf = 0 276 rnf (:,:) = 0.0_wp 277 rnf_b (:,:) = 0.0_wp 278 rnfmsk (:,:) = 0.0_wp 279 rnfmsk_z(:) = 0.0_wp 280 RETURN 281 ENDIF 265 282 ! 266 283 ! ! ============ … … 283 300 WRITE(numout,*) '~~~~~~~ ' 284 301 WRITE(numout,*) ' Namelist namsbc_rnf' 285 WRITE(numout,*) ' runoff in a file to be read ln_rnf_emp = ', ln_rnf_emp286 302 WRITE(numout,*) ' specific river mouths treatment ln_rnf_mouth = ', ln_rnf_mouth 287 303 WRITE(numout,*) ' river mouth additional Kz rn_avt_rnf = ', rn_avt_rnf … … 289 305 WRITE(numout,*) ' multiplicative factor for runoff rn_rfact = ', rn_rfact 290 306 ENDIF 291 !292 307 ! ! ================== 293 308 ! ! Type of runoff 294 309 ! ! ================== 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 ! 310 ! 311 IF( .NOT. l_rnfcpl ) THEN 308 312 ALLOCATE( sf_rnf(1), STAT=ierror ) ! Create sf_rnf structure (runoff inflow) 309 313 IF(lwp) WRITE(numout,*) … … 314 318 ALLOCATE( sf_rnf(1)%fnow(jpi,jpj,1) ) 315 319 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 320 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 321 ENDIF 322 ! 323 IF( ln_rnf_tem ) THEN ! Create (if required) sf_t_rnf structure 324 IF(lwp) WRITE(numout,*) 325 IF(lwp) WRITE(numout,*) ' runoffs temperatures read in a file' 326 ALLOCATE( sf_t_rnf(1), STAT=ierror ) 327 IF( ierror > 0 ) THEN 328 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' ) ; RETURN 329 ENDIF 330 ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1) ) 331 IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) ) 332 CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 333 ENDIF 334 ! 335 IF( ln_rnf_sal ) THEN ! Create (if required) sf_s_rnf and sf_t_rnf structures 336 IF(lwp) WRITE(numout,*) 337 IF(lwp) WRITE(numout,*) ' runoffs salinities read in a file' 338 ALLOCATE( sf_s_rnf(1), STAT=ierror ) 339 IF( ierror > 0 ) THEN 340 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' ) ; RETURN 341 ENDIF 342 ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1) ) 343 IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) ) 344 CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 345 ENDIF 346 ! 347 IF( ln_rnf_depth ) THEN ! depth of runoffs set from a file 348 IF(lwp) WRITE(numout,*) 349 IF(lwp) WRITE(numout,*) ' runoffs depth read in a file' 350 rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 351 IF( .NOT. sn_dep_rnf%ln_clim ) THEN ; WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear ! add year 352 IF( sn_dep_rnf%cltype == 'monthly' ) WRITE(rn_dep_file, '(a,"m",i2)' ) TRIM( rn_dep_file ), nmonth ! add month 353 ENDIF 354 CALL iom_open ( rn_dep_file, inum ) ! open file 355 CALL iom_get ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf ) ! read the river mouth array 356 CALL iom_close( inum ) ! close file 357 ! 358 nk_rnf(:,:) = 0 ! set the number of level over which river runoffs are applied 359 DO jj = 1, jpj 360 DO ji = 1, jpi 361 IF( h_rnf(ji,jj) > 0._wp ) THEN 362 jk = 2 363 DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 364 END DO 365 nk_rnf(ji,jj) = jk 366 ELSEIF( h_rnf(ji,jj) == -1._wp ) THEN ; nk_rnf(ji,jj) = 1 367 ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN ; nk_rnf(ji,jj) = mbkt(ji,jj) 368 ELSE 369 CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 370 WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 371 ENDIF 372 END DO 373 END DO 374 DO jj = 1, jpj ! set the associated depth 375 DO ji = 1, jpi 376 h_rnf(ji,jj) = 0._wp 377 DO jk = 1, nk_rnf(ji,jj) 378 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 367 379 END DO 368 380 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) 381 END DO 382 ! 383 ELSE IF( ln_rnf_depth_ini ) THEN ! runoffs applied at the surface 384 ! 385 IF(lwp) WRITE(numout,*) 386 IF(lwp) WRITE(numout,*) ' depth of runoff computed once from max value of runoff' 387 IF(lwp) WRITE(numout,*) ' max value of the runoff climatologie (over global domain) rn_rnf_max = ', rn_rnf_max 388 IF(lwp) WRITE(numout,*) ' depth over which runoffs is spread rn_dep_max = ', rn_dep_max 389 IF(lwp) WRITE(numout,*) ' create (=1) a runoff depth file or not (=0) nn_rnf_depth_file = ', nn_rnf_depth_file 390 391 CALL iom_open( TRIM( sn_rnf%clname ), inum ) ! open runoff file 392 CALL iom_gettime( inum, zrec, kntime=nbrec) 393 ALLOCATE( zrnfcl(jpi,jpj,nbrec) ) ; ALLOCATE( zrnf(jpi,jpj) ) 394 DO jm = 1, nbrec 395 CALL iom_get( inum, jpdom_data, TRIM( sn_rnf%clvar ), zrnfcl(:,:,jm), jm ) 396 END DO 397 CALL iom_close( inum ) 398 zrnf(:,:) = MAXVAL( zrnfcl(:,:,:), DIM=3 ) ! maximum value in time 399 DEALLOCATE( zrnfcl ) 400 ! 401 h_rnf(:,:) = 1. 402 ! 403 zacoef = rn_dep_max / rn_rnf_max ! coef of linear relation between runoff and its depth (150m for max of runoff) 404 ! 405 WHERE( zrnf(:,:) > 0._wp ) h_rnf(:,:) = zacoef * zrnf(:,:) ! compute depth for all runoffs 406 ! 407 DO jj = 1, jpj ! take in account min depth of ocean rn_hmin 408 DO ji = 1, jpi 409 IF( zrnf(ji,jj) > 0._wp ) THEN 410 jk = mbkt(ji,jj) 411 h_rnf(ji,jj) = MIN( h_rnf(ji,jj), gdept_0(ji,jj,jk ) ) 412 ENDIF 413 END DO 414 END DO 415 ! 416 nk_rnf(:,:) = 0 ! number of levels on which runoffs are distributed 417 DO jj = 1, jpj 418 DO ji = 1, jpi 419 IF( zrnf(ji,jj) > 0._wp ) THEN 420 jk = 2 421 DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ; jk = jk + 1 374 422 END DO 423 nk_rnf(ji,jj) = jk 424 ELSE 425 nk_rnf(ji,jj) = 1 426 ENDIF 427 END DO 428 END DO 429 ! 430 DEALLOCATE( zrnf ) 431 ! 432 DO jj = 1, jpj ! set the associated depth 433 DO ji = 1, jpi 434 h_rnf(ji,jj) = 0._wp 435 DO jk = 1, nk_rnf(ji,jj) 436 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 375 437 END DO 376 438 END DO 377 ELSE ! runoffs applied at the surface 378 nk_rnf(:,:) = 1 379 h_rnf (:,:) = fse3t(:,:,1) 380 ENDIF 381 ! 439 END DO 440 ! 441 IF( nn_rnf_depth_file == 1 ) THEN ! save output nb levels for runoff 442 IF(lwp) WRITE(numout,*) ' create runoff depht file' 443 CALL iom_open ( TRIM( sn_dep_rnf%clname ), inum, ldwrt = .TRUE., kiolib = jprstlib ) 444 CALL iom_rstput( 0, 0, inum, 'rodepth', h_rnf ) 445 CALL iom_close ( inum ) 446 ENDIF 447 ELSE ! runoffs applied at the surface 448 nk_rnf(:,:) = 1 449 h_rnf (:,:) = fse3t(:,:,1) 382 450 ENDIF 383 451 ! … … 400 468 IF( rn_hrnf > 0._wp ) THEN 401 469 nkrnf = 2 402 DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf ) ; nkrnf = nkrnf + 1 ; END DO 470 DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf ) ; nkrnf = nkrnf + 1 471 END DO 403 472 IF( ln_sco ) CALL ctl_warn( 'sbc_rnf: number of levels over which Kz is increased is computed for zco...' ) 404 473 ENDIF
Note: See TracChangeset
for help on using the changeset viewer.