@@ -470,7 +470,6 @@ def get_project_red_production_temperature_profile_series(
470470 pd .Series ,
471471 Any , # interpolator
472472]:
473-
474473 input_and_result = get_project_red_input_params_and_result ()
475474 input_params : GeophiresInputParameters = input_and_result [0 ]
476475
@@ -527,6 +526,7 @@ def _generate_fracture_sensitivity_graph(
527526 sensitivity_graph_path : Path ,
528527 power_graph_path : Path ,
529528 power_csv_path : Path ,
529+ df_variance : pd .DataFrame | None = None ,
530530 show_excluded_measured_temperatures : bool = False ,
531531 calculate_stats : bool = True ,
532532) -> pd .DataFrame :
@@ -626,24 +626,27 @@ def _generate_fracture_sensitivity_graph(
626626 }
627627 )
628628
629- label_prefix = 'GEOPHIRES: ' if frac_count == base_number_of_fractures else ''
630- label_suffix = ' (Baseline)' if frac_count == base_number_of_fractures else ''
631-
632629 if calculate_stats and not df_included .empty :
633630 geo_interp = interp1d (geophires_x , geophires_y , kind = 'linear' , fill_value = 'extrapolate' )
634631 y_geo = geo_interp (df_included ['Time_Years' ])
635632
633+ if df_variance is not None :
634+ df_variance [f'GEOPHIRES_Modeled_Temperature_C_{ frac_count } _Fractures' ] = geo_interp (
635+ df_variance ['Time_Years' ]
636+ )
637+
638+ rmse_g = float (np .sqrt (((y_true - y_geo ) ** 2 ).mean ()))
639+ bias_g = float ((y_geo - y_true ).mean ())
636640 ss_res_g = float (np .sum ((y_true - y_geo ) ** 2 ))
641+ r2_g = 1.0 - (ss_res_g / ss_tot ) if ss_tot != 0.0 else 0.0
637642
638- calculated_stats = _StatsAlignmentResult (
639- rmse_degc = float (np .sqrt (((y_true - y_geo ) ** 2 ).mean ())),
640- bias_degc = float ((y_geo - y_true ).mean ()),
641- r2 = 1.0 - (ss_res_g / ss_tot ) if ss_tot != 0.0 else 0.0 ,
642- )
643+ if df_variance is not None :
644+ df_variance .loc [0 , f'GEOPHIRES_R2_{ frac_count } _Fractures' ] = r2_g
643645
644- _log .info (f'{ frac_count } Fractures: { calculated_stats . as_caption } ' )
646+ _log .info (f'{ frac_count } Fractures: RMSE= { rmse_g :.2f } °C, R²= { r2_g :.4f } , Bias= { bias_g :.2f } °C ' )
645647
646- label_suffix += f' (R²={ calculated_stats .r2 :.4f} )'
648+ label_prefix = 'GEOPHIRES: ' if frac_count == base_number_of_fractures else ''
649+ label_suffix = ' (Baseline)' if frac_count == base_number_of_fractures else ''
647650
648651 ax .plot (
649652 geophires_x ,
@@ -742,7 +745,6 @@ def generate_fervo_project_red_2026_md(
742745 geophires_stats_alignment : _StatsAlignmentResult ,
743746 project_root : Path = _PROJECT_ROOT ,
744747) -> None :
745-
746748 result_values : dict [str , Any ] = {} # get_result_values(result)
747749
748750 def _get_input_params_dict_with_nbsp () -> dict [str , Any ]:
@@ -864,9 +866,10 @@ def generate_fervo_project_red_2026_docs():
864866 df_model_ ['Time_Years' ], df_model_ ['Temperature_C' ], kind = 'linear' , fill_value = 'extrapolate'
865867 )
866868 df_variance ['Fervo_Modeled_Temperature_C' ] = model_interpolator (df_variance ['Time_Years' ])
867- df_variance [ 'GEOPHIRES_Modeled_Temperature_C ' ] = geo_interp ( df_variance [ 'Time_Years' ])
869+ df_variance . loc [ 0 , 'Fervo_R2 ' ] = fervo_stat_result . r2
868870
869- df_variance .to_csv (variance_analysis_csv_path , index = False )
871+ df_variance ['GEOPHIRES_Modeled_Temperature_C' ] = geo_interp (df_variance ['Time_Years' ])
872+ df_variance .loc [0 , 'GEOPHIRES_R2' ] = geophires_stat_result .r2
870873
871874 _tab = ' '
872875
@@ -899,9 +902,13 @@ def generate_fervo_project_red_2026_docs():
899902 _get_file_path (f'../../docs/_images/{ _GENERATED_GRAPH_FILENAME_STEM } -fracture-sensitivity.png' ),
900903 _get_file_path (f'../../docs/_images/{ _GENERATED_GRAPH_FILENAME_STEM } -power-sensitivity.png' ),
901904 _BUILD_DIR / 'project_red_2026_power_sensitivity.csv' ,
905+ df_variance = df_variance ,
902906 )
903907 _log .info ('Wrote sensitivity graphs and power data' )
904908
909+ df_variance .to_csv (variance_analysis_csv_path , index = False )
910+ _log .info (f'Wrote variance analysis CSV: { variance_analysis_csv_path } ' )
911+
905912 generate_fervo_project_red_2026_md (
906913 * get_project_red_input_params_and_result (), fervo_stat_result , geophires_stat_result
907914 )
0 commit comments