Skip to content

Commit c44e498

Browse files
authored
Add contractor method and scale function to BouleImpurityDensity (#484)
* add BouleImpurityDensity constructors and scaling functions * add (*) for all impurity densities
1 parent 062a02d commit c44e498

File tree

9 files changed

+50
-6
lines changed

9 files changed

+50
-6
lines changed

src/ImpurityDensities/BouleImpurityDensities/LinBouleImpurityDensity.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ struct LinBouleImpurityDensity{T <: SSDFloat} <: AbstractImpurityDensity{T}
1616
det_z0::T
1717
end
1818

19+
function LinBouleImpurityDensity{T}(pars::Vector{<:Number}, det_z0::Number) where {T}
20+
LinBouleImpurityDensity{T}(
21+
T.(to_internal_units(pars))...,
22+
T(to_internal_units(det_z0))
23+
)
24+
end
25+
1926
function ImpurityDensity(T::DataType, t::Val{:linear_boule}, dict::AbstractDict, input_units::NamedTuple)
2027
a::T = haskey(dict, "a") ? _parse_value(T, dict["a"], input_units.length^(-3)) : T(0)
2128
b::T = haskey(dict, "b") ? _parse_value(T, dict["b"], input_units.length^(-4)) : T(0)
@@ -27,4 +34,6 @@ function get_impurity_density(idm::LinBouleImpurityDensity, pt::AbstractCoordina
2734
cpt = CartesianPoint(pt)
2835
z = cpt[3]
2936
idm.a + idm.b * (idm.det_z0 - z)
30-
end
37+
end
38+
39+
(*)(scale::Real, idm::LinBouleImpurityDensity{T}) where {T} = LinBouleImpurityDensity{T}(T(scale*idm.a), T(scale*idm.b), idm.det_z0)

src/ImpurityDensities/BouleImpurityDensities/LinExpBouleImpurityDensity.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ struct LinExpBouleImpurityDensity{T <: SSDFloat} <: AbstractImpurityDensity{T}
2222
det_z0::T
2323
end
2424

25+
function LinExpBouleImpurityDensity{T}(pars::Vector{<:Number}, det_z0::Number) where {T}
26+
LinExpBouleImpurityDensity{T}(
27+
T.(to_internal_units(pars))...,
28+
T(to_internal_units(det_z0))
29+
)
30+
end
31+
2532
function ImpurityDensity(T::DataType, t::Val{:linear_exponential_boule}, dict::AbstractDict, input_units::NamedTuple)
2633
a::T = haskey(dict, "a") ? _parse_value(T, dict["a"], input_units.length^(-3)) : T(0)
2734
b::T = haskey(dict, "b") ? _parse_value(T, dict["b"], input_units.length^(-4)) : T(0)
@@ -36,4 +43,6 @@ function get_impurity_density(idm::LinExpBouleImpurityDensity, pt::AbstractCoord
3643
cpt = CartesianPoint(pt)
3744
z = cpt[3]
3845
idm.a + idm.b * (idm.det_z0 - z) + idm.n * exp((idm.det_z0 - z - idm.l)/idm.m)
39-
end
46+
end
47+
48+
(*)(scale::Real, idm::LinExpBouleImpurityDensity{T}) where {T} = LinExpBouleImpurityDensity{T}(T(scale*idm.a), T(scale*idm.b), T(scale*idm.n), idm.l, idm.m, idm.det_z0)

src/ImpurityDensities/BouleImpurityDensities/ParBouleImpurityDensity.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ struct ParBouleImpurityDensity{T <: SSDFloat} <: AbstractImpurityDensity{T}
1818
det_z0::T
1919
end
2020

21+
function ParBouleImpurityDensity{T}(pars::Vector{<:Number}, det_z0::Number) where {T}
22+
ParBouleImpurityDensity{T}(
23+
T.(to_internal_units(pars))...,
24+
T(to_internal_units(det_z0))
25+
)
26+
end
27+
2128
function ImpurityDensity(T::DataType, t::Val{:parabolic_boule}, dict::AbstractDict, input_units::NamedTuple)
2229
a::T = haskey(dict, "a") ? _parse_value(T, dict["a"], input_units.length^(-3)) : T(0)
2330
b::T = haskey(dict, "b") ? _parse_value(T, dict["b"], input_units.length^(-4)) : T(0)
@@ -30,4 +37,6 @@ function get_impurity_density(idm::ParBouleImpurityDensity, pt::AbstractCoordina
3037
cpt = CartesianPoint(pt)
3138
z = cpt[3]
3239
idm.a + idm.b * (idm.det_z0 - z) + idm.c * (idm.det_z0 - z)^2
33-
end
40+
end
41+
42+
(*)(scale::Real, idm::ParBouleImpurityDensity{T}) where {T} = ParBouleImpurityDensity{T}(T(scale*idm.a), T(scale*idm.b), T(scale*idm.c), idm.det_z0)

src/ImpurityDensities/BouleImpurityDensities/ParExpBouleImpurityDensity.jl

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ struct ParExpBouleImpurityDensity{T <: SSDFloat} <: AbstractImpurityDensity{T}
2424
det_z0::T
2525
end
2626

27+
function ParExpBouleImpurityDensity{T}(pars::Vector{Number}, det_z0::Number) where {T}
28+
ParExpBouleImpurityDensity{T}(
29+
T.(to_internal_units(pars))...,
30+
T(to_internal_units(det_z0))
31+
)
32+
end
33+
2734
function ImpurityDensity(T::DataType, t::Val{:parabolic_exponential_boule}, dict::AbstractDict, input_units::NamedTuple)
2835
a::T = haskey(dict, "a") ? _parse_value(T, dict["a"], input_units.length^(-3)) : T(0)
2936
b::T = haskey(dict, "b") ? _parse_value(T, dict["b"], input_units.length^(-4)) : T(0)
@@ -39,4 +46,6 @@ function get_impurity_density(idm::ParExpBouleImpurityDensity, pt::AbstractCoord
3946
cpt = CartesianPoint(pt)
4047
z = cpt[3]
4148
idm.a + idm.b * (idm.det_z0 - z) + idm.c * (idm.det_z0 - z)^2 + idm.n * exp((idm.det_z0 - z - idm.l)/idm.m)
42-
end
49+
end
50+
51+
(*)(scale::Real, idm::ParExpBouleImpurityDensity{T}) where {T} = ParExpBouleImpurityDensity{T}(T(scale*idm.a), T(scale*idm.b), T(scale*idm.c), T(scale*idm.n), idm.l, idm.m, idm.det_z0)

src/ImpurityDensities/ConstantImpurityDensity.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,6 @@ end
2929
function ImpurityDensity(T::DataType, t::Val{:constant}, dict::AbstractDict, input_units::NamedTuple)
3030
ρ::T = haskey(dict, "value") ? _parse_value(T, dict["value"], input_units.length^(-3)) : T(0)
3131
ConstantImpurityDensity{T}( ρ )
32-
end
32+
end
33+
34+
(*)(scale::Real, lcdm::ConstantImpurityDensity{T}) where {T} = ConstantImpurityDensity{T}(T(scale * lcdm.ρ))

src/ImpurityDensities/CylindricalImpurityDensity.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,5 @@ function get_impurity_density(lcdm::CylindricalImpurityDensity{T}, pt::AbstractC
5252
end
5353
return ρ
5454
end
55+
56+
(*)(scale::Real, lcdm::CylindricalImpurityDensity{T}) where {T} = CylindricalImpurityDensity{T}(T.(scale .* lcdm.offsets), T.(scale .* lcdm.gradients))

src/ImpurityDensities/ImpurityDensities.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ abstract type AbstractImpurityDensity{T <: SSDFloat} end
2727
return ImpurityDensity(T, Val{Symbol(dict["name"])}(), dict, input_units)
2828
end
2929

30+
(*)(idm::AbstractImpurityDensity, scale::Real) = (*)(scale, idm)
31+
3032
"""
3133
get_impurity_density(id::AbstractImpurityDensity, pt::AbstractCoordinatePoint)
3234

src/ImpurityDensities/LinearImpurityDensity.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,5 @@ function get_impurity_density(lcdm::LinearImpurityDensity{T}, pt::AbstractCoordi
5555
end
5656
return ρ
5757
end
58+
59+
(*)(scale::Real, lcdm::LinearImpurityDensity{T}) where {T} = LinearImpurityDensity{T}(T.(scale .* lcdm.offsets), T.(scale .* lcdm.gradients))

src/SolidStateDetectors.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ import TypedTables
5858

5959
import Base: size, sizeof, length, getindex, setindex!, axes, getproperty, broadcast,
6060
range, ndims, eachindex, enumerate, iterate, IndexStyle, eltype, in, convert,
61-
show, print, println, display, +, -, &
61+
show, print, println, display, +, -, &, *
6262

6363
export SolidStateDetector
6464
export SSD_examples

0 commit comments

Comments
 (0)