effizientere Windtunnelsimulation in Pygame mit numpy

9

Ich bin ein Student der Luft- und Raumfahrt, der an einem Schulprojekt für unseren Python-Programmierkurs arbeitet. Die Zuweisung ist ein Programm nur mit Pygame und numpy erstellen. Ich beschloss, eine Windkanalsimulation zu erstellen, die den Luftstrom über einem zweidimensionalen Flügel simuliert. Ich habe mich gefragt, ob es eine effizientere Möglichkeit gibt, die Berechnung aus einer Programmierperspektive zu machen. Ich werde das Programm erklären:

Ich habe hier ein Bild angehängt:

Das (stetige) Strömungsfeld wird mit der Vortex-Panel-Methode modelliert. Grundsätzlich benutze ich ein Gitter von Nx mal Ny Punkten, wo an jedem Punkt ein Geschwindigkeits- (u, v) Vektor gegeben ist. Mit Pygame mappe ich dann diese Gitterpunkte als Kreise, so dass sie einem Einflussbereich ähneln. Die Gitterpunkte sind die grauen Kreise in der folgenden Abbildung:

Ich erstelle N Partikel und ermittle deren Geschwindigkeiten, indem ich wie folgt iteriere:

Erstellen Sie eine Liste von Partikeln.
Erstellen Sie eine Rasterliste.

für jeden Gitterpunkt in der Gitterliste:
für jedes Partikel in der Partikelliste:
      wenn sich das Teilchen A innerhalb des Einflussbereichs des Gitterpunktes n (xn, yn) befindet:
Teilchen A seine Geschwindigkeit = Geschwindigkeit am Gitterpunkt n.

Visualisiere alles in Pygame.

Dieser einfache Weg war die einzige Möglichkeit, den Fluss in Pygame zu visualisieren. Die Simulation funktioniert ziemlich gut, aber wenn ich die Anzahl der Gitterpunkte (erhöhen Sie die Genauigkeit des Strömungsfeldes) erhöhen, sinkt die Leistung. Meine Frage ist, ob es eine effizientere Möglichkeit gibt, dies nur mit Pygame und Numpy zu tun?

Ich habe den Code hier angehängt:

%Vor%

Der Code erfordert ein anderes Skript, das das Flussfeld selbst berechnet. Es liest auch Datenpunkte aus einer Textdatei, um die Geometrie des Flügels zu erhalten. Ich habe diese zwei Dateien nicht zur Verfügung gestellt, aber ich kann sie bei Bedarf hinzufügen. Vielen Dank im Voraus.

    
Sami 01.03.2016, 13:47
quelle

2 Antworten

3

Ein Flaschenhals in Ihrem Code ist wahrscheinlich eine Kollisionserkennung. CollisionDetect() berechnet den Abstand zwischen jedem Partikel und jedem Kreis. Wenn dann eine Kollision erkannt wird, findet CircleCollide() den Index des Kreises in Circles (eine lineare Suche), so dass die Geschwindigkeiten aus dem gleichen Index in Velocities abgerufen werden können. Dies ist offensichtlich reif für Verbesserungen.

Erstens hat die Klasse Circle bereits die Geschwindigkeiten in den Attributen speedx / speedy, so dass Velocities eliminiert werden kann.

Zweitens, da die Kreise sich an festen Orten befinden, können Sie aus der Position des Partikels berechnen, welcher Kreis einem bestimmten Partikel am nächsten kommt.

%Vor%

Dann wird CollisionDetect() zu:

%Vor%     
RootTwo 23.03.2016, 19:14
quelle
1

Ich habe Ihren Code aufgeräumt und ein paar Änderungen vorgenommen, indem ich den Klassen etwas hinzugefügt habe und ein paar mehr eingeführt habe. Ohne weitere Kenntnisse von Flow kann ich das nicht vollständig testen, aber wenn du zurück zu mir kommst, kann ich noch mehr machen. Ich gehe hier davon aus, dass das 'Flussfeld' durch die Funktion numpy.meshgrid simuliert werden kann.

%Vor%

Ich habe auch ein paar rohe Stichs beim Zeichnen einer Tragfläche gemacht, da ich nicht mehr die Daten mit den Koordinaten kenne.

    
Colin Dickie 01.03.2016 21:03
quelle