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.
dynadv_cen2.F90 in NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DYN – NEMO

source: NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DYN/dynadv_cen2.F90 @ 10946

Last change on this file since 10946 was 10946, checked in by acc, 5 years ago

2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps : Convert STO, TRD and USR modules and all knock on effects of these conversions. Note change to USR module may have implications for the TEST CASES (not tested yet). Standard SETTE tested only

  • Property svn:keywords set to Id
File size: 7.6 KB
RevLine 
[643]1MODULE dynadv_cen2
2   !!======================================================================
3   !!                       ***  MODULE  dynadv  ***
4   !! Ocean dynamics: Update the momentum trend with the flux form advection
5   !!                 using a 2nd order centred scheme
6   !!======================================================================
[1566]7   !! History :  2.0  ! 2006-08  (G. Madec, S. Theetten)  Original code
8   !!            3.2  ! 2009-07  (R. Benshila)  Suppression of rigid-lid option
[643]9   !!----------------------------------------------------------------------
10
11   !!----------------------------------------------------------------------
[6140]12   !!   dyn_adv_cen2  : flux form momentum advection (ln_dynadv_cen2=T) using a 2nd order centred scheme 
[643]13   !!----------------------------------------------------------------------
14   USE oce            ! ocean dynamics and tracers
15   USE dom_oce        ! ocean space and time domain
[4990]16   USE trd_oce        ! trends: ocean variables
17   USE trddyn         ! trend manager: dynamics
18   !
[643]19   USE in_out_manager ! I/O manager
[2715]20   USE lib_mpp        ! MPP library
[1129]21   USE prtctl         ! Print control
[643]22
23   IMPLICIT NONE
24   PRIVATE
25
[1566]26   PUBLIC   dyn_adv_cen2   ! routine called by step.F90
[643]27
28   !! * Substitutions
29#  include "vectopt_loop_substitute.h90"
30   !!----------------------------------------------------------------------
[9598]31   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
[1152]32   !! $Id$
[10068]33   !! Software governed by the CeCILL license (see ./LICENSE)
[643]34   !!----------------------------------------------------------------------
35CONTAINS
36
[10877]37   SUBROUTINE dyn_adv_cen2( kt, Kmm, puu, pvv, Krhs )
[643]38      !!----------------------------------------------------------------------
39      !!                  ***  ROUTINE dyn_adv_cen2  ***
40      !!
41      !! ** Purpose :   Compute the now momentum advection trend in flux form
[1566]42      !!              and the general trend of the momentum equation.
[643]43      !!
44      !! ** Method  :   Trend evaluated using now fields (centered in time)
45      !!
[10877]46      !! ** Action  :   (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) updated with the now vorticity term trend
[643]47      !!----------------------------------------------------------------------
[10877]48      INTEGER                             , INTENT( in )  ::  kt           ! ocean time-step index
49      INTEGER                             , INTENT( in )  ::  Kmm, Krhs    ! ocean time level indices
50      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv     ! ocean velocities and RHS of momentum equation
[2715]51      !
[1566]52      INTEGER  ::   ji, jj, jk   ! dummy loop indices
[9019]53      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zfu_t, zfu_f, zfu_uw, zfu
54      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zfv_t, zfv_f, zfv_vw, zfv, zfw
[643]55      !!----------------------------------------------------------------------
[3294]56      !
[2715]57      IF( kt == nit000 .AND. lwp ) THEN
58         WRITE(numout,*)
59         WRITE(numout,*) 'dyn_adv_cen2 : 2nd order flux form momentum advection'
60         WRITE(numout,*) '~~~~~~~~~~~~'
[643]61      ENDIF
[3294]62      !
[6140]63      IF( l_trddyn ) THEN           ! trends: store the input trends
[10877]64         zfu_uw(:,:,:) = puu(:,:,:,Krhs)
65         zfv_vw(:,:,:) = pvv(:,:,:,Krhs)
[1129]66      ENDIF
[6140]67      !
68      !                             !==  Horizontal advection  ==!
69      !
70      DO jk = 1, jpkm1                    ! horizontal transport
[10877]71         zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm)
72         zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm)
[6140]73         DO jj = 1, jpjm1                 ! horizontal momentum fluxes (at T- and F-point)
[643]74            DO ji = 1, fs_jpim1   ! vector opt.
[10877]75               zfu_t(ji+1,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji+1,jj  ,jk,Kmm) )
76               zfv_f(ji  ,jj  ,jk) = ( zfv(ji,jj,jk) + zfv(ji+1,jj,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) )
77               zfu_f(ji  ,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) )
78               zfv_t(ji  ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji  ,jj+1,jk,Kmm) )
[643]79            END DO
80         END DO
[6140]81         DO jj = 2, jpjm1                 ! divergence of horizontal momentum fluxes
[643]82            DO ji = fs_2, fs_jpim1   ! vector opt.
[10877]83               puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - (  zfu_t(ji+1,jj,jk) - zfu_t(ji,jj  ,jk)    &
84                  &                           + zfv_f(ji  ,jj,jk) - zfv_f(ji,jj-1,jk)  ) * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)
85               pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - (  zfu_f(ji,jj  ,jk) - zfu_f(ji-1,jj,jk)    &
86                  &                           + zfv_t(ji,jj+1,jk) - zfv_t(ji  ,jj,jk)  ) * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm)
[643]87            END DO
88         END DO
[1566]89      END DO
90      !
[6140]91      IF( l_trddyn ) THEN           ! trends: send trend to trddyn for diagnostic
[10877]92         zfu_uw(:,:,:) = puu(:,:,:,Krhs) - zfu_uw(:,:,:)
93         zfv_vw(:,:,:) = pvv(:,:,:,Krhs) - zfv_vw(:,:,:)
[10946]94         CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt, Kmm )
[10877]95         zfu_t(:,:,:) = puu(:,:,:,Krhs)
96         zfv_t(:,:,:) = pvv(:,:,:,Krhs)
[1129]97      ENDIF
[1566]98      !
[6140]99      !                             !==  Vertical advection  ==!
100      !
101      DO jj = 2, jpjm1                    ! surface/bottom advective fluxes set to zero
102         DO ji = fs_2, fs_jpim1
[9111]103            zfu_uw(ji,jj,jpk) = 0._wp   ;   zfv_vw(ji,jj,jpk) = 0._wp
104            zfu_uw(ji,jj, 1 ) = 0._wp   ;   zfv_vw(ji,jj, 1 ) = 0._wp
[6140]105         END DO
106      END DO
107      IF( ln_linssh ) THEN                ! linear free surface: advection through the surface
108         DO jj = 2, jpjm1
109            DO ji = fs_2, fs_jpim1
[10877]110               zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * ww(ji,jj,1) + e1e2t(ji+1,jj) * ww(ji+1,jj,1) ) * puu(ji,jj,1,Kmm)
111               zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * ww(ji,jj,1) + e1e2t(ji,jj+1) * ww(ji,jj+1,1) ) * pvv(ji,jj,1,Kmm)
[643]112            END DO
[6140]113         END DO
114      ENDIF
115      DO jk = 2, jpkm1                    ! interior advective fluxes
[6750]116         DO jj = 2, jpj                       ! 1/4 * Vertical transport
117            DO ji = 2, jpi
[10877]118               zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk)
[6140]119            END DO
120         END DO
121         DO jj = 2, jpjm1
122            DO ji = fs_2, fs_jpim1   ! vector opt.
[10877]123               zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji+1,jj  ,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji,jj,jk-1,Kmm) )
124               zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji  ,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk-1,Kmm) )
[6140]125            END DO
126         END DO
[643]127      END DO
[6140]128      DO jk = 1, jpkm1                    ! divergence of vertical momentum flux divergence
[643]129         DO jj = 2, jpjm1 
130            DO ji = fs_2, fs_jpim1   ! vector opt.
[10877]131               puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)
132               pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm)
[643]133            END DO
134         END DO
135      END DO
[1566]136      !
[6140]137      IF( l_trddyn ) THEN                 ! trends: send trend to trddyn for diagnostic
[10877]138         zfu_t(:,:,:) = puu(:,:,:,Krhs) - zfu_t(:,:,:)
139         zfv_t(:,:,:) = pvv(:,:,:,Krhs) - zfv_t(:,:,:)
[10946]140         CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt, Kmm )
[1129]141      ENDIF
[6140]142      !                                   ! Control print
[10928]143      IF(ln_ctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' cen2 adv - Ua: ', mask1=umask,   &
144         &                       tab3d_2=pvv(:,:,:,Krhs), clinfo2=           ' Va: ', mask2=vmask, clinfo3='dyn' )
[1129]145      !
[643]146   END SUBROUTINE dyn_adv_cen2
147
148   !!==============================================================================
149END MODULE dynadv_cen2
Note: See TracBrowser for help on using the repository browser.