Fem analysis что это

от admin

Finite Element Method

The finite element method is a numerical technique used to solve complex engineering and physical problems. It is a powerful tool that allows for the accurate prediction of the behavior of a system under a wide range of conditions, making it an essential tool for engineers and scientists working in fields such as structural analysis, fluid dynamics, and electromagnetics. In this blog post, we will explore the basics of the finite element method and how it is used to solve real-world problems using Python. Whether you are an experienced engineer or a curious learner, I hope that this post will provide you with a better understanding of this important and versatile method.

By the end of this tutorial, you will be able to use Python to implement the finite element method and apply it to solve simple problems.

All the code can be found here.

Introduction

The Finite Element Method works by dividing a physical space into different elements and applying the governing equations to each element. This is very useful for complex geometries or boundary conditions were obtaining an analytical expression is not feasible.

Although FEM can be applied for many different physical problems, it is more commonly used in structural analysis. Therefore will be developing the FEM for structural analysis in 2D. In this example the structural case will be a 2D rectangular plate ( \(3m \times 10m\) ) with an hole of \(1m\) of diameter, fixed on one side and subjected to a constant tension force of \(1 \hspace <1mm>kN\) on the opposite side:

To simplify the calculations, 3-node triangular elements will be used.

The main equation in the FEM for structural analysis is the following: \[\textbf \textbf = \textbf\] Where \(\textbf\) is the displacement vector, \(\textbf\) is the force vector and \(\textbf\) is the stiffness matrix. The displacement vector contains the displacements of the nodes, the force vector is composed by the external forces and the reaction forces of the nodes. For the rest of the tutorial the force vector will be expressed as the sum of the external forces ( \(\textbf\) ) and the reaction forces ( \(\textbf\) ): \[\textbf \textbf = \textbf + \textbf\]

While the displacements and forces seem quite intuitive to understand, the stiffness matrix is a bit more abstract. It can be understood as the resistance to deformation. It is analogous to the spring constant ( \(k\) ) in Hooke’s law:

Requirements

To run this code some libraries are required:

To start we must import some libraries, including numpy , pygmsh , drawMesh and gmsh . NumPy is a library for scientific computing in Python, and is often used for numerical calculations and data manipulation. The math library provides mathematical functions. The library drawMesh is a simple mesh visualization library based on pyglet developed for this project, it can be found in the github repository. Finally, gmsh is a powerful mesh generation software that can be used in conjunction with pygmsh . Together, these libraries provide the tools necessary to implement the finite element method in Python.

The splitting of the geometry into elements and nodes can be done manually but it becomes exponentially difficult for complex geometries and finer mesh resolutions. Therefore we make use of gmsh , a powerful meshing tool.

We create the mesh using pygmsh . The mesh resolution is defined in the variable resolution . The lower the value of resolution , the more the mesh will be divided into elements. This will lead to better results but higher computational cost. One of the key decisions when working with the FEM is to balance between mesh resolution and computing power.

The resultant mesh looks like this:

This mesh is composed of many nodes, that form triangular elements. Some nodes are shared by different elements.

The following code defines the Node class, which represents a node in a mesh. The class has several attributes and methods that are used to store and manipulate information about the node, such as its coordinates, forces, and displacements.

The init method is used to initialize a new Node object, and accepts the node’s id , x and y coordinates as arguments. The fx and fy attributes are used to store the external forces applied to the node, and the rx and ry attributes are used to store the reaction forces at the node. The dx and dy attributes are used to store the displacements of the node.

The dfix property returns a boolean value indicating whether the node is fixed in both x and y directions. The externalForce property returns a boolean value indicating whether the node has any external forces applied to it. The __eq__ method is used to compare two Node objects and returns a boolean value indicating whether they are at the same location. This class can be used to represent nodes in a mesh and perform operations on them.

Element

Each element contains a series of nodes. In this case, we are using triangular nodes therefore each element has three nodes. It is important for the calculations that the nodes in each element are ordered counter-clockwise, therefore the passed nodes in the initialization are ordered with the orderCounterClock() method. The getArea() method calculates the area of the element. Each element contains a stress ( \(\vec<\sigma>\) ) and a strain ( \(\vec<\varepsilon>\) ) attributes:

The getColor method takes the colorVal variable and returns a RGB color taking in account the maximum and minimum colorVal of the elements. The colorFunc is used to interpolate the colors and the values, by default it is a linear function, but in some cases it may be useful to have a logarithmic interpolation instead for example.

It is important to make the distinction between global and local variables and clarify the notation. Element numbers are denoted with a superscript and node numbers are denoted with a subscript. When a variable does not have a superscript is a global variable. For example, the local point \(0\) of the element number \(4\) is denoted as \(P_0^<(4)>\) . Note the difference between a local and global point, \(P_0^ \ne P_0\) .

The force-displacement equation for an element is: \(\mathbf \mathbf = \mathbf + \mathbf\) , where the displacements vector ( \(\mathbf\) ), and stiffness matrix ( \(\mathbf\) ) have the following form:

The stiffness matrix for each element can be obtained deriving the weak form of the elasticity problem (see Fish and Belytschko 2007, 227) , resulting in the following equation: \[ \mathbf = \int_<\Omega>(\mathbf)^T \mathbf \hspace <1mm>\mathbf d \Omega \] The Hookean matrix \(\mathbf\) will be discussed later on, but basically, it relates the strain and stresses taking in account the material properties. The matrix \(\mathbf\) is a bit more complex, but the main thing to understand is that it relates the displacements at the nodes of an element to the gradient of the displacement function \(\theta^e(x,y)\) (see Fish and Belytschko 2007, 78–84) .

