Skip to content

Commit ec1958f

Browse files
author
Christian Haack
committed
add dispersion and scattering model functions; rename TwoComponentScatteringModel to TwoComponentScatteringFunction
1 parent 55fecb6 commit ec1958f

File tree

2 files changed

+42
-10
lines changed

2 files changed

+42
-10
lines changed

src/CherenkovMediumBase.jl

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,19 @@ abstract type MediumProperties end
1414

1515
_not_implemented(type) = error("Not implemented for type $(typeof(type))")
1616

17+
"""
18+
get_dispersion_model(medium::MediumProperties)
19+
Return the dispersion model for a given medium.
20+
"""
21+
get_dispersion_model(medium::MediumProperties) = _not_implemented(medium)
22+
23+
24+
"""
25+
get_scattering_model(medium::MediumProperties)
26+
Return the scattering model for a given medium.
27+
"""
28+
get_scattering_model(medium::MediumProperties) = _not_implemented(medium)
29+
1730
"""
1831
pressure(medium::MediumProperties)
1932
@@ -47,15 +60,22 @@ radiation_length(medium::MediumProperties) = _not_implemented(medium)
4760
4861
Return a scattering angle sampled from the scattering function of the medium.
4962
"""
50-
sample_scattering_function(medium::MediumProperties) = _not_implemented(medium)
63+
function sample_scattering_function(medium::MediumProperties)
64+
model = scattering_model(medium)
65+
66+
67+
end
5168

5269
"""
5370
scattering_length(medium::MediumProperties, wavelength)
5471
5572
Return scattering length at `wavelength` in units m.
5673
`wavelength` is expected to be in units nm. Returned length is in units m.
5774
"""
58-
scattering_length(medium::MediumProperties, wavelength) = _not_implemented(medium)
75+
function scattering_length(medium::MediumProperties, wavelength)
76+
model = get_scattering_model(medium)
77+
return scattering_length(model, wavelength)
78+
end
5979

6080
"""
6181
absorption_length(medium::MediumProperties, wavelength)
@@ -71,15 +91,21 @@ absorption_length(medium::MediumProperties, wavelength) = _not_implemented(mediu
7191
Return the phase refractive index at `wavelength`.
7292
`wavelength` is expected to be in units nm.
7393
"""
74-
phase_refractive_index(medium::MediumProperties, wavelength) = _not_implemented(medium)
94+
function phase_refractive_index(medium::MediumProperties, wavelength)
95+
model =get_dispersion_model(medium)
96+
return phase_refractive_index(model, wavelength)
97+
end
7598

7699
"""
77100
dispersion(medium::MediumProperties, wavelength)
78101
79102
Return the dispersion dn/dλ at `wavelength` in units 1/nm.
80103
`wavelength` is expected to be in units nm.
81104
"""
82-
dispersion(medium::MediumProperties, wavelength) = _not_implemented(medium)
105+
function dispersion(medium::MediumProperties, wavelength)
106+
model = get_dispersion_model(medium)
107+
return dispersion(model, wavelength)
108+
end
83109

84110
"""
85111
cherenkov_angle(medium, wavelength)

src/scattering.jl

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export HenyeyGreenStein
99
export PolynomialScatteringFunction
1010
export EinsteinSmoluchowsky
1111
export SimplifiedLiu
12-
export TwoComponentScatteringModel
12+
export TwoComponentScatteringFunction
1313
export MixedHGES
1414
export MixedHGSL
1515

@@ -136,22 +136,22 @@ function EinsteinSmoluchowsky(b::T) where {T}
136136
end
137137

138138
"""
139-
TwoComponentScatteringModel{F1<:AbstractScatteringFunction, F2<:AbstractScatteringFunction}
139+
TwoComponentScatteringFunction{F1<:AbstractScatteringFunction, F2<:AbstractScatteringFunction}
140140
141141
Struct for two-component scattering model.
142142
"""
143-
struct TwoComponentScatteringModel{F1<:AbstractScatteringFunction, F2<:AbstractScatteringFunction} <: AbstractScatteringFunction
143+
struct TwoComponentScatteringFunction{F1<:AbstractScatteringFunction, F2<:AbstractScatteringFunction} <: AbstractScatteringFunction
144144
f1::F1
145145
f2::F2
146146
fraction::Real
147147
end
148148

149149

150-
MixedHGES(g, b, fraction) = TwoComponentScatteringModel(HenyeyGreenStein(g), EinsteinSmoluchowsky(b), fraction)
151-
MixedHGSL(g, fraction) = TwoComponentScatteringModel(HenyeyGreenStein(g), SimplifiedLiu(g), fraction)
150+
MixedHGES(g, b, fraction) = TwoComponentScatteringFunction(HenyeyGreenStein(g), EinsteinSmoluchowsky(b), fraction)
151+
MixedHGSL(g, fraction) = TwoComponentScatteringFunction(HenyeyGreenStein(g), SimplifiedLiu(g), fraction)
152152

153153

154-
function Base.rand(rng::AbstractRNG, s::TwoComponentScatteringModel)
154+
function Base.rand(rng::AbstractRNG, s::TwoComponentScatteringFunction)
155155
choice = Base.rand(rng, Float64)
156156
if choice < s.fraction
157157
return Base.rand(rng, s.f1)
@@ -189,6 +189,12 @@ end
189189

190190
abstract type AbstractScatteringModel end
191191
scattering_length(model::AbstractScatteringModel, wavelength::Real) = _not_implemented(model)
192+
get_scattering_function(model::AbstractScatteringModel) = _not_implemented(model)
193+
194+
function sample_scattering_function(model::AbstractScatteringModel)
195+
func = get_scattering_function(model)
196+
return rand(func)
197+
end
192198

193199
"""
194200
KopelevichScatteringModel{F<:AbstractScatteringFunction, T}

0 commit comments

Comments
 (0)