Академический Документы
Профессиональный Документы
Культура Документы
Heat Conduction
Kengo Nakajima
Information Technology Center
• Heat Generation
Z
• Uniform thermal conductivity
T=0@Z=zmax • HEX meshes
– 1x1x1 cubes
– NX, NY, NZ cubes in each direction
NZ
• Boundary Conditions
– T=0@Z=zmax
Y
NX • Heat Gen. Rate is a function of
NY
location (cell center: xc,yc)
X – Q x, y, z QVOL x y
C C
FEM3D 3
• Higher temperature
at nodes far from the
origin.
• Heat Gen. Rate is a
function of location
(cell center: xc,yc)
Q x, y, z xC yC
movie
FEM3D 4
Finite-Element Procedures
• Governing Equations
• Galerkin Method: Weak Form
• Element-by-Element Integration
– Element Matrix
• Global Matrix
• Boundary Conditions
• Linear Solver
FEM3D 5
• Formulation of 3D Element
• 3D Heat Equations
– Galerkin Method
– Element Matrices
x
FEM3D 9
2 -1 +1
1
x 1 -1 2
2 -1 +1
1
x 1 -1 2
-1 +1
x -1
1 1
1 T1 1 T2
4 4
1
1 T3 1 1 T4
4 4
1 1
1 1 T1 1 1 T2
4 4
1
1 1 T3 1 1 1 T4
4 4
FEM3D 14
1 1
1 T1 1 T2
4 4
1
1 T3 1 1 T4
4 4
N1 N2
1 1
1 1 T1 1 1 T2
4 4
1
1 1 T3 1 1 1 T4
N3 4 4
N4
FEM3D 15
• Shape functions Ni : 1
-1
2
1
N1 ( , ) 1 1 , N 2 ( , ) 1 1 1 ,
4 4
1 1
N 3 ( , ) 1 1 , N 4 ( , ) 1 1
4 4
• Also known as “bi-linear” interpolation
• Calculate Ni at each node
FEM3D 16
Extension to 3D Problems
• Tetrahedron/Tetrahedra(四面体): Triangles in 2D
– can handle arbitrary shape objects
– Linear elements are generally less accurate, not practical
– Higher-order tetrahedral elements are widely used.
• Formulation of 3D Element
• 3D Heat Equations
– Galerkin Method
– Element Matrices
FEM3D 20
k
(e) (e)
f
(e)
k
(e)
T
N dV
N , x N , x dV N , y
T
,y
V V
N N dV
T
,z ,z
V
f (e)
QN dV
T
V
FEM3D 23
1,1,1 8 7 1,1,1
1,1,1 5 6 1,1,1
1,1,1
4 3 1,1,1
1 2
, , 1,1,1 1,1,1
FEM3D 24
1,1,1 5 6 1,1,1
1,1,1
4 3 1,1,1
1 2
, , 1,1,1 1,1,1
N , z N , z dV
T
kij N i , x N j , x N i , y N j , y N i , z N j , z dV
V
FEM3D 25
f x dx w
X1 k 1
k f xk
FEM3D 27
Gaussian Quadrature in 1D
more accurate than Simpson’s rule
Simpson’s Gauss
f ( x) sin( x)
X1 X2 X3 -1 1 0 2 +1
X 1 0, X2 , X3 1 , 2 0.5773502692
4 2
/2 1
h X 2 X1 X 3 X1
4
S f x dx f h d
0 1
2
S f X 1 4 f X 2 f X 3 1.0023 h Wk f k 0.99847
h
3 k 1
FEM3D 28
Gaussian Quadrature
ガウスの積分公式
• On normalized “natural (or local)” coordinate
system [-1,+1](自然座標系,局所座標系)
• Can approximate up to (2m-1)-th order of functions
by m quadrature points (m=2 is enough for
quadratic shape functions).
1 m =-1 =0 =+1
f d w
k 1
k f k
1 k=-0.577350 k=+0.577350
m 1 k 0.00, wk 2.00
m 2 k 0.577350, wk 1.00
m 3 k 0.00, wk 8 / 9
k 0.774597, wk 5 / 9
FEM3D 29
Gaussian Quadrature
can be easily extended to 2D & 3D
1 1
I f ( , ) dd
1 1
W W
m n
i j f ( i , j )
i 1 j 1
( i , j ): Coordinates of Quad’s
Wi , W j : Weighting Factor
30
Gaussian Quadrature
ガウスの積分公式
This configuration is widely
used. In 2D problem,
integration is done using
values of “f” at 4 quad. points.
31
Gaussian Quadrature
ガウスの積分公式
This configuration is widely
used. In 2D problem,
integration is done using
values of “f” at 4 quad. points.
1 1
f ( , ) dd W W f ( , )
m n
I i j i j
1 1 i 1 j 1
W W
L M N
i j Wk f ( i , j , k )
i 1 j 1 k 1
N i N i N i
, , can be easily derived according to definitions.
N i N i N i
x , y , z are required for computations.
FEM3D 34
N i x y z N i N i
x x
N i x y z N i N
i
J
y y
N i x y z N i N i
z z
1
N i x y z N i N i
x
N x
i y z N i 1 N i
J
y
N i x y z N i N i
z
FEM3D 37
Integration on Element
k i, j 18
ij
1,1,1 8 7 1,1,1
1,1,1 5 6 1,1,1
1,1,1
4 3 1,1,1
1 2
, , 1,1,1 1,1,1
kij N i , x N j , x N i , y N j , y N i , z N j , z dV
V
N i N j N i N j N i N j
dV
V
x x y y z z
FEM3D 38
1,1,1 5 6 1,1,1
1,1,1
4 3 1,1,1
1 2
, , 1,1,1 1,1,1
N i N j N i N j N i N j
dV
V
x x y y z z
N i N j N i N j N i N j
dxdydz
x x y y z z
1 1 1
N i N j N i N j N i N j
det J ddd
1 1 1
x x y y z z
FEM3D 39
Gaussian Quadrature
k i, j 18
ij
1,1,1 8 7 1,1,1
1,1,1 5 6 1,1,1
1,1,1
4 3 1,1,1
1 2
, , 1,1,1 1,1,1
1 1 1
N i N j N i N j N i N j
det J ddd
1 1 1
x x y y z z
1 1 1
I f ( , , ) ddd
1 1 1
W W
L M N
i j Wk f ( i , j , k )
i 1 j 1 k 1
FEM3D 40
Remaining Procedures
• Element matrices have been formed.
[ K ]{} {F }
D1 X X X 1 B1
X D2 X X B
2 2
X X D3 X X X 3 B3
X X X D4 X X 4 B4
X X D5 X 5 B5
X X X D6 6 B6
FEM3D 42
• Formulation of 3D Element
• 3D Heat Equations
– Galerkin Method
– Element Matrices
– Exercise
Exercise
• Develop a program and calculate area of the following
quadrilateral using Gaussian Quadrature.
y 3
4
1:(1.0, 1.0)
V 2:(4.0, 2.0)
3:(3.0, 5.0)
2
4:(2.0, 4.0)
1
x
1 1
I dV det J dd
V 1 1
FEM3D 44
Tips (1/2)
• Calculate Jacobian
• Apply Gaussian Quadrature (n=2)
1 1
f ( , ) dd W W f ( , )
m n
I i j i j
1 1 i 1 j 1
Tips (2/2)
x y
x y y x
J x y
, det J
x 4 4 N i y 4 4 N i
N i xi xi , N i yi yi ,
i 1 i 1 i 1 i 1
x 4 4 N i y 4 4 N i
N i xi xi , N i yi yi
i 1 i 1 i 1 i 1
1 1
N1 ( , ) 1 1 , N 2 ( , ) 1 1 ,
4 4
1 1
N 3 ( , ) 1 1 , N 4 ( , ) 1 1
4 4
FEM3D 46
• Formulation of 3D Element
• 3D Heat Equations
– Galerkin Method
– Element Matrices
• Heat Generation
Z
• Uniform thermal conductivity
T=0@Z=zmax • HEX meshes
– 1x1x1 cubes
– NX, NY, NZ cubes in each direction
NZ
• Boundary Conditions
– T=0@Z=zmax
Y
NX • Heat Gen. Rate is a function of
NY
location (cell center: xc,yc)
X – Q x, y, z QVOL x y
C C
FEM3D 48
Copy/Installation
3D-FEM Code
>$ cd <$E-TOP>
>$ cp /home03/skengon/Documents/class_eps/F/fem3d.tar .
>$ cp /home03/skengon/Documents/class_eps/C/fem3d.tar .
>$ tar xvf fem3d.tar
>$ cd fem3d
>$ ls
run src
Install
>$ cd <$E-TOP>/fem3d/src
>$ make
>$ ls ../run/sol
sol
Install of Mesh Generator
>$ cd <$E-TOP>/fem3d/run
>$ g95 –O3 mgcube.f –o mgcube
FEM3D 49
Operations
Starting from Grid Generation to Computation, File-
names are fixed
mgcube
mesh generator
test.inp
for visualization
FEM3D 50
Mesh Generation
>$ cd <$fem1>/fem3d/run
Z >$ ./mgcube
cube.0
Y
NX
NY
X
FEM3D 51
cube.0 fname
2000 ITER
1.0 1.0 COND, QVOL
1.0e-08 RESID
Q x, y, z QVOL xC yC
FEM3D 52
Running
>$ cd <$E-TOP>/fem3d/run
>$ ./sol
ParaView
• http://www.paraview.org/
• Opening files
• Displaying figures
• Saving image files
– http://nkl.cc.u-tokyo.ac.jp/class/HowtouseParaViewE.pdf
– http://nkl.cc.u-tokyo.ac.jp/class/HowtouseParaViewJ.pdf
FEM3D 54
・ ・
・ ・
・ ・
・
・
・
(各節点データ成分のラベル),(単位)
(節点番号1) (節点データ1) (節点データ2) ・・・・・
(節点番号2) (節点データ1) (節点データ2) ・・・・・
・
・
・
FEM3D 57
• Formulation of 3D Element
• 3D Heat Equations
– Galerkin Method
– Element Matrices
!C
Mesh Generator: mgcube.f (3/5)
!C +-------------+
!C | GeoFEM data |
!C +-------------+
!C===
NN= 0
write (*,*) 'GeoFEM gridfile name ?'
GRIDFILE= 'cube.0'
open (12, file= GRIDFILE, status='unknown',form='formatted')
write(12,'(10i10)') INODTOT
icou= 0
do k= 1, NZP1 Node #
do j= 1, NYP1
do i= 1, NXP1 Node ID, Coordinates
XX= dfloat(i-1)*DX
YY= dfloat(j-1)*DX
ZZ= dfloat(k-1)*DX
icou= icou + 1
write (12,'(i10,3(1pe16.6))') icou, XX, YY, ZZ
enddo
enddo
enddo
write(12,'(i10)') ICELTOT Element #
IELMTYPL= 361 Element Type (not in use)
write(12,'(10i10)') (IELMTYPL, i=1,ICELTOT)
FEM3D 64
movie
FEM3D 65
8 7
5 6
4 3
1 2
FEM3D 66
(...)
42 1 62 63 68 67 87 88 93 92
43 1 63 64 69 68 88 89 94 93
44 1 64 65 70 69 89 90 95 94
45 1 66 67 72 71 91 92 97 96
46 1 67 68 73 72 92 93 98 97
47 1 68 69 74 73 93 94 99 98
48 1 69 70 75 74 94 95 100 99
49 1 76 77 82 81 101 102 107 106
50 1 77 78 83 82 102 103 108 107
51 1 78 79 84 83 103 104 109 108
52 1 79 80 85 84 104 105 110 109
53 1 81 82 87 86 106 107 112 111
54 1 82 83 88 87 107 108 113 112
55 1 83 84 89 88 108 109 114 113
56 1 84 85 90 89 109 110 115 114
57 1 86 87 92 91 111 112 117 116
58 1 87 88 93 92 112 113 118 117
59 1 88 89 94 93 113 114 119 118
60 1 89 90 95 94 114 115 120 119
61 1 91 92 97 96 116 117 122 121
62 1 92 93 98 97 117 118 123 122
63 1 93 94 99 98 118 119 124 123
64 1 94 95 100 99 119 120 125 124
FEM3D 67
NX=NY=NZ=4, NXP1=NYP1=NZP1=5
ICELTOT= 64, INODTOT= 125, IBNODTOT= 25
k=1 k=2 k=3
25 50 75
24 49 74
16 32 48
20 45 70
19 44 69
12 37 62
11 36 61
5 21 37
7 8 9 32 33 34 57 58 59
6 10 31 35 56 60
1 2 3 4 17 18 19 20 33 34 35 36
1 2 3 4 5 26 27 28 29 30 51 52 53 54 55
125 100
k=5 124 99 k=4
64 64
120 95
119 94
111 112 86 87
53 53
107 108 109 82 83 84
106 110 81 85
49 50 51 52 49 50 51 52
101 102 103 104 105 76 77 78 79 80
FEM3D 68
deallocate (IW)
(以下略)
close (12)
!C===
stop
end
FEM3D 69
Mesh Generation
• Big Technical & Research Issue
– Complicated Geometry
– Large Scale
• Parallelization is difficult
movie
FEM3D 71
• Formulation of 3D Element
• 3D Heat Equations
– Galerkin Method
– Element Matrices
test1 input_cntl
main input of control data
input_grid find_node
input of mesh info searching nodes
mat_con0 mSORT
connectivity of matrix sorting
mat_con1
connectivity of matrix
mat_ass_main jacobi
coefficient matrix Jacobian
mat_ass_bc
boundary conditions
solve11 cg
control of linear solver CG solver
Structure of
output_ucd
heat3D visualization
FEM3D 74
Main Part
program heat3D
use solver11
use pfem_util
implicit REAL*8(A-H,O-Z)
call INPUT_CNTL
call INPUT_GRID
call MAT_CON0
call MAT_CON1
call MAT_ASS_MAIN
call MAT_ASS_BC
call SOLVE11
call OUTPUT_UCD
end program heat3D
FEM3D 75
N,NP I I # Node
ICELTOT I I # Element
T T T
Q x, y , z 0
x x y y z z
Q x, y, z QVOL xC yC
FEM3D 78
INPUT_GRID (1/2)
!C***
!C*** INPUT_GRID
!C***
!C
subroutine INPUT_GRID
use pfem_util
implicit REAL*8 (A-H,O-Z)
open (11, file= fname, status= 'unknown', form= 'formatted')
!C
!C-- NODE
read (11,*) N
NP= N
allocate (XYZ(N,3))
XYZ= 0.d0
do i= 1, N
read (11,*) ii, (XYZ(i,kk),kk=1,3)
enddo
FEM3D 80
INPUT_GRID (1/2)
!C
!C-- ELEMENT
read (11,*) ICELTOT
allocate (ICELNOD(ICELTOT,8))
read (11,'(10i10)') (NTYPE, i= 1, ICELTOT)
do icel= 1, ICELTOT
read (11,'(10i10,2i5,8i8)') ii, IMAT, (ICELNOD(icel,k), k=1,8)
enddo
!C
!C-- NODE grp. info.
read (11,'(10i10)') NODGRPtot
allocate (NODGRP_INDEX(0:NODGRPtot),NODGRP_NAME(NODGRPtot))
NODGRP_INDEX= 0
read (11,'(10i10)') (NODGRP_INDEX(i), i= 1, NODGRPtot)
nn= NODGRP_INDEX(NODGRPtot)
allocate (NODGRP_ITEM(nn))
do k= 1, NODGRPtot
iS= NODGRP_INDEX(k-1) + 1
iE= NODGRP_INDEX(k )
read (11,'(a80)') NODGRP_NAME(k)
nn= iE - iS + 1
if (nn.ne.0) then
read (11,'(10i10)') (NODGRP_ITEM(kk),kk=iS, iE)
endif
enddo
close (11)
return
end
FEM3D 82
test1 input_cntl
main input of control data
input_grid find_node
input of mesh info searching nodes
mat_con0 mSORT
connectivity of matrix sorting
mat_con1
connectivity of matrix
mat_ass_main jacobi
coefficient matrix Jacobian
mat_ass_bc
boundary conditions
solve11 cg
control of linear solver CG solver
Structure of
output_ucd
heat3D visualization
FEM3D 83
N,NP I I # Node
ICELTOT I I # Element
T T T
Q x, y , z 0
x x y y z z
Q x, y, z QVOL xC yC
FEM3D 86
movie
FEM3D 87
Main Part
program heat3D
13 14 15 16
use solver11
use pfem_util
7 8 9
implicit REAL*8(A-H,O-Z)
9 10 11 12
call INPUT_CNTL
call INPUT_GRID
4 5 6
call MAT_CON0
call MAT_CON1 5 6 7 8
call MAT_ASS_MAIN
call MAT_ASS_BC 1 2 3
call SOLVE11
1 2 3 4
call OUTPUT_UCD
end program heat3D
MAT_CON0: Overview
do icel= 1, ICELTOT 1,1,1 8 7 1,1,1
generate INLU, IALU
according to 8 nodes of hex. elements
(FIND_NODE) 1,1,1 5 6 1,1,1
enddo
1,1,1
4 3 1,1,1
1 2
, , 1,1,1 1,1,1
13 14 15 16
7 8 9
9 10 11 12
4 5 6
5 6 7 8
1 2 3
1 2 3 4
FEM3D 90
Number of connected
INLU (N) nodes to each node
(lower/upper)
Corresponding
IALU (N,NLU) connected node ID
(column ID)
FEM3D 92
Number of connected
INLU (N) nodes to each node
(lower/upper)
Corresponding
IALU (N,NLU) connected node ID
(column ID)
FEM3D 94
13 14 15 16
7 8 9
9 10 11 12
4 5 6
5 6 7 8
1 2 3
1 2 3 4
FEM3D 95
13 14 15 16
7 8 9
9 10 11 12
4 5 6
5 6 7 8
1 2 3
1 2 3 4
FEM3D 96
Main Part
program heat3D
use solver11
use pfem_util
implicit REAL*8(A-H,O-Z)
call INPUT_CNTL
call INPUT_GRID
call MAT_CON0
call MAT_CON1
call MAT_ASS_MAIN
call MAT_ASS_BC
call SOLVE11
call OUTPUT_UCD
end program heat3D
FEM3D 103
MAT_ASS_MAIN: Overview
do kpn= 1, 2 Gaussian Quad. points in -direction
do jpn= 1, 2 Gaussian Quad. points in -direction
do ipn= 1, 2 Gaussian Quad. Pointe in -direction
Define Shape Function at Gaussian Quad. Points (8-points)
Its derivative on natural/local coordinate is also defined.
enddo
enddo
enddo
MAT_ASS_MAIN (1/6)
!C
!C***
!C*** MAT_ASS_MAIN
!C***
!C
subroutine MAT_ASS_MAIN
use pfem_util
implicit REAL*8 (A-H,O-Z)
integer(kind=kint), dimension( 8) :: nodLOCAL
allocate (AMAT(NPLU))
allocate (B(N), D(N), X(N))
AMAT= 0.d0 Non-Zero Off-Diagonal components (coef. matrix)
B= 0.d0 RHS vector
X= 0.d0 Unknowns
D= 0.d0 Diagonal components (coef. matrix)
WEI(1)= +1.0000000000D+00
WEI(2)= +1.0000000000D+00
POS(1)= -0.5773502692D+00
POS(2)= +0.5773502692D+00
FEM3D 105
MAT_ASS_MAIN (1/6)
!C
!C***
!C*** MAT_ASS_MAIN
!C***
!C
subroutine MAT_ASS_MAIN
use pfem_util
implicit REAL*8 (A-H,O-Z)
integer(kind=kint), dimension( 8) :: nodLOCAL
allocate (AMAT(NPLU))
allocate (B(N), D(N), X(N))
AMAT= 0.d0
B= 0.d0
X= 0.d0
D= 0.d0
WEI(1)= +1.0000000000D+00
WEI(2)= +1.0000000000D+00
POS(1)= -0.5773502692D+00
POS(2)= +0.5773502692D+00
MAT_ASS_MAIN (2/6)
!C
!C-- INIT.
!C PNQ - 1st-order derivative of shape function by QSI
!C PNE - 1st-order derivative of shape function by ETA
!C PNT - 1st-order derivative of shape function by ZET
!C
do kp= 1, 2
do jp= 1, 2
do ip= 1, 2
QP1= 1.d0 + POS(ip)
QM1= 1.d0 - POS(ip)
EP1= 1.d0 + POS(jp)
EM1= 1.d0 - POS(jp)
TP1= 1.d0 + POS(kp)
TM1= 1.d0 - POS(kp)
SHAPE(ip,jp,kp,1)= O8th * QM1 * EM1 * TM1
SHAPE(ip,jp,kp,2)= O8th * QP1 * EM1 * TM1
SHAPE(ip,jp,kp,3)= O8th * QP1 * EP1 * TM1
SHAPE(ip,jp,kp,4)= O8th * QM1 * EP1 * TM1
SHAPE(ip,jp,kp,5)= O8th * QM1 * EM1 * TP1
SHAPE(ip,jp,kp,6)= O8th * QP1 * EM1 * TP1
SHAPE(ip,jp,kp,7)= O8th * QP1 * EP1 * TP1
FEM3D 107
MAT_ASS_MAIN (2/6)
!C
!C-- INIT.
!C PNQ - 1st-order derivative of shape function by QSI
!C PNE - 1st-order derivative of shape function by ETA
!C PNT - 1st-order derivative of shape function by ZET
!C
do kp= 1, 2
do jp= 1, 2
do ip= 1, 2
QP1=
QM1=
1.d0
1.d0
+
-
POS(ip)
POS(ip) QP1i 1 i , QM1i 1 i
EP1 j 1 j , EM1 j 1 i
EP1= 1.d0 + POS(jp)
EM1= 1.d0 - POS(jp)
TP1= 1.d0 + POS(kp)
TM1= 1.d0 - POS(kp)
TP1k 1 k , TM1k 1 k
SHAPE(ip,jp,kp,1)= O8th * QM1 * EM1 * TM1
SHAPE(ip,jp,kp,2)= O8th * QP1 * EM1 * TM1
SHAPE(ip,jp,kp,3)= O8th * QP1 * EP1 * TM1
SHAPE(ip,jp,kp,4)= O8th * QM1 * EP1 * TM1
SHAPE(ip,jp,kp,5)= O8th * QM1 * EM1 * TP1
SHAPE(ip,jp,kp,6)= O8th * QP1 * EM1 * TP1
SHAPE(ip,jp,kp,7)= O8th * QP1 * EP1 * TP1
SHAPE(ip,jp,kp,8)= O8th * QP1 * EP1 * TP1
FEM3D 108
MAT_ASS_MAIN (2/6)
!C
!C-- INIT.
!C PNQ - 1st-order derivative of shape function by QSI
!C PNE - 1st-order derivative of shape function by ETA
!C PNT - 1st-order derivative of shape function by ZET
!C
do kp= 1, 2
do jp= 1, 2
do ip= 1, 2
QP1= 1.d0 + POS(ip)
QM1=
EP1=
1.d0
1.d0
-
+
POS(ip)
POS(jp)
1,1,1 8 7 1,1,1
EM1= 1.d0 - POS(jp)
TP1= 1.d0 + POS(kp)
TM1= 1.d0 - POS(kp) 1,1,1 5 6 1,1,1
SHAPE(ip,jp,kp,1)=
SHAPE(ip,jp,kp,2)=
O8th
O8th
*
*
QM1
QP1
*
*
EM1
EM1
*
*
TM1
TM1 1,1,1
SHAPE(ip,jp,kp,3)=
SHAPE(ip,jp,kp,4)=
O8th
O8th
*
*
QP1
QM1
*
*
EP1
EP1
*
*
TM1
TM1
4 3 1,1,1
SHAPE(ip,jp,kp,5)= O8th * QM1 * EM1 * TP1
SHAPE(ip,jp,kp,6)= O8th * QP1 * EM1 * TP1 1 2
SHAPE(ip,jp,kp,7)=
SHAPE(ip,jp,kp,8)=
O8th
O8th
*
*
QP1
QP1
*
*
EP1
EP1
*
*
TP1
TP1
, , 1,1,1 1,1,1
FEM3D 109
MAT_ASS_MAIN (2/6)
!C
!C-- INIT.
1
!C
!C
PNQ
PNE
- 1st-order derivative of shape function by QSI
- 1st-order derivative of shape function by ETA N1 ( , , ) 1 1 1
!C PNT - 1st-order derivative of shape function by ZET 8
!C
1
do kp= 1, 2 N 2 ( , , ) 1 1 1
do jp= 1, 2
do ip= 1, 2
8
1
QP1=
QM1=
1.d0
1.d0
+
-
POS(ip)
POS(ip)
N 3 ( , , ) 1 1 1
EP1= 1.d0 + POS(jp) 8
EM1= 1.d0 - POS(jp)
1
TP1=
TM1=
1.d0
1.d0
+
-
POS(kp)
POS(kp) N 4 ( , , ) 1 1 1
8
SHAPE(ip,jp,kp,1)= O8th * QM1 * EM1 * TM1
SHAPE(ip,jp,kp,2)= O8th * QP1 * EM1 * TM1
1
SHAPE(ip,jp,kp,3)=
SHAPE(ip,jp,kp,4)=
O8th
O8th
*
*
QP1
QM1
*
*
EP1
EP1
*
*
TM1
TM1 N 5 ( , , ) 1 1 1
SHAPE(ip,jp,kp,5)= O8th * QM1 * EM1 * TP1 8
SHAPE(ip,jp,kp,6)= O8th * QP1 * EM1 * TP1
1
SHAPE(ip,jp,kp,7)=
SHAPE(ip,jp,kp,8)=
O8th
O8th
*
*
QP1
QP1
*
*
EP1
EP1
*
*
TP1
TP1 N 6 ( , , ) 1 1 1
8
1
N 7 ( , , ) 1 1 1
8
1
N 8 ( , , ) 1 1 1
8
FEM3D 110
MAT_ASS_MAIN (3/6)
PNQ(jp,kp,1)= - O8th * EM1 * TM1
PNQ(jp,kp,2)= + O8th * EM1 * TM1 N l
PNQ(jp,kp,3)= + O8th * EP1 * TM1 PNQ( j , k ) ( i , j , k )
PNQ(jp,kp,4)= - O8th * EP1 * TM1
PNQ(jp,kp,5)= - O8th * EM1 * TP1
PNQ(jp,kp,6)= + O8th * EM1 * TP1 N
PNQ(jp,kp,7)= + O8th * EP1 * TP1 PNE (i, k ) l ( i , j , k )
PNQ(jp,kp,8)=
PNE(ip,kp,1)=
-
-
O8th
O8th
*
*
EP1
QM1
*
*
TP1
TM1
PNE(ip,kp,2)= - O8th * QP1 * TM1
PNE(ip,kp,3)= + O8th * QP1 * TM1 N
PNE(ip,kp,4)= + O8th * QM1 * TM1 PNT (i, j ) l ( i , j , k )
PNE(ip,kp,5)= - O8th * QM1 * TP1
PNE(ip,kp,6)= - O8th * QP1 * TP1
PNE(ip,kp,7)= + O8th * QP1 * TP1
PNE(ip,kp,8)= + O8th * QM1 * TP1
N1
( i , j , k ) 1 j 1 k
PNT(ip,jp,1)= - O8th * QM1 * EM1 1
PNT(ip,jp,2)=
PNT(ip,jp,3)=
-
-
O8th
O8th
*
*
QP1
QP1
*
*
EM1
EP1 8
PNT(ip,jp,4)= - O8th * QM1 * EP1
N 2
( i , j , k ) 1 j 1 k
PNT(ip,jp,5)= + O8th * QM1 * EM1 1
PNT(ip,jp,6)= + O8th * QP1 * EM1
PNT(ip,jp,7)= + O8th * QP1 * EP1 8
PNT(ip,jp,8)= + O8th * QM1 * EP1
N 3
( i , j , k ) 1 j 1 k
enddo 1
enddo
enddo 8
N 3
( i , j , k ) 1 j 1 k
do icel= 1, ICELTOT 1
COND0= COND
8
in1= ICELNOD(icel,1)
in2= ICELNOD(icel,2)
in3=
in4=
ICELNOD(icel,3)
ICELNOD(icel,4)
First Order Derivative
in5= ICELNOD(icel,5) of Shape Functions at
in6= ICELNOD(icel,6)
in7=
in8=
ICELNOD(icel,7)
ICELNOD(icel,8) ( i , j , k )
FEM3D 111
MAT_ASS_MAIN (3/6)
PNQ(jp,kp,1)= - O8th * EM1 * TM1
PNQ(jp,kp,2)= + O8th * EM1 * TM1
PNQ(jp,kp,3)= + O8th * EP1 * TM1
PNQ(jp,kp,4)= - O8th * EP1 * TM1
PNQ(jp,kp,5)= - O8th * EM1 * TP1
PNQ(jp,kp,6)= + O8th * EM1 * TP1
PNQ(jp,kp,7)= + O8th * EP1 * TP1
PNQ(jp,kp,8)= - O8th * EP1 * TP1
PNE(ip,kp,1)= - O8th * QM1 * TM1
PNE(ip,kp,2)= - O8th * QP1 * TM1
PNE(ip,kp,3)= + O8th * QP1 * TM1
PNE(ip,kp,4)= + O8th * QM1 * TM1
PNE(ip,kp,5)= - O8th * QM1 * TP1
PNE(ip,kp,6)= - O8th * QP1 * TP1
PNE(ip,kp,7)= + O8th * QP1 * TP1
PNE(ip,kp,8)= + O8th * QM1 * TP1
PNT(ip,jp,1)= - O8th * QM1 * EM1
PNT(ip,jp,2)= - O8th * QP1 * EM1
PNT(ip,jp,3)= - O8th * QP1 * EP1
PNT(ip,jp,4)= - O8th * QM1 * EP1
PNT(ip,jp,5)= + O8th * QM1 * EM1
PNT(ip,jp,6)= + O8th * QP1 * EM1
PNT(ip,jp,7)= + O8th * QP1 * EP1
PNT(ip,jp,8)= + O8th * QM1 * EP1
enddo 1,1,1 8 7 1,1,1
enddo
enddo
do icel= 1, ICELTOT
1,1,1 5 6 1,1,1
COND0= COND
in1= ICELNOD(icel,1)
1,1,1
in2= ICELNOD(icel,2) 4 3 1,1,1
in3= ICELNOD(icel,3)
in4= ICELNOD(icel,4)
in5= ICELNOD(icel,5) 1 2
in6= ICELNOD(icel,6) , , 1,1,1 1,1,1
in7= ICELNOD(icel,7)
in8= ICELNOD(icel,8)
FEM3D 112
MAT_ASS_MAIN (4/6)
nodLOCAL(1)= in1
nodLOCAL(2)= in2
nodLOCAL(3)= in3
nodLOCAL(4)=
nodLOCAL(5)=
in4
in5 Node ID (Global) 1,1,1 8 7 1,1,1
nodLOCAL(6)= in6
nodLOCAL(7)= in7
nodLOCAL(8)= in8 1,1,1 5 6 1,1,1
X1= XYZ(in1,1)
X2= XYZ(in2,1) 1,1,1
X3= XYZ(in3,1)
X4= XYZ(in4,1) 4 3 1,1,1
X5= XYZ(in5,1)
X6= XYZ(in6,1) 1 2
X7= XYZ(in7,1)
X8= XYZ(in8,1) , , 1,1,1 1,1,1
Y1= XYZ(in1,2)
Y2= XYZ(in2,2)
Y3= XYZ(in3,2)
Y4= XYZ(in4,2)
Y5= XYZ(in5,2)
Y6= XYZ(in6,2)
Y7= XYZ(in7,2)
Y8= XYZ(in8,2)
QVC= O8th * (X1+X2+X3+X4+X5+X6+X7+X8+
& Y1+Y2+Y3+Y4+Y5+Y6+Y7+Y8)
Z1= XYZ(in1,3)
Z2= XYZ(in2,3)
Z3= XYZ(in3,3)
Z4= XYZ(in4,3)
Z5= XYZ(in5,3)
Z6= XYZ(in6,3)
Z7= XYZ(in7,3)
Z8= XYZ(in8,3)
call JACOBI (DETJ, PNQ, PNE, PNT, PNX, PNY, PNZ, &
& X1, X2, X3, X4, X5, X6, X7, X8, &
& Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8, &
& Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8 )
FEM3D 113
MAT_ASS_MAIN (4/6)
nodLOCAL(1)= in1
nodLOCAL(2)= in2
nodLOCAL(3)= in3
nodLOCAL(4)=
nodLOCAL(5)=
in4
in5
1,1,1 8 7 1,1,1
nodLOCAL(6)= in6
nodLOCAL(7)= in7
nodLOCAL(8)= in8 1,1,1 5 6 1,1,1
X1= XYZ(in1,1)
X2= XYZ(in2,1) 1,1,1
X-Coordinates
X3= XYZ(in3,1)
X4= XYZ(in4,1) 4 3 1,1,1
X5= XYZ(in5,1)
of 8 nodes
X6= XYZ(in6,1) 1 2
X7= XYZ(in7,1)
X8= XYZ(in8,1) , , 1,1,1 1,1,1
Y1= XYZ(in1,2)
Y2= XYZ(in2,2)
Y3= XYZ(in3,2) Y-Coordinates
Y4= XYZ(in4,2)
Y5= XYZ(in5,2) of 8 nodes
Y6= XYZ(in6,2)
Y7= XYZ(in7,2)
Y8= XYZ(in8,2)
QVC= O8th * (X1+X2+X3+X4+X5+X6+X7+X8+
& Y1+Y2+Y3+Y4+Y5+Y6+Y7+Y8)
Z1= XYZ(in1,3)
Z2= XYZ(in2,3)
Z3= XYZ(in3,3)
Z4= XYZ(in4,3) Z-Coordinates
Z5= XYZ(in5,3)
Z6= XYZ(in6,3) of 8 nodes
Z7= XYZ(in7,3)
Z8= XYZ(in8,3)
call JACOBI (DETJ, PNQ, PNE, PNT, PNX, PNY, PNZ, &
& X1, X2, X3, X4, X5, X6, X7, X8, &
& Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8, &
& Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8 )
FEM3D 114
MAT_ASS_MAIN (4/6)
nodLOCAL(1)= in1
nodLOCAL(2)= in2
nodLOCAL(3)= in3
nodLOCAL(4)=
nodLOCAL(5)=
in4
in5
1,1,1 8 7 1,1,1
nodLOCAL(6)= in6
nodLOCAL(7)= in7
nodLOCAL(8)= in8 1,1,1 5 6 1,1,1
X1= XYZ(in1,1)
X2= XYZ(in2,1) 1,1,1
X-Coordinates
X3= XYZ(in3,1)
X4= XYZ(in4,1) 4 3 1,1,1
X5= XYZ(in5,1)
of 8 nodes
X6= XYZ(in6,1) 1 2
X7= XYZ(in7,1)
X8= XYZ(in8,1) , , 1,1,1 1,1,1
Y1= XYZ(in1,2)
Y2= XYZ(in2,2)
Y3= XYZ(in3,2) Y-Coordinates
Y4= XYZ(in4,2)
Y5= XYZ(in5,2) of 8 nodes
Y6= XYZ(in6,2)
Y7= XYZ(in7,2)
T T T
Y8= XYZ(in8,2)
QVC= O8th * (X1+X2+X3+X4+X5+X6+X7+X8+ Q x, y , z 0
& Y1+Y2+Y3+Y4+Y5+Y6+Y7+Y8) x x y y z z
Z1= XYZ(in1,3)
Z2= XYZ(in2,3)
Z3= XYZ(in3,3) Q x, y, z QVOL xC yC
Z4= XYZ(in4,3)
Z5= XYZ(in5,3) Heat Gen. Rate is a function of location
Z6= XYZ(in6,3)
Z7= XYZ(in7,3) (cell center: xc,yc)
Z8= XYZ(in8,3)
call JACOBI (DETJ, PNQ, PNE, PNT, PNX, PNY, PNZ, &
& X1, X2, X3, X4, X5, X6, X7, X8, &
& Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8, &
& Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8 )
FEM3D 115
MAT_ASS_MAIN (4/6)
nodLOCAL(1)= in1
nodLOCAL(2)= in2
nodLOCAL(3)= in3
nodLOCAL(4)=
nodLOCAL(5)=
in4
in5
1,1,1 8 7 1,1,1
nodLOCAL(6)= in6
nodLOCAL(7)= in7
nodLOCAL(8)= in8 1,1,1 5 6 1,1,1
X1= XYZ(in1,1)
X2= XYZ(in2,1) 1,1,1
X3= XYZ(in3,1)
X4= XYZ(in4,1) 4 3 1,1,1
X5= XYZ(in5,1)
X6= XYZ(in6,1) 1 2
X7= XYZ(in7,1)
X8= XYZ(in8,1) , , 1,1,1 1,1,1
Y1= XYZ(in1,2)
Y2= XYZ(in2,2)
Y3= XYZ(in3,2)
Y4= XYZ(in4,2)
Y5= XYZ(in5,2)
Y6= XYZ(in6,2)
Y7= XYZ(in7,2)
T T T
Y8= XYZ(in8,2)
QVC= O8th * (X1+X2+X3+X4+X5+X6+X7+X8+ Q x, y , z 0
& Y1+Y2+Y3+Y4+Y5+Y6+Y7+Y8) x x y y z z
Z1= XYZ(in1,3)
Z2= XYZ(in2,3)
Z3= XYZ(in3,3) Q x, y, z QVOL xC yC
Z4= XYZ(in4,3)
Z5= XYZ(in5,3)
Z6= XYZ(in6,3)
QVC xC yC
Z7= XYZ(in7,3)
Z8= XYZ(in8,3)
call JACOBI (DETJ, PNQ, PNE, PNT, PNX, PNY, PNZ, &
& X1, X2, X3, X4, X5, X6, X7, X8, &
& Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8, &
& Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8 )
FEM3D 116
MAT_ASS_MAIN (4/6)
nodLOCAL(1)= in1
nodLOCAL(2)= in2
nodLOCAL(3)= in3
nodLOCAL(4)= in4
nodLOCAL(5)= in5
nodLOCAL(6)= in6
nodLOCAL(7)= in7
nodLOCAL(8)= in8
X1= XYZ(in1,1)
X2= XYZ(in2,1)
X3= XYZ(in3,1)
X4= XYZ(in4,1)
X5= XYZ(in5,1)
X6= XYZ(in6,1)
X7= XYZ(in7,1)
X8= XYZ(in8,1)
Y1= XYZ(in1,2)
Y2= XYZ(in2,2)
Y3= XYZ(in3,2)
Y4= XYZ(in4,2)
Y5= XYZ(in5,2)
Y6= XYZ(in6,2)
Y7= XYZ(in7,2)
Y8= XYZ(in8,2)
QVC= O8th * (X1+X2+X3+X4+X5+X6+X7+X8+
& Y1+Y2+Y3+Y4+Y5+Y6+Y7+Y8)
Z1= XYZ(in1,3)
Z2= XYZ(in2,3)
Z3= XYZ(in3,3)
Z4= XYZ(in4,3)
Z5= XYZ(in5,3)
Z6= XYZ(in6,3)
Z7= XYZ(in7,3)
Z8= XYZ(in8,3)
call JACOBI (DETJ, PNQ, PNE, PNT, PNX, PNY, PNZ, &
& X1, X2, X3, X4, X5, X6, X7, X8, &
& Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8, &
& Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8 )
FEM3D 117
JACOBI (1/4)
subroutine JACOBI (DETJ, PNQ, PNE, PNT, PNX, PNY, PNZ, &
& X1, X2, X3, X4, X5, X6, X7, X8, Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8, &
& Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8 )
!C
!C calculates JACOBIAN & INVERSE JACOBIAN
!C dNi/dx, dNi/dy & dNi/dz
!C
implicit REAL*8 (A-H,O-Z)
dimension DETJ(2,2,2)
dimension PNQ(2,2,8), PNE(2,2,8), PNT(2,2,8)
dimension PNX(2,2,2,8), PNY(2,2,2,8), PNZ(2,2,2,8)
do kp= 1, 2
do jp= 1, 2
do ip= 1, 2
PNX(ip,jp,kp,1)=0.d0
PNX(ip,jp,kp,2)=0.d0
PNX(ip,jp,kp,3)=0.d0
PNX(ip,jp,kp,4)=0.d0
PNX(ip,jp,kp,5)=0.d0
PNX(ip,jp,kp,6)=0.d0
PNX(ip,jp,kp,7)=0.d0
PNX(ip,jp,kp,8)=0.d0
PNY(ip,jp,kp,1)=0.d0
N l N l N l
, , , xl , yl , zl l 1 ~ 8
PNY(ip,jp,kp,2)=0.d0
PNY(ip,jp,kp,3)=0.d0 Input
PNY(ip,jp,kp,4)=0.d0
PNY(ip,jp,kp,5)=0.d0
PNY(ip,jp,kp,6)=0.d0
PNY(ip,jp,kp,7)=0.d0 N l N l N l
PNY(ip,jp,kp,8)=0.d0
PNZ(ip,jp,kp,1)=0.d0 Output x , y , z , det J
PNZ(ip,jp,kp,2)=0.d0
PNZ(ip,jp,kp,3)=0.d0
PNZ(ip,jp,kp,4)=0.d0
PNZ(ip,jp,kp,5)=0.d0
PNZ(ip,jp,kp,6)=0.d0 Values at each Gaussian Quad.
PNZ(ip,jp,kp,7)=0.d0
PNZ(ip,jp,kp,8)=0.d0 Points: (ip,jp,kp)
FEM3D 118
N i N i N i
, , can be easily derived according to definitions.
N i N i N i
x , y , z are required for computations.
FEM3D 119
JACOBI (2/4)
!C
!C== DETERMINANT of the JACOBIAN
dXdQ = &
& + PNQ(jp,kp,1) * X1 + PNQ(jp,kp,2) * X2 &
& + PNQ(jp,kp,3) * X3 + PNQ(jp,kp,4) * X4 &
& + PNQ(jp,kp,5) * X5 + PNQ(jp,kp,6) * X6 &
& + PNQ(jp,kp,7) * X7 + PNQ(jp,kp,8) * X8
dYdQ = &
&
&
+
+
PNQ(jp,kp,1)
PNQ(jp,kp,3)
*
*
Y1
Y3
+
+
PNQ(jp,kp,2)
PNQ(jp,kp,4)
*
*
Y2
Y4
&
& J11 J12 J13
J J 21 J 23
& + PNQ(jp,kp,5) * Y5 + PNQ(jp,kp,6) * Y6 &
& + PNQ(jp,kp,7) * Y7 + PNQ(jp,kp,8) * Y8
dZdQ = & J 22
& + PNQ(jp,kp,1) * Z1 + PNQ(jp,kp,2) * Z2 &
&
&
+
+
PNQ(jp,kp,3)
PNQ(jp,kp,5)
*
*
Z3
Z5
+
+
PNQ(jp,kp,4)
PNQ(jp,kp,6)
*
*
Z4
Z6
&
& J 31 J 32 J 33
& + PNQ(jp,kp,7) * Z7 + PNQ(jp,kp,8) * Z8
dXdE = &
& + PNE(ip,kp,1) * X1 + PNE(ip,kp,2) * X2 &
& + PNE(ip,kp,3) * X3 + PNE(ip,kp,4) * X4 &
& + PNE(ip,kp,5) * X5 + PNE(ip,kp,6) * X6 &
x
&
dYdE =
+ PNE(ip,kp,7) * X7 + PNE(ip,kp,8) * X8
& dXdQ J11
& + PNE(ip,kp,1) * Y1 + PNE(ip,kp,2) * Y2 &
& + PNE(ip,kp,3) * Y3 + PNE(ip,kp,4) * Y4 &
& + PNE(ip,kp,5) * Y5 + PNE(ip,kp,6) * Y6 & y
& + PNE(ip,kp,7) * Y7 + PNE(ip,kp,8) * Y8 dYdQ J12
&
dZdE =
+ PNE(ip,kp,1) * Z1 + PNE(ip,kp,2) * Z2
&
&
& + PNE(ip,kp,3) * Z3 + PNE(ip,kp,4) * Z4 &
z
&
&
+
+
PNE(ip,kp,5)
PNE(ip,kp,7)
*
*
Z5
Z7
+
+
PNE(ip,kp,6)
PNE(ip,kp,8)
*
*
Z6
Z8
&
dZdQ J13
FEM3D 122
JACOBI (3/4)
dXdT = &
& + PNT(ip,jp,1) * X1 + PNT(ip,jp,2) * X2 &
& + PNT(ip,jp,3) * X3 + PNT(ip,jp,4) * X4 &
& + PNT(ip,jp,5) * X5 + PNT(ip,jp,6) * X6 &
& + PNT(ip,jp,7) * X7 + PNT(ip,jp,8) * X8
dYdT = &
& + PNT(ip,jp,1) * Y1 + PNT(ip,jp,2) * Y2 &
& + PNT(ip,jp,3) * Y3 + PNT(ip,jp,4) * Y4 &
& + PNT(ip,jp,5) * Y5 + PNT(ip,jp,6) * Y6 &
& + PNT(ip,jp,7) * Y7 + PNT(ip,jp,8) * Y8
dZdT = &
& + PNT(ip,jp,1) * Z1 + PNT(ip,jp,2) * Z2 &
& + PNT(ip,jp,3) * Z3 + PNT(ip,jp,4) * Z4 &
& + PNT(ip,jp,5) * Z5 + PNT(ip,jp,6) * Z6 &
& + PNT(ip,jp,7) * Z7 + PNT(ip,jp,8) * Z8
DETJ(ip,jp,kp)= dXdQ*(dYdE*dZdT-dZdE*dYdT) + &
& dYdQ*(dZdE*dXdT-dXdE*dZdT) + &
& dZdQ*(dXdE*dYdT-dYdE*dXdT)
!C
!C== INVERSE JACOBIAN
coef= 1.d0 / DETJ(ip,jp,kp)
J11 J12 J13
J J 21 J 23
a11= coef * ( dYdE*dZdT - dZdE*dYdT )
a12= coef * ( dZdQ*dYdT - dYdQ*dZdT )
a13= coef * ( dYdQ*dZdE - dZdQ*dYdE ) J 22
a21= coef * ( dZdE*dXdT - dXdE*dZdT )
a22= coef * ( dXdQ*dZdT - dZdQ*dXdT ) J 31 J 32 J 33
a23= coef * ( dZdQ*dXdE - dXdQ*dZdE )
a31= coef * ( dXdE*dYdT - dYdE*dXdT )
a32= coef * ( dYdQ*dXdT - dXdQ*dYdT )
a33= coef * ( dXdQ*dYdE - dYdQ*dXdE )
DETJ(ip,jp,kp)= dabs(DETJ(ip,jp,kp))
FEM3D 123
JACOBI (3/4)
dXdT = &
& + PNT(ip,jp,1) * X1 + PNT(ip,jp,2) * X2 &
& + PNT(ip,jp,3) * X3 + PNT(ip,jp,4) * X4 &
& + PNT(ip,jp,5) * X5 + PNT(ip,jp,6) * X6 &
& + PNT(ip,jp,7) * X7 + PNT(ip,jp,8) * X8
dYdT = &
& + PNT(ip,jp,1) * Y1 + PNT(ip,jp,2) * Y2 &
& + PNT(ip,jp,3) * Y3 + PNT(ip,jp,4) * Y4 &
& + PNT(ip,jp,5) * Y5 + PNT(ip,jp,6) * Y6 &
& + PNT(ip,jp,7) * Y7 + PNT(ip,jp,8) * Y8
dZdT = &
& + PNT(ip,jp,1) * Z1 + PNT(ip,jp,2) * Z2 &
& + PNT(ip,jp,3) * Z3 + PNT(ip,jp,4) * Z4 &
& + PNT(ip,jp,5) * Z5 + PNT(ip,jp,6) * Z6 &
& + PNT(ip,jp,7) * Z7 + PNT(ip,jp,8) * Z8
DETJ(ip,jp,kp)= dXdQ*(dYdE*dZdT-dZdE*dYdT) + &
& dYdQ*(dZdE*dXdT-dXdE*dZdT) + &
& dZdQ*(dXdE*dYdT-dYdE*dXdT)
!C
!C== INVERSE JACOBIAN
coef= 1.d0 / DETJ(ip,jp,kp)
a11= coef * ( dYdE*dZdT - dZdE*dYdT )
a12= coef * ( dZdQ*dYdT - dYdQ*dZdT )
a13= coef * ( dYdQ*dZdE - dZdQ*dYdE ) a11 a12 a13
a21= coef * ( dZdE*dXdT - dXdE*dZdT )
a22= coef * ( dXdQ*dZdT - dZdQ*dXdT ) J a21
1
a22 a23
a23= coef * ( dZdQ*dXdE - dXdQ*dZdE )
a31= coef * ( dXdE*dYdT - dYdE*dXdT ) a31 a32 a33
a32= coef * ( dYdQ*dXdT - dXdQ*dYdT )
a33= coef * ( dXdQ*dYdE - dYdQ*dXdE )
DETJ(ip,jp,kp)= dabs(DETJ(ip,jp,kp))
FEM3D 125
!C
JACOBI (4/4)
!C== set the dNi/dX, dNi/dY & dNi/dZ components
PNX(ip,jp,kp,1)= a11*PNQ(jp,kp,1) + a12*PNE(ip,kp,1) + a13*PNT(ip,jp,1)
PNX(ip,jp,kp,2)= a11*PNQ(jp,kp,2) + a12*PNE(ip,kp,2) + a13*PNT(ip,jp,2)
PNX(ip,jp,kp,3)= a11*PNQ(jp,kp,3) + a12*PNE(ip,kp,3) + a13*PNT(ip,jp,3)
PNX(ip,jp,kp,4)= a11*PNQ(jp,kp,4) + a12*PNE(ip,kp,4) + a13*PNT(ip,jp,4)
PNX(ip,jp,kp,5)= a11*PNQ(jp,kp,5) + a12*PNE(ip,kp,5) + a13*PNT(ip,jp,5)
PNX(ip,jp,kp,6)= a11*PNQ(jp,kp,6) + a12*PNE(ip,kp,6) + a13*PNT(ip,jp,6)
PNX(ip,jp,kp,7)= a11*PNQ(jp,kp,7) + a12*PNE(ip,kp,7) + a13*PNT(ip,jp,7)
PNX(ip,jp,kp,8)= a11*PNQ(jp,kp,8) + a12*PNE(ip,kp,8) + a13*PNT(ip,jp,8)
PNY(ip,jp,kp,1)= a21*PNQ(jp,kp,1) + a22*PNE(ip,kp,1) + a23*PNT(ip,jp,1)
PNY(ip,jp,kp,2)= a21*PNQ(jp,kp,2) + a22*PNE(ip,kp,2) + a23*PNT(ip,jp,2)
PNY(ip,jp,kp,3)= a21*PNQ(jp,kp,3) + a22*PNE(ip,kp,3) + a23*PNT(ip,jp,3)
PNY(ip,jp,kp,4)= a21*PNQ(jp,kp,4) + a22*PNE(ip,kp,4) + a23*PNT(ip,jp,4)
PNY(ip,jp,kp,5)= a21*PNQ(jp,kp,5) + a22*PNE(ip,kp,5) + a23*PNT(ip,jp,5)
PNY(ip,jp,kp,6)= a21*PNQ(jp,kp,6) + a22*PNE(ip,kp,6) + a23*PNT(ip,jp,6)
PNY(ip,jp,kp,7)= a21*PNQ(jp,kp,7) + a22*PNE(ip,kp,7) + a23*PNT(ip,jp,7)
PNY(ip,jp,kp,8)= a21*PNQ(jp,kp,8) + a22*PNE(ip,kp,8) + a23*PNT(ip,jp,8)
PNZ(ip,jp,kp,1)= a31*PNQ(jp,kp,1) + a32*PNE(ip,kp,1) + a33*PNT(ip,jp,1)
PNZ(ip,jp,kp,2)= a31*PNQ(jp,kp,2) + a32*PNE(ip,kp,2) + a33*PNT(ip,jp,2)
PNZ(ip,jp,kp,3)= a31*PNQ(jp,kp,3) + a32*PNE(ip,kp,3) + a33*PNT(ip,jp,3)
PNZ(ip,jp,kp,4)= a31*PNQ(jp,kp,4) + a32*PNE(ip,kp,4) + a33*PNT(ip,jp,4)
PNZ(ip,jp,kp,5)= a31*PNQ(jp,kp,5) + a32*PNE(ip,kp,5) + a33*PNT(ip,jp,5)
PNZ(ip,jp,kp,6)= a31*PNQ(jp,kp,6) + a32*PNE(ip,kp,6) + a33*PNT(ip,jp,6)
PNZ(ip,jp,kp,7)= a31*PNQ(jp,kp,7) + a32*PNE(ip,kp,7) + a33*PNT(ip,jp,7)
PNZ(ip,jp,kp,8)= a31*PNQ(jp,kp,8) + a32*PNE(ip,kp,8) + a33*PNT(ip,jp,8)
enddo
enddo 1
enddo N i x y z N i N i
x
N x
a11 a12 a13
i y z N i N
a21 a22 a23 i
y a
z
i 31
a32 a33 N
N i x y
N i
z
FEM3D 126
MAT_ASS_MAIN (5/6)
!C
!C== CONSTRUCT the GLOBAL MATRIX
do ie= 1, 8
ip = nodLOCAL(ie) Non-Zero Off-Diagonal Block
do je= 1, 8
jp = nodLOCAL(je) in Global Matix
kk= 0
if (jp.ne.ip) then
iiS= index(ip-1) + 1
Aip , jp
iiE= index(ip )
do k= iiS, iiE
if ( item(k).eq.jp ) then kk: address in “item”
kk= k
exit
endif
enddo
endif
ip= nodLOCAL[ie]
jp= nodLOCAL[je]
1,1,1 8 7 1,1,1
1,1,1 8 7 1,1,1
1,1,1 5 6 1,1,1
1,1,1
4 3 1,1,1
1 2
, , 1,1,1 1,1,1
FEM3D 128
MAT_ASS_MAIN (5/6)
!C
!C== CONSTRUCT the GLOBAL MATRIX
do ie= 1, 8
ip = nodLOCAL(ie)
do je= 1, 8
jp = nodLOCAL(je)
kk= 0
if (jp.ne.ip) then Element Matrix(ie~je): Local ID
iiS= index(ip-1) + 1
iiE= index(ip )
Global Matrix (ip~jp): Global ID
do k= iiS, iiE
if ( item(k).eq.jp ) then
kk= k
exit
kk:address in “item” starting from “1”
endif
enddo
endif k: starting from “1”
1,1,1 5 6 1,1,1
1,1,1
4 3 1,1,1
1 2
, , 1,1,1 1,1,1
FEM3D 129
MAT_ASS_MAIN (6/6)
QV0 = 0.d0
COEFij= 0.d0
do kpn= 1, 2
do jpn= 1, 2
do ipn= 1, 2
coef= dabs(DETJ(ipn,jpn,kpn))*WEI(ipn)*WEI(jpn)*WEI(kpn)
PNXi= PNX(ipn,jpn,kpn,ie)
PNYi= PNY(ipn,jpn,kpn,ie)
PNZi= PNZ(ipn,jpn,kpn,ie)
PNXj= PNX(ipn,jpn,kpn,je)
PNYj= PNY(ipn,jpn,kpn,je)
PNZj= PNZ(ipn,jpn,kpn,je)
COEFij= COEFij + coef * COND0 *
& (PNXi*PNXj+PNYi*PNYj+PNZi*PNZj)
SHi= SHAPE(ipn,jpn,kpn,ie)
QV0= QV0 + SHi * QVOL * coef
enddo
enddo
enddo
if (jp.eq.ip) then
D(ip)= D(ip) + COEFij
B(ip)= B(ip) + QV0*QVC
else
AMAT(kk)= AMAT(kk) + COEFij
endif
enddo
enddo
1 1 1
N i N j
N i N j N i N j
enddo
1 1 1
x x
y y
z z
det J ddd
return
end
FEM3D 130
MAT_ASS_MAIN (6/6)
QV0 = 0.d0
COEFij= 0.d0
do kpn= 1, 2
do jpn= 1, 2
do ipn= 1, 2
coef= dabs(DETJ(ipn,jpn,kpn))*WEI(ipn)*WEI(jpn)*WEI(kpn)
PNXi= PNX(ipn,jpn,kpn,ie)
PNYi= PNY(ipn,jpn,kpn,ie)
PNZi= PNZ(ipn,jpn,kpn,ie)
PNXj= PNX(ipn,jpn,kpn,je)
PNYj= PNY(ipn,jpn,kpn,je)
PNZj= PNZ(ipn,jpn,kpn,je)
COEFij= COEFij + coef * COND0 *
& (PNXi*PNXj+PNYi*PNYj+PNZi*PNZj)
SHi= SHAPE(ipn,jpn,kpn,ie)
QV0= QV0 + SHi * QVOL * coef 1 1 1
enddo
enddo
enddo
I f ( , , ) ddd
1 1 1
W W
if (jp.eq.ip) then L M N
D(ip)= D(ip) + COEFij i j Wk f ( i , j , k )
B(ip)= B(ip) + QV0*QVC
else i 1 j 1 k 1
AMAT(kk)= AMAT(kk) + COEFij
endif
enddo
enddo
1 1 1
N i N j
N i N j N i N j
enddo
1 1 1
x x
y y
z z
det J ddd
return
end
FEM3D 131
MAT_ASS_MAIN (6/6)
QV0 = 0.d0
COEFij= 0.d0
do kpn= 1, 2
do jpn= 1, 2
do ipn= 1, 2
coef= dabs(DETJ(ipn,jpn,kpn))*WEI(ipn)*WEI(jpn)*WEI(kpn)
W W
if (jp.eq.ip) then L M N
D(ip)= D(ip) + COEFij i j Wk f ( i , j , k )
B(ip)= B(ip) + QV0*QVC
else i 1 j 1 k 1
AMAT(kk)= AMAT(kk) + COEFij
endif
enddo
enddo
1 1 1
N i N j
N i N j N i N j
enddo
1 1 1
x x
y y
z z
det J ddd
return
end
FEM3D 132
MAT_ASS_MAIN (6/6)
QV0 = 0.d0
COEFij= 0.d0
do kpn= 1, 2
do jpn= 1, 2
do ipn= 1, 2
coef= dabs(DETJ(ipn,jpn,kpn))*WEI(ipn)*WEI(jpn)*WEI(kpn)
PNXi= PNX(ipn,jpn,kpn,ie)
PNYi= PNY(ipn,jpn,kpn,ie)
PNZi= PNZ(ipn,jpn,kpn,ie)
PNXj= PNX(ipn,jpn,kpn,je)
PNYj= PNY(ipn,jpn,kpn,je)
PNZj= PNZ(ipn,jpn,kpn,je)
&
COEFij= COEFij + coef * COND0 *
(PNXi*PNXj+PNYi*PNYj+PNZi*PNZj) k i, j 18
ij
SHi= SHAPE(ipn,jpn,kpn,ie) j
QV0= QV0 + SHi * QVOL * coef
enddo
enddo
enddo
if (jp.eq.ip) then i
D(ip)= D(ip) + COEFij
B(ip)= B(ip) + QV0*QVC
else
AMAT(kk)= AMAT(kk) + COEFij
endif
enddo
enddo
enddo
return
end
FEM3D 133
係数行列:MAT_ASS_MAIN(6/6)
QV0 = 0.d0
COEFij= 0.d0
do kpn= 1, 2
do jpn= 1, 2
do ipn= 1, 2
coef= dabs(DETJ(ipn,jpn,kpn))*WEI(ipn)*WEI(jpn)*WEI(kpn)
f (e) Q N T dV
PNXj= PNX(ipn,jpn,kpn,je)
PNYj= PNY(ipn,jpn,kpn,je)
PNZj= PNZ(ipn,jpn,kpn,je)
COEFij= COEFij + coef * COND0 * V
& (PNXi*PNXj+PNYi*PNYj+PNZi*PNZj)
Q x, y, z QVOL xC yC
SHi= SHAPE(ipn,jpn,kpn,ie)
QV0= QV0 + SHi * QVOL * coef
enddo
enddo
enddo
if (jp.eq.ip) then
QVC xC yC
QV 0 QVOLN dV
D(ip)= D(ip) + COEFij
B(ip)= B(ip) + QV0*QVC T
else
AMAT(kk)= AMAT(kk) + COEFij
endif V
enddo
enddo
f (e) QV 0 QVC
enddo
return
end
FEM3D 134
MAT_ASS_BC: Overview
MAT_ASS_BC (1/2)
subroutine MAT_ASS_BC
use pfem_util
implicit REAL*8 (A-H,O-Z)
allocate (IWKX(N,2))
IWKX= 0
!C
!C== Z=Zmax
do in= 1, N
IWKX(in,1)= 0
If the node “in” is included in the
enddo node group “Zmax”
ib0= -1
do ib0= 1, NODGRPtot
if (NODGRP_NAME(ib0).eq.'Zmax') exit IWKX(in,1)= 1
enddo
do ib= NODGRP_INDEX(ib0-1)+1, NODGRP_INDEX(ib0)
in= NODGRP_ITEM(ib)
IWKX(in,1)= 1
enddo
FEM3D 136
MAT_ASS_BC (2/2)
do in= 1, N
if (IWKX(in,1).eq.1) then
B(in)= 0.d0
D(in)= 1.d0
iS= index(in-1) + 1
iE= index(in )
do k= iS, iE
AMAT(k)= 0.d0
enddo
endif
enddo
do in= 1, N
iS= index(in-1) + 1
iE= index(in )
do k= iS, iE
if (IWKX(item(k),1).eq.1) then
AMAT(k)= 0.d0
endif
enddo
enddo
!C==
return
end
FEM3D 137
heat generation/volume Q
T
Q 0
x x
AMAT(jS+1)= 0.d0
DIAG(i)= 1.d0
RHS (i)= 0.d0
do k= 1, NPLU
if (ITEM(k).eq.1) AMAT(k)= 0.d0
enddo
!C===
1D
FEM1D 140
do k= 1, NPLU
if (ITEM(k).eq.1) AMAT(k)= 0.d0
enddo
!C===
1D
FEM1D 141
AMAT(jS+1)= 0.d0
DIAG(i)= 1.d0
RHS (i)= 0.d0
do k= 1, NPLU
if (ITEM(k).eq.1) AMAT(k)= 0.d0
enddo
!C===
if T1≠ 0
!C
!C +---------------------+
!C | BOUNDARY CONDITIONS |
Column components of boundary nodes
!C +---------------------+ (Dirichlet B.C.) are moved to RHS and
!C=== eliminated for keeping symmetrical feature
!C of the matrix.
!C-- X=Xmin
i= 1
Index[ j 1]1
Amat
jS= INDEX(i-1)
Diag j j k Item[ k ] Rhs j
AMAT(jS+1)= 0.d0 k Index[ j ]
DIAG(i)= 1.d0
RHS (i)= PHImin
do i= 1, N
do k= INDEX(i-1)+1, INDEX(i)
if (ITEM(k).eq.1) then
RHS (i)= RHS(i) – AMAT(k)*PHImin
AMAT(k)= 0.d0
endif
enddo
enddo
!C===
1D
FEM1D 143
if T1≠ 0
!C
!C +---------------------+ Index[ j 1]1
!C | BOUNDARY CONDITIONS |
!C +---------------------+
!C===
Diag j j Amat
k Index[ j ], k k s
k Item[ k ]
MAT_ASS_BC (2/2)
do in= 1, N
if (IWKX(in,1).eq.1) then
B(in)= 0.d0 Boundary Nodes: IWKX(in,1)=1
D(in)= 1.d0
iS= index(in-1) + 1
iE= index(in )
do k= iS, iE
AMAT(k)= 0.d0
enddo
endif Erase !!
enddo
do in= 1, N
iS= index(in-1) + 1
iE= index(in )
do k= iS, iE
if (IWKX(item(k),1).eq.1) then
AMAT(k)= 0.d0
endif
enddo
enddo
!C==
return
end
Same as 1D case
FEM3D 145
MAT_ASS_BC (2/2)
do in= 1, N
if (IWKX(in,1).eq.1) then
B(in)= 0.d0 Boundary Nodes: IWKX(in,1)=1
D(in)= 1.d0
iS= index(in-1) + 1
iE= index(in )
do k= iS, iE
AMAT(k)= 0.d0
enddo
endif
enddo
do in= 1, N
iS= index(in-1) + 1
iE= index(in )
do k= iS, iE
if (IWKX(item(k),1).eq.1) then
AMAT(k)= 0.d0
endif
enddo
enddo
!C==
return
end
Elimination and Erase
Same as 1D case
FEM3D 146
test1 input_cntl
main input of control data
input_grid find_node
input of mesh info searching nodes
mat_con0 mSORT
connectivity of matrix sorting
mat_con1
connectivity of matrix
mat_ass_main jacobi
coefficient matrix Jacobian
mat_ass_bc
boundary conditions
solve11 cg
control of linear solver CG solver
Structure of
output_ucd
heat3D visualization
FEM3D 147
Main Part
program heat3D
use solver11
use pfem_util
implicit REAL*8(A-H,O-Z)
call INPUT_CNTL
call INPUT_GRID
call MAT_CON0
call MAT_CON1
call MAT_ASS_MAIN
call MAT_ASS_BC
call SOLVE11
call OUTPUT_UCD
end program heat3D
FEM3D 148
SOLVE11
module SOLVER11
contains
subroutine SOLVE11
use pfem_util
use solver_CG
implicit REAL*8 (A-H,O-Z)
integer :: ERROR, ICFLAG
character(len=char_length) :: BUF
data ICFLAG/0/
!C
!C +------------+
!C | PARAMETERs |
!C +------------+
!C===
ITER = pfemIarray(1) Max. Iterations for CG
RESID = pfemRarray(1) Convergence Criteria for CG
!C===
!C
!C +------------------+
!C | ITERATIVE solver |
!C +------------------+
!C===
call CG &
& ( N, NPLU, D, AMAT, index, item, B, X, RESID, ITER, ERROR )
ITERactual= ITER
!C===
end subroutine SOLVE11
end module SOLVER11
FEM3D 149
Preconditioned CG Solver
Diagonal Scaling/Point Jacobi Preconditioning
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
FEM3D 150
CG Solver (1/6)
module solver_CG
contains
subroutine CG &
& (N, NPLU, D, AMAT, index, item, B, X, RESID, ITER, ERROR)
implicit REAL*8(A-H,O-Z)
include 'precision.inc'
integer(kind=kint), parameter :: R= 1
integer(kind=kint), parameter :: Z= 2
integer(kind=kint), parameter :: Q= 2
integer(kind=kint), parameter :: P= 3
integer(kind=kint), parameter :: DD= 4
integer(kind=kint ) :: MAXIT
real (kind=kreal) :: TOL, W, SS
FEM3D 152
CG Solver (1/6)
module solver_CG
contains
WW(i,1)= WW(i,R) ⇒ {r} Compute r(0)= b-[A]x(0)
subroutine CG for i= 1, 2,& …
WW(i,2)=
& (N, NPLU,WW(i,Z)
D, AMAT, index,⇒ {z}
item, B, X, RESID, ITER, ERROR)
solve [M]z(i-1)= r(i-1)
WW(i,2)= WW(i,Q) ⇒ {q}
implicit REAL*8(A-H,O-Z) i-1= r(i-1) z(i-1)
WW(i,3)= WW(i,P) ⇒ {p}
include 'precision.inc' if i=1
p(1)= z(0)
WW(i,4)= WW(i,DD)
integer(kind=kint ⇒ 1/{D}
), intent(in):: N, NPLU
else
integer(kind=kint ), intent(inout):: ITER, ERROR
real (kind=kreal), intent(inout):: RESID i-1= i-1/i-2
real(kind=kreal), dimension(N) , intent(inout):: B, X, Dp(i)= z(i-1) + (i-1)
i-1 p
real(kind=kreal), dimension(NPLU), intent(inout):: AMAT
integer(kind=kint ), dimension(0:N ),intent(in) ::
endif
index
(i)= [A]p(i)
integer(kind=kint ), dimension(NPLU),intent(in) :: itemq
i = i-1/p(i)q(i)
real(kind=kreal), dimension(:,:), allocatable ::x(i)
WW = x(i-1) + p(i)
i
integer(kind=kint), parameter :: R= 1
(i)
r = r (i-1) - iq(i)
integer(kind=kint), parameter :: Z= 2 check convergence |r|
integer(kind=kint), parameter :: Q= 2 end
integer(kind=kint), parameter :: P= 3
integer(kind=kint), parameter :: DD= 4
integer(kind=kint ) :: MAXIT
real (kind=kreal) :: TOL, W, SS
FEM3D 153
CG Solver (2/6)
!C
!C +-------+
!C | INIT. | WW(i,1)= WW(i,R) ⇒ {r}
!C +-------+
!C===
WW(i,2)= WW(i,Z) ⇒ {z}
ERROR= 0 WW(i,2)= WW(i,Q) ⇒ {q}
allocate (WW(N,4))
MAXIT = ITER WW(i,3)= WW(i,P) ⇒ {p}
TOL = RESID
X = 0.d0
WW(i,4)= WW(i,DD) ⇒ 1/{D}
!C===
!C +-----------------------+
!C | {r0}= {b} - [A]{xini} |
!C +-----------------------+
!C===
do j= 1, N
WW(j,DD)= 1.d0/D(j) Reciprocal numbers (逆数)of diagonal
WVAL= B(j) - D(j)*X(j) components are stored in WW(i,DD).
do k= index(j-1)+1, index(j) Computational cost for division is
i= item(k)
WVAL= WVAL - AMAT(k)*X(i)
usually expensive.
enddo
WW(j,R)= WVAL
enddo
FEM3D 154
CG Solver (2/6)
!C
!C +-------+
!C | INIT. | Compute r(0)= b-[A]x(0)
!C +-------+ for i= 1, 2, …
!C=== solve [M]z(i-1)= r(i-1)
ERROR= 0
allocate (WW(N,4))
i-1= r(i-1) z(i-1)
MAXIT = ITER if i=1
TOL = RESID p(1)= z(0)
X = 0.d0 else
!C===
i-1= i-1/i-2
!C +-----------------------+ p(i)= z(i-1) + i-1 p(i-1)
!C | {r0}= {b} - [A]{xini} | endif
!C +-----------------------+
q(i)= [A]p(i)
!C===
do j= 1, N i = i-1/p(i)q(i)
WW(j,DD)= 1.d0/D(j) x(i)= x(i-1) + ip(i)
WVAL= B(j) - D(j)*X(j) r(i)= r(i-1) - iq(i)
do k= index(j-1)+1, index(j)
i= item(k) check convergence |r|
WVAL= WVAL - AMAT(k)*X(i) end
enddo
WW(j,R)= WVAL
enddo
FEM3D 155
CG Solver (3/6)
BNRM20= 0.d0
do i= 1, N
BNRM2=|b|2
BNRM20= BNRM20 + B(i)**2
enddo for convergence criteria
of CG solvers
BNRM2= BNRM20
do iter= 1, MAXIT
!C
!C************************************************* Conjugate Gradient Iteration
!C
!C +----------------+
!C | {z}= [Minv]{r} |
!C +----------------+
!C===
do i= 1, N
WW(i,Z)= WW(i,R) * WW(i,DD)
enddo
!C===
FEM3D 156
CG Solver (3/6)
BNRM20= 0.d0
do i= 1, N Compute r(0)= b-[A]x(0)
BNRM20= BNRM20 + B(i)**2
for i= 1, 2, …
enddo
solve [M]z(i-1)= r(i-1)
BNRM2= BNRM20 i-1= r(i-1) z(i-1)
if i=1
if (BNRM2.eq.0.d0) BNRM2= 1.d0
ITER = 0 p(1)= z(0)
!C=== else
i-1= i-1/i-2
do iter= 1, MAXIT
!C
p(i)= z(i-1) + i-1 p(i-1)
endif Gradient Iteration
!C************************************************* Conjugate
q(i)= [A]p(i)
!C i = i-1/p(i)q(i)
!C +----------------+
!C | {z}= [Minv]{r} | x(i)= x(i-1) + ip(i)
!C +----------------+ r(i)= r(i-1) - iq(i)
!C=== check convergence |r|
do i= 1, N
end
WW(i,Z)= WW(i,R) * WW(i,DD)
enddo
!C===
FEM3D 157
CG Solver (4/6)
!C
!C +---------------+ Compute r(0)= b-[A]x(0)
!C | {RHO}= {r}{z} |
for i= 1, 2, …
!C +---------------+
!C=== solve [M]z(i-1)= r(i-1)
RHO0= 0.d0 i-1= r(i-1) z(i-1)
do i= 1, N if i=1
RHO0= RHO0 + WW(i,R)*WW(i,Z)
enddo p(1)= z(0)
RHO= RHO0 else
!C=== i-1= i-1/i-2
!C +-----------------------------+
!C | {p} = {z} if ITER=1 |
p(i)= z(i-1) + i-1 p(i-1)
!C | BETA= RHO / RHO1 otherwise | endif
!C +-----------------------------+ q(i)= [A]p(i)
!C=== i = i-1/p(i)q(i)
if ( ITER.eq.1 ) then
do i= 1, N x(i)= x(i-1) + ip(i)
WW(i,P)= WW(i,Z) r(i)= r(i-1) - iq(i)
enddo check convergence |r|
else
end
BETA= RHO / RHO1
do i= 1, N
WW(i,P)= WW(i,Z) + BETA*WW(i,P)
enddo
endif
!C===
FEM3D 158
CG Solver (5/6)
!C +-------------+
!C | {q}= [A]{p} | Compute r(0)= b-[A]x(0)
!C +-------------+
for i= 1, 2, …
!C===
do j= 1, N solve [M]z(i-1)= r(i-1)
WVAL= D(j)*WW(j,P) i-1= r(i-1) z(i-1)
do k= index(j-1)+1, index(j) if i=1
i= item(k)
WVAL= WVAL + AMAT(k)*WW(i,P) p(1)= z(0)
enddo else
WW(j,Q)= WVAL i-1= i-1/i-2
enddo
!C===
p(i)= z(i-1) + i-1 p(i-1)
!C +---------------------+ endif
!C | ALPHA= RHO / {p}{q} | q(i)= [A]p(i)
!C +---------------------+ i = i-1/p(i)q(i)
!C===
C10= 0.d0 x(i)= x(i-1) + ip(i)
do i= 1, N r(i)= r(i-1) - iq(i)
C10= C10 + WW(i,P)*WW(i,Q) check convergence |r|
enddo
end
C1= C1
ALPHA= RHO / C1
!C===
FEM3D 159
CG Solver (6/6)
!C
!C +----------------------+ Compute r(0)= b-[A]x(0)
!C | {x}= {x} + ALPHA*{p} |
for i= 1, 2, …
!C | {r}= {r} - ALPHA*{q} |
!C +----------------------+ solve [M]z(i-1)= r(i-1)
!C=== i-1= r(i-1) z(i-1)
do i= 1, N if i=1
X(i) = X (i) + ALPHA * WW(i,P)
WW(i,R)= WW(i,R) - ALPHA * WW(i,Q) p(1)= z(0)
enddo else
!C=== i-1= i-1/i-2
DNRM20= 0.d0
do i= 1, N
p(i)= z(i-1) + i-1 p(i-1)
DNRM20= DNRM20 + WW(i,R)**2 endif
enddo q(i)= [A]p(i)
DNRM2= DNRM20 i = i-1/p(i)q(i)
RESID= dsqrt(DNRM2/BNRM2)
x(i)= x(i-1) + ip(i)
if ( RESID.le.TOL ) exit r(i)= r(i-1) - iq(i)
if ( ITER .eq.MAXIT ) ERROR= -300 check convergence |r|
end
RHO1 = RHO
enddo
!C===
FEM3D 160
CG Solver (6/6)
!C
!C +----------------------+ Compute r(0)= b-[A]x(0)
!C | {x}= {x} + ALPHA*{p} |
for i= 1, 2, …
!C | {r}= {r} - ALPHA*{q} |
!C +----------------------+ solve [M]z(i-1)= r(i-1)
!C=== i-1= r(i-1) z(i-1)
do i= 1, N if i=1
X(i) = X (i) + ALPHA * WW(i,P)
WW(i,R)= WW(i,R) - ALPHA * WW(i,Q) p(1)= z(0)
enddo else
!C=== i-1= i-1/i-2
DNRM20= 0.d0
do i= 1, N
p(i)= z(i-1) + i-1 p(i-1)
DNRM20= DNRM20 + WW(i,R)**2 endif
enddo q(i)= [A]p(i)
DNRM2= DNRM20 i = i-1/p(i)q(i)
RESID= dsqrt(DNRM2/BNRM2)
x(i)= x(i-1) + ip(i)
if ( RESID.le.TOL ) exit r(i)= r(i-1) - iq(i)
if ( ITER .eq.MAXIT ) ERROR= -300 check convergence |r|
end
RHO1 = RHO
enddo
!C=== DNorm2 r Ax b
Resid Tol
BNorm2 b b