 Okay, so the theme of my talk is basically going to be better engineering and science education and I am going to make a case for the programming language called Python, okay. So my name is Prabhu Ramachandran, I am from the Department of Aerospace Engineering at IIT Bombay. I will give you a brief introduction about myself. I was basically, I have been involved with the free open source community in India for a long time. So I started off in 1998 and a friend of mine and myself actually founded the Chennai chapter of the Linux India group. So I have been involved with that community for a long while and it is actually a very active community today, the Chennai chapter of Linux India. I also worked on opening, on developing open source software, there is a package called Mayavi which is something that I created and I still maintain and develop. In addition to several other open source packages like VTK, TBTK, SciPy, all of these are Python related packages and I will explain to you why I am so fascinated about Python. And I also teach and do research. My chosen areas are computational fluid dynamics and I basically simulate fluid flow problems. So there is good amount of mathematics and computer science involved and I also happen to teach aerospace engineering courses like flight dynamics one, flight dynamics two and things like that. Before I move on, I am going to acknowledge the support of the National Mission on Education which has actually funded a major part of our initiatives at IIT Bombay for the open source effort. So this is something that I will talk about towards the end as well but I would like to acknowledge the support of the National Mission on Education in the MHRD project upfront. Okay, so coming back to our theme. So what am I trying to say? I am trying to say better engineering in science education and I am saying that Python is a good choice for this. So if Python is the solution, what exactly is the problem that we are trying to address? So this is going to be the theme of my talk. What are the motivations as to why Python, a programming language like Python is suitable and why it forms the best solution right now? So the outline of my talk is as follows, I am going to give you an understanding of the need for Python, why it is an important choice. What are the tools and capabilities that Python is capable of giving you? And then talk about a little project that connects all of us as teachers to Python. It is called the Fawcay project, I will talk to you about that at the end. But before we begin, how many of you have used Python or heard of Python? You have heard of Python. How many of you have used Python? Okay, so reasonably sized number of people have used Python. Turns out that Python is actually used by some very large companies, okay. For example, Google is a heavy user of Python. In fact, the creator of Python, the language and some of the big dadas in the programming language actually work at Google. So Google is a massive user of Python and that is one of Google's data centers. So at this data center, they actually have a huge farm of computers. Some of you may have read about the way they run things. They actually have nice clusters. They are huge clusters, probably the largest clusters in the world, managing all of our Google searches and things like that. So they are heavy users of Python. So how many of you recognize this man? Or not man, okay. So he's Yoda, he's from Star Wars. The people who make Star Wars, George Lucas, the company behind that, Industrial Light and Magic actually use Python internally, NASA uses Python heavily, okay. In addition, so I've basically said companies and research organizations use big named companies use Python. What are the applications that we can think about? Forget that. So there's basically a lot of these websites, for example. You can set up a website, a web framework for using Python, okay. Basically, this is called Plone. And Plone is a web framework where you can actually, it's a content management system. How many of you are familiar with content management systems? Okay, so basically you can put up content, have people add to the content, edit content. So Plone is one such tool. The previous one I had an image, it's called Django. It's again a web based product. Red Hat, how many of you have heard of Red Hat? All of you. So Red Hat again uses Python in all of its configuration scripts and also setting up the software. In addition, you can create games with Python. There's something called PyGame. You can write little space invaders like games. It's a very active project. So basically you can see there's a wide spectrum of users. There are people who do things like websites. There are people like NASA who do things with science and engineering, putting man in space. There are people like movie makers. There are people like Google using. So why do we need Python? What is the motivation for all of this? So if you look at technology, the way it's evolved, if you look at what's happened from a car to an airplane, from a car to an airplane, there's probably an order of magnitude speed difference. So cars travel maybe about 100 kilometers an hour on the average, and a plane on the average travels about 1,000 kilometers an hour today. And we've seen that this is revolutionized travel for us. Travel is no longer the same. We can fly in very short notice from here to Delhi in two hours. So imagine what has happened in the context of computers. Computers have actually changed by nine orders of magnitude, not one. So which means if cars had evolved the same way as computers, cars would be as small as a matchbox, would take us to the moon on one liter of petrol, and cost us 50 rupees. So basically computers have evolved to a point that they've completely changed everything. They've changed the way we do science. They've changed the way we do engineering. They've changed the way we solve several problems. Now I can actually ask a computer to do lots of drudge work and solve problems, which I couldn't do 50 years ago. In addition, unlike 1970s, when you had to make sure a program was really, really well written before you actually submitted it because it would take four hours for it to compile that program, now I can instantaneously run things. So what is important now is because the computer is so fast is that developer time is important. It's no longer important that you write the most perfect program. It's no longer important that you write the fastest program because the computer is fast enough. Secondly, the way we look at numbers. We don't compute when we do science and engineering. We don't compute numbers just for the sake of producing numbers. We are trying to get some insight into some physical problem. And a famous numerical analyst, electrical engineer called Hamming, how many of you have heard of Reed or Hamming codes? He's the same Hamming. So he says that he has an excellent numerical analyst as well. The purpose of computing is insight, not numbers. So the idea is the approach that we use for computing has also changed. So the implication of this is that we need a language that has both power and flexibility, like a gymnast. In addition, we have to deal with diverse fields. We are not just talking about computer science. Now we have science and engineering where everything is actually becoming cross. You have ideas from different fields coming into the other fields. And the fields are very, very diverse, from medicine to chemistry to neuroscience to rocket science. So you cover the whole spectrum, all of these require the use of computing. So in order to handle this, we need a toolkit that handles diversity. Very specifically we need a tool that's capable of doing numerics, that's capable of doing symbolics. In addition, many scientists actually use the computer as an exploratory tool. So supposing you have some data, you want to immediately plot it, which means I need to exploratively explore that data and then decide what's happening and then proceed. How many of you use MATLAB or heard of MATLAB? So the reason MATLAB is such an attractive option is simply because it provides an interactive environment. I can create a matrix, invert it, look at it, look at the diagonals, plot it, play around with it, look at the spectrum, all of that. So that's the power of an interpretive exploratory programming tool. We need something that's high performance. We also would like to do parallel computing because some problems are really, really large and we would like to marshal the resources of a large number of computers. We also want to build user interfaces. It's no longer enough today, in this day and age, for us to build little command line utilities. We want to build tools that can actually produce a user interface. We also want to leverage the web. If a tool is made available on the web, it makes a big difference. So in addition, there are a whole host of other tasks that a normal user of a computer needs to be able to do. So again, I'm just showing you examples of interactive exploration. So here, for example, I have an interpretive session where I'm playing around generating something and producing some plots, exploratory. I want to do symbolic computing. So look here, if you look at this line here, I have the derivative of square root of sine of x into tan hyperbolic x with respect to x and it's spitting out the actual expression. So I'd like to be able to do things like this, symbolic differentiation, integration and things like that. I'd like to be able to make three dimensional plots interactively and explore the data. I want high performance. I want to be able to use parallel computing. I want to be able to make user interfaces. And I'd like to be able to make a web page. So again, we need all of these tasks. These tasks need to be done by the modern engineer or scientists, no matter who they are. So the point is, if you use a specialized language like MATLAB, it's obviously not enough because MATLAB can only do one set of these things. For example, it can't do symbolics. For example, if you want to get something, you can't set up a web framework based on MATLAB. Building a user interface can be done with MATLAB but it's a big pain. So you need, you have diverse needs and what I am trying to show you is that Python is that choice for these diverse needs. So why Python? Why not something else? Why not Ruby or something else? Well, the answers are the following. It's very easy to learn and code. So I'll show you some code towards the end and you'll see that it's actually very readable code. It's scalable in general purpose, which means all of the tasks that I've been talking about up to now can be handled with Python. It's high level, which means I don't have to talk, I can talk up high level data structures, which is fundamentally important if I want to do any serious computing. It's modular and object oriented, which means I can break up large problems into little small chunks. That's the whole goal of modular computing. And it's cross platform, it runs on this Mac, it runs on Linux, Windows and you name it. Actually it runs on several Nokia phones and N70 series Python runs on that. It's also open source. In addition to this, it has a very powerful interactive interpreter. I'll probably show you a live demo in a little while. It has extensive libraries to do pretty much anything you can name. And because it's interpreted and has extensive libraries, it allows for very rapid application development, which means I can quickly put together an application using existing libraries in Python, open source libraries. And finally, the most important thing for scientists and engineers is that many people actually have legacy codes in C, C++ and FORTRAN. And it's relatively easy to interface to those using Python. It's not trivial, it takes some effort, but then it is doable. And thereby you can actually call your FORTRAN or C++ or C routines from Python, which now lets you marry the powerful high performance language underneath to a very elegant, highly effective programming language at the front. So Python, in my opinion, fits these requirements that we had that I've listed out to you perfectly. So let's look at the tools and capabilities that Python offers. So the first thing I'm gonna show you is an interactive interpreter called Ipython. So this basically, if I say Ipython minus PyLab, I can actually create a little plot in two lines of code. And then look at this command. I'm saying cd, work, workshop, fossey, something. So which means I can actually use it as a shell. So it actually has convenient features where I can do programming and also common tasks that I need to do as a shell user. And then I can import existing modules that I'm interested in. So what I'll do now is I'll show you a little quick demo of this. So I'll start up the interpreter and this is Python itself. So which means I can write Python programs, I can import modules of Python that I have written elsewhere and bring them in to this environment and start doing things. So for example, I can say x is linspace 0 to 2 star pi, 1000 points. So I'm creating between 0 and 2 pi, 1000 points. And now I wanna plot some function, for example. I can easily plot it. I'll show you that later. But now if I wanna look at what x is, I can do x.tab and it'll show me all of the methods that x has. So let's say, let me pick one of these. Let me pick x.nonzero, okay? So x.nonzero, I wanna know what it is. So if I do question mark, x.nonzero question mark, it actually shows me the documentation for that. So it's an interactive interpreter which gives me tab completion which I can type easily. I can search through my previous history. I can do a CD command and change my current directory and also do some science. I will show, I'll build up what I'm gonna demonstrate to you as I go along. But this is an interactive interpreter which is pure Python. So if I wanna create, say, a list. L is a list of, say, one, two, hello. I could do that. And L is no list object in Python, which I can play with. So basically, it opens up a programming mechanism that is interpreted. So I can easily learn, experiment, and do my, whatever calculations I want to do on the live interpreter. Now in addition to this basic interpreter that I was talking about, there are libraries to do numerical computing. So two of these are numpy and scipy. What numpy does is it provides a nice powerful array structure. So if you recall, I did linspace, which created an array. Now if I say sine of that x array, so let me do that. When I do y is sine of x, in one shot it has taken sine of all of those values. I could have chosen a million points, by the way. And it'll just do it instantaneously because the numpy library is actually written in C and it's very efficient underneath. But in Python, I can use it very conveniently to do rapid little calculations like that. So numpy provides this powerful array data structure that I can explore. So for example, if I print y, it's an array. It has a lot of values here. And actually it's a sine of the values here. In addition, there is scipy. So numpy just provides the basic array and manipulations for the array. Scipy itself has whole suite of other things you can do with it. For example, linear algebra. So if I have a system of equations that I want to solve, scipy will let me do it. I can do numerical integration, quadrature, Fourier transform, signal processing, special functions, statistics optimization, image processing, ordinary differential equation solvers. I will demonstrate for you ordinary differential solvers later. And linear algebra maybe I'll show you right now. And underneath scipy uses a whole suite of existing algorithms that are implemented either in C or for time. So they're very efficient, but extremely convenient to use. So would you like to see a demonstration of linear algebra, for example? Put that P of relevance. So let me create a matrix now. So I'll say A is, so first let me import. So the way you import a library in Python is you say import numpy. I get numpy now. All the numpy functionality is now available in this module called numpy. So I can now say A is numpy dot, I want to create a random matrix. Say 100 by 100 matrix, would that work? So random dot random. So now it's created a 100 by 100 matrix of random entries, one line of code. Now I want to create a right-hand side. I want to solve Ax equals b. I would like to solve A times x equals b. I want a right-hand side. So let me create a random right-hand side. So I'll say b is, so I have b. Now I want to solve this. So let me import scipy. So now I have leanAlge. I have imported the linear algebra module inside scipy. I can ask it to say, so now I don't know what to solve. So I need help. What should I do? I will simply do leanAlge question mark and look at it. And it shows me what is the documentation available with the linear algebra module. And I see there's a solve, right? So let me see if I can use the solve. So I say leanAlge dot solve, question mark. Solve the equation Ax equals b. That's what I'm looking for. So I say solve, A, b, let's say solution is that. My solution is there. So I have my solution, okay? So very easily I can create a matrix, solve it with a multitude of methods. I just showed one little method there. There are a whole bunch of other methods that I could have used. Ordinary differential equations I will come to later as I move on. The important thing for most scientists is not just those numbers, as I said. The important thing is insight. So you need to be able to plot your data, right? So there is a library called matplotlib, which lets you plot, make really sophisticated looking plots again from Python, okay? So again I will show you a demonstration. This code that you see on the right-hand side completely generates these two pictures, okay? I'll show you a live demonstration of this. So let me say I wanna see x. Remember I created x from zero to two pi. I wanna plot x versus sine squared of x, right? So I can say plot x sine of x squared, sorry. That's more interesting. Sine squared of x is not that interesting. So if I do plot, it shows up a nice little plot here for me, okay? And if I wanna look at a grid, I wanna zoom in, I could zoom in, so on and so forth. So now you see that the important thing here is that my interpreter is still active. So if I wanna create a new plot, change my data plot something else, I can always go back and do it. And all of this is again Python. So which means I can leverage all of the power of Python and yet do my little plotting. So I'm showing you several other demos. I don't have the time to do live demos of each. So here is a plot with standard error bars. So each of these is an error bar in x and y. You can see log, log, semi-log, and log, log plots here. Bar charts, pie charts, scatter plots, okay? Histogram plots. You can do polar plots and you can also make things like that. That's called a quiver plot, which means you show arrows, maps. So these are the kind of things you can do with matplot. So now you put together all of these like I just showed you. I can take, I can do all my numerical calculations, right? And then I can also do plotting of various types. And I have the interpreter that I can work with and create powerful programs with this. Now in addition to this, as I said, many researchers actually have high performance code written in C or C++. And to use those, you need to interface the language to those, okay? So it turns out that you can't do this. So what I'm gonna show you is a demonstration of some of my own code. This was actually implemented in C++, but then it's wrapped to Python. So I can call these things from Python and produce simulations that look something like this. So what's happening is there's a box. Inside the box, there's this little plus sign thing which is spinning. And as it spins, it's releasing some particles which I'm tracking in C++. But I'm now plotting it and generated a movie out of this from Python, okay? So basically these kind of sophisticated codes written in C++ can be interfaced from Python, just trying to show you that. So you want more simulation. So this is again a code that we are currently working on. And this problem is basically, there's a big vessel. You see the box? Inside the box, you see that blue thing, that's water. So it's like a dam. So imagine there's a dam and the dam breaks. What happens to the water? So it's trying to simulate this. So this is again a solver that's actually implemented in Python and a high performance variant called Scython together to actually produce simulations of this kind. So you can see that it's able to simulate some of this. This is not live, of course. This is taken several hours to run on a computer. And I'm just showing you the movie made out of it. The visualization was made again with a Python-based tool. But the point I'm trying to drive home is here, that you can write high performance codes that do serious computing with a tool like Python. It requires a lot more effort to make it high performance. But the point is, you can't do it with Python. Yes? Have you just imported the data file from your C++ program, like the coordinate positions and use the plot here? And then, Snape? No, so there are two things. The first simulation, that mixer, there I can actually call it live from Python. Which means, it's a library, right? My C++ code is made in a library. I can actually call the library functions from Python and have the data seamlessly sent back and forth from the Python world. It's not like I run the C++ code, dump the data file, and plotted it. No, I'm talking of native interfacing. OK, so at every time step, whatever you're getting the output here, you give it as input again, like that, is it? No, so the visualization that I finally made is actually made like that, as you say. It comes a data file, then I have a Python script that reads the data file through my C++ code and spits something out. But I actually have code, which I don't know if I can run it right now, that can actually show you the live simulation running all the time, which is written in Python. Because I have the full libraries, I have the complete C++ library at my disposal. So in fact, all of my driver programs, the program that actually runs the simulation, is a Python script. So it's like a function called from Python? Exactly. From the script, right? In fact, let me just try. It may not work, so I warn you. If it works, good, yeah, it worked. So now v is my library. So if I do v dot, say, 0.votex, let's see what it is. This is basically pulling it out from my modules, webtifs, something. This concrete class defines a 0.votex. Concrete class sounds very much like C++, right? So there's actually documentation pulled from my C++ code. But the point is, if I create this, I can say p is 0.votex. I've created an object, it's actually a C++ object. And now I have the object live with me in Python. So I can say p dot, say, strength, 0. C dot, set strength, I can do that. Even a MATLAB script you can run then? No. So if you have, it's a MATLAB script, unfortunately, because MATLAB is proprietary, there is a tool called MLABRAP, which will let you interface to MATLAB, but I have not used. I don't use MATLAB. I don't need to use MATLAB. This is also not a wrapper to MATLAB, because the syntax is similar. No, in fact, the syntax is somewhat similar, because NumPy, linspace, for example, is used simply because everybody else is familiar with MATLAB. So we use an interface similar to it, but it's a completely different programming language. And it's completely open source. All of the stuff I'm showing you is BSD license, which means you can use it. Don't sue us. Do whatever you want to do. Thank you. So in addition to this, we may also want to do parallel computing. And Python has a plethora of options. So you can do cluster and symmetric multiprocessing based options. There's also MPI. So you can use MPI for Pi, which is an excellent library, and various others, which I'm not going to talk about at this point in time. But basically, you can even do parallel computing with Python, relatively easily. As I said, we want to do 3D visualization and also want to build user interfaces. So here's a tool that's completely written in Python, especially the front end. Again, it's talking underneath to C++ libraries underneath. But I can actually create a user interface like this, a three-dimensional plot here, and embed an interactive Python session on that. This tool happens to be Maya V, which I've written. So one of the nice things about Maya V is the fact that you can do interactive work with it. It's not just an application which you throw up. I can write these one, two, three, four lines of code. This just produces the data. And with two lines of code, I can actually produce a three-dimensional plot. So let's try this out. I'll come back to that. The idea is what I'm doing here is I'm just saying x squared by 2 plus y squared plus z squared into 2. And I'm just saying with one line, I'm contouring that surface. And I'm producing iso-surfaces from that. So let's see if I can show you something. So I'm just going to show you the code. As you see, this is exactly the same code I showed you there. This is a little function that's there in the MLAB library. I'm just creating an O-grid, which means a three-dimensional cube of volume. I'm now going to calculate x squared by 2, y squared plus z squared into 2. And with these two lines, I'm going to contour it. Let's see what it does. So now you see a three-dimensional plot, which I can interact with. I can go into full-screen mode, play with. Then I have a full-fledged user interface. So if I click on this, it'll actually produce for me a nice user interface that I can navigate and use to change various properties. So for example, I want, say, four contours. I can click on the iso-surface. I didn't click on it. And then I can say, OK, I want six. And it actually produced six contours for me here. So the point is I can create a user interface relatively easily. I can do 3D plotting with very little amount of code and work interactively, which is the key thing for a scientist. So with few lines of code, a scientist can make a quick plot of some of the data that they're interested in looking at. So you can do things like this as well. With these three or four lines of code, I can actually produce a pretty looking picture. So here's a little more intricate example just to show you how the code looks for something that's a little more sophisticated. And it interfaces several things. I'm talking of sci-pi's ordinary differential integrator. I'm talking of a 3D visualization put together. So what we have is we have what's called the Lorentz equations. With dx dt is defined as s into y minus x dy dt dz by 2. So there's three coupled ordinary differential equations. There's a lot of interesting history behind this equation because it's the first equation where a scientist actually discovered chaos in the Lorentz equation. So it specifies the evolution of the system. It's what we want to solve. So what I want to do is I want to trace the path of the ordinary differential equation, starting from a given initial condition. Where does this path go? As you can see, it looks like three velocities. dx by dt is like u, dy by dt is like v, dz by dt is like w. So imagine I have a point and I have a velocity specified at each point. And I'm tracking this in time. So if I'm doing that, what is the trajectory that this point will follow? How would I implement that? So here is the actual code to do this. I have a bunch of imports, which basically import various important libraries for me. The first is numpy. The second is pylab, which actually I don't need. The third is my mlab, which is my always simple plotting phase. And the fourth line is do an ordinary differential equation that is imported from PsiPy's integrate function, a module. Then I've defined a little function. So I don't think all of you know Python, but I think all of you can read that code. It's a function defined, which is called Lorentz, which takes two arguments, r and t. And I'm saying x, y, z is r, which means r has to be a three to pull, not three, an array of three elements. Then I'm defining u is 10 times y minus x, v is the other, w is that, all from the previous equation. I just specified numbers for my s, r, and b. So the s is a constant, r is a constant, b is a constant. I've just specified some numerical values for those. And I'm just returning the result as an array. So it's readable code. And now to show the trajectory, I simply have, I say I sample the velocity at 2000 points between 0 and 50 times. Then I use the ODE to integrate this Lorentz function that I created from this starting point, 40 is a comma I've missed here. And then I plot it in one line. So with 16 lines of code, I can actually produce a picture that looks like this in 3D. So that's kind of the power at which you can work with a programming language that's nimble and high-level. So maybe I'll just show you a quick demo of that. So it's pretty much the same code I displayed for you there. I run it, and I get something that looks like this. Background is a little different, but that's the trajectory of the particle starting here where it goes. So that's the Lorentz attractor. So clearly, with very little bit of code, I can actually build useful content. Now it's just not that this is the only thing you can do. So here is a much more sophisticated user interface where I've built something with sliders on the right hand side, with text boxes where I can enter the equation itself, and look at the 3D visualization life. So this application is about 140 lines of code in Python, pure Python. And I can build a full-fledged user interface an application which students can use to explore the actual equations. So that's the kind of power we're talking about with a programming language like Python. So would you like to see a demo of that application? Maybe I'll do that. So this is the code. I'm just going to zip through the code. It's just showing you that it's Python. It's 138 lines of code. I'm going to run it. It'll take a little while to run because this is running on battery and it's a slow machine. But the point is it's going to generate the same Lorenz attractor, the same differential equations. It's going to integrate. Show me a visualization of that, and allow me to change parameters on the fly. So there you go. So this is a full, it's like an application. But now if I, for example, change the S parameter, I can just drag it, and it'll actually reintegrate those differential equations. And I can explore the whole solution here. And I have the full power of the full user interface that Maya v provides by going back and clicking on this. If I click on that, I can change the visualization itself, change the properties and stuff like that. I can also change the differential equations that I'm integrating. So let me make it linear. So I'll remove x star z. I hit return, and it's integrated the new set of differential equations. So you can see that for a student who's playing around with differential equations, it's very easy to start exploring, saying, let me change the parameter what happens, let me change the differential equation what happens, and actually learn from this. Now one thing I've not talked about at all is symbolic calculations. So there's a project called SAGE, SAGE, www.sagemath.org, where they build, again, an open source toolkit which bundles Python along with a suite of other tools to do symbolic and numeric calculation. So what you see here is a screenshot of a web page called a notebook. I'll show you a live demo in a short while. Maybe I'll start atop. So what you see is a web page on which I can interactively intertext. This is all again implemented in Python. It talks to other tools in the background, like Maxima and things like that, does symbolic calculations. So what I did was I just started the SAGE notebook. I just said SAGE minus notebook over here, and it starts up this web server on the background, which is again implemented in Python. And I hook up to my web browser. I get this page with a whole set of what are called notebooks, worksheets. So I click on, say, SAGE demonstration that I have. So what this is is, it's a full page with a lot of math, some text. So what I have here is a little semi-talk on this. So this is just HTML. So if I want to edit this, for example, I can just click on this. It'll open up an editor. So for example, look at this. I'm saying integral of cosine of minus cosine of theta and latex syntax. And now if I say save changes, so it actually produces the math with the suitable markup. So then I can actually start creating variables. I can say x, y, z are variables. R is this. U is some function of this. And then say show me that as an expression. What it does is it does the calculation and shows me. Now it's just showing me log of r minus x. So it will just show me an expression as soon as it completes. First time round, it's going to take a little while because I've been doing a lot of stuff. So there you go. Now it should be faster. So now I want to look at the derivative of, the second derivative of log of r minus x. And you can see that it's actually calculating it. Now I want to see if the del squared of this. Again, if we calculate del squared of u and find that it is 0, that is u is harmonic. I can do the same thing. I evaluate that. So I can keep on doing this. And then calculate, say integrals like this. Evaluate such integrals. I can calculate symbolic matrices. So for example, I have defined a matrix here, which is 0, 1, 1, 1 plus A. Now I have a symbol A. And I want to find the determinant of this matrix. So basically, you can see that that is the matrix. And the determinant is A squared plus 7A plus 4. So you can do symbolic math. You can also do arbitrary position math with this tool. So here I am printing pi for 200 decimal places. So you can do arbitrary math. One of the wonderful things about this is that you can do embedded 2D plotting. So with those two lines, I hit Shift Enter. It will actually do a plot and plot that line. So I can change the parameters and plot. And it's a live web page. So you can imagine that you people can actually collaborate. I can create a page, show it on the web. I can do it from anywhere in the web and use it. I can create interactive plots as well. So here is a simple example of a Taylor series expansion done with Sage. So what we have here is a little user interface where the function is sine of x star cosine of x. That's the plot. And I'm seeing the first-order approximation of that function at that point, which is here, and actually shows it graphically. So if I make a higher-order approximation, say, it becomes this. So if you're teaching maps to students, you can create little live demos like this and have them explore interactively on a web page, which is extremely convenient. You can also do simple 3D plots. For example, here is a 3D plot of a sphere, which is not very interesting. But here's a more interesting plot of a surface, e to the power x by phi into cosine of y. That's the curve. And you can explore it on your web page with Sage. So basically, with Sage, there's a lot you can do. And all of this is Python. So if you learn Python, you can bundle in all of the goodies that I've talked about. You could use Sage and pretty much do what you like with scientific computing. Recently, we've also sort of married Sage and Maya V so that you can do 3D visualizations on the web with Maya V as well. So in summary, basically I've motivated the need for stack of tools, powerful tools that I've talked about, the need for Python, the exact tool stack that I am particularly interested in. I think most engineers and scientists anywhere in the world would be interested, which is numerics, symbolics, visualization, interactive exploration, high performance computing, user interfaces, and web and networking. All of this is possible with Python. So what? So what does this mean for us teachers? At which point, I'd like to introduce the Fawcay project and just take five more minutes. So Fawcay stands for free open source software for science and engineering education. And this is an MHRD funded project again, where we are trying to promote the adoption of free open source tools in the curriculum in college. And specifically, we are focusing on Python, Sylab, and Blender. I think Sylab, you must have already received a CD on. I am focusing my efforts on the Python support. So Kandan and three other faculty are looking at Sylab. And Professor Sridharayar from computer science is actually looking at creating Blender-based animations for educational content. So if you're teaching a course and you want an animation in 3D, they will use Blender to create the animation and give it to you, open source. So this whole project, the goal is to spread the adoption of Python and Sylab and other possible tools. Right now, we are focusing on these two major ones in the curriculum. In order that students be able to use these kind of tools. So how are we going to help? We are going to make courses, free material, documentation, we conduct workshops, teacher training, and also support projects of interest. And specifically with respect to all of you, we are mandate to actually spread this. So we'd be happy to conduct workshops anywhere in India for you on these suite of tools. So right now, we've been conducting Python workshops for two days. We've had one in Haiti Bombay. We're going to have one next week in Pune. We'll have one at Goa. So almost every month, we're going to have a few of these. So any time you need something, you need a workshop to be done, please contact us. We'll be more than happy to do it for you. And in fact, we should again try to see if we can do this coordinated effort to reach about 1,000 teachers on this. We'd be happy to do that if you're interested. We're also going to have a sci-pi conference. The website is sci-pi.in. It's in Trivandrum. It's short notice, but this is December 12th to 17th, 2009. We're going to have this at Trivandrum. So if you want to reach us, check out our website, foci.in. And email us at info.foci.in, if you want to conduct a workshop, if you have any questions or anything of the kind. I'll put that up again. So thank you. What can we do for you? Any questions? See, actually, you showed your fluid dynamics applications. There, your C library is using the finite difference solver or whatever. That's my, it's not actually finite difference. Any whatever technique. So that solver or anything is not there in Python. It doesn't do PDs. Actually, there are a whole suite of tools for that as well. I just, it's a world by itself. So for example, there's a tool called SFEPi. I'm going to be releasing my own code open source. But there's a tool called SFEPi, which is finite elements in Python. There's a tool called Phoenix, which is, again, Python. They have a C-based back end, but then they have a Python front end for that. And there's something called Femhub, again, which uses some of the infrastructure that Sage provides. The Sage notebook and things like that, they're actually making a smaller version of the Sage. No Sage, most of it is huge. It's like 300 MB download. Whereas Femhub will be a smaller thing, which is customized for numerical applications and some symbolic applications. So there's Femhub, where they are building high performance finite elements, or HP-refined finite elements to this. So people are actually starting to use this. Contribute, OK. Yes, it is coming. It is growing. So I have, I work in particle methods. And the tools that we are building, that's smooth particle hydrodynamic simulation, we probably open source that next year. It's not finished yet. So as soon as it's finished, we'll open source it. And that is written not in C. That is actually written in Python and Cython. So then you model from the differential equation or from the differential? So basically, whatever is your modeling technique, that has to be implemented. Can we also model from the geometry, like in finite elements, where we start with the geometry? So you're asking that we have a CAD, like some. We can import it. As you see, CAD is actually a niche market, not niche market. It's actually, if you look at AutoCAD, they've actually cornered the large part of the market. There is something called OpenCascade, which has some Python bindings, but I'm not quite sure how good those bindings are, because I don't use those tools. But there is OpenCascade, which is an open source. They have very good journals, geometry journals. So apparently, it's very good, but I have no personal experience. Thank you. Yes? Do you have the image processing support for availability? Yes. So for example, elementary image processing is actually pretty straightforward with NumPy itself. So if you use, there's a library called PIL, Python Imaging Library. You can read any image format. In fact, I have an interesting story. My niece had some problems. She was looking at some photographs they've taken, and they tried to identify the number of particles. They had some equivalent MATLAB code. I converted it to Python. You can count the number of particles with that. So basically, you can read an image. You get a NumPy array. Then you can do all the processing that NumPy arrays let you do. One. The other is, if you want sophisticated algorithms, NumPy has some support. But there's a more sophisticated library called OpenCV, which supports a lot of imaging related stuff. And OpenCV is open source, and it has Python binding. So if there are no further questions, thank you again for giving me this opportunity. I hope to hear from you.