building a python extension with trilinos on linux and windows

Continuing my python extension project, I’ve now successfully built a toy python 2.7 extension in C++ that uses the Epetra package from Trilinos 10.8. I’ve built it on Ubuntu 11.10 (with gcc) and on Windows XP (with Visual Studio 2008) using distutils. It’s a bit of a hack, but it works and is a path forward for me.

I started with Linux, because I figured it would be easier. I learned a few things along the way. First, you have to have built Trilinos with shared libraries enabled. This is required for how Python handles things, I guess, and is made clear under the heading “Shared Libraries” in this file. The PyTrilinos package (which is effectively a professional set of python-trilinos extensions, btw. I needed a custom one!) needs them as well. So run your cmake-gui and check the shared libraries button. Besides the libepetra.a in the build folder, you’ll now also find a libepetra.so. In Windows, you’ll get >500 errors if you compile all of trilinos with shared libraries, but Epetra at least worked.
Continue reading building a python extension with trilinos on linux and windows

ipython on windows

iPython is a very nice way to fiddle around with Python interactively. Most beginners just use IDLE for this, since it comes with Python. But as you get to plotting stuff, you’ll find that IDLE just doesn’t cut it (it freezes every time you plot anything). So you try the regular python command line (on the black screen) but get frustrated that you can’t change directories or use tabbed completion or anything. You hear about ipython and try to use it but it’s not very obvious. Well all you have to do is make a shortcut and you’ll be off and running.By the way, if you had started on Linux in the first place, you wouldn’t have to deal with all this! Anyway, on Windows,

0. Make sure you have Python installed with matplotlib and numpy modules.

1. Get ipython from http://ipython.scipy.org/ install it from the download page for your version of python

2. Make a shortcut to python.exe and then right click it and hit properties to change where it points to to:

3. Double click the shortcut.

Yay. Now you have ipython on windows with matplotlib interactive capabilities! I suggest having your text editor open in one window and this ipython window in the other. Edit your code, save it, and then type “run mycode.py” to run it in the interpreter.

A nice screenshot of an interactive matplotlib session on Windows

Anyway.

nse

Back to work on the same old. I figured out the grayscale images yesterday, but I still need to generate them for all the new uranium cases that don’t have thousands of kg of Hafnium in them. Additionally, I’m going to add a picture of the adjont source in the 1-D slab. Will need to try to make it eps. On it. Running the analytic oned solution now. I chose search and will see what we get. It’s been a while since I ran this code. OK I got a decent plot out. I used TeX text processing on it and it looks phenomenal. Now to generate the B&W ones for three cases…

In case 1, the 0-th timestep jump parameter is negative, so we need to switch the sense of all search directions. Run.py can handle that now, with the N option, for “negative.” That’s revision 8 in the itd svn repository. Rerunning v6 case with proper sense. Let’s see if we can do better. With improper searching, we started at peaking factor 1.05038 and got to 1.04 by bp search, and to 1.039 by end of BDT. Lame.

Uhh. I just spend 1.5 hours with MCNP crap for a student in my class. Why are we struggling with MCNP when we should be learning reactor analysis? Damn another hour with the class! These guys are killing me.

Well here’s some instructions I just made for doing safety analysis of SFRs in REBUS or MC**2:

<!– @page { margin: 0.79in } P { margin-bottom: 0.08in } –>

Disabling the criticality search in REBUS

by Nick Touran

If you want to perform any kind of basic void coefficient, Doppler coefficient, or temperature coefficient of reactivity estimations in REBUS for fast reactors, you have to disable the criticality search. Here’s how.

  1. Run your regular base case of interest. Look at the output for the final value of the enrichment modification factor. You will find a edit like this near the bottom:

++++++++++++++++++++++++++++++++++++++++

+ +

+ COMPLETION OF FINAL SEARCH PROCEDURE +

+ +

++++++++++++++++++++++++++++++++++++++++

