Examensarbete 30 hp
September 2012
High speed flywheel design
Using advanced composite materials
Tobias Kamf
Institutionen fr teknikvetenskaper
Department of Engineering Sciences
Teknisk naturvetenskaplig fakultet
UTHenheten
Besksadress:
ngstrmlaboratoriet
Lgerhyddsvgen 1
Hus 4, Plan 0
Postadress:
Box 536
751 21 Uppsala
Telefon:
018 471 30 03
Telefax:
018 471 30 00
Hemsida:
http://www.teknat.uu.se/student
Abstract
High speed flywheel design
Tobias Kamf
This thesis is a part of a larger project that focuses on the development of a high
speed, high energy flywheel using both hightech composites and levitating magnetic
bearings alongside a custom made, permanent magnetized generator built into the
flywheel itself. The goal of the project is then to integrate this flywheel into an
electrical vehicle.
The main focus of this thesis is the composite material. The composite is to be used
as a shell around the flywheel rotor. This composite shell fills two purposes. The first
is to act as the main energy carrying material, storing above 75% of the total energy in
the flywheel. The second purpose it to strengthen the machine, holding it together.
This so that higher speeds than normally possible can be achieved, with the goal being
set to 30 000rpm.
In order to be able to design the composite shell correctly a method of calculating the
load stresses had to be developed. This was done by the creation of a Matlab
program, named Spin2Win, capable of calculating the stresses inside a composite
metal hybrid flywheel. Using said Matlab code, combined with modelling and
simulations from SolidWorks, a fullyfledged flywheel was designed complete with
drawings and material specifications.
The composite analysis surprisingly shows that the best combination of composite
materials is a mixture of both high strength carbon fibres alongside softer glass fibres
coupled with the weight of the central core. This allowed for control of the radial
stresses which was shown to otherwise be the limiting factor when designing rotating
composite materials.
One of the most interesting, and perhaps even unique, parts of the design is that the
electrical machine has been integrated into the flywheels composite shell. Having the
two entities working together in order to control the radial stresses in the
composite, by utilizing the weight of the permanent magnets.
UPTEC/ISRN: TVE12052
Examinator: Mikael Bergkvist
mnesgranskare: Kristofer Gamstedt
Handledare: Johan Abrahamsson
ii
iii
Table of contents
1 Introduction ................................................................................................. 1
1.1 Project history .............................................................................................................. 1
1.2 Problem description ..................................................................................................... 2
1.3 Method ......................................................................................................................... 2
1.4 Limitations ................................................................................................................... 2
1.5 Specifications ............................................................................................................... 3
1.6 Goals ............................................................................................................................ 3
2 Theory ......................................................................................................... 4
2.1 Flywheels as energy storage ........................................................................................ 4
2.2 Composite materials .................................................................................................... 6
2.2.1 General overview ................................................................................................. 6
2.2.2 Properties of some lightweight composites .......................................................... 7
2.2.3 Composite theory ................................................................................................. 7
2.3 Forces in rotating cylinders, orthotropic case .............................................................. 9
2.3.1 Limitations ......................................................................................................... 15
2.4 Interferencefits.......................................................................................................... 16
3 Simulations ................................................................................................ 17
3.1 Simulations in SolidWorks ........................................................................................ 17
3.1.1 Approximate dimensions .................................................................................... 17
3.1.2 Using orthotropic materials ................................................................................ 18
3.1.3 Pressfits ............................................................................................................. 19
3.2 Matlab calculations with Spin2Win .......................................................................... 20
3.2.1 Centrifugal forces ............................................................................................... 20
3.2.2 Pressfit calculations, matrix approach .............................................................. 21
3.2.3 Press fit calculations, numerical approach ......................................................... 22
3.3 SolidWorks versus Spin2Win .................................................................................... 23
3.3.1 Case 1: Aluminium cylinder at 22k rpm ............................................................ 24
3.3.2 Case 2: Pressfitted aluminium into a Carbon composite .................................. 26
3.3.3 Case 3: Pressfitted aluminium, glass, carbon in 22k rpm ................................. 28
4 Machine design ......................................................................................... 30
4.1 Support structure ........................................................................................................ 31
4.2 Active magnetic bearings .......................................................................................... 32
4.3 Stator .......................................................................................................................... 33
4.4 Rotor .......................................................................................................................... 34
4.5 The Swerea SICOMP concept ................................................................................... 35
4.5.1 Layups ................................................................................................................ 35
4.5.2 Manufacturing .................................................................................................... 36
4.5.3 Residual stresses ................................................................................................. 37
4.6 Layup evaluation with Spin2Win .............................................................................. 39
4.7 Final design in SolidWorks ....................................................................................... 41
5 Conclusion ................................................................................................ 43
6 Acknowledgements ................................................................................... 44
7 References ................................................................................................. 45
8 Appendix ................................................................................................... 46
iv
List of figures
Figure 1: Woven sheet of carbon fibre, before resin impregnation [6] ...................................... 6
Figure 2: Single 6m carbon fibre compared to a human hair ~100m [7] .............................. 6
Figure 3: Cylinder coordinate description and differential piece definition. ............................. 9
Figure 4: Schematic picture of a interferencefit between two cylinders................................. 16
Figure 5: Coordinate naming in a cylindrical coordinate system ............................................. 18
Figure 6: Shell interference with two surfaces, defined as a pressfit with zero friction. ........ 19
Figure 7: Example stresses due to centripetal forces in an aluminium cylinder at 22k rpm. ... 20
Figure 8: Stress plot in along X with the central axis set as an extra reference ....................... 23
Figure 9: Symbol for cylindrical coordinates ........................................................................... 23
Figure 10: A cut of the Aluminium cylinder in SolidWorks FEM module. ............................ 24
Figure 11: Simulation results for Case 1. ................................................................................. 25
Figure 12: Data point labeling in Solidworks .......................................................................... 26
Figure 13: Simulation results for Case 2 .................................................................................. 27
Figure 14: Spin2Win GUI ........................................................................................................ 28
Figure 15: Simulation results for Case 3 .................................................................................. 29
Figure 16: Photo rendition of the complete flywheel with a 45 cut. ...................................... 30
Figure 17: Support structure overview ..................................................................................... 31
Figure 18: Active magnetic bearing housing, over and underside .......................................... 32
Figure 19: Active magnetic bearing target, over and underside. ............................................ 32
Figure 20: Schematic model of the stator. ................................................................................ 33
Figure 21: Rotor cross section and the rotor as a whole .......................................................... 34
Figure 22: Schematic picture of the filament winding process ................................................ 36
Figure 23: Residual radial stresses for Layup 2 on a steel mandrel. ........................................ 37
Figure 24: Residual tangential stresses for Layup 2 on a steel mandrel. ................................. 38
Figure 25: Axial residual stresses for Layup 2 on a steel mandrel........................................... 38
Figure 26: Layup 1 and 2 comparison, 30k rpm. ..................................................................... 39
Figure 27: Layup 2 with added core and magnets, 30k rpm .................................................... 40
Figure 28: Simulation data for Layup 2, 30k rpm .................................................................... 41
Figure 29: Layup 2 vs Layup 2 5050, 30k rpm ....................................................................... 42
v
List of tables
Table 1: Initial specifications ..................................................................................................... 3
Table 2: Composite material data from Swerea alongside general metal material data ............ 7
Table 3: Approximate data. ...................................................................................................... 17
Table 4: Proposed composite layups ........................................................................................ 35
vi
List of symbols
a Inner radius, Alternative to r
i
[m]
b Outer radius, Alternative to r
o
[m]
E Young's modulus, [Pa]
E
k
Kinetic energy, [J]
F Force density, [N/m
3
]
G Shear modulus, [Pa]
I Moment of inertia, [kg m
2
]
m
c
Mass of a hollow cylinder, [kg]
n Rotational speed, [rpm]
P Surface Pressure, [Pa]
Q
kg
Specific energy, [J/kg]
Q
V
Energy density, [J/m
3
]
r Radius, [m]
u Displacement, [m]
*
r
Radial ultimate tensile strength, [Pa]
*
o
u
2
1
=
kg
Q (2.6)
By looking at this formula it can be concluded that, in order to build a flywheel with a high
energy to weight ratio, a material with high yield strength and low density is required. Luckily
there is a class of materials that exhibit such behaviours, namely lightweight composite
materials.
One other commonly used quality to evaluate flywheels is energy per unit volume, from here
on called Q
V
, which is obtained by dividing (2.3) with the flywheel volume yielding:
e
e
2 2
2 2
2
1
2
1
r
V
r m
E
c
k
= (2.7)
and then combining this with (2.5) forming the final expression:
u
o
2
1
=
V
Q (2.8)
which indicate that if a high energy per volume ratio is desired the main factor to consider is
the yield strength of the material, where stronger is obviously better. Again lightweight
composite materials are a good candidate for such a material as they are among the strongest
man made materials to date.
6
2.2 Composite materials
As it was shown in the previous chapter composite materials are a good material choice for a
high speed, high energy density flywheel. But designing a flywheel in composite requires a
good understanding of the basic concepts of composites.
2.2.1 General overview
A composite material is defined as a material made up of two or more different materials with
significantly different structural or chemical properties. Furthermore, both natural and
manmade composites usually consist of some kind of relatively strong fibres, often called
reinforcement, held together by a by a much weaker glue, usually called matrix or resin. The
most common natural composite is wood which consists of long cellulose fibres held together
by a lignin and hemicellulose matrix. The earliest manmade composites are thousands of
years old and consist of grass or wooden fibres encased in a matrix of clay, mud and dung. By
varying the matrix to fibre ratio and also the fibre direction within the material the material
properties can be tailored to fit specific roles. The most common manmade composite in use
today is rebarreinforced concrete where the rebars work as the fibres and the concrete as the
matrix. [7]
89
While reinforced concrete may be one of the most abundant composites in the world today,
the word composite is usually used to describe a strong, lightweight construction material.
The most common lightweight composites are made of glass or carbonfibres encased in a
plastic matrix, usually made of epoxy. And it is these lightweight materials that are of interest
to this project.
Figure 1: Woven sheet of carbon fibre,
before resin impregnation [8]
Figure 2: Single 6m carbon fibre compared to a human
hair ~100m [9]
7
2.2.2 Properties of some lightweight composites
In order to give the reader a first insight to the properties of some common composite
materials the following material data table was compiled. The metal material data is
somewhat approximate and may vary depending on the specific alloys used, heat treatments,
formfactor and so on. Note that all the composite material data presented below are for
unidirectional composites, meaning that all the fibres goes along the circumferential direction,
and as such only the epoxy matrix creates the strength in the radial and axial directions.
Composites
Metals (approximate values)
Toray
T800
Toray
T700
Advantex
Eglass
Carbon
steel
Aluminium
alloy
Titanium
alloy
*
+
c
c
+
c
c
+
c
c
z
zr z z zr
r z r
r
r zr r r
F
r z r r
F
r z r r
F
r z r r
t o
u
t t
t t
u
o t
o o t
u
t o
u
u
u u u u
u u
(2.10)
The second set of equations of importance is the straindisplacement relations,
( )  
T
u u V + V =
2
1
c (2.11)
again expressed in tensor form. This equation describes the relation between the strain in the
system and the relative displacement between the systems parts. It states that if the
displacement is not constant throughout the material, the material will experience a strain
proportional to the change of displacement in any given direction. Expressed in cylindrical
coordinates this equation takes the following form:
z
u
r
u u
r
r
u
z
z
r
r
r
c
c
=
+
c
c
=
c
c
=
c
u
c
c
u
u
1
r
u
z
u
z
u u
r
u
r r
u
r
u
z r
r z
z
z
r
r
c
c
+
c
c
=
c
c
+
c
c
=
c
c
+
c
c
=
u
u
u u
u
1
1
(2.12)
Lastly a set of constitutive relations are needed. For linear elastic materials these can be
obtained by using the generalized Hookes Law,
c o : C = (2.13)
which relates the system strains and stresses to each other. C is here a stiffness tensor of the
forth order, containing the 81 coefficients of elasticity. The equation states that the stress in
any given direction can be expressed as a function of the system strains with the help of a
number of fixed coefficients contained within C. The number of different coefficients needed
vary from system to system and can be drastically reduced for symmetrical systems.
9
In this thesis, the most interesting set of constraints are those that make Hookes law describe
an orthotropic material in cylindrical coordinates. It can be shown that for an orthotropic
material only 12 of these coefficients remains non zero [11]. Hookes Law then takes the form
of the following six equations:
u
u
u
u u
u
u
u
u
u
u
o
v
o
v
o c
o
v
o
v
o c
o
v
o
v
o c
E E E
E E E
E E E
z
r
r
rz
z
z
z
z
z
z
r
r
r
z
z
zr r
r
r
r
=
=
=
1
1
1
zr
zr
zr
z
z
z
r
r
r
G
G
G
t
t
t
u
u
u
u
u
u
1
1
1
=
=
=
(2.14)
2.3 Forces in rotating cylinders, orthotropic case
The approximate stresses calculated by (2.5) are good enough for most basic cases. However,
the thin walled cylinder approximation is no longer valid if the difference in inner and outer
radius is increased. In systems containing thick shells, such as the flywheel concept presented
in this thesis, a more advanced method for calculating the stresses is needed. The derivation of
this more advanced method is based on the work of G. Genta [6], M. Trevonen and A.
Pramila[12]. However, as the complete derivation is not presented in either of these two
papers it had to be redone. It is that rederivation that is presented in this chapter.
Figure 3: Cylinder coordinate description and differential piece definition.
As a first step towards this solution some simplifications of the equations presented in the
previous chapter are in order. First, if one considers a small piece from the wall of a cylinder,
and the cylinder is spinning at constant speed with no external forces applied other than that
of the centripetal force, the piece will not experience any shear stresses. This assumption of
zero shear and no external forces can mathematically be described as:
0 = = = = = = = =
z zr z r zr z r
F F
u u u u u
t t t (2.15)
10
Applying this assumption to the equations in (2.10) along with an assumption of perfect
rotational symmetry in the system, 0 =
c
c
u
, only two of the original six will remain non zero,
namely:
0
0
=
c
c
= +
+
c
c
z
F
r r
z
r
r r
o
o o o
u
(2.16)
where F
r
remain the only force affecting the system. This force is the centripetal force per unit
volume, also called force density, and can be calculated by [13]:
r
V
r m
F
r
2
2
e
e
= = . (2.17)
If there are no shear stresses in the system, the axial stress will be constant along the z
direction. However, this is usually is not entirely true. If a cylinder is considered, the axial
strain is usually slightly lower in the ends of the cylinder. But are stabilized and becomes
more or less constant as one approaches the centre of the cylinder.
The next step is to apply the zero shear approximation onto Hookes Law in (2.14) effectively
eliminating the right column. As the radial and hoop strain are of most interest the remaining
three equations can be merged into two by substituting the last,
z
, row into the other two
yielding:


.

\

+ + =


.

\

