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 13077 for NEMO/branches/2020/r4.0-HEAD_ticket2425/src/OCE/BDY/bdydta.F90 – NEMO

Ignore:
Timestamp:
2020-06-09T17:00:38+02:00 (4 years ago)
Author:
davestorkey
Message:

branches/2020/r4.0-HEAD_ticket2425: update to r13076 of r4.0-HEAD

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/r4.0-HEAD_ticket2425/src/OCE/BDY/bdydta.F90

    r12639 r13077  
    9595      INTEGER ::  jbdy, jfld, jstart, jend, ib, jl    ! dummy loop indices 
    9696      INTEGER ::  ii, ij, ik, igrd, ipl               ! local integers 
    97       INTEGER,   DIMENSION(jpbgrd)     ::   ilen1  
    9897      TYPE(OBC_DATA)         , POINTER ::   dta_alias        ! short cut 
    9998      TYPE(FLD), DIMENSION(:), POINTER ::   bf_alias 
     
    120119                  END DO 
    121120               ENDIF 
    122                IF( dta_bdy(jbdy)%lneed_dyn2d .AND. ASSOCIATED(dta_bdy(jbdy)%u2d) ) THEN   ! no SIZE with a unassociated pointer 
     121               IF( ASSOCIATED(dta_bdy(jbdy)%u2d) ) THEN   ! no SIZE with a unassociated pointer. v2d and u2d can differ on subdomain 
    123122                  igrd = 2 
    124                   DO ib = 1, SIZE(dta_bdy(jbdy)%u2d)   ! u2d is used only on the rim except if ln_full_vel = T, see bdy_dta_init 
     123                  DO ib = 1, SIZE(dta_bdy(jbdy)%u2d)      ! u2d is used either over the whole bdy or only on the rim 
    125124                     ii = idx_bdy(jbdy)%nbi(ib,igrd) 
    126125                     ij = idx_bdy(jbdy)%nbj(ib,igrd) 
    127126                     dta_bdy(jbdy)%u2d(ib) = un_b(ii,ij) * umask(ii,ij,1)          
    128127                  END DO 
     128               ENDIF 
     129               IF( ASSOCIATED(dta_bdy(jbdy)%v2d) ) THEN   ! no SIZE with a unassociated pointer. v2d and u2d can differ on subdomain 
    129130                  igrd = 3 
    130                   DO ib = 1, SIZE(dta_bdy(jbdy)%v2d)   ! v2d is used only on the rim except if ln_full_vel = T, see bdy_dta_init 
     131                  DO ib = 1, SIZE(dta_bdy(jbdy)%v2d)      ! v2d is used either over the whole bdy or only on the rim 
    131132                     ii = idx_bdy(jbdy)%nbi(ib,igrd) 
    132133                     ij = idx_bdy(jbdy)%nbj(ib,igrd) 
     
    214215         ! 
    215216         ! if runoff condition: change river flow we read (in m3/s) into barotropic velocity (m/s) 
    216          IF( cn_tra(jbdy) == 'runoff' .AND. TRIM(bf_alias(jp_bdyu2d)%clrootname) /= 'NOT USED' ) THEN   ! runoff and we read u/v2d 
     217         IF( cn_tra(jbdy) == 'runoff' ) THEN   ! runoff 
    217218            ! 
    218             igrd = 2                      ! zonal flow (m3/s) to barotropic zonal velocity (m/s) 
    219             DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
    220                ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
    221                ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    222                dta_alias%u2d(ib) = dta_alias%u2d(ib) / ( e2u(ii,ij) * hu_0(ii,ij) ) 
    223             END DO 
    224             igrd = 3                      ! meridional flow (m3/s) to barotropic meridional velocity (m/s) 
    225             DO ib = 1, idx_bdy(jbdy)%nblen(igrd) 
    226                ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
    227                ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
    228                dta_alias%v2d(ib) = dta_alias%v2d(ib) / ( e1v(ii,ij) * hv_0(ii,ij) ) 
    229             END DO 
     219            IF( ASSOCIATED(dta_bdy(jbdy)%u2d) ) THEN   ! no SIZE with a unassociated pointer. v2d and u2d can differ on subdomain 
     220               igrd = 2                         ! zonal flow (m3/s) to barotropic zonal velocity (m/s) 
     221               DO ib = 1, SIZE(dta_alias%u2d)   ! u2d is used either over the whole bdy or only on the rim 
     222                  ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     223                  ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
     224                  dta_alias%u2d(ib) = dta_alias%u2d(ib) / ( e2u(ii,ij) * hu_0(ii,ij) ) 
     225               END DO 
     226            ENDIF 
     227            IF( ASSOCIATED(dta_bdy(jbdy)%v2d) ) THEN   ! no SIZE with a unassociated pointer. v2d and u2d can differ on subdomain 
     228               igrd = 3                         ! meridional flow (m3/s) to barotropic meridional velocity (m/s) 
     229               DO ib = 1, SIZE(dta_alias%v2d)   ! v2d is used either over the whole bdy or only on the rim 
     230                  ii   = idx_bdy(jbdy)%nbi(ib,igrd) 
     231                  ij   = idx_bdy(jbdy)%nbj(ib,igrd) 
     232                  dta_alias%v2d(ib) = dta_alias%v2d(ib) / ( e1v(ii,ij) * hv_0(ii,ij) ) 
     233               END DO 
     234            ENDIF 
    230235         ENDIF 
    231236 
    232237         ! tidal harmonic forcing ONLY: initialise arrays 
    233238         IF( nn_dyn2d_dta(jbdy) == 2 ) THEN   ! we did not read ssh, u/v2d  
    234             IF( dta_alias%lneed_ssh   .AND. ASSOCIATED(dta_alias%ssh) ) dta_alias%ssh(:) = 0._wp 
    235             IF( dta_alias%lneed_dyn2d .AND. ASSOCIATED(dta_alias%u2d) ) dta_alias%u2d(:) = 0._wp 
    236             IF( dta_alias%lneed_dyn2d .AND. ASSOCIATED(dta_alias%v2d) ) dta_alias%v2d(:) = 0._wp 
     239            IF( ASSOCIATED(dta_alias%ssh) ) dta_alias%ssh(:) = 0._wp 
     240            IF( ASSOCIATED(dta_alias%u2d) ) dta_alias%u2d(:) = 0._wp 
     241            IF( ASSOCIATED(dta_alias%v2d) ) dta_alias%v2d(:) = 0._wp 
    237242         ENDIF 
    238243 
     
    340345            DO jbdy = 1, nb_bdy      ! Tidal component added in ts loop 
    341346               IF ( nn_dyn2d_dta(jbdy) .GE. 2 ) THEN 
    342                   IF( cn_dyn2d(jbdy) == 'frs' ) THEN   ;   ilen1(:)=idx_bdy(jbdy)%nblen(:) 
    343                   ELSE                                 ;   ilen1(:)=idx_bdy(jbdy)%nblenrim(:) 
    344                   ENDIF 
    345                      IF ( dta_bdy(jbdy)%lneed_ssh   ) dta_bdy_s(jbdy)%ssh(1:ilen1(1)) = dta_bdy(jbdy)%ssh(1:ilen1(1)) 
    346                      IF ( dta_bdy(jbdy)%lneed_dyn2d ) dta_bdy_s(jbdy)%u2d(1:ilen1(2)) = dta_bdy(jbdy)%u2d(1:ilen1(2)) 
    347                      IF ( dta_bdy(jbdy)%lneed_dyn2d ) dta_bdy_s(jbdy)%v2d(1:ilen1(3)) = dta_bdy(jbdy)%v2d(1:ilen1(3)) 
    348                   ENDIF 
    349                END DO 
    350             ELSE ! Add tides if not split-explicit free surface else this is done in ts loop 
    351                ! 
    352                CALL bdy_dta_tides( kt=kt, kt_offset=kt_offset ) 
    353             ENDIF 
    354          ENDIF 
    355          ! 
    356          IF( ln_timing )   CALL timing_stop('bdy_dta') 
    357          ! 
    358       END SUBROUTINE bdy_dta 
    359  
     347                  IF( ASSOCIATED(dta_bdy(jbdy)%ssh) ) dta_bdy_s(jbdy)%ssh(:) = dta_bdy(jbdy)%ssh(:) 
     348                  IF( ASSOCIATED(dta_bdy(jbdy)%u2d) ) dta_bdy_s(jbdy)%u2d(:) = dta_bdy(jbdy)%u2d(:) 
     349                  IF( ASSOCIATED(dta_bdy(jbdy)%v2d) ) dta_bdy_s(jbdy)%v2d(:) = dta_bdy(jbdy)%v2d(:) 
     350               ENDIF 
     351            END DO 
     352         ELSE ! Add tides if not split-explicit free surface else this is done in ts loop 
     353            ! 
     354            CALL bdy_dta_tides( kt=kt, kt_offset=kt_offset ) 
     355         ENDIF 
     356      ENDIF 
     357      ! 
     358      IF( ln_timing )   CALL timing_stop('bdy_dta') 
     359      ! 
     360   END SUBROUTINE bdy_dta 
     361    
    360362 
    361363   SUBROUTINE bdy_dta_init 
     
    387389      LOGICAL                                ::   llneed        ! 
    388390      LOGICAL                                ::   llread        ! 
     391      LOGICAL                                ::   llfullbdy     ! 
    389392      TYPE(FLD_N), DIMENSION(1), TARGET  ::   bn_tem, bn_sal, bn_u3d, bn_v3d   ! must be an array to be used with fld_fill 
    390393      TYPE(FLD_N), DIMENSION(1), TARGET  ::   bn_ssh, bn_u2d, bn_v2d           ! informations about the fields to be read 
     
    487490               igrd = 2                                                    ! U point 
    488491               ipk = 1                                                     ! surface data 
    489                llneed = dta_bdy(jbdy)%lneed_dyn2d                          ! dta_bdy(jbdy)%ssh will be needed 
     492               llneed = dta_bdy(jbdy)%lneed_dyn2d                          ! dta_bdy(jbdy)%u2d will be needed 
    490493               llread = .NOT. ln_full_vel .AND. MOD(nn_dyn2d_dta(jbdy),2) == 1   ! don't get u2d from u3d and read NetCDF file 
    491494               bf_alias => bf(jp_bdyu2d,jbdy:jbdy)                         ! alias for u2d structure of bdy number jbdy 
    492495               bn_alias => bn_u2d                                          ! alias for u2d structure of nambdy_dta 
    493                IF( ln_full_vel ) THEN  ;   iszdim = idx_bdy(jbdy)%nblen(igrd)      ! will be computed from u3d -> need on the full bdy 
    494                ELSE                    ;   iszdim = idx_bdy(jbdy)%nblenrim(igrd)   ! used only on the rim 
     496               llfullbdy = ln_full_vel .OR. cn_dyn2d(jbdy) == 'frs'        ! need u2d over the whole bdy or only over the rim? 
     497               IF( llfullbdy ) THEN  ;   iszdim = idx_bdy(jbdy)%nblen(igrd) 
     498               ELSE                  ;   iszdim = idx_bdy(jbdy)%nblenrim(igrd) 
    495499               ENDIF 
    496500            ENDIF 
     
    499503               igrd = 3                                                    ! V point 
    500504               ipk = 1                                                     ! surface data 
    501                llneed = dta_bdy(jbdy)%lneed_dyn2d                          ! dta_bdy(jbdy)%ssh will be needed 
     505               llneed = dta_bdy(jbdy)%lneed_dyn2d                          ! dta_bdy(jbdy)%v2d will be needed 
    502506               llread = .NOT. ln_full_vel .AND. MOD(nn_dyn2d_dta(jbdy),2) == 1   ! don't get v2d from v3d and read NetCDF file 
    503507               bf_alias => bf(jp_bdyv2d,jbdy:jbdy)                         ! alias for v2d structure of bdy number jbdy 
    504508               bn_alias => bn_v2d                                          ! alias for v2d structure of nambdy_dta  
    505                IF( ln_full_vel ) THEN  ;   iszdim = idx_bdy(jbdy)%nblen(igrd)      ! will be computed from v3d -> need on the full bdy 
    506                ELSE                    ;   iszdim = idx_bdy(jbdy)%nblenrim(igrd)   ! used only on the rim 
     509               llfullbdy = ln_full_vel .OR. cn_dyn2d(jbdy) == 'frs'        ! need v2d over the whole bdy or only over the rim? 
     510               IF( llfullbdy ) THEN  ;   iszdim = idx_bdy(jbdy)%nblen(igrd) 
     511               ELSE                  ;   iszdim = idx_bdy(jbdy)%nblenrim(igrd) 
    507512               ENDIF 
    508513            ENDIF 
Note: See TracChangeset for help on using the changeset viewer.