perl Integration

This example demonstrates how to use fluids from perl.

Source Code

  1#!/usr/bin/perl
  2use strict;
  3use warnings;
  4use Inline Python => <<'END_PYTHON';
  5import fluids
  6END_PYTHON
  7use Time::HiRes qw(time);
  8use POSIX qw(ceil floor);
  9
 10# Function to test basic fluids functionality
 11sub test_fluids {
 12    eval {
 13        # Test basic module import and version
 14        my $version = Inline::Python::py_eval('fluids.__version__', 0);
 15        print "✓ Successfully imported fluids\n";
 16        print "✓ Fluids version: $version\n";
 17        
 18        # Test basic Reynolds number calculation
 19        # Create kwargs dictionary in Python
 20        Inline::Python::py_eval('kwargs = {"V": 2.5, "D": 0.1, "rho": 1000, "mu": 0.001}');
 21        my $Re = Inline::Python::py_eval('fluids.Reynolds(**kwargs)', 0);
 22        print "✓ Reynolds number calculation successful: $Re\n";
 23        die "Invalid Reynolds number" unless $Re > 0;
 24        
 25        # Test friction factor calculation
 26        Inline::Python::py_eval('kwargs = {"Re": 1e5, "eD": 0.0001}');
 27        my $fd = Inline::Python::py_eval('fluids.friction_factor(**kwargs)', 0);
 28        print "✓ Friction factor calculation successful: $fd\n";
 29        die "Invalid friction factor" unless ($fd > 0 && $fd < 1);
 30        
 31        print "\nAll basic tests completed successfully!\n";
 32    };
 33    if ($@) {
 34        print "Error occurred: $@\n";
 35        die $@;
 36    }
 37}
 38
 39# Function to test atmosphere calculations
 40sub test_atmosphere {
 41    eval {
 42        # Test ATMOSPHERE_1976 class
 43        Inline::Python::py_eval('atm = fluids.ATMOSPHERE_1976(Z=5000)');
 44        
 45        print "\nTesting atmosphere at 5000m elevation:\n";
 46        printf "✓ Temperature: %.4f\n", Inline::Python::py_eval('atm.T', 0);
 47        printf "✓ Pressure: %.4f\n", Inline::Python::py_eval('atm.P', 0);
 48        printf "✓ Density: %.6f\n", Inline::Python::py_eval('atm.rho', 0);
 49        
 50        # Test derived properties
 51        printf "✓ Gravity: %.6f\n", Inline::Python::py_eval('atm.g', 0);
 52        printf "✓ Viscosity: %.6e\n", Inline::Python::py_eval('atm.mu', 0);
 53        printf "✓ Thermal conductivity: %.6f\n", Inline::Python::py_eval('atm.k', 0);
 54        printf "✓ Sonic velocity: %.4f\n", Inline::Python::py_eval('atm.v_sonic', 0);
 55        
 56        # Test static methods
 57        my $g_high = Inline::Python::py_eval('fluids.ATMOSPHERE_1976.gravity(Z=1E5)', 0);
 58        printf "✓ High altitude gravity: %.6f\n", $g_high;
 59        
 60        my $v_sonic = Inline::Python::py_eval('fluids.ATMOSPHERE_1976.sonic_velocity(T=300)', 0);
 61        printf "✓ Sonic velocity at 300K: %.4f\n", $v_sonic;
 62    };
 63    if ($@) {
 64        print "Error in atmosphere tests: $@\n";
 65        die $@;
 66    }
 67}
 68
 69# Function to test tank calculations
 70
 71
 72# Function to test tank calculations
 73sub test_tank {
 74    eval {
 75        # Test basic tank creation
 76        Inline::Python::py_eval(<<'END_PYTHON');
 77T1 = fluids.TANK(V=10, L_over_D=0.7, sideB='conical', horizontal=False)
 78END_PYTHON
 79        print "\nTesting tank calculations:\n";
 80        printf "✓ Tank length: %.6f\n", Inline::Python::py_eval('T1.L', 0);
 81        printf "✓ Tank diameter: %.6f\n", Inline::Python::py_eval('T1.D', 0);
 82        
 83        # Test ellipsoidal tank
 84        Inline::Python::py_eval(<<'END_PYTHON');
 85tank_ellip = fluids.TANK(D=10, V=500, horizontal=False,
 86                       sideA='ellipsoidal', sideB='ellipsoidal',
 87                       sideA_a=1, sideB_a=1)
 88END_PYTHON
 89        printf "✓ Ellipsoidal tank L: %.6f\n", Inline::Python::py_eval('tank_ellip.L', 0);
 90        
 91        # Test torispherical tank
 92        Inline::Python::py_eval(<<'END_PYTHON');
 93DIN = fluids.TANK(L=3, D=5, horizontal=False,
 94                sideA='torispherical', sideB='torispherical',
 95                sideA_f=1, sideA_k=0.1, sideB_f=1, sideB_k=0.1)
 96END_PYTHON
 97        printf "✓ Tank max height: %.6f\n", Inline::Python::py_eval('DIN.h_max', 0);
 98        printf "✓ Height at V=40: %.6f\n", Inline::Python::py_eval('DIN.h_from_V(40)', 0);
 99        printf "✓ Volume at h=4.1: %.5f\n", Inline::Python::py_eval('DIN.V_from_h(4.1)', 0);
100        printf "✓ Surface area at h=2.1: %.5f\n", Inline::Python::py_eval('DIN.SA_from_h(2.1)', 0);
101    };
102    if ($@) {
103        print "Error in tank tests: $@\n";
104        die $@;
105    }
106}
107# Function to benchmark fluids operations
108
109
110# Function to benchmark fluids operations
111sub benchmark_fluids {
112    print "\nRunning benchmarks:\n";
113    
114    # Benchmark friction factor calculation
115    print "\nBenchmarking friction_factor:\n";
116    my $start_time = time();
117    Inline::Python::py_eval(<<'END_PYTHON');
118for i in range(10000):
119    fluids.friction_factor(Re=1e5, eD=0.0001)
120END_PYTHON
121    my $duration = time() - $start_time;
122    printf "Time for 10000 friction_factor calls: %.6f seconds\n", $duration;
123    printf "Average time per call: %.6f seconds\n", $duration/10000;
124    
125    # Benchmark tank creation
126    print "\nBenchmarking TANK creation:\n";
127    $start_time = time();
128    Inline::Python::py_eval(<<'END_PYTHON');
129for i in range(1000):
130    fluids.TANK(L=3, D=5, horizontal=False,
131               sideA='torispherical', sideB='torispherical',
132               sideA_f=1, sideA_k=0.1, sideB_f=1, sideB_k=0.1)
133END_PYTHON
134    $duration = time() - $start_time;
135    printf "Time for 1000 TANK creations: %.6f seconds\n", $duration;
136    printf "Average time per creation: %.6f seconds\n", $duration/1000;
137}
138
139# Run all tests
140print "Running fluids tests from Perl...\n";
141test_fluids();
142test_atmosphere();
143test_tank();
144benchmark_fluids();
145print "\nAll tests completed!\n";

Requirements

Usage Notes

  • 2 microsecond friction factor, 10 microsecond tank creation observed by author