- Timestamp:
- 2019-12-05T12:06:36+01:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r10742_ENHANCE-12_SimonM-Tides/src/OCE/BDY/bdytides.F90
r12059 r12065 71 71 INTEGER :: inum, igrd 72 72 INTEGER, DIMENSION(3) :: ilen0 !: length of boundary data (from OBC arrays) 73 INTEGER, POINTER, DIMENSION(:) :: nblen, nblenrim ! short cuts74 73 INTEGER :: ios ! Local integer output status for namelist read 75 74 CHARACTER(len=80) :: clfile !: full file name for tidal input file … … 78 77 !! 79 78 TYPE(TIDES_DATA), POINTER :: td !: local short cut 80 TYPE(MAP_POINTER), DIMENSION(jpbgrd) :: ibmap_ptr !: array of pointers to nbmap81 79 !! 82 80 NAMELIST/nambdy_tide/filtide, ln_bdytide_2ddta 83 81 !!---------------------------------------------------------------------- 84 82 ! 85 IF (nb_bdy>0) THEN 86 IF(lwp) WRITE(numout,*) 87 IF(lwp) WRITE(numout,*) 'bdytide_init : initialization of tidal harmonic forcing at open boundaries' 88 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 89 ENDIF 83 IF(lwp) WRITE(numout,*) 84 IF(lwp) WRITE(numout,*) 'bdytide_init : initialization of tidal harmonic forcing at open boundaries' 85 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 90 86 91 87 REWIND(numnam_cfg) … … 95 91 ! 96 92 td => tides(ib_bdy) 97 nblen => idx_bdy(ib_bdy)%nblen98 nblenrim => idx_bdy(ib_bdy)%nblenrim99 93 100 94 ! Namelist nambdy_tide : tidal harmonic forcing at open boundaries 101 95 filtide(:) = '' 102 96 97 REWIND( numnam_ref ) 98 READ ( numnam_ref, nambdy_tide, IOSTAT = ios, ERR = 901) 99 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy_tide in reference namelist' ) 103 100 ! Don't REWIND here - may need to read more than one of these namelists. 104 READ ( numnam_ref, nambdy_tide, IOSTAT = ios, ERR = 901)105 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy_tide in reference namelist', lwp )106 101 READ ( numnam_cfg, nambdy_tide, IOSTAT = ios, ERR = 902 ) 107 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'nambdy_tide in configuration namelist' , lwp)102 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'nambdy_tide in configuration namelist' ) 108 103 IF(lwm) WRITE ( numond, nambdy_tide ) 109 104 ! ! Parameter control and print … … 125 120 ! JC: If FRS scheme is used, we assume that tidal is needed over the whole 126 121 ! relaxation area 127 IF( cn_dyn2d(ib_bdy) == 'frs' ) THEN ; ilen0(:) = nblen (:)128 ELSE ; ilen0(:) = nblenrim(:)122 IF( cn_dyn2d(ib_bdy) == 'frs' ) THEN ; ilen0(:) = idx_bdy(ib_bdy)%nblen (:) 123 ELSE ; ilen0(:) = idx_bdy(ib_bdy)%nblenrim(:) 129 124 ENDIF 130 125 … … 161 156 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 162 157 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 158 IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj ) CYCLE ! to remove? 163 159 td%ssh0(ib,itide,1) = ztr(ii,ij) 164 160 td%ssh0(ib,itide,2) = zti(ii,ij) … … 177 173 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 178 174 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 175 IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj ) CYCLE ! to remove? 179 176 td%u0(ib,itide,1) = ztr(ii,ij) 180 177 td%u0(ib,itide,2) = zti(ii,ij) … … 193 190 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 194 191 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 192 IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj ) CYCLE ! to remove? 195 193 td%v0(ib,itide,1) = ztr(ii,ij) 196 194 td%v0(ib,itide,2) = zti(ii,ij) … … 207 205 ALLOCATE( dta_read( MAXVAL(ilen0(1:3)), 1, 1 ) ) 208 206 ! 209 ! Set map structure210 ibmap_ptr(1)%ptr => idx_bdy(ib_bdy)%nbmap(:,1) ; ibmap_ptr(1)%ll_unstruc = ln_coords_file(ib_bdy)211 ibmap_ptr(2)%ptr => idx_bdy(ib_bdy)%nbmap(:,2) ; ibmap_ptr(2)%ll_unstruc = ln_coords_file(ib_bdy)212 ibmap_ptr(3)%ptr => idx_bdy(ib_bdy)%nbmap(:,3) ; ibmap_ptr(3)%ll_unstruc = ln_coords_file(ib_bdy)213 214 207 ! Open files and read in tidal forcing data 215 208 ! ----------------------------------------- … … 219 212 clfile = TRIM(filtide)//TRIM(tide_harmonics(itide)%cname_tide)//'_grid_T.nc' 220 213 CALL iom_open( clfile, inum ) 221 CALL fld_map( inum, 'z1' , dta_read(1:ilen0(1),1:1,1:1) , 1, ibmap_ptr(1) )214 CALL fld_map( inum, 'z1' , dta_read(1:ilen0(1),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 222 215 td%ssh0(:,itide,1) = dta_read(1:ilen0(1),1,1) 223 CALL fld_map( inum, 'z2' , dta_read(1:ilen0(1),1:1,1:1) , 1, ibmap_ptr(1) )216 CALL fld_map( inum, 'z2' , dta_read(1:ilen0(1),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 224 217 td%ssh0(:,itide,2) = dta_read(1:ilen0(1),1,1) 225 218 CALL iom_close( inum ) … … 227 220 clfile = TRIM(filtide)//TRIM(tide_harmonics(itide)%cname_tide)//'_grid_U.nc' 228 221 CALL iom_open( clfile, inum ) 229 CALL fld_map( inum, 'u1' , dta_read(1:ilen0(2),1:1,1:1) , 1, i bmap_ptr(2) )222 CALL fld_map( inum, 'u1' , dta_read(1:ilen0(2),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 230 223 td%u0(:,itide,1) = dta_read(1:ilen0(2),1,1) 231 CALL fld_map( inum, 'u2' , dta_read(1:ilen0(2),1:1,1:1) , 1, i bmap_ptr(2) )224 CALL fld_map( inum, 'u2' , dta_read(1:ilen0(2),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 232 225 td%u0(:,itide,2) = dta_read(1:ilen0(2),1,1) 233 226 CALL iom_close( inum ) … … 235 228 clfile = TRIM(filtide)//TRIM(tide_harmonics(itide)%cname_tide)//'_grid_V.nc' 236 229 CALL iom_open( clfile, inum ) 237 CALL fld_map( inum, 'v1' , dta_read(1:ilen0(3),1:1,1:1) , 1, i bmap_ptr(3) )230 CALL fld_map( inum, 'v1' , dta_read(1:ilen0(3),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 238 231 td%v0(:,itide,1) = dta_read(1:ilen0(3),1,1) 239 CALL fld_map( inum, 'v2' , dta_read(1:ilen0(3),1:1,1:1) , 1, i bmap_ptr(3) )232 CALL fld_map( inum, 'v2' , dta_read(1:ilen0(3),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 240 233 td%v0(:,itide,2) = dta_read(1:ilen0(3),1,1) 241 234 CALL iom_close( inum ) … … 263 256 264 257 265 SUBROUTINE bdytide_update( kt, idx, dta, td, jit, time_offset )258 SUBROUTINE bdytide_update( kt, idx, dta, td, kit, kt_offset ) 266 259 !!---------------------------------------------------------------------- 267 260 !! *** SUBROUTINE bdytide_update *** … … 274 267 TYPE(OBC_DATA) , INTENT(inout) :: dta ! OBC external data 275 268 TYPE(TIDES_DATA) , INTENT(inout) :: td ! tidal harmonics data 276 INTEGER, OPTIONAL, INTENT(in ) :: jit ! Barotropic timestep counter (for timesplitting option)277 INTEGER, OPTIONAL, INTENT(in ) :: time_offset ! time offset in units of timesteps. NB. if jit269 INTEGER, OPTIONAL, INTENT(in ) :: kit ! Barotropic timestep counter (for timesplitting option) 270 INTEGER, OPTIONAL, INTENT(in ) :: kt_offset ! time offset in units of timesteps. NB. if kit 278 271 ! ! is present then units = subcycle timesteps. 279 ! ! time_offset = 0 => get data at "now" time level280 ! ! time_offset = -1 => get data at "before" time level281 ! ! time_offset = +1 => get data at "after" time level272 ! ! kt_offset = 0 => get data at "now" time level 273 ! ! kt_offset = -1 => get data at "before" time level 274 ! ! kt_offset = +1 => get data at "after" time level 282 275 ! ! etc. 283 276 ! … … 294 287 295 288 zflag=1 296 IF ( PRESENT( jit) ) THEN297 IF ( jit /= 1 ) zflag=0289 IF ( PRESENT(kit) ) THEN 290 IF ( kit /= 1 ) zflag=0 298 291 ENDIF 299 292 … … 314 307 315 308 time_add = 0 316 IF( PRESENT( time_offset) ) THEN317 time_add = time_offset309 IF( PRESENT(kt_offset) ) THEN 310 time_add = kt_offset 318 311 ENDIF 319 312 320 IF( PRESENT( jit) ) THEN321 z_arg = ((kt-kt_tide) * rdt + ( jit+0.5_wp*(time_add-1)) * rdt / REAL(nn_baro,wp) )313 IF( PRESENT(kit) ) THEN 314 z_arg = ((kt-kt_tide) * rdt + (kit+0.5_wp*(time_add-1)) * rdt / REAL(nn_baro,wp) ) 322 315 ELSE 323 316 z_arg = ((kt-kt_tide)+time_add) * rdt … … 352 345 353 346 354 SUBROUTINE bdy_dta_tides( kt, kit, time_offset )347 SUBROUTINE bdy_dta_tides( kt, kit, kt_offset ) 355 348 !!---------------------------------------------------------------------- 356 349 !! *** SUBROUTINE bdy_dta_tides *** … … 361 354 INTEGER, INTENT(in) :: kt ! Main timestep counter 362 355 INTEGER, OPTIONAL, INTENT(in) :: kit ! Barotropic timestep counter (for timesplitting option) 363 INTEGER, OPTIONAL, INTENT(in) :: time_offset! time offset in units of timesteps. NB. if kit356 INTEGER, OPTIONAL, INTENT(in) :: kt_offset ! time offset in units of timesteps. NB. if kit 364 357 ! ! is present then units = subcycle timesteps. 365 ! ! time_offset = 0 => get data at "now" time level366 ! ! time_offset = -1 => get data at "before" time level367 ! ! time_offset = +1 => get data at "after" time level358 ! ! kt_offset = 0 => get data at "now" time level 359 ! ! kt_offset = -1 => get data at "before" time level 360 ! ! kt_offset = +1 => get data at "after" time level 368 361 ! ! etc. 369 362 ! … … 380 373 381 374 time_add = 0 382 IF( PRESENT( time_offset) ) THEN383 time_add = time_offset375 IF( PRESENT(kt_offset) ) THEN 376 time_add = kt_offset 384 377 ENDIF 385 378 … … 426 419 ! If time splitting, initialize arrays from slow varying open boundary data: 427 420 IF ( PRESENT(kit) ) THEN 428 IF ( dta_bdy(ib_bdy)%l l_ssh) dta_bdy(ib_bdy)%ssh(1:ilen0(1)) = dta_bdy_s(ib_bdy)%ssh(1:ilen0(1))429 IF ( dta_bdy(ib_bdy)%l l_u2d ) dta_bdy(ib_bdy)%u2d(1:ilen0(2)) = dta_bdy_s(ib_bdy)%u2d(1:ilen0(2))430 IF ( dta_bdy(ib_bdy)%l l_v2d ) dta_bdy(ib_bdy)%v2d(1:ilen0(3)) = dta_bdy_s(ib_bdy)%v2d(1:ilen0(3))421 IF ( dta_bdy(ib_bdy)%lneed_ssh ) dta_bdy(ib_bdy)%ssh(1:ilen0(1)) = dta_bdy_s(ib_bdy)%ssh(1:ilen0(1)) 422 IF ( dta_bdy(ib_bdy)%lneed_dyn2d ) dta_bdy(ib_bdy)%u2d(1:ilen0(2)) = dta_bdy_s(ib_bdy)%u2d(1:ilen0(2)) 423 IF ( dta_bdy(ib_bdy)%lneed_dyn2d ) dta_bdy(ib_bdy)%v2d(1:ilen0(3)) = dta_bdy_s(ib_bdy)%v2d(1:ilen0(3)) 431 424 ENDIF 432 425 ! … … 438 431 z_sist = zramp * SIN( z_sarg ) 439 432 ! 440 IF ( dta_bdy(ib_bdy)%l l_ssh ) THEN433 IF ( dta_bdy(ib_bdy)%lneed_ssh ) THEN 441 434 igrd=1 ! SSH on tracer grid 442 435 DO ib = 1, ilen0(igrd) … … 447 440 ENDIF 448 441 ! 449 IF ( dta_bdy(ib_bdy)%l l_u2d ) THEN442 IF ( dta_bdy(ib_bdy)%lneed_dyn2d ) THEN 450 443 igrd=2 ! U grid 451 444 DO ib = 1, ilen0(igrd) … … 454 447 & tides(ib_bdy)%u(ib,itide,2)*z_sist ) 455 448 END DO 456 ENDIF457 !458 IF ( dta_bdy(ib_bdy)%ll_v2d ) THEN459 449 igrd=3 ! V grid 460 450 DO ib = 1, ilen0(igrd)
Note: See TracChangeset
for help on using the changeset viewer.