aboutsummaryrefslogtreecommitdiff
path: root/Source/Initialization/PlasmaProfiles.cpp
blob: d9d207f7eb1ce3c11f7e9563f3efbd2339224211 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <PlasmaInjector.H>
#include <cmath>
#include <iostream>
#include <WarpXConst.H>

using namespace amrex;

Real PredefinedDensityProfile::getDensity(Real x, Real y, Real z) const {
    Real n;
    if ( which_profile == predefined_profile_flag::parabolic_channel ) {
        n = ParabolicChannel(x,y,z);
    }
    return n;
}

///
/// plateau between linear upramp and downramp, and parab transverse profile
///
Real PredefinedDensityProfile::ParabolicChannel(Real x, Real y, Real z) const {
    //  params = [z_start   ramp_up   plateau   ramp_down   rc       n0]
    Real z_start   = params[0];
    Real ramp_up   = params[1];
    Real plateau   = params[2];
    Real ramp_down = params[3];
    Real rc        = params[4];
    Real n0        = params[5];
    Real n;
    Real kp = PhysConst::q_e/PhysConst::c*sqrt( n0/(PhysConst::m_e*PhysConst::ep0) );

    if        ((z-z_start)>=0               and (z-z_start)<ramp_up                  ) {
        n = (z-z_start)/ramp_up;
    } else if ((z-z_start)>=ramp_up         and (z-z_start)<ramp_up+plateau          ) {
        n = 1;
    } else if ((z-z_start)>=ramp_up+plateau and (z-z_start)<ramp_up+plateau+ramp_down) {
        n = 1-((z-z_start)-ramp_up-plateau)/ramp_down;
    } else {
        n = 0;
    }
    n *= n0*(1+4*(x*x+y*y)/(kp*kp*std::pow(rc,4)));
    return n;
}