#include <poly2d_base.h>
Public Member Functions | |
void | Collect () |
void | Compress () |
void | DecPow (int nvar) |
void | Diff (int nvar) |
double | Eval () |
double | GetVal (const double r, const double z) |
double | GetVal () |
void | IncPow (int nvar) |
void | Int (int nvar) |
bool | IsOn () |
bool | IsRZSet () |
poly2d_base (const poly2d_base &S) | |
poly2d_base () | |
void | Print (std::ostream &out=std::cout, const std::streamsize prec=5) |
void | Scale (const double C) |
virtual | ~poly2d_base () |
Static Public Member Functions | |
static unsigned | Count () |
static int | GetMaxPow () |
static void | IncNPwr (const unsigned N) |
static void | PrintTab (std::ostream &out=std::cout, const std::streamsize prec=5) |
static void | SetPoint (const double r, const double z) |
Static Protected Member Functions | |
static void | AdjustTab () |
static void | FillTable (const double r, const double z) |
static void | SetTabSize (const unsigned N) |
Protected Attributes | |
std::vector< poly2d_term > | data |
unsigned | max_pwr |
Static Protected Attributes | |
static const double | MIN_COEFF = DBL_EPSILON |
static unsigned | NPwr = 0 |
static unsigned | NTab = 0 |
static std::set< poly2d_base * > | poly2d_base_set |
static double | rval = 0. |
static double ** | rz_pow = 0 |
static bool | rz_set = false |
static double | zval = 0. |
Definition at line 44 of file poly2d_base.h.
magfieldparam::poly2d_base::poly2d_base | ( | ) | [inline] |
Definition at line 79 of file poly2d_base.h.
References max_pwr, and poly2d_base_set.
{ max_pwr = 0; poly2d_base_set.insert(this); }
magfieldparam::poly2d_base::poly2d_base | ( | const poly2d_base & | S | ) | [inline] |
Definition at line 83 of file poly2d_base.h.
References data, max_pwr, and poly2d_base_set.
{ data = S.data; max_pwr = S.max_pwr; poly2d_base_set.insert(this); }
poly2d_base::~poly2d_base | ( | ) | [virtual] |
Definition at line 49 of file poly2d_base.cc.
References GetMaxPow(), max_pwr, NPwr, NTab, poly2d_base_set, rz_pow, rz_set, and zval.
{ poly2d_base_set.erase(poly2d_base_set.find(this)); if(poly2d_base_set.size()) { //some objects left if (max_pwr >= NPwr) NPwr = GetMaxPow(); } else { if (rz_pow) { delete [] rz_pow[0]; //deleting the last instance -> memory cleanup delete [] rz_pow; } rz_pow = 0; rval = zval = 0.; NPwr = 0; NTab = 0; rz_set = false; // poly2d_base_set.resize(0); } }
void poly2d_base::AdjustTab | ( | ) | [static, protected] |
Definition at line 115 of file poly2d_base.cc.
References GetMaxPow(), NPwr, NTab, and SetTabSize().
void poly2d_base::Collect | ( | ) |
Definition at line 166 of file poly2d_base.cc.
References funct::C, data, max_pwr, MIN_COEFF, and np.
Referenced by Compress(), magfieldparam::rz_harm_poly::LadderDwn(), and magfieldparam::rz_harm_poly::LadderUp().
{ if (!(data.size())) return; unsigned j1, j2, rpow, zpow, noff = 0, jend = data.size(); double C; std::vector<bool> mask(jend, false); max_pwr = 0; for (j1 = 0; j1 < jend; ++j1) { if (mask[j1]) continue; C = data[j1].coeff; rpow = data[j1].np[0]; zpow = data[j1].np[1]; for (j2 = j1+1; j2 < jend; ++j2) { if (mask[j2]) continue; if ((rpow == data[j2].np[0]) && (zpow == data[j2].np[1])) { C += data[j2].coeff; mask[j2] = true; ++noff; } } if (fabs(C) > MIN_COEFF) { data[j1].coeff = C; if ((rpow = rpow+zpow) > max_pwr) max_pwr = rpow; } else { mask[j1] = true; ++noff; } } std::vector<poly2d_term> newdata; newdata.reserve(jend - noff); for (j1 = 0; j1 < jend; ++j1) { if (!(mask[j1])) newdata.push_back(data[j1]); } data.swap(newdata); }
void magfieldparam::poly2d_base::Compress | ( | ) | [inline] |
static unsigned magfieldparam::poly2d_base::Count | ( | ) | [inline, static] |
Reimplemented in magfieldparam::rz_harm_poly.
Definition at line 74 of file poly2d_base.h.
References poly2d_base_set.
Referenced by SetPoint().
{ return poly2d_base_set.size();}
void poly2d_base::DecPow | ( | int | nvar | ) |
Definition at line 272 of file poly2d_base.cc.
References magfieldparam::poly2d_term::coeff, data, GetMaxPow(), max_pwr, magfieldparam::poly2d_term::np, and NPwr.
Referenced by magfieldparam::rz_harm_poly::GetDecPow().
{ //Divide the polynomial by variable# nvar. Remove terms with zero coefficients //and also terms where the initial power of nvar is equal zero // poly2d_term v3; std::vector<poly2d_term> newdata; newdata.reserve(data.size()); unsigned cur_pwr = 0, maxp = 0, oldp = max_pwr; for (unsigned it = 0; it < data.size(); ++it) { v3 = data[it]; if ((v3.coeff != 0.) && (v3.np[nvar] > 0)) { --v3.np[nvar]; newdata.push_back(v3); if ((cur_pwr = v3.np[0] + v3.np[1]) > maxp) maxp = cur_pwr; } } newdata.resize(newdata.size()); max_pwr = maxp; data.swap(newdata); if (oldp >= NPwr) NPwr = GetMaxPow(); }
void poly2d_base::Diff | ( | int | nvar | ) |
Definition at line 222 of file poly2d_base.cc.
References magfieldparam::poly2d_term::coeff, data, GetMaxPow(), max_pwr, magfieldparam::poly2d_term::np, and NPwr.
Referenced by magfieldparam::rz_harm_poly::GetDiff().
{ //differentiate the polynomial by variable nvar. // poly2d_term v3; std::vector<poly2d_term> newdata; newdata.reserve(data.size()); unsigned cur_pwr = 0, maxp = 0, oldp = max_pwr; for (unsigned it = 0; it < data.size(); ++it) { v3 = data[it]; v3.coeff *= v3.np[nvar]; if (v3.coeff != 0.) { --v3.np[nvar]; newdata.push_back(v3); if ((cur_pwr = v3.np[0] + v3.np[1]) > maxp) maxp = cur_pwr; } } newdata.resize(newdata.size()); max_pwr = maxp; data.swap(newdata); if (oldp >= NPwr) NPwr = GetMaxPow(); }
double poly2d_base::Eval | ( | ) |
Definition at line 157 of file poly2d_base.cc.
References data, j, np, and rz_pow.
Referenced by magfieldparam::HarmBasis3DCyl::EvalBphi(), magfieldparam::HarmBasis3DCyl::EvalRZ(), and GetVal().
void poly2d_base::FillTable | ( | const double | r, |
const double | z | ||
) | [static, protected] |
Definition at line 89 of file poly2d_base.cc.
Referenced by SetPoint().
int poly2d_base::GetMaxPow | ( | ) | [static] |
Definition at line 102 of file poly2d_base.cc.
References poly2d_base_set.
Referenced by AdjustTab(), DecPow(), Diff(), IncPow(), Int(), and ~poly2d_base().
{ int curp, maxp = 0; std::set<poly2d_base*>::iterator it; for (it = poly2d_base_set.begin(); it != poly2d_base_set.end(); ++it) { curp = (*it)->max_pwr; if (curp > maxp) maxp = curp; } return maxp; }
double magfieldparam::poly2d_base::GetVal | ( | ) | [inline] |
double magfieldparam::poly2d_base::GetVal | ( | const double | r, |
const double | z | ||
) | [inline] |
Definition at line 107 of file poly2d_base.h.
References Eval(), and SetPoint().
static void magfieldparam::poly2d_base::IncNPwr | ( | const unsigned | N | ) | [inline, static] |
Definition at line 72 of file poly2d_base.h.
Referenced by magfieldparam::HarmBasis3DCyl::HarmBasis3DCyl().
void poly2d_base::IncPow | ( | int | nvar | ) |
Definition at line 260 of file poly2d_base.cc.
References data, GetMaxPow(), max_pwr, and NPwr.
Referenced by magfieldparam::rz_harm_poly::GetIncPow().
void poly2d_base::Int | ( | int | nvar | ) |
Definition at line 246 of file poly2d_base.cc.
References data, GetMaxPow(), max_pwr, and NPwr.
Referenced by magfieldparam::rz_harm_poly::GetInt().
{ //Integrate the polynomial by variable# nvar. Doesn't remove terms //with zero coefficients; if you suspect they can appear, use Compress() //after the integration. // for (unsigned it = 0; it < data.size(); ++it) { data[it].coeff /= ++data[it].np[nvar]; } ++max_pwr; if (max_pwr > NPwr) NPwr = GetMaxPow(); }
bool magfieldparam::poly2d_base::IsOn | ( | ) | [inline] |
bool magfieldparam::poly2d_base::IsRZSet | ( | ) | [inline] |
void poly2d_base::Print | ( | std::ostream & | out = std::cout , |
const std::streamsize | prec = 5 |
||
) |
Reimplemented in magfieldparam::rz_harm_poly.
Definition at line 204 of file poly2d_base.cc.
{ if (!data.size()) { out << "\"poly2d_base\" object contains no terms." << std::endl; return; } out << data.size() << " terms; max. degree = " << max_pwr << ":" << std::endl; std::streamsize old_prec = out.precision(); out.precision(prec); data[0].Print(out); for (unsigned it = 1; it < data.size(); ++it) { data[it].Print(out, false); } out << std::endl; out.precision(old_prec); }
void poly2d_base::PrintTab | ( | std::ostream & | out = std::cout , |
const std::streamsize | prec = 5 |
||
) | [static] |
Definition at line 122 of file poly2d_base.cc.
References NPwr, NTab, and rz_pow.
{ out << "poly2d_base table size NTab = " << NTab << "\tmax. power NPwr = " << NPwr << std::endl; if (rz_pow) { if (NPwr < NTab) { std::streamsize old_prec = out.precision(), wdt = prec+7; out.precision(prec); out << "Table content:" << std::endl; unsigned jr, jz; for (jr = 0; jr <= NPwr; ++jr) { for (jz = 0; jz <= (NPwr-jr); ++jz) { out << std::setw(wdt) << std::left << rz_pow[jr][jz]; } out << "|" << std::endl; } out.precision(old_prec); } else { out << "\tTable size is not adjusted." << std::endl; } } else { out << "\tTable is not allocated." << std::endl; } }
void poly2d_base::Scale | ( | const double | C | ) |
Definition at line 296 of file poly2d_base.cc.
References funct::C, and data.
Referenced by magfieldparam::rz_harm_poly::LadderDwn(), and magfieldparam::rz_harm_poly::LadderUp().
void poly2d_base::SetPoint | ( | const double | r, |
const double | z | ||
) | [static] |
Definition at line 148 of file poly2d_base.cc.
References Count(), FillTable(), NPwr, NTab, rz_set, SetTabSize(), and zval.
Referenced by GetVal().
void poly2d_base::SetTabSize | ( | const unsigned | N | ) | [static, protected] |
Definition at line 69 of file poly2d_base.cc.
References N, NTab, rz_pow, and zval.
Referenced by AdjustTab(), and SetPoint().
{ if (N <= NTab) return; if (rz_pow) { delete [] rz_pow[0]; delete [] rz_pow; } rz_pow = new double* [N]; unsigned jr, dN = N*(N+1)/2; rz_pow[0] = new double [dN]; memset(rz_pow[0], 0, dN*sizeof(double)); rz_pow[0][0] = 1.; for (jr = 1, dN = N; jr < N; ++jr, --dN) { rz_pow[jr] = rz_pow[jr-1] + dN; } rval = zval = 0.; NTab = N; }
std::vector<poly2d_term> magfieldparam::poly2d_base::data [protected] |
Definition at line 68 of file poly2d_base.h.
Referenced by Collect(), DecPow(), Diff(), Eval(), IncPow(), Int(), IsOn(), magfieldparam::rz_harm_poly::LadderDwn(), magfieldparam::rz_harm_poly::LadderUp(), poly2d_base(), Print(), magfieldparam::rz_harm_poly::rz_harm_poly(), and Scale().
unsigned magfieldparam::poly2d_base::max_pwr [protected] |
Definition at line 69 of file poly2d_base.h.
Referenced by Collect(), DecPow(), Diff(), IncPow(), Int(), poly2d_base(), Print(), magfieldparam::rz_harm_poly::rz_harm_poly(), and ~poly2d_base().
const double poly2d_base::MIN_COEFF = DBL_EPSILON [static, protected] |
Definition at line 57 of file poly2d_base.h.
Referenced by Collect().
unsigned poly2d_base::NPwr = 0 [static, protected] |
Definition at line 54 of file poly2d_base.h.
Referenced by AdjustTab(), DecPow(), Diff(), FillTable(), IncNPwr(), IncPow(), Int(), PrintTab(), magfieldparam::rz_harm_poly::rz_harm_poly(), SetPoint(), and ~poly2d_base().
unsigned poly2d_base::NTab = 0 [static, protected] |
Definition at line 53 of file poly2d_base.h.
Referenced by AdjustTab(), PrintTab(), SetPoint(), SetTabSize(), and ~poly2d_base().
std::set< poly2d_base * > poly2d_base::poly2d_base_set [static, protected] |
Definition at line 59 of file poly2d_base.h.
Referenced by Count(), magfieldparam::rz_harm_poly::GetMaxM(), GetMaxPow(), poly2d_base(), magfieldparam::rz_harm_poly::rz_harm_poly(), and ~poly2d_base().
double poly2d_base::rval = 0. [static, protected] |
Definition at line 49 of file poly2d_base.h.
double ** poly2d_base::rz_pow = 0 [static, protected] |
Definition at line 52 of file poly2d_base.h.
Referenced by Eval(), FillTable(), PrintTab(), SetTabSize(), and ~poly2d_base().
bool poly2d_base::rz_set = false [static, protected] |
Definition at line 55 of file poly2d_base.h.
Referenced by GetVal(), IsRZSet(), magfieldparam::rz_harm_poly::rz_harm_poly(), SetPoint(), and ~poly2d_base().
double poly2d_base::zval = 0. [static, protected] |
Definition at line 50 of file poly2d_base.h.
Referenced by SetPoint(), SetTabSize(), and ~poly2d_base().