source: palm/trunk/SOURCE/average_3d_data.f90 @ 2735

Last change on this file since 2735 was 2735, checked in by suehring, 6 years ago

Output of resistance also urban-type surfaces

  • Property svn:keywords set to Id
File size: 16.2 KB
Line 
1!> @file average_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-2018 Leibniz Universitaet Hannover
18!------------------------------------------------------------------------------!
19!
20! Current revisions:
21! -----------------
22!
23!
24! Former revisions:
25! -----------------
26! $Id: average_3d_data.f90 2735 2018-01-11 12:01:27Z suehring $
27! output of r_a moved from land-surface to consider also urban-type surfaces
28!
29! 2718 2018-01-02 08:49:38Z maronga
30! Corrected "Former revisions" section
31!
32! 2696 2017-12-14 17:12:51Z kanani
33! Change in file header (GPL part)
34! Implement call for turbulence_closure_mod (TG)
35! Implementation of chemistry module (FK)
36!
37! 2292 2017-06-20 09:51:42Z schwenkel
38! Implementation of new microphysic scheme: cloud_scheme = 'morrison'
39! includes two more prognostic equations for cloud drop concentration (nc) 
40! and cloud water content (qc).
41!
42! 2233 2017-05-30 18:08:54Z suehring
43!
44! 2232 2017-05-30 17:47:52Z suehring
45! Adjustments to new surface concept - additional ghost point exchange
46! of surface variable required
47!
48! 2031 2016-10-21 15:11:58Z knoop
49! renamed variable rho to rho_ocean and rho_av to rho_ocean_av
50!
51! 2011 2016-09-19 17:29:57Z kanani
52! Flag urban_surface is now defined in module control_parameters,
53! changed prefix for urban surface model output to "usm_",
54! introduced control parameter varnamelength for LEN of trimvar.
55!
56! 2007 2016-08-24 15:47:17Z kanani
57! Added support for new urban surface model (temporary modifications of
58! SELECT CASE ( ) necessary, see variable trimvar),
59! added comments in variable declaration section
60!
61! 2000 2016-08-20 18:09:15Z knoop
62! Forced header and separation lines into 80 columns
63!
64! 1972 2016-07-26 07:52:02Z maronga
65! Output of land surface quantities is now done directly in the respective module
66!
67! 1960 2016-07-12 16:34:24Z suehring
68! Treat humidity and passive scalar separately
69!
70! 1691 2015-10-26 16:17:44Z maronga
71! Added output of Obukhov length and radiative heating rates for RRTMG.
72!
73! 1682 2015-10-07 23:56:08Z knoop
74! Code annotations made doxygen readable
75!
76! 1585 2015-04-30 07:05:52Z maronga
77! Adapted for RRTMG
78!
79! 1555 2015-03-04 17:44:27Z maronga
80! Added output of r_a and r_s
81!
82! 1551 2015-03-03 14:18:16Z maronga
83! Added support for land surface and radiation model parameters.
84!
85! 1322 2014-03-20 16:38:49Z raasch
86! REAL functions provided with KIND-attribute
87!
88! 1320 2014-03-20 08:40:49Z raasch
89! ONLY-attribute added to USE-statements,
90! kind-parameters added to all INTEGER and REAL declaration statements,
91! kinds are defined in new module kinds,
92! revision history before 2012 removed,
93! comment fields (!:) to be used for variable explanations added to
94! all variable declaration statements
95!
96! 1318 2014-03-17 13:35:16Z raasch
97! barrier argument removed from cpu_log,
98! module interfaces removed
99!
100! 1115 2013-03-26 18:16:16Z hoffmann
101! +qc
102!
103! 1053 2012-11-13 17:11:03Z hoffmann
104! averaging of nr, qr added
105!
106! 1036 2012-10-22 13:43:42Z raasch
107! code put under GPL (PALM 3.9)
108!
109! 978 2012-08-09 08:28:32Z fricke
110! +z0h_av
111!
112! Revision 1.1  2006/02/23 09:48:58  raasch
113! Initial revision
114!
115!
116! Description:
117! ------------
118!> Time-averaging of 3d-data-arrays.
119!------------------------------------------------------------------------------!
120 SUBROUTINE average_3d_data
121 
122
123    USE averaging
124
125#if defined( __chem )
126    USE chemistry_model_mod,                                                   &
127        ONLY:  chem_3d_data_averaging
128#endif
129
130    USE control_parameters,                                                    &
131        ONLY:  air_chemistry, average_count_3d, doav, doav_n, land_surface,    &
132               urban_surface, varnamelength
133
134    USE cpulog,                                                                &
135        ONLY:  cpu_log, log_point
136
137    USE indices,                                                               &
138        ONLY:  nbgp, nxl, nxlg, nxr, nxrg, nyn, nyng, nys, nysg, nzb, nzt
139
140    USE kinds
141
142    USE land_surface_model_mod,                                                &
143        ONLY:  lsm_3d_data_averaging
144
145    USE radiation_model_mod,                                                   &
146        ONLY:  radiation, radiation_3d_data_averaging
147
148    USE turbulence_closure_mod,                                                &
149        ONLY:  tcm_3d_data_averaging
150
151    USE urban_surface_mod,                                                     &
152        ONLY:  usm_average_3d_data
153
154
155
156
157    IMPLICIT NONE
158
159    INTEGER(iwp) ::  i  !< running index
160    INTEGER(iwp) ::  ii !< running index
161    INTEGER(iwp) ::  j  !< running index
162    INTEGER(iwp) ::  k  !< running index
163
164    CHARACTER (LEN=varnamelength) ::  trimvar  !< TRIM of output-variable string
165
166
167    CALL cpu_log (log_point(35),'average_3d_data','start')
168
169!
170!-- Check, if averaging is necessary
171    IF ( average_count_3d <= 1 )  RETURN
172
173!
174!-- Loop of all variables to be averaged.
175    DO  ii = 1, doav_n
176
177!
178!--    Temporary solution to account for data output within the new urban
179!--    surface model (urban_surface_mod.f90), see also SELECT CASE ( trimvar )
180       trimvar = TRIM( doav(ii) )
181       IF ( urban_surface  .AND.  trimvar(1:4) == 'usm_' )  THEN
182          trimvar = 'usm_output'
183       ENDIF
184
185!
186!--    Store the array chosen on the temporary array.
187       SELECT CASE ( trimvar )
188
189          CASE ( 'e' )
190             DO  i = nxlg, nxrg
191                DO  j = nysg, nyng
192                   DO  k = nzb, nzt+1
193                      e_av(k,j,i) = e_av(k,j,i) / REAL( average_count_3d, KIND=wp )
194                   ENDDO
195                ENDDO
196             ENDDO
197
198          CASE ( 'qsws*' )
199             DO  i = nxlg, nxrg
200                DO  j = nysg, nyng
201                   qsws_av(j,i) = qsws_av(j,i) / REAL( average_count_3d, KIND=wp )
202                ENDDO
203             ENDDO
204             CALL exchange_horiz_2d( qsws_av, nbgp )
205
206          CASE ( 'lpt' )
207             DO  i = nxlg, nxrg
208                DO  j = nysg, nyng
209                   DO  k = nzb, nzt+1
210                      lpt_av(k,j,i) = lpt_av(k,j,i) / REAL( average_count_3d, KIND=wp )
211                   ENDDO
212                ENDDO
213             ENDDO
214
215          CASE ( 'lwp*' )
216             DO  i = nxlg, nxrg
217                DO  j = nysg, nyng
218                   lwp_av(j,i) = lwp_av(j,i) / REAL( average_count_3d, KIND=wp )
219                ENDDO
220             ENDDO
221
222          CASE ( 'nc' )
223             DO  i = nxlg, nxrg
224                DO  j = nysg, nyng
225                   DO  k = nzb, nzt+1
226                      nc_av(k,j,i) = nc_av(k,j,i) / REAL( average_count_3d, KIND=wp )
227                   ENDDO
228                ENDDO
229             ENDDO
230
231          CASE ( 'nr' )
232             DO  i = nxlg, nxrg
233                DO  j = nysg, nyng
234                   DO  k = nzb, nzt+1
235                      nr_av(k,j,i) = nr_av(k,j,i) / REAL( average_count_3d, KIND=wp )
236                   ENDDO
237                ENDDO
238             ENDDO
239
240         CASE ( 'ol*' )
241             DO  i = nxlg, nxrg
242                DO  j = nysg, nyng
243                   ol_av(j,i) = ol_av(j,i) / REAL( average_count_3d, KIND=wp )
244                ENDDO
245             ENDDO
246             CALL exchange_horiz_2d( ol_av, nbgp )
247
248          CASE ( 'p' )
249             DO  i = nxlg, nxrg
250                DO  j = nysg, nyng
251                   DO  k = nzb, nzt+1
252                      p_av(k,j,i) = p_av(k,j,i) / REAL( average_count_3d, KIND=wp )
253                   ENDDO
254                ENDDO
255             ENDDO
256
257          CASE ( 'pc' )
258             DO  i = nxl, nxr
259                DO  j = nys, nyn
260                   DO  k = nzb, nzt+1
261                      pc_av(k,j,i) = pc_av(k,j,i) / REAL( average_count_3d, KIND=wp )
262                   ENDDO
263                ENDDO
264             ENDDO
265
266          CASE ( 'pr' )
267             DO  i = nxl, nxr
268                DO  j = nys, nyn
269                   DO  k = nzb, nzt+1
270                      pr_av(k,j,i) = pr_av(k,j,i) / REAL( average_count_3d, KIND=wp )
271                   ENDDO
272                ENDDO
273             ENDDO
274
275          CASE ( 'prr*' )
276             DO  i = nxlg, nxrg
277                DO  j = nysg, nyng
278                   precipitation_rate_av(j,i) = precipitation_rate_av(j,i) /   &
279                                                REAL( average_count_3d, KIND=wp )
280                ENDDO
281             ENDDO
282
283          CASE ( 'pt' )
284             DO  i = nxlg, nxrg
285                DO  j = nysg, nyng
286                   DO  k = nzb, nzt+1
287                      pt_av(k,j,i) = pt_av(k,j,i) / REAL( average_count_3d, KIND=wp )
288                   ENDDO
289                ENDDO
290             ENDDO
291
292          CASE ( 'q' )
293             DO  i = nxlg, nxrg
294                DO  j = nysg, nyng
295                   DO  k = nzb, nzt+1
296                      q_av(k,j,i) = q_av(k,j,i) / REAL( average_count_3d, KIND=wp )
297                   ENDDO
298                ENDDO
299             ENDDO
300
301          CASE ( 'qc' )
302             DO  i = nxlg, nxrg
303                DO  j = nysg, nyng
304                   DO  k = nzb, nzt+1
305                      qc_av(k,j,i) = qc_av(k,j,i) / REAL( average_count_3d, KIND=wp )
306                   ENDDO
307                ENDDO
308             ENDDO
309
310          CASE ( 'ql' )
311             DO  i = nxlg, nxrg
312                DO  j = nysg, nyng
313                   DO  k = nzb, nzt+1
314                      ql_av(k,j,i) = ql_av(k,j,i) / REAL( average_count_3d, KIND=wp )
315                   ENDDO
316                ENDDO
317             ENDDO
318
319          CASE ( 'ql_c' )
320             DO  i = nxlg, nxrg
321                DO  j = nysg, nyng
322                   DO  k = nzb, nzt+1
323                      ql_c_av(k,j,i) = ql_c_av(k,j,i) / REAL( average_count_3d, KIND=wp )
324                   ENDDO
325                ENDDO
326             ENDDO
327
328          CASE ( 'ql_v' )
329             DO  i = nxlg, nxrg
330                DO  j = nysg, nyng
331                   DO  k = nzb, nzt+1
332                      ql_v_av(k,j,i) = ql_v_av(k,j,i) / REAL( average_count_3d, KIND=wp )
333                   ENDDO
334                ENDDO
335             ENDDO
336
337          CASE ( 'ql_vp' )
338             DO  i = nxlg, nxrg
339                DO  j = nysg, nyng
340                   DO  k = nzb, nzt+1
341                      ql_vp_av(k,j,i) = ql_vp_av(k,j,i) /                      &
342                                        REAL( average_count_3d, KIND=wp )
343                   ENDDO
344                ENDDO
345             ENDDO
346
347          CASE ( 'qr' )
348             DO  i = nxlg, nxrg
349                DO  j = nysg, nyng
350                   DO  k = nzb, nzt+1
351                      qr_av(k,j,i) = qr_av(k,j,i) / REAL( average_count_3d, KIND=wp )
352                   ENDDO
353                ENDDO
354             ENDDO
355
356          CASE ( 'qv' )
357             DO  i = nxlg, nxrg
358                DO  j = nysg, nyng
359                   DO  k = nzb, nzt+1
360                      qv_av(k,j,i) = qv_av(k,j,i) / REAL( average_count_3d, KIND=wp )
361                   ENDDO
362                ENDDO
363             ENDDO
364
365         CASE ( 'r_a*' )
366             DO  i = nxlg, nxrg
367                DO  j = nysg, nyng
368                   r_a_av(j,i) = r_a_av(j,i) / REAL( average_count_3d, KIND=wp )
369                ENDDO
370             ENDDO
371             CALL exchange_horiz_2d( r_a_av, nbgp )
372
373          CASE ( 'rho_ocean' )
374             DO  i = nxlg, nxrg
375                DO  j = nysg, nyng
376                   DO  k = nzb, nzt+1
377                      rho_ocean_av(k,j,i) = rho_ocean_av(k,j,i) / REAL( average_count_3d, KIND=wp )
378                   ENDDO
379                ENDDO
380             ENDDO
381
382          CASE ( 's' )
383             DO  i = nxlg, nxrg
384                DO  j = nysg, nyng
385                   DO  k = nzb, nzt+1
386                      s_av(k,j,i) = s_av(k,j,i) / REAL( average_count_3d, KIND=wp )
387                   ENDDO
388                ENDDO
389             ENDDO
390
391          CASE ( 'sa' )
392             DO  i = nxlg, nxrg
393                DO  j = nysg, nyng
394                   DO  k = nzb, nzt+1
395                      sa_av(k,j,i) = sa_av(k,j,i) / REAL( average_count_3d, KIND=wp )
396                   ENDDO
397                ENDDO
398             ENDDO
399
400         CASE ( 'shf*' )
401             DO  i = nxlg, nxrg
402                DO  j = nysg, nyng
403                   shf_av(j,i) = shf_av(j,i) / REAL( average_count_3d, KIND=wp )
404                ENDDO
405             ENDDO
406             CALL exchange_horiz_2d( shf_av, nbgp )
407
408          CASE ( 'ssws*' )
409             DO  i = nxlg, nxrg
410                DO  j = nysg, nyng
411                   ssws_av(j,i) = ssws_av(j,i) / REAL( average_count_3d, KIND=wp )
412                ENDDO
413             ENDDO
414             CALL exchange_horiz_2d( ssws_av, nbgp )
415
416          CASE ( 't*' )
417             DO  i = nxlg, nxrg
418                DO  j = nysg, nyng
419                   ts_av(j,i) = ts_av(j,i) / REAL( average_count_3d, KIND=wp )
420                ENDDO
421             ENDDO
422             CALL exchange_horiz_2d( ts_av, nbgp )
423
424          CASE ( 'u' )
425             DO  i = nxlg, nxrg
426                DO  j = nysg, nyng
427                   DO  k = nzb, nzt+1
428                      u_av(k,j,i) = u_av(k,j,i) / REAL( average_count_3d, KIND=wp )
429                   ENDDO
430                ENDDO
431             ENDDO
432
433          CASE ( 'u*' )
434             DO  i = nxlg, nxrg
435                DO  j = nysg, nyng
436                   us_av(j,i) = us_av(j,i) / REAL( average_count_3d, KIND=wp )
437                ENDDO
438             ENDDO
439             CALL exchange_horiz_2d( us_av, nbgp )
440
441          CASE ( 'v' )
442             DO  i = nxlg, nxrg
443                DO  j = nysg, nyng
444                   DO  k = nzb, nzt+1
445                      v_av(k,j,i) = v_av(k,j,i) / REAL( average_count_3d, KIND=wp )
446                   ENDDO
447                ENDDO
448             ENDDO
449
450          CASE ( 'vpt' )
451             DO  i = nxlg, nxrg
452                DO  j = nysg, nyng
453                   DO  k = nzb, nzt+1
454                      vpt_av(k,j,i) = vpt_av(k,j,i) / REAL( average_count_3d, KIND=wp )
455                   ENDDO
456                ENDDO
457             ENDDO
458
459          CASE ( 'w' )
460             DO  i = nxlg, nxrg
461                DO  j = nysg, nyng
462                   DO  k = nzb, nzt+1
463                      w_av(k,j,i) = w_av(k,j,i) / REAL( average_count_3d, KIND=wp )
464                   ENDDO
465                ENDDO
466             ENDDO
467
468          CASE ( 'z0*' )
469             DO  i = nxlg, nxrg
470                DO  j = nysg, nyng
471                   z0_av(j,i) = z0_av(j,i) / REAL( average_count_3d, KIND=wp )
472                ENDDO
473             ENDDO
474             CALL exchange_horiz_2d( z0_av, nbgp )
475
476          CASE ( 'z0h*' )
477             DO  i = nxlg, nxrg
478                DO  j = nysg, nyng
479                   z0h_av(j,i) = z0h_av(j,i) / REAL( average_count_3d, KIND=wp )
480                ENDDO
481             ENDDO
482             CALL exchange_horiz_2d( z0h_av, nbgp )
483!             
484!--       Block of urban surface model outputs   
485          CASE ( 'usm_output' )
486             CALL usm_average_3d_data( 'average', doav(ii) )
487
488          CASE DEFAULT
489!
490!--          Turbulence closure module
491             CALL tcm_3d_data_averaging( 'average', doav(ii) )
492
493!
494!--          Land surface quantity
495             IF ( land_surface )  THEN
496                CALL lsm_3d_data_averaging( 'average', doav(ii) )
497             ENDIF
498!
499!--          Radiation quantity
500             IF ( radiation )  THEN
501                CALL radiation_3d_data_averaging( 'average', doav(ii) )
502             ENDIF
503!
504!--          Chemistry quantity
505#if defined( __chem )
506             IF ( air_chemistry )  THEN
507                CALL chem_3d_data_averaging( 'average', doav(ii) )
508             ENDIF
509#endif
510!
511!--          User-defined quantity
512             CALL user_3d_data_averaging( 'average', doav(ii) )
513
514       END SELECT
515
516    ENDDO
517
518!
519!-- Reset the counter
520    average_count_3d = 0.0
521
522    CALL cpu_log( log_point(35), 'average_3d_data', 'stop' )
523
524
525 END SUBROUTINE average_3d_data
Note: See TracBrowser for help on using the repository browser.