\[ \nabla \theta^e = \mathbf^e \mathbf^e \]

The displacement function can be understood as an interpolation of the node displacements across the space of the element. This can be any arbitrary polynomial function such that at the nodes the function matches the displacement, and that the continuity condition is meet at the boundaries of the elements.

For simplification purposes in this tutorial we will use a three-node linear function which yields the following formula to construct the \(\mathbf\) matrix (see Fish and Belytschko 2007, 160) .

\[\begin \mathbf = \frac<1> <2 A^e>\begin (y_1^e — y_2^e) & 0 & (y_2^e — y_0^e) & 0 & (y_0^e — y_1^e) & 0 & \\ 0 & (x_2^e — x_1^e) & 0 & (x_0^e — x_2^e) & 0 & (x_1^e — x_0^e) & \\ (x_2^e — x_1^e) & (y_1^e — y_2^e) & (x_0^e — x_2^e) & (y_2^e — y_0^e) & (x_1^e — x_0^e) & (y_0^e — y_1^e) & \\ \end \end\]

This choice of the linear function results in a \(\mathbf\) matrix that is constant along the surface ( \(\Omega\) ) of the element, therefore we can simplify the weak form equation to obtain the element stiffness matrix:

Preprocessing

Extracting mesh data

The mesh contains points and cells data. Each data row in the cells array contains the index of the three points of a cell or element.

  • \(N_\) : Number of elements
  • \(N_\) : Number of nodes (or points)

Because of how the pygmsh library works, the mesh starts counting points including some points like the center of the circle that are not exported to the mesh. Therefore the numbering of the nodes must be modified so that the first point in the mesh is numbered as \(0\) :

Next, the elements and nodes are generated and stored in the lists elements and nodes respectively:

Material properties

As mentioned before the \(\mathbf\) matrix relates the stress and strains of an element. The Hookean matrix can be calculated with the Young’s modulus ( \(E\) ) and Poisson’s ratio ( \(\nu\) ):

For this example lets use the material properties of steel.

Boundary conditions

Once the mesh and material properties are defined the next step is to define the boundary conditions, external forces, reaction forces and unknowns. The unknown variables, i.e variables to solve for, are defined by assigning the None value. All the displacements are None by default, and all the external and reaction forces are 0.0 by default.

Matrix assembly

Now that the mesh and case conditions are defined the \(\mathbf\) matrix must be obtained to solve the displacements-forces equation. The global stiffness matrix can be obtained as the sum of the element stiffness matrices \(\mathbf<\hat^e>\) .

Note that \(\mathbf<\hat^e> \ne \mathbf\) . The local stiffness matrix of an element ( \(\mathbf\) ) has a shape of \((6 \times 6)\) while the global stiffness matrix of an element ( \(\mathbf<\hat^e>\) ) has a shape of \((2 N_ \times 2 N_)\) . Therefore we need a function that map each element’s local stiffness matrix to the global one.

The assemblyK function takes as arguments the global total stiffness matrix and the nodeAssembly , and adds to \(\mathbf\) the element stiffness matrix:

The following code iterates throughout all the elements and sums the stiffness matrix. Each element has an attribute assembly that contains the relations between the local position of the nodes in the element to the global position of the node.

Now we have the matrix \(\mathbf\) but we need to create and fill in the forces, reactions and displacements vectors with the values of the nodes so that the problem can be solved using the numpy library. As some nodes have unknown values we create the lists rowsrk and rowsdk that store the rows where the reaction forces are known and the displacements are known respectively.

Solver

Now that we have the stiffness matrix ( \(\mathbf\) ), forces vector ( \(\mathbf\) ), reactions vector ( \(\mathbf\) ) and displacements vector ( \(\mathbf\) ), we must organize this vectors and matrices by the known and unknown variables in such a way that can be solved. For example, in the following equation, \(d_1\) , \(d_2\) and \(r_0\) are unknowns: \[\begin \begin k_ <00>& k_ <01>& k_ <02>\\ k_ <10>& k_ <11>& k_ <12>\\ k_ <20>& k_ <21>& k_ <22>\\ \end \begin 0 \\ d_1 \\ d_2 \\ \end = \begin r_0 \\ -4 \\ 10 \\ \end \end\]

The matrix system of equations can be partitioned in such a way that we can separate the unknowns and knowns in the forces and displacements vectors. So \(\mathbf\) is the vector of known displacements and \(\mathbf\) the vector of unknowns. The same is done to obtain the forces vectors \(\mathbf\) and \(\mathbf\) .

We can then rewrite the system of equations:

From this matrix equation we can separate the knows and unknowns to get a set of equations to solve for the unknowns. Because the known displacements are null, we can further simplify the equations:

\[ \mathbf = \mathbf^T> \mathbf + \mathbf \mathbf = \mathbf \mathbf \]

In the following code this matrices are constructed such that, \(\mathbf_ = \mathbf_\) and \(\mathbf_ = \mathbf_\) , where \(t\) and \(s\) are the indexes of the rows of the unknown reactions and displacements respectively.

The previous equations can be then rearranged to solve for the unknown displacements and forces: \[ \mathbf = \mathbf^ <-1>\mathbf \hspace <30mm>\mathbf = \mathbf \mathbf \]

Using the linalg.inv function of numpy the matrix \(\mathbf\) is inverted. This operation is computationally expensive and grows with the number of nodes. There are other algorithms like the LU decomposition that can improve the performance of this calculation, but for the sake of simplicity we will stick with the matrix inversion.

Postprocessing

