MODULE calc_mean_profile_mod !--------------------------------------------------------------------------------! ! 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 1366 2014-04-22 15:06:33Z boeske $ ! ! 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)). !------------------------------------------------------------------------------! PRIVATE PUBLIC calc_mean_profile INTERFACE calc_mean_profile MODULE PROCEDURE calc_mean_profile END INTERFACE calc_mean_profile CONTAINS 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 hom(:,1,pr,0) = sums(:,pr) / ngp_2dh_s_inner(:,0) ENDIF END SUBROUTINE calc_mean_profile END MODULE calc_mean_profile_mod