- Timestamp:
- 2013-11-20T17:28:04+01:00 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2013/dev_MERGE_2013/NEMOGCM/NEMO/OPA_SRC/BDY/bdytides.F90
r4147 r4292 9 9 !! 3.3 ! 2010-09 (D.Storkey and E.O'Dea) bug fixes 10 10 !! 3.4 ! 2012-09 (G. Reffray and J. Chanut) New inputs + mods 11 !! 3.5 ! 2013-07 (J. Chanut) Compliant with time splitting changes 11 12 !!---------------------------------------------------------------------- 12 13 #if defined key_bdy … … 32 33 ! USE tide_mod ! Useless ?? 33 34 USE fldread, ONLY: fld_map 35 USE dynspg_oce, ONLY: lk_dynspg_ts 34 36 35 37 IMPLICIT NONE … … 38 40 PUBLIC bdytide_init ! routine called in bdy_init 39 41 PUBLIC bdytide_update ! routine called in bdy_dta 42 PUBLIC bdy_dta_tides ! routine called in dyn_spg_ts 40 43 41 44 TYPE, PUBLIC :: TIDES_DATA !: Storage for external tidal harmonics data … … 49 52 50 53 TYPE(TIDES_DATA), PUBLIC, DIMENSION(jp_bdy), TARGET :: tides !: External tidal harmonics data 54 TYPE(OBC_DATA) , PRIVATE, DIMENSION(jp_bdy) :: dta_bdy_s !: bdy external data (slow component) 51 55 52 56 !!---------------------------------------------------------------------- … … 131 135 ! JC: If FRS scheme is used, we assume that tidal is needed over the whole 132 136 ! relaxation area 133 IF( nn_dyn2d(ib_bdy) .eq. jp_frs) THEN137 IF( cn_dyn2d(ib_bdy) == 'frs' ) THEN 134 138 ilen0(:)=nblen(:) 135 139 ELSE … … 146 150 ALLOCATE( td%v ( ilen0(3), nb_harmo, 2 ) ) 147 151 148 td%ssh0(:,:,:) = 0. e0149 td%ssh (:,:,:) = 0.e0150 td%u0 (:,:,:) = 0.e0151 td%u (:,:,:) = 0.e0152 td%v0 (:,:,:) = 0.e0153 td%v (:,:,:) = 0.e0152 td%ssh0(:,:,:) = 0._wp 153 td%ssh (:,:,:) = 0._wp 154 td%u0 (:,:,:) = 0._wp 155 td%u (:,:,:) = 0._wp 156 td%v0 (:,:,:) = 0._wp 157 td%v (:,:,:) = 0._wp 154 158 155 159 IF (ln_bdytide_2ddta) THEN … … 255 259 ENDIF 256 260 ! 261 IF ( lk_dynspg_ts ) THEN ! Allocate arrays to save slowly varying boundary data during 262 ! time splitting integration 263 ALLOCATE( dta_bdy_s(ib_bdy)%ssh ( ilen0(1) ) ) 264 ALLOCATE( dta_bdy_s(ib_bdy)%u2d ( ilen0(2) ) ) 265 ALLOCATE( dta_bdy_s(ib_bdy)%v2d ( ilen0(3) ) ) 266 dta_bdy_s(ib_bdy)%ssh(:) = 0.e0 267 dta_bdy_s(ib_bdy)%u2d(:) = 0.e0 268 dta_bdy_s(ib_bdy)%v2d(:) = 0.e0 269 ENDIF 270 ! 257 271 ENDIF ! nn_dyn2d_dta(ib_bdy) .ge. 2 258 272 ! … … 300 314 ENDIF 301 315 302 IF ( nsec_day == NINT(0.5 * rdttra(1)) .AND. zflag==1 ) THEN316 IF ( nsec_day == NINT(0.5_wp * rdttra(1)) .AND. zflag==1 ) THEN 303 317 ! 304 318 kt_tide = kt … … 321 335 322 336 IF( PRESENT(jit) ) THEN 323 z_arg = ( ((kt-kt_tide)-1) * rdt + (jit+time_add) * rdt / REAL(nn_baro,wp) )337 z_arg = ((kt-kt_tide) * rdt + (jit+0.5_wp*(time_add-1)) * rdt / REAL(nn_baro,wp) ) 324 338 ELSE 325 339 z_arg = ((kt-kt_tide)+time_add) * rdt … … 327 341 328 342 ! Linear ramp on tidal component at open boundaries 329 zramp = 1. 330 IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg + (kt_tide-nit000)*rdt)/(rdttideramp*rday),0. ),1.)343 zramp = 1._wp 344 IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg + (kt_tide-nit000)*rdt)/(rdttideramp*rday),0._wp),1._wp) 331 345 332 346 DO itide = 1, nb_harmo … … 354 368 ! 355 369 END SUBROUTINE bdytide_update 370 371 SUBROUTINE bdy_dta_tides( kt, kit, time_offset ) 372 !!---------------------------------------------------------------------- 373 !! *** SUBROUTINE bdy_dta_tides *** 374 !! 375 !! ** Purpose : - Add tidal forcing to ssh, u2d and v2d OBC data arrays. 376 !! 377 !!---------------------------------------------------------------------- 378 INTEGER, INTENT( in ) :: kt ! Main timestep counter 379 INTEGER, INTENT( in ),OPTIONAL :: kit ! Barotropic timestep counter (for timesplitting option) 380 INTEGER, INTENT( in ),OPTIONAL :: time_offset ! time offset in units of timesteps. NB. if kit 381 ! is present then units = subcycle timesteps. 382 ! time_offset = 0 => get data at "now" time level 383 ! time_offset = -1 => get data at "before" time level 384 ! time_offset = +1 => get data at "after" time level 385 ! etc. 386 !! 387 LOGICAL :: lk_first_btstp ! =.TRUE. if time splitting and first barotropic step 388 INTEGER, DIMENSION(jpbgrd) :: ilen0 389 INTEGER, DIMENSION(1:jpbgrd) :: nblen, nblenrim ! short cuts 390 INTEGER :: itide, ib_bdy, ib, igrd ! loop indices 391 INTEGER :: time_add ! time offset in units of timesteps 392 REAL(wp) :: z_arg, z_sarg, zramp, zoff, z_cost, z_sist 393 !!---------------------------------------------------------------------- 394 395 IF( nn_timing == 1 ) CALL timing_start('bdy_dta_tides') 396 397 lk_first_btstp=.TRUE. 398 IF ( PRESENT(kit).AND.( kit /= 1 ) ) THEN ; lk_first_btstp=.FALSE. ; ENDIF 399 400 time_add = 0 401 IF( PRESENT(time_offset) ) THEN 402 time_add = time_offset 403 ENDIF 404 405 ! Absolute time from model initialization: 406 IF( PRESENT(kit) ) THEN 407 z_arg = ( kt + (kit+0.5_wp*(time_add-1)) / REAL(nn_baro,wp) ) * rdt 408 ELSE 409 z_arg = ( kt + time_add ) * rdt 410 ENDIF 411 412 ! Linear ramp on tidal component at open boundaries 413 zramp = 1. 414 IF (ln_tide_ramp) zramp = MIN(MAX( (z_arg - nit000*rdt)/(rdttideramp*rday),0.),1.) 415 416 DO ib_bdy = 1,nb_bdy 417 418 ! line below should be simplified (runoff case) 419 !! CHANUT: TO BE SORTED OUT 420 !! IF (( nn_dyn2d_dta(ib_bdy) .ge. 2 ).AND.(nn_tra(ib_bdy).NE.4)) THEN 421 IF ( nn_dyn2d_dta(ib_bdy) .ge. 2 ) THEN 422 423 nblen(1:jpbgrd) = idx_bdy(ib_bdy)%nblen(1:jpbgrd) 424 nblenrim(1:jpbgrd) = idx_bdy(ib_bdy)%nblenrim(1:jpbgrd) 425 426 IF( cn_dyn2d(ib_bdy) == 'frs' ) THEN 427 ilen0(:)=nblen(:) 428 ELSE 429 ilen0(:)=nblenrim(:) 430 ENDIF 431 432 ! We refresh nodal factors every day below 433 ! This should be done somewhere else 434 IF ( nsec_day == NINT(0.5_wp * rdttra(1)) .AND. lk_first_btstp ) THEN 435 ! 436 kt_tide = kt 437 ! 438 IF(lwp) THEN 439 WRITE(numout,*) 440 WRITE(numout,*) 'bdy_tide_dta : Refresh nodal factors for tidal open bdy data at kt=',kt 441 WRITE(numout,*) '~~~~~~~~~~~~~~ ' 442 ENDIF 443 ! 444 CALL tide_init_elevation ( idx=idx_bdy(ib_bdy), td=tides(ib_bdy) ) 445 CALL tide_init_velocities( idx=idx_bdy(ib_bdy), td=tides(ib_bdy) ) 446 ! 447 ENDIF 448 zoff = -kt_tide * rdt ! time offset relative to nodal factor computation time 449 ! 450 ! If time splitting, save data at first barotropic iteration 451 IF ( PRESENT(kit) ) THEN 452 IF ( lk_first_btstp ) THEN ! Save slow varying open boundary data: 453 dta_bdy_s(ib_bdy)%ssh(1:ilen0(1)) = dta_bdy(ib_bdy)%ssh(1:ilen0(1)) 454 dta_bdy_s(ib_bdy)%u2d(1:ilen0(2)) = dta_bdy(ib_bdy)%u2d(1:ilen0(2)) 455 dta_bdy_s(ib_bdy)%v2d(1:ilen0(3)) = dta_bdy(ib_bdy)%v2d(1:ilen0(3)) 456 457 ELSE ! Initialize arrays from slow varying open boundary data: 458 dta_bdy(ib_bdy)%ssh(1:ilen0(1)) = dta_bdy_s(ib_bdy)%ssh(1:ilen0(1)) 459 dta_bdy(ib_bdy)%u2d(1:ilen0(2)) = dta_bdy_s(ib_bdy)%u2d(1:ilen0(2)) 460 dta_bdy(ib_bdy)%v2d(1:ilen0(3)) = dta_bdy_s(ib_bdy)%v2d(1:ilen0(3)) 461 ENDIF 462 ENDIF 463 ! 464 ! Update open boundary data arrays: 465 DO itide = 1, nb_harmo 466 ! 467 z_sarg = (z_arg + zoff) * omega_tide(itide) 468 z_cost = zramp * COS( z_sarg ) 469 z_sist = zramp * SIN( z_sarg ) 470 ! 471 igrd=1 ! SSH on tracer grid 472 DO ib = 1, ilen0(igrd) 473 dta_bdy(ib_bdy)%ssh(ib) = dta_bdy(ib_bdy)%ssh(ib) + & 474 & ( tides(ib_bdy)%ssh(ib,itide,1)*z_cost + & 475 & tides(ib_bdy)%ssh(ib,itide,2)*z_sist ) 476 END DO 477 ! 478 igrd=2 ! U grid 479 DO ib = 1, ilen0(igrd) 480 dta_bdy(ib_bdy)%u2d(ib) = dta_bdy(ib_bdy)%u2d(ib) + & 481 & ( tides(ib_bdy)%u(ib,itide,1)*z_cost + & 482 & tides(ib_bdy)%u(ib,itide,2)*z_sist ) 483 END DO 484 ! 485 igrd=3 ! V grid 486 DO ib = 1, ilen0(igrd) 487 dta_bdy(ib_bdy)%v2d(ib) = dta_bdy(ib_bdy)%v2d(ib) + & 488 & ( tides(ib_bdy)%v(ib,itide,1)*z_cost + & 489 & tides(ib_bdy)%v(ib,itide,2)*z_sist ) 490 END DO 491 END DO 492 END IF 493 END DO 494 ! 495 IF( nn_timing == 1 ) CALL timing_stop('bdy_dta_tides') 496 ! 497 END SUBROUTINE bdy_dta_tides 356 498 357 499 SUBROUTINE tide_init_elevation( idx, td ) … … 460 602 WRITE(*,*) 'bdytide_update: You should not have seen this print! error?', kt, jit 461 603 END SUBROUTINE bdytide_update 604 SUBROUTINE bdy_dta_tides( kt, kit, time_offset ) ! Empty routine 605 INTEGER, INTENT( in ) :: kt ! Dummy argument empty routine 606 INTEGER, INTENT( in ),OPTIONAL :: kit ! Dummy argument empty routine 607 INTEGER, INTENT( in ),OPTIONAL :: time_offset ! Dummy argument empty routine 608 WRITE(*,*) 'bdy_dta_tides: You should not have seen this print! error?', kt, jit 609 END SUBROUTINE bdy_dta_tides 462 610 #endif 463 611 464 612 !!====================================================================== 465 613 END MODULE bdytides 614
Note: See TracChangeset
for help on using the changeset viewer.