source: palm/trunk/SOURCE/surface_data_output_mod.f90 @ 3728

Last change on this file since 3728 was 3728, checked in by gronemeier, 5 years ago

bugfix: add missing cpp option to encapsule netcdf commands

  • Property svn:keywords set to Id
File size: 231.8 KB
Line 
1!> @file surface_data_output_mod.f90
2!------------------------------------------------------------------------------!
3! This file is part of the PALM model system.
4!
5! PALM is free software: you can redistribute it and/or modify it under the
6! terms of the GNU General Public License as published by the Free Software
7! Foundation, either version 3 of the License, or (at your option) any later
8! version.
9!
10! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
11! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13!
14! You should have received a copy of the GNU General Public License along with
15! PALM. If not, see <http://www.gnu.org/licenses/>.
16!
17! Copyright 1997-2019 Leibniz Universitaet Hannover
18!------------------------------------------------------------------------------!
19!
20! Current revisions:
21! ------------------
22!
23!
24! Former revisions:
25! -----------------
26! $Id: surface_data_output_mod.f90 3728 2019-02-08 15:52:48Z gronemeier $
27! Bugfix: add cpp options
28!
29! 3727 2019-02-08 14:52:10Z gronemeier
30! Enable NetCDF output for surface data (suehring, gronemeier)
31!
32! 3691 2019-01-23 09:57:04Z suehring
33! Add output of surface-parallel flow speed
34!
35! 3648 2019-01-02 16:35:46Z suehring
36! Rename module and subroutines
37!
38! 3646 2018-12-28 17:58:49Z kanani
39! Bugfix: use time_since_reference_point instead of simulated_time (relevant
40! when using wall/soil spinup)
41!
42! 3614 2018-12-10 07:05:46Z raasch
43! unused variables removed
44!
45! 3572 2018-11-28 11:40:28Z suehring
46! Added short- and longwave radiation flux arrays (e.g. diffuse, direct,
47! reflected, resedual) for all surfaces (M. Salim)
48!
49! 3494 2018-11-06 14:51:27Z suehring
50! Bugfix in gathering surface data from different types and orientation.
51! Output of total number of surfaces and vertices added.
52! String length is output, for more convinient post-processing.
53! Last actions added.
54!
55! 3483 2018-11-02 14:19:26Z raasch
56! bugfix: missed directives for MPI added
57!
58! 3421 2018-10-24 18:39:32Z gronemeier
59! Add output variables
60! Write data into binary file
61!
62! 3420 2018-10-24 17:30:08Z gronemeier
63! Initial implementation from Klaus Ketelsen and Matthias Suehring
64!
65!
66! Authors:
67! --------
68! @author Klaus Ketelsen, Matthias Suehring
69!
70! Description:
71! ------------
72!> Generate output for surface data.
73!>
74!> @todo Create namelist file for post-processing tool.
75!------------------------------------------------------------------------------!
76
77MODULE surface_data_output_mod
78
79   USE kinds
80
81   USE arrays_3d,                                                              &
82       ONLY:  zu, zw
83       
84   USE control_parameters,                                                     &
85       ONLY:  coupling_char, data_output_during_spinup, end_time,              &
86              message_string, run_description_header, simulated_time_at_begin, &
87              spinup_time, surface_output
88       
89   USE grid_variables,                                                         &
90       ONLY: dx,dy
91       
92   USE indices,                                                                &
93       ONLY: nxl, nxr, nys, nyn, nzb, nzt
94       
95#if defined( __netcdf )
96   USE NETCDF
97#endif
98
99   USE netcdf_data_input_mod,                                                  &
100       ONLY:  init_model
101
102   USE netcdf_interface,                                                       &
103       ONLY:  netcdf_create_att, netcdf_create_dim, netcdf_create_file,        &
104              netcdf_create_global_atts, netcdf_create_var, netcdf_handle_error
105       
106   USE pegrid
107       
108   USE surface_mod,                                                            &
109       ONLY:  surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v,                  &
110              surf_usm_h, surf_usm_v
111
112   IMPLICIT NONE
113
114   TYPE surf_out                      !< data structure which contains all surfaces elements of all types on subdomain
115   
116      INTEGER(iwp) ::  ns             !< number of surface elements on subdomain
117      INTEGER(iwp) ::  ns_total       !< total number of surface elements
118      INTEGER(iwp) ::  npoints        !< number of points / vertices which define a surface element (on subdomain)
119      INTEGER(iwp) ::  npoints_total  !< total number of points / vertices which define a surface element
120     
121      INTEGER(iwp), DIMENSION(:), ALLOCATABLE   ::  s        !< coordinate for NetCDF output, number of the surface element
122     
123      REAL(wp) ::  fillvalue = -9999.9_wp !< fillvalue for surface elements which are not defined
124     
125      REAL(wp), DIMENSION(:), ALLOCATABLE   ::  azimuth  !< azimuth orientation coordinate for NetCDF output
126      REAL(wp), DIMENSION(:), ALLOCATABLE   ::  es_utm   !< E-UTM coordinate for NetCDF output
127      REAL(wp), DIMENSION(:), ALLOCATABLE   ::  ns_utm   !< E-UTM coordinate for NetCDF output
128      REAL(wp), DIMENSION(:), ALLOCATABLE   ::  xs       !< x-coordinate for NetCDF output
129      REAL(wp), DIMENSION(:), ALLOCATABLE   ::  ys       !< y-coordinate for NetCDF output
130      REAL(wp), DIMENSION(:), ALLOCATABLE   ::  zs       !< z-coordinate for NetCDF output
131      REAL(wp), DIMENSION(:), ALLOCATABLE   ::  zenith   !< zenith orientation coordinate for NetCDF output
132      REAL(wp), DIMENSION(:), ALLOCATABLE   ::  var_out  !< output variables
133      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  var_av   !< variables used for averaging
134      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  points   !< points  / vertices of a surface element
135      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  polygons !< polygon data of a surface element
136   END TYPE surf_out
137   
138   CHARACTER(LEN=100), DIMENSION(300)       ::  data_output_surf = ' '  !< namelist variable which describes the output variables
139   CHARACTER(LEN=100), DIMENSION(0:1,300)   ::  dosurf = ' '            !< internal variable which describes the output variables
140                                                                        !<  and separates averaged from non-averaged output
141   CHARACTER(LEN=100), DIMENSION(0:1,300)   ::  dosurf_unit = ' '       !< internal variable which holds the unit of the given output variable
142   
143   INTEGER(iwp) ::  average_count_surf = 0   !< number of ensemble members used for averaging
144   INTEGER(iwp) ::  dosurf_no(0:1) = 0       !< number of surface output quantities
145
146   INTEGER(iwp) :: nc_stat                   !< error code for netcdf routines
147   INTEGER(iwp), SAVE ::  oldmode            !< save old set-fill-mode of netcdf file (not needed, but required for routine call)
148
149   INTEGER(iwp), DIMENSION(0:1) ::  id_dim_s_surf         !< netcdf ID for dimension s
150   INTEGER(iwp), DIMENSION(0:1) ::  id_dim_time_surf      !< netcdf ID for dimension time
151   INTEGER(iwp), DIMENSION(0:1) ::  id_set_surf           !< netcdf ID for file
152   INTEGER(iwp), DIMENSION(0:1) ::  id_var_etum_surf      !< netcdf ID for variable Es_UTM
153   INTEGER(iwp), DIMENSION(0:1) ::  id_var_nutm_surf      !< netcdf ID for variable Ns_UTM
154   INTEGER(iwp), DIMENSION(0:1) ::  id_var_time_surf      !< netcdf ID for variable time
155   INTEGER(iwp), DIMENSION(0:1) ::  id_var_s_surf         !< netcdf ID for variable s
156   INTEGER(iwp), DIMENSION(0:1) ::  id_var_xs_surf        !< netcdf ID for variable xs
157   INTEGER(iwp), DIMENSION(0:1) ::  id_var_ys_surf        !< netcdf ID for variable ys
158   INTEGER(iwp), DIMENSION(0:1) ::  id_var_zs_surf        !< netcdf ID for variable zs
159   INTEGER(iwp), DIMENSION(0:1) ::  dosurf_time_count = 0 !< count of output time steps
160   INTEGER(iwp), DIMENSION(0:1) ::  ntdim_surf            !< number of output time steps
161   
162   INTEGER(iwp), DIMENSION(0:1,300) ::  id_var_dosurf     !< netcdf ID for output variables
163
164   LOGICAL :: first_output(0:1) = .FALSE.                 !< true if first output was already called
165   LOGICAL :: to_netcdf = .TRUE.                          !< flag indicating parallel NetCDF output
166   LOGICAL :: to_vtk = .TRUE.                             !< flag indicating binary surface-data output that can be further
167                                                          !< processed to VTK format
168
169   REAL(wp) ::  averaging_interval_surf  = 9999999.9_wp   !< averaging interval
170   REAL(wp) ::  dt_dosurf = 9999999.9_wp                  !< time interval for instantaneous data output
171   REAL(wp) ::  dt_dosurf_av = 9999999.9_wp               !< time interval for averaged data output
172   REAL(wp) ::  skip_time_dosurf = 0.0_wp                 !< skip time for instantaneous data output
173   REAL(wp) ::  skip_time_dosurf_av = 0.0_wp              !< skip time for averaged data output
174   REAL(wp) ::  time_dosurf = 0.0_wp                      !< internal counter variable to check for instantaneous data output
175   REAL(wp) ::  time_dosurf_av = 0.0_wp                   !< internal counter variable to check for averaged data output
176
177   TYPE(surf_out) ::  surfaces      !< variable which contains all required output information
178   
179   SAVE
180
181   PRIVATE
182
183   INTERFACE  surface_data_output
184      MODULE PROCEDURE surface_data_output
185   END INTERFACE  surface_data_output
186   
187   INTERFACE  surface_data_output_averaging
188      MODULE PROCEDURE surface_data_output_averaging
189   END INTERFACE  surface_data_output_averaging
190   
191   INTERFACE  surface_data_output_check_parameters
192      MODULE PROCEDURE surface_data_output_check_parameters
193   END INTERFACE  surface_data_output_check_parameters
194   
195   INTERFACE  surface_data_output_init
196      MODULE PROCEDURE surface_data_output_init
197   END INTERFACE  surface_data_output_init
198   
199   INTERFACE  surface_data_output_last_action
200      MODULE PROCEDURE surface_data_output_last_action
201   END INTERFACE  surface_data_output_last_action
202     
203   INTERFACE  surface_data_output_parin
204      MODULE PROCEDURE surface_data_output_parin
205   END INTERFACE  surface_data_output_parin
206
207!
208!--Public subroutines
209   PUBLIC surface_data_output, surface_data_output_averaging,                  &
210          surface_data_output_check_parameters, surface_data_output_init,      &
211          surface_data_output_last_action, surface_data_output_parin
212!
213!--Public variables
214   PUBLIC average_count_surf, averaging_interval_surf, dt_dosurf, dt_dosurf_av,&
215          skip_time_dosurf, skip_time_dosurf_av, time_dosurf, time_dosurf_av
216
217 CONTAINS
218
219!------------------------------------------------------------------------------!
220! Description:
221! ------------
222!> Initialization surface-data output data structure: calculation of vertices
223!> and polygon data for the surface elements, allocation of required arrays.
224!------------------------------------------------------------------------------!
225   SUBROUTINE surface_data_output_init
226   
227      IMPLICIT NONE
228
229      CHARACTER (LEN=100)  :: filename            !< name of output file
230      CHARACTER (LEN=80)   ::  time_average_text  !< string written to file attribute time_avg
231      CHARACTER (LEN=4000) ::  var_list           !< list of variables written to NetCDF file
232
233      INTEGER(iwp) ::  av                !< flag for averaged (=1) and non-averaged (=0) data
234      INTEGER(iwp) ::  i                 !< grid index in x-direction, also running variable for counting non-average data output
235      INTEGER(iwp) ::  j                 !< grid index in y-direction, also running variable for counting average data output
236      INTEGER(iwp) ::  k                 !< grid index in z-direction
237      INTEGER(iwp) ::  l                 !< running index for surface-element orientation
238      INTEGER(iwp) ::  m                 !< running index for surface elements
239      INTEGER(iwp) ::  mm                !< local counting variable for surface elements
240      INTEGER(iwp) ::  npg               !< counter variable for all surface elements ( or polygons )
241      INTEGER(iwp) ::  point_index_count !< local counter variable for point index
242      INTEGER(iwp) ::  start_count       !< local start counter for the surface index
243     
244      INTEGER(iwp), DIMENSION(0:numprocs-1) :: num_points_on_pe   !< array which contains the number of points on all mpi ranks
245      INTEGER(iwp), DIMENSION(0:numprocs-1) :: num_surfaces_on_pe !< array which contains the number of surfaces on all mpi ranks
246      INTEGER(iwp), ALLOCATABLE, DIMENSION(:,:,:) ::  point_index !< dummy array used to check where the reference points for surface polygons are located
247           
248      REAL(wp) ::  az    !< azimuth angle, indicated the vertical orientation of a surface element
249      REAL(wp) ::  off_x !< grid offset in x-direction between the stored grid index and the actual wall
250      REAL(wp) ::  off_y !< grid offset in y-direction between the stored grid index and the actual wall
251
252      REAL(wp), DIMENSION(:), ALLOCATABLE ::  netcdf_data_1d  !< dummy array to output 1D data into netcdf file
253
254
255!
256!--   Determine the number of surface elements on subdomain
257      surfaces%ns = surf_def_h(0)%ns + surf_lsm_h%ns + surf_usm_h%ns           & !horizontal upward-facing
258                  + surf_def_h(1)%ns                                           & !horizontal downard-facing   
259                  + surf_def_v(0)%ns + surf_lsm_v(0)%ns + surf_usm_v(0)%ns     & !northward-facing
260                  + surf_def_v(1)%ns + surf_lsm_v(1)%ns + surf_usm_v(1)%ns     & !southward-facing   
261                  + surf_def_v(2)%ns + surf_lsm_v(2)%ns + surf_usm_v(2)%ns     & !westward-facing   
262                  + surf_def_v(3)%ns + surf_lsm_v(3)%ns + surf_usm_v(3)%ns       !eastward-facing   
263!
264!--    Determine the total number of surfaces in the model domain
265#if defined( __parallel )
266       CALL MPI_ALLREDUCE( surfaces%ns, surfaces%ns_total, 1,                  &
267                           MPI_INTEGER, MPI_SUM, comm2d, ierr )
268#else
269       surfaces%ns_total = surfaces%ns
270#endif
271!
272!--   Allocate output variable and set to _FillValue attribute
273      ALLOCATE ( surfaces%var_out(1:surfaces%ns) )
274      surfaces%var_out = surfaces%fillvalue
275!
276!--   If there is an output of time average output variables, allocate the
277!--   required array.
278      IF ( dosurf_no(1) > 0 )  THEN
279         ALLOCATE ( surfaces%var_av(1:surfaces%ns,1:dosurf_no(1)) )
280         surfaces%var_av = 0.0_wp
281      ENDIF
282!
283!--   If output to VTK format is enabled, initialize point and polygon data.
284!--   In a first step, count the number of points which are defining
285!--   the surfaces and the polygons.
286      IF ( to_vtk )  THEN
287         ALLOCATE( point_index(nzb:nzt+1,nys-1:nyn+1,nxl-1:nxr+1) )
288         point_index = -1
289!
290!--      Horizontal default surfaces
291         surfaces%npoints = 0
292         DO  l = 0, 1
293            DO  m = 1, surf_def_h(0)%ns
294!
295!--            Determine the indices of the respective grid cell inside the topography
296               i = surf_def_h(0)%i(m) + surf_def_h(0)%ioff
297               j = surf_def_h(0)%j(m) + surf_def_h(0)%joff
298               k = surf_def_h(0)%k(m) + surf_def_h(0)%koff
299!
300!--            Check if the vertices that define the surface element are already
301!--            defined, if not, increment the counter.
302               IF ( point_index(k,j,i) < 0 )  THEN
303                  surfaces%npoints   = surfaces%npoints + 1   
304                  point_index(k,j,i) = surfaces%npoints - 1
305               ENDIF
306               IF ( point_index(k,j,i+1) < 0 )  THEN
307                  surfaces%npoints     = surfaces%npoints + 1   
308                  point_index(k,j,i+1) = surfaces%npoints - 1
309               ENDIF
310               IF ( point_index(k,j+1,i+1) < 0 )  THEN
311                  surfaces%npoints       = surfaces%npoints + 1   
312                  point_index(k,j+1,i+1) = surfaces%npoints - 1
313               ENDIF
314               IF ( point_index(k,j+1,i) < 0 )  THEN
315                  surfaces%npoints     = surfaces%npoints + 1   
316                  point_index(k,j+1,i) = surfaces%npoints - 1
317               ENDIF           
318            ENDDO
319         ENDDO
320         DO  m = 1, surf_lsm_h%ns
321            i = surf_lsm_h%i(m) + surf_lsm_h%ioff
322            j = surf_lsm_h%j(m) + surf_lsm_h%joff
323            k = surf_lsm_h%k(m) + surf_lsm_h%koff
324
325            IF ( point_index(k,j,i) < 0 )  THEN
326               surfaces%npoints   = surfaces%npoints + 1   
327               point_index(k,j,i) = surfaces%npoints - 1
328            ENDIF
329            IF ( point_index(k,j,i+1) < 0 )  THEN
330               surfaces%npoints     = surfaces%npoints + 1   
331               point_index(k,j,i+1) = surfaces%npoints - 1
332            ENDIF
333            IF ( point_index(k,j+1,i+1) < 0 )  THEN
334               surfaces%npoints       = surfaces%npoints + 1   
335               point_index(k,j+1,i+1) = surfaces%npoints - 1
336            ENDIF
337            IF ( point_index(k,j+1,i) < 0 )  THEN
338               surfaces%npoints     = surfaces%npoints + 1   
339               point_index(k,j+1,i) = surfaces%npoints - 1
340            ENDIF   
341         ENDDO
342         DO  m = 1, surf_usm_h%ns
343            i = surf_usm_h%i(m) + surf_usm_h%ioff
344            j = surf_usm_h%j(m) + surf_usm_h%joff
345            k = surf_usm_h%k(m) + surf_usm_h%koff
346
347            IF ( point_index(k,j,i) < 0 )  THEN
348               surfaces%npoints   = surfaces%npoints + 1   
349               point_index(k,j,i) = surfaces%npoints - 1
350            ENDIF
351            IF ( point_index(k,j,i+1) < 0 )  THEN
352               surfaces%npoints     = surfaces%npoints + 1   
353               point_index(k,j,i+1) = surfaces%npoints - 1
354            ENDIF
355            IF ( point_index(k,j+1,i+1) < 0 )  THEN
356               surfaces%npoints       = surfaces%npoints + 1   
357               point_index(k,j+1,i+1) = surfaces%npoints - 1
358            ENDIF
359            IF ( point_index(k,j+1,i) < 0 )  THEN
360               surfaces%npoints     = surfaces%npoints + 1   
361               point_index(k,j+1,i) = surfaces%npoints - 1
362            ENDIF     
363         ENDDO
364!
365!--      Vertical surfaces
366         DO  l = 0, 3
367            DO  m = 1, surf_def_v(l)%ns
368!
369!--            Determine the indices of the respective grid cell inside the
370!--            topography. Please note, j-index for north-facing surfaces
371!--            ( l==0 ) is identical to the reference j-index outside the grid 
372!--            box. Equivalent for east-facing surfaces and i-index.
373               i = surf_def_v(l)%i(m) + MERGE( surf_def_v(l)%ioff, 0, l == 3 )
374               j = surf_def_v(l)%j(m) + MERGE( surf_def_v(l)%joff, 0, l == 1 )
375               k = surf_def_v(l)%k(m) + surf_def_v(l)%koff
376!
377!--            Lower left /front vertex
378               IF ( point_index(k,j,i) < 0 )  THEN
379                  surfaces%npoints   = surfaces%npoints + 1   
380                  point_index(k,j,i) = surfaces%npoints - 1
381               ENDIF 
382!
383!--            Upper / lower right index for north- and south-facing surfaces
384               IF ( l == 0  .OR.  l == 1 )  THEN
385                  IF ( point_index(k,j,i+1) < 0 )  THEN
386                     surfaces%npoints     = surfaces%npoints + 1   
387                     point_index(k,j,i+1) = surfaces%npoints - 1
388                  ENDIF
389                  IF ( point_index(k+1,j,i+1) < 0 )  THEN
390                     surfaces%npoints       = surfaces%npoints + 1   
391                     point_index(k+1,j,i+1) = surfaces%npoints - 1
392                  ENDIF
393!
394!--            Upper / lower front index for east- and west-facing surfaces
395               ELSEIF ( l == 2  .OR.  l == 3 )  THEN
396                  IF ( point_index(k,j+1,i) < 0 )  THEN
397                     surfaces%npoints     = surfaces%npoints + 1   
398                     point_index(k,j+1,i) = surfaces%npoints - 1
399                  ENDIF
400                  IF ( point_index(k+1,j+1,i) < 0 )  THEN
401                     surfaces%npoints       = surfaces%npoints + 1   
402                     point_index(k+1,j+1,i) = surfaces%npoints - 1
403                  ENDIF
404               ENDIF
405!
406!--            Upper left / front vertex
407               IF ( point_index(k+1,j,i) < 0 )  THEN
408                  surfaces%npoints     = surfaces%npoints + 1   
409                  point_index(k+1,j,i) = surfaces%npoints - 1
410               ENDIF
411            ENDDO
412            DO  m = 1, surf_lsm_v(l)%ns
413               i = surf_lsm_v(l)%i(m) + MERGE( surf_lsm_v(l)%ioff, 0, l == 3 )
414               j = surf_lsm_v(l)%j(m) + MERGE( surf_lsm_v(l)%joff, 0, l == 1 )
415               k = surf_lsm_v(l)%k(m) + surf_lsm_v(l)%koff
416!
417!--            Lower left /front vertex
418               IF ( point_index(k,j,i) < 0 )  THEN
419                  surfaces%npoints   = surfaces%npoints + 1   
420                  point_index(k,j,i) = surfaces%npoints - 1
421               ENDIF 
422!
423!--            Upper / lower right index for north- and south-facing surfaces
424               IF ( l == 0  .OR.  l == 1 )  THEN
425                  IF ( point_index(k,j,i+1) < 0 )  THEN
426                     surfaces%npoints     = surfaces%npoints + 1   
427                     point_index(k,j,i+1) = surfaces%npoints - 1
428                  ENDIF
429                  IF ( point_index(k+1,j,i+1) < 0 )  THEN
430                     surfaces%npoints       = surfaces%npoints + 1   
431                     point_index(k+1,j,i+1) = surfaces%npoints - 1
432                  ENDIF
433!
434!--            Upper / lower front index for east- and west-facing surfaces
435               ELSEIF ( l == 2  .OR.  l == 3 )  THEN
436                  IF ( point_index(k,j+1,i) < 0 )  THEN
437                     surfaces%npoints     = surfaces%npoints + 1   
438                     point_index(k,j+1,i) = surfaces%npoints - 1
439                  ENDIF
440                  IF ( point_index(k+1,j+1,i) < 0 )  THEN
441                     surfaces%npoints       = surfaces%npoints + 1   
442                     point_index(k+1,j+1,i) = surfaces%npoints - 1
443                  ENDIF
444               ENDIF
445!
446!--            Upper left / front vertex
447               IF ( point_index(k+1,j,i) < 0 )  THEN
448                  surfaces%npoints     = surfaces%npoints + 1   
449                  point_index(k+1,j,i) = surfaces%npoints - 1
450               ENDIF
451            ENDDO
452
453            DO  m = 1, surf_usm_v(l)%ns
454               i = surf_usm_v(l)%i(m) + MERGE( surf_usm_v(l)%ioff, 0, l == 3 )
455               j = surf_usm_v(l)%j(m) + MERGE( surf_usm_v(l)%joff, 0, l == 1 )
456               k = surf_usm_v(l)%k(m) + surf_usm_v(l)%koff
457!
458!--            Lower left /front vertex
459               IF ( point_index(k,j,i) < 0 )  THEN
460                  surfaces%npoints   = surfaces%npoints + 1   
461                  point_index(k,j,i) = surfaces%npoints - 1
462               ENDIF 
463!
464!--            Upper / lower right index for north- and south-facing surfaces
465               IF ( l == 0  .OR.  l == 1 )  THEN
466                  IF ( point_index(k,j,i+1) < 0 )  THEN
467                     surfaces%npoints     = surfaces%npoints + 1   
468                     point_index(k,j,i+1) = surfaces%npoints - 1
469                  ENDIF
470                  IF ( point_index(k+1,j,i+1) < 0 )  THEN
471                     surfaces%npoints       = surfaces%npoints + 1   
472                     point_index(k+1,j,i+1) = surfaces%npoints - 1
473                  ENDIF
474!
475!--            Upper / lower front index for east- and west-facing surfaces
476               ELSEIF ( l == 2  .OR.  l == 3 )  THEN
477                  IF ( point_index(k,j+1,i) < 0 )  THEN
478                     surfaces%npoints     = surfaces%npoints + 1   
479                     point_index(k,j+1,i) = surfaces%npoints - 1
480                  ENDIF
481                  IF ( point_index(k+1,j+1,i) < 0 )  THEN
482                     surfaces%npoints       = surfaces%npoints + 1   
483                     point_index(k+1,j+1,i) = surfaces%npoints - 1
484                  ENDIF
485               ENDIF
486!
487!--            Upper left / front vertex
488               IF ( point_index(k+1,j,i) < 0 )  THEN
489                  surfaces%npoints     = surfaces%npoints + 1   
490                  point_index(k+1,j,i) = surfaces%npoints - 1
491               ENDIF
492            ENDDO
493
494         ENDDO
495!
496!--      Allocate the number of points and polygons. Note, the number of polygons
497!--      is identical to the number of surfaces elements, whereas the number
498!--      of points (vertices), which define the polygons, can be larger.
499         ALLOCATE( surfaces%points(3,1:surfaces%npoints) )
500         ALLOCATE( surfaces%polygons(5,1:surfaces%ns)    )
501!
502!--      Note, PARAVIEW expects consecutively ordered points, in order to
503!--      unambiguously identify surfaces.
504!--      Hence, all PEs should know where they start counting, depending on the
505!--      number of points on the other PE's with lower MPI rank.
506#if defined( __parallel )
507         CALL MPI_ALLGATHER( surfaces%npoints, 1, MPI_INTEGER,                 &
508                             num_points_on_pe, 1, MPI_INTEGER, comm2d, ierr  )
509#else
510         num_points_on_pe = surfaces%npoints
511#endif
512
513!
514!--      After the number of vertices is counted, repeat the loops and define the
515!--      vertices. Start with the horizontal default surfaces.
516!--      First, however, determine the offset where couting of points should be
517!--      started, which is the sum of points of all PE's with lower MPI rank.
518         i                 = 0
519         point_index_count = 0
520         DO WHILE ( i < myid  .AND.  i <= SIZE( num_points_on_pe ) )
521            point_index_count = point_index_count + num_points_on_pe(i)
522            i                 = i + 1
523         ENDDO
524         
525         surfaces%npoints = 0
526         point_index      = -1
527         npg              = 0
528     
529         DO  l = 0, 1
530            DO  m = 1, surf_def_h(0)%ns
531!
532!--            Determine the indices of the respective grid cell inside the
533!--            topography.
534               i = surf_def_h(0)%i(m) + surf_def_h(0)%ioff
535               j = surf_def_h(0)%j(m) + surf_def_h(0)%joff
536               k = surf_def_h(0)%k(m) + surf_def_h(0)%koff
537!
538!--            Check if the vertices that define the surface element are 
539!--            already defined, if not, increment the counter.
540               IF ( point_index(k,j,i) < 0 )  THEN
541                  surfaces%npoints   = surfaces%npoints + 1   
542                  point_index(k,j,i) = point_index_count
543                  point_index_count  = point_index_count + 1               
544                  surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
545                  surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
546                  surfaces%points(3,surfaces%npoints) = zw(k)
547               ENDIF
548               IF ( point_index(k,j,i+1) < 0 )  THEN
549                  surfaces%npoints     = surfaces%npoints + 1   
550                  point_index(k,j,i+1) = point_index_count
551                  point_index_count    = point_index_count + 1 
552                  surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
553                  surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
554                  surfaces%points(3,surfaces%npoints) = zw(k)
555               ENDIF
556               IF ( point_index(k,j+1,i+1) < 0 )  THEN
557                  surfaces%npoints       = surfaces%npoints + 1   
558                  point_index(k,j+1,i+1) = point_index_count
559                  point_index_count      = point_index_count + 1 
560                  surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
561                  surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
562                  surfaces%points(3,surfaces%npoints) = zw(k)
563               ENDIF
564               IF ( point_index(k,j+1,i) < 0 )  THEN
565                  surfaces%npoints     = surfaces%npoints + 1   
566                  point_index(k,j+1,i) = point_index_count
567                  point_index_count    = point_index_count + 1 
568                  surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
569                  surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
570                  surfaces%points(3,surfaces%npoints) = zw(k)
571               ENDIF
572               
573               npg                        = npg + 1
574               surfaces%polygons(1,npg)   = 4
575               surfaces%polygons(2,npg)   = point_index(k,j,i)
576               surfaces%polygons(3,npg)   = point_index(k,j,i+1)
577               surfaces%polygons(4,npg)   = point_index(k,j+1,i+1)
578               surfaces%polygons(5,npg)   = point_index(k,j+1,i)
579            ENDDO
580         ENDDO
581         DO  m = 1, surf_lsm_h%ns
582            i = surf_lsm_h%i(m) + surf_lsm_h%ioff
583            j = surf_lsm_h%j(m) + surf_lsm_h%joff
584            k = surf_lsm_h%k(m) + surf_lsm_h%koff
585            IF ( point_index(k,j,i) < 0 )  THEN
586               surfaces%npoints   = surfaces%npoints + 1   
587               point_index(k,j,i) = point_index_count
588               point_index_count  = point_index_count + 1 
589               surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
590               surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
591               surfaces%points(3,surfaces%npoints) = zw(k)
592            ENDIF
593            IF ( point_index(k,j,i+1) < 0 )  THEN
594               surfaces%npoints     = surfaces%npoints + 1   
595               point_index(k,j,i+1) = point_index_count
596               point_index_count    = point_index_count + 1 
597               surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
598               surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
599               surfaces%points(3,surfaces%npoints) = zw(k)
600            ENDIF
601            IF ( point_index(k,j+1,i+1) < 0 )  THEN
602               surfaces%npoints       = surfaces%npoints + 1   
603               point_index(k,j+1,i+1) = point_index_count
604               point_index_count      = point_index_count + 1 
605               surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
606               surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
607               surfaces%points(3,surfaces%npoints) = zw(k)
608            ENDIF
609            IF ( point_index(k,j+1,i) < 0 )  THEN
610               surfaces%npoints     = surfaces%npoints + 1   
611               point_index(k,j+1,i) = point_index_count
612               point_index_count    = point_index_count + 1 
613               surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
614               surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
615               surfaces%points(3,surfaces%npoints) = zw(k)
616            ENDIF
617           
618            npg                        = npg + 1
619            surfaces%polygons(1,npg)   = 4
620            surfaces%polygons(2,npg)   = point_index(k,j,i)
621            surfaces%polygons(3,npg)   = point_index(k,j,i+1)
622            surfaces%polygons(4,npg)   = point_index(k,j+1,i+1)
623            surfaces%polygons(5,npg)   = point_index(k,j+1,i) 
624         ENDDO
625     
626         DO  m = 1, surf_usm_h%ns
627            i = surf_usm_h%i(m) + surf_usm_h%ioff
628            j = surf_usm_h%j(m) + surf_usm_h%joff
629            k = surf_usm_h%k(m) + surf_usm_h%koff
630     
631            IF ( point_index(k,j,i) < 0 )  THEN
632               surfaces%npoints   = surfaces%npoints + 1   
633               point_index(k,j,i) = point_index_count
634               point_index_count  = point_index_count + 1 
635               surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
636               surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
637               surfaces%points(3,surfaces%npoints) = zw(k)
638            ENDIF
639            IF ( point_index(k,j,i+1) < 0 )  THEN
640               surfaces%npoints     = surfaces%npoints + 1   
641               point_index(k,j,i+1) = point_index_count
642               point_index_count    = point_index_count + 1 
643               surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
644               surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
645               surfaces%points(3,surfaces%npoints) = zw(k)
646            ENDIF
647            IF ( point_index(k,j+1,i+1) < 0 )  THEN
648               surfaces%npoints       = surfaces%npoints + 1   
649               point_index(k,j+1,i+1) = point_index_count
650               point_index_count      = point_index_count + 1 
651               surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
652               surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
653               surfaces%points(3,surfaces%npoints) = zw(k)
654            ENDIF
655            IF ( point_index(k,j+1,i) < 0 )  THEN
656               surfaces%npoints     = surfaces%npoints + 1   
657               point_index(k,j+1,i) = point_index_count
658               point_index_count    = point_index_count + 1 
659               surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
660               surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
661               surfaces%points(3,surfaces%npoints) = zw(k)
662            ENDIF
663           
664            npg                        = npg + 1
665            surfaces%polygons(1,npg)   = 4
666            surfaces%polygons(2,npg)   = point_index(k,j,i)
667            surfaces%polygons(3,npg)   = point_index(k,j,i+1)
668            surfaces%polygons(4,npg)   = point_index(k,j+1,i+1)
669            surfaces%polygons(5,npg)   = point_index(k,j+1,i)   
670         ENDDO
671
672         DO  l = 0, 3
673            DO  m = 1, surf_def_v(l)%ns
674!       
675!--            Determine the indices of the respective grid cell inside the topography.
676!--            Please note, j-index for north-facing surfaces ( l==0 ) is
677!--            identical to the reference j-index outside the grid box.
678!--            Equivalent for east-facing surfaces and i-index.
679               i = surf_def_v(l)%i(m) + MERGE( surf_def_v(l)%ioff, 0, l == 3 )
680               j = surf_def_v(l)%j(m) + MERGE( surf_def_v(l)%joff, 0, l == 1 )
681               k = surf_def_v(l)%k(m) + surf_def_v(l)%koff
682!       
683!--            Lower left /front vertex
684               IF ( point_index(k,j,i) < 0 )  THEN
685                  surfaces%npoints   = surfaces%npoints + 1   
686                  point_index(k,j,i) = point_index_count
687                  point_index_count  = point_index_count + 1 
688                  surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
689                  surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
690                  surfaces%points(3,surfaces%npoints) = zw(k-1)
691               ENDIF 
692!       
693!--            Upper / lower right index for north- and south-facing surfaces
694               IF ( l == 0  .OR.  l == 1 )  THEN
695                  IF ( point_index(k,j,i+1) < 0 )  THEN
696                     surfaces%npoints     = surfaces%npoints + 1   
697                     point_index(k,j,i+1) = point_index_count
698                     point_index_count    = point_index_count + 1
699                     surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
700                     surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
701                     surfaces%points(3,surfaces%npoints) = zw(k-1)
702                  ENDIF
703                  IF ( point_index(k+1,j,i+1) < 0 )  THEN
704                     surfaces%npoints       = surfaces%npoints + 1   
705                     point_index(k+1,j,i+1) = point_index_count
706                     point_index_count      = point_index_count + 1
707                     surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
708                     surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
709                     surfaces%points(3,surfaces%npoints) = zw(k)
710                  ENDIF
711!       
712!--            Upper / lower front index for east- and west-facing surfaces
713               ELSEIF ( l == 2  .OR.  l == 3 )  THEN
714                  IF ( point_index(k,j+1,i) < 0 )  THEN
715                     surfaces%npoints     = surfaces%npoints + 1   
716                     point_index(k,j+1,i) = point_index_count
717                     point_index_count    = point_index_count + 1
718                     surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
719                     surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
720                     surfaces%points(3,surfaces%npoints) = zw(k-1)
721                  ENDIF
722                  IF ( point_index(k+1,j+1,i) < 0 )  THEN
723                     surfaces%npoints       = surfaces%npoints + 1   
724                     point_index(k+1,j+1,i) = point_index_count
725                     point_index_count      = point_index_count + 1
726                     surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
727                     surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
728                     surfaces%points(3,surfaces%npoints) = zw(k)
729                  ENDIF
730               ENDIF
731!       
732!--            Upper left / front vertex
733               IF ( point_index(k+1,j,i) < 0 )  THEN
734                  surfaces%npoints     = surfaces%npoints + 1   
735                  point_index(k+1,j,i) = point_index_count
736                  point_index_count    = point_index_count + 1
737                  surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
738                  surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
739                  surfaces%points(3,surfaces%npoints) = zw(k)
740               ENDIF
741               
742               npg = npg + 1           
743               IF ( l == 0  .OR.  l == 1 )  THEN
744                  surfaces%polygons(1,npg)   = 4
745                  surfaces%polygons(2,npg)   = point_index(k,j,i)
746                  surfaces%polygons(3,npg)   = point_index(k,j,i+1)
747                  surfaces%polygons(4,npg)   = point_index(k+1,j,i+1)
748                  surfaces%polygons(5,npg)   = point_index(k+1,j,i) 
749               ELSE
750                  surfaces%polygons(1,npg)   = 4
751                  surfaces%polygons(2,npg)   = point_index(k,j,i)
752                  surfaces%polygons(3,npg)   = point_index(k,j+1,i)
753                  surfaces%polygons(4,npg)   = point_index(k+1,j+1,i)
754                  surfaces%polygons(5,npg)   = point_index(k+1,j,i)
755               ENDIF
756               
757            ENDDO
758         
759            DO  m = 1, surf_lsm_v(l)%ns
760               i = surf_lsm_v(l)%i(m) + MERGE( surf_lsm_v(l)%ioff, 0, l == 3 )
761               j = surf_lsm_v(l)%j(m) + MERGE( surf_lsm_v(l)%joff, 0, l == 1 )
762               k = surf_lsm_v(l)%k(m) + surf_lsm_v(l)%koff
763!       
764!--            Lower left /front vertex
765               IF ( point_index(k,j,i) < 0 )  THEN
766                  surfaces%npoints   = surfaces%npoints + 1   
767                  point_index(k,j,i) = point_index_count
768                  point_index_count  = point_index_count + 1
769                  surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
770                  surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
771                  surfaces%points(3,surfaces%npoints) = zw(k-1)
772               ENDIF 
773!       
774!--            Upper / lower right index for north- and south-facing surfaces
775               IF ( l == 0  .OR.  l == 1 )  THEN
776                  IF ( point_index(k,j,i+1) < 0 )  THEN
777                     surfaces%npoints     = surfaces%npoints + 1   
778                     point_index(k,j,i+1) = point_index_count
779                     point_index_count    = point_index_count + 1
780                     surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
781                     surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
782                     surfaces%points(3,surfaces%npoints) = zw(k-1)
783                  ENDIF
784                  IF ( point_index(k+1,j,i+1) < 0 )  THEN
785                     surfaces%npoints       = surfaces%npoints + 1   
786                     point_index(k+1,j,i+1) = point_index_count
787                     point_index_count      = point_index_count + 1
788                     surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
789                     surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
790                     surfaces%points(3,surfaces%npoints) = zw(k)
791                  ENDIF
792!       
793!--            Upper / lower front index for east- and west-facing surfaces
794               ELSEIF ( l == 2  .OR.  l == 3 )  THEN
795                  IF ( point_index(k,j+1,i) < 0 )  THEN
796                     surfaces%npoints     = surfaces%npoints + 1   
797                     point_index(k,j+1,i) = point_index_count
798                     point_index_count    = point_index_count + 1
799                     surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
800                     surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
801                     surfaces%points(3,surfaces%npoints) = zw(k-1)
802                  ENDIF
803                  IF ( point_index(k+1,j+1,i) < 0 )  THEN
804                     surfaces%npoints       = surfaces%npoints + 1   
805                     point_index(k+1,j+1,i) = point_index_count
806                     point_index_count      = point_index_count + 1
807                     surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
808                     surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
809                     surfaces%points(3,surfaces%npoints) = zw(k)
810                  ENDIF
811               ENDIF
812!       
813!--            Upper left / front vertex
814               IF ( point_index(k+1,j,i) < 0 )  THEN
815                  surfaces%npoints     = surfaces%npoints + 1   
816                  point_index(k+1,j,i) = point_index_count
817                  point_index_count    = point_index_count + 1
818                  surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
819                  surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
820                  surfaces%points(3,surfaces%npoints) = zw(k)
821               ENDIF
822               
823               npg = npg + 1           
824               IF ( l == 0  .OR.  l == 1 )  THEN
825                  surfaces%polygons(1,npg)   = 4
826                  surfaces%polygons(2,npg)   = point_index(k,j,i)
827                  surfaces%polygons(3,npg)   = point_index(k,j,i+1)
828                  surfaces%polygons(4,npg)   = point_index(k+1,j,i+1)
829                  surfaces%polygons(5,npg)   = point_index(k+1,j,i) 
830               ELSE
831                  surfaces%polygons(1,npg)   = 4
832                  surfaces%polygons(2,npg)   = point_index(k,j,i)
833                  surfaces%polygons(3,npg)   = point_index(k,j+1,i)
834                  surfaces%polygons(4,npg)   = point_index(k+1,j+1,i)
835                  surfaces%polygons(5,npg)   = point_index(k+1,j,i)
836               ENDIF
837            ENDDO
838            DO  m = 1, surf_usm_v(l)%ns
839               i = surf_usm_v(l)%i(m) + MERGE( surf_usm_v(l)%ioff, 0, l == 3 )
840               j = surf_usm_v(l)%j(m) + MERGE( surf_usm_v(l)%joff, 0, l == 1 )
841               k = surf_usm_v(l)%k(m) + surf_usm_v(l)%koff
842!       
843!--            Lower left /front vertex
844               IF ( point_index(k,j,i) < 0 )  THEN
845                  surfaces%npoints   = surfaces%npoints + 1   
846                  point_index(k,j,i) = point_index_count
847                  point_index_count  = point_index_count + 1
848                  surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
849                  surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
850                  surfaces%points(3,surfaces%npoints) = zw(k-1)
851               ENDIF 
852!       
853!--            Upper / lower right index for north- and south-facing surfaces
854               IF ( l == 0  .OR.  l == 1 )  THEN
855                  IF ( point_index(k,j,i+1) < 0 )  THEN
856                     surfaces%npoints     = surfaces%npoints + 1   
857                     point_index(k,j,i+1) = point_index_count
858                     point_index_count    = point_index_count + 1
859                     surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
860                     surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
861                     surfaces%points(3,surfaces%npoints) = zw(k-1)
862                  ENDIF
863                  IF ( point_index(k+1,j,i+1) < 0 )  THEN
864                     surfaces%npoints       = surfaces%npoints + 1   
865                     point_index(k+1,j,i+1) = point_index_count
866                     point_index_count      = point_index_count + 1
867                     surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
868                     surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
869                     surfaces%points(3,surfaces%npoints) = zw(k)
870                  ENDIF
871!       
872!--            Upper / lower front index for east- and west-facing surfaces
873               ELSEIF ( l == 2  .OR.  l == 3 )  THEN
874                  IF ( point_index(k,j+1,i) < 0 )  THEN
875                     surfaces%npoints     = surfaces%npoints + 1   
876                     point_index(k,j+1,i) = point_index_count
877                     point_index_count    = point_index_count + 1
878                     surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
879                     surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
880                     surfaces%points(3,surfaces%npoints) = zw(k-1)
881                  ENDIF
882                  IF ( point_index(k+1,j+1,i) < 0 )  THEN
883                     surfaces%npoints       = surfaces%npoints + 1   
884                     point_index(k+1,j+1,i) = point_index_count
885                     point_index_count      = point_index_count + 1
886                     surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
887                     surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
888                     surfaces%points(3,surfaces%npoints) = zw(k)
889                  ENDIF
890               ENDIF
891!       
892!--            Upper left / front vertex
893               IF ( point_index(k+1,j,i) < 0 )  THEN
894                  surfaces%npoints     = surfaces%npoints + 1   
895                  point_index(k+1,j,i) = point_index_count
896                  point_index_count    = point_index_count + 1
897                  surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
898                  surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
899                  surfaces%points(3,surfaces%npoints) = zw(k)
900               ENDIF
901               
902               npg = npg + 1           
903               IF ( l == 0  .OR.  l == 1 )  THEN
904                  surfaces%polygons(1,npg)   = 4
905                  surfaces%polygons(2,npg)   = point_index(k,j,i)
906                  surfaces%polygons(3,npg)   = point_index(k,j,i+1)
907                  surfaces%polygons(4,npg)   = point_index(k+1,j,i+1)
908                  surfaces%polygons(5,npg)   = point_index(k+1,j,i) 
909               ELSE
910                  surfaces%polygons(1,npg)   = 4
911                  surfaces%polygons(2,npg)   = point_index(k,j,i)
912                  surfaces%polygons(3,npg)   = point_index(k,j+1,i)
913                  surfaces%polygons(4,npg)   = point_index(k+1,j+1,i)
914                  surfaces%polygons(5,npg)   = point_index(k+1,j,i)
915               ENDIF
916            ENDDO
917         
918         ENDDO
919!       
920!--      Deallocate temporary dummy variable
921         DEALLOCATE ( point_index )
922!
923!--      Sum-up total number of vertices on domain. This
924!--      will be needed for post-processing.
925         surfaces%npoints_total = 0
926#if defined( __parallel )
927          CALL MPI_ALLREDUCE( surfaces%npoints, surfaces%npoints_total, 1,     &
928                              MPI_INTEGER, MPI_SUM, comm2d, ierr )
929#else
930          surfaces%npoints_total = surfaces%npoints
931#endif
932       ENDIF
933!
934!--    If output to netcdf is enabled, set-up the coordinate arrays that
935!--    unambiguously describe the position and orientation of each surface
936!--    element.
937       IF ( to_netcdf )  THEN
938!
939!--       Allocate local coordinate arrays
940          ALLOCATE( surfaces%s(1:surfaces%ns)       )
941          ALLOCATE( surfaces%xs(1:surfaces%ns)      )
942          ALLOCATE( surfaces%ys(1:surfaces%ns)      )
943          ALLOCATE( surfaces%zs(1:surfaces%ns)      )
944          ALLOCATE( surfaces%azimuth(1:surfaces%ns) )
945          ALLOCATE( surfaces%zenith(1:surfaces%ns)  )
946          ALLOCATE( surfaces%es_utm(1:surfaces%ns)  )
947          ALLOCATE( surfaces%ns_utm(1:surfaces%ns)  )
948!
949!--       Gather the number of surface on each processor, in order to number
950!--       the surface elements in ascending order with respect to the total
951!--       number of surfaces in the domain.
952#if defined( __parallel )
953          CALL MPI_ALLGATHER( surfaces%ns, 1, MPI_INTEGER,                     &
954                              num_surfaces_on_pe, 1, MPI_INTEGER, comm2d, ierr  )
955#else
956          num_surfaces_on_pe = surfaces%ns
957#endif
958!
959!--       First, however, determine the offset where couting of the surfaces
960!--       should start (the sum of surfaces on all PE's with lower MPI rank).
961          i           = 0
962          start_count = 1
963          DO WHILE ( i < myid  .AND.  i <= SIZE( num_surfaces_on_pe ) )
964             start_count = start_count + num_surfaces_on_pe(i)
965             i           = i + 1
966          ENDDO
967!       
968!--       Set coordinate arrays. For horizontal surfaces, azimuth
969!--       angles are not defined (fill value). Zenith angle is 0 (180) for
970!--       upward (downward)-facing surfaces.
971          i  = start_count
972          mm = 1
973          DO  m = 1, surf_def_h(0)%ns
974             surfaces%s(mm)       = i
975             surfaces%xs(mm)      = ( surf_def_h(0)%i(m) + 0.5_wp ) * dx
976             surfaces%ys(mm)      = ( surf_def_h(0)%j(m) + 0.5_wp ) * dy
977             surfaces%zs(mm)      = zw(surf_def_h(0)%k(m)+surf_def_h(0)%koff)
978             surfaces%azimuth(mm) = surfaces%fillvalue
979             surfaces%zenith(mm)  = 0.0
980             i                    = i + 1
981             mm                   = mm + 1
982          ENDDO
983          DO  m = 1, surf_lsm_h%ns
984             surfaces%s(mm)       = i
985             surfaces%xs(mm)      = ( surf_lsm_h%i(m) + 0.5_wp ) * dx
986             surfaces%ys(mm)      = ( surf_lsm_h%j(m) + 0.5_wp ) * dy
987             surfaces%zs(mm)      = zw(surf_lsm_h%k(m)+surf_lsm_h%koff)
988             surfaces%azimuth(mm) = surfaces%fillvalue
989             surfaces%zenith(mm)  = 0.0
990             i                    = i + 1
991             mm                   = mm + 1
992          ENDDO
993          DO  m = 1, surf_usm_h%ns
994             surfaces%s(mm)       = i
995             surfaces%xs(mm)      = ( surf_usm_h%i(m) + 0.5_wp ) * dx
996             surfaces%ys(mm)      = ( surf_usm_h%j(m) + 0.5_wp ) * dy
997             surfaces%zs(mm)      = zw(surf_usm_h%k(m)+surf_usm_h%koff)
998             surfaces%azimuth(mm) = surfaces%fillvalue
999             surfaces%zenith(mm)  = 0.0
1000             i                    = i + 1
1001             mm                   = mm + 1
1002          ENDDO
1003          DO  m = 1, surf_def_h(1)%ns
1004             surfaces%s(mm)       = i
1005             surfaces%xs(mm)      = ( surf_def_h(1)%i(m) + 0.5_wp ) * dx
1006             surfaces%ys(mm)      = ( surf_def_h(1)%j(m) + 0.5_wp ) * dy
1007             surfaces%zs(mm)      = zw(surf_def_h(1)%k(m)+surf_def_h(1)%koff)
1008             surfaces%azimuth(mm) = surfaces%fillvalue
1009             surfaces%zenith(mm)  = 180.0
1010             i                    = i + 1
1011             mm                   = mm + 1
1012          ENDDO
1013!       
1014!--       For vertical surfaces, zenith angles are not defined (fill value). 
1015!--       Azimuth angle: eastward (0), westward (180), northward (270),
1016!--       southward (90).
1017          DO  l = 0, 3
1018             IF ( l == 0 )  THEN
1019                az    = 270.0_wp
1020                off_x =   0.0_wp
1021                off_y = - 0.5_wp
1022             ELSEIF ( l == 1 )  THEN
1023                az    = 90.0_wp
1024                off_x =  0.0_wp
1025                off_y =  0.5_wp
1026             ELSEIF ( l == 2 )  THEN
1027                az    =   0.0_wp
1028                off_x = - 0.5_wp
1029                off_y =   0.0_wp
1030             ELSEIF ( l == 3 )  THEN
1031                az   = 180.0_wp
1032                off_x =  0.5_wp
1033                off_y =  0.0_wp
1034             ENDIF
1035               
1036             DO  m = 1, surf_def_v(l)%ns
1037                surfaces%s(mm)       = i
1038                surfaces%xs(mm)      = ( surf_def_v(l)%i(m) + off_x ) * dx
1039                surfaces%ys(mm)      = ( surf_def_v(l)%j(m) + off_y ) * dy
1040                surfaces%zs(mm)      = zu(surf_def_v(l)%k(m))
1041                surfaces%azimuth(mm) = az
1042                surfaces%zenith(mm)  = surfaces%fillvalue
1043                i                    = i + 1
1044                mm                   = mm + 1
1045             ENDDO
1046             DO  m = 1, surf_lsm_v(l)%ns
1047                surfaces%s(mm)       = i
1048                surfaces%xs(mm)      = ( surf_lsm_v(l)%i(m) + off_x ) * dx
1049                surfaces%ys(mm)      = ( surf_lsm_v(l)%j(m) + off_y ) * dy
1050                surfaces%zs(mm)      = zu(surf_lsm_v(l)%k(m))
1051                surfaces%azimuth(mm) = az
1052                surfaces%zenith(mm)  = surfaces%fillvalue
1053                i                    = i + 1
1054                mm                   = mm + 1
1055             ENDDO
1056             DO  m = 1, surf_usm_v(l)%ns
1057                surfaces%s(mm)       = i
1058                surfaces%xs(mm)      = ( surf_usm_v(l)%i(m) + off_x ) * dx
1059                surfaces%ys(mm)      = ( surf_usm_v(l)%j(m) + off_y ) * dy
1060                surfaces%zs(mm)      = zu(surf_usm_v(l)%k(m))
1061                surfaces%azimuth(mm) = az
1062                surfaces%zenith(mm)  = surfaces%fillvalue
1063                i                    = i + 1
1064                mm                   = mm + 1
1065             ENDDO
1066          ENDDO
1067!       
1068!--       Finally, define UTM coordinates, which are the x/y-coordinates
1069!--       plus the origin (lower-left coordinate of the model domain).
1070          surfaces%es_utm = surfaces%xs + init_model%origin_x 
1071          surfaces%ns_utm = surfaces%ys + init_model%origin_y 
1072!
1073!--       Initialize NetCDF data output. Please note, local start position for
1074!--       the surface elements in the NetCDF file is surfaces%s(1), while
1075!--       the number of surfaces on the subdomain is given by surfaces%ns.
1076#if defined( __netcdf4_parallel )
1077
1078!
1079!--       Calculate number of time steps to be output
1080          ntdim_surf(0) = dosurf_time_count(0) + CEILING(                            &
1081                        ( end_time - MAX(                                            &
1082                            MERGE(skip_time_dosurf, skip_time_dosurf + spinup_time,  &
1083                                  data_output_during_spinup ),                       &
1084                            simulated_time_at_begin )                                &
1085                        ) / dt_dosurf )
1086
1087          ntdim_surf(1) = dosurf_time_count(1) + CEILING(                      &
1088                        ( end_time - MAX(                                      &
1089                            MERGE(   skip_time_dosurf_av, skip_time_dosurf_av  &
1090                                  + spinup_time, data_output_during_spinup ),  &
1091                            simulated_time_at_begin )                          &
1092                        ) / dt_dosurf_av )
1093
1094!
1095!--       Create NetCDF4 files for parallel writing
1096          DO  av = 0, 1
1097!
1098!--          If there is no instantaneous data (av=0) or averaged data (av=1)
1099!--          requested, do not create the corresponding NetCDF file
1100             IF ( dosurf_no(av) == 0 ) CYCLE
1101
1102             IF ( av == 0 )  THEN
1103                filename = 'SURFACE_DATA_NETCDF' // TRIM( coupling_char )
1104             ELSE
1105                filename = 'SURFACE_DATA_AV_NETCDF' // TRIM( coupling_char )
1106             ENDIF
1107!
1108!--          Open file using netCDF4/HDF5 format, parallel
1109             nc_stat = NF90_CREATE( TRIM(filename),                            &
1110                                    IOR( NF90_NOCLOBBER,                       &
1111                                    IOR( NF90_NETCDF4, NF90_MPIIO ) ),         &
1112                                    id_set_surf(av), COMM = comm2d, INFO = MPI_INFO_NULL )
1113             CALL netcdf_handle_error( 'surface_data_output_mod', 5550 )
1114
1115             !- Write some global attributes
1116             IF ( av == 0 )  THEN
1117                CALL netcdf_create_global_atts( id_set_surf(av), 'surface-data', TRIM( run_description_header ), 5551 )
1118                time_average_text = ' '
1119             ELSE
1120                CALL netcdf_create_global_atts( id_set_surf(av), 'surface-data_av', TRIM( run_description_header ), 5552 )
1121                WRITE ( time_average_text,'(F7.1,'' s avg'')' )  averaging_interval_surf
1122                nc_stat = NF90_PUT_ATT( id_set_surf(av), NF90_GLOBAL, 'time_avg',  &
1123                                        TRIM( time_average_text ) )
1124                CALL netcdf_handle_error( 'surface_data_output_mod', 5553 )
1125             ENDIF
1126
1127
1128!
1129!--          Define time coordinate for surface data.
1130!--          For parallel output the time dimension has to be limited (ntdim_surf),
1131!--          otherwise the performance drops significantly.
1132             CALL netcdf_create_dim( id_set_surf(av), 'time', ntdim_surf(av),  &
1133                                     id_dim_time_surf(av), 5554 )
1134
1135             CALL netcdf_create_var( id_set_surf(av), (/ id_dim_time_surf(av) /),    &
1136                                     'time', NF90_DOUBLE, id_var_time_surf(av),      &
1137                                     'seconds since '//TRIM(init_model%origin_time), &
1138                                     'time', 5555, 5555, 5555 )
1139             CALL netcdf_create_att( id_set_surf(av), id_var_time_surf(av), 'standard_name', 'time', 5556)
1140             CALL netcdf_create_att( id_set_surf(av), id_var_time_surf(av), 'axis', 'T', 5557)
1141!
1142!--          Define spatial dimensions and coordinates:
1143!--          Define index of surface element
1144             CALL netcdf_create_dim( id_set_surf(av), 's', surfaces%ns_total,  &
1145                                     id_dim_s_surf(av), 5558 )
1146             CALL netcdf_create_var( id_set_surf(av), (/ id_dim_s_surf(av) /), &
1147                                     's', NF90_DOUBLE, id_var_s_surf(av),      &
1148                                     '1', '', 5559, 5559, 5559 )
1149!
1150!--          Define x coordinate
1151             CALL netcdf_create_var( id_set_surf(av), (/ id_dim_s_surf(av) /), &
1152                                     'xs', NF90_DOUBLE, id_var_xs_surf(av),    &
1153                                     'meters', '', 5561, 5561, 5561 )
1154!
1155!--           Define y coordinate
1156             CALL netcdf_create_var( id_set_surf(av), (/ id_dim_s_surf(av) /), &
1157                                     'ys', NF90_DOUBLE, id_var_ys_surf(av),    &
1158                                     'meters', '', 5562, 5562, 5562 )
1159!
1160!--          Define z coordinate
1161             CALL netcdf_create_var( id_set_surf(av), (/ id_dim_s_surf(av) /), &
1162                                     'zs', NF90_DOUBLE, id_var_zs_surf(av),    &
1163                                     'meters', '', 5560, 5560, 5560 )
1164
1165!
1166!--          Define UTM coordinates
1167             CALL netcdf_create_var( id_set_surf(av), (/ id_dim_s_surf(av) /),    &
1168                                     'Es_UTM', NF90_DOUBLE, id_var_etum_surf(av), &
1169                                     'meters', '', 5563, 5563, 5563 )
1170             CALL netcdf_create_var( id_set_surf(av), (/ id_dim_s_surf(av) /),    &
1171                                     'Ns_UTM', NF90_DOUBLE, id_var_nutm_surf(av), &
1172                                     'meters', '', 5564, 5564, 5564 )
1173!
1174!--          Define the variables
1175             var_list = ';'
1176             i = 1
1177
1178             DO WHILE ( dosurf(av,i)(1:1) /= ' ' )
1179
1180                CALL netcdf_create_var( id_set_surf(av),(/ id_dim_s_surf(av),  &
1181                                        id_dim_time_surf(av) /), dosurf(av,i), &
1182                                        NF90_REAL4, id_var_dosurf(av,i),       &
1183                                        dosurf_unit(av,i), dosurf(av,i), 5565, &
1184                                        5565, 5565, .TRUE. )
1185!
1186!--                Set no fill for every variable to increase performance.
1187                nc_stat = NF90_DEF_VAR_FILL( id_set_surf(av),     &
1188                                             id_var_dosurf(av,i), &
1189                                             1, 0 )
1190                CALL netcdf_handle_error( 'surface_data_output_init', 5566 )
1191!
1192!--                Set collective io operations for parallel io
1193                nc_stat = NF90_VAR_PAR_ACCESS( id_set_surf(av),     &
1194                                               id_var_dosurf(av,i), &
1195                                               NF90_COLLECTIVE )
1196                CALL netcdf_handle_error( 'surface_data_output_init', 5567 )
1197                var_list = TRIM( var_list ) // TRIM( dosurf(av,i) ) // ';'
1198
1199                i = i + 1
1200
1201             ENDDO
1202!
1203!--          Write the list of variables as global attribute (this is used by
1204!--          restart runs and by combine_plot_fields)
1205             nc_stat = NF90_PUT_ATT( id_set_surf(av), NF90_GLOBAL, 'VAR_LIST', &
1206                                     var_list )
1207             CALL netcdf_handle_error( 'surface_data_output_init', 5568 )
1208
1209!
1210!--          Set general no fill, otherwise the performance drops significantly for
1211!--          parallel output.
1212             nc_stat = NF90_SET_FILL( id_set_surf(av), NF90_NOFILL, oldmode )
1213             CALL netcdf_handle_error( 'surface_data_output_init', 5569 )
1214
1215!
1216!--          Leave netCDF define mode
1217             nc_stat = NF90_ENDDEF( id_set_surf(av) )
1218             CALL netcdf_handle_error( 'surface_data_output_init', 5570 )
1219
1220!
1221!--          These data are only written by PE0 for parallel output to increase
1222!--          the performance.
1223             IF ( myid == 0 )  THEN
1224!
1225!--             Write data for surface indices
1226                ALLOCATE( netcdf_data_1d(1:surfaces%ns_total) )
1227
1228                DO  i = 1, surfaces%ns_total
1229                   netcdf_data_1d(i) = i
1230                ENDDO
1231
1232                nc_stat = NF90_PUT_VAR( id_set_surf(av), id_var_s_surf(av),  &
1233                                        netcdf_data_1d, start = (/ 1 /),     &
1234                                        count = (/ surfaces%ns_total /) )
1235                CALL netcdf_handle_error( 'surface_data_output_init', 5571 )
1236
1237                DEALLOCATE( netcdf_data_1d )
1238
1239             ENDIF
1240
1241!
1242!--          Write surface positions to file
1243             nc_stat = NF90_PUT_VAR( id_set_surf(av), id_var_xs_surf(av),      &
1244                                     surfaces%xs, start = (/ surfaces%s(1) /), &
1245                                     count = (/ surfaces%ns /) )
1246             CALL netcdf_handle_error( 'surface_data_output_init', 5572 )
1247
1248             nc_stat = NF90_PUT_VAR( id_set_surf(av), id_var_ys_surf(av),      &
1249                                     surfaces%ys, start = (/ surfaces%s(1) /), &
1250                                     count = (/ surfaces%ns /) )
1251             CALL netcdf_handle_error( 'surface_data_output_init', 5573 )
1252
1253             nc_stat = NF90_PUT_VAR( id_set_surf(av), id_var_zs_surf(av),      &
1254                                     surfaces%zs, start = (/ surfaces%s(1) /), &
1255                                     count = (/ surfaces%ns /) )
1256             CALL netcdf_handle_error( 'surface_data_output_init', 5574 )
1257
1258             nc_stat = NF90_PUT_VAR( id_set_surf(av), id_var_etum_surf(av),        &
1259                                     surfaces%es_utm, start = (/ surfaces%s(1) /), &
1260                                     count = (/ surfaces%ns /) )
1261             CALL netcdf_handle_error( 'surface_data_output_init', 5575 )
1262
1263             nc_stat = NF90_PUT_VAR( id_set_surf(av), id_var_nutm_surf(av),        &
1264                                     surfaces%ns_utm, start = (/ surfaces%s(1) /), &
1265                                     count = (/ surfaces%ns /) )
1266             CALL netcdf_handle_error( 'surface_data_output_init', 5576 )
1267             
1268          ENDDO
1269#endif
1270
1271       ENDIF
1272
1273   END SUBROUTINE surface_data_output_init
1274   
1275!------------------------------------------------------------------------------!
1276! Description:
1277! ------------
1278!> Routine for controlling the data output. Surface data is collected from
1279!> different types of surfaces (default, natural, urban) and different
1280!> orientation and written to one 1D-output array. Further, NetCDF routines
1281!> are called to write the surface data in the respective NetCDF files.
1282!------------------------------------------------------------------------------!   
1283   SUBROUTINE surface_data_output( av )
1284   
1285      USE control_parameters,                                                  &
1286          ONLY:  io_blocks, io_group, time_since_reference_point
1287
1288      USE pegrid,                                                              &
1289          ONLY:  comm2d, ierr
1290
1291   
1292      IMPLICIT NONE
1293
1294      CHARACTER(LEN=100) ::  trimvar = ' ' !< dummy for single output variable
1295     
1296      INTEGER(iwp) ::  av     !< id indicating average or non-average data output
1297      INTEGER(iwp) ::  i      !< loop index
1298      INTEGER(iwp) ::  n_out  !< counter variables for surface output
1299
1300!
1301!--   Return, if nothing to output
1302      IF ( dosurf_no(av) == 0 )  RETURN
1303!
1304!--   In case of VTK output, check if binary files are open and write coordinates.
1305      IF ( to_vtk )  THEN
1306
1307         CALL check_open( 25+av )
1308
1309         IF ( .NOT. first_output(av) )  THEN
1310            DO  i = 0, io_blocks-1
1311               IF ( i == io_group )  THEN
1312                  WRITE ( 25+av )  surfaces%npoints
1313                  WRITE ( 25+av )  surfaces%npoints_total
1314                  WRITE ( 25+av )  surfaces%ns
1315                  WRITE ( 25+av )  surfaces%ns_total
1316                  WRITE ( 25+av )  surfaces%points
1317                  WRITE ( 25+av )  surfaces%polygons
1318               ENDIF
1319#if defined( __parallel )
1320               CALL MPI_BARRIER( comm2d, ierr )
1321#endif
1322               first_output(av) = .TRUE.
1323            ENDDO
1324         ENDIF
1325      ENDIF
1326!
1327!--   In case of NetCDF output, check if enough time steps are available in file
1328!--   and update time axis.
1329      IF ( to_netcdf )  THEN
1330#if defined( __netcdf4_parallel )
1331         IF ( dosurf_time_count(av) + 1 > ntdim_surf(av) )  THEN
1332            WRITE ( message_string, * ) 'Output of surface data is not given at t=',          &
1333                                        time_since_reference_point, 's because the maximum ', & 
1334                                        'number of output time levels is exceeded.'
1335            CALL message( 'surface_data_output', 'PA0???', 0, 1, 0, 6, 0 )
1336           
1337            RETURN
1338
1339         ENDIF
1340!
1341!--      Update the netCDF time axis
1342!--      In case of parallel output, this is only done by PE0 to increase the
1343!--      performance.
1344         dosurf_time_count(av) = dosurf_time_count(av) + 1
1345         IF ( myid == 0 )  THEN
1346            nc_stat = NF90_PUT_VAR( id_set_surf(av), id_var_time_surf(av),  &
1347                                    (/ time_since_reference_point /),       &
1348                                    start = (/ dosurf_time_count(av) /),    &
1349                                    count = (/ 1 /) )
1350            CALL netcdf_handle_error( 'surface_data_output', 6666 )
1351         ENDIF
1352#endif
1353      ENDIF
1354
1355!
1356!--   Cycle through output quantities and write them to file.
1357      n_out = 0
1358      DO  WHILE ( dosurf(av,n_out+1)(1:1) /= ' ' )
1359
1360         n_out   = n_out + 1
1361         trimvar = TRIM( dosurf(av,n_out) )
1362!
1363!--      Set the output array to the _FillValue in case it is not
1364!--      defined for each type of surface.
1365         surfaces%var_out = surfaces%fillvalue
1366         SELECT CASE ( trimvar )
1367
1368            CASE ( 'us' )
1369!
1370!--            Output of instantaneous data
1371               IF ( av == 0 )  THEN
1372                  CALL surface_data_output_collect( surf_def_h(0)%us,          &
1373                                               surf_def_h(1)%us,               &
1374                                               surf_lsm_h%us,                  &
1375                                               surf_usm_h%us,                  &
1376                                               surf_def_v(0)%us,               &
1377                                               surf_lsm_v(0)%us,               &
1378                                               surf_usm_v(0)%us,               &
1379                                               surf_def_v(1)%us,               &
1380                                               surf_lsm_v(1)%us,               &
1381                                               surf_usm_v(1)%us,               &
1382                                               surf_def_v(2)%us,               &
1383                                               surf_lsm_v(2)%us,               &
1384                                               surf_usm_v(2)%us,               &
1385                                               surf_def_v(3)%us,               &
1386                                               surf_lsm_v(3)%us,               &
1387                                               surf_usm_v(3)%us ) 
1388               ELSE
1389!
1390!--               Output of averaged data
1391                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1392                                        REAL( average_count_surf, KIND=wp )
1393                  surfaces%var_av(:,n_out) = 0.0_wp
1394                                                       
1395               ENDIF
1396
1397            CASE ( 'ts' )
1398!
1399!--            Output of instantaneous data
1400               IF ( av == 0 )  THEN
1401                  CALL surface_data_output_collect( surf_def_h(0)%ts,          &
1402                                               surf_def_h(1)%ts,               &
1403                                               surf_lsm_h%ts,                  &
1404                                               surf_usm_h%ts,                  &
1405                                               surf_def_v(0)%ts,               &
1406                                               surf_lsm_v(0)%ts,               &
1407                                               surf_usm_v(0)%ts,               &
1408                                               surf_def_v(1)%ts,               &
1409                                               surf_lsm_v(1)%ts,               &
1410                                               surf_usm_v(1)%ts,               &
1411                                               surf_def_v(2)%ts,               &
1412                                               surf_lsm_v(2)%ts,               &
1413                                               surf_usm_v(2)%ts,               &
1414                                               surf_def_v(3)%ts,               &
1415                                               surf_lsm_v(3)%ts,               &
1416                                               surf_usm_v(3)%ts ) 
1417               ELSE
1418!
1419!--               Output of averaged data
1420                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1421                                        REAL( average_count_surf, KIND=wp )
1422                  surfaces%var_av(:,n_out) = 0.0_wp
1423                                                       
1424               ENDIF
1425
1426            CASE ( 'qs' )
1427!
1428!--            Output of instantaneous data
1429               IF ( av == 0 )  THEN
1430                  CALL surface_data_output_collect( surf_def_h(0)%qs,          &
1431                                               surf_def_h(1)%qs,               &
1432                                               surf_lsm_h%qs,                  &
1433                                               surf_usm_h%qs,                  &
1434                                               surf_def_v(0)%qs,               &
1435                                               surf_lsm_v(0)%qs,               &
1436                                               surf_usm_v(0)%qs,               &
1437                                               surf_def_v(1)%qs,               &
1438                                               surf_lsm_v(1)%qs,               &
1439                                               surf_usm_v(1)%qs,               &
1440                                               surf_def_v(2)%qs,               &
1441                                               surf_lsm_v(2)%qs,               &
1442                                               surf_usm_v(2)%qs,               &
1443                                               surf_def_v(3)%qs,               &
1444                                               surf_lsm_v(3)%qs,               &
1445                                               surf_usm_v(3)%qs ) 
1446               ELSE
1447!
1448!--               Output of averaged data
1449                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1450                                        REAL( average_count_surf, KIND=wp )
1451                  surfaces%var_av(:,n_out) = 0.0_wp
1452                                                       
1453               ENDIF
1454
1455            CASE ( 'ss' )
1456!
1457!--            Output of instantaneous data
1458               IF ( av == 0 )  THEN
1459                  CALL surface_data_output_collect( surf_def_h(0)%ss,          &
1460                                               surf_def_h(1)%ss,               &
1461                                               surf_lsm_h%ss,                  &
1462                                               surf_usm_h%ss,                  &
1463                                               surf_def_v(0)%ss,               &
1464                                               surf_lsm_v(0)%ss,               &
1465                                               surf_usm_v(0)%ss,               &
1466                                               surf_def_v(1)%ss,               &
1467                                               surf_lsm_v(1)%ss,               &
1468                                               surf_usm_v(1)%ss,               &
1469                                               surf_def_v(2)%ss,               &
1470                                               surf_lsm_v(2)%ss,               &
1471                                               surf_usm_v(2)%ss,               &
1472                                               surf_def_v(3)%ss,               &
1473                                               surf_lsm_v(3)%ss,               &
1474                                               surf_usm_v(3)%ss ) 
1475               ELSE
1476!
1477!--               Output of averaged data
1478                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1479                                        REAL( average_count_surf, KIND=wp )
1480                  surfaces%var_av(:,n_out) = 0.0_wp
1481                                                       
1482               ENDIF
1483
1484            CASE ( 'qcs' )
1485!
1486!--            Output of instantaneous data
1487               IF ( av == 0 )  THEN
1488                  CALL surface_data_output_collect( surf_def_h(0)%qcs,         &
1489                                               surf_def_h(1)%qcs,              &
1490                                               surf_lsm_h%qcs,                 &
1491                                               surf_usm_h%qcs,                 &
1492                                               surf_def_v(0)%qcs,              &
1493                                               surf_lsm_v(0)%qcs,              &
1494                                               surf_usm_v(0)%qcs,              &
1495                                               surf_def_v(1)%qcs,              &
1496                                               surf_lsm_v(1)%qcs,              &
1497                                               surf_usm_v(1)%qcs,              &
1498                                               surf_def_v(2)%qcs,              &
1499                                               surf_lsm_v(2)%qcs,              &
1500                                               surf_usm_v(2)%qcs,              &
1501                                               surf_def_v(3)%qcs,              &
1502                                               surf_lsm_v(3)%qcs,              &
1503                                               surf_usm_v(3)%qcs ) 
1504               ELSE
1505!
1506!--               Output of averaged data
1507                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1508                                        REAL( average_count_surf, KIND=wp )
1509                  surfaces%var_av(:,n_out) = 0.0_wp
1510                                                       
1511               ENDIF
1512
1513            CASE ( 'ncs' )
1514!
1515!--            Output of instantaneous data
1516               IF ( av == 0 )  THEN
1517                  CALL surface_data_output_collect( surf_def_h(0)%ncs,         &
1518                                               surf_def_h(1)%ncs,              &
1519                                               surf_lsm_h%ncs,                 &
1520                                               surf_usm_h%ncs,                 &
1521                                               surf_def_v(0)%ncs,              &
1522                                               surf_lsm_v(0)%ncs,              &
1523                                               surf_usm_v(0)%ncs,              &
1524                                               surf_def_v(1)%ncs,              &
1525                                               surf_lsm_v(1)%ncs,              &
1526                                               surf_usm_v(1)%ncs,              &
1527                                               surf_def_v(2)%ncs,              &
1528                                               surf_lsm_v(2)%ncs,              &
1529                                               surf_usm_v(2)%ncs,              &
1530                                               surf_def_v(3)%ncs,              &
1531                                               surf_lsm_v(3)%ncs,              &
1532                                               surf_usm_v(3)%ncs ) 
1533               ELSE
1534!
1535!--               Output of averaged data
1536                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1537                                        REAL( average_count_surf, KIND=wp )
1538                  surfaces%var_av(:,n_out) = 0.0_wp
1539                                                       
1540               ENDIF
1541
1542            CASE ( 'qrs' )
1543!
1544!--            Output of instantaneous data
1545               IF ( av == 0 )  THEN
1546                  CALL surface_data_output_collect( surf_def_h(0)%qrs,         &
1547                                               surf_def_h(1)%qrs,              &
1548                                               surf_lsm_h%qrs,                 &
1549                                               surf_usm_h%qrs,                 &
1550                                               surf_def_v(0)%qrs,              &
1551                                               surf_lsm_v(0)%qrs,              &
1552                                               surf_usm_v(0)%qrs,              &
1553                                               surf_def_v(1)%qrs,              &
1554                                               surf_lsm_v(1)%qrs,              &
1555                                               surf_usm_v(1)%qrs,              &
1556                                               surf_def_v(2)%qrs,              &
1557                                               surf_lsm_v(2)%qrs,              &
1558                                               surf_usm_v(2)%qrs,              &
1559                                               surf_def_v(3)%qrs,              &
1560                                               surf_lsm_v(3)%qrs,              &
1561                                               surf_usm_v(3)%qrs ) 
1562               ELSE
1563!
1564!--               Output of averaged data
1565                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1566                                        REAL( average_count_surf, KIND=wp )
1567                  surfaces%var_av(:,n_out) = 0.0_wp
1568                                                       
1569               ENDIF
1570
1571            CASE ( 'nrs' )
1572!
1573!--            Output of instantaneous data
1574               IF ( av == 0 )  THEN
1575                  CALL surface_data_output_collect( surf_def_h(0)%nrs,         &
1576                                               surf_def_h(1)%nrs,              &
1577                                               surf_lsm_h%nrs,                 &
1578                                               surf_usm_h%nrs,                 &
1579                                               surf_def_v(0)%nrs,              &
1580                                               surf_lsm_v(0)%nrs,              &
1581                                               surf_usm_v(0)%nrs,              &
1582                                               surf_def_v(1)%nrs,              &
1583                                               surf_lsm_v(1)%nrs,              &
1584                                               surf_usm_v(1)%nrs,              &
1585                                               surf_def_v(2)%nrs,              &
1586                                               surf_lsm_v(2)%nrs,              &
1587                                               surf_usm_v(2)%nrs,              &
1588                                               surf_def_v(3)%nrs,              &
1589                                               surf_lsm_v(3)%nrs,              &
1590                                               surf_usm_v(3)%nrs ) 
1591               ELSE
1592!
1593!--               Output of averaged data
1594                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1595                                        REAL( average_count_surf, KIND=wp )
1596                  surfaces%var_av(:,n_out) = 0.0_wp
1597                                                       
1598               ENDIF
1599
1600            CASE ( 'ol' )
1601!
1602!--            Output of instantaneous data
1603               IF ( av == 0 )  THEN
1604                  CALL surface_data_output_collect( surf_def_h(0)%ol,          &
1605                                               surf_def_h(1)%ol,               &
1606                                               surf_lsm_h%ol,                  &
1607                                               surf_usm_h%ol,                  &
1608                                               surf_def_v(0)%ol,               &
1609                                               surf_lsm_v(0)%ol,               &
1610                                               surf_usm_v(0)%ol,               &
1611                                               surf_def_v(1)%ol,               &
1612                                               surf_lsm_v(1)%ol,               &
1613                                               surf_usm_v(1)%ol,               &
1614                                               surf_def_v(2)%ol,               &
1615                                               surf_lsm_v(2)%ol,               &
1616                                               surf_usm_v(2)%ol,               &
1617                                               surf_def_v(3)%ol,               &
1618                                               surf_lsm_v(3)%ol,               &
1619                                               surf_usm_v(3)%ol ) 
1620               ELSE
1621!
1622!--               Output of averaged data
1623                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1624                                        REAL( average_count_surf, KIND=wp )
1625                  surfaces%var_av(:,n_out) = 0.0_wp
1626                                                       
1627               ENDIF
1628
1629            CASE ( 'z0' )
1630!
1631!--            Output of instantaneous data
1632               IF ( av == 0 )  THEN
1633                  CALL surface_data_output_collect( surf_def_h(0)%z0,          &
1634                                               surf_def_h(1)%z0,               &
1635                                               surf_lsm_h%z0,                  &
1636                                               surf_usm_h%z0,                  &
1637                                               surf_def_v(0)%z0,               &
1638                                               surf_lsm_v(0)%z0,               &
1639                                               surf_usm_v(0)%z0,               &
1640                                               surf_def_v(1)%z0,               &
1641                                               surf_lsm_v(1)%z0,               &
1642                                               surf_usm_v(1)%z0,               &
1643                                               surf_def_v(2)%z0,               &
1644                                               surf_lsm_v(2)%z0,               &
1645                                               surf_usm_v(2)%z0,               &
1646                                               surf_def_v(3)%z0,               &
1647                                               surf_lsm_v(3)%z0,               &
1648                                               surf_usm_v(3)%z0 )
1649               ELSE
1650!
1651!--               Output of averaged data
1652                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1653                                        REAL( average_count_surf, KIND=wp )
1654                  surfaces%var_av(:,n_out) = 0.0_wp
1655                                                       
1656               ENDIF
1657
1658            CASE ( 'z0h' )
1659!
1660!--            Output of instantaneous data
1661               IF ( av == 0 )  THEN
1662                  CALL surface_data_output_collect( surf_def_h(0)%z0h,         &
1663                                               surf_def_h(1)%z0h,              &
1664                                               surf_lsm_h%z0h,                 &
1665                                               surf_usm_h%z0h,                 &
1666                                               surf_def_v(0)%z0h,              &
1667                                               surf_lsm_v(0)%z0h,              &
1668                                               surf_usm_v(0)%z0h,              &
1669                                               surf_def_v(1)%z0h,              &
1670                                               surf_lsm_v(1)%z0h,              &
1671                                               surf_usm_v(1)%z0h,              &
1672                                               surf_def_v(2)%z0h,              &
1673                                               surf_lsm_v(2)%z0h,              &
1674                                               surf_usm_v(2)%z0h,              &
1675                                               surf_def_v(3)%z0h,              &
1676                                               surf_lsm_v(3)%z0h,              &
1677                                               surf_usm_v(3)%z0h )
1678               ELSE
1679!
1680!--               Output of averaged data
1681                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1682                                        REAL( average_count_surf, KIND=wp )
1683                  surfaces%var_av(:,n_out) = 0.0_wp
1684                                                       
1685               ENDIF
1686
1687            CASE ( 'z0q' )
1688!
1689!--            Output of instantaneous data
1690               IF ( av == 0 )  THEN
1691                  CALL surface_data_output_collect( surf_def_h(0)%z0q,         &
1692                                               surf_def_h(1)%z0q,              &
1693                                               surf_lsm_h%z0q,                 &
1694                                               surf_usm_h%z0q,                 &
1695                                               surf_def_v(0)%z0q,              &
1696                                               surf_lsm_v(0)%z0q,              &
1697                                               surf_usm_v(0)%z0q,              &
1698                                               surf_def_v(1)%z0q,              &
1699                                               surf_lsm_v(1)%z0q,              &
1700                                               surf_usm_v(1)%z0q,              &
1701                                               surf_def_v(2)%z0q,              &
1702                                               surf_lsm_v(2)%z0q,              &
1703                                               surf_usm_v(2)%z0q,              &
1704                                               surf_def_v(3)%z0q,              &
1705                                               surf_lsm_v(3)%z0q,              &
1706                                               surf_usm_v(3)%z0q ) 
1707               ELSE
1708!
1709!--               Output of averaged data
1710                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1711                                        REAL( average_count_surf, KIND=wp )
1712                  surfaces%var_av(:,n_out) = 0.0_wp
1713
1714               ENDIF
1715
1716            CASE ( 'theta1' )
1717!
1718!--            Output of instantaneous data
1719               IF ( av == 0 )  THEN
1720                  CALL surface_data_output_collect( surf_def_h(0)%pt1,         &
1721                                               surf_def_h(1)%pt1,              &
1722                                               surf_lsm_h%pt1,                 &
1723                                               surf_usm_h%pt1,                 &
1724                                               surf_def_v(0)%pt1,              &
1725                                               surf_lsm_v(0)%pt1,              &
1726                                               surf_usm_v(0)%pt1,              &
1727                                               surf_def_v(1)%pt1,              &
1728                                               surf_lsm_v(1)%pt1,              &
1729                                               surf_usm_v(1)%pt1,              &
1730                                               surf_def_v(2)%pt1,              &
1731                                               surf_lsm_v(2)%pt1,              &
1732                                               surf_usm_v(2)%pt1,              &
1733                                               surf_def_v(3)%pt1,              &
1734                                               surf_lsm_v(3)%pt1,              &
1735                                               surf_usm_v(3)%pt1 )
1736               ELSE
1737!
1738!--               Output of averaged data
1739                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1740                                        REAL( average_count_surf, KIND=wp )
1741                  surfaces%var_av(:,n_out) = 0.0_wp
1742                                                       
1743               ENDIF
1744
1745            CASE ( 'qv1' )
1746!
1747!--            Output of instantaneous data
1748               IF ( av == 0 )  THEN
1749                  CALL surface_data_output_collect( surf_def_h(0)%qv1,         &
1750                                               surf_def_h(1)%qv1,              &
1751                                               surf_lsm_h%qv1,                 &
1752                                               surf_usm_h%qv1,                 &
1753                                               surf_def_v(0)%qv1,              &
1754                                               surf_lsm_v(0)%qv1,              &
1755                                               surf_usm_v(0)%qv1,              &
1756                                               surf_def_v(1)%qv1,              &
1757                                               surf_lsm_v(1)%qv1,              &
1758                                               surf_usm_v(1)%qv1,              &
1759                                               surf_def_v(2)%qv1,              &
1760                                               surf_lsm_v(2)%qv1,              &
1761                                               surf_usm_v(2)%qv1,              &
1762                                               surf_def_v(3)%qv1,              &
1763                                               surf_lsm_v(3)%qv1,              &
1764                                               surf_usm_v(3)%qv1 )
1765               ELSE
1766!
1767!--               Output of averaged data
1768                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1769                                        REAL( average_count_surf, KIND=wp )
1770                  surfaces%var_av(:,n_out) = 0.0_wp
1771                                                       
1772               ENDIF
1773
1774            CASE ( 'thetav1' )
1775!
1776!--            Output of instantaneous data
1777               IF ( av == 0 )  THEN
1778                  CALL surface_data_output_collect( surf_def_h(0)%vpt1,        &
1779                                               surf_def_h(1)%vpt1,             &
1780                                               surf_lsm_h%vpt1,                &
1781                                               surf_usm_h%vpt1,                &
1782                                               surf_def_v(0)%vpt1,             &
1783                                               surf_lsm_v(0)%vpt1,             &
1784                                               surf_usm_v(0)%vpt1,             &
1785                                               surf_def_v(1)%vpt1,             &
1786                                               surf_lsm_v(1)%vpt1,             &
1787                                               surf_usm_v(1)%vpt1,             &
1788                                               surf_def_v(2)%vpt1,             &
1789                                               surf_lsm_v(2)%vpt1,             &
1790                                               surf_usm_v(2)%vpt1,             &
1791                                               surf_def_v(3)%vpt1,             &
1792                                               surf_lsm_v(3)%vpt1,             &
1793                                               surf_usm_v(3)%vpt1 )
1794               ELSE
1795!
1796!--               Output of averaged data
1797                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1798                                        REAL( average_count_surf, KIND=wp )
1799                  surfaces%var_av(:,n_out) = 0.0_wp
1800                                                       
1801               ENDIF
1802
1803            CASE ( 'usws' )
1804!
1805!--            Output of instantaneous data
1806               IF ( av == 0 )  THEN
1807                  CALL surface_data_output_collect( surf_def_h(0)%usws,        &
1808                                               surf_def_h(1)%usws,             &
1809                                               surf_lsm_h%usws,                &
1810                                               surf_usm_h%usws,                &
1811                                               surf_def_v(0)%usws,             &
1812                                               surf_lsm_v(0)%usws,             &
1813                                               surf_usm_v(0)%usws,             &
1814                                               surf_def_v(1)%usws,             &
1815                                               surf_lsm_v(1)%usws,             &
1816                                               surf_usm_v(1)%usws,             &
1817                                               surf_def_v(2)%usws,             &
1818                                               surf_lsm_v(2)%usws,             &
1819                                               surf_usm_v(2)%usws,             &
1820                                               surf_def_v(3)%usws,             &
1821                                               surf_lsm_v(3)%usws,             &
1822                                               surf_usm_v(3)%usws )
1823               ELSE
1824!
1825!--               Output of averaged data
1826                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1827                                        REAL( average_count_surf, KIND=wp )
1828                  surfaces%var_av(:,n_out) = 0.0_wp
1829                                                       
1830               ENDIF
1831
1832            CASE ( 'vsws' )
1833!
1834!--            Output of instantaneous data
1835               IF ( av == 0 )  THEN
1836                  CALL surface_data_output_collect( surf_def_h(0)%vsws,        &
1837                                               surf_def_h(1)%vsws,             &
1838                                               surf_lsm_h%vsws,                &
1839                                               surf_usm_h%vsws,                &
1840                                               surf_def_v(0)%vsws,             &
1841                                               surf_lsm_v(0)%vsws,             &
1842                                               surf_usm_v(0)%vsws,             &
1843                                               surf_def_v(1)%vsws,             &
1844                                               surf_lsm_v(1)%vsws,             &
1845                                               surf_usm_v(1)%vsws,             &
1846                                               surf_def_v(2)%vsws,             &
1847                                               surf_lsm_v(2)%vsws,             &
1848                                               surf_usm_v(2)%vsws,             &
1849                                               surf_def_v(3)%vsws,             &
1850                                               surf_lsm_v(3)%vsws,             &
1851                                               surf_usm_v(3)%vsws )
1852               ELSE
1853!
1854!--               Output of averaged data
1855                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1856                                        REAL( average_count_surf, KIND=wp )
1857                  surfaces%var_av(:,n_out) = 0.0_wp
1858                                                       
1859               ENDIF
1860
1861            CASE ( 'shf' )
1862!
1863!--            Output of instantaneous data
1864               IF ( av == 0 )  THEN
1865                  CALL surface_data_output_collect( surf_def_h(0)%shf,         &
1866                                               surf_def_h(1)%shf,              &
1867                                               surf_lsm_h%shf,                 &
1868                                               surf_usm_h%shf,                 &
1869                                               surf_def_v(0)%shf,              &
1870                                               surf_lsm_v(0)%shf,              &
1871                                               surf_usm_v(0)%shf,              &
1872                                               surf_def_v(1)%shf,              &
1873                                               surf_lsm_v(1)%shf,              &
1874                                               surf_usm_v(1)%shf,              &
1875                                               surf_def_v(2)%shf,              &
1876                                               surf_lsm_v(2)%shf,              &
1877                                               surf_usm_v(2)%shf,              &
1878                                               surf_def_v(3)%shf,              &
1879                                               surf_lsm_v(3)%shf,              &
1880                                               surf_usm_v(3)%shf )
1881               ELSE
1882!
1883!--               Output of averaged data
1884                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1885                                        REAL( average_count_surf, KIND=wp )
1886                  surfaces%var_av(:,n_out) = 0.0_wp
1887               ENDIF
1888
1889            CASE ( 'qsws' )
1890!
1891!--            Output of instantaneous data
1892               IF ( av == 0 )  THEN
1893                  CALL surface_data_output_collect( surf_def_h(0)%qsws,        &
1894                                               surf_def_h(1)%qsws,             &
1895                                               surf_lsm_h%qsws,                &
1896                                               surf_usm_h%qsws,                &
1897                                               surf_def_v(0)%qsws,             &
1898                                               surf_lsm_v(0)%qsws,             &
1899                                               surf_usm_v(0)%qsws,             &
1900                                               surf_def_v(1)%qsws,             &
1901                                               surf_lsm_v(1)%qsws,             &
1902                                               surf_usm_v(1)%qsws,             &
1903                                               surf_def_v(2)%qsws,             &
1904                                               surf_lsm_v(2)%qsws,             &
1905                                               surf_usm_v(2)%qsws,             &
1906                                               surf_def_v(3)%qsws,             &
1907                                               surf_lsm_v(3)%qsws,             &
1908                                               surf_usm_v(3)%qsws )
1909               ELSE
1910!
1911!--               Output of averaged data
1912                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1913                                        REAL( average_count_surf, KIND=wp )
1914                  surfaces%var_av(:,n_out) = 0.0_wp
1915                                                       
1916               ENDIF
1917
1918            CASE ( 'ssws' )
1919!
1920!--            Output of instantaneous data
1921               IF ( av == 0 )  THEN
1922                  CALL surface_data_output_collect( surf_def_h(0)%ssws,        &
1923                                               surf_def_h(1)%ssws,             &
1924                                               surf_lsm_h%ssws,                &
1925                                               surf_usm_h%ssws,                &
1926                                               surf_def_v(0)%ssws,             &
1927                                               surf_lsm_v(0)%ssws,             &
1928                                               surf_usm_v(0)%ssws,             &
1929                                               surf_def_v(1)%ssws,             &
1930                                               surf_lsm_v(1)%ssws,             &
1931                                               surf_usm_v(1)%ssws,             &
1932                                               surf_def_v(2)%ssws,             &
1933                                               surf_lsm_v(2)%ssws,             &
1934                                               surf_usm_v(2)%ssws,             &
1935                                               surf_def_v(3)%ssws,             &
1936                                               surf_lsm_v(3)%ssws,             &
1937                                               surf_usm_v(3)%ssws )
1938               ELSE
1939!
1940!--               Output of averaged data
1941                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1942                                        REAL( average_count_surf, KIND=wp )
1943                  surfaces%var_av(:,n_out) = 0.0_wp
1944                                                       
1945               ENDIF
1946
1947            CASE ( 'qcsws' )
1948!
1949!--            Output of instantaneous data
1950               IF ( av == 0 )  THEN
1951                  CALL surface_data_output_collect( surf_def_h(0)%qcsws,       &
1952                                               surf_def_h(1)%qcsws,            &
1953                                               surf_lsm_h%qcsws,               &
1954                                               surf_usm_h%qcsws,               &
1955                                               surf_def_v(0)%qcsws,            &
1956                                               surf_lsm_v(0)%qcsws,            &
1957                                               surf_usm_v(0)%qcsws,            &
1958                                               surf_def_v(1)%qcsws,            &
1959                                               surf_lsm_v(1)%qcsws,            &
1960                                               surf_usm_v(1)%qcsws,            &
1961                                               surf_def_v(2)%qcsws,            &
1962                                               surf_lsm_v(2)%qcsws,            &
1963                                               surf_usm_v(2)%qcsws,            &
1964                                               surf_def_v(3)%qcsws,            &
1965                                               surf_lsm_v(3)%qcsws,            &
1966                                               surf_usm_v(3)%qcsws )
1967               ELSE
1968!
1969!--               Output of averaged data
1970                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1971                                        REAL( average_count_surf, KIND=wp )
1972                  surfaces%var_av(:,n_out) = 0.0_wp
1973                                                       
1974               ENDIF
1975
1976            CASE ( 'ncsws' )
1977!
1978!--            Output of instantaneous data
1979               IF ( av == 0 )  THEN
1980                  CALL surface_data_output_collect( surf_def_h(0)%ncsws,       &
1981                                               surf_def_h(1)%ncsws,            &
1982                                               surf_lsm_h%ncsws,               &
1983                                               surf_usm_h%ncsws,               &
1984                                               surf_def_v(0)%ncsws,            &
1985                                               surf_lsm_v(0)%ncsws,            &
1986                                               surf_usm_v(0)%ncsws,            &
1987                                               surf_def_v(1)%ncsws,            &
1988                                               surf_lsm_v(1)%ncsws,            &
1989                                               surf_usm_v(1)%ncsws,            &
1990                                               surf_def_v(2)%ncsws,            &
1991                                               surf_lsm_v(2)%ncsws,            &
1992                                               surf_usm_v(2)%ncsws,            &
1993                                               surf_def_v(3)%ncsws,            &
1994                                               surf_lsm_v(3)%ncsws,            &
1995                                               surf_usm_v(3)%ncsws )
1996               ELSE
1997!
1998!--               Output of averaged data
1999                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2000                                        REAL( average_count_surf, KIND=wp )
2001                  surfaces%var_av(:,n_out) = 0.0_wp
2002                                                       
2003               ENDIF
2004
2005            CASE ( 'qrsws' )
2006!
2007!--            Output of instantaneous data
2008               IF ( av == 0 )  THEN
2009                  CALL surface_data_output_collect( surf_def_h(0)%qrsws,       &
2010                                               surf_def_h(1)%qrsws,            &
2011                                               surf_lsm_h%qrsws,               &
2012                                               surf_usm_h%qrsws,               &
2013                                               surf_def_v(0)%qrsws,            &
2014                                               surf_lsm_v(0)%qrsws,            &
2015                                               surf_usm_v(0)%qrsws,            &
2016                                               surf_def_v(1)%qrsws,            &
2017                                               surf_lsm_v(1)%qrsws,            &
2018                                               surf_usm_v(1)%qrsws,            &
2019                                               surf_def_v(2)%qrsws,            &
2020                                               surf_lsm_v(2)%qrsws,            &
2021                                               surf_usm_v(2)%qrsws,            &
2022                                               surf_def_v(3)%qrsws,            &
2023                                               surf_lsm_v(3)%qrsws,            &
2024                                               surf_usm_v(3)%qrsws )
2025               ELSE
2026!
2027!--               Output of averaged data
2028                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2029                                        REAL( average_count_surf, KIND=wp )
2030                  surfaces%var_av(:,n_out) = 0.0_wp
2031                                                       
2032               ENDIF
2033
2034            CASE ( 'nrsws' )
2035!
2036!--            Output of instantaneous data
2037               IF ( av == 0 )  THEN
2038                  CALL surface_data_output_collect( surf_def_h(0)%nrsws,       &
2039                                               surf_def_h(1)%nrsws,            &
2040                                               surf_lsm_h%nrsws,               &
2041                                               surf_usm_h%nrsws,               &
2042                                               surf_def_v(0)%nrsws,            &
2043                                               surf_lsm_v(0)%nrsws,            &
2044                                               surf_usm_v(0)%nrsws,            &
2045                                               surf_def_v(1)%nrsws,            &
2046                                               surf_lsm_v(1)%nrsws,            &
2047                                               surf_usm_v(1)%nrsws,            &
2048                                               surf_def_v(2)%nrsws,            &
2049                                               surf_lsm_v(2)%nrsws,            &
2050                                               surf_usm_v(2)%nrsws,            &
2051                                               surf_def_v(3)%nrsws,            &
2052                                               surf_lsm_v(3)%nrsws,            &
2053                                               surf_usm_v(3)%nrsws )
2054               ELSE
2055!
2056!--               Output of averaged data
2057                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2058                                        REAL( average_count_surf, KIND=wp )
2059                  surfaces%var_av(:,n_out) = 0.0_wp
2060                                                       
2061               ENDIF
2062
2063            CASE ( 'sasws' )
2064!
2065!--            Output of instantaneous data
2066               IF ( av == 0 )  THEN
2067                  CALL surface_data_output_collect( surf_def_h(0)%sasws,       &
2068                                               surf_def_h(1)%sasws,            &
2069                                               surf_lsm_h%sasws,               &
2070                                               surf_usm_h%sasws,               &
2071                                               surf_def_v(0)%sasws,            &
2072                                               surf_lsm_v(0)%sasws,            &
2073                                               surf_usm_v(0)%sasws,            &
2074                                               surf_def_v(1)%sasws,            &
2075                                               surf_lsm_v(1)%sasws,            &
2076                                               surf_usm_v(1)%sasws,            &
2077                                               surf_def_v(2)%sasws,            &
2078                                               surf_lsm_v(2)%sasws,            &
2079                                               surf_usm_v(2)%sasws,            &
2080                                               surf_def_v(3)%sasws,            &
2081                                               surf_lsm_v(3)%sasws,            &
2082                                               surf_usm_v(3)%sasws )
2083               ELSE
2084!
2085!--               Output of averaged data
2086                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2087                                        REAL( average_count_surf, KIND=wp )
2088                  surfaces%var_av(:,n_out) = 0.0_wp
2089                                                       
2090               ENDIF
2091
2092            CASE ( 'q_surface' )
2093!
2094!--            Output of instantaneous data
2095               IF ( av == 0 )  THEN
2096                  CALL surface_data_output_collect( surf_def_h(0)%q_surface,   &
2097                                               surf_def_h(1)%q_surface,        &
2098                                               surf_lsm_h%q_surface,           &
2099                                               surf_usm_h%q_surface,           &
2100                                               surf_def_v(0)%q_surface,        &
2101                                               surf_lsm_v(0)%q_surface,        &
2102                                               surf_usm_v(0)%q_surface,        &
2103                                               surf_def_v(1)%q_surface,        &
2104                                               surf_lsm_v(1)%q_surface,        &
2105                                               surf_usm_v(1)%q_surface,        &
2106                                               surf_def_v(2)%q_surface,        &
2107                                               surf_lsm_v(2)%q_surface,        &
2108                                               surf_usm_v(2)%q_surface,        &
2109                                               surf_def_v(3)%q_surface,        &
2110                                               surf_lsm_v(3)%q_surface,        &
2111                                               surf_usm_v(3)%q_surface )
2112               ELSE
2113!
2114!--               Output of averaged data
2115                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2116                                        REAL( average_count_surf, KIND=wp )
2117                  surfaces%var_av(:,n_out) = 0.0_wp
2118                                                       
2119               ENDIF
2120
2121            CASE ( 'theta_surface' )
2122!
2123!--            Output of instantaneous data
2124               IF ( av == 0 )  THEN
2125                  CALL surface_data_output_collect( surf_def_h(0)%pt_surface,  &
2126                                               surf_def_h(1)%pt_surface,       &
2127                                               surf_lsm_h%pt_surface,          &
2128                                               surf_usm_h%pt_surface,          &
2129                                               surf_def_v(0)%pt_surface,       &
2130                                               surf_lsm_v(0)%pt_surface,       &
2131                                               surf_usm_v(0)%pt_surface,       &
2132                                               surf_def_v(1)%pt_surface,       &
2133                                               surf_lsm_v(1)%pt_surface,       &
2134                                               surf_usm_v(1)%pt_surface,       &
2135                                               surf_def_v(2)%pt_surface,       &
2136                                               surf_lsm_v(2)%pt_surface,       &
2137                                               surf_usm_v(2)%pt_surface,       &
2138                                               surf_def_v(3)%pt_surface,       &
2139                                               surf_lsm_v(3)%pt_surface,       &
2140                                               surf_usm_v(3)%pt_surface )
2141               ELSE
2142!
2143!--               Output of averaged data
2144                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2145                                        REAL( average_count_surf, KIND=wp )
2146                  surfaces%var_av(:,n_out) = 0.0_wp
2147                                                       
2148               ENDIF
2149
2150            CASE ( 'thetav_surface' )
2151!
2152!--            Output of instantaneous data
2153               IF ( av == 0 )  THEN
2154                  CALL surface_data_output_collect( surf_def_h(0)%vpt_surface, &
2155                                               surf_def_h(1)%vpt_surface,      &
2156                                               surf_lsm_h%vpt_surface,         &
2157                                               surf_usm_h%vpt_surface,         &
2158                                               surf_def_v(0)%vpt_surface,      &
2159                                               surf_lsm_v(0)%vpt_surface,      &
2160                                               surf_usm_v(0)%vpt_surface,      &
2161                                               surf_def_v(1)%vpt_surface,      &
2162                                               surf_lsm_v(1)%vpt_surface,      &
2163                                               surf_usm_v(1)%vpt_surface,      &
2164                                               surf_def_v(2)%vpt_surface,      &
2165                                               surf_lsm_v(2)%vpt_surface,      &
2166                                               surf_usm_v(2)%vpt_surface,      &
2167                                               surf_def_v(3)%vpt_surface,      &
2168                                               surf_lsm_v(3)%vpt_surface,      &
2169                                               surf_usm_v(3)%vpt_surface)
2170               ELSE
2171!
2172!--               Output of averaged data
2173                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2174                                        REAL( average_count_surf, KIND=wp )
2175                  surfaces%var_av(:,n_out) = 0.0_wp
2176                                                       
2177               ENDIF
2178
2179            CASE ( 'rad_net' )
2180!
2181!--            Output of instantaneous data
2182               IF ( av == 0 )  THEN
2183                  CALL surface_data_output_collect( surf_def_h(0)%rad_net,     &
2184                                               surf_def_h(1)%rad_net,          &
2185                                               surf_lsm_h%rad_net,             &
2186                                               surf_usm_h%rad_net,             &
2187                                               surf_def_v(0)%rad_net,          &
2188                                               surf_lsm_v(0)%rad_net,          &
2189                                               surf_usm_v(0)%rad_net,          &
2190                                               surf_def_v(1)%rad_net,          &
2191                                               surf_lsm_v(1)%rad_net,          &
2192                                               surf_usm_v(1)%rad_net,          &
2193                                               surf_def_v(2)%rad_net,          &
2194                                               surf_lsm_v(2)%rad_net,          &
2195                                               surf_usm_v(2)%rad_net,          &
2196                                               surf_def_v(3)%rad_net,          &
2197                                               surf_lsm_v(3)%rad_net,          &
2198                                               surf_usm_v(3)%rad_net ) 
2199               ELSE
2200!
2201!--               Output of averaged data
2202                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2203                                        REAL( average_count_surf, KIND=wp )
2204                  surfaces%var_av(:,n_out) = 0.0_wp
2205                                                       
2206               ENDIF
2207
2208            CASE ( 'rad_lw_in' )
2209!
2210!--            Output of instantaneous data
2211               IF ( av == 0 )  THEN
2212                  CALL surface_data_output_collect( surf_def_h(0)%rad_lw_in,   &
2213                                               surf_def_h(1)%rad_lw_in,        &
2214                                               surf_lsm_h%rad_lw_in,           &
2215                                               surf_usm_h%rad_lw_in,           &
2216                                               surf_def_v(0)%rad_lw_in,        &
2217                                               surf_lsm_v(0)%rad_lw_in,        &
2218                                               surf_usm_v(0)%rad_lw_in,        &
2219                                               surf_def_v(1)%rad_lw_in,        &
2220                                               surf_lsm_v(1)%rad_lw_in,        &
2221                                               surf_usm_v(1)%rad_lw_in,        &
2222                                               surf_def_v(2)%rad_lw_in,        &
2223                                               surf_lsm_v(2)%rad_lw_in,        &
2224                                               surf_usm_v(2)%rad_lw_in,        &
2225                                               surf_def_v(3)%rad_lw_in,        &
2226                                               surf_lsm_v(3)%rad_lw_in,        &
2227                                               surf_usm_v(3)%rad_lw_in )
2228               ELSE
2229!
2230!--               Output of averaged data
2231                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2232                                        REAL( average_count_surf, KIND=wp )
2233                  surfaces%var_av(:,n_out) = 0.0_wp
2234                                                       
2235               ENDIF
2236
2237            CASE ( 'rad_lw_out' )
2238!
2239!--            Output of instantaneous data
2240               IF ( av == 0 )  THEN
2241                  CALL surface_data_output_collect( surf_def_h(0)%rad_lw_out,  &
2242                                               surf_def_h(1)%rad_lw_out,       &
2243                                               surf_lsm_h%rad_lw_out,          &
2244                                               surf_usm_h%rad_lw_out,          &
2245                                               surf_def_v(0)%rad_lw_out,       &
2246                                               surf_lsm_v(0)%rad_lw_out,       &
2247                                               surf_usm_v(0)%rad_lw_out,       &
2248                                               surf_def_v(1)%rad_lw_out,       &
2249                                               surf_lsm_v(1)%rad_lw_out,       &
2250                                               surf_usm_v(1)%rad_lw_out,       &
2251                                               surf_def_v(2)%rad_lw_out,       &
2252                                               surf_lsm_v(2)%rad_lw_out,       &
2253                                               surf_usm_v(2)%rad_lw_out,       &
2254                                               surf_def_v(3)%rad_lw_out,       &
2255                                               surf_lsm_v(3)%rad_lw_out,       &
2256                                               surf_usm_v(3)%rad_lw_out )
2257               ELSE
2258!
2259!--               Output of averaged data
2260                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2261                                        REAL( average_count_surf, KIND=wp )
2262                  surfaces%var_av(:,n_out) = 0.0_wp
2263                                                       
2264               ENDIF
2265
2266            CASE ( 'rad_sw_in' )
2267!
2268!--            Output of instantaneous data
2269               IF ( av == 0 )  THEN
2270                  CALL surface_data_output_collect( surf_def_h(0)%rad_sw_in,   &
2271                                               surf_def_h(1)%rad_sw_in,        &
2272                                               surf_lsm_h%rad_sw_in,           &
2273                                               surf_usm_h%rad_sw_in,           &
2274                                               surf_def_v(0)%rad_sw_in,        &
2275                                               surf_lsm_v(0)%rad_sw_in,        &
2276                                               surf_usm_v(0)%rad_sw_in,        &
2277                                               surf_def_v(1)%rad_sw_in,        &
2278                                               surf_lsm_v(1)%rad_sw_in,        &
2279                                               surf_usm_v(1)%rad_sw_in,        &
2280                                               surf_def_v(2)%rad_sw_in,        &
2281                                               surf_lsm_v(2)%rad_sw_in,        &
2282                                               surf_usm_v(2)%rad_sw_in,        &
2283                                               surf_def_v(3)%rad_sw_in,        &
2284                                               surf_lsm_v(3)%rad_sw_in,        &
2285                                               surf_usm_v(3)%rad_sw_in )
2286               ELSE
2287!
2288!--               Output of averaged data
2289                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2290                                        REAL( average_count_surf, KIND=wp )
2291                  surfaces%var_av(:,n_out) = 0.0_wp
2292                                                       
2293               ENDIF
2294
2295            CASE ( 'rad_sw_out' )
2296!
2297!--            Output of instantaneous data
2298               IF ( av == 0 )  THEN
2299                  CALL surface_data_output_collect( surf_def_h(0)%rad_sw_out,  &
2300                                               surf_def_h(1)%rad_sw_out,       &
2301                                               surf_lsm_h%rad_sw_out,          &
2302                                               surf_usm_h%rad_sw_out,          &
2303                                               surf_def_v(0)%rad_sw_out,       &
2304                                               surf_lsm_v(0)%rad_sw_out,       &
2305                                               surf_usm_v(0)%rad_sw_out,       &
2306                                               surf_def_v(1)%rad_sw_out,       &
2307                                               surf_lsm_v(1)%rad_sw_out,       &
2308                                               surf_usm_v(1)%rad_sw_out,       &
2309                                               surf_def_v(2)%rad_sw_out,       &
2310                                               surf_lsm_v(2)%rad_sw_out,       &
2311                                               surf_usm_v(2)%rad_sw_out,       &
2312                                               surf_def_v(3)%rad_sw_out,       &
2313                                               surf_lsm_v(3)%rad_sw_out,       &
2314                                               surf_usm_v(3)%rad_sw_out )
2315               ELSE
2316!
2317!--               Output of averaged data
2318                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2319                                        REAL( average_count_surf, KIND=wp )
2320                  surfaces%var_av(:,n_out) = 0.0_wp
2321                                                       
2322               ENDIF
2323
2324            CASE ( 'ghf' )
2325!
2326!--            Output of instantaneous data
2327               IF ( av == 0 )  THEN
2328                  CALL surface_data_output_collect( surf_def_h(0)%ghf,         &
2329                                               surf_def_h(1)%ghf,              &
2330                                               surf_lsm_h%ghf,                 &
2331                                               surf_usm_h%ghf,                 &
2332                                               surf_def_v(0)%ghf,              &
2333                                               surf_lsm_v(0)%ghf,              &
2334                                               surf_usm_v(0)%ghf,              &
2335                                               surf_def_v(1)%ghf,              &
2336                                               surf_lsm_v(1)%ghf,              &
2337                                               surf_usm_v(1)%ghf,              &
2338                                               surf_def_v(2)%ghf,              &
2339                                               surf_lsm_v(2)%ghf,              &
2340                                               surf_usm_v(2)%ghf,              &
2341                                               surf_def_v(3)%ghf,              &
2342                                               surf_lsm_v(3)%ghf,              &
2343                                               surf_usm_v(3)%ghf )     
2344                                                                        ELSE
2345!
2346!--               Output of averaged data
2347                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2348                                        REAL( average_count_surf, KIND=wp )
2349                  surfaces%var_av(:,n_out) = 0.0_wp
2350                                                       
2351               ENDIF
2352                     
2353            CASE ( 'r_a' )                                                     
2354!
2355!--            Output of instantaneous data
2356               IF ( av == 0 )  THEN
2357                  CALL surface_data_output_collect( surf_def_h(0)%r_a,         &
2358                                               surf_def_h(1)%r_a,              &
2359                                               surf_lsm_h%r_a,                 &
2360                                               surf_usm_h%r_a,                 &
2361                                               surf_def_v(0)%r_a,              &
2362                                               surf_lsm_v(0)%r_a,              &
2363                                               surf_usm_v(0)%r_a,              &
2364                                               surf_def_v(1)%r_a,              &
2365                                               surf_lsm_v(1)%r_a,              &
2366                                               surf_usm_v(1)%r_a,              &
2367                                               surf_def_v(2)%r_a,              &
2368                                               surf_lsm_v(2)%r_a,              &
2369                                               surf_usm_v(2)%r_a,              &
2370                                               surf_def_v(3)%r_a,              &
2371                                               surf_lsm_v(3)%r_a,              &
2372                                               surf_usm_v(3)%r_a )     
2373                                                                      ELSE
2374!
2375!--               Output of averaged data
2376                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2377                                        REAL( average_count_surf, KIND=wp )
2378                  surfaces%var_av(:,n_out) = 0.0_wp
2379                                                       
2380               ENDIF
2381                       
2382            CASE ( 'r_soil' )                                                 
2383!
2384!--            Output of instantaneous data
2385               IF ( av == 0 )  THEN
2386                  CALL surface_data_output_collect( surf_def_h(0)%r_soil,      &
2387                                               surf_def_h(1)%r_soil,           &
2388                                               surf_lsm_h%r_soil,              &
2389                                               surf_usm_h%r_soil,              &
2390                                               surf_def_v(0)%r_soil,           &
2391                                               surf_lsm_v(0)%r_soil,           &
2392                                               surf_usm_v(0)%r_soil,           &
2393                                               surf_def_v(1)%r_soil,           &
2394                                               surf_lsm_v(1)%r_soil,           &
2395                                               surf_usm_v(1)%r_soil,           &
2396                                               surf_def_v(2)%r_soil,           &
2397                                               surf_lsm_v(2)%r_soil,           &
2398                                               surf_usm_v(2)%r_soil,           &
2399                                               surf_def_v(3)%r_soil,           &
2400                                               surf_lsm_v(3)%r_soil,           &
2401                                               surf_usm_v(3)%r_soil ) 
2402               ELSE
2403!
2404!--               Output of averaged data
2405                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2406                                        REAL( average_count_surf, KIND=wp )
2407                  surfaces%var_av(:,n_out) = 0.0_wp
2408                                                       
2409               ENDIF
2410
2411            CASE ( 'r_canopy' )
2412!
2413!--            Output of instantaneous data
2414               IF ( av == 0 )  THEN
2415                  CALL surface_data_output_collect( surf_def_h(0)%r_canopy,    &
2416                                               surf_def_h(1)%r_canopy,         &
2417                                               surf_lsm_h%r_canopy,            &
2418                                               surf_usm_h%r_canopy,            &
2419                                               surf_def_v(0)%r_canopy,         &
2420                                               surf_lsm_v(0)%r_canopy,         &
2421                                               surf_usm_v(0)%r_canopy,         &
2422                                               surf_def_v(1)%r_canopy,         &
2423                                               surf_lsm_v(1)%r_canopy,         &
2424                                               surf_usm_v(1)%r_canopy,         &
2425                                               surf_def_v(2)%r_canopy,         &
2426                                               surf_lsm_v(2)%r_canopy,         &
2427                                               surf_usm_v(2)%r_canopy,         &
2428                                               surf_def_v(3)%r_canopy,         &
2429                                               surf_lsm_v(3)%r_canopy,         &
2430                                               surf_usm_v(3)%r_canopy ) 
2431               ELSE
2432!
2433!--               Output of averaged data
2434                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2435                                        REAL( average_count_surf, KIND=wp )
2436                  surfaces%var_av(:,n_out) = 0.0_wp
2437                                                       
2438               ENDIF
2439
2440            CASE ( 'r_s' )
2441!
2442!--            Output of instantaneous data
2443               IF ( av == 0 )  THEN
2444                  CALL surface_data_output_collect( surf_def_h(0)%r_s,         &
2445                                               surf_def_h(1)%r_s,              &
2446                                               surf_lsm_h%r_s,                 &
2447                                               surf_usm_h%r_s,                 &
2448                                               surf_def_v(0)%r_s,              &
2449                                               surf_lsm_v(0)%r_s,              &
2450                                               surf_usm_v(0)%r_s,              &
2451                                               surf_def_v(1)%r_s,              &
2452                                               surf_lsm_v(1)%r_s,              &
2453                                               surf_usm_v(1)%r_s,              &
2454                                               surf_def_v(2)%r_s,              &
2455                                               surf_lsm_v(2)%r_s,              &
2456                                               surf_usm_v(2)%r_s,              &
2457                                               surf_def_v(3)%r_s,              &
2458                                               surf_lsm_v(3)%r_s,              &
2459                                               surf_usm_v(3)%r_s ) 
2460               ELSE
2461!
2462!--               Output of averaged data
2463                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2464                                        REAL( average_count_surf, KIND=wp )
2465                  surfaces%var_av(:,n_out) = 0.0_wp
2466                                                       
2467               ENDIF
2468
2469            CASE ( 'rad_sw_dir' )
2470!
2471!--            Output of instantaneous data
2472               IF ( av == 0 )  THEN
2473                  CALL surface_data_output_collect( surf_def_h(0)%rad_sw_dir,  &
2474                                               surf_def_h(1)%rad_sw_dir,       &
2475                                               surf_lsm_h%rad_sw_dir,          &
2476                                               surf_usm_h%rad_sw_dir,          &
2477                                               surf_def_v(0)%rad_sw_dir,       &
2478                                               surf_lsm_v(0)%rad_sw_dir,       &
2479                                               surf_usm_v(0)%rad_sw_dir,       &
2480                                               surf_def_v(1)%rad_sw_dir,       &
2481                                               surf_lsm_v(1)%rad_sw_dir,       &
2482                                               surf_usm_v(1)%rad_sw_dir,       &
2483                                               surf_def_v(2)%rad_sw_dir,       &
2484                                               surf_lsm_v(2)%rad_sw_dir,       &
2485                                               surf_usm_v(2)%rad_sw_dir,       &
2486                                               surf_def_v(3)%rad_sw_dir,       &
2487                                               surf_lsm_v(3)%rad_sw_dir,       &
2488                                               surf_usm_v(3)%rad_sw_dir )
2489               ELSE
2490!
2491!--               Output of averaged data
2492                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2493                                        REAL( average_count_surf, KIND=wp )
2494                  surfaces%var_av(:,n_out) = 0.0_wp
2495                                                       
2496               ENDIF
2497
2498            CASE ( 'rad_sw_dif' )
2499!
2500!--            Output of instantaneous data
2501               IF ( av == 0 )  THEN
2502                  CALL surface_data_output_collect( surf_def_h(0)%rad_sw_dif,  &
2503                                               surf_def_h(1)%rad_sw_dif,       &
2504                                               surf_lsm_h%rad_sw_dif,          &
2505                                               surf_usm_h%rad_sw_dif,          &
2506                                               surf_def_v(0)%rad_sw_dif,       &
2507                                               surf_lsm_v(0)%rad_sw_dif,       &
2508                                               surf_usm_v(0)%rad_sw_dif,       &
2509                                               surf_def_v(1)%rad_sw_dif,       &
2510                                               surf_lsm_v(1)%rad_sw_dif,       &
2511                                               surf_usm_v(1)%rad_sw_dif,       &
2512                                               surf_def_v(2)%rad_sw_dif,       &
2513                                               surf_lsm_v(2)%rad_sw_dif,       &
2514                                               surf_usm_v(2)%rad_sw_dif,       &
2515                                               surf_def_v(3)%rad_sw_dif,       &
2516                                               surf_lsm_v(3)%rad_sw_dif,       &
2517                                               surf_usm_v(3)%rad_sw_dif )
2518               ELSE
2519!
2520!--               Output of averaged data
2521                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2522                                        REAL( average_count_surf, KIND=wp )
2523                  surfaces%var_av(:,n_out) = 0.0_wp
2524                                                       
2525               ENDIF
2526
2527            CASE ( 'rad_sw_ref' )
2528!
2529!--            Output of instantaneous data
2530               IF ( av == 0 )  THEN
2531                  CALL surface_data_output_collect( surf_def_h(0)%rad_sw_ref,  &
2532                                               surf_def_h(1)%rad_sw_ref,       &
2533                                               surf_lsm_h%rad_sw_ref,          &
2534                                               surf_usm_h%rad_sw_ref,          &
2535                                               surf_def_v(0)%rad_sw_ref,       &
2536                                               surf_lsm_v(0)%rad_sw_ref,       &
2537                                               surf_usm_v(0)%rad_sw_ref,       &
2538                                               surf_def_v(1)%rad_sw_ref,       &
2539                                               surf_lsm_v(1)%rad_sw_ref,       &
2540                                               surf_usm_v(1)%rad_sw_ref,       &
2541                                               surf_def_v(2)%rad_sw_ref,       &
2542                                               surf_lsm_v(2)%rad_sw_ref,       &
2543                                               surf_usm_v(2)%rad_sw_ref,       &
2544                                               surf_def_v(3)%rad_sw_ref,       &
2545                                               surf_lsm_v(3)%rad_sw_ref,       &
2546                                               surf_usm_v(3)%rad_sw_ref )
2547               ELSE
2548!
2549!--               Output of averaged data
2550                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2551                                        REAL( average_count_surf, KIND=wp )
2552                  surfaces%var_av(:,n_out) = 0.0_wp
2553                                                       
2554               ENDIF
2555
2556            CASE ( 'rad_sw_res' )
2557!
2558!--            Output of instantaneous data
2559               IF ( av == 0 )  THEN
2560                  CALL surface_data_output_collect( surf_def_h(0)%rad_sw_res,  &
2561                                               surf_def_h(1)%rad_sw_res,       &
2562                                               surf_lsm_h%rad_sw_res,          &
2563                                               surf_usm_h%rad_sw_res,          &
2564                                               surf_def_v(0)%rad_sw_res,       &
2565                                               surf_lsm_v(0)%rad_sw_res,       &
2566                                               surf_usm_v(0)%rad_sw_res,       &
2567                                               surf_def_v(1)%rad_sw_res,       &
2568                                               surf_lsm_v(1)%rad_sw_res,       &
2569                                               surf_usm_v(1)%rad_sw_res,       &
2570                                               surf_def_v(2)%rad_sw_res,       &
2571                                               surf_lsm_v(2)%rad_sw_res,       &
2572                                               surf_usm_v(2)%rad_sw_res,       &
2573                                               surf_def_v(3)%rad_sw_res,       &
2574                                               surf_lsm_v(3)%rad_sw_res,       &
2575                                               surf_usm_v(3)%rad_sw_res )
2576               ELSE
2577!
2578!--               Output of averaged data
2579                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2580                                        REAL( average_count_surf, KIND=wp )
2581                  surfaces%var_av(:,n_out) = 0.0_wp
2582                                                       
2583               ENDIF
2584
2585            CASE ( 'rad_lw_dif' )
2586!
2587!--            Output of instantaneous data
2588               IF ( av == 0 )  THEN
2589                  CALL surface_data_output_collect( surf_def_h(0)%rad_lw_dif,  &
2590                                               surf_def_h(1)%rad_lw_dif,       &
2591                                               surf_lsm_h%rad_lw_dif,          &
2592                                               surf_usm_h%rad_lw_dif,          &
2593                                               surf_def_v(0)%rad_lw_dif,       &
2594                                               surf_lsm_v(0)%rad_lw_dif,       &
2595                                               surf_usm_v(0)%rad_lw_dif,       &
2596                                               surf_def_v(1)%rad_lw_dif,       &
2597                                               surf_lsm_v(1)%rad_lw_dif,       &
2598                                               surf_usm_v(1)%rad_lw_dif,       &
2599                                               surf_def_v(2)%rad_lw_dif,       &
2600                                               surf_lsm_v(2)%rad_lw_dif,       &
2601                                               surf_usm_v(2)%rad_lw_dif,       &
2602                                               surf_def_v(3)%rad_lw_dif,       &
2603                                               surf_lsm_v(3)%rad_lw_dif,       &
2604                                               surf_usm_v(3)%rad_lw_dif )
2605               ELSE
2606!
2607!--               Output of averaged data
2608                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2609                                        REAL( average_count_surf, KIND=wp )
2610                  surfaces%var_av(:,n_out) = 0.0_wp
2611                                                       
2612               ENDIF
2613
2614            CASE ( 'rad_lw_ref' )
2615!
2616!--            Output of instantaneous data
2617               IF ( av == 0 )  THEN
2618                  CALL surface_data_output_collect( surf_def_h(0)%rad_lw_ref,  &
2619                                               surf_def_h(1)%rad_lw_ref,       &
2620                                               surf_lsm_h%rad_lw_ref,          &
2621                                               surf_usm_h%rad_lw_ref,          &
2622                                               surf_def_v(0)%rad_lw_ref,       &
2623                                               surf_lsm_v(0)%rad_lw_ref,       &
2624                                               surf_usm_v(0)%rad_lw_ref,       &
2625                                               surf_def_v(1)%rad_lw_ref,       &
2626                                               surf_lsm_v(1)%rad_lw_ref,       &
2627                                               surf_usm_v(1)%rad_lw_ref,       &
2628                                               surf_def_v(2)%rad_lw_ref,       &
2629                                               surf_lsm_v(2)%rad_lw_ref,       &
2630                                               surf_usm_v(2)%rad_lw_ref,       &
2631                                               surf_def_v(3)%rad_lw_ref,       &
2632                                               surf_lsm_v(3)%rad_lw_ref,       &
2633                                               surf_usm_v(3)%rad_lw_ref )
2634               ELSE
2635!
2636!--               Output of averaged data
2637                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2638                                        REAL( average_count_surf, KIND=wp )
2639                  surfaces%var_av(:,n_out) = 0.0_wp
2640                                                       
2641               ENDIF
2642
2643            CASE ( 'rad_lw_res' )
2644!
2645!--            Output of instantaneous data
2646               IF ( av == 0 )  THEN
2647                  CALL surface_data_output_collect( surf_def_h(0)%rad_lw_res,  &
2648                                               surf_def_h(1)%rad_lw_res,       &
2649                                               surf_lsm_h%rad_lw_res,          &
2650                                               surf_usm_h%rad_lw_res,          &
2651                                               surf_def_v(0)%rad_lw_res,       &
2652                                               surf_lsm_v(0)%rad_lw_res,       &
2653                                               surf_usm_v(0)%rad_lw_res,       &
2654                                               surf_def_v(1)%rad_lw_res,       &
2655                                               surf_lsm_v(1)%rad_lw_res,       &
2656                                               surf_usm_v(1)%rad_lw_res,       &
2657                                               surf_def_v(2)%rad_lw_res,       &
2658                                               surf_lsm_v(2)%rad_lw_res,       &
2659                                               surf_usm_v(2)%rad_lw_res,       &
2660                                               surf_def_v(3)%rad_lw_res,       &
2661                                               surf_lsm_v(3)%rad_lw_res,       &
2662                                               surf_usm_v(3)%rad_lw_res )
2663               ELSE
2664!
2665!--               Output of averaged data
2666                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2667                                        REAL( average_count_surf, KIND=wp )
2668                  surfaces%var_av(:,n_out) = 0.0_wp
2669                                                       
2670               ENDIF
2671               
2672            CASE ( 'uvw1' )
2673!
2674!--            Output of instantaneous data
2675               IF ( av == 0 )  THEN
2676                  CALL surface_data_output_collect( surf_def_h(0)%uvw_abs,     &
2677                                               surf_def_h(1)%uvw_abs,          &
2678                                               surf_lsm_h%uvw_abs,             &
2679                                               surf_usm_h%uvw_abs,             &
2680                                               surf_def_v(0)%uvw_abs,          &
2681                                               surf_lsm_v(0)%uvw_abs,          &
2682                                               surf_usm_v(0)%uvw_abs,          &
2683                                               surf_def_v(1)%uvw_abs,          &
2684                                               surf_lsm_v(1)%uvw_abs,          &
2685                                               surf_usm_v(1)%uvw_abs,          &
2686                                               surf_def_v(2)%uvw_abs,          &
2687                                               surf_lsm_v(2)%uvw_abs,          &
2688                                               surf_usm_v(2)%uvw_abs,          &
2689                                               surf_def_v(3)%uvw_abs,          &
2690                                               surf_lsm_v(3)%uvw_abs,          &
2691                                               surf_usm_v(3)%uvw_abs )
2692               ELSE
2693!
2694!--               Output of averaged data
2695                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
2696                                        REAL( average_count_surf, KIND=wp )
2697                  surfaces%var_av(:,n_out) = 0.0_wp
2698                                                       
2699               ENDIF   
2700
2701!
2702!--            Add further variables:
2703!--            'css', 'cssws', 'qsws_liq', 'qsws_soil', 'qsws_veg'
2704
2705         END SELECT
2706!
2707!--      Write to binary file:
2708!--      - surfaces%points ( 3, 1-npoints )
2709!--      - surfaces%polygons ( 5, 1-ns )
2710!--      - surfaces%var_out ( 1-ns, time )
2711!--      - Dimension: 1-nsurfaces, 1-npoints - can be ordered consecutively
2712!--      - Distinguish between average and non-average data
2713         IF ( to_vtk )  THEN
2714            DO  i = 0, io_blocks-1
2715               IF ( i == io_group )  THEN
2716                  WRITE ( 25+av )  LEN_TRIM( 'time' )
2717                  WRITE ( 25+av )  'time'
2718                  WRITE ( 25+av )  time_since_reference_point
2719                  WRITE ( 25+av )  LEN_TRIM( trimvar )
2720                  WRITE ( 25+av )  TRIM( trimvar )
2721                  WRITE ( 25+av )  surfaces%var_out
2722               ENDIF
2723#if defined( __parallel )
2724               CALL MPI_BARRIER( comm2d, ierr )
2725#endif
2726            ENDDO
2727         ENDIF
2728         
2729         IF ( to_netcdf )  THEN
2730#if defined( __netcdf4_parallel )
2731!
2732!--         Write output array to file
2733            nc_stat = NF90_PUT_VAR( id_set_surf(av), id_var_dosurf(av,n_out),            &
2734                                    surfaces%var_out,                                    &
2735                                    start = (/ surfaces%s(1), dosurf_time_count(av) /),  &
2736                                    count = (/ surfaces%ns, 1 /) )
2737            CALL netcdf_handle_error( 'surface_data_output', 6667 )
2738#endif
2739         ENDIF
2740
2741      ENDDO
2742     
2743!
2744!--   If averaged output was written to NetCDF file, set the counter to zero
2745      IF ( av == 1 )  average_count_surf = 0
2746             
2747   END SUBROUTINE surface_data_output
2748   
2749!------------------------------------------------------------------------------!
2750! Description:
2751! ------------
2752!> Routine for controlling the data averaging.
2753!------------------------------------------------------------------------------!     
2754   SUBROUTINE surface_data_output_averaging
2755   
2756      IMPLICIT NONE
2757     
2758      CHARACTER(LEN=100) ::  trimvar !< dummy variable for current output variable
2759       
2760      INTEGER(iwp) ::  n_out  !< counter variables for surface output
2761     
2762      n_out = 0
2763      DO  WHILE ( dosurf(1,n_out+1)(1:1) /= ' ' )
2764         
2765         n_out   = n_out + 1
2766         trimvar = TRIM( dosurf(1,n_out) )
2767
2768         SELECT CASE ( trimvar )
2769
2770            CASE ( 'us' )
2771               CALL surface_data_output_sum_up( surf_def_h(0)%us,              &
2772                                           surf_def_h(1)%us,                   &
2773                                           surf_lsm_h%us,                      &
2774                                           surf_usm_h%us,                      &
2775                                           surf_def_v(0)%us,                   &
2776                                           surf_lsm_v(0)%us,                   &
2777                                           surf_usm_v(0)%us,                   &
2778                                           surf_def_v(1)%us,                   &
2779                                           surf_lsm_v(1)%us,                   &
2780                                           surf_usm_v(1)%us,                   &
2781                                           surf_def_v(2)%us,                   &
2782                                           surf_lsm_v(2)%us,                   &
2783                                           surf_usm_v(2)%us,                   &
2784                                           surf_def_v(3)%us,                   &
2785                                           surf_lsm_v(3)%us,                   &
2786                                           surf_usm_v(3)%us, n_out ) 
2787
2788            CASE ( 'ts' )
2789               CALL surface_data_output_sum_up( surf_def_h(0)%ts,              &
2790                                           surf_def_h(1)%ts,                   &
2791                                           surf_lsm_h%ts,                      &
2792                                           surf_usm_h%ts,                      &
2793                                           surf_def_v(0)%ts,                   &
2794                                           surf_lsm_v(0)%ts,                   &
2795                                           surf_usm_v(0)%ts,                   &
2796                                           surf_def_v(1)%ts,                   &
2797                                           surf_lsm_v(1)%ts,                   &
2798                                           surf_usm_v(1)%ts,                   &
2799                                           surf_def_v(2)%ts,                   &
2800                                           surf_lsm_v(2)%ts,                   &
2801                                           surf_usm_v(2)%ts,                   &
2802                                           surf_def_v(3)%ts,                   &
2803                                           surf_lsm_v(3)%ts,                   &
2804                                           surf_usm_v(3)%ts, n_out ) 
2805
2806            CASE ( 'qs' )
2807               CALL surface_data_output_sum_up( surf_def_h(0)%qs,              &
2808                                           surf_def_h(1)%qs,                   &
2809                                           surf_lsm_h%qs,                      &
2810                                           surf_usm_h%qs,                      &
2811                                           surf_def_v(0)%qs,                   &
2812                                           surf_lsm_v(0)%qs,                   &
2813                                           surf_usm_v(0)%qs,                   &
2814                                           surf_def_v(1)%qs,                   &
2815                                           surf_lsm_v(1)%qs,                   &
2816                                           surf_usm_v(1)%qs,                   &
2817                                           surf_def_v(2)%qs,                   &
2818                                           surf_lsm_v(2)%qs,                   &
2819                                           surf_usm_v(2)%qs,                   &
2820                                           surf_def_v(3)%qs,                   &
2821                                           surf_lsm_v(3)%qs,                   &
2822                                           surf_usm_v(3)%qs, n_out ) 
2823
2824            CASE ( 'ss' )
2825               CALL surface_data_output_sum_up( surf_def_h(0)%ss,              &
2826                                           surf_def_h(1)%ss,                   &
2827                                           surf_lsm_h%ss,                      &
2828                                           surf_usm_h%ss,                      &
2829                                           surf_def_v(0)%ss,                   &
2830                                           surf_lsm_v(0)%ss,                   &
2831                                           surf_usm_v(0)%ss,                   &
2832                                           surf_def_v(1)%ss,                   &
2833                                           surf_lsm_v(1)%ss,                   &
2834                                           surf_usm_v(1)%ss,                   &
2835                                           surf_def_v(2)%ss,                   &
2836                                           surf_lsm_v(2)%ss,                   &
2837                                           surf_usm_v(2)%ss,                   &
2838                                           surf_def_v(3)%ss,                   &
2839                                           surf_lsm_v(3)%ss,                   &
2840                                           surf_usm_v(3)%ss, n_out ) 
2841
2842            CASE ( 'qcs' )
2843               CALL surface_data_output_sum_up( surf_def_h(0)%qcs,             &
2844                                           surf_def_h(1)%qcs,                  &
2845                                           surf_lsm_h%qcs,                     &
2846                                           surf_usm_h%qcs,                     &
2847                                           surf_def_v(0)%qcs,                  &
2848                                           surf_lsm_v(0)%qcs,                  &
2849                                           surf_usm_v(0)%qcs,                  &
2850                                           surf_def_v(1)%qcs,                  &
2851                                           surf_lsm_v(1)%qcs,                  &
2852                                           surf_usm_v(1)%qcs,                  &
2853                                           surf_def_v(2)%qcs,                  &
2854                                           surf_lsm_v(2)%qcs,                  &
2855                                           surf_usm_v(2)%qcs,                  &
2856                                           surf_def_v(3)%qcs,                  &
2857                                           surf_lsm_v(3)%qcs,                  &
2858                                           surf_usm_v(3)%qcs, n_out ) 
2859
2860            CASE ( 'ncs' )
2861               CALL surface_data_output_sum_up( surf_def_h(0)%ncs,             &
2862                                           surf_def_h(1)%ncs,                  &
2863                                           surf_lsm_h%ncs,                     &
2864                                           surf_usm_h%ncs,                     &
2865                                           surf_def_v(0)%ncs,                  &
2866                                           surf_lsm_v(0)%ncs,                  &
2867                                           surf_usm_v(0)%ncs,                  &
2868                                           surf_def_v(1)%ncs,                  &
2869                                           surf_lsm_v(1)%ncs,                  &
2870                                           surf_usm_v(1)%ncs,                  &
2871                                           surf_def_v(2)%ncs,                  &
2872                                           surf_lsm_v(2)%ncs,                  &
2873                                           surf_usm_v(2)%ncs,                  &
2874                                           surf_def_v(3)%ncs,                  &
2875                                           surf_lsm_v(3)%ncs,                  &
2876                                           surf_usm_v(3)%ncs, n_out ) 
2877
2878            CASE ( 'qrs' )
2879               CALL surface_data_output_sum_up( surf_def_h(0)%qrs,             &
2880                                           surf_def_h(1)%qrs,                  &
2881                                           surf_lsm_h%qrs,                     &
2882                                           surf_usm_h%qrs,                     &
2883                                           surf_def_v(0)%qrs,                  &
2884                                           surf_lsm_v(0)%qrs,                  &
2885                                           surf_usm_v(0)%qrs,                  &
2886                                           surf_def_v(1)%qrs,                  &
2887                                           surf_lsm_v(1)%qrs,                  &
2888                                           surf_usm_v(1)%qrs,                  &
2889                                           surf_def_v(2)%qrs,                  &
2890                                           surf_lsm_v(2)%qrs,                  &
2891                                           surf_usm_v(2)%qrs,                  &
2892                                           surf_def_v(3)%qrs,                  &
2893                                           surf_lsm_v(3)%qrs,                  &
2894                                           surf_usm_v(3)%qrs, n_out ) 
2895
2896            CASE ( 'nrs' )
2897               CALL surface_data_output_sum_up( surf_def_h(0)%nrs,             &
2898                                           surf_def_h(1)%nrs,                  &
2899                                           surf_lsm_h%nrs,                     &
2900                                           surf_usm_h%nrs,                     &
2901                                           surf_def_v(0)%nrs,                  &
2902                                           surf_lsm_v(0)%nrs,                  &
2903                                           surf_usm_v(0)%nrs,                  &
2904                                           surf_def_v(1)%nrs,                  &
2905                                           surf_lsm_v(1)%nrs,                  &
2906                                           surf_usm_v(1)%nrs,                  &
2907                                           surf_def_v(2)%nrs,                  &
2908                                           surf_lsm_v(2)%nrs,                  &
2909                                           surf_usm_v(2)%nrs,                  &
2910                                           surf_def_v(3)%nrs,                  &
2911                                           surf_lsm_v(3)%nrs,                  &
2912                                           surf_usm_v(3)%nrs, n_out ) 
2913
2914            CASE ( 'ol' )
2915               CALL surface_data_output_sum_up( surf_def_h(0)%ol,              &
2916                                           surf_def_h(1)%ol,                   &
2917                                           surf_lsm_h%ol,                      &
2918                                           surf_usm_h%ol,                      &
2919                                           surf_def_v(0)%ol,                   &
2920                                           surf_lsm_v(0)%ol,                   &
2921                                           surf_usm_v(0)%ol,                   &
2922                                           surf_def_v(1)%ol,                   &
2923                                           surf_lsm_v(1)%ol,                   &
2924                                           surf_usm_v(1)%ol,                   &
2925                                           surf_def_v(2)%ol,                   &
2926                                           surf_lsm_v(2)%ol,                   &
2927                                           surf_usm_v(2)%ol,                   &
2928                                           surf_def_v(3)%ol,                   &
2929                                           surf_lsm_v(3)%ol,                   &
2930                                           surf_usm_v(3)%ol, n_out ) 
2931
2932            CASE ( 'z0' )
2933               CALL surface_data_output_sum_up( surf_def_h(0)%z0,              &
2934                                           surf_def_h(1)%z0,                   &
2935                                           surf_lsm_h%z0,                      &
2936                                           surf_usm_h%z0,                      &
2937                                           surf_def_v(0)%z0,                   &
2938                                           surf_lsm_v(0)%z0,                   &
2939                                           surf_usm_v(0)%z0,                   &
2940                                           surf_def_v(1)%z0,                   &
2941                                           surf_lsm_v(1)%z0,                   &
2942                                           surf_usm_v(1)%z0,                   &
2943                                           surf_def_v(2)%z0,                   &
2944                                           surf_lsm_v(2)%z0,                   &
2945                                           surf_usm_v(2)%z0,                   &
2946                                           surf_def_v(3)%z0,                   &
2947                                           surf_lsm_v(3)%z0,                   &
2948                                           surf_usm_v(3)%z0, n_out ) 
2949
2950            CASE ( 'z0h' )
2951               CALL surface_data_output_sum_up( surf_def_h(0)%z0h,             &
2952                                           surf_def_h(1)%z0h,                  &
2953                                           surf_lsm_h%z0h,                     &
2954                                           surf_usm_h%z0h,                     &
2955                                           surf_def_v(0)%z0h,                  &
2956                                           surf_lsm_v(0)%z0h,                  &
2957                                           surf_usm_v(0)%z0h,                  &
2958                                           surf_def_v(1)%z0h,                  &
2959                                           surf_lsm_v(1)%z0h,                  &
2960                                           surf_usm_v(1)%z0h,                  &
2961                                           surf_def_v(2)%z0h,                  &
2962                                           surf_lsm_v(2)%z0h,                  &
2963                                           surf_usm_v(2)%z0h,                  &
2964                                           surf_def_v(3)%z0h,                  &
2965                                           surf_lsm_v(3)%z0h,                  &
2966                                           surf_usm_v(3)%z0h, n_out )         
2967
2968            CASE ( 'z0q' )
2969               CALL surface_data_output_sum_up( surf_def_h(0)%z0q,             &
2970                                           surf_def_h(1)%z0q,                  &
2971                                           surf_lsm_h%z0q,                     &
2972                                           surf_usm_h%z0q,                     &
2973                                           surf_def_v(0)%z0q,                  &
2974                                           surf_lsm_v(0)%z0q,                  &
2975                                           surf_usm_v(0)%z0q,                  &
2976                                           surf_def_v(1)%z0q,                  &
2977                                           surf_lsm_v(1)%z0q,                  &
2978                                           surf_usm_v(1)%z0q,                  &
2979                                           surf_def_v(2)%z0q,                  &
2980                                           surf_lsm_v(2)%z0q,                  &
2981                                           surf_usm_v(2)%z0q,                  &
2982                                           surf_def_v(3)%z0q,                  &
2983                                           surf_lsm_v(3)%z0q,                  &
2984                                           surf_usm_v(3)%z0q, n_out ) 
2985
2986            CASE ( 'theta1' )                                                 
2987               CALL surface_data_output_sum_up( surf_def_h(0)%pt1,             &
2988                                           surf_def_h(1)%pt1,                  &
2989                                           surf_lsm_h%pt1,                     &
2990                                           surf_usm_h%pt1,                     &
2991                                           surf_def_v(0)%pt1,                  &
2992                                           surf_lsm_v(0)%pt1,                  &
2993                                           surf_usm_v(0)%pt1,                  &
2994                                           surf_def_v(1)%pt1,                  &
2995                                           surf_lsm_v(1)%pt1,                  &
2996                                           surf_usm_v(1)%pt1,                  &
2997                                           surf_def_v(2)%pt1,                  &
2998                                           surf_lsm_v(2)%pt1,                  &
2999                                           surf_usm_v(2)%pt1,                  &
3000                                           surf_def_v(3)%pt1,                  &
3001                                           surf_lsm_v(3)%pt1,                  &
3002                                           surf_usm_v(3)%pt1, n_out )         
3003                                                                               
3004            CASE ( 'qv1' )                                                     
3005               CALL surface_data_output_sum_up( surf_def_h(0)%qv1,             &
3006                                           surf_def_h(1)%qv1,                  &
3007                                           surf_lsm_h%qv1,                     &
3008                                           surf_usm_h%qv1,                     &
3009                                           surf_def_v(0)%qv1,                  &
3010                                           surf_lsm_v(0)%qv1,                  &
3011                                           surf_usm_v(0)%qv1,                  &
3012                                           surf_def_v(1)%qv1,                  &
3013                                           surf_lsm_v(1)%qv1,                  &
3014                                           surf_usm_v(1)%qv1,                  &
3015                                           surf_def_v(2)%qv1,                  &
3016                                           surf_lsm_v(2)%qv1,                  &
3017                                           surf_usm_v(2)%qv1,                  &
3018                                           surf_def_v(3)%qv1,                  &
3019                                           surf_lsm_v(3)%qv1,                  &
3020                                           surf_usm_v(3)%qv1, n_out ) 
3021
3022            CASE ( 'thetav1' )
3023               CALL surface_data_output_sum_up( surf_def_h(0)%vpt1,            &
3024                                           surf_def_h(1)%vpt1,                 &
3025                                           surf_lsm_h%vpt1,                    &
3026                                           surf_usm_h%vpt1,                    &
3027                                           surf_def_v(0)%vpt1,                 &
3028                                           surf_lsm_v(0)%vpt1,                 &
3029                                           surf_usm_v(0)%vpt1,                 &
3030                                           surf_def_v(1)%vpt1,                 &
3031                                           surf_lsm_v(1)%vpt1,                 &
3032                                           surf_usm_v(1)%vpt1,                 &
3033                                           surf_def_v(2)%vpt1,                 &
3034                                           surf_lsm_v(2)%vpt1,                 &
3035                                           surf_usm_v(2)%vpt1,                 &
3036                                           surf_def_v(3)%vpt1,                 &
3037                                           surf_lsm_v(3)%vpt1,                 &
3038                                           surf_usm_v(3)%vpt1, n_out ) 
3039
3040            CASE ( 'usws' )
3041               CALL surface_data_output_sum_up( surf_def_h(0)%usws,            &
3042                                           surf_def_h(1)%usws,                 &
3043                                           surf_lsm_h%usws,                    &
3044                                           surf_usm_h%usws,                    &
3045                                           surf_def_v(0)%usws,                 &
3046                                           surf_lsm_v(0)%usws,                 &
3047                                           surf_usm_v(0)%usws,                 &
3048                                           surf_def_v(1)%usws,                 &
3049                                           surf_lsm_v(1)%usws,                 &
3050                                           surf_usm_v(1)%usws,                 &
3051                                           surf_def_v(2)%usws,                 &
3052                                           surf_lsm_v(2)%usws,                 &
3053                                           surf_usm_v(2)%usws,                 &
3054                                           surf_def_v(3)%usws,                 &
3055                                           surf_lsm_v(3)%usws,                 &
3056                                           surf_usm_v(3)%usws, n_out ) 
3057
3058            CASE ( 'vsws' )
3059               CALL surface_data_output_sum_up( surf_def_h(0)%vsws,            &
3060                                           surf_def_h(1)%vsws,                 &
3061                                           surf_lsm_h%vsws,                    &
3062                                           surf_usm_h%vsws,                    &
3063                                           surf_def_v(0)%vsws,                 &
3064                                           surf_lsm_v(0)%vsws,                 &
3065                                           surf_usm_v(0)%vsws,                 &
3066                                           surf_def_v(1)%vsws,                 &
3067                                           surf_lsm_v(1)%vsws,                 &
3068                                           surf_usm_v(1)%vsws,                 &
3069                                           surf_def_v(2)%vsws,                 &
3070                                           surf_lsm_v(2)%vsws,                 &
3071                                           surf_usm_v(2)%vsws,                 &
3072                                           surf_def_v(3)%vsws,                 &
3073                                           surf_lsm_v(3)%vsws,                 &
3074                                           surf_usm_v(3)%vsws, n_out ) 
3075
3076            CASE ( 'shf' )
3077               CALL surface_data_output_sum_up( surf_def_h(0)%shf,             &
3078                                           surf_def_h(1)%shf,                  &
3079                                           surf_lsm_h%shf,                     &
3080                                           surf_usm_h%shf,                     & 
3081                                           surf_def_v(0)%shf,                  &
3082                                           surf_lsm_v(0)%shf,                  &
3083                                           surf_usm_v(0)%shf,                  &
3084                                           surf_def_v(1)%shf,                  &
3085                                           surf_lsm_v(1)%shf,                  &
3086                                           surf_usm_v(1)%shf,                  &
3087                                           surf_def_v(2)%shf,                  &
3088                                           surf_lsm_v(2)%shf,                  &
3089                                           surf_usm_v(2)%shf,                  &
3090                                           surf_def_v(3)%shf,                  &
3091                                           surf_lsm_v(3)%shf,                  &
3092                                           surf_usm_v(3)%shf, n_out )
3093
3094            CASE ( 'qsws' )
3095               CALL surface_data_output_sum_up( surf_def_h(0)%qsws,            &
3096                                           surf_def_h(1)%qsws,                 &
3097                                           surf_lsm_h%qsws,                    &
3098                                           surf_usm_h%qsws,                    &
3099                                           surf_def_v(0)%qsws,                 &
3100                                           surf_lsm_v(0)%qsws,                 &
3101                                           surf_usm_v(0)%qsws,                 &
3102                                           surf_def_v(1)%qsws,                 &
3103                                           surf_lsm_v(1)%qsws,                 &
3104                                           surf_usm_v(1)%qsws,                 &
3105                                           surf_def_v(2)%qsws,                 &
3106                                           surf_lsm_v(2)%qsws,                 &
3107                                           surf_usm_v(2)%qsws,                 &
3108                                           surf_def_v(3)%qsws,                 &
3109                                           surf_lsm_v(3)%qsws,                 &
3110                                           surf_usm_v(3)%qsws, n_out ) 
3111
3112            CASE ( 'ssws' )
3113               CALL surface_data_output_sum_up( surf_def_h(0)%ssws,            &
3114                                           surf_def_h(1)%ssws,                 &
3115                                           surf_lsm_h%ssws,                    &
3116                                           surf_usm_h%ssws,                    &
3117                                           surf_def_v(0)%ssws,                 &
3118                                           surf_lsm_v(0)%ssws,                 &
3119                                           surf_usm_v(0)%ssws,                 &
3120                                           surf_def_v(1)%ssws,                 &
3121                                           surf_lsm_v(1)%ssws,                 &
3122                                           surf_usm_v(1)%ssws,                 &
3123                                           surf_def_v(2)%ssws,                 &
3124                                           surf_lsm_v(2)%ssws,                 &
3125                                           surf_usm_v(2)%ssws,                 &
3126                                           surf_def_v(3)%ssws,                 &
3127                                           surf_lsm_v(3)%ssws,                 &
3128                                           surf_usm_v(3)%ssws, n_out ) 
3129
3130            CASE ( 'qcsws' )
3131               CALL surface_data_output_sum_up( surf_def_h(0)%qcsws,           &
3132                                           surf_def_h(1)%qcsws,                &
3133                                           surf_lsm_h%qcsws,                   &
3134                                           surf_usm_h%qcsws,                   &
3135                                           surf_def_v(0)%qcsws,                &
3136                                           surf_lsm_v(0)%qcsws,                &
3137                                           surf_usm_v(0)%qcsws,                &
3138                                           surf_def_v(1)%qcsws,                &
3139                                           surf_lsm_v(1)%qcsws,                &
3140                                           surf_usm_v(1)%qcsws,                &
3141                                           surf_def_v(2)%qcsws,                &
3142                                           surf_lsm_v(2)%qcsws,                &
3143                                           surf_usm_v(2)%qcsws,                &
3144                                           surf_def_v(3)%qcsws,                &
3145                                           surf_lsm_v(3)%qcsws,                &
3146                                           surf_usm_v(3)%qcsws, n_out ) 
3147
3148            CASE ( 'ncsws' )
3149               CALL surface_data_output_sum_up( surf_def_h(0)%ncsws,           &
3150                                           surf_def_h(1)%ncsws,                &
3151                                           surf_lsm_h%ncsws,                   &
3152                                           surf_usm_h%ncsws,                   &
3153                                           surf_def_v(0)%ncsws,                &
3154                                           surf_lsm_v(0)%ncsws,                &
3155                                           surf_usm_v(0)%ncsws,                &
3156                                           surf_def_v(1)%ncsws,                &
3157                                           surf_lsm_v(1)%ncsws,                &
3158                                           surf_usm_v(1)%ncsws,                &
3159                                           surf_def_v(2)%ncsws,                &
3160                                           surf_lsm_v(2)%ncsws,                &
3161                                           surf_usm_v(2)%ncsws,                &
3162                                           surf_def_v(3)%ncsws,                &
3163                                           surf_lsm_v(3)%ncsws,                &
3164                                           surf_usm_v(3)%ncsws, n_out ) 
3165
3166            CASE ( 'qrsws' )
3167               CALL surface_data_output_sum_up( surf_def_h(0)%qrsws,           &
3168                                           surf_def_h(1)%qrsws,                &
3169                                           surf_lsm_h%qrsws,                   &
3170                                           surf_usm_h%qrsws,                   &
3171                                           surf_def_v(0)%qrsws,                &
3172                                           surf_lsm_v(0)%qrsws,                &
3173                                           surf_usm_v(0)%qrsws,                &
3174                                           surf_def_v(1)%qrsws,                &
3175                                           surf_lsm_v(1)%qrsws,                &
3176                                           surf_usm_v(1)%qrsws,                &
3177                                           surf_def_v(2)%qrsws,                &
3178                                           surf_lsm_v(2)%qrsws,                &
3179                                           surf_usm_v(2)%qrsws,                &
3180                                           surf_def_v(3)%qrsws,                &
3181                                           surf_lsm_v(3)%qrsws,                &
3182                                           surf_usm_v(3)%qrsws, n_out ) 
3183
3184            CASE ( 'nrsws' )
3185               CALL surface_data_output_sum_up( surf_def_h(0)%nrsws,           &
3186                                           surf_def_h(1)%nrsws,                &
3187                                           surf_lsm_h%nrsws,                   &
3188                                           surf_usm_h%nrsws,                   &
3189                                           surf_def_v(0)%nrsws,                &
3190                                           surf_lsm_v(0)%nrsws,                &
3191                                           surf_usm_v(0)%nrsws,                &
3192                                           surf_def_v(1)%nrsws,                &
3193                                           surf_lsm_v(1)%nrsws,                &
3194                                           surf_usm_v(1)%nrsws,                &
3195                                           surf_def_v(2)%nrsws,                &
3196                                           surf_lsm_v(2)%nrsws,                &
3197                                           surf_usm_v(2)%nrsws,                &
3198                                           surf_def_v(3)%nrsws,                &
3199                                           surf_lsm_v(3)%nrsws,                &
3200                                           surf_usm_v(3)%nrsws, n_out ) 
3201
3202            CASE ( 'sasws' )
3203               CALL surface_data_output_sum_up( surf_def_h(0)%sasws,           &
3204                                           surf_def_h(1)%sasws,                &
3205                                           surf_lsm_h%sasws,                   &
3206                                           surf_usm_h%sasws,                   &
3207                                           surf_def_v(0)%sasws,                &
3208                                           surf_lsm_v(0)%sasws,                &
3209                                           surf_usm_v(0)%sasws,                &
3210                                           surf_def_v(1)%sasws,                &
3211                                           surf_lsm_v(1)%sasws,                &
3212                                           surf_usm_v(1)%sasws,                &
3213                                           surf_def_v(2)%sasws,                &
3214                                           surf_lsm_v(2)%sasws,                &
3215                                           surf_usm_v(2)%sasws,                &
3216                                           surf_def_v(3)%sasws,                &
3217                                           surf_lsm_v(3)%sasws,                &
3218                                           surf_usm_v(3)%sasws, n_out ) 
3219
3220            CASE ( 'q_surface' )
3221               CALL surface_data_output_sum_up( surf_def_h(0)%q_surface,       &
3222                                           surf_def_h(1)%q_surface,            &
3223                                           surf_lsm_h%q_surface,               &
3224                                           surf_usm_h%q_surface,               &
3225                                           surf_def_v(0)%q_surface,            &
3226                                           surf_lsm_v(0)%q_surface,            &
3227                                           surf_usm_v(0)%q_surface,            &
3228                                           surf_def_v(1)%q_surface,            &
3229                                           surf_lsm_v(1)%q_surface,            &
3230                                           surf_usm_v(1)%q_surface,            &
3231                                           surf_def_v(2)%q_surface,            &
3232                                           surf_lsm_v(2)%q_surface,            &
3233                                           surf_usm_v(2)%q_surface,            &
3234                                           surf_def_v(3)%q_surface,            &
3235                                           surf_lsm_v(3)%q_surface,            &
3236                                           surf_usm_v(3)%q_surface, n_out ) 
3237                                           
3238
3239            CASE ( 'theta_surface' )
3240               CALL surface_data_output_sum_up( surf_def_h(0)%pt_surface,      &
3241                                           surf_def_h(1)%pt_surface,           &
3242                                           surf_lsm_h%pt_surface,              &
3243                                           surf_usm_h%pt_surface,              &
3244                                           surf_def_v(0)%pt_surface,           &
3245                                           surf_lsm_v(0)%pt_surface,           &
3246                                           surf_usm_v(0)%pt_surface,           &
3247                                           surf_def_v(1)%pt_surface,           &
3248                                           surf_lsm_v(1)%pt_surface,           &
3249                                           surf_usm_v(1)%pt_surface,           &
3250                                           surf_def_v(2)%pt_surface,           &
3251                                           surf_lsm_v(2)%pt_surface,           &
3252                                           surf_usm_v(2)%pt_surface,           &
3253                                           surf_def_v(3)%pt_surface,           &
3254                                           surf_lsm_v(3)%pt_surface,           &
3255                                           surf_usm_v(3)%pt_surface, n_out ) 
3256
3257            CASE ( 'thetav_surface' )
3258               CALL surface_data_output_sum_up( surf_def_h(0)%vpt_surface,     &
3259                                           surf_def_h(1)%vpt_surface,          &
3260                                           surf_lsm_h%vpt_surface,             &
3261                                           surf_usm_h%vpt_surface,             &
3262                                           surf_def_v(0)%vpt_surface,          &
3263                                           surf_lsm_v(0)%vpt_surface,          &
3264                                           surf_usm_v(0)%vpt_surface,          &
3265                                           surf_def_v(1)%vpt_surface,          &
3266                                           surf_lsm_v(1)%vpt_surface,          &
3267                                           surf_usm_v(1)%vpt_surface,          &
3268                                           surf_def_v(2)%vpt_surface,          &
3269                                           surf_lsm_v(2)%vpt_surface,          &
3270                                           surf_usm_v(2)%vpt_surface,          &
3271                                           surf_def_v(3)%vpt_surface,          &
3272                                           surf_lsm_v(3)%vpt_surface,          &
3273                                           surf_usm_v(3)%vpt_surface, n_out ) 
3274
3275            CASE ( 'rad_net' )
3276               CALL surface_data_output_sum_up( surf_def_h(0)%rad_net,         &
3277                                           surf_def_h(1)%rad_net,              &
3278                                           surf_lsm_h%rad_net,                 &
3279                                           surf_usm_h%rad_net,                 &
3280                                           surf_def_v(0)%rad_net,              &
3281                                           surf_lsm_v(0)%rad_net,              &
3282                                           surf_usm_v(0)%rad_net,              &
3283                                           surf_def_v(1)%rad_net,              &
3284                                           surf_lsm_v(1)%rad_net,              &
3285                                           surf_usm_v(1)%rad_net,              &
3286                                           surf_def_v(2)%rad_net,              &
3287                                           surf_lsm_v(2)%rad_net,              &
3288                                           surf_usm_v(2)%rad_net,              &
3289                                           surf_def_v(3)%rad_net,              &
3290                                           surf_lsm_v(3)%rad_net,              &
3291                                           surf_usm_v(3)%rad_net, n_out ) 
3292
3293            CASE ( 'rad_lw_in' )
3294               CALL surface_data_output_sum_up( surf_def_h(0)%rad_lw_in,       &
3295                                           surf_def_h(1)%rad_lw_in,            &
3296                                           surf_lsm_h%rad_lw_in,               &
3297                                           surf_usm_h%rad_lw_in,               &
3298                                           surf_def_v(0)%rad_lw_in,            &
3299                                           surf_lsm_v(0)%rad_lw_in,            &
3300                                           surf_usm_v(0)%rad_lw_in,            &
3301                                           surf_def_v(1)%rad_lw_in,            &
3302                                           surf_lsm_v(1)%rad_lw_in,            &
3303                                           surf_usm_v(1)%rad_lw_in,            &
3304                                           surf_def_v(2)%rad_lw_in,            &
3305                                           surf_lsm_v(2)%rad_lw_in,            &
3306                                           surf_usm_v(2)%rad_lw_in,            &
3307                                           surf_def_v(3)%rad_lw_in,            &
3308                                           surf_lsm_v(3)%rad_lw_in,            &
3309                                           surf_usm_v(3)%rad_lw_in, n_out ) 
3310
3311            CASE ( 'rad_lw_out' )
3312               CALL surface_data_output_sum_up( surf_def_h(0)%rad_lw_out,      &
3313                                           surf_def_h(1)%rad_lw_out,           &
3314                                           surf_lsm_h%rad_lw_out,              &
3315                                           surf_usm_h%rad_lw_out,              &
3316                                           surf_def_v(0)%rad_lw_out,           &
3317                                           surf_lsm_v(0)%rad_lw_out,           &
3318                                           surf_usm_v(0)%rad_lw_out,           &
3319                                           surf_def_v(1)%rad_lw_out,           &
3320                                           surf_lsm_v(1)%rad_lw_out,           &
3321                                           surf_usm_v(1)%rad_lw_out,           &
3322                                           surf_def_v(2)%rad_lw_out,           &
3323                                           surf_lsm_v(2)%rad_lw_out,           &
3324                                           surf_usm_v(2)%rad_lw_out,           &
3325                                           surf_def_v(3)%rad_lw_out,           &
3326                                           surf_lsm_v(3)%rad_lw_out,           &
3327                                           surf_usm_v(3)%rad_lw_out, n_out ) 
3328
3329            CASE ( 'rad_sw_in' )
3330               CALL surface_data_output_sum_up( surf_def_h(0)%rad_sw_in,       &
3331                                           surf_def_h(1)%rad_sw_in,            &
3332                                           surf_lsm_h%rad_sw_in,               &
3333                                           surf_usm_h%rad_sw_in,               &
3334                                           surf_def_v(0)%rad_sw_in,            &
3335                                           surf_lsm_v(0)%rad_sw_in,            &
3336                                           surf_usm_v(0)%rad_sw_in,            &
3337                                           surf_def_v(1)%rad_sw_in,            &
3338                                           surf_lsm_v(1)%rad_sw_in,            &
3339                                           surf_usm_v(1)%rad_sw_in,            &
3340                                           surf_def_v(2)%rad_sw_in,            &
3341                                           surf_lsm_v(2)%rad_sw_in,            &
3342                                           surf_usm_v(2)%rad_sw_in,            &
3343                                           surf_def_v(3)%rad_sw_in,            &
3344                                           surf_lsm_v(3)%rad_sw_in,            &
3345                                           surf_usm_v(3)%rad_sw_in, n_out ) 
3346
3347            CASE ( 'rad_sw_out' )
3348               CALL surface_data_output_sum_up( surf_def_h(0)%rad_sw_out,      &
3349                                           surf_def_h(1)%rad_sw_out,           &
3350                                           surf_lsm_h%rad_sw_out,              &
3351                                           surf_usm_h%rad_sw_out,              &
3352                                           surf_def_v(0)%rad_sw_out,           &
3353                                           surf_lsm_v(0)%rad_sw_out,           &
3354                                           surf_usm_v(0)%rad_sw_out,           &
3355                                           surf_def_v(1)%rad_sw_out,           &
3356                                           surf_lsm_v(1)%rad_sw_out,           &
3357                                           surf_usm_v(1)%rad_sw_out,           &
3358                                           surf_def_v(2)%rad_sw_out,           &
3359                                           surf_lsm_v(2)%rad_sw_out,           &
3360                                           surf_usm_v(2)%rad_sw_out,           &
3361                                           surf_def_v(3)%rad_sw_out,           &
3362                                           surf_lsm_v(3)%rad_sw_out,           &
3363                                           surf_usm_v(3)%rad_sw_out, n_out ) 
3364
3365            CASE ( 'ghf' )
3366               CALL surface_data_output_sum_up( surf_def_h(0)%ghf,             &
3367                                           surf_def_h(1)%ghf,                  &
3368                                           surf_lsm_h%ghf,                     &
3369                                           surf_usm_h%ghf,                     &
3370                                           surf_def_v(0)%ghf,                  &
3371                                           surf_lsm_v(0)%ghf,                  &
3372                                           surf_usm_v(0)%ghf,                  &
3373                                           surf_def_v(1)%ghf,                  &
3374                                           surf_lsm_v(1)%ghf,                  &
3375                                           surf_usm_v(1)%ghf,                  &
3376                                           surf_def_v(2)%ghf,                  &
3377                                           surf_lsm_v(2)%ghf,                  &
3378                                           surf_usm_v(2)%ghf,                  &
3379                                           surf_def_v(3)%ghf,                  &
3380                                           surf_lsm_v(3)%ghf,                  &
3381                                           surf_usm_v(3)%ghf, n_out )         
3382                                                                               
3383            CASE ( 'r_a' )                                                     
3384               CALL surface_data_output_sum_up( surf_def_h(0)%r_a,             &
3385                                           surf_def_h(1)%r_a,                  &
3386                                           surf_lsm_h%r_a,                     &
3387                                           surf_usm_h%r_a,                     &
3388                                           surf_def_v(0)%r_a,                  &
3389                                           surf_lsm_v(0)%r_a,                  &
3390                                           surf_usm_v(0)%r_a,                  &
3391                                           surf_def_v(1)%r_a,                  &
3392                                           surf_lsm_v(1)%r_a,                  &
3393                                           surf_usm_v(1)%r_a,                  &
3394                                           surf_def_v(2)%r_a,                  &
3395                                           surf_lsm_v(2)%r_a,                  &
3396                                           surf_usm_v(2)%r_a,                  &
3397                                           surf_def_v(3)%r_a,                  &
3398                                           surf_lsm_v(3)%r_a,                  &
3399                                           surf_usm_v(3)%r_a, n_out )         
3400                                                                               
3401            CASE ( 'r_soil' )                                                 
3402               CALL surface_data_output_sum_up( surf_def_h(0)%r_soil,          &
3403                                           surf_def_h(1)%r_soil,               &
3404                                           surf_lsm_h%r_soil,                  &
3405                                           surf_usm_h%r_soil,                  &
3406                                           surf_def_v(0)%r_soil,               &
3407                                           surf_lsm_v(0)%r_soil,               &
3408                                           surf_usm_v(0)%r_soil,               &
3409                                           surf_def_v(1)%r_soil,               &
3410                                           surf_lsm_v(1)%r_soil,               &
3411                                           surf_usm_v(1)%r_soil,               &
3412                                           surf_def_v(2)%r_soil,               &
3413                                           surf_lsm_v(2)%r_soil,               &
3414                                           surf_usm_v(2)%r_soil,               &
3415                                           surf_def_v(3)%r_soil,               &
3416                                           surf_lsm_v(3)%r_soil,               &
3417                                           surf_usm_v(3)%r_soil, n_out ) 
3418
3419            CASE ( 'r_canopy' )
3420               CALL surface_data_output_sum_up( surf_def_h(0)%r_canopy,        &
3421                                           surf_def_h(1)%r_canopy,             &
3422                                           surf_lsm_h%r_canopy,                &
3423                                           surf_usm_h%r_canopy,                &
3424                                           surf_def_v(0)%r_canopy,             &
3425                                           surf_lsm_v(0)%r_canopy,             &
3426                                           surf_usm_v(0)%r_canopy,             &
3427                                           surf_def_v(1)%r_canopy,             &
3428                                           surf_lsm_v(1)%r_canopy,             &
3429                                           surf_usm_v(1)%r_canopy,             &
3430                                           surf_def_v(2)%r_canopy,             &
3431                                           surf_lsm_v(2)%r_canopy,             &
3432                                           surf_usm_v(2)%r_canopy,             &
3433                                           surf_def_v(3)%r_canopy,             &
3434                                           surf_lsm_v(3)%r_canopy,             &
3435                                           surf_usm_v(3)%r_canopy, n_out ) 
3436
3437            CASE ( 'r_s' )
3438               CALL surface_data_output_sum_up( surf_def_h(0)%r_s,             &
3439                                           surf_def_h(1)%r_s,                  &
3440                                           surf_lsm_h%r_s,                     &
3441                                           surf_usm_h%r_s,                     &
3442                                           surf_def_v(0)%r_s,                  &
3443                                           surf_lsm_v(0)%r_s,                  &
3444                                           surf_usm_v(0)%r_s,                  &
3445                                           surf_def_v(1)%r_s,                  &
3446                                           surf_lsm_v(1)%r_s,                  &
3447                                           surf_usm_v(1)%r_s,                  &
3448                                           surf_def_v(2)%r_s,                  &
3449                                           surf_lsm_v(2)%r_s,                  &
3450                                           surf_usm_v(2)%r_s,                  &
3451                                           surf_def_v(3)%r_s,                  &
3452                                           surf_lsm_v(3)%r_s,                  &
3453                                           surf_usm_v(3)%r_s, n_out ) 
3454
3455
3456            CASE ( 'rad_sw_dir' )
3457               CALL surface_data_output_sum_up( surf_def_h(0)%rad_sw_dir,      &
3458                                           surf_def_h(1)%rad_sw_dir,           &
3459                                           surf_lsm_h%rad_sw_dir,              &
3460                                           surf_usm_h%rad_sw_dir,              &
3461                                           surf_def_v(0)%rad_sw_dir,           &
3462                                           surf_lsm_v(0)%rad_sw_dir,           &
3463                                           surf_usm_v(0)%rad_sw_dir,           &
3464                                           surf_def_v(1)%rad_sw_dir,           &
3465                                           surf_lsm_v(1)%rad_sw_dir,           &
3466                                           surf_usm_v(1)%rad_sw_dir,           &
3467                                           surf_def_v(2)%rad_sw_dir,           &
3468                                           surf_lsm_v(2)%rad_sw_dir,           &
3469                                           surf_usm_v(2)%rad_sw_dir,           &
3470                                           surf_def_v(3)%rad_sw_dir,           &
3471                                           surf_lsm_v(3)%rad_sw_dir,           &
3472                                           surf_usm_v(3)%rad_sw_dir, n_out )
3473            CASE ( 'rad_sw_dif' )
3474               CALL surface_data_output_sum_up( surf_def_h(0)%rad_sw_dif,      &
3475                                           surf_def_h(1)%rad_sw_dif,           &
3476                                           surf_lsm_h%rad_sw_dif,              &
3477                                           surf_usm_h%rad_sw_dif,              &
3478                                           surf_def_v(0)%rad_sw_dif,           &
3479                                           surf_lsm_v(0)%rad_sw_dif,           &
3480                                           surf_usm_v(0)%rad_sw_dif,           &
3481                                           surf_def_v(1)%rad_sw_dif,           &
3482                                           surf_lsm_v(1)%rad_sw_dif,           &
3483                                           surf_usm_v(1)%rad_sw_dif,           &
3484                                           surf_def_v(2)%rad_sw_dif,           &
3485                                           surf_lsm_v(2)%rad_sw_dif,           &
3486                                           surf_usm_v(2)%rad_sw_dif,           &
3487                                           surf_def_v(3)%rad_sw_dif,           &
3488                                           surf_lsm_v(3)%rad_sw_dif,           &
3489                                           surf_usm_v(3)%rad_sw_dif, n_out )
3490
3491            CASE ( 'rad_sw_ref' )
3492               CALL surface_data_output_sum_up( surf_def_h(0)%rad_sw_ref,      &
3493                                           surf_def_h(1)%rad_sw_ref,           &
3494                                           surf_lsm_h%rad_sw_ref,              &
3495                                           surf_usm_h%rad_sw_ref,              &
3496                                           surf_def_v(0)%rad_sw_ref,           &
3497                                           surf_lsm_v(0)%rad_sw_ref,           &
3498                                           surf_usm_v(0)%rad_sw_ref,           &
3499                                           surf_def_v(1)%rad_sw_ref,           &
3500                                           surf_lsm_v(1)%rad_sw_ref,           &
3501                                           surf_usm_v(1)%rad_sw_ref,           &
3502                                           surf_def_v(2)%rad_sw_ref,           &
3503                                           surf_lsm_v(2)%rad_sw_ref,           &
3504                                           surf_usm_v(2)%rad_sw_ref,           &
3505                                           surf_def_v(3)%rad_sw_ref,           &
3506                                           surf_lsm_v(3)%rad_sw_ref,           &
3507                                           surf_usm_v(3)%rad_sw_ref, n_out )
3508               
3509            CASE ( 'rad_sw_res' )
3510               CALL surface_data_output_sum_up( surf_def_h(0)%rad_sw_res,      &
3511                                           surf_def_h(1)%rad_sw_res,           &
3512                                           surf_lsm_h%rad_sw_res,              &
3513                                           surf_usm_h%rad_sw_res,              &
3514                                           surf_def_v(0)%rad_sw_res,           &
3515                                           surf_lsm_v(0)%rad_sw_res,           &
3516                                           surf_usm_v(0)%rad_sw_res,           &
3517                                           surf_def_v(1)%rad_sw_res,           &
3518                                           surf_lsm_v(1)%rad_sw_res,           &
3519                                           surf_usm_v(1)%rad_sw_res,           &
3520                                           surf_def_v(2)%rad_sw_res,           &
3521                                           surf_lsm_v(2)%rad_sw_res,           &
3522                                           surf_usm_v(2)%rad_sw_res,           &
3523                                           surf_def_v(3)%rad_sw_res,           &
3524                                           surf_lsm_v(3)%rad_sw_res,           &
3525                                           surf_usm_v(3)%rad_sw_res, n_out )
3526
3527            CASE ( 'rad_lw_dif' )
3528               CALL surface_data_output_sum_up( surf_def_h(0)%rad_lw_dif,      &
3529                                           surf_def_h(1)%rad_lw_dif,           &
3530                                           surf_lsm_h%rad_lw_dif,              &
3531                                           surf_usm_h%rad_lw_dif,              &
3532                                           surf_def_v(0)%rad_lw_dif,           &
3533                                           surf_lsm_v(0)%rad_lw_dif,           &
3534                                           surf_usm_v(0)%rad_lw_dif,           &
3535                                           surf_def_v(1)%rad_lw_dif,           &
3536                                           surf_lsm_v(1)%rad_lw_dif,           &
3537                                           surf_usm_v(1)%rad_lw_dif,           &
3538                                           surf_def_v(2)%rad_lw_dif,           &
3539                                           surf_lsm_v(2)%rad_lw_dif,           &
3540                                           surf_usm_v(2)%rad_lw_dif,           &
3541                                           surf_def_v(3)%rad_lw_dif,           &
3542                                           surf_lsm_v(3)%rad_lw_dif,           &
3543                                           surf_usm_v(3)%rad_lw_dif, n_out )
3544
3545            CASE ( 'rad_lw_ref' )
3546               CALL surface_data_output_sum_up( surf_def_h(0)%rad_lw_ref,      &
3547                                           surf_def_h(1)%rad_lw_ref,           &
3548                                           surf_lsm_h%rad_lw_ref,              &
3549                                           surf_usm_h%rad_lw_ref,              &
3550                                           surf_def_v(0)%rad_lw_ref,           &
3551                                           surf_lsm_v(0)%rad_lw_ref,           &
3552                                           surf_usm_v(0)%rad_lw_ref,           &
3553                                           surf_def_v(1)%rad_lw_ref,           &
3554                                           surf_lsm_v(1)%rad_lw_ref,           &
3555                                           surf_usm_v(1)%rad_lw_ref,           &
3556                                           surf_def_v(2)%rad_lw_ref,           &
3557                                           surf_lsm_v(2)%rad_lw_ref,           &
3558                                           surf_usm_v(2)%rad_lw_ref,           &
3559                                           surf_def_v(3)%rad_lw_ref,           &
3560                                           surf_lsm_v(3)%rad_lw_ref,           &
3561                                           surf_usm_v(3)%rad_lw_ref, n_out )
3562
3563            CASE ( 'rad_lw_res' )
3564               CALL surface_data_output_sum_up( surf_def_h(0)%rad_lw_res,      &
3565                                           surf_def_h(1)%rad_lw_res,           &
3566                                           surf_lsm_h%rad_lw_res,              &
3567                                           surf_usm_h%rad_lw_res,              &
3568                                           surf_def_v(0)%rad_lw_res,           &
3569                                           surf_lsm_v(0)%rad_lw_res,           &
3570                                           surf_usm_v(0)%rad_lw_res,           &
3571                                           surf_def_v(1)%rad_lw_res,           &
3572                                           surf_lsm_v(1)%rad_lw_res,           &
3573                                           surf_usm_v(1)%rad_lw_res,           &
3574                                           surf_def_v(2)%rad_lw_res,           &
3575                                           surf_lsm_v(2)%rad_lw_res,           &
3576                                           surf_usm_v(2)%rad_lw_res,           &
3577                                           surf_def_v(3)%rad_lw_res,           &
3578                                           surf_lsm_v(3)%rad_lw_res,           &
3579                                           surf_usm_v(3)%rad_lw_res, n_out )
3580                                           
3581            CASE ( 'uvw1' )
3582               CALL surface_data_output_sum_up( surf_def_h(0)%uvw_abs,         &
3583                                           surf_def_h(1)%uvw_abs,              &
3584                                           surf_lsm_h%uvw_abs,                 &
3585                                           surf_usm_h%uvw_abs,                 &
3586                                           surf_def_v(0)%uvw_abs,              &
3587                                           surf_lsm_v(0)%uvw_abs,              &
3588                                           surf_usm_v(0)%uvw_abs,              &
3589                                           surf_def_v(1)%uvw_abs,              &
3590                                           surf_lsm_v(1)%uvw_abs,              &
3591                                           surf_usm_v(1)%uvw_abs,              &
3592                                           surf_def_v(2)%uvw_abs,              &
3593                                           surf_lsm_v(2)%uvw_abs,              &
3594                                           surf_usm_v(2)%uvw_abs,              &
3595                                           surf_def_v(3)%uvw_abs,              &
3596                                           surf_lsm_v(3)%uvw_abs,              &
3597                                           surf_usm_v(3)%uvw_abs, n_out )                               
3598
3599         END SELECT
3600      ENDDO
3601     
3602   
3603   END SUBROUTINE surface_data_output_averaging
3604   
3605!------------------------------------------------------------------------------!
3606! Description:
3607! ------------
3608!> Sum-up the surface data for average output variables. 
3609!------------------------------------------------------------------------------!   
3610   SUBROUTINE surface_data_output_sum_up( var_def_h0, var_def_h1,              &
3611                                     var_lsm_h,  var_usm_h,                    &
3612                                     var_def_v0, var_lsm_v0, var_usm_v0,       &
3613                                     var_def_v1, var_lsm_v1, var_usm_v1,       &
3614                                     var_def_v2, var_lsm_v2, var_usm_v2,       &
3615                                     var_def_v3, var_lsm_v3, var_usm_v3, n_out )
3616   
3617      IMPLICIT NONE
3618
3619      INTEGER(iwp) ::  m          !< running index for surface elements
3620      INTEGER(iwp) ::  n_out      !< index for output variable
3621      INTEGER(iwp) ::  n_surf     !< running index for surface elements
3622     
3623      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_h0 !< output variable at upward-facing default-type surfaces
3624      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_h1 !< output variable at downward-facing default-type surfaces
3625      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_h  !< output variable at upward-facing natural-type surfaces
3626      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_h  !< output variable at upward-facing urban-type surfaces
3627      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v0 !< output variable at northward-facing default-type surfaces
3628      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v1 !< output variable at southward-facing default-type surfaces
3629      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v2 !< output variable at eastward-facing default-type surfaces
3630      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v3 !< output variable at westward-facing default-type surfaces
3631      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v0 !< output variable at northward-facing natural-type surfaces
3632      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v1 !< output variable at southward-facing natural-type surfaces
3633      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v2 !< output variable at eastward-facing natural-type surfaces
3634      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v3 !< output variable at westward-facing natural-type surfaces
3635      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v0 !< output variable at northward-facing urban-type surfaces
3636      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v1 !< output variable at southward-facing urban-type surfaces
3637      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v2 !< output variable at eastward-facing urban-type surfaces
3638      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v3 !< output variable at westward-facing urban-type surfaces
3639     
3640!     
3641!--   Set counter variable to zero before the variable is written to
3642!--   the output array.
3643      n_surf = 0
3644     
3645!
3646!--   Write the horizontal surfaces.
3647!--   Before each the variable is written to the output data structure, first
3648!--   check if the variable for the respective surface type is defined.
3649!--   If a variable is not defined, skip the block and increment the counter
3650!--   variable by the number of surface elements of this type. Usually this
3651!--   is zere, however, there might be the situation that e.g. urban surfaces
3652!--   are defined but the respective variable is not allocated for this surface
3653!--   type. To write the data on the exact position, increment the counter.
3654      IF ( ALLOCATED( var_def_h0 ) )  THEN
3655         DO  m = 1, surf_def_h(0)%ns 
3656            n_surf                        = n_surf + 1
3657            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3658                                          + var_def_h0(m)
3659         ENDDO
3660      ELSE
3661         n_surf = n_surf + surf_def_h(0)%ns 
3662      ENDIF
3663      IF ( ALLOCATED( var_def_h1 ) )  THEN
3664         DO  m = 1, surf_def_h(1)%ns 
3665            n_surf                   = n_surf + 1
3666            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3667                                          + var_def_h1(m)
3668         ENDDO
3669      ELSE
3670         n_surf = n_surf + surf_def_h(1)%ns
3671      ENDIF
3672      IF ( ALLOCATED( var_lsm_h ) )  THEN
3673         DO  m = 1, surf_lsm_h%ns 
3674            n_surf                        = n_surf + 1
3675            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3676                                          + var_lsm_h(m)
3677         ENDDO
3678      ELSE
3679         n_surf = n_surf + surf_lsm_h%ns
3680      ENDIF
3681      IF ( ALLOCATED( var_usm_h ) )  THEN
3682         DO  m = 1, surf_usm_h%ns 
3683            n_surf                        = n_surf + 1
3684            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3685                                          + var_usm_h(m)
3686         ENDDO
3687      ELSE
3688         n_surf = n_surf + surf_usm_h%ns
3689      ENDIF
3690!
3691!--   Write northward-facing
3692      IF ( ALLOCATED( var_def_v0 ) )  THEN
3693         DO  m = 1, surf_def_v(0)%ns 
3694            n_surf                        = n_surf + 1
3695            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3696                                          + var_def_v0(m)
3697         ENDDO
3698      ELSE
3699         n_surf = n_surf + surf_def_v(0)%ns
3700      ENDIF
3701      IF ( ALLOCATED( var_lsm_v0 ) )  THEN
3702         DO  m = 1, surf_lsm_v(0)%ns 
3703            n_surf                        = n_surf + 1
3704            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3705                                          + var_lsm_v0(m)
3706         ENDDO
3707      ELSE
3708         n_surf = n_surf + surf_lsm_v(0)%ns
3709      ENDIF
3710      IF ( ALLOCATED( var_usm_v0 ) )  THEN
3711         DO  m = 1, surf_usm_v(0)%ns 
3712            n_surf                        = n_surf + 1
3713            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3714                                          + var_usm_v0(m)
3715         ENDDO
3716      ELSE
3717         n_surf = n_surf + surf_usm_v(0)%ns
3718      ENDIF
3719!
3720!--   Write southward-facing
3721      IF ( ALLOCATED( var_def_v1 ) )  THEN
3722         DO  m = 1, surf_def_v(1)%ns 
3723            n_surf                        = n_surf + 1
3724            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3725                                          + var_def_v1(m)
3726         ENDDO
3727      ELSE
3728         n_surf = n_surf + surf_def_v(1)%ns
3729      ENDIF
3730      IF ( ALLOCATED( var_lsm_v1 ) )  THEN
3731         DO  m = 1, surf_lsm_v(1)%ns 
3732            n_surf                        = n_surf + 1
3733            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3734                                          + var_lsm_v1(m)
3735         ENDDO
3736      ELSE
3737         n_surf = n_surf + surf_lsm_v(1)%ns
3738      ENDIF
3739      IF ( ALLOCATED( var_usm_v1 ) )  THEN
3740         DO  m = 1, surf_usm_v(1)%ns 
3741            n_surf                        = n_surf + 1
3742            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3743                                          + var_usm_v1(m)
3744         ENDDO
3745      ELSE
3746         n_surf = n_surf + surf_usm_v(1)%ns
3747      ENDIF
3748!
3749!--   Write eastward-facing
3750      IF ( ALLOCATED( var_def_v2 ) )  THEN
3751         DO  m = 1, surf_def_v(2)%ns 
3752            n_surf                        = n_surf + 1
3753            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3754                                          + var_def_v2(m)
3755         ENDDO
3756      ELSE
3757         n_surf = n_surf + surf_def_v(2)%ns
3758      ENDIF
3759      IF ( ALLOCATED( var_lsm_v2 ) )  THEN
3760         DO  m = 1, surf_lsm_v(2)%ns 
3761            n_surf                        = n_surf + 1
3762            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3763                                          + var_lsm_v2(m)
3764         ENDDO
3765      ELSE
3766         n_surf = n_surf + surf_lsm_v(2)%ns
3767      ENDIF
3768      IF ( ALLOCATED( var_usm_v2 ) )  THEN
3769         DO  m = 1, surf_usm_v(2)%ns 
3770            n_surf                        = n_surf + 1
3771            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3772                                          + var_usm_v2(m)
3773         ENDDO
3774      ELSE
3775         n_surf = n_surf + surf_usm_v(2)%ns
3776      ENDIF
3777!
3778!--   Write westward-facing
3779      IF ( ALLOCATED( var_def_v3 ) )  THEN
3780         DO  m = 1, surf_def_v(3)%ns 
3781            n_surf                        = n_surf + 1
3782            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3783                                          + var_def_v3(m)
3784         ENDDO
3785      ELSE
3786         n_surf = n_surf + surf_def_v(3)%ns
3787      ENDIF
3788      IF ( ALLOCATED( var_lsm_v3 ) )  THEN
3789         DO  m = 1, surf_lsm_v(3)%ns 
3790            n_surf                        = n_surf + 1
3791            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3792                                          + var_lsm_v3(m)
3793         ENDDO
3794      ELSE
3795         n_surf = n_surf + surf_lsm_v(3)%ns
3796      ENDIF
3797      IF ( ALLOCATED( var_usm_v3 ) )  THEN
3798         DO  m = 1, surf_usm_v(3)%ns 
3799            n_surf                        = n_surf + 1
3800            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
3801                                          + var_usm_v3(m)
3802         ENDDO
3803      ELSE
3804         n_surf = n_surf + surf_usm_v(3)%ns
3805      ENDIF
3806   
3807   END SUBROUTINE surface_data_output_sum_up
3808   
3809!------------------------------------------------------------------------------!
3810! Description:
3811! ------------
3812!> Collect the surface data from different types and different orientation.
3813!------------------------------------------------------------------------------!
3814   SUBROUTINE surface_data_output_collect( var_def_h0, var_def_h1,             &
3815                                      var_lsm_h,  var_usm_h,                   &
3816                                      var_def_v0, var_lsm_v0, var_usm_v0,      &
3817                                      var_def_v1, var_lsm_v1, var_usm_v1,      &
3818                                      var_def_v2, var_lsm_v2, var_usm_v2,      &
3819                                      var_def_v3, var_lsm_v3, var_usm_v3 )                                               
3820   
3821      IMPLICIT NONE
3822
3823      INTEGER(iwp) ::  m      !< running index for surface elements
3824      INTEGER(iwp) ::  n_surf !< running index for surface elements
3825     
3826      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_h0 !< output variable at upward-facing default-type surfaces
3827      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_h1 !< output variable at downward-facing default-type surfaces
3828      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_h  !< output variable at upward-facing natural-type surfaces
3829      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_h  !< output variable at upward-facing urban-type surfaces
3830      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v0 !< output variable at northward-facing default-type surfaces
3831      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v1 !< output variable at southward-facing default-type surfaces
3832      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v2 !< output variable at eastward-facing default-type surfaces
3833      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v3 !< output variable at westward-facing default-type surfaces
3834      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v0 !< output variable at northward-facing natural-type surfaces
3835      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v1 !< output variable at southward-facing natural-type surfaces
3836      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v2 !< output variable at eastward-facing natural-type surfaces
3837      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v3 !< output variable at westward-facing natural-type surfaces
3838      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v0 !< output variable at northward-facing urban-type surfaces
3839      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v1 !< output variable at southward-facing urban-type surfaces
3840      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v2 !< output variable at eastward-facing urban-type surfaces
3841      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v3 !< output variable at westward-facing urban-type surfaces
3842     
3843!     
3844!--   Set counter variable to zero before the variable is written to
3845!--   the output array.
3846      n_surf = 0
3847     
3848!
3849!--   Write the horizontal surfaces.
3850!--   Before each the variable is written to the output data structure, first
3851!--   check if the variable for the respective surface type is defined.
3852!--   If a variable is not defined, skip the block and increment the counter
3853!--   variable by the number of surface elements of this type. Usually this
3854!--   is zere, however, there might be the situation that e.g. urban surfaces
3855!--   are defined but the respective variable is not allocated for this surface
3856!--   type. To write the data on the exact position, increment the counter.
3857      IF ( ALLOCATED( var_def_h0 ) )  THEN
3858         DO  m = 1, surf_def_h(0)%ns 
3859            n_surf                   = n_surf + 1
3860            surfaces%var_out(n_surf) = var_def_h0(m)
3861         ENDDO
3862      ELSE
3863         n_surf = n_surf + surf_def_h(0)%ns 
3864      ENDIF
3865      IF ( ALLOCATED( var_def_h1 ) )  THEN
3866         DO  m = 1, surf_def_h(1)%ns 
3867            n_surf                   = n_surf + 1
3868            surfaces%var_out(n_surf) = var_def_h1(m)
3869         ENDDO
3870      ELSE
3871         n_surf = n_surf + surf_def_h(1)%ns
3872      ENDIF
3873      IF ( ALLOCATED( var_lsm_h ) )  THEN
3874         DO  m = 1, surf_lsm_h%ns 
3875            n_surf                   = n_surf + 1
3876            surfaces%var_out(n_surf) = var_lsm_h(m)
3877         ENDDO
3878      ELSE
3879         n_surf = n_surf + surf_lsm_h%ns
3880      ENDIF
3881      IF ( ALLOCATED( var_usm_h ) )  THEN
3882         DO  m = 1, surf_usm_h%ns 
3883            n_surf                   = n_surf + 1
3884            surfaces%var_out(n_surf) = var_usm_h(m)
3885         ENDDO
3886      ELSE
3887         n_surf = n_surf + surf_usm_h%ns
3888      ENDIF
3889!
3890!--   Write northward-facing
3891      IF ( ALLOCATED( var_def_v0 ) )  THEN
3892         DO  m = 1, surf_def_v(0)%ns 
3893            n_surf                   = n_surf + 1
3894            surfaces%var_out(n_surf) = var_def_v0(m)
3895         ENDDO
3896      ELSE
3897         n_surf = n_surf + surf_def_v(0)%ns
3898      ENDIF
3899      IF ( ALLOCATED( var_lsm_v0 ) )  THEN
3900         DO  m = 1, surf_lsm_v(0)%ns 
3901            n_surf                   = n_surf + 1
3902            surfaces%var_out(n_surf) = var_lsm_v0(m)
3903         ENDDO
3904      ELSE
3905         n_surf = n_surf + surf_lsm_v(0)%ns
3906      ENDIF
3907      IF ( ALLOCATED( var_usm_v0 ) )  THEN
3908         DO  m = 1, surf_usm_v(0)%ns 
3909            n_surf                   = n_surf + 1
3910            surfaces%var_out(n_surf) = var_usm_v0(m)
3911         ENDDO
3912      ELSE
3913         n_surf = n_surf + surf_usm_v(0)%ns
3914      ENDIF
3915!
3916!--   Write southward-facing
3917      IF ( ALLOCATED( var_def_v1 ) )  THEN
3918         DO  m = 1, surf_def_v(1)%ns 
3919            n_surf                   = n_surf + 1
3920            surfaces%var_out(n_surf) = var_def_v1(m)
3921         ENDDO
3922      ELSE
3923         n_surf = n_surf + surf_def_v(1)%ns
3924      ENDIF
3925      IF ( ALLOCATED( var_lsm_v1 ) )  THEN
3926         DO  m = 1, surf_lsm_v(1)%ns 
3927            n_surf                   = n_surf + 1
3928            surfaces%var_out(n_surf) = var_lsm_v1(m)
3929         ENDDO
3930      ELSE
3931         n_surf = n_surf + surf_lsm_v(1)%ns
3932      ENDIF
3933      IF ( ALLOCATED( var_usm_v1 ) )  THEN
3934         DO  m = 1, surf_usm_v(1)%ns 
3935            n_surf                   = n_surf + 1
3936            surfaces%var_out(n_surf) = var_usm_v1(m)
3937         ENDDO
3938      ELSE
3939         n_surf = n_surf + surf_usm_v(1)%ns
3940      ENDIF
3941!
3942!--   Write eastward-facing
3943      IF ( ALLOCATED( var_def_v2 ) )  THEN
3944         DO  m = 1, surf_def_v(2)%ns 
3945            n_surf                   = n_surf + 1
3946            surfaces%var_out(n_surf) = var_def_v2(m)
3947         ENDDO
3948      ELSE
3949         n_surf = n_surf + surf_def_v(2)%ns
3950      ENDIF
3951      IF ( ALLOCATED( var_lsm_v2 ) )  THEN
3952         DO  m = 1, surf_lsm_v(2)%ns 
3953            n_surf                   = n_surf + 1
3954            surfaces%var_out(n_surf) = var_lsm_v2(m)
3955         ENDDO
3956      ELSE
3957         n_surf = n_surf + surf_lsm_v(2)%ns
3958      ENDIF
3959      IF ( ALLOCATED( var_usm_v2 ) )  THEN
3960         DO  m = 1, surf_usm_v(2)%ns 
3961            n_surf                   = n_surf + 1
3962            surfaces%var_out(n_surf) = var_usm_v2(m)
3963         ENDDO
3964      ELSE
3965         n_surf = n_surf + surf_usm_v(2)%ns
3966      ENDIF
3967!
3968!--   Write westward-facing
3969      IF ( ALLOCATED( var_def_v3 ) )  THEN
3970         DO  m = 1, surf_def_v(3)%ns 
3971            n_surf                   = n_surf + 1
3972            surfaces%var_out(n_surf) = var_def_v3(m)
3973         ENDDO
3974      ELSE
3975         n_surf = n_surf + surf_def_v(3)%ns
3976      ENDIF
3977      IF ( ALLOCATED( var_lsm_v3 ) )  THEN
3978         DO  m = 1, surf_lsm_v(3)%ns 
3979            n_surf                   = n_surf + 1
3980            surfaces%var_out(n_surf) = var_lsm_v3(m)
3981         ENDDO
3982      ELSE
3983         n_surf = n_surf + surf_lsm_v(3)%ns
3984      ENDIF
3985      IF ( ALLOCATED( var_usm_v3 ) )  THEN
3986         DO  m = 1, surf_usm_v(3)%ns 
3987            n_surf                   = n_surf + 1
3988            surfaces%var_out(n_surf) = var_usm_v3(m)
3989         ENDDO
3990      ELSE
3991         n_surf = n_surf + surf_usm_v(3)%ns
3992      ENDIF
3993   
3994   END SUBROUTINE surface_data_output_collect
3995   
3996!------------------------------------------------------------------------------!
3997! Description:
3998! ------------
3999!> Parin for output of surface parameters
4000!------------------------------------------------------------------------------!
4001    SUBROUTINE surface_data_output_parin
4002
4003       IMPLICIT NONE
4004
4005       CHARACTER (LEN=80) ::  line  !< dummy string that contains the current line of the parameter file
4006       
4007
4008       NAMELIST /surface_data_output_parameters/                               &
4009                                  averaging_interval_surf, data_output_surf,   &
4010                                  dt_dosurf, dt_dosurf_av,                     &
4011                                  skip_time_dosurf, skip_time_dosurf_av,       &
4012                                  to_netcdf, to_vtk
4013                                 
4014       line = ' '
4015 
4016!
4017!--    Try to find the namelist
4018       REWIND ( 11 )
4019       line = ' '
4020       DO WHILE ( INDEX( line, '&surface_data_output_parameters' ) == 0 )
4021          READ ( 11, '(A)', END=14 )  line
4022       ENDDO
4023       BACKSPACE ( 11 )
4024
4025!
4026!--    Read namelist
4027       READ ( 11, surface_data_output_parameters, ERR = 10 )
4028!
4029!--    Set flag that indicates that surface data output is switched on
4030       surface_output = .TRUE.
4031       GOTO 14
4032
4033 10    BACKSPACE( 11 )
4034       READ( 11 , '(A)') line
4035       CALL parin_fail_message( 'surface_data_output_parameters', line )     
4036       
4037 14    CONTINUE
4038       
4039
4040    END SUBROUTINE surface_data_output_parin
4041   
4042   
4043!------------------------------------------------------------------------------!
4044! Description:
4045! ------------
4046!> Check the input parameters for consistency. Further pre-process the given
4047!> output variables, i.e. separate them into average and non-average output
4048!> variables and map them onto internal output array.
4049!------------------------------------------------------------------------------!
4050    SUBROUTINE surface_data_output_check_parameters
4051
4052       USE control_parameters,                                                 &
4053           ONLY:  averaging_interval, dt_data_output, message_string
4054
4055       IMPLICIT NONE
4056
4057       CHARACTER(LEN=100) ::  trimvar !< dummy for single output variable
4058       CHARACTER(LEN=100) ::  unit    !< dummy for unit of output variable
4059
4060       INTEGER(iwp) ::  av    !< id indicating average or non-average data output
4061       INTEGER(iwp) ::  ilen  !< string length
4062       INTEGER(iwp) ::  n_out !< running index for number of output variables
4063
4064!
4065!--    Check the average interval
4066       IF ( averaging_interval_surf == 9999999.9_wp )  THEN
4067          averaging_interval_surf = averaging_interval
4068       ENDIF
4069!
4070!--    Set the default data-output interval dt_data_output if necessary
4071       IF ( dt_dosurf    == 9999999.9_wp )  dt_dosurf    = dt_data_output
4072       IF ( dt_dosurf_av == 9999999.9_wp )  dt_dosurf_av = dt_data_output
4073
4074       IF ( averaging_interval_surf > dt_dosurf_av )  THEN
4075          WRITE( message_string, * )  'averaging_interval_surf = ',            &
4076                averaging_interval_surf, ' must be <= dt_dosurf_av = ',        &
4077                dt_dosurf_av
4078          CALL message( 'surface_data_output_check_parameters',                &
4079                        'PA0087', 1, 2, 0, 6, 0 )
4080       ENDIF
4081       
4082#if ! defined( __netcdf4_parallel )
4083!
4084!--    Surface output via NetCDF requires parallel NetCDF
4085       IF ( to_netcdf )  THEN
4086          message_string = 'to_netcdf = .True. requires parallel NetCDF'
4087          CALL message( 'surface_data_output_check_parameters',                &
4088                        'PA0116', 1, 2, 0, 6, 0 )
4089       ENDIF
4090#endif
4091!
4092!--   Count number of output variables and separate output strings for
4093!--   average and non-average output variables.
4094      n_out = 0
4095      DO WHILE ( data_output_surf(n_out+1)(1:1) /= ' ' )
4096
4097         n_out = n_out + 1
4098         ilen = LEN_TRIM( data_output_surf(n_out) )
4099         trimvar = TRIM( data_output_surf(n_out) )
4100
4101!
4102!--      Check for data averaging
4103         av = 0
4104         IF ( ilen > 3 )  THEN
4105            IF ( data_output_surf(n_out)(ilen-2:ilen) == '_av' )  THEN
4106               trimvar = data_output_surf(n_out)(1:ilen-3)
4107               av      = 1
4108            ENDIF
4109         ENDIF
4110
4111         dosurf_no(av) = dosurf_no(av) + 1
4112         dosurf(av,dosurf_no(av)) = TRIM( trimvar )
4113
4114!
4115!--      Check if all output variables are known and assign a unit
4116         unit = 'not set'
4117         SELECT CASE ( TRIM( trimvar ) )
4118
4119            CASE ( 'css', 'cssws', 'qsws_liq', 'qsws_soil', 'qsws_veg' )
4120               message_string = TRIM( trimvar ) //                             &
4121                             ' is not yet implemented in the surface output'
4122               CALL message( 'surface_data_output_check_parameters',           &
4123                             'PA0087', 1, 2, 0, 6, 0 )
4124
4125            CASE ( 'us', 'uvw1' )
4126               unit = 'm/s'
4127
4128            CASE ( 'ss', 'qcs', 'ncs', 'qrs', 'nrs' )
4129               unit = '1'
4130
4131            CASE ( 'z0', 'z0h', 'z0q', 'ol' )
4132               unit = 'm'
4133
4134            CASE ( 'ts', 'theta1', 'thetav1', 'theta_surface', 'thetav_surface' )
4135               unit = 'K'
4136
4137            CASE ( 'usws', 'vsws' )
4138               unit = 'm2/s2'
4139           
4140            CASE ( 'qcsws', 'ncsws', 'qrsws', 'nrsws', 'sasws' )
4141
4142            CASE ( 'shf' )
4143               unit = 'K m/s'
4144
4145            CASE ( 'qsws' )
4146               unit = 'kg/kg m/s'
4147
4148            CASE ( 'ssws' )
4149               unit = 'kg/m2/s'
4150
4151            CASE ( 'qs', 'q_surface', 'qv1' )
4152               unit = 'kg/kg'
4153
4154            CASE ( 'rad_net' )
4155               unit = 'W/m2'
4156
4157            CASE ( 'rad_lw_in', 'rad_lw_out', 'rad_lw_dif', 'rad_lw_ref',     &
4158                   'rad_lw_res' )
4159               unit = 'W/m2'
4160
4161            CASE ( 'rad_sw_in', 'rad_sw_out', 'rad_sw_dif', 'rad_sw_ref',     &
4162                   'rad_sw_res', 'rad_sw_dir' )
4163               unit = 'W/m2'
4164
4165            CASE ( 'ghf' )
4166               unit = 'W/m2'
4167
4168            CASE ( 'r_a', 'r_canopy', 'r_soil', 'r_s' )
4169               unit = 's/m'
4170
4171            CASE DEFAULT
4172               message_string = TRIM( trimvar ) //                             &
4173                             ' is not part of the surface output'
4174               CALL message( 'surface_data_output_check_parameters',           &
4175                             'PA0087', 1, 2, 0, 6, 0 )
4176         END SELECT
4177
4178         dosurf_unit(av,dosurf_no(av)) = unit
4179
4180       ENDDO
4181
4182    END SUBROUTINE surface_data_output_check_parameters
4183   
4184   
4185!------------------------------------------------------------------------------!
4186! Description:
4187! ------------
4188!> Last action.
4189!------------------------------------------------------------------------------!
4190    SUBROUTINE surface_data_output_last_action( av )
4191 
4192      USE control_parameters,                                                  &
4193          ONLY:  io_blocks, io_group
4194
4195      USE pegrid,                                                              &
4196          ONLY:  comm2d, ierr
4197
4198      IMPLICIT NONE
4199     
4200      INTEGER(iwp) ::  av     !< id indicating average or non-average data output
4201      INTEGER(iwp) ::  i      !< loop index
4202
4203!
4204!--   Return, if nothing to output
4205      IF ( dosurf_no(av) == 0 )  RETURN
4206!
4207!--   If output to VTK files is enabled, check if files are open and write
4208!--   an end-of-file statement.
4209      IF ( to_vtk )  THEN
4210         CALL check_open( 25+av )
4211!
4212!--      Write time coordinate
4213         DO  i = 0, io_blocks-1
4214            IF ( i == io_group )  THEN
4215               WRITE ( 25+av )  LEN_TRIM( 'END' )
4216               WRITE ( 25+av )  'END'
4217            ENDIF
4218#if defined( __parallel )
4219            CALL MPI_BARRIER( comm2d, ierr )
4220#endif
4221         ENDDO   
4222      ENDIF
4223
4224    END SUBROUTINE surface_data_output_last_action   
4225
4226
4227END MODULE surface_data_output_mod
Note: See TracBrowser for help on using the repository browser.