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

source: NEMO/trunk/src/OCE/TRD/trddyn.F90 @ 12377

Last change on this file since 12377 was 12377, checked in by acc, 4 years ago

The big one. Merging all 2019 developments from the option 1 branch back onto the trunk.

This changeset reproduces 2019/dev_r11943_MERGE_2019 on the trunk using a 2-URL merge
onto a working copy of the trunk. I.e.:

svn merge --ignore-ancestry \

svn+ssh://acc@forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/NEMO/trunk \
svn+ssh://acc@forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/NEMO/branches/2019/dev_r11943_MERGE_2019 ./

The --ignore-ancestry flag avoids problems that may otherwise arise from the fact that
the merge history been trunk and branch may have been applied in a different order but
care has been taken before this step to ensure that all applicable fixes and updates
are present in the merge branch.

The trunk state just before this step has been branched to releases/release-4.0-HEAD
and that branch has been immediately tagged as releases/release-4.0.2. Any fixes
or additions in response to tickets on 4.0, 4.0.1 or 4.0.2 should be done on
releases/release-4.0-HEAD. From now on future 'point' releases (e.g. 4.0.2) will
remain unchanged with periodic releases as needs demand. Note release-4.0-HEAD is a
transitional naming convention. Future full releases, say 4.2, will have a release-4.2
branch which fulfills this role and the first point release (e.g. 4.2.0) will be made
immediately following the release branch creation.

2020 developments can be started from any trunk revision later than this one.

  • Property svn:keywords set to Id