Now that we have solved the problem, the only thing left is to restructure and visualize the results. We take the solved displacements stored in du and assign them to the correspondent position in the final displacement vector d_total :

Next we assign the final displacement values to the correspondent nodes:

von Mises stress

The von Mises yield criterion is a very good way to estimate when an element will undergo plastic deformation by comparing the von Mises stress equivalent to the critical yield stress of the material. The von Mises equivalent stress can be calculated with the following equation: \[ \sigma_v = \sqrt <\sigma_+ \sigma_ + 3\sigma_^2 — \sigma_\sigma_ > \]

Visual representation

The rgb function interpolates an input value between a maximum and minimum and returns a specific RGB color. The lower values are light blues and the higher are reds and yellows.

The static attribute colorFunc of the Element class defines the function used to interpolate the values to the color. Here we set it to a linear function but it can be changed to an logarithmic function for example.

The stresses are calculated using the generalized Hook’s expression. \[ \varepsilon^e = \mathbf^e \mathbf^e \hspace <20mm>\sigma^e = \mathbf \varepsilon^e \]

The strains and stresses are calculated for each element and the color of each element is assigned depending on the value of the von Mises stress. The colorVal determines the value used for coloring, this can be modified so that the strains are colored instead for example.

Finally the results are viewed using the drawMesh module:

If we rerun the code changing the force direction downwards we get the following result:

This particular problem of a plate with a hole in tension has been studied thoroughly due to its implications regarding riveting, aircraft pressurization and many other applications. There is an analytical expression to calculate the stresses in polar coordinates in a rectangular plate with a hole of radius \(R\) subjected to a tensional stress at both ends of \(\sigma_t\) :

\[ \sigma_r(r, \theta) = \frac<\sigma_t> <2>\left( 1- \frac \right) + \frac<\sigma_t> <2>\left( 1 + 3\frac — 4 \frac \right) \cos(2\theta) \]

\[ \sigma_<\theta>(r, \theta) = \frac<\sigma_t> <2>\left( 1 + \frac \right) — \frac<\sigma_t> <2>\left( 1 + 3\frac \right) \cos(2\theta) \]

Calculating the von Mises stress and plotting the analytical expression using the same values as the example, yields the following result :

We can see that the results of the FEM method are the same as the predicted by the analytical method.

Просто о нелинейном анализе методом конечных элементов. На примере кронштейна

Привет, Хабр! Цель написания этой статьи – как можно более понятно представить приемы конечно-элементного моделирования на примере такой непростой темы, как нелинейный анализ. Я более семи лет проработал в отделе динамической прочности АО «ВПК «НПО машиностроения», где занимался расчетно-экспериментальным сопровождением изделий ракетно-космической отрасли. Также около трех лет помогал строительным и нефтяным компаниям закрывать их самые сложные расчетные проблемы. Пришло время поделиться опытом.

Продакт-менеджер по направлению Femap АО «Нанософт» Филипп Титаренко

Введение, или Зачем и про что эта статья

Далеко не все инженеры умеют решать задачи нелинейного анализа. А многих, даже из числа тех, кто специализируется на расчетах в программах конечно-элементного анализа, словосочетание «нелинейный анализ» вводит в заблуждение или же вовсе пугает. Тем, кто мимоходом пробовал решать такие задачи, вспоминаются окна с большим количеством настроек и какие-то графики, которые куда-то движутся и при этом что-то «не сходится» (рис. 1). Однако не только научные задачи, но и современные инженерные нормы и стандарты зачастую требуют учитывать нелинейность в расчетных моделях. Причем эти требования существуют не только в космической, авиационной, машиностроительной отраслях. Так, например, свод правил СП 385.1325800.2018 «Защита зданий и сооружений от прогрессирующего обрушения» при проведении расчетов требует учитывать геометрическую и физическую (пластичность, ползучесть и др.) нелинейности.


Рисунок 1

Статистика на сегодняшний день такова, что около 90% расчетов приходится на линейный анализ. С точки зрения экономики, линейный анализ – это быстро, просто и дешево. Но если вам необходимо рассчитать отклик на воздействие ударов, учесть инерционные эффекты, проследить изменение температурных или других параметров во времени, учесть наличие поверхностей контакта, геометрические нелинейности или сложные механизмы поведения материалов, без нелинейного анализа и без умения правильно настроить решатель вам не обойтись. Основные виды нелинейности – физическая геометрическая и обусловленная наличием поверхностей контакта.

В Рунете (да и в глобальной сети) на тему нелинейного анализа методом конечных элементов есть два условных типа образовательных материалов: 1) не слишком длинные инструкции, куда и в какой последовательности нажать в вашей САПР, чтобы рассчитать ваши «балку, нагрев, кронштейн, течение…», либо 2) толстые институтские учебники/научные работы или многостраничные руководства пользователя, которые можно и нужно долго изучать… но в ближайшие дни и недели вряд ли получится что-то посчитать самостоятельно.

Данная статья – это попытка автора на конкретном примере в конкретной САПР проиллюстрировать алгоритм проведения нелинейного статического анализа «с нуля» и до анализа решения, при этом предложив некоторые объяснения теоретическим основам, связанным с настройками решателя.

Задачу мы будем решать в пре-постпроцессоре Femap с решателем NX Nastran, еще с середины 70-х годов прошлого века многократно доказавшим свои надежность, точность и скорость. Я пользуюсь Femap 2020.2, но в целом алгоритм решения такого рода задач идентичен не только в предыдущих версиях Femap, но и в других КЭ расчетных комплексах.

На чем будем тренироваться? Нелинейный статический анализ

Нет, тренироваться, в отличие от героя старой кинокомедии (рис. 2), будем не на кошках.


