[Numpy-discussion] First Numerical Python code...comments?
Tyler Hayes
hayes.tyler@gmail....
Sat Mar 3 17:05:01 CST 2007
Hello All:
Well, I recently made the switch to Python for scientific computing
(using NumPy and Matplotlib/PyLab) and got my first program to work.
It is a simple 1D finite element code for a tightly stretched wire and
is a textbook example.
To solve it, I also created a symmetric, banded matrix solver module
from a Fortran90 routine using f2py (thank you Pearu for your help the
other day to get f2py working).
Anyways, my background is in Fortran and I was got the program to run,
but I can't help but wonder if I did not use the most efficient method
for calcualting the matrix values, etc.
I would appreciate your comments on my code that I have attached
below. My concern is that I used some "for" loops as I would have
using Fortran, but perhaps there is a more intelligent (i.e.,
efficient) way using native NumPy matirx routines?
I would love to hear what you think.
Also, while I'm at it. I have a simple question about importing NumPy,
SciPy, and PyLab. If I import PyLab, it says I also import NumPy. Do I
ever need to call in SciPy as well? Or is this the same thing?
Cheers,
t.
The "code"
#!/usr/bin/env python
#
# This is the example code from Thompson for a tight wire problem
#
# Coded by Tyler Hayes March 1, 2007
#
#################################################################
# Load the pylab module for plotting (it also imports NumPy)
from pylab import *
# Load the sparse matrix solver symgauss created with f2py
import symgauss as G
"""
This is the example program from Thompson which will plot the
displacement of a tight wire with constant loading.
DEPENDS:
This code requires the symgauss module to solve the sparse
symmetric matrix.
"""
# Initialize data
#----------------------------------------------------------------
# Parameters
tens = 20000.0
numel = 8
numnp = numel + 1
IB = 2
BLAST = 1.0e6
# Boundary conditions
npbc = zeros(numnp,float)
npbc[0] = 1.0
npbc[-1] = 1.0
# Displacement
U = [0.0]*numnp
# Element X-coordinates
xord = zeros(numnp,float)
xord[1] = 2.0
xord[2] = 4.0
xord[3] = 5.0
xord[4] = 6.0
xord[5] = 7.0
xord[6] = 8.0
xord[7] = 10.0
xord[8] = 12.0
# Force data vector
F = -1.0*ones(numnp,float)
F[1] = -2.0
F[2] = -1.5
F[-2]= -2.0
F[-3]= -1.5
# Initialize SK --- the sparse symmetrix stiffness matrix "K"
SK = zeros((numnp,IB),float)
# Main routine
#----------------------------------------------------------------
# Fill in SK with proper values
for i in range(numel):
RL = xord[i+1] - xord[i]
RK = tens/RL
SK[i][0] = SK[i][0] + RK
SK[i][1] = SK[i][1] - RK
IP1 = i+1
SK[IP1][0] = SK[IP1][0] + RK
# Set boundary conditions
for i in range(numnp):
if npbc[i] == 1:
SK[i][0] = SK[i][0]*BLAST
F[i] = U[i]*SK[i][0]
# Call Symmetric Sparse matrix solver
U = G.symgauss(SK,F,numnp,IB)
# Visualize the data
#----------------------------------------------------------------
# Plot data using matplotlib
plot(xord,U)
title('Deflection of a tighly stretched wire')
xlabel('Distance along wire (normalized)')
ylabel('Deflection of wire (normalized)')
grid(True)
show()
--
Tyler Joseph Hayes
600 Talbot St. -- Apt. 812
London, Ontario
N6A 5L9
Tel : 519.435.0967
Fax : 519.661.3198
Cell : 416.655.7897
email: thayes@uwo.ca
GPG Key ID# 0x3AE05130
More information about the Numpy-discussion
mailing list