Feeds:
Posts

## Python: solving 1D diffusion equation

The diffusion  equations: Assuming a constant diffusion coefficient, D, we use the Crank-Nicolson methos (second order accurate in time and space):

u[n+1,j]-u[n,j] = 0.5 a {(u[n+1,j+1] – 2u[n+1,j] + u[n+1,j-1])+(u[n,j+1] – 2u[n,j] + u[n,j-1])}

A linear system of equations, A.U[n+1] = B.U[n], should be solved in each time setp.

As an example, we take a Gaussian pulse and study variation of density with time. Such example can occur in several fields of physics, e.g., quantum mechanics.

As stated above, we have two arrays: A and B. We form them once, and then calculate inverse(A).B:

#———————————————–
# populate the coefficient arrays
#———————————————-
from scipy.linalg import svd
from scipy.linalg import inv

for j in arange(0, nx_step):
coefa[j, (j-1)%nx_step] = – lamb
coefa[j, (j)%nx_step] = 2*lamb + 2.
coefa[j, (j+1)%nx_step] = – lamb
#———————————————–
lamb = – lamb
for j in arange(0, nx_step):
coefb[j, (j-1)%nx_step] = – lamb
coefb[j, (j)%nx_step] = 2*lamb + 2.
coefb[j, (j+1)%nx_step] = – lamb
#———————————————–
coefa = scipy.linalg.inv(coefa)         # inverse of A
coef = numpy.dot(coefa, coefb)
coef = scipy.linalg.inv(coef)

for i in arange(1,nt_step):        #———– main loop ———

ans = scipy.linalg.solve(coef, uo)
uo = ans
plot(uoz,’k’, ans,’r’)
draw()
t[i] = t[i-1] + dt
print dt*nt_step – t[i], ‘      ‘, ans.sum()
rho[:,i] = ans

The result is shown in the following figure: as expected, the peak of the density profile falls down. If one continues the simulation for a longer time, the density distribution will be completely uniform. ## Reading IDL Save files in Python

For many idl users, switching to python is not easy. An important reason is that restoring idl save files was not possible.  However, it IS possible now ! and it is in fact as easy as you can imagine:

http://astrofrog.github.com/idlsave/

go into python and import it:

>>> import idlsave

well, all you need to read a save file is like this:

you get things like that in terminal:

————————————————–
Date: Mon…..
User: …..
Host: ….
————————————————–
Format: 10
Architecture: x86_64
Operating System: linux
IDL Version: 8.1
————————————————–
Successfully read 5 records of which:
– 2 are of type VARIABLE
– 1 are of type TIMESTAMP
– 1 are of type VERSION
————————————————–
Available variables:
– xx [<type ‘numpy.ndarray’>]
– yy [<type ‘numpy.ndarray’>]
————————————————–

now, you have these two variables (xx, yy) available as a.xx and a.yy.

Done.

## Lunar Eclipse of June 15, 2011 This composite image shows four phases of the total lunar eclipse of June 15, 2011. The moon was eclipsed in the rising phase. In addition, we faced clouds in large part of the sky. Nevertheless, we captured enough beautiful frames.

## 2D density plot (or 2D histogram)

Sometimes we have to prepare scatter plot of two parameters. When number of elements in each
parameter is a big number, e.g., several thousands, and points are concentrated, it is very difficult
to use a standard scatter plot. The reason is that due to over-population, one cannot say where
the density has a maximum. In this post, I explain alternative ways to prepare such plots.

The below scatter plot has more than two million points. It is absolutely impossible to say where is
the peak of the distribution. One way to cope with the problem is to over plot the contours of the density on the scatter plot. Using np.histogram2d function of numpy, one can create a map of two dimensional density function.

It is not always the best idea. Sometimes, it might be better to show the 2D density map itself (below).
The colorbar reads the number of points in each bin. Now, one might complain that due to large central concentration, the halo of the distribution is not seen in
the 2D density map. There are two solutions for the issue: either we change the color table, or over plot
the contour on the 2D density plot (below). As you see, we can easily show the values of the contours as well. the Python code to create this plot is the following:

fig = plt.figure()
H, xedges, yedges = np.histogram2d(aa, bb, range=[[293.,1454.0], [464.,1896.0]], bins=(50, 50))
extent = [yedges, yedges[-1], xedges, xedges[-1]] 