Рисунок 2

Нам предстоит рассчитать Г-образный кронштейн за пределом текучести стали. Реальным прототипом кронштейна может быть альпинистский шлямбур, кронштейн на МКС или элемент навесного вентилируемого фасада. Я выбрал его потому что, с одной стороны, не хотел брать готовую модель, а с другой – хорошо было бы не тратить много времени читателя на процесс создания геометрии. С точки зрения модели все будет максимально просто, больше внимания я уделю теории и настройкам решателя. При таком подходе у читателя будет возможность самостоятельно повторить весь процесс – от создания модели до ее численного анализа. И даже провести натурный эксперимент.

В процессе подготовки статьи я обнаружил у себя дома подобный, но перфорированный кронштейн (рис. 3), ранее выведенный мною плоскогубцами за пределы текучести – правда, при других граничных условиях закрепления. И в других целях – не научно-экспериментальных, а в бытовых…


Рисунок 3

Но при желании вы всегда сможете верифицировать свой численный эксперимент: такие кронштейны есть во всех строительных магазинах.

Немного теории: отличия линейного и нелинейного анализа

Для практики решения инженерных задач с точки зрения внутренних расчетных алгоритмов важно осознавать, что в нелинейном анализе нагрузки прикладываются постепенно и фактически решатель последовательно решает множество задач. При линейном статическом анализе всегда делается лишь один шаг: от начального состояния к конечному. При решении нелинейной задачи все заданные нагрузки будут приложены к телу не сразу.

Исходными данными для каждого последующего шага в нелинейном анализе является состояние модели на предыдущем шаге. Причем на каждом шаге внутренние и внешние силы (энергетические параметры) должны быть уравновешены с учетом некоторой погрешности (рис. 4). Величину допустимой погрешности определяет критерий сходимости (Convergence Tolerances). Обычно этот критерий задается в процентах от приложенной нагрузки, где под нагрузкой понимаются все приложенные к модели внешние силы или, в случае нагружения перемещением, – силы реакции. Обилие настроек объясняется сложностью расчетных алгоритмов, сопутствующих нелинейному анализу. Типовое значение критерия сходимости по силам находится в диапазоне от 0,1 до 1% приложенной нагрузки. В поиске сходимости на шаге решения программа может выполнить множество итераций. По этим причинам решение нелинейных задач занимает намного больше машинного времени, чем решение линейных статических задач. Важно осознавать, что многошагового подхода могут по разным причинам (типам нелинейностей) требовать задачи, результат решения которых не зависит от времени.


Рисунок 4

Самый простой пример, на котором можно понять это утверждение, – нагружение упруго-пластичной конструкции нагрузкой, при которой напряжение превысит предел текучести. Решатель заранее «не знает», при какой нагрузке напряжение в отдельных узлах модели превысит этот предел и, следовательно, принципиально изменятся параметры уравнений, описывающих напряженно-деформированное состояние тела. При этом на каждом шаге приращения силы нужно учитывать изменение зоны пластической деформации. Поэтому решение проходит множество шагов приращения нагрузки, а шаги в свою очередь при необходимости выполняются за определенное количество итераций. Вычисления матрицы жесткости могут повторно осуществляться на каждом шаге решения. Частота пересчета матрицы жесткости задается пользователем. Пластичность – это физическая нелинейность.

В связи с «многошаговостью» и «итерационностью» процесса решения рекомендую освоить вкладку Nonlinear History (Нелинейная хронология решения), на которую можно перейти, запустив решатель. В ней вы сможете по графику в режиме реального времени отслеживать количество выполненных итераций и уровень достигнутой нагрузки (Load Factor). По этому графику можно анализировать скорость сходимости решения. Если что-то пошло не так, то решатель прервет процесс решения и выдаст сообщение, что решение не сходится.

Линейный анализ может использоваться только для анализа моделей с линейными материалами при условии, что нелинейностей других видов нет. Линейные материалы могут быть изотропными, ортотропными или анизотропными. Если материал в модели имеет нелинейные характеристики «напряжение – деформации» под заданной нагрузкой, должен использоваться нелинейный анализ. В нелинейном анализе могут быть использованы различные типы моделей материалов.

При нелинейном статическом анализе динамические явления, подобные инерционным силам и силам демпфирования, не учитываются. Обработка нелинейного статического решения отличается от обработки линейного статического решения несколькими основными позициями, представленными в табл. 1.

Общей теории на этом достаточно, а о том, как настроить алгоритмы решения глобальной нелинейной системы алгебраических уравнений, порождаемой методом конечных элементов, я напишу ниже, когда мы дойдем до соответствующего места при разборе нашего практического примера с кронштейном. В Femap большая часть этих настроек находится в диалоговом окне Nastran Nonlinear Analysis, куда можно попасть из диалогового окна Analysis Set, установив 10..Nonlinear Static в поле Analysis Type и несколько раз нажав кнопку Next. Но всему свое время.

Приступим к практике: моделирование кронштейна и линейный анализ в Femap с NX Nastran

В командном меню открываем File → Preferences → вкладка Geometry/Model. В настройках Solid Geometry Scale Factor устанавливаем Meters, что соответствует системе СИ измерений физических величин.

Наш Г-образный кронштейн будет состоять из двух квадратных пластин со сторонами длиной 0,1 метра, расположенных в перпендикулярных плоскостях. В командном меню перейдем в Geometry → Surface → Corners и последовательно создадим две квадратные пластины.
1) Координаты вершин для первой пластины: 1) X = 0; Y = 0; Z = 0; 2) X = 0,1; Y = 0; Z = 0; 3) X = 0,1; Y = 0; Z = 0,1; 4) X = 0; Y = 0; Z = 0,1.
2) Для второй: 1) X = 0; Y = 0; Z = 0; 2) X = 0; Y = 0,1; Z = 0; 3) X = 0; Y = 0,1; Z = 0,1; 4) X = 0; Y = 0; Z = 0,1.

