LCOV - code coverage report
Current view: top level - physics/clubb/src/CLUBB_core - sigma_sqd_w_module.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 18 18 100.0 %
Date: 2024-12-17 17:57:11 Functions: 1 1 100.0 %

          Line data    Source code
       1             : !-------------------------------------------------------------------------
       2             : ! $Id$
       3             : !===============================================================================
       4             : module sigma_sqd_w_module
       5             : 
       6             :   implicit none
       7             : 
       8             :   public :: compute_sigma_sqd_w
       9             : 
      10             :   private ! Default scope
      11             : 
      12             :   contains
      13             : 
      14             :   !=============================================================================
      15    17870112 :   subroutine compute_sigma_sqd_w( nz, ngrdcol, &
      16    17870112 :                                   gamma_Skw_fnc, wp2, thlp2, rtp2, &
      17    17870112 :                                   up2, vp2, wpthlp, wprtp, upwp, vpwp, &
      18             :                                   l_predict_upwp_vpwp, &
      19    17870112 :                                   sigma_sqd_w )
      20             : 
      21             :     ! Description:
      22             :     ! Compute the variable sigma_sqd_w (PDF width parameter).
      23             :     !
      24             :     ! The value of sigma_sqd_w is restricted in the ADG1 PDF in order to keep
      25             :     ! the marginal PDFs of all responder variables (variables that do not set
      26             :     ! the mixture fraction) valid.  The limits on sigma_sqd_w in order to keep
      27             :     ! the PDF of a responder variable, x, valid are:
      28             :     !
      29             :     ! 0 <= sigma_sqd_w <= 1 - <w'x'>^2 / ( <w'^2> * <x'^2> ).
      30             :     !
      31             :     ! The overall limits on sigma_sqd_w must be applied based on the most
      32             :     ! restrictive case so that all Double Gaussian PDF responder variables, x,
      33             :     ! have realizable PDFs.  The overall limits on sigma_sqd_w are:
      34             :     !
      35             :     ! 0 <= sigma_sqd_w <= 1 - max( <w'x'>^2 / ( <w'^2> * <x'^2> ), for all x).
      36             :     !
      37             :     ! The equation used for sigma_sqd_w is:
      38             :     !
      39             :     ! sigma_sqd_w = gamma_Skw_fnc
      40             :     !               * ( 1 - max( <w'x'>^2 / ( <w'^2> * <x'^2> ), for all x) );
      41             :     !
      42             :     ! where 0 <= gamma_Skw_fnc <= 1.
      43             : 
      44             :     ! References:
      45             :     !   Eqn 22 in ``Equations for CLUBB''
      46             :     !-----------------------------------------------------------------------
      47             : 
      48             :     use constants_clubb, only: &
      49             :         one,         & ! Constant(s)
      50             :         w_tol,       &
      51             :         rt_tol,      &
      52             :         thl_tol,     &
      53             :         one_hundred, &
      54             :         w_tol_sqd
      55             : 
      56             :     use clubb_precision, only: &
      57             :         core_rknd ! Variable(s)
      58             : 
      59             :     implicit none
      60             : 
      61             :     ! Input Variables
      62             :     integer, intent(in) :: &
      63             :       nz, &
      64             :       ngrdcol
      65             :     
      66             :     real( kind = core_rknd ), dimension(ngrdcol,nz), intent(in) :: &
      67             :       gamma_Skw_fnc, & ! Gamma as a function of skewness             [-]
      68             :       wp2,           & ! Variance of vertical velocity               [m^2/s^2]
      69             :       thlp2,         & ! Variance of liquid water potential temp.    [K^2]
      70             :       rtp2,          & ! Variance of total water mixing ratio        [kg^2/kg^2]
      71             :       up2,           & ! Variance of west-east horizontal velocity   [m^2/s^2]
      72             :       vp2,           & ! Variance of south-north horizontal velocity [m^2/s^2]
      73             :       wpthlp,        & ! Flux of liquid water potential temp.        [m/s K]
      74             :       wprtp,         & ! Flux of total water mixing ratio            [m/s kg/kg]
      75             :       upwp,          & ! Flux of west-east horizontal velocity       [m^2/s^2]
      76             :       vpwp             ! Flux of south-north horizontal velocity     [m^2/s^2]
      77             : 
      78             :     logical, intent(in) :: &
      79             :       l_predict_upwp_vpwp ! Flag to predict <u'w'> and <v'w'> along with <u> and <v> alongside the
      80             :                           ! advancement of <rt>, <w'rt'>, <thl>, <wpthlp>, <sclr>, and <w'sclr'> in
      81             :                           ! subroutine advance_xm_wpxp.  Otherwise, <u'w'> and <v'w'> are still
      82             :                           ! approximated by eddy diffusivity when <u> and <v> are advanced in
      83             :                           ! subroutine advance_windm_edsclrm.
      84             : 
      85             :     ! Output Variable
      86             :     real( kind = core_rknd ), dimension(ngrdcol,nz), intent(out) :: &
      87             :       sigma_sqd_w ! PDF width parameter      [-]
      88             : 
      89             :     ! Local Variable
      90             :     real( kind = core_rknd ), dimension(ngrdcol,nz) :: &
      91    35740224 :       max_corr_w_x_sqd    ! Max. val. of wpxp^2/(wp2*xp2) for all vars. x  [-]
      92             : 
      93             :     integer :: i, k
      94             : 
      95             :     ! ---- Begin Code ----
      96             : 
      97             :     !$acc enter data create( max_corr_w_x_sqd )
      98             : 
      99             :     !----------------------------------------------------------------
     100             :     ! Compute sigma_sqd_w with new formula from Vince
     101             :     !----------------------------------------------------------------
     102             : 
     103             :     ! Find the maximum value of <w'x'>^2 / ( <w'^2> * <x'^2> ) for all
     104             :     ! variables x that are Double Gaussian PDF responder variables.  This
     105             :     ! includes rt and theta-l.  When l_predict_upwp_vpwp is enabled, u and v are
     106             :     ! also calculated as part of the PDF, and they are included as well.
     107             :     ! Additionally, when sclr_dim > 0, passive scalars (sclr) are also included.
     108             :     !$acc parallel loop gang vector collapse(2) default(present)
     109  1536829632 :     do k = 1, nz
     110 25380961632 :       do i = 1, ngrdcol
     111 47688264000 :         max_corr_w_x_sqd(i,k) = max( ( wpthlp(i,k) / ( sqrt( wp2(i,k) * thlp2(i,k) ) &
     112             :                                        + one_hundred * w_tol * thl_tol ) )**2, &
     113             :                                        ( wprtp(i,k) / ( sqrt( wp2(i,k) * rtp2(i,k) )  &
     114 73051355520 :                                        + one_hundred * w_tol * rt_tol ) )**2 )
     115             :       end do
     116             :     end do
     117             :     !$acc end parallel loop
     118             : 
     119    17870112 :     if ( l_predict_upwp_vpwp ) then
     120             :       !$acc parallel loop gang vector collapse(2) default(present)
     121  1536829632 :       do k = 1, nz
     122 25380961632 :         do i = 1, ngrdcol
     123 47688264000 :           max_corr_w_x_sqd(i,k) = max( max_corr_w_x_sqd(i,k), &
     124             :                                        ( upwp(i,k) / ( sqrt( up2(i,k) * wp2(i,k) ) &
     125             :                                        + one_hundred * w_tol_sqd ) )**2, &
     126             :                                        ( vpwp(i,k) / ( sqrt( vp2(i,k) * wp2(i,k) ) &
     127 73051355520 :                                        + one_hundred * w_tol_sqd ) )**2 )
     128             :         end do
     129             :       end do
     130             :       !$acc end parallel loop
     131             :     endif ! l_predict_upwp_vpwp
     132             : 
     133             :     ! Calculate the value of sigma_sqd_w
     134             :     !$acc parallel loop gang vector collapse(2) default(present)
     135  1536829632 :     do k = 1, nz
     136 25380961632 :       do i = 1, ngrdcol
     137 25363091520 :         sigma_sqd_w(i,k) = gamma_Skw_fnc(i,k) * ( one - min( max_corr_w_x_sqd(i,k), one ) )
     138             :       end do
     139             :     end do
     140             :     !$acc end parallel loop
     141             : 
     142             :     !$acc exit data delete( max_corr_w_x_sqd )
     143             : 
     144    17870112 :     return
     145             : 
     146             :   end subroutine compute_sigma_sqd_w
     147             : 
     148             : end module sigma_sqd_w_module

Generated by: LCOV version 1.14