You are on page 1of 126

TVE-12052

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
UTH-enheten

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 high-tech 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 fully-fledged 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: TVE-12052
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 Interference-fits.......................................................................................................... 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 Press-fits ............................................................................................................. 19
3.2 Matlab calculations with Spin2Win .......................................................................... 20
3.2.1 Centrifugal forces ............................................................................................... 20
3.2.2 Press-fit 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: Press-fitted aluminium into a Carbon composite .................................. 26
3.3.3 Case 3: Press-fitted 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 interference-fit between two cylinders................................. 16
Figure 5: Coordinate naming in a cylindrical coordinate system ............................................. 18
Figure 6: Shell interference with two surfaces, defined as a press-fit 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 under-side .......................................... 32
Figure 19: Active magnetic bearing target, over and under-side. ............................................ 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 50-50, 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]
*

Circumferential ultimate tensile strength, [Pa]


Material shear strain, [-]
Shell interference, [m]
Material strain, [-]
Poissons ratio, [-]
Density, [kg/m
3
]
Material stress, [Pa]
Shear stress, [Pa]
Rotational speed, [rad/s]

Subscripts
i Inner, internal
int Initial value
n Index number
o Outer, external
r Radial direction
z Axial direction
Circumferential (hoop) direction

1
1 Introduction
Energy storage plays a big part in todays society, where almost everything we use in our
everyday life requires energy to work. If this energy cannot be directly supplied to where it is
needed, for from example the electrical grid, it is often instead taken from some kind of local
energy storage. Today this local energy storage usually consists or either fuels; such as wood
and gasoline, or different kinds of batteries.

The flywheel is another type of energy storage device that stores its energy as kinetic energy,
or simply put in the rotational motion of the flywheel. Most flywheels are quite poor energy
storage devices on their own, at least when concerning long term energy storage. However, if
designed correctly a flywheels main strength lies in its ability to supply or absorb short, high
energy, bursts; or in other words it is good at absorbing or delivering high amounts of power
for short amounts of time. As such it is often implemented alongside other energy storages in
order to complement them; where a need of instant high power may arise. This can for
example be as balancing for the power grid or for short term backup power in for example
hospitals, where a power shortage would be devastating.

This thesis is a part of a bigger project that is implementing a high power flywheel into an
electrical vehicle. This in order to allow for the use of less powerful batteries as the main
energy storage in the vehicle and relying on the flywheel when high power is needed, such as
when the vehicle tries to accelerate. Furthermore, the aim is also to absorb and store the
energy released when the vehicle breaks by the use of regenerative breaking.

The concept is by no means new and numerous research teams over the world have developed
similar devices over the years. However, very few have reached commercial successes.
Usually due to economical limitations, the systems are simply too expensive for what they
deliver. Some of the more successful projects include the work of K Takahashi, S Kitade, H
Morita [1] who built an experimental rotor, capable of storing 195Wh/kg. Also worthy of
notice is the system constructed by Flybrid Systems [2], containing a complete flywheel
system designed for use in a Formula 1 car, storing 22Wh/kg of energy in their rotor.
1.1 Project history
In early 2005, an article on the subject of flywheels as energy storages was published from
Uppsala University [3]. The ideas presented in this article were to become the starting
grounds for a new flywheel research group in Uppsala. Under the years following 2005 the
groups main focus became the development of a complete driveline for an electrical vehicle,
a driveline in which a central flywheel was used as the main power source for the electrical
motors [4]. The flywheel was then to be charged by a separate battery powered circuit.

The project is now in its final stages and as such a first full scale prototype flywheel is being
constructed. A vital part of the flywheel concept developed in Uppsala University is the use of
composite materials as the main energy storage material. With the overall design decided and
much of the electrical design already done the focus of this thesis will be the design of the
composite materials for the full scale flywheel prototype.

2
1.2 Problem description
The flywheel will mainly consist of an aluminium core covered with a thick composite shell.
The composite will act as the main energy storage material in the flywheel as well as the
material holding the flywheel together as the rotational speed is increased beyond the limit of
the naked aluminium core.

The design of a composite material flywheel is no trivial task. One of the main problems lies
in the composite itself; this by being an orthotropic material making the load calculations of
the material much more complicated. Another problem is manufacturing, this as composites
must more or less be made with the correct dimensions from the start as they are near
impossible to lathe or mill once cured. Furthermore, the properties of the composite vary
greatly with the orientation of the fibres and also with the matrix material used, complicating
the design even further.

The problem can however be described with the always present performance versus cost
dilemma. How does one design a composite shell for a high speed, high power machine that
meets up to the desired specifications? This while still keeping the costs low and the safety
factors high.
1.3 Method
The two main tools used in this thesis during the design of the composite flywheel and also
the machine in large was Matlab and SolidWorks. Matlab was used for trying out different
analytical expressions in order to describe the different loads acting on the flywheel.
SolidWorks was then used to verify the results from Matlab and fine tune the design using the
built in FEM module.

Additionally, SolidWorks was also used to make all computer generated pictures of the
flywheel present in this thesis, as well as all the drawings of the machine.
1.4 Limitations
The following limitations were applied to the thesis in order to simplify the calculations and
to maintain the number of design parameters on a reasonable level:

- All composite calculations are based on the assumption of zero axial force.
Additionally only carbon- and glass-fibres are investigated.

- Most machine dimensions were set at the start of this thesis.

- All equations and derivations are based on an assumption of zero shear force and
torque in all material directions, meaning that they only hold true as long as the system
is in stationary operation.

- In all equations an assumption of a system in thermal equilibrium is made, meaning
that no temperature change over time is present.

3
1.5 Specifications
In order to further limit the design alternatives, a few additional constraints on the design
were set. Using these values approximate dimensions for the machine could later be
calculated. The constraints were as follows:

Minimal Maximal
Energy capacity: 300Wh (1.08MJ) none
Rotational speed: 15 000 rpm 30 000 rpm
Core height: 250 mm 280 mm
Core diameter: 195 mm 200 mm
Power: 30kW none
Operating temperature: -20 C +70 C
Table 1: Initial specifications
1.6 Goals
The following list of goals was set up in order to be able to evaluate the work progress. In no
particular order the goals were as follows:

- Investigate the feasibility of composite materials as the main energy storage of a high
speed composite flywheel.

- If proven feasible, begin the design of said composite shell. Design includes general
geometry as well as operating loads and manufacturing processes.

- Investigate the ability to manufacture the composite shell. If needed, find an external
manufacturer able to produce the composite.

- Modify the overall machine design so that it can accommodate a composite shell.

- Make a complete set of drawings for the whole machine, both for the sake of
manufacturing and documentation.

- Physically assemble the flywheel and perform initial performance tests, if time allows.

- Write a full technical report on the work and present the results to interested parts.

With the goals set, the next step was to investigate the nature of composite materials.



4
2 Theory
Some basic material theory is required to understand the concepts presented in this thesis. The
first part presents a quick briefing as to why flywheels are interesting as energy storage and
after that follows some composite material theory. Finally, the most important part; how
stresses in composite cylinders can be calculated.
2.1 Flywheels as energy storage
Flywheels are generally used for kinetic energy storage and have been around since the early
times of man. Every object rotating around an axis stores some amount of kinetic energy and
could in theory be called a flywheel. But the word flywheel is usually used for constructions
whose main purpose is the storage of kinetic energy through rotation. This has led to the
convention that the term flywheel describes a rotating, cylindrical object, usually of
considerable mass, whose main purpose is to store energy or to increase the moment of inertia
of a given system.

The total energy stored in a rotating mass can be calculated by using [5]:

2
2
1
e
z k
I E = (2.1)

For the sake of simplicity the flywheel is approximated to be a thin walled cylinder with
radius r. The moment of inertia can then be calculated using [5]:

2
r m I
c z
= (2.2)

The total stored energy can then be expressed by combining (2.1) with (2.2) creating the
following:

2 2
2
1
e r m E
c k
= (2.3)

While this formula yields the total flywheel energy it is not that useful when comparing
different flywheel designs. Instead, another quality is used for that purpose, namely specific
energy, from here on called Q
kg
. The specific energy formula is obtained by dividing (2.3)
with the mass formula for a cylinder yielding:

2 2
2
1
e r Q
kg
= (2.4)

5
However, without knowledge of the stresses in the flywheel this is not of much help. So if one
instead considers a circular cross-section of a cylindrical flywheel, there are two major forces
in play. One is the circumferential stress, also called hoop stress, and the other is the radial
stress. In reality a third force, the axial stress, is also present. But unless the construction have
some kind extra axial force, this force is usually small enough to be ignored. Approximately
the hoop stress in a spinning, closed loop of wire or thin walled cylinder, with a small cross
section area compared to its radius can be approximated by the following expression [6]:

2 2
r e o
u
= (2.5)

By then combining (2.4) with (2.5) a new expression for Q
kg
can be obtained, namely:

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 man-made 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 rebar-reinforced 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 carbon-fibres 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,
form-factor 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
E-glass
Carbon
steel
Aluminium
alloy
Titanium
alloy
*

[MPa] ~3100 ~2800 ~1400 300-1,300 200-600 400-1,400


*
r
[MPa] 20-30 20-30 20-30 300-1,300 200-600 400-1,400
E

[GPa] 198 155 55 200 72 116


E
r
[GPa] 11 11 12 200 72 116
G
-r
[GPa] 4.5 4.6 5 79 25 44
G
r-z
[GPa] 3.6 3.7 5 79 25 44
v
-r
[-]
0.3 0.3 0.25 0.3 0.3 0.3
v
r-
[-]
0.016 0.021 0.077 0.3 0.3 0.3
v
r-z
[-]
0.56 0.53 0.70 0.3 0.3 0.3
[kg/m
3
] 1600 1594 2146 7800 2800 4500
Table 2: Composite material data from Swerea alongside general metal material data

Kurt Olofsson [10] contributed with the composite data found in Table 2. These composites
are close to the current high-end spectrum of composite materials having high structural
values, and as such it is these composites that are of most interest to this project.

2.2.3 Composite theory
The significant difference in material properties between the matrix and reinforcement makes
the mathematical model for a composite material somewhat more complicated than that for a
isotropic material, such as most metals. This, as composite materials generally are stronger
along the directions of the fibres and weaker perpendicular to the fibres. In order to see the
effects of this on the mathematical model one must first study the general expressions, valid
for all materials. These general formulas are as follows [11]:

First is the general equation of motion, here written in tensor form:

u F

o = + V (2.9)

which is a generalization of Newtons second law, ma F = , with F being an externally
applied force density and o V representing the internal forces in the system. In order for the
system to be in equilibrium with no acceleration the term o V must be equal to F .
8
Written in cylindrical coordinates, which is fitting as the systems considered in this thesis are
of cylindrical shape, and with an approximation of zero acceleration the equation of motion
can be expressed as:

0
1
0
2 1
0
1
= + +
c
c
+
c
c
+
c
c
= + +
c
c
+
c
c
+
c
c
= +

+
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 strain-displacement 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 re-derivation 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
3
1
1
1 3
2 2 2
(2.27)

By then creating and utilizing the following identities:

( ) ( )
z z
zr z z z z
z z
z zr r
z z
rz zr
r
r
E
E
E
u u
u
u
u u
u u
u u
u
v v
v c c c v
o
v v
v v v
|
v v
v v

' +
=

+
=

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 Euler-Cauchy [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

K , in order to form a more compact expression.



With this all parts of the equations in (2.30) and (2.33) are known and are ready for use, as
long as all the input variables are known. These values can be obtained from material data
sheets along with system specifications, regarding rotational speed and cylinder dimensions.

15
2.3.1 Limitations
Note that the equations obtained here have a few limitations and can produce highly
inaccurate results if the input values forces the equations beyond these limitations. Most
critical is that the hoop through radial modulus ratio is not allowed to be equal to 3 as this will
make the Q factor and hence also the stresses diverge towards infinity. Physically this is not
possible and the stresses have to be continuous even at modulus ratios of 3 [12]. Therefore, in
order to avoid inaccurate results it is recommended that the ratio, for orthotropic materials, is
kept at values of at least above 5. For isotropic materials the modulus ratio is always 1 by
definition, so the problem solves itself.

The next limitation is that the equations do not account for the tensile strength of the material
and hence do not detect when the materials enter their plastic deformation area, where
Hookes law no longer is valid. Furthermore due to the use of the zero axial strain
approximation the results will also become inaccurate if the real system is subjected to axial
strains. The user has to be observant on both of these aspects in order to make sure that the
results are valid.

Finally the equations derived here assume zero shear stress in all directions, meaning that the
system is in stationary rotation with no external torques or accelerations in any direction. The
calculated stresses will hence not be valid if the real system is subjected to such forces, for
example the results would become inaccurate if the flywheel was rapidly drained or fed
energy, as that would result in both high torques and accelerations.

As this derivation made the assumption of a transversely isotropic material and not a truly
orthotropic material it only holds true as long as the radial and axial Youngs modulus is
approximately the same. If the two are too different this derivation has to be redone without
this simplification in order to give accurate results.

16
2.4 Interference-fits
An interference-fit is a type of friction based fastening method. Generally it is used when an
object, usually a cog or pulley is to be fastened onto a round shaft and the fastening does not
have to be easily disassemblable. There are two main types of interference-fits. The term
shrink-fit is used if the parts are mounted by heating and cooling the individual components;
causing them to expand and shrink. Parts are instead mounted by the use of brute force alone
the term press-fit is often used.

To obtain an interference-fit the hole, in which the shaft is to be fitted is deliberately made a
little bit too small, or the shaft is made a little bit too large for the hole. This means that the
shaft will have to be forced into the part with the hole. Once mounted, this creates an interface
pressure between the shafts outer walls and the holes inner walls. The magnitude of this
pressure is determined by the difference between the hole inner- and shaft outer-diameters as
well as the Youngs modulus and geometry of the two parts.


Figure 4: Schematic picture of a interference-fit between two cylinders

For a interference-fit between two isotropic materials the interface pressure and resulting
material deformations can be calculated using the following formulas [16]:

|
|
.
|

\
|
+

+
=
|
|
.
|

\
|
+

+
=
|
|
.
|

\
|
+

+
+
|
|
.
|

\
|
+

+
=
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 full-scale 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, press-fit 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 z-axis 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 CAD-models with symmetry around the z-axis from this point on.

19
3.1.3 Press-fits
SolidWorks is capable of performing calculations on press-fits and shrink-fits, 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 press-fit the model have to be made with the interference built into the
parts, meaning that the part that is to be press-fitted have to be modelled a little bit too big, for
shafts, or a little bit too small, for holes. The press-fit is then defined in the simulation mode
as a component contact type named: shrink-fit. Setting the option Incompatible bonding
options to More accurate also improves the accuracy of the press-fit 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 press-fit 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
press-fits will be used as the main fastening method means that the program also has to be
able to cope with press-fit 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 press-fits


Figure 7: Example stresses due to centripetal forces in an aluminium cylinder at 22k rpm.

21
3.2.2 Press-fit 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 non-linear 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 non-linear 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 green-tinted
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: Press-fitted aluminium into a Carbon composite
In this case Spin2Wins ability to calculate press-fit 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 T700-epoxy, 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: Press-fitted 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 press-fitted. 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 Advantex-epoxy, orthotropic:
Inner diameter: 200 mm
Outer diameter: 300.25 mm
Height: 250 mm

Shell 3 T700-epoxy, 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 data-points. 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 under-side

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 under-side.

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 power-electronics 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 power-electronics
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 press-fitting. 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 curing-cycle, this in order to reduce the cost of the composite. The
alternative being that each layer is cured individually and then press-fitted 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 cross-linked 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 multi-million, 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 93-98, 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 mesh-size 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 press-fit 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 shrink-fitted 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 50-50, meaning
equal thickness of the carbon and glass composite layers.


Figure 29: Layup 2 vs. Layup 2 50-50, 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 98-138, 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 50-50 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 50-50 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 Two-Voltage-Level Flywheel-Based 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 0-408-01396-6

[7] http://en.wikipedia.org/wiki/Composite_material 04-09-2012

[8] http://i01.i.aliimg.com/photo/v0/338333453/3d_carbon_fibre_sheet.jpg 11-06-2012

[9] http://upload.wikimedia.org/wikipedia/commons/7/71/Cfaser_haarrp.jpg 11-06-2012

[10] Kurt Olofsson, Swerea SICOMP, www.swerea.se/sicomp/

[11] B. Sundstrm, KTH Handbok och formelsamling i Hllfasthetslra, E-Print AB, 2008, Page 1-27

[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 978-91-44-04453-8, Page 158

[14] http://en.wikipedia.org/wiki/Transverse_isotropy 11-06-2012

[15] Verified by using the ODE solver on: http://www.wolframalpha.com 11-06-2012

[16] W.H.Dornfeld, Thick-Walled Cylinders and Press Fits, 2004

[17] http://help.solidworks.com/2011/english/SolidWorks/cworks/LegacyHelp/Simulation/
Materials/Isotropic_and_Orthotropic_Materials.htm 11-06-2012

[18] http://help.solidworks.com/2011/english/SolidWorks/cworks/LegacyHelp/Simulation/
Meshing_topics/About_Shrink_Fitting.htm 11-06-2012

[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 11-06-2012

[22] K. Olofsson, SICOMP CR12-024, 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 press-fit 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,
press-fit pressures and their combined effect.

Shell radial displacement calculations, for both the pure press-fit case and the
combined centrifugal, press-fit 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 Un-checking 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 multi-layered 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 hoop-radial direction also called v index 12. For most metals and
composites this value varies around 0.25-0.35. The inverse value,
21
radial-hoop, 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 M-file 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 26-Mar-2012 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 .txt-file
[filedata, hdlines] = ReadFile(uigetfile('Spin2Win_*.txt', ...
'Choose an old output-file, 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 output-file');
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 m-file 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 radial-axial

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,m-1); %interface pressure storage vector
K = zeros(1,m-1);
U = zeros(1,m-1);
b = zeros(1,m);
u = zeros(1,m);
j = zeros(1,m);
Ten_o = zeros(1,m);
A = zeros(3*(m-1) , 3*(m-1));
B = zeros(3*(m-1) , 1);
Pd_still = zeros(1,m-1);
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))/(9-u(k)^2));

end

% Interface calculation between shells
for i = 1:1:m-1
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,m-1);

[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:m-1
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)^2-ri(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:m-1
A(k , k)=K(k);
A(k , (m-1+k)) = -1;
end

% Pd di fill
for k=1:1:m-1
A(m-1+k , k) = -U(k);
A(m-1+k , 2*(m-1)+k) = -1;
end

% do di fill 1
for k=1:1:m-1
A(2*(m-1)+k , m-1+k) = 1;
A(2*(m-1)+k , 2*(m-1)+k) = -1;
end

% do di fill 2
for k=1:1:m-2
A(2*(m-1)+1+k , m-1+k) = -1;
A(2*(m-1)+k , 2*(m-1)+1+k) = 1;
end

% B fill
for k=1:1:m-1
B(2*(m-1)+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 fine-tuning
% or major change if an orthotropic material is used.
Pd_t = 0;
for k = 1:1:m-1
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',1e-9,'TolFun',1e-9);

% Fine-tune 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;

% Fine-tune 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:m-1
r_mark(1,i) = (ri(i+1)/step-ri(1)/step)+1;

end
r_mark(1,m)=(ro(m)/step-ri(1)/step)+1;
r_mark = floor(r_mark);

for i=1:1:m-1
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('Press-fit, 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:m-1
disp(['Shell ', num2str(k), '-' , num2str(k+1), ': ', ...
num2str(Pd_still(k)/10^6), ' [MPa]'])
end
disp('--------------------------------------------------')
disp('Press-fit, 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:m-1
disp(['Shell ', num2str(k), '-' , num2str(k+1), ': ', ...
num2str(Pd(k)/10^6), ' [MPa]'])
end
disp('--------------------------------------------------')
disp('Maximal assembly force needed for shell press-fit mounting:')
%Repeat for number of interferences
for k = 1:1:m-1
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:m-1
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:m-1
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,m-1);
Ten_r = zeros(1,m-1);
Ten_z = zeros(1,m-1);
u = zeros(1,m);
Pi = zeros(1,m-1);
Po = zeros(1,m-1);
C1 = zeros(1,m);
C2 = zeros(1,m);
Q = zeros(1,m);
Q2 = zeros(1,m);
z = zeros(1,m-1);
di = zeros(1,m-1);
do = zeros(1,m-1);
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))*((1-v_rz(k)*v_zr(k))/(1-v_zc(k)*v_cz(k))));
b(k) = (v_cr(k)+v_cz(k)*v_zr(k))/(1-v_zc(k)*v_cz(k));
end

