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.
diaptr.F90 in branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/OPA_SRC/DIA – NEMO

source: branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/OPA_SRC/DIA/diaptr.F90 @ 2633

Last change on this file since 2633 was 2633, checked in by trackstand2, 13 years ago

Renamed wrk_use => wrk_in_use and wrk_release => wrk_not_released

  • Property svn:keywords set to Id
File size: 42.7 KB
Line 
1MODULE diaptr
2   !!======================================================================
3   !!                       ***  MODULE  diaptr  ***
4   !! Ocean physics:  Computes meridonal transports and zonal means
5   !!=====================================================================
6   !! History :  1.0  ! 2003-09  (C. Talandier, G. Madec)  Original code
7   !!            2.0  ! 2006-01  (A. Biastoch)  Allow sub-basins computation
8   !!            3.2  ! 2010-03  (O. Marti, S. Flavoni) Add fields
9   !!            3.3  ! 2010-10  (G. Madec)  dynamical allocation
10   !!----------------------------------------------------------------------
11
12   !!----------------------------------------------------------------------
13   !!   dia_ptr      : Poleward Transport Diagnostics module
14   !!   dia_ptr_init : Initialization, namelist read
15   !!   dia_ptr_wri  : Output of poleward fluxes
16   !!   ptr_vjk      : "zonal" sum computation of a "meridional" flux array
17   !!   ptr_tjk      : "zonal" mean computation of a tracer field
18   !!   ptr_vj       : "zonal" and vertical sum computation of a "meridional" flux array
19   !!                   (Generic interface to ptr_vj_3d, ptr_vj_2d)
20   !!----------------------------------------------------------------------
21   USE oce              ! ocean dynamics and active tracers
22   USE dom_oce          ! ocean space and time domain
23   USE phycst           ! physical constants
24   USE ldftra_oce       ! ocean active tracers: lateral physics
25   USE dianam           !
26   USE iom              ! IOM library
27   USE ioipsl           ! IO-IPSL library
28   USE in_out_manager   ! I/O manager
29   USE lib_mpp          ! MPP library
30   USE lbclnk           ! lateral boundary condition - processor exchanges
31
32   IMPLICIT NONE
33   PRIVATE
34
35   INTERFACE ptr_vj
36      MODULE PROCEDURE ptr_vj_3d, ptr_vj_2d
37   END INTERFACE
38
39   PUBLIC   dia_ptr_init   ! call in opa module
40   PUBLIC   dia_ptr        ! call in step module
41   PUBLIC   ptr_vj         ! call by tra_ldf & tra_adv routines
42   PUBLIC   ptr_vjk        ! call by tra_ldf & tra_adv routines
43
44   !                                           !!** namelist  namptr  **
45   LOGICAL , PUBLIC ::   ln_diaptr  = .FALSE.   !: Poleward transport flag (T) or not (F)
46   LOGICAL , PUBLIC ::   ln_subbas  = .FALSE.   !: Atlantic/Pacific/Indian basins calculation
47   LOGICAL , PUBLIC ::   ln_diaznl  = .FALSE.   !: Add zonal means and meridional stream functions
48   LOGICAL , PUBLIC ::   ln_ptrcomp = .FALSE.   !: Add decomposition : overturning (and gyre, soon ...)
49   INTEGER , PUBLIC ::   nn_fptr    = 15        !: frequency of ptr computation  [time step]
50   INTEGER , PUBLIC ::   nn_fwri    = 15        !: frequency of ptr outputs      [time step]
51
52   REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:) ::   htr_adv, htr_ldf, htr_ove   !: Heat TRansports (adv, diff, overturn.)
53   REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:) ::   str_adv, str_ldf, str_ove   !: Salt TRansports (adv, diff, overturn.)
54   
55   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   btmsk                  ! T-point basin interior masks
56   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   btm30                  ! mask out Southern Ocean (=0 south of 30°S)
57   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   htr  , str             ! adv heat and salt transports (approx)
58   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   tn_jk, sn_jk , v_msf   ! i-mean T and S, j-Stream-Function
59   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   sjk  , r1_sjk          ! i-mean i-k-surface and its inverse       
60   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   htr_eiv, str_eiv       ! bolus adv heat ans salt transports ('key_diaeiv')
61   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   v_msf_eiv              ! bolus j-streamfuction              ('key_diaeiv')
62
63
64   INTEGER ::   niter       !
65   INTEGER ::   nidom_ptr   !
66   INTEGER ::   numptr      ! logical unit for Poleward TRansports
67   INTEGER ::   nptr        ! = 1 (ln_subbas=F) or = 5 (glo, atl, pac, ind, ipc) (ln_subbas=T)
68
69   REAL(wp) ::   rc_sv    = 1.e-6_wp   ! conversion from m3/s to Sverdrup
70   REAL(wp) ::   rc_pwatt = 1.e-15_wp  ! conversion from W    to PW (further x rau0 x Cp)
71   REAL(wp) ::   rc_ggram = 1.e-6_wp   ! conversion from g    to Pg
72
73   REAL(wp), TARGET, DIMENSION(:),   ALLOCATABLE, SAVE :: p_fval1d
74   REAL(wp), TARGET, DIMENSION(:,:), ALLOCATABLE, SAVE :: p_fval2d
75
76   !! Integer, 1D workspace arrays. Not common enough to be implemented in
77   !! wrk_nemo module.
78   INTEGER, ALLOCATABLE, SAVE, DIMENSION(:) :: ndex  , ndex_atl     , ndex_pac     , ndex_ind     , ndex_ipc
79   INTEGER, ALLOCATABLE, SAVE, DIMENSION(:) ::         ndex_atl_30  , ndex_pac_30  , ndex_ind_30  , ndex_ipc_30
80   INTEGER, ALLOCATABLE, SAVE, DIMENSION(:) :: ndex_h, ndex_h_atl_30, ndex_h_pac_30, ndex_h_ind_30, ndex_h_ipc_30
81
82   !! * Substitutions
83#  include "domzgr_substitute.h90"
84#  include "vectopt_loop_substitute.h90"
85   !!----------------------------------------------------------------------
86   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
87   !! $Id$
88   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
89   !!----------------------------------------------------------------------
90CONTAINS
91
92   FUNCTION dia_ptr_alloc()
93      !!----------------------------------------------------------------------
94      !!                    ***  ROUTINE dia_ptr_alloc  ***
95      !!----------------------------------------------------------------------
96      INTEGER               ::   dia_ptr_alloc   ! return value
97      INTEGER, DIMENSION(5) ::   ierr
98      !!----------------------------------------------------------------------
99      ierr(:) = 0
100      !
101      ALLOCATE( btmsk(jpi,jpj,nptr) ,           &
102         &      htr_adv(jpj) , str_adv(jpj) ,   &
103         &      htr_ldf(jpj) , str_ldf(jpj) ,   &
104         &      htr_ove(jpj) , str_ove(jpj),    &
105         &      htr(jpj,nptr) , str(jpj,nptr) , &
106         &      tn_jk(jpj,jpk,nptr) , sn_jk (jpj,jpk,nptr) , v_msf(jpj,jpk,nptr) , &
107         &      sjk  (jpj,jpk,nptr) , r1_sjk(jpj,jpk,nptr) , STAT=ierr(1)  )
108         !
109#if defined key_diaeiv
110      ALLOCATE( htr_eiv(jpj,nptr) , str_eiv(jpj,nptr) , &
111         &      v_msf_eiv(jpj,jpk,nptr) , STAT=ierr(2) )
112#endif
113      ALLOCATE( p_fval1d(jpj), p_fval2d(jpj,jpk), Stat=ierr(3))
114      !
115      ALLOCATE(ndex(jpj*jpk),        ndex_atl(jpj*jpk), ndex_pac(jpj*jpk), &
116         &     ndex_ind(jpj*jpk),    ndex_ipc(jpj*jpk),                    &
117         &     ndex_atl_30(jpj*jpk), ndex_pac_30(jpj*jpk), Stat=ierr(4))
118
119      ALLOCATE(ndex_ind_30(jpj*jpk), ndex_ipc_30(jpj*jpk),                   &
120         &     ndex_h(jpj),          ndex_h_atl_30(jpj), ndex_h_pac_30(jpj), &
121         &     ndex_h_ind_30(jpj),   ndex_h_ipc_30(jpj), Stat=ierr(5) )
122         !
123      dia_ptr_alloc = MAXVAL( ierr )
124      IF(lk_mpp)   CALL mpp_sum( dia_ptr_alloc )
125      !
126   END FUNCTION dia_ptr_alloc
127
128
129   FUNCTION ptr_vj_3d( pva )   RESULT ( p_fval )
130      !!----------------------------------------------------------------------
131      !!                    ***  ROUTINE ptr_vj_3d  ***
132      !!
133      !! ** Purpose :   i-k sum computation of a j-flux array
134      !!
135      !! ** Method  : - i-k sum of pva using the interior 2D vmask (vmask_i).
136      !!              pva is supposed to be a masked flux (i.e. * vmask*e1v*e3v)
137      !!
138      !! ** Action  : - p_fval: i-k-mean poleward flux of pva
139      !!----------------------------------------------------------------------
140      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pva   ! mask flux array at V-point
141      !!
142      INTEGER                  ::   ji, jj, jk   ! dummy loop arguments
143      INTEGER                  ::   ijpj         ! ???
144      REAL(wp), POINTER, DIMENSION(:) :: p_fval  ! function value
145      !!--------------------------------------------------------------------
146      !
147      p_fval => p_fval1d
148
149      ijpj = jpj
150      p_fval(:) = 0._wp
151      DO jk = 1, jpkm1
152         DO jj = 2, jpjm1
153            DO ji = fs_2, fs_jpim1   ! Vector opt.
154               p_fval(jj) = p_fval(jj) + pva(ji,jj,jk) * tmask_i(ji,jj) 
155            END DO
156         END DO
157      END DO
158#if defined key_mpp_mpi
159      IF(lk_mpp)   CALL mpp_sum( p_fval, ijpj, ncomm_znl)
160#endif
161      !
162   END FUNCTION ptr_vj_3d
163
164
165   FUNCTION ptr_vj_2d( pva )   RESULT ( p_fval )
166      !!----------------------------------------------------------------------
167      !!                    ***  ROUTINE ptr_vj_2d  ***
168      !!
169      !! ** Purpose :   "zonal" and vertical sum computation of a i-flux array
170      !!
171      !! ** Method  : - i-k sum of pva using the interior 2D vmask (vmask_i).
172      !!      pva is supposed to be a masked flux (i.e. * vmask*e1v*e3v)
173      !!
174      !! ** Action  : - p_fval: i-k-mean poleward flux of pva
175      !!----------------------------------------------------------------------
176      IMPLICIT none
177      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj) ::   pva   ! mask flux array at V-point
178      !!
179      INTEGER                  ::   ji,jj       ! dummy loop arguments
180      INTEGER                  ::   ijpj        ! ???
181      REAL(wp), POINTER, DIMENSION(:) :: p_fval ! function value
182      !!--------------------------------------------------------------------
183      !
184      p_fval => p_fval1d
185
186      ijpj = jpj
187      p_fval(:) = 0._wp
188      DO jj = 2, jpjm1
189         DO ji = nldi, nlei   ! No vector optimisation here. Better use a mask ?
190            p_fval(jj) = p_fval(jj) + pva(ji,jj) * tmask_i(ji,jj)
191         END DO
192      END DO
193#if defined key_mpp_mpi
194      CALL mpp_sum( p_fval, ijpj, ncomm_znl )
195#endif
196      !
197   END FUNCTION ptr_vj_2d
198
199
200   FUNCTION ptr_vjk( pva, pmsk )   RESULT ( p_fval )
201      !!----------------------------------------------------------------------
202      !!                    ***  ROUTINE ptr_vjk  ***
203      !!
204      !! ** Purpose :   i-sum computation of a j-velocity array
205      !!
206      !! ** Method  : - i-sum of pva using the interior 2D vmask (vmask_i).
207      !!              pva is supposed to be a masked flux (i.e. * vmask)
208      !!
209      !! ** Action  : - p_fval: i-mean poleward flux of pva
210      !!----------------------------------------------------------------------
211#if defined key_mpp_mpi
212      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
213      USE wrk_nemo, ONLY: zwork => wrk_1d_1
214#endif
215      !!
216      IMPLICIT none
217      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj,jpk)           ::   pva    ! mask flux array at V-point
218      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj)    , OPTIONAL ::   pmsk   ! Optional 2D basin mask
219      !!
220      INTEGER                           :: ji, jj, jk ! dummy loop arguments
221      REAL(wp), POINTER, DIMENSION(:,:) :: p_fval     ! return function value
222#if defined key_mpp_mpi
223      INTEGER, DIMENSION(1) ::   ish
224      INTEGER, DIMENSION(2) ::   ish2
225      INTEGER               ::   ijpjjpk
226#endif
227      !!--------------------------------------------------------------------
228      !
229#if defined key_mpp_mpi
230      IF( wrk_in_use(1, 1) ) THEN
231         CALL ctl_stop('ptr_vjk: ERROR - requested workspace array is unavailable')   ;   RETURN
232      END IF
233#endif
234
235      p_fval => p_fval2d
236
237      p_fval(:,:) = 0._wp
238      !
239      IF( PRESENT( pmsk ) ) THEN
240         DO jk = 1, jpkm1
241            DO jj = 2, jpjm1
242!!gm here, use of tmask_i  ==> no need of loop over nldi, nlei....
243               DO ji =  nldi, nlei   ! No vector optimisation here. Better use a mask ?
244                  p_fval(jj,jk) = p_fval(jj,jk) + pva(ji,jj,jk) * e1v(ji,jj) * fse3v(ji,jj,jk) * pmsk(ji,jj)
245               END DO
246            END DO
247         END DO
248      ELSE
249         DO jk = 1, jpkm1
250            DO jj = 2, jpjm1
251               DO ji =  nldi, nlei   ! No vector optimisation here. Better use a mask ?
252                  p_fval(jj,jk) = p_fval(jj,jk) + pva(ji,jj,jk) * e1v(ji,jj) * fse3v(ji,jj,jk) * tmask_i(ji,jj)
253               END DO
254            END DO
255         END DO
256      END IF
257      !
258#if defined key_mpp_mpi
259      ijpjjpk = jpj*jpk
260      ish(1) = ijpjjpk  ;   ish2(1) = jpj   ;   ish2(2) = jpk
261      zwork(1:ijpjjpk) = RESHAPE( p_fval, ish )
262      CALL mpp_sum( zwork, ijpjjpk, ncomm_znl )
263      p_fval(:,:) = RESHAPE( zwork, ish2 )
264#endif
265      !
266#if defined key_mpp_mpi
267      IF(wrk_not_released(1, 1) )   CALL ctl_stop('ptr_vjk: ERROR - failed to release workspace array')
268#endif
269      !
270   END FUNCTION ptr_vjk
271
272
273   FUNCTION ptr_tjk( pta, pmsk )   RESULT ( p_fval )
274      !!----------------------------------------------------------------------
275      !!                    ***  ROUTINE ptr_tjk  ***
276      !!
277      !! ** Purpose :   i-sum computation of e1t*e3t * a tracer field
278      !!
279      !! ** Method  : - i-sum of mj(pta) using tmask
280      !!
281      !! ** Action  : - p_fval: i-sum of e1t*e3t*pta
282      !!----------------------------------------------------------------------
283#if defined key_mpp_mpi
284      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
285      USE wrk_nemo, ONLY: zwork => wrk_1d_1
286#endif
287      !!
288      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pta    ! tracer flux array at T-point
289      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj)     ::   pmsk   ! Optional 2D basin mask
290      !!
291      INTEGER                           :: ji, jj, jk   ! dummy loop arguments
292      REAL(wp), POINTER, DIMENSION(:,:) :: p_fval       ! return function value
293#if defined key_mpp_mpi
294      INTEGER, DIMENSION(1) ::   ish
295      INTEGER, DIMENSION(2) ::   ish2
296      INTEGER               ::   ijpjjpk
297#endif
298      !!--------------------------------------------------------------------
299      !
300#if defined key_mpp_mpi
301      IF(wrk_in_use(1, 1))THEN
302         CALL ctl_stop('ptr_tjk: requested workspace array unavailable.')
303         RETURN
304      END IF
305#endif
306
307      p_fval => p_fval2d
308
309      p_fval(:,:) = 0._wp
310      DO jk = 1, jpkm1
311         DO jj = 2, jpjm1
312            DO ji =  nldi, nlei   ! No vector optimisation here. Better use a mask ?
313               p_fval(jj,jk) = p_fval(jj,jk) + pta(ji,jj,jk) * e1t(ji,jj) * fse3t(ji,jj,jk) * pmsk(ji,jj)
314            END DO
315         END DO
316      END DO
317#if defined key_mpp_mpi
318      ijpjjpk = jpj*jpk
319      ish(1) = jpj*jpk   ;   ish2(1) = jpj   ;   ish2(2) = jpk
320      zwork(1:ijpjjpk)= RESHAPE( p_fval, ish )
321      CALL mpp_sum( zwork, ijpjjpk, ncomm_znl )
322      p_fval(:,:)= RESHAPE( zwork, ish2 )
323#endif
324      !
325#if defined key_mpp_mpi
326      IF( wrk_not_released(1, 1) )   CALL ctl_stop('ptr_tjk: failed to release workspace array.')
327#endif
328      !   
329   END FUNCTION ptr_tjk
330
331
332   SUBROUTINE dia_ptr( kt )
333      !!----------------------------------------------------------------------
334      !!                  ***  ROUTINE dia_ptr  ***
335      !!----------------------------------------------------------------------
336      USE oce,     vt  =>   ua   ! use ua as workspace
337      USE oce,     vs  =>   ua   ! use ua as workspace
338      IMPLICIT none
339      !!
340      INTEGER, INTENT(in) ::   kt   ! ocean time step index
341      !
342      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
343      REAL(wp) ::   zv               ! local scalar
344      !!----------------------------------------------------------------------
345      !
346      IF( kt == nit000 .OR. MOD( kt, nn_fptr ) == 0 )   THEN
347         !
348         IF( MOD( kt, nn_fptr ) == 0 ) THEN 
349            !
350            IF( ln_diaznl ) THEN               ! i-mean temperature and salinity
351               DO jn = 1, nptr
352                  tn_jk(:,:,jn) = ptr_tjk( tn(:,:,:), btmsk(:,:,jn) ) * r1_sjk(:,:,jn)
353               END DO
354            ENDIF
355            !
356            !                          ! horizontal integral and vertical dz
357            !                                ! eulerian velocity
358            v_msf(:,:,1) = ptr_vjk( vn(:,:,:) ) 
359            DO jn = 2, nptr
360               v_msf(:,:,jn) = ptr_vjk( vn(:,:,:), btmsk(:,:,jn)*btm30(:,:) ) 
361            END DO
362#if defined key_diaeiv
363            DO jn = 1, nptr                  ! bolus velocity
364               v_msf_eiv(:,:,jn) = ptr_vjk( v_eiv(:,:,:), btmsk(:,:,jn) )   ! here no btm30 for MSFeiv
365            END DO
366            !                                ! add bolus stream-function to the eulerian one
367            v_msf(:,:,:) = v_msf(:,:,:) + v_msf_eiv(:,:,:)
368#endif
369            !
370            !                          ! Transports
371            !                                ! local heat & salt transports at T-points  ( tn*mj[vn+v_eiv] )
372            vt(:,:,jpk) = 0._wp   ;   vs(:,:,jpk) = 0._wp
373            DO jk= 1, jpkm1
374               DO jj = 2, jpj
375                  DO ji = 1, jpi
376#if defined key_diaeiv 
377                     zv = ( vn(ji,jj,jk) + vn(ji,jj-1,jk) + v_eiv(ji,jj,jk) + v_eiv(ji,jj-1,jk) ) * 0.5_wp
378#else
379                     zv = ( vn(ji,jj,jk) + vn(ji,jj-1,jk) ) * 0.5_wp
380#endif
381                     vt(:,jj,jk) = zv * tn(:,jj,jk)
382                     vs(:,jj,jk) = zv * sn(:,jj,jk)
383                  END DO
384               END DO
385            END DO
386!!gm useless as overlap areas are not used in ptr_vjk
387            CALL lbc_lnk( vs, 'V', -1. )   ;   CALL lbc_lnk( vt, 'V', -1. )
388!!gm
389            !                                ! heat & salt advective transports (approximation)
390            htr(:,1) = SUM( ptr_vjk( vt(:,:,:) ) , 2 ) * rc_pwatt   ! SUM over jk + conversion
391            str(:,1) = SUM( ptr_vjk( vs(:,:,:) ) , 2 ) * rc_ggram
392            DO jn = 2, nptr 
393               htr(:,jn) = SUM( ptr_vjk( vt(:,:,:), btmsk(:,:,jn)*btm30(:,:) ) , 2 ) * rc_pwatt   ! mask Southern Ocean
394               str(:,jn) = SUM( ptr_vjk( vs(:,:,:), btmsk(:,:,jn)*btm30(:,:) ) , 2 ) * rc_ggram   ! mask Southern Ocean
395            END DO
396
397            IF( ln_ptrcomp ) THEN            ! overturning transport
398               htr_ove(:) = SUM( v_msf(:,:,1) * tn_jk(:,:,1), 2 ) * rc_pwatt   ! SUM over jk + conversion
399               str_ove(:) = SUM( v_msf(:,:,1) * sn_jk(:,:,1), 2 ) * rc_ggram
400            END IF
401            !                                ! Advective and diffusive transport
402            htr_adv(:) = htr_adv(:) * rc_pwatt        ! these are computed in tra_adv... and tra_ldf... routines
403            htr_ldf(:) = htr_ldf(:) * rc_pwatt        ! here just the conversion in PW and Gg
404            str_adv(:) = str_adv(:) * rc_ggram
405            str_ldf(:) = str_ldf(:) * rc_ggram
406
407#if defined key_diaeiv
408            DO jn = 1, nptr                  ! Bolus component
409               htr_eiv(:,jn) = SUM( v_msf_eiv(:,:,jn) * tn_jk(:,:,jn), 2 ) * rc_pwatt   ! SUM over jk
410               str_eiv(:,jn) = SUM( v_msf_eiv(:,:,jn) * sn_jk(:,:,jn), 2 ) * rc_ggram   ! SUM over jk
411            END DO
412#endif
413            !                                ! "Meridional" Stream-Function
414            DO jn = 1, nptr
415               DO jk = 2, jpk 
416                  v_msf    (:,jk,jn) = v_msf    (:,jk-1,jn) + v_msf    (:,jk,jn)       ! Eulerian j-Stream-Function
417#if defined key_diaeiv
418                  v_msf_eiv(:,jk,jn) = v_msf_eiv(:,jk-1,jn) + v_msf_eiv(:,jk,jn)       ! Bolus    j-Stream-Function
419
420#endif
421               END DO
422            END DO
423            v_msf    (:,:,:) = v_msf    (:,:,:) * rc_sv       ! converte in Sverdrups
424#if defined key_diaeiv
425            v_msf_eiv(:,:,:) = v_msf_eiv(:,:,:) * rc_sv
426#endif
427         ENDIF
428         !
429         CALL dia_ptr_wri( kt )                        ! outputs
430         !
431      ENDIF
432      !
433      IF( kt == nitend )   CALL histclo( numptr )      ! Close the file
434      !
435   END SUBROUTINE dia_ptr
436
437
438   SUBROUTINE dia_ptr_init
439      !!----------------------------------------------------------------------
440      !!                  ***  ROUTINE dia_ptr_init  ***
441      !!                   
442      !! ** Purpose :   Initialization, namelist read
443      !!----------------------------------------------------------------------
444      INTEGER ::   jn           ! dummy loop indices
445      INTEGER ::   inum, ierr   ! local integers
446#if defined key_mpp_mpi
447      INTEGER, DIMENSION(1) :: iglo, iloc, iabsf, iabsl, ihals, ihale, idid
448#endif
449      !!
450      NAMELIST/namptr/ ln_diaptr, ln_diaznl, ln_subbas, ln_ptrcomp, nn_fptr, nn_fwri
451      !!----------------------------------------------------------------------
452
453      !                                      ! allocate dia_ptr arrays
454      IF( dia_ptr_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'lim_sbc_init : unable to allocate arrays' )
455
456      REWIND( numnam )                 ! Read Namelist namptr : poleward transport parameters
457      READ  ( numnam, namptr )
458
459      IF(lwp) THEN                     ! Control print
460         WRITE(numout,*)
461         WRITE(numout,*) 'dia_ptr_init : poleward transport and msf initialization'
462         WRITE(numout,*) '~~~~~~~~~~~~'
463         WRITE(numout,*) '   Namelist namptr : set ptr parameters'
464         WRITE(numout,*) '      Poleward heat & salt transport (T) or not (F)      ln_diaptr  = ', ln_diaptr
465         WRITE(numout,*) '      Overturning heat & salt transport                  ln_ptrcomp = ', ln_ptrcomp
466         WRITE(numout,*) '      T & S zonal mean and meridional stream function    ln_diaznl  = ', ln_diaznl 
467         WRITE(numout,*) '      Global (F) or glo/Atl/Pac/Ind/Indo-Pac basins      ln_subbas  = ', ln_subbas
468         WRITE(numout,*) '      Frequency of computation                           nn_fptr    = ', nn_fptr
469         WRITE(numout,*) '      Frequency of outputs                               nn_fwri    = ', nn_fwri
470      ENDIF
471
472      IF( ln_subbas ) THEN   ;   nptr = 5       ! Global, Atlantic, Pacific, Indian, Indo-Pacific
473      ELSE                   ;   nptr = 1       ! Global only
474      ENDIF
475
476      rc_pwatt = rc_pwatt * rau0 * rcp          ! conversion from K.s-1 to PetaWatt
477
478      IF( .NOT. ln_diaptr ) THEN       ! diaptr not used
479        RETURN
480      ENDIF
481     
482      IF( lk_mpp )   CALL mpp_ini_znl( numout )     ! Define MPI communicator for zonal sum
483
484      IF( ln_subbas ) THEN                ! load sub-basin mask
485         CALL iom_open( 'subbasins', inum )
486         CALL iom_get( inum, jpdom_data, 'atlmsk', btmsk(:,:,2) )   ! Atlantic basin
487         CALL iom_get( inum, jpdom_data, 'pacmsk', btmsk(:,:,3) )   ! Pacific  basin
488         CALL iom_get( inum, jpdom_data, 'indmsk', btmsk(:,:,4) )   ! Indian   basin
489         CALL iom_close( inum )
490         btmsk(:,:,5) = MAX ( btmsk(:,:,3), btmsk(:,:,4) )          ! Indo-Pacific basin
491         WHERE( gphit(:,:) < -30._wp)   ;   btm30(:,:) = 0._wp      ! mask out Southern Ocean
492         ELSE WHERE                     ;   btm30(:,:) = tmask(:,:,1)
493         END WHERE
494      ENDIF
495      btmsk(:,:,1) = tmask_i(:,:)                                   ! global ocean
496     
497      DO jn = 1, nptr
498         btmsk(:,:,jn) = btmsk(:,:,jn) * tmask_i(:,:)               ! interior domain only
499      END DO
500     
501      IF( lk_vvl )   CALL ctl_stop( 'diaptr: error in vvl case as constant i-mean surface is used' )
502
503      !                                   ! i-sum of e1v*e3v surface and its inverse
504      DO jn = 1, nptr
505         sjk(:,:,jn) = ptr_tjk( tmask(:,:,:), btmsk(:,:,jn) )
506         r1_sjk(:,:,jn) = 0._wp
507         WHERE( sjk(:,:,jn) /= 0._wp )   r1_sjk(:,:,jn) = 1._wp / sjk(:,:,jn)
508      END DO
509
510#if defined key_mpp_mpi 
511      iglo (1) = jpjglo                   ! MPP case using MPI  ('key_mpp_mpi')
512      iloc (1) = nlcj
513      iabsf(1) = njmppt(narea)
514      iabsl(:) = iabsf(:) + iloc(:) - 1
515      ihals(1) = nldj - 1
516      ihale(1) = nlcj - nlej
517      idid (1) = 2
518      CALL flio_dom_set( jpnj, nproc/jpni, idid, iglo, iloc, iabsf, iabsl, ihals, ihale, 'BOX', nidom_ptr )
519#else
520      nidom_ptr = FLIO_DOM_NONE
521#endif
522      !
523   END SUBROUTINE dia_ptr_init
524
525
526   SUBROUTINE dia_ptr_wri( kt )
527      !!---------------------------------------------------------------------
528      !!                ***  ROUTINE dia_ptr_wri  ***
529      !!
530      !! ** Purpose :   output of poleward fluxes
531      !!
532      !! ** Method  :   NetCDF file
533      !!----------------------------------------------------------------------
534      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
535      USE wrk_nemo, ONLY: zphi => wrk_1d_1, zfoo => wrk_1d_2
536      USE wrk_nemo, ONLY: z_1  => wrk_2d_1
537      !!
538      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
539      !!
540      INTEGER, SAVE ::   nhoridz, ndepidzt, ndepidzw
541      INTEGER, SAVE ::   ndim  , ndim_atl     , ndim_pac     , ndim_ind     , ndim_ipc
542      INTEGER, SAVE ::           ndim_atl_30  , ndim_pac_30  , ndim_ind_30  , ndim_ipc_30
543      INTEGER, SAVE ::   ndim_h, ndim_h_atl_30, ndim_h_pac_30, ndim_h_ind_30, ndim_h_ipc_30
544      !!
545      CHARACTER (len=40) ::   clhstnam, clop, clop_once, cl_comment   ! temporary names
546      INTEGER            ::   iline, it, itmod, ji, jj, jk            !
547#if defined key_iomput
548      INTEGER            ::   inum                                    ! temporary logical unit
549#endif
550      REAL(wp)           ::   zsto, zout, zdt, zjulian                ! temporary scalars
551      !!----------------------------------------------------------------------
552
553      IF( wrk_in_use(1, 1,2) .OR. wrk_in_use(2, 1) )THEN
554         CALL ctl_stop('dia_ptr_wri: ERROR: requested workspace arrays unavailable')   ;   RETURN
555      END IF
556
557      ! define time axis
558      it    = kt / nn_fptr
559      itmod = kt - nit000 + 1
560     
561      ! Initialization
562      ! --------------
563      IF( kt == nit000 ) THEN
564         niter = ( nit000 - 1 ) / nn_fptr
565         zdt = rdt
566         IF( nacc == 1 )   zdt = rdtmin
567         !
568         IF(lwp) THEN
569            WRITE(numout,*)
570            WRITE(numout,*) 'dia_ptr_wri : poleward transport and msf writing: initialization , niter = ', niter
571            WRITE(numout,*) '~~~~~~~~~~~~'
572         ENDIF
573
574         ! Reference latitude (used in plots)
575         ! ------------------
576         !                                           ! =======================
577         IF( cp_cfg == "orca" ) THEN                 !   ORCA configurations
578            !                                        ! =======================
579            IF( jp_cfg == 05  )   iline = 192   ! i-line that passes near the North Pole
580            IF( jp_cfg == 025 )   iline = 384   ! i-line that passes near the North Pole
581            IF( jp_cfg == 1   )   iline =  96   ! i-line that passes near the North Pole
582            IF( jp_cfg == 2   )   iline =  48   ! i-line that passes near the North Pole
583            IF( jp_cfg == 4   )   iline =  24   ! i-line that passes near the North Pole
584            zphi(1:jpj) = 0._wp
585            DO ji = mi0(iline), mi1(iline) 
586               zphi(1:jpj) = gphiv(ji,:)         ! if iline is in the local domain
587               ! Correct highest latitude for some configurations - will work if domain is parallelized in J ?
588               IF( jp_cfg == 05 ) THEN
589                  DO jj = mj0(jpjdta), mj1(jpjdta) 
590                     zphi( jj ) = zphi(mj0(jpjdta-1)) + ( zphi(mj0(jpjdta-1))-zphi(mj0(jpjdta-2)) ) * 0.5_wp
591                     zphi( jj ) = MIN( zphi(jj), 90._wp )
592                  END DO
593               END IF
594               IF( jp_cfg == 1 .OR. jp_cfg == 2 .OR. jp_cfg == 4 ) THEN
595                  DO jj = mj0(jpjdta-1), mj1(jpjdta-1) 
596                     zphi( jj ) = 88.5_wp
597                  END DO
598                  DO jj = mj0(jpjdta  ), mj1(jpjdta  ) 
599                     zphi( jj ) = 89.5_wp
600                  END DO
601               END IF
602            END DO
603            ! provide the correct zphi to all local domains
604#if defined key_mpp_mpi
605            CALL mpp_sum( zphi, jpj, ncomm_znl )       
606#endif
607            !                                        ! =======================
608         ELSE                                        !   OTHER configurations
609            !                                        ! =======================
610            zphi(1:jpj) = gphiv(1,:)             ! assume lat/lon coordinate, select the first i-line
611            !
612         ENDIF
613         !
614         ! Work only on westmost processor (will not work if mppini2 is used)
615#if defined key_mpp_mpi
616         IF( l_znl_root ) THEN 
617#endif
618            !
619            ! OPEN netcdf file
620            ! ----------------
621            ! Define frequency of output and means
622            zsto = nn_fptr * zdt
623            IF( ln_mskland )   THEN    ! put 1.e+20 on land (very expensive!!)
624               clop      = "ave(only(x))"
625               clop_once = "once(only(x))"
626            ELSE                       ! no use of the mask value (require less cpu time)
627               clop      = "ave(x)"       
628               clop_once = "once"
629            ENDIF
630
631            zout = nn_fwri * zdt
632            zfoo(1:jpj) = 0._wp
633
634            CALL ymds2ju( nyear, nmonth, nday, rdt, zjulian )  ! Compute julian date from starting date of the run
635            zjulian = zjulian - adatrj                         ! set calendar origin to the beginning of the experiment
636
637#if defined key_iomput
638            ! Requested by IPSL people, use by their postpro...
639            IF(lwp) THEN
640               CALL dia_nam( clhstnam, nn_fwri,' ' )
641               CALL ctl_opn( inum, 'date.file', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, narea )
642               WRITE(inum,*) clhstnam
643               CLOSE(inum)
644            ENDIF
645#endif
646
647            CALL dia_nam( clhstnam, nn_fwri, 'diaptr' )
648            IF(lwp)WRITE( numout,*)" Name of diaptr NETCDF file : ", clhstnam
649
650            ! Horizontal grid : zphi()
651            CALL histbeg(clhstnam, 1, zfoo, jpj, zphi,   &
652               1, 1, 1, jpj, niter, zjulian, zdt*nn_fptr, nhoridz, numptr, domain_id=nidom_ptr)
653            ! Vertical grids : gdept_0, gdepw_0
654            CALL histvert( numptr, "deptht", "Vertical T levels",   &
655               &                   "m", jpk, gdept_0, ndepidzt, "down" )
656            CALL histvert( numptr, "depthw", "Vertical W levels",   &
657               &                   "m", jpk, gdepw_0, ndepidzw, "down" )
658            !
659            CALL wheneq ( jpj*jpk, MIN(sjk(:,:,1), 1._wp), 1, 1., ndex  , ndim  )      ! Lat-Depth
660            CALL wheneq ( jpj    , MIN(sjk(:,1,1), 1._wp), 1, 1., ndex_h, ndim_h )     ! Lat
661
662            IF( ln_subbas ) THEN
663               z_1(:,1) = 1._wp
664               WHERE ( gphit(jpi/2,:) < -30._wp )   z_1(:,1) = 0._wp
665               DO jk = 2, jpk
666                  z_1(:,jk) = z_1(:,1)
667               END DO
668               !                       ! Atlantic (jn=2)
669               CALL wheneq ( jpj*jpk, MIN(sjk(:,:,2)         , 1._wp), 1, 1., ndex_atl     , ndim_atl      ) ! Lat-Depth
670               CALL wheneq ( jpj*jpk, MIN(sjk(:,:,2)*z_1(:,:), 1._wp), 1, 1., ndex_atl_30  , ndim_atl_30   ) ! Lat-Depth
671               CALL wheneq ( jpj    , MIN(sjk(:,1,2)*z_1(:,1), 1._wp), 1, 1., ndex_h_atl_30, ndim_h_atl_30 ) ! Lat
672               !                       ! Pacific (jn=3)
673               CALL wheneq ( jpj*jpk, MIN(sjk(:,:,3)         , 1._wp), 1, 1., ndex_pac     , ndim_pac      ) ! Lat-Depth
674               CALL wheneq ( jpj*jpk, MIN(sjk(:,:,3)*z_1(:,:), 1._wp), 1, 1., ndex_pac_30  , ndim_pac_30   ) ! Lat-Depth
675               CALL wheneq ( jpj    , MIN(sjk(:,1,3)*z_1(:,1), 1._wp), 1, 1., ndex_h_pac_30, ndim_h_pac_30 ) ! Lat
676               !                       ! Indian (jn=4)
677               CALL wheneq ( jpj*jpk, MIN(sjk(:,:,4)         , 1._wp), 1, 1., ndex_ind     , ndim_ind      ) ! Lat-Depth
678               CALL wheneq ( jpj*jpk, MIN(sjk(:,:,4)*z_1(:,:), 1._wp), 1, 1., ndex_ind_30  , ndim_ind_30   ) ! Lat-Depth
679               CALL wheneq ( jpj    , MIN(sjk(:,1,4)*z_1(:,1), 1._wp), 1, 1., ndex_h_ind_30, ndim_h_ind_30 ) ! Lat
680               !                       ! Indo-Pacific (jn=5)
681               CALL wheneq ( jpj*jpk, MIN(sjk(:,:,5)         , 1._wp), 1, 1., ndex_ipc     , ndim_ipc      ) ! Lat-Depth
682               CALL wheneq ( jpj*jpk, MIN(sjk(:,:,5)*z_1(:,:), 1._wp), 1, 1., ndex_ipc_30  , ndim_ipc_30   ) ! Lat-Depth
683               CALL wheneq ( jpj    , MIN(sjk(:,1,5)*z_1(:,1), 1._wp), 1, 1., ndex_h_ipc_30, ndim_h_ipc_30 ) ! Lat
684            ENDIF
685            !
686#if defined key_diaeiv
687            cl_comment = ' (Bolus part included)'
688#else
689            cl_comment = '                      '
690#endif
691            IF( ln_diaznl ) THEN             !  Zonal mean T and S
692               CALL histdef( numptr, "zotemglo", "Zonal Mean Temperature","C" ,   &
693                  1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop, zsto, zout )
694               CALL histdef( numptr, "zosalglo", "Zonal Mean Salinity","PSU"  ,   &
695                  1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop, zsto, zout )
696
697               CALL histdef( numptr, "zosrfglo", "Zonal Mean Surface","m^2"   ,   &
698                  1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop_once, zsto, zout )
699               !
700               IF (ln_subbas) THEN
701                  CALL histdef( numptr, "zotematl", "Zonal Mean Temperature: Atlantic","C" ,   &
702                     1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop, zsto, zout )
703                  CALL histdef( numptr, "zosalatl", "Zonal Mean Salinity: Atlantic","PSU"  ,   &
704                     1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop, zsto, zout )
705                  CALL histdef( numptr, "zosrfatl", "Zonal Mean Surface: Atlantic","m^2"   ,   &
706                     1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop_once, zsto, zout )
707
708                  CALL histdef( numptr, "zotempac", "Zonal Mean Temperature: Pacific","C"  ,   &
709                     1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop, zsto, zout )
710                  CALL histdef( numptr, "zosalpac", "Zonal Mean Salinity: Pacific","PSU"   ,   &
711                     1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop, zsto, zout )
712                  CALL histdef( numptr, "zosrfpac", "Zonal Mean Surface: Pacific","m^2"    ,   &
713                     1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop_once, zsto, zout )
714
715                  CALL histdef( numptr, "zotemind", "Zonal Mean Temperature: Indian","C"   ,   &
716                     1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop, zsto, zout )
717                  CALL histdef( numptr, "zosalind", "Zonal Mean Salinity: Indian","PSU"    ,   &
718                     1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop, zsto, zout )
719                  CALL histdef( numptr, "zosrfind", "Zonal Mean Surface: Indian","m^2"     ,   &
720                     1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop_once, zsto, zout )
721
722                  CALL histdef( numptr, "zotemipc", "Zonal Mean Temperature: Pacific+Indian","C" ,   &
723                     1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop, zsto, zout )
724                  CALL histdef( numptr, "zosalipc", "Zonal Mean Salinity: Pacific+Indian","PSU"  ,   &
725                     1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop, zsto, zout )
726                  CALL histdef( numptr, "zosrfipc", "Zonal Mean Surface: Pacific+Indian","m^2"   ,   &
727                     1, jpj, nhoridz, jpk, 1, jpk, ndepidzt, 32, clop_once, zsto, zout )
728               ENDIF
729            ENDIF
730            !
731            !  Meridional Stream-Function (Eulerian and Bolus)
732            CALL histdef( numptr, "zomsfglo", "Meridional Stream-Function: Global"//TRIM(cl_comment),"Sv" ,   &
733               1, jpj, nhoridz, jpk, 1, jpk, ndepidzw, 32, clop, zsto, zout )
734            IF( ln_subbas .AND. ln_diaznl ) THEN
735               CALL histdef( numptr, "zomsfatl", "Meridional Stream-Function: Atlantic"//TRIM(cl_comment),"Sv" ,   &
736                  1, jpj, nhoridz, jpk, 1, jpk, ndepidzw, 32, clop, zsto, zout )
737               CALL histdef( numptr, "zomsfpac", "Meridional Stream-Function: Pacific"//TRIM(cl_comment),"Sv"  ,   &
738                  1, jpj, nhoridz, jpk, 1, jpk, ndepidzw, 32, clop, zsto, zout )
739               CALL histdef( numptr, "zomsfind", "Meridional Stream-Function: Indian"//TRIM(cl_comment),"Sv"   ,   &
740                  1, jpj, nhoridz, jpk, 1, jpk, ndepidzw, 32, clop, zsto, zout )
741               CALL histdef( numptr, "zomsfipc", "Meridional Stream-Function: Indo-Pacific"//TRIM(cl_comment),"Sv" ,&
742                  1, jpj, nhoridz, jpk, 1, jpk, ndepidzw, 32, clop, zsto, zout )
743            ENDIF
744            !
745            !  Heat transport
746            CALL histdef( numptr, "sophtadv", "Advective Heat Transport"      ,   &
747               "PW", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
748            CALL histdef( numptr, "sophtldf", "Diffusive Heat Transport"      ,   &
749               "PW",1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
750            IF ( ln_ptrcomp ) THEN
751               CALL histdef( numptr, "sophtove", "Overturning Heat Transport"    ,   &
752                  "PW",1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
753            END IF
754            IF( ln_subbas ) THEN
755               CALL histdef( numptr, "sohtatl", "Heat Transport Atlantic"//TRIM(cl_comment),  &
756                  "PW", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
757               CALL histdef( numptr, "sohtpac", "Heat Transport Pacific"//TRIM(cl_comment) ,  &
758                  "PW", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
759               CALL histdef( numptr, "sohtind", "Heat Transport Indian"//TRIM(cl_comment)  ,  &
760                  "PW", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
761               CALL histdef( numptr, "sohtipc", "Heat Transport Pacific+Indian"//TRIM(cl_comment), &
762                  "PW", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
763            ENDIF
764            !
765            !  Salt transport
766            CALL histdef( numptr, "sopstadv", "Advective Salt Transport"      ,   &
767               "Giga g/s", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
768            CALL histdef( numptr, "sopstldf", "Diffusive Salt Transport"      ,   &
769               "Giga g/s", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
770            IF ( ln_ptrcomp ) THEN
771               CALL histdef( numptr, "sopstove", "Overturning Salt Transport"    ,   &
772                  "Giga g/s", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
773            END IF
774#if defined key_diaeiv
775            ! Eddy induced velocity
776            CALL histdef( numptr, "zomsfeiv", "Bolus Meridional Stream-Function: global",   &
777               "Sv"      , 1, jpj, nhoridz, jpk, 1, jpk, ndepidzw, 32, clop, zsto, zout )
778            CALL histdef( numptr, "sophteiv", "Bolus Advective Heat Transport",   &
779               "PW"      , 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
780            CALL histdef( numptr, "sopsteiv", "Bolus Advective Salt Transport",   &
781               "Giga g/s", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
782#endif
783            IF( ln_subbas ) THEN
784               CALL histdef( numptr, "sostatl", "Salt Transport Atlantic"//TRIM(cl_comment)      ,  &
785                  "Giga g/s", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
786               CALL histdef( numptr, "sostpac", "Salt Transport Pacific"//TRIM(cl_comment)      ,   &
787                  "Giga g/s", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
788               CALL histdef( numptr, "sostind", "Salt Transport Indian"//TRIM(cl_comment)      ,    &
789                  "Giga g/s", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
790               CALL histdef( numptr, "sostipc", "Salt Transport Pacific+Indian"//TRIM(cl_comment),  &
791                  "Giga g/s", 1, jpj, nhoridz, 1, 1, 1, -99, 32, clop, zsto, zout )
792            ENDIF
793            !
794            CALL histend( numptr )
795            !
796         END IF
797#if defined key_mpp_mpi
798      END IF
799#endif
800
801#if defined key_mpp_mpi
802      IF( MOD( itmod, nn_fptr ) == 0 .AND. l_znl_root ) THEN
803#else
804      IF( MOD( itmod, nn_fptr ) == 0  ) THEN
805#endif
806         niter = niter + 1
807
808         IF( ln_diaznl ) THEN
809            CALL histwrite( numptr, "zosrfglo", niter, sjk  (:,:,1) , ndim, ndex )
810            CALL histwrite( numptr, "zotemglo", niter, tn_jk(:,:,1)  , ndim, ndex )
811            CALL histwrite( numptr, "zosalglo", niter, sn_jk(:,:,1)  , ndim, ndex )
812
813            IF (ln_subbas) THEN
814               CALL histwrite( numptr, "zosrfatl", niter, sjk(:,:,2), ndim_atl, ndex_atl )
815               CALL histwrite( numptr, "zosrfpac", niter, sjk(:,:,3), ndim_pac, ndex_pac )
816               CALL histwrite( numptr, "zosrfind", niter, sjk(:,:,4), ndim_ind, ndex_ind )
817               CALL histwrite( numptr, "zosrfipc", niter, sjk(:,:,5), ndim_ipc, ndex_ipc )
818
819               CALL histwrite( numptr, "zotematl", niter, tn_jk(:,:,2)  , ndim_atl, ndex_atl )
820               CALL histwrite( numptr, "zosalatl", niter, sn_jk(:,:,2)  , ndim_atl, ndex_atl )
821               CALL histwrite( numptr, "zotempac", niter, tn_jk(:,:,3)  , ndim_pac, ndex_pac )
822               CALL histwrite( numptr, "zosalpac", niter, sn_jk(:,:,3)  , ndim_pac, ndex_pac )
823               CALL histwrite( numptr, "zotemind", niter, tn_jk(:,:,4)  , ndim_ind, ndex_ind )
824               CALL histwrite( numptr, "zosalind", niter, sn_jk(:,:,4)  , ndim_ind, ndex_ind )
825               CALL histwrite( numptr, "zotemipc", niter, tn_jk(:,:,5)  , ndim_ipc, ndex_ipc )
826               CALL histwrite( numptr, "zosalipc", niter, sn_jk(:,:,5)  , ndim_ipc, ndex_ipc )
827            END IF
828         ENDIF
829
830         ! overturning outputs:
831         CALL histwrite( numptr, "zomsfglo", niter, v_msf(:,:,1), ndim, ndex )
832         IF( ln_subbas .AND. ln_diaznl ) THEN
833            CALL histwrite( numptr, "zomsfatl", niter, v_msf(:,:,2) , ndim_atl_30, ndex_atl_30 )
834            CALL histwrite( numptr, "zomsfpac", niter, v_msf(:,:,3) , ndim_pac_30, ndex_pac_30 )
835            CALL histwrite( numptr, "zomsfind", niter, v_msf(:,:,4) , ndim_ind_30, ndex_ind_30 )
836            CALL histwrite( numptr, "zomsfipc", niter, v_msf(:,:,5) , ndim_ipc_30, ndex_ipc_30 )
837         ENDIF
838#if defined key_diaeiv
839         CALL histwrite( numptr, "zomsfeiv", niter, v_msf_eiv(:,:,1), ndim  , ndex   )
840#endif
841
842         ! heat transport outputs:
843         IF( ln_subbas ) THEN
844            CALL histwrite( numptr, "sohtatl", niter, htr(:,2)  , ndim_h_atl_30, ndex_h_atl_30 )
845            CALL histwrite( numptr, "sohtpac", niter, htr(:,3)  , ndim_h_pac_30, ndex_h_pac_30 )
846            CALL histwrite( numptr, "sohtind", niter, htr(:,4)  , ndim_h_ind_30, ndex_h_ind_30 )
847            CALL histwrite( numptr, "sohtipc", niter, htr(:,5)  , ndim_h_ipc_30, ndex_h_ipc_30 )
848            CALL histwrite( numptr, "sostatl", niter, str(:,2)  , ndim_h_atl_30, ndex_h_atl_30 )
849            CALL histwrite( numptr, "sostpac", niter, str(:,3)  , ndim_h_pac_30, ndex_h_pac_30 )
850            CALL histwrite( numptr, "sostind", niter, str(:,4)  , ndim_h_ind_30, ndex_h_ind_30 )
851            CALL histwrite( numptr, "sostipc", niter, str(:,5)  , ndim_h_ipc_30, ndex_h_ipc_30 )
852         ENDIF
853
854         CALL histwrite( numptr, "sophtadv", niter, htr_adv     , ndim_h, ndex_h )
855         CALL histwrite( numptr, "sophtldf", niter, htr_ldf     , ndim_h, ndex_h )
856         CALL histwrite( numptr, "sopstadv", niter, str_adv     , ndim_h, ndex_h )
857         CALL histwrite( numptr, "sopstldf", niter, str_ldf     , ndim_h, ndex_h )
858         IF( ln_ptrcomp ) THEN
859            CALL histwrite( numptr, "sopstove", niter, str_ove(:) , ndim_h, ndex_h )
860            CALL histwrite( numptr, "sophtove", niter, htr_ove(:) , ndim_h, ndex_h )
861         ENDIF
862#if defined key_diaeiv
863         CALL histwrite( numptr, "sophteiv", niter, htr_eiv(:,1)  , ndim_h, ndex_h )
864         CALL histwrite( numptr, "sopsteiv", niter, str_eiv(:,1)  , ndim_h, ndex_h )
865#endif
866         !
867      ENDIF
868      !
869      IF( wrk_not_released(1, 1,2) .OR. wrk_not_released(2, 1) )   &
870         CALL ctl_stop('dia_ptr_wri: failed to release workspace arrays')
871      !
872  END SUBROUTINE dia_ptr_wri
873
874   !!======================================================================
875END MODULE diaptr
Note: See TracBrowser for help on using the repository browser.