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 NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRD – NEMO

source: NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRD/trdvor.F90 @ 10946

Last change on this file since 10946 was 10946, checked in by acc, 5 years ago

2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps : Convert STO, TRD and USR modules and all knock on effects of these conversions. Note change to USR module may have implications for the TEST CASES (not tested yet). Standard SETTE tested only

  • Property svn:keywords set to Id
File size: 26.1 KB
Line 
1MODULE trdvor
2   !!======================================================================
3   !!                       ***  MODULE  trdvor  ***
4   !! Ocean diagnostics:  momentum trends
5   !!=====================================================================
6   !! History :  1.0  !  2006-01  (L. Brunier, A-M. Treguier) Original code
7   !!            2.0  !  2008-04  (C. Talandier) New trends organization
8   !!            3.5  !  2012-02  (G. Madec) regroup beta.V computation with pvo trend
9   !!----------------------------------------------------------------------
10
11   !!----------------------------------------------------------------------
12   !!   trd_vor      : momentum trends averaged over the depth
13   !!   trd_vor_zint : vorticity vertical integration
14   !!   trd_vor_init : initialization step
15   !!----------------------------------------------------------------------
16   USE oce             ! ocean dynamics and tracers variables
17   USE dom_oce         ! ocean space and time domain variables
18   USE trd_oce         ! trends: ocean variables
19   USE zdf_oce         ! ocean vertical physics
20   USE sbc_oce         ! surface boundary condition: ocean
21   USE phycst          ! Define parameters for the routines
22   USE ldfdyn          ! ocean active tracers: lateral physics
23   USE dianam          ! build the name of file (routine)
24   USE zdfmxl          ! mixed layer depth
25   !
26   USE in_out_manager  ! I/O manager
27   USE ioipsl          ! NetCDF library
28   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
29   USE lib_mpp         ! MPP library
30
31   IMPLICIT NONE
32   PRIVATE
33
34   INTERFACE trd_vor_zint
35      MODULE PROCEDURE trd_vor_zint_2d, trd_vor_zint_3d
36   END INTERFACE
37
38   PUBLIC   trd_vor        ! routine called by trddyn.F90
39   PUBLIC   trd_vor_init   ! routine called by opa.F90
40   PUBLIC   trd_vor_alloc  ! routine called by nemogcm.F90
41
42   INTEGER ::   nh_t, nmoydpvor, nidvor, nhoridvor, ndimvor1, icount   ! needs for IOIPSL output
43   INTEGER, SAVE, ALLOCATABLE, DIMENSION(:) ::   ndexvor1   ! needed for IOIPSL output
44   INTEGER ::   ndebug     ! (0/1) set it to 1 in case of problem to have more print
45
46   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   vor_avr      ! average
47   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   vor_avrb     ! before vorticity (kt-1)
48   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   vor_avrbb    ! vorticity at begining of the nwrite-1 timestep averaging period
49   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   vor_avrbn    ! after vorticity at time step after the
50   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   rotot        ! begining of the NWRITE-1 timesteps
51   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   vor_avrtot   !
52   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   vor_avrres   !
53   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   vortrd       ! curl of trends
54         
55   CHARACTER(len=12) ::   cvort
56
57   !! * Substitutions
58#  include "vectopt_loop_substitute.h90"
59   !!----------------------------------------------------------------------
60   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
61   !! $Id$
62   !! Software governed by the CeCILL license (see ./LICENSE)
63   !!----------------------------------------------------------------------
64CONTAINS
65
66   INTEGER FUNCTION trd_vor_alloc()
67      !!----------------------------------------------------------------------------
68      !!                  ***  ROUTINE trd_vor_alloc  ***
69      !!----------------------------------------------------------------------------
70      ALLOCATE( vor_avr   (jpi,jpj) , vor_avrb(jpi,jpj) , vor_avrbb (jpi,jpj) ,   &
71         &      vor_avrbn (jpi,jpj) , rotot   (jpi,jpj) , vor_avrtot(jpi,jpj) ,   &
72         &      vor_avrres(jpi,jpj) , vortrd  (jpi,jpj,jpltot_vor) ,              &
73         &      ndexvor1  (jpi*jpj)                                ,   STAT= trd_vor_alloc )
74         !
75      CALL mpp_sum ( 'trdvor', trd_vor_alloc )
76      IF( trd_vor_alloc /= 0 )   CALL ctl_stop( 'STOP', 'trd_vor_alloc: failed to allocate arrays' )
77   END FUNCTION trd_vor_alloc
78
79
80   SUBROUTINE trd_vor( putrd, pvtrd, ktrd, kt, Kmm )
81      !!----------------------------------------------------------------------
82      !!                  ***  ROUTINE trd_vor  ***
83      !!
84      !! ** Purpose :  computation of cumulated trends over analysis period
85      !!               and make outputs (NetCDF format)
86      !!----------------------------------------------------------------------
87      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends
88      INTEGER                   , INTENT(in   ) ::   ktrd           ! trend index
89      INTEGER                   , INTENT(in   ) ::   kt             ! time step
90      INTEGER                   , INTENT(in   ) ::   Kmm            ! time level index
91      !
92      INTEGER ::   ji, jj   ! dummy loop indices
93      REAL(wp), DIMENSION(jpi,jpj) ::   ztswu, ztswv    ! 2D workspace
94      !!----------------------------------------------------------------------
95
96      SELECT CASE( ktrd ) 
97      CASE( jpdyn_hpg )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_prg, Kmm )   ! Hydrostatique Pressure Gradient
98      CASE( jpdyn_keg )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_keg, Kmm )   ! KE Gradient
99      CASE( jpdyn_rvo )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_rvo, Kmm )   ! Relative Vorticity
100      CASE( jpdyn_pvo )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_pvo, Kmm )   ! Planetary Vorticity Term
101      CASE( jpdyn_ldf )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_ldf, Kmm )   ! Horizontal Diffusion
102      CASE( jpdyn_zad )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_zad, Kmm )   ! Vertical Advection
103      CASE( jpdyn_spg )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_spg, Kmm )   ! Surface Pressure Grad.
104      CASE( jpdyn_zdf )                                                      ! Vertical Diffusion
105         ztswu(:,:) = 0.e0   ;   ztswv(:,:) = 0.e0
106         DO jj = 2, jpjm1                                                             ! wind stress trends
107            DO ji = fs_2, fs_jpim1   ! vector opt.
108               ztswu(ji,jj) = 0.5 * ( utau_b(ji,jj) + utau(ji,jj) ) / ( e3u(ji,jj,1,Kmm) * rau0 )
109               ztswv(ji,jj) = 0.5 * ( vtau_b(ji,jj) + vtau(ji,jj) ) / ( e3v(ji,jj,1,Kmm) * rau0 )
110            END DO
111         END DO
112         !
113         CALL trd_vor_zint( putrd, pvtrd, jpvor_zdf, Kmm )                             ! zdf trend including surf./bot. stresses
114         CALL trd_vor_zint( ztswu, ztswv, jpvor_swf, Kmm )                             ! surface wind stress
115      CASE( jpdyn_bfr )
116         CALL trd_vor_zint( putrd, pvtrd, jpvor_bfr, Kmm )                             ! Bottom stress
117         !
118      CASE( jpdyn_atf )       ! last trends: perform the output of 2D vorticity trends
119         CALL trd_vor_iom( kt, Kmm )
120      END SELECT
121      !
122   END SUBROUTINE trd_vor
123
124
125   SUBROUTINE trd_vor_zint_2d( putrdvor, pvtrdvor, ktrd, Kmm )
126      !!----------------------------------------------------------------------------
127      !!                  ***  ROUTINE trd_vor_zint  ***
128      !!
129      !! ** Purpose :   computation of vertically integrated vorticity budgets
130      !!              from ocean surface down to control surface (NetCDF output)
131      !!
132      !! ** Method/usage :   integration done over nwrite-1 time steps
133      !!
134      !! ** Action :   trends :
135      !!                  vortrd (,, 1) = Pressure Gradient Trend
136      !!                  vortrd (,, 2) = KE Gradient Trend
137      !!                  vortrd (,, 3) = Relative Vorticity Trend
138      !!                  vortrd (,, 4) = Coriolis Term Trend
139      !!                  vortrd (,, 5) = Horizontal Diffusion Trend
140      !!                  vortrd (,, 6) = Vertical Advection Trend
141      !!                  vortrd (,, 7) = Vertical Diffusion Trend
142      !!                  vortrd (,, 8) = Surface Pressure Grad. Trend
143      !!                  vortrd (,, 9) = Beta V
144      !!                  vortrd (,,10) = forcing term
145      !!                  vortrd (,,11) = bottom friction term
146      !!                  rotot(,) : total cumulative trends over nwrite-1 time steps
147      !!                  vor_avrtot(,) : first membre of vrticity equation
148      !!                  vor_avrres(,) : residual = dh/dt entrainment
149      !!
150      !!      trends output in netCDF format using ioipsl
151      !!----------------------------------------------------------------------
152      INTEGER                     , INTENT(in   ) ::   ktrd       ! ocean trend index
153      INTEGER                     , INTENT(in   ) ::   Kmm        ! time level index
154      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   putrdvor   ! u vorticity trend
155      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   pvtrdvor   ! v vorticity trend
156      !
157      INTEGER ::   ji, jj       ! dummy loop indices
158      INTEGER ::   ikbu, ikbv   ! local integers
159      REAL(wp), DIMENSION(jpi,jpj) :: zudpvor, zvdpvor  ! total cmulative trends
160      !!----------------------------------------------------------------------
161
162      !
163
164      zudpvor(:,:) = 0._wp                 ;   zvdpvor(:,:) = 0._wp                    ! Initialisation
165      CALL lbc_lnk_multi( 'trdvor', putrdvor, 'U', -1. , pvtrdvor, 'V', -1. )      ! lateral boundary condition
166     
167
168      !  =====================================
169      !  I vertical integration of 2D trends
170      !  =====================================
171
172      SELECT CASE( ktrd ) 
173      !
174      CASE( jpvor_bfr )        ! bottom friction
175         DO jj = 2, jpjm1
176            DO ji = fs_2, fs_jpim1 
177               ikbu = mbkv(ji,jj)
178               ikbv = mbkv(ji,jj)           
179               zudpvor(ji,jj) = putrdvor(ji,jj) * e3u(ji,jj,ikbu,Kmm) * e1u(ji,jj) * umask(ji,jj,ikbu)
180               zvdpvor(ji,jj) = pvtrdvor(ji,jj) * e3v(ji,jj,ikbv,Kmm) * e2v(ji,jj) * vmask(ji,jj,ikbv)
181            END DO
182         END DO
183         !
184      CASE( jpvor_swf )        ! wind stress
185         zudpvor(:,:) = putrdvor(:,:) * e3u(:,:,1,Kmm) * e1u(:,:) * umask(:,:,1)
186         zvdpvor(:,:) = pvtrdvor(:,:) * e3v(:,:,1,Kmm) * e2v(:,:) * vmask(:,:,1)
187         !
188      END SELECT
189
190      ! Average except for Beta.V
191      zudpvor(:,:) = zudpvor(:,:) * r1_hu_n(:,:)
192      zvdpvor(:,:) = zvdpvor(:,:) * r1_hv_n(:,:)
193   
194      ! Curl
195      DO ji = 1, jpim1
196         DO jj = 1, jpjm1
197            vortrd(ji,jj,ktrd) = (    zvdpvor(ji+1,jj) - zvdpvor(ji,jj)       &
198                 &                - ( zudpvor(ji,jj+1) - zudpvor(ji,jj) )   ) / ( e1f(ji,jj) * e2f(ji,jj) )
199         END DO
200      END DO
201      vortrd(:,:,ktrd) = vortrd(:,:,ktrd) * fmask(:,:,1)      ! Surface mask
202
203      IF( ndebug /= 0 ) THEN
204         IF(lwp) WRITE(numout,*) ' debuging trd_vor_zint: I done'
205         CALL FLUSH(numout)
206      ENDIF
207      !
208   END SUBROUTINE trd_vor_zint_2d
209
210
211   SUBROUTINE trd_vor_zint_3d( putrdvor, pvtrdvor, ktrd , Kmm )
212      !!----------------------------------------------------------------------------
213      !!                  ***  ROUTINE trd_vor_zint  ***
214      !!
215      !! ** Purpose :   computation of vertically integrated vorticity budgets
216      !!              from ocean surface down to control surface (NetCDF output)
217      !!
218      !! ** Method/usage :   integration done over nwrite-1 time steps
219      !!
220      !! ** Action :     trends :
221      !!                  vortrd (,,1) = Pressure Gradient Trend
222      !!                  vortrd (,,2) = KE Gradient Trend
223      !!                  vortrd (,,3) = Relative Vorticity Trend
224      !!                  vortrd (,,4) = Coriolis Term Trend
225      !!                  vortrd (,,5) = Horizontal Diffusion Trend
226      !!                  vortrd (,,6) = Vertical Advection Trend
227      !!                  vortrd (,,7) = Vertical Diffusion Trend
228      !!                  vortrd (,,8) = Surface Pressure Grad. Trend
229      !!                  vortrd (,,9) = Beta V
230      !!                  vortrd (,,10) = forcing term
231      !!      vortrd (,,11) = bottom friction term
232      !!                  rotot(,) : total cumulative trends over nwrite-1 time steps
233      !!                  vor_avrtot(,) : first membre of vrticity equation
234      !!                  vor_avrres(,) : residual = dh/dt entrainment
235      !!
236      !!      trends output in netCDF format using ioipsl
237      !!----------------------------------------------------------------------
238      !
239      INTEGER                         , INTENT(in   ) ::   ktrd       ! ocean trend index
240      INTEGER                         , INTENT(in   ) ::   Kmm        ! time level index
241      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   putrdvor   ! u vorticity trend
242      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pvtrdvor   ! v vorticity trend
243      !
244      INTEGER ::   ji, jj, jk   ! dummy loop indices
245      REAL(wp), DIMENSION(jpi,jpj) :: zubet  , zvbet    ! Beta.V   
246      REAL(wp), DIMENSION(jpi,jpj) :: zudpvor, zvdpvor  ! total cmulative trends
247      !!----------------------------------------------------------------------
248     
249      ! Initialization
250      zubet  (:,:) = 0._wp
251      zvbet  (:,:) = 0._wp
252      zudpvor(:,:) = 0._wp
253      zvdpvor(:,:) = 0._wp
254      !                            ! lateral boundary condition on input momentum trends
255      CALL lbc_lnk_multi( 'trdvor', putrdvor, 'U', -1. , pvtrdvor, 'V', -1. )
256
257      !  =====================================
258      !  I vertical integration of 3D trends
259      !  =====================================
260      ! putrdvor and pvtrdvor terms
261      DO jk = 1,jpk
262        zudpvor(:,:) = zudpvor(:,:) + putrdvor(:,:,jk) * e3u(:,:,jk,Kmm) * e1u(:,:) * umask(:,:,jk)
263        zvdpvor(:,:) = zvdpvor(:,:) + pvtrdvor(:,:,jk) * e3v(:,:,jk,Kmm) * e2v(:,:) * vmask(:,:,jk)
264      END DO
265
266      ! Planetary vorticity: 2nd computation (Beta.V term) store the vertical sum
267      ! as Beta.V term need intergration, not average
268      IF( ktrd == jpvor_pvo ) THEN
269         zubet(:,:) = zudpvor(:,:)
270         zvbet(:,:) = zvdpvor(:,:)
271         DO ji = 1, jpim1
272            DO jj = 1, jpjm1
273               vortrd(ji,jj,jpvor_bev) = (    zvbet(ji+1,jj) - zvbet(ji,jj)     &
274                  &                       - ( zubet(ji,jj+1) - zubet(ji,jj) ) ) / ( e1f(ji,jj) * e2f(ji,jj) )
275            END DO
276         END DO
277         ! Average of the Curl and Surface mask
278         vortrd(:,:,jpvor_bev) = vortrd(:,:,jpvor_bev) * r1_hu_n(:,:) * fmask(:,:,1)
279      ENDIF
280      !
281      ! Average
282      zudpvor(:,:) = zudpvor(:,:) * r1_hu_n(:,:)
283      zvdpvor(:,:) = zvdpvor(:,:) * r1_hv_n(:,:)
284      !
285      ! Curl
286      DO ji=1,jpim1
287         DO jj=1,jpjm1
288            vortrd(ji,jj,ktrd) = (    zvdpvor(ji+1,jj) - zvdpvor(ji,jj)     &
289               &                  - ( zudpvor(ji,jj+1) - zudpvor(ji,jj) ) ) / ( e1f(ji,jj) * e2f(ji,jj) )
290         END DO
291      END DO
292      ! Surface mask
293      vortrd(:,:,ktrd) = vortrd(:,:,ktrd) * fmask(:,:,1)
294   
295      IF( ndebug /= 0 ) THEN
296         IF(lwp) WRITE(numout,*) ' debuging trd_vor_zint: I done'
297         CALL FLUSH(numout)
298      ENDIF
299      !
300   END SUBROUTINE trd_vor_zint_3d
301
302
303   SUBROUTINE trd_vor_iom( kt , Kmm )
304      !!----------------------------------------------------------------------
305      !!                  ***  ROUTINE trd_vor  ***
306      !!
307      !! ** Purpose :  computation of cumulated trends over analysis period
308      !!               and make outputs (NetCDF format)
309      !!----------------------------------------------------------------------
310      INTEGER                   , INTENT(in   ) ::   kt             ! time step
311      INTEGER                   , INTENT(in   ) ::   Kmm            ! time level index
312      !
313      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices
314      INTEGER  ::   it, itmod        ! local integers
315      REAL(wp) ::   zmean            ! local scalars
316      REAL(wp), DIMENSION(jpi,jpj) :: zuu, zvv
317      !!----------------------------------------------------------------------
318
319      !  =================
320      !  I. Initialization
321      !  =================
322     
323     
324      ! I.1 set before values of vertically average u and v
325      ! ---------------------------------------------------
326
327      IF( kt > nit000 )   vor_avrb(:,:) = vor_avr(:,:)
328
329      ! I.2 vertically integrated vorticity
330      !  ----------------------------------
331
332      vor_avr   (:,:) = 0._wp
333      zuu       (:,:) = 0._wp
334      zvv       (:,:) = 0._wp
335      vor_avrtot(:,:) = 0._wp
336      vor_avrres(:,:) = 0._wp
337     
338      ! Vertically averaged velocity
339      DO jk = 1, jpk - 1
340         zuu(:,:) = zuu(:,:) + e1u(:,:) * uu(:,:,jk,Kmm) * e3u(:,:,jk,Kmm)
341         zvv(:,:) = zvv(:,:) + e2v(:,:) * vv(:,:,jk,Kmm) * e3v(:,:,jk,Kmm)
342      END DO
343 
344      zuu(:,:) = zuu(:,:) * r1_hu_n(:,:)
345      zvv(:,:) = zvv(:,:) * r1_hv_n(:,:)
346
347      ! Curl
348      DO ji = 1, jpim1
349         DO jj = 1, jpjm1
350            vor_avr(ji,jj) = (  ( zvv(ji+1,jj) - zvv(ji,jj) )    &
351               &              - ( zuu(ji,jj+1) - zuu(ji,jj) ) ) / ( e1f(ji,jj) * e2f(ji,jj) ) * fmask(ji,jj,1)
352         END DO
353      END DO
354     
355      !  =================================
356      !   II. Cumulated trends
357      !  =================================
358
359      ! II.1 set `before' mixed layer values for kt = nit000+1
360      ! ------------------------------------------------------
361      IF( kt == nit000+1 ) THEN
362         vor_avrbb(:,:) = vor_avrb(:,:)
363         vor_avrbn(:,:) = vor_avr (:,:)
364      ENDIF
365
366      ! II.2 cumulated trends over analysis period (kt=2 to nwrite)
367      ! ----------------------
368      ! trends cumulated over nwrite-2 time steps
369
370      IF( kt >= nit000+2 ) THEN
371         nmoydpvor = nmoydpvor + 1
372         DO jl = 1, jpltot_vor
373            IF( jl /= 9 ) THEN
374               rotot(:,:) = rotot(:,:) + vortrd(:,:,jl)
375            ENDIF
376         END DO
377      ENDIF
378
379      !  =============================================
380      !   III. Output in netCDF + residual computation
381      !  =============================================
382
383      ! define time axis
384      it    = kt
385      itmod = kt - nit000 + 1
386
387      IF( MOD( it, nn_trd ) == 0 ) THEN
388
389         ! III.1 compute total trend
390         ! ------------------------
391         zmean = 1._wp / (  REAL( nmoydpvor, wp ) * 2._wp * rdt  )
392         vor_avrtot(:,:) = (  vor_avr(:,:) - vor_avrbn(:,:) + vor_avrb(:,:) - vor_avrbb(:,:) ) * zmean
393
394
395         ! III.2 compute residual
396         ! ---------------------
397         zmean = 1._wp / REAL( nmoydpvor, wp )
398         vor_avrres(:,:) = vor_avrtot(:,:) - rotot(:,:) / zmean
399
400         ! Boundary conditions
401         CALL lbc_lnk_multi( 'trdvor', vor_avrtot, 'F', 1. , vor_avrres, 'F', 1. )
402
403
404         ! III.3 time evolution array swap
405         ! ------------------------------
406         vor_avrbb(:,:) = vor_avrb(:,:)
407         vor_avrbn(:,:) = vor_avr (:,:)
408         !
409         nmoydpvor = 0
410         !
411      ENDIF
412
413      ! III.4 write trends to output
414      ! ---------------------------
415
416      IF( kt >=  nit000+1 ) THEN
417
418         IF( lwp .AND. MOD( itmod, nn_trd ) == 0 ) THEN
419            WRITE(numout,*) ''
420            WRITE(numout,*) 'trd_vor : write trends in the NetCDF file at kt = ', kt
421            WRITE(numout,*) '~~~~~~~  '
422         ENDIF
423 
424         CALL histwrite( nidvor,"sovortPh",it,vortrd(:,:,jpvor_prg),ndimvor1,ndexvor1)  ! grad Ph
425         CALL histwrite( nidvor,"sovortEk",it,vortrd(:,:,jpvor_keg),ndimvor1,ndexvor1)  ! Energy
426         CALL histwrite( nidvor,"sovozeta",it,vortrd(:,:,jpvor_rvo),ndimvor1,ndexvor1)  ! rel vorticity
427         CALL histwrite( nidvor,"sovortif",it,vortrd(:,:,jpvor_pvo),ndimvor1,ndexvor1)  ! coriolis
428         CALL histwrite( nidvor,"sovodifl",it,vortrd(:,:,jpvor_ldf),ndimvor1,ndexvor1)  ! lat diff
429         CALL histwrite( nidvor,"sovoadvv",it,vortrd(:,:,jpvor_zad),ndimvor1,ndexvor1)  ! vert adv
430         CALL histwrite( nidvor,"sovodifv",it,vortrd(:,:,jpvor_zdf),ndimvor1,ndexvor1)  ! vert diff
431         CALL histwrite( nidvor,"sovortPs",it,vortrd(:,:,jpvor_spg),ndimvor1,ndexvor1)  ! grad Ps
432         CALL histwrite( nidvor,"sovortbv",it,vortrd(:,:,jpvor_bev),ndimvor1,ndexvor1)  ! beta.V
433         CALL histwrite( nidvor,"sovowind",it,vortrd(:,:,jpvor_swf),ndimvor1,ndexvor1) ! wind stress
434         CALL histwrite( nidvor,"sovobfri",it,vortrd(:,:,jpvor_bfr),ndimvor1,ndexvor1) ! bottom friction
435         CALL histwrite( nidvor,"1st_mbre",it,vor_avrtot    ,ndimvor1,ndexvor1) ! First membre
436         CALL histwrite( nidvor,"sovorgap",it,vor_avrres    ,ndimvor1,ndexvor1) ! gap between 1st and 2 nd mbre
437         !
438         IF( ndebug /= 0 ) THEN
439            WRITE(numout,*) ' debuging trd_vor: III.4 done'
440            CALL FLUSH(numout)
441         ENDIF
442         !
443      ENDIF
444      !
445      IF( MOD( it, nn_trd ) == 0 ) rotot(:,:)=0
446      !
447      IF( kt == nitend )   CALL histclo( nidvor )
448      !
449   END SUBROUTINE trd_vor_iom
450
451
452   SUBROUTINE trd_vor_init
453      !!----------------------------------------------------------------------
454      !!                  ***  ROUTINE trd_vor_init  ***
455      !!
456      !! ** Purpose :   computation of vertically integrated T and S budgets
457      !!      from ocean surface down to control surface (NetCDF output)
458      !!----------------------------------------------------------------------
459      REAL(wp) ::   zjulian, zsto, zout
460      CHARACTER (len=40) ::   clhstnam
461      CHARACTER (len=40) ::   clop
462      !!----------------------------------------------------------------------
463
464      !  ===================
465      !   I. initialization
466      !  ===================
467
468      cvort='averaged-vor'
469
470      ! Open specifier
471      ndebug = 0      ! set it to 1 in case of problem to have more Print
472
473      IF(lwp) THEN
474         WRITE(numout,*) ' '
475         WRITE(numout,*) ' trd_vor_init: vorticity trends'
476         WRITE(numout,*) ' ~~~~~~~~~~~~'
477         WRITE(numout,*) ' '
478         WRITE(numout,*) '               ##########################################################################'
479         WRITE(numout,*) '                CAUTION: The interpretation of the vorticity trends is'
480         WRITE(numout,*) '                not obvious, please contact Anne-Marie TREGUIER at: treguier@ifremer.fr '
481         WRITE(numout,*) '               ##########################################################################'
482         WRITE(numout,*) ' '
483      ENDIF
484
485      IF( trd_vor_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'trd_vor_init : unable to allocate trdvor arrays' )
486
487
488      ! cumulated trends array init
489      nmoydpvor = 0
490      rotot(:,:)=0
491      vor_avrtot(:,:)=0
492      vor_avrres(:,:)=0
493
494      IF( ndebug /= 0 ) THEN
495         WRITE(numout,*) ' debuging trd_vor_init: I. done'
496         CALL FLUSH(numout)
497      ENDIF
498
499      !  =================================
500      !   II. netCDF output initialization
501      !  =================================
502
503      !-----------------------------------------
504      ! II.1 Define frequency of output and means
505      ! -----------------------------------------
506      IF( ln_mskland )   THEN   ;   clop = "only(x)"   ! put 1.e+20 on land (very expensive!!)
507      ELSE                      ;   clop = "x"         ! no use of the mask value (require less cpu time)
508      ENDIF
509#if defined key_diainstant
510      zsto = nwrite*rdt
511      clop = "inst("//TRIM(clop)//")"
512#else
513      zsto = rdt
514      clop = "ave("//TRIM(clop)//")"
515#endif
516      zout = nn_trd*rdt
517
518      IF(lwp) WRITE(numout,*) '               netCDF initialization'
519
520      ! II.2 Compute julian date from starting date of the run
521      ! ------------------------
522      CALL ymds2ju( nyear, nmonth, nday, rdt, zjulian )
523      zjulian = zjulian - adatrj   !   set calendar origin to the beginning of the experiment
524      IF(lwp) WRITE(numout,*)' ' 
525      IF(lwp) WRITE(numout,*)'               Date 0 used :',nit000,    &
526         &                   ' YEAR ', nyear,' MONTH '      , nmonth,   &
527         &                   ' DAY ' , nday, 'Julian day : ', zjulian
528
529      ! II.3 Define the T grid trend file (nidvor)
530      ! ---------------------------------
531      CALL dia_nam( clhstnam, nn_trd, 'vort' )                  ! filename
532      IF(lwp) WRITE(numout,*) ' Name of NETCDF file ', clhstnam
533      CALL histbeg( clhstnam, jpi, glamf, jpj, gphif,1, jpi,   &  ! Horizontal grid : glamt and gphit
534         &          1, jpj, nit000-1, zjulian, rdt, nh_t, nidvor, domain_id=nidom, snc4chunks=snc4set )
535      CALL wheneq( jpi*jpj, fmask, 1, 1., ndexvor1, ndimvor1 )    ! surface
536
537      ! Declare output fields as netCDF variables
538      CALL histdef( nidvor, "sovortPh", cvort//"grad Ph" , "s-2",        & ! grad Ph
539         &          jpi,jpj,nh_t,1,1,1,-99,32,clop,zsto,zout)
540      CALL histdef( nidvor, "sovortEk", cvort//"Energy", "s-2",          & ! Energy
541         &          jpi,jpj,nh_t,1,1,1,-99,32,clop,zsto,zout)
542      CALL histdef( nidvor, "sovozeta", cvort//"rel vorticity", "s-2",   & ! rel vorticity
543         &          jpi,jpj,nh_t,1,1,1,-99,32,clop,zsto,zout)
544      CALL histdef( nidvor, "sovortif", cvort//"coriolis", "s-2",        & ! coriolis
545         &          jpi,jpj,nh_t,1,1,1,-99,32,clop,zsto,zout)
546      CALL histdef( nidvor, "sovodifl", cvort//"lat diff ", "s-2",       & ! lat diff
547         &          jpi,jpj,nh_t,1,1,1,-99,32,clop,zsto,zout)
548      CALL histdef( nidvor, "sovoadvv", cvort//"vert adv", "s-2",        & ! vert adv
549         &          jpi,jpj,nh_t,1,1,1,-99,32,clop,zsto,zout)
550      CALL histdef( nidvor, "sovodifv", cvort//"vert diff" , "s-2",      & ! vert diff
551         &          jpi,jpj,nh_t,1,1,1,-99,32,clop,zsto,zout)
552      CALL histdef( nidvor, "sovortPs", cvort//"grad Ps", "s-2",         & ! grad Ps
553         &          jpi,jpj,nh_t,1,1,1,-99,32,clop,zsto,zout)
554      CALL histdef( nidvor, "sovortbv", cvort//"Beta V", "s-2",          & ! beta.V
555         &          jpi,jpj,nh_t,1,1,1,-99,32,clop,zsto,zout)
556      CALL histdef( nidvor, "sovowind", cvort//"wind stress", "s-2",     & ! wind stress
557         &          jpi,jpj,nh_t,1,1,1,-99,32,clop,zsto,zout)
558      CALL histdef( nidvor, "sovobfri", cvort//"bottom friction", "s-2", & ! bottom friction
559         &          jpi,jpj,nh_t,1,1,1,-99,32,clop,zsto,zout)
560      CALL histdef( nidvor, "1st_mbre", cvort//"1st mbre", "s-2",        & ! First membre
561         &          jpi,jpj,nh_t,1,1,1,-99,32,clop,zsto,zout)
562      CALL histdef( nidvor, "sovorgap", cvort//"gap", "s-2",             & ! gap between 1st and 2 nd mbre
563         &          jpi,jpj,nh_t,1,1,1,-99,32,clop,zsto,zout)
564      CALL histend( nidvor, snc4set )
565
566      IF( ndebug /= 0 ) THEN
567         WRITE(numout,*) ' debuging trd_vor_init: II. done'
568         CALL FLUSH(numout)
569      ENDIF
570      !
571   END SUBROUTINE trd_vor_init
572
573   !!======================================================================
574END MODULE trdvor
Note: See TracBrowser for help on using the repository browser.