- Timestamp:
- 2010-10-11T18:51:54+02:00 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DEV_r2191_3partymerge2010/NEMO/OPA_SRC/SBC/sbcrnf.F90
r1730 r2207 25 25 PRIVATE 26 26 27 PUBLIC sbc_rnf ! routine call in step module 28 29 ! !!* namsbc_rnf namelist * 27 PUBLIC sbc_rnf ! routine call in sbcmod module 28 PUBLIC sbc_rnf_div ! routine called in sshwzv module 29 30 ! !!* namsbc_rnf namelist * 30 31 CHARACTER(len=100), PUBLIC :: cn_dir = './' !: Root directory for location of ssr files 32 LOGICAL , PUBLIC :: ln_rnf_depth = .false. !: depth river runoffs attribute specified in a file 33 LOGICAL , PUBLIC :: ln_rnf_temp = .false. !: temperature river runoffs attribute specified in a file 34 LOGICAL , PUBLIC :: ln_rnf_sal = .false. !: salinity river runoffs attribute specified in a file 31 35 LOGICAL , PUBLIC :: ln_rnf_emp = .false. !: runoffs into a file to be read or already into precipitation 32 36 TYPE(FLD_N) , PUBLIC :: sn_rnf !: information about the runoff file to be read 33 37 TYPE(FLD_N) , PUBLIC :: sn_cnf !: information about the runoff mouth file to be read 38 TYPE(FLD_N) :: sn_s_rnf !: information about the salinities of runoff file to be read 39 TYPE(FLD_N) :: sn_t_rnf !: information about the temperatures of runoff file to be read 40 TYPE(FLD_N) :: sn_dep_rnf !: information about the depth which river inflow affects 34 41 LOGICAL , PUBLIC :: ln_rnf_mouth = .false. !: specific treatment in mouths vicinity 35 42 REAL(wp) , PUBLIC :: rn_hrnf = 0.e0 !: runoffs, depth over which enhanced vertical mixing is used … … 37 44 REAL(wp) , PUBLIC :: rn_rfact = 1.e0 !: multiplicative factor for runoff 38 45 39 INTEGER , PUBLIC :: nkrnf = 0 !: number of levels over which Kz is increased at river mouths 40 REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: rnfmsk !: river mouth mask (hori.) 41 REAL(wp), PUBLIC, DIMENSION(jpk) :: rnfmsk_z !: river mouth mask (vert.) 42 43 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_rnf ! structure of input SST (file information, fields read) 46 INTEGER , PUBLIC :: nkrnf = 0 !: number of levels over which Kz is increased at river mouths 47 REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: rnfmsk !: river mouth mask (hori.) 48 REAL(wp), PUBLIC, DIMENSION(jpk) :: rnfmsk_z !: river mouth mask (vert.) 49 50 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_rnf !: structure of input river runoff (file information, fields read) 51 52 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_s_rnf !: structure of input river runoff salinity (file information, fields read) 53 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_t_rnf !: structure of input river runoff temperature (file information, fields read) 54 55 REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: h_rnf !: depth of runoff in m 56 INTEGER, PUBLIC, DIMENSION(jpi,jpj) :: nk_rnf !: depth of runoff in model levels 57 58 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,2) :: tsc_rnf !: temperature & salinity content of river runoffs [K.m/s & PSU.m/s] 59 60 INTEGER, PUBLIC :: jp_sal=1 61 INTEGER, PUBLIC :: jp_tem=2 62 63 ! REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: rnf_sal !: salinity of river runoff 64 ! REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: rnf_tmp !: temperature of river runoff 65 66 INTEGER :: ji, jj ,jk ! dummy loop indices 67 INTEGER :: inum ! temporary logical unit 68 69 !! * Substitutions 70 # include "domzgr_substitute.h90" 44 71 45 72 !!---------------------------------------------------------------------- … … 66 93 !! 67 94 INTEGER :: ji, jj ! dummy loop indices 68 INTEGER :: ierror ! temporary integer95 REAL(wp) :: z1_rau0 ! local scalar 69 96 !!---------------------------------------------------------------------- 70 97 ! 71 98 IF( kt == nit000 ) THEN 72 IF( .NOT. ln_rnf_emp ) THEN 73 ALLOCATE( sf_rnf(1), STAT=ierror ) 74 IF( ierror > 0 ) THEN 75 CALL ctl_stop( 'sbc_rnf: unable to allocate sf_rnf structure' ) ; RETURN 76 ENDIF 77 ALLOCATE( sf_rnf(1)%fnow(jpi,jpj) ) 78 ALLOCATE( sf_rnf(1)%fdta(jpi,jpj,2) ) 79 ENDIF 80 CALL sbc_rnf_init(sf_rnf) 99 CALL sbc_rnf_init ! Read namelist and allocate structures 81 100 ENDIF 82 101 … … 85 104 ! !-------------------! 86 105 ! 87 CALL fld_read( kt, nn_fsbc, sf_rnf ) ! Read Runoffs data and provides it 88 ! ! at the current time-step 106 CALL fld_read ( kt, nn_fsbc, sf_rnf ) ! Read Runoffs data and provide it at kt 107 IF( ln_rnf_temp ) CALL fld_read ( kt, nn_fsbc, sf_t_rnf ) ! idem for runoffs temperature if required 108 IF( ln_rnf_sal ) CALL fld_read ( kt, nn_fsbc, sf_s_rnf ) ! idem for runoffs salinity if required 89 109 90 110 ! Runoff reduction only associated to the ORCA2_LIM configuration … … 101 121 102 122 IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN 103 emp (:,:) = emp (:,:) - rn_rfact * ABS( sf_rnf(1)%fnow(:,:) ) 104 emps(:,:) = emps(:,:) - rn_rfact * ABS( sf_rnf(1)%fnow(:,:) ) 105 CALL iom_put( "runoffs", sf_rnf(1)%fnow ) ! runoffs 123 rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:) ) 124 ! 125 z1_rau0 = 1.e0 / rau0 126 ! ! set temperature & salinity content of runoffs 127 IF( ln_rnf_temp ) THEN ! use runoffs temperature data 128 tsc_rnf(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:) ) * rnf(:,:) * z1_rau0 129 WHERE( sf_t_rnf(1)%fnow(:,:) == -999 ) ! if missing data value use SST as runoffs temperature 130 tsc_rnf(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * z1_rau0 131 ENDWHERE 132 ELSE ! use SST as runoffs temperature 133 tsc_rnf(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * z1_rau0 134 ENDIF 135 ! ! use runoffs salinity data 136 IF( ln_rnf_sal ) tsc_rnf(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:) ) * rnf(:,:) * z1_rau0 137 ! ! else use S=0 for runoffs (done one for all in the init) 138 ! 139 IF( ln_rnf_temp .OR. ln_rnf_sal ) THEN ! runoffs as outflow: use ocean SST and SSS 140 WHERE( rnf(:,:) < 0.e0 ) ! example baltic model when flow is out of domain 141 tsc_rnf(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * z1_rau0 142 tsc_rnf(:,:,jp_sal) = sss_m(:,:) * rnf(:,:) * z1_rau0 143 ENDWHERE 144 ENDIF 145 146 CALL iom_put( "runoffs", rnf ) ! output runoffs arrays 106 147 ENDIF 107 148 ! … … 110 151 END SUBROUTINE sbc_rnf 111 152 112 113 SUBROUTINE sbc_rnf_init( sf_rnf ) 153 SUBROUTINE sbc_rnf_div( phdivn ) 154 !!---------------------------------------------------------------------- 155 !! *** ROUTINE sbc_rnf *** 156 !! 157 !! ** Purpose : update the horizontal divergence with the runoff inflow 158 !! 159 !! ** Method : 160 !! CAUTION : rnf is positive (inflow) decreasing the 161 !! divergence and expressed in m/s 162 !! 163 !! ** Action : phdivn decreased by the runoff inflow 164 !!---------------------------------------------------------------------- 165 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: phdivn ! horizontal divergence 166 !! 167 INTEGER :: ji, jj, jk ! dummy loop indices 168 REAL(wp) :: z1_rau0 ! local scalar 169 !!---------------------------------------------------------------------- 170 ! 171 z1_rau0 = 1.e0 / rau0 172 IF( ln_rnf_depth ) THEN !== runoff distributed over several levels ==! 173 IF( lk_vvl ) THEN ! variable volume case 174 DO jj = 1, jpj ! update the depth over which runoffs are distributed 175 DO ji = 1, jpi 176 h_rnf(ji,jj) = 0.e0 177 DO jk = 1, nk_rnf(ji,jj) ! recalculates h_rnf to be the depth in metres 178 h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) ! to the bottom of the relevant grid box 179 END DO 180 ! ! apply the runoff input flow 181 DO jk = 1, nk_rnf(ji,jj) 182 phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - rnf(ji,jj) * z1_rau0 / h_rnf(ji,jj) 183 END DO 184 END DO 185 END DO 186 ELSE ! constant volume case : just apply the runoff input flow 187 DO jj = 1, jpj 188 DO ji = 1, jpi 189 DO jk = 1, nk_rnf(ji,jj) 190 phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - rnf(ji,jj) * z1_rau0 / h_rnf(ji,jj) 191 END DO 192 END DO 193 END DO 194 ENDIF 195 ELSE !== runoff put only at the surface ==! 196 phdivn(:,:,1) = phdivn(:,:,1) - rnf(:,:) * z1_rau0 / fse3t(:,:,1) 197 ENDIF 198 ! 199 END SUBROUTINE sbc_rnf_div 200 201 202 SUBROUTINE sbc_rnf_init 114 203 !!---------------------------------------------------------------------- 115 204 !! *** ROUTINE sbc_rnf_init *** … … 121 210 !! ** Action : - read parameters 122 211 !!---------------------------------------------------------------------- 123 TYPE(FLD), INTENT(inout), DIMENSION(:) :: sf_rnf ! input data 124 !! 125 NAMELIST/namsbc_rnf/ cn_dir, ln_rnf_emp, sn_rnf, sn_cnf, ln_rnf_mouth, & 126 & rn_hrnf, rn_avt_rnf, rn_rfact 212 CHARACTER(len=32) :: rn_dep_file ! runoff file name 213 INTEGER :: ierror ! temporary integer 214 !! 215 NAMELIST/namsbc_rnf/ cn_dir, ln_rnf_emp, ln_rnf_depth, ln_rnf_temp, ln_rnf_sal, & 216 & sn_rnf, sn_cnf , sn_s_rnf , sn_t_rnf , sn_dep_rnf, & 217 & ln_rnf_mouth , rn_hrnf , rn_avt_rnf , rn_rfact 127 218 !!---------------------------------------------------------------------- 128 219 … … 136 227 sn_cnf = FLD_N( 'runoffs', 0 , 'sorunoff' , .FALSE. , .true. , 'yearly' , '' , '' ) 137 228 229 sn_s_rnf = FLD_N( 'runoffs', 24. , 'rosaline' , .TRUE. , .true. , 'yearly' , '' , '' ) 230 sn_t_rnf = FLD_N( 'runoffs', 24. , 'rotemper' , .TRUE. , .true. , 'yearly' , '' , '' ) 231 sn_dep_rnf = FLD_N( 'runoffs', 0. , 'rodepth' , .FALSE. , .true. , 'yearly' , '' , '' ) 138 232 ! 139 233 REWIND ( numnam ) ! Read Namelist namsbc_rnf … … 157 251 ! ! ================== 158 252 ! 159 IF( ln_rnf_emp ) THEN ! runoffs directly provided in the precipitations253 IF( ln_rnf_emp ) THEN !== runoffs directly provided in the precipitations ==! 160 254 IF(lwp) WRITE(numout,*) 161 255 IF(lwp) WRITE(numout,*) ' runoffs directly provided in the precipitations' 162 ! 163 ELSE ! runoffs read in a file : set sf_rnf structure 164 ! 165 ! sf_rnf already allocated in main routine 166 ! fill sf_rnf with sn_rnf and control print 256 IF( ln_rnf_depth .OR. ln_rnf_temp .OR. ln_rnf_sal ) THEN 257 CALL ctl_warn( 'runoffs already included in precipitations, so runoff (T,S, depth) attributes will not be used' ) 258 ln_rnf_depth = .FALSE. ; ln_rnf_temp = .FALSE. ; ln_rnf_sal = .FALSE. 259 ENDIF 260 ! 261 ELSE !== runoffs read in a file : set sf_rnf structure ==! 262 ! 263 ALLOCATE( sf_rnf(1), STAT=ierror ) ! Create sf_rnf structure (runoff inflow) 264 IF(lwp) WRITE(numout,*) 265 IF(lwp) WRITE(numout,*) ' runoffs inflow read in a file' 266 IF( ierror > 0 ) THEN 267 CALL ctl_stop( 'sbc_rnf: unable to allocate sf_rnf structure' ) ; RETURN 268 ENDIF 269 ALLOCATE( sf_rnf(1)%fnow(jpi,jpj) ) ; ALLOCATE( sf_rnf(1)%fdta(jpi,jpj,2) ) 270 ! ! fill sf_rnf with the namelist (sn_rnf) and control print 167 271 CALL fld_fill( sf_rnf, (/ sn_rnf /), cn_dir, 'sbc_rnf_init', 'read runoffs data', 'namsbc_rnf' ) 168 272 ! 169 ENDIF 170 273 IF( ln_rnf_temp ) THEN ! Create (if required) sf_t_rnf structure 274 IF(lwp) WRITE(numout,*) 275 IF(lwp) WRITE(numout,*) ' runoffs temperatures read in a file' 276 ALLOCATE( sf_t_rnf(1), STAT=ierror ) 277 IF( ierror > 0 ) THEN 278 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' ) ; RETURN 279 ENDIF 280 ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj) ) ; ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,2) ) 281 CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 282 ENDIF 283 ! 284 IF( ln_rnf_sal ) THEN ! Create (if required) sf_s_rnf and sf_t_rnf structures 285 IF(lwp) WRITE(numout,*) 286 IF(lwp) WRITE(numout,*) ' runoffs salinities read in a file' 287 ALLOCATE( sf_s_rnf(1), STAT=ierror ) 288 IF( ierror > 0 ) THEN 289 CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' ) ; RETURN 290 ENDIF 291 ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj) ) ; ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,2) ) 292 CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 293 ENDIF 294 295 296 IF ( ln_rnf_depth ) THEN ! depth of runoffs set from a file 297 IF(lwp) WRITE(numout,*) 298 IF(lwp) WRITE(numout,*) ' runoffs depth read in a file' 299 rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 300 CALL iom_open ( rn_dep_file, inum ) ! open file 301 CALL iom_get ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf ) ! read the river mouth array 302 CALL iom_close( inum ) ! close file 303 304 nk_rnf(:,:)=0 ! set the number of level over which river runoffs are applied 305 DO jj=1,jpj 306 DO ji=1,jpi 307 IF ( h_rnf(ji,jj) > 0.e0 ) THEN 308 jk=2 309 DO WHILE ( jk/=(mbathy(ji,jj)-1) .AND. fsdept(ji,jj,jk) < h_rnf(ji,jj) ); jk=jk+1; ENDDO 310 nk_rnf(ji,jj)=jk 311 ELSE IF ( h_rnf(ji,jj) == -1 ) THEN ; nk_rnf(ji,jj)=1 312 ELSE IF ( h_rnf(ji,jj) == -999 ) THEN ; nk_rnf(ji,jj)=mbathy(ji,jj)-1 313 ELSE IF ( h_rnf(ji,jj) /= 0 ) THEN 314 CALL ctl_stop( 'runoff depth not positive, and not -999 or -1, rnf value in file fort.999' ) 315 WRITE(999,*) 'ji, jj, rnf(ji,jj) :', ji, jj, rnf(ji,jj) 316 ENDIF 317 ENDDO 318 ENDDO 319 DO jj=1,jpj ! set the associated depth 320 DO ji=1,jpi 321 h_rnf(ji,jj)=0.e0 322 DO jk=1,nk_rnf(ji,jj) 323 h_rnf(ji,jj)=h_rnf(ji,jj)+fse3t(ji,jj,jk) 324 ENDDO 325 ENDDO 326 ENDDO 327 ELSE ! runoffs applied at the surface 328 nk_rnf(:,:)=1 329 h_rnf(:,:)=fse3t(:,:,1) 330 ENDIF 331 ! 332 ENDIF 333 334 tsc_rnf(:,:,:) = 0.e0 ! runoffs temperature & salinty contents initilisation 171 335 ! ! ======================== 172 336 ! ! River mouth vicinity … … 178 342 ! ! - mixed upstream-centered (ln_traadv_cen2=T) 179 343 ! 180 ! ! Number of level over which Kz increase 181 nkrnf = 0 344 IF ( ln_rnf_depth ) CALL ctl_warn( 'sbc_rnf_init: increased mixing turned on but effects may already', & 345 & 'be spread through depth by ln_rnf_depth' ) 346 ! 347 nkrnf = 0 ! Number of level over which Kz increase 182 348 IF( rn_hrnf > 0.e0 ) THEN 183 349 nkrnf = 2
Note: See TracChangeset
for help on using the changeset viewer.