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

Last change on this file since 2188 was 2101, checked in by suehring, 8 years ago

last commit documented

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