Последовательно забив эти точки в диалоговое окно Locate → Enter № Corner of Surface, получим нужную геометрию. Нажатием клавиш Ctrl+A мы можем отобразить нашу геометрию в центре видового экрана в удобном масштабе.

Далее создадим материал наших пластин (Сталь 3) и определим его свойства. Для этого в панели Model Info, расположенной в левой части экрана, раскроем вкладку Model, затем щелкнем правой кнопкой мыши на строке Materials и нажмем New. Откроется диалоговое окно Define Material – ISOTROPIC. В поле Title введем наименование St3. В поле General зададим модуль Юнга (Young’s Modulus), E = 2e11, коэффициент Пуассона (Poisson’s Ratio), nu = 0,3, плотность (Mass Density) = 7850. На вкладку Nonlinear пока переходить не будем. Нажимаем ОК, а затем Cancel.

Создадим тип конечного элемента и укажем его свойства. Для этого во вкладке Model щелкнем правой кнопкой мыши на строке Properties и нажмем New. Откроется диалоговое окно Define Property – Plate Element Type. В поле Title введем наименование Pl0005. Во вкладке Material выберем 1..St3. Затем нажмем кнопку Elem/Property Type и убедимся, что флажок стоит в нужном месте: Plane Elements – Plate. То есть выбран плоский конечный элемент – пластина. Зададим толщину пластины, для этого в поле Thicknesses установим TavgorT1 = 0,005. Нажимаем ОК, а затем Cancel.

Сохраним нашу модель, для чего нажмем File → Save As, выберем путь для сохранения файла и имя файла. Я назову его KronNonlin.

Зададим свойства сетки конечно-элементной модели. Для этого в командном меню нажмем Mesh → Mesh Control → Size On Surface. В диалоговом окне Entity Selection → Select Surface(s) to Set Mesh Size нажмем Select All, чтобы выбрать все поверхности. Нажав ОК, мы попадаем в диалоговое окно Automatic Mesh Sizing. В поле Element Size выставляем значение 0,005 и нажимаем ОК. Теперь характерный размер наших конечных элементов будет равен 5 мм. На линиях модели появились точки, дающие нам информацию о том, какого размера будут элементы после создания конечных элементов.

Теперь создадим конечно-элементную модель. В командном меню нажмем Mesh → Geometry → Surface. В диалоговом окне Entity Selection → Select Surfaces to Mesh нажимаем Select All и ОК. В поле Property установим созданный нами тип КЭ 1..Pl0005, а в поле Mesher – флажок Quad. Нажимаем OK. Конечно-элементная модель создана. Теперь закрепим кронштейн и нагрузим его внешними силами.

Крепить кронштейн мы будем за четыре узла (такое закрепление более всего соответствует креплению заклепками или точечной сварке) по шести степеням свободы, и по линии стыка двух пластин – по трем степеням свободы (оставив возможность вращения вокруг линии).


Рисунок 5

Задаем граничные условия закрепления. Для этого щелкаем правой кнопкой мыши на Constraints, нажимаем New и вводим название Constr. Далее нажимаем правой кнопкой на Constraints Definitions и выбираем закрепление по узлам (Nodes). Выбрав четыре узла, как показано на рис. 5, закрепляем их по шести степеням свободы; нажимаем ОК. В поле Title диалогового окна Create Nodal Constraints/DOF пишем 4nodes и нажимаем на кнопку Fixed, чтобы ограничить перемещение-вращение. Нажимаем ОК. Вновь щелкаем правой кнопкой на Constraint Definitions и выбираем закрепление по линии (Curves). В поле Title диалогового окна Create Constraints on Geometry указываем Line и нажимаем кнопку Pinned – No Translation, чтобы ограничить перемещение, оставив возможность вращения.

Зададим условия нагружения, для чего правой кнопкой мыши щелкнем на Loads – New. Новый Set назовем Vert. Нажимаем правой кнопкой на Load Definitions – Nodal и выбираем четыре узла, к которым будут приложены данные нагрузки. В диалоговом окне Create Loadson Nodal назовем нашу нагрузку Force600. Узловые силы направлены по оси Y в отрицательном направлении. Величина узловой нагрузки FY – минус 600 Ньютон. Таким образом, к каждому из четырех узлов будет приложена нагрузка по 600 Ньютон (то есть 240 кг на все четыре узла).

Далее переходим к настройкам анализа. В командном меню выбираем Model → Analyses. Нажимаем кнопку New, чтобы выбрать тип анализа и решатель. В поле Title вводим Linear. Выбираем Analysis Program – 36..Simcenter Nastran и Analysis Type 1..Static. Затем нажатием на кнопку Analyze запускаем расчет. Решение занимает у меня меньше одной секунды (!). Femap показывает нам окно наблюдений за результатами анализа: Simcenter Nastran Analysis Monitor. Строка Analysis complete 0 означает, что анализ успешно завершен.

В Model Info щелкаем правой кнопкой мыши на Results → All Results → Deform. Теперь мы видим деформированное состояние нашего кронштейна в гиперболизированном виде. На мой взгляд, деформированное состояние визуально чрезмерно преувеличено, поэтому нажмем F6: откроется диалоговое окно View options. Перейдем во вкладку PostProcessing, Deformed Style в поле Scale установим 4%. Теперь визуализация деформированного состояния модели преувеличена меньше. Максимальные перемещения можно посмотреть в левом нижнем углу модели – они составляют 0,0026 м.

