File indexing completed on 2024-08-18 22:54:53
0001
0002
0003
0004
0005 #ifndef MagneticField_ParametrizedEngine_interface_ParabolicParametrizedMagneticField_h
0006 #define MagneticField_ParametrizedEngine_interface_ParabolicParametrizedMagneticField_h
0007
0008 namespace magneticFieldParabolicPortable {
0009
0010 struct Parameters {
0011
0012
0013 static constexpr float c1 = 3.8114;
0014 static constexpr float b0 = -3.94991e-06;
0015 static constexpr float b1 = 7.53701e-06;
0016 static constexpr float a = 2.43878e-11;
0017 static constexpr float max_radius2 = 13225.f;
0018 static constexpr float max_z = 280.f;
0019 };
0020
0021 template <typename Vec3>
0022 constexpr float Kr(Vec3 const& vec) {
0023 return Parameters::a * (vec(0) * vec(0) + vec(1) * vec(1)) + 1.f;
0024 }
0025
0026 template <typename Vec3>
0027 constexpr float B0Z(Vec3 const& vec) {
0028 return Parameters::b0 * vec(2) * vec(2) + Parameters::b1 * vec(2) + Parameters::c1;
0029 }
0030
0031 template <typename Vec3>
0032 constexpr bool isValid(Vec3 const& vec) {
0033 return ((vec(0) * vec(0) + vec(1) * vec(1)) < Parameters::max_radius2 && fabs(vec(2)) < Parameters::max_z);
0034 }
0035
0036 template <typename Vec3>
0037 constexpr float magneticFieldAtPoint(Vec3 const& vec) {
0038 if (isValid(vec)) {
0039 return B0Z(vec) * Kr(vec);
0040 } else {
0041 return 0;
0042 }
0043 }
0044
0045 }
0046
0047 #endif