From ec1958faa703297c7c4391bf8c54f67bf61e6567 Mon Sep 17 00:00:00 2001 From: Christian Haack Date: Fri, 24 Jan 2025 12:15:01 +0100 Subject: [PATCH] add dispersion and scattering model functions; rename TwoComponentScatteringModel to TwoComponentScatteringFunction --- src/CherenkovMediumBase.jl | 34 ++++++++++++++++++++++++++++++---- src/scattering.jl | 18 ++++++++++++------ 2 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/CherenkovMediumBase.jl b/src/CherenkovMediumBase.jl index b9aefaa..3bde628 100644 --- a/src/CherenkovMediumBase.jl +++ b/src/CherenkovMediumBase.jl @@ -14,6 +14,19 @@ abstract type MediumProperties end _not_implemented(type) = error("Not implemented for type $(typeof(type))") +""" + get_dispersion_model(medium::MediumProperties) +Return the dispersion model for a given medium. +""" +get_dispersion_model(medium::MediumProperties) = _not_implemented(medium) + + +""" + get_scattering_model(medium::MediumProperties) +Return the scattering model for a given medium. +""" +get_scattering_model(medium::MediumProperties) = _not_implemented(medium) + """ pressure(medium::MediumProperties) @@ -47,7 +60,11 @@ radiation_length(medium::MediumProperties) = _not_implemented(medium) Return a scattering angle sampled from the scattering function of the medium. """ -sample_scattering_function(medium::MediumProperties) = _not_implemented(medium) +function sample_scattering_function(medium::MediumProperties) + model = scattering_model(medium) + + +end """ scattering_length(medium::MediumProperties, wavelength) @@ -55,7 +72,10 @@ sample_scattering_function(medium::MediumProperties) = _not_implemented(medium) Return scattering length at `wavelength` in units m. `wavelength` is expected to be in units nm. Returned length is in units m. """ -scattering_length(medium::MediumProperties, wavelength) = _not_implemented(medium) +function scattering_length(medium::MediumProperties, wavelength) + model = get_scattering_model(medium) + return scattering_length(model, wavelength) +end """ absorption_length(medium::MediumProperties, wavelength) @@ -71,7 +91,10 @@ absorption_length(medium::MediumProperties, wavelength) = _not_implemented(mediu Return the phase refractive index at `wavelength`. `wavelength` is expected to be in units nm. """ -phase_refractive_index(medium::MediumProperties, wavelength) = _not_implemented(medium) +function phase_refractive_index(medium::MediumProperties, wavelength) + model =get_dispersion_model(medium) + return phase_refractive_index(model, wavelength) +end """ dispersion(medium::MediumProperties, wavelength) @@ -79,7 +102,10 @@ phase_refractive_index(medium::MediumProperties, wavelength) = _not_implemented( Return the dispersion dn/dλ at `wavelength` in units 1/nm. `wavelength` is expected to be in units nm. """ -dispersion(medium::MediumProperties, wavelength) = _not_implemented(medium) +function dispersion(medium::MediumProperties, wavelength) + model = get_dispersion_model(medium) + return dispersion(model, wavelength) +end """ cherenkov_angle(medium, wavelength) diff --git a/src/scattering.jl b/src/scattering.jl index d6aaa5b..bd38f0f 100644 --- a/src/scattering.jl +++ b/src/scattering.jl @@ -9,7 +9,7 @@ export HenyeyGreenStein export PolynomialScatteringFunction export EinsteinSmoluchowsky export SimplifiedLiu -export TwoComponentScatteringModel +export TwoComponentScatteringFunction export MixedHGES export MixedHGSL @@ -136,22 +136,22 @@ function EinsteinSmoluchowsky(b::T) where {T} end """ - TwoComponentScatteringModel{F1<:AbstractScatteringFunction, F2<:AbstractScatteringFunction} + TwoComponentScatteringFunction{F1<:AbstractScatteringFunction, F2<:AbstractScatteringFunction} Struct for two-component scattering model. """ -struct TwoComponentScatteringModel{F1<:AbstractScatteringFunction, F2<:AbstractScatteringFunction} <: AbstractScatteringFunction +struct TwoComponentScatteringFunction{F1<:AbstractScatteringFunction, F2<:AbstractScatteringFunction} <: AbstractScatteringFunction f1::F1 f2::F2 fraction::Real end -MixedHGES(g, b, fraction) = TwoComponentScatteringModel(HenyeyGreenStein(g), EinsteinSmoluchowsky(b), fraction) -MixedHGSL(g, fraction) = TwoComponentScatteringModel(HenyeyGreenStein(g), SimplifiedLiu(g), fraction) +MixedHGES(g, b, fraction) = TwoComponentScatteringFunction(HenyeyGreenStein(g), EinsteinSmoluchowsky(b), fraction) +MixedHGSL(g, fraction) = TwoComponentScatteringFunction(HenyeyGreenStein(g), SimplifiedLiu(g), fraction) -function Base.rand(rng::AbstractRNG, s::TwoComponentScatteringModel) +function Base.rand(rng::AbstractRNG, s::TwoComponentScatteringFunction) choice = Base.rand(rng, Float64) if choice < s.fraction return Base.rand(rng, s.f1) @@ -189,6 +189,12 @@ end abstract type AbstractScatteringModel end scattering_length(model::AbstractScatteringModel, wavelength::Real) = _not_implemented(model) +get_scattering_function(model::AbstractScatteringModel) = _not_implemented(model) + +function sample_scattering_function(model::AbstractScatteringModel) + func = get_scattering_function(model) + return rand(func) +end """ KopelevichScatteringModel{F<:AbstractScatteringFunction, T}