166 template<jit::
float_scalar T,
bool SAFE_MATH=false>
190 template<jit::complex_scalar T,
bool SAFE_MATH=false>
201 auto zeta2 = zeta*zeta;
202 auto zeta4 = zeta2*zeta2;
203 auto zeta6 = zeta4*zeta2;
205 2.0*(1.0 - 2.0/3.0*zeta2
207 - 8.0/105.0*zeta6)*zeta;
217 template<jit::complex_scalar T,
bool SAFE_MATH=false>
235 concept z_func = std::is_base_of<z_function<typename Z::base, Z::safe_math>, Z>::value;
253 template<jit::
float_scalar T,
bool SAFE_MATH=false>
260 return n*q*q/(epsion0*m*c*c);
275 template<jit::
float_scalar T,
bool SAFE_MATH=false>
277 build_cyclotron_fequency(
const T q,
293 template<jit::
float_scalar T,
bool SAFE_MATH=false>
332 template<jit::
float_scalar T,
bool SAFE_MATH=false>
387 template<jit::
float_scalar T,
bool SAFE_MATH=false>
417 auto npar2 = kz*kz*c*c/(w*w);
418 auto nperp2 = (kx*kx + ky*ky)*c*c/(w*w);
419 return npar2 + nperp2 - c;
429 template<jit::
float_scalar T,
bool SAFE_MATH=false>
436 const T
mu0 = M_PI*4.0E-7;
438 const T
q = 1.602176634E-19;
440 const T
me = 9.1093837015E-31;
451 template<jit::
float_scalar T,
bool SAFE_MATH=false>
483 auto ne = eq->get_electron_density(x, y, z);
488 auto te = eq->get_electron_temperature(x, y, z);
498 auto b_vec = eq->get_magnetic_field(x, y, z);
499 auto k = kx*eq->get_esup1(x, y, z)
500 + ky*eq->get_esup2(x, y, z)
501 + kz*eq->get_esup3(x, y, z);
506 auto b_hat = b_vec->unit();
507 auto kpara = b_hat->dot(k);
508 kpara2 = kpara*kpara;
511 return wpe2 + 3.0/2.0*kpara2*vterm2 - w*w;
521 template<jit::
float_scalar T,
bool SAFE_MATH=false>
553 auto ne = eq->get_electron_density(x, y, z);
554 auto wpe2 = build_plasma_fequency(ne,
563 "Expected equilibrium with no magnetic field.");
565 auto k = kx*eq->get_esup1(x, y, z)
566 + ky*eq->get_esup2(x, y, z)
567 + kz*eq->get_esup3(x, y, z);
570 return wpe2 + k2 - w*w;
580 template<jit::
float_scalar T,
bool SAFE_MATH=false>
612 const T mi = eq->get_ion_mass(0);
613 auto te = eq->get_electron_temperature(x, y, z);
614 auto ti = eq->get_ion_temperature(0, x, y, z);
621 auto b_vec = eq->get_magnetic_field(x, y, z);
622 auto k = kx*eq->get_esup1(x, y, z)
623 + ky*eq->get_esup2(x, y, z)
624 + kz*eq->get_esup3(x, y, z);
629 auto b_hat = b_vec->unit();
630 auto kpara = b_hat->dot(k);
631 kpara2 = kpara*kpara;
634 return kpara2*vs2 - w*w;
644 template<jit::
float_scalar T,
bool SAFE_MATH=false>
673 auto well = c - 0.5*exp(-(x*x + y*y)/0.1);
674 auto npar2 = kz*kz*c*c/(w*w);
675 auto nperp2 = (kx*kx + ky*ky)*c*c/(w*w);
676 return npar2 + nperp2 - well;
686 template<jit::
float_scalar T,
bool SAFE_MATH=false>
719 const T mi = eq->get_ion_mass(0);
721 auto te = eq->get_electron_temperature(x, y, z);
722 auto ti = eq->get_ion_temperature(0, x, y, z);
729 auto b_vec = eq->get_magnetic_field(x, y, z);
736 auto k = kx*eq->get_esup1(x, y, z)
737 + ky*eq->get_esup2(x, y, z)
738 + kz*eq->get_esup3(x, y, z);
739 auto b_hat = b_vec->unit();
740 auto kperp = b_hat->cross(k)->length();
741 auto kperp2 = kperp*kperp;
745 return wce - kperp2*vs2 - w*w;
755 template<jit::
float_scalar T,
bool SAFE_MATH=false>
786 auto ne = eq->get_electron_density(x, y, z);
787 auto wpe2 = build_plasma_fequency(ne,
794 auto n = (kx*eq->get_esup1(x, y, z) +
795 ky*eq->get_esup2(x, y, z) +
796 kz*eq->get_esup3(x, y, z))/w;
797 auto b_vec = eq->get_magnetic_field(x, y, z);
798 auto b_hat = b_vec->unit();
799 auto nperp = b_hat->cross(n);
800 auto nperp2 = nperp->dot(nperp);
804 return 1.0 - wpe2/w2 - nperp2;
814 template<jit::
float_scalar T,
bool SAFE_MATH=false>
850 auto ne = eq->get_electron_density(x, y, z);
851 auto wpe2 = build_plasma_fequency(ne,
857 auto b_vec = eq->get_magnetic_field(x, y, z);
858 auto b_len = b_vec->length();
865 auto n = (kx*eq->get_esup1(x, y, z) +
866 ky*eq->get_esup2(x, y, z) +
867 kz*eq->get_esup3(x, y, z))/w;
868 auto b_hat = b_vec->unit();
869 auto nperp = b_hat->cross(n);
870 auto nperp2 = nperp->dot(nperp);
872 auto wh = wpe2 + wec*wec;
876 return 1.0 - wpe2/(w2)*(w2 - wpe2)/(w2 - wh) - nperp2;
886 template<jit::
float_scalar T,
bool SAFE_MATH=false>
938 auto ne = eq->get_electron_density(x, y, z);
939 auto wpe2 = build_plasma_fequency(ne,
944 auto b_vec = eq->get_magnetic_field(x, y, z);
945 auto b_len = b_vec->length();
952 auto denome = 1.0 - ec*ec/w2;
953 auto e11 = 1.0 - (wpe2/w2)/denome;
954 auto e12 = ((ec/w)*(wpe2/w2))/denome;
957 for (
size_t i = 0, ie = eq->get_num_ion_species(); i < ie; i++) {
958 const T mi = eq->get_ion_mass(i);
959 const T charge =
static_cast<T
> (eq->get_ion_charge(i))
962 auto ni = eq->get_ion_density(i, x, y, z);
963 auto wpi2 = build_plasma_fequency(ni, charge, mi,
966 auto ic = build_cyclotron_fequency(charge, b_len, mi,
969 auto denomi = 1.0 - ic*ic/w2;
970 e11 = e11 - (wpi2/w2)/denomi;
971 e12 = e12 + ((ic/w)*(wpi2/w2))/denomi;
979 auto n = (kx*eq->get_esup1(x, y, z) +
980 ky*eq->get_esup2(x, y, z) +
981 kz*eq->get_esup3(x, y, z))/w;
982 auto b_hat = b_vec->unit();
984 auto npara = b_hat->dot(n);
985 auto npara2 = npara*npara;
986 auto nperp = b_hat->cross(n)->length();
987 auto nperp2 = nperp*nperp;
990 auto m11 = e11 - npara2;
992 auto m13 = npara*nperp;
993 auto m22 = e11 - npara2 - nperp2;
994 auto m33 = e33 - nperp2;
996 return (m11*m22 - m12*m12)*m33 - m22*(m13*m13);
1006 template<jit::
float_scalar T,
bool SAFE_MATH=false>
1044 auto b_vec = eq->get_magnetic_field(x, y, z);
1045 auto b_len = b_vec->length();
1046 auto b_hat = b_vec/b_len;
1047 auto ne = eq->get_electron_density(x, y, z);
1048 auto te = eq->get_electron_temperature(x, y, z);
1065 auto P = wpe2/(w*w);
1066 auto q = P/(2.0*(1.0 + ec/w));
1068 auto n = (kx*eq->get_esup1(x, y, z) +
1069 ky*eq->get_esup2(x, y, z) +
1070 kz*eq->get_esup3(x, y, z))/w;
1071 auto n2 = n->dot(n);
1072 auto npara = n->dot(b_hat);
1073 auto npara2 = npara*npara;
1074 auto nperp = b_hat->cross(n);
1075 auto nperp2 = nperp->dot(nperp);
1076 auto n2nperp2 = n2*nperp2;
1078 auto q_func = 1.0 - 2.0*
q;
1079 auto n_func = n2 + npara2;
1080 auto p_func = 1.0 - P;
1082 auto gamma1 = (1.0 -
q)*n2nperp2
1083 + p_func*(n2*npara2 - (1.0 -
q)*n_func)
1084 + q_func*(p_func - nperp2);
1085 auto gamma0 = nperp2*(n2 - 2.0*q_func) + p_func*(2.0*q_func - n_func);
1087 return -P/2.0*(1.0 + ec/w)*gamma0 + (1.0 - ec*ec/(w*w))*gamma1;
1094 template<jit::complex_scalar T, z_func Z,
bool SAFE_MATH=false>
1148 auto b_vec = eq->get_magnetic_field(x, y, z);
1149 auto b_len = b_vec->length();
1150 auto b_hat = b_vec/b_len;
1151 auto ne = eq->get_electron_density(x, y, z);
1152 auto te = eq->get_electron_temperature(x, y, z);
1169 auto P = wpe2/(w*w);
1170 auto q = P/(2.0*(1.0 + ec/w));
1172 auto n = (kx*eq->get_esup1(x, y, z) +
1173 ky*eq->get_esup2(x, y, z) +
1174 kz*eq->get_esup3(x, y, z))/w;
1175 auto n2 = n->dot(n);
1176 auto npara = n->dot(b_hat);
1177 auto npara2 = npara*npara;
1178 auto nperp = b_hat->cross(n);
1179 auto nperp2 = nperp->dot(nperp);
1181 auto zeta = (1.0 - ec/w)/(npara*ve);
1182 auto Z_func = this->z.Z(zeta);
1183 auto zeta_func = 1.0 + zeta*Z_func;
1184 auto F = ve*zeta*w/(2.0*npara*ec);
1185 auto isigma = P*Z_func/(2.0*npara*ve);
1187 auto q_func = 1.0 - 2.0*
q;
1188 auto n_func = n2 + npara2;
1189 auto p_func = 1.0 - P;
1191 auto gamma5 = n2*npara2 - (1.0 -
q)*n_func + q_func;
1192 auto gamma2 = (n2 - q_func)
1193 + P*w/(4.0*ec*npara2)*(n_func - 2.0*q_func);
1194 auto gamma1 = nperp2*((1.0 -
q)*n2 - q_func)
1195 + p_func*(n2*npara2 - (1.0 -
q)*n_func + q_func);
1196 auto gamma0 = nperp2*(n2 - 2.0*q_func) + p_func*(2.0*q_func - n_func);
1198 return isigma*gamma0 + gamma1 + nperp2*P*w/ec*zeta_func*(gamma2 + gamma5*F);
1209 template<jit::
float_scalar T,
class Z,
bool SAFE_MATH=false>
1261 auto b_vec = eq->get_magnetic_field(x, y, z);
1262 auto b_hat = b_vec->unit();
1263 auto b_len = b_vec->length();
1264 auto ne = eq->get_electron_density(x, y, z);
1265 auto te = eq->get_electron_temperature(x, y, z);
1280 auto P = wpe2/(w*w);
1281 auto q = P/(2.0*(1.0 + ec/w));
1283 auto n = (kx*eq->get_esup1(x, y, z) +
1284 ky*eq->get_esup2(x, y, z) +
1285 kz*eq->get_esup3(x, y, z))/w;
1286 auto n2 = n->dot(n);
1287 auto npara = b_hat->dot(n);
1288 auto npara2 = npara*npara;
1289 auto nperp = b_hat->cross(n);
1290 auto nperp2 = nperp->dot(nperp);
1294 auto zeta = (1.0 - ec/w)/(npara*vtnorm);
1295 auto Z_func = this->z.Z(zeta);
1297 auto q_func = 1.0 - 2.0*
q;
1298 auto n_func = n2 + npara2;
1299 auto n2nperp2 = n2*nperp2;
1300 auto p_func = 1.0 - P;
1302 auto gamma5 = P*(n2*npara2 - (1.0 -
q)*n_func + q_func);
1303 auto gamma2 = P*w/ec*nperp2*(n2 - q_func)
1304 + P*P*w*w/(4.0*ec*ec)*(n_func - 2.0*q_func)*nperp2/npara2;
1305 auto gamma1 = (1.0 -
q)*n2nperp2
1306 + p_func*(n2*npara2 - (1.0 -
q)*n_func)
1307 + q_func*(p_func - nperp2);
1309 return -(1.0 + ec/w)*npara*vtnorm *
1310 (gamma1 + gamma2 + nperp2/(2.0*npara)*(w*w/(ec*ec))*vtnorm*zeta*gamma5)*(1.0/Z_func + zeta);
1319 concept function = std::is_base_of<dispersion_function<typename D::base, D::safe_math>, D>::value;
1326 template<function DISPERSION_FUNCTION>
1331 DISPERSION_FUNCTION::safe_math>
D;
1335 DISPERSION_FUNCTION::safe_math>
dxdt;
1338 DISPERSION_FUNCTION::safe_math>
dydt;
1341 DISPERSION_FUNCTION::safe_math>
dzdt;
1353 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 D(DISPERSION_FUNCTION().
D(w, kx, ky, kz, x, y, z, t, eq)) {
1388 auto dDdw = this->D->df(w);
1389 auto dDdkx = this->D->df(kx);
1390 auto dDdky = this->D->df(ky);
1391 auto dDdkz = this->D->df(kz);
1392 auto dDdx = this->D->df(x);
1393 auto dDdy = this->D->df(y);
1394 auto dDdz = this->D->df(z);
1397 dDdw = dDdw->remove_pseudo();
1398 dDdkx = dDdkx->remove_pseudo();
1399 dDdky = dDdky->remove_pseudo();
1400 dDdkz = dDdkz->remove_pseudo();
1401 dDdx = dDdx->remove_pseudo();
1402 dDdy = dDdy->remove_pseudo();
1403 dDdz = dDdz->remove_pseudo();
1431 DISPERSION_FUNCTION::safe_math>
1433 DISPERSION_FUNCTION::safe_math> x,
1435 DISPERSION_FUNCTION::safe_math> inputs,
1436 const size_t index=0,
1437 const typename DISPERSION_FUNCTION::base tolarance = 1.0E-30,
1438 const size_t max_iterations = 1000) {
1442 DISPERSION_FUNCTION::safe_math> work(index);
1446 DISPERSION_FUNCTION::safe_math> (),
1447 tolarance, max_iterations);
1452 work.copy_to_host(x, x_var->data());
1454 return this->D*this->
D;
1463 DISPERSION_FUNCTION::safe_math>
1465 return this->D*this->
D;
1474 DISPERSION_FUNCTION::safe_math>
1485 DISPERSION_FUNCTION::safe_math>
1496 DISPERSION_FUNCTION::safe_math>
1507 DISPERSION_FUNCTION::safe_math>
1518 DISPERSION_FUNCTION::safe_math>
1529 DISPERSION_FUNCTION::safe_math>
1540 DISPERSION_FUNCTION::safe_math>
1551 DISPERSION_FUNCTION::safe_math>
1561 std::cout << std::endl;
1569 std::cout << std::endl;
1577 std::cout << std::endl;
1585 std::cout << std::endl;
1593 std::cout << std::endl;
1601 std::cout << std::endl;
1609 std::cout << std::endl;
Ion wave dispersion function.
Definition dispersion.hpp:581
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:601
Bohm-Gross dispersion function.
Definition dispersion.hpp:452
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:472
Cold Plasma expansion disperison function.
Definition dispersion.hpp:1007
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 Disperison function.
Definition dispersion.hpp:1034
Cold Plasma Disperison function.
Definition dispersion.hpp:887
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 Disperison function.
Definition dispersion.hpp:927
Interface for dispersion functions.
Definition dispersion.hpp:294
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:321
static constexpr bool safe_math
Retrieve template parameter of safe math.
Definition dispersion.hpp:323
Class interface to build dispersion relation functions.
Definition dispersion.hpp:1327
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dydt()
Provide right hand side for y update.
Definition dispersion.hpp:1508
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dkydt()
Provide right hand side for z update.
Definition dispersion.hpp:1541
void print_dxdt()
Print out the latex expression for the dxdt.
Definition dispersion.hpp:1591
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dkxdt
Derivative with respect to kx.
Definition dispersion.hpp:1344
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:1335
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_residule()
Get the disperison residule.
Definition dispersion.hpp:1464
void print_dkxdt()
Print out the latex expression for the dkxdt.
Definition dispersion.hpp:1567
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dydt
Derivative with respect to ky.
Definition dispersion.hpp:1338
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dkxdt()
Provide right hand side for z update.
Definition dispersion.hpp:1530
void print_dispersion()
Print out the latex expression for the dispersion relation.
Definition dispersion.hpp:1559
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dkydt
Derivative with respect to ky.
Definition dispersion.hpp:1347
void print_dkydt()
Print out the latex expression for the dkydt.
Definition dispersion.hpp:1575
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > D
Disperison function.
Definition dispersion.hpp:1331
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dzdt
Derivative with respect to kz.
Definition dispersion.hpp:1341
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dkzdt()
Provide right hand side for z update.
Definition dispersion.hpp:1552
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dsdt()
Provide right hand side for s update.
Definition dispersion.hpp:1486
void print_dkzdt()
Print out the latex expression for the dkzdt.
Definition dispersion.hpp:1583
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dkzdt
Derivative with respect to kz.
Definition dispersion.hpp:1350
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > dsdt
Derivative with respect to omega.
Definition dispersion.hpp:1353
void print_dydt()
Print out the latex expression for the dydt.
Definition dispersion.hpp:1599
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 tolarance=1.0E-30, const size_t max_iterations=1000)
Solve the dispersion relation for x.
Definition dispersion.hpp:1432
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_d()
Get the disperison function.
Definition dispersion.hpp:1475
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dzdt()
Provide right hand side for z update.
Definition dispersion.hpp:1519
void print_dzdt()
Print out the latex expression for the dzdt.
Definition dispersion.hpp:1607
graph::shared_leaf< typename DISPERSION_FUNCTION::base, DISPERSION_FUNCTION::safe_math > get_dxdt()
Provide right hand side for x update.
Definition dispersion.hpp:1497
Guassian Well dispersion function.
Definition dispersion.hpp:645
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)
Disperison relation with a non uniform well.
Definition dispersion.hpp:663
Hot Plasma Expansion Disperison function.
Definition dispersion.hpp:1210
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:1251
Hot Plasma Disperison function.
Definition dispersion.hpp:1095
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 Disperison function.
Definition dispersion.hpp:1138
Electrostatic ion cyclotron wave dispersion function.
Definition dispersion.hpp:687
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)
Disperison relation for the O mode.
Definition dispersion.hpp:709
Light Wave dispersion function.
Definition dispersion.hpp:522
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:542
Ordinary wave dispersion function.
Definition dispersion.hpp:756
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)
Disperison relation for the O mode.
Definition dispersion.hpp:776
Physics.
Definition dispersion.hpp:430
const T q
Fundamental charge.
Definition dispersion.hpp:438
const T me
Electron mass.
Definition dispersion.hpp:440
const T epsion0
Vacuum permitivity.
Definition dispersion.hpp:434
const T c
Speed of light.
Definition dispersion.hpp:442
const T mu0
Vacuum permeability.
Definition dispersion.hpp:436
Simple dispersion function.
Definition dispersion.hpp:388
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:406
Stiff dispersion function.
Definition dispersion.hpp:333
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:368
Class interface to build dispersion relation functions.
Definition dispersion.hpp:218
virtual graph::shared_leaf< T, SAFE_MATH > Z(graph::shared_leaf< T, SAFE_MATH > zeta)
Method to build the Z function.
Definition dispersion.hpp:227
Class interface to build dispersion relation functions.
Definition dispersion.hpp:167
static constexpr bool safe_math
Retrieve template parameter of safe math.
Definition dispersion.hpp:181
T base
Type def to retrieve the backend base type.
Definition dispersion.hpp:179
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:191
virtual graph::shared_leaf< T, SAFE_MATH > Z(graph::shared_leaf< T, SAFE_MATH > zeta)
Method to build the Z function.
Definition dispersion.hpp:200
Class representing a workflow manager.
Definition workflow.hpp:171
Dispersion concept.
Definition dispersion.hpp:1319
Dispersion concept.
Definition dispersion.hpp:235
Class signature to impliment plasma equilibrium.
subroutine assert(test, message)
Assert check.
Definition f_binding_test.f90:38
Name space for dispersion functions.
Definition dispersion.hpp:156
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:994
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 convience 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:1730
shared_leaf< T, SAFE_MATH > erfi(shared_leaf< T, SAFE_MATH > x)
Define erfi convience 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:1746
shared_leaf< T, SAFE_MATH > sqrt(shared_leaf< T, SAFE_MATH > x)
Define sqrt convience 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:673
shared_pseudo_variable< T, SAFE_MATH > pseudo_variable_cast(shared_leaf< T, SAFE_MATH > &x)
Cast to a pseudo variable node.
Definition node.hpp:1920
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 tolarance=1.0E-30, const size_t max_iterations=1000, const T step=1.0)
Determine the value of vars to minimze the loss function.
Definition newton.hpp:34
Sets up the kernel for a newtons method.