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

Last change on this file since 3695 was 3691, checked in by suehring, 5 years ago

Add output of surface-parallel flow speed

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