Commit f6d63dac authored by Simon Spannagel's avatar Simon Spannagel
Browse files

Impact Ionization: update model interface

parent 0d0e5c3c
Loading
Loading
Loading
Loading
+1 −6
Original line number Diff line number Diff line
@@ -587,12 +587,7 @@ void GenericPropagationModule::initialize() {
    recombination_ = Recombination(config_, detector_->hasDopingProfile());

    // Impact ionization model
    try {
        multiplication_ = ImpactIonization(
            config_.get<std::string>("multiplication_model"), temperature_, config_.get<double>("multiplication_threshold"));
    } catch(ModelError& e) {
        throw InvalidValueError(config_, "multiplication_model", e.what());
    }
    multiplication_ = ImpactIonization(config_);

    // Check multiplication and step size larger than a picosecond:
    if(!multiplication_.is<NoImpactIonization>() && timestep_max_ > 0.001) {
+1 −6
Original line number Diff line number Diff line
@@ -101,12 +101,7 @@ void TransientPropagationModule::initialize() {
    trapping_ = Trapping(config_);

    // Impact ionization model
    try {
        multiplication_ = ImpactIonization(
            config_.get<std::string>("multiplication_model"), temperature_, config_.get<double>("multiplication_threshold"));
    } catch(ModelError& e) {
        throw InvalidValueError(config_, "multiplication_model", e.what());
    }
    multiplication_ = ImpactIonization(config_);

    // Check multiplication and step size larger than a picosecond:
    if(!multiplication_.is<NoImpactIonization>() && timestep_ > 0.001) {
+25 −16
Original line number Diff line number Diff line
@@ -237,11 +237,16 @@ namespace allpix {

        /**
         * ImpactIonization constructor
         * @param model       Name of the impact ionization model
         * @param config Configuration of the calling module
         * @param temperature Temperature for which the mobility model should be initialized
         * @param threshold   Threshold electric field from which on multiplication is calculated
         */
        ImpactIonization(const std::string& model, double temperature, double threshold) {
        ImpactIonization(const Configuration& config) {
            try {
                auto model = config.get<std::string>("multiplication_model", "none");
                std::transform(model.begin(), model.end(), model.begin(), ::tolower);
                auto temperature = config.get<double>("temperature");
                auto threshold = config.get<double>("multiplication_threshold");

                if(model == "massey") {
                    model_ = std::make_unique<Massey>(temperature, threshold);
                } else if(model == "overstraeten") {
@@ -256,6 +261,10 @@ namespace allpix {
                } else {
                    throw InvalidModelError(model);
                }
                LOG(INFO) << "Selected impact ionization model \"" << model << "\"";
            } catch(const ModelError& e) {
                throw InvalidValueError(config, "multiplication_model", e.what());
            }
        }

        /**