Program Listing for File TimeDependentAdvectionField.cpp

Return to documentation for file (src/advectionField/TimeDependentAdvectionField.cpp)

#include "crpropa/advectionField/TimeDependentAdvectionField.h"
#include "crpropa/Common.h"


namespace crpropa {

OneDimensionalTimeDependentShock::OneDimensionalTimeDependentShock(double v_sh, double v1, double v0, double l_sh){

        setShockSpeed(v_sh);
        setSpeeds(v1, v0);
        setShockWidth(l_sh);
        setShockPosition(0.);
        setShockTime(0.);
}

Vector3d OneDimensionalTimeDependentShock::getField(const Vector3d &position, const double &time) const {

    double A = 0.5 * ( v1 + v0 );
    double B = 0.5 * ( v1 - v0 );

        double x = position.x;
    double xsh = v_sh * (time-t_sh0) + x_sh0; // shock position

        Vector3d v(0.);
    v.x = A - B * tanh( (x - xsh) / l_sh );

        return v;
}

double OneDimensionalTimeDependentShock::getDivergence(const Vector3d &position, const double &time) const {

        double dvdx = 0.;
        double x = position.x;

        if (time < t_sh0){
        // no shock
                dvdx = 0;
        }
    else{

        double B = 0.5 * ( v1 - v0 );
            double xsh = v_sh * (time-t_sh0) + x_sh0; // shock position
        dvdx = - B / l_sh * ( 1 - tanh( (x - xsh) / l_sh ) * tanh( (x - xsh) / l_sh ) );
    }

        return dvdx;
}


void OneDimensionalTimeDependentShock::setShockSpeed(double v) {
        v_sh = v;
}

void OneDimensionalTimeDependentShock::setSpeeds(double u1, double u0) {
        v1 = u1;
        v0 = u0;
}

void OneDimensionalTimeDependentShock::setShockWidth(double w) {
        l_sh = w;
}

void OneDimensionalTimeDependentShock::setShockPosition(double x) {
        x_sh0 = x;
}

void OneDimensionalTimeDependentShock::setShockTime(double t) {
        t_sh0 = t;
}

double OneDimensionalTimeDependentShock::getVshock() const {
    return v_sh;
}

double OneDimensionalTimeDependentShock::getV1() const {
    return v1;
}

double OneDimensionalTimeDependentShock::getV0() const {
    return v0;
}

double OneDimensionalTimeDependentShock::getShockWidth() const {
    return l_sh;
}

double OneDimensionalTimeDependentShock::getShockPosition(double time) const {
    return x_sh0 + v_sh * (time - t_sh0);
}

double OneDimensionalTimeDependentShock::getShockTime() const {
    return t_sh0;
}

//----------------------------------------------------------------

SedovTaylorBlastWave::SedovTaylorBlastWave(double E0, double rho0, double l_sh){
        setEnergy(E0);
        setDensity(rho0);
        setShockWidth(l_sh);
}

Vector3d SedovTaylorBlastWave::getField(const Vector3d &position, const double &time) const {
        double r = position.getR();
        Vector3d e_r = position.getUnitVector();

        if (time == 0)
                return 0. * e_r ;
        double A = rho0;

    double R = pow(E0 / A, 1./5.) * pow(time, 2. / 5. ); // position of shock front
    double vs = 2. / 5. * pow(E0 / A, 1. / 5.) * pow(time, -3. / 5.); // shock speed

    double xi = r / R; // dimensionless radius
    double V = 3 * (pow_integer<8>(xi) + 1) / (3 * pow_integer<8>(xi) + 5);
    double u = 0.5 * xi * vs * V * ( 1 - tanh( (xi - 1) * R / l_sh) );

        return u * e_r;
}

double SedovTaylorBlastWave::getDivergence(const Vector3d &position, const double &time) const {
        if (time == 0)
                return 0;
        double r = position.getR();
        double A = rho0;

        double R = pow(E0 / A, 1./5.) * pow(time, 2. / 5.);
    double vs = 2. / 5. * pow(E0 / A, 1. / 5.) * pow(time, -3. / 5.);

        double a = (-3 * pow_integer<3>(r) * (1 + pow_integer<8>(r/R)) * 1./pow_integer<2>(cosh((r - R)/l_sh)))
         / (l_sh * (5 + (3 * pow_integer<8>(r))/pow_integer<8>(R)))
     + (9 * pow_integer<2>(r) * (1 + pow_integer<8>(r/R)) * (1 - tanh((r - R)/l_sh)))
         / (5 + (3 * pow_integer<8>(r))/pow_integer<8>(R))
     - (72 *pow_integer<10>(r) * (1 + pow_integer<8>(r/R)) * (1 - tanh((r - R)/l_sh)))
         / (pow_integer<2>(5 + (3 * pow_integer<8>(r))/pow_integer<8>(R)) * pow_integer<8>(R))
     + (24 * pow_integer<10>(r) * (1 - tanh((r - R)/l_sh)))
         / ((5 + (3 * pow_integer<8>(r)) / pow_integer<8>(R)) * pow(R,8));

    double dudr = 0.5 * vs / pow_integer<2>(r) * 1./ R * a;

        return dudr;
}


void SedovTaylorBlastWave::setShockWidth(double w) {
        l_sh = w;
}

void SedovTaylorBlastWave::setDensity(double rho) {
        rho0 = rho;
}

void SedovTaylorBlastWave::setEnergy(double e) {
        E0 = e;
}

double SedovTaylorBlastWave::getShockRadius(double time) const{
        double A = rho0;
        return  pow(E0 / A, 1./5.) * pow(time, 2./5.);
}

double SedovTaylorBlastWave::getShockSpeed(double time) const{
    double A = rho0;
    return 2. / 5. * pow(E0 / A, 1. / 5.) * pow(time, -3. / 5.);
}

double SedovTaylorBlastWave::getShockWidth() const {
    return l_sh;
}

double SedovTaylorBlastWave::getDensity() const {
    return rho0;
}

double SedovTaylorBlastWave::getEnergy() const {
    return E0;
}

//----------------------------------------------------------------

} // namespace crpropa