www.mooseframework.org
Water97FluidProperties.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #pragma once
11 
13 #include "NewtonInversion.h"
14 #include <array>
15 
16 #pragma GCC diagnostic push
17 #pragma GCC diagnostic ignored "-Woverloaded-virtual"
18 
39 {
40 public:
42 
44  virtual ~Water97FluidProperties();
45 
46  virtual std::string fluidName() const override;
47 
48  virtual Real molarMass() const override;
49 
50  virtual Real criticalPressure() const override;
51 
52  virtual Real criticalTemperature() const override;
53 
54  virtual Real criticalDensity() const override;
55 
56  virtual Real triplePointPressure() const override;
57 
58  virtual Real triplePointTemperature() const override;
59 
60  virtual Real rho_from_p_T(Real pressure, Real temperature) const override;
61  virtual ADReal rho_from_p_T(const ADReal & pressure, const ADReal & temperature) const override;
62 
63  virtual Real v_from_p_T(Real pressure, Real temperature) const override;
64  virtual ADReal v_from_p_T(const ADReal & pressure, const ADReal & temperature) const override;
65  template <typename T>
66  T v_from_p_T_template(const T & pressure, const T & temperature) const;
67  virtual void
68  v_from_p_T(Real pressure, Real temperature, Real & v, Real & dv_dp, Real & dv_dT) const override;
69  virtual void v_from_p_T(const ADReal & pressure,
70  const ADReal & temperature,
71  ADReal & v,
72  ADReal & dv_dp,
73  ADReal & dv_dT) const override;
74  template <typename T>
75  void
76  v_from_p_T_template(const T & pressure, const T & temperature, T & v, T & dv_dp, T & dv_dt) const;
77 
78  template <typename T>
79  T rho_from_p_T_template(const T & pressure, const T & temperature) const;
80  template <typename T>
82  const T & pressure, const T & temperature, T & rho, T & drho_dp, T & drho_dt) const;
83 
84  virtual void rho_from_p_T(
85  Real pressure, Real temperature, Real & rho, Real & drho_dp, Real & drho_dT) const override;
86  virtual void rho_from_p_T(const ADReal & pressure,
87  const ADReal & temperature,
88  ADReal & rho,
89  ADReal & drho_dp,
90  ADReal & drho_dT) const override;
91 
92  Real p_from_v_e(Real v, Real e) const override;
93  ADReal p_from_v_e(const ADReal & v, const ADReal & e) const override;
94  template <typename T>
95  T p_from_v_e_template(const T & v, const T & e) const;
96 
97  virtual Real e_from_p_rho(Real p, Real rho) const override;
98  virtual ADReal e_from_p_rho(const ADReal & p, const ADReal & rho) const override;
99  template <typename T>
100  T e_from_p_rho_template(const T & p, const T & rho) const;
101  void e_from_p_rho(Real p, Real rho, Real & e, Real & de_dp, Real & de_drho) const override;
102  void e_from_p_rho(const ADReal & p,
103  const ADReal & rho,
104  ADReal & e,
105  ADReal & de_dp,
106  ADReal & de_drho) const override;
107  template <typename T>
108  void e_from_p_rho_template(const T & p, const T & rho, T & e, T & de_dp, T & de_drho) const;
109 
110  virtual Real e_from_p_T(Real pressure, Real temperature) const override;
111  virtual ADReal e_from_p_T(const ADReal & pressure, const ADReal & temperature) const override;
112  template <typename T>
113  T e_from_p_T_template(const T & pressure, const T & temperature) const;
114 
115  virtual void
116  e_from_p_T(Real pressure, Real temperature, Real & e, Real & de_dp, Real & de_dT) const override;
117  virtual void e_from_p_T(const ADReal & pressure,
118  const ADReal & temperature,
119  ADReal & e,
120  ADReal & de_dp,
121  ADReal & de_dT) const override;
122  template <typename T>
123  void
124  e_from_p_T_template(const T & pressure, const T & temperature, T & e, T & de_dp, T & de_dT) const;
125 
126  ADReal e_from_v_h(const ADReal & v, const ADReal & h) const override;
127 
128  Real T_from_v_e(Real v, Real e) const override;
129  ADReal T_from_v_e(const ADReal & v, const ADReal & e) const override;
130 
131  virtual Real c_from_p_T(Real pressure, Real temperature) const override;
132  virtual ADReal c_from_p_T(const ADReal & pressure, const ADReal & temperature) const override;
133  template <typename T>
134  T c_from_p_T_template(const T & pressure, const T & temperature) const;
135  virtual ADReal c_from_v_e(const ADReal & v, const ADReal & e) const override;
136 
137  virtual Real cp_from_p_T(Real pressure, Real temperature) const override;
138  virtual ADReal cp_from_p_T(const ADReal & pressure, const ADReal & temperature) const override;
139  template <typename T>
140  T cp_from_p_T_template(const T & pressure, const T & temperature) const;
141 
142  using SinglePhaseFluidProperties::cp_from_p_T;
143 
144  virtual ADReal cp_from_v_e(const ADReal & v, const ADReal & e) const override;
145 
146  virtual Real cv_from_p_T(Real pressure, Real temperature) const override;
147  virtual ADReal cv_from_p_T(const ADReal & pressure, const ADReal & temperature) const override;
148  template <typename T>
149  T cv_from_p_T_template(const T & pressure, const T & temperature) const;
150 
151  virtual ADReal cv_from_v_e(const ADReal & v, const ADReal & e) const override;
152 
153  virtual Real mu_from_p_T(Real pressure, Real temperature) const override;
154  virtual ADReal mu_from_p_T(const ADReal & pressure, const ADReal & temperature) const override;
155  template <typename T>
156  T mu_from_p_T_template(const T & pressure, const T & temperature) const;
157 
158  virtual void mu_from_p_T(
159  Real pressure, Real temperature, Real & mu, Real & dmu_dp, Real & dmu_dT) const override;
160 
161  virtual Real mu_from_rho_T(Real density, Real temperature) const override;
162  template <typename T>
163  T mu_from_rho_T_template(const T & density, const T & temperature) const;
164 
165  void mu_from_rho_T(
166  Real rho, Real temperature, Real drho_dT, Real & mu, Real & dmu_drho, Real & dmu_dT) const;
167 
168  ADReal mu_from_v_e(const ADReal & v, const ADReal & e) const override;
169 
170  virtual void
171  rho_mu_from_p_T(Real pressure, Real temperature, Real & rho, Real & mu) const override;
172 
173  virtual void rho_mu_from_p_T(Real pressure,
175  Real & rho,
176  Real & drho_dp,
177  Real & drho_dT,
178  Real & mu,
179  Real & dmu_dp,
180  Real & dmu_dT) const override;
181 
182  virtual Real k_from_p_T(Real pressure, Real temperature) const override;
183  virtual ADReal k_from_p_T(const ADReal & pressure, const ADReal & temperature) const override;
184  template <typename T>
185  T k_from_p_T_template(const T & pressure, const T & temperature) const;
186 
187  virtual void
188  k_from_p_T(Real pressure, Real temperature, Real & k, Real & dk_dp, Real & dk_dT) const override;
189 
190  virtual Real k_from_rho_T(Real density, Real temperature) const override;
191  template <typename T>
192  T k_from_rho_T_template(const T & density, const T & temperature) const;
193 
194  Real k_from_v_e(Real v, Real e) const override;
195  ADReal k_from_v_e(const ADReal & v, const ADReal & e) const override;
196  template <typename T>
197  T k_from_v_e_template(const T & v, const T & e) const;
198 
200 
201  virtual Real h_from_p_T(Real pressure, Real temperature) const override;
202  virtual ADReal h_from_p_T(const ADReal & pressure, const ADReal & temperature) const override;
203  template <typename T>
204  T h_from_p_T_template(const T & pressure, const T & temperature) const;
205 
206  virtual void
207  h_from_p_T(Real pressure, Real temperature, Real & h, Real & dh_dp, Real & dh_dT) const override;
208  virtual void h_from_p_T(const ADReal & pressure,
209  const ADReal & temperature,
210  ADReal & h,
211  ADReal & dh_dp,
212  ADReal & dh_dT) const override;
213  template <typename T>
214  void
215  h_from_p_T_template(const T & pressure, const T & temperature, T & h, T & dh_dp, T & dh_dT) const;
216 
217  virtual Real vaporPressure(Real temperature) const override;
218 
219  virtual void vaporPressure(Real temperature, Real & psat, Real & dpsat_dT) const override;
220 
221  template <typename T>
222  void vaporPressureTemplate(const T & temperature, T & psat, T & dpsat_dT) const;
223 
236  Real vaporTemperature(Real pressure) const override;
237  virtual void vaporTemperature(Real pressure, Real & Tsat, Real & dTsat_dp) const override;
238 
249  Real b23p(Real temperature) const;
250 
261  Real b23T(Real pressure) const;
262 
271  unsigned int inRegion(Real pressure, Real temperature) const;
272 
284  unsigned int subregion3(Real pressure, Real temperature) const;
285 
295  template <typename T>
296  T subregionVolume(const T & pi,
297  const T & theta,
298  Real a,
299  Real b,
300  Real c,
301  Real d,
302  Real e,
303  unsigned int sid) const;
304 
318  template <typename T>
319  T densityRegion3(const T & pressure, const T & temperature) const;
320 
330  virtual Real T_from_p_h(Real pressure, Real enthalpy) const override;
331  virtual void T_from_p_h(Real p, Real h, Real & T, Real & dT_dp, Real & dT_dh) const override;
332 
342  Real b2bc(Real pressure) const;
343 
354  Real b3ab(Real pressure) const;
355 
366  Real henryConstant(Real temperature, const std::vector<Real> & coeffs) const;
367  void
368  henryConstant(Real temperature, const std::vector<Real> & coeffs, Real & Kh, Real & dKh_dT) const;
369  DualReal henryConstant(const DualReal & temperature, const std::vector<Real> & coeffs) const;
370 
375  template <typename T>
376  std::pair<T, T> p_T_from_v_e(const T & v, const T & e) const;
377 
382  template <typename T>
383  std::pair<T, T> rho_T_from_v_e(const T & v, const T & e) const;
384 
389  template <typename T>
390  std::pair<T, T> p_T_from_v_h(const T & v, const T & h) const;
392 
393 protected:
405  template <typename T>
406  T gamma1(const T & pi, const T & tau) const;
407 
415  template <typename T>
416  T dgamma1_dpi(const T & pi, const T & tau) const;
417 
425  template <typename T>
426  T d2gamma1_dpi2(const T & pi, const T & tau) const;
427 
435  template <typename T>
436  T dgamma1_dtau(const T & pi, const T & tau) const;
437 
445  template <typename T>
446  T d2gamma1_dtau2(const T & pi, const T & tau) const;
447 
455  template <typename T>
456  T d2gamma1_dpitau(const T & pi, const T & tau) const;
457 
469  template <typename T>
470  T gamma2(const T & pi, const T & tau) const;
471 
479  template <typename T>
480  T dgamma2_dpi(const T & pi, const T & tau) const;
481 
489  template <typename T>
490  T d2gamma2_dpi2(const T & pi, const T & tau) const;
491 
499  template <typename T>
500  T dgamma2_dtau(const T & pi, const T & tau) const;
501 
509  template <typename T>
510  T d2gamma2_dtau2(const T & pi, const T & tau) const;
511 
519  template <typename T>
520  T d2gamma2_dpitau(const T & pi, const T & tau) const;
521 
533  template <typename T>
534  T phi3(const T & delta, const T & tau) const;
535 
543  template <typename T>
544  T dphi3_ddelta(const T & delta, const T & tau) const;
545 
553  template <typename T>
554  T d2phi3_ddelta2(const T & delta, const T & tau) const;
555 
563  template <typename T>
564  T dphi3_dtau(const T & delta, const T & tau) const;
565 
573  template <typename T>
574  T d2phi3_dtau2(const T & delta, const T & tau) const;
575 
583  template <typename T>
584  T d2phi3_ddeltatau(const T & delta, const T & tau) const;
585 
597  template <typename T>
598  T gamma5(const T & pi, const T & tau) const;
599 
607  template <typename T>
608  T dgamma5_dpi(const T & pi, const T & tau) const;
609 
617  template <typename T>
618  T d2gamma5_dpi2(const T & pi, const T & tau) const;
619 
627  template <typename T>
628  T dgamma5_dtau(const T & pi, const T & tau) const;
629 
637  template <typename T>
638  T d2gamma5_dtau2(const T & pi, const T & tau) const;
639 
647  template <typename T>
648  T d2gamma5_dpitau(const T & pi, const T & tau) const;
649 
652  {
653  AB,
654  CD,
655  GH,
656  IJ,
657  JK,
658  MN,
659  OP,
660  QU,
661  RX,
662  UV,
663  WX,
665  };
666 
678  template <typename T>
679  T tempXY(const T & pressure, subregionEnum xy) const;
680 
689  unsigned int inRegionPH(Real pressure, Real enthalpy) const;
690 
701  unsigned int subregion2ph(Real pressure, Real enthalpy) const;
702 
714  unsigned int subregion3ph(Real pressure, Real enthalpy) const;
715 
725  FPDualReal T_from_p_h_ad(const FPDualReal & pressure, const FPDualReal & enthalpy) const;
726 
737  FPDualReal temperature_from_ph1(const FPDualReal & pressure, const FPDualReal & enthalpy) const;
738 
749  FPDualReal temperature_from_ph2a(const FPDualReal & pressure, const FPDualReal & enthalpy) const;
750 
761  FPDualReal temperature_from_ph2b(const FPDualReal & pressure, const FPDualReal & enthalpy) const;
762 
773  FPDualReal temperature_from_ph2c(const FPDualReal & pressure, const FPDualReal & enthalpy) const;
774 
786  FPDualReal temperature_from_ph3a(const FPDualReal & pressure, const FPDualReal & enthalpy) const;
787 
799  FPDualReal temperature_from_ph3b(const FPDualReal & pressure, const FPDualReal & enthalpy) const;
800 
814 
816  const Real _Mh2o;
818  const Real _Rw;
829 
838  const std::array<Real, 34> _n1{
840  {0.14632971213167e0, -0.84548187169114e0, -0.37563603672040e1, 0.33855169168385e1,
841  -0.95791963387872e0, 0.15772038513228e0, -0.16616417199501e-1, 0.81214629983568e-3,
842  0.28319080123804e-3, -0.60706301565874e-3, -0.18990068218419e-1, -0.32529748770505e-1,
843  -0.21841717175414e-1, -0.52838357969930e-4, -0.47184321073267e-3, -0.30001780793026e-3,
844  0.47661393906987e-4, -0.44141845330846e-5, -0.72694996297594e-15, -0.31679644845054e-4,
845  -0.28270797985312e-5, -0.85205128120103e-9, -0.22425281908000e-5, -0.65171222895601e-6,
846  -0.14341729937924e-12, -0.40516996860117e-6, -0.12734301741641e-8, -0.17424871230634e-9,
847  -0.68762131295531e-18, 0.14478307828521e-19, 0.26335781662795e-22, -0.11947622640071e-22,
848  0.18228094581404e-23, -0.93537087292458e-25}};
849 
850  const std::array<int, 34> _I1{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2,
851  2, 2, 3, 3, 3, 4, 4, 4, 5, 8, 8, 21, 23, 29, 30, 31, 32}};
852 
853  const std::array<int, 34> _J1{{-2, -1, 0, 1, 2, 3, 4, 5, -9, -7, -1, 0,
854  1, 3, -3, 0, 1, 3, 17, -4, 0, 6, -5, -2,
855  10, -8, -11, -6, -29, -31, -38, -39, -40, -41}};
856 
857  const std::array<Real, 20> _nph1{
858  {-0.23872489924521e3, 0.40421188637945e3, 0.11349746881718e3, -0.58457616048039e1,
859  -0.15285482413140e-3, -0.10866707695377e-5, -0.13391744872602e2, 0.43211039183559e2,
860  -0.54010067170506e2, 0.30535892203916e2, -0.65964749423638e1, 0.93965400878363e-2,
861  0.11573647505340e-6, -0.25858641282073e-4, -0.40644363084799e-8, 0.66456186191635e-7,
862  0.80670734103027e-10, -0.93477771213947e-12, 0.58265442020601e-14, -0.15020185953503e-16}};
863 
864  const std::array<int, 20> _Iph1{{0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 5, 6}};
865 
866  const std::array<int, 20> _Jph1{
867  {0, 1, 2, 6, 22, 32, 0, 1, 2, 3, 4, 10, 32, 10, 32, 10, 32, 32, 32, 32}};
868 
870  const std::array<Real, 9> _n02{{-0.96927686500217e1,
871  0.10086655968018e2,
872  -0.56087911283020e-2,
873  0.71452738081455e-1,
874  -0.40710498223928e0,
875  0.14240819171444e1,
876  -0.43839511319450e1,
877  -0.28408632460772e0,
878  0.21268463753307e-1}};
879 
880  const std::array<Real, 43> _n2{
881  {-0.17731742473213e-2, -0.17834862292358e-1, -0.45996013696365e-1, -0.57581259083432e-1,
882  -0.50325278727930e-1, -0.33032641670203e-4, -0.18948987516315e-3, -0.39392777243355e-2,
883  -0.43797295650573e-1, -0.26674547914087e-4, 0.20481737692309e-7, 0.43870667284435e-6,
884  -0.32277677238570e-4, -0.15033924542148e-2, -0.40668253562649e-1, -0.78847309559367e-9,
885  0.12790717852285e-7, 0.48225372718507e-6, 0.22922076337661e-5, -0.16714766451061e-10,
886  -0.21171472321355e-2, -0.23895741934104e2, -0.59059564324270e-17, -0.12621808899101e-5,
887  -0.38946842435739e-1, 0.11256211360459e-10, -0.82311340897998e1, 0.19809712802088e-7,
888  0.10406965210174e-18, -0.10234747095929e-12, -0.10018179379511e-8, -0.80882908646985e-10,
889  0.10693031879409e0, -0.33662250574171e0, 0.89185845355421e-24, 0.30629316876232e-12,
890  -0.42002467698208e-5, -0.59056029685639e-25, 0.37826947613457e-5, -0.12768608934681e-14,
891  0.73087610595061e-28, 0.55414715350778e-16, -0.94369707241210e-6}};
892 
893  const std::array<int, 9> _J02{{0, 1, -5, -4, -3, -2, -1, 2, 3}};
894 
895  const std::array<int, 43> _I2{{1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
896  4, 4, 4, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 10, 10,
897  10, 16, 16, 18, 20, 20, 20, 21, 22, 23, 24, 24, 24}};
898 
899  const std::array<int, 43> _J2{{0, 1, 2, 3, 6, 1, 2, 4, 7, 36, 0, 1, 3, 6, 35,
900  1, 2, 3, 7, 3, 16, 35, 0, 11, 25, 8, 36, 13, 4, 10,
901  14, 29, 50, 57, 20, 35, 48, 21, 53, 39, 26, 40, 58}};
902 
903  const std::array<Real, 36> _nph2a{
904  {0.10898952318288e4, 0.84951654495535e3, -0.10781748091826e3, 0.33153654801263e2,
905  -0.74232016790248e1, 0.11765048724356e2, 0.18445749355790e1, -0.41792700549624e1,
906  0.62478196935812e1, -0.17344563108114e2, -0.20058176862096e3, 0.27196065473796e3,
907  -0.45511318285818e3, 0.30919688604755e4, 0.25226640357872e6, -0.61707422868339e-2,
908  -0.31078046629583, 0.11670873077107e2, 0.12812798404046e9, -0.98554909623276e9,
909  0.28224546973002e10, -0.35948971410703e10, 0.17227349913197e10, -0.13551334240775e5,
910  0.12848734664650e8, 0.13865724283226e1, 0.23598832556514e6, -0.13105236545054e8,
911  0.73999835474766e4, -0.55196697030060e6, 0.37154085996233e7, 0.19127729239660e5,
912  -0.41535164835634e6, -0.62459855192507e2}};
913 
914  const std::array<int, 36> _Iph2a{{0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
915  2, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7}};
916 
917  const std::array<int, 36> _Jph2a{{0, 1, 2, 3, 7, 20, 0, 1, 2, 3, 7, 9,
918  11, 18, 44, 0, 2, 7, 36, 38, 40, 42, 44, 24,
919  44, 12, 32, 44, 32, 36, 42, 34, 44, 28}};
920 
921  const std::array<Real, 38> _nph2b{
922  {0.14895041079516e4, 0.74307798314034e3, -0.97708318797837e2, 0.24742464705674e1,
923  -0.63281320016026, 0.11385952129658e1, -0.47811863648625, 0.85208123431544e-2,
924  0.93747147377932, 0.33593118604916e1, 0.33809355601454e1, 0.16844539671904,
925  0.73875745236695, -0.47128737436186, 0.15020273139707, -0.21764114219750e-2,
926  -0.21810755324761e-1, -0.10829784403677, -0.46333324635812e-1, 0.71280351959551e-4,
927  0.11032831789999e-3, 0.18955248387902e-3, 0.30891541160537e-2, 0.13555504554949e-2,
928  0.28640237477456e-6, -0.10779857357512e-4, -0.76462712454814e-4, 0.14052392818316e-4,
929  -0.31083814331434e-4, -0.10302738212103e-5, 0.28217281635040e-6, 0.12704902271945e-5,
930  0.73803353468292e-7, -0.11030139238909e-7, -0.81456365207833e-13, -0.25180545682962e-10,
931  -0.17565233969407e-17, 0.86934156344163e-14}};
932 
933  const std::array<int, 38> _Iph2b{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2,
934  2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 6, 7, 7, 9, 9}};
935 
936  const std::array<int, 38> _Jph2b{{0, 1, 2, 12, 18, 24, 28, 40, 0, 2, 6, 12, 18,
937  24, 28, 40, 2, 8, 18, 40, 1, 2, 12, 24, 2, 12,
938  18, 24, 28, 40, 18, 24, 40, 28, 2, 28, 1, 40}};
939 
940  const std::array<Real, 23> _nph2c{
941  {-0.32368398555242e13, 0.73263350902181e13, 0.35825089945447e12, -0.58340131851590e12,
942  -0.10783068217470e11, 0.20825544563171e11, 0.61074783564516e6, 0.85977722535580e6,
943  -0.25745723604170e5, 0.31081088422714e5, 0.12082315865936e4, 0.48219755109255e3,
944  0.37966001272486e1, -0.10842984880077e2, -0.45364172676660e-1, 0.14559115658698e-12,
945  0.11261597407230e-11, -0.17804982240686e-10, 0.12324579690832e-6, -0.11606921130984e-5,
946  0.27846367088554e-4, -0.59270038474176e-3, 0.12918582991878e-2}};
947 
948  const std::array<int, 23> _Iph2c{
949  {-7, -7, -6, -6, -5, -5, -2, -2, -1, -1, 0, 0, 1, 1, 2, 6, 6, 6, 6, 6, 6, 6, 6}};
950 
951  const std::array<int, 23> _Jph2c{
952  {0, 4, 0, 2, 0, 2, 0, 1, 0, 2, 0, 1, 4, 8, 4, 0, 1, 4, 10, 12, 16, 20, 22}};
953 
955  const std::array<Real, 5> _n23{{0.34805185628969e3,
956  -0.11671859879975e1,
957  0.10192970039326e-2,
958  0.57254459862746e3,
959  0.13918839778870e2}};
960 
962  const std::array<Real, 40> _n3{
963  {0.10658070028513e1, -0.15732845290239e2, 0.20944396974307e2, -0.76867707878716e1,
964  0.26185947787954e1, -0.28080781148620e1, 0.12053369696517e1, -0.84566812812502e-2,
965  -0.12654315477714e1, -0.11524407806681e1, 0.88521043984318e0, -0.64207765181607e0,
966  0.38493460186671e0, -0.85214708824206e0, 0.48972281541877e1, -0.30502617256965e1,
967  0.39420536879154e-1, 0.12558408424308e0, -0.27999329698710e0, 0.13899799569460e1,
968  -0.20189915023570e1, -0.82147637173963e-2, -0.47596035734923e0, 0.43984074473500e-1,
969  -0.44476435428739e0, 0.90572070719733e0, 0.70522450087967e0, 0.10770512626332e0,
970  -0.32913623258954e0, -0.50871062041158e0, -0.22175400873096e-1, 0.94260751665092e-1,
971  0.16436278447961e0, -0.13503372241348e-1, -0.14834345352472e-1, 0.57922953628084e-3,
972  0.32308904703711e-2, 0.80964802996215e-4, -0.16557679795037e-3, -0.44923899061815e-4}};
973 
974  const std::array<int, 40> _I3{{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3,
975  3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8, 9, 9, 10, 10, 11}};
976 
977  const std::array<int, 40> _J3{{0, 0, 1, 2, 7, 10, 12, 23, 2, 6, 15, 17, 0, 2,
978  6, 7, 22, 26, 0, 2, 4, 16, 26, 0, 2, 4, 26, 1,
979  3, 26, 0, 2, 26, 2, 26, 2, 26, 0, 1, 26}};
980 
981  const std::array<std::array<Real, 8>, 26> _par3{
982  {{{0.0024, 100.0, 760.0, 0.085, 0.817, 1.0, 1.0, 1.0}},
983  {{0.0041, 100.0, 860.0, 0.280, 0.779, 1.0, 1.0, 1.0}},
984  {{0.0022, 40.0, 690.0, 0.259, 0.903, 1.0, 1.0, 1.0}},
985  {{0.0029, 40.0, 690.0, 0.559, 0.939, 1.0, 1.0, 4.0}},
986  {{0.0032, 40.0, 710.0, 0.587, 0.918, 1.0, 1.0, 1.0}},
987  {{0.0064, 40.0, 730.0, 0.587, 0.891, 0.5, 1.0, 4.0}},
988  {{0.0027, 25.0, 660.0, 0.872, 0.971, 1.0, 1.0, 4.0}},
989  {{0.0032, 25.0, 660.0, 0.898, 0.983, 1.0, 1.0, 4.0}},
990  {{0.0041, 25.0, 660.0, 0.910, 0.984, 0.5, 1.0, 4.0}},
991  {{0.0054, 25.0, 670.0, 0.875, 0.964, 0.5, 1.0, 4.0}},
992  {{0.0077, 25.0, 680.0, 0.802, 0.935, 1.0, 1.0, 1.0}},
993  {{0.0026, 24.0, 650.0, 0.908, 0.989, 1.0, 1.0, 4.0}},
994  {{0.0028, 23.0, 650.0, 1.000, 0.997, 1.0, 0.25, 1.0}},
995  {{0.0031, 23.0, 650.0, 0.976, 0.997, 0.0, 0.0, 0.0}},
996  {{0.0034, 23.0, 650.0, 0.974, 0.996, 0.5, 1.0, 1.0}},
997  {{0.0041, 23.0, 650.0, 0.972, 0.997, 0.5, 1.0, 1.0}},
998  {{0.0022, 23.0, 650.0, 0.848, 0.983, 1.0, 1.0, 4.0}},
999  {{0.0054, 23.0, 650.0, 0.874, 0.982, 1.0, 1.0, 1.0}},
1000  {{0.0022, 21.0, 640.0, 0.886, 0.990, 1.0, 1.0, 4.0}},
1001  {{0.0088, 20.0, 650.0, 0.803, 1.020, 1.0, 1.0, 1.0}},
1002  {{0.0026, 23.0, 650.0, 0.902, 0.988, 1.0, 1.0, 1.0}},
1003  {{0.0031, 23.0, 650.0, 0.960, 0.995, 1.0, 1.0, 1.0}},
1004  {{0.0039, 23.0, 650.0, 0.959, 0.995, 1.0, 1.0, 4.0}},
1005  {{0.0049, 23.0, 650.0, 0.910, 0.988, 1.0, 1.0, 1.0}},
1006  {{0.0031, 22.0, 650.0, 0.996, 0.994, 1.0, 1.0, 4.0}},
1007  {{0.0038, 22.0, 650.0, 0.993, 0.994, 1.0, 1.0, 4.0}}}};
1008 
1009  const std::array<unsigned int, 26> _par3N{{30, 32, 35, 38, 29, 42, 38, 29, 42, 29, 34, 43, 40,
1010  39, 24, 27, 24, 27, 29, 33, 38, 39, 35, 36, 20, 23}};
1011 
1013  const std::vector<std::vector<Real>> _n3s{
1014  {0.110879558823853e-2, 0.572616740810616e3, -0.767051948380852e5, -0.253321069529674e-1,
1015  0.628008049345689e4, 0.234105654131876e6, 0.216867826045856, -0.156237904341963e3,
1016  -0.269893956176613e5, -0.180407100085505e-3, 0.116732227668261e-2, 0.266987040856040e2,
1017  0.282776617243286e5, -0.242431520029523e4, 0.435217323022733e-3, -0.122494831387441e-1,
1018  0.179357604019989e1, 0.442729521058314e2, -0.593223489018342e-2, 0.453186261685774,
1019  0.135825703129140e1, 0.408748415856745e-1, 0.474686397863312, 0.118646814997915e1,
1020  0.546987265727549, 0.195266770452643, -0.502268790869663e-1, -0.369645308193377,
1021  0.633828037528420e-2, 0.797441793901017e-1},
1022  {-0.827670470003621e-1, 0.416887126010565e2, 0.483651982197059e-1, -0.291032084950276e5,
1023  -0.111422582236948e3, -0.202300083904014e-1, 0.294002509338515e3, 0.140244997609658e3,
1024  -0.344384158811459e3, 0.361182452612149e3, -0.140699677420738e4, -0.202023902676481e-2,
1025  0.171346792457471e3, -0.425597804058632e1, 0.691346085000334e-5, 0.151140509678925e-2,
1026  -0.416375290166236e-1, -0.413754957011042e2, -0.506673295721637e2, -0.572212965569023e-3,
1027  0.608817368401785e1, 0.239600660256161e2, 0.122261479925384e-1, 0.216356057692938e1,
1028  0.398198903368642, -0.116892827834085, -0.102845919373532, -0.492676637589284,
1029  0.655540456406790e-1, -0.240462535078530, -0.269798180310075e-1, 0.128369435967012},
1030  {0.311967788763030e1, 0.276713458847564e5, 0.322583103403269e8, -0.342416065095363e3,
1031  -0.899732529907377e6, -0.793892049821251e8, 0.953193003217388e2, 0.229784742345072e4,
1032  0.175336675322499e6, 0.791214365222792e7, 0.319933345844209e-4, -0.659508863555767e2,
1033  -0.833426563212851e6, 0.645734680583292e-1, -0.382031020570813e7, 0.406398848470079e-4,
1034  0.310327498492008e2, -0.892996718483724e-3, 0.234604891591616e3, 0.377515668966951e4,
1035  0.158646812591361e-1, 0.707906336241843, 0.126016225146570e2, 0.736143655772152,
1036  0.676544268999101, -0.178100588189137e2, -0.156531975531713, 0.117707430048158e2,
1037  0.840143653860447e-1, -0.186442467471949, -0.440170203949645e2, 0.123290423502494e7,
1038  -0.240650039730845e-1, -0.107077716660869e7, 0.438319858566475e-1},
1039  {-0.452484847171645e-9, 0.315210389538801e-4, -0.214991352047545e-2, 0.508058874808345e3,
1040  -0.127123036845932e8, 0.115371133120497e13, -0.197805728776273e-15, 0.241554806033972e-10,
1041  -0.156481703640525e-5, 0.277211346836625e-2, -0.203578994462286e2, 0.144369489909053e7,
1042  -0.411254217946539e11, 0.623449786243773e-5, -0.221774281146038e2, -0.689315087933158e5,
1043  -0.195419525060713e8, 0.316373510564015e4, 0.224040754426988e7, -0.436701347922356e-5,
1044  -0.404213852833996e-3, -0.348153203414663e3, -0.385294213555289e6, 0.135203700099403e-6,
1045  0.134648383271089e-3, 0.125031835351736e6, 0.968123678455841e-1, 0.225660517512438e3,
1046  -0.190102435341872e-3, -0.299628410819229e-1, 0.500833915372121e-2, 0.387842482998411,
1047  -0.138535367777182e4, 0.870745245971773, 0.171946252068742e1, -0.326650121426383e-1,
1048  0.498044171727877e4, 0.551478022765087e-2},
1049  {0.715815808404721e9, -0.114328360753449e12, 0.376531002015720e-11, -0.903983668691157e-4,
1050  0.665695908836252e6, 0.535364174960127e10, 0.794977402335603e11, 0.922230563421437e2,
1051  -0.142586073991215e6, -0.111796381424162e7, 0.896121629640760e4, -0.669989239070491e4,
1052  0.451242538486834e-2, -0.339731325977713e2, -0.120523111552278e1, 0.475992667717124e5,
1053  -0.266627750390341e6, -0.153314954386524e-3, 0.305638404828265, 0.123654999499486e3,
1054  -0.104390794213011e4, -0.157496516174308e-1, 0.685331118940253, 0.178373462873903e1,
1055  -0.544674124878910, 0.204529931318843e4, -0.228342359328752e5, 0.413197481515899,
1056  -0.341931835910405e2},
1057  {-0.251756547792325e-7, 0.601307193668763e-5, -0.100615977450049e-2,
1058  0.999969140252192, 0.214107759236486e1, -0.165175571959086e2,
1059  -0.141987303638727e-2, 0.269251915156554e1, 0.349741815858722e2,
1060  -0.300208695771783e2, -0.131546288252539e1, -0.839091277286169e1,
1061  0.181545608337015e-9, -0.591099206478909e-3, 0.152115067087106e1,
1062  0.252956470663225e-4, 0.100726265203786e-14, -0.14977453386065e1,
1063  -0.793940970562969e-9, -0.150290891264717e-3, 0.151205531275133e1,
1064  0.470942606221652e-5, 0.195049710391712e-12, -0.911627886266077e-8,
1065  0.604374640201265e-3, -0.225132933900136e-15, 0.610916973582981e-11,
1066  -0.303063908043404e-6, -0.137796070798409e-4, -0.919296736666106e-3,
1067  0.639288223132545e-9, 0.753259479898699e-6, -0.400321478682929e-12,
1068  0.756140294351614e-8, -0.912082054034891e-11, -0.237612381140539e-7,
1069  0.269586010591874e-4, -0.732828135157839e-10, 0.241995578306660e-9,
1070  -0.405735532730322e-3, 0.189424143498011e-9, -0.486632965074563e-9},
1071  {0.412209020652996e-4, -0.114987238280587e7, 0.948180885032080e10, -0.195788865718971e18,
1072  0.4962507048713e25, -0.105549884548496e29, -0.758642165988278e12, -0.922172769596101e23,
1073  0.725379072059348e30, -0.617718249205859e2, 0.107555033344858e5, -0.379545802336487e8,
1074  0.228646846221831e12, -0.499741093010619e7, -0.280214310054101e31, 0.104915406769586e7,
1075  0.613754229168619e28, 0.802056715528378e32, -0.298617819828065e8, -0.910782540134681e2,
1076  0.135033227281565e6, -0.712949383408211e19, -0.104578785289542e37, 0.304331584444093e2,
1077  0.593250797959445e10, -0.364174062110798e28, 0.921791403532461, -0.337693609657471,
1078  -0.724644143758508e2, -0.110480239272601, 0.536516031875059e1, -0.291441872156205e4,
1079  0.616338176535305e40, -0.120889175861180e39, 0.818396024524612e23, 0.940781944835829e9,
1080  -0.367279669545448e5, -0.837513931798655e16},
1081  {0.561379678887577e-1, 0.774135421587083e10, 0.111482975877938e-8, -0.143987128208183e-2,
1082  0.193696558764920e4, -0.605971823585005e9, 0.171951568124337e14, -0.185461154985145e17,
1083  0.38785116807801e-16, -0.395464327846105e-13, -0.170875935679023e3, -0.21201062070122e4,
1084  0.177683337348191e8, 0.110177443629575e2, -0.234396091693313e6, -0.656174421999594e7,
1085  0.156362212977396e-4, -0.212946257021400e1, 0.135249306374858e2, 0.177189164145813,
1086  0.139499167345464e4, -0.703670932036388e-2, -0.152011044389648, 0.981916922991113e-4,
1087  0.147199658618076e-2, 0.202618487025578e2, 0.899345518944240, -0.211346402240858,
1088  0.249971752957491e2},
1089  {0.106905684359136e1, -0.148620857922333e1, 0.259862256980408e15,
1090  -0.446352055678749e-11, -0.566620757170032e-6, -0.235302885736849e-2,
1091  -0.269226321968839, 0.922024992944392e1, 0.357633505503772e-11,
1092  -0.173942565562222e2, 0.700681785556229e-5, -0.267050351075768e-3,
1093  -0.231779669675624e1, -0.753533046979752e-12, 0.481337131452891e1,
1094  -0.223286270422356e22, -0.118746004987383e-4, 0.646412934136496e-2,
1095  -0.410588536330937e-9, 0.422739537057241e20, 0.313698180473812e-12,
1096  0.16439533434504e-23, -0.339823323754373e-5, -0.135268639905021e-1,
1097  -0.723252514211625e-14, 0.184386437538366e-8, -0.463959533752385e-1,
1098  -0.99226310037675e14, 0.688169154439335e-16, -0.222620998452197e-10,
1099  -0.540843018624083e-7, 0.345570606200257e-2, 0.422275800304086e11,
1100  -0.126974478770487e-14, 0.927237985153679e-9, 0.612670812016489e-13,
1101  -0.722693924063497e-11, -0.383669502636822e-3, 0.374684572410204e-3,
1102  -0.931976897511086e5, -0.247690616026922e-1, 0.658110546759474e2},
1103  {-0.111371317395540e-3, 0.100342892423685e1, 0.530615581928979e1,
1104  0.179058760078792e-5, -0.728541958464774e-3, -0.187576133371704e2,
1105  0.199060874071849e-2, 0.243574755377290e2, -0.177040785499444e-3,
1106  -0.25968038522713e-2, -0.198704578406823e3, 0.738627790224287e-4,
1107  -0.236264692844138e-2, -0.161023121314333e1, 0.622322971786473e4,
1108  -0.960754116701669e-8, -0.510572269720488e-10, 0.767373781404211e-2,
1109  0.663855469485254e-14, -0.717590735526745e-9, 0.146564542926508e-4,
1110  0.309029474277013e-11, -0.464216300971708e-15, -0.390499637961161e-13,
1111  -0.236716126781431e-9, 0.454652854268717e-11, -0.422271787482497e-2,
1112  0.283911742354706e-10, 0.270929002720228e1},
1113  {-0.401215699576099e9, 0.484501478318406e11, 0.394721471363678e-14,
1114  0.372629967374147e5, -0.369794374168666e-29, -0.380436407012452e-14,
1115  0.475361629970233e-6, -0.879148916140706e-3, 0.844317863844331,
1116  0.122433162656600e2, -0.104529634830279e3, 0.589702771277429e3,
1117  -0.291026851164444e14, 0.170343072841850e-5, -0.277617606975748e-3,
1118  -0.344709605486686e1, 0.221333862447095e2, -0.194646110037079e3,
1119  0.808354639772825e-15, -0.18084520914547e-10, -0.696664158132412e-5,
1120  -0.181057560300994e-2, 0.255830298579027e1, 0.328913873658481e4,
1121  -0.173270241249904e-18, -0.661876792558034e-6, -0.39568892342125e-2,
1122  0.604203299819132e-17, -0.400879935920517e-13, 0.160751107464958e-8,
1123  0.383719409025556e-4, -0.649565446702457e-14, -0.149095328506e-11,
1124  0.541449377329581e-8},
1125  {0.260702058647537e10, -0.188277213604704e15, 0.554923870289667e19, -0.758966946387758e23,
1126  0.413865186848908e27, -0.81503800073806e12, -0.381458260489955e33, -0.123239564600519e-1,
1127  0.226095631437174e8, -0.49501780950672e12, 0.529482996422863e16, -0.444359478746295e23,
1128  0.521635864527315e35, -0.487095672740742e55, -0.714430209937547e6, 0.127868634615495,
1129  -0.100752127917598e2, 0.777451437960990e7, -0.108105480796471e25, -0.357578581169659e-5,
1130  -0.212857169423484e1, 0.270706111085238e30, -0.695953622348829e33, 0.110609027472280,
1131  0.721559163361354e2, -0.306367307532219e15, 0.265839618885530e-4, 0.253392392889754e-1,
1132  -0.214443041836579e3, 0.937846601489667, 0.223184043101700e1, 0.338401222509191e2,
1133  0.494237237179718e21, -0.198068404154428, -0.141415349881140e31, -0.993862421613651e2,
1134  0.125070534142731e3, -0.996473529004439e3, 0.473137909872765e5, 0.116662121219322e33,
1135  -0.315874976271533e16, -0.445703369196945e33, 0.642794932373694e33},
1136  {0.811384363481847, -0.568199310990094e4, -0.178657198172556e11, 0.795537657613427e32,
1137  -0.814568209346872e5, -0.659774567602874e8, -0.152861148659302e11, -0.560165667510446e12,
1138  0.458384828593949e6, -0.385754000383848e14, 0.453735800004273e8, 0.939454935735563e12,
1139  0.266572856432938e28, -0.547578313899097e10, 0.200725701112386e15, 0.185007245563239e13,
1140  0.185135446828337e9, -0.170451090076385e12, 0.157890366037614e15, -0.202530509748774e16,
1141  0.36819392618357e60, 0.170215539458936e18, 0.639234909918741e42, -0.821698160721956e15,
1142  -0.795260241872306e24, 0.23341586947851e18, -0.600079934586803e23, 0.594584382273384e25,
1143  0.189461279349492e40, -0.810093428842645e46, 0.188813911076809e22, 0.111052244098768e36,
1144  0.291133958602503e46, -0.329421923951460e22, -0.137570282536696e26, 0.181508996303902e28,
1145  -0.346865122768353e30, -0.21196114877426e38, -0.128617899887675e49, 0.479817895699239e65},
1146  {0.280967799943151e-38, 0.614869006573609e-30, 0.582238667048942e-27,
1147  0.390628369238462e-22, 0.821445758255119e-20, 0.402137961842776e-14,
1148  0.651718171878301e-12, -0.211773355803058e-7, 0.264953354380072e-2,
1149  -0.135031446451331e-31, -0.607246643970893e-23, -0.402352115234494e-18,
1150  -0.744938506925544e-16, 0.189917206526237e-12, 0.364975183508473e-5,
1151  0.177274872361946e-25, -0.334952758812999e-18, -0.421537726098389e-8,
1152  -0.391048167929649e-1, 0.541276911564176e-13, 0.705412100773699e-11,
1153  0.258585887897486e-8, -0.493111362030162e-10, -0.158649699894543e-5,
1154  -0.525037427886100, 0.220019901729615e-2, -0.643064132636925e-2,
1155  0.629154149015048e2, 0.135147318617061e3, 0.240560808321713e-6,
1156  -0.890763306701305e-3, -0.440209599407714e4, -0.302807107747776e3,
1157  0.159158748314599e4, 0.232534272709876e6, -0.792681207132600e6,
1158  -0.869871364662769e11, 0.354542769185671e12, 0.400849240129329e15},
1159  {0.128746023979718e-34, -0.735234770382342e-11, 0.28907869214915e-2,
1160  0.244482731907223, 0.141733492030985e-23, -0.354533853059476e-28,
1161  -0.594539202901431e-17, -.585188401782779e-8, .201377325411803e-5,
1162  0.138647388209306e1, -0.173959365084772e-4, 0.137680878349369e-2,
1163  0.814897605805513e-14, 0.425596631351839e-25, -0.387449113787755e-17,
1164  0.13981474793024e-12, -0.171849638951521e-2, 0.641890529513296e-21,
1165  0.118960578072018e-10, -0.155282762571611e-17, 0.233907907347507e-7,
1166  -0.174093247766213e-12, 0.377682649089149e-8, -0.516720236575302e-10},
1167  {-0.982825342010366e-4, 0.105145700850612e1, 0.116033094095084e3, 0.324664750281543e4,
1168  -0.123592348610137e4, -0.561403450013495e-1, 0.856677401640869e-7, 0.236313425393924e3,
1169  0.972503292350109e-2, -0.103001994531927e1, -0.149653706199162e-8, -0.215743778861592e-4,
1170  -0.834452198291445e1, 0.586602660564988, 0.343480022104968e-25, 0.816256095947021e-5,
1171  0.294985697916798e-2, 0.711730466276584e-16, 0.400954763806941e-9, 0.107766027032853e2,
1172  -0.409449599138182e-6, -0.729121307758902e-5, 0.677107970938909e-8, 0.602745973022975e-7,
1173  -0.382323011855257e-10, 0.179946628317437e-2, -0.345042834640005e-3},
1174  {-0.820433843259950e5, 0.473271518461586e11, -0.805950021005413e-1, 0.328600025435980e2,
1175  -0.35661702998249e4, -0.172985781433335e10, 0.351769232729192e8, -0.775489259985144e6,
1176  0.710346691966018e-4, 0.993499883820274e5, -0.642094171904570, -0.612842816820083e4,
1177  0.232808472983776e3, -0.142808220416837e-4, -0.643596060678456e-2, -0.428577227475614e1,
1178  0.225689939161918e4, 0.100355651721510e-2, 0.333491455143516, 0.109697576888873e1,
1179  0.961917379376452, -0.838165632204598e-1, 0.247795908411492e1, -0.319114969006533e4},
1180  {0.144165955660863e-2, -0.701438599628258e13, -0.830946716459219e-16, 0.261975135368109,
1181  0.393097214706245e3, -0.104334030654021e5, 0.490112654154211e9, -0.147104222772069e-3,
1182  0.103602748043408e1, 0.305308890065089e1, -0.399745276971264e7, 0.569233719593750e-11,
1183  -0.464923504407778e-1, -0.535400396512906e-17, 0.399988795693162e-12, -0.536479560201811e-6,
1184  0.159536722411202e-1, 0.270303248860217e-14, 0.244247453858506e-7, -0.983430636716454e-5,
1185  0.663513144224454e-1, -0.993456957845006e1, 0.546491323528491e3, -0.143365406393758e5,
1186  0.150764974125511e6, -0.337209709340105e-9, 0.377501980025469e-8},
1187  {-0.532466612140254e23, 0.100415480000824e32, -0.191540001821367e30, 0.105618377808847e17,
1188  0.202281884477061e59, 0.884585472596134e8, 0.166540181638363e23, -0.313563197669111e6,
1189  -0.185662327545324e54, -0.624942093918942e-1, -0.50416072413259e10, 0.187514491833092e5,
1190  0.121399979993217e-2, 0.188317043049455e1, -0.167073503962060e4, 0.965961650599775,
1191  0.294885696802488e1, -0.653915627346115e5, 0.604012200163444e50, -0.198339358557937,
1192  -0.175984090163501e58, 0.356314881403987e1, -0.575991255144384e3, 0.456213415338071e5,
1193  -0.109174044987829e8, 0.437796099975134e34, -0.616552611135792e46, 0.193568768917797e10,
1194  0.950898170425042e54},
1195  {0.155287249586268e1, 0.664235115009031e1, -0.289366236727210e4, -0.385923202309848e13,
1196  -0.291002915783761e1, -0.829088246858083e12, 0.176814899675218e1, -0.534686695713469e9,
1197  0.160464608687834e18, 0.196435366560186e6, 0.156637427541729e13, -0.178154560260006e1,
1198  -0.229746237623692e16, 0.385659001648006e8, 0.110554446790543e10, -0.677073830687349e14,
1199  -0.327910592086523e31, -0.341552040860644e51, -0.527251339709047e21, 0.245375640937055e24,
1200  -0.168776617209269e27, 0.358958955867578e29, -0.656475280339411e36, 0.355286045512301e39,
1201  0.569021454413270e58, -0.700584546433113e48, -0.705772623326374e65, 0.166861176200148e53,
1202  -0.300475129680486e61, -0.668481295196808e51, 0.428432338620678e69, -0.444227367758304e72,
1203  -0.281396013562745e77},
1204  {0.122088349258355e18, 0.104216468608488e10, -.882666931564652e16, 0.259929510849499e20,
1205  0.222612779142211e15, -0.878473585050085e18, -0.314432577551552e22, -0.216934916996285e13,
1206  0.159079648196849e21, -0.339567617303423e3, 0.884387651337836e13, -0.843405926846418e21,
1207  0.114178193518022e2, -0.122708229235641e-3, -0.106201671767107e3, 0.903443213959313e25,
1208  -0.693996270370852e28, 0.648916718965575e-8, 0.718957567127851e4, 0.105581745346187e-2,
1209  -0.651903203602581e15, -0.160116813274676e25, -0.510254294237837e-8, -0.152355388953402,
1210  0.677143292290144e12, 0.276378438378930e15, 0.116862983141686e-1, -0.301426947980171e14,
1211  0.169719813884840e-7, 0.104674840020929e27, -0.10801690456014e5, -0.990623601934295e-12,
1212  0.536116483602738e7, 0.226145963747881e22, -0.488731565776210e-9, 0.151001548880670e-4,
1213  -0.227700464643920e5, -0.781754507698846e28},
1214  {-0.415652812061591e-54, 0.177441742924043e-60, -0.357078668203377e-54,
1215  0.359252213604114e-25, -0.259123736380269e2, 0.594619766193460e5,
1216  -0.624184007103158e11, 0.313080299915944e17, 0.105006446192036e-8,
1217  -0.192824336984852e-5, 0.654144373749937e6, 0.513117462865044e13,
1218  -0.697595750347391e19, -0.103977184454767e29, 0.119563135540666e-47,
1219  -0.436677034051655e-41, 0.926990036530639e-29, 0.587793105620748e21,
1220  0.280375725094731e-17, -0.192359972440634e23, 0.742705723302738e27,
1221  -0.517429682450605e2, 0.820612048645469e7, -0.188214882341448e-8,
1222  0.184587261114837e-1, -0.135830407782663e-5, -0.723681885626348e17,
1223  -0.223449194054124e27, -0.111526741826431e-34, 0.276032601145151e-28,
1224  0.134856491567853e15, 0.652440293345860e-9, 0.510655119774360e17,
1225  -0.468138358908732e32, -0.760667491183279e16, -0.417247986986821e-18,
1226  0.312545677756104e14, -0.100375333864186e15, 0.247761392329058e27},
1227  {-0.586219133817016e-7, -0.894460355005526e11, 0.531168037519774e-30,
1228  0.109892402329239, -0.575368389425212e-1, 0.228276853990249e5,
1229  -0.158548609655002e19, 0.329865748576503e-27, -0.634987981190669e-24,
1230  0.615762068640611e-8, -0.961109240985747e8, -0.406274286652625e-44,
1231  -0.471103725498077e-12, 0.725937724828145, 0.187768525763682e-38,
1232  -0.103308436323771e4, -0.662552816342168e-1, 0.579514041765710e3,
1233  0.237416732616644e-26, 0.271700235739893e-14, -0.9078862134836e2,
1234  -0.171242509570207e-36, 0.156792067854621e3, 0.923261357901470,
1235  -0.597865988422577e1, 0.321988767636389e7, -0.399441390042203e-29,
1236  0.493429086046981e-7, 0.812036983370565e-19, -0.207610284654137e-11,
1237  -0.340821291419719e-6, 0.542000573372233e-17, -0.856711586510214e-12,
1238  0.266170454405981e-13, 0.858133791857099e-5},
1239  {0.377373741298151e19, -0.507100883722913e13, -0.10336322559886e16, 0.184790814320773e-5,
1240  -0.924729378390945e-3, -0.425999562292738e24, -0.462307771873973e-12, 0.107319065855767e22,
1241  0.648662492280682e11, 0.244200600688281e1, -0.851535733484258e10, 0.169894481433592e22,
1242  0.215780222509020e-26, -0.320850551367334, -0.382642448458610e17, -0.275386077674421e-28,
1243  -0.563199253391666e6, -0.326068646279314e21, 0.397949001553184e14, 0.100824008584757e-6,
1244  0.162234569738433e5, -0.432355225319745e11, -0.59287424559861e12, 0.133061647281106e1,
1245  0.157338197797544e7, 0.258189614270853e14, 0.262413209706358e25, -0.920011937431142e-1,
1246  0.220213765905426e-2, -0.110433759109547e2, 0.847004870612087e7, -0.592910695762536e9,
1247  -0.183027173269660e-4, 0.181339603516302, -0.119228759669889e4, 0.430867658061468e7},
1248  {-0.525597995024633e-9, 0.583441305228407e4, -0.134778968457925e17, 0.118973500934212e26,
1249  -0.159096490904708e27, -0.315839902302021e-6, 0.496212197158239e3, 0.327777227273171e19,
1250  -0.527114657850696e22, 0.210017506281863e-16, 0.705106224399834e21, -0.266713136106469e31,
1251  -0.145370512554562e-7, 0.149333917053130e28, -0.149795620287641e8, -0.3818819062711e16,
1252  0.724660165585797e-4, -0.937808169550193e14, 0.514411468376383e10, -0.828198594040141e5},
1253  {0.24400789229065e-10, -0.463057430331242e7, 0.728803274777712e10, 0.327776302858856e16,
1254  -0.110598170118409e10, -0.323899915729957e13, 0.923814007023245e16, 0.842250080413712e-12,
1255  0.663221436245506e12, -0.167170186672139e15, 0.253749358701391e4, -0.819731559610523e-20,
1256  0.328380587890663e12, -0.625004791171543e8, 0.803197957462023e21, -0.204397011338353e-10,
1257  -0.378391047055938e4, 0.97287654593862e-2, 0.154355721681459e2, -0.373962862928643e4,
1258  -0.682859011374572e11, -0.248488015614543e-3, 0.394536049497068e7}};
1259 
1260  const std::vector<std::vector<int>> _I3s{
1261  {-12, -12, -12, -10, -10, -10, -8, -8, -8, -6, -5, -5, -5, -4, -3,
1262  -3, -3, -3, -2, -2, -2, -1, -1, -1, 0, 0, 1, 1, 2, 2},
1263  {-12, -12, -10, -10, -8, -6, -6, -6, -5, -5, -5, -4, -4, -4, -3, -3,
1264  -3, -3, -3, -2, -2, -2, -1, -1, 0, 0, 1, 1, 2, 3, 4, 4},
1265  {-12, -12, -12, -10, -10, -10, -8, -8, -8, -6, -5, -5, -5, -4, -4, -3, -3, -2,
1266  -2, -2, -1, -1, -1, 0, 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 8},
1267  {-12, -12, -12, -12, -12, -12, -10, -10, -10, -10, -10, -10, -10, -8, -8, -8, -8, -6, -6,
1268  -5, -5, -5, -5, -4, -4, -4, -3, -3, -2, -2, -1, -1, -1, 0, 0, 1, 1, 3},
1269  {-12, -12, -10, -10, -10, -10, -10, -8, -8, -8, -6, -5, -4, -4, -3,
1270  -3, -3, -2, -2, -2, -2, -1, 0, 0, 1, 1, 1, 2, 2},
1271  {0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 5, 5, 6, 7, 7,
1272  10, 12, 12, 12, 14, 14, 14, 14, 14, 16, 16, 18, 18, 20, 20, 20, 22, 24, 24, 28, 32},
1273  {-12, -12, -12, -12, -12, -12, -10, -10, -10, -8, -8, -8, -8, -6, -6, -5, -5, -4, -3,
1274  -2, -2, -2, -2, -1, -1, -1, 0, 0, 0, 1, 1, 1, 3, 5, 6, 8, 10, 10},
1275  {-12, -12, -10, -10, -10, -10, -10, -10, -8, -8, -8, -8, -8, -6, -6,
1276  -6, -5, -5, -5, -4, -4, -3, -3, -2, -1, -1, 0, 1, 1},
1277  {0, 0, 0, 1, 1, 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 7, 7, 8, 8, 10,
1278  12, 12, 12, 14, 14, 14, 14, 18, 18, 18, 18, 18, 20, 20, 22, 24, 24, 32, 32, 36, 36},
1279  {0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 5, 5, 5, 6,
1280  10, 12, 12, 14, 14, 14, 16, 18, 20, 20, 24, 24, 28, 28},
1281  {-2, -2, -1, -1, 0, -0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1,
1282  1, 2, 2, 2, 2, 2, 2, 5, 5, 5, 6, 6, 6, 6, 8, 10, 12},
1283  {-12, -12, -12, -12, -12, -10, -10, -8, -8, -8, -8, -8, -8, -8, -6,
1284  -5, -5, -4, -4, -3, -3, -3, -3, -2, -2, -2, -1, -1, -1, 0,
1285  0, 0, 0, 1, 1, 2, 4, 5, 5, 6, 10, 10, 14},
1286  {0, 3, 8, 20, 1, 3, 4, 5, 1, 6, 2, 4, 14, 2, 5, 3, 0, 1, 1, 1,
1287  28, 2, 16, 0, 5, 0, 3, 4, 12, 16, 1, 8, 14, 0, 2, 3, 4, 8, 14, 24},
1288  {0, 3, 4, 6, 7, 10, 12, 14, 18, 0, 3, 5, 6, 8, 12, 0, 3, 7, 12, 2,
1289  3, 4, 2, 4, 7, 4, 3, 5, 6, 0, 0, 3, 1, 0, 1, 0, 1, 0, 1},
1290  {0, 0, 0, 2, 3, 4, 4, 4, 4, 4, 5, 5, 6, 7, 8, 8, 8, 10, 10, 14, 14, 20, 20, 24},
1291  {0, 0, 0, 0, 1, 2, 3, 3, 4, 6, 7, 7, 8, 10,
1292  12, 12, 12, 14, 14, 14, 16, 18, 20, 22, 24, 24, 36},
1293  {-12, -12, -10, -10, -10, -10, -8, -6, -5, -5, -4, -4,
1294  -3, -2, -2, -2, -2, -1, -1, -1, 0, 1, 1, 1},
1295  {-8, -8, -3, -3, -3, -3, -3, 0, 0, 0, 0, 3, 3, 8,
1296  8, 8, 8, 10, 10, 10, 10, 10, 10, 10, 10, 12, 14},
1297  {-12, -12, -10, -8, -6, -5, -5, -4, -4, -3, -3, -2, -1, -1, -1,
1298  0, 0, 0, 0, 1, 1, 3, 3, 3, 4, 4, 4, 5, 14},
1299  {0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 7, 7, 7, 7,
1300  7, 10, 10, 10, 10, 10, 18, 20, 22, 22, 24, 28, 32, 32, 32, 36},
1301  {-12, -10, -10, -10, -8, -8, -8, -6, -6, -5, -5, -5, -3, -1, -1, -1, -1, 0, 0,
1302  1, 2, 2, 3, 5, 5, 5, 6, 6, 8, 8, 10, 12, 12, 12, 14, 14, 14, 14},
1303  {-10, -8, -6, -6, -6, -6, -6, -6, -5, -5, -5, -5, -5, -5, -4, -4, -4, -4, -3, -3,
1304  -3, -2, -2, -1, -1, 0, 0, 0, 1, 1, 3, 4, 4, 4, 5, 8, 10, 12, 14},
1305  {-12, -12, -10, -10, -8, -8, -8, -6, -6, -6, -6, -5, -4, -4, -3, -3, -2, -2,
1306  -1, -1, -1, 0, 0, 1, 2, 2, 3, 3, 5, 5, 5, 8, 8, 10, 10},
1307  {-8, -6, -5, -4, -4, -4, -3, -3, -1, 0, 0, 0, 1, 1, 2, 3, 3, 3,
1308  4, 5, 5, 5, 6, 8, 8, 8, 8, 10, 12, 12, 12, 12, 14, 14, 14, 14},
1309  {0, 0, 0, 0, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 8, 8, 10, 12},
1310  {-8, -6, -5, -5, -4, -4, -4, -3, -3, -3, -2, -1, 0, 1, 2, 3, 3, 6, 6, 6, 6, 8, 8}};
1311 
1312  const std::vector<std::vector<int>> _J3s{
1313  {5, 10, 12, 5, 10, 12, 5, 8, 10, 1, 1, 5, 10, 8, 0,
1314  1, 3, 6, 0, 2, 3, 0, 1, 2, 0, 1, 0, 2, 0, 2},
1315  {10, 12, 8, 14, 8, 5, 6, 8, 5, 8, 10, 2, 4, 5, 0, 1,
1316  2, 3, 5, 0, 2, 5, 0, 2, 0, 1, 0, 2, 0, 2, 0, 1},
1317  {6, 8, 10, 6, 8, 10, 5, 6, 7, 8, 1, 4, 7, 2, 8, 0, 3, 0,
1318  4, 5, 0, 1, 2, 0, 1, 2, 0, 2, 0, 1, 3, 7, 0, 7, 1},
1319  {4, 6, 7, 10, 12, 16, 0, 2, 4, 6, 8, 10, 14, 3, 7, 8, 10, 6, 8,
1320  1, 2, 5, 7, 0, 1, 7, 2, 4, 0, 1, 0, 1, 5, 0, 2, 0, 6, 0},
1321  {14, 16, 3, 6, 10, 14, 16, 7, 8, 10, 6, 6, 2, 4, 2, 6, 7, 0, 1, 3, 4, 0, 0, 1, 0, 4, 6, 0, 2},
1322  {-3, -2, -1, 0, 1, 2, -1, 1, 2, 3, 0, 1, -5, -2,
1323  0, -3, -8, 1, -6, -4, 1, -6, -10, -8, -4, -12, -10, -8,
1324  -6, -4, -10, -8, -12, -10, -12, -10, -6, -12, -12, -4, -12, -12},
1325  {7, 12, 14, 18, 22, 24, 14, 20, 24, 7, 8, 10, 12, 8, 22, 7, 20, 22, 7,
1326  3, 5, 14, 24, 2, 8, 18, 0, 1, 2, 0, 1, 3, 24, 22, 12, 3, 0, 6},
1327  {8, 12, 4, 6, 8, 10, 14, 16, 0, 1, 6, 7, 8, 4, 6, 8, 2, 3, 4, 2, 4, 1, 2, 0, 0, 2, 0, 0, 2},
1328  {0, 1, 10, -4, -2, -1, 0, 0, -5, 0, -3, -2, -1, -6, -1, 12, -4, -3, -6, 10, -8,
1329  -12, -6, -4, -10, -8, -4, 5, -12, -10, -8, -6, 2, -12, -10, -12, -12, -8, -10, -5, -10, -8},
1330  {-1, 0, 1, -2, -1, 1, -1, 1, -2, -2, 2, -3, -2, 0, 3,
1331  -6, -8, -3, -10, -8, -5, -10, -12, -12, -10, -12, -6, -12, -5},
1332  {10, 12, -5, 6, -12, -6, -2, -1, 0, 1, 2, 3, 14, -3, -2, 0, 1,
1333  2, -8, -6, -3, -2, 0, 4, -12, -6, -3, -12, -10, -8, -5, -12, -12, -10},
1334  {14, 16, 18, 20, 22, 14, 24, 6, 10, 12, 14, 18, 24, 36, 8, 4, 5, 7, 16, 1, 3, 18,
1335  20, 2, 3, 10, 0, 1, 3, 0, 1, 2, 12, 0, 16, 1, 0, 0, 1, 14, 4, 12, 10},
1336  {0, 0, 0, 2, 5, 5, 5, 5, 6, 6, 7, 8, 8, 10, 10, 12, 14, 14, 18, 20,
1337  20, 22, 22, 24, 24, 28, 28, 28, 28, 28, 32, 32, 32, 36, 36, 36, 36, 36, 36, 36},
1338  {-12, -12, -12, -12, -12, -12, -12, -12, -12, -10, -10, -10, -10,
1339  -10, -10, -8, -8, -8, -8, -6, -6, -6, -5, -5, -5, -4,
1340  -3, -3, -3, -2, -1, -1, 0, 1, 1, 2, 4, 5, 6},
1341  {-12, -4, -1, -1, -10, -12, -8, -5, -4, -1, -4, -3,
1342  -8, -12, -10, -8, -4, -12, -8, -12, -8, -12, -10, -12},
1343  {-1, 0, 1, 2, 1, -1, -3, 0, -2, -2, -5, -4, -2, -3,
1344  -12, -6, -5, -10, -8, -3, -8, -8, -10, -10, -12, -8, -12},
1345  {10, 12, 6, 7, 8, 10, 8, 6, 2, 5, 3, 4, 3, 0, 1, 2, 4, 0, 1, 2, 0, 0, 1, 3},
1346  {6, 14, -3, 3, 4, 5, 8, -1, 0, 1, 5, -6, -2, -12,
1347  -10, -8, -5, -12, -10, -8, -6, -5, -4, -3, -2, -12, -12},
1348  {20, 24, 22, 14, 36, 8, 16, 6, 32, 3, 8, 4, 1, 2, 3,
1349  0, 1, 4, 28, 0, 32, 0, 1, 2, 3, 18, 24, 4, 24},
1350  {0, 1, 4, 12, 0, 10, 0, 6, 14, 3, 8, 0, 10, 3, 4, 7, 20,
1351  36, 10, 12, 14, 16, 22, 18, 32, 22, 36, 24, 28, 22, 32, 36, 36},
1352  {14, 10, 12, 14, 10, 12, 14, 8, 12, 4, 8, 12, 2, -1, 1, 12, 14, -3, 1,
1353  -2, 5, 10, -5, -4, 2, 3, -5, 2, -8, 8, -4, -12, -4, 4, -12, -10, -6, 6},
1354  {-8, -12, -12, -3, 5, 6, 8, 10, 1, 2, 6, 8, 10, 14, -12, -10, -6, 10, -3, 10,
1355  12, 2, 4, -2, 0, -2, 6, 10, -12, -10, 3, -6, 3, 10, 2, -12, -2, -3, 1},
1356  {8, 14, -1, 8, 6, 8, 14, -4, -3, 2, 8, -10, -1, 3, -10, 3, 1, 2,
1357  -8, -4, 1, -12, 1, -1, -1, 2, -12, -5, -10, -8, -6, -12, -10, -12, -8},
1358  {14, 10, 10, 1, 2, 14, -2, 12, 5, 0, 4, 10, -10, -1, 6, -12, 0, 8,
1359  3, -6, -2, 1, 1, -6, -3, 1, 8, -8, -10, -8, -5, -4, -12, -10, -8, -6},
1360  {-3, 1, 5, 8, 8, -4, -1, 4, 5, -8, 4, 8, -6, 6, -2, 1, -8, -2, -5, -8},
1361  {3, 6, 6, 8, 5, 6, 8, -2, 5, 6, 2, -6, 3, 1, 6, -6, -2, -6, -5, -4, -1, -8, -4}};
1362 
1363  const std::array<Real, 31> _nph3a{
1364  {-0.133645667811215e-6, 0.455912656802978e-5, -0.146294640700979e-4, 0.639341312970080e-2,
1365  0.372783927268847e3, -0.718654377460447e4, 0.573494752103400e6, -0.267569329111439e7,
1366  -0.334066283302614e-4, -0.245479214069597e-1, 0.478087847764996e2, 0.764664131818904e-5,
1367  0.128350627676972e-2, 0.171219081377331e-1, -0.851007304583213e1, -0.136513461629781e-1,
1368  -0.384460997596657e-5, 0.337423807911655e-2, -0.551624873066791, 0.729202277107470,
1369  -0.992522757376041e-2, -.119308831407288, .793929190615421, .454270731799386,
1370  .20999859125991, -0.642109823904738e-2, -0.235155868604540e-1, 0.252233108341612e-2,
1371  -0.764885133368119e-2, 0.136176427574291e-1, -0.133027883575669e-1}};
1372 
1373  const std::array<int, 31> _Iph3a{{-12, -12, -12, -12, -12, -12, -12, -12, -10, -10, -10,
1374  -8, -8, -8, -8, -5, -3, -2, -2, -2, -1, -1,
1375  0, 0, 1, 3, 3, 4, 4, 10, 12}};
1376 
1377  const std::array<int, 31> _Jph3a{{0, 1, 2, 6, 14, 16, 20, 22, 1, 5, 12, 0, 2, 4, 10, 2,
1378  0, 1, 3, 4, 0, 2, 0, 1, 1, 0, 1, 0, 3, 4, 5}};
1379 
1380  const std::array<Real, 33> _nph3b{
1381  {0.323254573644920e-4, -0.127575556587181e-3, -0.475851877356068e-3, 0.156183014181602e-2,
1382  0.105724860113781, -0.858514221132534e2, 0.724140095480911e3, 0.296475810273257e-2,
1383  -0.592721983365988e-2, -0.126305422818666e-1, -0.115716196364853, 0.849000969739595e2,
1384  -0.108602260086615e-1, 0.154304475328851e-1, 0.750455441524466e-1, 0.252520973612982e-1,
1385  -0.602507901232996e-1, -0.307622221350501e1, -0.574011959864879e-1, 0.503471360939849e1,
1386  -0.925081888584834, 0.391733882917546e1, -0.773146007130190e2, 0.949308762098587e4,
1387  -0.141043719679409e7, 0.849166230819026e7, 0.861095729446704, 0.323346442811720,
1388  0.873281936020439, -0.436653048526683, 0.286596714529479, -0.131778331276228,
1389  0.676682064330275e-2}};
1390 
1391  const std::array<int, 33> _Iph3b{{-12, -12, -10, -10, -10, -10, -10, -8, -8, -8, -8,
1392  -8, -6, -6, -6, -4, -4, -3, -2, -2, -1, -1,
1393  -1, -1, -1, -1, 0, 0, 1, 3, 5, 6, 8}};
1394 
1395  const std::array<int, 33> _Jph3b{{0, 1, 0, 1, 5, 10, 12, 0, 1, 2, 4, 10, 0, 1, 2, 0, 1,
1396  5, 0, 4, 2, 4, 6, 10, 14, 16, 0, 2, 1, 1, 1, 1, 1}};
1397 
1399  const std::array<Real, 10> _n4{{0.11670521452767e4,
1400  -0.72421316703206e6,
1401  -0.17073846940092e2,
1402  0.12020824702470e5,
1403  -0.32325550322333e7,
1404  0.14915108613530e2,
1405  -0.48232657361591e4,
1406  0.40511340542057e6,
1407  -0.238555575678490,
1408  0.65017534844798e3}};
1409 
1411  const std::array<int, 6> _J05{{0, 1, -3, -2, -1, 2}};
1412  const std::array<Real, 6> _n05{{-0.13179983674201e2,
1413  0.68540841634434e1,
1414  -0.24805148933466e-1,
1415  0.36901534980333,
1416  -0.31161318213925e1,
1417  -0.32961626538917}};
1418 
1419  const std::array<int, 6> _I5{{1, 1, 1, 2, 2, 3}};
1420  const std::array<int, 6> _J5{{1, 2, 3, 3, 9, 7}};
1421  const std::array<Real, 6> _n5{{0.15736404855259e-2,
1422  0.90153761673944e-3,
1423  -0.50270077677648e-2,
1424  0.22440037409485e-5,
1425  -0.41163275453471e-5,
1426  0.37919454822955e-7}};
1427 
1429  const std::vector<std::vector<int>> _tempXY_I{{0, 1, 2, -1, -2},
1430  {0, 1, 2, 3},
1431  {0, 1, 2, 3, 4},
1432  {0, 1, 2, 3, 4},
1433  {0, 1, 2, 3, 4},
1434  {0, 1, 2, 3},
1435  {0, 1, 2, -1, -2},
1436  {0, 1, 2, 3},
1437  {0, 1, 2, 3},
1438  {0, 1, 2, 3, 4},
1439  {0, 1, 2, -1, -2}};
1440 
1441  const std::vector<std::vector<Real>> _tempXY_n{
1442  {0.154793642129415e4,
1443  -0.187661219490113e3,
1444  0.213144632222113e2,
1445  -0.191887498864292e4,
1446  0.918419702359447e3},
1447  {0.585276966696349e3, 0.278233532206915e1, -0.127283549295878e-1, 0.159090746562729e-3},
1448  {-0.249284240900418e5,
1449  0.428143584791546e4,
1450  -0.269029173140130e3,
1451  0.751608051114157e1,
1452  -0.787105249910383e-1},
1453  {0.584814781649163e3,
1454  -0.616179320924617,
1455  0.260763050899562,
1456  -0.587071076864459e-2,
1457  0.515308185433082e-4},
1458  {0.617229772068439e3,
1459  -0.770600270141675e1,
1460  0.697072596851896,
1461  -0.157391839848015e-1,
1462  0.137897492684194e-3},
1463  {0.535339483742384e3, 0.761978122720128e1, -0.158365725441648, 0.192871054508108e-2},
1464  {0.969461372400213e3,
1465  -0.332500170441278e3,
1466  0.642859598466067e2,
1467  0.773845935768222e3,
1468  -0.152313732937084e4},
1469  {0.565603648239126e3, 0.529062258221222e1, -0.102020639611016, 0.122240301070145e-2},
1470  {0.584561202520006e3, -0.102961025163669e1, 0.243293362700452, -0.294905044740799e-2},
1471  {0.528199646263062e3, 0.890579602135307e1, -0.222814134903755, 0.286791682263697e-2},
1472  {0.728052609145380e1,
1473  0.973505869861952e2,
1474  0.147370491183191e2,
1475  0.329196213998375e3,
1476  0.873371668682417e3}};
1477 
1480  const std::array<Real, 4> _mu_H0{{1.67752, 2.20462, 0.6366564, -0.241605}};
1481  const std::array<std::array<Real, 7>, 6> _mu_Hij{
1482  {{{5.20094e-1, 2.22531e-1, -2.81378e-1, 1.61913e-1, -3.25372e-2, 0.0, 0.0}},
1483  {{8.50895e-2, 9.99115e-1, -9.06851e-1, 2.57399e-1, 0.0, 0.0, 0.0}},
1484  {{-1.08374, 1.88797, -7.72479e-1, 0.0, 0.0, 0.0, 0.0}},
1485  {{-2.89555e-1, 1.26613, -4.89837e-1, 0.0, 6.98452e-2, 0.0, -4.35673e-3}},
1486  {{0.0, 0.0, -2.57040e-1, 0.0, 0.0, 8.72102e-3, 0.0}},
1487  {{0.0, 1.20573e-1, 0.0, 0.0, 0.0, 0.0, -5.93264e-4}}}};
1488 
1490  std::array<Real, 4> _k_a{{0.0102811, 0.0299621, 0.0156146, -0.00422464}};
1491 
1493  const std::array<Real, 5> _T_star{{1386.0, 540.0, _T_critical, 1.0, 1000.0}};
1495  const std::array<Real, 5> _p_star{{16.53e6, 1.0e6, 1.0e6, 1.0e6, 1.0e6}};
1496 
1497 private:
1502  template <typename T>
1503  std::pair<T, T> T_drhodT_from_p_rho(const T & p, const T & rho) const;
1504 };
1505 
1506 #pragma GCC diagnostic pop
1507 
1508 template <typename T>
1509 T
1510 Water97FluidProperties::dgamma1_dpi(const T & pi, const T & tau) const
1511 {
1512  T sum = 0.0;
1513  for (std::size_t i = 0; i < _n1.size(); ++i)
1514  sum += -_n1[i] * _I1[i] * MathUtils::pow(7.1 - pi, _I1[i] - 1) *
1515  MathUtils::pow(tau - 1.222, _J1[i]);
1516 
1517  return sum;
1518 }
1519 
1520 template <typename T>
1521 T
1522 Water97FluidProperties::dgamma2_dpi(const T & pi, const T & tau) const
1523 {
1524  // Ideal gas part of the Gibbs free energy
1525  T dg0 = 1.0 / pi;
1526 
1527  // Residual part of the Gibbs free energy
1528  T dgr = 0.0;
1529  for (std::size_t i = 0; i < _n2.size(); ++i)
1530  dgr += _n2[i] * _I2[i] * MathUtils::pow(pi, _I2[i] - 1) * MathUtils::pow(tau - 0.5, _J2[i]);
1531 
1532  return dg0 + dgr;
1533 }
1534 
1535 template <typename T>
1536 T
1538 {
1539  // Region 3 is subdivided into 26 subregions, each with a given backwards equation
1540  // to directly calculate density from pressure and temperature without the need for
1541  // expensive iterations. Find the subregion id that the point is in:
1542  unsigned int sid =
1544 
1545  T vstar, pi, theta;
1546  Real a, b, c, d, e;
1547  unsigned int N;
1548 
1549  vstar = _par3[sid][0];
1550  pi = pressure / _par3[sid][1] / 1.0e6;
1551  theta = temperature / _par3[sid][2];
1552  a = _par3[sid][3];
1553  b = _par3[sid][4];
1554  c = _par3[sid][5];
1555  d = _par3[sid][6];
1556  e = _par3[sid][7];
1557  N = _par3N[sid];
1558 
1559  T sum = 0.0;
1560  T volume = 0.0;
1561 
1562  // Note that subregion 13 is the only different formulation
1563  if (sid == 13)
1564  {
1565  for (std::size_t i = 0; i < N; ++i)
1566  sum += _n3s[sid][i] * MathUtils::pow(pi - a, _I3s[sid][i]) *
1567  MathUtils::pow(theta - b, _J3s[sid][i]);
1568 
1569  volume = vstar * std::exp(sum);
1570  }
1571  else
1572  volume = vstar * subregionVolume(pi, theta, a, b, c, d, e, sid);
1573 
1574  // Density is the inverse of volume
1575  return 1.0 / volume;
1576 }
1577 
1578 template <typename T>
1579 T
1580 Water97FluidProperties::gamma1(const T & pi, const T & tau) const
1581 {
1582  T sum = 0.0;
1583  for (std::size_t i = 0; i < _n1.size(); ++i)
1584  sum += _n1[i] * MathUtils::pow(7.1 - pi, _I1[i]) * MathUtils::pow(tau - 1.222, _J1[i]);
1585 
1586  return sum;
1587 }
1588 
1589 template <typename T>
1590 T
1591 Water97FluidProperties::d2gamma1_dpi2(const T & pi, const T & tau) const
1592 {
1593  T sum = 0.0;
1594  for (std::size_t i = 0; i < _n1.size(); ++i)
1595  sum += _n1[i] * _I1[i] * (_I1[i] - 1) * MathUtils::pow(7.1 - pi, _I1[i] - 2) *
1596  MathUtils::pow(tau - 1.222, _J1[i]);
1597 
1598  return sum;
1599 }
1600 
1601 template <typename T>
1602 T
1603 Water97FluidProperties::dgamma1_dtau(const T & pi, const T & tau) const
1604 {
1605  T g = 0.0;
1606  for (std::size_t i = 0; i < _n1.size(); ++i)
1607  g += _n1[i] * _J1[i] * MathUtils::pow(7.1 - pi, _I1[i]) *
1608  MathUtils::pow(tau - 1.222, _J1[i] - 1);
1609 
1610  return g;
1611 }
1612 
1613 template <typename T>
1614 T
1615 Water97FluidProperties::d2gamma1_dtau2(const T & pi, const T & tau) const
1616 {
1617  T dg = 0.0;
1618  for (std::size_t i = 0; i < _n1.size(); ++i)
1619  dg += _n1[i] * _J1[i] * (_J1[i] - 1) * MathUtils::pow(7.1 - pi, _I1[i]) *
1620  MathUtils::pow(tau - 1.222, _J1[i] - 2);
1621 
1622  return dg;
1623 }
1624 
1625 template <typename T>
1626 T
1627 Water97FluidProperties::d2gamma1_dpitau(const T & pi, const T & tau) const
1628 {
1629  T dg = 0.0;
1630  for (std::size_t i = 0; i < _n1.size(); ++i)
1631  dg += -_n1[i] * _I1[i] * _J1[i] * MathUtils::pow(7.1 - pi, _I1[i] - 1) *
1632  MathUtils::pow(tau - 1.222, _J1[i] - 1);
1633 
1634  return dg;
1635 }
1636 
1637 template <typename T>
1638 T
1639 Water97FluidProperties::gamma2(const T & pi, const T & tau) const
1640 {
1641  // Ideal gas part of the Gibbs free energy
1642  T sum0 = 0.0;
1643  for (std::size_t i = 0; i < _n02.size(); ++i)
1644  sum0 += _n02[i] * MathUtils::pow(tau, _J02[i]);
1645 
1646  T g0 = std::log(pi) + sum0;
1647 
1648  // Residual part of the Gibbs free energy
1649  T gr = 0.0;
1650  for (std::size_t i = 0; i < _n2.size(); ++i)
1651  gr += _n2[i] * MathUtils::pow(pi, _I2[i]) * MathUtils::pow(tau - 0.5, _J2[i]);
1652 
1653  return g0 + gr;
1654 }
1655 
1656 template <typename T>
1657 T
1658 Water97FluidProperties::d2gamma2_dpi2(const T & pi, const T & tau) const
1659 {
1660  // Ideal gas part of the Gibbs free energy
1661  T dg0 = -1.0 / pi / pi;
1662 
1663  // Residual part of the Gibbs free energy
1664  T dgr = 0.0;
1665  for (std::size_t i = 0; i < _n2.size(); ++i)
1666  dgr += _n2[i] * _I2[i] * (_I2[i] - 1) * MathUtils::pow(pi, _I2[i] - 2) *
1667  MathUtils::pow(tau - 0.5, _J2[i]);
1668 
1669  return dg0 + dgr;
1670 }
1671 
1672 template <typename T>
1673 T
1674 Water97FluidProperties::dgamma2_dtau(const T & pi, const T & tau) const
1675 {
1676  // Ideal gas part of the Gibbs free energy
1677  T dg0 = 0.0;
1678  for (std::size_t i = 0; i < _n02.size(); ++i)
1679  dg0 += _n02[i] * _J02[i] * MathUtils::pow(tau, _J02[i] - 1);
1680 
1681  // Residual part of the Gibbs free energy
1682  T dgr = 0.0;
1683  for (std::size_t i = 0; i < _n2.size(); ++i)
1684  dgr += _n2[i] * _J2[i] * MathUtils::pow(pi, _I2[i]) * MathUtils::pow(tau - 0.5, _J2[i] - 1);
1685 
1686  return dg0 + dgr;
1687 }
1688 
1689 template <typename T>
1690 T
1691 Water97FluidProperties::d2gamma2_dtau2(const T & pi, const T & tau) const
1692 {
1693  // Ideal gas part of the Gibbs free energy
1694  T dg0 = 0.0;
1695  for (std::size_t i = 0; i < _n02.size(); ++i)
1696  dg0 += _n02[i] * _J02[i] * (_J02[i] - 1) * MathUtils::pow(tau, _J02[i] - 2);
1697 
1698  // Residual part of the Gibbs free energy
1699  T dgr = 0.0;
1700  for (std::size_t i = 0; i < _n2.size(); ++i)
1701  dgr += _n2[i] * _J2[i] * (_J2[i] - 1) * MathUtils::pow(pi, _I2[i]) *
1702  MathUtils::pow(tau - 0.5, _J2[i] - 2);
1703 
1704  return dg0 + dgr;
1705 }
1706 
1707 template <typename T>
1708 T
1709 Water97FluidProperties::d2gamma2_dpitau(const T & pi, const T & tau) const
1710 {
1711  // Ideal gas part of the Gibbs free energy
1712  T dg0 = 0.0;
1713 
1714  // Residual part of the Gibbs free energy
1715  T dgr = 0.0;
1716  for (std::size_t i = 0; i < _n2.size(); ++i)
1717  dgr += _n2[i] * _I2[i] * _J2[i] * MathUtils::pow(pi, _I2[i] - 1) *
1718  MathUtils::pow(tau - 0.5, _J2[i] - 1);
1719 
1720  return dg0 + dgr;
1721 }
1722 
1723 template <typename T>
1724 T
1725 Water97FluidProperties::phi3(const T & delta, const T & tau) const
1726 {
1727  T sum = 0.0;
1728  for (std::size_t i = 1; i < _n3.size(); ++i)
1729  sum += _n3[i] * MathUtils::pow(delta, _I3[i]) * MathUtils::pow(tau, _J3[i]);
1730 
1731  return _n3[0] * std::log(delta) + sum;
1732 }
1733 
1734 template <typename T>
1735 T
1736 Water97FluidProperties::dphi3_ddelta(const T & delta, const T & tau) const
1737 {
1738  T sum = 0.0;
1739  for (std::size_t i = 1; i < _n3.size(); ++i)
1740  sum += _n3[i] * _I3[i] * MathUtils::pow(delta, _I3[i] - 1) * MathUtils::pow(tau, _J3[i]);
1741 
1742  return _n3[0] / delta + sum;
1743 }
1744 
1745 template <typename T>
1746 T
1747 Water97FluidProperties::d2phi3_ddelta2(const T & delta, const T & tau) const
1748 {
1749  T sum = 0.0;
1750  for (std::size_t i = 1; i < _n3.size(); ++i)
1751  sum += _n3[i] * _I3[i] * (_I3[i] - 1) * MathUtils::pow(delta, _I3[i] - 2) *
1752  MathUtils::pow(tau, _J3[i]);
1753 
1754  return -_n3[0] / delta / delta + sum;
1755 }
1756 
1757 template <typename T>
1758 T
1759 Water97FluidProperties::dphi3_dtau(const T & delta, const T & tau) const
1760 {
1761  T sum = 0.0;
1762  for (std::size_t i = 1; i < _n3.size(); ++i)
1763  sum += _n3[i] * _J3[i] * MathUtils::pow(delta, _I3[i]) * MathUtils::pow(tau, _J3[i] - 1);
1764 
1765  return sum;
1766 }
1767 
1768 template <typename T>
1769 T
1770 Water97FluidProperties::d2phi3_dtau2(const T & delta, const T & tau) const
1771 {
1772  T sum = 0.0;
1773  for (std::size_t i = 1; i < _n3.size(); ++i)
1774  sum += _n3[i] * _J3[i] * (_J3[i] - 1) * MathUtils::pow(delta, _I3[i]) *
1775  MathUtils::pow(tau, _J3[i] - 2);
1776 
1777  return sum;
1778 }
1779 
1780 template <typename T>
1781 T
1782 Water97FluidProperties::d2phi3_ddeltatau(const T & delta, const T & tau) const
1783 {
1784  T sum = 0.0;
1785  for (std::size_t i = 1; i < _n3.size(); ++i)
1786  sum += _n3[i] * _I3[i] * _J3[i] * MathUtils::pow(delta, _I3[i] - 1) *
1787  MathUtils::pow(tau, _J3[i] - 1);
1788 
1789  return sum;
1790 }
1791 
1792 template <typename T>
1793 T
1794 Water97FluidProperties::gamma5(const T & pi, const T & tau) const
1795 {
1796  // Ideal gas part of the Gibbs free energy
1797  T sum0 = 0.0;
1798  for (std::size_t i = 0; i < _n05.size(); ++i)
1799  sum0 += _n05[i] * MathUtils::pow(tau, _J05[i]);
1800 
1801  T g0 = std::log(pi) + sum0;
1802 
1803  // Residual part of the Gibbs free energy
1804  T gr = 0.0;
1805  for (std::size_t i = 0; i < _n5.size(); ++i)
1806  gr += _n5[i] * MathUtils::pow(pi, _I5[i]) * MathUtils::pow(tau, _J5[i]);
1807 
1808  return g0 + gr;
1809 }
1810 
1811 template <typename T>
1812 T
1813 Water97FluidProperties::dgamma5_dpi(const T & pi, const T & tau) const
1814 {
1815  // Ideal gas part of the Gibbs free energy
1816  T dg0 = 1.0 / pi;
1817 
1818  // Residual part of the Gibbs free energy
1819  T dgr = 0.0;
1820  for (std::size_t i = 0; i < _n5.size(); ++i)
1821  dgr += _n5[i] * _I5[i] * MathUtils::pow(pi, _I5[i] - 1) * MathUtils::pow(tau, _J5[i]);
1822 
1823  return dg0 + dgr;
1824 }
1825 
1826 template <typename T>
1827 T
1828 Water97FluidProperties::d2gamma5_dpi2(const T & pi, const T & tau) const
1829 {
1830  // Ideal gas part of the Gibbs free energy
1831  T dg0 = -1.0 / pi / pi;
1832 
1833  // Residual part of the Gibbs free energy
1834  T dgr = 0.0;
1835  for (std::size_t i = 0; i < _n5.size(); ++i)
1836  dgr += _n5[i] * _I5[i] * (_I5[i] - 1) * MathUtils::pow(pi, _I5[i] - 2) *
1837  MathUtils::pow(tau, _J5[i]);
1838 
1839  return dg0 + dgr;
1840 }
1841 
1842 template <typename T>
1843 T
1844 Water97FluidProperties::dgamma5_dtau(const T & pi, const T & tau) const
1845 {
1846  // Ideal gas part of the Gibbs free energy
1847  T dg0 = 0.0;
1848  for (std::size_t i = 0; i < _n05.size(); ++i)
1849  dg0 += _n05[i] * _J05[i] * MathUtils::pow(tau, _J05[i] - 1);
1850 
1851  // Residual part of the Gibbs free energy
1852  T dgr = 0.0;
1853  for (std::size_t i = 0; i < _n5.size(); ++i)
1854  dgr += _n5[i] * _J5[i] * MathUtils::pow(pi, _I5[i]) * MathUtils::pow(tau, _J5[i] - 1);
1855 
1856  return dg0 + dgr;
1857 }
1858 
1859 template <typename T>
1860 T
1861 Water97FluidProperties::d2gamma5_dtau2(const T & pi, const T & tau) const
1862 {
1863  // Ideal gas part of the Gibbs free energy
1864  T dg0 = 0.0;
1865  for (std::size_t i = 0; i < _n05.size(); ++i)
1866  dg0 += _n05[i] * _J05[i] * (_J05[i] - 1) * MathUtils::pow(tau, _J05[i] - 2);
1867 
1868  // Residual part of the Gibbs free energy
1869  T dgr = 0.0;
1870  for (std::size_t i = 0; i < _n5.size(); ++i)
1871  dgr += _n5[i] * _J5[i] * (_J5[i] - 1) * MathUtils::pow(pi, _I5[i]) *
1872  MathUtils::pow(tau, _J5[i] - 2);
1873 
1874  return dg0 + dgr;
1875 }
1876 
1877 template <typename T>
1878 T
1879 Water97FluidProperties::d2gamma5_dpitau(const T & pi, const T & tau) const
1880 {
1881  // Ideal gas part of the Gibbs free energy
1882  T dg0 = 0.0;
1883 
1884  // Residual part of the Gibbs free energy
1885  T dgr = 0.0;
1886  for (std::size_t i = 0; i < _n5.size(); ++i)
1887  dgr +=
1888  _n5[i] * _I5[i] * _J5[i] * MathUtils::pow(pi, _I5[i] - 1) * MathUtils::pow(tau, _J5[i] - 1);
1889 
1890  return dg0 + dgr;
1891 }
1892 
1893 template <typename T>
1894 T
1896 {
1897  T pi = pressure / 1.0e6;
1898 
1899  // Choose the constants based on the string xy
1900  unsigned int row;
1901 
1902  switch (xy)
1903  {
1904  case AB:
1905  row = 0;
1906  break;
1907  case CD:
1908  row = 1;
1909  break;
1910  case GH:
1911  row = 2;
1912  break;
1913  case IJ:
1914  row = 3;
1915  break;
1916  case JK:
1917  row = 4;
1918  break;
1919  case MN:
1920  row = 5;
1921  break;
1922  case OP:
1923  row = 6;
1924  break;
1925  case QU:
1926  row = 7;
1927  break;
1928  case RX:
1929  row = 8;
1930  break;
1931  case UV:
1932  row = 9;
1933  break;
1934  case WX:
1935  row = 10;
1936  break;
1937  default:
1938  row = 0;
1939  }
1940 
1941  T sum = 0.0;
1942 
1943  if (xy == AB || xy == OP || xy == WX)
1944  for (std::size_t i = 0; i < _tempXY_n[row].size(); ++i)
1945  sum += _tempXY_n[row][i] * MathUtils::pow(std::log(pi), _tempXY_I[row][i]);
1946  else if (xy == EF)
1947  sum += 3.727888004 * (pi - _p_critical / 1.0e6) + _T_critical;
1948  else
1949  for (std::size_t i = 0; i < _tempXY_n[row].size(); ++i)
1950  sum += _tempXY_n[row][i] * MathUtils::pow(pi, _tempXY_I[row][i]);
1951 
1952  return sum;
1953 }
1954 
1955 template <typename T>
1956 void
1957 Water97FluidProperties::vaporPressureTemplate(const T & temperature, T & psat, T & dpsat_dT) const
1958 {
1959  // Check whether the input temperature is within the region of validity of this equation.
1960  // Valid for 273.15 K <= t <= 647.096 K
1961  if (temperature < 273.15 || temperature > _T_critical)
1962  mooseException(name(),
1963  ": vaporPressure(): Temperature is outside range 273.15 K <= T <= 647.096 K");
1964 
1965  T theta, dtheta_dT, theta2, a, b, c, da_dtheta, db_dtheta, dc_dtheta;
1966  theta = temperature + _n4[8] / (temperature - _n4[9]);
1967  dtheta_dT = 1.0 - _n4[8] / (temperature - _n4[9]) / (temperature - _n4[9]);
1968  theta2 = theta * theta;
1969 
1970  a = theta2 + _n4[0] * theta + _n4[1];
1971  b = _n4[2] * theta2 + _n4[3] * theta + _n4[4];
1972  c = _n4[5] * theta2 + _n4[6] * theta + _n4[7];
1973 
1974  da_dtheta = 2.0 * theta + _n4[0];
1975  db_dtheta = 2.0 * _n4[2] * theta + _n4[3];
1976  dc_dtheta = 2.0 * _n4[5] * theta + _n4[6];
1977 
1978  T denominator = -b + std::sqrt(b * b - 4.0 * a * c);
1979 
1980  psat = Utility::pow<4>(2.0 * c / denominator) * 1.0e6;
1981 
1982  // The derivative wrt temperature is given by the chain rule
1983  T dpsat = 4.0 * Utility::pow<3>(2.0 * c / denominator);
1984  dpsat *= (2.0 * dc_dtheta / denominator -
1985  2.0 * c / denominator / denominator *
1986  (-db_dtheta + std::pow(b * b - 4.0 * a * c, -0.5) *
1987  (b * db_dtheta - 2.0 * da_dtheta * c - 2.0 * a * dc_dtheta)));
1988  dpsat_dT = dpsat * dtheta_dT * 1.0e6;
1989 }
1990 
1991 inline void
1992 Water97FluidProperties::vaporPressure(const Real temperature, Real & psat, Real & dpsat_dT) const
1993 {
1994  vaporPressureTemplate(temperature, psat, dpsat_dT);
1995 }
1996 
1997 template <typename T>
1998 void
2000  const T & pressure, const T & temperature, T & rho, T & drho_dp, T & drho_dT) const
2001 {
2002  auto functor = [this](const auto & pressure, const auto & temperature)
2003  { return this->rho_from_p_T_template(pressure, temperature); };
2004 
2005  xyDerivatives(pressure, temperature, rho, drho_dp, drho_dT, functor);
2006 }
2007 
2008 template <typename T>
2009 T
2011 {
2013 }
2014 
2015 template <typename T>
2016 void
2018  const T & pressure, const T & temperature, T & v, T & dv_dp, T & dv_dT) const
2019 {
2020  auto functor = [this](const auto & pressure, const auto & temperature)
2021  { return this->v_from_p_T_template(pressure, temperature); };
2022 
2023  xyDerivatives(pressure, temperature, v, dv_dp, dv_dT, functor);
2024 }
2025 
2026 template <typename T>
2027 T
2029 {
2030  T internal_energy, pi, tau;
2031 
2032  // Determine which region the point is in
2033  unsigned int region =
2035  switch (region)
2036  {
2037  case 1:
2038  pi = pressure / _p_star[0];
2039  tau = _T_star[0] / temperature;
2040  internal_energy =
2041  _Rw * temperature * (tau * dgamma1_dtau(pi, tau) - pi * dgamma1_dpi(pi, tau));
2042  break;
2043 
2044  case 2:
2045  pi = pressure / _p_star[1];
2046  tau = _T_star[1] / temperature;
2047  internal_energy =
2048  _Rw * temperature * (tau * dgamma2_dtau(pi, tau) - pi * dgamma2_dpi(pi, tau));
2049  break;
2050 
2051  case 3:
2052  {
2053  // Calculate density first, then use that in Helmholtz free energy
2054  T density3 = densityRegion3(pressure, temperature);
2055  T delta = density3 / _rho_critical;
2056  tau = _T_star[2] / temperature;
2057  internal_energy = _Rw * temperature * tau * dphi3_dtau(delta, tau);
2058  break;
2059  }
2060 
2061  case 5:
2062  pi = pressure / _p_star[4];
2063  tau = _T_star[4] / temperature;
2064  internal_energy =
2065  _Rw * temperature * (tau * dgamma5_dtau(pi, tau) - pi * dgamma5_dpi(pi, tau));
2066  break;
2067 
2068  default:
2069  mooseError("inRegion() has given an incorrect region");
2070  }
2071  // Output in J/kg
2072  return internal_energy;
2073 }
2074 
2075 template <typename T>
2076 void
2078  const T & pressure, const T & temperature, T & e, T & de_dp, T & de_dT) const
2079 {
2080  T pi, tau, dinternal_energy_dp, dinternal_energy_dT;
2081 
2082  // Determine which region the point is in
2083  unsigned int region =
2085  switch (region)
2086  {
2087  case 1:
2088  {
2089  pi = pressure / _p_star[0];
2090  tau = _T_star[0] / temperature;
2091  T dgdp = dgamma1_dpi(pi, tau);
2092  T d2gdpt = d2gamma1_dpitau(pi, tau);
2093  dinternal_energy_dp =
2094  _Rw * temperature * (tau * d2gdpt - dgdp - pi * d2gamma1_dpi2(pi, tau)) / _p_star[0];
2095  dinternal_energy_dT =
2096  _Rw * (pi * tau * d2gdpt - tau * tau * d2gamma1_dtau2(pi, tau) - pi * dgdp);
2097  break;
2098  }
2099 
2100  case 2:
2101  {
2102  pi = pressure / _p_star[1];
2103  tau = _T_star[1] / temperature;
2104  T dgdp = dgamma2_dpi(pi, tau);
2105  T d2gdpt = d2gamma2_dpitau(pi, tau);
2106  dinternal_energy_dp =
2107  _Rw * temperature * (tau * d2gdpt - dgdp - pi * d2gamma2_dpi2(pi, tau)) / _p_star[1];
2108  dinternal_energy_dT =
2109  _Rw * (pi * tau * d2gdpt - tau * tau * d2gamma2_dtau2(pi, tau) - pi * dgdp);
2110  break;
2111  }
2112 
2113  case 3:
2114  {
2115  // Calculate density first, then use that in Helmholtz free energy
2116  T density3 = densityRegion3(pressure, temperature);
2117  T delta = density3 / _rho_critical;
2118  tau = _T_star[2] / temperature;
2119  T dpdd = dphi3_ddelta(delta, tau);
2120  T d2pddt = d2phi3_ddeltatau(delta, tau);
2121  T d2pdd2 = d2phi3_ddelta2(delta, tau);
2122  dinternal_energy_dp =
2123  _T_star[2] * d2pddt / _rho_critical /
2124  (2.0 * temperature * delta * dpdd + temperature * delta * delta * d2pdd2);
2125  dinternal_energy_dT =
2126  -_Rw * (delta * tau * d2pddt * (dpdd - tau * d2pddt) / (2.0 * dpdd + delta * d2pdd2) +
2127  tau * tau * d2phi3_dtau2(delta, tau));
2128  break;
2129  }
2130 
2131  case 5:
2132  {
2133  pi = pressure / _p_star[4];
2134  tau = _T_star[4] / temperature;
2135  T dgdp = dgamma5_dpi(pi, tau);
2136  T d2gdpt = d2gamma5_dpitau(pi, tau);
2137  dinternal_energy_dp =
2138  _Rw * temperature * (tau * d2gdpt - dgdp - pi * d2gamma5_dpi2(pi, tau)) / _p_star[4];
2139  dinternal_energy_dT =
2140  _Rw * (pi * tau * d2gdpt - tau * tau * d2gamma5_dtau2(pi, tau) - pi * dgdp);
2141  break;
2142  }
2143 
2144  default:
2145  mooseError("inRegion has given an incorrect region");
2146  }
2147 
2148  e = this->e_from_p_T(pressure, temperature);
2149  de_dp = dinternal_energy_dp;
2150  de_dT = dinternal_energy_dT;
2151 }
2152 
2153 template <typename T>
2154 T
2156  const T & pi, const T & theta, Real a, Real b, Real c, Real d, Real e, unsigned int sid) const
2157 {
2158  T sum = 0.0;
2159 
2160  for (std::size_t i = 0; i < _n3s[sid].size(); ++i)
2161  sum += _n3s[sid][i] * MathUtils::pow(std::pow(pi - a, c), _I3s[sid][i]) *
2162  MathUtils::pow(std::pow(theta - b, d), _J3s[sid][i]);
2163 
2164  return std::pow(sum, e);
2165 }
2166 
2167 template <typename T>
2168 std::pair<T, T>
2169 Water97FluidProperties::T_drhodT_from_p_rho(const T & p, const T & rho) const
2170 {
2171  // For NewtonSolve
2172  // y = rho
2173  // x = p
2174  // z = T
2175  auto lambda =
2176  [this](const T & p, const T & temperature, T & rho, T & drho_dp, T & drho_dtemperature)
2177  { rho_from_p_T_template(p, temperature, rho, drho_dp, drho_dtemperature); };
2179  p, rho, _T_initial_guess, _tolerance, lambda, name() + "::T_drhodT_from_p_rho");
2180 }
2181 
2182 template <typename T>
2183 std::pair<T, T>
2184 Water97FluidProperties::p_T_from_v_e(const T & v, const T & e) const
2185 {
2186  const auto rho = 1 / v;
2187  const auto p = p_from_v_e(v, e);
2188  return {p, T_drhodT_from_p_rho(p, rho).first};
2189 }
2190 
2191 template <typename T>
2192 std::pair<T, T>
2193 Water97FluidProperties::rho_T_from_v_e(const T & v, const T & e) const
2194 {
2195  const auto rho = 1 / v;
2196  const auto p = p_from_v_e(v, e);
2197  return {rho, T_drhodT_from_p_rho(p, rho).first};
2198 }
2199 
2200 template <typename T>
2201 T
2203 {
2204  T speed2, pi, tau, delta;
2205 
2206  // Determine which region the point is in
2207  unsigned int region =
2209  switch (region)
2210  {
2211  case 1:
2212  pi = pressure / _p_star[0];
2213  tau = _T_star[0] / temperature;
2214  speed2 = _Rw * temperature * Utility::pow<2>(dgamma1_dpi(pi, tau)) /
2215  (Utility::pow<2>(dgamma1_dpi(pi, tau) - tau * d2gamma1_dpitau(pi, tau)) /
2216  (tau * tau * d2gamma1_dtau2(pi, tau)) -
2217  d2gamma1_dpi2(pi, tau));
2218  break;
2219 
2220  case 2:
2221  pi = pressure / _p_star[1];
2222  tau = _T_star[1] / temperature;
2223  speed2 = _Rw * temperature * Utility::pow<2>(pi * dgamma2_dpi(pi, tau)) /
2224  ((-pi * pi * d2gamma2_dpi2(pi, tau)) +
2225  Utility::pow<2>(pi * dgamma2_dpi(pi, tau) - tau * pi * d2gamma2_dpitau(pi, tau)) /
2226  (tau * tau * d2gamma2_dtau2(pi, tau)));
2227  break;
2228 
2229  case 3:
2230  {
2231  // Calculate density first, then use that in Helmholtz free energy
2232  T density3 = densityRegion3(pressure, temperature);
2233  delta = density3 / _rho_critical;
2234  tau = _T_star[2] / temperature;
2235  speed2 =
2236  _Rw * temperature *
2237  (2.0 * delta * dphi3_ddelta(delta, tau) + delta * delta * d2phi3_ddelta2(delta, tau) -
2238  Utility::pow<2>(delta * dphi3_ddelta(delta, tau) -
2239  delta * tau * d2phi3_ddeltatau(delta, tau)) /
2240  (tau * tau * d2phi3_dtau2(delta, tau)));
2241  break;
2242  }
2243 
2244  case 5:
2245  pi = pressure / _p_star[4];
2246  tau = _T_star[4] / temperature;
2247  speed2 = _Rw * temperature * Utility::pow<2>(pi * dgamma5_dpi(pi, tau)) /
2248  ((-pi * pi * d2gamma5_dpi2(pi, tau)) +
2249  Utility::pow<2>(pi * dgamma5_dpi(pi, tau) - tau * pi * d2gamma5_dpitau(pi, tau)) /
2250  (tau * tau * d2gamma5_dtau2(pi, tau)));
2251  break;
2252 
2253  default:
2254  mooseError("inRegion() has given an incorrect region");
2255  }
2256 
2257  return std::sqrt(speed2);
2258 }
2259 
2260 template <typename T>
2261 T
2263 {
2264  T specific_heat, pi, tau, delta;
2265 
2266  // Determine which region the point is in
2267  unsigned int region =
2269  switch (region)
2270  {
2271  case 1:
2272  pi = pressure / _p_star[0];
2273  tau = _T_star[0] / temperature;
2274  specific_heat = -_Rw * tau * tau * d2gamma1_dtau2(pi, tau);
2275  break;
2276 
2277  case 2:
2278  pi = pressure / _p_star[1];
2279  tau = _T_star[1] / temperature;
2280  specific_heat = -_Rw * tau * tau * d2gamma2_dtau2(pi, tau);
2281  break;
2282 
2283  case 3:
2284  {
2285  // Calculate density first, then use that in Helmholtz free energy
2286  T density3 = densityRegion3(pressure, temperature);
2287  delta = density3 / _rho_critical;
2288  tau = _T_star[2] / temperature;
2289  specific_heat =
2290  _Rw *
2291  (-tau * tau * d2phi3_dtau2(delta, tau) +
2292  (delta * dphi3_ddelta(delta, tau) - delta * tau * d2phi3_ddeltatau(delta, tau)) *
2293  (delta * dphi3_ddelta(delta, tau) - delta * tau * d2phi3_ddeltatau(delta, tau)) /
2294  (2.0 * delta * dphi3_ddelta(delta, tau) +
2295  delta * delta * d2phi3_ddelta2(delta, tau)));
2296  break;
2297  }
2298 
2299  case 5:
2300  pi = pressure / _p_star[4];
2301  tau = _T_star[4] / temperature;
2302  specific_heat = -_Rw * tau * tau * d2gamma5_dtau2(pi, tau);
2303  break;
2304 
2305  default:
2306  mooseError("inRegion() has given an incorrect region");
2307  }
2308  return specific_heat;
2309 }
2310 
2311 template <typename T>
2312 T
2314 {
2315  T specific_heat, pi, tau, delta;
2316 
2317  // Determine which region the point is in
2318  unsigned int region =
2320  switch (region)
2321  {
2322  case 1:
2323  pi = pressure / _p_star[0];
2324  tau = _T_star[0] / temperature;
2325  specific_heat =
2326  _Rw * (-tau * tau * d2gamma1_dtau2(pi, tau) +
2327  Utility::pow<2>(dgamma1_dpi(pi, tau) - tau * d2gamma1_dpitau(pi, tau)) /
2328  d2gamma1_dpi2(pi, tau));
2329  break;
2330 
2331  case 2:
2332  pi = pressure / _p_star[1];
2333  tau = _T_star[1] / temperature;
2334  specific_heat =
2335  _Rw * (-tau * tau * d2gamma2_dtau2(pi, tau) +
2336  Utility::pow<2>(dgamma2_dpi(pi, tau) - tau * d2gamma2_dpitau(pi, tau)) /
2337  d2gamma2_dpi2(pi, tau));
2338  break;
2339 
2340  case 3:
2341  {
2342  // Calculate density first, then use that in Helmholtz free energy
2343  T density3 = densityRegion3(pressure, temperature);
2344  delta = density3 / _rho_critical;
2345  tau = _T_star[2] / temperature;
2346  specific_heat = _Rw * (-tau * tau * d2phi3_dtau2(delta, tau));
2347  break;
2348  }
2349 
2350  case 5:
2351  pi = pressure / _p_star[4];
2352  tau = _T_star[4] / temperature;
2353  specific_heat =
2354  _Rw * (-tau * tau * d2gamma5_dtau2(pi, tau) +
2355  Utility::pow<2>(dgamma5_dpi(pi, tau) - tau * d2gamma5_dpitau(pi, tau)) /
2356  d2gamma5_dpi2(pi, tau));
2357  break;
2358 
2359  default:
2360  mooseError("inRegion() has given an incorrect region");
2361  }
2362  return specific_heat;
2363 }
2364 
2365 template <typename T>
2366 T
2368 {
2369  // Scale the density and temperature. Note that the scales are slightly
2370  // different to the critical values used in IAPWS-IF97
2371  T Tbar = temperature / 647.26;
2372  T rhobar = density / 317.7;
2373 
2374  // Ideal gas component
2375  T sum0 = 0.0;
2376 
2377  for (std::size_t i = 0; i < _k_a.size(); ++i)
2378  sum0 += _k_a[i] * MathUtils::pow(Tbar, i);
2379 
2380  T lambda0 = std::sqrt(Tbar) * sum0;
2381 
2382  // The contribution due to finite density
2383  T lambda1 = -0.39707 + 0.400302 * rhobar +
2384  1.06 * std::exp(-0.171587 * Utility::pow<2>(rhobar + 2.392190));
2385 
2386  // Critical enhancement
2387  T DeltaT = std::abs(Tbar - 1.0) + 0.00308976;
2388  T Q = 2.0 + 0.0822994 / std::pow(DeltaT, 0.6);
2389  T S = (Tbar >= 1.0 ? 1.0 / DeltaT : 10.0932 / std::pow(DeltaT, 0.6));
2390 
2391  T lambda2 = (0.0701309 / Utility::pow<10>(Tbar) + 0.011852) * std::pow(rhobar, 1.8) *
2392  std::exp(0.642857 * (1.0 - std::pow(rhobar, 2.8))) +
2393  0.00169937 * S * std::pow(rhobar, Q) *
2394  std::exp((Q / (1.0 + Q)) * (1.0 - std::pow(rhobar, 1.0 + Q))) -
2395  1.02 * std::exp(-4.11717 * std::pow(Tbar, 1.5) - 6.17937 / Utility::pow<5>(rhobar));
2396 
2397  return lambda0 + lambda1 + lambda2;
2398 }
2399 
2400 template <typename T>
2401 T
2403 {
2404  T rho = this->rho_from_p_T(pressure, temperature);
2405  return this->k_from_rho_T_template(rho, temperature);
2406 }
2407 
2408 template <typename T>
2409 T
2410 Water97FluidProperties::k_from_v_e_template(const T & v, const T & e) const
2411 {
2412  const auto [p, temperature] = p_T_from_v_e(v, e);
2414 }
2415 
2416 template <typename T>
2417 T
2418 Water97FluidProperties::p_from_v_e_template(const T & v, const T & e) const
2419 {
2420  const auto rho = 1 / v;
2421  // For NewtonSolve
2422  // y = e
2423  // x = rho
2424  // z = p
2425  auto lambda = [this](const T & rho, const T & p, T & e, T & de_drho, T & de_dp)
2426  { e_from_p_rho(p, rho, e, de_dp, de_drho); };
2428  rho, e, _p_initial_guess, _tolerance, lambda, name() + "::p_from_v_e")
2429  .first;
2430 }
2431 
2432 template <typename T>
2433 T
2434 Water97FluidProperties::e_from_p_rho_template(const T & p, const T & rho) const
2435 {
2436  const auto temperature = T_drhodT_from_p_rho(p, rho).first;
2438 }
2439 
2440 template <typename T>
2441 void
2443  const T & p, const T & rho, T & e, T & de_dp, T & de_drho) const
2444 {
2445  auto functor = [this](const auto & p, const auto & rho)
2446  { return this->e_from_p_rho_template(p, rho); };
2447 
2448  xyDerivatives(p, rho, e, de_dp, de_drho, functor);
2449 }
2450 
2451 template <typename T>
2452 T
2454 {
2455  const T mu_star = 1.e-6;
2456  const T rhobar = density / _rho_critical;
2457  const T Tbar = temperature / _T_critical;
2458 
2459  // Viscosity in limit of zero density
2460  T sum0 = 0.0;
2461  for (std::size_t i = 0; i < _mu_H0.size(); ++i)
2462  sum0 += _mu_H0[i] / MathUtils::pow(Tbar, i);
2463 
2464  const T mu0 = 100.0 * std::sqrt(Tbar) / sum0;
2465 
2466  // Residual component due to finite density
2467  T sum1 = 0.0;
2468  for (unsigned int i = 0; i < 6; ++i)
2469  {
2470  const T fact = MathUtils::pow(1.0 / Tbar - 1.0, i);
2471  for (unsigned int j = 0; j < 7; ++j)
2472  sum1 += fact * _mu_Hij[i][j] * MathUtils::pow(rhobar - 1.0, j);
2473  }
2474 
2475  const T mu1 = std::exp(rhobar * sum1);
2476 
2477  // The water viscosity (in Pa.s) is then given by
2478  return mu_star * mu0 * mu1;
2479 }
2480 
2481 template <typename T>
2482 std::pair<T, T>
2483 Water97FluidProperties::p_T_from_v_h(const T & v, const T & h) const
2484 {
2486  bool conversion_succeeded;
2487  p_T_from_v_h(
2488  v, h, _p_initial_guess, _T_initial_guess, pressure, temperature, conversion_succeeded);
2489  return {std::move(pressure), std::move(temperature)};
2490 }
2491 
2492 template <typename T>
2493 T
2495 {
2496  T enthalpy, pi, tau, delta;
2497 
2498  // Determine which region the point is in
2499  unsigned int region =
2501  switch (region)
2502  {
2503  case 1:
2504  pi = pressure / _p_star[0];
2505  tau = _T_star[0] / temperature;
2506  enthalpy = _Rw * _T_star[0] * dgamma1_dtau(pi, tau);
2507  break;
2508 
2509  case 2:
2510  pi = pressure / _p_star[1];
2511  tau = _T_star[1] / temperature;
2512  enthalpy = _Rw * _T_star[1] * dgamma2_dtau(pi, tau);
2513  break;
2514 
2515  case 3:
2516  {
2517  // Calculate density first, then use that in Helmholtz free energy
2518  T density3 = densityRegion3(pressure, temperature);
2519  delta = density3 / _rho_critical;
2520  tau = _T_star[2] / temperature;
2521  enthalpy =
2522  _Rw * temperature * (tau * dphi3_dtau(delta, tau) + delta * dphi3_ddelta(delta, tau));
2523  break;
2524  }
2525 
2526  case 5:
2527  pi = pressure / _p_star[4];
2528  tau = _T_star[4] / temperature;
2529  enthalpy = _Rw * _T_star[4] * dgamma5_dtau(pi, tau);
2530  break;
2531 
2532  default:
2533  mooseError("Water97FluidProperties::inRegion has given an incorrect region");
2534  }
2535  return enthalpy;
2536 }
2537 
2538 template <typename T>
2539 void
2541  const T & pressure, const T & temperature, T & h, T & dh_dp, T & dh_dT) const
2542 {
2543  auto functor = [this](const auto & pressure, const auto & temperature)
2544  { return this->h_from_p_T_template(pressure, temperature); };
2545 
2546  xyDerivatives(pressure, temperature, h, dh_dp, dh_dT, functor);
2547 }
2548 
2549 template <typename T>
2550 T
2552 {
2553  T density, pi, tau;
2554 
2555  // Determine which region the point is in
2556  unsigned int region =
2558 
2559  switch (region)
2560  {
2561  case 1:
2562  pi = pressure / _p_star[0];
2563  tau = _T_star[0] / temperature;
2564  density = pressure / (pi * _Rw * temperature * dgamma1_dpi(pi, tau));
2565  break;
2566 
2567  case 2:
2568  pi = pressure / _p_star[1];
2569  tau = _T_star[1] / temperature;
2570  density = pressure / (pi * _Rw * temperature * dgamma2_dpi(pi, tau));
2571  break;
2572 
2573  case 3:
2575  break;
2576 
2577  case 5:
2578  pi = pressure / _p_star[4];
2579  tau = _T_star[4] / temperature;
2580  density = pressure / (pi * _Rw * temperature * dgamma5_dpi(pi, tau));
2581  break;
2582 
2583  default:
2584  mooseError("inRegion() has given an incorrect region");
2585  }
2586  return density;
2587 }
2588 
2589 template <typename T>
2590 T
2592 {
2593  T rho = this->rho_from_p_T_template(pressure, temperature);
2594  return this->mu_from_rho_T_template(rho, temperature);
2595 }
2596 
2597 template <typename T>
2598 T
2599 Water97FluidProperties::s_from_p_T_template(const T & pressure, const T & temperature) const
2600 {
2601  T entropy, pi, tau, density3, delta;
2602 
2603  // Determine which region the point is in
2604  unsigned int region =
2606  switch (region)
2607  {
2608  case 1:
2609  pi = pressure / _p_star[0];
2610  tau = _T_star[0] / temperature;
2611  entropy = _Rw * (tau * dgamma1_dtau(pi, tau) - gamma1(pi, tau));
2612  break;
2613 
2614  case 2:
2615  pi = pressure / _p_star[1];
2616  tau = _T_star[1] / temperature;
2617  entropy = _Rw * (tau * dgamma2_dtau(pi, tau) - gamma2(pi, tau));
2618  break;
2619 
2620  case 3:
2621  // Calculate density first, then use that in Helmholtz free energy
2622  density3 = densityRegion3(pressure, temperature);
2623  delta = density3 / _rho_critical;
2624  tau = _T_star[2] / temperature;
2625  entropy = _Rw * (tau * dphi3_dtau(delta, tau) - phi3(delta, tau));
2626  break;
2627 
2628  case 5:
2629  pi = pressure / _p_star[4];
2630  tau = _T_star[4] / temperature;
2631  entropy = _Rw * (tau * dgamma5_dtau(pi, tau) - gamma5(pi, tau));
2632  break;
2633 
2634  default:
2635  mooseError("inRegion() has given an incorrect region");
2636  }
2637  return entropy;
2638 }
2639 
2640 template <typename T>
2641 void
2642 Water97FluidProperties::s_from_p_T_template(
2643  const T & pressure, const T & temperature, T & s, T & ds_dp, T & ds_dT) const
2644 {
2645  auto functor = [this](const auto & pressure, const auto & temperature)
2646  { return this->s_from_p_T_template(pressure, temperature); };
2647 
2648  xyDerivatives(pressure, temperature, s, ds_dp, ds_dT, functor);
2649 }
const std::array< Real, 43 > _n2
T v_from_p_T_template(const T &pressure, const T &temperature) const
const Real _T_critical
Critical temperature (K)
T dgamma2_dtau(const T &pi, const T &tau) const
Derivative of Gibbs free energy in Region 2 wrt tau.
virtual Real mu_from_p_T(Real pressure, Real temperature) const override
T gamma2(const T &pi, const T &tau) const
Gibbs free energy in Region 2 - superheated steam.
T dphi3_dtau(const T &delta, const T &tau) const
Derivative of Helmholtz free energy in Region 3 wrt tau.
static InputParameters validParams()
virtual void rho_mu_from_p_T(Real pressure, Real temperature, Real &rho, Real &mu) const override
Combined methods.
virtual Real triplePointTemperature() const override
Triple point temperature.
void vaporPressureTemplate(const T &temperature, T &psat, T &dpsat_dT) const
const std::array< int, 6 > _I5
unsigned int inRegion(Real pressure, Real temperature) const
Determines the phase region that the given pressure and temperature values lie in.
const std::array< Real, 5 > _n23
Constants for the boundary between regions 2 and 3.
T tempXY(const T &pressure, subregionEnum xy) const
Boundaries between subregions in region 3.
T d2phi3_ddelta2(const T &delta, const T &tau) const
Second derivative of Helmholtz free energy in Region 3 wrt delta.
std::pair< T, T > rho_T_from_v_e(const T &v, const T &e) const
Computes the density (first member of the pair) and temperature (second member of the pair) as functi...
Real vaporTemperature(Real pressure) const override
Saturation temperature as a function of pressure.
void p_T_from_v_h(const T &v, const T &h, Real p0, Real T0, T &pressure, T &temperature, bool &conversion_succeeded) const
Determines (p,T) from (v,h) using Newton Solve in 2D Useful for conversion between different sets of ...
Real p_from_v_e(Real v, Real e) const override
const Real _p_critical
Critical pressure (Pa)
const std::array< int, 33 > _Jph3b
const std::array< std::array< Real, 8 >, 26 > _par3
Real T_from_v_e(Real v, Real e) const override
const std::array< int, 20 > _Iph1
virtual Real e_from_p_T(Real pressure, Real temperature) const override
Real b2bc(Real pressure) const
Boundary between subregions b and c in region 2.
T subregionVolume(const T &pi, const T &theta, Real a, Real b, Real c, Real d, Real e, unsigned int sid) const
Specific volume in all subregions of region 3 EXCEPT subregion n (13).
virtual std::string fluidName() const override
const std::array< int, 23 > _Jph2c
const std::array< Real, 36 > _nph2a
T k_from_v_e_template(const T &v, const T &e) const
T e_from_p_T_template(const T &pressure, const T &temperature) const
propfuncWithDefinitionOverride(s, p, T)
virtual Real criticalDensity() const override
Critical density.
T k_from_p_T_template(const T &pressure, const T &temperature) const
Real b23T(Real pressure) const
Auxillary equation for the boundary between regions 2 and 3.
T d2gamma5_dpitau(const T &pi, const T &tau) const
Second derivative of Gibbs free energy in Region 5 wrt pi and tau.
Water97FluidProperties(const InputParameters &parameters)
virtual ADReal cv_from_v_e(const ADReal &v, const ADReal &e) const override
T dgamma5_dtau(const T &pi, const T &tau) const
Derivative of Gibbs free energy in Region 5 wrt tau.
T c_from_p_T_template(const T &pressure, const T &temperature) const
T d2gamma2_dpitau(const T &pi, const T &tau) const
Second derivative of Gibbs free energy in Region 2 wrt pi and tau.
T rho_from_p_T_template(const T &pressure, const T &temperature) const
DualNumber< Real, DNDerivativeType, true > DualReal
unsigned int subregion3(Real pressure, Real temperature) const
Provides the correct subregion index for a (P,T) point in region 3.
const std::array< int, 36 > _Jph2a
static const std::string density
Definition: NS.h:33
T d2gamma5_dtau2(const T &pi, const T &tau) const
Second derivative of Gibbs free energy in Region 5 wrt tau.
auto raw_value(const Eigen::Map< T > &in)
int delta(unsigned int i, unsigned int j)
Delta function, which returns zero if $i j$ and unity if $i=j$.
FPDualReal temperature_from_ph1(const FPDualReal &pressure, const FPDualReal &enthalpy) const
Backwards equation T(p, h) in Region 1 Eq.
const std::array< std::array< Real, 7 >, 6 > _mu_Hij
const std::vector< std::vector< Real > > _n3s
Constants for all 26 subregions in region 3.
T h_from_p_T_template(const T &pressure, const T &temperature) const
const std::array< Real, 33 > _nph3b
static const std::string temperature
Definition: NS.h:57
ADRealEigenVector< T, D, asd > sqrt(const ADRealEigenVector< T, D, asd > &)
const std::array< Real, 38 > _nph2b
std::pair< T, T > p_T_from_v_h(const T &v, const T &h) const
Computes the pressure (first member of the pair) and temperature (second member of the pair) as funct...
virtual Real h_from_p_T(Real pressure, Real temperature) const override
FPDualReal vaporTemperature_ad(const FPDualReal &pressure) const
AD version of saturation temperature as a function of pressure (used internally)
virtual Real criticalTemperature() const override
Critical temperature.
const std::array< int, 33 > _Iph3b
virtual Real k_from_p_T(Real pressure, Real temperature) const override
ADReal mu_from_v_e(const ADReal &v, const ADReal &e) const override
const std::array< int, 34 > _J1
unsigned int subregion2ph(Real pressure, Real enthalpy) const
Provides the correct subregion index for a (P,h) point in region 2.
const std::array< int, 9 > _J02
const Real _T_triple
Triple point temperature (K)
const std::array< int, 43 > _J2
DualNumber< Real, DNDerivativeSize< 5 > > FPDualReal
virtual const std::string & name() const
const std::array< int, 6 > _J5
std::pair< T, T > p_T_from_v_e(const T &v, const T &e) const
Computes the pressure (first member of the pair) and temperature (second member of the pair) as funct...
const std::array< int, 23 > _Iph2c
std::pair< T, T > NewtonSolve(const T &x, const T &y, const Real z_initial_guess, const Real tolerance, const Functor &func, const std::string &caller_name, const unsigned int max_its=100)
NewtonSolve does a 1D Newton Solve to solve the equation y = f(x, z) for variable z...
const std::array< Real, 5 > _p_star
Pressure scale for each region.
static void xyDerivatives(const T x, const T &y, T &z, T &dz_dx, T &dz_dy, const Functor &z_from_x_y)
Computes the dependent variable z and its derivatives with respect to the independent variables x and...
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
FPDualReal temperature_from_ph2a(const FPDualReal &pressure, const FPDualReal &enthalpy) const
Backwards equation T(p, h) in Region 2a Eq.
subregionEnum
Enum of subregion ids for region 3.
T cv_from_p_T_template(const T &pressure, const T &temperature) const
const std::array< int, 20 > _Jph1
const std::array< Real, 34 > _n1
Reference constants used in to calculate thermophysical properties of water.
const std::array< Real, 5 > _T_star
Temperature scale for each region.
const Real _tolerance
Newton&#39;s method may be used to convert between variable sets _tolerance, _T_initial_guess, and _p_initial_guess are the parameters for these iterative solves.
const std::vector< std::vector< int > > _I3s
const std::array< int, 36 > _Iph2a
T d2gamma1_dpitau(const T &pi, const T &tau) const
Second derivative of Gibbs free energy in Region 1 wrt pi and tau.
Real k_from_v_e(Real v, Real e) const override
static const std::string S
Definition: NS.h:148
const std::array< int, 38 > _Jph2b
const std::array< int, 31 > _Jph3a
FPDualReal temperature_from_ph2b(const FPDualReal &pressure, const FPDualReal &enthalpy) const
Backwards equation T(p, h) in Region 2b Eq.
T dphi3_ddelta(const T &delta, const T &tau) const
Derivative of Helmholtz free energy in Region 3 wrt delta.
T d2gamma2_dpi2(const T &pi, const T &tau) const
Second derivative of Gibbs free energy in Region 2 wrt pi.
static const std::string mu
Definition: NS.h:122
T gamma5(const T &pi, const T &tau) const
Gibbs free energy in Region 5.
T d2gamma1_dtau2(const T &pi, const T &tau) const
Second derivative of Gibbs free energy in Region 1 wrt tau.
const std::array< int, 31 > _Iph3a
virtual Real v_from_p_T(Real pressure, Real temperature) const override
FPDualReal temperature_from_ph2c(const FPDualReal &pressure, const FPDualReal &enthalpy) const
Backwards equation T(p, h) in Region 2c Eq.
T dgamma2_dpi(const T &pi, const T &tau) const
Derivative of Gibbs free energy in Region 2 wrt pi.
virtual Real triplePointPressure() const override
Triple point pressure.
T dgamma1_dtau(const T &pi, const T &tau) const
Derivative of Gibbs free energy in Region 1 wrt tau.
Common class for single phase fluid properties.
const std::array< Real, 20 > _nph1
const std::array< int, 40 > _J3
T d2gamma2_dtau2(const T &pi, const T &tau) const
Second derivative of Gibbs free energy in Region 2 wrt tau.
ADReal e_from_v_h(const ADReal &v, const ADReal &h) const override
DualReal ADReal
const std::array< int, 34 > _I1
FPDualReal T_from_p_h_ad(const FPDualReal &pressure, const FPDualReal &enthalpy) const
AD version of backwards equation T(p, h) (used internally) From Revised Release on the IAPWS Industri...
e e e e s T T T T T rho v v T h
const std::array< int, 6 > _J05
Constants for region 5.
unsigned int subregion3ph(Real pressure, Real enthalpy) const
Provides the correct subregion index for a (P,h) point in region 3.
T dgamma1_dpi(const T &pi, const T &tau) const
Derivative of Gibbs free energy in Region 1 wrt pi.
T dgamma5_dpi(const T &pi, const T &tau) const
Derivative of Gibbs free energy in Region 5 wrt pi.
virtual Real T_from_p_h(Real pressure, Real enthalpy) const override
Backwards equation T(p, h) From Revised Release on the IAPWS Industrial Formulation 1997 for the Ther...
T mu_from_rho_T_template(const T &density, const T &temperature) const
T d2phi3_dtau2(const T &delta, const T &tau) const
Second derivative of Helmholtz free energy in Region 3 wrt tau.
virtual Real c_from_p_T(Real pressure, Real temperature) const override
const std::vector< std::vector< Real > > _tempXY_n
T p_from_v_e_template(const T &v, const T &e) const
const std::array< Real, 31 > _nph3a
T k_from_rho_T_template(const T &density, const T &temperature) const
Real b23p(Real temperature) const
Auxillary equation for the boundary between regions 2 and 3.
const std::array< Real, 6 > _n5
const Real _rho_critical
Critical density (kg/m^3)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const std::string v
Definition: NS.h:82
T phi3(const T &delta, const T &tau) const
Helmholtz free energy in Region 3.
const std::array< int, 38 > _Iph2b
int N
T densityRegion3(const T &pressure, const T &temperature) const
Density function for Region 3 - supercritical water and steam.
virtual Real e_from_p_rho(Real p, Real rho) const override
const std::array< Real, 6 > _n05
virtual Real criticalPressure() const override
Critical pressure.
Real b3ab(Real pressure) const
Boundary between subregions a and b in region 3.
Water (H2O) fluid properties as a function of pressure (Pa) and temperature (K) from IAPWS-IF97: Revi...
static const std::string pressure
Definition: NS.h:56
virtual Real vaporPressure(Real temperature) const override
Vapor pressure.
T d2gamma5_dpi2(const T &pi, const T &tau) const
Second derivative of Gibbs free energy in Region 5 wrt pi.
T gamma1(const T &pi, const T &tau) const
Gibbs free energy in Region 1 - single phase liquid region.
Real henryConstant(Real temperature, const std::vector< Real > &coeffs) const
IAPWS formulation of Henry&#39;s law constant for dissolution in water From Guidelines on the Henry&#39;s con...
FPDualReal temperature_from_ph3b(const FPDualReal &pressure, const FPDualReal &enthalpy) const
Backwards equation T(p, h) in Region 3b Eq.
FPDualReal temperature_from_ph3a(const FPDualReal &pressure, const FPDualReal &enthalpy) const
Backwards equation T(p, h) in Region 3a Eq.
void mooseError(Args &&... args) const
unsigned int inRegionPH(Real pressure, Real enthalpy) const
Determines the phase region that the given pressure and enthaply values lie in.
const std::vector< std::vector< int > > _J3s
static const std::string internal_energy
Definition: NS.h:59
const InputParameters & parameters() const
virtual Real k_from_rho_T(Real density, Real temperature) const override
T cp_from_p_T_template(const T &pressure, const T &temperature) const
const Real _Rw
Specific gas constant for H2O (universal gas constant / molar mass of water - J/kg/K) ...
virtual Real rho_from_p_T(Real pressure, Real temperature) const override
static const std::string specific_heat
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
const std::array< int, 40 > _I3
const Real _p_triple
Triple point pressure (Pa)
T mu_from_p_T_template(const T &pressure, const T &temperature) const
const std::array< Real, 9 > _n02
Constants for region 2.
T e_from_p_rho_template(const T &p, const T &rho) const
T pow(T x, int e)
virtual ADReal c_from_v_e(const ADReal &v, const ADReal &e) const override
virtual Real cv_from_p_T(Real pressure, Real temperature) const override
T d2gamma1_dpi2(const T &pi, const T &tau) const
Second derivative of Gibbs free energy in Region 1 wrt pi.
virtual Real mu_from_rho_T(Real density, Real temperature) const override
std::pair< T, T > T_drhodT_from_p_rho(const T &p, const T &rho) const
Computes the temperature (first member of the pair) and the derivative of density (second member of t...
const std::array< Real, 23 > _nph2c
const std::array< int, 43 > _I2
virtual Real cp_from_p_T(Real pressure, Real temperature) const override
const Real _Mh2o
Water molar mass (kg/mol)
MooseUnits pow(const MooseUnits &, int)
const std::array< Real, 40 > _n3
Constants for region 3.
static const std::string k
Definition: NS.h:124
std::array< Real, 4 > _k_a
Constants for thermal conductivity.
const std::array< unsigned int, 26 > _par3N
virtual ADReal cp_from_v_e(const ADReal &v, const ADReal &e) const override
T d2phi3_ddeltatau(const T &delta, const T &tau) const
Second derivative of Helmholtz free energy in Region 3 wrt delta and tau.
virtual Real molarMass() const override
Fluid name.
const Real pi
const std::vector< std::vector< int > > _tempXY_I
Constnats for the tempXY() method.
const std::array< Real, 10 > _n4
Constants for region 4 (the saturation curve up to the critical point)
const std::array< Real, 4 > _mu_H0
Constants from Release on the IAPWS Formulation 2008 for the Viscosity of Ordinary Water Substance...