How Can I Implement a Three-Variable Advection Equation in Python?

  • Context: Python 
  • Thread starter Thread starter leonmate
  • Start date Start date
  • Tags Tags
    Python
Click For Summary
SUMMARY

The discussion focuses on implementing a three-variable advection equation in Python, specifically using the Euler method for numerical solutions. The user has provided a code snippet that successfully solves a single-variable advection equation but seeks assistance in extending it to three variables: u, v, and w. The equations governing the system are du/dt = v, dv/dt = dw/dx, and dw/dt = dv/dx. Key recommendations include breaking down the problem into smaller steps and creating placeholder functions for unimplemented parts.

PREREQUISITES
  • Python programming proficiency, particularly with numerical methods.
  • Understanding of partial differential equations and advection equations.
  • Familiarity with the Euler method for numerical integration.
  • Knowledge of boundary condition application in numerical simulations.
NEXT STEPS
  • Research "Numerical methods for partial differential equations" to understand various approaches.
  • Learn about "Python NumPy" for efficient array manipulations and mathematical operations.
  • Explore "Finite difference methods" for solving differential equations numerically.
  • Investigate "Boundary condition techniques" in computational physics to enhance simulation accuracy.
USEFUL FOR

This discussion is beneficial for computational physicists, software developers working on numerical simulations, and students tackling advanced topics in numerical methods and partial differential equations.

leonmate
Messages
81
Reaction score
1

Homework Statement



What I'm trying to achieve is an advection equation that will run using 3 variables. I must confess I don't have a great grasp over this part of my course. Its pretty complicated!

Homework Equations



The code I have at the moment is:

Code:
def SolveAdvectionEquation(a, b, t0, t1, Nx, Nt, v, method):
dx = (float) (b-a)/Nx
dt = (t1-t0)/Nt
# We have Nx+1 points for Nx intervals, plus an extra ghost point.
pts = linspace(a-dx,b,Nx+2)
times = linspace(t0,t1,Nt+1)
solndata = zeros((Nt+1,Nx+2))
sigma2 = 2.*0.1**2
solndata[0] = exp(-((pts-0.5)**2)/(sigma2))
solndata[0] = ApplyBoundaryConditions(solndata[0])
for tn in range(0,Nt):
solndata[tn+1] = method(solndata[tn],dx,dt,v)
solndata[tn+1] = ApplyBoundaryConditions(solndata[tn+1])
return times, pts[1:], solndata[:,1:]
Our variables:
a and b are my limits for x. For my example this is -1 and 1
likewise t0 and t1 are my limits for time
Nt and Nx are the number of time and x intervals (there will be Nt+1 times from t=0 to t=T and Nx+1 points in the interval of physical interest, x=a to x=b)
v is our Courant factor (dt/dx)
the method I want to use is Euler, I have a function made for this too:

Code:
def Euler(y0,dx,dt,v):

y1 = zeros(len(y0))

for i in range(1,len(y0)-1):

y1 = y0 - v*dt*(y0[i+1]-y0[i-1])/(2.0*dx)

return y1
This code works for a single varible, I need it to work for three, I believe the structure is similar.

The equations I want to solve are
du/dt = v
dv/dt = dw/dx
dw/dt = dv/dx
i.e., you have three variables (u, v, w) and the evolution equations for each of them depends on the other variables, or the spatial derivatives of the other variables. The assignment provides the initial conditions for each variable, since v = du/dt, and w = du/dx.

The Attempt at a Solution



I don't really know what to show you for this, I've got as far as I've shown above and really don't know where to go from there. I figure I need to alter the for loop at the bottom of the function?

Really need some help here, this is actually a computational physics assignment but felt it was better suited for the computer science section. Let me know if it should really be in one of the physics forums.
 
Last edited:
Technology news on Phys.org
Not having really studied your code, I can give you some advice:

Manually write down the steps of how you would solve it. For each step, think about the code you'd write. When you have a complicated step break it up into smaller steps. When you just don't know what to do invent a function to handle it with the input variables needed and the output to be generated. After a while, you get the hang of it.

Note by creating placeholder functions for steps you can't implement yet, you make a program that can be run and debugged up to a certain point.
 

Similar threads

Replies
1
Views
2K
  • · Replies 4 ·
Replies
4
Views
6K
Replies
3
Views
4K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 1 ·
Replies
1
Views
5K
Replies
55
Views
7K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 5 ·
Replies
5
Views
4K
  • · Replies 6 ·
Replies
6
Views
2K