Ray tracing – matrix math

Today was my last day at Reson, and I’m finally getting around to writing the Python version of my ray tracing script.  What I want to do is take sound speed profiles as input, and compute the difference in depth that would result from using one versus the other at different multibeam launch angles.  It’s just a little tool that I’d like to have to figure out how much error I could expect given two profiles.

So far, I’ve read in the profile (from a text file), and parsed the data:

filename = 'ssp.txt'

ssp = []
depth = []

file1 = open(filename)
for line in file1.readlines():
#    print line
    splitup = line.split()
    ssp.append(float(splitup[1]))
    depth.append(float(splitup[0]))

After this, I defined an array of launch angles (relative to horizontal, so +/- 75 degrees was actually 15 – 165), and an array of sound speed values interpolated from the sound speed profile to a certain depth increment (1m), and down to a given water depth (10m).


LaunchAngle = r_[15.:166.:5.] # array of launch angles in degrees
LaunchAngleRadians = LaunchAngle*pi/180
nadirdepth = 100 # nadir depth in meters
DepthIncrement = 0.5 # depth increment in m

if nadirdepth > max(depth):
    ssp.append(0.016*(nadirdepth - max(depth)))
    depth.append(nadirdepth)

if min(depth)>0:
    ssp = insert(ssp,0,ssp[0])
    depth = insert(depth,0,0)

depthvector = r_[0:nadirdepth:DepthIncrement]
interpfun = interp1d(depth,ssp)
sspvector = interpfun(depthvector)

And as if that much wasn’t suspicious enough, I decided that I wanted to do all of the calcs using matrix math. I figured I’d ditch all the loops that were in my original Matlab script, and replace them with some nice streamlined matrices. So efficient. The problem is that there are some exceptions that I need to take care of, that are difficult to deal with when doing everything in a series of matrices. For example, when the sound speed in a certain layer is the same as the sound speed in the first layer – then the gradient is zero, and the radius of curvature is infinite. Here’s what I’ve hacked together so far. It’s not pretty.


thetaLaunch = tile(LaunchAngleRadians,(size(depthvector),1))
depthmat = transpose(tile(depthvector,(size(LaunchAngleRadians),1)))
sspmat = transpose(tile(sspvector,(size(LaunchAngleRadians),1)))

g = (sspmat - sspvector[0]) / DepthIncrement

Rc = -sspvector[0]/(g*cos(thetaLaunch))

thetamat = arccos( ((Rc*cos(thetaLaunch)) - DepthIncrement ) / Rc )

dx = (Rc*sin(thetamat) - Rc*sin(thetaLaunch))
dxnandex = isnan(dx)
dx[dxnandex] = DepthIncrement/tan(thetaLaunch[dxnandex])
dx[0,] = 0
dxsum = cumsum(dx,axis=0)

Yuck. But at least I managed to get some rays that made sense.

The next step is to convert the ray paths to two-way travel times, and then compare the depth that would be calculated if the ray tracing were done with a second sound speed profile.

Reson 8101 on Ocean Bytes blog

I saw this link on Kurt’s blog – I didn’t even know about the Ocean Bytes blog before.

Reson Seabat 8101 on Ocean Bytes blog

Brian Kidd is an oceanographic technician aboard the R/V Hugh R. Sharp, and in these two videos, he’s being interviewed about the 8101 system.  In the first part, he describes the monitoring and display station, and in the second part, he talks more about the wet side – the transducer and mounting assembly.

Inkscape + Latex on Mac

I thought this was going to be trivial – it seemed so easy on Ubuntu.  But I getting Textex working with Inkscape on a Mac is a bit different.  I found these instructions on the mactex-wiki.  I’m not gonna lie.  It looks terrifying, and involves changing several lines of code in textext.py and textext.inx, and moving and deleting files from various folders in the inkscape package.

So before I embark on that journey, I’m going to try just blindly copying textext.py and textext.inx into the Inkscape extensions folder.  Oh hey, I got the textext item in the Extensions menu:

Next problem:  I click on the Textext option, and get this error:

