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

Last change on this file since 2232 was 2232, checked in by suehring, 7 years ago

Adjustments according new topography and surface-modelling concept implemented

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