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.
diaregmean.F90 in NEMO/branches/UKMO/NEMO_4.0.4_CO9_shelf_climate/src/OCE/DIA – NEMO

source: NEMO/branches/UKMO/NEMO_4.0.4_CO9_shelf_climate/src/OCE/DIA/diaregmean.F90 @ 15353

Last change on this file since 15353 was 15353, checked in by hadjt, 2 years ago

Region mean:

Adding iom_use to only process variable that are needed. This is currently in a very clunky method. Next itreation will streamline the code, and loop though variables.

File size: 84.0 KB
Line 
1MODULE diaregmean 
2   !!======================================================================
3   !!                       ***  MODULE  diaharm  ***
4   !! Timeseries of Regional Means
5   !!======================================================================
6   !! History :  3.6  !  11/2016  (J Tinker)  Original code
7   !!----------------------------------------------------------------------
8   USE oce             ! ocean dynamics and tracers variables
9   USE dom_oce         ! ocean space and time domain
10   USE in_out_manager  ! I/O units
11   USE iom             ! I/0 library
12   !JT USE wrk_nemo        ! working arrays
13   USE diapea          ! PEA
14   USE zdfmxl          ! MLD
15   USE sbc_oce
16   USE diaar5
17
18
19#if defined key_fabm
20   USE trc
21   USE par_fabm
22#endif
23
24   IMPLICIT NONE
25   PRIVATE
26
27   LOGICAL , PUBLIC ::   ln_diaregmean  ! region mean calculation
28   INTEGER , PUBLIC ::   n_regions_output
29   PUBLIC   dia_regmean_init            ! routine called by nemogcm.F90
30   PUBLIC   dia_regmean                 ! routine called by diawri.F90   
31   PUBLIC   dia_calctmb_region_mean     ! routine called by diatmb.F90
32
33   
34   
35   LOGICAL :: ln_diaregmean_ascii       ! region mean calculation ascii output
36   LOGICAL :: ln_diaregmean_bin         ! region mean calculation binary output
37   LOGICAL :: ln_diaregmean_nc          ! region mean calculation netcdf output
38   LOGICAL :: ln_diaregmean_diaar5      ! region mean calculation including AR5 SLR terms
39   LOGICAL :: ln_diaregmean_diasbc      ! region mean calculation including Surface BC
40   LOGICAL :: ln_diaregmean_karamld     ! region mean calculation including kara mld terms
41   LOGICAL :: ln_diaregmean_pea         ! region mean calculation including pea terms
42
43
44   LOGICAL :: ln_diaregmean_bgc         ! region mean calculation including BGC terms
45
46
47   
48   REAL(wp), SAVE, ALLOCATABLE,   DIMENSION(:,:,:)  ::   tmp_region_mask_real   ! tempory region_mask of reals
49   INTEGER,  SAVE, ALLOCATABLE,   DIMENSION(:,:,:)  ::   region_mask            ! region_mask matrix
50   INTEGER                                          ::   nmasks                 ! Number of mask files in region_mask.nc file -
51   INTEGER,  SAVE, ALLOCATABLE,   DIMENSION(:)      ::   nreg_mat               ! Number of regions in each mask
52   
53   REAL(wp),  ALLOCATABLE,   DIMENSION(:,:,:) ::   tmp_field_mat !: temporary region_mask
54   REAL(wp),  ALLOCATABLE,   DIMENSION(:,:,:) ::   tmp_field_AR5_mat !: temporary region_mask
55   REAL(wp),  ALLOCATABLE,   DIMENSION(:,:,:) ::   tmp_field_SBC_mat !: temporary region_mask
56   INTEGER  ::   tmp_field_cnt                                   ! tmp_field_cnt integer
57   !!----------------------------------------------------------------------
58   !! NEMO/OPA 3.6 , NEMO Consortium (2014)
59   !! $Id$
60   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
61   !!----------------------------------------------------------------------
62CONTAINS
63
64   SUBROUTINE dia_regmean_init 
65      !!---------------------------------------------------------------------------
66      !!                  ***  ROUTINE dia_regmean_init  ***
67      !!     
68      !! ** Purpose: Initialization of region mask namelist
69      !!       
70      !! ** Method : Read namelist
71      !!   History
72      !!   3.6  !  11-16  (J Tinker) Routine to initialize dia_regmean
73      !!---------------------------------------------------------------------------
74      !!
75      INTEGER ::   ios                  ! Local integer output status for namelist read
76      INTEGER  ::  inum                 ! temporary logical unit ! copied from DOM/domzgr.F90
77      INTEGER  ::   ierr                ! error integer for IOM_get
78      INTEGER  ::   idmaskvar           ! output of iom_varid
79      INTEGER  ::   maskno              ! counter for number of masks
80      INTEGER  ::   jj,ji               ! i and j index
81      INTEGER  ::   tmpint              ! temporary integer
82      INTEGER  ::   nn_regions_output,check_regions_output
83      REAL(wp),  ALLOCATABLE,   DIMENSION(:,:) ::   tmpregion !: temporary region_mask
84      INTEGER, DIMENSION(3) ::   zdimsz   ! number of elements in each of the 3 dimensions (i.e., lon, lat, no of masks, 297,  375,  4) for an array
85      INTEGER               ::   zndims   ! number of dimensions in an array (i.e. 3, )
86
87      CHARACTER(len=128) :: stop_error_message
88#if defined key_fabm
89      INTEGER               ::   js,jl,jn, tmp_dummy
90
91      CHARACTER (len=120) ::    tmp_name,tmp_long_name, tmp_unit
92
93      INTEGER               ::   BGC_nlevs,nBGC_output, bgci
94      CHARACTER(len = 10), ALLOCATABLE, DIMENSION(:)       ::   BGC_stat_name(:),BGC_lev_name(:),BGC_output_var(:)
95#endif
96
97     
98#if defined key_fabm
99      NAMELIST/nam_diaregmean/ ln_diaregmean,nn_regions_output,ln_diaregmean_ascii,ln_diaregmean_bin,ln_diaregmean_nc,&
100        & ln_diaregmean_karamld, ln_diaregmean_pea,ln_diaregmean_diaar5,ln_diaregmean_diasbc,ln_diaregmean_bgc
101#else
102      NAMELIST/nam_diaregmean/ ln_diaregmean,nn_regions_output,ln_diaregmean_ascii,ln_diaregmean_bin,ln_diaregmean_nc,&
103        & ln_diaregmean_karamld, ln_diaregmean_pea,ln_diaregmean_diaar5,ln_diaregmean_diasbc
104#endif
105     
106     
107      ! read in Namelist.
108      !!----------------------------------------------------------------------
109      !
110      REWIND ( numnam_ref )              ! Read Namelist nam_diatmb in referdiatmbence namelist : TMB diagnostics
111      READ   ( numnam_ref, nam_diaregmean, IOSTAT=ios, ERR= 901 )
112901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'nam_diaregmean in reference namelist' )
113
114      REWIND( numnam_cfg )              ! Namelist nam_diatmb in configuration namelist  TMB diagnostics
115      READ  ( numnam_cfg, nam_diaregmean, IOSTAT = ios, ERR = 902 )
116902   IF( ios > 0 ) CALL ctl_nam ( ios , 'nam_diaregmean in configuration namelist' )
117      IF(lwm) WRITE ( numond, nam_diaregmean )
118
119      IF(lwp) THEN                   ! Control print
120          WRITE(numout,*)
121          WRITE(numout,*) 'dia_regmean_init : Output regional mean Diagnostics'
122          WRITE(numout,*) '~~~~~~~~~~~~'
123          WRITE(numout,*) 'Namelist nam_regmean : set regmeanoutputs '
124          WRITE(numout,*) 'Switch for regmean diagnostics (T) or not (F)  ln_diaregmean  = ', ln_diaregmean
125          WRITE(numout,*) 'Switch for regmean ascii output (T) or not (F)  ln_diaregmean_ascii  = ', ln_diaregmean_ascii
126          WRITE(numout,*) 'Switch for regmean binary output (T) or not (F)  ln_diaregmean_bin  = ', ln_diaregmean_bin
127          WRITE(numout,*) 'Switch for regmean netcdf output (T) or not (F)  ln_diaregmean_nc  = ', ln_diaregmean_nc
128          WRITE(numout,*) 'Switch for regmean kara mld terms (T) or not (F)  ln_diaregmean_karamld  = ', ln_diaregmean_karamld
129          WRITE(numout,*) 'Switch for regmean PEA terms (T) or not (F)  ln_diaregmean_pea  = ', ln_diaregmean_pea
130          WRITE(numout,*) 'Switch for regmean AR5 SLR terms (T) or not (F)  ln_diaregmean_diaar5  = ', ln_diaregmean_diaar5
131          WRITE(numout,*) 'Switch for regmean Surface forcing terms (T) or not (F)  ln_diaregmean_diasbc  = ', ln_diaregmean_diasbc
132          WRITE(numout,*) 'Switch for regmean BioGeoChemistry terms (T) or not (F)  ln_diaregmean_bgc  = ', ln_diaregmean_bgc
133      ENDIF
134     
135     
136      ALLOCATE( tmp_field_mat(jpi,jpj,19),  STAT= ierr ) !SS/NB/DT/ZA/VA T/S, SSH, MLD, PEA, PEAT, PEAS
137          IF( ierr /= 0 )   CALL ctl_stop( 'tmp_field_mat: failed to allocate tmp_field_mat array' )
138      tmp_field_mat(:,:,:) = 0.
139      tmp_field_cnt = 0
140     
141      IF(ln_diaregmean_diaar5) THEN   
142        ALLOCATE( tmp_field_AR5_mat(jpi,jpj,4),  STAT= ierr ) !SLR terms
143            IF( ierr /= 0 )   CALL ctl_stop( 'tmp_field_AR5_mat: failed to allocate tmp_field_AR5_mat array' )
144        tmp_field_AR5_mat(:,:,:) = 0.
145      ENDIF
146     
147      IF(ln_diaregmean_diasbc) THEN   
148        ALLOCATE( tmp_field_SBC_mat(jpi,jpj,7),  STAT= ierr ) !SBC terms
149            IF( ierr /= 0 )   CALL ctl_stop( 'tmp_field_SBC_mat: failed to allocate tmp_field_SBC_mat array' )
150        tmp_field_SBC_mat(:,:,:) = 0.
151      ENDIF
152
153
154#if defined key_fabm
155      ! as there are so many BGC variables, write out the necessary iodef.xml and field_def.xml entries into ocean.output
156     
157      IF(ln_diaregmean_bgc) THEN   
158            IF(lwp) THEN                   ! Control print
159
160                BGC_nlevs = 5
161                ALLOCATE( BGC_stat_name(6),BGC_lev_name(BGC_nlevs))
162                nBGC_output = 16
163                ALLOCATE( BGC_output_var(nBGC_output))
164
165                BGC_output_var(1) = 'N1_p'
166                BGC_output_var(2) = 'N3_n'
167                BGC_output_var(3) = 'N4_n'
168                BGC_output_var(4) = 'N5_s'
169                BGC_output_var(5) = 'O2_o'
170                BGC_output_var(6) = 'P1_Chl'
171                BGC_output_var(7) = 'P2_Chl'
172                BGC_output_var(8) = 'P3_Chl'
173                BGC_output_var(9) = 'P4_Chl'
174                BGC_output_var(10) = 'P1_c'
175                BGC_output_var(11) = 'P2_c'
176                BGC_output_var(12) = 'P3_c'
177                BGC_output_var(13) = 'P4_c'
178                BGC_output_var(14) = 'Z4_c'
179                BGC_output_var(15) = 'Z5_c'
180                BGC_output_var(16) = 'Z6_c'
181               
182                BGC_stat_name(1) = '_ave'
183                BGC_stat_name(2) = '_tot'
184                BGC_stat_name(3) = '_var'
185                BGC_stat_name(4) = '_cnt'
186                BGC_stat_name(5) = '_reg_id'
187                BGC_stat_name(6) = '_mask_id'
188                BGC_lev_name(1) = 'top'
189                BGC_lev_name(2) = 'bot'
190                BGC_lev_name(3) = 'dif'
191                BGC_lev_name(4) = 'zav'
192                BGC_lev_name(5) = 'vol'
193
194
195                WRITE(numout,*) ''
196                WRITE(numout,*) 'diaregmean BGC field_def.xml entries'
197                WRITE(numout,*) ''
198               
199               
200                DO jn=1,jp_fabm ! State loop
201                    DO js=1,6
202                        DO jl=1,BGC_nlevs
203               
204                            tmp_name=TRIM( TRIM("reg_")//TRIM(BGC_lev_name(jl))//TRIM("_")//TRIM(ctrcnm(jn))// TRIM(BGC_stat_name(js)) )
205
206                            tmp_long_name  = TRIM(ctrcln(jn))
207                            tmp_unit       = TRIM(ctrcun(jn))
208                           
209                            ! Where using volume integrated values, change units...
210
211                            IF ((jl .EQ. 5) .AND. (js .EQ. 2)) then
212                                SELECT CASE (trim(tmp_unit))
213                                    CASE ('mg C/m^3') ;     tmp_unit = 'Mg C (T C)' !'mg C/m^3'
214                                    CASE ('mg/m^3') ;       tmp_unit = 'Mg (T)'     !'mg/m^3'
215                                    CASE ('mmol C/m^3') ;   tmp_unit = 'Mmol C'     !'mmol C/m^3'
216                                    CASE ('mmol N/m^3') ;   tmp_unit = 'Mmol N'     !'mmol N/m^3'
217                                    CASE ('mmol O_2/m^3') ; tmp_unit = 'Mmol O'     !'mmol O_2/m^3'
218                                    CASE ('mmol P/m^3') ;   tmp_unit = 'Mmol P'     !'mmol P/m^3'
219                                    CASE ('mmol Si/m^3') ;  tmp_unit = 'Mmol S'     !'mmol Si/m^3'
220                                    CASE ('umol/kg') ;      tmp_unit = 'Mmol'       !'umol/kg'   =  mmol/m^3
221                                   ! CASE ('1/m') ;      cycle
222                                    CASE DEFAULT
223                                           tmp_unit = TRIM(TRIM(tmp_unit)//TRIM('x 1e9 m^3'))
224                                END SELECT
225                            ENDIF
226
227                            WRITE(numout,*) TRIM(TRIM('<field id="')//TRIM(tmp_name)//TRIM('"         long_name="')// &
228         &                        TRIM(BGC_lev_name(jl))//TRIM('_')//TRIM(tmp_long_name)//TRIM(BGC_stat_name(js))// &
229         &                        TRIM('"     unit="'//TRIM(tmp_unit)  //'" />'))
230
231                        END DO
232                    END DO
233                END DO
234       
235                WRITE(numout,*) ''
236                WRITE(numout,*) 'diaregmean BGC iodef.xml entries'
237                WRITE(numout,*) ''
238                DO js=1,6
239
240                    DO jn=1,jp_fabm ! State loop
241                       
242                        DO bgci=1,nBGC_output!
243                            if (trim(ctrcnm(jn)) == TRIM(BGC_output_var(bgci))) CYCLE
244                        ENDDO
245                        DO jl=1,BGC_nlevs
246                            ! only print out area averages for ss, nb, diff, and depth averaged, and total values for volume integrated
247                            IF ((jl .EQ. 5) .AND. (js .NE. 2)) CYCLE ! cycle if vol, and not tot.
248                            IF ((jl .NE. 5) .AND. (js .NE. 1)) CYCLE ! cycle if other levels, and not ave.
249               
250                            tmp_name=TRIM(TRIM("reg_")//TRIM(BGC_lev_name(jl))//TRIM("_")//TRIM(ctrcnm(jn))// TRIM(BGC_stat_name(js))) 
251                            tmp_long_name  = TRIM(ctrcln(jn))
252
253                            WRITE(numout,*) TRIM(TRIM('<field field_ref="')//TRIM(tmp_name)//TRIM('"/>'))
254
255                        END DO !level
256                    END DO ! State loop
257                END DO !statistic
258                WRITE(numout,*) ''
259                DEALLOCATE( BGC_stat_name,BGC_lev_name)
260
261            ENDIF   ! Control print
262
263      ENDIF !ln_diaregmean_bgc
264     
265#endif
266
267     
268      IF (ln_diaregmean) THEN
269     
270          ! Open region mask for region means, and retrieve the size of the mask (number of levels)         
271          CALL iom_open ( 'region_mask.nc', inum )
272          idmaskvar = iom_varid( inum, 'mask', kdimsz=zdimsz, kndims=zndims, ldstop = .FALSE.)         
273          nmasks = zdimsz(3)
274         
275          ! read in the region mask (which contains floating point numbers) into a temporary array of reals.
276          ALLOCATE( tmp_region_mask_real(jpi,jpj,nmasks),  STAT= ierr )
277          IF( ierr /= 0 )   CALL ctl_stop( 'dia_regmean_init: failed to allocate tmp_region_mask_real array' )
278         
279          ! Use jpdom_unknown to read in a n-layer mask.
280          tmp_region_mask_real(:,:,:) = 0
281          CALL iom_get( inum, jpdom_unknown, 'mask', tmp_region_mask_real(1:nlci,1:nlcj,1:nmasks),   &
282              &          kstart = (/ mig(1),mjg(1),1 /), kcount = (/ nlci,nlcj,nmasks /) )
283         
284          CALL iom_close( inum )
285         
286          !Convert the region mask of reals into one of integers.
287         
288          ALLOCATE( region_mask(jpi,jpj,nmasks),  STAT= ierr )
289          IF( ierr /= 0 )   CALL ctl_stop( 'dia_regmean_init: failed to allocate region_mask array' )
290          region_mask(:,:,:) = 0
291          region_mask = int(tmp_region_mask_real(:,:,:))
292          DEALLOCATE( tmp_region_mask_real)
293         
294         
295          ALLOCATE( nreg_mat(nmasks),  STAT= ierr )
296          IF( ierr /= 0 )   CALL ctl_stop( 'dia_regmean_init: failed to allocate nreg_mat array' )
297
298          ! work out the number of regions in each mask, asssuming land is 0, and the regions are consectively numbered,
299          ! without missing any number, so the number of regions is the maximum number + 1 (for land). mpp_max across the
300          ! processors to get the global maxima
301          check_regions_output = 0
302          DO maskno = 1,nmasks
303              tmpint = maxval(region_mask(:,:,maskno))
304              CALL mpp_max( 'diaregionmean', tmpint )
305              nreg_mat(maskno) = tmpint + 1
306              check_regions_output = check_regions_output + tmpint + 1
307          END DO
308
309
310
311          ! can't use IOM call, as this iom isn't called yet... maybe move into step after iom_init?
312          n_regions_output = nn_regions_output
313          write (stop_error_message, "(A70,I3,A8,I3)") "dia_regmean_init: namelist:nam_diaregmean nn_regions_output should be ",check_regions_output," but is ",n_regions_output
314         
315          IF (check_regions_output .NE. n_regions_output) THEN
316              CALL ctl_stop(trim(stop_error_message))
317          ENDIF
318
319
320
321
322          IF(lwp) THEN 
323              ! if writing out as binary and text, open the files.
324              IF ( ln_diaregmean_bin ) THEN
325                  ! Open binary for region means
326                  !JT CALL ctl_opn( numdct_reg_bin  ,'region_mean_timeseries.dat'  , 'NEW', 'UNFORMATTED', 'SEQUENTIAL', -1, numout,  .TRUE. )
327                  CALL ctl_opn( numdct_reg_bin  ,'region_mean_timeseries.dat'  , 'APPEND', 'UNFORMATTED', 'SEQUENTIAL', -1, numout,  .FALSE. )
328              ENDIF
329             
330              IF ( ln_diaregmean_ascii ) THEN
331                  ! Open text files for region means
332                  !JT CALL ctl_opn( numdct_reg_txt  ,'region_mean_timeseries.txt'  , 'NEW', 'FORMATTED', 'SEQUENTIAL', -1, numout,  .TRUE. )
333                  CALL ctl_opn( numdct_reg_txt  ,'region_mean_timeseries.txt'  , 'APPEND', 'FORMATTED', 'SEQUENTIAL', -1, numout,  .FALSE. )
334              ENDIF
335          ENDIF
336     ENDIF
337
338   END SUBROUTINE dia_regmean_init
339
340   SUBROUTINE dia_calctmb_region_mean( pinfield,pouttmb )
341      !!---------------------------------------------------------------------
342      !!                  ***  ROUTINE dia_calctmb_region_mean  ***
343      !!                   
344      !! ** Purpose :    Find the Top, Bottom and Top minus Bottom fields of water Column
345      !!            :    and depth average, and volume and mass intergated values.
346
347      !!
348      !! ** Method  :   
349      !!      use mbathy to find surface, mid and bottom of model levels
350      !!
351      !! History :
352      !!   3.6  !  08-14  (E. O'Dea) Routine based on dia_wri_foam
353      !!----------------------------------------------------------------------
354      !! * Modules used
355
356      ! Routine to map 3d field to top, middle, bottom
357      IMPLICIT NONE
358
359
360      ! Routine arguments
361      REAL(wp), DIMENSION(jpi, jpj, jpk), INTENT(IN   ) :: pinfield    ! Input 3d field and mask
362      REAL(wp), DIMENSION(jpi, jpj, 6  ), INTENT(  OUT) :: pouttmb     ! Output top, bottom and surface minus bed, zav, vol int, mass int
363
364      ! Local variables
365      INTEGER :: ji,jj,jk  ! Dummy loop indices
366
367      ! Local Real
368      REAL(wp)                         ::   zmdi  !  set masked values
369      ! for depth int
370      REAL(wp)                         ::   tmpnumer,tmpnumer_mass,tmpdenom ,z_av_val,vol_int_val
371
372      zmdi=1.e+20 !missing data indicator for masking
373
374      !zmdi=0 !missing data indicator for masking
375
376      ! Calculate top
377      pouttmb(:,:,1) = pinfield(:,:,1)*tmask(:,:,1)  + zmdi*(1.0-tmask(:,:,1))
378
379     ! Calculate middle
380      !DO jj = 1,jpj
381      !    DO ji = 1,jpi
382      !        jk              = max(1,mbathy(ji,jj)/2)
383      !        pouttmb(ji,jj,2) = pinfield(ji,jj,jk)*tmask(ji,jj,jk)  + zmdi*(1.0-tmask(ji,jj,jk))
384      !    END DO
385      !END DO
386
387      ! Calculate bottom, and top minus bottom
388      DO jj = 1,jpj
389          DO ji = 1,jpi
390              IF ( tmask(ji,jj,1) .EQ. 1) THEN ! if land
391               
392                  !jk              = max(1,mbathy(ji,jj) - 1)
393
394
395                  !ikbot = mbkt(ji,jj)
396              !z2d(ji,jj) = tsn(ji,jj,ikbot,jp_tem)
397                  jk = mbkt(ji,jj)
398
399                  pouttmb(ji,jj,2) = pinfield(ji,jj,jk)*tmask(ji,jj,jk)  + zmdi*(1.0-tmask(ji,jj,jk))
400
401                  pouttmb(ji,jj,3) = (pouttmb(ji,jj,1) - pouttmb(ji,jj,2))*tmask(ji,jj,1)  + zmdi*(1.0-tmask(ji,jj,1))
402
403                  !Depth and volume integral:
404                  !---------------------------
405                  !Vol int = Concentration * vol of grid box, summed over depth.
406                  !Mass int = Concentration * vol of grid box * density of water, summed over depth.
407                  !Depth Average = Vol int divided by * (vol of grid box summed over depth).
408
409                  tmpnumer = 0.
410                  tmpnumer_mass = 0.
411                  tmpdenom = 0.
412                  DO jk = 1,jpk
413                     tmpnumer = tmpnumer + pinfield(ji,jj,jk)*tmask(ji,jj,jk)*e1t(ji,jj)*e2t(ji,jj)*e3t_n(ji,jj,jk)
414                     tmpnumer_mass = tmpnumer_mass + pinfield(ji,jj,jk)*tmask(ji,jj,jk)*e1t(ji,jj)*e2t(ji,jj)*e3t_n(ji,jj,jk)*rhop(ji,jj,jk)
415                     tmpdenom = tmpdenom +                    tmask(ji,jj,jk)*e1t(ji,jj)*e2t(ji,jj)*e3t_n(ji,jj,jk)
416                  END DO
417                  !z_av_val = tmpnumer/tmpdenom
418                  !vol_int_val = tmpnumer
419                  !mass_int_val = tmpnumer*density
420
421                  pouttmb(ji,jj,4) = tmpnumer/tmpdenom ! depth averaged
422                  pouttmb(ji,jj,5) = tmpnumer          ! Vol integrated
423                  pouttmb(ji,jj,6) = tmpnumer_mass     ! Mass integrated (for heat and salt calcs)
424              ELSE
425                    pouttmb(ji,jj,1) = zmdi
426                    pouttmb(ji,jj,2) = zmdi
427                    pouttmb(ji,jj,3) = zmdi
428                    pouttmb(ji,jj,4) = zmdi
429                    pouttmb(ji,jj,5) = zmdi
430                    pouttmb(ji,jj,6) = zmdi
431              ENDIF
432          END DO
433      END DO
434
435   END SUBROUTINE dia_calctmb_region_mean
436
437
438   SUBROUTINE dia_regmean( kt ) 
439      !!----------------------------------------------------------------------
440      !!                 ***  ROUTINE dia_regmean  ***
441      !! ** Purpose :   Produce regional mean diagnostics
442      !!
443      !! ** Method  :   calls dia_wri_region_mean to calculate and write the regional means for a number of variables,
444      !!                (calling dia_calctmb_region_mean where necessary).
445      !!               
446      !!                Closes all text and binary files on last time step
447      !!               
448      !!     
449      !!     
450      !!
451      !! History :
452      !!   3.6  !  11-16  (J. Tinker)
453      !!         
454      !!--------------------------------------------------------------------
455      REAL(wp), POINTER, DIMENSION(:,:,:) :: tmp1mat   ! temporary array of 1's
456      REAL(wp), POINTER, DIMENSION(:,:,:) :: zwtmbT    ! temporary T workspace
457      REAL(wp), POINTER, DIMENSION(:,:,:) :: zwtmbS    ! temporary S workspace
458      REAL(wp), POINTER, DIMENSION(:,:,:) :: zwtmb1    ! temporary density workspace
459      REAL(wp)                            ::   zmdi       ! set masked values
460      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index
461     
462      REAL(wp)                         ::   zdt  ! temporary reals
463      INTEGER                          ::   i_steps, ierr         ! no of timesteps per hour, allocation error index
464      INTEGER                          ::   maskno,jj,ji,jk,jm,nreg ! indices of mask, i and j, and number of regions
465
466
467      CHARACTER (len=120)                ::    tmp_name
468      CHARACTER (len=120), DIMENSION(19) ::    name_dat_mat
469      CHARACTER (len=120), DIMENSION(4)  ::    name_AR5_mat
470      CHARACTER (len=120), DIMENSION(7)  ::    name_SBC_mat
471      INTEGER                            ::    vi     
472      LOGICAL                            ::    do_reg_mean
473      REAL(wp), DIMENSION(19)            ::    output_mulitpler_dat_mat
474      REAL(wp), DIMENSION(4)             ::    output_mulitpler_AR5_mat
475      REAL(wp), DIMENSION(7)             ::    output_mulitpler_SBC_mat
476
477
478#if defined key_fabm
479      INTEGER                          ::  jn ,tmp_dummy     ! set masked values
480      REAL(wp)                         ::  tmp_val           ! tmp value, to allow min and max value clamping (not implemented)
481      INTEGER                          ::  jl 
482      CHARACTER (len=60) ::    tmp_name_bgc_top,tmp_name_bgc_bot,tmp_name_bgc_dif, tmp_name_bgc_zav, tmp_name_bgc_vol
483      CHARACTER (len=60) ::    tmp_output_filename
484      REAL(wp), POINTER, DIMENSION(:,:,:) :: zwtmbBGC    ! temporary BGC workspace
485
486      LOGICAL       ::   verbose
487      verbose = .FALSE.
488      tmp_val = 0
489#endif
490      zmdi=1.e+20 !missing data indicator for maskin
491
492      IF (ln_diaregmean) THEN
493        ! If regional mean calculations required by namelist
494        ! -----------------
495        ! identify hourly time steps (not used)
496        zdt = rdt
497        !JT Not sure what this is??  IF( nacc == 1 ) zdt = rdtmin
498
499        IF( MOD( 3600,INT(zdt) ) == 0 ) THEN
500            i_steps = 3600/INT(zdt)
501        ELSE
502            CALL ctl_stop('STOP', 'dia_regmean: timestep must give MOD(3600,rdt) = 0 otherwise no hourly values are possible')
503        ENDIF
504
505        !!IF(lwp ) WRITE(numout,*) 'JT! test! dia_wri_region_mean instantaneous values!!!'
506        !!i_steps = 1
507        !!IF(lwp ) WRITE(numout,*) 'JT! test! dia_wri_region_mean instantaneous values!!!'
508       
509        ! Every time step, add physical, SBC, PEA, MLD terms to create hourly sums.
510        ! Every hour, then hourly sums are divided by the number of timesteps in the hour to make hourly means
511        ! These hourly mean values are then used to caluclate the regional means, and output with IOM.
512#if defined key_fabm
513        ! BGC values are not averaged up over the hour, but are output as hourly instantaneous values.
514#endif
515
516       
517        !Extract 2d fields from 3d T and S with dia_calctmb_region_mean
518        !CALL wrk_alloc( jpi , jpj, 6 , zwtmbT )
519        !CALL wrk_alloc( jpi , jpj, 6 , zwtmbS )
520        !CALL wrk_alloc( jpi , jpj, 6 , zwtmb1 )
521
522
523        ALLOCATE (zwtmbT(jpi , jpj, 6),  STAT= ierr )
524        IF( ierr /= 0 )   CALL ctl_stop( 'dia_regmean: failed to allocate zwtmbT array' )
525        ALLOCATE (zwtmbS(jpi , jpj, 6),  STAT= ierr )
526        IF( ierr /= 0 )   CALL ctl_stop( 'dia_regmean: failed to allocate zwtmbS array' )
527        ALLOCATE (zwtmb1(jpi , jpj, 6),  STAT= ierr )
528        IF( ierr /= 0 )   CALL ctl_stop( 'dia_regmean: failed to allocate zwtmb1 array' )
529           
530        CALL dia_calctmb_region_mean(  tsn(:,:,:,jp_tem),zwtmbT)
531        CALL dia_calctmb_region_mean(  tsn(:,:,:,jp_sal),zwtmbS)
532
533        ! To calc regional mean time series of int vol and mass, run region mean code on array of 1's...
534        !   - then when multplying by volume, gives volume,
535        !   - then when multplying by volume*density, gives mass
536
537        ALLOCATE (tmp1mat(jpi , jpj, jpk),  STAT= ierr )
538        IF( ierr /= 0 )   CALL ctl_stop( 'dia_regmean: failed to allocate tmp1mat array' )
539        DO jj = 1,jpj
540            DO ji = 1,jpi
541                DO jk = 1,jpk
542                    tmp1mat(ji,jj,jk) = 1
543                END DO
544            END DO
545        END DO
546
547        CALL dia_calctmb_region_mean(  tmp1mat,zwtmb1)
548        !JT CALL wrk_dealloc( jpi , jpj, jpk , tmp1mat )
549        DEALLOCATE(  tmp1mat )
550 
551        ! Add 2d fields every time step to the hourly total.
552           
553        tmp_field_mat(:,:,1) = tmp_field_mat(:,:,1) + (zwtmbT(:,:,1)*tmask(:,:,1)) !sst
554        name_dat_mat(1) = 'sst'
555        tmp_field_mat(:,:,2) = tmp_field_mat(:,:,2) + (zwtmbT(:,:,2)*tmask(:,:,1)) !nbt
556        name_dat_mat(2) = 'nbt'
557        tmp_field_mat(:,:,3) = tmp_field_mat(:,:,3) + (zwtmbT(:,:,3)*tmask(:,:,1)) !dft
558        name_dat_mat(3) = 'dft'
559
560        tmp_field_mat(:,:,4) = tmp_field_mat(:,:,4) + (zwtmbT(:,:,4)*tmask(:,:,1)) !zat
561        name_dat_mat(4) = 'zat'
562        tmp_field_mat(:,:,5) = tmp_field_mat(:,:,5) + (zwtmbT(:,:,5)*tmask(:,:,1)) !vat
563        name_dat_mat(5) = 'vat'
564        tmp_field_mat(:,:,6) = tmp_field_mat(:,:,6) + ((zwtmbT(:,:,6)*tmask(:,:,1)*4.2e3))! heat
565        name_dat_mat(6) = 'heat'
566
567        tmp_field_mat(:,:,7) = tmp_field_mat(:,:,7) + (zwtmbS(:,:,1)*tmask(:,:,1)) !sss
568        name_dat_mat(7) = 'sss'
569        tmp_field_mat(:,:,8) = tmp_field_mat(:,:,8) + (zwtmbS(:,:,2)*tmask(:,:,1)) !nbs
570        name_dat_mat(8) = 'nbs'
571        tmp_field_mat(:,:,9) = tmp_field_mat(:,:,9) + (zwtmbS(:,:,3)*tmask(:,:,1)) !dfs
572        name_dat_mat(9) = 'dfs'
573
574        tmp_field_mat(:,:,10) = tmp_field_mat(:,:,10) + (zwtmbS(:,:,4)*tmask(:,:,1)) !zas
575        name_dat_mat(10) = 'zas'
576        tmp_field_mat(:,:,11) = tmp_field_mat(:,:,11) + (zwtmbS(:,:,5)*tmask(:,:,1)) !vas
577        name_dat_mat(11) = 'vas'
578        tmp_field_mat(:,:,12) = tmp_field_mat(:,:,12) + (zwtmbS(:,:,6)*tmask(:,:,1)) !salt
579        name_dat_mat(12) = 'salt'
580
581        tmp_field_mat(:,:,13) = tmp_field_mat(:,:,13) + (zwtmb1(:,:,5)*tmask(:,:,1))!vol
582        name_dat_mat(13) = 'vol'
583        tmp_field_mat(:,:,14) = tmp_field_mat(:,:,14) + (zwtmb1(:,:,6)*tmask(:,:,1))!mass
584        name_dat_mat(14) = 'mass'
585
586        tmp_field_mat(:,:,15) = tmp_field_mat(:,:,15) + (sshn(:,:)*tmask(:,:,1)) !ssh
587        name_dat_mat(15) = 'ssh'
588       
589        !JT CALL wrk_dealloc( jpi , jpj, 6 , zwtmbT )
590        !JT CALL wrk_dealloc( jpi , jpj, 6 , zwtmbS )
591        !JT CALL wrk_dealloc( jpi , jpj, 6 , zwtmb1 )
592
593        DEALLOCATE (zwtmbT, zwtmbS, zwtmb1 )
594
595       
596        !JT MLD   IF( ln_diaregmean_karamld  ) THEN
597        !JT MLD       tmp_field_mat(:,:,16) = tmp_field_mat(:,:,16) + (hmld_kara(:,:)*tmask(:,:,1)) !mldkara
598        !JT MLD   ENDIF
599
600        name_dat_mat(16) = 'mldkara'
601       
602        IF( ln_diaregmean_pea  ) THEN
603            tmp_field_mat(:,:,17) = tmp_field_mat(:,:,17) + (pea(:,:)*tmask(:,:,1))  !pea
604            tmp_field_mat(:,:,18) = tmp_field_mat(:,:,18) + (peat(:,:)*tmask(:,:,1)) !peat
605            tmp_field_mat(:,:,19) = tmp_field_mat(:,:,19) + (peas(:,:)*tmask(:,:,1)) !peas
606        ENDIF
607        name_dat_mat(17) = 'pea'
608        name_dat_mat(18) = 'peat'
609        name_dat_mat(19) = 'peas'
610         
611        IF( ln_diaregmean_diaar5  ) THEN
612            tmp_field_AR5_mat(:,:,1) = tmp_field_AR5_mat(:,:,1) + (sshsteric_mat(:,:)*tmask(:,:,1))
613            name_AR5_mat(1) = 'ssh_steric'
614            tmp_field_AR5_mat(:,:,2) = tmp_field_AR5_mat(:,:,2) + (sshthster_mat(:,:)*tmask(:,:,1))
615            name_AR5_mat(2) = 'ssh_thermosteric'
616            tmp_field_AR5_mat(:,:,3) = tmp_field_AR5_mat(:,:,3) + (sshhlster_mat(:,:)*tmask(:,:,1))
617            name_AR5_mat(3) = 'ssh_halosteric'
618            tmp_field_AR5_mat(:,:,4) = tmp_field_AR5_mat(:,:,4) + (zbotpres_mat(:,:)*tmask(:,:,1))
619            name_AR5_mat(4) = 'bot_pres'
620        ENDIF
621       
622
623        IF( ln_diaregmean_diasbc  ) THEN
624            tmp_field_SBC_mat(:,:,1) = tmp_field_SBC_mat(:,:,1) + ((qsr  + qns)*tmask(:,:,1))
625            name_SBC_mat(1) = 'qt'
626            tmp_field_SBC_mat(:,:,2) = tmp_field_SBC_mat(:,:,2) + (qsr*tmask(:,:,1))
627            name_SBC_mat(2) = 'qsr'
628            tmp_field_SBC_mat(:,:,3) = tmp_field_SBC_mat(:,:,3) + (qns*tmask(:,:,1))
629            name_SBC_mat(3) = 'qns'
630            tmp_field_SBC_mat(:,:,4) = tmp_field_SBC_mat(:,:,4) + (emp*tmask(:,:,1))
631            name_SBC_mat(4) = 'emp'
632            tmp_field_SBC_mat(:,:,5) = tmp_field_SBC_mat(:,:,5) + (wndm*tmask(:,:,1))
633            name_SBC_mat(5) = 'wspd'
634            tmp_field_SBC_mat(:,:,6) = tmp_field_SBC_mat(:,:,6) + (pressnow*tmask(:,:,1))
635            name_SBC_mat(6) = 'mslp'
636            tmp_field_SBC_mat(:,:,7) = tmp_field_SBC_mat(:,:,7) + (rnf*tmask(:,:,1))
637            name_SBC_mat(7) = 'rnf'
638        ENDIF
639
640        output_mulitpler_dat_mat(:) = 1.
641        output_mulitpler_dat_mat(6) = 1e-12
642        output_mulitpler_dat_mat(12) = 1e-12
643        output_mulitpler_AR5_mat(:) = 1.
644        output_mulitpler_SBC_mat(:) = 1.
645
646        IF(lwp) THEN
647
648       
649            DO vi=1,19 ! State loop
650               WRITE(numout,*)  'JT dia_regmean SBC variable : ',TRIM( name_dat_mat(vi) )
651            END DO
652            DO vi=1,4 ! State loop
653               WRITE(numout,*)  'JT dia_regmean SBC variable : ',TRIM( name_AR5_mat(vi) )
654            END DO
655            DO vi=1,7 ! State loop
656               WRITE(numout,*)  'JT dia_regmean SBC variable : ',TRIM( name_SBC_mat(vi) )
657            END DO
658        ENDIF
659
660       
661        tmp_field_cnt = tmp_field_cnt + 1
662
663        ! On the hour, calculate hourly means from the hourly total,and process the regional means.
664       
665        IF ( MOD( kt, i_steps ) == 0 .and. kt .ne. nn_it000 ) THEN
666
667           
668!            DO vi=1,19 ! State loop
669
670!               do_reg_mean = .TRUE.
671
672!               IF (vi == 16) THEN
673!                 IF( .not. ln_diaregmean_karamld ) do_reg_mean = .FALSE.   
674!               ENDIF
675
676!               IF ((vi == 17) .OR. (vi == 18) .OR. (vi == 19) ) THEN
677!                 IF( .not. ln_diaregmean_pea ) do_reg_mean = .FALSE.   
678!               ENDIF
679
680!               tmp_name=TRIM( name_dat_mat(vi) )
681!               IF ( do_reg_mean ) THEN
682!                   IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
683!                      & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
684!                      & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
685!                      & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
686!                      & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
687!                      & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
688
689!                        CALL dia_wri_region_mean(kt, TRIM(tmp_name) , output_mulitpler_dat_mat(vi)*tmp_field_mat(:,:,vi)/real(tmp_field_cnt,wp))
690!                        WRITE(numout,*)  'JT dia_regmean SBC variable - region mean: ',TRIM( name_dat_mat(vi) ),';'
691!                    ELSE
692!                        WRITE(numout,*)  'JT dia_regmean SBC variable - no iom_use: ',TRIM( name_dat_mat(vi) ),';'
693!                    ENDIF
694!                ELSE
695!                    WRITE(numout,*)  'JT dia_regmean SBC variable - no do_reg_mean: ',TRIM( name_dat_mat(vi) ),';',ln_diaregmean_karamld,ln_diaregmean_pea
696!                ENDIF
697!                tmp_name=""
698!            END DO
699!           
700!            tmp_field_mat(:,:,:) = 0.
701
702
703            tmp_name="sst"
704            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
705              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
706              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
707              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
708              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
709              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
710
711                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,1)/real(tmp_field_cnt,wp))
712            ENDIF
713            tmp_name=""
714
715            tmp_name="nbt"
716            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
717              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
718              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
719              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
720              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
721              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
722
723                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,2)/real(tmp_field_cnt,wp))
724            ENDIF
725            tmp_name=""
726
727            tmp_name="dft"
728            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
729              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
730              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
731              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
732              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
733              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
734
735                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,3)/real(tmp_field_cnt,wp))
736            ENDIF
737            tmp_name=""
738
739
740            tmp_name="zat"
741            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
742              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
743              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
744              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
745              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
746              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
747
748                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,4)/real(tmp_field_cnt,wp))
749            ENDIF
750            tmp_name=""
751
752
753            tmp_name="vat"
754            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
755              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
756              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
757              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
758              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
759              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
760
761                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,5)/real(tmp_field_cnt,wp))
762            ENDIF
763            tmp_name=""
764
765
766            tmp_name="heat"
767            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
768              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
769              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
770              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
771              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
772              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
773
774                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,6)/real(tmp_field_cnt,wp)/1e12)
775            ENDIF
776            tmp_name=""
777
778            tmp_name="sss"
779            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
780              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
781              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
782              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
783              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
784              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
785
786                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,7)/real(tmp_field_cnt,wp))
787            ENDIF
788            tmp_name=""
789
790            tmp_name="nbs"
791            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
792              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
793              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
794              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
795              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
796              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
797
798                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,8)/real(tmp_field_cnt,wp))
799            ENDIF
800            tmp_name=""
801
802            tmp_name="dfs"
803            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
804              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
805              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
806              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
807              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
808              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
809
810                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,9)/real(tmp_field_cnt,wp))
811            ENDIF
812            tmp_name=""
813
814
815            tmp_name="zas"
816            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
817              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
818              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
819              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
820              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
821              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
822
823                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,10)/real(tmp_field_cnt,wp))
824            ENDIF
825            tmp_name=""
826
827
828            tmp_name="vas"
829            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
830              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
831              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
832              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
833              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
834              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
835
836                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,11)/real(tmp_field_cnt,wp))
837            ENDIF
838            tmp_name=""
839
840
841            tmp_name="salt"
842            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
843              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
844              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
845              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
846              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
847              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
848
849                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,12)/real(tmp_field_cnt,wp)/1e12)
850            ENDIF
851            tmp_name=""
852
853            tmp_name="vol"
854            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
855              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
856              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
857              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
858              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
859              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
860
861                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,13)/real(tmp_field_cnt,wp))
862            ENDIF
863            tmp_name=""
864
865
866            tmp_name="mass"
867            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
868              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
869              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
870              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
871              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
872              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
873
874                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,14)/real(tmp_field_cnt,wp))
875            ENDIF
876            tmp_name=""
877
878
879            tmp_name="ssh"
880            IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
881              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
882              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
883              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
884              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
885              & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
886
887                CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,15)/real(tmp_field_cnt,wp))
888            ENDIF
889            tmp_name=""
890
891
892
893
894
895
896            !CALL dia_wri_region_mean(kt, "sst" , tmp_field_mat(:,:,1)/real(tmp_field_cnt,wp))
897            !CALL dia_wri_region_mean(kt, "nbt" , tmp_field_mat(:,:,2)/real(tmp_field_cnt,wp))
898            !CALL dia_wri_region_mean(kt, "dft" , tmp_field_mat(:,:,3)/real(tmp_field_cnt,wp))
899
900            !CALL dia_wri_region_mean(kt, "zat" , tmp_field_mat(:,:,4)/real(tmp_field_cnt,wp))
901            !CALL dia_wri_region_mean(kt, "vat" , tmp_field_mat(:,:,5)/real(tmp_field_cnt,wp))
902            !CALL dia_wri_region_mean(kt, "heat" , tmp_field_mat(:,:,6)/real(tmp_field_cnt,wp)/1e12)
903
904            !CALL dia_wri_region_mean(kt, "sss" , tmp_field_mat(:,:,7)/real(tmp_field_cnt,wp))
905            !CALL dia_wri_region_mean(kt, "nbs" , tmp_field_mat(:,:,8)/real(tmp_field_cnt,wp))
906            !CALL dia_wri_region_mean(kt, "dfs" , tmp_field_mat(:,:,9)/real(tmp_field_cnt,wp))
907
908            !CALL dia_wri_region_mean(kt, "zas" , tmp_field_mat(:,:,10)/real(tmp_field_cnt,wp))
909            !CALL dia_wri_region_mean(kt, "vas" , tmp_field_mat(:,:,11)/real(tmp_field_cnt,wp))
910            !CALL dia_wri_region_mean(kt, "salt" , tmp_field_mat(:,:,12)/real(tmp_field_cnt,wp)/1e12)
911
912            !CALL dia_wri_region_mean(kt, "vol" , tmp_field_mat(:,:,13)/real(tmp_field_cnt,wp))
913            !CALL dia_wri_region_mean(kt, "mass" , tmp_field_mat(:,:,14)/real(tmp_field_cnt,wp))
914
915            !CALL dia_wri_region_mean(kt, "ssh" , tmp_field_mat(:,:,15)/real(tmp_field_cnt,wp))
916
917
918            IF( ln_diaregmean_karamld  ) THEN   
919                tmp_name="mldkara"
920                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
921                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
922                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
923                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
924                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
925                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
926
927                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,16)/real(tmp_field_cnt,wp))
928                ENDIF
929                tmp_name=""
930     
931                !CALL dia_wri_region_mean(kt, "mldkara" , tmp_field_mat(:,:,16)/real(tmp_field_cnt,wp)) ! tm
932            ENDIF
933
934            IF( ln_diaregmean_pea  ) THEN         
935
936                tmp_name="pea"
937                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
938                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
939                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
940                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
941                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
942                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
943
944                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,17)/real(tmp_field_cnt,wp))
945                ENDIF
946                tmp_name=""
947
948                tmp_name="peat"
949                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
950                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
951                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
952                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
953                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
954                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
955
956                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,18)/real(tmp_field_cnt,wp))
957                ENDIF
958                tmp_name=""
959
960
961                tmp_name="peas"
962                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
963                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
964                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
965                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
966                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
967                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
968
969                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_mat(:,:,19)/real(tmp_field_cnt,wp))
970                ENDIF
971                tmp_name=""
972
973
974                !CALL dia_wri_region_mean(kt, "pea"  , tmp_field_mat(:,:,17)/real(tmp_field_cnt,wp))
975                !CALL dia_wri_region_mean(kt, "peat" , tmp_field_mat(:,:,18)/real(tmp_field_cnt,wp))
976                !CALL dia_wri_region_mean(kt, "peas" , tmp_field_mat(:,:,19)/real(tmp_field_cnt,wp)) ! tmb
977            ENDIF
978
979            tmp_field_mat(:,:,:) = 0.
980
981            IF( ln_diaregmean_diaar5  ) THEN
982
983                tmp_name="ssh_steric"
984                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
985                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
986                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
987                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
988                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
989                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
990
991                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_AR5_mat(:,:,1)/real(tmp_field_cnt,wp))
992                ENDIF
993                tmp_name=""
994
995                tmp_name="ssh_thermosteric"
996                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
997                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
998                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
999                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
1000                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
1001                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
1002
1003                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_AR5_mat(:,:,2)/real(tmp_field_cnt,wp))
1004                ENDIF
1005                tmp_name=""
1006
1007                tmp_name="ssh_halosteric"
1008                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
1009                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
1010                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
1011                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
1012                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
1013                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
1014
1015                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_AR5_mat(:,:,3)/real(tmp_field_cnt,wp))
1016                ENDIF
1017                tmp_name=""
1018
1019                tmp_name="bot_pres"
1020                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
1021                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
1022                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
1023                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
1024                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
1025                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
1026
1027                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_AR5_mat(:,:,4)/real(tmp_field_cnt,wp))
1028                ENDIF
1029                tmp_name=""
1030
1031                !CALL dia_wri_region_mean(kt, "ssh_steric" ,      tmp_field_AR5_mat(:,:,1)/real(tmp_field_cnt,wp))
1032                !CALL dia_wri_region_mean(kt, "ssh_thermosteric", tmp_field_AR5_mat(:,:,2)/real(tmp_field_cnt,wp))
1033                !CALL dia_wri_region_mean(kt, "ssh_halosteric" ,  tmp_field_AR5_mat(:,:,3)/real(tmp_field_cnt,wp))
1034                !CALL dia_wri_region_mean(kt, "bot_pres" ,        tmp_field_AR5_mat(:,:,4)/real(tmp_field_cnt,wp))
1035                tmp_field_AR5_mat(:,:,:) = 0.
1036            ENDIF
1037
1038            IF( ln_diaregmean_diasbc  ) THEN
1039
1040
1041
1042                tmp_name="qt"
1043                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
1044                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
1045                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
1046                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
1047                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
1048                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
1049
1050                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_SBC_mat(:,:,1)/real(tmp_field_cnt,wp))
1051                ENDIF
1052                tmp_name=""
1053
1054                tmp_name="qsr"
1055                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
1056                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
1057                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
1058                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
1059                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
1060                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
1061
1062                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_SBC_mat(:,:,2)/real(tmp_field_cnt,wp))
1063                ENDIF
1064                tmp_name=""
1065
1066                tmp_name="qns"
1067                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
1068                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
1069                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
1070                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
1071                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
1072                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
1073
1074                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_SBC_mat(:,:,3)/real(tmp_field_cnt,wp))
1075                ENDIF
1076                tmp_name=""
1077
1078                tmp_name="emp"
1079                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
1080                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
1081                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
1082                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
1083                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
1084                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
1085
1086                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_SBC_mat(:,:,4)/real(tmp_field_cnt,wp))
1087                ENDIF
1088                tmp_name=""
1089
1090                tmp_name="wspd"
1091                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
1092                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
1093                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
1094                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
1095                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
1096                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
1097
1098                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_SBC_mat(:,:,5)/real(tmp_field_cnt,wp))
1099                ENDIF
1100                tmp_name=""
1101
1102                tmp_name="mslp"
1103                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
1104                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
1105                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
1106                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
1107                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
1108                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
1109
1110                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_SBC_mat(:,:,6)/real(tmp_field_cnt,wp))
1111                ENDIF
1112                tmp_name=""
1113
1114                tmp_name="rnf"
1115                IF (iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_ave'))))    .OR. &
1116                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_tot'))))    .OR. &
1117                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_var'))))    .OR. &
1118                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))))    .OR. &
1119                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) .OR. &
1120                  & iom_use(trim( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) ) THEN
1121
1122                    CALL dia_wri_region_mean(kt, TRIM(tmp_name) , tmp_field_SBC_mat(:,:,7)/real(tmp_field_cnt,wp))
1123                ENDIF
1124                tmp_name=""
1125
1126                !CALL dia_wri_region_mean(kt, "qt"   , tmp_field_SBC_mat(:,:,1)/real(tmp_field_cnt,wp))
1127                !CALL dia_wri_region_mean(kt, "qsr"  , tmp_field_SBC_mat(:,:,2)/real(tmp_field_cnt,wp))
1128                !CALL dia_wri_region_mean(kt, "qns"  , tmp_field_SBC_mat(:,:,3)/real(tmp_field_cnt,wp))
1129                !CALL dia_wri_region_mean(kt, "emp"  , tmp_field_SBC_mat(:,:,4)/real(tmp_field_cnt,wp))
1130                !CALL dia_wri_region_mean(kt, "wspd" , tmp_field_SBC_mat(:,:,5)/real(tmp_field_cnt,wp))
1131                !CALL dia_wri_region_mean(kt, "mslp" , tmp_field_SBC_mat(:,:,6)/real(tmp_field_cnt,wp))
1132                !CALL dia_wri_region_mean(kt, "rnf"  , tmp_field_SBC_mat(:,:,7)/real(tmp_field_cnt,wp))
1133                tmp_field_SBC_mat(:,:,:) = 0.
1134
1135            ENDIF
1136
1137#if defined key_fabm
1138            !ADD Biogeochemistry
1139           
1140            IF( ln_diaregmean_bgc  ) THEN !ln_diaregmean_bgc
1141               
1142                ! Loop through 3d BGC tracers
1143                DO jn=1,jp_fabm ! State loop
1144
1145                    ! get variable name for different levels
1146                    tmp_name_bgc_top=TRIM(TRIM("top_")//TRIM(ctrcnm(jn)))
1147                    tmp_name_bgc_bot=TRIM(TRIM("bot_")//TRIM(ctrcnm(jn)))
1148                    tmp_name_bgc_dif=TRIM(TRIM("dif_")//TRIM(ctrcnm(jn)))
1149                    tmp_name_bgc_zav=TRIM(TRIM("zav_")//TRIM(ctrcnm(jn)))
1150                    tmp_name_bgc_vol=TRIM(TRIM("vol_")//TRIM(ctrcnm(jn)))
1151
1152                    ! print out names if verbose
1153                    IF(verbose .AND. lwp) THEN
1154                        WRITE(numout,*)
1155                        WRITE(numout,*) 'dia_regmean tmp_name_bgc_top : ',TRIM(tmp_name_bgc_top)
1156                        WRITE(numout,*) 'dia_regmean tmp_name_bgc_bot : ',TRIM(tmp_name_bgc_bot)
1157                        WRITE(numout,*) 'dia_regmean tmp_name_bgc_dif : ',TRIM(tmp_name_bgc_dif)
1158                        WRITE(numout,*) 'dia_regmean tmp_name_bgc_zav : ',TRIM(tmp_name_bgc_zav)
1159                        WRITE(numout,*) 'dia_regmean tmp_name_bgc_vol : ',TRIM(tmp_name_bgc_vol)
1160                        CALL FLUSH(numout) 
1161
1162                    ENDIF
1163
1164                    !Allocate working array, and get surface, bed etc fields.
1165                    !CALL wrk_alloc( jpi , jpj,  6 , zwtmbBGC )
1166                    ALLOCATE (zwtmbBGC(jpi , jpj, 6),  STAT= ierr )
1167                    IF( ierr /= 0 )   CALL ctl_stop( 'dia_regmean: failed to allocate zwtmbBGC array' )
1168                    CALL dia_calctmb_region_mean(  trn(:,:,:,jn),zwtmbBGC )
1169
1170
1171                    !Print out 2d fields to ascii text files to check values if verbose. (24MB per time step, per BGC variable)
1172                    IF (verbose) THEN
1173
1174                        WRITE (tmp_output_filename, "(A4,I3.3,A1,I6.6,A1,I3.3,A4)") "bgc_",jn,"_",kt,"_",narea,".txt"
1175                        WRITE (*,*) tmp_output_filename
1176                        OPEN(UNIT=74,FILE=TRIM(tmp_output_filename))
1177
1178                        DO ji = 1,jpi
1179                            DO jj = 1,jpj
1180                                WRITE(74,FMT="(I4,I4,F3,F25.5,F25.5,F25.5,F25.5,F25.5)") nimpp+ji, njmpp+jj,tmask(ji,jj,1),&
1181                                      & zwtmbBGC(ji,jj,1),zwtmbBGC(ji,jj,2),zwtmbBGC(ji,jj,3),zwtmbBGC(ji,jj,4),zwtmbBGC(ji,jj,5)/1e9
1182                            END DO
1183                        END DO
1184                        CLOSE(74)
1185                    ENDIF
1186                   
1187                    ! Do region means
1188                    CALL dia_wri_region_mean(kt, TRIM(tmp_name_bgc_top)   , zwtmbBGC(:,:,1))
1189                    CALL dia_wri_region_mean(kt, TRIM(tmp_name_bgc_bot)   , zwtmbBGC(:,:,2))
1190                    CALL dia_wri_region_mean(kt, TRIM(tmp_name_bgc_dif)   , zwtmbBGC(:,:,3))
1191                    CALL dia_wri_region_mean(kt, TRIM(tmp_name_bgc_zav)   , zwtmbBGC(:,:,4))
1192                    CALL dia_wri_region_mean(kt, TRIM(tmp_name_bgc_vol)   , zwtmbBGC(:,:,5)/1e9)
1193
1194
1195                    !Deallocate working array
1196                    !JT CALL wrk_dealloc( jpi , jpj,  6 , zwtmbBGC )
1197                    DEALLOCATE ( zwtmbBGC )
1198                ENDDO ! State loop
1199            ENDIF !ln_diaregmean_bgc
1200
1201#endif
1202             
1203            tmp_field_cnt = 0
1204 
1205        ENDIF ! ( MOD( kt, i_steps ) == 0  .and. kt .ne. nn_it000 )
1206       
1207       
1208        ! If on the last time step, close binary and ascii files.
1209        IF( kt == nitend ) THEN
1210            IF(lwp) THEN
1211                IF ( ln_diaregmean_bin ) THEN
1212                    !Closing binary files for regional mean time series.
1213                    CLOSE(numdct_reg_bin)
1214                ENDIF
1215                IF ( ln_diaregmean_ascii ) THEN
1216                    !Closing text files for regional mean time series.
1217                    CLOSE(numdct_reg_txt)
1218                ENDIF
1219
1220                DEALLOCATE( region_mask, nreg_mat, tmp_field_mat)
1221                IF( ln_diaregmean_diaar5  ) DEALLOCATE( tmp_field_AR5_mat)
1222                IF( ln_diaregmean_diasbc  ) DEALLOCATE( tmp_field_SBC_mat)
1223            ENDIF
1224        ENDIF
1225         
1226         
1227      ELSE
1228        CALL ctl_warn('dia_regmean: regmean diagnostic is set to false you should not have seen this')
1229      ENDIF
1230     
1231   END SUBROUTINE dia_regmean
1232   
1233   
1234   SUBROUTINE dia_wri_region_mean(kt, tmp_name,         infield  )
1235      !!---------------------------------------------------------------------
1236      !!                  ***  ROUTINE dia_tmb  ***
1237      !!                   
1238      !! ** Purpose :   Calculate and write region mean time series for 2d arrays
1239      !!
1240      !! ** Method  :   
1241      !!      use
1242      !!
1243      !! History :
1244      !!   ??  !  15/10/2015  (JTinker) Routine taken from old dia_wri_foam
1245      !!----------------------------------------------------------------------
1246      !! * Modules used
1247      !use lib_mpp
1248      !use lib_fortr
1249      IMPLICIT NONE
1250     
1251      INTEGER, INTENT(in) ::   kt
1252      CHARACTER (len=*) , INTENT(IN   ) ::    tmp_name
1253      REAL(wp), DIMENSION(jpi, jpj), INTENT(IN   ) :: infield    ! Input 3d field and mask
1254     
1255      ! Local variables
1256      INTEGER, DIMENSION(jpi, jpj) :: internal_region_mask    ! Input 3d field and mask
1257      REAL(wp), DIMENSION(jpi, jpj) :: internal_infield    ! Internal data field
1258      REAL(wp), ALLOCATABLE, DIMENSION(:) ::   zrmet_ave,zrmet_tot,zrmet_var,zrmet_cnt,zrmet_mask_id,zrmet_reg_id  ,zrmet_min,zrmet_max
1259      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zrmet_out
1260      REAL(wp), ALLOCATABLE,   DIMENSION(:) ::   ave_mat,tot_mat,num_mat,var_mat,ssq_mat,cnt_mat,reg_id_mat,mask_id_mat ,min_mat,max_mat   !: region_mask
1261     
1262      REAL(wp)                         ::   zmdi, zrmet_val      ! set masked values
1263      INTEGER :: maskno,nreg  ! ocean time-step indexocean time step           
1264      INTEGER :: ji,jj,jk,ind,jm ! Dummy loop indices
1265      INTEGER :: reg_ind_cnt ! Dummy loop indices
1266     
1267      INTEGER  ::   ierr     
1268      REAL(wp)  :: tmpreal
1269      CHARACTER(LEN=180) :: FormatString,nreg_string,tmp_name_iom
1270      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   dummy_zrmet
1271      LOGICAL       ::   verbose     
1272      verbose = .False.
1273
1274
1275      zmdi=1.e+20 !missing data indicator for maskin
1276     
1277      !Allocate output arrays for iomput, set to zmdi, and set a region counter = 1
1278      ALLOCATE( zrmet_ave(n_regions_output),  STAT= ierr )
1279        IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate zrmet_ave array' )
1280      ALLOCATE( zrmet_tot(n_regions_output),  STAT= ierr )
1281        IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate zrmet_tot array' )
1282      ALLOCATE( zrmet_var(n_regions_output),  STAT= ierr )
1283        IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate zrmet_var array' )
1284      ALLOCATE( zrmet_cnt(n_regions_output),  STAT= ierr )
1285        IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate zrmet_cnt array' )
1286      ALLOCATE( zrmet_mask_id(n_regions_output),  STAT= ierr )
1287        IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate zrmet_mask_id array' )
1288      ALLOCATE( zrmet_reg_id(n_regions_output),  STAT= ierr )
1289        IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate zrmet_reg_id array' )
1290
1291
1292      ALLOCATE( zrmet_min(n_regions_output),  STAT= ierr )
1293        IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate zrmet_min array' )
1294      ALLOCATE( zrmet_max(n_regions_output),  STAT= ierr )
1295        IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate zrmet_max array' )
1296     
1297      ALLOCATE( zrmet_out(jpi,jpj,n_regions_output),  STAT= ierr )
1298        IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate zrmet_reg_id array' )
1299
1300 
1301     
1302        IF(lwp .AND. verbose) THEN
1303              WRITE(numout,*)
1304              WRITE(numout,*) 'dia_wri_region_mean : '//tmp_name//';'
1305              WRITE(numout,*)
1306        ENDIF
1307       
1308      DO ji = 1,jpi
1309          DO jj = 1,jpj
1310            internal_infield(ji,jj) = infield(ji,jj)
1311          END DO
1312      END DO
1313       
1314      ! Check for NANS # JT   03/09/2018
1315      DO ji = 1,jpi
1316          DO jj = 1,jpj
1317              IF ( tmask(ji,jj,1) == 1.0_wp ) THEN
1318                  IF ( internal_infield(ji,jj) .ne. internal_infield(ji,jj) ) THEN
1319                      WRITE(numout,*) 'dia_wri_region_mean : '//tmp_name//' Nan at (kt,i,j): ',kt,nimpp+ji, njmpp+jj !ji - (-jpizoom+1-nimpp+1),jj - (-jpjzoom+1-njmpp+1)
1320                      internal_infield(ji,jj) = 0.
1321                  ENDIF
1322              ELSE               
1323                  IF ( internal_infield(ji,jj) .ne. internal_infield(ji,jj) ) THEN
1324                      WRITE(numout,*) 'dia_wri_region_mean : '//tmp_name//' Masked Nan at (kt,i,j): ',kt,nimpp+ji, njmpp+jj !,ji - (-jpizoom+1-nimpp+1),jj - (-jpjzoom+1-njmpp+1)
1325                      internal_infield(ji,jj) = 0.
1326                  ENDIF
1327              ENDIF
1328          END DO
1329      END DO
1330     
1331     
1332      zrmet_ave(:) = zmdi
1333      zrmet_tot(:) = zmdi
1334      zrmet_var(:) = zmdi
1335      zrmet_cnt(:) = zmdi
1336      zrmet_mask_id(:) = zmdi
1337      zrmet_reg_id(:) = zmdi
1338     
1339      zrmet_min(:) = zmdi
1340      zrmet_max(:) = zmdi
1341      reg_ind_cnt = 1
1342     
1343     
1344      ! loop though the masks
1345      DO maskno = 1,nmasks
1346          IF(lwp .AND. verbose) WRITE(numout,*) 'dia_wri_region_mean : '//tmp_name//'; begin mask loops: ',maskno
1347         
1348         
1349          ! For each mask, get the number of regions (nreg), and a local copy of the region.
1350          nreg = nreg_mat(maskno)
1351          internal_region_mask = region_mask(:,:,maskno)
1352         
1353          ! allocate temporary stat arrays, and set to zero
1354          ALLOCATE( ave_mat(nreg),  STAT= ierr )
1355          IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate ave_mat array' )
1356          ALLOCATE( tot_mat(nreg),      STAT= ierr )
1357          IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate tot_mat array' )
1358          ALLOCATE( num_mat(nreg),  STAT= ierr )
1359          IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate num_mat array' )
1360          ALLOCATE( var_mat(nreg),  STAT= ierr )
1361          IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate var_mat array' )
1362          ALLOCATE( ssq_mat(nreg),  STAT= ierr )
1363          IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate ssq_mat array' )
1364          ALLOCATE( cnt_mat(nreg),  STAT= ierr )
1365          IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate cnt_mat array' )
1366
1367          ALLOCATE( min_mat(nreg),  STAT= ierr )
1368          IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate min_mat array' )
1369          ALLOCATE( max_mat(nreg),  STAT= ierr )
1370          IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate max_mat array' )
1371
1372          ALLOCATE( reg_id_mat(nreg),  STAT= ierr )
1373          IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate reg_id_mat array' )
1374          ALLOCATE( mask_id_mat(nreg),  STAT= ierr )
1375          IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate mask_id_mat array' )
1376
1377
1378         
1379          ave_mat(:) = 0.
1380          tot_mat(:) = 0.
1381          num_mat(:) = 0.
1382          var_mat(:) = 0.
1383          cnt_mat(:) = 0.
1384          ssq_mat(:) = 0.
1385
1386          min_mat(:) = zmdi
1387          max_mat(:) = -zmdi
1388          reg_id_mat(:) = 0.
1389          mask_id_mat(:) = 0.
1390         
1391          ! loop though the array. for each sea grid box where tmask == 1),
1392          ! read which region the grid box is in, add the value of the gridbox (and its square)
1393          ! to the total for that region, and then increment the counter for that region.
1394          !CALL cpu_time(start_reg_mean_loop)
1395          !WRITE(numout,*) kt,start_reg_mean_loop
1396          IF(lwp .AND. verbose) WRITE(numout,*) 'dia_wri_region_mean : '//tmp_name//'; begin spatial loops: '
1397          DO ji = nldi,nlei
1398              DO jj = nldj,nlej
1399                    IF ( tmask(ji,jj,1) == 1.0_wp ) THEN
1400                        ind = internal_region_mask(ji,jj)+1
1401                        tot_mat(ind) = tot_mat(ind) + (internal_infield(ji,jj))
1402                        ssq_mat(ind) = ssq_mat(ind) + ( internal_infield(ji,jj) *  internal_infield(ji,jj))
1403                        cnt_mat(ind) = cnt_mat(ind) + 1.
1404
1405                        min_mat(ind) = min(min_mat(ind),internal_infield(ji,jj))
1406                        max_mat(ind) = max(max_mat(ind),internal_infield(ji,jj))
1407                    ENDIF
1408              END DO
1409          END DO
1410          IF(lwp .AND. verbose) WRITE(numout,*) 'dia_wri_region_mean : '//tmp_name//'; finish spatial loops: '
1411          ! sum the totals, the counts, and the squares across the processors         
1412          CALL mpp_sum( 'diaregionmean',tot_mat,nreg )
1413          IF(lwp .AND. verbose) WRITE(numout,*) 'dia_wri_region_mean : '//tmp_name//'; finished mpp_sum 1'
1414          CALL mpp_sum( 'diaregionmean',ssq_mat,nreg )
1415          IF(lwp .AND. verbose) WRITE(numout,*) 'dia_wri_region_mean : '//tmp_name//'; finished mpp_sum 2'
1416          CALL mpp_sum( 'diaregionmean',cnt_mat,nreg )
1417          IF(lwp .AND. verbose) WRITE(numout,*) 'dia_wri_region_mean : '//tmp_name//'; finished mpp_sum 2'
1418
1419          CALL mpp_min( 'diaregionmean',min_mat,nreg )
1420          IF(lwp .AND. verbose) WRITE(numout,*) 'dia_wri_region_mean : '//tmp_name//'; finished mpp_min'
1421          CALL mpp_max( 'diaregionmean',max_mat,nreg )
1422          IF(lwp .AND. verbose) WRITE(numout,*) 'dia_wri_region_mean : '//tmp_name//'; finished mpp_max'
1423         
1424         
1425          !calculate the mean and variance from the total, sum of squares and the count.
1426         
1427          ave_mat = tot_mat(:)/cnt_mat(:)
1428          var_mat = ssq_mat(:)/cnt_mat(:) - (ave_mat(:)*ave_mat(:))
1429         
1430         
1431          !mask array of mask and region number.
1432          DO jj = 1,nreg
1433              reg_id_mat(jj) = real(jj-1)
1434              mask_id_mat(jj) = real(maskno)
1435          END DO
1436         
1437         
1438          !write text and binary, and note region statistics for current mask for later iom_put
1439          IF( lwp ) THEN 
1440         
1441              !Write out ascii and binary if requred
1442              IF ( ln_diaregmean_bin ) THEN
1443                  !Writing out regional mean time series to binary files
1444                  WRITE(numdct_reg_bin) tmp_name,kt,maskno,n_regions_output
1445                  WRITE(numdct_reg_bin) ave_mat
1446                  WRITE(numdct_reg_bin) tot_mat
1447                  WRITE(numdct_reg_bin) var_mat
1448                  WRITE(numdct_reg_bin) ssq_mat
1449                  WRITE(numdct_reg_bin) cnt_mat
1450                  WRITE(numdct_reg_bin) min_mat
1451                  WRITE(numdct_reg_bin) max_mat
1452              ENDIF
1453             
1454              IF ( ln_diaregmean_ascii  ) THEN
1455                  !Writing out regional mean time series to text files
1456
1457                  WRITE(nreg_string, "(I5)") nreg
1458                  FormatString = "(A30,"//trim(nreg_string)//"F25.3)"
1459                  WRITE(numdct_reg_txt, FMT="(A30,I6,I6)") tmp_name,kt,maskno           
1460                  WRITE(numdct_reg_txt, FMT=trim(FormatString)) trim(tmp_name)//" "//"ave_mat:", ave_mat
1461                  WRITE(numdct_reg_txt, FMT=trim(FormatString)) trim(tmp_name)//" "//"tot_mat:", tot_mat
1462                  WRITE(numdct_reg_txt, FMT=trim(FormatString)) trim(tmp_name)//" "//"var_mat:", var_mat
1463                  WRITE(numdct_reg_txt, FMT=trim(FormatString)) trim(tmp_name)//" "//"ssq_mat:", ssq_mat
1464                  WRITE(numdct_reg_txt, FMT=trim(FormatString)) trim(tmp_name)//" "//"cnt_mat:", cnt_mat
1465                  WRITE(numdct_reg_txt, FMT=trim(FormatString)) trim(tmp_name)//" "//"min_mat:", min_mat
1466                  WRITE(numdct_reg_txt, FMT=trim(FormatString)) trim(tmp_name)//" "//"max_mat:", max_mat
1467                  WRITE(numdct_reg_txt, FMT=trim(FormatString)) trim(tmp_name)//" "//"reg_mat:", reg_id_mat
1468                  WRITE(numdct_reg_txt, FMT=trim(FormatString)) trim(tmp_name)//" "//"msk_mat:", mask_id_mat
1469
1470              ENDIF
1471             
1472              DO jm = 1,nreg
1473                  zrmet_ave(    reg_ind_cnt) =     ave_mat(jm)
1474                  zrmet_tot(    reg_ind_cnt) =     tot_mat(jm)
1475                  zrmet_var(    reg_ind_cnt) =     var_mat(jm)
1476                  zrmet_cnt(    reg_ind_cnt) =     cnt_mat(jm)
1477                  zrmet_min(    reg_ind_cnt) =     min_mat(jm)
1478                  zrmet_max(    reg_ind_cnt) =     max_mat(jm)
1479                  zrmet_reg_id( reg_ind_cnt) =  reg_id_mat(jm)
1480                  zrmet_mask_id(reg_ind_cnt) = mask_id_mat(jm)
1481               
1482                  reg_ind_cnt = reg_ind_cnt + 1 
1483              END DO
1484         
1485          ENDIF
1486       
1487          IF(lwp .AND. verbose) WRITE(numout,*) 'dia_regmean about to deallocated arrays for ',kt,maskno
1488          DEALLOCATE(ave_mat,tot_mat,num_mat,var_mat,ssq_mat,cnt_mat,min_mat,max_mat,reg_id_mat,mask_id_mat)
1489
1490          IF(lwp .AND. verbose) WRITE(numout,*) 'dia_regmean deallocated arrays for ',kt,maskno
1491          IF(lwp)CALL FLUSH(numdct_reg_txt)
1492          IF(lwp .AND. verbose) WRITE(numout,*) 'dia_regmean flushed region mean text for ',kt,maskno
1493      END DO
1494
1495      IF(lwp .AND. verbose) THEN                   ! Control print
1496         WRITE(numout,*) 'dia_regmean ready to start iom_put'
1497         CALL FLUSH(numout)
1498      ENDIF
1499     
1500      !With current field_def.xml and iodef.xml, these fields must be output, so set to dummy values if not required.
1501     
1502      IF ( ln_diaregmean_nc ) THEN
1503     
1504          zrmet_out(:,:,:) = 0
1505          zrmet_val = 0
1506          tmp_name_iom = ''
1507
1508          IF(lwp .AND. verbose) WRITE(numout,*) 'dia_regmean ready to start iom_put: ',trim(tmp_name)
1509         
1510          tmp_name_iom =  trim(trim("reg_") // trim(tmp_name) // trim('_ave'))
1511          IF (iom_use(trim(tmp_name_iom))) THEN
1512              DO jm = 1,n_regions_output
1513                zrmet_val = zrmet_ave(jm)
1514    !            if (zrmet_val .LT. -1e16) zrmet_val = -1e16
1515    !            if (zrmet_val .GT. 1e16) zrmet_val = 1e16
1516                if (zrmet_val .NE. zrmet_val) zrmet_val = 1e20
1517                zrmet_out(:,:,jm) = zrmet_val
1518              END DO     
1519              IF(lwp .AND. verbose) WRITE(numout,*) 'dia_regmean iom_put tmp_name_iom : ',trim(tmp_name_iom)
1520              CALL iom_put(trim(tmp_name_iom), zrmet_out )
1521              zrmet_out(:,:,:) = 0
1522              zrmet_val = 0
1523              tmp_name_iom = ''
1524          ENDIF
1525
1526          tmp_name_iom =  trim(trim("reg_") // trim(tmp_name) // trim('_tot'))
1527          IF (iom_use(trim(tmp_name_iom))) THEN
1528              DO jm = 1,n_regions_output
1529                zrmet_val = zrmet_tot(jm)
1530    !            if (zrmet_val .LT. -1e16) zrmet_val = -1e16
1531    !            if (zrmet_val .GT. 1e16) zrmet_val = 1e16
1532                if (zrmet_val .NE. zrmet_val) zrmet_val = 1e20
1533                zrmet_out(:,:,jm) = zrmet_val
1534              END DO
1535              IF(lwp .AND. verbose) WRITE(numout,*) 'dia_regmean iom_put tmp_name_iom : ',trim(tmp_name_iom)         
1536              CALL iom_put( trim(tmp_name_iom), zrmet_out )
1537              zrmet_out(:,:,:) = 0
1538              zrmet_val = 0
1539              tmp_name_iom = ''
1540          ENDIF
1541
1542          tmp_name_iom =  trim(trim("reg_") // trim(tmp_name) // trim('_var'))
1543          IF (iom_use(trim(tmp_name_iom))) THEN
1544              DO jm = 1,n_regions_output
1545                zrmet_val = zrmet_var(jm)
1546    !            if (zrmet_val .LT. -1e16) zrmet_val = -1e16
1547    !            if (zrmet_val .GT. 1e16) zrmet_val = 1e16
1548                if (zrmet_val .NE. zrmet_val) zrmet_val = 1e20
1549                zrmet_out(:,:,jm) = zrmet_val
1550              END DO
1551              IF(lwp .AND. verbose) WRITE(numout,*) 'dia_regmean iom_put tmp_name_iom : ',trim(tmp_name_iom)         
1552              CALL iom_put( trim(tmp_name_iom), zrmet_out )
1553              zrmet_out(:,:,:) = 0
1554              zrmet_val = 0
1555              tmp_name_iom = ''
1556          ENDIF
1557
1558          tmp_name_iom =  trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))
1559          IF (iom_use(trim(tmp_name_iom))) THEN
1560              DO jm = 1,n_regions_output
1561                zrmet_val = zrmet_cnt(jm)
1562    !            if (zrmet_val .LT. -1e16) zrmet_val = -1e16
1563    !            if (zrmet_val .GT. 1e16) zrmet_val = 1e16
1564                if (zrmet_val .NE. zrmet_val) zrmet_val = 1e20
1565                zrmet_out(:,:,jm) = zrmet_val
1566              END DO
1567              IF(lwp .AND. verbose) WRITE(numout,*) 'dia_regmean iom_put tmp_name_iom : ',trim(tmp_name_iom)         
1568              CALL iom_put( trim(tmp_name_iom), zrmet_out )
1569              zrmet_out(:,:,:) = 0
1570              zrmet_val = 0
1571              tmp_name_iom = ''
1572          ENDIF
1573
1574          tmp_name_iom =  trim(trim("reg_") // trim(tmp_name) // trim('_reg_id'))
1575          IF (iom_use(trim(tmp_name_iom))) THEN
1576              DO jm = 1,n_regions_output
1577                zrmet_val = zrmet_reg_id(jm)
1578    !            if (zrmet_val .LT. -1e16) zrmet_val = -1e16
1579    !            if (zrmet_val .GT. 1e16) zrmet_val = 1e16
1580                if (zrmet_val .NE. zrmet_val) zrmet_val = 1e20
1581                zrmet_out(:,:,jm) = zrmet_val
1582              END DO
1583              IF(lwp .AND. verbose) WRITE(numout,*) 'dia_regmean iom_put tmp_name_iom : ',trim(tmp_name_iom)         
1584              CALL iom_put( trim(tmp_name_iom), zrmet_out )
1585              zrmet_out(:,:,:) = 0
1586              zrmet_val = 0
1587              tmp_name_iom = ''
1588          ENDIF
1589
1590          tmp_name_iom =  trim(trim("reg_") // trim(tmp_name) // trim('_mask_id'))
1591          IF (iom_use(trim(tmp_name_iom))) THEN
1592              DO jm = 1,n_regions_output
1593                zrmet_val = zrmet_mask_id(jm)
1594    !            if (zrmet_val .LT. -1e16) zrmet_val = -1e16
1595    !            if (zrmet_val .GT. 1e16) zrmet_val = 1e16
1596                if (zrmet_val .NE. zrmet_val) zrmet_val = 1e20
1597                zrmet_out(:,:,jm) = zrmet_val
1598              END DO
1599              IF(lwp .AND. verbose) WRITE(numout,*) 'dia_regmean iom_put tmp_name_iom : ',trim(tmp_name_iom)         
1600              CALL iom_put( trim(tmp_name_iom), zrmet_out )
1601              zrmet_out(:,:,:) = 0
1602              zrmet_val = 0
1603              tmp_name_iom = ''
1604          ENDIF
1605     
1606      ELSE
1607       
1608          ALLOCATE( dummy_zrmet(jpi,jpj,n_regions_output),  STAT= ierr )
1609            IF( ierr /= 0 )   CALL ctl_stop( 'dia_wri_region_mean: failed to allocate dummy_zrmet array' )
1610
1611          DO jm = 1,n_regions_output
1612              dummy_zrmet(:,:,jm) =     real(jm,wp)
1613          END DO
1614
1615          DO jm = 1,9
1616              !IF iom_use(trim(trim(trim("reg_") // trim(tmp_name) // trim('_ave')))) CALL iom_put( trim(trim("reg_") // trim(tmp_name) // trim('_ave')), dummy_zrmet )
1617              !IF iom_use(trim(trim(trim("reg_") // trim(tmp_name) // trim('_tot')))) CALL iom_put( trim(trim("reg_") // trim(tmp_name) // trim('_tot')), dummy_zrmet )
1618              !IF iom_use(trim(trim(trim("reg_") // trim(tmp_name) // trim('_var')))) CALL iom_put( trim(trim("reg_") // trim(tmp_name) // trim('_var')), dummy_zrmet )
1619              !IF iom_use(trim(trim(trim("reg_") // trim(tmp_name) // trim('_cnt')))) CALL iom_put( trim(trim("reg_") // trim(tmp_name) // trim('_cnt')), dummy_zrmet )
1620              !IF iom_use(trim(trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')))) CALL iom_put( trim(trim("reg_") // trim(tmp_name) // trim('_reg_id')), dummy_zrmet )
1621              !IF iom_use(trim(trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')))) CALL iom_put( trim(trim("reg_") // trim(tmp_name) // trim('_mask_id')), dummy_zrmet )
1622
1623
1624              tmp_name_iom =  trim(trim("reg_") // trim(tmp_name) // trim('_ave'))
1625              IF (iom_use(trim(tmp_name_iom))) THEN
1626                 CALL iom_put( trim(tmp_name_iom), dummy_zrmet )
1627              ENDIF
1628              tmp_name_iom =  trim(trim("reg_") // trim(tmp_name) // trim('_tot'))
1629              IF (iom_use(trim(tmp_name_iom))) THEN
1630                 CALL iom_put( trim(tmp_name_iom), dummy_zrmet )
1631              ENDIF
1632              tmp_name_iom =  trim(trim("reg_") // trim(tmp_name) // trim('_var'))
1633              IF (iom_use(trim(tmp_name_iom))) THEN
1634                 CALL iom_put( trim(tmp_name_iom), dummy_zrmet )
1635              ENDIF
1636              tmp_name_iom =  trim(trim("reg_") // trim(tmp_name) // trim('_cnt'))
1637              IF (iom_use(trim(tmp_name_iom))) THEN
1638                 CALL iom_put( trim(tmp_name_iom), dummy_zrmet )
1639              ENDIF
1640              tmp_name_iom =  trim(trim("reg_") // trim(tmp_name) // trim('_reg_id'))
1641              IF (iom_use(trim(tmp_name_iom))) THEN
1642                 CALL iom_put( trim(tmp_name_iom), dummy_zrmet )
1643              ENDIF
1644              tmp_name_iom =  trim(trim("reg_") // trim(tmp_name) // trim('_mask_id'))
1645              IF (iom_use(trim(tmp_name_iom))) THEN
1646                 CALL iom_put( trim(tmp_name_iom), dummy_zrmet )
1647              ENDIF
1648
1649          END DO
1650   
1651          DEALLOCATE( dummy_zrmet)
1652      ENDIF
1653     
1654      DEALLOCATE(zrmet_ave,zrmet_tot,zrmet_var,zrmet_cnt,zrmet_mask_id,zrmet_reg_id,zrmet_min,zrmet_max,zrmet_out)
1655
1656      IF(lwp .AND. verbose) THEN                   ! Control print
1657         WRITE(numout,*) 
1658         WRITE(numout,*) 'dia_wri_region_mean finished for ', trim(tmp_name)
1659         WRITE(numout,*) 
1660         CALL FLUSH(numout)
1661      ENDIF
1662     
1663   END SUBROUTINE dia_wri_region_mean
1664
1665
1666   !!======================================================================
1667END MODULE diaregmean
Note: See TracBrowser for help on using the repository browser.