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.
divhor.F90 in NEMO/trunk/src/OCE/DYN – NEMO

source: NEMO/trunk/src/OCE/DYN/divhor.F90

Last change on this file was 15150, checked in by smasson, 3 years ago

trunk: remove some of the changes done in [15145]

  • Property svn:keywords set to Id
File size: 5.6 KB
RevLine 
[5777]1MODULE divhor
[3]2   !!==============================================================================
[5777]3   !!                       ***  MODULE  divhor  ***
4   !! Ocean diagnostic variable : now horizontal divergence
[3]5   !!==============================================================================
[5777]6   !! History :  1.0  ! 2002-09  (G. Madec, E. Durand)  Free form, F90
[2528]7   !!             -   ! 2005-01  (J. Chanut) Unstructured open boundaries
8   !!             -   ! 2003-08  (G. Madec)  merged of cur and div, free form, F90
9   !!             -   ! 2005-01  (J. Chanut, A. Sellar) unstructured open boundaries
10   !!            3.3  ! 2010-09  (D.Storkey and E.O'Dea) bug fixes for BDY module
11   !!             -   ! 2010-10  (R. Furner, G. Madec) runoff and cla added directly here
[5777]12   !!            3.7  ! 2014-01  (G. Madec) suppression of velocity curl from in-core memory
13   !!             -   ! 2014-12  (G. Madec) suppression of cross land advection option
14   !!             -   ! 2015-10  (G. Madec) add velocity and rnf flag in argument of div_hor
[2528]15   !!----------------------------------------------------------------------
[3]16
17   !!----------------------------------------------------------------------
[5777]18   !!   div_hor    : Compute the horizontal divergence field
[3]19   !!----------------------------------------------------------------------
20   USE oce             ! ocean dynamics and tracers
21   USE dom_oce         ! ocean space and time domain
[12377]22   USE sbc_oce, ONLY : ln_rnf      ! river runoff
23   USE sbcrnf , ONLY : sbc_rnf_div ! river runoff
24   USE isf_oce, ONLY : ln_isf      ! ice shelf
25   USE isfhdiv, ONLY : isf_hdiv    ! ice shelf
[9023]26#if defined key_asminc   
27   USE asminc          ! Assimilation increment
28#endif
[5777]29   !
[3]30   USE in_out_manager  ! I/O manager
31   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
[2715]32   USE lib_mpp         ! MPP library
[3294]33   USE timing          ! Timing
[3]34
35   IMPLICIT NONE
36   PRIVATE
37
[5777]38   PUBLIC   div_hor    ! routine called by step.F90 and istate.F90
[3]39
40   !! * Substitutions
[12377]41#  include "do_loop_substitute.h90"
[13237]42#  include "domzgr_substitute.h90"
[3]43   !!----------------------------------------------------------------------
[9598]44   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
[1152]45   !! $Id$
[10068]46   !! Software governed by the CeCILL license (see ./LICENSE)
[3]47   !!----------------------------------------------------------------------
48CONTAINS
49
[12377]50   SUBROUTINE div_hor( kt, Kbb, Kmm )
[3]51      !!----------------------------------------------------------------------
[5777]52      !!                  ***  ROUTINE div_hor  ***
[3]53      !!                   
[5777]54      !! ** Purpose :   compute the horizontal divergence at now time-step
[3]55      !!
[5777]56      !! ** Method  :   the now divergence is computed as :
[12377]57      !!         hdiv = 1/(e1e2t*e3t) ( di[e2u*e3u un] + dj[e1v*e3v vn] )
[5777]58      !!      and correct with runoff inflow (div_rnf) and cross land flow (div_cla)
[3]59      !!
[12377]60      !! ** Action  : - update hdiv, the now horizontal divergence
[3]61      !!----------------------------------------------------------------------
[12377]62      INTEGER, INTENT(in) ::   kt        ! ocean time-step index
63      INTEGER, INTENT(in) ::   Kbb, Kmm  ! ocean time level indices
[2528]64      !
[2715]65      INTEGER  ::   ji, jj, jk    ! dummy loop indices
[3]66      !!----------------------------------------------------------------------
[3294]67      !
[9019]68      IF( ln_timing )   CALL timing_start('div_hor')
[3294]69      !
[3]70      IF( kt == nit000 ) THEN
[14834]71         IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
72            IF(lwp) WRITE(numout,*)
73            IF(lwp) WRITE(numout,*) 'div_hor : horizontal velocity divergence '
74            IF(lwp) WRITE(numout,*) '~~~~~~~   '
75         ENDIF
76         DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
77            hdiv(ji,jj,jk) = 0._wp    ! initialize hdiv for the halos at the first time step
78         END_3D
[3]79      ENDIF
[5777]80      !
[15150]81      DO_3D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls, 1, jpkm1 )                                          !==  Horizontal divergence  ==!
[14820]82         ! round brackets added to fix the order of floating point operations
83         ! needed to ensure halo 1 - halo 2 compatibility
[15150]84         hdiv(ji,jj,jk) = (  ( e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm) * uu(ji  ,jj,jk,Kmm)     &
85            &                - e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm) * uu(ji-1,jj,jk,Kmm)     &
[14820]86            &                )                                                             & ! bracket for halo 1 - halo 2 compatibility
[15150]87            &              + ( e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm) * vv(ji,jj  ,jk,Kmm)     &
88            &                - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * vv(ji,jj-1,jk,Kmm)     &
[14820]89            &                )                                                             & ! bracket for halo 1 - halo 2 compatibility
90            &             )  * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
[12377]91      END_3D
92      !
[15055]93      IF( ln_rnf )   CALL sbc_rnf_div( hdiv, Kmm )                               !==  runoffs    ==!   (update hdiv field)
[2528]94      !
[9023]95#if defined key_asminc 
[12377]96      IF( ln_sshinc .AND. ln_asmiau )   CALL ssh_asm_div( kt, Kbb, Kmm, hdiv )   !==  SSH assimilation  ==!   (update hdiv field)
[9023]97      !
98#endif
[12377]99      IF( ln_isf )                      CALL isf_hdiv( kt, Kmm, hdiv )           !==  ice shelf         ==!   (update hdiv field)
[5777]100      !
[15058]101      IF( nn_hls==1 )   CALL lbc_lnk( 'divhor', hdiv, 'T', 1.0_wp )   !   (no sign change)
102      !                                                               ! needed for ww in sshwzv
[9019]103      IF( ln_timing )   CALL timing_stop('div_hor')
[5777]104      !
105   END SUBROUTINE div_hor
[3]106   
107   !!======================================================================
[5777]108END MODULE divhor
Note: See TracBrowser for help on using the repository browser.