LCOV - code coverage report
Current view: | top level - physics/clubb/src/CLUBB_core - diagnose_correlations_module.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 0 | 107 | 0.0 %
Date: | 2024-12-17 22:39:59 |  | Functions: | 0 | 10 | 0.0 %

              Line data    Source code
           1             : !-----------------------------------------------------------------------
           2             : ! $Id$
           3             : !===============================================================================
           4             : module diagnose_correlations_module
           5             :
           6             :   use clubb_precision, only: &
           7             :       core_rknd
           8             :
           9             :   implicit none
          10             :
          11             :   public :: calc_mean, calc_varnce, calc_w_corr, &
          12             :             calc_cholesky_corr_mtx_approx, &
          13             :             cholesky_to_corr_mtx_approx, setup_corr_cholesky_mtx, &
          14             :             diagnose_correlations
          15             :
          16             :
          17             :   private :: diagnose_corr, rearrange_corr_array, &
          18             :              corr_array_assertion_checks
          19             :
          20             :   private ! Default scope
          21             :   contains
          22             :
          23             : !-----------------------------------------------------------------------
          24           0 :   subroutine diagnose_correlations( pdf_dim, iiPDF_w, & ! Intent(in)
          25           0 :                                     corr_array_pre, & ! Intent(in)
          26             :                                     l_calc_w_corr, & ! Intent(in)
          27           0 :                                     corr_array )                   ! Intent(out)
          28             :     ! Description:
          29             :     !   This subroutine diagnoses the correlation matrix in order to feed it
          30             :     !   into SILHS microphysics.
          31             :
          32             :     ! References:
          33             :     !   Larson et al. (2011), J. of Geophysical Research, Vol. 116, D00T02
          34             :     !   (see CLUBB Trac ticket#514)
          35             :     !-----------------------------------------------------------------------
          36             :
          37             :     use clubb_precision, only: &
          38             :         core_rknd ! Variable(s)
          39             :
          40             :     use constants_clubb, only: &
          41             :         zero
          42             :
          43             :     implicit none
          44             :
          45             :     intrinsic :: max, sqrt, transpose
          46             :
          47             :     ! Input Variables
          48             :     integer, intent(in) :: &
          49             :       pdf_dim, &  ! number of diagnosed correlations
          50             :       iiPDF_w
          51             :
          52             :     real( kind = core_rknd ), dimension(pdf_dim, pdf_dim), intent(in) :: &
          53             :       corr_array_pre   ! Prescribed correlations
          54             :
          55             :     logical, intent(in) :: &
          56             :       l_calc_w_corr ! Calculate the correlations between w and the hydrometeors
          57             :
          58             :     ! Output variables
          59             :     real( kind = core_rknd ), dimension(pdf_dim, pdf_dim), intent(out) :: &
          60             :       corr_array
          61             :
          62             :     ! Local Variables
          63             :     real( kind = core_rknd ), dimension(pdf_dim, pdf_dim) :: &
          64           0 :       corr_array_pre_swapped, &
          65           0 :       corr_array_swapped
          66             :
          67             :     ! We actually don't need this right now
          68             :     real( kind = core_rknd ), dimension(pdf_dim) :: &
          69           0 :       sigma2_on_mu2_ip_array  ! Ratios: sigma_x^2/mu_x^2 (ith PDF comp.) ip [-]
          70             :
          71             :     integer :: i ! Loop iterator
          72             :
          73             :     !-------------------- Begin code --------------------
          74             :
          75             :     ! Initialize sigma2_on_mu2_ip_array
          76           0 :     do i = 1, pdf_dim
          77           0 :        sigma2_on_mu2_ip_array(i) = zero
          78             :     end do
          79             :
          80             :     ! Swap the w-correlations to the first row for the prescribed correlations
          81             :     call rearrange_corr_array( pdf_dim, iiPDF_w,        & ! Intent(in)
          82             :                                corr_array_pre,          & ! Intent(in)
          83           0 :                                corr_array_pre_swapped )   ! Intent(inout)
          84             :
          85             :     ! diagnose correlations
          86             :
          87           0 :     if ( .not. l_calc_w_corr ) then
          88           0 :        corr_array_swapped = corr_array_pre_swapped
          89             :     endif
          90             :
          91             :     call diagnose_corr( pdf_dim, sqrt(sigma2_on_mu2_ip_array), & ! intent(in)
          92             :                         corr_array_pre_swapped, & ! intent(in)
          93           0 :                         corr_array_swapped ) ! intent(inout)
          94             :
          95             :     ! Swap rows back
          96             :     call rearrange_corr_array( pdf_dim, iiPDF_w,   & ! Intent(in)
          97             :                                corr_array_swapped, & ! Intent(in)
          98           0 :                                corr_array)           ! Intent(out)
          99             :
         100           0 :   end subroutine diagnose_correlations
         101             :
         102             :
         103             :   !-----------------------------------------------------------------------
         104           0 :   subroutine diagnose_corr( n_variables, sqrt_sigma2_on_mu2_ip, & ! intent(in)
         105           0 :                             corr_matrix_prescribed, & !intent(in)
         106           0 :                             corr_matrix_approx ) ! intent(inout)
         107             :
         108             :     ! Description:
         109             :     !   This subroutine diagnoses the correlation matrix for each timestep.
         110             :
         111             :     ! References:
         112             :     !   Larson et al. (2011), J. of Geophysical Research, Vol. 116, D00T02
         113             :     !   (see CLUBB Trac ticket#514)
         114             :     !-----------------------------------------------------------------------
         115             :
         116             :     use clubb_precision, only: &
         117             :         core_rknd ! Variable(s)
         118             :
         119             :     use constants_clubb, only: &
         120             :         max_mag_correlation
         121             :
         122             :     implicit none
         123             :
         124             :     intrinsic :: &
         125             :       sqrt, abs, sign
         126             :
         127             :     ! Input Variables
         128             :     integer, intent(in) :: &
         129             :       n_variables  ! number of variables in the correlation matrix [-]
         130             :
         131             :     real( kind = core_rknd ), dimension(n_variables), intent(in) :: &
         132             :       sqrt_sigma2_on_mu2_ip  ! sqrt of sigma_x^2/mu_x^2 (ith PDF comp.) ip [-]
         133             :
         134             :     real( kind = core_rknd ), dimension(n_variables,n_variables), intent(in) :: &
         135             :       corr_matrix_prescribed ! correlation matrix [-]
         136             :
         137             :     ! Input/Output Variables
         138             :     real( kind = core_rknd ), dimension(n_variables,n_variables), intent(inout) :: &
         139             :       corr_matrix_approx ! correlation matrix [-]
         140             :
         141             :
         142             :     ! Local Variables
         143             :     integer :: i, j ! Loop iterator
         144             :
         145             :     real( kind = core_rknd ) :: &
         146             :       f_ij
         147             : !      f_ij_o
         148             :
         149             :     real( kind = core_rknd ), dimension(n_variables) :: &
         150           0 :       s_1j ! s_1j = sqrt(1-c_1j^2)
         151             :
         152             :
         153             :     !-------------------- Begin code --------------------
         154             :
         155             :     ! Remove compiler warnings about unused variables.
         156             :     if ( .false. ) then
         157             :        print *, "sqrt_sigma2_on_mu2_ip = ", sqrt_sigma2_on_mu2_ip
         158             :     endif
         159             :
         160             :     ! calculate all square roots
         161           0 :     do i = 1, n_variables
         162             :
         163           0 :        s_1j(i) = sqrt(1._core_rknd-corr_matrix_approx(i,1)**2)
         164             :
         165             :     end do
         166             :
         167             :
         168             :     ! Diagnose the missing correlations (upper triangle)
         169           0 :     do j = 2, (n_variables-1)
         170           0 :       do i = (j+1), n_variables
         171             :
         172             :         ! formula (16) in the ref. paper (Larson et al. (2011))
         173             :         !f_ij = alpha_corr * sqrt_sigma2_on_mu2_ip(i) * sqrt_sigma2_on_mu2_ip(j) &
         174             :         !        * sign(1.0_core_rknd,corr_matrix_approx(1,i)*corr_matrix_approx(1,j))
         175             :
         176             :         ! If the predicting c1i's are small then cij will be closer to the prescribed value. If
         177             :         ! the c1i's are bigger, then cij will be closer to formular (15) from the ref. paper. See
         178             :         ! clubb:ticket:514:comment:61 for details.
         179             :       !f_ij = (1-abs(corr_matrix_approx(1,i)*corr_matrix_approx(1,j)))*corr_matrix_prescribed(i,j) &
         180             :       !       + abs(corr_matrix_approx(1,i)*corr_matrix_approx(1,j))*f_ij_o
         181             :
         182           0 :         f_ij = corr_matrix_prescribed(i,j)
         183             :
         184             :         ! make sure -1 < f_ij < 1
         185           0 :         if ( f_ij < -max_mag_correlation ) then
         186             :
         187             :            f_ij = -max_mag_correlation
         188             :
         189           0 :         else if ( f_ij > max_mag_correlation ) then
         190             :
         191           0 :            f_ij = max_mag_correlation
         192             :
         193             :         end if
         194             :
         195             :
         196             :         ! formula (15) in the ref. paper (Larson et al. (2011))
         197           0 :         corr_matrix_approx(i,j) = corr_matrix_approx(i,1) * corr_matrix_approx(j,1) &
         198           0 :         + f_ij * s_1j(i) * s_1j(j)
         199             :
         200             :       end do ! do j
         201             :     end do ! do i
         202             :
         203           0 :   end subroutine diagnose_corr
         204             :
         205             :
         206             :   !-----------------------------------------------------------------------
         207             : !  subroutine approx_w_corr( nz, pdf_dim, pdf_params, & ! Intent(in)
         208             : !                            rrm, Nrm, Ncnm, &
         209             : !                            stdev_w, sigma_rr_1, &
         210             : !                            sigma_Nr_1, sigma_Ncn_1, &
         211             : !                            corr_array) ! Intent(out)
         212             : !    ! Description:
         213             : !    ! Approximate the correlations of w with the hydrometeors.
         214             : !
         215             : !    ! References:
         216             : !    ! clubb:ticket:514
         217             : !    !-----------------------------------------------------------------------
         218             : !
         219             : !    use clubb_precision, only: &
         220             : !        core_rknd ! Variable(s)
         221             : !
         222             : !    use pdf_parameter_module, only:  &
         223             : !        pdf_parameter  ! Type
         224             : !
         225             : !    use constants_clubb, only:  &
         226             : !        one,          & ! Constant(s)
         227             : !        rr_tol,       &
         228             : !        Nr_tol,       &
         229             : !        Ncn_tol,      &
         230             : !        w_tol,        & ! [m/s]
         231             : !        chi_tol    ! [kg/kg]
         232             : !
         233             : !    implicit none
         234             : !
         235             : !    ! Input Variables
         236             : !    integer, intent(in) :: &
         237             : !      pdf_dim, & ! Number of diagnosed correlations
         238             : !      nz             ! Number of model vertical grid levels
         239             : !
         240             : !    type(pdf_parameter), dimension(nz), intent(in) :: &
         241             : !      pdf_params    ! PDF parameters                         [units vary]
         242             : !
         243             : !    real( kind = core_rknd ), dimension(nz), intent(in) ::  &
         244             : !      rrm,          & ! Mean rain water mixing ratio, < r_r >    [kg/kg]
         245             : !      Nrm,             & ! Mean rain drop concentration, < N_r >    [num/kg]
         246             : !      Ncnm,            & ! Mean cloud nuclei conc., < N_cn >        [num/kg]
         247             : !      stdev_w            ! Standard deviation of w                              [m/s]
         248             : !
         249             : !    real( kind = core_rknd ), intent(in) :: &
         250             : !      sigma_Ncn_1,   & ! Standard deviation of Ncn (1st PDF component)  [num/kg]
         251             : !      sigma_Nr_1,    & ! Standard deviation of Nr (2nd PDF component)   [num/kg]
         252             : !      sigma_rr_1       ! Standard dev. of ln rr (1st PDF comp.) ip   [ln(kg/kg)]
         253             : !
         254             : !    ! Output Variables
         255             : !    real( kind = core_rknd ), dimension(pdf_dim, pdf_dim, nz), intent(out) :: &
         256             : !      corr_array
         257             : !
         258             : !    ! Local Variables
         259             : !    real( kind = core_rknd ), dimension(nz) :: &
         260             : !      corr_chi_w,       & ! Correlation between w and chi(s_mellor) (both components)       [-]
         261             : !      corr_wrr,      & ! Correlation between w and rr (both components)      [-]
         262             : !      corr_wNr,      & ! Correlation between w and Nr (both components)      [-]
         263             : !      corr_wNcn        ! Correlation between w and Ncn (both components)     [-]
         264             : !
         265             : !    real( kind = core_rknd ), dimension(nz) ::  &
         266             : !      wpchip_zt,   & ! Covariance of chi and w on the zt-grid    [(m/s)(kg/kg)]
         267             : !      wprrp_zt,  & ! Covariance of r_r and w on the zt-grid  [(m/s)(kg/kg)]
         268             : !      wpNrp_zt,  & ! Covariance of N_r and w on the zt-grid  [(m/s)(#/kg)]
         269             : !      wpNcnp_zt    ! Covariance of N_cn and w on the zt-grid  [(m/s)(#/kg)]
         270             : !
         271             : !    real( kind = core_rknd ) :: &
         272             : !      chi_m,      & ! Mean of chi (s_mellor)                             [kg/kg]
         273             : !      stdev_chi     ! Standard deviation of chi (s_mellor)               [kg/kg]
         274             : !
         275             : !    integer :: k ! vertical loop iterator
         276             : !
         277             : !    ! ----- Begin Code -----
         278             : !
         279             : !    call approx_w_covar( nz, pdf_params, rrm, Nrm, Ncnm, & ! Intent(in)
         280             : !                         wpchip_zt, wprrp_zt, wpNrp_zt, wpNcnp_zt ) ! Intent(out)
         281             : !
         282             : !    do k = 1, nz
         283             : !
         284             : !       chi_m &
         285             : !       = calc_mean( pdf_params(k)%mixt_frac, pdf_params(k)%chi_1, &
         286             : !                    pdf_params(k)%chi_2 )
         287             : !
         288             : !       stdev_chi &
         289             : !       = sqrt( pdf_params(k)%mixt_frac &
         290             : !               * ( ( pdf_params(k)%chi_1 - chi_m )**2 &
         291             : !                     + pdf_params(k)%stdev_chi_1**2 ) &
         292             : !             + ( one - pdf_params(k)%mixt_frac ) &
         293             : !               * ( ( pdf_params(k)%chi_2 - chi_m )**2 &
         294             : !                     + pdf_params(k)%stdev_chi_2**2 ) &
         295             : !             )
         296             : !
         297             : !       corr_chi_w(k) &
         298             : !       = calc_w_corr( wpchip_zt(k), stdev_w(k), stdev_chi, &
         299             : !                      w_tol, chi_tol )
         300             : !
         301             : !       corr_wrr(k) &
         302             : !       = calc_w_corr( wprrp_zt(k), stdev_w(k), sigma_rr_1, w_tol, rr_tol )
         303             : !
         304             : !       corr_wNr(k) &
         305             : !       = calc_w_corr( wpNrp_zt(k), stdev_w(k), sigma_Nr_1, w_tol, Nr_tol )
         306             : !
         307             : !       corr_wNcn(k) &
         308             : !       = calc_w_corr( wpNcnp_zt(k), stdev_w(k), sigma_Ncn_1, w_tol, Ncn_tol )
         309             : !
         310             : !    enddo
         311             : !
         312             : !    call set_w_corr( nz, pdf_dim, & ! Intent(in)
         313             : !                         corr_chi_w, corr_wrr, corr_wNr, corr_wNcn, &
         314             : !                         corr_array ) ! Intent(inout)
         315             : !
         316             : !  end subroutine approx_w_corr
         317             :
         318             :
         319             :   !-----------------------------------------------------------------------
         320             : !  subroutine approx_w_covar( nz, pdf_params, rrm, Nrm, Ncnm, Kh_zm, &   ! Intent(in)
         321             : !                             wpchip_zt, wprrp_zt, wpNrp_zt, wpNcnp_zt ) ! Intent(out)
         322             : !    ! Description:
         323             : !    ! Approximate the covariances of w with the hydrometeors using Eddy
         324             : !    ! diffusivity.
         325             : !
         326             : !    ! References:
         327             : !    ! clubb:ticket:514
         328             : !    !-----------------------------------------------------------------------
         329             : !
         330             : !    use clubb_precision, only: &
         331             : !      core_rknd ! Variable(s)
         332             : !
         333             : !    use grid_class, only: &
         334             : !        gr,  & ! Variable(s)
         335             : !        zm2zt,  & ! Procedure(s)
         336             : !        zt2zm
         337             : !
         338             : !    use pdf_parameter_module, only:  &
         339             : !        pdf_parameter  ! Type
         340             : !
         341             : !    use constants_clubb, only: &
         342             : !        one ! Constant(s)
         343             : !
         344             : !    use advance_windm_edsclrm_module, only: &
         345             : !        xpwp_fnc ! Procedure(s)
         346             : !
         347             : !    implicit none
         348             : !
         349             : !    ! Input Variables
         350             : !    integer, intent(in) :: &
         351             : !      nz          ! Number of model vertical grid levels
         352             : !
         353             : !    type(pdf_parameter), dimension(nz), intent(in) :: &
         354             : !      pdf_params    ! PDF parameters                         [units vary]
         355             : !
         356             : !    real( kind = core_rknd ), dimension(nz), intent(in) ::  &
         357             : !      rrm,   & ! Mean rain water mixing ratio, < r_r >      [kg/kg]
         358             : !      Nrm,   & ! Mean rain drop concentration, < N_r >      [num/kg]
         359             : !      Ncnm,  & ! Mean cloud nuclei concentration, < N_cn >  [num/kg]
         360             : !      Kh_zm    ! Eddy diffusivity coef. on momentum levels  [m^2/s]
         361             : !
         362             : !    ! Output Variables
         363             : !    real( kind = core_rknd ), dimension(nz), intent(out) ::  &
         364             : !      wpchip_zt,   & ! Covariance of chi(s) and w on the zt-grid     [(m/s)(kg/kg)]
         365             : !      wprrp_zt,  & ! Covariance of r_r and w on the zt-grid   [(m/s)(kg/kg)]
         366             : !      wpNrp_zt,  & ! Covariance of N_r and w on the zt-grid   [(m/s)(#/kg)]
         367             : !      wpNcnp_zt    ! Covariance of N_cn and w on the zt-grid  [(m/s)(#/kg)]
         368             : !
         369             : !    ! Local Variables
         370             : !    real( kind = core_rknd ), dimension(nz) ::  &
         371             : !      wpchip_zm,   & ! Covariance of chi(s) and w on the zm-grid     [(m/s)(kg/kg)]
         372             : !      wprrp_zm,  & ! Covariance of r_r and w on the zm-grid   [(m/s)(kg/kg)]
         373             : !      wpNrp_zm,  & ! Covariance of N_r and w on the zm-grid   [(m/s)(#/kg)]
         374             : !      wpNcnp_zm    ! Covariance of N_cn and w on the zm-grid  [(m/s)(#/kg)]
         375             : !
         376             : !    integer :: k ! vertical loop iterator
         377             : !
         378             : !    ! ----- Begin Code -----
         379             : !
         380             : !    ! calculate the covariances of w with the hydrometeors
         381             : !    do k = 1, nz
         382             : !      wpchip_zm(k) = pdf_params(k)%mixt_frac &
         383             : !                   * ( one - pdf_params(k)%mixt_frac ) &
         384             : !                   * ( pdf_params(k)%chi_1 - pdf_params(k)%chi_2 ) &
         385             : !                   * ( pdf_params(k)%w_1 - pdf_params(k)%w_2 )
         386             : !    enddo
         387             : !
         388             : !! same for wpNrp
         389             : !!    wprrp_zm(1:nz-1) &
         390             : !!    = xpwp_fnc( -c_K_hm * Kh_zm(1:nz-1), &
         391             : !!                rrm(1:nz-1) / max( precip_frac(1:nz-1), eps ), &
         392             : !!                rrm(2:nz) / max( precip_frac(2:nz), eps ), &
         393             : !!                gr%invrs_dzm(1:nz-1) )
         394             : !
         395             : !    wprrp_zm(1:nz-1) &
         396             : !    = xpwp_fnc( -c_K_hm * Kh_zm(1:nz-1), &
         397             : !                rrm(1:nz-1), rrm(2:nz), &
         398             : !                gr%invrs_dzm(1:nz-1) )
         399             : !
         400             : !    wpNrp_zm(1:nz-1) &
         401             : !    = xpwp_fnc( -c_K_hm * Kh_zm(1:nz-1), &
         402             : !                Nrm(1:nz-1), Nrm(2:nz), &
         403             : !                gr%invrs_dzm(1:nz-1) )
         404             : !
         405             : !    wpNcnp_zm(1:nz-1) = xpwp_fnc( -c_K_hm * Kh_zm(1:nz-1), Ncnm(1:nz-1), &
         406             : !                                  Ncnm(2:nz), gr%invrs_dzm(1:nz-1) )
         407             : !
         408             : !    ! Boundary conditions; We are assuming constant flux at the top.
         409             : !    wprrp_zm(nz)  = wprrp_zm(nz-1)
         410             : !    wpNrp_zm(nz)  = wpNrp_zm(nz-1)
         411             : !    wpNcnp_zm(nz) = wpNcnp_zm(nz-1)
         412             : !
         413             : !    ! interpolate back to zt-grid
         414             : !    wpchip_zt   = zm2zt(wpchip_zm)
         415             : !    wprrp_zt  = zm2zt(wprrp_zm)
         416             : !    wpNrp_zt  = zm2zt(wpNrp_zm)
         417             : !    wpNcnp_zt = zm2zt(wpNcnp_zm)
         418             : !
         419             : !  end subroutine approx_w_covar
         420             :
         421             :   !-----------------------------------------------------------------------
         422           0 :   function calc_w_corr( wpxp, stdev_w, stdev_x, w_tol, x_tol )
         423             :     ! Description:
         424             :     ! Compute the correlations of w with the hydrometeors.
         425             :
         426             :     ! References:
         427             :     ! clubb:ticket:514
         428             :     !-----------------------------------------------------------------------
         429             :
         430             :     use clubb_precision, only: &
         431             :         core_rknd ! Variable(s)
         432             :
         433             :     use constants_clubb, only: &
         434             :         max_mag_correlation
         435             :
         436             :     implicit none
         437             :
         438             :     intrinsic :: max
         439             :
         440             :     ! Input Variables
         441             :     real( kind = core_rknd ), intent(in) :: &
         442             :       stdev_w,  & ! standard deviation of w [m/s]
         443             :       stdev_x,  & ! standard deviation of x [units vary]
         444             :       wpxp,     & ! Covariances of w with the hydrometeors [units vary]
         445             :       w_tol,    & ! tolerance for w [m/s]
         446             :       x_tol       ! tolerance for x [units vary]
         447             :
         448             :     real( kind = core_rknd ) :: &
         449             :       calc_w_corr
         450             :
         451             :     ! --- Begin Code ---
         452             :
         453           0 :     calc_w_corr = wpxp / ( max(stdev_x, x_tol) * max(stdev_w, w_tol) )
         454             :
         455             :     ! Make sure the correlation is in [-1,1]
         456           0 :     if ( calc_w_corr < -max_mag_correlation ) then
         457             :
         458             :       calc_w_corr = -max_mag_correlation
         459             :
         460           0 :     else if ( calc_w_corr > max_mag_correlation ) then
         461             :
         462           0 :       calc_w_corr = max_mag_correlation
         463             :
         464             :     end if
         465             :
         466           0 :   end function calc_w_corr
         467             :
         468             :
         469             :   !-----------------------------------------------------------------------
         470           0 :   function calc_varnce( mixt_frac, x1, x2, xm, x1p2, x2p2 )
         471             :
         472             :     ! Description:
         473             :     ! Calculate the variance xp2 from the components x1, x2.
         474             :
         475             :     ! References:
         476             :     !   Larson et al. (2011), J. of Geophysical Research, Vol. 116, D00T02,
         477             :     !   page 3535
         478             :     !-----------------------------------------------------------------------
         479             :
         480             :     use clubb_precision, only: &
         481             :         core_rknd ! Variable(s)
         482             :
         483             :     implicit none
         484             :
         485             :     ! Input Variables
         486             :     real( kind = core_rknd ), intent(in) :: &
         487             :       mixt_frac, &  ! mixing ratio [-]
         488             :       x1, &         ! first component of the double gaussian [units vary]
         489             :       x2, &         ! second component of the double gaussian [units vary]
         490             :       xm, &         ! mean of x [units vary]
         491             :       x1p2, &       ! variance of the first component [units vary]
         492             :       x2p2          ! variance of the second component [units vary]
         493             :
         494             :     ! Return Variable
         495             :     real( kind = core_rknd ) :: &
         496             :       calc_varnce ! variance of x (both components) [units vary]
         497             :
         498             :     ! --- Begin Code ---
         499             :
         500             :     calc_varnce &
         501             :     = mixt_frac * ( ( x1 - xm )**2 + x1p2 ) &
         502           0 :       + ( 1.0_core_rknd - mixt_frac ) * ( ( x2 - xm )**2 + x2p2 )
         503             :
         504             :     return
         505             :   end function calc_varnce
         506             :
         507             :   !-----------------------------------------------------------------------
         508           0 :   function calc_mean( mixt_frac, x1, x2 )
         509             :
         510             :     ! Description:
         511             :     ! Calculate the mean xm from the components x1, x2.
         512             :
         513             :     ! References:
         514             :     !   Larson et al. (2011), J. of Geophysical Research, Vol. 116, D00T02,
         515             :     !   page 3535
         516             :     !-----------------------------------------------------------------------
         517             :
         518             :     use clubb_precision, only: &
         519             :         core_rknd ! Variable(s)
         520             :
         521             :     implicit none
         522             :
         523             :     ! Input Variables
         524             :     real( kind = core_rknd ), intent(in) :: &
         525             :       mixt_frac, &  ! mixing ratio [-]
         526             :       x1, &         ! first component of the double gaussian [units vary]
         527             :       x2            ! second component of the double gaussian [units vary]
         528             :
         529             :     ! Return Variable
         530             :     real( kind = core_rknd ) :: &
         531             :       calc_mean  ! mean of x (both components) [units vary]
         532             :
         533             :     ! --- Begin Code ---
         534             :
         535           0 :     calc_mean = mixt_frac * x1 + (1.0_core_rknd - mixt_frac) * x2
         536             :
         537             :     return
         538             :   end function calc_mean
         539             :
         540             :
         541             :   !-----------------------------------------------------------------------
         542           0 :   subroutine calc_cholesky_corr_mtx_approx( n_variables, iiPDF_w,  & ! Intent(in)
         543           0 :                                             corr_matrix, & ! intent(in)
         544           0 :                                             corr_cholesky_mtx, corr_mtx_approx ) ! intent(out)
         545             :
         546             :     ! Description:
         547             :     !   This subroutine calculates the transposed correlation cholesky matrix
         548             :     !   from the correlation matrix
         549             :     !
         550             :     ! References:
         551             :     !   1 Larson et al. (2011), J. of Geophysical Research, Vol. 116, D00T02
         552             :     !   2 CLUBB Trac ticket#514
         553             :     !-----------------------------------------------------------------------
         554             :
         555             :     use clubb_precision, only: &
         556             :         core_rknd ! Variable(s)
         557             :
         558             :     use constants_clubb, only: &
         559             :         zero ! Variable(s)
         560             :
         561             :     implicit none
         562             :
         563             :     ! Input Variables
         564             :     integer, intent(in) :: &
         565             :       n_variables, &  ! number of variables in the correlation matrix [-]
         566             :       iiPDF_w
         567             :
         568             :     real( kind = core_rknd ), dimension(n_variables,n_variables), intent(in) :: &
         569             :       corr_matrix ! correlation matrix [-]
         570             :
         571             :     ! Output Variables
         572             :
         573             :     ! correlation cholesky matrix transposed L', C = LL'; see reference 1 formula 10
         574             :     real( kind = core_rknd ), dimension(n_variables,n_variables), intent(out) :: &
         575             :       corr_cholesky_mtx, & ! Transposed correlation cholesky matrix    [-]
         576             :       corr_mtx_approx      ! Approximated correlation matrix (C = LL') [-]
         577             :
         578             :     ! Local Variables
         579             :     integer :: i, j ! Loop iterators
         580             :
         581             :     ! Swapped means that the w-correlations are swapped to the first row
         582             :     real( kind = core_rknd ), dimension(n_variables,n_variables) :: &
         583           0 :       corr_cholesky_mtx_swap, & ! Swapped correlation cholesky matrix    [-]
         584           0 :       corr_mtx_approx_swap,   & ! Swapped correlation matrix (approx.)   [-]
         585           0 :       corr_mtx_swap             ! Swapped correlation matrix             [-]
         586             :
         587             :     !-------------------- Begin code --------------------
         588             :
         589             :     call rearrange_corr_array( n_variables, iiPDF_w,  & ! Intent(in)
         590             :                                corr_matrix,           & ! Intent(in)
         591           0 :                                corr_mtx_swap )          ! Intent(inout)
         592             :
         593             :     call setup_corr_cholesky_mtx( n_variables, corr_mtx_swap, & ! intent(in)
         594           0 :                                   corr_cholesky_mtx_swap )      ! intent(out)
         595             :
         596             :     call rearrange_corr_array( n_variables, iiPDF_w,    & ! Intent(in)
         597             :                                corr_cholesky_mtx_swap,  & ! Intent(in)
         598           0 :                                corr_cholesky_mtx )        ! Intent(inout)
         599             :
         600             :     call cholesky_to_corr_mtx_approx( n_variables, corr_cholesky_mtx_swap, & ! intent(in)
         601           0 :                                       corr_mtx_approx_swap )                 ! intent(out)
         602             :
         603             :     call rearrange_corr_array( n_variables, iiPDF_w,  & ! Intent(in)
         604             :                                corr_mtx_approx_swap,  & ! Intent(in)
         605           0 :                                corr_mtx_approx )        ! Intent(inout)
         606             :
         607           0 :     call corr_array_assertion_checks( n_variables, corr_mtx_approx ) ! intent(in)
         608             :
         609             :     ! Set lower triangle to zero for conformity
         610           0 :     do i = 2, n_variables
         611           0 :        do j = 1, i-1
         612           0 :           corr_mtx_approx(j,i) = zero
         613             :        end do
         614             :     end do
         615             :
         616           0 :     return
         617             :
         618             :   end subroutine calc_cholesky_corr_mtx_approx
         619             :   !-----------------------------------------------------------------------
         620             :
         621             :   !-----------------------------------------------------------------------
         622           0 :   subroutine setup_corr_cholesky_mtx( n_variables, corr_matrix, & ! intent(in)
         623           0 :                                       corr_cholesky_mtx_t )       ! intent(out)
         624             :
         625             :     ! Description:
         626             :     !   This subroutine calculates the transposed correlation cholesky matrix
         627             :     !   from the correlation matrix
         628             :     !
         629             :     ! References:
         630             :     !   1 Larson et al. (2011), J. of Geophysical Research, Vol. 116, D00T02
         631             :     !   2 CLUBB Trac ticket#514
         632             :     !-----------------------------------------------------------------------
         633             :
         634             :     use clubb_precision, only: &
         635             :         core_rknd ! Variable(s)
         636             :
         637             :     use constants_clubb, only: &
         638             :         zero, & ! Variable(s)
         639             :         one
         640             :
         641             :     implicit none
         642             :
         643             :     intrinsic :: sqrt
         644             :
         645             :     ! Input Variables
         646             :     integer, intent(in) :: &
         647             :       n_variables  ! number of variables in the correlation matrix [-]
         648             :
         649             :     real( kind = core_rknd ), dimension(n_variables,n_variables), intent(in) :: &
         650             :       corr_matrix ! correlation matrix [-]
         651             :
         652             :     ! Output Variables
         653             :
         654             :     ! correlation cholesky matrix transposed L', C = LL'; see reference 1 formula 10
         655             :     real( kind = core_rknd ), dimension(n_variables,n_variables), intent(out) :: &
         656             :       corr_cholesky_mtx_t ! transposed correlation cholesky matrix [-]
         657             :
         658             :     ! Local Variables
         659             :     integer :: i, j, k ! Loop iterators
         660             :
         661             :     real( kind = core_rknd ), dimension(n_variables, n_variables) :: &
         662           0 :       s ! s(i,j) = sqrt(1-c(i,j)^2); see ref 1
         663             :
         664             :     !-------------------- Begin code --------------------
         665             :
         666             :     ! calculate all necessary square roots
         667           0 :     do i = 1, n_variables-1
         668           0 :        do j = i+1, n_variables
         669             :
         670           0 :           s(j,i) = sqrt(1._core_rknd - corr_matrix(j,i)**2)
         671             :
         672             :        end do
         673             :     end do
         674             :
         675             :     !!! calculate transposed correlation cholesky matrix; ref 1 formula 10
         676             :
         677             :     ! initialize matrix to zero
         678           0 :     do i = 1, n_variables
         679           0 :        do j = 1, n_variables
         680             :
         681           0 :           corr_cholesky_mtx_t(j,i) = zero
         682             :
         683             :        end do
         684             :     end do
         685             :
         686             :     ! initialize upper triangle and diagonal to one
         687           0 :     do i = 1, n_variables
         688           0 :        do j = i, n_variables
         689             :
         690           0 :           corr_cholesky_mtx_t(j,i) = one
         691             :
         692             :        end do
         693             :     end do
         694             :
         695             :     ! set diagonal elements
         696           0 :     do j = 2, n_variables
         697           0 :        do i = 1, j-1
         698             :
         699           0 :           corr_cholesky_mtx_t(j,j) = corr_cholesky_mtx_t(j,j)*s(j,i)
         700             :          ! print *, "s(", j, ",", i, ") = ", s(j,i)
         701             :
         702             :        end do
         703             :     end do
         704             :
         705             :     ! set first row
         706           0 :     do j = 2, n_variables
         707             :
         708           0 :        corr_cholesky_mtx_t(j,1) = corr_matrix(j,1)
         709             :
         710             :     end do
         711             :
         712             :     ! set upper triangle
         713           0 :     do i = 2, n_variables-1
         714           0 :        do j = i+1, n_variables
         715           0 :           do k = 1, i-1
         716             :
         717           0 :              corr_cholesky_mtx_t(j,i) = corr_cholesky_mtx_t(j,i)*s(j,k)
         718             :
         719             :           end do
         720             :
         721           0 :           corr_cholesky_mtx_t(j,i) = corr_cholesky_mtx_t(j,i)*corr_matrix(j,i)
         722             :
         723             :        end do
         724             :     end do
         725             :
         726           0 :     return
         727             :
         728             :   end subroutine setup_corr_cholesky_mtx
         729             :   !-----------------------------------------------------------------------
         730             :
         731             :
         732             :   !-----------------------------------------------------------------------
         733           0 :   subroutine cholesky_to_corr_mtx_approx( n_variables, corr_cholesky_mtx_t, & ! intent(in)
         734           0 :                                           corr_matrix_approx )                ! intent(out)
         735             :
         736             :     ! Description:
         737             :     !   This subroutine approximates the correlation matrix from the correlation
         738             :     !   cholesky matrix
         739             :     !
         740             :     ! References:
         741             :     !   1 Larson et al. (2011), J. of Geophysical Research, Vol. 116, D00T02
         742             :     !   2 CLUBB Trac ticket#514
         743             :     !-----------------------------------------------------------------------
         744             :
         745             :     use clubb_precision, only: &
         746             :         core_rknd ! Variable(s)
         747             :
         748             :     implicit none
         749             :
         750             :     intrinsic :: matmul, transpose
         751             :
         752             :     ! Input Variables
         753             :     integer, intent(in) :: &
         754             :       n_variables  ! number of variables in the correlation matrix [-]
         755             :
         756             :     real( kind = core_rknd ), dimension(n_variables,n_variables), intent(in) :: &
         757             :       corr_cholesky_mtx_t ! transposed correlation cholesky matrix [-]
         758             :
         759             :     ! Output Variables
         760             :     real( kind = core_rknd ), dimension(n_variables,n_variables), intent(out) :: &
         761             :       corr_matrix_approx ! correlation matrix [-]
         762             :
         763             :     !-------------------- Begin code --------------------
         764             :
         765             :     ! approximate the correlation matrix; see ref 1 formula (8)
         766           0 :     corr_matrix_approx = matmul(corr_cholesky_mtx_t, transpose(corr_cholesky_mtx_t))
         767             :
         768           0 :     return
         769             :
         770             :   end subroutine cholesky_to_corr_mtx_approx
         771             :   !-----------------------------------------------------------------------
         772             :
         773             :
         774             :   !-----------------------------------------------------------------------
         775           0 :   subroutine corr_array_assertion_checks( n_variables, corr_array )
         776             :
         777             :     ! Description:
         778             :     !   This subroutine does the assertion checks for the corr_array.
         779             :
         780             :     ! References:
         781             :     !
         782             :     !
         783             :     !-----------------------------------------------------------------------
         784             :
         785             :     use clubb_precision, only: &
         786             :         core_rknd ! Variable(s)
         787             :
         788             :     use constants_clubb, only: &
         789             :         max_mag_correlation ! Variable(s)
         790             :
         791             :     use constants_clubb, only: &
         792             :         one ! Variable(s)
         793             :
         794             :     use error_code, only: &
         795             :         clubb_at_least_debug_level  ! Procedure
         796             :
         797             :     implicit none
         798             :
         799             :     ! Input Variables
         800             :     integer, intent(in) :: &
         801             :       n_variables  ! number of variables in the correlation matrix [-]
         802             :
         803             :     real( kind = core_rknd ), dimension(n_variables,n_variables), intent(in) :: &
         804             :       corr_array ! correlation matrix [-]
         805             :
         806             :     ! Local Variables
         807             :     integer :: i, j ! Loop iterator
         808             :
         809             :     real( kind = core_rknd ), parameter :: &
         810             :     tol = 1.e-6_core_rknd ! Maximum acceptable tolerance for the difference of the diagonal
         811             :                           ! elements of corr_array to one
         812             :
         813             :     !-------------------- Begin code --------------------
         814             :
         815           0 :     if ( clubb_at_least_debug_level( 1 ) ) then
         816             :
         817           0 :        do i = 1, n_variables - 1
         818           0 :           do j = i+1, n_variables
         819             :
         820             :              ! Check if upper and lower triangle values are within the correlation boundaries
         821           0 :              if ( ( corr_array(i,j) < -max_mag_correlation ) &
         822             :                   .or. ( corr_array(i,j) > max_mag_correlation ) &
         823             :                   .or. ( corr_array(j,i) < -max_mag_correlation ) &
         824           0 :                   .or. ( corr_array(j,i) > max_mag_correlation ) ) &
         825           0 :              then
         826             :
         827           0 :                 error stop "Error: A value in the correlation matrix is out of range."
         828             :
         829             :              endif
         830             :
         831             :           enddo
         832             :        enddo
         833             :
         834             :     endif
         835             :
         836           0 :     if ( clubb_at_least_debug_level( 2 ) ) then
         837             :
         838           0 :        do i = 1, n_variables
         839             :           ! Check if the diagonal elements are one (up to a tolerance)
         840           0 :           if ( ( corr_array(i,i) > one + tol ) .or. (corr_array(i,i) < one - tol ) ) then
         841             :
         842           0 :              error stop "Error: Diagonal element(s) of the correlation matrix are unequal to one."
         843             :
         844             :           endif
         845             :        enddo
         846             :
         847             :     endif
         848             :
         849           0 :     return
         850             :
         851             :   end subroutine corr_array_assertion_checks
         852             :
         853             :
         854             : !-----------------------------------------------------------------------
         855           0 :   subroutine rearrange_corr_array( pdf_dim, iiPDF_w,    & ! Intent(in)
         856           0 :                                    corr_array,          & ! Intent(in)
         857           0 :                                    corr_array_swapped)    ! Intent(out)
         858             :     ! Description:
         859             :     !   This subroutine swaps the w-correlations to the first row if the input
         860             :     !   matrix is in the same order as the *_corr_array_cloud.in files. It swaps
         861             :     !   the rows back to the order of the *_corr_array_cloud.in files if the
         862             :     !   input matrix is already swapped (first row w-correlations).
         863             :     !
         864             :     ! References:
         865             :     !
         866             :     !-----------------------------------------------------------------------
         867             :
         868             :     use clubb_precision, only: &
         869             :         core_rknd ! Variable(s)
         870             :
         871             :     implicit none
         872             :
         873             :     intrinsic :: max, sqrt, transpose
         874             :
         875             :     ! Input Variables
         876             :     integer, intent(in) :: &
         877             :       pdf_dim, &  ! number of diagnosed correlations
         878             :       iiPDF_w
         879             :
         880             :     real( kind = core_rknd ), dimension(pdf_dim, pdf_dim), intent(in) :: &
         881             :       corr_array   ! Correlation matrix
         882             :
         883             :     ! Output variables
         884             :     real( kind = core_rknd ), dimension(pdf_dim, pdf_dim), intent(out) :: &
         885             :       corr_array_swapped   ! Swapped correlation matrix
         886             :
         887             :     ! Local Variables
         888             :     real( kind = core_rknd ), dimension(pdf_dim) :: &
         889           0 :       swap_array
         890             :
         891             :     !-------------------- Begin code --------------------
         892             :
         893             :     ! Swap the w-correlations to the first row for the prescribed correlations
         894           0 :     corr_array_swapped = corr_array
         895           0 :     swap_array = corr_array_swapped (:,1)
         896           0 :     corr_array_swapped(1:iiPDF_w, 1) = corr_array_swapped(iiPDF_w, iiPDF_w:1:-1)
         897           0 :     corr_array_swapped((iiPDF_w+1):pdf_dim, 1) = corr_array_swapped( &
         898           0 :                                                     (iiPDF_w+1):pdf_dim, iiPDF_w)
         899           0 :     corr_array_swapped(iiPDF_w, 1:iiPDF_w) = swap_array(iiPDF_w:1:-1)
         900           0 :     corr_array_swapped((iiPDF_w+1):pdf_dim, iiPDF_w) = swap_array((iiPDF_w+1):pdf_dim)
         901             :
         902           0 :     return
         903             :
         904             :   end subroutine rearrange_corr_array
         905             :   !-----------------------------------------------------------------------
         906             :
         907             :
         908             :   !-----------------------------------------------------------------------
         909             : !  subroutine set_w_corr( nz, pdf_dim, & ! Intent(in)
         910             : !                         corr_chi_w, corr_wrr, corr_wNr, corr_wNcn, &
         911             : !                         corr_array ) ! Intent(inout)
         912             : !
         913             : !    ! Description:
         914             : !    ! Set the first row of corr_array to the according w-correlations.
         915             : !
         916             : !    ! References:
         917             : !    ! clubb:ticket:514
         918             : !    !-----------------------------------------------------------------------
         919             : !
         920             : !    use clubb_precision, only: &
         921             : !      core_rknd ! Variable(s)
         922             : !
         923             : !    use array_index, only: &
         924             : !      iiPDF_w,           & ! Variable(s)
         925             : !      iiPDF_chi,         &
         926             : !      iiPDF_rr,          &
         927             : !      iiPDF_Nr,          &
         928             : !      iiPDF_Ncn
         929             : !
         930             : !    implicit none
         931             : !
         932             : !    ! Input Variables
         933             : !    integer, intent(in) :: &
         934             : !      nz,          & ! Number of model vertical grid levels
         935             : !      pdf_dim   ! Number of Variables to be diagnosed
         936             : !
         937             : !    real( kind = core_rknd ), dimension(nz), intent(in) :: &
         938             : !      corr_chi_w,       & ! Correlation between chi (s) & w (both components)         [-]
         939             : !      corr_wrr,      & ! Correlation between rr & w (both components)        [-]
         940             : !      corr_wNr,      & ! Correlation between Nr & w (both components)        [-]
         941             : !      corr_wNcn        ! Correlation between Ncn & w (both components)       [-]
         942             : !
         943             : !    ! Input/Output Variables
         944             : !    real( kind = core_rknd ), dimension(pdf_dim, pdf_dim, nz), &
         945             : !    intent(inout) :: &
         946             : !      corr_array
         947             : !
         948             : !    ! ----- Begin Code -----
         949             : !
         950             : !      corr_array(iiPDF_w, iiPDF_chi, :) = corr_chi_w
         951             : !      corr_array(iiPDF_w, iiPDF_rr, :) = corr_wrr
         952             : !      corr_array(iiPDF_w, iiPDF_Nr, :) = corr_wNr
         953             : !      corr_array(iiPDF_w, iiPDF_Ncn, :) = corr_wNcn
         954             : !
         955             : !  end subroutine set_w_corr
         956             :
         957             :   !=============================================================================
         958             : !  subroutine unpack_correlations( pdf_dim, corr_array, & ! Intent(in)
         959             : !                                  corr_w_chi, corr_wrr, corr_wNr, corr_wNcn, &
         960             : !                                  corr_chi_eta, corr_chi_rr, corr_chi_Nr, corr_chi_Ncn, &
         961             : !                                  corr_eta_rr, corr_eta_Nr, corr_eta_Ncn, corr_rrNr )
         962             : !
         963             : !    ! Description:
         964             : !
         965             : !    ! References:
         966             : !    !-----------------------------------------------------------------------
         967             :
         968             : !    use clubb_precision, only: &
         969             : !        core_rknd ! Variable(s)
         970             :
         971             : !    use array_index, only: &
         972             : !        iiPDF_w,        & ! Variable(s)
         973             : !        iiPDF_chi,      &
         974             : !        iiPDF_eta,      &
         975             : !        iiPDF_rr,       &
         976             : !        iiPDF_Nr,       &
         977             : !        iiPDF_Ncn
         978             :
         979             : !    implicit none
         980             :
         981             : !    intrinsic :: max, sqrt, transpose
         982             :
         983             : !    ! Input Variables
         984             : !    integer, intent(in) :: &
         985             : !      pdf_dim  ! number of diagnosed correlations
         986             :
         987             : !    real( kind = core_rknd ), dimension(pdf_dim, pdf_dim), intent(in) :: &
         988             : !      corr_array   ! Prescribed correlations
         989             :
         990             : !    ! Output variables
         991             : !    real( kind = core_rknd ), intent(out) :: &
         992             : !      corr_w_chi,     & ! Correlation between w and chi(s) (1st PDF component)     [-]
         993             : !      corr_wrr,    & ! Correlation between w and rr (1st PDF component) ip [-]
         994             : !      corr_wNr,    & ! Correlation between w and Nr (1st PDF component) ip [-]
         995             : !      corr_wNcn,   & ! Correlation between w and Ncn (1st PDF component)   [-]
         996             : !      corr_chi_eta,     & ! Correlation between chi(s) and eta(t) (1st PDF component)     [-]
         997             : !      corr_chi_rr,    & ! Correlation between chi(s) and rr (1st PDF component) ip [-]
         998             : !      corr_chi_Nr,    & ! Correlation between chi(s) and Nr (1st PDF component) ip [-]
         999             : !      corr_chi_Ncn,   & ! Correlation between chi(s) and Ncn (1st PDF component)   [-]
        1000             : !      corr_eta_rr,    & ! Correlation between eta(t) and rr (1st PDF component) ip [-]
        1001             : !      corr_eta_Nr,    & ! Correlation between eta(t) and Nr (1st PDF component) ip [-]
        1002             : !      corr_eta_Ncn,   & ! Correlation between (t) and Ncn (1st PDF component)   [-]
        1003             : !      corr_rrNr      ! Correlation between rr & Nr (1st PDF component) ip  [-]
        1004             :
        1005             :     ! ---- Begin Code ----
        1006             :
        1007             : !    corr_w_chi   = corr_array(iiPDF_w, iiPDF_chi)
        1008             : !    corr_wrr  = corr_array(iiPDF_w, iiPDF_rr)
        1009             : !    corr_wNr  = corr_array(iiPDF_w, iiPDF_Nr)
        1010             : !    corr_wNcn = corr_array(iiPDF_w, iiPDF_Ncn)
        1011             : !    corr_chi_eta   = corr_array(iiPDF_chi, iiPDF_eta)
        1012             : !    corr_chi_rr  = corr_array(iiPDF_chi, iiPDF_rr)
        1013             : !    corr_chi_Nr  = corr_array(iiPDF_chi, iiPDF_Nr)
        1014             : !    corr_chi_Ncn = corr_array(iiPDF_chi, iiPDF_Ncn)
        1015             : !    corr_eta_rr  = corr_array(iiPDF_eta, iiPDF_rr)
        1016             : !    corr_eta_Nr  = corr_array(iiPDF_eta, iiPDF_Nr)
        1017             : !    corr_eta_Ncn = corr_array(iiPDF_eta, iiPDF_Ncn)
        1018             : !    corr_rrNr = corr_array(iiPDF_rr, iiPDF_Nr)
        1019             :
        1020             : !    corr_w_chi   = corr_array(iiPDF_chi, iiPDF_w)
        1021             : !    corr_wrr  = corr_array(iiPDF_rr, iiPDF_w)
        1022             : !    corr_wNr  = corr_array(iiPDF_Nr, iiPDF_w)
        1023             : !    corr_wNcn = corr_array(iiPDF_Ncn, iiPDF_w)
        1024             : !    corr_chi_eta   = corr_array(iiPDF_eta, iiPDF_chi)
        1025             : !    corr_chi_rr  = corr_array(iiPDF_rr, iiPDF_chi)
        1026             : !    corr_chi_Nr  = corr_array(iiPDF_Nr, iiPDF_chi)
        1027             : !    corr_chi_Ncn = corr_array(iiPDF_Ncn, iiPDF_chi)
        1028             : !    corr_eta_rr  = corr_array(iiPDF_rr, iiPDF_eta)
        1029             : !    corr_eta_Nr  = corr_array(iiPDF_Nr, iiPDF_eta)
        1030             : !    corr_eta_Ncn = corr_array(iiPDF_Ncn, iiPDF_eta)
        1031             : !    corr_rrNr = corr_array(iiPDF_rr, iiPDF_Nr)
        1032             :
        1033             : !  end subroutine unpack_correlations
        1034             :
        1035             : !===============================================================================
        1036             :
        1037             : end module diagnose_correlations_module

Generated by: LCOV version 1.14