54 valarray<double> Ex_profile( grid.
axis.
Nx(0));
55 valarray<double> Ey_profile( grid.
axis.
Nx(0));
56 valarray<double> Ez_profile( grid.
axis.
Nx(0));
57 valarray<double> Bx_profile( grid.
axis.
Nx(0));
58 valarray<double> By_profile( grid.
axis.
Nx(0));
59 valarray<double> Bz_profile( grid.
axis.
Nx(0));
61 double ex_time_coeff(0.0);
62 double ey_time_coeff(0.0);
63 double ez_time_coeff(0.0);
64 double bx_time_coeff(0.0);
65 double by_time_coeff(0.0);
66 double bz_time_coeff(0.0);
82 for (
size_t ix(0);ix<Y.
SH(0,0,0).
numx();++ix)
84 if (ex_time_coeff > 1e-20) Y.
EMF().
Ex()(ix) = Ex_profile[ix]*ex_time_coeff;
85 if (ey_time_coeff > 1e-20) Y.
EMF().
Ey()(ix) = Ey_profile[ix]*ey_time_coeff;
86 if (ez_time_coeff > 1e-20) Y.
EMF().
Ez()(ix) = Ez_profile[ix]*ez_time_coeff;
87 if (bx_time_coeff > 1e-20) Y.
EMF().
Bx()(ix) = Bx_profile[ix]*bx_time_coeff;
88 if (by_time_coeff > 1e-20) Y.
EMF().
By()(ix) = By_profile[ix]*by_time_coeff;
89 if (bz_time_coeff > 1e-20) Y.
EMF().
Bz()(ix) = Bz_profile[ix]*bz_time_coeff;
101 valarray<double> Ex_profile( grid.
axis.
Nx(0));
102 valarray<double> Ey_profile( grid.
axis.
Nx(0));
103 valarray<double> Ez_profile( grid.
axis.
Nx(0));
104 valarray<double> Bx_profile( grid.
axis.
Nx(0));
105 valarray<double> By_profile( grid.
axis.
Nx(0));
106 valarray<double> Bz_profile( grid.
axis.
Nx(0));
117 double time_coeff(-1.0);
121 double pulse_start(
Input::List().trav_wave_center[n] -
125 double pulse_end(
Input::List().trav_wave_center[n] +
129 double normalized_time(0.0);
134 if (time >= pulse_start && time <= pulse_end)
140 time_coeff = 6.0 * pow(normalized_time,5.0);
141 time_coeff -= 15.0 * pow(normalized_time,4.0);
142 time_coeff += 10.0 * pow(normalized_time,3.0);
154 time_coeff = 15.0 * pow(normalized_time,4.0);
155 time_coeff -= 6.0 * pow(normalized_time,5.0);
156 time_coeff -= 10.0 * pow(normalized_time,3.0);
161 if (time_coeff > 0.0)
163 for (
size_t ix(0);ix<Y.
SH(0,0,0).
numx();++ix)
165 Y.
EMF().
Ex()(ix) += Ex_profile[ix]*time_coeff;
166 Y.
EMF().
Ey()(ix) += Ey_profile[ix]*time_coeff;
167 Y.
EMF().
Ez()(ix) += Ez_profile[ix]*time_coeff;
168 Y.
EMF().
Bx()(ix) += Bx_profile[ix]*time_coeff;
169 Y.
EMF().
By()(ix) += By_profile[ix]*time_coeff;
170 Y.
EMF().
Bz()(ix) += Bz_profile[ix]*time_coeff;
184 valarray<double> dens_profile( grid.
axis.
Nx(0));
185 valarray<double> temp_profile( grid.
axis.
Nx(0));
186 valarray<double> f10x_profile( grid.
axis.
Nx(0));
187 valarray<double> f20x_profile( grid.
axis.
Nx(0));
188 valarray<double> pedestal_profile( grid.
axis.
Nx(0));
190 valarray<double> hydro_dens_profile( grid.
axis.
Nx(0));
191 valarray<double> hydro_temp_profile( grid.
axis.
Nx(0));
192 valarray<double> hydro_vel_profile( grid.
axis.
Nx(0));
193 valarray<double> hydro_Z_profile( grid.
axis.
Nx(0));
212 if (
Input::List().
init_f1)
init_f1(s, Y.
SH(s,1,0), grid.
axis.
p(s), grid.
axis.
x(0), dens_profile, temp_profile, f10x_profile, Y.
SH(s,0,0), Y.
DF(s).
mass());
224 Y.
EMF() =
static_cast<complex<double>
>(0.0);
240 for (
size_t i(0); i < temp_profile.size(); ++i)
245 Y.
HYDRO().
vx(i) = hydro_vel_profile[i];
246 Y.
HYDRO().
Z(i) = hydro_Z_profile[i];
259 valarray<double>& density, valarray<double>& temperature,
const double mass,
const valarray<double>& pedestal){
262 double alpha, coeff, coefftemp;
265 alpha = sqrt(3.0*tgamma(3.0/m)/2.0/tgamma(5.0/m));
266 coeff = m/alpha/alpha/alpha/tgamma(3.0/m);
267 coeff *= sqrt(M_PI)/4.0;
270 for (
int j(0); j < h.
numx(); ++j){
272 coefftemp = coeff*density[j]/pow(2.0*M_PI*temperature[j]*mass,1.5);
273 for (
int k(0); k < h.
nump(); ++k){
275 h(k,j) = coefftemp*exp(-1.0*pow((p[k])/alpha/sqrt(2.0*temperature[j]*mass),m));
276 h(k,j)+= pedestal[j];
301 valarray<double>& density, valarray<double>& temperature, valarray<double>& f10x,
const SHarmonic1D& f0,
const double mass){
304 double alpha, coeff, coefftemp;
309 double idp = -0.5/(p[1]-p[0]);
311 alpha = sqrt(3.0*tgamma(3.0/m)/2.0/tgamma(5.0/m));
312 coeff = m/4.0*sqrt(M_PI)*alpha/alpha/alpha/tgamma(3.0/m);
314 for (
int j(0); j < h.
numx(); ++j){
316 coefftemp = coeff*density[j]/pow(2.0*M_PI*temperature[j]*mass,1.5)*f10x[j];
317 for (
int k(0); k < h.
nump(); ++k){
320 h(k,j) = idp*df0(k,j)*pow(p[k],3.0)*f10x[j];
334 valarray<double>& density, valarray<double>& temperature, valarray<double>& f20x,
const double mass){
337 double alpha, coeff, coefftemp;
341 alpha = sqrt(3.0*tgamma(3.0/m)/2.0/tgamma(5.0/m));
345 for (
int j(0); j < h.
numx(); ++j){
348 coefftemp = coeff*density[j]/pow(2.0*M_PI*temperature[j]/mass,1.5);
349 for (
int k(0); k < h.
nump(); ++k){
354 h(k,j)= 2.0*coefftemp*exp(-pow((p[k]-3.0)/alpha/sqrt(2.0*temperature[j]/mass),m));
380 if (!parser.compile(expression_str,expression))
382 printf(
"Error: %s\tExpression: %s\n",
383 parser.error().c_str(),
384 expression_str.c_str());
386 for (std::size_t i = 0; i < parser.error_count(); ++i)
388 error_t error = parser.get_error(i);
389 printf(
"Error: %02d Position: %02d Type: [%s] Msg: %s Expr: %s\n",
391 static_cast<int>(error.token.position),
392 exprtk::parser_error::to_str(error.mode).c_str(),
393 error.diagnostic.c_str(),
394 expression_str.c_str());
413 std::size_t posL = str_profile.find(
"{");
414 std::size_t posR = str_profile.find(
"}");
417 if (str_profile[0] ==
'c')
420 profile = std::stod(str_profile.substr(posL+1,posR-(posL+1)));
424 if (str_profile[0] ==
'f')
427 std::string expression_str = str_profile.substr(posL+1,posR-(posL+1));
430 symbol_table.add_constants();
432 symbol_table.add_variable(
"x",xstr);
436 expression.register_symbol_table(symbol_table);
440 checkparse(parser, expression_str, expression);
442 for (
size_t i(0); i < profile.size(); ++i) {
448 profile[i] = expression.value();
454 if (str_profile[0] ==
'p'){
455 std::string pcw_pairs = str_profile.substr(posL+1,posR-(posL+1));
456 vector<size_t> positions_comma, positions_semicolon;
457 vector<double> loc,val;
458 size_t pos = pcw_pairs.find(
',', 0);
459 while(pos != string::npos)
461 positions_comma.push_back(pos);
462 pos = pcw_pairs.find(
',',pos+1);
465 pos = pcw_pairs.find(
';', 0);
466 while(pos != string::npos)
468 positions_semicolon.push_back(pos);
469 pos = pcw_pairs.find(
';',pos+1);
472 if (positions_comma.size() != positions_semicolon.size()){
473 std::cout <<
"Error in piecewise input, the values must be supplied in pairs with ',' in between the two values in each pair, and ending each pair with a ';'. E.g. {0.1,1.0;0.2,1.5;} \n";
479 loc.push_back(std::stod(pcw_pairs.substr(0,positions_comma[0]-1)));
480 val.push_back(std::stod(pcw_pairs.substr(positions_comma[0]+1,positions_semicolon[0]-positions_comma[0]-1)));
485 for (
size_t i(1); i < positions_comma.size(); ++i) {
487 loc.push_back(std::stod(pcw_pairs.substr(positions_semicolon[i-1]+1,positions_comma[i]-positions_semicolon[i-1]-1)));
488 val.push_back(std::stod(pcw_pairs.substr(positions_comma[i]+1,positions_semicolon[i]-positions_comma[i]-1)));
498 for (
size_t i(0); i < grid.size(); ++i) {
501 if (grid[i] < loc[0]) xx += loc[loc.size()-1] - loc[0];
502 if (grid[i] > loc[loc.size()-1]) xx += loc[0]-loc[loc.size()-1] ;
504 while ((xx > loc[t]) && (t < loc.size()-1)) ++t;
505 tmp_x = val[t-1] + (val[t]-val[t-1])/(loc[t]-loc[t-1])
524 std::size_t posL = str_profile.find(
"{");
525 std::size_t posR = str_profile.find(
"}");
528 if (str_profile[0] ==
'c')
531 output = std::stod(str_profile.substr(posL+1,posR-(posL+1)));
535 if (str_profile[0] ==
'f')
538 std::string expression_str = str_profile.substr(posL+1,posR-(posL+1));
541 symbol_table.add_constants();
543 symbol_table.add_variable(
"t",xstr);
547 expression.register_symbol_table(symbol_table);
551 checkparse(parser, expression_str, expression);
559 output = expression.value();
636 std::size_t posL = str_profile.find(
"{");
637 std::size_t posR = str_profile.find(
"}");
640 if (str_profile[0] ==
'c')
643 output = std::stod(str_profile.substr(posL+1,posR-(posL+1)));
647 if (str_profile[0] ==
'f')
650 std::string expression_str = str_profile.substr(posL+1,posR-(posL+1));
653 symbol_table.add_constants();
655 symbol_table.add_variable(
"x",xstr);
656 symbol_table.add_variable(
"t",tstr);
660 expression.register_symbol_table(symbol_table);
664 checkparse(parser, expression_str, expression);
667 for (
size_t i(0); i < output.size(); ++i) {
670 output[i] = expression.value();
valarray< double > & temperaturearray() const
void init_f0(size_t s, SHarmonic1D &h, const valarray< double > &p, const valarray< double > &x, valarray< double > &density, valarray< double > &temperature, const double mass, const valarray< double > &pedestal)
exprtk::parser< double > parser_t
Underlying data structures.
void applyexternalfields(Grid_Info &grid, State1D &Y, double time)
exprtk::expression< double > expression_t
exprtk::symbol_table< double > symbol_table_t
void parsetwovariableprofile(const valarray< double > &grid, const double &input, std::string &str_profile, valarray< double > &ouput)
{ function_description }
exprtk::parser_error::type error_t
void initialize(State1D &Y, Grid_Info &grid)
void init_f1(size_t s, SHarmonic1D &h, const valarray< double > &p, const valarray< double > &x, valarray< double > &density, valarray< double > &temperature, valarray< double > &f10x, const SHarmonic1D &f0, const double mass)
valarray< double > & vyarray() const
valarray< double > & Zarray() const
double & temperature(size_t i)
DistFunc1D & DF(size_t s)
SHarmonic1D & SH(size_t s, size_t lh, size_t mh)
Grid Setup - Declaration.
Fields, Distributions, Harmonics, States - Declarations.
valarray< double > & densityarray() const
valarray< double > & vzarray() const
void init_f2(size_t s, SHarmonic1D &h, const valarray< double > &p, const valarray< double > &x, valarray< double > &density, valarray< double > &temperature, valarray< double > &f20x, const double mass)
valarray< T > p(size_t i) const
const Algorithms::AxisBundle< double > axis
void applytravelingwave(Grid_Info &grid, State1D &Y, double time)
double & density(size_t i)
size_t Nx(size_t i) const
valarray< double > & vxarray() const
void parseprofile(const valarray< double > &grid, std::string &str_profile, valarray< double > &profile)
{ function_description }
valarray< T > x(size_t i) const
void checkparse(parser_t &parser, std::string &expression_str, expression_t &expression)