[PYTHON] Visualisieren Sie den Hohlraumfluss mit matplotlib und speichern Sie ihn als GIF-Animation

http://nbviewer.ipython.org/github/barbagroup/CFDPython/blob/master/lessons/15_Step_11.ipynb

Ich habe herausgefunden, wie man den Hohlraumfluss schreibt, aber es reicht nicht aus, weil es nicht animiert.

Unten ist der Code, der nur das Endergebnis anzeigt. (In der Originalgeschichte wird iPython Notebook verwendet.)

cavorg.py


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

nx = 41
ny = 41
nt = 5
nit=50
c = 1
dx = 2.0/(nx-1)
dy = 2.0/(ny-1)
x = np.linspace(0,2,nx)
y = np.linspace(0,2,ny)
X,Y = np.meshgrid(x,y)

rho = 1
nu = .1
dt = .001

u = np.zeros((ny, nx))
v = np.zeros((ny, nx))
p = np.zeros((ny, nx)) 
b = np.zeros((ny, nx))


def buildUpB(b, rho, dt, u, v, dx, dy):
    
    b[1:-1,1:-1]=rho*(1/dt*((u[1:-1,2:]-u[1:-1,0:-2])/(2*dx)+(v[2:,1:-1]-v[0:-2,1:-1])/(2*dy))-\
                      ((u[1:-1,2:]-u[1:-1,0:-2])/(2*dx))**2-\
                      2*((u[2:,1:-1]-u[0:-2,1:-1])/(2*dy)*(v[1:-1,2:]-v[1:-1,0:-2])/(2*dx))-\
                      ((v[2:,1:-1]-v[0:-2,1:-1])/(2*dy))**2)

    return b
    
def presPoisson(p, dx, dy, b):
    pn = np.empty_like(p)
    pn = p.copy()
    
    for q in range(nit):
        pn = p.copy()
        p[1:-1,1:-1] = ((pn[1:-1,2:]+pn[1:-1,0:-2])*dy**2+(pn[2:,1:-1]+pn[0:-2,1:-1])*dx**2)/\
                        (2*(dx**2+dy**2)) -\
                        dx**2*dy**2/(2*(dx**2+dy**2))*b[1:-1,1:-1]

        p[-1,:] =p[-2,:] ##dp/dy = 0 at y = 2
        p[0,:] = p[1,:]  ##dp/dy = 0 at y = 0
        p[:,0]=p[:,1]    ##dp/dx = 0 at x = 0
        p[:,-1]=0        ##p = 0 at x = 2
        
    return p
    
def cavityFlow(nt, u, v, dt, dx, dy, p, rho, nu):
    un = np.empty_like(u)
    vn = np.empty_like(v)
    b = np.zeros((ny, nx))
    
    for n in range(nt):
        un = u.copy()
        vn = v.copy()
        
        b = buildUpB(b, rho, dt, u, v, dx, dy)
        p = presPoisson(p, dx, dy, b)
        
        u[1:-1,1:-1] = un[1:-1,1:-1]-\
                        un[1:-1,1:-1]*dt/dx*(un[1:-1,1:-1]-un[1:-1,0:-2])-\
                        vn[1:-1,1:-1]*dt/dy*(un[1:-1,1:-1]-un[0:-2,1:-1])-\
                        dt/(2*rho*dx)*(p[1:-1,2:]-p[1:-1,0:-2])+\
                        nu*(dt/dx**2*(un[1:-1,2:]-2*un[1:-1,1:-1]+un[1:-1,0:-2])+\
                        dt/dy**2*(un[2:,1:-1]-2*un[1:-1,1:-1]+un[0:-2,1:-1]))

        v[1:-1,1:-1] = vn[1:-1,1:-1]-\
                        un[1:-1,1:-1]*dt/dx*(vn[1:-1,1:-1]-vn[1:-1,0:-2])-\
                        vn[1:-1,1:-1]*dt/dy*(vn[1:-1,1:-1]-vn[0:-2,1:-1])-\
                        dt/(2*rho*dy)*(p[2:,1:-1]-p[0:-2,1:-1])+\
                        nu*(dt/dx**2*(vn[1:-1,2:]-2*vn[1:-1,1:-1]+vn[1:-1,0:-2])+\
                        (dt/dy**2*(vn[2:,1:-1]-2*vn[1:-1,1:-1]+vn[0:-2,1:-1])))

        u[0,:] = 0
        u[:,0] = 0
        u[:,-1] = 0
        u[-1,:] = 1    #set velocity on cavity lid equal to 1
        v[0,:] = 0
        v[-1,:]=0
        v[:,0] = 0
        v[:,-1] = 0
   
    return u, v, p
    
