Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Метод конечных элементов для моделирования устройств и систем. Учебное пособие
.pdf
3.1. Построение расчетной сетки с применением GMSH для решения задач…
31
Рис. 3.4. Интерфейс сеточного генератора GMSH
Основные шаги построения геометрий расчетных областей и генера-
ции сеток в сеточном генераторе заключаются в следующем [22]:
1. Для создания геометрии области задаются координаты базовых
точек (объекты размерности 0).
2. Применяя базовые точки, строятся кривые либо прямые отрезки,
соединяющие точки (объекты размерности 1).
3. На основе замкнутых кривых и ломаных линий задаются плоские
либо криволинейные поверхности (объекты размерности 2).
4. Создаются объемы, применяя двумерные поверхности, замыкаю-
щие в себе односвязный объем (объекты размерности 3).
5. Размечая подмножества кривых, поверхностей и объемов кон-
стантами или материалами, создаются подобласти с определенными физическими свойствами, и поверхности с различными граничными условиями.
6. Генерация сетки, покрывающей все выделенные физические по-
добласти.
Скрипт-файл с описанием геометрии (расширение *.geo) для при-
мера, представленного на рис. 3.4, будет иметь следующий вид:

3. Программная реализация напряженно-деформированных состояний…
32
cl1 = 0.01;
Point(1) = {0, 0, 0.075, cl1};
Point(2) = {0, 0.045, 0.075, cl1};
Point(3) = {0.075, 0, 0.15, cl1};
Point(4) = {0.075, 0.045, 0.15, cl1};
Point(5) = {0.35, 0, 0.15, cl1};
Point(6) = {0.35, 0.045, 0.15, cl1};
Point(7) = {0.35, 0, 0, cl1};
Point(8) = {0.35, 0.045, 0, cl1};
Point(9) = {0.075, 0, 0, cl1};
Point(10) = {0.075, 0.045, 0, cl1};
Line(1) = {10, 9};
Line(2) = {10, 8};
Line(3) = {8, 7};
Line(4) = {9, 7};
Line(5) = {7, 5};
Line(6) = {5, 6};
Line(7) = {8, 6};
Line(8) = {6, 4};
Line(9) = {3, 5};
Line(10) = {4, 3};
Line(11) = {4, 2};
Line(12) = {3, 1};
Line(13) = {2, 10};
Line(14) = {1, 9};
Line(15) = {2, 1};
Line Loop(17) = {8, 10, 9, 6};
Plane Surface(17) = {17};
Line Loop(19) = {14, 4, 5, -9, 12};
Plane Surface(19) = {19};
Line Loop(21) = {12, -15, -11, 10};
Plane Surface(21) = {21};
Line Loop(23) = {13, 1, -14, -15};
Plane Surface(23) = {23};
Line Loop(25) = {4, -3, -2, 1};

3.2. Использование алгоритмического языка Python для программной…
33
Plane Surface(25) = {25};
Line Loop(27) = {11, 13, 2, 7, 8};
Plane Surface(27) = {27};
Line Loop(29) = {7, -6, -5, -3};
Plane Surface(29) = {29};
Surface Loop(31) = {17, 27, 21, 19, 23, 25, 29};
Volume(31) = {31};
Point(1) = {0, 0, 0.075, cl1}; означает точку № 1 с координатами {0, 0,
0.075}, а четвертое значение cl1 – это характеристическая длина. Данная
величина связана с размером конечно-элементной сетки, примыкающей к
вводимой точке.
Описание геометрии конструкции задается в файле *.geo. GMSH
считывает данный файл, а затем с его помощью строит неструктурированную сетку [23]. Полученная сетка сохраняется GMSH в собственном формате *.msh, в котором записываются все грани на поверхностях устройства,
все ячейки со всеми их точками.
3.2. Использование алгоритмического языка Python
для программной реализации метода конечных элементов
Важным аспектом разработки программ для метода конечных элементов является выбор алгоритмического языка и среды для реализации
модели.
Для разработки программного обеспечения методом конечных элементов для расчета термоупругих напряжений в конструкциях предложено
использовать алгоритмический язык Python, созданный 20 лет назад и учитывающий достоинства и недостатки предшествующих языков программирования [24]. Python – высокоуровневый язык программирования, направленный на увеличение производительности разработчика и читаемости
программного кода. Благодаря этим свойствам, Python широко используется как универсальное средство разработки как консольных, так и webприложений. Также, благодаря свободному механизму распространения и
модульной структуре, Python в последние годы начал широко применяться
для реализации трудоёмких математических вычислений, занимая нишу
коммерческих математических продуктов, таких как MATLAB.

