def test_damping_matrix_numerical(fluid_flow_short_eccentricity): """ This function instantiate a bearing using the fluid flow class and test if it matches the expected results for the damping matrix based on Friswell's book formulas, given the eccentricity ratio. Taken from chapter 5, page 179 (Dynamics of rotating machine, FRISSWELL) """ bearing = fluid_flow_short_eccentricity bearing.calculate_pressure_matrix_numerical() K, C = calculate_stiffness_and_damping_coefficients(bearing) cxx, cxy, cyx, cyy = C[0], C[1], C[2], C[3] c_xx, c_xy, c_yx, c_yy = calculate_short_damping_matrix(bearing) assert_allclose(cxx, c_xx, rtol=0.22) assert_allclose(cxy, c_xy, rtol=0.20) assert_allclose(cyx, c_yx, rtol=0.32) assert_allclose(cyy, c_yy, rtol=0.12)
def from_fluid_flow( cls, n, nz, ntheta, length, omega, p_in, p_out, radius_rotor, radius_stator, viscosity, density, attitude_angle=None, eccentricity=None, load=None, omegap=None, immediately_calculate_pressure_matrix_numerically=True, tag=None, n_link=None, scale_factor=1, is_random=None, ): """Instantiate a bearing using inputs from its fluid flow. Parameters ---------- n : int The node in which the bearing will be located in the rotor. is_random : list List of the object attributes to become random. Possibilities: ["length", "omega", "p_in", "p_out", "radius_rotor", "radius_stator", "viscosity", "density", "attitude_angle", "eccentricity", "load", "omegap"] tag: str, optional A tag to name the element Default is None. n_link: int, optional Node to which the bearing will connect. If None the bearing is connected to ground. Default is None. scale_factor: float, optional The scale factor is used to scale the bearing drawing. Default is 1. Grid related ^^^^^^^^^^^^ Describes the discretization of the problem nz: int Number of points along the Z direction (direction of flow). ntheta: int Number of points along the direction theta. NOTE: ntheta must be odd. nradius: int Number of points along the direction r. length: float, list Length in the Z direction (m). Input a list to make it random. Operation conditions ^^^^^^^^^^^^^^^^^^^^ Describes the operation conditions. omega: float, list Rotation of the rotor (rad/s). Input a list to make it random. p_in: float, list Input Pressure (Pa). Input a list to make it random. p_out: float, list Output Pressure (Pa). Input a list to make it random. load: float, list Load applied to the rotor (N). Input a list to make it random. Geometric data of the problem ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Describes the geometric data of the problem. radius_rotor: float, list Rotor radius (m). Input a list to make it random. radius_stator: float, list Stator Radius (m). Input a list to make it random. eccentricity: float, list Eccentricity (m) is the euclidean distance between rotor and stator centers. The center of the stator is in position (0,0). Input a list to make it random. Fluid characteristics ^^^^^^^^^^^^^^^^^^^^^ Describes the fluid characteristics. viscosity: float, list Viscosity (Pa.s). Input a list to make it random. density: float, list Fluid density(Kg/m^3). Input a list to make it random. Returns ------- random bearing: srs.ST_BearingElement A random bearing object. Examples -------- >>> import numpy as np >>> import ross.stochastic as srs >>> nz = 8 >>> ntheta = 64 >>> length = 1.5 * 0.0254 >>> omega = [157.1, 300] >>> p_in = 0. >>> p_out = 0. >>> radius_rotor = 3 * 0.0254 >>> radius_stator = 3.003 * 0.0254 >>> viscosity = np.random.uniform(2.4e-03, 2.8e-03, 5) >>> density = 860 >>> load = 1244.1 >>> elms = srs.ST_BearingElement.from_fluid_flow( ... 0, nz=nz, ntheta=ntheta, length=length, ... omega=omega, p_in=p_in, p_out=p_out, radius_rotor=radius_rotor, ... radius_stator=radius_stator, viscosity=viscosity, density=density, ... load=load, is_random=["viscosity"] ... ) >>> len(list(iter(elms))) 5 """ attribute_dict = locals() attribute_dict.pop("cls") attribute_dict.pop("omega") attribute_dict.pop("is_random") size = len(attribute_dict[is_random[0]]) args_dict = { "kxx": np.zeros((len(omega), size)), "kxy": np.zeros((len(omega), size)), "kyx": np.zeros((len(omega), size)), "kyy": np.zeros((len(omega), size)), "cxx": np.zeros((len(omega), size)), "cxy": np.zeros((len(omega), size)), "cyx": np.zeros((len(omega), size)), "cyy": np.zeros((len(omega), size)), } for k, v in attribute_dict.items(): if k not in is_random: attribute_dict[k] = np.full(size, v) else: attribute_dict[k] = np.asarray(v) for j, frequency in enumerate(omega): for i in range(size): fluid_flow = flow.FluidFlow( attribute_dict["nz"][i], attribute_dict["ntheta"][i], attribute_dict["length"][i], frequency, attribute_dict["p_in"][i], attribute_dict["p_out"][i], attribute_dict["radius_rotor"][i], attribute_dict["radius_stator"][i], attribute_dict["viscosity"][i], attribute_dict["density"][i], attribute_dict["attitude_angle"][i], attribute_dict["eccentricity"][i], attribute_dict["load"][i], attribute_dict["omegap"][i], ) k, c = calculate_stiffness_and_damping_coefficients(fluid_flow) args_dict["kxx"][j, i] = k[0] args_dict["kxy"][j, i] = k[1] args_dict["kyx"][j, i] = k[2] args_dict["kyy"][j, i] = k[3] args_dict["cxx"][j, i] = c[0] args_dict["cxy"][j, i] = c[1] args_dict["cyx"][j, i] = c[2] args_dict["cyy"][j, i] = c[3] return cls( n, kxx=args_dict["kxx"], cxx=args_dict["cxx"], kyy=args_dict["kyy"], kxy=args_dict["kxy"], kyx=args_dict["kyx"], cyy=args_dict["cyy"], cxy=args_dict["cxy"], cyx=args_dict["cyx"], frequency=omega, tag=tag, n_link=n_link, scale_factor=scale_factor, is_random=list(args_dict.keys()), )