Карченков Дмитрий, Программная реализация метода конечных

advertisement
Карченков Дмитрий, студент
Научный руководитель доцент Коноваленков В.С.
Визуализация
Информатика и кибернетика
Программная реализация метода конечных разностей в задачах визуализации
данных
(на примере метода конечных разностей)
2012
Аннотация
научной работы под девизом «Визуализация»
Рассматривается симулятор процесса нагрева изделий сложных форм,
реализованный при помощи метода конечных разностей. Может применяться как
в учебном процессе, так и при решении ряда практических задач.
Метод конечных разностей, визуализация данных, пользовательский
интерфейс, программные средства.
2
Содержание
1. Введение.…………………………………………………………. 4
2. Формализация математической модели ………………………...5
3. Особенности реализации математической модели……………..8
4. Некоторые особенности применения метода конечных
разностей…………………………. ……………………………... 11
5. Программные средства…………………………. ………..……. 13
6. Выводы…………………………. ………………………………. 27
7. Список литературы…………………………. …………….……. 28
3
Введение
При моделировании физических процессов часто возникает необходимость
визуализации протекания процесса в реальном времени (замедленном и
ускоренном), что дает более глубокое представление как о самом процессе, так и
промежуточных его стадиях. Определенный интерес представляет собой
анимация процесса нагрева
изделий (тел) сложных форм из различных
материалов, получение снимков “фотографий” протекания процесса т.е. карт
распределения температур в сечениях изделия (рис.1).
Рис. 1. Визуализация распределение температур тел сложной формы
Следует отметить тот факт, что при решении задач оптимизации процесса
нагрева особое место отводится определению мест расположения источников
нагрева и определение их параметров.
Целью настоящей работы является разработка Windows-приложения
(симулятора нагрева), имитирующего процесс нагрева изделий сложных форм,
изготовленных из различных материалов.
4
Формализация математической модели
Известно [1, 2], что механизм теплообмена в материале характеризуется
зависимостью температурного поля:
t  f ( x, y, z , ) ,
(1)
где:
t – температура, 0С;
x,y,z – координаты точки,
τ – момент времени, с.
Таким образом, температурное поле представляет собой совокупность
мгновенных значений температуры во всех точках тела в данный момент времени.
Уравнение (1) описывает нестационарное температурное поле. Если t   0 , то
температурное поле является стационарным:
t  f1 ( x, y, z) .
(2)
В неоднородном температурном поле можно выделить ряд изотермических
поверхностей, т.е. поверхностей с одинаковой температурой, изменяющейся при
переходе от одной поверхности к другой. Характер этого изменения, т.е. степень
неоднородности температурного поля, может быть определена понятием
градиента температуры. Следовательно, градиентом температуры является
вектор, направленный по нормали к изотермической поверхности в сторону
возрастания температуры и численно равный производной от температуры по

этому направлению. Если n0 – единичный вектор в направлении нормали, то
 t
gradt  n0
.
n
В декартовой системе координат вектор градиента может быть
записан в виде:
  t  t  t
gradt  i
 j
k
.
x
y
z
5
(3)
Основной закон теплопроводности Фурье определяет, что количество
теплоты dQ, проходящее через элемент изотермической поверхности dS за
промежуток времени dτ, пропорционально градиенту температуры:
dQ  
При этом,
t
dS d .
n
величина  
(4)
dQ
, равная количеству теплоты, проходящему
d
через элемент поверхности dS в единицу времени, является тепловым потоком.
Следовательно, плотность теплового потока определяет тепловой поток через
единицу поверхности: q 
направление
теплового
d
. Поскольку
dS
потока
q
– это величина векторная, и
противоположно
направлению
градиента
температуры, то в векторной форме теплопроводность определяется выражением
вида:


q  gradt ,
(5)
где: λ – коэффициент теплопроводности.
Наряду с теплопередачей, в материале в процессе нагрева участвует и
теплоотдача, которая определяет теплообмен между поверхностью твердого тела
и соприкасающейся с ней средой – теплоносителем. Основным законом
теплоотдачи является закон Ньютона-Рихмана
q   (tn  tcp ) ,
(6)
где:
t n – температура поверхности тела,
t cp – температура теплоносителя,
α – коэффициент теплоотдачи.
Уравнения (4), (5) дают возможность определить плотность теплового
потока и количество теплоты, проходящее через заданную поверхность в
заданный промежуток времени при известном температурном поле. Для
нахождения температурного поля t(x,y,z,τ) используется дифференциальное
6
уравнение теплопроводности. Оно выводится на основе первого закона
термодинамики т.е. закона сохранения энергии в тепловых процессах:
c
t

  div q  qv ,

