source: palm/trunk/SOURCE/sum_up_3d_data.f90 @ 4441

Last change on this file since 4441 was 4441, checked in by suehring, 4 years ago

Change order of dimension in surface arrays %frac, %emissivity and %albedo to allow for better vectorization in the radiation interactions; Set back turbulent length scale to 8 x grid spacing in the parametrized mode for the synthetic turbulence generator (was accidentally changed in last commit)

  • Property svn:keywords set to Id
File size: 38.3 KB
Line 
1!> @file sum_up_3d_data.f90
2!------------------------------------------------------------------------------!
3! This file is part of the PALM model system.
4!
5! PALM is free software: you can redistribute it and/or modify it under the
6! terms of the GNU General Public License as published by the Free Software
7! Foundation, either version 3 of the License, or (at your option) any later
8! version.
9!
10! PALM is distributed in the hope that it will be useful, but WITHOUT ANY
11! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12! A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13!
14! You should have received a copy of the GNU General Public License along with
15! PALM. If not, see <http://www.gnu.org/licenses/>.
16!
17! Copyright 1997-2020 Leibniz Universitaet Hannover
18!------------------------------------------------------------------------------!
19!
20! Current revisions:
21! ------------------
22! Change order of dimension in surface array %frac to allow for better
23! vectorization.
24!
25! Former revisions:
26! -----------------
27! $Id: sum_up_3d_data.f90 4441 2020-03-04 19:20:35Z suehring $
28! Move 2-m potential temperature output to diagnostic_output_quantities
29!
30! 4182 2019-08-22 15:20:23Z scharf
31! Corrected "Former revisions" section
32!
33! 4048 2019-06-21 21:00:21Z knoop
34! Moved tcm_3d_data_averaging to module_interface
35!
36! 4039 2019-06-18 10:32:41Z suehring
37! Modularize diagnostic output
38!
39! 3994 2019-05-22 18:08:09Z suehring
40! output of turbulence intensity added
41!
42! 3943 2019-05-02 09:50:41Z maronga
43! Added output of qsws_av for green roofs.
44!
45! 3933 2019-04-25 12:33:20Z kanani
46! Formatting
47!
48! 3773 2019-03-01 08:56:57Z maronga
49! Added output of theta_2m*_xy_av
50!
51! 3761 2019-02-25 15:31:42Z raasch
52! unused variables removed
53!
54! 3655 2019-01-07 16:51:22Z knoop
55! Implementation of the PALM module interface
56!
57! Revision 1.1  2006/02/23 12:55:23  raasch
58! Initial revision
59!
60!
61! Description:
62! ------------
63!> Sum-up the values of 3d-arrays. The real averaging is later done in routine
64!> average_3d_data.
65!------------------------------------------------------------------------------!
66 SUBROUTINE sum_up_3d_data
67 
68
69    USE arrays_3d,                                                             &
70        ONLY:  dzw, d_exner, e, heatflux_output_conversion, p,                 &
71               pt, q, ql, ql_c, ql_v, s, u, v, vpt, w,                         &
72               waterflux_output_conversion
73
74    USE averaging,                                                             &
75        ONLY:  e_av, ghf_av, lpt_av, lwp_av, ol_av, p_av, pc_av, pr_av, pt_av, &
76               q_av, ql_av, ql_c_av, ql_v_av, ql_vp_av, qsws_av,               &
77               qv_av, r_a_av, s_av, shf_av, ssws_av, ts_av, tsurf_av, u_av,    &
78               us_av, v_av, vpt_av, w_av, z0_av, z0h_av, z0q_av
79
80    USE basic_constants_and_equations_mod,                                     &
81        ONLY:  c_p, lv_d_cp, l_v
82
83    USE bulk_cloud_model_mod,                                                  &
84        ONLY:  bulk_cloud_model
85
86    USE control_parameters,                                                    &
87        ONLY:  average_count_3d, doav, doav_n, rho_surface, urban_surface,     &
88               varnamelength
89
90    USE cpulog,                                                                &
91        ONLY:  cpu_log, log_point
92
93    USE indices,                                                               &
94        ONLY:  nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzt 
95
96    USE kinds
97
98    USE module_interface,                                                      &
99        ONLY:  module_interface_3d_data_averaging
100
101    USE particle_attributes,                                                   &
102        ONLY:  grid_particles, number_of_particles, particles, prt_count
103
104    USE surface_mod,                                                           &
105        ONLY:  ind_pav_green, ind_veg_wall, ind_wat_win,                       &
106               surf_def_h, surf_lsm_h, surf_usm_h
107
108    USE urban_surface_mod,                                                     &
109        ONLY:  usm_3d_data_averaging
110
111
112    IMPLICIT NONE
113
114    LOGICAL      ::  match_def !< flag indicating default-type surface
115    LOGICAL      ::  match_lsm !< flag indicating natural-type surface
116    LOGICAL      ::  match_usm !< flag indicating urban-type surface
117   
118    INTEGER(iwp) ::  i   !< grid index x direction
119    INTEGER(iwp) ::  ii  !< running index
120    INTEGER(iwp) ::  j   !< grid index y direction
121    INTEGER(iwp) ::  k   !< grid index x direction
122    INTEGER(iwp) ::  m   !< running index over surfacle elements
123    INTEGER(iwp) ::  n   !< running index over number of particles per grid box
124
125    REAL(wp)     ::  mean_r !< mean-particle radius witin grid box
126    REAL(wp)     ::  s_r2   !< mean-particle radius witin grid box to the power of two
127    REAL(wp)     ::  s_r3   !< mean-particle radius witin grid box to the power of three
128
129    CHARACTER (LEN=varnamelength) ::  trimvar  !< TRIM of output-variable string
130
131
132    CALL cpu_log (log_point(34),'sum_up_3d_data','start')
133
134!
135!-- Allocate and initialize the summation arrays if called for the very first
136!-- time or the first time after average_3d_data has been called
137!-- (some or all of the arrays may have been already allocated
138!-- in rrd_local)
139    IF ( average_count_3d == 0 )  THEN
140
141       DO  ii = 1, doav_n
142
143          trimvar = TRIM( doav(ii) )
144
145          SELECT CASE ( trimvar )
146
147             CASE ( 'ghf*' )
148                IF ( .NOT. ALLOCATED( ghf_av ) )  THEN
149                   ALLOCATE( ghf_av(nysg:nyng,nxlg:nxrg) )
150                ENDIF
151                ghf_av = 0.0_wp
152
153             CASE ( 'e' )
154                IF ( .NOT. ALLOCATED( e_av ) )  THEN
155                   ALLOCATE( e_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
156                ENDIF
157                e_av = 0.0_wp
158
159             CASE ( 'thetal' )
160                IF ( .NOT. ALLOCATED( lpt_av ) )  THEN
161                   ALLOCATE( lpt_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
162                ENDIF
163                lpt_av = 0.0_wp
164
165             CASE ( 'lwp*' )
166                IF ( .NOT. ALLOCATED( lwp_av ) )  THEN
167                   ALLOCATE( lwp_av(nysg:nyng,nxlg:nxrg) )
168                ENDIF
169                lwp_av = 0.0_wp
170
171             CASE ( 'ol*' )
172                IF ( .NOT. ALLOCATED( ol_av ) )  THEN
173                   ALLOCATE( ol_av(nysg:nyng,nxlg:nxrg) )
174                ENDIF
175                ol_av = 0.0_wp
176
177             CASE ( 'p' )
178                IF ( .NOT. ALLOCATED( p_av ) )  THEN
179                   ALLOCATE( p_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
180                ENDIF
181                p_av = 0.0_wp
182
183             CASE ( 'pc' )
184                IF ( .NOT. ALLOCATED( pc_av ) )  THEN
185                   ALLOCATE( pc_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
186                ENDIF
187                pc_av = 0.0_wp
188
189             CASE ( 'pr' )
190                IF ( .NOT. ALLOCATED( pr_av ) )  THEN
191                   ALLOCATE( pr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
192                ENDIF
193                pr_av = 0.0_wp
194
195             CASE ( 'theta' )
196                IF ( .NOT. ALLOCATED( pt_av ) )  THEN
197                   ALLOCATE( pt_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
198                ENDIF
199                pt_av = 0.0_wp
200
201             CASE ( 'q' )
202                IF ( .NOT. ALLOCATED( q_av ) )  THEN
203                   ALLOCATE( q_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
204                ENDIF
205                q_av = 0.0_wp
206
207             CASE ( 'ql' )
208                IF ( .NOT. ALLOCATED( ql_av ) )  THEN
209                   ALLOCATE( ql_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
210                ENDIF
211                ql_av = 0.0_wp
212
213             CASE ( 'ql_c' )
214                IF ( .NOT. ALLOCATED( ql_c_av ) )  THEN
215                   ALLOCATE( ql_c_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
216                ENDIF
217                ql_c_av = 0.0_wp
218
219             CASE ( 'ql_v' )
220                IF ( .NOT. ALLOCATED( ql_v_av ) )  THEN
221                   ALLOCATE( ql_v_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
222                ENDIF
223                ql_v_av = 0.0_wp
224
225             CASE ( 'ql_vp' )
226                IF ( .NOT. ALLOCATED( ql_vp_av ) )  THEN
227                   ALLOCATE( ql_vp_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
228                ENDIF
229                ql_vp_av = 0.0_wp
230
231             CASE ( 'qsws*' )
232                IF ( .NOT. ALLOCATED( qsws_av ) )  THEN
233                   ALLOCATE( qsws_av(nysg:nyng,nxlg:nxrg) )
234                ENDIF
235                qsws_av = 0.0_wp
236
237             CASE ( 'qv' )
238                IF ( .NOT. ALLOCATED( qv_av ) )  THEN
239                   ALLOCATE( qv_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
240                ENDIF
241                qv_av = 0.0_wp
242
243             CASE ( 'r_a*' )
244                IF ( .NOT. ALLOCATED( r_a_av ) )  THEN
245                   ALLOCATE( r_a_av(nysg:nyng,nxlg:nxrg) )
246                ENDIF
247                r_a_av = 0.0_wp
248
249             CASE ( 's' )
250                IF ( .NOT. ALLOCATED( s_av ) )  THEN
251                   ALLOCATE( s_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
252                ENDIF
253                s_av = 0.0_wp
254
255             CASE ( 'shf*' )
256                IF ( .NOT. ALLOCATED( shf_av ) )  THEN
257                   ALLOCATE( shf_av(nysg:nyng,nxlg:nxrg) )
258                ENDIF
259                shf_av = 0.0_wp
260               
261             CASE ( 'ssws*' )
262                IF ( .NOT. ALLOCATED( ssws_av ) )  THEN
263                   ALLOCATE( ssws_av(nysg:nyng,nxlg:nxrg) )
264                ENDIF
265                ssws_av = 0.0_wp               
266
267             CASE ( 't*' )
268                IF ( .NOT. ALLOCATED( ts_av ) )  THEN
269                   ALLOCATE( ts_av(nysg:nyng,nxlg:nxrg) )
270                ENDIF
271                ts_av = 0.0_wp
272
273             CASE ( 'tsurf*' )
274                IF ( .NOT. ALLOCATED( tsurf_av ) )  THEN
275                   ALLOCATE( tsurf_av(nysg:nyng,nxlg:nxrg) )
276                ENDIF
277                tsurf_av = 0.0_wp
278
279             CASE ( 'u' )
280                IF ( .NOT. ALLOCATED( u_av ) )  THEN
281                   ALLOCATE( u_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
282                ENDIF
283                u_av = 0.0_wp
284
285             CASE ( 'us*' )
286                IF ( .NOT. ALLOCATED( us_av ) )  THEN
287                   ALLOCATE( us_av(nysg:nyng,nxlg:nxrg) )
288                ENDIF
289                us_av = 0.0_wp
290
291             CASE ( 'v' )
292                IF ( .NOT. ALLOCATED( v_av ) )  THEN
293                   ALLOCATE( v_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
294                ENDIF
295                v_av = 0.0_wp
296
297             CASE ( 'thetav' )
298                IF ( .NOT. ALLOCATED( vpt_av ) )  THEN
299                   ALLOCATE( vpt_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
300                ENDIF
301                vpt_av = 0.0_wp
302
303             CASE ( 'w' )
304                IF ( .NOT. ALLOCATED( w_av ) )  THEN
305                   ALLOCATE( w_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
306                ENDIF
307                w_av = 0.0_wp
308
309             CASE ( 'z0*' )
310                IF ( .NOT. ALLOCATED( z0_av ) )  THEN
311                   ALLOCATE( z0_av(nysg:nyng,nxlg:nxrg) )
312                ENDIF
313                z0_av = 0.0_wp
314
315             CASE ( 'z0h*' )
316                IF ( .NOT. ALLOCATED( z0h_av ) )  THEN
317                   ALLOCATE( z0h_av(nysg:nyng,nxlg:nxrg) )
318                ENDIF
319                z0h_av = 0.0_wp
320
321             CASE ( 'z0q*' )
322                IF ( .NOT. ALLOCATED( z0q_av ) )  THEN
323                   ALLOCATE( z0q_av(nysg:nyng,nxlg:nxrg) )
324                ENDIF
325                z0q_av = 0.0_wp
326
327
328             CASE DEFAULT
329
330!
331!--             Allocating and initializing data arrays for all other modules
332                CALL module_interface_3d_data_averaging( 'allocate', trimvar )
333
334
335          END SELECT
336
337       ENDDO
338
339    ENDIF
340
341!
342!-- Loop of all variables to be averaged.
343    DO  ii = 1, doav_n
344
345       trimvar = TRIM( doav(ii) )
346!
347!--    Store the array chosen on the temporary array.
348       SELECT CASE ( trimvar )
349
350          CASE ( 'ghf*' )
351             IF ( ALLOCATED( ghf_av ) ) THEN
352                DO  i = nxl, nxr
353                   DO  j = nys, nyn
354!
355!--                   Check whether grid point is a natural- or urban-type
356!--                   surface.
357                      match_lsm = surf_lsm_h%start_index(j,i) <=               &
358                                  surf_lsm_h%end_index(j,i)
359                      match_usm = surf_usm_h%start_index(j,i) <=               &
360                                  surf_usm_h%end_index(j,i)
361!
362!--                   In order to avoid double-counting of surface properties,
363!--                   always assume that natural-type surfaces are below urban-
364!--                   type surfaces, e.g. in case of bridges.
365!--                   Further, take only the last suface element, i.e. the
366!--                   uppermost surface which would be visible from above
367                      IF ( match_lsm  .AND.  .NOT. match_usm )  THEN
368                         m = surf_lsm_h%end_index(j,i)
369                         ghf_av(j,i) = ghf_av(j,i) +                           &
370                                         surf_lsm_h%ghf(m)
371                      ELSEIF ( match_usm )  THEN
372                         m = surf_usm_h%end_index(j,i)
373                         ghf_av(j,i) = ghf_av(j,i) +                           &
374                                         surf_usm_h%frac(m,ind_veg_wall)  *    &
375                                         surf_usm_h%wghf_eb(m)        +        &
376                                         surf_usm_h%frac(m,ind_pav_green) *    &
377                                         surf_usm_h%wghf_eb_green(m)  +        &
378                                         surf_usm_h%frac(m,ind_wat_win)   *    &
379                                         surf_usm_h%wghf_eb_window(m)
380                      ENDIF
381                   ENDDO
382                ENDDO
383             ENDIF
384
385          CASE ( 'e' )
386             IF ( ALLOCATED( e_av ) ) THEN
387                DO  i = nxlg, nxrg
388                   DO  j = nysg, nyng
389                      DO  k = nzb, nzt+1
390                         e_av(k,j,i) = e_av(k,j,i) + e(k,j,i)
391                      ENDDO
392                   ENDDO
393                ENDDO
394             ENDIF
395
396          CASE ( 'thetal' )
397             IF ( ALLOCATED( lpt_av ) ) THEN
398                DO  i = nxlg, nxrg
399                   DO  j = nysg, nyng
400                      DO  k = nzb, nzt+1
401                         lpt_av(k,j,i) = lpt_av(k,j,i) + pt(k,j,i)
402                      ENDDO
403                   ENDDO
404                ENDDO
405             ENDIF
406
407          CASE ( 'lwp*' )
408             IF ( ALLOCATED( lwp_av ) ) THEN
409                DO  i = nxlg, nxrg
410                   DO  j = nysg, nyng
411                      lwp_av(j,i) = lwp_av(j,i) + SUM( ql(nzb:nzt,j,i)            &
412                                                  * dzw(1:nzt+1) ) * rho_surface
413                   ENDDO
414                ENDDO
415             ENDIF
416
417          CASE ( 'ol*' )
418             IF ( ALLOCATED( ol_av ) ) THEN
419                DO  i = nxl, nxr
420                   DO  j = nys, nyn
421                      match_def = surf_def_h(0)%start_index(j,i) <=            &
422                                  surf_def_h(0)%end_index(j,i)
423                      match_lsm = surf_lsm_h%start_index(j,i) <=               &
424                                  surf_lsm_h%end_index(j,i)
425                      match_usm = surf_usm_h%start_index(j,i) <=               &
426                                  surf_usm_h%end_index(j,i)
427
428                      IF ( match_def )  THEN
429                         m = surf_def_h(0)%end_index(j,i)
430                         ol_av(j,i) = ol_av(j,i) +                             &
431                                         surf_def_h(0)%ol(m)
432                      ELSEIF ( match_lsm  .AND.  .NOT. match_usm )  THEN
433                         m = surf_lsm_h%end_index(j,i)
434                         ol_av(j,i) = ol_av(j,i) +                             &
435                                         surf_lsm_h%ol(m)
436                      ELSEIF ( match_usm )  THEN
437                         m = surf_usm_h%end_index(j,i)
438                         ol_av(j,i) = ol_av(j,i) +                             &
439                                         surf_usm_h%ol(m)
440                      ENDIF
441                   ENDDO
442                ENDDO
443             ENDIF
444
445          CASE ( 'p' )
446             IF ( ALLOCATED( p_av ) ) THEN
447                DO  i = nxlg, nxrg
448                   DO  j = nysg, nyng
449                      DO  k = nzb, nzt+1
450                         p_av(k,j,i) = p_av(k,j,i) + p(k,j,i)
451                      ENDDO
452                   ENDDO
453                ENDDO
454             ENDIF
455
456          CASE ( 'pc' )
457             IF ( ALLOCATED( pc_av ) ) THEN
458                DO  i = nxl, nxr
459                   DO  j = nys, nyn
460                      DO  k = nzb, nzt+1
461                         pc_av(k,j,i) = pc_av(k,j,i) + prt_count(k,j,i)
462                      ENDDO
463                   ENDDO
464                ENDDO
465             ENDIF
466
467          CASE ( 'pr' )
468             IF ( ALLOCATED( pr_av ) ) THEN
469                DO  i = nxl, nxr
470                   DO  j = nys, nyn
471                      DO  k = nzb, nzt+1
472                         number_of_particles = prt_count(k,j,i)
473                         IF ( number_of_particles <= 0 )  CYCLE
474                         particles =>                                          &
475                         grid_particles(k,j,i)%particles(1:number_of_particles)
476                         s_r2 = 0.0_wp
477                         s_r3 = 0.0_wp
478
479                         DO  n = 1, number_of_particles
480                            IF ( particles(n)%particle_mask )  THEN
481                               s_r2 = s_r2 + particles(n)%radius**2 *          &
482                                   particles(n)%weight_factor
483                               s_r3 = s_r3 + particles(n)%radius**3 *          &
484                                   particles(n)%weight_factor
485                            ENDIF
486                         ENDDO
487
488                         IF ( s_r2 > 0.0_wp )  THEN
489                            mean_r = s_r3 / s_r2
490                         ELSE
491                            mean_r = 0.0_wp
492                         ENDIF
493                         pr_av(k,j,i) = pr_av(k,j,i) + mean_r
494                      ENDDO
495                   ENDDO
496                ENDDO
497             ENDIF
498
499          CASE ( 'theta' )
500             IF ( ALLOCATED( pt_av ) ) THEN
501                IF ( .NOT. bulk_cloud_model ) THEN
502                DO  i = nxlg, nxrg
503                   DO  j = nysg, nyng
504                      DO  k = nzb, nzt+1
505                            pt_av(k,j,i) = pt_av(k,j,i) + pt(k,j,i)
506                         ENDDO
507                      ENDDO
508                   ENDDO
509                ELSE
510                DO  i = nxlg, nxrg
511                   DO  j = nysg, nyng
512                      DO  k = nzb, nzt+1
513                            pt_av(k,j,i) = pt_av(k,j,i) + pt(k,j,i) + lv_d_cp * &
514                                                          d_exner(k) * ql(k,j,i)
515                         ENDDO
516                      ENDDO
517                   ENDDO
518                ENDIF
519             ENDIF
520
521          CASE ( 'q' )
522             IF ( ALLOCATED( q_av ) ) THEN
523                DO  i = nxlg, nxrg
524                   DO  j = nysg, nyng
525                      DO  k = nzb, nzt+1
526                         q_av(k,j,i) = q_av(k,j,i) + q(k,j,i)
527                      ENDDO
528                   ENDDO
529                ENDDO
530             ENDIF
531
532          CASE ( 'ql' )
533             IF ( ALLOCATED( ql_av ) ) THEN
534                DO  i = nxlg, nxrg
535                   DO  j = nysg, nyng
536                      DO  k = nzb, nzt+1
537                         ql_av(k,j,i) = ql_av(k,j,i) + ql(k,j,i)
538                      ENDDO
539                   ENDDO
540                ENDDO
541             ENDIF
542
543          CASE ( 'ql_c' )
544             IF ( ALLOCATED( ql_c_av ) ) THEN
545                DO  i = nxlg, nxrg
546                   DO  j = nysg, nyng
547                      DO  k = nzb, nzt+1
548                         ql_c_av(k,j,i) = ql_c_av(k,j,i) + ql_c(k,j,i)
549                      ENDDO
550                   ENDDO
551                ENDDO
552             ENDIF
553
554          CASE ( 'ql_v' )
555             IF ( ALLOCATED( ql_v_av ) ) THEN
556                DO  i = nxlg, nxrg
557                   DO  j = nysg, nyng
558                      DO  k = nzb, nzt+1
559                         ql_v_av(k,j,i) = ql_v_av(k,j,i) + ql_v(k,j,i)
560                      ENDDO
561                   ENDDO
562                ENDDO
563             ENDIF
564
565          CASE ( 'ql_vp' )
566             IF ( ALLOCATED( ql_vp_av ) ) THEN
567                DO  i = nxl, nxr
568                   DO  j = nys, nyn
569                      DO  k = nzb, nzt+1
570                         number_of_particles = prt_count(k,j,i)
571                         IF ( number_of_particles <= 0 )  CYCLE
572                         particles =>                                          & 
573                         grid_particles(k,j,i)%particles(1:number_of_particles)
574                         DO  n = 1, number_of_particles
575                            IF ( particles(n)%particle_mask )  THEN
576                               ql_vp_av(k,j,i) = ql_vp_av(k,j,i) + &
577                                                 particles(n)%weight_factor /  &
578                                                 number_of_particles
579                            ENDIF
580                         ENDDO
581                      ENDDO
582                   ENDDO
583                ENDDO
584             ENDIF
585
586          CASE ( 'qsws*' )
587!
588!--          In case of default surfaces, clean-up flux by density.
589!--          In case of land- and urban-surfaces, convert fluxes into
590!--          dynamic units.
591!--          Question (maronga): are the .NOT. statements really required?
592             IF ( ALLOCATED( qsws_av ) ) THEN
593                DO  i = nxl, nxr
594                   DO  j = nys, nyn
595                      match_def = surf_def_h(0)%start_index(j,i) <=            &
596                                  surf_def_h(0)%end_index(j,i)
597                      match_lsm = surf_lsm_h%start_index(j,i) <=               &
598                                  surf_lsm_h%end_index(j,i)
599                      match_usm = surf_usm_h%start_index(j,i) <=               &
600                                  surf_usm_h%end_index(j,i)
601
602                      IF ( match_def )  THEN
603                         m = surf_def_h(0)%end_index(j,i)
604                         qsws_av(j,i) = qsws_av(j,i) +                         &
605                                         surf_def_h(0)%qsws(m) *               &
606                                         waterflux_output_conversion(nzb)
607                      ELSEIF ( match_lsm  .AND.  .NOT. match_usm )  THEN
608                         m = surf_lsm_h%end_index(j,i)
609                         qsws_av(j,i) = qsws_av(j,i) +                         &
610                                         surf_lsm_h%qsws(m) * l_v
611                      ELSEIF ( match_usm  .AND.  .NOT. match_lsm )  THEN
612                         m = surf_usm_h%end_index(j,i)
613                         qsws_av(j,i) = qsws_av(j,i) +                         &
614                                         surf_usm_h%qsws(m) * l_v
615                      ENDIF
616                   ENDDO
617                ENDDO
618             ENDIF
619
620          CASE ( 'qv' )
621             IF ( ALLOCATED( qv_av ) ) THEN
622                DO  i = nxlg, nxrg
623                   DO  j = nysg, nyng
624                      DO  k = nzb, nzt+1
625                         qv_av(k,j,i) = qv_av(k,j,i) + q(k,j,i) - ql(k,j,i)
626                      ENDDO
627                   ENDDO
628                ENDDO
629             ENDIF
630
631          CASE ( 'r_a*' )
632             IF ( ALLOCATED( r_a_av ) ) THEN
633                DO  i = nxl, nxr
634                   DO  j = nys, nyn
635                      match_lsm = surf_lsm_h%start_index(j,i) <=               &
636                                  surf_lsm_h%end_index(j,i)
637                      match_usm = surf_usm_h%start_index(j,i) <=               &
638                                  surf_usm_h%end_index(j,i)
639
640                      IF ( match_lsm  .AND.  .NOT. match_usm )  THEN
641                         m = surf_lsm_h%end_index(j,i)
642                         r_a_av(j,i) = r_a_av(j,i) +                           &
643                                         surf_lsm_h%r_a(m)
644                      ELSEIF ( match_usm )  THEN
645                         m = surf_usm_h%end_index(j,i)
646                         r_a_av(j,i) = r_a_av(j,i) +                           &
647                                         surf_usm_h%frac(m,ind_veg_wall)  *    &
648                                         surf_usm_h%r_a(m)       +             & 
649                                         surf_usm_h%frac(m,ind_pav_green) *    &
650                                         surf_usm_h%r_a_green(m) +             & 
651                                         surf_usm_h%frac(m,ind_wat_win)   *    &
652                                         surf_usm_h%r_a_window(m)
653                      ENDIF
654                   ENDDO
655                ENDDO
656             ENDIF
657
658          CASE ( 's' )
659             IF ( ALLOCATED( s_av ) ) THEN
660                DO  i = nxlg, nxrg
661                   DO  j = nysg, nyng
662                      DO  k = nzb, nzt+1
663                         s_av(k,j,i) = s_av(k,j,i) + s(k,j,i)
664                      ENDDO
665                   ENDDO
666                ENDDO
667             ENDIF
668
669          CASE ( 'shf*' )
670!
671!--          In case of default surfaces, clean-up flux by density.
672!--          In case of land- and urban-surfaces, convert fluxes into
673!--          dynamic units.
674             IF ( ALLOCATED( shf_av ) ) THEN
675                DO  i = nxl, nxr
676                   DO  j = nys, nyn
677                      match_def = surf_def_h(0)%start_index(j,i) <=            &
678                                  surf_def_h(0)%end_index(j,i)
679                      match_lsm = surf_lsm_h%start_index(j,i) <=               &
680                                  surf_lsm_h%end_index(j,i)
681                      match_usm = surf_usm_h%start_index(j,i) <=               &
682                                  surf_usm_h%end_index(j,i)
683
684                      IF ( match_def )  THEN
685                         m = surf_def_h(0)%end_index(j,i)
686                         shf_av(j,i) = shf_av(j,i) +                           &
687                                         surf_def_h(0)%shf(m)  *               &
688                                         heatflux_output_conversion(nzb)
689                      ELSEIF ( match_lsm  .AND.  .NOT. match_usm )  THEN
690                         m = surf_lsm_h%end_index(j,i)
691                         shf_av(j,i) = shf_av(j,i) +                           &
692                                         surf_lsm_h%shf(m) * c_p
693                      ELSEIF ( match_usm )  THEN
694                         m = surf_usm_h%end_index(j,i)
695                         shf_av(j,i) = shf_av(j,i) +                           &
696                                         surf_usm_h%shf(m) * c_p
697                      ENDIF
698                   ENDDO
699                ENDDO
700             ENDIF
701
702          CASE ( 'ssws*' )
703             IF ( ALLOCATED( ssws_av ) ) THEN
704                DO  i = nxl, nxr
705                   DO  j = nys, nyn
706                      match_def = surf_def_h(0)%start_index(j,i) <=            &
707                                  surf_def_h(0)%end_index(j,i)
708                      match_lsm = surf_lsm_h%start_index(j,i) <=               &
709                                  surf_lsm_h%end_index(j,i)
710                      match_usm = surf_usm_h%start_index(j,i) <=               &
711                                  surf_usm_h%end_index(j,i)
712
713                      IF ( match_def )  THEN
714                         m = surf_def_h(0)%end_index(j,i)
715                         ssws_av(j,i) = ssws_av(j,i) +                         &
716                                         surf_def_h(0)%ssws(m)
717                      ELSEIF ( match_lsm  .AND.  .NOT. match_usm )  THEN
718                         m = surf_lsm_h%end_index(j,i)
719                         ssws_av(j,i) = ssws_av(j,i) +                         &
720                                         surf_lsm_h%ssws(m)
721                      ELSEIF ( match_usm )  THEN
722                         m = surf_usm_h%end_index(j,i)
723                         ssws_av(j,i) = ssws_av(j,i) +                         &
724                                         surf_usm_h%ssws(m)
725                      ENDIF
726                   ENDDO
727                ENDDO
728             ENDIF
729
730          CASE ( 't*' )
731             IF ( ALLOCATED( ts_av ) ) THEN
732                DO  i = nxl, nxr
733                   DO  j = nys, nyn
734                      match_def = surf_def_h(0)%start_index(j,i) <=            &
735                                  surf_def_h(0)%end_index(j,i)
736                      match_lsm = surf_lsm_h%start_index(j,i) <=               &
737                                  surf_lsm_h%end_index(j,i)
738                      match_usm = surf_usm_h%start_index(j,i) <=               &
739                                  surf_usm_h%end_index(j,i)
740
741                      IF ( match_def )  THEN
742                         m = surf_def_h(0)%end_index(j,i)
743                         ts_av(j,i) = ts_av(j,i) +                             &
744                                         surf_def_h(0)%ts(m)
745                      ELSEIF ( match_lsm  .AND.  .NOT. match_usm )  THEN
746                         m = surf_lsm_h%end_index(j,i)
747                         ts_av(j,i) = ts_av(j,i) +                             &
748                                         surf_lsm_h%ts(m)
749                      ELSEIF ( match_usm )  THEN
750                         m = surf_usm_h%end_index(j,i)
751                         ts_av(j,i) = ts_av(j,i) +                             &
752                                         surf_usm_h%ts(m)
753                      ENDIF
754                   ENDDO
755                ENDDO
756             ENDIF
757
758          CASE ( 'tsurf*' )
759             IF ( ALLOCATED( tsurf_av ) ) THEN   
760                DO  i = nxl, nxr
761                   DO  j = nys, nyn
762                      match_def = surf_def_h(0)%start_index(j,i) <=            &
763                                  surf_def_h(0)%end_index(j,i)
764                      match_lsm = surf_lsm_h%start_index(j,i) <=               &
765                                  surf_lsm_h%end_index(j,i)
766                      match_usm = surf_usm_h%start_index(j,i) <=               &
767                                  surf_usm_h%end_index(j,i)
768
769                      IF ( match_def )  THEN
770                         m = surf_def_h(0)%end_index(j,i)
771                         tsurf_av(j,i) = tsurf_av(j,i) +                       &
772                                         surf_def_h(0)%pt_surface(m)
773                      ELSEIF ( match_lsm  .AND.  .NOT. match_usm )  THEN
774                         m = surf_lsm_h%end_index(j,i)
775                         tsurf_av(j,i) = tsurf_av(j,i) +                       &
776                                         surf_lsm_h%pt_surface(m)
777                      ELSEIF ( match_usm )  THEN
778                         m = surf_usm_h%end_index(j,i)
779                         tsurf_av(j,i) = tsurf_av(j,i) +                       &
780                                         surf_usm_h%pt_surface(m)
781                      ENDIF
782                   ENDDO
783                ENDDO
784             ENDIF
785
786          CASE ( 'u' )
787             IF ( ALLOCATED( u_av ) ) THEN
788                DO  i = nxlg, nxrg
789                   DO  j = nysg, nyng
790                      DO  k = nzb, nzt+1
791                         u_av(k,j,i) = u_av(k,j,i) + u(k,j,i)
792                      ENDDO
793                   ENDDO
794                ENDDO
795             ENDIF
796
797          CASE ( 'us*' )
798             IF ( ALLOCATED( us_av ) ) THEN   
799                DO  i = nxl, nxr
800                   DO  j = nys, nyn
801                      match_def = surf_def_h(0)%start_index(j,i) <=            &
802                                  surf_def_h(0)%end_index(j,i)
803                      match_lsm = surf_lsm_h%start_index(j,i) <=               &
804                                  surf_lsm_h%end_index(j,i)
805                      match_usm = surf_usm_h%start_index(j,i) <=               &
806                                  surf_usm_h%end_index(j,i)
807
808                      IF ( match_def )  THEN
809                         m = surf_def_h(0)%end_index(j,i)
810                         us_av(j,i) = us_av(j,i) +                             &
811                                         surf_def_h(0)%us(m)
812                      ELSEIF ( match_lsm  .AND.  .NOT. match_usm )  THEN
813                         m = surf_lsm_h%end_index(j,i)
814                         us_av(j,i) = us_av(j,i) +                             &
815                                         surf_lsm_h%us(m)
816                      ELSEIF ( match_usm )  THEN
817                         m = surf_usm_h%end_index(j,i)
818                         us_av(j,i) = us_av(j,i) +                             &
819                                         surf_usm_h%us(m)
820                      ENDIF
821                   ENDDO
822                ENDDO
823             ENDIF
824
825          CASE ( 'v' )
826             IF ( ALLOCATED( v_av ) ) THEN
827                DO  i = nxlg, nxrg
828                   DO  j = nysg, nyng
829                      DO  k = nzb, nzt+1
830                         v_av(k,j,i) = v_av(k,j,i) + v(k,j,i)
831                      ENDDO
832                   ENDDO
833                ENDDO
834             ENDIF
835
836          CASE ( 'thetav' )
837             IF ( ALLOCATED( vpt_av ) ) THEN
838                DO  i = nxlg, nxrg
839                   DO  j = nysg, nyng
840                      DO  k = nzb, nzt+1
841                         vpt_av(k,j,i) = vpt_av(k,j,i) + vpt(k,j,i)
842                      ENDDO
843                   ENDDO
844                ENDDO
845             ENDIF
846
847          CASE ( 'w' )
848             IF ( ALLOCATED( w_av ) ) THEN
849                DO  i = nxlg, nxrg
850                   DO  j = nysg, nyng
851                      DO  k = nzb, nzt+1
852                         w_av(k,j,i) = w_av(k,j,i) + w(k,j,i)
853                      ENDDO
854                   ENDDO
855                ENDDO
856             ENDIF
857
858          CASE ( 'z0*' )
859             IF ( ALLOCATED( z0_av ) ) THEN
860                DO  i = nxl, nxr
861                   DO  j = nys, nyn
862                      match_def = surf_def_h(0)%start_index(j,i) <=            &
863                                  surf_def_h(0)%end_index(j,i)
864                      match_lsm = surf_lsm_h%start_index(j,i) <=               &
865                                  surf_lsm_h%end_index(j,i)
866                      match_usm = surf_usm_h%start_index(j,i) <=               &
867                                  surf_usm_h%end_index(j,i)
868
869                      IF ( match_def )  THEN
870                         m = surf_def_h(0)%end_index(j,i)
871                         z0_av(j,i) = z0_av(j,i) +                             &
872                                         surf_def_h(0)%z0(m)
873                      ELSEIF ( match_lsm  .AND.  .NOT. match_usm )  THEN
874                         m = surf_lsm_h%end_index(j,i)
875                         z0_av(j,i) = z0_av(j,i) +                             &
876                                         surf_lsm_h%z0(m)
877                      ELSEIF ( match_usm )  THEN
878                         m = surf_usm_h%end_index(j,i)
879                         z0_av(j,i) = z0_av(j,i) +                             &
880                                         surf_usm_h%z0(m)
881                      ENDIF
882                   ENDDO
883                ENDDO   
884             ENDIF
885
886          CASE ( 'z0h*' )
887             IF ( ALLOCATED( z0h_av ) ) THEN
888                DO  i = nxl, nxr
889                   DO  j = nys, nyn
890                      match_def = surf_def_h(0)%start_index(j,i) <=            &
891                                  surf_def_h(0)%end_index(j,i)
892                      match_lsm = surf_lsm_h%start_index(j,i) <=               &
893                                  surf_lsm_h%end_index(j,i)
894                      match_usm = surf_usm_h%start_index(j,i) <=               &
895                                  surf_usm_h%end_index(j,i)
896
897                      IF ( match_def )  THEN
898                         m = surf_def_h(0)%end_index(j,i)
899                         z0h_av(j,i) = z0h_av(j,i) +                           &
900                                         surf_def_h(0)%z0h(m)
901                      ELSEIF ( match_lsm  .AND.  .NOT. match_usm )  THEN
902                         m = surf_lsm_h%end_index(j,i)
903                         z0h_av(j,i) = z0h_av(j,i) +                           &
904                                         surf_lsm_h%z0h(m)
905                      ELSEIF ( match_usm )  THEN
906                         m = surf_usm_h%end_index(j,i)
907                         z0h_av(j,i) = z0h_av(j,i) +                           &
908                                         surf_usm_h%z0h(m)
909                      ENDIF
910                   ENDDO
911                ENDDO
912             ENDIF
913   
914          CASE ( 'z0q*' )
915             IF ( ALLOCATED( z0q_av ) ) THEN
916                DO  i = nxl, nxr
917                   DO  j = nys, nyn
918                      match_def = surf_def_h(0)%start_index(j,i) <=            &
919                                  surf_def_h(0)%end_index(j,i)
920                      match_lsm = surf_lsm_h%start_index(j,i) <=               &
921                                  surf_lsm_h%end_index(j,i)
922                      match_usm = surf_usm_h%start_index(j,i) <=               &
923                                  surf_usm_h%end_index(j,i)
924
925                      IF ( match_def )  THEN
926                         m = surf_def_h(0)%end_index(j,i)
927                         z0q_av(j,i) = z0q_av(j,i) +                           &
928                                         surf_def_h(0)%z0q(m)
929                      ELSEIF ( match_lsm  .AND.  .NOT. match_usm )  THEN
930                         m = surf_lsm_h%end_index(j,i)
931                         z0q_av(j,i) = z0q_av(j,i) +                           &
932                                         surf_lsm_h%z0q(m)
933                      ELSEIF ( match_usm )  THEN
934                         m = surf_usm_h%end_index(j,i)
935                         z0q_av(j,i) = z0q_av(j,i) +                           &
936                                         surf_usm_h%z0q(m)
937                      ENDIF
938                   ENDDO
939                ENDDO
940             ENDIF
941
942          CASE DEFAULT
943
944!--          In case of urban surface variables it should be always checked
945!--          if respective arrays are allocated, at least in case of a restart
946!--          run, as averaged usm arrays are not read from file at the moment.
947             IF ( urban_surface )  THEN
948                CALL usm_3d_data_averaging( 'allocate', trimvar )
949             ENDIF
950
951!
952!--          Summing up data from all other modules
953             CALL module_interface_3d_data_averaging( 'sum', trimvar )
954
955
956       END SELECT
957
958    ENDDO
959
960    CALL cpu_log( log_point(34), 'sum_up_3d_data', 'stop' )
961
962
963 END SUBROUTINE sum_up_3d_data
Note: See TracBrowser for help on using the repository browser.