Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-10-30 08:37:31

0001 //------------------------------- -*- C++ -*- -------------------------------//
0002 // Copyright Celeritas contributors: see top-level COPYRIGHT file for details
0003 // SPDX-License-Identifier: (Apache-2.0 OR MIT)
0004 //---------------------------------------------------------------------------//
0005 //! \file celeritas/em/model/SeltzerBergerModel.hh
0006 //---------------------------------------------------------------------------//
0007 #pragma once
0008 
0009 #include <functional>
0010 #include <memory>
0011 
0012 #include "corecel/data/CollectionMirror.hh"
0013 #include "celeritas/Quantities.hh"
0014 #include "celeritas/em/data/SeltzerBergerData.hh"
0015 #include "celeritas/io/ImportSBTable.hh"
0016 #include "celeritas/phys/AtomicNumber.hh"
0017 #include "celeritas/phys/ImportedModelAdapter.hh"
0018 #include "celeritas/phys/ImportedProcessAdapter.hh"
0019 #include "celeritas/phys/Model.hh"
0020 
0021 namespace celeritas
0022 {
0023 class MaterialParams;
0024 class ParticleParams;
0025 
0026 //---------------------------------------------------------------------------//
0027 /*!
0028  * Manage the Seltzer-Berger model for Bremsstrahlung.
0029  *
0030  * The total scaled bremsstrahlung differential cross section for an element Z
0031  * is defined as
0032  * \f[
0033  *   \chi(Z,E,\kappa) = \frac{\beta^2}{Z^2} k \difd{\sigma}{k},
0034  * \f]
0035  * where \f$ \kappa = k / E \f$ is the ratio of the emitted photon energy to
0036  * the incident charged particle energy, \f$ \beta \f$ is the ratio of the
0037  * charged particle velocity to the speed of light, and
0038  * \f$ \difd{\sigma}{k} \f$ is the bremsstrahlung differential cross
0039  * section.
0040  *
0041  * Seltzer and Berger have tabulated the scaled DCS (in mb) for elements Z = 1
0042  * - 100 and for incident charged particle energies from 1 keV to 10 GeV
0043  * (reported in MeV) in Seltzer S.M. and M.J. Berger (1986), "Bremsstrahlung
0044  * energy spectra from electrons with kinetic energy 1 keV–10 GeV incident on
0045  * screened nuclei and orbital electrons of neutral atoms with Z = 1–100", At.
0046  * Data Nucl. Data Tables 35, 345–418.
0047  */
0048 class SeltzerBergerModel final : public Model, public StaticConcreteAction
0049 {
0050   public:
0051     //!@{
0052     using Mass = units::MevMass;
0053     using ReadData = std::function<ImportSBTable(AtomicNumber)>;
0054     using HostRef = HostCRef<SeltzerBergerData>;
0055     using DeviceRef = DeviceCRef<SeltzerBergerData>;
0056     using SPConstImported = std::shared_ptr<ImportedProcesses const>;
0057     //!@}
0058 
0059   public:
0060     // Construct from model ID and other necessary data
0061     SeltzerBergerModel(ActionId id,
0062                        ParticleParams const& particles,
0063                        MaterialParams const& materials,
0064                        SPConstImported data,
0065                        ReadData load_sb_table);
0066 
0067     // Particle types and energy ranges that this model applies to
0068     SetApplicability applicability() const final;
0069 
0070     // Get the microscopic cross sections for the given particle and material
0071     MicroXsBuilders micro_xs(Applicability) const final;
0072 
0073     // Apply the interaction kernel on device
0074     void step(CoreParams const&, CoreStateHost&) const final;
0075 
0076     // Apply the interaction kernel
0077     void step(CoreParams const&, CoreStateDevice&) const final;
0078 
0079     //! Access SB data on the host
0080     HostRef const& host_ref() const { return data_.host_ref(); }
0081 
0082     //! Access SB data on the device
0083     DeviceRef const& device_ref() const { return data_.device_ref(); }
0084 
0085   private:
0086     // Host/device storage and reference
0087     CollectionMirror<SeltzerBergerData> data_;
0088 
0089     ImportedModelAdapter imported_;
0090 };
0091 
0092 //---------------------------------------------------------------------------//
0093 }  // namespace celeritas