2016-03-23 7 views
0

Ich versuche zu verstehen, wie FiPy funktioniert, indem ein Beispiel arbeiten, insbesondere würde Ich mag die folgende einfache Konvektionsgleichung mit periodischen Rand lösen:FiPy Einfache Convection

$$ \ partial_t u + \ partial_x u = 0 $$

Wenn Anfangsdaten durch $ u (x, 0) = F (x) $ gegeben sind, dann ist die analytische Lösung $ u (x, t) = F (x - t) $. Ich bekomme eine Lösung, aber es ist nicht korrekt.

Was fehlt mir? Gibt es eine bessere Ressource zum Verständnis von FiPy als die Dokumentation? Es ist sehr spärlich ...

Hier ist mein Versuch

from fipy import * 
import numpy as np 

# Generate mesh 
nx = 20 
dx = 2*np.pi/nx 
mesh = PeriodicGrid1D(nx=nx, dx=dx) 

# Generate solution object with initial discontinuity 
phi = CellVariable(name="solution variable", mesh=mesh) 
phiAnalytical = CellVariable(name="analytical value", mesh=mesh) 
phi.setValue(1.) 
phi.setValue(0., where=x > 1.) 

# Define the pde 
D = [[-1.]] 
eq = TransientTerm() == ConvectionTerm(coeff=D) 

# Set discretization so analytical solution is exactly one cell translation 
dt = 0.01*dx 
steps = 2*int(dx/dt) 

# Set the analytical value at the end of simulation 
phiAnalytical.setValue(np.roll(phi.value, 1)) 

for step in range(steps): 
    eq.solve(var=phi, dt=dt) 

print(phi.allclose(phiAnalytical, atol=1e-1)) 
+0

Sorry, ich kann nicht scheinen, um die Latex Mathe zu reparieren ... – pdevar

Antwort

1

Wie auf den FiPy mailing list angesprochen, ist FiPy nicht groß bei Konvektion Handhabung nur PDEs (abwesend Diffusion, rein hyperbolische), wie es höhere Ordnung Konvektion fehlt Schemata. Es ist besser, CLAWPACK für diese Klasse von Problemen zu verwenden.

FiPy hat ein zweites Ordnungsschema, das bei diesem Problem helfen könnte, das VanLeerConvectionTerm, see an example.

Wenn das VanLeerConvectionTerm in dem obigen Problem verwendet wird, ist es besser, den Schock zu erhalten.

import numpy as np 
import fipy 

# Generate mesh 
nx = 20 
dx = 2*np.pi/nx 
mesh = fipy.PeriodicGrid1D(nx=nx, dx=dx) 

# Generate solution object with initial discontinuity 
phi = fipy.CellVariable(name="solution variable", mesh=mesh) 
phiAnalytical = fipy.CellVariable(name="analytical value", mesh=mesh) 
phi.setValue(1.) 
phi.setValue(0., where=mesh.x > 1.) 

# Define the pde 
D = [[-1.]] 
eq = fipy.TransientTerm() == fipy.VanLeerConvectionTerm(coeff=D) 

# Set discretization so analytical solution is exactly one cell translation 
dt = 0.01*dx 
steps = 2*int(dx/dt) 

# Set the analytical value at the end of simulation 
phiAnalytical.setValue(np.roll(phi.value, 1)) 

viewer = fipy.Viewer(phi) 
for step in range(steps): 
    eq.solve(var=phi, dt=dt) 
    viewer.plot() 
    raw_input('stopped') 
print(phi.allclose(phiAnalytical, atol=1e-1)) 
+0

Danke für die respons WD15. Ich habe Clawpack untersucht und denke, dass es besser funktionieren wird, aber ich hoffe, FiPy in Zukunft nutzen zu können. – pdevar