- Timestamp:
- 2016-11-28T17:04:10+01:00 (7 years ago)
- Location:
- branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/BDY
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/BDY/bdy_oce.F90
r5836 r7351 70 70 REAL(wp), POINTER, DIMENSION(:,:) :: ht_i !: Now ice thickness climatology 71 71 REAL(wp), POINTER, DIMENSION(:,:) :: ht_s !: now snow thickness 72 #endif 73 #if defined key_top 74 CHARACTER(LEN=20) :: cn_obc !: type of boundary condition to apply 75 REAL(wp) :: rn_fac !: multiplicative scaling factor 76 REAL(wp), POINTER, DIMENSION(:,:) :: trc !: now field of the tracer 77 LOGICAL :: dmp !: obc damping term 72 78 #endif 73 79 END TYPE OBC_DATA -
branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/BDY/bdydta.F90
r5930 r7351 45 45 INTEGER, ALLOCATABLE, DIMENSION(:) :: nb_bdy_fld ! Number of fields to update for each boundary set. 46 46 INTEGER :: nb_bdy_fld_sum ! Total number of fields to update for all boundary sets. 47 48 47 LOGICAL, DIMENSION(jp_bdy) :: ln_full_vel_array ! =T => full velocities in 3D boundary conditions 49 48 ! =F => baroclinic velocities in 3D boundary conditions … … 58 57 #endif 59 58 60 # include "domzgr_substitute.h90"61 59 !!---------------------------------------------------------------------- 62 60 !! NEMO/OPA 3.3 , NEMO Consortium (2010) … … 75 73 !! 76 74 !!---------------------------------------------------------------------- 77 !! 78 INTEGER, INTENT( in ) :: kt ! ocean time-step index 79 INTEGER, INTENT( in ), OPTIONAL :: jit ! subcycle time-step index (for timesplitting option) 80 INTEGER, INTENT( in ), OPTIONAL :: time_offset ! time offset in units of timesteps. NB. if jit 81 ! is present then units = subcycle timesteps. 82 ! time_offset = 0 => get data at "now" time level 83 ! time_offset = -1 => get data at "before" time level 84 ! time_offset = +1 => get data at "after" time level 85 ! etc. 86 !! 87 INTEGER :: ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd, jl ! local indices 75 INTEGER, INTENT(in) :: kt ! ocean time-step index 76 INTEGER, INTENT(in), OPTIONAL :: jit ! subcycle time-step index (for timesplitting option) 77 INTEGER, INTENT(in), OPTIONAL :: time_offset ! time offset in units of timesteps. NB. if jit 78 ! ! is present then units = subcycle timesteps. 79 ! ! time_offset = 0 => get data at "now" time level 80 ! ! time_offset = -1 => get data at "before" time level 81 ! ! time_offset = +1 => get data at "after" time level 82 ! ! etc. 83 ! 84 INTEGER :: ib_bdy, jfld, jstart, jend, ib, ii, ij, ik, igrd, jl ! local indices 88 85 INTEGER, DIMENSION(jpbgrd) :: ilen1 89 86 INTEGER, POINTER, DIMENSION(:) :: nblen, nblenrim ! short cuts 90 87 TYPE(OBC_DATA), POINTER :: dta ! short cut 91 !!92 88 !!--------------------------------------------------------------------------- 93 ! !94 IF( nn_timing == 1 ) CALL timing_start('bdy_dta')95 89 ! 90 IF( nn_timing == 1 ) CALL timing_start('bdy_dta') 91 ! 96 92 ! Initialise data arrays once for all from initial conditions where required 97 93 !--------------------------------------------------------------------------- 98 IF( kt .eq. nit000 .and. .not.PRESENT(jit) ) THEN94 IF( kt == nit000 .AND. .NOT.PRESENT(jit) ) THEN 99 95 100 96 ! Calculate depth-mean currents … … 102 98 103 99 DO ib_bdy = 1, nb_bdy 104 100 ! 105 101 nblen => idx_bdy(ib_bdy)%nblen 106 102 nblenrim => idx_bdy(ib_bdy)%nblenrim 107 103 dta => dta_bdy(ib_bdy) 108 104 109 IF( nn_dyn2d_dta(ib_bdy) .eq.0 ) THEN105 IF( nn_dyn2d_dta(ib_bdy) == 0 ) THEN 110 106 ilen1(:) = nblen(:) 111 107 IF( dta%ll_ssh ) THEN … … 135 131 ENDIF 136 132 137 IF( nn_dyn3d_dta(ib_bdy) .eq.0 ) THEN133 IF( nn_dyn3d_dta(ib_bdy) == 0 ) THEN 138 134 ilen1(:) = nblen(:) 139 135 IF( dta%ll_u3d ) THEN … … 159 155 ENDIF 160 156 161 IF( nn_tra_dta(ib_bdy) .eq.0 ) THEN157 IF( nn_tra_dta(ib_bdy) == 0 ) THEN 162 158 ilen1(:) = nblen(:) 163 159 IF( dta%ll_tem ) THEN … … 184 180 185 181 #if defined key_lim2 186 IF( nn_ice_lim_dta(ib_bdy) .eq.0 ) THEN182 IF( nn_ice_lim_dta(ib_bdy) == 0 ) THEN 187 183 ilen1(:) = nblen(:) 188 184 IF( dta%ll_frld ) THEN … … 212 208 ENDIF 213 209 #elif defined key_lim3 214 IF( nn_ice_lim_dta(ib_bdy) .eq.0 ) THEN210 IF( nn_ice_lim_dta(ib_bdy) == 0 ) THEN 215 211 ilen1(:) = nblen(:) 216 212 IF( dta%ll_a_i ) THEN … … 246 242 ENDIF 247 243 #endif 248 249 ENDDO ! ib_bdy 250 251 252 ENDIF ! kt .eq. nit000 244 END DO ! ib_bdy 245 ! 246 ENDIF ! kt == nit000 253 247 254 248 ! update external data from files … … 258 252 DO ib_bdy = 1, nb_bdy 259 253 dta => dta_bdy(ib_bdy) 260 IF( nn_dta(ib_bdy) .eq.1 ) THEN ! skip this bit if no external data required254 IF( nn_dta(ib_bdy) == 1 ) THEN ! skip this bit if no external data required 261 255 262 256 IF( PRESENT(jit) ) THEN … … 264 258 ! jit is optional argument for fld_read and bdytide_update 265 259 IF( cn_dyn2d(ib_bdy) /= 'none' ) THEN 266 IF( nn_dyn2d_dta(ib_bdy) .eq.2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays267 IF( dta%ll_ssh ) dta%ssh(:) = 0. 0268 IF( dta%ll_u2d ) dta%u2d(:) = 0. 0269 IF( dta%ll_u3d ) dta%v2d(:) = 0. 0260 IF( nn_dyn2d_dta(ib_bdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 261 IF( dta%ll_ssh ) dta%ssh(:) = 0._wp 262 IF( dta%ll_u2d ) dta%u2d(:) = 0._wp 263 IF( dta%ll_u3d ) dta%v2d(:) = 0._wp 270 264 ENDIF 271 265 IF (cn_tra(ib_bdy) /= 'runoff') THEN 272 IF( nn_dyn2d_dta(ib_bdy) .EQ. 1 .OR. nn_dyn2d_dta(ib_bdy) .EQ.3 ) THEN266 IF( nn_dyn2d_dta(ib_bdy) == 1 .OR. nn_dyn2d_dta(ib_bdy) == 3 ) THEN 273 267 274 268 jend = jstart + dta%nread(2) - 1 … … 278 272 ! If full velocities in boundary data then extract barotropic velocities from 3D fields 279 273 IF( ln_full_vel_array(ib_bdy) .AND. & 280 & ( nn_dyn2d_dta(ib_bdy) .EQ. 1 .OR. nn_dyn2d_dta(ib_bdy) .EQ.3 .OR. &281 & nn_dyn3d_dta(ib_bdy) .EQ.1 ) )THEN274 & ( nn_dyn2d_dta(ib_bdy) == 1 .OR. nn_dyn2d_dta(ib_bdy) == 3 .OR. & 275 & nn_dyn3d_dta(ib_bdy) == 1 ) )THEN 282 276 283 277 igrd = 2 ! zonal velocity 284 dta%u2d(:) = 0. 0278 dta%u2d(:) = 0._wp 285 279 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 286 280 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) … … 288 282 DO ik = 1, jpkm1 289 283 dta%u2d(ib) = dta%u2d(ib) & 290 & + fse3u(ii,ij,ik) * umask(ii,ij,ik) * dta%u3d(ib,ik)284 & + e3u_n(ii,ij,ik) * umask(ii,ij,ik) * dta%u3d(ib,ik) 291 285 END DO 292 dta%u2d(ib) = dta%u2d(ib) * hur(ii,ij)286 dta%u2d(ib) = dta%u2d(ib) * r1_hu_n(ii,ij) 293 287 END DO 294 288 igrd = 3 ! meridional velocity 295 dta%v2d(:) = 0. 0289 dta%v2d(:) = 0._wp 296 290 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 297 291 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) … … 299 293 DO ik = 1, jpkm1 300 294 dta%v2d(ib) = dta%v2d(ib) & 301 & + fse3v(ii,ij,ik) * vmask(ii,ij,ik) * dta%v3d(ib,ik)295 & + e3v_n(ii,ij,ik) * vmask(ii,ij,ik) * dta%v3d(ib,ik) 302 296 END DO 303 dta%v2d(ib) = dta%v2d(ib) * hvr(ii,ij)297 dta%v2d(ib) = dta%v2d(ib) * r1_hv_n(ii,ij) 304 298 END DO 305 299 ENDIF … … 331 325 END DO 332 326 ELSE 333 IF( nn_dyn2d_dta(ib_bdy) .eq.2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays334 IF( dta%ll_ssh ) dta%ssh(:) = 0. 0335 IF( dta%ll_u2d ) dta%u2d(:) = 0. 0336 IF( dta%ll_v2d ) dta%v2d(:) = 0. 0327 IF( nn_dyn2d_dta(ib_bdy) == 2 ) THEN ! tidal harmonic forcing ONLY: initialise arrays 328 IF( dta%ll_ssh ) dta%ssh(:) = 0._wp 329 IF( dta%ll_u2d ) dta%u2d(:) = 0._wp 330 IF( dta%ll_v2d ) dta%v2d(:) = 0._wp 337 331 ENDIF 338 332 IF( dta%nread(1) .gt. 0 ) THEN ! update external data … … 343 337 ! If full velocities in boundary data then split into barotropic and baroclinic data 344 338 IF( ln_full_vel_array(ib_bdy) .and. & 345 & ( nn_dyn2d_dta(ib_bdy) .EQ. 1 .OR. nn_dyn2d_dta(ib_bdy) .EQ.3 .OR. &346 & nn_dyn3d_dta(ib_bdy) .EQ.1 ) ) THEN339 & ( nn_dyn2d_dta(ib_bdy) == 1 .OR. nn_dyn2d_dta(ib_bdy) == 3 .OR. & 340 & nn_dyn3d_dta(ib_bdy) == 1 ) ) THEN 347 341 igrd = 2 ! zonal velocity 348 dta%u2d(:) = 0. 0342 dta%u2d(:) = 0._wp 349 343 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 350 344 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) … … 352 346 DO ik = 1, jpkm1 353 347 dta%u2d(ib) = dta%u2d(ib) & 354 & + fse3u(ii,ij,ik) * umask(ii,ij,ik) * dta%u3d(ib,ik)348 & + e3u_n(ii,ij,ik) * umask(ii,ij,ik) * dta%u3d(ib,ik) 355 349 END DO 356 dta%u2d(ib) = dta%u2d(ib) * hur(ii,ij)350 dta%u2d(ib) = dta%u2d(ib) * r1_hu_n(ii,ij) 357 351 DO ik = 1, jpkm1 358 352 dta%u3d(ib,ik) = dta%u3d(ib,ik) - dta%u2d(ib) … … 360 354 END DO 361 355 igrd = 3 ! meridional velocity 362 dta%v2d(:) = 0. 0356 dta%v2d(:) = 0._wp 363 357 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 364 358 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) … … 366 360 DO ik = 1, jpkm1 367 361 dta%v2d(ib) = dta%v2d(ib) & 368 & + fse3v(ii,ij,ik) * vmask(ii,ij,ik) * dta%v3d(ib,ik)362 & + e3v_n(ii,ij,ik) * vmask(ii,ij,ik) * dta%v3d(ib,ik) 369 363 END DO 370 dta%v2d(ib) = dta%v2d(ib) * hvr(ii,ij)364 dta%v2d(ib) = dta%v2d(ib) * r1_hv_n(ii,ij) 371 365 DO ik = 1, jpkm1 372 366 dta%v3d(ib,ik) = dta%v3d(ib,ik) - dta%v2d(ib) … … 413 407 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 414 408 dta_bdy(ib_bdy)%ssh(ib) = dta_bdy(ib_bdy)%ssh(ib) + ssh_ib(ii,ij) 415 END DO416 ENDIF 417 END DO409 END DO 410 ENDIF 411 END DO 418 412 ENDIF 419 413 ! 420 414 IF( nn_timing == 1 ) CALL timing_stop('bdy_dta') 421 422 423 424 425 415 ! 416 END SUBROUTINE bdy_dta 417 418 419 SUBROUTINE bdy_dta_init 426 420 !!---------------------------------------------------------------------- 427 421 !! *** SUBROUTINE bdy_dta_init *** … … 433 427 !! 434 428 !!---------------------------------------------------------------------- 435 !! 436 INTEGER :: ib_bdy, jfld, jstart, jend, ierror ! local indices 437 INTEGER :: ios ! Local integer output status for namelist read 438 !! 429 INTEGER :: ib_bdy, jfld, jstart, jend, ierror, ios ! Local integers 430 ! 439 431 CHARACTER(len=100) :: cn_dir ! Root directory for location of data files 440 432 CHARACTER(len=100), DIMENSION(nb_bdy) :: cn_dir_array ! Root directory for location of data files … … 469 461 NAMELIST/nambdy_dta/ ln_full_vel 470 462 !!--------------------------------------------------------------------------- 471 472 IF( nn_timing == 1 ) CALL timing_start('bdy_dta_init')473 463 ! 464 IF( nn_timing == 1 ) CALL timing_start('bdy_dta_init') 465 ! 474 466 IF(lwp) WRITE(numout,*) 475 467 IF(lwp) WRITE(numout,*) 'bdy_dta_ini : initialization of data at the open boundaries' … … 486 478 #endif 487 479 ) 488 IF(nn_dta(ib_bdy) .gt.1) nn_dta(ib_bdy) = 1480 IF(nn_dta(ib_bdy) > 1) nn_dta(ib_bdy) = 1 489 481 END DO 490 482 … … 494 486 nb_bdy_fld(:) = 0 495 487 DO ib_bdy = 1, nb_bdy 496 IF( cn_dyn2d(ib_bdy) /= 'none' .and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq.3 ) ) THEN488 IF( cn_dyn2d(ib_bdy) /= 'none' .and. ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) ) THEN 497 489 nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3 498 490 ENDIF 499 IF( cn_dyn3d(ib_bdy) /= 'none' .and. nn_dyn3d_dta(ib_bdy) .eq.1 ) THEN491 IF( cn_dyn3d(ib_bdy) /= 'none' .and. nn_dyn3d_dta(ib_bdy) == 1 ) THEN 500 492 nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2 501 493 ENDIF 502 IF( cn_tra(ib_bdy) /= 'none' .and. nn_tra_dta(ib_bdy) .eq.1 ) THEN494 IF( cn_tra(ib_bdy) /= 'none' .and. nn_tra_dta(ib_bdy) == 1 ) THEN 503 495 nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 2 504 496 ENDIF 505 497 #if ( defined key_lim2 || defined key_lim3 ) 506 IF( cn_ice_lim(ib_bdy) /= 'none' .and. nn_ice_lim_dta(ib_bdy) .eq.1 ) THEN498 IF( cn_ice_lim(ib_bdy) /= 'none' .and. nn_ice_lim_dta(ib_bdy) == 1 ) THEN 507 499 nb_bdy_fld(ib_bdy) = nb_bdy_fld(ib_bdy) + 3 508 500 ENDIF 509 501 #endif 510 502 IF(lwp) WRITE(numout,*) 'Maximum number of files to open =',nb_bdy_fld(ib_bdy) 511 END DO503 END DO 512 504 513 505 nb_bdy_fld_sum = SUM( nb_bdy_fld ) … … 535 527 jfld = 0 536 528 DO ib_bdy = 1, nb_bdy 537 IF( nn_dta(ib_bdy) .eq.1 ) THEN529 IF( nn_dta(ib_bdy) == 1 ) THEN 538 530 READ ( numnam_ref, nambdy_dta, IOSTAT = ios, ERR = 901) 539 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy_dta in reference namelist', lwp )531 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy_dta in reference namelist', lwp ) 540 532 541 533 READ ( numnam_cfg, nambdy_dta, IOSTAT = ios, ERR = 902 ) 542 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy_dta in configuration namelist', lwp )543 IF(lwm) WRITE 534 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy_dta in configuration namelist', lwp ) 535 IF(lwm) WRITE( numond, nambdy_dta ) 544 536 545 537 cn_dir_array(ib_bdy) = cn_dir … … 553 545 ! Only read in necessary fields for this set. 554 546 ! Important that barotropic variables come first. 555 IF( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq.3 ) THEN547 IF( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) THEN 556 548 557 549 IF( dta%ll_ssh ) THEN … … 592 584 ! read 3D velocities if baroclinic velocities require OR if 593 585 ! barotropic velocities required and ln_full_vel set to .true. 594 IF( nn_dyn3d_dta(ib_bdy) .eq. 1 .or. &595 & ( ln_full_vel_array(ib_bdy) . and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq.3 ) ) ) THEN596 597 IF( dta%ll_u3d . or. ( ln_full_vel_array(ib_bdy) .and. dta%ll_u2d ) ) THEN586 IF( nn_dyn3d_dta(ib_bdy) == 1 .OR. & 587 & ( ln_full_vel_array(ib_bdy) .AND. ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) ) ) THEN 588 589 IF( dta%ll_u3d .OR. ( ln_full_vel_array(ib_bdy) .and. dta%ll_u2d ) ) THEN 598 590 if(lwp) write(numout,*) '++++++ reading in u3d field' 599 591 jfld = jfld + 1 … … 606 598 ENDIF 607 599 608 IF( dta%ll_v3d . or. ( ln_full_vel_array(ib_bdy) .and. dta%ll_v2d ) ) THEN600 IF( dta%ll_v3d .OR. ( ln_full_vel_array(ib_bdy) .and. dta%ll_v2d ) ) THEN 609 601 if(lwp) write(numout,*) '++++++ reading in v3d field' 610 602 jfld = jfld + 1 … … 620 612 621 613 ! temperature and salinity 622 IF( nn_tra_dta(ib_bdy) .eq.1 ) THEN614 IF( nn_tra_dta(ib_bdy) == 1 ) THEN 623 615 624 616 IF( dta%ll_tem ) THEN … … 646 638 #if defined key_lim2 647 639 ! sea ice 648 IF( nn_ice_lim_dta(ib_bdy) .eq.1 ) THEN640 IF( nn_ice_lim_dta(ib_bdy) == 1 ) THEN 649 641 650 642 IF( dta%ll_frld ) THEN … … 678 670 #elif defined key_lim3 679 671 ! sea ice 680 IF( nn_ice_lim_dta(ib_bdy) .eq.1 ) THEN672 IF( nn_ice_lim_dta(ib_bdy) == 1 ) THEN 681 673 ! Test for types of ice input (lim2 or lim3) 682 674 ! Build file name to find dimensions … … 733 725 ! Recalculate field counts 734 726 !------------------------- 735 IF( ib_bdy .eq.1 ) THEN727 IF( ib_bdy == 1 ) THEN 736 728 nb_bdy_fld_sum = 0 737 729 nb_bdy_fld(ib_bdy) = jfld … … 744 736 dta%nread(1) = nb_bdy_fld(ib_bdy) 745 737 746 ENDIF ! nn_dta .eq.1738 ENDIF ! nn_dta == 1 747 739 ENDDO ! ib_bdy 748 740 … … 785 777 endif 786 778 787 IF ( nn_dyn2d_dta(ib_bdy) .eq. 0 .or. nn_dyn2d_dta(ib_bdy) .eq.2 ) THEN779 IF ( nn_dyn2d_dta(ib_bdy) == 0 .or. nn_dyn2d_dta(ib_bdy) == 2 ) THEN 788 780 if(lwp) write(numout,*) '++++++ dta%ssh/u2d/u3d allocated space' 789 781 IF( dta%ll_ssh ) ALLOCATE( dta%ssh(nblen(1)) ) … … 791 783 IF( dta%ll_v2d ) ALLOCATE( dta%v2d(nblen(3)) ) 792 784 ENDIF 793 IF ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq.3 ) THEN785 IF ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) THEN 794 786 IF( dta%ll_ssh ) THEN 795 787 if(lwp) write(numout,*) '++++++ dta%ssh pointing to fnow' … … 819 811 ENDIF 820 812 821 IF ( nn_dyn3d_dta(ib_bdy) .eq.0 ) THEN813 IF ( nn_dyn3d_dta(ib_bdy) == 0 ) THEN 822 814 if(lwp) write(numout,*) '++++++ dta%u3d/v3d allocated space' 823 815 IF( dta%ll_u3d ) ALLOCATE( dta_bdy(ib_bdy)%u3d(nblen(2),jpk) ) 824 816 IF( dta%ll_v3d ) ALLOCATE( dta_bdy(ib_bdy)%v3d(nblen(3),jpk) ) 825 817 ENDIF 826 IF ( nn_dyn3d_dta(ib_bdy) .eq.1 .or. &827 & ( ln_full_vel_array(ib_bdy) .and. ( nn_dyn2d_dta(ib_bdy) .eq. 1 .or. nn_dyn2d_dta(ib_bdy) .eq.3 ) ) ) THEN818 IF ( nn_dyn3d_dta(ib_bdy) == 1 .or. & 819 & ( ln_full_vel_array(ib_bdy) .and. ( nn_dyn2d_dta(ib_bdy) == 1 .or. nn_dyn2d_dta(ib_bdy) == 3 ) ) ) THEN 828 820 IF ( dta%ll_u3d .or. ( ln_full_vel_array(ib_bdy) .and. dta%ll_u2d ) ) THEN 829 821 if(lwp) write(numout,*) '++++++ dta%u3d pointing to fnow' … … 838 830 ENDIF 839 831 840 IF( nn_tra_dta(ib_bdy) .eq.0 ) THEN832 IF( nn_tra_dta(ib_bdy) == 0 ) THEN 841 833 if(lwp) write(numout,*) '++++++ dta%tem/sal allocated space' 842 834 IF( dta%ll_tem ) ALLOCATE( dta_bdy(ib_bdy)%tem(nblen(1),jpk) ) … … 857 849 #if defined key_lim2 858 850 IF (cn_ice_lim(ib_bdy) /= 'none') THEN 859 IF( nn_ice_lim_dta(ib_bdy) .eq.0 ) THEN851 IF( nn_ice_lim_dta(ib_bdy) == 0 ) THEN 860 852 ALLOCATE( dta_bdy(ib_bdy)%frld(nblen(1)) ) 861 853 ALLOCATE( dta_bdy(ib_bdy)%hicif(nblen(1)) ) … … 872 864 #elif defined key_lim3 873 865 IF (cn_ice_lim(ib_bdy) /= 'none') THEN 874 IF( nn_ice_lim_dta(ib_bdy) .eq.0 ) THEN866 IF( nn_ice_lim_dta(ib_bdy) == 0 ) THEN 875 867 ALLOCATE( dta_bdy(ib_bdy)%a_i (nblen(1),jpl) ) 876 868 ALLOCATE( dta_bdy(ib_bdy)%ht_i(nblen(1),jpl) ) … … 892 884 ALLOCATE( dta_bdy(ib_bdy)%ht_i(nblen(1),jpl) ) 893 885 ALLOCATE( dta_bdy(ib_bdy)%ht_s(nblen(1),jpl) ) 894 dta_bdy(ib_bdy)%a_i (:,:) = 0. 0895 dta_bdy(ib_bdy)%ht_i(:,:) = 0. 0896 dta_bdy(ib_bdy)%ht_s(:,:) = 0. 0897 ENDIF 898 899 ENDIF 900 ENDIF 901 #endif 902 903 END DO ! ib_bdy904 886 dta_bdy(ib_bdy)%a_i (:,:) = 0._wp 887 dta_bdy(ib_bdy)%ht_i(:,:) = 0._wp 888 dta_bdy(ib_bdy)%ht_s(:,:) = 0._wp 889 ENDIF 890 891 ENDIF 892 ENDIF 893 #endif 894 ! 895 END DO ! ib_bdy 896 ! 905 897 IF( nn_timing == 1 ) CALL timing_stop('bdy_dta_init') 906 907 898 ! 899 END SUBROUTINE bdy_dta_init 908 900 909 901 #else -
branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn.F90
r5930 r7351 36 36 PUBLIC bdy_dyn ! routine called in dyn_nxt 37 37 38 # include "domzgr_substitute.h90"39 38 !!---------------------------------------------------------------------- 40 39 !! NEMO/OPA 3.3 , NEMO Consortium (2010) … … 51 50 !! 52 51 !!---------------------------------------------------------------------- 53 !! 54 INTEGER, INTENT( in ) :: kt ! Main time step counter 55 LOGICAL, INTENT( in ), OPTIONAL :: dyn3d_only ! T => only update baroclinic velocities 56 !! 57 INTEGER :: jk,ii,ij,ib_bdy,ib,igrd ! Loop counter 58 LOGICAL :: ll_dyn2d, ll_dyn3d, ll_orlanski 59 !! 52 INTEGER, INTENT(in) :: kt ! Main time step counter 53 LOGICAL, INTENT(in), OPTIONAL :: dyn3d_only ! T => only update baroclinic velocities 54 ! 55 INTEGER :: jk, ii, ij, ib_bdy, ib, igrd ! Loop counter 56 LOGICAL :: ll_dyn2d, ll_dyn3d, ll_orlanski 60 57 REAL(wp), POINTER, DIMENSION(:,:) :: pua2d, pva2d ! after barotropic velocities 61 62 IF( nn_timing == 1 ) CALL timing_start('bdy_dyn') 63 58 !!---------------------------------------------------------------------- 59 ! 60 IF( nn_timing == 1 ) CALL timing_start('bdy_dyn') 61 ! 64 62 ll_dyn2d = .true. 65 63 ll_dyn3d = .true. 66 64 ! 67 65 IF( PRESENT(dyn3d_only) ) THEN 68 IF( dyn3d_only ) ll_dyn2d = .false.66 IF( dyn3d_only ) ll_dyn2d = .false. 69 67 ENDIF 70 68 ! 71 69 ll_orlanski = .false. 72 70 DO ib_bdy = 1, nb_bdy 73 IF ( cn_dyn2d(ib_bdy) == 'orlanski' . or. cn_dyn2d(ib_bdy) == 'orlanski_npo' &74 & . or. cn_dyn3d(ib_bdy) == 'orlanski' .or. cn_dyn3d(ib_bdy) == 'orlanski_npo')ll_orlanski = .true.75 END DO71 IF ( cn_dyn2d(ib_bdy) == 'orlanski' .OR. cn_dyn2d(ib_bdy) == 'orlanski_npo' & 72 & .OR. cn_dyn3d(ib_bdy) == 'orlanski' .OR. cn_dyn3d(ib_bdy) == 'orlanski_npo') ll_orlanski = .true. 73 END DO 76 74 77 75 !------------------------------------------------------- … … 79 77 !------------------------------------------------------- 80 78 81 CALL wrk_alloc( jpi,jpj,pua2d,pva2d)79 CALL wrk_alloc( jpi,jpj, pua2d, pva2d ) 82 80 83 81 !------------------------------------------------------- … … 85 83 !------------------------------------------------------- 86 84 87 ! "After" velocities: 85 ! ! "After" velocities: 86 pua2d(:,:) = 0._wp 87 pva2d(:,:) = 0._wp 88 DO jk = 1, jpkm1 89 pua2d(:,:) = pua2d(:,:) + e3u_a(:,:,jk) * ua(:,:,jk) * umask(:,:,jk) 90 pva2d(:,:) = pva2d(:,:) + e3v_a(:,:,jk) * va(:,:,jk) * vmask(:,:,jk) 91 END DO 92 pua2d(:,:) = pua2d(:,:) * r1_hu_a(:,:) 93 pva2d(:,:) = pva2d(:,:) * r1_hv_a(:,:) 88 94 89 pua2d(:,:) = 0.e0 90 pva2d(:,:) = 0.e0 91 DO jk = 1, jpkm1 92 pua2d(:,:) = pua2d(:,:) + fse3u_a(:,:,jk) * umask(:,:,jk) * ua(:,:,jk) 93 pva2d(:,:) = pva2d(:,:) + fse3v_a(:,:,jk) * vmask(:,:,jk) * va(:,:,jk) 95 DO jk = 1 , jpkm1 96 ua(:,:,jk) = ( ua(:,:,jk) - pua2d(:,:) ) * umask(:,:,jk) 97 va(:,:,jk) = ( va(:,:,jk) - pva2d(:,:) ) * vmask(:,:,jk) 94 98 END DO 95 99 96 pua2d(:,:) = pua2d(:,:) * hur_a(:,:)97 pva2d(:,:) = pva2d(:,:) * hvr_a(:,:)98 100 99 DO jk = 1 , jpkm1 100 ua(:,:,jk) = (ua(:,:,jk) - pua2d(:,:)) * umask(:,:,jk) 101 va(:,:,jk) = (va(:,:,jk) - pva2d(:,:)) * vmask(:,:,jk) 102 END DO 103 104 ! "Before" velocities (required for Orlanski condition): 105 106 IF ( ll_orlanski ) THEN 101 IF( ll_orlanski ) THEN ! "Before" velocities (Orlanski condition only) 107 102 DO jk = 1 , jpkm1 108 ub(:,:,jk) = ( ub(:,:,jk) - ub_b(:,:)) * umask(:,:,jk)109 vb(:,:,jk) = ( vb(:,:,jk) - vb_b(:,:)) * vmask(:,:,jk)103 ub(:,:,jk) = ( ub(:,:,jk) - ub_b(:,:) ) * umask(:,:,jk) 104 vb(:,:,jk) = ( vb(:,:,jk) - vb_b(:,:) ) * vmask(:,:,jk) 110 105 END DO 111 END 106 ENDIF 112 107 113 108 !------------------------------------------------------- … … 116 111 !------------------------------------------------------- 117 112 118 IF( ll_dyn2d ) CALL bdy_dyn2d( kt, pua2d, pva2d, ub_b, vb_b, hur_a(:,:), hvr_a(:,:), ssha )113 IF( ll_dyn2d ) CALL bdy_dyn2d( kt, pua2d, pva2d, ub_b, vb_b, r1_hu_a(:,:), r1_hv_a(:,:), ssha ) 119 114 120 IF( ll_dyn3d ) CALL bdy_dyn3d( kt )115 IF( ll_dyn3d ) CALL bdy_dyn3d( kt ) 121 116 122 117 !------------------------------------------------------- 123 118 ! Recombine velocities 124 119 !------------------------------------------------------- 125 120 ! 126 121 DO jk = 1 , jpkm1 127 122 ua(:,:,jk) = ( ua(:,:,jk) + pua2d(:,:) ) * umask(:,:,jk) 128 123 va(:,:,jk) = ( va(:,:,jk) + pva2d(:,:) ) * vmask(:,:,jk) 129 124 END DO 130 125 ! 131 126 IF ( ll_orlanski ) THEN 132 127 DO jk = 1 , jpkm1 … … 135 130 END DO 136 131 END IF 137 138 CALL wrk_dealloc( jpi,jpj,pua2d,pva2d)139 140 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn')141 132 ! 133 CALL wrk_dealloc( jpi,jpj, pua2d, pva2d ) 134 ! 135 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn') 136 ! 142 137 END SUBROUTINE bdy_dyn 143 138 -
branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn3d.F90
r5215 r7351 29 29 PUBLIC bdy_dyn3d_dmp ! routine called by step 30 30 31 !! * Substitutions32 # include "domzgr_substitute.h90"33 31 !!---------------------------------------------------------------------- 34 32 !! NEMO/OPA 3.3 , NEMO Consortium (2010) … … 45 43 !! 46 44 !!---------------------------------------------------------------------- 47 INTEGER, INTENT( in ) :: kt! Main time step counter48 ! !49 INTEGER :: ib_bdy! loop index50 !! 51 45 INTEGER, INTENT(in) :: kt ! Main time step counter 46 ! 47 INTEGER :: ib_bdy ! loop index 48 !!---------------------------------------------------------------------- 49 ! 52 50 DO ib_bdy=1, nb_bdy 53 51 ! 54 52 SELECT CASE( cn_dyn3d(ib_bdy) ) 55 CASE('none') 56 CYCLE 57 CASE('frs') 58 CALL bdy_dyn3d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 59 CASE('specified') 60 CALL bdy_dyn3d_spe( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 61 CASE('zero') 62 CALL bdy_dyn3d_zro( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 63 CASE('orlanski') 64 CALL bdy_dyn3d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, ll_npo=.false. ) 65 CASE('orlanski_npo') 66 CALL bdy_dyn3d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, ll_npo=.true. ) 67 CASE DEFAULT 68 CALL ctl_stop( 'bdy_dyn3d : unrecognised option for open boundaries for baroclinic velocities' ) 53 CASE('none') ; CYCLE 54 CASE('frs' ) ; CALL bdy_dyn3d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 55 CASE('specified') ; CALL bdy_dyn3d_spe( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 56 CASE('zero') ; CALL bdy_dyn3d_zro( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 57 CASE('orlanski' ) ; CALL bdy_dyn3d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, ll_npo=.false. ) 58 CASE('orlanski_npo'); CALL bdy_dyn3d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, ll_npo=.true. ) 59 CASE DEFAULT ; CALL ctl_stop( 'bdy_dyn3d : unrecognised option for open boundaries for baroclinic velocities' ) 69 60 END SELECT 70 END DO71 61 END DO 62 ! 72 63 END SUBROUTINE bdy_dyn3d 64 73 65 74 66 SUBROUTINE bdy_dyn3d_spe( idx, dta, kt , ib_bdy ) … … 80 72 !! 81 73 !!---------------------------------------------------------------------- 82 INTEGER :: kt83 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices84 TYPE(OBC_DATA) , INTENT(in) :: dta! OBC external data85 INTEGER ,INTENT(in) :: ib_bdy ! BDY set index86 ! !74 INTEGER , INTENT(in) :: kt ! time step index 75 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 76 TYPE(OBC_DATA) , INTENT(in) :: dta ! OBC external data 77 INTEGER , INTENT(in) :: ib_bdy ! BDY set index 78 ! 87 79 INTEGER :: jb, jk ! dummy loop indices 88 80 INTEGER :: ii, ij, igrd ! local integers … … 112 104 CALL lbc_bdy_lnk( va, 'V', -1., ib_bdy ) 113 105 ! 114 IF( kt .eq. nit000 )CLOSE( unit = 102 )115 106 IF( kt == nit000 ) CLOSE( unit = 102 ) 107 ! 116 108 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_spe') 117 109 ! 118 110 END SUBROUTINE bdy_dyn3d_spe 119 111 112 120 113 SUBROUTINE bdy_dyn3d_zro( idx, dta, kt, ib_bdy ) 121 114 !!---------------------------------------------------------------------- … … 125 118 !! 126 119 !!---------------------------------------------------------------------- 127 INTEGER :: kt128 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices129 TYPE(OBC_DATA) , INTENT(in) :: dta! OBC external data120 INTEGER , INTENT(in) :: kt ! time step index 121 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 122 TYPE(OBC_DATA) , INTENT(in) :: dta ! OBC external data 130 123 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 131 ! !124 ! 132 125 INTEGER :: ib, ik ! dummy loop indices 133 INTEGER :: ii, ij, igrd , zcoef! local integers126 INTEGER :: ii, ij, igrd ! local integers 134 127 REAL(wp) :: zwgt ! boundary weight 135 128 !!---------------------------------------------------------------------- … … 157 150 CALL lbc_bdy_lnk( ua, 'U', -1., ib_bdy ) ; CALL lbc_bdy_lnk( va, 'V', -1.,ib_bdy ) ! Boundary points should be updated 158 151 ! 159 IF( kt .eq. nit000 )CLOSE( unit = 102 )160 161 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_zro')162 152 IF( kt == nit000 ) CLOSE( unit = 102 ) 153 ! 154 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_zro') 155 ! 163 156 END SUBROUTINE bdy_dyn3d_zro 157 164 158 165 159 SUBROUTINE bdy_dyn3d_frs( idx, dta, kt, ib_bdy ) … … 174 168 !! topography. Tellus, 365-382. 175 169 !!---------------------------------------------------------------------- 176 INTEGER :: kt177 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices178 TYPE(OBC_DATA) , INTENT(in) :: dta! OBC external data170 INTEGER , INTENT(in) :: kt ! time step index 171 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 172 TYPE(OBC_DATA) , INTENT(in) :: dta ! OBC external data 179 173 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 180 ! !174 ! 181 175 INTEGER :: jb, jk ! dummy loop indices 182 176 INTEGER :: ii, ij, igrd ! local integers … … 208 202 CALL lbc_bdy_lnk( va, 'V', -1., ib_bdy ) 209 203 ! 210 IF( kt .eq. nit000 )CLOSE( unit = 102 )211 212 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_frs')213 204 IF( kt == nit000 ) CLOSE( unit = 102 ) 205 ! 206 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_frs') 207 ! 214 208 END SUBROUTINE bdy_dyn3d_frs 209 215 210 216 211 SUBROUTINE bdy_dyn3d_orlanski( idx, dta, ib_bdy, ll_npo ) … … 259 254 !! 260 255 !!---------------------------------------------------------------------- 261 INTEGER :: kt262 ! !256 INTEGER, INTENT(in) :: kt ! time step index 257 ! 263 258 INTEGER :: jb, jk ! dummy loop indices 259 INTEGER :: ib_bdy ! loop index 264 260 INTEGER :: ii, ij, igrd ! local integers 265 261 REAL(wp) :: zwgt ! boundary weight 266 INTEGER :: ib_bdy ! loop index 267 !!---------------------------------------------------------------------- 268 ! 269 IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_dmp') 270 ! 271 !------------------------------------------------------- 272 262 !!---------------------------------------------------------------------- 263 ! 264 IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_dmp') 265 ! 273 266 DO ib_bdy=1, nb_bdy 274 267 IF ( ln_dyn3d_dmp(ib_bdy) .and. cn_dyn3d(ib_bdy) /= 'none' ) THEN … … 295 288 END DO 296 289 ENDIF 297 END DO290 END DO 298 291 ! 299 292 CALL lbc_lnk( ua, 'U', -1. ) ; CALL lbc_lnk( va, 'V', -1. ) ! Boundary points should be updated 300 293 ! 301 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_dmp')302 294 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_dmp') 295 ! 303 296 END SUBROUTINE bdy_dyn3d_dmp 304 297 … … 311 304 WRITE(*,*) 'bdy_dyn3d: You should not have seen this print! error?', kt 312 305 END SUBROUTINE bdy_dyn3d 313 314 306 SUBROUTINE bdy_dyn3d_dmp( kt ) ! Empty routine 315 307 WRITE(*,*) 'bdy_dyn3d_dmp: You should not have seen this print! error?', kt 316 308 END SUBROUTINE bdy_dyn3d_dmp 317 318 309 #endif 319 310 -
branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90
r5836 r7351 12 12 !! 3.4 ! 2011 (D. Storkey) rewrite in preparation for OBC-BDY merge 13 13 !! 3.4 ! 2012 (J. Chanut) straight open boundary case update 14 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) Updates for the 15 !! optimization of BDY communications 14 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) optimization of BDY communications 16 15 !!---------------------------------------------------------------------- 17 16 #if defined key_bdy … … 19 18 !! 'key_bdy' Unstructured Open Boundary Conditions 20 19 !!---------------------------------------------------------------------- 21 !! bdy_init 20 !! bdy_init : Initialization of unstructured open boundaries 22 21 !!---------------------------------------------------------------------- 23 USE wrk_nemo ! Memory Allocation 24 USE timing ! Timing 25 USE oce ! ocean dynamics and tracers variables 26 USE dom_oce ! ocean space and time domain 27 USE bdy_oce ! unstructured open boundary conditions 28 USE in_out_manager ! I/O units 29 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 30 USE lib_mpp ! for mpp_sum 31 USE iom ! I/O 32 USE sbctide, ONLY: lk_tide ! Tidal forcing or not 33 USE phycst, ONLY: rday 22 USE oce ! ocean dynamics and tracers variables 23 USE dom_oce ! ocean space and time domain 24 USE bdy_oce ! unstructured open boundary conditions 25 USE sbctide , ONLY: lk_tide ! Tidal forcing or not 26 USE phycst , ONLY: rday 27 ! 28 USE in_out_manager ! I/O units 29 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 30 USE lib_mpp ! for mpp_sum 31 USE iom ! I/O 32 USE wrk_nemo ! Memory Allocation 33 USE timing ! Timing 34 34 35 35 IMPLICIT NONE … … 38 38 PUBLIC bdy_init ! routine called in nemo_init 39 39 40 INTEGER, PARAMETER :: jp_nseg = 10041 INTEGER, PARAMETER :: nrimmax = 20! maximum rimwidth in structured40 INTEGER, PARAMETER :: jp_nseg = 100 ! 41 INTEGER, PARAMETER :: nrimmax = 20 ! maximum rimwidth in structured 42 42 ! open boundary data files 43 43 ! Straight open boundary segment parameters: 44 INTEGER :: nbdysege, nbdysegw, nbdysegn, nbdysegs45 INTEGER, DIMENSION(jp_nseg) :: jpieob, jpjedt, jpjeft, npckge46 INTEGER, DIMENSION(jp_nseg) :: jpiwob, jpjwdt, jpjwft, npckgw47 INTEGER, DIMENSION(jp_nseg) :: jpjnob, jpindt, jpinft, npckgn48 INTEGER, DIMENSION(jp_nseg) :: jpjsob, jpisdt, jpisft, npckgs44 INTEGER :: nbdysege, nbdysegw, nbdysegn, nbdysegs 45 INTEGER, DIMENSION(jp_nseg) :: jpieob, jpjedt, jpjeft, npckge ! 46 INTEGER, DIMENSION(jp_nseg) :: jpiwob, jpjwdt, jpjwft, npckgw ! 47 INTEGER, DIMENSION(jp_nseg) :: jpjnob, jpindt, jpinft, npckgn ! 48 INTEGER, DIMENSION(jp_nseg) :: jpjsob, jpisdt, jpisft, npckgs ! 49 49 !!---------------------------------------------------------------------- 50 !! NEMO/OPA 4.0 , NEMO Consortium (2011)50 !! NEMO/OPA 3.7 , NEMO Consortium (2015) 51 51 !! $Id$ 52 52 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 66 66 !! ** Input : bdy_init.nc, input file for unstructured open boundaries 67 67 !!---------------------------------------------------------------------- 68 ! namelist variables69 !-------------------70 CHARACTER(LEN=80),DIMENSION(jpbgrd) :: clfile71 CHARACTER(LEN=1) :: ctypebdy72 INTEGER :: nbdyind, nbdybeg, nbdyend73 68 74 69 ! local variables … … 81 76 INTEGER :: ib_bdy1, ib_bdy2, ib1, ib2 ! - - 82 77 INTEGER :: i_offset, j_offset ! - - 83 INTEGER , POINTER :: nbi, nbj, nbr! short cuts78 INTEGER , POINTER :: nbi, nbj, nbr ! short cuts 84 79 REAL(wp), POINTER :: flagu, flagv ! - - 85 80 REAL(wp), POINTER, DIMENSION(:,:) :: pmask ! pointer to 2D mask fields … … 94 89 INTEGER :: iw_b(4), ie_b(4), is_b(4), in_b(4) ! Arrays for neighbours coordinates 95 90 REAL(wp), POINTER, DIMENSION(:,:) :: zfmask ! temporary fmask array excluding coastal boundary condition (shlat) 96 91 !! 92 CHARACTER(LEN=80),DIMENSION(jpbgrd) :: clfile ! Namelist variables 93 CHARACTER(LEN=1) :: ctypebdy ! - - 94 INTEGER :: nbdyind, nbdybeg, nbdyend 97 95 !! 98 96 NAMELIST/nambdy/ nb_bdy, ln_coords_file, cn_coords_file, & … … 103 101 & rn_ice_tem, rn_ice_sal, rn_ice_age, & 104 102 & ln_vol, nn_volctl, nn_rimwidth 105 !!103 ! 106 104 NAMELIST/nambdy_index/ ctypebdy, nbdyind, nbdybeg, nbdyend 107 105 INTEGER :: ios ! Local integer output status for namelist read 108 106 !!---------------------------------------------------------------------- 109 110 IF( nn_timing == 1 ) CALL timing_start('bdy_init')111 107 ! 108 IF( nn_timing == 1 ) CALL timing_start('bdy_init') 109 ! 112 110 IF(lwp) WRITE(numout,*) 113 111 IF(lwp) WRITE(numout,*) 'bdy_init : initialization of open boundaries' 114 112 IF(lwp) WRITE(numout,*) '~~~~~~~~' 115 113 ! 116 117 114 IF( jperio /= 0 ) CALL ctl_stop( 'Cyclic or symmetric,', & 118 115 & ' and general open boundary condition are not compatible' ) 119 116 120 cgrid = (/'t','u','v'/)117 cgrid = (/'t','u','v'/) 121 118 122 119 ! ------------------------ 123 120 ! Read namelist parameters 124 121 ! ------------------------ 125 126 122 REWIND( numnam_ref ) ! Namelist nambdy in reference namelist :Unstructured open boundaries 127 123 READ ( numnam_ref, nambdy, IOSTAT = ios, ERR = 901) 128 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy in reference namelist', lwp )129 124 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy in reference namelist', lwp ) 125 ! 130 126 REWIND( numnam_cfg ) ! Namelist nambdy in configuration namelist :Unstructured open boundaries 131 127 READ ( numnam_cfg, nambdy, IOSTAT = ios, ERR = 902 ) 132 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy in configuration namelist', lwp )128 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy in configuration namelist', lwp ) 133 129 IF(lwm) WRITE ( numond, nambdy ) 134 130 … … 137 133 ! ----------------------------------------- 138 134 ! ! control prints 139 IF(lwp) WRITE(numout,*) ' 140 141 IF( nb_bdy .eq.0 ) THEN135 IF(lwp) WRITE(numout,*) ' nambdy' 136 137 IF( nb_bdy == 0 ) THEN 142 138 IF(lwp) WRITE(numout,*) 'nb_bdy = 0, NO OPEN BOUNDARIES APPLIED.' 143 139 ELSE 144 IF(lwp) WRITE(numout,*) 'Number of open boundary sets : ', nb_bdy140 IF(lwp) WRITE(numout,*) 'Number of open boundary sets : ', nb_bdy 145 141 ENDIF 146 142 … … 158 154 IF(lwp) WRITE(numout,*) 'Boundary conditions for barotropic solution: ' 159 155 SELECT CASE( cn_dyn2d(ib_bdy) ) 160 CASE( 'none')156 CASE( 'none' ) 161 157 IF(lwp) WRITE(numout,*) ' no open boundary condition' 162 158 dta_bdy(ib_bdy)%ll_ssh = .false. 163 159 dta_bdy(ib_bdy)%ll_u2d = .false. 164 160 dta_bdy(ib_bdy)%ll_v2d = .false. 165 CASE( 'frs')161 CASE( 'frs' ) 166 162 IF(lwp) WRITE(numout,*) ' Flow Relaxation Scheme' 167 163 dta_bdy(ib_bdy)%ll_ssh = .false. 168 164 dta_bdy(ib_bdy)%ll_u2d = .true. 169 165 dta_bdy(ib_bdy)%ll_v2d = .true. 170 CASE( 'flather')166 CASE( 'flather' ) 171 167 IF(lwp) WRITE(numout,*) ' Flather radiation condition' 172 168 dta_bdy(ib_bdy)%ll_ssh = .true. 173 169 dta_bdy(ib_bdy)%ll_u2d = .true. 174 170 dta_bdy(ib_bdy)%ll_v2d = .true. 175 CASE( 'orlanski')171 CASE( 'orlanski' ) 176 172 IF(lwp) WRITE(numout,*) ' Orlanski (fully oblique) radiation condition with adaptive nudging' 177 173 dta_bdy(ib_bdy)%ll_ssh = .false. 178 174 dta_bdy(ib_bdy)%ll_u2d = .true. 179 175 dta_bdy(ib_bdy)%ll_v2d = .true. 180 CASE( 'orlanski_npo')176 CASE( 'orlanski_npo' ) 181 177 IF(lwp) WRITE(numout,*) ' Orlanski (NPO) radiation condition with adaptive nudging' 182 178 dta_bdy(ib_bdy)%ll_ssh = .false. … … 392 388 REWIND( numnam_cfg ) 393 389 394 !!----------------------------------------------------------------------395 396 397 398 390 nblendta(:,:) = 0 399 391 nbdysege = 0 … … 492 484 nblendta(igrd,ib_bdy) = MAXVAL(kdimsz) 493 485 jpbdtau = MAX(jpbdtau, MAXVAL(kdimsz)) 494 END DO486 END DO 495 487 CALL iom_close( inum ) 496 488 ! 497 489 ENDIF 498 499 END DO ! ib_bdy490 ! 491 END DO ! ib_bdy 500 492 501 493 IF (nb_bdy>0) THEN … … 514 506 ! Now look for crossings in user (namelist) defined open boundary segments: 515 507 !-------------------------------------------------------------------------- 516 IF ( icount>0 )CALL bdy_ctl_seg508 IF( icount>0 ) CALL bdy_ctl_seg 517 509 518 510 ! Calculate global boundary index arrays or read in from file … … 520 512 ! 1. Read global index arrays from boundary coordinates file. 521 513 DO ib_bdy = 1, nb_bdy 522 514 ! 523 515 IF( ln_coords_file(ib_bdy) ) THEN 524 516 ! 525 517 CALL iom_open( cn_coords_file(ib_bdy), inum ) 526 518 DO igrd = 1, jpbgrd … … 537 529 nbrdta(ii,igrd,ib_bdy) = INT( dta_global(ii,1,1) ) 538 530 END DO 539 531 ! 540 532 ibr_max = MAXVAL( nbrdta(:,igrd,ib_bdy) ) 541 533 IF(lwp) WRITE(numout,*) … … 546 538 END DO 547 539 CALL iom_close( inum ) 548 540 ! 549 541 ENDIF 550 551 END DO542 ! 543 END DO 552 544 553 545 ! 2. Now fill indices corresponding to straight open boundary arrays: … … 792 784 793 785 ! Work out dimensions of boundary data on each neighbour process 794 IF(nbondi .eq.0) THEN786 IF(nbondi == 0) THEN 795 787 iw_b(1) = jpizoom + nimppt(nowe+1) 796 788 ie_b(1) = jpizoom + nimppt(nowe+1)+nlcit(nowe+1)-3 … … 802 794 is_b(2) = jpjzoom + njmppt(noea+1) 803 795 in_b(2) = jpjzoom + njmppt(noea+1)+nlcjt(noea+1)-3 804 ELSEIF(nbondi .eq.1) THEN796 ELSEIF(nbondi == 1) THEN 805 797 iw_b(1) = jpizoom + nimppt(nowe+1) 806 798 ie_b(1) = jpizoom + nimppt(nowe+1)+nlcit(nowe+1)-3 807 799 is_b(1) = jpjzoom + njmppt(nowe+1) 808 800 in_b(1) = jpjzoom + njmppt(nowe+1)+nlcjt(nowe+1)-3 809 ELSEIF(nbondi .eq.-1) THEN801 ELSEIF(nbondi == -1) THEN 810 802 iw_b(2) = jpizoom + nimppt(noea+1) 811 803 ie_b(2) = jpizoom + nimppt(noea+1)+nlcit(noea+1)-3 … … 814 806 ENDIF 815 807 816 IF(nbondj .eq.0) THEN808 IF(nbondj == 0) THEN 817 809 iw_b(3) = jpizoom + nimppt(noso+1) 818 810 ie_b(3) = jpizoom + nimppt(noso+1)+nlcit(noso+1)-3 … … 824 816 is_b(4) = jpjzoom + njmppt(nono+1) 825 817 in_b(4) = jpjzoom + njmppt(nono+1)+nlcjt(nono+1)-3 826 ELSEIF(nbondj .eq.1) THEN818 ELSEIF(nbondj == 1) THEN 827 819 iw_b(3) = jpizoom + nimppt(noso+1) 828 820 ie_b(3) = jpizoom + nimppt(noso+1)+nlcit(noso+1)-3 829 821 is_b(3) = jpjzoom + njmppt(noso+1) 830 822 in_b(3) = jpjzoom + njmppt(noso+1)+nlcjt(noso+1)-3 831 ELSEIF(nbondj .eq.-1) THEN823 ELSEIF(nbondj == -1) THEN 832 824 iw_b(4) = jpizoom + nimppt(nono+1) 833 825 ie_b(4) = jpizoom + nimppt(nono+1)+nlcit(nono+1)-3 … … 867 859 ! Allocate index arrays for this boundary set 868 860 !-------------------------------------------- 869 ilen1 = MAXVAL( idx_bdy(ib_bdy)%nblen(:))870 ALLOCATE( idx_bdy(ib_bdy)%nbi (ilen1,jpbgrd) )871 ALLOCATE( idx_bdy(ib_bdy)%nbj (ilen1,jpbgrd) )872 ALLOCATE( idx_bdy(ib_bdy)%nbr (ilen1,jpbgrd) )873 ALLOCATE( idx_bdy(ib_bdy)%nbd (ilen1,jpbgrd) )861 ilen1 = MAXVAL( idx_bdy(ib_bdy)%nblen(:) ) 862 ALLOCATE( idx_bdy(ib_bdy)%nbi (ilen1,jpbgrd) ) 863 ALLOCATE( idx_bdy(ib_bdy)%nbj (ilen1,jpbgrd) ) 864 ALLOCATE( idx_bdy(ib_bdy)%nbr (ilen1,jpbgrd) ) 865 ALLOCATE( idx_bdy(ib_bdy)%nbd (ilen1,jpbgrd) ) 874 866 ALLOCATE( idx_bdy(ib_bdy)%nbdout(ilen1,jpbgrd) ) 875 ALLOCATE( idx_bdy(ib_bdy)%nbmap (ilen1,jpbgrd) )876 ALLOCATE( idx_bdy(ib_bdy)%nbw (ilen1,jpbgrd) )877 ALLOCATE( idx_bdy(ib_bdy)%flagu (ilen1,jpbgrd) )878 ALLOCATE( idx_bdy(ib_bdy)%flagv (ilen1,jpbgrd) )867 ALLOCATE( idx_bdy(ib_bdy)%nbmap (ilen1,jpbgrd) ) 868 ALLOCATE( idx_bdy(ib_bdy)%nbw (ilen1,jpbgrd) ) 869 ALLOCATE( idx_bdy(ib_bdy)%flagu (ilen1,jpbgrd) ) 870 ALLOCATE( idx_bdy(ib_bdy)%flagv (ilen1,jpbgrd) ) 879 871 880 872 ! Dispatch mapping indices and discrete distances on each processor 881 873 ! ----------------------------------------------------------------- 882 874 883 com_east = 0884 com_west = 0875 com_east = 0 876 com_west = 0 885 877 com_south = 0 886 878 com_north = 0 887 879 888 com_east_b = 0889 com_west_b = 0880 com_east_b = 0 881 com_west_b = 0 890 882 com_south_b = 0 891 883 com_north_b = 0 … … 912 904 ii = idx_bdy(ib_bdy)%nbi(icount,igrd) 913 905 ij = idx_bdy(ib_bdy)%nbj(icount,igrd) 914 if((com_east .ne. 1) .and. (ii .eq.(nlci-1)) .and. (nbondi .le. 0)) then906 if((com_east .ne. 1) .and. (ii == (nlci-1)) .and. (nbondi .le. 0)) then 915 907 com_east = 1 916 elseif((com_west .ne. 1) .and. (ii .eq.2) .and. (nbondi .ge. 0) .and. (nbondi .ne. 2)) then908 elseif((com_west .ne. 1) .and. (ii == 2) .and. (nbondi .ge. 0) .and. (nbondi .ne. 2)) then 917 909 com_west = 1 918 910 endif 919 if((com_south .ne. 1) .and. (ij .eq.2) .and. (nbondj .ge. 0) .and. (nbondj .ne. 2)) then911 if((com_south .ne. 1) .and. (ij == 2) .and. (nbondj .ge. 0) .and. (nbondj .ne. 2)) then 920 912 com_south = 1 921 elseif((com_north .ne. 1) .and. (ij .eq.(nlcj-1)) .and. (nbondj .le. 0)) then913 elseif((com_north .ne. 1) .and. (ij == (nlcj-1)) .and. (nbondj .le. 0)) then 922 914 com_north = 1 923 915 endif … … 926 918 ENDIF 927 919 ! check if point has to be received from a neighbour 928 IF(nbondi .eq.0) THEN920 IF(nbondi == 0) THEN 929 921 IF( nbidta(ib,igrd,ib_bdy) >= iw_b(1) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(1) .AND. & 930 922 & nbjdta(ib,igrd,ib_bdy) >= is_b(1) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(1) .AND. & 931 923 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN 932 924 ii = nbidta(ib,igrd,ib_bdy)- iw_b(1)+2 933 if((com_west_b .ne. 1) .and. (ii .eq.(nlcit(nowe+1)-1))) then925 if((com_west_b .ne. 1) .and. (ii == (nlcit(nowe+1)-1))) then 934 926 ij = nbjdta(ib,igrd,ib_bdy) - is_b(1)+2 935 if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq.1)) then927 if((ij == 2) .and. (nbondj == 0 .or. nbondj == 1)) then 936 928 com_south = 1 937 elseif((ij .eq. nlcjt(nowe+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq.-1)) then929 elseif((ij == nlcjt(nowe+1)-1) .and. (nbondj == 0 .or. nbondj == -1)) then 938 930 com_north = 1 939 931 endif … … 945 937 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN 946 938 ii = nbidta(ib,igrd,ib_bdy)- iw_b(2)+2 947 if((com_east_b .ne. 1) .and. (ii .eq.2)) then939 if((com_east_b .ne. 1) .and. (ii == 2)) then 948 940 ij = nbjdta(ib,igrd,ib_bdy) - is_b(2)+2 949 if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq.1)) then941 if((ij == 2) .and. (nbondj == 0 .or. nbondj == 1)) then 950 942 com_south = 1 951 elseif((ij .eq. nlcjt(noea+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq.-1)) then943 elseif((ij == nlcjt(noea+1)-1) .and. (nbondj == 0 .or. nbondj == -1)) then 952 944 com_north = 1 953 945 endif … … 955 947 endif 956 948 ENDIF 957 ELSEIF(nbondi .eq.1) THEN949 ELSEIF(nbondi == 1) THEN 958 950 IF( nbidta(ib,igrd,ib_bdy) >= iw_b(1) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(1) .AND. & 959 951 & nbjdta(ib,igrd,ib_bdy) >= is_b(1) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(1) .AND. & 960 952 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN 961 953 ii = nbidta(ib,igrd,ib_bdy)- iw_b(1)+2 962 if((com_west_b .ne. 1) .and. (ii .eq.(nlcit(nowe+1)-1))) then954 if((com_west_b .ne. 1) .and. (ii == (nlcit(nowe+1)-1))) then 963 955 ij = nbjdta(ib,igrd,ib_bdy) - is_b(1)+2 964 if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq.1)) then956 if((ij == 2) .and. (nbondj == 0 .or. nbondj == 1)) then 965 957 com_south = 1 966 elseif((ij .eq. nlcjt(nowe+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq.-1)) then958 elseif((ij == nlcjt(nowe+1)-1) .and. (nbondj == 0 .or. nbondj == -1)) then 967 959 com_north = 1 968 960 endif … … 970 962 endif 971 963 ENDIF 972 ELSEIF(nbondi .eq.-1) THEN964 ELSEIF(nbondi == -1) THEN 973 965 IF( nbidta(ib,igrd,ib_bdy) >= iw_b(2) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(2) .AND. & 974 966 & nbjdta(ib,igrd,ib_bdy) >= is_b(2) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(2) .AND. & 975 967 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN 976 968 ii = nbidta(ib,igrd,ib_bdy)- iw_b(2)+2 977 if((com_east_b .ne. 1) .and. (ii .eq.2)) then969 if((com_east_b .ne. 1) .and. (ii == 2)) then 978 970 ij = nbjdta(ib,igrd,ib_bdy) - is_b(2)+2 979 if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq.1)) then971 if((ij == 2) .and. (nbondj == 0 .or. nbondj == 1)) then 980 972 com_south = 1 981 elseif((ij .eq. nlcjt(noea+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq.-1)) then973 elseif((ij == nlcjt(noea+1)-1) .and. (nbondj == 0 .or. nbondj == -1)) then 982 974 com_north = 1 983 975 endif … … 986 978 ENDIF 987 979 ENDIF 988 IF(nbondj .eq.0) THEN980 IF(nbondj == 0) THEN 989 981 IF(com_north_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(4)-1 & 990 982 & .OR. nbidta(ib,igrd,ib_bdy) == ie_b(4)+1) .AND. & … … 1001 993 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN 1002 994 ij = nbjdta(ib,igrd,ib_bdy)- is_b(3)+2 1003 if((com_south_b .ne. 1) .and. (ij .eq.(nlcjt(noso+1)-1))) then995 if((com_south_b .ne. 1) .and. (ij == (nlcjt(noso+1)-1))) then 1004 996 com_south_b = 1 1005 997 endif … … 1009 1001 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN 1010 1002 ij = nbjdta(ib,igrd,ib_bdy)- is_b(4)+2 1011 if((com_north_b .ne. 1) .and. (ij .eq.2)) then1003 if((com_north_b .ne. 1) .and. (ij == 2)) then 1012 1004 com_north_b = 1 1013 1005 endif 1014 1006 ENDIF 1015 ELSEIF(nbondj .eq.1) THEN1007 ELSEIF(nbondj == 1) THEN 1016 1008 IF( com_south_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(3)-1 .OR. & 1017 1009 & nbidta(ib,igrd,ib_bdy) == ie_b(3)+1) .AND. & … … 1023 1015 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN 1024 1016 ij = nbjdta(ib,igrd,ib_bdy)- is_b(3)+2 1025 if((com_south_b .ne. 1) .and. (ij .eq.(nlcjt(noso+1)-1))) then1017 if((com_south_b .ne. 1) .and. (ij == (nlcjt(noso+1)-1))) then 1026 1018 com_south_b = 1 1027 1019 endif 1028 1020 ENDIF 1029 ELSEIF(nbondj .eq.-1) THEN1021 ELSEIF(nbondj == -1) THEN 1030 1022 IF(com_north_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(4)-1 & 1031 1023 & .OR. nbidta(ib,igrd,ib_bdy) == ie_b(4)+1) .AND. & … … 1037 1029 & nbrdta(ib,igrd,ib_bdy) == ir ) THEN 1038 1030 ij = nbjdta(ib,igrd,ib_bdy)- is_b(4)+2 1039 if((com_north_b .ne. 1) .and. (ij .eq.2)) then1031 if((com_north_b .ne. 1) .and. (ij == 2)) then 1040 1032 com_north_b = 1 1041 1033 endif … … 1046 1038 ENDDO 1047 1039 1048 ! definition of the i- and j- direction local boundaries arrays 1049 ! used for sending the boudaries 1050 IF((com_east .eq. 1) .and. (com_west .eq. 1)) THEN 1051 nbondi_bdy(ib_bdy) = 0 1052 ELSEIF ((com_east .eq. 1) .and. (com_west .eq. 0)) THEN 1053 nbondi_bdy(ib_bdy) = -1 1054 ELSEIF ((com_east .eq. 0) .and. (com_west .eq. 1)) THEN 1055 nbondi_bdy(ib_bdy) = 1 1040 ! definition of the i- and j- direction local boundaries arrays used for sending the boundaries 1041 IF( (com_east == 1) .and. (com_west == 1) ) THEN ; nbondi_bdy(ib_bdy) = 0 1042 ELSEIF( (com_east == 1) .and. (com_west == 0) ) THEN ; nbondi_bdy(ib_bdy) = -1 1043 ELSEIF( (com_east == 0) .and. (com_west == 1) ) THEN ; nbondi_bdy(ib_bdy) = 1 1056 1044 ENDIF 1057 1058 IF((com_north .eq. 1) .and. (com_south .eq. 1)) THEN 1059 nbondj_bdy(ib_bdy) = 0 1060 ELSEIF ((com_north .eq. 1) .and. (com_south .eq. 0)) THEN 1061 nbondj_bdy(ib_bdy) = -1 1062 ELSEIF ((com_north .eq. 0) .and. (com_south .eq. 1)) THEN 1063 nbondj_bdy(ib_bdy) = 1 1045 IF( (com_north == 1) .and. (com_south == 1) ) THEN ; nbondj_bdy(ib_bdy) = 0 1046 ELSEIF( (com_north == 1) .and. (com_south == 0) ) THEN ; nbondj_bdy(ib_bdy) = -1 1047 ELSEIF( (com_north == 0) .and. (com_south == 1) ) THEN ; nbondj_bdy(ib_bdy) = 1 1064 1048 ENDIF 1065 1049 1066 ! definition of the i- and j- direction local boundaries arrays 1067 ! used for receiving the boudaries 1068 IF((com_east_b .eq. 1) .and. (com_west_b .eq. 1)) THEN 1069 nbondi_bdy_b(ib_bdy) = 0 1070 ELSEIF ((com_east_b .eq. 1) .and. (com_west_b .eq. 0)) THEN 1071 nbondi_bdy_b(ib_bdy) = -1 1072 ELSEIF ((com_east_b .eq. 0) .and. (com_west_b .eq. 1)) THEN 1073 nbondi_bdy_b(ib_bdy) = 1 1050 ! definition of the i- and j- direction local boundaries arrays used for receiving the boundaries 1051 IF( (com_east_b == 1) .and. (com_west_b == 1) ) THEN ; nbondi_bdy_b(ib_bdy) = 0 1052 ELSEIF( (com_east_b == 1) .and. (com_west_b == 0) ) THEN ; nbondi_bdy_b(ib_bdy) = -1 1053 ELSEIF( (com_east_b == 0) .and. (com_west_b == 1) ) THEN ; nbondi_bdy_b(ib_bdy) = 1 1074 1054 ENDIF 1075 1076 IF((com_north_b .eq. 1) .and. (com_south_b .eq. 1)) THEN 1077 nbondj_bdy_b(ib_bdy) = 0 1078 ELSEIF ((com_north_b .eq. 1) .and. (com_south_b .eq. 0)) THEN 1079 nbondj_bdy_b(ib_bdy) = -1 1080 ELSEIF ((com_north_b .eq. 0) .and. (com_south_b .eq. 1)) THEN 1081 nbondj_bdy_b(ib_bdy) = 1 1055 IF( (com_north_b == 1) .and. (com_south_b == 1) ) THEN ; nbondj_bdy_b(ib_bdy) = 0 1056 ELSEIF( (com_north_b == 1) .and. (com_south_b == 0) ) THEN ; nbondj_bdy_b(ib_bdy) = -1 1057 ELSEIF( (com_north_b == 0) .and. (com_south_b == 1) ) THEN ; nbondj_bdy_b(ib_bdy) = 1 1082 1058 ENDIF 1083 1059 … … 1087 1063 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) 1088 1064 nbr => idx_bdy(ib_bdy)%nbr(ib,igrd) 1089 idx_bdy(ib_bdy)%nbw(ib,igrd) = 1.- TANH( FLOAT( nbr - 1 ) *0.5 ) ! tanh formulation1090 ! idx_bdy(ib_bdy)%nbw(ib,igrd) = ( FLOAT(nn_rimwidth(ib_bdy)+1-nbr)/FLOAT(nn_rimwidth(ib_bdy)))**2. ! quadratic1091 ! idx_bdy(ib_bdy)%nbw(ib,igrd) = FLOAT(nn_rimwidth(ib_bdy)+1-nbr)/FLOAT(nn_rimwidth(ib_bdy)) ! linear1065 idx_bdy(ib_bdy)%nbw(ib,igrd) = 1.- TANH( REAL( nbr - 1 ) *0.5 ) ! tanh formulation 1066 ! idx_bdy(ib_bdy)%nbw(ib,igrd) = (REAL(nn_rimwidth(ib_bdy)+1-nbr)/REAL(nn_rimwidth(ib_bdy)))**2. ! quadratic 1067 ! idx_bdy(ib_bdy)%nbw(ib,igrd) = REAL(nn_rimwidth(ib_bdy)+1-nbr)/REAL(nn_rimwidth(ib_bdy)) ! linear 1092 1068 END DO 1093 1069 END DO … … 1099 1075 nbr => idx_bdy(ib_bdy)%nbr(ib,igrd) 1100 1076 idx_bdy(ib_bdy)%nbd(ib,igrd) = 1. / ( rn_time_dmp(ib_bdy) * rday ) & 1101 & *( FLOAT(nn_rimwidth(ib_bdy)+1-nbr)/FLOAT(nn_rimwidth(ib_bdy)))**2. ! quadratic1077 & *(REAL(nn_rimwidth(ib_bdy)+1-nbr)/REAL(nn_rimwidth(ib_bdy)))**2. ! quadratic 1102 1078 idx_bdy(ib_bdy)%nbdout(ib,igrd) = 1. / ( rn_time_dmp_out(ib_bdy) * rday ) & 1103 & *( FLOAT(nn_rimwidth(ib_bdy)+1-nbr)/FLOAT(nn_rimwidth(ib_bdy)))**2. ! quadratic1079 & *(REAL(nn_rimwidth(ib_bdy)+1-nbr)/REAL(nn_rimwidth(ib_bdy)))**2. ! quadratic 1104 1080 END DO 1105 1081 END DO … … 1122 1098 1123 1099 ! Derive mask on U and V grid from mask on T grid 1124 bdyumask(:,:) = 0. e01125 bdyvmask(:,:) = 0. e01100 bdyumask(:,:) = 0._wp 1101 bdyvmask(:,:) = 0._wp 1126 1102 DO ij=1, jpjm1 1127 1103 DO ii=1, jpim1 1128 bdyumask(ii,ij) =bdytmask(ii,ij)*bdytmask(ii+1, ij )1129 bdyvmask(ii,ij) =bdytmask(ii,ij)*bdytmask(ii ,ij+1)1104 bdyumask(ii,ij) = bdytmask(ii,ij) * bdytmask(ii+1, ij ) 1105 bdyvmask(ii,ij) = bdytmask(ii,ij) * bdytmask(ii ,ij+1) 1130 1106 END DO 1131 1107 END DO … … 1141 1117 umask(ii,ij,ik) = umask(ii,ij,ik) * bdyumask(ii,ij) 1142 1118 vmask(ii,ij,ik) = vmask(ii,ij,ik) * bdyvmask(ii,ij) 1143 bmask(ii,ij) = bmask(ii,ij) * bdytmask(ii,ij)1144 1119 END DO 1145 1120 END DO 1146 END DO1147 1148 DO ik = 1, jpkm11149 1121 DO ij = 2, jpjm1 1150 1122 DO ii = 2, jpim1 … … 1154 1126 END DO 1155 1127 END DO 1156 1157 1128 tmask_i (:,:) = ssmask(:,:) * tmask_i(:,:) 1158 1129 ! 1159 1130 ENDIF ! ln_mask_file=.TRUE. 1160 1131 1161 1132 bdytmask(:,:) = ssmask(:,:) 1162 IF( .not. ln_mask_file ) THEN 1163 ! If .not. ln_mask_file then we need to derive mask on U and V grid 1164 ! from mask on T grid here. 1165 bdyumask(:,:) = 0.e0 1166 bdyvmask(:,:) = 0.e0 1167 DO ij=1, jpjm1 1168 DO ii=1, jpim1 1169 bdyumask(ii,ij)=bdytmask(ii,ij)*bdytmask(ii+1, ij ) 1170 bdyvmask(ii,ij)=bdytmask(ii,ij)*bdytmask(ii ,ij+1) 1133 IF( .NOT.ln_mask_file ) THEN 1134 ! If .not. ln_mask_file then we need to derive mask on U and V grid from mask on T grid here. 1135 bdyumask(:,:) = 0._wp 1136 bdyvmask(:,:) = 0._wp 1137 DO ij = 1, jpjm1 1138 DO ii = 1, jpim1 1139 bdyumask(ii,ij) = bdytmask(ii,ij) * bdytmask(ii+1, ij ) 1140 bdyvmask(ii,ij) = bdytmask(ii,ij) * bdytmask(ii ,ij+1) 1171 1141 END DO 1172 1142 END DO … … 1174 1144 ENDIF 1175 1145 1176 ! bdy masks and bmask are now set to zero on boundary points: 1177 igrd = 1 ! In the free surface case, bmask is at T-points 1178 DO ib_bdy = 1, nb_bdy 1179 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 1180 bmask(idx_bdy(ib_bdy)%nbi(ib,igrd), idx_bdy(ib_bdy)%nbj(ib,igrd)) = 0.e0 1181 ENDDO 1182 ENDDO 1146 ! bdy masks are now set to zero on boundary points: 1183 1147 ! 1184 1148 igrd = 1 1185 1149 DO ib_bdy = 1, nb_bdy 1186 1150 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 1187 bdytmask(idx_bdy(ib_bdy)%nbi(ib,igrd), idx_bdy(ib_bdy)%nbj(ib,igrd)) = 0. e01188 END DO1189 END DO1151 bdytmask(idx_bdy(ib_bdy)%nbi(ib,igrd), idx_bdy(ib_bdy)%nbj(ib,igrd)) = 0._wp 1152 END DO 1153 END DO 1190 1154 ! 1191 1155 igrd = 2 1192 1156 DO ib_bdy = 1, nb_bdy 1193 1157 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 1194 bdyumask(idx_bdy(ib_bdy)%nbi(ib,igrd), idx_bdy(ib_bdy)%nbj(ib,igrd)) = 0. e01195 END DO1196 END DO1158 bdyumask(idx_bdy(ib_bdy)%nbi(ib,igrd), idx_bdy(ib_bdy)%nbj(ib,igrd)) = 0._wp 1159 END DO 1160 END DO 1197 1161 ! 1198 1162 igrd = 3 1199 1163 DO ib_bdy = 1, nb_bdy 1200 1164 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 1201 bdyvmask(idx_bdy(ib_bdy)%nbi(ib,igrd), idx_bdy(ib_bdy)%nbj(ib,igrd)) = 0. e01165 bdyvmask(idx_bdy(ib_bdy)%nbi(ib,igrd), idx_bdy(ib_bdy)%nbj(ib,igrd)) = 0._wp 1202 1166 ENDDO 1203 1167 ENDDO … … 1205 1169 ! For the flagu/flagv calculation below we require a version of fmask without 1206 1170 ! the land boundary condition (shlat) included: 1207 CALL wrk_alloc(jpi,jpj, zfmask)1171 CALL wrk_alloc(jpi,jpj, zfmask ) 1208 1172 DO ij = 2, jpjm1 1209 1173 DO ii = 2, jpim1 … … 1220 1184 DO ib_bdy = 1, nb_bdy ! Indices and directions of rim velocity components 1221 1185 1222 idx_bdy(ib_bdy)%flagu(:,:) = 0. e01223 idx_bdy(ib_bdy)%flagv(:,:) = 0. e01186 idx_bdy(ib_bdy)%flagu(:,:) = 0._wp 1187 idx_bdy(ib_bdy)%flagv(:,:) = 0._wp 1224 1188 icount = 0 1225 1189 … … 1231 1195 DO igrd = 1,jpbgrd 1232 1196 SELECT CASE( igrd ) 1233 CASE( 1 ) 1234 pmask => umask(:,:,1) 1235 i_offset = 0 1236 CASE( 2 ) 1237 pmask => bdytmask 1238 i_offset = 1 1239 CASE( 3 ) 1240 pmask => zfmask(:,:) 1241 i_offset = 0 1197 CASE( 1 ) ; pmask => umask (:,:,1) ; i_offset = 0 1198 CASE( 2 ) ; pmask => bdytmask(:,:) ; i_offset = 1 1199 CASE( 3 ) ; pmask => zfmask (:,:) ; i_offset = 0 1242 1200 END SELECT 1243 1201 icount = 0 … … 1270 1228 ! flagv = 1 : v is normal to the boundary and is direction is inward 1271 1229 1272 DO igrd = 1, jpbgrd1230 DO igrd = 1, jpbgrd 1273 1231 SELECT CASE( igrd ) 1274 CASE( 1 ) 1275 pmask => vmask(:,:,1) 1276 j_offset = 0 1277 CASE( 2 ) 1278 pmask => zfmask(:,:) 1279 j_offset = 0 1280 CASE( 3 ) 1281 pmask => bdytmask 1282 j_offset = 1 1232 CASE( 1 ) ; pmask => vmask (:,:,1) ; j_offset = 0 1233 CASE( 2 ) ; pmask => zfmask(:,:) ; j_offset = 0 1234 CASE( 3 ) ; pmask => bdytmask ; j_offset = 1 1283 1235 END SELECT 1284 1236 icount = 0 … … 1286 1238 nbi => idx_bdy(ib_bdy)%nbi(ib,igrd) 1287 1239 nbj => idx_bdy(ib_bdy)%nbj(ib,igrd) 1288 znfl = pmask(nbi,nbj+j_offset-1 1289 zsfl = pmask(nbi,nbj+j_offset )1240 znfl = pmask(nbi,nbj+j_offset-1) 1241 zsfl = pmask(nbi,nbj+j_offset ) 1290 1242 ! This error check only works if you are using the bdyXmask arrays 1291 1243 IF( j_offset == 1 .and. znfl + zsfl == 2 ) THEN … … 1305 1257 ENDIF 1306 1258 END DO 1307 1259 ! 1308 1260 END DO 1309 1261 1310 1262 ! Compute total lateral surface for volume correction: 1311 1263 ! ---------------------------------------------------- 1312 ! JC: this must be done at each time step with key_vvl1313 bdysurftot = 0. e01264 ! JC: this must be done at each time step with non-linear free surface 1265 bdysurftot = 0._wp 1314 1266 IF( ln_vol ) THEN 1315 1267 igrd = 2 ! Lateral surface at U-points … … 1319 1271 nbj => idx_bdy(ib_bdy)%nbj(ib,igrd) 1320 1272 flagu => idx_bdy(ib_bdy)%flagu(ib,igrd) 1321 bdysurftot = bdysurftot + hu 1273 bdysurftot = bdysurftot + hu_n (nbi , nbj) & 1322 1274 & * e2u (nbi , nbj) * ABS( flagu ) & 1323 1275 & * tmask_i(nbi , nbj) & 1324 1276 & * tmask_i(nbi+1, nbj) 1325 END DO1326 END DO1277 END DO 1278 END DO 1327 1279 1328 1280 igrd=3 ! Add lateral surface at V-points … … 1332 1284 nbj => idx_bdy(ib_bdy)%nbj(ib,igrd) 1333 1285 flagv => idx_bdy(ib_bdy)%flagv(ib,igrd) 1334 bdysurftot = bdysurftot + hv 1286 bdysurftot = bdysurftot + hv_n (nbi, nbj ) & 1335 1287 & * e1v (nbi, nbj ) * ABS( flagv ) & 1336 1288 & * tmask_i(nbi, nbj ) & 1337 1289 & * tmask_i(nbi, nbj+1) 1338 END DO1339 END DO1290 END DO 1291 END DO 1340 1292 ! 1341 1293 IF( lk_mpp ) CALL mpp_sum( bdysurftot ) ! sum over the global domain … … 1344 1296 ! Tidy up 1345 1297 !-------- 1346 IF (nb_bdy>0) THEN 1347 DEALLOCATE(nbidta, nbjdta, nbrdta) 1348 ENDIF 1349 1350 CALL wrk_dealloc(jpi,jpj,zfmask) 1351 1352 IF( nn_timing == 1 ) CALL timing_stop('bdy_init') 1353 1298 IF( nb_bdy>0 ) DEALLOCATE( nbidta, nbjdta, nbrdta ) 1299 ! 1300 CALL wrk_dealloc(jpi,jpj, zfmask ) 1301 ! 1302 IF( nn_timing == 1 ) CALL timing_stop('bdy_init') 1303 ! 1354 1304 END SUBROUTINE bdy_init 1305 1355 1306 1356 1307 SUBROUTINE bdy_ctl_seg … … 1743 1694 itest = 0 1744 1695 1745 IF (cn_dyn2d(ib1)/=cn_dyn2d(ib2))itest = itest + 11746 IF (cn_dyn3d(ib1)/=cn_dyn3d(ib2))itest = itest + 11747 IF (cn_tra(ib1)/=cn_tra(ib2))itest = itest + 11748 ! 1749 IF (nn_dyn2d_dta(ib1)/=nn_dyn2d_dta(ib2))itest = itest + 11750 IF (nn_dyn3d_dta(ib1)/=nn_dyn3d_dta(ib2))itest = itest + 11751 IF (nn_tra_dta(ib1)/=nn_tra_dta(ib2))itest = itest + 11752 ! 1753 IF (nn_rimwidth(ib1)/=nn_rimwidth(ib2))itest = itest + 11754 ! 1755 IF 1696 IF( cn_dyn2d(ib1) /= cn_dyn2d(ib2) ) itest = itest + 1 1697 IF( cn_dyn3d(ib1) /= cn_dyn3d(ib2) ) itest = itest + 1 1698 IF( cn_tra (ib1) /= cn_tra (ib2) ) itest = itest + 1 1699 ! 1700 IF( nn_dyn2d_dta(ib1) /= nn_dyn2d_dta(ib2) ) itest = itest + 1 1701 IF( nn_dyn3d_dta(ib1) /= nn_dyn3d_dta(ib2) ) itest = itest + 1 1702 IF( nn_tra_dta (ib1) /= nn_tra_dta (ib2) ) itest = itest + 1 1703 ! 1704 IF( nn_rimwidth(ib1) /= nn_rimwidth(ib2) ) itest = itest + 1 1705 ! 1706 IF( itest>0 ) THEN 1756 1707 IF(lwp) WRITE(numout,*) ' E R R O R : Segments ', ib1, 'and ', ib2 1757 1708 IF(lwp) WRITE(numout,*) ' ========== have different open bdy schemes' -
branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/BDY/bdylib.F90
r5215 r7351 4 4 !! Unstructured Open Boundary Cond. : Library module of generic boundary algorithms. 5 5 !!====================================================================== 6 !! History : 3.6 ! 2013 (D. Storkey) new module6 !! History : 3.6 ! 2013 (D. Storkey) original code 7 7 !!---------------------------------------------------------------------- 8 8 #if defined key_bdy … … 13 13 !! bdy_orlanski_3d 14 14 !!---------------------------------------------------------------------- 15 USE timing ! Timing 16 USE oce ! ocean dynamics and tracers 17 USE dom_oce ! ocean space and time domain 18 USE bdy_oce ! ocean open boundary conditions 19 USE phycst ! physical constants 20 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 21 USE in_out_manager ! 15 USE oce ! ocean dynamics and tracers 16 USE dom_oce ! ocean space and time domain 17 USE bdy_oce ! ocean open boundary conditions 18 USE phycst ! physical constants 19 ! 20 USE in_out_manager ! 21 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 22 USE timing ! Timing 22 23 23 24 IMPLICIT NONE … … 45 46 !! References: Marchesiello, McWilliams and Shchepetkin, Ocean Modelling vol. 3 (2001) 46 47 !!---------------------------------------------------------------------- 47 TYPE(OBC_INDEX), INTENT(in):: idx ! BDY indices48 INTEGER , INTENT(in):: igrd ! grid index49 REAL(wp), DIMENSION(:,:), INTENT(in):: phib ! model before 2D field50 REAL(wp), DIMENSION(:,:), INTENT(inout):: phia ! model after 2D field (to be updated)51 REAL(wp), DIMENSION(:) , INTENT(in):: phi_ext ! external forcing data52 LOGICAL , INTENT(in):: ll_npo ! switch for NPO version53 48 TYPE(OBC_INDEX), INTENT(in ) :: idx ! BDY indices 49 INTEGER , INTENT(in ) :: igrd ! grid index 50 REAL(wp), DIMENSION(:,:), INTENT(in ) :: phib ! model before 2D field 51 REAL(wp), DIMENSION(:,:), INTENT(inout) :: phia ! model after 2D field (to be updated) 52 REAL(wp), DIMENSION(:) , INTENT(in ) :: phi_ext ! external forcing data 53 LOGICAL , INTENT(in ) :: ll_npo ! switch for NPO version 54 ! 54 55 INTEGER :: jb ! dummy loop indices 55 56 INTEGER :: ii, ij, iibm1, iibm2, ijbm1, ijbm2 ! 2D addresses … … 70 71 REAL(wp), POINTER, DIMENSION(:,:) :: pe_ydif ! scale factors for y-derivatives 71 72 !!---------------------------------------------------------------------- 72 73 IF( nn_timing == 1 ) CALL timing_start('bdy_orlanski_2d')74 73 ! 74 IF( nn_timing == 1 ) CALL timing_start('bdy_orlanski_2d') 75 ! 75 76 ! ----------------------------------! 76 77 ! Orlanski boundary conditions :! … … 79 80 SELECT CASE(igrd) 80 81 CASE(1) 81 pmask => tmask(:,:,1)82 pmask => tmask(:,:,1) 82 83 pmask_xdif => umask(:,:,1) 83 84 pmask_ydif => vmask(:,:,1) 84 pe_xdif => e1u(:,:)85 pe_ydif => e2v(:,:)85 pe_xdif => e1u(:,:) 86 pe_ydif => e2v(:,:) 86 87 ii_offset = 0 87 88 ij_offset = 0 88 89 CASE(2) 89 pmask => umask(:,:,1)90 pmask => umask(:,:,1) 90 91 pmask_xdif => tmask(:,:,1) 91 92 pmask_ydif => fmask(:,:,1) 92 pe_xdif => e1t(:,:)93 pe_ydif => e2f(:,:)93 pe_xdif => e1t(:,:) 94 pe_ydif => e2f(:,:) 94 95 ii_offset = 1 95 96 ij_offset = 0 96 97 CASE(3) 97 pmask => vmask(:,:,1)98 pmask => vmask(:,:,1) 98 99 pmask_xdif => fmask(:,:,1) 99 100 pmask_ydif => tmask(:,:,1) 100 pe_xdif => e1f(:,:)101 pe_ydif => e2t(:,:)101 pe_xdif => e1f(:,:) 102 pe_ydif => e2t(:,:) 102 103 ii_offset = 0 103 104 ij_offset = 1 … … 188 189 END DO 189 190 ! 190 IF( nn_timing == 1 ) CALL timing_stop('bdy_orlanski_2d')191 191 IF( nn_timing == 1 ) CALL timing_stop('bdy_orlanski_2d') 192 ! 192 193 END SUBROUTINE bdy_orlanski_2d 193 194 … … 204 205 !! References: Marchesiello, McWilliams and Shchepetkin, Ocean Modelling vol. 3 (2001) 205 206 !!---------------------------------------------------------------------- 206 TYPE(OBC_INDEX), INTENT(in ):: idx ! BDY indices207 INTEGER , INTENT(in):: igrd ! grid index208 REAL(wp), DIMENSION(:,:,:), INTENT(in ):: phib ! model before 3D field209 REAL(wp), DIMENSION(:,:,:), INTENT(inout) 210 REAL(wp), DIMENSION(:,:) , INTENT(in):: phi_ext ! external forcing data211 LOGICAL , INTENT(in):: ll_npo ! switch for NPO version212 207 TYPE(OBC_INDEX), INTENT(in ) :: idx ! BDY indices 208 INTEGER , INTENT(in ) :: igrd ! grid index 209 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: phib ! model before 3D field 210 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: phia ! model after 3D field (to be updated) 211 REAL(wp), DIMENSION(:,:) , INTENT(in ) :: phi_ext ! external forcing data 212 LOGICAL , INTENT(in ) :: ll_npo ! switch for NPO version 213 ! 213 214 INTEGER :: jb, jk ! dummy loop indices 214 215 INTEGER :: ii, ij, iibm1, iibm2, ijbm1, ijbm2 ! 2D addresses … … 229 230 REAL(wp), POINTER, DIMENSION(:,:) :: pe_ydif ! scale factors for y-derivatives 230 231 !!---------------------------------------------------------------------- 231 232 IF( nn_timing == 1 ) CALL timing_start('bdy_orlanski_3d')233 232 ! 233 IF( nn_timing == 1 ) CALL timing_start('bdy_orlanski_3d') 234 ! 234 235 ! ----------------------------------! 235 236 ! Orlanski boundary conditions :! 236 237 ! ----------------------------------! 237 238 ! 238 239 SELECT CASE(igrd) 239 240 CASE(1) 240 pmask => tmask(:,:,:)241 pmask => tmask(:,:,:) 241 242 pmask_xdif => umask(:,:,:) 242 243 pmask_ydif => vmask(:,:,:) 243 pe_xdif => e1u(:,:)244 pe_ydif => e2v(:,:)244 pe_xdif => e1u(:,:) 245 pe_ydif => e2v(:,:) 245 246 ii_offset = 0 246 247 ij_offset = 0 247 248 CASE(2) 248 pmask => umask(:,:,:)249 pmask => umask(:,:,:) 249 250 pmask_xdif => tmask(:,:,:) 250 251 pmask_ydif => fmask(:,:,:) 251 pe_xdif => e1t(:,:)252 pe_ydif => e2f(:,:)252 pe_xdif => e1t(:,:) 253 pe_ydif => e2f(:,:) 253 254 ii_offset = 1 254 255 ij_offset = 0 255 256 CASE(3) 256 pmask => vmask(:,:,:)257 pmask => vmask(:,:,:) 257 258 pmask_xdif => fmask(:,:,:) 258 259 pmask_ydif => tmask(:,:,:) 259 pe_xdif => e1f(:,:)260 pe_ydif => e2t(:,:)260 pe_xdif => e1f(:,:) 261 pe_ydif => e2t(:,:) 261 262 ii_offset = 0 262 263 ij_offset = 1 … … 349 350 ! 350 351 END DO 351 352 IF( nn_timing == 1 ) CALL timing_stop('bdy_orlanski_3d')353 352 ! 353 IF( nn_timing == 1 ) CALL timing_stop('bdy_orlanski_3d') 354 ! 354 355 END SUBROUTINE bdy_orlanski_3d 355 356 -
branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/BDY/bdytides.F90
r5930 r7351 15 15 !! 'key_bdy' Open Boundary Condition 16 16 !!---------------------------------------------------------------------- 17 !! PUBLIC 18 !! bdytide_init : read of namelist and initialisation of tidal harmonics data 19 !! tide_update : calculation of tidal forcing at each timestep 20 !!---------------------------------------------------------------------- 21 USE timing ! Timing 22 USE oce ! ocean dynamics and tracers 23 USE dom_oce ! ocean space and time domain 24 USE iom 25 USE in_out_manager ! I/O units 26 USE phycst ! physical constants 27 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 28 USE bdy_par ! Unstructured boundary parameters 29 USE bdy_oce ! ocean open boundary conditions 30 USE daymod ! calendar 31 USE wrk_nemo ! Memory allocation 32 USE tideini 33 ! USE tide_mod ! Useless ?? 34 USE fldread 17 !! bdytide_init : read of namelist and initialisation of tidal harmonics data 18 !! tide_update : calculation of tidal forcing at each timestep 19 !!---------------------------------------------------------------------- 20 USE oce ! ocean dynamics and tracers 21 USE dom_oce ! ocean space and time domain 22 USE phycst ! physical constants 23 USE bdy_par ! Unstructured boundary parameters 24 USE bdy_oce ! ocean open boundary conditions 25 USE tideini ! 26 USE daymod ! calendar 27 ! 28 USE in_out_manager ! I/O units 29 USE iom ! xIO server 30 USE fldread ! 31 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 32 USE wrk_nemo ! Memory allocation 33 USE timing ! timing 35 34 36 35 IMPLICIT NONE … … 42 41 43 42 TYPE, PUBLIC :: TIDES_DATA !: Storage for external tidal harmonics data 44 REAL(wp), POINTER, DIMENSION(:,:,:) :: ssh0 !: Tidal constituents : SSH0 (read in file) 45 REAL(wp), POINTER, DIMENSION(:,:,:) :: u0 !: Tidal constituents : U0 (read in file) 46 REAL(wp), POINTER, DIMENSION(:,:,:) :: v0 !: Tidal constituents : V0 (read in file) 47 REAL(wp), POINTER, DIMENSION(:,:,:) :: ssh !: Tidal constituents : SSH (after nodal cor.) 48 REAL(wp), POINTER, DIMENSION(:,:,:) :: u !: Tidal constituents : U (after nodal cor.) 49 REAL(wp), POINTER, DIMENSION(:,:,:) :: v !: Tidal constituents : V (after nodal cor.) 43 REAL(wp), POINTER, DIMENSION(:,:,:) :: ssh0 !: Tidal constituents : SSH0 (read in file) 44 REAL(wp), POINTER, DIMENSION(:,:,:) :: u0, v0 !: Tidal constituents : U0, V0 (read in file) 45 REAL(wp), POINTER, DIMENSION(:,:,:) :: ssh !: Tidal constituents : SSH (after nodal cor.) 46 REAL(wp), POINTER, DIMENSION(:,:,:) :: u , v !: Tidal constituents : U , V (after nodal cor.) 50 47 END TYPE TIDES_DATA 51 48 … … 57 54 !!---------------------------------------------------------------------- 58 55 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 59 !! $Id$ 56 !! $Id$ 60 57 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 61 58 !!---------------------------------------------------------------------- … … 91 88 NAMELIST/nambdy_tide/filtide, ln_bdytide_2ddta, ln_bdytide_conj 92 89 !!---------------------------------------------------------------------- 93 94 IF( nn_timing == 1 ) CALL timing_start('bdytide_init')95 90 ! 91 IF( nn_timing == 1 ) CALL timing_start('bdytide_init') 92 ! 96 93 IF (nb_bdy>0) THEN 97 94 IF(lwp) WRITE(numout,*) … … 263 260 ENDIF ! ln_bdytide_2ddta=.true. 264 261 ! 265 IF ( ln_bdytide_conj ) THEN! assume complex conjugate in data files262 IF( ln_bdytide_conj ) THEN ! assume complex conjugate in data files 266 263 td%ssh0(:,:,2) = - td%ssh0(:,:,2) 267 264 td%u0 (:,:,2) = - td%u0 (:,:,2) … … 274 271 ALLOCATE( dta_bdy_s(ib_bdy)%u2d ( ilen0(2) ) ) 275 272 ALLOCATE( dta_bdy_s(ib_bdy)%v2d ( ilen0(3) ) ) 276 dta_bdy_s(ib_bdy)%ssh(:) = 0. e0277 dta_bdy_s(ib_bdy)%u2d(:) = 0. e0278 dta_bdy_s(ib_bdy)%v2d(:) = 0. e0273 dta_bdy_s(ib_bdy)%ssh(:) = 0._wp 274 dta_bdy_s(ib_bdy)%u2d(:) = 0._wp 275 dta_bdy_s(ib_bdy)%v2d(:) = 0._wp 279 276 ! 280 277 ENDIF ! nn_dyn2d_dta(ib_bdy) .ge. 2 281 278 ! 282 279 END DO ! loop on ib_bdy 283 284 IF( nn_timing == 1 ) CALL timing_stop('bdytide_init')285 280 ! 281 IF( nn_timing == 1 ) CALL timing_stop('bdytide_init') 282 ! 286 283 END SUBROUTINE bdytide_init 287 284 288 SUBROUTINE bdytide_update ( kt, idx, dta, td, jit, time_offset ) 285 286 SUBROUTINE bdytide_update( kt, idx, dta, td, jit, time_offset ) 289 287 !!---------------------------------------------------------------------- 290 288 !! *** SUBROUTINE bdytide_update *** … … 293 291 !! 294 292 !!---------------------------------------------------------------------- 295 INTEGER , INTENT( in ):: kt ! Main timestep counter296 TYPE(OBC_INDEX) , INTENT( in ):: idx ! OBC indices297 TYPE(OBC_DATA) , INTENT(inout):: dta ! OBC external data298 TYPE(TIDES_DATA) ,INTENT( inout) :: td ! tidal harmonics data299 INTEGER, INTENT(in),OPTIONAL:: jit ! Barotropic timestep counter (for timesplitting option)300 INTEGER, INTENT( in ), OPTIONAL:: time_offset ! time offset in units of timesteps. NB. if jit301 302 303 304 305 306 ! !307 INTEGER , DIMENSION(3) :: ilen0 !: length of boundary data (from OBC arrays)308 INTEGER :: itide, igrd, ib ! dummy loop indices309 INTEGER :: time_add ! time offset in units of timesteps310 REAL(wp) :: z_arg, z_sarg, zflag, zramp293 INTEGER , INTENT(in ) :: kt ! Main timestep counter 294 TYPE(OBC_INDEX) , INTENT(in ) :: idx ! OBC indices 295 TYPE(OBC_DATA) , INTENT(inout) :: dta ! OBC external data 296 TYPE(TIDES_DATA) , INTENT(inout) :: td ! tidal harmonics data 297 INTEGER, OPTIONAL, INTENT(in ) :: jit ! Barotropic timestep counter (for timesplitting option) 298 INTEGER, OPTIONAL, INTENT(in ) :: time_offset ! time offset in units of timesteps. NB. if jit 299 ! ! is present then units = subcycle timesteps. 300 ! ! time_offset = 0 => get data at "now" time level 301 ! ! time_offset = -1 => get data at "before" time level 302 ! ! time_offset = +1 => get data at "after" time level 303 ! ! etc. 304 ! 305 INTEGER :: itide, igrd, ib ! dummy loop indices 306 INTEGER :: time_add ! time offset in units of timesteps 307 INTEGER, DIMENSION(3) :: ilen0 ! length of boundary data (from OBC arrays) 308 REAL(wp) :: z_arg, z_sarg, zflag, zramp ! local scalars 311 309 REAL(wp), DIMENSION(jpmax_harmo) :: z_sist, z_cost 312 310 !!---------------------------------------------------------------------- 313 314 IF( nn_timing == 1 ) CALL timing_start('bdytide_update')315 311 ! 312 IF( nn_timing == 1 ) CALL timing_start('bdytide_update') 313 ! 316 314 ilen0(1) = SIZE(td%ssh(:,1,1)) 317 315 ilen0(2) = SIZE(td%u(:,1,1)) … … 323 321 ENDIF 324 322 325 IF ( nsec_day == NINT(0.5_wp * rdttra(1)) .AND. zflag==1 ) THEN323 IF ( (nsec_day == NINT(0.5_wp * rdt) .OR. kt==nit000) .AND. zflag==1 ) THEN 326 324 ! 327 kt_tide = kt 325 kt_tide = kt - (nsec_day - 0.5_wp * rdt)/rdt 328 326 ! 329 327 IF(lwp) THEN … … 374 372 END DO 375 373 ! 376 IF( nn_timing == 1 ) CALL timing_stop('bdytide_update')374 IF( nn_timing == 1 ) CALL timing_stop('bdytide_update') 377 375 ! 378 376 END SUBROUTINE bdytide_update … … 385 383 !! 386 384 !!---------------------------------------------------------------------- 387 INTEGER, INTENT( in ):: kt ! Main timestep counter388 INTEGER, INTENT( in ),OPTIONAL:: kit ! Barotropic timestep counter (for timesplitting option)389 INTEGER, INTENT( in ),OPTIONAL:: time_offset ! time offset in units of timesteps. NB. if kit390 391 392 393 394 395 ! !396 LOGICAL :: lk_first_btstp! =.TRUE. if time splitting and first barotropic step397 INTEGER , DIMENSION(jpbgrd) :: ilen0398 INTEGER , DIMENSION(1:jpbgrd) :: nblen, nblenrim ! short cuts399 INTEGER :: itide, ib_bdy, ib, igrd ! loop indices400 INTEGER :: time_add ! time offset in units of timesteps401 REAL(wp) :: z_arg, z_sarg, zramp, zoff, z_cost, z_sist402 !!---------------------------------------------------------------------- 403 404 IF( nn_timing == 1 ) CALL timing_start('bdy_dta_tides')405 385 INTEGER, INTENT(in) :: kt ! Main timestep counter 386 INTEGER, OPTIONAL, INTENT(in) :: kit ! Barotropic timestep counter (for timesplitting option) 387 INTEGER, OPTIONAL, INTENT(in) :: time_offset ! time offset in units of timesteps. NB. if kit 388 ! ! is present then units = subcycle timesteps. 389 ! ! time_offset = 0 => get data at "now" time level 390 ! ! time_offset = -1 => get data at "before" time level 391 ! ! time_offset = +1 => get data at "after" time level 392 ! ! etc. 393 ! 394 LOGICAL :: lk_first_btstp ! =.TRUE. if time splitting and first barotropic step 395 INTEGER :: itide, ib_bdy, ib, igrd ! loop indices 396 INTEGER :: time_add ! time offset in units of timesteps 397 INTEGER, DIMENSION(jpbgrd) :: ilen0 398 INTEGER, DIMENSION(1:jpbgrd) :: nblen, nblenrim ! short cuts 399 REAL(wp) :: z_arg, z_sarg, zramp, zoff, z_cost, z_sist 400 !!---------------------------------------------------------------------- 401 ! 402 IF( nn_timing == 1 ) CALL timing_start('bdy_dta_tides') 403 ! 406 404 lk_first_btstp=.TRUE. 407 405 IF ( PRESENT(kit).AND.( kit /= 1 ) ) THEN ; lk_first_btstp=.FALSE. ; ENDIF … … 438 436 ! We refresh nodal factors every day below 439 437 ! This should be done somewhere else 440 IF ( nsec_day == NINT(0.5_wp * rdttra(1)) .AND. lk_first_btstp ) THEN441 ! 442 kt_tide = kt 438 IF ( ( nsec_day == NINT(0.5_wp * rdt) .OR. kt==nit000 ) .AND. lk_first_btstp ) THEN 439 ! 440 kt_tide = kt - (nsec_day - 0.5_wp * rdt)/rdt 443 441 ! 444 442 IF(lwp) THEN … … 502 500 END SUBROUTINE bdy_dta_tides 503 501 502 504 503 SUBROUTINE tide_init_elevation( idx, td ) 505 504 !!---------------------------------------------------------------------- 506 505 !! *** ROUTINE tide_init_elevation *** 507 506 !!---------------------------------------------------------------------- 508 TYPE(OBC_INDEX), INTENT( in ) :: idx ! OBC indices 509 TYPE(TIDES_DATA),INTENT( inout ) :: td ! tidal harmonics data 510 !! * Local declarations 511 INTEGER, DIMENSION(1) :: ilen0 !: length of boundary data (from OBC arrays) 507 TYPE(OBC_INDEX) , INTENT(in ) :: idx ! OBC indices 508 TYPE(TIDES_DATA), INTENT(inout) :: td ! tidal harmonics data 509 ! 510 INTEGER :: itide, igrd, ib ! dummy loop indices 511 INTEGER, DIMENSION(1) :: ilen0 ! length of boundary data (from OBC arrays) 512 512 REAL(wp),ALLOCATABLE, DIMENSION(:) :: mod_tide, phi_tide 513 INTEGER :: itide, igrd, ib ! dummy loop indices514 513 !!---------------------------------------------------------------------- 514 ! 515 515 igrd=1 516 516 ! SSH on tracer grid. 517 518 517 ilen0(1) = SIZE(td%ssh0(:,1,1)) 519 520 ALLOCATE( mod_tide(ilen0(igrd)),phi_tide(ilen0(igrd)))521 518 ! 519 ALLOCATE( mod_tide(ilen0(igrd)), phi_tide(ilen0(igrd)) ) 520 ! 522 521 DO itide = 1, nb_harmo 523 522 DO ib = 1, ilen0(igrd) … … 534 533 ENDDO 535 534 END DO 536 537 DEALLOCATE( mod_tide,phi_tide)538 535 ! 536 DEALLOCATE( mod_tide, phi_tide ) 537 ! 539 538 END SUBROUTINE tide_init_elevation 540 539 540 541 541 SUBROUTINE tide_init_velocities( idx, td ) 542 542 !!---------------------------------------------------------------------- 543 543 !! *** ROUTINE tide_init_elevation *** 544 544 !!---------------------------------------------------------------------- 545 TYPE(OBC_INDEX), INTENT( in ) :: idx ! OBC indices 546 TYPE(TIDES_DATA),INTENT( inout ) :: td ! tidal harmonics data 547 !! * Local declarations 548 INTEGER, DIMENSION(3) :: ilen0 !: length of boundary data (from OBC arrays) 545 TYPE(OBC_INDEX) , INTENT(in ) :: idx ! OBC indices 546 TYPE(TIDES_DATA), INTENT(inout) :: td ! tidal harmonics data 547 ! 548 INTEGER :: itide, igrd, ib ! dummy loop indices 549 INTEGER, DIMENSION(3) :: ilen0 ! length of boundary data (from OBC arrays) 549 550 REAL(wp),ALLOCATABLE, DIMENSION(:) :: mod_tide, phi_tide 550 INTEGER :: itide, igrd, ib ! dummy loop indices551 551 !!---------------------------------------------------------------------- 552 ! 552 553 ilen0(2) = SIZE(td%u0(:,1,1)) 553 554 ilen0(3) = SIZE(td%v0(:,1,1)) 554 555 ! 555 556 igrd=2 ! U grid. 556 557 ALLOCATE( mod_tide(ilen0(igrd)),phi_tide(ilen0(igrd)))558 557 ! 558 ALLOCATE( mod_tide(ilen0(igrd)) , phi_tide(ilen0(igrd)) ) 559 ! 559 560 DO itide = 1, nb_harmo 560 561 DO ib = 1, ilen0(igrd) … … 571 572 ENDDO 572 573 END DO 573 574 DEALLOCATE( mod_tide,phi_tide)575 574 ! 575 DEALLOCATE( mod_tide , phi_tide ) 576 ! 576 577 igrd=3 ! V grid. 577 578 ALLOCATE( mod_tide(ilen0(igrd)),phi_tide(ilen0(igrd)))578 ! 579 ALLOCATE( mod_tide(ilen0(igrd)) , phi_tide(ilen0(igrd)) ) 579 580 580 581 DO itide = 1, nb_harmo … … 592 593 ENDDO 593 594 END DO 594 595 DEALLOCATE( mod_tide,phi_tide)596 595 ! 596 DEALLOCATE( mod_tide, phi_tide ) 597 ! 597 598 END SUBROUTINE tide_init_velocities 599 598 600 #else 599 601 !!---------------------------------------------------------------------- -
branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/BDY/bdytra.F90
r4292 r7351 16 16 !! bdy_tra_frs : Apply Flow Relaxation Scheme 17 17 !!---------------------------------------------------------------------- 18 USE timing ! Timing19 USE oce ! ocean dynamics and tracers variables20 USE dom_oce ! ocean space and time domain variables21 USE bdy _oce ! ocean open boundary conditions22 USE bdy lib ! for orlanski library routines23 USE bdydta, ONLY: bf24 USE lbclnk ! ocean lateral boundary conditions (or mpp link)25 USE in_out_manager ! I/O manager26 18 USE oce ! ocean dynamics and tracers variables 19 USE dom_oce ! ocean space and time domain variables 20 USE bdy_oce ! ocean open boundary conditions 21 USE bdylib ! for orlanski library routines 22 USE bdydta , ONLY: bf ! 23 ! 24 USE in_out_manager ! I/O manager 25 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 26 USE timing ! Timing 27 27 28 28 IMPLICIT NONE 29 29 PRIVATE 30 30 31 PUBLIC bdy_tra ! routinecalled in tranxt.F9032 PUBLIC bdy_tra_dmp ! routinecalled in step.F9031 PUBLIC bdy_tra ! called in tranxt.F90 32 PUBLIC bdy_tra_dmp ! called in step.F90 33 33 34 34 !!---------------------------------------------------------------------- … … 46 46 !! 47 47 !!---------------------------------------------------------------------- 48 INTEGER, INTENT( in ) :: kt ! Main time step counter 49 !! 50 INTEGER :: ib_bdy ! Loop index 48 INTEGER, INTENT(in) :: kt ! Main time step counter 49 ! 50 INTEGER :: ib_bdy ! Loop index 51 !!---------------------------------------------------------------------- 51 52 52 53 DO ib_bdy=1, nb_bdy 53 54 ! 54 55 SELECT CASE( cn_tra(ib_bdy) ) 55 CASE('none') 56 CYCLE 57 CASE('frs') 58 CALL bdy_tra_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 59 CASE('specified') 60 CALL bdy_tra_spe( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 61 CASE('neumann') 62 CALL bdy_tra_nmn( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 63 CASE('orlanski') 64 CALL bdy_tra_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ll_npo=.false. ) 65 CASE('orlanski_npo') 66 CALL bdy_tra_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ll_npo=.true. ) 67 CASE('runoff') 68 CALL bdy_tra_rnf( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 69 CASE DEFAULT 70 CALL ctl_stop( 'bdy_tra : unrecognised option for open boundaries for T and S' ) 56 CASE('none' ) ; CYCLE 57 CASE('frs' ) ; CALL bdy_tra_frs ( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 58 CASE('specified' ) ; CALL bdy_tra_spe ( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 59 CASE('neumann' ) ; CALL bdy_tra_nmn ( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 60 CASE('orlanski' ) ; CALL bdy_tra_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ll_npo=.false. ) 61 CASE('orlanski_npo') ; CALL bdy_tra_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ll_npo=.true. ) 62 CASE('runoff' ) ; CALL bdy_tra_rnf ( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 63 CASE DEFAULT ; CALL ctl_stop( 'bdy_tra : unrecognised option for open boundaries for T and S' ) 71 64 END SELECT 72 65 ! Boundary points should be updated 73 66 CALL lbc_bdy_lnk( tsa(:,:,:,jp_tem), 'T', 1., ib_bdy ) 74 67 CALL lbc_bdy_lnk( tsa(:,:,:,jp_sal), 'T', 1., ib_bdy ) 75 ENDDO 76 ! 77 68 END DO 69 ! 78 70 END SUBROUTINE bdy_tra 79 71 72 80 73 SUBROUTINE bdy_tra_frs( idx, dta, kt ) 81 74 !!---------------------------------------------------------------------- … … 86 79 !! Reference : Engedahl H., 1995, Tellus, 365-382. 87 80 !!---------------------------------------------------------------------- 88 INTEGER, INTENT(in) :: kt 89 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices90 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data91 ! !81 INTEGER, INTENT(in) :: kt ! 82 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 83 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 84 ! 92 85 REAL(wp) :: zwgt ! boundary weight 93 86 INTEGER :: ib, ik, igrd ! dummy loop indices … … 95 88 !!---------------------------------------------------------------------- 96 89 ! 97 IF( nn_timing == 1 ) CALL timing_start('bdy_tra_frs')90 IF( nn_timing == 1 ) CALL timing_start('bdy_tra_frs') 98 91 ! 99 92 igrd = 1 ! Everything is at T-points here … … 108 101 END DO 109 102 ! 110 IF( kt .eq. nit000 ) CLOSE( unit = 102 )111 ! 112 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_frs')103 IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 104 ! 105 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_frs') 113 106 ! 114 107 END SUBROUTINE bdy_tra_frs 115 108 109 116 110 SUBROUTINE bdy_tra_spe( idx, dta, kt ) 117 111 !!---------------------------------------------------------------------- … … 121 115 !! 122 116 !!---------------------------------------------------------------------- 123 INTEGER, INTENT(in) :: kt 124 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices125 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data126 ! !117 INTEGER, INTENT(in) :: kt ! 118 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 119 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 120 ! 127 121 REAL(wp) :: zwgt ! boundary weight 128 122 INTEGER :: ib, ik, igrd ! dummy loop indices … … 142 136 END DO 143 137 ! 144 IF( kt .eq. nit000 )CLOSE( unit = 102 )145 ! 146 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_spe')138 IF( kt == nit000 ) CLOSE( unit = 102 ) 139 ! 140 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_spe') 147 141 ! 148 142 END SUBROUTINE bdy_tra_spe 149 143 144 150 145 SUBROUTINE bdy_tra_nmn( idx, dta, kt ) 151 146 !!---------------------------------------------------------------------- … … 155 150 !! 156 151 !!---------------------------------------------------------------------- 157 INTEGER, INTENT(in) :: kt 158 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices159 TYPE(OBC_DATA) , INTENT(in) :: dta! OBC external data160 ! !152 INTEGER, INTENT(in) :: kt ! 153 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 154 TYPE(OBC_DATA) , INTENT(in) :: dta ! OBC external data 155 ! 161 156 REAL(wp) :: zwgt ! boundary weight 162 157 INTEGER :: ib, ik, igrd ! dummy loop indices … … 164 159 !!---------------------------------------------------------------------- 165 160 ! 166 IF( nn_timing == 1 ) CALL timing_start('bdy_tra_nmn')161 IF( nn_timing == 1 ) CALL timing_start('bdy_tra_nmn') 167 162 ! 168 163 igrd = 1 ! Everything is at T-points here … … 196 191 END DO 197 192 ! 198 IF( kt .eq. nit000 )CLOSE( unit = 102 )199 ! 200 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_nmn')193 IF( kt == nit000 ) CLOSE( unit = 102 ) 194 ! 195 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_nmn') 201 196 ! 202 197 END SUBROUTINE bdy_tra_nmn … … 213 208 !! References: Marchesiello, McWilliams and Shchepetkin, Ocean Modelling vol. 3 (2001) 214 209 !!---------------------------------------------------------------------- 215 TYPE(OBC_INDEX), INTENT(in) :: idx! OBC indices216 TYPE(OBC_DATA) , INTENT(in) :: dta! OBC external data217 LOGICAL ,INTENT(in) :: ll_npo ! switch for NPO version218 210 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 211 TYPE(OBC_DATA) , INTENT(in) :: dta ! OBC external data 212 LOGICAL , INTENT(in) :: ll_npo ! switch for NPO version 213 ! 219 214 INTEGER :: igrd ! grid index 220 215 !!---------------------------------------------------------------------- 221 216 ! 222 217 IF( nn_timing == 1 ) CALL timing_start('bdy_tra_orlanski') 223 218 ! … … 230 225 CALL bdy_orlanski_3d( idx, igrd, tsb(:,:,:,jp_sal), tsa(:,:,:,jp_sal), dta%sal, ll_npo ) 231 226 ! 232 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_orlanski') 233 ! 234 227 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_orlanski') 228 ! 235 229 END SUBROUTINE bdy_tra_orlanski 236 230 … … 245 239 !! 246 240 !!---------------------------------------------------------------------- 247 INTEGER , INTENT(in) :: kt248 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices249 TYPE(OBC_DATA) , INTENT(in) :: dta! OBC external data250 ! !241 INTEGER , INTENT(in) :: kt ! 242 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 243 TYPE(OBC_DATA) , INTENT(in) :: dta ! OBC external data 244 ! 251 245 REAL(wp) :: zwgt ! boundary weight 252 246 INTEGER :: ib, ik, igrd ! dummy loop indices … … 254 248 !!---------------------------------------------------------------------- 255 249 ! 256 IF( nn_timing == 1 ) CALL timing_start('bdy_tra_rnf')250 IF( nn_timing == 1 ) CALL timing_start('bdy_tra_rnf') 257 251 ! 258 252 igrd = 1 ! Everything is at T-points here … … 268 262 END DO 269 263 ! 270 IF( kt .eq. nit000 )CLOSE( unit = 102 )271 ! 272 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_rnf')264 IF( kt == nit000 ) CLOSE( unit = 102 ) 265 ! 266 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_rnf') 273 267 ! 274 268 END SUBROUTINE bdy_tra_rnf 275 269 270 276 271 SUBROUTINE bdy_tra_dmp( kt ) 277 272 !!---------------------------------------------------------------------- … … 281 276 !! 282 277 !!---------------------------------------------------------------------- 283 INTEGER, INTENT(in) :: kt284 ! !278 INTEGER, INTENT(in) :: kt ! 279 ! 285 280 REAL(wp) :: zwgt ! boundary weight 286 281 REAL(wp) :: zta, zsa, ztime … … 290 285 !!---------------------------------------------------------------------- 291 286 ! 292 IF( nn_timing == 1 ) CALL timing_start('bdy_tra_dmp')293 ! 294 DO ib_bdy =1, nb_bdy295 IF 287 IF( nn_timing == 1 ) CALL timing_start('bdy_tra_dmp') 288 ! 289 DO ib_bdy = 1, nb_bdy 290 IF( ln_tra_dmp(ib_bdy) ) THEN 296 291 igrd = 1 ! Everything is at T-points here 297 292 DO ib = 1, idx_bdy(ib_bdy)%nblen(igrd) … … 307 302 END DO 308 303 ENDIF 309 END DO310 ! 311 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_dmp')304 END DO 305 ! 306 IF( nn_timing == 1 ) CALL timing_stop('bdy_tra_dmp') 312 307 ! 313 308 END SUBROUTINE bdy_tra_dmp … … 325 320 WRITE(*,*) 'bdy_tra_dmp: You should not have seen this print! error?', kt 326 321 END SUBROUTINE bdy_tra_dmp 327 328 322 #endif 329 323 -
branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/BDY/bdyvol.F90
r5930 r7351 10 10 !! 3.4 ! 2011 (D. Storkey) rewrite in preparation for OBC-BDY merge 11 11 !!---------------------------------------------------------------------- 12 #if 12 #if defined key_bdy 13 13 !!---------------------------------------------------------------------- 14 !! 'key_bdy' unstructured open boundary conditions14 !! 'key_bdy' unstructured open boundary conditions 15 15 !!---------------------------------------------------------------------- 16 USE oce 17 USE bdy_oce 18 USE sbc_oce 19 USE dom_oce 20 USE phycst 21 USE sbcisf 16 USE oce ! ocean dynamics and tracers 17 USE bdy_oce ! ocean open boundary conditions 18 USE sbc_oce ! ocean surface boundary conditions 19 USE dom_oce ! ocean space and time domain 20 USE phycst ! physical constants 21 USE sbcisf ! ice shelf 22 22 ! 23 USE in_out_manager 24 USE lib_mpp 25 USE timing 26 USE lib_fortran 23 USE in_out_manager ! I/O manager 24 USE lib_mpp ! for mppsum 25 USE timing ! Timing 26 USE lib_fortran ! Fortran routines library 27 27 28 28 IMPLICIT NONE 29 29 PRIVATE 30 30 31 PUBLIC bdy_vol31 PUBLIC bdy_vol ! called by ??? 32 32 33 !! * Substitutions34 # include "domzgr_substitute.h90"35 33 !!---------------------------------------------------------------------- 36 !! NEMO/OPA 3. 6 , NEMO Consortium (2014)34 !! NEMO/OPA 3.7 , NEMO Consortium (2015) 37 35 !! $Id$ 38 36 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 45 43 !! 46 44 !! ** Purpose : This routine controls the volume of the system. 47 !! A correction velocity is calculated 48 !! t o correct the total transport through the unstructured OBC.45 !! A correction velocity is calculated to correct the total transport 46 !! through the unstructured OBC. 49 47 !! The total depth used is constant (H0) to be consistent with the 50 !! linear free surface coded in OPA 8.2 48 !! linear free surface coded in OPA 8.2 <<<=== !!gm ???? true ???? 51 49 !! 52 50 !! ** Method : The correction velocity (zubtpecor here) is defined calculating … … 72 70 !! (set nn_volctl to 1 in tne namelist for this option) 73 71 !!---------------------------------------------------------------------- 74 INTEGER, INTENT( in) :: kt ! ocean time-step index75 ! !72 INTEGER, INTENT(in) :: kt ! ocean time-step index 73 ! 76 74 INTEGER :: ji, jj, jk, jb, jgrd 77 75 INTEGER :: ib_bdy, ii, ij … … 93 91 ! ----------------------------------------------------------------------- 94 92 !!gm replace these lines : 95 z_cflxemp = SUM ( ( emp(:,:) -rnf(:,:)+fwfisf(:,:) ) * bdytmask(:,:) * e1e2t(:,:) ) / rau093 z_cflxemp = SUM ( ( emp(:,:) - rnf(:,:) + fwfisf(:,:) ) * bdytmask(:,:) * e1e2t(:,:) ) / rau0 96 94 IF( lk_mpp ) CALL mpp_sum( z_cflxemp ) ! sum over the global domain 97 95 !!gm by : … … 110 108 ii = idx%nbi(jb,jgrd) 111 109 ij = idx%nbj(jb,jgrd) 112 zubtpecor = zubtpecor + idx%flagu(jb,jgrd) * ua(ii,ij, jk) * e2u(ii,ij) * fse3u(ii,ij,jk)110 zubtpecor = zubtpecor + idx%flagu(jb,jgrd) * ua(ii,ij, jk) * e2u(ii,ij) * e3u_n(ii,ij,jk) 113 111 END DO 114 112 END DO … … 118 116 ii = idx%nbi(jb,jgrd) 119 117 ij = idx%nbj(jb,jgrd) 120 zubtpecor = zubtpecor + idx%flagv(jb,jgrd) * va(ii,ij, jk) * e1v(ii,ij) * fse3v(ii,ij,jk)118 zubtpecor = zubtpecor + idx%flagv(jb,jgrd) * va(ii,ij, jk) * e1v(ii,ij) * e3v_n(ii,ij,jk) 121 119 END DO 122 120 END DO … … 127 125 ! The normal velocity correction 128 126 ! ------------------------------ 129 IF( nn_volctl==1 ) THEN ; zubtpecor = ( zubtpecor - z_cflxemp ) / bdysurftot130 ELSE ; zubtpecor = zubtpecor / bdysurftot127 IF( nn_volctl==1 ) THEN ; zubtpecor = ( zubtpecor - z_cflxemp ) / bdysurftot 128 ELSE ; zubtpecor = zubtpecor / bdysurftot 131 129 END IF 132 130 … … 143 141 ij = idx%nbj(jb,jgrd) 144 142 ua(ii,ij,jk) = ua(ii,ij,jk) - idx%flagu(jb,jgrd) * zubtpecor * umask(ii,ij,jk) 145 ztranst = ztranst + idx%flagu(jb,jgrd) * ua(ii,ij,jk) * e2u(ii,ij) * fse3u(ii,ij,jk)143 ztranst = ztranst + idx%flagu(jb,jgrd) * ua(ii,ij,jk) * e2u(ii,ij) * e3u_n(ii,ij,jk) 146 144 END DO 147 145 END DO … … 152 150 ij = idx%nbj(jb,jgrd) 153 151 va(ii,ij,jk) = va(ii,ij,jk) -idx%flagv(jb,jgrd) * zubtpecor * vmask(ii,ij,jk) 154 ztranst = ztranst + idx%flagv(jb,jgrd) * va(ii,ij,jk) * e1v(ii,ij) * fse3v(ii,ij,jk)152 ztranst = ztranst + idx%flagv(jb,jgrd) * va(ii,ij,jk) * e1v(ii,ij) * e3v_n(ii,ij,jk) 155 153 END DO 156 154 END DO … … 161 159 ! Check the cumulated transport through unstructured OBC once barotropic velocities corrected 162 160 ! ------------------------------------------------------ 163 IF( lwp .AND. MOD( kt, nwrite ) == 0 ) THEN161 IF( lwp .AND. MOD( kt, nwrite ) == 0 ) THEN 164 162 IF(lwp) WRITE(numout,*) 165 163 IF(lwp) WRITE(numout,*)'bdy_vol : time step :', kt … … 171 169 END IF 172 170 ! 173 IF( nn_timing == 1 ) CALL timing_stop('bdy_vol')171 IF( nn_timing == 1 ) CALL timing_stop('bdy_vol') 174 172 ! 175 173 END IF ! ln_vol
Note: See TracChangeset
for help on using the changeset viewer.