Professional Documents
Culture Documents
Conduction
Kengo Nakajima
Information Technology Center
Programming for Parallel Computing (616-2057)
Seminar on Advanced Computing (616-4009)
FEM1D 2
• Program
FEM1D 3
Keywords
• 1D Steady State Heat Conduction Problems
• Galerkin Method
• Linear Element
• Preconditioned Conjugate Gradient Method
FEM1D 4
heat generation/volume Q
T
Q 0
x x
heat generation/volume Q
T
Q 0
x x
Analytical Solution
heat generation/volume Q T
Q 0
x x
T 0@ x 0 T
0 @ x xmax
x
T Q
T Q x C1 C1 Q xmax , T 0 @ x xmax
1
T Q x 2 C1 x C2 C2 0, T 0 @ x 0
2
x
1 2 Q xmax
T Qx
2
FEM1D 7
– Ti Temperature at i
T Ti
– Tj Temperature at j
– Temperature T on each
Tj
element is linear
function of x (Piecewise
Linear): L
x
T 1 2 x Xi Xj
FEM1D 8
– Ti Temperature at i
T Ti
– Tj Temperature at j
– Temperature T on each
Tj
element is linear
function of x (Piecewise
Linear): L
x
T 1 2 x Xi Xj
FEM1D 9
Piecewise Linear
1 2 3 4 5 Global Node ID
1 2 3 4 Element ID
1 2 1 2 1 2 1 2
1 2 3 4
Local Node ID
for each elem.
Gradient of temperature is constant in each
element (might be discontinuous at each “node”)
FEM1D 10
1.0 Ni Nj
x
Xi Xj
FEM1D 13
obtained by considering
heat generation term Q : x=0 (xmin) x= xmax
d N T d N V
dV
V
dx dx S S
T T
q N dS QN dV 0
S V
T T
q N dS Q N dV 0
V
S V
S S
• Derivatives of Unknowns d N T d N
dV
(Neumann)
dx dx
V
– Naturally satisfied in weak form T T
q N dS Q N dV 0
– Secondary B.C.(第二種境界 S V
条件) dT
where q
– Natural B.C(自然境界条件) dx
FEM1D 18
x x
N i 1 , N j
L L
L
T 1 x / L Q AL 1 Heat Generation
V Q
N dV Q A
0 x / L dx 2 1 (Volume)
1 : 1
A: Sectional Area
L: Length
FEM1D 21
L
T 1 x / L Q AL 1 Heat Generation
V Q N dV Q A0 x / L dx 2 1 (Volume)
Global Equations
• Accumulate Element Equations:
K k , F f
: global vector of
This is the final linear equations
(global equations) to be solved.
FEM1D 23
ECCS2012 System
Creating Directory
>$ cd Documents
>$ mkdir 2014summer your favorite name
>$ cd 2014summer
>$ cd <$E-TOP>
>$ cp /home03/skengon/Documents/class_eps/F/1d.tar .
>$ cp /home03/skengon/Documents/class_eps/C/1d.tar .
>$ tar xvf 1d.tar
>$ cd 1d
FEM1D 24
Compile & GO !
>$ cd <$E-TOP>/1d
>$ cc –O 1d.c (or g95 –O 1d.f)
>$ ./a.out
4 NE (Number of Elements)
1.0 1.0 1.0 1.0 x (Length of Each Elem.: L) ,Q, A,
100 Number of MAX. Iterations for CG Solver
1.e-8 Convergence Criteria for CG Solver
x=1
Element ID
1 2 3 4 5
Node ID (Global)
1 2 3 4
x=0 x=1 x=2 x=3 x=4
FEM1D 25
Results
>$ ./a.out
### TEMPERATURE
1 0.000000E+00 0.000000E+00
2 3.500000E+00 3.500000E+00
3 6.000000E+00 6.000000E+00
4 7.500000E+00 7.500000E+00
5 8.000000E+00 8.000000E+00
Computational Analytical
x=1
Element ID
1 2 3 4 5
Node ID (Global)
1 2 3 4
x=0 x=1 x=2 x=3 x=4
FEM1D 26
• As for Element-4:
( 4) A 1 1 ( 4) Q AL 1
k f
L 1 1 2 1
FEM1D 27
4
K k (e) + + +
e 1
4
F f (e) + + +
e 1
FEM1D 28
+1 -1 d 2T T 2Ti Ti 1
-1 +2 -1 A 2 dV i 1 2 dV
V
dx V L
-1 +2 -1
-1 +2 -1 L T 2Ti Ti 1 A
-1 +1
i 1 2 AL Ti 1 2Ti Ti 1
L L
Something familiar …
FEM: Coefficient Matrices are generally sparse
(many ZERO’s)
FEM1D 29
• 2nd-Order Diff. at i
d d i1 i i i1
d 2 dx i 1/ 2 dx i1/ 2
2 x x i 1 2i i 1
dx i x x x2
FEM1D 30
Element-by-Element Operation
very flexible if each element has different material
property, size, etc.
(e) ( e ) A( e ) 1 1
k 1 1
L( e )
+1 -1
4
(e) -1 +1 (1) A(1) +1 -1 ( 2) A( 2)
+ -1 +1
(1)
K k
e 1 L L( 2 )
+1 -1
(3) A(3) ( 4) A( 4)
( 3)
+
-1 +1 L +1 -1 L( 4 )
-1 +1
FEM1D 31
Element/Global Operations
1 2 3 4
1 2 3 4 5 Global Node ID
Local Node ID
e e e e
1 2 1 2 1 2 1 2
T T T T
d N d N d N d N d N d N d N d N
E dV E dV E dV E dV
V dx V V V
dx dx dx dx dx dx dx
T T T T T T T T
N dS X N dV 0 N dS X N dV 0 N dS X N dV 0 N dS X N dV 0
S V S V S V S V
1 2 3 4
1 2 3 4 5
[ K ]{} {F }
D1 AU11 1 B1
Mapping Information needed,
AL
21 D2 AU 21 B
2 2
from element-matrix
AL31 D3 AU 31 3 B3 to global-matrix.
AL41 D4 AU 41 4 B4
AL51 D5 5 B5
FEM1D 32
Around the FEM in 3 minutes
Accumulation to
Global/overall Matrix
[K ]{} {F}
13 14 15 16 D X X X 1 F1
X D X X
X X F
7 8 9 2 2
X D X X X X 3 F3
9 10 11 12 X D X X 4 F4
X X D X X X 5 F5
4 5 6
X X X X D X X X X 6 F6
5 6 7 8 X X X X D X X X X F
7 7
X X X D X X 8 F8
1 2 3 F
X X D X X X
9 9
1 2 3 4 X X X X D X X X X 10 F10
X X X X D X X X X 11 F11
X X X D X X 12 F12
X X D X 13 F13
X X X X D X 14 F
14
X X X X D X 15 F15
X X X D16 F16
FEM1D 33
• Program
FEM1D 34
Direct Method
直接法
Gaussian Elimination/LU Factorization.
compute A-1 directly.
Good
Robust for wide range of applications.
Good for both dense and sparse matrices
Bad
More expensive than iterative methods (memory, CPU)
not scalable
35
Solver-Iterative 36
Iterative Method
反復法
• Stationary Method
– Only x (solution vector) changes during iterations.
– SOR, Gauss-Seidel, Jacobi
Ax b
– Generally slow, impractical
x ( k 1) Mx ( k ) Nb
• Non-Stationary Method
– With restriction/optimization conditions
– Krylov-Subspace
– CG: Conjugate Gradient
– BiCGSTAB: Bi-Conjugate Gradient Stabilized
37
– GMRES: Generalized Minimal Residual
FEM1D
Bad
Convergence strongly depends on problems, boundary
conditions (condition number etc.)
Preconditioning is required : Key Technology for
Parallel FEM
38
Solver-Iterative
Non-Stationary/Krylov Subspace
Method (1/2)
非定常法・クリロフ部分空間法
Ax b x b I A x
Compute x0, x1, x2, ..., xk by the following iterative procedures:
x k b I A x k 1
b Ax k 1 x k 1
rk 1 x k 1 where rk b Ax k : residual
k 1
x k x 0 ri
i 0
rk b Ax k b Ark 1 x k 1
39
b Ax k 1 Ark 1 rk 1 Ark 1 I A rk 1
Solver-Iterative
Non-Stationary/Krylov Subspace
Method (2/2)
非定常法・クリロフ部分空間法
k 1 k 2 k 1
i
x k x 0 ri x 0 r0 I A ri x 0 r0 I A r0
i 0 i 0 i 1
k 1
k 1 i i
z k r0 I A r0 I I A r0
i 1 i 1
1
f x x, Ax x, b
2
1 Arbitrary vector h
f x h f x h, Ax b h, Ah
2
1
f x h x h, A( x h) x h, b
2
1 1
x h, Ax x h, Ah x, b h, b
2 2
1 1 1 1
x, Ax h, Ax x, Ah h, Ah x, b h, b
2 2 2 2
1 1
x, Ax x, b h, Ax h, b h, Ah
2 2
1
f x h, Ax b h, Ah
2
FEM1D 49
(k ) (k ) 1 2 (k )
f x k p k p , Ap ( k ) k p ( k ) , b Ax ( k ) f x ( k )
2
f x ( k ) k p ( k ) p ( k ) , b Ax ( k )
p(k ) , r (k )
0 k (k ) (k )
(k ) (k )
(1)
k p , Ap
p , Ap
r ( k ) b Ax ( k ) residual vector
FEM1D 50
Properties of CG Algorithm
Following “conjugate(共役)” relationship is obtained for
arbitrary (i,j):
(i )
p , Ap ( j ) 0 i j
Proof (1/3) (i )
r , r ( j ) 0 i j
Mathematical Induction (i )
p , Ap ( j ) 0 i j
数学的帰納法
(k )
, r (k )
p
(1) k (k )
p , Ap ( k )
(2) r ( k 1) r ( k ) k Ap ( k )
(4) r ( k 1) , Ap ( k )
k
p ( k ) , Ap ( k )
FEM1D 55
Proof (2/3) (i )
r , r ( j ) 0 i j
Mathematical Induction (i ) ( j)
(*)
p , Ap 0 i j
数学的帰納法
(*) is satisfied for i k , j k where i j
if i < k r ( k 1) , r ( i ) r ( i ) , r ( k 1) (2)
r (i ) , r ( k ) k Ap ( k )
(*) (i ) (k ) (4) (i ) ( i 1) (k )
k r , Ap p p , Ap k i 1
(i ) (k ) (*) ( i 1) (k )
k p , Ap p , Ap 0 k i 1
if i = k ( k 1) (k ) (k ) (k ) (k )
r , r (k ) (2) r , r r , Ap k
(3) (k ) (k ) (k ) ( k 1) (k )
(k ) (k ) r , r p p , Ap k 1 k
,r p
(1) k ( k ) (*) (k ) (k ) (1) (k ) (k ) (k ) (k ) (k ) (k )
p , Ap ( k )
r , r p , Ap r , r p , r
k
( k 1) (k ) (k )
(2) r r k Ap (3) (k ) (k ) ( k 1) (k ) (k )
r , r p r ,r k 1
( k 1)
(3) p r ( k 1) k p ( k ) (2)
( k 1) (k ) ( k 1) ( k 1) ( k 1)
pk 1 , r p ,r Ap k 1 k 1
r ( k 1) , Ap ( k )
(4) k ( k 1) (1)
( k 1) ( k 1) ( k 1)
p ( k ) , Ap ( k )
p
k 1 ,r p , Ap 0 k 1
FEM1D 56
Proof (3/3) (i )
r , r ( j ) 0 i j
Mathematical Induction (i ) ( j)
(*)
p , Ap 0 i j
数学的帰納法
(k )
, r (k )
p
(1) k ( k )
(*) is satisfied for i k , j k where i j p , Ap ( k )
(3) (2) r ( k 1) r ( k ) k Ap ( k )
( k 1)
if i < k p
, Ap (i ) r ( k 1) k p ( k ) , Ap (i ) (3) p
( k 1)
r ( k 1) k p ( k )
(*) ( k 1)
r , Ap ( i ) r ( k 1) , Ap ( k )
(4) k
(2) 1 ( k 1) (i ) ( i 1)
p ( k ) , Ap ( k )
r ,r r 0
k
( k 1)
if i = k p (3)
, Ap ( k ) r ( k 1) , Ap ( k ) k p ( k ) , Ap ( k )
(4)
0
FEM1D 57
( k 1)
r , r (k ) 0
( k 1) (2) (k )
r , r (k ) r
, r ( k ) r ( k ) , k Ap ( k )
(3) (k ) (k ) ( k 1) (k )
r , r (k ) p p , k 1 k Ap
(*) (k ) (1)
(k ) (k ) (k ) (k )
r , r (k ) p , Ap r
k , r (k ) p , r (k ) 0
(k )
(k ) (k ) (k ) (k ) , r (k )
p
r ,r p ,r (1) k ( k )
p , Ap ( k )
(2) r ( k 1) r ( k ) k Ap ( k )
( k 1)
(3) p r ( k 1) k p ( k )
r ( k 1) , Ap ( k )
(4) k
p ( k ) , Ap ( k )
FEM1D 58
k,k
Usually, we use simpler definitions of k,k as follows:
(k ) (k ) (k )
p , b Ax p , r (k )
r (k ) , r (k )
k
(k ) (k ) (k ) (k )
(k )
p , Ap p , Ap p , Ap ( k )
(k ) (k ) (k ) (k )
p , r r , r
r ( k 1) , Ap ( k )
r ( k 1) , r ( k 1)
k (k ) (k )
p , Ap r (k ) , r (k )
( k 1) ( k 1)
( k 1) (k ) r , r ( k ) r ( k 1) , r ( k 1)
, Ap
r r
k k
FEM1D 59
Preconditioned CG Solver
Compute r(0)= b-[A]x(0) [M]= [M1][M2]
for i= 1, 2, …
solve [M]z(i-1)= r(i-1) [A’]x’=b’
i-1= r(i-1) z(i-1) [A’]=[M1]-1[A][M2]-1
if i=1 x’=[M2]x, b’=[M1]-1b
p(1)= z(0)
else p’=>[M2]p, r’=>[M1]-1r
i-1= i-1/i-2 x
p(i)= z(i-1) + i-1 p(i-1) (i)
p’ = r’(i-1) + ’i-1 p’(i-1)
endif
q(i)= [A]p(i) [M2]p(i)= [M1]-1r(i-1) + ’i-1 [M2]p(i-1)
i = i-1/p(i)q(i)
x(i)= x(i-1) + ip(i) p(i)= [M2]-1[M1]-1r(i-1) + ’i-1 p(i-1)
r(i)= r(i-1) - iq(i) p(i)= [M]-1r(i-1) + ’i-1 p(i-1)
check convergence |r|
end
’i-1= ([M]-1r(i-1),r(i-1))/
([M]-1r(i-2),r(i-2))
’i-1= ([M]-1r(i-1),r(i-1))/
( p(i-1),[A]p(i-1))
FEM1D 62
ILU(0), IC(0)
• Widely used Preconditioners for Sparse Matrices
– Incomplete LU Factorization(不完全LU分解)
– Incomplete Cholesky Factorization (for Symmetric
Matrices)(不完全コレスキー分解)
D1 0 ... 0 0
0 D 0 0
2
M ... ... ...
0 0 DN 1 0
0 0 ... 0 DN
• Program
FEM1D 65
{Y}= [A]{X} D X X X 1 F1
X D X X X X F
2 2
X D X X X X 3 F3
X D X X 4 F4
X X D X X X 5 F5
do i= 1, N
X X X X D X X X X
6 F6
X X X X D X X X X F
Y(i)= Diag(i)*X(i) 7 7
X X X D X X 8 F8
X X D X X X F
do k= Index(i-1)+1, Index(i) 9 9
X X X X D X X X X 10 F10
X X X X D X X X X 11 F11
Y(i)= Y(i) + Amat(k)*X(Item(k))
X X X D X X 12 F12
X X D X 13 F13
enddo X X X X D X F
14 14
X X X X D X 15 F15
enddo X X X D16 F16
FEM1D 68
CRS or CSR ?
for Compressed Row Storage
• In Japan and USA, “CRS” is very general for
abbreviation of “Compressed Row Storage”, but they
usually use “CSR” in Europe (especially in France).
• “CRS” in France
– Compagnie Républicaine de Sécurité
• Republic Security Company of France
• French scientists may feel
uncomfortable when we use “CRS” in
technical papers and/or presentations.
FEM1D 69
{Q}=[A]{P}
for(i=0;i<N;i++){
W[Q][i] = Diag[i] * W[P][i];
for(k=Index[i];k<Index[i+1];k++){
W[Q][i] += AMat[k]*W[P][Item[k]];
}
}
FEM1D 70
{Y}= [A]{X}
do j= 1, N
Y(j)= 0.d0
do i= 1, N
Y(j)= Y(j) + A(i,j)*X(i)
enddo
enddo
FEM1D 71
• Program
FEM1D 79
Variable/Arrays (1/2)
Name Type Size I/O Definition
NE I I # Element
N I O # Node
NPLU I O # Non-Zero Off-Diag. Components
IterMax I I MAX Iteration Number for CG
errno I O ERROR flag
R, Z, Q, P, I O Name of Vectors in CG
DD
dX R I Length of Each Element
Resid R O Residual for CG
Eps R I Convergence Criteria for CG
Area R I Sectional Area of Element
QV R I Heat Generation Rate/Volume/Time Q
COND R I Thermal Conductivity
FEM1D 82
Variable/Arrays (2/2)
Name Type Size I/O Definition
X R N O Location of Each Node
PHI R N O Temperature of Each Node
Rhs R N O RHS Vector
Diag R N O Diagonal Components
W R [4][N] O Work Array for CG
Amat R NPLU O Off-Diagonal Components (Value)
Index I N+1 O Number of Non-Zero Off-Diagonals at
Each ROW
Item I NPLU O Off-Diagonal Components
(Corresponding Column ID)
Icelnod I 2*NE O Node ID for Each Element
Kmat R [2][2] O Element Matrix [k]
Emat R [2][2] O Element Matrix
FEM1D 83
Element/Global Operations
1 2 3 4
1 2 3 4 5 Global Node ID
Local Node ID
e e e e
1 2 1 2 1 2 1 2
T T T T
d N d N d N d N d N d N d N d N
E dV E dV E dV E dV
V dx V V V
dx dx dx dx dx dx dx
T T T T T T T T
N dS X N dV 0 N dS X N dV 0 N dS X N dV 0 N dS X N dV 0
S V S V S V S V
1 2 3 4
1 2 3 4 5
[ K ]{} {F }
D1 AU11 1 B1 Number of non-zero off-
AL D2 AU 21 B
21 2 2 diag. components is 2 for
AL31 D3 AU 31 3 B3
each node. This number
AL41 D4 AU 41 4 B4
is 1 at boundary nodes).
AL51 D5 5 B5
FEM1D 86
1 2 3 4
1 2 3 4 5
0 1 2 3
0 1 2 3 4
e e e e
0 1 0 1 0 1 0 1
FEM1D 87
General Elements: k1
“in2” as a off-diag. component of “in1”
/*
// +-----------------+
// | MATRIX assemble |
// +-----------------+
*/
for(icel=0;icel<NE;icel++){
in1= Icelnod[2*icel];
in2= Icelnod[2*icel+1];
X1 = X[in1];
X2 = X[in2]; icel
DL = fabs(X2-X1); in1 in2
Ck= Area*COND/DL;
Emat[0][0]= Ck*Kmat[0][0];
Emat[0][1]= Ck*Kmat[0][1];
Emat[1][0]= Ck*Kmat[1][0];
Emat[1][1]= Ck*Kmat[1][1];
Diag[in1]= Diag[in1] + Emat[0][0];
Non-zero Off-Diag. at i-th row:
Diag[in2]= Diag[in2] + Emat[1][1]; Index[i], Index[i]+1
if (icel==0){k1=Index[in1];
}else {k1=Index[in1]+1;} i-1 in1 in2
k2=Index[in2];
Index[i] Index[in1]+1
AMat[k1]= AMat[k1] + Emat[0][1];
AMat[k2]= AMat[k2] + Emat[1][0];
QN= 0.5*QV*Area*dX; (e) A 1 1 k1
Rhs[in1]= Rhs[in1] + QN; Emat k
Rhs[in2]= Rhs[in2] + QN; L 1 1
}
FEM1D 98
General Elements: k2
“in1” as a off-diag. component of “in2”
/*
// +-----------------+
// | MATRIX assemble |
// +-----------------+
*/
for(icel=0;icel<NE;icel++){
in1= Icelnod[2*icel];
in2= Icelnod[2*icel+1];
X1 = X[in1];
X2 = X[in2]; icel
DL = fabs(X2-X1); in1 in2
Ck= Area*COND/DL;
Emat[0][0]= Ck*Kmat[0][0];
Emat[0][1]= Ck*Kmat[0][1];
Emat[1][0]= Ck*Kmat[1][0];
Emat[1][1]= Ck*Kmat[1][1];
Diag[in1]= Diag[in1] + Emat[0][0];
Non-zero Off-Diag. at i-th row:
Diag[in2]= Diag[in2] + Emat[1][1]; Index[i], Index[i]+1
if (icel==0){k1=Index[in1];
}else {k1=Index[in1]+1;} in1 in2 i+1
k2=Index[in2];
Index[in2] Index[i]+1
AMat[k1]= AMat[k1] + Emat[0][1];
AMat[k2]= AMat[k2] + Emat[1][0];
QN= 0.5*QV*Area*dX; (e) A 1 1
Rhs[in1]= Rhs[in1] + QN; Emat k
Rhs[in2]= Rhs[in2] + QN; L 1 1
}
k2
FEM1D 99
0-th Element: k1
“in2” as a off-diag. component of “in1”
/*
// +-----------------+
// | MATRIX assemble |
// +-----------------+
*/
for(icel=0;icel<NE;icel++){
in1= Icelnod[2*icel];
in2= Icelnod[2*icel+1];
X1 = X[in1];
X2 = X[in2]; icel=0
DL = fabs(X2-X1); in1 in2
Ck= Area*COND/DL;
Emat[0][0]= Ck*Kmat[0][0];
Emat[0][1]= Ck*Kmat[0][1];
Emat[1][0]= Ck*Kmat[1][0];
Emat[1][1]= Ck*Kmat[1][1];
Diag[in1]= Diag[in1] + Emat[0][0]; Non-zero Off-Diag. at i-th row: Index[i]
Diag[in2]= Diag[in2] + Emat[1][1];
if (icel==0){k1=Index[in1];
}else {k1=Index[in1]+1;} in1 in2
k2=Index[in2];
Index[in1]
AMat[k1]= AMat[k1] + Emat[0][1];
AMat[k2]= AMat[k2] + Emat[1][0];
QN= 0.5*QV*Area*dX; (e) A 1 1 k1
Rhs[in1]= Rhs[in1] + QN; Emat k
Rhs[in2]= Rhs[in2] + QN; L 1 1
}
FEM1D 100
/* X=Xmin */
i=0;
jS= Index[i];
AMat[jS]= 0.0;
Diag[i ]= 1.0;
Rhs [i ]= 0.0;
for(k=0;k<NPLU;k++){
if(Item[k]==0){AMat[k]=0.0;
}}
FEM1D 102
heat generation/volume Q
T
Q 0
x x
for(k=0;k<NPLU;k++){
if(Item[k]==0){AMat[k]=0.0;
}}
FEM1D 105
for(k=0;k<NPLU;k++){
if(Item[k]==0){AMat[k]=0.0;
}}
FEM1D 106
for(k=0;k<NPLU;k++){
if(Item[k]==0){AMat[k]=0.0;
}}
if T1≠ 0
/*
// +---------------------+ Column components of boundary nodes
// | BOUNDARY conditions |
// +---------------------+ (Dirichlet B.C.) are moved to RHS and
*/ eliminated for keeping symmetrical feature
of the matrix.
for(j=1;i<N;i++){
for (k=Index[j];k<Index[j+1];k++){
if(Item[k]==0){
Rhs [j]= Rhs[j] – Amat[k]*PHImin;
AMat[k]= 0.0;
}}
FEM1D 108
if T1≠ 0
/*
// +---------------------+ Index[ j 1]1
// | BOUNDARY conditions |
// +---------------------+
Diag j j Amat k Item[ k ]
*/ k Index[ j ], k k s
for(j=1;i<N;i++){
for (k=Index[j];k<Index[j+1];k++){
if(Item[k]==0){
Rhs [j]= Rhs[j] – Amat[k]*PHImin;
AMat[k]= 0.0;
}} Column componentsof boundary nodes
(Dirichlet B.C.) are moved to RHS and
eliminated for keeping symmetrical feature
of the matrix.
FEM1D 109
T 0@ x 0 T
0 @ x xmax
x
T 0 dT
q N dS q A xL
q A , q Surface Flux
S 1 dx
Preconditioned CG Solver
Compute r(0)= b-[A]x(0)
D1 0 ... 0 0
for i= 1, 2, …
0 D 0 0
solve [M]z(i-1)= r(i-1) 2
i-1= r(i-1) z(i-1)
M ... ... ...
if i=1
p(1)= z(0) 0 0 DN 1 0
else 0 0 ... 0 DN
i-1= i-1/i-2
p(i)= z(i-1) + i-1 p(i-1)
endif
q(i)= [A]p(i)
i = i-1/p(i)q(i)
x(i)= x(i-1) + ip(i)
r(i)= r(i-1) - iq(i)
check convergence |r|
end
FEM1D 111
CG Solver (1/6)
/*
// +---------------+
// | CG iterations |
// +---------------+
*/
R = 0;
Reciprocal numbers (逆数)of diagonal
Z = 1; components are stored in W[DD][i].
Q = 1; Computational cost for division is
P = 2;
usually expensive.
DD= 3;
for(i=0;i<N;i++){
W[DD][i]= 1.0 / Diag[i];
}
FEM1D 113
CG Solver (1/6)
/*
// +---------------+ Compute r(0)= b-[A]x(0)
// | CG iterations | for i= 1, 2, …
// +---------------+ solve [M]z(i-1)= r(i-1)
*/
R = 0;
i-1= r(i-1) z(i-1)
Z = 1; if i=1
Q = 1; p(1)= z(0)
P = 2; else
DD= 3;
i-1= i-1/i-2
for(i=0;i<N;i++){ p(i)= z(i-1) + i-1 p(i-1)
W[DD][i]= 1.0 / Diag[i]; endif
}
q(i)= [A]p(i)
i = i-1/p(i)q(i)
W[0][i]= W[R][i] ⇒ {r} x(i)= x(i-1) + ip(i)
W[1][i]= W[Z][i] ⇒ {z} r(i)= r(i-1) - iq(i)
check convergence |r|
W[1][i]= W[Q][i] ⇒ {q} end
W[2][i]= W[P][i] ⇒ {p}
W[3][i]= W[DD][i] ⇒ 1/{D}
FEM1D 114
CG Solver (2/6)
/* Compute r(0)= b-[A]x(0)
//-- {r0}= {b} - [A]{xini} | for i= 1, 2, …
*/
for(i=0;i<N;i++){ solve [M]z(i-1)= r(i-1)
W[R][i] = Diag[i]*U[i]; i-1= r(i-1) z(i-1)
for(j=Index[i];j<Index[i+1];j++){ if i=1
W[R][i] += AMat[j]*U[Item[j]];
}
p(1)= z(0)
} else
i-1= i-1/i-2
BNorm2 = 0.0; p(i)= z(i-1) + i-1 p(i-1)
for(i=0;i<N;i++){
BNorm2 += Rhs[i] * Rhs[i]; endif
W[R][i] = Rhs[i] - W[R][i]; q(i)= [A]p(i)
} i = i-1/p(i)q(i)
x(i)= x(i-1) + ip(i)
BNRM2=|b|2 r(i)= r(i-1) - iq(i)
for convergence criteria check convergence |r|
of CG solvers end
FEM1D 115
CG Solver (3/6)
for(iter=1;iter<=IterMax;iter++){ Compute r(0)= b-[A]x(0)
for i= 1, 2, …
/*
//-- {z}= [Minv]{r} solve [M]z(i-1)= r(i-1)
*/ i-1= r(i-1) z(i-1)
for(i=0;i<N;i++){ if i=1
W[Z][i] = W[DD][i] * W[R][i];
}
p(1)= z(0)
else
/* i-1= i-1/i-2
//-- RHO= {r}{z} p(i)= z(i-1) + i-1 p(i-1)
*/
Rho= 0.0; endif
for(i=0;i<N;i++){ q(i)= [A]p(i)
Rho += W[R][i] * W[Z][i]; i = i-1/p(i)q(i)
}
x(i)= x(i-1) + ip(i)
r(i)= r(i-1) - iq(i)
check convergence |r|
end
FEM1D 116
CG Solver (4/6)
/* Compute r(0)= b-[A]x(0)
//-- {p} = {z} if ITER=1 for i= 1, 2, …
// BETA= RHO / RHO1 otherwise
*/ solve [M]z(i-1)= r(i-1)
if(iter == 1){ i-1= r(i-1) z(i-1)
for(i=0;i<N;i++){ if i=1
W[P][i] = W[Z][i];
}
p(1)= z(0)
}else{ else
Beta = Rho / Rho1; i-1= i-1/i-2
for(i=0;i<N;i++){ p(i)= z(i-1) + i-1 p(i-1)
W[P][i] = W[Z][i] + Beta*W[P][i];
} endif
} q(i)= [A]p(i)
i = i-1/p(i)q(i)
/*
//-- {q}= [A]{p}
x(i)= x(i-1) + ip(i)
*/ r(i)= r(i-1) - iq(i)
for(i=0;i<N;i++){ check convergence |r|
W[Q][i] = Diag[i] * W[P][i]; end
for(j=Index[i];j<Index[i+1];j++){
W[Q][i] += AMat[j]*W[P][Item[j]];
}
}
FEM1D 117
CG Solver (5/6)
/* Compute r(0)= b-[A]x(0)
//-- ALPHA= RHO / {p}{q} for i= 1, 2, …
*/
C1 = 0.0; solve [M]z(i-1)= r(i-1)
for(i=0;i<N;i++){ i-1= r(i-1) z(i-1)
C1 += W[P][i] * W[Q][i]; if i=1
}
p(1)= z(0)
Alpha = Rho / C1; else
i-1= i-1/i-2
/* p(i)= z(i-1) + i-1 p(i-1)
//-- {x}= {x} + ALPHA*{p}
// {r}= {r} - ALPHA*{q} endif
*/ q(i)= [A]p(i)
for(i=0;i<N;i++){ i = i-1/p(i)q(i)
U[i] += Alpha * W[P][i];
W[R][i] -= Alpha * W[Q][i];
x(i)= x(i-1) + ip(i)
} r(i)= r(i-1) - iq(i)
check convergence |r|
end
FEM1D 118
CG Solver (6/6)
DNorm2 = 0.0; Compute r(0)= b-[A]x(0)
for(i=0;i<N;i++){ for i= 1, 2, …
DNorm2 += W[R][i] * W[R][i];
} solve [M]z(i-1)= r(i-1)
Resid = sqrt(DNorm2/BNorm2); i-1= r(i-1) z(i-1)
if i=1
if((iter)%1000 == 0){
printf("%8d%s%16.6e¥n",iter, "
p(1)= z(0)
iters, RESID=", Resid); else
} i-1= i-1/i-2
if(Resid <= Eps){ierr = 0; break;} p(i)= z(i-1) + i-1 p(i-1)
Rho1 = Rho; i-2
} endif
q(i)= [A]p(i)
i = i-1/p(i)q(i)
DNorm2 r Ax b x(i)= x(i-1) + ip(i)
Resid Eps
BNorm2 b b r(i)= r(i-1) - iq(i)
check convergence |r|
Control Data input.dat end
4 NE (Number of Elements)
1.0 1.0 1.0 1.0 x (Length of Each Elem.: L) ,Q, A,
100 Number of MAX. Iterations for CG Solver
1.e-8 Convergence Criteria for CG Solver
FEM1D 119
NE=20, dX=5
### DISPLACEMENT
1 0.000000E+00 -0.000000E+00
2 4.259851E-03 4.260561E-03
3 8.719160E-03 8.720685E-03
4 1.339752E-02 1.339999E-02
……
17 1.145876E-01 1.146641E-01
18 1.295689E-01 1.296764E-01
19 1.473466E-01 1.475060E-01
20 1.692046E-01 1.694607E-01
21 1.975734E-01 1.980421E-01
FEM1D 121
• Boundary Condition
7.50cm
– x=0 : Fixed Temperature
TS 150C – x=7.5 : Insulated
• Convective Heat Transfer
on Cylindrical Surface
– q= h (T-T0)
– q:Heat Flux
Convective Heat Transfer on
Cylindrical Surface • Heat Flow/Unit Surface
Area/sec.
FEM1D 124
deg-C
### RESULTS (quadratic interpolation) 50 hP
ID X FEM. ANALYTICAL cosh x
1 0.00000 150.00000 150.00000 ERR(%): 0.00000 T ( x) TS T0 A T
0
hP
2 1.87500 102.98743 103.00165 ERR(%): 0.00948 cosh X max
3 3.75000 74.40203 74.37583 ERR(%): 0.01747 A
4 5.62500 59.02737 59.01653 ERR(%): 0.00722 0
5 7.50000 54.21426 54.18409 ERR(%): 0.02011 0.00 2.00 4.00 6.00 8.00