source: palm/trunk/SOURCE/surface_output_mod.f90 @ 3483

Last change on this file since 3483 was 3483, checked in by raasch, 3 years ago

bugfix: misplaced positions of cpp-directives for netCDF and MPI fixed; output format limited to a maximum line length of 80

  • Property svn:keywords set to Id
File size: 178.5 KB
Line 
1!> @file surface_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-2018 Leibniz Universitaet Hannover
18!------------------------------------------------------------------------------!
19!
20! Current revisions:
21! ------------------
22!
23!
24! Former revisions:
25! -----------------
26! $Id: surface_output_mod.f90 3483 2018-11-02 14:19:26Z raasch $
27! bugfix: missed directives for MPI added
28!
29! 3421 2018-10-24 18:39:32Z gronemeier
30! Add output variables
31! Write data into binary file
32! Initial implementation from Klaus Ketelsen and Matthias Suehring
33!
34! 3420 2018-10-24 17:30:08Z gronemeier
35!
36! Description:
37! ------------
38!> Generate output for surface data.
39!
40!------------------------------------------------------------------------------!
41
42MODULE surface_output_mod
43
44   USE kinds
45
46   USE arrays_3d,                                                              &
47       ONLY:  zu, zw
48   USE control_parameters,                                                     &
49       ONLY:  surface_data_output
50   USE grid_variables,                                                         &
51       ONLY: dx,dy
52   USE indices,                                                                &
53       ONLY: nxl, nxr, nys, nyn, nzb, nzt
54   USE surface_mod,                                                            &
55       ONLY:  surf_def_h, surf_def_v, surf_lsm_h, surf_lsm_v,                  &
56              surf_usm_h, surf_usm_v
57
58   IMPLICIT NONE
59
60   TYPE surf_out                !< data structure which contains all surfaces elements of all types on subdomain
61   
62      INTEGER(iwp) ::  ns       !< number of surface elements
63      INTEGER(iwp) ::  npoints  !< number of points  / vertices which define a surface element
64     
65      REAL(wp) ::  fillvalue = -9999.9_wp !< fillvalue for surface elements which are not defined
66     
67      REAL(wp), DIMENSION(:), ALLOCATABLE   ::  var_out  !< output variables
68      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  var_av   !< variables used for averaging
69      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  points   !< points  / vertices of a surface element
70      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  polygons !< polygon data of a surface element
71   END TYPE surf_out
72   
73   CHARACTER(LEN=100), DIMENSION(300)       ::  data_output_surf = ' '  !< namelist variable which describes the output variables
74   CHARACTER(LEN=100), DIMENSION(0:1,300)   ::  dosurf = ' '            !< internal variable which describes the output variables and separates
75                                                                        !< averaged from non-averaged output
76   
77   INTEGER(iwp) ::  average_count_surf = 0                !< number of ensemble members used for averaging
78   INTEGER(iwp) ::  dosurf_no(0:1) = 0                    !< number of surface output quantities
79
80   LOGICAL :: first_output(0:1) = .FALSE.                 !< true if first output was already called
81
82   REAL(wp) ::  averaging_interval_surf  = 9999999.9_wp   !< averaging interval
83   REAL(wp) ::  dt_dosurf = 9999999.9_wp                  !< time interval for instantaneous data output
84   REAL(wp) ::  dt_dosurf_av = 9999999.9_wp               !< time interval for averaged data output
85   REAL(wp) ::  skip_time_dosurf = 0.0_wp                 !< skip time for instantaneous data output
86   REAL(wp) ::  skip_time_dosurf_av = 0.0_wp              !< skip time for averaged data output
87   REAL(wp) ::  time_dosurf = 0.0_wp                      !< internal counter variable to check for instantaneous data output
88   REAL(wp) ::  time_dosurf_av = 0.0_wp                   !< internal counter variable to check for averaged data output
89
90   
91   TYPE(surf_out) ::  surfaces      !< variable which contains all required output information
92   
93   SAVE
94
95   PRIVATE
96
97   INTERFACE  surface_output
98      MODULE PROCEDURE surface_output
99   END INTERFACE  surface_output
100   
101   INTERFACE  surface_output_averaging
102      MODULE PROCEDURE surface_output_averaging
103   END INTERFACE  surface_output_averaging
104   
105   INTERFACE  surface_output_check_parameters
106      MODULE PROCEDURE surface_output_check_parameters
107   END INTERFACE  surface_output_check_parameters
108   
109   INTERFACE  surface_output_init
110      MODULE PROCEDURE surface_output_init
111   END INTERFACE  surface_output_init
112   
113   INTERFACE  surface_output_parin
114      MODULE PROCEDURE surface_output_parin
115   END INTERFACE  surface_output_parin
116
117!
118!--Public subroutines
119   PUBLIC surface_output, surface_output_averaging,                            &
120          surface_output_check_parameters, surface_output_init,                &
121          surface_output_parin
122!
123!--Public variables
124   PUBLIC average_count_surf, averaging_interval_surf, dt_dosurf, dt_dosurf_av,&
125          skip_time_dosurf, skip_time_dosurf_av, time_dosurf, time_dosurf_av
126
127 CONTAINS
128
129!------------------------------------------------------------------------------!
130! Description:
131! ------------
132!> Initialization surface-data output data structure: calculation of vertices
133!> and polygon data for the surface elements, allocation of required arrays.
134!------------------------------------------------------------------------------!
135   SUBROUTINE surface_output_init
136      IMPLICIT NONE
137
138      INTEGER(iwp) ::  i     !< grid index in x-direction, also running variable for counting non-average data output
139      INTEGER(iwp) ::  ilen  !< string length
140      INTEGER(iwp) ::  j     !< grid index in y-direction, also running variable for counting average data output
141      INTEGER(iwp) ::  k     !< grid index in z-direction
142      INTEGER(iwp) ::  l     !< running index for surface-element orientation
143      INTEGER(iwp) ::  m     !< running index for surface elements
144      INTEGER(iwp) ::  n_out !< running index for number of output variables
145     
146     
147      INTEGER(iwp) ::  npg   !< counter variable for all surface elements ( or polygons )
148     
149      INTEGER(iwp), ALLOCATABLE, DIMENSION(:,:,:) ::  point_index !< dummy array used to check where the reference points for surface polygons are located
150           
151!
152!--   Determine the number of surface elements on subdomain
153      surfaces%ns = surf_def_h(0)%ns + surf_lsm_h%ns + surf_usm_h%ns           & !horizontal upward-facing
154                  + surf_def_h(1)%ns                                           & !horizontal downard-facing   
155                  + surf_def_v(0)%ns + surf_lsm_v(0)%ns + surf_usm_v(0)%ns     & !northward-facing
156                  + surf_def_v(1)%ns + surf_lsm_v(1)%ns + surf_usm_v(1)%ns     & !southward-facing   
157                  + surf_def_v(2)%ns + surf_lsm_v(2)%ns + surf_usm_v(2)%ns     & !westward-facing   
158                  + surf_def_v(3)%ns + surf_lsm_v(3)%ns + surf_usm_v(3)%ns       !eastward-facing   
159!
160!--   Allocate output variable and set to _FillValue attribute
161      ALLOCATE ( surfaces%var_out(1:surfaces%ns) )
162      surfaces%var_out = surfaces%fillvalue
163!
164!--   If there is an output of time average output variables, allocate the
165!--   required array.
166      IF ( dosurf_no(1) > 0 )  THEN
167         ALLOCATE ( surfaces%var_av(1:surfaces%ns,1:dosurf_no(1)) )
168         surfaces%var_av = 0.0_wp
169      ENDIF
170!
171!--   Initialize points and polygon data.
172!--   In a first step, count the number of points which are defining
173!--   the surfaces and the polygons.
174      ALLOCATE( point_index(nzb:nzt+1,nys-1:nyn+1,nxl-1:nxr+1) )
175      point_index = -1
176!
177!--   Horizontal default surfaces
178      surfaces%npoints = 0
179      DO  l = 0, 1
180         DO  m = 1, surf_def_h(0)%ns
181!
182!--         Determine the indices of the respective grid cell inside the topography
183            i = surf_def_h(0)%i(m) + surf_def_h(0)%ioff
184            j = surf_def_h(0)%j(m) + surf_def_h(0)%joff
185            k = surf_def_h(0)%k(m) + surf_def_h(0)%koff
186!
187!--         Check if the vertices that define the surface element are already
188!--         defined, if not, increment the counter.
189            IF ( point_index(k,j,i) < 0)  THEN
190               surfaces%npoints   = surfaces%npoints + 1   
191               point_index(k,j,i) = surfaces%npoints
192            ENDIF
193            IF ( point_index(k,j+1,i) < 0)  THEN
194               surfaces%npoints     = surfaces%npoints + 1   
195               point_index(k,j+1,i) = surfaces%npoints
196            ENDIF
197            IF ( point_index(k,j,i+1) < 0)  THEN
198               surfaces%npoints     = surfaces%npoints + 1   
199               point_index(k,j,i+1) = surfaces%npoints
200            ENDIF
201            IF ( point_index(k,j+1,i+1) < 0)  THEN
202               surfaces%npoints       = surfaces%npoints + 1   
203               point_index(k,j+1,i+1) = surfaces%npoints
204            ENDIF
205         ENDDO
206      ENDDO
207      DO  m = 1, surf_lsm_h%ns
208         i = surf_lsm_h%i(m) + surf_lsm_h%ioff
209         j = surf_lsm_h%j(m) + surf_lsm_h%joff
210         k = surf_lsm_h%k(m) + surf_lsm_h%koff
211
212         IF ( point_index(k,j,i) < 0)  THEN
213            surfaces%npoints   = surfaces%npoints + 1   
214            point_index(k,j,i) = surfaces%npoints
215         ENDIF
216         IF ( point_index(k,j+1,i) < 0)  THEN
217            surfaces%npoints     = surfaces%npoints + 1   
218            point_index(k,j+1,i) = surfaces%npoints
219         ENDIF
220         IF ( point_index(k,j,i+1) < 0)  THEN
221            surfaces%npoints     = surfaces%npoints + 1   
222            point_index(k,j,i+1) = surfaces%npoints
223         ENDIF
224         IF ( point_index(k,j+1,i+1) < 0)  THEN
225            surfaces%npoints       = surfaces%npoints + 1   
226            point_index(k,j+1,i+1) = surfaces%npoints
227         ENDIF   
228      ENDDO
229      DO  m = 1, surf_usm_h%ns
230         i = surf_usm_h%i(m) + surf_usm_h%ioff
231         j = surf_usm_h%j(m) + surf_usm_h%joff
232         k = surf_usm_h%k(m) + surf_usm_h%koff
233
234         IF ( point_index(k,j,i) < 0)  THEN
235            surfaces%npoints   = surfaces%npoints + 1   
236            point_index(k,j,i) = surfaces%npoints
237         ENDIF
238         IF ( point_index(k,j+1,i) < 0)  THEN
239            surfaces%npoints     = surfaces%npoints + 1   
240            point_index(k,j+1,i) = surfaces%npoints
241         ENDIF
242         IF ( point_index(k,j,i+1) < 0)  THEN
243            surfaces%npoints     = surfaces%npoints + 1   
244            point_index(k,j,i+1) = surfaces%npoints
245         ENDIF
246         IF ( point_index(k,j+1,i+1) < 0)  THEN
247            surfaces%npoints       = surfaces%npoints + 1   
248            point_index(k,j+1,i+1) = surfaces%npoints
249         ENDIF     
250      ENDDO
251!
252!--   Vertical surfaces
253      DO  l = 0, 3
254         DO  m = 1, surf_def_v(l)%ns
255!
256!--         Determine the indices of the respective grid cell inside the topography.
257!--         Please note, j-index for north-facing surfaces ( l==0 ) is
258!--         identical to the reference j-index outside the grid box.
259!--         Equivalent for east-facing surfaces and i-index.
260            i = surf_def_v(l)%i(m) + MERGE( surf_def_v(l)%ioff, 0, l == 2 )
261            j = surf_def_v(l)%j(m) + MERGE( surf_def_v(l)%joff, 0, l == 0 )
262            k = surf_def_v(l)%k(m) + surf_def_v(l)%koff
263!
264!--         Lower left /front vertex
265            IF ( point_index(k,j,i) < 0)  THEN
266               surfaces%npoints   = surfaces%npoints + 1   
267               point_index(k,j,i) = surfaces%npoints
268            ENDIF
269!
270!--         Upper left / front vertex
271            IF ( point_index(k+1,j,i) < 0)  THEN
272               surfaces%npoints     = surfaces%npoints + 1   
273               point_index(k+1,j,i) = surfaces%npoints
274            ENDIF
275!
276!--         Upper / lower right index for north- and south-facing surfaces
277            IF ( l == 0  .AND.  l == 1 )  THEN
278               IF ( point_index(k,j,i+1) < 0)  THEN
279                  surfaces%npoints     = surfaces%npoints + 1   
280                  point_index(k,j,i+1) = surfaces%npoints
281               ENDIF
282               IF ( point_index(k+1,j,i+1) < 0)  THEN
283                  surfaces%npoints       = surfaces%npoints + 1   
284                  point_index(k+1,j,i+1) = surfaces%npoints
285               ENDIF
286!
287!--         Upper / lower front index for east- and west-facing surfaces
288            ELSEIF ( l == 2  .AND.  l == 3 )  THEN
289               IF ( point_index(k,j+1,i) < 0)  THEN
290                  surfaces%npoints     = surfaces%npoints + 1   
291                  point_index(k,j+1,i) = surfaces%npoints
292               ENDIF
293               IF ( point_index(k+1,j+1,i) < 0)  THEN
294                  surfaces%npoints       = surfaces%npoints + 1   
295                  point_index(k+1,j+1,i) = surfaces%npoints
296               ENDIF
297            ENDIF           
298           
299         ENDDO
300         DO  m = 1, surf_lsm_v(l)%ns
301            i = surf_lsm_v(l)%i(m) + MERGE( surf_lsm_v(l)%ioff, 0, l == 2 )
302            j = surf_lsm_v(l)%j(m) + MERGE( surf_lsm_v(l)%joff, 0, l == 0 )
303            k = surf_lsm_v(l)%k(m) + surf_lsm_v(l)%koff
304!
305!--         Lower left /front vertex
306            IF ( point_index(k,j,i) < 0)  THEN
307               surfaces%npoints   = surfaces%npoints + 1   
308               point_index(k,j,i) = surfaces%npoints
309            ENDIF
310!
311!--         Upper left / front vertex
312            IF ( point_index(k+1,j,i) < 0)  THEN
313               surfaces%npoints     = surfaces%npoints + 1   
314               point_index(k+1,j,i) = surfaces%npoints
315            ENDIF
316!
317!--         Upper / lower right index for north- and south-facing surfaces
318            IF ( l == 0  .AND.  l == 1 )  THEN
319               IF ( point_index(k,j,i+1) < 0)  THEN
320                  surfaces%npoints     = surfaces%npoints + 1   
321                  point_index(k,j,i+1) = surfaces%npoints
322               ENDIF
323               IF ( point_index(k+1,j,i+1) < 0)  THEN
324                  surfaces%npoints       = surfaces%npoints + 1   
325                  point_index(k+1,j,i+1) = surfaces%npoints
326               ENDIF
327!
328!--         Upper / lower front index for east- and west-facing surfaces
329            ELSEIF ( l == 2  .AND.  l == 3 )  THEN
330               IF ( point_index(k,j+1,i) < 0)  THEN
331                  surfaces%npoints     = surfaces%npoints + 1   
332                  point_index(k,j+1,i) = surfaces%npoints
333               ENDIF
334               IF ( point_index(k+1,j+1,i) < 0)  THEN
335                  surfaces%npoints       = surfaces%npoints + 1   
336                  point_index(k+1,j+1,i) = surfaces%npoints
337               ENDIF
338            ENDIF       
339         ENDDO
340         DO  m = 1, surf_usm_v(l)%ns
341            i = surf_usm_v(l)%i(m) + MERGE( surf_usm_v(l)%ioff, 0, l == 2 )
342            j = surf_usm_v(l)%j(m) + MERGE( surf_usm_v(l)%joff, 0, l == 0 )
343            k = surf_usm_v(l)%k(m) + surf_usm_v(l)%koff
344!
345!--         Lower left /front vertex
346            IF ( point_index(k,j,i) < 0)  THEN
347               surfaces%npoints   = surfaces%npoints + 1   
348               point_index(k,j,i) = surfaces%npoints
349            ENDIF
350!
351!--         Upper left / front vertex
352            IF ( point_index(k+1,j,i) < 0)  THEN
353               surfaces%npoints     = surfaces%npoints + 1   
354               point_index(k+1,j,i) = surfaces%npoints
355            ENDIF
356!
357!--         Upper / lower right index for north- and south-facing surfaces
358            IF ( l == 0  .AND.  l == 1 )  THEN
359               IF ( point_index(k,j,i+1) < 0)  THEN
360                  surfaces%npoints     = surfaces%npoints + 1   
361                  point_index(k,j,i+1) = surfaces%npoints
362               ENDIF
363               IF ( point_index(k+1,j,i+1) < 0)  THEN
364                  surfaces%npoints       = surfaces%npoints + 1   
365                  point_index(k+1,j,i+1) = surfaces%npoints
366               ENDIF
367!
368!--         Upper / lower front index for east- and west-facing surfaces
369            ELSEIF ( l == 2  .AND.  l == 3 )  THEN
370               IF ( point_index(k,j+1,i) < 0)  THEN
371                  surfaces%npoints     = surfaces%npoints + 1   
372                  point_index(k,j+1,i) = surfaces%npoints
373               ENDIF
374               IF ( point_index(k+1,j+1,i) < 0)  THEN
375                  surfaces%npoints       = surfaces%npoints + 1   
376                  point_index(k+1,j+1,i) = surfaces%npoints
377               ENDIF
378            ENDIF   
379         ENDDO
380      ENDDO
381!
382!--   Allocate the number of points and polygons. Note, the number of polygons
383!--   is identical to the number of surfaces elements, whereas the number
384!--   of points (vertices) which define the polygons can be larger.
385      ALLOCATE( surfaces%points(3,1:surfaces%npoints) )
386      ALLOCATE( surfaces%polygons(5,1:surfaces%ns)    )     
387!
388!--   After the number of vertices is counted, repeat the loops and define the
389!--   vertices.
390!--   Start with the horizontal default surfaces
391      surfaces%npoints = 0
392      point_index      = -1
393      npg              = 0
394      DO  l = 0, 1
395         DO  m = 1, surf_def_h(0)%ns
396!
397!--         Determine the indices of the respective grid cell inside the topography
398            i = surf_def_h(0)%i(m) + surf_def_h(0)%ioff
399            j = surf_def_h(0)%j(m) + surf_def_h(0)%joff
400            k = surf_def_h(0)%k(m) + surf_def_h(0)%koff
401!
402!--         Check if the vertices that define the surface element are already
403!--         defined, if not, increment the counter.
404            IF ( point_index(k,j,i) < 0)  THEN
405               surfaces%npoints   = surfaces%npoints + 1   
406               point_index(k,j,i) = surfaces%npoints
407               surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
408               surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
409               surfaces%points(3,surfaces%npoints) = zw(k)
410            ENDIF
411            IF ( point_index(k,j+1,i) < 0)  THEN
412               surfaces%npoints     = surfaces%npoints + 1   
413               point_index(k,j+1,i) = surfaces%npoints
414               surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
415               surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
416               surfaces%points(3,surfaces%npoints) = zw(k)
417            ENDIF
418            IF ( point_index(k,j,i+1) < 0)  THEN
419               surfaces%npoints     = surfaces%npoints + 1   
420               point_index(k,j,i+1) = surfaces%npoints
421               surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
422               surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
423               surfaces%points(3,surfaces%npoints) = zw(k)
424            ENDIF
425            IF ( point_index(k,j+1,i+1) < 0)  THEN
426               surfaces%npoints       = surfaces%npoints + 1   
427               point_index(k,j+1,i+1) = surfaces%npoints
428               surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
429               surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
430               surfaces%points(3,surfaces%npoints) = zw(k)
431            ENDIF
432           
433            npg = npg + 1
434            surfaces%polygons(1,npg)   = 4
435            surfaces%polygons(2,npg)   = point_index(k,j,i)
436            surfaces%polygons(3,npg)   = point_index(k,j+1,i)
437            surfaces%polygons(4,npg)   = point_index(k,j+1,i+1)
438            surfaces%polygons(5,npg)   = point_index(k,j,i+1) 
439         ENDDO
440      ENDDO
441      DO  m = 1, surf_lsm_h%ns
442         i = surf_lsm_h%i(m) + surf_lsm_h%ioff
443         j = surf_lsm_h%j(m) + surf_lsm_h%joff
444         k = surf_lsm_h%k(m) + surf_lsm_h%koff
445
446         IF ( point_index(k,j,i) < 0)  THEN
447            surfaces%npoints   = surfaces%npoints + 1   
448            point_index(k,j,i) = surfaces%npoints
449            surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
450            surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
451            surfaces%points(3,surfaces%npoints) = zw(k)
452         ENDIF
453         IF ( point_index(k,j+1,i) < 0)  THEN
454            surfaces%npoints     = surfaces%npoints + 1   
455            point_index(k,j+1,i) = surfaces%npoints
456            surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
457            surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
458            surfaces%points(3,surfaces%npoints) = zw(k)
459         ENDIF
460         IF ( point_index(k,j,i+1) < 0)  THEN
461            surfaces%npoints     = surfaces%npoints + 1   
462            point_index(k,j,i+1) = surfaces%npoints
463            surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
464            surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
465            surfaces%points(3,surfaces%npoints) = zw(k)
466         ENDIF
467         IF ( point_index(k,j+1,i+1) < 0)  THEN
468            surfaces%npoints       = surfaces%npoints + 1   
469            point_index(k,j+1,i+1) = surfaces%npoints
470            surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
471            surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
472            surfaces%points(3,surfaces%npoints) = zw(k)
473         ENDIF
474         
475         npg = npg + 1
476         surfaces%polygons(1,npg)   = 4
477         surfaces%polygons(2,npg)   = point_index(k,j,i)
478         surfaces%polygons(3,npg)   = point_index(k,j+1,i)
479         surfaces%polygons(4,npg)   = point_index(k,j+1,i+1)
480         surfaces%polygons(5,npg)   = point_index(k,j,i+1) 
481      ENDDO
482      DO  m = 1, surf_usm_h%ns
483         i = surf_usm_h%i(m) + surf_usm_h%ioff
484         j = surf_usm_h%j(m) + surf_usm_h%joff
485         k = surf_usm_h%k(m) + surf_usm_h%koff
486
487         IF ( point_index(k,j,i) < 0)  THEN
488            surfaces%npoints   = surfaces%npoints + 1   
489            point_index(k,j,i) = surfaces%npoints
490            surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
491            surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
492            surfaces%points(3,surfaces%npoints) = zw(k)
493         ENDIF
494         IF ( point_index(k,j+1,i) < 0)  THEN
495            surfaces%npoints     = surfaces%npoints + 1   
496            point_index(k,j+1,i) = surfaces%npoints
497            surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
498            surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
499            surfaces%points(3,surfaces%npoints) = zw(k)
500         ENDIF
501         IF ( point_index(k,j,i+1) < 0)  THEN
502            surfaces%npoints     = surfaces%npoints + 1   
503            point_index(k,j,i+1) = surfaces%npoints
504            surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
505            surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
506            surfaces%points(3,surfaces%npoints) = zw(k)
507         ENDIF
508         IF ( point_index(k,j+1,i+1) < 0)  THEN
509            surfaces%npoints       = surfaces%npoints + 1   
510            point_index(k,j+1,i+1) = surfaces%npoints
511            surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
512            surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
513            surfaces%points(3,surfaces%npoints) = zw(k)
514         ENDIF
515         
516         npg = npg + 1
517         surfaces%polygons(1,npg)   = 4
518         surfaces%polygons(2,npg)   = point_index(k,j,i)
519         surfaces%polygons(3,npg)   = point_index(k,j+1,i)
520         surfaces%polygons(4,npg)   = point_index(k,j+1,i+1)
521         surfaces%polygons(5,npg)   = point_index(k,j,i+1)   
522      ENDDO
523      DO  l = 0, 3
524         DO  m = 1, surf_def_v(l)%ns
525!
526!--         Determine the indices of the respective grid cell inside the topography.
527!--         Please note, j-index for north-facing surfaces ( l==0 ) is
528!--         identical to the reference j-index outside the grid box.
529!--         Equivalent for east-facing surfaces and i-index.
530            i = surf_def_v(l)%i(m) + MERGE( surf_def_v(l)%ioff, 0, l == 2 )
531            j = surf_def_v(l)%j(m) + MERGE( surf_def_v(l)%joff, 0, l == 0 )
532            k = surf_def_v(l)%k(m) + surf_def_v(l)%koff
533!
534!--         Lower left /front vertex
535            IF ( point_index(k,j,i) < 0)  THEN
536               surfaces%npoints   = surfaces%npoints + 1   
537               point_index(k,j,i) = surfaces%npoints
538               surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
539               surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
540               surfaces%points(3,surfaces%npoints) = zw(k)
541            ENDIF
542!
543!--         Upper left / front vertex
544            IF ( point_index(k+1,j,i) < 0)  THEN
545               surfaces%npoints     = surfaces%npoints + 1   
546               point_index(k+1,j,i) = surfaces%npoints
547               surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
548               surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
549               surfaces%points(3,surfaces%npoints) = zw(k+1)
550            ENDIF
551!
552!--         Upper / lower right index for north- and south-facing surfaces
553            IF ( l == 0  .AND.  l == 1 )  THEN
554               IF ( point_index(k,j,i+1) < 0)  THEN
555                  surfaces%npoints     = surfaces%npoints + 1   
556                  point_index(k,j,i+1) = surfaces%npoints
557                  surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
558                  surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
559                  surfaces%points(3,surfaces%npoints) = zw(k)
560               ENDIF
561               IF ( point_index(k+1,j,i+1) < 0)  THEN
562                  surfaces%npoints       = surfaces%npoints + 1   
563                  point_index(k+1,j,i+1) = surfaces%npoints
564                  surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
565                  surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
566                  surfaces%points(3,surfaces%npoints) = zw(k+1)
567               ENDIF
568!
569!--         Upper / lower front index for east- and west-facing surfaces
570            ELSEIF ( l == 2  .AND.  l == 3 )  THEN
571               IF ( point_index(k,j+1,i) < 0)  THEN
572                  surfaces%npoints     = surfaces%npoints + 1   
573                  point_index(k,j+1,i) = surfaces%npoints
574                  surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
575                  surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
576                  surfaces%points(3,surfaces%npoints) = zw(k)
577               ENDIF
578               IF ( point_index(k+1,j+1,i) < 0)  THEN
579                  surfaces%npoints       = surfaces%npoints + 1   
580                  point_index(k+1,j+1,i) = surfaces%npoints
581                  surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
582                  surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
583                  surfaces%points(3,surfaces%npoints) = zw(k+1)
584               ENDIF
585            ENDIF         
586           
587            npg = npg + 1           
588            IF ( l == 0  .AND.  l == 1 )  THEN
589               surfaces%polygons(1,npg)   = 4
590               surfaces%polygons(2,npg)   = point_index(k,j,i)
591               surfaces%polygons(3,npg)   = point_index(k,j,i+1)
592               surfaces%polygons(4,npg)   = point_index(k+1,j,i+1)
593               surfaces%polygons(5,npg)   = point_index(k+1,j,i) 
594            ELSE
595               surfaces%polygons(1,npg)   = 4
596               surfaces%polygons(2,npg)   = point_index(k,j,i)
597               surfaces%polygons(3,npg)   = point_index(k,j+1,i)
598               surfaces%polygons(4,npg)   = point_index(k+1,j+1,i)
599               surfaces%polygons(5,npg)   = point_index(k+1,j,i)
600            ENDIF
601           
602         ENDDO
603         DO  m = 1, surf_lsm_v(l)%ns
604            i = surf_lsm_v(l)%i(m) + MERGE( surf_lsm_v(l)%ioff, 0, l == 2 )
605            j = surf_lsm_v(l)%j(m) + MERGE( surf_lsm_v(l)%joff, 0, l == 0 )
606            k = surf_lsm_v(l)%k(m) + surf_lsm_v(l)%koff
607!
608!--         Lower left /front vertex
609            IF ( point_index(k,j,i) < 0)  THEN
610               surfaces%npoints   = surfaces%npoints + 1   
611               point_index(k,j,i) = surfaces%npoints
612               surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
613               surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
614               surfaces%points(3,surfaces%npoints) = zw(k)
615            ENDIF
616!
617!--         Upper left / front vertex
618            IF ( point_index(k+1,j,i) < 0)  THEN
619               surfaces%npoints     = surfaces%npoints + 1   
620               point_index(k+1,j,i) = surfaces%npoints
621               surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
622               surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
623               surfaces%points(3,surfaces%npoints) = zw(k+1)
624            ENDIF
625!
626!--         Upper / lower right index for north- and south-facing surfaces
627            IF ( l == 0  .AND.  l == 1 )  THEN
628               IF ( point_index(k,j,i+1) < 0)  THEN
629                  surfaces%npoints     = surfaces%npoints + 1   
630                  point_index(k,j,i+1) = surfaces%npoints
631                  surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
632                  surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
633                  surfaces%points(3,surfaces%npoints) = zw(k)
634               ENDIF
635               IF ( point_index(k+1,j,i+1) < 0)  THEN
636                  surfaces%npoints       = surfaces%npoints + 1   
637                  point_index(k+1,j,i+1) = surfaces%npoints
638                  surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
639                  surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
640                  surfaces%points(3,surfaces%npoints) = zw(k+1)
641               ENDIF
642!
643!--         Upper / lower front index for east- and west-facing surfaces
644            ELSEIF ( l == 2  .AND.  l == 3 )  THEN
645               IF ( point_index(k,j+1,i) < 0)  THEN
646                  surfaces%npoints     = surfaces%npoints + 1   
647                  point_index(k,j+1,i) = surfaces%npoints
648                  surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
649                  surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
650                  surfaces%points(3,surfaces%npoints) = zw(k)
651               ENDIF
652               IF ( point_index(k+1,j+1,i) < 0)  THEN
653                  surfaces%npoints       = surfaces%npoints + 1   
654                  point_index(k+1,j+1,i) = surfaces%npoints
655                  surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
656                  surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
657                  surfaces%points(3,surfaces%npoints) = zw(k+1)
658               ENDIF
659            ENDIF
660           
661            npg = npg + 1           
662            IF ( l == 0  .AND.  l == 1 )  THEN
663               surfaces%polygons(1,npg)   = 4
664               surfaces%polygons(2,npg)   = point_index(k,j,i)
665               surfaces%polygons(3,npg)   = point_index(k,j,i+1)
666               surfaces%polygons(4,npg)   = point_index(k+1,j,i+1)
667               surfaces%polygons(5,npg)   = point_index(k+1,j,i) 
668            ELSE
669               surfaces%polygons(1,npg)   = 4
670               surfaces%polygons(2,npg)   = point_index(k,j,i)
671               surfaces%polygons(3,npg)   = point_index(k,j+1,i)
672               surfaces%polygons(4,npg)   = point_index(k+1,j+1,i)
673               surfaces%polygons(5,npg)   = point_index(k+1,j,i)
674            ENDIF
675         ENDDO
676         DO  m = 1, surf_usm_v(l)%ns
677            i = surf_usm_v(l)%i(m) + MERGE( surf_usm_v(l)%ioff, 0, l == 2 )
678            j = surf_usm_v(l)%j(m) + MERGE( surf_usm_v(l)%joff, 0, l == 0 )
679            k = surf_usm_v(l)%k(m) + surf_usm_v(l)%koff
680!
681!--         Lower left /front vertex
682            IF ( point_index(k,j,i) < 0)  THEN
683               surfaces%npoints   = surfaces%npoints + 1   
684               point_index(k,j,i) = surfaces%npoints
685               surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
686               surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
687               surfaces%points(3,surfaces%npoints) = zw(k)
688            ENDIF
689!
690!--         Upper left / front vertex
691            IF ( point_index(k+1,j,i) < 0)  THEN
692               surfaces%npoints     = surfaces%npoints + 1   
693               point_index(k+1,j,i) = surfaces%npoints
694               surfaces%points(1,surfaces%npoints) = ( i - 0.5_wp ) * dx
695               surfaces%points(2,surfaces%npoints) = ( j - 0.5_wp ) * dy
696               surfaces%points(3,surfaces%npoints) = zw(k+1)
697            ENDIF
698!
699!--         Upper / lower right index for north- and south-facing surfaces
700            IF ( l == 0  .AND.  l == 1 )  THEN
701               IF ( point_index(k,j,i+1) < 0)  THEN
702                  surfaces%npoints     = surfaces%npoints + 1   
703                  point_index(k,j,i+1) = surfaces%npoints
704                  surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
705                  surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
706                  surfaces%points(3,surfaces%npoints) = zw(k)
707               ENDIF
708               IF ( point_index(k+1,j,i+1) < 0)  THEN
709                  surfaces%npoints       = surfaces%npoints + 1   
710                  point_index(k+1,j,i+1) = surfaces%npoints
711                  surfaces%points(1,surfaces%npoints) = ( i + 1 - 0.5_wp ) * dx
712                  surfaces%points(2,surfaces%npoints) = ( j     - 0.5_wp ) * dy
713                  surfaces%points(3,surfaces%npoints) = zw(k+1)
714               ENDIF
715!
716!--         Upper / lower front index for east- and west-facing surfaces
717            ELSEIF ( l == 2  .AND.  l == 3 )  THEN
718               IF ( point_index(k,j+1,i) < 0)  THEN
719                  surfaces%npoints     = surfaces%npoints + 1   
720                  point_index(k,j+1,i) = surfaces%npoints
721                  surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
722                  surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
723                  surfaces%points(3,surfaces%npoints) = zw(k)
724               ENDIF
725               IF ( point_index(k+1,j+1,i) < 0)  THEN
726                  surfaces%npoints       = surfaces%npoints + 1   
727                  point_index(k+1,j+1,i) = surfaces%npoints
728                  surfaces%points(1,surfaces%npoints) = ( i     - 0.5_wp ) * dx
729                  surfaces%points(2,surfaces%npoints) = ( j + 1 - 0.5_wp ) * dy
730                  surfaces%points(3,surfaces%npoints) = zw(k+1)
731               ENDIF
732            ENDIF
733           
734            npg = npg + 1           
735            IF ( l == 0  .AND.  l == 1 )  THEN
736               surfaces%polygons(1,npg)   = 4
737               surfaces%polygons(2,npg)   = point_index(k,j,i)
738               surfaces%polygons(3,npg)   = point_index(k,j,i+1)
739               surfaces%polygons(4,npg)   = point_index(k+1,j,i+1)
740               surfaces%polygons(5,npg)   = point_index(k+1,j,i) 
741            ELSE
742               surfaces%polygons(1,npg)   = 4
743               surfaces%polygons(2,npg)   = point_index(k,j,i)
744               surfaces%polygons(3,npg)   = point_index(k,j+1,i)
745               surfaces%polygons(4,npg)   = point_index(k+1,j+1,i)
746               surfaces%polygons(5,npg)   = point_index(k+1,j,i)
747            ENDIF
748         ENDDO
749      ENDDO
750!
751!--   Deallocate temporary dummy variable
752      DEALLOCATE ( point_index )
753!
754!--   Now, vertices as well as polygon data can be written to NetCDF files
755!--   ...
756   END SUBROUTINE surface_output_init
757   
758!------------------------------------------------------------------------------!
759! Description:
760! ------------
761!> Routine for controlling the data output. Surface data is collected from
762!> different types of surfaces (default, natural, urban) and different
763!> orientation and written to one 1D-output array. Further, NetCDF routines
764!> are called to write the surface data in the respective NetCDF files.
765!------------------------------------------------------------------------------!   
766   SUBROUTINE surface_output( av )
767   
768      USE control_parameters,                                                  &
769          ONLY:  io_blocks, io_group, simulated_time
770
771      USE pegrid,                                                              &
772          ONLY:  comm2d, ierr
773
774   
775      IMPLICIT NONE
776
777      CHARACTER(LEN=100) ::  trimvar = ' ' !< dummy for single output variable
778     
779      INTEGER(iwp) ::  av     !< id indicating average or non-average data output
780      INTEGER(iwp) ::  i      !< loop index
781      INTEGER(iwp) ::  l      !< running index for surface-element orientation
782      INTEGER(iwp) ::  m      !< running index for surface elements
783      INTEGER(iwp) ::  n_out  !< counter variables for surface output
784
785!
786!--   Return, if nothing to output
787      IF ( dosurf_no(av) == 0 )  RETURN
788!
789!--   Open files
790      CALL check_open( 25+av )
791!
792!--   Write coordinates
793      IF ( .NOT. first_output(av) )  THEN
794         DO  i = 0, io_blocks-1
795            IF ( i == io_group )  THEN
796               WRITE ( 25+av )  surfaces%npoints
797               WRITE ( 25+av )  surfaces%ns
798               WRITE ( 25+av )  surfaces%points
799               WRITE ( 25+av )  surfaces%polygons
800            ENDIF
801#if defined( __parallel )
802            CALL MPI_BARRIER( comm2d, ierr )
803#endif
804            first_output(av) = .TRUE.
805         ENDDO
806      ENDIF
807!
808!--   Write time coordinate
809      DO  i = 0, io_blocks-1
810         IF ( i == io_group )  THEN
811            trimvar = 'time'
812            WRITE ( 25+av )  trimvar
813            WRITE ( 25+av )  simulated_time
814         ENDIF
815#if defined( __parallel )
816         CALL MPI_BARRIER( comm2d, ierr )
817#endif
818      ENDDO
819
820
821      n_out = 0
822      DO  WHILE ( dosurf(av,n_out+1)(1:1) /= ' ' )
823
824         n_out   = n_out + 1
825         trimvar = TRIM( dosurf(av,n_out) )
826!
827!--      Set the output array to the _FillValue in case it is not
828!--      defined for each type of surface.
829         surfaces%var_out = surfaces%fillvalue
830         SELECT CASE ( trimvar )
831
832            CASE ( 'us' )
833!
834!--            Output of instantaneous data
835               IF ( av == 0 )  THEN
836                  CALL surface_output_collect( surf_def_h(0)%us,               &
837                                             surf_def_h(1)%us,                 &
838                                             surf_lsm_h%us,                    &
839                                             surf_usm_h%us,                    &
840                                             surf_def_v(0)%us,                 &
841                                             surf_lsm_v(0)%us,                 &
842                                             surf_usm_v(0)%us,                 &
843                                             surf_def_v(1)%us,                 &
844                                             surf_lsm_v(1)%us,                 &
845                                             surf_usm_v(1)%us,                 &
846                                             surf_def_v(2)%us,                 &
847                                             surf_lsm_v(2)%us,                 &
848                                             surf_usm_v(2)%us,                 &
849                                             surf_def_v(3)%us,                 &
850                                             surf_lsm_v(3)%us,                 &
851                                             surf_usm_v(3)%us ) 
852               ELSE
853!
854!--               Output of averaged data
855                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
856                                        REAL( average_count_surf, KIND=wp )
857                  surfaces%var_av(:,n_out) = 0.0_wp
858                                                       
859               ENDIF
860
861            CASE ( 'ts' )
862!
863!--            Output of instantaneous data
864               IF ( av == 0 )  THEN
865                  CALL surface_output_collect( surf_def_h(0)%ts,               &
866                                               surf_def_h(1)%ts,               &
867                                               surf_lsm_h%ts,                  &
868                                               surf_usm_h%ts,                  &
869                                               surf_def_v(0)%ts,               &
870                                               surf_lsm_v(0)%ts,               &
871                                               surf_usm_v(0)%ts,               &
872                                               surf_def_v(1)%ts,               &
873                                               surf_lsm_v(1)%ts,               &
874                                               surf_usm_v(1)%ts,               &
875                                               surf_def_v(2)%ts,               &
876                                               surf_lsm_v(2)%ts,               &
877                                               surf_usm_v(2)%ts,               &
878                                               surf_def_v(3)%ts,               &
879                                               surf_lsm_v(3)%ts,               &
880                                               surf_usm_v(3)%ts ) 
881               ELSE
882!
883!--               Output of averaged data
884                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
885                                        REAL( average_count_surf, KIND=wp )
886                  surfaces%var_av(:,n_out) = 0.0_wp
887                                                       
888               ENDIF
889
890            CASE ( 'qs' )
891!
892!--            Output of instantaneous data
893               IF ( av == 0 )  THEN
894                  CALL surface_output_collect( surf_def_h(0)%qs,               &
895                                               surf_def_h(1)%qs,               &
896                                               surf_lsm_h%qs,                  &
897                                               surf_usm_h%qs,                  &
898                                               surf_def_v(0)%qs,               &
899                                               surf_lsm_v(0)%qs,               &
900                                               surf_usm_v(0)%qs,               &
901                                               surf_def_v(1)%qs,               &
902                                               surf_lsm_v(1)%qs,               &
903                                               surf_usm_v(1)%qs,               &
904                                               surf_def_v(2)%qs,               &
905                                               surf_lsm_v(2)%qs,               &
906                                               surf_usm_v(2)%qs,               &
907                                               surf_def_v(3)%qs,               &
908                                               surf_lsm_v(3)%qs,               &
909                                               surf_usm_v(3)%qs ) 
910               ELSE
911!
912!--               Output of averaged data
913                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
914                                        REAL( average_count_surf, KIND=wp )
915                  surfaces%var_av(:,n_out) = 0.0_wp
916                                                       
917               ENDIF
918
919            CASE ( 'ss' )
920!
921!--            Output of instantaneous data
922               IF ( av == 0 )  THEN
923                  CALL surface_output_collect( surf_def_h(0)%ss,               &
924                                               surf_def_h(1)%ss,               &
925                                               surf_lsm_h%ss,                  &
926                                               surf_usm_h%ss,                  &
927                                               surf_def_v(0)%ss,               &
928                                               surf_lsm_v(0)%ss,               &
929                                               surf_usm_v(0)%ss,               &
930                                               surf_def_v(1)%ss,               &
931                                               surf_lsm_v(1)%ss,               &
932                                               surf_usm_v(1)%ss,               &
933                                               surf_def_v(2)%ss,               &
934                                               surf_lsm_v(2)%ss,               &
935                                               surf_usm_v(2)%ss,               &
936                                               surf_def_v(3)%ss,               &
937                                               surf_lsm_v(3)%ss,               &
938                                               surf_usm_v(3)%ss ) 
939               ELSE
940!
941!--               Output of averaged data
942                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
943                                        REAL( average_count_surf, KIND=wp )
944                  surfaces%var_av(:,n_out) = 0.0_wp
945                                                       
946               ENDIF
947
948            CASE ( 'qcs' )
949!
950!--            Output of instantaneous data
951               IF ( av == 0 )  THEN
952                  CALL surface_output_collect( surf_def_h(0)%qcs,              &
953                                               surf_def_h(1)%qcs,              &
954                                               surf_lsm_h%qcs,                 &
955                                               surf_usm_h%qcs,                 &
956                                               surf_def_v(0)%qcs,              &
957                                               surf_lsm_v(0)%qcs,              &
958                                               surf_usm_v(0)%qcs,              &
959                                               surf_def_v(1)%qcs,              &
960                                               surf_lsm_v(1)%qcs,              &
961                                               surf_usm_v(1)%qcs,              &
962                                               surf_def_v(2)%qcs,              &
963                                               surf_lsm_v(2)%qcs,              &
964                                               surf_usm_v(2)%qcs,              &
965                                               surf_def_v(3)%qcs,              &
966                                               surf_lsm_v(3)%qcs,              &
967                                               surf_usm_v(3)%qcs ) 
968               ELSE
969!
970!--               Output of averaged data
971                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
972                                        REAL( average_count_surf, KIND=wp )
973                  surfaces%var_av(:,n_out) = 0.0_wp
974                                                       
975               ENDIF
976
977            CASE ( 'ncs' )
978!
979!--            Output of instantaneous data
980               IF ( av == 0 )  THEN
981                  CALL surface_output_collect( surf_def_h(0)%ncs,              &
982                                               surf_def_h(1)%ncs,              &
983                                               surf_lsm_h%ncs,                 &
984                                               surf_usm_h%ncs,                 &
985                                               surf_def_v(0)%ncs,              &
986                                               surf_lsm_v(0)%ncs,              &
987                                               surf_usm_v(0)%ncs,              &
988                                               surf_def_v(1)%ncs,              &
989                                               surf_lsm_v(1)%ncs,              &
990                                               surf_usm_v(1)%ncs,              &
991                                               surf_def_v(2)%ncs,              &
992                                               surf_lsm_v(2)%ncs,              &
993                                               surf_usm_v(2)%ncs,              &
994                                               surf_def_v(3)%ncs,              &
995                                               surf_lsm_v(3)%ncs,              &
996                                               surf_usm_v(3)%ncs ) 
997               ELSE
998!
999!--               Output of averaged data
1000                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1001                                        REAL( average_count_surf, KIND=wp )
1002                  surfaces%var_av(:,n_out) = 0.0_wp
1003                                                       
1004               ENDIF
1005
1006            CASE ( 'qrs' )
1007!
1008!--            Output of instantaneous data
1009               IF ( av == 0 )  THEN
1010                  CALL surface_output_collect( surf_def_h(0)%qrs,              &
1011                                               surf_def_h(1)%qrs,              &
1012                                               surf_lsm_h%qrs,                 &
1013                                               surf_usm_h%qrs,                 &
1014                                               surf_def_v(0)%qrs,              &
1015                                               surf_lsm_v(0)%qrs,              &
1016                                               surf_usm_v(0)%qrs,              &
1017                                               surf_def_v(1)%qrs,              &
1018                                               surf_lsm_v(1)%qrs,              &
1019                                               surf_usm_v(1)%qrs,              &
1020                                               surf_def_v(2)%qrs,              &
1021                                               surf_lsm_v(2)%qrs,              &
1022                                               surf_usm_v(2)%qrs,              &
1023                                               surf_def_v(3)%qrs,              &
1024                                               surf_lsm_v(3)%qrs,              &
1025                                               surf_usm_v(3)%qrs ) 
1026               ELSE
1027!
1028!--               Output of averaged data
1029                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1030                                        REAL( average_count_surf, KIND=wp )
1031                  surfaces%var_av(:,n_out) = 0.0_wp
1032                                                       
1033               ENDIF
1034
1035            CASE ( 'nrs' )
1036!
1037!--            Output of instantaneous data
1038               IF ( av == 0 )  THEN
1039                  CALL surface_output_collect( surf_def_h(0)%nrs,              &
1040                                               surf_def_h(1)%nrs,              &
1041                                               surf_lsm_h%nrs,                 &
1042                                               surf_usm_h%nrs,                 &
1043                                               surf_def_v(0)%nrs,              &
1044                                               surf_lsm_v(0)%nrs,              &
1045                                               surf_usm_v(0)%nrs,              &
1046                                               surf_def_v(1)%nrs,              &
1047                                               surf_lsm_v(1)%nrs,              &
1048                                               surf_usm_v(1)%nrs,              &
1049                                               surf_def_v(2)%nrs,              &
1050                                               surf_lsm_v(2)%nrs,              &
1051                                               surf_usm_v(2)%nrs,              &
1052                                               surf_def_v(3)%nrs,              &
1053                                               surf_lsm_v(3)%nrs,              &
1054                                               surf_usm_v(3)%nrs ) 
1055               ELSE
1056!
1057!--               Output of averaged data
1058                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1059                                        REAL( average_count_surf, KIND=wp )
1060                  surfaces%var_av(:,n_out) = 0.0_wp
1061                                                       
1062               ENDIF
1063
1064            CASE ( 'ol' )
1065!
1066!--            Output of instantaneous data
1067               IF ( av == 0 )  THEN
1068                  CALL surface_output_collect( surf_def_h(0)%ol,               &
1069                                               surf_def_h(1)%ol,               &
1070                                               surf_lsm_h%ol,                  &
1071                                               surf_usm_h%ol,                  &
1072                                               surf_def_v(0)%ol,               &
1073                                               surf_lsm_v(0)%ol,               &
1074                                               surf_usm_v(0)%ol,               &
1075                                               surf_def_v(1)%ol,               &
1076                                               surf_lsm_v(1)%ol,               &
1077                                               surf_usm_v(1)%ol,               &
1078                                               surf_def_v(2)%ol,               &
1079                                               surf_lsm_v(2)%ol,               &
1080                                               surf_usm_v(2)%ol,               &
1081                                               surf_def_v(3)%ol,               &
1082                                               surf_lsm_v(3)%ol,               &
1083                                               surf_usm_v(3)%ol ) 
1084               ELSE
1085!
1086!--               Output of averaged data
1087                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1088                                        REAL( average_count_surf, KIND=wp )
1089                  surfaces%var_av(:,n_out) = 0.0_wp
1090                                                       
1091               ENDIF
1092
1093            CASE ( 'z0' )
1094!
1095!--            Output of instantaneous data
1096               IF ( av == 0 )  THEN
1097                  CALL surface_output_collect( surf_def_h(0)%z0,               &
1098                                               surf_def_h(1)%z0,               &
1099                                               surf_lsm_h%z0,                  &
1100                                               surf_usm_h%z0,                  &
1101                                               surf_def_v(0)%z0,               &
1102                                               surf_lsm_v(0)%z0,               &
1103                                               surf_usm_v(0)%z0,               &
1104                                               surf_def_v(1)%z0,               &
1105                                               surf_lsm_v(1)%z0,               &
1106                                               surf_usm_v(1)%z0,               &
1107                                               surf_def_v(2)%z0,               &
1108                                               surf_lsm_v(2)%z0,               &
1109                                               surf_usm_v(2)%z0,               &
1110                                               surf_def_v(3)%z0,               &
1111                                               surf_lsm_v(3)%z0,               &
1112                                               surf_usm_v(3)%z0 )
1113               ELSE
1114!
1115!--               Output of averaged data
1116                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1117                                        REAL( average_count_surf, KIND=wp )
1118                  surfaces%var_av(:,n_out) = 0.0_wp
1119                                                       
1120               ENDIF
1121
1122            CASE ( 'z0h' )
1123!
1124!--            Output of instantaneous data
1125               IF ( av == 0 )  THEN
1126                  CALL surface_output_collect( surf_def_h(0)%z0h,              &
1127                                               surf_def_h(1)%z0h,              &
1128                                               surf_lsm_h%z0h,                 &
1129                                               surf_usm_h%z0h,                 &
1130                                               surf_def_v(0)%z0h,              &
1131                                               surf_lsm_v(0)%z0h,              &
1132                                               surf_usm_v(0)%z0h,              &
1133                                               surf_def_v(1)%z0h,              &
1134                                               surf_lsm_v(1)%z0h,              &
1135                                               surf_usm_v(1)%z0h,              &
1136                                               surf_def_v(2)%z0h,              &
1137                                               surf_lsm_v(2)%z0h,              &
1138                                               surf_usm_v(2)%z0h,              &
1139                                               surf_def_v(3)%z0h,              &
1140                                               surf_lsm_v(3)%z0h,              &
1141                                               surf_usm_v(3)%z0h )
1142               ELSE
1143!
1144!--               Output of averaged data
1145                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1146                                        REAL( average_count_surf, KIND=wp )
1147                  surfaces%var_av(:,n_out) = 0.0_wp
1148                                                       
1149               ENDIF
1150
1151            CASE ( 'z0q' )
1152!
1153!--            Output of instantaneous data
1154               IF ( av == 0 )  THEN
1155                  CALL surface_output_collect( surf_def_h(0)%z0q,              &
1156                                               surf_def_h(1)%z0q,              &
1157                                               surf_lsm_h%z0q,                 &
1158                                               surf_usm_h%z0q,                 &
1159                                               surf_def_v(0)%z0q,              &
1160                                               surf_lsm_v(0)%z0q,              &
1161                                               surf_usm_v(0)%z0q,              &
1162                                               surf_def_v(1)%z0q,              &
1163                                               surf_lsm_v(1)%z0q,              &
1164                                               surf_usm_v(1)%z0q,              &
1165                                               surf_def_v(2)%z0q,              &
1166                                               surf_lsm_v(2)%z0q,              &
1167                                               surf_usm_v(2)%z0q,              &
1168                                               surf_def_v(3)%z0q,              &
1169                                               surf_lsm_v(3)%z0q,              &
1170                                               surf_usm_v(3)%z0q ) 
1171               ELSE
1172!
1173!--               Output of averaged data
1174                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1175                                        REAL( average_count_surf, KIND=wp )
1176                  surfaces%var_av(:,n_out) = 0.0_wp
1177
1178               ENDIF
1179
1180            CASE ( 'theta1' )
1181!
1182!--            Output of instantaneous data
1183               IF ( av == 0 )  THEN
1184                  CALL surface_output_collect( surf_def_h(0)%pt1,              &
1185                                               surf_def_h(1)%pt1,              &
1186                                               surf_lsm_h%pt1,                 &
1187                                               surf_usm_h%pt1,                 &
1188                                               surf_def_v(0)%pt1,              &
1189                                               surf_lsm_v(0)%pt1,              &
1190                                               surf_usm_v(0)%pt1,              &
1191                                               surf_def_v(1)%pt1,              &
1192                                               surf_lsm_v(1)%pt1,              &
1193                                               surf_usm_v(1)%pt1,              &
1194                                               surf_def_v(2)%pt1,              &
1195                                               surf_lsm_v(2)%pt1,              &
1196                                               surf_usm_v(2)%pt1,              &
1197                                               surf_def_v(3)%pt1,              &
1198                                               surf_lsm_v(3)%pt1,              &
1199                                               surf_usm_v(3)%pt1 )
1200               ELSE
1201!
1202!--               Output of averaged data
1203                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1204                                        REAL( average_count_surf, KIND=wp )
1205                  surfaces%var_av(:,n_out) = 0.0_wp
1206                                                       
1207               ENDIF
1208
1209            CASE ( 'qv1' )
1210!
1211!--            Output of instantaneous data
1212               IF ( av == 0 )  THEN
1213                  CALL surface_output_collect( surf_def_h(0)%qv1,              &
1214                                               surf_def_h(1)%qv1,              &
1215                                               surf_lsm_h%qv1,                 &
1216                                               surf_usm_h%qv1,                 &
1217                                               surf_def_v(0)%qv1,              &
1218                                               surf_lsm_v(0)%qv1,              &
1219                                               surf_usm_v(0)%qv1,              &
1220                                               surf_def_v(1)%qv1,              &
1221                                               surf_lsm_v(1)%qv1,              &
1222                                               surf_usm_v(1)%qv1,              &
1223                                               surf_def_v(2)%qv1,              &
1224                                               surf_lsm_v(2)%qv1,              &
1225                                               surf_usm_v(2)%qv1,              &
1226                                               surf_def_v(3)%qv1,              &
1227                                               surf_lsm_v(3)%qv1,              &
1228                                               surf_usm_v(3)%qv1 )
1229               ELSE
1230!
1231!--               Output of averaged data
1232                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1233                                        REAL( average_count_surf, KIND=wp )
1234                  surfaces%var_av(:,n_out) = 0.0_wp
1235                                                       
1236               ENDIF
1237
1238            CASE ( 'thetav1' )
1239!
1240!--            Output of instantaneous data
1241               IF ( av == 0 )  THEN
1242                  CALL surface_output_collect( surf_def_h(0)%vpt1,             &
1243                                               surf_def_h(1)%vpt1,             &
1244                                               surf_lsm_h%vpt1,                &
1245                                               surf_usm_h%vpt1,                &
1246                                               surf_def_v(0)%vpt1,             &
1247                                               surf_lsm_v(0)%vpt1,             &
1248                                               surf_usm_v(0)%vpt1,             &
1249                                               surf_def_v(1)%vpt1,             &
1250                                               surf_lsm_v(1)%vpt1,             &
1251                                               surf_usm_v(1)%vpt1,             &
1252                                               surf_def_v(2)%vpt1,             &
1253                                               surf_lsm_v(2)%vpt1,             &
1254                                               surf_usm_v(2)%vpt1,             &
1255                                               surf_def_v(3)%vpt1,             &
1256                                               surf_lsm_v(3)%vpt1,             &
1257                                               surf_usm_v(3)%vpt1 )
1258               ELSE
1259!
1260!--               Output of averaged data
1261                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1262                                        REAL( average_count_surf, KIND=wp )
1263                  surfaces%var_av(:,n_out) = 0.0_wp
1264                                                       
1265               ENDIF
1266
1267            CASE ( 'usws' )
1268!
1269!--            Output of instantaneous data
1270               IF ( av == 0 )  THEN
1271                  CALL surface_output_collect( surf_def_h(0)%usws,             &
1272                                               surf_def_h(1)%usws,             &
1273                                               surf_lsm_h%usws,                &
1274                                               surf_usm_h%usws,                &
1275                                               surf_def_v(0)%usws,             &
1276                                               surf_lsm_v(0)%usws,             &
1277                                               surf_usm_v(0)%usws,             &
1278                                               surf_def_v(1)%usws,             &
1279                                               surf_lsm_v(1)%usws,             &
1280                                               surf_usm_v(1)%usws,             &
1281                                               surf_def_v(2)%usws,             &
1282                                               surf_lsm_v(2)%usws,             &
1283                                               surf_usm_v(2)%usws,             &
1284                                               surf_def_v(3)%usws,             &
1285                                               surf_lsm_v(3)%usws,             &
1286                                               surf_usm_v(3)%usws )
1287               ELSE
1288!
1289!--               Output of averaged data
1290                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1291                                        REAL( average_count_surf, KIND=wp )
1292                  surfaces%var_av(:,n_out) = 0.0_wp
1293                                                       
1294               ENDIF
1295
1296            CASE ( 'vsws' )
1297!
1298!--            Output of instantaneous data
1299               IF ( av == 0 )  THEN
1300                  CALL surface_output_collect( surf_def_h(0)%vsws,             &
1301                                               surf_def_h(1)%vsws,             &
1302                                               surf_lsm_h%vsws,                &
1303                                               surf_usm_h%vsws,                &
1304                                               surf_def_v(0)%vsws,             &
1305                                               surf_lsm_v(0)%vsws,             &
1306                                               surf_usm_v(0)%vsws,             &
1307                                               surf_def_v(1)%vsws,             &
1308                                               surf_lsm_v(1)%vsws,             &
1309                                               surf_usm_v(1)%vsws,             &
1310                                               surf_def_v(2)%vsws,             &
1311                                               surf_lsm_v(2)%vsws,             &
1312                                               surf_usm_v(2)%vsws,             &
1313                                               surf_def_v(3)%vsws,             &
1314                                               surf_lsm_v(3)%vsws,             &
1315                                               surf_usm_v(3)%vsws )
1316               ELSE
1317!
1318!--               Output of averaged data
1319                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1320                                        REAL( average_count_surf, KIND=wp )
1321                  surfaces%var_av(:,n_out) = 0.0_wp
1322                                                       
1323               ENDIF
1324
1325            CASE ( 'shf' )
1326!
1327!--            Output of instantaneous data
1328               IF ( av == 0 )  THEN
1329                  CALL surface_output_collect( surf_def_h(0)%shf,              &
1330                                               surf_def_h(1)%shf,              &
1331                                               surf_lsm_h%shf,                 &
1332                                               surf_usm_h%shf,                 &
1333                                               surf_def_v(0)%shf,              &
1334                                               surf_lsm_v(0)%shf,              &
1335                                               surf_usm_v(0)%shf,              &
1336                                               surf_def_v(1)%shf,              &
1337                                               surf_lsm_v(1)%shf,              &
1338                                               surf_usm_v(1)%shf,              &
1339                                               surf_def_v(2)%shf,              &
1340                                               surf_lsm_v(2)%shf,              &
1341                                               surf_usm_v(2)%shf,              &
1342                                               surf_def_v(3)%shf,              &
1343                                               surf_lsm_v(3)%shf,              &
1344                                               surf_usm_v(3)%shf )
1345               ELSE
1346!
1347!--               Output of averaged data
1348                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1349                                        REAL( average_count_surf, KIND=wp )
1350                  surfaces%var_av(:,n_out) = 0.0_wp
1351               ENDIF
1352
1353            CASE ( 'qsws' )
1354!
1355!--            Output of instantaneous data
1356               IF ( av == 0 )  THEN
1357                  CALL surface_output_collect( surf_def_h(0)%qsws,             &
1358                                               surf_def_h(1)%qsws,             &
1359                                               surf_lsm_h%qsws,                &
1360                                               surf_usm_h%qsws,                &
1361                                               surf_def_v(0)%qsws,             &
1362                                               surf_lsm_v(0)%qsws,             &
1363                                               surf_usm_v(0)%qsws,             &
1364                                               surf_def_v(1)%qsws,             &
1365                                               surf_lsm_v(1)%qsws,             &
1366                                               surf_usm_v(1)%qsws,             &
1367                                               surf_def_v(2)%qsws,             &
1368                                               surf_lsm_v(2)%qsws,             &
1369                                               surf_usm_v(2)%qsws,             &
1370                                               surf_def_v(3)%qsws,             &
1371                                               surf_lsm_v(3)%qsws,             &
1372                                               surf_usm_v(3)%qsws )
1373               ELSE
1374!
1375!--               Output of averaged data
1376                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1377                                        REAL( average_count_surf, KIND=wp )
1378                  surfaces%var_av(:,n_out) = 0.0_wp
1379                                                       
1380               ENDIF
1381
1382            CASE ( 'ssws' )
1383!
1384!--            Output of instantaneous data
1385               IF ( av == 0 )  THEN
1386                  CALL surface_output_collect( surf_def_h(0)%ssws,             &
1387                                               surf_def_h(1)%ssws,             &
1388                                               surf_lsm_h%ssws,                &
1389                                               surf_usm_h%ssws,                &
1390                                               surf_def_v(0)%ssws,             &
1391                                               surf_lsm_v(0)%ssws,             &
1392                                               surf_usm_v(0)%ssws,             &
1393                                               surf_def_v(1)%ssws,             &
1394                                               surf_lsm_v(1)%ssws,             &
1395                                               surf_usm_v(1)%ssws,             &
1396                                               surf_def_v(2)%ssws,             &
1397                                               surf_lsm_v(2)%ssws,             &
1398                                               surf_usm_v(2)%ssws,             &
1399                                               surf_def_v(3)%ssws,             &
1400                                               surf_lsm_v(3)%ssws,             &
1401                                               surf_usm_v(3)%ssws )
1402               ELSE
1403!
1404!--               Output of averaged data
1405                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1406                                        REAL( average_count_surf, KIND=wp )
1407                  surfaces%var_av(:,n_out) = 0.0_wp
1408                                                       
1409               ENDIF
1410
1411            CASE ( 'qcsws' )
1412!
1413!--            Output of instantaneous data
1414               IF ( av == 0 )  THEN
1415                  CALL surface_output_collect( surf_def_h(0)%qcsws,            &
1416                                               surf_def_h(1)%qcsws,            &
1417                                               surf_lsm_h%qcsws,               &
1418                                               surf_usm_h%qcsws,               &
1419                                               surf_def_v(0)%qcsws,            &
1420                                               surf_lsm_v(0)%qcsws,            &
1421                                               surf_usm_v(0)%qcsws,            &
1422                                               surf_def_v(1)%qcsws,            &
1423                                               surf_lsm_v(1)%qcsws,            &
1424                                               surf_usm_v(1)%qcsws,            &
1425                                               surf_def_v(2)%qcsws,            &
1426                                               surf_lsm_v(2)%qcsws,            &
1427                                               surf_usm_v(2)%qcsws,            &
1428                                               surf_def_v(3)%qcsws,            &
1429                                               surf_lsm_v(3)%qcsws,            &
1430                                               surf_usm_v(3)%qcsws )
1431               ELSE
1432!
1433!--               Output of averaged data
1434                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1435                                        REAL( average_count_surf, KIND=wp )
1436                  surfaces%var_av(:,n_out) = 0.0_wp
1437                                                       
1438               ENDIF
1439
1440            CASE ( 'ncsws' )
1441!
1442!--            Output of instantaneous data
1443               IF ( av == 0 )  THEN
1444                  CALL surface_output_collect( surf_def_h(0)%ncsws,            &
1445                                               surf_def_h(1)%ncsws,            &
1446                                               surf_lsm_h%ncsws,               &
1447                                               surf_usm_h%ncsws,               &
1448                                               surf_def_v(0)%ncsws,            &
1449                                               surf_lsm_v(0)%ncsws,            &
1450                                               surf_usm_v(0)%ncsws,            &
1451                                               surf_def_v(1)%ncsws,            &
1452                                               surf_lsm_v(1)%ncsws,            &
1453                                               surf_usm_v(1)%ncsws,            &
1454                                               surf_def_v(2)%ncsws,            &
1455                                               surf_lsm_v(2)%ncsws,            &
1456                                               surf_usm_v(2)%ncsws,            &
1457                                               surf_def_v(3)%ncsws,            &
1458                                               surf_lsm_v(3)%ncsws,            &
1459                                               surf_usm_v(3)%ncsws )
1460               ELSE
1461!
1462!--               Output of averaged data
1463                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1464                                        REAL( average_count_surf, KIND=wp )
1465                  surfaces%var_av(:,n_out) = 0.0_wp
1466                                                       
1467               ENDIF
1468
1469            CASE ( 'qrsws' )
1470!
1471!--            Output of instantaneous data
1472               IF ( av == 0 )  THEN
1473                  CALL surface_output_collect( surf_def_h(0)%qrsws,            &
1474                                               surf_def_h(1)%qrsws,            &
1475                                               surf_lsm_h%qrsws,               &
1476                                               surf_usm_h%qrsws,               &
1477                                               surf_def_v(0)%qrsws,            &
1478                                               surf_lsm_v(0)%qrsws,            &
1479                                               surf_usm_v(0)%qrsws,            &
1480                                               surf_def_v(1)%qrsws,            &
1481                                               surf_lsm_v(1)%qrsws,            &
1482                                               surf_usm_v(1)%qrsws,            &
1483                                               surf_def_v(2)%qrsws,            &
1484                                               surf_lsm_v(2)%qrsws,            &
1485                                               surf_usm_v(2)%qrsws,            &
1486                                               surf_def_v(3)%qrsws,            &
1487                                               surf_lsm_v(3)%qrsws,            &
1488                                               surf_usm_v(3)%qrsws )
1489               ELSE
1490!
1491!--               Output of averaged data
1492                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1493                                        REAL( average_count_surf, KIND=wp )
1494                  surfaces%var_av(:,n_out) = 0.0_wp
1495                                                       
1496               ENDIF
1497
1498            CASE ( 'nrsws' )
1499!
1500!--            Output of instantaneous data
1501               IF ( av == 0 )  THEN
1502                  CALL surface_output_collect( surf_def_h(0)%nrsws,            &
1503                                               surf_def_h(1)%nrsws,            &
1504                                               surf_lsm_h%nrsws,               &
1505                                               surf_usm_h%nrsws,               &
1506                                               surf_def_v(0)%nrsws,            &
1507                                               surf_lsm_v(0)%nrsws,            &
1508                                               surf_usm_v(0)%nrsws,            &
1509                                               surf_def_v(1)%nrsws,            &
1510                                               surf_lsm_v(1)%nrsws,            &
1511                                               surf_usm_v(1)%nrsws,            &
1512                                               surf_def_v(2)%nrsws,            &
1513                                               surf_lsm_v(2)%nrsws,            &
1514                                               surf_usm_v(2)%nrsws,            &
1515                                               surf_def_v(3)%nrsws,            &
1516                                               surf_lsm_v(3)%nrsws,            &
1517                                               surf_usm_v(3)%nrsws )
1518               ELSE
1519!
1520!--               Output of averaged data
1521                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1522                                        REAL( average_count_surf, KIND=wp )
1523                  surfaces%var_av(:,n_out) = 0.0_wp
1524                                                       
1525               ENDIF
1526
1527            CASE ( 'sasws' )
1528!
1529!--            Output of instantaneous data
1530               IF ( av == 0 )  THEN
1531                  CALL surface_output_collect( surf_def_h(0)%sasws,            &
1532                                               surf_def_h(1)%sasws,            &
1533                                               surf_lsm_h%sasws,               &
1534                                               surf_usm_h%sasws,               &
1535                                               surf_def_v(0)%sasws,            &
1536                                               surf_lsm_v(0)%sasws,            &
1537                                               surf_usm_v(0)%sasws,            &
1538                                               surf_def_v(1)%sasws,            &
1539                                               surf_lsm_v(1)%sasws,            &
1540                                               surf_usm_v(1)%sasws,            &
1541                                               surf_def_v(2)%sasws,            &
1542                                               surf_lsm_v(2)%sasws,            &
1543                                               surf_usm_v(2)%sasws,            &
1544                                               surf_def_v(3)%sasws,            &
1545                                               surf_lsm_v(3)%sasws,            &
1546                                               surf_usm_v(3)%sasws )
1547               ELSE
1548!
1549!--               Output of averaged data
1550                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1551                                        REAL( average_count_surf, KIND=wp )
1552                  surfaces%var_av(:,n_out) = 0.0_wp
1553                                                       
1554               ENDIF
1555
1556            CASE ( 'q_surface' )
1557!
1558!--            Output of instantaneous data
1559               IF ( av == 0 )  THEN
1560                  CALL surface_output_collect( surf_def_h(0)%q_surface,        &
1561                                               surf_def_h(1)%q_surface,        &
1562                                               surf_lsm_h%q_surface,           &
1563                                               surf_usm_h%q_surface,           &
1564                                               surf_def_v(0)%q_surface,        &
1565                                               surf_lsm_v(0)%q_surface,        &
1566                                               surf_usm_v(0)%q_surface,        &
1567                                               surf_def_v(1)%q_surface,        &
1568                                               surf_lsm_v(1)%q_surface,        &
1569                                               surf_usm_v(1)%q_surface,        &
1570                                               surf_def_v(2)%q_surface,        &
1571                                               surf_lsm_v(2)%q_surface,        &
1572                                               surf_usm_v(2)%q_surface,        &
1573                                               surf_def_v(3)%q_surface,        &
1574                                               surf_lsm_v(3)%q_surface,        &
1575                                               surf_usm_v(3)%q_surface )
1576               ELSE
1577!
1578!--               Output of averaged data
1579                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1580                                        REAL( average_count_surf, KIND=wp )
1581                  surfaces%var_av(:,n_out) = 0.0_wp
1582                                                       
1583               ENDIF
1584
1585            CASE ( 'theta_surface' )
1586!
1587!--            Output of instantaneous data
1588               IF ( av == 0 )  THEN
1589                  CALL surface_output_collect( surf_def_h(0)%pt_surface,       &
1590                                               surf_def_h(1)%pt_surface,       &
1591                                               surf_lsm_h%pt_surface,          &
1592                                               surf_usm_h%pt_surface,          &
1593                                               surf_def_v(0)%pt_surface,       &
1594                                               surf_lsm_v(0)%pt_surface,       &
1595                                               surf_usm_v(0)%pt_surface,       &
1596                                               surf_def_v(1)%pt_surface,       &
1597                                               surf_lsm_v(1)%pt_surface,       &
1598                                               surf_usm_v(1)%pt_surface,       &
1599                                               surf_def_v(2)%pt_surface,       &
1600                                               surf_lsm_v(2)%pt_surface,       &
1601                                               surf_usm_v(2)%pt_surface,       &
1602                                               surf_def_v(3)%pt_surface,       &
1603                                               surf_lsm_v(3)%pt_surface,       &
1604                                               surf_usm_v(3)%pt_surface )
1605               ELSE
1606!
1607!--               Output of averaged data
1608                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1609                                        REAL( average_count_surf, KIND=wp )
1610                  surfaces%var_av(:,n_out) = 0.0_wp
1611                                                       
1612               ENDIF
1613
1614            CASE ( 'thetav_surface' )
1615!
1616!--            Output of instantaneous data
1617               IF ( av == 0 )  THEN
1618                  CALL surface_output_collect( surf_def_h(0)%vpt_surface,      &
1619                                               surf_def_h(1)%vpt_surface,      &
1620                                               surf_lsm_h%vpt_surface,         &
1621                                               surf_usm_h%vpt_surface,         &
1622                                               surf_def_v(0)%vpt_surface,      &
1623                                               surf_lsm_v(0)%vpt_surface,      &
1624                                               surf_usm_v(0)%vpt_surface,      &
1625                                               surf_def_v(1)%vpt_surface,      &
1626                                               surf_lsm_v(1)%vpt_surface,      &
1627                                               surf_usm_v(1)%vpt_surface,      &
1628                                               surf_def_v(2)%vpt_surface,      &
1629                                               surf_lsm_v(2)%vpt_surface,      &
1630                                               surf_usm_v(2)%vpt_surface,      &
1631                                               surf_def_v(3)%vpt_surface,      &
1632                                               surf_lsm_v(3)%vpt_surface,      &
1633                                               surf_usm_v(3)%vpt_surface)
1634               ELSE
1635!
1636!--               Output of averaged data
1637                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1638                                        REAL( average_count_surf, KIND=wp )
1639                  surfaces%var_av(:,n_out) = 0.0_wp
1640                                                       
1641               ENDIF
1642
1643            CASE ( 'rad_net' )
1644!
1645!--            Output of instantaneous data
1646               IF ( av == 0 )  THEN
1647                  CALL surface_output_collect( surf_def_h(0)%rad_net,          &
1648                                               surf_def_h(1)%rad_net,          &
1649                                               surf_lsm_h%rad_net,             &
1650                                               surf_usm_h%rad_net,             &
1651                                               surf_def_v(0)%rad_net,          &
1652                                               surf_lsm_v(0)%rad_net,          &
1653                                               surf_usm_v(0)%rad_net,          &
1654                                               surf_def_v(1)%rad_net,          &
1655                                               surf_lsm_v(1)%rad_net,          &
1656                                               surf_usm_v(1)%rad_net,          &
1657                                               surf_def_v(2)%rad_net,          &
1658                                               surf_lsm_v(2)%rad_net,          &
1659                                               surf_usm_v(2)%rad_net,          &
1660                                               surf_def_v(3)%rad_net,          &
1661                                               surf_lsm_v(3)%rad_net,          &
1662                                               surf_usm_v(3)%rad_net ) 
1663               ELSE
1664!
1665!--               Output of averaged data
1666                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1667                                        REAL( average_count_surf, KIND=wp )
1668                  surfaces%var_av(:,n_out) = 0.0_wp
1669                                                       
1670               ENDIF
1671
1672            CASE ( 'rad_lw_in' )
1673!
1674!--            Output of instantaneous data
1675               IF ( av == 0 )  THEN
1676                  CALL surface_output_collect( surf_def_h(0)%rad_lw_in,        &
1677                                               surf_def_h(1)%rad_lw_in,        &
1678                                               surf_lsm_h%rad_lw_in,           &
1679                                               surf_usm_h%rad_lw_in,           &
1680                                               surf_def_v(0)%rad_lw_in,        &
1681                                               surf_lsm_v(0)%rad_lw_in,        &
1682                                               surf_usm_v(0)%rad_lw_in,        &
1683                                               surf_def_v(1)%rad_lw_in,        &
1684                                               surf_lsm_v(1)%rad_lw_in,        &
1685                                               surf_usm_v(1)%rad_lw_in,        &
1686                                               surf_def_v(2)%rad_lw_in,        &
1687                                               surf_lsm_v(2)%rad_lw_in,        &
1688                                               surf_usm_v(2)%rad_lw_in,        &
1689                                               surf_def_v(3)%rad_lw_in,        &
1690                                               surf_lsm_v(3)%rad_lw_in,        &
1691                                               surf_usm_v(3)%rad_lw_in )
1692               ELSE
1693!
1694!--               Output of averaged data
1695                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1696                                        REAL( average_count_surf, KIND=wp )
1697                  surfaces%var_av(:,n_out) = 0.0_wp
1698                                                       
1699               ENDIF
1700
1701            CASE ( 'rad_lw_out' )
1702!
1703!--            Output of instantaneous data
1704               IF ( av == 0 )  THEN
1705                  CALL surface_output_collect( surf_def_h(0)%rad_lw_out,       &
1706                                               surf_def_h(1)%rad_lw_out,       &
1707                                               surf_lsm_h%rad_lw_out,          &
1708                                               surf_usm_h%rad_lw_out,          &
1709                                               surf_def_v(0)%rad_lw_out,       &
1710                                               surf_lsm_v(0)%rad_lw_out,       &
1711                                               surf_usm_v(0)%rad_lw_out,       &
1712                                               surf_def_v(1)%rad_lw_out,       &
1713                                               surf_lsm_v(1)%rad_lw_out,       &
1714                                               surf_usm_v(1)%rad_lw_out,       &
1715                                               surf_def_v(2)%rad_lw_out,       &
1716                                               surf_lsm_v(2)%rad_lw_out,       &
1717                                               surf_usm_v(2)%rad_lw_out,       &
1718                                               surf_def_v(3)%rad_lw_out,       &
1719                                               surf_lsm_v(3)%rad_lw_out,       &
1720                                               surf_usm_v(3)%rad_lw_out )
1721               ELSE
1722!
1723!--               Output of averaged data
1724                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1725                                        REAL( average_count_surf, KIND=wp )
1726                  surfaces%var_av(:,n_out) = 0.0_wp
1727                                                       
1728               ENDIF
1729
1730            CASE ( 'rad_sw_in' )
1731!
1732!--            Output of instantaneous data
1733               IF ( av == 0 )  THEN
1734                  CALL surface_output_collect( surf_def_h(0)%rad_sw_in,        &
1735                                               surf_def_h(1)%rad_sw_in,        &
1736                                               surf_lsm_h%rad_sw_in,           &
1737                                               surf_usm_h%rad_sw_in,           &
1738                                               surf_def_v(0)%rad_sw_in,        &
1739                                               surf_lsm_v(0)%rad_sw_in,        &
1740                                               surf_usm_v(0)%rad_sw_in,        &
1741                                               surf_def_v(1)%rad_sw_in,        &
1742                                               surf_lsm_v(1)%rad_sw_in,        &
1743                                               surf_usm_v(1)%rad_sw_in,        &
1744                                               surf_def_v(2)%rad_sw_in,        &
1745                                               surf_lsm_v(2)%rad_sw_in,        &
1746                                               surf_usm_v(2)%rad_sw_in,        &
1747                                               surf_def_v(3)%rad_sw_in,        &
1748                                               surf_lsm_v(3)%rad_sw_in,        &
1749                                               surf_usm_v(3)%rad_sw_in )
1750               ELSE
1751!
1752!--               Output of averaged data
1753                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1754                                        REAL( average_count_surf, KIND=wp )
1755                  surfaces%var_av(:,n_out) = 0.0_wp
1756                                                       
1757               ENDIF
1758
1759            CASE ( 'rad_sw_out' )
1760!
1761!--            Output of instantaneous data
1762               IF ( av == 0 )  THEN
1763                  CALL surface_output_collect( surf_def_h(0)%rad_sw_out,       &
1764                                               surf_def_h(1)%rad_sw_out,       &
1765                                               surf_lsm_h%rad_sw_out,          &
1766                                               surf_usm_h%rad_sw_out,          &
1767                                               surf_def_v(0)%rad_sw_out,       &
1768                                               surf_lsm_v(0)%rad_sw_out,       &
1769                                               surf_usm_v(0)%rad_sw_out,       &
1770                                               surf_def_v(1)%rad_sw_out,       &
1771                                               surf_lsm_v(1)%rad_sw_out,       &
1772                                               surf_usm_v(1)%rad_sw_out,       &
1773                                               surf_def_v(2)%rad_sw_out,       &
1774                                               surf_lsm_v(2)%rad_sw_out,       &
1775                                               surf_usm_v(2)%rad_sw_out,       &
1776                                               surf_def_v(3)%rad_sw_out,       &
1777                                               surf_lsm_v(3)%rad_sw_out,       &
1778                                               surf_usm_v(3)%rad_sw_out )
1779               ELSE
1780!
1781!--               Output of averaged data
1782                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1783                                        REAL( average_count_surf, KIND=wp )
1784                  surfaces%var_av(:,n_out) = 0.0_wp
1785                                                       
1786               ENDIF
1787
1788            CASE ( 'ghf' )
1789!
1790!--            Output of instantaneous data
1791               IF ( av == 0 )  THEN
1792                  CALL surface_output_collect( surf_def_h(0)%ghf,              &
1793                                               surf_def_h(1)%ghf,              &
1794                                               surf_lsm_h%ghf,                 &
1795                                               surf_usm_h%ghf,                 &
1796                                               surf_def_v(0)%ghf,              &
1797                                               surf_lsm_v(0)%ghf,              &
1798                                               surf_usm_v(0)%ghf,              &
1799                                               surf_def_v(1)%ghf,              &
1800                                               surf_lsm_v(1)%ghf,              &
1801                                               surf_usm_v(1)%ghf,              &
1802                                               surf_def_v(2)%ghf,              &
1803                                               surf_lsm_v(2)%ghf,              &
1804                                               surf_usm_v(2)%ghf,              &
1805                                               surf_def_v(3)%ghf,              &
1806                                               surf_lsm_v(3)%ghf,              &
1807                                               surf_usm_v(3)%ghf )     
1808                                                                        ELSE
1809!
1810!--               Output of averaged data
1811                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1812                                        REAL( average_count_surf, KIND=wp )
1813                  surfaces%var_av(:,n_out) = 0.0_wp
1814                                                       
1815               ENDIF
1816                     
1817            CASE ( 'r_a' )                                                     
1818!
1819!--            Output of instantaneous data
1820               IF ( av == 0 )  THEN
1821                  CALL surface_output_collect( surf_def_h(0)%r_a,              &
1822                                               surf_def_h(1)%r_a,              &
1823                                               surf_lsm_h%r_a,                 &
1824                                               surf_usm_h%r_a,                 &
1825                                               surf_def_v(0)%r_a,              &
1826                                               surf_lsm_v(0)%r_a,              &
1827                                               surf_usm_v(0)%r_a,              &
1828                                               surf_def_v(1)%r_a,              &
1829                                               surf_lsm_v(1)%r_a,              &
1830                                               surf_usm_v(1)%r_a,              &
1831                                               surf_def_v(2)%r_a,              &
1832                                               surf_lsm_v(2)%r_a,              &
1833                                               surf_usm_v(2)%r_a,              &
1834                                               surf_def_v(3)%r_a,              &
1835                                               surf_lsm_v(3)%r_a,              &
1836                                               surf_usm_v(3)%r_a )     
1837                                                                      ELSE
1838!
1839!--               Output of averaged data
1840                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1841                                        REAL( average_count_surf, KIND=wp )
1842                  surfaces%var_av(:,n_out) = 0.0_wp
1843                                                       
1844               ENDIF
1845                       
1846            CASE ( 'r_soil' )                                                 
1847!
1848!--            Output of instantaneous data
1849               IF ( av == 0 )  THEN
1850                  CALL surface_output_collect( surf_def_h(0)%r_soil,           &
1851                                               surf_def_h(1)%r_soil,           &
1852                                               surf_lsm_h%r_soil,              &
1853                                               surf_usm_h%r_soil,              &
1854                                               surf_def_v(0)%r_soil,           &
1855                                               surf_lsm_v(0)%r_soil,           &
1856                                               surf_usm_v(0)%r_soil,           &
1857                                               surf_def_v(1)%r_soil,           &
1858                                               surf_lsm_v(1)%r_soil,           &
1859                                               surf_usm_v(1)%r_soil,           &
1860                                               surf_def_v(2)%r_soil,           &
1861                                               surf_lsm_v(2)%r_soil,           &
1862                                               surf_usm_v(2)%r_soil,           &
1863                                               surf_def_v(3)%r_soil,           &
1864                                               surf_lsm_v(3)%r_soil,           &
1865                                               surf_usm_v(3)%r_soil ) 
1866               ELSE
1867!
1868!--               Output of averaged data
1869                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1870                                        REAL( average_count_surf, KIND=wp )
1871                  surfaces%var_av(:,n_out) = 0.0_wp
1872                                                       
1873               ENDIF
1874
1875            CASE ( 'r_canopy' )
1876!
1877!--            Output of instantaneous data
1878               IF ( av == 0 )  THEN
1879                  CALL surface_output_collect( surf_def_h(0)%r_canopy,         &
1880                                               surf_def_h(1)%r_canopy,         &
1881                                               surf_lsm_h%r_canopy,            &
1882                                               surf_usm_h%r_canopy,            &
1883                                               surf_def_v(0)%r_canopy,         &
1884                                               surf_lsm_v(0)%r_canopy,         &
1885                                               surf_usm_v(0)%r_canopy,         &
1886                                               surf_def_v(1)%r_canopy,         &
1887                                               surf_lsm_v(1)%r_canopy,         &
1888                                               surf_usm_v(1)%r_canopy,         &
1889                                               surf_def_v(2)%r_canopy,         &
1890                                               surf_lsm_v(2)%r_canopy,         &
1891                                               surf_usm_v(2)%r_canopy,         &
1892                                               surf_def_v(3)%r_canopy,         &
1893                                               surf_lsm_v(3)%r_canopy,         &
1894                                               surf_usm_v(3)%r_canopy ) 
1895               ELSE
1896!
1897!--               Output of averaged data
1898                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1899                                        REAL( average_count_surf, KIND=wp )
1900                  surfaces%var_av(:,n_out) = 0.0_wp
1901                                                       
1902               ENDIF
1903
1904            CASE ( 'r_s' )
1905!
1906!--            Output of instantaneous data
1907               IF ( av == 0 )  THEN
1908                  CALL surface_output_collect( surf_def_h(0)%r_s,              &
1909                                               surf_def_h(1)%r_s,              &
1910                                               surf_lsm_h%r_s,                 &
1911                                               surf_usm_h%r_s,                 &
1912                                               surf_def_v(0)%r_s,              &
1913                                               surf_lsm_v(0)%r_s,              &
1914                                               surf_usm_v(0)%r_s,              &
1915                                               surf_def_v(1)%r_s,              &
1916                                               surf_lsm_v(1)%r_s,              &
1917                                               surf_usm_v(1)%r_s,              &
1918                                               surf_def_v(2)%r_s,              &
1919                                               surf_lsm_v(2)%r_s,              &
1920                                               surf_usm_v(2)%r_s,              &
1921                                               surf_def_v(3)%r_s,              &
1922                                               surf_lsm_v(3)%r_s,              &
1923                                               surf_usm_v(3)%r_s ) 
1924               ELSE
1925!
1926!--               Output of averaged data
1927                  surfaces%var_out(:) = surfaces%var_av(:,n_out) /             &
1928                                        REAL( average_count_surf, KIND=wp )
1929                  surfaces%var_av(:,n_out) = 0.0_wp
1930                                                       
1931               ENDIF
1932
1933!
1934!--            Add further variables:
1935!--            'css', 'cssws', 'qsws_liq', 'qsws_soil', 'qsws_veg'
1936
1937         END SELECT
1938!
1939!--      Write to binary file:
1940!--      - surfaces%points ( 3, 1-npoints )
1941!--      - surfaces%polygons ( 5, 1-ns )
1942!--      - surfaces%var_out ( 1-ns, time )
1943!--      - Dimension: 1-nsurfaces, 1-npoints - can be ordered consecutively
1944!--      - Distinguish between average and non-average data
1945         DO  i = 0, io_blocks-1
1946            IF ( i == io_group )  THEN
1947               WRITE ( 25+av )  trimvar
1948               WRITE ( 25+av )  surfaces%var_out
1949            ENDIF
1950#if defined( __parallel )
1951            CALL MPI_BARRIER( comm2d, ierr )
1952#endif
1953         ENDDO
1954
1955      ENDDO
1956     
1957!
1958!--      If averaged output was written to NetCDF file, set the counter to zero
1959         IF ( av == 1 )  average_count_surf = 0
1960             
1961   END SUBROUTINE surface_output
1962   
1963!------------------------------------------------------------------------------!
1964! Description:
1965! ------------
1966!> Routine for controlling the data averaging.
1967!------------------------------------------------------------------------------!     
1968   SUBROUTINE surface_output_averaging
1969   
1970      IMPLICIT NONE
1971     
1972      CHARACTER(LEN=100) ::  trimvar !< dummy variable for current output variable
1973       
1974      INTEGER(iwp) ::  l      !< running index for surface-element orientation
1975      INTEGER(iwp) ::  m      !< running index for surface elements
1976      INTEGER(iwp) ::  n_out  !< counter variables for surface output
1977     
1978      n_out = 0
1979      DO  WHILE ( dosurf(1,n_out+1)(1:1) /= ' ' )
1980         
1981         n_out   = n_out + 1
1982         trimvar = TRIM( dosurf(1,n_out) )
1983
1984         SELECT CASE ( trimvar )
1985
1986            CASE ( 'us' )
1987               CALL surface_output_sum_up( surf_def_h(0)%us,                   &
1988                                           surf_def_h(1)%us,                   &
1989                                           surf_lsm_h%us,                      &
1990                                           surf_usm_h%us,                      &
1991                                           surf_def_v(0)%us,                   &
1992                                           surf_lsm_v(0)%us,                   &
1993                                           surf_usm_v(0)%us,                   &
1994                                           surf_def_v(1)%us,                   &
1995                                           surf_lsm_v(1)%us,                   &
1996                                           surf_usm_v(1)%us,                   &
1997                                           surf_def_v(2)%us,                   &
1998                                           surf_lsm_v(2)%us,                   &
1999                                           surf_usm_v(2)%us,                   &
2000                                           surf_def_v(3)%us,                   &
2001                                           surf_lsm_v(3)%us,                   &
2002                                           surf_usm_v(3)%us, n_out ) 
2003
2004            CASE ( 'ts' )
2005               CALL surface_output_sum_up( surf_def_h(0)%ts,                   &
2006                                           surf_def_h(1)%ts,                   &
2007                                           surf_lsm_h%ts,                      &
2008                                           surf_usm_h%ts,                      &
2009                                           surf_def_v(0)%ts,                   &
2010                                           surf_lsm_v(0)%ts,                   &
2011                                           surf_usm_v(0)%ts,                   &
2012                                           surf_def_v(1)%ts,                   &
2013                                           surf_lsm_v(1)%ts,                   &
2014                                           surf_usm_v(1)%ts,                   &
2015                                           surf_def_v(2)%ts,                   &
2016                                           surf_lsm_v(2)%ts,                   &
2017                                           surf_usm_v(2)%ts,                   &
2018                                           surf_def_v(3)%ts,                   &
2019                                           surf_lsm_v(3)%ts,                   &
2020                                           surf_usm_v(3)%ts, n_out ) 
2021
2022            CASE ( 'qs' )
2023               CALL surface_output_sum_up( surf_def_h(0)%qs,                   &
2024                                           surf_def_h(1)%qs,                   &
2025                                           surf_lsm_h%qs,                      &
2026                                           surf_usm_h%qs,                      &
2027                                           surf_def_v(0)%qs,                   &
2028                                           surf_lsm_v(0)%qs,                   &
2029                                           surf_usm_v(0)%qs,                   &
2030                                           surf_def_v(1)%qs,                   &
2031                                           surf_lsm_v(1)%qs,                   &
2032                                           surf_usm_v(1)%qs,                   &
2033                                           surf_def_v(2)%qs,                   &
2034                                           surf_lsm_v(2)%qs,                   &
2035                                           surf_usm_v(2)%qs,                   &
2036                                           surf_def_v(3)%qs,                   &
2037                                           surf_lsm_v(3)%qs,                   &
2038                                           surf_usm_v(3)%qs, n_out ) 
2039
2040            CASE ( 'ss' )
2041               CALL surface_output_sum_up( surf_def_h(0)%ss,                   &
2042                                           surf_def_h(1)%ss,                   &
2043                                           surf_lsm_h%ss,                      &
2044                                           surf_usm_h%ss,                      &
2045                                           surf_def_v(0)%ss,                   &
2046                                           surf_lsm_v(0)%ss,                   &
2047                                           surf_usm_v(0)%ss,                   &
2048                                           surf_def_v(1)%ss,                   &
2049                                           surf_lsm_v(1)%ss,                   &
2050                                           surf_usm_v(1)%ss,                   &
2051                                           surf_def_v(2)%ss,                   &
2052                                           surf_lsm_v(2)%ss,                   &
2053                                           surf_usm_v(2)%ss,                   &
2054                                           surf_def_v(3)%ss,                   &
2055                                           surf_lsm_v(3)%ss,                   &
2056                                           surf_usm_v(3)%ss, n_out ) 
2057
2058            CASE ( 'qcs' )
2059               CALL surface_output_sum_up( surf_def_h(0)%qcs,                  &
2060                                           surf_def_h(1)%qcs,                  &
2061                                           surf_lsm_h%qcs,                     &
2062                                           surf_usm_h%qcs,                     &
2063                                           surf_def_v(0)%qcs,                  &
2064                                           surf_lsm_v(0)%qcs,                  &
2065                                           surf_usm_v(0)%qcs,                  &
2066                                           surf_def_v(1)%qcs,                  &
2067                                           surf_lsm_v(1)%qcs,                  &
2068                                           surf_usm_v(1)%qcs,                  &
2069                                           surf_def_v(2)%qcs,                  &
2070                                           surf_lsm_v(2)%qcs,                  &
2071                                           surf_usm_v(2)%qcs,                  &
2072                                           surf_def_v(3)%qcs,                  &
2073                                           surf_lsm_v(3)%qcs,                  &
2074                                           surf_usm_v(3)%qcs, n_out ) 
2075
2076            CASE ( 'ncs' )
2077               CALL surface_output_sum_up( surf_def_h(0)%ncs,                  &
2078                                           surf_def_h(1)%ncs,                  &
2079                                           surf_lsm_h%ncs,                     &
2080                                           surf_usm_h%ncs,                     &
2081                                           surf_def_v(0)%ncs,                  &
2082                                           surf_lsm_v(0)%ncs,                  &
2083                                           surf_usm_v(0)%ncs,                  &
2084                                           surf_def_v(1)%ncs,                  &
2085                                           surf_lsm_v(1)%ncs,                  &
2086                                           surf_usm_v(1)%ncs,                  &
2087                                           surf_def_v(2)%ncs,                  &
2088                                           surf_lsm_v(2)%ncs,                  &
2089                                           surf_usm_v(2)%ncs,                  &
2090                                           surf_def_v(3)%ncs,                  &
2091                                           surf_lsm_v(3)%ncs,                  &
2092                                           surf_usm_v(3)%ncs, n_out ) 
2093
2094            CASE ( 'qrs' )
2095               CALL surface_output_sum_up( surf_def_h(0)%qrs,                  &
2096                                           surf_def_h(1)%qrs,                  &
2097                                           surf_lsm_h%qrs,                     &
2098                                           surf_usm_h%qrs,                     &
2099                                           surf_def_v(0)%qrs,                  &
2100                                           surf_lsm_v(0)%qrs,                  &
2101                                           surf_usm_v(0)%qrs,                  &
2102                                           surf_def_v(1)%qrs,                  &
2103                                           surf_lsm_v(1)%qrs,                  &
2104                                           surf_usm_v(1)%qrs,                  &
2105                                           surf_def_v(2)%qrs,                  &
2106                                           surf_lsm_v(2)%qrs,                  &
2107                                           surf_usm_v(2)%qrs,                  &
2108                                           surf_def_v(3)%qrs,                  &
2109                                           surf_lsm_v(3)%qrs,                  &
2110                                           surf_usm_v(3)%qrs, n_out ) 
2111
2112            CASE ( 'nrs' )
2113               CALL surface_output_sum_up( surf_def_h(0)%nrs,                  &
2114                                           surf_def_h(1)%nrs,                  &
2115                                           surf_lsm_h%nrs,                     &
2116                                           surf_usm_h%nrs,                     &
2117                                           surf_def_v(0)%nrs,                  &
2118                                           surf_lsm_v(0)%nrs,                  &
2119                                           surf_usm_v(0)%nrs,                  &
2120                                           surf_def_v(1)%nrs,                  &
2121                                           surf_lsm_v(1)%nrs,                  &
2122                                           surf_usm_v(1)%nrs,                  &
2123                                           surf_def_v(2)%nrs,                  &
2124                                           surf_lsm_v(2)%nrs,                  &
2125                                           surf_usm_v(2)%nrs,                  &
2126                                           surf_def_v(3)%nrs,                  &
2127                                           surf_lsm_v(3)%nrs,                  &
2128                                           surf_usm_v(3)%nrs, n_out ) 
2129
2130            CASE ( 'ol' )
2131               CALL surface_output_sum_up( surf_def_h(0)%ol,                   &
2132                                           surf_def_h(1)%ol,                   &
2133                                           surf_lsm_h%ol,                      &
2134                                           surf_usm_h%ol,                      &
2135                                           surf_def_v(0)%ol,                   &
2136                                           surf_lsm_v(0)%ol,                   &
2137                                           surf_usm_v(0)%ol,                   &
2138                                           surf_def_v(1)%ol,                   &
2139                                           surf_lsm_v(1)%ol,                   &
2140                                           surf_usm_v(1)%ol,                   &
2141                                           surf_def_v(2)%ol,                   &
2142                                           surf_lsm_v(2)%ol,                   &
2143                                           surf_usm_v(2)%ol,                   &
2144                                           surf_def_v(3)%ol,                   &
2145                                           surf_lsm_v(3)%ol,                   &
2146                                           surf_usm_v(3)%ol, n_out ) 
2147
2148            CASE ( 'z0' )
2149               CALL surface_output_sum_up( surf_def_h(0)%z0,                   &
2150                                           surf_def_h(1)%z0,                   &
2151                                           surf_lsm_h%z0,                      &
2152                                           surf_usm_h%z0,                      &
2153                                           surf_def_v(0)%z0,                   &
2154                                           surf_lsm_v(0)%z0,                   &
2155                                           surf_usm_v(0)%z0,                   &
2156                                           surf_def_v(1)%z0,                   &
2157                                           surf_lsm_v(1)%z0,                   &
2158                                           surf_usm_v(1)%z0,                   &
2159                                           surf_def_v(2)%z0,                   &
2160                                           surf_lsm_v(2)%z0,                   &
2161                                           surf_usm_v(2)%z0,                   &
2162                                           surf_def_v(3)%z0,                   &
2163                                           surf_lsm_v(3)%z0,                   &
2164                                           surf_usm_v(3)%z0, n_out ) 
2165
2166            CASE ( 'z0h' )
2167               CALL surface_output_sum_up( surf_def_h(0)%z0h,                  &
2168                                           surf_def_h(1)%z0h,                  &
2169                                           surf_lsm_h%z0h,                     &
2170                                           surf_usm_h%z0h,                     &
2171                                           surf_def_v(0)%z0h,                  &
2172                                           surf_lsm_v(0)%z0h,                  &
2173                                           surf_usm_v(0)%z0h,                  &
2174                                           surf_def_v(1)%z0h,                  &
2175                                           surf_lsm_v(1)%z0h,                  &
2176                                           surf_usm_v(1)%z0h,                  &
2177                                           surf_def_v(2)%z0h,                  &
2178                                           surf_lsm_v(2)%z0h,                  &
2179                                           surf_usm_v(2)%z0h,                  &
2180                                           surf_def_v(3)%z0h,                  &
2181                                           surf_lsm_v(3)%z0h,                  &
2182                                           surf_usm_v(3)%z0h, n_out )         
2183
2184            CASE ( 'z0q' )
2185               CALL surface_output_sum_up( surf_def_h(0)%z0q,                  &
2186                                           surf_def_h(1)%z0q,                  &
2187                                           surf_lsm_h%z0q,                     &
2188                                           surf_usm_h%z0q,                     &
2189                                           surf_def_v(0)%z0q,                  &
2190                                           surf_lsm_v(0)%z0q,                  &
2191                                           surf_usm_v(0)%z0q,                  &
2192                                           surf_def_v(1)%z0q,                  &
2193                                           surf_lsm_v(1)%z0q,                  &
2194                                           surf_usm_v(1)%z0q,                  &
2195                                           surf_def_v(2)%z0q,                  &
2196                                           surf_lsm_v(2)%z0q,                  &
2197                                           surf_usm_v(2)%z0q,                  &
2198                                           surf_def_v(3)%z0q,                  &
2199                                           surf_lsm_v(3)%z0q,                  &
2200                                           surf_usm_v(3)%z0q, n_out ) 
2201
2202            CASE ( 'theta1' )                                                 
2203               CALL surface_output_sum_up( surf_def_h(0)%pt1,                  &
2204                                           surf_def_h(1)%pt1,                  &
2205                                           surf_lsm_h%pt1,                     &
2206                                           surf_usm_h%pt1,                     &
2207                                           surf_def_v(0)%pt1,                  &
2208                                           surf_lsm_v(0)%pt1,                  &
2209                                           surf_usm_v(0)%pt1,                  &
2210                                           surf_def_v(1)%pt1,                  &
2211                                           surf_lsm_v(1)%pt1,                  &
2212                                           surf_usm_v(1)%pt1,                  &
2213                                           surf_def_v(2)%pt1,                  &
2214                                           surf_lsm_v(2)%pt1,                  &
2215                                           surf_usm_v(2)%pt1,                  &
2216                                           surf_def_v(3)%pt1,                  &
2217                                           surf_lsm_v(3)%pt1,                  &
2218                                           surf_usm_v(3)%pt1, n_out )         
2219                                                                               
2220            CASE ( 'qv1' )                                                     
2221               CALL surface_output_sum_up( surf_def_h(0)%qv1,                  &
2222                                           surf_def_h(1)%qv1,                  &
2223                                           surf_lsm_h%qv1,                     &
2224                                           surf_usm_h%qv1,                     &
2225                                           surf_def_v(0)%qv1,                  &
2226                                           surf_lsm_v(0)%qv1,                  &
2227                                           surf_usm_v(0)%qv1,                  &
2228                                           surf_def_v(1)%qv1,                  &
2229                                           surf_lsm_v(1)%qv1,                  &
2230                                           surf_usm_v(1)%qv1,                  &
2231                                           surf_def_v(2)%qv1,                  &
2232                                           surf_lsm_v(2)%qv1,                  &
2233                                           surf_usm_v(2)%qv1,                  &
2234                                           surf_def_v(3)%qv1,                  &
2235                                           surf_lsm_v(3)%qv1,                  &
2236                                           surf_usm_v(3)%qv1, n_out ) 
2237
2238            CASE ( 'thetav1' )
2239               CALL surface_output_sum_up( surf_def_h(0)%vpt1,                 &
2240                                           surf_def_h(1)%vpt1,                 &
2241                                           surf_lsm_h%vpt1,                    &
2242                                           surf_usm_h%vpt1,                    &
2243                                           surf_def_v(0)%vpt1,                 &
2244                                           surf_lsm_v(0)%vpt1,                 &
2245                                           surf_usm_v(0)%vpt1,                 &
2246                                           surf_def_v(1)%vpt1,                 &
2247                                           surf_lsm_v(1)%vpt1,                 &
2248                                           surf_usm_v(1)%vpt1,                 &
2249                                           surf_def_v(2)%vpt1,                 &
2250                                           surf_lsm_v(2)%vpt1,                 &
2251                                           surf_usm_v(2)%vpt1,                 &
2252                                           surf_def_v(3)%vpt1,                 &
2253                                           surf_lsm_v(3)%vpt1,                 &
2254                                           surf_usm_v(3)%vpt1, n_out ) 
2255
2256            CASE ( 'usws' )
2257               CALL surface_output_sum_up( surf_def_h(0)%usws,                 &
2258                                           surf_def_h(1)%usws,                 &
2259                                           surf_lsm_h%usws,                    &
2260                                           surf_usm_h%usws,                    &
2261                                           surf_def_v(0)%usws,                 &
2262                                           surf_lsm_v(0)%usws,                 &
2263                                           surf_usm_v(0)%usws,                 &
2264                                           surf_def_v(1)%usws,                 &
2265                                           surf_lsm_v(1)%usws,                 &
2266                                           surf_usm_v(1)%usws,                 &
2267                                           surf_def_v(2)%usws,                 &
2268                                           surf_lsm_v(2)%usws,                 &
2269                                           surf_usm_v(2)%usws,                 &
2270                                           surf_def_v(3)%usws,                 &
2271                                           surf_lsm_v(3)%usws,                 &
2272                                           surf_usm_v(3)%usws, n_out ) 
2273
2274            CASE ( 'vsws' )
2275               CALL surface_output_sum_up( surf_def_h(0)%vsws,                 &
2276                                           surf_def_h(1)%vsws,                 &
2277                                           surf_lsm_h%vsws,                    &
2278                                           surf_usm_h%vsws,                    &
2279                                           surf_def_v(0)%vsws,                 &
2280                                           surf_lsm_v(0)%vsws,                 &
2281                                           surf_usm_v(0)%vsws,                 &
2282                                           surf_def_v(1)%vsws,                 &
2283                                           surf_lsm_v(1)%vsws,                 &
2284                                           surf_usm_v(1)%vsws,                 &
2285                                           surf_def_v(2)%vsws,                 &
2286                                           surf_lsm_v(2)%vsws,                 &
2287                                           surf_usm_v(2)%vsws,                 &
2288                                           surf_def_v(3)%vsws,                 &
2289                                           surf_lsm_v(3)%vsws,                 &
2290                                           surf_usm_v(3)%vsws, n_out ) 
2291
2292            CASE ( 'shf' )
2293               CALL surface_output_sum_up( surf_def_h(0)%shf,                  &
2294                                           surf_def_h(1)%shf,                  &
2295                                           surf_lsm_h%shf,                     &
2296                                           surf_usm_h%shf,                     & 
2297                                           surf_def_v(0)%shf,                  &
2298                                           surf_lsm_v(0)%shf,                  &
2299                                           surf_usm_v(0)%shf,                  &
2300                                           surf_def_v(1)%shf,                  &
2301                                           surf_lsm_v(1)%shf,                  &
2302                                           surf_usm_v(1)%shf,                  &
2303                                           surf_def_v(2)%shf,                  &
2304                                           surf_lsm_v(2)%shf,                  &
2305                                           surf_usm_v(2)%shf,                  &
2306                                           surf_def_v(3)%shf,                  &
2307                                           surf_lsm_v(3)%shf,                  &
2308                                           surf_usm_v(3)%shf, n_out )
2309
2310            CASE ( 'qsws' )
2311               CALL surface_output_sum_up( surf_def_h(0)%qsws,                 &
2312                                           surf_def_h(1)%qsws,                 &
2313                                           surf_lsm_h%qsws,                    &
2314                                           surf_usm_h%qsws,                    &
2315                                           surf_def_v(0)%qsws,                 &
2316                                           surf_lsm_v(0)%qsws,                 &
2317                                           surf_usm_v(0)%qsws,                 &
2318                                           surf_def_v(1)%qsws,                 &
2319                                           surf_lsm_v(1)%qsws,                 &
2320                                           surf_usm_v(1)%qsws,                 &
2321                                           surf_def_v(2)%qsws,                 &
2322                                           surf_lsm_v(2)%qsws,                 &
2323                                           surf_usm_v(2)%qsws,                 &
2324                                           surf_def_v(3)%qsws,                 &
2325                                           surf_lsm_v(3)%qsws,                 &
2326                                           surf_usm_v(3)%qsws, n_out ) 
2327
2328            CASE ( 'ssws' )
2329               CALL surface_output_sum_up( surf_def_h(0)%ssws,                 &
2330                                           surf_def_h(1)%ssws,                 &
2331                                           surf_lsm_h%ssws,                    &
2332                                           surf_usm_h%ssws,                    &
2333                                           surf_def_v(0)%ssws,                 &
2334                                           surf_lsm_v(0)%ssws,                 &
2335                                           surf_usm_v(0)%ssws,                 &
2336                                           surf_def_v(1)%ssws,                 &
2337                                           surf_lsm_v(1)%ssws,                 &
2338                                           surf_usm_v(1)%ssws,                 &
2339                                           surf_def_v(2)%ssws,                 &
2340                                           surf_lsm_v(2)%ssws,                 &
2341                                           surf_usm_v(2)%ssws,                 &
2342                                           surf_def_v(3)%ssws,                 &
2343                                           surf_lsm_v(3)%ssws,                 &
2344                                           surf_usm_v(3)%ssws, n_out ) 
2345
2346            CASE ( 'qcsws' )
2347               CALL surface_output_sum_up( surf_def_h(0)%qcsws,                &
2348                                           surf_def_h(1)%qcsws,                &
2349                                           surf_lsm_h%qcsws,                   &
2350                                           surf_usm_h%qcsws,                   &
2351                                           surf_def_v(0)%qcsws,                &
2352                                           surf_lsm_v(0)%qcsws,                &
2353                                           surf_usm_v(0)%qcsws,                &
2354                                           surf_def_v(1)%qcsws,                &
2355                                           surf_lsm_v(1)%qcsws,                &
2356                                           surf_usm_v(1)%qcsws,                &
2357                                           surf_def_v(2)%qcsws,                &
2358                                           surf_lsm_v(2)%qcsws,                &
2359                                           surf_usm_v(2)%qcsws,                &
2360                                           surf_def_v(3)%qcsws,                &
2361                                           surf_lsm_v(3)%qcsws,                &
2362                                           surf_usm_v(3)%qcsws, n_out ) 
2363
2364            CASE ( 'ncsws' )
2365               CALL surface_output_sum_up( surf_def_h(0)%ncsws,                &
2366                                           surf_def_h(1)%ncsws,                &
2367                                           surf_lsm_h%ncsws,                   &
2368                                           surf_usm_h%ncsws,                   &
2369                                           surf_def_v(0)%ncsws,                &
2370                                           surf_lsm_v(0)%ncsws,                &
2371                                           surf_usm_v(0)%ncsws,                &
2372                                           surf_def_v(1)%ncsws,                &
2373                                           surf_lsm_v(1)%ncsws,                &
2374                                           surf_usm_v(1)%ncsws,                &
2375                                           surf_def_v(2)%ncsws,                &
2376                                           surf_lsm_v(2)%ncsws,                &
2377                                           surf_usm_v(2)%ncsws,                &
2378                                           surf_def_v(3)%ncsws,                &
2379                                           surf_lsm_v(3)%ncsws,                &
2380                                           surf_usm_v(3)%ncsws, n_out ) 
2381
2382            CASE ( 'qrsws' )
2383               CALL surface_output_sum_up( surf_def_h(0)%qrsws,                &
2384                                           surf_def_h(1)%qrsws,                &
2385                                           surf_lsm_h%qrsws,                   &
2386                                           surf_usm_h%qrsws,                   &
2387                                           surf_def_v(0)%qrsws,                &
2388                                           surf_lsm_v(0)%qrsws,                &
2389                                           surf_usm_v(0)%qrsws,                &
2390                                           surf_def_v(1)%qrsws,                &
2391                                           surf_lsm_v(1)%qrsws,                &
2392                                           surf_usm_v(1)%qrsws,                &
2393                                           surf_def_v(2)%qrsws,                &
2394                                           surf_lsm_v(2)%qrsws,                &
2395                                           surf_usm_v(2)%qrsws,                &
2396                                           surf_def_v(3)%qrsws,                &
2397                                           surf_lsm_v(3)%qrsws,                &
2398                                           surf_usm_v(3)%qrsws, n_out ) 
2399
2400            CASE ( 'nrsws' )
2401               CALL surface_output_sum_up( surf_def_h(0)%nrsws,                &
2402                                           surf_def_h(1)%nrsws,                &
2403                                           surf_lsm_h%nrsws,                   &
2404                                           surf_usm_h%nrsws,                   &
2405                                           surf_def_v(0)%nrsws,                &
2406                                           surf_lsm_v(0)%nrsws,                &
2407                                           surf_usm_v(0)%nrsws,                &
2408                                           surf_def_v(1)%nrsws,                &
2409                                           surf_lsm_v(1)%nrsws,                &
2410                                           surf_usm_v(1)%nrsws,                &
2411                                           surf_def_v(2)%nrsws,                &
2412                                           surf_lsm_v(2)%nrsws,                &
2413                                           surf_usm_v(2)%nrsws,                &
2414                                           surf_def_v(3)%nrsws,                &
2415                                           surf_lsm_v(3)%nrsws,                &
2416                                           surf_usm_v(3)%nrsws, n_out ) 
2417
2418            CASE ( 'sasws' )
2419               CALL surface_output_sum_up( surf_def_h(0)%sasws,                &
2420                                           surf_def_h(1)%sasws,                &
2421                                           surf_lsm_h%sasws,                   &
2422                                           surf_usm_h%sasws,                   &
2423                                           surf_def_v(0)%sasws,                &
2424                                           surf_lsm_v(0)%sasws,                &
2425                                           surf_usm_v(0)%sasws,                &
2426                                           surf_def_v(1)%sasws,                &
2427                                           surf_lsm_v(1)%sasws,                &
2428                                           surf_usm_v(1)%sasws,                &
2429                                           surf_def_v(2)%sasws,                &
2430                                           surf_lsm_v(2)%sasws,                &
2431                                           surf_usm_v(2)%sasws,                &
2432                                           surf_def_v(3)%sasws,                &
2433                                           surf_lsm_v(3)%sasws,                &
2434                                           surf_usm_v(3)%sasws, n_out ) 
2435
2436            CASE ( 'q_surface' )
2437               CALL surface_output_sum_up( surf_def_h(0)%q_surface,            &
2438                                           surf_def_h(1)%q_surface,            &
2439                                           surf_lsm_h%q_surface,               &
2440                                           surf_usm_h%q_surface,               &
2441                                           surf_def_v(0)%q_surface,            &
2442                                           surf_lsm_v(0)%q_surface,            &
2443                                           surf_usm_v(0)%q_surface,            &
2444                                           surf_def_v(1)%q_surface,            &
2445                                           surf_lsm_v(1)%q_surface,            &
2446                                           surf_usm_v(1)%q_surface,            &
2447                                           surf_def_v(2)%q_surface,            &
2448                                           surf_lsm_v(2)%q_surface,            &
2449                                           surf_usm_v(2)%q_surface,            &
2450                                           surf_def_v(3)%q_surface,            &
2451                                           surf_lsm_v(3)%q_surface,            &
2452                                           surf_usm_v(3)%q_surface, n_out ) 
2453
2454            CASE ( 'theta_surface' )
2455               CALL surface_output_sum_up( surf_def_h(0)%pt_surface,           &
2456                                           surf_def_h(1)%pt_surface,           &
2457                                           surf_lsm_h%pt_surface,              &
2458                                           surf_usm_h%pt_surface,              &
2459                                           surf_def_v(0)%pt_surface,           &
2460                                           surf_lsm_v(0)%pt_surface,           &
2461                                           surf_usm_v(0)%pt_surface,           &
2462                                           surf_def_v(1)%pt_surface,           &
2463                                           surf_lsm_v(1)%pt_surface,           &
2464                                           surf_usm_v(1)%pt_surface,           &
2465                                           surf_def_v(2)%pt_surface,           &
2466                                           surf_lsm_v(2)%pt_surface,           &
2467                                           surf_usm_v(2)%pt_surface,           &
2468                                           surf_def_v(3)%pt_surface,           &
2469                                           surf_lsm_v(3)%pt_surface,           &
2470                                           surf_usm_v(3)%pt_surface, n_out ) 
2471
2472            CASE ( 'thetav_surface' )
2473               CALL surface_output_sum_up( surf_def_h(0)%vpt_surface,          &
2474                                           surf_def_h(1)%vpt_surface,          &
2475                                           surf_lsm_h%vpt_surface,             &
2476                                           surf_usm_h%vpt_surface,             &
2477                                           surf_def_v(0)%vpt_surface,          &
2478                                           surf_lsm_v(0)%vpt_surface,          &
2479                                           surf_usm_v(0)%vpt_surface,          &
2480                                           surf_def_v(1)%vpt_surface,          &
2481                                           surf_lsm_v(1)%vpt_surface,          &
2482                                           surf_usm_v(1)%vpt_surface,          &
2483                                           surf_def_v(2)%vpt_surface,          &
2484                                           surf_lsm_v(2)%vpt_surface,          &
2485                                           surf_usm_v(2)%vpt_surface,          &
2486                                           surf_def_v(3)%vpt_surface,          &
2487                                           surf_lsm_v(3)%vpt_surface,          &
2488                                           surf_usm_v(3)%vpt_surface, n_out ) 
2489
2490            CASE ( 'rad_net' )
2491               CALL surface_output_sum_up( surf_def_h(0)%rad_net,              &
2492                                           surf_def_h(1)%rad_net,              &
2493                                           surf_lsm_h%rad_net,                 &
2494                                           surf_usm_h%rad_net,                 &
2495                                           surf_def_v(0)%rad_net,              &
2496                                           surf_lsm_v(0)%rad_net,              &
2497                                           surf_usm_v(0)%rad_net,              &
2498                                           surf_def_v(1)%rad_net,              &
2499                                           surf_lsm_v(1)%rad_net,              &
2500                                           surf_usm_v(1)%rad_net,              &
2501                                           surf_def_v(2)%rad_net,              &
2502                                           surf_lsm_v(2)%rad_net,              &
2503                                           surf_usm_v(2)%rad_net,              &
2504                                           surf_def_v(3)%rad_net,              &
2505                                           surf_lsm_v(3)%rad_net,              &
2506                                           surf_usm_v(3)%rad_net, n_out ) 
2507
2508            CASE ( 'rad_lw_in' )
2509               CALL surface_output_sum_up( surf_def_h(0)%rad_lw_in,            &
2510                                           surf_def_h(1)%rad_lw_in,            &
2511                                           surf_lsm_h%rad_lw_in,               &
2512                                           surf_usm_h%rad_lw_in,               &
2513                                           surf_def_v(0)%rad_lw_in,            &
2514                                           surf_lsm_v(0)%rad_lw_in,            &
2515                                           surf_usm_v(0)%rad_lw_in,            &
2516                                           surf_def_v(1)%rad_lw_in,            &
2517                                           surf_lsm_v(1)%rad_lw_in,            &
2518                                           surf_usm_v(1)%rad_lw_in,            &
2519                                           surf_def_v(2)%rad_lw_in,            &
2520                                           surf_lsm_v(2)%rad_lw_in,            &
2521                                           surf_usm_v(2)%rad_lw_in,            &
2522                                           surf_def_v(3)%rad_lw_in,            &
2523                                           surf_lsm_v(3)%rad_lw_in,            &
2524                                           surf_usm_v(3)%rad_lw_in, n_out ) 
2525
2526            CASE ( 'rad_lw_out' )
2527               CALL surface_output_sum_up( surf_def_h(0)%rad_lw_out,           &
2528                                           surf_def_h(1)%rad_lw_out,           &
2529                                           surf_lsm_h%rad_lw_out,              &
2530                                           surf_usm_h%rad_lw_out,              &
2531                                           surf_def_v(0)%rad_lw_out,           &
2532                                           surf_lsm_v(0)%rad_lw_out,           &
2533                                           surf_usm_v(0)%rad_lw_out,           &
2534                                           surf_def_v(1)%rad_lw_out,           &
2535                                           surf_lsm_v(1)%rad_lw_out,           &
2536                                           surf_usm_v(1)%rad_lw_out,           &
2537                                           surf_def_v(2)%rad_lw_out,           &
2538                                           surf_lsm_v(2)%rad_lw_out,           &
2539                                           surf_usm_v(2)%rad_lw_out,           &
2540                                           surf_def_v(3)%rad_lw_out,           &
2541                                           surf_lsm_v(3)%rad_lw_out,           &
2542                                           surf_usm_v(3)%rad_lw_out, n_out ) 
2543
2544            CASE ( 'rad_sw_in' )
2545               CALL surface_output_sum_up( surf_def_h(0)%rad_sw_in,            &
2546                                           surf_def_h(1)%rad_sw_in,            &
2547                                           surf_lsm_h%rad_sw_in,               &
2548                                           surf_usm_h%rad_sw_in,               &
2549                                           surf_def_v(0)%rad_sw_in,            &
2550                                           surf_lsm_v(0)%rad_sw_in,            &
2551                                           surf_usm_v(0)%rad_sw_in,            &
2552                                           surf_def_v(1)%rad_sw_in,            &
2553                                           surf_lsm_v(1)%rad_sw_in,            &
2554                                           surf_usm_v(1)%rad_sw_in,            &
2555                                           surf_def_v(2)%rad_sw_in,            &
2556                                           surf_lsm_v(2)%rad_sw_in,            &
2557                                           surf_usm_v(2)%rad_sw_in,            &
2558                                           surf_def_v(3)%rad_sw_in,            &
2559                                           surf_lsm_v(3)%rad_sw_in,            &
2560                                           surf_usm_v(3)%rad_sw_in, n_out ) 
2561
2562            CASE ( 'rad_sw_out' )
2563               CALL surface_output_sum_up( surf_def_h(0)%rad_sw_out,           &
2564                                           surf_def_h(1)%rad_sw_out,           &
2565                                           surf_lsm_h%rad_sw_out,              &
2566                                           surf_usm_h%rad_sw_out,              &
2567                                           surf_def_v(0)%rad_sw_out,           &
2568                                           surf_lsm_v(0)%rad_sw_out,           &
2569                                           surf_usm_v(0)%rad_sw_out,           &
2570                                           surf_def_v(1)%rad_sw_out,           &
2571                                           surf_lsm_v(1)%rad_sw_out,           &
2572                                           surf_usm_v(1)%rad_sw_out,           &
2573                                           surf_def_v(2)%rad_sw_out,           &
2574                                           surf_lsm_v(2)%rad_sw_out,           &
2575                                           surf_usm_v(2)%rad_sw_out,           &
2576                                           surf_def_v(3)%rad_sw_out,           &
2577                                           surf_lsm_v(3)%rad_sw_out,           &
2578                                           surf_usm_v(3)%rad_sw_out, n_out ) 
2579
2580            CASE ( 'ghf' )
2581               CALL surface_output_sum_up( surf_def_h(0)%ghf,                  &
2582                                           surf_def_h(1)%ghf,                  &
2583                                           surf_lsm_h%ghf,                     &
2584                                           surf_usm_h%ghf,                     &
2585                                           surf_def_v(0)%ghf,                  &
2586                                           surf_lsm_v(0)%ghf,                  &
2587                                           surf_usm_v(0)%ghf,                  &
2588                                           surf_def_v(1)%ghf,                  &
2589                                           surf_lsm_v(1)%ghf,                  &
2590                                           surf_usm_v(1)%ghf,                  &
2591                                           surf_def_v(2)%ghf,                  &
2592                                           surf_lsm_v(2)%ghf,                  &
2593                                           surf_usm_v(2)%ghf,                  &
2594                                           surf_def_v(3)%ghf,                  &
2595                                           surf_lsm_v(3)%ghf,                  &
2596                                           surf_usm_v(3)%ghf, n_out )         
2597                                                                               
2598            CASE ( 'r_a' )                                                     
2599               CALL surface_output_sum_up( surf_def_h(0)%r_a,                  &
2600                                           surf_def_h(1)%r_a,                  &
2601                                           surf_lsm_h%r_a,                     &
2602                                           surf_usm_h%r_a,                     &
2603                                           surf_def_v(0)%r_a,                  &
2604                                           surf_lsm_v(0)%r_a,                  &
2605                                           surf_usm_v(0)%r_a,                  &
2606                                           surf_def_v(1)%r_a,                  &
2607                                           surf_lsm_v(1)%r_a,                  &
2608                                           surf_usm_v(1)%r_a,                  &
2609                                           surf_def_v(2)%r_a,                  &
2610                                           surf_lsm_v(2)%r_a,                  &
2611                                           surf_usm_v(2)%r_a,                  &
2612                                           surf_def_v(3)%r_a,                  &
2613                                           surf_lsm_v(3)%r_a,                  &
2614                                           surf_usm_v(3)%r_a, n_out )         
2615                                                                               
2616            CASE ( 'r_soil' )                                                 
2617               CALL surface_output_sum_up( surf_def_h(0)%r_soil,               &
2618                                           surf_def_h(1)%r_soil,               &
2619                                           surf_lsm_h%r_soil,                  &
2620                                           surf_usm_h%r_soil,                  &
2621                                           surf_def_v(0)%r_soil,               &
2622                                           surf_lsm_v(0)%r_soil,               &
2623                                           surf_usm_v(0)%r_soil,               &
2624                                           surf_def_v(1)%r_soil,               &
2625                                           surf_lsm_v(1)%r_soil,               &
2626                                           surf_usm_v(1)%r_soil,               &
2627                                           surf_def_v(2)%r_soil,               &
2628                                           surf_lsm_v(2)%r_soil,               &
2629                                           surf_usm_v(2)%r_soil,               &
2630                                           surf_def_v(3)%r_soil,               &
2631                                           surf_lsm_v(3)%r_soil,               &
2632                                           surf_usm_v(3)%r_soil, n_out ) 
2633
2634            CASE ( 'r_canopy' )
2635               CALL surface_output_sum_up( surf_def_h(0)%r_canopy,             &
2636                                           surf_def_h(1)%r_canopy,             &
2637                                           surf_lsm_h%r_canopy,                &
2638                                           surf_usm_h%r_canopy,                &
2639                                           surf_def_v(0)%r_canopy,             &
2640                                           surf_lsm_v(0)%r_canopy,             &
2641                                           surf_usm_v(0)%r_canopy,             &
2642                                           surf_def_v(1)%r_canopy,             &
2643                                           surf_lsm_v(1)%r_canopy,             &
2644                                           surf_usm_v(1)%r_canopy,             &
2645                                           surf_def_v(2)%r_canopy,             &
2646                                           surf_lsm_v(2)%r_canopy,             &
2647                                           surf_usm_v(2)%r_canopy,             &
2648                                           surf_def_v(3)%r_canopy,             &
2649                                           surf_lsm_v(3)%r_canopy,             &
2650                                           surf_usm_v(3)%r_canopy, n_out ) 
2651
2652            CASE ( 'r_s' )
2653               CALL surface_output_sum_up( surf_def_h(0)%r_s,                  &
2654                                           surf_def_h(1)%r_s,                  &
2655                                           surf_lsm_h%r_s,                     &
2656                                           surf_usm_h%r_s,                     &
2657                                           surf_def_v(0)%r_s,                  &
2658                                           surf_lsm_v(0)%r_s,                  &
2659                                           surf_usm_v(0)%r_s,                  &
2660                                           surf_def_v(1)%r_s,                  &
2661                                           surf_lsm_v(1)%r_s,                  &
2662                                           surf_usm_v(1)%r_s,                  &
2663                                           surf_def_v(2)%r_s,                  &
2664                                           surf_lsm_v(2)%r_s,                  &
2665                                           surf_usm_v(2)%r_s,                  &
2666                                           surf_def_v(3)%r_s,                  &
2667                                           surf_lsm_v(3)%r_s,                  &
2668                                           surf_usm_v(3)%r_s, n_out ) 
2669
2670         END SELECT
2671      ENDDO
2672     
2673   
2674   END SUBROUTINE surface_output_averaging
2675   
2676!------------------------------------------------------------------------------!
2677! Description:
2678! ------------
2679!> Sum-up the surface data for average output variables. 
2680!------------------------------------------------------------------------------!   
2681   SUBROUTINE surface_output_sum_up(  var_def_h0, var_def_h1,                  &
2682                                      var_lsm_h, var_usm_h,                    &
2683                                      var_def_v0, var_def_v1, var_def_v2,      &
2684                                      var_def_v3,                              &
2685                                      var_lsm_v0, var_lsm_v1, var_lsm_v2,      &
2686                                      var_lsm_v3,                              &
2687                                      var_usm_v0, var_usm_v1, var_usm_v2,      &
2688                                      var_usm_v3, n_out )
2689   
2690      IMPLICIT NONE
2691
2692      INTEGER(iwp) ::  m          !< running index for surface elements
2693      INTEGER(iwp) ::  n_out      !< index for output variable
2694      INTEGER(iwp) ::  n_surf     !< running index for surface elements
2695     
2696      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_h0 !< output variable at upward-facing default-type surfaces
2697      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_h1 !< output variable at downward-facing default-type surfaces
2698      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_h  !< output variable at upward-facing natural-type surfaces
2699      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_h  !< output variable at upward-facing urban-type surfaces
2700      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v0 !< output variable at northward-facing default-type surfaces
2701      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v1 !< output variable at southward-facing default-type surfaces
2702      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v2 !< output variable at eastward-facing default-type surfaces
2703      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v3 !< output variable at westward-facing default-type surfaces
2704      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v0 !< output variable at northward-facing natural-type surfaces
2705      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v1 !< output variable at southward-facing natural-type surfaces
2706      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v2 !< output variable at eastward-facing natural-type surfaces
2707      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v3 !< output variable at westward-facing natural-type surfaces
2708      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v0 !< output variable at northward-facing urban-type surfaces
2709      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v1 !< output variable at southward-facing urban-type surfaces
2710      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v2 !< output variable at eastward-facing urban-type surfaces
2711      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v3 !< output variable at westward-facing urban-type surfaces
2712     
2713!     
2714!--   Set counter variable to zero before the variable is written to
2715!--   the output array.
2716      n_surf = 0
2717     
2718!
2719!--   Write the horizontal surfaces.
2720!--   Before each the variable is written to the output data structure, first
2721!--   check if the variable for the respective surface type is defined.
2722!--   If a variable is not defined, skip the block and increment the counter
2723!--   variable by the number of surface elements of this type. Usually this
2724!--   is zere, however, there might be the situation that e.g. urban surfaces
2725!--   are defined but the respective variable is not allocated for this surface
2726!--   type. To write the data on the exact position, increment the counter.
2727      IF ( ALLOCATED( var_def_h0 ) )  THEN
2728         DO  m = 1, surf_def_h(0)%ns
2729            n_surf                        = n_surf + 1
2730            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2731                                          + var_def_h0(m)
2732         ENDDO
2733      ELSE
2734         n_surf = n_surf + surf_def_h(0)%ns 
2735      ENDIF
2736      IF ( ALLOCATED( var_def_h1 ) )  THEN
2737         DO  m = 1, surf_def_h(1)%ns
2738            n_surf                   = n_surf + 1
2739            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2740                                          + var_def_h1(m)
2741         ENDDO
2742      ELSE
2743         n_surf = n_surf + surf_def_h(1)%ns
2744      ENDIF
2745      IF ( ALLOCATED( var_lsm_h ) )  THEN
2746         DO  m = 1, surf_lsm_h%ns
2747            n_surf                        = n_surf + 1
2748            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2749                                          + var_lsm_h(m)
2750         ENDDO
2751      ELSE
2752         n_surf = n_surf + surf_lsm_h%ns
2753      ENDIF
2754      IF ( ALLOCATED( var_usm_h ) )  THEN
2755         DO  m = 1, surf_usm_h%ns
2756            n_surf                        = n_surf + 1
2757            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2758                                          + var_usm_h(m)
2759         ENDDO
2760      ELSE
2761         n_surf = n_surf + surf_usm_h%ns
2762      ENDIF
2763!
2764!--   Write northward-facing
2765      IF ( ALLOCATED( var_def_v0 ) )  THEN
2766         DO  m = 1, surf_def_v(0)%ns
2767            n_surf                        = n_surf + 1
2768            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2769                                          + var_def_v0(m)
2770         ENDDO
2771      ELSE
2772         n_surf = n_surf + surf_def_v(0)%ns
2773      ENDIF
2774      IF ( ALLOCATED( var_lsm_v0 ) )  THEN
2775         DO  m = 1, surf_lsm_v(0)%ns
2776            n_surf                        = n_surf + 1
2777            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2778                                          + var_lsm_v0(m)
2779         ENDDO
2780      ELSE
2781         n_surf = n_surf + surf_lsm_v(0)%ns
2782      ENDIF
2783      IF ( ALLOCATED( var_usm_v0 ) )  THEN
2784         DO  m = 1, surf_usm_v(0)%ns
2785            n_surf                        = n_surf + 1
2786            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2787                                          + var_usm_v0(m)
2788         ENDDO
2789      ELSE
2790         n_surf = n_surf + surf_usm_v(0)%ns
2791      ENDIF
2792!
2793!--   Write southward-facing
2794      IF ( ALLOCATED( var_def_v1 ) )  THEN
2795         DO  m = 1, surf_def_v(1)%ns
2796            n_surf                        = n_surf + 1
2797            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2798                                          + var_def_v1(m)
2799         ENDDO
2800      ELSE
2801         n_surf = n_surf + surf_def_v(1)%ns
2802      ENDIF
2803      IF ( ALLOCATED( var_lsm_v1 ) )  THEN
2804         DO  m = 1, surf_lsm_v(1)%ns
2805            n_surf                        = n_surf + 1
2806            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2807                                          + var_lsm_v1(m)
2808         ENDDO
2809      ELSE
2810         n_surf = n_surf + surf_lsm_v(1)%ns
2811      ENDIF
2812      IF ( ALLOCATED( var_usm_v1 ) )  THEN
2813         DO  m = 1, surf_usm_v(1)%ns
2814            n_surf                        = n_surf + 1
2815            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2816                                          + var_usm_v1(m)
2817         ENDDO
2818      ELSE
2819         n_surf = n_surf + surf_usm_v(1)%ns
2820      ENDIF
2821!
2822!--   Write eastward-facing
2823      IF ( ALLOCATED( var_def_v2 ) )  THEN
2824         DO  m = 1, surf_def_v(2)%ns
2825            n_surf                        = n_surf + 1
2826            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2827                                          + var_def_v2(m)
2828         ENDDO
2829      ELSE
2830         n_surf = n_surf + surf_def_v(2)%ns
2831      ENDIF
2832      IF ( ALLOCATED( var_lsm_v2 ) )  THEN
2833         DO  m = 1, surf_lsm_v(2)%ns
2834            n_surf                        = n_surf + 1
2835            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2836                                          + var_lsm_v2(m)
2837         ENDDO
2838      ELSE
2839         n_surf = n_surf + surf_lsm_v(2)%ns
2840      ENDIF
2841      IF ( ALLOCATED( var_usm_v2 ) )  THEN
2842         DO  m = 1, surf_usm_v(2)%ns
2843            n_surf                        = n_surf + 1
2844            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2845                                          + var_usm_v2(m)
2846         ENDDO
2847      ELSE
2848         n_surf = n_surf + surf_usm_v(2)%ns
2849      ENDIF
2850!
2851!--   Write westward-facing
2852      IF ( ALLOCATED( var_def_v3 ) )  THEN
2853         DO  m = 1, surf_def_v(3)%ns
2854            n_surf                        = n_surf + 1
2855            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2856                                          + var_def_v3(m)
2857         ENDDO
2858      ELSE
2859         n_surf = n_surf + surf_def_v(3)%ns
2860      ENDIF
2861      IF ( ALLOCATED( var_lsm_v3 ) )  THEN
2862         DO  m = 1, surf_lsm_v(3)%ns
2863            n_surf                        = n_surf + 1
2864            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2865                                          + var_lsm_v3(m)
2866         ENDDO
2867      ELSE
2868         n_surf = n_surf + surf_lsm_v(3)%ns
2869      ENDIF
2870      IF ( ALLOCATED( var_usm_v3 ) )  THEN
2871         DO  m = 1, surf_usm_v(3)%ns
2872            n_surf                        = n_surf + 1
2873            surfaces%var_av(n_surf,n_out) = surfaces%var_av(n_surf,n_out)      &
2874                                          + var_usm_v3(m)
2875         ENDDO
2876      ELSE
2877         n_surf = n_surf + surf_usm_v(3)%ns
2878      ENDIF
2879   
2880   END SUBROUTINE surface_output_sum_up
2881   
2882!------------------------------------------------------------------------------!
2883! Description:
2884! ------------
2885!> Collect the surface data from different types and different orientation.
2886!------------------------------------------------------------------------------!
2887   SUBROUTINE surface_output_collect( var_def_h0, var_def_h1,                  &
2888                                      var_lsm_h, var_usm_h,                    &
2889                                      var_def_v0, var_def_v1, var_def_v2,      &
2890                                      var_def_v3,                              &
2891                                      var_lsm_v0, var_lsm_v1, var_lsm_v2,      &
2892                                      var_lsm_v3,                              &
2893                                      var_usm_v0, var_usm_v1, var_usm_v2,      &
2894                                      var_usm_v3 )
2895   
2896      IMPLICIT NONE
2897
2898      INTEGER(iwp) ::  m      !< running index for surface elements
2899      INTEGER(iwp) ::  n_surf !< running index for surface elements
2900     
2901      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_h0 !< output variable at upward-facing default-type surfaces
2902      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_h1 !< output variable at downward-facing default-type surfaces
2903      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_h  !< output variable at upward-facing natural-type surfaces
2904      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_h  !< output variable at upward-facing urban-type surfaces
2905      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v0 !< output variable at northward-facing default-type surfaces
2906      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v1 !< output variable at southward-facing default-type surfaces
2907      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v2 !< output variable at eastward-facing default-type surfaces
2908      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_def_v3 !< output variable at westward-facing default-type surfaces
2909      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v0 !< output variable at northward-facing natural-type surfaces
2910      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v1 !< output variable at southward-facing natural-type surfaces
2911      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v2 !< output variable at eastward-facing natural-type surfaces
2912      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_lsm_v3 !< output variable at westward-facing natural-type surfaces
2913      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v0 !< output variable at northward-facing urban-type surfaces
2914      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v1 !< output variable at southward-facing urban-type surfaces
2915      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v2 !< output variable at eastward-facing urban-type surfaces
2916      REAL(wp), DIMENSION(:), ALLOCATABLE, INTENT(IN) ::  var_usm_v3 !< output variable at westward-facing urban-type surfaces
2917     
2918!     
2919!--   Set counter variable to zero before the variable is written to
2920!--   the output array.
2921      n_surf = 0
2922     
2923!
2924!--   Write the horizontal surfaces.
2925!--   Before each the variable is written to the output data structure, first
2926!--   check if the variable for the respective surface type is defined.
2927!--   If a variable is not defined, skip the block and increment the counter
2928!--   variable by the number of surface elements of this type. Usually this
2929!--   is zere, however, there might be the situation that e.g. urban surfaces
2930!--   are defined but the respective variable is not allocated for this surface
2931!--   type. To write the data on the exact position, increment the counter.
2932      IF ( ALLOCATED( var_def_h0 ) )  THEN
2933         DO  m = 1, surf_def_h(0)%ns
2934            n_surf                   = n_surf + 1
2935            surfaces%var_out(n_surf) = var_def_h0(m)
2936         ENDDO
2937      ELSE
2938         n_surf = n_surf + surf_def_h(0)%ns 
2939      ENDIF
2940      IF ( ALLOCATED( var_def_h1 ) )  THEN
2941         DO  m = 1, surf_def_h(1)%ns
2942            n_surf                   = n_surf + 1
2943            surfaces%var_out(n_surf) = var_def_h1(m)
2944         ENDDO
2945      ELSE
2946         n_surf = n_surf + surf_def_h(1)%ns
2947      ENDIF
2948      IF ( ALLOCATED( var_lsm_h ) )  THEN
2949         DO  m = 1, surf_lsm_h%ns
2950            n_surf                   = n_surf + 1
2951            surfaces%var_out(n_surf) = var_lsm_h(m)
2952         ENDDO
2953      ELSE
2954         n_surf = n_surf + surf_lsm_h%ns
2955      ENDIF
2956      IF ( ALLOCATED( var_usm_h ) )  THEN
2957         DO  m = 1, surf_usm_h%ns
2958            n_surf                   = n_surf + 1
2959            surfaces%var_out(n_surf) = var_usm_h(m)
2960         ENDDO
2961      ELSE
2962         n_surf = n_surf + surf_usm_h%ns
2963      ENDIF
2964!
2965!--   Write northward-facing
2966      IF ( ALLOCATED( var_def_v0 ) )  THEN
2967         DO  m = 1, surf_def_v(0)%ns
2968            n_surf                   = n_surf + 1
2969            surfaces%var_out(n_surf) = var_def_v0(m)
2970         ENDDO
2971      ELSE
2972         n_surf = n_surf + surf_def_v(0)%ns
2973      ENDIF
2974      IF ( ALLOCATED( var_lsm_v0 ) )  THEN
2975         DO  m = 1, surf_lsm_v(0)%ns
2976            n_surf                   = n_surf + 1
2977            surfaces%var_out(n_surf) = var_lsm_v0(m)
2978         ENDDO
2979      ELSE
2980         n_surf = n_surf + surf_lsm_v(0)%ns
2981      ENDIF
2982      IF ( ALLOCATED( var_usm_v0 ) )  THEN
2983         DO  m = 1, surf_usm_v(0)%ns
2984            n_surf                   = n_surf + 1
2985            surfaces%var_out(n_surf) = var_usm_v0(m)
2986         ENDDO
2987      ELSE
2988         n_surf = n_surf + surf_usm_v(0)%ns
2989      ENDIF
2990!
2991!--   Write southward-facing
2992      IF ( ALLOCATED( var_def_v1 ) )  THEN
2993         DO  m = 1, surf_def_v(1)%ns
2994            n_surf                   = n_surf + 1
2995            surfaces%var_out(n_surf) = var_def_v1(m)
2996         ENDDO
2997      ELSE
2998         n_surf = n_surf + surf_def_v(1)%ns
2999      ENDIF
3000      IF ( ALLOCATED( var_lsm_v1 ) )  THEN
3001         DO  m = 1, surf_lsm_v(1)%ns
3002            n_surf                   = n_surf + 1
3003            surfaces%var_out(n_surf) = var_lsm_v1(m)
3004         ENDDO
3005      ELSE
3006         n_surf = n_surf + surf_lsm_v(1)%ns
3007      ENDIF
3008      IF ( ALLOCATED( var_usm_v1 ) )  THEN
3009         DO  m = 1, surf_usm_v(1)%ns
3010            n_surf                   = n_surf + 1
3011            surfaces%var_out(n_surf) = var_usm_v1(m)
3012         ENDDO
3013      ELSE
3014         n_surf = n_surf + surf_usm_v(1)%ns
3015      ENDIF
3016!
3017!--   Write eastward-facing
3018      IF ( ALLOCATED( var_def_v2 ) )  THEN
3019         DO  m = 1, surf_def_v(2)%ns
3020            n_surf                   = n_surf + 1
3021            surfaces%var_out(n_surf) = var_def_v2(m)
3022         ENDDO
3023      ELSE
3024         n_surf = n_surf + surf_def_v(2)%ns
3025      ENDIF
3026      IF ( ALLOCATED( var_lsm_v2 ) )  THEN
3027         DO  m = 1, surf_lsm_v(2)%ns
3028            n_surf                   = n_surf + 1
3029            surfaces%var_out(n_surf) = var_lsm_v2(m)
3030         ENDDO
3031      ELSE
3032         n_surf = n_surf + surf_lsm_v(2)%ns
3033      ENDIF
3034      IF ( ALLOCATED( var_usm_v2 ) )  THEN
3035         DO  m = 1, surf_usm_v(2)%ns
3036            n_surf                   = n_surf + 1
3037            surfaces%var_out(n_surf) = var_usm_v2(m)
3038         ENDDO
3039      ELSE
3040         n_surf = n_surf + surf_usm_v(2)%ns
3041      ENDIF
3042!
3043!--   Write westward-facing
3044      IF ( ALLOCATED( var_def_v3 ) )  THEN
3045         DO  m = 1, surf_def_v(3)%ns
3046            n_surf                   = n_surf + 1
3047            surfaces%var_out(n_surf) = var_def_v3(m)
3048         ENDDO
3049      ELSE
3050         n_surf = n_surf + surf_def_v(3)%ns
3051      ENDIF
3052      IF ( ALLOCATED( var_lsm_v3 ) )  THEN
3053         DO  m = 1, surf_lsm_v(3)%ns
3054            n_surf                   = n_surf + 1
3055            surfaces%var_out(n_surf) = var_lsm_v3(m)
3056         ENDDO
3057      ELSE
3058         n_surf = n_surf + surf_lsm_v(3)%ns
3059      ENDIF
3060      IF ( ALLOCATED( var_usm_v3 ) )  THEN
3061         DO  m = 1, surf_usm_v(3)%ns
3062            n_surf                   = n_surf + 1
3063            surfaces%var_out(n_surf) = var_usm_v3(m)
3064         ENDDO
3065      ELSE
3066         n_surf = n_surf + surf_usm_v(3)%ns
3067      ENDIF
3068   
3069   END SUBROUTINE surface_output_collect
3070   
3071   
3072   
3073!    SUBROUTINE data_output_surf_driver (time)
3074!       IMPLICIT NONE
3075!
3076!       REAL(kind=wp),INTENT(IN)    :: time
3077!       CHARACTER(LEN=64)           :: filename
3078!       INTEGER,SAVE                :: file_number=1
3079!
3080!       if(output_mode == "legacy_VTK")   then
3081!           CALL prepare_vtk_data
3082!
3083!           write(filename,'(a,i5.5,a)') 'surface_output_',file_number,'.vtk'
3084!           if(myid == surf_io_pe)   write(9,*) 'Legacy VTK surface output to file: ',trim(filename)
3085!           file_number = file_number+1
3086!
3087!           CALL write_ascii_vtk (filename, time)
3088!       END IF
3089!
3090!       RETURN
3091!    END SUBROUTINE data_output_surf_driver
3092   
3093   
3094!------------------------------------------------------------------------------!
3095! Description:
3096! ------------
3097!> Parin for output of surface parameters
3098!------------------------------------------------------------------------------!
3099    SUBROUTINE surface_output_parin
3100
3101       USE control_parameters,                                                 &
3102           ONLY:  message_string
3103
3104       IMPLICIT NONE
3105
3106       CHARACTER (LEN=80) ::  line  !< dummy string that contains the current line of the parameter file
3107       
3108
3109       NAMELIST /surface_output_parameters/                                    &
3110                                  averaging_interval_surf, data_output_surf,   &
3111                                  dt_dosurf, dt_dosurf_av,                     &
3112                                  skip_time_dosurf, skip_time_dosurf_av
3113                                 
3114       line = ' '
3115 
3116!
3117!--    Try to find the namelist
3118       REWIND ( 11 )
3119       line = ' '
3120       DO WHILE ( INDEX( line, '&surface_output_parameters' ) == 0 )
3121          READ ( 11, '(A)', END=14 )  line
3122       ENDDO
3123       BACKSPACE ( 11 )
3124
3125!
3126!--    Read namelist
3127       READ ( 11, surface_output_parameters, ERR = 10 )
3128!
3129!--    Set flag that indicates that surface data output is switched on
3130       surface_data_output = .TRUE.
3131       GOTO 14
3132
3133 10    BACKSPACE( 11 )
3134       READ( 11 , '(A)') line
3135       CALL parin_fail_message( 'surface_output_parameters', line )     
3136       
3137 14    CONTINUE
3138       
3139
3140    END SUBROUTINE surface_output_parin
3141   
3142   
3143!------------------------------------------------------------------------------!
3144! Description:
3145! ------------
3146!> Check the input parameters for consistency. Further pre-process the given
3147!> output variables, i.e. separate them into average and non-average output
3148!> variables and map them onto internal output array.
3149!------------------------------------------------------------------------------!
3150    SUBROUTINE surface_output_check_parameters
3151
3152       USE control_parameters,                                                 &
3153           ONLY:  averaging_interval, dt_data_output, dt_data_output_av,       &
3154                  message_string, skip_time_data_output,                       &
3155                  skip_time_data_output_av
3156
3157       IMPLICIT NONE
3158
3159       CHARACTER(LEN=100) ::  trimvar !< dummy for single output variable
3160
3161       INTEGER(iwp) ::  av    !< id indicating average or non-average data output
3162       INTEGER(iwp) ::  ilen  !< string length
3163       INTEGER(iwp) ::  n_out !< running index for number of output variables
3164
3165!
3166!--    Check the average interval
3167       IF ( averaging_interval_surf == 9999999.9_wp )  THEN
3168          averaging_interval_surf = averaging_interval
3169       ENDIF
3170!
3171!--    Set the default data-output interval dt_data_output if necessary
3172       IF ( dt_dosurf    == 9999999.9_wp )  dt_dosurf    = dt_data_output
3173       IF ( dt_dosurf_av == 9999999.9_wp )  dt_dosurf_av = dt_data_output
3174
3175       IF ( averaging_interval_surf > dt_dosurf_av )  THEN
3176          WRITE( message_string, * )  'averaging_interval_surf = ',            &
3177                averaging_interval_surf, ' must be <= dt_dosurf_av = ',        &
3178                dt_dosurf_av
3179          CALL message( 'surface_output_check_parameters',                     &
3180                        'PA0087', 1, 2, 0, 6, 0 )
3181       ENDIF
3182
3183!
3184!--   Count number of output variables and separate output strings for
3185!--   average and non-average output variables.
3186      n_out = 0
3187      DO WHILE ( data_output_surf(n_out+1)(1:1) /= ' ' )
3188
3189         n_out = n_out + 1
3190         ilen = LEN_TRIM( data_output_surf(n_out) )
3191         trimvar = TRIM( data_output_surf(n_out) )
3192
3193!
3194!--      Check for data averaging
3195         av = 0
3196         IF ( ilen > 3 )  THEN
3197            IF ( data_output_surf(n_out)(ilen-2:ilen) == '_av' )  THEN
3198               trimvar = data_output_surf(n_out)(1:ilen-3)
3199               av      = 1
3200            ENDIF
3201         ENDIF
3202
3203         dosurf_no(av) = dosurf_no(av) + 1
3204         dosurf(av,dosurf_no(av)) = TRIM( trimvar )
3205
3206!
3207!--      Check if all output variables are known
3208         SELECT CASE ( TRIM( trimvar ) )
3209
3210            CASE ( 'css', 'cssws', 'qsws_liq', 'qsws_soil', 'qsws_veg' )
3211               message_string = TRIM( trimvar ) //                             &
3212                             ' is not yet implemented in the surface output'
3213               CALL message( 'surface_output_check_parameters',                &
3214                             'PA0087', 1, 2, 0, 6, 0 )
3215
3216            CASE ( 'us', 'ts', 'qs', 'ss', 'qcs', 'ncs', 'qrs', 'nrs', 'ol' )
3217
3218            CASE ( 'z0', 'z0h', 'z0q' )
3219
3220            CASE ( 'theta1', 'qv1', 'thetav1' )
3221
3222            CASE ( 'usws', 'vsws' )
3223
3224            CASE ( 'qcsws', 'ncsws', 'qrsws', 'nrsws', 'sasws' )
3225
3226            CASE ( 'shf', 'qsws', 'ssws' )
3227
3228            CASE ( 'q_surface', 'theta_surface', 'thetav_surface' )
3229
3230            CASE ( 'rad_net' )
3231
3232            CASE ( 'rad_lw_in', 'rad_lw_out', 'rad_sw_in', 'rad_sw_out' )
3233
3234            CASE ( 'ghf' )
3235
3236            CASE ( 'r_a', 'r_canopy', 'r_soil', 'r_s' )
3237
3238            CASE DEFAULT
3239               message_string = TRIM( trimvar ) //                             &
3240                             ' is not part of the surface output'
3241               CALL message( 'surface_output_check_parameters',                &
3242                             'PA0087', 1, 2, 0, 6, 0 )
3243         END SELECT
3244
3245       ENDDO
3246
3247    END SUBROUTINE surface_output_check_parameters
3248
3249!--Private Subroutines (Only called from tinside his module)
3250
3251
3252
3253!    SUBROUTINE write_ascii_vtk (filename,time)
3254!       IMPLICIT NONE
3255!       CHARACTER(LEN=*),INTENT(IN)   :: filename
3256!       REAL(kind=wp),INTENT(IN)      :: time
3257!
3258!       INTEGER                       :: file_id=251
3259!       INTEGER                       :: n
3260!
3261!       IF(myid == surf_io_pe)  then
3262!          open(file_id,file=TRIM(filename))                                 ! Please use check_open in the final version
3263!
3264!          write(file_id,'(a)') "# vtk DataFile Version 3.0"
3265!          write(file_id,'(a,f8.2,a)') "legacy vtk File generated by PALM,  simulation time = ",time," sec"
3266!          write(file_id,'(a)') "ASCII"
3267!
3268!          write(file_id,'(a)') "DATASET POLYDATA"
3269!          write(file_id,'(a,i5,a)') "POINTS ",npo," float"
3270!          do n=1,npo
3271!             write (file_id,'(8f10.1)') points(1:3,n)
3272!          end do
3273!
3274!          write(file_id,'(a,8i10)') "POLYGONS ",npg, 5*npg
3275!          do n=1,npg
3276!             write(file_id,'(8i10)') polygons(:,n)
3277!          end do
3278!
3279!          write(file_id,'(a,i10)') "CELL_DATA ",npg
3280!          write(file_id,'(a,i10)') "SCALARS cell_scalars float 1 "
3281!          write(file_id,'(a,i10)') "LOOKUP_TABLE default "
3282!
3283!          do n=1,npg
3284!             write(file_id,'(f10.2)') cell_scalars(n)
3285!          end do
3286!
3287!          close (file_id)
3288!
3289!          DEALLOCATE (points,polygons,cell_scalars)
3290!       ENDIF
3291!
3292!       RETURN
3293!    END SUBROUTINE write_ascii_vtk
3294
3295END MODULE surface_output_mod
Note: See TracBrowser for help on using the repository browser.