Skip to main content

PHP + GNU Octave to build a web based pump dimensioning system

During my undergrad studies, when I was doing the fluid dynamics class, we had to dimension pumping systems. The work involved in doing that used to be laborious, many coefficients, constants, etc, and we had to use only our scientific calculators. To check our answers when in home, everybody used to wrote their own spreadsheet. As a FLOSS enthusiast and long time PHP programmer, I decided to write a web based pump dimensioning system.


As we calculated the fluid density depending on watter temperature, and we had used small numbers (E-5) which lead to underflow errors when the calculations were did using only PHP statements. In other hand, when using GNU Octave, the precision was great and things were much easy, because I didn't really needed to care about precision, was just type the calculations, press enter and get the right answer.

So I wrote a PHP function that calls the exec command to run GNU Octave and get back the Octave output into one PHP variable. That way I got all calculations I needed on PHP, and with the desired precision.

$filename = round(time() / 10 * rand(1,10));
$filename = $path_to_temp_dir . $filename;


function octave_calc($expression){
global
$filename;
global
$path_to_octave;
if (
$expression){
$script_octave = fopen($filename . ".m", "w");
fputs($script_octave , $expression . "\n");
fclose($script_octave);
$ans = exec($path_to_octave . " -q " . $filename . ".m");
$ans = explode("=", $ans);
$ans = $ans[1];
$fr = $ans;
unlink($filename . ".m");
}
return
$ans;
}

In PHP, the code to calculate the fluid density is as follows:

$rho_a = 999.79684;
$rho_b = 0.068317355;
$rho_c = -0.010740248;
$rho_d = 0.00082140905;
$rho_e = -2.3030988e-5;

// From here the calculations are made using the GNU Octave
$command = $rho_a . " + ";
$command .= "(" . $rho_b . " * " . $T . ") + ";
$command .= "(" . $rho_c . " * ((" . $T . ")^2)) +";
$command .= " (" . $rho_d . " * ((" . $T . ")^2.5)) + ";
$command .= "(" . $rho_e . " * ((". $T . ")^3))";
$rho = octave_calc($command);

echo
$rho;


A demo system stills avaliable on the University web site, at my personal home page: http://www.ee.pucrs.br/~filipi/pumps/

The PHP source code is also avaliable, at the same site.

Comments

  1. logre generar a pumps, en win 7 un poco mas complicado. pero lo logre

    ReplyDelete

Post a Comment

Popular posts from this blog

uSleep on windows (win32)

I am facing a terrible issue regarding timing on windows. Googling arround, I've found those infos: Using QueryPerformanceCounter and QueryPerformanceFrequency APIs in Dev-C++ ( http://yeohhs.blogspot.com/2005/08/using -queryperformancecounter-and_13.html ) QueryPerformanceCounter() vs. GetTickCount() http://www.delphifaq.com/faq/delphi_windows_API/f345.shtml How to time a block of code http://www.cryer.co.uk/brian/delphi/howto_time_code.htm And Results of some quick research on timing in Win32 http://www.geisswerks.com/ryan/FAQS/timing.html With that I'm trying to write something like a uSleep function for windows: # include<windows.h> void uSleep ( int waitTime){ __int64 time1 = 0, time2 = 0, sysFreq = 0; QueryPerformanceCounter((LARGE_INTEGER *)&time1); QueryPerformanceFrequency((LARGE_INTEGER *)&freq); do { QueryPerformanceCounter((LARGE_INTEGER *)&time2); // }while((((time2-time1)*1.0)/sysFreq)<waitTime); } while ( (time2-time1) <waitTime); } T...

More trickery with gnuplot dumb terminal

In my post " Plotting memory usage on console " the chart doesn't pan the data. Now, using a named pipe, the effect got a little bit nicer. First, we have to run the memUsage.sh script to get a file filled with memory usage info: ./memUsage.sh > memUsage.dat & Then we have to create a named pipe: mkfifo pipe Now we have to run another process to tail only the last 64 lines from the memUsage.dat while [ 1 ]; do tail -64 memUsage.dat> pipe; done & And now we just have to plot the data from the pipe: watch -n 1 'gnuplot -e "set terminal dumb;p \"pipe\" with lines"' And that is it!

Replace transparency in PNG images with white background (for lots of files...)

I had to remove transparency from a PNG image file from the command line... and stack overflow came into my help[1]... But I needed it for lots of files... then, adding a "while read line" did the job: ls -1 *.png |  cut -d . -f 1 | while read line; do convert -flatten $line.png flatten/$line.png ; done; [1] Replace transparency in PNG images with white background https://stackoverflow.com/questions/2322750/replace-transparency-in-png-images-with-white-background