-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy patheos.hpp
135 lines (121 loc) · 5.16 KB
/
eos.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at
// the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights
// reserved. See files LICENSE and NOTICE for details.
//
// This file is part of CEED, a collection of benchmarks, miniapps, software
// libraries and APIs for efficient high-order finite element and spectral
// element discretizations for exascale applications. For more information and
// source code availability see http://github.com/ceed.
//
// The CEED research is supported by the Exascale Computing Project 17-SC-20-SC,
// a collaborative effort of two U.S. Department of Energy organizations (Office
// of Science and the National Nuclear Security Administration) responsible for
// the planning and preparation of a capable exascale ecosystem, including
// software, applications, hardware, advanced system engineering and early
// testbed platforms, in support of the nation's exascale computing imperative.
#ifndef MFEM_NTH_EOS
#define MFEM_NTH_EOS
#include "mfem.hpp"
#ifdef MFEM_USE_MPI
namespace mfem
{
namespace nth
{
// Generic hydro equation of state (EOS) class,
// providing any physics related evaluation needed in NTH.
class EOS
{
protected:
// Fundamental constants of nature.
double kB, c, hbar, G;
// Corresponding masses of electron and proton.
double me;
public:
EOS(double me_ = 1.0, double kB_ = 1.0, double c_ = 1.0,
double hbar_ = 1.0, double G_ = 1.0)
{ kB = kB_, c = c_, hbar = hbar_, G = G_; me = me_; }
// Get fundamental physical constants.
double GetkB() {return kB; }
double Getc() {return c; }
double Getkhbar() {return hbar; }
double GetG() {return G; }
double Getme() {return me; }
// Thermal velocity.
double GetvTe(double Te) { return sqrt(kB * Te / me); }
// Get Thermodynamic values.
// Euler hydrodynamics using rho, v, eps.
virtual double GetP_eps(double index, double rho, double eps) = 0;
virtual double GetSoundSpeed_eps(double index, double rho, double eps) = 0;
// Euler hydrodynamics using rho, v, Te, Ti.
virtual double GetElectronDensity(double index, double rho, double Te) = 0;
virtual double GetZbar(double index, double rho, double Te) = 0;
virtual double GetPe(double index, double rho, double Te) = 0;
virtual double GetPi(double index, double rho, double Ti) = 0;
virtual double GetEe(double index, double rho, double Te) = 0;
virtual double GetEi(double index, double rho, double Ti) = 0;
virtual double GetdEedTe(double index, double rho, double Te) = 0;
virtual double GetdEidTi(double index, double rho, double Ti) = 0;
virtual double GetdEedrho(double index, double rho, double Te) = 0;
virtual double GetdEidrho(double index, double rho, double Ti) = 0;
virtual double GetSoundSpeed(double index, double rho, double Te, double Ti)
= 0;
~EOS() { }
};
// The simplest equation of state to be used in hydrodynamic simulations.
// Usually it is referred to as ideal gas.
class IGEOS : public EOS
{
protected:
// Mean ionization, here defined as constant.
double Zbar;
// Ion mass [g], here defined as constant.
double mi;
public:
IGEOS(double me_, double kB_) : EOS(me_, kB_, 1.0, 1.0, 1.0)
{ Zbar = 1.0; mi = 1.0; }
// Get Thermodynamic values.
// Euler hydrodynamics using rho, v, eps.
virtual double GetP_eps(double index, double rho, double eps);
virtual double GetSoundSpeed_eps(double index, double rho, double eps);
// Euler hydrodynamics using rho, v, Te, Ti.
virtual double GetElectronDensity(double index, double rho, double Te)
{ return rho / mi * Zbar; }
virtual double GetZbar(double index, double rho, double Te) { return Zbar; }
virtual double GetPe(double index, double rho, double Te) { }
virtual double GetPi(double index, double rho, double Ti) { }
virtual double GetEe(double index, double rho, double Te) { }
virtual double GetEi(double index, double rho, double Ti) { }
virtual double GetdEedTe(double index, double rho, double Te) { }
virtual double GetdEidTi(double index, double rho, double Ti) { }
virtual double GetdEedrho(double index, double rho, double Te) { }
virtual double GetdEidrho(double index, double rho, double Ti) { }
virtual double GetSoundSpeed(double index, double rho, double Te, double Ti)
{ }
// IG specific functions.
void SetZbar(double Zbar_) { Zbar = Zbar_; }
void SetIonMass(double mi_) { mi = mi_; }
};
// Generic hydro coefficient.
class HydroCoefficient : public Coefficient
{
protected:
// Fluid quantities used in calculations of physics.
ParGridFunction &rho_gf, &Te_gf, &v_gf;
// Space dependent material coefficient.
Coefficient *material_pcf;
// General equation of state.
EOS *eos;
public:
HydroCoefficient(ParGridFunction &rho_, ParGridFunction &Te_,
ParGridFunction &v_, Coefficient *material_, EOS *eos_)
: rho_gf(rho_), Te_gf(Te_), v_gf(v_), material_pcf(material_), eos(eos_)
{ }
virtual double Eval(ElementTransformation &T,
const IntegrationPoint &ip) = 0;
virtual void SetEOS(EOS *eos_) { eos = eos_; }
virtual ~HydroCoefficient() {};
};
} // namespace nth
} // namespace mfem
#endif // MFEM_USE_MPI
#endif // MFEM_NTH_EOS