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 367 for trunk/NEMO/OPA_SRC/DYN/dynspg_ts.F90 – NEMO

Ignore:
Timestamp:
2005-12-28T10:25:10+01:00 (18 years ago)
Author:
opalod
Message:

nemo_v1_update_035 : CT : OBCs adapted to the new surface pressure gradient algorithms

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OPA_SRC/DYN/dynspg_ts.F90

    r363 r367  
    1717   USE phycst          ! physical constants 
    1818   USE ocesbc          ! ocean surface boundary condition 
     19   USE obcdta          ! open boundary condition data      
     20   USE obcfla          ! Flather open boundary condition   
    1921   USE dynvor          ! vorticity term 
    2022   USE obc_oce         ! Lateral open boundary condition 
     
    2224   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    2325   USE prtctl          ! Print control 
     26   USE dynspg_oce      ! surface pressure gradient variables 
    2427   USE in_out_manager  ! I/O manager 
    2528 
     
    2932   !! * Accessibility 
    3033   PUBLIC dyn_spg_ts  ! routine called by step.F90 
    31  
    32    !! * Module variables 
    33       REAL(wp), PUBLIC, DIMENSION(jpi,jpj) :: & ! variables averaged over the barotropic loop 
    34          sshn_b, sshb_b,               &  ! sea surface heigth (now, before) 
    35          un_b  , vn_b                     ! vertically integrated horizontal velocities (now) 
    3634 
    3735   !! * Substitutions 
     
    6159      !!          surface gradient and the Coriolis force are updated within 
    6260      !!          the barotropic integration. 
    63       !!      -2- Barotropic loop : updates of sea surface height (zssha_e) and  
    64       !!          barotropic transports (zua_e and zva_e) through barotropic  
     61      !!      -2- Barotropic loop : updates of sea surface height (ssha_e) and  
     62      !!          barotropic transports (ua_e and va_e) through barotropic  
    6563      !!          momentum and continuity integration. Barotropic former  
    6664      !!          variables are time averaging over the full barotropic cycle 
     
    9795         zssha_b, zua_b, zva_b,             &  !     "        " 
    9896         zsshb_e, zub_e, zvb_e,             &  !     "        " 
    99          zsshn_e, zun_e, zvn_e,             &  !     "        " 
    100          zssha_e, zua_e, zva_e                 !     "        " 
     97         zun_e, zvn_e                          !     "        " 
    10198      REAL(wp), DIMENSION(jpi,jpj),SAVE ::  & 
    10299         ztnw, ztne, ztsw, ztse 
     
    105102      ! Arrays initialization 
    106103      ! --------------------- 
    107       zua_b(:,:) = 0.e0   ;   zub_e(:,:) = 0.e0   ;   zun_e(:,:) = 0.e0   ;   zua_e(:,:) = 0.e0 
    108       zva_b(:,:) = 0.e0   ;   zvb_e(:,:) = 0.e0   ;   zvn_e(:,:) = 0.e0   ;   zva_e(:,:) = 0.e0 
     104      zua_b(:,:) = 0.e0   ;   zub_e(:,:) = 0.e0   ;   zun_e(:,:) = 0.e0 
     105      zva_b(:,:) = 0.e0   ;   zvb_e(:,:) = 0.e0   ;   zvn_e(:,:) = 0.e0 
    109106      zhdiv(:,:) = 0.e0 
    110107 
     
    138135            ENDIF 
    139136         ENDIF 
    140          zssha_e(:,:) = sshn(:,:) 
    141          zua_e  (:,:) = un_b(:,:) 
    142          zva_e  (:,:) = vn_b(:,:) 
     137         ssha_e(:,:) = sshn(:,:) 
     138         ua_e(:,:)  = un_b(:,:) 
     139         va_e(:,:)  = vn_b(:,:) 
    143140 
    144141         IF( ln_dynvor_een ) THEN 
     
    278275      ! variables for the barotropic equations 
    279276      zsshb_e(:,:) = sshn_b(:,:)       ! (barotropic) sea surface height (before and now) 
    280       zsshn_e(:,:) = sshn_b(:,:) 
    281       zub_e(:,:) = un_b(:,:)       ! barotropic transports issued from the barotropic equations (before and now) 
    282       zvb_e(:,:) = vn_b(:,:) 
    283       zun_e(:,:) = un_b(:,:) 
    284       zvn_e(:,:) = vn_b(:,:) 
    285       zssha_b(:,:) = sshn(:,:)        ! time averaged variables over all sub-timesteps 
    286       zua_b(:,:) = un_b(:,:)    
    287       zva_b(:,:) = vn_b(:,:) 
     277      sshn_e (:,:) = sshn_b(:,:) 
     278      zub_e  (:,:) = un_b  (:,:)       ! barotropic transports issued from the barotropic equations (before and now) 
     279      zvb_e  (:,:) = vn_b  (:,:) 
     280      zun_e  (:,:) = un_b  (:,:) 
     281      zvn_e  (:,:) = vn_b  (:,:) 
     282      zssha_b(:,:) = sshn  (:,:)       ! time averaged variables over all sub-timesteps 
     283      zua_b  (:,:) = un_b  (:,:)    
     284      zva_b  (:,:) = vn_b  (:,:) 
     285 
     286      ! set ssh corrections to 0 
     287      ! ssh corrections are applied to normal velocities (Flather's algorithm) and averaged over the barotropic loop 
     288#if defined key_obc 
     289      IF( lp_obc_east  )   sshfoe_b(:,:) = 0.e0 
     290      IF( lp_obc_west  )   sshfow_b(:,:) = 0.e0 
     291      IF( lp_obc_south )   sshfos_b(:,:) = 0.e0 
     292      IF( lp_obc_north )   sshfon_b(:,:) = 0.e0 
     293#endif 
    288294 
    289295      ! Barotropic integration over 2 baroclinic time steps 
     
    296302         z2dt_e = 2. * rdtbt 
    297303         IF ( jit == 1 )   z2dt_e = rdtbt 
     304 
     305         ! Time interpolation of open boundary condition data 
     306         IF( lk_obc )   CALL obc_dta_bt( kt, jit ) 
    298307 
    299308         ! Horizontal divergence of barotropic transports 
     
    312321         ! open boundaries (div must be zero behind the open boundary) 
    313322         !  mpp remark: The zeroing of hdiv can probably be extended to 1->jpi/jpj for the correct row/column 
    314          IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1) = 0.e0      ! east 
    315          IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1) = 0.e0      ! west 
    316          IF( lp_obc_north )   zhdiv(nin0  :nin1  ,njn0p1:njn1p1) = 0.e0    ! north 
    317          IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1) = 0.e0      ! south 
     323         IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1)   = 0.e0      ! east 
     324         IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1)   = 0.e0      ! west 
     325         IF( lp_obc_north )   zhdiv(nin0  :nin1  ,njn0p1:njn1p1) = 0.e0      ! north 
     326         IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1)   = 0.e0      ! south 
    318327#endif 
    319328 
     
    322331         DO jj = 2, jpjm1 
    323332            DO ji = fs_2, fs_jpim1   ! vector opt. 
    324                zssha_e(ji,jj) = ( zsshb_e(ji,jj) - z2dt_e *  ( zraur * emp(ji,jj)  & 
     333               ssha_e(ji,jj) = ( zsshb_e(ji,jj) - z2dt_e *  ( zraur * emp(ji,jj)  & 
    325334            &            +  zhdiv(ji,jj) ) ) * tmask(ji,jj,1) 
    326335            END DO 
     
    336345               DO ji = fs_2, fs_jpim1   ! vector opt. 
    337346                  ! surface pressure gradient 
    338                   zspgu = -grav * ( zsshn_e(ji+1,jj) - zsshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
    339                   zspgv = -grav * ( zsshn_e(ji,jj+1) - zsshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
     347                  zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
     348                  zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
    340349                  ! energy conserving formulation for planetary vorticity term 
    341350                  zy1 = ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj) 
     
    346355                  zcvbt =-zfact2 * ( ff(ji-1,jj  ) * zx1 + ff(ji,jj) * zx2 ) 
    347356                  ! after transports 
    348                   zua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
    349                   zva_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
     357                  ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
     358                  va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
    350359               END DO 
    351360            END DO 
     
    355364               DO ji = fs_2, fs_jpim1   ! vector opt. 
    356365                  ! surface pressure gradient 
    357                   zspgu = -grav * ( zsshn_e(ji+1,jj) - zsshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
    358                   zspgv = -grav * ( zsshn_e(ji,jj+1) - zsshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
     366                  zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
     367                  zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
    359368                  ! enstrophy conserving formulation for planetary vorticity term 
    360369                  zy1 = zfact1 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1)   & 
     
    365374                  zcvbt  = zx1 * ( ff(ji-1,jj  ) + ff(ji,jj) ) 
    366375                  ! after transports 
    367                   zua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
    368                   zva_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
     376                  ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
     377                  va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
    369378               END DO 
    370379            END DO 
     
    375384               DO ji = fs_2, fs_jpim1   ! vector opt. 
    376385                  ! surface pressure gradient 
    377                   zspgu = -grav * ( zsshn_e(ji+1,jj) - zsshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
    378                   zspgv = -grav * ( zsshn_e(ji,jj+1) - zsshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
     386                  zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
     387                  zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
    379388                  ! energy/enstrophy conserving formulation for planetary vorticity term 
    380389                  zcubt = + zfac25 / e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
     
    383392                     &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) 
    384393                  ! after transports 
    385                   zua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
    386                   zva_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
     394                  ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
     395                  va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
    387396               END DO 
    388397            END DO 
    389398         ENDIF 
    390399 
    391          ! ... Boundary conditions on zua_e, zva_e, zssha_e 
    392          CALL lbc_lnk( zua_e, 'U', -1. ) 
    393          CALL lbc_lnk( zva_e, 'V', -1. ) 
    394          CALL lbc_lnk( zssha_e, 'T', 1. ) 
     400         ! Flather's boundary condition for the barotropic loop : 
     401         !         - Update sea surface height on each open boundary 
     402         !         - Correct the barotropic transports 
     403         IF( lk_obc )   CALL obc_fla_ts( kt ) 
     404 
     405 
     406         ! ... Boundary conditions on ua_e, va_e, ssha_e 
     407         CALL lbc_lnk( ua_e  , 'U', -1. ) 
     408         CALL lbc_lnk( va_e  , 'V', -1. ) 
     409         CALL lbc_lnk( ssha_e, 'T',  1. ) 
    395410 
    396411         ! temporal sum 
    397412         !------------- 
    398          zssha_b(:,:) = zssha_b(:,:) + zssha_e(:,:) 
    399          zua_b  (:,:) = zua_b  (:,:) + zua_e  (:,:) 
    400          zva_b  (:,:) = zva_b  (:,:) + zva_e  (:,:)  
     413         zssha_b(:,:) = zssha_b(:,:) + ssha_e(:,:) 
     414         zua_b  (:,:) = zua_b  (:,:) + ua_e  (:,:) 
     415         zva_b  (:,:) = zva_b  (:,:) + va_e  (:,:)  
    401416 
    402417         ! Time filter and swap of dynamics arrays 
    403418         ! --------------------------------------- 
    404419         IF( neuler == 0 .AND. kt == nit000 ) THEN   ! Euler (forward) time stepping 
    405             zsshb_e(:,:) = zsshn_e(:,:) 
    406             zub_e  (:,:) = zun_e  (:,:) 
    407             zvb_e  (:,:) = zvn_e  (:,:) 
    408             zsshn_e(:,:) = zssha_e(:,:) 
    409             zun_e  (:,:) = zua_e  (:,:) 
    410             zvn_e  (:,:) = zva_e  (:,:) 
     420            zsshb_e(:,:) = sshn_e(:,:) 
     421            zub_e  (:,:) = zun_e (:,:) 
     422            zvb_e  (:,:) = zvn_e (:,:) 
     423            sshn_e (:,:) = ssha_e(:,:) 
     424            zun_e  (:,:) = ua_e  (:,:) 
     425            zvn_e  (:,:) = va_e  (:,:) 
    411426         ELSE                                        ! Asselin filtering 
    412             zsshb_e(:,:) = atfp * ( zsshb_e(:,:) + zssha_e(:,:) ) + atfp1 * zsshn_e(:,:) 
    413             zub_e  (:,:) = atfp * ( zub_e  (:,:) + zua_e  (:,:) ) + atfp1 * zun_e  (:,:) 
    414             zvb_e  (:,:) = atfp * ( zvb_e  (:,:) + zva_e  (:,:) ) + atfp1 * zvn_e  (:,:) 
    415             zsshn_e(:,:) = zssha_e(:,:) 
    416             zun_e  (:,:) = zua_e  (:,:) 
    417             zvn_e  (:,:) = zva_e  (:,:) 
     427            zsshb_e(:,:) = atfp * ( zsshb_e(:,:) + ssha_e(:,:) ) + atfp1 * sshn_e(:,:) 
     428            zub_e  (:,:) = atfp * ( zub_e  (:,:) + ua_e  (:,:) ) + atfp1 * zun_e  (:,:) 
     429            zvb_e  (:,:) = atfp * ( zvb_e  (:,:) + va_e  (:,:) ) + atfp1 * zvn_e  (:,:) 
     430            sshn_e (:,:) = ssha_e(:,:) 
     431            zun_e  (:,:) = ua_e  (:,:) 
     432            zvn_e  (:,:) = va_e  (:,:) 
    418433         ENDIF 
    419434 
     
    426441      zcoef =  1.e0 / (  FLOAT( icycle +1 )  ) 
    427442      zssha_b(:,:) = zcoef * zssha_b(:,:)  
    428       zua_b  (:,:) = zcoef * zua_b  (:,:)  
    429       zva_b  (:,:) = zcoef * zva_b  (:,:)  
     443      zua_b  (:,:) = zcoef *  zua_b (:,:)  
     444      zva_b  (:,:) = zcoef *  zva_b (:,:)  
     445#if defined key_obc 
     446         IF( lp_obc_east  )   sshfoe_b(:,:) = zcoef * sshfoe_b(:,:) 
     447         IF( lp_obc_west  )   sshfow_b(:,:) = zcoef * sshfow_b(:,:) 
     448         IF( lp_obc_north )   sshfon_b(:,:) = zcoef * sshfon_b(:,:) 
     449         IF( lp_obc_south )   sshfos_b(:,:) = zcoef * sshfos_b(:,:) 
     450#endif 
    430451      
    431452 
     
    448469      ! open boundaries (div must be zero behind the open boundary) 
    449470      !  mpp remark: The zeroing of hdiv can probably be extended to 1->jpi/jpj for the correct row/column 
    450       IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1) = 0.e0      ! east 
    451       IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1) = 0.e0      ! west 
     471      IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1)   = 0.e0    ! east 
     472      IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1)   = 0.e0    ! west 
    452473      IF( lp_obc_north )   zhdiv(nin0  :nin1  ,njn0p1:njn1p1) = 0.e0    ! north 
    453       IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1) = 0.e0      ! south 
     474      IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1)   = 0.e0    ! south 
    454475#endif 
    455476 
     
    460481 
    461482      ! ... Boundary conditions on sshn 
    462       CALL lbc_lnk( sshn, 'T', 1. ) 
     483      IF( .NOT. lk_obc ) CALL lbc_lnk( sshn, 'T', 1. ) 
    463484 
    464485 
Note: See TracChangeset for help on using the changeset viewer.