Changeset 667 for palm/trunk/SOURCE/flow_statistics.f90
- Timestamp:
- Dec 23, 2010 12:06:00 PM (13 years ago)
- Location:
- palm/trunk/SOURCE
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
/palm/branches/suehring 423-666 /palm/branches/letzel/masked_output/SOURCE 296-409
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
-
palm/trunk/SOURCE/flow_statistics.f90
r625 r667 4 4 ! Current revisions: 5 5 ! ----------------- 6 ! 6 ! When advection is computed with ws-scheme, turbulent fluxes are already 7 ! computed in the respective advection routines and buffered in arrays 8 ! sums_xx_ws_l(). This is due to a consistent treatment of statistics with the 9 ! numerics and to avoid unphysical kinks near the surface. 10 ! So some if requests has to be done to dicern between fluxes from ws-scheme 11 ! other advection schemes. 12 ! Furthermore the computation of z_i is only done if the heat flux exceeds a 13 ! minimum value. This affects only simulations of a neutral boundary layer and 14 ! is due to reasons of computations in the advection scheme. 15 ! 7 16 ! 8 17 ! Former revisions: … … 102 111 REAL :: sums_ll(nzb:nzt+1,2) 103 112 104 105 113 CALL cpu_log( log_point(10), 'flow_statistics', 'start' ) 106 114 … … 133 141 sums_l(nzb+10,pr_palm,0) = sums_divnew_l(sr) ! new divergence from pres 134 142 143 ! 144 !-- Copy the turbulent quantities, evaluated in the advection routines to 145 !-- the local array sums_l() for further computations 146 IF ( ws_scheme_mom ) THEN 147 ! 148 !-- Boundary condition for u'u' and v'v', because below the surface no 149 !-- computation for these quantities is done. 150 DO i = nxl, nxr 151 DO j = nys, nyn 152 sums_us2_ws_l(nzb_u_inner(j,i),sr) = & 153 sums_us2_ws_l(nzb_u_inner(j,i)+1,sr) 154 sums_vs2_ws_l(nzb_v_inner(j,i),sr) = & 155 sums_vs2_ws_l(nzb_v_inner(j,i)+1,sr) 156 ENDDO 157 ENDDO 158 ! 159 !-- Swap the turbulent quantities evaluated in advec_ws. 160 sums_l(:,13,0) = sums_wsus_ws_l(:,sr) ! w*u* 161 sums_l(:,15,0) = sums_wsvs_ws_l(:,sr) ! w*v* 162 sums_l(:,30,0) = sums_us2_ws_l(:,sr) ! u*2 163 sums_l(:,31,0) = sums_vs2_ws_l(:,sr) ! v*2 164 sums_l(:,32,0) = sums_ws2_ws_l(:,sr) ! w*2 165 sums_l(:,34,0) = sums_l(:,34,0) + 0.5 * & 166 (sums_us2_ws_l(:,sr) + sums_vs2_ws_l(:,sr) & 167 + sums_ws2_ws_l(:,sr)) ! e* 168 DO k = nzb, nzt 169 sums_l(nzb+5,pr_palm,0) = sums_l(nzb+5,pr_palm,0) + 0.5 * ( & 170 sums_us2_ws_l(k,sr) + sums_vs2_ws_l(k,sr) + & 171 sums_ws2_ws_l(k,sr)) 172 ENDDO 173 ENDIF 174 IF ( ws_scheme_sca ) THEN 175 sums_l(:,17,0) = sums_wspts_ws_l(:,sr) ! w*pts* from advec_s_ws 176 IF ( ocean ) sums_l(:,66,0) = sums_wssas_ws_l(:,sr) ! w*sa* 177 IF ( humidity .OR. passive_scalar ) sums_l(:,49,0) = & 178 sums_wsqs_ws_l(:,sr) !w*q* 179 ENDIF 135 180 ! 136 181 !-- Horizontally averaged profiles of horizontal velocities and temperature. … … 138 183 !-- for other horizontal averages. 139 184 tn = 0 185 140 186 !$OMP PARALLEL PRIVATE( i, j, k, tn ) 141 187 #if defined( __intel_openmp_bug ) … … 215 261 ENDIF 216 262 !$OMP END PARALLEL 217 218 263 ! 219 264 !-- Summation of thread sums … … 304 349 hom(:,1,2,sr) = sums(:,2) ! v 305 350 hom(:,1,4,sr) = sums(:,4) ! pt 351 306 352 307 353 ! … … 354 400 DO j = nys, nyn 355 401 sums_l_etot = 0.0 356 sums_l_eper = 0.0357 402 DO k = nzb_s_inner(j,i), nzt+1 358 u2 = u(k,j,i)**2359 v2 = v(k,j,i)**2360 w2 = w(k,j,i)**2361 ust2 = ( u(k,j,i) - hom(k,1,1,sr) )**2362 vst2 = ( v(k,j,i) - hom(k,1,2,sr) )**2363 403 ! 364 404 !-- Prognostic and diagnostic variables … … 369 409 sums_l(k,40,tn) = sums_l(k,40,tn) + p(k,j,i) 370 410 371 !372 !-- Variances373 sums_l(k,30,tn) = sums_l(k,30,tn) + ust2 * rmask(j,i,sr)374 sums_l(k,31,tn) = sums_l(k,31,tn) + vst2 * rmask(j,i,sr)375 sums_l(k,32,tn) = sums_l(k,32,tn) + w2 * rmask(j,i,sr)376 411 sums_l(k,33,tn) = sums_l(k,33,tn) + & 377 412 ( pt(k,j,i)-hom(k,1,4,sr) )**2 * rmask(j,i,sr) … … 381 416 ( q(k,j,i)-hom(k,1,41,sr) )**2 * rmask(j,i,sr) 382 417 ENDIF 383 ! 384 !-- Higher moments 385 !-- (Computation of the skewness of w further below) 386 sums_l(k,38,tn) = sums_l(k,38,tn) + w(k,j,i) * w2 * & 387 rmask(j,i,sr) 388 ! 389 !-- Perturbation energy 390 sums_l(k,34,tn) = sums_l(k,34,tn) + 0.5 * ( ust2 + vst2 + w2 ) & 391 * rmask(j,i,sr) 418 392 419 sums_l_etot = sums_l_etot + & 393 0.5 * ( u2 + v2 + w2 ) * rmask(j,i,sr) 394 sums_l_eper = sums_l_eper + & 395 0.5 * ( ust2+vst2+w2 ) * rmask(j,i,sr) 420 0.5 * ( u(k,j,i)**2 + v(k,j,i)**2 + & 421 w(k,j,i)**2 ) * rmask(j,i,sr) 396 422 ENDDO 397 423 ! … … 401 427 !-- allow vectorization of that loop. 402 428 sums_l(nzb+4,pr_palm,tn) = sums_l(nzb+4,pr_palm,tn) + sums_l_etot 403 sums_l(nzb+5,pr_palm,tn) = sums_l(nzb+5,pr_palm,tn) + sums_l_eper404 429 ! 405 430 !-- 2D-arrays (being collected in the last column of sums_l) … … 420 445 421 446 ! 447 !-- Computation of statistics when ws-scheme is not used. Else these 448 !-- quantities are evaluated in the advection routines. 449 IF ( .NOT. ws_scheme_mom ) THEN 450 !$OMP DO 451 DO i = nxl, nxr 452 DO j = nys, nyn 453 sums_l_eper = 0.0 454 DO k = nzb_s_inner(j,i), nzt+1 455 u2 = u(k,j,i)**2 456 v2 = v(k,j,i)**2 457 w2 = w(k,j,i)**2 458 ust2 = ( u(k,j,i) - hom(k,1,1,sr) )**2 459 vst2 = ( v(k,j,i) - hom(k,1,2,sr) )**2 460 461 sums_l(k,30,tn) = sums_l(k,30,tn) + ust2 * rmask(j,i,sr) 462 sums_l(k,31,tn) = sums_l(k,31,tn) + vst2 * rmask(j,i,sr) 463 sums_l(k,32,tn) = sums_l(k,32,tn) + w2 * rmask(j,i,sr) 464 ! 465 !-- Higher moments 466 !-- (Computation of the skewness of w further below) 467 sums_l(k,38,tn) = sums_l(k,38,tn) + w(k,j,i) * w2 * & 468 rmask(j,i,sr) 469 ! 470 !-- Perturbation energy 471 472 sums_l(k,34,tn) = sums_l(k,34,tn) + 0.5 * & 473 ( ust2 + vst2 + w2 ) * rmask(j,i,sr) 474 sums_l_eper = sums_l_eper + & 475 0.5 * ( ust2+vst2+w2 ) * rmask(j,i,sr) 476 477 ENDDO 478 sums_l(nzb+5,pr_palm,tn) = sums_l(nzb+5,pr_palm,tn) & 479 + sums_l_eper 480 ENDDO 481 ENDDO 482 ELSE 483 !$OMP DO 484 DO i = nxl, nxr 485 DO j = nys, nyn 486 DO k = nzb_s_inner(j,i), nzt + 1 487 w2 = w(k,j,i)**2 488 ! 489 !-- Higher moments 490 !-- (Computation of the skewness of w further below) 491 sums_l(k,38,tn) = sums_l(k,38,tn) + w(k,j,i) * w2 * & 492 rmask(j,i,sr) 493 ENDDO 494 ENDDO 495 ENDDO 496 ENDIF 497 498 ! 422 499 !-- Horizontally averaged profiles of the vertical fluxes 500 423 501 !$OMP DO 424 502 DO i = nxl, nxr … … 587 665 pts = 0.5 * ( pt(k,j,i) - hom(k,1,4,sr) + & 588 666 pt(k+1,j,i) - hom(k+1,1,4,sr) ) 589 ! 590 !-- Momentum flux w*u* 591 sums_l(k,13,tn) = sums_l(k,13,tn) + 0.5 * & 592 ( w(k,j,i-1) + w(k,j,i) ) & 593 * ust * rmask(j,i,sr) 594 ! 595 !-- Momentum flux w*v* 596 sums_l(k,15,tn) = sums_l(k,15,tn) + 0.5 * & 597 ( w(k,j-1,i) + w(k,j,i) ) & 598 * vst * rmask(j,i,sr) 599 ! 600 !-- Heat flux w*pt* 601 !-- The following formula (comment line, not executed) does not 602 !-- work if applied to subregions 603 ! sums_l(k,17,tn) = sums_l(k,17,tn) + 0.5 * & 604 ! ( pt(k,j,i)+pt(k+1,j,i) ) & 605 ! * w(k,j,i) * rmask(j,i,sr) 606 sums_l(k,17,tn) = sums_l(k,17,tn) + pts * w(k,j,i) * & 607 rmask(j,i,sr) 608 ! 667 609 668 !-- Higher moments 610 669 sums_l(k,35,tn) = sums_l(k,35,tn) + pts * w(k,j,i)**2 * & … … 617 676 !-- but so far there is no other suitable place to calculate) 618 677 IF ( ocean ) THEN 619 pts = 0.5 * ( sa(k,j,i) - hom(k,1,23,sr) + & 678 IF( .NOT. ws_scheme_sca ) THEN 679 pts = 0.5 * ( sa(k,j,i) - hom(k,1,23,sr) + & 620 680 sa(k+1,j,i) - hom(k+1,1,23,sr) ) 621 sums_l(k,66,tn) = sums_l(k,66,tn) + pts * w(k,j,i) * &681 sums_l(k,66,tn) = sums_l(k,66,tn) + pts * w(k,j,i) * & 622 682 rmask(j,i,sr) 683 ENDIF 623 684 sums_l(k,64,tn) = sums_l(k,64,tn) + rho(k,j,i) * & 624 685 rmask(j,i,sr) … … 635 696 sums_l(k,46,tn) = sums_l(k,46,tn) + pts * w(k,j,i) * & 636 697 rmask(j,i,sr) 637 pts = 0.5 * ( q(k,j,i) - hom(k,1,41,sr) + & 638 q(k+1,j,i) - hom(k+1,1,41,sr) ) 639 sums_l(k,49,tn) = sums_l(k,49,tn) + pts * w(k,j,i) * & 640 rmask(j,i,sr) 698 641 699 IF ( cloud_physics .OR. cloud_droplets ) THEN 642 700 pts = 0.5 * & … … 652 710 ! 653 711 !-- Passive scalar flux 654 IF ( passive_scalar ) THEN712 IF ( passive_scalar .AND. ( .NOT. ws_scheme_sca )) THEN 655 713 pts = 0.5 * ( q(k,j,i) - hom(k,1,41,sr) + & 656 714 q(k+1,j,i) - hom(k+1,1,41,sr) ) … … 661 719 ! 662 720 !-- Energy flux w*e* 663 sums_l(k,37,tn) = sums_l(k,37,tn) + w(k,j,i) * 0.5 * & 664 ( ust**2 + vst**2 + w(k,j,i)**2 )&665 * rmask(j,i,sr)666 721 !-- has to be adjusted 722 sums_l(k,37,tn) = sums_l(k,37,tn) + w(k,j,i) * 0.5 * & 723 ( ust**2 + vst**2 + w(k,j,i)**2 )& 724 * rmask(j,i,sr) 667 725 ENDDO 668 726 ENDDO 669 727 ENDDO 728 !- for reasons of speed optimization the loop is splitted, to avoid if-else 729 !- statements inside the loop 730 !- Fluxes which have been computed in part directly inside the advection routines 731 !- treated seperatly. 732 !- First treat the momentum fluxes 733 IF ( .NOT. ws_scheme_mom ) THEN 734 !$OMP DO 735 DO i = nxl, nxr 736 DO j = nys, nyn 737 DO k = nzb_diff_s_inner(j,i)-1, nzt_diff 738 ust = 0.5 * ( u(k,j,i) - hom(k,1,1,sr) + & 739 u(k+1,j,i) - hom(k+1,1,1,sr) ) 740 vst = 0.5 * ( v(k,j,i) - hom(k,1,2,sr) + & 741 v(k+1,j,i) - hom(k+1,1,2,sr) ) 742 ! 743 !-- Momentum flux w*u* 744 sums_l(k,13,tn) = sums_l(k,13,tn) + 0.5 * & 745 ( w(k,j,i-1) + w(k,j,i) ) & 746 * ust * rmask(j,i,sr) 747 ! 748 !-- Momentum flux w*v* 749 sums_l(k,15,tn) = sums_l(k,15,tn) + 0.5 * & 750 ( w(k,j-1,i) + w(k,j,i) ) & 751 * vst * rmask(j,i,sr) 752 ENDDO 753 ENDDO 754 ENDDO 755 756 ENDIF 757 IF ( .NOT. ws_scheme_sca ) THEN 758 !$OMP DO 759 DO i = nxl, nxr 760 DO j = nys, nyn 761 DO k = nzb_diff_s_inner(j,i) - 1, nzt_diff 762 !- vertical heat flux 763 sums_l(k,17,tn) = sums_l(k,17,tn) + 0.5 * & 764 ( pt(k,j,i) - hom(k,1,4,sr) + & 765 pt(k+1,j,i) - hom(k+1,1,4,sr) ) & 766 * w(k,j,i) * rmask(j,i,sr) 767 IF ( humidity ) THEN 768 pts = 0.5 * ( q(k,j,i) - hom(k,1,41,sr) + & 769 q(k+1,j,i) - hom(k+1,1,41,sr) ) 770 sums_l(k,49,tn) = sums_l(k,49,tn) + pts * w(k,j,i) * & 771 rmask(j,i,sr) 772 ENDIF 773 ENDDO 774 ENDDO 775 ENDDO 776 777 ENDIF 778 670 779 671 780 ! … … 814 923 815 924 #if defined( __parallel ) 925 816 926 ! 817 927 !-- Compute total sum from local sums … … 843 953 sums(k,70:pr_palm-2) = sums(k,70:pr_palm-2)/ ngp_2dh_s_inner(k,sr) 844 954 ENDDO 955 845 956 !-- Upstream-parts 846 957 sums(nzb:nzb+11,pr_palm-1) = sums(nzb:nzb+11,pr_palm-1) / ngp_3d(sr) … … 868 979 ENDDO 869 980 ENDIF 870 871 981 ! 872 982 !-- Collect horizontal average in hom. … … 934 1044 ! upstream-parts u_x, u_y, u_z, v_x, 935 1045 ! v_y, usw. (in last but one profile) 936 hom(:,1,pr_palm,sr) = sums(:,pr_palm) 1046 hom(:,1,pr_palm,sr) = sums(:,pr_palm) 937 1047 ! u*, w'u', w'v', t* (in last profile) 938 1048 … … 951 1061 z_i(1) = 0.0 952 1062 first = .TRUE. 1063 953 1064 IF ( ocean ) THEN 954 1065 DO k = nzt, nzb+1, -1 955 IF ( first .AND. hom(k,1,18,sr) < 0.0 ) THEN 1066 IF ( first .AND. hom(k,1,18,sr) < 0.0 & 1067 .AND. abs(hom(k,1,18,sr)) > 1.0E-8) THEN 956 1068 first = .FALSE. 957 1069 height = zw(k) 958 1070 ENDIF 959 1071 IF ( hom(k,1,18,sr) < 0.0 .AND. & 1072 abs(hom(k,1,18,sr)) > 1.0E-8 .AND. & 960 1073 hom(k-1,1,18,sr) > hom(k,1,18,sr) ) THEN 961 1074 IF ( zw(k) < 1.5 * height ) THEN … … 969 1082 ELSE 970 1083 DO k = nzb, nzt-1 971 IF ( first .AND. hom(k,1,18,sr) < 0.0 ) THEN 1084 IF ( first .AND. hom(k,1,18,sr) < 0.0 & 1085 .AND. abs(hom(k,1,18,sr)) > 1.0E-8 ) THEN 972 1086 first = .FALSE. 973 1087 height = zw(k) 974 1088 ENDIF 975 IF ( hom(k,1,18,sr) < 0.0 .AND. & 1089 IF ( hom(k,1,18,sr) < 0.0 .AND. & 1090 abs(hom(k,1,18,sr)) > 1.0E-8 .AND. & 976 1091 hom(k+1,1,18,sr) > hom(k,1,18,sr) ) THEN 977 1092 IF ( zw(k) < 1.5 * height ) THEN … … 1026 1141 !-- the characteristic convective boundary layer temperature. 1027 1142 !-- The horizontal average at nzb+1 is input for the average temperature. 1028 IF ( hom(nzb,1,18,sr) > 0.0 .AND. z_i(1) /= 0.0 ) THEN 1143 IF ( hom(nzb,1,18,sr) > 0.0 .AND. abs(hom(nzb,1,18,sr)) > 1.0E-8 & 1144 .AND. z_i(1) /= 0.0 ) THEN 1029 1145 hom(nzb+8,1,pr_palm,sr) = ( g / hom(nzb+1,1,4,sr) * & 1030 1146 hom(nzb,1,18,sr) * &
Note: See TracChangeset
for help on using the changeset viewer.