fig = plt.figure(figsize=(11,7), dpi=100)
u, v, p = cavityFlow(nt, u, v, dt, dx, dy, p, rho, nu)

plt.contourf(X,Y,p,alpha=0.5)
plt.colorbar()
plt.contour(X,Y,p)
plt.quiver(X[::2,::2],Y[::2,::2],u[::2,::2],v[::2,::2])
plt.xlabel('X')
plt.ylabel('Y')
plt.show()

Es scheint, dass Sie mit matplotlib.animation eine GIF-Animation erstellen können, also habe ich es versucht, aber es hat nicht funktioniert. Der Grund wird unten erklärt.

Sie können eine GIF-Animation erstellen, wenn Imagemagick enthalten ist. Siehe unten dazu. http://kiito.hatenablog.com/entry/2013/11/27/233507

Die spezifische Methode zum Animieren ist wie folgt.

Es scheint zwei Möglichkeiten zum Animieren zu geben. animation.ArtistAnimation ... Zeichnen Sie die vorbereiteten Daten animation.FuncAnimation ... Daten von Zeit zu Zeit aktualisieren

from http://cflat-inc.hatenablog.com/entry/2014/03/17/214719

Andere Beispiele http://qiita.com/HirofumiYashima/items/5864fb9384053b77cf6f http://d.hatena.ne.jp/xef/20120629/p2 http://stackoverflow.com/questions/24166236/add-text-to-image-animated-with-matplotlib-artistanimation

Der erste Simulationscode führt eine for-Schleife in cavityFlow () aus, daher dachte ich, ich würde Daten für jede Schleife ausspucken und mit ArtistAnimation zeichnen, aber die Übergabe der Kontur an das Array der Zeichnungsdaten ist ein Fehler. herauskommen. Dies wurde an anderer Stelle gemeldet, aber ich bin nicht sicher, ob es unterstützt wird.

http://matplotlib.1069221.n5.nabble.com/Matplotlib-1-1-0-animation-vs-contour-plots-td18703.html http://stackoverflow.com/questions/23070305/how-can-i-make-an-animation-with-contourf

Wenn Sie dies vorerst mit Func Animation anstelle von Artist Animation tun, scheint es, dass contourf auch eine Animation ist, aber es gibt auch Informationen, die Sie mit Artist Animation machen können. Mit Ausnahme von Contourf habe ich versucht, nur Stromlinien zu zeichnen, und es wurde erfolgreich erstellt. Dies scheint also ein durch Contourf verursachter Fehler zu sein.

Recommended Posts

Visualisieren Sie den Hohlraumfluss mit matplotlib und speichern Sie ihn als GIF-Animation
Zeichnen Sie eine erdähnliche Flussanimation mit Matplotlib und Cartopy
Einfache Animation mit matplotlib (mp4, gif)
Animation mit matplotlib
Animation mit matplotlib
LGTM - Erstellen Sie LGTM-Bilder mit Videos und Fotos und geben Sie GIF-Animationen aus
Erstellen Sie mit matplotlib eine GIF-Animation aus einer Seriennummerndatei
[Statistik] Visualisieren und verstehen Sie die Hamiltonsche Monte-Carlo-Methode mit Animation.
Graustufenbild und als CSV speichern
[IOS] Zerlegen Sie die GIF-Animation mit Pythonista3.
Speichern und Abrufen von Dateien mit Pepper
Bearbeiten und speichern Sie schreibgeschützte Dateien mit vim
Zeichnen Sie Dreiecksfunktionen mit Numpy und Matplotlib
Erstellen Sie eine GIF-Animation mit Ordnerüberwachung