diff --git a/ross/results.py b/ross/results.py index a9992563..9488d5e0 100644 --- a/ross/results.py +++ b/ross/results.py @@ -418,8 +418,25 @@ def __init__( self.yn = None self.zn = None self.major_axis = None + self._classify() self._calculate() + def _classify(self): + self.mode_type = "Lateral" + + if self.number_dof == 6: + size = len(self.vector) + + axial_dofs = np.arange(2, size, self.number_dof) + torsional_dofs = np.arange(5, size, self.number_dof) + + nonzero_dofs = np.nonzero(np.abs(self.vector).round(6))[0] + + if np.isin(nonzero_dofs, axial_dofs).all(): + self.mode_type = "Axial" + elif np.isin(nonzero_dofs, torsional_dofs).all(): + self.mode_type = "Torsional" + def _calculate_orbits(self): orbits = [] whirl = [] @@ -1418,7 +1435,7 @@ def __init__( def plot( self, harmonics=[1], - frequency_units="rpm", + frequency_units="RPM", damping_parameter="log_dec", frequency_range=None, damping_range=None, @@ -1434,7 +1451,7 @@ def plot( The default is to plot 1x. frequency_units : str, optional Frequency units. - Default is "rpm" + Default is "RPM". damping_parameter : str, optional Define which value to show for damping. We can use "log_dec" or "damping_ratio". Default is "log_dec". @@ -1541,32 +1558,51 @@ def plot( legendgroup="Crit. Speed", showlegend=True, hovertemplate=( - f"Frequency ({frequency_units}): %{{x:.2f}}
Critical Speed ({frequency_units}): %{{y:.2f}}" + f"Frequency ({frequency_units}): %{{y:.2f}}
Critical Speed ({frequency_units}): %{{x:.2f}}" ), ) ) + whirl_direction = [0.0, 0.5, 1.0] scatter_marker = ["triangle-up", "circle", "triangle-down"] - for mark, whirl_dir, legend in zip( - scatter_marker, [0.0, 0.5, 1.0], ["Forward", "Mixed", "Backward"] - ): + legends = ["Forward", "Mixed", "Backward"] + + if self.number_dof == 6: + whirl_direction = np.concatenate((whirl_direction, [None, None])) + scatter_marker = np.concatenate( + (scatter_marker, ["diamond-wide", "bowtie"]) + ) + legends = np.concatenate((legends, ["Axial", "Torsional"])) + + for whirl_dir, mark, legend in zip(whirl_direction, scatter_marker, legends): for i in range(num_frequencies): w_i = wd[:, i] whirl_i = whirl[:, i] damping_values_i = damping_values[:, i] - whirl_mask = whirl_i == whirl_dir - mask = whirl_mask - if frequency_range is not None: - frequency_mask = (w_i > frequency_range[0]) & ( - w_i < frequency_range[1] - ) - mask = mask & frequency_mask - if damping_range is not None: - damping_mask = (damping_values_i > damping_range[0]) & ( - damping_values_i < damping_range[1] - ) - mask = mask & damping_mask + mode_shape = np.array( + [self.modal_results[j].shapes[i].mode_type for j in speed_range] + ) + mode_mask_g = np.array([mode in legends for mode in mode_shape]) + + mode_mask = mode_shape == legend + if any(mode_mask): + mask = mode_mask + else: + whirl_mask = whirl_i == whirl_dir + mask = whirl_mask + if frequency_range is not None: + frequency_mask = (w_i > frequency_range[0]) & ( + w_i < frequency_range[1] + ) + mask = mask & frequency_mask + if damping_range is not None: + damping_mask = (damping_values_i > damping_range[0]) & ( + damping_values_i < damping_range[1] + ) + mask = mask & damping_mask + + mask = mask & ~mode_mask_g if any(check for check in mask): fig.add_trace( @@ -1600,8 +1636,6 @@ def plot( ) ) # turn legend glyphs black - scatter_marker = ["triangle-up", "circle", "triangle-down"] - legends = ["Forward", "Mixed", "Backward"] for mark, legend in zip(scatter_marker, legends): fig.add_trace( go.Scatter( @@ -1616,7 +1650,7 @@ def plot( ) fig.update_xaxes( - title_text=f"Frequency ({frequency_units})", + title_text=f"Rotor Speed ({frequency_units})", range=[ np.min(Q_(speed_range, "rad/s").to(frequency_units).m), np.max(Q_(speed_range, "rad/s").to(frequency_units).m), @@ -1708,7 +1742,8 @@ def _plot_with_mode_shape_callback(trace, points, state): crit_speeds = camp_fig.data[0]["x"] for w in crit_speeds: - modal_results_crit[w] = self.run_modal(Q_(w, frequency_units).to("rad/s").m) + w_si = Q_(w, frequency_units).to("rad/s").m + modal_results_crit[w_si] = self.run_modal(w_si) for scatter in camp_fig.data: scatter.on_click(_plot_with_mode_shape_callback) diff --git a/ross/rotor_assembly.py b/ross/rotor_assembly.py index 8e69ec08..52fc8196 100644 --- a/ross/rotor_assembly.py +++ b/ross/rotor_assembly.py @@ -1375,7 +1375,7 @@ def _eigen( evalues, evectors = las.eigs( A, k=num_modes, - sigma=0, + sigma=1, ncv=2 * num_modes, which="LM", v0=self._v0,