!> @file calc_mean_profile.f90 !--------------------------------------------------------------------------------! ! This file is part of PALM. ! ! PALM is free software: you can redistribute it and/or modify it under the terms ! of the GNU General Public License as published by the Free Software Foundation, ! either version 3 of the License, or (at your option) any later version. ! ! PALM is distributed in the hope that it will be useful, but WITHOUT ANY ! WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR ! A PARTICULAR PURPOSE. See the GNU General Public License for more details. ! ! You should have received a copy of the GNU General Public License along with ! PALM. If not, see . ! ! Copyright 1997-2014 Leibniz Universitaet Hannover !--------------------------------------------------------------------------------! ! ! Current revisions: ! ----------------- ! ! ! Former revisions: ! ----------------- ! $Id: calc_mean_profile.f90 1739 2015-12-18 14:16:53Z knoop $ ! ! 1738 2015-12-18 13:56:05Z raasch ! bugfix: if a layer is completely filled with topography, no mean is calculated ! ! 1682 2015-10-07 23:56:08Z knoop ! Code annotations made doxygen readable ! ! 1365 2014-04-22 15:03:56Z boeske ! Initial revision ! ! Description: ! ------------ !> Calculate the horizontally averaged vertical temperature profile (pr=4 in case !> of potential temperature, 44 in case of virtual potential temperature, and 64 !> in case of density (ocean runs)). !------------------------------------------------------------------------------! MODULE calc_mean_profile_mod PRIVATE PUBLIC calc_mean_profile INTERFACE calc_mean_profile MODULE PROCEDURE calc_mean_profile END INTERFACE calc_mean_profile CONTAINS !------------------------------------------------------------------------------! ! Description: ! ------------ !> @todo Missing subroutine description. !------------------------------------------------------------------------------! SUBROUTINE calc_mean_profile( var, pr ) USE control_parameters, & ONLY: intermediate_timestep_count, message_string USE indices, & ONLY: ngp_2dh_s_inner, nxl, nxr, nyn, nys, nzb, nzb_s_inner, nzt USE kinds USE pegrid USE statistics, & ONLY: flow_statistics_called, hom, sums, sums_l IMPLICIT NONE INTEGER(iwp) :: i !< INTEGER(iwp) :: j !< INTEGER(iwp) :: k !< INTEGER(iwp) :: pr !< INTEGER(iwp) :: omp_get_thread_num !< INTEGER(iwp) :: tn !< #if defined( __nopointer ) REAL(wp), DIMENSION(:,:,:) :: var !< #else REAL(wp), DIMENSION(:,:,:), POINTER :: var #endif ! !-- Computation of the horizontally averaged profile of variable var, unless !-- already done by the relevant call from flow_statistics. The calculation !-- is done only for the first respective intermediate timestep in order to !-- spare communication time and to produce identical model results with jobs !-- which are calling flow_statistics at different time intervals. IF ( .NOT. flow_statistics_called .AND. & intermediate_timestep_count == 1 ) THEN ! !-- Horizontal average of variable var tn = 0 ! Default thread number in case of one thread !$OMP PARALLEL PRIVATE( i, j, k, tn ) !$ tn = omp_get_thread_num() sums_l(:,pr,tn) = 0.0_wp !$OMP DO DO i = nxl, nxr DO j = nys, nyn DO k = nzb_s_inner(j,i), nzt+1 sums_l(k,pr,tn) = sums_l(k,pr,tn) + var(k,j,i) ENDDO ENDDO ENDDO !$OMP END PARALLEL DO i = 1, threads_per_task-1 sums_l(:,pr,0) = sums_l(:,pr,0) + sums_l(:,pr,i) ENDDO #if defined( __parallel ) IF ( collective_wait ) CALL MPI_BARRIER( comm2d, ierr ) CALL MPI_ALLREDUCE( sums_l(nzb,pr,0), sums(nzb,pr), nzt+2-nzb, & MPI_REAL, MPI_SUM, comm2d, ierr ) #else sums(:,pr) = sums_l(:,pr,0) #endif DO k = nzb, nzt+1 IF ( ngp_2dh_s_inner(k,0) /= 0 ) THEN hom(k,1,pr,0) = sums(k,pr) / ngp_2dh_s_inner(k,0) ENDIF ENDDO ENDIF END SUBROUTINE calc_mean_profile END MODULE calc_mean_profile_mod