Skip to content
Failed

Console Output

Started by an SCM change
Obtained jenkins_tests/clubb_release_diff_test/Jenkinsfile from git https://github.com/larson-group/clubb.git
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /home/jenkins/workspace/clubb_release_diff_test
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Declarative: Checkout SCM)
[Pipeline] checkout
The recommended git tool is: git
Cloning the remote Git repository
Cloning repository https://github.com/larson-group/clubb.git
 > git init /home/jenkins/workspace/clubb_release_diff_test # timeout=10
Fetching upstream changes from https://github.com/larson-group/clubb.git
 > git --version # timeout=10
 > git --version # 'git version 2.30.2'
using GIT_ASKPASS to set credentials A token based key used by Jenkins to preform Github actions, created 6/21/2021
 > git fetch --tags --force --progress -- https://github.com/larson-group/clubb.git +refs/heads/*:refs/remotes/origin/* # timeout=10
 > git config remote.origin.url https://github.com/larson-group/clubb.git # timeout=10
 > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
Avoid second fetch
 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
Checking out Revision 6de84c3d28a538d620009cbe3d98a634782820be (refs/remotes/origin/master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 6de84c3d28a538d620009cbe3d98a634782820be # timeout=10
Commit message: "Major overhaul of run_bindiff_all.py"
 > git rev-list --no-walk 59786b03dd4afb944e5e9284a2b207220122dbb9 # timeout=10
[Pipeline] }
[Pipeline] // stage
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Checkout Clubb and Clubb_Release)
[Pipeline] sh
+ git clone https://github.com/larson-group/clubb.git
Cloning into 'clubb'...
+ git clone https://github.com/larson-group/clubb_release.git
Cloning into 'clubb_release'...
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Diff)
[Pipeline] sh
+ diff --exclude=.git --exclude=version_clubb_core.txt --exclude=version_silhs.txt -r clubb clubb_release
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/input/stats/all_stats.in clubb_release/input/stats/all_stats.in
16c16
< 'thlm', 'thvm', 'rtm', 'rcm', 'rvm', 'um', 'vm', 'um_ref', 'vm_ref', 'wm_zt',
---
> 'thlm', 'thvm', 'rtm', 'rcm', 'rvm', 'um', 'vm', 'um_ref','vm_ref','wm_zt',
19,20c19,20
< 'rel_humidity', 'wp3', 'thlp3', 'rtp3', 'wpthlp2', 'wp2thlp', 'wprtp2', 'wp2rtp', 'Skw_zt',
< 'Skthl_zt', 'Skrt_zt',
---
> 'rel_humidity', 'wp3','thlp3','rtp3', 'wpthlp2', 'wp2thlp', 'wprtp2', 'wp2rtp', 'Skw_zt',
> 'Skthl_zt','Skrt_zt',
32c32
< 'rtm_forcing', 'rtm_sdmp', 'rtm_mc', 'rtm_pd', 'rvm_mc', 'rcm_mc', 'rcm_sd_mg_morr',
---
> 'rtm_forcing', 'rtm_sdmp','rtm_mc', 'rtm_pd', 'rvm_mc', 'rcm_mc', 'rcm_sd_mg_morr',
34c34
< 'thlm_forcing', 'thlm_sdmp', 'thlm_mc',
---
> 'thlm_forcing', 'thlm_sdmp','thlm_mc', 
136c136
< 'up2', 'vp2', 'Skw_zm', 'Skthl_zm', 'Skrt_zm',
---
> 'up2', 'vp2', 'Skw_zm', 'Skthl_zm','Skrt_zm',
142c142
< 'gamma_Skw_fnc', 'coef_wp4_implicit', 'C6rt_Skw_fnc', 'C6thl_Skw_fnc', 'C6_term',
---
> 'gamma_Skw_fnc', 'coef_wp4_implicit', 'C6rt_Skw_fnc', 'C6thl_Skw_fnc',
179c179
< 'wpsclrprtp', 'wpsclrpthlp', 'wpedsclrp',  'stability_correction',
---
> 'wpsclrprtp', 'wpsclrpthlp', 'wpedsclrp',  'stability_correction', 'Richardson_num',
181,182c181
< 'bv_freq_sqd', 'bv_freq_sqd_splat', 'bv_freq_sqd_mixed', 'bv_freq_sqd_moist', 'bv_freq_sqd_dry',
< 'shear_sqd', 'invrs_tau_zm', 'invrs_tau_xp2_zm', 'invrs_tau_wp2_zm',
---
> 'bv_freq_sqd', 'bv_freq_sqd_splat', 'shear_sqd', 'invrs_tau_zm', 'invrs_tau_xp2_zm', 'invrs_tau_wp2_zm',
184c183
< 'invrs_tau_sfc', 'invrs_tau_shear', 'Ri_zm',
---
> 'invrs_tau_sfc', 'invrs_tau_shear', 'sqrt_Ri_zm',
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/input/stats/standard_stats.in clubb_release/input/stats/standard_stats.in
16c16
< 'thlm', 'thvm', 'rtm', 'rcm', 'rvm', 'um', 'vm', 'um_ref', 'vm_ref', 'wm_zt',
---
> 'thlm', 'thvm', 'rtm', 'rcm', 'rvm', 'um', 'vm', 'um_ref','vm_ref','wm_zt',
18,24c18,23
< 'rcm_in_cloud', 'p_in_Pa', 'exner', 'rho_ds_zt', 'thv_ds_zt', 'Lscale', 'T_in_K',
< 'rel_humidity', 'wp3', 'thlp3', 'rtp3', 'wpthlp2', 'wp2thlp', 'wprtp2', 'wp2rtp', 'Skw_zt',
< 'Skthl_zt', 'Skrt_zt',
< 'Lscale_up', 'Lscale_down', 'tau_zt', 'Kh_zt', 'wp2thvp', 'wp2rcp', 'wp2hmp',
< 
< 'wprtpthlp', 'wpup2', 'wpvp2', 'rc_coef', 'Lscale_pert_1', 'Lscale_pert_2',
< 'sigma_sqd_w_zt', 'rho', 'radht', 'radht_LW', 'radht_SW',
---
> 'rcm_in_cloud', 'p_in_Pa', 'exner', 'rho_ds_zt', 'thv_ds_zt', 'Lscale',
> 'Lscale_pert_1', 'Lscale_pert_2', 'T_in_K', 'rel_humidity', 'wp3','thlp3','rtp3','wpthlp2',
> 'wp2thlp', 'wprtp2', 'wp2rtp', 'Skw_zt', 'Skthl_zt','Skrt_zt', 'Lscale_up', 'Lscale_down', 'tau_zt',
> 'Kh_zt', 'wp2thvp', 'wp2rcp', 'wp2hmp', 'wprtpthlp', 'wpup2', 'wpvp2', 'rc_coef',
> 'sigma_sqd_w_zt', 'rho',
> 'radht', 'radht_LW', 'radht_SW',
29c28,29
< 'precip_rate_zt', 'rsm', 'rim', 'rgm',
---
> 'precip_rate_zt', 
> 'rsm', 'rim', 'rgm',
32c32
< 'rtm_forcing', 'rtm_sdmp', 'rtm_mc', 'rtm_pd', 'rvm_mc', 'rcm_mc', 'rcm_sd_mg_morr',
---
> 'rtm_forcing', 'rtm_sdmp','rtm_mc', 'rtm_pd', 'rvm_mc', 'rcm_mc', 'rcm_sd_mg_morr',
34c34
< 'thlm_forcing', 'thlm_sdmp', 'thlm_mc', 
---
> 'thlm_forcing', 'thlm_sdmp','thlm_mc', 
83,84c83
< 'mu_hm_i', 'mu_Ncn_i',
< 'sigma_hm_i', 'sigma_Ncn_i',
---
> 'mu_hm_i', 'mu_Ncn_i', 'sigma_hm_i', 'sigma_Ncn_i',
89,90d87
< 
< 
94d90
< 
103c99
< 'NIACRS', 'NGRACS', 'NSMLTS', 'NSAGG', 'NPRCI', 'NSCNG', 'NSUBS', 'PRC', 'PRA',
---
> 'NIACRS', 'NGRACS', 'NSMLTS', 'NSAGG', 'NPRCI', 'NSCNG','NSUBS', 'PRC', 'PRA', 
124,126c120
< 'lh_Nrm_src_adj', 'lh_Nrm_evap_adj', 'lh_precip_frac', 'lh_mixt_frac',
< 
< 'lh_m_vol_rad_rain',
---
> 'lh_Nrm_src_adj', 'lh_Nrm_evap_adj', 'lh_precip_frac', 'lh_mixt_frac', 'lh_m_vol_rad_rain',
136c130
< 'up2', 'vp2', 'Skw_zm', 'Skthl_zm', 'Skrt_zm',
---
> 'up2', 'vp2', 'Skw_zm', 'Skthl_zm','Skrt_zm',
142c136
< 'gamma_Skw_fnc', 'coef_wp4_implicit', 'C6rt_Skw_fnc', 'C6thl_Skw_fnc', 'C6_term',
---
> 'gamma_Skw_fnc', 'coef_wp4_implicit', 'C6rt_Skw_fnc', 'C6thl_Skw_fnc',
145c139
< 'em', 'mean_w_up', 'mean_w_down', 'shear', 'wp3_zm', 'thlp3_zm', 'rtp3_zm',
---
> 'em', 'mean_w_up', 'mean_w_down', 'shear', 'wp3_zm','thlp3_zm','rtp3_zm',
153,155c147,148
< 'wp2_pr3', 'wp2_pr_dfsn', 'wp2_dp1', 'wp2_dp2', 'wp2_sdmp',
< 'wp2_cl', 'wp2_pd', 'wp2_sf', 'wp2_splat',
< 'vp2_bt', 'vp2_ma', 'vp2_ta', 'vp2_tp', 'vp2_dp1', 'vp2_dp2',
---
> 'wp2_pr3', 'wp2_dp1', 'wp2_dp2', 'wp2_sdmp', 'wp2_cl', 'wp2_pd', 'wp2_sf', 'wp2_splat',
> 'wp2_pr_dfsn', 'vp2_bt', 'vp2_ma', 'vp2_ta', 'vp2_tp', 'vp2_dp1', 'vp2_dp2',
163,165c156,158
< 'wprtp_bt', 'wprtp_ma', 'wprtp_ta', 'wprtp_tp', 'wprtp_ac',
< 'wprtp_bp', 'wprtp_pr1', 'wprtp_pr2', 'wprtp_pr3', 'wprtp_dp1',
< 'wprtp_mfl', 'wprtp_cl', 'wprtp_sicl', 'wprtp_pd', 'wprtp_forcing', 'wprtp_mc',
---
> 'wprtp_bt', 'wprtp_ma', 'wprtp_ta', 'wprtp_tp', 'wprtp_ac', 'wprtp_bp',
> 'wprtp_pr1', 'wprtp_pr2', 'wprtp_pr3', 'wprtp_dp1', 'wprtp_mfl',
> 'wprtp_cl', 'wprtp_sicl', 'wprtp_pd', 'wprtp_forcing', 'wprtp_mc',
169,174c162,167
< 'rtp2_bt', 'rtp2_ma', 'rtp2_ta', 'rtp2_tp',
< 'rtp2_dp1', 'rtp2_dp2', 'rtp2_cl', 'rtp2_pd', 'rtp2_sf', 'rtp2_forcing', 'rtp2_mc',
< 'thlp2_bt', 'thlp2_ma', 'thlp2_ta', 'thlp2_tp',
< 'thlp2_dp1', 'thlp2_dp2', 'thlp2_cl', 'thlp2_pd', 'thlp2_sf', 'thlp2_forcing', 'thlp2_mc',
< 'rtpthlp_bt', 'rtpthlp_ma', 'rtpthlp_ta', 'rtpthlp_tp1', 'rtpthlp_tp2',
< 'rtpthlp_dp1', 'rtpthlp_dp2', 'rtpthlp_cl', 'rtpthlp_sf', 'rtpthlp_forcing', 'rtpthlp_mc',
---
> 'rtp2_bt', 'rtp2_ma', 'rtp2_ta', 'rtp2_tp', 'rtp2_dp1', 'rtp2_dp2',
> 'rtp2_cl', 'rtp2_pd', 'rtp2_sf', 'rtp2_forcing', 'rtp2_mc',
> 'thlp2_bt', 'thlp2_ma', 'thlp2_ta', 'thlp2_tp', 'thlp2_dp1', 'thlp2_dp2',
> 'thlp2_cl', 'thlp2_pd', 'thlp2_sf', 'thlp2_forcing', 'thlp2_mc',
> 'rtpthlp_bt', 'rtpthlp_ma', 'rtpthlp_ta', 'rtpthlp_tp1', 'rtpthlp_tp2', 'rtpthlp_dp1',
> 'rtpthlp_dp2', 'rtpthlp_cl', 'rtpthlp_sf', 'rtpthlp_forcing', 'rtpthlp_mc',
176,182c169,170
< 'wpthlp_mfl_min', 'wpthlp_mfl_max', 'wprtp_mfl_min', 'wprtp_mfl_max',
< 
< 
< 'stability_correction',
< 
< 'bv_freq_sqd', 'bv_freq_sqd_splat', 'bv_freq_sqd_mixed', 'bv_freq_sqd_moist', 'bv_freq_sqd_dry',
< 'shear_sqd', 'invrs_tau_zm', 'invrs_tau_xp2_zm', 'invrs_tau_wp2_zm',
---
> 'wpthlp_mfl_min', 'wpthlp_mfl_max', 'wprtp_mfl_min', 'wprtp_mfl_max', 'stability_correction',
> 'bv_freq_sqd', 'bv_freq_sqd_splat', 'shear_sqd', 'invrs_tau_zm', 'invrs_tau_xp2_zm', 'invrs_tau_wp2_zm',
184c172
< 'invrs_tau_sfc', 'invrs_tau_shear', 'Ri_zm',
---
> 'invrs_tau_sfc', 'invrs_tau_shear', 'Richardson_num',
209,212c197
< 'rtm_spur_src', 'thlm_spur_src',
< 
< 
< 'rs_sd_morr_int',
---
> 'rtm_spur_src', 'thlm_spur_src', 'rs_sd_morr_int',
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/input/tunable_parameters_Lscale/configurable_model_flags.in clubb_release/input/tunable_parameters_Lscale/configurable_model_flags.in
3,5c3
< ipdf_call_placement          = 2
< penta_solve_method           = 1
< tridiag_solve_method         = 1
---
> ipdf_call_placement          = 1
7,55c5,47
< 
< l_godunov_upwind_wpxp_ta          = .false.,
< l_upwind_xpyp_ta                  = .true.,
< l_godunov_upwind_xpyp_ta          = .false.,
< l_upwind_xm_ma                    = .true.,
< l_quintic_poly_interp             = .false.,
< l_tke_aniso                       = .true.,
< l_vert_avg_closure                = .false.,
< l_standard_term_ta                = .false.,
< l_partial_upwind_wp3              = .false.,
< l_use_cloud_cover                 = .false.,
< l_rcm_supersat_adj                = .true.,
< l_damp_wp3_Skw_squared            = .true.,
< l_min_wp2_from_corr_wx            = .true.,
< l_min_xp2_from_corr_wx            = .true.,
< l_C2_cloud_frac                   = .false.,
< l_predict_upwp_vpwp               = .true.,
< l_diag_Lscale_from_tau            = .false.,
< l_stability_correct_tau_zm        = .false.,
< l_damp_wp2_using_em               = .true.,
< l_use_C7_Richardson               = .true.,
< l_use_precip_frac                 = .true.,
< l_do_expldiff_rtm_thlm            = .false.,
< l_use_C11_Richardson              = .false.,
< l_use_shear_Richardson            = .false.,
< l_prescribed_avg_deltaz           = .false.,
< l_diffuse_rtm_and_thlm            = .false.,
< l_stability_correct_Kh_N2_zm      = .false.,
< l_trapezoidal_rule_zt             = .false.,
< l_trapezoidal_rule_zm             = .false.,
< l_call_pdf_closure_twice          = .false.,
< l_Lscale_plume_centered           = .false.,
< l_brunt_vaisala_freq_moist        = .false.,
< l_use_thvm_in_bv_freq             = .false.,
< l_lmm_stepping                    = .false.,
< l_e3sm_config                     = .false.,
< l_vary_convect_depth              = .false.,
< l_use_tke_in_wp3_pr_turb_term     = .true.,
< l_use_tke_in_wp2_wp3_K_dfsn       = .false.,
< l_use_wp3_lim_with_smth_Heaviside = .false.,
< l_smooth_Heaviside_tau_wpxp       = .false.,
< l_modify_limiters_for_cnvg_test   = .false.,
< l_enable_relaxed_clipping         = .false.,
< l_linearize_pbl_winds             = .false.,
< l_mono_flux_lim_thlm              = .true.,
< l_mono_flux_lim_rtm               = .true.,
< l_mono_flux_lim_um                = .true.,
< l_mono_flux_lim_vm                = .true.,
< l_mono_flux_lim_spikefix          = .true.
---
> l_godunov_upwind_wpxp_ta     = .false.,
> l_upwind_xpyp_ta             = .true.,
> l_godunov_upwind_xpyp_ta     = .false.,
> l_upwind_xm_ma               = .true.,
> l_quintic_poly_interp        = .false.,
> l_tke_aniso                  = .true.,
> l_vert_avg_closure           = .false.,
> l_standard_term_ta           = .false.,
> l_partial_upwind_wp3         = .false.,
> l_use_cloud_cover            = .false.,
> l_rcm_supersat_adj           = .true.,
> l_damp_wp3_Skw_squared       = .true.,
> l_min_wp2_from_corr_wx       = .true.,
> l_min_xp2_from_corr_wx       = .true.,
> l_C2_cloud_frac              = .false.,
> l_predict_upwp_vpwp          = .true.,
> l_diag_Lscale_from_tau       = .false.,
> l_stability_correct_tau_zm   = .false.,
> l_damp_wp2_using_em          = .true.,
> l_use_C7_Richardson          = .true.,
> l_use_precip_frac            = .true.,
> l_do_expldiff_rtm_thlm       = .false.,
> l_use_C11_Richardson         = .false.,
> l_use_shear_Richardson       = .false.,
> l_prescribed_avg_deltaz      = .false.,
> l_diffuse_rtm_and_thlm       = .false.,
> l_stability_correct_Kh_N2_zm = .false.,
> l_trapezoidal_rule_zt        = .false.,
> l_trapezoidal_rule_zm        = .false.,
> l_call_pdf_closure_twice     = .false.,
> l_Lscale_plume_centered      = .false.,
> l_brunt_vaisala_freq_moist   = .false.,
> l_use_thvm_in_bv_freq        = .false.,
> l_lmm_stepping               = .false.,
> l_e3sm_config                = .false.,
> l_vary_convect_depth         = .false.,
> l_use_tke_in_wp3_pr_turb_term = .false.,
> l_use_tke_in_wp2_wp3_K_dfsn  = .false.
> l_mono_flux_lim_thlm         = .true.,
> l_mono_flux_lim_rtm          = .true.,
> l_mono_flux_lim_um           = .true.,
> l_mono_flux_lim_vm           = .true.,
> l_mono_flux_lim_spikefix     = .true.
72,75d63
< /
< 
< &configurable_multi_column_nl
< num_standalone_columns = 1
Only in clubb/postprocessing/pyplotgen/config: VariableGroupBaseBudgetsLumpedBuoy.py
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupBaseBudgets.py clubb_release/postprocessing/pyplotgen/config/VariableGroupBaseBudgets.py
18c18
<                  priority_vars=False, background_rcm=False, background_rcm_folder=None):
---
>                  priority_vars=False):
538,539c538
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupBaseBudgetsSamStyle.py clubb_release/postprocessing/pyplotgen/config/VariableGroupBaseBudgetsSamStyle.py
18c18
<                  priority_vars=False, background_rcm=False, background_rcm_folder=None):
---
>                  priority_vars=False):
376,377c376
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupBase.py clubb_release/postprocessing/pyplotgen/config/VariableGroupBase.py
22,23c22
<                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False,
<                  background_rcm=False, background_rcm_folder=None):
---
>                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False):
685,686c684
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupCorrelations.py clubb_release/postprocessing/pyplotgen/config/VariableGroupCorrelations.py
16c16
<                  priority_vars=False, background_rcm=False, background_rcm_folder=None):
---
>                  priority_vars=False):
161,162c161
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupIceMP.py clubb_release/postprocessing/pyplotgen/config/VariableGroupIceMP.py
14,15c14,15
<     def __init__(self, case, clubb_datasets=None, sam_benchmark_dataset=None, sam_datasets=None,
<                  coamps_benchmark_dataset=None, wrf_benchmark_dataset=None, 
---
>     def __init__(self, case, clubb_datasets=None, sam_benchmark_dataset=None, sam_datasets=None, coamps_benchmark_dataset=None,
>                   wrf_benchmark_dataset=None, 
17,18c17
<                  e3sm_datasets=None, wrf_datasets=None, priority_vars=False, background_rcm=False,
<                  background_rcm_folder=None):
---
>                  e3sm_datasets=None, wrf_datasets=None, priority_vars=False):
151,152c150
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupKKMP.py clubb_release/postprocessing/pyplotgen/config/VariableGroupKKMP.py
13,14c13,14
<     def __init__(self, case, clubb_datasets=None, sam_benchmark_dataset=None,
<                  coamps_benchmark_dataset=None, r408_dataset=None, wrf_benchmark_dataset=None, 
---
>     def __init__(self, case, clubb_datasets=None, sam_benchmark_dataset=None, coamps_benchmark_dataset=None, r408_dataset=None,
>                  wrf_benchmark_dataset=None, 
16,17c16
<                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False,
<                  background_rcm=False, background_rcm_folder=None):
---
>                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False):
69,70c68
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupLiquidMP.py clubb_release/postprocessing/pyplotgen/config/VariableGroupLiquidMP.py
16,17c16
<                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None,priority_vars=False,
<                  background_rcm=False, background_rcm_folder=None):
---
>                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None,priority_vars=False):
151,152c150
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupNondimMoments.py clubb_release/postprocessing/pyplotgen/config/VariableGroupNondimMoments.py
21,22c21
<                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False,
<                  background_rcm=False, background_rcm_folder=None):
---
>                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False):
215,216c214
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupNormalizedVariations.py clubb_release/postprocessing/pyplotgen/config/VariableGroupNormalizedVariations.py
17,18c17
<                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False,
<                  background_rcm=False, background_rcm_folder=None):
---
>                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False):
76,77c75
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupSamBudgets.py clubb_release/postprocessing/pyplotgen/config/VariableGroupSamBudgets.py
18c18
<                  priority_vars=False, background_rcm=False, background_rcm_folder=None):
---
>                  priority_vars=False):
984,985c984
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupSamMultilineProfiles.py clubb_release/postprocessing/pyplotgen/config/VariableGroupSamMultilineProfiles.py
18,19c18
<                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False,
<                  background_rcm=False, background_rcm_folder=None):
---
>                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False):
451,452c450
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupSamProfiles.py clubb_release/postprocessing/pyplotgen/config/VariableGroupSamProfiles.py
18,19c18
<                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False,
<                  background_rcm=False, background_rcm_folder=None):
---
>                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False):
1204,1205c1203
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupScalars.py clubb_release/postprocessing/pyplotgen/config/VariableGroupScalars.py
16,17c16
<                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False,
<                  background_rcm=False, background_rcm_folder=None):
---
>                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False):
81,82c80
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupSubcolumns.py clubb_release/postprocessing/pyplotgen/config/VariableGroupSubcolumns.py
16,17c16
<                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None,
<                  background_rcm=False, background_rcm_folder=False):
---
>                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None):
186,187c185
<                          cam_datasets=cam_datasets, sam_datasets=sam_datasets, wrf_datasets=wrf_datasets,
<                          background_rcm=background_rcm, background_rcm_folder=background_rcm_folder)
---
>                          cam_datasets=cam_datasets, sam_datasets=sam_datasets, wrf_datasets=wrf_datasets)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupTaus.py clubb_release/postprocessing/pyplotgen/config/VariableGroupTaus.py
16,17c16
<                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False,
<                  background_rcm=False, background_rcm_folder=None):
---
>                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False):
37,81d35
<                 'clubb': ['bv_freq_sqd_mixed'],
<                 'sam': [],
<                 'coamps': [],
<                 'r408': ['bv_freq_sqd_mixed'],
<                 'hoc': ['bv_freq_sqd_mixed'],
<                 'e3sm': ['bv_freq_sqd_mixed'],
<                 'cam': ['bv_freq_sqd_mixed'],
<                 'wrf': ['bv_freq_sqd_mixed'],
<                 },
<                 'title': 'Mixed Brunt-Vaisala frequency squared',
<                 'axis_title': 'bv_freq_sqd_mixed [$\mathrm{1/s^2}$]',
<                 'sci_scale': 0,
<             },
<             {'var_names':
<                 {
<                 'clubb': ['bv_freq_sqd_moist'],
<                 'sam': [],
<                 'coamps': [],
<                 'r408': ['bv_freq_sqd_moist'],
<                 'hoc': ['bv_freq_sqd_moist'],
<                 'e3sm': ['bv_freq_sqd_moist'],
<                 'cam': ['bv_freq_sqd_moist'],
<                 'wrf': ['bv_freq_sqd_moist'],
<                 },
<                 'title': 'Brunt-Vaisala frequency squared in moist air',
<                 'axis_title': 'bv_freq_sqd_moist [$\mathrm{1/s^2}$]',
<                 'sci_scale': 0,
<             },
<             {'var_names':
<                 {
<                 'clubb': ['bv_freq_sqd_dry'],
<                 'sam': [],
<                 'coamps': [],
<                 'r408': ['bv_freq_sqd_dry'],
<                 'hoc': ['bv_freq_sqd_dry'],
<                 'e3sm': ['bv_freq_sqd_dry'],
<                 'cam': ['bv_freq_sqd_dry'],
<                 'wrf': ['bv_freq_sqd_dry'],
<                 },
<                 'title': 'Brunt-Vaisala frequency squared in dry air',
<                 'axis_title': 'bv_freq_sqd_dry [$\mathrm{1/s^2}$]',
<                 'sci_scale': 0,
<             },
<             {'var_names':
<                 {
171,239d124
<             {'var_names':
<                 {
<                 'clubb': ['C6_term'],
<                 'sam': ['C6_TERM'], # Dummy
<                 'coamps': ['C6_term'], # Dummy
<                 'r408': ['C6_term'], # Dummy
<                 'hoc': ['C6_term'], # Dummy
<                 'e3sm': ['C6_term'], # Dummy
<                 'cam': ['C6_term'], # Dummy
<                 'wrf': ['C6_term'], # Dummy
<                 },
<              'sci_scale': 0,
<             },
<             {'var_names':
<                 {
<                 'clubb': ['C1_Skw_fnc'],
<                 'sam': ['C1_SKW_FNC'], # Dummy
<                 'coamps': ['C1_Skw_fnc'], # Dummy
<                 'r408': ['C1_Skw_fnc'], # Dummy
<                 'hoc': ['C1_Skw_fnc'], # Dummy
<                 'e3sm': ['C1_Skw_fnc'], # Dummy
<                 'cam': ['C1_Skw_fnc'], # Dummy
<                 'wrf': ['C1_Skw_fnc'], # Dummy
<                 },
<                 'title': 'C1_Skw_fnc',
<                 'sci_scale': 0,
<             },
<             {'var_names':
<                 {
<                 'clubb': ['C6rt_Skw_fnc'],
<                 'sam': ['C6RT_SKW_FNC'], # Dummy
<                 'coamps': ['C6rt_Skw_fnc'], # Dummy
<                 'r408': ['C6rt_Skw_fnc'], # Dummy
<                 'hoc': ['C6rt_Skw_fnc'], # Dummy
<                 'e3sm': ['C6rt_Skw_fnc'], # Dummy
<                 'cam': ['C6rt_Skw_fnc'], # Dummy
<                 'wrf': ['C6rt_Skw_fnc'], # Dummy
<                 },
<                 'title': 'C6rt_Skw_fnc',
<                 'sci_scale': 0,
<             },
<             {'var_names':
<                 {
<                 'clubb': ['C6thl_Skw_fnc'],
<                 'sam': ['C6THL_SKW_FNC'], # Dummy
<                 'coamps': ['C6thl_Skw_fnc'], # Dummy
<                 'r408': ['C6thl_Skw_fnc'], # Dummy
<                 'hoc': ['C6thl_Skw_fnc'], # Dummy
<                 'e3sm': ['C6thl_Skw_fnc'], # Dummy
<                 'cam': ['C6thl_Skw_fnc'], # Dummy
<                 'wrf': ['C6thl_Skw_fnc'], # Dummy
<                 },
<                 'title': 'C6thl_Skw_fnc',
<                 'sci_scale': 0,
<             },
<             {'var_names':
<                 {
<                 'clubb': ['C7_Skw_fnc'],
<                 'sam': ['C7_SKW_FNC'], # Dummy
<                 'coamps': ['C7_Skw_fnc'], # Dummy
<                 'r408': ['C7_Skw_fnc'], # Dummy
<                 'hoc': ['C7_Skw_fnc'], # Dummy
<                 'e3sm': ['C7_Skw_fnc'], # Dummy
<                 'cam': ['C7_Skw_fnc'], # Dummy
<                 'wrf': ['C7_Skw_fnc'], # Dummy
<                 },
<                 'title': 'C7_Skw_fnc',
<                 'sci_scale': 0,
<             },
248,249c133
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/config/VariableGroupWs.py clubb_release/postprocessing/pyplotgen/config/VariableGroupWs.py
16,17c16
<                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False,
<                  background_rcm=False, background_rcm_folder=None):
---
>                  e3sm_datasets=None, sam_datasets=None, wrf_datasets=None, priority_vars=False):
211,212c210
<                          priority_vars=priority_vars, background_rcm=background_rcm,
<                          background_rcm_folder=background_rcm_folder)
---
>                          priority_vars=priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/pyplotgen.py clubb_release/postprocessing/pyplotgen/pyplotgen.py
48,50c48,50
<                  plot_budgets=False, bu_morr=False, lumped_buoy_budgets=False, background_rcm=False, diff=None,
<                  show_alphabetic_id=False, time_height=False, animation=None, samstyle=False, disable_multithreading=False,
<                  pdf=False, pdf_filesize_limit=None, plot_subcolumns=False, image_extension=".png"):
---
>                  plot_budgets=False, bu_morr=False, diff=None, show_alphabetic_id=False,
>                  time_height=False, animation=None, samstyle=False, disable_multithreading=False, pdf=False,
>                  pdf_filesize_limit=None, plot_subcolumns=False, image_extension=".png"):
88,89d87
<         :param lumped_buoy_budgets: Lump together wpxp_bp and wpxp_pr3 terms in CLUBB's budgets
<         :param background_rcm: Show a height-based "contour" plot of time-averaged rcm behind CLUBB profiles.
114,115d111
<         self.lumped_buoy_budgets = lumped_buoy_budgets
<         self.background_rcm = background_rcm
422,424c418,420
<                                                   plot_subcolumns=self.plot_subcolumns, lumped_buoy_budgets=self.lumped_buoy_budgets,
<                                                   background_rcm=self.background_rcm, image_extension=self.image_extension,
<                                                   total_panels_to_plot=0, priority_vars=self.priority_vars)
---
>                                                   plot_subcolumns=self.plot_subcolumns,
>                                                   image_extension=self.image_extension, total_panels_to_plot=0,
>                                                   priority_vars=self.priority_vars)
646,649d641
<     parser.add_argument("--lumped-buoy-budgets", help="Lump together wpxp_bp and wpxp_pr3 terms in CLUBB's budgets.",
<                         action="store_true")
<     parser.add_argument("--background-rcm", help="Show a height-based 'contour' plot of time-averaged rcm behind CLUBB profiles.",
<                         action="store_true")
803,806c795,798
<                           no_legends=args.no_legends, plot_budgets=args.plot_budgets, bu_morr=args.bu_morr,
<                           lumped_buoy_budgets=args.lumped_buoy_budgets, background_rcm=args.background_rcm, diff=args.diff,
<                           show_alphabetic_id=args.show_alphabetic_id, time_height=args.time_height_plots, animation=args.movies,
<                           samstyle=args.sam_style_budgets, disable_multithreading=args.disable_multithreading, pdf=args.pdf,
---
>                           no_legends=args.no_legends, plot_budgets=args.plot_budgets,
>                           bu_morr=args.bu_morr, diff=args.diff, show_alphabetic_id=args.show_alphabetic_id,
>                           time_height=args.time_height_plots, animation=args.movies, samstyle=args.sam_style_budgets,
>                           disable_multithreading=args.disable_multithreading, pdf=args.pdf,
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/README.md clubb_release/postprocessing/pyplotgen/README.md
52,53d51
< | --lumped-buoy-budgets | Lump together wpxp_bp and wpxp_pr3 terms in CLUBB's budgets |
< | --background_rcm | Show a height-based "contour" plot of time-averaged rcm behind CLUBB profiles |
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/src/CaseGallerySetup.py clubb_release/postprocessing/pyplotgen/src/CaseGallerySetup.py
11d10
< from config.VariableGroupBaseBudgetsLumpedBuoy import VariableGroupBaseBudgetsLumpedBuoy
33,35c32,34
<                  plot_les=False, plot_budgets=False, lumped_buoy_budgets=False, background_rcm=False, plot_r408=False,
<                  plot_hoc=False, e3sm_folders=[], cam_folders=[], time_height=False, animation=None, samstyle=False,
<                  plot_subcolumns=False, image_extension=".png", total_panels_to_plot=0, priority_vars=False):
---
>                  plot_les=False, plot_budgets=False, plot_r408=False, plot_hoc=False, e3sm_folders=[], cam_folders=[],
>                  time_height=False, animation=None, samstyle=False, plot_subcolumns=False, image_extension=".png",
>                  total_panels_to_plot=0, priority_vars=False):
49,50d47
<         :param lumped_buoy_budgets: If True and if plot_budgets in true, wpxp_bp and wpxp_pr3 will be lumped into one budget term
<         :param background_rcm: Show a height-based "contour" plot of time-averaged rcm behind CLUBB profiles.
69,70d65
<         self.lumped_buoy_budgets = lumped_buoy_budgets
<         self.background_rcm = background_rcm
98d92
<             self.lumped_buoy_budgets = False
117,122d110
<         # Preserve the CLUBB folder listed first to use for background rcm plots.
<         if len(clubb_folders) != 0:
<             self.background_rcm_folder = clubb_folders[0]
<         else:
<             self.background_rcm_folder = None
< 
172,177c160,161
<                             if not self.lumped_buoy_budgets:
<                                 budget_variables = VariableGroupBaseBudgets(self, priority_vars=self.priority_vars,
<                                                              clubb_datasets={folder_name:self.clubb_datasets[input_folder]})
<                             else:
<                                 budget_variables = VariableGroupBaseBudgetsLumpedBuoy(self, priority_vars=self.priority_vars,
<                                                              clubb_datasets={folder_name:self.clubb_datasets[input_folder]})
---
>                             budget_variables = VariableGroupBaseBudgets(self, priority_vars=self.priority_vars,
>                                                          clubb_datasets={folder_name:self.clubb_datasets[input_folder]})
250,251c234
<                                   e3sm_datasets=self.e3sm_datasets, cam_datasets=self.cam_file, priority_vars=self.priority_vars,
<                                   background_rcm=self.background_rcm, background_rcm_folder=self.background_rcm_folder)
---
>                                   e3sm_datasets=self.e3sm_datasets, cam_datasets=self.cam_file, priority_vars=self.priority_vars)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/src/Panel.py clubb_release/postprocessing/pyplotgen/src/Panel.py
34,36c34,35
<     def __init__(self, plots, bkgrnd_rcm_tavg, altitude_bkgrnd_rcm, start_alt_idx, end_alt_idx,
<                  panel_type="profile", title="Unnamed panel", dependent_title="dependent variable", sci_scale = None,
<                  centered = False, background_rcm = False):
---
>     def __init__(self, plots, panel_type="profile", title="Unnamed panel", dependent_title="dependent variable",
>                  sci_scale = None, centered = False):
41,44d39
<         :param bkgrnd_rcm_tavg: Time-average vertical profile of rcm that can be displayed in the background of plots.
<         :param altitude_bkgrnd_rcm: Heights corresponding with the background rcm profile.
<         :param start_alt_idx: Index of bkgrnd_rcm_tavg that corresponds with bottom of the plot.
<         :param end_alt_idx: Index of bkgrnd_rcm_tavg that corresponds with top of the plot.
52d46
<         :param background_rcm: Show a height-based "contour" plot of time-averaged rcm behind CLUBB profiles.
56,59d49
<         self.bkgrnd_rcm_tavg = bkgrnd_rcm_tavg
<         self.altitude_bkgrnd_rcm = altitude_bkgrnd_rcm
<         self.start_alt_idx = start_alt_idx
<         self.end_alt_idx = end_alt_idx
67d56
<         self.background_rcm = background_rcm
236,239c225
<             if not self.background_rcm:
<                 ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
<             else:
<                 ax.legend(loc='upper right', bbox_to_anchor=(1, 1))
---
>             ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
253,270d238
< 
<         # Background rcm contour plot
<         if self.background_rcm:
<             num_points = self.end_alt_idx - self.start_alt_idx + 1
<             bkgrnd_rcm_tavg_contours = np.eye( num_points )
<             for i in range(num_points):
<                 for j in range(num_points):
<                     bkgrnd_rcm_tavg_contours[i,j] = self.bkgrnd_rcm_tavg[self.start_alt_idx+i]
<             min_value = min( self.bkgrnd_rcm_tavg )
<             max_value = max( self.bkgrnd_rcm_tavg )
<             x_vector_contour = np.zeros( num_points )
<             x_diff = xlim[1] - xlim[0]
<             x_interval = x_diff / ( num_points - 1 )
<             for k in range(num_points):
<                 x_vector_contour[k] = xlim[0] + float(k) * x_interval
<             plt.contourf( x_vector_contour, self.altitude_bkgrnd_rcm[self.start_alt_idx:self.end_alt_idx+1], bkgrnd_rcm_tavg_contours,
<                           vmin=min_value, vmax=2.0*max_value, cmap=plt.set_cmap("gist_yarg") )
<             plt.colorbar( label="rcm [kg/kg]", orientation="vertical" )
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/postprocessing/pyplotgen/src/VariableGroup.py clubb_release/postprocessing/pyplotgen/src/VariableGroup.py
39c39
<                  priority_vars=False, background_rcm=False, background_rcm_folder=None):
---
>                  priority_vars=False):
55,56d54
<         :param background_rcm: Show a height-based "contour" plot of time-averaged rcm behind CLUBB profiles.
<         :param background_rcm_folder: Folder of CLUBB output data from which to pull the background rcm (if background_rcm is enabled).
80,81d77
<         self.background_rcm = background_rcm
<         self.background_rcm_folder = background_rcm_folder
98,137d93
<         if self.background_rcm:
<             if self.clubb_datasets is not None and len(self.clubb_datasets) != 0:
<                 # Extract rcm from the zt NetCDF file. Also extract the time and height values to which the
<                 # rcm data points correspond.
<                 bkgrnd_rcm = np.squeeze( self.clubb_datasets[self.background_rcm_folder]['zt'].variables['rcm'] )
<                 self.altitude_bkgrnd_rcm = np.squeeze( self.clubb_datasets[self.background_rcm_folder]['zt'].variables['altitude'] )
<                 time_bkgrnd_rcm = np.squeeze( self.clubb_datasets[self.background_rcm_folder]['zt'].variables['time'] )
<                 # Find the indices in the rcm data that correspond to the start time and end time requested as the
<                 # time-averaging interval for the case, as well as the minimum height and maximum height requested
<                 # for the plots.
<                 start_time_seconds = 60.0 * self.start_time # self.start_time is in minutes, while time_bkgrnd_rcm is in seconds.
<                 end_time_seconds = 60.0 * self.end_time # self.end_time is in minutes, while time_bkgrnd_rcm is in seconds.
<                 start_time_idx, end_time_idx = DataReader.__getStartEndIndex__(time_bkgrnd_rcm, start_time_seconds, end_time_seconds)
<                 self.start_alt_idx, self.end_alt_idx = DataReader.__getStartEndIndex__(self.altitude_bkgrnd_rcm, self.height_min_value, self.height_max_value)
<                 # Calculate the time-averaged vertical profile of rcm for use as contours in the background of plots
<                 # of CLUBB time-averaged vertical profiles of various model fields.
<                 nzt = np.shape(bkgrnd_rcm)[1]
<                 self.bkgrnd_rcm_tavg = np.zeros(nzt)
<                 for z_indx in range(nzt):
<                     lev_sum = 0
<                     count = 0
<                     for t_indx in range(start_time_idx, end_time_idx):
<                         lev_sum = lev_sum + bkgrnd_rcm[t_indx,z_indx]
<                         count = count + 1
<                     self.bkgrnd_rcm_tavg[z_indx] = lev_sum / float(count)
<             else:
<                 # Set the relevant "output" variables to a value just to have them set.
<                 # They will be flagged out of interacting with the code.
<                 self.bkgrnd_rcm_tavg = 0
<                 self.altitude_bkgrnd_rcm = 0
<                 self.start_alt_idx = 0
<                 self.end_alt_idx = 0
<         else:
<             # Set the relevant "output" variables to a value just to have them set.
<             # They will be flagged out of interacting with the code.
<             self.bkgrnd_rcm_tavg = 0
<             self.altitude_bkgrnd_rcm = 0
<             self.start_alt_idx = 0
<             self.end_alt_idx = 0
< 
438,440c394,395
<                     panel = Panel(plotset, self.bkgrnd_rcm_tavg, self.altitude_bkgrnd_rcm, self.start_alt_idx, self.end_alt_idx,
<                                   title=title, dependent_title=axis_label, panel_type=panel_type, sci_scale=sci_scale,
<                                   centered=centered, background_rcm=self.background_rcm)
---
>                     panel = Panel(plotset, title=title, dependent_title=axis_label, panel_type=panel_type,
>                                   sci_scale=sci_scale, centered=centered)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/run_scripts/run_bindiff_all.py clubb_release/run_scripts/run_bindiff_all.py
11c11,12
< DEBUG = False
---
> scriptPath = os.path.realpath(__file__)[0:-18]
> #print(scriptPath)
13,19d13
< scriptPath = os.path.dirname(os.path.realpath(__file__))+'/'
< if DEBUG:
<     print(scriptPath)
< outFilePath = os.path.normpath(scriptPath+"../output/bindiffs/")
< filePostFix = "_diff{}.log"
< 
< ## CONSTANTS ##
23,32d16
< # NetCDF file postfixes we want to diff
< nc_data_formats = ["_zm.nc", "_zt.nc", "_sfc.nc"]
< 
< # File containing all the case names
< case_file = "RUN_CASES"
< 
< # Define output messages:
< # 1. Sum of absolute differences below threshold for all variables in all files for a single case.
< no_value_diff_out = ">>>Differences in linux diff but no differences in common variables detected for case {}.<<<"
< 
35,48c19,23
<     # Set up and parse command line arguments
<     parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter)
<     parser.add_argument("-f", "--fileout", action="store", choices=["skip", "replace", "enumerate"], default=None,
<                         help="Output a table of diffs into a text file, with one output file per each pair of diffed netcdf files.\n"+
<                         "The text files will be named '<input_file>-diff_out' and will be stored in a subfolder of CLUBB's output folder.\n"+
<                         "The choices for this option are:"+
<                         "\n1. Flag omitted: No files will be created."+
<                         "\n2. 'enumerate': If a diff log file for a case already exists\n\t\tthe new file will be created with an increasing numerical postfix."+
<                         "\n3. 'skip': If a diff log file for a case already exists the creation of the log file will be skipped."+
<                         "\n4. 'replace': If a diff log file for a case already exists the old file will be replaced with a new log file.")
<     parser.add_argument("-v", "--verbose", action="store_true", help="Print to console a table of numerical differences found in common variables.")
<     parser.add_argument("-t", "--threshold", dest="threshold", type=float, action="store", help="(float) Define the maximum absolute difference for an individual variable to be treated as different.")
<     parser.add_argument("dirs", nargs=2, help="Need 2 clubb output directories containing netCDF files with the same name to diff. Usage: python run_bindiff_all.py dir_path1 dir_path2")
<     args = parser.parse_args()
---
>     parser = argparse.ArgumentParser()
>     parser.add_argument("-o", "--output", action="store_true", help="add this option if you want to get output for each file compared put into a file made in the cwd.")
>     parser.add_argument("-d", "--diffs", action="store_true", help="print the differences found in variables")
>     parser.add_argument("-t", "--threshold", dest="threshold", type=float, action="store", help="print the differences found in variables")
>     parser.add_argument("dirs", nargs=2, help="need 2 clubb output directories to diff. Usage: python run_bindiff_all.py dir_path1 dir_path2")
50,51c25
<     if DEBUG:
<         print(args)
---
>     args = parser.parse_args()
53d26
<     # Check if folders exist
55c28
< 
---
>     
61c34,40
<         # Define difference detection threshold
---
>         dir1_files = os.listdir(args.dirs[0])
>         dir2_files = os.listdir(args.dirs[1])
> 
>         #print(dir1_files, dir2_files)
> 
>         cases = get_cases(dir1_files, dir2_files)
> 
69,85c48,55
<         # Create folder in CLUBB output folder
<         if args.fileout:
<             if DEBUG:
<                 print("Creating output folder")
<             if not os.path.exists(outFilePath):
<                 os.makedirs(outFilePath)
< 
<         linux_diff, diff_in_files, file_skipped = find_diffs_in_all_files(args.dirs[0], args.dirs[1], args.fileout, args.verbose, tot_abs_diff_thresh)
< 
<         if DEBUG:
<             print(linux_diff, diff_in_files, file_skipped)
<         print("SUMMARY:")
<         if linux_diff:
<             if not diff_in_files:
<                 print("Differences detected by linux diff but no differences in the common variables of the netCDF files compared.")
<             else:
<                 print("There were differences detected in the common variables in netCDF (*.nc) files.")
---
>         diff_in_files = run_diff(cases, args.dirs[0], args.dirs[1], args.output, args.diffs, tot_abs_diff_thresh)
> 
>         if( args.output and diff_in_files ):
>             print("\nOutput files made and placed in " + os.getcwd())
> 
>         if( diff_in_files ):
>             print("\nThere were differences detected in netCDF (*.nc) files.")
>             sys.exit(1)
87,93c57,58
<             print("Linux diff did not detect any differences in the compared files.")
<         if args.fileout:
<             if diff_in_files:
<                 print("Output files made and placed in " + outFilePath)
<                 if file_skipped:
<                     print("The creation of some or all of the output files was skipped because files with the same name already existed. "+
<                           "Use output options 'replace' or 'enumerate' to avoid this issue.")
---
>             if( args.output ):
>                 print("\nNo differences detected, so no files were made!")
95,98c60
<                 print("No output files were created in " + outFilePath)
<         if diff_in_files:
<             sys.exit(1)
< 
---
>                 print("\nNo differences detected!")
101c63,64
<         sys.exit(2)
---
>         sys.exit(1)
> 
102a66
> def get_cases(dir1_files, dir2_files):
104,133c68,70
< def get_cases(dir1, dir2, l_verbose):
<     # Generate and return a dict of all cases that have files present in the diff folders
<     # This dict will have the following structure:
<     # cases = {<case> : <folder_dict>, ...}
<     # where folder_dict is another dict with two entries and the following structure:
<     # folder_dict = {<dir>: [list, of, nc_files], ...}
<     # where dir is either of the passed arguments and
<     # [list, to, nc_files] contains the names of the existing netCDF files for <case> in the same order as nc_data_formats.
<     # The entry will be None if a specific file does not exist.
<     # Example: cases = {'arm': { <dir1>: ['arm_zm.nc', None, None], <dir2>: ['arm_zm.nc', None, None]},
<     #                   'bomex': { <dir1>: ['bomex_zm.nc', 'bomex_zt.nc', 'bomex_sfc.nc']}, <dir2>: ['bomex_zm.nc', 'bomex_zt.nc', 'bomex_sfc.nc']},
<     #                   'wangara': { <dir1>: [None, 'wangara_zt.nc',None]}, <dir2>: ['wangara_zm.nc', None, None]}
<     #
<     # Warnings will be printed for each missing file both on the console and in the output files.
<     #####################################################################################
< 
<     # Get lists of files in each folder
<     dir1_files = os.listdir(dir1)
<     dir2_files = os.listdir(dir2)
< 
<     if DEBUG:
<         print(dir1_files, dir2_files)
< 
<     # Create dict structure with case names as keys and a list for each folder of file names (or None if nonexistent) as values
<     # This dict is returned from this function and will later be used as a basis for the comparison loop in 'find_diffs_in_all_files'
<     cases = {}
< 
<     # Loop through all the case names listed in the RUN_CASES file and check if comparison is possible (i.e. at least one pair of case files is found in the folders)
<     # First, open the RUN_CASES file
<     with open(os.path.join(scriptPath, case_file)) as file:
---
>     cases = []
> 
>     with open(scriptPath + "RUN_CASES") as file:
135,138d71
<             if DEBUG:
<                 print(line)
<             # Remove white space and the leading "!" in commented out lines
<             # since we even want to compare commented out cases!
141,210c74,82
<             if DEBUG:
<                 print(case)
<             # Skip line if empty
<             if case == "" or case == "!":
<                 if DEBUG:
<                     print("continue")
<                 continue
<             # "Uncomment case name"
<             if case[0] == "!":
<                 if DEBUG:
<                     print("Commented")
<                 case = case[1:].strip()
<                 if DEBUG:
<                     print(case)
<             # Skip line if it contains multiple words
<             if " " in case or "$" in case:
<                 if DEBUG:
<                     print("continue")
<                 continue
<             if DEBUG:
<                 print("Create entry")
<             cases[case] = {dir1: [], dir2: []}
< 
<             # We want to compare all cases that have at least one common file in the folders, i.e. add that case to dict cases with a list of comparable files.
<             # Note ANY missing files in a warning (also in log file)
<             if DEBUG:
<                 print("iterating")
<             for postfix in nc_data_formats:
<                 if DEBUG:
<                     print(postfix)
<                 ncfname = case+postfix
<                 if DEBUG:
<                     print(ncfname)
<                 # Check if files exist in either folder
<                 # Check dir1
<                 if ncfname in dir1_files:
<                     if DEBUG:
<                         print("Exists in " + dir1)
<                     cases[case][dir1].append(ncfname)
<                 else:
<                     if DEBUG:
<                         print("Not in " + dir1)
<                     cases[case][dir1].append(None)
<                 # Check dir2
<                 if ncfname in dir2_files:
<                     if DEBUG:
<                         print("Exists in " + dir2)
<                     cases[case][dir2].append(ncfname)
<                 else:
<                     if DEBUG:
<                         print("Not in " + dir2)
<                     cases[case][dir2].append(None)
< 
<             # Remove case from list if no FILES exist
<             if not any(cases[case][dir1]) or not any(cases[case][dir2]):
<                 if DEBUG:
<                     print("Removing case because no files exist.")
<                     print(cases[case])
<                 del cases[case]
<                 if l_verbose:
<                     print("Warning! No files found for case {}. It will be skipped.".format(case))
<             # Remove case from list if no file PAIRS exist
<             elif not find_comparable_files(cases[case][dir1], cases[case][dir2]):
<                 if DEBUG:
<                     print("Removing case because there are no pairs.")
<                     print(cases[case])
<                 del cases[case]
<                 if l_verbose:
<                     print("Warning! There are files for case {} but no pairs for comparison were found. It will be skipped.".format(case))
<     print("\nThe following cases will be compared: {}\n".format(list(cases.keys())))
---
> 
>             #If statement goes through every case in the RUN_CASES file and checks if the case is able to be run, 
>             # and if that case has the files in the directories to diff it. If it passes all these conditions, 
>             # the case is added to the runnable cases. 
>             if(line[0] != "!" and len(line) > 1 and case + "_zt.nc" in dir1_files and case + "_zt.nc" in dir2_files
>                     and case + "_zm.nc" in dir1_files and case + "_zm.nc" in dir2_files
>                     and case + "_sfc.nc" in dir1_files and case + "_sfc.nc" in dir2_files):
>                 cases.append(case)
>     #print(cases)
213,214d84
< def find_comparable_files(l1, l2):
<     return any([p1 and p2 for (p1,p2) in zip(l1,l2)])
216,234c86,88
< def find_diffs_in_all_files(dir1, dir2, save_to_file, l_verbose, thresh):
<     # For each case with existing netCDF files in the diff folders:
<     # 1. Create an output file if those are requested
<     # 2. Loop through the netCDF files and call `find_diffs_in_common_vars` on each pair
<     # 3. The cumulative boolean `diff_in_all_files` stores whether or not any differences have been found
<     #
<     # Parameters:
<     #   dir1, dir2: Paths to folders containing netCDF files we want to compare
<     #   save_to_file: Value of the --outfile command line argument
<     #   l_verbose: Value of the --verbose command line argument
<     #   thresh: Detection threshold for differences in a variable
<     #####################################################################################
<     file_missing_msg = "Warning! The file {} does not exist in {}. No comparison possible.\n"
< 
<     # Find all cases that need to be compared (all files present in both folders)
<     cases = get_cases(dir1, dir2, l_verbose)
<     diff_in_all_files = False
<     linux_diff = False
<     file_skipped = False
---
> def run_diff(cases, dir1_path, dir2_path, l_output, l_diffs, thresh):
> 
>     diff_in_files = False
236,237c90,93
<     # This for loop runs through all the cases you have the files to check,
<     # and each netcdf format. It runs the linux diff on the binary netcdf files
---
>     nc_data_formats = ["_zm.nc", "_zt.nc", "_sfc.nc"]
> 
>     # This for loop runs through all the cases you have the files to check, 
>     # and each netcdf format. It runs the linux diff on the binary netcdf files 
240,267c96,99
<         print("###DIFFING " + case + " netCDF (*.nc) files###")
<         linux_diff_in_case = False
<         diff_in_case = False
< 
<         # Write any output that should be written to file to string 'content'
<         if save_to_file:
<             content = "Output for 'run_bindiff_all.py' of the folders:\n"
<             content += " - " + dir1
<             content += "\n - " + dir2
<             content += "\nDiffed case: " + case + "\n"
<             content += "********************************************************************************************\n"
< 
<         # Looping over all files associated to <case>
<         for i, postfix in enumerate(nc_data_formats):
<             ncfname = case+postfix
<             if not cases[case][dir1][i]:
<                 if l_verbose:
<                     print(file_missing_msg.format(ncfname, dir1))
<                 if save_to_file:
<                     content += file_missing_msg.format(ncfname, dir1)
<             if not cases[case][dir2][i]:
<                 if l_verbose:
<                     print(file_missing_msg.format(ncfname, dir2))
<                 if save_to_file:
<                     content += file_missing_msg.format(ncfname, dir2)
<             if not cases[case][dir1][i] or not cases[case][dir2][i]:
<                 print(">File {} can not be compared since it does not exist both folders.<".format(ncfname))
<                 continue
---
> 
>         print("DIFFING " + case + " netCDF (*.nc) files")
> 
>         for out_form in nc_data_formats:
270,283c102,103
<             if( len(subprocess.getoutput("diff " + dir1 + "/" + ncfname + " " + dir2 + "/" + ncfname)) > 0 ):
<                 linux_diff_in_case = True
<                 print(">The linux diff detected differences in " + ncfname + "<")
<                 if save_to_file:
<                     content += ">The linux diff detected differences in " + ncfname + "<\n"
<                 # Update diff_in_all_files: if either it or the output of find_diffs_in_common_vars is true, we conclude that there is a difference. The printed messages will elaborate on the specific differences.
<                 diff_in_case, new_content = find_diffs_in_common_vars(ncfname, dir1, dir2, save_to_file, l_verbose, thresh) or diff_in_case
<                 if l_verbose:
<                     print('')
<                 if save_to_file:
<                     content += new_content
<                     content += '\n'
<             else:
<                 print(">No differences detected by the linux diff in " + ncfname + "<")
---
>             if( len(subprocess.getoutput("diff " + dir1_path + "/" + case + out_form + " " + dir2_path + "/" + case + out_form)) > 0 ):
>                 diff_in_files = run_py_diff(case+out_form, dir1_path, dir2_path, l_output, l_diffs, thresh) or diff_in_files
285,313c105
<         if diff_in_case:
<             print(">>>Differences in common variables detected for case {}<<<".format(case))
<             if save_to_file:
<                 # Create file to save diff log for <case> into
<                 diff_file_name = outFilePath + case + filePostFix
<                 if DEBUG:
<                     print(diff_file_name)
<                 # Check if we need to create a file
<                 if not os.path.exists(diff_file_name.format('')) or save_to_file=="replace":
<                     # If file does not exist or should be overwritten, open file with default name and write content
<                     with open(diff_file_name.format(''), "w") as caseLogFile:
<                         caseLogFile.write(content)
<                 elif save_to_file == "enumerate":
<                     # (File exists already) First find which file index is next and create the file with that index in its name
<                     i = 1
<                     diff_file_name = diff_file_name.format('{:02d}')
<                     while os.path.exists(diff_file_name.format(i)):
<                         i = i+1
<                     with open(diff_file_name.format(i), "w") as caseLogFile:
<                         caseLogFile.write(content)
<                 elif save_to_file == "skip":
<                     file_skipped = True
<                     if  l_verbose:
<                         print("Warning! Despite detected differences no log file was created for case {} since the file {} already exists and the 'skip' output option was used ".format(case, diff_file_name.format('')))
<         elif linux_diff_in_case:
<             print(no_value_diff_out.format(case))
<         else:
<             print(">>>The linux diff could not detect any differences in the file pairs for case {}.<<<".format(case))
<         print('**********************************************************************************************************')
---
>     return diff_in_files
315,339d106
<         # Update diff_in_all_files: Set to True if diff_in_case==True (differences in case found)
<         linux_diff = linux_diff_in_case or linux_diff
<         diff_in_all_files = diff_in_case or diff_in_all_files
< 
<     return (linux_diff, diff_in_all_files, file_skipped)
< 
< def find_diffs_in_common_vars( test_file, dir1, dir2, save_to_file, l_verbose, tot_abs_diff_thresh ):
<     # This is the integral function of this script!
<     # Compare content of one specific pair of files with the same name in each folder:
<     # 1. Find the variables that are present in only one of the files
<     # 2. Find common variables and iterate through them
<     # 3. Compare values between the files and detect differences
<     # 4. Print findings
<     # 5. Return TRUE if significant differences were detected and FALSE otherwise
<     #####################################################################################
< 
<     # Assume no differences until proven otherwise
<     diff_in_common_vars = False
<     # Declare string containing all the output for <test_file>
<     new_content = ""
< 
<     if DEBUG:
<         print("DIFFING " + test_file + "netCDF (*.nc) files")
<         print(os.path.join(dir1, test_file))
<         print(os.path.join(dir2, test_file))
341,343c108
<     # Create datasets from nc files
<     dset1 = netCDF4.Dataset(os.path.join(dir1, test_file))
<     dset2 = netCDF4.Dataset(os.path.join(dir2, test_file))
---
> def run_py_diff( test_file, dir1_path, dir2_path, l_save_output, l_print_diffs, tot_abs_diff_thresh ):
345,365c110,119
<     # Find variables that are only present in ONE of the files
<     diff1 = set(dset1.variables.keys()).difference(dset2.variables.keys())
<     diff2 = set(dset2.variables.keys()).difference(dset1.variables.keys())
<     # Print those variables
<     if diff1:
<         var_set_diff_out = "{} contains the following extra variables:".format(os.path.join(dir1, test_file))
<         var_set_diff_out = var_set_diff_out + "\n" + "\n".join(diff1)
<         print(var_set_diff_out)
<         if save_to_file:
<             new_content += var_set_diff_out + "\n"
< 
<     if diff2:
<         var_set_diff_out = "{} contains the following extra variables:".format(os.path.join(dir2, test_file))
<         var_set_diff_out = var_set_diff_out + "\n" + "\n".join(diff2)
<         print(var_set_diff_out)
<         if save_to_file:
<             new_content += var_set_diff_out + "\n"
<     if diff1 or diff2:
<         print('')
<         if save_to_file:
<             new_content += "\n"
---
>     diff_in_files = False
>     any_diff_above_thresh = False
> 
>     #print("DIFFING " + test_file + "netCDF (*.nc) files")
>     #print(dir1_path + test_file)
>     #print(dir2_path + test_file)
> 
>     # Create datasets from nc files
>     dset1 = netCDF4.Dataset(dir1_path+"/"+test_file)
>     dset2 = netCDF4.Dataset(dir2_path+"/"+test_file)
368,371c122,125
<     table = [[  'Var',
<                 'Max Abs Diff',
<                 'Max % Diff',
<                 'Total Abs Diff',
---
>     table = [[  'Var', 
>                 'Max Abs Diff', 
>                 'Max % Diff', 
>                 'Total Abs Diff', 
374,378c128,130
<     # Create set of variables that are common to both files
<     # These are the variables we can and want to compare the other variables are printed above
<     vars_in_common = set(dset1.variables.keys()).intersection(dset2.variables.keys())
<     for var in sorted(vars_in_common):
<         # The CLUBB netcdf variables we are interested in are all
---
>     for var in dset1.variables:
> 
>         # The CLUBB netcdf variables we are interested in are all 
382c134
<         # dimensions (unlikely), then the variables of interested would be 2D. So
---
>         # dimensions (unlikely), then the variables of interested would be 2D. So 
384c136,138
<         if( dset1[var].ndim > 1 and dset2[var].ndim > 1 ):
---
>         if( dset1[var].ndim > 1 ):
> 
>             diff_in_files = True
389c143
<             if ( np.sum(abs_diff) <= tot_abs_diff_thresh ):
---
>             if ( np.sum(abs_diff) < tot_abs_diff_thresh ):
392c146
<               diff_in_common_vars = True
---
>               any_diff_above_thresh = True
401,406c155,160
< 
<             # Append the table array with the values we want to print
<             table.append( [ var,
<                             np.max(abs_diff),
<                             np.max(percent_diff),
<                             np.sum(abs_diff),
---
>                          
>             # Append the table array with the values we want to print   
>             table.append( [ var, 
>                             np.max(abs_diff), 
>                             np.max(percent_diff), 
>                             np.sum(abs_diff), 
408,410d161
<         else:
<             if l_verbose:
<                 print("The variable {} is not comparable because its dimension is not fit for comparison: {}, {}".format(var, dset1[var].ndim, dset2[var].ndim))
411a163,165
>     # Print results 
>     header = "************** Differences detected in " + test_file + "! **************"
>     print( header )
413c167
<     if diff_in_common_vars:
---
>     if( any_diff_above_thresh ):
418c172
<     if l_verbose:
---
>     if( l_print_diffs ):
422c176
<     if save_to_file:
---
>     if( l_save_output ):
424c178,181
<         new_content += output + "\n"
---
>         f = open(test_file + "-diff_out", "w")
>         f.write(header)
>         f.write(output)
>         f.close()
426,430c183
<     if not diff_in_common_vars:
<         print(">>No differences detected in the common fields in file " + test_file + "<<")
<     else:
<         print(">>Differences above threshold were detected in the common fields in file " + test_file + "<<")
<     return (diff_in_common_vars, new_content)
---
>     return diff_in_files
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/run_scripts/RUN_CASES clubb_release/run_scripts/RUN_CASES
2,4c2,4
< ! Declare any cases that should be run with run_scm_all.bash and run_bindiff_all.bash.
< ! Any blank lines and lines starting with '!' will be ignored in run_scm_all
< ! while run_bindiff_all runs all cases regardless if commented or not.
---
> ! Declare any cases that should be run with run_scm_all.bash and 
> ! run_bindiff_all.bash. Any blank lines and lines starting with '!' will
> ! be ignored.
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/run_scripts/run_scm.bash clubb_release/run_scripts/run_scm.bash
539,540c539
< 		mv ../output/*.nc $CUSTOM_OUTPUT_DIR
< 		mv ../output/*_setup.txt $CUSTOM_OUTPUT_DIR
---
> 		mv ../output/* $CUSTOM_OUTPUT_DIR
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/src/CLUBB_core/advance_clubb_core_module.F90 clubb_release/src/CLUBB_core/advance_clubb_core_module.F90
365,368c365
<         ibrunt_vaisala_freq_sqd_mixed, &
<         ibrunt_vaisala_freq_sqd_moist, &
<         ibrunt_vaisala_freq_sqd_dry, &
<         iRi_zm
---
>         isqrt_Ri_zm
817,820c814,817
<        brunt_vaisala_freq_sqd_mixed, & ! A mixture of dry and moist N^2               [s^-2]
<        brunt_vaisala_freq_sqd_dry,   & ! dry N^2                                      [s^-2]
<        brunt_vaisala_freq_sqd_moist, & ! moist N^2                                    [s^-2]
<        brunt_vaisala_freq_sqd_splat, & !                                              [s^-2]
---
>        brunt_vaisala_freq_sqd_mixed, & ! A mixture of dry and moist N^2
>        brunt_vaisala_freq_sqd_dry,   & ! dry N^2
>        brunt_vaisala_freq_sqd_moist, & ! moist N^2
>        brunt_vaisala_freq_sqd_splat, &
822c819
<        Ri_zm                           ! Richardson number                            [-]
---
>        sqrt_Ri_zm                      ! square root of Richardson number
989,990c986,987
<     !$acc              brunt_vaisala_freq_sqd_splat, &
<     !$acc              brunt_vaisala_freq_sqd_zt, Ri_zm, Lscale_max, &
---
>     !$acc              brunt_vaisala_freq_sqd_plus, brunt_vaisala_freq_sqd_splat, &
>     !$acc              brunt_vaisala_freq_sqd_zt, sqrt_Ri_zm, Lscale_max, &
1555d1551
<           invrs_tau_wp3_zm(i,k)  = invrs_tau_zm(i,k)
1594c1590
<                         Ri_zm,                                                    & ! Out
---
>                         sqrt_Ri_zm,                                               & ! Out
1833c1829
<       !$acc              Ri_zm, invrs_tau_wp3_zm, invrs_tau_no_N2_zm, invrs_tau_bkgnd, &
---
>       !$acc              sqrt_Ri_zm, invrs_tau_wp3_zm, invrs_tau_no_N2_zm, invrs_tau_bkgnd, &
1835,1836c1831
<       !$acc              brunt_vaisala_freq_sqd_splat, brunt_vaisala_freq_sqd_mixed, &
<       !$acc              brunt_vaisala_freq_sqd_moist, brunt_vaisala_freq_sqd_dry )
---
>       !$acc              brunt_vaisala_freq_sqd_splat )
1848c1843
<         call stat_update_var(iRi_zm, Ri_zm(i,:), & ! intent(in)
---
>         call stat_update_var(isqrt_Ri_zm, sqrt_Ri_zm(i,:), & ! intent(in)
1861a1857,1858
>           call stat_update_var(ibrunt_vaisala_freq_sqd, brunt_vaisala_freq_sqd(i,:), & ! intent(in)
>                                stats_zm(i))                                          ! intent(inout)
1863,1864d1859
<         call stat_update_var(ibrunt_vaisala_freq_sqd, brunt_vaisala_freq_sqd(i,:), & ! intent(in)
<                              stats_zm(i))
1866,1872c1861
<                              stats_zm(i))                                       ! intent(inout)
<         call stat_update_var(ibrunt_vaisala_freq_sqd_mixed, brunt_vaisala_freq_sqd_mixed(i,:), & ! intent(in)
<                              stats_zm(i))                                          ! intent(inout)
<         call stat_update_var(ibrunt_vaisala_freq_sqd_moist, brunt_vaisala_freq_sqd_moist(i,:), & ! intent(in)
<                              stats_zm(i))                                          ! intent(inout)
<         call stat_update_var(ibrunt_vaisala_freq_sqd_dry, brunt_vaisala_freq_sqd_dry(i,:), & ! intent(in)
<                              stats_zm(i))                                          ! intent(inout)
---
>                                stats_zm(i))
2913,2914c2902,2903
<     !$acc                   brunt_vaisala_freq_sqd_splat, &
<     !$acc                   brunt_vaisala_freq_sqd_zt, Ri_zm, Lscale_max, &
---
>     !$acc                   brunt_vaisala_freq_sqd_plus, brunt_vaisala_freq_sqd_splat, &
>     !$acc                   brunt_vaisala_freq_sqd_zt, sqrt_Ri_zm, Lscale_max, &
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/src/CLUBB_core/advance_helper_module.F90 clubb_release/src/CLUBB_core/advance_helper_module.F90
335c335
<     !$acc                   lambda0_stability, Lscale_zm )
---
>     !$acc                   brunt_vaisala_freq_sqd_plus, lambda0_stability, Lscale_zm )
601c601,602
<         ishear_sqd, &           ! Variable(s)
---
>         iRichardson_num, &    ! Variable(s)
>         ishear_sqd, &
617c618
<       l_Cx_fnc_Richardson_vert_avg = .false.    ! Vertically average Cx_fnc_Richardson over a
---
>       l_Cx_fnc_Richardson_vert_avg = .false., & ! Vertically average Cx_fnc_Richardson over a
618a620,623
>       l_Richardson_vert_avg = .false.,        & ! Vertically average Richardson_num over a
>                                                 !  distance of Lscale
>       l_use_shear_turb_freq_sqd = .false.       ! Use turb_freq_sqd and shear_sqd in denominator of
>                                                 !  Richardson_num
676a682
>       Richardson_num, &
683a690
>       turb_freq_sqd, &
685a693
>       Richardson_num_clipped, &
706,708c714,716
<     !$acc                    Cx_fnc_interp, &
<     !$acc                    Ri_zm, ddzt_um, ddzt_vm, shear_sqd, Lscale_zm, &
<     !$acc                    Cx_fnc_Richardson_avg, fnc_Richardson, &
---
>     !$acc                    Richardson_num, Cx_fnc_interp, &
>     !$acc                    Ri_zm, ddzt_um, ddzt_vm, shear_sqd, turb_freq_sqd, Lscale_zm, &
>     !$acc                    Richardson_num_clipped, Cx_fnc_Richardson_avg, fnc_Richardson, &
710a719,723
>     if ( l_modify_limiters_for_cnvg_test .and. l_use_shear_turb_freq_sqd ) then
>       error stop "ERROR: l_modify_limiters_for_cnvg_test .and. l_use_shear_turb_freq_sqd "// &
>                  "both true in compute_Cx_fnc_Richardson"
>     end if
> 
744,752c757
<     if ( l_stats_samp ) then
<       !$acc update host(shear_sqd)
<       do i = 1, ngrdcol
<         call stat_update_var( ishear_sqd, shear_sqd(i,:), & ! intent(in)
<                               stats_zm(i) )               ! intent(inout)
<       end do
<     end if
< 
<     if ( l_use_shear_Richardson ) then
---
>     if ( l_use_shear_turb_freq_sqd ) then
757,758c762,764
<           Ri_zm(i,k) = max( 1.0e-7_core_rknd, brunt_vaisala_freq_sqd_mixed(i,k) ) &
<                        / max( shear_sqd(i,k), 1.0e-7_core_rknd )
---
>           turb_freq_sqd(i,k) = em(i,k) / Lscale_zm(i,k)**2
>           Richardson_num(i,k) = brunt_vaisala_freq_sqd(i,k) / max( shear_sqd(i,k), turb_freq_sqd(i,k), &
>                                                                    Richardson_num_divisor_threshold )
762a769,776
>       if ( l_stats_samp ) then
>         !$acc update host(shear_sqd)
>         do i = 1, ngrdcol
>           call stat_update_var( ishear_sqd, shear_sqd(i,:), & ! intent(in)
>                                 stats_zm(i) )               ! intent(inout)
>         end do
>       end if
>       
763a778,807
> 
>       if ( l_use_shear_Richardson ) then
> 
>         !$acc parallel loop gang vector collapse(2) default(present)
>         do k = 1, nz
>           do i = 1, ngrdcol
>             Richardson_num(i,k) = brunt_vaisala_freq_sqd_mixed(i,k) * invrs_num_div_thresh
> 
>             Ri_zm(i,k) = max( 1.0e-7_core_rknd, brunt_vaisala_freq_sqd_mixed(i,k) ) &
>                          / max( shear_sqd(i,k), 1.0e-7_core_rknd )
>           end do
>         end do
>         !$acc end parallel loop
> 
>       else
>         !$acc parallel loop gang vector collapse(2) default(present)
>         do k = 1, nz
>           do i = 1, ngrdcol
>             Richardson_num(i,k) = brunt_vaisala_freq_sqd(i,k) * invrs_num_div_thresh
>             Ri_zm(i,k) = Richardson_num(i,k)
>           end do
>         end do
>         !$acc end parallel loop
>       endif
> 
>     end if
> 
>     if ( l_Richardson_vert_avg ) then
> 
>       ! Clip below-min values of Richardson_num
767c811
<           Ri_zm(i,k) = brunt_vaisala_freq_sqd(i,k) * invrs_num_div_thresh
---
>           Richardson_num_clipped(i,k) = max( Richardson_num(i,k), Richardson_num_min )
770a815,818
> 
>       Richardson_num = Lscale_width_vert_avg( nz, ngrdcol, gr, smth_type, &
>                                               Richardson_num, Lscale_zm, rho_ds_zm, &
>                                               Richardson_num_max )
840a889,897
>     ! Stats sampling
>     if ( l_stats_samp ) then
>       !$acc update host(Richardson_num)
>       do i = 1, ngrdcol
>         call stat_update_var( iRichardson_num, Richardson_num(i,:), & ! intent(in)
>                               stats_zm(i) )                      ! intent(inout)
>       end do
>     end if
> 
843,845c900,902
<     !$acc                   Cx_fnc_interp, Ri_zm, &
<     !$acc                   ddzt_um, ddzt_vm, shear_sqd, Lscale_zm, &
<     !$acc                   Cx_fnc_Richardson_avg, fnc_Richardson, &
---
>     !$acc                   brunt_vaisala_freq_sqd_plus, Richardson_num, Cx_fnc_interp, &
>     !$acc                   Ri_zm, ddzt_um, ddzt_vm, shear_sqd, turb_freq_sqd, Lscale_zm, &
>     !$acc                   Richardson_num_clipped, Cx_fnc_Richardson_avg, fnc_Richardson, &
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/src/CLUBB_core/mixing_length.F90 clubb_release/src/CLUBB_core/mixing_length.F90
1258c1258
<                         Ri_zm, & ! intent out
---
>                         sqrt_Ri_zm, & ! intent out
1369c1369
<     ! (reduce threshold on limiters for Ri_zm in mixing_length.F90)
---
>     ! (reduce threshold on limiters for sqrt_Ri_zm in mixing_length.F90)
1379c1379
<       Ri_zm,                        &
---
>       sqrt_Ri_zm,                   &
1444,1445c1444,1445
<       Ri_zm_clipped, &
<       Ri_zm_smooth, &
---
>       sqrt_Ri_zm_clipped, &
>       sqrt_Ri_zm_smooth, &
1465,1466c1465,1466
<     !$acc            create( Ri_zm_clipped, ddzt_umvm_clipped, &
<     !$acc                    tau_zm_unclipped, tau_zt_unclipped, Ri_zm_smooth, em_clipped, &
---
>     !$acc            create( sqrt_Ri_zm_clipped, ddzt_umvm_clipped, &
>     !$acc                    tau_zm_unclipped, tau_zt_unclipped, sqrt_Ri_zm_smooth, em_clipped, &
1586c1586
<       brunt_vaisala_freq_sqd_smth = zm2zt2zm( nz,ngrdcol,gr, brunt_vaisala_freq_sqd_mixed )
---
>       brunt_vaisala_freq_sqd_smth = zm2zt2zm( nz,ngrdcol,gr, brunt_vaisala_freq_sqd )
1595c1595
<             tmp_calc(i,k) = 1.e8_core_rknd * abs(brunt_vaisala_freq_sqd_mixed(i,k))**3
---
>             tmp_calc(i,k) = 1.e8_core_rknd * abs(brunt_vaisala_freq_sqd(i,k))**3
1601c1601
<                                                  brunt_vaisala_freq_sqd_mixed, &
---
>                                                  brunt_vaisala_freq_sqd, &
1612,1613c1612,1613
<             brunt_vaisala_freq_clipped(i,k) = min( brunt_vaisala_freq_sqd_mixed(i,k), &
<                                                    1.e8_core_rknd * abs(brunt_vaisala_freq_sqd_mixed(i,k))**3)
---
>             brunt_vaisala_freq_clipped(i,k) = min( brunt_vaisala_freq_sqd(i,k), &
>                                                    1.e8_core_rknd * abs(brunt_vaisala_freq_sqd(i,k))**3)
1629,1630c1629,1630
<           Ri_zm_clipped(i,k) = max( 0.0_core_rknd, brunt_vaisala_freq_sqd_smth(i,k) ) &
<                                   / max( ddzt_umvm(i,k), 1.0e-12_core_rknd )
---
>           sqrt_Ri_zm_clipped(i,k) = sqrt( max( 0.0_core_rknd, brunt_vaisala_freq_sqd_smth(i,k) ) &
>                                 / max( ddzt_umvm(i,k), 1.0e-12_core_rknd) )
1635c1635
<       Ri_zm = zm2zt2zm( nz, ngrdcol, gr, Ri_zm_clipped )
---
>       sqrt_Ri_zm = zm2zt2zm( nz, ngrdcol, gr, sqrt_Ri_zm_clipped )
1650c1650
<             Ri_zm(i,k) = brunt_vaisala_freq_clipped(i,k) / ddzt_umvm_clipped(i,k)
---
>             sqrt_Ri_zm(i,k) = sqrt( brunt_vaisala_freq_clipped(i,k) / ddzt_umvm_clipped(i,k)   )
1660,1661c1660,1661
<             Ri_zm(i,k) = max( 1.0e-7_core_rknd, brunt_vaisala_freq_sqd_smth(i,k) ) &
<                             / max( ddzt_umvm(i,k), 1.0e-7_core_rknd )
---
>             sqrt_Ri_zm(i,k) = sqrt( max( 1.0e-7_core_rknd, brunt_vaisala_freq_sqd_smth(i,k) ) &
>                                     / max( ddzt_umvm(i,k), 1.0e-7_core_rknd) )
1844c1844
<           invrs_tau_xp2_zm(i,k) = invrs_tau_bkgnd(i,k) + invrs_tau_sfc(i,k) &
---
>           invrs_tau_xp2_zm(i,k) = 0.1_core_rknd * invrs_tau_bkgnd(i,k) + invrs_tau_sfc(i,k) &
1852,1861c1852,1861
< !      !$acc parallel loop gang vector collapse(2) default(present)
< !      do k = 1, nz
< !        do i = 1, ngrdcol
< !          if ( ice_supersat_frac_zm(i,k) <= 0.01_core_rknd &
< !               .and. invrs_tau_xp2_zm(i,k)  >= 0.003_core_rknd ) then
< !            invrs_tau_xp2_zm(i,k) = 0.003_core_rknd
< !          end if
< !        end do
< !      end do
< !      !$acc end parallel loop
---
>       !$acc parallel loop gang vector collapse(2) default(present)
>       do k = 1, nz
>         do i = 1, ngrdcol
>           if ( ice_supersat_frac_zm(i,k) <= 0.01_core_rknd &
>                .and. invrs_tau_xp2_zm(i,k)  >= 0.003_core_rknd ) then
>             invrs_tau_xp2_zm(i,k) = 0.003_core_rknd
>           end if
>         end do
>       end do
>       !$acc end parallel loop
1903,1904c1903,1904
<       Ri_zm_clipped = smooth_max( nz, ngrdcol, Ri_zm, zero, &
<                                   12.0_core_rknd * min_max_smth_mag )
---
>       sqrt_Ri_zm_clipped = smooth_max( nz, ngrdcol, sqrt_Ri_zm, zero, &
>                                        12.0_core_rknd * min_max_smth_mag )
1906,1907c1906,1907
<       Ri_zm_smooth = smooth_min( nz, ngrdcol, Ri_zm_clipped, 12.0_core_rknd, &
<                                  12.0_core_rknd * min_max_smth_mag )
---
>       sqrt_Ri_zm_smooth = smooth_min( nz, ngrdcol, sqrt_Ri_zm_clipped, 12.0_core_rknd, &
>                                       12.0_core_rknd * min_max_smth_mag )
1916c1916
<                                                 * C_invrs_tau_wpxp_Ri * sqrt ( Ri_zm_smooth(i,k) ))
---
>                                                 * C_invrs_tau_wpxp_Ri * sqrt_Ri_zm_smooth(i,k) )
1932c1932
<                                       * min( max( sqrt( Ri_zm(i,k) ), zero), 12.0_core_rknd ) )
---
>                                       * min( max( sqrt_Ri_zm(i,k), zero), 12.0_core_rknd ) )
2042,2043c2042,2043
<     !$acc           delete( Ri_zm_clipped, ddzt_umvm_clipped, &
<     !$acc                   tau_zm_unclipped, tau_zt_unclipped, Ri_zm_smooth, em_clipped, &
---
>     !$acc           delete( sqrt_Ri_zm_clipped, ddzt_umvm_clipped, &
>     !$acc                   tau_zm_unclipped, tau_zt_unclipped, sqrt_Ri_zm_smooth, em_clipped, &
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/src/CLUBB_core/model_flags.F90 clubb_release/src/CLUBB_core/model_flags.F90
604c604
<     l_use_tke_in_wp3_pr_turb_term = .true.
---
>     l_use_tke_in_wp3_pr_turb_term = .false.
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/src/CLUBB_core/stats_variables.F90 clubb_release/src/CLUBB_core/stats_variables.F90
1089,1092c1089,1090
<     ibrunt_vaisala_freq_sqd_mixed = 0, &
<     ibrunt_vaisala_freq_sqd_moist = 0, &
<     ibrunt_vaisala_freq_sqd_dry = 0, &
<     iRi_zm = 0,          &
---
>     isqrt_Ri_zm = 0, &
>     iRichardson_num = 0, &
1097c1095
< !$omp   threadprivate(iC7_Skw_fnc, iC1_Skw_fnc, iRi_zm)
---
> !$omp   threadprivate(iC7_Skw_fnc, iC1_Skw_fnc, isqrt_Ri_zm)
1099,1100c1097
< !$omp   threadprivate(ibrunt_vaisala_freq_sqd_mixed, ibrunt_vaisala_freq_sqd_moist)
< !$omp   threadprivate(ibrunt_vaisala_freq_sqd_dry, ishear_sqd)
---
> !$omp   threadprivate(iRichardson_num, ishear_sqd)
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/src/CLUBB_core/stats_zm_module.F90 clubb_release/src/CLUBB_core/stats_zm_module.F90
52c52
<         iRi_zm, &
---
>         isqrt_Ri_zm, &
323,325c323
<         ibrunt_vaisala_freq_sqd_mixed, &
<         ibrunt_vaisala_freq_sqd_moist, &
<         ibrunt_vaisala_freq_sqd_dry, &
---
>         iRichardson_num, &
2514,2534c2512,2515
<       case ( 'bv_freq_sqd_mixed' )
<         ibrunt_vaisala_freq_sqd_mixed = k
<         call stat_assign( var_index=ibrunt_vaisala_freq_sqd_mixed, var_name="bv_freq_sqd_mixed", &
<              var_description="Interpolated Brunt-Vaisala freq. squared between moist and dry air", &
<              var_units="1/s^2", &
<              l_silhs=.false., grid_kind=stats_zm )
<         k = k + 1
< 
<       case ( 'bv_freq_sqd_moist' )
<         ibrunt_vaisala_freq_sqd_moist = k
<         call stat_assign( var_index=ibrunt_vaisala_freq_sqd_moist, var_name="bv_freq_sqd_moist", &
<              var_description="Brunt-Vaisala freq. squared in moist air", &
<              var_units="1/s^2", &
<              l_silhs=.false., grid_kind=stats_zm )
<         k = k + 1
< 
<       case ( 'bv_freq_sqd_dry' )
<         ibrunt_vaisala_freq_sqd_dry = k
<         call stat_assign( var_index=ibrunt_vaisala_freq_sqd_dry, var_name="bv_freq_sqd_dry", &
<              var_description="Brunt-Vaisala freq. squared in dry air", &
<              var_units="1/s^2", &
---
>       case ( 'sqrt_Ri_zm' )
>         isqrt_Ri_zm = k
>         call stat_assign( var_index=isqrt_Ri_zm,var_name="sqrt_Ri_zm", &
>              var_description="Richardson number [-]", var_units="-", &
2538,2541c2519,2522
<       case ( 'Ri_zm' )
<         iRi_zm = k
<         call stat_assign( var_index=iRi_zm,var_name="Ri_zm", &
<              var_description="Richardson number [-]", var_units="-", &
---
>       case ( 'Richardson_num' )
>         iRichardson_num = k
>         call stat_assign( var_index=iRichardson_num, var_name="Richardson_num", &
>              var_description="Richardson_num, Richardson number", var_units="-", &
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/src/error.F90 clubb_release/src/error.F90
111c111
<   character(len=20), dimension(:), allocatable, private ::  &
---
>   character(len=10), dimension(:), allocatable, private ::  &
290c290
<     character(len=20), dimension(max_variables) :: &
---
>     character(len=10), dimension(max_variables) :: &
376c376
<       t_variables(1:max_variables)  = "                    "
---
>       t_variables(1:max_variables)  = "          "
423c423
<         if (t_variables(i) == "                    ") exit
---
>         if (t_variables(i) == "          ") exit
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/sens_matrix/sens_matrix_dashboard.py clubb_release/utilities/sens_matrix/sens_matrix_dashboard.py
11,14c11,14
<     from dash import dcc
<     #import dash_core_components as dcc
<     from dash import html
<     #import dash_html_components as html
---
>     #from dash import dcc
>     import dash_core_components as dcc
>     #from dash import html
>     import dash_html_components as html
71,72d70
<     #print("metricsNames=", metricsNames)
<     #print("obsMetricValsCol=", obsMetricValsCol)
112,113c110
<     # defaultBiasesCol + prescribedBiasesCol = -fwdFnc_tuned_params  (see objFnc).
<     # This lumps the prescribed-parameter adjustment into defaultBiasesCol
---
>     # defaultBiasesCol + prescribedBiasesCol = -fwdFnc_tuned_params  (see objFnc)
143,144d139
<     normlzdWeightedLinplusSensMatrixPoly = np.diag(np.transpose(metricsWeights)[0]) @ normlzdLinplusSensMatrixPoly
< 
231c226
<     #    For use in figures such as paramsErrorBarsFig.
---
>     #    For use in figures such as paramsBarChart.
244a240,250
> 
>     # Set up a column vector of metric values from the default simulation
>     defaultMetricValsCol = setupDefaultMetricValsCol(metricsNames, defaultNcFilename)
> 
>     # Set up a column vector of metric values from the global simulation based on optimized
>     #     parameter values.
>     linSolnMetricValsCol = setupDefaultMetricValsCol(metricsNames, linSolnNcFilename)
> 
>     # Store biases in default simulation, ( global_model - default )
>     linSolnBiasesCol = np.subtract(linSolnMetricValsCol, defaultMetricValsCol)
> 
248d253
<     normlzdWeightedDefaultBiasesCol = metricsWeights * normlzdDefaultBiasesCol
273,299d277
<     # Set up a column vector of metric values from the global simulation based on optimized
<     #     parameter values.
<     linSolnMetricValsCol = setupDefaultMetricValsCol(metricsNames, linSolnNcFilename)
< 
<     # Store biases in default simulation, ( global_model - obs )
<     linSolnBiasesCol = np.subtract(linSolnMetricValsCol, obsMetricValsCol)
<     #linSolnBiasesCol = linSolnBiasesCol + prescribedBiasesCol
< 
<     # Check whether the minimizer actually reduces chisqd
<     # Initial value of chisqd, which assumes parameter perturbations are zero
<     normlzdLinSolnBiasesCol = linSolnBiasesCol/np.abs(normMetricValsCol)
<     chisqdLinSolnMin = objFnc(np.zeros_like(defaultParamValsOrigRow), \
<                         normlzdSensMatrixPoly, normlzdLinSolnBiasesCol, metricsWeights, \
<                         normlzdCurvMatrix, reglrCoef, numMetrics)
< 
<     #print("chisqdZero =", chisqdZero)
<     #print("chisqdMin =", chisqdMin)
<     print("chisqdLinSolnMinRatio =", chisqdLinSolnMin/chisqdZero)
< 
<     chisqdUnweightedLinSolnMin = objFnc(np.zeros_like(defaultParamValsOrigRow), \
<                         normlzdSensMatrixPoly, normlzdLinSolnBiasesCol, np.ones_like(metricsWeights), \
<                         normlzdCurvMatrix, reglrCoef, numMetrics)
< 
<     #print("chisqdUnweightedZero =", chisqdUnweightedZero)
<     #print("chisqdUnweightedMin =", chisqdUnweightedMin)
<     print("chisqdUnweightedLinSolnMinRatio =", chisqdUnweightedLinSolnMin/chisqdUnweightedZero)
<     print("-----------------------------------------------------")
344c322
<     #linSolnBias = ( linSolnBiasesCol + defaultBiasesCol )
---
>     linSolnBias = ( linSolnBiasesCol + defaultBiasesCol )
346,347c324,325
<     #linSolnBiasMagRatio = np.linalg.norm(linSolnBias/np.abs(normMetricValsCol))**2 / \
<     #                      np.linalg.norm(defaultBiasesCol/np.abs(normMetricValsCol))**2
---
>     linSolnBiasMagRatio = np.linalg.norm(linSolnBias/np.abs(normMetricValsCol))**2 / \
>                           np.linalg.norm(defaultBiasesCol/np.abs(normMetricValsCol))**2
394,395c372,373
<     #weightedBiasLinSoln = metricsWeights * ( linSolnBiasesCol + defaultBiasesCol ) / np.abs(normMetricValsCol)
<     #weightedBiasLinSolnMagRatio = np.linalg.norm(weightedBiasLinSoln)**2 / np.linalg.norm(normlzdMDeltaB)**2
---
>     weightedBiasLinSoln = metricsWeights * ( linSolnBiasesCol + defaultBiasesCol ) / np.abs(normMetricValsCol)
>     weightedBiasLinSolnMagRatio = np.linalg.norm(weightedBiasLinSoln)**2 / np.linalg.norm(normlzdMDeltaB)**2
531,532c509
<         #y= (-linSolnBiasesCol-defaultBiasesCol)[metricsSensOrdered[i],0]/np.abs(normMetricValsCol[metricsSensOrdered[i],0]),
<         y= (-linSolnBiasesCol)[metricsSensOrdered[i],0]/np.abs(normMetricValsCol[metricsSensOrdered[i],0]),
---
>         y= (-linSolnBiasesCol-defaultBiasesCol)[metricsSensOrdered[i],0]/np.abs(normMetricValsCol[metricsSensOrdered[i],0]),
638,642d614
< 
<     #wide_df = px.data.medals_wide()
<     #paramsTotContrbBarFig = px.bar(wide_df, x="nation", y=["gold", "silver", "bronze"], base=[0,0,0])
<     #pdb.set_trace()
< 
645,646d616
<            #               barBase = np.zeros(numMetrics),
<                           #barBase = -defaultBiasesCol[metricsSensOrdered]/np.abs(normMetricValsCol[metricsSensOrdered]) @ np.ones((1,len(paramsNames))),
652,659c622
< #    paramsTotContrbBarFig = \
< #          createBarChart( minusNonlinMatrixOrdered.T, index=paramsNames, columns=metricsNamesOrdered,
< #                          orientation = 'v',
< #                          title="""Linear + nonlinear contributions of parameters to actual removal of regional biases""",
< #                          xlabel="Parameter", ylabel="Contribution to bias removal",
< #                          width=800, height=500 )
< 
<     sensMatrixBarFig = \
---
>     paramsTotContrbBarFig = \
661,662d623
<           #createBarChart( normlzdSensMatrixOrdered.T, index=paramsNames, columns=metricsNamesOrdered,
<           #                barBase = np.zeros_like(paramsScales),
664,672c625
<                           title="""Linear+nonlinear contributions of parameters to actual removal of regional biases""",
<                           xlabel="Parameter", ylabel="Contribution to bias removal",
<                           width=800, height=500 )
< 
<     linplusSensMatrixBarFig = \
<           createBarChart( normlzdLinplusSensMatrixPoly[metricsSensOrdered,:].T, index=paramsNames, columns=metricsNamesOrdered,
<           #                barBase = np.zeros_like(paramsScales),
<                           orientation = 'v',
<                           title="""Linplus contributions of parameters to actual removal of regional biases""",
---
>                           title="""Linear + nonlinear contributions of parameters to actual removal of regional biases""",
676,683d628
<     metricsCorrArrayFig = createCorrArrayFig( normlzdLinplusSensMatrixPoly, metricsNames,
<                           title='cos(angle) among metrics (i.e., rows of sens matrix)' ) 
< 
<     minusNormlzdDefaultBiasesCol = \
<              -defaultBiasesCol[metricsSensOrdered,0]/np.abs(normMetricValsCol[metricsSensOrdered,0])
<     metricsBarChart = createMetricsBarChart(metricsNames[metricsSensOrdered],paramsNames,
<                                             minusNormlzdDefaultBiasesCol,minusNonlinMatrixOrdered)
< 
1066c1011
<     paramsErrorBarsFig = px.scatter(df, x=df.index, y=df.columns,
---
>     paramsBarChart = px.scatter(df, x=df.index, y=df.columns,
1069c1014
<     paramsErrorBarsFig.update_traces( go.Scatter(
---
>     paramsBarChart.update_traces( go.Scatter(
1074c1019
<     #paramsErrorBarsFig.add_trace(go.Scatter(x=paramsNames, y=paramsLowValsPCBound[:,0]*paramsScales,
---
>     #paramsBarChart.add_trace(go.Scatter(x=paramsNames, y=paramsLowValsPCBound[:,0]*paramsScales,
1077c1022
<     #paramsErrorBarsFig.add_trace(go.Scatter(x=paramsNames, y=paramsHiValsPCBound[:,0]*paramsScales, fill='tonexty',
---
>     #paramsBarChart.add_trace(go.Scatter(x=paramsNames, y=paramsHiValsPCBound[:,0]*paramsScales, fill='tonexty',
1080c1025
<     #paramsErrorBarsFig.add_trace(go.Scatter(x=paramsNames, y=defaultParamValsOrigRow[0,:]*paramsScales,
---
>     #paramsBarChart.add_trace(go.Scatter(x=paramsNames, y=defaultParamValsOrigRow[0,:]*paramsScales,
1082c1027
<     paramsErrorBarsFig.add_trace(go.Scatter(x=paramsAbbrv, y=paramsSolnLin[:,0]*paramsScales,
---
>     paramsBarChart.add_trace(go.Scatter(x=paramsAbbrv, y=paramsSolnLin[:,0]*paramsScales,
1087c1032
<     paramsErrorBarsFig.add_trace(go.Scatter(x=paramsAbbrv, y=paramsSolnNonlin[:,0]*paramsScales,
---
>     paramsBarChart.add_trace(go.Scatter(x=paramsAbbrv, y=paramsSolnNonlin[:,0]*paramsScales,
1093c1038
<     paramsErrorBarsFig.add_trace(go.Scatter(x=paramsAbbrv, y=paramsSolnElastic[:,0]*paramsScales,
---
>     paramsBarChart.add_trace(go.Scatter(x=paramsAbbrv, y=paramsSolnElastic[:,0]*paramsScales,
1103,1106c1048,1051
<     paramsErrorBarsFig.update_yaxes(title="User-scaled parameter value")
<     paramsErrorBarsFig.update_xaxes(title="Parameter Name")
<     paramsErrorBarsFig.update_layout(hovermode="x")
<     paramsErrorBarsFig.update_layout( width=1000, height=500  )
---
>     paramsBarChart.update_yaxes(title="User-scaled parameter value")
>     paramsBarChart.update_xaxes(title="Parameter Name")
>     paramsBarChart.update_layout(hovermode="x")
>     paramsBarChart.update_layout( width=1000, height=500  )
1139,1174c1084,1152
<     # Create figure that shows the sensitivity matrix and bias column, both color coded.
<     sensMatrixBiasFig = createMatrixPlusColFig( matrix = normlzdLinplusSensMatrixPoly,
<                          matIndexLabel = metricsNames,
<                          matColLabel = paramsNames,
<                          colVector = -np.around(defaultBiasesCol/np.abs(normMetricValsCol), decimals=2),
<                          colVectIndexLabel = metricsNames,
<                          colVectColLabel = ['-Normalized Biases'],
<                          plotTitle='Color-coded normalized sensitivity matrix',
<                          reversedYAxis = 'reversed' )
< 
< 
<     # Create figure that plots color-coded parameter correlation matrix plus parameter-bias correlation column.
<     XT_dot_X_Linplus = normlzdLinplusSensMatrixPoly.T @ normlzdLinplusSensMatrixPoly
<     (XT_dot_X_Linplus_corr, stdMatrixInv ) = covMatrix2corrMatrix( XT_dot_X_Linplus, returnStd=True )
<     normlzdStdDefaultBiasesCol = stdMatrixInv @ normlzdLinplusSensMatrixPoly.T @ normlzdDefaultBiasesCol
<     paramsCorrArrayBiasFig = createMatrixPlusColFig( matrix = XT_dot_X_Linplus_corr,
<                          matIndexLabel = paramsNames,
<                          matColLabel = paramsNames,
<                          colVector = -np.around(normlzdStdDefaultBiasesCol, decimals=2),
<                          colVectIndexLabel = paramsNames,
<                          colVectColLabel = ['-Normalized, Standardized Biases'],
<                          plotTitle='XTdotX and bias column, converted to correlation',
<                          reversedYAxis = 'reversed' )
< 
<     # Create figure that plots color-coded projection matrix plus bias column.
<     XT_dot_X_Linplus_inv = np.linalg.inv( XT_dot_X_Linplus )
<     projMatrix = normlzdLinplusSensMatrixPoly @ XT_dot_X_Linplus_inv @ normlzdLinplusSensMatrixPoly.T
<     print("projMatrix rows=", np.linalg.norm( projMatrix, axis=1))
<     projectionMatrixFig = createMatrixPlusColFig( matrix = projMatrix,
<                          matIndexLabel = metricsNames,
<                          matColLabel = metricsNames,
<                          colVector = -np.around(normlzdDefaultBiasesCol, decimals=2),
<                          colVectIndexLabel = metricsNames,
<                          colVectColLabel = ['-Normalized Biases'],
<                          plotTitle='Projection matrix',
<                          reversedYAxis = 'reversed' )
---
>     roundedNormlzdSensMatrix = np.around( normlzdLinplusSensMatrixPoly, decimals=2)
>     df_sensmat = pd.DataFrame(roundedNormlzdSensMatrix,
>                   index=metricsNames,
>                   columns=paramsNames)
>     matMaxAbs = np.max(np.abs(roundedNormlzdSensMatrix))
>     normlzdSensMatrixFig = ff.create_annotated_heatmap(
>                    z=df_sensmat.to_numpy(),
>                    x=df_sensmat.columns.tolist(),
>                    y=df_sensmat.index.tolist(),
>                    #coloraxis="coloraxis",
>                    #colorscale=px.colors.diverging.balance,
>                    colorscale='balance',
>                    zmin=-matMaxAbs, zmax=matMaxAbs,
>                    showscale=False, ygap=1, xgap=1
>                    )
>     normlzdSensMatrixFig.update_xaxes(side="bottom")
>     normlzdSensMatrixFig.update_layout(
>     title_text='Color-coded normalized sensitivity matrix', 
>     title_x=0.5, 
>     #width=800, 
>     #height=1400,
>     xaxis_showgrid=False,
>     yaxis_showgrid=False,
>     xaxis_zeroline=False,
>     yaxis_zeroline=False,
>     #yaxis_autorange='reversed',
>     template='plotly_white'
>     )
>     df_biasArray = pd.DataFrame( -np.around(defaultBiasesCol/np.abs(normMetricValsCol), decimals=2),
>                    index=metricsNames,
>                    columns= ['-Normalized Biases'])
>     normlzdBiasArrayFig = ff.create_annotated_heatmap(
>                    z=df_biasArray.to_numpy(),
>                    x=df_biasArray.columns.tolist(),
>                    y=df_biasArray.index.tolist(),
>                    #colorscale=normlzdSensMatrixFig.colorscale,
>                    #colorscale=px.colors.diverging.balance,
>                    #coloraxis="coloraxis",
>                    colorscale='balance',
>                    zmin=-matMaxAbs, zmax=matMaxAbs,
>                    showscale=True, ygap=1, xgap=1
>                    )
>     normlzdBiasArrayFig.update_layout(
>     title_text='', 
>     title_x=0.5, 
>     #width=10, 
>     #height=1400,
>     xaxis_showgrid=False,
>     yaxis_showgrid=False,
>     xaxis_zeroline=False,
>     yaxis_zeroline=False,
>     #yaxis_autorange='reversed',
>     #template='plotly_white'
>     )
>     sensMatrixBiasFig = make_subplots(
>     rows=1, cols=2,
>     column_widths=[0.9, 0.1],
>     horizontal_spacing=0.2,
>     )
>     sensMatrixBiasFig.add_trace(normlzdSensMatrixFig.data[0], row=1, col=1)
>     #sensMatrixBiasFig.add_trace(normlzdBiasArrayFig.data[0], 1, 1)
>     sensMatrixBiasFig.add_trace(normlzdBiasArrayFig.data[0], row=1, col=2)
>     sensMatrixBiasFig.update_layout(
>         title_text='Color-coded normalized sensitivity matrix',
>         height=700,
>         template='plotly_white') 
>     sensMatrixBiasFig.update_layout(coloraxis=dict(colorscale='RdBu',cmin=-1,cmax=1), showlegend=False)
> 
>     #pdb.set_trace()
1175a1154,1200
>     cosAnglesMatrix = calcMatrixAngles( normlzdLinplusSensMatrixPoly )
>     roundedCosAnglesMatrix = np.around(cosAnglesMatrix, decimals=2)
>     df = pd.DataFrame(roundedCosAnglesMatrix,
>                   index=metricsNames,
>                   columns=metricsNames)
>     upTriMask = np.logical_not( np.tril(np.ones_like(roundedCosAnglesMatrix, dtype=bool)) )
>     df_mask = df.mask(upTriMask)
>     #maskedRoundedCosAnglesMatrix = np.ma.masked_array(roundedCosAnglesMatrix, mask=upTriMask)
>     #maskedRoundedCosAnglesMatrix.filled(np.nan)
>     #print("maskedAngles =", maskedRoundedCosAnglesMatrix)
>     #print("cosAnglesMatrix =", cosAnglesMatrix)
>     #print("upTriMask =", upTriMask)
>     metricsCorrArrayFig = ff.create_annotated_heatmap(
>                    z=df_mask.to_numpy(),
>                    x=df_mask.columns.tolist(),
>                    y=df_mask.columns.tolist(),
>                    colorscale=px.colors.diverging.balance,
>                    showscale=True, ygap=1, xgap=1
>                    )
>     #metricsCorrArrayFig = go.Figure(data=go.Heatmap(
>     #                z=roundedCosAnglesMatrix,  
>     ##                labels=dict(x="Metrics", y="Metrics")x=['SWCF_GLB', 'SWCF_DYCOMS', 'SWCF_HAWAII', 'SWCF_VOCAL', 'SWCF_VOCAL_near', 'SWCF_LBA', 'SWCF_WP', 'SWCF_EP', 'SWCF_NP', 'SWCF_SP', 'SWCF_CAF', 'SWCF_Nambian', 'SWCF_Nambian_near', 'LWCF_GLB', 'PRECT_GLB'])
>     ##                 labels=dict(x="hullo")
>     #                x=metricsNames.tolist(),
>     #                y=metricsNames.tolist() )
>     ##                text_auto=True  )
>     #                )
>     #    metricsCorrArrayFig = px.imshow(
>     #                   img=roundedCosAnglesMatrix,
>     #                   x=metricsNames.tolist(),
>     #                   y=metricsNames.tolist(),
>     #                   color_continuous_scale=px.colors.diverging.balance
>     #                    )
>     #    metricsCorrArrayFig.update_traces(text=roundedCosAnglesMatrix)
>     metricsCorrArrayFig.update_xaxes(side="bottom")
>     metricsCorrArrayFig.update_layout(
>     title_text='cos(angle) among metrics (i.e., rows of sens matrix)', 
>     title_x=0.5, 
>     width=800, 
>     height=700,
>     xaxis_showgrid=False,
>     yaxis_showgrid=False,
>     xaxis_zeroline=False,
>     yaxis_zeroline=False,
>     yaxis_autorange='reversed',
>     template='plotly_white'
>     )
1179d1203
<     #normlzdSensMatrixConcatBiases = np.hstack((normlzdWeightedLinplusSensMatrixPoly, -1*normlzdWeightedDefaultBiasesCol))
1210c1234
<     invrsCosFactorPlusMatrix = np.power( np.maximum( np.finfo(float).eps, 2. * ( 1. + cosAnglesMatrix ) ), -0.5 )
---
>     invrsCosFactorPlusMatrix = np.power( 2. * ( 1. + cosAnglesMatrix ) , -0.5 )
1253d1276
< 
1259c1282
<         dcc.Graph( id='paramsErrorBarsFig', figure=paramsErrorBarsFig ),
---
>         dcc.Graph( id='paramsBarChart', figure=paramsBarChart ),
1261d1283
<         dcc.Graph( id='metricsBarChart', figure=metricsBarChart ),
1263,1265c1285
< #        dcc.Graph( id='paramsTotContrbBarFig', figure=paramsTotContrbBarFig ),
<         dcc.Graph( id='sensMatrixBarFig', figure=sensMatrixBarFig ),
<         #dcc.Graph( id='linplusSensMatrixBarFig', figure=linplusSensMatrixBarFig ),
---
>         dcc.Graph( id='paramsTotContrbBarFig', figure=paramsTotContrbBarFig ),
1271d1290
<         dcc.Graph( id='paramsCorrArrayBiasFig', figure=paramsCorrArrayBiasFig ),
1274d1292
<         dcc.Graph( id='projectionMatrixFig', figure=projectionMatrixFig ),
1301,1314d1318
< def covMatrix2corrMatrix( covMatrix, returnStd=False ):
< 
<     # https://gist.github.com/wiso/ce2a9919ded228838703c1c7c7dad13b
< 
<     import numpy as np
< 
<     stdVector = np.sqrt( np.diag( covMatrix ) )
<     stdMatrixInv = np.diag( 1.0 / stdVector )
<     corrMatrix = stdMatrixInv @ covMatrix @ stdMatrixInv
<     if returnStd:
<         return ( corrMatrix, stdMatrixInv )
<     else:
<         return corrMatrix
< 
1370,1371d1373
<     #pdb.set_trace()
< 
1375c1377
<     dnormlzdParamsSolnNonlin = minimize(objFnc,x0=np.zeros_like(np.transpose(defaultParamValsOrigRow[0])), \
---
>     dnormlzdParamsSolnNonlin = minimize(objFnc,x0=np.zeros_like(np.transpose(defaultParamValsOrigRow)), \
1419c1421
<     dnormlzdParamsSolnLin = minimize(objFnc,x0=np.zeros_like(np.transpose(defaultParamValsOrigRow[0])), \
---
>     dnormlzdParamsSolnLin = minimize(objFnc,x0=np.zeros_like(np.transpose(defaultParamValsOrigRow)), \
1606,1739d1607
< 
< 
< 
< def createMatrixPlusColFig( matrix, matIndexLabel, matColLabel,
<                             colVector, colVectIndexLabel, colVectColLabel,
<                             plotTitle, reversedYAxis=None ):
<     '''Creates a figure that displays a color-coded matrix and an accompanying column vector.'''
< 
<     import numpy as np
<     import pandas as pd
<     import plotly.figure_factory as ff
<     import plotly.express as px
<     from plotly.subplots import make_subplots
<     import pdb
< 
<     # First create a sub-figure that displays color-coded matrix
<     roundedNormlzdSensMatrix = np.around( matrix, decimals=2)
<     df_sensmat = pd.DataFrame(roundedNormlzdSensMatrix,
<                   index=matIndexLabel,
<                   columns=matColLabel)
<     matMaxAbs = np.max(np.abs(roundedNormlzdSensMatrix))
<     matSubfig = px.imshow(
<                    df_sensmat.to_numpy(),
<                    x=df_sensmat.columns.tolist(),
<                    y=df_sensmat.index.tolist(),
<                    text_auto=True
<                    )
<     matSubfig.update_xaxes(side="bottom")
<     matSubfig.update_layout(
<     title_text=plotTitle,
<     title_x=0.5,
<     #width=800,
<     #height=1400,
<     xaxis_showgrid=False,
<     yaxis_showgrid=False,
<     xaxis_zeroline=False,
<     yaxis_zeroline=False,
<     )
< 
<     # Now create a sub-figure showing a color-coded column matrix
<     df_biasArray = pd.DataFrame( colVector,
<                    index=colVectIndexLabel,
<                    columns= colVectColLabel)
<     colVectSubfig = px.imshow(
<                    df_biasArray.to_numpy(),
<                    x=df_biasArray.columns.tolist(),
<                    y=df_biasArray.index.tolist(),
<                    text_auto=True
<                    )
<     colVectSubfig.update_layout(
<     title_text='', 
<     title_x=0.5, 
<     #width=10, 
<     #height=1400,
<     xaxis_showgrid=False,
<     yaxis_showgrid=False,
<     xaxis_zeroline=False,
<     yaxis_zeroline=False,
<     )
< 
<     # Now combine the matrix and column sub-figures into one figure
<     matrixPlusColFig = make_subplots(
<     rows=1, cols=2,
<     column_widths=[0.9, 0.1],
<     horizontal_spacing=0.3,
<     )
<     matrixPlusColFig.add_trace(matSubfig.data[0], row=1, col=1)
<     matrixPlusColFig.add_trace(colVectSubfig.data[0], row=1, col=2)
<     matrixPlusColFig.update_layout(
<         title_text=plotTitle,
<         height=700,
<         width= 1000,
<         template='plotly_white')
<     matrixPlusColFig.update_layout(coloraxis=dict(colorscale='RdBu_r',cmin=-matMaxAbs,cmax=matMaxAbs), showlegend=False)
<     matrixPlusColFig.update_yaxes( autorange=reversedYAxis, row=1, col=2 ) 
<     matrixPlusColFig.update_yaxes( autorange=reversedYAxis, row=1, col=1 ) 
< 
<     #pdb.set_trace()
< 
<     return ( matrixPlusColFig )
< 
< 
< def createMetricsBarChart( metricsNames, paramsNames, biases, sensMatrix ):
< 
< 
<     import plotly.graph_objects as go
<     import numpy as np
<     import pdb
< 
<     biases = np.reshape(biases, (-1,1))
<     barBase = np.copy(biases)  # np.copy prevents biases variable from changing
<     rightEnd = np.copy(biases)
<     leftEnd = np.copy(biases)
<     barsData = []
<     for col in range(len(paramsNames)):
<         #print("paramsNames[col]=", paramsNames[col])
<         sensCol = sensMatrix[:,[col]]
<         #print("sensCol=", sensCol )
<         #print("rightEnd=", rightEnd )
<         for row in range( len(sensCol) ):
<             if ( np.sign(sensCol[row]) > 0 ):
<                 barBase[row] = rightEnd[row]
<             else:
<                 barBase[row] = leftEnd[row]
< 
<         #print("barBase=", barBase)
<         #print("biases during=", biases)
<         barsData.append( go.Bar(name=paramsNames[col], y=metricsNames, x=sensCol[:,0],
<             base=barBase[:,0], orientation="h" ) )
<         rightEnd = rightEnd + np.maximum( np.zeros_like(sensCol), sensCol )
<         leftEnd  = leftEnd + np.minimum( np.zeros_like(sensCol), sensCol )
< 
<     #print("biases after=", biases)
<     # Insert a black line in each bar to denote default biases that we want to remove
<     barsData.append( go.Bar(name='default bias',
<                             y=metricsNames, x=np.zeros(len(metricsNames)), base=biases[:,0],
<                             orientation="h",
<                             marker_line_color = 'black', marker_color='black', marker_line_width = 4
<                             )
<                    )
< 
<     metricsBarChart = go.Figure(data=barsData)
< 
<     # Change the bar mode
<     metricsBarChart.update_layout(barmode='stack')
<     metricsBarChart.update_xaxes(visible=True,zeroline=True,zerolinewidth=4,zerolinecolor='gray') # Plot y axis
<     metricsBarChart.update_layout( width=800, height=50*len(metricsNames)  )
<     metricsBarChart.update_xaxes(title="-Normalized biases")
< 
<     #pdb.set_trace()
< 
<     return metricsBarChart
< 
< 
1741d1608
<      #                   barBase,
1748d1614
<     import plotly.graph_objects as go
1754,1757c1620
<     barChart = px.bar(df, x=df.index, y=df.columns,
<                           #base=barBase,
<                           #offset=1,
<                           orientation=orientation,
---
>     barChart = px.bar(df, x=df.index, y=df.columns, orientation=orientation,
1765d1627
<     #barChart.update_layout(barmode='relative')
1915,1976d1776
< def createCorrArrayFig( matrix, indexLabels, title ):
< 
<     import numpy as np
<     import pandas as pd
<     import plotly.figure_factory as ff
<     import plotly.express as px
<     import pdb
< 
<     cosAnglesMatrix = calcMatrixAngles( matrix )
<     #cosAnglesMatrix = np.copy( matrix )
<     roundedCosAnglesMatrix = np.around(cosAnglesMatrix, decimals=2)
< 
<     df = pd.DataFrame(roundedCosAnglesMatrix,
<                   index=indexLabels,
<                   columns=indexLabels)
<     # Display only the lower-triangular elements of the matrix
<     upTriMask = np.logical_not( np.tril(np.ones_like(roundedCosAnglesMatrix, dtype=bool)) )
<     df_mask = df.mask(upTriMask)
<     #maskedRoundedCosAnglesMatrix = np.ma.masked_array(roundedCosAnglesMatrix, mask=upTriMask)
<     #maskedRoundedCosAnglesMatrix.filled(np.nan)
<     #print("maskedAngles =", maskedRoundedCosAnglesMatrix)
<     #print("cosAnglesMatrix =", cosAnglesMatrix)
<     #print("upTriMask =", upTriMask)
<     corrArrayFig = ff.create_annotated_heatmap(
<                    z=df_mask.to_numpy(),
<                    x=df_mask.columns.tolist(),
<                    y=df_mask.columns.tolist(),
<                    colorscale=px.colors.diverging.balance,
<                    showscale=True, ygap=1, xgap=1
<                    )
<     #metricsCorrArrayFig = go.Figure(data=go.Heatmap(
<     #                z=roundedCosAnglesMatrix,  
<     ##                labels=dict(x="Metrics", y="Metrics")x=['SWCF_GLB', 'SWCF_DYCOMS', 'SWCF_HAWAII', 'SWCF_VOCAL', 'SWCF_VOCAL_near', 'SWCF_LBA', 'SWCF_WP', 'SWCF_EP', 'SWCF_NP', 'SWCF_SP', 'SWCF_CAF', 'SWCF_Nambian', 'SWCF_Nambian_near', 'LWCF_GLB', 'PRECT_GLB'])
<     ##                 labels=dict(x="hullo")
<     #                x=metricsNames.tolist(),
<     #                y=metricsNames.tolist() )
<     ##                text_auto=True  )
<     #                )
<     #    metricsCorrArrayFig = px.imshow(
<     #                   img=roundedCosAnglesMatrix,
<     #                   x=metricsNames.tolist(),
<     #                   y=metricsNames.tolist(),
<     #                   color_continuous_scale=px.colors.diverging.balance
<     #                    )
<     #    metricsCorrArrayFig.update_traces(text=roundedCosAnglesMatrix)
<     corrArrayFig.update_xaxes(side="bottom")
<     corrArrayFig.update_layout(
<     title_text=title, 
<     title_x=0.5, 
<     width=800, 
<     height=700,
<     xaxis_showgrid=False,
<     yaxis_showgrid=False,
<     xaxis_zeroline=False,
<     yaxis_zeroline=False,
<     yaxis_autorange='reversed',
<     template='plotly_white'
<     )
< 
<     #pdb.set_trace()
< 
<     return ( corrArrayFig )
diff '--exclude=.git' '--exclude=version_clubb_core.txt' '--exclude=version_silhs.txt' -r clubb/utilities/sens_matrix/set_up_dashboard_inputs.py clubb_release/utilities/sens_matrix/set_up_dashboard_inputs.py
56,58c56
< #                        ['SWCF_RACC', 0.01, 0.2], \
<                         ['SWCF_RMSEP', 4.01, 15.], \
< #                        ['SWCF_RMSE', 0.01, 15.], \
---
>                         ['SWCF_RMSE', 4.00, 15.], \
61,62c59,60
<                         ['SWCF_HAWAII', 1.00, -999], \
<                         ['SWCF_VOCAL', 1.00, -999], \
---
>                         ['SWCF_HAWAII', 2.00, -999], \
>                         ['SWCF_VOCAL', 2.00, -999], \
69c67
< ##                        ['SWCF_PA', 1.01, -999], \
---
> #                        ['SWCF_PA', 1.01, -999], \
71c69
<                         ['SWCF_Namibia', 4.00, -999], \
---
>                         ['SWCF_Namibia', 1.00, -999], \
78c76
< ##                       ['LWCF_WP', 1.00, -999], \
---
> #                       ['LWCF_WP', 1.00, -999], \
80,81c78,79
< ##                        ['LWCF_NP', 1.01, -999], \
< ##                        ['LWCF_SP', 1.01, -999], \
---
> #                        ['LWCF_NP', 1.01, -999], \
> #                        ['LWCF_SP', 1.01, -999], \
85,87d82
< #                        ['PRECT_RACC', 0.01, 1.0], \
< #                        ['PRECT_RMSEP', 0.01, 1.0], \
< #                        ['PRECT_RMSE', 0.01, 1.0], \
129c124
<     folder_name = 'Regional_files/20230910/'  # folder where regional netcdf files are stored.
---
>     folder_name = 'Regional_files/20230804/'  # folder where regional netcdf files are stored.
153,155c148,150
< #                    ['clubb_c_invrs_tau_sfc', 1.0, \
< #                     folder_name + 'sens0707_6_Regional.nc',
< #                     folder_name + 'sens0707_7_Regional.nc'], \
---
>                     ['clubb_c_invrs_tau_sfc', 1.0, \
>                      folder_name + 'sens0707_6_Regional.nc',
>                      folder_name + 'sens0707_7_Regional.nc'], \
185,187d179
< #                    ['cldfrc_dp2', 1.0, \
< #                     folder_name + 'sens0707_38_Regional.nc',
< #                     folder_name + 'sens0707_39_Regional.nc'], \
211,231d202
< #                    ['clubb_c8', 1.0, 0.7, \
< #                     folder_name + 'sens0707_14_Regional.nc',  \
< #                     folder_name + 'sens0707_15_Regional.nc'], \
< #                    ['clubb_c_k10', 1.0, 0.3, \
< #                     folder_name + 'sens0707_12_Regional.nc', \
< #                     folder_name + 'sens0707_13_Regional.nc'], \
< #                    ['clubb_c_invrs_tau_n2', 1.0, 0.4, \
< #                     folder_name + 'sens0707_10_Regional.nc',
< #                     folder_name + 'sens0707_11_Regional.nc'], \
<                     ['clubb_c_invrs_tau_sfc', 1.0, 0.05, \
<                      folder_name + 'sens0707_6_Regional.nc',
<                      folder_name + 'sens0707_7_Regional.nc'], \
< #                    ['clubb_c_invrs_tau_wpxp_n2_thresh', 1.e3, 0.00045, \
< #                     folder_name + 'sens0707_8_Regional.nc', \
< #                     folder_name + 'sens0707_9_Regional.nc'], \
< #                    ['clubb_c_invrs_tau_shear', 1.0, 0.22, \
< #                     folder_name + 'sens0707_2_Regional.nc', \
< #                     folder_name + 'sens0707_3_Regional.nc'], \
< #                    ['clubb_c_invrs_tau_bkgnd', 1.0, 1.1, \
< #                     folder_name + 'sens0707_16_Regional.nc',
< #                     folder_name + 'sens0707_17_Regional.nc'], \
234a206,208
> #                    ['clubb_c_invrs_tau_bkgnd', 1.0, 1.50686559, \
> #                     folder_name + 'sens0707_16_Regional.nc', \
> #                     folder_name + 'sens0707_17_Regional.nc'], \
264c238
<            folder_name + 'sens0707_25_Regional.nc'
---
>            folder_name + 'sens0707_1_Regional.nc'
273,274d246
<     'SWCF_RACC': 0, \
<     'SWCF_RMSEP': 0, \
290,292d261
<     'PRECT_RACC': 0, \
<     'PRECT_RMSEP': 0, \
<     'PRECT_RMSE': 0, \
394,395d362
< 
<     #print("defaultMetricValsCol=", defaultMetricValsCol)
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Declarative: Post Actions)
[Pipeline] script
[Pipeline] {
[Pipeline] cleanWs
[WS-CLEANUP] Deleting project workspace...
[WS-CLEANUP] Deferred wipeout is used...
[WS-CLEANUP] done
[Pipeline] }
[Pipeline] // script
[Pipeline] script
[Pipeline] {
[Pipeline] emailext
Sending email to: messnermet@uwm.edu
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE