Академический Документы
Профессиональный Документы
Культура Документы
Abstract. The flow field around cylindrical obstructions is computed by solving the Stokes
equations. We were able to reproduce well know flow patterns around cylinders at very low
Reynolds numbers. An h -Method adaptive meshing algorithm is developed using a heuris-
tic error indicator. Pressure tended to produce the meshes with the lowest relative error in
the least number of refinements. The meshes produced using u, v and p separately as error
indicators were markedly different. A significant reduction in computation time was achieved
using a sparse matrix storage and linear algebra software.
1. h-Methods also known as mesh refinement methods, re- If we assume that the flow is steady, incompressible
fine elements which have a high a priori error by adding and uniform in the z direction then V(x, t ) = V(x, y) =
nodes and vertices. (u(x, y), v(x, y)). If we further construct a situation involving
2. r-Methods also known as mesh movement methods, do very low Reynolds number (Re < 10), the nonlinear term in
not add any new nodes but simply move existing nodes in equation 1 will be small resulting in the Stokes equations
order to obtain the lowest possible global error. This may
involve solving an optimization problem. −ν∇2 V + ∇p = 0 (3)
3. p-Methods also known as mesh enrichment methods, in-
crease the degree of the polynomial interpolating function where p has been redefined as the scaled pressure p := p/ρ .
for a particular element with high a priori error estimate. The associated continuity equation is
Additionally many hybrid methods exist which combine
the ideas from the three basic adaptive mesh methods. Some ∇ · V = 0. (4)
of these hybrid methods are combined mesh refinement and
mesh movement (hr-methods) and combined mesh refine- The Stokes equations are linear and the solution is the set
ment and mesh enrichment (hp-methods). For additional in- of functions (V(x, y), p(x, y)).
formation on adaptive mesh generation methods, see Chung
[2002]. 4.2. Finite Element Formulation
For all unstructured adaptive mesh techniques, the gen-
We begin by constructing a piecewise approximate solu-
eral procedure involved is
tion to the Stokes equation V̂(x, y) and p̂(x, y) where
1. Solve the simulation model.
2. Obtain an estimate of the local relative error over each nv
element using some error indicator (typically u , v , p or ρ in V(x, y) ≈ V̂(x, y) = φ j (x, y)Ṽ j (5)
X
a CFD problem). j =1
3. Identify elements with high relative error.
np
4. Increase the accuracy of the solution over elements
p(x, y) ≈ p̂(x, y) = ψ j (x, y)p̃ j (6)
X
which have high error and
j =1
5. Repeating until a global error tolerance is met.
where φi (x, y) and ψi (x, y) are the interpolating functions as-
3.3. Sparse Matrix Storage and Computation sociated with velocity and pressure respectively, Ṽ j and p̃ j
are the nodal values velocity and pressure, n v is the number
1D coefficient matrices resulting from the FE method are
of velocity nodes and n p is the number of pressure nodes.
tightly banded and may be stored and solved efficiently.
For structured meshes in 2D coefficient matrices are typi- This formulation allows us to have a different number of ve-
cally banded and thus banded storage and solution algo- locity and pressure nodes. From this point on the explicit
rithms can be used with savings over dense solvers [Burkardt, dependency in x and y will be dropped in the interest conci-
2005c]. For unstructured meshes in 2D, coefficient matrices sion.
are typically sparse and unbanded. The sparsity is especially The necessary conditions of the FE method, which mini-
pronounced for adaptively generated meshes. Thus, general mize global error of the approximate solution, are
sparse matrix storage and computation is crucial for efficient
solutions to large problems.
Z
wi L {V̂, p̂} d Ω = 0 (7)
Sparse matrix data structures come in many forms all of Ω
which attempt to only store nonzero entries of a sparse ma- where Ω is the problem domain, wi are weighting func-
trix. The most simple storage structure is called the coordi- tions and L is the Stokes operator given by equations 3
nate format or the Triad format [Seager, 1988] which stores
the row number, column number and nonzero entries in and 4 [Willis, 1987]. The Galerkin method sets the weight-
vectors of equal length. Other, more efficient storage struc- ing functions equal to the interpolating functions such that
tures include the compressed sparse row format, compressed wi = (φi , ψi ). The equations so far are not very useful to
sparse column format, and the sparse block storage format. us, but if we apply the Stokes operator and multiply by the
The coordinate format is used in this paper. weighting functions we start to formulate the useful FE equa-
If we let n s be the number of nonzero entries in the ma- tions
trix A of dimension N , then the coordinate format will only Z
provide storage savings if 3n s < N 2 . Dense matrix storage φi (ν∇2 V̂ + ∇p̂) d Ω = 0 (8)
increases as N 2 where sparse storage increases linearly with Ω
N. Z
ψi ∇ · V̂ d Ω = 0. (9)
Ω
4. Model Formulation and Development which are known as the strong form of the Stokes equations.
This section will address the simplification of the Navier- A solution to these equations is a so called strong solution.
Stokes equations, finite element formulation, quadrature rule A strong solution, due to the second derivative term, re-
over the general triangle and the adaptive meshing algo- quires the interpolating functions be at least C 1 (Ω) functions
rithm. [Burkardt, 2005c].
We can derive the weak form of the Stokes equations via
4.1. Navier-Stokes Simplification integration by parts, which states that for a continuously dif-
ferential functions B and F defined over some region Ω
The NS Equations for unsteady compressible flow are
Ee = ∂u ∂v
nel
Xe h + =0 (18)
1
max θin , θ nj , θkn − min θin , θ nj , θkn
³ ´ ³ ´i
nel e ∂x ∂y
n=1
With the associated set of boundary conditions:
where nel e is the number of elements. This relative error es-
timate is is known as a heuristic type error estimte[Bangerth 0 ≤ x ≤ Lx , 0 ≤ y ≤ L y (19)
and Rannacher, 2003]. There exist many other error estimation
methods which will not be discussed in this paper. v(x, 0) = k x (1 − x), u(x, 0) = 0 (20)
4 BRACKEN: ADAPTIVE MESHING AND SPARSE MATRIX STORAGE FOR STOKES FLOW
∂V ¯¯
¯
=0 (21) Quadratic basis functions for a triangle are derived in
∂x ¯(x,L y ) Burkardt [2005b]; here we will state them without proof. For
V(0, y) = 0, V(L x , y) = 0 (22) the three vertex nodes
p(x o , y o ) = 0 (23) g v (x, y) h v (x, y)
φi (x, y) = (28)
where (x o , y o ) is an arbitrary point. Inflow boundary con- g v (x i , y i ) h v (x i , y i )
ditions are a parabolic vertical velocity profile perpindicular
to the boundary. Outflow boundary conditions require that where
flow be perpendicular to the boundary. The left and right
side and obstruction boundary conditions are no slip (zero g v (x, y) = (x − x j )(y k − y j ) − (x k − x j )(y − y j ) (29)
Dirchlet). Pressure is a potential function and thus need only
to be specified at a single point (x o , y o ). and
u=v =0
where
and
nv np
∂φi ∂φ j ∂φi ∂φ j ∂ψ j
Ï ½ ¾
ν + ṽ j + φi p̃ j d A = 0 (25)
X X
(x i , y i )
A j =1 ∂x ∂x ∂y ∂y j =1 ∂y
Ï X nv ½ ∂ψ j ∂ψ j
¾
uj +vj φi d A = 0 (26)
A j =1 ∂x ∂y (x j , y j )
5.3. Quadriture Over a General Triangle routines were used for this problem [Burkardt, 2007]. Specif-
ically the subroutines for evaluating the basis functions and
The reference triangle Tr has vertices (0,0), (0,1) and (1,0) assembling the coefficient matrix.
in dimensionless coordinates (ξ, η). Gaussian quadrature for The initial node generation program is called regmeshgen,
the reference triangle is the main simulation program is called stokes_sim the er-
ror analysis program is called adaptive and the mesh refin-
n
ing program is called nodegen. A flowchart of the software
Z
f (ξ, η) d ξd η = w p f (ξp , η p ). (35)
X
Tr p=1
framework is shown in figure 5.
xp xi x j − xi xk − xi ξp adaptive stokes_sim
· ¸ · ¸ · ¸· ¸
= + (36)
yp yi y j − yi yk − yi ηp
Figure 5. Software framework controlled by BASH shell
We can write our quadrature rule as script.
Z n
f (x, y) d xd y = A T w p f (x p , y p ). (37)
X
T p=1
5.5. Parameters
Where A T is the area of the triangle which is the artifact of All of the parameters presented here have been previously
a constant Jacobian for our linear mapping. The area of the defined. The prameter values are given in Table 1. In addi-
triangle is given by tion to the parameters in table 1 the are the parameters as-
sociated with the cylindrical obstructions, namely the radii,
1 xi y i vertices and the number of nodes used to define the obstruc-
AT = 1 x j y j
(38) tion.
1 xk y k
2 2 2
1 1 1
0 0 0
0 0.5 1 0 0.5 1 0 0.5 1
(a) 1 obstruction (b) 5 obstructions (c) 13 obstructions
0 0 0
1 1 1
2 2 2
0 0.5 1 0 0.5 1 0 0.5 1
50
● ●
●
Horizontal velocity Horizontal velocity
50
● Vertical velocity Vertical velocity
Average Percent Realative Elemental Error
45
45
40
40
● ●
●
●
35
35
●
●
●
30
30
●
● ●
● ●
●
25
●
●
●
●
25
●
● ●
20
●
● ● ●
20
1 2 3 4 5 6 7 1 2 3 4 5
Figure 8. Average relative element error as a function of Figure 10. Average relative element error as a function of
refinement step for 1 obstructions. refinement step for 13 obstructions.
●
The plots of relative error (Figure 8,9 and 10) show that the
average element was area limited ( A < A mi n ) and not limited
50
Horizontal velocity
Vertical velocity by the choice of ². The imposition of a minimum area turned
Average Percent Realative Elemental Error
ments but also the mesh with the lowest relative error (Figure
● 9). Once again using θ = u took the fewest refinement steps.
● The generated meshes follow similar trends as with a single
35
●
●
●
●
●
25
●
2500
● !
!!
!!!!!
!!
!!
!!!!
!!
!!
!!!
!!!
!!!!
!!
!!!
!!!!
!!
!!
!!
!
!!
!
!!
!
!!
!
!!
!!!!
!
!
!
!
!
! !
!
!
!
!
!
!
!
!
!
!
! !
!
!! !
!
!
!
!
!
!
!
!
!
!
!!
! !! ! !!
!
!
!!
!
!
!
!
! !!
!
!
!
!
!!
!!
!! !! ! !! !
!
!
!!
!!
!
!
!
!
!!
!
!
!
!
!
!
!
!!
!
!
!
!!
!
!!!
!!
!
!
!
!
!!
!! !
!!
!
!
!
!! !!
!
!
!
! !
!
!
!
!
!
!
!
!
!!!
!
!
!
!
!
!
!
!
!!
!
!
!
!
!
!
!
!!
!
!
!
!
!!!!
!
!! !
!!
!
!
!
!
!
!
!
!
!
!
! !
!
!
!
!
!
!
!
!
!
! !!! !
! !
!
!
!!
!!!!
!!!
!!
!
! !!
!!
!!
!
!!
!
!!
!
!
!!
!
!
!
!
!
!!
!
!!
! !! ! !!
!
!!
!
!! !
!
!
!
!!!
! !
!!
!
!
!
!!
!
!!
! !!
!
!!! !
! !
!!
!
!!
!!
!
!!
!
!!!
!
!!
!! !! !
!!
! !
! !
!
!
!
!
!!
!
!
!!
!
!!
!
!! !!!!!!
!!!
!!
!!!
!
!! !!
!!!
!!
!!!!
!!
!
! !
!!
!
!!!
!!! !!
!
!!
!!!!! ! !!
!
!!!!
!
!!!
!
! !
!
!
!!
!
! !!
! !
!
!
!
!
!!
!!! !! !
!!
! !
! !!
!!
!!
!
!!
!!!! !
!!!
!!! !!!
!
!!
!! !
!
! !
!!
!!
!!
!!
!
!
!! !!
!
!
!!
! !!
!!
!!! !
!! !
!!
!
!! !!
!
!
!
!
!! !
!
!
!
!
!
!!!
! !
!!
!
!!
! !! !
!
!!
!!
!
!!
!!
!
!!
! !
!
!!
!! !!
!
!!
!!
!
!!!!! !!
!!
!
!
!!
!
!
!
!!
!!
!
! !!!
!!
!!
!! !
!!
!!
!!
!! ! ! !!
!
!!
! !
! !!! !
!
!!!
!!
!!
!
!!!
! !!
!
!
!
!
!!
! !
!!
!!
!!! !
!!
!
!!
!!
!!
!!! ! !!
!!
!
!
!
!!
!
!!!
!
! !
!
! ! !
!
!!
!
!! !
!!!
!
! !!!!!
!
!!
!!
!
!
!
!
!!
!
!!
! !!! !
! !
!
!
!
!! !
!! ! !
!!
!!!
!
!! !! !!!!
!!
!
!!
!!
!
! !
!!
!
!
!! !
!! !
! !!
!!!
!
!!
!
!!!
! !!
!!
!!
!
!!
!!
!!! !
!!
!
!!
!
!! !! !! !
!
!
!!
!
!
!
!
!!
!!
!!!
!!
!!!
!
!! !
!!
!
!! !!
!
!!!
! ! !
!
!!!! !
!!!
!!! !
!! !
!!
!
!
!!
!!
!
!!
!
!!
!
!
! !! !
! ! !
!
!
!
!
!!
!!
!! ! !
!!!
! !
!
!!
!
!!
!!
!
!!!!
!!
!
!! !
! ! !!!
!!
!!
!!!
!
!!
!
!!!
!! !!!
!!!! !
!!
!!! !
!!
!
!!
!
!! !!!
!!
! !!! !
!!
!!
!!
!!
!
!
!
!!
! !
!
! !
!
!! !
! !
!
!! !!
!
!!
!!! !!!!
!
!!
!
!
!!
!!
!!
!
!
!!
!
!
!!
!!
!
!!
! !
!
!!!
! !!
!!
! !
!
! !!
!!
!! ! !
!!!
!! !!!!! !
! !!
!
!!
!
!! !
!!!
!!!
!
!!
!
!! !
!
!!
! ! ! !
!!!
!!! !!
!!
!! ! !
!
!
!!
!
!
!
!
!!
!
!!
!
!!
!!
!
!!!
!
! !!
!
! !
!!!
! !
!!
!!
! ! !!
!!
!!
!
!!
!!! ! !
!!
!
!!
! !
!!
!
!
!
!
!!
!
!
!!!
!!!!
!!
!!!
! !
!!
!! ! ! ! !
!
!!
! !
!!!
!!
!!! !
!
!!! !! !
!
!
!!
!
!
!
!
!!
!
!!
!
! !!
!
!
!!
! !
!!
! ! !
!
! !!
!!
!
!
!!
!
!! !!
!!
!
! !
!
!
!
!!
!
!
!!
!
!!! !
!
! !!!
!!!
! !
!!
!
!! !
!
!! !!!
1 2 3 4 5
!!
!
!! !!!
!!
!!
! !!
!
!!
!
!
!
!!
!
!
!!
!! !!!
!
!! !
!
!
!!
!!! !
!!!
!!
!
! !!!!
!
!
!!
!
!!!
!
!!
!
!
!!
!!! !
!! ! !
!
!!
!
!!
! ! !!
!
!!
!
! !! !
!!
!
!!!
!!! !!!!
!!
!
!! !
!
!!!!
! !!!
!!
!
!!
!
!
!
!!
!
!
!!
!
!
!!
!
!
! !
!!
!
!!
! !! !
!
!! !!
!
!!
!!
! ! !!
!!
!
!! !
!!!
!! !
!
!!
!
!
!!
! !
!! !!
!! !!!
!
! !
!!! !! !
!!! !
! !
!!
!
!
!
!!! !!
!
!! ! !!
!!!
!!
!
!!
!
!
!! ! !!!
!
! !!!
!! !
! ! !! !
! !
! !
!! !
!!
!!
! !
! !! !!!
!
!! !
! ! !! !
! ! ! ! ! !! !!
! !! !
!!
! ! ! !!! !!
!!
!!
!!
!
!!!! ! !
!
!
! ! ! !! ! ! ! !!! !!
! ! ! !!
!! !! !!!!
!!
!! !
! !!! !!
!
!!
!
!! !
! !! !!!
!
!!!
!!
!
!!!
!!! !
!!
!! !
!!!
!
!!!
!
!!
!
! !
!! !
!! !!! !!
!!
!!
!
!!
! !!
! !!!! !
!! !
!
! !
!
! ! !
! ! ! ! ! !! !
!
!!
!!
!
!!
!
!!
!! !!!
!!
!
!!!
!
!
!! !!
!
!!
!
!!!
! !! !!
!!!
!
!!
!
!!!
!
!! !
!!
!
!
!!!
!!
!
!! !!!
!!
!! !
! !! !
! !!! ! !!
! !
! !! !
! !
!!
!! ! ! ! !!
!
!!
!
!!
!!
!
! !!!!!!
!!!
!!
!!
!!
!
!!
!
!!! !!!!! !
!
!!! !!
!! !
!!!
!
!! ! ! !!!
!! ! !!!
!!
! !
! !
! !
! !!!!
!!!!!
!
!
!!
!!!
!
!!
!!! ! !
!!
!!!!
!!!
!!
!
!!
!
!! ! !!
!!
! !! !!! !
!
!
!!!
!!
!
!
!!
!!
!
!
!!
!
!
!
!!!!
!!
!!! !
! ! !
!
!!
! !!
!!
! ! !! !
! ! !! !
!! ! ! !!
!!
!
!!
! ! !! !
!
!
!!
!!
!
! ! !
!!
!
!!
! !!! !
!!!
!
!
! !
! ! !!
!!!
!
!
!!
!!!
!!
! !!!
!
!!!!
!
!!!
!!!!
!!
!
!
!!
! !!
!!!! !!!
! !! !! !! ! !! ! !! !! !!!!
!!
!
!!
!! !!!!! !! ! !!!
!!!!
!
!!
!!!!
!
!
!!!
!!
!
!
!!
!
!!
!
!
!
!!
!
!!
!! !
!!
!
! !
!!!
!!
!!!! ! ! !
! !
!! !!!!
!! !! !!!!!
!
!! ! ! !
! !
!
!!
!! !!
!
!
!
!
!!
!
!
!!
!
!!
!
!!
!
!
!!
!
!!!
!!
!
!!!
!! !
!!
!! !
!
!!
!
!
! !!!!
!! !!!
!
!
! !
! ! ! !
!!! ! ! !! !
! ! !
!
!
!!
!!
!
!! ! !! !
!! ! !
!
!!
!
!!
!
!!
!! !!!!
! !
! !!
! !!
!
!
!! !
! !!! !! !!!! !
!
!!
!
!!!!
! !! ! !! !
!
!!
! ! !
!!!!
!!! !
!!!!!!
! !!
!
!!
!!!
!
!
!!
!!
!!
!!
!
!!!
!
! !!! !
! !!
!!
!
! ! !!
!!
!
!!
!
!!
!
!!
!
!
!!
!!!! !
!!!
!! !!!
!!! !
!!
!!
!!
!!
!!
!!!
!!
!! !!
!!
!
!!
!
!! ! !
!!
!
!
!! !
! !
! !!! ! ! ! !! !! ! !
!
!!
!! ! !!
!! !
!!
!
! ! ! ! ! !
! !!
! !
! !! !! !!
!
!!
!
!
!
!! !
!!
!
! !!!!!
!
!
!! !!! !!
!
! !
! !
!!
!
! !
!!!!
! ! !
!!
!!
!
! ! !
!
! !
!!
! !! ! !
!!!
! !!
!! ! !!
! ! ! ! ! ! !
! ! !!!! !
!
!
! !!
!
! !!! ! ! !
!!!!
!
!
!!! !
!! ! ! !!
!
!!
!
!
!
!!
!!
!
!
!! !
!
!!!
!!
!
!!
!
!!
!
!! ! ! !
!
!!
!!
!
!! ! !
!
!!
!
! !!!!!
!! ! !
!
!
!
! !
! ! !
! !
! !! !
!! !
! ! ! !
! !!!
!!!!
!!
!! !
!!
! !!
!! !!!!!!
!
!
!!
! !!
!
!! !
!
!!
!
!
!!!! !
!!
!
!!!
!
!
!!
!!
!!
! !
!!! !!
!!
!
! ! !
!
!
! ! ! ! !!! !!
! !! !! !!
!!!
!
!!
!
!!!
!!
!
!!! !
!
!!
!
!!
!!
!
!
!!
!
! !
!! !! !!
!!
!
! !
! !
!
! !
!
!! ! !! !! !
! ! ! ! !!!!
!
!!
!!
!!
!
!! ! !
!
! ! !
!! ! !
!
!!!
!!
!!!!
! ! !!!
!!! ! !!
!!!
!
!
!! ! !
!
!!
!!!!!
!
! !! !! ! !! ! ! !
!!
! !!
!
!!
!
!!
!!
! !!
!! !! ! !! !
!
! !! !!
!! !
!!!!
!
! !
! ! !!!
!!! ! !!! !
!!!!!!
!
!
!! ! !!
!
!
!!
!
! !! !!
!!!!!
!!!
!!
!
!!!
! !! !
!! ! !
!! ! !!
!
!!
!
!
!!
!
!!
!!
!
!
!!
!
!
!!!
!
!!
!!!!
!! !!!! !!! ! !! !
!! ! !!
!
! ! ! !
!!
!!!
!
!
!!
! ! !
! !
!!! !!!
!
!
!!!
!
! !
!
!! !!
!
!!
!!
!!
!!
!!
!! ! !
!
!!
! !
! !!
!!!
!
!!
!!!!! !
!
!
!!!
!
!!!
!!!
!
! ! !
!
!!! ! !! ! !
! !! ! ! ! ! ! ! !! ! !! !! !! !
!
!!
!!
!
!
!!!
!
!
!! !
!!!
!!
! !
! ! !! ! ! ! ! !! !! !! !!
!! !! !
!! !!
!! !!
!! !
!!!!!!!
! ! !
! !
! !
!!!
!!
!
!
!!
!
!!!
!
! !! !
!
!
!!
!
! !!
!!
!! !!! ! !
! ! ! !
!
! !
!
!!
!!
!
!!
!
!!
!!
!!!
! ! !!!
!!!! !! ! !
! !!! ! !!
!!
! !
! !!
!!!
!
!
!!
!!
!!!
2000
!
!!
! ! ! ! !! !! !!
!! !
! ! ! !!!!!
!
!!
!! !
!
!!
!
!!
!!
! !
!
!! !
! !! !! !
!
!!! !
! !! !! !
! !
! !!!!
!!
!
! ! !
!!
!
!!!!
!!
!
! !
!!
!!!!
!
!
!! !!!
!
!!
!
!!
!
!!
!
!!
!
!!
! !!
!! !! !! ! ! !!!
!!
! ! !! !!! ! ! !
!! ! !!
!!!
!!!!! !! ! !! ! !
! !!!! ! !
!!
!! ! !!
!! ! ! !
!!
!
!
!!! !!!
!!!
!!!
!
!
!!
!!!!! ! !!
!! !
!
! !
!!!
!
!!
!
!
! ! !!!
!!
!
!
!!
!!
!!!
!! !
!!!
!!!
!! !
!! !
! !
! ! !
!
!!
!!
!
!! ! !
!!
!
!!
!!! !
!! !! !!
!! ! !
!
! !
!!!
!! !
! !!!
! !!
!!
!!!!
!!!
! ! ! !! ! !! !
! !
!! !!!! !
! !
!!
!!!
!
!
!!!!
!
!!
!
!!
!
!!
! !!!!
! !! ! ! !
!!
!
! !!! ! !!
!! ! !
!!!!
!
!!!
!
!!
!! !!
!
!!
!!
!!
!!
!! !
!!! ! !! !
!!!!!
! !!
!!
!! !! ! !! !!! ! ! !
!
!!
!!
!
! ! !
!
!!
!!
!
!! !
!!
!! !!!!
!!
! !!!
!!
!
!
!
!
! !! !!!!
! !!! !
! !
!!!!
!
!!! ! ! !
! !!
!! !!
!
!!
!!!!!
!
!
!!
!! !!
!! ! !!!
!!
!!! ! !
!
!!
!
!
!!
!
!!!!
!
!! !! ! !
!
!!
!
!!
!
!
!!
! ! !
!
!!
!!!!!! !
! ! ! ! ! !
!!! ! !!!! ! ! ! !
!
! !
!
!!
!!!! !
!!!
!!!
!!
!!
!
!
!!
!!
!!
!
!!
!
!
!!
!!
!
!!!!
!!
!!
!
!!
!
!!!
!!
!!
!
! !
!
!
!!!!
!
!!!!!! !
!!!
!
!
!!
!
!!
!
!! !!!
! !
!
!!! !! !
!! !
!
!!! !!! !!
! !
!! !!!
!
!!
!
!
!! !!
! !
!!
! !
!!
!! !
!
!
!!
! ! ! ! !!!!
!
!!
!!
!
!!
!! !
!
!!
!
!!
! !!! !
!
! !
! ! !!
!!
!!
!!
!!!
!!!!!!!!!
!! !
!!!
!
!!!
!
!
!!
! ! !!! !! ! !
!
! !
!!
!
!
!!
!!!!
!!
!
!
!
!! ! !
!
!!
!! ! ! !
! ! ! ! ! !! ! ! !!!! !! ! ! !
!!
!
!!
!
! !
!
!!
!
!!
!!
!
!! !!
!
! ! !!!!!
!! !
!! !! !!
!
!!
! ! !
!! ! !!
! !
! ! !
!!
!! !!
!!!!
!
!
!
! !!
!
! ! !
!! !
!! !!! !!
! !!
!
!!
!
!!
! !!
!!
!!
!! !!
!! ! ! ! !! !
!!
!
!
! ! !! !
! !!! !! ! !
!!!!
!
!!!!
!!!
!!
!
!! ! !!!
!! ! ! !!
!!
! ! !
!!!! !
! !! !
! !
! ! ! ! !
!!! !!! !! !
!
!!
!
! ! !
!
!! !
!! !!
!!! !!
!
! ! !!
!
!!
!!
!
!!!! !! !!!!
!
!
!!
! !!
!!
! !!
!
!!!
!!
!
!
!
!!
!
!
!!!
!
!!! ! ! !
! !
!
!
!!
! ! ! ! ! ! !! !! ! !! ! ! !!
!!!
!
!! !!
!!
!!
!!
!
!
! !
!!
!! !! !
! ! !!
!
!!
! ! !!
!
!! ! !!!!
!! !
!
!
! ! ! ! !
! ! ! !!!! ! !
!!!!! !!
!
!!
!
!!
!
!!!
!!
! ! !!
!
!
!!
!
!
!!
!
!!
!!
!
!!
!
!!! !
!!
!
! !!
!!! !
!!!
!! ! !! !
! !! ! !
! !! !
! !! !
!!
!
!
!!!
!! !
!
! !
!
!!
! ! !
! ! !
!!!
!
!
!!
!
!!!
!!
! ! ! !
!
!!
!!
!!!!!!
!!!
! !
! ! !
! !
! !!
!!!!
!
! !! !
!!!!! ! !! !! ! !
!!!
!!
!
! !!
!
!!
!
!
! !!! ! ! ! !!
!
!!!
!
!
!!!
!!
!!
!
! !
!
!!
!
!!!
!!
!
!!
! !!
! ! !
!
!
! !!
!! !!!!!!
!
!! !! ! !
!!!!
! !!
!!
!
!!
! !
!! !
!
!! !
! ! !!
!!!
!
!!
!
! ! !
!!
!
!! !
!
!!!
!
!!
!!!
! !
!
! !
! !! !
! !
!!! !
! !!
!! ! !
! ! !
! !
! !
!
!!
!! !
!
!!
!!
!
!!
!
! !
!
!
!!
! !!
!!!
!! !
!
!!
!
!
!!!!
!!
!! !
!
!!
! !
! !
!!
! !
!
!!
!
!
!!
!
! !! !!
!!!
!!
!
!!
!
!! ! !
! !! !
!!
!
!
! !!
! !
! ! !!!
!!
!
!!!
!!!
!!
!!
!
! ! ! !
!
!
!
!!
! !
!!
! !!
!
! !
! !!!
!
!!!
!
!!
!
!
!!
!
!
!
!! !
! !
!
! !! !! ! !
!!! !!!
!! ! !! ! !
!!!
!!
!
!!!
! !
!
!
!
!!
!!
!
! !!! !! !
!!!!
!
!!!
!
! !!
!! !!
!
!
!!!
!
!
!
!! !! !! ! !!
!!
!
!!
!
!
!!
!
!! !!
!!
!!!
!
!
!
!!
!
! !
!
!
!
!!!
! ! !
!
!! ! ! !
!
!
!
!
!
!
!
!
!!
!
!
!
!
!
!!
!
!
!!
!
!!
!!
!!!!
!!!
!! !! !
!!
! !
!
!
!
! !!
!
!!
!
!
!!!
!!
!!
!!
!!
! !
!
!
!!
! !
!!
! !! ! !
!
!
! ! ! !!
!!
!!!
!!!
!! !
! !
! !
!
!
!
!! ! ! !! !! !!
!
! ! ! ! !!
!! !!
!
! !
!!! !
!!
!!! ! !!! !! !!! ! !
!!
!!
!!
!
!
!!
! !
!!
!! !!
! !
!
!
!!
!
!
!
!!
!
!! !
! !! !!
!
!
!!
!
! !
!!
!
!
!
!!
!
!
!!
!
! !!
!!
!
!!
!!
!! !
!!
! ! !
!!!
!!
!
!
!
!! !! !
!!
!
!!! ! !
! !
!! ! !
! ! !
! ! ! !!!
!
!!
! !
! !
! !
!
!
!!!
! !!
!
!!
!
!
! !! ! !
!
!
!
!!
!
!
!
!
!!
!
! !! !
! !!
! ! !
!! !
!! ! ! !! ! ! !
!
!!
!!
!! !
! !!
! !
!
!!
! !
!
!!
! ! !
!!
! ! ! !
!
!
!
!
!!
!
!
!!
!
!
! !
!!
!
!
!
!! !
! !
!
!!
! ! !! !!
!!!
!!!
!!
!
!!
!!!
!
!!
!! ! !
!! ! ! ! !
!!!
!!
!
!! !
!
!
!! ! !! !
!!
! !
!
!! !! ! ! !! !!
!
!!!!!
!
!!!
!
!!
! ! !
!
!
!!
! ! !
!
!
!!
! !!
! !! ! !
!!
!
!
!!
!
!
!
!!
!
!!
!
!!!
! ! !
!!
! !!
! !
!
!!
! !!
!
!
!
!!!
!
! ! ! !
!!
!
!
!!! !
!! !! !!
! !
!
!!
!!
!
!!
!!
!
!
!! ! ! !
!!
! !! !!!
!! ! !
!!
!
!!
!!!!
!
!!
!
!!
!! !
!!
! !! !!
! !
!
!!
! !!
!!
!
!! ! !
! ! !
! !
!
!!
! !!
! ! !
!!
!!
!
!
!!
!
!
!
!!
!
!
! !!
!
!!
!! !
!!
! ! !
!
!
!!
!
!!
!
!!
!
!!
!!
!
!!
!
!! ! !!
!
! !
!
!!
!
! !!!
!!
!!
!!!
!!
!!!
! !
! !
!
!! !!
! !!!
! !!
!!!
!!
!
!!
!!! !! ! ! ! ! ! ! !!! !!
! !!
!
!
!
!
!!
! ! !
!!
!
!
!
!!!
! !! !! ! !
!!
!
!
!!
!
!
!
!
!
!!
!
!
!!
!
!!!! !
!
!
! ! !
! !
!!
! !! !
!!
! ! !!
!
!
! ! ! !
!!
!
!!
!
!!
!
!!!! !!
!!
! ! !!!
! !
!! ! ! !! ! !!
!
!!
! !!
! !
!
!!
! !! !!
! ! !
!!!
!!
!
!
!!
!
!
!
!
!
!!
! !
! !
!
!
!!
! !
!!
!
!
!!!!!!
!
!
!
! !
!
!
! !
! !
! !!
!
!!
!
!
!
!
!
!!
!
!
!
!! !!! ! ! !!
!
!!
! ! !
!
! !!
!
!
!
!!
! ! !!
!!!
!!
!!
!
!
!
!!!!! !
!
!
!
!!
! ! !!
!
!
!
!!
! ! !
!
!
!!
!
!!!
!!
!! !!
!
!! ! !
!! !!!!
!
!!
! !! !
!! !! !! !!
!!
!!
!
!!!
!! !! !
!
!!
! ! !
!
!! ! !! !
!!
!
!
!
!
! !!
!
!
! !! !!
!
!
!
!!
!!!
!!
!
!
!!
!!
!
!
!
!!
!
!
!
!
!
!
!
!! !
!!
!
!!
! !! !
!!
!
!
! !
!!
!! ! !! !!!
!
!
!!
!
!
!
!!
!!
!!!
! !
! ! ! !
! !!
! ! !
!
!! ! !!
! !! !
!
!!
!
!!!
! ! !
!
!
!
!
!
! !
!
!! !!
!
!
!
!
!
!
!!
! !! !
!
!
!
!
!
!
!
!
!
!
!
!
!!
!
!
!
!! !
! !! !
!! !!
! ! ! !! !!
! ! !!
!
!!
!!
!!!!
!!
!
!
!
!!
! !! !
!!
!
!
! ! !
!!
!!
!
!
!
!!
!
!
!
!
!!
! !!
!! ! !! ! ! ! !!!
!
!!!
! !
!!!
!! !!
!
! !
!
!!!
!
! !
!! !! !
!
!
!
!
!! !
! !
!
!!
! !
!!!
! !
!
!!
! ! !
! !
!
! !!
!
!
!
!
!
!
!
!
!
!
!
!
!!
!
!
!
!!
! !
!! !! ! !! ! !
!! !!! !! !
!
!!
!!!
!
!! ! !! !
!!!
! !
! !
!
!!
!
! !!!!!!!
!
!
!
!
!
!
!
!
!
!
!
!!!
! !
! !!
!!
!
!!
! !
!
!! !!
!! ! !
!! ! !! !
!! ! !!!
!
!!
! !! !!
!
!
!
!!!
!
!
!
!
!
!!
! !
!!
!
!
!
! !
!
!!
!
! ! !
! !!
!
!
!!
!
!
!
!
!
!
!
!
!
!
!
!
!
! ! !! ! !!! !
!
! !! ! !! !!! ! !! ! !
! ! !
!
!! ! ! ! !
! !!
! !! ! ! !! ! !
!!
! ! !! !! !! ! !
!! ! ! ! !! !
! !
! !! ! !
!!! !
!
! ! ! !
!!!
! !
!
!
!!
! !
!
!!
! !
!! !
! ! ! !
!
!
!!
!
!
!
!!! !
!! !
!! !
!
!
!!
! !
!
!!
! !
!!
! ! ! ! !
! !
! !
!!
!
!
!!
!
!
!!
!
!! !!!
! !
!
!! !
!!
! ! !
!
!! !! !
! ! !!
!
!!
!
!
!
!
!!!
!
!
!
! !
!!
!
! !! !!
! !!
! !! !
!! ! !
!!!
!
!
!
!!
!! !!
! !
!!
! ! ! ! !! ! ! !! !! ! !
! !
! !
!
!
!
!
!
!
! !! !
!
!!!!!
!!
! ! ! !!! !!!
!!!
!
!
!
!
!
!
!
!
!
!
!
!!!
!
!
! !
! !
!! !
! !!!!! !!! !!
!
!!
!
! ! !
!!!!!
!!
!!
!!! ! !! !!!
!
!
!!
!
!
!
!!!
!!
!!! !
!!
!!
!
!
! !
!
!! !!
! !
!! ! !
!! !
!!
!!! ! !
! !
!! ! !!!
!
!
!!
!
!
!!
! !
!
!
!
!
!
!!!
!
! !!
!! !
!
!!
! !! !
!! !
!! !! ! ! !!
!!!
!
!!
!
!
!! !! ! !
!!
!
!!
!
! !!
! !!!
! ! !!!
! !
!! !! !! !! !
!!! !
!!
!
!
!! ! !!
!
! !
!!
!
! !!!
! !! ! !! !!
! !!!
!
!
!
!
!!
!
!! !!
!! !
!
! ! !!!
! !!!
!!!
! !
! !
! !
!
!!
!
!
!!
!
!
!!
!! !!!
!
!
!!
! ! !
!
!! !!
! ! !
!!
!
!!
! !!!
!
!
! !
!
! !
!!
!!
!
!
!!
!
! !! !
!
!
!
!
!
! ! !! !! !!
!!
!
!!
!
!
!
!
!!
!
!
!!!!!
! ! ! !! !!
!
!!
! !
!
!
!!
! ! !!! ! !!
!
! !
!
!!!
!
! !! !!
!!
!
!!
! !
!
!
!!
! !
!!
! ! ! ! !!! !
! !
!!
!
!
!!
!
!!
!
!
!
!
!
!! !
! !!!!
!
! !
!! !
!!
!
!
!!
! !!
!!
!!
!
!!
!
!
! !!
!!!!! ! !! !
!
! !
!
!
!!
!
!
!
!!
!
!
!
!
!
!
! !
! !
!
!!
!
!
! !
!!
!
!!
!!! !
! ! ! !!! !
!!!
!
!!!! !
!
! !
!!
!
!
!!
!!
!
! ! !
!
!
!
!
!
!
!
!
!
!
!
!
!! ! !! !!
!!
!
!
!
!
!
!
!
!
!
!
!
!
!!
!
!
!!!
!!!
!!
! !!! !
!
!
!
!
! !
!
!!
!!
! !
!
!!
!!
!
!
!!!
!
!!
!
!
!
!!
!
!!
!!
! ! !
!
! !
!!
! !!!
!!
!
!
!!
!
!! !
!! !
!
!! ! !! ! !
!! !! ! !
! !
! !
! !! !! !
!
!!
! !
!
!
! ! ! ! !
!! !
!
!
! !
!
!
! !
!
!
!!
!
!!! ! !!
!! !
! !
!!
!
!
!!!
!
!
!
!!!
! !
!! !
!!
!
!
!
!
!!
!
!
!
!!! !! !
! ! ! !!!!! ! !
!!
!!
!! !!
!!
!
!
!
! !
!
!!
! ! ! !
!
!!
! !
!!
!
!
!!
!!
!
!
!
! ! !!!!
!
!
1000
!
! !
!!
! !
!! !
!
!!! !! !
! !
!! !
!!
!!!
!!
!!
! !!
!
! !! ! !
!! ! !!!!
!
!
!
!!
! !
!
!!
! !
! ! !
!!
! ! !! ! !!
!
!
!
!
!
!!!!!
!!
!
!
!
!!
! !!
! !!
!! !
! ! !
! !
!!
! !! !
!! !
! ! ! !!!!!
!!
! !!
!
!
!
!!
! ! !
!
!!
! !
!
!!!
! !! ! !! !
!
!
!
!
!
!
!
!
!!
!
!!
!
!
!
!!!!
! !
! !
!! !! !!! ! !!
!!
! !
!
! !
!
! !!
! !
!
!!
! !
!
! ! !! !!
!
!
!!
!
!
!
!
!
!
!
!
!
!
!
!!
!
!
! !
!
!!
! ! !
!!
! ! ! !
!
!!
! !
!!!
!
!! !!!