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 branches/2012/dev_r3309_LOCEAN12_Ediag/NEMOGCM/NEMO/OPA_SRC/TRD – NEMO

source: branches/2012/dev_r3309_LOCEAN12_Ediag/NEMOGCM/NEMO/OPA_SRC/TRD/trddyn.F90 @ 3318

Last change on this file since 3318 was 3318, checked in by gm, 12 years ago

Ediag branche: #927 split TRA/DYN trd computation

  • Property svn:keywords set to Id
File size: 9.9 KB
RevLine 
[3318]1MODULE trddyn
[215]2   !!======================================================================
[3318]3   !!                       ***  MODULE  trddyn  ***
4   !! Ocean diagnostics:  ocean dynamic trends
[215]5   !!=====================================================================
[3318]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
[503]8   !!----------------------------------------------------------------------
[3318]9
[215]10   !!----------------------------------------------------------------------
[3318]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
[215]14   !!----------------------------------------------------------------------
[3317]15   USE oce            ! ocean dynamics and tracers variables
16   USE dom_oce        ! ocean space and time domain variables
17   USE zdf_oce        ! ocean vertical physics variables
[3318]18   USE trd_oce        ! trends: ocean variables
[3317]19   USE zdfbfr         ! bottom friction
20   USE ldftra_oce     ! ocean active tracers lateral physics
21   USE sbc_oce        ! surface boundary condition: ocean
22   USE phycst         ! physical constants
23   USE trdvor         ! ocean vorticity trends
[3318]24   USE trdglo         ! trends:global domain averaged
[3317]25   USE trdmld         ! ocean active mixed layer tracers trends
26   USE in_out_manager ! I/O manager
27   USE iom            ! I/O manager library
28   USE lib_mpp        ! MPP library
29   USE wrk_nemo       ! Memory allocation
[215]30
31   IMPLICIT NONE
32   PRIVATE
33
[3318]34   REAL(wp) ::   r2dt    ! time-step, = 2 rdttra except at nit000 (=rdttra) if neuler=0
[215]35
[3318]36   PUBLIC trd_dyn        ! called by all dynXX modules
[503]37
[215]38   !! * Substitutions
39#  include "domzgr_substitute.h90"
40#  include "vectopt_loop_substitute.h90"
41   !!----------------------------------------------------------------------
[2528]42   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
[888]43   !! $Id$
[2715]44   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[215]45   !!----------------------------------------------------------------------
46CONTAINS
47
[3318]48   SUBROUTINE trd_dyn( putrd, pvtrd, ktrd, kt )
[215]49      !!---------------------------------------------------------------------
50      !!                  ***  ROUTINE trd_mod  ***
51      !!
[3318]52      !! ** Purpose :   Dispatch momentum trend computation, e.g. 3D output,
53      !!              integral constraints, barotropic vorticity, kinetic enrgy,
54      !!              and/or mixed layer budget.
[503]55      !!----------------------------------------------------------------------
[3318]56      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends
57      INTEGER                   , INTENT(in   ) ::   ktrd           ! trend index
58      INTEGER                   , INTENT(in   ) ::   kt             ! time step
[215]59      !!
[2715]60      INTEGER ::   ji, jj   ! dummy loop indices
[3316]61      REAL(wp), POINTER, DIMENSION(:,:) ::   ztswu, ztswv    ! 2D workspace
[215]62      !!----------------------------------------------------------------------
63
[3316]64      CALL wrk_alloc( jpi, jpj, ztswu, ztswv )
[215]65
[3316]66      IF( neuler == 0 .AND. kt == nit000    ) THEN   ;   r2dt =      rdt      ! = rdtra (restart with Euler time stepping)
67      ELSEIF(               kt <= nit000 + 1) THEN   ;   r2dt = 2. * rdt      ! = 2 rdttra (leapfrog)
[503]68      ENDIF
[215]69
[3318]70      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
71      !   3D output of momentum and/or tracers trends using IOM interface
72      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
73      IF( ln_dyn_trd )   CALL trd_dyn_iom( putrd, pvtrd, ktrd, kt )
74         
75      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
76      !  Integral Constraints Properties for momentum and/or tracers trends
77      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
78      IF( ln_glo_trd  )   CALL trd_glo( putrd, pvtrd, ktrd, 'DYN', kt )
[215]79
[3318]80      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
81      !  Kinetic Energy trends
82      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
83!!gm      IF( ln_KE_trd  )   CALL trd_KE( putrd, pvtrd, ktrd, kt )
[215]84
[3318]85      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
86      !  Vorticity trends
[215]87      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
[3318]88      IF( ln_vor_trd  )   CALL trd_vor( putrd, pvtrd, ktrd, kt )
89
90      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
91      !  Mixed layer trends for active tracers
[215]92      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
[3318]93!!gm      IF( ln_dyn_mld )   CALL trd_mld_dyn   
[2528]94      !
[3316]95      CALL wrk_dealloc( jpi, jpj, ztswu, ztswv )
[2715]96      !
[3318]97   END SUBROUTINE trd_dyn
[215]98
[3316]99
[3318]100   SUBROUTINE trd_dyn_iom( putrd, pvtrd, ktrd, kt )
[3316]101      !!---------------------------------------------------------------------
[3318]102      !!                  ***  ROUTINE trd_dyn_iom  ***
[3316]103      !!
104      !! ** Purpose :   output 3D trends using IOM
105      !!----------------------------------------------------------------------
[3318]106      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends
107      INTEGER                   , INTENT(in   ) ::   ktrd           ! trend index
108      INTEGER                   , INTENT(in   ) ::   kt             ! time step
109      !
[3316]110      INTEGER ::   ji, jj, jk   ! dummy loop indices
[3317]111      INTEGER ::   ikbu, ikbv   ! local integers
112      REAL(wp), POINTER, DIMENSION(:,:)   ::   z2dx, z2dy, ztswu, ztswv   ! 2D workspace
113      REAL(wp), POINTER, DIMENSION(:,:,:) ::   z3dx, z3dy                 ! 3D workspace
[3316]114      !!----------------------------------------------------------------------
[3318]115      !
116      putrd(:,:,:) = putrd(:,:,:) * umask(:,:,:)                       ! mask the trends
117      pvtrd(:,:,:) = pvtrd(:,:,:) * vmask(:,:,:)
[3316]118
[3318]119!!gm NB : here a lbc_lnk should probably be added
[3317]120
[3318]121      !
122      SELECT CASE( ktrd )
123      CASE( jpdyn_hpg )   ;   CALL iom_put( "utrd_hpg", putrd )    ! hydrostatic pressure gradient
124                              CALL iom_put( "vtrd_hpg", pvtrd )
125      CASE( jpdyn_spg )   ;   CALL iom_put( "utrd_spg", putrd )    ! surface pressure gradient
126                              CALL iom_put( "vtrd_spg", pvtrd )
127      CASE( jpdyn_pvo )   ;   CALL iom_put( "utrd_pvo", putrd )    ! planetary vorticity
128                              CALL iom_put( "vtrd_pvo", pvtrd )
129      CASE( jpdyn_rvo )   ;   CALL iom_put( "utrd_rvo", putrd )    ! relative  vorticity     (or metric term)
130                              CALL iom_put( "vtrd_rvo", pvtrd )
131      CASE( jpdyn_keg )   ;   CALL iom_put( "utrd_keg", putrd )    ! Kinetic Energy gradient (or had)
132                              CALL iom_put( "vtrd_keg", pvtrd )
133         z3dx(:,:,:) = 0._wp                                           ! U.dxU & V.dyV (approximation)
134         z3dy(:,:,:) = 0._wp
135         DO jk = 1, jpkm1                                                  ! no mask as un,vn are masked
136            DO jj = 2, jpjm1
137                DO ji = 2, jpim1
138                  z3dx(ji,jj,jk) = un(ji,jj,jk) * ( un(ji+1,jj,jk) - un(ji-1,jj,jk) ) / ( 2._wp * e1u(ji,jj) )
139                  z3dy(ji,jj,jk) = vn(ji,jj,jk) * ( vn(ji,jj+1,jk) - vn(ji,jj-1,jk) ) / ( 2._wp * e2v(ji,jj) )
140               END DO
141            END DO
142         END DO
143         CALL lbc_lnk( z3dx, 'U', -1. )   ;    CALL lbc_lnk( z3dy, 'V', -1. )
144                              CALL iom_put( "utrd_udx", z3dx  ) 
145                              CALL iom_put( "vtrd_vdy", z3dy  )
146      CASE( jpdyn_zad )   ;   CALL iom_put( "utrd_zad", putrd )    ! vertical   advection
147                              CALL iom_put( "vtrd_zad", pvtrd )
148      CASE( jpdyn_ldf )   ;   CALL iom_put( "utrd_ldf", putrd )    ! lateral diffusion
149                              CALL iom_put( "vtrd_ldf", pvtrd )
150      CASE( jpdyn_zdf )   ;   CALL iom_put( "utrd_zdf", putrd )    ! vertical diffusion
151                              CALL iom_put( "vtrd_zdf", pvtrd )
152                              !                                    ! wind stress trends
153                              z2dx(:,:) = ( utau_b(ji,jj) + utau(ji,jj) ) / ( fse3u(:,:,1) * rau0 )
154                              z2dy(:,:) = ( vtau_b(ji,jj) + vtau(ji,jj) ) / ( fse3v(:,:,1) * rau0 )
155                              CALL iom_put( "utrd_tau", z2dx )
156                              CALL iom_put( "vtrd_tau", z2dy )
157      CASE( jpdyn_bfr )
158         IF( .NOT.ln_bfrimp )     CALL iom_put( "utrd_bfr", putrd )    ! bottom friction (explicit case)
159         IF( .NOT.ln_bfrimp )     CALL iom_put( "vtrd_bfr", pvtrd )
160!!gm only valid if ln_bfrimp=T otherwise the bottom stress as to be recomputed at the end of the compuation....
[3316]161
[3318]162      CASE( jpdyn_atf )   ;   CALL iom_put( "utrd_atf", putrd )    ! asselin filter trends
163                              CALL iom_put( "vtrd_atf", pvtrd )
164         IF( ln_bfrimp ) THEN                                          ! bottom friction (implicit case)
165            z3dx(:,:,:) = 0._wp   ;   z3dy(:,:,:) = 0._wp                 ! after velocity known (now filed at this stage)
166            DO jk = 1, jpkm1
[3316]167               DO jj = 2, jpjm1
168                  DO ji = 2, jpim1
[3318]169                     ikbu = mbku(ji,jj)          ! deepest ocean u- & v-levels
170                     ikbv = mbkv(ji,jj)
171                     z3dx(ji,jj,jk) = bfrua(ji,jj) * un(ji,jj,ikbu) / fse3u(ji,jj,ikbu)
172                     z3dy(ji,jj,jk) = bfrva(ji,jj) * vn(ji,jj,ikbv) / fse3v(ji,jj,ikbv)
[3316]173                  END DO
174               END DO
175            END DO
[3318]176                              CALL iom_put( "utrd_bfr", z3dx )    ! bottom friction (implicit)
177                              CALL iom_put( "vtrd_bfr", z3dy )
178         ENDIF
[3316]179         !
[3318]180      END SELECT
[3316]181      !
182      CALL wrk_dealloc( jpi, jpj     , z2dx, z2dy, ztswu, ztswv )
183      CALL wrk_dealloc( jpi, jpj, jpk, z3dx, z3dy )
184      !
[3318]185   END SUBROUTINE trd_dyn_iom
[3316]186
[215]187   !!======================================================================
[3318]188END MODULE trddyn
Note: See TracBrowser for help on using the repository browser.