THE ENRICHMENT MODIFICATION FACTOR IS 2.36759E-01

THE BURN STEP TIME IS 2.10483E+02 DAYS.

Note the factor. You need to put it into your perturbed file.

  1. Make a new rebus and MC**2 case with the perturbations you wanted. Decrease the sodium density, decrease the fuel density, eject a control rod, whatever.

  2. In that new rebus input, go to the A.BURN card 4. You should see a 1.000 representing the desired k-eff at EOC. After that, there is a convergence criterion, probably set to 0.0001 or so. Change it to 1.000. This disables the criticality search.

  3. The last two numbers in that same line are the first and second guesses of the new enrichment modification factor. Change the first one to the factor noted from the previous output file. Keep in mind that you can only put this number between certain columns. Check the manual to see which ones. Be careful with this!

  4. If there is a burn cycle time search enabled as well, disable it in the same manner (on card 3 though) and insert the burn step time manually!

  5. Now criticality search is off and you’ve manually set the critical class 1 enrichment. You’re ready to run. Run your new rebus case and compare k-effs with those from the base case.

Notes:

If you change a density somewhere, make sure it changes in the cross section library calculation too! The energy self shielding can vary wildly with different densities.

This method of calculating safety parameters should be taken with a grain of salt because it does not account for any anisotopies that you may see in real rod ejection accidents, etc. Diffusion theory is only an approximation of transport! Try using some perturbation theory codes like VARIANT if you want better results.

Have fun!

OK. What else? The new line search behaved very well. But in v5, the big case, the reactivity swings are all miniscule! 1.001 at BOC? Say what? Investigating. The core is breeding plutonium. It’s a breeder. Ah! Well the plenum had the wrong material, it looks like. I fixed it in the CORTANA input maker to agree nicely with the Hill cases of old and am now re-running just the first rebus case. This large case requires a very low guess of the enrichment modification factor.

Hot Tub Controller

So, I have to tell you about the hot tub project. It’s been going on for a few weeks now and we just basically finished it. I (with some help from Jesse) have set up a microcontroller to control and monitor the hot tub. We have a temperature sensor mounted on the heating element tube and we wired in a relay to control when the heater turn on. Then we wrote code to allow it to interface with email, the internet, and even text messages! For real. Look:

Text message from the hot tub
Text message from the hot tub

Haha! Here are some more gems:

Temperature plotsand you can control it with this form:

control_formOr you can just control it from the command line:

terminalSo here’s what’s going on. Firstly, there’s an arduino connected to a USB port of the computer in the basement. Here’s a pic:

ArduinoOne of the digital pins on the Arduino is connected to a OneWire bus with three temperature sensors hooked up to it with a pull-down resistor connecting the bus to the 5V line. That’s the green wire. The ground is white ground.  The three sensors are hooked up (in parasite power mode) to 30 feet of indoor/outdoor CAT-5 wire from Home Depot. I surrounded each temperature sensor with a piece of 3/8″ O.D. copper tubing (which is miraculously already corroding) and pinched them down and sealed them up with Silicone. Here’s a pic of the outdoor sensor.

Outdoor temp sensor in copper

Anyway, yeah. The last sensor, the one on the tub, is wrapped in lots of insulation from the hardware store to try to keep the outdoor temperature from affecting the hot tub readings.

On another digital pin (the orange wire), we have a relay circuit that we can turn on and off easily. In the hot tub, it connects the wire that connects the coil of the main heater relay. So it’s  a relay for a relay, effectively. We just set the temperature dial very high and use the Arduino to cut it off when we want. We got the circuit from here. Here’s a copy of that:

schematic

Nice. I used a relay that can handle up to 30A, 240V, with a 12V coil. I got the 12V by splicing off of the hard drive power cable inside the computer (blue wire, with white blue as ground. That’s the same ground, but we didn’t want to tap into the fragile cat5 wire again). That’s unfortunate because it requires the computer be on to have the heater on. A better design would not rely on the computer to maintain control of the hot tub.

