Sunday, March 8, 2009

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.

1 comment:

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

    ReplyDelete