167 template<jit::
float_scalar T,
bool SAFE_MATH=false>
191 template<jit::complex_scalar T,
bool SAFE_MATH=false>
202 auto zeta2 = zeta*zeta;
203 auto zeta4 = zeta2*zeta2;
204 auto zeta6 = zeta4*zeta2;
206 2.0*(1.0 - 2.0/3.0*zeta2
208 - 8.0/105.0*zeta6)*zeta;
218 template<jit::complex_scalar T,
bool SAFE_MATH=false>
236 concept z_func = std::is_base_of<z_function<typename Z::base, Z::safe_math>, Z>::value;
254 template<jit::
float_scalar T,
bool SAFE_MATH=false>
261 return n*q*q/(epsilon0*m*c*c);
276 template<jit::
float_scalar T,
bool SAFE_MATH=false>
278 build_cyclotron_frequency(
const T q,
294 template<jit::
float_scalar T,
bool SAFE_MATH=false>
333 template<jit::
float_scalar T,
bool SAFE_MATH=false>
388 template<jit::
float_scalar T,
bool SAFE_MATH=false>
418 auto npar2 = kz*kz*c*c/(w*w);
419 auto nperp2 = (kx*kx + ky*ky)*c*c/(w*w);
420 return npar2 + nperp2 - c;
430 template<jit::
float_scalar T,
bool SAFE_MATH=false>
437 const T
mu0 = M_PI*4.0E-7;
439 const T
q = 1.602176634E-19;
441 const T
me = 9.1093837015E-31;
452 template<jit::
float_scalar T,
bool SAFE_MATH=false>
484 auto ne = eq->get_electron_density(x, y, z);
489 auto te = eq->get_electron_temperature(x, y, z);
499 auto b_vec = eq->get_magnetic_field(x, y, z);
500 auto k = kx*eq->get_esup1(x, y, z)
501 + ky*eq->get_esup2(x, y, z)
502 + kz*eq->get_esup3(x, y, z);
507 auto b_hat = b_vec->unit();
508 auto kpara = b_hat->dot(k);
509 kpara2 = kpara*kpara;
512 return wpe2 + 3.0/2.0*kpara2*vterm2 - w*w;
522 template<jit::
float_scalar T,
bool SAFE_MATH=false>
554 auto ne = eq->get_electron_density(x, y, z);
555 auto wpe2 = build_plasma_frequency(ne,
564 "Expected equilibrium with no magnetic field.");
566 auto k = kx*eq->get_esup1(x, y, z)
567 + ky*eq->get_esup2(x, y, z)
568 + kz*eq->get_esup3(x, y, z);
571 return wpe2 + k2 - w*w;
581 template<jit::
float_scalar T,
bool SAFE_MATH=false>
613 const T mi = eq->get_ion_mass(0);
614 auto te = eq->get_electron_temperature(x, y, z);
615 auto ti = eq->get_ion_temperature(0, x, y, z);
622 auto b_vec = eq->get_magnetic_field(x, y, z);
623 auto k = kx*eq->get_esup1(x, y, z)
624 + ky*eq->get_esup2(x, y, z)
625 + kz*eq->get_esup3(x, y, z);
630 auto b_hat = b_vec->unit();
631 auto kpara = b_hat->dot(k);
632 kpara2 = kpara*kpara;
635 return kpara2*vs2 - w*w;
645 template<jit::
float_scalar T,
bool SAFE_MATH=false>
674 auto well = c - 0.5*exp(-(x*x + y*y)/0.1);
675 auto npar2 = kz*kz*c*c/(w*w);
676 auto nperp2 = (kx*kx + ky*ky)*c*c/(w*w);
677 return npar2 + nperp2 - well;
687 template<jit::
float_scalar T,
bool SAFE_MATH=false>
720 const T mi = eq->get_ion_mass(0);
722 auto te = eq->get_electron_temperature(x, y, z);
723 auto ti = eq->get_ion_temperature(0, x, y, z);
730 auto b_vec = eq->get_magnetic_field(x, y, z);
737 auto k = kx*eq->get_esup1(x, y, z)
738 + ky*eq->get_esup2(x, y, z)
739 + kz*eq->get_esup3(x, y, z);
740 auto b_hat = b_vec->unit();
741 auto kperp = b_hat->cross(k)->length();
742 auto kperp2 = kperp*kperp;
746 return wce - kperp2*vs2 - w*w;
756 template<jit::
float_scalar T,
bool SAFE_MATH=false>
787 auto ne = eq->get_electron_density(x, y, z);
788 auto wpe2 = build_plasma_frequency(ne,
795 auto n = (kx*eq->get_esup1(x, y, z) +
796 ky*eq->get_esup2(x, y, z) +
797 kz*eq->get_esup3(x, y, z))/w;
798 auto b_vec = eq->get_magnetic_field(x, y, z);
799 auto b_hat = b_vec->unit();
800 auto nperp = b_hat->cross(n);
801 auto nperp2 = nperp->dot(nperp);
805 return 1.0 - wpe2/w2 - nperp2;
815 template<jit::
float_scalar T,
bool SAFE_MATH=false>
851 auto ne = eq->get_electron_density(x, y, z);
852 auto wpe2 = build_plasma_frequency(ne,
858 auto b_vec = eq->get_magnetic_field(x, y, z);
859 auto b_len = b_vec->length();
866 auto n = (kx*eq->get_esup1(x, y, z) +
867 ky*eq->get_esup2(x, y, z) +
868 kz*eq->get_esup3(x, y, z))/w;
869 auto b_hat = b_vec->unit();
870 auto nperp = b_hat->cross(n);
871 auto nperp2 = nperp->dot(nperp);
873 auto wh = wpe2 + wec*wec;
877 return 1.0 - wpe2/(w2)*(w2 - wpe2)/(w2 - wh) - nperp2;
887 template<jit::
float_scalar T,
bool SAFE_MATH=false>
939 auto ne = eq->get_electron_density(x, y, z);
940 auto wpe2 = build_plasma_frequency(ne,
945 auto b_vec = eq->get_magnetic_field(x, y, z);
946 auto b_len = b_vec->length();
953 auto denome = 1.0 - ec*ec/w2;
954 auto e11 = 1.0 - (wpe2/w2)/denome;
955 auto e12 = ((ec/w)*(wpe2/w2))/denome;
958 for (
size_t i = 0, ie = eq->get_num_ion_species(); i < ie; i++) {
959 const T mi = eq->get_ion_mass(i);
960 const T charge =
static_cast<T
> (eq->get_ion_charge(i))
963 auto ni = eq->get_ion_density(i, x, y, z);
964 auto wpi2 = build_plasma_frequency(ni, charge, mi,
967 auto ic = build_cyclotron_frequency(charge, b_len, mi,
970 auto denomi = 1.0 - ic*ic/w2;
971 e11 = e11 - (wpi2/w2)/denomi;
972 e12 = e12 + ((ic/w)*(wpi2/w2))/denomi;
980 auto n = (kx*eq->get_esup1(x, y, z) +
981 ky*eq->get_esup2(x, y, z) +
982 kz*eq->get_esup3(x, y, z))/w;
983 auto b_hat = b_vec->unit();
985 auto npara = b_hat->dot(n);
986 auto npara2 = npara*npara;
987 auto nperp = b_hat->cross(n)->length();
988 auto nperp2 = nperp*nperp;
991 auto m11 = e11 - npara2;
993 auto m13 = npara*nperp;
994 auto m22 = e11 - npara2 - nperp2;
995 auto m33 = e33 - nperp2;
997 return (m11*m22 - m12*m12)*m33 - m22*(m13*m13);
1007 template<jit::
float_scalar T,
bool SAFE_MATH=false>
1045 auto b_vec = eq->get_magnetic_field(x, y, z);
1046 auto b_len = b_vec->length();
1047 auto b_hat = b_vec/b_len;
1048 auto ne = eq->get_electron_density(x, y, z);
1049 auto te = eq->get_electron_temperature(x, y, z);
1066 auto P = wpe2/(w*w);
1067 auto q = P/(2.0*(1.0 + ec/w));
1069 auto n = (kx*eq->get_esup1(x, y, z) +
1070 ky*eq->get_esup2(x, y, z) +
1071 kz*eq->get_esup3(x, y, z))/w;
1072 auto n2 = n->dot(n);
1073 auto npara = n->dot(b_hat);
1074 auto npara2 = npara*npara;
1075 auto nperp = b_hat->cross(n);
1076 auto nperp2 = nperp->dot(nperp);
1077 auto n2nperp2 = n2*nperp2;
1079 auto q_func = 1.0 - 2.0*
q;
1080 auto n_func = n2 + npara2;
1081 auto p_func = 1.0 - P;
1083 auto gamma1 = (1.0 -
q)*n2nperp2
1084 + p_func*(n2*npara2 - (1.0 -
q)*n_func)
1085 + q_func*(p_func - nperp2);
1086 auto gamma0 = nperp2*(n2 - 2.0*q_func) + p_func*(2.0*q_func - n_func);
1088 return -P/2.0*(1.0 + ec/w)*gamma0 + (1.0 - ec*ec/(w*w))*gamma1;
1095 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));
1173 auto n = (kx*eq->get_esup1(x, y, z) +
1174 ky*eq->get_esup2(x, y, z) +
1175 kz*eq->get_esup3(x, y, z))/w;
1176 auto n2 = n->dot(n);
1177 auto npara = n->dot(b_hat);
1178 auto npara2 = npara*npara;
1179 auto nperp = b_hat->cross(n);
1180 auto nperp2 = nperp->dot(nperp);
1182 auto zeta = (1.0 - ec/w)/(npara*ve);
1183 auto Z_func = this->z.Z(zeta);
1184 auto zeta_func = 1.0 + zeta*Z_func;
1185 auto F = ve*zeta*w/(2.0*npara*ec);
1186 auto isigma = P*Z_func/(2.0*npara*ve);
1188 auto q_func = 1.0 - 2.0*
q;
1189 auto n_func = n2 + npara2;
1190 auto p_func = 1.0 - P;
1192 auto gamma5 = n2*npara2 - (1.0 -
q)*n_func + q_func;
1193 auto gamma2 = (n2 - q_func)
1194 + P*w/(4.0*ec*npara2)*(n_func - 2.0*q_func);
1195 auto gamma1 = nperp2*((1.0 -
q)*n2 - q_func)
1196 + p_func*(n2*npara2 - (1.0 -
q)*n_func + q_func);
1197 auto gamma0 = nperp2*(n2 - 2.0*q_func) + p_func*(2.0*q_func - n_func);
1199 return isigma*gamma0 + gamma1 + nperp2*P*w/ec*zeta_func*(gamma2 + gamma5*F);
1210 template<jit::
float_scalar T,
class Z,
bool SAFE_MATH=false>
1262 auto b_vec = eq->get_magnetic_field(x, y, z);
1263 auto b_hat = b_vec->unit();
1264 auto b_len = b_vec->length();
1265 auto ne = eq->get_electron_density(x, y, z);
1266 auto te = eq->get_electron_temperature(x, y, z);
1281 auto P = wpe2/(w*w);
1282 auto q = P/(2.0*(1.0 + ec/w));
1284 auto n = (kx*eq->get_esup1(x, y, z) +
1285 ky*eq->get_esup2(x, y, z) +
1286 kz*eq->get_esup3(x, y, z))/w;
1287 auto n2 = n->dot(n);
1288 auto npara = b_hat->dot(n);
1289 auto npara2 = npara*npara;
1290 auto nperp = b_hat->cross(n);
1291 auto nperp2 = nperp->dot(nperp);
1295 auto zeta = (1.0 - ec/w)/(npara*vtnorm);
1296 auto Z_func = this->z.Z(zeta);
1298 auto q_func = 1.0 - 2.0*
q;
1299 auto n_func = n2 + npara2;
1300 auto n2nperp2 = n2*nperp2;
1301 auto p_func = 1.0 - P;
1303 auto gamma5 = P*(n2*npara2 - (1.0 -
q)*n_func + q_func);
1304 auto gamma2 = P*w/ec*nperp2*(n2 - q_func)
1305 + P*P*w*w/(4.0*ec*ec)*(n_func - 2.0*q_func)*nperp2/npara2;
1306 auto gamma1 = (1.0 -
q)*n2nperp2
1307 + p_func*(n2*npara2 - (1.0 -
q)*n_func)
1308 + q_func*(p_func - nperp2);
1310 return -(1.0 + ec/w)*npara*vtnorm *
1311 (gamma1 + gamma2 + nperp2/(2.0*npara)*(w*w/(ec*ec))*vtnorm*zeta*gamma5)*(1.0/Z_func + zeta);
1320 concept function = std::is_base_of<dispersion_function<typename D::base, D::safe_math>, D>::value;
1327 template<function DISPERSION_FUNCTION>
1332 DISPERSION_FUNCTION::safe_math>
D;
1336 DISPERSION_FUNCTION::safe_math>
dxdt;
1339 DISPERSION_FUNCTION::safe_math>
dydt;
1342 DISPERSION_FUNCTION::safe_math>
dzdt;
1354 DISPERSION_FUNCTION::safe_math>
dsdt;
1371 DISPERSION_FUNCTION::safe_math> w,
1373 DISPERSION_FUNCTION::safe_math> kx,
1375 DISPERSION_FUNCTION::safe_math> ky,
1377 DISPERSION_FUNCTION::safe_math> kz,
1379 DISPERSION_FUNCTION::safe_math> x,
1381 DISPERSION_FUNCTION::safe_math> y,
1383 DISPERSION_FUNCTION::safe_math> z,
1385 DISPERSION_FUNCTION::safe_math> t,
1387 DISPERSION_FUNCTION::safe_math> &eq) :
1388 D(DISPERSION_FUNCTION().
D(w, kx, ky, kz, x, y, z, t, eq)) {
1389 auto dDdw = this->D->df(w);
1390 auto dDdkx = this->D->df(kx);
1391 auto dDdky = this->D->df(ky);
1392 auto dDdkz = this->D->df(kz);
1393 auto dDdx = this->D->df(x);
1394 auto dDdy = this->D->df(y);
1395 auto dDdz = this->D->df(z);
1398 dDdw = dDdw->remove_pseudo();
1399 dDdkx = dDdkx->remove_pseudo();
1400 dDdky = dDdky->remove_pseudo();
1401 dDdkz = dDdkz->remove_pseudo();
1402 dDdx = dDdx->remove_pseudo();
1403 dDdy = dDdy->remove_pseudo();
1404 dDdz = dDdz->remove_pseudo();
1432 DISPERSION_FUNCTION::safe_math>
1434 DISPERSION_FUNCTION::safe_math> x,
1436 DISPERSION_FUNCTION::safe_math> inputs,
1437 const size_t index=0,
1438 const typename DISPERSION_FUNCTION::base tolerance = 1.0E-30,
1439 const size_t max_iterations = 1000) {
1443 DISPERSION_FUNCTION::safe_math> work(index);
1447 DISPERSION_FUNCTION::safe_math> (),
1448 tolerance, max_iterations);
1453 work.copy_to_host(x, x_var->data());
1455 return this->D*this->
D;
1464 DISPERSION_FUNCTION::safe_math>
1466 return this->D*this->
D;
1475 DISPERSION_FUNCTION::safe_math>
1486 DISPERSION_FUNCTION::safe_math>
1497 DISPERSION_FUNCTION::safe_math>
1508 DISPERSION_FUNCTION::safe_math>
1519 DISPERSION_FUNCTION::safe_math>
1530 DISPERSION_FUNCTION::safe_math>
1541 DISPERSION_FUNCTION::safe_math>
1552 DISPERSION_FUNCTION::safe_math>
1562 std::cout << std::endl;
1570 std::cout << std::endl;
1578 std::cout << std::endl;
1586 std::cout << std::endl;
1594 std::cout << std::endl;
1602 std::cout << std::endl;
1610 std::cout << std::endl;
Ion wave dispersion function.
Definition dispersion.hpp:582
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_leaf< T, SAFE_MATH > kx, graph::shared_leaf< T, SAFE_MATH > ky, graph::shared_leaf< T, SAFE_MATH > kz, 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:602
Bohm-Gross dispersion function.
Definition dispersion.hpp:453
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_leaf< T, SAFE_MATH > kx, graph::shared_leaf< T, SAFE_MATH > ky, graph::shared_leaf< T, SAFE_MATH > kz, 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:473
Cold Plasma expansion dispersion function.
Definition dispersion.hpp:1008
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_leaf< T, SAFE_MATH > kx, graph::shared_leaf< T, SAFE_MATH > ky, graph::shared_leaf< T, SAFE_MATH > kz, 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:1035
Cold Plasma Dispersion function.
Definition dispersion.hpp:888
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_leaf< T, SAFE_MATH > kx, graph::shared_leaf< T, SAFE_MATH > ky, graph::shared_leaf< T, SAFE_MATH > kz, 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:928
Interface for dispersion functions.
Definition dispersion.hpp:295
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_leaf< T, SAFE_MATH > kx, graph::shared_leaf< T, SAFE_MATH > ky, graph::shared_leaf< T, SAFE_MATH > kz, 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:322
static constexpr bool safe_math
Retrieve template parameter of safe math.
Definition dispersion.hpp:324
Class interface to build dispersion relation functions.
Definition dispersion.hpp:1328
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dydt()
Provide right hand side for y update.
Definition dispersion.hpp:1509
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dkydt()
Provide right hand side for z update.
Definition dispersion.hpp:1542
void print_dxdt()
Print out the latex expression for the dxdt.
Definition dispersion.hpp:1592
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dkxdt
Derivative with respect to kx.
Definition dispersion.hpp:1345
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:1370
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dxdt
Derivative with respect to kx.
Definition dispersion.hpp:1336
void print_dkxdt()
Print out the latex expression for the dkxdt.
Definition dispersion.hpp:1568
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dydt
Derivative with respect to ky.
Definition dispersion.hpp:1339
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dkxdt()
Provide right hand side for z update.
Definition dispersion.hpp:1531
void print_dispersion()
Print out the latex expression for the dispersion relation.
Definition dispersion.hpp:1560
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dkydt
Derivative with respect to ky.
Definition dispersion.hpp:1348
void print_dkydt()
Print out the latex expression for the dkydt.
Definition dispersion.hpp:1576
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > D
Dispersion function.
Definition dispersion.hpp:1332
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dzdt
Derivative with respect to kz.
Definition dispersion.hpp:1342
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dkzdt()
Provide right hand side for z update.
Definition dispersion.hpp:1553
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dsdt()
Provide right hand side for s update.
Definition dispersion.hpp:1487
void print_dkzdt()
Print out the latex expression for the dkzdt.
Definition dispersion.hpp:1584
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:1433
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dkzdt
Derivative with respect to kz.
Definition dispersion.hpp:1351
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dsdt
Derivative with respect to omega.
Definition dispersion.hpp:1354
void print_dydt()
Print out the latex expression for the dydt.
Definition dispersion.hpp:1600
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_d()
Get the dispersion function.
Definition dispersion.hpp:1476
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dzdt()
Provide right hand side for z update.
Definition dispersion.hpp:1520
void print_dzdt()
Print out the latex expression for the dzdt.
Definition dispersion.hpp:1608
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_residual()
Get the dispersion residual.
Definition dispersion.hpp:1465
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dxdt()
Provide right hand side for x update.
Definition dispersion.hpp:1498
Gaussian Well dispersion function.
Definition dispersion.hpp:646
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_leaf< T, SAFE_MATH > kx, graph::shared_leaf< T, SAFE_MATH > ky, graph::shared_leaf< T, SAFE_MATH > kz, 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:664
Hot Plasma Expansion Dispersion function.
Definition dispersion.hpp:1211
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_leaf< T, SAFE_MATH > kx, graph::shared_leaf< T, SAFE_MATH > ky, graph::shared_leaf< T, SAFE_MATH > kz, 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:1252
Hot Plasma Dispersion function.
Definition dispersion.hpp:1096
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_leaf< T, SAFE_MATH > kx, graph::shared_leaf< T, SAFE_MATH > ky, graph::shared_leaf< T, SAFE_MATH > kz, 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:1139
Electrostatic ion cyclotron wave dispersion function.
Definition dispersion.hpp:688
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_leaf< T, SAFE_MATH > kx, graph::shared_leaf< T, SAFE_MATH > ky, graph::shared_leaf< T, SAFE_MATH > kz, 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:710
Light Wave dispersion function.
Definition dispersion.hpp:523
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_leaf< T, SAFE_MATH > kx, graph::shared_leaf< T, SAFE_MATH > ky, graph::shared_leaf< T, SAFE_MATH > kz, 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:543
Ordinary wave dispersion function.
Definition dispersion.hpp:757
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_leaf< T, SAFE_MATH > kx, graph::shared_leaf< T, SAFE_MATH > ky, graph::shared_leaf< T, SAFE_MATH > kz, 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:777
Physics.
Definition dispersion.hpp:431
const T q
Fundamental charge.
Definition dispersion.hpp:439
const T me
Electron mass.
Definition dispersion.hpp:441
const T c
Speed of light.
Definition dispersion.hpp:443
const T mu0
Vacuum permeability.
Definition dispersion.hpp:437
const T epsilon0
Vacuum permittivity.
Definition dispersion.hpp:435
Simple dispersion function.
Definition dispersion.hpp:389
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_leaf< T, SAFE_MATH > kx, graph::shared_leaf< T, SAFE_MATH > ky, graph::shared_leaf< T, SAFE_MATH > kz, 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:407
Stiff dispersion function.
Definition dispersion.hpp:334
virtual graph::shared_leaf< T, SAFE_MATH > D(graph::shared_leaf< T, SAFE_MATH > w, graph::shared_leaf< T, SAFE_MATH > kx, graph::shared_leaf< T, SAFE_MATH > ky, graph::shared_leaf< T, SAFE_MATH > kz, 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:369
Class interface to build dispersion relation functions.
Definition dispersion.hpp:219
virtual graph::shared_leaf< T, SAFE_MATH > Z(graph::shared_leaf< T, SAFE_MATH > zeta)
Method to build the Z function.
Definition dispersion.hpp:228
Class interface to build dispersion relation functions.
Definition dispersion.hpp:168
static constexpr bool safe_math
Retrieve template parameter of safe math.
Definition dispersion.hpp:182
T base
Type def to retrieve the backend base type.
Definition dispersion.hpp:180
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:192
virtual graph::shared_leaf< T, SAFE_MATH > Z(graph::shared_leaf< T, SAFE_MATH > zeta)
Method to build the Z function.
Definition dispersion.hpp:201
Class representing a workflow manager.
Definition workflow.hpp:171
Dispersion concept.
Definition dispersion.hpp:1320
Dispersion concept.
Definition dispersion.hpp:236
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:157
std::shared_ptr< generic< T, SAFE_MATH > > shared
Convenience type alias for shared equilibria.
Definition equilibrium.hpp:472
constexpr shared_leaf< T, SAFE_MATH > zero()
Forward declare for zero.
Definition node.hpp:995
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:133
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:272
std::vector< shared_variable< T, SAFE_MATH > > input_nodes
Convenience type alias for a vector of inputs.
Definition node.hpp:1731
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:1747
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:674
shared_pseudo_variable< T, SAFE_MATH > pseudo_variable_cast(shared_leaf< T, SAFE_MATH > &x)
Cast to a pseudo variable node.
Definition node.hpp:1921
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.