WaSH Docs
sedov_computer.hpp
Go to the documentation of this file.
1 
26 #pragma once
27 
28 #include <cmath>
29 #include <fstream>
30 #include <functional>
31 #include <iomanip>
32 #include <iostream>
33 #include <string>
34 #include <variant>
35 #include <vector>
36 #include <cstdint>
37 
38 using Real = double;
39 using KeyType = uint64_t;
40 
41 template <class... T, class... Separators>
42 void writeAscii(size_t firstIndex, size_t lastIndex, const std::string& path, bool append,
43  const std::vector<std::variant<T*...>>& fields, Separators&&... separators);
44 
45 void printHelp(char* binName);
46 void writeColumns1D(const std::string& path);
47 
49 public:
50  static double rho_shock;
51  static double p_shock;
52  static double vel_shock;
53  static double u_shock;
54  static double cs_shock;
55  static double sedovSol(const size_t dim, // geometry factor: 1=planar, 2=cylindircal, 3=spherical
56  const double time, // temporal point where solution is desired [seconds]
57  const double eblast, // energy of blast in the wave front [erg]
58  const double omega_i, // density power law exponent in 'rho = rho0 * r**(-omega)'
59  const double gamma_i, // gamma law equation of state
60  const double rho0, // ambient density g/cm**3 in 'rho = rho0 * r**(-omega)'
61  const double u0, // ambient internal energy [erg/g]
62  const double p0, // ambient pressure [erg/cm**3]
63  const double vel0, // ambient material speed [cm/s]
64  const double cs0, // ambient sound speed [cm/s]
65  const std::vector<double>& r, // out: spatial points where solution is desired [cm]
66  std::vector<double>& rho, // out: density [g/cm**3]
67  std::vector<double>& p, // out: presssure [erg/cm**3]
68  std::vector<double>& u, // out: specific internal energy [erg/g]
69  std::vector<double>& vel, // out: velocity [cm/s]
70  std::vector<double>& cs); // out: sound speed [cm/s]
71 
72 private:
73  // Constants
74  static inline const double eps = 1.e-10; // eps controls the integration accuracy, don't get too greedy or the
75  // number of function evaluations required kills.
76  static inline const double eps2 = 1.e-30; // eps2 controls the root find accuracy
77  static inline const double osmall = 1.e-4; // osmall controls the size of transition regions
78 
79  // Private global variables
80  static double xgeom, omega, gamma; //
81  static double gamm1, gamp1, gpogm, xg2; //
82  static bool lsingular, lstandard, lvacuum; //
83  static bool lomega2, lomega3; //
84  static double a0, a1, a2, a3, a4, a5; //
85  static double a_val, b_val, c_val, d_val, e_val; //
86  static double rwant, vwant; //
87  static double r2, v0, vv, rvv; //
88  static double gam_int; //
89 
90  static void sedov_funcs(const double v, // Similarity variable v
91  double& l_fun, // out: l_fun is book's zeta
92  double& dlamdv, // out: l_fun derivative
93  double& f_fun, // out: f_fun is book's V
94  double& g_fun, // out: g_fun is book's D
95  double& h_fun); // out: h_fun is book's P
96 
97  static double efun01(const double v); //
98 
99  static double efun02(const double v); //
100 
101  static double sed_v_find(const double v); //
102 
103  static double sed_r_find(const double r); //
104 
105  static void midpnt(const size_t n, //
106  std::function<double(const double)> func, //
107  const double a, //
108  const double b, //
109  double& s); //
110 
111  static double midpowl_func(std::function<double(const double)> funk, //
112  const double x, //
113  const double aa); //
114 
115  static void midpowl(const size_t n, //
116  std::function<double(const double)> funk, //
117  const double aa, //
118  const double bb, //
119  double& s); // out:
120 
121  static double midpowl2_func(std::function<double(const double)> funk, //
122  const double x, //
123  const double aa); //
124 
125  static void midpowl2(const size_t n, //
126  std::function<double(const double)> funk, //
127  const double aa, //
128  const double bb, //
129  double& s); // out:
130 
131  static void polint(double* xa, //
132  double* ya, //
133  const size_t n, //
134  const double x, //
135  double& y, // out:
136  double& dy); // out:
137 
138  static void qromo(
139  std::function<double(const double)> func, //
140  const double a, //
141  const double b, //
142  const double eps, //
143  double& ss, //
144  std::function<void(const size_t, std::function<double(const double)>, const double, const double, double&)>
145  choose); //
146 
147  static double zeroin(
148  const double ax, // Left endpoint of initial interval
149  const double bx, // Right endpoint of initial interval
150  std::function<double(const double)>
151  f, // Function subprogram which evaluates f(x) for any x in the interval [ax,bx]
152  const double tol); // Desired length of the interval of uncertainty of the final result (>= 0.)
153 };
Definition: sedov_computer.hpp:48