Drummers
Kramers equation
Kramers equation [6] describes the slope of bed height $h$ over rotary kiln axis $z$, with discharge being given at $z=0$ where initial condition of granule size is expected to be provided. It accounts for rotation speed $\omega$, volumetric flow rate $\Phi_v$, kiln inclination angle $\alpha$, kiln internal radius $R$, and solids dynamic repose angle $\beta$. In Auchimiste
its implementation is done by DrumMediumKramersChunk
and is decomposed as provided in the following equation:
\[\begin{align*} \frac{dh}{dz} &= A\left(2r-r^2\right)^{-\frac{3}{2}} - B \\[6pt] % A &= \frac{3}{4}\frac{\Phi_{v}\tan{\beta}}{\omega\pi{}R^3} \\[6pt] % B &= \frac{\tan{\alpha}}{\cos{\beta}} \\[6pt] % r &= \frac{h}{R} \end{align*}\]
Because thermal effects may impact solids dynamic repose angle $\beta$, it can be provided as a function of coordinate $z$ (it is expected the user has solved the thermal model elsewhere and solution can be retrieved in terms of this coordinate); the same applies to volumetric flow $\Phi_v$. For modeling transitions of radius, $R$ is also to be provided as a function of $z$, but that must be done with care to provide a suitable discretization that is compatible with the provided transitions.
AuChimiste.DrumMediumKramersChunk
— TypeDrumMediumKramersChunk(; kwargs...)
Represents a chunk of a rotary drum bed model with Kramers equation.
Fields
model::ModelingToolkit.ODESystem
: Instance of ODE system to be solved.
Raw results of Kramers equation [6] integration are rarely useful without further processing. To this end a post-processing type DrumMediumKramersSolution
is provided, putting together most quantities of practical use those required to provide the geometry of a bed inside a kiln for process simulation.
The bed view angle $\theta$ from kiln axis is computed as
\[\theta = 2\cos^{-1}\left(1 - \dfrac{h}{R}\right)\]
With its value at hand one can compute the local bed chord length $l_{c}$
\[l_{c} = 2R\sin\left(\dfrac{\theta}{2}\right)\]
From geometric consideration one shows that bed cross-section area $A_{b}$ is
\[A_{s} = \dfrac{\theta R^2 - l_{c}(R - h)}{2}\]
Local fractional loading $\eta$ can be demonstrated to be
\[\eta = \dfrac{\theta - \sin(\theta)}{2\pi}\]
Mean loading $\Eta$ is simply an application of the fundamental theorem of Calculus for $\eta$ over kiln length $L$
\[\Eta = \dfrac{1}{L}\displaystyle\int_{0}^{L}\eta {}dz\]
Since the model does not assume conservation of $\Phi_{v}$, residence time $\tau$ needs to be evaluated from local mean drift-velocity $v_{d}$; it is trivial to show that in interval $z\in[z_1;z_2]$ the residence is given as
\[\tau = \displaystyle\int_{z_1}^{z_2}\dfrac{dz}{v_{d}} \quad\text{where}\quad v_{d} = \dfrac{A_{b}}{\Phi_{v}}\]
AuChimiste.DrumMediumKramersSolution
— TypeGeometric description of a rotary drum bed from Kramers equation solution.
Fields
z::Vector{Float64}
: Solution coordinates [m]h::Vector{Float64}
: Solution bed height [m]R::Vector{Float64}
: Internal drum radius [m]β::Vector{Float64}
: Local dynamic repose angle [rad]ϕ::Vector{Float64}
: Local volume flow rate [m³/s]θ::Vector{Float64}
: View angle from drum center [rad]l::Vector{Float64}
: Bed-freeboard cord length [m]A::Vector{Float64}
: Local bed cross section area [m²]η::Vector{Float64}
: Local loading based on height [-]τ::Vector{Float64}
: Cumulative residence time of [s]Η::Float64
: Mean loading of kiln [%]
Integration of the model can be done directly with Common.solve
interface for single chunks (kilns without user-defined discretization) or with solve_kramers_stack
.
AuChimiste.solve_kramers_stack
— Functionsolve_kramers_stack(; kwargs...)
Solves a rotary drum bed model with Kramers equation in a stack of chunks. The minimum set of parameters are the following:
grid
: grid of coordinates given in meters; this must include both the start and end points of the drum bed.radius
: radius of the drum in meters as a function of the coordinatez
; no checks are performed with respect to grid consistency.beta
: local dynamic repose angle in radians as a function of the coordinatez
; this is expected to handle the effects of temperaraure and moisture as treated by an external model.phiv
: volumetric flow rate in cubic meters per second as a function of the coordinatez
; this is expected to handle the effects of temperature and moisture as treated by an external model.h
: initial bed height in meters at discharge positionz=0
.ω̇
: angular velocity of the drum in radians per second.α
: drum inclination angle in radians.
Keyword arguments are provided to Common.solve
implementation for the solution of DrumMediumKramersChunk
.
CommonSolve.solve
— MethodCommonSolve.solve(chunk::DrumMediumKramersChunk; kwargs...)
Provide the integration of DrumMediumKramersChunk
by creating a problem (ODEProblem
) and the base Common.solve
implementation. The keyword arguments must include:
zspan: a tuple indicating the initial and final coordinates in meters of the interval of integration for the present drum chunk.
h: initial (discharge) bed height in meters. If the discharge end is held by a dam, its height plus the particle size must be provided instead of the particle size, as it is used as the ODE initial condition.
ω̇: drum rotation rate in revolutions per second.
α: drum inclination angle in radians.
solver: solver to be used, defaults to
Tsit5()
.
Other arguments provided to Common.solve
interface for ODEProblem
are passed directly to the solver without any check.