Красников Моделирование физических процессов с исползованием 2012
.pdfзапишет набор переменных в файл script1.ws в текущую директорию (по умолчанию это будет директория, в которую установлен FEMLAB). Загрузить файл можно инструкцией load [имя файла]:
C» load script1
Чтобы записать только определённый набор переменных, следует их указать через пробел после имени файла. Вот так будут сохранены в файле переменные A и С.
C» save script1 A C
Чтобы сменить текущую директорию, следует ввести команду cd [имя директории]. Просмотреть текущую директорию можно командой pwd.
4.3.3. Векторы, матрицы и массивы в Comsol Script
Оператором «Двоеточие» (:) можно создать вектор с фиксированным шагом от заданного минимального до максимального значения. Инструкция x=a:b создаст вектор от a до b с шагом 1:
C» x=1:10
x =
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
Если требуется задать шаг, отличный от 1, то он задаётся в виде x=a:i:b, где i – нужный интервал.
C» x=0:0.2:1 |
|
|
|
x = |
|
|
|
0 |
0.200000 |
0.400000 |
0.600000 |
0.800000 |
1 |
|
|
161
Задать вектор, или матрицу заполненную нулями, или единицами, можно сделать с помощью команд zeros(M,N) и ones(M,N) соответственно:
one |
= ones(3) |
|
one |
= |
|
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
C» zeros = zeros(2,3) zeros =
0 |
0 |
0 |
0 |
0 |
0 |
Команда ones(N) эквивалентна команде ones(N,N).
Комадна eye(N) создаёт единичную матрицу размерности N. Этой командой можно создать единичную неквадратную матрицу с единицами по главной диагонали.
C» eye(4,5) |
|
|
||
ans = |
|
|
|
|
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
4.4. Элементы программирования в Comsol Script
Среда Comsol Script включает в себя язык программирования высокого уровня. Рассмотрим основные конструкции, управляющие программой в среде.
162
4.4.1. Оператор ветвления if
Оператор if позволяет выполнять инструкции только при выполнении определённого условия:
if rank(A)<3
warning('Matrix does not have full rank!')
…
end
В данном случае условие rank(A)<3. Инструкция warn-
ing('Matrix does not have full rank!') (а также все остальные
до инструкции end, если они есть) выполняется только в том случае, если оно верно. Блок if всегда должен заканчиваться инструкцией end.
Также в конструкции может быть добавлен блок else. В нём указано то, что выполняется в том случае, если исходное условие неверно.
if rank(A)<3 b=1
else b=2
end
Возможно большее количество блоков ветвления. В таких случаях используется команда elseif.
if (x<=0) || (x>=3) y = 0;
elseif x<1 y = x; elseif x<2 y = 1;
else
y = 3-x; end
В данном случае идёт последовательная проверка условий. Сначала проверяется условие (x<=0) || (x>=3), в том случае, если оно не выполняется, обработчик переходит к следующему (x<1).
163
Если одно из условий оказывается верным, то все последующие не выполняются.
4.4.2. Цикл с условием
Цикл while исполняет инструкции, содержащиеся внутри блока, до тех пор, пока заданное условие выполняется. Следующий код показывает, за сколько шагов гармонический ряд достигает 10.
H = 0; n = 1;
while H<10
H = H+1/n; n = n+1;
end n
n=
12368
H
H = 10.000043
4.4.3. Цикл со счётчиком
Цикл со счётчиком if выполняется определённое число раз, которое задаётся при объявлении цикла. В следующем примере показано, как выполняется цикл 12368 раз.
H = |
0; |
for |
n=1:12368 |
H |
= H+1/n; |
end |
|
H |
|
H = |
|
10.000043
4.4.4. Оператор выбора
Оператор выбора switch эквивалентен оператору if. Используется, если необходимо описать больше одного условия.
164
switch number case 1
disp('Hydrogen') case 2
disp('Helium') case 3
disp('Lithium') end
4.5. Моделирование задач в Maltab и Comsol Script
4.5.1. Объектная модель FEMLAB
Любую задачу, решаемую и поставленную в FEMLAB можно решить написанием и выполнением скрипта в Matlab, или Comsol Script. Скрипт работает с теми же объектами и функциями, что и графическая среда, и выполняет те же самые действия. Фактически суть решения совершенно не зависит от того, как решать задачу, графически, или в Matlab/Comsol Script. Можно задаться вопросом – зачем тогда вообще использовать Comsol Script, если все действия можно и так выполнить в графической среде? Ответ на этот вопрос заключается в том, что моделирование посредством выполнения скриптов будет более гибким, позволит учесть различные нюансы в постановке и решении. При наличии ошибки в модели её проще выявить во время выполнения скрипта. Вообще, большинство задач можно решить, не прибегая к программированию, однако в случае сложных систем, или нестандартных условий задачи – без него не обойтись. Одно из наиболее тривиальных применений скриптов – задание геометрии задачи из данных файла. Данную опцию невозможно произвести в графической среде. Также с помощью скрипта задаются сложные области, которые сложно прорисовывать вручную. В любом случае владение инструментом Comsol Script существенно расширит возможности моделирования физических процессов на FEMLAB.
Рассмотрим основные особенности программного моделирова-
ния в FEMLAB.
Поскольку пакет FEMLAB написан на языке JAVA, он использует некоторые особенности этого языка. Так же, как и в языке JAVA, все сущности в FEMLAB представлены в виде объектов и
165
их свойств и методов. Основной объект, с которым работает система, это объект модели, чаще всего он обозначается как fem. У объекта модели есть следующие свойства (являющиеся в свою очередь также объектами):
dim – размерность модели; geom – геометрия модели;
equ – вид уравнения (коэффициенты); bnd – граничные условия;
edg – рёберные условия (для трёхмерных моделей); pnt – точечные условия;
sshape – конечные элементы;
form – форма задания уравнения (строгая в явном виде, или слабая в интегральном);
const – константы;
expr – регулярные выражения;
ode – дополнительные ОДУ и скалярные уравнения, входящие в модель;
mesh – сетка.
Обращение к свойствам объекта, происходит через точку. Так, например, задать геометрию модели в виде окружности можно инструкцией
C» fem.geom=circ2(0,0,1).
Свойства модели также являются объектами и могут иметь свои свойства. Например, для свойства вида уравнения equ есть свойства, задающие соответствующие коэффициенты в уравнении.
C» fem.equ.f=1.
4.5.2.Решение уравнения Пуассона
Вкачестве примера решим уравнение Пуассона на круге
|
u = − f |
|
; |
||
|
|||||
|
|
|
|
Ω |
|
|
|
|
. |
|
|
u = 0 |
|
|
|
||
|
|
∂Ω |
|
|
|
|
|
|
|
166
Область Ω представляет собой окружность с центром в точке (0;0) и радиусом 1. Аналитическое решение подобного уравнения будет иметь вид:
u(x, y) =1 − x2 − y2 . 4
Таким образом, можно сравнить полученное численное решение с точным на точках нашей сетки.
1. В первую очередь подготовим объект модели к решению новой задачи:
clear fem;
2. Объект геометрии модели geom зададим, как окружность в точке (0;0) с радиусом 1
fem.geom=circ2(0,0,1);
3. Далее, инициализируем функцией meshinit сетку на области, определённой в поле fem.geom
fem.mesh=meshinit(fem);
4. Для задания вида выбранного уравнения, будем использовать коэффициентную форму простых уравнений (режим PDE Coefficient form в навигаторе моделей, в данном случае задан по умолчанию), зададим c и f, равными 1. Граничные условия вида hu=r должны иметь вид u=0. Соответственно, переменную h необходимо задать, как 1, а в r уже хранится 0 по умолчанию.
fem.equ.f=1;
fem.equ.c=1;
fem.bnd.h=1;
5. По умолчанию имя искомой переменной – u. Поменять имя переменной можно свойством dim. Следующая инструкция меняет переменную задачи на T.
fem.dim='T';
167
6. Выберем квадратичные лагранжевы элементы. Здесь по умолчанию используются лагранжевы элементы первого порядка, в отличие от графического интерфейса, где как раз заданы квадратичные элементы.
fem.shape=2;
7. Сделаем сетку более плотной. Функция meshextend создаёт сетку с плотностью, необходимой для решения задачи.
fem.xmesh=meshextend(fem);
8. Далее запускаем решение и выводим его на экран.
fem.sol=femlin(fem);
postplot(fem,'tridata','u','triz','u');
9. Вычислим максимальное отклонение нашего решения от аналитического.
pd=posteval(fem,'u-(1-x^2-y^2)/4'); er=max(max(pd.d));
10. Если отклонение недостаточно низкое, можно участить сет-
ку
fem.mesh=meshrefine(fem);
fem.xmesh=meshextend(fem);
11. Решим задачу на новой учащённой сетке и выведем решение на экран
fem.sol=femlin(fem);
postplot(fem,'tridata','u','triz','u');
В следующих пунктах разберём каждый компонент объекта модели более подробно.
168
4.5.3. Импорт и экспорт модели
Когда модель в Comsol Script создана вышеописанным образом, её можно импортировать в главную программу и работать с ней там. Так же, наоборот, любую созданную в графическом интерфейсе Comsol Multiphysics модель можно экспортировать в Comsol Script для детального рассмотрения.
Итак, мы находимся в про-
грамме Comsol Multiphysics.
Чтобы импортировать из командной строки созданную там модель необходимо вызвать пункт меню File->Import->FEM Structure… (рис. 4.2).
В полученном окне вводится название объекта импортируемой модели.
Так же, можно импортировать не всю модель, а только её геометрию. Для этого необходимо вызвать пункт меню File->Import- >Geometry objects… и в аналогичном окне указать созданный в Comsol геометрический объект (рис. 4.3). Для примера, создадим круг с центром в точке (2; 3) и радиусом 4:
cr = circ2(2,3,4);
В окне программы Comsol Multiphysics укажем cr. Созданный круг появится в модели.
Для экспорта созданной модели из Comsol Multiphysics в Matlab или Comsol Script достаточно нажать Ctrl+F или вызвать пункт меню File->Export->FEM Structure as fem, либо File- >Export->FEM Structure… В
первом случае модель экспортируется под именем fem, а во втором случае будет предлагается создать пользователю. Стоит,
однако, учитывать, что перемен-
Рис. 4.3. Форма импорта геометрии
ные, используемые в модели, модели которые с момента создания мо-
169
дели не менялись, и содержат значения по умолчанию, не будут экспортированы, а в Comsol Script соответствующие значения по умолчанию могут быть другими. Чтобы избежать возможных проблем, следует их включить в экспорт. Для этого необходимо вызвать пункт меню Options->Preferences. В полученном окне выбрать вкладку Modeling, где включить флажок Include default values.
4.6.Создание геометрических объектов
4.6.1.Создание базовых геометрических объектов
Первый шаг постановки любой задачи – это создание геометрии задачи. Для каждой размерности задачи существует базовый класс, содержащий необходимую информацию для моделирования:
geom0, geom1, geom2 и geom3.
В трёхмерной геометрии доступны для использования объёмные объекты solid3, поверхностные объекты (face3) (общий класс для двумерных объектов в трёхмерном пространстве), кривые (curve3) и точки (point3), все они подклассы для класса geom3. Вышеперечисленные объекты имеют также подклассы, представляющие собой основные геометрические трёхмерные объекты. Прямоугольные блоки, сферы, цилиндры от класса solid3, сферы и полые блоки от класса face3 и т.д.
В двумерной геометрии используются следующие подклассы класса geom2. solid2 для сплошных объектов, curve2 для рациональных кривых Безье (общий класс для одномерных объектов в двумерном пространстве), и point2 для точек. От класса solid2 существуют подклассы, отвечающие за создание прямоугольников, квадратов, эллипсов и окружностей.
В одномерной геометрии используется класс geom1 и его подклассы solid1 для интервалов и point1 для точек.
Рассмотрим более подробно создание двумерных объектов. Следующие классы – наследники класса solid2 создают основные двумерные фигуры.
rect2(x1,x2,y1,y2) – прямоугольник с диагональю {(x1,
y1);(x2, ,y2)};
170