Нажмем клавишу F5 и отобразим распределение напряжений по модели. В поле Contour Style установим флажок на Contour, затем нажмем кнопку Deformed and Contour Data. Во вкладке Contour выберем 7033 Plate Top Von Mises Stress, чтобы Femap отобразил напряжения в узлах. Наша модель стала разноцветной, цвета отображают уровень напряженности (рис. 6). В правой части экрана мы видим шкалу, отображающую, какому цвету какой уровень напряжений соответствует. Чтобы скрыть геометрическую исходную модель, нажмем на иконку View Surfaces Toggle. Максимальные напряжения достигают 332,4 МПа, что значительно выше предела текучести 210 МПа для стали Ст3.


Рисунок 6

Итак, напряжения в точках кронштейна значительно выше предела текучести. Линейный анализ не учитывает текучесть-пластичность материалов и связанный с этим явлением эффект перераспределения напряжений, поэтому данное распределение напряжений не соответствует реальности. Переходим к нелинейному анализу.

Практика: нелинейный статический анализ в Femap с NX Nastran

Чтобы перейти от линейной к нелинейной модели, нам нужно выполнить всего пару действий (разбиение, условия закрепления и нагрузки мы не меняем).

Изменим свойства материала, добавив пластические деформации; для этого во вкладке Materials щелкнем правой кнопкой мыши на нашем материале 1… St3 и нажмем Edit. Перейдем на вкладку Nonlinear и в поле Nonlinearity Type выберем Plastic. В поле Yield Criterion выберем 0..von Mises, в поле Initial Yield Stress вводим значение 210 000 000 (то есть 210 МПа). Жмем ОК.

NX Nastran поддерживает следующие критерии пластичности:

  • Мизеса (von Mises) – для пластичного материала используется в большинстве случаев;
  • Треска (Tresca) – для хрупких и некоторых пластичных материалов;
  • Друкера-Прагера (Drucker-Prager) – для материалов типа грунта и бетона с внутренним трением;
  • Мора-Кулона (Mohr-Coulomb) – для материалов типа камень с внутренним трением.
  • Осталось настроить решатель.


Рисунок 7

При необходимости учета эффекта ползучести нужно установить галочку в поле Creep.
В поле Basic устанавливаем количество шагов приращения нагрузки (Increments or Time Steps) и максимальное количество итераций на каждом шаге (Max Iterations / Steps). В случае нелинейного статического анализа Increments or Time Steps отражают уровень нагрузки. На графике Nonlinear History (Нелинейная хронология), иллюстрирующем в реальном времени количество выполненных итераций, уровень нагрузки отложен на вертикальной оси и называется Load Factor. Его величина лежит в диапазоне от 0 до 1. За заданное количество шагов нагрузка меняется от 0 до полной; при этом, если того требуют условия сходимости, в рамках одного шага выполняется несколько итераций. Эти два параметра очень важны, в каждой задаче нужно постараться выбрать «золотую середину» между слишком большим количеством «шагов» и «итераций» и слишком маленьким. Если их слишком мало, то решение не сойдется или будет оказано негативное влияние на точность. Если же их количество окажется чрезмерным, решение будет затрачивать очень много машинных мощностей, времени, и может быть оказано негативное влияние на сходимость. Чтобы исследовать влияние этих параметров, мы прорешаем нашу задачку с кронштейном несколько раз при различных сочетаниях количества «шагов» и «итераций», наблюдая при этом за графиком нелинейной хронологии.

Для нелинейной статической задачи в поле Stiffness Updates можно выбрать один из трех методов (AUTO, ITER, SEMI) обновления матрицы жесткости тела, а также количество итераций (Iteration Before Update), через которое матрица будет обновляться. Если метод выбран неверно, то автоматически будет использоваться 0..Default (по умолчанию). В методе AUTO матрица жесткости обновляется исходя из оценок сходимости разных численных методов (квазиньютоновского, с линейной итерацией, половинного деления) и с выбором того из них, что даст минимальное количество обновлений матрицы жесткости. Метод SEMI подобен методу AUTO, но обновление матрицы жесткости обязательно проводится и на первой итерации после изменения нагрузки, что бывает эффективно для сильно нелинейных процессов. Метод ITER (в нелинейном анализе во времени ему подобен метод TSTEP) проводит обновление матрицы жесткости после указанного в поле Iteration Before Update количества итераций. Метод ITER эффективен для сильно нелинейных процессов, при которых геометрия тела в процессе деформирования резко изменяется (например, при потере устойчивости).

В поле Output Control задаются настройки вывода результатов на промежуточных шагах нагружения (временных шагах, если речь идет об анализе во времени). При проведении статического нелинейного анализа во вкладке Intermediate можно выбрать один из следующих вариантов: 0..Default (по умолчанию), YES (выводить), NO (не выводить), All (выводить на всех шагах). При нелинейном анализе во времени можно задать, через какое количество шагов следует выводить результат.

