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

Красников Моделирование физических процессов с исползованием 2012

.pdf
Скачиваний:
172
Добавлен:
12.11.2022
Размер:
12.78 Mб
Скачать

circ2(x1,y1,r) – окружность с центром в точке (x1, y1) с радиусом r.

ellip2(x1,y1,r1 ,r2,φ) – эллипс в точке (x1, y1) с радиусом r1, r2 и наклоном оси φ (в радианах) относительно оси координат X.

square2(x1,y1,r,φ) – квадрат с левой нижней точкой (x1, y1), ребром r, и наклоном оси φ (в радианах) относительно оси координат X.

Соответствующие объекты rect1, circ1, ellip1, square1

наследники класса curve2. Они задают границы соответствующих фигур. Другими словами, область, созданная каким-либо из этих объектов, будет включать в себя только точки на границе фигуры, и не будет включать внутренние точки.

Вывод на экран геометрического объекта производится функцией geomplot. Чтобы вывести более одного графика на одну канву, следует после первого вызова geomplot вызвать инструкцию hold on. Все дальнейшие графики будут выводиться на этой же канве. Для закрепления, можно запустить следующий пример.

r1 = rect2(0,4,0,4);

c1 = circ2(0,0,2);

c2 = circ2(0,4,2);

c3 = circ2(4,0,2);

c4 = circ2(4,4,2); geomplot(r1); hold on; geomplot(c1); geomplot(c2); geomplot(c3); hold off; geomplot(c4);

Отключить вывод графиков на одну канву можно командой

hold off.

4.6.2. Создание сложных объектов

Итак, мы научились создавать геометрию задачи. А что делать, если наша задача содержит сложную геометрию, состоящую преимущественно из кривых Безье (как это бывает в общем случае)? Для этого следует узнать, как вообще задаётся подобная кривая:

171

curve2([x1 x2 x3], [y1 y2 y3],[w1 w2 w3]) – создаёт кри-

вую Безье, из точки (x1, y1) в точку (x3, y3). В точке (x2, y2) находится радиус кривизны кривой, а [w1 w2 w3] весовые коэффициенты, отвечающие за степень кривизны кривой. В случае отсутствия последнего параметра линия строится прямой.

Создадим с помощью кривых полную замкнутую область. Для начала зададим полностью его линиями

w = 1/sqrt(2);

c1 = curve2([-0.5 -1 -1],[-0.5 -0.5 0],[1 w 1]); c2 = curve2([-1 -1 -0.5],[0 0.5 0.5],[1 w 1]); c3 = curve2([-0.5 0.5],[0.5 0.5]);

c4 = curve2([0.5 1 1],[0.5 0.5 0],[1 w 1]); c5 = curve2([1 1 0.5],[0 -0.5 -0.5],[1 w 1]); c6 = curve2([0.5 -0.5],[-0.5 -0.5]);

Объекты объединяются с помощью фукнции geomcoerse:

s = geomcoerce('solid',{c1,c2,c3,c4,c5,c6})

Таким образом, s будет двумерной областью, ограниченной кривыми c1 c6. Обязательным условием является то, что эти кривые образуют замкнутую линию. Если оно не выполняется, то функция вернёт ошибку.

Получить границу области от самой области можно с помощью функции curve:

c = curve2(s);

Точно также границу c можно получить, скомпоновав кривые c1 c6 функцией geomcomp:

c = geomcomp({c1,c2,c3,c4,c5,c6});

4.6.3.Преобразования объектов и логические операции

ВComsol Script доступны все операции преобразования объектов, имеющиеся в FEMLAB:

172

rotate(g,φ,x,y) – вращает фигуру g на градус φ (в радианах) относительно точки (x,y).

move(g,x,y) – перемещает фигуру g на расстояние x по оси X, и на расстояние y по оси Y.

mirror(g,[x,y],[rx,ry]) – отражает фигуру g относительно прямой, заданной точкой (x,y) и нормальным вектором [rx,ry].

scale(g,sx,sy,x,y) – умножает в sx раз размер фигуры по оси X и в sy раз размер фигуры по оси Y относительно точки (x,y).

Логические операции в Comsol Script проводятся точно также, как и при создании составных объектов в Comsol Multiphysics. Объединение объектов s1 и s2:

s=s1+s2;

Пересечение:

s=s1*s2;

Вычитание

s=s1-s2;

4.6.4. Интерполяция геометрических объектов

Данная возможность доступна только в Matlab и не поддерживается в Comsol Script. Чтобы создать плавную кривую из набора точек, можно использовать функцию geomspline. Она создаёт одномерный и двумерный сплайны посредством интерполяции кривой между точками. Функция полезна, когда необходимо задать область из каких-либо внешних данных, представляющих собой набор точек. Принцип работы данной функции можно проиллюстрировать на следующем примере.

Создадим равномерным набор точек, образующих окружность, и отсортированных по углу. Затем удалим некоторые из них:

phi = 0:0.2:2*pi;

