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 6041 for branches/2015/dev_r5776_UKMO2_OBS_efficiency_improvs/NEMOGCM/NEMO/OPA_SRC/DYN/sshwzv.F90 – NEMO

Ignore:
Timestamp:
2015-12-14T10:06:06+01:00 (8 years ago)
Author:
timgraham
Message:

Merged head of trunk into branch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5776_UKMO2_OBS_efficiency_improvs/NEMOGCM/NEMO/OPA_SRC/DYN/sshwzv.F90

    r5656 r6041  
    2020   USE sbc_oce         ! surface boundary condition: ocean 
    2121   USE domvvl          ! Variable volume 
    22    USE divcur          ! hor. divergence and curl      (div & cur routines) 
    23    USE restart         ! only for lrst_oce 
    24    USE in_out_manager  ! I/O manager 
    25    USE prtctl          ! Print control 
    26    USE phycst 
    27    USE lbclnk          ! ocean lateral boundary condition (or mpp link) 
    28    USE lib_mpp         ! MPP library 
     22   USE divhor          ! horizontal divergence 
     23   USE phycst          ! physical constants 
    2924   USE bdy_oce 
    3025   USE bdy_par          
     
    3631   USE asminc          ! Assimilation increment 
    3732#endif 
     33   USE in_out_manager  ! I/O manager 
     34   USE restart         ! only for lrst_oce 
     35   USE prtctl          ! Print control 
     36   USE lbclnk          ! ocean lateral boundary condition (or mpp link) 
     37   USE lib_mpp         ! MPP library 
    3838   USE wrk_nemo        ! Memory Allocation 
    3939   USE timing          ! Timing 
     
    6666      !!      by the time step. 
    6767      !! 
    68       !! ** action  :   ssha    : after sea surface height 
     68      !! ** action  :   ssha, after sea surface height 
    6969      !! 
    7070      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
    7171      !!---------------------------------------------------------------------- 
    72       ! 
    73       REAL(wp), POINTER, DIMENSION(:,:  ) ::  zhdiv 
    74       INTEGER, INTENT(in) ::   kt                      ! time step 
     72      INTEGER, INTENT(in) ::   kt   ! time step 
    7573      !  
    76       INTEGER             ::   jk                      ! dummy loop indice 
    77       REAL(wp)            ::   z2dt, z1_rau0           ! local scalars 
    78       !!---------------------------------------------------------------------- 
    79       ! 
    80       IF( nn_timing == 1 )  CALL timing_start('ssh_nxt') 
    81       ! 
    82       CALL wrk_alloc( jpi, jpj, zhdiv )  
     74      INTEGER  ::   jk            ! dummy loop indice 
     75      REAL(wp) ::   z2dt, zcoef   ! local scalars 
     76      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zhdiv   ! 2D workspace 
     77      !!---------------------------------------------------------------------- 
     78      ! 
     79      IF( nn_timing == 1 )   CALL timing_start('ssh_nxt') 
     80      ! 
     81      CALL wrk_alloc( jpi,jpj,   zhdiv )  
    8382      ! 
    8483      IF( kt == nit000 ) THEN 
    85          ! 
    8684         IF(lwp) WRITE(numout,*) 
    8785         IF(lwp) WRITE(numout,*) 'ssh_nxt : after sea surface height' 
    8886         IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
    89          ! 
    90       ENDIF 
    91       ! 
    92       CALL div_cur( kt )                              ! Horizontal divergence & Relative vorticity 
     87      ENDIF 
     88      ! 
     89      CALL div_hor( kt )                              ! Horizontal divergence 
    9390      ! 
    9491      z2dt = 2._wp * rdt                              ! set time step size (Euler/Leapfrog) 
     
    106103      ! compute the vertical velocity which can be used to compute the non-linear terms of the momentum equations. 
    107104      !  
    108       z1_rau0 = 0.5_wp * r1_rau0 
    109       ssha(:,:) = (  sshb(:,:) - z2dt * ( z1_rau0 * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * ssmask(:,:) 
    110  
    111 #if ! defined key_dynspg_ts 
    112       ! These lines are not necessary with time splitting since 
    113       ! boundary condition on sea level is set during ts loop 
    114 #if defined key_agrif 
    115       CALL agrif_ssh( kt ) 
    116 #endif 
    117 #if defined key_bdy 
    118       IF (lk_bdy) THEN 
    119          CALL lbc_lnk( ssha, 'T', 1. ) ! Not sure that's necessary 
    120          CALL bdy_ssh( ssha ) ! Duplicate sea level across open boundaries 
    121       ENDIF 
    122 #endif 
    123 #endif 
     105      zcoef = 0.5_wp * r1_rau0 
     106      ssha(:,:) = (  sshb(:,:) - z2dt * ( zcoef * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * ssmask(:,:) 
     107 
     108      IF ( .NOT.ln_dynspg_ts ) THEN 
     109         ! These lines are not necessary with time splitting since 
     110         ! boundary condition on sea level is set during ts loop 
     111# if defined key_agrif 
     112         CALL agrif_ssh( kt ) 
     113# endif 
     114# if defined key_bdy 
     115         IF( lk_bdy ) THEN 
     116            CALL lbc_lnk( ssha, 'T', 1. )    ! Not sure that's necessary 
     117            CALL bdy_ssh( ssha )            ! Duplicate sea level across open boundaries 
     118         ENDIF 
     119# endif 
     120      ENDIF 
    124121 
    125122#if defined key_asminc 
    126       !                                                ! Include the IAU weighted SSH increment 
    127       IF( lk_asminc .AND. ln_sshinc .AND. ln_asmiau ) THEN 
     123      IF( lk_asminc .AND. ln_sshinc .AND. ln_asmiau ) THEN     ! Include the IAU weighted SSH increment 
    128124         CALL ssh_asm_inc( kt ) 
    129125         ssha(:,:) = ssha(:,:) + z2dt * ssh_iau(:,:) 
    130126      ENDIF 
    131127#endif 
    132  
    133128      !                                           !------------------------------! 
    134129      !                                           !           outputs            ! 
     
    159154      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
    160155      !!---------------------------------------------------------------------- 
    161       ! 
    162       INTEGER, INTENT(in) ::   kt           ! time step 
     156      INTEGER, INTENT(in) ::   kt   ! time step 
     157      ! 
     158      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     159      REAL(wp) ::   z1_2dt       ! local scalars 
    163160      REAL(wp), POINTER, DIMENSION(:,:  ) ::  z2d 
    164161      REAL(wp), POINTER, DIMENSION(:,:,:) ::  z3d, zhdiv 
    165       ! 
    166       INTEGER             ::   ji, jj, jk   ! dummy loop indices 
    167       REAL(wp)            ::   z1_2dt       ! local scalars 
    168       !!---------------------------------------------------------------------- 
    169        
    170       IF( nn_timing == 1 )  CALL timing_start('wzv') 
     162      !!---------------------------------------------------------------------- 
     163      ! 
     164      IF( nn_timing == 1 )   CALL timing_start('wzv') 
    171165      ! 
    172166      IF( kt == nit000 ) THEN 
    173          ! 
    174167         IF(lwp) WRITE(numout,*) 
    175168         IF(lwp) WRITE(numout,*) 'wzv : now vertical velocity ' 
     
    177170         ! 
    178171         wn(:,:,jpk) = 0._wp                  ! bottom boundary condition: w=0 (set once for all) 
    179          ! 
    180172      ENDIF 
    181173      !                                           !------------------------------! 
     
    193185            DO jj = 2, jpjm1 
    194186               DO ji = fs_2, fs_jpim1   ! vector opt. 
    195                   zhdiv(ji,jj,jk) = r1_e12t(ji,jj) * ( un_td(ji,jj,jk) - un_td(ji-1,jj,jk) + vn_td(ji,jj,jk) - vn_td(ji,jj-1,jk) ) 
     187                  zhdiv(ji,jj,jk) = r1_e1e2t(ji,jj) * ( un_td(ji,jj,jk) - un_td(ji-1,jj,jk) + vn_td(ji,jj,jk) - vn_td(ji,jj-1,jk) ) 
    196188               END DO 
    197189            END DO 
     
    216208 
    217209#if defined key_bdy 
    218       IF (lk_bdy) THEN 
     210      IF( lk_bdy ) THEN 
    219211         DO jk = 1, jpkm1 
    220212            wn(:,:,jk) = wn(:,:,jk) * bdytmask(:,:) 
     
    224216      ! 
    225217      IF( nn_timing == 1 )  CALL timing_stop('wzv') 
    226  
    227  
     218      ! 
    228219   END SUBROUTINE wzv 
     220 
    229221 
    230222   SUBROUTINE ssh_swp( kt ) 
     
    258250      ENDIF 
    259251 
    260 # if defined key_dynspg_ts 
    261       IF( ( neuler == 0 .AND. kt == nit000 ) .OR. ln_bt_fw ) THEN    !** Euler time-stepping: no filter 
    262 # else 
    263       IF ( neuler == 0 .AND. kt == nit000 ) THEN   !** Euler time-stepping at first time-step : no filter 
    264 #endif 
     252      IF( ( neuler == 0 .AND. kt == nit000 ) .OR. ( ln_bt_fw .AND. ln_dynspg_ts ) ) THEN  
     253                                                   !** Euler time-stepping: no filter 
    265254         sshb(:,:) = sshn(:,:)                           ! before <-- now 
    266255         sshn(:,:) = ssha(:,:)                           ! now    <-- after  (before already = now) 
     256         ! 
    267257      ELSE                                         !** Leap-Frog time-stepping: Asselin filter + swap 
    268258         sshb(:,:) = sshn(:,:) + atfp * ( sshb(:,:) - 2 * sshn(:,:) + ssha(:,:) )     ! before <-- now filtered 
Note: See TracChangeset for help on using the changeset viewer.