(7)
где:
с – массовая удельная теплоемкость материала,
ρ – плотность материала,
qv– плотность распределенных в теле источников тепла.
С учетом основного закона теплопроводности Фурье уравнение (7) может
быть
представлено в виде:
c

t
 div (gradt )  qv .

(8)
Если величина коэффициента теплопроводности является постоянной, то ее
можно вынести из под знака div, и тогда, с учетом выражения (3) окончательный
вид уравнения теплопроводности будет представлен следующим образом:
c
t
 2t  2t  2t
  ( 2  2  2 )  qv .

x
y
z
(9)
В более простых задачах, чаще всего, внутренние источники тепла в теле
отсутствуют, т.е. qv=0. Тогда уравнение (9) обычно используют в виде:
t
 2t  2t  2t
 a( 2  2  2 ) ,

x
y
z
(10)
где:
a

– температуропроводность - теплофизическая характеристика
c
определяющая скорость изменения температурного поля в данном материале.
7
Особенности реализации математической модели
Следует отметить тот факт, что при высоких значениях a распределение
температуры в теле изменяется быстро, при низких – медленно.
Уравнения (8–10) являются уравнениями решения краевых задач, которые
могут быть реализованы только для конкретной постановки задачи, которая
включает в себя следующие условия:
–
геометрические
(размеры,
форма,
уравнение
поверхности,
ограничивающей тело);
– физические (все теплофизические характеристики материала тела и его
плотность);
– начальные (распределение температуры в теле как функция координат в
начальный момент времени: t  0  f ( x, y, z ) );
– граничные условия (на поверхности, ограничивающей тело, как функция
времени).
Граничные условия (ГУ) могут быть заданы несколькими способами:
– ГУ I рода подразумевают задание температуры на поверхности тела в виде
функции времени: t(x,y,z)пов=f(τ).
– ГУ II рода подразумевают задание на поверхности тела плотности
теплового потока: q(x,y,z)пов=qc(τ).
– ГУ III рода записываются в виде уравнения Ньютона-Рихмана, задающего
закон теплообмена между поверхностью тела и окружающей средой:
q(x,y,z)пов=  (tn  tcp ) .
На
практике
часто
применяется
упрощенные
методы
решения
температурных задач, которые сводятся к реализации стационарного режима, т.е.
установившегося режима, при котором температурное поле не меняется со
временем. Тогда дифференциальное уравнение теплопроводности представляется
в виде:
8
 2t  2t  2t


 0.
x 2 y 2 z 2
Проще всего получить аналитическое решение в виде простой одномерной
геометрии, например, плоская стенка, размеры которой по двум направлениям
(y,z) намного превышают размер в направлении х (толщина стенки изделия), тогда
d 2t
 0.
dx 2
(11)
Уравнение может быть решено для любого типа граничных условий при
задании толщины стенки, теплопроводности ее материала и коэффициента
теплоотдачи (для ГУ III рода). Если рассмотреть решение для ГУ I рода, т.е. на
одной поверхности (х=0) задана температура t1, на другой (x=L) – температура t2.
Общее решение имеет вид:
t  C1x  C2 ,
(12)
что сразу определяет линейное распределение температуры в плоской стенке.
В результате зависимость температуры от координаты принимает вид:
t  t1 
t1  t2
x,
L
(13)
при этом плотность теплового потока через плоскую стенку равна
q  
t
dt t1  t2
 

