KIDS  ver-0.0.1
KIDS : Kernel Integrated Dynamics Simulator
Loading...
Searching...
No Matches
phys.h
Go to the documentation of this file.
1#ifndef PHYS_H
2#define PHYS_H
3
4#include <array>
5#include <cmath>
6#include <complex>
7#include <cstdlib>
8#include <iomanip>
9#include <iostream>
10#include <map>
11
12#if (__cplusplus < 201402L)
14#define CONSTTYPE const
15#define CONSTEXPR_DECOR
16#else
17#define FULLY_COMPILE_TIME_OPT
18#define CONSTTYPE constexpr
19#define CONSTEXPR_DECOR constexpr
20#endif // (__cplusplus < 201402L)
21
22// using real_precision = kids_real;
23using real_precision = double;
24
25namespace phys { // phys::
26
27namespace math { // phys::math::
28
29constexpr real_precision eu = 2.718281828459045235360287;
30constexpr real_precision pi = 3.141592653589793238462643L;
31constexpr real_precision twopi = 6.283185307179586476925287L;
32constexpr real_precision halfpi = 1.570796326794896619231321L;
33constexpr real_precision eps8 = 1.0E-8L;
34constexpr real_precision eps16 = 1.0E-16L;
35constexpr real_precision eps32 = 1.0E-32L;
36
37constexpr real_precision sqrttwo = 1.414213562373095048801689L;
38constexpr real_precision sqrthalf = 0.707106781186547524400844L;
39
40constexpr std::complex<real_precision> im(0.0L, 1.0L);
41constexpr std::complex<real_precision> iu(1.0L, 0.0L);
42constexpr std::complex<real_precision> iz(0.0L, 0.0L);
43
44}; // namespace math
45
46struct unit_error : public std::runtime_error {
47 unit_error(std::string const text) : std::runtime_error(text) {}
48};
49
51
52#if (__cplusplus < 201703L)
57template <int...>
58struct seq {};
59template <int N, int... S>
60struct gens : gens<N - 1, N - 1, S...> {};
61template <int... S>
62struct gens<0, S...> {
63 using type = seq<S...>;
64};
65template <typename T, std::size_t N>
66constexpr T array_add_n(const std::array<T, N> a, const std::array<T, N> b, int n) {
67 return a[n] + b[n];
68}
69template <typename T, std::size_t N, int... S>
70constexpr std::array<T, N> array_add_impl(const std::array<T, N> a, const std::array<T, N> b, seq<S...>) {
71 return std::array<T, N>{{array_add_n(a, b, S)...}};
72}
73template <typename T, std::size_t N>
74constexpr std::array<T, N> array_add(const std::array<T, N> a, const std::array<T, N> b) {
75 return array_add_impl(a, b, typename gens<N>::type());
76}
77
78template <typename T, std::size_t N>
79constexpr T array_minus_n(const std::array<T, N> a, const std::array<T, N> b, int n) {
80 return a[n] - b[n];
81}
82template <typename T, std::size_t N, int... S>
83constexpr std::array<T, N> array_minus_impl(const std::array<T, N> a, const std::array<T, N> b, seq<S...>) {
84 return std::array<T, N>{{array_minus_n(a, b, S)...}};
85}
86template <typename T, std::size_t N>
87constexpr std::array<T, N> array_minus(const std::array<T, N> a, const std::array<T, N> b) {
88 return array_minus_impl(a, b, typename gens<N>::type());
89}
90
91template <typename T, std::size_t N>
92constexpr T array_scale_n(const std::array<T, N> a, T b_val, int n) {
93 return a[n] * b_val;
94}
95template <typename T, std::size_t N, int... S>
96constexpr std::array<T, N> array_scale_impl(const std::array<T, N> a, const T b, seq<S...>) {
97 return std::array<T, N>{{array_scale_n(a, b, S)...}};
98}
99template <typename T, std::size_t N>
100constexpr std::array<T, N> array_scale(const std::array<T, N> a, T b) {
101 return array_scale_impl(a, b, typename gens<N>::type());
102}
103
104#else // (if c++17 is support it will be much easier)
105
106template <typename T, std::size_t N>
107constexpr std::array<T, N> array_add(const std::array<T, N> a, const std::array<T, N> b) {
108 std::array<T, N> res{};
109 for (int i = 0; i < N; ++i) res[i] = a[i] + b[i];
110 return res;
111}
112template <typename T, std::size_t N>
113constexpr std::array<T, N> array_minus(const std::array<T, N> a, const std::array<T, N> b) {
114 std::array<T, N> res{};
115 for (int i = 0; i < N; ++i) res[i] = a[i] - b[i];
116 return res;
117}
118template <typename T, std::size_t N>
119constexpr std::array<T, N> array_scale(const std::array<T, N> a, T b) {
120 std::array<T, N> res{};
121 for (int i = 0; i < N; ++i) res[i] = a[i] * b;
122 return res;
123}
124#endif // (__cplusplus < 201703L)
126
127template <typename T, std::size_t N>
129 public:
130 using type = T;
131 std::array<T, N> _data;
132
133 constexpr dimensions() : _data{0} {};
134
135 constexpr dimensions(const std::array<T, N>& a) : _data{a} {};
136
137 // for aggregate initialization, please using dimensions{{....}};
138
139 inline constexpr bool operator==(const dimensions& rdim) const { return (_data == rdim._data); }
140 inline constexpr bool operator!=(const dimensions& rdim) const { return !(_data == rdim._data); }
141 inline constexpr bool operator<(const dimensions& rdim) const { return (_data < rdim._data); }
142 inline constexpr bool operator>(const dimensions& rdim) const { return (_data > rdim._data); }
143
144 inline constexpr dimensions operator/(const dimensions rdim) const {
145 return dimensions{array_minus(_data, rdim._data)};
146 }
147 inline constexpr dimensions operator*(const dimensions rdim) const {
148 return dimensions{array_add(_data, rdim._data)};
149 }
150 inline constexpr dimensions power(const T index) const { return dimensions{array_scale(_data, index)}; }
151 inline std::string to_string() const {
152 std::ostringstream os;
153 os << "<";
154 for (auto i : _data) os << i << ", ";
155 os << ">";
156 return os.str();
157 }
158};
159
163const int dimension7_size = 7;
166 _L, // length dimension7
167 _T, // time dimension7
168 _M, // mass dimension7
169 _I, // electric current dimension7 (_C is for charge as alternate)
170 _Q, // thermodynamic temperature dimension7 (Q actually means \Theta)
171 _N, // amount of substance dimension7
172 _J, // luminous intensity dimension7
173};
174
175inline constexpr real_precision reduce_l_nonzero(const dimension7 dim) {
176 return (int{dim._data[0] != 0L} + int{dim._data[1] != 0L} + int{dim._data[2] != 0L} + int{dim._data[3] != 0L} +
177 int{dim._data[4] != 0L} + int{dim._data[5] != 0L} + int{dim._data[6] != 0L});
178}
179inline constexpr real_precision reduce_l_energy(const dimension7 dim) {
180 return -dim._data[_L] - dim._data[_T] + dim._data[_M] + dim._data[_Q];
181}
182
186constexpr dimension7 length_d{{1, 0, 0, 0, 0, 0, 0}};
187constexpr dimension7 time_d{{0, 1, 0, 0, 0, 0, 0}};
188constexpr dimension7 mass_d{{0, 0, 1, 0, 0, 0, 0}};
189constexpr dimension7 electric_current_d{{0, 0, 0, 1, 0, 0, 0}};
190constexpr dimension7 thermodynamic_temperature_d{{0, 0, 0, 0, 1, 0, 0}};
191constexpr dimension7 amount_of_substance_d{{0, 0, 0, 0, 0, 1, 0}};
192constexpr dimension7 luminous_intensity_d{{0, 0, 0, 0, 0, 0, 1}};
193
199
204constexpr dimension7 wave_number_d{{-1, 0, 0}};
205constexpr dimension7 area_d{{2, 0, 0}};
206constexpr dimension7 volume_d{{3, 0, 0}};
208
211constexpr dimension7 frequency_d{{0, -1, 0}};
212constexpr dimension7 angular_velocity_d{{0, -1, 0}};
213constexpr dimension7 angular_acceleration_d{{0, -2, 0}};
216
219constexpr dimension7 speed_d{{1, -1, 0}};
220constexpr dimension7 acceleration_d{{1, -2, 0}};
221constexpr dimension7 jerk_d{{1, -3, 0}};
222constexpr dimension7 jounce_d{{1, -4, 0}};
223constexpr dimension7 crackle_d{{1, -5, 0}};
224constexpr dimension7 pop_d{{1, -6, 0}};
225constexpr dimension7 absement_d{{1, 1, 0}};
226constexpr dimension7 area_flow_rate_d{{2, -1, 0}};
227constexpr dimension7 volume_flow_rate_d{{3, -1, 0}};
231constexpr dimension7 specific_energy_d{{2, -2, 0}};
234constexpr dimension7 absorbed_dose_rate_d{{2, -3, 0}};
237
240constexpr dimension7 inertia_d{{2, 0, 1}};
241constexpr dimension7 mass_line_density_d{{-1, 0, 1}};
242constexpr dimension7 mass_area_density_d{{-2, 0, 1}};
243constexpr dimension7 mass_density_d{{-3, 0, 1}};
244constexpr dimension7 specific_volume_d{{3, 0, -1}};
245constexpr dimension7 mass_flow_rate_d{{0, -1, 1}};
247constexpr dimension7 mass_flow_jerk_d{{0, -3, 1}};
248
249constexpr dimension7 force_d{{1, -2, 1}};
250constexpr dimension7 momentum_d{{1, -1, 1}};
251constexpr dimension7 energy_d{{2, -2, 1}};
254constexpr dimension7 angular_momentum_d{{2, -1, 1}};
256
257constexpr dimension7 inv_ener_d{{-2, 2, -1}};
258
259constexpr dimension7 power_d{{2, -3, 1}};
260constexpr dimension7 energy_density_d{{-1, -2, 1}};
263constexpr dimension7 energy_line_density_d{{1, -2, 1}};
264constexpr dimension7 power_density_d{{-1, -3, 1}};
266
272constexpr dimension7 dynamic_viscosity_d{{-1, -1, 1}};
273
274
279
284
287constexpr dimension7 current_density_d{{-2, 0, 0, 1}};
288constexpr dimension7 electric_charge_d{{0, 1, 0, 1}};
289constexpr dimension7 electric_charge_density_d{{-3, 1, 0, 1}};
292constexpr dimension7 electric_dipole_moment_d{{1, 1, 0, 1}};
293
298
299constexpr dimension7 magnetic_moment_d{{2, 0, 0, 1}};
300constexpr dimension7 magnetic_field_strength_d{{-1, 0, 0, 1}};
302
303constexpr dimension7 electric_potential_d{{2, -3, 1, -1}};
304constexpr dimension7 electric_field_strenth_d{{1, -3, 1, -1}};
305constexpr dimension7 electric_resistance_d{{2, -3, 1, -2}};
306constexpr dimension7 electric_conductance_d{{-2, 3, -1, 2}};
307constexpr dimension7 electric_resistivity_d{{3, -3, 1, -2}};
308constexpr dimension7 electric_conductivity_d{{-3, 3, -1, 2}};
309constexpr dimension7 electric_capacitance_d{{-2, 4, -1, 2}};
310constexpr dimension7 magnetic_flux_d{{2, -2, 1, -1}};
312 {0, -2, 1, -1}};
313constexpr dimension7 inductance_d{{2, -2, 1, -2}};
314
316
317constexpr dimension7 magnetic_permeability_d{{1, -2, 1, -2}};
318constexpr dimension7 permittivity_d{{-3, 4, -1, 2}};
320
323constexpr dimension7 inv_temp_d{{0, 0, 0, 0, -1}};
324constexpr dimension7 heat_capacity_d{{2, -2, 1, 0, -1}};
327 {0, -3, 1, 0, -1}};
328constexpr dimension7 specific_heat_capacity_d{{2, -2, 0, 0, -1}};
329constexpr dimension7 thermal_conductivity_d{{1, -3, 1, 0, -1}};
330constexpr dimension7 thermal_insulance_d{{0, 3, -1, 0, 1}};
331constexpr dimension7 thermal_resistance_d{{-2, 3, -1, 0, 1}};
332constexpr dimension7 thermal_resistivity_d{{-1, 3, -1, 0, 1}};
334
337constexpr dimension7 concentration_d{{-3, 0, 0, 0, 0, 1}};
338constexpr dimension7 molar_energy_d{{2, -2, 1, 0, 0, -1}};
339constexpr dimension7 molar_entropy_d{{2, -2, 1, 0, -1, -1}};
341
345constexpr dimension7 illuminance_d{{-2, 0, 0, 0, 0, 0, 1}};
348
349const std::map<const dimension7, const std::string> description = {
350 // base dimension7
351 {dimensionless_d, "dimensionless"},
352 {length_d, "length, wavelength"},
353 {time_d, "time"},
354 {mass_d, "mass"},
355 {electric_current_d, "electric_current"},
356 {thermodynamic_temperature_d, "thermodynamic_temperature"},
357 {amount_of_substance_d, "amount_of_substance"},
358 {luminous_intensity_d, "luminous_intensity, luminous_flux"},
359 // derived (L, T)
360 {wave_number_d, "wave_number"},
361 {area_d, "area"},
362 {volume_d, "volume"},
363 {frequency_d, "frequency"},
364 {angular_velocity_d, "angular_velocity"},
365 {angular_acceleration_d, "angular_acceleration"},
366 {speed_d, "speed"},
367 {acceleration_d, "acceleration"},
368 {jerk_d, "jerk"},
369 {jounce_d, "jounce"},
370 {crackle_d, "crackle"},
371 {pop_d, "pop"},
372 {absement_d, "absement"},
373 {area_flow_rate_d, "area_flow_rate, kinematic_viscosity, thermal_diffusivity"},
374 {volume_flow_rate_d, "volume_flow_rate"},
375 {specific_energy_d, "specific_energy"},
376 {absorbed_dose_rate_d, "absorbed_dose_rate"},
377 {substance_permeability_d, "substance_permeability"},
378 // derived (L, T, M)
379 {inertia_d, "inertia"},
380 {mass_line_density_d, "mass_line_density"},
381 {mass_area_density_d, "mass_area_density"},
382 {mass_density_d, "mass_density"},
383 {specific_volume_d, "specific_volume"},
384 {mass_flow_rate_d, "mass_flow_rate"},
385 {mass_flow_acceleration_d, "mass_flow_acceleration, surface_tension"},
386 {mass_flow_jerk_d, "mass_flow_jerk, power_area_density"},
387 {force_d, "force"},
388 {momentum_d, "momentum"},
389 {energy_d, "energy, moment_of_force, torque"},
390 {angular_momentum_d, "angular_momentum, action"},
391 {power_d, "power"},
392 {energy_density_d, "energy_density, pressure"},
393 {energy_line_density_d, "energy_line_density"},
394 {power_density_d, "power_density"},
395 {dynamic_viscosity_d, "dynamic_viscosity"},
396 // derived (L, T, M, I)
397 {current_density_d, "current_density"},
398 {electric_charge_d, "electric_charge"},
399 {electric_charge_density_d, "electric_charge_density"},
401 "electric_area_charge_density, electric_flux_density, electric_displacement_field, electric_polarization_field"},
402 {electric_line_charge_density_d, "electric_line_charge_density"},
403 {electric_dipole_moment_d, "electric_dipole_moment"},
404 {magnetic_moment_d, "magnetic_moment"},
405 {magnetic_field_strength_d, "magnetic_field_strength, magnetization"},
406 {electric_potential_d, "electric_potential"},
407 {electric_field_strenth_d, "electric_field_strenth"},
408 {electric_resistance_d, "electric_resistance"},
409 {electric_conductance_d, "electric_conductance"},
410 {electric_resistivity_d, "electric_resistivity"},
411 {electric_conductivity_d, "electric_conductivity"},
412 {electric_capacitance_d, "electric_capacitance"},
413 {magnetic_flux_d, "magnetic_flux"},
414 {magnetic_flux_density_d, "magnetic_flux_density"},
415 {inductance_d, "inductance"},
416 {electric_chargme_mass_ratio_d, "electric_chargme_mass_ratio"},
417 {magnetic_permeability_d, "magnetic_permeability"},
418 {permittivity_d, "permittivity"},
419 // derived (L, T, M, I, K)
420 {heat_capacity_d, "heat_capacity, entropy"},
421 {heat_transfer_coefficient_d, "heat_transfer_coefficient"},
422 {specific_heat_capacity_d, "specific_heat_capacity"},
423 {thermal_conductivity_d, "thermal_conductivity"},
424 {thermal_insulance_d, "thermal_insulance"},
425 {thermal_resistance_d, "thermal_resistance"},
426 {thermal_resistivity_d, "thermal_resistivity"},
427 // derived (L, T, M, I, K, N)
428 {concentration_d, "concentration"},
429 {molar_energy_d, "molar_energy"},
430 {molar_entropy_d, "molar_entropy"},
431 // derived (L, T, M, I, K, N, J)
432 {illuminance_d, "illuminance, luminance"},
433};
434
435
436class uval { // united value class (value with dimension7; only support */^ operations)
437 public:
439
440 uval() : dim(), value(1) {}
441 explicit constexpr uval(const value_type& val) : dim{}, value{val} {}
442 explicit constexpr uval(const dimension7& dim, const value_type& val = 1L) : dim{dim}, value{val} {}
443
446};
447inline constexpr uval operator*(const uval& lhs, const uval& rhs) {
448 return uval(lhs.dim * rhs.dim, lhs.value * rhs.value);
449}
450inline constexpr uval operator*(const real_precision& lhs, const uval& rhs) { return uval(lhs) * rhs; }
451inline constexpr uval operator*(const uval& lhs, const real_precision& rhs) { return lhs * uval(rhs); }
452inline constexpr uval operator/(const uval& lhs, const uval& rhs) {
453 return uval(lhs.dim / rhs.dim, lhs.value / rhs.value);
454}
455inline constexpr uval operator/(const real_precision& lhs, const uval& rhs) { return uval(lhs) / rhs; }
456inline constexpr uval operator/(const uval& lhs, const real_precision& rhs) { return lhs / uval(rhs); }
457inline const uval operator+(const uval& lhs, const uval& rhs) {
458 if (lhs.dim != rhs.dim) { throw unit_error("add function must fit the same unit"); }
459 return uval(lhs.dim, lhs.value + rhs.value);
460}
461inline const uval operator-(const uval& lhs, const uval& rhs) {
462 if (lhs.dim != rhs.dim) { throw unit_error("minus function must fit the same unit"); }
463 return uval(lhs.dim, lhs.value - rhs.value);
464}
465inline uval power(const uval& lhs, const real_precision& index) {
466 return uval(lhs.dim.power(index), std::pow(lhs.value, index));
467}
468inline bool is_same_dimension7(const uval& lhs, const uval& rhs) { return lhs.dim == rhs.dim; }
469
470inline std::string to_string(const uval& u) {
471 std::ostringstream os;
472 os << std::setiosflags(std::ios::scientific) << std::setprecision(6) << std::setw(12) << u.value;
473 return os.str() + " " + u.dim.to_string();
474}
475
480constexpr uval _base_1s(time_d);
486// derived
500// others
501constexpr uval _nostd_1cal = 4.184L * _base_1J;
503
506constexpr uval G_gravitional_constant(dimension7{{3, -2, -1}}, 6.6740831E-11L);
507constexpr uval c_lightspeed(speed_d, 2.997924580E+8L);
508constexpr uval ep0_permittivity(permittivity_d, 8.854187817E-12L);
509constexpr uval mu0_permeability(magnetic_permeability_d, 1.256637061E-6L);
510constexpr uval ke_Comloub(dimensionless_d / permittivity_d, 8.9875517873681764E+9L);
511constexpr uval R_gas_constant(molar_entropy_d, 8.314459848L);
512constexpr uval Rydberg_constant(wave_number_d, 10973731.56850865L);
514constexpr uval Stefan_constant(dimension7{{0, -3, 1, -4}}, 5.67036713E-8L);
515constexpr uval muB_magnetic_moment(magnetic_moment_d, 9.27400999457E-24L);
516constexpr uval muN_magnetic_moment(magnetic_moment_d, 5.05078369931E-27L);
517constexpr uval Bohr_length(length_d, 5.291772106712E-11L);
518constexpr uval h_Planck(action_d, 6.62607004081E-34L);
519constexpr uval hb_Planck(action_d, 1.05457180013E-34L);
520constexpr uval me_mass(mass_d, 9.1093835611E-31L);
521constexpr uval mp_mass(mass_d, 1.67262189821E-27L);
522constexpr uval mn_mass(mass_d, 1.67492749804e-27L);
523constexpr uval amu_mass(mass_d, 1.66053886E-27L);
524constexpr uval e_charge(electric_charge_d, 1.602176620898E-19L);
525constexpr uval k_Boltzman(entropy_d, 1.3806490351E-23L);
526constexpr uval N_Avagadro(dimensionless_d / amount_of_substance_d, 6.02214085774E+23L);
528
529static const std::map<std::string, real_precision> uval_prefix = {
530 {"Y", 1e+24L}, {"Z", 1e+21L}, {"E", 1e+18L}, {"P", 1e+15L}, {"T", 1e+12L}, {"G", 1e+9L},
531 {"M", 1e+6L}, {"k", 1e+3L}, {"h", 1e+2L}, {"c", 1e-2L}, {"m", 1e-3L}, {"µ", 1e-6L},
532 {"n", 1e-9L}, {"p", 1e-12L}, {"f", 1e-15L}, {"a", 1e-18L}, {"z", 1e-21L}, {"y", 1e-24L},
533};
534static const std::map<std::string, uval> uval_names = {
535 {"1", _base_1},
536 {"m", _base_1m},
537 {"s", _base_1s},
538 {"kg", _base_1kg},
539 {"A", _base_1A},
540 {"K", _base_1K},
541 {"mol", _base_1mol},
542 {"cd", _base_1cd},
543 {"Hz", _base_1Hz},
544 {"N", _base_1N},
545 {"Pa", _base_1Pa},
546 {"J", _base_1J},
547 {"W", _base_1W},
548 {"C", _base_1C},
549 {"V", _base_1V},
550 {"F", _base_1F},
551 {"S", _base_1S},
552 {"Om", _base_1Om},
553 {"Wb", _base_1Wb},
554 {"T", _base_1T},
555 {"H", _base_1H},
556 // non-standard
557 {"g", 0.001L * _base_1kg},
558 {"Angs", 1e-10L * _base_1m},
559 {"Bohr", Bohr_length},
560 {"amu", amu_mass},
561 {"e", e_charge},
562 {"eV", e_charge* _base_1V},
563 {"Hart", power(ke_Comloub, 2) * me_mass* power(e_charge, 4) / power(hb_Planck, 2)},
564 {"auK", power(ke_Comloub, 2) * me_mass* power(e_charge, 4) / power(hb_Planck, 2) / (k_Boltzman)},
565 {"cal", _nostd_1cal},
566 {"wn", h_Planck* c_lightspeed / (0.01L * _base_1m)},
567};
568
569namespace inner {
571template <typename T>
573 long double x = 2.7182818284590452353602874713526624977572470937000L;
574 if (n == 0) return 1;
575 if (n < 0) x = 1. / x, n = -n;
576 long double y = 1.;
577 while (n > 1) {
578 if (n % 2 == 0) {
579 n /= 2;
580 } else {
581 y *= x;
582 n = (n - 1) / 2;
583 }
584 x *= x;
585 }
586 return (T)(x * y);
587}
588template <typename T>
589CONSTEXPR_DECOR long double exp(T num) {
590 long double sum = 0L;
591 long double term = 1L;
592 long int num_i = (long int) (num);
593 long double pref = exp_int<long double>(num_i);
594 num -= num_i;
595 for (unsigned int count = 1; term >= 1e-100 || count < 100; ++count) {
596 sum += term;
597 term *= ((long double) num) / count;
598 }
599 return pref * sum;
600}
601template <typename T>
602CONSTEXPR_DECOR long double log(T num) {
603 long double log2 = 0.69314718055994530941723212145817656807550013436026L;
604 long double sum = 0L;
605 while (num < 1) num *= 2L, sum -= log2;
606 while (num > 2) num /= 2L, sum += log2;
607 long double term = ((long double) num - 1) / ((long double) num + 1);
608 long double mul = term * term;
609 for (unsigned int tmp_odd = 1; term >= 1e-100 || tmp_odd < 100; tmp_odd += 2) {
610 sum += 2 * term / tmp_odd;
611 term *= mul;
612 }
613 return sum;
614}
615template <typename T>
616CONSTEXPR_DECOR long double pow(T a, T b) {
617 return inner::exp(b * inner::log(a));
618}
620
623template <typename T, std::size_t M, std::size_t N>
624struct matrix {
625 static_assert(M != 0 && N != 0, "matrix requires positive dimension7");
626 using value_type = T;
627 using size_type = std::size_t;
628 static constexpr size_type row_size = M;
629 static constexpr size_type column_size = N;
630 CONSTEXPR_DECOR T* operator[](std::size_t i) { return _data[i]; }
631#ifdef FULLY_COMPILE_TIME_OPT
632 CONSTTYPE T const* operator[](std::size_t i) const { return _data[i]; }
633#endif // FULLY_COMPILE_TIME_OPT
634
635 T _data[M][N];
636};
637
638// gauss-jordan elimination
639template <typename T, std::size_t M, std::size_t N>
640CONSTTYPE std::tuple<matrix<T, M, N>, std::size_t, T> gauss_jordan_impl(matrix<T, M, N> m, T tolerance) {
641 T det = 1;
642 std::size_t i = 0, j = 0;
643 while (i < M && j < N) {
644 for (std::size_t ip = i + 1; ip < M; ++ip) { // Choose largest magnitude as pivot
645 if (std::abs(m[ip][j]) > std::abs(m[i][j])) {
646 for (std::size_t jp = 0; jp < N; ++jp) {
647 T tmp = m[i][jp];
648 m[i][jp] = m[ip][jp];
649 m[ip][jp] = tmp;
650 }
651 det *= -1;
652 break;
653 }
654 }
655 if (!(std::abs(m[i][j]) < tolerance)) {
656 // normalization
657 auto s = m[i][j];
658 for (std::size_t jp = 0; jp < N; ++jp) m[i][jp] /= s;
659 det /= s;
660 // elimination
661 for (std::size_t ip = 0; ip < M; ++ip) {
662 if (ip == i) continue;
663 if (!(std::abs(m[ip][j]) < tolerance)) {
664 auto s = m[ip][j];
665 for (std::size_t jp = 0; jp < N; ++jp) m[ip][jp] -= s * m[i][jp];
666 }
667 }
668 ++i; // Select next row (i indicates rank)
669 }
670 ++j; // skip && continue to the next column
671 }
672 det = (i == M) ? det : 0;
673 return std::make_tuple(m, i, det);
674}
675
676template <typename T, std::size_t M>
678 matrix<T, M, M> inv = {};
679 matrix<T, M, 2 * M> mI = {};
680 for (std::size_t i = 0; i < M; ++i) {
681 std::size_t j = 0;
682 for (std::size_t j1 = 0; j1 < M; ++j1, ++j) mI[i][j] = m[i][j1];
683 for (std::size_t j2 = 0; j2 < M; ++j2, ++j) mI[i][j] = (i == j2) ? T{1} : T{0};
684 }
686
687 if (std::get<1>(t) < M) throw unit_error("not full rank in unit systems");
688 auto Iinv = std::get<0>(t);
689 for (std::size_t i = 0; i < M; ++i) {
690 std::size_t j = M;
691 for (std::size_t j2 = 0; j2 < M; ++j2, ++j) inv[i][j2] = Iinv[i][j];
692 }
693 return inv;
694}
695
696template <typename T, std::size_t M, std::size_t N, std::size_t P>
698 matrix<T, M, P> c = {0};
699 for (std::size_t i = 0; i < M; ++i) {
700 for (std::size_t j = 0; j < N; ++j) {
701 for (std::size_t k = 0; k < P; ++k) { c[i][k] += a[i][j] * b[j][k]; }
702 }
703 }
704 return c;
705}
706
707template <typename T, std::size_t M, std::size_t N>
708inline std::ostream& operator<<(std::ostream& os, matrix<T, M, N> m) {
709 for (std::size_t i = 0; i < M; ++i) {
710 for (std::size_t j = 0; j < N; ++j) os << " " << m[i][j];
711 os << "\n";
712 }
713 return os;
714}
716}; // namespace inner
717
718
719class unitsys {
720 public:
722
723 std::array<uval, dimension7_size> units;
727
728 value_type _c, _h, _hb, _ke, _me, _e, _k, _N, _G; // intrinsic constant
729
730 explicit CONSTEXPR_DECOR unitsys(const uval& u0, const uval& u1, const uval& u2, const uval& u3, const uval& u4,
731 const uval& u5, const uval& u6)
732 : units{u0, u1, u2, u3, u4, u5, u6},
733 invA{inner::inverse(MatrixType{
734 u0.dim._data[0], u1.dim._data[0], u2.dim._data[0], u3.dim._data[0],
735 u4.dim._data[0], u5.dim._data[0], u6.dim._data[0], // L
736 u0.dim._data[1], u1.dim._data[1], u2.dim._data[1], u3.dim._data[1],
737 u4.dim._data[1], u5.dim._data[1], u6.dim._data[1], // T
738 u0.dim._data[2], u1.dim._data[2], u2.dim._data[2], u3.dim._data[2],
739 u4.dim._data[2], u5.dim._data[2], u6.dim._data[2], // M
740 u0.dim._data[3], u1.dim._data[3], u2.dim._data[3], u3.dim._data[3],
741 u4.dim._data[3], u5.dim._data[3], u6.dim._data[3], // I
742 u0.dim._data[4], u1.dim._data[4], u2.dim._data[4], u3.dim._data[4],
743 u4.dim._data[4], u5.dim._data[4], u6.dim._data[4], // Q
744 u0.dim._data[5], u1.dim._data[5], u2.dim._data[5], u3.dim._data[5],
745 u4.dim._data[5], u5.dim._data[5], u6.dim._data[5], // N
746 u0.dim._data[6], u1.dim._data[6], u2.dim._data[6], u3.dim._data[6],
747 u4.dim._data[6], u5.dim._data[6], u6.dim._data[6] // J
748 })},
750 _h{conv(h_Planck)},
753 _me{conv(me_mass)},
754 _e{conv(e_charge)},
758
764 inline CONSTEXPR_DECOR value_type eval(const dimension7 dim) const {
765 VectorType vec = {dim._data[0], dim._data[1], dim._data[2], dim._data[3],
766 dim._data[4], dim._data[5], dim._data[6]};
767 VectorType sol = inner::matmul(invA, vec);
768 value_type val = 1.0L;
769 for (int i = 0; i < dimension7_size; ++i) val *= inner::pow(units[i].value, sol._data[i][0]);
770 return val;
771 }
772 inline CONSTEXPR_DECOR value_type conv(const uval& u) { return u.value / this->eval(u.dim); }
774
780 static inline CONSTEXPR_DECOR value_type conv(const dimension7 dim, const unitsys& from_us, const unitsys& to_us) {
781 return from_us.eval(dim) / to_us.eval(dim);
782 }
783 static inline CONSTEXPR_DECOR value_type conv(const uval& u, const unitsys& to_us) {
784 return u.value / to_us.eval(u.dim);
785 }
786 static inline CONSTEXPR_DECOR value_type conv(const unitsys& from_us, const uval& u) {
787 return from_us.eval(u.dim) / u.value;
788 }
789
790 static uval parse(const std::string& str) {
791 size_t pos = str.npos;
792 if ((pos = str.find_last_of(" ")) != str.npos) {
793 value_type v;
794 try {
795 v = std::stod(str.substr(0, pos));
796 } catch (std::runtime_error& e) { throw unit_error(str + ": parse_error in blankspace"); }
797 std::string token2 = str.substr(pos + 1);
798 return v * parse(token2);
799 }
800 if ((pos = str.find_last_of("*")) != str.npos) {
801 std::string token1 = str.substr(0, pos);
802 std::string token2 = str.substr(pos + 1);
803 return parse(token1) * parse(token2);
804 }
805 if ((pos = str.find_last_of("/")) != str.npos) {
806 std::string token1 = str.substr(0, pos);
807 std::string token2 = str.substr(pos + 1);
808 return parse(token1) / parse(token2);
809 }
810 if ((pos = str.find_last_of("^")) != str.npos) {
811 std::string token1 = str.substr(0, pos);
812 std::string token2 = str.substr(pos + 1);
813 std::stringstream sstr(token2);
814 value_type index;
815 sstr >> index;
816 return power(parse(token1), index);
817 }
818 uval u;
819 try {
820 u = uval_names.at(str);
821 } catch (std::out_of_range& e) {
822 try {
823 value_type v = uval_prefix.at(str.substr(0, 1));
824 u = uval_names.at(str.substr(1));
825 u = u * v;
826 } catch (std::out_of_range& e) { throw unit_error(str + ": parse_error in uval"); }
827 }
828 return u;
829 };
833 static inline value_type conv(const std::string& str, const unitsys& to_us) { return conv(parse(str), to_us); }
837 static inline value_type conv(const unitsys& from_us, const std::string& str) { return conv(from_us, parse(str)); }
842 static value_type as(const dimension7 dim, const uval& u, const unitsys& us) {
844 if (ovlp == 0) throw unit_error("invalid conversion");
845 uval ux = (ovlp > 0) ? u : 1L / u;
846 value_type vx = unitsys::conv(ux, us);
847
848 value_type diffL = dim._data[0] - ux.dim._data[0];
849 value_type diffT = dim._data[1] - ux.dim._data[1];
850 value_type diffM = dim._data[2] - ux.dim._data[2];
851 value_type diffQ = dim._data[4] - ux.dim._data[4];
852 value_type diffN = dim._data[5] - ux.dim._data[5];
853 if (dim._data[3] != u.dim._data[3] || dim._data[6] != u.dim._data[6] || diffL + diffT != diffM + diffQ) {
854 throw unit_error("invalid conversion");
855 }
856 value_type coeff_N = -diffN;
857 value_type coeff_k = -diffQ;
858 value_type coeff_h = diffM - coeff_k;
859 value_type coeff_c = -diffT - coeff_h - 2 * coeff_k;
860
861 return vx * std::pow(us._h, coeff_h) * std::pow(us._c, coeff_c) * std::pow(us._k, coeff_k) *
862 std::pow(us._N, coeff_N);
863 }
864 static inline value_type as(const dimension7 dim, const std::string& str, const unitsys& us) {
865 return as(dim, parse(str), us);
866 }
868};
869
870#define PHYS_DEFINE_UNITSYS_NAMESPACE(USNAME, _0, _1, _2, _3, _4, _5, _6) \
871 \
872 namespace USNAME { \
873 using value_type = real_precision; \
874 CONSTTYPE unitsys unit(_0, _1, _2, _3, _4, _5, _6); \
875 CONSTTYPE value_type c = unitsys::conv(phys::c_lightspeed, unit); \
876 CONSTTYPE value_type h = unitsys::conv(phys::h_Planck, unit); \
877 CONSTTYPE value_type hb = unitsys::conv(phys::hb_Planck, unit); \
878 CONSTTYPE value_type ke = unitsys::conv(phys::ke_Comloub, unit); \
879 CONSTTYPE value_type me = unitsys::conv(phys::me_mass, unit); \
880 CONSTTYPE value_type e = unitsys::conv(phys::e_charge, unit); \
881 CONSTTYPE value_type k = unitsys::conv(phys::k_Boltzman, unit); \
882 CONSTTYPE value_type N = unitsys::conv(phys::N_Avagadro, unit); \
883 CONSTTYPE value_type G = unitsys::conv(phys::G_gravitional_constant, unit); \
884 inline value_type as(const dimension7 dim, const uval& u) { return unitsys::as(dim, u, unit); } \
885 inline value_type as(const dimension7 dim, const std::string& str) { return unitsys::as(dim, str, unit); } \
886 };
887
891
892PHYS_DEFINE_UNITSYS_NAMESPACE(planck, /*planck uval*/
894 hb_Planck,
896 k_Boltzman,
898
899PHYS_DEFINE_UNITSYS_NAMESPACE(god_given, /*god-given uval*/
901 hb_Planck,
904
905PHYS_DEFINE_UNITSYS_NAMESPACE(stoney, /*stoney uval*/
908 ke_Comloub,
909 e_charge,
911
912PHYS_DEFINE_UNITSYS_NAMESPACE(natural, /*natural uval*/
914 hb_Planck,
915 me_mass,
918
919PHYS_DEFINE_UNITSYS_NAMESPACE(gauss, /*gauss uval*/
920 0.01L * _base_1m,
921 _base_1s,
922 0.001L * _base_1kg,
923 ke_Comloub,
925
926PHYS_DEFINE_UNITSYS_NAMESPACE(rydberg, /*rydberg uval*/
927 hb_Planck,
928 2 * me_mass,
929 e_charge* e_charge / 2,
930 ke_Comloub,
932
933PHYS_DEFINE_UNITSYS_NAMESPACE(hartree, /*hartree uval*/
934 hb_Planck,
935 me_mass,
936 e_charge,
937 ke_Comloub,
939
940PHYS_DEFINE_UNITSYS_NAMESPACE(ghartree, /*generalized hartree uval*/
941 hb_Planck,
942 me_mass,
943 e_charge,
944 ke_Comloub,
945 k_Boltzman,
946 N_Avagadro,
947 _base_1cd);
948
949PHYS_DEFINE_UNITSYS_NAMESPACE(quantum_chromo_dynamics, /*qcd uval*/
951 hb_Planck,
952 mp_mass,
953 e_charge,
955
956PHYS_DEFINE_UNITSYS_NAMESPACE(au_test, /*atomic uval*/
957 hb_Planck,
958 me_mass,
959 e_charge,
960 ke_Comloub,
961 k_Boltzman,
962 N_Avagadro,
963 _base_1cd);
964
965PHYS_DEFINE_UNITSYS_NAMESPACE(amu, /*atomic mass uval*/
966 hb_Planck,
967 me_mass,
968 e_charge,
969 ke_Comloub,
971
972namespace plk = planck;
973namespace god = god_given;
974namespace sty = stoney;
975namespace nat = natural;
976namespace cgs = gauss;
977namespace ryd = rydberg;
978namespace hat = hartree;
979namespace au = ghartree;
980namespace qcd = quantum_chromo_dynamics;
982
983typedef unitsys us;
984
1003}; // namespace phys
1004
1005
1006#undef CONSTTYPE
1007#undef CONSTEXPR_DECOR
1008#endif // PHYS_H
constexpr dimensions operator*(const dimensions rdim) const
Definition phys.h:147
constexpr bool operator>(const dimensions &rdim) const
Definition phys.h:142
constexpr bool operator!=(const dimensions &rdim) const
Definition phys.h:140
constexpr dimensions(const std::array< T, N > &a)
Definition phys.h:135
constexpr dimensions power(const T index) const
Definition phys.h:150
constexpr dimensions()
Definition phys.h:133
constexpr bool operator<(const dimensions &rdim) const
Definition phys.h:141
constexpr dimensions operator/(const dimensions rdim) const
Definition phys.h:144
std::array< T, N > _data
Definition phys.h:131
constexpr bool operator==(const dimensions &rdim) const
Definition phys.h:139
std::string to_string() const
Definition phys.h:151
value_type _h
Definition phys.h:728
value_type _c
Definition phys.h:728
static value_type as(const dimension7 dim, const uval &u, const unitsys &us)
convert different quantities based on energy equivalence priciples [E] = [M]* c^2 = h / [T] = h * c /...
Definition phys.h:842
CONSTEXPR_DECOR value_type eval(const dimension7 dim) const
Definition phys.h:764
static CONSTEXPR_DECOR value_type conv(const uval &u, const unitsys &to_us)
Definition phys.h:783
static value_type conv(const unitsys &from_us, const std::string &str)
Coverting unit system to a string-style unit [dimension7 used].
Definition phys.h:837
value_type _G
Definition phys.h:728
value_type _N
Definition phys.h:728
value_type _k
Definition phys.h:728
static CONSTEXPR_DECOR value_type conv(const unitsys &from_us, const uval &u)
Definition phys.h:786
std::array< uval, dimension7_size > units
Definition phys.h:723
value_type _hb
Definition phys.h:728
static value_type conv(const std::string &str, const unitsys &to_us)
Coverting string-style unit [dimension7 used] to a unit system.
Definition phys.h:833
static value_type as(const dimension7 dim, const std::string &str, const unitsys &us)
Definition phys.h:864
static CONSTEXPR_DECOR value_type conv(const dimension7 dim, const unitsys &from_us, const unitsys &to_us)
Definition phys.h:780
CONSTEXPR_DECOR unitsys(const uval &u0, const uval &u1, const uval &u2, const uval &u3, const uval &u4, const uval &u5, const uval &u6)
Definition phys.h:730
value_type _e
Definition phys.h:728
value_type _me
Definition phys.h:728
static uval parse(const std::string &str)
Definition phys.h:790
value_type _ke
Definition phys.h:728
CONSTEXPR_DECOR value_type conv(const uval &u)
Definition phys.h:772
real_precision value_type
Definition phys.h:721
MatrixType invA
Definition phys.h:726
dimension7 dim
dimension7
Definition phys.h:444
constexpr uval(const dimension7 &dim, const value_type &val=1L)
Definition phys.h:442
real_precision value_type
Definition phys.h:438
constexpr uval(const value_type &val)
Definition phys.h:441
value_type value
magnitude
Definition phys.h:445
Param::LoadOption::fromString value("fromFile", Param::LoadOption::fromFile) .export_values()
std::ostream & operator<<(std::ostream &os, matrix< T, M, N > m)
Definition phys.h:708
CONSTEXPR_DECOR long double exp(T num)
Definition phys.h:589
CONSTEXPR_DECOR T exp_int(int n)
Definition phys.h:572
CONSTEXPR_DECOR long double log(T num)
Definition phys.h:602
CONSTTYPE matrix< T, M, M > inverse(matrix< T, M, M > m)
Definition phys.h:677
CONSTTYPE matrix< T, M, P > matmul(matrix< T, M, N > a, matrix< T, N, P > b)
Definition phys.h:697
CONSTEXPR_DECOR long double pow(T a, T b)
Definition phys.h:616
CONSTTYPE std::tuple< matrix< T, M, N >, std::size_t, T > gauss_jordan_impl(matrix< T, M, N > m, T tolerance)
Definition phys.h:640
constexpr real_precision halfpi
Definition phys.h:32
constexpr real_precision eps32
Definition phys.h:35
constexpr std::complex< real_precision > iu(1.0L, 0.0L)
constexpr real_precision sqrttwo
Definition phys.h:37
constexpr real_precision eps8
Definition phys.h:33
constexpr real_precision eu
Euler'Constant.
Definition phys.h:29
constexpr real_precision pi
pi
Definition phys.h:30
constexpr real_precision sqrthalf
Definition phys.h:38
constexpr real_precision eps16
Definition phys.h:34
constexpr std::complex< real_precision > im(0.0L, 1.0L)
Imaginary Unit.
constexpr real_precision twopi
Definition phys.h:31
constexpr std::complex< real_precision > iz(0.0L, 0.0L)
Definition phys.h:25
constexpr std::array< T, N > array_minus_impl(const std::array< T, N > a, const std::array< T, N > b, seq< S... >)
Definition phys.h:83
constexpr dimension7 electric_flux_density_d
[I/L^2*T]
Definition phys.h:294
unitsys us
< generalized hatree is same to hatree when out of statistics (k_Boltzman & N_Avagadro)
Definition phys.h:983
constexpr dimension7 molar_energy_d
[M*L^2/T^2/N] energy per amount
Definition phys.h:338
static CONSTTYPE real_precision au_2_g_1mea
Definition phys.h:997
constexpr uval Bohr_length(length_d, 5.291772106712E-11L)
hb^2/(ke*me*e^2)
constexpr uval _base_1F(electric_capacitance_d)
1 faraday
constexpr dimension7 temperature_d
Definition phys.h:195
constexpr dimension7 energy_density_d
[M/L/T^2] energy per volume
Definition phys.h:260
constexpr uval _base_1Om(electric_resistance_d)
1 ohm
constexpr uval ep0_permittivity(permittivity_d, 8.854187817E-12L)
1/(4*pi*ke)
constexpr dimension7 electric_resistance_d
[M*L^2/T^3/I^2] electric potential versus current
Definition phys.h:305
constexpr dimension7 electric_resistivity_d
[M*L^3/T^3/I^2] electric_resistance time length
Definition phys.h:307
constexpr uval _base_1Wb(magnetic_flux_d)
1 weber
constexpr uval e_charge(electric_charge_d, 1.602176620898E-19L)
constexpr dimension7 wave_number_d
[L^-1]
Definition phys.h:204
constexpr uval _base_1Pa(pressure_d)
1 pascal
constexpr dimension7 acceleration_d
[L*T^-2]
Definition phys.h:220
constexpr dimension7 length_d
[L]
Definition phys.h:186
constexpr uval N_Avagadro(dimensionless_d/amount_of_substance_d, 6.02214085774E+23L)
constexpr dimension7 inertia_d
[M*L^2]
Definition phys.h:240
constexpr dimension7 mass_d
[M]
Definition phys.h:188
constexpr dimension7 magnetization_d
[I/L] magnetic moment per volume
Definition phys.h:301
constexpr dimension7 specific_heat_capacity_d
[L^2/T^2/Q] capacity per mass
Definition phys.h:328
constexpr dimension7 current_density_d
[I/L^2] current per area
Definition phys.h:287
constexpr uval _base_1A(electric_current_d)
1 ampere
constexpr real_precision reduce_l_nonzero(const dimension7 dim)
Definition phys.h:175
constexpr dimension7 absorbed_dose_rate_d
[L^2/T^3] (radiation) power per mass
Definition phys.h:234
constexpr dimension7 activity_of_a_nuclide_d
Definition phys.h:214
static const std::map< std::string, real_precision > uval_prefix
Definition phys.h:529
constexpr dimension7 mass_line_density_d
[M/L] mass per line
Definition phys.h:241
constexpr dimension7 luminous_flux_d
[J]
Definition phys.h:344
constexpr dimension7 current_d
Definition phys.h:194
constexpr dimension7 area_flow_rate_d
[L^2*T^-1]
Definition phys.h:226
const uval operator+(const uval &lhs, const uval &rhs)
Definition phys.h:457
constexpr dimension7 dimensionless_d
[1]
Definition phys.h:185
constexpr dimension7 force_d
[M*L/T^2] mass times acceleration
Definition phys.h:249
constexpr uval Faraday_constant(electric_charge_d/amount_of_substance_d, 96485.3328959L)
e*N
const uval operator-(const uval &lhs, const uval &rhs)
Definition phys.h:461
std::string to_string(const uval &u)
Definition phys.h:470
constexpr dimension7 action_d
[M*L^2/T] energy integrate time
Definition phys.h:255
constexpr dimension7 amount_of_substance_d
[N]
Definition phys.h:191
constexpr dimension7 energy_d
[M*L^2/T^2] force integrate length
Definition phys.h:251
constexpr uval amu_mass(mass_d, 1.66053886E-27L)
static CONSTTYPE real_precision au_2_angoverps
Definition phys.h:1002
constexpr dimension7 radiance_d
[M/T^3] (radiation) power per area
Definition phys.h:281
constexpr dimension7 electric_charge_density_d
[I/L^3*T] charge per volume
Definition phys.h:289
constexpr dimension7 heat_density_flow_rate_d
[M/T^3] (heat flow) energy per area per time
Definition phys.h:277
constexpr uval _base_1Hz(frequency_d)
1 hertz
static CONSTTYPE real_precision au_2_amu
1mea means we measure a quantity at 1*N level.
Definition phys.h:992
constexpr dimension7 luminance_d
[J/L^2] luminous_intensity per area
Definition phys.h:346
static CONSTTYPE real_precision au_2_J_1mea
Definition phys.h:995
constexpr dimension7 thermal_insulance_d
[M^-1*T^3*Q] = 1 / heat_transfer_coefficient
Definition phys.h:330
constexpr dimension7 energy_line_density_d
[M/L/T^2] energy per line
Definition phys.h:263
constexpr dimension7 magnetic_permeability_d
[M*L/T^2/I^2], mu
Definition phys.h:317
constexpr dimension7 thermal_conductivity_d
[M*L/T^3/Q]
Definition phys.h:329
constexpr dimension7 power_area_density_d
[M/T^3] power per area
Definition phys.h:265
constexpr uval operator/(const uval &lhs, const uval &rhs)
Definition phys.h:452
constexpr dimension7 absorbed_dose_d
[L^2/T^2] (radiation) energy per mass
Definition phys.h:233
constexpr uval _base_1V(electric_potential_d)
1 volt
constexpr dimension7 magnetic_moment_d
[I*L^2] current integrate area
Definition phys.h:299
constexpr dimension7 electric_field_strenth_d
[M*L/T^3/I] electric potential per length
Definition phys.h:304
const std::map< const dimension7, const std::string > description
Definition phys.h:349
constexpr dimension7 pop_d
[L*T^-6]
Definition phys.h:224
constexpr dimension7 mass_flow_rate_d
[M/T] mass per time
Definition phys.h:245
constexpr uval _base_1s(time_d)
1 second
constexpr dimension7 permittivity_d
[M^-1*L^-2*T^4*I^2], epsilon
Definition phys.h:318
constexpr dimension7 mass_density_d
[M/L^3] mass per volume
Definition phys.h:243
constexpr real_precision reduce_l_energy(const dimension7 dim)
Definition phys.h:179
static CONSTTYPE real_precision au_2_wn
Definition phys.h:998
constexpr uval _base_1m(length_d)
1 meter
constexpr dimension7 wavelength_d
Definition phys.h:203
constexpr dimension7 mass_flow_acceleration_d
[M/T^2] mass per per time
Definition phys.h:246
constexpr uval _base_1S(electric_conductance_d)
1 siemens
constexpr dimension7 electric_polarization_field_d
[I/L^2*T], P = dipole moment pe volume
Definition phys.h:296
constexpr uval mn_mass(mass_d, 1.67492749804e-27L)
constexpr dimension7 torque_d
Definition phys.h:253
constexpr uval muB_magnetic_moment(magnetic_moment_d, 9.27400999457E-24L)
e*hb / (2*me)
constexpr dimension7 electric_potential_d
[M*L^2/T^3/I] energy per charge
Definition phys.h:303
constexpr dimension7 irradiance_d
[M/T^3] (radiation) power per area
Definition phys.h:282
constexpr dimension7 concentration_d
[N/L^3] amount per volume
Definition phys.h:337
constexpr uval _base_1(dimensionless_d)
1
constexpr dimension7 substance_permeability_d
[L^-1*T]
Definition phys.h:235
constexpr dimension7 electric_capacitance_d
[M^-1*L^-2*T^4*I^2] charge versus electric potential
Definition phys.h:309
constexpr uval Rydberg_constant(wave_number_d, 10973731.56850865L)
me* e ^ 4 / (8 * ep0 ^ 2 * h ^ 3 * c)
constexpr dimension7 electric_line_charge_density_d
[I/L*T] charge per line
Definition phys.h:291
constexpr dimension7 jerk_d
[L*T^-3]
Definition phys.h:221
constexpr dimension7 thermal_resistance_d
[M^-1*L^-2*T^3*Q]
Definition phys.h:331
constexpr dimension7 inductance_d
[M*L^2/T^2/I^2] magnetic flux versus current, L
Definition phys.h:313
constexpr dimension7 electric_dipole_moment_d
[I*L*T] charge times length
Definition phys.h:292
constexpr dimension7 crackle_d
[L*T^-5]
Definition phys.h:223
constexpr dimension7 power_d
[M*L^2/T^3] energy per time
Definition phys.h:259
constexpr dimension7 specific_volume_d
[L^3/M] volume per mass
Definition phys.h:244
constexpr uval _base_1kg(mass_d)
1 kilogram
constexpr dimension7 electric_chargme_mass_ratio_d
[M^-1*T*I]
Definition phys.h:315
constexpr dimension7 heat_capacity_d
[M*L^2/T^2/Q] energy per temperature
Definition phys.h:324
constexpr dimension7 thermal_resistivity_d
[M^-1*L^-1*T^3*Q]
Definition phys.h:332
constexpr uval muN_magnetic_moment(magnetic_moment_d, 5.05078369931E-27L)
e*hb / (2*mn)
constexpr dimension7 heat_transfer_coefficient_d
[M/T^3/Q] heat_flux_density versus temperature
Definition phys.h:326
constexpr dimension7 electric_displacement_field_d
[I/L^2*T], D
Definition phys.h:295
static const std::map< std::string, uval > uval_names
Definition phys.h:534
static CONSTTYPE real_precision au_2_ang
Definition phys.h:993
constexpr dimension7 heat_flow_rate_d
[M/L/T^3] (heat) energy per time
Definition phys.h:275
constexpr uval mp_mass(mass_d, 1.67262189821E-27L)
constexpr dimension7 electric_current_d
[I]
Definition phys.h:189
constexpr dimension7 angular_momentum_d
[M*L^2/T] torque integrate time
Definition phys.h:254
constexpr uval R_gas_constant(molar_entropy_d, 8.314459848L)
k * N
constexpr dimension7 volume_flow_rate_d
[L^3*T^-1]
Definition phys.h:227
constexpr dimension7 radiant_intensity_d
[M/L/T^3] (radiation) energy per time
Definition phys.h:280
constexpr dimension7 electric_area_charge_density_d
[I/L^2*T] charge per area
Definition phys.h:290
constexpr dimension7 luminous_intensity_d
[J]
Definition phys.h:192
constexpr dimension7 mass_area_density_d
[M/L^2] mass per area
Definition phys.h:242
constexpr dimension7 mass_flow_jerk_d
[M/T^3] mass per per per time
Definition phys.h:247
static CONSTTYPE real_precision au_2_fs
Definition phys.h:999
constexpr dimension7 illuminance_d
[J/L^2] luminous_intensity per area
Definition phys.h:345
static CONSTTYPE real_precision au_2_ps
Definition phys.h:1000
constexpr dimension7 angular_acceleration_d
[T^-2]
Definition phys.h:213
constexpr dimension7 electric_charge_d
[I*T] current integrate time
Definition phys.h:288
constexpr uval _base_1W(power_d)
1 watt
constexpr std::array< T, N > array_scale(const std::array< T, N > a, T b)
Definition phys.h:100
constexpr dimension7 speed_d
[L*T^-1]
Definition phys.h:219
constexpr uval _base_1H(inductance_d)
1 henry
static CONSTTYPE real_precision au_2_kcal_1mea
Definition phys.h:996
constexpr dimension7 dose_equivalent_d
[L^2/T^2] (radiation) energy per mass
Definition phys.h:232
constexpr uval k_Boltzman(entropy_d, 1.3806490351E-23L)
constexpr uval G_gravitional_constant(dimension7{{3, -2, -1}}, 6.6740831E-11L)
constexpr uval _base_1C(electric_charge_d)
1 comloub
constexpr uval hb_Planck(action_d, 1.05457180013E-34L)
h/(2*pi)
constexpr dimension7 volume_d
[L^3]
Definition phys.h:206
constexpr dimension7 thermal_diffusivity_d
[L^2*T^-1] = thermal_conductivity / (specific_heat_capacity * density)
Definition phys.h:229
constexpr dimension7 absement_d
[L*T]
Definition phys.h:225
constexpr uval h_Planck(action_d, 6.62607004081E-34L)
constexpr std::array< T, N > array_minus(const std::array< T, N > a, const std::array< T, N > b)
Definition phys.h:87
constexpr dimension7 time_d
[T]
Definition phys.h:187
constexpr uval me_mass(mass_d, 9.1093835611E-31L)
constexpr dimension7 magnetic_field_strength_d
[I/L] magnetic moment per volume
Definition phys.h:300
constexpr uval operator*(const uval &lhs, const uval &rhs)
Definition phys.h:447
constexpr dimension7 electric_conductivity_d
[M^-1*L^-3*T^3*I^2] 1 / electric_resistivity
Definition phys.h:308
constexpr dimension7 surface_tension_d
[M/T^2] energy per area
Definition phys.h:262
dimension7_type
Definition phys.h:165
@ _I
Definition phys.h:169
@ _L
Definition phys.h:166
@ _T
Definition phys.h:167
@ _Q
Definition phys.h:170
@ _N
Definition phys.h:171
@ _M
Definition phys.h:168
@ _J
Definition phys.h:172
constexpr dimension7 electric_conductance_d
[M^-1*L^-2*T^3*I^2] = 1 / electric_resistance
Definition phys.h:306
constexpr dimension7 entropy_d
[M*L^2/T^2/Q] energy per temperature
Definition phys.h:325
constexpr uval _base_1T(magnetic_flux_density_d)
1 tesla
dimensions< real_precision, dimension7_size > dimension7
Definition phys.h:164
constexpr dimension7 none_d
Definition phys.h:197
constexpr dimension7 kinematic_viscosity_d
[L^2*T^-1] = viscosity / density
Definition phys.h:228
constexpr uval ke_Comloub(dimensionless_d/permittivity_d, 8.9875517873681764E+9L)
constexpr uval _base_1N(force_d)
1 newton
constexpr dimension7 jounce_d
[L*T^-4]
Definition phys.h:222
constexpr dimension7 magnetic_flux_d
[M*L^2/T^2/I] energy per current = E/I = B*S
Definition phys.h:310
const int dimension7_size
dimension7 is provided as compile-time dimensional tools
Definition phys.h:163
constexpr T array_add_n(const std::array< T, N > a, const std::array< T, N > b, int n)
Definition phys.h:66
constexpr uval _nostd_1cal
1 cal (non-standard)
Definition phys.h:501
constexpr dimension7 molar_entropy_d
[M*L^2/T^2/Q/N] entropy per amount
Definition phys.h:339
constexpr dimension7 dynamic_viscosity_d
[M/L/T] force / (area * gradient(velocity))
Definition phys.h:272
constexpr uval Stefan_constant(dimension7{{0, -3, 1, -4}}, 5.67036713E-8L)
pi^2 kB^4/(60*hb^3*c^2)
constexpr dimension7 frequency_d
[T^-1]
Definition phys.h:211
constexpr dimension7 angular_velocity_d
[T^-1]
Definition phys.h:212
constexpr uval mu0_permeability(magnetic_permeability_d, 1.256637061E-6L)
4*pi*ke/c^2
static CONSTTYPE real_precision au_2_ev
Definition phys.h:994
constexpr dimension7 heat_density_d
[M/T^2] (heat flow) energy per area
Definition phys.h:276
static CONSTTYPE real_precision au_2_K
Definition phys.h:1001
constexpr T array_scale_n(const std::array< T, N > a, T b_val, int n)
Definition phys.h:92
constexpr dimension7 amount_d
Definition phys.h:196
constexpr dimension7 magnetic_flux_density_d
[M*T^-2/I] B = electric_field_strenth_d versus velocity
Definition phys.h:311
constexpr std::array< T, N > array_add(const std::array< T, N > a, const std::array< T, N > b)
Definition phys.h:74
constexpr uval c_lightspeed(speed_d, 2.997924580E+8L)
constexpr dimension7 distance_d
Definition phys.h:202
constexpr dimension7 thermodynamic_temperature_d
[Q]
Definition phys.h:190
constexpr T array_minus_n(const std::array< T, N > a, const std::array< T, N > b, int n)
Definition phys.h:79
constexpr uval _base_1J(energy_d)
1 joule
constexpr dimension7 inv_temp_d
Definition phys.h:323
constexpr dimension7 heat_flux_density_d
[M/T^3] (heat) energy per time per area
Definition phys.h:278
constexpr dimension7 momentum_d
[M*L/T] force integrate time
Definition phys.h:250
constexpr dimension7 area_d
[L^2]
Definition phys.h:205
constexpr std::array< T, N > array_scale_impl(const std::array< T, N > a, const T b, seq< S... >)
Definition phys.h:96
constexpr dimension7 specific_energy_d
[L^2/T^2] (count) energy per mass
Definition phys.h:231
constexpr uval _base_1cd(luminous_intensity_d)
1 candela
constexpr dimension7 pressure_d
[M/L/T^2] energy per volume = force per area
Definition phys.h:261
constexpr std::array< T, N > array_add_impl(const std::array< T, N > a, const std::array< T, N > b, seq< S... >)
Definition phys.h:70
constexpr uval _base_1K(thermodynamic_temperature_d)
1 kelvins
constexpr uval _base_1mol(amount_of_substance_d)
1 mole
bool is_same_dimension7(const uval &lhs, const uval &rhs)
Definition phys.h:468
constexpr dimension7 inv_ener_d
[M^-1*L^-2*T^2], inversed energy, such as 1/(kB * T)
Definition phys.h:257
constexpr dimension7 moment_of_force_d
[M*L^2/T^2] force cross length
Definition phys.h:252
constexpr dimension7 power_density_d
[M/L/T^3] power per volume
Definition phys.h:264
uval power(const uval &lhs, const real_precision &index)
Definition phys.h:465
double real_precision
Definition phys.h:23
#define CONSTTYPE
make this header is compatible to c++11 standard
Definition phys.h:14
#define CONSTEXPR_DECOR
Definition phys.h:15
#define PHYS_DEFINE_UNITSYS_NAMESPACE(USNAME, _0, _1, _2, _3, _4, _5, _6)
Definition phys.h:870
static constexpr size_type column_size
Definition phys.h:629
std::size_t size_type
Definition phys.h:627
static constexpr size_type row_size
Definition phys.h:628
CONSTEXPR_DECOR T * operator[](std::size_t i)
Definition phys.h:630
T _data[M][N]
Definition phys.h:635
compile-time array operations realized in c++11 standard
Definition phys.h:58
unit_error(std::string const text)
Definition phys.h:47