"""Chemical Engineering Design Library (ChEDL). Utilities for process modeling.
Copyright (C) 2016, 2017, 2018, 2019, 2020 Caleb Bell <Caleb.Andrew.Bell@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
This module contains correlations for the drag coefficient `Cd` of a particle
moving in a fluid. Numerical solvers for terminal velocity and an
integrator for particle position over time are included also.
For reporting bugs, adding feature requests, or submitting pull requests,
please use the `GitHub issue tracker <https://github.com/CalebBell/fluids/>`_
or contact the author at Caleb.Andrew.Bell@gmail.com.
.. contents:: :local:
Interfaces to Drag Models
-------------------------
.. autofunction:: drag_sphere
.. autofunction:: v_terminal
.. autofunction:: integrate_drag_sphere
.. autofunction:: time_v_terminal_Stokes
.. autofunction:: drag_sphere_methods
Drag Correlations
-----------------
.. autofunction:: Stokes
.. autofunction:: Barati
.. autofunction:: Barati_high
.. autofunction:: Khan_Richardson
.. autofunction:: Morsi_Alexander
.. autofunction:: Rouse
.. autofunction:: Engelund_Hansen
.. autofunction:: Clift_Gauvin
.. autofunction:: Graf
.. autofunction:: Flemmer_Banks
.. autofunction:: Swamee_Ojha
.. autofunction:: Yen
.. autofunction:: Haider_Levenspiel
.. autofunction:: Cheng
.. autofunction:: Terfous
.. autofunction:: Mikhailov_Freire
.. autofunction:: Clift
.. autofunction:: Ceylan
.. autofunction:: Almedeij
.. autofunction:: Morrison
.. autofunction:: Song_Xu
"""
from math import exp, log, log10, sqrt, tanh
from fluids.constants import g
from fluids.core import Reynolds
from fluids.numerics import secant
__all__ = ['drag_sphere', 'drag_sphere_methods', 'v_terminal', 'integrate_drag_sphere',
'time_v_terminal_Stokes', 'Stokes',
'Barati', 'Barati_high', 'Rouse', 'Engelund_Hansen',
'Clift_Gauvin', 'Morsi_Alexander', 'Graf', 'Flemmer_Banks', 'Khan_Richardson',
'Swamee_Ojha', 'Yen', 'Haider_Levenspiel', 'Cheng', 'Terfous',
'Mikhailov_Freire', 'Clift', 'Ceylan', 'Almedeij', 'Morrison', 'Song_Xu']
[docs]def Stokes(Re):
r'''Calculates drag coefficient of a smooth sphere using Stoke's law.
.. math::
C_D = 24/Re
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 0.3
Examples
--------
>>> Stokes(0.1)
240.0
References
----------
.. [1] Rhodes, Martin J. Introduction to Particle Technology. Wiley, 2013.
'''
return 24./Re
[docs]def Barati(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_.
.. math::
C_D = 5.4856\times10^9\tanh(4.3774\times10^{-9}/Re)
+ 0.0709\tanh(700.6574/Re) + 0.3894\tanh(74.1539/Re)
- 0.1198\tanh(7429.0843/Re) + 1.7174\tanh[9.9851/(Re+2.3384)] + 0.4744
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 2E5
Examples
--------
Matching example in [1]_, in a table of calculated values.
>>> Barati(200.)
0.7682237950389874
References
----------
.. [1] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
Re_inv = 1.0/Re
Cd = (5.4856E9*tanh(4.3774E-9*Re_inv) + 0.0709*tanh(700.6574*Re_inv)
+ 0.3894*tanh(74.1539*Re_inv) - 0.1198*tanh(7429.0843*Re_inv)
+ 1.7174*tanh(9.9851/(Re + 2.3384)) + 0.4744)
return Cd
[docs]def Barati_high(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_.
.. math::
C_D = 8\times 10^{-6}\left[(Re/6530)^2 + \tanh(Re) - 8\ln(Re)/\ln(10)\right]
- 0.4119\exp(-2.08\times10^{43}/[Re + Re^2]^4)
-2.1344\exp(-\{[\ln(Re^2 + 10.7563)/\ln(10)]^2 + 9.9867\}/Re)
+0.1357\exp(-[(Re/1620)^2 + 10370]/Re)
- 8.5\times 10^{-3}\{2\ln[\tanh(\tanh(Re))]/\ln(10) - 2825.7162\}/Re
+ 2.4795
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 1E6
This model is the wider-range model the authors developed.
At sufficiently low diameters or Re values, drag is no longer a phenomena.
Examples
--------
Matching example in [1]_, in a table of calculated values.
>>> Barati_high(200.)
0.7730544082789523
References
----------
.. [1] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
Re2 = Re*Re
t0 = 1.0/Re
t1 = Re*(1.0/6530.)
t2 = Re*(1.0/1620)
t3 = log10(Re2 + 10.7563)
t4 = 1.0/(Re+Re2)
t4 *= t4
t4 *= t4
tanhRe = tanh(Re)
Cd = (8E-6*(t1*t1 + tanhRe - 8.0*log10(Re))
- 0.4119*exp(-2.08E43*t4)
- 2.1344*exp(-t0*(t3*t3 + 9.9867))
+ 0.1357*exp(-t0*(t2*t2 + 10370.))
- 8.5E-3*t0*(2.0*log10(tanh(tanhRe)) - 2825.7162) + 2.4795)
return Cd
[docs]def Rouse(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D = \frac{24}{Re} + \frac{3}{Re^{0.5}} + 0.34
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 2E5
Examples
--------
>>> Rouse(200.)
0.6721320343559642
References
----------
.. [1] H. Rouse, Fluid Mechanics for Hydraulic Engineers, Dover,
New York, N.Y., 1938
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
return 24./Re + 3/sqrt(Re) + 0.34
[docs]def Engelund_Hansen(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D = \frac{24}{Re} + 1.5
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 2E5
Examples
--------
>>> Engelund_Hansen(200.)
1.62
References
----------
.. [1] F. Engelund, E. Hansen, Monograph on Sediment Transport in Alluvial
Streams, Monograpsh Denmark Technical University, Hydraulic Lab,
Denmark, 1967.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
return 24./Re + 1.5
[docs]def Clift_Gauvin(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D = \frac{24}{Re}(1 + 0.152Re^{0.677}) + \frac{0.417}
{1 + 5070Re^{-0.94}}
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 2E5
Examples
--------
>>> Clift_Gauvin(200.)
0.7905400398000133
References
----------
.. [1] R. Clift, W.H. Gauvin, The motion of particles in turbulent gas
streams, Proc. Chemeca, 70, 1970, pp. 14-28.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
return 24./Re*(1 + 0.152*Re**0.677) + 0.417/(1 + 5070*Re**-0.94)
[docs]def Morsi_Alexander(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
If Re < 0.1:
.. math::
C_D = \frac{24}{Re}
If 0.1 < Re < 1:
.. math::
C_D = \frac{22.73}{Re}+\frac{0.0903}{Re^2} + 3.69
If 1 < Re < 10:
.. math::
C_D = \frac{29.1667}{Re}-\frac{3.8889}{Re^2} + 1.2220
If 10 < Re < 100:
.. math::
C_D =\frac{46.5}{Re}-\frac{116.67}{Re^2} + 0.6167
If 100 < Re < 1000:
.. math::
C_D = \frac{98.33}{Re}-\frac{2778}{Re^2} + 0.3644
If 1000 < Re < 5000:
.. math::
C_D = \frac{148.62}{Re}-\frac{4.75\times10^4}{Re^2} + 0.3570
If 5000 < Re < 10000:
.. math::
C_D = \frac{-490.5460}{Re}+\frac{57.87\times10^4}{Re^2} + 0.46
If 10000 < Re < 50000:
.. math::
C_D = \frac{-1662.5}{Re}+\frac{5.4167\times10^6}{Re^2} + 0.5191
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 2E5.
Original was reviewed, and confirmed to contain the cited equations.
Examples
--------
>>> Morsi_Alexander(200)
0.7866
References
----------
.. [1] Morsi, S. A., and A. J. Alexander. "An Investigation of Particle
Trajectories in Two-Phase Flow Systems." Journal of Fluid Mechanics
55, no. 02 (September 1972): 193-208. doi:10.1017/S0022112072001806.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
if Re < 0.1:
return 24./Re
elif Re < 1:
return 22.73/Re + 0.0903/Re**2 + 3.69
elif Re < 10:
return 29.1667/Re - 3.8889/Re**2 + 1.222
elif Re < 100:
return 46.5/Re - 116.67/Re**2 + 0.6167
elif Re < 1000:
return 98.33/Re - 2778./Re**2 + 0.3644
elif Re < 5000:
return 148.62/Re - 4.75E4/Re**2 + 0.357
elif Re < 10000:
return -490.546/Re + 57.87E4/Re**2 + 0.46
else:
return -1662.5/Re + 5.4167E6/Re**2 + 0.5191
[docs]def Graf(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D = \frac{24}{Re} + \frac{7.3}{1+Re^{0.5}} + 0.25
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 2E5
Examples
--------
>>> Graf(200.)
0.8520984424785725
References
----------
.. [1] W.H. Graf, Hydraulics of Sediment Transport, Water Resources
Publications, Littleton, Colorado, 1984.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
return 24./Re + 7.3/(1 + sqrt(Re)) + 0.25
[docs]def Flemmer_Banks(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D = \frac{24}{Re}10^E
.. math::
E = 0.383Re^{0.356}-0.207Re^{0.396} - \frac{0.143}{1+(\log_{10} Re)^2}
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 2E5
Examples
--------
>>> Flemmer_Banks(200.)
0.7849169609270039
References
----------
.. [1] Flemmer, R. L. C., and C. L. Banks. "On the Drag Coefficient of a
Sphere." Powder Technology 48, no. 3 (November 1986): 217-21.
doi:10.1016/0032-5910(86)80044-4.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
E = 0.383*Re**0.356 - 0.207*Re**0.396 - 0.143/(1 + (log10(Re))**2)
return 24./Re*10**E
[docs]def Khan_Richardson(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D = (2.49Re^{-0.328} + 0.34Re^{0.067})^{3.18}
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 2E5
Examples
--------
>>> Khan_Richardson(200.)
0.7747572379211097
References
----------
.. [1] Khan, A. R., and J. F. Richardson. "The Resistance to Motion of a
Solid Sphere in a Fluid." Chemical Engineering Communications 62,
no. 1-6 (December 1, 1987): 135-50. doi:10.1080/00986448708912056.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
return (2.49*Re**-0.328 + 0.34*Re**0.067)**3.18
[docs]def Swamee_Ojha(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D = 0.5\left\{16\left[(\frac{24}{Re})^{1.6} + (\frac{130}{Re})^{0.72}
\right]^{2.5}+ \left[\left(\frac{40000}{Re}\right)^2 + 1\right]^{-0.25}
\right\}^{0.25}
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 1.5E5
Examples
--------
>>> Swamee_Ojha(200.)
0.8490012397545713
References
----------
.. [1] Swamee, P. and Ojha, C. (1991). "Drag Coefficient and Fall Velocity
of nonspherical particles." J. Hydraul. Eng., 117(5), 660-667.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
Cd = 0.5*sqrt(sqrt(16*((24./Re)**1.6 + (130./Re)**0.72)**2.5 + 1.0/sqrt(sqrt((40000./Re)**2 + 1))))
return Cd
[docs]def Yen(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D = \frac{24}{Re}\left(1 + 0.15\sqrt{Re} + 0.017Re\right)
- \frac{0.208}{1+10^4Re^{-0.5}}
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 2E5
Examples
--------
>>> Yen(200.)
0.7822647002187014
References
----------
.. [1] B.C. Yen, Sediment Fall Velocity in Oscillating Flow, University of
Virginia, Department of Civil Engineering, 1992.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
return 24./Re*(1 + 0.15*sqrt(Re) + 0.017*Re) - 0.208/(1 + 1E4*1.0/sqrt(Re))
[docs]def Haider_Levenspiel(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D=\frac{24}{Re}(1+0.1806Re^{0.6459})+\left(\frac{0.4251}{1
+\frac{6880.95}{Re}}\right)
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 2E5
An improved version of this correlation is in Brown and Lawler.
Examples
--------
>>> Haider_Levenspiel(200.)
0.7959551680251666
References
----------
.. [1] Haider, A., and O. Levenspiel. "Drag Coefficient and Terminal
Velocity of Spherical and Nonspherical Particles." Powder Technology
58, no. 1 (May 1989): 63-70. doi:10.1016/0032-5910(89)80008-7.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
return 24./Re*(1 + 0.1806*Re**0.6459) + (0.4251/(1 + 6880.95/Re))
[docs]def Cheng(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D=\frac{24}{Re}(1+0.27Re)^{0.43}+0.47[1-\exp(-0.04Re^{0.38})]
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 2E5
Examples
--------
>>> Cheng(200.)
0.7939143028294227
References
----------
.. [1] Cheng, Nian-Sheng. "Comparison of Formulas for Drag Coefficient and
Settling Velocity of Spherical Particles." Powder Technology 189, no. 3
(February 13, 2009): 395-398. doi:10.1016/j.powtec.2008.07.006.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
return 24./Re*(1. + 0.27*Re)**0.43 + 0.47*(1. - exp(-0.04*Re**0.38))
[docs]def Terfous(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D = 2.689 + \frac{21.683}{Re} + \frac{0.131}{Re^2}
- \frac{10.616}{Re^{0.1}} + \frac{12.216}{Re^{0.2}}
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is 0.1 < Re <= 5E4
Examples
--------
>>> Terfous(200.)
0.7814651149769638
References
----------
.. [1] Terfous, A., A. Hazzab, and A. Ghenaim. "Predicting the Drag
Coefficient and Settling Velocity of Spherical Particles." Powder
Technology 239 (May 2013): 12-20. doi:10.1016/j.powtec.2013.01.052.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
return 2.689 + 21.683/Re + 0.131/Re**2 - 10.616/Re**0.1 + 12.216/Re**0.2
[docs]def Mikhailov_Freire(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D = \frac{3808[(1617933/2030) + (178861/1063)Re + (1219/1084)Re^2]}
{681Re[(77531/422) + (13529/976)Re - (1/71154)Re^2]}
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 118300
Examples
--------
>>> Mikhailov_Freire(200.)
0.7514111388018659
References
----------
.. [1] Mikhailov, M. D., and A. P. Silva Freire. "The Drag Coefficient of
a Sphere: An Approximation Using Shanks Transform." Powder Technology
237 (March 2013): 432-35. doi:10.1016/j.powtec.2012.12.033.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
Cd = (3808.*((1617933./2030.) + (178861./1063.)*Re + (1219./1084.)*Re**2)
/(681.*Re*((77531./422.) + (13529./976.)*Re - (1./71154.)*Re**2)))
return Cd
[docs]def Clift(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
If Re < 0.01:
.. math::
C_D = \frac{24}{Re} + \frac{3}{16}
If 0.01 < Re < 20:
.. math::
C_D = \frac{24}{Re}(1 + 0.1315Re^{0.82 - 0.05\log_{10} Re})
If 20 < Re < 260:
.. math::
C_D = \frac{24}{Re}(1 + 0.1935Re^{0.6305})
If 260 < Re < 1500:
.. math::
C_D = 10^{[1.6435 - 1.1242\log_{10} Re + 0.1558[\log_{10} Re]^2}
If 1500 < Re < 12000:
.. math::
C_D = 10^{[-2.4571 + 2.5558\log_{10} Re - 0.9295[\log_{10} Re]^2 + 0.1049[\log_{10} Re]^3}
If 12000 < Re < 44000:
.. math::
C_D = 10^{[-1.9181 + 0.6370\log_{10} Re - 0.0636[\log_{10} Re]^2}
If 44000 < Re < 338000:
.. math::
C_D = 10^{[-4.3390 + 1.5809\log_{10} Re - 0.1546[\log_{10} Re]^2}
If 338000 < Re < 400000:
.. math::
C_D = 29.78 - 5.3\log_{10} Re
If 400000 < Re < 1000000:
.. math::
C_D = 0.19\log_{10} Re - 0.49
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 1E6.
Examples
--------
>>> Clift(200)
0.7756342422322543
References
----------
.. [1] R. Clift, J.R. Grace, M.E. Weber, Bubbles, Drops, and Particles,
Academic, New York, 1978.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
if Re < 0.01:
return 24./Re + 3/16.
elif Re < 20:
return 24./Re*(1 + 0.1315*Re**(0.82 - 0.05*log10(Re)))
elif Re < 260:
return 24./Re*(1 + 0.1935*Re**(0.6305))
elif Re < 1500:
return 10**(1.6435 - 1.1242*log10(Re) + 0.1558*(log10(Re))**2)
elif Re < 12000:
return 10**(-2.4571 + 2.5558*log10(Re) - 0.9295*(log10(Re))**2 + 0.1049*log10(Re)**3)
elif Re < 44000:
return 10**(-1.9181 + 0.6370*log10(Re) - 0.0636*(log10(Re))**2)
elif Re < 338000:
return 10**(-4.3390 + 1.5809*log10(Re) - 0.1546*(log10(Re))**2)
elif Re < 400000:
return 29.78 - 5.3*log10(Re)
else:
return 0.19*log10(Re) - 0.49
[docs]def Ceylan(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D = 1 - 0.5\exp(0.182) + 10.11Re^{-2/3}\exp(0.952Re^{-1/4})
- 0.03859Re^{-4/3}\exp(1.30Re^{-1/2})
+ 0.037\times10^{-4}Re\exp(-0.125\times10^{-4}Re)
-0.116\times10^{-10}Re^2\exp(-0.444\times10^{-5}Re)
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is 0.1 < Re <= 1E6
Original article reviewed.
Examples
--------
>>> Ceylan(200.)
0.7816735980280175
References
----------
.. [1] Ceylan, Kadim, AyÅŸe AltunbaÅŸ, and Gudret Kelbaliyev. "A New Model
for Estimation of Drag Force in the Flow of Newtonian Fluids around
Rigid or Deformable Particles." Powder Technology 119, no. 2-3
(September 24, 2001): 250-56. doi:10.1016/S0032-5910(01)00261-3.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
Cd = (1 - 0.5*exp(0.182) + 10.11*Re**(-2/3.)*exp(0.952/sqrt(sqrt(Re)))
- 0.03859*Re**(-4/3.)*exp(1.30/sqrt(Re)) + 0.037E-4*Re*exp(-0.125E-4*Re)
- 0.116E-10*Re**2*exp(-0.444E-5*Re))
return Cd
[docs]def Almedeij(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D = \left[\frac{1}{(\phi_1 + \phi_2)^{-1} + (\phi_3)^{-1}} + \phi_4\right]^{0.1}
.. math::
\phi_1 = (24Re^{-1})^{10} + (21Re^{-0.67})^{10} + (4Re^{-0.33})^{10} + 0.4^{10}
.. math::
\phi_2 = \left[(0.148Re^{0.11})^{-10} + (0.5)^{-10}\right]^{-1}
.. math::
\phi_3 = (1.57\times10^8Re^{-1.625})^{10}
.. math::
\phi_4 = \left[(6\times10^{-17}Re^{2.63})^{-10} + (0.2)^{-10}\right]^{-1}
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 1E6.
Original work has been reviewed.
Examples
--------
>>> Almedeij(200.)
0.7114768646813396
References
----------
.. [1] Almedeij, Jaber. "Drag Coefficient of Flow around a Sphere: Matching
Asymptotically the Wide Trend." Powder Technology 186, no. 3
(September 10, 2008): 218-23. doi:10.1016/j.powtec.2007.12.006.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
phi4 = ((6E-17*Re**2.63)**-10 + 0.2**-10)**-1
phi3 = (1.57E8*Re**-1.625)**10
phi2 = ((0.148*Re**0.11)**-10 + 0.5**-10)**-1
phi1 = (24*Re**-1)**10 + (21*Re**-0.67)**10 + (4*Re**-0.33)**10 + 0.4**10
return (1/((phi1 + phi2)**-1 + phi3**-1) + phi4)**0.1
[docs]def Morrison(Re):
r'''Calculates drag coefficient of a smooth sphere using the method in
[1]_ as described in [2]_.
.. math::
C_D = \frac{24}{Re} + \frac{2.6Re/5}{1 + \left(\frac{Re}{5}\right)^{1.52}}
+ \frac{0.411 \left(\frac{Re}{263000}\right)^{-7.94}}{1
+ \left(\frac{Re}{263000}\right)^{-8}} + \frac{Re^{0.8}}{461000}
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Notes
-----
Range is Re <= 1E6.
Examples
--------
>>> Morrison(200.)
0.767731559965325
References
----------
.. [1] Morrison, Faith A. An Introduction to Fluid Mechanics.
Cambridge University Press, 2013.
.. [2] Barati, Reza, Seyed Ali Akbar Salehi Neyshabouri, and Goodarz
Ahmadi. "Development of Empirical Models with High Accuracy for
Estimation of Drag Coefficient of Flow around a Smooth Sphere: An
Evolutionary Approach." Powder Technology 257 (May 2014): 11-19.
doi:10.1016/j.powtec.2014.02.045.
'''
Cd = (24./Re + 2.6*Re/5./(1 + (Re/5.)**1.52) + 0.411*(Re/263000.)**-7.94/(1 + (Re/263000.)**-8)
+ Re**0.8/461000.)
return Cd
[docs]def Song_Xu(Re, sphericity=1., S=1.):
r'''Calculates drag coefficient of a particle using the method in
[1]_. Developed with data for spheres, cubes, and cylinders. Claims 3.52%
relative error for 0.001 < Re < 100 based on 336 tests data.
.. math::
C_d = \frac{24}{Re\phi^{0.65}S^{0.3}}\left(1 + 0.35Re\right)^{0.44}
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
sphericity : float, optional
Sphericity of the particle
S : float, optional
Ratio of equivalent sphere area and the projected area in the particle
settling direction [-]
Returns
-------
Cd : float
Drag coefficient of particle [-]
Notes
-----
Notable as its experimental data and analysis is included in their
supporting material.
Examples
--------
>>> Song_Xu(30.)
2.3431335190092444
References
----------
.. [1] Song, Xianzhi, Zhengming Xu, Gensheng Li, Zhaoyu Pang, and Zhaopeng
Zhu. "A New Model for Predicting Drag Coefficient and Settling Velocity
of Spherical and Non-Spherical Particle in Newtonian Fluid." Powder
Technology 321 (November 2017): 242-50.
doi:10.1016/j.powtec.2017.08.017.
'''
return 24/(Re*sphericity**0.65*S**0.3)*(1+0.35*Re)**0.44
drag_sphere_correlations = {
'Stokes': (Stokes, None, 0.3),
'Barati': (Barati, None, 2E5),
'Barati_high': (Barati_high, None, 1E6),
'Rouse': (Rouse, None, 2E5),
'Engelund_Hansen': (Engelund_Hansen, None, 2E5),
'Clift_Gauvin': (Clift_Gauvin, None, 2E5),
'Morsi_Alexander': (Morsi_Alexander, None, 2E5),
'Graf': (Graf, None, 2E5),
'Flemmer_Banks': (Flemmer_Banks, None, 2E5),
'Khan_Richardson': (Khan_Richardson, None, 2E5),
'Swamee_Ojha': (Swamee_Ojha, None, 1.5E5),
'Yen': (Yen, None, 2E5),
'Haider_Levenspiel': (Haider_Levenspiel, None, 2E5),
'Cheng': (Cheng, None, 2E5),
'Terfous': (Terfous, 0.1, 5E4),
'Mikhailov_Freire': (Mikhailov_Freire, None, 118300),
'Clift': (Clift, None, 1E6),
'Ceylan': (Ceylan, 0.1, 1E6),
'Almedeij': (Almedeij, None, 1E6),
'Morrison': (Morrison, None, 1E6),
'Song_Xu': (Song_Xu, None, 1E3)
}
[docs]def drag_sphere_methods(Re, check_ranges=True):
r'''This function returns a list of methods that can be used to calculate
the drag coefficient of a sphere.
Twenty one methods are available, all requiring only the Reynolds number of
the sphere. Most methods are valid from Re=0 to Re=200,000.
Examples
--------
>>> len(drag_sphere_methods(200))
20
>>> len(drag_sphere_methods(200000, check_ranges=False))
21
>>> len(drag_sphere_methods(200000, check_ranges=True))
5
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
check_ranges : bool, optional
Whether to return only correlations claiming to be valid for the given
`Re` or not, [-]
Returns
-------
methods : list, only returned if AvailableMethods == True
List of methods which can be used to calculate `Cd` with the given `Re`
'''
methods = []
for key, (func, Re_min, Re_max) in drag_sphere_correlations.items():
if ((Re_min is None or Re > Re_min) and (Re_max is None or Re < Re_max)) or not check_ranges:
methods.append(key)
return methods
[docs]def drag_sphere(Re, Method=None):
r'''This function handles calculation of drag coefficient on spheres.
Twenty methods are available, all requiring only the Reynolds number of the
sphere. Most methods are valid from Re=0 to Re=200,000. A correlation will
be automatically selected if none is specified.
If no correlation is selected, the following rules are used:
* If Re < 0.01, use Stoke's solution.
* If 0.01 <= Re < 0.1, linearly combine 'Barati' with Stokes's solution
such that at Re = 0.1 the solution is 'Barati', and at Re = 0.01 the
solution is 'Stokes'.
* If 0.1 <= Re <= ~212963, use the 'Barati' solution.
* If ~212963 < Re <= 1E6, use the 'Barati_high' solution.
* For Re > 1E6, raises an exception; no valid results have been found.
Examples
--------
>>> drag_sphere(200)
0.7682237950389874
Parameters
----------
Re : float
Particle Reynolds number of the sphere using the surrounding fluid
density and viscosity, [-]
Returns
-------
Cd : float
Drag coefficient [-]
Other Parameters
----------------
Method : string, optional
A string of the function name to use, as in the dictionary
drag_sphere_correlations
'''
if Method is None:
if Re > 0.1:
# Smooth transition point between the two models
if Re <= 212963.26847812787:
return Barati(Re)
elif Re <= 1E6:
return Barati_high(Re)
else:
raise ValueError('No models implement a solution for Re > 1E6')
elif Re >= 0.01:
# Re from 0.01 to 0.1
ratio = (Re - 0.01)/(0.1 - 0.01)
# Ensure a smooth transition by linearly switching to Stokes' law
return ratio*Barati(Re) + (1-ratio)*Stokes(Re)
else:
return Stokes(Re)
if Method == "Stokes":
return Stokes(Re)
elif Method == "Barati":
return Barati(Re)
elif Method == "Barati_high":
return Barati_high(Re)
elif Method == "Rouse":
return Rouse(Re)
elif Method == "Engelund_Hansen":
return Engelund_Hansen(Re)
elif Method == "Clift_Gauvin":
return Clift_Gauvin(Re)
elif Method == "Morsi_Alexander":
return Morsi_Alexander(Re)
elif Method == "Graf":
return Graf(Re)
elif Method == "Flemmer_Banks":
return Flemmer_Banks(Re)
elif Method == "Khan_Richardson":
return Khan_Richardson(Re)
elif Method == "Swamee_Ojha":
return Swamee_Ojha(Re)
elif Method == "Yen":
return Yen(Re)
elif Method == "Haider_Levenspiel":
return Haider_Levenspiel(Re)
elif Method == "Cheng":
return Cheng(Re)
elif Method == "Terfous":
return Terfous(Re)
elif Method == "Mikhailov_Freire":
return Mikhailov_Freire(Re)
elif Method == "Clift":
return Clift(Re)
elif Method == "Ceylan":
return Ceylan(Re)
elif Method == "Almedeij":
return Almedeij(Re)
elif Method == "Morrison":
return Morrison(Re)
elif Method == "Song_Xu":
return Song_Xu(Re)
else:
raise ValueError('Unrecognized method')
def _v_terminal_err(V, Method, Re_almost, main):
Cd = drag_sphere(Re_almost*V, Method=Method)
return V - sqrt(main/Cd)
[docs]def v_terminal(D, rhop, rho, mu, Method=None):
r'''Calculates terminal velocity of a falling sphere using any drag
coefficient method supported by `drag_sphere`. The laminar solution for
Re < 0.01 is first tried; if the resulting terminal velocity does not
put it in the laminar regime, a numerical solution is used.
.. math::
v_t = \sqrt{\frac{4 g d_p (\rho_p-\rho_f)}{3 C_D \rho_f }}
Parameters
----------
D : float
Diameter of the sphere, [m]
rhop : float
Particle density, [kg/m^3]
rho : float
Density of the surrounding fluid, [kg/m^3]
mu : float
Viscosity of the surrounding fluid [Pa*s]
Method : string, optional
A string of the function name to use, as in the dictionary
drag_sphere_correlations
Returns
-------
v_t : float
Terminal velocity of falling sphere [m/s]
Notes
-----
As there are no correlations implemented for Re > 1E6, an error will be
raised if the numerical solver seeks a solution above that limit.
The laminar solution is given in [1]_ and is:
.. math::
v_t = \frac{g d_p^2 (\rho_p - \rho_f)}{18 \mu_f}
Examples
--------
>>> v_terminal(D=70E-6, rhop=2600., rho=1000., mu=1E-3)
0.004142497244531304
Example 7-1 in GPSA handbook, 13th edition:
>>> from scipy.constants import *
>>> v_terminal(D=150E-6, rhop=31.2*lb/foot**3, rho=2.07*lb/foot**3, mu=1.2e-05)/foot
0.4491992020345101
The answer reported there is 0.46 ft/sec.
References
----------
.. [1] Green, Don, and Robert Perry. Perry's Chemical Engineers' Handbook,
Eighth Edition. McGraw-Hill Professional, 2007.
.. [2] Rushton, Albert, Anthony S. Ward, and Richard G. Holdich.
Solid-Liquid Filtration and Separation Technology. 1st edition. Weinheim ;
New York: Wiley-VCH, 1996.
'''
"""The following would be the ideal implementation. The actual function is
optimized for speed, not readability
def err(V):
Re = rho*V*D/mu
Cd = Barati_high(Re)
V2 = (4/3.*g*D*(rhop-rho)/rho/Cd)**0.5
return (V-V2)
return fsolve(err, 1.)"""
v_lam = g*D*D*(rhop-rho)/(18*mu)
Re_lam = Reynolds(V=v_lam, D=D, rho=rho, mu=mu)
if Re_lam < 0.01 or Method == 'Stokes':
return v_lam
Re_almost = rho*D/mu
main = 4/3.*g*D*(rhop-rho)/rho
V_max = 1E6/rho/D*mu # where the correlation breaks down, Re=1E6
# Begin the solver with 1/100 th the velocity possible at the maximum
# Reynolds number the correlation is good for
return secant(_v_terminal_err, V_max*1e-2, xtol=1E-12, args=(Method, Re_almost, main))
[docs]def time_v_terminal_Stokes(D, rhop, rho, mu, V0, tol=1e-14):
r'''Calculates the time required for a particle in Stoke's regime only to
reach terminal velocity (approximately). An infinitely long period is
required theoretically, but with floating points, it is possible to
calculate the time required to come within a specified `tol` of that
terminal velocity.
.. math::
t_{term} = -\frac{1}{18\mu}\ln \left(\frac{D^2g\rho - D^2 g \rho_p
+ 18\mu V_{term}}{D^2g\rho - D^2 g \rho_p + 18\mu V_0 } \right) D^2
\rho_p
Parameters
----------
D : float
Diameter of the sphere, [m]
rhop : float
Particle density, [kg/m^3]
rho : float
Density of the surrounding fluid, [kg/m^3]
mu : float
Viscosity of the surrounding fluid [Pa*s]
V0 : float
Initial velocity of the particle, [m/s]
tol : float, optional
How closely to approach the terminal velocity - the target velocity is
the terminal velocity multiplied by 1 (+/-) this, depending on if the
particle is accelerating or decelerating, [-]
Returns
-------
t : float
Time for the particle to reach the terminal velocity to within the
specified or an achievable tolerance, [s]
Notes
-----
The symbolic solution was obtained via Wolfram Alpha.
If a solution cannot be obtained due to floating point error at very high
tolerance, an exception is raised - but first, the tolerance is doubled,
up to fifty times in an attempt to obtain the highest possible precision
while sill giving an answer. If at any point the tolerance is larger than
1%, an exception is also raised.
Examples
--------
>>> time_v_terminal_Stokes(D=1e-7, rhop=2200., rho=1.2, mu=1.78E-5, V0=1)
3.1880031137871528e-06
>>> time_v_terminal_Stokes(D=1e-2, rhop=2200., rho=1.2, mu=1.78E-5, V0=1,
... tol=1e-30)
24800.636391801996
'''
if tol < 1e-17:
tol = 2e-17
term = D*D*g*rho - D*D*g*rhop
denominator = term + 18.*mu*V0
v_term_base = g*D*D*(rhop-rho)/(18.*mu)
const = D*D*rhop/mu*-1.0/18.
for i in range(50):
try:
if v_term_base < V0:
v_term = v_term_base*(1.0 + tol)
else:
v_term = v_term_base*(1.0 - tol)
numerator = term + 18.*mu*v_term
return log(numerator/denominator)*const
except:
tol = tol + tol
if tol > 0.01:
raise ValueError('Could not find a solution')
raise ValueError('Could not find a solution')
[docs]def integrate_drag_sphere(D, rhop, rho, mu, t, V=0, Method=None,
distance=False):
r'''Integrates the velocity and distance traveled by a particle moving
at a speed which will converge to its terminal velocity.
Performs an integration of the following expression for acceleration:
.. math::
a = \frac{g(\rho_p-\rho_f)}{\rho_p} - \frac{3C_D \rho_f u^2}{4D \rho_p}
Parameters
----------
D : float
Diameter of the sphere, [m]
rhop : float
Particle density, [kg/m^3]
rho : float
Density of the surrounding fluid, [kg/m^3]
mu : float
Viscosity of the surrounding fluid [Pa*s]
t : float
Time to integrate the particle to, [s]
V : float
Initial velocity of the particle, [m/s]
Method : string, optional
A string of the function name to use, as in the dictionary
drag_sphere_correlations
distance : bool, optional
Whether or not to calculate the distance traveled and return it as
well
Returns
-------
v : float
Velocity of falling sphere after time `t` [m/s]
x : float, returned only if `distance` == True
Distance traveled by the falling sphere in time `t`, [m]
Notes
-----
This can be relatively slow as drag correlations can be complex.
There are analytical solutions available for the Stokes law regime (Re <
0.3). They were obtained from Wolfram Alpha. [1]_ was not used in the
derivation, but also describes the derivation fully.
.. math::
V(t) = \frac{\exp(-at) (V_0 a + b(\exp(at) - 1))}{a}
.. math::
x(t) = \frac{\exp(-a t)\left[V_0 a(\exp(a t) - 1) + b\exp(a t)(a t-1)
+ b\right]}{a^2}
.. math::
a = \frac{18\mu_f}{D^2\rho_p}
.. math::
b = \frac{g(\rho_p-\rho_f)}{\rho_p}
The analytical solution will automatically be used if the initial and
terminal velocity is show the particle's behavior to be laminar. Note
that this behavior requires that the terminal velocity of the particle be
solved for - this adds slight (1%) overhead for the cases where particles
are not laminar.
Examples
--------
>>> integrate_drag_sphere(D=0.001, rhop=2200., rho=1.2, mu=1.78E-5, t=0.5,
... V=30, distance=True)
(9.68646, 7.82945)
References
----------
.. [1] Timmerman, Peter, and Jacobus P. van der Weele. "On the Rise and
Fall of a Ball with Linear or Quadratic Drag." American Journal of
Physics 67, no. 6 (June 1999): 538-46. https://doi.org/10.1119/1.19320.
'''
# Delayed import of necessaray functions
import numpy as np
from scipy.integrate import cumtrapz, odeint
laminar_initial = Reynolds(V=V, rho=rho, D=D, mu=mu) < 0.01
v_laminar_end_assumed = v_terminal(D=D, rhop=rhop, rho=rho, mu=mu, Method=Method)
laminar_end = Reynolds(V=v_laminar_end_assumed, rho=rho, D=D, mu=mu) < 0.01
if Method == 'Stokes' or (laminar_initial and laminar_end and Method is None):
try:
t1 = 18.0*mu/(D*D*rhop)
t2 = g*(rhop-rho)/rhop
V_end = exp(-t1*t)*(t1*V + t2*(exp(t1*t) - 1.0))/t1
x_end = exp(-t1*t)*(V*t1*(exp(t1*t) - 1.0) + t2*exp(t1*t)*(t1*t - 1.0) + t2)/(t1*t1)
if distance:
return V_end, x_end
else:
return V_end
except OverflowError:
# It is only necessary to integrate to terminal velocity
t_to_terminal = time_v_terminal_Stokes(D, rhop, rho, mu, V0=V, tol=1e-9)
if t_to_terminal > t:
raise ValueError('Should never happen')
V_end, x_end = integrate_drag_sphere(D=D, rhop=rhop, rho=rho, mu=mu, t=t_to_terminal, V=V, Method='Stokes', distance=True)
# terminal velocity has been reached - V does not change, but x does
# No reason to believe this isn't working even though it isn't
# matching the ode solver
if distance:
return V_end, x_end + V_end*(t - t_to_terminal)
else:
return V_end
# This is a serious problem for small diameters
# It would be possible to step slowly, using smaller increments
# of time to avlid overflows. However, this unfortunately quickly
# gets much, exponentially, slower than just using odeint because
# for example solving 10000 seconds might require steps of .0001
# seconds at a diameter of 1e-7 meters.
# x = 0.0
# subdivisions = 10
# dt = t/subdivisions
# for i in range(subdivisions):
# V, dx = integrate_drag_sphere(D=D, rhop=rhop, rho=rho, mu=mu,
# t=dt, V=V, distance=True,
# Method=Method)
# x += dx
# if distance:
# return V, x
# else:
# return V
Re_ish = rho*D/mu
c1 = g*(rhop-rho)/rhop
c2 = -0.75*rho/(D*rhop)
def dv_dt(V, t):
if V == 0:
# 64/Re goes to infinity, but gets multiplied by 0 squared.
t2 = 0.0
else:
# t2 = c2*V*V*Stokes(Re_ish*V)
t2 = c2*V*V*drag_sphere(float(Re_ish*V), Method=Method)
return c1 + t2
# Number of intervals for the solution to be solved for; the integrator
# doesn't care what we give it, but a large number of intervals are needed
# For an accurate integration of the particle's distance traveled
pts = 1000 if distance else 2
ts = np.linspace(0, t, pts)
# Perform the integration
Vs = odeint(dv_dt, [V], ts)
#
V_end = float(Vs[-1])
if distance:
# Calculate the distance traveled
x = float(cumtrapz(np.ravel(Vs), ts)[-1])
return V_end, x
else:
return V_end