.
n
dx
L/
(14)
Таким образом, плотность теплового потока в плоской стенке не зависит от
координаты, и она постоянна в любом сечении стенки. Величина разности
температур на поверхностях стенки является полным температурным напором, а
отношение L/λ – термическим сопротивлением стенки.
Полученное решение легко обобщается на случай многослойной стенки,
если по-прежнему заданы ГУ I рода. Термическое сопротивление многослойной
стенки равно сумме термических сопротивлений составляющих ее слоев:
n
RT  
i 1
Li
i
.
(15)
Плотность теплового потока через такую стенку равна
q
t1  t2
,
RT
(16)
9
а значения температур на стыках слоев могут быть получены путем
последовательного решения уравнения (14) для каждого из слоев, начиная с
первого.
Интересным случаем теплопередачи через плоскую стенку, разделяющую
две среды, является случай когда участвуют:
– с одной стороны поверхности стенки заданы tcp1 и коэффициент теплоотдачи
α1,
– с другой – tcp2 и коэффициент теплоотдачи α2.
При этом заданы ГУ III рода.
В этом случае, выражения для плотности теплового потока на одной поверхности,
внутри стенки и на другой поверхности будут иметь вид:
q   1 (t cp1  t1 ),
t1  t 2
,
L/
q   2 (t 2  t cp 2 ).
q
Если преобразовать выписанные уравнения так, чтобы в их правых частях
остались только разности температур, тогда после чего сложить почленно левые и
правые части уравнений, получим:
1 L 1 
q     tcp1  tcp 2 ,
 1   2 
следовательно плотность теплового потока будет равна:
q
tcp1  tcp 2
.
1 L 1
 
1

