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.
trdvor.F90 in trunk/NEMO/OPA_SRC/TRD – NEMO

source: trunk/NEMO/OPA_SRC/TRD/trdvor.F90 @ 193

Last change on this file since 193 was 129, checked in by opalod, 20 years ago

CT : UPDATE081 : indentation

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 13.3 KB
Line 
1MODULE trdvor
2   !!======================================================================
3   !!                       ***  MODULE  trdvor  ***
4   !! Ocean diagnostics:  momentum trends
5   !!=====================================================================
6   
7#if defined key_trd_vor   ||   defined key_esopa
8   !!----------------------------------------------------------------------
9   !!   'key_trd_vor'   : momentum trend diagnostics
10   !!----------------------------------------------------------------------
11   !!   trd_vor      : momentum trends averaged over the depth
12   !!----------------------------------------------------------------------
13   !! * Modules used
14   USE oce             ! ocean dynamics and tracers variables
15   USE dom_oce         ! ocean space and time domain variables
16   USE trddyn_oce      ! ocean active tracer trend variables
17   USE zdf_oce         ! ocean vertical physics
18   USE in_out_manager  ! I/O manager
19
20   USE phycst          ! Define parameters for the routines
21   USE ldfdyn_oce      ! ocean active tracers: lateral physics
22   USE daymod          ! calandar
23   USE dianam          ! build the name of file (routine)
24   USE ldfslp          ! iso-neutral slopes
25   USE zdfmxl
26   USE ioipsl
27   USE lbclnk
28
29   IMPLICIT NONE
30   PRIVATE
31
32
33   !! * Accessibility
34   PUBLIC trd_vor   ! routine called by step.F90
35
36   !! * Shared module variables
37   LOGICAL, PUBLIC ::   lk_trdvor = .TRUE.   ! momentum trend flag
38
39   !! * Module variables
40   INTEGER,PARAMETER :: jplvor=11
41   INTEGER ::                &
42      nh_t, nmoydpvor  ,     &
43      nidvor, nhoridvor,     &
44      ndexvor1(jpi*jpj),     &
45      ndimvor1             
46
47   REAL(wp), DIMENSION(jpi,jpj) ::  &
48     vor_avr    ,     &  ! average
49     vor_avrb   ,     &  ! before vorticity (kt-1)
50     vor_avrbb  ,     &  ! vorticity at begining of the nwrite-1 timestep averaging period
51      vor_avrbn ,     &  ! after vorticity at time step after the
52      rotot     ,     &  ! begining of the NWRITE-1 timesteps
53      udpvor    ,     &  ! total cumulative trends
54      vdpvor             ! "       "        "
55
56   REAL(wp), DIMENSION(jpi,jpj,jplvor)::   &  !: curl of trends
57      vortrd   
58
59   !! * Substitutions
60#  include "domzgr_substitute.h90"
61#  include "ldfdyn_substitute.h90"
62#  include "vectopt_loop_substitute.h90"
63
64   !!----------------------------------------------------------------------
65   !!   OPA 9.0 , LODYC-IPS (2004)
66   !!----------------------------------------------------------------------
67 
68CONTAINS
69
70   SUBROUTINE trd_vor( kt )
71      !!----------------------------------------------------------------------------
72      !!                  ***  ROUTINE trd_vor  ***
73      !!
74      !! ** Purpose :   computation of vertically integrated vorticity budgets
75      !!      from ocean surface down to control surface (NetCDF output)
76      !!
77      !! ** Method/usage :
78      !!      integration done over nwrite-1 time steps
79      !!
80      !!
81      !! ** Action :
82      !!            /commld/   :
83      !!                         vor_avr          average
84      !!                         vor_avrb         vorticity at kt-1
85      !!                         vor_avrbb        vorticity at begining of the NWRITE-1
86      !!                                          time steps averaging period
87      !!                         vor_avrbn         vorticity at time step after the
88      !!                                          begining of the NWRITE-1 time
89      !!                                          steps averaging period
90      !!
91      !!                 trends :
92      !!
93      !!                  vortrd (,,1) = Pressure Gradient Trend
94      !!                  vortrd (,,2) = KE Gradient Trend
95      !!                  vortrd (,,3) = Relative Vorticity Trend
96      !!                  vortrd (,,4) = Coriolis Term Trend
97      !!                  vortrd (,,5) = Horizontal Diffusion Trend
98      !!                  vortrd (,,6) = Vertical Advection Trend
99      !!                  vortrd (,,7) = Vertical Diffusion Trend
100      !!                  vortrd (,,8) = Surface Pressure Grad. Trend
101      !!                  vortrd (,,9) = Beta V
102      !!                  vortrd (,,10) = forcing term
103      !!      vortrd (,,11) = bottom friction term
104      !!                  rotot(,) : total cumulative trends over nwrite-1 time steps
105      !!                  vor_avrtot(,) : first membre of vrticity equation
106      !!                  vor_avrres(,) : residual = dh/dt entrainment
107      !!
108      !!      trends output in netCDF format using ioipsl
109      !!----------------------------------------------------------------------
110      !! * Arguments
111      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index
112
113      !! * Local declarations
114      INTEGER ilseq
115      INTEGER ji, jj, jk, jl, idebug, it
116
117      REAL(wp) :: zmean
118      REAL(wp) :: zun(jpi,jpj), zvn(jpi,jpj)
119      REAL(wp) :: zjulian, zsto, zout
120      REAL(wp) :: vor_avrtot(jpi,jpj), vor_avrres(jpi,jpj)
121      INTEGER(wp) :: ikbu,ikbum1,ikbv,ikbvm1
122      CHARACTER (len=12) ::   cvort
123      CHARACTER (len=40) ::   clhstnam
124      CHARACTER (len=40) ::   clop 
125     
126      NAMELIST/namtrd/ ntrd,nctls
127      !!----------------------------------------------------------------------
128     
129      !  ===================
130      !   0. initialization
131      !  ===================
132
133      cvort='averaged-vor'
134
135      ! Open specifier
136      ilseq = 1
137      idebug = 0      ! set it to 1 in case of problem to have more Print
138
139      IF( kt == nit000 ) THEN
140
141         ! namelist namtrd : trend diagnostic
142         REWIND( numnam )
143         READ  ( numnam, namtrd )
144
145         IF(lwp) THEN
146            WRITE(numout,*) 'namtrd'
147            WRITE(numout,*) ' '
148            WRITE(numout,*) ' time step frequency trend       ntrd  = ',ntrd
149            WRITE(numout,*) ' '
150         ENDIF
151
152         ! cumulated trends array init
153         nmoydpvor = 0
154         rotot(:,:)=0
155         vor_avrtot(:,:)=0
156         vor_avrres(:,:)=0
157      ENDIF
158
159      ! set before values of vertically average u and v
160
161      IF( kt > nit000 ) THEN
162         vor_avrb(:,:) = vor_avr(:,:)
163      ENDIF
164
165       IF( idebug /= 0 ) THEN
166          WRITE(numout,*) ' debuging trd_vor: 0. done '
167          CALL FLUSH(numout)
168      ENDIF
169
170      !  =================================
171      ! I. vertically integrated vorticity
172      !  =================================
173
174      vor_avr(:,:) = 0.
175      zun(:,:)=0
176      zvn(:,:)=0
177      vor_avrtot(:,:)=0
178      vor_avrres(:,:)=0
179     
180      ! vertically averaged velocity
181      DO jk = 1, jpk - 1
182         zun(:,:)=zun(:,:) + e1u(:,:)*un(:,:,jk)*fse3u(:,:,jk)
183         zvn(:,:)=zvn(:,:) + e2v(:,:)*vn(:,:,jk)*fse3v(:,:,jk)
184      END DO
185
186 
187      zun(:,:)=zun(:,:)*hur(:,:)
188      zvn(:,:)=zvn(:,:)*hvr(:,:)
189
190      !Curl
191      DO ji=1,jpim1
192         DO jj=1,jpjm1
193            vor_avr(ji,jj) = ((zvn(ji+1,jj)-zvn(ji,jj))-   &
194                              (zun(ji,jj+1)-zun(ji,jj)))   &
195                             /( e1f(ji,jj) * e2f(ji,jj) )
196            vor_avr(ji,jj) = vor_avr(ji,jj)*fmask(ji,jj,1)
197         END DO
198      END DO
199     
200     
201      IF(idebug /= 0) THEN
202         WRITE(numout,*) ' debuging trd_vor: I done'
203         CALL FLUSH(numout)
204      ENDIF
205     
206      !  =================================
207      !   II. netCDF output initialization
208      !  =================================
209
210#     include "trdvor_ncinit.h90"
211
212      IF( idebug /= 0 ) THEN
213         WRITE(numout,*) ' debuging trd_vor: II. done'
214         CALL FLUSH(numout)
215      ENDIF
216     
217      !  =====================================
218      !  III vertical integration of 3D trends
219      !  =====================================
220      ! Beta.V : intergration, no average
221      utrd(:,:,:,9)=utrd(:,:,:,4)
222      vtrd(:,:,:,9)=vtrd(:,:,:,4)
223
224      DO jl=1,jplvor
225
226         udpvor(:,:)=0
227         vdpvor(:,:)=0
228
229         !bottom friction
230         IF( jl == jplvor ) THEN
231       
232            CALL lbc_lnk( tautrd(:,:,3),  'U' , -1. )
233            CALL lbc_lnk( tautrd(:,:,4),  'V' , -1. )
234
235            DO jj = 2, jpjm1
236               DO ji = fs_2, fs_jpim1 
237                  ikbu   = min( mbathy(ji+1,jj), mbathy(ji,jj) )
238                  ikbum1 = max( ikbu-1, 1 )
239                  ikbv   = min( mbathy(ji,jj+1), mbathy(ji,jj) )
240                  ikbvm1 = max( ikbv-1, 1 )
241               
242                  udpvor(ji,jj)=tautrd(ji,jj,3)*fse3u(ji,jj,ikbum1)*e1u(ji,jj)*umask(ji,jj,ikbum1)
243                  vdpvor(ji,jj)=tautrd(ji,jj,4)*fse3v(ji,jj,ikbvm1)*e2v(ji,jj)*vmask(ji,jj,ikbvm1)
244               END DO
245            END DO
246
247         !wind stress
248         ELSE IF( jl == (jplvor-1) ) THEN
249
250            CALL lbc_lnk( tautrd(:,:,1),  'U' , -1. )
251            CALL lbc_lnk( tautrd(:,:,2),  'V' , -1. )
252
253            udpvor(:,:)=tautrd(:,:,1)*fse3u(:,:,1)*e1u(:,:)*umask(:,:,1)
254            vdpvor(:,:)=tautrd(:,:,2)*fse3v(:,:,1)*e2v(:,:)*vmask(:,:,1)
255
256         ELSE
257
258            CALL lbc_lnk( utrd(:,:,:,jl), 'U' , -1. )
259            CALL lbc_lnk( vtrd(:,:,:,jl), 'V' , -1. )
260
261            !utrd and vtrd terms
262            DO jk = 1,jpk
263              udpvor(:,:)=udpvor(:,:)+utrd(:,:,jk,jl)*fse3u(:,:,jk)*e1u(:,:)*umask(:,:,jk)
264              vdpvor(:,:)=vdpvor(:,:)+vtrd(:,:,jk,jl)*fse3v(:,:,jk)*e2v(:,:)*vmask(:,:,jk)
265            END DO
266
267         ENDIF
268
269         !average except for Beta.V
270         IF (jl/=9) THEN
271         udpvor(:,:) = udpvor(:,:) * hur(:,:)
272         vdpvor(:,:) = vdpvor(:,:) * hvr(:,:)
273         ENDIF
274   
275         !Curl
276         DO ji=1,jpim1
277            DO jj=1,jpjm1
278               vortrd(ji,jj,jl)=( vdpvor(ji+1,jj)-vdpvor(ji,jj)       &
279                                - ( udpvor(ji,jj+1)-udpvor(ji,jj) ) ) &
280                                / ( e1f(ji,jj) * e2f(ji,jj) )
281            END DO
282         END DO
283   
284         vortrd(:,:,9)=vortrd(:,:,9)*hur(:,:)
285   
286         !surface mask
287         DO ji=1,jpi
288            DO jj=1,jpj
289               vortrd(ji,jj,jl)=vortrd(ji,jj,jl)*fmask(ji,jj,1) !surface mask
290            END DO
291         END DO
292   
293      END DO
294
295      IF( idebug /= 0 ) THEN
296         IF(lwp) WRITE(numout,*) ' debuging trd_vor: III done'
297         CALL FLUSH(numout)
298      ENDIF
299
300      !  =================================
301      !   IV. Cumulated trends
302      !  =================================
303
304      ! IV.1 set `before' mixed layer values for kt = nit000+1
305      ! --------------------------------------------------------
306      IF( kt == nit000+1 ) THEN
307         vor_avrbb(:,:) = vor_avrb(:,:)
308         vor_avrbn(:,:) = vor_avr (:,:)
309      ENDIF
310
311      IF( idebug /= 0 ) THEN
312         WRITE(numout,*) ' debuging trd_vor: IV.1 done'
313         CALL FLUSH(numout)
314      ENDIF
315
316      ! IV.2 cumulated trends over analysis period (kt=2 to nwrite)
317      ! ----------------------
318      ! trends cumulated over nwrite-2 time steps
319
320      IF( kt >= nit000+2 ) THEN
321         nmoydpvor = nmoydpvor + 1
322         DO jl = 1, jplvor
323            IF( jl /= 9 ) THEN
324               rotot(:,:) = rotot(:,:) + vortrd(:,:,jl)
325            ENDIF
326         END DO
327      ENDIF
328
329      IF( idebug /= 0 ) THEN
330         WRITE(numout,*) ' debuging trd_vor: IV.2 done'
331         CALL FLUSH(numout)
332      ENDIF
333
334      !  =============================================
335      !   V. Output in netCDF + residual computation
336      !  =============================================
337      IF( MOD( kt - nit000+1, ntrd ) == 0 ) THEN
338
339         ! V.1 compute total trend
340         ! ------------------------
341         zmean = float(nmoydpvor)
342
343         vor_avrtot(:,:) = ( vor_avr(:,:) - vor_avrbn(:,:) + vor_avrb(:,:) - &
344                             vor_avrbb(:,:) ) /  (zmean * 2. * rdt)
345
346         IF( idebug /= 0 ) THEN
347             WRITE(numout,*) ' zmean = ',zmean
348             WRITE(numout,*) ' debuging trd_vor: V.1 done'
349             CALL FLUSH(numout)
350         ENDIF
351
352         ! V.2 compute residual
353         ! ---------------------
354         vor_avrres(:,:) = vor_avrtot(:,:) - rotot(:,:) / zmean
355
356         ! Boundary conditions
357         CALL lbc_lnk( vor_avrtot, 'F', 1. )
358         CALL lbc_lnk( vor_avrres, 'F', 1. )
359
360         IF( idebug /= 0 ) THEN
361            WRITE(numout,*) ' debuging trd_vor: V.2 done'
362            CALL FLUSH(numout)
363         ENDIF
364
365         ! V.3 time evolution array swap
366         ! ------------------------------
367         vor_avrbb(:,:) = vor_avrb(:,:)
368         vor_avrbn(:,:) = vor_avr(:,:)
369
370         IF( idebug /= 0 ) THEN
371            WRITE(numout,*) ' debuging trd_vor: V.3 done'
372            CALL FLUSH(numout)
373         ENDIF
374
375         nmoydpvor=0
376
377      ENDIF
378
379      ! V.5 write trends to output
380      ! ---------------------------
381      IF( kt >=  nit000+1 ) THEN
382
383#include "trdvor_ncwrite.h90"
384
385         IF( idebug /= 0 ) THEN
386            WRITE(numout,*) ' debuging trd_vor: IV.5 done'
387            CALL FLUSH(numout)
388         ENDIF
389
390      ENDIF
391
392      IF( MOD( kt - nit000+1, ntrd ) == 0 ) THEN
393         rotot(:,:)=0
394      ENDIF
395
396      IF( kt == nitend )  THEN
397         CALL histclo( nidvor )
398      ENDIF
399
400   END SUBROUTINE trd_vor
401
402#else
403   !!----------------------------------------------------------------------
404   !!   Default option :                                       Empty module
405   !!----------------------------------------------------------------------
406   LOGICAL, PUBLIC ::   lk_trdvor = .FALSE.   ! momentum trend flag
407CONTAINS
408   SUBROUTINE trd_vor( kt )        ! Empty routine
409      WRITE(*,*) 'trd_vor: You should not have seen this print! error?', kt
410   END SUBROUTINE trd_vor
411#endif
412
413   !!======================================================================
414END MODULE trdvor
Note: See TracBrowser for help on using the repository browser.