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/branches/UKMO/NEMO_4.0_momentum_trends/src/OCE/TRD – NEMO

source: NEMO/branches/UKMO/NEMO_4.0_momentum_trends/src/OCE/TRD/trddyn.F90

Last change on this file was 11917, checked in by davestorkey, 4 years ago

UKMO/NEMO_4.0_momentum_trends :

  1. Refactor so that ZDF trend always includes all bottom friction contributions. The budget can now be closed by including the ZDF trend without any BFR trends.
  1. Some tidying of trddyn.F90.
File size: 18.7 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   USE trd_oce        ! trends: ocean variables
21   USE trdken         ! trends: Kinetic ENergy
22   USE trdglo         ! trends: global domain averaged
23   USE trdvor         ! trends: vertical averaged vorticity
24   USE trdmxl         ! trends: mixed layer averaged
25   !
26   USE in_out_manager ! I/O manager
27   USE lbclnk         ! lateral boundary condition
28   USE iom            ! I/O manager library
29   USE lib_mpp        ! MPP library
30
31   IMPLICIT NONE
32   PRIVATE
33
34   PUBLIC trd_dyn        ! called by all dynXXX modules
35
36   INTERFACE trd_dyn
37      module procedure trd_dyn_3d, trd_dyn_2d
38   END INTERFACE
39
40   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: zutrd_hpg, zvtrd_hpg
41   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: zutrd_pvo, zvtrd_pvo
42   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: zutrd_bfr, zvtrd_bfr
43   REAL(wp), ALLOCATABLE, DIMENSION(:,:)  , SAVE :: zutrd_tau, zvtrd_tau
44
45   !! * Substitutions
46#  include "vectopt_loop_substitute.h90"
47   !!----------------------------------------------------------------------
48   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
49   !! $Id$
50   !! Software governed by the CeCILL license (see ./LICENSE)
51   !!----------------------------------------------------------------------
52CONTAINS
53
54   SUBROUTINE trd_dyn_3d( putrd, pvtrd, ktrd, kt )
55      !!---------------------------------------------------------------------
56      !!                  ***  ROUTINE trd_dyn_3d  ***
57      !!
58      !! ** Purpose :   Dispatch momentum trend computation, e.g. 3D output,
59      !!              integral constraints, barotropic vorticity, kinetic enrgy,
60      !!              and/or mixed layer budget.
61      !!----------------------------------------------------------------------
62      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends
63      INTEGER                   , INTENT(in   ) ::   ktrd           ! trend index
64      INTEGER                   , INTENT(in   ) ::   kt             ! time step
65      REAL(wp), ALLOCATABLE, DIMENSION(:,:)     ::   zue, zve       ! temporary 2D arrays
66      INTEGER                                   ::   jk
67      !!----------------------------------------------------------------------
68      !
69      putrd(:,:,:) = putrd(:,:,:) * umask(:,:,:)                       ! mask the trends
70      pvtrd(:,:,:) = pvtrd(:,:,:) * vmask(:,:,:)
71      !
72
73!!gm NB : here a lbc_lnk should probably be added
74
75      SELECT CASE( ktrd )
76      CASE( jpdyn_hpg_save ) 
77         !
78         ! save 3D HPG trends to possibly have barotropic part corrected later before writing out
79         ALLOCATE( zutrd_hpg(jpi,jpj,jpk), zvtrd_hpg(jpi,jpj,jpk) )
80         zutrd_hpg(:,:,:) = putrd(:,:,:)
81         zvtrd_hpg(:,:,:) = pvtrd(:,:,:)
82
83      CASE( jpdyn_pvo_save ) 
84         !
85         ! save 3D coriolis trends to possibly have barotropic part corrected later before writing out
86         ALLOCATE( zutrd_pvo(jpi,jpj,jpk), zvtrd_pvo(jpi,jpj,jpk) )
87         zutrd_pvo(:,:,:) = putrd(:,:,:)
88         zvtrd_pvo(:,:,:) = pvtrd(:,:,:)
89
90      CASE( jpdyn_spg ) 
91         ! For explicit scheme SPG trends come here as 3D fields
92         ! Add SPG trend to 3D HPG trend and also output as 2D diagnostic in own right.
93         CALL trd_dyn_iom_2d( putrd(:,:,1), pvtrd(:,:,1), jpdyn_spg, kt ) 
94         putrd(:,:,:) = putrd(:,:,:) + zutrd_hpg(:,:,:) 
95         pvtrd(:,:,:) = pvtrd(:,:,:) + zvtrd_hpg(:,:,:) 
96         DEALLOCATE( zutrd_hpg, zvtrd_hpg )
97
98      CASE( jpdyn_bfr )
99         !
100         ! Add 3D part of BFR trend minus its depth-mean part to depth-mean trend already saved.
101         ALLOCATE( zue(jpi,jpj), zve(jpi,jpj) )
102         zue(:,:) = e3u_a(:,:,1) * putrd(:,:,1) * umask(:,:,1)
103         zve(:,:) = e3v_a(:,:,1) * pvtrd(:,:,1) * vmask(:,:,1)
104         DO jk = 2, jpkm1
105            zue(:,:) = zue(:,:) + e3u_a(:,:,jk) * putrd(:,:,jk) * umask(:,:,jk)
106            zve(:,:) = zve(:,:) + e3v_a(:,:,jk) * pvtrd(:,:,jk) * vmask(:,:,jk)
107         END DO
108         DO jk = 1, jpkm1
109            putrd(:,:,jk) = zutrd_bfr(:,:,jk) + putrd(:,:,jk) - zue(:,:) * r1_hu_a(:,:)
110            pvtrd(:,:,jk) = zvtrd_bfr(:,:,jk) + pvtrd(:,:,jk) - zve(:,:) * r1_hv_a(:,:)
111         END DO
112         ! Update locally saved BFR trends to add to ZDF trend.
113         zutrd_bfr(:,:,:) = putrd(:,:,:) 
114         zvtrd_bfr(:,:,:) = pvtrd(:,:,:)
115
116      CASE( jpdyn_zdf ) 
117         ! ZDF trend: Remove barotropic component and add wind stress and bottom friction
118         !            trends from dynspg_ts. Also adding on the bottom stress for the
119         !            baroclinic solution in the case of explicit bottom friction.
120         ALLOCATE( zue(jpi,jpj), zve(jpi,jpj) )
121         zue(:,:) = e3u_a(:,:,1) * putrd(:,:,1) * umask(:,:,1)
122         zve(:,:) = e3v_a(:,:,1) * pvtrd(:,:,1) * vmask(:,:,1)
123         DO jk = 2, jpkm1
124            zue(:,:) = zue(:,:) + e3u_a(:,:,jk) * putrd(:,:,jk) * umask(:,:,jk)
125            zve(:,:) = zve(:,:) + e3v_a(:,:,jk) * pvtrd(:,:,jk) * vmask(:,:,jk)
126         END DO
127         DO jk = 1, jpkm1
128            putrd(:,:,jk) = zutrd_tau(:,:) + zutrd_bfr(:,:,jk) + putrd(:,:,jk) - zue(:,:) * r1_hu_a(:,:)
129            pvtrd(:,:,jk) = zutrd_tau(:,:) + zvtrd_bfr(:,:,jk) + pvtrd(:,:,jk) - zve(:,:) * r1_hv_a(:,:)
130         END DO
131         DEALLOCATE( zue, zve, zutrd_tau, zvtrd_tau, zutrd_bfr, zvtrd_bfr )
132
133      END SELECT
134
135      IF ( ktrd /= jpdyn_hpg_save .AND. ktrd /= jpdyn_pvo_save ) THEN
136         !
137         !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
138         !   3D output of momentum and/or tracers trends using IOM interface
139         !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
140         IF( ln_dyn_trd )   CALL trd_dyn_iom_3d( putrd, pvtrd, ktrd, kt )
141
142         !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
143         !  Integral Constraints Properties for momentum and/or tracers trends
144         !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
145         IF( ln_glo_trd )   CALL trd_glo( putrd, pvtrd, ktrd, 'DYN', kt )
146
147         !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
148         !  Kinetic Energy trends
149         !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
150         IF( ln_KE_trd  )   CALL trd_ken( putrd, pvtrd, ktrd, kt )
151
152         !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
153         !  Vorticity trends
154         !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
155         IF( ln_vor_trd )   CALL trd_vor( putrd, pvtrd, ktrd, kt )
156
157         !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
158         !  Mixed layer trends for active tracers
159         !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
160         !!gm      IF( ln_dyn_mxl )   CALL trd_mxl_dyn   
161         !
162      ENDIF
163      !
164   END SUBROUTINE trd_dyn_3d
165
166
167   SUBROUTINE trd_dyn_2d( putrd, pvtrd, ktrd, kt )
168      !!---------------------------------------------------------------------
169      !!                  ***  ROUTINE trd_mod  ***
170      !!
171      !! ** Purpose :   Dispatch momentum trend computation, e.g. 2D output,
172      !!              integral constraints, barotropic vorticity, kinetic enrgy,
173      !!              and/or mixed layer budget.
174      !!----------------------------------------------------------------------
175      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends
176      INTEGER                 , INTENT(in   ) ::   ktrd           ! trend index
177      INTEGER                 , INTENT(in   ) ::   kt             ! time step
178      INTEGER                                 ::   jk
179      !!----------------------------------------------------------------------
180      !
181      putrd(:,:) = putrd(:,:) * umask(:,:,1)                       ! mask the trends
182      pvtrd(:,:) = pvtrd(:,:) * vmask(:,:,1)
183      !
184
185!!gm NB : here a lbc_lnk should probably be added
186
187      SELECT CASE(ktrd)
188
189      CASE ( jpdyn_hpg_corr )
190         !
191         ! Remove "first-guess" SPG trend from 3D HPG trend.
192         DO jk = 1, jpkm1
193            zutrd_hpg(:,:,jk) = zutrd_hpg(:,:,jk) - putrd(:,:)
194            zvtrd_hpg(:,:,jk) = zvtrd_hpg(:,:,jk) - pvtrd(:,:)
195         ENDDO
196
197      CASE( jpdyn_pvo_corr )
198         !
199         ! Remove "first-guess" barotropic coriolis trend from 3D PVO trend.
200         DO jk = 1, jpkm1
201            zutrd_pvo(:,:,jk) = zutrd_pvo(:,:,jk) - putrd(:,:)
202            zvtrd_pvo(:,:,jk) = zvtrd_pvo(:,:,jk) - pvtrd(:,:)
203         ENDDO
204
205      CASE( jpdyn_spg )
206          !
207          ! For split-explicit scheme SPG trends come here as 2D fields
208          ! Add SPG trend to 3D HPG trend and also output as 2D diagnostic in own right.
209          DO jk = 1, jpkm1
210             zutrd_hpg(:,:,jk) = zutrd_hpg(:,:,jk) + putrd(:,:)
211             zvtrd_hpg(:,:,jk) = zvtrd_hpg(:,:,jk) + pvtrd(:,:)
212          ENDDO
213          CALL trd_dyn_3d( zutrd_hpg, zvtrd_hpg, jpdyn_hpg, kt )
214          DEALLOCATE( zutrd_hpg, zvtrd_hpg )
215
216      CASE( jpdyn_pvo )
217          !
218          ! Add 2D PVO trend to 3D PVO trend and also output as diagnostic in own right.
219          DO jk = 1, jpkm1
220             zutrd_pvo(:,:,jk) = zutrd_pvo(:,:,jk) + putrd(:,:)
221             zvtrd_pvo(:,:,jk) = zvtrd_pvo(:,:,jk) + pvtrd(:,:)
222          ENDDO
223          CALL trd_dyn_3d( zutrd_pvo, zvtrd_pvo, jpdyn_pvo, kt )
224          DEALLOCATE( zutrd_pvo, zvtrd_pvo )
225
226      CASE( jpdyn_tau )
227          !
228          ! Save 2D wind forcing trend locally (to be added to ZDF trend)
229          ! and output as a trend in its own right.
230          ALLOCATE( zutrd_tau(jpi,jpj), zvtrd_tau(jpi,jpj) )
231          zutrd_tau(:,:) = putrd(:,:)
232          zvtrd_tau(:,:) = pvtrd(:,:)
233
234      CASE( jpdyn_bfr )
235          !
236          ! Create 3D BFR trend from 2D field and also output 2D field as diagnostic in own right.
237          ALLOCATE( zutrd_bfr(jpi,jpj,jpk), zvtrd_bfr(jpi,jpj,jpk) )
238          zutrd_bfr(:,:,:) = 0.0
239          zvtrd_bfr(:,:,:) = 0.0
240          DO jk = 1, jpkm1
241             zutrd_bfr(:,:,jk) = putrd(:,:) * umask(:,:,jk)
242             zvtrd_bfr(:,:,jk) = pvtrd(:,:) * vmask(:,:,jk)
243          ENDDO
244
245      END SELECT
246
247      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
248      !   2D output of momentum and/or tracers trends using IOM interface
249      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
250      IF( ln_dyn_trd )   CALL trd_dyn_iom_2d( putrd, pvtrd, ktrd, kt )
251         
252
253!!$   CALLS TO THESE ROUTINES FOR 2D DIAGOSTICS NOT CODED YET
254!!$      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
255!!$      !  Integral Constraints Properties for momentum and/or tracers trends
256!!$      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
257!!$      IF( ln_glo_trd )   CALL trd_glo( putrd, pvtrd, ktrd, 'DYN', kt )
258!!$
259!!$      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
260!!$      !  Kinetic Energy trends
261!!$      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
262!!$      IF( ln_KE_trd  )   CALL trd_ken( putrd, pvtrd, ktrd, kt )
263!!$
264!!$      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
265!!$      !  Vorticity trends
266!!$      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
267!!$      IF( ln_vor_trd )   CALL trd_vor( putrd, pvtrd, ktrd, kt )
268
269      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
270      !  Mixed layer trends for active tracers
271      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
272!!gm      IF( ln_dyn_mxl )   CALL trd_mxl_dyn   
273      !
274   END SUBROUTINE trd_dyn_2d
275
276
277   SUBROUTINE trd_dyn_iom_3d( putrd, pvtrd, ktrd, kt )
278      !!---------------------------------------------------------------------
279      !!                  ***  ROUTINE trd_dyn_iom  ***
280      !!
281      !! ** Purpose :   output 3D trends using IOM
282      !!----------------------------------------------------------------------
283      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends
284      INTEGER                   , INTENT(in   ) ::   ktrd           ! trend index
285      INTEGER                   , INTENT(in   ) ::   kt             ! time step
286      !
287      INTEGER ::   ji, jj, jk   ! dummy loop indices
288      INTEGER ::   ikbu, ikbv   ! local integers
289      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   z2dx, z2dy   ! 2D workspace
290      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   z3dx, z3dy   ! 3D workspace
291      !!----------------------------------------------------------------------
292      !
293      SELECT CASE( ktrd )
294      CASE( jpdyn_hpg )   ;   CALL iom_put( "utrd_hpg", putrd )    ! hydrostatic pressure gradient
295                              CALL iom_put( "vtrd_hpg", pvtrd )
296      CASE( jpdyn_pvo )   ;   CALL iom_put( "utrd_pvo", putrd )    ! planetary vorticity
297                              CALL iom_put( "vtrd_pvo", pvtrd )
298      CASE( jpdyn_rvo )   ;   CALL iom_put( "utrd_rvo", putrd )    ! relative  vorticity     (or metric term)
299                              CALL iom_put( "vtrd_rvo", pvtrd )
300      CASE( jpdyn_keg )   ;   CALL iom_put( "utrd_keg", putrd )    ! Kinetic Energy gradient (or had)
301                              CALL iom_put( "vtrd_keg", pvtrd )
302                              ALLOCATE( z3dx(jpi,jpj,jpk) , z3dy(jpi,jpj,jpk) )
303                              z3dx(:,:,:) = 0._wp                  ! U.dxU & V.dyV (approximation)
304                              z3dy(:,:,:) = 0._wp
305                              DO jk = 1, jpkm1   ! no mask as un,vn are masked
306                                 DO jj = 2, jpjm1
307                                    DO ji = 2, jpim1
308                                       z3dx(ji,jj,jk) = un(ji,jj,jk) * ( un(ji+1,jj,jk) - un(ji-1,jj,jk) ) / ( 2._wp * e1u(ji,jj) )
309                                       z3dy(ji,jj,jk) = vn(ji,jj,jk) * ( vn(ji,jj+1,jk) - vn(ji,jj-1,jk) ) / ( 2._wp * e2v(ji,jj) )
310                                    END DO
311                                 END DO
312                              END DO
313                              CALL lbc_lnk_multi( 'trddyn', z3dx, 'U', -1., z3dy, 'V', -1. )
314                              CALL iom_put( "utrd_udx", z3dx  )
315                              CALL iom_put( "vtrd_vdy", z3dy  )
316                              DEALLOCATE( z3dx , z3dy )
317      CASE( jpdyn_zad )   ;   CALL iom_put( "utrd_zad", putrd )    ! vertical advection
318                              CALL iom_put( "vtrd_zad", pvtrd )
319      CASE( jpdyn_ldf )   ;   CALL iom_put( "utrd_ldf", putrd )    ! lateral  diffusion
320                              CALL iom_put( "vtrd_ldf", pvtrd )
321      CASE( jpdyn_zdf )   ;   CALL iom_put( "utrd_zdf", putrd )    ! vertical diffusion
322                              CALL iom_put( "vtrd_zdf", pvtrd )
323                              !
324                              !                                    ! wind stress trends
325                              ALLOCATE( z2dx(jpi,jpj) , z2dy(jpi,jpj) )
326                              z2dx(:,:) = ( utau_b(:,:) + utau(:,:) ) / ( e3u_n(:,:,1) * rau0 )
327                              z2dy(:,:) = ( vtau_b(:,:) + vtau(:,:) ) / ( e3v_n(:,:,1) * rau0 )
328                              CALL iom_put( "utrd_tau", z2dx )
329                              CALL iom_put( "vtrd_tau", z2dy )
330                              DEALLOCATE( z2dx , z2dy )
331      CASE( jpdyn_bfr )   ;   CALL iom_put( "utrd_bfr", putrd )    ! bottom friction (explicit case)
332                              CALL iom_put( "vtrd_bfr", pvtrd )
333      CASE( jpdyn_bfri)   ;   CALL iom_put( "utrd_bfri", putrd )    ! bottom friction (implicit case)
334                              CALL iom_put( "vtrd_bfri", pvtrd )
335      CASE( jpdyn_atf )   ;   CALL iom_put( "utrd_atf", putrd )        ! asselin filter trends
336                              CALL iom_put( "vtrd_atf", pvtrd )
337      END SELECT
338      !
339   END SUBROUTINE trd_dyn_iom_3d
340
341
342   SUBROUTINE trd_dyn_iom_2d( putrd, pvtrd, ktrd, kt )
343      !!---------------------------------------------------------------------
344      !!                  ***  ROUTINE trd_dyn_iom  ***
345      !!
346      !! ** Purpose :   output 2D trends using IOM
347      !!----------------------------------------------------------------------
348      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends
349      INTEGER                 , INTENT(in   ) ::   ktrd           ! trend index
350      INTEGER                 , INTENT(in   ) ::   kt             ! time step
351      !
352      INTEGER ::   ji, jj, jk   ! dummy loop indices
353      INTEGER ::   ikbu, ikbv   ! local integers
354      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   z2dx, z2dy   ! 2D workspace
355      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   z3dx, z3dy   ! 3D workspace
356      !!----------------------------------------------------------------------
357      !
358      SELECT CASE( ktrd )
359      CASE( jpdyn_spg )      ;   CALL iom_put( "utrd_spg2d", putrd )      ! surface pressure gradient
360                                 CALL iom_put( "vtrd_spg2d", pvtrd )
361      CASE( jpdyn_pvo )      ;   CALL iom_put( "utrd_pvo2d", putrd )      ! planetary vorticity (barotropic part)
362                                 CALL iom_put( "vtrd_pvo2d", pvtrd )
363      CASE( jpdyn_hpg_corr ) ;   CALL iom_put( "utrd_hpg_corr", putrd )   ! horizontal pressure gradient correction
364                                 CALL iom_put( "vtrd_hpg_corr", pvtrd )
365      CASE( jpdyn_pvo_corr ) ;   CALL iom_put( "utrd_pvo_corr", putrd )   ! planetary vorticity correction
366                                 CALL iom_put( "vtrd_pvo_corr", pvtrd )
367      CASE( jpdyn_bfr )      ;   CALL iom_put( "utrd_bfr2d", putrd )      ! bottom friction due to barotropic currents
368                                 CALL iom_put( "vtrd_bfr2d", pvtrd )
369      END SELECT
370      !
371   END SUBROUTINE trd_dyn_iom_2d
372
373   !!======================================================================
374END MODULE trddyn
Note: See TracBrowser for help on using the repository browser.