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

Метод конечных элементов для моделирования устройств и систем. Учебное пособие

.pdf
Скачиваний:
2
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
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».
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]