+ + =
r
r
rz z z
r
z
zr r
r
r
r
r
r
rz z z
r
z
z
r
r
r
E E E
E
E E
E E E
E
E E
o
v v
o
c v
o
v
o
c
o
v v
o
c v
o
v
o
c
u
u
u
u
u
u
u
u
u
u u
u
u
u
. (2.18)
Further simplifications can then be achieved by using the fact that a composite material
wound into a cylinder, with all fibres in the same direction, is approximately transversely
isotropic [14] as long as the winding angle is close to 90. This tells us that:
r z
E E = . (2.19)
With this simplification the equations in Hookes Law take the form:
( ) ( )
( ) ( )
z zr z zr r rz zr
r
r
r
z z rz z r
r
r
z z
E E
E E
c v v v v
o
v v
o
c
c v v v v
o
v v
o
c
u u
u
u
u u u u u
u
u
u
+ =
+ =
1
1
(2.20)
11
In order to solve this system of equations an additional relation between
and
r
have to be
found. This can be done by utilising the first two relations shown in (2.12). If the first derivate
in the second equation is approximated to be zero, meaning that the hoop displacement is
constant around the hoop, something that is usually true, the resulting equations becomes:
r
u
r
u
r
r
r
=
c
c
=
u
c
c
(2.21)
By substituting u
r
in the second equation into the first it can be shown that:
0
) (
=
c
c
=
c
c
r
r
r
r
r
r
u
u
u
c
c c
c c
(2.22)
relating the two main system strains to each other.
In order to reduce the number of unknowns, the next step is to replace
in equation (2.20)
with
from (2.16) yielding the following expressions, where the prime sign symbols
differentiation with respect to r:
( )
( ) ( )
( )
( )
( )
z zr z zr r
r r
rz zr
r
r
r
z z rz z r
r
r
z z
r r
E
r r
E
E E
r r
c v v v v
e o o
v v
o
c
c v v v v
o
v v
e o o
c
u u
u
u u u u u
u
u
+
+ + '
=
+
+ + '
=
2 2
2 2
1
1
(2.23)
By then combining (2.22) with (2.23) the
and
r
strains can also be eliminated resulting in
the following differential equation:
( )
( )
( )
( )
( ) ( )
( )
( ) ( ) 0 1
1
1
2 2
2 2
2 2
=


.

\



.

\

+
+ + '
c
c


.

\

+
+ + '
+
+ + '
z z rz z r
r
r
z z
r r
z z rz z r
r
r
z z
r r
z zr z zr r
r r
rz zr
r
r
E E
r r
r
r
E E
r r
E
r r
E
c v v v v
o
v v
e o o
c v v v v
o
v v
e o o
c v v v v
e o o
v v
o
u u u u u
u
u u u u u
u
u u
u
(2.24)
12
By then replacing
r
in the previous equation with the known relations between Youngs
Modulus , Shear Modulus and Poisson's ratios, here presented with the approximation from
(2.19) applied to the default case for an orthotropic material [11], yielding:
1
2
1
2
1
2
= = =
= = = =
rz
r
zr
z
zr rz
r
r
r
r
z
z
z r
G
E
G
E
G
E
E
E
E
E
v v
v v v v
u
u
u
u
u
u u
(2.25)
and then performing the differentiation of the last term in equation (2.24) the following
expression is obtained:
( )
( )
( )
( )
( ) ( )
( )
( ) ( ) 0 1
2 2
1
1
2
2 2
2 2
= ' + +
'
+
+ ' + ' '
+ + +
+ + '
+
+ + '
z z rz z r
r
r
z z
r r
z z rz z r
r
r
z z
r r
z zr z zr r
r r
rz zr
r
r
r
E
r
E
r r
r
E E
r r
E
r r
E
c v v v v
o
v v
e o o
c v v v v
o
v v
e o o
c v v v v
e o o
v v
o
u u u u u
u
u u u u u
u
u u
u
(2.26)
Moving all terms in (2.26) not depending on
r
to the right side, in order to structure the
expression, yields:
( ) ( )
z z
zr z z z z
z z
z zr r
z z
rz zr
r
r r r
r
E
r
E
E
r r
u u
u
u
u u
u u
u u
u
v v
v c c c v
v v
v v v
e
v v
v v
o o o
' +
+
+


.

\

+
+ =


.

\

' +
=
+
=
1
1
1
1
2
(2.28)
the equation in (2.27) takes the form of:
( ) ( ) o  e o o o + = + ' + ' ' 3 1 3
2 2 2 2
r r r
r r r
(2.29)
13
In this differential equation both
r
and
z
depend on r making it significantly harder to solve.
The equation, (2.29), can be made simpler if an approximation of zero axial strain is made.
This constrain will force
z
to zero in all cases, effectively eliminating the r dependent term
from the differential equation making it take the form of a ordinary linear differential equation
of the second order. The general solution to this EulerCauchy [15] differential equation can
be written as:
( ) ( ) 
e
o +
+ + =
+
3
9
2
2 2
) 1 (
2
) 1 (
1
r
r C r C r
r
(2.30)
where C
1
and C
2
are constants, depending on the boundary conditions.
An expression for
can then be found by inserting (2.30) into (2.16) yielding the expression:
( ) ( )
( )
2 2
2
2 2
) 1 (
2
) 1 (
1
2
2 2
) 1 (
2
) 1 (
1
3
9
3
9
r
r
r C r C
r
r C r C
r
r r
e 
e

e
o
u
+ +
+ + +
+


.

\

+
+ +
c
c
=
+
+
(2.31)
By performing the differentiation of the first term and multiplying the last one with
9
9
2
2
the
above equation takes the form of:
( ) ( )
( )
9
) 9 (
3
9
3
9
2
) 1 ( ) 1 (
2
2 2 2
2
2 2
) 1 (
2
) 1 (
1
2
2 2
) 1 (
2
) 1 (
1
+ +
+ + +
+ +
+ + + =
+
+
r
r C r C
r
r C u r C r
e

e

e
o
u
(2.32)
which can be reduced to:
( ) ( ) ( )
2
2
2 2
) 1 (
1
) 1 (
2
3
9
r
r C r C r
+
+ =
+

e
o
u
(2.33)
In order to determine the C
1
and C
2
constants present in both (2.30) and (2.33) a set of
boundary conditions is needed. In this application an appropriate set of conditions is that both
the inner and outer cylinder surface is subjugated to a generic pressure. These pressures will
serve to simulate the radial interference between the shells, this as the presence of a
neighbouring shell can be replaced by an appropriate pressure to one of the cylinder surfaces.
If these ideas are implemented as boundary conditions, they can be written as [12]:
( )
i r
P a = o and ( )
o r
P b = o (2.34)
where a represents the cylinder inner radius and b its outer radius. P
i
and P
o
symbols the inner
and outer surface pressure respectively.
14
By inserting both terms in (2.34) into (2.30) the following expressions is obtained:
( ) ( )
( ) ( )
o
r
i
r
P
b
b C b C b
P
a
a C a C a
=
+ +
+ + =
=
+ +
+ + =
+
+
1
3
9
1
3
9
2 2
2 2
) 1 (
2
) 1 (
1
2 2
2 2
) 1 (
2
) 1 (
1
o

e
o
o

e
o
(2.35)
which is an simple linear system of equations with respect to C
1
and C
2
, in which only C
1
and
C
2
remains as unknowns.
By inserting C
1
from the first equation in (2.29) into the second one and performing some
simple algebraic operations the following expression for C
1
and C
2
is obtained:
( ) ( ) ( )
( )
i
b a
a P b P a b K
C
b a
b a P a b P a b b a K ab
C
2 2
1 1 3 3
2
2 2
3 3
1
+
=
+
=
+ + + +
(2.36)
where ( ) 
e
+
= 3
9
2
2
\

+
+
=


.

\

+
+
=


.

\

+
+
+


.

\

+
+
=
i
i o
i o
i
o i
i
o
i o
i o
o
i i
o
i
i o
i o
i
o
o
i o
i o
o
i
r
i
r r
r r
E
r P
R R
R R
E
R P
r r
r r
E
r
R R
R R
E
R
P
v o
v o
v v
o
2 2
2 2
2 2
2 2
2 2
2 2
2 2
2 2
(2.37)
Depending on the size of the interference, and hence the interface pressure, the material will
experience a number of internal stresses. For this thesis, the most important are the hoop and
radial stresses. This as, these stresses easily can get large enough to plasticise or even crack
the surrounding material, if the interference is designed incorrectly.
17
3 Simulations
3.1 Simulations in SolidWorks
The SolidWorks model of the flywheel was made as a fullscale model containing all
individual parts needed to build the real flywheel. However, as most of the machines support
structure was already done at the beginning of this thesis most of the modelling and
subsequent simulations focused on the rotor. The simulations were made using constant speed
loads, pressfit loads and constant temperature loads.
3.1.1 Approximate dimensions
By using the limiting values found under specifications together with the flywheel formulas
from the theory chapter a rough estimate of the flywheels dimensions can be made, this in
order to provide a starting point for the flywheel design process.
Input data, estimated: Note:
1600 [kg/m
3
] Approximate density of carbon composite
r
i
100 [mm] Flywheel inner radius
h 300 [mm] Flywheel height
Input data, from specifications:
n
r,max
30000 [rpm] Maximal rotational speed
n
r,min
15000 [rpm] Minimal rotational speed
E
k,min
1.08 [MJ] Stored kinetic energy
Table 3: Approximate data.
Using equation (2.4) the required moment of inertia, that is required in order to store the
specified energy, can be calculated:
2918 . 0
) 15000 30000 ( 4
10 08 . 1 2 3600
) ( 4
2 3600
2 2 2
6
2
min ,
2
max ,
2
=
=
t t
r r
k
z
n n
E
I (3.1)
Using equation (2.6) the required outer radius can be then be calculated:
  mm r r r r r h I
o o i i o z
5 . 148 2918 . 0 ) )( (
2
1
2 2 2 2
= = + = t (3.2)
Using this radius and the mass formula for a cylinder the flywheel weight is calculated to:
  kg m
c
17 . 18 ) 1 . 0 1485 . 0 ( 3 . 0 1600
2 2
= = t (3.3)
So in order to store 300Wh of energy in a 300mm high, carbon composite flywheel with an
inner radius of 100mm an outer radius of around 150mm is needed, and such a flywheel
would weigh around 20kg.
18
3.1.2 Using orthotropic materials
As a first step towards understanding the behaviour of rotating shells in SolidWorks some
initial simulations were done. These simulations were done on a system with values close to
those found in the approximate dimensions calculation, this in order to keep the simulation
results on a sensible scale.
One of the first problems encountered in SolidWorks was the usage of orthotropic materials in
cylindrical coordinate systems. In SolidWorks the only difference, between an orthotropic
material defined in Cartesian coordinates and an orthotropic material defined in cylindrical
coordinates, is the frame of reference used. If a surface, plane or edge is selected the material
becomes defined in a Cartesian coordinate system and if instead an axis is selected the
material becomes defined in a cylindrical coordinate system around this axis. However in the
move form Cartesian coordinates, x y z, to cylindrical coordinates, r z, SolidWorks continue
to name its variables with x y z as subscripts. So the question arise which index is which? Is x
now , r or even z? Only one example of this was found on SolidWorks support page [17].
Figure 5: Coordinate naming in a cylindrical coordinate system
And it stated that if the reference axis of symmetry is going along the zaxis in the Cartesian
coordinate system, the z direction remains z even in cylindrical coordinates. Furthermore, it
was stated that in that case x becomes and y becomes r. Note that this is only verified to be
true as long as the symmetry axis goes along the z direction, so instead of trying all possible
combinations, and facing the risk of mixing coordinate systems, it was deemed safer to just
build all CADmodels with symmetry around the zaxis from this point on.
19
3.1.3 Pressfits
SolidWorks is capable of performing calculations on pressfits and shrinkfits, calculating
both the resulting deformations and interface pressures. The calculations works for both
isotropic and orthotropic materials, but sometimes generate questionable results if different
magnitudes of interference are used between the shells on orthotropic materials. Due to this it
is recommended to take a closer look on the results generated, in order to avoid the usage of
questionable results.
In order to make a pressfit the model have to be made with the interference built into the
parts, meaning that the part that is to be pressfitted have to be modelled a little bit too big, for
shafts, or a little bit too small, for holes. The pressfit is then defined in the simulation mode
as a component contact type named: shrinkfit. Setting the option Incompatible bonding
options to More accurate also improves the accuracy of the pressfit calculations [18].
During this work it was additionally observed that the mesh size must be fine enough, so that
each shell is at least divided into three regions, in order to give satisfactory results.
Figure 6: Shell interference with two surfaces, defined as a pressfit with zero friction.
20
3.2 Matlab calculations with Spin2Win
The Matlab program Spin2Win [19] is based on the equations described in the theory chapter.
Using these equations the Matlab program calculates three important aspects of the system.
The first aspect is the effect of the centrifugal loads and its distribution through the material,
this is important to know as it sets the limits for the design. The second calculated aspect is
the effects of interference and surface contact in between the different layers, this is also an
important design variable as it introduces stresses in the flywheel. Lastly, the likelihood that
pressfits will be used as the main fastening method means that the program also has to be
able to cope with pressfit calculations as well as the effects that they will have on the rest of
the system.
3.2.1 Centrifugal forces
The pure centrifugal forces are calculated using equations (2.24) and (2.27) together with
(2.30) and the interference pressures set to zero. This is equal to that the shells have no
interaction at all and all shells rotate free of interference from their neighbours. The stress
distribution is described as a function or radius, with the values determined by the material
parameters as well as the cylinder geometry. For isotropic materials, such as most metals,
these calculations can be simplified by the fact that becomes 1, this is however not the case
for orthotropic materials, such as composites. For Matlab this makes little difference, and the
equations generate accurate results regardless of material. Note that the red and black line is
not present in the figure below. This, as the example system did not contain any pressfits
Figure 7: Example stresses due to centripetal forces in an aluminium cylinder at 22k rpm.
21
3.2.2 Pressfit calculations, matrix approach
The equations presented in (2.31) are meant to be used on a two shelled, isotropic geometry.
Therefore, problems occur if more than two shells are used or if the shells are made of
orthotropic materials, ultimately making the model utterly useless for all but few cases
encountered in this thesis. So in order to work around these limitations some modifications of
the formula was needed.
As a first step the equation had to be modified so that it could work with more than two shells
at a time. This would not solve the problems it had with orthotropic calculations, but it was
deemed to be good enough as a first approximation. The solution was to convert the equation
into a matrix and from there construct a linear system of equations containing the geometry of
all shells. After some trial and error with trying to find the correct deformational relationships
between the shells a working matrix was found. The full creation of the final matrix can be
seen in the Main_calc code description found in Appendix A.
Below is an example matrix that represents a four shelled system. Due to the clear pattern in
the matrix it can easily be expanded for a larger system, or reduced for a smaller one.
(
(
(
(
(
(
(
(
(
(
(
(
=
1 0 0 1 1 0 0 0 0
1 1 0 0 1 1 0 0 0
0 1 1 0 0 1 0 0 0
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
3
2
1
3
2
1
U
U
U
K
K
K
A
(
(
(
(
(
(
(
(
(
(
(
(
=
3
2
1
0
0
0
0
0
0
o
o
o
B
(
(
(
(
(
(
(
(
(
(
(
(
=
9
8
7
6
5
4
3
2
1
x
x
x
x
x
x
x
x
x
C , (3.4)
where K and U are factors derived from the last two equations in (2.31) and looks as follows:


.

\

+
=


.

\

+
+
=
+
+ +
+ +
+
+
n
n i n o
n i n o
n c
n i
n
n
n i n o
n i n o
n c
n i
n
v
r r
r r
E
r
U
v
r r
r r
E
r
K
2
,
2
,
2
,
2
,
,
,
1
2
1 ,
2
1 ,
2
1 ,
2
1 ,
1 ,
1 ,
(3.5)
The above equation system can be solved quite quickly by using Matlabs build in linear
equation solver. The sought after interference pressures will here be stored in the first part of
the C variable; in this case the three interference pressures would become stored in x
1
, x
2
and
x
3
. As a test of the matrix calculation accuracy it was tested against SolidWorks FEM module
and found to give results within 2% of SolidWorks simulated values, for isotropic materials at
least. But it still performed poorly for orthotropic materials, giving errors as large as 120%.
So in order to be able to do accurate calculations for orthotropic materials even further
modifications of the formulas was necessary.
22
This was done mainly by trying to modifying of the K and U constants so that they did
account for the different Youngs modulus, all this in order to give a neat algebraic solution to
the problem. This did however prove to be a futile attempt and was ultimately abandoned
instead giving room for a numerical method.
3.2.3 Press fit calculations, numerical approach
The numerical method is based on shell displacement combined with the equations shown in
(2.12) and (2.33) together with Matlab's built in solver for nonlinear equation system called
fsolve. In order to calculate the displacements the following relation was used [11]:
u
u
c o
o
c
r
r
r
r
=
=
. (3.6)
The main idea is to use the fact that the interface pressure must be large enough to compress
or expand the different components so that the resulting displacements overcomes the initial
interference between the components. This can be written as:
( ) ( ) 0
int 1 , ,
=
o o o
o n r i n r
P P . (3.7)
Using the pressures from the matrix calculation, the nonlinear solver makes a first calculation
of how large deformations these pressures would introduce into the system. By then
comparing these deformations to the given interface between the parts the solver can
approximate a new set of pressures that hopefully gives a better result. The solver then repeats
this procedure until a set of pressures is found that makes all resulting remaining interferences
zero. For a more detailed description please see the Pd_calc section in Appendix A. With the
final function of the Matlab code working some evaluation of the codes performance was
needed.
23
3.3 SolidWorks versus Spin2Win
The Spin2Win Matlab program was designed to replace SolidWork's somewhat slow FEM
module as the main design tool used in this project. But in order to be sure that it was accurate
enough a comparative study between the two was needed. The goal of this study was to verify
that both SolidWorks and Spin2Win gave the same results for the same input data. If so was
proven the case Spin2Win would be used as the main design tool from here on. The
simulation results from SolidWorks was extracted from the FEM module using the built in
probe tool and then imported into Matlab and plotted on the same type of plots that was used
for the Spin2Win program, this in order to simplify the comparison between the results.
When using the probe tool to extract simulation data it is important that it have been set up in
the right way. In order for it to extract data in cylindrical coordinates it is crucial to choose the
used axis of symmetry under advanced options, see Figure 8, as an extra reference when
defining stress, strain or displacement data plots. Else, SolidWorks will use its default settings
and measure in Cartesian coordinates.
Figure 8: Stress plot in along X with the central axis set as an extra reference
If successful the symbol shown in Figure 9 should appear in
one of the corners of the main window, in addition to the
normal XYZ symbol. This new symbol informs the user
about the used notations. In this case the old X direction is
now connected to R, radial direction, and hence plots defined
in X direction will now show radial forces. The Y arrow
have disappeared and been replaced by a greentinted
cylinder, telling the user that plots defined in Y direction now
will show hoop forces. Z remains the same as before the
switch.
Figure 9: Symbol for cylindrical
coordinates
24
3.3.1 Case 1: Aluminium cylinder at 22k rpm
In the first case a single, spinning, aluminium cylinder was investigated. This was done in
order to test Spin2Wins accuracy when it comes to calculating simple stress distributions
through an isotropic material. This single cylinder was kept at a constant 22.000 rpm.
Input data:
Shell 1 Aluminium, isotropic:
Inner diameter: 100 mm
Outer diameter: 300 mm
Height: 250 mm
Results:
Figure 10 shows a segment of the aluminium cylinder from SolidWorks. The segment is a 32
cut, constrained with circular symmetry, in order to save simulation time. In the picture the
radial stress distribution is shown. The distribution is not the same in both ends of the
segment due to the fact the lower end is constrained with a zero axial movement constraint.
Figure 10: A cut of the Aluminium cylinder in SolidWorks FEM module.
25
A mesh with an element size of 6mm was used in this simulation. The measurements were
taken in the middle of the mesh where the axial stress was more or less constant. The
extracted data was then imported into Matlab where it was combined with the results from
Spin2Win. The plot below shows this combined data.
Figure 11: Simulation results for Case 1.
Conclusion, Case 1:
The calculations for the radial and hoop stress are accurate to within 2.5% between the two
methods. However, the error increases somewhat for the displacement calculation with the
first section still being within 2.5% but as the radius is increased so does the error, with the
final data tip being 10% off and still falling. The reason for this remains unknown but
probably has its origin in the fact that Spin2Win ignore axial strains while SolidWorks does
not. But overall the results are within acceptable limits. This shows that Spin2Win is capable
of doing calculations on isotropic materials even though it is developed for orthotropic
calculations.
26
3.3.2 Case 2: Pressfitted aluminium into a Carbon composite
In this case Spin2Wins ability to calculate pressfit pressures in a system with both isotropic
and orthotropic materials was put to the test. In order to remove additional sources of errors
the two cylinders were kept stationary.
Input data:
Shell 1 Aluminium 7075, isotropic:
Inner diameter: 100 mm
Outer diameter: 200.5 mm
Height: 250 mm
Shell 2 T700epoxy, orthotropic:
Inner diameter: 200 mm
Outer diameter: 300 mm
Height: 250 mm
Results:
The results have been extracted in the same way as in Case 1. The simulation was again made
on a 32 cut and with a mesh size of 6mm. Figure 12, below, shows SolidWorks somewhat
lacking method of organizing and labelling data points. The points here marked in the figure
were also the points that were later used to extract the simulation data from the model.
Figure 12: Data point labeling in Solidworks
27
The results below have again been made in the same way as in Case 1 with a combination of
Spin2Win and SolidWorks data.
Figure 13: Simulation results for Case 2
Conclusion, Case 2:
The curve shapes are again quite similar in between the two methods. However, their
magnitude differs a lot more than in Case 1. Spin2Win gives, for the hoop stress, values that
are around 10% off, compared to the SolidWorks data. The same can be said for the radial
stress where the bottom point is 13% off target. However the error shrinks closer to the
endpoints. The displacement curve is the worst one, with a difference as large as 50%
between the two models. Combined, these errors makes Spin2Win unfit for calculations on
systems in standstill, where precision is needed. It can however still be used as an evaluation
tool that shows the scale of the forces in play.
28
3.3.3 Case 3: Pressfitted aluminium, glass, carbon in 22k rpm
In Case 3 a three shelled geometry was used. The setup consisted of one inner aluminium
cylinder onto which a glass fibre and then also a carbon fibre cylinder was pressfitted. All
three shells were then spun up to 20.000 rpm. This case was designed to test Spin2Win's
ability to cope with multiple shells of different materials while rotating.
Input data:
Shell 1: Aluminium 7075, isotropic:
Inner diameter: 100 mm
Outer diameter: 200.5 mm
Height: 250 mm
Shell 2 Advantexepoxy, orthotropic:
Inner diameter: 200 mm
Outer diameter: 300.25 mm
Height: 250 mm
Shell 3 T700epoxy, orthotropic:
Inner diameter: 300 mm
Outer diameter: 350 mm
Height: 250 mm
Figure 14: Spin2Win GUI
Above is a picture of the Spin2Win GUI with the data from Case 3 fed into the correct fields.
Note that all fields that are unused are filled with zeros. This is not necessary as Spin2Win
will automatically ignore all fields above the first three as the "Number of active shells"
setting is set to 3.
29
Results:
The simulation was again made on a 32 cut but with a mesh size of 8mm instead of 6mm due
to the larger model. This reduced the number of mesh elements in the model and hence saved
some simulation time.
Figure 15: Simulation results for Case 3
Conclusion, Case 3:
Again the curves seem to follow each other quite nicely. The Spin2Win hoop stress varies in
between 8% and +3% from the values taken from SolidWorks. For the radial stresses it looks
a bit worse. Measured in absolute values the difference is quite small, around 3MPa, but in
percentage terms the error is at average around 25% with datapoints. The radial displacement
curve is almost identical in between the two methods, with an average error at around 5%.
Apart from the last interference in between the carbon and glass composite where the error is
around four times as large. The same kind of "peak" error could be seen in Case 2 so at least
the error is consistent. Overall it seems that the errors are a bit too large for it to be safe to
solely use Spin2Win as the main design evaluation method. However, it can be used to find
an approximate design and as a method to comparing two or more different designs.
30
4 Machine design
A quick overview of the whole machine will be presented in this chapter, this in order to both
document the design, as well as to ease the understanding of the function of the machine as a
whole. The machine is here divided into its main parts, each part containing a number of
smaller components. For an even more detailed view of the machine refer to Appendix B:
Machine Drawings. The word part in this text refers to an assembly or joining of two or
more smaller components.
Figure 16: Photo rendition of the complete flywheel with a 45 cut.
The picture above shows the complete assembled machine, excluding copper windings and
permanent magnets. Each structure has been given its own paragraph, beginning on the next
side, describing its function and components. Note that no bolts or nuts are present in this
SolidWorks model, this in order to reduce the workload on the used computers.
31
4.1 Support structure
The support structures main function is to act as a platform on which all other components
are fastened. It consists of two main aluminium plates (1) containing a number of guiding
holes and slots. The plates are spaced from each other with six square steel pipes (2) bolted to
the plates by the use of brackets. In order to be able to stiffen the structure if need be, the six
steel pipes also have holes (3) in which diagonal steel wires can be mounted and tightened
using turnbuckles in order to stiffen the structure. Both the upper and lower plate has a backup
bearing (4), should the magnetic bearings fail. Both sides also have a plastic cup (5) for the
magnets of the passive axial magnetic bearing.
Figure 17: Support structure overview
32
4.2 Active magnetic bearings
The active magnetic bearing consists of two parts, one static and one moving. The static part,
shown in Figure 18, is fastened into the main plates of the support structure. It contains the
electromagnets for the magnetic bearings and two position sensors (6) used to define the main
shafts location. In the picture the electromagnet windings are not in place so the stator plates
(7) lies bare. On the top side there are four holes (8) that are later are to be used by the
electromagnet cables. In order to reduce the eddy current losses plastic bolts (9) are used to
press the stator steel plates together, instead of regular iron bolts.
Figure 18: Active magnetic bearing housing, over and underside
The moving part is the magnetic bearing target, shown in Figure 19, which is fastened to the
machines main shaft by the use of screws placed in the three inclined slots (12). The whole
target and shaft is then placed inside the central hole in the above stationary part. The target
consists simply of two aluminium plates (13) on each side of a circular stator steel stack (14).
Again plastic bolts (11) are used in order to reduce eddy current losses.
Figure 19: Active magnetic bearing target, over and underside.
33
The electromagnets stator steel is divided into four sections (10) each with two teeth each.
Each sections windings can be individually controlled using external powerelectronics and
as such the forces on the magnetic bearing target can be controlled. If the sensors detect that
the shaft is too close to one side the winding current is increased on the opposite side leading
to the attraction of the target to that side. As the positional error shrinks the powerelectronics
reduces the winding current as well, effectively centring the main shaft.
4.3 Stator
The stator consists of a central pipe (15) with 27 individual windings (16) glued to its surface.
The windings are divided into 18 high voltage and 9 low voltage windings distributed
over three phases. This allow energy to be fed to the machine through the low voltage
windings at the same time as energy is drained from the high voltage windings, effectively
separating the charge circuit from the drain circuit making their operation more or less
independent of each other. The stator is fastened to the one of the main plates in the support
structure by the use nine small screws each with its own premade hole (17).
Figure 20: Schematic model of the stator.
34
4.4 Rotor
In the core of the rotor is an aluminium cylinder (22) on which all other components are
mounted. The machines central shaft (18) is mounted in the central hole of the aluminium
cylinder through pressfitting. On the main shaft an aluminium cup (20) and steel cylinder
(21) is then fastened, also through press fitting. The purpose of the aluminium cup is to both
stabilize the steel cylinder and to act as housing for the plastic cup (19) containing the axial
bearing magnets. The steel cylinder also has two functions; one is to act as a yoke for the
magnetic flux in order to reduce the reluctance of the magnetic circuit, and the other is to
strengthen the press fit between the main shaft and aluminium core by preventing the
aluminium to expand. On the opposite side from the aluminium cup is yet another plastic cup
(24) containing the other half of the axial bearing magnets, this so that the rotor can be
supported from both directions.
Figure 21: Rotor cross section and the rotor as a whole
Inside the aluminium cylinder is a plastic matrix (26) containing the machines permanent
magnets (25). The magnets are arranged in a Halbach structure in order to strengthen the field
going inwards, this in an attempt to compensate for the loss in field strength due to the fact
that the magnets are not mounted on a ferromagnetic core as is often the case in other
permanent magnetized machines.
Lastly the whole core is inserted into a thick shell of composite (23) which will act as energy
storage; by increasing the systems moment of inertia, and as structural support; by preventing
the core from expanding as the rotational speed is increased. The making of this composite
shell was proven not to be a trivial task and as such external experience had to be brought in.
35
4.5 The Swerea SICOMP concept
Swerea SICOMP in Pite, Sweden assisted this project with the composite design,
calculations regarding residual stresses; as a result of manufacture as well as material data and
general composite design tips. Additionally, they will also be the ones producing the final
flywheel composite.
4.5.1 Layups
Although an approximate shell size had been calculated in 3.1.1 it was far from a final shell
design. After some initial discussion and concept refining the following main concepts for the
composite layup was proposed by Swerea [22]. These layups are specially designed so that
they can be cured in once curingcycle, this in order to reduce the cost of the composite. The
alternative being that each layer is cured individually and then pressfitted onto each other, a
method that have previously been proven valid although expensive [20].
Layup 1 Layup 2
Thickness Angle Tension Material
Thickness Angle Tension Material
(mm) () (MPa) ()
(mm) () (MPa) ()
4 89.5 40 T700
4 89.5 40 Advantex
14 89.5 60 T700
26 89.5 60 Advantex
16 89.5 70 T700
26 89.5 70 Advantex
16 89.5 80 T700
24 89.5 80 T700
Layup 3
Thickness Angle Tension Material
(mm) () (MPa) ()
4 89.5 40 T700
26 89.5 60 T700
26 89.5 70 T700
24 89.5 80 T800
Table 4: Proposed composite layups
In this table the thickness column gives the proposed wall thickness of each shell section. The
angle column tells what winding angle that is to be used for the filament, as seen from the
flywheel central axis. The tension column contains which tension that is to be applied in the
filament as it is wound onto the flywheel. Finally the material column simply gives material
of the used filament for each section.
As can be seen in Table 4 Layup 1 consisted solely of T700 carbon composite only wound
with different filament tensions in an attempt to minimize the residual stresses. Layup 2 is a
mixture of glass and carbon fibre and it was presented as a cheaper alternative to Layup 1.
Finally Layup 3 consists of three layers of T700 and a final layer of the much more expensive
T800. This was presented as a high end alternative as T800 can withstand higher stresses than
that of T700 but for a higher cost.
36
4.5.2 Manufacturing
As mentioned in the previous paragraph the composite is to be produced by the winding of a
thin fibre around a central cylinder, a method commonly known as filament winding. The
basic idea of filament winding is to wind one or more separate threads onto a core cylinder,
known as the mandrel. Alongside the mandrel then goes a track on which a fibre guide travels
up and down the mandrels length. As the mandrel spins the guide ensures that the matrix
drenched filaments is evenly distributed along the mandrel. Once the desired thickness of the
composite is reached the whole mandrel is put in an oven in which the matrix cures or
hardens. After its time in the oven the mandrel and composite is allowed to cool. Once the
composite have cooled off the mandrel is removed leaving the finished composite cylinder.
[21]
Figure 22: Schematic picture of the filament winding process
Often, as the filaments are wound onto the mandrel, the tension in the filaments is regulated in
order to minimize the residual stresses that will be created during the curing process. In the
concepts from Swerea the composite would be wound with both different tensions and
materials. Additionally, the composite would also be wound on a steel mandrel.
The reason that the composite is not directly wound onto the flywheels aluminium core, and
instead wound onto a steel mandrel first, is that the composite shell often comes loose from its
mandrel after curing. This is often just a welcome side effect, as it makes the mandrel easily
separable from the composite, but in this application the composite must sit firmly on the
aluminium core with no risk of coming loose.
37
4.5.3 Residual stresses
The previously mentioned residual stress is an effect of the different thermal expansion
coefficients between the materials in the composite, alongside with the chemical shrinkage of
the matrix during curing. As the composite is heated, during the curing process, the uncured
liquid matrix allows the composite fibres expand freely. But after the curing, as the composite
is allowed to cool off, the fibres in the composite are no longer allowed to freely move as the
matrix now is in solid form. Furthermore, even more stresses are created due to the fact that
the matrix itself usually shrinks somewhat during curing, as it moves from being a viscous
liquid to a crosslinked solid material.
Together these two effects create the so called residual stresses in the composite. The residual
stresses remain inside the material after it is finished and is impossible to get completely rid
of, although they can be reduced. If these stresses are not considered while designing the
composite, or if the material is wrongly cured, the residual stresses can easily get large
enough to permanently damage the composite as it cools. These damages primly consist of
fibre breakage; which weakens the material, and delamination in between different layers in
the composite; creating cracks inside or on the surface of the composite.
Figure 23: Residual radial stresses for Layup 2 on a steel mandrel.
The figure above shows an example of the radial residual stresses taken from the simulation
data generated by Swerea. The top is at around half the yield strength of the epoxy matrix and
given the thickness of the shell this is quite a good result. However, this means that half of the
material strength is used up for residual stresses leaving less than half the strength for the
actual load.
0
2
4
6
8
10
12
14
99 119 139 159 179
R
a
d
i
a
l
S
t
r
e
s
s
(
M
P
a
)
Radius (mm)
38
Figure 24: Residual tangential stresses for Layup 2 on a steel mandrel.
As can be seen in the graph above the residual tangential stresses becomes much larger than
the radial ones. This is generally the case as a filament wound cylinder is much stiffer in the
tangential direction, along the fibres. The values shown here, although high compared to the
radial ones, are of no concern as the composite have a tensile strength of around 2500MPa in
this direction.
Figure 25: Axial residual stresses for Layup 2 on a steel mandrel.
The residual axial forces, shown above, seem to remain low throughout the material. All data
presented here was again supplied by Swerea [22]. For each Layup similar graphs of the
residual stresses were generated, each set containing graphs for all three main stresses; axial,
radial and tangential With this data as a base the real design of the flywheel composite could
commence.
110
60
10
40
90
140
99 119 139 159 179
T
a
n
g
e
n
t
i
a
l
S
t
r
e
s
s
(
M
P
a
)
Radius (mm)
15
13
11
9
7
5
3
1
1
3
5
99 119 139 159 179
A
x
i
a
l
S
t
r
e
s
s
(
M
P
a
)
Radius (mm)
39
4.6 Layup evaluation with Spin2Win
As mentioned previously, Spin2Win was not deemed accurate enough to be used as sole
design method. However, it was deemed accurate enough to be used as an evaluation tool,
used for identifying the most promising design among a number of different alternatives.
Among the three proposed layups; Layup 1 and Layup 2 were deemed the most interesting.
This as Layup 3 was not only the most expensive but also had a much higher risk to
delaminate during manufacturing, according to the simulations made by Swerea. An initial
simulation was then made on the two remaining layups and the results are shown in the graph
below. Note that the composite shells at this stage were assumed to float freely in space
without any constraints. This as the most interesting factor, at this stage, was the composites
performance itself, and not its interaction with the rest of the system.
Figure 26: Layup 1 and 2 comparison, 30k rpm.
One of the most interesting differences from the graphs above is the difference between the
shapes of the two radial stress graphs. The main, black, radial stress curve from layup 2 has an
overall lower magnitude as well as the fact that it even goes negative for the last part. The fact
that it goes negative is a sign that the matrix in the material is subjected to compressive
stresses, something that is welcome as the compressive strength of epoxy is many times
higher than its tensile strength.
This differences between the two layups, made layup 2 the most interesting one for further
testing. Although, layup 1 had both lower hoop stress and radial displacement, the fact that
layup 2 had a more favourable radial stress distribution was the deciding factor. The reason
for this, as previously mentioned, is that the first thing to fail in a cylindrical composite often
is the matrix in between the filament layers. This matrix failure is often a result of high radial
tensile stresses; therefore minimising these stresses are top priority.
40
A second Spin2Win simulation was done on Layup 2 but this time both the aluminium core
cylinder was added as well as a layer of dummy magnets on the inside of the cylinder. This
was done in order to make the weight distribution of the simulation closer to that of the real
design.
Figure 27: Layup 2 with added core and magnets, 30k rpm
The results of the added weight can be seen in Figure 27. The radial stress is negative or near
negative over the whole radius, this means that the matrix in this case cannot crack from
tensile stress only from compressive stress. But as previously mentioned, the compressive
strength of epoxy is much larger than its tensile strength so this bode well for Layup 2.
Furthermore, the hoop stress in the composite remains well below the tensile strength. The
main problem however, lies in the hoop stress in the aluminium cylinder with values as high
as 600MPa. If one uses Von Mises yield criterion [11] the cylinder will enter the plastic
deformation zone even without the added effect from the radial and axial stress.
41
4.7 Final design in SolidWorks
With an approximate design found in Layup 2, it was high time to try it out in SolidWorks.
This serves two purposes. The first is that Spin2Win, as previously proven, is not deemed
accurate enough to be used as the sole design tool. So for the fine tuning of the design a more
reliable tool is needed. This means that SolidWorks have to be trusted to make more accurate
calculations than Spin2Win, something that has not been proven but is simply assumed to be
the case, as SolidWorks is a multimillion, commercially recognized product.
The second purpose is to compare the Spin2Win results for Layup 2 to this more realistic
simulation in order to see the differences in between the two methods for a full scale system.
Figure 28: Simulation data for Layup 2, 30k rpm
As can be seen in Figure 28 above the Spin2Win calculations is not too far off from the
SolidWorks simulations. However, there are some critical differences. Most important is
perhaps the large difference in the hoop stress of the aluminium cylinder, radius 9398, where
SolidWorks gives a value close to 200 MPs lower than Spin2Win. While the value is still very
high for being in an aluminium construction it is at least below the tensile strength. However,
this could also just be a side effect of the somewhat coarse meshsize used in SolidWorks.
42
In an attempt to even further lower the hoop stress in the aluminium some modifications to
Layup 2 had to be done. Two main methods were used in order to achieve this. The first
alternative was to increase the pressfit in between the composite and aluminium; in order to
increase the initial compressive stress, and the second alternative was to make the composite
stiffer; so it prevents the aluminium from expanding.
The radial interference in between the aluminium and composite could not be made any larger
than 0.2mm due to the fact that the composite was to be shrinkfitted onto the aluminium and
it was unknown how the composite would react to heating and cooling. So in order to be safe
all the shrinking had to be done on the aluminium cylinder by cooling it. At 150C the
aluminium core would have shrunk 0.35mm giving some, but not much, margin for error.
The second method, to stiffen up the composite, was achieved by simply increasing the
amount of carbon fibre composite. It showed that the best ratio was around 5050, meaning
equal thickness of the carbon and glass composite layers.
Figure 29: Layup 2 vs. Layup 2 5050, 30k rpm
43
Figure 29 shows the effects of the increased carbon composite thickness. The aluminium hoop
stress is forced below 400MPa and the radial stress in the glass fibre, radius 98138, is well
below over the whole section. Furthermore, the radial displacement is lowered by on average
20% over the whole radius. There is a drawback with this 5050 layup though, and that is that
the last part of the carbon composite is experiencing positive radial stresses. For this reason
one might argue that it would be better to make the carbon composite a little bit thinner so
that the stress becomes negative again. However, this would lead to a less stiff composite
allowing the aluminium core to expand again. It was deemed that this 5050 layup was the
better of the two alternatives.
5 Conclusion
With the final touches laid to the composite the flywheel design was deemed finished. In
conclusion it can be said that the most important feature in this design is the ratio between
carbon and glass fibre composite coupled with the weight of the magnets in the core. This
allows for control of the radial stresses, which otherwise tends to be the limiting factor when
working with rotating composites.
In this design the heavy magnets starts to press on the aluminium as the flywheel begins to
spin up. This forces the aluminium to expand and start pressing on the inner glass fibre
composite creating compressive stresses throughout the glass fibre. Furthermore, as the glass
composite comes into contact with the much stiffer carbon composite yet another interference
pressure is created that prevents the glass fibre from freely expanding. In turn this second
interference pressure leads to compressive radial stresses in the carbon composite.
This approach has, at least to my knowledge, not been tried before. It is a method that
combines the electrical machine and composite of the flywheel, making them work together
in order to control the radial stresses. More work could be put into finding an even better ratio
or combination, current design is by no means optimal. For example it can be questioned if
the aluminium core is needed at all; perhaps the magnets could be mounted directly on the
composite? As it in its current state is the limiting factor in the design.
As for the stored energy a quick SolidWorks calculation gives a total of 766Wh of stored
kinetic energy in the whole rotor. This is more than double the specified minimum limit.
However, the rotor is also more massive than that which was initially calculated, and now
weighs in at just above 48kg, giving the rotor a specific energy of 16Wh/kg. This is a quite
low number but at least on the same scale as Flybrid Systmes flywheel which had 22Wh/kg. If
this system is able to go beyond the specified speed of 30 000rpm and increase its speed by
20% it will reach the same specific energy as the Flybrid Systems flywheel. Something that is
not impossible as the radial or hoop stress is not yet close to their maximal values.
Machine safety is yet another concern. While the carbon fibre is far from reaching its tensile
hoop stress the same cannot be said for the aluminium and glass fibre. With the most critical
being the aluminium core, having stresses close to the 500MPa yield strength. The theory here
is that the carbon composite will be the material holding the machine together. However, this
has not yet been verified as a valid method and should be marked for some further studies. At
the moment these concerns will be addressed by performing the initial flywheel tests inside a
vacuum chamber with thick steel walls.
44
The Matlab program, Spin2Win, that have been developed as a part of this thesis have shown
to be a powerful tool to quickly compare different flywheel designs as it can solve a problem
in seconds that would take SolidWorks hours. Furthermore, it have shown its capability as a
mean of designing a rough flywheel layout. It is at its current state though a little bit to
inaccurate for it to be used as the sole design tool. Much of these inaccuracies probably comes
from the many approximations done during the derivation of the used formulas. If Spin2Win
is to become and actual alternative to FEM based solutions it needs more work, and perhaps
even the derivation of even more advanced equations.
In total it I think it can be said that this is a promising concept although it needs a lot more
work to reach its true potential. With the speed that Spin2Win can perform calculations it
would not be impossible to couple it to some kind of optimization algorithm in order to find
an even more optimal design. Furthermore, the design as a whole would benefit from some
major changes, the most important being to get rid of the aluminium core and main shaft.
Ideally the flywheel should be a thin walled cylinder freely levitating in a vacuum chamber
something that could be achieved by moving the magnetic bearings to the outer side of the
composite shell.
6 Acknowledgements
I would like to start by thanking my supervisors Johan Abrahamsson, Kristofer Gamstedt and
Magnus Hedlund for their time and shown interest in my work. It has been a pleasant
experience working with you all.
Furthermore, a big thank you must go to Swerea SICOMP and Kurt Olofsson in particular for
their help with the composite materials. I am also thankful to Dione Kullager AB and Ingemar
Hermansson in particular for their help with all the parts for the flywheel.
Finally a general thank you goes to the division of Electricity as a whole for providing a fun
and stimulating working environment, filled with nice and dedicated people.
45
7 References
[1] K. Takahashi, S. Kitade, H. Morita, Development of high speed composite flywheel rotors for energy
[2] D. Cross, J. Hilton, High speed flywheel based hybrid systems for low carbon vehicles  Hybrid & Eco
Friendly Vehicles Conference 2008
[3] B. Bolund, H. Bernhoff, M. Leijon, Flywheel energy and power storage systems Renewable and
Sustainable Energy Reviews, Volume 11, Issue 2, February 2007
[4] J. G. Oliveira, J. Lundin, H. Bernhoff , Power Balance Control in an AC/DC/AC Converter for
Regenerative Braking in a TwoVoltageLevel FlywheelBased Driveline  International Journal of
Vehicular Technology, 2011, vol. 2011
[5] Karl Bjrk, Formler och Tabeller fr Mekanisk Konstruktion, 7th edition
[6] G. Genta, Kinetic energy storage Theory and practice of advanced flywheel systems  Butterworths
1985, Page 58, ISBN 0408013966
[7] http://en.wikipedia.org/wiki/Composite_material 04092012
[8] http://i01.i.aliimg.com/photo/v0/338333453/3d_carbon_fibre_sheet.jpg 11062012
[9] http://upload.wikimedia.org/wikipedia/commons/7/71/Cfaser_haarrp.jpg 11062012
[10] Kurt Olofsson, Swerea SICOMP, www.swerea.se/sicomp/
[11] B. Sundstrm, KTH Handbok och formelsamling i Hllfasthetslra, EPrint AB, 2008, Page 127
[12] M. Trevonen, A. Pramila, Stresses in a hollow rotating cylindrically orthotropic tube  Mechanics of
Composite Materials, vol. 32, No. 6, 1996
[13] C. Nordling, J. sterman, Physics Handbook  Studentlitteratur AB, 2006,
ISBN 9789144044538, Page 158
[14] http://en.wikipedia.org/wiki/Transverse_isotropy 11062012
[15] Verified by using the ODE solver on: http://www.wolframalpha.com 11062012
[16] W.H.Dornfeld, ThickWalled Cylinders and Press Fits, 2004
[17] http://help.solidworks.com/2011/english/SolidWorks/cworks/LegacyHelp/Simulation/
Materials/Isotropic_and_Orthotropic_Materials.htm 11062012
[18] http://help.solidworks.com/2011/english/SolidWorks/cworks/LegacyHelp/Simulation/
Meshing_topics/About_Shrink_Fitting.htm 11062012
[19] For the complete code see Appendix A: Spin2Win
[20] R.J. Hayes, J.P. Kajs, R.C. Thompson, J.H. Beno, Design and Testing of a Flywheel Battery for a
Transit Bus  Center for Electromechanics, The University of Texas at Austin, 1999
[21] http://www.etamax.com.au/introduction_to_filament_winding.pdf 11062012
[22] K. Olofsson, SICOMP CR12024, 2012, www.swerea.se/sicomp/
46
8 Appendices
Appendix A: Matlab code
Table of contents
1 Introduction.................................................................................................. 2
2 Detailed descriptions and code ..................................................................... 3
2.1 Spin2Win.fig ................................................................................................................ 3
2.2 Spin2Win.m ................................................................................................................. 8
2.3 Main_calc.m .............................................................................................................. 15
2.4 Pd_calc.m .................................................................................................................. 23
2.5 Ten_cr_calc.m ........................................................................................................... 26
2.6 E_M_calc.m ............................................................................................................... 28
2.7 Plotter.m .................................................................................................................... 29
2.8 Load_default_iso.m ................................................................................................... 31
2.9 Load_default_ort.m ................................................................................................... 33
2.10 Split_indata.m ........................................................................................................ 35
2.11 Merge_indata.m ..................................................................................................... 36
2.12 ReadFile.m ............................................................................................................. 37
2.13 Import_n_format.m ................................................................................................ 38
3 Data structure explanations ........................................................................ 39
3.1 Raw import / export data ........................................................................................... 39
3.2 Geometrical data ........................................................................................................ 40
3.3 Settings data ............................................................................................................... 40
3.4 Output structure ......................................................................................................... 41
3.5 Output log file ............................................................................................................ 42
4 Explanation of output graphs ..................................................................... 44
1 Introduction
The Matlab program is designed to calculate the stresses in one or more cylinders rotating
around a central axis of symmetry. It is intended to be used both as a supplement to
SolidWorks FEM module, in order to save calculation time, and as standalone application for
general flywheel and pressfit calculations.
The complete program, named Spin2Win, contains a number of features apart from its main
purpose of calculating material stresses. The current implemented features are:
Radial and Tangential/Hoop stress calculations due to pure centrifugal effects,
pressfit pressures and their combined effect.
Shell radial displacement calculations, for both the pure pressfit case and the
combined centrifugal, pressfit case.
Calculation of the interference pressures between the systems shells, both due to
shell interference as well as centrifugal effects.
Calculation of the assembly force required when assembling the shells with press
fits, this can be used for general construction as well and does not have to involve
flywheels.
Maximal transferable torque calculations that calculate the maximal torque that
can be transferred between two shells, both in the case of standstill and maximal
speed.
Calculations of the total stored energy in the system as well as the energy stored in
a specified speed interval.
Mass calculations for both the individual shells as well as the whole system.
The program is divided into a number of smaller functions each performing a specific task
with data being sent back into a master script that interprets the data and makes a graphical
representation of it. Below is a brief summary of the different functions, for a more detailed
description of each file see next chapter.
Spin2Win_v2.m and .fig Describes a simple graphical user interface that enables easy
modification of the input data that are to be sent to Main_calc. Run Spin2Win.fig from
GUIDE in order for proper execution.
Main_calc.m Contains the calls to all other subscripts except the GUI. Also contains the
diary output code. Takes in data supplied from the GUI or manual input and generates an
output structure called mout.
Pd_calc.m A function that is internally called by Main_calc in order to iterate forth the
interference pressures between all shells.
Ten_cr_calc.m A function that is internally called by Main_calc in order to calculate the
hoop and radial forces in all shells given the rotational speed, shell geometry and interference
pressures.
E_M_calc.m A function that is internally called by Main_calc in order to calculate the
mass of each shell as well as the total energy stored in the system at a given rotational speed.
Plotter.m Called by the GUI and contains the plot making code. Takes data from the
mout structure generated by Main_calc and generates a number of graphs representing
said data.
load_default_iso.m Called by the GUI in order to load a set of default isotropic data
hardcoded into the load_default_iso file. Return one matrix with geometry and settings
data.
load_default_ort.m Called by the GUI in order to load a set of default orthotropic data
hardcoded into the load_default_ort file. Return one matrix with geometry and settings data.
split_indata.m A function called by the GUI in order to format the input data generated by
functions like load_default_iso into two separate matrices in order to separate geometry and
settings data.
merge_indata.m A function called by the GUI in order to merge the data from the GUI into
one single matrix that it can be sent to Main_calc for processing.
ReadFile.m Called by the GUI to import an old output text file and read the text into a
matrix, also marks the start of each run and save this data into a separate matrix.
import_n_format.m Called by the GUI in order to format the data generated by ReadFile
into the correct format used by the rest of the functions, so that it is accepted by for example
Main_calc
2 Detailed descriptions and code
2.1 Spin2Win.fig
Contains the graphical part of the GUI and together with Spin2Win.m completes the GUI.
The GUI was built as a method of simplifying the input and output of simulation data. So
instead of having to manually create a matrix with the correct format and input variables the
GUI offers a simple way of creating said matrix by the use of editable tables and checkboxes.
Figure 1: An example picture for the GUI in action.
As can be seen in Figure 1 the GUI is divided into a number of different fields. Each field
contains a number of different settings or functions somewhat related to each other.
The Basic Settings field contains, as the name suggests, a number of simulation settings.
Each explained in the list below:
Number of active shells Determines how many shells that are to be included in the
final simulation regardless of how many columns that are filled with values in the
Geometrical and material data field. This number cannot be higher than the number
of columns filled with actual data or the calculation will crash and return inaccurate
data. The number can however be lower and will then just ignore the data in the higher
columns. By default this value is limited to nine active shells, this can if needed be
overridden by checking the Allow more than 9 active shells. checkbox with risk of
causing some strange program behaviours. Must be a positive integer.
Rotor height Determines the value of the height of the rotor in millimetres. This
value is used when the mass of each shell is to be calculated, which in turn influences
the energy stored in the system. This value is also used as the height of the
interference fit and is hence used to calculate the maximum assembly force and
transferable torques. Must be a positive real number.
Maximal speed Determinates the maximum allowed rotational speed, in revulsions
per minute. This also determinates the force magnitude in the results, as all results for
rotating geometries are calculated with the maximal speed. This value is also used
when the amount energy stored in the system is to be calculated. Must be a positive
real number.
Minimal speed Determinates the minimal allowed rotational speed in revulsions per
minute. This value is only used in order to calculate the available energy in the speed
interval between min and max rpm. Must be a positive real number.
Send plots to figure nr Determinates to which figure the graphical representation of
the calculation is to be sent. Must be a positive integer.
Figure and output prefix Mark the simulation and plot figure with a special name
for easy identification when many subsequent simulations are run.
The next field of interest is the Additional Settings field which consists of three
checkboxes that regulate some of the program behaviour.
Allow more than 9 active shells This checkbox overrides the default maximum of
nine active shells per simulation and allows the input of any positive integer into the
Number of active shells field. This can however cause some unwanted program
behaviours and should be used with caution.
Increase figure number after each run Checking this checkbox causes the
program to automatically increase the value in the Send plots to figure nr field each
time the Run Calculation button is pressed.
Generate figures Unchecking this checkbox causes the program skip the
generation of a graphical representation of the results and instead stops directly after
having generated an output structure and file with the said data.
The Unit field is quite self explaining. It simply explains the abbreviations used by the
Geometrical and material data table and beyond that possess no editable fields or other
special functions.
The biggest and most important field is the Geometrical and Material Data field. It is
in this field that all geometrical data, i.e. the shape and size of the flywheel, is entered.
Furthermore all relevant material data for each shell is also entered here. Each column
specifies one shell named Shell 1,2,3 and together a number of columns make up a
complete multilayered flywheel. Shell 1 is the most inner shell and hence must be
made the smallest. Each following shell must be bigger than the one beneath it but smaller
than the next in line. A small difference in Do for say Shell 1 and Di for Shell 2
is allowed. This specifies the interference between the two shells hence determinates the
interference pressures between the two shells. This interference must be made by making
Do(1) < Di(2) (Do, Shell 1 smaller than Di, Shell 2).
Di Shell inner diameter in millimetres. Di for Shell 1 must be smaller than the
Do for Shell 1 and so forth. If this is not the case the program is forced to do
calculations on what is effectively an inverted cylinder; needless to say this causes the
program to ether crash completely or return imaginary values.
Do Shell outer diameter in millimetres. Do for Shell 1 must be larger than the
Di for Shell 1 and so forth. If this is not the case the program is forced to do
calculations on what is effectively an inverted cylinder; needless to say this causes the
program to ether crash completely or returns imaginary values.
Ec Youngs Modulus in circumferential / hoop direction in Giga Pascal.
Determinates the stiffness of the composite hoop. As this is the strongest direction in
most composites it is also often abbreviated E
1
. For metals however this value is the
same as Er as isotropic materials only have one Youngs modulus for all directions.
Er Youngs Modulus in radial direction in Giga Pascal. Determinates the stiffness of
the composite in the radial direction. As this value often is much less than that of the
hoop value in composites it is often abbreviated E
2
. For metals this value is the same
as Ec as isotropic materials only have one Youngs modulus for all directions.
v Poisson's ratio in hoopradial direction also called v index 12. For most metals and
composites this value varies around 0.250.35. The inverse value,
21
radialhoop, for
composites is often much smaller, in the order of 0.02 due to the large difference in
Youngs modulus for different directions.
d Material density in kilograms per cubic metre. The material density determinates
the shells individual mass but also influences the magnitude of the centrifugal force, as
heavier materials experience a larger force, compared to a lighter one, for the same
revolution speed.
The static friction coefficient between two shells. The first friction coefficient is
for the contact surface between Shell 1 and Shell 2, the second is for the surface
between Shell 2 and Shell 3 and so forth.
G Shear Modulus of the material in the radial axial direction. Determinates the
materials shear stiffens.
The Import Data From File field contains a tool that is used to load all the settings and
geometries from a previous run. This is done in order to simplify the reruns of older
simulations and comparison of previous results.
The Load File button is used to load an old output text file. Pressing this button will bring
up a window asking for a text file beginning with Spin2Win_ and ending with .txt. The
target file must be located in the same directory as the main program file. It is possible to load
custom made files as long as they are named correctly and the text inside them are formatted
in the correct way, a tip is to open and modify an existing output file and then just save it with
a new name. Once a file is loaded the central list will get populated with all runs contained
within the loaded file, the list is not updated when new runs is added to the log file and as
such it must be manually reloaded in order for the list to show the most resent runs.
The Load Selected Run button is used to load the geometrical data and other settings from
a specific run. Do this by selecting the name of a run from the list by clicking on it and then
click the Load Selected Run button.
Next to the Import Data From File is the Load Defaults field. Pressing one of these
buttons will case Spin2Win to load a set of default data from load_default_iso.m or
load_default_ort.m. The default geometry contains a nine shelled geometry with even shell
thickness and can be used to quickly get started on a new geometry.
Finally the big Run Calculation button does as one would imagine, clicking this button
executes the simulation and will cause an output file to be generated and if the appropriate
settings is set a plot would also get generated.
2.2 Spin2Win.m
Below is the code from the Spin2Win Matlab function file. This file is connected to the
GUI and contains and controls all the logical operations performed by the GUI.
function varargout = Spin2Win_v2(varargin)
% SPIN2WIN_V2 Mfile for Spin2Win_v2.fig
% SPIN2WIN_V2, by itself, creates a new SPIN2WIN_V2 or raises the
% existing
% singleton*.
%
% H = SPIN2WIN_V2 returns the handle to a new SPIN2WIN_V2 or the
% handle to
% the existing singleton*.
%
% SPIN2WIN_V2('CALLBACK',hObject,eventData,handles,...) calls the
% local
% function named CALLBACK in SPIN2WIN_V2.M with the given input
% arguments.
%
% SPIN2WIN_V2('Property','Value',...) creates a new SPIN2WIN_V2 or
% raises the
% existing singleton*. Starting from the left, property value pairs
% are
% applied to the GUI before Spin2Win_v2_OpeningFcn gets called. An
% unrecognized property name or invalid value makes property
% application
% stop. All inputs are passed to Spin2Win_v2_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one
% instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
% Edit the above text to modify the response to help Spin2Win_v2
% Last Modified by GUIDE v2.5 26Mar2012 16:49:12
% Begin initialization code  DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @Spin2Win_v2_OpeningFcn, ...
'gui_OutputFcn', @Spin2Win_v2_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code  DO NOT EDIT
%
%  Executes just before Spin2Win_v2 is made visible.
function Spin2Win_v2_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for Spin2Win_v2
handles.output = hObject;
% Update handles structure
guidata(hObject, handles);
% Fill tables with zeros and ones
tmp = ones(5,1);
set(handles.uitable2 , 'data' , tmp);
tmp = zeros(7,9);
set(handles.uitable1 , 'data' , tmp);
%Copy filled table data to variables
handles.calc_settings = get(handles.uitable2 , 'data');
handles.geom_data = get(handles.uitable1 , 'data');
% Set checkbox5 to 1 so that plot is generated by default
set(handles.checkbox5,'Value',1)
% Update handles and object
guidata(hObject, handles);
%
%  Outputs from this function are returned to the command line.
function varargout = Spin2Win_v2_OutputFcn(hObject, eventdata, handles)
% Get default command line output from handles structure
varargout{1} = handles.output;
%
%  Executes on button press in pushbutton1
% Run Calculation button
function pushbutton1_Callback(hObject, eventdata, handles)
%Import and merge data to send
% using merge_indata function
senddat = merge_indata(handles.geom_data, handles.calc_settings);
%Get figure number from settings and prefix from GUI
fignr = handles.calc_settings(5);
prefix = get(handles.edit2,'String');
%Send data to Main_calc for prossesing.
[mout] = Main_calc(senddat,prefix);
% Save output data if needed by other functions
save mout
% Check if plots are to be generated or not
if get(handles.checkbox5,'Value') == 1
Plotter(mout.Ten_c, mout.Ten_r, mout.intf, mout.r_mark, mout.r_mark2, ...
mout.r, mout.ri, fignr, mout.stamp, prefix)
end
% Increase plot nr if that checkbox is set
handles.calc_settings(5) = fignr + get(handles.checkbox2 , 'Value');
set(handles.uitable2 , 'data' , handles.calc_settings);
%Update values, save and exit
guidata(hObject, handles);
%
%  Executes on button press in pushbutton2.
% Load Default Isometric data button
function pushbutton2_Callback(hObject, eventdata, handles)
% Load data into tmp using split_indata function
[tmp1, tmp2] = split_indata(load_default_iso);
% Format imported data to correct format and make sure all values are
% valid.
tmp3 = ones(5,1);
tmp3(1) = floor(tmp2(5));
tmp3(2) = tmp2(2);
tmp3(3) = tmp2(3);
tmp3(4) = tmp2(4);
tmp3(5) = floor(handles.calc_settings(5));
% Copy imported and formatted data to tables
set(handles.uitable2 , 'data' , tmp3);
set(handles.uitable1 , 'data' , tmp1);
%Copy table data to variables
handles.calc_settings = get(handles.uitable2 , 'data');
handles.geom_data = get(handles.uitable1 , 'data');
%Update, save and exit
guidata(hObject, handles);
%
%  Executes on button press in pushbutton3.
% Load Default Orthotropic data button
function pushbutton3_Callback(hObject, eventdata, handles)
% Load data into tmp using split_indata function
[tmp1, tmp2] = split_indata(load_default_ort);
% Format imported data to correct format and make sure all values are
% valid.
tmp3 = ones(5,1);
tmp3(1) = tmp2(5);
tmp3(2) = tmp2(2);
tmp3(3) = tmp2(3);
tmp3(4) = tmp2(4);
tmp3(5) = handles.calc_settings(5);
% Copy data to tables
set(handles.uitable2 , 'data' , tmp3);
set(handles.uitable1 , 'data' , tmp1);
%Copy table data to variables
handles.calc_settings = get(handles.uitable2 , 'data');
handles.geom_data = get(handles.uitable1 , 'data');
%Update, save and exit
guidata(hObject, handles);
%
%  Executes on button press in checkbox1.
% Shell number ovveride checkbox
function checkbox1_Callback(hObject, eventdata, handles)
% Update checkbox status.
%
%  Executes on button press in checkbox2.
% Increase plot number after each run checkbox
function checkbox2_Callback(hObject, eventdata, handles)
% Update checkbox status.
%
%  Executes when entered data in editable cell(s) in uitable2.
% Settings table updater, updates on change in settings table.
function uitable2_CellEditCallback(hObject, eventdata, handles)
% Check for shell number <=9 and compare to checkbox status
tmp = get(handles.uitable2 , 'data');
if get(handles.checkbox1,'Value') == 0
tmp(1) = min(tmp(1),9);
end
% make sure input is within allowed values
tmp(5) = floor(max(tmp(5),1));
tmp(4) = max(tmp(4),0);
tmp(3) = max(tmp(3),0);
tmp(2) = max(tmp(2),0);
tmp(1) = floor(max(tmp(1),1));
% If the new number of shells is longer than the current maximal
% number: expand the table and fill the new columns with zeros
% but keep current data in cells.
if length(handles.geom_data(1,:)) < tmp(1)
tmp2 = zeros(7,tmp(1));
tmp3 = get(handles.uitable1 , 'data');
for i = 1:1:7
for k = 1:1:tmp(1)
if k <= length(tmp3(1,:))
tmp2(i,k) = tmp3(i,k);
end
end
end
set(handles.uitable1 , 'data' , tmp2);
end
% Copy new values to global handles and table
handles.calc_settings = tmp;
set(handles.uitable2 , 'data' , tmp);
handles.geom_data = get(handles.uitable1 , 'data');
%Update, save and exit
guidata(hObject, handles);
%
%  Executes when entered data in editable cell(s) in uitable1.
% Geometry table updater, updates on change in geometry table.
function uitable1_CellEditCallback(hObject, eventdata, handles)
%Copy table data to variables, make sure they are positive and real
% by using abs command
handles.geom_data = abs(get(handles.uitable1 , 'data'));
%Send positive data back to table
set(handles.uitable1 , 'data', handles.geom_data)
%Update, save and exit
guidata(hObject, handles);
%
%  Executes on button press in pushbutton6.
% Load File button
function pushbutton6_Callback(hObject, eventdata, handles)
% Load file using built in uigetfile popup window and ReadFile subroutine
% Filename must contain Spin2Win_ and be a .txtfile
[filedata, hdlines] = ReadFile(uigetfile('Spin2Win_*.txt', ...
'Choose an old outputfile, must begin with Spin2Win_'));
% If load of file sucseeds copy file data into correct variables
% If load fails do nothing
if ~isnumeric(filedata)
handles.filedata = filedata;
handles.hdlines = hdlines;
% Reset listbox2, run list, selected selected value to 1
handles.importnr = 1;
set(handles.listbox2,'Value',1)
% Update listbox2 with found hdlines remove 'Date and time of run:'
for i=1:1:length(hdlines)
strtmp(i,1) = strrep(filedata(hdlines(i)),'Date and time of run: ','');
end
set(handles.listbox2,'String',strtmp)
% Enable load list data button
set(handles.pushbutton7,'Enable','on')
end
%Update, save and exit
guidata(hObject, handles);
%
%  Executes on selection change in listbox2.
% Loaded runs list
function listbox2_Callback(hObject, eventdata, handles)
% Update line import number to new selected line
handles.importnr = get(hObject,'Value');
%Update, save and exit
guidata(hObject, handles);
%
%  Executes during object creation, after setting all properties.
% Loaded runs list
function listbox2_CreateFcn(hObject, eventdata, handles)
% Set background colour to white
if ispc && isequal(get(hObject,'BackgroundColor'), ...
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
% Fill list with example text.
gug(1,1) = cellstr('Load outputfile');
gug(2,1) = cellstr('to populate list.');
set(hObject,'String',gug)
% Initiate import number variable
handles.importnr = 1;
%Update, save and exit
guidata(hObject, handles);
%
%  Executes on button press in pushbutton7.
% Load run list line data button
function pushbutton7_Callback(hObject, eventdata, handles)
% Load data into tmp variable with import_n_format subroutine
tmpdat = import_n_format(handles.filedata,
handles.hdlines(handles.importnr));
% Split loaded data into two tmp matrices.
[tmp1, tmp2] = split_indata(tmpdat);
% make sure imported data is within allowed values
tmp3 = ones(5,1);
tmp3(1) = floor(tmp2(5));
tmp3(2) = tmp2(2);
tmp3(3) = tmp2(3);
tmp3(4) = tmp2(4);
tmp3(5) = floor(handles.calc_settings(5));
%Fill empty gometry data field with zeros
tmp4 = zeros(7,9);
for i = 1:1:7
for k = 1:1:9
if k <= length(tmp1(1,:))
tmp4(i,k) = tmp1(i,k);
end
end
end
% Extract old run prefix and format
p_tmp = handles.filedata(handles.hdlines(handles.importnr));
p_tmp = strrep(p_tmp,'Date and time of run: ','');
[~ , p_tmp]=strtok(p_tmp);
[~ , p_tmp]=strtok(p_tmp);
p_tmp = char(p_tmp);
p_tmp = p_tmp(2:end);
% Copy data to tables
set(handles.uitable2 , 'data' , tmp3);
set(handles.uitable1 , 'data' , tmp4);
set(handles.edit2,'String',p_tmp);
% Copy table data to variables
handles.calc_settings = get(handles.uitable2 , 'data');
handles.geom_data = get(handles.uitable1 , 'data');
%Update, save and exit
guidata(hObject, handles);
%
% Prefix field update function
function edit2_Callback(hObject, eventdata, handles)
% Update String contents on change
%
%  Executes during object creation, after setting all properties.
% Prefix field creation
function edit2_CreateFcn(hObject, eventdata, handles)
% Set background to white
if ispc && isequal(get(hObject,'BackgroundColor'), ...
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
%
%  Executes on button press in checkbox5.
% Generate plots checkbox
function checkbox5_Callback(hObject, eventdata, handles)
% Update checkbox status on change
%%%%%%%%%%%%%%%%%%%%%%% FILE END %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2.3 Main_calc.m
Below is the code from the Main_calc function. This file organizes data and sends this
data to a number of sub functions for processing. It also handles the creation and
management of the logfile and output data.
function [out] = Main_calc(indata,prefix)
% Preassure and stress calculator for composite and isotropic materials
%%% NOTE!!!!!!!!!!
%This script needs the following mfile functions in order to work:
% Pd_calc.m  Interface pressure calculator
% Ten_cr_calc.m  Stress distribution calculator
% E_M_calc  Energy, Mass calculator
%%%%
% Extract number of active shells from indata
m = indata(8,5);
% Place the rest of indata into correct variables
ri = indata(1,1:1:m)/2000; % [m] Inner radius, scale from D, mm to r, m
ro = indata(2,1:1:m)/2000; % [m] Outer radius, scale from D, mm to r, m
Ec = indata(3,1:1:m)*10^9; % [Pa] Youngs Modulus, Hoop
Er = indata(4,1:1:m)*10^9; % [Pa ]Youngs Modulus, Radial
v = indata(5,1:1:m); % Possions ratio, hoop  radial direction
p = indata(6,1:1:m); % [kg/m3] Material density
uu = indata(7,1:1:m); % Static friction coefficient
G_rz = indata(9,1:1:m)*10^9; % Shear modulus radialaxial
hh = indata(8,2)/1000; % [m] Cylinder height, scale from mm to m
n = indata(8,3); % Rotational speed rpm
n_ = indata(8,4); % Min speed
% Step size setting, default 0.000001 is enough for most calculations.
step = 0.000001 ; % [m] Radial step size used in calculations
% Initiate radial vector to get available flywheel radial positions
r = min(ri):step:max(ro); % radial vector
% Preallocating vectors
m = length(ri);
dr = zeros(1,m);
Ten_c = zeros(3,length(r));
Ten_r = zeros(3,length(r));
% Where: 1: Pressfit standstill stress, 2: Pure centrifugal stress,
% 3: Pressfit with rotation
intf = zeros(2,length(r));
% Where: 1: Interface plot standstill, 2: Interface plot rotating
Pd = zeros(1,m1); %interface pressure storage vector
K = zeros(1,m1);
U = zeros(1,m1);
b = zeros(1,m);
u = zeros(1,m);
j = zeros(1,m);
Ten_o = zeros(1,m);
A = zeros(3*(m1) , 3*(m1));
B = zeros(3*(m1) , 1);
Pd_still = zeros(1,m1);
r_mark = zeros(1,m);
r_mark2 = zeros(1,m);
warning_flags = zeros(1,5);
Ten_c_max = zeros(3,m);
Ten_c_min = zeros(3,m);
Ten_r_max = zeros(3,m);
Ten_r_min = zeros(3,m);
intf_max = zeros(2,m);
intf_min = zeros(2,m);
% Fill idat with input data and settings
% for easy transport into subroutines
idat(1,1:1:m) = ri;
idat(2,1:1:m) = ro;
idat(3,1:1:m) = Ec;
idat(4,1:1:m) = Er;
idat(5,1:1:m) = v;
idat(6,1:1:m) = p;
idat(7,1:1:m) = uu;
idat(9,1:1:m) = G_rz;
idat(8,1) = length(r);
idat(8,2) = hh;
idat(8,3) = n;
idat(8,4) = n_;
idat(8,5) = indata(8,5);
% Useful constant relations calculations
w = 2*pi*n/60; % rpm to rad/sec conversion
for k = 1:1:m
% radius quota, used in equation
b(k) = ri(k)/ro(k);
% factor, used in equation
u(k) = sqrt(Ec(k)/Er(k));
% j factor, used in equations
j(k) = (b(k)^(u(k)1)b(k)^2)/(b(k)^(u(k)1)b(k)^(u(k)1));
% Unmodified centrifugal field
Ten_o(k) = p(k)*w^2*ro(k)^2*((3+v(k))/(9u(k)^2));
end
% Interface calculation between shells
for i = 1:1:m1
dr(i) = ro(i)ri(i+1);
if abs(dr(i)) < 0.01*10^6
dr(i) = 0.01*10^6;
warning_flags(1) = 1;
end
end
% Make sure interference is positive
dr = abs(dr);
% Calculate stresses due to pure centrifugal forces
% using Ten_cr_calc subroutine wiht zero shell interference.
Pdz = zeros(1,m1);
[Ten_c(2,1:1:length(r)), Ten_r(2,1:1:length(r)), ...
intf(2,1:1:length(r))] = Ten_cr_calc(Pdz,idat,n);
%skip all press fit calculations if there is less than 2 shells
if m ~= 1
% Calculate approximate pressures using
% a simple linear matrix. Based on standard press fit formulas.
% Section pressure calc factors used in matrix
for k = 1:1:m1
K(k) = ri(k+1)*((ro(k+1)^2+ri(k+1)^2)/(Ec(k+1)*(ro(k+1)^2 ...
ri(k+1)^2))+v(k+1)/Er(k+1));
U(k) = ro(k)*((ro(k)^2+ri(k)^2)/(Ec(k)*(ro(k)^2ri(k)^2))v(k)/Er(k));
end
% Example Matrix structure for a 4 shelled geometry.
% B = [ 0 ;
% 0 ;
% 0 ;
% 0 ;
% 0 ;
% 0 ;
% dr(1) ;
% dr(2) ;
% dr(3) ];
% % P P P o o o i i i
% A = [ K(1) 0 0 1 0 0 0 0 0 ;
% 0 K(2) 0 0 1 0 0 0 0 ;
% 0 0 K(3) 0 0 1 0 0 0 ;
% U(1) 0 0 0 0 0 1 0 0 ;
% 0 U(2) 0 0 0 0 0 1 0 ;
% 0 0 U(3) 0 0 0 0 0 1 ;
% 0 0 0 1 0 0 1 1 0 ;
% 0 0 0 1 1 0 0 1 1 ;
% 0 0 0 0 1 1 0 0 1 ];
% Matrix maker
% Pd do fill
for k=1:1:m1
A(k , k)=K(k);
A(k , (m1+k)) = 1;
end
% Pd di fill
for k=1:1:m1
A(m1+k , k) = U(k);
A(m1+k , 2*(m1)+k) = 1;
end
% do di fill 1
for k=1:1:m1
A(2*(m1)+k , m1+k) = 1;
A(2*(m1)+k , 2*(m1)+k) = 1;
end
% do di fill 2
for k=1:1:m2
A(2*(m1)+1+k , m1+k) = 1;
A(2*(m1)+k , 2*(m1)+1+k) = 1;
end
% B fill
for k=1:1:m1
B(2*(m1)+k) = dr(k);
end
% Matrix solver
D = A\B;
% Extract pressures from vector X
% Pd will be approximate now if a isotropic material is used.
% Values will be used as input guess into fsolver for finetuning
% or major change if an orthotropic material is used.
Pd_t = 0;
for k = 1:1:m1
Pd_t(k) = D(k);
end
% Copy values to pressure vector
Pd = Pd_t;
% Special fsolve settings for increased chance of convergence
options = optimset('TolFun',1e9,'TolFun',1e9);
% Finetune pressure guess from above matrix calculations
% by using fsolve on Pd_calc subroutine
% n = 0 for standstill curve
[Pd, ~,warning_flags(4)] = fsolve(@(x) Pd_calc(x,idat,0),Pd,options);
Pd_still = Pd;
% Calcualte the stresses in standstill case
% with the Ten_cr_calc subroutine
[Ten_c(1,1:1:length(r)), Ten_r(1,1:1:length(r)), ...
intf(1,1:1:length(r))] = Ten_cr_calc(Pd,idat,0);
% Reset Pd to previous approximate values for next run
Pd = Pd_t;
% Finetune pressure guess, include centrifugal pressure, n =/= 0
[Pd, ~,warning_flags(5)] = fsolve(@(x) Pd_calc(x,idat,n),Pd,options);
% Calculate press fit stresses due to rotating press fit
% with the Ten_cr_calc subroutine
[Ten_c(3,1:1:length(r)), Ten_r(3,1:1:length(r)), ...
intf(2,1:1:length(r))] = Ten_cr_calc(Pd,idat,n);
end % end for if statement about number of shells
% Sacling from Pa to MPa for easier enterpritation
Ten_c = Ten_c/(10^6);
Ten_r = Ten_r/(10^6);
% Find shell surface radius r length value
% so that shell interfaces can be marked
for i=1:1:m1
r_mark(1,i) = (ri(i+1)/stepri(1)/step)+1;
end
r_mark(1,m)=(ro(m)/stepri(1)/step)+1;
r_mark = floor(r_mark);
for i=1:1:m1
r_mark2(1,i+1)=r_mark(1,i)+2;
end
r_mark2(1,1)=1;
% Make min max values vectors for each r_mark
for i=1:1:3
for k=1:1:m
Ten_c_max(i,k) = max(Ten_c(i,(r_mark2(k)+2):r_mark(k)));
Ten_c_min(i,k) = min(Ten_c(i,(r_mark2(k)+2):r_mark(k)));
end
end
for i=1:1:3
for k=1:1:m
Ten_r_max(i,k) = max(Ten_r(i,(r_mark2(k)+2):r_mark(k)));
Ten_r_min(i,k) = min(Ten_r(i,(r_mark2(k)+2):r_mark(k)));
end
end
for i=1:1:2
for k=1:1:m
intf_max(i,k) = max(intf(i,(r_mark2(k)+2):r_mark(k)));
intf_min(i,k) = min(intf(i,(r_mark2(k)+2):r_mark(k)));
end
end
% Calculate mass and energy of system using E_M_calc subroutine
[Energy, Mass] = E_M_calc(idat);
% Print data to screen and save into a logfile named after the current date
% Mark each run with a timestamp
% Start diary mode
diary(['Spin2Win_output_',date,'.txt'])
diary on
% Get date and time from system
stamp = datestr(now,0);
disp(['Date and time of run: ', stamp, ', ', prefix])
% Print input data
format long
disp('Input data:')
disp(['Ri: ', num2str(ri,10)])
disp(['Ro: ', num2str(ro,10)])
disp(['Ec: ', num2str(Ec,10)])
disp(['Er: ', num2str(Er,10)])
disp(['v: ', num2str(v,10)])
disp(['p: ', num2str(p,10)])
disp([': ', num2str(uu,10)])
disp(['G: ', num2str(G_rz,10)])
disp(['lr: ', num2str(length(r),10)])
disp(['h: ', num2str(hh,10)])
disp(['n: ', num2str(n,10)])
disp(['n_: ', num2str(n_,10)])
disp(['sh: ', num2str(m,10)])
fprintf('\n')
format short
% Print output data
disp('Results:')
disp('')
disp('Centrifugal only:')
disp(['Maximal tension, hoop: ', num2str(max(Ten_c(2,:))), ' [MPa]'])
disp(['Minimal tension, hoop: ', num2str(min(Ten_c(2,:))), ' [MPa]'])
disp(['Maximal tension, radial: ', num2str(max(Ten_r(2,:))), ' [MPa]'])
disp(['Minimal tension, radial: ', num2str(min(Ten_r(2,:))), ' [MPa]'])
disp('')
disp('Pressfit, standstill:')
disp(['Maximal tension, hoop: ', num2str(max(Ten_c(1,:))), ' [MPa]'])
disp(['Minimal tension, hoop: ', num2str(min(Ten_c(1,:))), ' [MPa]'])
disp(['Maximal tension, radial: ', num2str(max(Ten_r(1,:))), ' [MPa]'])
disp(['Minimal tension, radial: ', num2str(min(Ten_r(1,:))), ' [MPa]'])
disp('Interference pressures:')
%Repeat for number of interferences
for k = 1:1:m1
disp(['Shell ', num2str(k), '' , num2str(k+1), ': ', ...
num2str(Pd_still(k)/10^6), ' [MPa]'])
end
disp('')
disp('Pressfit, rotating:')
disp(['Maximal tension, hoop: ', num2str(max(Ten_c(3,:))), ' [MPa]'])
disp(['Minimal tension, hoop: ', num2str(min(Ten_c(3,:))), ' [MPa]'])
disp(['Maximal tension, radial: ', num2str(max(Ten_r(3,:))), ' [MPa]'])
disp(['Minimal tension, radial: ', num2str(min(Ten_r(3,:))), ' [MPa]'])
disp('Interference pressures:')
%Repeat for number of interferences
for k = 1:1:m1
disp(['Shell ', num2str(k), '' , num2str(k+1), ': ', ...
num2str(Pd(k)/10^6), ' [MPa]'])
end
disp('')
disp('Maximal assembly force needed for shell pressfit mounting:')
%Repeat for number of interferences
for k = 1:1:m1
F = pi*2*ro(k)*hh*uu(k)*Pd_still(k)/1000;
disp(['Shell ', num2str(k), '' , num2str(k+1), ': ', num2str(F), '
[kN]'])
end
disp('')
disp('Maximal transferable torque between shells, at standstill:')
%Repeat for number of interferences
for k = 1:1:m1
F = pi*2*ro(k)*hh*uu(k)*Pd_still(k)*ro(k)/1000;
disp(['Shell ', num2str(k), '' , num2str(k+1), ': ', num2str(F), '
[kNm]'])
end
disp('')
disp('Maximal transferable torque between shells, at max rpm:')
%Repeat for number of interferences
for k = 1:1:m1
F = pi*2*ro(k)*hh*uu(k)*Pd(k)*ro(k)/1000;
disp(['Shell ', num2str(k), '' , num2str(k+1), ': ', num2str(F), '
[kNm]'])
end
disp('')
disp('Shell and system mass:')
%Repeat for number of shells
for k = 1:1:m
disp(['Shell ', num2str(k), ': ', num2str(Mass(k)), ' [kg]'])
end
disp(['Total: ', num2str(Mass(m+1)), ' [kg]'])
disp('')
disp('Stored energy:')
disp(['in total: ', num2str(Energy(1)/3600), ' [Wh]'])
disp(['in rpm interval: ', num2str(Energy(2)/3600), ' [Wh]'])
disp('')
% Print WARNINGS if they have been flagged
if min(Pd) < 0
warning_flags(2) = 1;
end
if min(Pd_still) < 0
warning_flags(3) = 1;
end
if warning_flags(1) == 1
disp('*************WARNING******WARNING**************')
disp('Warning: Interference non existent or to small. < 0.1*10^6')
disp('Emergency minimum value of: 0.1*10^6 [m] activated.')
disp('*************WARNING******WARNING**************')
end
if warning_flags(2) == 1
disp('*************WARNING******WARNING**************')
disp('Warning: Rotating interference pressure have gone negative,')
disp('calculations higly unstable and mostly broken.')
disp('Reduce speed or increase interference')
disp('*************WARNING******WARNING**************')
end
if warning_flags(3) == 1
disp('*************WARNING******WARNING**************')
disp('Warning: Standstill interference pressure have gone negative,')
disp('calculations higly unstable and mostly broken.')
disp('Check input data for sign errors and interference')
disp('*************WARNING******WARNING**************')
end
if warning_flags(4) ~= 1
disp('*************WARNING******WARNING**************')
disp('Warning: Standstill pressure calculation did not converge,')
disp('Check input data for sign errors and interference')
disp('*************WARNING******WARNING**************')
end
if warning_flags(5) ~= 1
disp('*************WARNING******WARNING**************')
disp('Warning: Rotating pressure calculation did not converge,')
disp('Check input data for sign errors and interference')
disp('*************WARNING******WARNING**************')
end
% Mark end of run and fill with some blank lines.
disp('End of output')
fprintf('\n')
fprintf('\n')
fprintf('\n')
fprintf('\n')
fprintf('\n')
% Stop diary mode
diary off
% Prepare and Copy important data and plotter data into struct for return
% Plotter data
out.Ten_c = Ten_c ;
out.Ten_r = Ten_r ;
out.intf = intf ;
out.r_mark = r_mark ;
out.r_mark2 = r_mark2 ;
out.r = r ;
out.ri = ri ;
out.stamp = stamp ;
% General data
out.P_standstill = Pd_still ;
out.P_rotating = Pd ;
out.Energy = Energy ;
out.Mass = Mass ;
out.Ten_c_max = Ten_c_max ;
out.Ten_c_min = Ten_c_min ;
out.Ten_r_max = Ten_r_max ;
out.Ten_r_min = Ten_r_min ;
end
2.4 Pd_calc.m
Below is the code from the Pd_calc function. This file is called from Main_calc.m and
takes a set of input pressures and returns the corresponding error between shell interfaces
and shell deformations. It is intended for use together with the fsolve command in order to
find the interference pressures between all system shells.
function [z] = Pd_calc(x,idat,n)
% Syntax:
% [Remaining interference] =
% Pd_calc(Input pressure guess, Geometrical data, Rotational speed)
% Calculate remaining interference in a geometry with applied pressures
% using equations from the theory chapter.
% Extract useful values from idat
m = idat(8,5);
ri = idat(1,1:1:m);
ro = idat(2,1:1:m);
Ec = idat(3,1:1:m);
Er = idat(4,1:1:m);
v_cr = idat(5,1:1:m);
p = idat(6,1:1:m);
G_rz = idat(9,1:1:m);
% Preallocating vectors
dr = zeros(1,m);
Ten_c = zeros(1,m1);
Ten_r = zeros(1,m1);
Ten_z = zeros(1,m1);
u = zeros(1,m);
Pi = zeros(1,m1);
Po = zeros(1,m1);
C1 = zeros(1,m);
C2 = zeros(1,m);
Q = zeros(1,m);
Q2 = zeros(1,m);
z = zeros(1,m1);
di = zeros(1,m1);
do = zeros(1,m1);
b = zeros(1,m);
v_rc = zeros(1,m);
v_rz = zeros(1,m);
v_zr = zeros(1,m);
v_zc = zeros(1,m);
v_cz = zeros(1,m);
% Useful relations
w = 2*pi*n/60; % rpm to rad/sec conversion
% Calculate Possions ratios for a assumed transversely isotropic material
for k = 1:1:m
v_rc(k) = v_cr(k)*Er(k)/Ec(k);
v_rz(k) = Er(k)/(2*G_rz(k))1;
v_zr(k) = v_rz(k);
v_zc(k) = v_rc(k);
v_cz(k) = v_cr(k);
end
% Make Young's modulus quotas and b quota
for k = 1:1:m
u(k) = sqrt((Ec(k)/Er(k))*((1v_rz(k)*v_zr(k))/(1v_zc(k)*v_cz(k))));
b(k) = (v_cr(k)+v_cz(k)*v_zr(k))/(1v_zc(k)*v_cz(k));
end
% Interface calc
for i = 1:1:m1
dr(i) = ro(i)ri(i+1);
end
% Make sure interference is positive
dr = abs(dr);
% Copy input value to pressure vector
Pd = x;
% Format inner and outer pressure vectors using Pd
% Assume same pressure around whole machine
Pi(1) = 0;
Po(m) = 0;
for k=1:1:m1
Pi(k+1) = Pd(k);
Po(k) = Pd(k);
end
% Make C1 C2 and Q=K constants
for k = 1:1:m
Q(k) = (p(k)*w^2*(3+b(k))/(u(k)^29)); %last part of 2.20
Q2(k) = p(k)*w^2*(u(k)^2+3*b(k))/(u(k)^29); % last part of 2.22
C1(k) = (((ri(k)*ro(k))^(u(k)))/(ri(k)^(2*u(k))ro(k)^(2*u(k))))...
*(Q(k)*(ri(k)^3*ro(k)^(u(k))ro(k)^3*ri(k)^(u(k)))...
+Pi(k)*ro(k)^(u(k))*ri(k)Po(k)*ri(k)^(u(k))*ro(k));
C2(k) = (Q(k)*(ro(k)^(u(k)+3)ri(k)^(u(k)+3))+Po(k)*ro(k)^(u(k)+1)...
Pi(k)*ri(k)^(u(k)+1))/(ri(k)^(2*u(k))ro(k)^(2*u(k)));
end
% Calculate stresses using equations from theory
% and displacements using general Hooke's law
for k = 1:1:m1
% Calc shell k+1 inner displacement di
k=k+1;
Ten_r(k1) = C1(k)*ri(k)^(1u(k))+C2(k)*ri(k)^(1+u(k))+Q(k)*ri(k)^2;
Ten_c(k1) = u(k)*(C2(k)*ri(k)^(1+u(k))C1(k)*ri(k)^(1u(k)))...
+Q2(k)*ri(k)^2;
di(k1) = ri(k)*((Ten_c(k1)/Ec(k))*(1v_zc(k)*v_cz(k))...
(v_rc(k)+v_zc(k)*v_rz(k))*Ten_r(k1)/Er(k));
Ten_z(k1)=Er(k)*(v_zr(k)*Ten_r(k1)/Er(k)+v_zc(k)*Ten_c(k1)/Ec(k));
k=k1;
% Calc shell k outer displacement do
Ten_r(k) = C1(k)*ro(k)^(1u(k))+C2(k)*ro(k)^(1+u(k))+Q(k)*ro(k)^2;
Ten_c(k) = u(k)*(C2(k)*ro(k)^(1+u(k))C1(k)*ro(k)^(1u(k)))...
+Q2(k)*ro(k)^2;
do(k) = ro(k)*((Ten_c(k)/Ec(k))*(1v_zc(k)*v_cz(k))...
(v_rc(k)+v_zc(k)*v_rz(k))*Ten_r(k)/Er(k));
Ten_z(k)=Er(k)*(v_zr(k)*Ten_r(k)/Er(k)+v_zc(k)*Ten_c(k)/Ec(k));
end
% return z as error function
% between inner and outer displacement
% compared to original shell interference
% scaled up so that fsolve do not end prematurely
for k=1:1:m1
z(k) = (di(k)do(k)dr(k))*10^6;
end
end
2.5 Ten_cr_calc.m
Below is the code from the Ten_cr_calc function. This file is called from Main_calc.m
and takes a set of input pressures and rotational speed and returns the corresponding hoop
and radial stress that are experienced by the shells. It also returns the radial displacement
of the shells in a separate vector.
function [ Ten_c, Ten_r, intf ] = Ten_cr_calc(x,idat,n)
% Syntax:
% [Hoop stress, Radial stress, Radial displacement] =
% Ten_cr_calc(Input pressures, Geometrical data, Rotational speed)
% Calculates hoop and radial stresses of a spinning cylinder
% using theory chapter equations.
% Extract values from idat
m = idat(8,5);
ri = idat(1,1:1:m);
ro = idat(2,1:1:m);
Ec = idat(3,1:1:m);
Er = idat(4,1:1:m);
v_cr = idat(5,1:1:m);
p = idat(6,1:1:m);
y = idat(8,1);
G_rz = idat(9,1:1:m);
% Preallocating vectors
u = zeros(1,m);
Pi = zeros(1,m1);
Po = zeros(1,m1);
C1 = zeros(1,m);
C2 = zeros(1,m);
Q = zeros(1,m);
Q2 = zeros(1,m);
r = linspace(min(ri), max(ro), y);
Ten_c = zeros(1,length(r));
Ten_r = zeros(1,length(r));
intf = zeros(1,length(r));
b = zeros(1,m);
v_rc = zeros(1,m);
v_rz = zeros(1,m);
v_zr = zeros(1,m);
v_zc = zeros(1,m);
v_cz = zeros(1,m);
% Useful relations
w = 2*pi*n/60; % rpm to rad/sec conversion
% Calculate Possions ratios for a assumed transversely isotropic material
for k = 1:1:m
v_rc(k) = v_cr(k)*Er(k)/Ec(k);
v_rz(k) = Er(k)/(2*G_rz(k))1;
v_zr(k) = v_rz(k);
v_zc(k) = v_rc(k);
v_cz(k) = v_cr(k);
end
% Make Young's modulus quotas and b quota
for k = 1:1:m
u(k) = sqrt((Ec(k)/Er(k))*((1v_rz(k)*v_zr(k))/(1v_zc(k)*v_cz(k))));
b(k) = (v_cr(k)+v_cz(k)*v_zr(k))/(1v_zc(k)*v_cz(k));
end
% Copy input value to pressure vector
Pd = x;
% Format inner and outer pressure vectors using Pd
% Assume same pressure around whole machine
Pi(1) = 0;
Po(m) = 0;
for k=1:1:m1
Pi(k+1) = Pd(k);
Po(k) = Pd(k);
end
% Make C1 C2 and Q=K constants
for k = 1:1:m
Q(k) = (p(k)*w^2*(3+b(k))/(u(k)^29)); %last part of 2.20
Q2(k) = p(k)*w^2*(u(k)^2+3*b(k))/(u(k)^29); % last part of 2.22
C1(k) = (((ri(k)*ro(k))^(u(k)))/(ri(k)^(2*u(k))ro(k)^(2*u(k))))...
*(Q(k)*(ri(k)^3*ro(k)^(u(k))ro(k)^3*ri(k)^(u(k)))...
+Pi(k)*ro(k)^(u(k))*ri(k)Po(k)*ri(k)^(u(k))*ro(k));
C2(k) = (Q(k)*(ro(k)^(u(k)+3)ri(k)^(u(k)+3))+Po(k)*ro(k)^(u(k)+1)...
Pi(k)*ri(k)^(u(k)+1))/(ri(k)^(2*u(k))ro(k)^(2*u(k)));
end
% Calculate stresses using equations from theory eqs
% and displacements using general Hooke's law
k = 1;
for i = 1:1:length(r)
k = min(k,m1); %Limit k to prevent index overflow.
if r(i) > ri(k+1)
k = k+1;
end
k = max(k,1); %Limit k to prevent index overflow.
% Calculate stresses
Ten_r(i) = C1(k)*r(i)^(1u(k))+C2(k)*r(i)^(1+u(k))+Q(k)*r(i)^2;
Ten_c(i) = u(k)*(C2(k)*r(i)^(1+u(k))C1(k)*r(i)^(1
u(k)))+Q2(k)*r(i)^2;
%Calculate displacements
intf(i) = r(i)*(Ten_c(i)/Ec(k)v_cr(k)*Ten_r(i)/Er(k));
end
end
2.6 E_M_calc.m
Below is the code from the E_M_calc function. This file is called from Main_calc.m and
takes a set of input data and return the mass and stored energy in the given system.
function [ E, M ] = E_M_calc( idat )
% Syntax:
% [Energy, Mass] =
% E_M_calc(Input data)
% E_W_CALC System energy and weight calculator for Spin2Win
% Extract values from idat
m = idat(8,5);
ri = (idat(1,1:1:m));
ro = (idat(2,1:1:m));
p = idat(6,1:1:m);
h = (idat(8,2));
n = idat(8,3);
n_ = idat(8,4);
% Preallocating vectors
E = zeros(1,2);
% E(1) = total energy, E(2) = Energy in rpm interval
M = zeros(1,m+1);
% W(1m) individual shell weight, W(m+1) Total weight [kg]
I = zeros(1,m);
% Useful relations
w = 2*pi*n/60; % rpm to rad/sec conversion
w_ = 2*pi*n_/60; % rpm to rad/sec conversion
% Shell mass calculation
for k=1:1:m
M(k) = h*p(k)*pi*(ro(k)^2ri(k)^2);
end
% Calcualte total mass
M(m+1) = sum(M);
% Shell inertia calculation
for k=1:1:m
I(k) = 0.5*M(k)*(ro(k)^2+ri(k)^2);
end
% Energy calculation
E(1) = 0.5*sum(I)*w^2;
E(2) = 0.5*sum(I)*(w^2w_^2);
end
2.7 Plotter.m
Below is the code from the Plotter script. This file is called from the GUI and takes the
output structure, generated by Main_calc, as input. It then generates a figure showing a
graphical representation of the system.
function Plotter(Ten_c, Ten_r, intf, r_mark, r_mark2, r, ri, fignum, stamp,
prefix)
% Syntax:
% Plotter( Hoop stress, Radial stress, Radial displacements, ...
% Shell markers upper half, Shell markers lower half, Radial vector, ...
% Inner radius, Figure number, Time stamp, Run prefix)
% Plot input data in one figure with three subplots.
if ishandle(fignum) == 1
close(figure(fignum))
end
% Settings
step = 0.000001 ; % [m] Radial step size used in calculations
% Must be same as in Main_calc
% Make figure
figure(fignum)
% Set figure name to same as stamp
set(figure(fignum),'Name',[stamp, ', ', prefix])
% Plotting hoop stresses
subplot(3,1,1)
hold on
plot(r*1000,Ten_c(1,:),'r');
plot((r_mark*step+ri(1))*1000,Ten_c(1,r_mark),'*r');
plot(((r_mark21)*step+ri(1))*1000,Ten_c(1,(r_mark2)),'*r');
plot(r*1000,Ten_c(2,:),'b');
plot((r_mark*step+ri(1))*1000,Ten_c(2,r_mark),'*b');
plot(((r_mark21)*step+ri(1))*1000,Ten_c(2,(r_mark2)),'*b');
plot(r*1000,Ten_c(3,:),'k');
plot((r_mark*step+ri(1))*1000,Ten_c(3,r_mark),'*k');
plot(((r_mark21)*step+ri(1))*1000,Ten_c(3,(r_mark2)),'*k');
% Give axis names
hold off
title 'Hoop stress [Blue: Pure centrifugal , Red: Pressfit at standstill ,
Black: Pressfit while rotating]'
ylabel 'Stress [MPa]'
% Plotting radial stresses
subplot(3,1,2)
hold on
plot(r*1000,Ten_r(1,:),'r');
plot((r_mark*step+ri(1))*1000,Ten_r(1,r_mark),'*r');
plot(r*1000,Ten_r(2,:),'b');
plot(((r_mark)*step+ri(1))*1000,Ten_r(2,r_mark),'*b');
plot(r*1000,Ten_r(3,:),'k');
plot((r_mark*step+ri(1))*1000,Ten_r(3,r_mark),'*k');
% Give axis names
hold off
title 'Radial stress [Blue: Pure centrifugal , Red: Pressfit at
standstill , Black: Pressfit while rotating]'
ylabel 'Stress [MPa]'
% Plotting interface distribution
subplot(3,1,3)
hold on
plot(r*1000,intf(2,:)*10^6,'b');
plot((r_mark*step+ri(1))*1000,intf(2,r_mark)*10^6,'*b');
plot(((r_mark21)*step+ri(1))*1000,intf(2,(r_mark2))*10^6,'*b');
plot(r*1000,intf(1,:)*10^6,'r');
plot((r_mark*step+ri(1))*1000,intf(1,r_mark)*10^6,'*r');
plot(((r_mark21)*step+ri(1))*1000,intf(1,(r_mark2))*10^6,'*r');
% Give axis names
hold off
title 'Radial displacement [Red: Displacement at standstill , Blue:
Displacement while rotating]'
ylabel 'Displacement [m]'
xlabel 'Radius [mm]'
end
2.8 Load_default_iso.m
Below is the code from the load_default_iso function. This file is called from the GUI and
takes no input parameters, but returns a full set of default system data for a nine shelled
geometry of solely aluminium.
function [ idat ] = load_default_iso()
% Syntax:
% [Output data] = load_default_iso()
% Generates a set of data that can be used as input data in Spin2Win
% Input parameters
% Aluminium SETTINGS
% C1 C2 C3 C4 C5
% C6 C7 C8 C9
% [m] Inner radius
ri = [ 0.100 , 0.125 , 0.150 , 0.175 , 0.200 , ...
0.225 , 0.250 , 0.275 , 0.300 ];
% [m] Outer radius
ro = [ 0.12525 , 0.15025 , 0.17525 , 0.20025 , 0.22525 , ...
0.25025 , 0.27525 , 0.30025 , 0.32500 ];
% [Pa] Youngs Modulus, Hoop
Ec = [ 72*10^9 , 72*10^9 , 72*10^9 , 72*10^9 , 72*10^9 , ...
72*10^9 , 72*10^9 , 72*10^9 , 72*10^9 ];
% [Pa ]Youngs Modulus, Radial
Er = [ 72*10^9 , 72*10^9 , 72*10^9 , 72*10^9 , 72*10^9 , ...
72*10^9 , 72*10^9 , 72*10^9 , 72*10^9 ];
% Possions ratio, circumference  radial direction
v = [ 0.33 , 0.33 , 0.33 , 0.33 , 0.33 , ...
0.33 , 0.33 , 0.33 , 0.33 ];
% [kg/m3] Material density
p = [ 2800 , 2800 , 2800 , 2800 , 2800 , ...
2800 , 2800 , 2800 , 2800 ];
% Static friction coefficient
uu = [ 0.61 , 0.61 , 0.61 , 0.61 , 0.61 , ...
0.61 , 0.61 , 0.61 , 0 ];
% Shear modulus
G_rz = [ 28*10^9 , 28*10^9 , 28*10^9 , 28*10^9 , 28*10^9 , ...
28*10^9 , 28*10^9 , 28*10^9 , 28*10^9 ];
% Additional input parameters
hh = 0.3 ; % rotor height
n = 8000; % [rpm] rotational speed
n_ = 3000; % Minimum speed
% Settings
step = 0.000001 ; % [m] Radial step size used in calculations
%Must be same as in Main_calc
% Preallocating vectors
m = length(ri);
r = min(ri):step:max(ro); % radial vector
% Fill idat with input data for easy transport into subroutines
% scaled to mm, diameters and MPa
idat(1,1:1:m) = ri*2000;
idat(2,1:1:m) = ro*2000;
idat(3,1:1:m) = Ec/10^9;
idat(4,1:1:m) = Er/10^9;
idat(5,1:1:m) = v;
idat(6,1:1:m) = p;
idat(7,1:1:m) = uu;
idat(9,1:1:m) = G_rz/10^9;
idat(8,1) = length(r);
idat(8,2) = hh*1000;
idat(8,3) = n;
idat(8,4) = n_;
idat(8,5) = 9;
end
2.9 Load_default_ort.m
Below is the code from the load_default_ort function. This file is called from the GUI and
takes no input parameters, but returns a full set of default system data for a nine shelled
geometry of solely generic carbon fibre composite.
function [ idat ] = load_default_ort()
% Syntax:
% [Output data] = load_default_ort()
% Generates a set of data that can be used as input data in Spin2Win
% Input parameters
% CARBONCOMPOSITE SETTINGS
% C1 C2 C3 C4 C5
% C6 C7 C8 C9
% [m] Inner radius
ri = [ 0.100 , 0.125 , 0.150 , 0.175 , 0.200 , ...
0.225 , 0.250 , 0.275 , 0.300 ];
% [m] Outer radius
ro = [ 0.12525 , 0.15025 , 0.17525 , 0.20025 , 0.22525 , ...
0.25025 , 0.27525 , 0.30025 , 0.32500 ];
% [Pa] Youngs Modulus, Hoop
Ec = [ 155*10^9 , 155*10^9 , 155*10^9 , 155*10^9 , 155*10^9 , ...
155*10^9 , 155*10^9 , 155*10^9 , 155*10^9 ];
% [Pa ]Youngs Modulus, Radial
Er = [ 9*10^9 , 9*10^9 , 9*10^9 , 9*10^9 , 9*10^9 , ...
9*10^9 , 9*10^9 , 9*10^9 , 9*10^9 ];
% Possions ratio, circumference  radial direction
v = [ 0.25 , 0.25 , 0.25 , 0.25 , 0.25 , ...
0.25 , 0.25 , 0.25 , 0.25 ];
% [kg/m3] Material density
p = [ 1600 , 1600 , 1600 , 1600 , 1600 , ...
1600 , 1600 , 1600 , 1600 ];
% Static friction coefficient
uu = [ 0.61 , 0.61 , 0.61 , 0.61 , 0.61 , ...
0.61 , 0.61 , 0.61 , 0 ];
% Shear modulus
G_rz = [ 3.6*10^9 , 3.6*10^9 , 3.6*10^9 , 3.6*10^9 , 3.6*10^9 , ...
3.6*10^9 , 3.6*10^9 , 3.6*10^9 , 3.6*10^9 ];
% Additional input parameters
hh = 0.3 ; % rotor height
n = 10000; % [rpm] rotational speed
n_ = 5000; % Minimal speed
% Settings
step = 0.000001 ; % [m] Radial step size used in calculations
% Must be same as in Main_calc
% Preallocating vectors, mostly different constants used in loops
m = length(ri);
r = min(ri):step:max(ro); % radial vector
% Fill idat with input data for easy transport into subroutines
% Scaled to mm, diameters and MPa
idat(1,1:1:m) = ri*2000;
idat(2,1:1:m) = ro*2000;
idat(3,1:1:m) = Ec/10^9;
idat(4,1:1:m) = Er/10^9;
idat(5,1:1:m) = v;
idat(6,1:1:m) = p;
idat(7,1:1:m) = uu;
idat(9,1:1:m) = G_rz/10^9;
idat(8,1) = length(r);
idat(8,2) = hh*1000;
idat(8,3) = n;
idat(8,4) = n_;
idat(8,5) = 9;
end
2.10 Split_indata.m
Below is the code from the split_indata function. This file is called from the GUI and
takes a raw data matrix, generated by for example import_default_iso, and splits it into
two separate parts that can be handled by the GUI tables.
function [ geomdat, setdat ] = split_indata( senddat )
% Syntax:
% [Geometrical data, Settings data] =
% split_indata(Input raw data)
% Pre allocate variables
geomdat = zeros(8,length(senddat(1,:)));
setdat = zeros(1,5);
% Extract geometrical data from input
for i=1:1:7
for k=1:1:length(senddat(1,:))
geomdat(i,k) = senddat(i,k);
end
end
for k=1:1:length(senddat(1,:))
geomdat(8,k) = senddat(9,k);
end
% Extract settings data from input
i = 8;
for k=1:1:5
setdat(1,k) = senddat(i,k);
end
end
2.11 Merge_indata.m
Below is the code from the merge_indata function. This file is called from the GUI and
takes two data sets from the GUI tables and merges them into a single matrix that can be
passed on to other functions, like Main_clac.
function [ senddat ] = merge_indata( geomdat, setdat )
% Syntax:
% [Output matrix] =
% merge_indata(Geometrical data, Settings data)
% Merges geometrical and settings data into a singel matrix
% for easy transport between subfunctions
% Pre allocate matrix
senddat = zeros(9,length(geomdat(1,:)));
% Copy geometrical data into output matrix
for i=1:1:7
for k=1:1:length(geomdat(1,:))
senddat(i,k) = geomdat(i,k);
end
end
for k=1:1:length(geomdat(1,:))
senddat(9,k) = geomdat(8,k);
end
% Copy settings data into output matrix
i = 8;
for k=2:1:4
senddat(i,k) = setdat(k,1);
end
% Insert number of active shells into output matrix
senddat(i,5) = setdat(1,1);
end
2.12 ReadFile.m
Below is the code from the ReadFile function. This file is called from the GUI and, by the
help of the uigetfile command, reads an old log file generated by Main_calc. It then
searches the file for timestamps and marks the beginning of each run.
function [texten, Dat_line] = ReadFile(infile)
% Syntax:
% [Loaded text, Beginning of run line marks] =
% ReadFile(File name of old log file)
% Check if file name was passed on correctly
% Return 1 if load failed
if infile == 0
texten = 1;
Dat_line = 1;
else
% Open and read file
fid = fopen(infile);
k = 1;
% Scan each line from file and save
while ~feof(fid)
tline = fgetl(fid);
texten(k,1) = cellstr(tline);
k=k+1;
end
% Close file
fclose(fid);
% Scan for 'Date and time of run:' string and mark each hit with
% corresponding line number
al = 'Date and time of run:';
i = 1;
for k=1:1:length(texten)
A = sscanf(char(texten(k)), '%c', [1 21]);
if strcmp(A, al)
Dat_line(i) = k;
i =i+1;
end
end
%Swap Dat_line direction
Dat_line(length(Dat_line):1:1) = Dat_line;
end
end
2.13 Import_n_format.m
Below is the code from the import_n_format function. This file is called from the GUI and
is used to format the data imported by ReadFile into the correct format for use in the rest
of the Spin2Win program.
function [ idat ] = import_n_format( impraw, begline )
% Syntax:
% [Formated output data] =
% import_n_format(Imported raw data, Beginning of run line markers)
% Format raw data into idat format for the GUI tables
% Read first eight lines after run marker
% Containing geometrical data
for i=1:1:8
k=1;
[curr, rest]=strtok(impraw(begline+1+i));
[curr, rest]=strtok(rest);
while ~isempty(cell2mat(curr))
idat(i,k) = str2double(cell2mat(curr));
k=k+1;
[curr, rest]=strtok(rest);
end
end
% Shear modulus fix
idat(9,:)=idat(8,:);
idat(8,:)=0;
% Read next five lines contaning settings data
for i=1:1:5
[~ , rest]=strtok(impraw(begline+9+i));
[curr]=strtok(rest);
idat(8,i)=str2double(cell2mat(curr));
end
% Scaling to mm, diameters and MPa
idat(1,:)=idat(1,:)*2000;
idat(2,:)=idat(2,:)*2000;
idat(3,:)=idat(3,:)/10^9;
idat(4,:)=idat(4,:)/10^9;
idat(9,:)=idat(9,:)/10^9;
idat(8,2)=idat(8,2)*1000;
end
3 Data structure explanations
3.1 Raw import / export data
Type: Matrix
Generated by: import_n_format, load_default_iso/ort and merge_indata
Used for: Geometrical and settings data transport.
Example creation:
m = length(inner_radius)
idat(1,1:1:m) = inner_radius
idat(2,1:1:m) = outer_radius
idat(3,1:1:m) = Youngs_Modulus_hoop
idat(4,1:1:m) = Youngs_Modulus_radial
idat(5,1:1:m) = Possions_ratio
idat(6,1:1:m) = Material_density
idat(7,1:1:m) = Static_friction_coefficient
idat(8,1) = Length_of_radial_vector
idat(8,2) = System_height
idat(8,3) = Maximal_rotational_speed
idat(8,4) = Minimal_rotational_speed
idat(8,5) = Number_of_active_shells
Example for a seven shelled geometry, m: 17:
200 250 300 350 400 450 500
250,5 300,5 350,5 400,5 450,5 500,5 550,5
72 72 72 72 72 72 72
72 72 72 72 72 72 72
0,33 0,33 0,33 0,33 0,33 0,33 0,33
2800 2800 2800 2800 2800 2800 2800
0,61 0,61 0,61 0,61 0,61 0,61 0,61
22501 300 8000 3000 9 0 0
3.2 Geometrical data
Type: Matrix
Generated by: split_indata
Used for: Geometrical data for GUI table
Example creation:
% Extract geometrical data from raw input data
for i=1:1:7
for k=1:1:length(raw_data(1,:))
geom_data(i,k) = raw_data(i,k);
end
end
Example for a seven shelled geometry, generated from the example in 3.1:
200 250 300 350 400 450 500
250,5 300,5 350,5 400,5 450,5 500,5 550,5
72 72 72 72 72 72 72
72 72 72 72 72 72 72
0,33 0,33 0,33 0,33 0,33 0,33 0,33
2800 2800 2800 2800 2800 2800 2800
0,61 0,61 0,61 0,61 0,61 0,61 0,61
3.3 Settings data
Type: Matrix
Generated by: split_indata
Used for: Settings data for GUI table
Example creation:
% Extract settings data from raw input data
i = 8;
for k=1:1:5
settings_data(1,k) = raw_data(i,k);
end
Example for a seven shelled geometry, generated from the example in 3.1:
22501 300 8000 3000 9 0 0
3.4 Output structure
Type: Structure
Generated by: Main_calc
Used for: Saving all generated data, for both immediate plotting and later use. Data is saved in
mout.mat.
Example creation:
% Plotter data
out.Ten_c = Ten_c ; % Save hoop stresses
out.Ten_r = Ten_r ; % Save radial stresses
out.intf = intf ; % Save displacements
out.r_mark = r_mark ; % Save shell positions
out.r_mark2 = r_mark2 ; % Save shell positions
out.r = r ; % Save radial vector, for plotter
out.ri = ri ; % Save inner radius, for plotter
out.stamp = stamp ; % Save timestamp of run
% General data
out.P_standstill = Pd_still ; % Save pressures in standstill
out.P_rotating = Pd ; % Save pressures while rotating
out.Energy = Energy ; % Save system energy
out.Mass = Mass ; % Save system mass
out.Ten_c_max = Ten_c_max ; % Save max hoop stress
out.Ten_c_min = Ten_c_min ; % Save min hoop stress
out.Ten_r_max = Ten_r_max ; % Save max radial stress
out.Ten_r_min = Ten_r_min ; % Save min radial stress
Example output for a two shelled geometry from the 30
th
of March 2012:
mout =
Ten_c: [3x3001 double]
Ten_r: [3x3001 double]
intf: [2x3001 double]
r_mark: [501 3000]
r_mark2: [1 503]
r: [1x3001 double]
ri: [0.0600 0.0650]
stamp: '30Mar2012 13:58:04'
P_standstill: 5.0647e005
P_rotating: 5.7734e+007
Energy: [2.6695e+005 2.6628e+005]
Mass: [0.3240 0.5843 0.9083]
Ten_c_max: [3x2 double]
Ten_c_min: [3x2 double]
Ten_r_max: [3x2 double]
Ten_r_min: [3x2 double]
3.5 Output log file
Type: Text file and command window display
Generated by: Main_calc
Used for: Saving important data and logging events.
Example output for a three shelled geometry, with added comments:
Date and time of run: 05Apr2012 13:29:10, No name
Input data:
Ri: 0.1 0.125 0.15
Ro: 0.12525 0.15025 0.17525
Ec: 72000000000 72000000000 72000000000
Er: 72000000000 72000000000 72000000000
v: 0.33 0.33 0.33
p: 2800 2800 2800
: 0.61 0.61 0.61
lr: 7526
h: 0.3
n: 8000
n_: 3000
sh: 3
These first lines contain all the geometrical data and settings, as well as the timestamp and run
name. These lines are used when importing old output files in order to get a hold of all input
data that was used in that run.
Results:

Centrifugal only:
Maximal tension, hoop: 57.6466 [MPa]
Minimal tension, hoop: 21.5869 [MPa]
Maximal tension, radial: 0.52152 [MPa]
Minimal tension, radial: 6.7007e015 [MPa]

Pressfit, standstill:
Maximal tension, hoop: 132.0258 [MPa]
Minimal tension, hoop: 152.1421 [MPa]
Maximal tension, radial: 1.5495e014 [MPa]
Minimal tension, radial: 27.576 [MPa]
Interference pressures:
Shell 12: 27.5797 [MPa]
Shell 23: 20.3778 [MPa]

Pressfit, rotating:
Maximal tension, hoop: 165.4994 [MPa]
Minimal tension, hoop: 98.5535 [MPa]
Maximal tension, radial: 5.134e015 [MPa]
Minimal tension, radial: 23.1102 [MPa]
Interference pressures:
Shell 12: 23.1145 [MPa]
Shell 23: 16.6467 [MPa]
The lines under Results show maximal material stresses and interference pressures, both in
the rotating and standstill case. The centrifugal only section is often not of much interest
unless a system with just a single shell is considered.

Maximal assembly force needed for shell pressfit mounting:
Shell 12: 3971.9038 [kN]
Shell 23: 3520.4837 [kN]

Maximal transferable torque between shells, at standstill:
Shell 12: 497.4809 [kNm]
Shell 23: 528.9527 [kNm]

Maximal transferable torque between shells, at max rpm:
Shell 12: 416.9369 [kNm]
Shell 23: 432.1048 [kNm]

Shell and system mass:
Shell 1: 15.0091 [kg]
Shell 2: 18.3408 [kg]
Shell 3: 21.6724 [kg]
Total: 55.0223 [kg]

Stored energy:
in total: 109.1463 [Wh]
in rpm interval: 93.7976 [Wh]

End of output
The final set of lines contains data on forces, masses and energies. The assembly force is the
force needed to force the shells onto each other given the interference. The torques is both
given in the rotating and standstill case. Each shells mass is individually displayed and also
their total sum. Lastly the stored energy in the rotating mass is presented, both in total and in
the allowed machine speed interval.
4 Explanation of output graphs
Each output figure contains three graphs; one for the hoop stresses, one for radial stresses and
one for the radial displacement. Bellow is an example output from a simple three shelled
geometry consisting of one inner layer in aluminium followed by a glassfibre composite
layer and lastly a carbonfibre composite layer.
Figure 2: Output graph for a generic geometry with three shells, rotating with 30k rpm.
The Spin2Win program always presumes all materials to be perfectly linear and follow
Hooks Law regardless of material strain and stress. This means that the program does not
detect when materials start to reach into the nonlinear deformation area which leads to plastic
deformations and probably also irreversible system damage. So make sure all values are
below the tensile strength of the material before evaluating the results.
The first plot, Hoop Stress, shows the circumstantial stress as a function of system radius.
Three lines are present, each showing the circumstantial stress in a different system state,
where negative values indicate compressive stress.
The blue line shows the stress for each shell independent of each other, this is usually
not of interest unless the study considers a single shell or if the shells are designed to
not touch each other.
The red line shows the stresses induced by the pressfit when the system is standing
still. If no interference exists between the shells or of it is very small this curve will be
close to zero
The black line shows a combination of the pressfit and centrifugal induced stresses at
maximum speed. This line in combination with the red line will tell if the system will
survive both while rotating and while standing still.
The middle graph, Radial Stress, shows the radial stresses, again as a function of radius. The
colour code remains the same as in the first graph. With black being the most important one
when the risk of delimitation is to be evaluated. Usually compressive stresses are preferred in
order to avoid delimitation.
Finally the Radial Displacement graph shows how much each shell will expand in the radial
direction. The red line shows the displacements when the system is at standstill and hence
only shows the displacements induced by the pressfit interference pressures. The blue line
shows the displacement at maximum speed as a combination of pressfit and centrifugal
displacement.
Appendix B: Flywheel drawings
/
/
W
E
lG
H
I
:

g
r
c
m
:
]
D
F
/
W
N
F
r
c
I
c
I
y
p
e
l
l

L
lN
E
/
F
:
+
0
.
1

0
.
1
0
7

0
3

1
2
D
E
8
U
F
/
N
D
0
0

0
0
0
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
1
:
5
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
C
H
K
'D
I
.
K
c
m
f
S
lG
N
/
I
U
F
E
8
F
E
/
K
S
H
/
F
F
D
/
I
E
/
F
F
V
'D
M
F
G
C
.
/
N
/
M
E
/
3
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:

0
1
l
I
E
M
N
C
.
F
/
F
I
N
U
M
8
E
F
F
/
F
I
N
/
M
E
C
I
Y
.
1
0
1

1
0
0
S
u
p
p
c
r
I
1
2
0
3

1
0
0
F
c
I
c
r
1
3
0
2

3
0
0
/
M
8
_
F
c
I
c
r
2
4
0
2

1
0
0
/
M
8
_
S
I
c
I
c
r
2
342
S
E
C
I
l
C
N
/

/
1
1
2
5
4
3
l
I
E
M
N
C
.
F
/
F
I
N
U
M
8
E
F
F
/
F
I
N
/
M
E
C
I
Y
.
1
0
1

0
0
5
G
u
i
c
i
n
g
F

c
I
e
2
2
0
1

1
0
1
8
c
r
_
F
c
:
I
n
_
c
:
m
3
0
1

0
0
F

c
n
g
e
1
2
4
8
e
c
r
i
n
g
_
2
_
2
8
2
5
0
1

0
0
4
F
c
:
I
e
n
e
r
8
e
c
r
i
n
g
2
L
lN
E
/
F
:
+
0
.
1

0
.
1
/
3
0
1

1
0
0

W
E
lG
H
I
:
1
5
0
8
.
5
7

g
r
c
m
:
]
S
H
E
E
I
1
C
F
1
E
D
G
E
S
S
C
/
L
E
:
1
:
5
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
S
lG
N
/
I
U
F
E
D
F
/
W
N
I
.
K
c
m
f
D
E
8
U
F
/
N
D
8
F
E
/
K
S
H
/
F
F
N
/
M
E
0
7

0
3

1
2
C
H
K
'D
/
F
F
V
'D
S
u
p
p
c
r
I
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
M
F
G
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:

0
1
L
lN
E
/
F
:
+
0
.
1

0
.
1
G
u
i
c
i
n
g
F

c
I
e
F

c
I
1
0
m
m
0
1

0
0
5
W
E
lG
H
I
:
3
5
0
1
.
0
2

g
r
c
m
:
]
0

0
3

1
2
/
3
S
C
/
L
E
:
1
:
5
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
S
lG
N
/
I
U
F
E
8
F
E
/
K
S
H
/
F
F
D
F
/
W
N
D
E
8
U
F
/
N
D
I
.
K
c
m
f
N
/
M
E
E
D
G
E
S
C
H
K
'D
/
F
F
V
'D
S
H
E
E
I
1
C
F
1
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
M
F
G
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
/

c
c
F

u
:
0
1
8
/
4
2
5
S
E
C
I
l
C
N
M

M
S
C
/
L
E
1
:
1
0
3
8
1 0
5
8
+
0
,
1
0
D
E
I
/
l
L
/
S
C
/
L
E
1
:
1
x
M
3

H
F
3
3
5
x
M
3

H
F
5
8
,
5
0
D
E
I
/
l
L
8
S
C
/
L
E
1
:
2
F
4
1
2
x
M
H
3
0
1 8 2 , 5 0
0
F
1
,
7
7
3
0
3
0
F
1
7
5
x
2
+
0
,
1
0
x
1
5
,
5
0
x
M
H
M
M
/
V
i
n
k
e

j
c
r
n
e
n
m
c
n
I
e
r
c
:
0
.
5

0
.
2
5
m
m
f
c
r
h
c
g
I
c
c
h
f
r
c
:
e
:
:
e
n
n
e
c
I
i


c
n
:
k
c
c
m
c
I
I
n
c
g
g
r
c
n
h
e
I
V
i
n
k
e

j
c
r
n
e
n
m
c
n
I
e
r
c
:
0
.
5

0
.
2
5
m
m
f
c
r
h
c
g
I
c
c
h
f
r
c
:
e
:
:
e
n
n
e
c
I
i


c
n
:
k
c
c
m
c
I
I
n
c
g
g
r
c
n
h
e
I
1
0
0
3
3
0
+
0
,
1
0
0
*
*
*
*
E
f
I
e
r
n
e
c
f
r
c
:
n
i
n
g
c
v
v
i
n
k
e

j
c
r
n
L
lN
E
/
F
:
+
0
.
1

0
.
1

0
1

1
0
1
8
c
r
_
F
c
:
I
n
_
c
:
m
0

0
3

1
2
W
E
lG
H
I
:
1
2
2
8
.
8
0

g
r
c
m
:
]
/
3
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
1
:
2
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
8
F
E
/
K
S
H
/
F
F
I
.
K
c
m
f
N
/
M
E
D
F
/
W
N
S
lG
N
/
I
U
F
E
C
H
K
'D
/
F
F
V
'D
M
F
G
D
E
8
U
F
/
N
D
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:

0
1
l
I
E
M
N
C
.
F
/
F
I
N
U
M
8
E
F
F
/
F
I
N
/
M
E
C
I
Y
.
1
0
1

0
0
2
8
c
r
1
2
0
1

0
0
3
F
c
:
I
e
n
e
r
4
1
2
V
i
n
k
e

j
c
r
n
e
n
:
v
e
I
:
c
:
D
E
I
/
l
L
/
f
c
:
I

c
n
g
:

c
n
g
:
i
c
c
r
n
c
S
C
/
L
E
2
:
1
V
i
n
k
e

j
c
r
n
e
n
:
v
e
I
:
c
:
f
c
:
I

c
n
g
:

c
n
g
:
i
c
c
r
n
c
N
c
I
e
:
/


c
h
c

c
r
c
e
n
I
r
e
r
c
c
e
c
c
h
g
e
n
c
m
g
c
e
n
c
e
8
F
E
/
K
S
H
/
F
F
3
0
x
3
0
x
3
/
3
0
1

0
0
2
0

0
3

1
2
8
c
r
W
E
lG
H
I
:
1
1
2
4
.
3

g
r
c
m
:
]
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
1
:
2
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
I
.
K
c
m
f
C
H
K
'D
N
/
M
E
D
F
/
W
N
S
lG
N
/
I
U
F
E
D
E
8
U
F
/
N
D
/
F
F
V
'D
M
F
G
L
lN
E
/
F
:
+
0
.
1

0
.
1
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
F
y
r
k
c
n
I
:
r
c
r
0
1
4
5
0
/
E
D
E
I
/
l
L
/
S
C
/
L
E
2
:
1
+

2
0
,
5
0
,
5
0
0 , 0 5
0 , 0 5
3
5
0 , 5 0
2

0
0 , 1 0
D
E
I
/
l
L
E
S
C
/
L
E
2
:
1
,
5
0
1
5
8
5
1
5
0 , 1 0
0 , 0 5
,
5
0
0 , 0 5

+

0
0 , 5 0
2
,
5
0
L
lN
E
/
F
:
+
0
.
1

0
.
1
3
0
x
3
0
x
3
0
1

0
0
3
F
c
:
I
e
n
e
r
0

0
3

1
2
W
E
lG
H
I
:
2
.
0
4

g
r
c
m
:
]
/
3
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
2
:
1
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
8
F
E
/
K
S
H
/
F
F
I
.
K
c
m
f
N
/
M
E
D
F
/
W
N
S
lG
N
/
I
U
F
E
C
H
K
'D
/
F
F
V
'D
M
F
G
D
E
8
U
F
/
N
D
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
V
i
n
k
e

:
I
c
n
g
0
1
2
0
1
0
1 5
S
E
C
I
l
C
N
C

C
S
c
m
I

i
g
c
k
c
n
I
e
r
g
r
c
c
c
c
e
m
e
c
0
.
3
x
4
5
1 0
1 3 4
2
1
5
1
0
3 2
x
M
3

H
C
H
K
'D
8
F
E
/
K
S
H
/
F
F
0
1

0
0
/
3
S
I
c
n
g
0

0
3

1
2
F

c
n
g
e
1
W
E
lG
H
I
:
2
5
1
.
4
4

g
r
c
m
:
]
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
1
:
1
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
F
/
W
N
I
.
K
c
m
f
S
lG
N
/
I
U
F
E
L
lN
E
/
F
:
+
0
.
1

0
.
1
D
/
I
E
/
F
F
V
'D
M
F
G
C
.
/
N
/
M
E
D
E
8
U
F
/
N
D
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
/
L
0
8
2
0
1
F
5
8
,
5
0
.
7
2
X
x
3
.
4
0
2
0
C
C
S
E
C
I
l
C
N
C

C
/


c
k
c
n
I
e
r
:
0
.
3
x
4
5
0
1 3
+
0
3
8
5
8
0
,
1
0
0 , 1 0
1 0
+
7
5
V
e
r
k
I
y
g
:
r
c
c
i
e
m
c
x
0
.
5
m
m
5
x
3
.
4
0
.
7
2
X
F
3
3
C
C
L
lN
E
/
F
:
+
0
.
1

0
.
1
S
I
c
n
g
0
1

0
0
4
F
c
:
I
e
n
e
r
8
e
c
r
i
n
g
0

0
3

1
2
W
E
lG
H
I
:
7
2
.
5
8

g
r
c
m
:
]
/
3
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
2
:
1
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
8
F
E
/
K
S
H
/
F
F
I
.
K
c
m
f
N
/
M
E
D
F
/
W
N
S
lG
N
/
I
U
F
E
C
H
K
'D
/
F
F
V
'D
M
F
G
D
E
8
U
F
/
N
D
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
/
L
0
8
2
0
1
C
/
/

0
2

1
0
0
/
M
8
_
S
I
c
I
c
r
W
E
lG
H
I
:
4
.
3
2

g
r
c
m
:
]
0

0
3

1
2
/
3
S
C
/
L
E
:
1
:
2
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
S
lG
N
/
I
U
F
E
N
/
M
E
I
.
K
c
m
f
D
E
8
U
F
/
N
D
S
H
E
E
I
1
C
F
1
L
lN
E
/
F
:
+
0
.
1

0
.
1
8
F
E
/
K
S
H
/
F
F
D
F
/
W
N
E
D
G
E
S
C
H
K
'D
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
M
F
G
/
F
F
V
'D
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:

0
1
l
I
E
M
N
C
.
F
/
F
I
N
U
M
8
E
F
F
/
F
I
N
/
M
E
C
I
Y
.
1
0
2

0
0
1
H
c
u
:
i
n
g
1
2
0
2

2
0
0
L
c
m
i
n
c
I
e
c
:
m
1
3
S
I
c
r
8
r
i
c
k
c
,
S
I
c

,
M
5
8
4
M
u
I
I
e
r
,
S
I
c

,
M
5
8
1
S
E
C
I
l
C
N
/

/
2
D
E
I
/
l
L
C
3
S
C
/
L
E
1
:
1
4
8
/
/
E
D
E
I
/
l
L
E
S
C
/
L
E
1
:
1
4
x
M
8
x
1
.
0

H
1
4
0
1 0
D
E
I
/
l
L
8
S
C
/
L
E
1
:
1
5
.
5
0
8
x
F
1
3
0
1
0
3
5
2
0
x
F
5
0
F
2
4
x
2
0
S
E
C
I
l
C
N
/

/
S
C
/
L
E
1
:
2
V
e
r
k
I
y
g
:
r
c
c
i
e
m
c
x
0
.
5
m
m
2
0
1 0
5
0
,
1
0
0
1
5
8
2
8
2
3
0
1
8
4
8
5
7 0
2
1
0
+
5
0
2

0
0
1
H
c
u
:
i
n
g
0

0
3

1
2
W
E
lG
H
I
:
2
3
3
3
.
7
7

g
r
c
m
:
]
/
3
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
1
:
5
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
S
lG
N
/
I
U
F
E
N
/
M
E
S
I
c
n
g
L
lN
E
/
F
:
+
0
.
1

0
.
1
E
D
G
E
S
8
F
E
/
K
S
H
/
F
F
D
E
8
U
F
/
N
D
I
.
K
c
m
f
D
F
/
W
N
C
H
K
'D
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
M
F
G
/
F
F
V
'D
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
/
L
0
8
2
0
1
L
c
m
i
n
c
I
e
c
:
m

0
2

2
0
0
W
E
lG
H
I
:
2
4
2
.
8
2

g
r
c
m
:
]
0

0
3

1
2
/
3
S
C
/
L
E
:
1
:
1
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
S
lG
N
/
I
U
F
E
N
/
M
E
I
.
K
c
m
f
D
E
8
U
F
/
N
D
S
H
E
E
I
1
C
F
1
L
lN
E
/
F
:
+
0
.
1

0
.
1
8
F
E
/
K
S
H
/
F
F
D
F
/
W
N
E
D
G
E
S
C
H
K
'D
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
M
F
G
/
F
F
V
'D
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:

0
1
l
I
E
M
N
C
.
F
/
F
I
N
U
M
8
E
F
F
/
F
I
N
/
M
E
C
I
Y
.
1
0
2

0
0
2
L
c
c
k
1
2
0
2

1
0
5
L
c
m
i
n
c
I
e
4
3
0
2

0
0
3
L
c
c
k
_
p

c
I
e
1
4
S
I
c
r
8
r
i
c
k
c
,
S
I
c

,
M
5
8
5
S
k
r
u
v
,
F
/
,
M
5
8
45
*
*
E
f
I
e
r
:

i
p
n
i
n
g
1
0
0
*
*
3
0
*
*
1
2
3
L
lN
E
/
F
:
+
0
.
1

0
.
1
F

c
I
5
m
m
0
2

0
0
2
L
c
c
k
0

0
3

1
2
W
E
lG
H
I
:
1
3
.
5

g
r
c
m
:
]
/
3
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
1
:
1
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
8
F
E
/
K
S
H
/
F
F
I
.
K
c
m
f
N
/
M
E
D
F
/
W
N
S
lG
N
/
I
U
F
E
C
H
K
'D
/
F
F
V
'D
M
F
G
D
E
8
U
F
/
N
D
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
/

c
c
F

u
:
0
1
M
c
I
e
r
i
c

I
j
c
c
k

e
k
:
5
m
m
2
0
8
x
1
0
7
0
2
5
,
5
0
2
1
0
 0
0
,
1
0
8 , 4 0
1
5
E
x
c
k
I
c
m
c
I
I
e
j
u
:
I
c
I
I
c
c
c
c
e
I
c

j
e
n
c
r
c
v
:
e
c
c
c
I
I
v
c
I
I
e
n
:
k
c
r
c
:
v
i
c
C
/
M
:
y
:
I
e
m
.
8
F
E
/
K
S
H
/
F
F
L
lN
E
/
F
:
+
0
.
1

0
.
1
0
.
5
m
m
x
2
3
0
2

1
0
5
L
c
m
i
n
c
I
e
0
7

0
3

1
2
W
E
lG
H
I
:

g
r
c
m
:
]
/
3
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
2
:
1
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
I
.
K
c
m
f
D
F
/
W
N
S
lG
N
/
I
U
F
E
C
H
K
'D
D
/
I
E
/
F
F
V
'D
M
F
G
C
.
/
N
/
M
E
D
E
8
U
F
/
N
D
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
S
I
c
I
c
r
p

c
I
:
I
c
c
k
0
1
3
5
1
4
4
,
1
F
1
0
5
F
5
0
2
x
5
,
5
0
F
2
L
lN
E
/
F
:
+
0
.
1

0
.
1
F

c
I
5
m
m
0
2

0
0
3
L
c
c
k
_
p

c
I
e
W
E
lG
H
I
:

g
r
c
m
:
]
0

0
3

1
2
/
3
S
C
/
L
E
:
1
:
1
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
S
lG
N
/
I
U
F
E
8
F
E
/
K
S
H
/
F
F
D
F
/
W
N
D
E
8
U
F
/
N
D
I
.
K
c
m
f
N
/
M
E
E
D
G
E
S
C
H
K
'D
/
F
F
V
'D
S
H
E
E
I
1
C
F
1
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
M
F
G
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
/

c
c
F

u
:
0
1
M
c
I
e
r
i
c

I
j
c
c
k

e
k
:
5
m
m
0
,
1
0
0
1
0
F
2
7
0
2
0
2
1
0

8
x
M
5

H
/
/
S
E
C
I
l
C
N
/

/
0
.
7
x
4
5
8
*
*
4
*
*
1
2 45
3

0
2

3
0
0
/
M
8
_
F
c
I
c
r
W
E
lG
H
I
:
1
2
4
3
.
8

g
r
c
m
:
]
0

0
3

1
2
/
3
S
C
/
L
E
:
1
:
1
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
S
lG
N
/
I
U
F
E
N
/
M
E
I
.
K
c
m
f
D
E
8
U
F
/
N
D
S
H
E
E
I
1
C
F
1
L
lN
E
/
F
:
+
0
.
1

0
.
1
8
F
E
/
K
S
H
/
F
F
D
F
/
W
N
E
D
G
E
S
C
H
K
'D
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
M
F
G
/
F
F
V
'D
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:

0
1
l
I
E
M
N
C
.
F
/
F
I
N
U
M
8
E
F
F
/
F
I
N
/
M
E
C
I
Y
.
1
S
k
r
u
v
,
F
/
,
M
5
2
S
I
c
r
8
r
i
c
k
c
,
S
I
c

,
M
5
1
2
3
M
u
I
I
e
r
,
S
I
c

,
M
5
4
0
2

0
0
4
I
c
r
g
e
I
F

c
n
g
e
8
c
I
I
c
m
1
5
0
2

1
0
1
I
c
r
g
e
I
L
c
m
i
n
c
I
1
0
2

0
0
5
I
c
r
g
e
I
F

c
n
g
e
I
c
p
1
*
*
E
f
I
e
r
:

i
p
n
i
n
g
S
E
C
I
l
C
N
/

/
3
x
4
5
0
0
2
0 , 0 3
2 5 , 5 0
+
0 , 1 0
3 2

0
5
4
1
3
5
S
c
m
I

i
g
c
k
c
n
I
e
r
g
r
c
c
c
c
e
m
e
c
0
.
3
x
4
5
F
1
7
,
7
5
x
5
,
5
0
F
2
5
3
,
5
0
3
0
/ /
L
lN
E
/
F
:
+
0
.
1

0
.
1
S
I
c
n
g
0
2

0
0
4
I
c
r
g
e
I
F

c
n
g
e
8
c
I
I
c
m
0

0
3

1
2
W
E
lG
H
I
:
1
0
0
.
0
5

g
r
c
m
:
]
/
3
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
2
:
1
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
8
F
E
/
K
S
H
/
F
F
I
.
K
c
m
f
N
/
M
E
D
F
/
W
N
S
lG
N
/
I
U
F
E
C
H
K
'D
/
F
F
V
'D
M
F
G
D
E
8
U
F
/
N
D
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
/
L
0
8
2
0
1
L
lN
E
/
F
:
+
0
.
1

0
.
1

0
.
2
m
m
x
1
0
5
:
I
0
2

1
0
1
I
c
r
g
e
I
L
c
m
i
n
c
I
0
7

0
3

1
2

W
E
lG
H
I
:

g
r
c
m
:
]
/
3
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
2
:
1
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
8
F
E
/
K
S
H
/
F
F
I
.
K
c
m
f

N
/
M
E
D
F
/
W
N
S
lG
N
/
I
U
F
E
C
H
K
'D
/
F
F
V
'D
M
F
G
D
E
8
U
F
/
N
D
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1

C
.
/
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
S
I
c
I
c
r
p

c
I
:
I
c
c
k
0
1

2
1
F
4
F
1
7
,
5
0
F
2
5
x
5
,
5
0
8
F
E
/
K
S
H
/
F
F
0
2

0
0
5
F

c
I
5
m
m
L
lN
E
/
F
:
+
0
.
1

0
.
1
0

0
3

1
2
/
3
D
E
8
U
F
/
N
D
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
2
:
1
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
C
H
K
'D
D
F
/
W
N
N
/
M
E
I
.
K
c
m
f
S
lG
N
/
I
U
F
E
I
c
r
g
e
I
F

c
n
g
e
I
c
p
/
F
F
V
'D
M
F
G
W
E
lG
H
I
:
7
3
.
1
0

g
r
c
m
:
]
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
/

c
c
F

u
:
0
1
F
2
5
0
F
4
5
+
0
,
1
0
F
1
x
5
,
5
0
5
/
/
L
lN
E
/
F
:
+
0
.
1

0
.
1

0
3

1
0
0
F
c
I
c
r
0
7

0
3

1
2
W
E
lG
H
I
:

g
r
c
m
:
]
/
3
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
1
:
2
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
8
F
E
/
K
S
H
/
F
F
I
.
K
c
m
f
N
/
M
E
D
F
/
W
N
S
lG
N
/
I
U
F
E
C
H
K
'D
/
F
F
V
'D
M
F
G
D
E
8
U
F
/
N
D
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:

0
1
l
I
E
M
N
C
.
F
/
F
I
N
U
M
8
E
F
F
/
F
I
N
/
M
E
C
I
Y
.
1
0
3

0
0
1
/
x

e
1
2
0
3

0
0
2
C
u
I
e
r
/

1
3
0
3

0
0
3
l
n
n
e
r
F
e
1
4
0
3

0
0
4
F

c
n
g
e
2
1
3
S
E
C
I
l
C
N
/

/
2
1
4
4
2
,
5
0
H
5
3
0
D
D
S
E
C
I
l
C
N
D

D
S
C
/
L
E
1
:
1
S
c
m
I

i
g
c
v
e
r
I
y
g
:
r
c
c
i
e
r
m
c
x
0
.
2
5
m
m
7
3
1
0
3
2 7
1
0
3
4
5
2 5 , 5 0
+
0
0
2
3 0
2 8 , 5 0
0 , 0 3
1
8
0
0 , 0 2

+
2 8 , 5 0
7
3
2 7
0 , 0 3
0 , 0 3
+
0 , 0 2
+
0 , 0 3
2 0
2 5 , 5 0

2
1
4
8
4
5
D
E
I
/
l
L
H
S
C
/
L
E
2
:
1
0
.
3
x
4
5
JJ
S
E
C
I
l
C
N
J

J
S
C
/
L
E
2
:
1
3
x
M
3

H
1
2
0
L
lN
E
/
F
:
+
0
.
1

0
.
1
:
I
c

3
0
x
5
0
3

0
0
1
/
x

e
0

0
3

1
2
W
E
lG
H
I
:
1
2
8
5
.
0

g
r
c
m
:
]
/
3
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
1
:
2
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
8
F
E
/
K
S
H
/
F
F
I
.
K
c
m
f
N
/
M
E
D
F
/
W
N
S
lG
N
/
I
U
F
E
C
H
K
'D
/
F
F
V
'D
M
F
G
D
E
8
U
F
/
N
D
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
H
y
c
r
c

r
c
r
,
0
1
N
c
I
e
:
D
e
I
r
e
h
c

e
n
i
v
c
r
c
e
r
c
c
n
c
e
p
c
c
x
e

n
h
c
r
e
n

u
I
i
n
g
p
c
4
5
g
e
n
I
e
m
c
I
c
x
e

n
:
c
e
n
I
r
u
m
.
M
c
I
I
f
r
c
n
c
x
e

n
:
y
I
I
e
r
y
I
c
c
r
h
c

e
n
p
c
:
i
I
i
c
n
e
r
c
c
e
{
m
c
I
I
f
r
c
n
h
c

e
I
:
c
e
n
I
r
u
m
)
4
2
.
5
m
m
i
n
f
r
c
n
f
r
c
n
c
x
e

n
:
c
n
c
c
r
.
H
c

e
n
c
r
1
2
0
f
c
r
:
k
j
u
I
c
g
e
n
e
m
c
I
v
c
r
c
n
c
r
c
.
S
c
r
I
:
G
e
n
c
m
g
c
e
n
c
e
g
c
n
g
c
,
M
3
/
/
L
lN
E
/
F
:
+
0
.
1

0
.
1

0
3

0
0
2
C
u
I
e
r
/

0
7

0
3

1
2
W
E
lG
H
I
:
5
0
8
1
.
3

g
r
c
m
:
]
/
3
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
1
:
2
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
8
F
E
/
K
S
H
/
F
F
I
.
K
c
m
f
N
/
M
E
D
F
/
W
N
S
lG
N
/
I
U
F
E
C
H
K
'D
/
F
F
V
'D
M
F
G
D
E
8
U
F
/
N
D
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
/
L
7
0
7
5

I
0
1
u
I
c
m
c
e
m
c
r
k
e
r
c
c
e
m
e
c
X
S
E
C
I
l
C
N
/

/
v
e
r
k
I
y
g
:
r
c
c
i
e
r
S
c
m
I

i
g
c
X
,
G
r
c
c
c
:
e
j
M
c
x
0
.
2
5
m
m
S
c
m
I

i
g
c
k
c
n
I
e
r
:
0
.
3
x
4
5
X
,
G
r
c
c
c
:
e
j
0
,
0
3

2
8
,
5
0

2 5 5
1
8
1 3
1
0
0
,
0
2
1
8
1
2
1
,
5
0
++
0
,
1
0
0
,
1
2
5 5
//
E
4
7
0
,
1
4
0
x
1
2
.
5
0
3

0
0
3
l
n
n
e
r
F
e
W
E
lG
H
I
:
3
8
3
.
0
7

g
r
c
m
:
]
0

0
3

1
2
/
3
S
C
/
L
E
:
1
:
2
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
S
lG
N
/
I
U
F
E
N
/
M
E
I
.
K
c
m
f
D
E
8
U
F
/
N
D
S
H
E
E
I
1
C
F
1
L
lN
E
/
F
:
+
0
.
1

0
.
1
8
F
E
/
K
S
H
/
F
F
D
F
/
W
N
E
D
G
E
S
C
H
K
'D
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
M
F
G
/
F
F
V
'D
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
/
m
n
e
:
r
c
r
0
1
S
E
C
I
l
C
N
/

/
S
m
c
I

i
g
c
k
c
n
I
e
r
:
0
.
3
x
4
5

3 0
1
3
0
1
2
1
,
5
0
1
2
0
0
,
1
0
0
,
1
2
2 5 5
2 3
1
2
1
,
5
0

0
,
1
0
0
,
1
2
S
c
m
I

i
g
c
v
e
r
k
I
y
g
:
r
c
c
i
e
r
M
c
x
0
.
2
5
m
m
88
I
.
K
c
m
f
C
H
K
'D
8
F
E
/
K
S
H
/
F
F
0
3

0
0
4
/
3
0

0
3

1
2
F

c
n
g
e
2
W
E
lG
H
I
:
4
1
1
.
3
5

g
r
c
m
:
]
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
1
:
1
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
L
lN
E
/
F
:
+
0
.
1

0
.
1
D
F
/
W
N
S
lG
N
/
I
U
F
E
D
E
8
U
F
/
N
D
D
/
I
E
/
F
F
V
'D
M
F
G
C
.
/
N
/
M
E
S
I
c
n
g
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
/
L
0
8
2
0
1
S
E
C
I
l
C
N
8

8
m
e
c
0
.
3
x
4
5
S
c
m
I

i
g
c
k
c
n
I
e
r
g
r
c
c
c
c
e
M
c
x
i
m
c

v
e
r
k
I
y
g
:
r
c
c
i
e
0
.
5
m
m
1 0
0 , 1 2+1 2 1 , 5 0
+ 0 , 1 0
3 8 , 5 0
2
3
2 8 , 5 0


0 , 0 2
0 , 0 3
1
3
21
8
F
E
/
K
S
H
/
F
F
L
lN
E
/
F
:
+
0
.
1

0
.
1

0

1
0
0
0
7

0
3

1
5
F

c
:
I
i
c
M
c
I
r
i
x
W
E
lG
H
I
:

g
r
c
m
:
]
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
1
:
2
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
I
.
K
c
m
f
C
H
K
'D
N
/
M
E
D
F
/
W
N
S
lG
N
/
I
U
F
E
D
E
8
U
F
/
N
D
/
F
F
V
'D
M
F
G
/
3
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:

0
1
l
I
E
M
N
C
.
F
/
F
I
N
U
M
8
E
F
F
/
F
I
N
/
M
E
C
I
Y
.
1
0

0
0
2
F
c
r
I
3
2
0

0
0
1
F
c
r
I
2
1
0
8
F
E
/
K
S
H
/
F
F
L
lN
E
/
F
:
+
0
.
1

0
.
1
/
3
S
h
e
e
I
5
m
m
0
7

0
3

1
5
F
c
r
I
2
W
E
lG
H
I
:

g
r
c
m
:
]
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
1
:
1
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
D
/
I
E
I
.
K
c
m
f
C
H
K
'D
N
/
M
E
D
F
/
W
N
S
lG
N
/
I
U
F
E
D
E
8
U
F
/
N
D
/
F
F
V
'D
M
F
G
0

0
0
1
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
C
.
/
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
F
C
M
F

c
:
I
i
c
0
1
F
8
4
F
3
1
2
x
2
.
2
0
F
8
8
5
2
0
D
E
I
/
l
L
8
S
C
/
L
E
2
:
1
D
e
I
c

j
e
n
c
r
e
j
k
c
m
p

e
I
I
m
c
I
I
:
c
I
I
c
c
c
e
n
c
r
I
c
n
k
I
c
I
I
v
c
I
I
e
n
:
k
c
r
c
:
m
e
c
C
/
M
:
y
:
I
e
m
F
1
,
5
0
F
8
0
, 5
0
F
2
2
F
3
F
1
,
5
0
1
2
x
2
.
2
0
C
i
r
k
e

L
c
g
e
n
I
i


F
2
,
:
c
m
g
e
r
u
r
g
r
c
p
n
i
n
g
c
r
n
c
:
c
j
u
p
,
g
c
r
I
i


e
n
p
u
n
k
I
:
c
m

i
g
g
e
r
2
m
m
L
c
k
c
m
c
r
i
g
c
f
c
r
c
v
r
i
g
c
c
e
I
c

j
e
n
.
D
e
I
I
c
g
c


e
r
f
c
r
:
c
m
I

i
g
c
u
r
g
r
c
p
n
i
n
g
c
r
.
F
c
r
I
3
D
E
8
U
F
/
N
D
0

0
0
2
I
.
K
c
m
f
W
E
lG
H
I
:

g
r
c
m
:
]
L
lN
E
/
F
:
+
0
.
1

0
.
1
0
7

0
3

1
5
S
h
e
e
I
2
0
m
m
8
F
E
/
K
S
H
/
F
F
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
1
:
2
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
D
F
/
W
N
/
3
D
/
I
E
/
F
F
V
'D
M
/
I
E
F
l/
L
:
M
F
G
C
.
/
/
N
G
U
L
/
F
:
+
/

0
.
1
S
lG
N
/
I
U
F
E
N
/
M
E
C
H
K
'D
E
D
G
E
S
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
F
C
M
F

c
:
I
i
c
0
1
8
S
E
C
I
l
C
N
/

/
1 0
3
1 0 0
3
1
3
//
I
.
K
c
m
f
L
lN
E
/
F
:
+
0
.
1

0
.
1
8
F
E
/
K
S
H
/
F
F
/
3
0

0
0
3
0
7

0
3

1
2
F

c
:
I
i
c
l
:
c

c
I
i
c
n
W
E
lG
H
I
:

g
r
c
m
:
]
S
H
E
E
I
1
C
F
1
S
C
/
L
E
:
1
:
1
D
W
G
N
C
.
I
lI
L
E
:
F
E
V
lS
lC
N
D
C
N
C
I
S
C
/
L
E
D
F
/
W
lN
G
M
/
I
E
F
l/
L
:
C
H
K
'D
D
F
/
W
N
S
lG
N
/
I
U
F
E
D
E
8
U
F
/
N
D
D
/
I
E
/
F
F
V
'D
M
F
G
C
.
/
N
/
M
E
S
I
c
n
g
E
D
G
E
S
/
N
G
U
L
/
F
:
+
/

0
.
1
U
N
L
E
S
S
C
I
H
E
F
W
lS
E
S
F
E
C
lF
lE
D
:
D
lM
E
N
S
lC
N
S
/
F
E
lN
M
lL
L
lM
E
I
E
F
S
S
U
F
F
/
C
E
F
lN
lS
H
:
I
C
L
E
F
/
N
C
E
S
:
F
C
M
0
1
Much more than documents.
Discover everything Scribd has to offer, including books and audiobooks from major publishers.
Cancel anytime.