phi([1 3 6 7 10 20 21 25 28 32]) = []; p = [cos(phi);sin(phi)];

173

И внесём небольшой разброс по точкам:

randn('state',17)

p = p+0.01*randn(size(p));

Далее выполним интерполяцию полученных точек. Для наглядности, выведем кривую совместно с самими точками:

plot(p(1,:),p(2,:),'ro') c =

geomspline(p,'splinemethod','uniform','closed','on'); hold on

geomplot(c,'pointmode','off')

Стоит пояснить параметры функции geomspline. Всего функция имеет три свойства:

closed – определяет, следует ли замыкать кривую, или нет. При значении on последняя точка связывается автоматически с первой, таким образом кривая замыкается. При значении auto, это происходит, только если первая и последняя точки достаточно близко расположены друг от друга. При значении off кривая строится незамкнутой;

splinedir – используется для возможности указания тангенциальных векторов к каждой точке, задающих интерполяцию. Если указано это свойство, то вид кривых определяется по первой производной. В качестве параметров к нему используется двумерная (в трёхмерном случае трёхмерная) матрица. При выборе этого свойства нет необходимости использовать свойство splinemethod;

splinemethod – определяет тип интерполяции (uniform,

chordlength, centripetal, foley). Если используется это свой-

ство, то нет необходимости использовать свойство splinedir. Общий вид функции geomspline выглядит как geomspline(g,

'название свойства', 'значение свойства',…), где g – набор точек для интерполяции.

4.7.Задание модели

4.7.1.Основные положения

Вэтом разделе будет рассмотрен следующий этап постановки задачи, а именно задание коэффициентов уравнения, граничных,

174

краевых и точечных условий в задаче. Предполагается, что геометрия задачи уже задана.

Для начала напомним о строении объекта модели:

fem.equ – содержит информацию о коэффициентах системы уравнений;

fem.bnd – содержит информацию о краевых условиях; fem.edg – содержит информацию о рёберных условиях (для

трёхмерных моделей);

fem.pnt – содержит информацию о точечных условиях (для двумерных и трёхмерных моделей).

4.7.2. Постановка задачи

Перейдём непосредственно к постановке задачи. В первую очередь необходимо определить форму задания уравнения и набор переменных задачи. Делается это следующим образом.

fem.form – задание формы уравнения (коэффициентная, генеральная, слабая). По умолчанию задаётся всегда коэффициентная форма. Генеральную форму уравнения можно задать следующим выражением:

fem.form=’general’

fem.sdim – структура содержит данные о пространственных координатах модели. По умолчанию fem.sdim={’x’ ’y’}. Можно вместо них ввести любые собственные обозначения, например цилиндрические координаты:

fem.sdim={‘ro’ ‘phi’ ‘z’};

fem.dim – структура содержит неизвестные переменные модели. Выражение

fem.dim={‘u’ ‘v’ ‘p’};

175

будет означать, что в нашей системе существуют три неизвестные величины u, v, p. Можно задать только размерность уравнения:

fem.dim=3;

В этом случае названия переменных будут иметь вид: u1, u2, u3. В случае fem.dim=1 название переменной по умолчанию будет u.

4.7.3. Задание уравнений

За вид уравнения отвечает структура fem.equ. В модели может присутствовать несколько областей, на которых уравнение может иметь различный вид. Каждая область имеет свой порядковый номер (1,2,3…), по которому её можно идентифицировать. Области, на которых уравнения имеют одинаковый вид, можно объединить в группы. Для этого используется структура ind:

fem.equ.ind = {[1 4] [3 5 6]}

Данная запись объединит в одну группу области 1 и 4, и в другую группу области 3,5,6. Аналогичный принцип объединения областей в группы используется для граничных, рёберных и точечных условий (где используются структуры fem.bnd.ind,

fem.edg.ind, fem.pnt.ind соответственно).

Если структура ind не определена, то каждая область считается отдельной группой.

В случае с несколькими областями, все коэффициенты в уравнениях задаются в виде векторов. Задание коэффициента f в таком случае реализовывается следующим образом:

fem.equ.f = {’x’ ’3*x+1’};

Данная команда присваивает f значения x в группу областей 1, и 3x+1 в группу областей 2.

4.7.4. Генерация сетки

Первоначальная генерация сетки производится командой

fem.mesh = meshinit(fem);

176

Чтобы указать максимально возможный линейный размер элемента сетки, следует использовать свойство hmax. Данная команда устанавливает диаметр ячейки сетки не больше 0.01:

fem.mesh = meshinit(fem,’hmax’,0.01);

Учащение сетки производится командой

fem.mesh = meshrefine(fem);

4.7.5. Тестовые функции

Следующие команды соответствуют различному виду тестовых функций

shlag – лагранжев элемент некоторого порядка. shherm – эрмитов элемент некоторого порядка

sharg_2_5 – элемент Аргириса 5-го порядка для треугольной сетки в двумерном случае.

shcur1 – векторный (рёберный) элемент на треугольных или тетраидальных сетках.

