8. SPM Rotor Speed Analyzer
This analyzer determines the failure speed of a surface-mounted permanent magnet (SPM) rotor design.
8.1. Model Background
This analyzer utilizes the SPM Rotor Structural Analyzer to calculate the rotor’s internal stresses over a specified range of rotational speeds. From this, the analyzer determines whether the rotor will fail structurally using either maximum shear stress theory (MSST) or von Mises failure criterion based on the rotor material as follows:
von Mises is used for ductile materials, such as rotor shafts and rotor laminations
MSST is used for brittle materials [1] , such as adhesives and permanent magnets.
Detailed descriptions of the SPM Rotor Structural Analyzer can be found on the analyzer page here.
8.2. Input from User
The SPM rotor speed problem class requires the dimensions of the rotor shaft, the rotor material dictionary mat_dict, the maximum evaluated speed in RPM
N_max, and the material failure dictionary mat_failure_dict. For the required rotor shaft dimensions and rotor material dictionary mat_dict, please refer
to the Input from User section in the SPM Rotor Structural Analyzer
documentation page.
For the material failure strength dictionary mat_failure_dict, the following key value pairs are needed. Notice that ductile materials require yield strength
while brittle materials require ultimate strength for failure criterion. The main table containing the necessary input variables can be seen in the inputs section of
the SPM Rotor Structural Analyzer, found here. The
additional parameters necessary for the yield and ultimate strengths can be found in the table below:
Argument |
Description |
Units |
|---|---|---|
core_yield_strength |
Rotor iron core yield strength |
Pa |
magnet_ultimate_strength |
Magnet ultimate strength |
Pa |
sleeve_ultimate_strength |
Sleeve ultimate strength |
Pa |
shaft_yield_strength |
Rotor shaft yield strength |
Pa |
adhesive_ultimate_strength |
Adhesive ultimate strength |
Pa |
Additionally, the user must provide information to this analyzer’s initializer, as indicated in the table below:
Argument |
Description |
Units |
|---|---|---|
N_step |
Evaluation step size |
RPM |
node |
Number of nodes to evaluate stress at |
The analyzer runs through the code at incremental speed increases (N_step) to determine the failure speed and material. Since this analyzer only provides an estimate of RPM failure speed, the user is advised to use a coarse N_step value (such as 1000 RPM) to speed up the analysis.
For the node value, the user can also adjust accordingly based on their machine rotor size. In addition, the user should consider implementating a factor of safety
for the machine speed limit in their design.
The following code demonstrates how to initialize the SPM_RotorSpeedLimitProblem class. The values used by the mat_dict are representative of typical values
used by this analyzer. This assumes 1045 carbon steel for the rotor shaft, M19 29-gauge laminated steel for the rotor core, N40 neodymium magnets, and carbon fiber
for the sleeve.
import numpy as np
from matplotlib import pyplot as plt
import eMach.mach_eval.analyzers.mechanical.rotor_speed_limit as rsl
######################################################
# Creating the required Material Dictionary
######################################################
mat_dict = {
# Material: M19 29-gauge laminated steel
'core_material_density': 7650, # kg/m3
'core_youngs_modulus': 185E9, # Pa
'core_poission_ratio': .3,
'alpha_rc' : 1.2E-5,
# Material: N40 neodymium magnets
'magnet_material_density' : 7450, # kg/m3
'magnet_youngs_modulus' : 160E9, # Pa
'magnet_poission_ratio' :.24,
'alpha_pm' :5E-6,
# Material: Carbon Fiber
'sleeve_material_density' : 1800, # kg/m3
'sleeve_youngs_th_direction' : 125E9, #Pa
'sleeve_youngs_p_direction' : 8.8E9, #Pa
'sleeve_poission_ratio_p' :.015,
'sleeve_poission_ratio_tp' :.28,
'alpha_sl_t' :-4.7E-7,
'alpha_sl_r' :0.3E-6,
'sleeve_max_tan_stress': 1950E6, # Pa
'sleeve_max_rad_stress': -100E6, # Pa
# Material: 1045 carbon steel
'shaft_material_density': 7870, # kg/m3
'shaft_youngs_modulus': 206E9, # Pa
'shaft_poission_ratio': .3, # []
'alpha_sh' : 1.2E-5
}
######################################################
# Creating the required Material Yield Stength Dictionary
######################################################
# Sources
# Steel: https://www.matweb.com/search/DataSheet.aspx?MatGUID=e9c5392fb06542ca95dcce43149106ac
# Magnet: https://www.matweb.com/search/DataSheet.aspx?MatGUID=b9cac0b8154f4718859da1fe3cdc3c90
# Sleeve: https://www.matweb.com/search/datasheet.aspx?matguid=f0231febe90f4b45857f543bb3300f27
# Shaft: https://www.matweb.com/search/DataSheet.aspx?MatGUID=b194a96080b6410ba81734b094a4537c
mat_failure_dict = {
# Material: M19 29-gauge laminated steel
# Failure Mode: Yield
'core_yield_strength': 359E6, # Pa
# Material: N40 neodymium magnets
# Failure Mode: Ultimate
'magnet_ultimate_strength': 80E6, # Pa
# Material: Carbon Fiber
# Failure Mode: Ultimate
'sleeve_ultimate_strength': 1380E6, # Pa
# Material: 1045 carbon steel
# Failure Mode: Yield
'shaft_yield_strength': 405E6, # Pa
# Material: LOCTITE® AA 332™
# Failure Mode: At break (Ultimate)
'adhesive_ultimate_strength': 17.9E6, # Pa
}
8.2.1. Example with Rotor Sleeve
The following code provides an example of a rotor without a rotor sleeve:
######################################################
#Setting the machine geometry and operating conditions
######################################################
r_sh = 5E-3 # [m]
d_m = 2E-3 # [m]
r_ro = 12.5E-3 # [m]
deltaT = 0 # [K]
N_max = 100E3 # [RPM]
d_sl=1E-3 # [m]
delta_sl=-2.4E-5 # [m]
######################################################
#Creating problem
######################################################
problem = rsl.SPM_RotorSpeedLimitProblem(r_sh, d_m, r_ro, d_sl, delta_sl, deltaT,
N_max, mat_dict, mat_failure_dict)
######################################################
#Creating analyzer class
######################################################
analyzer = rsl.SPM_RotorSpeedLimitAnalyzer(N_step=100,node=1000)
8.2.2. Example with No Rotor Sleeve
To analyze a rotor with no sleeve, a simple set of d_sl, delta_sl, and deltaT are required when creating the problem. This is shown in the following code:
######################################################
#Setting the machine geometry and operating conditions
######################################################
r_sh = 5E-3 # [m]
d_m = 2E-3 # [m]
r_ro = 12.5E-3 # [m]
deltaT = 0 # [K]
N_max = 100E3 # [RPM]
d_sl=0 # [m]
delta_sl=0 # [m]
######################################################
#Creating problem
######################################################
problem = rsl.SPM_RotorSpeedLimitProblem(r_sh, d_m, r_ro, d_sl, delta_sl, deltaT,
N_max, mat_dict, mat_failure_dict)
######################################################
#Creating analyzer class
######################################################
analyzer = rsl.SPM_RotorSpeedLimitAnalyzer(N_step=100,node=1000)
8.3. Output to User
The attributes of the results class can be summarized in the table below:
Attribute/function name |
Description |
Units |
|---|---|---|
failure_mat |
material in which failure occurs |
|
speed |
speed at which failure occurs |
RPM |
Use the following code to run the aforementioned example analysis:
result = analyzer.analyze(problem)
print(result.failure_mat)
print(result.speed)
When a certain material in the rotor reaches the failure criterion, the script will break out of the loop and return an instance of the results class with the attributes
diagrammed in the table above. Within the results class, failure_mat is the failure material (type: str) and speed is the failure speed (type: float).
8.3.1. Example with Rotor Sleeve
Running the example case with a rotor sleeve returns the following:
None
None
indicating no failure is found in speeds tested below the maximum speed N_max given by the user.
8.3.2. Example with No Rotor Sleeve
Running the example case with no rotor sleeve returns the following:
'Adhesive'
77700.0
indicating a failure with the adhesive at 77700 RPM.