CMS 3D CMS Logo

BFit3D.cc
Go to the documentation of this file.
1 #include <cmath>
2 #ifndef M_PI
3 #define M_PI 3.1415926535897932385
4 #endif
5 
6 #include "BFit3D_data.h"
7 
8 using namespace magfieldparam;
9 
10 //_______________________________________________________________________________
11 void BFit3D::SetCoeff_Linear(const double B)
12 {
13  unsigned jj, kk = 1;
14  double w_0, w_1, B_mod = fabs(B);
15  if (B_mod <= B_nom[0]) {
16  w_0 = B / B_nom[0];
17  for (jj = 0; jj < 360; ++jj) {
18  C[jj] = w_0*C0[jj][0];
19  }
20  } else if (B_mod >= B_nom[3]) {
21  w_0 = B / B_nom[3];
22  for (jj = 0; jj < 360; ++jj) {
23  C[jj] = w_0*C0[jj][3];
24  }
25  } else {
26  while (B_nom[kk] < B_mod) ++kk; //Simple linear search
27  w_1 = (B_mod - B_nom[kk-1])/(B_nom[kk] - B_nom[kk-1]);
28  w_0 = 1.0 - w_1;
29  if (B < 0.) {
30  w_0 = -w_0;
31  w_1 = -w_1;
32  }
33  for (jj = 0; jj < 360; ++jj) {
34  C[jj] = w_0*C0[jj][kk-1] + w_1*C0[jj][kk];
35  }
36  }
37 }
38 
39 //_______________________________________________________________________________
40 void BFit3D::SetCoeff_Spline(const double B)
41 {
42  int jc, k0 = 0, k1 = 1;
43  double dB2, dB = fabs(B);
44  if (dB >= B_nom[3]) { //Linear extrapolation for a large field
45  dB -= B_nom[3];
46  for (jc = 0; jc < 360; ++jc) C[jc] = C0[jc][3] + C1[jc][4]*dB;
47  } else {
48  if (dB < B_nom[0]) {
49  dB2 = dB*dB / (3.*B_nom[0]);
50  for (jc = 0; jc < 360; ++jc) C[jc] = (C2[jc][0]*dB2 + C1[jc][0])*dB;
51  } else {
52  while (B_nom[k1] < dB) ++k1; //Simple linear search
53  k0 = k1-1;
54  dB2 = (dB -= B_nom[k0]) / (3.*(B_nom[k1] - B_nom[k0]));
55  if (k1 < 3) { //"Regular" interval
56  for (jc = 0; jc < 360; ++jc)
57  C[jc] = (((C2[jc][k1] - C2[jc][k0])*dB2+C2[jc][k0])*dB + C1[jc][k1])*dB + C0[jc][k0];
58  } else { //The last interval
59  dB2 = (1.- dB2)*dB;
60  for (jc = 0; jc < 360; ++jc)
61  C[jc] = (C2[jc][k0]*dB2 + C1[jc][k1])*dB + C0[jc][k0];
62  }
63  }
64  }
65  if (B < 0) for (jc = 0; jc < 360; ++jc) C[jc] = -C[jc];
66 }
67 
68 //_______________________________________________________________________________
69 void BFit3D::GetField(const double r, const double z, const double phi,
70  double &Br, double &Bz, double &Bphi)
71 {
72 //Return field components in Br, Bz, Bphi. SetField must be called before use.
73 //
74  if (signed_rad || (r >= 0.)) HB->SetPoint(r, z, phi);
75  else HB->SetPoint(-r, z, phi+M_PI);
76  HB->EvalBr();
77  HB->EvalBz();
78  HB->EvalBphi();
79  Br = HB->GetBr (C);
80  Bz = HB->GetBz (C);
81  Bphi = HB->GetBphi(C);
82 }
83 
85 // //
86 // T E S T A R E A //
87 // //
89 
double GetBphi(double *coeff)
double GetBr(double *coeff)
static const double B_nom[4]
Definition: BFit3D.h:14
void GetField(const double r, const double z, const double phi, double &Br, double &Bz, double &Bphi)
Definition: BFit3D.cc:69
static const double C0[360][4]
Definition: BFit3D.h:15
HarmBasis3DCyl * HB
Definition: BFit3D.h:25
void SetCoeff_Linear(const double B)
Definition: BFit3D.cc:11
static const std::string B
#define M_PI
Definition: BFit3D.cc:3
static const double C1[360][5]
Definition: BFit3D.h:16
double C[360]
Definition: BFit3D.h:19
void SetPoint(const double r, const double z, const double phi)
void SetCoeff_Spline(const double B)
Definition: BFit3D.cc:40
static const double C2[360][3]
Definition: BFit3D.h:17
double GetBz(double *coeff)