Как я могу построить результаты 2d FEM, используя matplotlib? - PullRequest
0 голосов
/ 06 сентября 2018

Я разрабатываю 2D-инструмент для конечных элементов плоскости. Одной из особенностей является возможность визуализации напряжений на конкретном объекте.

Этот инструмент создает четырехугольную сетку, используя следующие данные:

  • узлы : массив NumPy [[x1 y1], [x2 y2], etc] -> x и y координаты каждого узла в сетке

  • elements : массив numpy [[1 2 3 4], [2 3 5 6]] -> каждая строка массива соответствует 4 точкам одного конкретного элемента сетки.

Мне удалось реализовать метод построения сетки:

import matplotlib.pyplot as plt
import matplotlib.collections
import matplotlib.cm as cm

import numpy as np


def showMeshPlot(nodes, elements):

    y = nodes[:,0]
    z = nodes[:,1]

    #https://stackoverflow.com/questions/49640311/matplotlib-unstructered-quadrilaterals-instead-of-triangles
    def quatplot(y,z, quatrangles, ax=None, **kwargs):

        if not ax: ax=plt.gca()
        yz = np.c_[y,z]
        verts= yz[quatrangles]
        pc = matplotlib.collections.PolyCollection(verts, **kwargs)
        ax.add_collection(pc)
        ax.autoscale()

    plt.figure()
    plt.gca().set_aspect('equal')

    quatplot(y,z, np.asarray(elements), ax=None, color="crimson", facecolor="None")
    if nodes:            
        plt.plot(y,z, marker="o", ls="", color="crimson")

    plt.title('This is the plot for: quad')
    plt.xlabel('Y Axis')
    plt.ylabel('Z Axis')


    plt.show()

nodes = np.array([[0,0], [0,0.5],[0,1],[0.5,0], [0.5,0.5], [0.5,1], [1,0], 
                  [1,0.5],[1,1]])
elements = np.array([[0,3,4,1],[1,4,5,2],[3,6,7,4],[4,7,8,5]])
stresses = np.array([1,2,3,4])

showMeshPlot(nodes, elements)

Который производит сюжет, подобный этому:

quad mesh

Теперь у меня есть одномерный массив с напряжениями на объекте, такой же длины, что и массив элементов.

Мой вопрос: как я могу визуализировать эти напряжения (с помощью скалярного стержня), используя matplotlib? Я посмотрел в pcolormesh, но я не мог понять, как он может работать с моими данными. Вот пример того, чего я хочу достичь (кредиты для robbievanleeuwen):

example

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

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

PolyCollection - это ScalarMappable. Он может иметь массив значений, цветовую карту и набор нормализации. Здесь вы должны указать массив stresses для PolyCollection и выбрать некоторую цветовую карту для использования. Остальное немного перестраивает функцию, которая может принимать дополнительные данные в качестве входных данных и создает цветную полосу.

import matplotlib.pyplot as plt
import matplotlib.collections
import numpy as np


def showMeshPlot(nodes, elements, values):

    y = nodes[:,0]
    z = nodes[:,1]

    def quatplot(y,z, quatrangles, values, ax=None, **kwargs):

        if not ax: ax=plt.gca()
        yz = np.c_[y,z]
        verts= yz[quatrangles]
        pc = matplotlib.collections.PolyCollection(verts, **kwargs)
        pc.set_array(values)
        ax.add_collection(pc)
        ax.autoscale()
        return pc

    fig, ax = plt.subplots()
    ax.set_aspect('equal')

    pc = quatplot(y,z, np.asarray(elements), values, ax=ax, 
             edgecolor="crimson", cmap="rainbow")
    fig.colorbar(pc, ax=ax)        
    ax.plot(y,z, marker="o", ls="", color="crimson")

    ax.set(title='This is the plot for: quad', xlabel='Y Axis', ylabel='Z Axis')

    plt.show()

nodes = np.array([[0,0], [0,0.5],[0,1],[0.5,0], [0.5,0.5], [0.5,1], [1,0], 
                  [1,0.5],[1,1]])
elements = np.array([[0,3,4,1],[1,4,5,2],[3,6,7,4],[4,7,8,5]])
stresses = np.array([1,2,3,4])

showMeshPlot(nodes, elements, stresses)

enter image description here

0 голосов
/ 06 сентября 2018

Я думаю, что ваш лучший вариант - использовать триконтур . У вас уже есть триангуляция, верно?

Он создает графики, подобные этому: enter image description here

( отсюда )

https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.tricontour.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...