3. Программная реализация напряженно-деформированных состояний…
34
Алгоритмический язык Python стандартизирован в двух похожих
друг на друга, но формально не совместимых версиях: Python 2 и Python 3.
Несмотря на то, что третья версия появилась достаточно давно, ей пока не
удаётся окончательно вывести из употребления вторую версию. Тем не менее, далее мы будем ориентироваться исключительно на версию Python 3,
как на более современную.
Код Python выполняется в определенной среде, включающей интерпретатор, стандартную библиотеку и некоторое количество установленных
пакетов, что определяет и возможные конструкции языка, и синтаксис, и
доступные функциональности операционной системы, и то, какие пакеты
применяются.
Данный язык программирования имеет удобный синтаксис и характеризуется способностью применять существующие библиотеки численных методов, дающие возможность разработчику в незначительные сроки
осуществить подготовку программного кода и решение задачи. Несмотря
на то, что код на Python, как правило, выполняется медленнее аналогичного
кода, реализованного на компилируемых языках, таких как C, Python позволяет разработать сложный программный код достаточно быстро, поэтому он очень эффективен для быстрого прототипирования решений.
К несомненным достоинствам Python можно отнести широкий круг
свободно распространяемых библиотек и фреймворков, ориентированных
на различные предметные области. В частности, стандартная библиотека
Numpy относится к библиотекам языка для выполнения матрично-векторных расчетов на языке Python. Использование библиотеки Numpy превращает данный язык в среду для создания программ для численных расчетов,
сходную с такими известными программными продуктами, как Matlab и
GNU Octave.
Несмотря на то, что Python не задумывался как язык для трудоёмких
численных расчетов, пакет Numpy дает возможность создавать массивы произвольной размерности и имеет большинство встроенных функций-операций для работы с ними. Например, при необходимости транспонирования
матрицы не требуется написание программного кода с циклами, что позволяет существенно уменьшить объём и сложность программного кода и, как
следствие, снизить вероятность появления ошибок программирования.

