Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-02-21 09:29:26

0001 //----------------------------------*-C++-*----------------------------------//
0002 // Copyright 2023-2024 UT-Battelle, LLC, and other Celeritas developers.
0003 // See the top-level COPYRIGHT file for details.
0004 // SPDX-License-Identifier: (Apache-2.0 OR MIT)
0005 //---------------------------------------------------------------------------//
0006 //! \file accel/RZMapMagneticField.hh
0007 //---------------------------------------------------------------------------//
0008 #pragma once
0009 
0010 #include <memory>
0011 #include <CLHEP/Units/SystemOfUnits.h>
0012 #include <G4MagneticField.hh>
0013 
0014 #include "corecel/Macros.hh"
0015 #include "corecel/math/ArrayOperators.hh"
0016 #include "geocel/g4/Convert.geant.hh"
0017 #include "celeritas/Quantities.hh"
0018 #include "celeritas/ext/GeantUnits.hh"
0019 #include "celeritas/field/RZMapField.hh"
0020 #include "celeritas/field/RZMapFieldParams.hh"
0021 
0022 namespace celeritas
0023 {
0024 //---------------------------------------------------------------------------//
0025 /*!
0026  * A user magnetic field equivalent to celeritas::RZMapField.
0027  */
0028 class RZMapMagneticField : public G4MagneticField
0029 {
0030   public:
0031     //!@{
0032     //! \name Type aliases
0033     using SPConstFieldParams = std::shared_ptr<RZMapFieldParams const>;
0034     //!@}
0035 
0036   public:
0037     // Construct with RZMapFieldParams
0038     inline explicit RZMapMagneticField(SPConstFieldParams field_params);
0039 
0040     // Calculate values of the magnetic field vector
0041     inline void GetFieldValue(double const point[3], double* field) const;
0042 
0043   private:
0044     SPConstFieldParams params_;
0045     RZMapField calc_field_;
0046 };
0047 
0048 //---------------------------------------------------------------------------//
0049 /*!
0050  * Construct with the Celeritas shared RZMapFieldParams.
0051  */
0052 RZMapMagneticField::RZMapMagneticField(SPConstFieldParams params)
0053     : params_(std::move(params))
0054     , calc_field_(RZMapField{params_->ref<MemSpace::native>()})
0055 {
0056     CELER_EXPECT(params_);
0057 }
0058 
0059 //---------------------------------------------------------------------------//
0060 /*!
0061  * Calculate the magnetic field vector at the given position.
0062  */
0063 void RZMapMagneticField::GetFieldValue(double const pos[3], double* field) const
0064 {
0065     // Calculate the magnetic field value in the native Celeritas unit system
0066     Real3 result = calc_field_(convert_from_geant(pos, clhep_length));
0067     for (auto i = 0; i < 3; ++i)
0068     {
0069         // Return values of the field vector in CLHEP::tesla for Geant4
0070         auto ft = native_value_to<units::FieldTesla>(result[i]);
0071         field[i] = convert_to_geant(ft.value(), CLHEP::tesla);
0072     }
0073 }
0074 
0075 //---------------------------------------------------------------------------//
0076 }  // namespace celeritas