Skip to content
Snippets Groups Projects
Commit 64693a44 authored by Christos Anastopoulos's avatar Christos Anastopoulos Committed by Adam Edward Barton
Browse files

MagFieldElement further follow ATLAS style on inline conventions

parent 1a1ea240
No related branches found
No related tags found
No related merge requests found
...@@ -17,5 +17,4 @@ atlas_add_library( MagFieldElements ...@@ -17,5 +17,4 @@ atlas_add_library( MagFieldElements
atlas_add_test( BFieldExample_test atlas_add_test( BFieldExample_test
SOURCES test/BFieldExample_test.cxx SOURCES test/BFieldExample_test.cxx
INCLUDE_DIRS
LINK_LIBRARIES MagFieldElements) LINK_LIBRARIES MagFieldElements)
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include "CxxUtils/restrict.h" #include "CxxUtils/restrict.h"
#include "MagFieldElements/BFieldVector.h" #include "MagFieldElements/BFieldVector.h"
#include <cmath>
class BFieldCache class BFieldCache
{ {
...@@ -28,6 +27,7 @@ public: ...@@ -28,6 +27,7 @@ public:
BFieldCache() = default; BFieldCache() = default;
// make this cache invalid, so that inside() will fail // make this cache invalid, so that inside() will fail
void invalidate(); void invalidate();
// set the z, r, phi range that defines the bin // set the z, r, phi range that defines the bin
void setRange(double zmin, void setRange(double zmin,
double zmax, double zmax,
...@@ -53,9 +53,6 @@ public: ...@@ -53,9 +53,6 @@ public:
double* ATH_RESTRICT B, double* ATH_RESTRICT B,
double* ATH_RESTRICT deriv = nullptr) const; double* ATH_RESTRICT deriv = nullptr) const;
// set the field values at each corner (rescale for current scale factor)
void printField() const;
private: private:
// bin range in z // bin range in z
double m_zmin = 0.0; double m_zmin = 0.0;
......
/* /*
Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
*/ */
#include <cmath>
inline void inline void
BFieldCache::invalidate() BFieldCache::invalidate()
{ {
...@@ -56,102 +56,4 @@ BFieldCache::inside(double z, double r, double phi) const ...@@ -56,102 +56,4 @@ BFieldCache::inside(double z, double r, double phi) const
r >= m_rmin && r <= m_rmax); r >= m_rmin && r <= m_rmax);
} }
inline void
BFieldCache::getB(const double* ATH_RESTRICT xyz,
double r,
double phi,
double* ATH_RESTRICT B,
double* ATH_RESTRICT deriv) const
{
const double x = xyz[0];
const double y = xyz[1];
const double z = xyz[2];
// make sure phi is inside [m_phimin,m_phimax]
if (phi < m_phimin) {
phi += 2 * M_PI;
}
// fractional position inside this bin
const double fz = (z - m_zmin) * m_invz;
const double gz = 1.0 - fz;
const double fr = (r - m_rmin) * m_invr;
const double gr = 1.0 - fr;
const double fphi = (phi - m_phimin) * m_invphi;
const double gphi = 1.0 - fphi;
const double scale = m_scale;
// interpolate field values in z, r, phi
double Bzrphi[3];
for (int i = 0; i < 3; ++i) { // z, r, phi components
const double* field = m_field[i];
Bzrphi[i] = scale * (gz * (gr * (gphi * field[0] + fphi * field[1]) +
fr * (gphi * field[2] + fphi * field[3])) +
fz * (gr * (gphi * field[4] + fphi * field[5]) +
fr * (gphi * field[6] + fphi * field[7])));
}
// convert (Bz,Br,Bphi) to (Bx,By,Bz)
double invr;
double c;
double s;
if (r > 0.0) {
invr = 1.0 / r;
c = x * invr;
s = y * invr;
} else {
invr = 0.0;
c = cos(m_phimin);
s = sin(m_phimin);
}
B[0] = Bzrphi[1] * c - Bzrphi[2] * s;
B[1] = Bzrphi[1] * s + Bzrphi[2] * c;
B[2] = Bzrphi[0];
// compute field derivatives if requested
if (deriv) {
const double sz = m_scale * m_invz;
const double sr = m_scale * m_invr;
const double sphi = m_scale * m_invphi;
std::array<double, 3> dBdz;
std::array<double, 3> dBdr;
std::array<double, 3> dBdphi;
for (int j = 0; j < 3; ++j) { // Bz, Br, Bphi components
const double* field = m_field[j];
dBdz[j] =
sz *
(gr * (gphi * (field[4] - field[0]) + fphi * (field[5] - field[1])) +
fr * (gphi * (field[6] - field[2]) + fphi * (field[7] - field[3])));
dBdr[j] =
sr *
(gz * (gphi * (field[2] - field[0]) + fphi * (field[3] - field[1])) +
fz * (gphi * (field[6] - field[4]) + fphi * (field[7] - field[5])));
dBdphi[j] =
sphi * (gz * (gr * (field[1] - field[0]) + fr * (field[3] - field[2])) +
fz * (gr * (field[5] - field[4]) + fr * (field[7] - field[6])));
}
// convert to cartesian coordinates
const double cc = c * c;
const double cs = c * s;
const double ss = s * s;
const double ccinvr = cc * invr;
const double csinvr = cs * invr;
const double ssinvr = ss * invr;
const double sinvr = s * invr;
const double cinvr = c * invr;
deriv[0] = cc * dBdr[1] - cs * dBdr[2] - csinvr * dBdphi[1] +
ssinvr * dBdphi[2] + sinvr * B[1];
deriv[1] = cs * dBdr[1] - ss * dBdr[2] + ccinvr * dBdphi[1] -
csinvr * dBdphi[2] - cinvr * B[1];
deriv[2] = c * dBdz[1] - s * dBdz[2];
deriv[3] = cs * dBdr[1] + cc * dBdr[2] - ssinvr * dBdphi[1] -
csinvr * dBdphi[2] - sinvr * B[0];
deriv[4] = ss * dBdr[1] + cs * dBdr[2] + csinvr * dBdphi[1] +
ccinvr * dBdphi[2] + cinvr * B[0];
deriv[5] = s * dBdz[1] + c * dBdz[2];
deriv[6] = c * dBdr[0] - sinvr * dBdphi[0];
deriv[7] = s * dBdr[0] + cinvr * dBdphi[0];
deriv[8] = dBdz[0];
}
}
...@@ -22,40 +22,16 @@ class BFieldCacheZR ...@@ -22,40 +22,16 @@ class BFieldCacheZR
{ {
public: public:
// default constructor sets unphysical boundaries, so that inside() will fail // default constructor sets unphysical boundaries, so that inside() will fail
BFieldCacheZR() BFieldCacheZR();
: m_zmin(0.0)
, m_zmax(-1.0)
, m_rmin(0.0)
, m_rmax(-1.0)
{}
// invalidate this cache, so that inside() will fail // invalidate this cache, so that inside() will fail
void invalidate() void invalidate();
{
m_rmin = 0.0;
m_rmax = -1.0;
}
// set the z, r range that defines the bin // set the z, r range that defines the bin
void setRange(double zmin, double zmax, double rmin, double rmax) void setRange(double zmin, double zmax, double rmin, double rmax);
{
m_zmin = zmin;
m_zmax = zmax;
m_rmin = rmin;
m_rmax = rmax;
m_invz = 1.0 / (zmax - zmin);
m_invr = 1.0 / (rmax - rmin);
}
// set the field values at each corner (rescale for current scale factor) // set the field values at each corner (rescale for current scale factor)
void setField(int i, const BFieldVectorZR& field, double scaleFactor = 1.0) void setField(int i, const BFieldVectorZR& field, double scaleFactor = 1.0);
{
m_field[0][i] = scaleFactor * field[0];
m_field[1][i] = scaleFactor * field[1];
}
// set the multiplicative factor for the field vectors // set the multiplicative factor for the field vectors
// test if (z, r) is inside this bin // test if (z, r) is inside this bin
bool inside(double z, double r) const bool inside(double z, double r) const;
{
return (z >= m_zmin && z <= m_zmax && r >= m_rmin && r <= m_rmax);
}
// interpolate the field and return B[3]. // interpolate the field and return B[3].
// also compute field derivatives if deriv[9] is given. // also compute field derivatives if deriv[9] is given.
void getB(const double* ATH_RESTRICT xyz, void getB(const double* ATH_RESTRICT xyz,
......
/* /*
Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
*/ */
inline BFieldCacheZR::BFieldCacheZR()
: m_zmin(0.0)
, m_zmax(-1.0)
, m_rmin(0.0)
, m_rmax(-1.0)
{}
inline void inline void
BFieldCacheZR::getB(const double* ATH_RESTRICT xyz, BFieldCacheZR::invalidate()
double r,
double* ATH_RESTRICT B,
double* ATH_RESTRICT deriv) const
{ {
const double x = xyz[0]; m_rmin = 0.0;
const double y = xyz[1]; m_rmax = -1.0;
const double z = xyz[2]; }
// fractional position inside this bin inline void
const double fz = (z - m_zmin) * m_invz; BFieldCacheZR::setRange(double zmin, double zmax, double rmin, double rmax)
const double gz = 1.0 - fz; {
const double fr = (r - m_rmin) * m_invr; m_zmin = zmin;
const double gr = 1.0 - fr; m_zmax = zmax;
// interpolate field values in z, r m_rmin = rmin;
double Bzr[2]; m_rmax = rmax;
for (int i = 0; i < 2; ++i) { // z, r components m_invz = 1.0 / (zmax - zmin);
const double* field = m_field[i]; m_invr = 1.0 / (rmax - rmin);
Bzr[i] = gz * (gr * field[0] + fr * field[1]) + }
fz * (gr * field[2] + fr * field[3]); // set the field values at each corner (rescale for current scale factor)
} inline void
// convert (Bz,Br) to (Bx,By,Bz) BFieldCacheZR::setField(int i,
double invr; const BFieldVectorZR& field,
if (r > 0.0) { double scaleFactor)
invr = 1.0 / r; {
} else { m_field[0][i] = scaleFactor * field[0];
invr = 0.0; m_field[1][i] = scaleFactor * field[1];
} }
const double c(x * invr); inline bool
const double s(y * invr); BFieldCacheZR::inside(double z, double r) const
B[0] = Bzr[1] * c; {
B[1] = Bzr[1] * s; return (z >= m_zmin && z <= m_zmax && r >= m_rmin && r <= m_rmax);
B[2] = Bzr[0];
// compute field derivatives if requested
if (deriv) {
std::array<double, 2> dBdz;
std::array<double, 2> dBdr;
for (int j = 0; j < 2; ++j) { // Bz, Br components
const double* field = m_field[j];
dBdz[j] =
m_invz * (gr * (field[2] - field[0]) +
fr * (field[3] - field[1]));
dBdr[j] =
m_invr * (gz * (field[1] - field[0]) +
fz * (field[3] - field[2]));
}
// convert to cartesian coordinates
const double cc = c * c;
const double cs = c * s;
const double ss = s * s;
const double sinvr = s * invr;
const double cinvr = c * invr;
deriv[0] = cc * dBdr[1] + sinvr * B[1];
deriv[1] = cs * dBdr[1] - cinvr * B[1];
deriv[2] = c * dBdz[1];
deriv[3] = cs * dBdr[1] - sinvr * B[0];
deriv[4] = ss * dBdr[1] + cinvr * B[0];
deriv[5] = s * dBdz[1];
deriv[6] = c * dBdr[0];
deriv[7] = s * dBdr[0];
deriv[8] = dBdz[0];
}
} }
...@@ -3,21 +3,105 @@ ...@@ -3,21 +3,105 @@
*/ */
#include "MagFieldElements/BFieldCache.h" #include "MagFieldElements/BFieldCache.h"
#include <iostream> #include <cmath>
// set the field values at each corner (rescale for current scale factor)
void void
BFieldCache::printField() const BFieldCache::getB(const double* ATH_RESTRICT xyz,
double r,
double phi,
double* ATH_RESTRICT B,
double* ATH_RESTRICT deriv) const
{ {
// print out field values
std::cout << "Field at corner i, for each component j (Bz, Br, Bphi)"
<< '\n';
for (int i = 0; i < 8; ++i) { const double x = xyz[0];
for (int j = 0; j < 3; ++j) { const double y = xyz[1];
std::cout << i << "," << j << ": " << m_field[j][i] << ", "; const double z = xyz[2];
// make sure phi is inside [m_phimin,m_phimax]
if (phi < m_phimin) {
phi += 2 * M_PI;
}
// fractional position inside this bin
const double fz = (z - m_zmin) * m_invz;
const double gz = 1.0 - fz;
const double fr = (r - m_rmin) * m_invr;
const double gr = 1.0 - fr;
const double fphi = (phi - m_phimin) * m_invphi;
const double gphi = 1.0 - fphi;
const double scale = m_scale;
// interpolate field values in z, r, phi
double Bzrphi[3];
for (int i = 0; i < 3; ++i) { // z, r, phi components
const double* field = m_field[i];
Bzrphi[i] = scale * (gz * (gr * (gphi * field[0] + fphi * field[1]) +
fr * (gphi * field[2] + fphi * field[3])) +
fz * (gr * (gphi * field[4] + fphi * field[5]) +
fr * (gphi * field[6] + fphi * field[7])));
}
// convert (Bz,Br,Bphi) to (Bx,By,Bz)
double invr;
double c;
double s;
if (r > 0.0) {
invr = 1.0 / r;
c = x * invr;
s = y * invr;
} else {
invr = 0.0;
c = cos(m_phimin);
s = sin(m_phimin);
}
B[0] = Bzrphi[1] * c - Bzrphi[2] * s;
B[1] = Bzrphi[1] * s + Bzrphi[2] * c;
B[2] = Bzrphi[0];
// compute field derivatives if requested
if (deriv) {
const double sz = m_scale * m_invz;
const double sr = m_scale * m_invr;
const double sphi = m_scale * m_invphi;
std::array<double, 3> dBdz;
std::array<double, 3> dBdr;
std::array<double, 3> dBdphi;
for (int j = 0; j < 3; ++j) { // Bz, Br, Bphi components
const double* field = m_field[j];
dBdz[j] =
sz *
(gr * (gphi * (field[4] - field[0]) + fphi * (field[5] - field[1])) +
fr * (gphi * (field[6] - field[2]) + fphi * (field[7] - field[3])));
dBdr[j] =
sr *
(gz * (gphi * (field[2] - field[0]) + fphi * (field[3] - field[1])) +
fz * (gphi * (field[6] - field[4]) + fphi * (field[7] - field[5])));
dBdphi[j] =
sphi * (gz * (gr * (field[1] - field[0]) + fr * (field[3] - field[2])) +
fz * (gr * (field[5] - field[4]) + fr * (field[7] - field[6])));
} }
std::cout << '\n'; // convert to cartesian coordinates
const double cc = c * c;
const double cs = c * s;
const double ss = s * s;
const double ccinvr = cc * invr;
const double csinvr = cs * invr;
const double ssinvr = ss * invr;
const double sinvr = s * invr;
const double cinvr = c * invr;
deriv[0] = cc * dBdr[1] - cs * dBdr[2] - csinvr * dBdphi[1] +
ssinvr * dBdphi[2] + sinvr * B[1];
deriv[1] = cs * dBdr[1] - ss * dBdr[2] + ccinvr * dBdphi[1] -
csinvr * dBdphi[2] - cinvr * B[1];
deriv[2] = c * dBdz[1] - s * dBdz[2];
deriv[3] = cs * dBdr[1] + cc * dBdr[2] - ssinvr * dBdphi[1] -
csinvr * dBdphi[2] - sinvr * B[0];
deriv[4] = ss * dBdr[1] + cs * dBdr[2] + csinvr * dBdphi[1] +
ccinvr * dBdphi[2] + cinvr * B[0];
deriv[5] = s * dBdz[1] + c * dBdz[2];
deriv[6] = c * dBdr[0] - sinvr * dBdphi[0];
deriv[7] = s * dBdr[0] + cinvr * dBdphi[0];
deriv[8] = dBdz[0];
} }
} }
/*
Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
*/
#include "MagFieldElements/BFieldCacheZR.h"
#include <cmath>
void
BFieldCacheZR::getB(const double* ATH_RESTRICT xyz,
double r,
double* ATH_RESTRICT B,
double* ATH_RESTRICT deriv) const
{
const double x = xyz[0];
const double y = xyz[1];
const double z = xyz[2];
// fractional position inside this bin
const double fz = (z - m_zmin) * m_invz;
const double gz = 1.0 - fz;
const double fr = (r - m_rmin) * m_invr;
const double gr = 1.0 - fr;
// interpolate field values in z, r
double Bzr[2];
for (int i = 0; i < 2; ++i) { // z, r components
const double* field = m_field[i];
Bzr[i] = gz * (gr * field[0] + fr * field[1]) +
fz * (gr * field[2] + fr * field[3]);
}
// convert (Bz,Br) to (Bx,By,Bz)
double invr;
if (r > 0.0) {
invr = 1.0 / r;
} else {
invr = 0.0;
}
const double c(x * invr);
const double s(y * invr);
B[0] = Bzr[1] * c;
B[1] = Bzr[1] * s;
B[2] = Bzr[0];
// compute field derivatives if requested
if (deriv) {
std::array<double, 2> dBdz;
std::array<double, 2> dBdr;
for (int j = 0; j < 2; ++j) { // Bz, Br components
const double* field = m_field[j];
dBdz[j] =
m_invz * (gr * (field[2] - field[0]) + fr * (field[3] - field[1]));
dBdr[j] =
m_invr * (gz * (field[1] - field[0]) + fz * (field[3] - field[2]));
}
// convert to cartesian coordinates
const double cc = c * c;
const double cs = c * s;
const double ss = s * s;
const double sinvr = s * invr;
const double cinvr = c * invr;
deriv[0] = cc * dBdr[1] + sinvr * B[1];
deriv[1] = cs * dBdr[1] - cinvr * B[1];
deriv[2] = c * dBdz[1];
deriv[3] = cs * dBdr[1] - sinvr * B[0];
deriv[4] = ss * dBdr[1] + cinvr * B[0];
deriv[5] = s * dBdz[1];
deriv[6] = c * dBdr[0];
deriv[7] = s * dBdr[0];
deriv[8] = dBdz[0];
}
}
...@@ -122,15 +122,6 @@ public: ...@@ -122,15 +122,6 @@ public:
BFieldCache cache3d; BFieldCache cache3d;
double z{ 0 }, r{ 1250 }, phi{ 1.6 }; double z{ 0 }, r{ 1250 }, phi{ 1.6 };
// if (doDebug) std::cout << "do getCache old " << '\n';
// zone.m_doNew = false;
// zone.getCache(z, r, phi, cache3d, 1);
// cache3d.printField();
// if (doDebug) std::cout << "do getCache new " << '\n';
// zone.m_doNew = true;
// zone.getCache(z, r, phi, cache3d, 1);
// cache3d.printField();
// get field at steps of 10 mm from 1200 to 1300 // get field at steps of 10 mm from 1200 to 1300
int status{ 0 }; int status{ 0 };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment