From 918f86e9fb494bc0ae4acd9ebbf01b17ff6c68fa Mon Sep 17 00:00:00 2001 From: hervasa2 Date: Thu, 8 May 2025 18:09:17 +0200 Subject: [PATCH 1/7] add BouleImpurityDensity constructors and scaling functions --- .../BouleImpurityDensities/LinBouleImpurityDensity.jl | 11 ++++++++++- .../LinExpBouleImpurityDensity.jl | 11 ++++++++++- .../BouleImpurityDensities/ParBouleImpurityDensity.jl | 11 ++++++++++- .../ParExpBouleImpurityDensity.jl | 11 ++++++++++- src/ImpurityDensities/ImpurityDensities.jl | 2 ++ src/SolidStateDetectors.jl | 2 +- 6 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/ImpurityDensities/BouleImpurityDensities/LinBouleImpurityDensity.jl b/src/ImpurityDensities/BouleImpurityDensities/LinBouleImpurityDensity.jl index f01fdfec2..38fdda695 100644 --- a/src/ImpurityDensities/BouleImpurityDensities/LinBouleImpurityDensity.jl +++ b/src/ImpurityDensities/BouleImpurityDensities/LinBouleImpurityDensity.jl @@ -16,6 +16,13 @@ struct LinBouleImpurityDensity{T <: SSDFloat} <: AbstractImpurityDensity{T} det_z0::T end +function LinBouleImpurityDensity{T}(pars::Vector{<:Number}, det_z0::Number) where {T} + LinBouleImpurityDensity{T}( + T.(to_internal_units(pars))..., + T(to_internal_units(det_z0)) + ) +end + function ImpurityDensity(T::DataType, t::Val{:linear_boule}, dict::AbstractDict, input_units::NamedTuple) a::T = haskey(dict, "a") ? _parse_value(T, dict["a"], input_units.length^(-3)) : T(0) 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 cpt = CartesianPoint(pt) z = cpt[3] idm.a + idm.b * (idm.det_z0 - z) -end \ No newline at end of file +end + +(*)(scale::Real, idm::LinBouleImpurityDensity{T}) where {T} = LinBouleImpurityDensity{T}(T(scale*idm.a), T(scale*idm.b), idm.det_z0) \ No newline at end of file diff --git a/src/ImpurityDensities/BouleImpurityDensities/LinExpBouleImpurityDensity.jl b/src/ImpurityDensities/BouleImpurityDensities/LinExpBouleImpurityDensity.jl index a43464c35..b0cc3c9a7 100644 --- a/src/ImpurityDensities/BouleImpurityDensities/LinExpBouleImpurityDensity.jl +++ b/src/ImpurityDensities/BouleImpurityDensities/LinExpBouleImpurityDensity.jl @@ -22,6 +22,13 @@ struct LinExpBouleImpurityDensity{T <: SSDFloat} <: AbstractImpurityDensity{T} det_z0::T end +function LinExpBouleImpurityDensity{T}(pars::Vector{<:Number}, det_z0::Number) where {T} + LinExpBouleImpurityDensity{T}( + T.(to_internal_units(pars))..., + T(to_internal_units(det_z0)) + ) +end + function ImpurityDensity(T::DataType, t::Val{:linear_exponential_boule}, dict::AbstractDict, input_units::NamedTuple) a::T = haskey(dict, "a") ? _parse_value(T, dict["a"], input_units.length^(-3)) : T(0) 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 cpt = CartesianPoint(pt) z = cpt[3] idm.a + idm.b * (idm.det_z0 - z) + idm.n * exp((idm.det_z0 - z - idm.l)/idm.m) -end \ No newline at end of file +end + +(*)(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) \ No newline at end of file diff --git a/src/ImpurityDensities/BouleImpurityDensities/ParBouleImpurityDensity.jl b/src/ImpurityDensities/BouleImpurityDensities/ParBouleImpurityDensity.jl index a9b6ca563..82876651c 100644 --- a/src/ImpurityDensities/BouleImpurityDensities/ParBouleImpurityDensity.jl +++ b/src/ImpurityDensities/BouleImpurityDensities/ParBouleImpurityDensity.jl @@ -18,6 +18,13 @@ struct ParBouleImpurityDensity{T <: SSDFloat} <: AbstractImpurityDensity{T} det_z0::T end +function ParBouleImpurityDensity{T}(pars::Vector{<:Number}, det_z0::Number) where {T} + ParBouleImpurityDensity{T}( + T.(to_internal_units(pars))..., + T(to_internal_units(det_z0)) + ) +end + function ImpurityDensity(T::DataType, t::Val{:parabolic_boule}, dict::AbstractDict, input_units::NamedTuple) a::T = haskey(dict, "a") ? _parse_value(T, dict["a"], input_units.length^(-3)) : T(0) 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 cpt = CartesianPoint(pt) z = cpt[3] idm.a + idm.b * (idm.det_z0 - z) + idm.c * (idm.det_z0 - z)^2 -end \ No newline at end of file +end + +(*)(scale::Real, idm::ParBouleImpurityDensity{T}) where {T} = ParBouleImpurityDensity{T}(T(scale*idm.a), T(scale*idm.b), T(scale*idm.c), idm.det_z0) \ No newline at end of file diff --git a/src/ImpurityDensities/BouleImpurityDensities/ParExpBouleImpurityDensity.jl b/src/ImpurityDensities/BouleImpurityDensities/ParExpBouleImpurityDensity.jl index 486cb2c06..c94df6000 100644 --- a/src/ImpurityDensities/BouleImpurityDensities/ParExpBouleImpurityDensity.jl +++ b/src/ImpurityDensities/BouleImpurityDensities/ParExpBouleImpurityDensity.jl @@ -24,6 +24,13 @@ struct ParExpBouleImpurityDensity{T <: SSDFloat} <: AbstractImpurityDensity{T} det_z0::T end +function ParExpBouleImpurityDensity{T}(pars::Vector{Number}, det_z0::Number) where {T} + ParExpBouleImpurityDensity{T}( + T.(to_internal_units(pars))..., + T(to_internal_units(det_z0)) + ) +end + function ImpurityDensity(T::DataType, t::Val{:parabolic_exponential_boule}, dict::AbstractDict, input_units::NamedTuple) a::T = haskey(dict, "a") ? _parse_value(T, dict["a"], input_units.length^(-3)) : T(0) 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 cpt = CartesianPoint(pt) z = cpt[3] 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) -end \ No newline at end of file +end + +(*)(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) \ No newline at end of file diff --git a/src/ImpurityDensities/ImpurityDensities.jl b/src/ImpurityDensities/ImpurityDensities.jl index 7f77895d2..d04acc3ac 100644 --- a/src/ImpurityDensities/ImpurityDensities.jl +++ b/src/ImpurityDensities/ImpurityDensities.jl @@ -27,6 +27,8 @@ abstract type AbstractImpurityDensity{T <: SSDFloat} end return ImpurityDensity(T, Val{Symbol(dict["name"])}(), dict, input_units) end +(*)(idm::AbstractImpurityDensity{T}, scale::Real) where {T} = (*)(scale, idm) + """ get_impurity_density(id::AbstractImpurityDensity, pt::AbstractCoordinatePoint) diff --git a/src/SolidStateDetectors.jl b/src/SolidStateDetectors.jl index 4b70f2e69..a8086d5f1 100644 --- a/src/SolidStateDetectors.jl +++ b/src/SolidStateDetectors.jl @@ -58,7 +58,7 @@ import TypedTables import Base: size, sizeof, length, getindex, setindex!, axes, getproperty, broadcast, range, ndims, eachindex, enumerate, iterate, IndexStyle, eltype, in, convert, - show, print, println, display, +, -, & + show, print, println, display, +, -, &, * export SolidStateDetector export SSD_examples From 8f412bca79c526f928590fc3aa2e0343860268d5 Mon Sep 17 00:00:00 2001 From: hervasa2 Date: Thu, 8 May 2025 18:09:48 +0200 Subject: [PATCH 2/7] add tol for warning when using depletion handling --- src/Simulation/Simulation.jl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Simulation/Simulation.jl b/src/Simulation/Simulation.jl index ff5d45e92..04b387c8a 100644 --- a/src/Simulation/Simulation.jl +++ b/src/Simulation/Simulation.jl @@ -992,17 +992,18 @@ function _calculate_potential!( sim::Simulation{T, CS}, potential_type::UnionAll end end if verbose && depletion_handling && isEP + depletion_tol = 0.1 maximum_applied_potential = maximum(broadcast(c -> c.potential, sim.detector.contacts)) minimum_applied_potential = minimum(broadcast(c -> c.potential, sim.detector.contacts)) @inbounds for i in eachindex(sim.electric_potential.data) - if sim.electric_potential.data[i] < minimum_applied_potential # p-type + if sim.electric_potential.data[i] < minimum_applied_potential - depletion_tol# p-type @warn """Detector seems not to be fully depleted at a bias voltage of $(bias_voltage) V. At least one grid point has a smaller potential value ($(sim.electric_potential.data[i]) V) than the minimum applied potential ($(minimum_applied_potential) V). This should not be. However, small overshoots could be due to numerical precision.""" break end - if sim.electric_potential.data[i] > maximum_applied_potential # n-type + if sim.electric_potential.data[i] > maximum_applied_potential + depletion_tol # n-type @warn """Detector seems not to be not fully depleted at a bias voltage of $(bias_voltage) V. At least one grid point has a higher potential value ($(sim.electric_potential.data[i]) V) than the maximum applied potential ($(maximum_applied_potential) V). This should not be. From a0d727925fd8a268dd1be43820fc216585d3a7c4 Mon Sep 17 00:00:00 2001 From: hervasa2 Date: Mon, 12 May 2025 12:32:52 +0200 Subject: [PATCH 3/7] add (*) for all impurity densities --- src/ImpurityDensities/ConstantImpurityDensity.jl | 4 +++- src/ImpurityDensities/CylindricalImpurityDensity.jl | 2 ++ src/ImpurityDensities/ImpurityDensities.jl | 2 +- src/ImpurityDensities/LinearImpurityDensity.jl | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ImpurityDensities/ConstantImpurityDensity.jl b/src/ImpurityDensities/ConstantImpurityDensity.jl index 73190841f..6de3cf28f 100644 --- a/src/ImpurityDensities/ConstantImpurityDensity.jl +++ b/src/ImpurityDensities/ConstantImpurityDensity.jl @@ -29,4 +29,6 @@ end function ImpurityDensity(T::DataType, t::Val{:constant}, dict::AbstractDict, input_units::NamedTuple) ρ::T = haskey(dict, "value") ? _parse_value(T, dict["value"], input_units.length^(-3)) : T(0) ConstantImpurityDensity{T}( ρ ) -end \ No newline at end of file +end + +(*)(scale::Real, lcdm::ConstantImpurityDensity{T}) where {T} = ConstantImpurityDensity{T}(T(scale * lcdm.ρ)) \ No newline at end of file diff --git a/src/ImpurityDensities/CylindricalImpurityDensity.jl b/src/ImpurityDensities/CylindricalImpurityDensity.jl index 2adabb861..ce6e5993c 100644 --- a/src/ImpurityDensities/CylindricalImpurityDensity.jl +++ b/src/ImpurityDensities/CylindricalImpurityDensity.jl @@ -52,3 +52,5 @@ function get_impurity_density(lcdm::CylindricalImpurityDensity{T}, pt::AbstractC end return ρ end + +(*)(scale::Real, lcdm::CylindricalImpurityDensity{T}) where {T} = CylindricalImpurityDensity{T}(T.(scale .* lcdm.offsets), T.(scale .* lcdm.gradients)) \ No newline at end of file diff --git a/src/ImpurityDensities/ImpurityDensities.jl b/src/ImpurityDensities/ImpurityDensities.jl index d04acc3ac..5ac63d2e9 100644 --- a/src/ImpurityDensities/ImpurityDensities.jl +++ b/src/ImpurityDensities/ImpurityDensities.jl @@ -27,7 +27,7 @@ abstract type AbstractImpurityDensity{T <: SSDFloat} end return ImpurityDensity(T, Val{Symbol(dict["name"])}(), dict, input_units) end -(*)(idm::AbstractImpurityDensity{T}, scale::Real) where {T} = (*)(scale, idm) +(*)(idm::AbstractImpurityDensity, scale::Real) = (*)(scale, idm) """ get_impurity_density(id::AbstractImpurityDensity, pt::AbstractCoordinatePoint) diff --git a/src/ImpurityDensities/LinearImpurityDensity.jl b/src/ImpurityDensities/LinearImpurityDensity.jl index 63f63dd8f..a846afce4 100644 --- a/src/ImpurityDensities/LinearImpurityDensity.jl +++ b/src/ImpurityDensities/LinearImpurityDensity.jl @@ -55,3 +55,5 @@ function get_impurity_density(lcdm::LinearImpurityDensity{T}, pt::AbstractCoordi end return ρ end + +(*)(scale::Real, lcdm::LinearImpurityDensity{T}) where {T} = LinearImpurityDensity{T}(T.(scale .* lcdm.offsets), T.(scale .* lcdm.gradients)) \ No newline at end of file From 60a741efab26afa2ebdec6b573d501b5cac63937 Mon Sep 17 00:00:00 2001 From: hervasa2 Date: Tue, 13 May 2025 12:30:13 +0200 Subject: [PATCH 4/7] split --- src/Simulation/Simulation.jl | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Simulation/Simulation.jl b/src/Simulation/Simulation.jl index 04b387c8a..77b200b91 100644 --- a/src/Simulation/Simulation.jl +++ b/src/Simulation/Simulation.jl @@ -819,7 +819,7 @@ function _calculate_potential!( sim::Simulation{T, CS}, potential_type::UnionAll min_tick_distance::Union{Missing, LengthQuantity, Tuple{LengthQuantity, <:Union{LengthQuantity, AngleQuantity}, LengthQuantity}} = missing, max_tick_distance::Union{Missing, LengthQuantity, Tuple{LengthQuantity, <:Union{LengthQuantity, AngleQuantity}, LengthQuantity}} = missing, max_distance_ratio::Real = 5, - depletion_handling::Bool = false, + depletion_handling::Bool = false use_nthreads::Union{Int, Vector{Int}} = Base.Threads.nthreads(), sor_consts::Union{Missing, <:Real, Tuple{<:Real,<:Real}} = missing, max_n_iterations::Int = 50000, @@ -992,18 +992,17 @@ function _calculate_potential!( sim::Simulation{T, CS}, potential_type::UnionAll end end if verbose && depletion_handling && isEP - depletion_tol = 0.1 maximum_applied_potential = maximum(broadcast(c -> c.potential, sim.detector.contacts)) minimum_applied_potential = minimum(broadcast(c -> c.potential, sim.detector.contacts)) @inbounds for i in eachindex(sim.electric_potential.data) - if sim.electric_potential.data[i] < minimum_applied_potential - depletion_tol# p-type + if sim.electric_potential.data[i] < minimum_applied_potential# p-type @warn """Detector seems not to be fully depleted at a bias voltage of $(bias_voltage) V. At least one grid point has a smaller potential value ($(sim.electric_potential.data[i]) V) than the minimum applied potential ($(minimum_applied_potential) V). This should not be. However, small overshoots could be due to numerical precision.""" break end - if sim.electric_potential.data[i] > maximum_applied_potential + depletion_tol # n-type + if sim.electric_potential.data[i] > maximum_applied_potential# n-type @warn """Detector seems not to be not fully depleted at a bias voltage of $(bias_voltage) V. At least one grid point has a higher potential value ($(sim.electric_potential.data[i]) V) than the maximum applied potential ($(maximum_applied_potential) V). This should not be. From 02f0dfbeca8f111e27f59a5c8bb272990202f9f3 Mon Sep 17 00:00:00 2001 From: hervasa2 Date: Tue, 13 May 2025 12:31:32 +0200 Subject: [PATCH 5/7] split --- src/Simulation/Simulation.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Simulation/Simulation.jl b/src/Simulation/Simulation.jl index 77b200b91..18ab0e942 100644 --- a/src/Simulation/Simulation.jl +++ b/src/Simulation/Simulation.jl @@ -995,14 +995,14 @@ function _calculate_potential!( sim::Simulation{T, CS}, potential_type::UnionAll maximum_applied_potential = maximum(broadcast(c -> c.potential, sim.detector.contacts)) minimum_applied_potential = minimum(broadcast(c -> c.potential, sim.detector.contacts)) @inbounds for i in eachindex(sim.electric_potential.data) - if sim.electric_potential.data[i] < minimum_applied_potential# p-type + if sim.electric_potential.data[i] < minimum_applied_potential # p-type @warn """Detector seems not to be fully depleted at a bias voltage of $(bias_voltage) V. At least one grid point has a smaller potential value ($(sim.electric_potential.data[i]) V) than the minimum applied potential ($(minimum_applied_potential) V). This should not be. However, small overshoots could be due to numerical precision.""" break end - if sim.electric_potential.data[i] > maximum_applied_potential# n-type + if sim.electric_potential.data[i] > maximum_applied_potential # n-type @warn """Detector seems not to be not fully depleted at a bias voltage of $(bias_voltage) V. At least one grid point has a higher potential value ($(sim.electric_potential.data[i]) V) than the maximum applied potential ($(maximum_applied_potential) V). This should not be. From fb5ce9be3100b5f0b789f96561cc1781eed1e948 Mon Sep 17 00:00:00 2001 From: hervasa2 Date: Tue, 13 May 2025 12:32:09 +0200 Subject: [PATCH 6/7] split --- src/Simulation/Simulation.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simulation/Simulation.jl b/src/Simulation/Simulation.jl index 18ab0e942..ff5d45e92 100644 --- a/src/Simulation/Simulation.jl +++ b/src/Simulation/Simulation.jl @@ -819,7 +819,7 @@ function _calculate_potential!( sim::Simulation{T, CS}, potential_type::UnionAll min_tick_distance::Union{Missing, LengthQuantity, Tuple{LengthQuantity, <:Union{LengthQuantity, AngleQuantity}, LengthQuantity}} = missing, max_tick_distance::Union{Missing, LengthQuantity, Tuple{LengthQuantity, <:Union{LengthQuantity, AngleQuantity}, LengthQuantity}} = missing, max_distance_ratio::Real = 5, - depletion_handling::Bool = false + depletion_handling::Bool = false, use_nthreads::Union{Int, Vector{Int}} = Base.Threads.nthreads(), sor_consts::Union{Missing, <:Real, Tuple{<:Real,<:Real}} = missing, max_n_iterations::Int = 50000, From 70c217be0431b5b558fc345a074884e248bba24f Mon Sep 17 00:00:00 2001 From: CompatHelper Julia Date: Fri, 16 May 2025 01:23:51 +0000 Subject: [PATCH 7/7] CompatHelper: bump compat for Interpolations to 0.16, (keep existing compat) --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 4e027e873..4abcfebcc 100644 --- a/Project.toml +++ b/Project.toml @@ -55,7 +55,7 @@ FillArrays = "0.9, 0.10, 0.11, 0.12, 0.13, 1" Format = "1.2" GPUArrays = "8, 9, 10, 11" Geant4 = "0.1.13, 0.2" -Interpolations = "0.14, 0.15" +Interpolations = "0.14, 0.15, 0.16" IntervalSets = "0.6, 0.7" JSON = "0.21.2" KernelAbstractions = "0.8, 0.9"