julia Integration¶
This example demonstrates how to use fluids from julia.
Source Code¶
1using PyCall
2using Printf
3const fluids = pyimport("fluids")
4
5function test_fluids()
6 try
7 # 1. Test basic module import
8 println("✓ Successfully imported fluids")
9 println("✓ Fluids version: ", fluids.__version__)
10
11 # 2. Test basic Reynolds number calculation
12 Re = fluids.Reynolds(V=2.5, D=0.1, rho=1000, mu=0.001)
13 println("✓ Reynolds number calculation successful: ", Re)
14 @assert Re > 0
15
16 # 3. Test friction factor calculation
17 fd = fluids.friction_factor(Re=1e5, eD=0.0001)
18 println("✓ Friction factor calculation successful: ", fd)
19 @assert 0 < fd < 1
20
21 println("\nAll basic tests completed successfully!")
22
23 catch e
24 println("Error occurred: ", e)
25 rethrow(e)
26 end
27end
28
29function test_atmosphere()
30 try
31 # Test ATMOSPHERE_1976 class
32 atm = fluids.ATMOSPHERE_1976(Z=5000)
33
34 println("\nTesting atmosphere at 5000m elevation:")
35 println("✓ Temperature: ", round(atm.T, digits=4))
36 println("✓ Pressure: ", round(atm.P, digits=4))
37 println("✓ Density: ", round(atm.rho, digits=6))
38
39 # Test derived properties
40 println("✓ Gravity: ", round(atm.g, digits=6))
41 println("✓ Viscosity: ", @sprintf("%.6e", atm.mu))
42 println("✓ Thermal conductivity: ", round(atm.k, digits=6))
43 println("✓ Sonic velocity: ", round(atm.v_sonic, digits=4))
44
45 # Test static methods
46 g_high = fluids.ATMOSPHERE_1976.gravity(Z=1E5)
47 println("✓ High altitude gravity: ", round(g_high, digits=6))
48
49 v_sonic = fluids.ATMOSPHERE_1976.sonic_velocity(T=300)
50 println("✓ Sonic velocity at 300K: ", round(v_sonic, digits=4))
51
52 mu_400 = fluids.ATMOSPHERE_1976.viscosity(T=400)
53 println("✓ Viscosity at 400K: ", @sprintf("%.6e", mu_400))
54
55 k_400 = fluids.ATMOSPHERE_1976.thermal_conductivity(T=400)
56 println("✓ Thermal conductivity at 400K: ", round(k_400, digits=6))
57
58 catch e
59 println("Error in atmosphere tests: ", e)
60 rethrow(e)
61 end
62end
63
64function test_tank()
65 try
66 # Test basic tank creation
67 T1 = fluids.TANK(V=10, L_over_D=0.7, sideB="conical", horizontal=false)
68 println("\nTesting tank calculations:")
69 println("✓ Tank length: ", round(T1.L, digits=6))
70 println("✓ Tank diameter: ", round(T1.D, digits=6))
71
72 # Test ellipsoidal tank
73 tank_ellip = fluids.TANK(D=10, V=500, horizontal=false,
74 sideA="ellipsoidal", sideB="ellipsoidal",
75 sideA_a=1, sideB_a=1)
76 println("✓ Ellipsoidal tank L: ", round(tank_ellip.L, digits=6))
77
78 # Test torispherical tank
79 DIN = fluids.TANK(L=3, D=5, horizontal=false,
80 sideA="torispherical", sideB="torispherical",
81 sideA_f=1, sideA_k=0.1, sideB_f=1, sideB_k=0.1)
82
83 println("✓ Tank representation: ", string(DIN))
84 println("✓ Tank max height: ", round(DIN.h_max, digits=6))
85 println("✓ Height at V=40: ", round(DIN.h_from_V(40), digits=6))
86 println("✓ Volume at h=4.1: ", round(DIN.V_from_h(4.1), digits=5))
87 println("✓ Surface area at h=2.1: ", round(DIN.SA_from_h(2.1), digits=5))
88
89 catch e
90 println("Error in tank tests: ", e)
91 rethrow(e)
92 end
93end
94
95function test_reynolds()
96 try
97 println("\nTesting Reynolds number calculations:")
98
99 # Test with density and viscosity
100 Re1 = fluids.Reynolds(V=2.5, D=0.25, rho=1.1613, mu=1.9E-5)
101 println("✓ Re (with rho, mu): ", round(Re1, digits=4))
102 @assert abs(Re1 - 38200.6579) < 0.1
103
104 # Test with kinematic viscosity
105 Re2 = fluids.Reynolds(V=2.5, D=0.25, nu=1.636e-05)
106 println("✓ Re (with nu): ", round(Re2, digits=4))
107 @assert abs(Re2 - 38202.934) < 0.1
108
109 catch e
110 println("Error in Reynolds tests: ", e)
111 rethrow(e)
112 end
113end
114
115function test_psd()
116 try
117 println("\nTesting particle size distribution functionality:")
118
119 # Create a discrete PSD
120 ds = [240, 360, 450, 562.5, 703, 878, 1097, 1371, 1713, 2141, 2676, 3345, 4181, 5226, 6532]
121 numbers = [65, 119, 232, 410, 629, 849, 990, 981, 825, 579, 297, 111, 21, 1]
122
123 psd = fluids.particle_size_distribution.ParticleSizeDistribution(
124 ds=ds,
125 fractions=numbers,
126 order=0
127 )
128 println("✓ Created discrete PSD")
129
130 # Test mean sizes
131 d21 = psd.mean_size(2, 1)
132 println("✓ Size-weighted mean diameter: ", round(d21, digits=4))
133 @assert abs(d21 - 1857.788) < 0.1
134
135 d10 = psd.mean_size(1, 0)
136 println("✓ Arithmetic mean diameter: ", round(d10, digits=4))
137 @assert abs(d10 - 1459.372) < 0.1
138
139 # Test percentile calculations
140 d10_percentile = psd.dn(0.1)
141 d90_percentile = psd.dn(0.9)
142 println("✓ D10: ", round(d10_percentile, digits=4))
143 println("✓ D90: ", round(d90_percentile, digits=4))
144
145 # Test probability functions
146 pdf_val = psd.pdf(1000)
147 cdf_val = psd.cdf(5000)
148 println("✓ PDF at 1000: ", @sprintf("%.4e", pdf_val))
149 println("✓ CDF at 5000: ", round(cdf_val, digits=6))
150
151 # Test lognormal distribution
152 psd_log = fluids.particle_size_distribution.PSDLognormal(s=0.5, d_characteristic=5E-6)
153 println("✓ Created lognormal PSD")
154
155 vssa = psd_log.vssa
156 println("✓ Volume specific surface area: ", round(vssa, digits=2))
157
158 span = psd_log.dn(0.9) - psd_log.dn(0.1)
159 println("✓ Span: ", @sprintf("%.4e", span))
160
161 ratio_7525 = psd_log.dn(0.75)/psd_log.dn(0.25)
162 println("✓ D75/D25 ratio: ", round(ratio_7525, digits=6))
163
164 catch e
165 println("Error in PSD tests: ", e)
166 rethrow(e)
167 end
168end
169function benchmark_fluids()
170 println("\nRunning benchmarks:")
171
172 # Benchmark friction factor calculation
173 println("\nBenchmarking friction_factor:")
174 t1 = @elapsed for i in 1:1000000
175 fluids.friction_factor(Re=1e5, eD=0.0001)
176 end
177 println("Time for 1e6 friction_factor calls: ", round(t1, digits=6), " seconds")
178 println("Average time per call: ", round(t1/1000000, digits=6), " seconds")
179
180 # Benchmark tank creation
181 println("\nBenchmarking TANK creation:")
182 t2 = @elapsed for i in 1:1000
183 fluids.TANK(L=3, D=5, horizontal=false,
184 sideA="torispherical", sideB="torispherical",
185 sideA_f=1, sideA_k=0.1, sideB_f=1, sideB_k=0.1)
186 end
187 println("Average time per creation: ", round(t2/1000, digits=6), " seconds")
188
189end
190
191# Add this line at the end of your script to run the benchmark
192# Run all tests
193println("Running fluids tests from Julia...")
194test_fluids()
195test_atmosphere()
196test_tank()
197test_reynolds()
198test_psd()
199benchmark_fluids()
200println("\nAll tests completed!")
Requirements¶
Python with fluids installed
PyCall.jl package
Usage Notes¶
8 microsecond friction factor, 20 microsecond tank creation observed by author