shdiv – дивергентный элемент на треугольных или тетраидальных сетках.

shbubble – пузырьковый элемент. shdisc – бесконечный элемент.

Пример: Лагранжев элемент k-го порядка для переменной u задаётся следующим образом:

s =slhlag(k,’u’)

Структура модели fem содержит поле shape, которое представляет собой массив тестовых функций для каждой неизвестной переменной:

177

fem.shape = {shlag(1,'u') shlag(2,'u') shherm(3,'p')};

Данная команда создаст лагранжевы элементы первого порядка для величины u, лагранжевы элементы второго порядка для величины v и эрмитовы элементы третьего порядка для p.

По умолчанию для всех переменных тестовыми функциями будут лагранжевы элементы. Можно задать размерность элементов в следующем виде:

fem.dim = {'u' 'v' 'p'}; fem.shape = [2 2 1];

что эквивалентно

fem.dim = {'u' 'v' 'p'};

fem.shape = {shlag(2,'u') shlag(2,'v') shlag(1,'p')};

Структура fem.shape содержит в себе все доступные тестовые функции в модели. Но это не значит, что все они используются. Можно использовать на различных областях различные элементы.

fem.shape = {shlag(1,'u') shlag(2,'u') sharg_2_5('v')};

fem.equ.shape = { [1 3] [2 3] [] 3 };

В вышеприведённом коде используются тестовые функции

shlag(1,’u’) и sharg_2_5(‘v’) в области 1, функции shlag(1,’u’) и sharg_2_5(‘v’) в области 2, для области 3 тесто-

вые функции не указываются, в области 4 используется только sharg_2_5(‘v’). При выборе тестовых функций следует обращать внимание на то, чтобы в одной области одновременно не использовались элементы для одной величины разных порядков, в этом случае программа выдаст предупреждение об ошибке.

В случае, если переменные fem.equ.shape не указаны, то по умолчанию используются все тестовые функции, указанные в

fem.shape.

178

Аналогичным образом можно использовать тестовые функции для граничных, рёберных, точечных условий (переменные

fem.bnd.shape, fem.edg.shape, fem.pnt.shape соответственно).

4.7.6. Константы и выражения

Константы и регулярные выражения можно записать в модель с помощью Comsol Script. Структура, отвечающая за константы – fem.const. Записываются константы в структуру двумя способами. Запишем константы A=3*108 и B=4π*107. Первый способ:

fem.const = {’A’ 3*e8 ’B’ ’4*pi*1e7’}

Второй способ:

fem.const.A = 3e8; fem.const.B = 4*pi*1e-7;

Регулярные выражения хранятся в структуре fem.expr. Запись выражений в структуру аналогична записи констант. Первый способ:

fem.expr = {’s’ B*x^2*exp(-x) ’w’ ’A*(uy-vx)’}

Создаёт переменные s = Bx2ex ; w = A(u y vx ). Второй способ:

fem.expr.s = B*x^2*exp(-x); fem.expr.w = A*(uy-vx);

Можно определить специальные регулярные выражения, действующие только в пределах уравнения, либо только для граничных, рёберных, или точечных условий. У всех структур, содержащих условия (equ, bnd, edg, pnt), существует также поле expr. Так, выражение

fem.equ.expr = { 'W' 'B*H/2' 'div' 'ux+vy' };

179

будет определено на всех областях, где заданы основные уравнения задачи (на границах, рёбрах данные переменные не будут определены). Можно сразу определить разные выражения для разных групп областей. Рассмотрим следующую команду:

fem.equ.expr = { 'v' {'a+b' 'a-b'} 'w' 'pi*x*b' };

После её выполнения переменные будут заданы следующим образом: v=a+b на группе областей 1, v=a-b на области 2. w=πxb на обеих группах областей.

4.7.7.Выбор решателя

ВСomsol Script используются следующие решатели:

femlin линейный решатель; femnlin нелинейный решатель; femtime нестационарный решатель;

femig решает задачу на собственные значения.

Выбор решателя производится при запуске решения задачи:

fem.sol=femlin(fem);

Структура sol содержит решение задачи. Она состоит из нескольких матриц, содержащих значения для определённых в модели искомых величин и их производных. Если одна из искомых величин в задаче обозначается, как u, то её значения хранятся в мат-

рице fem.sol.u. В матрицах fem.sol.ux, fem.sol.uy хранятся про-

изводные величины u по координатам, а в случае нестационарной задачи, fem.sol.ut содержит производную по времени. Также при решении временной задачи структура fem.sol имеет дополнительное поле fem.sol.tlist. В этом случае размерность матрицы fem.sol.u, увеличивается на 1 (3D-матрица для 2D-случая) – каждая колонка в матрице fem.sol.u, это решение, соответствующее некоторому значению времени в fem.sol.list. В случае решения задачи на собственные значения решателем femig, у структуры fem.sol будет такое же дополнительное поле fem.sol.lambda, в

180

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