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

Last change on this file since 3580 was 3572, checked in by suehring, 5 years ago

Additional output for radiative fluxes added

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