import re with open("crates/components/src/heat_exchanger/exchanger.rs", "r") as f: content = f.read() # Add getters for hot/cold conditions content = content.replace("pub fn hot_fluid_id(&self) -> Option<&FluidsFluidId> {", """pub fn hot_conditions(&self) -> Option<&HxSideConditions> { self.hot_conditions.as_ref() } pub fn cold_conditions(&self) -> Option<&HxSideConditions> { self.cold_conditions.as_ref() } pub fn hot_fluid_id(&self) -> Option<&FluidsFluidId> {""") # Add compute_residuals_with_ua_scale # Find compute_residuals inside impl Component # We'll just add a method to `impl HeatExchanger` method_to_add = """ pub fn compute_residuals_with_ua_scale( &self, _state: &StateSlice, residuals: &mut ResidualVector, custom_ua_scale: f64, ) -> Result<(), ComponentError> { self.do_compute_residuals(_state, residuals, Some(custom_ua_scale)) } """ content = content.replace("impl Component for HeatExchanger {", method_to_add + "\nimpl Component for HeatExchanger {") # Then modify compute_residuals to call do_compute_residuals content = content.replace("fn compute_residuals(", "fn do_compute_residuals(\n &self,\n _state: &StateSlice,\n residuals: &mut ResidualVector,\n custom_ua_scale: Option,\n ) -> Result<(), ComponentError> {\n if residuals.len() < self.n_equations() {") # Wait, replace the top of compute_residuals: old_start = """ fn compute_residuals( &self, _state: &StateSlice, residuals: &mut ResidualVector, ) -> Result<(), ComponentError> {""" new_start = """ fn compute_residuals( &self, _state: &StateSlice, residuals: &mut ResidualVector, ) -> Result<(), ComponentError> { self.do_compute_residuals(_state, residuals, None) } fn do_compute_residuals( &self, _state: &StateSlice, residuals: &mut ResidualVector, custom_ua_scale: Option, ) -> Result<(), ComponentError> {""" content = content.replace(old_start, new_start) # inside do_compute_residuals, replace `let dynamic_f_ua = self.calib_indices.f_ua.map(|idx| _state[idx]);` old_f_ua = "let dynamic_f_ua = self.calib_indices.f_ua.map(|idx| _state[idx]);" new_f_ua = "let dynamic_f_ua = custom_ua_scale.or_else(|| self.calib_indices.f_ua.map(|idx| _state[idx]));" content = content.replace(old_f_ua, new_f_ua) with open("crates/components/src/heat_exchanger/exchanger.rs", "w") as f: f.write(content)