Самый эффективный способ построения конечно-элементной сетки с использованием matplotlib? - PullRequest
0 голосов
/ 18 апреля 2019

Мой вопрос довольно прост, но для тех, кому нужно больше контекста, см. Страницу Википедии о методах конечных элементов .

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

nodeinfo=[[0.000,0.000],[1.000,0.000],[2.000,0.500],[0.000,1.000],
[1.000,1.000],[1.750,1.300],[1.000,1.700]]
elementInfo=[[1,2,5],[5,4,1],[2,3,6],[6,5,2],[4,5,7],[5,6,7]]
nodevalues=[1,2,1,2,7,4,5]

enter image description here

nodeinfo - это координаты каждого узла (например, узел 7 имеет координаты (1,1.7)), elementInfo показывает, из каких узлов состоит каждый элемент (например, элемент 3 имеет узлы 2,3,6), значения узлов дают значение каждый узел (например, узел 5 имеет значение 7).

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

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

class node:
    # Initializer / Instance Attributes
    def __init__(self, number, xCord, yCord):
        self.number=number
        self.value=1
        self.isOnBoundary=False
        self.xCord=xCord
        self.yCord=yCord
        self.boundaryType=None
        self.element=[]

    #makes all class variables callable
    def __call__(self):
        return self

    def checkIfOnBoundary(self,boundarylist):
        # Checks if the node is on the boundary when it is invoked
        # If the node is not on the boundary then it is set to false

        if self.number in boundarylist:
            self.isOnBoundary=True
            self.boundaryType=boundarylist[self.number][0]
            if self.boundaryType == "Dirchlet":
                self.value=boundarylist[self.number][1]
        else:
            self.isOnBoundary=False

    def setElement(self,elementInfo):
        #given a list in the form [element1,element2,...,elementn]
        #where element1 is a list that contains all the nodes that are on that element
        for element in elementInfo:
            if self.number in element:
                self.element.append(elementInfo.index(element)+1)


    def setValue(self,value):
        # changes the value of the node
        self.value=value

    def description(self):
        return "Node Number: {}, Node Value: {}, Element Node Belongs to: {}, Is Node On the Boundary: {}".format(self.number, self.value, self.element, self.isOnBoundary)

nodeinfo=[[0.000,0.000],[1.000,0.000],[2.000,0.500],[0.000,1.000],
[1.000,1.000],[1.750,1.300],[1.000,1.700]]
elementInfo=[[1,2,5],[5,4,1],[2,3,6],[6,5,2],[4,5,7],[5,6,7]]
nodevalues=[1,2,1,2,7,4,5]

#create list of node objects which we will call on often
nodes=[]
for i in range(len(nodeinfo)):
    print(i)
    nodes.append(node(i+1,nodeinfo[i][0],nodeinfo[i][1]))
    nodes[i].setElement(elementInfo)

#print information related to each object
for phi in nodes:
    print(vars(phi))
...