7. SPM Sleeve Analyzer

This analyzer determines the design of a sleeve with minimum thickness to retain magnets on a surface-mounted permanent magnet (SPM) rotor.

7.1. Model Background

The SPM rotor is assumed to consist of four components, a shaft, rotor back iron, magnets, and a sleeve, shown below. The sleeve utilizes an undersized fit to provide compressive force on the rotor. Whether or not it is possible to design a sleeve that can retain the magnets depends upon the specified rotor geometry, materials, and maximum operating speed and temperature. This analyzer determines if a valid sleeve design exists. If a design does exist, the analyzer determines the undersize and thickness of the thinnest possible sleeve.

Trial1
Trial1

This analyzer implements the sleeve design approach developed in Section IV-A of this paper:

  • M Johnson, K. Hanson and E. L. Severson, “Normalized Analytical Model of Stresses in a Surface Mounted Permanent Magnet Rotor,” 2021 IEEE Energy Conversion Congress and Exposition (ECCE), 2021, pp. 3928-3935.

7.2. Input from User

To create the problem object, the user must specify the following dimensions (defined in the drawings above) and the maximum rotor temperature rise (as defined here) and speed:

Input for sleeve problem – Dimensions and Operating Conditions

Variable/key_value name

Description

Units

r_sh

Shaft radius

m

d_m

Magnet thickness

m

r_ro

Rotor outer radius

m

deltaT

Rotor temperature rise

K

N

Rotor speed

RPM

The user must also create a dictionary of material properties. This class uses the same mat_dict specified in the SPM structural analyzer.

To create the analyzer, the user must specify limits on the critical stresses of the rotor magnets and sleeve material. See Table VI of the reference paper for additional information. When defining these stress limits, a safety factor is often used. The safety factor is a ratio of the failure point to the allowable limit, so a safety factor of 2 would mean that the maximum allowable stress is half that of failure stress 2=stress_failure/stress_allowed.

Critical stress limits to provide to rotor sleeve analyzer – stress_limits

Variable/key_value name

Description

Units

rad_sleeve

Allowable sleeve stress in radial direction

Pa

tan_sleeve

Allowable sleeve stress in tangential direction

Pa

rad_magnets

Allowable magnet in radial direction

Pa

tan_magnets

Allowable magnet in tangential direction

Pa

Example code to initialize the sleeve analyzer and problem:

import eMach.mach_eval.analyzers.mechanical.rotor_structural as sta

######################################################
# Creating the required Material Dictionary
######################################################
mat_dict = {
    'core_material_density': 7650,  # kg/m3
    'core_youngs_modulus': 185E9,  # Pa
    'core_poission_ratio': .3,
    'alpha_rc' : 1.2E-5,

    'magnet_material_density'    : 7450, # kg/m3
    'magnet_youngs_modulus'      : 160E9, # Pa
    'magnet_poission_ratio'      :.24,
    'alpha_pm'                   :5E-6,

    '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

    'shaft_material_density': 7870,  # kg/m3
    'shaft_youngs_modulus': 206E9,  # Pa
    'shaft_poission_ratio': .3,  # []
    'alpha_sh' : 1.2E-5
}
######################################################
#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 = 100E3 # [RPM]
######################################################
#Defining required stress limits
######################################################
stress_limits = {'rad_sleeve': -100E6,
                 'tan_sleeve': 1300E6,
                 'rad_magnets': 0,
                 'tan_magnets': 80E6}


######################################################
#Create problem and analyzer
######################################################
problem = sta.SPM_RotorSleeveProblem(r_sh, d_m, r_ro, deltaT, mat_dict, N)
ana = sta.SPM_RotorSleeveAnalyzer(stress_limits)

7.2.1. Advanced Analyzer Configuration

Requirements for the Problem Object: The analyzer requires the problem object have a set of methods (rad_magnet, tan_magnet, rad_sleeve, tan_sleeve) which take in a tuple of [d_sl, delta_sl], representing the sleeve thickness and sleeve undersize, and return the values for each of the critical stresses.

Using a Custom Structural Analyzer: This analyzer utilizes a structural analyzer to calculate the stresses inside the sleeve and magnets as part of its design process. By default, this analyzer utilizes the SPM Structural Analyzer. However, the user can configure the problem object to use a different analyzer through the optional problem initializer arguments problem_class and analyzer_class. Note that the replacement problem and analyzer must have the same function signature as SPM Structural Analyzer.

7.3. Output to User

The analyzer’s return value depends on whether a valid sleeve exists.

  • No valid sleeve design: The analyzer returns False. This means that a sleeve undersize and thickness does not exist that can retain the magnets.

  • Valid sleeve design: The analyzer returns back a the sleeve geometry dimensions [d_sl, delta_sl] in units of m that result in the thinnest possible sleeve.

Example code:

######################################################
#Calculate optimal sleeve geometry
######################################################
sleeve_dim = ana.analyze(problem)
print(sleeve_dim)

The following results will print on the command line. The first set of lines are diagnostic data that prints to the command line from inside the analyzer and indicates that the analyzer found a valid sleeve. The last line is the returned data and indicates that the sleeve has a thickness of 1.649E-4 [m] and optimal undersize of -1.211E-4 [m].

True
     fun: 0.00016490326908354797
     jac: array([1., 0.])
 message: 'Optimization terminated successfully'
    nfev: 26
     nit: 6
    njev: 5
  status: 0
 success: True
       x: array([ 0.0001649, -0.0001211])
[ 0.0001649 -0.0001211]