Численное решение краевых задач. Учебно-методическое пособие
.pdfsi1=hy2/(2*(hx2+hy2))
si2=hx2/(2*(hx2+hy2))
si3=hx2*hy2/(2*(hx2+hy2))
itmax=10000 eps=1e-6
omega=2./(1.+sin(pi/Nx)) print*,' hx=',hx,' hy=',hy
print*,' itmax=',itmax,' eps=',eps do i=1,Nx
x(i)=(i-1)*hx end do
do j=1,Ny y(j)=(j-1)*hy end do
v=0 ! начальное приближение do j=1,Ny
v(1,j)=sin(pi*y(j)) ! левое ГУ v(Nx,j)=-sin(pi*y(j)) ! правое ГУ end do
do i=1,Nx
v(i,1)=0.0 ! нижнее ГУ v(i,Ny)=0.0 ! верхнее ГУ end do
do i=1,Nx ! точное решение do j=1,Ny u(i,j)=uex(x(i),y(j))
end do end do
!---------------------------------------
call Jacobi(Nx,Ny,x,y,v,itmax,eps) !call Zeidel(Nx,Ny,x,y,v,itmax,eps)
!call Relax(Nx,Ny,x,y,v,itmax,eps,omega) !---------------------------------------
del=sqrt(hx*hy*sum((u-v)*(u-v))) !L2-погрешность print*,' del=',del
Ny2=Ny/2+1
write(10,'(3(1x,1pe11.4))')(x(i),v(i,Ny2),u(i,Ny2),i=1,Nx) ! графика
xgmin=0; xgmax=dble(xmax) ygmin=minval(u); ygmax=maxval(u) call GrafInit(1,'Puasson')
call Axis('x','u,v',0,1d-3)
51
call GRID(5,8,0)
call Plot(dble(x),dble(u(:,Ny2)),1,0,1) call Plot(dble(x),dble(v(:,Ny2)),2,0,1) end
function f(x,y) common /b2/pi
f=-2.*pi**2*cos(pi*x)*sin(pi*y) end
function uex(x,y) common /b2/pi uex=cos(pi*x)*sin(pi*y) end
Результаты:
hx= 0.1000000 hy= 0.1000000
itmax= |
10000 eps= 1.0000000E-06 |
Jacobi: |
|
it# |
92 dv= 8.9406967E-07 |
del= 1.4024171E-03
52
3.Напишите процедуры «Zeidel» и «Relax», реализующие методы
(5)и (6). Обращения к указанным процедурам присутствуют в программе в закомментированном виде. Добейтесь совпадения результатов расчетов с тестовым примером.
4.Для всех методов исследуйте зависимость от шага сетки
h hx hy при N 11, 21, 41.
4. Определите влияние коэффициента на скорость сходимости метода (6), задавая 1, 1.2, 1.4, 1.6, 1.8, и найдите оптимальное значение, при котором число итераций наименьшее. Насколько существенно
оно отличается от теоретического значения opt 2/ 1 sin( / N) ?
МКО (ПАКЕТ ANSYS)
1.Создание проекта (программа Workbench). После запуска Workbench раскройте в «Toolbox» закладку «Analyses Systems» и выберите «Fluid Flow (Fluent)» (двойной клик «мыши», либо перетаскивание на поле «Project Schematic»). Сохраните проект (кнопка «Save») в специально созданной рабочей папке. Путь к рабочей папке не должен содержать букв кириллицы.
2.Создание геометрической модели расчетной области (DesignModeler). Выполните двойной клик «мыши» по пункту «Geometry» в схеме проекта. При первом запуске выберите единицу измерения длины
(«Meter» по умолчанию). Далее создайте на плоскости xy чертеж: вы-
делите «XYPlane», нажмите кнопку «New Sketch»
; на закладке
«Scetching» с помощью инструментов «Draw» -> «Rectangle» и «Dimensions» -> «Horizontal», «Vertical» начертите прямоугольную об-
ласть длиной l (0 x l ) и высотой l (0 y l ). (Для тестовой задачи
l 1 м.) Затем переключитесь на закладку «Modeling» и выберите пункт меню «Concept» -> «Surfaces From Scetches» и нажмите кнопку
. Сохраните проект и выйдите из DesignModeler.
3. Генерация расчетной сетки и задание границ (Meshing). Выполните двойной клик «мыши» по пункту «Mesh» в схеме проекта. В дре-
вовидном списке выберите «Mesh» (ПКМ)-> «Insert»-> «Sizing». Выде-
лите нижнюю и верхнюю горизонтальные границы области (при этом соответствующий фильтр выделения объектов должен быть активным:
53
) и в окне свойств нажмите «Apply». Также в окне
свойств задайте «Type» = «Number of Divisions», «Number of Divisions» = 20, «Behavior» = «Hard». Аналогичные действия выполните для левой и правой вертикальных границ, причем задайте число ячеек
«Number of Divisions» = 20. Далее выполните «Mesh» -> «Insert» -> «Mapped Face Meshing» и в свойствах укажите область для «Geometry».
Затем нажмите
. Будет сгенерирована конечно-объем- ная сетка с ячейками прямоугольной формы. Теперь создайте граничные поверхности: выделяя граничную линию, вызывайте контекстное меню (ПКМ) -> «Create Named Selection». Левая граница – «left», пра-
вая – «right», нижняя – «bot», верхняя – «top». Перед сохранением про-
екта выполните
.
4. Задание физической модели, начальных и граничных условий, параметров численного алгоритма (Fluent). Запуск препроцессора осуществляется с помощью кнопки «Setup» в дереве проекта.
Впункте «General» раздела «Solution Setup» выберите опцию «Time»= «Steady» для решения стационарной задачи.
Впункте «Models» подключите уравнение энергии «Energy – On».
Впункте «Materials» задайте свойства материала по умолчанию
«aluminum». Например, для тестовой задачи «Density (kg/m3)» = «1», «Cp (Specific Heat) (j/kg-k)» = «1», «Thermal Conductivity (w/m-k)» = «1». Нажмите кнопки «Change/Create» и «Close».
Создайте в каталоге проекта файл «puasson1_udf.с», содержащий пользовательские функции (UDF) для расчета граничных распределений температуры («left_temp», «right_temp») и источника тепла
(«heat_source»). Содержимое файла «puasson1_udf.с» для тестовой за-
дачи:
#include "udf.h" DEFINE_PROFILE(left_temp,thread,position)
{
real x[ND_ND]; real y;
real PI=4.*atan(1.); face_t f; begin_f_loop(f,thread)
{
54
F_CENTROID(x, f, thread); y = x[1];
F_PROFILE(f, thread, position) =300.+sin(PI*y);
}
end_f_loop(f, thread)
}
DEFINE_PROFILE(right_temp,thread,position)
{
real x[ND_ND]; real y;
real PI=4.*atan(1.); face_t f; begin_f_loop(f,thread)
{
F_CENTROID(x, f, thread); y = x[1];
F_PROFILE(f, thread, position) =300.-sin(PI*y);
}
end_f_loop(f, thread)
}
DEFINE_SOURCE(heat_source,cell,thread,dS,eqn)
{
real xc[ND_ND]; real source;
real PI=4.*atan(1.);
C_CENTROID (xc, cell, thread);
source = 2*PI*PI*cos(PI*xc[0])*sin(PI*xc[1]); dS[eqn] = 0.;
return source;
}
Затем выполните команду «Define» -> «User-Defined» -> «Functions» -> «Interpreted…». В окне «Interpreted UDFs» укажите на источниковый файл «puasson1_udf.с» с помощью кнопки «Browse…», затем нажмите «Interpret» и при отсутствии ошибок «Close». Пользовательские функции будут добавлены в расчетный модуль.
В пункте «Cell Zone Conditions» установите тип «Type»=«solid» для зоны «surface_body», затем нажмите кнопку «Edit», в появившемся окне выберите в списке «Material Name» нужный материал. Активируйте
55
источники тепла «Source Terms». Далее переключитесь на закладку
«Source Terms»-> «Edit», установите число источников «Number of Energy sources»=«1», выберите из списка «udf heat_source» и нажмите
«OK». Подтвердите выбор кнопкой «OK».
Впункте «Boundary Conditions» выберите в списке зон «Zone» ле-
вую границу «left» и нажмите «Edit…». На закладке «Thermal» окна
«Wall» выберите «Temperature» в «Thermal Conditions», в списке заме-
ните «const» на «udf left_temp» и нажмите «OK». Аналогично задайте температуру на правой границе с помощью «udf right_temp».
Впункте «Monitors» раздела «Solution» выделите «Residuals» в списке «Residuals, Statistics and Force Monitors» и нажмите кнопку «Edit…». В окне «Residual Monitors» задайте абсолютную невязку «1e- 8» для уравнения энергии «energy» и нажмите «OK».
Впункте «Solution Initialization» выберите «Hybrid Initialization» и
нажмите кнопку «Initialize». Будут заданы начальные условия.
С помощью «Define» -> «Custom Field Functions…» cоздайте функ-
цию избыточной температуры «temp» с выражением «temperature-300».
Сохраните проект: «File» -> «Save Project».
5. Выполнение расчета (Fluent). В пункте «Run Calculation» задайте
100 в поле «Number of Iterations» и нажмите кнопку «Calculate». В тек-
стовом окне будет выдана история невязок решаемой системы уравнений, в графическом – история невязки уравнения энергии. Сохраните проект.
6. Анализ результатов (Fluent). В пункте «Graphics and Animations»
раздела «Results» выберите «Contours» в списке «Graphics» и нажмите кнопку «Set Up…». В окне «Contours» активируйте заливку цветом
«Filled» в столбце «Options», выберите «Custom Field Functions…» и «temp» в списках «Contours of» и нажмите кнопку «Display». В графи-
ческом окне отобразится цветовая заливка поля избыточной температуры. Поменяйте число уровней заливки «Levels» на «40» и снова нажмите «Display».
Впункте «Plots» раздела «Results» выберите «XY Plot» в списке «Plots» и нажмите кнопку «Set Up…». Выберите: направление постро-
ения графика «Plot Direction X» = «1»; в списке «Y Axis Function» – «Temperature…», «Static temperature»; в списке «X Axis Function» – «Direction Vector». Создайте прямую линию y = 0.5: в списке «New Surface» выберите «Line/Rake…», в окне «Line/Rake Surface» задайте
56
координаты концевых точек (x0, y0 ) и (x1, y1 ), в поле «New Surface
Name» введите «y=0.5» и нажмите кнопки «Create» и «Close». Для кон-
троля выведите созданную линию на экран: выберите пункт меню
«Display» -> «Mesh», в окне «Mesh Display» дополнительно выделите новую поверхность «y = 0.5», снимите выделение с «interior-sur- face_body» и нажмите кнопки «Display» и «Close». В списке «Surfaces» окна «Solution XY Plot» выберите «y = 0.5». Нажмите кнопку «Plot». По-
меняйтеспособотображениякривойспомощьюкнопки«Curves…»,последующего выбора из списка «Pattern» в появившемся окне «Curves – Solution XY Plot» соединения точек сплошными линиями «---» с уста-
новкой цвета «Color» = «background» и нажатия кнопок «Apply», «Close», а затем «Plot» в исходном окне.
Сохраните построенный график в виде jpeg-файла с помощью
кнопки «Save Picture»
. Сохраните полученные данные в виде текстового файла с помощью опции «Write to File».
Сохраните проект и закройте Fluent. Сохраните проект в среде
«Workbench».
7. Анализ результатов (CFD-Post). Выполните двойной клик
«мыши» на пункте «Results» в «Project Schematic». Результаты расчета загрузятся в постпроцессор «CFD-Post».
57
В пункте «User Locations and Plots»древовидного списка на закладке
«Outline» вызовите контекстное меню (ПКМ) «Insert» -> «Contour».
В свойствах контурных линий «Details of Contour 1» на закладке «Geometry» установите «Locations» = «symmetry 1», «Variable» = «Temperature», «# of Contours» = «11». На закладке «Labels» активируйте «Show Numbers». На закладке «Render» деактивируйте «Show Contour Bands».
Нажмите кнопку «Apply». Сохраните картинку в виде графического файла «contour.png» с белым фоном (активируйте «White Background» в окне «Save Picture»).
58
Сохраните проект и закройте «CFD-Post». Сохраните проект в среде
«Workbench».
Проведите расчеты вашей задачи для числа ячеек N 1 10, 20, 40. Сопоставляя полученные при этом графики избыточной температуры u(x,y 0.5), убедитесь в наличии сеточной сходимости (уменьшении
влияния сетки на результаты при ее сгущении).
Постройте и сравните графики точного и приближенных решения, полученных при количестве узлов N 21 с помощью МКР и МКО. Сде-
лайте общие выводы.
ВОПРОСЫ К РАЗДЕЛУ 5
1.Записать разностную схему и формулу метода Якоби для уравнения Пуассона на неравномерной сетке.
2.Записать разностную схему и формулу метода Зейделя для уравнения Пуассона с линейным (по решению) источником.
3.ЗаписатьразностнуюсхемуиформулуметодаЯкобидлятрехмерного уравнения Пуассона.
4.Записать разностную схему и формулу метода Зейделя для уравнения Пуассона при аппроксимации двух производных по формулам четвертого порядка.
5.Записать разностную схему для уравнения Пуассона в цилиндрических координатах (r, z) с граничным условием (ГУ) третьего рода на боковой границе, ГУ первого рода – на левой и ГУ второго рода – на правой.
6.Записать разностную схему для уравнения Пуассона в цилиндрических координатах (r, φ) с ГУ второго рода на внешней и внутренней границе и ГУ третьего рода – на радиальных.
59
ПРИЛОЖЕНИЕ
Ниже приведен текст модуля «Graflib» для написания Фортран-программ с графическим выводом результатов. Модуль использует графическую библио-
теку компилятора Compaq Visual Fortran 6.0.
module GRAFLIB use dflib
real*8 xgmin,xgmax,ygmin,ygmax,zgmin,zgmax common /gr1/ xgmin,xgmax,ygmin,ygmax,zgmin,zgmax type (wxycoord) wxy; type(qwinfo)qww
contains
subroutine GRAFINIT(win,tit) ! инициализация графики integer win; character(*) tit qww.type=2;ii=setwsizeqq(QWIN$FRAMEWINDOW,qww) open(win,file='user',title=tit);!ii=clickmenuqq(QWIN$TILE) call setviewport(10,10,810,810)
dxg=xgmax-xgmin; dyg=ygmax-ygmin xgmin1=xgmin-0.1*dxg; xgmax1=xgmax+0.1*dxg ygmin1=ygmin-0.1*dyg; ygmax1=ygmax+0.1*dyg ii=setwindow(.true.,xgmin1,ygmax1,xgmax1,ygmin1) ncol=setcolor(15) ! задание текущего цвета (0...15)
ii=rectangle_w(3,xgmin1,ygmax1,xgmax1,ygmin1) ! заливка окна if(initializefonts()<0) stop 'fonts not found!' ! инициализация шрифтов if(setfont('t''Times New Roman Cyr''h30''b')==0) stop 'font not set!' end subroutine GRAFINIT
subroutine AXIS(xax,yax,icol,dr) ! построение 2D-осей character(*) xax,yax; real*8 dr,drx,dry,dxg,dyg ncol=setcolor(icol); dxg=xgmax-xgmin; dyg=ygmax-ygmin drx=dr*(dyg/dxg); dry=dr
60
