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

Last change on this file since 3682 was 3648, checked in by suehring, 5 years ago

Rename surface_output_mod into surface_data_output_mod, same with all corresponding subroutines

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