File indexing completed on 2025-02-21 09:29:26
0001
0002
0003
0004
0005
0006
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
0027
0028 class RZMapMagneticField : public G4MagneticField
0029 {
0030 public:
0031
0032
0033 using SPConstFieldParams = std::shared_ptr<RZMapFieldParams const>;
0034
0035
0036 public:
0037
0038 inline explicit RZMapMagneticField(SPConstFieldParams field_params);
0039
0040
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
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
0062
0063 void RZMapMagneticField::GetFieldValue(double const pos[3], double* field) const
0064 {
0065
0066 Real3 result = calc_field_(convert_from_geant(pos, clhep_length));
0067 for (auto i = 0; i < 3; ++i)
0068 {
0069
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 }