В поле Convergence Tolerance задаются допуски на удовлетворение условий сходимости для нагрузок (Load), перемещений (Displacement) и внутренней работы (Work). Влияние допуска по сходимости (Convergence Tolerances) на точность и время решения задачи рассмотрим на примере модели, изученной разработчиками Femap с NX Nastran из компании Siemens.
Очень большая нелинейная модель (950 000 DOFs) была тщательно исследована, чтобы определить влияние различных допусков критерия сходимости на время выполнения и точность расчета. В этой модели не было теплопередачи, зазоров или контактов. Результаты исследования показали, что приемлемая точность решения (в сравнении с решением, полученным при очень высоком уровне допуска по сходимости) может быть достигнута как для уровня допуска по сходимости «высокий», так и для уровня «инженерный». Уровень допуска по сходимости «предварительная оценка» дает результат с теми же общими тенденциями, что и более высокие уровни допуска, но ответы недостаточно точны для рабочего проекта. При уменьшении уровня допуска по сходимости расчет происходит значительно быстрее. В табл. 2 можно количественно оценить представленные тенденции.

В поле Solution Strategy Overrides устанавливаются настройки процесса решения глобальной нелинейной системы алгебраических уравнений, порождаемой методом конечных элементов. Для осознанного изменения этих настроек нужно обладать знаниями и опытом – если их недостаточно, лучше оставить установки по умолчанию. Приведу некоторые разъяснения.
Arc-Length Method устанавливает величину временного шага (догрузки) с учетом информации о перемещении узлов тела – его следует использовать, если задача связана с резкой деформацией (потерей устойчивости).

Полный метод Ньютона-Рафсона (Full Newton-Raphson) очень быстро сходится, но нуждается в дополнительном времени на создание дополнительной матрицы для полной матрицы системы алгебраических уравнений на каждой итерации.

Модифицированный метод Ньютона-Рафсона (Modified Newton-Raphson) не нуждается в таком действии, но сходится значительно медленнее, поэтому для его ускорения могут применяться дополнительные процедуры: Line Search (линейного поиска), Quasi-Newton (квазиньютоновского ускорения) и/или Bisection (половинного деления).

Таким образом, мы разобрали основные настройки для нелинейного статического анализа (настройки нелинейного анализа во времени им во многом подобны). Для расчета нашего кронштейна в окне Nastran Nonlinear Analysis установим следующие параметры: в поле Increments or Time Steps – 50, Max Iterations / Step – 5, Stiffness Updates Method – 1..AUTO, Iterations Before Update – 5, Intermediate – 1..YES. Остальные настройки оставим без изменений. Нажимаем ОК и переходим в окно Analysis Set Manager. Чтобы запустить расчет, нажмем кнопку Analyze. Femap автоматически откроет окно Simcenter Nastran Analysis Monitor. Перейдем во вкладку Нелинейная хронология, переставив флажок с log на Nonlinear History (рис. 8).


Рисунок 8

Здесь отображается график, иллюстрирующий в реальном времени количество выполненных итераций и (в случае нашего нелинейного статического анализа) Load Factor, то есть фактор нагрузки от 0 до 1. В правом верхнем углу мы видим информацию о номере текущей итерации. Обращаю внимание, что это не номер шага приращения нагрузки, а именно номер текущей итерации. Каждый шаг приращения нагрузки может содержать в себе несколько итераций – это необходимо для выполнения алгоритмов, реализующих сходимость решения. Если приращение не сходится, это означает, что изменение в нагрузке слишком велико, чтобы перейти к следующему шагу; нагрузка снижается – выполняются дополнительные итерации внутри одного шага.

В окне Model Info откроем вкладку Results → All Results. Двойной щелчок мыши на строчке решений открывает результаты при различных уровнях нагрузки от 0 до 100%. Проанализируем совместно график нелинейной хронологии и напряженно-деформированное состояние кронштейна при различных уровнях нагрузки.

При уровне нагрузки от 0 до 0,62 (Load Factor) напряжения меньше предела текучести 210 МПа, после – начинается пластическая деформация стали кронштейна. Единице 1 соответствует полная приложенная нагрузка – 240 кг на четыре узла. Максимальные напряжения выделены красным цветом – они сконцентрированы возле линии пересечения поверхностей. При уровне нагрузки от 0,62 до 1 зона пластических деформаций растет – максимальные напряжения (в отличие от линейного анализа) не увеличиваются. При факторе нагрузки 0,82 скорость роста кривой уменьшается – это значит, что для удовлетворения условий сходимости на каждый шаг требуется большее количество итераций. Мы смогли достигнуть полной нагрузки 1 – максимальные перемещения составили 0,00283 м. В некоторых случаях (например, если бы мы значительно увеличили нагрузку) геометрия деформированного тела искажается настолько, что при данной стратегии (настройках решателя) сходимости достичь не удастся. Как видим, результаты нелинейного анализа качественно и количественно отличаются от результатов линейного анализа.

Проведем еще три расчета, выставив разные настройки по количеству шагов приращений и итераций (рис. 9). В первом случае были выставлены Increments or Time Steps – 50, Max Iterations / Step – 5.


Рисунок 9

Условия сходимости были соблюдены в 1-м, 2-м и 4-м расчетных случаях. В 3-м расчетном случае фатальная ошибка с пояснением, что решение не сходится, появилась при уровне нагрузки 0,8. Обратим внимание, что во 2-м и 4-м расчетах решение было выполнено успешно (полная нагрузка 1) при значительно меньшем количестве шагов и итераций. Наша модель достаточно проста, и все расчеты были проведены менее чем за 5 секунд. На больших моделях благодаря правильному выбору числа шагов приращения нагрузки и итераций может быть сэкономлено много машинного времени.

Заключение

За рамками этой статьи осталось множество вопросов: многоступенчатое нагружение (применение Case и Subcase), применение нелинейных контактов, нелинейный анализ во времени, действия в случаях, когда решение «разваливается». Но я надеюсь, что основная цель статьи достигнута – у тех читателей, кто не имеет обширного опыта в решении нелинейных задач, теперь есть минимальный набор теоретических знаний и практических образов, чтобы начать работу с нелинейным анализом методом конечных элементов.