File size: 10.3 KB
Line 
1MODULE trddyn
2   !!======================================================================
3   !!                       ***  MODULE  trddyn  ***
4   !! Ocean diagnostics:  ocean dynamic trends
5   !!=====================================================================
6   !! History :  3.5  !  2012-02  (G. Madec) creation from trdmod: split DYN and TRA trends
7   !!                                        and manage  3D trends output for U, V, and KE
8   !!----------------------------------------------------------------------
9
10   !!----------------------------------------------------------------------
11   !!   trd_dyn       : manage the type of momentum trend diagnostics (3D I/O, domain averaged, KE)
12   !!   trd_dyn_iom   : output 3D momentum and/or tracer trends using IOM
13   !!   trd_dyn_init  : initialization step
14   !!----------------------------------------------------------------------
15   USE oce            ! ocean dynamics and tracers variables
16   USE dom_oce        ! ocean space and time domain variables
17   USE phycst         ! physical constants
18   USE sbc_oce        ! surface boundary condition: ocean
19   USE zdf_oce        ! ocean vertical physics: variables
20!!gm   USE zdfdrg         ! ocean vertical physics: bottom friction
21   USE trd_oce        ! trends: ocean variables
22   USE trdken         ! trends: Kinetic ENergy
23   USE trdglo         ! trends: global domain averaged
24   USE trdvor         ! trends: vertical averaged vorticity
25   USE trdmxl         ! trends: mixed layer averaged
26   !
27   USE in_out_manager ! I/O manager
28   USE lbclnk         ! lateral boundary condition
29   USE iom            ! I/O manager library
30   USE lib_mpp        ! MPP library
31
32   IMPLICIT NONE
33   PRIVATE
34
35   PUBLIC trd_dyn        ! called by all dynXXX modules
36
37   !! * Substitutions
38#  include "do_loop_substitute.h90"
39   !!----------------------------------------------------------------------
40   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
41   !! $Id$
42   !! Software governed by the CeCILL license (see ./LICENSE)
43   !!----------------------------------------------------------------------
44CONTAINS
45
46   SUBROUTINE trd_dyn( putrd, pvtrd, ktrd, kt, Kmm )
47      !!---------------------------------------------------------------------
48      !!                  ***  ROUTINE trd_mod  ***
49      !!
50      !! ** Purpose :   Dispatch momentum trend computation, e.g. 3D output,
51      !!              integral constraints, barotropic vorticity, kinetic enrgy,
52      !!              and/or mixed layer budget.
53      !!----------------------------------------------------------------------
54      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends
55      INTEGER                   , INTENT(in   ) ::   ktrd           ! trend index
56      INTEGER                   , INTENT(in   ) ::   kt             ! time step
57      INTEGER                   , INTENT(in   ) ::   Kmm            ! time level index
58      !!----------------------------------------------------------------------
59      !
60      putrd(:,:,:) = putrd(:,:,:) * umask(:,:,:)                       ! mask the trends
61      pvtrd(:,:,:) = pvtrd(:,:,:) * vmask(:,:,:)
62      !
63
64!!gm NB : here a lbc_lnk should probably be added
65
66      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
67      !   3D output of momentum and/or tracers trends using IOM interface
68      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
69      IF( ln_dyn_trd )   CALL trd_dyn_iom( putrd, pvtrd, ktrd, kt, Kmm )
70         
71      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
72      !  Integral Constraints Properties for momentum and/or tracers trends
73      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
74      IF( ln_glo_trd )   CALL trd_glo( putrd, pvtrd, ktrd, 'DYN', kt, Kmm )
75
76      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
77      !  Kinetic Energy trends
78      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
79      IF( ln_KE_trd  )   CALL trd_ken( putrd, pvtrd, ktrd, kt, Kmm )
80
81      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
82      !  Vorticity trends
83      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
84      IF( ln_vor_trd )   CALL trd_vor( putrd, pvtrd, ktrd, kt, Kmm )
85
86      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
87      !  Mixed layer trends for active tracers
88      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
89!!gm      IF( ln_dyn_mxl )   CALL trd_mxl_dyn   
90      !
91   END SUBROUTINE trd_dyn
92
93
94   SUBROUTINE trd_dyn_iom( putrd, pvtrd, ktrd, kt, Kmm )
95      !!---------------------------------------------------------------------
96      !!                  ***  ROUTINE trd_dyn_iom  ***
97      !!
98      !! ** Purpose :   output 3D trends using IOM
99      !!----------------------------------------------------------------------
100      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends
101      INTEGER                   , INTENT(in   ) ::   ktrd           ! trend index
102      INTEGER                   , INTENT(in   ) ::   kt             ! time step
103      INTEGER                   , INTENT(in   ) ::   Kmm            ! time level index
104      !
105      INTEGER ::   ji, jj, jk   ! dummy loop indices
106      INTEGER ::   ikbu, ikbv   ! local integers
107      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   z2dx, z2dy   ! 2D workspace
108      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   z3dx, z3dy   ! 3D workspace
109      !!----------------------------------------------------------------------
110      !
111      SELECT CASE( ktrd )
112      CASE( jpdyn_hpg )   ;   CALL iom_put( "utrd_hpg", putrd )    ! hydrostatic pressure gradient
113                              CALL iom_put( "vtrd_hpg", pvtrd )
114      CASE( jpdyn_spg )   ;   CALL iom_put( "utrd_spg", putrd )    ! surface pressure gradient
115                              CALL iom_put( "vtrd_spg", pvtrd )
116      CASE( jpdyn_pvo )   ;   CALL iom_put( "utrd_pvo", putrd )    ! planetary vorticity
117                              CALL iom_put( "vtrd_pvo", pvtrd )
118      CASE( jpdyn_rvo )   ;   CALL iom_put( "utrd_rvo", putrd )    ! relative  vorticity     (or metric term)
119                              CALL iom_put( "vtrd_rvo", pvtrd )
120      CASE( jpdyn_keg )   ;   CALL iom_put( "utrd_keg", putrd )    ! Kinetic Energy gradient (or had)
121                              CALL iom_put( "vtrd_keg", pvtrd )
122                              ALLOCATE( z3dx(jpi,jpj,jpk) , z3dy(jpi,jpj,jpk) )
123                              z3dx(:,:,:) = 0._wp                  ! U.dxU & V.dyV (approximation)
124                              z3dy(:,:,:) = 0._wp
125                              DO_3D_00_00( 1, jpkm1 )
126                                 z3dx(ji,jj,jk) = uu(ji,jj,jk,Kmm) * ( uu(ji+1,jj,jk,Kmm) - uu(ji-1,jj,jk,Kmm) ) / ( 2._wp * e1u(ji,jj) )
127                                 z3dy(ji,jj,jk) = vv(ji,jj,jk,Kmm) * ( vv(ji,jj+1,jk,Kmm) - vv(ji,jj-1,jk,Kmm) ) / ( 2._wp * e2v(ji,jj) )
128                              END_3D
129                              CALL lbc_lnk_multi( 'trddyn', z3dx, 'U', -1., z3dy, 'V', -1. )
130                              CALL iom_put( "utrd_udx", z3dx  )
131                              CALL iom_put( "vtrd_vdy", z3dy  )
132                              DEALLOCATE( z3dx , z3dy )
133      CASE( jpdyn_zad )   ;   CALL iom_put( "utrd_zad", putrd )    ! vertical advection
134                              CALL iom_put( "vtrd_zad", pvtrd )
135      CASE( jpdyn_ldf )   ;   CALL iom_put( "utrd_ldf", putrd )    ! lateral  diffusion
136                              CALL iom_put( "vtrd_ldf", pvtrd )
137      CASE( jpdyn_zdf )   ;   CALL iom_put( "utrd_zdf", putrd )    ! vertical diffusion
138                              CALL iom_put( "vtrd_zdf", pvtrd )
139                              !
140                              !                                    ! wind stress trends
141                              ALLOCATE( z2dx(jpi,jpj) , z2dy(jpi,jpj) )
142                              z2dx(:,:) = ( utau_b(:,:) + utau(:,:) ) / ( e3u(:,:,1,Kmm) * rau0 )
143                              z2dy(:,:) = ( vtau_b(:,:) + vtau(:,:) ) / ( e3v(:,:,1,Kmm) * rau0 )
144                              CALL iom_put( "utrd_tau", z2dx )
145                              CALL iom_put( "vtrd_tau", z2dy )
146                              DEALLOCATE( z2dx , z2dy )
147!!gm  to be changed : computation should be done in dynzdf.F90
148!!gm                + missing the top friction
149!                              !                                    ! bottom stress tends (implicit case)
150!                              IF( ln_drgimp ) THEN
151!                                 ALLOCATE( z3dx(jpi,jpj,jpk) , z3dy(jpi,jpj,jpk) )
152!                             z3dx(:,:,:) = 0._wp   ;   z3dy(:,:,:) = 0._wp  ! after velocity known (now filed at this stage)
153!                            DO jk = 1, jpkm1
154!                                    DO jj = 2, jpjm1
155!                                       DO ji = 2, jpim1
156!                                      ikbu = mbku(ji,jj)          ! deepest ocean u- & v-levels
157!                                          ikbv = mbkv(ji,jj)
158!                                          z3dx(ji,jj,jk) = 0.5 * ( rCdU_bot(ji+1,jj) + rCdU_bot(ji,jj) ) &
159!                                               &         * uu(ji,jj,ikbu,Kmm) / e3u(ji,jj,ikbu,Kmm)
160!                                          z3dy(ji,jj,jk) = 0.5 * ( rCdU_bot(ji,jj+1) + rCdU_bot(ji,jj) ) &
161!                                               &         * vv(ji,jj,ikbv,Kmm) / e3v(ji,jj,ikbv,Kmm)
162!                                    END DO
163!                                 END DO
164!                              END DO
165!                              CALL lbc_lnk_multi( 'trddyn', z3dx, 'U', -1., z3dy, 'V', -1. )
166!                              CALL iom_put( "utrd_bfr", z3dx )
167!                              CALL iom_put( "vtrd_bfr", z3dy )
168!                                 DEALLOCATE( z3dx , z3dy )
169!                              ENDIF
170!!gm end
171      CASE( jpdyn_bfr )       ! called if ln_drgimp=F
172                              CALL iom_put( "utrd_bfr", putrd )    ! bottom friction (explicit case)
173                              CALL iom_put( "vtrd_bfr", pvtrd )
174      CASE( jpdyn_atf )   ;   CALL iom_put( "utrd_atf", putrd )        ! asselin filter trends
175                              CALL iom_put( "vtrd_atf", pvtrd )
176      END SELECT
177      !
178   END SUBROUTINE trd_dyn_iom
179
180   !!======================================================================
181END MODULE trddyn
Note: See TracBrowser for help on using the repository browser.