
- •25 Октября 2005 г., протокол № 2
- •Предисловие
- •1. Система компьютерной математики
- •1.1. Основные принципы работы системы
- •1.2. Операторы
- •1.3. Функции и переменные
- •1.4. Программирование
- •For[start, test, incr, body];
- •While [ test, expr ];
- •1.5. Графические возможности скм
- •Plot [Sin[X], {X, 0, 2*Pi}]
- •ListPlot3d[ phi ];
- •2. Задания для самостоятельной работы
- •2.1. Расчет двумерного распределения температуры
- •2.2. Расчет сопротивления интегрального резистора
- •2.3. Расчет емкости металлизации интегральных схем
- •2.4. Расчет двумерного нестационарного распределения температуры
- •3. Примеры решения задач
- •3.1. Расчет стационарного распределения температуры методом пвр
- •3.2. Расчет нестационарного распределения температуры
- •Литература
- •Содержание
- •2.2. Расчет сопротивления интегрального резистора . . . . . . . 21
- •2.3. Расчет емкости металлизации интегральных схем . . . . . . 23
- •220050, Минск, проспект Независимости, 4.
- •220064, Минск, ул. Курчатова, 7.
2.4. Расчет двумерного нестационарного распределения температуры
Такая задача возникает, если, например, температура участка AE на рисунке 1 – функция времени:
(30)
и
необходимо рассчитать распределение
температуры в прямоугольнике ABCD в момент
времени
.
Известно начальное распределение
температуры
(31)
В этом случае следует использовать интегральное тождество (8) и проводить дискретизацию задачи как по пространству, так и по времени.
Интервал
времени [0;
]
разобьем на M
в общем случае неравномерных временных
шагов
,
k
– номер текущего временного шага.
Аппроксимируем производную по времени
в (8) конечной разностью:
(32)
Здесь
использована неявная разностная
аппроксимация, так как правая часть
уравнения (32) взята в “будущий” момент
времени. Аппроксимация двойных интегралов
по площади
выполняется умножением температуры в
текущем узле на площадь ячейки
алгебраизации, аппроксимация интеграла
по контуру
рассмотрена ранее в п. 2.1. Возникающие
на каждом временном шаге разностные
СЛАУ следует решать с помощью функции
LinearSolve.
Задание: рассчитать распределение температуры как функцию времени в области, приведенной на рис.1, для вариантов из таблицы 1, a = 25. Время моделирования – 100 сек, начальное распределение температуры – нулевое. Температура контакта К1 линейно возрастает от 0 до Т1 за 80 сек, контакта К2 – от нуля до Т2 за 50 сек для вариантов 13. Для вариантов 46 температура контакта К1 за 50 сек линейно возрастает до Т1, затем за 50 сек линейно уменьшается до Т1/2. Для вариантов 710 температура контакта К1 за 30 сек линейно возрастает до Т1, затем за 40 сек линейно уменьшается до Т1/2, после чего вновь линейно возрастает до 1,5*Т1. Характер изменения температуры на контакте К2 для вариантов 410 здесь такой же, как и для вариантов 13.
26
3. Примеры решения задач
3.1. Расчет стационарного распределения температуры методом пвр
Задание: рассчитать стационарное распределение температуры в области ABCDEF, приведенной на рисунке 8. Отрезок AB – контакт K1, его температура T1, DE – контакт K2, его температура T2.
При программировании все размеры будем определять как переменные, что позволит легко изменять параметры задачи. Величину шага сетки следует выбирать так, чтобы на каждом участке рассматриваемой области укладывалось целое число шагов. При размещении функций двух переменных (температура или потенциал) в двумерных массивах индекс i должен быть вторым, а индекс j – первым.
Рис. 8. Пример области моделирования
Программа, решающая эту задачу, приведена ниже. Цифры в скобках используются для ссылки на соответствующую строку.
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) |
t1=10.; t2=50.; lam=1.7; nMax=1000; eps=0.001; h=1.; x1=8; x2=12; i1=IntegerPart[x1/h]+1; i2=IntegerPart[x2/h]+1; y1=5; y2=10; j1=IntegerPart[y1/h]+1; j2=IntegerPart[y2/h]+1; temp=Table[0,{i, i2*j2}]; temp=Partition[temp, i2]; For[j=1, jj1, j++, temp[[j,1]]=t1]; For[i=i1, ii2, i++, temp[[j2,i]]=t2]; deltaT={}; deltaMax=eps+1; kolit=0; While[(deltaMax>eps)&&(kolit<nMax), deltaMax=0; kolit++; For[i=2, i<i1, i++, For[j=1, jj1, j++, If[j==1, tmp1=0.5*(0.5*(temp[[j,i-1]]+temp[[j,i+1]])+temp[[j+1,i]])]; If[j==j1, |
27
(13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44) (45) (46) (47) (48) (49) (50) (51) (52) (53) |
tmp1=0.5*(0.5*(temp[[j,i-1]]+temp[[j,i+1]])+temp[[j-1,i]])]; If[(j>1)&&(j<j1), tmp1=0.25*(temp[[j,i-1]]+temp[[j,i+1]]+temp[[j-1,i]] +temp[[j+1,i]])]; delta=lam*(tmp1-temp[[j,i]]); temp[[j,i]]=temp[[j,i]]+delta; deltaAbs=Abs[delta]; If[deltaAbs>deltaMax, deltaMax=deltaAbs];]]; For[i=i1, ii2, i++, For[j=1, jj1, j++, If[(j==1)&&(i<i2), tmp1=0.5*(0.5*(temp[[j,i-1]]+temp[[j,i+1]])+temp[[j+1,i]])]; If[(i==i2)&&(j>1), tmp1=0.5*(temp[[j,i-1]]+0.5(temp[[j-1,i]]+temp[[j+1,i]]))]; If[(i==i2)&&(j==1), tmp1=0.5*(temp[[j,i-1]]+temp[[j+1,i]])]; If[(i==i1)&&(j==j1), tmp1=(0.5*(temp[[j,i-1]]+temp[[j+1,i]])+temp[[j,i+1]]+ temp[[j-1,i]])/3]; If[((i>1)&&(i<i2)&&!((i==i2)&&(j==j1))), tmp1=0.25*(temp[[j,i-1]]+temp[[j,i+1]])+temp[[j-1,i]]+ temp[[j+1,i]])]; delta=lam*(tmp1-temp[[j,i]]); temp[[j,i]]=temp[[j,i]]+delta; deltaAbs=Abs[delta]; If[deltaAbs>deltaMax, deltaMax=deltaAbs];]]; For[i=i1, ii2, i++, For[j=j1+1, j<j2, j++, If[(i==i1), tmp1=0.5*(temp[[j,i+1]]+0.5*(temp[[j-1,i]]+temp[[j+1,i]]))]; If[(i==i2), tmp1=0.5*(temp[[j,i-1]]+0.5*(temp[[j-1,i]]+temp[[j+1,i]]))]; If[((i>i1)&&(i<i2), tmp1=0.25*(temp[[j,i-1]]+temp[[j,i+1]])+temp[[j-1,i]]+ temp[[j+1,i]])]; delta=lam*(tmp1-temp[[j,i]]); temp[[j,i]]=temp[[j,i]]+delta; deltaAbs=Abs[delta]; If[deltaAbs>deltaMax, deltaMax=deltaAbs];]]; deltaT=Append[deltaT,deltaMax]; Print[“ >>> Nom.it=”,kolit, ”deltaMax=”, deltaMax]; ]; ListPlot3D[temp,ViewPoint->{1.2,1.2,1.2}]; |
28
(54) (55) (56) (57) (58) (59) (60) (61) |
ListPlot[deltaT,PlotJoined->True]; f1=0.5*(temp[[1,1]] - temp[[1,2]]+temp[[j1,1]] - temp[[j1,2]]); For[j=2, j<j1, j++, f1=f1+(temp[[j,1]] - temp[[j,2]])]; f2=0.5*(temp[[j2,i1]] - temp[[j2-1,i1]]+temp[[j2,i2]] - temp[[j2-1,i2-1]]); For[i=i1+1, i<i2, i++, f2=f2+(temp[[j2,i]] – temp[[j2-1,i]])]; kons=Abs[f1+f2]/(Abs[f1]+ Abs[f2]); Print[“ f1=”,f1, “ f2=”,f2, “ kons=”,kons]; |
В строке (1) определяются: температура контакта К1 (переменная t1), температура контакта К2 (переменная t2), параметр релаксации (lam), максимальное число итераций ПВР (nMax), точность решения СЛАУ (eps) и шаг сетки (h). Для расчетов используется равномерная по обеим осям сетка с одинаковым шагом. В строке (2) задается длина отрезков AG (х1) и AF (х2) и рассчитываются номера линий сетки (i1 и i2), проходящих через точки G и F. Аналогичные характеристики области моделирования по оси y определяются в строке (3): y1 – длина отрезка FH, y2 – длина отрезка EF, j1, j2 – соответствующие номера. В строке (4) создается двумерный массив temp, содержащий искомое распределение температуры. Этот массив содержит j2 строк по i2 элементов в строке.
Циклы, приведенные в строках (5) и (6), переносят значение температуры на соответствующий контакт. Затем создается пустой список deltaT. В него на каждой итерации ПВР будет заноситься величина максимальной поправки, что в конце всех расчетов позволит вывести соответствующий график.
Далее выполняется итерационный цикл ПВР. Здесь используется оператор цикла While, его начало – строка (8), окончание – строка (52). При выполнении этого оператора сначала проверяется условие выполнения цикла, затем, если результат проверки дает логическое значение True, выполняются операторы цикла. Итерации ПВР должны выполняться до тех пор, пока максимальная абсолютная поправка потенциала (переменная deltaMax) не достигла заданной точности и число итераций ПВР (переменная kolit) не превысило заданную величину. В строке (7) готовятся условия начала цикла.
Решение СЛАУ выполняется путем обхода всех точек области моделирования. В строках (9)(20) организован двойной цикл по 1-й области. При этом отрезок AB исключен из рассмотрения, т. к. температура на нем известна, а отрезок CG будет рассмотрен при анализе области 2. Переменная i используется для индексации узлов сетки по оси x, переменная j — для выбора узлов сетки по оси y.
В строках (10) и (11) обработаны узлы сетки, попадающие на отрезок AG, в строках (12), (13) – на отрезок BC, в строках (14)-(16) обрабатываются
29
все внутренние узлы 1-й области. Строки (17) и (18) являются общими для всей 1-й области. Они завершают выполнение каждого шага ПВР, причем в переменной delta находится поправка температуры в конкретном узле сетки. В строке (19) рассчитывается абсолютная величина этой поправки, в строке (20) выбирается максимальное значение поправки.
Обработка 2-й области реализована в строках (21)(37). Здесь отдельно рассмотрены отрезок GF (строки (22), (23)) и отрезок HF (строки (24), (25)). В обоих случаях исключена точка F, она рассмотрена в строках (26), (27). Точка C рассмотрена в строках (28), (29). В этом узле область алгебраизации образуется путем исключения четвертого квадранта из прямоугольной области, приведенной на рис.3. Остальные узлы 2-й области обработаны в строках (30), (31). Оставшаяся часть этого цикла аналогична предыдущей.
Обработка 3-й области реализована в строках (38)(50). Здесь выделены отрезок CD (строки (39), (40)) и отрезок EH (строки (41), (42)). Отметим, что отрезок CH был рассмотрен при обработке 2-й области.
В конце цикла While максимальная поправка температуры сохраняется в списке deltaT (строка (51) и печатается с целью оперативного контроля за ходом итераций ПВР.
После окончания итераций ПВР на экран выводятся трехмерное распределение температуры (строка (54)) и график зависимости максимальной поправки от номера итерации (строка (55)). Затем в строках (56)(60) рассчитываются потоки тепла через контакты, определяется (строка 61) и выводится на экран (строка 62) консервативность.