Skip to content

Conversation

@hervasa2
Copy link
Collaborator

@hervasa2 hervasa2 commented Nov 14, 2025

I have now completely deprecated all old TemperatureModels, and removed the scale_to_given_temperature functionality, which would scale the longitudinal drift at each step in the charge drift.

In its place with @fhagemann we propose to use,

scale_to_temperature(cdm::ADL2016ChargeDriftModel{T,M,N,PowerLawModel{T}}, Temp::RealQuantity)

which directly scales the drift parameters according to temperature.

The parametrization for the temperature dependence of drift velocity, as a function of the electric
field strength, $E$, was proposed by M.A. Omar and L. Reggiani:

$$\quad\mu_0(T) = A/T^P~, \quad V_s(T) = B\tanh^{1/2}(\theta/2T)$$

Note that the saturation velocity, $V_s$, is related to $E_0$ via

$$E_0(T) = V_s(T)/\mu_0(T)$$

The four parameters, $A$, $P$, $B$, $\theta$, are different for electrons and holes.
This model can be used to scale the $\mu_0$ and $E_0$ parameters of the VelocityParameters struct directly (assuming these where measured at a reference temperature of 77K) as follows:

$$\mu_0(T) = \mu_0(77K) \left(\frac{T}{77K}\right)^{-P}~, \quad E_0(T) = E_0(77K) \sqrt{\frac{\tanh(\theta/2T)}{\tanh(\theta/2 \cdot 77K)}} \frac{\mu_0(77K)}{\mu_0(T)}$$

This model is now implemented under the new PowerLawModel.

In siggen the M.A. Omar and L. Reggiani model is used to scale the longitudinal drift velocity, as was implemented in this now closed PR #361. The scaling as calculated, assumes that the velocities to be scaled are modeled with the SquareRootModel ($\beta = 2$ drift model). Nevertheless, this can lead to distortions in our case (and in siggen), since $\beta \ne 2$ in the base drift model which we are scaling (ADL2016ChargeDriftModel) .

The question now is: do we use the original parameters from M.A. Omar and L. Reggiani (since these where calculated assuming $\beta = 2$) or something else? I see in @fhagemann's thesis that the original parameters (listed below) give a good agreement with his measurements at $E = 500$ V/cm. Is this true at other electric field strengths?

temperature_dependence:
  reference_temperature: 77K
  model: PowerLaw
  parameters:
    e100:
      p: 1.68
      theta: 200K
    h100:
      p: 2.4
      theta: 200K

One last detail, note that setting the temperature in the drift config is no longer supported with this PR. Since this is set in the main config file of the simulation, having it in two places is confusing for the user. Under the implementation of this PR it has to be manually passed to the drift model as such

ADL2016ChargeDriftModel(temperature = sim.detector.semiconductor.temperature)

In general I don't like any variables being set in drift model configs, which is why I also support phi110 being moved to the simulation config, and also being manually passed as

ADL2016ChargeDriftModel(temperature = sim.detector.semiconductor.temperature, phi110 = sim.detector.semiconductor.phi110)

or in some clever way.

Below I compare the longitudinal drift velocity as calculated by #361 (siggen-like -> scaled $v_l$) and as calculated by this PR (-> scaled drift model). The residuals correspond to these two quantities. $v_l$ at 77 K is shown for reference.

vl_animation

vl_animation_e

@hervasa2 hervasa2 requested a review from fhagemann November 14, 2025 16:21
@hervasa2 hervasa2 added enhancement Improvement of existing features help wanted Extra attention is needed performance Performance improvements breaking Changes syntax to older versions labels Nov 14, 2025
@fhagemann fhagemann added this to the v0.11.0 milestone Nov 15, 2025
@hervasa2
Copy link
Collaborator Author

Also, what do you think of removing phi110 from charge drift configs and adding it to the semiconductor config? Therefore its on equal footing to the temperature. It also logically belongs to the semiconductor.

- semiconductor:
      material: HPGe
      temperature: 78K
      phi110: -45°

@hervasa2 hervasa2 requested a review from fhagemann November 21, 2025 11:26
@fhagemann
Copy link
Collaborator

Also, what do you think of removing phi110 from charge drift configs and adding it to the semiconductor config? Therefore its on equal footing to the temperature. It also logically belongs to the semiconductor.

- semiconductor:
      material: HPGe
      temperature: 78K
      phi110: -45°

When reading config files in: can we still support the old format (if there is no phi110 in the semiconductor, check if there is one in the charge drift model)? We added it to ADLChargeDriftModel, because the other charge drift models don't require this right now.

@hervasa2
Copy link
Collaborator Author

When reading config files in: can we still support the old format (if there is no phi110 in the semiconductor, check if there is one in the charge drift model)? We added it to ADLChargeDriftModel, because the other charge drift models don't require this right now.

The situation is a bit complicated because of the option to use a rotation matrix instead of phi110. I am leaving the current implementation of reading in this value untouched.

@fhagemann fhagemann added notation Notation and Interface convenience Improve user-friendliness new feature Add new feature documentation This issue asks for documentation labels Nov 25, 2025
@fhagemann fhagemann merged commit 5aae46f into JuliaPhysics:main Nov 25, 2025
10 checks passed
@fhagemann fhagemann mentioned this pull request Nov 28, 2025
11 tasks
sm2909 pushed a commit to sm2909/SolidStateDetectors.jl that referenced this pull request Dec 7, 2025
…#562)

* temperature dependence of ADL2016ChargeDriftModel

* scale_to_temperature

* scale_to_temperature tests

* scale_to_temperature docs

* PowerLawModel docs

* rm old temp models

* add temperature dep to ADLChargeDriftModel

* rename temperature models

* consistent ChargeDriftModel constructors

* temp dep docs

* ElectricFieldChargeDriftModel constructors

* IsotropicChargeDriftModel constructors

* bug fixes

* deprecation warnings

* temp scaling tests

* TemperatureModel constructor

* input units for charge drift models

* multiple temperature scalings

* add units and move drift configs

* IsotropicChargeDriftModel legacy constructor
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking Changes syntax to older versions convenience Improve user-friendliness documentation This issue asks for documentation enhancement Improvement of existing features help wanted Extra attention is needed new feature Add new feature notation Notation and Interface performance Performance improvements

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants