Graph Framework
Loading...
Searching...
No Matches
dispersion.hpp
Go to the documentation of this file.
1//------------------------------------------------------------------------------
6//------------------------------------------------------------------------------
7//------------------------------------------------------------------------------
147//------------------------------------------------------------------------------
148
149#ifndef dispersion_h
150#define dispersion_h
151
152#include "newton.hpp"
153#include "equilibrium.hpp"
154
156namespace dispersion {
157//******************************************************************************
158// Z Function interface.
159//******************************************************************************
160//------------------------------------------------------------------------------
165//------------------------------------------------------------------------------
166 template<jit::float_scalar T, bool SAFE_MATH=false>
168 public:
169//------------------------------------------------------------------------------
174//------------------------------------------------------------------------------
177
179 typedef T base;
181 static constexpr bool safe_math = SAFE_MATH;
182 };
183
184//------------------------------------------------------------------------------
189//------------------------------------------------------------------------------
190 template<jit::complex_scalar T, bool SAFE_MATH=false>
191 class z_power_series final : public z_function<T, SAFE_MATH> {
192 public:
193//------------------------------------------------------------------------------
198//------------------------------------------------------------------------------
201 auto zeta2 = zeta*zeta;
202 auto zeta4 = zeta2*zeta2;
203 auto zeta6 = zeta4*zeta2;
204 return graph::i<T>*std::sqrt(M_PI)/graph::exp(zeta2) -
205 2.0*(1.0 - 2.0/3.0*zeta2
206 + 4.0/15.0*zeta4
207 - 8.0/105.0*zeta6)*zeta;
208 }
209 };
210
211//------------------------------------------------------------------------------
216//------------------------------------------------------------------------------
217 template<jit::complex_scalar T, bool SAFE_MATH=false>
218 class z_erfi final : public z_function<T, SAFE_MATH> {
219 public:
220//------------------------------------------------------------------------------
225//------------------------------------------------------------------------------
228 return -std::sqrt(M_PI)*graph::exp(-zeta*zeta)*(graph::erfi(zeta) -
230 }
231 };
232
234 template<class Z>
235 concept z_func = std::is_base_of<z_function<typename Z::base, Z::safe_math>, Z>::value;
236
237//******************************************************************************
238// Common physics expressions.
239//******************************************************************************
240//------------------------------------------------------------------------------
252//------------------------------------------------------------------------------
253 template<jit::float_scalar T, bool SAFE_MATH=false>
254 static constexpr graph::shared_leaf<T, SAFE_MATH>
255 build_plasma_fequency(graph::shared_leaf<T, SAFE_MATH> n,
256 const T q,
257 const T m,
258 const T c,
259 const T epsion0) {
260 return n*q*q/(epsion0*m*c*c);
261 }
262
263//------------------------------------------------------------------------------
274//------------------------------------------------------------------------------
275 template<jit::float_scalar T, bool SAFE_MATH=false>
276 static constexpr graph::shared_leaf<T, SAFE_MATH>
277 build_cyclotron_fequency(const T q,
279 const T m,
280 const T c) {
281 return q*b/(m*c);
282 }
283
284//******************************************************************************
285// Dispersion function.
286//******************************************************************************
287//------------------------------------------------------------------------------
292//------------------------------------------------------------------------------
293 template<jit::float_scalar T, bool SAFE_MATH=false>
295 public:
296//------------------------------------------------------------------------------
308//------------------------------------------------------------------------------
319
321 typedef T base;
323 static constexpr bool safe_math = SAFE_MATH;
324 };
325
326//------------------------------------------------------------------------------
331//------------------------------------------------------------------------------
332 template<jit::float_scalar T, bool SAFE_MATH=false>
333 class stiff final : public dispersion_function<T, SAFE_MATH> {
334 public:
335//------------------------------------------------------------------------------
366//------------------------------------------------------------------------------
379 };
380
381//------------------------------------------------------------------------------
386//------------------------------------------------------------------------------
387 template<jit::float_scalar T, bool SAFE_MATH=false>
388 class simple final : public dispersion_function<T, SAFE_MATH> {
389 public:
390//------------------------------------------------------------------------------
404//------------------------------------------------------------------------------
415 const T c = 1.0;
416
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;
420 }
421 };
422
423//------------------------------------------------------------------------------
428//------------------------------------------------------------------------------
429 template<jit::float_scalar T, bool SAFE_MATH=false>
430 class physics : public dispersion_function<T, SAFE_MATH> {
431 protected:
432// Define some common constants.
434 const T epsion0 = 8.8541878138E-12;
436 const T mu0 = M_PI*4.0E-7;
438 const T q = 1.602176634E-19;
440 const T me = 9.1093837015E-31;
442 const T c = static_cast<T> (1.0)/std::sqrt(epsion0*mu0);
443 };
444
445//------------------------------------------------------------------------------
450//------------------------------------------------------------------------------
451 template<jit::float_scalar T, bool SAFE_MATH=false>
452 class bohm_gross final : public physics<T, SAFE_MATH> {
453 public:
454//------------------------------------------------------------------------------
470//------------------------------------------------------------------------------
481
482// Equilibrium quantities.
483 auto ne = eq->get_electron_density(x, y, z);
484 auto wpe2 = build_plasma_fequency(ne, physics<T, SAFE_MATH>::q,
488 auto te = eq->get_electron_temperature(x, y, z);
489// 2*1.602176634E-19 to convert eV to J.
490
491 auto vterm2 = static_cast<T> (2.0)*physics<T, SAFE_MATH>::q*te
495
496// Wave numbers should be parallel to B if there is a magnetic field. Otherwise
497// B should be zero.
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);
503 if (b_vec->length()->is_match(graph::zero<T, SAFE_MATH> ())) {
504 kpara2 = k->dot(k);
505 } else {
506 auto b_hat = b_vec->unit();
507 auto kpara = b_hat->dot(k);
508 kpara2 = kpara*kpara;
509 }
510
511 return wpe2 + 3.0/2.0*kpara2*vterm2 - w*w;
512 }
513 };
514
515//------------------------------------------------------------------------------
520//------------------------------------------------------------------------------
521 template<jit::float_scalar T, bool SAFE_MATH=false>
522 class light_wave final : public physics<T, SAFE_MATH> {
523 public:
524//------------------------------------------------------------------------------
540//------------------------------------------------------------------------------
551
552// Equilibrium quantities.
553 auto ne = eq->get_electron_density(x, y, z);
554 auto wpe2 = build_plasma_fequency(ne,
559
560// Wave numbers should be parallel to B if there is a magnetic field. Otherwise
561// B should be zero.
562 assert(eq->get_magnetic_field(x, y, z)->length()->is_match(graph::zero<T, SAFE_MATH> ()) &&
563 "Expected equilibrium with no magnetic field.");
564
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);
568 auto k2 = k->dot(k);
569
570 return wpe2 + k2 - w*w;
571 }
572 };
573
574//------------------------------------------------------------------------------
579//------------------------------------------------------------------------------
580 template<jit::float_scalar T, bool SAFE_MATH=false>
581 class acoustic_wave final : public physics<T, SAFE_MATH> {
582 public:
583//------------------------------------------------------------------------------
599//------------------------------------------------------------------------------
610
611// Equilibrium quantities.
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);
615 const T gamma = 3.0;
616 auto vs2 = (physics<T, SAFE_MATH>::q*te + gamma*physics<T, SAFE_MATH>::q*ti)
618
619// Wave numbers should be parallel to B if there is a magnetic field. Otherwise
620// B should be zero.
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);
626 if (b_vec->length()->is_match(graph::zero<T, SAFE_MATH> ())) {
627 kpara2 = k->dot(k);
628 } else {
629 auto b_hat = b_vec->unit();
630 auto kpara = b_hat->dot(k);
631 kpara2 = kpara*kpara;
632 }
633
634 return kpara2*vs2 - w*w;
635 }
636 };
637
638//------------------------------------------------------------------------------
643//------------------------------------------------------------------------------
644 template<jit::float_scalar T, bool SAFE_MATH=false>
645 class guassian_well final : public dispersion_function<T, SAFE_MATH> {
646 public:
647//------------------------------------------------------------------------------
661//------------------------------------------------------------------------------
672 const T c = 1.0;
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;
677 }
678 };
679
680//------------------------------------------------------------------------------
685//------------------------------------------------------------------------------
686 template<jit::float_scalar T, bool SAFE_MATH=false>
687 class ion_cyclotron final : public physics<T, SAFE_MATH> {
688 public:
689//------------------------------------------------------------------------------
707//------------------------------------------------------------------------------
718// Equilibrium quantities.
719 const T mi = eq->get_ion_mass(0);
720
721 auto te = eq->get_electron_temperature(x, y, z);
722 auto ti = eq->get_ion_temperature(0, x, y, z);
723 const T gamma = 3.0;
724 auto vs2 = (physics<T, SAFE_MATH>::q*te +
728
729 auto b_vec = eq->get_magnetic_field(x, y, z);
730 auto wce = build_cyclotron_fequency(-physics<T, SAFE_MATH>::q,
731 b_vec->length(),
734
735// Wave numbers.
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;
742
743 auto w2 = w*w;
744
745 return wce - kperp2*vs2 - w*w;
746 }
747 };
748
749//------------------------------------------------------------------------------
754//------------------------------------------------------------------------------
755 template<jit::float_scalar T, bool SAFE_MATH=false>
756 class ordinary_wave final : public physics<T, SAFE_MATH> {
757 public:
758//------------------------------------------------------------------------------
774//------------------------------------------------------------------------------
785// Equilibrium quantities.
786 auto ne = eq->get_electron_density(x, y, z);
787 auto wpe2 = build_plasma_fequency(ne,
792
793// Wave numbers.
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);
801
802 auto w2 = w*w;
803
804 return 1.0 - wpe2/w2 - nperp2;
805 }
806 };
807
808//------------------------------------------------------------------------------
813//------------------------------------------------------------------------------
814 template<jit::float_scalar T, bool SAFE_MATH=false>
815 class extra_ordinary_wave final : public physics<T, SAFE_MATH> {
816 public:
817//------------------------------------------------------------------------------
838//------------------------------------------------------------------------------
849// Equilibrium quantities.
850 auto ne = eq->get_electron_density(x, y, z);
851 auto wpe2 = build_plasma_fequency(ne,
856
857 auto b_vec = eq->get_magnetic_field(x, y, z);
858 auto b_len = b_vec->length();
859 auto wec = build_cyclotron_fequency(-physics<T, SAFE_MATH>::q,
860 b_len,
863
864// Wave numbers.
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);
871
872 auto wh = wpe2 + wec*wec;
873
874 auto w2 = w*w;
875
876 return 1.0 - wpe2/(w2)*(w2 - wpe2)/(w2 - wh) - nperp2;
877 }
878 };
879
880//------------------------------------------------------------------------------
885//------------------------------------------------------------------------------
886 template<jit::float_scalar T, bool SAFE_MATH=false>
887 class cold_plasma : public physics<T, SAFE_MATH> {
888 public:
889//------------------------------------------------------------------------------
925//------------------------------------------------------------------------------
936// Dielectric terms.
937// Frequencies
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();
946 auto ec = build_cyclotron_fequency(-physics<T, SAFE_MATH>::q,
947 b_len,
950
951 auto w2 = w*w;
952 auto denome = 1.0 - ec*ec/w2;
953 auto e11 = 1.0 - (wpe2/w2)/denome;
954 auto e12 = ((ec/w)*(wpe2/w2))/denome;
955 auto e33 = wpe2;
956
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))
961
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,
968
969 auto denomi = 1.0 - ic*ic/w2;
970 e11 = e11 - (wpi2/w2)/denomi;
971 e12 = e12 + ((ic/w)*(wpi2/w2))/denomi;
972 e33 = e33 + wpi2;
973 }
974
975 e12 = -1.0*e12;
976 e33 = 1.0 - e33/w2;
977
978// Wave numbers.
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();
983
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;
988
989// Determinate matrix elements
990 auto m11 = e11 - npara2;
991 auto m12 = e12;
992 auto m13 = npara*nperp;
993 auto m22 = e11 - npara2 - nperp2;
994 auto m33 = e33 - nperp2;
995
996 return (m11*m22 - m12*m12)*m33 - m22*(m13*m13);
997 }
998 };
999
1000//------------------------------------------------------------------------------
1005//------------------------------------------------------------------------------
1006 template<jit::float_scalar T, bool SAFE_MATH=false>
1007 class cold_plasma_expansion : public physics<T, SAFE_MATH> {
1008 public:
1009//------------------------------------------------------------------------------
1032//------------------------------------------------------------------------------
1043// Setup plasma parameters.
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);
1049
1050 auto ve = graph::sqrt(static_cast<T> (2.0)*physics<T, SAFE_MATH>::q*te /
1053
1054// Setup characteristic frequencies.
1055 auto ec = build_cyclotron_fequency(physics<T, SAFE_MATH>::q,
1056 b_len,
1059 auto wpe2 = build_plasma_fequency(ne, physics<T, SAFE_MATH>::q,
1063
1064// Disperison quantities.
1065 auto P = wpe2/(w*w);
1066 auto q = P/(2.0*(1.0 + ec/w));
1067
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;
1077
1078 auto q_func = 1.0 - 2.0*q;
1079 auto n_func = n2 + npara2;
1080 auto p_func = 1.0 - P;
1081
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);
1086
1087 return -P/2.0*(1.0 + ec/w)*gamma0 + (1.0 - ec*ec/(w*w))*gamma1;
1088 }
1089 };
1090
1091//------------------------------------------------------------------------------
1093//------------------------------------------------------------------------------
1094 template<jit::complex_scalar T, z_func Z, bool SAFE_MATH=false>
1095 class hot_plasma final : public physics<T, SAFE_MATH> {
1096 private:
1098 Z z;
1099
1100 public:
1101//------------------------------------------------------------------------------
1136//------------------------------------------------------------------------------
1147// Setup plasma parameters.
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);
1153
1154 auto ve = graph::sqrt(static_cast<T> (2.0)*physics<T, SAFE_MATH>::q*te /
1157
1158// Setup characteristic frequencies.
1159 auto ec = build_cyclotron_fequency(physics<T, SAFE_MATH>::q,
1160 b_len,
1163 auto wpe2 = build_plasma_fequency(ne, physics<T, SAFE_MATH>::q,
1167
1168// Disperison quantities.
1169 auto P = wpe2/(w*w);
1170 auto q = P/(2.0*(1.0 + ec/w));
1171
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);
1180
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);
1186
1187 auto q_func = 1.0 - 2.0*q;
1188 auto n_func = n2 + npara2;
1189 auto p_func = 1.0 - P;
1190
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);
1197
1198 return isigma*gamma0 + gamma1 + nperp2*P*w/ec*zeta_func*(gamma2 + gamma5*F);
1199 }
1200 };
1201
1202//------------------------------------------------------------------------------
1208//------------------------------------------------------------------------------
1209 template<jit::float_scalar T, class Z, bool SAFE_MATH=false>
1210 class hot_plasma_expansion final : public physics<T, SAFE_MATH> {
1211 private:
1213 Z z;
1214
1215 public:
1216//------------------------------------------------------------------------------
1249//------------------------------------------------------------------------------
1260// Setup plasma parameters.
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);
1266
1267 auto ve = graph::sqrt(static_cast<T> (2.0)*physics<T, SAFE_MATH>::q*te /
1269
1270// Setup characteristic frequencies.
1271 auto ec = build_cyclotron_fequency(physics<T, SAFE_MATH>::q, b_len,
1274 auto wpe2 = build_plasma_fequency(ne, physics<T, SAFE_MATH>::q,
1278
1279// Disperison quantities.
1280 auto P = wpe2/(w*w);
1281 auto q = P/(2.0*(1.0 + ec/w));
1282
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);
1291
1292 auto vtnorm = ve/physics<T, SAFE_MATH>::c;
1293
1294 auto zeta = (1.0 - ec/w)/(npara*vtnorm);
1295 auto Z_func = this->z.Z(zeta);
1296
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;
1301
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);
1308
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);
1311 }
1312 };
1313
1314//******************************************************************************
1315// Dispersion interface.
1316//******************************************************************************
1318 template<class D>
1319 concept function = std::is_base_of<dispersion_function<typename D::base, D::safe_math>, D>::value;
1320
1321//------------------------------------------------------------------------------
1325//------------------------------------------------------------------------------
1326 template<function DISPERSION_FUNCTION>
1328 protected:
1330 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1331 DISPERSION_FUNCTION::safe_math> D;
1332
1334 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1335 DISPERSION_FUNCTION::safe_math> dxdt;
1337 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1338 DISPERSION_FUNCTION::safe_math> dydt;
1340 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1341 DISPERSION_FUNCTION::safe_math> dzdt;
1343 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1344 DISPERSION_FUNCTION::safe_math> dkxdt;
1346 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1347 DISPERSION_FUNCTION::safe_math> dkydt;
1349 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1350 DISPERSION_FUNCTION::safe_math> dkzdt;
1352 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1353 DISPERSION_FUNCTION::safe_math> dsdt;
1354
1355 public:
1356//------------------------------------------------------------------------------
1368//------------------------------------------------------------------------------
1369 dispersion_interface(graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1370 DISPERSION_FUNCTION::safe_math> w,
1371 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1372 DISPERSION_FUNCTION::safe_math> kx,
1373 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1374 DISPERSION_FUNCTION::safe_math> ky,
1375 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1376 DISPERSION_FUNCTION::safe_math> kz,
1377 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1378 DISPERSION_FUNCTION::safe_math> x,
1379 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1380 DISPERSION_FUNCTION::safe_math> y,
1381 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1382 DISPERSION_FUNCTION::safe_math> z,
1383 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1384 DISPERSION_FUNCTION::safe_math> t,
1385 equilibrium::shared<typename DISPERSION_FUNCTION::base,
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);
1395
1396 if (graph::pseudo_variable_cast(x).get()) {
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();
1404 }
1405
1406 dxdt = -dDdkx/dDdw;
1407 dydt = -dDdky/dDdw;
1408 dzdt = -dDdkz/dDdw;
1409 dkxdt = dDdx/dDdw;
1410 dkydt = dDdy/dDdw;
1411 dkzdt = dDdz/dDdw;
1412
1413 dsdt = graph::vector(dxdt, dydt, dzdt)->length();
1414 }
1415
1416//------------------------------------------------------------------------------
1429//------------------------------------------------------------------------------
1430 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1431 DISPERSION_FUNCTION::safe_math>
1432 solve(graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1433 DISPERSION_FUNCTION::safe_math> x,
1434 graph::input_nodes<typename DISPERSION_FUNCTION::base,
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) {
1439 auto x_var = graph::variable_cast(x);
1440
1441 workflow::manager<typename DISPERSION_FUNCTION::base,
1442 DISPERSION_FUNCTION::safe_math> work(index);
1443
1444 solver::newton(work, {x}, inputs, this->D,
1445 graph::shared_random_state<typename DISPERSION_FUNCTION::base,
1446 DISPERSION_FUNCTION::safe_math> (),
1447 tolarance, max_iterations);
1448
1449 work.compile();
1450 work.run();
1451
1452 work.copy_to_host(x, x_var->data());
1453
1454 return this->D*this->D;
1455 }
1456
1457//------------------------------------------------------------------------------
1461//------------------------------------------------------------------------------
1462 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1463 DISPERSION_FUNCTION::safe_math>
1465 return this->D*this->D;
1466 }
1467
1468//------------------------------------------------------------------------------
1472//------------------------------------------------------------------------------
1473 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1474 DISPERSION_FUNCTION::safe_math>
1476 return this->D;
1477 }
1478
1479//------------------------------------------------------------------------------
1483//------------------------------------------------------------------------------
1484 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1485 DISPERSION_FUNCTION::safe_math>
1487 return this->dsdt;
1488 }
1489
1490//------------------------------------------------------------------------------
1494//------------------------------------------------------------------------------
1495 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1496 DISPERSION_FUNCTION::safe_math>
1498 return this->dxdt;
1499 }
1500
1501//------------------------------------------------------------------------------
1505//------------------------------------------------------------------------------
1506 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1507 DISPERSION_FUNCTION::safe_math>
1509 return this->dydt;
1510 }
1511
1512//------------------------------------------------------------------------------
1516//------------------------------------------------------------------------------
1517 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1518 DISPERSION_FUNCTION::safe_math>
1520 return this->dzdt;
1521 }
1522
1523//------------------------------------------------------------------------------
1527//------------------------------------------------------------------------------
1528 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1529 DISPERSION_FUNCTION::safe_math>
1531 return this->dkxdt;
1532 }
1533
1534//------------------------------------------------------------------------------
1538//------------------------------------------------------------------------------
1539 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1540 DISPERSION_FUNCTION::safe_math>
1542 return this->dkydt;
1543 }
1544
1545//------------------------------------------------------------------------------
1549//------------------------------------------------------------------------------
1550 graph::shared_leaf<typename DISPERSION_FUNCTION::base,
1551 DISPERSION_FUNCTION::safe_math>
1553 return this->dkzdt;
1554 }
1555
1556//------------------------------------------------------------------------------
1558//------------------------------------------------------------------------------
1560 D->to_latex();
1561 std::cout << std::endl;
1562 }
1563
1564//------------------------------------------------------------------------------
1566//------------------------------------------------------------------------------
1568 get_dkxdt()->to_latex();
1569 std::cout << std::endl;
1570 }
1571
1572//------------------------------------------------------------------------------
1574//------------------------------------------------------------------------------
1576 get_dkydt()->to_latex();
1577 std::cout << std::endl;
1578 }
1579
1580//------------------------------------------------------------------------------
1582//------------------------------------------------------------------------------
1584 get_dkzdt()->to_latex();
1585 std::cout << std::endl;
1586 }
1587
1588//------------------------------------------------------------------------------
1590//------------------------------------------------------------------------------
1591 void print_dxdt() {
1592 get_dxdt()->to_latex();
1593 std::cout << std::endl;
1594 }
1595
1596//------------------------------------------------------------------------------
1598//------------------------------------------------------------------------------
1599 void print_dydt() {
1600 get_dydt()->to_latex();
1601 std::cout << std::endl;
1602 }
1603
1604//------------------------------------------------------------------------------
1606//------------------------------------------------------------------------------
1607 void print_dzdt() {
1608 get_dzdt()->to_latex();
1609 std::cout << std::endl;
1610 }
1611 };
1612}
1613
1614#endif /* dispersion_h */
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
Extra ordinary wave dispersion function.
Definition dispersion.hpp:815
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 X-Mode.
Definition dispersion.hpp:840
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.