Loading dthydro_cfd/rom_cfd/pod_cfd_model.py +30 −27 Original line number Diff line number Diff line Loading @@ -74,25 +74,29 @@ class PodCfdModel(object): data_name: Name of the field to reconstruct via the POD model. n_pod_modes: Number of POD modes to retain in the ROM. A larger number of retained POD modes results in greateer accuracy at the expense of more computation time. min_vane_angle: min vane angle (model only works between min and max CFD vane angle data) min_vane_angle: max vane angle (model only works between min and max CFD vane angle data) """ def __init__(self, snapshot_h5file: str, data_name: str="Static Pressure (Pa)", n_pod_modes: int=7): def __init__(self, snapshot_h5file: str, data_name: str="Static Pressure (Pa)", n_pod_modes: int=7, min_vane_angle=11.11, max_vane_angle=13.874, **kwargs): pod_model, xyz_points = construct_pod_model(snapshot_h5file, data_name, n_pod_modes) self._pod_model = pod_model self._xyz_points = xyz_points self._min_vane_angle = min_vane_angle self._max_vane_angle = max_vane_angle self._max_field_value = kwargs.get("max_field_value", 800e3) self._min_field_value = kwargs.get("min_field_value", -100e3) def predict(self, vane_angle: float, min_vane_angle: float=4., max_vane_angle: float=9.) -> np.ndarray: def predict(self, vane_angle: float) -> np.ndarray: """ Evaluate the POD ROM. Args: vane_angle: turbine guide vane angle in degrees min_vane_angle: min vane angle (model only works between min and max CFD vane angle data) min_vane_angle: max vane angle (model only works between min and max CFD vane angle data) """ va = np.clip(vane_angle, min_vane_angle, max_vane_angle) return self._pod_model.predict(va) va = np.clip(vane_angle, self._min_vane_angle, self._max_vane_angle) return np.clip(self._pod_model.predict(va), self._min_field_value, self._max_field_value) @property def xyz_points(self) -> np.ndarray: Loading @@ -116,32 +120,31 @@ class SegmentedPodCfdModel(object): data_name: Name of the field to reconstruct via the POD model. n_pod_modes: Number of POD modes to retain in the ROM. A larger number of retained POD modes results in greateer accuracy at the expense of more computation time. min_vane_angle: min vane angle (model only works between min and max CFD vane angle data) min_vane_angle: max vane angle (model only works between min and max CFD vane angle data) """ def __init__(self, snapshot_h5files: List[str], data_name: str="Static Pressure (Pa)", n_pod_modes: int=7): def __init__(self, snapshot_h5files: List[str], data_name: str="Static Pressure (Pa)", n_pod_modes: int=7, min_vane_angle=11.11, max_vane_angle=13.874, **kwargs): self._pod_cfd_models = [] if isinstance(data_name, str): for i, snapshot_h5file in enumerate(snapshot_h5files): self._pod_cfd_models.append(PodCfdModel(snapshot_h5file, data_name, n_pod_modes)) self._pod_cfd_models.append(PodCfdModel(snapshot_h5file, data_name, n_pod_modes, min_vane_angle, max_vane_angle, **kwargs)) else: assert len(data_name) == len(snapshot_h5files) for i, snapshot_h5file in enumerate(snapshot_h5files): self._pod_cfd_models.append(PodCfdModel(snapshot_h5file, data_name[i], n_pod_modes)) self._pod_cfd_models.append(PodCfdModel(snapshot_h5file, data_name[i], n_pod_modes, min_vane_angle, max_vane_angle, **kwargs)) def predict(self, vane_angle: float, min_vane_angle: float=4., max_vane_angle: float=14.) -> np.ndarray: def predict(self, vane_angle: float) -> np.ndarray: """ Evaluate the POD ROM. Args: vane_angle: turbine guide vane angle in degrees min_vane_angle: min vane angle (model only works between min and max CFD vane angle data) min_vane_angle: max vane angle (model only works between min and max CFD vane angle data) """ va = np.clip(vane_angle, min_vane_angle, max_vane_angle) seg_results = [] for pod_model in self._pod_cfd_models: seg_results.append(pod_model.predict(va, min_vane_angle, max_vane_angle)) seg_results.append(pod_model.predict(vane_angle)) return np.concatenate(seg_results, axis=0) @property Loading Loading @@ -173,7 +176,7 @@ def test_pod_cfd_model(use_plotly=True, # evaluate the pod model at an vane angle not in training set ts = time.time() current_vane_angle = 8.02 current_vane_angle = 12.5 pred_p = pod_model.predict(current_vane_angle) pred_vx = pod_model_vx.predict(current_vane_angle) pred_vy = pod_model_vy.predict(current_vane_angle) Loading Loading @@ -268,7 +271,7 @@ def test_pod_segmented_cfd_model(snapshot_h5files, n_pod_modes=7, rotating_frame # evaluate the pod model at an vane angle not in training set ts = time.time() current_vane_angle = 12.5 current_vane_angle = 12.8 pred_p = pod_model.predict(current_vane_angle) pred_vx = pod_model_vx.predict(current_vane_angle) pred_vy = pod_model_vy.predict(current_vane_angle) Loading @@ -291,7 +294,7 @@ def test_pod_segmented_cfd_model(snapshot_h5files, n_pod_modes=7, rotating_frame y=Y.flatten(), z=Z.flatten(), mode='markers', marker=dict(size=4, color=values, opacity=0.95, marker=dict(size=2, color=values, opacity=0.95, colorbar=dict(thickness=5, title="Static Pressure (Pa)")), customdata=values, hovertemplate=('%{customdata}%'), Loading @@ -305,8 +308,8 @@ def test_pod_segmented_cfd_model(snapshot_h5files, n_pod_modes=7, rotating_frame u=pred_vx, v=pred_vy, w=pred_vz, sizemode="absolute", sizeref=150, #sizemode="absolute", sizeref=25, colorbar=dict(thickness=8, title="Velocity (m/s)"), )) fig_v.show() Loading Loading @@ -345,9 +348,9 @@ def test_dynamic_pod_model(snapshot_h5file="cfd_pod_snapshots.h5", n_pod_modes=7 f_db.create_dataset("Z", data=Z) f_db.flush() current_vane_angle = 4.0 min_vane_angle = 4.0 max_vane_angle = 9.0 current_vane_angle = 12.5 min_vane_angle = 11.11 max_vane_angle = 13.874 def get_test_vane_angle(t): """ Returns a vane angle between min and max val Loading Loading @@ -406,7 +409,7 @@ if __name__ == "__main__": parser.add_argument("-i", help="Input POD snapshot file(s).", type=str, nargs='+', default=["cfd_pod_snapshots.h5"]) parser.add_argument("--dynamic", help="Run in dynamic test mode with moving vane angle", type=int, default=0) parser.add_argument("--n_pod_modes", help="Run in dynamic test mode with moving vane angle", type=int, default=7) parser.add_argument("--rotating_frame", help="Use rotating reference frame for velocity data in the runner", type=int, default=1) parser.add_argument("--rotating_frame", help="Use rotating reference frame for velocity data in the runner", type=int, default=0) args = parser.parse_args() if len(args.i) == 1: if bool(args.dynamic): Loading dthydro_cfd/rom_cfd/preprocess_cfd.py +46 −42 Original line number Diff line number Diff line Loading @@ -38,49 +38,52 @@ run_parameters = [ # NEW CFD DATA FILES # run_dir = "./alder_u12_fixed/" run_dir = "./alder_u12_fixed/" run_csv_files = [ # "alpha-01_runner.csv", # "alpha-02_runner.csv", # "alpha-03_runner.csv", # "alpha-04_runner.csv", # "alpha-05_runner.csv", # "alpha-06_runner.csv", # "alpha-07_runner.csv", # "alpha-08_runner.csv", # "alpha-09_runner.csv", run_dir = "./alder_u12_sep20/" # run_csv_files = [ # # "alpha-01_runner.csv", # # "alpha-02_runner.csv", # # "alpha-03_runner.csv", # # "alpha-04_runner.csv", # # "alpha-05_runner.csv", # # "alpha-06_runner.csv", # # "alpha-07_runner.csv", # # "alpha-08_runner.csv", # # "alpha-09_runner.csv", # # "alpha-10_runner.csv", # "alpha-8_runner.csv", # "alpha-9_runner.csv", # "alpha-10_runner.csv", "alpha-9_runner.csv", "alpha-10_runner.csv", ] run_csv_files = [ # "alpha-01_spiral-casing-and-draft-tube.csv", # "alpha-02_spiral-casing-and-draft-tube.csv", # "alpha-03_spiral-casing-and-draft-tube.csv", # "alpha-04_spiral-casing-and-draft-tube.csv", # "alpha-05_spiral-casing-and-draft-tube.csv", # "alpha-06_spiral-casing-and-draft-tube.csv", # "alpha-07_spiral-casing-and-draft-tube.csv", # "alpha-08_spiral-casing-and-draft-tube.csv", # "alpha-09_spiral-casing-and-draft-tube.csv", # "alpha-10_spiral-casing-and-draft-tube.csv", "alpha-9_casing-draft_tube.csv", "alpha-10_casing-draft_tube.csv", ] # ] # run_csv_files = [ # # "alpha-01_distributor.csv", # # "alpha-02_distributor.csv", # # "alpha-03_distributor.csv", # # "alpha-04_distributor.csv", # # "alpha-05_distributor.csv", # # "alpha-06_distributor.csv", # # "alpha-07_distributor.csv", # # "alpha-08_distributor.csv", # # "alpha-09_distributor.csv", # # "alpha-10_distributor.csv", # "alpha-9_distributor.csv", # "alpha-10_distributor.csv", # # "alpha-01_spiral-casing-and-draft-tube.csv", # # "alpha-02_spiral-casing-and-draft-tube.csv", # # "alpha-03_spiral-casing-and-draft-tube.csv", # # "alpha-04_spiral-casing-and-draft-tube.csv", # # "alpha-05_spiral-casing-and-draft-tube.csv", # # "alpha-06_spiral-casing-and-draft-tube.csv", # # "alpha-07_spiral-casing-and-draft-tube.csv", # # "alpha-08_spiral-casing-and-draft-tube.csv", # # "alpha-09_spiral-casing-and-draft-tube.csv", # # "alpha-10_spiral-casing-and-draft-tube.csv", # "alpha-8_casing_draft-tube.csv", # "alpha-9_casing_draft-tube.csv", # "alpha-10_casing_draft-tube.csv", # ] run_csv_files = [ # "alpha-01_distributor.csv", # "alpha-02_distributor.csv", # "alpha-03_distributor.csv", # "alpha-04_distributor.csv", # "alpha-05_distributor.csv", # "alpha-06_distributor.csv", # "alpha-07_distributor.csv", # "alpha-08_distributor.csv", # "alpha-09_distributor.csv", # "alpha-10_distributor.csv", "alpha-8_distributor.csv", "alpha-9_distributor.csv", "alpha-10_distributor.csv", ] run_parameters = [ # [1.3875], # [2.775], Loading @@ -89,7 +92,7 @@ run_parameters = [ # [6.9375], # [8.325], # [9.7125], # [11.1], [11.1], [12.4875], [13.875], ] Loading Loading @@ -123,6 +126,7 @@ def plot_cfd_vel_field(mesh_x, mesh_y, mesh_z, v_i, v_j, v_k, cbar_label=""): # vel * area: (m/s) * m^2 = m^3/s outlet_area = np.pi * (3.0 / 2.) ** 2. print("mean y vol flow outlet (m^3/s):", mean_v_j_outlet * outlet_area) print("mean y vol flow outlet (ft^3/s):", mean_v_j_outlet * outlet_area * 35.31458) fig_v = go.Figure(data=go.Cone( x=mesh_x[subsample_idxs].flatten(), Loading examples/alder_inelastic_penstock.py +4 −4 Original line number Diff line number Diff line Loading @@ -279,10 +279,10 @@ def alder_inelastic(t_end=20., h_in=60., h_out=0.0, pid_control=True, *args, **k rom_vane_angle = np.rad2deg(a_turb) # NOTE: Current POD ROM snapshot data only valid between # 4.0 and 9.0 degrees of vane opening! pred_p = pod_model_p.predict(rom_vane_angle, min_vane_angle=4., max_vane_angle=9.) pred_vx = pod_model_vx.predict(rom_vane_angle, min_vane_angle=4., max_vane_angle=9.) pred_vy = pod_model_vy.predict(rom_vane_angle, min_vane_angle=4., max_vane_angle=9.) pred_vz = pod_model_vz.predict(rom_vane_angle, min_vane_angle=4., max_vane_angle=9.) pred_p = pod_model_p.predict(rom_vane_angle) pred_vx = pod_model_vx.predict(rom_vane_angle) pred_vy = pod_model_vy.predict(rom_vane_angle) pred_vz = pod_model_vz.predict(rom_vane_angle) pred_vmag = np.sqrt(pred_vx**2 + pred_vy**2 + pred_vz**2) print("ROM Vane angle (deg): ", rom_vane_angle) print("ROM Max, Min 3D P (Pa): ", max(pred_p), min(pred_p)) Loading Loading
dthydro_cfd/rom_cfd/pod_cfd_model.py +30 −27 Original line number Diff line number Diff line Loading @@ -74,25 +74,29 @@ class PodCfdModel(object): data_name: Name of the field to reconstruct via the POD model. n_pod_modes: Number of POD modes to retain in the ROM. A larger number of retained POD modes results in greateer accuracy at the expense of more computation time. min_vane_angle: min vane angle (model only works between min and max CFD vane angle data) min_vane_angle: max vane angle (model only works between min and max CFD vane angle data) """ def __init__(self, snapshot_h5file: str, data_name: str="Static Pressure (Pa)", n_pod_modes: int=7): def __init__(self, snapshot_h5file: str, data_name: str="Static Pressure (Pa)", n_pod_modes: int=7, min_vane_angle=11.11, max_vane_angle=13.874, **kwargs): pod_model, xyz_points = construct_pod_model(snapshot_h5file, data_name, n_pod_modes) self._pod_model = pod_model self._xyz_points = xyz_points self._min_vane_angle = min_vane_angle self._max_vane_angle = max_vane_angle self._max_field_value = kwargs.get("max_field_value", 800e3) self._min_field_value = kwargs.get("min_field_value", -100e3) def predict(self, vane_angle: float, min_vane_angle: float=4., max_vane_angle: float=9.) -> np.ndarray: def predict(self, vane_angle: float) -> np.ndarray: """ Evaluate the POD ROM. Args: vane_angle: turbine guide vane angle in degrees min_vane_angle: min vane angle (model only works between min and max CFD vane angle data) min_vane_angle: max vane angle (model only works between min and max CFD vane angle data) """ va = np.clip(vane_angle, min_vane_angle, max_vane_angle) return self._pod_model.predict(va) va = np.clip(vane_angle, self._min_vane_angle, self._max_vane_angle) return np.clip(self._pod_model.predict(va), self._min_field_value, self._max_field_value) @property def xyz_points(self) -> np.ndarray: Loading @@ -116,32 +120,31 @@ class SegmentedPodCfdModel(object): data_name: Name of the field to reconstruct via the POD model. n_pod_modes: Number of POD modes to retain in the ROM. A larger number of retained POD modes results in greateer accuracy at the expense of more computation time. min_vane_angle: min vane angle (model only works between min and max CFD vane angle data) min_vane_angle: max vane angle (model only works between min and max CFD vane angle data) """ def __init__(self, snapshot_h5files: List[str], data_name: str="Static Pressure (Pa)", n_pod_modes: int=7): def __init__(self, snapshot_h5files: List[str], data_name: str="Static Pressure (Pa)", n_pod_modes: int=7, min_vane_angle=11.11, max_vane_angle=13.874, **kwargs): self._pod_cfd_models = [] if isinstance(data_name, str): for i, snapshot_h5file in enumerate(snapshot_h5files): self._pod_cfd_models.append(PodCfdModel(snapshot_h5file, data_name, n_pod_modes)) self._pod_cfd_models.append(PodCfdModel(snapshot_h5file, data_name, n_pod_modes, min_vane_angle, max_vane_angle, **kwargs)) else: assert len(data_name) == len(snapshot_h5files) for i, snapshot_h5file in enumerate(snapshot_h5files): self._pod_cfd_models.append(PodCfdModel(snapshot_h5file, data_name[i], n_pod_modes)) self._pod_cfd_models.append(PodCfdModel(snapshot_h5file, data_name[i], n_pod_modes, min_vane_angle, max_vane_angle, **kwargs)) def predict(self, vane_angle: float, min_vane_angle: float=4., max_vane_angle: float=14.) -> np.ndarray: def predict(self, vane_angle: float) -> np.ndarray: """ Evaluate the POD ROM. Args: vane_angle: turbine guide vane angle in degrees min_vane_angle: min vane angle (model only works between min and max CFD vane angle data) min_vane_angle: max vane angle (model only works between min and max CFD vane angle data) """ va = np.clip(vane_angle, min_vane_angle, max_vane_angle) seg_results = [] for pod_model in self._pod_cfd_models: seg_results.append(pod_model.predict(va, min_vane_angle, max_vane_angle)) seg_results.append(pod_model.predict(vane_angle)) return np.concatenate(seg_results, axis=0) @property Loading Loading @@ -173,7 +176,7 @@ def test_pod_cfd_model(use_plotly=True, # evaluate the pod model at an vane angle not in training set ts = time.time() current_vane_angle = 8.02 current_vane_angle = 12.5 pred_p = pod_model.predict(current_vane_angle) pred_vx = pod_model_vx.predict(current_vane_angle) pred_vy = pod_model_vy.predict(current_vane_angle) Loading Loading @@ -268,7 +271,7 @@ def test_pod_segmented_cfd_model(snapshot_h5files, n_pod_modes=7, rotating_frame # evaluate the pod model at an vane angle not in training set ts = time.time() current_vane_angle = 12.5 current_vane_angle = 12.8 pred_p = pod_model.predict(current_vane_angle) pred_vx = pod_model_vx.predict(current_vane_angle) pred_vy = pod_model_vy.predict(current_vane_angle) Loading @@ -291,7 +294,7 @@ def test_pod_segmented_cfd_model(snapshot_h5files, n_pod_modes=7, rotating_frame y=Y.flatten(), z=Z.flatten(), mode='markers', marker=dict(size=4, color=values, opacity=0.95, marker=dict(size=2, color=values, opacity=0.95, colorbar=dict(thickness=5, title="Static Pressure (Pa)")), customdata=values, hovertemplate=('%{customdata}%'), Loading @@ -305,8 +308,8 @@ def test_pod_segmented_cfd_model(snapshot_h5files, n_pod_modes=7, rotating_frame u=pred_vx, v=pred_vy, w=pred_vz, sizemode="absolute", sizeref=150, #sizemode="absolute", sizeref=25, colorbar=dict(thickness=8, title="Velocity (m/s)"), )) fig_v.show() Loading Loading @@ -345,9 +348,9 @@ def test_dynamic_pod_model(snapshot_h5file="cfd_pod_snapshots.h5", n_pod_modes=7 f_db.create_dataset("Z", data=Z) f_db.flush() current_vane_angle = 4.0 min_vane_angle = 4.0 max_vane_angle = 9.0 current_vane_angle = 12.5 min_vane_angle = 11.11 max_vane_angle = 13.874 def get_test_vane_angle(t): """ Returns a vane angle between min and max val Loading Loading @@ -406,7 +409,7 @@ if __name__ == "__main__": parser.add_argument("-i", help="Input POD snapshot file(s).", type=str, nargs='+', default=["cfd_pod_snapshots.h5"]) parser.add_argument("--dynamic", help="Run in dynamic test mode with moving vane angle", type=int, default=0) parser.add_argument("--n_pod_modes", help="Run in dynamic test mode with moving vane angle", type=int, default=7) parser.add_argument("--rotating_frame", help="Use rotating reference frame for velocity data in the runner", type=int, default=1) parser.add_argument("--rotating_frame", help="Use rotating reference frame for velocity data in the runner", type=int, default=0) args = parser.parse_args() if len(args.i) == 1: if bool(args.dynamic): Loading
dthydro_cfd/rom_cfd/preprocess_cfd.py +46 −42 Original line number Diff line number Diff line Loading @@ -38,49 +38,52 @@ run_parameters = [ # NEW CFD DATA FILES # run_dir = "./alder_u12_fixed/" run_dir = "./alder_u12_fixed/" run_csv_files = [ # "alpha-01_runner.csv", # "alpha-02_runner.csv", # "alpha-03_runner.csv", # "alpha-04_runner.csv", # "alpha-05_runner.csv", # "alpha-06_runner.csv", # "alpha-07_runner.csv", # "alpha-08_runner.csv", # "alpha-09_runner.csv", run_dir = "./alder_u12_sep20/" # run_csv_files = [ # # "alpha-01_runner.csv", # # "alpha-02_runner.csv", # # "alpha-03_runner.csv", # # "alpha-04_runner.csv", # # "alpha-05_runner.csv", # # "alpha-06_runner.csv", # # "alpha-07_runner.csv", # # "alpha-08_runner.csv", # # "alpha-09_runner.csv", # # "alpha-10_runner.csv", # "alpha-8_runner.csv", # "alpha-9_runner.csv", # "alpha-10_runner.csv", "alpha-9_runner.csv", "alpha-10_runner.csv", ] run_csv_files = [ # "alpha-01_spiral-casing-and-draft-tube.csv", # "alpha-02_spiral-casing-and-draft-tube.csv", # "alpha-03_spiral-casing-and-draft-tube.csv", # "alpha-04_spiral-casing-and-draft-tube.csv", # "alpha-05_spiral-casing-and-draft-tube.csv", # "alpha-06_spiral-casing-and-draft-tube.csv", # "alpha-07_spiral-casing-and-draft-tube.csv", # "alpha-08_spiral-casing-and-draft-tube.csv", # "alpha-09_spiral-casing-and-draft-tube.csv", # "alpha-10_spiral-casing-and-draft-tube.csv", "alpha-9_casing-draft_tube.csv", "alpha-10_casing-draft_tube.csv", ] # ] # run_csv_files = [ # # "alpha-01_distributor.csv", # # "alpha-02_distributor.csv", # # "alpha-03_distributor.csv", # # "alpha-04_distributor.csv", # # "alpha-05_distributor.csv", # # "alpha-06_distributor.csv", # # "alpha-07_distributor.csv", # # "alpha-08_distributor.csv", # # "alpha-09_distributor.csv", # # "alpha-10_distributor.csv", # "alpha-9_distributor.csv", # "alpha-10_distributor.csv", # # "alpha-01_spiral-casing-and-draft-tube.csv", # # "alpha-02_spiral-casing-and-draft-tube.csv", # # "alpha-03_spiral-casing-and-draft-tube.csv", # # "alpha-04_spiral-casing-and-draft-tube.csv", # # "alpha-05_spiral-casing-and-draft-tube.csv", # # "alpha-06_spiral-casing-and-draft-tube.csv", # # "alpha-07_spiral-casing-and-draft-tube.csv", # # "alpha-08_spiral-casing-and-draft-tube.csv", # # "alpha-09_spiral-casing-and-draft-tube.csv", # # "alpha-10_spiral-casing-and-draft-tube.csv", # "alpha-8_casing_draft-tube.csv", # "alpha-9_casing_draft-tube.csv", # "alpha-10_casing_draft-tube.csv", # ] run_csv_files = [ # "alpha-01_distributor.csv", # "alpha-02_distributor.csv", # "alpha-03_distributor.csv", # "alpha-04_distributor.csv", # "alpha-05_distributor.csv", # "alpha-06_distributor.csv", # "alpha-07_distributor.csv", # "alpha-08_distributor.csv", # "alpha-09_distributor.csv", # "alpha-10_distributor.csv", "alpha-8_distributor.csv", "alpha-9_distributor.csv", "alpha-10_distributor.csv", ] run_parameters = [ # [1.3875], # [2.775], Loading @@ -89,7 +92,7 @@ run_parameters = [ # [6.9375], # [8.325], # [9.7125], # [11.1], [11.1], [12.4875], [13.875], ] Loading Loading @@ -123,6 +126,7 @@ def plot_cfd_vel_field(mesh_x, mesh_y, mesh_z, v_i, v_j, v_k, cbar_label=""): # vel * area: (m/s) * m^2 = m^3/s outlet_area = np.pi * (3.0 / 2.) ** 2. print("mean y vol flow outlet (m^3/s):", mean_v_j_outlet * outlet_area) print("mean y vol flow outlet (ft^3/s):", mean_v_j_outlet * outlet_area * 35.31458) fig_v = go.Figure(data=go.Cone( x=mesh_x[subsample_idxs].flatten(), Loading
examples/alder_inelastic_penstock.py +4 −4 Original line number Diff line number Diff line Loading @@ -279,10 +279,10 @@ def alder_inelastic(t_end=20., h_in=60., h_out=0.0, pid_control=True, *args, **k rom_vane_angle = np.rad2deg(a_turb) # NOTE: Current POD ROM snapshot data only valid between # 4.0 and 9.0 degrees of vane opening! pred_p = pod_model_p.predict(rom_vane_angle, min_vane_angle=4., max_vane_angle=9.) pred_vx = pod_model_vx.predict(rom_vane_angle, min_vane_angle=4., max_vane_angle=9.) pred_vy = pod_model_vy.predict(rom_vane_angle, min_vane_angle=4., max_vane_angle=9.) pred_vz = pod_model_vz.predict(rom_vane_angle, min_vane_angle=4., max_vane_angle=9.) pred_p = pod_model_p.predict(rom_vane_angle) pred_vx = pod_model_vx.predict(rom_vane_angle) pred_vy = pod_model_vy.predict(rom_vane_angle) pred_vz = pod_model_vz.predict(rom_vane_angle) pred_vmag = np.sqrt(pred_vx**2 + pred_vy**2 + pred_vz**2) print("ROM Vane angle (deg): ", rom_vane_angle) print("ROM Max, Min 3D P (Pa): ", max(pred_p), min(pred_p)) Loading