3.2. Использование алгоритмического языка Python для программной…
35
Совместное применение языков программирования и математиче-
ских библиотек позволяет максимально гибко и точно настроиться на решаемую задачу для описания динамики систем твердых тел.
Для ускорения вычислений на современном компьютере возможно
выполнение задачи в несколько потоков, для чего может применяться Par-
allel Python Software – модуль языка Python, который обеспечивает механизм параллельного исполнения программного кода.
Существует стандартный кроссплатформенный интерпретатор
языка Python, который доступен для скачивания на сайте python.org. Если
вы работает в операционной системе Linux, то этот интерпретатор будет,
скорее всего, предустановлен или, по крайней мере, доступен для быстрой
установки в стандартном менеджере пакетов. В разновидностях операционной системы Linux, собранных на основе дистрибутива Debian, для установки Python 3 достаточно ввести в командной строке команду sudo apt-get
install python3. Для дистрибутивов, восходящих к системе RedHat, аналогичной командой будет sudo yum install python3. Для других операционных
систем, как правило, необходимо явным образом скачать и установить соответствующий дистрибутив.
Признаком того, что командный интерпретатор Python установлен
правильно, является реакция на запуск команды python из командной строки.
При правильной установке интерпретатор Python выводит приглашение для
ввода команд в виде трёх символов «больше» (>>>). С интерпретатором
можно работать в интерактивном режиме, вводя команды одну за одной, в
частности, можно ввести какое-нибудь математическое выражение и получить его результат. Если программа на Python подготовлена заранее в какомлибо текстовом редакторе, то её можно запустить, указав в качестве параметра при вызове интерпретатора, например, python myprogram.py.
Для начинающих работать с Python, в особенности для тех, кто собирается программировать математические расчёты, можно также порекомендовать установить свободно распространяемый пакет Anaconda (доступен по адресу https://www.anaconda.com), который, кроме интерпретатора
Python, включает базовые математические библиотеки и интегрированную
среду разработки Spyder. Также в систему Anaconda встроена обширная документация по использованию языка Python и его основных библиотек.

3. Программная реализация напряженно-деформированных состояний…
36
3.3. Основные сведения о синтаксисе языка Python
В данном разделе приведены некоторые базовые сведения о языке
Python, позволяющие понять основной смысл последующих фрагментов
кода. Он не претендует на полноту, поэтому желающим получить более
полное представление о языке и научиться программировать можно порекомендовать многочисленные онлайн-ресурсы, такие как docs.python.org/3,
pythonworld.ru или pythontutor.ru.
Как было сказано ранее, язык Python относится к классу интерпре-
тируемых языков, т.е. отдельные операторы программы транслируются и
выполняются последовательно без предварительного преобразования всей
программы в машинный код (компиляции). Это свойство позволяет пробовать вводить те или иные команды непосредственно в командный интерпретатор и сразу видеть результат их выполнения. В частности, любое математическое выражение уже является оператором Python, поэтому введя в
командный интерпретатор, например, 3 * 4 + 2 можно тут же получить ответ 14. Возможность видеть результат выполнения отдельной команды
непосредственно после её ввода позволяет осваивать команды Python существенно быстрее, чем это происходит при изучении компилируемых
языков, таких как C.
Оператором присваивания является простой знак равенства.
Например, если ввести команду a = 1, то создаётся новая целочисленная
переменная a, и ей присваивается значение 1. Следует отметить, что в Py-
thon отсутствует механизм указания типов переменных в явном виде. Переменная создаётся в момент первой инициализации, и её тип определяется по начальному значению. Чтобы та же переменная получила то же
значение, но не целочисленный, а действительный тип, её можно инициализировать так: a = 1.0.
Встроенные целочисленный и вещественный типы имеют собствен-
ные наименования: int и float. Однако эти обозначения используются не для
задания типов переменных, а только для преобразования типов вычисляемых выражений. Например, выражение float(2) возвращает значение 2.0, а,
например, выражение int(4.1) возвращает целочисленное значение 4.

3.3. Основные сведения о синтаксисе языка Python
37
Результаты выполнения основных математических операций зависят от типов данных. Если операнды целочисленные, то и результат операций сложения (+), вычитания (-) и умножения (*) также будет целочисленным. Деление с помощью оператора «/» всегда возвращает вещественное
число (4 / 2 даёт 2.0, а не 2). Для вызова целочисленного деления, косую
черту необходимо удваивать: «//». Операция возведения в степень выполняется с помощью оператора **. В частности, выражение 2 ** 3 выдаёт результат 8. Ещё одна бинарная арифметическая операция обозначается символом % и вычисляет остаток от деления первого аргумента на второй (результат операции 17 % 5 будет равен 2, поскольку при целочисленном делении 17 на 5 получается 3 и в остатке 2).
Строковые константы в Python представляют собой последовательности символов, заключённые в одинарные или двойные кавычки. Синтаксической разницы между одинарными и двойными кавычками нет, но при
задании одной строки необходимо выбрать либо один, либо другой способ.
Таким образом, выражения "строка" и 'строка' будут синтаксически корректными, а такие как "строка' или 'строка" – нет.
Стандартной функцией вывода в Python является функция print().
Список аргументов функции print() может быть произвольной длины, а
сами аргументы могут быть произвольных типов. Единственным требованием к аргументам этой функции является наличие возможности преобразовать данный аргумент в текстовую строку. Пример корректного использования функции вывода:
print("Сумма ", a, " и ", b, " будет:", a + b).
Характерной особенностью синтаксиса Python является интерпретация отступа текста от левого края (табуляции) как синтаксически значимого элемента. С помощью дополнительного отступа можно выделить единый блок операций, который составляет тело цикла, ветвление условного
оператора или тело функции. Командный интерпретатор считает стандартным отступом четыре пробела подряд.
Операторы, осуществляющие ветвление и зацикливания кода,
имеют интуитивно понятный синтаксис и традиционные наименования.
Оператор if позволяет реализовать ветвление кода. После него записывается условие, затем ставится двоеточие и с новой строки по отступу

3. Программная реализация напряженно-деформированных состояний…
38
пишутся операторы, которые выполняются, только если данное условие истинно. Альтернативные варианты ветвления обозначаются с помощью
ключевого слова elif. Вариант ветвления, если ни одно из явно указанных
условий не является истинным, отделяется ключевым словом else.
При вводе составных команд, таких как if, в интерактивном режиме,
командный интерпретатор сам отслеживает правильную расстановку табуляции. Если ввести в командный интерпретатор строку «if a > b:», то после
нажатия клавиши ввода будет предложено продолжить ввод текста, при
этом приглашение в виде трёх знаков «больше» будет заменено на три
точки, а курсор будет автоматически переведён вправо на четыре позиции
вправо. Полностью ветвление кода может быть задано, например, следующим образом:
if a > b:
print("больше")
elif a < b:
print("меньше")
else:
print("равно")
Существует только два типа цикла: цикл с предусловием и цикл с
параметром. Синтаксис заголовка цикла с предусловием представляется в
виде «while условие:». Выполнение цикла повторяется до тех пор, пока
условие истинно. Цикл с параметром задаётся в формате «for переменная
in набор_значений:». Тело цикла повторяется, пока переменная перебирает
все заданные значения.
В связке с циклами с параметром часто используется функция
range(), которая в случае вызова с единственным аргументом n позволяет
осуществить последовательный перебор целочисленных значений от 0 до
n-1. Например, чтобы задать цикл из пяти итераций можно ввести команду
«for i in range(5):», при этом переменная цикла i будет последовательно про-
бегать значения от 0 до 4.
Подпрограммы в Python определяются как функции, т.е. фрагменты
кода, которые принимают некоторый набор параметров на входе и возвращают некоторое значение на выходе. При этом как набор входных параметров, так и возвращаемое значение может быть пустым. Заголовок функции

3.3. Основные сведения о синтаксисе языка Python
39
определяется с помощью команды «def название_функции (параметр1, параметр2, …):». После заголовка идёт тело функции, которое выделяется отступом вправо на стандартные четыре знака. Вернуть результат выполнения функции из её тела можно с помощью команды return. В качестве примера опишем функцию вычисления факториала n! = 1·2·…·n следующим
образом:
def fact(n):
f = 1
for i in range(n):
f = f * (i + 1)
return f
Все переменные, которые встречаются внутри определения функ-
ции, по умолчанию считаются локальными, т .е. при выходе из функции их
значения теряются. Чтобы из тела функции можно было обращаться к глобальным переменным, необходимо после заголовка функции явным образом объявить их с помощью директивы global, например «global a, b, c».
Поскольку язык Python задумывался как объектно-ориентированный язык, он также позволяет описывать классы с помощью команды «class
Название Класса (КлассПредок):». Поля класса можно указать, инициализировав их в конструкторе с помощью зарезервированной ссылки на текущий объект self. Зарезервированным способом описания конструктора объекта в Python является определение функции следующего вида: «def
__init__(self, параметр1, параметр2, …)». Все функции, описанные под заголовком класса с отступом на четыре пробела вправо, интерпретируются
как методы данного класса и вызываются только с указанием объекта, к
которому они относятся в виде «Объект.метод(список_параметров)».
Прежде чем можно было бы обратиться к методам класса, необходимо создать объект этого класса. Это делается с помощью оператора присваивания следующим образом «имя_объекта = Имя Класса (параметры конструктора)».
Кроме стандартного имени конструктора класса __init__ существуют и другие зарезервированные имена для методов классов, имеющие
особый смысл. Все эти имена начинаются с двух символов подчёркивания
подряд и заканчиваются ими же. Так, например, для любого класса может

3. Программная реализация напряженно-деформированных состояний…
40
быть переопределён метод __str__. Он должен возвращать строковое значение, которое отображает некоторые важные свойства объекта в удобочитаемой форме. Это строковое значение как раз выводится на экран при попытке вызвать операцию print() с объектом в качестве параметра. Разумное
переопределение этого метода очень полезно при отладке. Так если, например, некоторый класс задаёт положение круга на плоскости, то удобно задать __str__ таким образом, чтобы он выводил координаты центра и радиус
этого круга. Если же у этого круга имеются другие атрибуты, важные для
рассматриваемой предметной области, например цвет, материал или температура, то можно выводить и их.
Другими полезными зарезервированными именами методов явля-
ются __eq__ (проверка на равенство двух объектов), __lt__ (задание отношения «меньше), __gt__ (задание отношения «больше») и др.
Подключать внешние модули в программу на Python можно с помощью директивы import. После подключение библиотеки все её средства для
исключения неоднозначностей вызываются с явным указанием её имени.
Например, подключив стандартную библиотеку math, можно получить доступ к широкому набору полезных математических функций, таких как
экспонента (math.exp), синус (math.sin), наибольший общий делитель
(math.gcd) и др.
Также следует отметить такую важную особенность программирования на Python, как выдерживание рекомендуемого стиля программирования. Рекомендации по стилю содержатся в коллективно принимаемых общих положениях, определяющих синтаксис Python и называемых Python
Enhancement Proposals (PEP). В частности, PEP 8 рекомендуют придерживаться отступов шириной четыре пробела и не превышать 72 символа в
строке для удобства чтения текста программы. Также рекомендуется придерживаться принятого стиля в именовании различных объектов. Константы рекомендуется именовать исключительно прописными буквами и
символами подчёркивания (например, PI, CONST_BOLTZMANN,
NUMBER_OF_ELEMENTS), переменные – строчными буквами и символами подчёркивания (x, max_error, matrix_row), классы – одним или несколькими слитными словами, каждое из которых начинается с прописной
буквы (Condition, GeometryBuilder, BoundBox). Такой способ именования
классов называется «camel notation».
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