Couldn’t find python-lxml in Fink, so I tried fink install lxml-py26…. and it didn’t work. :-(

It’s too late to be messing with this tonight. Maybe tomorrow. Or maybe Inkscape is not the answer – there’s got to be a better way!!

Maybe next time I’ll look into this blog post.

Diagrams in Mac

Here we go again… I was trying to draw a little diagram, and since I’m using a Mac, figured I’d look up OmniGraffle.  But OmniGraffle is now $100 for the basic package – and $200 for professional.  It wouldn’t be quite so painful except I got it for free back when I got my old Mac Powerbook back in 2006.

So it’s back to Inkscape.  I love open source!  It was an easy install – I decided to take a pass on compiling from source, and just grabbed the .dmg file from the downloads page. And of course, I already went through the whole Inkscape plus Latex thing a while ago.

And, for fun, here’s a screen shot of Inkscape in action:

… who needs OmniGraffle anyway… (sniffle)

Emacs Meta Key on Mac

To use the Meta Key in Emacs on a Mac computer, just go to the Terminal preferences –> settings –> keyboard, and check the box that says “use option key as meta key”. Easy peasy.

Use Alt/Option key as Meta Key in Emacs

Backing up the Macbook

I finally got around to setting up Time Machine on the Macbook, and ran into a few problems. I bought a Western Digital Essential external hard drive, 750GB. Nice and big. I plugged it in, and started the Time Machine backup. It formatted the drive, and started. It seemed promising at first. Then I got an error: ” Disk not ejected properly”. Time Machine was frozen, it couldn’t see the drive. I tried re-formatting, I tried installing a firmware update, nothing was working. I finally gave up, brought it back to Best Buy, and swapped it for an iomega eGo Helium. It worked like a charm, right out of the box. While searching for a solution with the WD drive, I came across several forums where this was a topic of discussion. Apparently I’m not the only person who has seen this problem. Seems like certain WD drives are a bit finicky with Macs. I’ve never had a problem with them before, but one time is probably enough for me to steer clear for a while, just in case.

Val mentioned that he also uses some backup software called Carbon Copy Cloner (CCC). I had a look at the website, and it looks like it helps create a completely bootable backup of your system. I guess that means I need another external hard drive, so I have something to boot from if it comes down to that. But it looks really cool – and it’s also free. Although if you like it, you’re encouraged to make a donation, after trying the full-featured version and judging for yourself whether it’s work supporting. It seems like great software, and a great philosophy.

More Brushes

Okay, I’ll admit it – I’ve been a bit obsessed with the Brushes app for the last few days.  I finally figured out how to export the video:  Just go to the image you want to export, click on the second button from the left, and choose “Mail Actions”.  Yeah, it was pretty obvious, I just didn’t notice it before tonight.  Here’s a sample:

Experiment with Brushes from Michelle Wray on Vimeo.

Here’s the final image:

Too bad it doesn’t look like either Val OR Gracie….

Brushes for iPad

Brushes is so fun!  It was pretty hard for me to fork over the $7.99 they’re charging for it, but I think it was worth it.  I’ve had it for about a day and have been playing with it every chance I get.  I had this app for iPhone, but it’s SO much better on the iPad.  Wow, I’m such an Apple junkie…

Trooper and Jenna

Simple beam pattern in Python

It’s been a long time since I’ve

(a) used Python, numpy, scipy, or matplotlib

(b) done a beam pattern calculation of any kind

So I thought it would be a good chance to brush up on several things all at once, and maybe even have the satisfaction of making a pretty picture at the end of the night.

Well, here’s the (perhaps not so) pretty picture:

This was so simple, I’m almost embarrassed to post it, but it will probably be helpful for me later, so here it is.  What is it?  I pretended I had two little pingers spaced 5 wavelengths apart, sending out continuous sinusoidal waves.  I summed these signals at each of the elements in a 2-D grid, plotted the resulting magnitudes, and voila.

What I had to learn:

- How to use exp() using numpy – I had to load it separately for some reason, otherwise it would default to the exp() that comes with the basic math package, which doesn’t allow computations on arrays.

-How to plot an image, a la “imagesc” in Matlab.  This is accomplished using <code>imshow(datahere)</code>, and a colorbar can be added using <code>colorbar()</code>.

-How to do a screen capture of a certain area on a Mac computer:  command+shift+4 gives you crosshairs so you can pick what you like.

It would have been nice to add some attenuation, but I’m too tired now.  One more thing that I need to figure out though, what’s the best way to post my code?  I probably should figure out how to put it up on the bluehost server (where this blog lives), and link to it from here.

“Hark, a vagrant” for a Monday afternoon

I love Katie Beaton’s work.  Check her out at http://harkavagrant.com/, she’s a funny gal.  (And from Nova Scotia!  Yay for Maritimers, and especially Cape Breton-ers.  And especially Cape Bretoners who went to University at Mt. Allison in New Brunswick.)