Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Численное решение краевых задач. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
1 Мб
Скачать

si1=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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]