Program Listing for File MagneticField.cpp

Return to documentation for file (src/magneticField/MagneticField.cpp)

#include "crpropa/magneticField/MagneticField.h"

namespace crpropa {

PeriodicMagneticField::PeriodicMagneticField(ref_ptr<MagneticField> field,
                const Vector3d &extends) :
                field(field), extends(extends), origin(0, 0, 0), reflective(false) {

}

PeriodicMagneticField::PeriodicMagneticField(ref_ptr<MagneticField> field,
                const Vector3d &extends, const Vector3d &origin, bool reflective) :
                field(field), extends(extends), origin(origin), reflective(reflective) {

}

Vector3d &PeriodicMagneticField::getOrigin() {
        return origin;
}

void PeriodicMagneticField::setOrigin(const Vector3d &origin) {
        this->origin = origin;
}

Vector3d &PeriodicMagneticField::getExtends() {
        return extends;
}

void PeriodicMagneticField::setExtends(const Vector3d &origin) {
        this->extends = extends;
}

bool PeriodicMagneticField::isReflective() {
        return reflective;
}

void PeriodicMagneticField::setReflective(bool reflective) {
        this->reflective = reflective;
}

Vector3d PeriodicMagneticField::getField(const Vector3d &position) const {
        Vector3d n = ((position - origin) / extends).floor();
        Vector3d p = position - origin - n * extends;

        if (reflective) {
                long mx = (long) ::fabs(n.x) % 2;
                if (mx == 1)
                        p.x = extends.x - p.x;
                long my = (long) ::fabs(n.y) % 2;
                if (my == 1)
                        p.y = extends.y - p.y;
                long mz = (long) ::fabs(n.z) % 2;
                if (mz == 1)
                        p.z = extends.z - p.z;
        }

        return field->getField(p);
}

void MagneticFieldList::addField(ref_ptr<MagneticField> field) {
        fields.push_back(field);
}

Vector3d MagneticFieldList::getField(const Vector3d &position) const {
        Vector3d b;
        for (int i = 0; i < fields.size(); i++)
                b += fields[i]->getField(position);
        return b;
}

MagneticFieldEvolution::MagneticFieldEvolution(ref_ptr<MagneticField> field,
        double m) :
        field(field), m(m) {
}

Vector3d MagneticFieldEvolution::getField(const Vector3d &position,
        double z) const {
        return field->getField(position) * pow(1+z, m);
}

Vector3d MagneticDipoleField::getField(const Vector3d &position) const {
                Vector3d r = (position - origin);
                Vector3d unit_r = r.getUnitVector();

                if (r.getR() == 0) { // singularity
                        return moment * 2 * mu0 / 3;
                }
                return (unit_r * (unit_r.dot(moment)) * 3 - moment) / pow(r.getR() / radius, 3) * mu0 / (4*M_PI);
}

#ifdef CRPROPA_HAVE_MUPARSER
RenormalizeMagneticField::RenormalizeMagneticField(ref_ptr<MagneticField> field,
                std::string expression) :
                field(field), expression(expression) {

        p =  new mu::Parser();
        p->DefineVar("B", &Bmag);
        p->DefineConst("tesla", tesla);
        p->DefineConst("gauss", gauss);
        p->DefineConst("muG", muG);
        p->DefineConst("nG", nG);
        p->SetExpr(expression);
}

Vector3d RenormalizeMagneticField::getField(const Vector3d &position) {
        Vector3d B = field->getField(position);
        Bmag = B.getR();
        return B * p->Eval();
}
#endif

} // namespace crpropa