Академический Документы
Профессиональный Документы
Культура Документы
Физико-механический институт
Высшая школа прикладной математики и вычислительной физики
Выполнил
студент гр. 5040301/10201 Ле Мань Дат ___________
Санкт-Петербург
2021
Оглавление
6. Заключение........................................................................................................40
7. Код в Fortran.......................................................................................................41
Список литературы...............................................................................................54
2
1. Краткая характеристика используемого подхода (МКО)
∂ ρφ
∫ ∂t
ⅆΩ+ ∑ ∫ ⃗n ∙ ⃗q ⅆs=∫ QⅆΩ ( 1.1 ) ,
k S
Ω k Ω
q⃗ =ρ ⃗
V ϕ−α ∇ φ (1.1)
3
контрольного объема находится одна (и только одна) точка «привязки»
искомого сеточного решения. В большинстве разработок, ориентированных
на решение трехмерных задач для областей сложной геометрии, в качестве
контрольного объема используются ячейки расчетной сетки: узлы сетки
располагаются в вершинах многогранника (для структурированных сеток –
гексаэдра, см. рис.1), сеточные линии идут вдоль его ребер, а значения
искомых величин приписываются геометрическому центру ячейки. [Error:
Reference source not found]
4
Рис. 2 Ячейка разностной сетки.
⃗
Sf =⃗
n f ⋅S f
N
1
Sf =∑ ( r⃗ i +1−⃗r o ) × ( ⃗r i−⃗r o )
⃗
i=1 2
→ ∑ 12 ( r⃗i +⃗
r i+1 ) li , i+1
r f = i=1 N
,
∑ li ,i+1
i=1
1⃗
Ω=∑ S ×( ⃗ ro )
r f −⃗
f 3 f
Для вычисления центра объема (ячейки):
5
∑ r f|S f|
→ →
→
f
r p=
∑ |S f|
→
( )
π π
cos sin
2 2
π π
- для поворота по часовой стрелке,
−sin cos
2 2
( )
π π T
cos sin
2 2
π π - для поворота против часовой стрелки.
−sin cos
2 2
→
Центры граней r f находятся как полсуммы координат узлов этой
грани:
→
1
r fi = ( x ( i , j )+ x ( i+1 , j ) ) ,
2
→
1
r fj = ( y (i , j)+ y (i, j+1))
2
Для вычисления объема ячейки представим ее в виде двух
треугольников и объем ячейки будем вычислять как сумму этих
треугольников. Воспользуемся следующей формулой:
→ → → →
Sf ⋅ r + Sf ⋅ r
Ω= i j
,
2
→
S f - вектор площади грани в направлении i,
i
→
S f - вектор площади грани в направлении j,
j
→ → →
r =r i+1 , j+1−r i , j - диагональ.
Центр объема произвольной ячейки вычисляется как центр тяжести
этой ячейки:
∑⃗
r Ω f Ωf
f
r p=
⃗
Ω
6
где ⃗
r Ωf – положение центра тяжести объема, построенного на грани f;
Ω f – объем пирамиды, опирающейся на грань f.
На границах достраиваем граничные ячейки. Значением центра
граничной ячейки будет значение в центре грани ячейки, для которой она
была построена.
∫ ∇ φ dΩ (3.1)
Ω
∫ ∇ φ dΩ=∫ ⃗n φ dσ (3.2)
Ω σ
∑ ⃗nf φ f S f =∑ φ f ⃗S f (3.5)
f f
φ f =β φ p+(1−β ) φN ,
|⃗
fN|
β=
|⃗
fP|+|⃗
fN |
∫ ∇ φ dΩ=¿ (3.6)
Ω
8
ячейки скошены, то этот метод дает сильную погрешность. Что бы этого
избежать используют метод Грина-Гаусса с итерациями.
φ f =φ M +¿
φ M =β φ P +(1−β)φ N
9
¿
∫ ∇ ⋅( V⃗ )dΩ=∫ n⃗ ⋅( ⃗V )dσ
Ω σ
∫ ⃗n ⋅(⃗V )dσ =∑ (⃗
V f ) ⋅ ⃗S f
σ f
где ⃗
V f вычисляется методом линейной интерполяцией.
Центральная схема
Получим формулу для вычисления дивергенции произведения
скалярного поля давления на векторное поле скорости - p ⃗
V , по методу
10
∫ ∇ ⋅( p ⃗V )dΩ=∫ ⃗n ⋅( p ⃗V )dσ (3.8)
Ω σ
∫ ⃗n ⋅ ( p V⃗ ) dσ =∑ ( p f ⃗
V f )⋅ ⃗S f
σ f
→
Величина V на грани находится с помощью линейной интерполяции:
⃗
V f =β ⃗
V p+ ( 1−β ) ⃗
VN
First OU
Для нахождения значения pf по схеме First Oder Upwind используем
следующее условие:
pf =
{
¿ p P , если⃗
V
⋅ ⃗S f ≥ 0
¿ p N , если⃗ ⋅ S
f
⃗f <0
Vf
}
11
Для вычисления величины p на внутренних гранях имеем P P. Если
грань внешняя, то строим противопоточную схему на границе. Предполагая
линейность изменения величины p, для граничных граней имеем при ⃗
V f ⋅ ⃗S f <0 :
Pf =P N =2 Pb−P P ,
12
обозначим d. Тогда X - произведение градиента на радиус вектор в точке d/2
будет вычисляться как:
X b/ 2=P p−P B
{
3
¿ X N = X b/ 2 + dX
2
¿ X N =X P+ 2 dX
Получаем:
X N =4 X b /2−3 X p
Pf =P N +4 (P P−Pb )−3 ¿
∫ ∇ ⋅ ( ∇ φ ) dΩ=∫ ⃗n ( ∇ φ ) dσ
Ω σ
13
∫ ⃗n ( ∇ φ ) dσ =∑ ( ∂∂ φn ) Sf
σ f f
( )
∂φ φ N −φ P
=
∂ n f |⃗ PN |
14
( φ P + φN )
−φ B
( )
∂φ
∂n p
=
2
d
( ∂∂ φn ) = 9( φ −φ 3)−(φ
B
P B
d
−φ )
N P
( ∂∂ φn ) = 53 (φ d−φ/2 )− 23 ( ∂∂nφ )
B
B P
∂ φ φ N −φP
=
∂ξ |⃗
PN|
15
∂φ
=( ∇ φ ) M ⋅ ξ⃗ = ( ∇ φ )M ⃗n +( ⃗ξ −⃗n ) ( ∇ φ ) M
∂ξ
∂ φ φ N −φP
= + ( n⃗ −ξ⃗ ) ( ∇ φ )M ,
∂n |⃗
PN|
где:
( ∇ φ ) M =β ¿
∫ ∇ × V⃗ dΩ=∫ ⃗n × ⃗V dσ
Ω σ
1 1
∑ ∫
Ω f S
V S f = ∑ ⃗S f × ⃗
n⃗ f × ⃗
Ω f
Vf
f
| |
i j k
⃗
S x S y S z =⃗S x ⃗
⃗ ⃗ V y − ⃗S y ⃗
Vx
⃗
Vx V⃗y V⃗z
1
∇× ⃗
V= ∑ ⃗S V⃗ − ⃗S ⃗V
Ω f x y y x
17
• блоки для вычисления пространственных операторов.
В главном блоке так же осуществляется чтение сетки и полей
скорости и давления, которые были получены с помощью программы Flos.
Градиент
Для градиента, посчитанным по методу Грина-Гаусса, решение с
машинной точностью достигается только для полинома первой степени. Для
полинома второй машинная точность не достигается на границах. Для
полинома третьей степеней машинная точность не достигается во всех
областях.
Максимальная
погрешность на
Функция, P Точное значение
границах (внутри
области)
x+y GradPx, GradPy= 1 (5.12599945E-06)
0.250087798
x2 + у2 GradPx = 2х, GradPy = 2у
(3.17891427E-05)
1.33570647
x3 + у3 GradPx = 3х2, GradPy = 3у2
(0.148161694)
18
A) GradPerrorX Б) GradPerrorY
Рис 8. Расчетное поле погрешности градиента для функции P(x,y)=x+y
A) GradPerrorX Б) GradPerrorY
Рис 9. Расчетное поле погрешности градиента для функции P(x,y)=x2+y2
A) GradPerrorX Б) GradPerrorY
Рис 10. Расчетное поле погрешности градиента для функции P(x,y)=x3+y3
Дивергенция скорости
Для дивергенции от поля скорости машинная точность достигается
для полинома первой степени. Для полинома второй машинная точность
19
теряется на границах. Для полинома третьей степеней машинная точность не
достигается во всех областях.
Максимальная
погрешность на
Функция, V Точное значение
границах (внутри
области)
Vx = 1+x, Vy = 1+y 2 (5.12599945E-06)
0.249968827
Vx = 1+x2, Vy = 1+y2 2x + 2y
(1.04308128E-05)
1.33332253
Vx = 1+x3, Vy = 1+y3 3(x2+ y2)
(0.148117751)
20
Рис 13. Расчетное поле погрешности дивергенции для полинома треьтей
степени
Дивергенция функции PV
Для дивергенции от поля скорости-давления рассматривалось три
случая: центральная схема, противопоточная схема первого порядка и
противопоточная схема второго порядка. Для центральной схемы машинная
точность теряется начиная с полинома третьей степени. Для FOU для
полинома второй степени. И для противопоточной схемы второго порядка
для полинома третьей степени.
Максимальная
Максимальная Максимальная
погрешность
погрешность погрешность
Функция Точное схемы Сentral на
схемы FOU на схемы SOU на
, PV значение границах
границах (внутри границах (внутри
(внутри области)
области) области)
P=x+y
Vx = 1, 2 (4.52995300E-06) (4.35113907E-06) (5.48362732E-06)
Vy = 1
P=x+y
3(x + y) 2.32556798E-02
Vx =1+ x, (3.87935324E-06) (3.91687627E-06)
+2 (2.04082411E-02)
Vy = 1+y
P=x+y
3(x2+ y2) 4.07437002E-03 1.24932267E-02 4.07437002E-03
Vx = 1+x ,
2
+4xy+2 (1.21583324E-03) (1.05731534E-02) (1.21571729E-03)
Vy =1+ y2
21
A) по схеме Central
A) по схеме Central
22
Б) по схеме FOU В) по схеме SOU
Рис 15. Расчетное поле погрешности дивергенции для полинома второй
степени
A) по схеме Central
Рис 17. Расчетное поле погрешности ротора для полинома первой степени
Рис 18. Расчетное поле погрешности ротора для полинома второй степени
24
Рис 19. Расчетное поле погрешности ротора для полинома третей степени
Лапласиан
Лапласиан от полинома первой степени обращается в ноль.
Рассмотрим полином второй степени. Здесь, машинная точность достигается.
Для полинома второй степени машинная точность теряется на границах но
достигается внутри ячейки. Для полинома больше степени машинная
точность теряется.
Максимальная
погрешность на
Функция, P Точное значение
границах (внутри
области)
Р = х2+у2 4 (7.36713409E-05)
0.333333194
Р = х3+у3 6(x+y)
(4.81605566E-05)
1.16666627
Р = х4+у4 12(x2+y2)
(7.40742236E-02)
25
Рис 20. Расчетное поле погрешности лапласиана для полинома второй
степени
26
5.2 Результаты расчета на исходной и измельченной сетках и
вычисление порядка точности метода
log
( N2
N1
() err
err 2 )
1
,
Максимальная Погрешность в
погрешность на соответствующей Порядок
Оператор Функция
измельченной точке на базовой точности
сетке сетке
Grad(P)x
P= x2 + у2 2.73417E-02 0.14816 1.54 ≈ 2
(Grad(P)y)
Div(V) Vx = 1+x3, 1.52 ≈ 2
2.79971E-02 0.14812
Vy = 1+y3
P=x+y,
Div(PV),
Vx = 1+x2, 1.36555E-04 1.21583E-03 1.99 ≈ 2
central
Vy =1+ y2
P=x+y,
Div(PV),
Vx = 1+x2, 3.66006E-03 1.05732E-02 0.97 ≈ 1
FOU
Vy =1+ y2
P=x+y,
Div(PV),
Vx = 1+x2, 1.36555E-04 1.21572E-03 1.99 ≈ 2
SOU
Vy =1+ y2
Vx = 1-y3,
Rot(V) 2.76326E-02 0.14814 1.52 ≈ 2
Vy = 1+x3
LapP Р = х4+у4 1.36046363E-02 7.40742236E-02 1.54 ≈ 2
27
5.3 Расчет на сетке со скошенными и неортогональными
ячейками. Анализ распределения ошибки (для разных линейных и
нелинейных функций). Тестирование поправок на скошенность и
неортогональность
А) GradPerrorX Б) GradPerrorY
Рис 23. Поле погрешности градиента функции P=x+y без поправки на
скошенность.
А) GradPerrorX Б) GradPerrorY
Рис 24. Поле погрешности градиента функции P=x+y с итерациями
28
Построим график зависимости погрешности градиента давления от
количества итераций метода Грина-Гаусса, полученный на скошенной сетке.
Из графика видно, что машинная точность достигается за 4 итераций и с
увеличением итераций остается неизменной.
29
А) GradPerrorX Б) GradPerrorY
Рис 26. Поле погрешности градиента от функции P=x2+y2 без итераций
А) GradPerrorX Б) GradPerrorY
Рис 27 Поле погрешности градиента от функции P=x2+y2 с итерациями
30
А) Линейная функция Б) Нелинейная функция
Рис 29. Поле погрешности дивергенции на скошенность (схема FOU)
Применим схему со вторым порядком точности SOU. Видим, что
погрешность сильно уменьшилась.
31
А) Линейная функция Б) Нелинейная функция
Рис 31. Поле погрешности ротора от линейной функции и нелинейной
Рис 32. Поле погрешности лапласиана от полинома второй степени без учета
поправки с градиентом, посчитанным по методу Грина-Гаусса без итераций
32
Рис 34. Поле погрешности лапласиана от полинома второй степени с учетом
поправки и градиентом, посчитанным по методу Грина-Гаусса с итерациями
33
Рис 35. Сходимость решения
34
Рис 37. Поле компоненты скорости Vx (Flos)
35
36
Рис 39. Поля скорости и давления считаные в программе.
37
Рис 40. Поле градиента давления по X и по Y
38
Рис 41. Поле дивергенция скорости
39
Рис 43. Поле лапласиана давления
6. Заключение
40
7. Код в Fortran
MAIN
Program Main
character(*), parameter:: InputFile='input.txt',OutputFile='data1.dat' ! names of input and
output files
character MeshFile*30 ! name of file with computational mesh
integer, parameter:: IO = 12 ! input-output unit
real,allocatable,dimension(:,:):: X,Y,P,CellVolume,DivV,DivVError,rotV,LapP,&
DivVExact,rotVExact,rotVError,LapPError,LapPExact !scalar arrays
real,allocatable,dimension(:,:,:):: CellCenter, IFaceCenter, IFaceVector, JFaceCenter,
JFaceVector, GradP, GradPError, V ! vector arrays
real,allocatable,dimension(:,:,:):: GradPExact
!=== READ NODES NUMBER (NI,NJ) FROM FILE WITH MESH ===
WRITE(*,*) 'Read nodes number from file: ', MeshFile
OPEN(IO,FILE = MeshFile)
READ(IO,*) NI,NJ
WRITE(*,*) 'NI, NJ = ',NI,NJ
CalcMetric
SUBROUTINE
B_CalcMetric(NI,NJ,X,Y,CellCenter,CellVolume,IFaceCenter,IFaceVector,JFaceCenter,JFaceV
ector)
REAL X(NI,NJ),Y(NI,NJ),& ! input: nodes coordinates
CellCenter(0:NI,0:NJ,2),CellVolume(NI-1,NJ-1),& ! output: cell centers and volumes
IFaceCenter( NI,NJ-1,2),IFaceVector(NI,NJ-1,2),& ! ace centers and vectors for I-faces
JFaceCenter( NI-1,NJ,2),JFaceVector(NI-1,NJ,2) ! face centers and vectors for J-faces
REAL r(2)
!=== FACE CENTERS AND FACE VECTORS ===
! I-DIRECTION
DO J = 1,NJ-1
DO I = 1,NI
r(1) = X(I,J+1) - X(I,J) ! r = vector from one node to another
43
r(2) = Y(I,J+1) - Y(I,J)
IFaceVector(I,J,1) = r(2) ! IFaceVector = r rotated on 90 degree
IFaceVector(I,J,2) =-r(1) ! IFaceVector directed to increasing I-index
IFaceCenter(I,J,1) = 0.5*(X(i,j)+x(i,j+1))
IFaceCenter(I,J,2) = 0.5*(Y(i,j)+Y(i,j+1))
ENDDO
ENDDO
! J-DIRECTION
DO J = 1,NJ
DO I = 1,NI-1
r(1) = X(I+1,J) - X(I,J) ! r = vector from one node to another
r(2) = Y(I+1,J) - Y(I,J)
JFaceVector(I,J,1) =-r(2) ! JFaceVector = r rotated on -90 degree
JFaceVector(I,J,2) = r(1) ! JFaceVector directed to increasing J-index
JFaceCenter(I,J,1) = 0.5*(X(i,j)+x(i+1,j))
JFaceCenter(I,J,2) = 0.5*(Y(i,j)+Y(i+1,j))
ENDDO
ENDDO
! J-BOUNDARIES -----------------------------------------------------
DO NBOUND = 1,2
IF (NBOUND.EQ.1) THEN
JBOUND = 1; JOUT = 0
ELSE
JBOUND = NJ; JOUT = NJ
ENDIF
DO I = 1,NI-1
CellCenter(I,JOUT,:) = JFaceCenter(I,JBOUND,:)
ENDDO
ENDDO
END SUBROUTINE
Subroutine
B_CalcGradient(NI,NJ,P,GradP,Cellvolume,Cellcenter,IFaceCenter,JFaceCenter,IFaceVector,JF
aceVector)
INTEGER NI,NJ
REAL P(0:NI,0:NJ), GradP(0:NI,0:NJ,2)
REAL CellCenter(0:NI,0:NJ,2),CellVolume(NI-1,NJ-1),&
IFaceCenter(NI,NJ-1,2),IFaceVector(NI,NJ-1,2),&
JFaceCenter(NI-1,NJ,2),JFaceVector(NI-1,NJ,2)
! local
INTEGER I,J
REAL VOL,RC(2),RF(4,2),SF(4,2),NCELL(4,2),PFace(4)
! Cell Centers
Do I=1,NI-1
Do J=1,NJ-1
!Coordinates of the cell Centers, which surround the Cell Cennter under consideration
45
NCEll(1,:)=CellCenter(I-1,J,:)
NCELL(2,:)=CellCenter(I,J-1,:)
NCELL(3,:)=CellCenter(I+1,J,:)
NCELL(4,:)=CellCenter(I,J+1,:)
! Coordinates of the centers of the surroungding facecs
RF(1,:)=IFaceCenter(I,J,:)
RF(2,:)=JFaceCenter(I,J,:)
RF(3,:)=IFaceCenter(I+1,J,:)
RF(4,:)=JFaceCenter(I,J+1,:)
! Vectors at Face Centers
SF(1,:)=-IFaceVector(I,J,:)
SF(2,:)=-JFaceVector(I,J,:)
SF(3,:)=IFaceVector(I+1,J,:)
SF(4,:)=JFaceVector(I,J+1,:)
! Vollume & Coordinate of Centers
VOL=CellVolume(I,J)
RC(:)=CellCenter(I,J,:)
! Pressure at Face Centers
PFace(1)=RLinearInterp(norm2(RC(:)-RF(1,:)),norm2(NCELL(1,:)-RF(1,:)),P(I,J),P(I-
1,J))
PFace(2)=RLinearInterp(norm2(RC(:)-RF(2,:)),norm2(NCELL(2,:)-RF(2,:)),P(I,J),P(I,J-
1))
PFace(3)=RLinearInterp(norm2(RC(:)-RF(3,:)),norm2(NCELL(3,:)-
RF(3,:)),P(I,J),P(I+1,J))
PFace(4)=RLinearInterp(norm2(RC(:)-RF(4,:)),norm2(NCELL(4,:)-
RF(4,:)),P(I,J),P(I,J+1))
! Count Gradient at Cell Centers
GradP(I,J,:)=(PFace(1)*SF(1,:)+PFace(2)*SF(2,:)+PFace(3)*SF(3,:)+PFace(4)*SF(4,:))/VOL
ENDDO
ENDDO
End Subroutine
CalcGradient с итерациями
Subroutine
B_CalcGradient(NI,NJ,P,GradP,Cellvolume,Cellcenter,IFaceCenter,JFaceCenter,IFaceVector,JF
aceVector)
INTEGER NI,NJ
REAL P(0:NI,0:NJ), GradP(0:NI,0:NJ,2)
REAL CellCenter(0:NI,0:NJ,2),CellVolume(NI-1,NJ-1),&
IFaceCenter(NI,NJ-1,2),IFaceVector(NI,NJ-1,2),&
JFaceCenter(NI-1,NJ,2),JFaceVector(NI-1,NJ,2)
! local
46
INTEGER I,J,I1,J1
REAL VOL,RC(2),RF(4,2),SF(4,2),NCELL(4,2),PFace, GP(2), RN(2),PE,GPE(2),RE(2)
! Cell Centers
Do I=1,NI-1
Do J=1,NJ-1
!Coordinates of the cell Centers, which surround the Cell Cennter under consideration
NCEll(1,:)=[I-1,J]
NCELL(2,:)=[I,J-1]
NCELL(3,:)=[I+1,J]
NCELL(4,:)=[I,J+1]
! Coordinates of the centers of the surroungding facecs
RF(1,:)=IFaceCenter(I,J,:)
RF(2,:)=JFaceCenter(I,J,:)
RF(3,:)=IFaceCenter(I+1,J,:)
RF(4,:)=JFaceCenter(I,J+1,:)
! Vectors at Face Centers
SF(1,:)=-IFaceVector(I,J,:)
SF(2,:)=-JFaceVector(I,J,:)
SF(3,:)=IFaceVector(I+1,J,:)
SF(4,:)=JFaceVector(I,J+1,:)
! Vollume & Coordinate of Centers
VOL=CellVolume(I,J)
RC(:)=CellCenter(I,J,:)
! Pressure at Face Centers
GP(:)=0
Do IFace=1,4
I1=NCELL(IFace,1)
J1=NCELL(IFace,2)
RN(:)=Cellcenter(I1,J1,:)
PE=RLinearInterp(norm2(RC(:)-RF(IFace,:)),norm2(RN(:)-RF(IFace,:)),P(I,J),P(I1,J1))
RE(1)=RLinearInterp(norm2(RC(:)-RF(IFace,:)),norm2(RN(:)-
RF(IFace,:)),RC(1),RN(1))
RE(2)=RLinearInterp(norm2(RC(:)-RF(IFace,:)),norm2(RN(:)-
RF(IFace,:)),RC(2),RN(2))
GPE(1)=RLinearInterp(norm2(RC(:)-RF(IFace,:)),norm2(RN(:)-
RF(IFace,:)),GRadP(I,J,1),GradP(I1,J1,1))
GPE(2)=RLinearInterp(norm2(RC(:)-RF(IFace,:)),norm2(RN(:)-
RF(IFace,:)),GRadP(I,J,2),GradP(I1,J1,2))
PFace=PE+Dot_product(RF(IFace,:)-RE(:),GPE(:))
GP(:)=GP(:)+PFace*SF(IFace,:)
ENDDO
! Count Gradient at Cell Centers
GradP(I,J,:)=GP(:)/VOL
ENDDO
ENDDO
End Subroutine
CalcDivergence
47
Subroutine
B_CalcDiv(NI,NJ,V,DivV,GradP,Cellvolume,Cellcenter,IFaceCenter,JFaceCenter,IFaceVector,J
FaceVector,P)
INTEGER NI,NJ
REAL DivV(0:NI,0:NJ), V(0:NI,0:NJ,2),P(0:NI,0:NJ), GradP(0:NI,0:NJ,2)
REAL CellCenter(0:NI,0:NJ,2),CellVolume(NI-1,NJ-1),&
IFaceCenter(NI,NJ-1,2),IFaceVector(NI,NJ-1,2),&
JFaceCenter(NI-1,NJ,2),JFaceVector(NI-1,NJ,2)
! local
INTEGER I,J,IFACE,mode,I1,J1
REAL VOL,RC(2),RF(4,2),SF(4,2),NCELL(4,2),VFace(2),PFace,P1,P2,P3
! Cell Centers
Write(*,*)'Enter mode:'
Read(*,*) mode
Do I=1,NI-1
Do J=1,NJ-1
!Coordinates of the cell Centers, which surround the Cell Cennter under consideration
NCEll(1,:)=[I-1,J]
NCELL(2,:)=[I,J-1]
NCELL(3,:)=[I+1,J]
NCELL(4,:)=[I,J+1]
! Coordinates of the centers of the surroungding facecs
RF(1,:)=IFaceCenter(I,J,:)
RF(2,:)=JFaceCenter(I,J,:)
RF(3,:)=IFaceCenter(I+1,J,:)
RF(4,:)=JFaceCenter(I,J+1,:)
! Vectors at Face Centers
SF(1,:)=-IFaceVector(I,J,:)
SF(2,:)=-JFaceVector(I,J,:)
SF(3,:)=IFaceVector(I+1,J,:)
SF(4,:)=JFaceVector(I,J+1,:)
! Vollume & Coordinate of Centers
VOL=CellVolume(I,J)
RC(:)=CellCenter(I,J,:)
DivV(I,J)=0
Do IFACE=1,4
I1=NCELL(IFACE,1)
J1=NCELL(IFACE,2)
! Velocity at Face Centers
VFace(1)=RLinearInterp(norm2(RC(:)-RF(IFACE,:)),norm2(CellCenter(I1,J1,:)-
RF(IFACE,:)),V(I,J,1),V(I1,J1,1))
VFace(2)=RLinearInterp(norm2(RC(:)-RF(IFACE,:)),norm2(CellCenter(I1,J1,:)-
RF(IFACE,:)),V(I,J,2),V(I1,J1,2))
! Count Divergence at Cell Centers
Select Case(mode)
48
case(0)
DivV(I,J)=DivV(I,J)+Dot_product(VFace(:),SF(IFACE,:))
case(1)
PFace=RLinearInterp(norm2(RC(:)-RF(IFACE,:)),norm2(CellCenter(I1,J1,:)-
RF(IFACE,:)),P(I,J),P(I1,J1))
DivV(I,J)=DivV(I,J)+Dot_product(PFace*VFace(:),SF(IFACE,:))
case(2)
IF(Dot_product(SF(IFACE,:),VFace(:)).GE.0.0) then
PFace=P(I,J)
Else
PFace=P(I1,J1)
IF (norm2(CellCenter(I1,J1,:)-RF(IFACE,:)).lt.1e-6) PFace=2*P(I1,J1)-P(I,J)
ENDIF
DivV(I,J)=DivV(I,J)+Dot_product(PFace*VFace(:),SF(IFACE,:))
case(3)
IF(Dot_product(SF(IFACE,:),VFace(:)).GE.0.0) then
PFace=P(I,J)+DOT_PRODUCT(RF(IFACE,:)-CellCenter(I,J,:),GradP(I,J,:))
ELSE
PFace=P(I1,J1)+DOT_PRODUCT(RF(IFACE,:)-CellCenter(I1,J1,:),GradP(I1,J1,:))
IF (norm2(CellCenter(I1,J1,:)-RF(IFACE,:)).lt.1e-6) then
P1=2*P(I1,J1)-P(I,J)
P2=4*(P(I,J)-P(I1,J1))
P3=3*DOT_PRODUCT(GradP(I,J,:),CellCenter(I,J,:)-RF(IFACE,:))
PFace=P1+P2-P3
END IF
END IF
DivV(I,J)=DivV(I,J)+Dot_product(PFace*VFace(:),SF(IFACE,:))
END SELECT
ENDDO
DivV(I,J)=DivV(I,J)/VOL
ENDDO
ENDDO
End Subroutine
CalcRotor
Subroutine
B_CalcRotor(NI,NJ,V,rotV,Cellvolume,Cellcenter,IFaceCenter,JFaceCenter,IFaceVector,JFace
Vector)
INTEGER NI,NJ
REAL RotV(0:NI,0:NJ), V(0:NI,0:NJ,2)
REAL CellCenter(0:NI,0:NJ,2),CellVolume(NI-1,NJ-1),&
IFaceCenter(NI,NJ-1,2),IFaceVector(NI,NJ-1,2),&
JFaceCenter(NI-1,NJ,2),JFaceVector(NI-1,NJ,2)
! local
INTEGER I,J
REAL VOL,RC(2),RF(4,2),SF(4,2),NCELL(4,2),VFace(4,2)
49
! Cell Centers
Do I=1,NI-1
Do J=1,NJ-1
!Coordinates of the cell Centers, which surround the Cell Cennter under consideration
NCEll(1,:)=CellCenter(I-1,J,:)
NCELL(2,:)=CellCenter(I,J-1,:)
NCELL(3,:)=CellCenter(I+1,J,:)
NCELL(4,:)=CellCenter(I,J+1,:)
! Coordinates of the centers of the surroungding facecs
RF(1,:)=IFaceCenter(I,J,:)
RF(2,:)=JFaceCenter(I,J,:)
RF(3,:)=IFaceCenter(I+1,J,:)
RF(4,:)=JFaceCenter(I,J+1,:)
! Vectors at Face Centers
SF(1,:)=-IFaceVector(I,J,:)
SF(2,:)=-JFaceVector(I,J,:)
SF(3,:)=IFaceVector(I+1,J,:)
SF(4,:)=JFaceVector(I,J+1,:)
! Vollume & Coordinate of Centers
VOL=CellVolume(I,J)
RC(:)=CellCenter(I,J,:)
! Velocity at Face Centers
VFace(1,1)=RLinearInterp(norm2(RC(:)-RF(1,:)),norm2(NCELL(1,:)-
RF(1,:)),V(I,J,1),V(I-1,J,1))
VFace(1,2)=RLinearInterp(norm2(RC(:)-RF(1,:)),norm2(NCELL(1,:)-
RF(1,:)),V(I,J,2),V(I-1,J,2))
VFace(2,1)=RLinearInterp(norm2(RC(:)-RF(2,:)),norm2(NCELL(2,:)-
RF(2,:)),V(I,J,1),V(I,J-1,1))
VFace(2,2)=RLinearInterp(norm2(RC(:)-RF(2,:)),norm2(NCELL(2,:)-
RF(2,:)),V(I,J,2),V(I,J-1,2))
VFace(3,1)=RLinearInterp(norm2(RC(:)-RF(3,:)),norm2(NCELL(3,:)-
RF(3,:)),V(I,J,1),V(I+1,J,1))
VFace(3,2)=RLinearInterp(norm2(RC(:)-RF(3,:)),norm2(NCELL(3,:)-
RF(3,:)),V(I,J,2),V(I+1,J,2))
VFace(4,1)=RLinearInterp(norm2(RC(:)-RF(4,:)),norm2(NCELL(4,:)-
RF(4,:)),V(I,J,1),V(I,J+1,1))
VFace(4,2)=RLinearInterp(norm2(RC(:)-RF(4,:)),norm2(NCELL(4,:)-
RF(4,:)),V(I,J,2),V(I,J+1,2))
! Count Rotor at Cell Centers
RotV(I,J)=0
Do IFace=1,4
RotV(I,J)=RotV(I,J)+(VFace(IFace,2)*SF(IFace,1)-VFace(IFace,1)*SF(IFace,2))/VOL
ENDDO
ENDDO
ENDDO
End Subroutine
CalcLaplacian
50
Subroutine
B_CalcLap(NI,NJ,LapP,GradP,P,Cellvolume,Cellcenter,IFaceCenter,JFaceCenter,IFaceVector,J
FaceVector)
INTEGER NI,NJ
REAL LapP(0:NI,0:NJ), GradP(0:NI,0:NJ,2), P(0:NI,0:NJ)
REAL CellCenter(0:NI,0:NJ,2),CellVolume(NI-1,NJ-1),&
IFaceCenter(NI,NJ-1,2),IFaceVector(NI,NJ-1,2),&
JFaceCenter(NI-1,NJ,2),JFaceVector(NI-1,NJ,2)
! local
INTEGER I,J,IFACE,I1,J1
Real D
REAL VOL,RC(2),RF(4,2),SF(4,2),NCELL(4,2),PD, XN(2), XX(2), GPE(2)
! Cell Centers
Do I=1,NI-1
Do J=1,NJ-1
!Coordinates of the cell Centers, which surround the Cell Cennter under consideration
NCEll(1,:)=[I-1,J]
NCELL(2,:)=[I,J-1]
NCELL(3,:)=[I+1,J]
NCELL(4,:)=[I,J+1]
! Coordinates of the centers of the surroungding facecs
RF(1,:)=IFaceCenter(I,J,:)
RF(2,:)=JFaceCenter(I,J,:)
RF(3,:)=IFaceCenter(I+1,J,:)
RF(4,:)=JFaceCenter(I,J+1,:)
! Vectors at Face Centers
SF(1,:)=-IFaceVector(I,J,:)
SF(2,:)=-JFaceVector(I,J,:)
SF(3,:)=IFaceVector(I+1,J,:)
SF(4,:)=JFaceVector(I,J+1,:)
! Vollume & Coordinate of Centers
VOL=CellVolume(I,J)
RC(:)=CellCenter(I,J,:)
LapP(I,J)=0
Do IFACE=1,4
I1=NCELL(IFACE,1)
J1=NCELL(IFACE,2)
D=norm2(RC(:)-CellCenter(I1,J1,:))
PD=(P(I1,J1)-P(I,J))/D
XN(:)=SF(IFACE,:)/norm2(SF(IFACE,:))
!for skew
XX(:)=(CellCenter(I1,J1,:)-CellCenter(I,J,:))/D
GPE(1)=RLinearInterp(norm2(RC(:)-RF(IFace,:)),norm2(Cellcenter(I1,J1,:)-
RF(IFace,:)),GRadP(I,J,1),GradP(I1,J1,1))
51
GPE(2)=RLinearInterp(norm2(RC(:)-RF(IFace,:)),norm2(Cellcenter(I1,J1,:)-
RF(IFace,:)),GRadP(I,J,2),GradP(I1,J1,2))
IF (norm2(CellCenter(I1,J1,:)-RF(IFACE,:)).LT.1e-5) then
PD=5./3.*PD-2./3.*DOT_PRODUCT(GradP(I,J,:),XN(:))
ENDIF
!for skew
PD=PD+DOT_PRODUCT((XN(:)-XX(:)),GPE(:))
LapP(I,J)=LapP(I,J)+PD*norm2(SF(IFACE,:))
ENDDO
! Count Laplacian at Cell Centers
LapP(I,J)=LapP(I,J)/VOL
ENDDO
ENDDO
End Subroutine
Function
Function Pressure(X,Y)
Pressure = x**4+y**
End Function
Function RLinearInterp(d1,d2,x1,x2)
RLinearInterp =(x1*d2+x2*d1)/(d1+d2)
End Function
Function VelocityX(X)
VelocityX= 1+X**2
End Function
Function VelocityY(X)
VelocityY= 1+X**2
End Function
Function Graderror1(X)
Graderror1 = 2*X
End Function
Function Graderror2(X)
Graderror2= 3*(X**2)
End Function
Function Diverror1(X,Y)
Diverror1= 2*X+2*Y
End Function
Function Diverror2(X,Y)
Diverror2= 3*(X**2)+3*(Y**2)
End Function
Function Diverror3(X,Y)
Diverror3= 3*(X+Y)+2
End Function
Function Diverror4(X,Y)
52
Diverror4= 3*(X**2+Y**2)+4*X*Y+2
End Function
Function Roterror1(X,Y)
Roterror1= 2*(X+Y)
End Function
Function Roterror2(X,Y)
Roterror2= 3*(X**2+Y**2)
End Function
OutputFields
Subroutine
B_OutputFields(IO,NI,NJ,X,Y,P,GradP,GradPError,V,DivV,DivVError,rotV,LapP,rotVError,La
pPError)
Real,Dimension(NI,NJ):: X,Y
Real,Dimension(0:NI,0:NJ)::P, DivV, DivVError, rotV, lapP, rotVError,LapPError
Real,Dimension(0:NI,0:NJ,2)::GradP, GradPError, V
Write(IO,*) 'VARIABLES
="X","Y","P","GradPx","GradPy","GradPErrorx","GradPErrorY","Vx","Vy","LapPError","Div
VError","rotVError"'
Write(IO,*) 'ZONE I=',NI,', J=',NJ,', DATAPACKING=BLOCK, VARLOCATION=([3-
12]=CELLCENTERED)'
Write(IO,'(100F14.7)') X(1:NI,1:NJ)
Write(IO,'(100F14.7)') Y(1:NI,1:NJ)
Write(IO,'(100F14.7)') P(1:NI-1,1:NJ-1)
Write(IO,'(100F14.7)') GradP(1:NI-1,1:NJ-1,1)
Write(IO,'(100F14.7)') GradP(1:NI-1,1:NJ-1,2)
Write(IO,'(100F14.7)') GradPError(1:NI-1,1:NJ-1,1)
Write(IO,'(100F14.7)') GradPError(1:NI-1,1:NJ-1,2)
! Write(IO,'(100F14.7)') LapP(1:NI-1,1:NJ-1)
Write(IO,'(100F14.7)') V(1:NI-1,1:NJ-1,1)
Write(IO,'(100F14.7)') V(1:NI-1,1:NJ-1,2)
Write(IO,'(100F14.7)') LapPError(1:NI-1,1:NJ-1)
Write(IO,'(100F14.7)') DivVError(1:NI-1,1:NJ-1)
! Write(IO,'(100F14.7)') RotV(1:NI-1,1:NJ-1)
Write(IO,'(100F14.7)') rotVError(1:NI-1,1:NJ-1)
! Write(IO,'(100F14.7)') DivV(1:NI-1,1:NJ-1)
End Subroutine
Список литературы
53
1. Е. М. Смирнов, Д.К. Зайцев. Метод конечных объемов в
приложении к задачам гидрогазодинамики и теплообмена в областях
сложной геометрии. Научнотехнические ведомости 2’ 2004 Проблемы
турбулентности и вычислительная гидродинамика (к 70-летию кафедры
«Гидроаэродинамика»)
54