% Interface calc
for i = 1:1:m-1
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:m-1
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)^2-9)); %last part of 2.20
Q2(k) = p(k)*w^2*(u(k)^2+3*b(k))/(u(k)^2-9); % 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:m-1

% Calc shell k+1 inner displacement di
k=k+1;

Ten_r(k-1) = C1(k)*ri(k)^(-1-u(k))+C2(k)*ri(k)^(-1+u(k))+Q(k)*ri(k)^2;

Ten_c(k-1) = u(k)*(C2(k)*ri(k)^(-1+u(k))-C1(k)*ri(k)^(-1-u(k)))...
+Q2(k)*ri(k)^2;

di(k-1) = ri(k)*((Ten_c(k-1)/Ec(k))*(1-v_zc(k)*v_cz(k))...
-(v_rc(k)+v_zc(k)*v_rz(k))*Ten_r(k-1)/Er(k));

Ten_z(k-1)=Er(k)*(v_zr(k)*Ten_r(k-1)/Er(k)+v_zc(k)*Ten_c(k-1)/Ec(k));

k=k-1;

% Calc shell k outer displacement do
Ten_r(k) = C1(k)*ro(k)^(-1-u(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)^(-1-u(k)))...
+Q2(k)*ro(k)^2;

do(k) = ro(k)*((Ten_c(k)/Ec(k))*(1-v_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:m-1
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,m-1);
Po = zeros(1,m-1);
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))*((1-v_rz(k)*v_zr(k))/(1-v_zc(k)*v_cz(k))));
b(k) = (v_cr(k)+v_cz(k)*v_zr(k))/(1-v_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:m-1
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)^2-9)); %last part of 2.20
Q2(k) = p(k)*w^2*(u(k)^2+3*b(k))/(u(k)^2-9); % 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,m-1); %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)^(-1-u(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(1-m) 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)^2-ri(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^2-w_^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_mark2-1)*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_mark2-1)*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_mark2-1)*step+ri(1))*1000,Ten_c(3,(r_mark2)),'*k');

% Give axis names
hold off
title 'Hoop stress [Blue: Pure centrifugal , Red: Press-fit at standstill ,
Black: Press-fit 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: Press-fit at
standstill , Black: Press-fit 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_mark2-1)*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_mark2-1)*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
% CARBON-COMPOSITE 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: 1-7:
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: '30-Mar-2012 13:58:04'
P_standstill: 5.0647e-005
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: 05-Apr-2012 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.7007e-015 [MPa]
--------------------------------------------------
Press-fit, standstill:
Maximal tension, hoop: 132.0258 [MPa]
Minimal tension, hoop: -152.1421 [MPa]
Maximal tension, radial: 1.5495e-014 [MPa]
Minimal tension, radial: -27.576 [MPa]
Interference pressures:
Shell 1-2: 27.5797 [MPa]
Shell 2-3: 20.3778 [MPa]
--------------------------------------------------
Press-fit, rotating:
Maximal tension, hoop: 165.4994 [MPa]
Minimal tension, hoop: -98.5535 [MPa]
Maximal tension, radial: -5.134e-015 [MPa]
Minimal tension, radial: -23.1102 [MPa]
Interference pressures:
Shell 1-2: 23.1145 [MPa]
Shell 2-3: 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 press-fit mounting:
Shell 1-2: 3971.9038 [kN]
Shell 2-3: 3520.4837 [kN]
--------------------------------------------------
Maximal transferable torque between shells, at standstill:
Shell 1-2: 497.4809 [kNm]
Shell 2-3: 528.9527 [kNm]
--------------------------------------------------
Maximal transferable torque between shells, at max rpm:
Shell 1-2: 416.9369 [kNm]
Shell 2-3: 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 glass-fibre composite
layer and lastly a carbon-fibre 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 non-linear 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 press-fit 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 press-fit 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 press-fit interference pressures. The blue line
shows the displacement at maximum speed as a combination of press-fit 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