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

Last change on this file since 2016 was 2012, checked in by kanani, 8 years ago

last commit documented

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