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

Last change on this file since 1053 was 1053, checked in by hoffmann, 9 years ago

two-moment cloud physics implemented

  • Property svn:keywords set to Id
File size: 17.4 KB
Line 
1 SUBROUTINE sum_up_3d_data
2
3!--------------------------------------------------------------------------------!
4! This file is part of PALM.
5!
6! PALM is free software: you can redistribute it and/or modify it under the terms
7! of the GNU General Public License as published by the Free Software Foundation,
8! either version 3 of the License, or (at your option) any later 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-2012  Leibniz University Hannover
18!--------------------------------------------------------------------------------!
19!
20! Current revisions:
21! -----------------
22! +nr, prr, qr
23!
24! Former revisions:
25! -----------------
26! $Id: sum_up_3d_data.f90 1053 2012-11-13 17:11:03Z hoffmann $
27!
28! 1036 2012-10-22 13:43:42Z raasch
29! code put under GPL (PALM 3.9)
30!
31! 1007 2012-09-19 14:30:36Z franke
32! Bugfix in calculation of ql_vp
33!
34! 978 2012-08-09 08:28:32Z fricke
35! +z0h*
36!
37! 790 2011-11-29 03:11:20Z raasch
38! bugfix: calculation of 'pr' must depend on the particle weighting factor
39!
40! 771 2011-10-27 10:56:21Z heinze
41! +lpt_av
42!
43! 667 2010-12-23 12:06:00Z suehring/gryschka
44! nxl-1, nxr+1, nys-1, nyn+1 replaced by nxlg, nxrg, nysg, nyng
45!
46! 402 2009-10-21 11:59:41Z maronga
47! Bugfix in calculation of shf*_av, qsws*_av
48!
49! 2009-08-25 08:35:52Z maronga
50! +shf*, qsws*
51!
52! 96 2007-06-04 08:07:41Z raasch
53! +sum-up of density and salinity
54!
55! 72 2007-03-19 08:20:46Z raasch
56! +sum-up of precipitation rate and roughness length (prr*, z0*)
57!
58! RCS Log replace by Id keyword, revision history cleaned up
59!
60! Revision 1.1  2006/02/23 12:55:23  raasch
61! Initial revision
62!
63!
64! Description:
65! ------------
66! Sum-up the values of 3d-arrays. The real averaging is later done in routine
67! average_3d_data.
68!------------------------------------------------------------------------------!
69
70    USE arrays_3d
71    USE averaging
72    USE cloud_parameters
73    USE control_parameters
74    USE cpulog
75    USE indices
76    USE interfaces
77    USE particle_attributes
78
79    IMPLICIT NONE
80
81    INTEGER ::  i, ii, j, k, n, psi
82
83    REAL    ::  mean_r, s_r3, s_r4
84
85
86    CALL cpu_log (log_point(34),'sum_up_3d_data','start')
87
88!
89!-- Allocate and initialize the summation arrays if called for the very first
90!-- time or the first time after average_3d_data has been called
91!-- (some or all of the arrays may have been already allocated
92!-- in read_3d_binary)
93    IF ( average_count_3d == 0 )  THEN
94
95       DO  ii = 1, doav_n
96
97          SELECT CASE ( TRIM( doav(ii) ) )
98
99             CASE ( 'e' )
100                IF ( .NOT. ALLOCATED( e_av ) )  THEN
101                   ALLOCATE( e_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
102                ENDIF
103                e_av = 0.0
104
105             CASE ( 'lpt' )
106                IF ( .NOT. ALLOCATED( lpt_av ) )  THEN
107                   ALLOCATE( lpt_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
108                ENDIF
109                lpt_av = 0.0
110
111             CASE ( 'lwp*' )
112                IF ( .NOT. ALLOCATED( lwp_av ) )  THEN
113                   ALLOCATE( lwp_av(nysg:nyng,nxlg:nxrg) )
114                ENDIF
115                lwp_av = 0.0
116
117             CASE ( 'nr' )
118                IF ( .NOT. ALLOCATED( nr_av ) )  THEN
119                   ALLOCATE( nr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
120                ENDIF
121                nr_av = 0.0
122
123             CASE ( 'p' )
124                IF ( .NOT. ALLOCATED( p_av ) )  THEN
125                   ALLOCATE( p_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
126                ENDIF
127                p_av = 0.0
128
129             CASE ( 'pc' )
130                IF ( .NOT. ALLOCATED( pc_av ) )  THEN
131                   ALLOCATE( pc_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
132                ENDIF
133                pc_av = 0.0
134
135             CASE ( 'pr' )
136                IF ( .NOT. ALLOCATED( pr_av ) )  THEN
137                   ALLOCATE( pr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
138                ENDIF
139                pr_av = 0.0
140
141             CASE ( 'prr' )
142                IF ( .NOT. ALLOCATED( prr_av ) )  THEN
143                   ALLOCATE( prr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
144                ENDIF
145                prr_av = 0.0
146
147             CASE ( 'prr*' )
148                IF ( .NOT. ALLOCATED( precipitation_rate_av ) )  THEN
149                   ALLOCATE( precipitation_rate_av(nysg:nyng,nxlg:nxrg) )
150                ENDIF
151                precipitation_rate_av = 0.0
152
153             CASE ( 'pt' )
154                IF ( .NOT. ALLOCATED( pt_av ) )  THEN
155                   ALLOCATE( pt_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
156                ENDIF
157                pt_av = 0.0
158
159             CASE ( 'q' )
160                IF ( .NOT. ALLOCATED( q_av ) )  THEN
161                   ALLOCATE( q_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
162                ENDIF
163                q_av = 0.0
164
165             CASE ( 'ql' )
166                IF ( .NOT. ALLOCATED( ql_av ) )  THEN
167                   ALLOCATE( ql_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
168                ENDIF
169                ql_av = 0.0
170
171             CASE ( 'ql_c' )
172                IF ( .NOT. ALLOCATED( ql_c_av ) )  THEN
173                   ALLOCATE( ql_c_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
174                ENDIF
175                ql_c_av = 0.0
176
177             CASE ( 'ql_v' )
178                IF ( .NOT. ALLOCATED( ql_v_av ) )  THEN
179                   ALLOCATE( ql_v_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
180                ENDIF
181                ql_v_av = 0.0
182
183             CASE ( 'ql_vp' )
184                IF ( .NOT. ALLOCATED( ql_vp_av ) )  THEN
185                   ALLOCATE( ql_vp_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
186                ENDIF
187                ql_vp_av = 0.0
188
189             CASE ( 'qr' )
190                IF ( .NOT. ALLOCATED( qr_av ) )  THEN
191                   ALLOCATE( qr_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
192                ENDIF
193                qr_av = 0.0
194
195             CASE ( 'qsws*' )
196                IF ( .NOT. ALLOCATED( qsws_av ) )  THEN
197                   ALLOCATE( qsws_av(nysg:nyng,nxlg:nxrg) )
198                ENDIF
199                qsws_av = 0.0
200
201             CASE ( 'qv' )
202                IF ( .NOT. ALLOCATED( qv_av ) )  THEN
203                   ALLOCATE( qv_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
204                ENDIF
205                qv_av = 0.0
206
207             CASE ( 'rho' )
208                IF ( .NOT. ALLOCATED( rho_av ) )  THEN
209                   ALLOCATE( rho_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
210                ENDIF
211                rho_av = 0.0
212
213             CASE ( 's' )
214                IF ( .NOT. ALLOCATED( s_av ) )  THEN
215                   ALLOCATE( s_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
216                ENDIF
217                s_av = 0.0
218
219             CASE ( 'sa' )
220                IF ( .NOT. ALLOCATED( sa_av ) )  THEN
221                   ALLOCATE( sa_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
222                ENDIF
223                sa_av = 0.0
224
225             CASE ( 'shf*' )
226                IF ( .NOT. ALLOCATED( shf_av ) )  THEN
227                   ALLOCATE( shf_av(nysg:nyng,nxlg:nxrg) )
228                ENDIF
229                shf_av = 0.0
230
231             CASE ( 't*' )
232                IF ( .NOT. ALLOCATED( ts_av ) )  THEN
233                   ALLOCATE( ts_av(nysg:nyng,nxlg:nxrg) )
234                ENDIF
235                ts_av = 0.0
236
237             CASE ( 'u' )
238                IF ( .NOT. ALLOCATED( u_av ) )  THEN
239                   ALLOCATE( u_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
240                ENDIF
241                u_av = 0.0
242
243             CASE ( 'u*' )
244                IF ( .NOT. ALLOCATED( us_av ) )  THEN
245                   ALLOCATE( us_av(nysg:nyng,nxlg:nxrg) )
246                ENDIF
247                us_av = 0.0
248
249             CASE ( 'v' )
250                IF ( .NOT. ALLOCATED( v_av ) )  THEN
251                   ALLOCATE( v_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
252                ENDIF
253                v_av = 0.0
254
255             CASE ( 'vpt' )
256                IF ( .NOT. ALLOCATED( vpt_av ) )  THEN
257                   ALLOCATE( vpt_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
258                ENDIF
259                vpt_av = 0.0
260
261             CASE ( 'w' )
262                IF ( .NOT. ALLOCATED( w_av ) )  THEN
263                   ALLOCATE( w_av(nzb:nzt+1,nysg:nyng,nxlg:nxrg) )
264                ENDIF
265                w_av = 0.0
266
267             CASE ( 'z0*' )
268                IF ( .NOT. ALLOCATED( z0_av ) )  THEN
269                   ALLOCATE( z0_av(nysg:nyng,nxlg:nxrg) )
270                ENDIF
271                z0_av = 0.0
272
273             CASE ( 'z0h*' )
274                IF ( .NOT. ALLOCATED( z0h_av ) )  THEN
275                   ALLOCATE( z0h_av(nysg:nyng,nxlg:nxrg) )
276                ENDIF
277                z0h_av = 0.0
278
279             CASE DEFAULT
280!
281!--             User-defined quantity
282                CALL user_3d_data_averaging( 'allocate', doav(ii) )
283
284          END SELECT
285
286       ENDDO
287
288    ENDIF
289
290!
291!-- Loop of all variables to be averaged.
292    DO  ii = 1, doav_n
293
294!
295!--    Store the array chosen on the temporary array.
296       SELECT CASE ( TRIM( doav(ii) ) )
297
298          CASE ( 'e' )
299             DO  i = nxlg, nxrg
300                DO  j = nysg, nyng
301                   DO  k = nzb, nzt+1
302                      e_av(k,j,i) = e_av(k,j,i) + e(k,j,i)
303                   ENDDO
304                ENDDO
305             ENDDO
306
307          CASE ( 'lpt' )
308             DO  i = nxlg, nxrg
309                DO  j = nysg, nyng
310                   DO  k = nzb, nzt+1
311                      lpt_av(k,j,i) = lpt_av(k,j,i) + pt(k,j,i)
312                   ENDDO
313                ENDDO
314             ENDDO
315
316          CASE ( 'lwp*' )
317             DO  i = nxlg, nxrg
318                DO  j = nysg, nyng
319                   lwp_av(j,i) = lwp_av(j,i) + SUM( ql(nzb:nzt,j,i) * &
320                                                    dzw(1:nzt+1) )
321                ENDDO
322             ENDDO
323
324          CASE ( 'nr' )
325             DO  i = nxlg, nxrg
326                DO  j = nysg, nyng
327                   DO  k = nzb, nzt+1
328                      nr_av(k,j,i) = nr_av(k,j,i) + nr(k,j,i)
329                   ENDDO
330                ENDDO
331             ENDDO
332
333          CASE ( 'p' )
334             DO  i = nxlg, nxrg
335                DO  j = nysg, nyng
336                   DO  k = nzb, nzt+1
337                      p_av(k,j,i) = p_av(k,j,i) + p(k,j,i)
338                   ENDDO
339                ENDDO
340             ENDDO
341
342          CASE ( 'pc' )
343             DO  i = nxl, nxr
344                DO  j = nys, nyn
345                   DO  k = nzb, nzt+1
346                      pc_av(k,j,i) = pc_av(k,j,i) + prt_count(k,j,i)
347                   ENDDO
348                ENDDO
349             ENDDO
350
351          CASE ( 'pr' )
352             DO  i = nxl, nxr
353                DO  j = nys, nyn
354                   DO  k = nzb, nzt+1
355                      psi = prt_start_index(k,j,i)
356                      s_r3 = 0.0
357                      s_r4 = 0.0
358                      DO  n = psi, psi+prt_count(k,j,i)-1
359                         s_r3 = s_r3 + particles(n)%radius**3 * &
360                                       particles(n)%weight_factor
361                         s_r4 = s_r4 + particles(n)%radius**4 * &
362                                       particles(n)%weight_factor
363                      ENDDO
364                      IF ( s_r3 /= 0.0 )  THEN
365                         mean_r = s_r4 / s_r3
366                      ELSE
367                         mean_r = 0.0
368                      ENDIF
369                      pr_av(k,j,i) = pr_av(k,j,i) + mean_r
370                   ENDDO
371                ENDDO
372             ENDDO
373
374          CASE ( 'pr*' )
375             DO  i = nxlg, nxrg
376                DO  j = nysg, nyng
377                   precipitation_rate_av(j,i) = precipitation_rate_av(j,i) + &
378                                                precipitation_rate(j,i)
379                ENDDO
380             ENDDO
381
382          CASE ( 'pt' )
383             IF ( .NOT. cloud_physics ) THEN
384             DO  i = nxlg, nxrg
385                DO  j = nysg, nyng
386                   DO  k = nzb, nzt+1
387                         pt_av(k,j,i) = pt_av(k,j,i) + pt(k,j,i)
388                      ENDDO
389                   ENDDO
390                ENDDO
391             ELSE
392             DO  i = nxlg, nxrg
393                DO  j = nysg, nyng
394                   DO  k = nzb, nzt+1
395                         pt_av(k,j,i) = pt_av(k,j,i) + pt(k,j,i) + l_d_cp * &
396                                                       pt_d_t(k) * ql(k,j,i)
397                      ENDDO
398                   ENDDO
399                ENDDO
400             ENDIF
401
402          CASE ( 'q' )
403             DO  i = nxlg, nxrg
404                DO  j = nysg, nyng
405                   DO  k = nzb, nzt+1
406                      q_av(k,j,i) = q_av(k,j,i) + q(k,j,i)
407                   ENDDO
408                ENDDO
409             ENDDO
410
411          CASE ( 'ql' )
412             DO  i = nxlg, nxrg
413                DO  j = nysg, nyng
414                   DO  k = nzb, nzt+1
415                      ql_av(k,j,i) = ql_av(k,j,i) + ql(k,j,i)
416                   ENDDO
417                ENDDO
418             ENDDO
419
420          CASE ( 'ql_c' )
421             DO  i = nxlg, nxrg
422                DO  j = nysg, nyng
423                   DO  k = nzb, nzt+1
424                      ql_c_av(k,j,i) = ql_c_av(k,j,i) + ql_c(k,j,i)
425                   ENDDO
426                ENDDO
427             ENDDO
428
429          CASE ( 'ql_v' )
430             DO  i = nxlg, nxrg
431                DO  j = nysg, nyng
432                   DO  k = nzb, nzt+1
433                      ql_v_av(k,j,i) = ql_v_av(k,j,i) + ql_v(k,j,i)
434                   ENDDO
435                ENDDO
436             ENDDO
437
438          CASE ( 'ql_vp' )
439             DO  i = nxl, nxr
440                DO  j = nys, nyn
441                   DO  k = nzb, nzt+1
442                      psi = prt_start_index(k,j,i)
443                      DO  n = psi, psi+prt_count(k,j,i)-1
444                         ql_vp_av(k,j,i) = ql_vp_av(k,j,i) + &
445                                           particles(n)%weight_factor / &
446                                           prt_count(k,j,i)
447                      ENDDO
448                   ENDDO
449                ENDDO
450             ENDDO
451
452          CASE ( 'qr' )
453             DO  i = nxlg, nxrg
454                DO  j = nysg, nyng
455                   DO  k = nzb, nzt+1
456                      qr_av(k,j,i) = qr_av(k,j,i) + qr(k,j,i)
457                   ENDDO
458                ENDDO
459             ENDDO
460
461          CASE ( 'qsws*' )
462             DO  i = nxlg, nxrg
463                DO  j = nysg, nyng
464                   qsws_av(j,i) = qsws_av(j,i) + qsws(j,i)
465                ENDDO
466             ENDDO
467
468          CASE ( 'qv' )
469             DO  i = nxlg, nxrg
470                DO  j = nysg, nyng
471                   DO  k = nzb, nzt+1
472                      qv_av(k,j,i) = qv_av(k,j,i) + q(k,j,i) - ql(k,j,i)
473                   ENDDO
474                ENDDO
475             ENDDO
476
477          CASE ( 'rho' )
478             DO  i = nxlg, nxrg
479                DO  j = nysg, nyng
480                   DO  k = nzb, nzt+1
481                      rho_av(k,j,i) = rho_av(k,j,i) + rho(k,j,i)
482                   ENDDO
483                ENDDO
484             ENDDO
485
486          CASE ( 's' )
487             DO  i = nxlg, nxrg
488                DO  j = nysg, nyng
489                   DO  k = nzb, nzt+1
490                      s_av(k,j,i) = s_av(k,j,i) + q(k,j,i)
491                   ENDDO
492                ENDDO
493             ENDDO
494
495          CASE ( 'sa' )
496             DO  i = nxlg, nxrg
497                DO  j = nysg, nyng
498                   DO  k = nzb, nzt+1
499                      sa_av(k,j,i) = sa_av(k,j,i) + sa(k,j,i)
500                   ENDDO
501                ENDDO
502             ENDDO
503
504          CASE ( 'shf*' )
505             DO  i = nxlg, nxrg
506                DO  j = nysg, nyng
507                   shf_av(j,i) = shf_av(j,i) + shf(j,i)
508                ENDDO
509             ENDDO
510
511          CASE ( 't*' )
512             DO  i = nxlg, nxrg
513                DO  j = nysg, nyng
514                   ts_av(j,i) = ts_av(j,i) + ts(j,i)
515                ENDDO
516             ENDDO
517
518          CASE ( 'u' )
519             DO  i = nxlg, nxrg
520                DO  j = nysg, nyng
521                   DO  k = nzb, nzt+1
522                      u_av(k,j,i) = u_av(k,j,i) + u(k,j,i)
523                   ENDDO
524                ENDDO
525             ENDDO
526
527          CASE ( 'u*' )
528             DO  i = nxlg, nxrg
529                DO  j = nysg, nyng
530                   us_av(j,i) = us_av(j,i) + us(j,i)
531                ENDDO
532             ENDDO
533
534          CASE ( 'v' )
535             DO  i = nxlg, nxrg
536                DO  j = nysg, nyng
537                   DO  k = nzb, nzt+1
538                      v_av(k,j,i) = v_av(k,j,i) + v(k,j,i)
539                   ENDDO
540                ENDDO
541             ENDDO
542
543          CASE ( 'vpt' )
544             DO  i = nxlg, nxrg
545                DO  j = nysg, nyng
546                   DO  k = nzb, nzt+1
547                      vpt_av(k,j,i) = vpt_av(k,j,i) + vpt(k,j,i)
548                   ENDDO
549                ENDDO
550             ENDDO
551
552          CASE ( 'w' )
553             DO  i = nxlg, nxrg
554                DO  j = nysg, nyng
555                   DO  k = nzb, nzt+1
556                      w_av(k,j,i) = w_av(k,j,i) + w(k,j,i)
557                   ENDDO
558                ENDDO
559             ENDDO
560
561          CASE ( 'z0*' )
562             DO  i = nxlg, nxrg
563                DO  j = nysg, nyng
564                   z0_av(j,i) = z0_av(j,i) + z0(j,i)
565                ENDDO
566             ENDDO
567
568          CASE ( 'z0h*' )
569             DO  i = nxlg, nxrg
570                DO  j = nysg, nyng
571                   z0h_av(j,i) = z0h_av(j,i) + z0h(j,i)
572                ENDDO
573             ENDDO
574
575          CASE DEFAULT
576!
577!--          User-defined quantity
578             CALL user_3d_data_averaging( 'sum', doav(ii) )
579
580       END SELECT
581
582    ENDDO
583
584    CALL cpu_log (log_point(34),'sum_up_3d_data','stop','nobarrier')
585
586
587 END SUBROUTINE sum_up_3d_data
Note: See TracBrowser for help on using the repository browser.