New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 12065 for NEMO/branches/2019/dev_r10742_ENHANCE-12_SimonM-Tides/src/OCE/BDY/bdytides.F90 – NEMO

Ignore:
Timestamp:
2019-12-05T12:06:36+01:00 (4 years ago)
Author:
smueller
Message:

Synchronizing with /NEMO/trunk@12055 (ticket #2194)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r10742_ENHANCE-12_SimonM-Tides/src/OCE/BDY/bdytides.F90

    r12059 r12065  
    7171      INTEGER                                   ::   inum, igrd 
    7272      INTEGER, DIMENSION(3)                     ::   ilen0       !: length of boundary data (from OBC arrays) 
    73       INTEGER, POINTER, DIMENSION(:)            ::   nblen, nblenrim     ! short cuts 
    7473      INTEGER                                   ::   ios                 ! Local integer output status for namelist read 
    7574      CHARACTER(len=80)                         ::   clfile              !: full file name for tidal input file  
     
    7877      !! 
    7978      TYPE(TIDES_DATA),  POINTER                ::   td                  !: local short cut    
    80       TYPE(MAP_POINTER), DIMENSION(jpbgrd)      ::   ibmap_ptr           !: array of pointers to nbmap 
    8179      !! 
    8280      NAMELIST/nambdy_tide/filtide, ln_bdytide_2ddta 
    8381      !!---------------------------------------------------------------------- 
    8482      ! 
    85       IF (nb_bdy>0) THEN 
    86          IF(lwp) WRITE(numout,*) 
    87          IF(lwp) WRITE(numout,*) 'bdytide_init : initialization of tidal harmonic forcing at open boundaries' 
    88          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 
    89       ENDIF 
     83      IF(lwp) WRITE(numout,*) 
     84      IF(lwp) WRITE(numout,*) 'bdytide_init : initialization of tidal harmonic forcing at open boundaries' 
     85      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 
    9086 
    9187      REWIND(numnam_cfg) 
     
    9591            ! 
    9692            td => tides(ib_bdy) 
    97             nblen => idx_bdy(ib_bdy)%nblen 
    98             nblenrim => idx_bdy(ib_bdy)%nblenrim 
    9993 
    10094            ! Namelist nambdy_tide : tidal harmonic forcing at open boundaries 
    10195            filtide(:) = '' 
    10296 
     97            REWIND( numnam_ref ) 
     98            READ  ( numnam_ref, nambdy_tide, IOSTAT = ios, ERR = 901) 
     99901         IF( ios /= 0 )   CALL ctl_nam ( ios , 'nambdy_tide in reference namelist' ) 
    103100            ! Don't REWIND here - may need to read more than one of these namelists.  
    104             READ  ( numnam_ref, nambdy_tide, IOSTAT = ios, ERR = 901) 
    105 901         IF( ios /= 0 )   CALL ctl_nam ( ios , 'nambdy_tide in reference namelist', lwp ) 
    106101            READ  ( numnam_cfg, nambdy_tide, IOSTAT = ios, ERR = 902 ) 
    107 902         IF( ios >  0 )   CALL ctl_nam ( ios , 'nambdy_tide in configuration namelist', lwp ) 
     102902         IF( ios >  0 )   CALL ctl_nam ( ios , 'nambdy_tide in configuration namelist' ) 
    108103            IF(lwm) WRITE ( numond, nambdy_tide ) 
    109104            !                                               ! Parameter control and print 
     
    125120            ! JC: If FRS scheme is used, we assume that tidal is needed over the whole 
    126121            ! relaxation area       
    127             IF( cn_dyn2d(ib_bdy) == 'frs' ) THEN   ;   ilen0(:) = nblen   (:) 
    128             ELSE                                   ;   ilen0(:) = nblenrim(:) 
     122            IF( cn_dyn2d(ib_bdy) == 'frs' ) THEN   ;   ilen0(:) = idx_bdy(ib_bdy)%nblen   (:) 
     123            ELSE                                   ;   ilen0(:) = idx_bdy(ib_bdy)%nblenrim(:) 
    129124            ENDIF 
    130125 
     
    161156                     ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    162157                     ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     158                     IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE   ! to remove? 
    163159                     td%ssh0(ib,itide,1) = ztr(ii,ij) 
    164160                     td%ssh0(ib,itide,2) = zti(ii,ij) 
     
    177173                     ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    178174                     ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     175                     IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE   ! to remove? 
    179176                     td%u0(ib,itide,1) = ztr(ii,ij) 
    180177                     td%u0(ib,itide,2) = zti(ii,ij) 
     
    193190                     ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    194191                     ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
     192                     IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE   ! to remove? 
    195193                     td%v0(ib,itide,1) = ztr(ii,ij) 
    196194                     td%v0(ib,itide,2) = zti(ii,ij) 
     
    207205               ALLOCATE( dta_read( MAXVAL(ilen0(1:3)), 1, 1 ) ) 
    208206               ! 
    209                ! Set map structure 
    210                ibmap_ptr(1)%ptr => idx_bdy(ib_bdy)%nbmap(:,1)   ;   ibmap_ptr(1)%ll_unstruc = ln_coords_file(ib_bdy) 
    211                ibmap_ptr(2)%ptr => idx_bdy(ib_bdy)%nbmap(:,2)   ;   ibmap_ptr(2)%ll_unstruc = ln_coords_file(ib_bdy) 
    212                ibmap_ptr(3)%ptr => idx_bdy(ib_bdy)%nbmap(:,3)   ;   ibmap_ptr(3)%ll_unstruc = ln_coords_file(ib_bdy) 
    213  
    214207               ! Open files and read in tidal forcing data 
    215208               ! ----------------------------------------- 
     
    219212                  clfile = TRIM(filtide)//TRIM(tide_harmonics(itide)%cname_tide)//'_grid_T.nc' 
    220213                  CALL iom_open( clfile, inum ) 
    221                   CALL fld_map( inum, 'z1' , dta_read(1:ilen0(1),1:1,1:1) , 1,  ibmap_ptr(1) ) 
     214                  CALL fld_map( inum, 'z1' , dta_read(1:ilen0(1),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 
    222215                  td%ssh0(:,itide,1) = dta_read(1:ilen0(1),1,1) 
    223                   CALL fld_map( inum, 'z2' , dta_read(1:ilen0(1),1:1,1:1) , 1,  ibmap_ptr(1) ) 
     216                  CALL fld_map( inum, 'z2' , dta_read(1:ilen0(1),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,1) ) 
    224217                  td%ssh0(:,itide,2) = dta_read(1:ilen0(1),1,1) 
    225218                  CALL iom_close( inum ) 
     
    227220                  clfile = TRIM(filtide)//TRIM(tide_harmonics(itide)%cname_tide)//'_grid_U.nc' 
    228221                  CALL iom_open( clfile, inum ) 
    229                   CALL fld_map( inum, 'u1' , dta_read(1:ilen0(2),1:1,1:1) , 1, ibmap_ptr(2) ) 
     222                  CALL fld_map( inum, 'u1' , dta_read(1:ilen0(2),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 
    230223                  td%u0(:,itide,1) = dta_read(1:ilen0(2),1,1) 
    231                   CALL fld_map( inum, 'u2' , dta_read(1:ilen0(2),1:1,1:1) , 1, ibmap_ptr(2) ) 
     224                  CALL fld_map( inum, 'u2' , dta_read(1:ilen0(2),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,2) ) 
    232225                  td%u0(:,itide,2) = dta_read(1:ilen0(2),1,1) 
    233226                  CALL iom_close( inum ) 
     
    235228                  clfile = TRIM(filtide)//TRIM(tide_harmonics(itide)%cname_tide)//'_grid_V.nc' 
    236229                  CALL iom_open( clfile, inum ) 
    237                   CALL fld_map( inum, 'v1' , dta_read(1:ilen0(3),1:1,1:1) , 1, ibmap_ptr(3) ) 
     230                  CALL fld_map( inum, 'v1' , dta_read(1:ilen0(3),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 
    238231                  td%v0(:,itide,1) = dta_read(1:ilen0(3),1,1) 
    239                   CALL fld_map( inum, 'v2' , dta_read(1:ilen0(3),1:1,1:1) , 1, ibmap_ptr(3) ) 
     232                  CALL fld_map( inum, 'v2' , dta_read(1:ilen0(3),1:1,1:1) , 1, idx_bdy(ib_bdy)%nbmap(:,3) ) 
    240233                  td%v0(:,itide,2) = dta_read(1:ilen0(3),1,1) 
    241234                  CALL iom_close( inum ) 
     
    263256 
    264257 
    265    SUBROUTINE bdytide_update( kt, idx, dta, td, jit, time_offset ) 
     258   SUBROUTINE bdytide_update( kt, idx, dta, td, kit, kt_offset ) 
    266259      !!---------------------------------------------------------------------- 
    267260      !!                 ***  SUBROUTINE bdytide_update  *** 
     
    274267      TYPE(OBC_DATA)   , INTENT(inout) ::   dta         ! OBC external data 
    275268      TYPE(TIDES_DATA) , INTENT(inout) ::   td          ! tidal harmonics data 
    276       INTEGER, OPTIONAL, INTENT(in   ) ::   jit         ! Barotropic timestep counter (for timesplitting option) 
    277       INTEGER, OPTIONAL, INTENT(in   ) ::   time_offset ! time offset in units of timesteps. NB. if jit 
     269      INTEGER, OPTIONAL, INTENT(in   ) ::   kit         ! Barotropic timestep counter (for timesplitting option) 
     270      INTEGER, OPTIONAL, INTENT(in   ) ::   kt_offset   ! time offset in units of timesteps. NB. if kit 
    278271      !                                                 ! is present then units = subcycle timesteps. 
    279       !                                                 ! time_offset = 0  => get data at "now"    time level 
    280       !                                                 ! time_offset = -1 => get data at "before" time level 
    281       !                                                 ! time_offset = +1 => get data at "after"  time level 
     272      !                                                 ! kt_offset = 0  => get data at "now"    time level 
     273      !                                                 ! kt_offset = -1 => get data at "before" time level 
     274      !                                                 ! kt_offset = +1 => get data at "after"  time level 
    282275      !                                                 ! etc. 
    283276      ! 
     
    294287 
    295288      zflag=1 
    296       IF ( PRESENT(jit) ) THEN 
    297         IF ( jit /= 1 ) zflag=0 
     289      IF ( PRESENT(kit) ) THEN 
     290        IF ( kit /= 1 ) zflag=0 
    298291      ENDIF 
    299292 
     
    314307 
    315308      time_add = 0 
    316       IF( PRESENT(time_offset) ) THEN 
    317          time_add = time_offset 
     309      IF( PRESENT(kt_offset) ) THEN 
     310         time_add = kt_offset 
    318311      ENDIF 
    319312          
    320       IF( PRESENT(jit) ) THEN   
    321          z_arg = ((kt-kt_tide) * rdt + (jit+0.5_wp*(time_add-1)) * rdt / REAL(nn_baro,wp) ) 
     313      IF( PRESENT(kit) ) THEN   
     314         z_arg = ((kt-kt_tide) * rdt + (kit+0.5_wp*(time_add-1)) * rdt / REAL(nn_baro,wp) ) 
    322315      ELSE                               
    323316         z_arg = ((kt-kt_tide)+time_add) * rdt 
     
    352345 
    353346 
    354    SUBROUTINE bdy_dta_tides( kt, kit, time_offset ) 
     347   SUBROUTINE bdy_dta_tides( kt, kit, kt_offset ) 
    355348      !!---------------------------------------------------------------------- 
    356349      !!                 ***  SUBROUTINE bdy_dta_tides  *** 
     
    361354      INTEGER,           INTENT(in) ::   kt          ! Main timestep counter 
    362355      INTEGER, OPTIONAL, INTENT(in) ::   kit         ! Barotropic timestep counter (for timesplitting option) 
    363       INTEGER, OPTIONAL, INTENT(in) ::   time_offset ! time offset in units of timesteps. NB. if kit 
     356      INTEGER, OPTIONAL, INTENT(in) ::   kt_offset  ! time offset in units of timesteps. NB. if kit 
    364357      !                                              ! is present then units = subcycle timesteps. 
    365       !                                              ! time_offset = 0  => get data at "now"    time level 
    366       !                                              ! time_offset = -1 => get data at "before" time level 
    367       !                                              ! time_offset = +1 => get data at "after"  time level 
     358      !                                              ! kt_offset = 0  => get data at "now"    time level 
     359      !                                              ! kt_offset = -1 => get data at "before" time level 
     360      !                                              ! kt_offset = +1 => get data at "after"  time level 
    368361      !                                              ! etc. 
    369362      ! 
     
    380373 
    381374      time_add = 0 
    382       IF( PRESENT(time_offset) ) THEN 
    383          time_add = time_offset 
     375      IF( PRESENT(kt_offset) ) THEN 
     376         time_add = kt_offset 
    384377      ENDIF 
    385378       
     
    426419            ! If time splitting, initialize arrays from slow varying open boundary data: 
    427420            IF ( PRESENT(kit) ) THEN            
    428                IF ( dta_bdy(ib_bdy)%ll_ssh ) dta_bdy(ib_bdy)%ssh(1:ilen0(1)) = dta_bdy_s(ib_bdy)%ssh(1:ilen0(1)) 
    429                IF ( dta_bdy(ib_bdy)%ll_u2d ) dta_bdy(ib_bdy)%u2d(1:ilen0(2)) = dta_bdy_s(ib_bdy)%u2d(1:ilen0(2)) 
    430                IF ( dta_bdy(ib_bdy)%ll_v2d ) dta_bdy(ib_bdy)%v2d(1:ilen0(3)) = dta_bdy_s(ib_bdy)%v2d(1:ilen0(3)) 
     421               IF ( dta_bdy(ib_bdy)%lneed_ssh  ) dta_bdy(ib_bdy)%ssh(1:ilen0(1)) = dta_bdy_s(ib_bdy)%ssh(1:ilen0(1)) 
     422               IF ( dta_bdy(ib_bdy)%lneed_dyn2d ) dta_bdy(ib_bdy)%u2d(1:ilen0(2)) = dta_bdy_s(ib_bdy)%u2d(1:ilen0(2)) 
     423               IF ( dta_bdy(ib_bdy)%lneed_dyn2d ) dta_bdy(ib_bdy)%v2d(1:ilen0(3)) = dta_bdy_s(ib_bdy)%v2d(1:ilen0(3)) 
    431424            ENDIF 
    432425            ! 
     
    438431               z_sist = zramp * SIN( z_sarg ) 
    439432               ! 
    440                IF ( dta_bdy(ib_bdy)%ll_ssh ) THEN 
     433               IF ( dta_bdy(ib_bdy)%lneed_ssh ) THEN 
    441434                  igrd=1                              ! SSH on tracer grid 
    442435                  DO ib = 1, ilen0(igrd) 
     
    447440               ENDIF 
    448441               ! 
    449                IF ( dta_bdy(ib_bdy)%ll_u2d ) THEN 
     442               IF ( dta_bdy(ib_bdy)%lneed_dyn2d ) THEN 
    450443                  igrd=2                              ! U grid 
    451444                  DO ib = 1, ilen0(igrd) 
     
    454447                        &                        tides(ib_bdy)%u(ib,itide,2)*z_sist ) 
    455448                  END DO 
    456                ENDIF 
    457                ! 
    458                IF ( dta_bdy(ib_bdy)%ll_v2d ) THEN 
    459449                  igrd=3                              ! V grid 
    460450                  DO ib = 1, ilen0(igrd)  
Note: See TracChangeset for help on using the changeset viewer.