61 std::shared_ptr<mfem::ParFiniteElementSpace> vfes,
62 std::shared_ptr<mfem::ParFiniteElementSpace> fes0,
63 std::shared_ptr<mfem::ParMesh> pmesh,
64 std::shared_ptr<mfem::ParGridFunction> eta,
65 std::shared_ptr<mfem::ParGridFunction> alpha,
66 std::vector<std::shared_ptr<mfem::ParGridFunction> > &grad_u,
67 std::shared_ptr<Prandtl::PerssonPeraireIndicator> indicator,
68 mfem::real_t alpha_max)
71 std::string gas_model_string =
72 to_lower(runtime.value(
"gas_model", std::string{}));
74 std::string inv_flux_string =
75 to_lower(runtime.value(
"numerical_flux", std::string{}));
77 std::string flow_model_string =
78 to_lower(runtime.value(
"flow_model", std::string{}));
81 gas_model_string.empty() ||
82 gas_model_string ==
"cpg" ||
83 gas_model_string ==
"ideal" ||
84 gas_model_string ==
"ideal_gas";
87 gas_model_string ==
"lte";
90 inv_flux_string.empty() ||
91 inv_flux_string ==
"chandrashekar" ||
95 inv_flux_string ==
"hll";
98 inv_flux_string ==
"roe";
101 inv_flux_string ==
"llf" ||
102 inv_flux_string ==
"lfr" ||
103 inv_flux_string ==
"laxfriedrichs" ||
104 inv_flux_string ==
"lax_friedrichs" ||
112 const bool inviscid = !viscous;
114 const int dim = pmesh->Dimension();
115 const int num_dofs_scalar = vfes->GetNDofs();
118 runtime.value(
"Pr", 0.72),
119 runtime.value(
"R_gas", 287.05),
120 runtime.value(
"mu", 0.02));
127 std::make_shared<Theseus::IdealGasModel>(physics_constants, layout);
128 std::string gasModelName(
"CPG1");
131 std::string numFluxName(
"Chandrashekar");
135 return MakeTypedRHSOperator<Physics, Theseus::IdealGasModel>(inviscid, runtime,
136 vfes, fes0, pmesh, eta, alpha, grad_u,
137 indicator, alpha_max, gas_model,
138 gasModelName, numFluxName);
142 std::string numFluxName(
"HLL");
147 return MakeTypedRHSOperator<Physics, Theseus::IdealGasModel>(inviscid, runtime,
148 vfes, fes0, pmesh, eta, alpha, grad_u,
149 indicator, alpha_max, gas_model,
150 gasModelName, numFluxName);
154 std::string numFluxName(
"LLF");
159 return MakeTypedRHSOperator<Physics, Theseus::IdealGasModel>(inviscid, runtime,
160 vfes, fes0, pmesh, eta, alpha, grad_u,
161 indicator, alpha_max, gas_model,
162 gasModelName, numFluxName);
166 std::string numFluxName(
"Roe");
171 return MakeTypedRHSOperator<Physics, Theseus::IdealGasModel>(inviscid, runtime,
172 vfes, fes0, pmesh, eta, alpha, grad_u,
173 indicator, alpha_max, gas_model,
174 gasModelName, numFluxName);
177 std::cerr <<
"Error: Invalid Numerical Flux Type specified: "
178 << inv_flux_string <<
"\n"
179 <<
"Supported: Chandrashekar, LLF/LFR, HLL, Roe"
184 std::string mixture(runtime.value(
"gas_mixture",
"air5"));
185 std::string solver(runtime.value(
"plato_solver",
"LTE_table_rhoT_(air5)"));
186 std::string path(runtime.value(
"database_path", std::string(Theseus::BuildConfig::PlatoDBPath)));
187 std::string rho_dist(runtime.value(
"rho_dist",
"log"));
188 std::string T_dist(runtime.value(
"T_dist",
"log"));
189 int N_rho = runtime.value(
"N_rho", 101);
190 int N_T = runtime.value(
"N_T", 101);
191 mfem::real_t rho_min = runtime.value(
"rho_min", 0.1);
192 mfem::real_t rho_max = runtime.value(
"rho_max", 1.1);
193 mfem::real_t T_min = runtime.value(
"T_min", 250.0);
194 mfem::real_t T_max = runtime.value(
"T_max", 35.0);
195 int num_properties = 9;
196 auto lteData = std::make_unique<Theseus::LTETable::Data>();
197 auto <eTableData = *lteData;
199 lteTableData.lte_table.SetSize(N_rho * N_T * num_properties);
200 lteTableData.inv_table.SetSize(N_rho * N_T);
201 if(rho_dist ==
"log")
218 lteTableData.e_grid.SetSize(N_T);
219 lteTables.
L.
setup(N_rho, N_T);
221 if(mfem::Mpi::Root())
223 std::cout <<
"Constructing LTE table for " << mixture
224 <<
" with solver " << solver << std::endl
225 <<
"LTE Database: " << path << std::endl;
226 if(Theseus::LTETable::check_plato_database_path(path)){
227 std::cerr <<
"Plato Database (" << path <<
") not found." << std::endl;
230 mfem::real_t e_min, e_max;
231 std::string empty_str(
"empty");
232 plato_initialize(solver.c_str(), mixture.c_str(), empty_str.c_str(), empty_str.c_str(), path.c_str());
234 lteTableData.lte_table.GetData(), e_min, e_max);
235 std::cout <<
"Constructing inverse table T = T(rho, e)" << std::endl;
238 lteTableData.T_grid.GetData(), lteTableData.inv_table.GetData());
243 if(mfem::Mpi::Root()){
244 std::cerr <<
"LTE runs *must* have Theseus build with PLATO support (-DTHESEUS_WITH_PLATO)" << std::endl;
248 MPI_Bcast(lteTableData.lte_table.GetData(), N_rho * N_T * num_properties, MPI_DOUBLE, 0, pmesh->GetComm());
249 MPI_Bcast(lteTableData.inv_table.GetData(), N_rho * N_T, MPI_DOUBLE, 0, pmesh->GetComm());
250 MPI_Bcast(lteTableData.e_grid.GetData(), N_T, MPI_DOUBLE, 0, pmesh->GetComm());
252 lteTableData.
lte_table.HostRead(), lteTableData.inv_table.HostRead(),
253 lteTableData.rho_grid.HostRead(), lteTableData.T_grid.HostRead(),
254 lteTableData.e_grid.HostRead()
256 auto gas_model = std::make_shared<Theseus::LTEGas>(physics_constants, layout, lteTables);
257 std::string gasModelName(
"LTE:"+mixture);
260 std::string numFluxName(
"Chandrashekar");
268 std::cerr <<
"Error: Cannot use Chandrashekar flux with LTE" << std::endl;
273 std::string numFluxName(
"HLL");
278 auto rhsOp = MakeTypedRHSOperator<Physics, Theseus::LTEGas>(inviscid, runtime,
279 vfes, fes0, pmesh, eta, alpha, grad_u,
280 indicator, alpha_max, gas_model,
281 gasModelName, numFluxName);
284 operator_cache.lteTableData = std::move(lteData);
289 std::string numFluxName(
"LFR");
294 auto rhsOp = MakeTypedRHSOperator<Physics, Theseus::LTEGas>
295 (inviscid, runtime,vfes, fes0, pmesh, eta, alpha, grad_u,
296 indicator, alpha_max, gas_model,
297 gasModelName, numFluxName);
301 operator_cache.lteTableData = std::move(lteData);
305 std::cerr <<
"Error: Invalid Numerical Flux Type specified: "
306 << inv_flux_string <<
"\n"
307 <<
"Supported: Chandrashekar, LLF/LFR, HLL"
313 std::cerr <<
"Error: Invalid Gas Model specified: "
314 << gas_model_string <<
"\n"
315 <<
"Supported: CPG, LTE"