Литература
  1. Basic Nonlinear Analysis User’s Guide. Siemens.
  2. Рудаков К.Н. Femap 10.2.0. Геометрическое и конечно-элементное моделирование конструкций. К.: КПИ, 2011. – 317 с., ил.

Филипп Титаренко,
продакт-менеджер по направлению Femap
АО «Нанософт»
E-mail: titarenko@nanocad.ru

Уважаемые читатели, приглашаю вас на три интересные и полезные мероприятия, которые состоятся в ближайшее время:

  1. 20 августа я провожу бесплатный вебинар «Нелинейный анализ в Femap с NX Nastran».
  2. 17 сентября жду вас на вебинаре «Контактные задачи в Femap с NX Nastran». Ссылка на него появится в ближайшие дни в разделе мероприятий.

Finite Element Analysis

Kiran Mak

The Finite Element Method is a commonly used tool in engineering used to understand natural processes. It’s kind of like if you had to count a pile of marbles. You wouldn’t be able to just stare at the pile and figure out how many marbles there were. You’d probably group the marbles into 5’s or 10’s and then count the larger groups.

  • You take a surface and cut it up into small groups called elements.
  • Then you find a simpler representation of the element (instead of 1+1+1+1+1, you’d say a group of 5).
  • And finally, combine all of the groups into one result

If you think about it, this is actually the same process by which one estimates definite integrals using Riemann sums. In fact, FEM is essentially applying Riemann sums to more complex, multi-dimensional problems.

gives the total area.

In this article I’m going to go more into the math behind FEA, but if you’re looking for an analogy based framework, you can read my other article here.

Let’s see how this method is like Riemann sums. In a 1d example, we can say u is a non-linear function for the dependent variable. We want to be able to approximate it using simpler linear functions, so we can use a linear combination of basis functions. Mathematically, it would be expressed as:

Essentially this means we take a bunch of basis functions ��ᵢ and multiply by a coefficient uᵢ. For example, if you were trying to create the function y=x²+8x, that would be a linear combination of 1*(x²) +8*(x).

Even more interestingly, when we do FEM, we can have a different coefficient over each interval. For example, if we were trying to create the function y=x²+8x from (-∞, 10] and y=2 from (10, ∞), then from -∞ to 10 we could have 1*(x²) +8*(x)+0*(1), and from 10 to , 0*(x²) +0*(x)+2*(1).

All in all, in FEM, the coefficient for a particular function is usually 0.

Какова важность FEM в САПР?

Метод конечных элементов (МКЭ) — популярный метод численного решения дифференциальных уравнений, возникающих в инженерном и математическом моделировании. Типичные проблемные области, представляющие интерес, включают традиционные области структурного анализа, теплопередачи, потока жидкости, массопереноса и электромагнитного потенциала.

Что такое анализ методом конечных элементов в САПР?

Анализ методом конечных элементов (FEA) — это компьютеризированный метод прогнозирования того, как продукт реагирует на реальные силы, вибрацию, тепло, поток жидкости и другие физические воздействия. Анализ конечных элементов показывает, будет ли продукт ломаться, изнашиваться или работать так, как он был разработан.

Что такое МКЭ в машиностроении?

Вступление. Метод конечных элементов (сокращенно FEM) — это численный метод получения приближенного решения класса задач, описываемых эллиптическими уравнениями в частных производных.

Что означает FEM в технике?

Метод конечных элементов (МКЭ) — это численный метод, используемый для выполнения анализа методом конечных элементов (МКЭ) любого данного физического явления.

В чем разница между FEM и FEA?

Метод конечных элементов (FEM) в основном относится к сложным математическим процедурам, используемым в вашем любимом решателе. Думайте об этом как о руководстве по теории, множеству уравнений и математики. Анализ конечных элементов (FEA) обычно используется в контексте применения FEM для решения реальных инженерных задач.

Почему функция интерполяции полиномиального типа в основном используется в МКЭ?

12) Какие интерполяционные функции полиномиального типа чаще всего используются в МКЭ? Полиномиальный тип интерполяционных функций в основном используется по следующим причинам: 1. Легко формулировать и компьютеризировать уравнения конечных элементов.

Какова полная форма FEM?

Полная форма МКЭ

Полная форма Категория Срок
Конечно-элементное моделирование Electronics FEM
Метод конечных элементов Космическая наука FEM
Менеджер по лесозаготовительной технике Должность FEM
F Военные и оборона FEM

Что такое элемент МКЭ?

Итак, что такое узлы и элементы в конечно-элементном анализе? В FEA вы делите свою модель на маленькие части. Они называются конечными элементами (КЭ). Эти элементы соединяют все характерные точки (называемые узлами), лежащие на их окружности. Эта «связь» представляет собой набор уравнений, называемых функциями формы.

Что такое переменная поля в FEM?

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

Какие из этих соотношений используются при решении одномерной задачи конечных элементов?

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

Что такое FEM в финансах?

Макроэкономический стабилизационный фонд (ФЭМ) Определение. Сырьевые товары Нефть.

Кто изобрел ФЭМ?

4.1 Предыстория. Концепция метода конечных элементов (МКЭ) была предложена Клафом в начале 1960-х годов в его печально известной книге под названием «Метод конечных элементов в анализе плоских напряжений».

Отличаются ли FEM и FEA, да или нет?

С технической точки зрения никакой разницы. Оба являются одним и тем же. Термин FEM более популярен в академических кругах, тогда как термин FEA хорошо известен в промышленности.

Читать:
Lpc2368fbd100 как прочитать прошивку

Похожие публикации