(17)
2
Для данного случая величина, обратная термическому сопротивлению,
является коэффициентом теплопередачи К, так что q = K(tcp1-tcp2).
Следует отметить тот факт, что в общем случае, зависящем от времени
температурного поля, требуется решать уравнения (9) или (10) одним из
доступных методов – аналитическим или численным. Аналитическое решение
10
можно получить только для простых геометрий, а именно: неограниченной
плоской стенки, либо бесконечно длинного цилиндра или шара.
В более сложных случаях, который нам и необходимо реализовать,
применяют различные численные методы, а именно:
– метод конечных разностей (МКР),
– интегро-дифференциальный метод (метод баланса),
– метод конечных элементов (МКЭ).
Наиболее простым в реализации является метод конечных разностей.
Некоторые особенности применения метода конечных
разностей
Метод конечных разностей широко используется для решения широкого
круга задач и представляет собой простейший метод интерполяции. Его суть
заключается в замене дифференциальных операторов уравнения на разностные
коэффициенты, что позволяет свести решение сложного дифференциального
уравнения к решению его разностного аналога, то есть построению конечно –
разностной схемы.
Интерполяция, представляет собой способ нахождения промежуточных
значений величины по имеющемуся дискретному набору известных значений.
Существует также близкая к интерполяции задача, которая заключается в
аппроксимации какой-либо сложной функции другой, более простой функцией.
Если некоторая функция слишком сложна для вычислений, тогда можно
попытаться вычислить её значение в нескольких точках, а по ним построить, то
есть интерполировать, более простую функцию. Разумеется, использование
упрощенной функции не позволяет получить такие же точные результаты, какие
давала бы первоначальная функция. Однако, в некоторых классах задач
достигнутый выигрыш в простоте и скорости вычислений может перевесить
получаемую погрешность в результатах.
11
Таким образом, решение разностной схемы является приближенным
решением дифференциальной задачи.
Рассмотрим программную реализацию в среде Delphi метода конечных
разностей для поставленной задачи.
Прежде всего, примем следующие
допущения. Распределения температур в изделии будем рассматривать в
некотором сечении т.е.
t  f ( x, y ,  ) .
Такое
(18)
допущение справедливо для случав, когда источники тепла
расположены на поверхностях, перпендикулярных к расчетной сетки и занимают
всю поверхность.
Исследуемое нами сечение объектов, будем описывать в виде массива
(таблицы) границ (рис. 2) и хранить в текстовом файле Tags.txt.
Рис. 2 Описание сечений объектов
где: 0 – материал, 1 – правая граница, 2 – нижняя граница, 3 – левая граница,
4 – верхняя граница, 5 – источник нагрева № 1, 6 – источник нагрева № 2, 7 отсутствие границы.
Тогда, распределение температуры в сечении объекта можно эмулировать
методом сканирования (алгоритм креста) в соответствии с зависимостью:
12
Tt[i, j]  Tp[i, j] + Mu/A*(Tp[i, j-1]+Tp[i, j+1]+Tp[i-1, j]+Tp[i+1, j] – 4 * Tp[i, j]),
(19)
где:
Tt[i, j] – вычисленное значение температуры в текущем шаге для узла сетки;
Tp[i, j] – значение температуры в предыдущем шаге для узла сетки;
Tp[i, j-1]; Tp[i, j+1]; Tp[i-1, j]; Tp[i+1, j] - значение температуры в предыдущем
шаге для соседних узлов сетки;
Mu/A – параметры, характеризующие теплопроводность материала.
Приведенную
сетку,
имеющую
размер
32*32
(рис.
2)
будем
интерпретировать в изображение, 256*256 (рис. 3). Таким образом, один узел
будет соответствовать 8*8 пикселей.
Рис. 3 Вид синтезированного сечения объекта с указанием источников
нагрева
Программные средства
В процессе разработки приложения объект исследования опишем в виде
перечисляемого типа, в котором последовательность элементов (0–7) будет
соответствовать границам с именам:
13
TCellType = (ctMedium, ctLaggingNormalLeft, ctLaggingNormalUp,
ctLaggingNormalRight, ctLaggingNormalDown, ctHeatSource1,
ctHeatSource2, ctNotUsed);
ctMedium - материал;
ctLaggingNormalLeft – левая граница;
ctLaggingNormalUp – верхняя граница;
ctLaggingNormalRight – правая граница;
ctLaggingNormalDown – нижняя граница;
ctHeatSource1 – источник нагрева № 1;
ctHeatSource2 – источник нагрева № 2;
ctNotUsed – пустое определение – нет границы,
Расчетные значения температуры будут описываться в массиве:
TValuesArr = array [0..31, 0..31] of Single;
Температура в каждом узле будет отображаться взаимным изменением
значений в цветовых каналах R и B, в соответствии с зависимостью RGB(it, 0, 255
- it), где:
it = Round((T - MinT) / DeltaT)), а видимое значение температуры будет
соответствовать цветовому градиенту - легенде.
Для наблюдения процесса нагрева изделий в широком диапазоне значений
параметров
пользовательский
интерактивные
температуры
поля
ввода
источников
интерфейс
значений
нагрева,
приложения
температуры
коэффициентов
(рис.
4)
включает
окружающей
среды,
теплопроводности
и
теплоотдачи, а также движок задания скорости наблюдения нагрева материала.
Управление процессом симуляции, выполняется одноименными командными
кнопками: Старт, Пауза и Стоп. В период ”Пауза” возможно сохранение
синтезированного образа (команда меню Файл / Сохранить) в формате bmp.
14
Рис. 4 Вид приложения в период паузы имитации процесса нагрева
Дизайн приложения выполнен в виде электронной формы (рис. 5) с
использованием только компонентов, входящих в состав палитры компонентов
среды Delphi 7. Значение свойств компонентов в период дизайна приведен в табл.
1.
Рис. 5 Дизайн приложения
15
Таблица 1
Значение свойств компонентов
№ п/п
1
Класс компонента
TPanel
TGroupBox
Имя компонента
Panel1
GroupBox1
2
TGroupBox
GroupBox2
3
TGroupBox
GroupBox3
4
5
6
7
8
TSpeedButton
TSpeedButton
TSpeedButton
TLabel
TTrackBar
tbtStart
tbtPause
tbtStop
Label1
trbSpeed
9
TImage
imgLegend
10
11
12
TLabel
TLabel
TImage
laMaxT
laMinT
imgMain
13
TLabel
laMediumT
Свойство
Align
Align
Caption
Align
Width
Caption
Align
Caption
Caption
Caption
Caption
Caption
Min
Max
Position
Width
Height
Caption
Caption
Width
Height
Caption
14
15
TEdit
TLabel
meMediumT
laHeatSource1T
Text
Caption
16
17
TEdit
TLabel
meHeatSource1T
laHeatSource2T
Text
Caption
18
19
20
21
22
TEdit
TLabel
TEdit
TLabel
TEdit
meHeatSource2T
laMuParam
meMuParam
laAParam
meAParam
Text
Caption
Text
Caption
Text
Значение
alTop
alLeft
ЛЕГЕНДА
alLeft
290
ИМИТАТОР
alClient
ПАРАМЕТРЫ
СТАРТ
ПАУЗА
СТОП
Скорость нагрева :
0
100
50
23
255
0
0
255
255
Температура
окружающей среды:
10.000
Температура
источника 1:
700.000
Температура
источника 2:
900.000
Параметр Mu:
0.004
Параметр a:
0.03
Ниже приведен полный исходный текст приложения, имитирующего
процесс нагрева тел сложной формы.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls, StdCtrls, Buttons, math, Menus, ExtDlgs,
16
XPMan;
type
{------------------------- Личный тип данных ------------------------}
TCellType = (ctMedium, ctLaggingNormalLeft, ctLaggingNormalUp,
ctLaggingNormalRight, ctLaggingNormalDown, ctHeatSource1,
ctHeatSource2, ctNotUsed);
TValuesArr = array [0..31, 0..31] of Single;
{--------------------------------------------------------------------}
TMainForm = class(TForm)
GroupBox1: TGroupBox;
Panel1: TPanel;
tbtStart: TSpeedButton;
tbtPause: TSpeedButton;
tbtStop: TSpeedButton;
trbSpeed: TTrackBar;
imgLegend: TImage;
laMaxT: TLabel;
laMinT: TLabel;
GroupBox2: TGroupBox;
imgMain: TImage;
ParamBox: TGroupBox;
laMediumT: TLabel;
meMediumT: TEdit;
laHeatSource1T: TLabel;
meHeatSource1T: TEdit;
laHeatSource2T: TLabel;
meHeatSource2T: TEdit;
laMuParam: TLabel;
meMuParam: TEdit;
laAParam: TLabel;
meAParam: TEdit;
Label1: TLabel;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
SavePictureDialog1: TSavePictureDialog;
XPManifest1: TXPManifest;
procedure FormCreate(Sender: TObject);
procedure tbtStartClick(Sender: TObject);
procedure tbtPauseClick(Sender: TObject);
procedure tbtStopClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure meMediumTChange(Sender: TObject);
procedure meHeatSource1TChange(Sender: TObject);
procedure meHeatSource2TChange(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N3Click(Sender: TObject);
17
private
{ Private declarations }
procedure Delay;
procedure SetControlsEnabled(bEnabled: boolean);
procedure SetTemperatures(MediumTemp, HeatSource1Temp, HeatSource2Temp: Single);
procedure RefreshCells;
procedure ChangeParam(Sender: TObject);
procedure SetStatusOnStop;
procedure SimulationLoop;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
{----------------- Объявление глобальных переменных --------------------}
Tags: array [0..31, 0..31] of TCellType; // массив типов ячеек
A, B: TValuesArr; // массивы значений ячеек
MediumT, HeatSource1T, HeatSource2T: Single; // переменные значений температур
MinT, MaxT, DeltaT: Single; // переменные мин., макс. и разности температур
MuParam, AParam: Single; // переменные параметров Мю и А
CurTime: DWORD;
// переменная текущего времени
bRunning: boolean = false; // старт процесса нагрева
bStopped: boolean = true; // останов процесса нагрева
{------------------------------------------------------------}
implementation
{$R *.dfm}
{Метод условного представления температуры}
function GetColorByTValue(T: Single): TColor;
var
it: Integer;
begin
it:=Round((T - MinT) / DeltaT);
if it < 0 then
it:=0
else
if it > 255 then
it:=255;
Result:=RGB(it, 0, 255 - it);
end;
{Метод заливки образа условным цветом температуры окружающей среды}
procedure FillMediumCells;
var
i, j: Integer;
begin
for i:=0 to 31 do
for j:=0 to 31 do
if Tags[i, j] = ctMedium then
A[i, j]:= MediumT;
18
end;
{Метод заливки образа условным цветом источника 1}
procedure FillHeatSource1Cells;
var
i, j: Integer;
begin
for i:=0 to 31 do
for j:=0 to 31 do
if Tags[i, j] = ctHeatSource1 then
A[i, j]:=HeatSource1T;
end;
{Метод заливки образа условным цветом источника 2}
procedure FillHeatSource2Cells;
var
i, j: Integer;
begin
for i:=0 to 31 do
for j:=0 to 31 do
if Tags[i, j] = ctHeatSource2 then
A[i, j]:=HeatSource2T;
end;
{Метод обновления загрузки образа}
procedure RefreshLagging;
var
i, j: Integer;
begin
for i:=0 to 31 do
for j:=0 to 31 do
case Tags[i, j] of
ctLaggingNormalLeft:
A[i, j]:=A[i, j-1];
ctLaggingNormalUp:
A[i, j]:=A[i-1, j];
ctLaggingNormalRight:
A[i, j]:=A[i, j+1];
ctLaggingNormalDown:
A[i, j]:=A[i+1, j];
end;
end;
{Метод синтеза образа}
procedure DrawField(Image: TImage);
var
Bitmap: TBitmap;
R: TRect;
i, j: Integer;
19
procedure DrawSolidCell(Color: TColor);
begin
Bitmap.Canvas.Brush.Color:=Color;
R.TopLeft.x:=2*j; R.TopLeft.y:=2*i;
R.BottomRight.x:=R.TopLeft.x+2;
R.BottomRight.y:=R.TopLeft.y+2;
Bitmap.Canvas.FillRect(R);
end;
begin
Bitmap:=TBitmap.Create;
try
Bitmap.Width:=64; Bitmap.Height:=64;
for i:=0 to 31 do
for j:=0 to 31 do
case Tags[i, j] of
ctMedium:
DrawSolidCell(GetColorByTValue(A[i, j]));
ctLaggingNormalLeft:
begin
Bitmap.Canvas.Brush.Color:=clBlack;
R.TopLeft.x:=2*j+1; R.TopLeft.y:=2*i;
R.BottomRight.x:=R.TopLeft.x+1;
R.BottomRight.y:=R.TopLeft.y+2;
Bitmap.Canvas.FillRect(R);
Bitmap.Canvas.Brush.Color:=GetColorByTValue(A[i, j]);
R.TopLeft.x:=2*j; R.TopLeft.y:=2*i;
R.BottomRight.x:=R.TopLeft.x+1;
R.BottomRight.y:=R.TopLeft.y+2;
Bitmap.Canvas.FillRect(R);
end;
ctLaggingNormalUp:
begin
Bitmap.Canvas.Brush.Color:=clBlack;
R.TopLeft.x:=2*j; R.TopLeft.y:=2*i+1;
R.BottomRight.x:=R.TopLeft.x+2;
R.BottomRight.y:=R.TopLeft.y+1;
Bitmap.Canvas.FillRect(R);
Bitmap.Canvas.Brush.Color:=GetColorByTValue(A[i, j]);
R.TopLeft.x:=2*j; R.TopLeft.y:=2*i;
R.BottomRight.x:=R.TopLeft.x+2;
R.BottomRight.y:=R.TopLeft.y+1;
Bitmap.Canvas.FillRect(R);
end;
ctLaggingNormalRight:
begin
Bitmap.Canvas.Brush.Color:=clBlack;
R.TopLeft.x:=2*j; R.TopLeft.y:=2*i;
R.BottomRight.x:=R.TopLeft.x+1;
R.BottomRight.y:=R.TopLeft.y+2;
Bitmap.Canvas.FillRect(R);
Bitmap.Canvas.Brush.Color:=GetColorByTValue(A[i, j]);
R.TopLeft.x:=2*j+1; R.TopLeft.y:=2*i;
20
R.BottomRight.x:=R.TopLeft.x+1;
R.BottomRight.y:=R.TopLeft.y+2;
Bitmap.Canvas.FillRect(R);
end;
ctLaggingNormalDown:
begin
Bitmap.Canvas.Brush.Color:=clBlack;
R.TopLeft.x:=2*j; R.TopLeft.y:=2*i;
R.BottomRight.x:=R.TopLeft.x+2;
R.BottomRight.y:=R.TopLeft.y+1;
Bitmap.Canvas.FillRect(R);
Bitmap.Canvas.Brush.Color:=GetColorByTValue(A[i, j]);
R.TopLeft.x:=2*j;
R.TopLeft.y:=2*i+1;
R.BottomRight.x:=R.TopLeft.x+2;
R.BottomRight.y:=R.TopLeft.y+1;
Bitmap.Canvas.FillRect(R);
end;
ctHeatSource1:
DrawSolidCell(GetColorByTValue(HeatSource1T));
ctHeatSource2:
DrawSolidCell(GetColorByTValue(HeatSource2T));
ctNotUsed:
DrawSolidCell($00404040);
end;
R.Left:=0; R.Top:=0; R.Right:=256; R.Bottom:=256;
Image.Canvas.StretchDraw(R, Bitmap);
finally
Bitmap.Free;
end;
end;
{Метод Таймер симуляции скорости нагрева}
procedure TMainForm.Delay;
var
StartTime: DWORD;
begin
StartTime:=GetTickCount;
while (GetTickCount - StartTime < 1000 div (trbSpeed.Position + 1))
and (bRunning) do
Application.ProcessMessages;
end;
{Метод управления доступом}
procedure TMainForm.SetControlsEnabled(bEnabled: boolean);
begin
ParamBox.Enabled := bEnabled;
end;
{Метод установки температур}
procedure TMainForm.SetTemperatures(MediumTemp, HeatSource1Temp, HeatSource2Temp:
21
Single);
begin
MediumT:=MediumTemp;
HeatSource1T:=HeatSource1Temp;
HeatSource2T:=HeatSource2Temp;
MinT:=Min(Min(MediumT, HeatSource1T), HeatSource2T);
MaxT:=Max(Max(MediumT, HeatSource1T), HeatSource2T);
DeltaT:=(MaxT - MinT) / 256;
laMinT.Caption:=FloatToStrF(MinT, ffFixed, 7, 2);
laMaxT.Caption:=FloatToStrF(MaxT, ffFixed, 7, 2);
end;
{Метод обновления}
procedure TMainForm.RefreshCells;
begin
FillMediumCells;
FillHeatSource1Cells;
FillHeatSource2Cells;
RefreshLagging;
Move(A, B, SizeOf(A));
end;
{Метод обмена параментов}
procedure TMainForm.ChangeParam(Sender: TObject);
begin
SetTemperatures(StrToFloat(meMediumT.Text),
StrToFloat(meHeatSource1T.Text),
StrToFloat(meHeatSource2T.Text));
RefreshCells;
DrawField(imgMain);
end;
{Метод останова процесса}
procedure TMainForm.SetStatusOnStop;
begin
SetControlsEnabled(true);
tbtStart.Enabled := True;
tbtPause.Enabled := False;
tbtStop.Enabled := False;
CurTime:=0;
ChangeParam(Self);
end;
{Метод симуляции нагрева}
procedure TMainForm.SimulationLoop;
var
i, j: Integer;
Temp: Single;
procedure MakeTimeStep;
begin
Inc(CurTime);
end;
22
begin
while bRunning do
begin
for i:=0 to 31 do
for j:=0 to 31 do
if Tags[i, j] = ctMedium then
begin
Temp:=A[i, j];
B[i, j]:=Temp + MuParam/AParam*(A[i, j-1]+A[i, j+1]+A[i-1, j]+A[i+1, j]-4*Temp);
end;
Move(B, A, SizeOf(B));
RefreshLagging;
DrawField(imgMain);
Delay;
if bRunning then
MakeTimeStep
else
if bStopped then
SetStatusOnStop
else
begin
tbtPause.Enabled := False;
tbtStart.Enabled := True;
MakeTimeStep;
end;
end;
end;
{обработчик события создания формы}
procedure TMainForm.FormCreate(Sender: TObject);
var
Res, i, j, it: Integer;
procedure DrawLegend;
var
i, j: Integer; Bitmap: TBitmap;
begin
Bitmap:=TBitmap.Create;
try
Bitmap.Width:=32; Bitmap.Height:=256;
for i:=0 to 255 do
for j:=0 to 31 do
Bitmap.Canvas.Pixels[j, i]:=RGB(255-i, 0, i);
imgLegend.Picture.Assign(Bitmap);
finally
Bitmap.Free;
end;
end;
begin
DecimalSeparator:='.';
AssignFile(Input, 'tags.txt');
{$I-}
23
Reset(Input);
Res:=IOREsult;
{$I+}
if Res <> 0 then
begin
for i:=0 to 31 do
for j:=0 to 31 do
Tags[i, j]:=ctMedium;
end
else
begin
for i:=0 to 31 do
for j:=0 to 31 do
begin
Read(it);
Tags[i, j]:=TCellType(it);
end;
CloseFile(Input);
end;
DrawLegend;
SetTemperatures(StrToFloat(meMediumT.Text),StrToFloat(meHeatSource1T.Text),
StrToFloat(meHeatSource2T.Text));
RefreshCells;
DrawField(imgMain);
end;
{Обработчик события кнопки СТАРТ}
procedure TMainForm.tbtStartClick(Sender: TObject);
begin
if CurTime = 0 then
begin
SetControlsEnabled(false);
MuParam:=StrToFloat(meMuParam.Text);
AParam:=StrToFloat(meAParam.Text);
tbtStop.Enabled := True;
bStopped:=false;
end;
tbtStart.Enabled := False;
tbtPause.Enabled := True;
bRunning:=true;
SimulationLoop;
end;
{Обработчик события кнопки ПАУЗА}
procedure TMainForm.tbtPauseClick(Sender: TObject);
begin
bRunning:=false;
end;
{Обработчик события кнопки СТОП}
procedure TMainForm.tbtStopClick(Sender: TObject);
24
begin
if bRunning then
begin
bRunning:=false;
bStopped:=true;
end
else
begin
bStopped:=true;
SetStatusOnStop;
end;
end;
{Обработчик события закрытия формы}
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
tbtStop.Click;
end;
{Обработчик события обмена meMediumTChange}
procedure TMainForm.meMediumTChange(Sender: TObject);
begin
ChangeParam(nil);
end;
{Обработчик события обмена meHeatSource1TChange}
procedure TMainForm.meHeatSource1TChange(Sender: TObject);
begin
ChangeParam(nil);
end;
{Обработчик события обмена meHeatSource2TChange}
procedure TMainForm.meHeatSource2TChange(Sender: TObject);
begin
ChangeParam(nil);
end;
{Обработчик события сохранения файла}
procedure TMainForm.N2Click(Sender: TObject);
begin
if SavePictureDialog1.Execute then
imgMain.Picture.SaveToFile(SavePictureDialog1.FileName);
end;
procedure TMainForm.N5Click(Sender: TObject);
begin
Close;
end;
{Команда вывода информации}
25
procedure TMainForm.N3Click(Sender: TObject);
begin
MessageBox(Handle,PAnsiChar('Имитатор процесса нагрева материала'+#13#10+
'
Разработчик: Кудлатов И.Д.' + #13#10 +
'
Дата создания: 27.10.2011'),
'О программе',
MB_OK or MB_ICONINFORMATION);
end;
end.
26
Выводы
1. Представленная студенческая научная работа направлена на решение
задачи визуализации процесса нагрева тел сложных форм при помощи
симулятора нагрева.
2. Решение поставленной задачи выполнено методом конечных разностей
в среде Delphi.
3. Разработанный симулятор дает возможность реализовать процесс
визуализации нагрева изделий в широком температурном диапазоне. При
этом пользовательский интерфейс позволяет в интерактивном виде
выполнять как ввод данных, так и задавать необходимые режимы
представления температурных полей.
4. Симулятор применяется как в учебном процессе, так и при решении
ряда практических задач.
27
Список литературы
1. Коздоба Л.А. Вычислительная теплофизика / Л.А. Коздоба. – К.: Наук.
Думка, 1991. – 224 с.
2. Швачич Г.Г., Шмукин А.А. Особенности конструирования параллельных
вычислительных алгоритмов для ПЭВМ в задачах тепло - и массообмена.
Восточно-европейский журнал передовых технологий, 2994., №2. с. 42 –
47.
3. Иващенко В.П., Швачич Г.Г., Овсянников А.В.. Основы информационных
технологий и программирование в среде Delphi. Днепропетровск, РВА
”Днiпро- VAL”, 2008, 464с.
4. Галанин М.П., Гузев М.А., Низкая Т.В. Разработка и реализация
вычислительного алгоритма для расчета температурных напряжений,
возникающих при нагреве металла, с учетом фазовых переходов, ИПМ им.
М.В.Келдыша РАН, Москва, 2005.
5. А.А. Игнатьев. Математические модели и вычислительный эксперимент.
Построение регулярных сеток с помощью механической аналогии.
Институт высокопроизводительных вычислений и баз данных. 194291, С.
Петербург, 1992г.
6. Электронный
ресурс,
режим
http://delphisources.ru/pages/sources/graph/1_graph.html.
28
доступа:
Download