237 template<jit::
float_scalar T,
bool SAFE_MATH=false>
261 template<jit::complex_scalar T,
bool SAFE_MATH=false>
272 auto zeta2 = zeta*zeta;
273 auto zeta4 = zeta2*zeta2;
274 auto zeta6 = zeta4*zeta2;
276 2.0*(1.0 - 2.0/3.0*zeta2
278 - 8.0/105.0*zeta6)*zeta;
288 template<jit::complex_scalar T,
bool SAFE_MATH=false>
306 concept z_func = std::is_base_of<z_function<typename Z::base, Z::safe_math>, Z>::value;
324 template<jit::
float_scalar T,
bool SAFE_MATH=false>
331 return n*q*q/(epsilon0*m*c*c);
346 template<jit::
float_scalar T,
bool SAFE_MATH=false>
348 build_cyclotron_frequency(
const T q,
364 template<jit::
float_scalar T,
bool SAFE_MATH=false>
399 template<jit::
float_scalar T,
bool SAFE_MATH=false>
450 template<jit::
float_scalar T,
bool SAFE_MATH=false>
476 auto npar2 = k_vec->get_z()*k_vec->get_z()*c*c/(w*w);
477 auto nperp2 = (k_vec->get_x()*k_vec->get_x() +
478 k_vec->get_y()*k_vec->get_y())*c*c/(w*w);
479 return npar2 + nperp2 - c;
489 template<jit::
float_scalar T,
bool SAFE_MATH=false>
496 const T
mu0 = M_PI*4.0E-7;
498 const T
q = 1.602176634E-19;
500 const T
me = 9.1093837015E-31;
511 template<jit::
float_scalar T,
bool SAFE_MATH=false>
539 auto ne = eq->get_electron_density(x, y, z);
544 auto te = eq->get_electron_temperature(x, y, z);
554 auto b_vec = eq->get_magnetic_field(x, y, z);
557 kpara2 = k_vec->dot(k_vec);
559 auto b_hat = b_vec->unit();
560 auto kpara = b_hat->dot(k_vec);
561 kpara2 = kpara*kpara;
564 return wpe2 + 3.0/2.0*kpara2*vterm2 - w*w;
574 template<jit::
float_scalar T,
bool SAFE_MATH=false>
602 auto ne = eq->get_electron_density(x, y, z);
603 auto wpe2 = build_plasma_frequency(ne,
612 "Expected equilibrium with no magnetic field.");
614 auto k2 = k_vec->dot(k_vec);
616 return wpe2 + k2 - w*w;
626 template<jit::
float_scalar T,
bool SAFE_MATH=false>
654 const T mi = eq->get_ion_mass(0);
655 auto te = eq->get_electron_temperature(x, y, z);
656 auto ti = eq->get_ion_temperature(0, x, y, z);
663 auto b_vec = eq->get_magnetic_field(x, y, z);
666 kpara2 = k_vec->dot(k_vec);
668 auto b_hat = b_vec->unit();
669 auto kpara = b_hat->dot(k_vec);
670 kpara2 = kpara*kpara;
673 return kpara2*vs2 - w*w;
683 template<jit::
float_scalar T,
bool SAFE_MATH=false>
708 auto well = c - 0.5*exp(-(x*x + y*y)/0.1);
709 auto npar2 = k_vec->get_z()*k_vec->get_z()*c*c/(w*w);
710 auto nperp2 = (k_vec->get_x()*k_vec->get_x() +
711 k_vec->get_y()*k_vec->get_y())*c*c/(w*w);
712 return npar2 + nperp2 - well;
722 template<jit::
float_scalar T,
bool SAFE_MATH=false>
751 const T mi = eq->get_ion_mass(0);
753 auto te = eq->get_electron_temperature(x, y, z);
754 auto ti = eq->get_ion_temperature(0, x, y, z);
761 auto b_vec = eq->get_magnetic_field(x, y, z);
768 auto b_hat = b_vec->unit();
769 auto kperp = b_hat->cross(k_vec)->length();
770 auto kperp2 = kperp*kperp;
774 return wce - kperp2*vs2 - w*w;
784 template<jit::
float_scalar T,
bool SAFE_MATH=false>
811 auto ne = eq->get_electron_density(x, y, z);
812 auto wpe2 = build_plasma_frequency(ne,
820 auto b_vec = eq->get_magnetic_field(x, y, z);
821 auto b_hat = b_vec->unit();
822 auto nperp = b_hat->cross(n);
823 auto nperp2 = nperp->dot(nperp);
827 return 1.0 - wpe2/w2 - nperp2;
837 template<jit::
float_scalar T,
bool SAFE_MATH=false>
869 auto ne = eq->get_electron_density(x, y, z);
870 auto wpe2 = build_plasma_frequency(ne,
876 auto b_vec = eq->get_magnetic_field(x, y, z);
877 auto b_len = b_vec->length();
885 auto b_hat = b_vec->unit();
886 auto nperp = b_hat->cross(n);
887 auto nperp2 = nperp->dot(nperp);
889 auto wh = wpe2 + wec*wec;
893 return 1.0 - wpe2/(w2)*(w2 - wpe2)/(w2 - wh) - nperp2;
903 template<jit::
float_scalar T,
bool SAFE_MATH=false>
951 auto ne = eq->get_electron_density(x, y, z);
952 auto wpe2 = build_plasma_frequency(ne,
957 auto b_vec = eq->get_magnetic_field(x, y, z);
958 auto b_len = b_vec->length();
965 auto denome = 1.0 - ec*ec/w2;
966 auto e11 = 1.0 - (wpe2/w2)/denome;
967 auto e12 = ((ec/w)*(wpe2/w2))/denome;
970 for (
size_t i = 0, ie = eq->get_num_ion_species(); i < ie; i++) {
971 const T mi = eq->get_ion_mass(i);
972 const T charge =
static_cast<T
> (eq->get_ion_charge(i))
975 auto ni = eq->get_ion_density(i, x, y, z);
976 auto wpi2 = build_plasma_frequency(ni, charge, mi,
979 auto ic = build_cyclotron_frequency(charge, b_len, mi,
982 auto denomi = 1.0 - ic*ic/w2;
983 e11 = e11 - (wpi2/w2)/denomi;
984 e12 = e12 + ((ic/w)*(wpi2/w2))/denomi;
993 auto b_hat = b_vec->unit();
995 auto npara = b_hat->dot(n);
996 auto npara2 = npara*npara;
997 auto nperp = b_hat->cross(n)->length();
998 auto nperp2 = nperp*nperp;
1001 auto m11 = e11 - npara2;
1003 auto m13 = npara*nperp;
1004 auto m22 = e11 - npara2 - nperp2;
1005 auto m33 = e33 - nperp2;
1007 return (m11*m22 - m12*m12)*m33 - m22*(m13*m13);
1017 template<jit::
float_scalar T,
bool SAFE_MATH=false>
1051 auto b_vec = eq->get_magnetic_field(x, y, z);
1052 auto b_len = b_vec->length();
1053 auto b_hat = b_vec/b_len;
1054 auto ne = eq->get_electron_density(x, y, z);
1055 auto te = eq->get_electron_temperature(x, y, z);
1072 auto P = wpe2/(w*w);
1073 auto q = P/(2.0*(1.0 + ec/w));
1076 auto n2 = n->dot(n);
1077 auto npara = n->dot(b_hat);
1078 auto npara2 = npara*npara;
1079 auto nperp = b_hat->cross(n);
1080 auto nperp2 = nperp->dot(nperp);
1081 auto n2nperp2 = n2*nperp2;
1083 auto q_func = 1.0 - 2.0*
q;
1084 auto n_func = n2 + npara2;
1085 auto p_func = 1.0 - P;
1087 auto gamma1 = (1.0 -
q)*n2nperp2
1088 + p_func*(n2*npara2 - (1.0 -
q)*n_func)
1089 + q_func*(p_func - nperp2);
1090 auto gamma0 = nperp2*(n2 - 2.0*q_func) + p_func*(2.0*q_func - n_func);
1092 return -P/2.0*(1.0 + ec/w)*gamma0 + (1.0 - ec*ec/(w*w))*gamma1;
1099 template<jit::complex_scalar T, z_func Z,
bool SAFE_MATH=false>
1149 auto b_vec = eq->get_magnetic_field(x, y, z);
1150 auto b_len = b_vec->length();
1151 auto b_hat = b_vec/b_len;
1152 auto ne = eq->get_electron_density(x, y, z);
1153 auto te = eq->get_electron_temperature(x, y, z);
1170 auto P = wpe2/(w*w);
1171 auto q = P/(2.0*(1.0 + ec/w));
1174 auto n2 = n->dot(n);
1175 auto npara = n->dot(b_hat);
1176 auto npara2 = npara*npara;
1177 auto nperp = b_hat->cross(n);
1178 auto nperp2 = nperp->dot(nperp);
1180 auto zeta = (1.0 - ec/w)/(npara*ve);
1181 auto Z_func = this->z.Z(zeta);
1182 auto zeta_func = 1.0 + zeta*Z_func;
1183 auto F = ve*zeta*w/(2.0*npara*ec);
1184 auto isigma = P*Z_func/(2.0*npara*ve);
1186 auto q_func = 1.0 - 2.0*
q;
1187 auto n_func = n2 + npara2;
1188 auto p_func = 1.0 - P;
1190 auto gamma5 = n2*npara2 - (1.0 -
q)*n_func + q_func;
1191 auto gamma2 = (n2 - q_func)
1192 + P*w/(4.0*ec*npara2)*(n_func - 2.0*q_func);
1193 auto gamma1 = nperp2*((1.0 -
q)*n2 - q_func)
1194 + p_func*(n2*npara2 - (1.0 -
q)*n_func + q_func);
1195 auto gamma0 = nperp2*(n2 - 2.0*q_func) + p_func*(2.0*q_func - n_func);
1197 return isigma*gamma0 + gamma1 + nperp2*P*w/ec*zeta_func*(gamma2 + gamma5*F);
1208 template<jit::
float_scalar T,
class Z,
bool SAFE_MATH=false>
1256 auto b_vec = eq->get_magnetic_field(x, y, z);
1257 auto b_hat = b_vec->unit();
1258 auto b_len = b_vec->length();
1259 auto ne = eq->get_electron_density(x, y, z);
1260 auto te = eq->get_electron_temperature(x, y, z);
1275 auto P = wpe2/(w*w);
1276 auto q = P/(2.0*(1.0 + ec/w));
1279 auto n2 = n->dot(n);
1280 auto npara = b_hat->dot(n);
1281 auto npara2 = npara*npara;
1282 auto nperp = b_hat->cross(n);
1283 auto nperp2 = nperp->dot(nperp);
1287 auto zeta = (1.0 - ec/w)/(npara*vtnorm);
1288 auto Z_func = this->z.Z(zeta);
1290 auto q_func = 1.0 - 2.0*
q;
1291 auto n_func = n2 + npara2;
1292 auto n2nperp2 = n2*nperp2;
1293 auto p_func = 1.0 - P;
1295 auto gamma5 = P*(n2*npara2 - (1.0 -
q)*n_func + q_func);
1296 auto gamma2 = P*w/ec*nperp2*(n2 - q_func)
1297 + P*P*w*w/(4.0*ec*ec)*(n_func - 2.0*q_func)*nperp2/npara2;
1298 auto gamma1 = (1.0 -
q)*n2nperp2
1299 + p_func*(n2*npara2 - (1.0 -
q)*n_func)
1300 + q_func*(p_func - nperp2);
1302 return -(1.0 + ec/w)*npara*vtnorm *
1303 (gamma1 + gamma2 + nperp2/(2.0*npara)*(w*w/(ec*ec))*vtnorm*zeta*gamma5)*(1.0/Z_func + zeta);
1312 concept function = std::is_base_of<dispersion_function<typename D::base, D::safe_math>, D>::value;
1319 template<function DISPERSION_FUNCTION>
1327 DISPERSION_FUNCTION::safe_math>
D;
1331 DISPERSION_FUNCTION::safe_math>
dxdt;
1334 DISPERSION_FUNCTION::safe_math>
dydt;
1337 DISPERSION_FUNCTION::safe_math>
dzdt;
1349 DISPERSION_FUNCTION::safe_math>
dsdt;
1370 DISPERSION_FUNCTION::safe_math> w,
1372 DISPERSION_FUNCTION::safe_math> kx,
1374 DISPERSION_FUNCTION::safe_math> ky,
1376 DISPERSION_FUNCTION::safe_math> kz,
1378 DISPERSION_FUNCTION::safe_math> x,
1380 DISPERSION_FUNCTION::safe_math> y,
1382 DISPERSION_FUNCTION::safe_math> z,
1384 DISPERSION_FUNCTION::safe_math> t,
1386 DISPERSION_FUNCTION::safe_math> &eq) :
1387 k_vec(kx*eq->get_esup1(x, y, z) +
1388 ky*eq->get_esup2(x, y, z) +
1389 kz*eq->get_esup3(x, y, z)),
1390 D(DISPERSION_FUNCTION().
D(w,
k_vec, x, y, z, t, eq)) {
1392 auto dkdx =
k_vec->df(x);
1393 auto dkdy =
k_vec->df(y);
1394 auto dkdz =
k_vec->df(z);
1396 auto dDdk_vec =
graph::vector<
typename DISPERSION_FUNCTION::base,
1397 DISPERSION_FUNCTION::safe_math> (
1398 this->D->df(
k_vec->get_x()),
1399 this->D->df(
k_vec->get_y()),
1400 this->D->df(
k_vec->get_z())
1403 auto dDdw = this->D->df(w);
1404 auto dDdkx = this->D->df(kx);
1405 auto dDdky = this->D->df(ky);
1406 auto dDdkz = this->D->df(kz);
1407 auto dDdx = this->D->df(x);
1408 auto dDdy = this->D->df(y);
1409 auto dDdz = this->D->df(z);
1412 dkdx = dkdx->remove_pseudo();
1413 dkdy = dkdy->remove_pseudo();
1414 dkdz = dkdz->remove_pseudo();
1415 dDdk_vec = dDdk_vec->remove_pseudo();
1417 dDdw = dDdw->remove_pseudo();
1418 dDdkx = dDdkx->remove_pseudo();
1419 dDdky = dDdky->remove_pseudo();
1420 dDdkz = dDdkz->remove_pseudo();
1421 dDdx = dDdx->remove_pseudo();
1422 dDdy = dDdy->remove_pseudo();
1423 dDdz = dDdz->remove_pseudo();
1429 dkxdt = (dDdx - dDdk_vec->dot(dkdx))/dDdw;
1430 dkydt = (dDdy - dDdk_vec->dot(dkdy))/dDdw;
1431 dkzdt = (dDdz - dDdk_vec->dot(dkdz))/dDdw;
1451 DISPERSION_FUNCTION::safe_math>
1453 DISPERSION_FUNCTION::safe_math> x,
1455 DISPERSION_FUNCTION::safe_math> inputs,
1456 const size_t index=0,
1457 const typename DISPERSION_FUNCTION::base tolerance = 1.0E-30,
1458 const size_t max_iterations = 1000) {
1462 DISPERSION_FUNCTION::safe_math> work(index);
1466 DISPERSION_FUNCTION::safe_math> (),
1467 tolerance, max_iterations);
1472 work.copy_to_host(x, x_var->data());
1474 return this->D*this->
D;
1483 DISPERSION_FUNCTION::safe_math>
1485 return this->D*this->
D;
1494 DISPERSION_FUNCTION::safe_math>
1505 DISPERSION_FUNCTION::safe_math>
1516 DISPERSION_FUNCTION::safe_math>
1527 DISPERSION_FUNCTION::safe_math>
1538 DISPERSION_FUNCTION::safe_math>
1549 DISPERSION_FUNCTION::safe_math>
1560 DISPERSION_FUNCTION::safe_math>
1571 DISPERSION_FUNCTION::safe_math>
1581 std::cout << std::endl;
1589 std::cout << std::endl;
1597 std::cout << std::endl;
1605 std::cout << std::endl;
1613 std::cout << std::endl;
1621 std::cout << std::endl;
1629 std::cout << std::endl;
Ion wave dispersion function.
Definition dispersion.hpp:627
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_vector< T, SAFE_MATH > k_vec, graph::shared_leaf< T, SAFE_MATH > x, graph::shared_leaf< T, SAFE_MATH > y, graph::shared_leaf< T, SAFE_MATH > z, graph::shared_leaf< T, SAFE_MATH > t, equilibrium::shared< T, SAFE_MATH > &eq)
Ion acoustic wave function.
Definition dispersion.hpp:645
Bohm-Gross dispersion function.
Definition dispersion.hpp:512
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_vector< T, SAFE_MATH > k_vec, graph::shared_leaf< T, SAFE_MATH > x, graph::shared_leaf< T, SAFE_MATH > y, graph::shared_leaf< T, SAFE_MATH > z, graph::shared_leaf< T, SAFE_MATH > t, equilibrium::shared< T, SAFE_MATH > &eq)
Bohm-Gross function.
Definition dispersion.hpp:530
Cold Plasma expansion dispersion function.
Definition dispersion.hpp:1018
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_vector< T, SAFE_MATH > k_vec, graph::shared_leaf< T, SAFE_MATH > x, graph::shared_leaf< T, SAFE_MATH > y, graph::shared_leaf< T, SAFE_MATH > z, graph::shared_leaf< T, SAFE_MATH > t, equilibrium::shared< T, SAFE_MATH > &eq)
Cold Plasma expansion Dispersion function.
Definition dispersion.hpp:1043
Cold Plasma Dispersion function.
Definition dispersion.hpp:904
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_vector< T, SAFE_MATH > k_vec, graph::shared_leaf< T, SAFE_MATH > x, graph::shared_leaf< T, SAFE_MATH > y, graph::shared_leaf< T, SAFE_MATH > z, graph::shared_leaf< T, SAFE_MATH > t, equilibrium::shared< T, SAFE_MATH > &eq)
Cold Plasma Dispersion function.
Definition dispersion.hpp:942
Interface for dispersion functions.
Definition dispersion.hpp:365
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_vector< T, SAFE_MATH > k_vec, graph::shared_leaf< T, SAFE_MATH > x, graph::shared_leaf< T, SAFE_MATH > y, graph::shared_leaf< T, SAFE_MATH > z, graph::shared_leaf< T, SAFE_MATH > t, equilibrium::shared< T, SAFE_MATH > &eq)=0
Interface for a dispersion function.
T base
Type def to retrieve the backend base type.
Definition dispersion.hpp:388
static constexpr bool safe_math
Retrieve template parameter of safe math.
Definition dispersion.hpp:390
Class interface to build dispersion relation functions.
Definition dispersion.hpp:1320
graph::shared_vector< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > k_vec
Wave number.
Definition dispersion.hpp:1324
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dydt()
Provide right hand side for y update.
Definition dispersion.hpp:1528
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dkydt()
Provide right hand side for z update.
Definition dispersion.hpp:1561
void print_dxdt()
Print out the latex expression for the dxdt.
Definition dispersion.hpp:1611
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dkxdt
Derivative with respect to kx.
Definition dispersion.hpp:1340
dispersion_interface(graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > w, graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > kx, graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > ky, graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > kz, graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > x, graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > y, graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > z, graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > t, equilibrium::shared< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > &eq)
Construct a new dispersion_interface.
Definition dispersion.hpp:1369
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dxdt
Derivative with respect to kx.
Definition dispersion.hpp:1331
void print_dkxdt()
Print out the latex expression for the dkxdt.
Definition dispersion.hpp:1587
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dydt
Derivative with respect to ky.
Definition dispersion.hpp:1334
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dkxdt()
Provide right hand side for z update.
Definition dispersion.hpp:1550
void print_dispersion()
Print out the latex expression for the dispersion relation.
Definition dispersion.hpp:1579
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dkydt
Derivative with respect to ky.
Definition dispersion.hpp:1343
void print_dkydt()
Print out the latex expression for the dkydt.
Definition dispersion.hpp:1595
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > D
Dispersion function.
Definition dispersion.hpp:1327
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dzdt
Derivative with respect to kz.
Definition dispersion.hpp:1337
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dkzdt()
Provide right hand side for z update.
Definition dispersion.hpp:1572
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dsdt()
Provide right hand side for s update.
Definition dispersion.hpp:1506
void print_dkzdt()
Print out the latex expression for the dkzdt.
Definition dispersion.hpp:1603
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > solve(graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > x, graph::input_nodes< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > inputs, const size_t index=0, const typename DISPERSION_FUNCTION::base tolerance=1.0E-30, const size_t max_iterations=1000)
Solve the dispersion relation for x.
Definition dispersion.hpp:1452
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dkzdt
Derivative with respect to kz.
Definition dispersion.hpp:1346
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dsdt
Derivative with respect to omega.
Definition dispersion.hpp:1349
void print_dydt()
Print out the latex expression for the dydt.
Definition dispersion.hpp:1619
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_d()
Get the dispersion function.
Definition dispersion.hpp:1495
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dzdt()
Provide right hand side for z update.
Definition dispersion.hpp:1539
void print_dzdt()
Print out the latex expression for the dzdt.
Definition dispersion.hpp:1627
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_residual()
Get the dispersion residual.
Definition dispersion.hpp:1484
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dxdt()
Provide right hand side for x update.
Definition dispersion.hpp:1517
Gaussian Well dispersion function.
Definition dispersion.hpp:684
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_vector< T, SAFE_MATH > k_vec, graph::shared_leaf< T, SAFE_MATH > x, graph::shared_leaf< T, SAFE_MATH > y, graph::shared_leaf< T, SAFE_MATH > z, graph::shared_leaf< T, SAFE_MATH > t, equilibrium::shared< T, SAFE_MATH > &eq)
Dispersion relation with a non uniform well.
Definition dispersion.hpp:700
Hot Plasma Expansion Dispersion function.
Definition dispersion.hpp:1209
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_vector< T, SAFE_MATH > k_vec, graph::shared_leaf< T, SAFE_MATH > x, graph::shared_leaf< T, SAFE_MATH > y, graph::shared_leaf< T, SAFE_MATH > z, graph::shared_leaf< T, SAFE_MATH > t, equilibrium::shared< T, SAFE_MATH > &eq)
Hot plasma expansion dispersion function.
Definition dispersion.hpp:1248
Hot Plasma Dispersion function.
Definition dispersion.hpp:1100
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_vector< T, SAFE_MATH > k_vec, graph::shared_leaf< T, SAFE_MATH > x, graph::shared_leaf< T, SAFE_MATH > y, graph::shared_leaf< T, SAFE_MATH > z, graph::shared_leaf< T, SAFE_MATH > t, equilibrium::shared< T, SAFE_MATH > &eq)
Hot Plasma Dispersion function.
Definition dispersion.hpp:1141
Electrostatic ion cyclotron wave dispersion function.
Definition dispersion.hpp:723
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_vector< T, SAFE_MATH > k_vec, graph::shared_leaf< T, SAFE_MATH > x, graph::shared_leaf< T, SAFE_MATH > y, graph::shared_leaf< T, SAFE_MATH > z, graph::shared_leaf< T, SAFE_MATH > t, equilibrium::shared< T, SAFE_MATH > &eq)
Dispersion relation for the O mode.
Definition dispersion.hpp:743
Light Wave dispersion function.
Definition dispersion.hpp:575
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_vector< T, SAFE_MATH > k_vec, graph::shared_leaf< T, SAFE_MATH > x, graph::shared_leaf< T, SAFE_MATH > y, graph::shared_leaf< T, SAFE_MATH > z, graph::shared_leaf< T, SAFE_MATH > t, equilibrium::shared< T, SAFE_MATH > &eq)
Light-wave function.
Definition dispersion.hpp:593
Ordinary wave dispersion function.
Definition dispersion.hpp:785
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_vector< T, SAFE_MATH > k_vec, graph::shared_leaf< T, SAFE_MATH > x, graph::shared_leaf< T, SAFE_MATH > y, graph::shared_leaf< T, SAFE_MATH > z, graph::shared_leaf< T, SAFE_MATH > t, equilibrium::shared< T, SAFE_MATH > &eq)
Dispersion relation for the O mode.
Definition dispersion.hpp:803
Physics.
Definition dispersion.hpp:490
const T q
Fundamental charge.
Definition dispersion.hpp:498
const T me
Electron mass.
Definition dispersion.hpp:500
const T c
Speed of light.
Definition dispersion.hpp:502
const T mu0
Vacuum permeability.
Definition dispersion.hpp:496
const T epsilon0
Vacuum permittivity.
Definition dispersion.hpp:494
Simple dispersion function.
Definition dispersion.hpp:451
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_vector< T, SAFE_MATH > k_vec, graph::shared_leaf< T, SAFE_MATH > x, graph::shared_leaf< T, SAFE_MATH > y, graph::shared_leaf< T, SAFE_MATH > z, graph::shared_leaf< T, SAFE_MATH > t, equilibrium::shared< T, SAFE_MATH > &eq)
Simple dispersion function.
Definition dispersion.hpp:467
Stiff dispersion function.
Definition dispersion.hpp:400
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_vector< T, SAFE_MATH > k_vec, graph::shared_leaf< T, SAFE_MATH > x, graph::shared_leaf< T, SAFE_MATH > y, graph::shared_leaf< T, SAFE_MATH > z, graph::shared_leaf< T, SAFE_MATH > t, equilibrium::shared< T, SAFE_MATH > &eq)
Stiff function.
Definition dispersion.hpp:433
Class interface to build dispersion relation functions.
Definition dispersion.hpp:289
virtual graph::shared_leaf< T, SAFE_MATH > Z(graph::shared_leaf< T, SAFE_MATH > zeta)
Method to build the Z function.
Definition dispersion.hpp:298
Class interface to build dispersion relation functions.
Definition dispersion.hpp:238
static constexpr bool safe_math
Retrieve template parameter of safe math.
Definition dispersion.hpp:252
T base
Type def to retrieve the backend base type.
Definition dispersion.hpp:250
virtual graph::shared_leaf< T, SAFE_MATH > Z(graph::shared_leaf< T, SAFE_MATH > zeta)=0
Method to build the Z function.
Class interface to build dispersion relation functions.
Definition dispersion.hpp:262
virtual graph::shared_leaf< T, SAFE_MATH > Z(graph::shared_leaf< T, SAFE_MATH > zeta)
Method to build the Z function.
Definition dispersion.hpp:271
Class representing a workflow manager.
Definition workflow.hpp:215
Dispersion concept.
Definition dispersion.hpp:1312
Dispersion concept.
Definition dispersion.hpp:306
Class signature to implement plasma equilibrium.
subroutine assert(test, message)
Assert check.
Definition f_binding_test.f90:38
Name space for dispersion functions.
Definition dispersion.hpp:227
std::shared_ptr< generic< T, SAFE_MATH > > shared
Convenience type alias for shared equilibria.
Definition equilibrium.hpp:470
constexpr shared_leaf< T, SAFE_MATH > zero()
Forward declare for zero.
Definition node.hpp:986
std::shared_ptr< vector_quantity< T, SAFE_MATH > > shared_vector
Convenience type for shared vector quantities.
Definition vector.hpp:142
shared_vector< T, SAFE_MATH > vector(shared_leaf< T, SAFE_MATH > x, shared_leaf< T, SAFE_MATH > y, shared_leaf< T, SAFE_MATH > z)
Build a shared vector quantity.
Definition vector.hpp:156
shared_leaf< T, SAFE_MATH > exp(shared_leaf< T, SAFE_MATH > x)
Define exp convenience function.
Definition math.hpp:544
std::shared_ptr< random_state_node< T, SAFE_MATH > > shared_random_state
Convenience type alias for shared sqrt nodes.
Definition random.hpp:263
std::vector< shared_variable< T, SAFE_MATH > > input_nodes
Convenience type alias for a vector of inputs.
Definition node.hpp:1711
shared_leaf< T, SAFE_MATH > erfi(shared_leaf< T, SAFE_MATH > x)
Define erfi convenience function.
Definition math.hpp:1620
shared_variable< T, SAFE_MATH > variable_cast(shared_leaf< T, SAFE_MATH > x)
Cast to a variable node.
Definition node.hpp:1727
shared_leaf< T, SAFE_MATH > sqrt(shared_leaf< T, SAFE_MATH > x)
Define sqrt convenience function.
Definition math.hpp:279
std::shared_ptr< leaf_node< T, SAFE_MATH > > shared_leaf
Convenience type alias for shared leaf nodes.
Definition node.hpp:676
shared_pseudo_variable< T, SAFE_MATH > pseudo_variable_cast(shared_leaf< T, SAFE_MATH > &x)
Cast to a pseudo variable node.
Definition node.hpp:1890
void newton(workflow::manager< T, SAFE_MATH > &work, graph::output_nodes< T, SAFE_MATH > vars, graph::input_nodes< T, SAFE_MATH > inputs, graph::shared_leaf< T, SAFE_MATH > func, graph::shared_random_state< T, SAFE_MATH > state, const T tolerance=1.0E-30, const size_t max_iterations=1000, const T step=1.0)
Determine the value of vars to minimize the loss function.
Definition newton.hpp:34
Sets up the kernel for a newtons method.