ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
MagneticField
MagFieldElements
src
BFieldCacheZR.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3
*/
4
5
#include "
MagFieldElements/BFieldCacheZR.h
"
6
#include <cmath>
7
8
void
9
BFieldCacheZR::getB
(
const
double
*
ATH_RESTRICT
xyz
,
10
double
r
,
11
double
*
ATH_RESTRICT
B,
12
double
*
ATH_RESTRICT
deriv)
const
13
{
14
const
double
x
=
xyz
[0];
15
const
double
y
=
xyz
[1];
16
const
double
z
=
xyz
[2];
17
// fractional position inside this bin
18
const
double
fz = (
z
-
m_zmin
) *
m_invz
;
19
const
double
gz = 1.0 - fz;
20
const
double
fr = (
r
-
m_rmin
) *
m_invr
;
21
const
double
gr
= 1.0 - fr;
22
// interpolate field values in z, r
23
double
Bzr[2];
24
for
(
int
i = 0; i < 2; ++i) {
// z, r components
25
const
double
* field =
m_field
[i];
26
Bzr[i] = gz * (
gr
* field[0] + fr * field[1]) +
27
fz * (
gr
* field[2] + fr * field[3]);
28
}
29
// convert (Bz,Br) to (Bx,By,Bz)
30
double
invr;
31
if
(
r
> 0.0) {
32
invr = 1.0 /
r
;
33
}
else
{
34
invr = 0.0;
35
}
36
const
double
c(
x
* invr);
37
const
double
s(
y
* invr);
38
B[0] = Bzr[1] * c;
39
B[1] = Bzr[1] * s;
40
B[2] = Bzr[0];
41
42
// compute field derivatives if requested
43
if
(deriv) {
44
std::array<double, 2> dBdz{};
45
std::array<double, 2> dBdr{};
46
for
(
int
j = 0; j < 2; ++j) {
// Bz, Br components
47
const
double
* field =
m_field
[j];
48
dBdz[j] =
49
m_invz
* (
gr
* (field[2] - field[0]) + fr * (field[3] - field[1]));
50
dBdr[j] =
51
m_invr
* (gz * (field[1] - field[0]) + fz * (field[3] - field[2]));
52
}
53
// convert to cartesian coordinates
54
const
double
cc = c * c;
55
const
double
cs = c * s;
56
const
double
ss
= s * s;
57
const
double
sinvr = s * invr;
58
const
double
cinvr = c * invr;
59
deriv[0] = cc * dBdr[1] + sinvr * B[1];
60
deriv[1] = cs * dBdr[1] - cinvr * B[1];
61
deriv[2] = c * dBdz[1];
62
deriv[3] = cs * dBdr[1] - sinvr * B[0];
63
deriv[4] =
ss
* dBdr[1] + cinvr * B[0];
64
deriv[5] = s * dBdz[1];
65
deriv[6] = c * dBdr[0];
66
deriv[7] = s * dBdr[0];
67
deriv[8] = dBdz[0];
68
}
69
}
70
BFieldCacheZR.h
gr
#define gr
ss
static Double_t ss
Definition
LArPhysWaveHECTool.cxx:37
y
#define y
xyz
#define xyz
x
#define x
z
#define z
BFieldCacheZR::getB
void getB(const double *ATH_RESTRICT xyz, double r, double *ATH_RESTRICT B, double *ATH_RESTRICT deriv=nullptr) const
Definition
BFieldCacheZR.cxx:9
BFieldCacheZR::m_rmin
double m_rmin
Definition
BFieldCacheZR.h:43
BFieldCacheZR::m_field
double m_field[2][4]
Definition
BFieldCacheZR.h:45
BFieldCacheZR::m_invr
double m_invr
Definition
BFieldCacheZR.h:44
BFieldCacheZR::m_invz
double m_invz
Definition
BFieldCacheZR.h:44
BFieldCacheZR::m_zmin
double m_zmin
Definition
BFieldCacheZR.h:42
r
int r
Definition
globals.cxx:22
ATH_RESTRICT
#define ATH_RESTRICT
Definition
restrict.h:31
Generated on
for ATLAS Offline Software by
1.17.0