The rest of it is just software. I’m using the pySerial module to read and write to the USB tty device in 32-bit Ubuntu 8.10 Linux. The code that I compiled on the Arduino chip simply accepts simple characters through the serial port and does as asked. It knows how to turn heater on, off, read temperatures, and tell whether or not the heater is on. I’ll build some safety logic in soon. Right now, all the control logic and communication is done in Python on the computer. I have an Arduino class that abstracts the commands the Arduino knows. Then there’s the hottubController class that checks the sensors and turns the heat on and off accordingly. It calls the communication class, that checks for commands in an IMAP email account, submits temperature information to a MySQL database on my server, and sends command responses via SMTP. The text messaging functionality works simply because you can easily use the text-to-email gateways used by many major phone companies. The MySQL stuff is done with the MySQLdb python module, which is fairly simple.

The web form is a python cgi that makes that simple HTML table and sends the commands in. The plotter is another python script that reads the database and puts the data into an HTML file, which is then parsed by the flot JavaScript plotting routines on the clientside, allowing zooming and dynamic date x-axis labels, which are awesome.

Still to come: predictive hot tub times. Since the heating is very linear, it’s possible to extrapolate the time at which the tub will reach a given temperature. You’ll get a text that says: “the hot tub will be ready at 10:37PM” How cool will that be at the bar?

With all the copper, casings, arduino, sensors, relays, silicone, insulation, and various other tools I bought during this, it’s up to about $100, not including the computer. Not bad!

More Details

In case you’re wondering or debugging the hot tub controller, here are some more details.

The breadboard setup for the hot tub controller
The breadboard setup for the hot tub controller
Here's what the arduino wires look like. Nothing special.
Here's what the arduino wires look like. Nothing special.

Out at the hot tub, you’ll see a silver toggle switch. Under normal operation, this should be in the center position. To shut down special features and go back to plain-old hot tub, put the switch in the up position. This gives control of the hot tub back to its internal thermostat. It also disables the 10 second heater delay relay.

Too much information

I do a lot of stuff each day, and then forget most of it. Sometimes I learn something, sometimes I get a thesis topic, sometimes I do a fun project or have a nice thought. I think a wordpress page might help me organize and remember what I do with my life. That’d be nice.

Today, I spent most of the day making a new webpage for whatisnuclear.com. You can find it at http://www.whatisnuclear.com/articles/recycling.html

Since Obama zeroed out the funding for Yucca mountain, Prof. Fleming, Kearfoot and I think it’s a great time to start recycling. I made this page to help explain exactly what that means and why it’s good.

I then went to Sweetwaters and got some Chai with skim milk. It was delicious! I opened up the lappy laptop and worked on my single goal of the evening: plotting search directions in a manner similar to the input maker. I searched for some kind of wxPython colormap, but didn’t find anything and then luckily found that Matplotlib has all the capability I need. Using the scatter function, you can specify hexagon symbols with arbitrary angles. Excellent. Check this plot out:

Burnable poison search direction for timestep 0
Burnable poison search direction for timestep 0

Yeah. That’s excellent. Now I just have to figure out how to get it to size automatically.

Ceris brought a recent The Economist over with some legalization of drugs propaganda. They’re position has been to legalize the drugs, and spend the billions on treating addiction instead of jailing recreational users. I agree. It had other articles that caught my interest, specifically some on the clean coal myth, solar collecting balloons, and devices that charge wirelessly. That got me thinking that my camera batteries never charge anymore. So I went online and bought a well-reviewed charger, thinking that maybe my Ni-MH chargers are both defective, since all 12 of my batteries don’t last in my camera anymore.

I watched the rest of RENT last night with Adrienne and dumpster girl. I never knew what it was about. I kind of liked it, although I don’t have much profound thought about it. It’s been a lazy weekend. The most important accomplishment was the completion of the hot tub controller project. More on this once my camera works again.